From e441570f8abd131ec39ca6e81aaaf0d4ade8572f Mon Sep 17 00:00:00 2001 From: balrog Date: Mon, 10 Nov 2008 02:55:33 +0000 Subject: use target_mmap() to allocate idt, gdt and ldt (Kirill A. Shutemov). env->*dt.base should fit target address space, so we should use target_mmap to allocate them. Signed-off-by: Kirill A. Shutemov git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@5666 c046a42c-6fe2-441c-8c8c-71466251a162 --- linux-user/syscall.c | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) (limited to 'linux-user/syscall.c') diff --git a/linux-user/syscall.c b/linux-user/syscall.c index b5cf84c..ac7eb0d 100644 --- a/linux-user/syscall.c +++ b/linux-user/syscall.c @@ -2565,12 +2565,16 @@ static abi_long write_ldt(CPUX86State *env, } /* allocate the LDT */ if (!ldt_table) { - ldt_table = malloc(TARGET_LDT_ENTRIES * TARGET_LDT_ENTRY_SIZE); - if (!ldt_table) + env->ldt.base = target_mmap(0, + TARGET_LDT_ENTRIES * TARGET_LDT_ENTRY_SIZE, + PROT_READ|PROT_WRITE, + MAP_ANONYMOUS|MAP_PRIVATE, -1, 0); + if (env->ldt.base == -1) return -TARGET_ENOMEM; - memset(ldt_table, 0, TARGET_LDT_ENTRIES * TARGET_LDT_ENTRY_SIZE); - env->ldt.base = h2g((unsigned long)ldt_table); + memset(g2h(env->ldt.base), 0, + TARGET_LDT_ENTRIES * TARGET_LDT_ENTRY_SIZE); env->ldt.limit = 0xffff; + ldt_table = g2h(env->ldt.base); } /* NOTE: same code as Linux kernel */ -- cgit v1.1