This commit is contained in:
emellor@leeni.uk.xensource.com committed 2006-05-05 18:36:26 +01:00
commit 30907c5593
17 files changed
+119 -83

No files matched your search

@@ -659,6 +659,7 @@ static void net_tx_action(unsigned long unused)
skb->data_len = txreq.size - data_len;
skb->len += skb->data_len;
skb->truesize += skb->data_len;
skb->dev = netif->dev;
skb->protocol = eth_type_trans(skb, skb->dev);
@@ -1069,6 +1069,11 @@ static int __init wait_for_devices(void)
{
unsigned long timeout = jiffies + 10*HZ;
if (xen_init() < 0) {
DPRINTK("failed");
return -ENODEV;
}
while (time_before(jiffies, timeout)) {
if (all_devices_ready())
return 0;
+3 -3
View File
@@ -2,9 +2,9 @@
# cherrypickxen($1 = allobj)
cherrypickxen = $(foreach var, $(1), \
$(shell o=$(var); \
c=$${o/%.o/-xen.c}; \
s=$${o/%.o/-xen.S}; \
oxen=$${o/%.o/-xen.o}; \
c=$${o%.o}-xen.c; \
s=$${o%.o}-xen.S; \
oxen=$${o%.o}-xen.o; \
[ -f $(srctree)/$(src)/$${c} ] || \
[ -f $(srctree)/$(src)/$${s} ] \
&& echo $$oxen \
+1 -1
View File
@@ -230,7 +230,7 @@ fi
if test -z "$vnc"; then
if libvncserver-config --version >& /dev/null; then
if libvncserver-config --version > /dev/null 2>&1; then
vnc=yes
else
vnc=no
+8 -2
View File
@@ -19,7 +19,7 @@ import sxp
from XendLogging import log
from XendError import VmError
def bootloader(blexec, disk, quiet = 0, blargs = None):
def bootloader(blexec, disk, quiet = 0, blargs = None, imgcfg = None):
"""Run the boot loader executable on the given disk and return a
config image.
@param blexec Binary to use as the boot loader
@@ -86,4 +86,10 @@ def bootloader(blexec, disk, quiet = 0, blargs = None):
pin = sxp.Parser()
pin.input(ret)
pin.input_eof()
return pin.val
blcfg = pin.val
if imgcfg is None:
return blcfg
else:
c = sxp.merge(blcfg, imgcfg)
return c
+2 -1
View File
@@ -1633,7 +1633,8 @@ class XendDomainInfo:
continue
fn = blkdev_uname_to_file(disk)
blcfg = bootloader(self.info['bootloader'], fn, 1,
self.info['bootloader_args'])
self.info['bootloader_args'],
self.info['image'])
break
if blcfg is None:
msg = "Had a bootloader specified, but can't find disk"
+1 -1
View File
@@ -94,7 +94,7 @@ class PciController(DevController):
else:
# Xen 2.0 configuration compatibility
domain = get_param(dev_config, 'domain', 0)
domain = get_param(config, 'domain', 0)
bus = get_param(config, 'bus')
slot = get_param(config, 'dev')
func = get_param(config, 'func')
+8 -6
View File
@@ -448,8 +448,11 @@ def strip(pre, s):
def configure_image(vals):
"""Create the image config.
"""
if not vals.builder:
return None
config_image = [ vals.builder ]
config_image.append([ 'kernel', os.path.abspath(vals.kernel) ])
if vals.kernel:
config_image.append([ 'kernel', os.path.abspath(vals.kernel) ])
if vals.ramdisk:
config_image.append([ 'ramdisk', os.path.abspath(vals.ramdisk) ])
if vals.cmdline_ip:
@@ -616,7 +619,7 @@ def configure_hvm(config_image, vals):
if (vals.__dict__[a]):
config_image.append([a, vals.__dict__[a]])
def run_bootloader(vals):
def run_bootloader(vals, config_image):
if not os.access(vals.bootloader, os.X_OK):
err("Bootloader isn't executable")
if len(vals.disk) < 1:
@@ -630,7 +633,7 @@ def run_bootloader(vals):
vals.bootargs = "--entry=%s" %(vals.bootentry,)
return bootloader(vals.bootloader, file, not vals.console_autoconnect,
vals.bootargs)
vals.bootargs, config_image)
def make_config(vals):
"""Create the domain configuration.
@@ -662,13 +665,12 @@ def make_config(vals):
if vals.tpmif:
config.append(['backend', ['tpmif']])
config_image = configure_image(vals)
if vals.bootloader:
config_image = run_bootloader(vals)
config_image = run_bootloader(vals, config_image)
config.append(['bootloader', vals.bootloader])
if vals.bootargs:
config.append(['bootloader_args'], vals.bootargs)
else:
config_image = configure_image(vals)
config.append(['image', config_image])
config_devs = []
+3
View File
@@ -753,7 +753,10 @@ int __sync_lazy_execstate(void)
switch_required = (this_cpu(curr_vcpu) != current);
if ( switch_required )
{
ASSERT(current == idle_vcpu[smp_processor_id()]);
__context_switch();
}
local_irq_restore(flags);
+1 -5
View File
@@ -2821,11 +2821,7 @@ asmlinkage void svm_load_cr2(void)
struct vcpu *v = current;
local_irq_disable();
#ifdef __i386__
asm volatile("movl %0,%%cr2": :"r" (v->arch.hvm_svm.cpu_cr2));
#else
asm volatile("movq %0,%%cr2": :"r" (v->arch.hvm_svm.cpu_cr2));
#endif
asm volatile("mov %0,%%cr2": :"r" (v->arch.hvm_svm.cpu_cr2));
}
asmlinkage void svm_asid(void)
+14 -7
View File
@@ -166,20 +166,26 @@ asmlinkage void vmx_intr_assist(void)
}
has_ext_irq = cpu_has_pending_irq(v);
if (unlikely(v->arch.hvm_vmx.vector_injected)) {
v->arch.hvm_vmx.vector_injected=0;
if (unlikely(has_ext_irq)) enable_irq_window(v);
return;
}
__vmread(IDT_VECTORING_INFO_FIELD, &idtv_info_field);
if (idtv_info_field & INTR_INFO_VALID_MASK) {
if (unlikely(idtv_info_field & INTR_INFO_VALID_MASK)) {
__vmwrite(VM_ENTRY_INTR_INFO_FIELD, idtv_info_field);
__vmread(VM_EXIT_INSTRUCTION_LEN, &inst_len);
if (inst_len >= 1 && inst_len <= 15)
__vmwrite(VM_ENTRY_INSTRUCTION_LEN, inst_len);
__vmwrite(VM_ENTRY_INSTRUCTION_LEN, inst_len);
if (idtv_info_field & 0x800) { /* valid error code */
if (unlikely(idtv_info_field & 0x800)) { /* valid error code */
unsigned long error_code;
__vmread(IDT_VECTORING_ERROR_CODE, &error_code);
__vmwrite(VM_ENTRY_EXCEPTION_ERROR_CODE, error_code);
}
if ( has_ext_irq )
if (unlikely(has_ext_irq))
enable_irq_window(v);
HVM_DBG_LOG(DBG_LEVEL_1, "idtv_info_field=%x", idtv_info_field);
@@ -187,8 +193,9 @@ asmlinkage void vmx_intr_assist(void)
return;
}
if ( !has_ext_irq ) return;
if ( is_interruptibility_state() ) { /* pre-cleared for emulated instruction */
if (likely(!has_ext_irq)) return;
if (unlikely(is_interruptibility_state())) { /* pre-cleared for emulated instruction */
enable_irq_window(v);
HVM_DBG_LOG(DBG_LEVEL_1, "interruptibility");
return;
+61 -57
View File
@@ -893,6 +893,20 @@ static void vmx_vmexit_do_cpuid(struct cpu_user_regs *regs)
#define CASE_GET_REG_P(REG, reg) \
case REG_ ## REG: reg_p = (unsigned long *)&(regs->reg); break
#ifdef __i386__
#define CASE_EXTEND_GET_REG_P
#else
#define CASE_EXTEND_GET_REG_P \
CASE_GET_REG_P(R8, r8); \
CASE_GET_REG_P(R9, r9); \
CASE_GET_REG_P(R10, r10); \
CASE_GET_REG_P(R11, r11); \
CASE_GET_REG_P(R12, r12); \
CASE_GET_REG_P(R13, r13); \
CASE_GET_REG_P(R14, r14); \
CASE_GET_REG_P(R15, r15)
#endif
static void vmx_dr_access (unsigned long exit_qualification, struct cpu_user_regs *regs)
{
unsigned int reg;
@@ -908,14 +922,15 @@ static void vmx_dr_access (unsigned long exit_qualification, struct cpu_user_reg
"vmx_dr_access : eip=%lx, reg=%d, exit_qualification = %lx",
eip, reg, exit_qualification);
switch(exit_qualification & DEBUG_REG_ACCESS_REG) {
CASE_GET_REG_P(EAX, eax);
CASE_GET_REG_P(ECX, ecx);
CASE_GET_REG_P(EDX, edx);
CASE_GET_REG_P(EBX, ebx);
CASE_GET_REG_P(EBP, ebp);
CASE_GET_REG_P(ESI, esi);
CASE_GET_REG_P(EDI, edi);
switch ( exit_qualification & DEBUG_REG_ACCESS_REG ) {
CASE_GET_REG_P(EAX, eax);
CASE_GET_REG_P(ECX, ecx);
CASE_GET_REG_P(EDX, edx);
CASE_GET_REG_P(EBX, ebx);
CASE_GET_REG_P(EBP, ebp);
CASE_GET_REG_P(ESI, esi);
CASE_GET_REG_P(EDI, edi);
CASE_EXTEND_GET_REG_P;
case REG_ESP:
break;
default:
@@ -1525,29 +1540,30 @@ static int vmx_set_cr0(unsigned long value)
return 1;
}
#define CASE_GET_REG(REG, reg) \
#define CASE_SET_REG(REG, reg) \
case REG_ ## REG: regs->reg = value; break
#define CASE_GET_REG(REG, reg) \
case REG_ ## REG: value = regs->reg; break
#define CASE_EXTEND_SET_REG \
CASE_EXTEND_REG(S)
#define CASE_EXTEND_GET_REG \
CASE_EXTEND_REG(G)
#define CASE_EXTEND_SET_REG \
CASE_EXTEND_REG(S)
#define CASE_EXTEND_GET_REG \
CASE_EXTEND_REG(G)
#ifdef __i386__
#define CASE_EXTEND_REG(T)
#else
#define CASE_EXTEND_REG(T) \
CASE_ ## T ## ET_REG(R8, r8); \
CASE_ ## T ## ET_REG(R9, r9); \
#define CASE_EXTEND_REG(T) \
CASE_ ## T ## ET_REG(R8, r8); \
CASE_ ## T ## ET_REG(R9, r9); \
CASE_ ## T ## ET_REG(R10, r10); \
CASE_ ## T ## ET_REG(R11, r11); \
CASE_ ## T ## ET_REG(R12, r12); \
CASE_ ## T ## ET_REG(R13, r13); \
CASE_ ## T ## ET_REG(R14, r14); \
CASE_ ## T ## ET_REG(R15, r15);
CASE_ ## T ## ET_REG(R15, r15)
#endif
/*
* Write to control registers
*/
@@ -1557,31 +1573,28 @@ static int mov_to_cr(int gp, int cr, struct cpu_user_regs *regs)
unsigned long old_cr;
struct vcpu *v = current;
switch (gp) {
CASE_GET_REG(EAX, eax);
CASE_GET_REG(ECX, ecx);
CASE_GET_REG(EDX, edx);
CASE_GET_REG(EBX, ebx);
CASE_GET_REG(EBP, ebp);
CASE_GET_REG(ESI, esi);
CASE_GET_REG(EDI, edi);
CASE_EXTEND_GET_REG
case REG_ESP:
__vmread(GUEST_RSP, &value);
switch ( gp ) {
CASE_GET_REG(EAX, eax);
CASE_GET_REG(ECX, ecx);
CASE_GET_REG(EDX, edx);
CASE_GET_REG(EBX, ebx);
CASE_GET_REG(EBP, ebp);
CASE_GET_REG(ESI, esi);
CASE_GET_REG(EDI, edi);
CASE_EXTEND_GET_REG;
case REG_ESP:
__vmread(GUEST_RSP, &value);
break;
default:
printk("invalid gp: %d\n", gp);
__hvm_bug(regs);
}
HVM_DBG_LOG(DBG_LEVEL_1, "mov_to_cr: CR%d, value = %lx,", cr, value);
HVM_DBG_LOG(DBG_LEVEL_1, "current = %lx,", (unsigned long) current);
HVM_DBG_LOG(DBG_LEVEL_1, "CR%d, value = %lx", cr, value);
switch(cr) {
switch ( cr ) {
case 0:
{
return vmx_set_cr0(value);
}
case 3:
{
unsigned long old_base_mfn, mfn;
@@ -1753,11 +1766,6 @@ static int mov_to_cr(int gp, int cr, struct cpu_user_regs *regs)
return 1;
}
#define CASE_SET_REG(REG, reg) \
case REG_ ## REG: \
regs->reg = value; \
break
/*
* Read from control registers. CR0 and CR4 are read from the shadow.
*/
@@ -1766,22 +1774,22 @@ static void mov_from_cr(int cr, int gp, struct cpu_user_regs *regs)
unsigned long value;
struct vcpu *v = current;
if (cr != 3)
if ( cr != 3 )
__hvm_bug(regs);
value = (unsigned long) v->arch.hvm_vmx.cpu_cr3;
switch (gp) {
CASE_SET_REG(EAX, eax);
CASE_SET_REG(ECX, ecx);
CASE_SET_REG(EDX, edx);
CASE_SET_REG(EBX, ebx);
CASE_SET_REG(EBP, ebp);
CASE_SET_REG(ESI, esi);
CASE_SET_REG(EDI, edi);
CASE_EXTEND_SET_REG
case REG_ESP:
__vmwrite(GUEST_RSP, value);
switch ( gp ) {
CASE_SET_REG(EAX, eax);
CASE_SET_REG(ECX, ecx);
CASE_SET_REG(EDX, edx);
CASE_SET_REG(EBX, ebx);
CASE_SET_REG(EBP, ebp);
CASE_SET_REG(ESI, esi);
CASE_SET_REG(EDI, edi);
CASE_EXTEND_SET_REG;
case REG_ESP:
__vmwrite(GUEST_RSP, value);
regs->esp = value;
break;
default:
@@ -1789,7 +1797,7 @@ static void mov_from_cr(int cr, int gp, struct cpu_user_regs *regs)
__hvm_bug(regs);
}
HVM_DBG_LOG(DBG_LEVEL_VMMU, "mov_from_cr: CR%d, value = %lx,", cr, value);
HVM_DBG_LOG(DBG_LEVEL_VMMU, "CR%d, value = %lx", cr, value);
}
static int vmx_cr_access(unsigned long exit_qualification, struct cpu_user_regs *regs)
@@ -2284,11 +2292,7 @@ asmlinkage void vmx_load_cr2(void)
struct vcpu *v = current;
local_irq_disable();
#ifdef __i386__
asm volatile("movl %0,%%cr2": :"r" (v->arch.hvm_vmx.cpu_cr2));
#else
asm volatile("movq %0,%%cr2": :"r" (v->arch.hvm_vmx.cpu_cr2));
#endif
asm volatile("mov %0,%%cr2": :"r" (v->arch.hvm_vmx.cpu_cr2));
}
asmlinkage void vmx_trace_vmentry (void)
+1
View File
@@ -318,6 +318,7 @@ static void __pirq_guest_eoi(struct domain *d, int irq)
{
ASSERT(cpus_empty(action->cpu_eoi_map));
desc->handler->end(irq_to_vector(irq));
spin_unlock_irq(&desc->lock);
return;
}
+6
View File
@@ -169,6 +169,7 @@ fastcall void smp_invalidate_interrupt(void)
{
ack_APIC_irq();
perfc_incrc(ipis);
irq_enter();
if ( !__sync_lazy_execstate() )
{
if ( flush_va == FLUSHVA_ALL )
@@ -177,6 +178,7 @@ fastcall void smp_invalidate_interrupt(void)
local_flush_tlb_one(flush_va);
}
cpu_clear(smp_processor_id(), flush_cpumask);
irq_exit();
}
void __flush_tlb_mask(cpumask_t mask, unsigned long va)
@@ -335,6 +337,8 @@ fastcall void smp_call_function_interrupt(struct cpu_user_regs *regs)
if ( !cpu_isset(smp_processor_id(), call_data->selected) )
return;
irq_enter();
if ( call_data->wait )
{
(*func)(info);
@@ -347,4 +351,6 @@ fastcall void smp_call_function_interrupt(struct cpu_user_regs *regs)
atomic_inc(&call_data->started);
(*func)(info);
}
irq_exit();
}
+2
View File
@@ -674,6 +674,8 @@ asmlinkage int do_page_fault(struct cpu_user_regs *regs)
unsigned long addr, fixup;
int rc;
ASSERT(!in_irq());
__asm__ __volatile__ ("mov %%cr2,%0" : "=r" (addr) : );
DEBUGGER_trap_entry(TRAP_page_fault, regs);
+1
View File
@@ -68,6 +68,7 @@ struct arch_vmx_struct {
struct vmcs_struct *vmcs; /* VMCS pointer in virtual. */
unsigned int launch_cpu; /* VMCS is valid on this CPU. */
u32 exec_control; /* cache of cpu execution control */
u32 vector_injected; /* if there is vector installed in the INTR_INFO_FIELD */
unsigned long flags; /* VMCS flags */
unsigned long cpu_cr0; /* copy of guest CR0 */
unsigned long cpu_shadow_cr0; /* copy of guest read shadow CR0 */
+1
View File
@@ -444,6 +444,7 @@ static inline int __vmx_inject_exception(struct vcpu *v, int trap, int type,
static inline int vmx_inject_exception(struct vcpu *v, int trap, int error_code)
{
v->arch.hvm_vmx.vector_injected = 1;
return __vmx_inject_exception(v, trap, INTR_TYPE_EXCEPTION, error_code);
}
Reference in new issue
Block a user
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.