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