Hi Graeme, On Sun, Jan 1, 2012 at 8:09 PM, Graeme Russ <graeme.r...@gmail.com> wrote: > > Signed-off-by: Graeme Russ <graeme.r...@gmail.com>
Acked-by: Simon Glass <s...@chromium.org> Thanks for the x86 assembler lesson :-) Regards, Simon > --- > arch/x86/lib/bios.S | 134 +++++++++++++++++++++++++-------------- > arch/x86/lib/realmode_switch.S | 61 +++++++++++-------- > 2 files changed, 122 insertions(+), 73 deletions(-) > > diff --git a/arch/x86/lib/bios.S b/arch/x86/lib/bios.S > index ce8deb5..239aaa9 100644 > --- a/arch/x86/lib/bios.S > +++ b/arch/x86/lib/bios.S > @@ -246,11 +246,9 @@ rm_int1f: > rm_def_int: > iret > > - > /* > - * All interrupt jumptable entries jump to here > - * after pushing the interrupt vector number onto the > - * stack. > + * All interrupt jumptable entries jump to here after pushing the > + * interrupt vector number onto the stack. > */ > any_interrupt16: > MAKE_BIOS_STACK > @@ -272,7 +270,8 @@ gs movw OFFS_VECTOR(%bp), %ax > je Lint_1ah > movw $0xffff, %ax > jmp Lout > -Lint_10h: /* VGA BIOS services */ > +Lint_10h: > + /* VGA BIOS services */ > call bios_10h > jmp Lout > Lint_11h: > @@ -281,35 +280,42 @@ Lint_11h: > Lint_12h: > call bios_12h > jmp Lout > -Lint_13h: /* BIOS disk services */ > +Lint_13h: > + /* BIOS disk services */ > call bios_13h > jmp Lout > -Lint_15h: /* Misc. BIOS services */ > +Lint_15h: > + /* Misc. BIOS services */ > call bios_15h > jmp Lout > -Lint_16h: /* keyboard services */ > +Lint_16h: > + /* keyboard services */ > call bios_16h > jmp Lout > -Lint_1ah: /* PCI bios */ > +Lint_1ah: > + /* PCI bios */ > call bios_1ah > jmp Lout > Lout: > cmpw $0, %ax > je Lhandeled > > - /* Insert code for unhandeled INTs here. > + /* > + * Insert code for unhandeled INTs here. > * > - * ROLO prints a message to the console > - * (we could do that but then we're in 16bit mode > - * so we'll have to get back into 32bit mode > - * to use the console I/O routines (if we do this > - * we shuls make int 0x10 and int 0x16 work as well)) > + * ROLO prints a message to the console we could do that but then > + * we're in 16bit mode so we'll have to get back into 32bit mode > + * to use the console I/O routines (if we do this we should make > + * int 0x10 and int 0x16 work as well) > */ > Lhandeled: > RESTORE_CALLERS_STACK > - addw $2,%sp /* dump vector number */ > - iret /* return from interrupt */ > > + /* dump vector number */ > + addw $2,%sp > + > + /* return from interrupt */ > + iret > > /* > ************************************************************ > @@ -327,22 +333,24 @@ gs movw OFFS_AX(%bp), %ax > je Lvid_cfg > movw $0xffff, %ax > ret > -Lcur_pos: /* Read Cursor Position and > Size */ > +Lcur_pos: > + /* Read Cursor Position and Size */ > gs movw $0, OFFS_CX(%bp) > gs movw $0, OFFS_DX(%bp) > xorw %ax, %ax > ret > -Lvid_state: /* Get Video State */ > -gs movw $(80 << 8|0x03), OFFS_AX(%bp) /* 80 columns, 80x25, 16 > colors */ > +Lvid_state: > + /* Get Video State - 80 columns, 80x25, 16 colors */ > +gs movw $(80 << 8|0x03), OFFS_AX(%bp) > gs movw $0, OFFS_BX(%bp) > xorw %ax, %ax > ret > -Lvid_cfg: /* Video Subsystem Configuration (EGA/VGA) */ > -gs movw $0x10, OFFS_BX(%bp) /* indicate CGA/MDA/HGA */ > +Lvid_cfg: > + /* Video Subsystem Configuration (EGA/VGA) - indicate CGA/MDA/HGA */ > +gs movw $0x10, OFFS_BX(%bp) > xorw %ax, %ax > ret > > - > /* > ************************************************************ > * BIOS interrupt 11h -- Equipment determination > @@ -355,7 +363,6 @@ gs movw %ax, OFFS_AX(%bp) > xorw %ax, %ax > ret > > - > /* > ************************************************************ > * BIOS interrupt 12h -- Get Memory Size > @@ -370,16 +377,18 @@ cs movw ram_in_64kb_chunks, %ax > b12_more_than_640k: > movw $0x280, %ax > b12_return: > -gs movw %ax, OFFS_AX(%bp) /* return number of kilobytes > in ax */ > + /* return number of kilobytes in ax */ > +gs movw %ax, OFFS_AX(%bp) > > gs movw OFFS_FLAGS(%bp), %ax > - andw $0xfffe, %ax /* clear carry -- function > succeeded */ > + > + /* clear carry -- function succeeded */ > + andw $0xfffe, %ax > gs movw %ax, OFFS_FLAGS(%bp) > > xorw %ax, %ax > ret > > - > /* > ************************************************************ > * BIOS interrupt 13h -- Disk services > @@ -394,12 +403,13 @@ gs movw OFFS_AX(%bp), %ax > ret > Lfunc_15h: > gs movw OFFS_AX(%bp), %ax > - andw $0xff, %ax /* return AH=0->drive not > present */ > + > + /* return AH=0->drive not present */ > + andw $0x00ff, %ax > gs movw %ax, OFFS_AX(%bp) > xorw %ax, %ax > ret > > - > /* > *********************************************************** > * BIOS interrupt 15h -- Miscellaneous services > @@ -417,9 +427,12 @@ gs movw OFFS_AX(%bp), %ax > movw $0xffff, %ax > ret > > -Lfunc_c0h: /* Return System > Configuration Parameters (PS2 only) */ > +Lfunc_c0h: > + /* Return System Configuration Parameters (PS2 only) */ > gs movw OFFS_FLAGS(%bp), %ax > - orw $1, %ax /* return carry -- function > not supported */ > + > + /* return carry -- function not supported */ > + orw $1, %ax > gs movw %ax, OFFS_FLAGS(%bp) > xorw %ax, %ax > ret > @@ -430,38 +443,56 @@ gs movw OFFS_AX(%bp), %ax > cmpw $1, %ax > je Lfunc_e801h > gs movw OFFS_FLAGS(%bp), %ax > - orw $1, %ax /* return carry -- function > not supported */ > + > + /* return carry -- function not supported */ > + orw $1, %ax > gs movw %ax, OFFS_FLAGS(%bp) > xorw %ax, %ax > ret > > -Lfunc_e801h: /* Get memory size for >64M > Configurations */ > +Lfunc_e801h: > + /* Get memory size for >64M Configurations */ > cs movw ram_in_64kb_chunks, %ax > cmpw $0x100, %ax > ja e801_more_than_16mb > - shlw $6, %ax /* multiply by 64 */ > - subw $0x400, %ax /* 1st meg does not count */ > > -gs movw %ax, OFFS_AX(%bp) /* return memory size between > 1M and 16M in 1kb chunks in AX and CX */ > + /* multiply by 64 */ > + shlw $6, %ax > + > + /* 1st meg does not count */ > + subw $0x400, %ax > + > + /* return memory size between 1M and 16M in 1kb chunks in AX and CX */ > +gs movw %ax, OFFS_AX(%bp) > gs movw %ax, OFFS_CX(%bp) > -gs movw $0, OFFS_BX(%bp) /* set BX and DX to 0*/ > + > + /* set BX and DX to 0*/ > +gs movw $0, OFFS_BX(%bp) > gs movw $0, OFFS_DX(%bp) > gs movw OFFS_FLAGS(%bp), %ax > - andw $0xfffe, %ax /* clear carry -- function > succeeded */ > + > + /* clear carry -- function succeeded */ > + andw $0xfffe, %ax > gs movw %ax, OFFS_FLAGS(%bp) > xorw %ax, %ax > ret > > e801_more_than_16mb: > - subw $0x100, %ax /* subtract 16MB */ > + /* subtract 16MB */ > + subw $0x100, %ax > > -gs movw $0x3c00, OFFS_AX(%bp) /* return 0x3c00 (16MB-1MB) > in AX and CX */ > + /* return 0x3c00 (16MB-1MB) in AX and CX */ > +gs movw $0x3c00, OFFS_AX(%bp) > gs movw $0x3c00, OFFS_CX(%bp) > -gs movw %ax, OFFS_BX(%bp) /* set BX and DX to number of > 64kb chunks above 16MB */ > + > + /* set BX and DX to number of 64kb chunks above 16MB */ > +gs movw %ax, OFFS_BX(%bp) > gs movw %ax, OFFS_DX(%bp) > > gs movw OFFS_FLAGS(%bp), %ax > - andw $0xfffe, %ax /* clear carry -- function > succeeded */ > + > + /* clear carry -- function succeeded */ > + andw $0xfffe, %ax > gs movw %ax, OFFS_FLAGS(%bp) > xorw %ax, %ax > ret > @@ -473,18 +504,22 @@ cs movw ram_in_64kb_chunks, %ax > movw $0x100, %ax > b88_not_more_than16: > shlw $6, %ax > - subw $0x400, %ax /* 1st meg does not count */ > > -gs movw %ax, OFFS_AX(%bp) /* return number of kilobytes > between 16MB and 16MB in ax */ > + /* 1st meg does not count */ > + subw $0x400, %ax > + > + /* return number of kilobytes between 16MB and 16MB in ax */ > +gs movw %ax, OFFS_AX(%bp) > > gs movw OFFS_FLAGS(%bp), %ax > - andw $0xfffe, %ax /* clear carry -- function > succeeded */ > + > + /* clear carry -- function succeeded */ > + andw $0xfffe, %ax > gs movw %ax, OFFS_FLAGS(%bp) > > xorw %ax, %ax > ret > > - > /* > ************************************************************ > * BIOS interrupt 16h -- keyboard services > @@ -498,7 +533,8 @@ gs movw OFFS_AX(%bp), %ax > movw $0xffff, %ax > ret > Lfunc_03h: > - xorw %ax, %ax /* do nothing -- function not > supported */ > + /* do nothing -- function not supported */ > + xorw %ax, %ax > ret > > /* > @@ -514,7 +550,9 @@ gs movw OFFS_AX(%bp), %ax > ret > Lfunc_b1h: > call realmode_pci_bios > - xorw %ax, %ax /* do nothing -- function not > supported */ > + > + /* do nothing -- function not supported */ > + xorw %ax, %ax > ret > > > diff --git a/arch/x86/lib/realmode_switch.S b/arch/x86/lib/realmode_switch.S > index 7ee709a..c4c4c43 100644 > --- a/arch/x86/lib/realmode_switch.S > +++ b/arch/x86/lib/realmode_switch.S > @@ -44,12 +44,13 @@ > * e40 ss; > */ > > -#define a32 .byte 0x67; /* address size prefix 32 */ > -#define o32 .byte 0x66; /* operand size prefix 32 */ > +#define a32 .byte 0x67; /* address size prefix 32 */ > +#define o32 .byte 0x66; /* operand size prefix 32 */ > > .section .realmode, "ax" > .code16 > - /* 16bit protected mode code > here */ > + > + /* 16bit protected mode code here */ > .globl realmode_enter > realmode_enter: > o32 pusha > @@ -69,20 +70,23 @@ o32 pushf > movw %ax, %gs > > lidt realmode_idt_ptr > - movl %cr0, %eax /* Go back into real mode by > */ > - andl $0x7ffffffe, %eax /* clearing PE to 0 */ > + /* Go back into real mode by clearing PE to 0 */ > + movl %cr0, %eax > + andl $0x7ffffffe, %eax > movl %eax, %cr0 > - ljmp $0x0,$do_realmode /* switch to real mode */ > > -do_realmode: /* realmode code from here */ > + /* switch to real mode */ > + ljmp $0x0,$do_realmode > + > +do_realmode: > + /* realmode code from here */ > movw %cs,%ax > movw %ax,%ds > movw %ax,%es > movw %ax,%fs > movw %ax,%gs > > - /* create a temporary stack */ > - > + /* create a temporary stack */ > movw $0xc0, %ax > movw %ax, %ss > movw $0x200, %ax > @@ -114,26 +118,29 @@ o32 popf > popw %ss > movl %eax, %esp > cs movl temp_eax, %eax > - wbinvd /* self-modifying code, > - * better flush the cache */ > + > + /* self-modifying code, better flush the cache */ > + wbinvd > > .byte 0x9a /* lcall */ > temp_ip: > .word 0 /* new ip */ > temp_cs: > .word 0 /* new cs */ > + > realmode_ret: > - /* save eax, esp and ss */ > + /* save eax, esp and ss */ > cs movl %eax, saved_eax > movl %esp, %eax > cs movl %eax, saved_esp > movw %ss, %ax > cs movw %ax, saved_ss > > - /* restore the stack, note that we set sp to 0x244; > + /* > + * restore the stack, note that we set sp to 0x244; > * pt_regs is 0x44 bytes long and we push the structure > - * backwards on to the stack, bottom first */ > - > + * backwards on to the stack, bottom first > + */ > movw $0xc0, %ax > movw %ax, %ss > movw $0x244, %ax > @@ -169,12 +176,15 @@ cs movw temp_ip, %ax > pushl %ebx > > o32 cs lidt saved_idt > -o32 cs lgdt saved_gdt /* Set GDTR */ > +o32 cs lgdt saved_gdt > > - movl %cr0, %eax /* Go back into protected > mode */ > - orl $1,%eax /* reset PE to 1 */ > + /* Go back into protected mode reset PE to 1 */ > + movl %cr0, %eax > + orl $1,%eax > movl %eax, %cr0 > - jmp next_line /* flush prefetch queue */ > + > + /* flush prefetch queue */ > + jmp next_line > next_line: > movw $return_ptr, %ax > movw %ax,%bp > @@ -182,12 +192,13 @@ o32 cs ljmp *(%bp) > > .code32 > protected_mode: > - movl $0x18,%eax /* reload GDT[3] */ > - movw %ax,%fs /* reset FS */ > - movw %ax,%ds /* reset DS */ > - movw %ax,%gs /* reset GS */ > - movw %ax,%es /* reset ES */ > - movw %ax,%ss /* reset SS */ > + /* Reload segment registers */ > + movl $0x18, %eax > + movw %ax, %fs > + movw %ax, %ds > + movw %ax, %gs > + movw %ax, %es > + movw %ax, %ss > movl saved_protected_mode_esp, %eax > movl %eax, %esp > popf > -- > 1.7.5.2.317.g391b14 > > _______________________________________________ > U-Boot mailing list > U-Boot@lists.denx.de > http://lists.denx.de/mailman/listinfo/u-boot _______________________________________________ U-Boot mailing list U-Boot@lists.denx.de http://lists.denx.de/mailman/listinfo/u-boot