removed usage of the 0x8d000 to 0x9ffff memory range, as its needed by PXE UNDI.
git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@19126 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
@@ -59,6 +59,23 @@ struct extended_memory {
|
|||||||
uint32 type;
|
uint32 type;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
#ifdef _PXE_ENV
|
||||||
|
|
||||||
|
static const uint32 kDefaultPageTableFlags = 0x07; // present, user, R/W
|
||||||
|
static const size_t kMaxKernelSize = 0x100000; // 1 MB for the kernel
|
||||||
|
static const uint32 kPageTableRegionEnd = 0x110000;
|
||||||
|
|
||||||
|
// working page directory and page table
|
||||||
|
static uint32 *sPageDirectory = 0;
|
||||||
|
|
||||||
|
static addr_t sNextPhysicalAddress = 0x110000;
|
||||||
|
static addr_t sNextVirtualAddress = KERNEL_BASE + kMaxKernelSize;
|
||||||
|
static addr_t sMaxVirtualAddress = KERNEL_BASE + 0x400000;
|
||||||
|
|
||||||
|
static addr_t sNextPageTableAddress = 0x100000;
|
||||||
|
|
||||||
|
#else
|
||||||
|
|
||||||
static const uint32 kDefaultPageTableFlags = 0x07; // present, user, R/W
|
static const uint32 kDefaultPageTableFlags = 0x07; // present, user, R/W
|
||||||
static const size_t kMaxKernelSize = 0x100000; // 1 MB for the kernel
|
static const size_t kMaxKernelSize = 0x100000; // 1 MB for the kernel
|
||||||
static const uint32 kPageTableRegionEnd = 0x9e000;
|
static const uint32 kPageTableRegionEnd = 0x9e000;
|
||||||
@@ -73,6 +90,8 @@ static addr_t sMaxVirtualAddress = KERNEL_BASE + 0x400000;
|
|||||||
|
|
||||||
static addr_t sNextPageTableAddress = 0x90000;
|
static addr_t sNextPageTableAddress = 0x90000;
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
static addr_t
|
static addr_t
|
||||||
get_next_virtual_address(size_t size)
|
get_next_virtual_address(size_t size)
|
||||||
@@ -266,7 +285,7 @@ init_page_directory(void)
|
|||||||
// These page tables won't be taken over into the kernel.
|
// These page tables won't be taken over into the kernel.
|
||||||
|
|
||||||
// make the first page table at the first free spot
|
// make the first page table at the first free spot
|
||||||
uint32 *pageTable = get_next_page_table();;
|
uint32 *pageTable = get_next_page_table();
|
||||||
|
|
||||||
for (int32 i = 0; i < 1024; i++) {
|
for (int32 i = 0; i < 1024; i++) {
|
||||||
pageTable[i] = (i * 0x1000) | kDefaultPageFlags;
|
pageTable[i] = (i * 0x1000) | kDefaultPageFlags;
|
||||||
@@ -275,7 +294,7 @@ init_page_directory(void)
|
|||||||
sPageDirectory[0] = (uint32)pageTable | kDefaultPageFlags;
|
sPageDirectory[0] = (uint32)pageTable | kDefaultPageFlags;
|
||||||
|
|
||||||
// make the second page table
|
// make the second page table
|
||||||
pageTable = get_next_page_table();;
|
pageTable = get_next_page_table();
|
||||||
|
|
||||||
for (int32 i = 0; i < 1024; i++) {
|
for (int32 i = 0; i < 1024; i++) {
|
||||||
pageTable[i] = (i * 0x1000 + 0x400000) | kDefaultPageFlags;
|
pageTable[i] = (i * 0x1000 + 0x400000) | kDefaultPageFlags;
|
||||||
|
|||||||
@@ -396,8 +396,13 @@ smp_boot_other_cpus(void)
|
|||||||
|
|
||||||
// allocate a stack and a code area for the smp trampoline
|
// allocate a stack and a code area for the smp trampoline
|
||||||
// (these have to be < 1M physical, 0xa0000-0xfffff is reserved by the BIOS)
|
// (these have to be < 1M physical, 0xa0000-0xfffff is reserved by the BIOS)
|
||||||
|
#ifdef _PXE_ENV
|
||||||
|
trampolineCode = 0x8b000;
|
||||||
|
trampolineStack = 0x8c000;
|
||||||
|
#else
|
||||||
trampolineCode = 0x9f000;
|
trampolineCode = 0x9f000;
|
||||||
trampolineStack = 0x9e000;
|
trampolineStack = 0x9e000;
|
||||||
|
#endif
|
||||||
|
|
||||||
// copy the trampoline code over
|
// copy the trampoline code over
|
||||||
memcpy((char *)trampolineCode, (const void*)&smp_trampoline,
|
memcpy((char *)trampolineCode, (const void*)&smp_trampoline,
|
||||||
|
|||||||
@@ -9,7 +9,7 @@ UsePrivateHeaders [ FDirName graphics vesa ] ;
|
|||||||
UsePrivateHeaders [ FDirName storage ] ;
|
UsePrivateHeaders [ FDirName storage ] ;
|
||||||
|
|
||||||
{
|
{
|
||||||
local defines = _BOOT_MODE ;
|
local defines = _BOOT_MODE _PXE_ENV ;
|
||||||
|
|
||||||
defines = [ FDefines $(defines) ] ;
|
defines = [ FDefines $(defines) ] ;
|
||||||
SubDirCcFlags $(defines) -Wall -Wno-multichar ;
|
SubDirCcFlags $(defines) -Wall -Wno-multichar ;
|
||||||
@@ -28,7 +28,6 @@ local bios_ia32_src =
|
|||||||
mmu.cpp
|
mmu.cpp
|
||||||
cpu.cpp
|
cpu.cpp
|
||||||
smp.cpp
|
smp.cpp
|
||||||
smp_trampoline.S
|
|
||||||
support.S
|
support.S
|
||||||
video.cpp
|
video.cpp
|
||||||
apm.cpp
|
apm.cpp
|
||||||
@@ -36,6 +35,7 @@ local bios_ia32_src =
|
|||||||
|
|
||||||
KernelMergeObject boot_platform_pxe_ia32.o :
|
KernelMergeObject boot_platform_pxe_ia32.o :
|
||||||
pxe_stage2.S
|
pxe_stage2.S
|
||||||
|
smp_trampoline.S
|
||||||
$(bios_ia32_src)
|
$(bios_ia32_src)
|
||||||
|
|
||||||
# generic
|
# generic
|
||||||
|
|||||||
@@ -30,7 +30,8 @@
|
|||||||
// 0x00000 - 0x07bff real mode IDT, stack
|
// 0x00000 - 0x07bff real mode IDT, stack
|
||||||
// 0x07C00 - 0x08FFF pxehaiku (stage 1, this)
|
// 0x07C00 - 0x08FFF pxehaiku (stage 1, this)
|
||||||
// 0x09000 - 0x0FFFF scratchbuffer
|
// 0x09000 - 0x0FFFF scratchbuffer
|
||||||
// 0x10000 - 0x8CFFF pxe-haiku-loader (stage 2)
|
// 0x10000 - 0x8AFFF pxe-haiku-loader (stage 2)
|
||||||
|
// 0x8B000 - 0x8CFFF used by stage2 trampoline code
|
||||||
// 0x8D000 - 0x9F7FF PXE and UNDI code and data segments
|
// 0x8D000 - 0x9F7FF PXE and UNDI code and data segments
|
||||||
// 0x9F800 - 0xA0000 extended BIOS data area
|
// 0x9F800 - 0xA0000 extended BIOS data area
|
||||||
|
|
||||||
@@ -40,7 +41,7 @@
|
|||||||
.equ scratchbuffer_size, 0x7000
|
.equ scratchbuffer_size, 0x7000
|
||||||
|
|
||||||
.equ load_addr, 0x10000
|
.equ load_addr, 0x10000
|
||||||
.equ load_size_max, (0x8D000 - load_addr)
|
.equ load_size_max, (0x8B000 - load_addr)
|
||||||
|
|
||||||
.code16
|
.code16
|
||||||
.text
|
.text
|
||||||
|
|||||||
@@ -3,14 +3,14 @@
|
|||||||
** Distributed under the terms of the NewOS License.
|
** Distributed under the terms of the NewOS License.
|
||||||
*/
|
*/
|
||||||
// expects a stack page like this:
|
// expects a stack page like this:
|
||||||
// (stack has to be at (0x9e000)
|
// (stack has to be at (0x8c000)
|
||||||
// 0x9effc : final esp
|
// 0x8cffc : final esp
|
||||||
// 0x9eff8 : page dir
|
// 0x8cff8 : page dir
|
||||||
//
|
//
|
||||||
// 0x9e000 - 0x9e006 : gdt descriptor
|
// 0x8c000 - 0x8c006 : gdt descriptor
|
||||||
// 0x9e008 - 0x9e020 : gdt
|
// 0x8c008 - 0x8c020 : gdt
|
||||||
//
|
//
|
||||||
// smp_trampoline must be located at 0x9f000
|
// smp_trampoline must be located at 0x8b000
|
||||||
.globl smp_trampoline
|
.globl smp_trampoline
|
||||||
.globl smp_trampoline_end
|
.globl smp_trampoline_end
|
||||||
.globl foo
|
.globl foo
|
||||||
@@ -19,11 +19,11 @@
|
|||||||
smp_trampoline:
|
smp_trampoline:
|
||||||
cli
|
cli
|
||||||
|
|
||||||
mov $0x9e00,%ax
|
mov $0x8c00,%ax
|
||||||
mov %ax,%ds
|
mov %ax,%ds
|
||||||
|
|
||||||
// lgdt 0x9e000 # load the gdt
|
// lgdt 0x8c000 # load the gdt
|
||||||
.byte 0x66, 0x0f, 0x01, 0x15, 0x00, 0xe0, 0x09, 0x00
|
.byte 0x66, 0x0f, 0x01, 0x15, 0x00, 0xc0, 0x08, 0x00
|
||||||
|
|
||||||
movl %cr0,%eax
|
movl %cr0,%eax
|
||||||
orl $0x01,%eax
|
orl $0x01,%eax
|
||||||
@@ -32,7 +32,7 @@ smp_trampoline:
|
|||||||
.code32
|
.code32
|
||||||
_trampoline_32:
|
_trampoline_32:
|
||||||
.byte 0x66
|
.byte 0x66
|
||||||
ljmp $0x08,$(trampoline_32 - smp_trampoline + 0x9f000)
|
ljmp $0x08,$(trampoline_32 - smp_trampoline + 0x8b000)
|
||||||
trampoline_32:
|
trampoline_32:
|
||||||
mov $0x10, %ax
|
mov $0x10, %ax
|
||||||
mov %ax, %ds
|
mov %ax, %ds
|
||||||
@@ -41,7 +41,7 @@ trampoline_32:
|
|||||||
mov %ax, %gs
|
mov %ax, %gs
|
||||||
mov %ax, %ss
|
mov %ax, %ss
|
||||||
|
|
||||||
movl $0x9eff8,%esp # set up the stack pointer
|
movl $0x8cff8,%esp # set up the stack pointer
|
||||||
|
|
||||||
popl %eax # get the page dir
|
popl %eax # get the page dir
|
||||||
movl %eax,%cr3 # set the page dir
|
movl %eax,%cr3 # set the page dir
|
||||||
|
|||||||
Reference in New Issue
Block a user