Commit c0c0546c authored by Christopher Covington's avatar Christopher Covington Committed by Pavel Emelyanov

kerndat: Introduce task_size variable

If we want one CRIU binary to work across all AArch64 kernel
configurations, a single task size value cannot be hard coded.
Signed-off-by: 's avatarChristopher Covington <cov@codeaurora.org>
Signed-off-by: 's avatarPavel Emelyanov <xemul@parallels.com>
parent f13ec96e
......@@ -66,6 +66,26 @@ typedef struct user_pt_regs user_regs_struct_t;
#define TASK_SIZE (1ULL << 39)
/*
* Range for task size calculated from the following Linux kernel files:
* arch/arm64/include/asm/memory.h
* arch/arm64/Kconfig
*/
#define TASK_SIZE_MIN (1UL << 39)
#define TASK_SIZE_MAX (1UL << 48)
int munmap(void *addr, size_t length);
static inline unsigned long task_size() {
unsigned long task_size;
for (task_size = TASK_SIZE_MIN; task_size < TASK_SIZE_MAX; task_size <<= 1)
if (munmap((void *)task_size, page_size()))
break;
return task_size;
}
#define AT_VECTOR_SIZE 40
typedef UserAarch64RegsEntry UserRegsEntry;
......
......@@ -98,6 +98,8 @@ struct user_vfp_exc {
#define TASK_SIZE 0xbf000000
static inline unsigned long task_size() { return TASK_SIZE; }
#define AT_VECTOR_SIZE 40
typedef UserArmRegsEntry UserRegsEntry;
......
......@@ -105,6 +105,8 @@ typedef uint64_t tls_t;
#define TASK_SIZE_USER64 (0x0000400000000000UL)
#define TASK_SIZE TASK_SIZE_USER64
static inline unsigned long task_size() { return TASK_SIZE; }
static inline void *decode_pointer(uint64_t v) { return (void*)v; }
static inline uint64_t encode_pointer(void *p) { return (uint64_t)p; }
......
......@@ -119,6 +119,8 @@ typedef struct {
# define TASK_SIZE (0xffffe000)
#endif
static inline unsigned long task_size() { return TASK_SIZE; }
typedef u64 auxv_t;
typedef u32 tls_t;
......
......@@ -23,6 +23,7 @@ struct kerndat_s {
bool has_dirty_track;
bool has_memfd;
bool has_fdinfo_lock;
unsigned long task_size;
};
extern struct kerndat_s kdat;
......
......@@ -273,6 +273,13 @@ static bool kerndat_has_memfd_create(void)
return 0;
}
static int get_task_size(void)
{
kdat.task_size = task_size();
pr_debug("Found task size of %lx\n", kdat.task_size);
return 0;
}
int kerndat_fdinfo_has_lock()
{
int fd, pfd = -1, exit_code = -1, len;
......@@ -323,6 +330,8 @@ int kerndat_init(void)
ret = get_last_cap();
if (!ret)
ret = kerndat_fdinfo_has_lock();
if (!ret)
ret = get_task_size();
kerndat_lsm();
......@@ -344,6 +353,8 @@ int kerndat_init_rst(void)
ret = get_last_cap();
if (!ret)
ret = kerndat_has_memfd_create();
if (!ret)
ret = get_task_size();
kerndat_lsm();
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment