]> rtime.felk.cvut.cz Git - hercules2020/nv-tegra/linux-4.4.git/blob - arch/arm64/kernel/prem.c
Fix memguard and related syscalls
[hercules2020/nv-tegra/linux-4.4.git] / arch / arm64 / kernel / prem.c
1 #include <linux/syscalls.h>
2
3 // /*
4 //  * Disable IRQ syscall (__NR_prem_irq_disable)
5 //  */
6 // asmlinkage long sys_prem_irq_disable(void)
7 // {
8 //      /* We need to update userspace pstate that is going to be recovered.
9 //      * If we call any system call, the irq enabled on OS level */
10 //      struct pt_regs * regs = task_pt_regs(current);
11 //      regs->pstate |= (PSR_I_BIT | PSR_F_BIT);
12 //      return 0;
13 // }
14 //
15 // /*
16 //  * Enable IRQ syscall (__NR_prem_irq_enable)
17 //  */
18 // asmlinkage long sys_prem_irq_enable(void)
19 // {
20 //      struct pt_regs * regs = task_pt_regs(current);
21 //      regs->pstate &= ~(PSR_I_BIT | PSR_F_BIT);
22 //      return 0;
23 // }
24
25 extern void __flush_dcache_all(void);
26
27 /*
28  * Flush and invalidate entire cache (__NR_prem_flush)
29  */
30 SYSCALL_DEFINE0(prem_flush)
31 {
32         __flush_dcache_all();
33         return 0;
34 }
35
36 /* Invoke prem_guard_set hypercall implemented in Jailhouse hypervisor */
37 SYSCALL_DEFINE3(premguard, unsigned long, phase, unsigned long, budget,
38                 unsigned long, timeout)
39 {
40         register uint64_t num_result asm("x0") = 9;
41         register uint64_t __arg1 asm("x1") = phase;
42         register uint64_t __arg2 asm("x2") = budget;
43         register uint64_t __arg3 asm("x3") = timeout;
44
45         asm volatile(
46                 "hvc #0x4a48"
47                 : "=r" (num_result)
48                 : "r" (num_result), "r" (__arg1), "r" (__arg2),  "r" (__arg3)
49                 : "memory");
50
51         return num_result;
52 }
53
54 /* Invoke memguard hypercall implemented in the Jailhouse hypervisor */
55 SYSCALL_DEFINE3(memguard, unsigned long, budget_time,
56                 unsigned long, budget_memory,
57                 unsigned long, flags)
58 {
59         register uint64_t num_result asm("x0") = 10;
60         register uint64_t __arg1 asm("x1") = budget_time;
61         register uint64_t __arg2 asm("x2") = budget_memory;
62         register uint64_t __arg3 asm("x3") = flags;
63
64         asm volatile(
65                 "hvc #0x4a48"
66                 : "=r" (num_result)
67                 : "r" (num_result), "r" (__arg1), "r" (__arg2),  "r" (__arg3)
68                 : "memory");
69
70         return num_result;
71 }