OSDN Git Service

sparc: Fix syscall fallback bugs in VDSO.
authorDavid S. Miller <davem@davemloft.net>
Thu, 18 Oct 2018 04:28:01 +0000 (21:28 -0700)
committerDavid S. Miller <davem@davemloft.net>
Thu, 18 Oct 2018 04:29:23 +0000 (21:29 -0700)
First, the trap number for 32-bit syscalls is 0x10.

Also, only negate the return value when syscall error is indicated by
the carry bit being set.

Signed-off-by: David S. Miller <davem@davemloft.net>
arch/sparc/vdso/vclock_gettime.c
tools/perf/util/event.c

index 3feb3d9..75dca9a 100644 (file)
 #define        TICK_PRIV_BIT   (1ULL << 63)
 #endif
 
+#ifdef CONFIG_SPARC64
 #define SYSCALL_STRING                                                 \
        "ta     0x6d;"                                                  \
-       "sub    %%g0, %%o0, %%o0;"                                      \
+       "bcs,a  1f;"                                                    \
+       " sub   %%g0, %%o0, %%o0;"                                      \
+       "1:"
+#else
+#define SYSCALL_STRING                                                 \
+       "ta     0x10;"                                                  \
+       "bcs,a  1f;"                                                    \
+       " sub   %%g0, %%o0, %%o0;"                                      \
+       "1:"
+#endif
 
 #define SYSCALL_CLOBBERS                                               \
        "f0", "f1", "f2", "f3", "f4", "f5", "f6", "f7",                 \
index 0cd4215..651cd6f 100644 (file)
@@ -1081,6 +1081,7 @@ void *cpu_map_data__alloc(struct cpu_map *map, size_t *size, u16 *type, int *max
        }
 
        *size += sizeof(struct cpu_map_data);
+       *size = PERF_ALIGN(*size, sizeof(u64));
        return zalloc(*size);
 }
 
@@ -1560,7 +1561,9 @@ struct map *thread__find_map(struct thread *thread, u8 cpumode, u64 addr,
 
                return NULL;
        }
+#if 0
 try_again:
+#endif
        al->map = map_groups__find(mg, al->addr);
        if (al->map == NULL) {
                /*
@@ -1572,6 +1575,7 @@ try_again:
                 * "[vdso]" dso, but for now lets use the old trick of looking
                 * in the whole kernel symbol list.
                 */
+#if 0
                if (cpumode == PERF_RECORD_MISC_USER && machine &&
                    mg != &machine->kmaps &&
                    machine__kernel_ip(machine, al->addr)) {
@@ -1579,6 +1583,7 @@ try_again:
                        load_map = true;
                        goto try_again;
                }
+#endif
        } else {
                /*
                 * Kernel maps might be changed when loading symbols so loading