Message ID | 20250306234108.378881-1-richard.henderson@linaro.org |
---|---|
State | Superseded |
Headers | show |
Series | include/exec: Move TARGET_PAGE_{SIZE, MASK, BITS} to target_page.h | expand |
On 3/6/25 15:41, Richard Henderson wrote: > diff --git a/page-vary-target.c b/page-vary-target.c > index 343b4adb95..1b4a9a10be 100644 > --- a/page-vary-target.c > +++ b/page-vary-target.c > @@ -37,5 +37,7 @@ void finalize_target_page_bits(void) > { > #ifdef TARGET_PAGE_BITS_VARY > finalize_target_page_bits_common(TARGET_PAGE_BITS_MIN); > +#else > + finalize_target_page_bits_common(TARGET_PAGE_BITS); > #endif > } Actually, the ifdef here should be removed. TARGET_PAGE_BITS_MIN is always correct. r~
On 3/6/25 15:41, Richard Henderson wrote: > Re-use the TARGET_PAGE_BITS_VARY mechanism to define > TARGET_PAGE_SIZE and friends when not compiling per-target. > Inline qemu_target_page_{size,mask,bits} as they are now trivial. > > Signed-off-by: Richard Henderson <richard.henderson@linaro.org> > --- > > After this, we could in fact remove qemu_target_page_foo(), etc. > We certainly don't need to convert any more uses of TARGET_PAGE_FOO. > > r~ > > --- > include/exec/cpu-all.h | 21 +------------- > include/exec/poison.h | 5 ---- > include/exec/target_page.h | 58 ++++++++++++++++++++++++++++++++++---- > page-target.c | 18 ------------ > page-vary-target.c | 2 ++ > 5 files changed, 55 insertions(+), 49 deletions(-) > > diff --git a/include/exec/cpu-all.h b/include/exec/cpu-all.h > index 09f537d06f..8f7aebb088 100644 > --- a/include/exec/cpu-all.h > +++ b/include/exec/cpu-all.h > @@ -105,26 +105,7 @@ static inline void stl_phys_notdirty(AddressSpace *as, hwaddr addr, uint32_t val > > /* page related stuff */ > #include "exec/cpu-defs.h" > -#ifdef TARGET_PAGE_BITS_VARY > -# include "exec/page-vary.h" > -extern const TargetPageBits target_page; > -# ifdef CONFIG_DEBUG_TCG > -# define TARGET_PAGE_BITS ({ assert(target_page.decided); \ > - target_page.bits; }) > -# define TARGET_PAGE_MASK ({ assert(target_page.decided); \ > - (target_long)target_page.mask; }) > -# else > -# define TARGET_PAGE_BITS target_page.bits > -# define TARGET_PAGE_MASK ((target_long)target_page.mask) > -# endif > -# define TARGET_PAGE_SIZE (-(int)TARGET_PAGE_MASK) > -#else > -# define TARGET_PAGE_BITS_MIN TARGET_PAGE_BITS > -# define TARGET_PAGE_SIZE (1 << TARGET_PAGE_BITS) > -# define TARGET_PAGE_MASK ((target_long)-1 << TARGET_PAGE_BITS) > -#endif > - > -#define TARGET_PAGE_ALIGN(addr) ROUND_UP((addr), TARGET_PAGE_SIZE) > +#include "exec/target_page.h" > > CPUArchState *cpu_copy(CPUArchState *env); > > diff --git a/include/exec/poison.h b/include/exec/poison.h > index f4283f693a..ce43a12965 100644 > --- a/include/exec/poison.h > +++ b/include/exec/poison.h > @@ -44,11 +44,6 @@ > #pragma GCC poison TARGET_FMT_ld > #pragma GCC poison TARGET_FMT_lu > > -#pragma GCC poison TARGET_PAGE_SIZE > -#pragma GCC poison TARGET_PAGE_MASK > -#pragma GCC poison TARGET_PAGE_BITS > -#pragma GCC poison TARGET_PAGE_ALIGN > - > #pragma GCC poison CPU_INTERRUPT_HARD > #pragma GCC poison CPU_INTERRUPT_EXITTB > #pragma GCC poison CPU_INTERRUPT_HALT > diff --git a/include/exec/target_page.h b/include/exec/target_page.h > index 98ffbb5c23..8e89e5cbe6 100644 > --- a/include/exec/target_page.h > +++ b/include/exec/target_page.h > @@ -14,10 +14,56 @@ > #ifndef EXEC_TARGET_PAGE_H > #define EXEC_TARGET_PAGE_H > > -size_t qemu_target_page_size(void); > -int qemu_target_page_mask(void); > -int qemu_target_page_bits(void); > -int qemu_target_page_bits_min(void); > - > -size_t qemu_target_pages_to_MiB(size_t pages); > +/* > + * If compiling per-target, get the real values. > + * For generic code, reuse the mechanism for variable page size. > + */ > +#ifdef COMPILING_PER_TARGET > +#include "cpu-param.h" > +#include "exec/target_long.h" > +#define TARGET_PAGE_TYPE target_long > +#else > +#define TARGET_PAGE_BITS_VARY > +#define TARGET_PAGE_TYPE int > +#endif > + > +#ifdef TARGET_PAGE_BITS_VARY > +# include "exec/page-vary.h" > +extern const TargetPageBits target_page; > +# ifdef CONFIG_DEBUG_TCG > +# define TARGET_PAGE_BITS ({ assert(target_page.decided); \ > + target_page.bits; }) > +# define TARGET_PAGE_MASK ({ assert(target_page.decided); \ > + (TARGET_PAGE_TYPE)target_page.mask; }) > +# else > +# define TARGET_PAGE_BITS target_page.bits > +# define TARGET_PAGE_MASK ((TARGET_PAGE_TYPE)target_page.mask) > +# endif > +# define TARGET_PAGE_SIZE (-(int)TARGET_PAGE_MASK) > +#else > +# define TARGET_PAGE_BITS_MIN TARGET_PAGE_BITS > +# define TARGET_PAGE_SIZE (1 << TARGET_PAGE_BITS) > +# define TARGET_PAGE_MASK ((TARGET_PAGE_TYPE)-1 << TARGET_PAGE_BITS) > +#endif > + > +#define TARGET_PAGE_ALIGN(addr) ROUND_UP((addr), TARGET_PAGE_SIZE) > + > +static inline size_t qemu_target_page_size(void) > +{ > + return TARGET_PAGE_SIZE; > +} > + > +static inline int qemu_target_page_mask(void) > +{ > + return TARGET_PAGE_MASK; > +} > + > +static inline int qemu_target_page_bits(void) > +{ > + return TARGET_PAGE_BITS; > +} > + > +int qemu_target_page_bits_min(void); > +size_t qemu_target_pages_to_MiB(size_t pages); > + > #endif > diff --git a/page-target.c b/page-target.c > index 82211c8593..321e43d06f 100644 > --- a/page-target.c > +++ b/page-target.c > @@ -8,24 +8,6 @@ > > #include "qemu/osdep.h" > #include "exec/target_page.h" > -#include "exec/cpu-defs.h" > -#include "cpu.h" > -#include "exec/cpu-all.h" > - > -size_t qemu_target_page_size(void) > -{ > - return TARGET_PAGE_SIZE; > -} > - > -int qemu_target_page_mask(void) > -{ > - return TARGET_PAGE_MASK; > -} > - > -int qemu_target_page_bits(void) > -{ > - return TARGET_PAGE_BITS; > -} > > int qemu_target_page_bits_min(void) > { > diff --git a/page-vary-target.c b/page-vary-target.c > index 343b4adb95..1b4a9a10be 100644 > --- a/page-vary-target.c > +++ b/page-vary-target.c > @@ -37,5 +37,7 @@ void finalize_target_page_bits(void) > { > #ifdef TARGET_PAGE_BITS_VARY > finalize_target_page_bits_common(TARGET_PAGE_BITS_MIN); > +#else > + finalize_target_page_bits_common(TARGET_PAGE_BITS); > #endif > } Reviewed-by: Pierrick Bouvier <pierrick.bouvier@linaro.org>
diff --git a/include/exec/cpu-all.h b/include/exec/cpu-all.h index 09f537d06f..8f7aebb088 100644 --- a/include/exec/cpu-all.h +++ b/include/exec/cpu-all.h @@ -105,26 +105,7 @@ static inline void stl_phys_notdirty(AddressSpace *as, hwaddr addr, uint32_t val /* page related stuff */ #include "exec/cpu-defs.h" -#ifdef TARGET_PAGE_BITS_VARY -# include "exec/page-vary.h" -extern const TargetPageBits target_page; -# ifdef CONFIG_DEBUG_TCG -# define TARGET_PAGE_BITS ({ assert(target_page.decided); \ - target_page.bits; }) -# define TARGET_PAGE_MASK ({ assert(target_page.decided); \ - (target_long)target_page.mask; }) -# else -# define TARGET_PAGE_BITS target_page.bits -# define TARGET_PAGE_MASK ((target_long)target_page.mask) -# endif -# define TARGET_PAGE_SIZE (-(int)TARGET_PAGE_MASK) -#else -# define TARGET_PAGE_BITS_MIN TARGET_PAGE_BITS -# define TARGET_PAGE_SIZE (1 << TARGET_PAGE_BITS) -# define TARGET_PAGE_MASK ((target_long)-1 << TARGET_PAGE_BITS) -#endif - -#define TARGET_PAGE_ALIGN(addr) ROUND_UP((addr), TARGET_PAGE_SIZE) +#include "exec/target_page.h" CPUArchState *cpu_copy(CPUArchState *env); diff --git a/include/exec/poison.h b/include/exec/poison.h index f4283f693a..ce43a12965 100644 --- a/include/exec/poison.h +++ b/include/exec/poison.h @@ -44,11 +44,6 @@ #pragma GCC poison TARGET_FMT_ld #pragma GCC poison TARGET_FMT_lu -#pragma GCC poison TARGET_PAGE_SIZE -#pragma GCC poison TARGET_PAGE_MASK -#pragma GCC poison TARGET_PAGE_BITS -#pragma GCC poison TARGET_PAGE_ALIGN - #pragma GCC poison CPU_INTERRUPT_HARD #pragma GCC poison CPU_INTERRUPT_EXITTB #pragma GCC poison CPU_INTERRUPT_HALT diff --git a/include/exec/target_page.h b/include/exec/target_page.h index 98ffbb5c23..8e89e5cbe6 100644 --- a/include/exec/target_page.h +++ b/include/exec/target_page.h @@ -14,10 +14,56 @@ #ifndef EXEC_TARGET_PAGE_H #define EXEC_TARGET_PAGE_H -size_t qemu_target_page_size(void); -int qemu_target_page_mask(void); -int qemu_target_page_bits(void); -int qemu_target_page_bits_min(void); - -size_t qemu_target_pages_to_MiB(size_t pages); +/* + * If compiling per-target, get the real values. + * For generic code, reuse the mechanism for variable page size. + */ +#ifdef COMPILING_PER_TARGET +#include "cpu-param.h" +#include "exec/target_long.h" +#define TARGET_PAGE_TYPE target_long +#else +#define TARGET_PAGE_BITS_VARY +#define TARGET_PAGE_TYPE int +#endif + +#ifdef TARGET_PAGE_BITS_VARY +# include "exec/page-vary.h" +extern const TargetPageBits target_page; +# ifdef CONFIG_DEBUG_TCG +# define TARGET_PAGE_BITS ({ assert(target_page.decided); \ + target_page.bits; }) +# define TARGET_PAGE_MASK ({ assert(target_page.decided); \ + (TARGET_PAGE_TYPE)target_page.mask; }) +# else +# define TARGET_PAGE_BITS target_page.bits +# define TARGET_PAGE_MASK ((TARGET_PAGE_TYPE)target_page.mask) +# endif +# define TARGET_PAGE_SIZE (-(int)TARGET_PAGE_MASK) +#else +# define TARGET_PAGE_BITS_MIN TARGET_PAGE_BITS +# define TARGET_PAGE_SIZE (1 << TARGET_PAGE_BITS) +# define TARGET_PAGE_MASK ((TARGET_PAGE_TYPE)-1 << TARGET_PAGE_BITS) +#endif + +#define TARGET_PAGE_ALIGN(addr) ROUND_UP((addr), TARGET_PAGE_SIZE) + +static inline size_t qemu_target_page_size(void) +{ + return TARGET_PAGE_SIZE; +} + +static inline int qemu_target_page_mask(void) +{ + return TARGET_PAGE_MASK; +} + +static inline int qemu_target_page_bits(void) +{ + return TARGET_PAGE_BITS; +} + +int qemu_target_page_bits_min(void); +size_t qemu_target_pages_to_MiB(size_t pages); + #endif diff --git a/page-target.c b/page-target.c index 82211c8593..321e43d06f 100644 --- a/page-target.c +++ b/page-target.c @@ -8,24 +8,6 @@ #include "qemu/osdep.h" #include "exec/target_page.h" -#include "exec/cpu-defs.h" -#include "cpu.h" -#include "exec/cpu-all.h" - -size_t qemu_target_page_size(void) -{ - return TARGET_PAGE_SIZE; -} - -int qemu_target_page_mask(void) -{ - return TARGET_PAGE_MASK; -} - -int qemu_target_page_bits(void) -{ - return TARGET_PAGE_BITS; -} int qemu_target_page_bits_min(void) { diff --git a/page-vary-target.c b/page-vary-target.c index 343b4adb95..1b4a9a10be 100644 --- a/page-vary-target.c +++ b/page-vary-target.c @@ -37,5 +37,7 @@ void finalize_target_page_bits(void) { #ifdef TARGET_PAGE_BITS_VARY finalize_target_page_bits_common(TARGET_PAGE_BITS_MIN); +#else + finalize_target_page_bits_common(TARGET_PAGE_BITS); #endif }
Re-use the TARGET_PAGE_BITS_VARY mechanism to define TARGET_PAGE_SIZE and friends when not compiling per-target. Inline qemu_target_page_{size,mask,bits} as they are now trivial. Signed-off-by: Richard Henderson <richard.henderson@linaro.org> --- After this, we could in fact remove qemu_target_page_foo(), etc. We certainly don't need to convert any more uses of TARGET_PAGE_FOO. r~ --- include/exec/cpu-all.h | 21 +------------- include/exec/poison.h | 5 ---- include/exec/target_page.h | 58 ++++++++++++++++++++++++++++++++++---- page-target.c | 18 ------------ page-vary-target.c | 2 ++ 5 files changed, 55 insertions(+), 49 deletions(-)