From 3c827f6c053dfcd0263b7bfa1437f1b1332ba039 Mon Sep 17 00:00:00 2001 From: Avi Kivity <avi.kivity@gmail.com> Date: Sun, 2 Dec 2012 16:33:00 +0200 Subject: [PATCH] add missing files --- arch/x64/processor.hh | 158 ++++++++++++++++++++++++++++++++++++++++++ runtime.cc | 29 ++++++++ 2 files changed, 187 insertions(+) create mode 100644 arch/x64/processor.hh create mode 100644 runtime.cc diff --git a/arch/x64/processor.hh b/arch/x64/processor.hh new file mode 100644 index 000000000..97d068240 --- /dev/null +++ b/arch/x64/processor.hh @@ -0,0 +1,158 @@ +#ifndef ARCH_X86_PROCESSOR_H +#define ARCH_X86_PROCESSOR_H + +#include <stdint> + +namespace processor { + namespace x86 { + + typedef unsigned long ulong; + typedef uint8_t u8; + typedef uint16_t u16; + typedef uint32_t u32; + typedef uint64_t u64; + + inline ulong read_cr0() { + ulong r; + asm volatile ("mov %%cr0, %0" : "=r"(r)); + return r; + } + + inline void write_cr0(ulong r) { + asm volatile ("mov %0, %%cr0" : : "r"(r)); + } + + inline ulong read_cr2() { + ulong r; + asm volatile ("mov %%cr2, %0" : "=r"(r)); + return r; + } + + inline void write_cr2(ulong r) { + asm volatile ("mov %0, %%cr2" : : "r"(r)); + } + + inline ulong read_cr3() { + ulong r; + asm volatile ("mov %%cr3, %0" : "=r"(r)); + return r; + } + + inline void write_cr3(ulong r) { + asm volatile ("mov %0, %%cr3" : : "r"(r)); + } + + inline ulong read_cr4() { + ulong r; + asm volatile ("mov %%cr4, %0" : "=r"(r)); + return r; + } + + inline void write_cr4(ulong r) { + asm volatile ("mov %0, %%cr4" : : "r"(r)); + } + + inline ulong read_cr8() { + ulong r; + asm volatile ("mov %%cr8, %0" : "=r"(r)); + return r; + } + + inline void write_cr8(ulong r) { + asm volatile ("mov %0, %%cr8" : : "r"(r)); + } + + struct desc_ptr __attribute__((packed)) { + desc_ptr(u16 limit, ulong addr) : limit(limit), addr(addr) {} + u16 limit; + ulong addr; + }; + + inline void lgdt(const desc_ptr& ptr) { + asm volatile ("lgdt %0" : : "m"(ptr)); + } + + inline void sgdt(desc_ptr& ptr) { + asm volatile ("sgdt %0" : "=m"(ptr)); + } + + inline void lidt(const desc_ptr& ptr) { + asm volatile ("lidt %0" : : "m"(ptr)); + } + + inline void sidt(desc_ptr& ptr) { + asm volatile ("sidt %0" : "=m"(ptr)); + } + + inline u16 read_cs() { + u16 r; + asm volatile ("mov %%cs, %0" : "=rm"(r)); + return r; + } + + inline u16 read_ds() { + u16 r; + asm volatile ("mov %%ds, %0" : "=rm"(r)); + return r; + } + + inline void write_ds(u16 r) { + asm volatile ("mov %0, %%ds" : : "rm"(r)); + } + + inline u16 read_es() { + u16 r; + asm volatile ("mov %%es, %0" : "=rm"(r)); + return r; + } + + inline void write_es(u16 r) { + asm volatile ("mov %0, %%es" : : "rm"(r)); + } + + inline u16 read_fs() { + u16 r; + asm volatile ("mov %%fs, %0" : "=rm"(r)); + return r; + } + + inline void write_fs(u16 r) { + asm volatile ("mov %0, %%fs" : : "rm"(r)); + } + + inline u16 read_gs() { + u16 r; + asm volatile ("mov %%gs, %0" : "=rm"(r)); + return r; + } + + inline void write_gs(u16 r) { + asm volatile ("mov %0, %%gs" : : "rm"(r)); + } + + inline u16 read_ss() { + u16 r; + asm volatile ("mov %%ss, %0" : "=rm"(r)); + return r; + } + + inline void write_ss(u16 r) { + asm volatile ("mov %0, %%ss" : : "rm"(r)); + } + + inline u64 rdmsr(u32 index) { + u32 lo, hi; + asm volatile ("rdmsr" : "=a"(lo), "=d"(hi) : "c"(index)); + return lo | ((u64)hi << 32); + } + + inline void wrmsr(u32 index, u64 data) { + u32 lo = data, hi = data >> 32; + asm volatile ("wrmsr" : : "c"(index), "a"(lo), "d"(hi)); + } + + }; + +}; + +#endif diff --git a/runtime.cc b/runtime.cc new file mode 100644 index 000000000..5b33c5a24 --- /dev/null +++ b/runtime.cc @@ -0,0 +1,29 @@ + +extern "C" { + void __cxa_pure_virtual(void); + void abort(void); + void _Unwind_Resume(void); +} + +void __cxa_pure_virtual() +{ + abort(); +} + +void abort() +{ + while (true) + ; +} + +void _Unwind_Resume() +{ + abort(); +} + +void operator delete(void *) +{ + abort(); +} + +void *__gxx_personality_v0; -- GitLab