Re: [PATCH v3 11/13] target/hexagon: Add an errno mapping
Matheus Tavares Bernardino <[email protected]>
| Newsgroups | gmane.comp.emulators.qemu |
|---|---|
| Message-ID | <[email protected]> |
On Mon, 17 Aug 2026 06:41:28 +0200 =?UTF-8?Q?Philippe_Mathieu-Daud=C3=A9?= <[email protected]> wrote: > > On 20/7/26 19:41, Matheus Tavares Bernardino wrote: > > From: Brian Cain <[email protected]> > > > > The Hexagon semihosting ABI defines its own errno values > > which may differ from the host's. Translate host errno to > > the Hexagon-specific values before returning results to the > > guest so that baremetal programs see the expected error codes. > > > > Signed-off-by: Brian Cain <[email protected]> > > Reviewed-by: Pierrick Bouvier <[email protected]> > > Signed-off-by: Matheus Tavares Bernardino <[email protected]> > > --- > > target/hexagon/hexswi.c | 75 ++++++++++++++++++++++++++++++++++------- > > 1 file changed, 63 insertions(+), 12 deletions(-) > > > > diff --git a/target/hexagon/hexswi.c b/target/hexagon/hexswi.c > > index 564a11e557a..d93789e39c7 100644 > > --- a/target/hexagon/hexswi.c > > +++ b/target/hexagon/hexswi.c > > @@ -154,12 +154,63 @@ static void do_preload(CPUHexagonState *env, target_ulong swi_info, bool load) > > hexagon_peek_memory_range(env, addr, count, retaddr); > > } > > > > +/* Hexagon semihosting errno values */ > > +#define HEX_EINVAL 22 > > +#define HEX_ERRNOS \ > > + HEX_ERRNO(EPERM, 1) \ > > + HEX_ERRNO(ENOENT, 2) \ > > + HEX_ERRNO(EINTR, 4) \ > > + HEX_ERRNO(EIO, 5) \ > > + HEX_ERRNO(ENXIO, 6) \ > > + HEX_ERRNO(EBADF, 9) \ > > + HEX_ERRNO(EAGAIN, 11) \ > > + HEX_ERRNO(ENOMEM, 12) \ > > + HEX_ERRNO(EACCES, 13) \ > > + HEX_ERRNO(EFAULT, 14) \ > > + HEX_ERRNO(EBUSY, 16) \ > > + HEX_ERRNO(EEXIST, 17) \ > > + HEX_ERRNO(EXDEV, 18) \ > > + HEX_ERRNO(ENODEV, 19) \ > > + HEX_ERRNO(ENOTDIR, 20) \ > > + HEX_ERRNO(EISDIR, 21) \ > > + HEX_ERRNO(EINVAL, HEX_EINVAL) \ > > + HEX_ERRNO(ENFILE, 23) \ > > + HEX_ERRNO(EMFILE, 24) \ > > + HEX_ERRNO(ENOTTY, 25) \ > > + HEX_ERRNO(ETXTBSY, 26) \ > > + HEX_ERRNO(EFBIG, 27) \ > > + HEX_ERRNO(ENOSPC, 28) \ > > + HEX_ERRNO(ESPIPE, 29) \ > > + HEX_ERRNO(EROFS, 30) \ > > + HEX_ERRNO(EMLINK, 31) \ > > + HEX_ERRNO(EPIPE, 32) \ > > + HEX_ERRNO(ERANGE, 34) \ > > + HEX_ERRNO(ENAMETOOLONG, 36) \ > > + HEX_ERRNO(ENOSYS, 38) \ > > + HEX_ERRNO(ELOOP, 40) \ > > + HEX_ERRNO(EOVERFLOW, 75) > > + > > +/* Map host errno to hexagon semihosting errno */ > > +static void semi_cb(CPUState *cs, uint64_t ret, int err) > > +{ > > +#define HEX_ERRNO(NAME, CODE) case NAME: err = CODE; break; > > + switch (err) { > > + case 0: > > + break; > > + HEX_ERRNOS > > IMHO defining the target-specific semihosting values as TARGET_foo > like done in target/xtensa/xtensa-semi.c is more readable long-term. The idea behind the HEX_ERRNOS macro here was to avoid too much repetition. But I agree, if it turns it less readable long term, let's go with the enum + switch/case. > > + default: > > + err = HEX_EINVAL; > > + break; > > + } > > + common_semi_cb(cs, ret, err); > > +} > >