diff options
| -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 | ||||
| -rw-r--r-- | include/asm-x86/pgtable_32.h | 5 |
6 files changed, 52 insertions, 23 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) |
diff --git a/include/asm-x86/pgtable_32.h b/include/asm-x86/pgtable_32.h index a842c7222b1e..4e6a0fca0b47 100644 --- a/include/asm-x86/pgtable_32.h +++ b/include/asm-x86/pgtable_32.h | |||
| @@ -26,10 +26,9 @@ struct mm_struct; | |||
| 26 | struct vm_area_struct; | 26 | struct vm_area_struct; |
| 27 | 27 | ||
| 28 | extern pgd_t swapper_pg_dir[1024]; | 28 | extern pgd_t swapper_pg_dir[1024]; |
| 29 | extern struct kmem_cache *pmd_cache; | ||
| 30 | void check_pgt_cache(void); | ||
| 31 | 29 | ||
| 32 | static inline void pgtable_cache_init(void) {} | 30 | static inline void pgtable_cache_init(void) { } |
| 31 | static inline void check_pgt_cache(void) { } | ||
| 33 | void paging_init(void); | 32 | void paging_init(void); |
| 34 | 33 | ||
| 35 | 34 | ||
