the patch is in attach file
to apply use "*patch src/farptr.h < farptr.patch*" from seabios directory

This will fix the problem of calling bios service int 0x13 AH=0x42 when the
drive is a ATAPI

(because Outs should use DS:SI and not ES:DI)

This bug affect all Outs() when called from real mode 16bits !

i save DS and restore it after, because Seabios use it
diff --git a/src/farptr.h b/src/farptr.h
index 0a4db68b..4fbe66c3 100644
--- a/src/farptr.h
+++ b/src/farptr.h
@@ -161,16 +161,22 @@ static inline void insl_fl(u16 port, void *ptr_fl, u16 count) {
     insl(port, (u32*)FLATPTR_TO_OFFSET(ptr_fl), count);
 }
 static inline void outsb_fl(u16 port, void *ptr_fl, u16 count) {
-    SET_SEG(ES, FLATPTR_TO_SEG(ptr_fl));
+    u16 ds = GET_SEG(DS);
+    SET_SEG(DS, FLATPTR_TO_SEG(ptr_fl));
     outsb(port, (u8*)FLATPTR_TO_OFFSET(ptr_fl), count);
+    SET_SEG(DS, ds);
 }
 static inline void outsw_fl(u16 port, void *ptr_fl, u16 count) {
-    SET_SEG(ES, FLATPTR_TO_SEG(ptr_fl));
+    u16 ds = GET_SEG(DS);
+    SET_SEG(DS, FLATPTR_TO_SEG(ptr_fl));
     outsw(port, (u16*)FLATPTR_TO_OFFSET(ptr_fl), count);
+    SET_SEG(DS, ds);
 }
 static inline void outsl_fl(u16 port, void *ptr_fl, u16 count) {
-    SET_SEG(ES, FLATPTR_TO_SEG(ptr_fl));
+    u16 ds = GET_SEG(DS);
+    SET_SEG(DS, FLATPTR_TO_SEG(ptr_fl));
     outsl(port, (u32*)FLATPTR_TO_OFFSET(ptr_fl), count);
+    SET_SEG(DS, ds);
 }
 
 #else
_______________________________________________
SeaBIOS mailing list -- seabios@seabios.org
To unsubscribe send an email to seabios-le...@seabios.org

Reply via email to