On Wed, 2014-06-04 at 00:51 +0100, Peter Maydell wrote: > Trying to override the implementations of g_malloc and g_free is > a really bad idea -- it means statically linked builds fail to > link (because of the multiple definitions provided by this file > and by glib), and non-statically linked builds segfault as soon > as they try to do anything more complicated than printing the > usage message. Remove these overridden versions and just use > the glib ones. > > This is sufficient that bsd-user can run basic x86-64 > binaries on OpenBSD again; FreeBSD and NetBSD seem to have > further issues. > > Signed-off-by: Peter Maydell <peter.mayd...@linaro.org>
Reviewed by: Sean Bruno sbr...@freebsd.org > --- > The FreeBSD QEMU bsd-user tree took this same approach. > > Blue, I'm planning to put this together with a few other bsd-user > patches (and further submissions from the FreeBSD folk as they > get them into shape) into a 'bsd-user.next' queue. Let me > know if you'd rather do that yourself (as the listed bsd-user > maintainer). My current queue is at: > https://git.linaro.org/people/peter.maydell/qemu-arm.git/shortlog/refs/heads/bsd-user.next > (though not all of those have been through review yet). > > bsd-user/mmap.c | 60 > --------------------------------------------------------- > 1 file changed, 60 deletions(-) > > diff --git a/bsd-user/mmap.c b/bsd-user/mmap.c > index aae8ea1..092bf7f 100644 > --- a/bsd-user/mmap.c > +++ b/bsd-user/mmap.c > @@ -74,66 +74,6 @@ void mmap_unlock(void) > } > #endif > > -static void *bsd_vmalloc(size_t size) > -{ > - void *p; > - mmap_lock(); > - /* Use map and mark the pages as used. */ > - p = mmap(NULL, size, PROT_READ | PROT_WRITE, > - MAP_PRIVATE | MAP_ANON, -1, 0); > - > - if (h2g_valid(p)) { > - /* Allocated region overlaps guest address space. > - This may recurse. */ > - abi_ulong addr = h2g(p); > - page_set_flags(addr & TARGET_PAGE_MASK, TARGET_PAGE_ALIGN(addr + > size), > - PAGE_RESERVED); > - } > - > - mmap_unlock(); > - return p; > -} > - > -void *g_malloc(size_t size) > -{ > - char * p; > - size += 16; > - p = bsd_vmalloc(size); > - *(size_t *)p = size; > - return p + 16; > -} > - > -/* We use map, which is always zero initialized. */ > -void * g_malloc0(size_t size) > -{ > - return g_malloc(size); > -} > - > -void g_free(void *ptr) > -{ > - /* FIXME: We should unmark the reserved pages here. However this gets > - complicated when one target page spans multiple host pages, so we > - don't bother. */ > - size_t *p; > - p = (size_t *)((char *)ptr - 16); > - munmap(p, *p); > -} > - > -void *g_realloc(void *ptr, size_t size) > -{ > - size_t old_size, copy; > - void *new_ptr; > - > - if (!ptr) > - return g_malloc(size); > - old_size = *(size_t *)((char *)ptr - 16); > - copy = old_size < size ? old_size : size; > - new_ptr = g_malloc(size); > - memcpy(new_ptr, ptr, copy); > - g_free(ptr); > - return new_ptr; > -} > - > /* NOTE: all the constants are the HOST ones, but addresses are target. */ > int target_mprotect(abi_ulong start, abi_ulong len, int prot) > {