summaryrefslogtreecommitdiff
path: root/arch/x86/lib
diff options
context:
space:
mode:
Diffstat (limited to 'arch/x86/lib')
-rw-r--r--arch/x86/lib/bios.S134
-rw-r--r--arch/x86/lib/realmode_switch.S61
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