Merge branch 'master' into fix-img-generation-bug

This commit is contained in:
Pedro Valadés 2023-11-23 16:57:54 +01:00
commit 656ddbd5ff
No known key found for this signature in database
GPG Key ID: 25780ED196EFD8F5
22 changed files with 287 additions and 43 deletions

View File

@ -50,6 +50,9 @@ include(sdk/cmake/qemu.cmake)
include(sdk/cmake/version.cmake) include(sdk/cmake/version.cmake)
include(sdk/cmake/xtchain.cmake) include(sdk/cmake/xtchain.cmake)
# Enable compilers
enable_language(ASM C CXX)
# Add project specific definitions # Add project specific definitions
add_definitions(-D__XTOS__) add_definitions(-D__XTOS__)
add_definitions(-DXTOS_SOURCE_DIR="${EXECTOS_SOURCE_DIR}") add_definitions(-DXTOS_SOURCE_DIR="${EXECTOS_SOURCE_DIR}")

View File

@ -5,7 +5,8 @@ This is a list of ideas that migh but not must be realized.
- [ ] Currently XT Development Kit (XTDK) is a garbage. It should be cleaned up the way, it contains all structures - [ ] Currently XT Development Kit (XTDK) is a garbage. It should be cleaned up the way, it contains all structures
and definitions, as well as all routines that are exported and can be used by other components or software and definitions, as well as all routines that are exported and can be used by other components or software
dynamically linked. All other routines should be available as well in some form, as some libraries can share dynamically linked. All other routines should be available as well in some form, as some libraries can share
code with others (eg. XTLDR calls routines exported by XTOSKRNL). code with others (eg. XTLDR calls routines exported by XTOSKRNL). This is partially done, as XTDK has been
cleaned up, but still there are routines used by XTLDR.
### XTLDR ### XTLDR
- [ ] Rewrite memory mapping and paging support in bootloader to make it more flexible and architecture independent. - [ ] Rewrite memory mapping and paging support in bootloader to make it more flexible and architecture independent.
@ -17,3 +18,8 @@ This is a list of ideas that migh but not must be realized.
### XTOSKRNL ### XTOSKRNL
- [ ] Implement mechanism for detecting CPU features and checking hardware requirements. If CPU does not meet - [ ] Implement mechanism for detecting CPU features and checking hardware requirements. If CPU does not meet
requirements, it should cause a kernel panic before any non-supported instruction is being used. requirements, it should cause a kernel panic before any non-supported instruction is being used.
- [ ] Design a mechanism of sharing common code between some architectures (i.e. both i686 and amd64 supports APIC,
while it is not available on ARM).
- [ ] Finish framebuffer and terminal implementation. Initialization code is already prepared as well as routines for
clearing the screen and drawing single points. Terminal should be instantiable (should be able to create many
terminals and switch between them) and work on top of FB. It should define ANSI colors and scrollback buffer.

View File

@ -2,7 +2,7 @@
set(CMAKE_SYSTEM_NAME Windows) set(CMAKE_SYSTEM_NAME Windows)
# Set toolchain compilers # Set toolchain compilers
set(CMAKE_ASM_COMPILER nasm) set(CMAKE_ASM_COMPILER llvm-ml)
set(CMAKE_C_COMPILER clang-cl) set(CMAKE_C_COMPILER clang-cl)
set(CMAKE_CXX_COMPILER clang-cl) set(CMAKE_CXX_COMPILER clang-cl)
set(CMAKE_MC_COMPILER wmc) set(CMAKE_MC_COMPILER wmc)
@ -10,6 +10,7 @@ set(CMAKE_RC_COMPILER wrc)
set(CMAKE_SPEC_COMPILER xtcspecc) set(CMAKE_SPEC_COMPILER xtcspecc)
# Assume that C/C++ compiler is working # Assume that C/C++ compiler is working
set(CMAKE_ASM_COMPILER_WORKS 1)
set(CMAKE_C_COMPILER_WORKS 1) set(CMAKE_C_COMPILER_WORKS 1)
set(CMAKE_CXX_COMPILER_WORKS 1) set(CMAKE_CXX_COMPILER_WORKS 1)

View File

@ -11,7 +11,7 @@ endif()
# Set build optimisation # Set build optimisation
if(BUILD_TYPE STREQUAL "DEBUG") if(BUILD_TYPE STREQUAL "DEBUG")
add_compiler_flags("/Zi") add_compiler_ccxxflags("/Zi")
add_compiler_ccxxflags("-Ob0 -Od") add_compiler_ccxxflags("-Ob0 -Od")
add_linker_flags("/DEBUG /INCREMENTAL /OPT:NOREF /OPT:NOICF /PDBSOURCEPATH:build") add_linker_flags("/DEBUG /INCREMENTAL /OPT:NOREF /OPT:NOICF /PDBSOURCEPATH:build")
else() else()
@ -38,10 +38,10 @@ add_compiler_ccxxflags("-Gy")
add_compiler_ccxxflags("-EHa") add_compiler_ccxxflags("-EHa")
# Control warnings levels # Control warnings levels
add_compiler_flags("-W3 -w14115") add_compiler_ccxxflags("-W3 -w14115")
add_compiler_flags("-wd4200 -wd4214 -wd4244 -wd4290 -wd4800") add_compiler_ccxxflags("-wd4200 -wd4214 -wd4244 -wd4290 -wd4800")
add_compiler_flags("-we4013 -we4020 -we4022 -we4028 -we4047 -we4098 -we4101 -we4113 -we4129 -we4133") add_compiler_ccxxflags("-we4013 -we4020 -we4022 -we4028 -we4047 -we4098 -we4101 -we4113 -we4129 -we4133")
add_compiler_flags("-we4163 -we4189 -we4229 -we4311 -we4312 -we4313 -we4477 -we4603 -we4700 -we4715 -we4716") add_compiler_ccxxflags("-we4163 -we4189 -we4229 -we4311 -we4312 -we4313 -we4477 -we4603 -we4700 -we4715 -we4716")
# Disable warnings about specific features # Disable warnings about specific features
add_compiler_ccxxflags("-nostdinc -Wno-char-subscripts -Wno-incompatible-library-redeclaration -Wno-microsoft-anon-tag") add_compiler_ccxxflags("-nostdinc -Wno-char-subscripts -Wno-incompatible-library-redeclaration -Wno-microsoft-anon-tag")
@ -54,6 +54,9 @@ set(CMAKE_PDB_OUTPUT_DIRECTORY "${EXECTOS_BINARY_DIR}/output/symbols")
# Set linker flags # Set linker flags
add_linker_flags("${HOTPATCH_LINKER_FLAG} /LARGEADDRESSAWARE /IGNORE:4039 /IGNORE:4104 /MANIFEST:NO /NODEFAULTLIB /SAFESEH:NO") add_linker_flags("${HOTPATCH_LINKER_FLAG} /LARGEADDRESSAWARE /IGNORE:4039 /IGNORE:4104 /MANIFEST:NO /NODEFAULTLIB /SAFESEH:NO")
# Set LLVM MASM assembler options
set(CMAKE_ASM_COMPILE_OBJECT "<CMAKE_ASM_COMPILER> ${CMAKE_ASM_FLAGS} -D__ASM__ /nologo /Fo <OBJECT> /c /Ta <SOURCE>")
# Set runtime library # Set runtime library
set(CMAKE_MSVC_RUNTIME_LIBRARY "") set(CMAKE_MSVC_RUNTIME_LIBRARY "")

View File

@ -32,6 +32,10 @@ XTCDECL
ULONG_PTR ULONG_PTR
ArReadControlRegister(IN USHORT ControlRegister); ArReadControlRegister(IN USHORT ControlRegister);
XTCDECL
ULONGLONG
ArReadModelSpecificRegister(IN ULONG Register);
XTCDECL XTCDECL
VOID VOID
ArWriteControlRegister(IN USHORT ControlRegister, ArWriteControlRegister(IN USHORT ControlRegister,

View File

@ -14,6 +14,9 @@
#include <xttypes.h> #include <xttypes.h>
/* APIC base address */
#define APIC_BASE 0xFFFFFFFFFFFE0000ULL
/* Serial port I/O addresses */ /* Serial port I/O addresses */
#define COMPORT_ADDRESSES {0x000, 0x3F8, 0x2F8, 0x3E8, 0x2E8, 0x5F8, 0x4F8, 0x5E8, 0x4E8} #define COMPORT_ADDRESSES {0x000, 0x3F8, 0x2F8, 0x3E8, 0x2E8, 0x5F8, 0x4F8, 0x5E8, 0x4E8}

View File

@ -32,6 +32,10 @@ XTCDECL
ULONG_PTR ULONG_PTR
ArReadControlRegister(IN USHORT ControlRegister); ArReadControlRegister(IN USHORT ControlRegister);
XTCDECL
ULONGLONG
ArReadModelSpecificRegister(IN ULONG Register);
XTCDECL XTCDECL
VOID VOID
ArWriteControlRegister(IN USHORT ControlRegister, ArWriteControlRegister(IN USHORT ControlRegister,

View File

@ -14,6 +14,9 @@
#include <xttypes.h> #include <xttypes.h>
/* APIC base address */
#define APIC_BASE 0xFFFE0000
/* Serial port I/O addresses */ /* Serial port I/O addresses */
#define COMPORT_ADDRESSES {0x000, 0x3F8, 0x2F8, 0x3E8, 0x2E8, 0x5F8, 0x4F8, 0x5E8, 0x4E8} #define COMPORT_ADDRESSES {0x000, 0x3F8, 0x2F8, 0x3E8, 0x2E8, 0x5F8, 0x4F8, 0x5E8, 0x4E8}

View File

@ -16,6 +16,9 @@
/* Version number of the current kernel initialization block */ /* Version number of the current kernel initialization block */
#define INITIALIZATION_BLOCK_VERSION 1 #define INITIALIZATION_BLOCK_VERSION 1
/* Version number of the current XTOS loader protocol */
#define BOOT_PROTOCOL_VERSION 1
/* Memory allocation structures */ /* Memory allocation structures */
typedef enum _LOADER_MEMORY_TYPE typedef enum _LOADER_MEMORY_TYPE
{ {
@ -115,11 +118,12 @@ typedef struct _LOADER_MEMORY_MAPPING
/* Loader provided information needed by the kernel to initialize */ /* Loader provided information needed by the kernel to initialize */
typedef struct _KERNEL_INITIALIZATION_BLOCK typedef struct _KERNEL_INITIALIZATION_BLOCK
{ {
ULONG BlockSize;
ULONG BlockVersion;
ULONG ProtocolVersion;
LIST_ENTRY LoadOrderListHead; LIST_ENTRY LoadOrderListHead;
LIST_ENTRY MemoryDescriptorListHead; LIST_ENTRY MemoryDescriptorListHead;
LIST_ENTRY BootDriverListHead; LIST_ENTRY BootDriverListHead;
ULONG Size;
ULONG Version;
LOADER_INFORMATION_BLOCK LoaderInformation; LOADER_INFORMATION_BLOCK LoaderInformation;
FIRMWARE_INFORMATION_BLOCK FirmwareInformation; FIRMWARE_INFORMATION_BLOCK FirmwareInformation;
} KERNEL_INITIALIZATION_BLOCK, *PKERNEL_INITIALIZATION_BLOCK; } KERNEL_INITIALIZATION_BLOCK, *PKERNEL_INITIALIZATION_BLOCK;

View File

@ -17,6 +17,7 @@ typedef enum _ADJUST_REASON ADJUST_REASON, *PADJUST_REASON;
typedef enum _BOOLEAN BOOLEAN, *PBOOLEAN; typedef enum _BOOLEAN BOOLEAN, *PBOOLEAN;
typedef enum _EXCEPTION_DISPOSITION EXCEPTION_DISPOSITION, *PEXCEPTION_DISPOSITION; typedef enum _EXCEPTION_DISPOSITION EXCEPTION_DISPOSITION, *PEXCEPTION_DISPOSITION;
typedef enum _EFI_ALLOCATE_TYPE EFI_ALLOCATE_TYPE, *PEFI_ALLOCATE_TYPE; typedef enum _EFI_ALLOCATE_TYPE EFI_ALLOCATE_TYPE, *PEFI_ALLOCATE_TYPE;
typedef enum _EFI_FRAMEWORK_CPU_DESIGNATION EFI_FRAMEWORK_CPU_DESIGNATION, *PEFI_FRAMEWORK_CPU_DESIGNATION;
typedef enum _EFI_GRAPHICS_OUTPUT_BLT_OPERATION EFI_GRAPHICS_OUTPUT_BLT_OPERATION, *PEFI_GRAPHICS_OUTPUT_BLT_OPERATION; typedef enum _EFI_GRAPHICS_OUTPUT_BLT_OPERATION EFI_GRAPHICS_OUTPUT_BLT_OPERATION, *PEFI_GRAPHICS_OUTPUT_BLT_OPERATION;
typedef enum _EFI_GRAPHICS_PIXEL_FORMAT EFI_GRAPHICS_PIXEL_FORMAT, *PEFI_GRAPHICS_PIXEL_FORMAT; typedef enum _EFI_GRAPHICS_PIXEL_FORMAT EFI_GRAPHICS_PIXEL_FORMAT, *PEFI_GRAPHICS_PIXEL_FORMAT;
typedef enum _EFI_GRAPHICS_PROTOCOL EFI_GRAPHICS_PROTOCOL, *PEFI_GRAPHICS_PROTOCOL; typedef enum _EFI_GRAPHICS_PROTOCOL EFI_GRAPHICS_PROTOCOL, *PEFI_GRAPHICS_PROTOCOL;
@ -101,6 +102,9 @@ typedef struct _EFI_FILE_IO_TOKEN EFI_FILE_IO_TOKEN, *PEFI_FILE_IO_TOKEN;
typedef struct _EFI_FILE_SYSTEM_INFO EFI_FILE_SYSTEM_INFO, *PEFI_FILE_SYSTEM_INFO; typedef struct _EFI_FILE_SYSTEM_INFO EFI_FILE_SYSTEM_INFO, *PEFI_FILE_SYSTEM_INFO;
typedef struct _EFI_FILE_SYSTEM_VOLUME_LABEL EFI_FILE_SYSTEM_VOLUME_LABEL, *PEFI_FILE_SYSTEM_VOLUME_LABEL; typedef struct _EFI_FILE_SYSTEM_VOLUME_LABEL EFI_FILE_SYSTEM_VOLUME_LABEL, *PEFI_FILE_SYSTEM_VOLUME_LABEL;
typedef struct _EFI_FILEPATH_DEVICE_PATH EFI_FILEPATH_DEVICE_PATH, *PEFI_FILEPATH_DEVICE_PATH; typedef struct _EFI_FILEPATH_DEVICE_PATH EFI_FILEPATH_DEVICE_PATH, *PEFI_FILEPATH_DEVICE_PATH;
typedef struct _EFI_FRAMEWORK_MP_HEALTH EFI_FRAMEWORK_MP_HEALTH, *PEFI_FRAMEWORK_MP_HEALTH;
typedef struct _EFI_FRAMEWORK_MP_PROCESSOR_CONTEXT EFI_FRAMEWORK_MP_PROCESSOR_CONTEXT, *PEFI_FRAMEWORK_MP_PROCESSOR_CONTEXT;
typedef struct _EFI_FRAMEWORK_MP_SERVICES_PROTOCOL EFI_FRAMEWORK_MP_SERVICES_PROTOCOL, *PEFI_FRAMEWORK_MP_SERVICES_PROTOCOL;
typedef struct _EFI_GPT_PARTITION_TABLE_HEADER EFI_GPT_PARTITION_TABLE_HEADER, *PEFI_GPT_PARTITION_TABLE_HEADER; typedef struct _EFI_GPT_PARTITION_TABLE_HEADER EFI_GPT_PARTITION_TABLE_HEADER, *PEFI_GPT_PARTITION_TABLE_HEADER;
typedef struct _EFI_GPT_PARTITION_ENTRY EFI_GPT_PARTITION_ENTRY, *PEFI_GPT_PARTITION_ENTRY; typedef struct _EFI_GPT_PARTITION_ENTRY EFI_GPT_PARTITION_ENTRY, *PEFI_GPT_PARTITION_ENTRY;
typedef struct _EFI_GRAPHICS_OUTPUT_BLT_PIXEL EFI_GRAPHICS_OUTPUT_BLT_PIXEL, *PEFI_GRAPHICS_OUTPUT_BLT_PIXEL; typedef struct _EFI_GRAPHICS_OUTPUT_BLT_PIXEL EFI_GRAPHICS_OUTPUT_BLT_PIXEL, *PEFI_GRAPHICS_OUTPUT_BLT_PIXEL;
@ -264,6 +268,7 @@ typedef struct _UNICODE_STRING64 UNICODE_STRING64, *PUNICODE_STRING64;
/* Unions forward references */ /* Unions forward references */
typedef union _EFI_DEV_PATH EFI_DEV_PATH, *PEFI_DEV_PATH; typedef union _EFI_DEV_PATH EFI_DEV_PATH, *PEFI_DEV_PATH;
typedef union _EFI_DEV_PATH_PTR EFI_DEV_PATH_PTR, *PEFI_DEV_PATH_PTR; typedef union _EFI_DEV_PATH_PTR EFI_DEV_PATH_PTR, *PEFI_DEV_PATH_PTR;
typedef union _EFI_FRAMEWORK_MP_HEALTH_FLAGS EFI_FRAMEWORK_MP_HEALTH_FLAGS, *PEFI_FRAMEWORK_MP_HEALTH_FLAGS;
typedef union _EFI_GRAPHICS_OUTPUT_BLT_PIXEL_UNION EFI_GRAPHICS_OUTPUT_BLT_PIXEL_UNION, *PEFI_GRAPHICS_OUTPUT_BLT_PIXEL_UNION; typedef union _EFI_GRAPHICS_OUTPUT_BLT_PIXEL_UNION EFI_GRAPHICS_OUTPUT_BLT_PIXEL_UNION, *PEFI_GRAPHICS_OUTPUT_BLT_PIXEL_UNION;
typedef union _EFI_HASH_OUTPUT EFI_HASH_OUTPUT, *PEFI_HASH_OUTPUT; typedef union _EFI_HASH_OUTPUT EFI_HASH_OUTPUT, *PEFI_HASH_OUTPUT;
typedef union _EFI_IP_ADDRESS EFI_IP_ADDRESS, *PEFI_IP_ADDRESS; typedef union _EFI_IP_ADDRESS EFI_IP_ADDRESS, *PEFI_IP_ADDRESS;

View File

@ -79,14 +79,14 @@
#define EFI_MAXIMUM_VARIABLE_SIZE 1024 #define EFI_MAXIMUM_VARIABLE_SIZE 1024
/* EFI event types */ /* EFI event types */
#define EFI_EVENT_TIMER 0x80000000 #define EFI_EVENT_EFI_SIGNAL_MASK 0x000000FF
#define EFI_EVENT_RUNTIME 0x40000000
#define EFI_EVENT_RUNTIME_CONTEXT 0x20000000
#define EFI_EVENT_NOTIFY_WAIT 0x00000100 #define EFI_EVENT_NOTIFY_WAIT 0x00000100
#define EFI_EVENT_NOTIFY_SIGNAL 0x00000200 #define EFI_EVENT_NOTIFY_SIGNAL 0x00000200
#define EFI_EVENT_SIGNAL_EXIT_BOOT_SERVICES 0x00000201 #define EFI_EVENT_SIGNAL_EXIT_BOOT_SERVICES 0x00000201
#define EFI_EVENT_RUNTIME_CONTEXT 0x20000000
#define EFI_EVENT_RUNTIME 0x40000000
#define EFI_EVENT_SIGNAL_VIRTUAL_ADDRESS_CHANGE 0x60000202 #define EFI_EVENT_SIGNAL_VIRTUAL_ADDRESS_CHANGE 0x60000202
#define EFI_EVENT_EFI_SIGNAL_MASK 0x000000FF #define EFI_EVENT_TIMER 0x80000000
/* EFI disk signature type */ /* EFI disk signature type */
#define EFI_DISK_SIGNATURE_TYPE_MBR 0x01 #define EFI_DISK_SIGNATURE_TYPE_MBR 0x01
@ -250,6 +250,7 @@
#define EFI_EDID_OVERRIDE_PROTOCOL_GUID {0x48ECB431, 0xFB72, 0x45C0, {0xA9, 0x22, 0xF4, 0x58, 0xFE, 0x04, 0x0B, 0xD5}} #define EFI_EDID_OVERRIDE_PROTOCOL_GUID {0x48ECB431, 0xFB72, 0x45C0, {0xA9, 0x22, 0xF4, 0x58, 0xFE, 0x04, 0x0B, 0xD5}}
#define EFI_FILE_INFO_PROTOCOL_GUID {0x09576E92, 0x6D3F, 0x11D2, {0x8E, 0x39, 0x00, 0xA0, 0xC9, 0x69, 0x72, 0x3B}} #define EFI_FILE_INFO_PROTOCOL_GUID {0x09576E92, 0x6D3F, 0x11D2, {0x8E, 0x39, 0x00, 0xA0, 0xC9, 0x69, 0x72, 0x3B}}
#define EFI_FPSWA_PROTOCOL_GUID {0xC41B6531, 0x97B9, 0x11D3, {0x9A, 0x29, 0x00, 0x90, 0x27, 0x3F, 0xC1, 0x4D}} #define EFI_FPSWA_PROTOCOL_GUID {0xC41B6531, 0x97B9, 0x11D3, {0x9A, 0x29, 0x00, 0x90, 0x27, 0x3F, 0xC1, 0x4D}}
#define EFI_FRAMEWORK_MP_SERVICES_PROTOCOL_GUID {0xF33261E7, 0x23CB, 0x11D5, {0xBD, 0x5C, 0x00, 0x80, 0xC7, 0x3C, 0x88, 0x81}}
#define EFI_GLOBAL_VARIABLE_GUID {0x8BE4DF61, 0x93CA, 0x11D2, {0xAA, 0x0D, 0x00, 0xE0, 0x98, 0x03, 0x2B, 0x8C}} #define EFI_GLOBAL_VARIABLE_GUID {0x8BE4DF61, 0x93CA, 0x11D2, {0xAA, 0x0D, 0x00, 0xE0, 0x98, 0x03, 0x2B, 0x8C}}
#define EFI_GRAPHICS_OUTPUT_PROTOCOL_GUID {0x9042A9DE, 0x23DC, 0x4A38, {0x96, 0xFB, 0x7A, 0xDE, 0xD0, 0x80, 0x51, 0x6A}} #define EFI_GRAPHICS_OUTPUT_PROTOCOL_GUID {0x9042A9DE, 0x23DC, 0x4A38, {0x96, 0xFB, 0x7A, 0xDE, 0xD0, 0x80, 0x51, 0x6A}}
#define EFI_HASH_PROTOCOL_GUID {0xC5184932, 0xDBA5, 0x46DB, {0xA5, 0xBA, 0xCC, 0x0B, 0xDA, 0x9C, 0x14, 0x35}} #define EFI_HASH_PROTOCOL_GUID {0xC5184932, 0xDBA5, 0x46DB, {0xA5, 0xBA, 0xCC, 0x0B, 0xDA, 0x9C, 0x14, 0x35}}
@ -481,6 +482,14 @@ typedef enum _EFI_UART_STOP_BITS_TYPE
TwoStopBits TwoStopBits
} EFI_UART_STOP_BITS_TYPE, *PEFI_UART_STOP_BITS_TYPE; } EFI_UART_STOP_BITS_TYPE, *PEFI_UART_STOP_BITS_TYPE;
/* Enumeration of CPU designations */
typedef enum _EFI_FRAMEWORK_CPU_DESIGNATION
{
EfiCpuAP,
EfiCpuBSP,
EfiCpuDesignationMaximum
} EFI_FRAMEWORK_CPU_DESIGNATION, *PEFI_FRAMEWORK_CPU_DESIGNATION;
/* Enumeration of network state */ /* Enumeration of network state */
typedef enum _EFI_SIMPLE_NETWORK_STATE typedef enum _EFI_SIMPLE_NETWORK_STATE
{ {
@ -745,6 +754,14 @@ typedef EFI_STATUS (*PEFI_PXE_BASE_CODE_SET_STATION_IP)(IN PEFI_PXE_BASE_CODE_PR
typedef EFI_STATUS (*PEFI_PXE_BASE_CODE_SET_PACKETS)(IN PEFI_PXE_BASE_CODE_PROTOCOL This, PUCHAR NewDhcpDiscoverValid, PUCHAR NewDhcpAckReceived, PUCHAR NewProxyOfferReceived, PUCHAR NewPxeDiscoverValid, PUCHAR NewPxeReplyReceived, PUCHAR NewPxeBisReplyReceived, IN PEFI_PXE_BASE_CODE_PACKET NewDhcpDiscover, IN PEFI_PXE_BASE_CODE_PACKET NewDhcpAck, IN PEFI_PXE_BASE_CODE_PACKET NewProxyOffer, IN PEFI_PXE_BASE_CODE_PACKET NewPxeDiscover, IN PEFI_PXE_BASE_CODE_PACKET NewPxeReply, IN PEFI_PXE_BASE_CODE_PACKET NewPxeBisReply); typedef EFI_STATUS (*PEFI_PXE_BASE_CODE_SET_PACKETS)(IN PEFI_PXE_BASE_CODE_PROTOCOL This, PUCHAR NewDhcpDiscoverValid, PUCHAR NewDhcpAckReceived, PUCHAR NewProxyOfferReceived, PUCHAR NewPxeDiscoverValid, PUCHAR NewPxeReplyReceived, PUCHAR NewPxeBisReplyReceived, IN PEFI_PXE_BASE_CODE_PACKET NewDhcpDiscover, IN PEFI_PXE_BASE_CODE_PACKET NewDhcpAck, IN PEFI_PXE_BASE_CODE_PACKET NewProxyOffer, IN PEFI_PXE_BASE_CODE_PACKET NewPxeDiscover, IN PEFI_PXE_BASE_CODE_PACKET NewPxeReply, IN PEFI_PXE_BASE_CODE_PACKET NewPxeBisReply);
typedef EFI_PXE_BASE_CODE_CALLBACK_STATUS (*PEFI_PXE_CALLBACK)(IN PEFI_PXE_BASE_CODE_CALLBACK_PROTOCOL This, IN EFI_PXE_BASE_CODE_FUNCTION Function, IN UCHAR Received, IN UINT32 PacketLen, IN PEFI_PXE_BASE_CODE_PACKET Packet); typedef EFI_PXE_BASE_CODE_CALLBACK_STATUS (*PEFI_PXE_CALLBACK)(IN PEFI_PXE_BASE_CODE_CALLBACK_PROTOCOL This, IN EFI_PXE_BASE_CODE_FUNCTION Function, IN UCHAR Received, IN UINT32 PacketLen, IN PEFI_PXE_BASE_CODE_PACKET Packet);
typedef VOID (*PEFI_AP_PROCEDURE)(IN OUT PVOID Buffer); typedef VOID (*PEFI_AP_PROCEDURE)(IN OUT PVOID Buffer);
typedef EFI_STATUS (*PEFI_FRAMEWORK_MP_SERVICES_GET_GENERAL_MP_INFO)(IN PEFI_FRAMEWORK_MP_SERVICES_PROTOCOL This, OUT PUINT_PTR NumberOfCPUs, OUT PUINT_PTR MaximumNumberOfCPUs, OUT PUINT_PTR NumberOfEnabledCPUs, OUT PUINT_PTR RendezvousIntNumber, OUT PUINT_PTR RendezvousProcLength);
typedef EFI_STATUS (*PEFI_FRAMEWORK_MP_SERVICES_GET_PROCESSOR_CONTEXT)(IN PEFI_FRAMEWORK_MP_SERVICES_PROTOCOL This, IN UINT_PTR ProcessorNumber, IN OUT PUINT_PTR BufferLength, IN OUT PEFI_FRAMEWORK_MP_PROCESSOR_CONTEXT ProcessorContextBuffer);
typedef EFI_STATUS (*PEFI_FRAMEWORK_MP_SERVICES_STARTUP_ALL_APS)(IN PEFI_FRAMEWORK_MP_SERVICES_PROTOCOL This, IN PEFI_AP_PROCEDURE Procedure, IN BOOLEAN SingleThread, IN EFI_EVENT WaitEvent, IN UINT_PTR TimeoutInMicroSecs, IN OUT PVOID ProcArguments, OUT PUINT_PTR FailedCPUList);
typedef EFI_STATUS (*PEFI_FRAMEWORK_MP_SERVICES_STARTUP_THIS_AP)(IN PEFI_FRAMEWORK_MP_SERVICES_PROTOCOL This, IN PEFI_AP_PROCEDURE Procedure, IN UINT_PTR ProcessorNumber, IN EFI_EVENT WaitEvent, IN UINT_PTR TimeoutInMicroSecs, IN OUT PVOID ProcArguments);
typedef EFI_STATUS (*PEFI_FRAMEWORK_MP_SERVICES_SWITCH_BSP)(IN PEFI_FRAMEWORK_MP_SERVICES_PROTOCOL This, IN UINT_PTR ProcessorNumber, IN BOOLEAN EnableOldBSP);
typedef EFI_STATUS (*PEFI_FRAMEWORK_MP_SERVICES_SEND_IPI)(IN PEFI_FRAMEWORK_MP_SERVICES_PROTOCOL This, IN UINT_PTR ProcessorNumber, IN UINT_PTR VectorNumber, IN UINT_PTR DeliveryMode);
typedef EFI_STATUS (*PEFI_FRAMEWORK_MP_SERVICES_ENABLEDISABLEAP)(IN PEFI_FRAMEWORK_MP_SERVICES_PROTOCOL This, IN UINT_PTR ProcessorNumber, IN BOOLEAN NewAPState, IN PEFI_FRAMEWORK_MP_HEALTH HealthState);
typedef EFI_STATUS (*PEFI_FRAMEWORK_MP_SERVICES_WHOAMI)(IN PEFI_FRAMEWORK_MP_SERVICES_PROTOCOL This, OUT PUINT_PTR ProcessorNumber);
typedef EFI_STATUS (*PEFI_MP_SERVICES_ENABLEDISABLEAP)(IN PEFI_MP_SERVICES_PROTOCOL This, IN UINT_PTR ProcessorNumber, IN BOOLEAN EnableAP, IN PUINT32 HealthFlag); typedef EFI_STATUS (*PEFI_MP_SERVICES_ENABLEDISABLEAP)(IN PEFI_MP_SERVICES_PROTOCOL This, IN UINT_PTR ProcessorNumber, IN BOOLEAN EnableAP, IN PUINT32 HealthFlag);
typedef EFI_STATUS (*PEFI_MP_SERVICES_GET_NUMBER_OF_PROCESSORS)(IN PEFI_MP_SERVICES_PROTOCOL This, OUT PUINT_PTR NumberOfProcessors, OUT PUINT_PTR NumberOfEnabledProcessors); typedef EFI_STATUS (*PEFI_MP_SERVICES_GET_NUMBER_OF_PROCESSORS)(IN PEFI_MP_SERVICES_PROTOCOL This, OUT PUINT_PTR NumberOfProcessors, OUT PUINT_PTR NumberOfEnabledProcessors);
typedef EFI_STATUS (*PEFI_MP_SERVICES_GET_PROCESSOR_INFO)(IN PEFI_MP_SERVICES_PROTOCOL This, IN UINT_PTR ProcessorNumber, OUT PEFI_PROCESSOR_INFORMATION ProcessorInfoBuffer); typedef EFI_STATUS (*PEFI_MP_SERVICES_GET_PROCESSOR_INFO)(IN PEFI_MP_SERVICES_PROTOCOL This, IN UINT_PTR ProcessorNumber, OUT PEFI_PROCESSOR_INFORMATION ProcessorInfoBuffer);
@ -2308,6 +2325,57 @@ typedef struct _EFI_SIMPLE_NETWORK_PROTOCOL
PEFI_SIMPLE_NETWORK_MODE Mode; PEFI_SIMPLE_NETWORK_MODE Mode;
} EFI_SIMPLE_NETWORK_PROTOCOL, *PEFI_SIMPLE_NETWORK_PROTOCOL; } EFI_SIMPLE_NETWORK_PROTOCOL, *PEFI_SIMPLE_NETWORK_PROTOCOL;
/* EFI Framework MP (Multiprocessor) services protocol */
typedef struct _EFI_FRAMEWORK_MP_SERVICES_PROTOCOL
{
PEFI_FRAMEWORK_MP_SERVICES_GET_GENERAL_MP_INFO GetGeneralMPInfo;
PEFI_FRAMEWORK_MP_SERVICES_GET_PROCESSOR_CONTEXT GetProcessorContext;
PEFI_FRAMEWORK_MP_SERVICES_STARTUP_ALL_APS StartupAllAPs;
PEFI_FRAMEWORK_MP_SERVICES_STARTUP_THIS_AP StartupThisAP;
PEFI_FRAMEWORK_MP_SERVICES_SWITCH_BSP SwitchBSP;
PEFI_FRAMEWORK_MP_SERVICES_SEND_IPI SendIPI;
PEFI_FRAMEWORK_MP_SERVICES_ENABLEDISABLEAP EnableDisableAP;
PEFI_FRAMEWORK_MP_SERVICES_WHOAMI WhoAmI;
} EFI_FRAMEWORK_MP_SERVICES_PROTOCOL, *PEFI_FRAMEWORK_MP_SERVICES_PROTOCOL;
/* EFI Framework MP (Multiprocessor) health flags union */
typedef union _EFI_FRAMEWORK_MP_HEALTH_FLAGS
{
struct
{
UINT Status:2;
UINT Tested:1;
UINT Reserved1:13;
UINT VirtualMemoryUnavailable:1;
UINT Ia32ExecutionUnavailable:1;
UINT FloatingPointUnavailable:1;
UINT MiscFeaturesUnavailable:1;
UINT Reserved2:12;
} Bits;
UINT Uint32;
} EFI_FRAMEWORK_MP_HEALTH_FLAGS, *PEFI_FRAMEWORK_MP_HEALTH_FLAGS;
/* EFI Framework MP (Multiprocessor) health structure */
typedef struct _EFI_FRAMEWORK_MP_HEALTH
{
EFI_FRAMEWORK_MP_HEALTH_FLAGS Flags;
UINT TestStatus;
} EFI_FRAMEWORK_MP_HEALTH, *PEFI_FRAMEWORK_MP_HEALTH;
/* EFI Framework processor context structure */
typedef struct _EFI_FRAMEWORK_MP_PROCESSOR_CONTEXT
{
UINT ApicID;
BOOLEAN Enabled;
EFI_FRAMEWORK_CPU_DESIGNATION Designation;
EFI_FRAMEWORK_MP_HEALTH Health;
UINT_PTR PackageNumber;
UINT_PTR NumberOfCores;
UINT_PTR NumberOfThreads;
ULONGLONG ProcessorPALCompatibilityFlags;
ULONGLONG ProcessorTestMask;
} EFI_FRAMEWORK_MP_PROCESSOR_CONTEXT, *PEFI_FRAMEWORK_MP_PROCESSOR_CONTEXT;
/* EFI MP (Multiprocessor) services protocol */ /* EFI MP (Multiprocessor) services protocol */
typedef struct _EFI_MP_SERVICES_PROTOCOL typedef struct _EFI_MP_SERVICES_PROTOCOL
{ {

View File

@ -29,6 +29,10 @@ XtpBootSequence(IN PEFI_FILE_HANDLE BootDir,
IN PXT_BOOT_PROTOCOL_PARAMETERS Parameters); IN PXT_BOOT_PROTOCOL_PARAMETERS Parameters);
XTCDECL
EFI_STATUS
XtpInitializeApicBase(IN PLIST_ENTRY MemoryMappings);
XTCDECL XTCDECL
EFI_STATUS EFI_STATUS
XtpInitializeLoaderBlock(IN PLIST_ENTRY MemoryMappings, XtpInitializeLoaderBlock(IN PLIST_ENTRY MemoryMappings,

View File

@ -229,6 +229,21 @@ XtpBootSequence(IN PEFI_FILE_HANDLE BootDir,
/* Setup and map kernel initialization block */ /* Setup and map kernel initialization block */
Status = XtpInitializeLoaderBlock(&MemoryMappings, &VirtualAddress); Status = XtpInitializeLoaderBlock(&MemoryMappings, &VirtualAddress);
if(Status != STATUS_EFI_SUCCESS)
{
/* Failed to setup kernel initialization block */
XtLdrProtocol->DbgPrint(L"Failed to setup kernel initialization block (Status Code: %lx)\n", Status);
return Status;
}
/* Find and map APIC base address */
Status = XtpInitializeApicBase(&MemoryMappings);
if(Status != STATUS_EFI_SUCCESS)
{
/* Failed to setup kernel initialization block */
XtLdrProtocol->DbgPrint(L"Failed to initialize APIC (Status Code: %lx)\n", Status);
return Status;
}
/* Get kernel entry point */ /* Get kernel entry point */
XtPeCoffProtocol->GetEntryPoint(ImageContext, (PVOID)&KernelEntryPoint); XtPeCoffProtocol->GetEntryPoint(ImageContext, (PVOID)&KernelEntryPoint);
@ -254,6 +269,47 @@ XtpBootSequence(IN PEFI_FILE_HANDLE BootDir,
return STATUS_EFI_SUCCESS; return STATUS_EFI_SUCCESS;
} }
/**
* Checks if APIC is present in the system and finds its base address.
*
* @param MemoryMappings
* Supplies a pointer to linked list containing all memory mappings.
*
* @return This routine returns an EFI status code.
*
* @since XT 1.0
*/
XTCDECL
EFI_STATUS
XtpInitializeApicBase(IN PLIST_ENTRY MemoryMappings)
{
PCPUID_REGISTERS CpuRegisters = NULL;
PVOID ApicBaseAddress;
/* Get CPU features list */
CpuRegisters->Leaf = CPUID_GET_CPU_FEATURES;
CpuRegisters->SubLeaf = 0;
CpuRegisters->Eax = 0;
CpuRegisters->Ebx = 0;
CpuRegisters->Ecx = 0;
CpuRegisters->Edx = 0;
ArCpuId(CpuRegisters);
/* Check if APIC is present */
if((CpuRegisters->Edx & CPUID_FEATURES_EDX_APIC) == 0)
{
/* APIC is not supported by the CPU */
return STATUS_EFI_UNSUPPORTED;
}
/* Get APIC base address */
ApicBaseAddress = (PVOID)((UINT_PTR)ArReadModelSpecificRegister(0x1B) & 0xFFFFF000);
/* Map APIC base address */
XtLdrProtocol->AddVirtualMemoryMapping(MemoryMappings, (PVOID)APIC_BASE, ApicBaseAddress, 1, LoaderFirmwarePermanent);
return STATUS_EFI_SUCCESS;
}
/** /**
* Initializes and maps the kernel initialization block. * Initializes and maps the kernel initialization block.
* *
@ -296,8 +352,9 @@ XtpInitializeLoaderBlock(IN PLIST_ENTRY MemoryMappings,
RtlZeroMemory(LoaderBlock, sizeof(KERNEL_INITIALIZATION_BLOCK)); RtlZeroMemory(LoaderBlock, sizeof(KERNEL_INITIALIZATION_BLOCK));
/* Set basic loader block properties */ /* Set basic loader block properties */
LoaderBlock->Size = sizeof(KERNEL_INITIALIZATION_BLOCK); LoaderBlock->BlockSize = sizeof(KERNEL_INITIALIZATION_BLOCK);
LoaderBlock->Version = INITIALIZATION_BLOCK_VERSION; LoaderBlock->BlockVersion = INITIALIZATION_BLOCK_VERSION;
LoaderBlock->ProtocolVersion = BOOT_PROTOCOL_VERSION;
/* Set LoaderInformation block properties */ /* Set LoaderInformation block properties */
LoaderBlock->LoaderInformation.DbgPrint = XtLdrProtocol->DbgPrint; LoaderBlock->LoaderInformation.DbgPrint = XtLdrProtocol->DbgPrint;

View File

@ -13,6 +13,7 @@ list(APPEND XTOSKRNL_SOURCE
${XTOSKRNL_SOURCE_DIR}/ar/${ARCH}/procsup.c ${XTOSKRNL_SOURCE_DIR}/ar/${ARCH}/procsup.c
${XTOSKRNL_SOURCE_DIR}/ar/${ARCH}/traps.c ${XTOSKRNL_SOURCE_DIR}/ar/${ARCH}/traps.c
${XTOSKRNL_SOURCE_DIR}/ex/rundown.c ${XTOSKRNL_SOURCE_DIR}/ex/rundown.c
${XTOSKRNL_SOURCE_DIR}/hl/apic.c
${XTOSKRNL_SOURCE_DIR}/hl/cport.c ${XTOSKRNL_SOURCE_DIR}/hl/cport.c
${XTOSKRNL_SOURCE_DIR}/hl/efifb.c ${XTOSKRNL_SOURCE_DIR}/hl/efifb.c
${XTOSKRNL_SOURCE_DIR}/hl/globals.c ${XTOSKRNL_SOURCE_DIR}/hl/globals.c

48
xtoskrnl/hl/apic.c Normal file
View File

@ -0,0 +1,48 @@
/**
* PROJECT: ExectOS
* COPYRIGHT: See COPYING.md in the top level directory
* FILE: xtoskrnl/hl/apic.c
* DESCRIPTION: Advanced Programmable Interrupt Controller (APIC) support
* DEVELOPERS: Rafal Kupiec <belliash@codingworkshop.eu.org>
*/
#include <xtos.h>
/**
* Reads from the local APIC register.
*
* @param Register
* Supplies the APIC register to read from.
*
* @return This routine returns the value read from the APIC register.
*
* @since XT 1.0
*/
XTFASTCALL
ULONG
HlReadApicRegister(IN APIC_REGISTER Register)
{
return RtlReadRegisterLong((PULONG)APIC_BASE + (Register << 4));
}
/**
* Writes to the local APIC register.
*
* @param Register
* Supplies the APIC register to write to.
*
* @param Value
* Supplies the value to write to the APIC register.
*
* @return This routine does not return any value.
*
* @since XT 1.0
*/
XTFASTCALL
VOID
HlWriteApicRegister(IN APIC_REGISTER Register,
IN ULONG Value)
{
RtlWriteRegisterLong((PULONG)APIC_BASE + (Register << 4), Value);
}

View File

@ -86,7 +86,7 @@ HlDrawPixel(IN ULONG PositionX,
*/ */
XTAPI XTAPI
XTSTATUS XTSTATUS
HlInitializeDisplay(VOID) HlInitializeFrameBuffer(VOID)
{ {
/* Check if display already initialized */ /* Check if display already initialized */
if(HlpFrameBufferData.Initialized) if(HlpFrameBufferData.Initialized)

View File

@ -49,6 +49,15 @@ HlInitializeComPort(IN OUT PCPPORT Port,
XTAPI XTAPI
XTSTATUS XTSTATUS
HlInitializeDisplay(VOID); HlInitializeFrameBuffer(VOID);
XTFASTCALL
ULONG
HlReadApicRegister(IN APIC_REGISTER Register);
XTFASTCALL
VOID
HlWriteApicRegister(IN APIC_REGISTER Register,
IN ULONG Value);
#endif /* __XTOSKRNL_HL_H */ #endif /* __XTOSKRNL_HL_H */

View File

@ -17,6 +17,10 @@ XTAPI
VOID VOID
KeClearEvent(IN PKEVENT Event); KeClearEvent(IN PKEVENT Event);
XTAPI
VOID
KeHaltSystem();
XTAPI XTAPI
VOID VOID
KeInitializeEvent(OUT PKEVENT Event, KeInitializeEvent(OUT PKEVENT Event,

View File

@ -82,9 +82,6 @@ XTAPI
VOID VOID
KepStartKernel(VOID) KepStartKernel(VOID)
{ {
/* Print debug message */
DebugPrint(L"Starting ExectOS ...\n");
/* Initialize XTOS kernel */ /* Initialize XTOS kernel */
KepInitializeKernel(); KepInitializeKernel();

View File

@ -82,9 +82,6 @@ XTAPI
VOID VOID
KepStartKernel(VOID) KepStartKernel(VOID)
{ {
/* Print debug message */
DebugPrint(L"Starting ExectOS ...\n");
/* Initialize XTOS kernel */ /* Initialize XTOS kernel */
KepInitializeKernel(); KepInitializeKernel();

View File

@ -23,29 +23,31 @@ XTAPI
VOID VOID
KeStartXtSystem(IN PKERNEL_INITIALIZATION_BLOCK Parameters) KeStartXtSystem(IN PKERNEL_INITIALIZATION_BLOCK Parameters)
{ {
/* Check if debugging enabled and if boot loader provided routine for debug printing */
if(DEBUG && Parameters->LoaderInformation.DbgPrint)
{
/* Use loader's provided DbgPrint() routine for early printing to serial console */
KeDbgPrint = Parameters->LoaderInformation.DbgPrint;
}
/* Print some message to serial console and test kernel parameters */
DebugPrint(L"Hello world from ExectOS kernel!\n");
DebugPrint(L"\n\n------ Kernel parameters block ------\n"
L"Loader block size: %lu\n"
L"Loader block version: %lu\n"
L"EFI Revision: %lu\n",
Parameters->Size,
Parameters->Version,
Parameters->FirmwareInformation.EfiFirmware.EfiVersion
);
/* Save the kernel initialization block */ /* Save the kernel initialization block */
KeInitializationBlock = Parameters; KeInitializationBlock = Parameters;
/* Verify kernel and boot loader compatibility */
if(KeInitializationBlock->BlockSize != sizeof(KERNEL_INITIALIZATION_BLOCK) ||
KeInitializationBlock->BlockVersion != INITIALIZATION_BLOCK_VERSION ||
KeInitializationBlock->ProtocolVersion != BOOT_PROTOCOL_VERSION)
{
/* Kernel and boot loader version mismatch */
KeHaltSystem();
}
/* Check if debugging enabled and if boot loader provided routine for debug printing */
if(DEBUG && KeInitializationBlock->LoaderInformation.DbgPrint)
{
/* Use loader's provided DbgPrint() routine for early printing to serial console */
KeDbgPrint = KeInitializationBlock->LoaderInformation.DbgPrint;
}
/* Announce kernel startup */
DebugPrint(L"Starting ExectOS v%d.%d (%s-%s-%s-%s / %s %s)\n",
XTOS_VERSION_MAJOR, XTOS_VERSION_MINOR, XTOS_VERSION_DATE,
XTOS_VERSION_BUILD, XTOS_VERSION_ARCH, XTOS_VERSION_HASH,
XTOS_COMPILER_NAME, XTOS_COMPILER_VERSION);
/* Initialize boot CPU */ /* Initialize boot CPU */
ArInitializeProcessor(); ArInitializeProcessor();

View File

@ -9,6 +9,27 @@
#include <xtos.h> #include <xtos.h>
/**
* Halts the system.
*
* @return This routine does not return any value.
*
* @since XT 1.0
*/
XTAPI
VOID
KeHaltSystem()
{
/* Enter infinite loop */
for(;;)
{
/* Halt system */
ArClearInterruptFlag();
ArHalt();
}
}
/** /**
* Crashes the system upon detecting a fatal error in which either it is unable to recover or continue to run system. * Crashes the system upon detecting a fatal error in which either it is unable to recover or continue to run system.
* *