2020-08-19 12:48:34 +01:00
/ / SPDX- L i c e n s e - I d e n t i f i e r : G P L - 2 . 0 - o n l y
/ / Copyright ( C ) 2 0 1 5 - 2 0 1 9 A R M L i m i t e d .
/ / Original a u t h o r : D a v e M a r t i n < D a v e . M a r t i n @arm.com>
/ /
/ / Simple S c a l a b l e V e c t o r E x t e n s i o n c o n t e x t s w i t c h t e s t
/ / Repeatedly w r i t e s u n i q u e t e s t p a t t e r n s i n t o e a c h S V E r e g i s t e r
/ / and r e a d s t h e m b a c k t o v e r i f y i n t e g r i t y .
/ /
/ / for x i n ` s e q 1 N R _ C P U S ` ; do sve-test & pids=$pids\ $! ; done
/ / ( leave i t r u n n i n g f o r a s l o n g a s y o u w a n t . . . )
/ / kill $ p i d s
# include < a s m / u n i s t d . h >
# include " a s s e m b l e r . h "
# include " a s m - o f f s e t s . h "
2022-04-19 12:22:40 +01:00
# include " s m e - i n s t . h "
2020-08-19 12:48:34 +01:00
# define N Z R 3 2
# define N P R 1 6
# define M A X V L _ B ( 2 0 4 8 / 8 )
.arch_extension sve
.macro _sve_ldr_v zt, x n
ldr z \ z t , [ x \ x n ]
.endm
.macro _sve_str_v zt, x n
str z \ z t , [ x \ x n ]
.endm
.macro _sve_ldr_p pt, x n
ldr p \ p t , [ x \ x n ]
.endm
.macro _sve_str_p pt, x n
str p \ p t , [ x \ x n ]
.endm
/ / Generate a c c e s s o r f u n c t i o n s t o r e a d / w r i t e p r o g r a m m a t i c a l l y s e l e c t e d
/ / SVE r e g i s t e r s .
/ / x0 i s t h e r e g i s t e r i n d e x t o a c c e s s
/ / x1 i s t h e m e m o r y a d d r e s s t o r e a d f r o m ( g e t z ,s e t p ) o r s t o r e t o ( s e t z ,s e t p )
/ / All c l o b b e r x0 - x2
define_ a c c e s s o r s e t z , N Z R , _ s v e _ l d r _ v
define_ a c c e s s o r g e t z , N Z R , _ s v e _ s t r _ v
define_ a c c e s s o r s e t p , N P R , _ s v e _ l d r _ p
define_ a c c e s s o r g e t p , N P R , _ s v e _ s t r _ p
/ / Declare s o m e s t o r a t e s p a c e t o s h a d o w t h e S V E r e g i s t e r c o n t e n t s :
.pushsection .text
.data
.align 4
zref :
.space MAXVL_B * NZR
pref :
.space MAXVL_B / 8 * NPR
ffrref :
.space MAXVL_B / 8
scratch :
.space MAXVL_B
.popsection
/ / Generate a t e s t p a t t e r n f o r s t o r a g e i n S V E r e g i s t e r s
/ / x0 : pid ( 1 6 b i t s )
/ / x1 : register n u m b e r ( 6 b i t s )
/ / x2 : generation ( 4 b i t s )
/ / These v a l u e s a r e u s e d t o c o n s t u c t a 3 2 - b i t p a t t e r n t h a t i s r e p e a t e d i n t h e
/ / scratch b u f f e r a s m a n y t i m e s a s w i l l f i t :
/ / bits 3 1 : 2 8 g e n e r a t i o n n u m b e r ( i n c r e m e n t s o n c e p e r t e s t _ l o o p )
/ / bits 2 7 : 2 2 3 2 - b i t l a n e i n d e x
/ / bits 2 1 : 1 6 r e g i s t e r n u m b e r
/ / bits 1 5 : 0 p i d
function p a t t e r n
orr w1 , w0 , w1 , l s l #16
orr w2 , w1 , w2 , l s l #28
ldr x0 , =scratch
mov w1 , #M A X V L _ B / 4
0 : str w2 , [ x0 ] , #4
add w2 , w2 , #( 1 < < 2 2 )
subs w1 , w1 , #1
bne 0 b
ret
endfunction
/ / Get t h e a d d r e s s o f s h a d o w d a t a f o r S V E Z - r e g i s t e r Z < x n >
.macro _adrz xd, x n , n r t m p
ldr \ x d , =zref
rdvl x \ n r t m p , #1
madd \ x d , x \ n r t m p , \ x n , \ x d
.endm
/ / Get t h e a d d r e s s o f s h a d o w d a t a f o r S V E P - r e g i s t e r P < x n - N Z R >
.macro _adrp xd, x n , n r t m p
ldr \ x d , =pref
rdvl x \ n r t m p , #1
lsr x \ n r t m p , x \ n r t m p , #3
sub \ x n , \ x n , #N Z R
madd \ x d , x \ n r t m p , \ x n , \ x d
.endm
/ / Set u p t e s t p a t t e r n i n a S V E Z - r e g i s t e r
/ / x0 : pid
/ / x1 : register n u m b e r
/ / x2 : generation
function s e t u p _ z r e g
mov x4 , x30
mov x6 , x1
bl p a t t e r n
_ adrz x0 , x6 , 2
mov x5 , x0
ldr x1 , =scratch
bl m e m c p y
mov x0 , x6
mov x1 , x5
bl s e t z
ret x4
endfunction
/ / Set u p t e s t p a t t e r n i n a S V E P - r e g i s t e r
/ / x0 : pid
/ / x1 : register n u m b e r
/ / x2 : generation
function s e t u p _ p r e g
mov x4 , x30
mov x6 , x1
bl p a t t e r n
_ adrp x0 , x6 , 2
mov x5 , x0
ldr x1 , =scratch
bl m e m c p y
mov x0 , x6
mov x1 , x5
bl s e t p
ret x4
endfunction
/ / Set u p t e s t p a t t e r n i n t h e F F R
/ / x0 : pid
/ / x2 : generation
kselftest/arm64: sve: Do not use non-canonical FFR register value
The "First Fault Register" (FFR) is an SVE register that mimics a
predicate register, but clears bits when a load or store fails to handle
an element of a vector. The supposed usage scenario is to initialise
this register (using SETFFR), then *read* it later on to learn about
elements that failed to load or store. Explicit writes to this register
using the WRFFR instruction are only supposed to *restore* values
previously read from the register (for context-switching only).
As the manual describes, this register holds only certain values, it:
"... contains a monotonic predicate value, in which starting from bit 0
there are zero or more 1 bits, followed only by 0 bits in any remaining
bit positions."
Any other value is UNPREDICTABLE and is not supposed to be "restored"
into the register.
The SVE test currently tries to write a signature pattern into the
register, which is *not* a canonical FFR value. Apparently the existing
setups treat UNPREDICTABLE as "read-as-written", but a new
implementation actually only stores canonical values. As a consequence,
the sve-test fails immediately when comparing the FFR value:
-----------
# ./sve-test
Vector length: 128 bits
PID: 207
Mismatch: PID=207, iteration=0, reg=48
Expected [cf00]
Got [0f00]
Aborted
-----------
Fix this by only populating the FFR with proper canonical values.
Effectively the requirement described above limits us to 17 unique
values over 16 bits worth of FFR, so we condense our signature down to 4
bits (2 bits from the PID, 2 bits from the generation) and generate the
canonical pattern from it. Any bits describing elements above the
minimum 128 bit are set to 0.
This aligns the FFR usage to the architecture and fixes the test on
microarchitectures implementing FFR in a more restricted way.
Signed-off-by: Andre Przywara <andre.przywara@arm.com>
Reviwed-by: Mark Brown <broonie@kernel.org>
Link: https://lore.kernel.org/r/20210319120128.29452-1-andre.przywara@arm.com
Signed-off-by: Will Deacon <will@kernel.org>
2021-03-19 12:01:28 +00:00
/ /
/ / We n e e d t o g e n e r a t e a c a n o n i c a l F F R v a l u e , w h i c h c o n s i s t s o f a n u m b e r o f
/ / low " 1 " b i t s , f o l l o w e d b y a n u m b e r o f z e r o s . T h i s g i v e s u s 1 7 u n i q u e v a l u e s
/ / per 1 6 b i t s o f F F R , s o w e c r e a t e a 4 b i t s i g n a t u r e o u t o f t h e P I D a n d
/ / generation, a n d u s e t h a t a s t h e i n i t i a l n u m b e r o f o n e s i n t h e p a t t e r n .
/ / We f i l l t h e u p p e r l a n e s o f F F R w i t h z e r o s .
2020-08-19 12:48:34 +01:00
/ / Beware : corrupts P 0 .
function s e t u p _ f f r
2022-04-19 12:22:40 +01:00
# ifndef S S V E
2020-08-19 12:48:34 +01:00
mov x4 , x30
kselftest/arm64: sve: Do not use non-canonical FFR register value
The "First Fault Register" (FFR) is an SVE register that mimics a
predicate register, but clears bits when a load or store fails to handle
an element of a vector. The supposed usage scenario is to initialise
this register (using SETFFR), then *read* it later on to learn about
elements that failed to load or store. Explicit writes to this register
using the WRFFR instruction are only supposed to *restore* values
previously read from the register (for context-switching only).
As the manual describes, this register holds only certain values, it:
"... contains a monotonic predicate value, in which starting from bit 0
there are zero or more 1 bits, followed only by 0 bits in any remaining
bit positions."
Any other value is UNPREDICTABLE and is not supposed to be "restored"
into the register.
The SVE test currently tries to write a signature pattern into the
register, which is *not* a canonical FFR value. Apparently the existing
setups treat UNPREDICTABLE as "read-as-written", but a new
implementation actually only stores canonical values. As a consequence,
the sve-test fails immediately when comparing the FFR value:
-----------
# ./sve-test
Vector length: 128 bits
PID: 207
Mismatch: PID=207, iteration=0, reg=48
Expected [cf00]
Got [0f00]
Aborted
-----------
Fix this by only populating the FFR with proper canonical values.
Effectively the requirement described above limits us to 17 unique
values over 16 bits worth of FFR, so we condense our signature down to 4
bits (2 bits from the PID, 2 bits from the generation) and generate the
canonical pattern from it. Any bits describing elements above the
minimum 128 bit are set to 0.
This aligns the FFR usage to the architecture and fixes the test on
microarchitectures implementing FFR in a more restricted way.
Signed-off-by: Andre Przywara <andre.przywara@arm.com>
Reviwed-by: Mark Brown <broonie@kernel.org>
Link: https://lore.kernel.org/r/20210319120128.29452-1-andre.przywara@arm.com
Signed-off-by: Will Deacon <will@kernel.org>
2021-03-19 12:01:28 +00:00
and w0 , w0 , #0x3
bfi w0 , w2 , #2 , #2
mov w1 , #1
lsl w1 , w1 , w0
sub w1 , w1 , #1
2020-08-19 12:48:34 +01:00
ldr x0 , =ffrref
kselftest/arm64: sve: Do not use non-canonical FFR register value
The "First Fault Register" (FFR) is an SVE register that mimics a
predicate register, but clears bits when a load or store fails to handle
an element of a vector. The supposed usage scenario is to initialise
this register (using SETFFR), then *read* it later on to learn about
elements that failed to load or store. Explicit writes to this register
using the WRFFR instruction are only supposed to *restore* values
previously read from the register (for context-switching only).
As the manual describes, this register holds only certain values, it:
"... contains a monotonic predicate value, in which starting from bit 0
there are zero or more 1 bits, followed only by 0 bits in any remaining
bit positions."
Any other value is UNPREDICTABLE and is not supposed to be "restored"
into the register.
The SVE test currently tries to write a signature pattern into the
register, which is *not* a canonical FFR value. Apparently the existing
setups treat UNPREDICTABLE as "read-as-written", but a new
implementation actually only stores canonical values. As a consequence,
the sve-test fails immediately when comparing the FFR value:
-----------
# ./sve-test
Vector length: 128 bits
PID: 207
Mismatch: PID=207, iteration=0, reg=48
Expected [cf00]
Got [0f00]
Aborted
-----------
Fix this by only populating the FFR with proper canonical values.
Effectively the requirement described above limits us to 17 unique
values over 16 bits worth of FFR, so we condense our signature down to 4
bits (2 bits from the PID, 2 bits from the generation) and generate the
canonical pattern from it. Any bits describing elements above the
minimum 128 bit are set to 0.
This aligns the FFR usage to the architecture and fixes the test on
microarchitectures implementing FFR in a more restricted way.
Signed-off-by: Andre Przywara <andre.przywara@arm.com>
Reviwed-by: Mark Brown <broonie@kernel.org>
Link: https://lore.kernel.org/r/20210319120128.29452-1-andre.przywara@arm.com
Signed-off-by: Will Deacon <will@kernel.org>
2021-03-19 12:01:28 +00:00
strh w1 , [ x0 ] , 2
rdvl x1 , #1
lsr x1 , x1 , #3
sub x1 , x1 , #2
bl m e m c l r
2020-08-19 12:48:34 +01:00
mov x0 , #0
ldr x1 , =ffrref
bl s e t p
wrffr p0 . b
ret x4
2022-04-19 12:22:40 +01:00
# else
ret
# endif
2020-08-19 12:48:34 +01:00
endfunction
/ / Trivial m e m o r y c o m p a r e : c o m p a r e x2 b y t e s s t a r t i n g a t a d d r e s s x0 w i t h
/ / bytes s t a r t i n g a t a d d r e s s x1 .
/ / Returns o n l y i f a l l b y t e s m a t c h ; otherwise, the program is aborted.
/ / Clobbers x0 - x5 .
function m e m c m p
cbz x2 , 2 f
stp x0 , x1 , [ s p , #- 0x20 ] !
str x2 , [ s p , #0x10 ]
mov x5 , #0
0 : ldrb w3 , [ x0 , x5 ]
ldrb w4 , [ x1 , x5 ]
add x5 , x5 , #1
cmp w3 , w4
b. n e 1 f
subs x2 , x2 , #1
b. n e 0 b
1 : ldr x2 , [ s p , #0x10 ]
ldp x0 , x1 , [ s p ] , #0x20
b. n e b a r f
2 : ret
endfunction
/ / Verify t h a t a S V E Z - r e g i s t e r m a t c h e s i t s s h a d o w i n m e m o r y , e l s e a b o r t
/ / x0 : reg n u m b e r
/ / Clobbers x0 - x7 .
function c h e c k _ z r e g
mov x3 , x30
_ adrz x5 , x0 , 6
mov x4 , x0
ldr x7 , =scratch
mov x0 , x7
mov x1 , x6
bl m e m f i l l _ a e
mov x0 , x4
mov x1 , x7
bl g e t z
mov x0 , x5
mov x1 , x7
mov x2 , x6
mov x30 , x3
b m e m c m p
endfunction
/ / Verify t h a t a S V E P - r e g i s t e r m a t c h e s i t s s h a d o w i n m e m o r y , e l s e a b o r t
/ / x0 : reg n u m b e r
/ / Clobbers x0 - x7 .
function c h e c k _ p r e g
mov x3 , x30
_ adrp x5 , x0 , 6
mov x4 , x0
ldr x7 , =scratch
mov x0 , x7
mov x1 , x6
bl m e m f i l l _ a e
mov x0 , x4
mov x1 , x7
bl g e t p
mov x0 , x5
mov x1 , x7
mov x2 , x6
mov x30 , x3
b m e m c m p
endfunction
/ / Verify t h a t t h e F F R m a t c h e s i t s s h a d o w i n m e m o r y , e l s e a b o r t
/ / Beware - - c o r r u p t s P 0 .
/ / Clobbers x0 - x5 .
function c h e c k _ f f r
2022-04-19 12:22:40 +01:00
# ifndef S S V E
2020-08-19 12:48:34 +01:00
mov x3 , x30
ldr x4 , =scratch
rdvl x5 , #1
lsr x5 , x5 , #3
mov x0 , x4
mov x1 , x5
bl m e m f i l l _ a e
rdffr p0 . b
mov x0 , #0
mov x1 , x4
bl g e t p
ldr x0 , =ffrref
mov x1 , x4
mov x2 , x5
mov x30 , x3
b m e m c m p
2022-04-19 12:22:40 +01:00
# else
ret
# endif
2020-08-19 12:48:34 +01:00
endfunction
/ / Any S V E r e g i s t e r m o d i f i e d h e r e c a n c a u s e c o r r u p t i o n i n t h e m a i n
/ / thread - - b u t * o n l y * t h e r e g i s t e r s m o d i f i e d h e r e .
function i r r i t a t o r _ h a n d l e r
/ / Increment t h e i r r i t a t i o n s i g n a l c o u n t ( x23 ) :
ldr x0 , [ x2 , #u c o n t e x t _ r e g s + 8 * 2 3 ]
add x0 , x0 , #1
str x0 , [ x2 , #u c o n t e x t _ r e g s + 8 * 2 3 ]
/ / Corrupt s o m e r a n d o m Z - r e g s
adr x0 , . t e x t + ( i r r i t a t o r _ h a n d l e r - . t e x t ) / 1 6 * 1 6
movi v0 . 8 b , #1
movi v9 . 1 6 b , #2
movi v31 . 8 b , #3
2022-04-19 12:22:40 +01:00
# ifndef S S V E
2020-08-19 12:48:34 +01:00
/ / And P 0
rdffr p0 . b
/ / And F F R
wrffr p15 . b
2022-04-19 12:22:40 +01:00
# endif
2020-08-19 12:48:34 +01:00
ret
endfunction
2022-08-29 16:44:50 +01:00
function t i c k l e _ h a n d l e r
/ / Increment t h e s i g n a l c o u n t ( x23 ) :
ldr x0 , [ x2 , #u c o n t e x t _ r e g s + 8 * 2 3 ]
add x0 , x0 , #1
str x0 , [ x2 , #u c o n t e x t _ r e g s + 8 * 2 3 ]
ret
endfunction
2020-08-19 12:48:34 +01:00
function t e r m i n a t e _ h a n d l e r
mov w21 , w0
mov x20 , x2
puts " T e r m i n a t e d b y s i g n a l "
mov w0 , w21
bl p u t d e c
puts " , n o e r r o r , i t e r a t i o n s = "
ldr x0 , [ x20 , #u c o n t e x t _ r e g s + 8 * 2 2 ]
bl p u t d e c
puts " , s i g n a l s = "
ldr x0 , [ x20 , #u c o n t e x t _ r e g s + 8 * 2 3 ]
bl p u t d e c n
mov x0 , #0
mov x8 , #_ _ N R _ e x i t
svc #0
endfunction
/ / w0 : signal n u m b e r
/ / x1 : sa_ a c t i o n
/ / w2 : sa_ f l a g s
/ / Clobbers x0 - x6 ,x8
function s e t s i g n a l
str x30 , [ s p , #- ( ( s a _ s z + 15 ) / 1 6 * 1 6 + 1 6 ) ] !
mov w4 , w0
mov x5 , x1
mov w6 , w2
add x0 , s p , #16
mov x1 , #s a _ s z
bl m e m c l r
mov w0 , w4
add x1 , s p , #16
str w6 , [ x1 , #s a _ f l a g s ]
str x5 , [ x1 , #s a _ h a n d l e r ]
mov x2 , #0
mov x3 , #s a _ m a s k _ s z
mov x8 , #_ _ N R _ r t _ s i g a c t i o n
svc #0
cbz w0 , 1 f
puts " s i g a c t i o n f a i l u r e \ n "
b . L a b o r t
1 : ldr x30 , [ s p ] , #( ( s a _ s z + 15 ) / 1 6 * 1 6 + 1 6 )
ret
endfunction
/ / Main p r o g r a m e n t r y p o i n t
.globl _start
function _ s t a r t
_start :
2022-09-06 23:00:56 +01:00
mov x23 , #0 / / I r r i t a t i o n s i g n a l c o u n t
mov w0 , #S I G I N T
adr x1 , t e r m i n a t e _ h a n d l e r
mov w2 , #S A _ S I G I N F O
bl s e t s i g n a l
mov w0 , #S I G T E R M
adr x1 , t e r m i n a t e _ h a n d l e r
mov w2 , #S A _ S I G I N F O
bl s e t s i g n a l
mov w0 , #S I G U S R 1
adr x1 , i r r i t a t o r _ h a n d l e r
mov w2 , #S A _ S I G I N F O
orr w2 , w2 , #S A _ N O D E F E R
bl s e t s i g n a l
mov w0 , #S I G U S R 2
adr x1 , t i c k l e _ h a n d l e r
mov w2 , #S A _ S I G I N F O
orr w2 , w2 , #S A _ N O D E F E R
bl s e t s i g n a l
2022-04-19 12:22:40 +01:00
# ifdef S S V E
puts " S t r e a m i n g m o d e "
smstart_ s m
# endif
2020-08-19 12:48:34 +01:00
/ / Sanity- c h e c k a n d r e p o r t t h e v e c t o r l e n g t h
rdvl x19 , #8
cmp x19 , #128
b. l o 1 f
cmp x19 , #2048
b. h i 1 f
tst x19 , #( 8 - 1 )
b. e q 2 f
1 : puts " B a d v e c t o r l e n g t h : "
mov x0 , x19
bl p u t d e c n
b . L a b o r t
2 : puts " V e c t o r l e n g t h : \ t "
mov x0 , x19
bl p u t d e c
puts " b i t s \ n "
/ / Obtain o u r P I D , t o e n s u r e t e s t p a t t e r n u n i q u e n e s s b e t w e e n p r o c e s s e s
mov x8 , #_ _ N R _ g e t p i d
svc #0
mov x20 , x0
puts " P I D : \ t "
mov x0 , x20
bl p u t d e c n
2022-04-19 12:22:40 +01:00
# ifdef S S V E
smstart_ s m / / s y s c a l l s w i l l h a v e e x i t e d s t r e a m i n g m o d e
# endif
2020-08-19 12:48:34 +01:00
mov x22 , #0 / / g e n e r a t i o n n u m b e r , i n c r e m e n t s p e r i t e r a t i o n
.Ltest_loop :
rdvl x0 , #8
cmp x0 , x19
b. n e v l _ b a r f
mov x21 , #0 / / S e t u p Z - r e g s & s h a d o w w i t h t e s t p a t t e r n
0 : mov x0 , x20
mov x1 , x21
and x2 , x22 , #0xf
bl s e t u p _ z r e g
add x21 , x21 , #1
cmp x21 , #N Z R
b. l o 0 b
mov x0 , x20 / / S e t u p F F R & s h a d o w w i t h t e s t p a t t e r n
mov x1 , #N Z R + N P R
and x2 , x22 , #0xf
bl s e t u p _ f f r
0 : mov x0 , x20 / / S e t u p P - r e g s & s h a d o w w i t h t e s t p a t t e r n
mov x1 , x21
and x2 , x22 , #0xf
bl s e t u p _ p r e g
add x21 , x21 , #1
cmp x21 , #N Z R + N P R
b. l o 0 b
/ / Can' t d o t h i s w h e n S V E s t a t e i s v o l a t i l e a c r o s s S V C :
/ / mov x8 , #_ _ N R _ s c h e d _ y i e l d / / E n c o u r a g e p r e e m p t i o n
/ / svc #0
mov x21 , #0
0 : mov x0 , x21
bl c h e c k _ z r e g
add x21 , x21 , #1
cmp x21 , #N Z R
b. l o 0 b
0 : mov x0 , x21
bl c h e c k _ p r e g
add x21 , x21 , #1
cmp x21 , #N Z R + N P R
b. l o 0 b
bl c h e c k _ f f r
add x22 , x22 , #1
b . L t e s t _ l o o p
.Labort :
mov x0 , #0
mov x1 , #S I G A B R T
mov x8 , #_ _ N R _ k i l l
svc #0
endfunction
function b a r f
/ / fpsimd. c a c i t i v t y l o g d u m p h a c k
/ / ldr w0 , =0xdeadc0de
/ / mov w8 , #_ _ N R _ e x i t
/ / svc #0
/ / end h a c k
mov x10 , x0 / / e x p e c t e d d a t a
mov x11 , x1 / / a c t u a l d a t a
mov x12 , x2 / / d a t a s i z e
2021-01-08 18:31:44 +00:00
puts " M i s m a t c h : P I D = "
2020-08-19 12:48:34 +01:00
mov x0 , x20
bl p u t d e c
puts " , i t e r a t i o n = "
mov x0 , x22
bl p u t d e c
puts " , r e g = "
mov x0 , x21
bl p u t d e c n
puts " \ t E x p e c t e d [ "
mov x0 , x10
mov x1 , x12
bl d u m p h e x
puts " ] \ n \ t G o t [ "
mov x0 , x11
mov x1 , x12
bl d u m p h e x
puts " ] \ n "
mov x8 , #_ _ N R _ g e t p i d
svc #0
/ / fpsimd. c a c i t i v t y l o g d u m p h a c k
/ / ldr w0 , =0xdeadc0de
/ / mov w8 , #_ _ N R _ e x i t
/ / svc #0
/ / ^ end o f h a c k
mov x1 , #S I G A B R T
mov x8 , #_ _ N R _ k i l l
svc #0
/ / mov x8 , #_ _ N R _ e x i t
/ / mov x1 , #1
/ / svc #0
endfunction
function v l _ b a r f
mov x10 , x0
puts " B a d a c t i v e V L : "
mov x0 , x10
bl p u t d e c n
mov x8 , #_ _ N R _ e x i t
mov x1 , #1
svc #0
endfunction