Acked-by: Gang Wei <gang....@intel.com>

> From: Xiaoyan Zhang <xiaoyan.zh...@intel.com>
> 
> For TXT boot, while Linux kernel trys to shutdown/S3/S4/reboot, it need to
> jump back to tboot code and do TXT teardown work. Previously kernel zapped
> all mem page identity mapping (va=pa) after booting, so tboot code mem
> address
> was mapped again with identity mapping. Now kernel didn't zap the identity
> mapping page table, so tboot related code can remove the remapping code
> before
> trapping back now.
> 
> Signed-off-by: Xiaoyan Zhang <xiaoyan.zh...@intel.com>
> ---
>  arch/x86/kernel/tboot.c |   78
+++--------------------------------------------
>  1 files changed, 5 insertions(+), 73 deletions(-)
> 
> diff --git a/arch/x86/kernel/tboot.c b/arch/x86/kernel/tboot.c
> index f84fe00..d4f460f 100644
> --- a/arch/x86/kernel/tboot.c
> +++ b/arch/x86/kernel/tboot.c
> @@ -103,71 +103,13 @@ void __init tboot_probe(void)
>       pr_debug("tboot_size: 0x%x\n", tboot->tboot_size);
>  }
> 
> -static pgd_t *tboot_pg_dir;
> -static struct mm_struct tboot_mm = {
> -     .mm_rb          = RB_ROOT,
> -     .pgd            = swapper_pg_dir,
> -     .mm_users       = ATOMIC_INIT(2),
> -     .mm_count       = ATOMIC_INIT(1),
> -     .mmap_sem       = __RWSEM_INITIALIZER(init_mm.mmap_sem),
> -     .page_table_lock =
> __SPIN_LOCK_UNLOCKED(init_mm.page_table_lock),
> -     .mmlist         = LIST_HEAD_INIT(init_mm.mmlist),
> -};
> -
>  static inline void switch_to_tboot_pt(void)
>  {
> -     write_cr3(virt_to_phys(tboot_pg_dir));
> -}
> -
> -static int map_tboot_page(unsigned long vaddr, unsigned long pfn,
> -                       pgprot_t prot)
> -{
> -     pgd_t *pgd;
> -     pud_t *pud;
> -     pmd_t *pmd;
> -     pte_t *pte;
> -
> -     pgd = pgd_offset(&tboot_mm, vaddr);
> -     pud = pud_alloc(&tboot_mm, pgd, vaddr);
> -     if (!pud)
> -             return -1;
> -     pmd = pmd_alloc(&tboot_mm, pud, vaddr);
> -     if (!pmd)
> -             return -1;
> -     pte = pte_alloc_map(&tboot_mm, NULL, pmd, vaddr);
> -     if (!pte)
> -             return -1;
> -     set_pte_at(&tboot_mm, vaddr, pte, pfn_pte(pfn, prot));
> -     pte_unmap(pte);
> -     return 0;
> -}
> -
> -static int map_tboot_pages(unsigned long vaddr, unsigned long start_pfn,
> -                        unsigned long nr)
> -{
> -     /* Reuse the original kernel mapping */
> -     tboot_pg_dir = pgd_alloc(&tboot_mm);
> -     if (!tboot_pg_dir)
> -             return -1;
> -
> -     for (; nr > 0; nr--, vaddr += PAGE_SIZE, start_pfn++) {
> -             if (map_tboot_page(vaddr, start_pfn, PAGE_KERNEL_EXEC))
> -                     return -1;
> -     }
> -
> -     return 0;
> -}
> -
> -static void tboot_create_trampoline(void)
> -{
> -     u32 map_base, map_size;
> -
> -     /* Create identity map for tboot shutdown code. */
> -     map_base = PFN_DOWN(tboot->tboot_base);
> -     map_size = PFN_UP(tboot->tboot_size);
> -     if (map_tboot_pages(map_base << PAGE_SHIFT, map_base, map_size))
> -             panic("tboot: Error mapping tboot pages (mfns) @ 0x%x,
0x%x\n",
> -                   map_base, map_size);
> +#ifdef CONFIG_X86_32
> +     load_cr3(initial_page_table);
> +#else
> +     write_cr3(real_mode_header->trampoline_pgd);
> +#endif
>  }
> 
>  #ifdef CONFIG_ACPI_SLEEP
> @@ -225,14 +167,6 @@ void tboot_shutdown(u32 shutdown_type)
>       if (!tboot_enabled())
>               return;
> 
> -     /*
> -      * if we're being called before the 1:1 mapping is set up then just
> -      * return and let the normal shutdown happen; this should only be
> -      * due to very early panic()
> -      */
> -     if (!tboot_pg_dir)
> -             return;
> -
>       /* if this is S3 then set regions to MAC */
>       if (shutdown_type == TB_SHUTDOWN_S3)
>               if (tboot_setup_sleep())
> @@ -343,8 +277,6 @@ static __init int tboot_late_init(void)
>       if (!tboot_enabled())
>               return 0;
> 
> -     tboot_create_trampoline();
> -
>       atomic_set(&ap_wfs_count, 0);
>       register_hotcpu_notifier(&tboot_cpu_notifier);
> 
> --
> 1.7.7.6

Attachment: smime.p7s
Description: S/MIME cryptographic signature

Reply via email to