Palacios Public Git Repository

To checkout Palacios execute

  git clone http://v3vee.org/palacios/palacios.web/palacios.git
This will give you the master branch. You probably want the devel branch or one of the release branches. To switch to the devel branch, simply execute
  cd palacios
  git checkout --track -b devel origin/devel
The other branches are similar.


added support for register instrs
[palacios-OLD.git] / palacios / src / devices / nvram.c
index b1d31e5..ef37366 100644 (file)
@@ -2,9 +2,15 @@
 #include <palacios/vmm.h>
 #include <palacios/vmm_types.h>
 
-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);