aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorYifan Lu2016-10-09 13:28:59 -0700
committerYifan Lu2016-10-09 13:30:03 -0700
commit5ae0711de4b899b99685d7703b7f2fe9e6848341 (patch)
tree955bbb0d516187b9b153cd48fa1b1f13d9f74e08
parentAdded basic hook removal support (diff)
downloadsubstitute-5ae0711de4b899b99685d7703b7f2fe9e6848341.tar.gz
Getting the mirror address from Vita exec slab
-rwxr-xr-xlib/vita/slab.c13
-rwxr-xr-xlib/vita/slab.h1
2 files changed, 14 insertions, 0 deletions
diff --git a/lib/vita/slab.c b/lib/vita/slab.c
index 91742a6..0884e5f 100755
--- a/lib/vita/slab.c
+++ b/lib/vita/slab.c
@@ -298,6 +298,19 @@ void slab_free(struct slab_chain *const sch, const void *const addr)
}
}
+uintptr_t slab_getmirror(struct slab_chain *const sch, const void *const addr)
+{
+ assert(sch != NULL);
+ assert(slab_is_valid(sch));
+ assert(addr != NULL);
+
+ struct slab_header *const slab = (void *)
+ ((uintptr_t) addr & sch->alignment_mask);
+
+
+ return slab->exe_data + (ptrdiff_t)((char *) addr - (char *) slab);
+}
+
void slab_traverse(const struct slab_chain *const sch, void (*fn)(const void *))
{
assert(sch != NULL);
diff --git a/lib/vita/slab.h b/lib/vita/slab.h
index c8c5d9b..153c008 100755
--- a/lib/vita/slab.h
+++ b/lib/vita/slab.h
@@ -35,5 +35,6 @@ struct slab_chain {
void slab_init(struct slab_chain *, size_t, SceUID);
void *slab_alloc(struct slab_chain *, uintptr_t *);
void slab_free(struct slab_chain *, const void *);
+uintptr_t slab_getmirror(struct slab_chain *, const void *);
void slab_traverse(const struct slab_chain *, void (*)(const void *));
void slab_destroy(const struct slab_chain *);