|
@@ -134,8 +134,6 @@ static struct dso *__machine__addnew_vdso(struct machine *machine, const char *s
|
|
|
return dso;
|
|
|
}
|
|
|
|
|
|
-#if BITS_PER_LONG == 64
|
|
|
-
|
|
|
static enum dso_type machine__thread_dso_type(struct machine *machine,
|
|
|
struct thread *thread)
|
|
|
{
|
|
@@ -156,6 +154,8 @@ static enum dso_type machine__thread_dso_type(struct machine *machine,
|
|
|
return dso_type;
|
|
|
}
|
|
|
|
|
|
+#if BITS_PER_LONG == 64
|
|
|
+
|
|
|
static int vdso__do_copy_compat(FILE *f, int fd)
|
|
|
{
|
|
|
char buf[4096];
|
|
@@ -283,8 +283,38 @@ static int __machine__findnew_vdso_compat(struct machine *machine,
|
|
|
|
|
|
#endif
|
|
|
|
|
|
+static struct dso *machine__find_vdso(struct machine *machine,
|
|
|
+ struct thread *thread)
|
|
|
+{
|
|
|
+ struct dso *dso = NULL;
|
|
|
+ enum dso_type dso_type;
|
|
|
+
|
|
|
+ dso_type = machine__thread_dso_type(machine, thread);
|
|
|
+ switch (dso_type) {
|
|
|
+ case DSO__TYPE_32BIT:
|
|
|
+ dso = __dsos__find(&machine->dsos, DSO__NAME_VDSO32, true);
|
|
|
+ if (!dso) {
|
|
|
+ dso = __dsos__find(&machine->dsos, DSO__NAME_VDSO,
|
|
|
+ true);
|
|
|
+ if (dso && dso_type != dso__type(dso, machine))
|
|
|
+ dso = NULL;
|
|
|
+ }
|
|
|
+ break;
|
|
|
+ case DSO__TYPE_X32BIT:
|
|
|
+ dso = __dsos__find(&machine->dsos, DSO__NAME_VDSOX32, true);
|
|
|
+ break;
|
|
|
+ case DSO__TYPE_64BIT:
|
|
|
+ case DSO__TYPE_UNKNOWN:
|
|
|
+ default:
|
|
|
+ dso = __dsos__find(&machine->dsos, DSO__NAME_VDSO, true);
|
|
|
+ break;
|
|
|
+ }
|
|
|
+
|
|
|
+ return dso;
|
|
|
+}
|
|
|
+
|
|
|
struct dso *machine__findnew_vdso(struct machine *machine,
|
|
|
- struct thread *thread __maybe_unused)
|
|
|
+ struct thread *thread)
|
|
|
{
|
|
|
struct vdso_info *vdso_info;
|
|
|
struct dso *dso = NULL;
|
|
@@ -297,6 +327,10 @@ struct dso *machine__findnew_vdso(struct machine *machine,
|
|
|
if (!vdso_info)
|
|
|
goto out_unlock;
|
|
|
|
|
|
+ dso = machine__find_vdso(machine, thread);
|
|
|
+ if (dso)
|
|
|
+ goto out_unlock;
|
|
|
+
|
|
|
#if BITS_PER_LONG == 64
|
|
|
if (__machine__findnew_vdso_compat(machine, thread, vdso_info, &dso))
|
|
|
goto out_unlock;
|