|
@@ -34,7 +34,6 @@
|
|
|
/*
|
|
|
* Manage page tables very early on.
|
|
|
*/
|
|
|
-extern pgd_t early_top_pgt[PTRS_PER_PGD];
|
|
|
extern pmd_t early_dynamic_pgts[EARLY_DYNAMIC_PAGE_TABLES][PTRS_PER_PMD];
|
|
|
static unsigned int __initdata next_early_pgt;
|
|
|
pmdval_t early_pmd_flags = __PAGE_KERNEL_LARGE & ~(_PAGE_GLOBAL | _PAGE_NX);
|
|
@@ -181,13 +180,13 @@ static void __init reset_early_page_tables(void)
|
|
|
}
|
|
|
|
|
|
/* Create a new PMD entry */
|
|
|
-int __init early_make_pgtable(unsigned long address)
|
|
|
+int __init __early_make_pgtable(unsigned long address, pmdval_t pmd)
|
|
|
{
|
|
|
unsigned long physaddr = address - __PAGE_OFFSET;
|
|
|
pgdval_t pgd, *pgd_p;
|
|
|
p4dval_t p4d, *p4d_p;
|
|
|
pudval_t pud, *pud_p;
|
|
|
- pmdval_t pmd, *pmd_p;
|
|
|
+ pmdval_t *pmd_p;
|
|
|
|
|
|
/* Invalid address or early pgt is done ? */
|
|
|
if (physaddr >= MAXMEM || read_cr3_pa() != __pa_nodebug(early_top_pgt))
|
|
@@ -246,12 +245,21 @@ again:
|
|
|
memset(pmd_p, 0, sizeof(*pmd_p) * PTRS_PER_PMD);
|
|
|
*pud_p = (pudval_t)pmd_p - __START_KERNEL_map + phys_base + _KERNPG_TABLE;
|
|
|
}
|
|
|
- pmd = (physaddr & PMD_MASK) + early_pmd_flags;
|
|
|
pmd_p[pmd_index(address)] = pmd;
|
|
|
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
+int __init early_make_pgtable(unsigned long address)
|
|
|
+{
|
|
|
+ unsigned long physaddr = address - __PAGE_OFFSET;
|
|
|
+ pmdval_t pmd;
|
|
|
+
|
|
|
+ pmd = (physaddr & PMD_MASK) + early_pmd_flags;
|
|
|
+
|
|
|
+ return __early_make_pgtable(address, pmd);
|
|
|
+}
|
|
|
+
|
|
|
/* Don't add a printk in there. printk relies on the PDA which is not initialized
|
|
|
yet. */
|
|
|
static void __init clear_bss(void)
|
|
@@ -274,6 +282,12 @@ static void __init copy_bootdata(char *real_mode_data)
|
|
|
char * command_line;
|
|
|
unsigned long cmd_line_ptr;
|
|
|
|
|
|
+ /*
|
|
|
+ * If SME is active, this will create decrypted mappings of the
|
|
|
+ * boot data in advance of the copy operations.
|
|
|
+ */
|
|
|
+ sme_map_bootdata(real_mode_data);
|
|
|
+
|
|
|
memcpy(&boot_params, real_mode_data, sizeof boot_params);
|
|
|
sanitize_boot_params(&boot_params);
|
|
|
cmd_line_ptr = get_cmd_line_ptr();
|
|
@@ -281,6 +295,14 @@ static void __init copy_bootdata(char *real_mode_data)
|
|
|
command_line = __va(cmd_line_ptr);
|
|
|
memcpy(boot_command_line, command_line, COMMAND_LINE_SIZE);
|
|
|
}
|
|
|
+
|
|
|
+ /*
|
|
|
+ * The old boot data is no longer needed and won't be reserved,
|
|
|
+ * freeing up that memory for use by the system. If SME is active,
|
|
|
+ * we need to remove the mappings that were created so that the
|
|
|
+ * memory doesn't remain mapped as decrypted.
|
|
|
+ */
|
|
|
+ sme_unmap_bootdata(real_mode_data);
|
|
|
}
|
|
|
|
|
|
asmlinkage __visible void __init x86_64_start_kernel(char * real_mode_data)
|