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

This commit is contained in:
2023-11-23 16:57:54 +01:00
22 changed files with 287 additions and 43 deletions

View File

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

View File

@@ -11,7 +11,7 @@ endif()
# Set build optimisation
if(BUILD_TYPE STREQUAL "DEBUG")
add_compiler_flags("/Zi")
add_compiler_ccxxflags("/Zi")
add_compiler_ccxxflags("-Ob0 -Od")
add_linker_flags("/DEBUG /INCREMENTAL /OPT:NOREF /OPT:NOICF /PDBSOURCEPATH:build")
else()
@@ -38,10 +38,10 @@ add_compiler_ccxxflags("-Gy")
add_compiler_ccxxflags("-EHa")
# Control warnings levels
add_compiler_flags("-W3 -w14115")
add_compiler_flags("-wd4200 -wd4214 -wd4244 -wd4290 -wd4800")
add_compiler_flags("-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("-W3 -w14115")
add_compiler_ccxxflags("-wd4200 -wd4214 -wd4244 -wd4290 -wd4800")
add_compiler_ccxxflags("-we4013 -we4020 -we4022 -we4028 -we4047 -we4098 -we4101 -we4113 -we4129 -we4133")
add_compiler_ccxxflags("-we4163 -we4189 -we4229 -we4311 -we4312 -we4313 -we4477 -we4603 -we4700 -we4715 -we4716")
# Disable warnings about specific features
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
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(CMAKE_MSVC_RUNTIME_LIBRARY "")

View File

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

View File

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

View File

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

View File

@@ -14,6 +14,9 @@
#include <xttypes.h>
/* APIC base address */
#define APIC_BASE 0xFFFE0000
/* Serial port I/O addresses */
#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 */
#define INITIALIZATION_BLOCK_VERSION 1
/* Version number of the current XTOS loader protocol */
#define BOOT_PROTOCOL_VERSION 1
/* Memory allocation structures */
typedef enum _LOADER_MEMORY_TYPE
{
@@ -115,11 +118,12 @@ typedef struct _LOADER_MEMORY_MAPPING
/* Loader provided information needed by the kernel to initialize */
typedef struct _KERNEL_INITIALIZATION_BLOCK
{
ULONG BlockSize;
ULONG BlockVersion;
ULONG ProtocolVersion;
LIST_ENTRY LoadOrderListHead;
LIST_ENTRY MemoryDescriptorListHead;
LIST_ENTRY BootDriverListHead;
ULONG Size;
ULONG Version;
LOADER_INFORMATION_BLOCK LoaderInformation;
FIRMWARE_INFORMATION_BLOCK FirmwareInformation;
} 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 _EXCEPTION_DISPOSITION EXCEPTION_DISPOSITION, *PEXCEPTION_DISPOSITION;
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_PIXEL_FORMAT EFI_GRAPHICS_PIXEL_FORMAT, *PEFI_GRAPHICS_PIXEL_FORMAT;
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_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_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_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;
@@ -264,6 +268,7 @@ typedef struct _UNICODE_STRING64 UNICODE_STRING64, *PUNICODE_STRING64;
/* Unions forward references */
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_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_HASH_OUTPUT EFI_HASH_OUTPUT, *PEFI_HASH_OUTPUT;
typedef union _EFI_IP_ADDRESS EFI_IP_ADDRESS, *PEFI_IP_ADDRESS;

View File

@@ -79,14 +79,14 @@
#define EFI_MAXIMUM_VARIABLE_SIZE 1024
/* EFI event types */
#define EFI_EVENT_TIMER 0x80000000
#define EFI_EVENT_RUNTIME 0x40000000
#define EFI_EVENT_RUNTIME_CONTEXT 0x20000000
#define EFI_EVENT_EFI_SIGNAL_MASK 0x000000FF
#define EFI_EVENT_NOTIFY_WAIT 0x00000100
#define EFI_EVENT_NOTIFY_SIGNAL 0x00000200
#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_EFI_SIGNAL_MASK 0x000000FF
#define EFI_EVENT_TIMER 0x80000000
/* EFI disk signature type */
#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_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_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_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}}
@@ -481,6 +482,14 @@ typedef enum _EFI_UART_STOP_BITS_TYPE
TwoStopBits
} 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 */
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_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 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_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);
@@ -2308,6 +2325,57 @@ typedef struct _EFI_SIMPLE_NETWORK_PROTOCOL
PEFI_SIMPLE_NETWORK_MODE Mode;
} 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 */
typedef struct _EFI_MP_SERVICES_PROTOCOL
{