From 569cf73d1fa14ec11afbb37464d2c356d55d64b4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Matteo=20Gm=C3=BCr?= Date: Mon, 10 Mar 2025 16:35:01 +0000 Subject: Implement segment descriptor --- .../descriptor_table/gdt_flags.cpp | 18 ++---------------- .../descriptor_table/segment_descriptor.cpp | 21 ++++++++++++++++----- 2 files changed, 18 insertions(+), 21 deletions(-) (limited to 'arch/x86_64/src') 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 8e1e939..8fbf869 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 @@ -4,24 +4,10 @@ namespace teachos::arch::context_switching::descriptor_table { - gdt_flags::gdt_flags(uint8_t flags, segment_descriptor_type type) + gdt_flags::gdt_flags(uint8_t flags) : _flags(flags << 5U) { - switch (type) - { - case segment_descriptor_type::SYSTEM_SEGMENT: - _flags.set(2, false); - _flags.set(3, false); - break; - case segment_descriptor_type::DATA_SEGMENT: - _flags.set(3, false); - break; - case segment_descriptor_type::CODE_SEGMENT: - exception_handling::assert((contains_flags(LENGTH) && !contains_flags(DEFAULT_LENGTH)) || - !contains_flags(LENGTH), - "[GDT] Flags of code segment descriptor has both "); - break; - } + // Nothing to do. } auto gdt_flags::contains_flags(std::bitset<4U> other) const -> bool { return (_flags & other) == other; } 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 fb9c034..57564f2 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 @@ -3,11 +3,22 @@ namespace teachos::arch::context_switching::descriptor_table { segment_descriptor::segment_descriptor(uint128_t flags) - : _reserved(flags) - , _access(flags) - , _flag(flags, segment_descriptor_type::SYSTEM_SEGMENT) - , _base(flags) - , _limit(flags) + : _reserved(flags >> 96U) + , _access((flags >> 40U) << 80U) + , _flag((flags >> 52U) << 72U) + , _base(((flags >> 64U) << 32U) << 32U | ((flags >> 56U) << 64U) << 24U | (flags >> 16U) << 88U) + , _limit(((flags >> 48U) << 72U) << 16U | flags << 112U) { + // 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; } } // namespace teachos::arch::context_switching::descriptor_table -- cgit v1.2.3