x86/registers/bits32/
task.rs

1// Licensed under the Apache License, Version 2.0 or the MIT License.
2// SPDX-License-Identifier: Apache-2.0 OR MIT
3// Copyright Tock Contributors 2025.
4
5// This is inspired and adapted for Tock from the [x86](https://github.com/gz/rust-x86) crate.
6
7//! Helpers to program the task state segment.
8//! See Intel 3a, Chapter 7
9
10use core::mem::size_of;
11
12#[derive(Copy, Clone, Debug)]
13#[repr(C, packed)]
14pub struct TaskStateSegment {
15    pub link: u16,
16    reserved0: u16,
17    pub esp0: u32,
18    pub ss0: u16,
19    reserved1: u16,
20    pub esp1: u32,
21    pub ss1: u16,
22    reserved2: u16,
23    pub esp2: u32,
24    pub ss2: u16,
25    reserved3: u16,
26
27    pub cr3: u32,
28    pub eip: u32,
29    pub eflags: u32,
30
31    pub eax: u32,
32    pub ecx: u32,
33    pub edx: u32,
34    pub ebx: u32,
35    pub esp: u32,
36    pub ebp: u32,
37    pub esi: u32,
38    pub edi: u32,
39
40    pub es: u16,
41    reserved4: u16,
42    pub cs: u16,
43    reserved5: u16,
44    pub ss: u16,
45    reserved6: u16,
46    pub ds: u16,
47    reserved7: u16,
48    pub fs: u16,
49    reserved8: u16,
50    pub gs: u16,
51    reserved9: u16,
52    pub ldtr: u16,
53    reserved10: u32,
54    pub iobp_offset: u16,
55}
56
57impl Default for TaskStateSegment {
58    fn default() -> Self {
59        Self::new()
60    }
61}
62
63impl TaskStateSegment {
64    pub const fn new() -> TaskStateSegment {
65        TaskStateSegment {
66            link: 0,
67            reserved0: 0,
68            esp0: 0,
69            ss0: 0,
70            reserved1: 0,
71            esp1: 0,
72            ss1: 0,
73            reserved2: 0,
74            esp2: 0,
75            ss2: 0,
76            reserved3: 0,
77            cr3: 0,
78            eip: 0,
79            eflags: 0,
80            eax: 0,
81            ecx: 0,
82            edx: 0,
83            ebx: 0,
84            esp: 0,
85            ebp: 0,
86            esi: 0,
87            edi: 0,
88            es: 0,
89            reserved4: 0,
90            cs: 0,
91            reserved5: 0,
92            ss: 0,
93            reserved6: 0,
94            ds: 0,
95            reserved7: 0,
96            fs: 0,
97            reserved8: 0,
98            gs: 0,
99            reserved9: 0,
100            ldtr: 0,
101            reserved10: 0,
102            iobp_offset: size_of::<TaskStateSegment>() as u16,
103        }
104    }
105}