mirror of
https://github.com/torvalds/linux.git
synced 2024-11-16 00:52:01 +00:00
6842ef0e85
This patch aims to make the access of struct desc_struct variables equal across architectures. In this patch, I unify the i386 and x86_64 versions under an anonymous union, keeping the way they are accessed untouched (a and b for 32-bit code, individual bit-fields for 64-bit). This solution is not beautiful, but will allow us to integrate common code that differed by the way descriptors were used. This is to be viewed incrementally. There's simply too much code to be fixed at once. In the future, goal is to set up in a single way of acessing the desc_struct fields. Signed-off-by: Glauber de Oliveira Costa <gcosta@redhat.com> Signed-off-by: Ingo Molnar <mingo@elte.hu> Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
87 lines
2.2 KiB
C
87 lines
2.2 KiB
C
#ifndef _X86_LGUEST_H
|
|
#define _X86_LGUEST_H
|
|
|
|
#define GDT_ENTRY_LGUEST_CS 10
|
|
#define GDT_ENTRY_LGUEST_DS 11
|
|
#define LGUEST_CS (GDT_ENTRY_LGUEST_CS * 8)
|
|
#define LGUEST_DS (GDT_ENTRY_LGUEST_DS * 8)
|
|
|
|
#ifndef __ASSEMBLY__
|
|
#include <asm/desc.h>
|
|
|
|
#define GUEST_PL 1
|
|
|
|
/* Every guest maps the core switcher code. */
|
|
#define SHARED_SWITCHER_PAGES \
|
|
DIV_ROUND_UP(end_switcher_text - start_switcher_text, PAGE_SIZE)
|
|
/* Pages for switcher itself, then two pages per cpu */
|
|
#define TOTAL_SWITCHER_PAGES (SHARED_SWITCHER_PAGES + 2 * NR_CPUS)
|
|
|
|
/* We map at -4M for ease of mapping into the guest (one PTE page). */
|
|
#define SWITCHER_ADDR 0xFFC00000
|
|
|
|
/* Found in switcher.S */
|
|
extern unsigned long default_idt_entries[];
|
|
|
|
struct lguest_regs
|
|
{
|
|
/* Manually saved part. */
|
|
unsigned long eax, ebx, ecx, edx;
|
|
unsigned long esi, edi, ebp;
|
|
unsigned long gs;
|
|
unsigned long fs, ds, es;
|
|
unsigned long trapnum, errcode;
|
|
/* Trap pushed part */
|
|
unsigned long eip;
|
|
unsigned long cs;
|
|
unsigned long eflags;
|
|
unsigned long esp;
|
|
unsigned long ss;
|
|
};
|
|
|
|
/* This is a guest-specific page (mapped ro) into the guest. */
|
|
struct lguest_ro_state
|
|
{
|
|
/* Host information we need to restore when we switch back. */
|
|
u32 host_cr3;
|
|
struct Xgt_desc_struct host_idt_desc;
|
|
struct Xgt_desc_struct host_gdt_desc;
|
|
u32 host_sp;
|
|
|
|
/* Fields which are used when guest is running. */
|
|
struct Xgt_desc_struct guest_idt_desc;
|
|
struct Xgt_desc_struct guest_gdt_desc;
|
|
struct i386_hw_tss guest_tss;
|
|
struct desc_struct guest_idt[IDT_ENTRIES];
|
|
struct desc_struct guest_gdt[GDT_ENTRIES];
|
|
};
|
|
|
|
struct lguest_arch
|
|
{
|
|
/* The GDT entries copied into lguest_ro_state when running. */
|
|
struct desc_struct gdt[GDT_ENTRIES];
|
|
|
|
/* The IDT entries: some copied into lguest_ro_state when running. */
|
|
struct desc_struct idt[IDT_ENTRIES];
|
|
|
|
/* The address of the last guest-visible pagefault (ie. cr2). */
|
|
unsigned long last_pagefault;
|
|
};
|
|
|
|
static inline void lguest_set_ts(void)
|
|
{
|
|
u32 cr0;
|
|
|
|
cr0 = read_cr0();
|
|
if (!(cr0 & 8))
|
|
write_cr0(cr0|8);
|
|
}
|
|
|
|
/* Full 4G segment descriptors, suitable for CS and DS. */
|
|
#define FULL_EXEC_SEGMENT ((struct desc_struct){ { {0x0000ffff, 0x00cf9b00} } })
|
|
#define FULL_SEGMENT ((struct desc_struct){ { {0x0000ffff, 0x00cf9300} } })
|
|
|
|
#endif /* __ASSEMBLY__ */
|
|
|
|
#endif
|