kexec/i386: kexec page table code clean up - page table setup in C
Subsystems (3)
PATCH 2/2 kexec/i386: kexec page table code clean up - page table setup in C
This patch transforms the kexec page tables setup code from assembler code to C code in machine_kexec_prepare. This improves readability and reduces code line number.
--- arch/x86/kernel/machine_kexec_32.c | 59 ++++++++++++++---- arch/x86/kernel/relocate_kernel_32.S | 114 ----------------------------------- include/asm-x86/kexec_32.h | 18 ----- 3 files changed, 48 insertions(+), 143 deletions(-)
arch/x86/kernel/machine_kexec_32.c +46 -13
@@ -97,6 +97,45 @@ static int machine_kexec_alloc_page_tablreturn 0 ; } +static void machine_kexec_page_table_set_one ( +pgd_t *pgd,pmd_t *pmd,pte_t *pte, +unsigned long vaddr,unsigned long paddr) +{ +pud_t *pud; + + pgd +=pgd_index (vaddr); +#ifdef CONFIG_X86_PAE +if (!(pgd_val (*pgd) & _PAGE_PRESENT)) +set_pgd (pgd,__pgd (__pa (pmd) | _PAGE_PRESENT)); +#endif + pud =pud_offset (pgd, vaddr); + pmd =pmd_offset (pud, vaddr); +if (!(pmd_val (*pmd) & _PAGE_PRESENT)) +set_pmd (pmd,__pmd (__pa (pte) | _PAGE_TABLE)); + pte =pte_offset_kernel (pmd, vaddr); +set_pte (pte,pfn_pte (paddr >>PAGE_SHIFT ,PAGE_KERNEL_EXEC )); +} + +static void machine_kexec_prepare_page_tables (struct kimage *image) +{ +void *control_page; +pmd_t *pmd =0 ; + + control_page =page_address (image->control_code_page); +#ifdef CONFIG_X86_PAE + pmd = image->arch_kimage.pmd0; +#endif +machine_kexec_page_table_set_one ( + image->arch_kimage.pgd, pmd, image->arch_kimage.pte0, + (unsigned long )relocate_kernel,__pa (control_page)); +#ifdef CONFIG_X86_PAE + pmd = image->arch_kimage.pmd1; +#endif +machine_kexec_page_table_set_one ( + image->arch_kimage.pgd, pmd, image->arch_kimage.pte1, +__pa (control_page),__pa (control_page)); +} +/* * A architecture hook called to validate the * proposed image and prepare the control pages
@@ -109,10 +148,16 @@ static int machine_kexec_alloc_page_tabl* later. * * - Allocate page tables +* - Setup page tables */ int machine_kexec_prepare (struct kimage *image) { -return machine_kexec_alloc_page_tables (image); +int error; + error =machine_kexec_alloc_page_tables (image); +if (error) +return error; +machine_kexec_prepare_page_tables (image); +return 0 ; }/*
@@ -140,19 +185,7 @@ NORET_TYPE void machine_kexec(struct kimmemcpy (control_page, relocate_kernel,PAGE_SIZE ); page_list[PA_CONTROL_PAGE ] =__pa (control_page); - page_list[VA_CONTROL_PAGE ] = (unsigned long )relocate_kernel; page_list[PA_PGD ] =__pa (image->arch_kimage.pgd); - page_list[VA_PGD ] = (unsigned long )image->arch_kimage.pgd; -#ifdef CONFIG_X86_PAE - page_list[PA_PMD_0 ] =__pa (image->arch_kimage.pmd0); - page_list[VA_PMD_0 ] = (unsigned long )image->arch_kimage.pmd0; - page_list[PA_PMD_1 ] =__pa (image->arch_kimage.pmd1); - page_list[VA_PMD_1 ] = (unsigned long )image->arch_kimage.pmd1; -#endif - page_list[PA_PTE_0 ] =__pa (image->arch_kimage.pte0); - page_list[VA_PTE_0 ] = (unsigned long )image->arch_kimage.pte0; - page_list[PA_PTE_1 ] =__pa (image->arch_kimage.pte1); - page_list[VA_PTE_1 ] = (unsigned long )image->arch_kimage.pte1;/* The segment registers are funny things, they have both a * visible and an invisible part. Whenever the visible part is
arch/x86/kernel/relocate_kernel_32.S +0 -114
126 lines not on this page · raw message
include/asm-x86/kexec_32.h +2 -16
@@ -2,22 +2,8 @@#define _I386_KEXEC_H#define PA_CONTROL_PAGE 0 -#define VA_CONTROL_PAGE 1 -#define PA_PGD 2 -#define VA_PGD 3 -#define PA_PTE_0 4 -#define VA_PTE_0 5 -#define PA_PTE_1 6 -#define VA_PTE_1 7 -#ifdef CONFIG_X86_PAE -#define PA_PMD_0 8 -#define VA_PMD_0 9 -#define PA_PMD_1 10 -#define VA_PMD_1 11 -#define PAGES_NR 12 -#else -#define PAGES_NR 8 -#endif +#define PA_PGD 1 +#define PAGES_NR 2#ifndef __ASSEMBLY__
Quoted 6 lines · Ying
This patch transforms the kexec page tables setup code from assembler code to C code in
machine_kexec_prepare. This improves readability and reduces code line number.Signed-off-by Huang Ying <[email protected]>
Looks good to me.
Thanks
Vivek
_______________________________________________
kexec mailing list
[email protected]
http://lists.infradead.org/mailman/listinfo/kexec
Quoted 3 lines · Ying
This patch transforms the kexec page tables setup code from assembler code to C code in
machine_kexec_prepare. This improves readability and reduces code line number.
This looks good to me.
Simon Horman <[email protected]>
Quoted 1 line
Signed-off-by Huang Ying <[email protected]>
Signature · 7 lines
Horms _______________________________________________ kexec mailing list [email protected] http://lists.infradead.org/mailman/listinfo/kexec