Lines Matching refs:rseq_cs
152 static int rseq_get_rseq_cs(struct task_struct *t, struct rseq_cs *rseq_cs) in rseq_get_rseq_cs() argument
154 struct rseq_cs __user *urseq_cs; in rseq_get_rseq_cs()
161 if (get_user(ptr, &t->rseq->rseq_cs)) in rseq_get_rseq_cs()
164 if (copy_from_user(&ptr, &t->rseq->rseq_cs, sizeof(ptr))) in rseq_get_rseq_cs()
168 memset(rseq_cs, 0, sizeof(*rseq_cs)); in rseq_get_rseq_cs()
173 urseq_cs = (struct rseq_cs __user *)(unsigned long)ptr; in rseq_get_rseq_cs()
174 if (copy_from_user(rseq_cs, urseq_cs, sizeof(*rseq_cs))) in rseq_get_rseq_cs()
177 if (rseq_cs->start_ip >= TASK_SIZE || in rseq_get_rseq_cs()
178 rseq_cs->start_ip + rseq_cs->post_commit_offset >= TASK_SIZE || in rseq_get_rseq_cs()
179 rseq_cs->abort_ip >= TASK_SIZE || in rseq_get_rseq_cs()
180 rseq_cs->version > 0) in rseq_get_rseq_cs()
183 if (rseq_cs->start_ip + rseq_cs->post_commit_offset < rseq_cs->start_ip) in rseq_get_rseq_cs()
186 if (rseq_cs->abort_ip - rseq_cs->start_ip < rseq_cs->post_commit_offset) in rseq_get_rseq_cs()
189 usig = (u32 __user *)(unsigned long)(rseq_cs->abort_ip - sizeof(u32)); in rseq_get_rseq_cs()
257 return put_user(0UL, &t->rseq->rseq_cs); in clear_rseq_cs()
259 if (clear_user(&t->rseq->rseq_cs, sizeof(t->rseq->rseq_cs))) in clear_rseq_cs()
269 static bool in_rseq_cs(unsigned long ip, struct rseq_cs *rseq_cs) in in_rseq_cs() argument
271 return ip - rseq_cs->start_ip < rseq_cs->post_commit_offset; in in_rseq_cs()
278 struct rseq_cs rseq_cs; in rseq_ip_fixup() local
281 ret = rseq_get_rseq_cs(t, &rseq_cs); in rseq_ip_fixup()
290 if (!in_rseq_cs(ip, &rseq_cs)) in rseq_ip_fixup()
292 ret = rseq_need_restart(t, rseq_cs.flags); in rseq_ip_fixup()
298 trace_rseq_ip_fixup(ip, rseq_cs.start_ip, rseq_cs.post_commit_offset, in rseq_ip_fixup()
299 rseq_cs.abort_ip); in rseq_ip_fixup()
300 instruction_pointer_set(regs, (unsigned long)rseq_cs.abort_ip); in rseq_ip_fixup()
352 struct rseq_cs rseq_cs; in rseq_syscall() local
356 if (rseq_get_rseq_cs(t, &rseq_cs) || in_rseq_cs(ip, &rseq_cs)) in rseq_syscall()