67 lines
1.9 KiB
ArmAsm
67 lines
1.9 KiB
ArmAsm
|
// 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
|