* include/grub/i386/pc/int.h (grub_i386_idt): New struct.
(grub_realidt): New var.
* grub-core/lib/i386/relocator16.S (grub_relocator16_idt): New variable
Load idt.
* grub-core/lib/i386/relocator.c (grub_relocator16_idt):
New declaration.
(grub_relocator16_boot): Set grub_relocator16_idt.
* grub-core/kern/i386/realmode.S (realidt): Renamed to ...
(LOCAL(realidt)): ... this.
* grub-core/boot/i386/pc/startup_raw.S: Pass pointer to realidt in eax.
* grub-core/kern/i386/pc/startup.S: Save pointer to realidt.
(grub_realidt): New variable.
+2012-02-26 Vladimir Serbinenko <phcoder@gmail.com>
+
+ Fix interrupt mixup from previous commit.
+
+ * include/grub/i386/pc/int.h (grub_i386_idt): New struct.
+ (grub_realidt): New var.
+ * grub-core/lib/i386/relocator16.S (grub_relocator16_idt): New variable
+ Load idt.
+ * grub-core/lib/i386/relocator.c (grub_relocator16_idt):
+ New declaration.
+ (grub_relocator16_boot): Set grub_relocator16_idt.
+ * grub-core/kern/i386/realmode.S (realidt): Renamed to ...
+ (LOCAL(realidt)): ... this.
+ * grub-core/boot/i386/pc/startup_raw.S: Pass pointer to realidt in eax.
+ * grub-core/kern/i386/pc/startup.S: Save pointer to realidt.
+ (grub_realidt): New variable.
+
2012-02-26 Vladimir Serbinenko <phcoder@gmail.com>
* grub-core/lib/i386/backtrace.c (grub_cmd_backtrace): Move from ...
movl LOCAL(boot_dev), %edx
movl $prot_to_real, %edi
movl $real_to_prot, %ecx
+ movl $LOCAL(realidt), %eax
jmp *%esi
#ifdef ENABLE_LZMA
movl %ecx, (LOCAL(real_to_prot_addr) - _start) (%esi)
movl %edi, (LOCAL(prot_to_real_addr) - _start) (%esi)
+ movl %eax, (EXT_C(grub_realidt) - _start) (%esi)
/* copy back the decompressed part (except the modules) */
movl $(_edata - _start), %ecx
#include "../int.S"
+VARIABLE(grub_realidt)
+ .long 0
+
.bss
VARIABLE(grub_boot_device)
.long 0
gdtdesc:
.word 0x27 /* limit */
.long gdt /* addr */
-realidt:
+LOCAL(realidt):
.word 0
.long 0
protidt:
/* zero %eax */
xorl %eax, %eax
- sidt realidt
+ sidt LOCAL(realidt)
lidt protidt
/* return on the old (or initialized) stack! */
lgdt gdtdesc
sidt protidt
- lidt realidt
+ lidt LOCAL(realidt)
/* save the protected mode stack */
movl %esp, %eax
#include <grub/i386/relocator.h>
#include <grub/relocator_private.h>
#include <grub/i386/relocator_private.h>
+#include <grub/i386/pc/int.h>
extern grub_uint8_t grub_relocator_forward_start;
extern grub_uint8_t grub_relocator_forward_end;
extern grub_uint64_t grub_relocator64_rsp;
extern grub_uint64_t grub_relocator64_rsi;
extern grub_addr_t grub_relocator64_cr3;
+extern struct grub_i386_idt grub_relocator16_idt;
#define RELOCATOR_SIZEOF(x) (&grub_relocator##x##_end - &grub_relocator##x##_start)
grub_relocator16_ebx = state.ebx;
grub_relocator16_edx = state.edx;
grub_relocator16_esi = state.esi;
+#ifdef GRUB_MACHINE_PCBIOS
+ grub_relocator16_idt = *grub_realidt;
+#else
+ grub_relocator16_idt.base = 0;
+ grub_relocator16_idt.limit = 0;
+#endif
grub_relocator16_keep_a20_enabled = state.a20;
movl %esi, %eax
shrl $4, %eax
movw %ax, (LOCAL (segment) - LOCAL (base)) (%esi, 1)
+
+ lidt (EXT_C(grub_relocator16_idt) - LOCAL (base)) (%esi, 1)
/* jump to a 16 bit segment */
ljmp $PSEUDO_REAL_CSEG, $(LOCAL (cont2) - LOCAL(base))
.byte 0, 0x92, 0, 0
LOCAL(gdt_end):
+VARIABLE(grub_relocator16_idt)
+ .word 0
+ .long 0
VARIABLE(grub_relocator16_end)
#define GRUB_CPU_INT_FLAGS_DEFAULT 0
#endif
-
void EXPORT_FUNC (grub_bios_interrupt) (grub_uint8_t intno,
struct grub_bios_int_registers *regs);
+struct grub_i386_idt
+{
+ grub_uint16_t limit;
+ grub_uint32_t base;
+} __attribute__ ((packed));
+
+#ifdef GRUB_MACHINE_PCBIOS
+extern struct grub_i386_idt *EXPORT_VAR(grub_realidt);
+#endif
#endif