UML - Move um_virt_to_phys
PATCH 1/8 UML - Move um_virt_to_phys
This patchset makes UML build and run with three-level page tables on 32-bit hosts. This is an uncommon use case, but the code here needed fixing and cleaning up, so 32-bit three-level pages tables were tested to make sure the changes are good.
Patch 1 - code movement
Patch 2 - header untangling
Patch 3 - style fixups in files affected so far
Patch 4 - clean up use of current.h
Patch 5 - fix sizes of types that are different between 2 and 3-level
page tables - three-level page table support should build at this point
Patch 6 - tidy (i.e. eliminate much of) the code that figures out how
big the address space is
Patch 7 - change um_virt_to_phys into virt_to_pte, clean its
interface, and clean its (so far) one caller
Patch 8 - the stub pages are covered with a VMA, allowing some nasty
code to be thrown out - three-level page tables now work
This patch:
um_virt_to_phys only has one user, so it can be moved to the same file and made static. Its declarations in pgtable.h and ksyms.c are also gone.
current_cmd was another apparent user, but it itself isn't used, so it is deleted.
--- arch/um/kernel/ksyms.c | 1 arch/um/kernel/process.c | 43 ------------------------------------------ arch/um/kernel/skas/uaccess.c | 34 +++++++++++++++++++++++++++++++-- include/asm-um/pgtable.h | 3 -- 4 files changed, 32 insertions(+), 49 deletions(-)
arch/um/kernel/process.c +0 -43
@@ -256,49 +256,6 @@ void cpu_idle(void)default_idle (); } -void *um_virt_to_phys (struct task_struct *task,unsigned long addr, -pte_t *pte_out) -{ -pgd_t *pgd; -pud_t *pud; -pmd_t *pmd; -pte_t *pte; -pte_t ptent; - -if (task->mm ==NULL ) -return ERR_PTR (-EINVAL ); - pgd =pgd_offset (task->mm, addr); -if (!pgd_present (*pgd)) -return ERR_PTR (-EINVAL ); - - pud =pud_offset (pgd, addr); -if (!pud_present (*pud)) -return ERR_PTR (-EINVAL ); - - pmd =pmd_offset (pud, addr); -if (!pmd_present (*pmd)) -return ERR_PTR (-EINVAL ); - - pte =pte_offset_kernel (pmd, addr); - ptent = *pte; -if (!pte_present (ptent)) -return ERR_PTR (-EINVAL ); - -if (pte_out !=NULL ) - *pte_out = ptent; -return (void *) (pte_val (ptent) &PAGE_MASK ) + (addr & ~PAGE_MASK ); -} - -char *current_cmd (void ) -{ -#if defined(CONFIG_SMP ) || defined(CONFIG_HIGHMEM ) -return "(Unknown)" ; -#else -void *addr =um_virt_to_phys (current, current->mm->arg_start,NULL ); -return IS_ERR (addr) ?"(Unknown)" :__va ((unsigned long ) addr); -#endif -} -int __cant_sleep (void ) {return in_atomic () ||irqs_disabled () ||in_interrupt ();/* Is in_interrupt() really needed? */
arch/um/kernel/skas/uaccess.c +32 -2
@@ -12,8 +12,38 @@#include "kern_util.h" #include "os.h" -extern void *um_virt_to_phys (struct task_struct *task,unsigned long addr, -pte_t *pte_out); +static void *um_virt_to_phys (struct task_struct *task,unsigned long addr, +pte_t *pte_out) +{ +pgd_t *pgd; +pud_t *pud; +pmd_t *pmd; +pte_t *pte; +pte_t ptent; + +if (task->mm ==NULL ) +return ERR_PTR (-EINVAL ); + pgd =pgd_offset (task->mm, addr); +if (!pgd_present (*pgd)) +return ERR_PTR (-EINVAL ); + + pud =pud_offset (pgd, addr); +if (!pud_present (*pud)) +return ERR_PTR (-EINVAL ); + + pmd =pmd_offset (pud, addr); +if (!pmd_present (*pmd)) +return ERR_PTR (-EINVAL ); + + pte =pte_offset_kernel (pmd, addr); + ptent = *pte; +if (!pte_present (ptent)) +return ERR_PTR (-EINVAL ); + +if (pte_out !=NULL ) + *pte_out = ptent; +return (void *) (pte_val (ptent) &PAGE_MASK ) + (addr & ~PAGE_MASK ); +}static unsigned long maybe_map (unsigned long virt,int is_write) {
include/asm-um/pgtable.h +0 -3
@@ -31,9 +31,6 @@extern pgd_t swapper_pg_dir[PTRS_PER_PGD ]; -extern void *um_virt_to_phys (struct task_struct *task,unsigned long virt, -pte_t *pte_out); -/* zero page used for uninitialized stuff */ extern unsigned long *empty_zero_page;
arch/um/kernel/ksyms.c +0 -1
@@ -25,7 +25,6 @@ EXPORT_SYMBOL(get_kmem_end);EXPORT_SYMBOL (high_physmem);EXPORT_SYMBOL (empty_zero_page); -EXPORT_SYMBOL (um_virt_to_phys);EXPORT_SYMBOL (handle_page_fault);EXPORT_SYMBOL (find_iomem);
-------------------------------------------------------------------------
This SF.net email is sponsored by: Microsoft Defy all challenges. Microsoft(R) Visual Studio 2005.
http://clk.atdmt.com/MRT/go/vse0120000070mrt/direct/01/
_______________________________________________
User-mode-linux-devel mailing list [email protected]
https://lists.sourceforge.net/lists/listinfo/user-mode-linux-devel