Index: /trunk/src/VBox/Devices/PC/BIOS-new/ahci.c
===================================================================
--- /trunk/src/VBox/Devices/PC/BIOS-new/ahci.c	(revision 39595)
+++ /trunk/src/VBox/Devices/PC/BIOS-new/ahci.c	(revision 39596)
@@ -88,5 +88,6 @@
 } ahci_t;
 
-#define AhciData ((ahci_t *) 0)
+/* The AHCI specific data must fit into 1KB (statically allocated). */
+ct_assert(sizeof(ahci_t) <= 1024);
 
 /** PCI configuration fields. */
@@ -317,5 +318,5 @@
     /* Build variable part first of command dword (reuses 'cmd'). */
     if (cmd == AHCI_CMD_WRITE_DMA_EXT)
-        cmd = RT_BIT_32(6);     /* Indicate write to device. */
+        cmd = RT_BIT_32(6);     /* Indicate a write to device. */
     else if (cmd == ATA_CMD_PACKET) {
         cmd |= RT_BIT_32(5);    /* Indicate ATAPI command. */
@@ -406,5 +407,5 @@
 
     DBG_AHCI("AHCI: FIS receive area %lx from %x:%x\n",
-             ahci_addr_to_phys(&ahci->abFisRecv), FP_SEG(ahci), &AhciData->abFisRecv);
+             ahci_addr_to_phys(&ahci->abFisRecv), FP_SEG(ahci->abFisRecv), FP_OFF(ahci->abFisRecv));
     VBOXAHCI_PORT_WRITE_REG(ahci->iobase, u8Port, AHCI_REG_PORT_FB, ahci_addr_to_phys(&ahci->abFisRecv));
     VBOXAHCI_PORT_WRITE_REG(ahci->iobase, u8Port, AHCI_REG_PORT_FBU, 0);
@@ -727,10 +728,14 @@
 static int ahci_hba_init(uint16_t io_base)
 {
-    uint8_t     i, cPorts;
-    uint32_t    val;
-    uint16_t    ebda_seg;
-    uint16_t    ahci_seg;
+    uint8_t             i, cPorts;
+    uint32_t            val;
+    uint16_t            ebda_seg;
+    uint16_t            ahci_seg;
+    bio_dsk_t __far     *bios_dsk;
+    ahci_t __far        *ahci;
+    
 
     ebda_seg = read_word(0x0040, 0x000E);
+    bios_dsk = ebda_seg :> &EbdaData->bdisk;
 
     AHCI_READ_REG(io_base, AHCI_REG_VS, val);
@@ -749,8 +754,10 @@
              ahci_seg, sizeof(ahci_t), (uint16_t)&EbdaData->bdisk.ahci_seg, sizeof(ebda_data_t));
 
-    write_word(ebda_seg, (uint16_t)&EbdaData->bdisk.ahci_seg, ahci_seg);
-    write_byte(ebda_seg, (uint16_t)&EbdaData->bdisk.ahci_devcnt, 0);
-    write_byte(ahci_seg, (uint16_t)&AhciData->cur_port, 0xff);
-    write_word(ahci_seg, (uint16_t)&AhciData->iobase, io_base);
+    bios_dsk->ahci_seg    = ahci_seg;
+    bios_dsk->ahci_devcnt = 0;
+
+    ahci = ahci_seg :> 0;
+    ahci->cur_port = 0xff;
+    ahci->iobase   = io_base;
 
     /* Reset the controller. */
