xref: /linux/arch/x86/kvm/tss.h (revision 3a2c4d55e32ad65efebdb6de44eef3bfa08bb49d)
1 /* SPDX-License-Identifier: GPL-2.0 */
2 #ifndef __TSS_SEGMENT_H
3 #define __TSS_SEGMENT_H
4 
5 #include <linux/build_bug.h>
6 #include <linux/stddef.h>
7 #include <linux/types.h>
8 
9 struct tss_segment_32 {
10 	u32 prev_task_link;
11 	u32 esp0;
12 	u32 ss0;
13 	u32 esp1;
14 	u32 ss1;
15 	u32 esp2;
16 	u32 ss2;
17 	u32 cr3;
18 	u32 eip;
19 	u32 eflags;
20 	u32 eax;
21 	u32 ecx;
22 	u32 edx;
23 	u32 ebx;
24 	u32 esp;
25 	u32 ebp;
26 	u32 esi;
27 	u32 edi;
28 	u32 es;
29 	u32 cs;
30 	u32 ss;
31 	u32 ds;
32 	u32 fs;
33 	u32 gs;
34 	u32 ldt_selector;
35 	u16 t;
36 	u16 io_map;
37 };
38 
39 struct tss_segment_16 {
40 	u16 prev_task_link;
41 	u16 sp0;
42 	u16 ss0;
43 	u16 sp1;
44 	u16 ss1;
45 	u16 sp2;
46 	u16 ss2;
47 	u16 ip;
48 	u16 flag;
49 	u16 ax;
50 	u16 cx;
51 	u16 dx;
52 	u16 bx;
53 	u16 sp;
54 	u16 bp;
55 	u16 si;
56 	u16 di;
57 	u16 es;
58 	u16 cs;
59 	u16 ss;
60 	u16 ds;
61 	u16 ldt;
62 };
63 
64 #define TSS_IOPB_BASE_OFFSET 0x66
65 #define TSS_BASE_SIZE 0x68
66 #define TSS_IOPB_SIZE (65536 / 8)
67 #define TSS_REDIRECTION_SIZE (256 / 8)
68 #define RMODE_TSS_SIZE							\
69 	(TSS_BASE_SIZE + TSS_REDIRECTION_SIZE + TSS_IOPB_SIZE + 1)
70 
71 static_assert(offsetof(struct tss_segment_32, io_map) == TSS_IOPB_BASE_OFFSET);
72 static_assert(sizeof(struct tss_segment_32) == TSS_BASE_SIZE);
73 
74 #endif
75