program := process
kyrg-root := /sys/kernel/security/kyrg/
unixbench-root := /workspace/tmp/byte-unixbench/UnixBench/
ftrace—root := /sys/kernel/debug/tracing/
output := $(realpath ../output)

CFLAGS := -static

build: $(program)
test: test_function

test_function: build
	# FUNCTION TEST
	# 1. Add policy
	@echo "add $(realpath $(program)) 1" | cat > $(kyrg-root)/policy_processes
	@sleep 1

	# 2. Run test program and change its code
	@echo | ./$(program) &  # echo '\n' to trigger to change code
	@sleep 1  # wait for the test program changing to be done

	# 3. Trigger kryg: invoke kyrg check manually in case the check period is too long
	@echo 1 | cat > $(kyrg-root)/trigger
	@sleep 1 # wait for process validation to be done

	# 4. Check the result: the test program should be killed by kyrg

	# 5. Delet policy
	@echo "del $(realpath $(program))" | cat > $(kyrg-root)/policy_processes


# $(call load-processes,<count>)
define load-processes
	for i in $$(seq 1 $(1)) ; do ( echo n | ./$(program) > /dev/null & ) ; done
endef

define unload-processes
	pidof $(program) > /dev/null && kill -9 $$(pidof $(program)) || : 
endef


# $(call run-unixbench,<count>)
define run-unixbench
	# PERFORMANCE TEST BY UNIXBENCH
	@$(call load-processes,$(1))

	# Load kyrg
	@insmod ../kyrg.ko
	@echo "add $(realpath $(program)) 1" | cat > $(kyrg-root)/policy_processes
	@echo "2" | cat > $(kyrg-root)/status  # must disable event trigger method
	@echo "15" | cat > $(kyrg-root)/interval
	@sleep 1

	# UNIXBENCH
	@cd $(unixbench-root) && ./Run -i 1 -c 1 | tee $(output)/unixbench-kyrg-$(1).log

	# Unload kyrg
	@$(unload-processes)
	@rmmod kyrg
endef

test_unixbench: build
	# PERFORMANCE TEST BY UNIXBENCH

	# @$(call load-processes,40)

	# # Case 1: original
	# @ cd $(unixbench-root) && ./Run -i 1 -c 1 | tee $(output)/unixbench-original.log

	# # Case 2: with lkrg
	# @insmod ../lkrg.ko
	# @ cd $(unixbench-root) && ./Run -i 1 -c 1 | tee $(output)/unixbench-lkrg.log
	# @rmmod lkrg

	# @$(unload-processes)

	# Case 3: with kyrg
	$(call run-unixbench,0)
	$(call run-unixbench,40)
	$(call run-unixbench,80)


## measure submodules run time by ftrace
# all valiate entry: p_check_integrity()
# processes valiate entry: p_iterate_lkrg_tasks_paranoid()
# modules valiate entry: p_kmod_hash()
# syscalls-table valiate entry: rgsct_do_validate()
# interrupts-table valiate entry: rgidt_do_validate()
# kernel valiate : all - (proc+mod+syscall+int) 

ftrace_func := "p_check_integrity p_iterate_lkrg_tasks_paranoid p_kmod_hash rgsct_do_validate rgidt_do_validate"


# #(call run-ftrace,<count>)
define run-ftrace
	# PERFORMANCE TEST BY FTRACE
	@$(call load-processes,$(1))

	# Load kyrg
	@insmod ../kyrg.ko
	@echo "add $(realpath $(program)) 1" | cat > $(kyrg-root)/policy_processes
	@echo "2" | cat > $(kyrg-root)/status  # must disable event trigger method
	@echo "15" | cat > $(kyrg-root)/interval
	@sleep 1

	# Ftrace
	@echo 0 > $(ftrace—root)/tracing_on
	@echo function_graph > $(ftrace—root)/current_tracer
	@echo $(ftrace_func) > $(ftrace—root)/set_ftrace_filter
	@echo 0 > $(ftrace—root)/trace # clear message
	@echo 1 > $(ftrace—root)/tracing_on

	# Record for 1 minutes
	@sleep 60
	@cat /sys/kernel/tracing/trace > $(output)/kyrg-$(0)-$(1).log

	# Unload kyrg
	@$(unload-processes)
	@rmmod kyrg
endef

test_ftrace: build
	$(call run-ftrace,0)
	$(call run-ftrace,20)
	$(call run-ftrace,40)
	$(call run-ftrace,60)
	$(call run-ftrace,80)
	$(call run-ftrace,100)

clean:
	rm -f *.o $(program)
