reactos/ntoskrnl/include/internal/arm/ke.h

182 lines
3.3 KiB
C

#pragma once
#include "intrin_i.h"
#define KiServiceExit2 KiExceptionExit
#define SYNCH_LEVEL DISPATCH_LEVEL
#define PCR ((KPCR * const)KIP0PCRADDRESS)
//
//Lockdown TLB entries
//
#define PCR_ENTRY 0
#define PDR_ENTRY 2
//
// BKPT is 4 bytes long
//
#define KD_BREAKPOINT_TYPE ULONG
#define KD_BREAKPOINT_SIZE sizeof(ULONG)
#define KD_BREAKPOINT_VALUE 0xDEFE
//
// Maximum IRQs
//
#define MAXIMUM_VECTOR 16
//
// Macros for getting and setting special purpose registers in portable code
//
#define KeGetContextPc(Context) \
((Context)->Pc)
#define KeSetContextPc(Context, ProgramCounter) \
((Context)->Pc = (ProgramCounter))
#define KeGetTrapFramePc(TrapFrame) \
((TrapFrame)->Pc)
#define KeGetContextReturnRegister(Context) \
((Context)->R0)
#define KeSetContextReturnRegister(Context, ReturnValue) \
((Context)->R0 = (ReturnValue))
//
// Macro to get trap and exception frame from a thread stack
//
#define KeGetTrapFrame(Thread) \
(PKTRAP_FRAME)((ULONG_PTR)((Thread)->InitialStack) - \
sizeof(KTRAP_FRAME))
#define KeGetExceptionFrame(Thread) \
(PKEXCEPTION_FRAME)((ULONG_PTR)KeGetTrapFrame(Thread) - \
sizeof(KEXCEPTION_FRAME))
//
// Macro to get context switches from the PRCB
// All architectures but x86 have it in the PRCB's KeContextSwitches
//
#define KeGetContextSwitches(Prcb) \
(Prcb)->KeContextSwitches
//
// Macro to get the second level cache size field name which differs between
// CISC and RISC architectures, as the former has unified I/D cache
//
#define KiGetSecondLevelDCacheSize() ((PKIPCR)KeGetPcr())->SecondLevelDcacheSize
//
// Returns the Interrupt State from a Trap Frame.
// ON = TRUE, OFF = FALSE
//
#define KeGetTrapFrameInterruptState(TrapFrame) 0
FORCEINLINE
BOOLEAN
KeDisableInterrupts(VOID)
{
ARM_STATUS_REGISTER Flags;
//
// Get current interrupt state and disable interrupts
//
Flags = KeArmStatusRegisterGet();
_disable();
//
// Return previous interrupt state
//
return Flags.IrqDisable;
}
FORCEINLINE
VOID
KeRestoreInterrupts(BOOLEAN WereEnabled)
{
if (WereEnabled) _enable();
}
//
// Invalidates the TLB entry for a specified address
//
FORCEINLINE
VOID
KeInvalidateTlbEntry(IN PVOID Address)
{
/* Invalidate the TLB entry for this address */
KeArmInvalidateTlbEntry(Address);
}
FORCEINLINE
VOID
KeFlushProcessTb(VOID)
{
KeArmFlushTlb();
}
FORCEINLINE
VOID
KeSweepICache(IN PVOID BaseAddress,
IN SIZE_T FlushSize)
{
//
// Always sweep the whole cache
//
UNREFERENCED_PARAMETER(BaseAddress);
UNREFERENCED_PARAMETER(FlushSize);
_MoveToCoprocessor(0, CP15_ICIALLU);
}
FORCEINLINE
VOID
KiRundownThread(IN PKTHREAD Thread)
{
/* FIXME */
}
VOID
KiPassiveRelease(
VOID
);
VOID
KiSystemService(IN PKTHREAD Thread,
IN PKTRAP_FRAME TrapFrame,
IN ULONG Instruction);
VOID
KiApcInterrupt(
VOID
);
#include "mm.h"
VOID
KeFlushTb(
VOID
);
//
// Cache clean and flush
//
VOID
HalSweepDcache(
VOID
);
VOID
HalSweepIcache(
VOID
);
#define Ki386PerfEnd()
#define KiEndInterrupt(x,y)
#define KiGetLinkedTrapFrame(x) \
(PKTRAP_FRAME)((x)->TrapFrame)
#define KiGetPreviousMode(tf) \
((tf->Cpsr & CPSRM_MASK) == CPSRM_USER) ? UserMode: KernelMode