diff options
| author | Amlal El Mahrouss <amlal@nekernel.org> | 2025-05-29 10:51:53 +0200 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2025-05-29 10:51:53 +0200 |
| commit | 5c0bb7ee7b1b0fee02cc179fb21f4c57a61d6c2d (patch) | |
| tree | cb17577bcdc9714c97a84ce417a075117097f146 /dev/kernel/HALKit/AMD64/Processor.h | |
| parent | d608230b1350b064ceb01e6572519b108f6139b0 (diff) | |
| parent | 3167f59dbb401d6a79b1524537e04218baf49ee3 (diff) | |
Merge pull request #32 from nekernel-org/dev
0.0.2e3
Diffstat (limited to 'dev/kernel/HALKit/AMD64/Processor.h')
| -rw-r--r-- | dev/kernel/HALKit/AMD64/Processor.h | 73 |
1 files changed, 32 insertions, 41 deletions
diff --git a/dev/kernel/HALKit/AMD64/Processor.h b/dev/kernel/HALKit/AMD64/Processor.h index e1ce8718..80dc7a1d 100644 --- a/dev/kernel/HALKit/AMD64/Processor.h +++ b/dev/kernel/HALKit/AMD64/Processor.h @@ -13,11 +13,15 @@ #pragma once +#ifdef __NE_AMD64__ + #include <FirmwareKit/Handover.h> #include <HALKit/AMD64/Paging.h> -#include <NewKit/Array.h> -#include <NewKit/Defines.h> -#include <NewKit/Utils.h> +#include <NeKit/Array.h> +#include <NeKit/Defines.h> +#include <NeKit/Utils.h> + +#include <HALKit/AMD64/CPUID.h> #define kPITControlPort (0x43) #define kPITChannel0Port (0x40) @@ -28,7 +32,8 @@ #define kPIC2Command (0xA0) #define kPIC2Data (0xA1) -#include <HALKit/AMD64/CPUID.h> +#define kIOAPICRegVal (4) +#define kIOAPICRegReg (0) #define rtl_nop_op() asm volatile("nop") @@ -70,7 +75,7 @@ enum { kMMFlagsNX = 1 << 4, kMMFlagsPCD = 1 << 5, kMMFlagsPwt = 1 << 6, - kMMFlagsCount = 4, + kMMFlagsCount = 6, }; struct PACKED Register64 final { @@ -83,18 +88,17 @@ using Reg = RawRegister; using InterruptId = UInt16; /* For each element in the IVT */ /// @brief Stack frame (as retrieved from assembly.) -struct PACKED StackFrame final { - RawRegister R8{0}; - RawRegister R9{0}; - RawRegister R10{0}; - RawRegister FS{0}; - RawRegister R12{0}; - RawRegister R13{0}; - RawRegister R14{0}; - RawRegister R15{0}; - RawRegister GS{0}; - RawRegister SP{0}; - RawRegister BP{0}; +struct PACKED StackFrame { + Reg IP; + Reg SP; + Reg R8; + Reg R9; + Reg R10; + Reg R11; + Reg R12; + Reg R13; + Reg R14; + Reg R15; }; typedef StackFrame* StackFramePtr; @@ -170,16 +174,7 @@ Void mp_init_cores(VoidPtr vendor_ptr) noexcept; /// @retval true it does exists. /// @retval false it doesn't. /***********************************************************************************/ -inline Bool hal_has_msr() noexcept { - static UInt32 eax, unused, edx; // eax, edx - - __get_cpuid(1, &eax, &unused, &unused, &edx); - - // edx returns the flag for MSR (which is 1 shifted to 5.) - return edx & (1 << 5); -} - -UIntPtr mm_get_phys_address(VoidPtr virtual_address); +Bool hal_has_msr() noexcept; /***********************************************************************************/ /// @brief Get Model specific register inside core. @@ -187,13 +182,7 @@ UIntPtr mm_get_phys_address(VoidPtr virtual_address); /// @param lo low byte /// @param hi high byte /***********************************************************************************/ -inline UInt32 hal_get_msr(UInt32 msr, UInt32* lo, UInt32* hi) noexcept { - if (!lo || !hi) return 0; - - asm volatile("rdmsr" : "=a"(*lo), "=d"(*hi) : "c"(msr)); - - return *lo + *hi; -} +Void hal_get_msr(UInt32 msr, UInt32* lo, UInt32* hi) noexcept; /// @brief Set Model-specific register. /// @param msr MSR @@ -236,16 +225,16 @@ namespace Detail { }; } // namespace Detail -class APICController final { +class LAPICDmaWrapper final { public: - explicit APICController(VoidPtr base); - ~APICController() = default; + explicit LAPICDmaWrapper(VoidPtr base); + ~LAPICDmaWrapper(); - NE_COPY_DEFAULT(APICController) + NE_COPY_DEFAULT(LAPICDmaWrapper) public: - UInt32 Read(UInt32 reg) noexcept; - Void Write(UInt32 reg, UInt32 value) noexcept; + UInt32 Read(UInt16 reg) noexcept; + Void Write(UInt16 reg, UInt32 value) noexcept; private: VoidPtr fApic{nullptr}; @@ -273,6 +262,8 @@ EXTERN_C Void rt_sti(); EXTERN_C Void rt_cld(); EXTERN_C Void rt_std(); +EXTERN_C UIntPtr mm_get_page_addr(VoidPtr virtual_address); + EXTERN_C Int32 mm_memory_fence(VoidPtr virtual_address); } // namespace Kernel::HAL @@ -287,4 +278,4 @@ EXTERN_C ATTRIBUTE(naked) Kernel::Void hal_load_gdt(Kernel::HAL::Register64 ptr) inline Kernel::VoidPtr kKernelBitMpStart = nullptr; inline Kernel::UIntPtr kKernelBitMpSize = 0UL; -inline Kernel::VoidPtr kKernelCR3 = nullptr;
\ No newline at end of file +#endif // __NE_AMD64__ */
\ No newline at end of file |
