hc
2024-05-10 23fa18eaa71266feff7ba8d83022d9e1cc83c65a
kernel/arch/powerpc/include/asm/kup.h
....@@ -2,39 +2,131 @@
22 #ifndef _ASM_POWERPC_KUP_H_
33 #define _ASM_POWERPC_KUP_H_
44
5
-#ifndef __ASSEMBLY__
6
-
7
-#include <asm/pgtable.h>
5
+#define KUAP_READ 1
6
+#define KUAP_WRITE 2
7
+#define KUAP_READ_WRITE (KUAP_READ | KUAP_WRITE)
8
+/*
9
+ * For prevent_user_access() only.
10
+ * Use the current saved situation instead of the to/from/size params.
11
+ * Used on book3s/32
12
+ */
13
+#define KUAP_CURRENT_READ 4
14
+#define KUAP_CURRENT_WRITE 8
15
+#define KUAP_CURRENT (KUAP_CURRENT_READ | KUAP_CURRENT_WRITE)
816
917 #ifdef CONFIG_PPC_BOOK3S_64
1018 #include <asm/book3s/64/kup-radix.h>
19
+#endif
20
+#ifdef CONFIG_PPC_8xx
21
+#include <asm/nohash/32/kup-8xx.h>
22
+#endif
23
+#ifdef CONFIG_PPC_BOOK3S_32
24
+#include <asm/book3s/32/kup.h>
25
+#endif
26
+
27
+#ifdef __ASSEMBLY__
28
+#ifndef CONFIG_PPC_KUAP
29
+.macro kuap_save_and_lock sp, thread, gpr1, gpr2, gpr3
30
+.endm
31
+
32
+.macro kuap_restore sp, current, gpr1, gpr2, gpr3
33
+.endm
34
+
35
+.macro kuap_check current, gpr
36
+.endm
37
+
38
+.macro kuap_check_amr gpr1, gpr2
39
+.endm
40
+
41
+#endif
42
+
43
+#else /* !__ASSEMBLY__ */
44
+
45
+#include <linux/pgtable.h>
46
+
47
+void setup_kup(void);
48
+
49
+#ifdef CONFIG_PPC_KUEP
50
+void setup_kuep(bool disabled);
1151 #else
52
+static inline void setup_kuep(bool disabled) { }
53
+#endif /* CONFIG_PPC_KUEP */
54
+
55
+#ifdef CONFIG_PPC_KUAP
56
+void setup_kuap(bool disabled);
57
+#else
58
+static inline void setup_kuap(bool disabled) { }
59
+
60
+static inline bool
61
+bad_kuap_fault(struct pt_regs *regs, unsigned long address, bool is_write)
62
+{
63
+ return false;
64
+}
65
+
66
+static inline void kuap_check_amr(void) { }
67
+
68
+/*
69
+ * book3s/64/kup-radix.h defines these functions for the !KUAP case to flush
70
+ * the L1D cache after user accesses. Only include the empty stubs for other
71
+ * platforms.
72
+ */
73
+#ifndef CONFIG_PPC_BOOK3S_64
1274 static inline void allow_user_access(void __user *to, const void __user *from,
13
- unsigned long size) { }
75
+ unsigned long size, unsigned long dir) { }
1476 static inline void prevent_user_access(void __user *to, const void __user *from,
15
- unsigned long size) { }
77
+ unsigned long size, unsigned long dir) { }
78
+static inline unsigned long prevent_user_access_return(void) { return 0UL; }
79
+static inline void restore_user_access(unsigned long flags) { }
1680 #endif /* CONFIG_PPC_BOOK3S_64 */
81
+#endif /* CONFIG_PPC_KUAP */
1782
1883 static inline void allow_read_from_user(const void __user *from, unsigned long size)
1984 {
20
- allow_user_access(NULL, from, size);
85
+ allow_user_access(NULL, from, size, KUAP_READ);
2186 }
2287
2388 static inline void allow_write_to_user(void __user *to, unsigned long size)
2489 {
25
- allow_user_access(to, NULL, size);
90
+ allow_user_access(to, NULL, size, KUAP_WRITE);
91
+}
92
+
93
+static inline void allow_read_write_user(void __user *to, const void __user *from,
94
+ unsigned long size)
95
+{
96
+ allow_user_access(to, from, size, KUAP_READ_WRITE);
2697 }
2798
2899 static inline void prevent_read_from_user(const void __user *from, unsigned long size)
29100 {
30
- prevent_user_access(NULL, from, size);
101
+ prevent_user_access(NULL, from, size, KUAP_READ);
31102 }
32103
33104 static inline void prevent_write_to_user(void __user *to, unsigned long size)
34105 {
35
- prevent_user_access(to, NULL, size);
106
+ prevent_user_access(to, NULL, size, KUAP_WRITE);
107
+}
108
+
109
+static inline void prevent_read_write_user(void __user *to, const void __user *from,
110
+ unsigned long size)
111
+{
112
+ prevent_user_access(to, from, size, KUAP_READ_WRITE);
113
+}
114
+
115
+static inline void prevent_current_access_user(void)
116
+{
117
+ prevent_user_access(NULL, NULL, ~0UL, KUAP_CURRENT);
118
+}
119
+
120
+static inline void prevent_current_read_from_user(void)
121
+{
122
+ prevent_user_access(NULL, NULL, ~0UL, KUAP_CURRENT_READ);
123
+}
124
+
125
+static inline void prevent_current_write_to_user(void)
126
+{
127
+ prevent_user_access(NULL, NULL, ~0UL, KUAP_CURRENT_WRITE);
36128 }
37129
38130 #endif /* !__ASSEMBLY__ */
39131
40
-#endif /* _ASM_POWERPC_KUP_H_ */
132
+#endif /* _ASM_POWERPC_KUAP_H_ */