diff options
-rw-r--r-- | osdep.c | 238 | ||||
-rw-r--r-- | osdep.h | 35 |
2 files changed, 0 insertions, 273 deletions
@@ -33,242 +33,6 @@ #include "vl.h" #endif -#if defined(__i386__) && !defined(CONFIG_SOFTMMU) && !defined(CONFIG_USER_ONLY) - -#include <sys/mman.h> -#include <sys/ipc.h> - -/* When not using soft mmu, libc independant functions are needed for - the CPU core because it needs to use alternates stacks and - libc/thread incompatibles settings */ - -#include <linux/unistd.h> - -#define QEMU_SYSCALL0(name) \ -{ \ -long __res; \ -__asm__ volatile ("int $0x80" \ - : "=a" (__res) \ - : "0" (__NR_##name)); \ -return __res; \ -} - -#define QEMU_SYSCALL1(name,arg1) \ -{ \ -long __res; \ -__asm__ volatile ("int $0x80" \ - : "=a" (__res) \ - : "0" (__NR_##name),"b" ((long)(arg1))); \ -return __res; \ -} - -#define QEMU_SYSCALL2(name,arg1,arg2) \ -{ \ -long __res; \ -__asm__ volatile ("int $0x80" \ - : "=a" (__res) \ - : "0" (__NR_##name),"b" ((long)(arg1)),"c" ((long)(arg2))); \ -return __res; \ -} - -#define QEMU_SYSCALL3(name,arg1,arg2,arg3) \ -{ \ -long __res; \ -__asm__ volatile ("int $0x80" \ - : "=a" (__res) \ - : "0" (__NR_##name),"b" ((long)(arg1)),"c" ((long)(arg2)), \ - "d" ((long)(arg3))); \ -return __res; \ -} - -#define QEMU_SYSCALL4(name,arg1,arg2,arg3,arg4) \ -{ \ -long __res; \ -__asm__ volatile ("int $0x80" \ - : "=a" (__res) \ - : "0" (__NR_##name),"b" ((long)(arg1)),"c" ((long)(arg2)), \ - "d" ((long)(arg3)),"S" ((long)(arg4))); \ -return __res; \ -} - -#define QEMU_SYSCALL5(name,arg1,arg2,arg3,arg4,arg5) \ -{ \ -long __res; \ -__asm__ volatile ("int $0x80" \ - : "=a" (__res) \ - : "0" (__NR_##name),"b" ((long)(arg1)),"c" ((long)(arg2)), \ - "d" ((long)(arg3)),"S" ((long)(arg4)),"D" ((long)(arg5))); \ -return __res; \ -} - -#define QEMU_SYSCALL6(name,arg1,arg2,arg3,arg4,arg5,arg6) \ -{ \ -long __res; \ -__asm__ volatile ("push %%ebp ; movl %%eax,%%ebp ; movl %1,%%eax ; int $0x80 ; pop %%ebp" \ - : "=a" (__res) \ - : "i" (__NR_##name),"b" ((long)(arg1)),"c" ((long)(arg2)), \ - "d" ((long)(arg3)),"S" ((long)(arg4)),"D" ((long)(arg5)), \ - "0" ((long)(arg6))); \ -return __res; \ -} - -/****************************************************************/ -/* shmat replacement */ - -int qemu_ipc(int call, unsigned long first, - unsigned long second, unsigned long third, - void *ptr, unsigned long fifth) -{ - QEMU_SYSCALL6(ipc, call, first, second, third, ptr, fifth); -} - -#define SHMAT 21 - -/* we must define shmat so that a specific address will be used when - mapping the X11 ximage */ -void *shmat(int shmid, const void *shmaddr, int shmflg) -{ - void *ptr; - int ret; - /* we give an address in the right memory area */ - if (!shmaddr) - shmaddr = get_mmap_addr(8192 * 1024); - ret = qemu_ipc(SHMAT, shmid, shmflg, (unsigned long)&ptr, (void *)shmaddr, 0); - if (ret < 0) - return NULL; - return ptr; -} - -/****************************************************************/ -/* sigaction bypassing the threads */ - -static int kernel_sigaction(int signum, const struct qemu_sigaction *act, - struct qemu_sigaction *oldact, - int sigsetsize) -{ - QEMU_SYSCALL4(rt_sigaction, signum, act, oldact, sigsetsize); -} - -int qemu_sigaction(int signum, const struct qemu_sigaction *act, - struct qemu_sigaction *oldact) -{ - return kernel_sigaction(signum, act, oldact, 8); -} - -/****************************************************************/ -/* memory allocation */ - -//#define DEBUG_MALLOC - -#define MALLOC_BASE 0xab000000 -#define PHYS_RAM_BASE 0xac000000 - -#define MALLOC_ALIGN 16 -#define BLOCK_HEADER_SIZE 16 - -typedef struct MemoryBlock { - struct MemoryBlock *next; - unsigned long size; /* size of block, including header */ -} MemoryBlock; - -static MemoryBlock *first_free_block; -static unsigned long malloc_addr = MALLOC_BASE; - -static void *malloc_get_space(size_t size) -{ - void *ptr; - size = TARGET_PAGE_ALIGN(size); - ptr = mmap((void *)malloc_addr, size, - PROT_WRITE | PROT_READ, - MAP_PRIVATE | MAP_FIXED | MAP_ANON, -1, 0); - if (ptr == MAP_FAILED) - return NULL; - malloc_addr += size; - return ptr; -} - -void *qemu_malloc(size_t size) -{ - MemoryBlock *mb, *mb1, **pmb; - void *ptr; - size_t size1, area_size; - - if (size == 0) - return NULL; - - size = (size + BLOCK_HEADER_SIZE + MALLOC_ALIGN - 1) & ~(MALLOC_ALIGN - 1); - pmb = &first_free_block; - for(;;) { - mb = *pmb; - if (mb == NULL) - break; - if (size <= mb->size) - goto found; - pmb = &mb->next; - } - /* no big enough blocks found: get new space */ - area_size = TARGET_PAGE_ALIGN(size); - mb = malloc_get_space(area_size); - if (!mb) - return NULL; - size1 = area_size - size; - if (size1 > 0) { - /* create a new free block */ - mb1 = (MemoryBlock *)((uint8_t *)mb + size); - mb1->next = NULL; - mb1->size = size1; - *pmb = mb1; - } - goto the_end; - found: - /* a free block was found: use it */ - size1 = mb->size - size; - if (size1 > 0) { - /* create a new free block */ - mb1 = (MemoryBlock *)((uint8_t *)mb + size); - mb1->next = mb->next; - mb1->size = size1; - *pmb = mb1; - } else { - /* suppress the first block */ - *pmb = mb->next; - } - the_end: - mb->size = size; - mb->next = NULL; - ptr = ((uint8_t *)mb + BLOCK_HEADER_SIZE); -#ifdef DEBUG_MALLOC - qemu_printf("malloc: size=0x%x ptr=0x%lx\n", size, (unsigned long)ptr); -#endif - return ptr; -} - -void qemu_free(void *ptr) -{ - MemoryBlock *mb; - - if (!ptr) - return; - mb = (MemoryBlock *)((uint8_t *)ptr - BLOCK_HEADER_SIZE); - mb->next = first_free_block; - first_free_block = mb; -} - -/****************************************************************/ -/* virtual memory allocation */ - -unsigned long mmap_addr = PHYS_RAM_BASE; - -void *get_mmap_addr(unsigned long size) -{ - unsigned long addr; - addr = mmap_addr; - mmap_addr += ((size + 4095) & ~4095) + 4096; - return (void *)addr; -} - -#else - #ifdef _WIN32 #include <windows.h> #elif defined(_BSD) @@ -424,8 +188,6 @@ void qemu_vfree(void *ptr) #endif -#endif - void *qemu_mallocz(size_t size) { void *ptr; @@ -15,39 +15,4 @@ void qemu_vfree(void *ptr); void *get_mmap_addr(unsigned long size); -/* specific kludges for OS compatibility (should be moved elsewhere) */ -#if defined(__i386__) && !defined(CONFIG_SOFTMMU) && !defined(CONFIG_USER_ONLY) - -/* disabled pthread version of longjmp which prevent us from using an - alternative signal stack */ -extern void __longjmp(jmp_buf env, int val); -#define longjmp __longjmp - -#include <signal.h> - -struct siginfo; - -/* NOTE: it works only because the glibc sigset_t is >= kernel sigset_t */ -struct qemu_sigaction { - union { - void (*_sa_handler)(int); - void (*_sa_sigaction)(int, struct siginfo *, void *); - } _u; - unsigned long sa_flags; - void (*sa_restorer)(void); - sigset_t sa_mask; /* mask last for extensibility */ -}; - -int qemu_sigaction(int signum, const struct qemu_sigaction *act, - struct qemu_sigaction *oldact); - -#undef sigaction -#undef sa_handler -#undef sa_sigaction -#define sigaction qemu_sigaction -#define sa_handler _u._sa_handler -#define sa_sigaction _u._sa_sigaction - -#endif - #endif |