diff options
Diffstat (limited to 'arch/x86')
| -rw-r--r-- | arch/x86/Kconfig | 3 | ||||
| -rw-r--r-- | arch/x86/kernel/ptrace.c | 9 | ||||
| -rw-r--r-- | arch/x86/kernel/signal_64.c | 38 | ||||
| -rw-r--r-- | arch/x86/mm/ioremap.c | 2 | ||||
| -rw-r--r-- | arch/x86/mm/pgtable_32.c | 18 | 
5 files changed, 50 insertions, 20 deletions
| diff --git a/arch/x86/Kconfig b/arch/x86/Kconfig index f41c9538ca30..237fc128143d 100644 --- a/arch/x86/Kconfig +++ b/arch/x86/Kconfig | |||
| @@ -66,9 +66,6 @@ config MMU | |||
| 66 | config ZONE_DMA | 66 | config ZONE_DMA | 
| 67 | def_bool y | 67 | def_bool y | 
| 68 | 68 | ||
| 69 | config QUICKLIST | ||
| 70 | def_bool X86_32 | ||
| 71 | |||
| 72 | config SBUS | 69 | config SBUS | 
| 73 | bool | 70 | bool | 
| 74 | 71 | ||
| diff --git a/arch/x86/kernel/ptrace.c b/arch/x86/kernel/ptrace.c index 8f64abe699fd..d5904eef1d31 100644 --- a/arch/x86/kernel/ptrace.c +++ b/arch/x86/kernel/ptrace.c | |||
| @@ -1055,10 +1055,17 @@ static int putreg32(struct task_struct *child, unsigned regno, u32 value) | |||
| 1055 | R32(esi, si); | 1055 | R32(esi, si); | 
| 1056 | R32(ebp, bp); | 1056 | R32(ebp, bp); | 
| 1057 | R32(eax, ax); | 1057 | R32(eax, ax); | 
| 1058 | R32(orig_eax, orig_ax); | ||
| 1059 | R32(eip, ip); | 1058 | R32(eip, ip); | 
| 1060 | R32(esp, sp); | 1059 | R32(esp, sp); | 
| 1061 | 1060 | ||
| 1061 | case offsetof(struct user32, regs.orig_eax): | ||
| 1062 | /* | ||
| 1063 | * Sign-extend the value so that orig_eax = -1 | ||
| 1064 | * causes (long)orig_ax < 0 tests to fire correctly. | ||
| 1065 | */ | ||
| 1066 | regs->orig_ax = (long) (s32) value; | ||
| 1067 | break; | ||
| 1068 | |||
| 1062 | case offsetof(struct user32, regs.eflags): | 1069 | case offsetof(struct user32, regs.eflags): | 
| 1063 | return set_flags(child, value); | 1070 | return set_flags(child, value); | 
| 1064 | 1071 | ||
| diff --git a/arch/x86/kernel/signal_64.c b/arch/x86/kernel/signal_64.c index 56b72fb67f9b..1c83e5124c65 100644 --- a/arch/x86/kernel/signal_64.c +++ b/arch/x86/kernel/signal_64.c | |||
| @@ -311,6 +311,35 @@ give_sigsegv: | |||
| 311 | } | 311 | } | 
| 312 | 312 | ||
| 313 | /* | 313 | /* | 
| 314 | * Return -1L or the syscall number that @regs is executing. | ||
| 315 | */ | ||
| 316 | static long current_syscall(struct pt_regs *regs) | ||
| 317 | { | ||
| 318 | /* | ||
| 319 | * We always sign-extend a -1 value being set here, | ||
| 320 | * so this is always either -1L or a syscall number. | ||
| 321 | */ | ||
| 322 | return regs->orig_ax; | ||
| 323 | } | ||
| 324 | |||
| 325 | /* | ||
| 326 | * Return a value that is -EFOO if the system call in @regs->orig_ax | ||
| 327 | * returned an error. This only works for @regs from @current. | ||
| 328 | */ | ||
| 329 | static long current_syscall_ret(struct pt_regs *regs) | ||
| 330 | { | ||
| 331 | #ifdef CONFIG_IA32_EMULATION | ||
| 332 | if (test_thread_flag(TIF_IA32)) | ||
| 333 | /* | ||
| 334 | * Sign-extend the value so (int)-EFOO becomes (long)-EFOO | ||
| 335 | * and will match correctly in comparisons. | ||
| 336 | */ | ||
| 337 | return (int) regs->ax; | ||
| 338 | #endif | ||
| 339 | return regs->ax; | ||
| 340 | } | ||
| 341 | |||
| 342 | /* | ||
| 314 | * OK, we're invoking a handler | 343 | * OK, we're invoking a handler | 
| 315 | */ | 344 | */ | 
| 316 | 345 | ||
| @@ -327,9 +356,9 @@ handle_signal(unsigned long sig, siginfo_t *info, struct k_sigaction *ka, | |||
| 327 | #endif | 356 | #endif | 
| 328 | 357 | ||
| 329 | /* Are we from a system call? */ | 358 | /* Are we from a system call? */ | 
| 330 | if ((long)regs->orig_ax >= 0) { | 359 | if (current_syscall(regs) >= 0) { | 
| 331 | /* If so, check system call restarting.. */ | 360 | /* If so, check system call restarting.. */ | 
| 332 | switch (regs->ax) { | 361 | switch (current_syscall_ret(regs)) { | 
| 333 | case -ERESTART_RESTARTBLOCK: | 362 | case -ERESTART_RESTARTBLOCK: | 
| 334 | case -ERESTARTNOHAND: | 363 | case -ERESTARTNOHAND: | 
| 335 | regs->ax = -EINTR; | 364 | regs->ax = -EINTR; | 
| @@ -426,10 +455,9 @@ static void do_signal(struct pt_regs *regs) | |||
| 426 | } | 455 | } | 
| 427 | 456 | ||
| 428 | /* Did we come from a system call? */ | 457 | /* Did we come from a system call? */ | 
| 429 | if ((long)regs->orig_ax >= 0) { | 458 | if (current_syscall(regs) >= 0) { | 
| 430 | /* Restart the system call - no handlers present */ | 459 | /* Restart the system call - no handlers present */ | 
| 431 | long res = regs->ax; | 460 | switch (current_syscall_ret(regs)) { | 
| 432 | switch (res) { | ||
| 433 | case -ERESTARTNOHAND: | 461 | case -ERESTARTNOHAND: | 
| 434 | case -ERESTARTSYS: | 462 | case -ERESTARTSYS: | 
| 435 | case -ERESTARTNOINTR: | 463 | case -ERESTARTNOINTR: | 
| diff --git a/arch/x86/mm/ioremap.c b/arch/x86/mm/ioremap.c index ac3c959e271d..8fe576baa148 100644 --- a/arch/x86/mm/ioremap.c +++ b/arch/x86/mm/ioremap.c | |||
| @@ -134,8 +134,6 @@ static void __iomem *__ioremap(unsigned long phys_addr, unsigned long size, | |||
| 134 | return NULL; | 134 | return NULL; | 
| 135 | } | 135 | } | 
| 136 | 136 | ||
| 137 | WARN_ON_ONCE(page_is_ram(pfn)); | ||
| 138 | |||
| 139 | switch (mode) { | 137 | switch (mode) { | 
| 140 | case IOR_MODE_UNCACHED: | 138 | case IOR_MODE_UNCACHED: | 
| 141 | default: | 139 | default: | 
| diff --git a/arch/x86/mm/pgtable_32.c b/arch/x86/mm/pgtable_32.c index 73aba7125203..2f9e9afcb9f4 100644 --- a/arch/x86/mm/pgtable_32.c +++ b/arch/x86/mm/pgtable_32.c | |||
| @@ -342,12 +342,16 @@ static void pgd_mop_up_pmds(struct mm_struct *mm, pgd_t *pgdp) | |||
| 342 | 342 | ||
| 343 | pgd_t *pgd_alloc(struct mm_struct *mm) | 343 | pgd_t *pgd_alloc(struct mm_struct *mm) | 
| 344 | { | 344 | { | 
| 345 | pgd_t *pgd = quicklist_alloc(0, GFP_KERNEL, pgd_ctor); | 345 | pgd_t *pgd = (pgd_t *)__get_free_page(GFP_KERNEL | __GFP_ZERO); | 
| 346 | 346 | ||
| 347 | mm->pgd = pgd; /* so that alloc_pd can use it */ | 347 | /* so that alloc_pd can use it */ | 
| 348 | mm->pgd = pgd; | ||
| 349 | if (pgd) | ||
| 350 | pgd_ctor(pgd); | ||
| 348 | 351 | ||
| 349 | if (pgd && !pgd_prepopulate_pmd(mm, pgd)) { | 352 | if (pgd && !pgd_prepopulate_pmd(mm, pgd)) { | 
| 350 | quicklist_free(0, pgd_dtor, pgd); | 353 | pgd_dtor(pgd); | 
| 354 | free_page((unsigned long)pgd); | ||
| 351 | pgd = NULL; | 355 | pgd = NULL; | 
| 352 | } | 356 | } | 
| 353 | 357 | ||
| @@ -357,12 +361,8 @@ pgd_t *pgd_alloc(struct mm_struct *mm) | |||
| 357 | void pgd_free(struct mm_struct *mm, pgd_t *pgd) | 361 | void pgd_free(struct mm_struct *mm, pgd_t *pgd) | 
| 358 | { | 362 | { | 
| 359 | pgd_mop_up_pmds(mm, pgd); | 363 | pgd_mop_up_pmds(mm, pgd); | 
| 360 | quicklist_free(0, pgd_dtor, pgd); | 364 | pgd_dtor(pgd); | 
| 361 | } | 365 | free_page((unsigned long)pgd); | 
| 362 | |||
| 363 | void check_pgt_cache(void) | ||
| 364 | { | ||
| 365 | quicklist_trim(0, pgd_dtor, 25, 16); | ||
| 366 | } | 366 | } | 
| 367 | 367 | ||
| 368 | void __pte_free_tlb(struct mmu_gather *tlb, struct page *pte) | 368 | void __pte_free_tlb(struct mmu_gather *tlb, struct page *pte) | 
