qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [PATCH 3/4] target/mips: Rewrite UHI errno_mips() using GHashTable


From: Peter Maydell
Subject: Re: [PATCH 3/4] target/mips: Rewrite UHI errno_mips() using GHashTable
Date: Sun, 4 Jul 2021 18:25:22 +0100

On Sun, 4 Jul 2021 at 18:07, Philippe Mathieu-Daudé <f4bug@amsat.org> wrote:
>
> Linking on Haiku OS fails:
>
>   
> /boot/system/develop/tools/bin/../lib/gcc/x86_64-unknown-haiku/8.3.0/../../../../x86_64-unknown-haiku/bin/ld:
>   error: 
> libqemu-mips-softmmu.fa.p/target_mips_tcg_sysemu_mips-semi.c.o(.rodata) is 
> too large (0xffff405a bytes)
>   
> /boot/system/develop/tools/bin/../lib/gcc/x86_64-unknown-haiku/8.3.0/../../../../x86_64-unknown-haiku/bin/ld:
>   final link failed: memory exhausted
>   collect2: error: ld returned 1 exit status
>
> This is because the host_to_mips_errno[] uses errno as index,
> for example:
>
>   static const uint16_t host_to_mips_errno[] = {
>       [ENAMETOOLONG] = 91,
>       ...
>
> and Haiku defines [*] ENAMETOOLONG as:
>
>    12 /* Error baselines */
>    13 #define B_GENERAL_ERROR_BASE              INT_MIN
>    ..
>    22 #define B_STORAGE_ERROR_BASE              (B_GENERAL_ERROR_BASE + 
> 0x6000)
>   ...
>   106 #define B_NAME_TOO_LONG                   (B_STORAGE_ERROR_BASE + 4)
>   ...
>   211 #define ENAMETOOLONG                      
> B_TO_POSIX_ERROR(B_NAME_TOO_LONG)
>
> so the array ends up beeing indeed too big.
>
> Since POSIX errno can't be use as indexes on Haiku,
> rewrite errno_mips() using a GHashTable.
>
> [*] 
> https://github.com/haiku/haiku/blob/r1beta3/headers/os/support/Errors.h#L130
>
> Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
> ---
>  target/mips/tcg/sysemu/mips-semi.c | 62 ++++++++++++++++++++++--------
>  1 file changed, 45 insertions(+), 17 deletions(-)

>  static int errno_mips(int host_errno)
>  {
> -    if (host_errno < 0 || host_errno >= ARRAY_SIZE(host_to_mips_errno)) {
> -        return EINVAL;
> -    } else if (host_to_mips_errno[host_errno]) {
> -        return host_to_mips_errno[host_errno];
> -    } else {
> -        return host_errno;
> +    gpointer uhi_errno;
> +
> +    if (uhi_errno_hash_table == NULL) {
> +        uhi_errno_init();
>      }
> +
> +    if (host_errno == 0) {
> +        return 0;
> +    }
> +    if (g_hash_table_lookup_extended(uhi_errno_hash_table,
> +                                     GINT_TO_POINTER(host_errno),
> +                                     NULL, &uhi_errno)) {
> +        return GPOINTER_TO_INT(uhi_errno);
> +    }
> +    return EINVAL; /* Not reachable per the specification */

Per whose specification? This function is passed the errno as set
by various host OS functions like open(), lseek(), read(). POSIX allows
those functions to set errno to any value, so this "we don't know
a guest errno value for that" code is definitely reachable.

thanks
-- PMM



reply via email to

[Prev in Thread] Current Thread [Next in Thread]