Annotation of qemu/hw/mac_nvram.c, revision 1.1

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: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.