home *** CD-ROM | disk | FTP | other *** search
/ Mac Easy 2010 May / Mac Life Ubuntu.iso / casper / filesystem.squashfs / usr / src / linux-headers-2.6.28-15 / arch / x86 / include / asm / segment.h < prev    next >
Encoding:
C/C++ Source or Header  |  2008-12-24  |  5.9 KB  |  210 lines

  1. #ifndef _ASM_X86_SEGMENT_H
  2. #define _ASM_X86_SEGMENT_H
  3.  
  4. /* Constructor for a conventional segment GDT (or LDT) entry */
  5. /* This is a macro so it can be used in initializers */
  6. #define GDT_ENTRY(flags, base, limit)            \
  7.     ((((base)  & 0xff000000ULL) << (56-24)) |    \
  8.      (((flags) & 0x0000f0ffULL) << 40) |        \
  9.      (((limit) & 0x000f0000ULL) << (48-16)) |    \
  10.      (((base)  & 0x00ffffffULL) << 16) |        \
  11.      (((limit) & 0x0000ffffULL)))
  12.  
  13. /* Simple and small GDT entries for booting only */
  14.  
  15. #define GDT_ENTRY_BOOT_CS    2
  16. #define __BOOT_CS        (GDT_ENTRY_BOOT_CS * 8)
  17.  
  18. #define GDT_ENTRY_BOOT_DS    (GDT_ENTRY_BOOT_CS + 1)
  19. #define __BOOT_DS        (GDT_ENTRY_BOOT_DS * 8)
  20.  
  21. #define GDT_ENTRY_BOOT_TSS    (GDT_ENTRY_BOOT_CS + 2)
  22. #define __BOOT_TSS        (GDT_ENTRY_BOOT_TSS * 8)
  23.  
  24. #ifdef CONFIG_X86_32
  25. /*
  26.  * The layout of the per-CPU GDT under Linux:
  27.  *
  28.  *   0 - null
  29.  *   1 - reserved
  30.  *   2 - reserved
  31.  *   3 - reserved
  32.  *
  33.  *   4 - unused            <==== new cacheline
  34.  *   5 - unused
  35.  *
  36.  *  ------- start of TLS (Thread-Local Storage) segments:
  37.  *
  38.  *   6 - TLS segment #1            [ glibc's TLS segment ]
  39.  *   7 - TLS segment #2            [ Wine's %fs Win32 segment ]
  40.  *   8 - TLS segment #3
  41.  *   9 - reserved
  42.  *  10 - reserved
  43.  *  11 - reserved
  44.  *
  45.  *  ------- start of kernel segments:
  46.  *
  47.  *  12 - kernel code segment        <==== new cacheline
  48.  *  13 - kernel data segment
  49.  *  14 - default user CS
  50.  *  15 - default user DS
  51.  *  16 - TSS
  52.  *  17 - LDT
  53.  *  18 - PNPBIOS support (16->32 gate)
  54.  *  19 - PNPBIOS support
  55.  *  20 - PNPBIOS support
  56.  *  21 - PNPBIOS support
  57.  *  22 - PNPBIOS support
  58.  *  23 - APM BIOS support
  59.  *  24 - APM BIOS support
  60.  *  25 - APM BIOS support
  61.  *
  62.  *  26 - ESPFIX small SS
  63.  *  27 - per-cpu            [ offset to per-cpu data area ]
  64.  *  28 - unused
  65.  *  29 - unused
  66.  *  30 - unused
  67.  *  31 - TSS for double fault handler
  68.  */
  69. #define GDT_ENTRY_TLS_MIN    6
  70. #define GDT_ENTRY_TLS_MAX     (GDT_ENTRY_TLS_MIN + GDT_ENTRY_TLS_ENTRIES - 1)
  71.  
  72. #define GDT_ENTRY_DEFAULT_USER_CS    14
  73.  
  74. #define GDT_ENTRY_DEFAULT_USER_DS    15
  75.  
  76. #define GDT_ENTRY_KERNEL_BASE    12
  77.  
  78. #define GDT_ENTRY_KERNEL_CS        (GDT_ENTRY_KERNEL_BASE + 0)
  79.  
  80. #define GDT_ENTRY_KERNEL_DS        (GDT_ENTRY_KERNEL_BASE + 1)
  81.  
  82. #define GDT_ENTRY_TSS            (GDT_ENTRY_KERNEL_BASE + 4)
  83. #define GDT_ENTRY_LDT            (GDT_ENTRY_KERNEL_BASE + 5)
  84.  
  85. #define GDT_ENTRY_PNPBIOS_BASE        (GDT_ENTRY_KERNEL_BASE + 6)
  86. #define GDT_ENTRY_APMBIOS_BASE        (GDT_ENTRY_KERNEL_BASE + 11)
  87.  
  88. #define GDT_ENTRY_ESPFIX_SS        (GDT_ENTRY_KERNEL_BASE + 14)
  89. #define __ESPFIX_SS (GDT_ENTRY_ESPFIX_SS * 8)
  90.  
  91. #define GDT_ENTRY_PERCPU            (GDT_ENTRY_KERNEL_BASE + 15)
  92. #ifdef CONFIG_SMP
  93. #define __KERNEL_PERCPU (GDT_ENTRY_PERCPU * 8)
  94. #else
  95. #define __KERNEL_PERCPU 0
  96. #endif
  97.  
  98. #define GDT_ENTRY_DOUBLEFAULT_TSS    31
  99.  
  100. /*
  101.  * The GDT has 32 entries
  102.  */
  103. #define GDT_ENTRIES 32
  104.  
  105. /* The PnP BIOS entries in the GDT */
  106. #define GDT_ENTRY_PNPBIOS_CS32        (GDT_ENTRY_PNPBIOS_BASE + 0)
  107. #define GDT_ENTRY_PNPBIOS_CS16        (GDT_ENTRY_PNPBIOS_BASE + 1)
  108. #define GDT_ENTRY_PNPBIOS_DS        (GDT_ENTRY_PNPBIOS_BASE + 2)
  109. #define GDT_ENTRY_PNPBIOS_TS1        (GDT_ENTRY_PNPBIOS_BASE + 3)
  110. #define GDT_ENTRY_PNPBIOS_TS2        (GDT_ENTRY_PNPBIOS_BASE + 4)
  111.  
  112. /* The PnP BIOS selectors */
  113. #define PNP_CS32   (GDT_ENTRY_PNPBIOS_CS32 * 8)    /* segment for calling fn */
  114. #define PNP_CS16   (GDT_ENTRY_PNPBIOS_CS16 * 8)    /* code segment for BIOS */
  115. #define PNP_DS     (GDT_ENTRY_PNPBIOS_DS * 8)    /* data segment for BIOS */
  116. #define PNP_TS1    (GDT_ENTRY_PNPBIOS_TS1 * 8)    /* transfer data segment */
  117. #define PNP_TS2    (GDT_ENTRY_PNPBIOS_TS2 * 8)    /* another data segment */
  118.  
  119. /* Bottom two bits of selector give the ring privilege level */
  120. #define SEGMENT_RPL_MASK    0x3
  121. /* Bit 2 is table indicator (LDT/GDT) */
  122. #define SEGMENT_TI_MASK        0x4
  123.  
  124. /* User mode is privilege level 3 */
  125. #define USER_RPL        0x3
  126. /* LDT segment has TI set, GDT has it cleared */
  127. #define SEGMENT_LDT        0x4
  128. #define SEGMENT_GDT        0x0
  129.  
  130. /*
  131.  * Matching rules for certain types of segments.
  132.  */
  133.  
  134. /* Matches PNP_CS32 and PNP_CS16 (they must be consecutive) */
  135. #define SEGMENT_IS_PNP_CODE(x)   (((x) & 0xf4) == GDT_ENTRY_PNPBIOS_BASE * 8)
  136.  
  137.  
  138. #else
  139. #include <asm/cache.h>
  140.  
  141. #define GDT_ENTRY_KERNEL32_CS 1
  142. #define GDT_ENTRY_KERNEL_CS 2
  143. #define GDT_ENTRY_KERNEL_DS 3
  144.  
  145. #define __KERNEL32_CS   (GDT_ENTRY_KERNEL32_CS * 8)
  146.  
  147. /*
  148.  * we cannot use the same code segment descriptor for user and kernel
  149.  * -- not even in the long flat mode, because of different DPL /kkeil
  150.  * The segment offset needs to contain a RPL. Grr. -AK
  151.  * GDT layout to get 64bit syscall right (sysret hardcodes gdt offsets)
  152.  */
  153. #define GDT_ENTRY_DEFAULT_USER32_CS 4
  154. #define GDT_ENTRY_DEFAULT_USER_DS 5
  155. #define GDT_ENTRY_DEFAULT_USER_CS 6
  156. #define __USER32_CS   (GDT_ENTRY_DEFAULT_USER32_CS * 8 + 3)
  157. #define __USER32_DS    __USER_DS
  158.  
  159. #define GDT_ENTRY_TSS 8    /* needs two entries */
  160. #define GDT_ENTRY_LDT 10 /* needs two entries */
  161. #define GDT_ENTRY_TLS_MIN 12
  162. #define GDT_ENTRY_TLS_MAX 14
  163.  
  164. #define GDT_ENTRY_PER_CPU 15    /* Abused to load per CPU data from limit */
  165. #define __PER_CPU_SEG    (GDT_ENTRY_PER_CPU * 8 + 3)
  166.  
  167. /* TLS indexes for 64bit - hardcoded in arch_prctl */
  168. #define FS_TLS 0
  169. #define GS_TLS 1
  170.  
  171. #define GS_TLS_SEL ((GDT_ENTRY_TLS_MIN+GS_TLS)*8 + 3)
  172. #define FS_TLS_SEL ((GDT_ENTRY_TLS_MIN+FS_TLS)*8 + 3)
  173.  
  174. #define GDT_ENTRIES 16
  175.  
  176. #endif
  177.  
  178. #define __KERNEL_CS    (GDT_ENTRY_KERNEL_CS * 8)
  179. #define __KERNEL_DS    (GDT_ENTRY_KERNEL_DS * 8)
  180. #define __USER_DS     (GDT_ENTRY_DEFAULT_USER_DS* 8 + 3)
  181. #define __USER_CS     (GDT_ENTRY_DEFAULT_USER_CS* 8 + 3)
  182. #ifndef CONFIG_PARAVIRT
  183. #define get_kernel_rpl()  0
  184. #endif
  185.  
  186. /* User mode is privilege level 3 */
  187. #define USER_RPL        0x3
  188. /* LDT segment has TI set, GDT has it cleared */
  189. #define SEGMENT_LDT        0x4
  190. #define SEGMENT_GDT        0x0
  191.  
  192. /* Bottom two bits of selector give the ring privilege level */
  193. #define SEGMENT_RPL_MASK    0x3
  194. /* Bit 2 is table indicator (LDT/GDT) */
  195. #define SEGMENT_TI_MASK        0x4
  196.  
  197. #define IDT_ENTRIES 256
  198. #define NUM_EXCEPTION_VECTORS 32
  199. #define GDT_SIZE (GDT_ENTRIES * 8)
  200. #define GDT_ENTRY_TLS_ENTRIES 3
  201. #define TLS_SIZE (GDT_ENTRY_TLS_ENTRIES * 8)
  202.  
  203. #ifdef __KERNEL__
  204. #ifndef __ASSEMBLY__
  205. extern const char early_idt_handlers[NUM_EXCEPTION_VECTORS][10];
  206. #endif
  207. #endif
  208.  
  209. #endif /* _ASM_X86_SEGMENT_H */
  210.