mirror of
https://github.com/Motorhead1991/qemu.git
synced 2025-08-06 01:03:55 -06:00
linux-user/x86_64: Add vdso
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org> Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
This commit is contained in:
parent
a1367443ba
commit
6b1a9d38b5
6 changed files with 168 additions and 2 deletions
78
linux-user/x86_64/vdso.S
Normal file
78
linux-user/x86_64/vdso.S
Normal file
|
@ -0,0 +1,78 @@
|
|||
/*
|
||||
* x86-64 linux replacement vdso.
|
||||
*
|
||||
* Copyright 2023 Linaro, Ltd.
|
||||
*
|
||||
* SPDX-License-Identifier: GPL-2.0-or-later
|
||||
*/
|
||||
|
||||
#include <asm/unistd.h>
|
||||
|
||||
.macro endf name
|
||||
.globl \name
|
||||
.type \name, @function
|
||||
.size \name, . - \name
|
||||
.endm
|
||||
|
||||
.macro weakalias name
|
||||
\name = __vdso_\name
|
||||
.weak \name
|
||||
.endm
|
||||
|
||||
.macro vdso_syscall name, nr
|
||||
__vdso_\name:
|
||||
mov $\nr, %eax
|
||||
syscall
|
||||
ret
|
||||
endf __vdso_\name
|
||||
weakalias \name
|
||||
.endm
|
||||
|
||||
.cfi_startproc
|
||||
|
||||
vdso_syscall clock_gettime, __NR_clock_gettime
|
||||
vdso_syscall clock_getres, __NR_clock_getres
|
||||
vdso_syscall gettimeofday, __NR_gettimeofday
|
||||
vdso_syscall time, __NR_time
|
||||
|
||||
__vdso_getcpu:
|
||||
/*
|
||||
* There is no syscall number for this allocated on x64.
|
||||
* We can handle this several ways:
|
||||
*
|
||||
* (1) Invent a syscall number for use within qemu.
|
||||
* It should be easy enough to pick a number that
|
||||
* is well out of the way of the kernel numbers.
|
||||
*
|
||||
* (2) Force the emulated cpu to support the rdtscp insn,
|
||||
* and initialize the TSC_AUX value the appropriate value.
|
||||
*
|
||||
* (3) Pretend that we're always running on cpu 0.
|
||||
*
|
||||
* This last is the one that's implemented here, with the
|
||||
* tiny bit of extra code to support rdtscp in place.
|
||||
*/
|
||||
xor %ecx, %ecx /* rdtscp w/ tsc_aux = 0 */
|
||||
|
||||
/* if (cpu != NULL) *cpu = (ecx & 0xfff); */
|
||||
test %rdi, %rdi
|
||||
jz 1f
|
||||
mov %ecx, %eax
|
||||
and $0xfff, %eax
|
||||
mov %eax, (%rdi)
|
||||
|
||||
/* if (node != NULL) *node = (ecx >> 12); */
|
||||
1: test %rsi, %rsi
|
||||
jz 2f
|
||||
shr $12, %ecx
|
||||
mov %ecx, (%rsi)
|
||||
|
||||
2: xor %eax, %eax
|
||||
ret
|
||||
endf __vdso_getcpu
|
||||
|
||||
weakalias getcpu
|
||||
|
||||
.cfi_endproc
|
||||
|
||||
/* TODO: Add elf note for LINUX_VERSION_CODE */
|
Loading…
Add table
Add a link
Reference in a new issue