1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
|
// Copyright 2019 The gVisor Authors.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
// Restartable sequences critical sections.
// Loops continuously until aborted.
//
// void rseq_loop(struct rseq* r, struct rseq_cs* cs)
.text
.globl rseq_loop
.type rseq_loop, @function
rseq_loop:
jmp begin
// Abort block before the critical section.
// Abort signature is 4 nops for simplicity.
.byte 0x90, 0x90, 0x90, 0x90
.globl rseq_loop_early_abort
rseq_loop_early_abort:
ret
begin:
// r->rseq_cs = cs
movq %rsi, 8(%rdi)
// N.B. rseq_cs will be cleared by any preempt, even outside the critical
// section. Thus it must be set in or immediately before the critical section
// to ensure it is not cleared before the section begins.
.globl rseq_loop_start
rseq_loop_start:
jmp rseq_loop_start
// "Pre-commit": extra instructions inside the critical section. These are
// used as the abort point in TestAbortPreCommit, which is not valid.
.globl rseq_loop_pre_commit
rseq_loop_pre_commit:
// Extra abort signature + nop for TestAbortPostCommit.
.byte 0x90, 0x90, 0x90, 0x90
nop
// "Post-commit": never reached in this case.
.globl rseq_loop_post_commit
rseq_loop_post_commit:
// Abort signature is 4 nops for simplicity.
.byte 0x90, 0x90, 0x90, 0x90
.globl rseq_loop_abort
rseq_loop_abort:
ret
.size rseq_loop,.-rseq_loop
.section .note.GNU-stack,"",@progbits
|