+/*
+ * This file is part of the Palacios Virtual Machine Monitor developed
+ * by the V3VEE Project with funding from the United States National
+ * Science Foundation and the Department of Energy.
+ *
+ * The V3VEE Project is a joint project between Northwestern University
+ * and the University of New Mexico. You can find out more at
+ * http://www.v3vee.org
+ *
+ * Copyright (c) 2008, Jack Lange <jarusl@cs.northwestern.edu>
+ * Copyright (c) 2008, The V3VEE Project <http://www.v3vee.org>
+ * All rights reserved.
+ *
+ * Author: Jack Lange <jarusl@cs.northwestern.edu>
+ *
+ * This is free software. You are permitted to use,
+ * redistribute, and modify it as specified in the file "V3VEE_LICENSE".
+ */
+
#ifndef __VMM_CTRL_REGS_H
#define __VMM_CTRL_REGS_H
+#ifdef __V3VEE__
+
#include <palacios/vm_guest.h>
uint_t mp : 1;
uint_t em : 1;
uint_t ts : 1;
-};
+} __attribute__((packed));
struct cr0_32 {
uint_t nw : 1;
uint_t cd : 1;
uint_t pg : 1;
-};
+} __attribute__((packed));
struct cr0_64 {
uint_t pg : 1;
uint_t rsvd4; // MBZ
-};
+} __attribute__((packed));
struct cr2_32 {
uint_t pf_vaddr;
-};
+} __attribute__((packed));
struct cr2_64 {
ullong_t pf_vaddr;
-};
+} __attribute__((packed));
struct cr3_32 {
uint_t pcd : 1;
uint_t rsvd2 : 7;
uint_t pdt_base_addr : 20;
-};
+} __attribute__((packed));
struct cr3_32_PAE {
uint_t pwt : 1;
uint_t pcd : 1;
uint_t pdpt_base_addr : 27;
-};
+} __attribute__((packed));
struct cr3_64 {
uint_t rsvd2 : 7;
ullong_t pml4t_base_addr : 40;
uint_t rsvd3 : 12;
-};
+} __attribute__((packed));
struct cr4_32 {
uint_t osf_xsr : 1;
uint_t osx : 1;
uint_t rsvd1 : 21;
-};
+} __attribute__((packed));
struct cr4_64 {
uint_t vme : 1;
uint_t osx : 1;
uint_t rsvd1 : 21;
uint_t rsvd2 : 32;
-};
+} __attribute__((packed));
uint_t ffxsr : 1;
uint_t rsvd4 : 12; // MBZ
uint_t rsvd5 : 32; // MBZ
-};
+} __attribute__((packed));
struct rflags {
uint_t id : 1; // ID flag
uint_t rsvd5 : 10; // Read as 0
uint_t rsvd6 : 32; // Read as 0
-};
+} __attribute__((packed));
*/
-int handle_cr0_write(struct guest_info * info);
-int handle_cr0_read(struct guest_info * info);
+int v3_handle_cr0_write(struct guest_info * info);
+int v3_handle_cr0_read(struct guest_info * info);
+
+int v3_handle_cr3_write(struct guest_info * info);
+int v3_handle_cr3_read(struct guest_info * info);
+
+int v3_handle_cr4_write(struct guest_info * info);
+int v3_handle_cr4_read(struct guest_info * info);
+
-int handle_cr3_write(struct guest_info * info);
-int handle_cr3_read(struct guest_info * info);
+int v3_handle_efer_write(uint_t msr, struct v3_msr src, void * priv_data);
+int v3_handle_efer_read(uint_t msr, struct v3_msr * dst, void * priv_data);
-#define CR3_32_SAME_BASE(source1,source2) ((source1)->pdt_base_addr == (source2)->pdt_base_addr)
-#define CR3_32_COPY_FLAGS(source,dest) do { (dest)->rsvd1=(source)->rsvd1; (dest)->pwt=(source)->pwt; (dest)->pcd=(source)->pcd; } while (0)
-#define CR3_32_COPY_BASE(source,dest) do { (dest)->pdt_base_addr = (source)->pdt_base_addr; } while (0)
+#endif // ! __V3VEE__
#endif