|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-changelog] [xen-unstable] Merge
# HG changeset patch
# User Ian Jackson <Ian.Jackson@xxxxxxxxxxxxx>
# Date 1334683152 -3600
# Node ID 214ca44b931682bc4b588b690e9b494dd956dc22
# Parent 1ff80750ce31a4f628b2e6830d273fa95f1364c4
# Parent 569d6f05e1ef3146c269bca6313e2777420d616d
Merge
---
diff -r 1ff80750ce31 -r 214ca44b9316 xen/arch/x86/io_apic.c
--- a/xen/arch/x86/io_apic.c Tue Apr 17 18:18:49 2012 +0100
+++ b/xen/arch/x86/io_apic.c Tue Apr 17 18:19:12 2012 +0100
@@ -185,7 +185,7 @@ struct IO_APIC_route_entry **alloc_ioapi
ioapic_entries[apic] =
xmalloc_array(struct IO_APIC_route_entry,
nr_ioapic_entries[apic]);
- if (!ioapic_entries[apic])
+ if (!ioapic_entries[apic] && nr_ioapic_entries[apic])
goto nomem;
}
@@ -310,6 +310,9 @@ int save_IO_APIC_setup(struct IO_APIC_ro
return -ENOMEM;
for (apic = 0; apic < nr_ioapics; apic++) {
+ if (!nr_ioapic_entries[apic])
+ continue;
+
if (!ioapic_entries[apic])
return -ENOMEM;
@@ -331,6 +334,9 @@ void mask_IO_APIC_setup(struct IO_APIC_r
return;
for (apic = 0; apic < nr_ioapics; apic++) {
+ if (!nr_ioapic_entries[apic])
+ continue;
+
if (!ioapic_entries[apic])
break;
@@ -358,6 +364,9 @@ int restore_IO_APIC_setup(struct IO_APIC
return -ENOMEM;
for (apic = 0; apic < nr_ioapics; apic++) {
+ if (!nr_ioapic_entries[apic])
+ continue;
+
if (!ioapic_entries[apic])
return -ENOMEM;
@@ -610,6 +619,8 @@ static int __init find_isa_irq_apic(int
if (i < mp_irq_entries) {
int apic;
for(apic = 0; apic < nr_ioapics; apic++) {
+ if (!nr_ioapic_entries[apic])
+ continue;
if (mp_ioapics[apic].mpc_apicid == mp_irqs[i].mpc_dstapic)
return apic;
}
@@ -1080,6 +1091,8 @@ static void /*__init*/ __print_IO_APIC(v
printk(KERN_INFO "testing the IO APIC.......................\n");
for (apic = 0; apic < nr_ioapics; apic++) {
+ if (!nr_ioapic_entries[apic])
+ continue;
spin_lock_irqsave(&ioapic_lock, flags);
reg_00.raw = io_apic_read(apic, 0);
@@ -1229,6 +1242,8 @@ static void __init enable_IO_APIC(void)
if (directed_eoi_enabled) {
for (apic = 0; apic < nr_ioapics; apic++) {
+ if (!nr_ioapic_entries[apic])
+ continue;
vector_map[apic] = xzalloc(vmask_t);
BUG_ON(!vector_map[apic]);
}
@@ -1354,6 +1369,8 @@ static void __init setup_ioapic_ids_from
* Set the IOAPIC ID to the value stored in the MPC table.
*/
for (apic = 0; apic < nr_ioapics; apic++) {
+ if (!nr_ioapic_entries[apic])
+ continue;
/* Read the register 0 value */
spin_lock_irqsave(&ioapic_lock, flags);
@@ -2038,6 +2055,8 @@ void ioapic_resume(void)
spin_lock_irqsave(&ioapic_lock, flags);
for (apic = 0; apic < nr_ioapics; apic++){
+ if (!nr_ioapic_entries[apic])
+ continue;
reg_00.raw = __io_apic_read(apic, 0);
if (reg_00.bits.ID != mp_ioapics[apic].mpc_apicid) {
reg_00.bits.ID = mp_ioapics[apic].mpc_apicid;
@@ -2164,8 +2183,8 @@ int io_apic_set_pci_routing (int ioapic,
int vector;
if (!IO_APIC_IRQ(irq)) {
- printk(KERN_ERR "IOAPIC[%d]: Invalid reference to IRQ 0\n",
- ioapic);
+ printk(KERN_ERR "IOAPIC[%d]: Invalid reference to IRQ %d\n",
+ ioapic, irq);
return -EINVAL;
}
@@ -2225,8 +2244,12 @@ static int ioapic_physbase_to_id(unsigne
{
int apic;
for ( apic = 0; apic < nr_ioapics; apic++ )
+ {
+ if ( !nr_ioapic_entries[apic] )
+ continue;
if ( mp_ioapics[apic].mpc_apicaddr == physbase )
return apic;
+ }
return -EINVAL;
}
@@ -2444,6 +2467,22 @@ void dump_ioapic_irq_info(void)
static unsigned int __initdata max_gsi_irqs;
integer_param("max_gsi_irqs", max_gsi_irqs);
+static __init bool_t bad_ioapic_register(unsigned int idx)
+{
+ union IO_APIC_reg_00 reg_00 = { .raw = io_apic_read(idx, 0) };
+ union IO_APIC_reg_01 reg_01 = { .raw = io_apic_read(idx, 1) };
+ union IO_APIC_reg_02 reg_02 = { .raw = io_apic_read(idx, 2) };
+
+ if ( reg_00.raw == -1 && reg_01.raw == -1 && reg_02.raw == -1 )
+ {
+ printk(KERN_WARNING "I/O APIC %#x registers return all ones,
skipping!\n",
+ mp_ioapics[idx].mpc_apicaddr);
+ return 1;
+ }
+
+ return 0;
+}
+
void __init init_ioapic_mappings(void)
{
unsigned long ioapic_phys;
@@ -2477,6 +2516,12 @@ void __init init_ioapic_mappings(void)
__fix_to_virt(idx), ioapic_phys);
idx++;
+ if ( bad_ioapic_register(i) )
+ {
+ __set_fixmap(idx, 0, 0);
+ continue;
+ }
+
if ( smp_found_config )
{
/* The number of IO-APIC IRQ registers (== #pins): */
diff -r 1ff80750ce31 -r 214ca44b9316 xen/arch/x86/mpparse.c
--- a/xen/arch/x86/mpparse.c Tue Apr 17 18:18:49 2012 +0100
+++ b/xen/arch/x86/mpparse.c Tue Apr 17 18:19:12 2012 +0100
@@ -1034,6 +1034,21 @@ int mp_register_gsi (u32 gsi, int trigge
return gsi;
#endif
+ if (!nr_ioapics) {
+ unsigned int port = 0x4d0 + (gsi >> 3);
+ u8 val;
+
+ if (!platform_legacy_irq(gsi))
+ return -EINVAL;
+ val = inb(port);
+ if (triggering)
+ val |= 1 << (gsi & 7);
+ else
+ val &= ~(1 << (gsi & 7));
+ outb(val, port);
+ return 0;
+ }
+
ioapic = mp_find_ioapic(gsi);
if (ioapic < 0) {
printk(KERN_WARNING "No IOAPIC for GSI %u\n", gsi);
diff -r 1ff80750ce31 -r 214ca44b9316 xen/arch/x86/x86_64/asm-offsets.c
--- a/xen/arch/x86/x86_64/asm-offsets.c Tue Apr 17 18:18:49 2012 +0100
+++ b/xen/arch/x86/x86_64/asm-offsets.c Tue Apr 17 18:19:12 2012 +0100
@@ -145,6 +145,7 @@ void __dummy__(void)
OFFSET(TRAPINFO_eip, struct trap_info, address);
OFFSET(TRAPINFO_cs, struct trap_info, cs);
+ OFFSET(TRAPINFO_flags, struct trap_info, flags);
DEFINE(TRAPINFO_sizeof, sizeof(struct trap_info));
BLANK();
diff -r 1ff80750ce31 -r 214ca44b9316 xen/arch/x86/x86_64/compat/entry.S
--- a/xen/arch/x86/x86_64/compat/entry.S Tue Apr 17 18:18:49 2012 +0100
+++ b/xen/arch/x86/x86_64/compat/entry.S Tue Apr 17 18:19:12 2012 +0100
@@ -213,6 +213,7 @@ 1: call compat_create_bounce_frame
ENTRY(compat_post_handle_exception)
testb $TBF_EXCEPTION,TRAPBOUNCE_flags(%rdx)
jz compat_test_all_events
+.Lcompat_bounce_exception:
call compat_create_bounce_frame
movb $0,TRAPBOUNCE_flags(%rdx)
jmp compat_test_all_events
@@ -225,20 +226,21 @@ ENTRY(compat_syscall)
leaq VCPU_trap_bounce(%rbx),%rdx
testl $~3,%esi
leal (,%rcx,TBF_INTERRUPT),%ecx
- jz 2f
-1: movq %rax,TRAPBOUNCE_eip(%rdx)
+UNLIKELY_START(z, compat_syscall_gpf)
+ movq VCPU_trap_ctxt(%rbx),%rdi
+ movl $TRAP_gp_fault,UREGS_entry_vector(%rsp)
+ subl $2,UREGS_rip(%rsp)
+ movl $0,TRAPBOUNCE_error_code(%rdx)
+ movl TRAP_gp_fault * TRAPINFO_sizeof + TRAPINFO_eip(%rdi),%eax
+ movzwl TRAP_gp_fault * TRAPINFO_sizeof + TRAPINFO_cs(%rdi),%esi
+ testb $4,TRAP_gp_fault * TRAPINFO_sizeof + TRAPINFO_flags(%rdi)
+ setnz %cl
+ leal TBF_EXCEPTION|TBF_EXCEPTION_ERRCODE(,%rcx,TBF_INTERRUPT),%ecx
+UNLIKELY_END(compat_syscall_gpf)
+ movq %rax,TRAPBOUNCE_eip(%rdx)
movw %si,TRAPBOUNCE_cs(%rdx)
movb %cl,TRAPBOUNCE_flags(%rdx)
- call compat_create_bounce_frame
- jmp compat_test_all_events
-2: movq VCPU_trap_ctxt(%rbx),%rsi
- movl $TRAP_gp_fault,UREGS_entry_vector(%rsp)
- subl $2,UREGS_rip(%rsp)
- movl TRAP_gp_fault * TRAPINFO_sizeof + TRAPINFO_eip(%rsi),%eax
- movzwl TRAP_gp_fault * TRAPINFO_sizeof + TRAPINFO_cs(%rsi),%esi
- movb $(TBF_EXCEPTION|TBF_EXCEPTION_ERRCODE|TBF_INTERRUPT),%cl
- movl $0,TRAPBOUNCE_error_code(%rdx)
- jmp 1b
+ jmp .Lcompat_bounce_exception
ENTRY(compat_sysenter)
movq VCPU_trap_ctxt(%rbx),%rcx
diff -r 1ff80750ce31 -r 214ca44b9316 xen/arch/x86/x86_64/entry.S
--- a/xen/arch/x86/x86_64/entry.S Tue Apr 17 18:18:49 2012 +0100
+++ b/xen/arch/x86/x86_64/entry.S Tue Apr 17 18:19:12 2012 +0100
@@ -277,20 +277,22 @@ sysenter_eflags_saved:
leaq VCPU_trap_bounce(%rbx),%rdx
testq %rax,%rax
leal (,%rcx,TBF_INTERRUPT),%ecx
- jz 2f
-1: movq VCPU_domain(%rbx),%rdi
+UNLIKELY_START(z, sysenter_gpf)
+ movq VCPU_trap_ctxt(%rbx),%rsi
+ movl $TRAP_gp_fault,UREGS_entry_vector(%rsp)
+ subq $2,UREGS_rip(%rsp)
+ movl %eax,TRAPBOUNCE_error_code(%rdx)
+ movq TRAP_gp_fault * TRAPINFO_sizeof + TRAPINFO_eip(%rsi),%rax
+ testb $4,TRAP_gp_fault * TRAPINFO_sizeof + TRAPINFO_flags(%rsi)
+ setnz %cl
+ leal TBF_EXCEPTION|TBF_EXCEPTION_ERRCODE(,%rcx,TBF_INTERRUPT),%ecx
+UNLIKELY_END(sysenter_gpf)
+ movq VCPU_domain(%rbx),%rdi
movq %rax,TRAPBOUNCE_eip(%rdx)
movb %cl,TRAPBOUNCE_flags(%rdx)
testb $1,DOMAIN_is_32bit_pv(%rdi)
jnz compat_sysenter
- call create_bounce_frame
- jmp test_all_events
-2: movq VCPU_trap_ctxt(%rbx),%rcx
- movl %eax,TRAPBOUNCE_error_code(%rdx)
- movq TRAP_gp_fault * TRAPINFO_sizeof + TRAPINFO_eip(%rcx),%rax
- movb $(TBF_EXCEPTION|TBF_EXCEPTION_ERRCODE|TBF_INTERRUPT),%cl
- movl $TRAP_gp_fault,UREGS_entry_vector(%rsp)
- jmp 1b
+ jmp .Lbounce_exception
ENTRY(int80_direct_trap)
pushq $0
@@ -483,6 +485,7 @@ 1: movq %rsp,%rdi
jnz compat_post_handle_exception
testb $TBF_EXCEPTION,TRAPBOUNCE_flags(%rdx)
jz test_all_events
+.Lbounce_exception:
call create_bounce_frame
movb $0,TRAPBOUNCE_flags(%rdx)
jmp test_all_events
_______________________________________________
Xen-changelog mailing list
Xen-changelog@xxxxxxxxxxxxx
http://lists.xensource.com/xen-changelog
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |