buildroot/images/rootfs.cpio.uboot: ./buildroot/.config
buildroot/images/rootfs.cpio.uboot: rootfs-overlay/lib/firmware/jailhouse.bin rootfs-overlay/lib/modules/4.4.38+/modules.dep
buildroot/images/rootfs.cpio.uboot: $(shell find rootfs-overlay)
+buildroot/images/rootfs.cpio.uboot: rootfs-overlay/bin/prem-test
$(MAKE) -j1 -C buildroot ROOTFS_CPIO_COMPRESS_CMD="gzip --fast -c"
+rootfs-overlay/bin/prem-test: ../test/prem-test
+ cp $< $@
+
rootfs-overlay/lib/firmware/jailhouse.bin: ../jailhouse/hypervisor/jailhouse.bin
rootfs-overlay/lib/firmware/jailhouse.bin: $(wildcard ../jailhouse/configs/arm64/*.cell)
$(MAKE) -C ../jailhouse -j$(NPROC) install KDIR=$(CURDIR)/linux-4.4 ARCH=arm64 DESTDIR=$(CURDIR)/rootfs-overlay prefix=/usr
cp ../jailhouse/configs/arm64/jetson-tx2.cell rootfs-overlay/jailhouse/configs/
cp ../jailhouse/configs/arm64/jetson-tx2-demo.cell rootfs-overlay/jailhouse/configs/
+jailhouse: ../jailhouse/hypervisor/jailhouse.bin
+
../jailhouse/hypervisor/jailhouse.bin: ../jailhouse/include/jailhouse/config.h
../jailhouse/hypervisor/jailhouse.bin: linux-4.4/vmlinux
../jailhouse/hypervisor/jailhouse.bin: $(addprefix ../jailhouse/,$(shell cd ../jailhouse && git ls-files))
linux-4.4/vmlinux:
$(MAKE) -C $(@D) -j$(NPROC)
+.PHONY: FORCE
+
+../test/prem-test: FORCE
+ $(MAKE) -C ../test
+
clean:
rm buildroot/images/rootfs.cpio.uboot linux-4.4/vmlinux
+
+deploy: ../test/prem-test
+#deploy: ../jailhouse/hypervisor/jailhouse.bin
+ scp ../test/prem-test tx2:/bin
+# scp ../jailhouse/hypervisor/jailhouse.bin tx2:/lib/firmware
+# ssh tx2 'sh /etc/init.d/S20jailhouse.sh stop && sh /etc/init.d/S20jailhouse.sh start'
-#include <stdio.h>
-#include <stdint.h>
+/* Run this as: for i in $(seq 0 5); do prem-test $i & done */
+
#define _GNU_SOURCE /* See feature_test_macros(7) */
+#include <err.h>
+#include <sched.h>
+#include <stdint.h>
+#include <stdio.h>
+#include <stdlib.h>
#include <unistd.h>
-#include <sys/syscall.h> /* For SYS_xxx definitions */
#ifndef SYS_prem_guard_set
#define SYS_prem_guard_set 792
#endif
+enum prem_phase {
+ PREM_COMPATIBLE = 0,
+ PREM_MEMORY = 1,
+ PREM_COMPUTE = 2,
+};
-unsigned long prem_guard_set(unsigned long arg1,
- unsigned long arg2,
- unsigned long arg3)
+long prem_guard_set(enum prem_phase phase,
+ unsigned long memory_budget,
+ unsigned long timeout)
{
- return syscall(SYS_prem_guard_set, arg1, arg2, arg3);
+ return syscall(SYS_prem_guard_set, phase, memory_budget, timeout);
}
int main(int argc, char *argv[])
{
- printf("hvc result: %lu\n", prem_guard_set(11, 22, 33));
+ cpu_set_t set;
+ int cpu = 0;
+
+ if (argc > 1)
+ cpu = atoi(argv[1]);
+
+ /* Ensure that memory phase starts and ends on the same CPU */
+ CPU_ZERO(&set);
+ CPU_SET(cpu, &set);
+ if (sched_setaffinity(getpid(), sizeof(set), &set) < 0)
+ err(1, "sched_setaffinity");
+ printf("Pinned to CPU %d\n", cpu);
+
+ prem_guard_set(PREM_MEMORY, 22, 33);
+ for (int i = 0; i < 100; i++)
+ printf("Memory phase PID %d\n", getpid());
+ prem_guard_set(PREM_COMPATIBLE, 44, 55);
return 0;
}