[KSARM.H]

- Fix/add a number of macros based on native definitions
- Add "intrinsics" for GNU ARM assembler
- Move trap macros to asmmacro.S

svn path=/trunk/; revision=67639
This commit is contained in:
Timo Kreuzer 2015-05-10 21:03:33 +00:00
parent 7c09970347
commit 89ee675f59
3 changed files with 319 additions and 194 deletions

View file

@ -8,17 +8,12 @@
#include <ksarm.h> #include <ksarm.h>
//.title "ARM FreeLDR Entry Point"
//.include "ntoskrnl/include/internal/arm/kxarm.h"
//.include "ntoskrnl/include/internal/arm/ksarm.h"
//.section .init
NESTED_ENTRY _start NESTED_ENTRY _start
PROLOG_END _start PROLOG_END _start
//b ArmInit __assertfail
ENTRY_END _start NESTED_END _start
//L_ArmInit: //L_ArmInit:
// .long ArmInit // .long ArmInit

View file

@ -1,73 +1,163 @@
#define ENABLE_FRAME_POINTER 1
#undef TRUE
//#define TRUE 1
#undef FALSE
//#define FALSE 0
//#include "kxarmunw.h"
#ifdef _MSC_VER #ifdef _MSC_VER
/* Globals */ /* Globals */
GBLS AreaName GBLS __FuncStartLabel
GBLS FuncName GBLS __FuncEpilog1StartLabel
GBLS PrologName GBLS __FuncEpilog2StartLabel
GBLS FuncEndName GBLS __FuncEpilog3StartLabel
AreaName SETS "|.text|" GBLS __FuncEpilog4StartLabel
GBLS __FuncXDataLabel
GBLS __FuncXDataPrologLabel
GBLS __FuncXDataEpilog1Label
GBLS __FuncXDataEpilog2Label
GBLS __FuncXDataEpilog3Label
GBLS __FuncXDataEpilog4Label
GBLS __FuncXDataEndLabel
GBLS __FuncEndLabel
GBLS __FuncArea
GBLS __FuncExceptionHandler
MACRO
__DeriveFunctionLabels $FuncName
__FuncStartLabel SETS "|$FuncName|"
__FuncEndLabel SETS "|$FuncName._end|"
__FuncEpilog1StartLabel SETS "|$FuncName._epilog1_start|"
__FuncEpilog2StartLabel SETS "|$FuncName._epilog2_start|"
__FuncEpilog3StartLabel SETS "|$FuncName._epilog3_start|"
__FuncEpilog4StartLabel SETS "|$FuncName._epilog4_start|"
__FuncXDataLabel SETS "|$FuncName._xdata|"
__FuncXDataPrologLabel SETS "|$FuncName._xdata_prolog|"
__FuncXDataEpilog1Label SETS "|$FuncName._xdata_epilog1|"
__FuncXDataEpilog2Label SETS "|$FuncName._xdata_epilog2|"
__FuncXDataEpilog3Label SETS "|$FuncName._xdata_epilog3|"
__FuncXDataEpilog4Label SETS "|$FuncName._xdata_epilog4|"
__FuncXDataEndLabel SETS "|$FuncName._xdata_end|"
MEND
MACRO
__ExportName $FuncName
LCLS Name
Name SETS "|$FuncName|"
ALIGN 4
EXPORT $Name
$Name
MEND
MACRO
__ExportProc $FuncName
LCLS Name
Name SETS "|$FuncName|"
ALIGN 4
EXPORT $Name
$Name PROC
MEND
MACRO MACRO
TEXTAREA TEXTAREA
AREA |.text|,ALIGN=2,CODE,READONLY #if defined(_CONTROL_FLOW_GUARD)
AreaName SETS "|.text|" AREA |.text|,ALIGN=4,CODE,READONLY
#else
AREA |.text|,ALIGN=2,CODE,READONLY
#endif
MEND MEND
MACRO MACRO
NESTED_ENTRY $Name DATAAREA
FuncName SETS "$Name" AREA |.data|,DATA
PrologName SETS "$Name":CC:"_Prolog"
FuncEndName SETS "$Name":CC:"_end"
//AREA |.pdata|,ALIGN=2,PDATA
ALIGN 2
EXPORT $FuncName [FUNC]
$FuncName
ROUT
MEND MEND
MACRO
RODATAAREA
AREA |.rdata|,DATA,READONLY
MEND
MACRO
NESTED_ENTRY $FuncName, $AreaName, $ExceptHandler
__DeriveFunctionLabels $FuncName
__FuncArea SETS "|.text|"
IF "$AreaName" != ""
__FuncArea SETS "$AreaName"
ENDIF
__FuncExceptionHandler SETS ""
IF "$ExceptHandler" != ""
__FuncExceptionHandler SETS "|$ExceptHandler|"
ENDIF
AREA $__FuncArea,CODE,READONLY
__ExportProc $FuncName
ROUT
// __ResetUnwindState
MEND
// FIXME: this does not exist in native
MACRO MACRO
PROLOG_END PROLOG_END
$PrologName /* Ignore for now */
MEND MEND
MACRO MACRO
ENTRY_END $Name NESTED_END $FuncName
$FuncEndName $__FuncEndLabel
MEND LTORG
ENDP
MACRO //AREA |.pdata|,ALIGN=2,READONLY
LEAF_ENTRY $Name //DCD $__FuncStartLabel
FuncName SETS "$Name" //RELOC 2
PrologName SETS "Invalid Prolog" //DCD $__FuncXDataLabel
FuncEndName SETS "$Name":CC:"_end" //RELOC 2
ALIGN 2 //__EmitUnwindXData
EXPORT $FuncName [FUNC] //AREA $__FuncArea,CODE,READONLY
$FuncName __FuncStartLabel SETS ""
ROUT __FuncEndLabel SETS ""
MEND
MACRO
LEAF_END $Name
$FuncEndName
MEND MEND
MACRO MACRO
TRAP_PROLOG $Abort LEAF_ENTRY $FuncName, $AreaName
fixme NESTED_ENTRY $FuncName, $AreaName
MEND MEND
MACRO MACRO
SYSCALL_PROLOG $Abort LEAF_END $FuncName
fixme NESTED_END $FuncName
MEND MEND
MACRO MACRO
TRAP_EPILOG $SystemCall LEAF_ENTRY_NO_PDATA $FuncName, $AreaName
fixme __DeriveFunctionLabels $FuncName
__FuncArea SETS "|.text|"
IF "$AreaName" != ""
__FuncArea SETS "$AreaName"
ENDIF
AREA $__FuncArea,CODE,READONLY
__ExportProc $FuncName
ROUT
MEND MEND
MACRO
LEAF_END_NO_PDATA $FuncName
$__FuncEndLabel
LTORG
ENDP
__FuncStartLabel SETS ""
__FuncEndLabel SETS ""
MEND
MACRO
ALTERNATE_ENTRY $FuncName
__ExportName $FuncName
ROUT
MEND
#define CR 13 #define CR 13
#define LF 10 #define LF 10
#define NUL 0 #define NUL 0
@ -87,9 +177,25 @@ $FuncEndName
/* Ignore */ /* Ignore */
.endm .endm
.macro EXPORT Name
.global &Name
.endm
.macro TEXTAREA .macro TEXTAREA
.section .text, "rx" .section .text, "rx"
#if defined(_CONTROL_FLOW_GUARD)
.align 4
#else
.align 2 .align 2
#endif
.endm
.macro DATAAREA
.section .data, "rw"
.endm
.macro RODATAAREA
.section .rdata, "rw"
.endm .endm
.macro NESTED_ENTRY Name .macro NESTED_ENTRY Name
@ -102,153 +208,52 @@ FuncEndName .equ &Name&_end
&FuncName: &FuncName:
.endm .endm
// FIXME: should go to kxarmunw.h
.macro PROLOG_END .macro PROLOG_END
\PrologName: \PrologName:
.endm .endm
.macro ENTRY_END Name .macro NESTED_END Name
&FuncEndName: &FuncEndName:
.endfunc .endfunc
.endm .endm
.macro TRAP_PROLOG Abort .macro LEAF_ENTRY $FuncName, $AreaName
// NESTED_ENTRY $FuncName, $AreaName
// Fixup lr
//
.if \Abort
sub lr, lr, #8
.else
sub lr, lr, #4
.endif
// Save the bottom 4 registers
stmdb sp, {r0-r3}
// Save the abort lr, sp, spsr, cpsr
mov r0, lr
mov r1, sp
mrs r2, cpsr
mrs r3, spsr
// Switch to SVC mode
bic r2, r2, #CPSR_MODES
orr r2, r2, #CPSR_SVC_MODE
msr cpsr_c, r2
// Save the SVC sp before we modify it
mov r2, sp
// Make space for the trap frame
sub sp, sp, #TrapFrameLength
// Save abt32 state
str r0, [sp, #TrPc]
str lr, [sp, #TrSvcLr]
str r2, [sp, #TrSvcSp]
// Restore the saved SPSR
msr spsr_all, r3
// Restore our 4 registers
ldmdb r1, {r0-r3}
// Build trap frame
// FIXME: Change to stmdb later
str r0, [sp, #TrR0]
str r1, [sp, #TrR1]
str r2, [sp, #TrR2]
str r3, [sp, #TrR3]
str r4, [sp, #TrR4]
str r5, [sp, #TrR5]
str r6, [sp, #TrR6]
str r7, [sp, #TrR7]
str r8, [sp, #TrR8]
str r9, [sp, #TrR9]
str r10, [sp, #TrR10]
str r11, [sp, #TrR11]
str r12, [sp, #TrR12]
mov r12, sp
add r12, r12, #TrUserSp
stm r12, {sp, lr}^
mrs r0, spsr_all
str r0, [sp, #TrSpsr]
ldr r0, =0xBADB0D00
str r0, [sp, #TrDbgArgMark]
.endm .endm
.macro SYSCALL_PROLOG .macro LEAF_END $FuncName
// Make space for the trap frame NESTED_END $FuncName
sub sp, sp, #TrapFrameLength
// Build trap frame
// FIXME: Change to stmdb later
str r0, [sp, #TrR0]
str r1, [sp, #TrR1]
str r2, [sp, #TrR2]
str r3, [sp, #TrR3]
str r4, [sp, #TrR4]
str r5, [sp, #TrR5]
str r6, [sp, #TrR6]
str r7, [sp, #TrR7]
str r8, [sp, #TrR8]
str r9, [sp, #TrR9]
str r10, [sp, #TrR10]
str r11, [sp, #TrR11]
str r12, [sp, #TrR12]
mov r12, sp
add r12, r12, #TrUserSp
stm r12, {sp, lr}^
str sp, [sp, #TrSvcSp]
str lr, [sp, #TrPc]
mrs r0, spsr_all
str r0, [sp, #TrSpsr]
ldr r0, =0xBADB0D00
str r0, [sp, #TrDbgArgMark]
.endm .endm
.macro TRAP_EPILOG SystemCall
// ASSERT(TrapFrame->DbgArgMark == 0xBADB0D00)
ldr r0, [sp, #TrDbgArgMark]
ldr r1, =0xBADB0D00
cmp r0, r1
bne 1f
// Get the SPSR and restore it /* Some "intrinsics", see http://codemachine.com/article_armasm.html */
ldr r0, [sp, #TrSpsr]
msr spsr_all, r0
// Restore the registers .macro __debugbreak
// FIXME: Use LDMIA later DCD 0xDEFE
mov r0, sp
add r0, r0, #TrUserSp
ldm r0, {sp, lr}^
ldr r0, [sp, #TrR0]
ldr r1, [sp, #TrR1]
ldr r2, [sp, #TrR2]
ldr r3, [sp, #TrR3]
ldr r4, [sp, #TrR4]
ldr r5, [sp, #TrR5]
ldr r6, [sp, #TrR6]
ldr r7, [sp, #TrR7]
ldr r8, [sp, #TrR8]
ldr r9, [sp, #TrR9]
ldr r10, [sp, #TrR10]
ldr r11, [sp, #TrR11]
ldr r12, [sp, #TrR12]
// Restore program execution state
.if \SystemCall
ldr lr, [sp, #TrPc]
add sp, sp, #TrapFrameLength
movs pc, lr
.else
add sp, sp, #TrSvcSp
ldmia sp, {sp, lr, pc}^
.endif
1:
b .
.endm .endm
.macro __assertfail
DCD 0xDEFC
.endm
.macro __fastfail
DCD 0xDEFB
.endm
.macro __rdpmccntr64
DCD 0xDEFA
.endm
.macro __debugservice
DCD 0xDEFD
.endm
.macro __brkdiv0
DCD 0xDEF9
.endm
#endif #endif

View file

@ -1,17 +1,142 @@
// #ifdef _MSC_VER
// @name GENERATE_INT_HANDLER
// #else
// This macro creates an unexpected interrupt handler.
// .macro TRAP_PROLOG Abort
// @param None. // Fixup lr
// .if \Abort
// @remark None. sub lr, lr, #8
// .else
.macro GENERATE_ARM_STUB Name sub lr, lr, #4
.global &Name .endif
.func &Name
&Name: // Save the bottom 4 registers
b . stmdb sp, {r0-r3}
.endfunc
// Save the abort lr, sp, spsr, cpsr
mov r0, lr
mov r1, sp
mrs r2, cpsr
mrs r3, spsr
// Switch to SVC mode
bic r2, r2, #CPSR_MODES
orr r2, r2, #CPSR_SVC_MODE
msr cpsr_c, r2
// Save the SVC sp before we modify it
mov r2, sp
// Make space for the trap frame
sub sp, sp, #TrapFrameLength
// Save abt32 state
str r0, [sp, #TrPc]
str lr, [sp, #TrSvcLr]
str r2, [sp, #TrSvcSp]
// Restore the saved SPSR
msr spsr_all, r3
// Restore our 4 registers
ldmdb r1, {r0-r3}
// Build trap frame
// FIXME: Change to stmdb later
str r0, [sp, #TrR0]
str r1, [sp, #TrR1]
str r2, [sp, #TrR2]
str r3, [sp, #TrR3]
str r4, [sp, #TrR4]
str r5, [sp, #TrR5]
str r6, [sp, #TrR6]
str r7, [sp, #TrR7]
str r8, [sp, #TrR8]
str r9, [sp, #TrR9]
str r10, [sp, #TrR10]
str r11, [sp, #TrR11]
str r12, [sp, #TrR12]
mov r12, sp
add r12, r12, #TrUserSp
stm r12, {sp, lr}^
mrs r0, spsr_all
str r0, [sp, #TrSpsr]
ldr r0, =0xBADB0D00
str r0, [sp, #TrDbgArgMark]
.endm .endm
.macro SYSCALL_PROLOG
// Make space for the trap frame
sub sp, sp, #TrapFrameLength
// Build trap frame
// FIXME: Change to stmdb later
str r0, [sp, #TrR0]
str r1, [sp, #TrR1]
str r2, [sp, #TrR2]
str r3, [sp, #TrR3]
str r4, [sp, #TrR4]
str r5, [sp, #TrR5]
str r6, [sp, #TrR6]
str r7, [sp, #TrR7]
str r8, [sp, #TrR8]
str r9, [sp, #TrR9]
str r10, [sp, #TrR10]
str r11, [sp, #TrR11]
str r12, [sp, #TrR12]
mov r12, sp
add r12, r12, #TrUserSp
stm r12, {sp, lr}^
str sp, [sp, #TrSvcSp]
str lr, [sp, #TrPc]
mrs r0, spsr_all
str r0, [sp, #TrSpsr]
ldr r0, =0xBADB0D00
str r0, [sp, #TrDbgArgMark]
.endm
.macro TRAP_EPILOG SystemCall
// ASSERT(TrapFrame->DbgArgMark == 0xBADB0D00)
ldr r0, [sp, #TrDbgArgMark]
ldr r1, =0xBADB0D00
cmp r0, r1
bne 1f
// Get the SPSR and restore it
ldr r0, [sp, #TrSpsr]
msr spsr_all, r0
// Restore the registers
// FIXME: Use LDMIA later
mov r0, sp
add r0, r0, #TrUserSp
ldm r0, {sp, lr}^
ldr r0, [sp, #TrR0]
ldr r1, [sp, #TrR1]
ldr r2, [sp, #TrR2]
ldr r3, [sp, #TrR3]
ldr r4, [sp, #TrR4]
ldr r5, [sp, #TrR5]
ldr r6, [sp, #TrR6]
ldr r7, [sp, #TrR7]
ldr r8, [sp, #TrR8]
ldr r9, [sp, #TrR9]
ldr r10, [sp, #TrR10]
ldr r11, [sp, #TrR11]
ldr r12, [sp, #TrR12]
// Restore program execution state
.if \SystemCall
ldr lr, [sp, #TrPc]
add sp, sp, #TrapFrameLength
movs pc, lr
.else
add sp, sp, #TrSvcSp
ldmia sp, {sp, lr, pc}^
.endif
1:
b .
.endm
#endif