]> rtime.felk.cvut.cz Git - hercules2020/nv-tegra/linux-4.4.git/blobdiff - arch/arm64/kernel/prem.c
Move our PREM-related system calls to a separate .c file
[hercules2020/nv-tegra/linux-4.4.git] / arch / arm64 / kernel / prem.c
diff --git a/arch/arm64/kernel/prem.c b/arch/arm64/kernel/prem.c
new file mode 100644 (file)
index 0000000..b0d1a3d
--- /dev/null
@@ -0,0 +1,72 @@
+#include <linux/syscalls.h>
+
+/* Added functions for PREM support */
+
+/*
+ * Disable IRQ syscall (__NR_prem_irq_disable)
+ */
+asmlinkage long sys_prem_irq_disable(void)
+{
+       /* We need to update userspace pstate that is going to be recovered.
+       * If we call any system call, the irq enabled on OS level */
+       struct pt_regs * regs = task_pt_regs(current);
+       regs->pstate |= (PSR_I_BIT | PSR_F_BIT);
+       return 0;
+}
+
+/*
+ * Enable IRQ syscall (__NR_prem_irq_enable)
+ */
+asmlinkage long sys_prem_irq_enable(void)
+{
+       struct pt_regs * regs = task_pt_regs(current);
+       regs->pstate &= ~(PSR_I_BIT | PSR_F_BIT);
+       return 0;
+}
+
+extern void __flush_dcache_all(void);
+
+/*
+ * Flush and invalidate entire cache (__NR_prem_flush)
+ */
+asmlinkage long sys_prem_flush(void)
+{
+       __flush_dcache_all();
+       return 0;
+}
+
+/* Invoke prem_guard_set hypercall implemented in Jailhouse hypervisor */
+asmlinkage long sys_premguard(unsigned long phase, unsigned long budget,
+                             unsigned long timeout)
+{
+       register uint64_t num_result asm("x0") = 9;
+       register uint64_t __arg1 asm("x1") = phase;
+       register uint64_t __arg2 asm("x2") = budget;
+       register uint64_t __arg3 asm("x3") = timeout;
+
+       asm volatile(
+               "hvc #0x4a48"
+               : "=r" (num_result)
+               : "r" (num_result), "r" (__arg1), "r" (__arg2),  "r" (__arg3)
+               : "memory");
+
+       return num_result;
+}
+
+/* Invoke prem_memguard_check hypercall implemented in Jailhouse hypervisor */
+asmlinkage long sys_memguard(unsigned long budget_time, unsigned long budget_memory,
+                            unsigned long flags)
+{
+       register uint64_t num_result asm("x0") = 10;
+       register uint64_t __arg1 asm("x1") = budget_time;
+       register uint64_t __arg2 asm("x2") = budget_memory;
+       register uint64_t __arg3 asm("x3") = flags;
+
+       asm volatile(
+               "hvc #0x4a48"
+               : "=r" (num_result)
+               : "r" (num_result), "r" (__arg1), "r" (__arg2),  "r" (__arg3)
+               : "memory");
+
+       return num_result;
+}