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>
@@ -72,10 +73,62 @@ struct rt_sigframe_user_layout {
72
73
unsigned long end_offset ;
73
74
};
74
75
75
- #define BASE_SIGFRAME_SIZE round_up(sizeof(struct rt_sigframe), 16)
76
+ /*
77
+ * Holds any EL0-controlled state that influences unprivileged memory accesses.
78
+ * This includes both accesses done in userspace and uaccess done in the kernel.
79
+ *
80
+ * This state needs to be carefully managed to ensure that it doesn't cause
81
+ * uaccess to fail when setting up the signal frame, and the signal handler
82
+ * itself also expects a well-defined state when entered.
83
+ */
84
+ struct user_access_state {
85
+ u64 por_el0 ;
86
+ };
87
+
76
88
#define TERMINATOR_SIZE round_up(sizeof(struct _aarch64_ctx), 16)
77
89
#define EXTRA_CONTEXT_SIZE round_up(sizeof(struct extra_context), 16)
78
90
91
+ /*
92
+ * Save the user access state into ua_state and reset it to disable any
93
+ * restrictions.
94
+ */
95
+ static void save_reset_user_access_state (struct user_access_state * ua_state )
96
+ {
97
+ if (system_supports_poe ()) {
98
+ u64 por_enable_all = 0 ;
99
+
100
+ for (int pkey = 0 ; pkey < arch_max_pkey (); pkey ++ )
101
+ por_enable_all |= POE_RXW << (pkey * POR_BITS_PER_PKEY );
102
+
103
+ ua_state -> por_el0 = read_sysreg_s (SYS_POR_EL0 );
104
+ write_sysreg_s (por_enable_all , SYS_POR_EL0 );
105
+ /* Ensure that any subsequent uaccess observes the updated value */
106
+ isb ();
107
+ }
108
+ }
109
+
110
+ /*
111
+ * Set the user access state for invoking the signal handler.
112
+ *
113
+ * No uaccess should be done after that function is called.
114
+ */
115
+ static void set_handler_user_access_state (void )
116
+ {
117
+ if (system_supports_poe ())
118
+ write_sysreg_s (POR_EL0_INIT , SYS_POR_EL0 );
119
+ }
120
+
121
+ /*
122
+ * Restore the user access state to the values saved in ua_state.
123
+ *
124
+ * No uaccess should be done after that function is called.
125
+ */
126
+ static void restore_user_access_state (const struct user_access_state * ua_state )
127
+ {
128
+ if (system_supports_poe ())
129
+ write_sysreg_s (ua_state -> por_el0 , SYS_POR_EL0 );
130
+ }
131
+
79
132
static void init_user_layout (struct rt_sigframe_user_layout * user )
80
133
{
81
134
const size_t reserved_size =
@@ -269,18 +322,20 @@ static int restore_fpmr_context(struct user_ctxs *user)
269
322
return err ;
270
323
}
271
324
272
- static int preserve_poe_context (struct poe_context __user * ctx )
325
+ static int preserve_poe_context (struct poe_context __user * ctx ,
326
+ const struct user_access_state * ua_state )
273
327
{
274
328
int err = 0 ;
275
329
276
330
__put_user_error (POE_MAGIC , & ctx -> head .magic , err );
277
331
__put_user_error (sizeof (* ctx ), & ctx -> head .size , err );
278
- __put_user_error (read_sysreg_s ( SYS_POR_EL0 ) , & ctx -> por_el0 , err );
332
+ __put_user_error (ua_state -> por_el0 , & ctx -> por_el0 , err );
279
333
280
334
return err ;
281
335
}
282
336
283
- static int restore_poe_context (struct user_ctxs * user )
337
+ static int restore_poe_context (struct user_ctxs * user ,
338
+ struct user_access_state * ua_state )
284
339
{
285
340
u64 por_el0 ;
286
341
int err = 0 ;
@@ -290,7 +345,7 @@ static int restore_poe_context(struct user_ctxs *user)
290
345
291
346
__get_user_error (por_el0 , & (user -> poe -> por_el0 ), err );
292
347
if (!err )
293
- write_sysreg_s ( por_el0 , SYS_POR_EL0 ) ;
348
+ ua_state -> por_el0 = por_el0 ;
294
349
295
350
return err ;
296
351
}
@@ -946,7 +1001,8 @@ static int parse_user_sigframe(struct user_ctxs *user,
946
1001
}
947
1002
948
1003
static int restore_sigframe (struct pt_regs * regs ,
949
- struct rt_sigframe __user * sf )
1004
+ struct rt_sigframe __user * sf ,
1005
+ struct user_access_state * ua_state )
950
1006
{
951
1007
sigset_t set ;
952
1008
int i , err ;
@@ -998,7 +1054,7 @@ static int restore_sigframe(struct pt_regs *regs,
998
1054
err = restore_zt_context (& user );
999
1055
1000
1056
if (err == 0 && system_supports_poe () && user .poe )
1001
- err = restore_poe_context (& user );
1057
+ err = restore_poe_context (& user , ua_state );
1002
1058
1003
1059
return err ;
1004
1060
}
@@ -1059,6 +1115,7 @@ SYSCALL_DEFINE0(rt_sigreturn)
1059
1115
{
1060
1116
struct pt_regs * regs = current_pt_regs ();
1061
1117
struct rt_sigframe __user * frame ;
1118
+ struct user_access_state ua_state ;
1062
1119
1063
1120
/* Always make any pending restarted system calls return -EINTR */
1064
1121
current -> restart_block .fn = do_no_restart_syscall ;
@@ -1075,7 +1132,7 @@ SYSCALL_DEFINE0(rt_sigreturn)
1075
1132
if (!access_ok (frame , sizeof (* frame )))
1076
1133
goto badframe ;
1077
1134
1078
- if (restore_sigframe (regs , frame ))
1135
+ if (restore_sigframe (regs , frame , & ua_state ))
1079
1136
goto badframe ;
1080
1137
1081
1138
if (gcs_restore_signal ())
@@ -1084,6 +1141,8 @@ SYSCALL_DEFINE0(rt_sigreturn)
1084
1141
if (restore_altstack (& frame -> uc .uc_stack ))
1085
1142
goto badframe ;
1086
1143
1144
+ restore_user_access_state (& ua_state );
1145
+
1087
1146
return regs -> regs [0 ];
1088
1147
1089
1148
badframe :
@@ -1198,7 +1257,8 @@ static int setup_sigframe_layout(struct rt_sigframe_user_layout *user,
1198
1257
}
1199
1258
1200
1259
static int setup_sigframe (struct rt_sigframe_user_layout * user ,
1201
- struct pt_regs * regs , sigset_t * set )
1260
+ struct pt_regs * regs , sigset_t * set ,
1261
+ const struct user_access_state * ua_state )
1202
1262
{
1203
1263
int i , err = 0 ;
1204
1264
struct rt_sigframe __user * sf = user -> sigframe ;
@@ -1262,14 +1322,13 @@ static int setup_sigframe(struct rt_sigframe_user_layout *user,
1262
1322
err |= preserve_fpmr_context (fpmr_ctx );
1263
1323
}
1264
1324
1265
- if (system_supports_poe () && err == 0 && user -> poe_offset ) {
1325
+ if (system_supports_poe () && err == 0 ) {
1266
1326
struct poe_context __user * poe_ctx =
1267
1327
apply_user_offset (user , user -> poe_offset );
1268
1328
1269
- err |= preserve_poe_context (poe_ctx );
1329
+ err |= preserve_poe_context (poe_ctx , ua_state );
1270
1330
}
1271
1331
1272
-
1273
1332
/* ZA state if present */
1274
1333
if (system_supports_sme () && err == 0 && user -> za_offset ) {
1275
1334
struct za_context __user * za_ctx =
@@ -1447,9 +1506,6 @@ static int setup_return(struct pt_regs *regs, struct ksignal *ksig,
1447
1506
sme_smstop ();
1448
1507
}
1449
1508
1450
- if (system_supports_poe ())
1451
- write_sysreg_s (POR_EL0_INIT , SYS_POR_EL0 );
1452
-
1453
1509
if (ksig -> ka .sa .sa_flags & SA_RESTORER )
1454
1510
sigtramp = ksig -> ka .sa .sa_restorer ;
1455
1511
else
@@ -1465,20 +1521,22 @@ static int setup_rt_frame(int usig, struct ksignal *ksig, sigset_t *set,
1465
1521
{
1466
1522
struct rt_sigframe_user_layout user ;
1467
1523
struct rt_sigframe __user * frame ;
1524
+ struct user_access_state ua_state ;
1468
1525
int err = 0 ;
1469
1526
1470
1527
fpsimd_signal_preserve_current_state ();
1471
1528
1472
1529
if (get_sigframe (& user , ksig , regs ))
1473
1530
return 1 ;
1474
1531
1532
+ save_reset_user_access_state (& ua_state );
1475
1533
frame = user .sigframe ;
1476
1534
1477
1535
__put_user_error (0 , & frame -> uc .uc_flags , err );
1478
1536
__put_user_error (NULL , & frame -> uc .uc_link , err );
1479
1537
1480
1538
err |= __save_altstack (& frame -> uc .uc_stack , regs -> sp );
1481
- err |= setup_sigframe (& user , regs , set );
1539
+ err |= setup_sigframe (& user , regs , set , & ua_state );
1482
1540
if (err == 0 ) {
1483
1541
err = setup_return (regs , ksig , & user , usig );
1484
1542
if (ksig -> ka .sa .sa_flags & SA_SIGINFO ) {
@@ -1488,6 +1546,11 @@ static int setup_rt_frame(int usig, struct ksignal *ksig, sigset_t *set,
1488
1546
}
1489
1547
}
1490
1548
1549
+ if (err == 0 )
1550
+ set_handler_user_access_state ();
1551
+ else
1552
+ restore_user_access_state (& ua_state );
1553
+
1491
1554
return err ;
1492
1555
}
1493
1556
0 commit comments