#include <linux/uaccess.h>
#include <asm/irq_vectors.h>
#include <asm/io.h>
+#include <asm/thread_info.h>
#include <linux/init.h>
#include <linux/module.h>
// this function is used extensively throughout palacios and the linux
// module, both in places where interrupts are off and where they are on
// a GFP_KERNEL call, when done with interrupts off can lead to DEADLOCK
- if (irqs_disabled()) {
+ if (irqs_disabled() || in_atomic()) {
return palacios_alloc_extended(size,GFP_ATOMIC,-1);
} else {
return palacios_alloc_extended(size,GFP_KERNEL,-1);
/**
* Runs a function on the specified CPU.
*/
-static void
+void
palacios_xcall(
int cpu_id,
void (*fn)(void *arg),
void palacios_used_fpu(void)
{
- struct thread_info *cur = current_thread_info();
-
// We assume we are not preemptible here...
- cur->status |= TS_USEDFPU;
+#ifndef TS_USEDFPU
+ struct task_struct *tsk = current;
+ tsk->thread.fpu.has_fpu = 1;
+#else
+ struct thread_info *cur = current_thread_info();
+ cur->status |= TS_USEDFPU;
+#endif
clts();
// After this, FP Save should be handled by Linux if it
// switches to a different task and that task uses FPU
.print = palacios_print_scoped,
.allocate_pages = palacios_allocate_pages,
.free_pages = palacios_free_pages,
+ .vmalloc = palacios_valloc,
+ .vfree = palacios_vfree,
.malloc = palacios_alloc,
.free = palacios_free,
.vaddr_to_paddr = palacios_vaddr_to_paddr,