Lines Matching defs:rseq_cs

40  *                     init(rseq_cs)
42 * [1] TLS->rseq::rseq_cs = rseq_cs
58 * 1. Userspace stores the address of the struct rseq_cs assembly
59 * block descriptor into the rseq_cs field of the registered
70 * clears TLS->__rseq_abi::rseq_cs, and sets the user-space return
152 static int rseq_get_rseq_cs(struct task_struct *t, struct rseq_cs *rseq_cs)
154 struct rseq_cs __user *urseq_cs;
161 if (get_user(ptr, &t->rseq->rseq_cs))
164 if (copy_from_user(&ptr, &t->rseq->rseq_cs, sizeof(ptr)))
168 memset(rseq_cs, 0, sizeof(*rseq_cs));
173 urseq_cs = (struct rseq_cs __user *)(unsigned long)ptr;
174 if (copy_from_user(rseq_cs, urseq_cs, sizeof(*rseq_cs)))
177 if (rseq_cs->start_ip >= TASK_SIZE ||
178 rseq_cs->start_ip + rseq_cs->post_commit_offset >= TASK_SIZE ||
179 rseq_cs->abort_ip >= TASK_SIZE ||
180 rseq_cs->version > 0)
183 if (rseq_cs->start_ip + rseq_cs->post_commit_offset < rseq_cs->start_ip)
186 if (rseq_cs->abort_ip - rseq_cs->start_ip < rseq_cs->post_commit_offset)
189 usig = (u32 __user *)(unsigned long)(rseq_cs->abort_ip - sizeof(u32));
223 if (rseq_warn_flags("rseq_cs", cs_flags))
249 * The rseq_cs field is set to NULL on preemption or signal
252 * a lazy clear of the rseq_cs field.
254 * Set rseq_cs to NULL.
257 return put_user(0UL, &t->rseq->rseq_cs);
259 if (clear_user(&t->rseq->rseq_cs, sizeof(t->rseq->rseq_cs)))
269 static bool in_rseq_cs(unsigned long ip, struct rseq_cs *rseq_cs)
271 return ip - rseq_cs->start_ip < rseq_cs->post_commit_offset;
278 struct rseq_cs rseq_cs;
281 ret = rseq_get_rseq_cs(t, &rseq_cs);
288 * Clear the rseq_cs pointer and return.
290 if (!in_rseq_cs(ip, &rseq_cs))
292 ret = rseq_need_restart(t, rseq_cs.flags);
298 trace_rseq_ip_fixup(ip, rseq_cs.start_ip, rseq_cs.post_commit_offset,
299 rseq_cs.abort_ip);
300 instruction_pointer_set(regs, (unsigned long)rseq_cs.abort_ip);
325 * fixup and leave rseq_cs as is so that rseq_sycall() will detect and
352 struct rseq_cs rseq_cs;
356 if (rseq_get_rseq_cs(t, &rseq_cs) || in_rseq_cs(ip, &rseq_cs))