1 #include <linux/kernel.h>
2 #include <linux/module.h>
3 #include <linux/kprobes.h>
6 #include "allow_devmem.h"
9 The purpose of this component is to disable and reenable
10 strict devmem control.
12 On kernels compiled with CONFIG_STRICT_DEVMEM, /dev/mem access
13 from user space is limited to the first 1 MB and to non-memory
14 regions (ie, devices). For various purposes in Palacios,
15 for example linux_usr/v3_guest_mem.[ch], we want to allow
16 host user space access to guest memory via mmap.
18 This borrows from Dave Anderson @ Red Hat's implementation
21 #define DEVMEM_CHECK_FUNC "devmem_is_allowed"
23 static enum { NOTRUN=0, OPEN, SET, NOTSET } devmem_state = NOTRUN;
26 // this is invoked after return from devmem_is_allowed()
27 static int devmem_ret_handler(struct kretprobe_instance *ri,
30 regs->ax = 1; // yes, it's allowed - "ax" now means "rax"
34 static struct kretprobe devmem_kretprobe = {
35 .handler = devmem_ret_handler,
36 .maxactive = 20 // up to 20 at a time
40 int palacios_allow_devmem(void)
42 #ifndef CONFIG_STRICT_DEVMEM
43 INFO("System already has open /dev/mem - doing nothing\n");
47 switch (devmem_state) {
52 devmem_kretprobe.kp.symbol_name = DEVMEM_CHECK_FUNC;
54 rc = register_kretprobe(&devmem_kretprobe);
57 ERROR("register_kretprobe failed, returned %d\n", rc);
62 INFO("/dev/mem is now enabled (probe at %p)\n",devmem_kretprobe.kp.addr);
77 int palacios_restore_devmem(void)
79 #ifndef CONFIG_STRICT_DEVMEM
80 INFO("System already has open /dev/mem - doing nothing\n");
84 switch (devmem_state) {
86 ERROR("Ignoring disable of dev mem\n");
89 INFO("/dev/mem not explicitly enabled, ignoring restore request\n");
95 unregister_kretprobe(&devmem_kretprobe);
97 if (devmem_kretprobe.nmissed>0) {
98 ERROR("Note: missed %d instances of %s\n",
99 devmem_kretprobe.nmissed, DEVMEM_CHECK_FUNC);
104 INFO("Restored strict /dev/mem access\n");