Commit f12e6a45 authored by Ingo Molnar's avatar Ingo Molnar

Merge branch 'x86/cleanups' into x86/signal

Conflicts:
	arch/x86/kernel/signal_64.c
Signed-off-by: default avatarIngo Molnar <mingo@elte.hu>
parents 046fd537 dc44e659
...@@ -137,14 +137,15 @@ relocated: ...@@ -137,14 +137,15 @@ relocated:
*/ */
movl output_len(%ebx), %eax movl output_len(%ebx), %eax
pushl %eax pushl %eax
# push arguments for decompress_kernel:
pushl %ebp # output address pushl %ebp # output address
movl input_len(%ebx), %eax movl input_len(%ebx), %eax
pushl %eax # input_len pushl %eax # input_len
leal input_data(%ebx), %eax leal input_data(%ebx), %eax
pushl %eax # input_data pushl %eax # input_data
leal boot_heap(%ebx), %eax leal boot_heap(%ebx), %eax
pushl %eax # heap area as third argument pushl %eax # heap area
pushl %esi # real mode pointer as second arg pushl %esi # real mode pointer
call decompress_kernel call decompress_kernel
addl $20, %esp addl $20, %esp
popl %ecx popl %ecx
......
...@@ -27,7 +27,7 @@ ...@@ -27,7 +27,7 @@
#include <linux/linkage.h> #include <linux/linkage.h>
#include <linux/screen_info.h> #include <linux/screen_info.h>
#include <linux/elf.h> #include <linux/elf.h>
#include <asm/io.h> #include <linux/io.h>
#include <asm/page.h> #include <asm/page.h>
#include <asm/boot.h> #include <asm/boot.h>
#include <asm/bootparam.h> #include <asm/bootparam.h>
...@@ -251,7 +251,7 @@ static void __putstr(int error, const char *s) ...@@ -251,7 +251,7 @@ static void __putstr(int error, const char *s)
y--; y--;
} }
} else { } else {
vidmem [(x + cols * y) * 2] = c; vidmem[(x + cols * y) * 2] = c;
if (++x >= cols) { if (++x >= cols) {
x = 0; x = 0;
if (++y >= lines) { if (++y >= lines) {
...@@ -277,7 +277,8 @@ static void *memset(void *s, int c, unsigned n) ...@@ -277,7 +277,8 @@ static void *memset(void *s, int c, unsigned n)
int i; int i;
char *ss = s; char *ss = s;
for (i = 0; i < n; i++) ss[i] = c; for (i = 0; i < n; i++)
ss[i] = c;
return s; return s;
} }
...@@ -287,7 +288,8 @@ static void *memcpy(void *dest, const void *src, unsigned n) ...@@ -287,7 +288,8 @@ static void *memcpy(void *dest, const void *src, unsigned n)
const char *s = src; const char *s = src;
char *d = dest; char *d = dest;
for (i = 0; i < n; i++) d[i] = s[i]; for (i = 0; i < n; i++)
d[i] = s[i];
return dest; return dest;
} }
......
...@@ -85,8 +85,10 @@ static void dump_thread32(struct pt_regs *regs, struct user32 *dump) ...@@ -85,8 +85,10 @@ static void dump_thread32(struct pt_regs *regs, struct user32 *dump)
dump->regs.ax = regs->ax; dump->regs.ax = regs->ax;
dump->regs.ds = current->thread.ds; dump->regs.ds = current->thread.ds;
dump->regs.es = current->thread.es; dump->regs.es = current->thread.es;
asm("movl %%fs,%0" : "=r" (fs)); dump->regs.fs = fs; savesegment(fs, fs);
asm("movl %%gs,%0" : "=r" (gs)); dump->regs.gs = gs; dump->regs.fs = fs;
savesegment(gs, gs);
dump->regs.gs = gs;
dump->regs.orig_ax = regs->orig_ax; dump->regs.orig_ax = regs->orig_ax;
dump->regs.ip = regs->ip; dump->regs.ip = regs->ip;
dump->regs.cs = regs->cs; dump->regs.cs = regs->cs;
...@@ -430,8 +432,9 @@ static int load_aout_binary(struct linux_binprm *bprm, struct pt_regs *regs) ...@@ -430,8 +432,9 @@ static int load_aout_binary(struct linux_binprm *bprm, struct pt_regs *regs)
current->mm->start_stack = current->mm->start_stack =
(unsigned long)create_aout_tables((char __user *)bprm->p, bprm); (unsigned long)create_aout_tables((char __user *)bprm->p, bprm);
/* start thread */ /* start thread */
asm volatile("movl %0,%%fs" :: "r" (0)); \ loadsegment(fs, 0);
asm volatile("movl %0,%%es; movl %0,%%ds": :"r" (__USER32_DS)); loadsegment(ds, __USER32_DS);
loadsegment(es, __USER32_DS);
load_gs_index(0); load_gs_index(0);
(regs)->ip = ex.a_entry; (regs)->ip = ex.a_entry;
(regs)->sp = current->mm->start_stack; (regs)->sp = current->mm->start_stack;
......
...@@ -207,7 +207,7 @@ struct rt_sigframe ...@@ -207,7 +207,7 @@ struct rt_sigframe
{ unsigned int cur; \ { unsigned int cur; \
unsigned short pre; \ unsigned short pre; \
err |= __get_user(pre, &sc->seg); \ err |= __get_user(pre, &sc->seg); \
asm volatile("movl %%" #seg ",%0" : "=r" (cur)); \ savesegment(seg, cur); \
pre |= mask; \ pre |= mask; \
if (pre != cur) loadsegment(seg, pre); } if (pre != cur) loadsegment(seg, pre); }
...@@ -236,7 +236,7 @@ static int ia32_restore_sigcontext(struct pt_regs *regs, ...@@ -236,7 +236,7 @@ static int ia32_restore_sigcontext(struct pt_regs *regs,
*/ */
err |= __get_user(gs, &sc->gs); err |= __get_user(gs, &sc->gs);
gs |= 3; gs |= 3;
asm("movl %%gs,%0" : "=r" (oldgs)); savesegment(gs, oldgs);
if (gs != oldgs) if (gs != oldgs)
load_gs_index(gs); load_gs_index(gs);
...@@ -342,14 +342,13 @@ static int ia32_setup_sigcontext(struct sigcontext_ia32 __user *sc, ...@@ -342,14 +342,13 @@ static int ia32_setup_sigcontext(struct sigcontext_ia32 __user *sc,
{ {
int tmp, err = 0; int tmp, err = 0;
tmp = 0; savesegment(gs, tmp);
__asm__("movl %%gs,%0" : "=r"(tmp): "0"(tmp));
err |= __put_user(tmp, (unsigned int __user *)&sc->gs); err |= __put_user(tmp, (unsigned int __user *)&sc->gs);
__asm__("movl %%fs,%0" : "=r"(tmp): "0"(tmp)); savesegment(fs, tmp);
err |= __put_user(tmp, (unsigned int __user *)&sc->fs); err |= __put_user(tmp, (unsigned int __user *)&sc->fs);
__asm__("movl %%ds,%0" : "=r"(tmp): "0"(tmp)); savesegment(ds, tmp);
err |= __put_user(tmp, (unsigned int __user *)&sc->ds); err |= __put_user(tmp, (unsigned int __user *)&sc->ds);
__asm__("movl %%es,%0" : "=r"(tmp): "0"(tmp)); savesegment(es, tmp);
err |= __put_user(tmp, (unsigned int __user *)&sc->es); err |= __put_user(tmp, (unsigned int __user *)&sc->es);
err |= __put_user((u32)regs->di, &sc->di); err |= __put_user((u32)regs->di, &sc->di);
...@@ -491,8 +490,8 @@ int ia32_setup_frame(int sig, struct k_sigaction *ka, ...@@ -491,8 +490,8 @@ int ia32_setup_frame(int sig, struct k_sigaction *ka,
regs->dx = 0; regs->dx = 0;
regs->cx = 0; regs->cx = 0;
asm volatile("movl %0,%%ds" :: "r" (__USER32_DS)); loadsegment(ds, __USER32_DS);
asm volatile("movl %0,%%es" :: "r" (__USER32_DS)); loadsegment(es, __USER32_DS);
regs->cs = __USER32_CS; regs->cs = __USER32_CS;
regs->ss = __USER32_DS; regs->ss = __USER32_DS;
...@@ -588,8 +587,8 @@ int ia32_setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info, ...@@ -588,8 +587,8 @@ int ia32_setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info,
regs->dx = (unsigned long) &frame->info; regs->dx = (unsigned long) &frame->info;
regs->cx = (unsigned long) &frame->uc; regs->cx = (unsigned long) &frame->uc;
asm volatile("movl %0,%%ds" :: "r" (__USER32_DS)); loadsegment(ds, __USER32_DS);
asm volatile("movl %0,%%es" :: "r" (__USER32_DS)); loadsegment(es, __USER32_DS);
regs->cs = __USER32_CS; regs->cs = __USER32_CS;
regs->ss = __USER32_DS; regs->ss = __USER32_DS;
......
...@@ -58,7 +58,6 @@ EXPORT_SYMBOL(acpi_disabled); ...@@ -58,7 +58,6 @@ EXPORT_SYMBOL(acpi_disabled);
#ifdef CONFIG_X86_64 #ifdef CONFIG_X86_64
#include <asm/proto.h> #include <asm/proto.h>
#include <asm/genapic.h>
#else /* X86 */ #else /* X86 */
...@@ -97,8 +96,6 @@ static u64 acpi_lapic_addr __initdata = APIC_DEFAULT_PHYS_BASE; ...@@ -97,8 +96,6 @@ static u64 acpi_lapic_addr __initdata = APIC_DEFAULT_PHYS_BASE;
#warning ACPI uses CMPXCHG, i486 and later hardware #warning ACPI uses CMPXCHG, i486 and later hardware
#endif #endif
static int acpi_mcfg_64bit_base_addr __initdata = FALSE;
/* -------------------------------------------------------------------------- /* --------------------------------------------------------------------------
Boot-time Configuration Boot-time Configuration
-------------------------------------------------------------------------- */ -------------------------------------------------------------------------- */
...@@ -160,6 +157,8 @@ char *__init __acpi_map_table(unsigned long phys, unsigned long size) ...@@ -160,6 +157,8 @@ char *__init __acpi_map_table(unsigned long phys, unsigned long size)
struct acpi_mcfg_allocation *pci_mmcfg_config; struct acpi_mcfg_allocation *pci_mmcfg_config;
int pci_mmcfg_config_num; int pci_mmcfg_config_num;
static int acpi_mcfg_64bit_base_addr __initdata = FALSE;
static int __init acpi_mcfg_oem_check(struct acpi_table_mcfg *mcfg) static int __init acpi_mcfg_oem_check(struct acpi_table_mcfg *mcfg)
{ {
if (!strcmp(mcfg->header.oem_id, "SGI")) if (!strcmp(mcfg->header.oem_id, "SGI"))
......
...@@ -228,7 +228,6 @@ ...@@ -228,7 +228,6 @@
#include <linux/suspend.h> #include <linux/suspend.h>
#include <linux/kthread.h> #include <linux/kthread.h>
#include <linux/jiffies.h> #include <linux/jiffies.h>
#include <linux/smp_lock.h>
#include <asm/system.h> #include <asm/system.h>
#include <asm/uaccess.h> #include <asm/uaccess.h>
......
...@@ -25,11 +25,11 @@ x86_bios_strerror(long status) ...@@ -25,11 +25,11 @@ x86_bios_strerror(long status)
{ {
const char *str; const char *str;
switch (status) { switch (status) {
case 0: str = "Call completed without error"; break; case 0: str = "Call completed without error"; break;
case -1: str = "Not implemented"; break; case -1: str = "Not implemented"; break;
case -2: str = "Invalid argument"; break; case -2: str = "Invalid argument"; break;
case -3: str = "Call completed with error"; break; case -3: str = "Call completed with error"; break;
default: str = "Unknown BIOS status code"; break; default: str = "Unknown BIOS status code"; break;
} }
return str; return str;
} }
......
...@@ -36,7 +36,6 @@ ...@@ -36,7 +36,6 @@
#include <linux/smp_lock.h> #include <linux/smp_lock.h>
#include <linux/major.h> #include <linux/major.h>
#include <linux/fs.h> #include <linux/fs.h>
#include <linux/smp_lock.h>
#include <linux/device.h> #include <linux/device.h>
#include <linux/cpu.h> #include <linux/cpu.h>
#include <linux/notifier.h> #include <linux/notifier.h>
......
...@@ -7,9 +7,8 @@ ...@@ -7,9 +7,8 @@
#include <linux/errno.h> #include <linux/errno.h>
#include <linux/crash_dump.h> #include <linux/crash_dump.h>
#include <linux/uaccess.h>
#include <asm/uaccess.h> #include <linux/io.h>
#include <asm/io.h>
/** /**
* copy_oldmem_page - copy one page from "oldmem" * copy_oldmem_page - copy one page from "oldmem"
...@@ -25,7 +24,7 @@ ...@@ -25,7 +24,7 @@
* in the current kernel. We stitch up a pte, similar to kmap_atomic. * in the current kernel. We stitch up a pte, similar to kmap_atomic.
*/ */
ssize_t copy_oldmem_page(unsigned long pfn, char *buf, ssize_t copy_oldmem_page(unsigned long pfn, char *buf,
size_t csize, unsigned long offset, int userbuf) size_t csize, unsigned long offset, int userbuf)
{ {
void *vaddr; void *vaddr;
......
...@@ -325,7 +325,7 @@ int show_interrupts(struct seq_file *p, void *v) ...@@ -325,7 +325,7 @@ int show_interrupts(struct seq_file *p, void *v)
for_each_online_cpu(j) for_each_online_cpu(j)
seq_printf(p, "%10u ", seq_printf(p, "%10u ",
per_cpu(irq_stat,j).irq_call_count); per_cpu(irq_stat,j).irq_call_count);
seq_printf(p, " function call interrupts\n"); seq_printf(p, " Function call interrupts\n");
seq_printf(p, "TLB: "); seq_printf(p, "TLB: ");
for_each_online_cpu(j) for_each_online_cpu(j)
seq_printf(p, "%10u ", seq_printf(p, "%10u ",
......
...@@ -129,7 +129,7 @@ int show_interrupts(struct seq_file *p, void *v) ...@@ -129,7 +129,7 @@ int show_interrupts(struct seq_file *p, void *v)
seq_printf(p, "CAL: "); seq_printf(p, "CAL: ");
for_each_online_cpu(j) for_each_online_cpu(j)
seq_printf(p, "%10u ", cpu_pda(j)->irq_call_count); seq_printf(p, "%10u ", cpu_pda(j)->irq_call_count);
seq_printf(p, " function call interrupts\n"); seq_printf(p, " Function call interrupts\n");
seq_printf(p, "TLB: "); seq_printf(p, "TLB: ");
for_each_online_cpu(j) for_each_online_cpu(j)
seq_printf(p, "%10u ", cpu_pda(j)->irq_tlb_count); seq_printf(p, "%10u ", cpu_pda(j)->irq_tlb_count);
......
...@@ -23,7 +23,7 @@ unsigned native_patch(u8 type, u16 clobbers, void *ibuf, ...@@ -23,7 +23,7 @@ unsigned native_patch(u8 type, u16 clobbers, void *ibuf,
start = start_##ops##_##x; \ start = start_##ops##_##x; \
end = end_##ops##_##x; \ end = end_##ops##_##x; \
goto patch_site goto patch_site
switch(type) { switch (type) {
PATCH_SITE(pv_irq_ops, irq_disable); PATCH_SITE(pv_irq_ops, irq_disable);
PATCH_SITE(pv_irq_ops, irq_enable); PATCH_SITE(pv_irq_ops, irq_enable);
PATCH_SITE(pv_irq_ops, restore_fl); PATCH_SITE(pv_irq_ops, restore_fl);
......
...@@ -82,7 +82,7 @@ void __init dma32_reserve_bootmem(void) ...@@ -82,7 +82,7 @@ void __init dma32_reserve_bootmem(void)
* using 512M as goal * using 512M as goal
*/ */
align = 64ULL<<20; align = 64ULL<<20;
size = round_up(dma32_bootmem_size, align); size = roundup(dma32_bootmem_size, align);
dma32_bootmem_ptr = __alloc_bootmem_nopanic(size, align, dma32_bootmem_ptr = __alloc_bootmem_nopanic(size, align,
512ULL<<20); 512ULL<<20);
if (dma32_bootmem_ptr) if (dma32_bootmem_ptr)
......
...@@ -37,11 +37,11 @@ ...@@ -37,11 +37,11 @@
#include <linux/kdebug.h> #include <linux/kdebug.h>
#include <linux/tick.h> #include <linux/tick.h>
#include <linux/prctl.h> #include <linux/prctl.h>
#include <linux/uaccess.h>
#include <linux/io.h>
#include <asm/uaccess.h>
#include <asm/pgtable.h> #include <asm/pgtable.h>
#include <asm/system.h> #include <asm/system.h>
#include <asm/io.h>
#include <asm/processor.h> #include <asm/processor.h>
#include <asm/i387.h> #include <asm/i387.h>
#include <asm/mmu_context.h> #include <asm/mmu_context.h>
...@@ -89,7 +89,7 @@ void exit_idle(void) ...@@ -89,7 +89,7 @@ void exit_idle(void)
#ifdef CONFIG_HOTPLUG_CPU #ifdef CONFIG_HOTPLUG_CPU
DECLARE_PER_CPU(int, cpu_state); DECLARE_PER_CPU(int, cpu_state);
#include <asm/nmi.h> #include <linux/nmi.h>
/* We halt the CPU with physical CPU hotplug */ /* We halt the CPU with physical CPU hotplug */
static inline void play_dead(void) static inline void play_dead(void)
{ {
...@@ -152,7 +152,7 @@ void cpu_idle(void) ...@@ -152,7 +152,7 @@ void cpu_idle(void)
} }
/* Prints also some state that isn't saved in the pt_regs */ /* Prints also some state that isn't saved in the pt_regs */
void __show_regs(struct pt_regs * regs) void __show_regs(struct pt_regs *regs)
{ {
unsigned long cr0 = 0L, cr2 = 0L, cr3 = 0L, cr4 = 0L, fs, gs, shadowgs; unsigned long cr0 = 0L, cr2 = 0L, cr3 = 0L, cr4 = 0L, fs, gs, shadowgs;
unsigned long d0, d1, d2, d3, d6, d7; unsigned long d0, d1, d2, d3, d6, d7;
...@@ -161,59 +161,61 @@ void __show_regs(struct pt_regs * regs) ...@@ -161,59 +161,61 @@ void __show_regs(struct pt_regs * regs)
printk("\n"); printk("\n");
print_modules(); print_modules();
printk("Pid: %d, comm: %.20s %s %s %.*s\n", printk(KERN_INFO "Pid: %d, comm: %.20s %s %s %.*s\n",
current->pid, current->comm, print_tainted(), current->pid, current->comm, print_tainted(),
init_utsname()->release, init_utsname()->release,
(int)strcspn(init_utsname()->version, " "), (int)strcspn(init_utsname()->version, " "),
init_utsname()->version); init_utsname()->version);
printk("RIP: %04lx:[<%016lx>] ", regs->cs & 0xffff, regs->ip); printk(KERN_INFO "RIP: %04lx:[<%016lx>] ", regs->cs & 0xffff, regs->ip);
printk_address(regs->ip, 1); printk_address(regs->ip, 1);
printk("RSP: %04lx:%016lx EFLAGS: %08lx\n", regs->ss, regs->sp, printk(KERN_INFO "RSP: %04lx:%016lx EFLAGS: %08lx\n", regs->ss,
regs->flags); regs->sp, regs->flags);
printk("RAX: %016lx RBX: %016lx RCX: %016lx\n", printk(KERN_INFO "RAX: %016lx RBX: %016lx RCX: %016lx\n",
regs->ax, regs->bx, regs->cx); regs->ax, regs->bx, regs->cx);
printk("RDX: %016lx RSI: %016lx RDI: %016lx\n", printk(KERN_INFO "RDX: %016lx RSI: %016lx RDI: %016lx\n",
regs->dx, regs->si, regs->di); regs->dx, regs->si, regs->di);
printk("RBP: %016lx R08: %016lx R09: %016lx\n", printk(KERN_INFO "RBP: %016lx R08: %016lx R09: %016lx\n",
regs->bp, regs->r8, regs->r9); regs->bp, regs->r8, regs->r9);
printk("R10: %016lx R11: %016lx R12: %016lx\n", printk(KERN_INFO "R10: %016lx R11: %016lx R12: %016lx\n",
regs->r10, regs->r11, regs->r12); regs->r10, regs->r11, regs->r12);
printk("R13: %016lx R14: %016lx R15: %016lx\n", printk(KERN_INFO "R13: %016lx R14: %016lx R15: %016lx\n",
regs->r13, regs->r14, regs->r15); regs->r13, regs->r14, regs->r15);
asm("movl %%ds,%0" : "=r" (ds)); asm("movl %%ds,%0" : "=r" (ds));
asm("movl %%cs,%0" : "=r" (cs)); asm("movl %%cs,%0" : "=r" (cs));
asm("movl %%es,%0" : "=r" (es)); asm("movl %%es,%0" : "=r" (es));
asm("movl %%fs,%0" : "=r" (fsindex)); asm("movl %%fs,%0" : "=r" (fsindex));
asm("movl %%gs,%0" : "=r" (gsindex)); asm("movl %%gs,%0" : "=r" (gsindex));
rdmsrl(MSR_FS_BASE, fs); rdmsrl(MSR_FS_BASE, fs);
rdmsrl(MSR_GS_BASE, gs); rdmsrl(MSR_GS_BASE, gs);
rdmsrl(MSR_KERNEL_GS_BASE, shadowgs); rdmsrl(MSR_KERNEL_GS_BASE, shadowgs);
cr0 = read_cr0(); cr0 = read_cr0();
cr2 = read_cr2(); cr2 = read_cr2();
cr3 = read_cr3(); cr3 = read_cr3();
cr4 = read_cr4(); cr4 = read_cr4();
printk("FS: %016lx(%04x) GS:%016lx(%04x) knlGS:%016lx\n", printk(KERN_INFO "FS: %016lx(%04x) GS:%016lx(%04x) knlGS:%016lx\n",
fs,fsindex,gs,gsindex,shadowgs); fs, fsindex, gs, gsindex, shadowgs);
printk("CS: %04x DS: %04x ES: %04x CR0: %016lx\n", cs, ds, es, cr0); printk(KERN_INFO "CS: %04x DS: %04x ES: %04x CR0: %016lx\n", cs, ds,
printk("CR2: %016lx CR3: %016lx CR4: %016lx\n", cr2, cr3, cr4); es, cr0);
printk(KERN_INFO "CR2: %016lx CR3: %016lx CR4: %016lx\n", cr2, cr3,
cr4);
get_debugreg(d0, 0); get_debugreg(d0, 0);
get_debugreg(d1, 1); get_debugreg(d1, 1);
get_debugreg(d2, 2); get_debugreg(d2, 2);
printk("DR0: %016lx DR1: %016lx DR2: %016lx\n", d0, d1, d2); printk(KERN_INFO "DR0: %016lx DR1: %016lx DR2: %016lx\n", d0, d1, d2);
get_debugreg(d3, 3); get_debugreg(d3, 3);
get_debugreg(d6, 6); get_debugreg(d6, 6);
get_debugreg(d7, 7); get_debugreg(d7, 7);
printk("DR3: %016lx DR6: %016lx DR7: %016lx\n", d3, d6, d7); printk(KERN_INFO "DR3: %016lx DR6: %016lx DR7: %016lx\n", d3, d6, d7);
} }
void show_regs(struct pt_regs *regs) void show_regs(struct pt_regs *regs)
{ {
printk("CPU %d:", smp_processor_id()); printk(KERN_INFO "CPU %d:", smp_processor_id());
__show_regs(regs); __show_regs(regs);
show_trace(NULL, regs, (void *)(regs + 1), regs->bp); show_trace(NULL, regs, (void *)(regs + 1), regs->bp);
} }
...@@ -314,10 +316,10 @@ void prepare_to_copy(struct task_struct *tsk) ...@@ -314,10 +316,10 @@ void prepare_to_copy(struct task_struct *tsk)
int copy_thread(int nr, unsigned long clone_flags, unsigned long sp, int copy_thread(int nr, unsigned long clone_flags, unsigned long sp,
unsigned long unused, unsigned long unused,
struct task_struct * p, struct pt_regs * regs) struct task_struct *p, struct pt_regs *regs)
{ {
int err; int err;
struct pt_regs * childregs; struct pt_regs *childregs;
struct task_struct *me = current; struct task_struct *me = current;
childregs = ((struct pt_regs *) childregs = ((struct pt_regs *)
...@@ -362,10 +364,10 @@ int copy_thread(int nr, unsigned long clone_flags, unsigned long sp, ...@@ -362,10 +364,10 @@ int copy_thread(int nr, unsigned long clone_flags, unsigned long sp,
if (test_thread_flag(TIF_IA32)) if (test_thread_flag(TIF_IA32))
err = do_set_thread_area(p, -1, err = do_set_thread_area(p, -1,
(struct user_desc __user *)childregs->si, 0); (struct user_desc __user *)childregs->si, 0);
else else
#endif #endif
err = do_arch_prctl(p, ARCH_SET_FS, childregs->r8); err = do_arch_prctl(p, ARCH_SET_FS, childregs->r8);
if (err) if (err)
goto out; goto out;
} }
err = 0; err = 0;
...@@ -544,7 +546,7 @@ __switch_to(struct task_struct *prev_p, struct task_struct *next_p) ...@@ -544,7 +546,7 @@ __switch_to(struct task_struct *prev_p, struct task_struct *next_p)
unsigned fsindex, gsindex; unsigned fsindex, gsindex;
/* we're going to use this soon, after a few expensive things */ /* we're going to use this soon, after a few expensive things */
if (next_p->fpu_counter>5) if (next_p->fpu_counter > 5)
prefetch(next->xstate); prefetch(next->xstate);
/* /*
...@@ -552,13 +554,13 @@ __switch_to(struct task_struct *prev_p, struct task_struct *next_p) ...@@ -552,13 +554,13 @@ __switch_to(struct task_struct *prev_p, struct task_struct *next_p)
*/ */
load_sp0(tss, next); load_sp0(tss, next);
/* /*
* Switch DS and ES. * Switch DS and ES.
* This won't pick up thread selector changes, but I guess that is ok. * This won't pick up thread selector changes, but I guess that is ok.
*/ */
savesegment(es, prev->es); savesegment(es, prev->es);
if (unlikely(next->es | prev->es)) if (unlikely(next->es | prev->es))
loadsegment(es, next->es); loadsegment(es, next->es);
savesegment(ds, prev->ds); savesegment(ds, prev->ds);
if (unlikely(next->ds | prev->ds)) if (unlikely(next->ds | prev->ds))
...@@ -584,7 +586,7 @@ __switch_to(struct task_struct *prev_p, struct task_struct *next_p) ...@@ -584,7 +586,7 @@ __switch_to(struct task_struct *prev_p, struct task_struct *next_p)
*/ */
arch_leave_lazy_cpu_mode(); arch_leave_lazy_cpu_mode();
/* /*
* Switch FS and GS. * Switch FS and GS.
* *
* Segment register != 0 always requires a reload. Also * Segment register != 0 always requires a reload. Also
...@@ -593,13 +595,13 @@ __switch_to(struct task_struct *prev_p, struct task_struct *next_p) ...@@ -593,13 +595,13 @@ __switch_to(struct task_struct *prev_p, struct task_struct *next_p)
*/ */
if (unlikely(fsindex | next->fsindex | prev->fs)) { if (unlikely(fsindex | next->fsindex | prev->fs)) {
loadsegment(fs, next->fsindex); loadsegment(fs, next->fsindex);
/* /*
* Check if the user used a selector != 0; if yes * Check if the user used a selector != 0; if yes
* clear 64bit base, since overloaded base is always * clear 64bit base, since overloaded base is always
* mapped to the Null selector * mapped to the Null selector
*/ */
if (fsindex) if (fsindex)
prev->fs = 0; prev->fs = 0;
} }
/* when next process has a 64bit base use it */ /* when next process has a 64bit base use it */
if (next->fs) if (next->fs)
...@@ -609,7 +611,7 @@ __switch_to(struct task_struct *prev_p, struct task_struct *next_p) ...@@ -609,7 +611,7 @@ __switch_to(struct task_struct *prev_p, struct task_struct *next_p)
if (unlikely(gsindex | next->gsindex | prev->gs)) { if (unlikely(gsindex | next->gsindex | prev->gs)) {
load_gs_index(next->gsindex); load_gs_index(next->gsindex);
if (gsindex) if (gsindex)
prev->gs = 0; prev->gs = 0;
} }
if (next->gs) if (next->gs)
wrmsrl(MSR_KERNEL_GS_BASE, next->gs); wrmsrl(MSR_KERNEL_GS_BASE, next->gs);
...@@ -618,12 +620,12 @@ __switch_to(struct task_struct *prev_p, struct task_struct *next_p) ...@@ -618,12 +620,12 @@ __switch_to(struct task_struct *prev_p, struct task_struct *next_p)
/* Must be after DS reload */ /* Must be after DS reload */
unlazy_fpu(prev_p); unlazy_fpu(prev_p);
/* /*
* Switch the PDA and FPU contexts. * Switch the PDA and FPU contexts.
*/ */
prev->usersp = read_pda(oldrsp); prev->usersp = read_pda(oldrsp);
write_pda(oldrsp, next->usersp); write_pda(oldrsp, next->usersp);
write_pda(pcurrent, next_p); write_pda(pcurrent, next_p);
write_pda(kernelstack, write_pda(kernelstack,
(unsigned long)task_stack_page(next_p) + (unsigned long)task_stack_page(next_p) +
...@@ -664,7 +666,7 @@ long sys_execve(char __user *name, char __user * __user *argv, ...@@ -664,7 +666,7 @@ long sys_execve(char __user *name, char __user * __user *argv,
char __user * __user *envp, struct pt_regs *regs) char __user * __user *envp, struct pt_regs *regs)
{ {
long error; long error;
char * filename; char *filename;
filename = getname(name); filename = getname(name);
error = PTR_ERR(filename); error = PTR_ERR(filename);
...@@ -722,55 +724,55 @@ asmlinkage long sys_vfork(struct pt_regs *regs) ...@@ -722,55 +724,55 @@ asmlinkage long sys_vfork(struct pt_regs *regs)
unsigned long get_wchan(struct task_struct *p) unsigned long get_wchan(struct task_struct *p)
{ {
unsigned long stack; unsigned long stack;
u64 fp,ip; u64 fp, ip;
int count = 0; int count = 0;
if (!p || p == current || p->state==TASK_RUNNING) if (!p || p == current || p->state == TASK_RUNNING)
return 0; return 0;
stack = (unsigned long)task_stack_page(p); stack = (unsigned long)task_stack_page(p);
if (p->thread.sp < stack || p->thread.sp > stack+THREAD_SIZE) if (p->thread.sp < stack || p->thread.sp > stack+THREAD_SIZE)
return 0; return 0;
fp = *(u64 *)(p->thread.sp); fp = *(u64 *)(p->thread.sp);
do { do {
if (fp < (unsigned long)stack || if (fp < (unsigned long)stack ||
fp > (unsigned long)stack+THREAD_SIZE) fp > (unsigned long)stack+THREAD_SIZE)
return 0; return 0;
ip = *(u64 *)(fp+8); ip = *(u64 *)(fp+8);
if (!in_sched_functions(ip)) if (!in_sched_functions(ip))
return ip; return ip;
fp = *(u64 *)fp; fp = *(u64 *)fp;
} while (count++ < 16); } while (count++ < 16);
return 0; return 0;
} }
long do_arch_prctl(struct task_struct *task, int code, unsigned long addr) long do_arch_prctl(struct task_struct *task, int code, unsigned long addr)
{ {
int ret = 0; int ret = 0;
int doit = task == current; int doit = task == current;
int cpu; int cpu;
switch (code) { switch (code) {
case ARCH_SET_GS: case ARCH_SET_GS:
if (addr >= TASK_SIZE_OF(task)) if (addr >= TASK_SIZE_OF(task))
return -EPERM; return -EPERM;
cpu = get_cpu(); cpu = get_cpu();
/* handle small bases via the GDT because that's faster to /* handle small bases via the GDT because that's faster to
switch. */ switch. */
if (addr <= 0xffffffff) { if (addr <= 0xffffffff) {
set_32bit_tls(task, GS_TLS, addr); set_32bit_tls(task, GS_TLS, addr);
if (doit) { if (doit) {
load_TLS(&task->thread, cpu); load_TLS(&task->thread, cpu);
load_gs_index(GS_TLS_SEL); load_gs_index(GS_TLS_SEL);
} }
task->thread.gsindex = GS_TLS_SEL; task->thread.gsindex = GS_TLS_SEL;
task->thread.gs = 0; task->thread.gs = 0;
} else { } else {
task->thread.gsindex = 0; task->thread.gsindex = 0;
task->thread.gs = addr; task->thread.gs = addr;
if (doit) { if (doit) {
load_gs_index(0); load_gs_index(0);
ret = checking_wrmsrl(MSR_KERNEL_GS_BASE, addr); ret = checking_wrmsrl(MSR_KERNEL_GS_BASE, addr);
} }
} }
put_cpu(); put_cpu();
break; break;
...@@ -824,8 +826,7 @@ long do_arch_prctl(struct task_struct *task, int code, unsigned long addr) ...@@ -824,8 +826,7 @@ long do_arch_prctl(struct task_struct *task, int code, unsigned long addr)
rdmsrl(MSR_KERNEL_GS_BASE, base); rdmsrl(MSR_KERNEL_GS_BASE, base);
else else
base = task->thread.gs; base = task->thread.gs;
} } else
else
base = task->thread.gs; base = task->thread.gs;
ret = put_user(base, (unsigned long __user *)addr); ret = put_user(base, (unsigned long __user *)addr);
break; break;
......
...@@ -34,4 +34,9 @@ struct rt_sigframe { ...@@ -34,4 +34,9 @@ struct rt_sigframe {
struct siginfo info; struct siginfo info;
/* fp state follows here */ /* fp state follows here */
}; };
int ia32_setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info,
sigset_t *set, struct pt_regs *regs);
int ia32_setup_frame(int sig, struct k_sigaction *ka,
sigset_t *set, struct pt_regs *regs);
#endif #endif
...@@ -20,9 +20,10 @@ ...@@ -20,9 +20,10 @@
#include <linux/stddef.h> #include <linux/stddef.h>
#include <linux/personality.h> #include <linux/personality.h>
#include <linux/compiler.h> #include <linux/compiler.h>
#include <linux/uaccess.h>
#include <asm/processor.h> #include <asm/processor.h>
#include <asm/ucontext.h> #include <asm/ucontext.h>
#include <asm/uaccess.h>
#include <asm/i387.h> #include <asm/i387.h>
#include <asm/proto.h> #include <asm/proto.h>
#include <asm/ia32_unistd.h> #include <asm/ia32_unistd.h>
...@@ -44,11 +45,6 @@ ...@@ -44,11 +45,6 @@
# define FIX_EFLAGS __FIX_EFLAGS # define FIX_EFLAGS __FIX_EFLAGS
#endif #endif
int ia32_setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info,
sigset_t *set, struct pt_regs * regs);
int ia32_setup_frame(int sig, struct k_sigaction *ka,
sigset_t *set, struct pt_regs * regs);
asmlinkage long asmlinkage long
sys_sigaltstack(const stack_t __user *uss, stack_t __user *uoss, sys_sigaltstack(const stack_t __user *uss, stack_t __user *uoss,
struct pt_regs *regs) struct pt_regs *regs)
...@@ -68,7 +64,7 @@ restore_sigcontext(struct pt_regs *regs, struct sigcontext __user *sc, ...@@ -68,7 +64,7 @@ restore_sigcontext(struct pt_regs *regs, struct sigcontext __user *sc,
/* Always make any pending restarted system calls return -EINTR */ /* Always make any pending restarted system calls return -EINTR */
current_thread_info()->restart_block.fn = do_no_restart_syscall; current_thread_info()->restart_block.fn = do_no_restart_syscall;
#define COPY(x) err |= __get_user(regs->x, &sc->x) #define COPY(x) (err |= __get_user(regs->x, &sc->x))
COPY(di); COPY(si); COPY(bp); COPY(sp); COPY(bx); COPY(di); COPY(si); COPY(bp); COPY(sp); COPY(bx);
COPY(dx); COPY(cx); COPY(ip); COPY(dx); COPY(cx); COPY(ip);
...@@ -98,7 +94,7 @@ restore_sigcontext(struct pt_regs *regs, struct sigcontext __user *sc, ...@@ -98,7 +94,7 @@ restore_sigcontext(struct pt_regs *regs, struct sigcontext __user *sc,
} }
{ {
struct _fpstate __user * buf; struct _fpstate __user *buf;
err |= __get_user(buf, &sc->fpstate); err |= __get_user(buf, &sc->fpstate);
err |= restore_i387_xstate(buf); err |= restore_i387_xstate(buf);
} }
...@@ -124,7 +120,7 @@ asmlinkage long sys_rt_sigreturn(struct pt_regs *regs) ...@@ -124,7 +120,7 @@ asmlinkage long sys_rt_sigreturn(struct pt_regs *regs)
current->blocked = set; current->blocked = set;
recalc_sigpending(); recalc_sigpending();
spin_unlock_irq(&current->sighand->siglock); spin_unlock_irq(&current->sighand->siglock);
if (restore_sigcontext(regs, &frame->uc.uc_mcontext, &ax)) if (restore_sigcontext(regs, &frame->uc.uc_mcontext, &ax))
goto badframe; goto badframe;
...@@ -134,16 +130,17 @@ asmlinkage long sys_rt_sigreturn(struct pt_regs *regs) ...@@ -134,16 +130,17 @@ asmlinkage long sys_rt_sigreturn(struct pt_regs *regs)
return ax; return ax;
badframe: badframe:
signal_fault(regs,frame,"sigreturn"); signal_fault(regs, frame, "sigreturn");
return 0; return 0;
} }
/* /*
* Set up a signal frame. * Set up a signal frame.
*/ */
static inline int static inline int
setup_sigcontext(struct sigcontext __user *sc, struct pt_regs *regs, unsigned long mask, struct task_struct *me) setup_sigcontext(struct sigcontext __user *sc, struct pt_regs *regs,
unsigned long mask, struct task_struct *me)
{ {
int err = 0; int err = 0;
...@@ -199,7 +196,7 @@ get_stack(struct k_sigaction *ka, struct pt_regs *regs, unsigned long size) ...@@ -199,7 +196,7 @@ get_stack(struct k_sigaction *ka, struct pt_regs *regs, unsigned long size)
} }
static int setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info, static int setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info,
sigset_t *set, struct pt_regs * regs) sigset_t *set, struct pt_regs *regs)
{ {
struct rt_sigframe __user *frame; struct rt_sigframe __user *frame;
void __user *fp = NULL; void __user *fp = NULL;
...@@ -212,19 +209,19 @@ static int setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info, ...@@ -212,19 +209,19 @@ static int setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info,
(unsigned long)fp - sizeof(struct rt_sigframe), 16) - 8; (unsigned long)fp - sizeof(struct rt_sigframe), 16) - 8;
if (save_i387_xstate(fp) < 0) if (save_i387_xstate(fp) < 0)
err |= -1; err |= -1;
} else } else
frame = get_stack(ka, regs, sizeof(struct rt_sigframe)) - 8; frame = get_stack(ka, regs, sizeof(struct rt_sigframe)) - 8;
if (!access_ok(VERIFY_WRITE, frame, sizeof(*frame))) if (!access_ok(VERIFY_WRITE, frame, sizeof(*frame)))
goto give_sigsegv; goto give_sigsegv;
if (ka->sa.sa_flags & SA_SIGINFO) { if (ka->sa.sa_flags & SA_SIGINFO) {
err |= copy_siginfo_to_user(&frame->info, info); err |= copy_siginfo_to_user(&frame->info, info);
if (err) if (err)
goto give_sigsegv; goto give_sigsegv;
} }
/* Create the ucontext. */ /* Create the ucontext. */
if (cpu_has_xsave) if (cpu_has_xsave)
err |= __put_user(UC_FP_XSTATE, &frame->uc.uc_flags); err |= __put_user(UC_FP_XSTATE, &frame->uc.uc_flags);
...@@ -237,9 +234,9 @@ static int setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info, ...@@ -237,9 +234,9 @@ static int setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info,
err |= __put_user(me->sas_ss_size, &frame->uc.uc_stack.ss_size); err |= __put_user(me->sas_ss_size, &frame->uc.uc_stack.ss_size);
err |= setup_sigcontext(&frame->uc.uc_mcontext, regs, set->sig[0], me); err |= setup_sigcontext(&frame->uc.uc_mcontext, regs, set->sig[0], me);
err |= __put_user(fp, &frame->uc.uc_mcontext.fpstate); err |= __put_user(fp, &frame->uc.uc_mcontext.fpstate);
if (sizeof(*set) == 16) { if (sizeof(*set) == 16) {
__put_user(set->sig[0], &frame->uc.uc_sigmask.sig[0]); __put_user(set->sig[0], &frame->uc.uc_sigmask.sig[0]);
__put_user(set->sig[1], &frame->uc.uc_sigmask.sig[1]); __put_user(set->sig[1], &frame->uc.uc_sigmask.sig[1]);
} else } else
err |= __copy_to_user(&frame->uc.uc_sigmask, set, sizeof(*set)); err |= __copy_to_user(&frame->uc.uc_sigmask, set, sizeof(*set));
...@@ -250,7 +247,7 @@ static int setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info, ...@@ -250,7 +247,7 @@ static int setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info,
err |= __put_user(ka->sa.sa_restorer, &frame->pretcode); err |= __put_user(ka->sa.sa_restorer, &frame->pretcode);
} else { } else {
/* could use a vstub here */ /* could use a vstub here */
goto give_sigsegv; goto give_sigsegv;
} }
if (err) if (err)
...@@ -258,7 +255,7 @@ static int setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info, ...@@ -258,7 +255,7 @@ static int setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info,
/* Set up registers for signal handler */ /* Set up registers for signal handler */
regs->di = sig; regs->di = sig;
/* In case the signal handler was declared without prototypes */ /* In case the signal handler was declared without prototypes */
regs->ax = 0; regs->ax = 0;
/* This also works for non SA_SIGINFO handlers because they expect the /* This also works for non SA_SIGINFO handlers because they expect the
...@@ -282,7 +279,7 @@ static int setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info, ...@@ -282,7 +279,7 @@ static int setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info,
/* /*
* OK, we're invoking a handler * OK, we're invoking a handler
*/ */
static int static int
handle_signal(unsigned long sig, siginfo_t *info, struct k_sigaction *ka, handle_signal(unsigned long sig, siginfo_t *info, struct k_sigaction *ka,
...@@ -326,7 +323,7 @@ handle_signal(unsigned long sig, siginfo_t *info, struct k_sigaction *ka, ...@@ -326,7 +323,7 @@ handle_signal(unsigned long sig, siginfo_t *info, struct k_sigaction *ka,
ret = ia32_setup_rt_frame(sig, ka, info, oldset, regs); ret = ia32_setup_rt_frame(sig, ka, info, oldset, regs);
else else
ret = ia32_setup_frame(sig, ka, oldset, regs); ret = ia32_setup_frame(sig, ka, oldset, regs);
} else } else
#endif #endif
ret = setup_rt_frame(sig, ka, info, oldset, regs); ret = setup_rt_frame(sig, ka, info, oldset, regs);
...@@ -352,9 +349,9 @@ handle_signal(unsigned long sig, siginfo_t *info, struct k_sigaction *ka, ...@@ -352,9 +349,9 @@ handle_signal(unsigned long sig, siginfo_t *info, struct k_sigaction *ka,
regs->flags &= ~X86_EFLAGS_TF; regs->flags &= ~X86_EFLAGS_TF;
spin_lock_irq(&current->sighand->siglock); spin_lock_irq(&current->sighand->siglock);
sigorsets(&current->blocked,&current->blocked,&ka->sa.sa_mask); sigorsets(&current->blocked, &current->blocked, &ka->sa.sa_mask);
if (!(ka->sa.sa_flags & SA_NODEFER)) if (!(ka->sa.sa_flags & SA_NODEFER))
sigaddset(&current->blocked,sig); sigaddset(&current->blocked, sig);
recalc_sigpending(); recalc_sigpending();
spin_unlock_irq(&current->sighand->siglock); spin_unlock_irq(&current->sighand->siglock);
...@@ -464,14 +461,15 @@ void do_notify_resume(struct pt_regs *regs, void *unused, ...@@ -464,14 +461,15 @@ void do_notify_resume(struct pt_regs *regs, void *unused,
} }
void signal_fault(struct pt_regs *regs, void __user *frame, char *where) void signal_fault(struct pt_regs *regs, void __user *frame, char *where)
{ {
struct task_struct *me = current; struct task_struct *me = current;
if (show_unhandled_signals && printk_ratelimit()) { if (show_unhandled_signals && printk_ratelimit()) {
printk("%s[%d] bad frame in %s frame:%p ip:%lx sp:%lx orax:%lx", printk("%s[%d] bad frame in %s frame:%p ip:%lx sp:%lx orax:%lx",
me->comm,me->pid,where,frame,regs->ip,regs->sp,regs->orig_ax); me->comm, me->pid, where, frame, regs->ip,
regs->sp, regs->orig_ax);
print_vma_addr(" in ", regs->ip); print_vma_addr(" in ", regs->ip);
printk("\n"); printk("\n");
} }
force_sig(SIGSEGV, me); force_sig(SIGSEGV, me);
} }
...@@ -1313,16 +1313,13 @@ __init void prefill_possible_map(void) ...@@ -1313,16 +1313,13 @@ __init void prefill_possible_map(void)
if (!num_processors) if (!num_processors)
num_processors = 1; num_processors = 1;
#ifdef CONFIG_HOTPLUG_CPU
if (additional_cpus == -1) { if (additional_cpus == -1) {
if (disabled_cpus > 0) if (disabled_cpus > 0)
additional_cpus = disabled_cpus; additional_cpus = disabled_cpus;
else else
additional_cpus = 0; additional_cpus = 0;
} }
#else
additional_cpus = 0;
#endif
possible = num_processors + additional_cpus; possible = num_processors + additional_cpus;
if (possible > NR_CPUS) if (possible > NR_CPUS)
possible = NR_CPUS; possible = NR_CPUS;
......
...@@ -13,16 +13,17 @@ ...@@ -13,16 +13,17 @@
#include <linux/utsname.h> #include <linux/utsname.h>
#include <linux/personality.h> #include <linux/personality.h>
#include <linux/random.h> #include <linux/random.h>
#include <linux/uaccess.h>
#include <asm/uaccess.h>
#include <asm/ia32.h> #include <asm/ia32.h>
#include <asm/syscalls.h> #include <asm/syscalls.h>
asmlinkage long sys_mmap(unsigned long addr, unsigned long len, unsigned long prot, unsigned long flags, asmlinkage long sys_mmap(unsigned long addr, unsigned long len,
unsigned long fd, unsigned long off) unsigned long prot, unsigned long flags,
unsigned long fd, unsigned long off)
{ {
long error; long error;
struct file * file; struct file *file;
error = -EINVAL; error = -EINVAL;
if (off & ~PAGE_MASK) if (off & ~PAGE_MASK)
...@@ -57,9 +58,9 @@ static void find_start_end(unsigned long flags, unsigned long *begin, ...@@ -57,9 +58,9 @@ static void find_start_end(unsigned long flags, unsigned long *begin,
unmapped base down for this case. This can give unmapped base down for this case. This can give
conflicts with the heap, but we assume that glibc conflicts with the heap, but we assume that glibc
malloc knows how to fall back to mmap. Give it 1GB malloc knows how to fall back to mmap. Give it 1GB
of playground for now. -AK */ of playground for now. -AK */
*begin = 0x40000000; *begin = 0x40000000;
*end = 0x80000000; *end = 0x80000000;
if (current->flags & PF_RANDOMIZE) { if (current->flags & PF_RANDOMIZE) {
new_begin = randomize_range(*begin, *begin + 0x02000000, 0); new_begin = randomize_range(*begin, *begin + 0x02000000, 0);
if (new_begin) if (new_begin)
...@@ -67,9 +68,9 @@ static void find_start_end(unsigned long flags, unsigned long *begin, ...@@ -67,9 +68,9 @@ static void find_start_end(unsigned long flags, unsigned long *begin,
} }
} else { } else {
*begin = TASK_UNMAPPED_BASE; *begin = TASK_UNMAPPED_BASE;
*end = TASK_SIZE; *end = TASK_SIZE;
} }
} }
unsigned long unsigned long
arch_get_unmapped_area(struct file *filp, unsigned long addr, arch_get_unmapped_area(struct file *filp, unsigned long addr,
...@@ -79,11 +80,11 @@ arch_get_unmapped_area(struct file *filp, unsigned long addr, ...@@ -79,11 +80,11 @@ arch_get_unmapped_area(struct file *filp, unsigned long addr,
struct vm_area_struct *vma; struct vm_area_struct *vma;
unsigned long start_addr; unsigned long start_addr;
unsigned long begin, end; unsigned long begin, end;
if (flags & MAP_FIXED) if (flags & MAP_FIXED)
return addr; return addr;
find_start_end(flags, &begin, &end); find_start_end(flags, &begin, &end);
if (len > end) if (len > end)
return -ENOMEM; return -ENOMEM;
...@@ -97,12 +98,12 @@ arch_get_unmapped_area(struct file *filp, unsigned long addr, ...@@ -97,12 +98,12 @@ arch_get_unmapped_area(struct file *filp, unsigned long addr,
} }
if (((flags & MAP_32BIT) || test_thread_flag(TIF_IA32)) if (((flags & MAP_32BIT) || test_thread_flag(TIF_IA32))
&& len <= mm->cached_hole_size) { && len <= mm->cached_hole_size) {
mm->cached_hole_size = 0; mm->cached_hole_size = 0;
mm->free_area_cache = begin; mm->free_area_cache = begin;
} }
addr = mm->free_area_cache; addr = mm->free_area_cache;
if (addr < begin) if (addr < begin)
addr = begin; addr = begin;
start_addr = addr; start_addr = addr;
full_search: full_search:
...@@ -128,7 +129,7 @@ arch_get_unmapped_area(struct file *filp, unsigned long addr, ...@@ -128,7 +129,7 @@ arch_get_unmapped_area(struct file *filp, unsigned long addr,
return addr; return addr;
} }
if (addr + mm->cached_hole_size < vma->vm_start) if (addr + mm->cached_hole_size < vma->vm_start)
mm->cached_hole_size = vma->vm_start - addr; mm->cached_hole_size = vma->vm_start - addr;
addr = vma->vm_end; addr = vma->vm_end;
} }
...@@ -178,7 +179,7 @@ arch_get_unmapped_area_topdown(struct file *filp, const unsigned long addr0, ...@@ -178,7 +179,7 @@ arch_get_unmapped_area_topdown(struct file *filp, const unsigned long addr0,
vma = find_vma(mm, addr-len); vma = find_vma(mm, addr-len);
if (!vma || addr <= vma->vm_start) if (!vma || addr <= vma->vm_start)
/* remember the address as a hint for next time */ /* remember the address as a hint for next time */
return (mm->free_area_cache = addr-len); return mm->free_area_cache = addr-len;
} }
if (mm->mmap_base < len) if (mm->mmap_base < len)
...@@ -195,7 +196,7 @@ arch_get_unmapped_area_topdown(struct file *filp, const unsigned long addr0, ...@@ -195,7 +196,7 @@ arch_get_unmapped_area_topdown(struct file *filp, const unsigned long addr0,
vma = find_vma(mm, addr); vma = find_vma(mm, addr);
if (!vma || addr+len <= vma->vm_start) if (!vma || addr+len <= vma->vm_start)
/* remember the address as a hint for next time */ /* remember the address as a hint for next time */
return (mm->free_area_cache = addr); return mm->free_area_cache = addr;
/* remember the largest hole we saw so far */ /* remember the largest hole we saw so far */
if (addr + mm->cached_hole_size < vma->vm_start) if (addr + mm->cached_hole_size < vma->vm_start)
...@@ -225,13 +226,13 @@ arch_get_unmapped_area_topdown(struct file *filp, const unsigned long addr0, ...@@ -225,13 +226,13 @@ arch_get_unmapped_area_topdown(struct file *filp, const unsigned long addr0,
} }
asmlinkage long sys_uname(struct new_utsname __user * name) asmlinkage long sys_uname(struct new_utsname __user *name)
{ {
int err; int err;
down_read(&uts_sem); down_read(&uts_sem);
err = copy_to_user(name, utsname(), sizeof (*name)); err = copy_to_user(name, utsname(), sizeof(*name));
up_read(&uts_sem); up_read(&uts_sem);
if (personality(current->personality) == PER_LINUX32) if (personality(current->personality) == PER_LINUX32)
err |= copy_to_user(&name->machine, "i686", 5); err |= copy_to_user(&name->machine, "i686", 5);
return err ? -EFAULT : 0; return err ? -EFAULT : 0;
} }
...@@ -32,6 +32,8 @@ ...@@ -32,6 +32,8 @@
#include <linux/bug.h> #include <linux/bug.h>
#include <linux/nmi.h> #include <linux/nmi.h>
#include <linux/mm.h> #include <linux/mm.h>
#include <linux/smp.h>
#include <linux/io.h>
#if defined(CONFIG_EDAC) #if defined(CONFIG_EDAC)
#include <linux/edac.h> #include <linux/edac.h>
...@@ -45,9 +47,6 @@ ...@@ -45,9 +47,6 @@
#include <asm/unwind.h> #include <asm/unwind.h>
#include <asm/desc.h> #include <asm/desc.h>
#include <asm/i387.h> #include <asm/i387.h>
#include <asm/nmi.h>
#include <asm/smp.h>
#include <asm/io.h>
#include <asm/pgalloc.h> #include <asm/pgalloc.h>
#include <asm/proto.h> #include <asm/proto.h>
#include <asm/pda.h> #include <asm/pda.h>
...@@ -85,7 +84,8 @@ static inline void preempt_conditional_cli(struct pt_regs *regs) ...@@ -85,7 +84,8 @@ static inline void preempt_conditional_cli(struct pt_regs *regs)
void printk_address(unsigned long address, int reliable) void printk_address(unsigned long address, int reliable)
{ {
printk(" [<%016lx>] %s%pS\n", address, reliable ? "": "? ", (void *) address); printk(" [<%016lx>] %s%pS\n",
address, reliable ? "" : "? ", (void *) address);
} }
static unsigned long *in_exception_stack(unsigned cpu, unsigned long stack, static unsigned long *in_exception_stack(unsigned cpu, unsigned long stack,
...@@ -98,7 +98,8 @@ static unsigned long *in_exception_stack(unsigned cpu, unsigned long stack, ...@@ -98,7 +98,8 @@ static unsigned long *in_exception_stack(unsigned cpu, unsigned long stack,
[STACKFAULT_STACK - 1] = "#SS", [STACKFAULT_STACK - 1] = "#SS",
[MCE_STACK - 1] = "#MC", [MCE_STACK - 1] = "#MC",
#if DEBUG_STKSZ > EXCEPTION_STKSZ #if DEBUG_STKSZ > EXCEPTION_STKSZ
[N_EXCEPTION_STACKS ... N_EXCEPTION_STACKS + DEBUG_STKSZ / EXCEPTION_STKSZ - 2] = "#DB[?]" [N_EXCEPTION_STACKS ...
N_EXCEPTION_STACKS + DEBUG_STKSZ / EXCEPTION_STKSZ - 2] = "#DB[?]"
#endif #endif
}; };
unsigned k; unsigned k;
...@@ -163,7 +164,7 @@ static unsigned long *in_exception_stack(unsigned cpu, unsigned long stack, ...@@ -163,7 +164,7 @@ static unsigned long *in_exception_stack(unsigned cpu, unsigned long stack,
} }
/* /*
* x86-64 can have up to three kernel stacks: * x86-64 can have up to three kernel stacks:
* process stack * process stack
* interrupt stack * interrupt stack
* severe exception (double fault, nmi, stack fault, debug, mce) hardware stack * severe exception (double fault, nmi, stack fault, debug, mce) hardware stack
...@@ -219,7 +220,7 @@ void dump_trace(struct task_struct *task, struct pt_regs *regs, ...@@ -219,7 +220,7 @@ void dump_trace(struct task_struct *task, struct pt_regs *regs,
const struct stacktrace_ops *ops, void *data) const struct stacktrace_ops *ops, void *data)
{ {
const unsigned cpu = get_cpu(); const unsigned cpu = get_cpu();
unsigned long *irqstack_end = (unsigned long*)cpu_pda(cpu)->irqstackptr; unsigned long *irqstack_end = (unsigned long *)cpu_pda(cpu)->irqstackptr;
unsigned used = 0; unsigned used = 0;
struct thread_info *tinfo; struct thread_info *tinfo;
...@@ -237,7 +238,7 @@ void dump_trace(struct task_struct *task, struct pt_regs *regs, ...@@ -237,7 +238,7 @@ void dump_trace(struct task_struct *task, struct pt_regs *regs,
if (!bp) { if (!bp) {
if (task == current) { if (task == current) {
/* Grab bp right from our regs */ /* Grab bp right from our regs */
asm("movq %%rbp, %0" : "=r" (bp) :); asm("movq %%rbp, %0" : "=r" (bp) : );
} else { } else {
/* bp is the last reg pushed by switch_to */ /* bp is the last reg pushed by switch_to */
bp = *(unsigned long *) task->thread.sp; bp = *(unsigned long *) task->thread.sp;
...@@ -357,11 +358,15 @@ show_stack_log_lvl(struct task_struct *task, struct pt_regs *regs, ...@@ -357,11 +358,15 @@ show_stack_log_lvl(struct task_struct *task, struct pt_regs *regs,
unsigned long *stack; unsigned long *stack;
int i; int i;
const int cpu = smp_processor_id(); const int cpu = smp_processor_id();
unsigned long *irqstack_end = (unsigned long *) (cpu_pda(cpu)->irqstackptr); unsigned long *irqstack_end =
unsigned long *irqstack = (unsigned long *) (cpu_pda(cpu)->irqstackptr - IRQSTACKSIZE); (unsigned long *) (cpu_pda(cpu)->irqstackptr);
unsigned long *irqstack =
(unsigned long *) (cpu_pda(cpu)->irqstackptr - IRQSTACKSIZE);
// debugging aid: "show_stack(NULL, NULL);" prints the /*
// back trace for this cpu. * debugging aid: "show_stack(NULL, NULL);" prints the
* back trace for this cpu.
*/
if (sp == NULL) { if (sp == NULL) {
if (task) if (task)
...@@ -404,7 +409,7 @@ void dump_stack(void) ...@@ -404,7 +409,7 @@ void dump_stack(void)
#ifdef CONFIG_FRAME_POINTER #ifdef CONFIG_FRAME_POINTER
if (!bp) if (!bp)
asm("movq %%rbp, %0" : "=r" (bp):); asm("movq %%rbp, %0" : "=r" (bp) : );
#endif #endif
printk("Pid: %d, comm: %.20s %s %s %.*s\n", printk("Pid: %d, comm: %.20s %s %s %.*s\n",
...@@ -414,7 +419,6 @@ void dump_stack(void) ...@@ -414,7 +419,6 @@ void dump_stack(void)
init_utsname()->version); init_utsname()->version);
show_trace(NULL, NULL, &stack, bp); show_trace(NULL, NULL, &stack, bp);
} }
EXPORT_SYMBOL(dump_stack); EXPORT_SYMBOL(dump_stack);
void show_registers(struct pt_regs *regs) void show_registers(struct pt_regs *regs)
...@@ -493,7 +497,7 @@ unsigned __kprobes long oops_begin(void) ...@@ -493,7 +497,7 @@ unsigned __kprobes long oops_begin(void)
raw_local_irq_save(flags); raw_local_irq_save(flags);
cpu = smp_processor_id(); cpu = smp_processor_id();
if (!__raw_spin_trylock(&die_lock)) { if (!__raw_spin_trylock(&die_lock)) {
if (cpu == die_owner) if (cpu == die_owner)
/* nested oops. should stop eventually */; /* nested oops. should stop eventually */;
else else
__raw_spin_lock(&die_lock); __raw_spin_lock(&die_lock);
...@@ -638,7 +642,7 @@ do_trap(int trapnr, int signr, char *str, struct pt_regs *regs, ...@@ -638,7 +642,7 @@ do_trap(int trapnr, int signr, char *str, struct pt_regs *regs,
} }
#define DO_ERROR(trapnr, signr, str, name) \ #define DO_ERROR(trapnr, signr, str, name) \
asmlinkage void do_##name(struct pt_regs * regs, long error_code) \ asmlinkage void do_##name(struct pt_regs *regs, long error_code) \
{ \ { \
if (notify_die(DIE_TRAP, str, regs, error_code, trapnr, signr) \ if (notify_die(DIE_TRAP, str, regs, error_code, trapnr, signr) \
== NOTIFY_STOP) \ == NOTIFY_STOP) \
...@@ -648,7 +652,7 @@ asmlinkage void do_##name(struct pt_regs * regs, long error_code) \ ...@@ -648,7 +652,7 @@ asmlinkage void do_##name(struct pt_regs * regs, long error_code) \
} }
#define DO_ERROR_INFO(trapnr, signr, str, name, sicode, siaddr) \ #define DO_ERROR_INFO(trapnr, signr, str, name, sicode, siaddr) \
asmlinkage void do_##name(struct pt_regs * regs, long error_code) \ asmlinkage void do_##name(struct pt_regs *regs, long error_code) \
{ \ { \
siginfo_t info; \ siginfo_t info; \
info.si_signo = signr; \ info.si_signo = signr; \
...@@ -683,7 +687,7 @@ asmlinkage void do_stack_segment(struct pt_regs *regs, long error_code) ...@@ -683,7 +687,7 @@ asmlinkage void do_stack_segment(struct pt_regs *regs, long error_code)
preempt_conditional_cli(regs); preempt_conditional_cli(regs);
} }
asmlinkage void do_double_fault(struct pt_regs * regs, long error_code) asmlinkage void do_double_fault(struct pt_regs *regs, long error_code)
{ {
static const char str[] = "double fault"; static const char str[] = "double fault";
struct task_struct *tsk = current; struct task_struct *tsk = current;
...@@ -778,9 +782,10 @@ io_check_error(unsigned char reason, struct pt_regs *regs) ...@@ -778,9 +782,10 @@ io_check_error(unsigned char reason, struct pt_regs *regs)
} }
static notrace __kprobes void static notrace __kprobes void
unknown_nmi_error(unsigned char reason, struct pt_regs * regs) unknown_nmi_error(unsigned char reason, struct pt_regs *regs)
{ {
if (notify_die(DIE_NMIUNKNOWN, "nmi", regs, reason, 2, SIGINT) == NOTIFY_STOP) if (notify_die(DIE_NMIUNKNOWN, "nmi", regs, reason, 2, SIGINT) ==
NOTIFY_STOP)
return; return;
printk(KERN_EMERG "Uhhuh. NMI received for unknown reason %02x.\n", printk(KERN_EMERG "Uhhuh. NMI received for unknown reason %02x.\n",
reason); reason);
...@@ -882,7 +887,7 @@ asmlinkage __kprobes struct pt_regs *sync_regs(struct pt_regs *eregs) ...@@ -882,7 +887,7 @@ asmlinkage __kprobes struct pt_regs *sync_regs(struct pt_regs *eregs)
else if (user_mode(eregs)) else if (user_mode(eregs))
regs = task_pt_regs(current); regs = task_pt_regs(current);
/* Exception from kernel and interrupts are enabled. Move to /* Exception from kernel and interrupts are enabled. Move to
kernel process stack. */ kernel process stack. */
else if (eregs->flags & X86_EFLAGS_IF) else if (eregs->flags & X86_EFLAGS_IF)
regs = (struct pt_regs *)(eregs->sp -= sizeof(struct pt_regs)); regs = (struct pt_regs *)(eregs->sp -= sizeof(struct pt_regs));
if (eregs != regs) if (eregs != regs)
...@@ -891,7 +896,7 @@ asmlinkage __kprobes struct pt_regs *sync_regs(struct pt_regs *eregs) ...@@ -891,7 +896,7 @@ asmlinkage __kprobes struct pt_regs *sync_regs(struct pt_regs *eregs)
} }
/* runs on IST stack. */ /* runs on IST stack. */
asmlinkage void __kprobes do_debug(struct pt_regs * regs, asmlinkage void __kprobes do_debug(struct pt_regs *regs,
unsigned long error_code) unsigned long error_code)
{ {
struct task_struct *tsk = current; struct task_struct *tsk = current;
...@@ -1035,7 +1040,7 @@ asmlinkage void do_coprocessor_error(struct pt_regs *regs) ...@@ -1035,7 +1040,7 @@ asmlinkage void do_coprocessor_error(struct pt_regs *regs)
asmlinkage void bad_intr(void) asmlinkage void bad_intr(void)
{ {
printk("bad interrupt"); printk("bad interrupt");
} }
asmlinkage void do_simd_coprocessor_error(struct pt_regs *regs) asmlinkage void do_simd_coprocessor_error(struct pt_regs *regs)
...@@ -1047,7 +1052,7 @@ asmlinkage void do_simd_coprocessor_error(struct pt_regs *regs) ...@@ -1047,7 +1052,7 @@ asmlinkage void do_simd_coprocessor_error(struct pt_regs *regs)
conditional_sti(regs); conditional_sti(regs);
if (!user_mode(regs) && if (!user_mode(regs) &&
kernel_math_error(regs, "kernel simd math error", 19)) kernel_math_error(regs, "kernel simd math error", 19))
return; return;
/* /*
...@@ -1092,7 +1097,7 @@ asmlinkage void do_simd_coprocessor_error(struct pt_regs *regs) ...@@ -1092,7 +1097,7 @@ asmlinkage void do_simd_coprocessor_error(struct pt_regs *regs)
force_sig_info(SIGFPE, &info, task); force_sig_info(SIGFPE, &info, task);
} }
asmlinkage void do_spurious_interrupt_bug(struct pt_regs * regs) asmlinkage void do_spurious_interrupt_bug(struct pt_regs *regs)
{ {
} }
...@@ -1149,8 +1154,10 @@ void __init trap_init(void) ...@@ -1149,8 +1154,10 @@ void __init trap_init(void)
set_intr_gate(0, &divide_error); set_intr_gate(0, &divide_error);
set_intr_gate_ist(1, &debug, DEBUG_STACK); set_intr_gate_ist(1, &debug, DEBUG_STACK);
set_intr_gate_ist(2, &nmi, NMI_STACK); set_intr_gate_ist(2, &nmi, NMI_STACK);
set_system_gate_ist(3, &int3, DEBUG_STACK); /* int3 can be called from all */ /* int3 can be called from all */
set_system_gate(4, &overflow); /* int4 can be called from all */ set_system_gate_ist(3, &int3, DEBUG_STACK);
/* int4 can be called from all */
set_system_gate(4, &overflow);
set_intr_gate(5, &bounds); set_intr_gate(5, &bounds);
set_intr_gate(6, &invalid_op); set_intr_gate(6, &invalid_op);
set_intr_gate(7, &device_not_available); set_intr_gate(7, &device_not_available);
......
...@@ -25,45 +25,31 @@ ...@@ -25,45 +25,31 @@
#include <asm/visws/cobalt.h> #include <asm/visws/cobalt.h>
#include <asm/visws/piix4.h> #include <asm/visws/piix4.h>
#include <asm/arch_hooks.h> #include <asm/arch_hooks.h>
#include <asm/io_apic.h>
#include <asm/fixmap.h> #include <asm/fixmap.h>
#include <asm/reboot.h> #include <asm/reboot.h>
#include <asm/setup.h> #include <asm/setup.h>
#include <asm/e820.h> #include <asm/e820.h>
#include <asm/smp.h>
#include <asm/io.h> #include <asm/io.h>
#include <mach_ipi.h> #include <mach_ipi.h>
#include "mach_apic.h" #include "mach_apic.h"
#include <linux/init.h>
#include <linux/smp.h>
#include <linux/kernel_stat.h> #include <linux/kernel_stat.h>
#include <linux/interrupt.h>
#include <linux/init.h>
#include <asm/io.h>
#include <asm/apic.h>
#include <asm/i8259.h> #include <asm/i8259.h>
#include <asm/irq_vectors.h> #include <asm/irq_vectors.h>
#include <asm/visws/cobalt.h>
#include <asm/visws/lithium.h> #include <asm/visws/lithium.h>
#include <asm/visws/piix4.h>
#include <linux/sched.h> #include <linux/sched.h>
#include <linux/kernel.h> #include <linux/kernel.h>
#include <linux/init.h>
#include <linux/pci.h> #include <linux/pci.h>
#include <linux/pci_ids.h> #include <linux/pci_ids.h>
extern int no_broadcast; extern int no_broadcast;
#include <asm/io.h>
#include <asm/apic.h> #include <asm/apic.h>
#include <asm/arch_hooks.h>
#include <asm/visws/cobalt.h>
#include <asm/visws/lithium.h>
char visws_board_type = -1; char visws_board_type = -1;
char visws_board_rev = -1; char visws_board_rev = -1;
......
...@@ -16,37 +16,46 @@ static void __rdmsr_on_cpu(void *info) ...@@ -16,37 +16,46 @@ static void __rdmsr_on_cpu(void *info)
rdmsr(rv->msr_no, rv->l, rv->h); rdmsr(rv->msr_no, rv->l, rv->h);
} }
static void __rdmsr_safe_on_cpu(void *info) static void __wrmsr_on_cpu(void *info)
{ {
struct msr_info *rv = info; struct msr_info *rv = info;
rv->err = rdmsr_safe(rv->msr_no, &rv->l, &rv->h); wrmsr(rv->msr_no, rv->l, rv->h);
} }
static int _rdmsr_on_cpu(unsigned int cpu, u32 msr_no, u32 *l, u32 *h, int safe) int rdmsr_on_cpu(unsigned int cpu, u32 msr_no, u32 *l, u32 *h)
{ {
int err = 0; int err;
struct msr_info rv; struct msr_info rv;
rv.msr_no = msr_no; rv.msr_no = msr_no;
if (safe) { err = smp_call_function_single(cpu, __rdmsr_on_cpu, &rv, 1);
err = smp_call_function_single(cpu, __rdmsr_safe_on_cpu,
&rv, 1);
err = err ? err : rv.err;
} else {
err = smp_call_function_single(cpu, __rdmsr_on_cpu, &rv, 1);
}
*l = rv.l; *l = rv.l;
*h = rv.h; *h = rv.h;
return err; return err;
} }
static void __wrmsr_on_cpu(void *info) int wrmsr_on_cpu(unsigned int cpu, u32 msr_no, u32 l, u32 h)
{
int err;
struct msr_info rv;
rv.msr_no = msr_no;
rv.l = l;
rv.h = h;
err = smp_call_function_single(cpu, __wrmsr_on_cpu, &rv, 1);
return err;
}
/* These "safe" variants are slower and should be used when the target MSR
may not actually exist. */
static void __rdmsr_safe_on_cpu(void *info)
{ {
struct msr_info *rv = info; struct msr_info *rv = info;
wrmsr(rv->msr_no, rv->l, rv->h); rv->err = rdmsr_safe(rv->msr_no, &rv->l, &rv->h);
} }
static void __wrmsr_safe_on_cpu(void *info) static void __wrmsr_safe_on_cpu(void *info)
...@@ -56,45 +65,30 @@ static void __wrmsr_safe_on_cpu(void *info) ...@@ -56,45 +65,30 @@ static void __wrmsr_safe_on_cpu(void *info)
rv->err = wrmsr_safe(rv->msr_no, rv->l, rv->h); rv->err = wrmsr_safe(rv->msr_no, rv->l, rv->h);
} }
static int _wrmsr_on_cpu(unsigned int cpu, u32 msr_no, u32 l, u32 h, int safe) int rdmsr_safe_on_cpu(unsigned int cpu, u32 msr_no, u32 *l, u32 *h)
{ {
int err = 0; int err;
struct msr_info rv; struct msr_info rv;
rv.msr_no = msr_no; rv.msr_no = msr_no;
rv.l = l; err = smp_call_function_single(cpu, __rdmsr_safe_on_cpu, &rv, 1);
rv.h = h; *l = rv.l;
if (safe) { *h = rv.h;
err = smp_call_function_single(cpu, __wrmsr_safe_on_cpu,
&rv, 1);
err = err ? err : rv.err;
} else {
err = smp_call_function_single(cpu, __wrmsr_on_cpu, &rv, 1);
}
return err;
}
int wrmsr_on_cpu(unsigned int cpu, u32 msr_no, u32 l, u32 h) return err ? err : rv.err;
{
return _wrmsr_on_cpu(cpu, msr_no, l, h, 0);
} }
int rdmsr_on_cpu(unsigned int cpu, u32 msr_no, u32 *l, u32 *h)
{
return _rdmsr_on_cpu(cpu, msr_no, l, h, 0);
}
/* These "safe" variants are slower and should be used when the target MSR
may not actually exist. */
int wrmsr_safe_on_cpu(unsigned int cpu, u32 msr_no, u32 l, u32 h) int wrmsr_safe_on_cpu(unsigned int cpu, u32 msr_no, u32 l, u32 h)
{ {
return _wrmsr_on_cpu(cpu, msr_no, l, h, 1); int err;
} struct msr_info rv;
int rdmsr_safe_on_cpu(unsigned int cpu, u32 msr_no, u32 *l, u32 *h) rv.msr_no = msr_no;
{ rv.l = l;
return _rdmsr_on_cpu(cpu, msr_no, l, h, 1); rv.h = h;
err = smp_call_function_single(cpu, __wrmsr_safe_on_cpu, &rv, 1);
return err ? err : rv.err;
} }
EXPORT_SYMBOL(rdmsr_on_cpu); EXPORT_SYMBOL(rdmsr_on_cpu);
......
...@@ -22,7 +22,7 @@ char *strcpy(char *dest, const char *src) ...@@ -22,7 +22,7 @@ char *strcpy(char *dest, const char *src)
"testb %%al,%%al\n\t" "testb %%al,%%al\n\t"
"jne 1b" "jne 1b"
: "=&S" (d0), "=&D" (d1), "=&a" (d2) : "=&S" (d0), "=&D" (d1), "=&a" (d2)
:"0" (src), "1" (dest) : "memory"); : "0" (src), "1" (dest) : "memory");
return dest; return dest;
} }
EXPORT_SYMBOL(strcpy); EXPORT_SYMBOL(strcpy);
...@@ -42,7 +42,7 @@ char *strncpy(char *dest, const char *src, size_t count) ...@@ -42,7 +42,7 @@ char *strncpy(char *dest, const char *src, size_t count)
"stosb\n" "stosb\n"
"2:" "2:"
: "=&S" (d0), "=&D" (d1), "=&c" (d2), "=&a" (d3) : "=&S" (d0), "=&D" (d1), "=&c" (d2), "=&a" (d3)
:"0" (src), "1" (dest), "2" (count) : "memory"); : "0" (src), "1" (dest), "2" (count) : "memory");
return dest; return dest;
} }
EXPORT_SYMBOL(strncpy); EXPORT_SYMBOL(strncpy);
...@@ -60,7 +60,7 @@ char *strcat(char *dest, const char *src) ...@@ -60,7 +60,7 @@ char *strcat(char *dest, const char *src)
"testb %%al,%%al\n\t" "testb %%al,%%al\n\t"
"jne 1b" "jne 1b"
: "=&S" (d0), "=&D" (d1), "=&a" (d2), "=&c" (d3) : "=&S" (d0), "=&D" (d1), "=&a" (d2), "=&c" (d3)
: "0" (src), "1" (dest), "2" (0), "3" (0xffffffffu): "memory"); : "0" (src), "1" (dest), "2" (0), "3" (0xffffffffu) : "memory");
return dest; return dest;
} }
EXPORT_SYMBOL(strcat); EXPORT_SYMBOL(strcat);
...@@ -105,9 +105,9 @@ int strcmp(const char *cs, const char *ct) ...@@ -105,9 +105,9 @@ int strcmp(const char *cs, const char *ct)
"2:\tsbbl %%eax,%%eax\n\t" "2:\tsbbl %%eax,%%eax\n\t"
"orb $1,%%al\n" "orb $1,%%al\n"
"3:" "3:"
:"=a" (res), "=&S" (d0), "=&D" (d1) : "=a" (res), "=&S" (d0), "=&D" (d1)
:"1" (cs), "2" (ct) : "1" (cs), "2" (ct)
:"memory"); : "memory");
return res; return res;
} }
EXPORT_SYMBOL(strcmp); EXPORT_SYMBOL(strcmp);
...@@ -130,9 +130,9 @@ int strncmp(const char *cs, const char *ct, size_t count) ...@@ -130,9 +130,9 @@ int strncmp(const char *cs, const char *ct, size_t count)
"3:\tsbbl %%eax,%%eax\n\t" "3:\tsbbl %%eax,%%eax\n\t"
"orb $1,%%al\n" "orb $1,%%al\n"
"4:" "4:"
:"=a" (res), "=&S" (d0), "=&D" (d1), "=&c" (d2) : "=a" (res), "=&S" (d0), "=&D" (d1), "=&c" (d2)
:"1" (cs), "2" (ct), "3" (count) : "1" (cs), "2" (ct), "3" (count)
:"memory"); : "memory");
return res; return res;
} }
EXPORT_SYMBOL(strncmp); EXPORT_SYMBOL(strncmp);
...@@ -152,9 +152,9 @@ char *strchr(const char *s, int c) ...@@ -152,9 +152,9 @@ char *strchr(const char *s, int c)
"movl $1,%1\n" "movl $1,%1\n"
"2:\tmovl %1,%0\n\t" "2:\tmovl %1,%0\n\t"
"decl %0" "decl %0"
:"=a" (res), "=&S" (d0) : "=a" (res), "=&S" (d0)
:"1" (s), "0" (c) : "1" (s), "0" (c)
:"memory"); : "memory");
return res; return res;
} }
EXPORT_SYMBOL(strchr); EXPORT_SYMBOL(strchr);
...@@ -169,9 +169,9 @@ size_t strlen(const char *s) ...@@ -169,9 +169,9 @@ size_t strlen(const char *s)
"scasb\n\t" "scasb\n\t"
"notl %0\n\t" "notl %0\n\t"
"decl %0" "decl %0"
:"=c" (res), "=&D" (d0) : "=c" (res), "=&D" (d0)
:"1" (s), "a" (0), "0" (0xffffffffu) : "1" (s), "a" (0), "0" (0xffffffffu)
:"memory"); : "memory");
return res; return res;
} }
EXPORT_SYMBOL(strlen); EXPORT_SYMBOL(strlen);
...@@ -189,9 +189,9 @@ void *memchr(const void *cs, int c, size_t count) ...@@ -189,9 +189,9 @@ void *memchr(const void *cs, int c, size_t count)
"je 1f\n\t" "je 1f\n\t"
"movl $1,%0\n" "movl $1,%0\n"
"1:\tdecl %0" "1:\tdecl %0"
:"=D" (res), "=&c" (d0) : "=D" (res), "=&c" (d0)
:"a" (c), "0" (cs), "1" (count) : "a" (c), "0" (cs), "1" (count)
:"memory"); : "memory");
return res; return res;
} }
EXPORT_SYMBOL(memchr); EXPORT_SYMBOL(memchr);
...@@ -228,9 +228,9 @@ size_t strnlen(const char *s, size_t count) ...@@ -228,9 +228,9 @@ size_t strnlen(const char *s, size_t count)
"cmpl $-1,%1\n\t" "cmpl $-1,%1\n\t"
"jne 1b\n" "jne 1b\n"
"3:\tsubl %2,%0" "3:\tsubl %2,%0"
:"=a" (res), "=&d" (d0) : "=a" (res), "=&d" (d0)
:"c" (s), "1" (count) : "c" (s), "1" (count)
:"memory"); : "memory");
return res; return res;
} }
EXPORT_SYMBOL(strnlen); EXPORT_SYMBOL(strnlen);
......
...@@ -23,9 +23,9 @@ __asm__ __volatile__( ...@@ -23,9 +23,9 @@ __asm__ __volatile__(
"jne 1b\n\t" "jne 1b\n\t"
"xorl %%eax,%%eax\n\t" "xorl %%eax,%%eax\n\t"
"2:" "2:"
:"=a" (__res), "=&c" (d0), "=&S" (d1) : "=a" (__res), "=&c" (d0), "=&S" (d1)
:"0" (0), "1" (0xffffffff), "2" (cs), "g" (ct) : "0" (0), "1" (0xffffffff), "2" (cs), "g" (ct)
:"dx", "di"); : "dx", "di");
return __res; return __res;
} }
...@@ -328,7 +328,7 @@ void __init initmem_init(unsigned long start_pfn, ...@@ -328,7 +328,7 @@ void __init initmem_init(unsigned long start_pfn,
get_memcfg_numa(); get_memcfg_numa();
kva_pages = round_up(calculate_numa_remap_pages(), PTRS_PER_PTE); kva_pages = roundup(calculate_numa_remap_pages(), PTRS_PER_PTE);
kva_target_pfn = round_down(max_low_pfn - kva_pages, PTRS_PER_PTE); kva_target_pfn = round_down(max_low_pfn - kva_pages, PTRS_PER_PTE);
do { do {
......
...@@ -148,8 +148,8 @@ static void note_page(struct seq_file *m, struct pg_state *st, ...@@ -148,8 +148,8 @@ static void note_page(struct seq_file *m, struct pg_state *st,
* we have now. "break" is either changing perms, levels or * we have now. "break" is either changing perms, levels or
* address space marker. * address space marker.
*/ */
prot = pgprot_val(new_prot) & ~(PTE_PFN_MASK); prot = pgprot_val(new_prot) & PTE_FLAGS_MASK;
cur = pgprot_val(st->current_prot) & ~(PTE_PFN_MASK); cur = pgprot_val(st->current_prot) & PTE_FLAGS_MASK;
if (!st->level) { if (!st->level) {
/* First entry */ /* First entry */
......
...@@ -225,7 +225,7 @@ void __init init_extra_mapping_uc(unsigned long phys, unsigned long size) ...@@ -225,7 +225,7 @@ void __init init_extra_mapping_uc(unsigned long phys, unsigned long size)
void __init cleanup_highmap(void) void __init cleanup_highmap(void)
{ {
unsigned long vaddr = __START_KERNEL_map; unsigned long vaddr = __START_KERNEL_map;
unsigned long end = round_up((unsigned long)_end, PMD_SIZE) - 1; unsigned long end = roundup((unsigned long)_end, PMD_SIZE) - 1;
pmd_t *pmd = level2_kernel_pgt; pmd_t *pmd = level2_kernel_pgt;
pmd_t *last_pmd = pmd + PTRS_PER_PMD; pmd_t *last_pmd = pmd + PTRS_PER_PMD;
...@@ -451,14 +451,14 @@ static void __init find_early_table_space(unsigned long end) ...@@ -451,14 +451,14 @@ static void __init find_early_table_space(unsigned long end)
unsigned long puds, pmds, ptes, tables, start; unsigned long puds, pmds, ptes, tables, start;
puds = (end + PUD_SIZE - 1) >> PUD_SHIFT; puds = (end + PUD_SIZE - 1) >> PUD_SHIFT;
tables = round_up(puds * sizeof(pud_t), PAGE_SIZE); tables = roundup(puds * sizeof(pud_t), PAGE_SIZE);
if (direct_gbpages) { if (direct_gbpages) {
unsigned long extra; unsigned long extra;
extra = end - ((end>>PUD_SHIFT) << PUD_SHIFT); extra = end - ((end>>PUD_SHIFT) << PUD_SHIFT);
pmds = (extra + PMD_SIZE - 1) >> PMD_SHIFT; pmds = (extra + PMD_SIZE - 1) >> PMD_SHIFT;
} else } else
pmds = (end + PMD_SIZE - 1) >> PMD_SHIFT; pmds = (end + PMD_SIZE - 1) >> PMD_SHIFT;
tables += round_up(pmds * sizeof(pmd_t), PAGE_SIZE); tables += roundup(pmds * sizeof(pmd_t), PAGE_SIZE);
if (cpu_has_pse) { if (cpu_has_pse) {
unsigned long extra; unsigned long extra;
...@@ -466,7 +466,7 @@ static void __init find_early_table_space(unsigned long end) ...@@ -466,7 +466,7 @@ static void __init find_early_table_space(unsigned long end)
ptes = (extra + PAGE_SIZE - 1) >> PAGE_SHIFT; ptes = (extra + PAGE_SIZE - 1) >> PAGE_SHIFT;
} else } else
ptes = (end + PAGE_SIZE - 1) >> PAGE_SHIFT; ptes = (end + PAGE_SIZE - 1) >> PAGE_SHIFT;
tables += round_up(ptes * sizeof(pte_t), PAGE_SIZE); tables += roundup(ptes * sizeof(pte_t), PAGE_SIZE);
/* /*
* RED-PEN putting page tables only on node 0 could * RED-PEN putting page tables only on node 0 could
......
...@@ -79,7 +79,7 @@ static int __init allocate_cachealigned_memnodemap(void) ...@@ -79,7 +79,7 @@ static int __init allocate_cachealigned_memnodemap(void)
return 0; return 0;
addr = 0x8000; addr = 0x8000;
nodemap_size = round_up(sizeof(s16) * memnodemapsize, L1_CACHE_BYTES); nodemap_size = roundup(sizeof(s16) * memnodemapsize, L1_CACHE_BYTES);
nodemap_addr = find_e820_area(addr, max_pfn<<PAGE_SHIFT, nodemap_addr = find_e820_area(addr, max_pfn<<PAGE_SHIFT,
nodemap_size, L1_CACHE_BYTES); nodemap_size, L1_CACHE_BYTES);
if (nodemap_addr == -1UL) { if (nodemap_addr == -1UL) {
...@@ -176,10 +176,10 @@ void __init setup_node_bootmem(int nodeid, unsigned long start, ...@@ -176,10 +176,10 @@ void __init setup_node_bootmem(int nodeid, unsigned long start,
unsigned long start_pfn, last_pfn, bootmap_pages, bootmap_size; unsigned long start_pfn, last_pfn, bootmap_pages, bootmap_size;
unsigned long bootmap_start, nodedata_phys; unsigned long bootmap_start, nodedata_phys;
void *bootmap; void *bootmap;
const int pgdat_size = round_up(sizeof(pg_data_t), PAGE_SIZE); const int pgdat_size = roundup(sizeof(pg_data_t), PAGE_SIZE);
int nid; int nid;
start = round_up(start, ZONE_ALIGN); start = roundup(start, ZONE_ALIGN);
printk(KERN_INFO "Bootmem setup node %d %016lx-%016lx\n", nodeid, printk(KERN_INFO "Bootmem setup node %d %016lx-%016lx\n", nodeid,
start, end); start, end);
...@@ -210,9 +210,9 @@ void __init setup_node_bootmem(int nodeid, unsigned long start, ...@@ -210,9 +210,9 @@ void __init setup_node_bootmem(int nodeid, unsigned long start,
bootmap_pages = bootmem_bootmap_pages(last_pfn - start_pfn); bootmap_pages = bootmem_bootmap_pages(last_pfn - start_pfn);
nid = phys_to_nid(nodedata_phys); nid = phys_to_nid(nodedata_phys);
if (nid == nodeid) if (nid == nodeid)
bootmap_start = round_up(nodedata_phys + pgdat_size, PAGE_SIZE); bootmap_start = roundup(nodedata_phys + pgdat_size, PAGE_SIZE);
else else
bootmap_start = round_up(start, PAGE_SIZE); bootmap_start = roundup(start, PAGE_SIZE);
/* /*
* SMP_CACHE_BYTES could be enough, but init_bootmem_node like * SMP_CACHE_BYTES could be enough, but init_bootmem_node like
* to use that to align to PAGE_SIZE * to use that to align to PAGE_SIZE
......
...@@ -84,7 +84,7 @@ static inline unsigned long highmap_start_pfn(void) ...@@ -84,7 +84,7 @@ static inline unsigned long highmap_start_pfn(void)
static inline unsigned long highmap_end_pfn(void) static inline unsigned long highmap_end_pfn(void)
{ {
return __pa(round_up((unsigned long)_end, PMD_SIZE)) >> PAGE_SHIFT; return __pa(roundup((unsigned long)_end, PMD_SIZE)) >> PAGE_SHIFT;
} }
#endif #endif
......
...@@ -580,7 +580,7 @@ static int __cpuinit amd_cpu_notify(struct notifier_block *self, ...@@ -580,7 +580,7 @@ static int __cpuinit amd_cpu_notify(struct notifier_block *self,
unsigned long action, void *hcpu) unsigned long action, void *hcpu)
{ {
int cpu = (long)hcpu; int cpu = (long)hcpu;
switch(action) { switch (action) {
case CPU_ONLINE: case CPU_ONLINE:
case CPU_ONLINE_FROZEN: case CPU_ONLINE_FROZEN:
smp_call_function_single(cpu, enable_pci_io_ecs, NULL, 0); smp_call_function_single(cpu, enable_pci_io_ecs, NULL, 0);
......
...@@ -1043,35 +1043,44 @@ static void __init pcibios_fixup_irqs(void) ...@@ -1043,35 +1043,44 @@ static void __init pcibios_fixup_irqs(void)
if (io_apic_assign_pci_irqs) { if (io_apic_assign_pci_irqs) {
int irq; int irq;
if (pin) { if (!pin)
/* continue;
* interrupt pins are numbered starting
* from 1 /*
*/ * interrupt pins are numbered starting from 1
pin--; */
irq = IO_APIC_get_PCI_irq_vector(dev->bus->number, pin--;
PCI_SLOT(dev->devfn), pin); irq = IO_APIC_get_PCI_irq_vector(dev->bus->number,
/* PCI_SLOT(dev->devfn), pin);
* Busses behind bridges are typically not listed in the MP-table. /*
* In this case we have to look up the IRQ based on the parent bus, * Busses behind bridges are typically not listed in the
* parent slot, and pin number. The SMP code detects such bridged * MP-table. In this case we have to look up the IRQ
* busses itself so we should get into this branch reliably. * based on the parent bus, parent slot, and pin number.
*/ * The SMP code detects such bridged busses itself so we
if (irq < 0 && dev->bus->parent) { /* go back to the bridge */ * should get into this branch reliably.
struct pci_dev *bridge = dev->bus->self; */
if (irq < 0 && dev->bus->parent) {
pin = (pin + PCI_SLOT(dev->devfn)) % 4; /* go back to the bridge */
irq = IO_APIC_get_PCI_irq_vector(bridge->bus->number, struct pci_dev *bridge = dev->bus->self;
PCI_SLOT(bridge->devfn), pin); int bus;
if (irq >= 0)
dev_warn(&dev->dev, "using bridge %s INT %c to get IRQ %d\n", pin = (pin + PCI_SLOT(dev->devfn)) % 4;
pci_name(bridge), bus = bridge->bus->number;
'A' + pin, irq); irq = IO_APIC_get_PCI_irq_vector(bus,
} PCI_SLOT(bridge->devfn), pin);
if (irq >= 0) { if (irq >= 0)
dev_info(&dev->dev, "PCI->APIC IRQ transform: INT %c -> IRQ %d\n", 'A' + pin, irq); dev_warn(&dev->dev,
dev->irq = irq; "using bridge %s INT %c to "
} "get IRQ %d\n",
pci_name(bridge),
'A' + pin, irq);
}
if (irq >= 0) {
dev_info(&dev->dev,
"PCI->APIC IRQ transform: INT %c "
"-> IRQ %d\n",
'A' + pin, irq);
dev->irq = irq;
} }
} }
#endif #endif
......
.text
/* /*
* This may not use any stack, nor any variable that is not "NoSave": * This may not use any stack, nor any variable that is not "NoSave":
* *
...@@ -12,17 +10,18 @@ ...@@ -12,17 +10,18 @@
#include <asm/segment.h> #include <asm/segment.h>
#include <asm/page.h> #include <asm/page.h>
#include <asm/asm-offsets.h> #include <asm/asm-offsets.h>
#include <asm/processor-flags.h>
.text .text
ENTRY(swsusp_arch_suspend) ENTRY(swsusp_arch_suspend)
movl %esp, saved_context_esp movl %esp, saved_context_esp
movl %ebx, saved_context_ebx movl %ebx, saved_context_ebx
movl %ebp, saved_context_ebp movl %ebp, saved_context_ebp
movl %esi, saved_context_esi movl %esi, saved_context_esi
movl %edi, saved_context_edi movl %edi, saved_context_edi
pushfl ; popl saved_context_eflags pushfl
popl saved_context_eflags
call swsusp_save call swsusp_save
ret ret
...@@ -59,7 +58,7 @@ done: ...@@ -59,7 +58,7 @@ done:
movl mmu_cr4_features, %ecx movl mmu_cr4_features, %ecx
jecxz 1f # cr4 Pentium and higher, skip if zero jecxz 1f # cr4 Pentium and higher, skip if zero
movl %ecx, %edx movl %ecx, %edx
andl $~(1<<7), %edx; # PGE andl $~(X86_CR4_PGE), %edx
movl %edx, %cr4; # turn off PGE movl %edx, %cr4; # turn off PGE
1: 1:
movl %cr3, %eax; # flush TLB movl %cr3, %eax; # flush TLB
...@@ -74,7 +73,8 @@ done: ...@@ -74,7 +73,8 @@ done:
movl saved_context_esi, %esi movl saved_context_esi, %esi
movl saved_context_edi, %edi movl saved_context_edi, %edi
pushl saved_context_eflags ; popfl pushl saved_context_eflags
popfl
xorl %eax, %eax xorl %eax, %eax
......
...@@ -134,9 +134,7 @@ static inline void ack_x2APIC_irq(void) ...@@ -134,9 +134,7 @@ static inline void ack_x2APIC_irq(void)
static inline void ack_APIC_irq(void) static inline void ack_APIC_irq(void)
{ {
/* /*
* ack_APIC_irq() actually gets compiled as a single instruction: * ack_APIC_irq() actually gets compiled as a single instruction
* - a single rmw on Pentium/82489DX
* - a single write on P6+ cores (CONFIG_X86_GOOD_APIC)
* ... yummie. * ... yummie.
*/ */
......
...@@ -20,17 +20,22 @@ ...@@ -20,17 +20,22 @@
#define _ASM_PTR __ASM_SEL(.long, .quad) #define _ASM_PTR __ASM_SEL(.long, .quad)
#define _ASM_ALIGN __ASM_SEL(.balign 4, .balign 8) #define _ASM_ALIGN __ASM_SEL(.balign 4, .balign 8)
#define _ASM_MOV_UL __ASM_SIZE(mov)
#define _ASM_MOV __ASM_SIZE(mov)
#define _ASM_INC __ASM_SIZE(inc) #define _ASM_INC __ASM_SIZE(inc)
#define _ASM_DEC __ASM_SIZE(dec) #define _ASM_DEC __ASM_SIZE(dec)
#define _ASM_ADD __ASM_SIZE(add) #define _ASM_ADD __ASM_SIZE(add)
#define _ASM_SUB __ASM_SIZE(sub) #define _ASM_SUB __ASM_SIZE(sub)
#define _ASM_XADD __ASM_SIZE(xadd) #define _ASM_XADD __ASM_SIZE(xadd)
#define _ASM_AX __ASM_REG(ax) #define _ASM_AX __ASM_REG(ax)
#define _ASM_BX __ASM_REG(bx) #define _ASM_BX __ASM_REG(bx)
#define _ASM_CX __ASM_REG(cx) #define _ASM_CX __ASM_REG(cx)
#define _ASM_DX __ASM_REG(dx) #define _ASM_DX __ASM_REG(dx)
#define _ASM_SP __ASM_REG(sp)
#define _ASM_BP __ASM_REG(bp)
#define _ASM_SI __ASM_REG(si)
#define _ASM_DI __ASM_REG(di)
/* Exception table entry */ /* Exception table entry */
# define _ASM_EXTABLE(from,to) \ # define _ASM_EXTABLE(from,to) \
......
...@@ -148,8 +148,9 @@ do { \ ...@@ -148,8 +148,9 @@ do { \
static inline void start_ia32_thread(struct pt_regs *regs, u32 ip, u32 sp) static inline void start_ia32_thread(struct pt_regs *regs, u32 ip, u32 sp)
{ {
asm volatile("movl %0,%%fs" :: "r" (0)); loadsegment(fs, 0);
asm volatile("movl %0,%%es; movl %0,%%ds" : : "r" (__USER32_DS)); loadsegment(ds, __USER32_DS);
loadsegment(es, __USER32_DS);
load_gs_index(0); load_gs_index(0);
regs->ip = ip; regs->ip = ip;
regs->sp = sp; regs->sp = sp;
......
...@@ -7,7 +7,7 @@ ...@@ -7,7 +7,7 @@
do { \ do { \
if (pm_trace_enabled) { \ if (pm_trace_enabled) { \
const void *tracedata; \ const void *tracedata; \
asm volatile(_ASM_MOV_UL " $1f,%0\n" \ asm volatile(_ASM_MOV " $1f,%0\n" \
".section .tracedata,\"a\"\n" \ ".section .tracedata,\"a\"\n" \
"1:\t.word %c1\n\t" \ "1:\t.word %c1\n\t" \
_ASM_PTR " %c2\n" \ _ASM_PTR " %c2\n" \
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment