/SPARTAN/trunk/arch/amd64/include/cpuid.h |
---|
31,9 → 31,6 |
#include <arch/types.h> |
#define AMD_CPUID_EXTENDED 0x80000001 |
#define AMD_EXT_NOEXECUTE 20 |
struct cpu_info { |
__u32 cpuid_eax; |
__u32 cpuid_ebx; |
43,9 → 40,21 |
extern int has_cpuid(void); |
extern void cpuid(__u32 cmd, cpu_info_t *info); |
static inline void cpuid(__u32 cmd, cpu_info_t *info) |
{ |
__asm__ ( |
"movl %1, %eax" |
"cpuid" |
"movl %eax, 0(%0)" |
"movl %ebx, 4(%0)" |
"movl %ecx, 8(%0)" |
"movl %edx, 12(%0)" |
: "=m"(info) |
: "r"(cmd) |
: "%eax","%ebx","%ecx","%edx" |
); |
} |
extern __u64 rdtsc(void); |
#endif |
/SPARTAN/trunk/arch/amd64/include/mm/page.h |
---|
42,7 → 42,7 |
# define PA2KA(x) (((__address) (x)) - 0x80000000) |
#else |
# define KA2PA(x) ((x) + 0x80000000) |
# define PA2KA(x) ((x) - 0x80000000) |
//# define PA2KA(x) ((x)) - 0x80000000) |
#endif |
#define PTL0_INDEX_ARCH(vaddr) (((vaddr)>>39)&0x1ff) |
/SPARTAN/trunk/arch/amd64/include/cpu.h |
---|
29,18 → 29,11 |
#ifndef __amd64_CPU_H__ |
#define __amd64_CPU_H__ |
#define EFER_MSR_NUM 0xc0000080 |
#define AMD_SCE_FLAG 0 |
#define AMD_LME_FLAG 8 |
#define AMD_LMA_FLAG 10 |
#define AMD_FFXSR_FLAG 14 |
#define AMD_NXE_FLAG 11 |
#ifndef __ASM__ |
#include <config.h> |
#include <proc/thread.h> |
#include <typedefs.h> |
#include <arch/pm.h> |
#include <arch/asm.h> |
struct cpu_arch { |
int vendor; |
51,11 → 44,7 |
}; |
extern void set_TS_flag(void); |
extern void reset_TS_flag(void); |
extern void set_efer_flag(int flag); |
extern __u64 read_efer_flag(void); |
void set_TS_flag(void); |
void reset_TS_flag(void); |
#endif /* __ASM__ */ |
#endif |
/SPARTAN/trunk/arch/amd64/Makefile.inc |
---|
33,5 → 33,4 |
arch/mm/tlb.c \ |
arch/asm_utils.S \ |
arch/fmath.c \ |
arch/mm/memory_init.c \ |
arch/cpu/cpu.c |
arch/mm/memory_init.c |
/SPARTAN/trunk/arch/amd64/src/cpu/cpu.c |
---|
File deleted |
/SPARTAN/trunk/arch/amd64/src/asm_utils.S |
---|
39,7 → 39,6 |
.text |
.global interrupt_handlers |
.global panic_printf |
.global cpuid |
panic_printf: |
movq $halt, (%rsp) |
47,9 → 46,8 |
.global has_cpuid |
.global rdtsc |
.global read_efer_flag |
.global set_efer_flag |
## Determine CPUID support |
# |
# Return 0 in EAX if CPUID is not support, 1 if supported. |
72,36 → 70,12 |
popq %rbx |
ret |
cpuid: |
movq %rbx, %r10 # we have to preserve rbx across function calls |
movl %edi,%eax # load the command into %eax |
cpuid |
movl %eax,0(%rsi) |
movl %ebx,4(%rsi) |
movl %ecx,8(%rsi) |
movl %edx,12(%rsi) |
movq %r10, %rbx |
ret |
rdtsc: |
xorq %rax,%rax |
rdtsc |
ret |
set_efer_flag: |
movq $0xc0000080, %rcx |
rdmsr |
btsl %edi, %eax |
wrmsr |
ret |
read_efer_flag: |
movq $0xc0000080, %rcx |
rdmsr |
ret |
# Push all general purpose registers on stack except %rbp, %rsp |
.macro push_all_gpr |
/SPARTAN/trunk/arch/amd64/src/boot/boot.S |
---|
31,7 → 31,6 |
#include <arch/mm/page.h> |
#include <arch/mm/ptl.h> |
#include <arch/pm.h> |
#include <arch/cpu.h> |
#define START_STACK 0x7c00 |
#define START_STACK_64 0xffffffff80007c00 |
102,9 → 101,9 |
movl %eax, %cr3 |
# Enable long mode |
movl $EFER_MSR_NUM, %ecx # EFER MSR number |
movl $0xc0000080, %ecx # EFER MSR number |
rdmsr # Read EFER |
btsl $AMD_LME_FLAG, %eax # Set LME=1 |
btsl $8, %eax # Set LME=1 |
wrmsr # Write EFER |
# Enable paging to activate long mode (set CR0.PG=1) |
/SPARTAN/trunk/arch/amd64/src/amd64.c |
---|
39,22 → 39,9 |
#include <arch/bios/bios.h> |
#include <arch/mm/memory_init.h> |
#include <arch/cpu.h> |
#include <print.h> |
#include <arch/cpuid.h> |
void arch_pre_mm_init(void) |
{ |
struct cpu_info cpuid_s; |
cpuid(AMD_CPUID_EXTENDED,&cpuid_s); |
if (! (cpuid_s.cpuid_edx & (1<<AMD_EXT_NOEXECUTE))) { |
printf("We do not support NX!!-----------\n"); |
printf("%X------\n",cpuid_s.cpuid_edx); |
cpu_halt(); |
} |
set_efer_flag(AMD_NXE_FLAG); |
pm_init(); |
if (config.cpu_active == 1) { |
/SPARTAN/trunk/arch/amd64/src/dummy.s |
---|
35,6 → 35,7 |
.global cpu_sleep |
.global cpu_print_report |
.global dummy |
.global reset_TS_flag |
.global fpu_init |
before_thread_runs_arch: |
43,6 → 44,7 |
cpu_arch_init: |
cpu_sleep: |
cpu_print_report: |
reset_TS_flag: |
fpu_init: |
dummy: |
/SPARTAN/trunk/src/mm/page.c |
---|
83,7 → 83,7 |
newpt = frame_alloc(FRAME_KA); |
memsetb(newpt, PAGE_SIZE, 0); |
SET_PTL1_ADDRESS(ptl0, PTL0_INDEX(page), KA2PA(newpt)); |
SET_PTL1_FLAGS(ptl0, PTL0_INDEX(page), PAGE_PRESENT | PAGE_USER | PAGE_EXEC); |
SET_PTL1_FLAGS(ptl0, PTL0_INDEX(page), PAGE_PRESENT | PAGE_USER); |
} |
ptl1 = (pte_t *) PA2KA(GET_PTL1_ADDRESS(ptl0, PTL0_INDEX(page))); |
92,7 → 92,7 |
newpt = frame_alloc(FRAME_KA); |
memsetb(newpt, PAGE_SIZE, 0); |
SET_PTL2_ADDRESS(ptl1, PTL1_INDEX(page), KA2PA(newpt)); |
SET_PTL2_FLAGS(ptl1, PTL1_INDEX(page), PAGE_PRESENT | PAGE_USER | PAGE_EXEC); |
SET_PTL2_FLAGS(ptl1, PTL1_INDEX(page), PAGE_PRESENT | PAGE_USER); |
} |
ptl2 = (pte_t *) PA2KA(GET_PTL2_ADDRESS(ptl1, PTL1_INDEX(page))); |
101,7 → 101,7 |
newpt = frame_alloc(FRAME_KA); |
memsetb(newpt, PAGE_SIZE, 0); |
SET_PTL3_ADDRESS(ptl2, PTL2_INDEX(page), KA2PA(newpt)); |
SET_PTL3_FLAGS(ptl2, PTL2_INDEX(page), PAGE_PRESENT | PAGE_USER | PAGE_EXEC); |
SET_PTL3_FLAGS(ptl2, PTL2_INDEX(page), PAGE_PRESENT | PAGE_USER); |
} |
ptl3 = (pte_t *) PA2KA(GET_PTL3_ADDRESS(ptl2, PTL2_INDEX(page))); |
/SPARTAN/trunk/include/cpu.h |
---|
74,6 → 74,7 |
extern cpu_t *cpus; |
extern void cpu_init(void); |
extern void cpu_halt(void); |
extern void cpu_arch_init(void); |
extern void cpu_identify(void); |