linux-user: Use ARRAY_SIZE with bitmask_transtbl

Rather than using a zero tuple to end the table, use a macro
to apply ARRAY_SIZE and pass that on to the convert functions.

This fixes two bugs in which the conversion functions required
that both the target and host masks be non-zero in order to
continue, rather than require both target and host masks be
zero in order to terminate.

This affected mmap_flags_tbl when the host does not support
all of the flags we wish to convert (e.g. MAP_UNINITIALIZED).
Mapping these flags to zero is good enough, and matches how
the kernel ignores bits that are unknown.

Fixes: 4b840f96 ("linux-user: Populate more bits in mmap_flags_tbl")
Reviewed-by: Alex Bennée <alex.bennee@linaro.org>
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
This commit is contained in:
Richard Henderson 2023-08-07 18:26:54 -07:00
parent 9ab8d07149
commit a05cee93f4
4 changed files with 25 additions and 22 deletions

View file

@ -193,10 +193,17 @@ static inline int thunk_type_align(const argtype *type_ptr, int is_host)
}
}
unsigned int target_to_host_bitmask(unsigned int target_mask,
const bitmask_transtbl * trans_tbl);
unsigned int host_to_target_bitmask(unsigned int host_mask,
const bitmask_transtbl * trans_tbl);
unsigned int target_to_host_bitmask_len(unsigned int target_mask,
const bitmask_transtbl *trans_tbl,
size_t trans_len);
unsigned int host_to_target_bitmask_len(unsigned int host_mask,
const bitmask_transtbl * trans_tbl,
size_t trans_len);
#define target_to_host_bitmask(M, T) \
target_to_host_bitmask_len(M, T, ARRAY_SIZE(T))
#define host_to_target_bitmask(M, T) \
host_to_target_bitmask_len(M, T, ARRAY_SIZE(T))
void thunk_init(unsigned int max_structs);