Lines Matching refs:rseq_cs
242 static int rseq_get_rseq_cs_ptr_val(struct rseq __user *rseq, u64 *rseq_cs) in rseq_get_rseq_cs_ptr_val() argument
244 if (!rseq_cs) in rseq_get_rseq_cs_ptr_val()
248 if (get_user(*rseq_cs, &rseq->rseq_cs)) in rseq_get_rseq_cs_ptr_val()
251 if (copy_from_user(rseq_cs, &rseq->rseq_cs, sizeof(*rseq_cs))) in rseq_get_rseq_cs_ptr_val()
262 static int rseq_get_rseq_cs(struct task_struct *t, struct rseq_cs *rseq_cs) in rseq_get_rseq_cs() argument
264 struct rseq_cs __user *urseq_cs; in rseq_get_rseq_cs()
276 memset(rseq_cs, 0, sizeof(*rseq_cs)); in rseq_get_rseq_cs()
282 urseq_cs = (struct rseq_cs __user *)(unsigned long)ptr; in rseq_get_rseq_cs()
283 if (copy_from_user(rseq_cs, urseq_cs, sizeof(*rseq_cs))) in rseq_get_rseq_cs()
286 if (rseq_cs->start_ip >= TASK_SIZE || in rseq_get_rseq_cs()
287 rseq_cs->start_ip + rseq_cs->post_commit_offset >= TASK_SIZE || in rseq_get_rseq_cs()
288 rseq_cs->abort_ip >= TASK_SIZE || in rseq_get_rseq_cs()
289 rseq_cs->version > 0) in rseq_get_rseq_cs()
292 if (rseq_cs->start_ip + rseq_cs->post_commit_offset < rseq_cs->start_ip) in rseq_get_rseq_cs()
295 if (rseq_cs->abort_ip - rseq_cs->start_ip < rseq_cs->post_commit_offset) in rseq_get_rseq_cs()
298 usig = (u32 __user *)(unsigned long)(rseq_cs->abort_ip - sizeof(u32)); in rseq_get_rseq_cs()
366 return put_user(0UL, &rseq->rseq_cs); in clear_rseq_cs()
368 if (clear_user(&rseq->rseq_cs, sizeof(rseq->rseq_cs))) in clear_rseq_cs()
378 static bool in_rseq_cs(unsigned long ip, struct rseq_cs *rseq_cs) in in_rseq_cs() argument
380 return ip - rseq_cs->start_ip < rseq_cs->post_commit_offset; in in_rseq_cs()
387 struct rseq_cs rseq_cs; in rseq_ip_fixup() local
390 ret = rseq_get_rseq_cs(t, &rseq_cs); in rseq_ip_fixup()
399 if (!in_rseq_cs(ip, &rseq_cs)) in rseq_ip_fixup()
401 ret = rseq_need_restart(t, rseq_cs.flags); in rseq_ip_fixup()
407 trace_rseq_ip_fixup(ip, rseq_cs.start_ip, rseq_cs.post_commit_offset, in rseq_ip_fixup()
408 rseq_cs.abort_ip); in rseq_ip_fixup()
409 instruction_pointer_set(regs, (unsigned long)rseq_cs.abort_ip); in rseq_ip_fixup()
461 struct rseq_cs rseq_cs; in rseq_syscall() local
465 if (rseq_get_rseq_cs(t, &rseq_cs) || in_rseq_cs(ip, &rseq_cs)) in rseq_syscall()
478 u64 rseq_cs; in SYSCALL_DEFINE4() local
541 if (rseq_get_rseq_cs_ptr_val(rseq, &rseq_cs)) in SYSCALL_DEFINE4()
543 if (rseq_cs && clear_rseq_cs(rseq)) in SYSCALL_DEFINE4()