palacios/vmm_direct_paging.o \
palacios/vmm_ringbuffer.o \
palacios/vmm_hypercall.o \
+ palacios/vmm_lock.o \
$(OBJ_FILES)
# vmx.c vmcs_gen.c vmcs.c
devices/ram_hd.o \
devices/i440fx.o \
devices/piix3.o \
+ devices/net_cd.o \
# devices/ne2k.o \
# devices/cdrom.o \
void (*start_kernel_thread)(int (*fn)(void * arg), void * arg, char * thread_name);
void (*yield_cpu)(void);
+
+ void *(*mutex_alloc)(void);
+ void (*mutex_free)(void * mutex);
+ void (*mutex_lock)(void * mutex, int must_spin);
+ void (*mutex_unlock)(void * mutex);
};
int use_ram_cd;
int use_ram_hd;
+ int use_net_cd;
+ int use_net_hd;
void * ramdisk;
int ramdisk_size;
--- /dev/null
+/*
+ * 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_LOCK_H__
+#define __VMM_LOCK_H__
+
+#ifdef __V3VEE__
+#include <palacios/vmm_types.h>
+
+typedef addr_t v3_lock_t;
+
+int v3_lock_init(v3_lock_t * lock);
+void v3_lock_deinit(v3_lock_t * lock);
+
+
+void v3_lock(v3_lock_t lock);
+void v3_unlock(v3_lock_t lock);
+
+
+addr_t v3_lock_irqsave(v3_lock_t lock);
+void v3_unlock_irqrestore(v3_lock_t lock, addr_t irq_state);
+
+
+#endif
+
+#endif
__asm__ __volatile__ ("cli");
}
+
+
+
+#ifdef __V3_32BIT__
+
+static addr_t __inline__ v3_irq_save() {
+ addr_t state;
+
+ __asm__ __volatile__ ("pushf \n\t"
+ "popl %0 \n\t"
+ "cli \n\t"
+ :"=g" (x)
+ :
+ :"memory"
+ );
+ return state;
+}
+
+static void __inline__ v3_irq_restore(addr_t state) {
+ __asm__ __volatile__("pushl %0 \n\t"
+ "popfl \n\t"
+ :
+ :"g" (state)
+ :"memory", "cc"
+ );
+}
+
+#elif __V3_64BIT__
+
+static addr_t __inline__ v3_irq_save() {
+ addr_t state;
+
+ __asm__ __volatile__ ("pushfq \n\t"
+ "popq %0 \n\t"
+ "cli \n\t"
+ :"=g" (state)
+ :
+ :"memory"
+ );
+
+ return state;
+}
+
+
+static void __inline__ v3_irq_restore(addr_t state) {
+ __asm__ __volatile__("pushq %0 \n\t"
+ "popfq \n\t"
+ :
+ :"g" (state)
+ :"memory", "cc"
+ );
+}
+
+#endif
--- /dev/null
+/*
+ * 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".
+ */
+
+#include <palacios/vmm.h>
+#include <palacios/vmm_lock.h>
+#include <palacios/vmm_lowlevel.h>
+
+
+extern struct v3_os_hooks * os_hooks;
+
+
+int v3_lock_init(v3_lock_t * lock) {
+ *lock = (addr_t)(os_hooks->mutex_alloc());
+
+ if (!(*lock)) {
+ return -1;
+ }
+
+ return 0;
+}
+
+
+void v3_lock_deinit(v3_lock_t * lock) {
+ os_hooks->mutex_free((void *)*lock);
+ *lock = 0;
+}
+
+void v3_lock(v3_lock_t lock) {
+ os_hooks->mutex_lock((void *)lock, 0);
+}
+
+void v3_unlock(v3_lock_t lock) {
+ os_hooks->mutex_unlock((void *)lock);
+}
+
+addr_t v3_lock_irqsave(v3_lock_t lock) {
+ addr_t irq_state = v3_irq_save();
+ os_hooks->mutex_lock((void *)lock, 1);
+ return irq_state;
+}
+
+
+void v3_unlock_irqrestore(v3_lock_t lock, addr_t irq_state) {
+ os_hooks->mutex_unlock((void *)lock);
+ v3_irq_restore(irq_state);
+}