Patched to 2.6.10-1.14_FC2.
[linux-2.6.git] / fs / proc / task_mmu.c
index e2ecc45..def2511 100644 (file)
@@ -9,7 +9,7 @@ char *task_mem(struct mm_struct *mm, char *buffer)
        unsigned long data, text, lib;
 
        data = mm->total_vm - mm->shared_vm - mm->stack_vm;
-       text = (mm->end_code - mm->start_code) >> 10;
+       text = (PAGE_ALIGN(mm->end_code) - (mm->start_code & PAGE_MASK)) >> 10;
        lib = (mm->exec_vm << (PAGE_SHIFT-10)) - text;
        buffer += sprintf(buffer,
                "VmSize:\t%8lu kB\n"
@@ -19,22 +19,23 @@ char *task_mem(struct mm_struct *mm, char *buffer)
                "VmStk:\t%8lu kB\n"
                "VmExe:\t%8lu kB\n"
                "VmLib:\t%8lu kB\n"
+               "VmPTE:\t%8lu kB\n"
                "StaBrk:\t%08lx kB\n"
                "Brk:\t%08lx kB\n"
                "StaStk:\t%08lx kB\n"
-#if __i386__
-               "ExecLim:\t%08lx\n"
-#endif
                ,
                (mm->total_vm - mm->reserved_vm) << (PAGE_SHIFT-10),
                mm->locked_vm << (PAGE_SHIFT-10),
                mm->rss << (PAGE_SHIFT-10),
                data << (PAGE_SHIFT-10),
-               mm->stack_vm << (PAGE_SHIFT-10), text, lib, mm->start_brk, mm->brk, mm->start_stack
+               mm->stack_vm << (PAGE_SHIFT-10), text, lib,
+               (PTRS_PER_PTE*sizeof(pte_t)*mm->nr_ptes) >> 10,
+               mm->start_brk, mm->brk, mm->start_stack);
 #if __i386__
-               , mm->context.exec_limit
+       if (!nx_enabled)
+               buffer += sprintf(buffer,
+                               "ExecLim:\t%08lx\n", mm->context.exec_limit);
 #endif
-               );
        return buffer;
 }
 
@@ -47,7 +48,8 @@ int task_statm(struct mm_struct *mm, int *shared, int *text,
               int *data, int *resident)
 {
        *shared = mm->rss - mm->anon_rss;
-       *text = (mm->end_code - mm->start_code) >> PAGE_SHIFT;
+       *text = (PAGE_ALIGN(mm->end_code) - (mm->start_code & PAGE_MASK))
+                                                               >> PAGE_SHIFT;
        *data = mm->total_vm - mm->shared_vm;
        *resident = mm->rss;
        return mm->total_vm;
@@ -55,6 +57,9 @@ int task_statm(struct mm_struct *mm, int *shared, int *text,
 
 static int show_map(struct seq_file *m, void *v)
 {
+#ifdef __i386__
+       struct task_struct *task = m->private;
+#endif
        struct vm_area_struct *map = v;
        struct file *file = map->vm_file;
        int flags = map->vm_flags;
@@ -73,7 +78,13 @@ static int show_map(struct seq_file *m, void *v)
                        map->vm_end,
                        flags & VM_READ ? 'r' : '-',
                        flags & VM_WRITE ? 'w' : '-',
-                       flags & VM_EXEC ? 'x' : '-',
+                       (flags & VM_EXEC
+#ifdef __i386__
+                               || (!nx_enabled &&
+                               (map->vm_start < task->mm->context.exec_limit))
+#endif
+                       )
+                               ? 'x' : '-',
                        flags & VM_MAYSHARE ? 's' : 'p',
                        map->vm_pgoff << PAGE_SHIFT,
                        MAJOR(dev), MINOR(dev), ino, &len);