Subversion Repositories HelenOS-historic

Compare Revisions

Ignore whitespace Rev 266 → Rev 267

/SPARTAN/trunk/arch/ia32/include/boot/boot.h
29,7 → 29,9
#ifndef __ia32_BOOT_H__
#define __ia32_BOOT_H__
 
#define BOOT_OFFSET 0x100000
#define BOOTSTRAP_OFFSET 0x8000
#define BOOT_OFFSET 0x100000
 
#define MULTIBOOT_HEADER_MAGIC 0x1BADB002
#define MULTIBOOT_HEADER_FLAGS 0x00010003
 
/SPARTAN/trunk/arch/ia32/src/ia32.c
57,7 → 57,7
 
if (config.cpu_active == 1) {
bios_init();
i8042_init(); /* a20 bit */
i8042_init(); /* keyboard controller */
i8259_init(); /* PIC */
i8254_init(); /* hard clock */
/SPARTAN/trunk/arch/ia32/src/pm.c
70,7 → 70,9
struct tss *tss_p = NULL;
 
/* gdtr is changed by kmp before next CPU is initialized */
struct ptr_16_32 gdtr __attribute__ ((section ("K_DATA_START"))) = { .limit = sizeof(gdt), .base = KA2PA((__address) gdt - BOOT_OFFSET) };
struct ptr_16_32 bsp_bootstrap_gdtr __attribute__ ((section ("K_DATA_START"))) = { .limit = sizeof(gdt), .base = KA2PA((__address) gdt - BOOT_OFFSET) };
struct ptr_16_32 ap_bootstrap_gdtr __attribute__ ((section ("K_DATA_START"))) = { .limit = sizeof(gdt), .base = KA2PA((__address) gdt) };
struct ptr_16_32 gdtr = { .limit = sizeof(gdt), .base = KA2PA((__address) gdt) };
struct ptr_16_32 idtr __attribute__ ((section ("K_DATA_START"))) = { .limit = sizeof(idt), .base = KA2PA((__address) idt) };
 
void gdt_setbase(struct descriptor *d, __address base)
170,7 → 172,7
/*
* Update addresses in GDT and IDT to their virtual counterparts.
*/
gdtr.base = KA2PA(gdtr.base);
gdtr.base = (__address) gdt;
idtr.base = (__address) idt;
__asm__ volatile ("lgdt %0\n" : : "m" (gdtr));
__asm__ volatile ("lidt %0\n" : : "m" (idtr));
/SPARTAN/trunk/arch/ia32/src/smp/ap.S
47,27 → 47,33
ap_boot:
.code16
cli
xorw %ax,%ax
movw %ax,%ds
xorw %ax, %ax
movw %ax, %ds
 
lgdt gdtr # initialize Global Descriptor Table register
lgdt ap_bootstrap_gdtr # initialize Global Descriptor Table register
movl %cr0,%eax
orl $1,%eax
movl %eax,%cr0 # switch to protected mode
jmpl $KTEXT,$jump_to_kernel
movl %cr0, %eax
orl $1, %eax
movl %eax, %cr0 # switch to protected mode
jmpl $KTEXT, $jump_to_kernel
jump_to_kernel:
.code32
movw $KDATA,%ax
movw %ax,%ds
movw %ax,%es
movw %ax,%ss
movl $(ctx-0x80000000),%eax # KA2PA((__address) &ctx)
movl (%eax),%esp
subl $0x80000000,%esp # KA2PA(ctx.sp)
movw $KDATA, %ax
movw %ax, %ds
movw %ax, %es
movw %ax, %ss
movl $(ctx-0x80000000), %eax # KA2PA((__address) &ctx)
movl (%eax), %esp
subl $0x80000000, %esp # KA2PA(ctx.sp)
 
call map_kernel # map kernel and turn paging on
call map_kernel # map kernel and turn paging on
movb $0xd1, %al # enable A20 using the keyboard controller
outb %al, $0x64
movb $0xdf, %al
outb %al, $0x60
 
jmpl $KTEXT,$main_ap
jmpl $KTEXT, $main_ap
 
#endif /* __SMP__ */
/SPARTAN/trunk/arch/ia32/src/boot/boot.S
31,6 → 31,9
.section K_TEXT_START
.global kernel_image_start
 
KTEXT=8
KDATA=16
 
.code16
#
# This is where we require any SPARTAN-kernel-compatible boot loader
44,18 → 47,18
cli
xorw %ax, %ax
movw %ax, %ds
movw %ax, %ss # initialize stack segment register
movl $0x7c00, %esp # initialize stack pointer
movw %ax, %ss # initialize stack segment register
movl $BOOTSTRAP_OFFSET - 0x400, %esp # initialize stack pointer
call memmap_arch_init
lgdt gdtr # initialize Global Descriptor Table register
lgdt bsp_bootstrap_gdtr # initialize Global Descriptor Table register
movl %cr0, %eax
orl $0x1, %eax
movl %eax, %cr0 # switch to protected mode
movl %eax, %cr0 # switch to protected mode
jmpl $8, $boot_image_start
jmpl $KTEXT, $boot_image_start
.code32
.align 4
70,7 → 73,7
.long multiboot_image_start + BOOT_OFFSET
boot_image_start:
movw $16, %ax
movw $KDATA, %ax
movw %ax, %es
movw %ax, %gs
movw %ax, %fs
84,8 → 87,8
movb $0xdf, %al
outb %al, $0x60
movl $0x8000, %esi
movl $0x8000 + BOOT_OFFSET, %edi
movl $BOOTSTRAP_OFFSET, %esi
movl $BOOTSTRAP_OFFSET + BOOT_OFFSET, %edi
movl $_hardcoded_kernel_size, %ecx
cld
rep movsb
93,21 → 96,21
jmp protected
multiboot_image_start:
movl $0x7c00, %esp # initialize stack pointer
movl BOOTSTRAP_OFFSET - 0x400, %esp # initialize stack pointer
lgdt gdtr
lgdt gdtr # initialize Global Descriptor Table register
 
movw $16, %ax
movw $KDATA, %ax
movw %ax, %es
movw %ax, %gs
movw %ax, %fs
movw %ax, %ds # kernel data + stack
movw %ax, %ds # kernel data + stack
movw %ax, %ss
call map_kernel # map kernel and turn paging on
call map_kernel # map kernel and turn paging on
protected:
call main_bsp # never returns
call main_bsp # never returns
 
cli
hlt
/SPARTAN/trunk/arch/ia32/src/mm/frame.c
30,9 → 30,11
#include <arch/mm/frame.h>
#include <mm/vm.h>
#include <config.h>
#include <arch/boot/boot.h>
#include <arch/boot/memmap.h>
 
#include <print.h>
size_t hardcoded_unmapped_ktext_size = 0;
size_t hardcoded_unmapped_kdata_size = 0;
 
void frame_arch_init(void)
{
39,13 → 41,15
__u8 i;
if (config.cpu_active == 1) {
/* Reserve the NULL frame */
frame_not_free(0x0);
 
/* Reserve well-known memory regions */
frame_region_not_free(0xa0000,0xff000);
frame_region_not_free(0xfec00000,0xffffffff);
/* This is a nasty hack, which should be fixed soon */
frame_region_not_free(0x0, 0xfffff);
/* Reserve real mode bootstrap memory */
frame_region_not_free(BOOTSTRAP_OFFSET, BOOTSTRAP_OFFSET + hardcoded_unmapped_ktext_size + hardcoded_unmapped_kdata_size);
for (i=e820counter;i>0;i--) {
if (e820table[i-1].type!=MEMMAP_MEMORY_AVAILABLE) {
/SPARTAN/trunk/arch/ia32/_link.ld
17,17 → 17,18
*(K_TEXT_START);
*(K_TEXT_START_2);
unmapped_ktext_end = .;
unmapped_kdata_start = .;
*(K_DATA_START);
unmapped_kdata_end = .;
}
 
.mapped (0x80100000+SIZEOF(.unmapped)+0x8000) : AT (0x8000+SIZEOF(.unmapped)) {
.mapped (0x80100000+0x8000+SIZEOF(.unmapped)): AT (0x8000+SIZEOF(.unmapped)) {
ktext_start = .;
*(BOOT_DATA)
*(.text);
ktext_end = .;
 
kdata_start = .;
*(.data); /* initialized data */
*(.rodata*); /* string literals */
38,6 → 39,10
LONG(ktext_end - ktext_start + (unmapped_ktext_end - unmapped_ktext_start));
hardcoded_kdata_size = .;
LONG(kdata_end - kdata_start + (unmapped_kdata_end - unmapped_kdata_start));
hardcoded_unmapped_ktext_size = .;
LONG(unmapped_ktext_end - unmapped_ktext_start);
hardcoded_unmapped_kdata_size = .;
LONG(unmapped_kdata_end - unmapped_kdata_start);
*(.bss); /* uninitialized static variables */
*(K_DATA_END);
kdata_end = .;
44,7 → 49,7
}
_hardcoded_kernel_size = (ktext_end - ktext_start) + (unmapped_ktext_end - unmapped_ktext_start) + (kdata_end - kdata_start) + (unmapped_kdata_end - unmapped_kdata_start);
 
_map_address = 0x80100000;
e820table_boot = e820table - _map_address;
e820counter_boot = e820counter - _map_address;