From 29aaea21eaec5691050aac5ca7de22bb5b2e9c84 Mon Sep 17 00:00:00 2001 From: Jo Van Bulck Date: Sat, 2 Sep 2023 13:05:17 +0200 Subject: [PATCH] app/apic-ipi: Add APIC IPI precision microbenchmark experiments As described in Appendix A of the AEX-Notify paper. --- app/apic-ipi/.gitignore | 5 + app/apic-ipi/Makefile | 98 +++++++++++++++++ app/apic-ipi/README.md | 19 ++++ app/apic-ipi/apic-ipi-hist.png | Bin 0 -> 46529 bytes app/apic-ipi/apic-ipi-inst-hist.png | Bin 0 -> 53581 bytes app/apic-ipi/asm.S | 31 ++++++ app/apic-ipi/main.c | 165 ++++++++++++++++++++++++++++ app/apic-ipi/parse.py | 125 +++++++++++++++++++++ app/apic/README.md | 8 +- 9 files changed, 448 insertions(+), 3 deletions(-) create mode 100644 app/apic-ipi/.gitignore create mode 100644 app/apic-ipi/Makefile create mode 100644 app/apic-ipi/README.md create mode 100644 app/apic-ipi/apic-ipi-hist.png create mode 100644 app/apic-ipi/apic-ipi-inst-hist.png create mode 100644 app/apic-ipi/asm.S create mode 100644 app/apic-ipi/main.c create mode 100755 app/apic-ipi/parse.py diff --git a/app/apic-ipi/.gitignore b/app/apic-ipi/.gitignore new file mode 100644 index 0000000..01c706d --- /dev/null +++ b/app/apic-ipi/.gitignore @@ -0,0 +1,5 @@ +*.txt +*.pdf +log +*.csv +copy_icx.sh diff --git a/app/apic-ipi/Makefile b/app/apic-ipi/Makefile new file mode 100644 index 0000000..06394f7 --- /dev/null +++ b/app/apic-ipi/Makefile @@ -0,0 +1,98 @@ +LIBSGXSTEP_DIR = ../.. +LIBSGXSTEP = $(LIBSGXSTEP_DIR)/libsgxstep +-include $(LIBSGXSTEP)/Makefile.config + +LIBSGXSTEP_SILENT = 1 + +ifeq ($(SGX_SDK),) + SGX_SDK = /opt/intel/sgxsdk +endif +export SGX_SDK +ifneq ($(SGX_SDK), /opt/intel/sgxsdk) + URTS_LD_LIBRARY_PATH = LD_LIBRARY_PATH=$(LIBSGXSTEP_DIR)/linux-sgx/psw/urts/linux +endif + +SUBDIRS = $(LIBSGXSTEP) + +CC = gcc +AS = gcc +LD = gcc + +ifeq ($(M32), 1) + ASFLAGS = -m32 -DM32=$(M32) + CFLAGS = -m32 -DM32=$(M32) + LDFLAGS = -m32 +else + LIB_SUFX = 64 +endif + +CFLAGS += -fPIC -fno-stack-protector -fno-builtin -fno-jump-tables \ + -fno-common -Wno-attributes -g -D_GNU_SOURCE -O0 +INCLUDE = -I$(SGX_SDK)/include/ -I$(LIBSGXSTEP_DIR) +LDFLAGS += -lsgx-step -lsgx_urts \ + -lsgx_uae_service -pthread $(SUBDIRS:%=-L %) -L$(SGX_SDK)/lib$(LIB_SUFX)/ \ + -L$(LIBSGXSTEP_DIR)/linux-sgx/psw/urts/linux + +C_SOURCES = $(shell ls *.c) +ASM_SOURCES = $(shell ls *.S) +C_OBJECTS = $(C_SOURCES:.c=.o) +ASM_OBJECTS = $(ASM_SOURCES:.S=.o) +OBJECTS = $(C_OBJECTS) $(ASM_OBJECTS) +OUTPUT = app + +BUILDDIRS = $(SUBDIRS:%=build-%) +CLEANDIRS = $(SUBDIRS:%=clean-%) + +ATTACK = 1 +PARSE = nop +ifeq ($(STRLEN), 1) + ATTACK = 2 + PARSE = strlen +endif +ifeq ($(ZIGZAG), 1) + ATTACK = 3 + PARSE = zz +endif + +ifeq ($(NUM),) + NUM = 100 +endif +export NUM + +CFLAGS += -DATTACK_SCENARIO=$(ATTACK) -DNUM_RUNS=$(NUM) + +MAKEFLAGS += --silent + +#.SILENT: +all: $(OUTPUT) + +run: clean all + sudo $(URTS_LD_LIBRARY_PATH) ./app > out.txt + cat out.txt + +parse: run + SGX_STEP_PLATFORM=$(SGX_STEP_PLATFORM) ./parse_$(PARSE).py $(NUM) + +$(OUTPUT): $(BUILDDIRS) $(OBJECTS) + echo "$(INDENT)[LD]" $(OBJECTS) $(LIBS) -o $(OUTPUT) + $(LD) $(OBJECTS) $(LDFLAGS) -o $(OUTPUT) + +%.o : %.c + echo "$(INDENT)[CC] " $< + $(CC) $(CFLAGS) $(INCLUDE) -c $< + +%.o : %.S + echo "$(INDENT)[AS] " $< + $(AS) $(ASFLAGS) $(INCLUDE) -c $< -o $@ + +clean: $(CLEANDIRS) + echo "$(INDENT)[RM]" $(OBJECTS) $(OUTPUT) + rm -f $(OBJECTS) $(OUTPUT) + +$(BUILDDIRS): + echo "$(INDENT)[===] $(@:build-%=%) [===]" + $(MAKE) -C $(@:build-%=%) INDENT+="$(INDENT_STEP)" M32=$(M32) curr-dir=$(curr-dir)/$(@:build-%=%) + +$(CLEANDIRS): + echo "$(INDENT)[===] $(@:clean-%=%) [===]" + $(MAKE) clean -C $(@:clean-%=%) INDENT+="$(INDENT_STEP)" curr-dir=$(curr-dir)/$(@:build-%=%) diff --git a/app/apic-ipi/README.md b/app/apic-ipi/README.md new file mode 100644 index 0000000..68f2330 --- /dev/null +++ b/app/apic-ipi/README.md @@ -0,0 +1,19 @@ +# APIC Precision Microbenchmarks + +This directory contains the experiments to determine the accuracy of inter-processor +interrupts (IPIs) sent through the local APIC, as described in Appendix A of the +[AEX-Notify paper](https://jovanbulck.github.io/files/usenix23-aexnotify.pdf). +See [../apic](../apic) for complementary microbenchmarks that assess +the accuracy of APIC timer interrupts. + +**Experimental setup.** IPIs are similarly sent and received via the local APIC +bus and can be triggered by merely writing to memory-mapped APIC registers. We +measure the elapsed cycles between triggering an IPI from a spy CPU and +execution of our custom interrupt handler on the victim CPU. In our setup, we +first synchronize spy and victim threads, before triggering the IPI in the spy +thread and executing a lengthy NOP instruction slide in the victim thread. + +![APIC timing distribution histogram](apic-ipi-hist.png) + +![APIC instruction distribution histogram](apic-ipi-inst-hist.png) + diff --git a/app/apic-ipi/apic-ipi-hist.png b/app/apic-ipi/apic-ipi-hist.png new file mode 100644 index 0000000000000000000000000000000000000000..24933c0ae39ae39730ec176d54b0c965bc8811df GIT binary patch literal 46529 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
u~R!xi?BlO*S!NGJi$27ZO=>WSC+Dl}))~?UD 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%0AcCwiWlGd2DeO=%`H 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 z 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

L+8892BrPJBsf=AFCqdICHG7=hjGj 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%0Dx0TbKE=dvHF|Z85Rdh}P8UKi6yLAFZ z)($l$tW(;xhD4AU{Zj9E?OeW&8?8%AlhtR=p1lC>>oE1>dEacK5O20wQzE&6c2$^Y zH6YCGdWVq(Q$^~>(Q5A@Iy`#zECw4BJ4)Yv2@v#=r>E-53d)ng+H5F1gQ}aM(gTdr zkWj0NL1i;UmK~SoZY)d<7NH+vWusvExLqp=NB{~JB&{khDYU)}p^yoN*<_}t>qG4l z`?-Dy``_0YG!blk=$M|~QON&jJy5yfJ5nGW^=aI9cLxwITs!pbTX#3na3BG?R872N zRty~jB8zUj2_^DK?0$Osu*BW+*MQ7Jfl6--H>Z&2?;*r0kQ?9B^AM)XPl#}GK8FT( zeWF(y;55lM>=Crv1?FFlV7_5Ugx`Pt3W?bL6%59o&mvGMCjnZN?=f|y(d=Mh$GsdJ z9C>+p6HzyEivgnCpFiKZigu3s#4rL?E`aMkv^*Lbnja8MLJM7OY;1DO-p;!yfH!3c zv$L~nYoXCag3MIX-X8qri&OywVVkfB0qg#wyOxrewq<17jlZf57EIF-neX$^WY|GP zRf_cW7fU&=DQ{Z4^1V^5`oynIW1!Uc4f8~h=kJe@k^fQo?Pa;McL3OTo}dW%;{^a3 z^3_;jVq!|S>u?koT?WT#*!qr*;1;JY*Pdz-gAs%{(q^rWp zu9Nr1b{Gh$?#NCapLFamDv`VB&4eq4iDYM=8Ppkq$U=;j5VH$cmnk4U0QBCDjb%aK zsN%%8P~D9bbQLI8PaZtj1dLEti&&=y4RFiK;)m$h)8)E~^tKL)ImBV$)7P3=*PN!l zo_k8o&#pEO=`Pu#jSq0fJtKp6v|y3Fv9S?+;)J%q8_UAw7ep&=|7!P#bwCf~?-3Do ze&)4UBT4%^S_!H>BO{)GXb>MEHD56^lSRvFcC<^)n+_cjJqSnvp|Y*g!@+!9RgZDM z1ax&-o>n7>F40{iTCPZSAdK(3y6Bw z-lK8tR@Pw$d9yQ6PjRghY~_=;Mrg1n2?(#1V?!n-e;^N09#C8eZwHA;9Y$=@sY4#J zn~4VDCJMR}5JHbN2*|PhQet!tC{ACj_2itgbH<85c8aK423AOw`O|>cu_o9#gi(BO z485?Zwpsk0g2@8UMZ+ziaUALE@Udg$SP}?EUJ0{&oSauiJM)Q$R^4iM?U$5dj8@67* zapN0=&Ju{40X2;fo$0V|V}LLP1Y`K+6_T2e#=$MFqKOM(K{9sM!qT!DpO3wi@~Y~d z7#JlXoi-<5LEnufP8VWL8LoPQpT8+!$2*%rZ!UFzRZwXH9p_ls&ogEqx(MwITrFNF zKQKI;&}k)6eJ|zNaiXcQ?#s*4R<&*PBKWrc>uCEUPn`iB<)S54cx8ToerC9(2%jM( zV^r8Agsg)yd*eq9L#Oj>hgJ!8>N&J(vaR~I09(v0EJU~I;+~Pj&jKJ@FY6>ZfYb$NOp{(G64 zgbwMu>}(T@?qxx0z-Ba=^$>3D+13wE-5Mdq&YJwJkJV7~%98=N5S2)uK6Lb`Bui4_ z?W6ZFnM5wQVQXuE1r~fZIWrTDbc8+@AXNsrVhacOt7XCb#)Cz*6mG~qtQiU0X$8+9 zcc&LrqkrNjXiSV@;@L5YXVo5QM%A_HCdz16y_wt>utPkLb175&Q~v6TPArRxg-Q5j zg79W(Ub?g&TYiI5*q!=C6+J7;PbQXp^R1j5+nLUi)1DOsx`9OFfw3o}8*t1|q~-`8 z-wWB7>^t}FbqAdTA8W{^EJ&V1ltB%qN268QRD7rovJCciF%pbASj>$ZH?;EXo&zAg zRZV!yy)(QLxrsoga90o=7s%7n)ndX{R{5bK&SjVcREr4286-4jiDhf&k*-2T;0Fkr zJjOL7YU-f&P|4e1svp|hwFH`o766#ab48^ySM3K^|;I+5;dy>_ia(mIG;v1{}7peYbDL>{0>?6W|hVB<=9i zchN#}PE*~y)U~=y55* zk4tj%t�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 C$+Wcq literal 0 HcmV?d00001 diff --git a/app/apic-ipi/asm.S b/app/apic-ipi/asm.S new file mode 100644 index 0000000..6781a01 --- /dev/null +++ b/app/apic-ipi/asm.S @@ -0,0 +1,31 @@ +#define APIC_ICR_LOW 0x300 +#define APIC_ICR_HIGH 0x310 + +.macro apic_write_icr + mov apic_base(%rip), %rax + movl %esi, APIC_ICR_HIGH(%rax) + /* SDM: The act of writing to the low doubleword of the ICR causes the IPI to be sent. */ + movl %edi, APIC_ICR_LOW(%rax) +.endm + + .text + .global apic_write_icr_ret +apic_write_icr_ret: + apic_write_icr + ret + + .global apic_write_icr_nop +apic_write_icr_nop: + apic_write_icr + + /* include a NOP slide to measure IPI self latency */ + .global apic_write_nop_slide_start +apic_write_nop_slide_start: + .rept 1000000 + nop + .endr + .global apic_write_nop_slide_end +apic_write_nop_slide_end: + nop + + retq diff --git a/app/apic-ipi/main.c b/app/apic-ipi/main.c new file mode 100644 index 0000000..ad93053 --- /dev/null +++ b/app/apic-ipi/main.c @@ -0,0 +1,165 @@ +#include +#include "libsgxstep/debug.h" +#include "libsgxstep/config.h" +#include "libsgxstep/spy.h" +#include "libsgxstep/sched.h" +#include "libsgxstep/pt.h" +#include "libsgxstep/apic.h" +#include "libsgxstep/idt.h" +#include +#include +#include + +#define SAMPLES 100000 +#define WARMUP_ROUNDS 1 +#define SELF_IPI 0 + +#define MY_VICTIM_CPU 1 +//#define MY_SPY_CPU 3 // no hyperthreading +#define MY_SPY_CPU 37 // hyperthreading + +#if SELF_IPI + #define DUMP_FILE "ipi-self.csv" +#else + #define DUMP_FILE "ipi-cross.csv" +#endif + +/* see asm.S */ +void apic_write_icr_ret(uint32_t icr_low, uint32_t icr_high); +void apic_write_icr_nop(uint32_t icr_low, uint32_t icr_high); +void apic_write_nop_slide_start(void); +void apic_write_nop_slide_end(void); + +unsigned long long test_tsc_results[SAMPLES] = {0}; +unsigned long long test_inc_results[SAMPLES] = {0}; + +/* ******************** SPY LOGIC ******************** */ +volatile int spy_ready = 0, victim_ready = 0, victim_stop = 0; +uint8_t apic_id_victim = 0; +int spurious_irq = 0; + +void spy_func(int eid) +{ + info_event("triggering IPIs from CPU %d (core %d) to CPU %d (core %d)", + get_cpu(), get_core_id(get_cpu()), MY_VICTIM_CPU, get_core_id(MY_VICTIM_CPU)); + + for (int i = -WARMUP_ROUNDS; i < SAMPLES; i++) + { + #if !SELF_IPI + while(!victim_ready); + spy_ready = 1; + #endif + + __ss_irq_fired = 0; + unsigned long long begin_time = __rdtsc(); + + #if SELF_IPI + apic_write_icr_nop(APIC_ICR_VECTOR(IRQ_VECTOR) | + APIC_ICR_DELIVERY_FIXED | APIC_ICR_LEVEL_ASSERT | + APIC_ICR_DEST_SELF, 0x0); + + ASSERT( __ss_irq_fired ); + #else + apic_write_icr_ret(APIC_ICR_VECTOR(IRQ_VECTOR) | + APIC_ICR_DELIVERY_FIXED | APIC_ICR_LEVEL_ASSERT | + APIC_ICR_DEST_PHYSICAL, + (apic_id_victim << APIC_ID_SHIFT) & APIC_ICR_DEST_MASK); + + spy_ready = 0; + while( !__ss_irq_fired ); + #endif + + if (__ss_irq_rip < (uint64_t) apic_write_nop_slide_start || + __ss_irq_rip > (uint64_t) apic_write_nop_slide_end) + { + info("WARNING: spurious IRQ outside NOP slide at %p", __ss_irq_rip); + spurious_irq++; + i--; + continue; + } + + /* first warmup round always takes longer, so we discard the first measurement here */ + if (i < 0) continue; + + uint64_t offset = __ss_irq_rip - (uint64_t) apic_write_nop_slide_start; + test_inc_results[i] = offset; + test_tsc_results[i] = nemesis_tsc_aex - begin_time; + } + victim_stop = 1; +} + +/* ******************** VICTIM LOGIC ******************** */ + +#if !SELF_IPI +void victim_func(void) +{ + while (!victim_stop) + { + victim_ready = 1; + while (!spy_ready); + victim_ready = 0; + + apic_write_nop_slide_start(); + } +} +#endif + +/* ================== ATTACKER INIT/SETUP ================= */ + +/* Configure and check attacker untrusted runtime environment. */ +void attacker_config_runtime(void) +{ + ASSERT( !claim_cpu(MY_VICTIM_CPU) ); + ASSERT( !prepare_system_for_benchmark(PSTATE_PCT) ); + print_system_settings(); + + if (isatty(fileno(stdout))) + { + info("WARNING: interactive terminal detected; known to cause "); + info("unstable timer intervals! Use stdout file redirection for "); + info("precise single-stepping results..."); + } +} + +/* ================== ATTACKER MAIN ================= */ + +int main(int argc, char **argv ) +{ + idt_t idt = {0}; + FILE *fd; + attacker_config_runtime(); + + info_event("installing IRQ handler"); + map_idt(&idt); + install_kernel_irq_handler(&idt, __ss_irq_handler, IRQ_VECTOR); + + info_event("mapping APIC"); + apic_id_victim = apic_id(); + info("victim CPU=%d with APIC_ID=%#x", get_cpu(), apic_id_victim); + +#if !SELF_IPI + info_event("setting up spy and victim threads"); + ASSERT( !claim_cpu(MY_VICTIM_CPU) ); + ASSERT( !restore_system_state()); + print_system_settings(); + + spawn_spy(MY_SPY_CPU, spy_func, 0); + info_event("spy created; calling victim.."); + victim_func(); +#else + spy_func(0); +#endif + + info_event("collected %d measurements; discarded %d spurious IRQs", SAMPLES, spurious_irq); + info("writing to '" DUMP_FILE "'"); + ASSERT( (fd = fopen(DUMP_FILE, "w")) ); + fprintf(fd, "tsc_diff,inc_count\n"); + for (int i = 0; i < SAMPLES; i++) + { + fprintf(fd, "%llu,%llu\n", test_tsc_results[i], test_inc_results[i]); + } + fclose(fd); + + info("all done; exiting"); + return 0; +} diff --git a/app/apic-ipi/parse.py b/app/apic-ipi/parse.py new file mode 100755 index 0000000..1dd8592 --- /dev/null +++ b/app/apic-ipi/parse.py @@ -0,0 +1,125 @@ +#!/usr/bin/python3 + +import numpy as np +import pandas as pd +import matplotlib.pyplot as plt +import matplotlib.font_manager as font_manager + +# SKL laptop: IPI self nops +LATENCY_MIN = 170 +LATENCY_MAX = 200 + +## SKL laptop: IPI self tsc +#LATENCY_MIN = 530 +#LATENCY_MAX = 580 +# +## ICX: IPI self tsc +#LATENCY_MIN = 520 +#LATENCY_MAX = 550 + +# SKL laptop: IPI cross no-HT nops +LATENCY_MIN = 270 +LATENCY_MAX = 400 + +# SKL laptop: IPI cross no-HT tsc +#LATENCY_MIN = 770 +#LATENCY_MAX = 820 + +# SKL laptop: IPI cross HT nops +#LATENCY_MIN = 230 +#LATENCY_MAX = 500 + +# SKL laptop: IPI cross HT tsc +LATENCY_MIN = 750 +LATENCY_MAX = 850 + + +pd.set_option('display.precision', 0) +np.set_printoptions(precision=0) + +def hist(latencies, labels=[], title='', filename='hist', bins=500, xlabel='Latency (cycles)'): + plt.figure(figsize=(10,5)) + + for i in range(0,len(labels)): + d = latencies[i] + labels[i] += f' (μ={int(np.mean(d))}, σ={int(np.std(d))})' #, M={int(np.median(d))})' + + plt.hist(latencies, + label=labels, + bins=bins, + histtype='stepfilled', + alpha=0.5, + range=[LATENCY_MIN, LATENCY_MAX]) + + #for x in latencies: + # plt.axvline(np.median(x), color='k', linestyle='dashed', linewidth=1) + + font = font_manager.FontProperties(family='monospace', size=10) #weight='bold', style='normal') + if len(labels) > 0: + plt.legend(prop=font) + + plt.xlabel(xlabel) + plt.ylabel('Frequency') + plt.title(title) + + print(f".. writing histogram '{title}' to '{filename}.pdf'") + plt.savefig(filename + '.pdf', bbox_inches='tight') + plt.show() + +def reject_outliers(data, m=2): + stdev = np.std(data) + mean = np.mean(data) + mask_min = mean - stdev * m + mask_max = mean + stdev * m + + outliers = [d for d in data if d < mask_min or d > mask_max ] + print(f'Warning: removing {len(outliers)} outliers:') + print(outliers) + + return [d for d in data if d >= mask_min and d <= mask_max ] + +def load_data(file, col): + print(f".. loading data from '{file}'") + #data = np.loadtxt(file, dtype=int, skiprows=1) + d = pd.read_csv(file) + data = d[col]#.astype(int) + #data = reject_outliers(data) + print('---------------------------------------------------------------------------') + s = pd.Series(data) + print(s.describe()) + print(f'med {int(np.median(data))}') + print('---------------------------------------------------------------------------') + return data + +#s0 = load_data('ipi-self.csv', col='inc_count') +#hist([s0], ['ipi-self'], 'APIC inter-processor interrupt CPU self NOP slide distribution') + +#s0 = load_data('ipi-self.csv', col='tsc_diff') +#hist([s0], ['ipi-self'], 'APIC inter-processor interrupt CPU self TSC distribution') + +#s0 = load_data('ipi-cross.csv', col='inc_count') +#hist([s0], ['ipi-cross-no-ht'], 'APIC inter-processor interrupt cross-CPU no-HT NOP slide distribution') + +#s0 = load_data('ipi-cross.csv', col='tsc_diff') +#hist([s0], ['ipi-cross-no-ht'], 'APIC inter-processor interrupt cross-CPU no-HT TSC distribution') + +#s0 = load_data('ipi-cross.csv', col='tsc_diff') +#hist([s0], ['ipi-cross-ht'], 'APIC inter-processor interrupt cross-CPU HyperThreading TSC distribution') + +#s0 = load_data('ipi-cross.csv', col='inc_count') +#hist([s0], ['ipi-cross-ht'], 'APIC inter-processor interrupt cross-CPU HyperThreading NOP slide distribution') + +LATENCY_MIN = 450 +LATENCY_MAX = 750 +s0 = load_data('logs/icx/ipi-ht.csv', col='inc_count') +s1 = load_data('logs/icx/ipi-no-ht.csv', col='inc_count') +hist([s0,s1], ['w/ HyperThreading', 'w/o HyperThreading'], bins=300, xlabel='NOP instructions executed before IRQ') + +## Appendix figure in paper +LATENCY_MIN = 900 +LATENCY_MAX = 2000 +s0 = load_data('logs/icx/ipi-ht.csv', col='tsc_diff') +s1 = load_data('logs/icx/ipi-no-ht.csv', col='tsc_diff') +hist([s0,s1], ['w/ HyperThreading', 'w/o HyperThreading']) + + diff --git a/app/apic/README.md b/app/apic/README.md index 7dddf6c..058d481 100644 --- a/app/apic/README.md +++ b/app/apic/README.md @@ -1,8 +1,10 @@ # APIC Precision Microbenchmarks -This directory contains the experiments to determine the accuracy of the local -APIC timer, as described in Appendix A of the [AEX-Notify -paper](https://jovanbulck.github.io/files/usenix23-aexnotify.pdf). +This directory contains the experiments to determine the accuracy of timer +interrupts sent through the local APIC, as described in Appendix A of the +[AEX-Notify paper](https://jovanbulck.github.io/files/usenix23-aexnotify.pdf). +See [../apic-ipi](../apic-ipi) for complementary microbenchmarks that assess +the accuracy of APIC inter-processor interrupts. The local APIC timer can be configured in one-shot or periodic mode to send an interrupt when an MMIO counter register reaches zero, or in TSC-deadline mode