> > If Andrew says we have to get those patches into mainline through you, Well I'm mainline in this case. > then I'll spend all that time re-spinning the patches for you from the > -mm tree until they go in. I got it to compile now with this patch (+ one additional patch that is folded in). It then goes through kernel initialization and then init gets killed with "Inconsistency detected by rtld.c:1250: Assertation ph_vaddr == _rtld_local.dl_sysinfo_vdso failed" It looks like some of the ifdefs were placed completely wrong and in addition you were missing a patch to include asm/offset.h everywhere as assembly (I patched around that). And two macros were apparently never compiled in their current form. But it seems it is dependent on even more -mm* magic than just that. If you can identify the missing patches that make init's rtld work again that would be useful. -Andi Get paravirt ops to compile TBD should be folded into the original patches Unfortunately still doesn't boot. Signed-off-by: Andi Kleen <ak at suse.de> Index: linux/include/asm-i386/desc.h =================================================================== --- linux.orig/include/asm-i386/desc.h +++ linux/include/asm-i386/desc.h @@ -92,6 +92,9 @@ static inline void write_dt_entry(void * #define write_gdt_entry(dt, entry, a, b) write_dt_entry(dt, entry, a, b) #define write_idt_entry(dt, entry, a, b) write_dt_entry(dt, entry, a, b) +#define set_ldt native_set_ldt +#endif /* CONFIG_PARAVIRT */ + static inline void _set_gate(int gate, unsigned int type, void *addr, unsigned short seg) { __u32 a, b; @@ -108,9 +111,6 @@ static inline void __set_tss_desc(unsign write_gdt_entry(get_cpu_gdt_table(cpu), entry, a, b); } -#define set_ldt native_set_ldt -#endif /* CONFIG_PARAVIRT */ - static inline fastcall void native_set_ldt(const void *addr, unsigned int entries) { Index: linux/include/asm-i386/paravirt.h =================================================================== --- linux.orig/include/asm-i386/paravirt.h +++ linux/include/asm-i386/paravirt.h @@ -454,16 +454,20 @@ static inline unsigned long __raw_local_ return f; } -#define CLI_STRING paravirt_alt("pushl %ecx; pushl %edx;" \ - "call *paravirt_ops+PARAVIRT_irq_disable;" \ - "popl %edx; popl %ecx", \ +#define CLI_STRING paravirt_alt("pushl %%ecx; pushl %%edx;" \ + "call *paravirt_ops+%c[irq_disable];" \ + "popl %%edx; popl %%ecx", \ PARAVIRT_IRQ_DISABLE, CLBR_EAX) -#define STI_STRING paravirt_alt("pushl %ecx; pushl %edx;" \ - "call *paravirt_ops+PARAVIRT_irq_enable;" \ - "popl %edx; popl %ecx", \ +#define STI_STRING paravirt_alt("pushl %%ecx; pushl %%edx;" \ + "call *paravirt_ops+%c[irq_enable];" \ + "popl %%edx; popl %%ecx", \ PARAVIRT_IRQ_ENABLE, CLBR_EAX) #define CLI_STI_CLOBBERS , "%eax" +#define CLI_STI_INPUT_ARGS \ + , \ + [irq_disable] "i" (offsetof(struct paravirt_ops, irq_disable)), \ + [irq_enable] "i" (offsetof(struct paravirt_ops, irq_enable)) #else /* __ASSEMBLY__ */ Index: linux/include/asm-i386/spinlock.h =================================================================== --- linux.orig/include/asm-i386/spinlock.h +++ linux/include/asm-i386/spinlock.h @@ -13,6 +13,7 @@ #define CLI_STRING "cli" #define STI_STRING "sti" #define CLI_STI_CLOBBERS +#define CLI_STI_INPUT_ARGS #endif /* CONFIG_PARAVIRT */ /* @@ -58,26 +59,27 @@ static inline void __raw_spin_lock_flags { asm volatile( "\n1:\t" - LOCK_PREFIX " ; decb %0\n\t" + LOCK_PREFIX " ; decb %[slock]\n\t" "jns 5f\n" "2:\t" - "testl $0x200, %1\n\t" + "testl $0x200, %[flags]\n\t" "jz 4f\n\t" STI_STRING "\n" "3:\t" "rep;nop\n\t" - "cmpb $0, %0\n\t" + "cmpb $0, %[slock]\n\t" "jle 3b\n\t" CLI_STRING "\n\t" "jmp 1b\n" "4:\t" "rep;nop\n\t" - "cmpb $0, %0\n\t" + "cmpb $0, %[slock]\n\t" "jg 1b\n\t" "jmp 4b\n" "5:\n\t" - : "+m" (lock->slock) - : "r" (flags) + : [slock] "+m" (lock->slock) + : [flags] "r" (flags) + CLI_STI_INPUT_ARGS : "memory" CLI_STI_CLOBBERS); } #endif Index: linux/include/asm-i386/processor.h =================================================================== --- linux.orig/include/asm-i386/processor.h +++ linux/include/asm-i386/processor.h @@ -511,6 +511,7 @@ static inline void load_esp0(struct tss_ wrmsr(MSR_IA32_SYSENTER_CS, thread->sysenter_cs, 0); } } +#endif #define start_thread(regs, new_eip, new_esp) do { \ __asm__("movl %0,%%fs": :"r" (0)); \ @@ -524,6 +525,7 @@ static inline void load_esp0(struct tss_ regs->esp = new_esp; \ } while (0) +#ifndef CONFIG_PARAVIRT /* * These special macros can be used to get or set a debugging register */