mem16_t __fastcall _ext_memRead16(u32 mem) { switch (p) { case 1: // hwm return hwRead16(mem); case 2: // psh return psxHwRead16(mem); case 4: // b80 MEM_LOG("b800000 Memory read16 address %x\n", mem); return 0; case 5: // ba0 return ba0R16(mem); case 6: // gsm return gsRead16(mem); case 7: // dev9 { mem16_t retval = DEV9read16(mem & ~0xa4000000); SysPrintf("DEV9 read16 %8.8lx: %4.4lx\n", mem & ~0xa4000000, retval); return retval; } case 8: // spu2 return SPU2read(mem); } MEM_LOG("Unknown Memory read16 from address %8.8x\n", mem); cpuTlbMissR(mem, cpuRegs.branch); return 0; }
static mem16_t __fastcall _ext_memRead16(u32 mem) { switch (p) { case 4: // b80 MEM_LOG("b800000 Memory read16 address %x", mem); return 0; case 5: // ba0 return ba0R16(mem); case 6: // gsm return gsRead16(mem); case 7: // dev9 { mem16_t retval = DEV9read16(mem & ~0xa4000000); Console.WriteLn("DEV9 read16 %8.8lx: %4.4lx", mem & ~0xa4000000, retval); return retval; } case 8: // spu2 return SPU2read(mem); } MEM_LOG("Unknown Memory read16 from address %8.8x", mem); cpuTlbMissR(mem, cpuRegs.branch); return 0; }
static void __fastcall _ext_memWrite16(u32 mem, mem16_t value) { switch (p) { case 5: // ba0 MEM_LOG("ba00000 Memory write16 to address %x with data %x", mem, value); return; case 6: // gsm gsWrite16(mem, value); return; case 7: // dev9 DEV9write16(mem & ~0xa4000000, value); Console.WriteLn("DEV9 write16 %8.8lx: %4.4lx", mem & ~0xa4000000, value); return; case 8: // spu2 SPU2write(mem, value); return; } MEM_LOG("Unknown Memory write16 to address %x with data %4.4x", mem, value); cpuTlbMissW(mem, cpuRegs.branch); }
void __fastcall _ext_memRead64(u32 mem, mem64_t *out) { switch (p) { case 6: // gsm *out = gsRead64(mem); return; } MEM_LOG("Unknown Memory read64 from address %8.8x\n", mem); cpuTlbMissR(mem, cpuRegs.branch); }
static void __fastcall _ext_memWrite32(u32 mem, mem32_t value) { switch (p) { case 6: // gsm gsWrite32(mem, value); return; case 7: // dev9 DEV9write32(mem & ~0xa4000000, value); Console.WriteLn("DEV9 write32 %8.8lx: %8.8lx", mem & ~0xa4000000, value); return; } MEM_LOG("Unknown Memory write32 to address %x with data %8.8x", mem, value); cpuTlbMissW(mem, cpuRegs.branch); }
static void __fastcall _ext_memRead128(u32 mem, mem128_t *out) { switch (p) { //case 1: // hwm // hwRead128(mem & ~0xa0000000, out); return; case 6: // gsm CopyQWC(out,PS2GS_BASE(mem)); return; } MEM_LOG("Unknown Memory read128 from address %8.8x", mem); cpuTlbMissR(mem, cpuRegs.branch); }
void __fastcall _ext_memWrite16(u32 mem, u16 value) { switch (p) { case 1: // hwm hwWrite16(mem, value); return; case 2: // psh psxHwWrite16(mem, value); return; case 5: // ba0 MEM_LOG("ba00000 Memory write16 to address %x with data %x\n", mem, value); return; case 6: // gsm gsWrite16(mem, value); return; case 7: // dev9 DEV9write16(mem & ~0xa4000000, value); SysPrintf("DEV9 write16 %8.8lx: %4.4lx\n", mem & ~0xa4000000, value); return; case 8: // spu2 SPU2write(mem, value); return; } MEM_LOG("Unknown Memory write16 to address %x with data %4.4x\n", mem, value); cpuTlbMissW(mem, cpuRegs.branch); }
void __fastcall _ext_memRead128(u32 mem, mem128_t *out) { switch (p) { //case 1: // hwm // hwRead128(mem & ~0xa0000000, out); return; case 6: // gsm out[0] = gsRead64(mem ); out[1] = gsRead64(mem+8); return; } MEM_LOG("Unknown Memory read128 from address %8.8x\n", mem); cpuTlbMissR(mem, cpuRegs.branch); }
void __fastcall _ext_memWrite32(u32 mem, u32 value) { switch (p) { case 2: // psh psxHwWrite32(mem, value); return; case 6: // gsm gsWrite32(mem, value); return; case 7: // dev9 DEV9write32(mem & ~0xa4000000, value); SysPrintf("DEV9 write32 %8.8lx: %8.8lx\n", mem & ~0xa4000000, value); return; } MEM_LOG("Unknown Memory write32 to address %x with data %8.8x\n", mem, value); cpuTlbMissW(mem, cpuRegs.branch); }
static mem32_t __fastcall _ext_memRead32(u32 mem) { switch (p) { case 6: // gsm return gsRead32(mem); case 7: // dev9 { mem32_t retval = DEV9read32(mem & ~0xa4000000); Console.WriteLn("DEV9 read32 %8.8lx: %8.8lx", mem & ~0xa4000000, retval); return retval; } } MEM_LOG("Unknown Memory read32 from address %8.8x (Status=%8.8x)", mem, cpuRegs.CP0.n.Status.val); cpuTlbMissR(mem, cpuRegs.branch); return 0; }
mem32_t __fastcall _ext_memRead32(u32 mem) { switch (p) { case 2: // psh return psxHwRead32(mem); case 6: // gsm return gsRead32(mem); case 7: // dev9 { mem32_t retval = DEV9read32(mem & ~0xa4000000); SysPrintf("DEV9 read32 %8.8lx: %8.8lx\n", mem & ~0xa4000000, retval); return retval; } } MEM_LOG("Unknown Memory read32 from address %8.8x (Status=%8.8x)\n", mem, cpuRegs.CP0.n.Status.val); cpuTlbMissR(mem, cpuRegs.branch); return 0; }
static mem8_t __fastcall _ext_memRead8 (u32 mem) { switch (p) { case 3: // psh4 return psxHw4Read8(mem); case 6: // gsm return gsRead8(mem); case 7: // dev9 { mem8_t retval = DEV9read8(mem & ~0xa4000000); Console.WriteLn("DEV9 read8 %8.8lx: %2.2lx", mem & ~0xa4000000, retval); return retval; } } MEM_LOG("Unknown Memory Read8 from address %8.8x", mem); cpuTlbMissR(mem, cpuRegs.branch); return 0; }
void __fastcall _ext_memWrite8 (u32 mem, u8 value) { switch (p) { case 1: // hwm hwWrite8(mem, value); return; case 2: // psh psxHwWrite8(mem, value); return; case 3: // psh4 psxHw4Write8(mem, value); return; case 6: // gsm gsWrite8(mem, value); return; case 7: // dev9 DEV9write8(mem & ~0xa4000000, value); SysPrintf("DEV9 write8 %8.8lx: %2.2lx\n", mem & ~0xa4000000, value); return; } MEM_LOG("Unknown Memory write8 to address %x with data %2.2x\n", mem, value); cpuTlbMissW(mem, cpuRegs.branch); }
mem8_t __fastcall _ext_memRead8 (u32 mem) { switch (p) { case 1: // hwm return hwRead8(mem); case 2: // psh return psxHwRead8(mem); case 3: // psh4 return psxHw4Read8(mem); case 6: // gsm return gsRead8(mem); case 7: // dev9 { mem8_t retval = DEV9read8(mem & ~0xa4000000); SysPrintf("DEV9 read8 %8.8lx: %2.2lx\n", mem & ~0xa4000000, retval); return retval; } } MEM_LOG("Unknown Memory Read8 from address %8.8x\n", mem); cpuTlbMissR(mem, cpuRegs.branch); return 0; }
static void __fastcall nullRead128(u32 mem, mem128_t *out) { MEM_LOG("Read uninstalled memory at address %08x", mem); ZeroQWC(out); }
static void __fastcall nullWrite32(u32 mem, mem32_t value) { MEM_LOG("Write uninstalled memory at address %08x", mem); }
static void __fastcall nullRead64(u32 mem, mem64_t *out) { MEM_LOG("Read uninstalled memory at address %08x", mem); *out = 0; }
static void __fastcall nullWrite128(u32 mem, const mem128_t *value) { MEM_LOG("Write uninstalled memory at address %08x", mem); }
int get_page_type(struct page_info *page, unsigned long type) { unsigned long nx, x, y = page->u.inuse.type_info; ASSERT(!(type & ~PGT_type_mask)); again: do { x = y; nx = x + 1; if ( unlikely((nx & PGT_count_mask) == 0) ) { MEM_LOG("Type count overflow on pfn %lx", page_to_mfn(page)); return 0; } else if ( unlikely((x & PGT_count_mask) == 0) ) { if ( (x & PGT_type_mask) != type ) { /* * On type change we check to flush stale TLB entries. This * may be unnecessary (e.g., page was GDT/LDT) but those * circumstances should be very rare. */ cpumask_t mask = page_get_owner(page)->domain_dirty_cpumask; tlbflush_filter(mask, page->tlbflush_timestamp); if ( unlikely(!cpus_empty(mask)) ) { perfc_incr(need_flush_tlb_flush); flush_tlb_mask(mask); } /* We lose existing type, back pointer, and validity. */ nx &= ~(PGT_type_mask | PGT_validated); nx |= type; /* No special validation needed for writable pages. */ /* Page tables and GDT/LDT need to be scanned for validity. */ if ( type == PGT_writable_page ) nx |= PGT_validated; } } else if ( unlikely((x & PGT_type_mask) != type) ) { return 0; } else if ( unlikely(!(x & PGT_validated)) ) { /* Someone else is updating validation of this page. Wait... */ while ( (y = page->u.inuse.type_info) == x ) cpu_relax(); goto again; } } while ( unlikely((y = cmpxchg(&page->u.inuse.type_info, x, nx)) != x) ); if ( unlikely(!(nx & PGT_validated)) ) { /* Noone else is updating simultaneously. */ __set_bit(_PGT_validated, &page->u.inuse.type_info); } return 1; }
static mem32_t __fastcall nullRead32(u32 mem) { MEM_LOG("Read uninstalled memory at address %08x", mem); return 0; }