Subversion Repositories HelenOS-historic

Compare Revisions

Ignore whitespace Rev 251 → Rev 248

/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: