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