mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2025-01-10 07:00:48 +00:00
Move register setup into i386_core.c
Move setup_regs() to lguest_arch_setup_regs() in i386_core.c given that this is very architecture specific. Signed-off-by: Jes Sorensen <jes@sgi.com> Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
This commit is contained in:
parent
511801dc31
commit
d612cde060
@ -199,6 +199,7 @@ void lguest_arch_run_guest(struct lguest *lg);
|
|||||||
void lguest_arch_handle_trap(struct lguest *lg);
|
void lguest_arch_handle_trap(struct lguest *lg);
|
||||||
int lguest_arch_init_hypercalls(struct lguest *lg);
|
int lguest_arch_init_hypercalls(struct lguest *lg);
|
||||||
int lguest_arch_do_hcall(struct lguest *lg, struct hcall_args *args);
|
int lguest_arch_do_hcall(struct lguest *lg, struct hcall_args *args);
|
||||||
|
void lguest_arch_setup_regs(struct lguest *lg, unsigned long start);
|
||||||
|
|
||||||
/* <arch>/switcher.S: */
|
/* <arch>/switcher.S: */
|
||||||
extern char start_switcher_text[], end_switcher_text[], switch_to_guest[];
|
extern char start_switcher_text[], end_switcher_text[], switch_to_guest[];
|
||||||
|
@ -9,37 +9,6 @@
|
|||||||
#include <linux/fs.h>
|
#include <linux/fs.h>
|
||||||
#include "lg.h"
|
#include "lg.h"
|
||||||
|
|
||||||
/*L:030 setup_regs() doesn't really belong in this file, but it gives us an
|
|
||||||
* early glimpse deeper into the Host so it's worth having here.
|
|
||||||
*
|
|
||||||
* Most of the Guest's registers are left alone: we used get_zeroed_page() to
|
|
||||||
* allocate the structure, so they will be 0. */
|
|
||||||
static void setup_regs(struct lguest_regs *regs, unsigned long start)
|
|
||||||
{
|
|
||||||
/* There are four "segment" registers which the Guest needs to boot:
|
|
||||||
* The "code segment" register (cs) refers to the kernel code segment
|
|
||||||
* __KERNEL_CS, and the "data", "extra" and "stack" segment registers
|
|
||||||
* refer to the kernel data segment __KERNEL_DS.
|
|
||||||
*
|
|
||||||
* The privilege level is packed into the lower bits. The Guest runs
|
|
||||||
* at privilege level 1 (GUEST_PL).*/
|
|
||||||
regs->ds = regs->es = regs->ss = __KERNEL_DS|GUEST_PL;
|
|
||||||
regs->cs = __KERNEL_CS|GUEST_PL;
|
|
||||||
|
|
||||||
/* The "eflags" register contains miscellaneous flags. Bit 1 (0x002)
|
|
||||||
* is supposed to always be "1". Bit 9 (0x200) controls whether
|
|
||||||
* interrupts are enabled. We always leave interrupts enabled while
|
|
||||||
* running the Guest. */
|
|
||||||
regs->eflags = 0x202;
|
|
||||||
|
|
||||||
/* The "Extended Instruction Pointer" register says where the Guest is
|
|
||||||
* running. */
|
|
||||||
regs->eip = start;
|
|
||||||
|
|
||||||
/* %esi points to our boot information, at physical address 0, so don't
|
|
||||||
* touch it. */
|
|
||||||
}
|
|
||||||
|
|
||||||
/*L:310 To send DMA into the Guest, the Launcher needs to be able to ask for a
|
/*L:310 To send DMA into the Guest, the Launcher needs to be able to ask for a
|
||||||
* DMA buffer. This is done by writing LHREQ_GETDMA and the key to
|
* DMA buffer. This is done by writing LHREQ_GETDMA and the key to
|
||||||
* /dev/lguest. */
|
* /dev/lguest. */
|
||||||
@ -214,11 +183,7 @@ static int initialize(struct file *file, const unsigned long __user *input)
|
|||||||
|
|
||||||
/* Now we initialize the Guest's registers, handing it the start
|
/* Now we initialize the Guest's registers, handing it the start
|
||||||
* address. */
|
* address. */
|
||||||
setup_regs(lg->regs, args[3]);
|
lguest_arch_setup_regs(lg, args[3]);
|
||||||
|
|
||||||
/* There are a couple of GDT entries the Guest expects when first
|
|
||||||
* booting. */
|
|
||||||
setup_guest_gdt(lg);
|
|
||||||
|
|
||||||
/* The timer for lguest's clock needs initialization. */
|
/* The timer for lguest's clock needs initialization. */
|
||||||
init_clockdev(lg);
|
init_clockdev(lg);
|
||||||
|
@ -535,3 +535,39 @@ int lguest_arch_init_hypercalls(struct lguest *lg)
|
|||||||
/* Now we've examined the hypercall code; our Guest can make requests. There
|
/* Now we've examined the hypercall code; our Guest can make requests. There
|
||||||
* is one other way we can do things for the Guest, as we see in
|
* is one other way we can do things for the Guest, as we see in
|
||||||
* emulate_insn(). :*/
|
* emulate_insn(). :*/
|
||||||
|
|
||||||
|
/*L:030 lguest_arch_setup_regs()
|
||||||
|
*
|
||||||
|
* Most of the Guest's registers are left alone: we used get_zeroed_page() to
|
||||||
|
* allocate the structure, so they will be 0. */
|
||||||
|
void lguest_arch_setup_regs(struct lguest *lg, unsigned long start)
|
||||||
|
{
|
||||||
|
struct lguest_regs *regs = lg->regs;
|
||||||
|
|
||||||
|
/* There are four "segment" registers which the Guest needs to boot:
|
||||||
|
* The "code segment" register (cs) refers to the kernel code segment
|
||||||
|
* __KERNEL_CS, and the "data", "extra" and "stack" segment registers
|
||||||
|
* refer to the kernel data segment __KERNEL_DS.
|
||||||
|
*
|
||||||
|
* The privilege level is packed into the lower bits. The Guest runs
|
||||||
|
* at privilege level 1 (GUEST_PL).*/
|
||||||
|
regs->ds = regs->es = regs->ss = __KERNEL_DS|GUEST_PL;
|
||||||
|
regs->cs = __KERNEL_CS|GUEST_PL;
|
||||||
|
|
||||||
|
/* The "eflags" register contains miscellaneous flags. Bit 1 (0x002)
|
||||||
|
* is supposed to always be "1". Bit 9 (0x200) controls whether
|
||||||
|
* interrupts are enabled. We always leave interrupts enabled while
|
||||||
|
* running the Guest. */
|
||||||
|
regs->eflags = 0x202;
|
||||||
|
|
||||||
|
/* The "Extended Instruction Pointer" register says where the Guest is
|
||||||
|
* running. */
|
||||||
|
regs->eip = start;
|
||||||
|
|
||||||
|
/* %esi points to our boot information, at physical address 0, so don't
|
||||||
|
* touch it. */
|
||||||
|
/* There are a couple of GDT entries the Guest expects when first
|
||||||
|
* booting. */
|
||||||
|
|
||||||
|
setup_guest_gdt(lg);
|
||||||
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user