summaryrefslogtreecommitdiff
path: root/purgatory/arch/i386/linux-entry16.S
diff options
context:
space:
mode:
Diffstat (limited to 'purgatory/arch/i386/linux-entry16.S')
-rw-r--r--purgatory/arch/i386/linux-entry16.S623
1 files changed, 0 insertions, 623 deletions
diff --git a/purgatory/arch/i386/linux-entry16.S b/purgatory/arch/i386/linux-entry16.S
deleted file mode 100644
index 7ab0b2a..0000000
--- a/purgatory/arch/i386/linux-entry16.S
+++ /dev/null
@@ -1,623 +0,0 @@
-/*
- * kexec: Linux boots Linux
- *
- * Copyright (C) 2003,2004 Eric Biederman (ebiederm@xmission.com)
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation (version 2 of the License).
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
- */
-
-#if 1
-#define TTYS0_BASE 0x3f8
-#define TTYS0_RBR (TTYS0_BASE+0x00)
-#define TTYS0_TBR TTYS0_RBR
-#define TTYS0_LSR (TTYS0_BASE+0x05)
-
-
- /* uses: ax, dx */
-#define TTYS0_TX_AL \
- mov %al, %ah ; \
-9: mov $TTYS0_LSR, %dx ; \
- inb %dx, %al ; \
- test $0x20, %al ; \
- je 9b ; \
- mov $TTYS0_TBR, %dx ; \
- mov %ah, %al ; \
- outb %al, %dx ; \
-9: mov $TTYS0_LSR, %dx ; \
- inb %dx, %al ; \
- test $0x40, %al ; \
- jz 9b
-
-
-
- /* uses: ax, dx */
-#define TTYS0_TX_CHAR(byte) \
- mov byte, %al ; \
- TTYS0_TX_AL
-
- /* uses: ax, dx */
-#define TTYS0_TX_HEX32(lword) \
- mov lword, %eax ; \
- shr $28, %eax ; \
- add $'0', %al ; \
- cmp $'9', %al ; \
- jle 9f ; \
- add $39, %al ; \
-9: ; \
- TTYS0_TX_AL ; \
- ; \
- mov lword, %eax ; \
- shr $24, %eax ; \
- and $0x0f, %al ; \
- add $'0', %al ; \
- cmp $'9', %al ; \
- jle 9f ; \
- add $39, %al ; \
-9: ; \
- TTYS0_TX_AL ; \
- ; \
- mov lword, %eax ; \
- shr $20, %eax ; \
- and $0x0f, %al ; \
- add $'0', %al ; \
- cmp $'9', %al ; \
- jle 9f ; \
- add $39, %al ; \
-9: ; \
- TTYS0_TX_AL ; \
- ; \
- mov lword, %eax ; \
- shr $16, %eax ; \
- and $0x0f, %al ; \
- add $'0', %al ; \
- cmp $'9', %al ; \
- jle 9f ; \
- add $39, %al ; \
-9: ; \
- TTYS0_TX_AL ; \
- ; \
- mov lword, %eax ; \
- shr $12, %eax ; \
- and $0x0f, %al ; \
- add $'0', %al ; \
- cmp $'9', %al ; \
- jle 9f ; \
- add $39, %al ; \
-9: ; \
- TTYS0_TX_AL ; \
- ; \
- mov lword, %eax ; \
- shr $8, %eax ; \
- and $0x0f, %al ; \
- add $'0', %al ; \
- cmp $'9', %al ; \
- jle 9f ; \
- add $39, %al ; \
-9: ; \
- TTYS0_TX_AL ; \
- ; \
- mov lword, %eax ; \
- shr $4, %eax ; \
- and $0x0f, %al ; \
- add $'0', %al ; \
- cmp $'9', %al ; \
- jle 9f ; \
- add $39, %al ; \
-9: ; \
- TTYS0_TX_AL ; \
- ; \
- mov lword, %eax ; \
- and $0x0f, %al ; \
- add $'0', %al ; \
- cmp $'9', %al ; \
- jle 9f ; \
- add $39, %al ; \
-9: ; \
- TTYS0_TX_AL
-
-
-#define DEBUG_CHAR(x) TTYS0_TX_CHAR($x) ; TTYS0_TX_CHAR($'\r') ; TTYS0_TX_CHAR($'\n')
-#define DEBUG_TX_HEX32(x) TTYS0_TX_HEX32(x) ; TTYS0_TX_CHAR($'\r') ; TTYS0_TX_CHAR($'\n')
-#else
-#define DEBUG_CHAR(x)
-#define DEBUG_TX_HEX32(x)
-#endif
-
-#undef i386
- .text
- .globl entry16, entry16_regs
- .arch i386
- .balign 16
-entry16:
- .code32
-
-DEBUG_CHAR('a')
- /* Setup the classic BIOS interrupt table at 0x0 */
- lidt idtptr
-
-DEBUG_CHAR('b')
- /* Provide us with 16bit segments that we can use */
- lgdt gdt
-
-DEBUG_CHAR('c')
- /* Note we don't disable the a20 line, (this shouldn't be required)
- * The code to do it is in kexec_test and it is a real pain.
- * I will worry about that when I need it.
- */
-
- /* Load 16bit data segments, to ensure the segment limits are set */
- movl $0x10, %eax
- movl %eax, %ds
- movl %eax, %es
- movl %eax, %ss
- movl %eax, %fs
- movl %eax, %gs
-
-DEBUG_CHAR('d')
-
- /* switch to 16bit mode */
- ljmp $0x08, $1f - entry16
-1:
- .code16
-DEBUG_CHAR('e')
- /* Disable Paging and protected mode */
- /* clear the PG & PE bits of CR0 */
- movl %cr0,%eax
- andl $~((1 << 31)|(1<<0)),%eax
- movl %eax,%cr0
-
-DEBUG_CHAR('f')
- /* make intersegment jmp to flush the processor pipeline
- * and reload %cs:%eip (to clear upper 16 bits of %eip).
- */
- ljmp *(realptr - entry16)
-3:
-DEBUG_CHAR('g')
- /* we are in real mode now
- * set up the real mode segment registers : %ds, $ss, %es
- */
- /* Setup the data segment */
- movw %cs, %ax
- movw %ax, %ds
-
-DEBUG_CHAR('h')
- /* Load the registers */
- movl eax - entry16, %eax
- movl ebx - entry16, %ebx
- movl ecx - entry16, %ecx
- movl edx - entry16, %edx
- movl esi - entry16, %esi
- movl edi - entry16, %esi
- movl esp - entry16, %esp
- movl ebp - entry16, %ebp
- movw es - entry16, %es
- movw ss - entry16, %ss
- movw fs - entry16, %fs
- movw gs - entry16, %gs
- movw ds - entry16, %ds
-
- /* Jump to the kernel entrypoint */
- ljmp %cs:*(realdest - entry16)
-
- .balign 4
-entry16_regs:
-eax: .long 0x00000000
-ebx: .long 0x00000000
-ecx: .long 0x00000000
-edx: .long 0x00000000
-esi: .long 0x00000000
-edi: .long 0x00000000
-esp: .long 0x00000000
-ebp: .long 0x00000000
-ds: .word 0x0000
-es: .word 0x0000
-ss: .word 0x0000
-fs: .word 0x0000
-gs: .word 0x0000
-realdest:
-ip: .word 0x0000
-cs: .word 0x0000
- .size entry16_regs, . - entry16_regs
-
- .balign 16
-realptr:
- .word 3b - entry16
- .word 0x0000
-
- .data
- .balign 4
-
-idtptr:
- /* 256 entry idt at 0 */
- .word 0x400 - 1
- .word 0, 0
-
-gdt:
- /* 0x00 unusable segment so used as the gdt ptr */
- .word gdt_end - gdt - 1
- .long gdt
- .word 0
-
- /* 0x08 16 bit real mode code segment */
- .word 0xffff, 0x0000
- .byte 0x00, 0x9b, 0x00, 0x00
-
- /* 0x10 16 bit real mode data segment */
- .word 0xffff, 0x0000
- .byte 0x00, 0x93, 0x00, 0x00
-gdt_end:
-/*
- * kexec: Linux boots Linux
- *
- * Copyright (C) 2003,2004 Eric Biederman (ebiederm@xmission.com)
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation (version 2 of the License).
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
- */
-
-#if 1
-#define TTYS0_BASE 0x3f8
-#define TTYS0_RBR (TTYS0_BASE+0x00)
-#define TTYS0_TBR TTYS0_RBR
-#define TTYS0_LSR (TTYS0_BASE+0x05)
-
-
- /* uses: ax, dx */
-#define TTYS0_TX_AL \
- mov %al, %ah ; \
-9: mov $TTYS0_LSR, %dx ; \
- inb %dx, %al ; \
- test $0x20, %al ; \
- je 9b ; \
- mov $TTYS0_TBR, %dx ; \
- mov %ah, %al ; \
- outb %al, %dx ; \
-9: mov $TTYS0_LSR, %dx ; \
- inb %dx, %al ; \
- test $0x40, %al ; \
- jz 9b
-
-
-
- /* uses: ax, dx */
-#define TTYS0_TX_CHAR(byte) \
- mov byte, %al ; \
- TTYS0_TX_AL
-
- /* uses: ax, dx */
-#define TTYS0_TX_HEX32(lword) \
- mov lword, %eax ; \
- shr $28, %eax ; \
- add $'0', %al ; \
- cmp $'9', %al ; \
- jle 9f ; \
- add $39, %al ; \
-9: ; \
- TTYS0_TX_AL ; \
- ; \
- mov lword, %eax ; \
- shr $24, %eax ; \
- and $0x0f, %al ; \
- add $'0', %al ; \
- cmp $'9', %al ; \
- jle 9f ; \
- add $39, %al ; \
-9: ; \
- TTYS0_TX_AL ; \
- ; \
- mov lword, %eax ; \
- shr $20, %eax ; \
- and $0x0f, %al ; \
- add $'0', %al ; \
- cmp $'9', %al ; \
- jle 9f ; \
- add $39, %al ; \
-9: ; \
- TTYS0_TX_AL ; \
- ; \
- mov lword, %eax ; \
- shr $16, %eax ; \
- and $0x0f, %al ; \
- add $'0', %al ; \
- cmp $'9', %al ; \
- jle 9f ; \
- add $39, %al ; \
-9: ; \
- TTYS0_TX_AL ; \
- ; \
- mov lword, %eax ; \
- shr $12, %eax ; \
- and $0x0f, %al ; \
- add $'0', %al ; \
- cmp $'9', %al ; \
- jle 9f ; \
- add $39, %al ; \
-9: ; \
- TTYS0_TX_AL ; \
- ; \
- mov lword, %eax ; \
- shr $8, %eax ; \
- and $0x0f, %al ; \
- add $'0', %al ; \
- cmp $'9', %al ; \
- jle 9f ; \
- add $39, %al ; \
-9: ; \
- TTYS0_TX_AL ; \
- ; \
- mov lword, %eax ; \
- shr $4, %eax ; \
- and $0x0f, %al ; \
- add $'0', %al ; \
- cmp $'9', %al ; \
- jle 9f ; \
- add $39, %al ; \
-9: ; \
- TTYS0_TX_AL ; \
- ; \
- mov lword, %eax ; \
- and $0x0f, %al ; \
- add $'0', %al ; \
- cmp $'9', %al ; \
- jle 9f ; \
- add $39, %al ; \
-9: ; \
- TTYS0_TX_AL
-
-
-#define DEBUG_CHAR(x) TTYS0_TX_CHAR($x) ; TTYS0_TX_CHAR($'\r') ; TTYS0_TX_CHAR($'\n')
-#define DEBUG_TX_HEX32(x) TTYS0_TX_HEX32(x) ; TTYS0_TX_CHAR($'\r') ; TTYS0_TX_CHAR($'\n')
-#else
-#define DEBUG_CHAR(x)
-#define DEBUG_TX_HEX32(x)
-#endif
-
-.data
- .globl setup16_debug_start, setup16_debug_end, setup16_debug_size, setup16_debug_align
- .globl setup16_debug_regs
- .globl setup16_debug_kernel_pre_protected
- .globl setup16_debug_first_code32
- .globl setup16_debug_old_code32
-setup16_debug_start:
-_reloc = .
- .balign 16
- .code32
-DEBUG_CHAR('a')
- /* Compute where I am running at */
- call 1f
-1: popl %ebx
- subl $(1b - _reloc), %ebx
-
- /* Remember where I am running at */
- movl %ebx, location - _reloc(%ebx)
-
-DEBUG_CHAR('b')
- /* Fixup my real mode segment */
- movl %ebx, %eax
- shrl $4, %eax
- movw %ax, 2 + realptr - _reloc(%ebx)
-
-DEBUG_CHAR('c')
- /* Fixup the gdt */
- movl %ebx, %eax
- shll $16, %eax
-
- movl %ebx, %ecx
- shrl $16, %ecx
- andl $0xff, %ecx
-
- movl %ebx, %edx
- andl $0xff000000, %edx
- orl %edx, %ecx
-
- addl %ebx, gdtaddr - _reloc(%ebx)
- addl %ebx, debug_gdtaddr - _reloc(%ebx)
- orl %eax, 0x08 + gdt - _reloc(%ebx)
- orl %ecx, 0x0c + gdt - _reloc(%ebx)
- orl %eax, 0x10 + gdt - _reloc(%ebx)
- orl %ecx, 0x14 + gdt - _reloc(%ebx)
-
-
-
-DEBUG_CHAR('d')
- /* Setup the classic BIOS interrupt table at 0x0 */
- lidt idtptr - _reloc(%ebx)
-
- /* Provide us with 16bit segments that we can use */
- lgdt gdtptr - _reloc(%ebx)
-
- /* Note we don't disable the a20 line, (this shouldn't be required)
- * The code to do it is in kexec_test and it is a real pain.
- * I will worry about that when I need it.
- */
-
- /* Load 16bit data segments, to ensure the segment limits are set */
- movl $0x10, %eax
- movl %eax, %ds
- movl %eax, %es
- movl %eax, %ss
- movl %eax, %fs
- movl %eax, %gs
-
- /* switch to 16bit mode */
-
- ljmp $0x08, $2f - _reloc
-2:
- .code16
-DEBUG_CHAR('e')
- /* Disable Paging and protected mode */
- /* clear the PG & PE bits of CR0 */
- movl %cr0,%eax
- andl $~((1 << 31)|(1<<0)),%eax
- movl %eax,%cr0
-
-DEBUG_CHAR('f')
- /* make intersegment jmp to flush the processor pipeline
- * and reload %cs:%eip (to clear upper 16 bits of %eip).
- */
- ljmp *(realptr - _reloc)
-3:
-DEBUG_CHAR('g')
- /* we are in real mode now
- * set up the real mode segment registers : %ds, $ss, %es
- */
- /* Setup the data segment */
- movw %cs, %ax
- movw %ax, %ds
-
-DEBUG_CHAR('h')
- /* Load the registers */
- movl eax - _reloc, %eax
- movl ebx - _reloc, %ebx
- movl ecx - _reloc, %ecx
- movl edx - _reloc, %edx
- movl esi - _reloc, %esi
- movl edi - _reloc, %esi
- movl esp - _reloc, %esp
- movl ebp - _reloc, %ebp
- movw es - _reloc, %es
- movw ss - _reloc, %ss
- movw fs - _reloc, %fs
- movw gs - _reloc, %gs
- movw ds - _reloc, %ds
-
- /* Jump to the kernel entrypoint */
- ljmp %cs:*(realdest - _reloc)
-
-setup16_debug_regs:
-eax: .long 0x00000000
-ebx: .long 0x00000000
-ecx: .long 0x00000000
-edx: .long 0x00000000
-esi: .long 0x00000000
-edi: .long 0x00000000
-esp: .long 0x00000000
-ebp: .long 0x00000000
-ds: .word 0x0000
-es: .word 0x0000
-ss: .word 0x0000
-fs: .word 0x0000
-gs: .word 0x0000
-realdest:
-ip: .word 0x0000
-cs: .word 0x0000
-
- .balign 16
-realptr:
- .word 3b - _reloc
- .word 0x0000
-
-idtptr:
- /* 256 entry idt at 0 */
- .word 0x400 - 1
- .word 0, 0
-
-gdtptr:
- .word gdt_end - gdt - 1
-gdtaddr:
- .long gdt - _reloc
-
-gdt:
- /* dummy */
- .word 0, 0, 0, 0
-
- /* 16 bit real mode code segment */
- .word 0xffff, 0x0000
- .byte 0x00, 0x9b, 0x00, 0x00
-
- /* 16 bit real mode data segment */
- .word 0xffff, 0x0000
- .byte 0x00, 0x93, 0x00, 0x00
-gdt_end:
-
-debug_gdt:
- /* 0x00 */
- .word debug_gdt_end - debug_gdt - 1
-debug_gdtaddr:
- .long debug_gdt - _reloc
- .word 0
-
- /* 0x08 */
- .word 0, 0, 0, 0 /* Nothing in the first gdt entry */
-
- /* 0x10 4Gb - (0x100000*0x1000 = 4Gb), base address = 0, code read/exec, granularity = 4096, 386 */
- .word 0xFFFF, 0x00, 0x9A00, 0x00CF
- /* 0x18 4Gb - (0x100000*0x1000 = 4Gb*), base address = 0, data read/write, granularity = 4096, 386 */
- .word 0xFFFF, 0x0000, 0x9200, 0x00CF
-
-
- /* 0x20 4Gb - (0x100000*0x1000 = 4Gb), base address = 0, code read/exec, granularity = 4096, 386 */
- .word 0xFFFF, 0x00, 0x9A00, 0x00CF
- /* 0x28 4Gb - (0x100000*0x1000 = 4Gb*), base address = 0, data read/write, granularity = 4096, 386 */
- .word 0xFFFF, 0x0000, 0x9200, 0x00CF
-
-
- /* 0x30 4Gb - (0x100000*0x1000 = 4Gb), base address = 0, code read/exec, granularity = 4096, 386 */
- .word 0xFFFF, 0x00, 0x9A00, 0x00CF
- /* 0x38 4Gb - (0x100000*0x1000 = 4Gb*), base address = 0, data read/write, granularity = 4096, 386 */
- .word 0xFFFF, 0x0000, 0x9200, 0x00CF
-
-
- /* 0x40 4Gb - (0x100000*0x1000 = 4Gb), base address = 0, code read/exec, granularity = 4096, 386 */
- .word 0xFFFF, 0x00, 0x9A00, 0x00CF
- /* 0x48 4Gb - (0x100000*0x1000 = 4Gb*), base address = 0, data read/write, granularity = 4096, 386 */
- .word 0xFFFF, 0x0000, 0x9200, 0x00CF
-
-
- /* 0x50 4Gb - (0x100000*0x1000 = 4Gb), base address = 0, code read/exec, granularity = 4096, 386 */
- .word 0xFFFF, 0x00, 0x9A00, 0x00CF
- /* 0x58 4Gb - (0x100000*0x1000 = 4Gb*), base address = 0, data read/write, granularity = 4096, 386 */
- .word 0xFFFF, 0x0000, 0x9200, 0x00CF
-
-
- /* 0x60 4Gb - (0x100000*0x1000 = 4Gb), base address = 0, code read/exec, granularity = 4096, 386 */
- .word 0xFFFF, 0x00, 0x9A00, 0x00CF
- /* 0x68 4Gb - (0x100000*0x1000 = 4Gb*), base address = 0, data read/write, granularity = 4096, 386 */
- .word 0xFFFF, 0x0000, 0x9200, 0x00CF
-debug_gdt_end:
-
-
-setup16_debug_kernel_pre_protected:
- .code16
- DEBUG_CHAR('i')
- cli # no interrupts allowed !
- movb $0x80, %al # disable NMI for bootup
- # sequence
- outb %al, $0x70
- lret
-setup16_debug_first_code32:
- .code32
- .byte 0xbf /* movl $0x12345678, %edi */
-location:
- .long 0x12345678
- DEBUG_CHAR('j')
- .byte 0xb8 /* movl $0x10000, %eax */
-setup16_debug_old_code32:
- .long 0x10000
- jmp %eax
-setup16_debug_end:
-setup16_debug_size:
- .long setup16_debug_end - setup16_debug_start
-setup16_debug_align:
- .long 16