mirror of
https://github.com/xen-project/xen.git
synced 2026-10-28 10:11:27 +01:00
bitkeeper revision 1.547 (3fa3dd2aH8eamu3ONvYovJgq8wBNbQ)
Many files: Fixes to the DOM0 interface and domain building code. Ready for new save/restore dom0_ops.
This commit is contained in:
1 parent
c08bd7088d
commit
9575c0e70f
10 files changed
+124
-91
No files matched your search
+14
-13
@@ -146,7 +146,8 @@ static int copy_to_domain_page(unsigned long dst_pfn, void *src_page)
|
||||
|
||||
static int setup_guestos(
|
||||
int dom, int kernel_fd, int initrd_fd, unsigned long tot_pages,
|
||||
unsigned long virt_load_addr, size_t ksize, dom_meminfo_t *meminfo)
|
||||
unsigned long virt_load_addr, size_t ksize,
|
||||
dom0_builddomain_t *builddomain)
|
||||
{
|
||||
l1_pgentry_t *vl1tab = NULL, *vl1e = NULL;
|
||||
l2_pgentry_t *vl2tab = NULL, *vl2e = NULL;
|
||||
@@ -158,7 +159,7 @@ static int setup_guestos(
|
||||
unsigned long num_pgt_updates = 0;
|
||||
unsigned long count, pt_start, i, j;
|
||||
|
||||
memset(meminfo, 0, sizeof(*meminfo));
|
||||
memset(builddomain, 0, sizeof(*builddomain));
|
||||
|
||||
if ( init_pfn_mapper() < 0 )
|
||||
goto error_out;
|
||||
@@ -211,8 +212,8 @@ static int setup_guestos(
|
||||
}
|
||||
|
||||
/* 'i' is 'ksize' rounded up to a page boundary. */
|
||||
meminfo->virt_mod_addr = virt_load_addr + i;
|
||||
meminfo->virt_mod_len = isize;
|
||||
builddomain->virt_mod_addr = virt_load_addr + i;
|
||||
builddomain->virt_mod_len = isize;
|
||||
|
||||
for ( j = 0; j < isize; j += PAGE_SIZE, i += PAGE_SIZE )
|
||||
{
|
||||
@@ -245,7 +246,7 @@ static int setup_guestos(
|
||||
*/
|
||||
l2tab = page_array[alloc_index] << PAGE_SHIFT;
|
||||
alloc_index--;
|
||||
meminfo->l2_pgt_addr = l2tab;
|
||||
builddomain->l2_pgt_addr = l2tab;
|
||||
|
||||
/*
|
||||
* Pin down l2tab addr as page dir page - causes hypervisor to provide
|
||||
@@ -307,7 +308,7 @@ static int setup_guestos(
|
||||
num_pgt_updates++;
|
||||
}
|
||||
|
||||
meminfo->virt_startinfo_addr =
|
||||
builddomain->virt_startinfo_addr =
|
||||
virt_load_addr + ((alloc_index-1)<<PAGE_SHIFT);
|
||||
|
||||
/* Send the page update requests down to the hypervisor. */
|
||||
@@ -397,17 +398,17 @@ int main(int argc, char **argv)
|
||||
}
|
||||
|
||||
if ( setup_guestos(domain_id, kernel_fd, initrd_fd, tot_pages,
|
||||
load_addr, ksize, &launch_op.u.meminfo) < 0 )
|
||||
load_addr, ksize, &launch_op.u.builddomain) < 0 )
|
||||
return 1;
|
||||
|
||||
if ( initrd_fd >= 0 )
|
||||
close(initrd_fd);
|
||||
close(kernel_fd);
|
||||
|
||||
launch_op.u.meminfo.domain = domain_id;
|
||||
launch_op.u.meminfo.virt_load_addr = load_addr;
|
||||
launch_op.u.meminfo.num_vifs = atoi(argv[3]);
|
||||
launch_op.u.meminfo.cmd_line[0] = '\0';
|
||||
launch_op.u.builddomain.domain = domain_id;
|
||||
launch_op.u.builddomain.virt_load_addr = load_addr;
|
||||
launch_op.u.builddomain.num_vifs = atoi(argv[3]);
|
||||
launch_op.u.builddomain.cmd_line[0] = '\0';
|
||||
cmd_len = 0;
|
||||
for ( count = args_start; count < argc; count++ )
|
||||
{
|
||||
@@ -416,8 +417,8 @@ int main(int argc, char **argv)
|
||||
ERROR("Size of image boot params too big!\n");
|
||||
break;
|
||||
}
|
||||
strcat(launch_op.u.meminfo.cmd_line, argv[count]);
|
||||
strcat(launch_op.u.meminfo.cmd_line, " ");
|
||||
strcat(launch_op.u.builddomain.cmd_line, argv[count]);
|
||||
strcat(launch_op.u.builddomain.cmd_line, " ");
|
||||
cmd_len += strlen(argv[count] + 1);
|
||||
}
|
||||
|
||||
|
||||
@@ -10,7 +10,7 @@ static int start_domain(int id)
|
||||
dom0_op_t op;
|
||||
|
||||
op.cmd = DOM0_STARTDOMAIN;
|
||||
op.u.meminfo.domain = id;
|
||||
op.u.startdomain.domain = id;
|
||||
|
||||
err = do_dom0_op(&op);
|
||||
|
||||
|
||||
@@ -10,7 +10,7 @@ static int stop_domain(int id)
|
||||
dom0_op_t op;
|
||||
|
||||
op.cmd = DOM0_STOPDOMAIN;
|
||||
op.u.meminfo.domain = id;
|
||||
op.u.stopdomain.domain = id;
|
||||
|
||||
err = do_dom0_op(&op);
|
||||
|
||||
|
||||
@@ -7,9 +7,9 @@ LD := ld
|
||||
MONITOR_BASE := 0xFC500000
|
||||
# Bootloader should load monitor to this real address
|
||||
LOAD_BASE := 0x00100000
|
||||
CFLAGS := -nostdinc -fno-builtin -O3 -Wall -DMONITOR_BASE=$(MONITOR_BASE)
|
||||
#CFLAGS := -nostdinc -fno-builtin -O3 -Wall -DMONITOR_BASE=$(MONITOR_BASE)
|
||||
CFLAGS += -fomit-frame-pointer -I$(BASEDIR)/include -D__KERNEL__ -DNDEBUG
|
||||
#CFLAGS += -fomit-frame-pointer -I$(BASEDIR)/include -D__KERNEL__
|
||||
CFLAGS += -fomit-frame-pointer -I$(BASEDIR)/include -D__KERNEL__
|
||||
LDFLAGS := -T xeno.lds -N
|
||||
|
||||
|
||||
+31
-5
@@ -97,11 +97,11 @@ long do_dom0_op(dom0_op_t *u_dom0_op)
|
||||
|
||||
case DOM0_BUILDDOMAIN:
|
||||
{
|
||||
struct task_struct * p = find_domain_by_id(op.u.meminfo.domain);
|
||||
struct task_struct * p = find_domain_by_id(op.u.builddomain.domain);
|
||||
ret = -EINVAL;
|
||||
if ( p != NULL )
|
||||
{
|
||||
if ( (ret = final_setup_guestos(p, &op.u.meminfo)) == 0 )
|
||||
if ( (ret = final_setup_guestos(p, &op.u.builddomain)) == 0 )
|
||||
ret = p->domain;
|
||||
put_task_struct(p);
|
||||
}
|
||||
@@ -110,7 +110,7 @@ long do_dom0_op(dom0_op_t *u_dom0_op)
|
||||
|
||||
case DOM0_STARTDOMAIN:
|
||||
{
|
||||
struct task_struct * p = find_domain_by_id(op.u.meminfo.domain);
|
||||
struct task_struct * p = find_domain_by_id(op.u.startdomain.domain);
|
||||
ret = -EINVAL;
|
||||
if ( p != NULL )
|
||||
{
|
||||
@@ -127,7 +127,7 @@ long do_dom0_op(dom0_op_t *u_dom0_op)
|
||||
|
||||
case DOM0_STOPDOMAIN:
|
||||
{
|
||||
ret = stop_other_domain(op.u.meminfo.domain);
|
||||
ret = stop_other_domain(op.u.stopdomain.domain);
|
||||
}
|
||||
break;
|
||||
|
||||
@@ -268,12 +268,38 @@ long do_dom0_op(dom0_op_t *u_dom0_op)
|
||||
op.u.getdominfo.mcu_advance = p->mcu_advance;
|
||||
op.u.getdominfo.tot_pages = p->tot_pages;
|
||||
op.u.getdominfo.cpu_time = p->cpu_time;
|
||||
memcpy(&op.u.getdominfo.ctxt,
|
||||
&p->shared_info->execution_context,
|
||||
sizeof(execution_context_t));
|
||||
}
|
||||
|
||||
read_unlock_irqrestore(&tasklist_lock, flags);
|
||||
copy_to_user(u_dom0_op, &op, sizeof(op));
|
||||
break;
|
||||
}
|
||||
break;
|
||||
|
||||
case DOM0_GETPAGEFRAMEINFO:
|
||||
{
|
||||
struct pfn_info *page = frame_table + op.u.getpageframeinfo.pfn;
|
||||
|
||||
op.u.getpageframeinfo.domain = page->flags & PG_domain_mask;
|
||||
op.u.getpageframeinfo.type = NONE;
|
||||
if ( page->type_count & REFCNT_PIN_BIT )
|
||||
{
|
||||
switch ( page->flags & PG_type_mask )
|
||||
{
|
||||
case PGT_l1_page_table:
|
||||
op.u.getpageframeinfo.type = L1TAB;
|
||||
break;
|
||||
case PGT_l2_page_table:
|
||||
op.u.getpageframeinfo.type = L2TAB;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
copy_to_user(u_dom0_op, &op, sizeof(op));
|
||||
}
|
||||
break;
|
||||
|
||||
case DOM0_IOPL:
|
||||
{
|
||||
|
||||
+17
-43
@@ -343,9 +343,8 @@ void release_task(struct task_struct *p)
|
||||
* <one page>
|
||||
*/
|
||||
|
||||
int final_setup_guestos(struct task_struct * p, dom_meminfo_t * meminfo)
|
||||
int final_setup_guestos(struct task_struct *p, dom0_builddomain_t *builddomain)
|
||||
{
|
||||
l2_pgentry_t * l2tab;
|
||||
start_info_t * virt_startinfo_addr;
|
||||
unsigned long virt_stack_addr;
|
||||
unsigned long phys_l2tab;
|
||||
@@ -356,28 +355,18 @@ int final_setup_guestos(struct task_struct * p, dom_meminfo_t * meminfo)
|
||||
if ( (p->flags & PF_CONSTRUCTED) )
|
||||
return -EINVAL;
|
||||
|
||||
/* High entries in page table must contain hypervisor
|
||||
* mem mappings - set them up.
|
||||
*/
|
||||
phys_l2tab = meminfo->l2_pgt_addr;
|
||||
l2tab = map_domain_mem(phys_l2tab);
|
||||
memcpy(&l2tab[DOMAIN_ENTRIES_PER_L2_PAGETABLE],
|
||||
&idle_pg_table[DOMAIN_ENTRIES_PER_L2_PAGETABLE],
|
||||
(ENTRIES_PER_L2_PAGETABLE - DOMAIN_ENTRIES_PER_L2_PAGETABLE)
|
||||
* sizeof(l2_pgentry_t));
|
||||
l2tab[PERDOMAIN_VIRT_START >> L2_PAGETABLE_SHIFT] =
|
||||
mk_l2_pgentry(__pa(p->mm.perdomain_pt) | __PAGE_HYPERVISOR);
|
||||
l2tab[LINEAR_PT_VIRT_START >> L2_PAGETABLE_SHIFT] =
|
||||
mk_l2_pgentry(phys_l2tab | __PAGE_HYPERVISOR);
|
||||
/* NB. Page base must already be pinned! */
|
||||
phys_l2tab = builddomain->l2_pgt_addr;
|
||||
p->mm.pagetable = mk_pagetable(phys_l2tab);
|
||||
unmap_domain_mem(l2tab);
|
||||
get_page_type(&frame_table[phys_l2tab>>PAGE_SHIFT]);
|
||||
get_page_tot(&frame_table[phys_l2tab>>PAGE_SHIFT]);
|
||||
|
||||
/* set up the shared info structure */
|
||||
update_dom_time(p->shared_info);
|
||||
p->shared_info->domain_time = 0;
|
||||
|
||||
/* we pass start info struct to guest os as function parameter on stack */
|
||||
virt_startinfo_addr = (start_info_t *)meminfo->virt_startinfo_addr;
|
||||
virt_startinfo_addr = (start_info_t *)builddomain->virt_startinfo_addr;
|
||||
virt_stack_addr = (unsigned long)virt_startinfo_addr;
|
||||
|
||||
/* we need to populate start_info struct within the context of the
|
||||
@@ -390,19 +379,19 @@ int final_setup_guestos(struct task_struct * p, dom_meminfo_t * meminfo)
|
||||
memset(virt_startinfo_addr, 0, sizeof(*virt_startinfo_addr));
|
||||
virt_startinfo_addr->nr_pages = p->tot_pages;
|
||||
virt_startinfo_addr->shared_info = virt_to_phys(p->shared_info);
|
||||
virt_startinfo_addr->pt_base = meminfo->virt_load_addr +
|
||||
virt_startinfo_addr->pt_base = builddomain->virt_load_addr +
|
||||
((p->tot_pages - 1) << PAGE_SHIFT);
|
||||
|
||||
/* module size and length */
|
||||
|
||||
virt_startinfo_addr->mod_start = meminfo->virt_mod_addr;
|
||||
virt_startinfo_addr->mod_len = meminfo->virt_mod_len;
|
||||
virt_startinfo_addr->mod_start = builddomain->virt_mod_addr;
|
||||
virt_startinfo_addr->mod_len = builddomain->virt_mod_len;
|
||||
|
||||
virt_startinfo_addr->dom_id = p->domain;
|
||||
virt_startinfo_addr->flags = IS_PRIV(p) ? SIF_PRIVILEGED : 0;
|
||||
|
||||
/* Add virtual network interfaces and point to them in startinfo. */
|
||||
while (meminfo->num_vifs-- > 0) {
|
||||
while (builddomain->num_vifs-- > 0) {
|
||||
net_vif = create_net_vif(p->domain);
|
||||
shared_rings = net_vif->shared_rings;
|
||||
if (!shared_rings) panic("no network ring!\n");
|
||||
@@ -421,7 +410,7 @@ int final_setup_guestos(struct task_struct * p, dom_meminfo_t * meminfo)
|
||||
virt_startinfo_addr->blk_ring = virt_to_phys(p->blk_ring_base);
|
||||
|
||||
/* Copy the command line */
|
||||
strcpy(virt_startinfo_addr->cmd_line, meminfo->cmd_line);
|
||||
strcpy(virt_startinfo_addr->cmd_line, builddomain->cmd_line);
|
||||
|
||||
/* Reinstate the caller's page tables. */
|
||||
__asm__ __volatile__ (
|
||||
@@ -431,7 +420,7 @@ int final_setup_guestos(struct task_struct * p, dom_meminfo_t * meminfo)
|
||||
p->flags |= PF_CONSTRUCTED;
|
||||
|
||||
new_thread(p,
|
||||
(unsigned long)meminfo->virt_load_addr,
|
||||
(unsigned long)builddomain->virt_load_addr,
|
||||
(unsigned long)virt_stack_addr,
|
||||
(unsigned long)virt_startinfo_addr);
|
||||
|
||||
@@ -571,17 +560,6 @@ int setup_guestos(struct task_struct *p, dom0_newdomain_t *params,
|
||||
unmap_domain_mem(l1start);
|
||||
|
||||
/* pages that are part of page tables must be read only */
|
||||
cur_address = list_entry(p->pg_head.next, struct pfn_info, list) -
|
||||
frame_table;
|
||||
cur_address <<= PAGE_SHIFT;
|
||||
for ( count = 0; count < alloc_index; count++ )
|
||||
{
|
||||
list_ent = frame_table[cur_address >> PAGE_SHIFT].list.next;
|
||||
cur_address = list_entry(list_ent, struct pfn_info, list) -
|
||||
frame_table;
|
||||
cur_address <<= PAGE_SHIFT;
|
||||
}
|
||||
|
||||
l2tab = l2start + l2_table_offset(virt_load_address +
|
||||
(alloc_index << PAGE_SHIFT));
|
||||
l1start = l1tab = map_domain_mem(l2_pgentry_to_phys(*l2tab));
|
||||
@@ -589,21 +567,17 @@ int setup_guestos(struct task_struct *p, dom0_newdomain_t *params,
|
||||
l2tab++;
|
||||
for ( count = alloc_index; count < p->tot_pages; count++ )
|
||||
{
|
||||
*l1tab++ = mk_l1_pgentry(l1_pgentry_val(*l1tab) & ~_PAGE_RW);
|
||||
*l1tab = mk_l1_pgentry(l1_pgentry_val(*l1tab) & ~_PAGE_RW);
|
||||
page = frame_table + l1_pgentry_to_pagenr(*l1tab);
|
||||
page->flags = dom | PGT_l1_page_table;
|
||||
page->tot_count++;
|
||||
l1tab++;
|
||||
if( !((unsigned long)l1tab & (PAGE_SIZE - 1)) )
|
||||
{
|
||||
unmap_domain_mem(l1start);
|
||||
l1start = l1tab = map_domain_mem(l2_pgentry_to_phys(*l2tab));
|
||||
l2tab++;
|
||||
}
|
||||
page = frame_table + (cur_address >> PAGE_SHIFT);
|
||||
page->flags = dom | PGT_l1_page_table;
|
||||
page->tot_count++;
|
||||
|
||||
list_ent = frame_table[cur_address >> PAGE_SHIFT].list.next;
|
||||
cur_address = list_entry(list_ent, struct pfn_info, list) -
|
||||
frame_table;
|
||||
cur_address <<= PAGE_SHIFT;
|
||||
}
|
||||
page->type_count |= REFCNT_PIN_BIT;
|
||||
page->tot_count |= REFCNT_PIN_BIT;
|
||||
|
||||
+2
-2
@@ -363,7 +363,7 @@ static int dec_page_refcnt(unsigned long page_nr, unsigned int type)
|
||||
type);
|
||||
return -1;
|
||||
}
|
||||
ASSERT(page_type_count(page) != 0);
|
||||
ASSERT((page_type_count(page) & ~REFCNT_PIN_BIT) != 0);
|
||||
put_page_tot(page);
|
||||
return put_page_type(page);
|
||||
}
|
||||
@@ -568,7 +568,7 @@ static void put_page(unsigned long page_nr, int writeable)
|
||||
page = frame_table + page_nr;
|
||||
ASSERT(DOMAIN_OKAY(page->flags));
|
||||
ASSERT((!writeable) ||
|
||||
((page_type_count(page) != 0) &&
|
||||
(((page_type_count(page) & ~REFCNT_PIN_BIT) != 0) &&
|
||||
((page->flags & PG_type_mask) == PGT_writeable_page) &&
|
||||
((page->flags & PG_need_flush) == PG_need_flush)));
|
||||
if ( writeable )
|
||||
|
||||
@@ -328,7 +328,6 @@ asmlinkage void __enter_scheduler(void)
|
||||
|
||||
/* do some accounting */
|
||||
ranfor = (s32)(now - prev->lastschd);
|
||||
ASSERT((ranfor>0));
|
||||
prev->cpu_time += ranfor;
|
||||
|
||||
/* calculate mcu and update avt */
|
||||
|
||||
@@ -10,23 +10,13 @@
|
||||
#ifndef __DOM0_OPS_H__
|
||||
#define __DOM0_OPS_H__
|
||||
|
||||
#define DOM0_GETMEMLIST 2
|
||||
#define DOM0_BVTCTL 6
|
||||
#define DOM0_ADJUSTDOM 7
|
||||
#define DOM0_CREATEDOMAIN 8
|
||||
#define DOM0_DESTROYDOMAIN 9
|
||||
#define DOM0_STARTDOMAIN 10
|
||||
#define DOM0_STOPDOMAIN 11
|
||||
#define DOM0_GETDOMAININFO 12
|
||||
#define DOM0_BUILDDOMAIN 13
|
||||
#define DOM0_IOPL 14
|
||||
#define DOM0_MSR 15
|
||||
#define DOM0_DEBUG 16
|
||||
#define DOM0_SETTIME 17
|
||||
#include "hypervisor-if.h"
|
||||
|
||||
|
||||
#define MAX_CMD_LEN 256
|
||||
#define MAX_DOMAIN_NAME 16
|
||||
|
||||
#define DOM0_CREATEDOMAIN 8
|
||||
typedef struct dom0_newdomain_st
|
||||
{
|
||||
/* IN parameters. */
|
||||
@@ -36,12 +26,29 @@ typedef struct dom0_newdomain_st
|
||||
unsigned int domain;
|
||||
} dom0_newdomain_t;
|
||||
|
||||
#define DOM0_STARTDOMAIN 10
|
||||
typedef struct dom0_startdomain_st
|
||||
{
|
||||
/* IN parameters. */
|
||||
unsigned int domain;
|
||||
} dom0_startdomain_t;
|
||||
|
||||
#define DOM0_STOPDOMAIN 11
|
||||
typedef struct dom0_stopdomain_st
|
||||
{
|
||||
/* IN parameters. */
|
||||
unsigned int domain;
|
||||
} dom0_stopdomain_t;
|
||||
|
||||
#define DOM0_DESTROYDOMAIN 9
|
||||
typedef struct dom0_killdomain_st
|
||||
{
|
||||
/* IN variables. */
|
||||
unsigned int domain;
|
||||
int force;
|
||||
} dom0_killdomain_t;
|
||||
|
||||
#define DOM0_GETMEMLIST 2
|
||||
typedef struct dom0_getmemlist_st
|
||||
{
|
||||
/* IN variables. */
|
||||
@@ -52,8 +59,10 @@ typedef struct dom0_getmemlist_st
|
||||
unsigned long num_pfns;
|
||||
} dom0_getmemlist_t;
|
||||
|
||||
typedef struct domain_launch
|
||||
#define DOM0_BUILDDOMAIN 13
|
||||
typedef struct dom0_builddomain_st
|
||||
{
|
||||
/* IN variables. */
|
||||
unsigned int domain;
|
||||
unsigned long l2_pgt_addr;
|
||||
unsigned long virt_load_addr;
|
||||
@@ -62,22 +71,28 @@ typedef struct domain_launch
|
||||
char cmd_line[MAX_CMD_LEN];
|
||||
unsigned long virt_mod_addr;
|
||||
unsigned long virt_mod_len;
|
||||
} dom_meminfo_t;
|
||||
execution_context_t ctxt;
|
||||
} dom0_builddomain_t;
|
||||
|
||||
#define DOM0_BVTCTL 6
|
||||
typedef struct dom0_bvtctl_st
|
||||
{
|
||||
unsigned long ctx_allow; /* context switch allowance */
|
||||
/* IN variables. */
|
||||
unsigned long ctx_allow; /* context switch allowance */
|
||||
} dom0_bvtctl_t;
|
||||
|
||||
#define DOM0_ADJUSTDOM 7
|
||||
typedef struct dom0_adjustdom_st
|
||||
{
|
||||
unsigned int domain; /* domain id */
|
||||
unsigned long mcu_adv; /* mcu advance: inverse of weight */
|
||||
unsigned long warp; /* time warp */
|
||||
unsigned long warpl; /* warp limit */
|
||||
unsigned long warpu; /* unwarp time requirement */
|
||||
/* IN variables. */
|
||||
unsigned int domain; /* domain id */
|
||||
unsigned long mcu_adv; /* mcu advance: inverse of weight */
|
||||
unsigned long warp; /* time warp */
|
||||
unsigned long warpl; /* warp limit */
|
||||
unsigned long warpu; /* unwarp time requirement */
|
||||
} dom0_adjustdom_t;
|
||||
|
||||
#define DOM0_GETDOMAININFO 12
|
||||
typedef struct dom0_getdominfo_st
|
||||
{
|
||||
/* IN variables. */
|
||||
@@ -91,14 +106,27 @@ typedef struct dom0_getdominfo_st
|
||||
unsigned long mcu_advance;
|
||||
unsigned int tot_pages;
|
||||
long long cpu_time;
|
||||
execution_context_t ctxt;
|
||||
} dom0_getdominfo_t;
|
||||
|
||||
#define DOM0_GETPAGEFRAMEINFO 18
|
||||
typedef struct dom0_getpageframeinfo_st
|
||||
{
|
||||
/* IN variables. */
|
||||
unsigned long pfn; /* Machine page frame number to query. */
|
||||
/* OUT variables. */
|
||||
unsigned int domain; /* To which domain does the frame belong? */
|
||||
enum { NONE, L1TAB, L2TAB } type; /* Is the page PINNED to a type? */
|
||||
} dom0_getpageframeinfo_t;
|
||||
|
||||
#define DOM0_IOPL 14
|
||||
typedef struct dom0_iopl_st
|
||||
{
|
||||
unsigned int domain;
|
||||
unsigned int iopl;
|
||||
} dom0_iopl_t;
|
||||
|
||||
#define DOM0_MSR 15
|
||||
typedef struct dom0_msr_st
|
||||
{
|
||||
/* IN variables. */
|
||||
@@ -108,6 +136,7 @@ typedef struct dom0_msr_st
|
||||
unsigned int out1, out2;
|
||||
} dom0_msr_t;
|
||||
|
||||
#define DOM0_DEBUG 16
|
||||
typedef struct dom0_debug_st
|
||||
{
|
||||
/* IN variables. */
|
||||
@@ -121,6 +150,7 @@ typedef struct dom0_debug_st
|
||||
* Set clock such that it would read <secs,usecs> after 00:00:00 UTC,
|
||||
* 1 January, 1970 if the current system time was <system_time>.
|
||||
*/
|
||||
#define DOM0_SETTIME 17
|
||||
typedef struct dom0_settime_st
|
||||
{
|
||||
/* IN variables. */
|
||||
@@ -134,12 +164,15 @@ typedef struct dom0_op_st
|
||||
union
|
||||
{
|
||||
dom0_newdomain_t newdomain;
|
||||
dom0_startdomain_t startdomain;
|
||||
dom0_stopdomain_t stopdomain;
|
||||
dom0_killdomain_t killdomain;
|
||||
dom0_getmemlist_t getmemlist;
|
||||
dom0_bvtctl_t bvtctl;
|
||||
dom0_adjustdom_t adjustdom;
|
||||
dom_meminfo_t meminfo;
|
||||
dom0_builddomain_t builddomain;
|
||||
dom0_getdominfo_t getdominfo;
|
||||
dom0_getpageframeinfo_t getpageframeinfo;
|
||||
dom0_iopl_t iopl;
|
||||
dom0_msr_t msr;
|
||||
dom0_debug_t debug;
|
||||
|
||||
@@ -223,7 +223,7 @@ extern int setup_guestos(
|
||||
struct task_struct *p, dom0_newdomain_t *params, unsigned int num_vifs,
|
||||
char *data_start, unsigned long data_len,
|
||||
char *cmdline, unsigned long initrd_len);
|
||||
extern int final_setup_guestos(struct task_struct *p, dom_meminfo_t *);
|
||||
extern int final_setup_guestos(struct task_struct *p, dom0_builddomain_t *);
|
||||
|
||||
struct task_struct *find_domain_by_id(unsigned int dom);
|
||||
extern void release_task(struct task_struct *);
|
||||
|
||||