소스 검색

sparc: Fix syscall fallback bugs in VDSO.

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>
David S. Miller 7 년 전
부모
커밋
776ca1543b
2개의 변경된 파일16개의 추가작업 그리고 1개의 파일을 삭제
  1. 11 1
      arch/sparc/vdso/vclock_gettime.c
  2. 5 0
      tools/perf/util/event.c

+ 11 - 1
arch/sparc/vdso/vclock_gettime.c

@@ -33,9 +33,19 @@
 #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",			\

+ 5 - 0
tools/perf/util/event.c

@@ -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