diff options
Diffstat (limited to 'arch/s390/mm')
| -rw-r--r-- | arch/s390/mm/fault.c | 6 | ||||
| -rw-r--r-- | arch/s390/mm/pgtable.c | 5 |
2 files changed, 9 insertions, 2 deletions
diff --git a/arch/s390/mm/fault.c b/arch/s390/mm/fault.c index 811937bb90be..9065d5aa3932 100644 --- a/arch/s390/mm/fault.c +++ b/arch/s390/mm/fault.c | |||
| @@ -374,6 +374,12 @@ static noinline void do_fault_error(struct pt_regs *regs, int fault) | |||
| 374 | do_no_context(regs); | 374 | do_no_context(regs); |
| 375 | else | 375 | else |
| 376 | pagefault_out_of_memory(); | 376 | pagefault_out_of_memory(); |
| 377 | } else if (fault & VM_FAULT_SIGSEGV) { | ||
| 378 | /* Kernel mode? Handle exceptions or die */ | ||
| 379 | if (!user_mode(regs)) | ||
| 380 | do_no_context(regs); | ||
| 381 | else | ||
| 382 | do_sigsegv(regs, SEGV_MAPERR); | ||
| 377 | } else if (fault & VM_FAULT_SIGBUS) { | 383 | } else if (fault & VM_FAULT_SIGBUS) { |
| 378 | /* Kernel mode? Handle exceptions or die */ | 384 | /* Kernel mode? Handle exceptions or die */ |
| 379 | if (!user_mode(regs)) | 385 | if (!user_mode(regs)) |
diff --git a/arch/s390/mm/pgtable.c b/arch/s390/mm/pgtable.c index be99357d238c..3cf8cc03fff6 100644 --- a/arch/s390/mm/pgtable.c +++ b/arch/s390/mm/pgtable.c | |||
| @@ -322,11 +322,12 @@ static int gmap_alloc_table(struct gmap *gmap, unsigned long *table, | |||
| 322 | static unsigned long __gmap_segment_gaddr(unsigned long *entry) | 322 | static unsigned long __gmap_segment_gaddr(unsigned long *entry) |
| 323 | { | 323 | { |
| 324 | struct page *page; | 324 | struct page *page; |
| 325 | unsigned long offset; | 325 | unsigned long offset, mask; |
| 326 | 326 | ||
| 327 | offset = (unsigned long) entry / sizeof(unsigned long); | 327 | offset = (unsigned long) entry / sizeof(unsigned long); |
| 328 | offset = (offset & (PTRS_PER_PMD - 1)) * PMD_SIZE; | 328 | offset = (offset & (PTRS_PER_PMD - 1)) * PMD_SIZE; |
| 329 | page = pmd_to_page((pmd_t *) entry); | 329 | mask = ~(PTRS_PER_PMD * sizeof(pmd_t) - 1); |
| 330 | page = virt_to_page((void *)((unsigned long) entry & mask)); | ||
| 330 | return page->index + offset; | 331 | return page->index + offset; |
| 331 | } | 332 | } |
| 332 | 333 | ||
