powerpc/vdso32: implement clock_getres entirely
authorChristophe Leroy <christophe.leroy@c-s.fr>
Mon, 2 Dec 2019 07:57:33 +0000 (07:57 +0000)
committerMichael Ellerman <mpe@ellerman.id.au>
Thu, 23 Jan 2020 10:31:15 +0000 (21:31 +1100)
clock_getres returns hrtimer_res for all clocks but coarse ones
for which it returns KTIME_LOW_RES.

return EINVAL for unknown clocks.

Signed-off-by: Christophe Leroy <christophe.leroy@c-s.fr>
Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
Link: https://lore.kernel.org/r/37f94e47c91070b7606fb3ec3fe6fd2302a475a0.1575273217.git.christophe.leroy@c-s.fr
arch/powerpc/kernel/asm-offsets.c
arch/powerpc/kernel/vdso32/gettimeofday.S

index 0013197..90e53d4 100644 (file)
@@ -413,7 +413,10 @@ int main(void)
        DEFINE(CLOCK_MONOTONIC, CLOCK_MONOTONIC);
        DEFINE(CLOCK_REALTIME_COARSE, CLOCK_REALTIME_COARSE);
        DEFINE(CLOCK_MONOTONIC_COARSE, CLOCK_MONOTONIC_COARSE);
+       DEFINE(CLOCK_MAX, CLOCK_TAI);
        DEFINE(NSEC_PER_SEC, NSEC_PER_SEC);
+       DEFINE(EINVAL, EINVAL);
+       DEFINE(KTIME_LOW_RES, KTIME_LOW_RES);
 
 #ifdef CONFIG_BUG
        DEFINE(BUG_ENTRY_SIZE, sizeof(struct bug_entry));
index 9aaface..20ae38f 100644 (file)
@@ -196,17 +196,20 @@ V_FUNCTION_END(__kernel_clock_gettime)
 V_FUNCTION_BEGIN(__kernel_clock_getres)
   .cfi_startproc
        /* Check for supported clock IDs */
-       cmpwi   cr0,r3,CLOCK_REALTIME
-       cmpwi   cr1,r3,CLOCK_MONOTONIC
-       cror    cr0*4+eq,cr0*4+eq,cr1*4+eq
-       bne     cr0,99f
+       cmplwi  cr0, r3, CLOCK_MAX
+       cmpwi   cr1, r3, CLOCK_REALTIME_COARSE
+       cmpwi   cr7, r3, CLOCK_MONOTONIC_COARSE
+       bgt     cr0, 99f
+       LOAD_REG_IMMEDIATE(r5, KTIME_LOW_RES)
+       beq     cr1, 1f
+       beq     cr7, 1f
 
        mflr    r12
   .cfi_register lr,r12
        get_datapage    r3, r0
        lwz     r5, CLOCK_HRTIMER_RES(r3)
        mtlr    r12
-       li      r3,0
+1:     li      r3,0
        cmpli   cr0,r4,0
        crclr   cr0*4+so
        beqlr
@@ -215,11 +218,11 @@ V_FUNCTION_BEGIN(__kernel_clock_getres)
        blr
 
        /*
-        * syscall fallback
+        * invalid clock
         */
 99:
-       li      r0,__NR_clock_getres
-       sc
+       li      r3, EINVAL
+       crset   so
        blr
   .cfi_endproc
 V_FUNCTION_END(__kernel_clock_getres)