diff options
author | rn@wyvis.research.intel-research.net <rn@wyvis.research.intel-research.net> | 2003-03-14 15:48:09 +0000 |
---|---|---|
committer | rn@wyvis.research.intel-research.net <rn@wyvis.research.intel-research.net> | 2003-03-14 15:48:09 +0000 |
commit | d9812e47d9c20b15dbb920cc451eff1c7b88e81c (patch) | |
tree | 20bac2c5d016fc3b916b1d18f52d0ba1f924251d | |
parent | a16eb6b1a16f60f8616b37996d6da32fcdcfecec (diff) | |
download | xen-d9812e47d9c20b15dbb920cc451eff1c7b88e81c.tar.gz xen-d9812e47d9c20b15dbb920cc451eff1c7b88e81c.tar.bz2 xen-d9812e47d9c20b15dbb920cc451eff1c7b88e81c.zip |
bitkeeper revision 1.125 (3e71f9b97xoz4trwItZ94ikXgOSgOA)
BK merge and pull etc sucks
-rwxr-xr-x | .bk-to-hg | 2 | ||||
-rwxr-xr-x | .hg-to-bk | 3 | ||||
-rw-r--r-- | .rootkeys | 1 | ||||
-rw-r--r-- | xen/common/dom0_ops.c | 18 | ||||
-rw-r--r-- | xen/common/domain.c | 18 | ||||
-rw-r--r-- | xen/common/keyhandler.c | 7 | ||||
-rw-r--r-- | xen/common/perfc.c | 120 | ||||
-rw-r--r-- | xen/include/xeno/ac_timer.h | 10 | ||||
-rw-r--r-- | xen/include/xeno/perfc.h | 21 | ||||
-rw-r--r-- | xen/include/xeno/perfc_defn.h | 16 | ||||
-rw-r--r-- | xenolinux-2.4.21-pre4-sparse/arch/xeno/drivers/dom0/dom0_ops.h | 17 | ||||
-rw-r--r-- | xenolinux-2.4.21-pre4-sparse/arch/xeno/drivers/dom0/sched_ops.c | 81 |
12 files changed, 190 insertions, 124 deletions
@@ -2,6 +2,8 @@ set -e test -L old/xenolinux-2.4.16-sparse/include/asm-xeno/hypervisor-ifs rm old/xenolinux-2.4.16-sparse/include/asm-xeno/hypervisor-ifs +test -L tools/domain_builder/dom0_ops.h +rm tools/domain_builder/dom0_ops.h test -L xenolinux-2.4.21-pre4-sparse/include/asm-xeno/hypervisor-ifs rm xenolinux-2.4.21-pre4-sparse/include/asm-xeno/hypervisor-ifs (find -depth -type d -print | xargs -r rmdir 2>/dev/null) || true @@ -5,6 +5,9 @@ mkdir -p old/xenolinux-2.4.16-sparse mkdir -p old/xenolinux-2.4.16-sparse/include mkdir -p old/xenolinux-2.4.16-sparse/include/asm-xeno ln -s ../../../xen-2.4.16/include/hypervisor-ifs old/xenolinux-2.4.16-sparse/include/asm-xeno/hypervisor-ifs +mkdir -p tools +mkdir -p tools/domain_builder +ln -s ../../xenolinux-2.4.21-pre4-sparse/arch/xeno/drivers/dom0/dom0_ops.h tools/domain_builder/dom0_ops.h mkdir -p xenolinux-2.4.21-pre4-sparse mkdir -p xenolinux-2.4.21-pre4-sparse/include mkdir -p xenolinux-2.4.21-pre4-sparse/include/asm-xeno @@ -182,6 +182,7 @@ 3e4d00468-FN2VDeEHo96zxrMHK_mA tools/domain_builder/Makefile 3e4d0046SPau_y0sw2WLJz8QkqNoRA tools/domain_builder/README 3e4d0046bbdH0GsI9J_1Eb4ZQHfIiQ tools/domain_builder/dom0_defs.h +3e71f9b871pvOAxDrhxpC4N4mHkbww tools/domain_builder/dom0_ops.h 3e4d0046ouLij_CMN_j7-dUHZIBI_A tools/domain_builder/dom_builder.c 3e4d0046EKs06fY0CWDEgZQcn7DYUg tools/domain_builder/dom_kill.c 3e4d0046aPbGiRTtdWxqY5b3ytWurA tools/domain_builder/hypervisor_defs.h diff --git a/xen/common/dom0_ops.c b/xen/common/dom0_ops.c index aa7768c033..e6d54e9695 100644 --- a/xen/common/dom0_ops.c +++ b/xen/common/dom0_ops.c @@ -126,14 +126,22 @@ long do_dom0_op(dom0_op_t *u_dom0_op) } break; + case DOM0_BVTCTL: + { + unsigned long ctx_allow = op.u.bvtctl.ctx_allow; + ret = sched_bvtctl(ctx_allow); + + } + break; + case DOM0_ADJUSTDOM: { unsigned int dom = op.u.adjustdom.domain; - unsigned long mcu_adv = op.u.adjustdom.mcu_adv; - unsigned long warp = op.u.adjustdom.warp; - unsigned long warpl = op.u.adjustdom.warpl; - unsigned long warpu = op.u.adjustdom.warpu; - + unsigned long mcu_adv = op.u.adjustdom.mcu_adv; + unsigned long warp = op.u.adjustdom.warp; + unsigned long warpl = op.u.adjustdom.warpl; + unsigned long warpu = op.u.adjustdom.warpu; + if ( dom == IDLE_DOMAIN_ID ) { diff --git a/xen/common/domain.c b/xen/common/domain.c index 32bf8b7172..5fc4304c01 100644 --- a/xen/common/domain.c +++ b/xen/common/domain.c @@ -58,10 +58,11 @@ struct task_struct *do_newdomain(unsigned int dom_id, unsigned int cpu) SET_GDT_ADDRESS(p, DEFAULT_GDT_ADDRESS); p->addr_limit = USER_DS; - p->state = TASK_UNINTERRUPTIBLE; p->active_mm = &p->mm; p->num_net_vifs = 0; + sched_add_domain(p); + p->net_ring_base = (net_ring_t *)(p->shared_info + 1); INIT_LIST_HEAD(&p->pg_head); p->max_pages = p->tot_pages = 0; @@ -115,7 +116,8 @@ void kill_domain(void) } printk("Killing domain %d\n", current->domain); - current->state = TASK_DYING; + + sched_rem_domain(current); schedule(); BUG(); /* never get here */ } @@ -293,7 +295,7 @@ int final_setup_guestos(struct task_struct * p, dom_meminfo_t * meminfo) /* set up the shared info structure */ update_dom_time(p->shared_info); - p->shared_info->cpu_freq = cpu_freq; + p->shared_info->cpu_freq = cpu_freq; p->shared_info->domain_time = 0; /* we pass start info struct to guest os as function parameter on stack */ @@ -516,8 +518,8 @@ int setup_guestos(struct task_struct *p, dom0_newdomain_t *params) unmap_domain_mem(l1start); /* Set up shared info area. */ - update_dom_time(p->shared_info); - p->shared_info->cpu_freq = cpu_freq; + update_dom_time(p->shared_info); + p->shared_info->cpu_freq = cpu_freq; p->shared_info->domain_time = 0; @@ -555,7 +557,7 @@ int setup_guestos(struct task_struct *p, dom0_newdomain_t *params) #define SHIP2GUEST(_x) (virt_shinfo_address | (((unsigned long)(_x)) & 0xFFF)) virt_startinfo_address->net_rings = - (net_ring_t *)SHIP2GUEST(p->net_ring_base); + (net_ring_t *)SHIP2GUEST(p->net_ring_base); virt_startinfo_address->num_net_rings = p->num_net_vifs; /* Add block io interface */ @@ -597,7 +599,5 @@ int setup_guestos(struct task_struct *p, dom0_newdomain_t *params) void __init domain_init(void) { - printk("Initialising domains\n"); + printk("Initialising domains\n"); } - - diff --git a/xen/common/keyhandler.c b/xen/common/keyhandler.c index 12fd4e7105..e9f99fcf89 100644 --- a/xen/common/keyhandler.c +++ b/xen/common/keyhandler.c @@ -1,8 +1,6 @@ #include <xeno/keyhandler.h> #include <xeno/reboot.h> -extern void perfc_printall (u_char key, void *dev_id, struct pt_regs *regs); - #define KEY_MAX 256 #define STR_MAX 64 @@ -71,8 +69,6 @@ void halt_machine(u_char key, void *dev_id, struct pt_regs *regs) return; } - - /* XXX SMH: this is keir's fault */ static char *task_states[] = { @@ -110,6 +106,8 @@ void do_task_queues(u_char key, void *dev_id, struct pt_regs *regs) } +extern void perfc_printall (u_char key, void *dev_id, struct pt_regs *regs); +extern void perfc_reset (u_char key, void *dev_id, struct pt_regs *regs); extern void dump_timerq(u_char key, void *dev_id, struct pt_regs *regs); extern void dump_runq(u_char key, void *dev_id, struct pt_regs *regs); @@ -127,6 +125,7 @@ void initialize_keytable() add_key_handler('d', dump_registers, "dump registers"); add_key_handler('h', show_handlers, "show this message"); add_key_handler('p', perfc_printall, "print performance counters"); + add_key_handler('P', perfc_reset, "reset performance counters"); add_key_handler('q', do_task_queues, "dump task queues + guest state"); add_key_handler('r', dump_runq, "dump run queue"); add_key_handler('R', halt_machine, "reboot machine ungracefully"); diff --git a/xen/common/perfc.c b/xen/common/perfc.c index 925ac77264..cc277a914a 100644 --- a/xen/common/perfc.c +++ b/xen/common/perfc.c @@ -2,8 +2,9 @@ * xen performance counters */ +#include <xeno/lib.h> #include <xeno/smp.h> - +#include <xeno/time.h> #include <xeno/perfc.h> #include <xeno/keyhandler.h> @@ -31,74 +32,85 @@ void __perfc_print (unsigned long counter[], int offset) int num = 0; for (loop = 0; loop < sizeof(perfc_name) / sizeof(char *); loop++) { - if (perfc_name[loop][0] == 'C') { - element_size = NR_CPUS; - cpus = 1; - } else { - num = sscanf (perfc_name[loop], "[%d]", &element_size); - } + if (perfc_name[loop][0] == 'C') { + element_size = NR_CPUS; + cpus = 1; + } else { + num = sscanf (perfc_name[loop], "[%d]", &element_size); + } - total_size += element_size == 0 ? 1 : element_size; - if (total_size > offset) break; + total_size += element_size == 0 ? 1 : element_size; + if (total_size > offset) break; } if (loop == sizeof(perfc_name) / sizeof(char *)) { - printf ("error: couldn't find variable\n"); - return; + printf ("error: couldn't find variable\n"); + return; } if (element_size == 0) { /* single counter */ - printf ("%10ld 0x%08lx %s\n", counter[0], counter[0], - perfc_name[loop] + 2 + num); - } else if (cpus) { /* counter per CPU */ - for (loop = 0; loop < smp_num_cpus; loop++) { - printf ("%10ld 0x%08lx cpu[%02d] %s\n", - counter[loop], counter[loop], - loop, perfc_name[loop]); - } - + printf ("%10ld 0x%08lx %s\n", counter[0], counter[0], + perfc_name[loop] + 2 + num); + } else if (cpus) { /* counter per CPU */ + for (loop = 0; loop < smp_num_cpus; loop++) { + printf ("%10ld 0x%08lx cpu[%02d] %s\n", + counter[loop], counter[loop], + loop, perfc_name[loop]); + } + } else { /* show entire array */ - for (loop = 0; loop < element_size; loop++) { - printf ("%10ld 0x%08lx %s:%d\n", - counter[loop], counter[loop], - perfc_name[loop] + 2 + num, loop); - } + for (loop = 0; loop < element_size; loop++) { + printf ("%10ld 0x%08lx %s:%d\n", + counter[loop], counter[loop], + perfc_name[loop] + 2 + num, loop); + } } return; } void perfc_printall (u_char key, void *dev_id, struct pt_regs *regs) { - int loop, idx; - int element_size; - int cpus=0; - int num = 0; - unsigned long *counters = (unsigned long *)&perfcounters; + int loop, idx; + int element_size; + int cpus=0; + int num = 0; + s_time_t now = NOW(); + unsigned long *counters = (unsigned long *)&perfcounters; - printf ("xen performance counters\n"); + printf ("xen performance counters: now=0x%08X%08X\n", + (u32)(now>>32), (u32)now); - for (loop = 0; loop < sizeof(perfc_name) / sizeof(char *); loop++) { + for (loop = 0; loop < sizeof(perfc_name) / sizeof(char *); loop++) { - if (perfc_name[loop][0] == 'C') { - element_size = NR_CPUS; - cpus = 1; - } else { - num = sscanf (perfc_name[loop], "[%d]", &element_size); - } + if (perfc_name[loop][0] == 'C') { + element_size = NR_CPUS; + cpus = 1; + } else { + num = sscanf (perfc_name[loop], "[%d]", &element_size); + } - for (idx = 0; idx < (element_size ? element_size : 1); idx++) { - if (cpus) { - if (idx < smp_num_cpus) - printf ("%10ld 0x%08lx cpu[%02d] %s\n", - *counters, *counters, idx, perfc_name[loop] + 1); - } else if (element_size) { - printf ("%10ld 0x%08lx %s:%d\n", - *counters, *counters, perfc_name[loop] + num + 2, idx); - } else { - printf ("%10ld 0x%08lx %s\n", - *counters, *counters, perfc_name[loop] + num + 2); - } - counters++; - } - } + for (idx = 0; idx < (element_size ? element_size : 1); idx++) { + if (cpus) { + if (idx < smp_num_cpus) + printf ("%10ld 0x%08lx cpu[%02d] %s\n", + *counters, *counters, idx, perfc_name[loop] + 1); + } else if (element_size) { + printf ("%10ld 0x%08lx %s:%d\n", + *counters, *counters, perfc_name[loop] + num + 2, idx); + } else { + printf ("%10ld 0x%08lx %s\n", + *counters, *counters, perfc_name[loop] + num + 2); + } + counters++; + } + } - return; + return; } + +void perfc_reset (u_char key, void *dev_id, struct pt_regs *regs) +{ + s_time_t now = NOW(); + printk ("xen performance counters reset: now=0x%08X%08X\n", + (u32)(now>>32), (u32)now); + memset (&perfcounters, 0, sizeof(perfcounters)); +} + diff --git a/xen/include/xeno/ac_timer.h b/xen/include/xeno/ac_timer.h index 7cf568d2fc..280f377d17 100644 --- a/xen/include/xeno/ac_timer.h +++ b/xen/include/xeno/ac_timer.h @@ -43,10 +43,10 @@ */ struct ac_timer { - struct list_head timer_list; - s_time_t expires; /* system time time out value */ - unsigned long data; - void (*function)(unsigned long); + struct list_head timer_list; + s_time_t expires; /* system time time out value */ + unsigned long data; + void (*function)(unsigned long); }; /* interface for "clients" */ @@ -55,7 +55,7 @@ extern int rem_ac_timer(struct ac_timer *timer); extern int mod_ac_timer(struct ac_timer *timer, s_time_t new_time); static inline void init_ac_timer(struct ac_timer *timer) { - //timer->next = NULL; + timer->timer_list.next = NULL; } /* interface used by programmable timer, implemented hardware dependent */ diff --git a/xen/include/xeno/perfc.h b/xen/include/xeno/perfc.h index 330bb8eba9..4d0164c170 100644 --- a/xen/include/xeno/perfc.h +++ b/xen/include/xeno/perfc.h @@ -10,14 +10,18 @@ * PERFCOUNTER_ARRY (counter, string, size) define an array of counters * * unsigned long perfc_value (counter) get value of a counter + * unsigned long perfc_valuec (counter) get value of a per CPU counter * unsigned long perfc_valuea (counter, index) get value of an array counter - * void perfc_incr (counter) increment a counter - * void perfc_incrc (counter, index) increment a per CPU counter - * void perfc_incra (counter, index) increment an array counter - * void perfc_add (counter, value) add a value to a counter - * void perfc_addc (counter, value) add a value to a per CPU counter - * void perfc_adda (counter, index, value) add a value to array counter - * void perfc_print (counter) print out the counter + * unsigned long perfc_set (counter, val) set value of a counter + * unsigned long perfc_setc (counter, val) set value of a per CPU counter + * unsigned long perfc_seta (counter, index, val) set value of an array counter + * void perfc_incr (counter) increment a counter + * void perfc_incrc (counter, index) increment a per CPU counter + * void perfc_incra (counter, index) increment an array counter + * void perfc_add (counter, value) add a value to a counter + * void perfc_addc (counter, value) add a value to a per CPU counter + * void perfc_adda (counter, index, value) add a value to array counter + * void perfc_print (counter) print out the counter */ #define PERFCOUNTER( var, name ) \ @@ -38,6 +42,9 @@ extern char *perfc_name[]; #define perfc_value(x) perfcounters.x[0] #define perfc_valuec(x) perfcounters.x[smp_processor_id()] #define perfc_valuea(x,y) perfcounters.x[y] +#define perfc_set(x,v) perfcounters.x[0] = v +#define perfc_setc(x,v) perfcounters.x[smp_processor_id()] = v +#define perfc_seta(x,y,v) perfcounters.x[y] = v #define perfc_incr(x) perfcounters.x[0]++ #define perfc_incrc(x) perfcounters.x[smp_processor_id()]++ #define perfc_incra(x,y) perfcounters.x[y]++ diff --git a/xen/include/xeno/perfc_defn.h b/xen/include/xeno/perfc_defn.h index fde3e1dd72..f006079085 100644 --- a/xen/include/xeno/perfc_defn.h +++ b/xen/include/xeno/perfc_defn.h @@ -1,9 +1,13 @@ +PERFCOUNTER_CPU( irqs, "#interrupts" ) +PERFCOUNTER_CPU( irq_time, "cycles spent in irq handler" ) -PERFCOUNTER( blockio_tx, "block io: messages received from tx queue" ) -PERFCOUNTER( blockio_rx, "block io: messages sent on rx queue" ) +PERFCOUNTER( blockio_tx, "block io: messages received from tx queue" ) +PERFCOUNTER( blockio_rx, "block io: messages sent on rx queue" ) -PERFCOUNTER_CPU( apic_timer, "apic timer interrupts" ) -PERFCOUNTER_CPU( sched_irq, "sched: timer" ) -PERFCOUNTER_CPU( sched_run1, "sched: calls to schedule" ) -PERFCOUNTER_CPU( sched_run2, "sched: runs through scheduler" ) +PERFCOUNTER_CPU( apic_timer, "apic timer interrupts" ) +PERFCOUNTER_CPU( ac_timer_max, "ac_timer max error (ns)" ) +PERFCOUNTER_CPU( sched_irq, "sched: timer" ) +PERFCOUNTER_CPU( sched_run1, "sched: calls to schedule" ) +PERFCOUNTER_CPU( sched_run2, "sched: runs through scheduler" ) +PERFCOUNTER_CPU( sched_ctx, "sched: context switches" ) diff --git a/xenolinux-2.4.21-pre4-sparse/arch/xeno/drivers/dom0/dom0_ops.h b/xenolinux-2.4.21-pre4-sparse/arch/xeno/drivers/dom0/dom0_ops.h index a482d3c4d9..22ebd7aba0 100644 --- a/xenolinux-2.4.21-pre4-sparse/arch/xeno/drivers/dom0/dom0_ops.h +++ b/xenolinux-2.4.21-pre4-sparse/arch/xeno/drivers/dom0/dom0_ops.h @@ -6,6 +6,7 @@ * Copyright (c) 2002, K A Fraser, B Dragovic * * MUST BE KEPT IN SYNC WITH xen/include/xeno/dom0_ops.h + * MUST BE KEPT IN SYNC WITH tools/domain_builder/dom0_ops.h */ #define DOM0_NEWDOMAIN 0 @@ -43,16 +44,16 @@ typedef struct dom0_getmemlist_st typedef struct dom0_bvtctl_st { - unsigned long ctx_allow; /* context switch allowance */ + unsigned long ctx_allow; /* context switch allowance */ } dom0_bvtctl_t; 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 */ + 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; /* This is entirely processed by XenoLinux */ @@ -92,8 +93,8 @@ typedef struct dom0_op_st dom0_newdomain_t newdomain; dom0_killdomain_t killdomain; dom0_getmemlist_t getmemlist; - dom0_bvtctl_t bvtctl; - dom0_adjustdom_t adjustdom; + dom0_bvtctl_t bvtctl; + dom0_adjustdom_t adjustdom; dom_mem_t dommem; dom_pgupdate_t pgupdate; dom_meminfo_t meminfo; diff --git a/xenolinux-2.4.21-pre4-sparse/arch/xeno/drivers/dom0/sched_ops.c b/xenolinux-2.4.21-pre4-sparse/arch/xeno/drivers/dom0/sched_ops.c index 2408f83880..9c5fce7857 100644 --- a/xenolinux-2.4.21-pre4-sparse/arch/xeno/drivers/dom0/sched_ops.c +++ b/xenolinux-2.4.21-pre4-sparse/arch/xeno/drivers/dom0/sched_ops.c @@ -16,26 +16,33 @@ * * Commands understood by the interface: * - * S <did> <mcu advance> [ <warp> <warp limit> <unwarp limit> ] * C <context swith allowance> + * S <did> <mcu advance> <warp> <warp limit> <unwarp limit> * **************************************************************************** * $Id: c-insert.c,v 1.7 2002/11/08 16:04:34 rn Exp $ **************************************************************************** */ - +#include <linux/config.h> +#include <linux/module.h> +#include <linux/kernel.h> +#include <linux/sched.h> +#include <linux/ctype.h> +#include <linux/string.h> +#include <linux/errno.h> #include <linux/proc_fs.h> -#include <asm/hypervisor.h> + #include "dom0_ops.h" #define SCHED_ENTRY "sched" extern struct proc_dir_entry *xeno_base; static struct proc_dir_entry *sched_pde; +static unsigned char readbuf[1024]; static int sched_read_proc(char *page, char **start, off_t off, - int count, int *eof, void *data) + int count, int *eof, void *data) { strcpy(page, readbuf); *readbuf = '\0'; @@ -46,35 +53,57 @@ static int sched_read_proc(char *page, char **start, off_t off, static int sched_write_proc(struct file *file, const char *buffer, - u_long count, void *data) + u_long count, void *data) { - dom0_op_t op; + dom0_op_t op; - int ret, len; - int ts, te, tl; /* token start, end, and length */ + int ret, len; + int ts, te, tl; /* token start, end, and length */ /* Only admin can adjust scheduling parameters */ if ( !capable(CAP_SYS_ADMIN) ) return -EPERM; - /* parse the commands */ - len = count; - ts = te = 0; - - while ( count && isspace(buffer[ts]) ) { ts++; count--; } // skip spaces. - te = ts; - if ( te <= ts ) goto bad; - tl = te - ts; - - if ( strncmp(&buffer[ts], "S", tl) == 0 ) - { - op.cmd = NETWORK_OP_ADDRULE; - } - else if ( strncmp(&buffer[ts], "C", tl) == 0 ) - { - op.cmd = NETWORK_OP_DELETERULE; - } - + /* parse the commands */ + len = count; + ts = te = 0; + + while ( count && isspace(buffer[ts]) ) { ts++; count--; } /*skip spaces*/ + te = ts; + while ( count && !isspace(buffer[te]) ) { te++; count--; } /*command end*/ + if ( te <= ts ) goto bad; + tl = te - ts; + + if ( strncmp(&buffer[ts], "C", tl) == 0 ) { + op.cmd = DOM0_BVTCTL; + } else if ( strncmp(&buffer[ts], "S", tl) == 0 ) { + op.cmd = DOM0_ADJUSTDOM; + } else + goto bad; + + /* skip whitspaces and get first parameter */ + ts = te; while ( count && isspace(buffer[ts]) ) { ts++; count--; } + te = ts; while ( count && !isspace(buffer[te]) ) { te++; count--; } + if ( te <= ts ) goto bad; + tl = te - ts; + if ( !isdigit(buffer[ts]) ) goto bad; + + if (op.cmd == DOM0_BVTCTL) { + /* get context switch allowance */ + sscanf(&buffer[ts], "%lu", &op.u.bvtctl.ctx_allow); + } else if (op.cmd == DOM0_ADJUSTDOM) { + sscanf(&buffer[ts], "%u %lu %lu %lu %lu", + &op.u.adjustdom.domain, + &op.u.adjustdom.mcu_adv, + &op.u.adjustdom.warp, + &op.u.adjustdom.warpl, + &op.u.adjustdom.warpu); + } + ret = HYPERVISOR_dom0_op(&op); + return sizeof(op); + + bad: + return -EINVAL; } |