|
@@ -677,10 +677,12 @@ int mprotect_pkey(void *ptr, size_t size, unsigned long orig_prot,
|
|
struct pkey_malloc_record {
|
|
struct pkey_malloc_record {
|
|
void *ptr;
|
|
void *ptr;
|
|
long size;
|
|
long size;
|
|
|
|
+ int prot;
|
|
};
|
|
};
|
|
struct pkey_malloc_record *pkey_malloc_records;
|
|
struct pkey_malloc_record *pkey_malloc_records;
|
|
|
|
+struct pkey_malloc_record *pkey_last_malloc_record;
|
|
long nr_pkey_malloc_records;
|
|
long nr_pkey_malloc_records;
|
|
-void record_pkey_malloc(void *ptr, long size)
|
|
|
|
|
|
+void record_pkey_malloc(void *ptr, long size, int prot)
|
|
{
|
|
{
|
|
long i;
|
|
long i;
|
|
struct pkey_malloc_record *rec = NULL;
|
|
struct pkey_malloc_record *rec = NULL;
|
|
@@ -712,6 +714,8 @@ void record_pkey_malloc(void *ptr, long size)
|
|
(int)(rec - pkey_malloc_records), rec, ptr, size);
|
|
(int)(rec - pkey_malloc_records), rec, ptr, size);
|
|
rec->ptr = ptr;
|
|
rec->ptr = ptr;
|
|
rec->size = size;
|
|
rec->size = size;
|
|
|
|
+ rec->prot = prot;
|
|
|
|
+ pkey_last_malloc_record = rec;
|
|
nr_pkey_malloc_records++;
|
|
nr_pkey_malloc_records++;
|
|
}
|
|
}
|
|
|
|
|
|
@@ -756,7 +760,7 @@ void *malloc_pkey_with_mprotect(long size, int prot, u16 pkey)
|
|
pkey_assert(ptr != (void *)-1);
|
|
pkey_assert(ptr != (void *)-1);
|
|
ret = mprotect_pkey((void *)ptr, PAGE_SIZE, prot, pkey);
|
|
ret = mprotect_pkey((void *)ptr, PAGE_SIZE, prot, pkey);
|
|
pkey_assert(!ret);
|
|
pkey_assert(!ret);
|
|
- record_pkey_malloc(ptr, size);
|
|
|
|
|
|
+ record_pkey_malloc(ptr, size, prot);
|
|
rdpkru();
|
|
rdpkru();
|
|
|
|
|
|
dprintf1("%s() for pkey %d @ %p\n", __func__, pkey, ptr);
|
|
dprintf1("%s() for pkey %d @ %p\n", __func__, pkey, ptr);
|
|
@@ -777,7 +781,7 @@ void *malloc_pkey_anon_huge(long size, int prot, u16 pkey)
|
|
size = ALIGN_UP(size, HPAGE_SIZE * 2);
|
|
size = ALIGN_UP(size, HPAGE_SIZE * 2);
|
|
ptr = mmap(NULL, size, PROT_NONE, MAP_ANONYMOUS|MAP_PRIVATE, -1, 0);
|
|
ptr = mmap(NULL, size, PROT_NONE, MAP_ANONYMOUS|MAP_PRIVATE, -1, 0);
|
|
pkey_assert(ptr != (void *)-1);
|
|
pkey_assert(ptr != (void *)-1);
|
|
- record_pkey_malloc(ptr, size);
|
|
|
|
|
|
+ record_pkey_malloc(ptr, size, prot);
|
|
mprotect_pkey(ptr, size, prot, pkey);
|
|
mprotect_pkey(ptr, size, prot, pkey);
|
|
|
|
|
|
dprintf1("unaligned ptr: %p\n", ptr);
|
|
dprintf1("unaligned ptr: %p\n", ptr);
|
|
@@ -850,7 +854,7 @@ void *malloc_pkey_hugetlb(long size, int prot, u16 pkey)
|
|
pkey_assert(ptr != (void *)-1);
|
|
pkey_assert(ptr != (void *)-1);
|
|
mprotect_pkey(ptr, size, prot, pkey);
|
|
mprotect_pkey(ptr, size, prot, pkey);
|
|
|
|
|
|
- record_pkey_malloc(ptr, size);
|
|
|
|
|
|
+ record_pkey_malloc(ptr, size, prot);
|
|
|
|
|
|
dprintf1("mmap()'d hugetlbfs for pkey %d @ %p\n", pkey, ptr);
|
|
dprintf1("mmap()'d hugetlbfs for pkey %d @ %p\n", pkey, ptr);
|
|
return ptr;
|
|
return ptr;
|
|
@@ -872,7 +876,7 @@ void *malloc_pkey_mmap_dax(long size, int prot, u16 pkey)
|
|
|
|
|
|
mprotect_pkey(ptr, size, prot, pkey);
|
|
mprotect_pkey(ptr, size, prot, pkey);
|
|
|
|
|
|
- record_pkey_malloc(ptr, size);
|
|
|
|
|
|
+ record_pkey_malloc(ptr, size, prot);
|
|
|
|
|
|
dprintf1("mmap()'d for pkey %d @ %p\n", pkey, ptr);
|
|
dprintf1("mmap()'d for pkey %d @ %p\n", pkey, ptr);
|
|
close(fd);
|
|
close(fd);
|