--- SheepShaver/src/kpx_cpu/sheepshaver_glue.cpp 2004/02/20 17:20:15 1.29 +++ SheepShaver/src/kpx_cpu/sheepshaver_glue.cpp 2004/04/22 21:45:18 1.34 @@ -40,6 +40,7 @@ #include "ether.h" #include +#include #if ENABLE_MON #include "mon.h" @@ -167,16 +168,31 @@ void *operator new(size_t size) { void *p; - /* XXX: try different approaches */ +#if defined(HAVE_POSIX_MEMALIGN) if (posix_memalign(&p, 16, size) != 0) throw std::bad_alloc(); +#elif defined(HAVE_MEMALIGN) + p = memalign(16, size); +#elif defined(HAVE_VALLOC) + p = valloc(size); // page-aligned! +#else + /* XXX: handle padding ourselves */ + p = malloc(size); +#endif return p; } void operator delete(void *p) { +#if defined(HAVE_MEMALIGN) || defined(HAVE_VALLOC) +#if defined(__GLIBC__) + // this is known to work only with GNU libc free(p); +#endif +#else + free(p); +#endif } sheepshaver_cpu::sheepshaver_cpu() @@ -715,6 +731,10 @@ static sigsegv_return_t sigsegv_handler( else if (pc == ROM_BASE + 0x4a10a0 && (cpu->gpr(20) == 0xf3012002 || cpu->gpr(20) == 0xf3012000)) return SIGSEGV_RETURN_SKIP_INSTRUCTION; + // Ignore writes to the zero page + else if ((uint32)(addr - SheepMem::ZeroPage()) < (uint32)SheepMem::PageSize()) + return SIGSEGV_RETURN_SKIP_INSTRUCTION; + // Ignore all other faults, if requested if (PrefsFindBool("ignoresegv")) return SIGSEGV_RETURN_SKIP_INSTRUCTION; @@ -971,6 +991,24 @@ static void NativeOp(int selector) GPR(3) = false; break; #endif + case NATIVE_SYNC_HOOK: + GPR(3) = NQD_sync_hook(GPR(3)); + break; + case NATIVE_BITBLT_HOOK: + GPR(3) = NQD_bitblt_hook(GPR(3)); + break; + case NATIVE_BITBLT: + NQD_bitblt(GPR(3)); + break; + case NATIVE_FILLRECT_HOOK: + GPR(3) = NQD_fillrect_hook(GPR(3)); + break; + case NATIVE_INVRECT: + NQD_invrect(GPR(3)); + break; + case NATIVE_FILLRECT: + NQD_fillrect(GPR(3)); + break; case NATIVE_SERIAL_NOTHING: case NATIVE_SERIAL_OPEN: case NATIVE_SERIAL_PRIME_IN: