]> err.no Git - linux-2.6/blobdiff - arch/x86/mm/fault_64.c
x86: make sure initmem is writable
[linux-2.6] / arch / x86 / mm / fault_64.c
index 75b7b165bdf337b5a85562d7d21297c992837e67..dd26e680a43166ca9abe0ced6390989edddf4349 100644 (file)
@@ -514,6 +514,17 @@ good_area:
                tsk->maj_flt++;
        else
                tsk->min_flt++;
+
+#ifdef CONFIG_X86_32
+       /*
+        * Did it hit the DOS screen memory VA from vm86 mode?
+        */
+       if (v8086_mode(regs)) {
+               unsigned long bit = (address - 0xA0000) >> PAGE_SHIFT;
+               if (bit < 32)
+                       tsk->thread.screen_bitmap |= 1 << bit;
+       }
+#endif
        up_read(&mm->mmap_sem);
        return;
 
@@ -550,13 +561,15 @@ bad_area_nosemaphore:
                    printk_ratelimit()) {
                        printk(
 #ifdef CONFIG_X86_32
-                       "%s%s[%d]: segfault at %08lx ip %08lx sp %08lx error %lx\n",
+                       "%s%s[%d]: segfault at %lx ip %08lx sp %08lx error %lx",
 #else
-                       "%s%s[%d]: segfault at %lx ip %lx sp %lx error %lx\n",
+                       "%s%s[%d]: segfault at %lx ip %lx sp %lx error %lx",
 #endif
                        task_pid_nr(tsk) > 1 ? KERN_INFO : KERN_EMERG,
                        tsk->comm, task_pid_nr(tsk), address, regs->ip,
                        regs->sp, error_code);
+                       print_vma_addr(" in ", regs->ip);
+                       printk("\n");
                }
 
                tsk->thread.cr2 = address;
@@ -595,7 +608,7 @@ no_context:
        else
                printk(KERN_ALERT "Unable to handle kernel paging request");
        printk(" at %016lx RIP: \n" KERN_ALERT, address);
-       printk_address(regs->ip, regs->bp);
+       printk_address(regs->ip, 1);
        dump_pagetable(address);
        tsk->thread.cr2 = address;
        tsk->thread.trap_no = 14;