linux/arch/x86/include/asm/xen/interface_32.h
<<
>>
Prefs
   1/******************************************************************************
   2 * arch-x86_32.h
   3 *
   4 * Guest OS interface to x86 32-bit Xen.
   5 *
   6 * Copyright (c) 2004, K A Fraser
   7 */
   8
   9#ifndef _ASM_X86_XEN_INTERFACE_32_H
  10#define _ASM_X86_XEN_INTERFACE_32_H
  11
  12
  13/*
  14 * These flat segments are in the Xen-private section of every GDT. Since these
  15 * are also present in the initial GDT, many OSes will be able to avoid
  16 * installing their own GDT.
  17 */
  18#define FLAT_RING1_CS 0xe019    /* GDT index 259 */
  19#define FLAT_RING1_DS 0xe021    /* GDT index 260 */
  20#define FLAT_RING1_SS 0xe021    /* GDT index 260 */
  21#define FLAT_RING3_CS 0xe02b    /* GDT index 261 */
  22#define FLAT_RING3_DS 0xe033    /* GDT index 262 */
  23#define FLAT_RING3_SS 0xe033    /* GDT index 262 */
  24
  25#define FLAT_KERNEL_CS FLAT_RING1_CS
  26#define FLAT_KERNEL_DS FLAT_RING1_DS
  27#define FLAT_KERNEL_SS FLAT_RING1_SS
  28#define FLAT_USER_CS    FLAT_RING3_CS
  29#define FLAT_USER_DS    FLAT_RING3_DS
  30#define FLAT_USER_SS    FLAT_RING3_SS
  31
  32/* And the trap vector is... */
  33#define TRAP_INSTR "int $0x82"
  34
  35#define __MACH2PHYS_VIRT_START 0xF5800000
  36#define __MACH2PHYS_VIRT_END   0xF6800000
  37
  38#define __MACH2PHYS_SHIFT      2
  39
  40/*
  41 * Virtual addresses beyond this are not modifiable by guest OSes. The
  42 * machine->physical mapping table starts at this address, read-only.
  43 */
  44#define __HYPERVISOR_VIRT_START 0xF5800000
  45
  46#ifndef __ASSEMBLY__
  47
  48struct cpu_user_regs {
  49    uint32_t ebx;
  50    uint32_t ecx;
  51    uint32_t edx;
  52    uint32_t esi;
  53    uint32_t edi;
  54    uint32_t ebp;
  55    uint32_t eax;
  56    uint16_t error_code;    /* private */
  57    uint16_t entry_vector;  /* private */
  58    uint32_t eip;
  59    uint16_t cs;
  60    uint8_t  saved_upcall_mask;
  61    uint8_t  _pad0;
  62    uint32_t eflags;        /* eflags.IF == !saved_upcall_mask */
  63    uint32_t esp;
  64    uint16_t ss, _pad1;
  65    uint16_t es, _pad2;
  66    uint16_t ds, _pad3;
  67    uint16_t fs, _pad4;
  68    uint16_t gs, _pad5;
  69};
  70DEFINE_GUEST_HANDLE_STRUCT(cpu_user_regs);
  71
  72typedef uint64_t tsc_timestamp_t; /* RDTSC timestamp */
  73
  74struct arch_vcpu_info {
  75    unsigned long cr2;
  76    unsigned long pad[5]; /* sizeof(struct vcpu_info) == 64 */
  77};
  78
  79struct xen_callback {
  80        unsigned long cs;
  81        unsigned long eip;
  82};
  83typedef struct xen_callback xen_callback_t;
  84
  85#define XEN_CALLBACK(__cs, __eip)                               \
  86        ((struct xen_callback){ .cs = (__cs), .eip = (unsigned long)(__eip) })
  87#endif /* !__ASSEMBLY__ */
  88
  89
  90/*
  91 * Page-directory addresses above 4GB do not fit into architectural %cr3.
  92 * When accessing %cr3, or equivalent field in vcpu_guest_context, guests
  93 * must use the following accessor macros to pack/unpack valid MFNs.
  94 *
  95 * Note that Xen is using the fact that the pagetable base is always
  96 * page-aligned, and putting the 12 MSB of the address into the 12 LSB
  97 * of cr3.
  98 */
  99#define xen_pfn_to_cr3(pfn) (((unsigned)(pfn) << 12) | ((unsigned)(pfn) >> 20))
 100#define xen_cr3_to_pfn(cr3) (((unsigned)(cr3) >> 12) | ((unsigned)(cr3) << 20))
 101
 102#endif /* _ASM_X86_XEN_INTERFACE_32_H */
 103