[REACTOS] Finally get some ARM64 applications building (#4517)

- Add some missing ARM64 exports to ntdll, kernel32 and user32
- Create mmtypes header file based on WoA debug symbols
- Get the remaining headers in order, so we can build ARM64 apps
- Adjust subsystem version for binaries so they can run on WoA host
- Get calc, notepad and more base apps to build for ARM64 platform

CORE-17518

Reviewed-by: Hermès Bélusca-Maïto <hermes.belusca-maito@reactos.org>
Reviewed-by: Stanislav Motylkov <x86corez@gmail.com>
This commit is contained in:
Justin Miller 2022-05-25 07:06:32 -07:00 committed by GitHub
parent 3464df8c28
commit 4363e74ddc
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
21 changed files with 529 additions and 17 deletions

View file

@ -30,6 +30,8 @@ Author:
#include <powerpc/ketypes.h>
#elif defined(_M_ARM)
#include <arm/ketypes.h>
#elif defined(_M_ARM64)
#include <arm64/ketypes.h>
#else
#error "Unknown processor"
#endif

View file

@ -30,6 +30,8 @@ Author:
#include <arm/mmtypes.h>
#elif defined(_M_AMD64)
#include <amd64/mmtypes.h>
#elif defined(_M_ARM64)
#include <arm64/mmtypes.h>
#else
#error "Unknown processor"
#endif

View file

@ -0,0 +1,293 @@
#ifndef _ARM64_KETYPES_H
#define _ARM64_KETYPES_H
#ifdef __cplusplus
extern "C" {
#endif
/* Interrupt request levels */
#define PASSIVE_LEVEL 0
#define LOW_LEVEL 0
#define APC_LEVEL 1
#define DISPATCH_LEVEL 2
#define CMCI_LEVEL 5
#define CLOCK_LEVEL 13
#define IPI_LEVEL 14
#define DRS_LEVEL 14
#define POWER_LEVEL 14
#define PROFILE_LEVEL 15
#define HIGH_LEVEL 15
//
// IPI Types
//
#define IPI_APC 1
#define IPI_DPC 2
#define IPI_FREEZE 4
#define IPI_PACKET_READY 6
#define IPI_SYNCH_REQUEST 16
//
// PRCB Flags
//
#define PRCB_MAJOR_VERSION 1
#define PRCB_BUILD_DEBUG 1
#define PRCB_BUILD_UNIPROCESSOR 2
//
// No LDTs on ARM64
//
#define LDT_ENTRY ULONG
//
// HAL Variables
//
#define INITIAL_STALL_COUNT 100
#define MM_HAL_VA_START 0xFFFFFFFFFFC00000ULL
#define MM_HAL_VA_END 0xFFFFFFFFFFFFFFFFULL
//
// Structure for CPUID info
//
typedef union _CPU_INFO
{
ULONG dummy;
} CPU_INFO, *PCPU_INFO;
typedef struct _KTRAP_FRAME
{
UCHAR ExceptionActive;
UCHAR ContextFromKFramesUnwound;
UCHAR DebugRegistersValid;
union
{
struct
{
CHAR PreviousMode;
UCHAR PreviousIrql;
};
};
ULONG Reserved;
union
{
struct
{
ULONG64 FaultAddress;
ULONG64 TrapFrame;
};
};
//struct PKARM64_VFP_STATE VfpState;
ULONG VfpState;
ULONG Bcr[8];
ULONG64 Bvr[8];
ULONG Wcr[2];
ULONG64 Wvr[2];
ULONG Spsr;
ULONG Esr;
ULONG64 Sp;
union
{
ULONG64 X[19];
struct
{
ULONG64 X0;
ULONG64 X1;
ULONG64 X2;
ULONG64 X3;
ULONG64 X4;
ULONG64 X5;
ULONG64 X6;
ULONG64 X7;
ULONG64 X8;
ULONG64 X9;
ULONG64 X10;
ULONG64 X11;
ULONG64 X12;
ULONG64 X13;
ULONG64 X14;
ULONG64 X15;
ULONG64 X16;
ULONG64 X17;
ULONG64 X18;
};
};
ULONG64 Lr;
ULONG64 Fp;
ULONG64 Pc;
} KTRAP_FRAME, *PKTRAP_FRAME;
typedef struct _KEXCEPTION_FRAME
{
ULONG dummy;
} KEXCEPTION_FRAME, *PKEXCEPTION_FRAME;
#ifndef NTOS_MODE_USER
typedef struct _TRAPFRAME_LOG_ENTRY
{
ULONG64 Thread;
UCHAR CpuNumber;
UCHAR TrapType;
USHORT Padding;
ULONG Cpsrl;
ULONG64 X0;
ULONG64 X1;
ULONG64 X2;
ULONG64 X3;
ULONG64 X4;
ULONG64 X5;
ULONG64 X6;
ULONG64 X7;
ULONG64 Fp;
ULONG64 Lr;
ULONG64 Sp;
ULONG64 Pc;
ULONG64 Far;
ULONG Esr;
ULONG Reserved1;
} TRAPFRAME_LOG_ENTRY, *PTRAPFRAME_LOG_ENTRY;
//
// Processor Region Control Block
// Based on WoA
//
typedef struct _KPRCB
{
ULONG dummy;
} KPRCB, *PKPRCB;
//
// Processor Control Region
// Based on WoA
//
typedef struct _KIPCR
{
union
{
struct
{
ULONG TibPad0[2];
PVOID Spare1;
struct _KPCR *Self;
PVOID PcrReserved0;
struct _KSPIN_LOCK_QUEUE* LockArray;
PVOID Used_Self;
};
};
KIRQL CurrentIrql;
UCHAR SecondLevelCacheAssociativity;
UCHAR Pad1[2];
USHORT MajorVersion;
USHORT MinorVersion;
ULONG StallScaleFactor;
ULONG SecondLevelCacheSize;
struct
{
UCHAR ApcInterrupt;
UCHAR DispatchInterrupt;
};
USHORT InterruptPad;
UCHAR BtiMitigation;
struct
{
UCHAR SsbMitigationFirmware:1;
UCHAR SsbMitigationDynamic:1;
UCHAR SsbMitigationKernel:1;
UCHAR SsbMitigationUser:1;
UCHAR SsbMitigationReserved:4;
};
UCHAR Pad2[2];
ULONG64 PanicStorage[6];
PVOID KdVersionBlock;
PVOID HalReserved[134];
PVOID KvaUserModeTtbr1;
/* Private members, not in ntddk.h */
PVOID Idt[256];
PVOID* IdtExt;
PVOID PcrAlign[15];
KPRCB Prcb;
} KIPCR, *PKIPCR;
//
// Special Registers Structure (outside of CONTEXT)
// Based on WoA symbols
//
typedef struct _KSPECIAL_REGISTERS
{
ULONG64 Elr_El1;
UINT32 Spsr_El1;
ULONG64 Tpidr_El0;
ULONG64 Tpidrro_El0;
ULONG64 Tpidr_El1;
ULONG64 KernelBvr[8];
ULONG KernelBcr[8];
ULONG64 KernelWvr[2];
ULONG KernelWcr[2];
} KSPECIAL_REGISTERS, *PKSPECIAL_REGISTERS;
//
// ARM64 Architecture State
// Based on WoA symbols
//
typedef struct _KARM64_ARCH_STATE
{
ULONG64 Midr_El1;
ULONG64 Sctlr_El1;
ULONG64 Actlr_El1;
ULONG64 Cpacr_El1;
ULONG64 Tcr_El1;
ULONG64 Ttbr0_El1;
ULONG64 Ttbr1_El1;
ULONG64 Esr_El1;
ULONG64 Far_El1;
ULONG64 Pmcr_El0;
ULONG64 Pmcntenset_El0;
ULONG64 Pmccntr_El0;
ULONG64 Pmxevcntr_El0[31];
ULONG64 Pmxevtyper_El0[31];
ULONG64 Pmovsclr_El0;
ULONG64 Pmselr_El0;
ULONG64 Pmuserenr_El0;
ULONG64 Mair_El1;
ULONG64 Vbar_El1;
} KARM64_ARCH_STATE, *PKARM64_ARCH_STATE;
typedef struct _KPROCESSOR_STATE
{
KSPECIAL_REGISTERS SpecialRegisters; // 0
KARM64_ARCH_STATE ArchState; // 160
CONTEXT ContextFrame; // 800
} KPROCESSOR_STATE, *PKPROCESSOR_STATE;
//
// Macro to get current KPRCB
//
FORCEINLINE
struct _KPRCB *
KeGetCurrentPrcb(VOID)
{
//UNIMPLEMENTED;
return 0;
}
//
// Just read it from the PCR
//
#define KeGetCurrentIrql() KeGetPcr()->CurrentIrql
#define _KeGetCurrentThread() KeGetCurrentPrcb()->CurrentThread
#define _KeGetPreviousMode() KeGetCurrentPrcb()->CurrentThread->PreviousMode
#define _KeIsExecutingDpc() (KeGetCurrentPrcb()->DpcRoutineActive != 0)
#define KeGetCurrentThread() _KeGetCurrentThread()
#define KeGetPreviousMode() _KeGetPreviousMode()
#endif // !NTOS_MODE_USER
#ifdef __cplusplus
}; // extern "C"
#endif
#endif // !_ARM64_KETYPES_H

View file

@ -0,0 +1,151 @@
#ifndef _ARM64_MMTYPES_H
#define _ARM64_MMTYPES_H
#ifdef __cplusplus
extern "C" {
#endif
//
// Page-related Macros
//
#ifndef PAGE_SIZE
#define PAGE_SIZE 0x1000
#endif
#define PAGE_SHIFT 12L
#define MM_ALLOCATION_GRANULARITY 0x10000
#define MM_ALLOCATION_GRANULARITY_SHIFT 16L
#define MM_PAGE_FRAME_NUMBER_SIZE 20
/* Following structs are based on WoA symbols */
typedef struct _HARDWARE_PTE
{
/* 8 Byte struct */
ULONG64 Valid:1;
ULONG64 NotLargePage:1;
ULONG64 CacheType:2;
ULONG64 OsAvailable2:1;
ULONG64 NonSecure:1;
ULONG64 Owner:1;
ULONG64 NotDirty:1;
ULONG64 Shareability:2;
ULONG64 Accessed:1;
ULONG64 NonGlobal:1;
ULONG64 PageFrameNumber:36;
ULONG64 RsvdZ1:4;
ULONG64 ContigousBit:1;
ULONG64 PrivilegedNoExecute:1;
ULONG64 UserNoExecute:1;
ULONG64 Writable:1;
ULONG64 CopyOnWrite:1;
ULONG64 OsAvailable:2;
ULONG64 PxnTable:1;
ULONG64 UxnTable:1;
ULONG64 ApTable:2;
ULONG64 NsTable:1;
} HARDWARE_PTE, *PHARDWARE_PTE;
typedef struct _MMPTE_SOFTWARE
{
/* 8 Byte struct */
ULONG64 Valid:1;
ULONG64 Protection:5;
ULONG64 PageFileLow:4;
ULONG64 Prototype:1;
ULONG64 Transition:1;
ULONG64 PageFileReserved:1;
ULONG64 PageFileAllocated:1;
ULONG64 UsedPageTableEntries:10;
ULONG64 ColdPage:1;
ULONG64 OnStandbyLookaside:1;
ULONG64 RsvdZ1:6;
ULONG64 PageFileHigh:32;
} MMPTE_SOFTWARE;
typedef struct _MMPTE_TRANSITION
{
/* 8 Byte struct */
ULONG64 Valid:1;
ULONG64 Protection:5;
ULONG64 Spare:2;
ULONG64 OnStandbyLookaside:1;
ULONG64 IoTracker:1;
ULONG64 Prototype:1;
ULONG64 Transition:1;
ULONG64 PageFrameNumber:40;
ULONG64 RsvdZ1:12;
} MMPTE_TRANSITION;
typedef struct _MMPTE_PROTOTYPE
{
/* 8 Byte struct */
ULONG64 Valid:1;
ULONG64 Protection:5;
ULONG64 HiberVerifyConverted:1;
ULONG64 Unused1:1;
ULONG64 ReadOnly:1;
ULONG64 Combined:1;
ULONG64 Prototype:1;
ULONG64 DemandFillProto:1;
ULONG64 RsvdZ1:4;
ULONG64 ProtoAddress:48;
} MMPTE_PROTOTYPE;
typedef struct _MMPTE_SUBSECTION
{
/* 8 Byte struct */
ULONG64 Valid:1;
ULONG64 Protection:5;
ULONG64 OnStandbyLookaside:1;
ULONG64 RsvdZ1:3;
ULONG64 Prototype:1;
ULONG64 ColdPage:1;
ULONG64 RsvdZ2:4;
ULONG64 SubsectionAddress:48;
} MMPTE_SUBSECTION;
typedef struct _MMPTE_TIMESTAMP
{
/* 8 Byte struct */
ULONG64 MustBeZero:1;
ULONG64 Protection:5;
ULONG64 PageFileLow:4;
ULONG64 Prototype:1;
ULONG64 Transition:1;
ULONG64 RsvdZ1:20;
ULONG64 GlobalTimeStamp:32;
} MMPTE_TIMESTAMP;
typedef struct _MMPTE_LIST
{
/* 8 Byte struct */
ULONG64 Valid:1;
ULONG64 Protection:5;
ULONG64 OneEntry:1;
ULONG64 RsvdZ1:3;
ULONG64 Prototype:1;
ULONG64 Transition:1;
ULONG64 RsvdZ2:16;
ULONG64 NextEntry:36;
} MMPTE_LIST;
typedef struct _MMPTE
{
union
{
ULONG_PTR Long;
HARDWARE_PTE Flush;
HARDWARE_PTE Hard;
MMPTE_PROTOTYPE Proto;
MMPTE_SOFTWARE Soft;
MMPTE_TRANSITION Trans;
MMPTE_SUBSECTION Subsect;
MMPTE_LIST List;
} u;
} MMPTE, *PMMPTE;
#ifdef __cplusplus
}; // extern "C"
#endif
#endif

View file

@ -1213,7 +1213,7 @@ typedef struct _KTHREAD
};
};
KSPIN_LOCK ApcQueueLock;
#ifndef _M_AMD64 // [
#if !defined(_M_AMD64) && !defined(_M_ARM64) // [
ULONG ContextSwitches;
volatile UCHAR State;
UCHAR NpxState;
@ -1263,7 +1263,7 @@ typedef struct _KTHREAD
SINGLE_LIST_ENTRY SwapListEntry;
};
PKQUEUE Queue;
#ifndef _M_AMD64 // [
#if !defined(_M_AMD64) && !defined(_M_ARM64) // [
ULONG WaitTime;
union
{

View file

@ -1797,6 +1797,8 @@ typedef struct _STACK_TRACE_DATABASE
#ifndef NTOS_MODE_USER
#if defined(_M_AMD64)
C_ASSERT(sizeof(ERESOURCE) <= 0x68);
#elif defined(_M_ARM64)
C_ASSERT(sizeof(ERESOURCE) <= 0x68);
#else
C_ASSERT(sizeof(ERESOURCE) <= 56);
#endif