在 2025-12-16星期二的 00:42 +0800,Icenowy Zheng写道:
> 在 2025-10-31星期五的 14:23 +0100,Luca Bonissi写道:
> > > From 6ddab7d3ba1035b5e2a6016bde4776436267c18b Mon Sep 17 00:00:00
> > > 2001
> > From: Luca Bonissi <[email protected]>
> > Date: Fri, 31 Oct 2025 13:29:19 +0100
> > Subject: [PATCH 1/7] Add termios2 support to linux-user
> 

Adding the following hunk solves this build problem (and makes riscv64
guest newest glibc isatty() works):

```
diff --git a/linux-user/syscall.c b/linux-user/syscall.c
index 076a9c69b0..e6e3dc252d 100644
--- a/linux-user/syscall.c
+++ b/linux-user/syscall.c
@@ -150,6 +150,21 @@
 #include "fd-trans.h"
 #include "user/cpu_loop.h"
 
+#if defined(__powerpc__)
+/*
+ * On PowerPC termios2 is lacking and termios along with ioctls w/o 2
+ * behaves like termios2 and things with 2 on other architectures.
+ *
+ * Just define termios2-related things to be the same with termios-
related
+ * ones to support PowerPC.
+ */
+#define host_termios2 host_termios
+#define TCGETS2 TCGETS
+#define TCSETS2 TCSETS
+#define TCSETSW2 TCSETSW
+#define TCSETSF2 TCSETSF
+#endif
+
 #ifndef CLONE_IO
 #define CLONE_IO                0x80000000      /* Clone io context */
 #endif
```

I am okay for anyone to take this hunk, if you can add
```
Co-developed-by: Icenowy Zheng <[email protected]>
```
it would be better.

> Sorry but this patch does not build on PowerPC hosts:
> 
> ```
> ../linux-user/ioctls.h:4:12: error: ‘TCGETS2’ undeclared here (not in
> a
> function); did you mean ‘TCGETS’?
>     4 |      IOCTL(TCGETS2, IOC_R,
> MK_PTR(MK_STRUCT(STRUCT_termios2)))
>       |            ^~~~~~~
> ../linux-user/syscall.c:5615:23: note: in definition of macro ‘IOCTL’
>  5615 |     { TARGET_ ## cmd, cmd, #cmd, access, 0, {  __VA_ARGS__ }
> },
>       |                       ^~~
> ../linux-user/ioctls.h:5:12: error: ‘TCSETS2’ undeclared here (not in
> a
> function); did you mean ‘TCSETS’?
>     5 |      IOCTL(TCSETS2, IOC_W,
> MK_PTR(MK_STRUCT(STRUCT_termios2)))
>       |            ^~~~~~~
> ../linux-user/syscall.c:5615:23: note: in definition of macro ‘IOCTL’
>  5615 |     { TARGET_ ## cmd, cmd, #cmd, access, 0, {  __VA_ARGS__ }
> },
>       |                       ^~~
> ../linux-user/ioctls.h:6:12: error: ‘TCSETSW2’ undeclared here (not
> in
> a function); did you mean ‘TCSETSW’?
>     6 |      IOCTL(TCSETSW2, IOC_W,
> MK_PTR(MK_STRUCT(STRUCT_termios2)))
>       |            ^~~~~~~~
> ../linux-user/syscall.c:5615:23: note: in definition of macro ‘IOCTL’
>  5615 |     { TARGET_ ## cmd, cmd, #cmd, access, 0, {  __VA_ARGS__ }
> },
>       |                       ^~~
> ../linux-user/ioctls.h:7:12: error: ‘TCSETSF2’ undeclared here (not
> in
> a function); did you mean ‘TCSETSF’?
>     7 |      IOCTL(TCSETSF2, IOC_W,
> MK_PTR(MK_STRUCT(STRUCT_termios2)))
>       |            ^~~~~~~~
> ../linux-user/syscall.c:5615:23: note: in definition of macro ‘IOCTL’
>  5615 |     { TARGET_ ## cmd, cmd, #cmd, access, 0, {  __VA_ARGS__ }
> },
>       |                       ^~~
> ../linux-user/syscall.c: In function ‘target_to_host_termios2’:
> ../linux-user/syscall.c:5940:9: error: invalid use of undefined type
> ‘struct host_termios2’
>  5940 |     host->c_iflag =
>       |         ^~
> ../linux-user/syscall.c:5942:9: error: invalid use of undefined type
> ‘struct host_termios2’
>  5942 |     host->c_oflag =
>       |         ^~
> ../linux-user/syscall.c:5944:9: error: invalid use of undefined type
> ‘struct host_termios2’
>  5944 |     host->c_cflag =
>       |         ^~
> ../linux-user/syscall.c:5946:9: error: invalid use of undefined type
> ‘struct host_termios2’
>  5946 |     host->c_lflag =
>       |         ^~
> ../linux-user/syscall.c:5948:9: error: invalid use of undefined type
> ‘struct host_termios2’
>  5948 |     host->c_line = target->c_line;
>       |         ^~
> ../linux-user/syscall.c:5949:9: error: invalid use of undefined type
> ‘struct host_termios2’
>  5949 |     host->c_ispeed = tswap32(target->c_ispeed);
>       |         ^~
> ../linux-user/syscall.c:5950:9: error: invalid use of undefined type
> ‘struct host_termios2’
>  5950 |     host->c_ospeed = tswap32(target->c_ospeed);
>       |         ^~
> ../linux-user/syscall.c:5952:16: error: invalid use of undefined type
> ‘struct host_termios2’
>  5952 |     memset(host->c_cc, 0, sizeof(host->c_cc));
>       |                ^~
> ../linux-user/syscall.c:5952:38: error: invalid use of undefined type
> ‘struct host_termios2’
>  5952 |     memset(host->c_cc, 0, sizeof(host->c_cc));
>       |                                      ^~
> ../linux-user/syscall.c:5953:9: error: invalid use of undefined type
> ‘struct host_termios2’
>  5953 |     host->c_cc[VINTR] = target->c_cc[TARGET_VINTR];
>       |         ^~
> ../linux-user/syscall.c:5954:9: error: invalid use of undefined type
> ‘struct host_termios2’
>  5954 |     host->c_cc[VQUIT] = target->c_cc[TARGET_VQUIT];
>       |         ^~
> ../linux-user/syscall.c:5955:9: error: invalid use of undefined type
> ‘struct host_termios2’
>  5955 |     host->c_cc[VERASE] = target->c_cc[TARGET_VERASE];
>       |         ^~
> ../linux-user/syscall.c:5956:9: error: invalid use of undefined type
> ‘struct host_termios2’
>  5956 |     host->c_cc[VKILL] = target->c_cc[TARGET_VKILL];
>       |         ^~
> ../linux-user/syscall.c:5957:9: error: invalid use of undefined type
> ‘struct host_termios2’
>  5957 |     host->c_cc[VEOF] = target->c_cc[TARGET_VEOF];
>       |         ^~
> ../linux-user/syscall.c:5958:9: error: invalid use of undefined type
> ‘struct host_termios2’
>  5958 |     host->c_cc[VTIME] = target->c_cc[TARGET_VTIME];
>       |         ^~
> ../linux-user/syscall.c:5959:9: error: invalid use of undefined type
> ‘struct host_termios2’
>  5959 |     host->c_cc[VMIN] = target->c_cc[TARGET_VMIN];
>       |         ^~
> ../linux-user/syscall.c:5960:9: error: invalid use of undefined type
> ‘struct host_termios2’
>  5960 |     host->c_cc[VSWTC] = target->c_cc[TARGET_VSWTC];
>       |         ^~
> ../linux-user/syscall.c:5961:9: error: invalid use of undefined type
> ‘struct host_termios2’
>  5961 |     host->c_cc[VSTART] = target->c_cc[TARGET_VSTART];
>       |         ^~
> ../linux-user/syscall.c:5962:9: error: invalid use of undefined type
> ‘struct host_termios2’
>  5962 |     host->c_cc[VSTOP] = target->c_cc[TARGET_VSTOP];
>       |         ^~
> ../linux-user/syscall.c:5963:9: error: invalid use of undefined type
> ‘struct host_termios2’
>  5963 |     host->c_cc[VSUSP] = target->c_cc[TARGET_VSUSP];
>       |         ^~
> ../linux-user/syscall.c:5964:9: error: invalid use of undefined type
> ‘struct host_termios2’
>  5964 |     host->c_cc[VEOL] = target->c_cc[TARGET_VEOL];
>       |         ^~
> ../linux-user/syscall.c:5965:9: error: invalid use of undefined type
> ‘struct host_termios2’
>  5965 |     host->c_cc[VREPRINT] = target->c_cc[TARGET_VREPRINT];
>       |         ^~
> ../linux-user/syscall.c:5966:9: error: invalid use of undefined type
> ‘struct host_termios2’
>  5966 |     host->c_cc[VDISCARD] = target->c_cc[TARGET_VDISCARD];
>       |         ^~
> ../linux-user/syscall.c:5967:9: error: invalid use of undefined type
> ‘struct host_termios2’
>  5967 |     host->c_cc[VWERASE] = target->c_cc[TARGET_VWERASE];
>       |         ^~
> ../linux-user/syscall.c:5968:9: error: invalid use of undefined type
> ‘struct host_termios2’
>  5968 |     host->c_cc[VLNEXT] = target->c_cc[TARGET_VLNEXT];
>       |         ^~
> ../linux-user/syscall.c:5969:9: error: invalid use of undefined type
> ‘struct host_termios2’
>  5969 |     host->c_cc[VEOL2] = target->c_cc[TARGET_VEOL2];
>       |         ^~
> In file included from ../linux-user/user-internals.h:21,
>                  from ../linux-user/syscall.c:137:
> ../linux-user/syscall.c: In function ‘host_to_target_termios2’:
> ../linux-user/syscall.c:5978:44: error: invalid use of undefined type
> ‘const struct host_termios2’
>  5978 |         tswap32(host_to_target_bitmask(host->c_iflag,
> iflag_tbl));
>       |                                            ^~
> /var/cache/acbs/build/acbs.62hveo8z/qemu-
> 10.1.2/src.user/include/user/thunk.h:209:32: note: in definition of
> macro ‘host_to_target_bitmask’
>   209 |     host_to_target_bitmask_len(M, T, ARRAY_SIZE(T))
>       |                                ^
> ../linux-user/syscall.c:5980:44: error: invalid use of undefined type
> ‘const struct host_termios2’
>  5980 |         tswap32(host_to_target_bitmask(host->c_oflag,
> oflag_tbl));
>       |                                            ^~
> /var/cache/acbs/build/acbs.62hveo8z/qemu-
> 10.1.2/src.user/include/user/thunk.h:209:32: note: in definition of
> macro ‘host_to_target_bitmask’
>   209 |     host_to_target_bitmask_len(M, T, ARRAY_SIZE(T))
>       |                                ^
> ../linux-user/syscall.c:5982:44: error: invalid use of undefined type
> ‘const struct host_termios2’
>  5982 |         tswap32(host_to_target_bitmask(host->c_cflag,
> cflag_tbl));
>       |                                            ^~
> /var/cache/acbs/build/acbs.62hveo8z/qemu-
> 10.1.2/src.user/include/user/thunk.h:209:32: note: in definition of
> macro ‘host_to_target_bitmask’
>   209 |     host_to_target_bitmask_len(M, T, ARRAY_SIZE(T))
>       |                                ^
> ../linux-user/syscall.c:5984:44: error: invalid use of undefined type
> ‘const struct host_termios2’
>  5984 |         tswap32(host_to_target_bitmask(host->c_lflag,
> lflag_tbl));
>       |                                            ^~
> /var/cache/acbs/build/acbs.62hveo8z/qemu-
> 10.1.2/src.user/include/user/thunk.h:209:32: note: in definition of
> macro ‘host_to_target_bitmask’
>   209 |     host_to_target_bitmask_len(M, T, ARRAY_SIZE(T))
>       |                                ^
> ../linux-user/syscall.c:5985:26: error: invalid use of undefined type
> ‘const struct host_termios2’
>  5985 |     target->c_line = host->c_line;
>       |                          ^~
> ../linux-user/syscall.c:5986:36: error: invalid use of undefined type
> ‘const struct host_termios2’
>  5986 |     target->c_ispeed = tswap32(host->c_ispeed);
>       |                                    ^~
> ../linux-user/syscall.c:5987:36: error: invalid use of undefined type
> ‘const struct host_termios2’
>  5987 |     target->c_ospeed = tswap32(host->c_ospeed);
>       |                                    ^~
> ../linux-user/syscall.c:5990:38: error: invalid use of undefined type
> ‘const struct host_termios2’
>  5990 |     target->c_cc[TARGET_VINTR] = host->c_cc[VINTR];
>       |                                      ^~
> ../linux-user/syscall.c:5991:38: error: invalid use of undefined type
> ‘const struct host_termios2’
>  5991 |     target->c_cc[TARGET_VQUIT] = host->c_cc[VQUIT];
>       |                                      ^~
> ../linux-user/syscall.c:5992:39: error: invalid use of undefined type
> ‘const struct host_termios2’
>  5992 |     target->c_cc[TARGET_VERASE] = host->c_cc[VERASE];
>       |                                       ^~
> ../linux-user/syscall.c:5993:38: error: invalid use of undefined type
> ‘const struct host_termios2’
>  5993 |     target->c_cc[TARGET_VKILL] = host->c_cc[VKILL];
>       |                                      ^~
> ../linux-user/syscall.c:5994:37: error: invalid use of undefined type
> ‘const struct host_termios2’
>  5994 |     target->c_cc[TARGET_VEOF] = host->c_cc[VEOF];
>       |                                     ^~
> ../linux-user/syscall.c:5995:38: error: invalid use of undefined type
> ‘const struct host_termios2’
>  5995 |     target->c_cc[TARGET_VTIME] = host->c_cc[VTIME];
>       |                                      ^~
> ../linux-user/syscall.c:5996:37: error: invalid use of undefined type
> ‘const struct host_termios2’
>  5996 |     target->c_cc[TARGET_VMIN] = host->c_cc[VMIN];
>       |                                     ^~
> ../linux-user/syscall.c:5997:38: error: invalid use of undefined type
> ‘const struct host_termios2’
>  5997 |     target->c_cc[TARGET_VSWTC] = host->c_cc[VSWTC];
>       |                                      ^~
> ../linux-user/syscall.c:5998:39: error: invalid use of undefined type
> ‘const struct host_termios2’
>  5998 |     target->c_cc[TARGET_VSTART] = host->c_cc[VSTART];
>       |                                       ^~
> ../linux-user/syscall.c:5999:38: error: invalid use of undefined type
> ‘const struct host_termios2’
>  5999 |     target->c_cc[TARGET_VSTOP] = host->c_cc[VSTOP];
>       |                                      ^~
> ../linux-user/syscall.c:6000:38: error: invalid use of undefined type
> ‘const struct host_termios2’
>  6000 |     target->c_cc[TARGET_VSUSP] = host->c_cc[VSUSP];
>       |                                      ^~
> ../linux-user/syscall.c:6001:37: error: invalid use of undefined type
> ‘const struct host_termios2’
>  6001 |     target->c_cc[TARGET_VEOL] = host->c_cc[VEOL];
>       |                                     ^~
> ../linux-user/syscall.c:6002:41: error: invalid use of undefined type
> ‘const struct host_termios2’
>  6002 |     target->c_cc[TARGET_VREPRINT] = host->c_cc[VREPRINT];
>       |                                         ^~
> ../linux-user/syscall.c:6003:41: error: invalid use of undefined type
> ‘const struct host_termios2’
>  6003 |     target->c_cc[TARGET_VDISCARD] = host->c_cc[VDISCARD];
>       |                                         ^~
> ../linux-user/syscall.c:6004:40: error: invalid use of undefined type
> ‘const struct host_termios2’
>  6004 |     target->c_cc[TARGET_VWERASE] = host->c_cc[VWERASE];
>       |                                        ^~
> ../linux-user/syscall.c:6005:39: error: invalid use of undefined type
> ‘const struct host_termios2’
>  6005 |     target->c_cc[TARGET_VLNEXT] = host->c_cc[VLNEXT];
>       |                                       ^~
> ../linux-user/syscall.c:6006:38: error: invalid use of undefined type
> ‘const struct host_termios2’
>  6006 |     target->c_cc[TARGET_VEOL2] = host->c_cc[VEOL2];
>       |                                      ^~
> ../linux-user/syscall.c: At top level:
> ../linux-user/syscall.c:6011:54: error: invalid application of
> ‘sizeof’
> to incomplete type ‘struct host_termios2’
>  6011 |     .size = { sizeof(struct target_termios2), sizeof(struct
> host_termios2) },
>       |                                                      ^~~~~~
> ../linux-user/syscall.c:6012:65: error: invalid application of
> ‘__alignof__’ to incomplete type ‘struct host_termios2’
>  6012 |     .align = { __alignof__(struct target_termios2),
> __alignof__(struct host_termios2) },
>       |                                                              
> ^~~~~~
> ```
> 
> (The whole patchset rebased onto v10.1.2)
> 
> It seems that PowerPC do not have a `termios2` interface in kernel --
> the `termios` here is just `termios2` .
> 
> > 
> > Signed-off-by: Luca Bonissi <[email protected]>
> > ---
> >  linux-user/ioctls.h         |  6 +++
> >  linux-user/strace.c         | 69 ++++++++++++++++++++++++++++++
> >  linux-user/syscall.c        | 84
> > +++++++++++++++++++++++++++++++++++++
> >  linux-user/syscall_types.h  |  3 ++
> >  linux-user/user-internals.h |  3 ++
> >  5 files changed, 165 insertions(+)
> > 
> > diff --git a/linux-user/ioctls.h b/linux-user/ioctls.h
> > index 2f62fd2cb9..6ecfe6306e 100644
> > --- a/linux-user/ioctls.h
> > +++ b/linux-user/ioctls.h
> > @@ -1,5 +1,11 @@
> >       /* emulated ioctl list */
> >  
> > +#ifdef TARGET_TCGETS2
> > +     IOCTL(TCGETS2, IOC_R, MK_PTR(MK_STRUCT(STRUCT_termios2)))
> > +     IOCTL(TCSETS2, IOC_W, MK_PTR(MK_STRUCT(STRUCT_termios2)))
> > +     IOCTL(TCSETSW2, IOC_W, MK_PTR(MK_STRUCT(STRUCT_termios2)))
> > +     IOCTL(TCSETSF2, IOC_W, MK_PTR(MK_STRUCT(STRUCT_termios2)))
> > +#endif
> >       IOCTL(TCGETS, IOC_R, MK_PTR(MK_STRUCT(STRUCT_termios)))
> >       IOCTL(TCSETS, IOC_W, MK_PTR(MK_STRUCT(STRUCT_termios)))
> >       IOCTL(TCSETSF, IOC_W, MK_PTR(MK_STRUCT(STRUCT_termios)))
> > diff --git a/linux-user/strace.c b/linux-user/strace.c
> > index 758c5d32b6..7afb94544f 100644
> > --- a/linux-user/strace.c
> > +++ b/linux-user/strace.c
> > @@ -1935,6 +1935,75 @@ print_termios(void *arg)
> >      qemu_log("}");
> >  }
> >  
> > +#ifdef TARGET_TCGETS2
> > +void
> > +print_termios2(void *arg)
> > +{
> > +    const struct target_termios2 *target = arg;
> > +
> > +    target_tcflag_t iflags = tswap32(target->c_iflag);
> > +    target_tcflag_t oflags = tswap32(target->c_oflag);
> > +    target_tcflag_t cflags = tswap32(target->c_cflag);
> > +    target_tcflag_t lflags = tswap32(target->c_lflag);
> > +
> > +    qemu_log("{");
> > +
> > +    qemu_log("c_iflag = ");
> > +    print_flags(termios_iflags, iflags, 0);
> > +
> > +    qemu_log("c_oflag = ");
> > +    target_tcflag_t oflags_clean =  oflags & ~(TARGET_NLDLY |
> > TARGET_CRDLY |
> > +                                               TARGET_TABDLY |
> > TARGET_BSDLY |
> > +                                               TARGET_VTDLY |
> > TARGET_FFDLY);
> > +    print_flags(termios_oflags, oflags_clean, 0);
> > +    if (oflags & TARGET_NLDLY) {
> > +        print_enums(termios_oflags_NLDLY, oflags & TARGET_NLDLY,
> > 0);
> > +    }
> > +    if (oflags & TARGET_CRDLY) {
> > +        print_enums(termios_oflags_CRDLY, oflags & TARGET_CRDLY,
> > 0);
> > +    }
> > +    if (oflags & TARGET_TABDLY) {
> > +        print_enums(termios_oflags_TABDLY, oflags & TARGET_TABDLY,
> > 0);
> > +    }
> > +    if (oflags & TARGET_BSDLY) {
> > +        print_enums(termios_oflags_BSDLY, oflags & TARGET_BSDLY,
> > 0);
> > +    }
> > +    if (oflags & TARGET_VTDLY) {
> > +        print_enums(termios_oflags_VTDLY, oflags & TARGET_VTDLY,
> > 0);
> > +    }
> > +    if (oflags & TARGET_FFDLY) {
> > +        print_enums(termios_oflags_FFDLY, oflags & TARGET_FFDLY,
> > 0);
> > +    }
> > +
> > +    qemu_log("c_cflag = ");
> > +    if (cflags & TARGET_CBAUD) {
> > +        print_enums(termios_cflags_CBAUD, cflags & TARGET_CBAUD,
> > 0);
> > +    }
> > +    if (cflags & TARGET_CSIZE) {
> > +        print_enums(termios_cflags_CSIZE, cflags & TARGET_CSIZE,
> > 0);
> > +    }
> > +    target_tcflag_t cflags_clean = cflags & ~(TARGET_CBAUD |
> > TARGET_CSIZE);
> > +    print_flags(termios_cflags, cflags_clean, 0);
> > +
> > +    qemu_log("c_lflag = ");
> > +    print_flags(termios_lflags, lflags, 0);
> > +
> > +    qemu_log("c_ispeed = ");
> > +    print_raw_param("%u", tswap32(target->c_ispeed), 0);
> > +
> > +    qemu_log("c_ospeed = ");
> > +    print_raw_param("%u", tswap32(target->c_ospeed), 0);
> > +
> > +    qemu_log("c_cc = ");
> > +    qemu_log("\"%s\",", target->c_cc);
> > +
> > +    qemu_log("c_line = ");
> > +    print_raw_param("\'%c\'", target->c_line, 1);
> > +
> > +    qemu_log("}");
> > +}
> > +#endif
> > +
> >  #undef UNUSED
> >  
> >  #ifdef TARGET_NR_accept
> > diff --git a/linux-user/syscall.c b/linux-user/syscall.c
> > index 8546f48a05..920bf23406 100644
> > --- a/linux-user/syscall.c
> > +++ b/linux-user/syscall.c
> > @@ -86,6 +86,7 @@
> >  #endif
> >  
> >  #define termios host_termios
> > +#define termios2 host_termios2
> >  #define winsize host_winsize
> >  #define termio host_termio
> >  #define sgttyb host_sgttyb /* same as target */
> > @@ -5885,6 +5886,89 @@ static const StructEntry struct_termios_def
> > =
> > {
> >      .print = print_termios,
> >  };
> >  
> > +#ifdef TARGET_TCGETS2
> > +static void target_to_host_termios2 (void *dst, const void *src)
> > +{
> > +    struct host_termios2 *host = dst;
> > +    const struct target_termios2 *target = src;
> > +
> > +    host->c_iflag =
> > +        target_to_host_bitmask(tswap32(target->c_iflag),
> > iflag_tbl);
> > +    host->c_oflag =
> > +        target_to_host_bitmask(tswap32(target->c_oflag),
> > oflag_tbl);
> > +    host->c_cflag =
> > +        target_to_host_bitmask(tswap32(target->c_cflag),
> > cflag_tbl);
> > +    host->c_lflag =
> > +        target_to_host_bitmask(tswap32(target->c_lflag),
> > lflag_tbl);
> > +    host->c_line = target->c_line;
> > +    host->c_ispeed = tswap32(target->c_ispeed);
> > +    host->c_ospeed = tswap32(target->c_ospeed);
> > +
> > +    memset(host->c_cc, 0, sizeof(host->c_cc));
> > +    host->c_cc[VINTR] = target->c_cc[TARGET_VINTR];
> > +    host->c_cc[VQUIT] = target->c_cc[TARGET_VQUIT];
> > +    host->c_cc[VERASE] = target->c_cc[TARGET_VERASE];
> > +    host->c_cc[VKILL] = target->c_cc[TARGET_VKILL];
> > +    host->c_cc[VEOF] = target->c_cc[TARGET_VEOF];
> > +    host->c_cc[VTIME] = target->c_cc[TARGET_VTIME];
> > +    host->c_cc[VMIN] = target->c_cc[TARGET_VMIN];
> > +    host->c_cc[VSWTC] = target->c_cc[TARGET_VSWTC];
> > +    host->c_cc[VSTART] = target->c_cc[TARGET_VSTART];
> > +    host->c_cc[VSTOP] = target->c_cc[TARGET_VSTOP];
> > +    host->c_cc[VSUSP] = target->c_cc[TARGET_VSUSP];
> > +    host->c_cc[VEOL] = target->c_cc[TARGET_VEOL];
> > +    host->c_cc[VREPRINT] = target->c_cc[TARGET_VREPRINT];
> > +    host->c_cc[VDISCARD] = target->c_cc[TARGET_VDISCARD];
> > +    host->c_cc[VWERASE] = target->c_cc[TARGET_VWERASE];
> > +    host->c_cc[VLNEXT] = target->c_cc[TARGET_VLNEXT];
> > +    host->c_cc[VEOL2] = target->c_cc[TARGET_VEOL2];
> > +}
> > +
> > +static void host_to_target_termios2 (void *dst, const void *src)
> > +{
> > +    struct target_termios2 *target = dst;
> > +    const struct host_termios2 *host = src;
> > +
> > +    target->c_iflag =
> > +        tswap32(host_to_target_bitmask(host->c_iflag, iflag_tbl));
> > +    target->c_oflag =
> > +        tswap32(host_to_target_bitmask(host->c_oflag, oflag_tbl));
> > +    target->c_cflag =
> > +        tswap32(host_to_target_bitmask(host->c_cflag, cflag_tbl));
> > +    target->c_lflag =
> > +        tswap32(host_to_target_bitmask(host->c_lflag, lflag_tbl));
> > +    target->c_line = host->c_line;
> > +    target->c_ispeed = tswap32(host->c_ispeed);
> > +    target->c_ospeed = tswap32(host->c_ospeed);
> > +
> > +    memset(target->c_cc, 0, sizeof(target->c_cc));
> > +    target->c_cc[TARGET_VINTR] = host->c_cc[VINTR];
> > +    target->c_cc[TARGET_VQUIT] = host->c_cc[VQUIT];
> > +    target->c_cc[TARGET_VERASE] = host->c_cc[VERASE];
> > +    target->c_cc[TARGET_VKILL] = host->c_cc[VKILL];
> > +    target->c_cc[TARGET_VEOF] = host->c_cc[VEOF];
> > +    target->c_cc[TARGET_VTIME] = host->c_cc[VTIME];
> > +    target->c_cc[TARGET_VMIN] = host->c_cc[VMIN];
> > +    target->c_cc[TARGET_VSWTC] = host->c_cc[VSWTC];
> > +    target->c_cc[TARGET_VSTART] = host->c_cc[VSTART];
> > +    target->c_cc[TARGET_VSTOP] = host->c_cc[VSTOP];
> > +    target->c_cc[TARGET_VSUSP] = host->c_cc[VSUSP];
> > +    target->c_cc[TARGET_VEOL] = host->c_cc[VEOL];
> > +    target->c_cc[TARGET_VREPRINT] = host->c_cc[VREPRINT];
> > +    target->c_cc[TARGET_VDISCARD] = host->c_cc[VDISCARD];
> > +    target->c_cc[TARGET_VWERASE] = host->c_cc[VWERASE];
> > +    target->c_cc[TARGET_VLNEXT] = host->c_cc[VLNEXT];
> > +    target->c_cc[TARGET_VEOL2] = host->c_cc[VEOL2];
> > +}
> > +
> > +static const StructEntry struct_termios2_def = {
> > +    .convert = { host_to_target_termios2, target_to_host_termios2
> > },
> > +    .size = { sizeof(struct target_termios2), sizeof(struct
> > host_termios2) },
> > +    .align = { __alignof__(struct target_termios2),
> > __alignof__(struct host_termios2) },
> > +    .print = print_termios2,
> > +};
> > +#endif
> > +
> >  /* If the host does not provide these bits, they may be safely
> > discarded. */
> >  #ifndef MAP_SYNC
> >  #define MAP_SYNC 0
> > diff --git a/linux-user/syscall_types.h b/linux-
> > user/syscall_types.h
> > index 6dd7a80ce5..ac45705acf 100644
> > --- a/linux-user/syscall_types.h
> > +++ b/linux-user/syscall_types.h
> > @@ -1,4 +1,7 @@
> >  STRUCT_SPECIAL(termios)
> > +#ifdef TARGET_TCGETS2
> > +STRUCT_SPECIAL(termios2)
> > +#endif
> >  
> >  STRUCT(winsize,
> >         TYPE_SHORT, TYPE_SHORT, TYPE_SHORT, TYPE_SHORT)
> > diff --git a/linux-user/user-internals.h b/linux-user/user-
> > internals.h
> > index 7099349ec8..067c02bb93 100644
> > --- a/linux-user/user-internals.h
> > +++ b/linux-user/user-internals.h
> > @@ -129,6 +129,9 @@ static inline uint64_t target_offset64(uint64_t
> > word0, uint64_t word1)
> >  #endif /* TARGET_ABI_BITS != 32 */
> >  
> >  void print_termios(void *arg);
> > +#ifdef TARGET_TCGETS2
> > +void print_termios2(void *arg);
> > +#endif
> >  
> >  /* ARM EABI and MIPS expect 64bit types aligned even on pairs or
> > registers */
> >  #ifdef TARGET_ARM
> 

Reply via email to