diff --git a/criu/arch/aarch64/crtools.c b/criu/arch/aarch64/crtools.c index f98743a23..b2ef1c312 100644 --- a/criu/arch/aarch64/crtools.c +++ b/criu/arch/aarch64/crtools.c @@ -21,6 +21,9 @@ #include "restorer.h" #include +unsigned __page_size = 0; +unsigned __page_shift = 0; + #define assign_reg(dst, src, e) dst->e = (__typeof__(dst->e))(src)->e int save_task_regs(void *x, user_regs_struct_t *regs, user_fpregs_struct_t *fpsimd) diff --git a/criu/arch/ppc64/crtools.c b/criu/arch/ppc64/crtools.c index 5a5966ad4..077c243b2 100644 --- a/criu/arch/ppc64/crtools.c +++ b/criu/arch/ppc64/crtools.c @@ -23,6 +23,9 @@ #include "images/core.pb-c.h" #include "images/creds.pb-c.h" +unsigned __page_size = 0; +unsigned __page_shift = 0; + static UserPpc64FpstateEntry *copy_fp_regs(uint64_t *fpregs) { UserPpc64FpstateEntry *fpe; diff --git a/include/common/arch/aarch64/asm/page.h b/include/common/arch/aarch64/asm/page.h index 4126c8474..bd8fe8f71 100644 --- a/include/common/arch/aarch64/asm/page.h +++ b/include/common/arch/aarch64/asm/page.h @@ -4,22 +4,36 @@ #define ARCH_HAS_LONG_PAGES #ifndef CR_NOGLIBC -#include +#include /* ffsl() */ +#include /* _SC_PAGESIZE */ -#ifndef PAGE_SHIFT -# define PAGE_SHIFT 12 -#endif +extern unsigned __page_size; +extern unsigned __page_shift; -#ifndef PAGE_SIZE -# define PAGE_SIZE (1UL << PAGE_SHIFT) -#endif +static inline unsigned page_size(void) +{ + if (!__page_size) + __page_size = sysconf(_SC_PAGESIZE); + return __page_size; +} -#ifndef PAGE_MASK -# define PAGE_MASK (~(PAGE_SIZE - 1)) -#endif +static inline unsigned page_shift(void) +{ + if (!__page_shift) + __page_shift = (ffsl(page_size()) - 1); + return __page_shift; +} + +/* + * Don't add ifdefs for PAGE_SIZE: if any header defines it as a constant + * on aarch64, then we need refrain using PAGE_SIZE in criu and use + * page_size() across sources (as it may differ on aarch64). + */ +#define PAGE_SIZE page_size() +#define PAGE_MASK (~(PAGE_SIZE - 1)) +#define PAGE_SHIFT page_shift() #define PAGE_PFN(addr) ((addr) / PAGE_SIZE) -#define page_size() sysconf(_SC_PAGESIZE) #else /* CR_NOGLIBC */ diff --git a/include/common/arch/ppc64/asm/page.h b/include/common/arch/ppc64/asm/page.h index a95af55ef..5107cb8e0 100644 --- a/include/common/arch/ppc64/asm/page.h +++ b/include/common/arch/ppc64/asm/page.h @@ -4,26 +4,36 @@ #define ARCH_HAS_LONG_PAGES #ifndef CR_NOGLIBC -#include +#include /* ffsl() */ +#include /* _SC_PAGESIZE */ + +extern unsigned __page_size; +extern unsigned __page_shift; + +static inline unsigned page_size(void) +{ + if (!__page_size) + __page_size = sysconf(_SC_PAGESIZE); + return __page_size; +} + +static inline unsigned page_shift(void) +{ + if (!__page_shift) + __page_shift = (ffsl(page_size()) - 1); + return __page_shift; +} /* - * Default config for Pseries is to use 64K pages. - * See kernel file arch/powerpc/configs/pseries_*defconfig + * Don't add ifdefs for PAGE_SIZE: if any header defines it as a constant + * on ppc64, then we need refrain using PAGE_SIZE in criu and use + * page_size() across sources (as it may differ on ppc64). */ -#ifndef PAGE_SHIFT -# define PAGE_SHIFT 16 -#endif - -#ifndef PAGE_SIZE -# define PAGE_SIZE (1UL << PAGE_SHIFT) -#endif - -#ifndef PAGE_MASK -# define PAGE_MASK (~(PAGE_SIZE - 1)) -#endif +#define PAGE_SIZE page_size() +#define PAGE_MASK (~(PAGE_SIZE - 1)) +#define PAGE_SHIFT page_shift() #define PAGE_PFN(addr) ((addr) / PAGE_SIZE) -#define page_size() sysconf(_SC_PAGESIZE) #else /* CR_NOGLIBC */