- 25 Oct, 2016 24 commits
-
-
Charlie Jacobsen authored
This code is ugly, but it's working. Tested with basic module, and appears to be working properly. I will soon incorporate the patched modprobe into the kernel tree, and then this code will be usable by everyone. The ipc code is still unimplemented. The only hypercall handled is yield. Also note that other exit conditions (e.g. external interrupt) have not been fully tested. Overview: -- kernel code calls lcd_create_as_module with the module's name -- lcd_create_as_module loads the module using request_lcd_module (request_lcd_module calls the patched modprobe to load the module, and the patched modprobe calls back into the lcd driver via the ioctrl interface to load the module) -- lcd_create_as_module then finds the loaded module, spawns a kernel thread and passes off the module to it -- the kernel thread initializes the lcd and maps the module inside it, then suspends itself -- lcd_run_as_module wakes up the kernel thread and tells it to run -- lcd_delete_as_module stops the kernel thread and deletes the module from the host kernel File-by-file details: arch/x86/include/asm/lcd-domains-arch.h arch/x86/lcd-domains/lcd-domains-arch-tests.c arch/x86/lcd-domains/lcd-domains-arch.c -- lcd was not running in 64-bit mode, and my checks had one subtle bug -- fixed %cr3 load to properly load vmcs first -- fixed set program counter to use guest virtual rather than guest physical address include/linux/sched.h -- added struct lcd to task_struct include/linux/init_task.h -- lcd pointer set to null when task_struct is initialized include/linux/module.h kernel/module.c -- made init_module and delete_module system calls callable from kernel code -- available in module.h via do_sys_init_module and do_sys_delete_module -- simply moved the majority of the guts of the system calls into a non-system call, exported routine -- take an extra flag, for_lcd; when set, the init code skips over running (and deallocating) the module's init code, and the delete code skips over running the module exit -- system calls from user code set for_lcd = 0; this ensures existing code still works include/linux/kmod.h kernel/kmod.c kernel/sysctl.c -- changed __request_module to __do_request_module; takes one extra argument, for_lcd -- __request_module ==> __do_request_module with for_lcd = 0 -- request_lcd_module ==> __do_request_module with for_lcd = 1 -- call_modprobe conditionally uses lcd_modprobe_path, the path to a patched modprobe accessible via sysfs include/lcd-domains/lcd-domains.h -- added lcd status enum; see source code doc -- three routines for creating/running/destroying lcd's that use modules; see source code doc include/uapi/linux/lcd-domains.h -- added interface defns for patched modprobe to call into lcd driver for module init; lcd driver loads module (via slightly refactored module.c code) on behalf of modprobe virt/lcd-domains/lcd-domains.c -- implementation of routines for modules inside lcd's -- implementation of module init / delete for lcd's (uses patched module.c code) virt/lcd-domains/Kconfig virt/lcd-domains/Makefile virt/lcd-domains/lcd-module-load-test.c virt/lcd-domains/lcd-tests.c -- added test module for lcd module code -- test runs automatically when lcd module is inserted
-
Charles Jacobsen authored
In the process of debugging, major corrections and debug checks implemented (this is a big squash): -- coded up entry checks documented in Intel SDM V3 chp 26 (this should help later if settings are changed, make it less risky to experiment and give more confidence) -- fixed host tr base addr bug (the worst bug! caused system to hang and then crash, since the tss was erroneous...) -- fixed vmx_entry to properly set host rsp before entry -- setting host sysenter and idt info -- fixed cs ar bytes bug -- fixed gdt limit bug -- fixed tr type bug -- extra settings added to cr0 and cr4, but may not be needed ... (debug fix attempt) -- lstar mstar autoload, may not be needed ... (debug fix attempt)
-
Charles Jacobsen authored
Fixed (another) nasty casting bug in the code that initializes the ept pointer. I was using the old way of casting, and overlooking that I was storing a host virtual pointer inside a host physical pointer. This caused invept to fail (invept checks if the eptp is valid). I also fixed invept and invvpid to print an error message (like vmload and vmclear), rather than generate an invalid opcode exception. It's easier to debug and understand the problem. In the future, we could more carefully parse the error returned.
-
Charles Jacobsen authored
-
Charlie Jacobsen authored
-
Charles Jacobsen authored
Nasty casting bug. (I should create separate types for gpa, hpa, hva, gva...).
-
Charles Jacobsen authored
-
Charles Jacobsen authored
-
Charlie Jacobsen authored
Updated tests.
-
Charles Jacobsen authored
-
Charles Jacobsen authored
-
Charlie Jacobsen authored
-
Charles Jacobsen authored
Added pgd_pfn to asm/pgtables.h.
-
Charlie Jacobsen authored
-
Charles Jacobsen authored
I needed to mask off the flags in the lower part of the pte ...
-
Charles Jacobsen authored
-
Charlie Jacobsen authored
-
Charles Jacobsen authored
-
Charlie Jacobsen authored
For paging mem allocation.
-
Charles Jacobsen authored
-
Charlie Jacobsen authored
-
Charlie Jacobsen authored
-
Charles Jacobsen authored
Pushing in case of crash ...
-
Charlie Jacobsen authored
-