ppc: suppressed unneeded globals and headers - added explicit type for ppc nvram
[qemu] / hw / ide.c
index a132d1c..f5efa8e 100644 (file)
--- a/hw/ide.c
+++ b/hw/ide.c
  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
  * THE SOFTWARE.
  */
-#include <stdlib.h>
-#include <stdio.h>
-#include <stdarg.h>
-#include <string.h>
-#include <getopt.h>
-#include <inttypes.h>
-#include <unistd.h>
-#include <sys/mman.h>
-#include <fcntl.h>
-#include <signal.h>
-#include <time.h>
-#include <sys/time.h>
-#include <malloc.h>
-#include <termios.h>
-#include <sys/poll.h>
-#include <errno.h>
-#include <sys/wait.h>
-#include <netinet/in.h>
-
-#define NO_THUNK_TYPE_SIZE
-#include "thunk.h"
-
-#include "cpu.h"
-#include "exec-all.h"
-
 #include "vl.h"
 
 /* debug IDE devices */
@@ -375,6 +350,15 @@ static void padstr8(uint8_t *buf, int buf_size, const char *src)
     }
 }
 
+static void put_le16(uint16_t *p, unsigned int v)
+{
+#ifdef WORDS_BIGENDIAN
+    *p = bswap16(v);
+#else
+    *p = v;
+#endif
+}
+
 static void ide_identify(IDEState *s)
 {
     uint16_t *p;
@@ -382,43 +366,43 @@ static void ide_identify(IDEState *s)
 
     memset(s->io_buffer, 0, 512);
     p = (uint16_t *)s->io_buffer;
-    stw_raw(p + 0, 0x0040);
-    stw_raw(p + 1, s->cylinders); 
-    stw_raw(p + 3, s->heads);
-    stw_raw(p + 4, 512 * s->sectors); /* XXX: retired, remove ? */
-    stw_raw(p + 5, 512); /* XXX: retired, remove ? */
-    stw_raw(p + 6, s->sectors); 
+    put_le16(p + 0, 0x0040);
+    put_le16(p + 1, s->cylinders); 
+    put_le16(p + 3, s->heads);
+    put_le16(p + 4, 512 * s->sectors); /* XXX: retired, remove ? */
+    put_le16(p + 5, 512); /* XXX: retired, remove ? */
+    put_le16(p + 6, s->sectors); 
     padstr((uint8_t *)(p + 10), "QM00001", 20); /* serial number */
-    stw_raw(p + 20, 3); /* XXX: retired, remove ? */
-    stw_raw(p + 21, 512); /* cache size in sectors */
-    stw_raw(p + 22, 4); /* ecc bytes */
+    put_le16(p + 20, 3); /* XXX: retired, remove ? */
+    put_le16(p + 21, 512); /* cache size in sectors */
+    put_le16(p + 22, 4); /* ecc bytes */
     padstr((uint8_t *)(p + 23), QEMU_VERSION, 8); /* firmware version */
     padstr((uint8_t *)(p + 27), "QEMU HARDDISK", 40); /* model */
 #if MAX_MULT_SECTORS > 1    
-    stw_raw(p + 47, 0x8000 | MAX_MULT_SECTORS);
+    put_le16(p + 47, 0x8000 | MAX_MULT_SECTORS);
 #endif
-    stw_raw(p + 48, 1); /* dword I/O */
-    stw_raw(p + 49, 1 << 9); /* LBA supported, no DMA */
-    stw_raw(p + 51, 0x200); /* PIO transfer cycle */
-    stw_raw(p + 52, 0x200); /* DMA transfer cycle */
-    stw_raw(p + 53, 1); /* words 54-58 are valid */
-    stw_raw(p + 54, s->cylinders);
-    stw_raw(p + 55, s->heads);
-    stw_raw(p + 56, s->sectors);
+    put_le16(p + 48, 1); /* dword I/O */
+    put_le16(p + 49, 1 << 9); /* LBA supported, no DMA */
+    put_le16(p + 51, 0x200); /* PIO transfer cycle */
+    put_le16(p + 52, 0x200); /* DMA transfer cycle */
+    put_le16(p + 53, 1); /* words 54-58 are valid */
+    put_le16(p + 54, s->cylinders);
+    put_le16(p + 55, s->heads);
+    put_le16(p + 56, s->sectors);
     oldsize = s->cylinders * s->heads * s->sectors;
-    stw_raw(p + 57, oldsize);
-    stw_raw(p + 58, oldsize >> 16);
+    put_le16(p + 57, oldsize);
+    put_le16(p + 58, oldsize >> 16);
     if (s->mult_sectors)
-        stw_raw(p + 59, 0x100 | s->mult_sectors);
-    stw_raw(p + 60, s->nb_sectors);
-    stw_raw(p + 61, s->nb_sectors >> 16);
-    stw_raw(p + 80, (1 << 1) | (1 << 2));
-    stw_raw(p + 82, (1 << 14));
-    stw_raw(p + 83, (1 << 14));
-    stw_raw(p + 84, (1 << 14));
-    stw_raw(p + 85, (1 << 14));
-    stw_raw(p + 86, 0);
-    stw_raw(p + 87, (1 << 14));
+        put_le16(p + 59, 0x100 | s->mult_sectors);
+    put_le16(p + 60, s->nb_sectors);
+    put_le16(p + 61, s->nb_sectors >> 16);
+    put_le16(p + 80, (1 << 1) | (1 << 2));
+    put_le16(p + 82, (1 << 14));
+    put_le16(p + 83, (1 << 14));
+    put_le16(p + 84, (1 << 14));
+    put_le16(p + 85, (1 << 14));
+    put_le16(p + 86, 0);
+    put_le16(p + 87, (1 << 14));
 }
 
 static void ide_atapi_identify(IDEState *s)
@@ -428,32 +412,32 @@ static void ide_atapi_identify(IDEState *s)
     memset(s->io_buffer, 0, 512);
     p = (uint16_t *)s->io_buffer;
     /* Removable CDROM, 50us response, 12 byte packets */
-    stw_raw(p + 0, (2 << 14) | (5 << 8) | (1 << 7) | (2 << 5) | (0 << 0));
-    stw_raw(p + 1, s->cylinders); 
-    stw_raw(p + 3, s->heads);
-    stw_raw(p + 4, 512 * s->sectors); /* sectors */
-    stw_raw(p + 5, 512); /* sector size */
-    stw_raw(p + 6, s->sectors); 
+    put_le16(p + 0, (2 << 14) | (5 << 8) | (1 << 7) | (2 << 5) | (0 << 0));
+    put_le16(p + 1, s->cylinders); 
+    put_le16(p + 3, s->heads);
+    put_le16(p + 4, 512 * s->sectors); /* sectors */
+    put_le16(p + 5, 512); /* sector size */
+    put_le16(p + 6, s->sectors); 
     padstr((uint8_t *)(p + 10), "QM00001", 20); /* serial number */
-    stw_raw(p + 20, 3); /* buffer type */
-    stw_raw(p + 21, 512); /* cache size in sectors */
-    stw_raw(p + 22, 4); /* ecc bytes */
+    put_le16(p + 20, 3); /* buffer type */
+    put_le16(p + 21, 512); /* cache size in sectors */
+    put_le16(p + 22, 4); /* ecc bytes */
     padstr((uint8_t *)(p + 23), QEMU_VERSION, 8); /* firmware version */
     padstr((uint8_t *)(p + 27), "QEMU CD-ROM", 40); /* model */
-    stw_raw(p + 48, 1); /* dword I/O (XXX: should not be set on CDROM) */
-    stw_raw(p + 49, 1 << 9); /* LBA supported, no DMA */
-    stw_raw(p + 53, 3); /* words 64-70, 54-58 valid */
-    stw_raw(p + 63, 0x103); /* DMA modes XXX: may be incorrect */
-    stw_raw(p + 64, 1); /* PIO modes */
-    stw_raw(p + 65, 0xb4); /* minimum DMA multiword tx cycle time */
-    stw_raw(p + 66, 0xb4); /* recommended DMA multiword tx cycle time */
-    stw_raw(p + 67, 0x12c); /* minimum PIO cycle time without flow control */
-    stw_raw(p + 68, 0xb4); /* minimum PIO cycle time with IORDY flow control */
+    put_le16(p + 48, 1); /* dword I/O (XXX: should not be set on CDROM) */
+    put_le16(p + 49, 1 << 9); /* LBA supported, no DMA */
+    put_le16(p + 53, 3); /* words 64-70, 54-58 valid */
+    put_le16(p + 63, 0x103); /* DMA modes XXX: may be incorrect */
+    put_le16(p + 64, 1); /* PIO modes */
+    put_le16(p + 65, 0xb4); /* minimum DMA multiword tx cycle time */
+    put_le16(p + 66, 0xb4); /* recommended DMA multiword tx cycle time */
+    put_le16(p + 67, 0x12c); /* minimum PIO cycle time without flow control */
+    put_le16(p + 68, 0xb4); /* minimum PIO cycle time with IORDY flow control */
     
-    stw_raw(p + 71, 30); /* in ns */
-    stw_raw(p + 72, 30); /* in ns */
+    put_le16(p + 71, 30); /* in ns */
+    put_le16(p + 72, 30); /* in ns */
 
-    stw_raw(p + 80, 0x1e); /* support up to ATA/ATAPI-4 */
+    put_le16(p + 80, 0x1e); /* support up to ATA/ATAPI-4 */
 }
 
 static void ide_set_signature(IDEState *s)
@@ -1060,7 +1044,7 @@ static void cdrom_change_cb(void *opaque)
 static void ide_ioport_write(void *opaque, uint32_t addr, uint32_t val)
 {
     IDEState *ide_if = opaque;
-    IDEState *s = ide_if->cur_drive;
+    IDEState *s;
     int unit, n;
 
 #ifdef DEBUG_IDE
@@ -1071,28 +1055,35 @@ static void ide_ioport_write(void *opaque, uint32_t addr, uint32_t val)
     case 0:
         break;
     case 1:
-        s->feature = val;
+        /* NOTE: data is written to the two drives */
+        ide_if[0].feature = val;
+        ide_if[1].feature = val;
         break;
     case 2:
         if (val == 0)
             val = 256;
-        s->nsector = val;
+        ide_if[0].nsector = val;
+        ide_if[1].nsector = val;
         break;
     case 3:
-        s->sector = val;
+        ide_if[0].sector = val;
+        ide_if[1].sector = val;
         break;
     case 4:
-        s->lcyl = val;
+        ide_if[0].lcyl = val;
+        ide_if[1].lcyl = val;
         break;
     case 5:
-        s->hcyl = val;
+        ide_if[0].hcyl = val;
+        ide_if[1].hcyl = val;
         break;
     case 6:
+        ide_if[0].select = (val & ~0x10) | 0xa0;
+        ide_if[1].select = (val | 0x10) | 0xa0;
         /* select drive */
         unit = (val >> 4) & 1;
         s = ide_if + unit;
         ide_if->cur_drive = s;
-        s->select = val;
         break;
     default:
     case 7:
@@ -1100,6 +1091,7 @@ static void ide_ioport_write(void *opaque, uint32_t addr, uint32_t val)
 #if defined(DEBUG_IDE)
         printf("ide: CMD=%02x\n", val);
 #endif
+        s = ide_if->cur_drive;
         switch(val) {
         case WIN_IDENTIFY:
             if (s->bs && !s->is_cdrom) {
@@ -1218,7 +1210,8 @@ static void ide_ioport_write(void *opaque, uint32_t addr, uint32_t val)
 
 static uint32_t ide_ioport_read(void *opaque, uint32_t addr1)
 {
-    IDEState *s = ((IDEState *)opaque)->cur_drive;
+    IDEState *ide_if = opaque;
+    IDEState *s = ide_if->cur_drive;
     uint32_t addr;
     int ret;
 
@@ -1228,26 +1221,47 @@ static uint32_t ide_ioport_read(void *opaque, uint32_t addr1)
         ret = 0xff;
         break;
     case 1:
-        ret = s->error;
+        if (!ide_if[0].bs && !ide_if[1].bs)
+            ret = 0;
+        else
+            ret = s->error;
         break;
     case 2:
-        ret = s->nsector & 0xff;
+        if (!ide_if[0].bs && !ide_if[1].bs)
+            ret = 0;
+        else
+            ret = s->nsector & 0xff;
         break;
     case 3:
-        ret = s->sector;
+        if (!ide_if[0].bs && !ide_if[1].bs)
+            ret = 0;
+        else
+            ret = s->sector;
         break;
     case 4:
-        ret = s->lcyl;
+        if (!ide_if[0].bs && !ide_if[1].bs)
+            ret = 0;
+        else
+            ret = s->lcyl;
         break;
     case 5:
-        ret = s->hcyl;
+        if (!ide_if[0].bs && !ide_if[1].bs)
+            ret = 0;
+        else
+            ret = s->hcyl;
         break;
     case 6:
-        ret = s->select;
+        if (!ide_if[0].bs && !ide_if[1].bs)
+            ret = 0;
+        else
+            ret = s->select;
         break;
     default:
     case 7:
-        ret = s->status;
+        if (!ide_if[0].bs && !ide_if[1].bs)
+            ret = 0;
+        else
+            ret = s->status;
         pic_set_irq(s->irq, 0);
         break;
     }
@@ -1259,9 +1273,14 @@ static uint32_t ide_ioport_read(void *opaque, uint32_t addr1)
 
 static uint32_t ide_status_read(void *opaque, uint32_t addr)
 {
-    IDEState *s = ((IDEState *)opaque)->cur_drive;
+    IDEState *ide_if = opaque;
+    IDEState *s = ide_if->cur_drive;
     int ret;
-    ret = s->status;
+
+    if (!ide_if[0].bs && !ide_if[1].bs)
+        ret = 0;
+    else
+        ret = s->status;
 #ifdef DEBUG_IDE
     printf("ide: read status addr=0x%x val=%02x\n", addr, ret);
 #endif