(linenum→info "unix/slp.c:2238")

qemu/0.9.1/hw/mac_nvram.c

    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: }
Syntax (Markdown)