19
19
#include <linux/ratelimit.h>
20
20
#include <linux/rseq.h>
21
21
#include <linux/syscalls.h>
22
+ #include <linux/pkeys.h>
22
23
23
24
#include <asm/daifflags.h>
24
25
#include <asm/debug-monitors.h>
@@ -66,10 +67,63 @@ struct rt_sigframe_user_layout {
66
67
unsigned long end_offset ;
67
68
};
68
69
70
+ /*
71
+ * Holds any EL0-controlled state that influences unprivileged memory accesses.
72
+ * This includes both accesses done in userspace and uaccess done in the kernel.
73
+ *
74
+ * This state needs to be carefully managed to ensure that it doesn't cause
75
+ * uaccess to fail when setting up the signal frame, and the signal handler
76
+ * itself also expects a well-defined state when entered.
77
+ */
78
+ struct user_access_state {
79
+ u64 por_el0 ;
80
+ };
81
+
69
82
#define BASE_SIGFRAME_SIZE round_up(sizeof(struct rt_sigframe), 16)
70
83
#define TERMINATOR_SIZE round_up(sizeof(struct _aarch64_ctx), 16)
71
84
#define EXTRA_CONTEXT_SIZE round_up(sizeof(struct extra_context), 16)
72
85
86
+ /*
87
+ * Save the user access state into ua_state and reset it to disable any
88
+ * restrictions.
89
+ */
90
+ static void save_reset_user_access_state (struct user_access_state * ua_state )
91
+ {
92
+ if (system_supports_poe ()) {
93
+ u64 por_enable_all = 0 ;
94
+
95
+ for (int pkey = 0 ; pkey < arch_max_pkey (); pkey ++ )
96
+ por_enable_all |= POE_RXW << (pkey * POR_BITS_PER_PKEY );
97
+
98
+ ua_state -> por_el0 = read_sysreg_s (SYS_POR_EL0 );
99
+ write_sysreg_s (por_enable_all , SYS_POR_EL0 );
100
+ /* Ensure that any subsequent uaccess observes the updated value */
101
+ isb ();
102
+ }
103
+ }
104
+
105
+ /*
106
+ * Set the user access state for invoking the signal handler.
107
+ *
108
+ * No uaccess should be done after that function is called.
109
+ */
110
+ static void set_handler_user_access_state (void )
111
+ {
112
+ if (system_supports_poe ())
113
+ write_sysreg_s (POR_EL0_INIT , SYS_POR_EL0 );
114
+ }
115
+
116
+ /*
117
+ * Restore the user access state to the values saved in ua_state.
118
+ *
119
+ * No uaccess should be done after that function is called.
120
+ */
121
+ static void restore_user_access_state (const struct user_access_state * ua_state )
122
+ {
123
+ if (system_supports_poe ())
124
+ write_sysreg_s (ua_state -> por_el0 , SYS_POR_EL0 );
125
+ }
126
+
73
127
static void init_user_layout (struct rt_sigframe_user_layout * user )
74
128
{
75
129
const size_t reserved_size =
@@ -261,18 +315,20 @@ static int restore_fpmr_context(struct user_ctxs *user)
261
315
return err ;
262
316
}
263
317
264
- static int preserve_poe_context (struct poe_context __user * ctx )
318
+ static int preserve_poe_context (struct poe_context __user * ctx ,
319
+ const struct user_access_state * ua_state )
265
320
{
266
321
int err = 0 ;
267
322
268
323
__put_user_error (POE_MAGIC , & ctx -> head .magic , err );
269
324
__put_user_error (sizeof (* ctx ), & ctx -> head .size , err );
270
- __put_user_error (read_sysreg_s ( SYS_POR_EL0 ) , & ctx -> por_el0 , err );
325
+ __put_user_error (ua_state -> por_el0 , & ctx -> por_el0 , err );
271
326
272
327
return err ;
273
328
}
274
329
275
- static int restore_poe_context (struct user_ctxs * user )
330
+ static int restore_poe_context (struct user_ctxs * user ,
331
+ struct user_access_state * ua_state )
276
332
{
277
333
u64 por_el0 ;
278
334
int err = 0 ;
@@ -282,7 +338,7 @@ static int restore_poe_context(struct user_ctxs *user)
282
338
283
339
__get_user_error (por_el0 , & (user -> poe -> por_el0 ), err );
284
340
if (!err )
285
- write_sysreg_s ( por_el0 , SYS_POR_EL0 ) ;
341
+ ua_state -> por_el0 = por_el0 ;
286
342
287
343
return err ;
288
344
}
@@ -850,7 +906,8 @@ static int parse_user_sigframe(struct user_ctxs *user,
850
906
}
851
907
852
908
static int restore_sigframe (struct pt_regs * regs ,
853
- struct rt_sigframe __user * sf )
909
+ struct rt_sigframe __user * sf ,
910
+ struct user_access_state * ua_state )
854
911
{
855
912
sigset_t set ;
856
913
int i , err ;
@@ -899,7 +956,7 @@ static int restore_sigframe(struct pt_regs *regs,
899
956
err = restore_zt_context (& user );
900
957
901
958
if (err == 0 && system_supports_poe () && user .poe )
902
- err = restore_poe_context (& user );
959
+ err = restore_poe_context (& user , ua_state );
903
960
904
961
return err ;
905
962
}
@@ -908,6 +965,7 @@ SYSCALL_DEFINE0(rt_sigreturn)
908
965
{
909
966
struct pt_regs * regs = current_pt_regs ();
910
967
struct rt_sigframe __user * frame ;
968
+ struct user_access_state ua_state ;
911
969
912
970
/* Always make any pending restarted system calls return -EINTR */
913
971
current -> restart_block .fn = do_no_restart_syscall ;
@@ -924,12 +982,14 @@ SYSCALL_DEFINE0(rt_sigreturn)
924
982
if (!access_ok (frame , sizeof (* frame )))
925
983
goto badframe ;
926
984
927
- if (restore_sigframe (regs , frame ))
985
+ if (restore_sigframe (regs , frame , & ua_state ))
928
986
goto badframe ;
929
987
930
988
if (restore_altstack (& frame -> uc .uc_stack ))
931
989
goto badframe ;
932
990
991
+ restore_user_access_state (& ua_state );
992
+
933
993
return regs -> regs [0 ];
934
994
935
995
badframe :
@@ -1035,7 +1095,8 @@ static int setup_sigframe_layout(struct rt_sigframe_user_layout *user,
1035
1095
}
1036
1096
1037
1097
static int setup_sigframe (struct rt_sigframe_user_layout * user ,
1038
- struct pt_regs * regs , sigset_t * set )
1098
+ struct pt_regs * regs , sigset_t * set ,
1099
+ const struct user_access_state * ua_state )
1039
1100
{
1040
1101
int i , err = 0 ;
1041
1102
struct rt_sigframe __user * sf = user -> sigframe ;
@@ -1097,10 +1158,9 @@ static int setup_sigframe(struct rt_sigframe_user_layout *user,
1097
1158
struct poe_context __user * poe_ctx =
1098
1159
apply_user_offset (user , user -> poe_offset );
1099
1160
1100
- err |= preserve_poe_context (poe_ctx );
1161
+ err |= preserve_poe_context (poe_ctx , ua_state );
1101
1162
}
1102
1163
1103
-
1104
1164
/* ZA state if present */
1105
1165
if (system_supports_sme () && err == 0 && user -> za_offset ) {
1106
1166
struct za_context __user * za_ctx =
@@ -1237,9 +1297,6 @@ static void setup_return(struct pt_regs *regs, struct k_sigaction *ka,
1237
1297
sme_smstop ();
1238
1298
}
1239
1299
1240
- if (system_supports_poe ())
1241
- write_sysreg_s (POR_EL0_INIT , SYS_POR_EL0 );
1242
-
1243
1300
if (ka -> sa .sa_flags & SA_RESTORER )
1244
1301
sigtramp = ka -> sa .sa_restorer ;
1245
1302
else
@@ -1253,20 +1310,22 @@ static int setup_rt_frame(int usig, struct ksignal *ksig, sigset_t *set,
1253
1310
{
1254
1311
struct rt_sigframe_user_layout user ;
1255
1312
struct rt_sigframe __user * frame ;
1313
+ struct user_access_state ua_state ;
1256
1314
int err = 0 ;
1257
1315
1258
1316
fpsimd_signal_preserve_current_state ();
1259
1317
1260
1318
if (get_sigframe (& user , ksig , regs ))
1261
1319
return 1 ;
1262
1320
1321
+ save_reset_user_access_state (& ua_state );
1263
1322
frame = user .sigframe ;
1264
1323
1265
1324
__put_user_error (0 , & frame -> uc .uc_flags , err );
1266
1325
__put_user_error (NULL , & frame -> uc .uc_link , err );
1267
1326
1268
1327
err |= __save_altstack (& frame -> uc .uc_stack , regs -> sp );
1269
- err |= setup_sigframe (& user , regs , set );
1328
+ err |= setup_sigframe (& user , regs , set , & ua_state );
1270
1329
if (err == 0 ) {
1271
1330
setup_return (regs , & ksig -> ka , & user , usig );
1272
1331
if (ksig -> ka .sa .sa_flags & SA_SIGINFO ) {
@@ -1276,6 +1335,11 @@ static int setup_rt_frame(int usig, struct ksignal *ksig, sigset_t *set,
1276
1335
}
1277
1336
}
1278
1337
1338
+ if (err == 0 )
1339
+ set_handler_user_access_state ();
1340
+ else
1341
+ restore_user_access_state (& ua_state );
1342
+
1279
1343
return err ;
1280
1344
}
1281
1345
0 commit comments