+static void *pl_emu_mmap(unsigned long addr, size_t size, int is_fixed,
+ enum psxMapTag tag)
+{
+ unsigned int pbase;
+ void *retval;
+ int ret;
+
+ if (!have_warm)
+ goto basic_map;
+
+ switch (tag) {
+ case MAP_TAG_RAM:
+ if (size > 0x400000) {
+ fprintf(stderr, "unexpected ram map request: %08lx %x\n",
+ addr, size);
+ exit(1);
+ }
+ pbase = (uppermem_pbase + 0xffffff) & ~0xffffff;
+ pbase += 0x400000;
+ retval = (void *)addr;
+ ret = warm_mmap_section(retval, pbase, size, WCB_C_BIT);
+ if (ret != 0) {
+ fprintf(stderr, "ram section map failed\n");
+ exit(1);
+ }
+ goto out;
+ case MAP_TAG_VRAM:
+ if (size > 0x400000) {
+ fprintf(stderr, "unexpected vram map request: %08lx %x\n",
+ addr, size);
+ exit(1);
+ }
+ if (addr == 0)
+ addr = 0x60000000;
+ vram_pbase = (uppermem_pbase + 0xffffff) & ~0xffffff;
+ retval = (void *)addr;
+
+ ret = warm_mmap_section(retval, vram_pbase, size, WCB_C_BIT);
+ if (ret != 0) {
+ fprintf(stderr, "vram section map failed\n");
+ exit(1);
+ }
+ goto out;
+ case MAP_TAG_LUTS:
+ // mostly for Wiz to not run out of RAM
+ if (size > 0x800000) {
+ fprintf(stderr, "unexpected LUT map request: %08lx %x\n",
+ addr, size);
+ exit(1);
+ }
+ pbase = (uppermem_pbase + 0xffffff) & ~0xffffff;
+ pbase += 0x800000;
+ retval = (void *)addr;
+ ret = warm_mmap_section(retval, pbase, size, WCB_C_BIT);
+ if (ret != 0) {
+ fprintf(stderr, "LUT section map failed\n");
+ exit(1);
+ }
+ goto out;
+ default:
+ break;
+ }
+
+basic_map:
+ retval = plat_mmap(addr, size, 0, is_fixed);
+
+out:
+ if (tag == MAP_TAG_VRAM)
+ psx_vram = retval;
+ return retval;
+}
+
+static void pl_emu_munmap(void *ptr, size_t size, enum psxMapTag tag)
+{
+ switch (tag) {
+ case MAP_TAG_RAM:
+ case MAP_TAG_VRAM:
+ case MAP_TAG_LUTS:
+ warm_munmap_section(ptr, size);
+ break;
+ default:
+ plat_munmap(ptr, size);
+ break;
+ }
+}
+