|
|
1.1 ! root 1: /* ! 2: * PowerMac NVRAM emulation ! 3: * ! 4: * Copyright (c) 2005-2007 Fabrice Bellard ! 5: * Copyright (c) 2007 Jocelyn Mayer ! 6: * ! 7: * Permission is hereby granted, free of charge, to any person obtaining a copy ! 8: * of this software and associated documentation files (the "Software"), to deal ! 9: * in the Software without restriction, including without limitation the rights ! 10: * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell ! 11: * copies of the Software, and to permit persons to whom the Software is ! 12: * furnished to do so, subject to the following conditions: ! 13: * ! 14: * The above copyright notice and this permission notice shall be included in ! 15: * all copies or substantial portions of the Software. ! 16: * ! 17: * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR ! 18: * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, ! 19: * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL ! 20: * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER ! 21: * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, ! 22: * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN ! 23: * THE SOFTWARE. ! 24: */ ! 25: #include "hw.h" ! 26: #include "ppc_mac.h" ! 27: ! 28: struct MacIONVRAMState { ! 29: target_phys_addr_t mem_base; ! 30: target_phys_addr_t size; ! 31: int mem_index; ! 32: uint8_t data[0x2000]; ! 33: }; ! 34: ! 35: /* Direct access to NVRAM */ ! 36: uint32_t macio_nvram_read (void *opaque, uint32_t addr) ! 37: { ! 38: MacIONVRAMState *s = opaque; ! 39: uint32_t ret; ! 40: ! 41: // printf("%s: %p addr %04x\n", __func__, s, addr); ! 42: if (addr < 0x2000) ! 43: ret = s->data[addr]; ! 44: else ! 45: ret = -1; ! 46: ! 47: return ret; ! 48: } ! 49: ! 50: void macio_nvram_write (void *opaque, uint32_t addr, uint32_t val) ! 51: { ! 52: MacIONVRAMState *s = opaque; ! 53: ! 54: // printf("%s: %p addr %04x val %02x\n", __func__, s, addr, val); ! 55: if (addr < 0x2000) ! 56: s->data[addr] = val; ! 57: } ! 58: ! 59: /* macio style NVRAM device */ ! 60: static void macio_nvram_writeb (void *opaque, ! 61: target_phys_addr_t addr, uint32_t value) ! 62: { ! 63: MacIONVRAMState *s = opaque; ! 64: ! 65: addr -= s->mem_base; ! 66: addr = (addr >> 4) & 0x1fff; ! 67: s->data[addr] = value; ! 68: // printf("macio_nvram_writeb %04x = %02x\n", addr, value); ! 69: } ! 70: ! 71: static uint32_t macio_nvram_readb (void *opaque, target_phys_addr_t addr) ! 72: { ! 73: MacIONVRAMState *s = opaque; ! 74: uint32_t value; ! 75: ! 76: addr -= s->mem_base; ! 77: addr = (addr >> 4) & 0x1fff; ! 78: value = s->data[addr]; ! 79: // printf("macio_nvram_readb %04x = %02x\n", addr, value); ! 80: ! 81: return value; ! 82: } ! 83: ! 84: static CPUWriteMemoryFunc *nvram_write[] = { ! 85: &macio_nvram_writeb, ! 86: &macio_nvram_writeb, ! 87: &macio_nvram_writeb, ! 88: }; ! 89: ! 90: static CPUReadMemoryFunc *nvram_read[] = { ! 91: &macio_nvram_readb, ! 92: &macio_nvram_readb, ! 93: &macio_nvram_readb, ! 94: }; ! 95: ! 96: MacIONVRAMState *macio_nvram_init (int *mem_index, target_phys_addr_t size) ! 97: { ! 98: MacIONVRAMState *s; ! 99: ! 100: s = qemu_mallocz(sizeof(MacIONVRAMState)); ! 101: if (!s) ! 102: return NULL; ! 103: s->size = size; ! 104: s->mem_index = cpu_register_io_memory(0, nvram_read, nvram_write, s); ! 105: *mem_index = s->mem_index; ! 106: ! 107: return s; ! 108: } ! 109: ! 110: void macio_nvram_map (void *opaque, target_phys_addr_t mem_base) ! 111: { ! 112: MacIONVRAMState *s; ! 113: ! 114: s = opaque; ! 115: s->mem_base = mem_base; ! 116: cpu_register_physical_memory(mem_base, s->size, s->mem_index); ! 117: } ! 118: ! 119: static uint8_t nvram_chksum (const uint8_t *buf, int n) ! 120: { ! 121: int sum, i; ! 122: sum = 0; ! 123: for(i = 0; i < n; i++) ! 124: sum += buf[i]; ! 125: return (sum & 0xff) + (sum >> 8); ! 126: } ! 127: ! 128: /* set a free Mac OS NVRAM partition */ ! 129: void pmac_format_nvram_partition (MacIONVRAMState *nvr, int len) ! 130: { ! 131: uint8_t *buf; ! 132: char partition_name[12] = "wwwwwwwwwwww"; ! 133: ! 134: buf = nvr->data; ! 135: buf[0] = 0x7f; /* free partition magic */ ! 136: buf[1] = 0; /* checksum */ ! 137: buf[2] = len >> 8; ! 138: buf[3] = len; ! 139: memcpy(buf + 4, partition_name, 12); ! 140: buf[1] = nvram_chksum(buf, 16); ! 141: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.