60 lines
		
	
	
		
			2.7 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
			
		
		
	
	
			60 lines
		
	
	
		
			2.7 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
KSelfTest arm64/signal/
 | 
						|
=======================
 | 
						|
 | 
						|
Signals Tests
 | 
						|
+++++++++++++
 | 
						|
 | 
						|
- Tests are built around a common main compilation unit: such shared main
 | 
						|
  enforces a standard sequence of operations needed to perform a single
 | 
						|
  signal-test (setup/trigger/run/result/cleanup)
 | 
						|
 | 
						|
- The above mentioned ops are configurable on a test-by-test basis: each test
 | 
						|
  is described (and configured) using the descriptor signals.h::struct tdescr
 | 
						|
 | 
						|
- Each signal testcase is compiled into its own executable: a separate
 | 
						|
  executable is used for each test since many tests complete successfully
 | 
						|
  by receiving some kind of fatal signal from the Kernel, so it's safer
 | 
						|
  to run each test unit in its own standalone process, so as to start each
 | 
						|
  test from a clean slate.
 | 
						|
 | 
						|
- New tests can be simply defined in testcases/ dir providing a proper struct
 | 
						|
  tdescr overriding all the defaults we wish to change (as of now providing a
 | 
						|
  custom run method is mandatory though)
 | 
						|
 | 
						|
- Signals' test-cases hereafter defined belong currently to two
 | 
						|
  principal families:
 | 
						|
 | 
						|
  - 'mangle_' tests: a real signal (SIGUSR1) is raised and used as a trigger
 | 
						|
    and then the test case code modifies the signal frame from inside the
 | 
						|
    signal handler itself.
 | 
						|
 | 
						|
  - 'fake_sigreturn_' tests: a brand new custom artificial sigframe structure
 | 
						|
    is placed on the stack and a sigreturn syscall is called to simulate a
 | 
						|
    real signal return. This kind of tests does not use a trigger usually and
 | 
						|
    they are just fired using some simple included assembly trampoline code.
 | 
						|
 | 
						|
 - Most of these tests are successfully passing if the process gets killed by
 | 
						|
   some fatal signal: usually SIGSEGV or SIGBUS. Since while writing this
 | 
						|
   kind of tests it is extremely easy in fact to end-up injecting other
 | 
						|
   unrelated SEGV bugs in the testcases, it becomes extremely tricky to
 | 
						|
   be really sure that the tests are really addressing what they are meant
 | 
						|
   to address and they are not instead falling apart due to unplanned bugs
 | 
						|
   in the test code.
 | 
						|
   In order to alleviate the misery of the life of such test-developer, a few
 | 
						|
   helpers are provided:
 | 
						|
 | 
						|
   - a couple of ASSERT_BAD/GOOD_CONTEXT() macros to easily parse a ucontext_t
 | 
						|
     and verify if it is indeed GOOD or BAD (depending on what we were
 | 
						|
     expecting), using the same logic/perspective as in the arm64 Kernel signals
 | 
						|
     routines.
 | 
						|
 | 
						|
   - a sanity mechanism to be used in 'fake_sigreturn_'-alike tests: enabled by
 | 
						|
     default it takes care to verify that the test-execution had at least
 | 
						|
     successfully progressed up to the stage of triggering the fake sigreturn
 | 
						|
     call.
 | 
						|
 | 
						|
  In both cases test results are expected in terms of:
 | 
						|
   - some fatal signal sent by the Kernel to the test process
 | 
						|
  or
 | 
						|
  - analyzing some final regs state
 |