Moved switching to protected mode into stage1 loader, so code above 1MB can be executed in protected mode.
Executing the stage2 loader works now, up to the point where mmu_init() reuses the same address space. git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@19033 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
@@ -1,4 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
|
** Copyright 2004-2005, Axel Dörfler, axeld@pinc-software.de. All rights reserved.
|
||||||
** Copyright 2006, Marcus Overhagen. All rights reserved.
|
** Copyright 2006, Marcus Overhagen. All rights reserved.
|
||||||
** Distributed under the terms of the MIT License.
|
** Distributed under the terms of the MIT License.
|
||||||
*/
|
*/
|
||||||
@@ -49,6 +50,8 @@ _start:
|
|||||||
movw %ax, %ss
|
movw %ax, %ss
|
||||||
movw $0x7c00, %sp
|
movw $0x7c00, %sp
|
||||||
|
|
||||||
|
cld
|
||||||
|
|
||||||
// print start banner
|
// print start banner
|
||||||
movw $startmsg, %si
|
movw $startmsg, %si
|
||||||
call puts
|
call puts
|
||||||
@@ -232,19 +235,19 @@ _start:
|
|||||||
xorl %eax, %eax
|
xorl %eax, %eax
|
||||||
movw s_PXENV_TFTP_OPEN_PacketSize, %ax
|
movw s_PXENV_TFTP_OPEN_PacketSize, %ax
|
||||||
imull $65535, %eax
|
imull $65535, %eax
|
||||||
movl %eax, max_file_size
|
movl %eax, max_fsize
|
||||||
|
|
||||||
// print max file size
|
// print max file size
|
||||||
movw $maxfsize, %si
|
movw $maxfsize, %si
|
||||||
call puts
|
call puts
|
||||||
movl max_file_size, %eax
|
movl max_fsize, %eax
|
||||||
call puthex32
|
call puthex32
|
||||||
movw $crlf, %si
|
movw $crlf, %si
|
||||||
call puts
|
call puts
|
||||||
|
|
||||||
// check if file is small enough
|
// check if file is small enough
|
||||||
movl s_PXENV_TFTP_GET_FSIZE_FileSize, %eax
|
movl s_PXENV_TFTP_GET_FSIZE_FileSize, %eax
|
||||||
movl max_file_size, %ebx
|
movl max_fsize, %ebx
|
||||||
cmpl %ebx, %eax
|
cmpl %ebx, %eax
|
||||||
ja err_etoobig
|
ja err_etoobig
|
||||||
|
|
||||||
@@ -312,8 +315,34 @@ _no_dot:
|
|||||||
// execute
|
// execute
|
||||||
movw $executing, %si
|
movw $executing, %si
|
||||||
call puts
|
call puts
|
||||||
ljmp $load_addr_seg, $load_addr_ofs
|
|
||||||
|
|
||||||
|
cli
|
||||||
|
|
||||||
|
// switch to PM
|
||||||
|
.code32
|
||||||
|
.byte 0x66
|
||||||
|
.byte 0x67
|
||||||
|
lgdt pm_gdt_descriptor
|
||||||
|
.code16
|
||||||
|
|
||||||
|
movl %cr0, %eax
|
||||||
|
orb $0x1, %al
|
||||||
|
movl %eax, %cr0
|
||||||
|
|
||||||
|
.code32
|
||||||
|
.byte 0x66
|
||||||
|
ljmp $0x8, $pm_start
|
||||||
|
pm_start:
|
||||||
|
mov $0x10, %ax
|
||||||
|
mov %ax, %ds
|
||||||
|
mov %ax, %es
|
||||||
|
mov %ax, %fs
|
||||||
|
mov %ax, %gs
|
||||||
|
mov %ax, %ss
|
||||||
|
|
||||||
|
ljmp $0x8, $0x100000
|
||||||
|
|
||||||
|
.code16
|
||||||
stop: hlt
|
stop: hlt
|
||||||
jmp stop
|
jmp stop
|
||||||
|
|
||||||
@@ -400,7 +429,7 @@ go_unreal: pushw %ds
|
|||||||
.code32
|
.code32
|
||||||
.byte 0x66
|
.byte 0x66
|
||||||
.byte 0x67
|
.byte 0x67
|
||||||
lgdt gdt_descriptor
|
lgdt unreal_gdt_descriptor
|
||||||
.code16
|
.code16
|
||||||
movl %cr0, %eax
|
movl %cr0, %eax
|
||||||
orb $1, %al
|
orb $1, %al
|
||||||
@@ -442,23 +471,50 @@ dot: .asciz "."
|
|||||||
crlf: .asciz "\r\n"
|
crlf: .asciz "\r\n"
|
||||||
|
|
||||||
.balign 8
|
.balign 8
|
||||||
gdt:
|
unreal_gdt:
|
||||||
.long 0
|
.long 0
|
||||||
.long 0
|
.long 0
|
||||||
.long 0x0000ffff
|
.long 0x0000ffff
|
||||||
.long 0x00cf9200
|
.long 0x00cf9200
|
||||||
gdt_descriptor:
|
unreal_gdt_descriptor:
|
||||||
.word 0x10
|
.word 0x10
|
||||||
.long gdt
|
.long unreal_gdt
|
||||||
|
|
||||||
.balign 8
|
.balign 8
|
||||||
|
pm_gdt:
|
||||||
|
// null descriptor
|
||||||
|
.long 0
|
||||||
|
.long 0
|
||||||
|
|
||||||
|
// kernel code segment
|
||||||
|
.long 0x0000ffff
|
||||||
|
.long 0x00cf9e00
|
||||||
|
// kernel data and stack segment
|
||||||
|
.long 0x0000ffff
|
||||||
|
.long 0x00cf9200
|
||||||
|
|
||||||
|
// real mode 16 bit code segment
|
||||||
|
.long 0x0000ffff
|
||||||
|
.long 0x00009e01
|
||||||
|
// real mode 16 bit data and stack segment
|
||||||
|
.long 0x0000ffff
|
||||||
|
.long 0x00009201
|
||||||
|
// real mode 16 bit stack segment
|
||||||
|
.long 0x0000ffff
|
||||||
|
.long 0x00009200
|
||||||
|
|
||||||
|
pm_gdt_descriptor:
|
||||||
|
.word 0x2f
|
||||||
|
.long pm_gdt
|
||||||
|
|
||||||
|
|
||||||
|
.balign 8
|
||||||
pxenv_api: .long 0
|
pxenv_api: .long 0
|
||||||
|
|
||||||
client_ip: .long 0
|
client_ip: .long 0
|
||||||
server_ip: .long 0
|
server_ip: .long 0
|
||||||
|
|
||||||
max_file_size: .long 0
|
max_fsize: .long 0
|
||||||
|
|
||||||
pos: .word 0
|
pos: .word 0
|
||||||
|
|
||||||
|
|||||||
@@ -7,46 +7,26 @@
|
|||||||
|
|
||||||
/** This file contains the stage 2 boot loader for the PXE (preboot execution
|
/** This file contains the stage 2 boot loader for the PXE (preboot execution
|
||||||
* environment) image.
|
* environment) image.
|
||||||
* It gets loaded by the PXE stage1 loader to 0xffff:0010 (0x100000), and is
|
* It gets loaded by the PXE stage1 loader to 0xffff:0010 (0x100000), and it
|
||||||
* starts execution in 16 bit real mode. Entry point is at offset 0.
|
* starts execution in 32 bit protected mode. Entry point is at offset 0.
|
||||||
* This code will then switch to protected mode and will directly call
|
* This code will directly call the entry function of the embedded ELF part
|
||||||
* the entry function of the embedded ELF part of the loader.
|
* of the loader.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#define GLOBAL(x) .globl x ; x
|
#define GLOBAL(x) .globl x ; x
|
||||||
|
|
||||||
.text
|
.text
|
||||||
.code16
|
.code32
|
||||||
.org 0
|
.org 0
|
||||||
|
|
||||||
pxe_start:
|
pxe_start:
|
||||||
cli
|
|
||||||
cld
|
|
||||||
|
|
||||||
.code32 // This forces a 32 bit relocation entry
|
|
||||||
.byte 0x66 // that allows linking with others
|
|
||||||
.byte 0x67
|
|
||||||
lgdt gdt_descriptor
|
|
||||||
|
|
||||||
.code16
|
|
||||||
movl %cr0, %eax // set the PE bit of cr0 to switch to protected mode
|
|
||||||
orb $0x1, %al
|
|
||||||
movl %eax, %cr0
|
|
||||||
|
|
||||||
.code32
|
|
||||||
.byte 0x66
|
|
||||||
ljmp $0x8, $_protected_code_segment
|
|
||||||
_protected_code_segment:
|
|
||||||
mov $0x10, %ax // load descriptor 2 in the data and stack segment selectors
|
|
||||||
mov %ax, %ds
|
|
||||||
mov %ax, %es
|
|
||||||
mov %ax, %fs
|
|
||||||
mov %ax, %gs
|
|
||||||
mov %ax, %ss
|
|
||||||
|
|
||||||
mov $0x10000, %ebp // setup new stack
|
mov $0x10000, %ebp // setup new stack
|
||||||
mov %ebp, %esp
|
mov %ebp, %esp
|
||||||
|
|
||||||
|
// stop: hlt
|
||||||
|
// jmp stop
|
||||||
|
|
||||||
call _start
|
call _start
|
||||||
|
|
||||||
//--------------------------------------------------------------
|
//--------------------------------------------------------------
|
||||||
@@ -55,31 +35,8 @@ _protected_code_segment:
|
|||||||
/* global data table */
|
/* global data table */
|
||||||
.balign 8
|
.balign 8
|
||||||
|
|
||||||
gdt:
|
GLOBAL(gBootPartitionOffset):
|
||||||
// null descriptor
|
.long 0xffffffff
|
||||||
.long 0
|
|
||||||
.long 0
|
|
||||||
|
|
||||||
// kernel code segment
|
|
||||||
.long 0x0000ffff // base: 0, limit: 4 GB
|
|
||||||
.long 0x00cf9e00 // type: 32 bit, exec-only conforming, privilege 0
|
|
||||||
// kernel data and stack segment
|
|
||||||
.long 0x0000ffff // base: 0, limit: 4 GB
|
|
||||||
.long 0x00cf9200 // type: 32 bit, data read/write, privilege 0
|
|
||||||
|
|
||||||
// real mode 16 bit code segment
|
|
||||||
.long 0x0000ffff // base: 0x10000, limit: 64 kB
|
|
||||||
.long 0x00009e01
|
|
||||||
// real mode 16 bit data and stack segment
|
|
||||||
.long 0x0000ffff // base: 0x10000, limit: 64 kB
|
|
||||||
.long 0x00009201
|
|
||||||
// real mode 16 bit stack segment
|
|
||||||
.long 0x0000ffff // base: 0, limit: 64 kB
|
|
||||||
.long 0x00009200
|
|
||||||
|
|
||||||
gdt_descriptor:
|
|
||||||
.word 0x2f // 6 entries in the GDT (8 bytes each)
|
|
||||||
.long gdt
|
|
||||||
|
|
||||||
GLOBAL(gBootedFromImage):
|
GLOBAL(gBootedFromImage):
|
||||||
.byte 1
|
.byte 1
|
||||||
@@ -87,5 +44,4 @@ GLOBAL(gBootedFromImage):
|
|||||||
GLOBAL(gBootDriveID):
|
GLOBAL(gBootDriveID):
|
||||||
.byte 0xff
|
.byte 0xff
|
||||||
|
|
||||||
GLOBAL(gBootPartitionOffset):
|
.balign 8
|
||||||
.long 0xffffffff
|
|
||||||
|
|||||||
Reference in New Issue
Block a user