Subversion Repositories HelenOS-historic

Compare Revisions

Ignore whitespace Rev 274 → Rev 275

/SPARTAN/trunk/arch/amd64/include/boot/boot.h
30,7 → 30,7
#define __amd64_BOOT_H__
 
#define BOOTSTRAP_OFFSET 0x8000
#define BOOT_OFFSET 0x0
#define BOOT_OFFSET 0x100000
 
#define MULTIBOOT_HEADER_MAGIC 0x1BADB002
#define MULTIBOOT_HEADER_FLAGS 0x00010003
/SPARTAN/trunk/arch/amd64/include/cpuid.h
29,11 → 29,13
#ifndef __CPUID_H__
#define __CPUID_H__
 
#include <arch/types.h>
 
#define AMD_CPUID_EXTENDED 0x80000001
#define AMD_EXT_NOEXECUTE 20
 
#ifndef __ASM__
 
#include <arch/types.h>
 
struct cpu_info {
__u32 cpuid_eax;
__u32 cpuid_ebx;
48,4 → 50,5
 
extern __u64 rdtsc(void);
 
#endif /* __ASM__ */
#endif
/SPARTAN/trunk/arch/amd64/src/boot/boot.S
32,8 → 32,9
#include <arch/mm/ptl.h>
#include <arch/pm.h>
#include <arch/cpu.h>
#include <arch/cpuid.h>
#include <arch/boot/boot.h>
 
#define START_STACK 0x7c00
#define START_STACK_64 0xffffffff80007c00
#
44,6 → 45,9
# time. So we can just load the respective table registers and
# switch to protected mode.
#
 
#define START_STACK (BOOTSTRAP_OFFSET-0x400)
.section K_TEXT_START
.code16
.global kernel_image_start
52,7 → 56,7
xorw %ax,%ax
movw %ax,%ds
movw %ax,%ss # initialize stack segment register
movl $(START_STACK),%esp # initialize stack pointer
movl $(START_STACK), %esp # initialize stack pointer
call memmap_arch_init
60,7 → 64,7
cpuid
cmp $0x80000000, %eax # any function > 80000000h?
jbe no_long_mode
movl $0x80000001, %eax # Extended function code 80000001
movl $(AMD_CPUID_EXTENDED), %eax # Extended function code 80000001
cpuid
bt $29, %edx # Test if long mode is supported.
jnc no_long_mode
88,6 → 92,12
movw %ax, %gs
movw %ax, %ss
 
movb $0xd1, %al # enable A20 using the keyboard controller
outb %al, $0x64
movb $0xdf, %al
outb %al, $0x60
 
# Enable 64-bit page transaltion entries - CR4.PAE = 1.
# Paging is not enabled until after long mode is enabled
movl %cr4, %eax
97,7 → 107,7
# Set up paging tables
leal ptl_0, %eax
movl %eax, %cr3
# Enable long mode
movl $EFER_MSR_NUM, %ecx # EFER MSR number
rdmsr # Read EFER
114,7 → 124,14
 
.code64
start64:
movq $(START_STACK_64), %rsp
movq $(PA2KA(START_STACK)), %rsp
 
# Copy kernel to higher physical memory
movq $BOOTSTRAP_OFFSET, %rsi
movq $BOOTSTRAP_OFFSET + BOOT_OFFSET, %rdi
movq $_hardcoded_kernel_size, %rcx
cld
rep movsb
call main_bsp # never returns
1:
153,9 → 170,9
.global gdtr_inst
bsp_bootstrap_gdtr:
.word gdtselector(GDT_ITEMS)
.long KA2PA(gdt)
.long KA2PA(gdt)-BOOT_OFFSET
 
.global ap_bootstrap_gdtr
ap_bootstrap_gdtr:
.word gdtselector(GDT_ITEMS)
.long KA2PA(gdt)
.long KA2PA(gdt)-BOOT_OFFSET
/SPARTAN/trunk/arch/amd64/_link.ld
17,12 → 17,13
*(K_TEXT_START);
*(K_TEXT_START_2);
unmapped_ktext_end = .;
 
unmapped_kdata_start = .;
*(K_DATA_START);
unmapped_kdata_end = .;
}
 
.mapped (0xffffffff80000000+SIZEOF(.unmapped)+0x8000) : AT (0x8000+SIZEOF(.unmapped)) {
.mapped (0xffffffff80100000+0x8000+SIZEOF(.unmapped)) : AT (0x8000+SIZEOF(.unmapped)) {
ktext_start = .;
*(BOOT_DATA);
*(.text);
37,6 → 38,10
QUAD(ktext_end - ktext_start + (unmapped_ktext_end - unmapped_ktext_start));
hardcoded_kdata_size = .;
QUAD(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);
*(COMMON); /* global variables */
 
 
50,7 → 55,9
 
kdata_end = .;
}
_map_address = 0xffffffff80000000;
_map_address = 0xffffffff80100000;
_hardcoded_kernel_size = (ktext_end - ktext_start) + (unmapped_ktext_end - unmapped_ktext_start) + (kdata_end - kdata_start) + (unmapped_kdata_end - unmapped_kdata_start);
 
e820table_boot = e820table - _map_address;
e820counter_boot = e820counter - _map_address;
}
/SPARTAN/trunk/arch/ia32/include/boot/boot.h
30,7 → 30,7
#define __ia32_BOOT_H__
 
#define BOOTSTRAP_OFFSET 0x8000
#define BOOT_OFFSET 0x100000
#define BOOT_OFFSET 0x100000
 
#define MULTIBOOT_HEADER_MAGIC 0x1BADB002
#define MULTIBOOT_HEADER_FLAGS 0x00010003