X-Git-Url: http://v3vee.org/palacios/gitweb/gitweb.cgi?a=blobdiff_plain;f=palacios%2Fsrc%2Fdevices%2Fnvram.c;h=ef37366ee28b06e2603aa48eedcb507946c68101;hb=e0d21d7727f32ab299e90a1ad602373a4a415c29;hp=b1d31e561f66a744bc403e9ad5ae5ce9b4195c59;hpb=43c556d146e12c7f35612e3a8cf6420b42fdef70;p=palacios-OLD.git diff --git a/palacios/src/devices/nvram.c b/palacios/src/devices/nvram.c index b1d31e5..ef37366 100644 --- a/palacios/src/devices/nvram.c +++ b/palacios/src/devices/nvram.c @@ -2,9 +2,15 @@ #include #include -extern struct vmm_os_hooks *os_hooks; -extern void SerialPrint(const char *format, ...); +#ifndef DEBUG_NVRAM +#undef PrintDebug +#define PrintDebug(fmt, args...) +#endif + + + + #define NVRAM_REG_PORT 0x70 #define NVRAM_DATA_PORT 0x71 @@ -36,6 +42,8 @@ typedef enum {NVRAM_READY, NVRAM_REG_POSTED} nvram_state_t; #define NVRAM_REG_DIAGNOSTIC_STATUS 0x0e #define NVRAM_REG_SHUTDOWN_STATUS 0x0f +#define NVRAM_IBM_HD_DATA 0x12 + #define NVRAM_REG_FLOPPY_TYPE 0x10 #define NVRAM_REG_EQUIPMENT_BYTE 0x14 @@ -78,7 +86,11 @@ static int set_nvram_defaults(struct vm_device *dev) // // 2 1.44 MB floppy drives // +#if 1 nvram_state->mem_state[NVRAM_REG_FLOPPY_TYPE]= 0x44; +#else + nvram_state->mem_state[NVRAM_REG_FLOPPY_TYPE] = 0x00; +#endif // // For old boot sequence style, do floppy first @@ -98,6 +110,7 @@ static int set_nvram_defaults(struct vm_device *dev) // Set equipment byte to note 2 floppies, vga display, keyboard,math,floppy nvram_state->mem_state[NVRAM_REG_EQUIPMENT_BYTE]= 0x4f; + //nvram_state->mem_state[NVRAM_REG_EQUIPMENT_BYTE] = 0xf; // Set conventional memory to 640K nvram_state->mem_state[NVRAM_REG_BASE_MEMORY_HIGH]= 0x02; @@ -110,10 +123,32 @@ static int set_nvram_defaults(struct vm_device *dev) nvram_state->mem_state[NVRAM_REG_EXT_MEMORY_2ND_LOW]= 0x00; // Set the extended memory beyond 16 MB to 128-16 MB - nvram_state->mem_state[NVRAM_REG_AMI_BIG_MEMORY_HIGH]= 0x7; - nvram_state->mem_state[NVRAM_REG_AMI_BIG_MEMORY_LOW]= 0x00; + nvram_state->mem_state[NVRAM_REG_AMI_BIG_MEMORY_HIGH] = 0x7; + nvram_state->mem_state[NVRAM_REG_AMI_BIG_MEMORY_LOW] = 0x00; + + //nvram_state->mem_state[NVRAM_REG_AMI_BIG_MEMORY_HIGH]= 0x00; + //nvram_state->mem_state[NVRAM_REG_AMI_BIG_MEMORY_LOW]= 0x00; + // This is the harddisk type.... Set accordingly... + nvram_state->mem_state[NVRAM_IBM_HD_DATA] = 0x20; + + // Set the shutdown status gently + // soft reset + nvram_state->mem_state[NVRAM_REG_SHUTDOWN_STATUS] = 0x0; + + + // RTC status A + // time update in progress, default timebase (32KHz, default interrupt rate 1KHz) + // 10100110 + nvram_state->mem_state[NVRAM_REG_STAT_A] = 0xa6; + + // RTC status B + // time updates, default timebase (32KHz, default interrupt rate 1KHz) + // 10100110 + //nvram_state->mem_state[NVRAM_REG_STAT_B] = 0xa6; + + return 0; @@ -124,7 +159,7 @@ int nvram_reset_device(struct vm_device * dev) { struct nvram_internal *data = (struct nvram_internal *) dev->private_data; - SerialPrint("nvram: reset device\n"); + PrintDebug("nvram: reset device\n"); @@ -142,14 +177,14 @@ int nvram_reset_device(struct vm_device * dev) int nvram_start_device(struct vm_device *dev) { - SerialPrint("nvram: start device\n"); + PrintDebug("nvram: start device\n"); return 0; } int nvram_stop_device(struct vm_device *dev) { - SerialPrint("nvram: stop device\n"); + PrintDebug("nvram: stop device\n"); return 0; } @@ -164,6 +199,7 @@ int nvram_write_reg_port(ushort_t port, struct nvram_internal *data = (struct nvram_internal *) dev->private_data; memcpy(&(data->thereg), src, 1); + PrintDebug("Writing To NVRAM reg: 0x%x\n", data->thereg); return 1; @@ -180,7 +216,13 @@ int nvram_read_data_port(ushort_t port, memcpy(dst, &(data->mem_state[data->thereg]), 1); - SerialPrint("nvram_read_data_port(%x)=%x\n",data->thereg,data->mem_state[data->thereg]); + PrintDebug("nvram_read_data_port(0x%x)=0x%x\n", data->thereg, data->mem_state[data->thereg]); + + // hack + if (data->thereg==NVRAM_REG_STAT_A) { + data->mem_state[data->thereg] ^= 0x80; // toggle Update in progess + } + return 1; } @@ -194,7 +236,7 @@ int nvram_write_data_port(ushort_t port, memcpy(&(data->mem_state[data->thereg]), src, 1); - SerialPrint("nvram_write_data_port(%x)=%x\n",data->thereg,data->mem_state[data->thereg]); + PrintDebug("nvram_write_data_port(0x%x)=0x%x\n", data->thereg, data->mem_state[data->thereg]); return 1; } @@ -205,7 +247,7 @@ int nvram_init_device(struct vm_device * dev) { struct nvram_internal *data = (struct nvram_internal *) dev->private_data; - SerialPrint("nvram: init_device\n"); + PrintDebug("nvram: init_device\n"); memset(data->mem_state, 0, NVRAM_REG_MAX); @@ -248,9 +290,9 @@ static struct vm_device_ops dev_ops = { struct vm_device *create_nvram() { - struct nvram_internal * nvram_state = os_hooks->malloc(sizeof(struct nvram_internal)+1000); + struct nvram_internal * nvram_state = (struct nvram_internal *)V3_Malloc(sizeof(struct nvram_internal)+1000); - SerialPrint("internal at %x\n",nvram_state); + PrintDebug("internal at %x\n",nvram_state); struct vm_device *device = create_device("NVRAM", &dev_ops, nvram_state);