115 lines
3.3 KiB
NASM
115 lines
3.3 KiB
NASM
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||
|
;;;
|
||
|
;;; Microsoft Research Singularity ARM Bootstrap
|
||
|
;;;
|
||
|
;;;
|
||
|
|
||
|
|defining ?g_GetCycleCount@Class_Microsoft_Singularity_Isal_Isa@@SA_KXZ| EQU 1
|
||
|
|defining ?g_EnableCycleCounter@Class_Microsoft_Singularity_Isal_Isa@@SAXXZ| EQU 1
|
||
|
|
||
|
include hal.inc
|
||
|
|
||
|
TEXTAREA
|
||
|
|
||
|
;;;
|
||
|
;;; Reset cycle counter
|
||
|
;;;
|
||
|
;;; "void __cdecl ResetCycleCounter(void)"
|
||
|
;;;
|
||
|
LEAF_ENTRY ?ResetCycleCounter@@YAXXZ
|
||
|
mrc p15, 0, r1, c9, c12, 0 ; read PMCR
|
||
|
orr r1, r1, #8 ; set C
|
||
|
mcr p15, 0, r1, c9, c12, 0 ; set PMCR
|
||
|
|
||
|
; bkpt 0xffff
|
||
|
bx lr
|
||
|
LEAF_END
|
||
|
|
||
|
;;;
|
||
|
;;; Check for cycle counter wrap
|
||
|
;;;
|
||
|
;;; "bool __cdecl CycleCounterWrapped(void)"
|
||
|
;;;
|
||
|
LEAF_ENTRY ?CycleCounterWrapped@@YA_NXZ
|
||
|
mrc p15, 0, r1, c9, c12, 3 ; read overflow status
|
||
|
mov r1, r1, lsr #31 ; move CC overflow to bit 0
|
||
|
and r0, r1, #1 ; check bit 0
|
||
|
|
||
|
; bkpt 0xffff
|
||
|
bx lr
|
||
|
LEAF_END
|
||
|
|
||
|
;;;
|
||
|
;;; Clear cycle counter wrap flag
|
||
|
;;;
|
||
|
;;; "void __cdecl ClearCycleCounterWrap(void)"
|
||
|
;;;
|
||
|
LEAF_ENTRY ?ClearCycleCounterWrap@@YAXXZ
|
||
|
mrc p15, 0, r1, c9, c12, 3 ; read overflow status
|
||
|
bic r1, r1, #0x80000000 ; clear CC overflow bit
|
||
|
mcr p15, 0, r1, c9, c12, 3 ; set overflow status
|
||
|
|
||
|
; bkpt 0xffff
|
||
|
bx lr
|
||
|
LEAF_END
|
||
|
|
||
|
;;;
|
||
|
;;; Enable cycle counter
|
||
|
;;;
|
||
|
;;; "void __cdecl EnableCycleCounter(void)"
|
||
|
;;;
|
||
|
LEAF_ENTRY ?g_EnableCycleCounter@Class_Microsoft_Singularity_Isal_Isa@@SAXXZ
|
||
|
mrc p15, 0, r1, c9, c12, 0 ; read PMCR
|
||
|
orr r1, r1, #1 ; set E (enable) bit
|
||
|
mcr p15, 0, r1, c9, c12, 0 ; write PMCR
|
||
|
|
||
|
mrc p15, 0, r1, c9, c12, 1 ; read PM count enable set register
|
||
|
orr r1, r1, #0x80000000 ; set C (CC enable) bit
|
||
|
mcr p15, 0, r1, c9, c12, 1 ; write PM count enable set register
|
||
|
|
||
|
; bkpt 0xffff
|
||
|
bx lr
|
||
|
LEAF_END
|
||
|
|
||
|
;;;
|
||
|
;;; Disable cycle counter
|
||
|
;;;
|
||
|
;;; "void __cdecl DisableCycleCounter(void)"
|
||
|
;;;
|
||
|
LEAF_ENTRY ?DisableCycleCounter@@YAXXZ
|
||
|
mrc p15, 0, r1, c9, c12, 1 ; read PM count enable set register
|
||
|
bic r1, r1, #0x80000000 ; clear C (CC enable) bit
|
||
|
mcr p15, 0, r1, c9, c12, 1 ; write PM count enable set register
|
||
|
|
||
|
mrc p15, 0, r1, c9, c12, 0 ; read PMCR
|
||
|
bic r1, r1, #1 ; clear E (enable) bit
|
||
|
mcr p15, 0, r1, c9, c12, 0 ; write PMCR
|
||
|
|
||
|
; bkpt 0xffff
|
||
|
bx lr
|
||
|
LEAF_END
|
||
|
|
||
|
;;;
|
||
|
;;; "public: static unsigned __int64 __cdecl Class_Microsoft_Singularity_Isal_Isa::g_GetCycleCount(void)"
|
||
|
;;;
|
||
|
LEAF_ENTRY ?g_GetCycleCount@Class_Microsoft_Singularity_Isal_Isa@@SA_KXZ
|
||
|
mrc p15, 0, r0, c9, c13, 0
|
||
|
mov r1, #0
|
||
|
|
||
|
; bkpt 0xffff
|
||
|
bx lr
|
||
|
LEAF_END
|
||
|
|
||
|
;;;
|
||
|
;;; "unsigned __int64 __cdecl RDTSC(void)"
|
||
|
;;;
|
||
|
LEAF_ENTRY ?RDTSC@@YA_KXZ
|
||
|
mrc p15, 0, r0, c9, c13, 0
|
||
|
mov r1, #0
|
||
|
|
||
|
; bkpt 0xffff
|
||
|
bx lr
|
||
|
LEAF_END
|
||
|
|
||
|
END
|