x86, realmode: read cr4 and EFER from kernel for 64-bit trampoline
This patch changes 64-bit trampoline so that CR4 and EFER are provided by the kernel instead of using fixed values. Signed-off-by: Jarkko Sakkinen <jarkko.sakkinen@intel.com> Link: http://lkml.kernel.org/r/1336501366-28617-24-git-send-email-jarkko.sakkinen@intel.com Signed-off-by: H. Peter Anvin <hpa@linux.intel.com>
This commit is contained in:
parent
bf8b88e977
commit
cda846f101
7 changed files with 49 additions and 28 deletions
|
@ -544,13 +544,16 @@ static inline void load_sp0(struct tss_struct *tss,
|
|||
* enable), so that any CPU's that boot up
|
||||
* after us can get the correct flags.
|
||||
*/
|
||||
extern unsigned long mmu_cr4_features;
|
||||
extern unsigned long mmu_cr4_features;
|
||||
extern u32 *trampoline_cr4_features;
|
||||
|
||||
static inline void set_in_cr4(unsigned long mask)
|
||||
{
|
||||
unsigned long cr4;
|
||||
|
||||
mmu_cr4_features |= mask;
|
||||
if (trampoline_cr4_features)
|
||||
*trampoline_cr4_features = mmu_cr4_features;
|
||||
cr4 = read_cr4();
|
||||
cr4 |= mask;
|
||||
write_cr4(cr4);
|
||||
|
@ -561,6 +564,8 @@ static inline void clear_in_cr4(unsigned long mask)
|
|||
unsigned long cr4;
|
||||
|
||||
mmu_cr4_features &= ~mask;
|
||||
if (trampoline_cr4_features)
|
||||
*trampoline_cr4_features = mmu_cr4_features;
|
||||
cr4 = read_cr4();
|
||||
cr4 &= ~mask;
|
||||
write_cr4(cr4);
|
||||
|
|
|
@ -24,18 +24,22 @@ struct real_mode_header {
|
|||
#ifdef CONFIG_X86_32
|
||||
u32 machine_real_restart_asm;
|
||||
#endif
|
||||
} __attribute__((__packed__));
|
||||
};
|
||||
|
||||
/* This must match data at trampoline_32/64.S */
|
||||
struct trampoline_header {
|
||||
#ifdef CONFIG_X86_32
|
||||
u32 start;
|
||||
u16 gdt_pad;
|
||||
u16 gdt_limit;
|
||||
u32 gdt_base;
|
||||
#else
|
||||
u64 start;
|
||||
u32 cr4;
|
||||
u32 efer_low;
|
||||
u32 efer_high;
|
||||
#endif
|
||||
} __attribute__((__packed__));
|
||||
};
|
||||
|
||||
extern struct real_mode_header *real_mode_header;
|
||||
extern unsigned char real_mode_blob_end[];
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue