RFC : Hyplets - User Space Interrupts for ARM

From: raz
Date: Fri Jun 08 2018 - 17:28:36 EST


We would like to present ARM hyplets. Hyplets are a novel way to code interrupt service routines under ARM.
Hyplets provide high performance, security, running time predictability ,an RPC mechanism and a possible solution for
the priority inversion problem. Hyplets uses special features of ARM hypervisor memory architecture.
We demonstrate Hyplets implementation in the C programming language on ARMv8 platform and under the Linux kernel.
We provide performance measurements, use cases and security scenarios.

Hyplets are based on the concept of a delicate separation within a running process. Instead of running multiple operating
systems kernels in order to segment and divide the system resources, the hyplet divides the Linux process into two execution
modes. One part of the process would execute in an isolated, non-interrupted privileged safe execution environment while other
parts of the process would execute in a regular user mode. However, both execution modes run in the same Application processors.

Background
ARMv8 has unique approach to privilege level that is crucial to the implementation of hyplets. The ARM platform normally has 4 exceptions (permission) levels:
EL0 refers to user space code. This is analogues to âring 3â in x86 platform.
EL1 refers to operating system code. This is analogues to âring 0â in x86Â platform.
EL2 refers to HYP mode. This is analogues to âring -1â or âreal modeâ on the x86 platform.
EL3 refers to TrustZone as a special security mode that can monitor the ARM processor and may run a security real time OS. There is no
direct analogues modes but related concepts in x86 are intelâs ME or SMM.

Each of the exception levels provides its own state of registers and can access the registers of the lower levels but not higher levels.
This architecture dictates that the translation tables of the different exception levels are distinct.
This means, that EL2 (hypervisor mode) may point to any memory translation table while the generic operating system,
running in EL1 uses another translation table. This way, we can map an executing process (program) or part of it to the hypervisor,
and we automatically gain access to the program address space, without any need to perform context switches or relocations.

The trivial approach of migrating code to kernel space to improve performance requires a high level of kernel programming skills.
Alternatively, if we try to access a user space code from the ISR, it would probably require a context
switch because there is no guarantee that the current process in the processor is the one with hyplet code. We needed to make sure
that the hyplet code is always accessible and this could be achieved only by disabling evacuation of the hyplet
code and data from the current translation table. So, we we chose to use TTBR0_EL2 ( the translation table register) to constantly hold the hyplet code. In order to map user space tasks we modified the Linux ARM-KVM mappings infrastructure to map a user space code in tandem with some kernel space data.

Restrictions
It is not possible to access any memory which is not mapped prematurely to the hypervisor. Also, it is not possible to perform
any system calls.

Some Figures
All benchmarks were conducted on a RASPBERRY PI 3.

Interrupt lantency
Hardware Interrupt Latency -> user hyplet: 2.5us
hyplet timer: Avg: <1us

A nother variant of the hyplet are hyplets RPCs (or in short HypRPC) are Remote Procedure calls that are executed
in hyplet context.

Scope of code change

The hyplet patch does not intervene with the hardcore of the kernel code nor require any modification to any hardware. The
modification are in the generic ISR routine, in sys_exit and introduces a new system called sys_hyplet. For this reason it easy to apply it as it does not change the operating system heuristics.

Evaluate

The Kernel code and the full paper are available at github at: https://git.scipio.org/raziebe/pi3-public.git

Installtation instructions:
1. Get a raspberry PI3.
2. Download & Install openSUSE-Leap42.2-ARM-E20-raspberrypi3.aarch64-2017.02.02-Build1.165.raw. This a 64 bit distro.
ÂÂ see http://ftp.yz.yamagata-u.ac.jp/pub/Linux/openSUSE/ports/aarch64/distribution/leap/42.2/appliances/

3. compile the kernel (aarch64) and install it on the PI.
4. compile the examples in arch/arm64/kvm/hyplet/tests/
ÂÂÂ see the compile shell script.
ÂÂÂ Start the "simple_hyplet" example. Use it as follows:
ÂÂÂ check /proc/interrupts for an irq that generates enough interrupts.
ÂÂÂ run: taskset <cpu id> simple_hyplet <irq number>
ÂÂÂÂÂÂÂÂ wait for 20 seconds. if some_global output a number bigger than zero then it worked.
ÂÂÂ ÂA typical output on the serial console looks like this:

linux:/opt/hyplet # ./simple_hyplet 2
Waiting [Â 284.158547] hyplet [3]:Â address 7f7e472000 already mapped
for irq [Â 284.158593] hyplet [3]:Â address 400820 already mapped
2 for 20 seconds
some global 75