1919#include <linux/ratelimit.h>
2020#include <linux/rseq.h>
2121#include <linux/syscalls.h>
22+ #include <linux/pkeys.h>
2223
2324#include <asm/daifflags.h>
2425#include <asm/debug-monitors.h>
@@ -72,10 +73,62 @@ struct rt_sigframe_user_layout {
7273 unsigned long end_offset ;
7374};
7475
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+
7688#define TERMINATOR_SIZE round_up(sizeof(struct _aarch64_ctx), 16)
7789#define EXTRA_CONTEXT_SIZE round_up(sizeof(struct extra_context), 16)
7890
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+
79132static void init_user_layout (struct rt_sigframe_user_layout * user )
80133{
81134 const size_t reserved_size =
@@ -269,18 +322,20 @@ static int restore_fpmr_context(struct user_ctxs *user)
269322 return err ;
270323}
271324
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 )
273327{
274328 int err = 0 ;
275329
276330 __put_user_error (POE_MAGIC , & ctx -> head .magic , err );
277331 __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 );
279333
280334 return err ;
281335}
282336
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 )
284339{
285340 u64 por_el0 ;
286341 int err = 0 ;
@@ -290,7 +345,7 @@ static int restore_poe_context(struct user_ctxs *user)
290345
291346 __get_user_error (por_el0 , & (user -> poe -> por_el0 ), err );
292347 if (!err )
293- write_sysreg_s ( por_el0 , SYS_POR_EL0 ) ;
348+ ua_state -> por_el0 = por_el0 ;
294349
295350 return err ;
296351}
@@ -946,7 +1001,8 @@ static int parse_user_sigframe(struct user_ctxs *user,
9461001}
9471002
9481003static 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 )
9501006{
9511007 sigset_t set ;
9521008 int i , err ;
@@ -998,7 +1054,7 @@ static int restore_sigframe(struct pt_regs *regs,
9981054 err = restore_zt_context (& user );
9991055
10001056 if (err == 0 && system_supports_poe () && user .poe )
1001- err = restore_poe_context (& user );
1057+ err = restore_poe_context (& user , ua_state );
10021058
10031059 return err ;
10041060}
@@ -1059,6 +1115,7 @@ SYSCALL_DEFINE0(rt_sigreturn)
10591115{
10601116 struct pt_regs * regs = current_pt_regs ();
10611117 struct rt_sigframe __user * frame ;
1118+ struct user_access_state ua_state ;
10621119
10631120 /* Always make any pending restarted system calls return -EINTR */
10641121 current -> restart_block .fn = do_no_restart_syscall ;
@@ -1075,7 +1132,7 @@ SYSCALL_DEFINE0(rt_sigreturn)
10751132 if (!access_ok (frame , sizeof (* frame )))
10761133 goto badframe ;
10771134
1078- if (restore_sigframe (regs , frame ))
1135+ if (restore_sigframe (regs , frame , & ua_state ))
10791136 goto badframe ;
10801137
10811138 if (gcs_restore_signal ())
@@ -1084,6 +1141,8 @@ SYSCALL_DEFINE0(rt_sigreturn)
10841141 if (restore_altstack (& frame -> uc .uc_stack ))
10851142 goto badframe ;
10861143
1144+ restore_user_access_state (& ua_state );
1145+
10871146 return regs -> regs [0 ];
10881147
10891148badframe :
@@ -1198,7 +1257,8 @@ static int setup_sigframe_layout(struct rt_sigframe_user_layout *user,
11981257}
11991258
12001259static 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 )
12021262{
12031263 int i , err = 0 ;
12041264 struct rt_sigframe __user * sf = user -> sigframe ;
@@ -1262,14 +1322,13 @@ static int setup_sigframe(struct rt_sigframe_user_layout *user,
12621322 err |= preserve_fpmr_context (fpmr_ctx );
12631323 }
12641324
1265- if (system_supports_poe () && err == 0 && user -> poe_offset ) {
1325+ if (system_supports_poe () && err == 0 ) {
12661326 struct poe_context __user * poe_ctx =
12671327 apply_user_offset (user , user -> poe_offset );
12681328
1269- err |= preserve_poe_context (poe_ctx );
1329+ err |= preserve_poe_context (poe_ctx , ua_state );
12701330 }
12711331
1272-
12731332 /* ZA state if present */
12741333 if (system_supports_sme () && err == 0 && user -> za_offset ) {
12751334 struct za_context __user * za_ctx =
@@ -1447,9 +1506,6 @@ static int setup_return(struct pt_regs *regs, struct ksignal *ksig,
14471506 sme_smstop ();
14481507 }
14491508
1450- if (system_supports_poe ())
1451- write_sysreg_s (POR_EL0_INIT , SYS_POR_EL0 );
1452-
14531509 if (ksig -> ka .sa .sa_flags & SA_RESTORER )
14541510 sigtramp = ksig -> ka .sa .sa_restorer ;
14551511 else
@@ -1465,20 +1521,22 @@ static int setup_rt_frame(int usig, struct ksignal *ksig, sigset_t *set,
14651521{
14661522 struct rt_sigframe_user_layout user ;
14671523 struct rt_sigframe __user * frame ;
1524+ struct user_access_state ua_state ;
14681525 int err = 0 ;
14691526
14701527 fpsimd_signal_preserve_current_state ();
14711528
14721529 if (get_sigframe (& user , ksig , regs ))
14731530 return 1 ;
14741531
1532+ save_reset_user_access_state (& ua_state );
14751533 frame = user .sigframe ;
14761534
14771535 __put_user_error (0 , & frame -> uc .uc_flags , err );
14781536 __put_user_error (NULL , & frame -> uc .uc_link , err );
14791537
14801538 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 );
14821540 if (err == 0 ) {
14831541 err = setup_return (regs , ksig , & user , usig );
14841542 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,
14881546 }
14891547 }
14901548
1549+ if (err == 0 )
1550+ set_handler_user_access_state ();
1551+ else
1552+ restore_user_access_state (& ua_state );
1553+
14911554 return err ;
14921555}
14931556
0 commit comments