Skip to content
  • Charlie Jacobsen's avatar
    Basic lcd module create, run, and destroy. · e0193fa4
    Charlie Jacobsen authored and Vikram Narayanan's avatar Vikram Narayanan committed
    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
    e0193fa4