singrdk/base/Kernel/Native/arm/hal.inc

158 lines
4.3 KiB
PHP

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;
;;; Microsoft Research Singularity
;;;
;;; Copyright (c) Microsoft Corporation. All rights reserved.
;;;
;;; Include file for ARM assembly files.
;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
OMAP3430_CPU_ARGS_ADDR equ 0x8000fff0
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;
include halclass.armfix.inc
include kxarm.inc
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;
;;; Macros for accessing fields inside ProcessorContext
;;;
;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;
;;; TPIDRURW ([OMAP3430_CPU_ARGS_ADDR] on older processors) points to the "fs/gs" page.
;;; The CurrentThread and CurrentCpu pointers are stored at offsets on that page.
;;;
MACRO
GET_TPIDRURW $reg
ldr $reg, =OMAP3430_CPU_ARGS_ADDR
ldr $reg, [$reg]
MEND
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;
;;; Get the address of the CurrentThread variable.
;;;
MACRO
GET_THREAD_ADDR $reg, $scratch
;; Workaround assembler bug with ldr $reg, =foo
ldr $scratch, [pc]
mov pc, pc ;; skip over dcd value.
dcd |?c_currentThreadOffset@Class_Microsoft_Singularity_Isal_Isa@@2HA|
ldr $scratch, [$scratch]
GET_TPIDRURW $reg
add $reg, $reg, $scratch
MEND
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;
;;; Get the address of the CurrentCpu variable.
;;;
MACRO
GET_CPU_ADDR $reg, $scratch
;; Workaround assembler bug with ldr $reg, =foo
ldr $scratch, [pc]
mov pc, pc
dcd |?c_currentCpuOffset@Class_Microsoft_Singularity_Isal_Isa@@2HA|
ldr $scratch, [$scratch]
GET_TPIDRURW $reg
add $reg, $reg, $scratch
MEND
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;
;;; Get the address of a field in the CurrentThread record.
;;;
MACRO
GET_THREAD_FIELD_ADDR $reg, $scratch, $offset
GET_THREAD_ADDR $reg, $scratch
ldr $reg, [$reg]
add $reg, $reg, $offset
MEND
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;
;;; Get the address of a field in the CurrentCpu record.
;;;
MACRO
GET_CPU_FIELD_ADDR $reg, $scratch, $offset
GET_CPU_ADDR $reg, $scratch
ldr $reg, [$reg]
add $reg, $reg, $offset
MEND
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;
;;; Push a register onto the stack.
;;;
MACRO
PUSH $reg
str $reg, [sp, #-4]!
MEND
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;
;;; Pop a register from the stack.
;;;
MACRO
POP $reg
ldr $reg, [sp], #4
MEND
MACRO
CurrentThreadIndex $reg, $tmpReg
mov $reg, sp, LSR #PAGE_BITS
mov $reg, $reg, LSL #2
ldr $tmpReg, pageTable
add $reg, $reg, $tmpReg
ldr $reg, [$reg]
ldr $tmpReg, =0xFFF
and $reg, $tmpReg, $reg, LSR #4
MEND
EXTERN |?c_halPageDescriptor@Class_System_GCs_PageTable@@2PAIA|
EXTERN |?c_threadTable@Class_System_Threading_Thread@@2PAUClassVector_Class_System_Threading_Thread@@A|
; EXTERN |?c_initialThread@Class_System_Threading_Thread@@2PAU1@A|
pageTable
DCD |?c_halPageDescriptor@Class_System_GCs_PageTable@@2PAIA|
threadTable
DCD |?c_threadTable@Class_System_Threading_Thread@@2PAUClassVector_Class_System_Threading_Thread@@A|
MACRO
ThreadFromIndex $reg, $tmpReg
mov $reg, $reg, LSL #2
add $reg, $reg, #8
ldr $tmpReg, threadTable
ldr $tmpReg, [$tmpReg]
add $reg, $reg, $tmpReg
ldr $reg, [$reg]
MEND
MACRO
CurrentThread $reg, $tmpReg
CurrentThreadIndex $reg, $tmpReg
ThreadFromIndex $reg, $tmpReg
MEND
END