Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 776ca154 authored by David S. Miller's avatar David S. Miller
Browse files

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: default avatarDavid S. Miller <davem@davemloft.net>
parent c343db45
Loading
Loading
Loading
Loading
+11 −1
Original line number Diff line number Diff line
@@ -33,9 +33,19 @@
#define	TICK_PRIV_BIT	(1ULL << 63)
#endif

#ifdef	CONFIG_SPARC64
#define SYSCALL_STRING							\
	"ta	0x6d;"							\
	"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
Original line number Diff line number Diff line
@@ -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 @@ struct map *thread__find_map(struct thread *thread, u8 cpumode, u64 addr,
		 * "[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 @@ struct map *thread__find_map(struct thread *thread, u8 cpumode, u64 addr,
			load_map = true;
			goto try_again;
		}
#endif
	} else {
		/*
		 * Kernel maps might be changed when loading symbols so loading