]> git.ipfire.org Git - thirdparty/grub.git/commitdiff
add extended regs support in bios_interrupt
authorVladimir 'phcoder' Serbinenko <phcoder@gmail.com>
Sun, 17 Jan 2010 20:16:05 +0000 (21:16 +0100)
committerVladimir 'phcoder' Serbinenko <phcoder@gmail.com>
Sun, 17 Jan 2010 20:16:05 +0000 (21:16 +0100)
disk/i386/pc/biosdisk.c
include/grub/i386/pc/int.h
kern/i386/pc/startup.S

index 0f75dba5f2cd35b847b60dde48bcfa59d25c2c4b..92198e591173e2c6d07befae1d67a638e4a497ad 100644 (file)
@@ -33,29 +33,29 @@ static int grub_biosdisk_rw_int13_extensions (int ah, int drive, void *dap);
 
 static int grub_biosdisk_get_num_floppies (void)
 {
-  struct grub_cpu_int_registers regs;
+  struct grub_bios_int_registers regs;
   int drive;
 
   /* reset the disk system first */
-  regs.ax = 0;
-  regs.dx = 0;
+  regs.eax = 0;
+  regs.edx = 0;
   regs.flags = GRUB_CPU_INT_FLAGS_DEFAULT;
 
-  grub_cpu_interrupt (0x13, &regs);
+  grub_bios_interrupt (0x13, &regs);
 
   for (drive = 0; drive < 2; drive++)
     {
       regs.flags = GRUB_CPU_INT_FLAGS_DEFAULT | GRUB_CPU_INT_FLAGS_CARRY;
-      regs.dx = drive;
+      regs.edx = drive;
 
       /* call GET DISK TYPE */
-      regs.ax = 0x1500;
-      grub_cpu_interrupt (0x13, &regs);
+      regs.eax = 0x1500;
+      grub_bios_interrupt (0x13, &regs);
       if (regs.flags & GRUB_CPU_INT_FLAGS_CARRY)
        break;
 
       /* check if this drive exists */
-      if (!(regs.ax & 0x300))
+      if (!(regs.eax & 0x300))
        break;
     }
 
@@ -71,16 +71,16 @@ static int grub_biosdisk_get_num_floppies (void)
 static int 
 grub_biosdisk_rw_int13_extensions (int ah, int drive, void *dap)
 {
-  struct grub_cpu_int_registers regs;
-  regs.ax = ah << 8;
+  struct grub_bios_int_registers regs;
+  regs.eax = ah << 8;
   /* compute the address of disk_address_packet */
   regs.ds = (((grub_addr_t) dap) & 0xffff0000) >> 4;
-  regs.si = (((grub_addr_t) dap) & 0xffff);
-  regs.dx = drive;
+  regs.esi = (((grub_addr_t) dap) & 0xffff);
+  regs.edx = drive;
   regs.flags = GRUB_CPU_INT_FLAGS_DEFAULT;
 
-  grub_cpu_interrupt (0x13, &regs);
-  return regs.ax >> 8;
+  grub_bios_interrupt (0x13, &regs);
+  return (regs.eax >> 8) & 0xff;
 }
 
 static int
index b8cbe326097dd4190c5e2f02e2621d032c6ddfea..e1c463925e447ad7c852312147bc821bdcf7c444 100644 (file)
 
 #include <grub/symbol.h>
 
-struct grub_cpu_int_registers
+struct grub_bios_int_registers
 {
-  grub_uint16_t bx;
+  grub_uint32_t eax;
   grub_uint16_t es;
-  grub_uint16_t cx;
-  grub_uint16_t ax;
-  grub_uint16_t dx;
   grub_uint16_t ds;
-  grub_uint16_t di;
   grub_uint16_t flags;
-  grub_uint16_t si;
+  grub_uint16_t dummy;
+  grub_uint32_t ebx;
+  grub_uint32_t ecx;
+  grub_uint32_t edi;
+  grub_uint32_t esi;
+  grub_uint32_t edx;
 };
 
 #define  GRUB_CPU_INT_FLAGS_CARRY     0x1
@@ -45,6 +46,7 @@ struct grub_cpu_int_registers
 #define  GRUB_CPU_INT_FLAGS_OVERFLOW  0x800
 #define  GRUB_CPU_INT_FLAGS_DEFAULT   GRUB_CPU_INT_FLAGS_INTERRUPT
 
-void EXPORT_FUNC (grub_cpu_interrupt) (grub_uint8_t intno, struct grub_cpu_int_registers *regs);
+void EXPORT_FUNC (grub_bios_interrupt) (grub_uint8_t intno,
+                                       struct grub_bios_int_registers *regs);
 
 #endif
index 815686502e8e1f010dab5dea8135c8f8111a80d8..cb6ef32a6e6d9405ceb3131a623a80fa29b9d2ed 100644 (file)
@@ -2068,73 +2068,96 @@ FUNCTION(grub_pxe_call)
        popl    %ebp
        ret
 
-FUNCTION(grub_cpu_interrupt)
+FUNCTION(grub_bios_interrupt)
        pushl    %ebp
-       pushl    %esi
-       pushl    %edi
-       pushl    %ebx
+       pushl    %ecx
+       pushl    %eax
        pushl    %edx
+       
        movb     %al, intno
-       movl     %edx, %esi
-
-       movl     0(%esi), %ebx
-       movl     4(%esi), %ecx
-       movl     8(%esi), %edx
-       movl     12(%esi), %edi
-       movw     16(%esi), %si
+       movl     (%edx), %eax
+       movl     %eax, LOCAL(bios_register_eax)
+       movw     4(%edx), %ax
+       movw     %ax, LOCAL(bios_register_es)
+       movw     6(%edx), %ax
+       movw     %ax, LOCAL(bios_register_ds)
+       movw     8(%edx), %ax
+       movw     %ax, LOCAL(bios_register_flags)
+
+       movl    12(%edx), %ebx
+       movl    16(%edx), %ecx
+       movl    20(%edx), %edi
+       movl    24(%edx), %esi
+       movl    28(%edx), %edx
 
        call    prot_to_real
        .code16
-       movl    %edi, %eax
-       shrl    $16, %eax
-       push    %ax
 
-       movl    %ebx, %eax
-       shrl    $16, %eax
-       movw    %ax, %es
-       
-       movl    %edx, %eax
-       shrl    $16, %eax
-       movw    %ax, %ds
+       mov     %ds, %ax
+       push    %ax
 
-       movl    %ecx, %eax
-       shrl    $16, %eax
+       /* movw imm16, %ax*/
+       .byte   0xb8
+LOCAL(bios_register_es):
+       .short  0
+       movw    %ax, %es
+       /* movw imm16, %ax*/
+       .byte   0xb8
+LOCAL(bios_register_ds):
+       .short  0
+       movw    %ax, %ds
 
+       /* movw imm16, %ax*/
+       .byte   0xb8
+LOCAL(bios_register_flags):
+       .short  0
+       push    %ax
        popf
+
+       /* movl imm32, %eax*/
+       .byte   0x66, 0xb8
+LOCAL(bios_register_eax):
+       .long   0
+       
+       /* int imm8.  */
        .byte   0xcd
 intno: 
        .byte   0
 
+       movl    %eax, %cs:LOCAL(bios_register_eax)
+       movw    %ds, %ax
+       movw    %ax, %cs:LOCAL(bios_register_ds)
+       pop     %ax
+       mov     %ax, %ds
        pushf
-       andl    $0xffff, %ebx
-       andl    $0xffff, %ecx
-       andl    $0xffff, %edx
-       andl    $0xffff, %edi
+       pop     %ax
+       movw    %ax, LOCAL(bios_register_flags)
+       mov     %es, %ax
+       movw    %ax, LOCAL(bios_register_es)
 
-       shll    $16, %eax
-       orl     %eax, %ecx
+       DATA32  call    real_to_prot
+       .code32
 
-       movw    %ds, %ax
-       shll    $16, %eax
-       orl     %eax, %edx
+       popl    %eax
 
-       pop     %ax
-       shll    $16, %eax
-       orl     %eax, %edi
+       movl    %ebx, 12(%eax)
+       movl    %ecx, 16(%eax)
+       movl    %edi, 20(%eax)
+       movl    %esi, 24(%eax)
+       movl    %edx, 28(%eax)
 
-       DATA32  call    real_to_prot
-       .code32
-       pushl    %esi
-       movl     4(%esp), %esi
-       movl     %ebx, 0(%esi)
-       movl     %ecx, 4(%esi)
-       movl     %edx, 8(%esi)
-       movl     %edi, 12(%esi)
-       popl     %eax
-       movw     %ax, 16(%esi)
-       popl     %eax
-       popl     %ebx
-       popl     %edi
-       popl     %esi
-       popl     %ebp
+       movl     %eax, %edx
+
+       movl     LOCAL(bios_register_eax), %eax
+       movl     %eax, (%edx)
+       movw     LOCAL(bios_register_es), %ax
+       movw     %ax, 4(%edx)
+       movw     LOCAL(bios_register_ds), %ax
+       movw     %ax, 6(%edx)
+       movw     LOCAL(bios_register_flags), %ax
+       movw     %ax, 8(%edx)
+
+       popl    %eax
+       popl    %ecx
+       popl    %ebp
        ret