+2012-02-05 Vladimir Serbinenko <phcoder@gmail.com>
+
+ * grub-core/lib/i386/relocator16.S (grub_relocator16_start): Move switch
+ to real mode down to execute A20-related code in protected mode as
+ intended.
+
2012-02-05 Grégoire Sutre <gregoire.sutre@gmail.com>
* grub-core/disk/diskfilter.c (grub_diskfilter_make_raid): Return
andl $(~GRUB_MEMORY_CPU_CR4_PAE_ON), %eax
movl %eax, %cr4
- /* Update other registers. */
- movl $PSEUDO_REAL_DSEG, %eax
- movl %eax, %ds
- movl %eax, %es
- movl %eax, %fs
- movl %eax, %gs
- movl %eax, %ss
-
- movl %esi, %eax
- shrl $4, %eax
- movw %ax, (LOCAL (segment) - LOCAL (base)) (%esi, 1)
-
- /* jump to a 16 bit segment */
- ljmp $PSEUDO_REAL_CSEG, $(LOCAL (cont2) - LOCAL(base))
-LOCAL(cont2):
- .code16
-
- /* clear the PE bit of CR0 */
- movl %cr0, %eax
- andl $(~GRUB_MEMORY_CPU_CR0_PE_ON), %eax
- movl %eax, %cr0
-
- /* flush prefetch queue, reload %cs */
- /* ljmp */
- .byte 0xea
- .word LOCAL(cont3)-LOCAL(base)
-LOCAL(segment):
- .word 0
-
-LOCAL(cont3):
-
/* movw imm16, %ax. */
.byte 0xb8
VARIABLE(grub_relocator16_keep_a20_enabled)
ret
LOCAL(gate_a20_done):
+ /* Update other registers. */
+ movl $PSEUDO_REAL_DSEG, %eax
+ movl %eax, %ds
+ movl %eax, %es
+ movl %eax, %fs
+ movl %eax, %gs
+ movl %eax, %ss
+
+ movl %esi, %eax
+ shrl $4, %eax
+ movw %ax, (LOCAL (segment) - LOCAL (base)) (%esi, 1)
+
+ /* jump to a 16 bit segment */
+ ljmp $PSEUDO_REAL_CSEG, $(LOCAL (cont2) - LOCAL(base))
+LOCAL(cont2):
+ .code16
+
+ /* clear the PE bit of CR0 */
+ movl %cr0, %eax
+ andl $(~GRUB_MEMORY_CPU_CR0_PE_ON), %eax
+ movl %eax, %cr0
+
+ /* flush prefetch queue, reload %cs */
+ /* ljmp */
+ .byte 0xea
+ .word LOCAL(cont3)-LOCAL(base)
+LOCAL(segment):
+ .word 0
+
+LOCAL(cont3):
+
/* we are in real mode now
* set up the real mode segment registers : DS, SS, ES
*/