aboutsummaryrefslogtreecommitdiff
path: root/arch/x86_64/src/context_switching
diff options
context:
space:
mode:
authorFabian Imhof <fabian.imhof@ost.ch>2025-03-13 09:36:00 +0000
committerFabian Imhof <fabian.imhof@ost.ch>2025-03-13 09:36:00 +0000
commitb8a0024ee71a64ec0e87a1e2d0c0c7280dc954e6 (patch)
treed4d8ee6a97074594c0c0e99a5d8706a4eadb178e /arch/x86_64/src/context_switching
parent569cf73d1fa14ec11afbb37464d2c356d55d64b4 (diff)
downloadteachos-b8a0024ee71a64ec0e87a1e2d0c0c7280dc954e6.tar.xz
teachos-b8a0024ee71a64ec0e87a1e2d0c0c7280dc954e6.zip
create GDT and fix segment descriptor bit order
Diffstat (limited to 'arch/x86_64/src/context_switching')
-rw-r--r--arch/x86_64/src/context_switching/descriptor_table/access_byte.cpp4
-rw-r--r--arch/x86_64/src/context_switching/descriptor_table/gdt_flags.cpp2
-rw-r--r--arch/x86_64/src/context_switching/descriptor_table/segment_descriptor.cpp22
3 files changed, 22 insertions, 6 deletions
diff --git a/arch/x86_64/src/context_switching/descriptor_table/access_byte.cpp b/arch/x86_64/src/context_switching/descriptor_table/access_byte.cpp
index 7a2b0b0..4e5459f 100644
--- a/arch/x86_64/src/context_switching/descriptor_table/access_byte.cpp
+++ b/arch/x86_64/src/context_switching/descriptor_table/access_byte.cpp
@@ -2,9 +2,9 @@
namespace teachos::arch::context_switching::descriptor_table
{
- access_byte::access_byte(uint8_t flags)
+ access_byte::access_byte(uint8_t flags, uint8_t type_field)
: _flags(flags)
- , _type(flags)
+ , _type(type_field)
{
// Nothing to do.
}
diff --git a/arch/x86_64/src/context_switching/descriptor_table/gdt_flags.cpp b/arch/x86_64/src/context_switching/descriptor_table/gdt_flags.cpp
index 8fbf869..65f2e90 100644
--- a/arch/x86_64/src/context_switching/descriptor_table/gdt_flags.cpp
+++ b/arch/x86_64/src/context_switching/descriptor_table/gdt_flags.cpp
@@ -5,7 +5,7 @@
namespace teachos::arch::context_switching::descriptor_table
{
gdt_flags::gdt_flags(uint8_t flags)
- : _flags(flags << 5U)
+ : _flags(flags)
{
// Nothing to do.
}
diff --git a/arch/x86_64/src/context_switching/descriptor_table/segment_descriptor.cpp b/arch/x86_64/src/context_switching/descriptor_table/segment_descriptor.cpp
index 57564f2..ab8eaba 100644
--- a/arch/x86_64/src/context_switching/descriptor_table/segment_descriptor.cpp
+++ b/arch/x86_64/src/context_switching/descriptor_table/segment_descriptor.cpp
@@ -4,7 +4,7 @@ namespace teachos::arch::context_switching::descriptor_table
{
segment_descriptor::segment_descriptor(uint128_t flags)
: _reserved(flags >> 96U)
- , _access((flags >> 40U) << 80U)
+ , _access((flags >> 44U) << 80U, (flags >> 40U) << 84U)
, _flag((flags >> 52U) << 72U)
, _base(((flags >> 64U) << 32U) << 32U | ((flags >> 56U) << 64U) << 24U | (flags >> 16U) << 88U)
, _limit(((flags >> 48U) << 72U) << 16U | flags << 112U)
@@ -12,13 +12,29 @@ namespace teachos::arch::context_switching::descriptor_table
// Nothing to do.
}
+ segment_descriptor::segment_descriptor(access_byte access_byte, gdt_flags flags, uint64_t base,
+ std::bitset<20U> limit)
+ : _reserved(0U)
+ , _access(access_byte)
+ , _flag(flags)
+ , _base(base)
+ , _limit(limit)
+ {
+ // Nothing to do
+ }
+
auto segment_descriptor::get_segment_type() const -> segment_descriptor_type
{
if (!_access.contains_flags(access_byte::CODE_OR_DATA_SEGMENT))
{
return segment_descriptor_type::SYSTEM_SEGMENT;
}
- return _access.get_type_field().contains_flags(type_field::CODE_SEGMENT) ? segment_descriptor_type::CODE_SEGMENT
- : segment_descriptor_type::DATA_SEGMENT;
+
+ if (_access.get_type_field().contains_flags(type_field::CODE_SEGMENT))
+ {
+ return segment_descriptor_type::CODE_SEGMENT;
+ }
+
+ return segment_descriptor_type::DATA_SEGMENT;
}
} // namespace teachos::arch::context_switching::descriptor_table