From mboxrd@z Thu Jan 1 00:00:00 1970 From: Arun Sharma Subject: [PATCH][1/9] Xen full virtualization does not handle unaligned IO with page crossing. Date: Mon, 25 Jul 2005 14:00:39 -0700 Message-ID: <20050725210038.GA24273@intel.com> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Return-path: Content-Disposition: inline List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Sender: xen-devel-bounces@lists.xensource.com Errors-To: xen-devel-bounces@lists.xensource.com To: Ian Pratt , Keir Fraser Cc: xen-devel@lists.xensource.com List-Id: xen-devel@lists.xenproject.org Xen full virtualization does not handle unaligned IO with page crossing. Disable 32-bit PIO as a workaround. Signed-off-by: Asit Mallick Signed-off-by: Arun Sharma diff -r c9f0c3619b96 -r ae5dbce3f530 tools/firmware/rombios/rombios.c --- a/tools/firmware/rombios/rombios.c Tue Jul 12 23:37:57 2005 +++ b/tools/firmware/rombios/rombios.c Wed Jul 13 19:12:38 2005 @@ -28,6 +28,11 @@ #define VMXASSIST #undef VMXTEST + +// Xen full virtualization does not handle unaligned IO with page crossing. +// Disable 32-bit PIO as a workaround. +#define NO_PIO32 + // ROM BIOS compatability entry points: // =================================== @@ -2248,6 +2253,9 @@ Bit16u cylinders, heads, spt, blksize; Bit8u translation, removable, mode; + // default mode to PIO16 + mode = ATA_MODE_PIO16; + //Temporary values to do the transfer write_byte(ebda_seg,&EbdaData->ata.devices[device].device,ATA_DEVICE_HD); write_byte(ebda_seg,&EbdaData->ata.devices[device].mode, ATA_MODE_PIO16); @@ -2256,7 +2264,10 @@ BX_PANIC("ata-detect: Failed to detect ATA device\n"); removable = (read_byte(get_SS(),buffer+0) & 0x80) ? 1 : 0; +#ifndef NO_PIO32 mode = read_byte(get_SS(),buffer+96) ? ATA_MODE_PIO32 : ATA_MODE_PIO16; +#endif + blksize = read_word(get_SS(),buffer+10); cylinders = read_word(get_SS(),buffer+(1*2)); // word 1 @@ -2346,6 +2357,9 @@ Bit8u type, removable, mode; Bit16u blksize; + // default mode to PIO16 + mode = ATA_MODE_PIO16; + //Temporary values to do the transfer write_byte(ebda_seg,&EbdaData->ata.devices[device].device,ATA_DEVICE_CDROM); write_byte(ebda_seg,&EbdaData->ata.devices[device].mode, ATA_MODE_PIO16); @@ -2355,7 +2369,9 @@ type = read_byte(get_SS(),buffer+1) & 0x1f; removable = (read_byte(get_SS(),buffer+0) & 0x80) ? 1 : 0; +#ifndef NO_PIO32 mode = read_byte(get_SS(),buffer+96) ? ATA_MODE_PIO32 : ATA_MODE_PIO16; +#endif blksize = 2048; write_byte(ebda_seg,&EbdaData->ata.devices[device].device, type);