mirror of
https://github.com/torvalds/linux.git
synced 2026-04-22 08:44:02 -04:00
Pull powerpc updates from Michael Ellerman: - Reduce alignment constraints on STRICT_KERNEL_RWX and speed-up TLB misses on 8xx and 603 - Replace kretprobe code with rethook and enable fprobe - Remove the "fast endian switch" syscall - Handle DLPAR device tree updates in kernel, allowing the deprecation of the binary /proc/powerpc/ofdt interface Thanks to Abhishek Dubey, Alex Shi, Benjamin Gray, Christophe Leroy, Gaosheng Cui, Gautam Menghani, Geert Uytterhoeven, Haren Myneni, Hari Bathini, Huang Xiaojia, Jinjie Ruan, Madhavan Srinivasan, Miguel Ojeda, Mina Almasry, Narayana Murty N, Naveen Rao, Rob Herring (Arm), Scott Cheloha, Segher Boessenkool, Stephen Rothwell, Thomas Zimmermann, Uwe Kleine-König, Vaibhav Jain, and Zhang Zekun. * tag 'powerpc-6.12-1' of git://git.kernel.org/pub/scm/linux/kernel/git/powerpc/linux: (59 commits) powerpc/atomic: Use YZ constraints for DS-form instructions MAINTAINERS: powerpc: Add Maddy powerpc: Switch back to struct platform_driver::remove() powerpc/pseries/eeh: Fix pseries_eeh_err_inject selftests/powerpc: Allow building without static libc macintosh/via-pmu: register_pmu_pm_ops() can be __init powerpc: Stop using no_llseek powerpc/64s: Remove the "fast endian switch" syscall powerpc/mm/64s: Restrict THP to Radix or HPT w/64K pages powerpc/mm/64s: Move THP reqs into a separate symbol powerpc/64s: Make mmu_hash_ops __ro_after_init powerpc: Replace kretprobe code with rethook on powerpc powerpc: pseries: Constify struct kobj_type powerpc: powernv: Constify struct kobj_type powerpc: Constify struct kobj_type powerpc/pseries/dlpar: Add device tree nodes for DLPAR IO add powerpc/pseries/dlpar: Remove device tree node for DLPAR IO remove powerpc/pseries: Use correct data types from pseries_hp_errorlog struct powerpc/vdso: Inconditionally use CFUNC macro powerpc/32: Implement validation of emergency stack ...
117 lines
2.7 KiB
ArmAsm
117 lines
2.7 KiB
ArmAsm
/* SPDX-License-Identifier: GPL-2.0-or-later */
|
|
/*
|
|
* Userland implementation of gettimeofday() for processes
|
|
* for use in the vDSO
|
|
*
|
|
* Copyright (C) 2004 Benjamin Herrenschmuidt (benh@kernel.crashing.org,
|
|
* IBM Corp.
|
|
*/
|
|
#include <asm/processor.h>
|
|
#include <asm/ppc_asm.h>
|
|
#include <asm/vdso.h>
|
|
#include <asm/vdso_datapage.h>
|
|
#include <asm/asm-offsets.h>
|
|
#include <asm/unistd.h>
|
|
|
|
/*
|
|
* The macro sets two stack frames, one for the caller and one for the callee
|
|
* because there are no requirement for the caller to set a stack frame when
|
|
* calling VDSO so it may have omitted to set one, especially on PPC64
|
|
*/
|
|
|
|
.macro cvdso_call funct call_time=0
|
|
.cfi_startproc
|
|
PPC_STLU r1, -PPC_MIN_STKFRM(r1)
|
|
.cfi_adjust_cfa_offset PPC_MIN_STKFRM
|
|
mflr r0
|
|
PPC_STLU r1, -PPC_MIN_STKFRM(r1)
|
|
.cfi_adjust_cfa_offset PPC_MIN_STKFRM
|
|
PPC_STL r0, PPC_MIN_STKFRM + PPC_LR_STKOFF(r1)
|
|
.cfi_rel_offset lr, PPC_MIN_STKFRM + PPC_LR_STKOFF
|
|
#ifdef __powerpc64__
|
|
PPC_STL r2, PPC_MIN_STKFRM + STK_GOT(r1)
|
|
.cfi_rel_offset r2, PPC_MIN_STKFRM + STK_GOT
|
|
#endif
|
|
get_datapage r5
|
|
.ifeq \call_time
|
|
addi r5, r5, VDSO_DATA_OFFSET
|
|
.else
|
|
addi r4, r5, VDSO_DATA_OFFSET
|
|
.endif
|
|
bl CFUNC(DOTSYM(\funct))
|
|
PPC_LL r0, PPC_MIN_STKFRM + PPC_LR_STKOFF(r1)
|
|
#ifdef __powerpc64__
|
|
PPC_LL r2, PPC_MIN_STKFRM + STK_GOT(r1)
|
|
.cfi_restore r2
|
|
#endif
|
|
.ifeq \call_time
|
|
cmpwi r3, 0
|
|
.endif
|
|
mtlr r0
|
|
addi r1, r1, 2 * PPC_MIN_STKFRM
|
|
.cfi_restore lr
|
|
.cfi_def_cfa_offset 0
|
|
crclr so
|
|
.ifeq \call_time
|
|
beqlr+
|
|
crset so
|
|
neg r3, r3
|
|
.endif
|
|
blr
|
|
.cfi_endproc
|
|
.endm
|
|
|
|
.text
|
|
/*
|
|
* Exact prototype of gettimeofday
|
|
*
|
|
* int __kernel_gettimeofday(struct timeval *tv, struct timezone *tz);
|
|
*
|
|
*/
|
|
V_FUNCTION_BEGIN(__kernel_gettimeofday)
|
|
cvdso_call __c_kernel_gettimeofday
|
|
V_FUNCTION_END(__kernel_gettimeofday)
|
|
|
|
/*
|
|
* Exact prototype of clock_gettime()
|
|
*
|
|
* int __kernel_clock_gettime(clockid_t clock_id, struct timespec *tp);
|
|
*
|
|
*/
|
|
V_FUNCTION_BEGIN(__kernel_clock_gettime)
|
|
cvdso_call __c_kernel_clock_gettime
|
|
V_FUNCTION_END(__kernel_clock_gettime)
|
|
|
|
/*
|
|
* Exact prototype of clock_gettime64()
|
|
*
|
|
* int __kernel_clock_gettime64(clockid_t clock_id, struct __timespec64 *ts);
|
|
*
|
|
*/
|
|
#ifndef __powerpc64__
|
|
V_FUNCTION_BEGIN(__kernel_clock_gettime64)
|
|
cvdso_call __c_kernel_clock_gettime64
|
|
V_FUNCTION_END(__kernel_clock_gettime64)
|
|
#endif
|
|
|
|
/*
|
|
* Exact prototype of clock_getres()
|
|
*
|
|
* int __kernel_clock_getres(clockid_t clock_id, struct timespec *res);
|
|
*
|
|
*/
|
|
V_FUNCTION_BEGIN(__kernel_clock_getres)
|
|
cvdso_call __c_kernel_clock_getres
|
|
V_FUNCTION_END(__kernel_clock_getres)
|
|
|
|
|
|
/*
|
|
* Exact prototype of time()
|
|
*
|
|
* time_t time(time *t);
|
|
*
|
|
*/
|
|
V_FUNCTION_BEGIN(__kernel_time)
|
|
cvdso_call __c_kernel_time call_time=1
|
|
V_FUNCTION_END(__kernel_time)
|