* [Qemu-devel] [PATCH 0/4] linux-user: Several mostly Mips related patches
@ 2016-10-04 18:05 Aleksandar Markovic
2016-10-04 18:05 ` [Qemu-devel] [PATCH 1/4] linux-user: Add support for sysfs() syscall Aleksandar Markovic
` (3 more replies)
0 siblings, 4 replies; 12+ messages in thread
From: Aleksandar Markovic @ 2016-10-04 18:05 UTC (permalink / raw)
To: qemu-devel, riku.voipio, laurent, peter.maydell, aurelien,
Yongbok.Kim, leon.alrae, petar.jovanovic, miodrag.dinic,
aleksandar.rikalo, aleksandar.markovic
From: Aleksandar Markovic <aleksandar.markovic@imgtec.com>
This is just a set of several Qemu Linux user patches that for various
reasons did not make their way to Qemu upstream, but they are all valid
and important in certain use case scenarios for Qemu Linux user mode.
Aleksandar Markovic (4):
linux-user: Add support for sysfs() syscall
linux-user: Update termbits.h for Mips32
linux-user: Redirect termbits.h for Mips64 to termbits.h for Mips32
linux-user: Fix fadvise64() syscall support for Mips32
linux-user/mips/termbits.h | 12 +++
linux-user/mips64/termbits.h | 245 +------------------------------------------
linux-user/strace.c | 27 +++++
linux-user/strace.list | 2 +-
linux-user/syscall.c | 48 ++++++++-
5 files changed, 86 insertions(+), 248 deletions(-)
--
2.9.3
^ permalink raw reply [flat|nested] 12+ messages in thread
* [Qemu-devel] [PATCH 1/4] linux-user: Add support for sysfs() syscall
2016-10-04 18:05 [Qemu-devel] [PATCH 0/4] linux-user: Several mostly Mips related patches Aleksandar Markovic
@ 2016-10-04 18:05 ` Aleksandar Markovic
2016-10-04 20:35 ` Peter Maydell
2016-10-04 18:05 ` [Qemu-devel] [PATCH 2/4] linux-user: Update termbits.h for Mips32 Aleksandar Markovic
` (2 subsequent siblings)
3 siblings, 1 reply; 12+ messages in thread
From: Aleksandar Markovic @ 2016-10-04 18:05 UTC (permalink / raw)
To: qemu-devel, riku.voipio, laurent, peter.maydell, aurelien,
Yongbok.Kim, leon.alrae, petar.jovanovic, miodrag.dinic,
aleksandar.rikalo, aleksandar.markovic
From: Aleksandar Markovic <aleksandar.markovic@imgtec.com>
This patch implements Qemu user mode sysfs() syscall support.
Syscall sysfs() involves returning information about the filesystem types
currently present in the kernel, and can operate in three distinct flavors,
depending on its first argument.
Its specific is that its declaration is threefold:
int sysfs(int option, const char *fsname);
int sysfs(int option, unsigned int fs_index, char *buf);
int sysfs(int option);
Its implementation in Linux kernel is at fs/filesystems.c, line 184.
The implementation in Qemu user mode is based on invocation of host's
sysfs(), and its key part is in the correspondent case segment of the
main switch statement of the function do_syscall(), in file
linux-user/syscalls.c. All necessary conversions of data structures
from target to host and from host to target are covered. Based on
the value of the first argument, three cases are distinguished, and
such conversions are implemented separately for each case.
Buffer needed for the second cases has size defined with preprocessor
constant FST_NAME_MAX, that is set to 32. .This is good enough for
virtually all practical purposes. In that bufer, a name of the type
of the filesystem is stored. It is the same string as the second
column of the content of /proc/filesyste, and it is rarely longer
than 10 bytes.
Relevant support for "-strace" option is also included (files
linux-user/strace.c and linux-user/strace.list).
This patch also fixes failures of LTP tests sysfs01, sysfs02, sysfs03,
sysfs04, sysfs05, and sysfs06, if executed in Qemu user mode.
Signed-off-by: Aleksandar Markovic <aleksandar.markovic@imgtec.com>
---
linux-user/strace.c | 27 +++++++++++++++++++++++++++
linux-user/strace.list | 2 +-
linux-user/syscall.c | 40 +++++++++++++++++++++++++++++++++++++---
3 files changed, 65 insertions(+), 4 deletions(-)
diff --git a/linux-user/strace.c b/linux-user/strace.c
index 1e51360..d9d5858 100644
--- a/linux-user/strace.c
+++ b/linux-user/strace.c
@@ -2220,6 +2220,33 @@ print_kill(const struct syscallname *name,
}
#endif
+#ifdef TARGET_NR_sysfs
+static void
+print_sysfs(const struct syscallname *name,
+ abi_long arg0, abi_long arg1, abi_long arg2,
+ abi_long arg3, abi_long arg4, abi_long arg5)
+{
+ print_syscall_prologue(name);
+ /* arg0 is normally 1, 2, or 3 */
+ switch (arg0) {
+ case 1:
+ print_raw_param("%d", arg0, 0);
+ print_string(arg1, 1);
+ break;
+ case 2:
+ print_raw_param("%d", arg0, 0);
+ print_raw_param("%u", arg1, 0);
+ print_pointer(arg2, 1);
+ break;
+ /* if arg0 is 3, desired output is the same as default */
+ default:
+ print_raw_param("%d", arg0, 1);
+ break;
+ }
+ print_syscall_epilogue(name);
+}
+#endif
+
/*
* An array of all of the syscalls we know about
*/
diff --git a/linux-user/strace.list b/linux-user/strace.list
index 608f7e0..93bc9d0 100644
--- a/linux-user/strace.list
+++ b/linux-user/strace.list
@@ -1476,7 +1476,7 @@
{ TARGET_NR_sys_epoll_wait, "sys_epoll_wait" , NULL, NULL, NULL },
#endif
#ifdef TARGET_NR_sysfs
-{ TARGET_NR_sysfs, "sysfs" , NULL, NULL, NULL },
+{ TARGET_NR_sysfs, "sysfs" , NULL, print_sysfs, NULL },
#endif
#ifdef TARGET_NR_sysinfo
{ TARGET_NR_sysinfo, "sysinfo" , NULL, NULL, NULL },
diff --git a/linux-user/syscall.c b/linux-user/syscall.c
index 0815f30..fe8042c 100644
--- a/linux-user/syscall.c
+++ b/linux-user/syscall.c
@@ -7379,7 +7379,7 @@ static int do_openat(void *cpu_env, int dirfd, const char *pathname, int flags,
if (fake_open->filename) {
const char *tmpdir;
- char filename[PATH_MAX];
+ char filename[128];
int fd, r;
/* create temporary file to map stat to */
@@ -9560,9 +9560,43 @@ abi_long do_syscall(void *cpu_env, int num, abi_long arg1,
case TARGET_NR_bdflush:
goto unimplemented;
#endif
-#ifdef TARGET_NR_sysfs
+#if defined(TARGET_NR_sysfs)
+#define FST_NAME_MAX 32
case TARGET_NR_sysfs:
- goto unimplemented;
+ switch (arg1) {
+ case 1:
+ {
+ p = lock_user_string(arg2);
+ if (!p) {
+ goto efault;
+ }
+ ret = get_errno(syscall(__NR_sysfs, arg1, p));
+ unlock_user(p, arg2, 0);
+ }
+ break;
+ case 2:
+ {
+ char buf[FST_NAME_MAX];
+ memset(buf, 0, FST_NAME_MAX);
+ ret = get_errno(syscall(__NR_sysfs, arg1, arg2, buf));
+ if (!is_error(ret)) {
+ int len = FST_NAME_MAX - 1;
+ if (len > strlen(buf)) {
+ len = strlen(buf);
+ }
+ if (copy_to_user(arg3, buf, len + 1) != 0) {
+ goto efault;
+ }
+ }
+ }
+ break;
+ case 3:
+ ret = get_errno(syscall(__NR_sysfs, arg1));
+ break;
+ default:
+ ret = -EINVAL;
+ }
+ break;
#endif
case TARGET_NR_personality:
ret = get_errno(personality(arg1));
--
2.9.3
^ permalink raw reply related [flat|nested] 12+ messages in thread
* [Qemu-devel] [PATCH 2/4] linux-user: Update termbits.h for Mips32
2016-10-04 18:05 [Qemu-devel] [PATCH 0/4] linux-user: Several mostly Mips related patches Aleksandar Markovic
2016-10-04 18:05 ` [Qemu-devel] [PATCH 1/4] linux-user: Add support for sysfs() syscall Aleksandar Markovic
@ 2016-10-04 18:05 ` Aleksandar Markovic
2016-10-04 18:05 ` [Qemu-devel] [PATCH 3/4] linux-user: Redirect termbits.h for Mips64 to " Aleksandar Markovic
2016-10-04 18:05 ` [Qemu-devel] [PATCH 4/4] linux-user: Fix fadvise64() syscall support " Aleksandar Markovic
3 siblings, 0 replies; 12+ messages in thread
From: Aleksandar Markovic @ 2016-10-04 18:05 UTC (permalink / raw)
To: qemu-devel, riku.voipio, laurent, peter.maydell, aurelien,
Yongbok.Kim, leon.alrae, petar.jovanovic, miodrag.dinic,
aleksandar.rikalo, aleksandar.markovic
From: Aleksandar Markovic <aleksandar.markovic@imgtec.com>
Update linux-user/mips/termbits.h with ioctl definitnions from kernel
file arch/mips/include/uapi/asm/ioctls.h.
Signed-off-by: Aleksandar Markovic <aleksandar.markovic@imgtec.com>
---
linux-user/mips/termbits.h | 12 ++++++++++++
1 file changed, 12 insertions(+)
diff --git a/linux-user/mips/termbits.h b/linux-user/mips/termbits.h
index d3a6cf8..a0bcad0 100644
--- a/linux-user/mips/termbits.h
+++ b/linux-user/mips/termbits.h
@@ -219,8 +219,20 @@ struct target_termios {
#define TARGET_TIOCSBRK 0x5427 /* BSD compatibility */
#define TARGET_TIOCCBRK 0x5428 /* BSD compatibility */
#define TARGET_TIOCGSID 0x7416 /* Return the session ID of FD */
+#define TARGET_TCGETS2 TARGET_IOR('T', 0x2A, struct termios2)
+#define TARGET_TCSETS2 TARGET_IOW('T', 0x2B, struct termios2)
+#define TARGET_TCSETSW2 TARGET_IOW('T', 0x2C, struct termios2)
+#define TARGET_TCSETSF2 TARGET_IOW('T', 0x2D, struct termios2)
+#define TARGET_TIOCGRS485 TARGET_IOR('T', 0x2E, struct serial_rs485)
+#define TARGET_TIOCSRS485 TARGET_IOWR('T', 0x2F, struct serial_rs485)
#define TARGET_TIOCGPTN TARGET_IOR('T',0x30, unsigned int) /* Get Pty Number (of pty-mux device) */
#define TARGET_TIOCSPTLCK TARGET_IOW('T',0x31, int) /* Lock/unlock Pty */
+#define TARGET_TIOCGDEV TARGET_IOR('T', 0x32, unsigned int)
+#define TARGET_TIOCSIG TARGET_IOW('T', 0x36, int)
+#define TARGET_TIOCVHANGUP 0x5437
+#define TARGET_TIOCGPKT TARGET_IOR('T', 0x38, int)
+#define TARGET_TIOCGPTLCK TARGET_IOR('T', 0x39, int)
+#define TARGET_TIOCGEXCL TARGET_IOR('T', 0x40, int)
/* I hope the range from 0x5480 on is free ... */
#define TARGET_TIOCSCTTY 0x5480 /* become controlling tty */
--
2.9.3
^ permalink raw reply related [flat|nested] 12+ messages in thread
* [Qemu-devel] [PATCH 3/4] linux-user: Redirect termbits.h for Mips64 to termbits.h for Mips32
2016-10-04 18:05 [Qemu-devel] [PATCH 0/4] linux-user: Several mostly Mips related patches Aleksandar Markovic
2016-10-04 18:05 ` [Qemu-devel] [PATCH 1/4] linux-user: Add support for sysfs() syscall Aleksandar Markovic
2016-10-04 18:05 ` [Qemu-devel] [PATCH 2/4] linux-user: Update termbits.h for Mips32 Aleksandar Markovic
@ 2016-10-04 18:05 ` Aleksandar Markovic
2016-10-04 18:05 ` [Qemu-devel] [PATCH 4/4] linux-user: Fix fadvise64() syscall support " Aleksandar Markovic
3 siblings, 0 replies; 12+ messages in thread
From: Aleksandar Markovic @ 2016-10-04 18:05 UTC (permalink / raw)
To: qemu-devel, riku.voipio, laurent, peter.maydell, aurelien,
Yongbok.Kim, leon.alrae, petar.jovanovic, miodrag.dinic,
aleksandar.rikalo, aleksandar.markovic
From: Aleksandar Markovic <aleksandar.markovic@imgtec.com>
linux-user/mips64/termbits.h and linux-user/mips/termbits.h
originate from the same files in Linux kernel. There is no plan
to separate original headers in Linux kernel into Mips32 and Mips64
versions any time soon. Therefore, it is better not to have separate
files in Qemu.
This patch makes these two files effectively the same, allowing the
mainenance by changing only a single file. (This ia already done in
the same fashion for some other headers in same directories.)
Signed-off-by: Aleksandar Markovic <aleksandar.markovic@imgtec.com>
---
linux-user/mips64/termbits.h | 245 +------------------------------------------
1 file changed, 1 insertion(+), 244 deletions(-)
diff --git a/linux-user/mips64/termbits.h b/linux-user/mips64/termbits.h
index d3a6cf8..d0a271e 100644
--- a/linux-user/mips64/termbits.h
+++ b/linux-user/mips64/termbits.h
@@ -1,245 +1,2 @@
-/* from asm/termbits.h */
+#include "../mips/termbits.h"
-#define TARGET_NCCS 23
-
-struct target_termios {
- unsigned int c_iflag; /* input mode flags */
- unsigned int c_oflag; /* output mode flags */
- unsigned int c_cflag; /* control mode flags */
- unsigned int c_lflag; /* local mode flags */
- unsigned char c_line; /* line discipline */
- unsigned char c_cc[TARGET_NCCS]; /* control characters */
-};
-
-/* c_iflag bits */
-#define TARGET_IGNBRK 0000001
-#define TARGET_BRKINT 0000002
-#define TARGET_IGNPAR 0000004
-#define TARGET_PARMRK 0000010
-#define TARGET_INPCK 0000020
-#define TARGET_ISTRIP 0000040
-#define TARGET_INLCR 0000100
-#define TARGET_IGNCR 0000200
-#define TARGET_ICRNL 0000400
-#define TARGET_IUCLC 0001000
-#define TARGET_IXON 0002000
-#define TARGET_IXANY 0004000
-#define TARGET_IXOFF 0010000
-#define TARGET_IMAXBEL 0020000
-#define TARGET_IUTF8 0040000
-
-/* c_oflag bits */
-#define TARGET_OPOST 0000001
-#define TARGET_OLCUC 0000002
-#define TARGET_ONLCR 0000004
-#define TARGET_OCRNL 0000010
-#define TARGET_ONOCR 0000020
-#define TARGET_ONLRET 0000040
-#define TARGET_OFILL 0000100
-#define TARGET_OFDEL 0000200
-#define TARGET_NLDLY 0000400
-#define TARGET_NL0 0000000
-#define TARGET_NL1 0000400
-#define TARGET_CRDLY 0003000
-#define TARGET_CR0 0000000
-#define TARGET_CR1 0001000
-#define TARGET_CR2 0002000
-#define TARGET_CR3 0003000
-#define TARGET_TABDLY 0014000
-#define TARGET_TAB0 0000000
-#define TARGET_TAB1 0004000
-#define TARGET_TAB2 0010000
-#define TARGET_TAB3 0014000
-#define TARGET_XTABS 0014000
-#define TARGET_BSDLY 0020000
-#define TARGET_BS0 0000000
-#define TARGET_BS1 0020000
-#define TARGET_VTDLY 0040000
-#define TARGET_VT0 0000000
-#define TARGET_VT1 0040000
-#define TARGET_FFDLY 0100000
-#define TARGET_FF0 0000000
-#define TARGET_FF1 0100000
-
-/* c_cflag bit meaning */
-#define TARGET_CBAUD 0010017
-#define TARGET_B0 0000000 /* hang up */
-#define TARGET_B50 0000001
-#define TARGET_B75 0000002
-#define TARGET_B110 0000003
-#define TARGET_B134 0000004
-#define TARGET_B150 0000005
-#define TARGET_B200 0000006
-#define TARGET_B300 0000007
-#define TARGET_B600 0000010
-#define TARGET_B1200 0000011
-#define TARGET_B1800 0000012
-#define TARGET_B2400 0000013
-#define TARGET_B4800 0000014
-#define TARGET_B9600 0000015
-#define TARGET_B19200 0000016
-#define TARGET_B38400 0000017
-#define TARGET_EXTA B19200
-#define TARGET_EXTB B38400
-#define TARGET_CSIZE 0000060
-#define TARGET_CS5 0000000
-#define TARGET_CS6 0000020
-#define TARGET_CS7 0000040
-#define TARGET_CS8 0000060
-#define TARGET_CSTOPB 0000100
-#define TARGET_CREAD 0000200
-#define TARGET_PARENB 0000400
-#define TARGET_PARODD 0001000
-#define TARGET_HUPCL 0002000
-#define TARGET_CLOCAL 0004000
-#define TARGET_CBAUDEX 0010000
-#define TARGET_BOTHER 0010000
-#define TARGET_B57600 0010001
-#define TARGET_B115200 0010002
-#define TARGET_B230400 0010003
-#define TARGET_B460800 0010004
-#define TARGET_B500000 0010005
-#define TARGET_B576000 0010006
-#define TARGET_B921600 0010007
-#define TARGET_B1000000 0010010
-#define TARGET_B1152000 0010011
-#define TARGET_B1500000 0010012
-#define TARGET_B2000000 0010013
-#define TARGET_B2500000 0010014
-#define TARGET_B3000000 0010015
-#define TARGET_B3500000 0010016
-#define TARGET_B4000000 0010017
-#define TARGET_CIBAUD 002003600000 /* input baud rate (not used) */
-#define TARGET_CMSPAR 010000000000 /* mark or space (stick) parity */
-#define TARGET_CRTSCTS 020000000000 /* flow control */
-
-/* c_lflag bits */
-#define TARGET_ISIG 0000001
-#define TARGET_ICANON 0000002
-#define TARGET_XCASE 0000004
-#define TARGET_ECHO 0000010
-#define TARGET_ECHOE 0000020
-#define TARGET_ECHOK 0000040
-#define TARGET_ECHONL 0000100
-#define TARGET_NOFLSH 0000200
-#define TARGET_IEXTEN 0000400
-#define TARGET_ECHOCTL 0001000
-#define TARGET_ECHOPRT 0002000
-#define TARGET_ECHOKE 0004000
-#define TARGET_FLUSHO 0010000
-#define TARGET_PENDIN 0040000
-#define TARGET_TOSTOP 0100000
-#define TARGET_ITOSTOP TARGET_TOSTOP
-
-/* c_cc character offsets */
-#define TARGET_VINTR 0
-#define TARGET_VQUIT 1
-#define TARGET_VERASE 2
-#define TARGET_VKILL 3
-#define TARGET_VMIN 4
-#define TARGET_VTIME 5
-#define TARGET_VEOL2 6
-#define TARGET_VSWTC 7
-#define TARGET_VSTART 8
-#define TARGET_VSTOP 9
-#define TARGET_VSUSP 10
-/* VDSUSP not supported */
-#define TARGET_VREPRINT 12
-#define TARGET_VDISCARD 13
-#define TARGET_VWERASE 14
-#define TARGET_VLNEXT 15
-#define TARGET_VEOF 16
-#define TARGET_VEOL 17
-
-/* ioctls */
-
-#define TARGET_TCGETA 0x5401
-#define TARGET_TCSETA 0x5402 /* Clashes with SNDCTL_TMR_START sound ioctl */
-#define TARGET_TCSETAW 0x5403
-#define TARGET_TCSETAF 0x5404
-
-#define TARGET_TCSBRK 0x5405
-#define TARGET_TCXONC 0x5406
-#define TARGET_TCFLSH 0x5407
-
-#define TARGET_TCGETS 0x540d
-#define TARGET_TCSETS 0x540e
-#define TARGET_TCSETSW 0x540f
-#define TARGET_TCSETSF 0x5410
-
-#define TARGET_TIOCEXCL 0x740d /* set exclusive use of tty */
-#define TARGET_TIOCNXCL 0x740e /* reset exclusive use of tty */
-#define TARGET_TIOCOUTQ 0x7472 /* output queue size */
-#define TARGET_TIOCSTI 0x5472 /* simulate terminal input */
-#define TARGET_TIOCMGET 0x741d /* get all modem bits */
-#define TARGET_TIOCMBIS 0x741b /* bis modem bits */
-#define TARGET_TIOCMBIC 0x741c /* bic modem bits */
-#define TARGET_TIOCMSET 0x741a /* set all modem bits */
-#define TARGET_TIOCPKT 0x5470 /* pty: set/clear packet mode */
-#define TARGET_TIOCPKT_DATA 0x00 /* data packet */
-#define TARGET_TIOCPKT_FLUSHREAD 0x01 /* flush packet */
-#define TARGET_TIOCPKT_FLUSHWRITE 0x02 /* flush packet */
-#define TARGET_TIOCPKT_STOP 0x04 /* stop output */
-#define TARGET_TIOCPKT_START 0x08 /* start output */
-#define TARGET_TIOCPKT_NOSTOP 0x10 /* no more ^S, ^Q */
-#define TARGET_TIOCPKT_DOSTOP 0x20 /* now do ^S ^Q */
-/* #define TIOCPKT_IOCTL 0x40 state change of pty driver */
-#define TARGET_TIOCSWINSZ TARGET_IOW('t', 103, struct winsize) /* set window size */
-#define TARGET_TIOCGWINSZ TARGET_IOR('t', 104, struct winsize) /* get window size */
-#define TARGET_TIOCNOTTY 0x5471 /* void tty association */
-#define TARGET_TIOCSETD 0x7401
-#define TARGET_TIOCGETD 0x7400
-
-#define TARGET_FIOCLEX 0x6601
-#define TARGET_FIONCLEX 0x6602
-#define TARGET_FIOASYNC 0x667d
-#define TARGET_FIONBIO 0x667e
-#define TARGET_FIOQSIZE 0x667f
-
-#define TARGET_TIOCGLTC 0x7474 /* get special local chars */
-#define TARGET_TIOCSLTC 0x7475 /* set special local chars */
-#define TARGET_TIOCSPGRP TARGET_IOW('t', 118, int) /* set pgrp of tty */
-#define TARGET_TIOCGPGRP TARGET_IOR('t', 119, int) /* get pgrp of tty */
-#define TARGET_TIOCCONS TARGET_IOW('t', 120, int) /* become virtual console */
-
-#define TARGET_FIONREAD 0x467f
-#define TARGET_TIOCINQ TARGET_FIONREAD
-
-#define TARGET_TIOCGETP 0x7408
-#define TARGET_TIOCSETP 0x7409
-#define TARGET_TIOCSETN 0x740a /* TIOCSETP wo flush */
-
-/* #define TARGET_TIOCSETA TARGET_IOW('t', 20, struct termios) set termios struct */
-/* #define TARGET_TIOCSETAW TARGET_IOW('t', 21, struct termios) drain output, set */
-/* #define TARGET_TIOCSETAF TARGET_IOW('t', 22, struct termios) drn out, fls in, set */
-/* #define TARGET_TIOCGETD TARGET_IOR('t', 26, int) get line discipline */
-/* #define TARGET_TIOCSETD TARGET_IOW('t', 27, int) set line discipline */
- /* 127-124 compat */
-
-#define TARGET_TIOCSBRK 0x5427 /* BSD compatibility */
-#define TARGET_TIOCCBRK 0x5428 /* BSD compatibility */
-#define TARGET_TIOCGSID 0x7416 /* Return the session ID of FD */
-#define TARGET_TIOCGPTN TARGET_IOR('T',0x30, unsigned int) /* Get Pty Number (of pty-mux device) */
-#define TARGET_TIOCSPTLCK TARGET_IOW('T',0x31, int) /* Lock/unlock Pty */
-
-/* I hope the range from 0x5480 on is free ... */
-#define TARGET_TIOCSCTTY 0x5480 /* become controlling tty */
-#define TARGET_TIOCGSOFTCAR 0x5481
-#define TARGET_TIOCSSOFTCAR 0x5482
-#define TARGET_TIOCLINUX 0x5483
-#define TARGET_TIOCGSERIAL 0x5484
-#define TARGET_TIOCSSERIAL 0x5485
-#define TARGET_TCSBRKP 0x5486 /* Needed for POSIX tcsendbreak() */
-#define TARGET_TIOCSERCONFIG 0x5488
-#define TARGET_TIOCSERGWILD 0x5489
-#define TARGET_TIOCSERSWILD 0x548a
-#define TARGET_TIOCGLCKTRMIOS 0x548b
-#define TARGET_TIOCSLCKTRMIOS 0x548c
-#define TARGET_TIOCSERGSTRUCT 0x548d /* For debugging only */
-#define TARGET_TIOCSERGETLSR 0x548e /* Get line status register */
-#define TARGET_TIOCSERGETMULTI 0x548f /* Get multiport config */
-#define TARGET_TIOCSERSETMULTI 0x5490 /* Set multiport config */
-#define TARGET_TIOCMIWAIT 0x5491 /* wait for a change on serial input line(s) */
-#define TARGET_TIOCGICOUNT 0x5492 /* read serial port inline interrupt counts */
-#define TARGET_TIOCGHAYESESP 0x5493 /* Get Hayes ESP configuration */
-#define TARGET_TIOCSHAYESESP 0x5494 /* Set Hayes ESP configuration */
--
2.9.3
^ permalink raw reply related [flat|nested] 12+ messages in thread
* [Qemu-devel] [PATCH 4/4] linux-user: Fix fadvise64() syscall support for Mips32
2016-10-04 18:05 [Qemu-devel] [PATCH 0/4] linux-user: Several mostly Mips related patches Aleksandar Markovic
` (2 preceding siblings ...)
2016-10-04 18:05 ` [Qemu-devel] [PATCH 3/4] linux-user: Redirect termbits.h for Mips64 to " Aleksandar Markovic
@ 2016-10-04 18:05 ` Aleksandar Markovic
2016-10-04 20:42 ` Peter Maydell
3 siblings, 1 reply; 12+ messages in thread
From: Aleksandar Markovic @ 2016-10-04 18:05 UTC (permalink / raw)
To: qemu-devel, riku.voipio, laurent, peter.maydell, aurelien,
Yongbok.Kim, leon.alrae, petar.jovanovic, miodrag.dinic,
aleksandar.rikalo, aleksandar.markovic
From: Aleksandar Markovic <aleksandar.markovic@imgtec.com>
By looking at the file arch/mips/kernel/sys.S in Linux kernel,
it can be deduced that, for Mips32 platform, syscall
corresponding to number _NR_fadvise64 translates to kernel
function sys_fadvise64_64, and that argument layout is as
follows:
0 32 0 32
+----------------+----------------+
(arg1) | fd | __pad | (arg2)
+----------------+----------------+
(arg3) | buffer | (arg4)
+----------------+----------------+
(arg5) | len | (arg6)
+----------------+----------------+
(arg7) | advise | not used | (arg8)
+----------------+----------------+
This can be deduced from glibc code as well, and relevant commits
in linux kernel and glibc.
Mips32 uniqness is that it does not define _NR_fadvise64_64,
however its fadvise64 implemantation is identical to
fadvise64_64 impleanentation on most other platforms.
This patch also fixes the failure LTP test posix_fadvise03, if
executed on Qemu-emulated Mips32 platform (user mode).
Signed-off-by: Aleksandar Rikalo <aleksandar.rikalo@imgtec.com>
Signed-off-by: Miroslav Tisma <miroslav.tisma@imgtec.com>
Signed-off-by: Aleksandar Markovic <aleksandar.markovic@imgtec.com>
---
linux-user/syscall.c | 8 ++++++++
1 file changed, 8 insertions(+)
diff --git a/linux-user/syscall.c b/linux-user/syscall.c
index fe8042c..a246bf1 100644
--- a/linux-user/syscall.c
+++ b/linux-user/syscall.c
@@ -10929,6 +10929,13 @@ abi_long do_syscall(void *cpu_env, int num, abi_long arg1,
#ifdef TARGET_NR_fadvise64
case TARGET_NR_fadvise64:
+#ifdef TARGET_MIPS
+ ret = -host_to_target_errno(
+ posix_fadvise64(arg1,
+ target_offset64(arg3, arg4),
+ target_offset64(arg5, arg6),
+ arg7));
+#else
/* 5 args: fd, offset (high, low), len, advice */
if (regpairs_aligned(cpu_env)) {
/* offset is in (3,4), len in 5 and advice in 6 */
@@ -10940,6 +10947,7 @@ abi_long do_syscall(void *cpu_env, int num, abi_long arg1,
ret = -host_to_target_errno(posix_fadvise(arg1,
target_offset64(arg2, arg3),
arg4, arg5));
+#endif
break;
#endif
--
2.9.3
^ permalink raw reply related [flat|nested] 12+ messages in thread
* Re: [Qemu-devel] [PATCH 1/4] linux-user: Add support for sysfs() syscall
2016-10-04 18:05 ` [Qemu-devel] [PATCH 1/4] linux-user: Add support for sysfs() syscall Aleksandar Markovic
@ 2016-10-04 20:35 ` Peter Maydell
2016-10-04 21:03 ` Aleksandar Markovic
0 siblings, 1 reply; 12+ messages in thread
From: Peter Maydell @ 2016-10-04 20:35 UTC (permalink / raw)
To: Aleksandar Markovic
Cc: QEMU Developers, Riku Voipio, Laurent Vivier, Aurelien Jarno,
Yongbok Kim, Leon Alrae, Petar Jovanovic, Miodrag Dinic,
aleksandar.rikalo, Aleksandar Markovic
On 4 October 2016 at 11:05, Aleksandar Markovic
<aleksandar.markovic@rt-rk.com> wrote:
> From: Aleksandar Markovic <aleksandar.markovic@imgtec.com>
>
> This patch implements Qemu user mode sysfs() syscall support.
>
> Syscall sysfs() involves returning information about the filesystem types
> currently present in the kernel, and can operate in three distinct flavors,
> depending on its first argument.
Are you implementing this because you have an actual need for
it, or just for LTP coverage purposes? (The manpage says
it's obsolete. Either answer is fine, I'm just curious.)
> Its specific is that its declaration is threefold:
>
> int sysfs(int option, const char *fsname);
> int sysfs(int option, unsigned int fs_index, char *buf);
> int sysfs(int option);
>
> Its implementation in Linux kernel is at fs/filesystems.c, line 184.
>
> The implementation in Qemu user mode is based on invocation of host's
> sysfs(), and its key part is in the correspondent case segment of the
"corresponding"
> main switch statement of the function do_syscall(), in file
> linux-user/syscalls.c. All necessary conversions of data structures
> from target to host and from host to target are covered. Based on
> the value of the first argument, three cases are distinguished, and
> such conversions are implemented separately for each case.
>
> Buffer needed for the second cases has size defined with preprocessor
> constant FST_NAME_MAX, that is set to 32. .This is good enough for
Stray '.'
> virtually all practical purposes. In that bufer, a name of the type
"buffer"
> of the filesystem is stored. It is the same string as the second
> column of the content of /proc/filesyste, and it is rarely longer
"filesystems"
> than 10 bytes.
>
> Relevant support for "-strace" option is also included (files
> linux-user/strace.c and linux-user/strace.list).
>
> This patch also fixes failures of LTP tests sysfs01, sysfs02, sysfs03,
> sysfs04, sysfs05, and sysfs06, if executed in Qemu user mode.
>
> Signed-off-by: Aleksandar Markovic <aleksandar.markovic@imgtec.com>
> ---
> linux-user/strace.c | 27 +++++++++++++++++++++++++++
> linux-user/strace.list | 2 +-
> linux-user/syscall.c | 40 +++++++++++++++++++++++++++++++++++++---
> 3 files changed, 65 insertions(+), 4 deletions(-)
>
> diff --git a/linux-user/strace.c b/linux-user/strace.c
> index 1e51360..d9d5858 100644
> --- a/linux-user/strace.c
> +++ b/linux-user/strace.c
> @@ -2220,6 +2220,33 @@ print_kill(const struct syscallname *name,
> }
> #endif
>
> +#ifdef TARGET_NR_sysfs
> +static void
> +print_sysfs(const struct syscallname *name,
> + abi_long arg0, abi_long arg1, abi_long arg2,
> + abi_long arg3, abi_long arg4, abi_long arg5)
> +{
> + print_syscall_prologue(name);
> + /* arg0 is normally 1, 2, or 3 */
> + switch (arg0) {
> + case 1:
> + print_raw_param("%d", arg0, 0);
> + print_string(arg1, 1);
> + break;
> + case 2:
> + print_raw_param("%d", arg0, 0);
> + print_raw_param("%u", arg1, 0);
> + print_pointer(arg2, 1);
> + break;
> + /* if arg0 is 3, desired output is the same as default */
> + default:
> + print_raw_param("%d", arg0, 1);
> + break;
> + }
> + print_syscall_epilogue(name);
> +}
> +#endif
> +
> /*
> * An array of all of the syscalls we know about
> */
> diff --git a/linux-user/strace.list b/linux-user/strace.list
> index 608f7e0..93bc9d0 100644
> --- a/linux-user/strace.list
> +++ b/linux-user/strace.list
> @@ -1476,7 +1476,7 @@
> { TARGET_NR_sys_epoll_wait, "sys_epoll_wait" , NULL, NULL, NULL },
> #endif
> #ifdef TARGET_NR_sysfs
> -{ TARGET_NR_sysfs, "sysfs" , NULL, NULL, NULL },
> +{ TARGET_NR_sysfs, "sysfs" , NULL, print_sysfs, NULL },
> #endif
> #ifdef TARGET_NR_sysinfo
> { TARGET_NR_sysinfo, "sysinfo" , NULL, NULL, NULL },
> diff --git a/linux-user/syscall.c b/linux-user/syscall.c
> index 0815f30..fe8042c 100644
> --- a/linux-user/syscall.c
> +++ b/linux-user/syscall.c
> @@ -7379,7 +7379,7 @@ static int do_openat(void *cpu_env, int dirfd, const char *pathname, int flags,
>
> if (fake_open->filename) {
> const char *tmpdir;
> - char filename[PATH_MAX];
> + char filename[128];
> int fd, r;
>
> /* create temporary file to map stat to */
This looks like an accidental change?
> @@ -9560,9 +9560,43 @@ abi_long do_syscall(void *cpu_env, int num, abi_long arg1,
> case TARGET_NR_bdflush:
> goto unimplemented;
> #endif
> -#ifdef TARGET_NR_sysfs
> +#if defined(TARGET_NR_sysfs)
> +#define FST_NAME_MAX 32
> case TARGET_NR_sysfs:
> - goto unimplemented;
> + switch (arg1) {
> + case 1:
> + {
> + p = lock_user_string(arg2);
> + if (!p) {
> + goto efault;
> + }
> + ret = get_errno(syscall(__NR_sysfs, arg1, p));
> + unlock_user(p, arg2, 0);
> + }
> + break;
> + case 2:
> + {
> + char buf[FST_NAME_MAX];
> + memset(buf, 0, FST_NAME_MAX);
It would be better to just get the host sysfs() to copy directly
into the guest memory: it saves allocating a temp buffer and it
means that if the name is unexpectedly long it overruns the
guest's buffer rather than something on the QEMU stack.
> + ret = get_errno(syscall(__NR_sysfs, arg1, arg2, buf));
> + if (!is_error(ret)) {
> + int len = FST_NAME_MAX - 1;
> + if (len > strlen(buf)) {
> + len = strlen(buf);
> + }
> + if (copy_to_user(arg3, buf, len + 1) != 0) {
> + goto efault;
> + }
> + }
> + }
> + break;
> + case 3:
> + ret = get_errno(syscall(__NR_sysfs, arg1));
> + break;
> + default:
> + ret = -EINVAL;
This should be a target errno, not a host one.
> + }
> + break;
> #endif
> case TARGET_NR_personality:
> ret = get_errno(personality(arg1));
> --
> 2.9.3
>
thanks
-- PMM
^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: [Qemu-devel] [PATCH 4/4] linux-user: Fix fadvise64() syscall support for Mips32
2016-10-04 18:05 ` [Qemu-devel] [PATCH 4/4] linux-user: Fix fadvise64() syscall support " Aleksandar Markovic
@ 2016-10-04 20:42 ` Peter Maydell
2016-10-04 20:58 ` Aleksandar Markovic
0 siblings, 1 reply; 12+ messages in thread
From: Peter Maydell @ 2016-10-04 20:42 UTC (permalink / raw)
To: Aleksandar Markovic
Cc: QEMU Developers, Riku Voipio, Laurent Vivier, Aurelien Jarno,
Yongbok Kim, Leon Alrae, Petar Jovanovic, Miodrag Dinic,
aleksandar.rikalo, Aleksandar Markovic
On 4 October 2016 at 11:05, Aleksandar Markovic
<aleksandar.markovic@rt-rk.com> wrote:
> From: Aleksandar Markovic <aleksandar.markovic@imgtec.com>
>
> By looking at the file arch/mips/kernel/sys.S in Linux kernel,
There doesn't appear to be a file by that name:
http://lxr.free-electrons.com/source/arch/mips/kernel/
> it can be deduced that, for Mips32 platform, syscall
> corresponding to number _NR_fadvise64 translates to kernel
> function sys_fadvise64_64, and that argument layout is as
> follows:
> 0 32 0 32
> +----------------+----------------+
> (arg1) | fd | __pad | (arg2)
> +----------------+----------------+
> (arg3) | buffer | (arg4)
> +----------------+----------------+
> (arg5) | len | (arg6)
> +----------------+----------------+
> (arg7) | advise | not used | (arg8)
> +----------------+----------------+
>
> This can be deduced from glibc code as well, and relevant commits
> in linux kernel and glibc.
>
> Mips32 uniqness is that it does not define _NR_fadvise64_64,
> however its fadvise64 implemantation is identical to
> fadvise64_64 impleanentation on most other platforms.
>
> This patch also fixes the failure LTP test posix_fadvise03, if
> executed on Qemu-emulated Mips32 platform (user mode).
We could alternatively fix this by having
#define TARGET_NR_fadvise64_64 (TARGET_NR_Linux + 254)
in linux-user/mips/syscall_nr.h rather than
#define TARGET_NR_fadvise64 (TARGET_NR_Linux + 254)
right?
thanks
-- PMM
^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: [Qemu-devel] [PATCH 4/4] linux-user: Fix fadvise64() syscall support for Mips32
2016-10-04 20:42 ` Peter Maydell
@ 2016-10-04 20:58 ` Aleksandar Markovic
2016-10-05 10:02 ` Aleksandar Markovic
0 siblings, 1 reply; 12+ messages in thread
From: Aleksandar Markovic @ 2016-10-04 20:58 UTC (permalink / raw)
To: Peter Maydell, Aleksandar Markovic
Cc: QEMU Developers, Riku Voipio, Laurent Vivier, Aurelien Jarno,
Yongbok Kim, Leon Alrae, Petar Jovanovic, Miodrag Dinic,
Aleksandar Rikalo
Hi, Peter,
The file in question is arch/mips/kernel/scall32-o32.S. I'll correct this in next version. Thank for the reviewing this patch. I am going to answer your second question tomorrow. The quick answer is actually yes, but there are caveats, that I will explain tomorrow.
Respectfully,
Aleksandar
________________________________________
From: Peter Maydell [peter.maydell@linaro.org]
Sent: Tuesday, October 04, 2016 1:42 PM
To: Aleksandar Markovic
Cc: QEMU Developers; Riku Voipio; Laurent Vivier; Aurelien Jarno; Yongbok Kim; Leon Alrae; Petar Jovanovic; Miodrag Dinic; Aleksandar Rikalo; Aleksandar Markovic
Subject: Re: [PATCH 4/4] linux-user: Fix fadvise64() syscall support for Mips32
On 4 October 2016 at 11:05, Aleksandar Markovic
<aleksandar.markovic@rt-rk.com> wrote:
> From: Aleksandar Markovic <aleksandar.markovic@imgtec.com>
>
> By looking at the file arch/mips/kernel/sys.S in Linux kernel,
There doesn't appear to be a file by that name:
http://lxr.free-electrons.com/source/arch/mips/kernel/
> it can be deduced that, for Mips32 platform, syscall
> corresponding to number _NR_fadvise64 translates to kernel
> function sys_fadvise64_64, and that argument layout is as
> follows:
> 0 32 0 32
> +----------------+----------------+
> (arg1) | fd | __pad | (arg2)
> +----------------+----------------+
> (arg3) | buffer | (arg4)
> +----------------+----------------+
> (arg5) | len | (arg6)
> +----------------+----------------+
> (arg7) | advise | not used | (arg8)
> +----------------+----------------+
>
> This can be deduced from glibc code as well, and relevant commits
> in linux kernel and glibc.
>
> Mips32 uniqness is that it does not define _NR_fadvise64_64,
> however its fadvise64 implemantation is identical to
> fadvise64_64 impleanentation on most other platforms.
>
> This patch also fixes the failure LTP test posix_fadvise03, if
> executed on Qemu-emulated Mips32 platform (user mode).
We could alternatively fix this by having
#define TARGET_NR_fadvise64_64 (TARGET_NR_Linux + 254)
in linux-user/mips/syscall_nr.h rather than
#define TARGET_NR_fadvise64 (TARGET_NR_Linux + 254)
right?
thanks
-- PMM
^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: [Qemu-devel] [PATCH 1/4] linux-user: Add support for sysfs() syscall
2016-10-04 20:35 ` Peter Maydell
@ 2016-10-04 21:03 ` Aleksandar Markovic
0 siblings, 0 replies; 12+ messages in thread
From: Aleksandar Markovic @ 2016-10-04 21:03 UTC (permalink / raw)
To: Peter Maydell, Aleksandar Markovic
Cc: QEMU Developers, Riku Voipio, Laurent Vivier, Aurelien Jarno,
Yongbok Kim, Leon Alrae, Petar Jovanovic, Miodrag Dinic,
Aleksandar Rikalo
Hello, Peter
I truly appreciate your review. The reason for this patch is LTP only, as far as I know. I will address all your other concerns in the next version of the patch.
Thanks,
Aleksandar
________________________________________
From: Peter Maydell [peter.maydell@linaro.org]
Sent: Tuesday, October 04, 2016 1:35 PM
To: Aleksandar Markovic
Cc: QEMU Developers; Riku Voipio; Laurent Vivier; Aurelien Jarno; Yongbok Kim; Leon Alrae; Petar Jovanovic; Miodrag Dinic; Aleksandar Rikalo; Aleksandar Markovic
Subject: Re: [PATCH 1/4] linux-user: Add support for sysfs() syscall
On 4 October 2016 at 11:05, Aleksandar Markovic
<aleksandar.markovic@rt-rk.com> wrote:
> From: Aleksandar Markovic <aleksandar.markovic@imgtec.com>
>
> This patch implements Qemu user mode sysfs() syscall support.
>
> Syscall sysfs() involves returning information about the filesystem types
> currently present in the kernel, and can operate in three distinct flavors,
> depending on its first argument.
Are you implementing this because you have an actual need for
it, or just for LTP coverage purposes? (The manpage says
it's obsolete. Either answer is fine, I'm just curious.)
> Its specific is that its declaration is threefold:
>
> int sysfs(int option, const char *fsname);
> int sysfs(int option, unsigned int fs_index, char *buf);
> int sysfs(int option);
>
> Its implementation in Linux kernel is at fs/filesystems.c, line 184.
>
> The implementation in Qemu user mode is based on invocation of host's
> sysfs(), and its key part is in the correspondent case segment of the
"corresponding"
> main switch statement of the function do_syscall(), in file
> linux-user/syscalls.c. All necessary conversions of data structures
> from target to host and from host to target are covered. Based on
> the value of the first argument, three cases are distinguished, and
> such conversions are implemented separately for each case.
>
> Buffer needed for the second cases has size defined with preprocessor
> constant FST_NAME_MAX, that is set to 32. .This is good enough for
Stray '.'
> virtually all practical purposes. In that bufer, a name of the type
"buffer"
> of the filesystem is stored. It is the same string as the second
> column of the content of /proc/filesyste, and it is rarely longer
"filesystems"
> than 10 bytes.
>
> Relevant support for "-strace" option is also included (files
> linux-user/strace.c and linux-user/strace.list).
>
> This patch also fixes failures of LTP tests sysfs01, sysfs02, sysfs03,
> sysfs04, sysfs05, and sysfs06, if executed in Qemu user mode.
>
> Signed-off-by: Aleksandar Markovic <aleksandar.markovic@imgtec.com>
> ---
> linux-user/strace.c | 27 +++++++++++++++++++++++++++
> linux-user/strace.list | 2 +-
> linux-user/syscall.c | 40 +++++++++++++++++++++++++++++++++++++---
> 3 files changed, 65 insertions(+), 4 deletions(-)
>
> diff --git a/linux-user/strace.c b/linux-user/strace.c
> index 1e51360..d9d5858 100644
> --- a/linux-user/strace.c
> +++ b/linux-user/strace.c
> @@ -2220,6 +2220,33 @@ print_kill(const struct syscallname *name,
> }
> #endif
>
> +#ifdef TARGET_NR_sysfs
> +static void
> +print_sysfs(const struct syscallname *name,
> + abi_long arg0, abi_long arg1, abi_long arg2,
> + abi_long arg3, abi_long arg4, abi_long arg5)
> +{
> + print_syscall_prologue(name);
> + /* arg0 is normally 1, 2, or 3 */
> + switch (arg0) {
> + case 1:
> + print_raw_param("%d", arg0, 0);
> + print_string(arg1, 1);
> + break;
> + case 2:
> + print_raw_param("%d", arg0, 0);
> + print_raw_param("%u", arg1, 0);
> + print_pointer(arg2, 1);
> + break;
> + /* if arg0 is 3, desired output is the same as default */
> + default:
> + print_raw_param("%d", arg0, 1);
> + break;
> + }
> + print_syscall_epilogue(name);
> +}
> +#endif
> +
> /*
> * An array of all of the syscalls we know about
> */
> diff --git a/linux-user/strace.list b/linux-user/strace.list
> index 608f7e0..93bc9d0 100644
> --- a/linux-user/strace.list
> +++ b/linux-user/strace.list
> @@ -1476,7 +1476,7 @@
> { TARGET_NR_sys_epoll_wait, "sys_epoll_wait" , NULL, NULL, NULL },
> #endif
> #ifdef TARGET_NR_sysfs
> -{ TARGET_NR_sysfs, "sysfs" , NULL, NULL, NULL },
> +{ TARGET_NR_sysfs, "sysfs" , NULL, print_sysfs, NULL },
> #endif
> #ifdef TARGET_NR_sysinfo
> { TARGET_NR_sysinfo, "sysinfo" , NULL, NULL, NULL },
> diff --git a/linux-user/syscall.c b/linux-user/syscall.c
> index 0815f30..fe8042c 100644
> --- a/linux-user/syscall.c
> +++ b/linux-user/syscall.c
> @@ -7379,7 +7379,7 @@ static int do_openat(void *cpu_env, int dirfd, const char *pathname, int flags,
>
> if (fake_open->filename) {
> const char *tmpdir;
> - char filename[PATH_MAX];
> + char filename[128];
> int fd, r;
>
> /* create temporary file to map stat to */
This looks like an accidental change?
> @@ -9560,9 +9560,43 @@ abi_long do_syscall(void *cpu_env, int num, abi_long arg1,
> case TARGET_NR_bdflush:
> goto unimplemented;
> #endif
> -#ifdef TARGET_NR_sysfs
> +#if defined(TARGET_NR_sysfs)
> +#define FST_NAME_MAX 32
> case TARGET_NR_sysfs:
> - goto unimplemented;
> + switch (arg1) {
> + case 1:
> + {
> + p = lock_user_string(arg2);
> + if (!p) {
> + goto efault;
> + }
> + ret = get_errno(syscall(__NR_sysfs, arg1, p));
> + unlock_user(p, arg2, 0);
> + }
> + break;
> + case 2:
> + {
> + char buf[FST_NAME_MAX];
> + memset(buf, 0, FST_NAME_MAX);
It would be better to just get the host sysfs() to copy directly
into the guest memory: it saves allocating a temp buffer and it
means that if the name is unexpectedly long it overruns the
guest's buffer rather than something on the QEMU stack.
> + ret = get_errno(syscall(__NR_sysfs, arg1, arg2, buf));
> + if (!is_error(ret)) {
> + int len = FST_NAME_MAX - 1;
> + if (len > strlen(buf)) {
> + len = strlen(buf);
> + }
> + if (copy_to_user(arg3, buf, len + 1) != 0) {
> + goto efault;
> + }
> + }
> + }
> + break;
> + case 3:
> + ret = get_errno(syscall(__NR_sysfs, arg1));
> + break;
> + default:
> + ret = -EINVAL;
This should be a target errno, not a host one.
> + }
> + break;
> #endif
> case TARGET_NR_personality:
> ret = get_errno(personality(arg1));
> --
> 2.9.3
>
thanks
-- PMM
^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: [Qemu-devel] [PATCH 4/4] linux-user: Fix fadvise64() syscall support for Mips32
2016-10-04 20:58 ` Aleksandar Markovic
@ 2016-10-05 10:02 ` Aleksandar Markovic
2016-10-05 12:38 ` Peter Maydell
0 siblings, 1 reply; 12+ messages in thread
From: Aleksandar Markovic @ 2016-10-05 10:02 UTC (permalink / raw)
To: Peter Maydell, Aleksandar Markovic
Cc: Riku Voipio, QEMU Developers, Laurent Vivier, Miodrag Dinic,
Aleksandar Rikalo, Petar Jovanovic, Yongbok Kim, Leon Alrae,
Aurelien Jarno
Yes, we could replace TARGET_NR_fadvise64 with TARGET_NR_fadvise64_64 in Mips32 syscall numbers definition list, and expect the same effect. I just prefer to leave original symbols for syscall numbers, as they are defined in kernel headers, unless there is a compelling reason not to do it.
But, there is more. Code that handles TARGET_NR_fadvise64_64 in Qemu utilizes host's posix_advise(). It looks to me that this is just plain incorrect. It won't work correctly on 32 bit hosts, with respect to arguments of posix_advise() that are 32-bit (while 64-bit value is passed to them) Instead, posix_fadvise64() should have been used, IMHO.
Please let me know if you think I should do anything additionally in relation to this matter.
Thanks again!
Aleksandar
______________________________________
From: Qemu-devel [qemu-devel-bounces+aleksandar.markovic=imgtec.com@nongnu.org] on behalf of Aleksandar Markovic [Aleksandar.Markovic@imgtec.com]
Sent: Tuesday, October 04, 2016 1:58 PM
To: Peter Maydell; Aleksandar Markovic
Cc: Riku Voipio; QEMU Developers; Laurent Vivier; Miodrag Dinic; Aleksandar Rikalo; Petar Jovanovic; Yongbok Kim; Leon Alrae; Aurelien Jarno
Subject: Re: [Qemu-devel] [PATCH 4/4] linux-user: Fix fadvise64() syscall support for Mips32
Hi, Peter,
The file in question is arch/mips/kernel/scall32-o32.S. I'll correct this in next version. Thank for the reviewing this patch. I am going to answer your second question tomorrow. The quick answer is actually yes, but there are caveats, that I will explain tomorrow.
Respectfully,
Aleksandar
________________________________________
From: Peter Maydell [peter.maydell@linaro.org]
Sent: Tuesday, October 04, 2016 1:42 PM
To: Aleksandar Markovic
Cc: QEMU Developers; Riku Voipio; Laurent Vivier; Aurelien Jarno; Yongbok Kim; Leon Alrae; Petar Jovanovic; Miodrag Dinic; Aleksandar Rikalo; Aleksandar Markovic
Subject: Re: [PATCH 4/4] linux-user: Fix fadvise64() syscall support for Mips32
On 4 October 2016 at 11:05, Aleksandar Markovic
<aleksandar.markovic@rt-rk.com> wrote:
> From: Aleksandar Markovic <aleksandar.markovic@imgtec.com>
>
> By looking at the file arch/mips/kernel/sys.S in Linux kernel,
There doesn't appear to be a file by that name:
http://lxr.free-electrons.com/source/arch/mips/kernel/
> it can be deduced that, for Mips32 platform, syscall
> corresponding to number _NR_fadvise64 translates to kernel
> function sys_fadvise64_64, and that argument layout is as
> follows:
> 0 32 0 32
> +----------------+----------------+
> (arg1) | fd | __pad | (arg2)
> +----------------+----------------+
> (arg3) | buffer | (arg4)
> +----------------+----------------+
> (arg5) | len | (arg6)
> +----------------+----------------+
> (arg7) | advise | not used | (arg8)
> +----------------+----------------+
>
> This can be deduced from glibc code as well, and relevant commits
> in linux kernel and glibc.
>
> Mips32 uniqness is that it does not define _NR_fadvise64_64,
> however its fadvise64 implemantation is identical to
> fadvise64_64 impleanentation on most other platforms.
>
> This patch also fixes the failure LTP test posix_fadvise03, if
> executed on Qemu-emulated Mips32 platform (user mode).
We could alternatively fix this by having
#define TARGET_NR_fadvise64_64 (TARGET_NR_Linux + 254)
in linux-user/mips/syscall_nr.h rather than
#define TARGET_NR_fadvise64 (TARGET_NR_Linux + 254)
right?
thanks
-- PMM
^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: [Qemu-devel] [PATCH 4/4] linux-user: Fix fadvise64() syscall support for Mips32
2016-10-05 10:02 ` Aleksandar Markovic
@ 2016-10-05 12:38 ` Peter Maydell
2016-10-06 11:03 ` Aleksandar Markovic
0 siblings, 1 reply; 12+ messages in thread
From: Peter Maydell @ 2016-10-05 12:38 UTC (permalink / raw)
To: Aleksandar Markovic
Cc: Aleksandar Markovic, Riku Voipio, QEMU Developers,
Laurent Vivier, Miodrag Dinic, Aleksandar Rikalo,
Petar Jovanovic, Yongbok Kim, Leon Alrae, Aurelien Jarno
On 5 October 2016 at 03:02, Aleksandar Markovic
<Aleksandar.Markovic@imgtec.com> wrote:
> Yes, we could replace TARGET_NR_fadvise64 with TARGET_NR_fadvise64_64
> in Mips32 syscall numbers definition list, and expect the same effect.
> I just prefer to leave original symbols for syscall numbers, as they
> are defined in kernel headers, unless there is a compelling reason not
> to do it.
I see the argument, but the reason would be "you end up reimplementing
fadvise64_64 as a special case for MIPS for fadvise64, which is a chunk
of extra ugly code that really isn't necessary".
> But, there is more. Code that handles TARGET_NR_fadvise64_64 in Qemu
> utilizes host's posix_advise(). It looks to me that this is just
> plain incorrect. It won't work correctly on 32 bit hosts, with
> respect to arguments of posix_advise() that are 32-bit (while
> 64-bit value is passed to them) Instead, posix_fadvise64() should
> have been used, IMHO.
If this is broken we should fix it rather than just ignoring it for
MIPS, but I don't think it is broken -- we compile QEMU with
-DFILE_OFFSET_BITS=64, so posix_fadvise() always takes 64 bit arguments
even on 32 bit hosts.
thanks
-- PMM
^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: [Qemu-devel] [PATCH 4/4] linux-user: Fix fadvise64() syscall support for Mips32
2016-10-05 12:38 ` Peter Maydell
@ 2016-10-06 11:03 ` Aleksandar Markovic
0 siblings, 0 replies; 12+ messages in thread
From: Aleksandar Markovic @ 2016-10-06 11:03 UTC (permalink / raw)
To: Peter Maydell
Cc: Aleksandar Markovic, Riku Voipio, QEMU Developers,
Laurent Vivier, Miodrag Dinic, Aleksandar Rikalo,
Petar Jovanovic, Yongbok Kim, Leon Alrae, Aurelien Jarno
Sure, Peter, I am going to take your hints and address all your concerns in the v2 of this series, which is planned to be posted soon.
I appreciate your guidance,
Aleksandar
________________________________________
From: Peter Maydell [peter.maydell@linaro.org]
Sent: Wednesday, October 05, 2016 5:38 AM
To: Aleksandar Markovic
Cc: Aleksandar Markovic; Riku Voipio; QEMU Developers; Laurent Vivier; Miodrag Dinic; Aleksandar Rikalo; Petar Jovanovic; Yongbok Kim; Leon Alrae; Aurelien Jarno
Subject: Re: [Qemu-devel] [PATCH 4/4] linux-user: Fix fadvise64() syscall support for Mips32
On 5 October 2016 at 03:02, Aleksandar Markovic
<Aleksandar.Markovic@imgtec.com> wrote:
> Yes, we could replace TARGET_NR_fadvise64 with TARGET_NR_fadvise64_64
> in Mips32 syscall numbers definition list, and expect the same effect.
> I just prefer to leave original symbols for syscall numbers, as they
> are defined in kernel headers, unless there is a compelling reason not
> to do it.
I see the argument, but the reason would be "you end up reimplementing
fadvise64_64 as a special case for MIPS for fadvise64, which is a chunk
of extra ugly code that really isn't necessary".
> But, there is more. Code that handles TARGET_NR_fadvise64_64 in Qemu
> utilizes host's posix_advise(). It looks to me that this is just
> plain incorrect. It won't work correctly on 32 bit hosts, with
> respect to arguments of posix_advise() that are 32-bit (while
> 64-bit value is passed to them) Instead, posix_fadvise64() should
> have been used, IMHO.
If this is broken we should fix it rather than just ignoring it for
MIPS, but I don't think it is broken -- we compile QEMU with
-DFILE_OFFSET_BITS=64, so posix_fadvise() always takes 64 bit arguments
even on 32 bit hosts.
thanks
-- PMM
^ permalink raw reply [flat|nested] 12+ messages in thread
end of thread, other threads:[~2016-10-06 11:04 UTC | newest]
Thread overview: 12+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2016-10-04 18:05 [Qemu-devel] [PATCH 0/4] linux-user: Several mostly Mips related patches Aleksandar Markovic
2016-10-04 18:05 ` [Qemu-devel] [PATCH 1/4] linux-user: Add support for sysfs() syscall Aleksandar Markovic
2016-10-04 20:35 ` Peter Maydell
2016-10-04 21:03 ` Aleksandar Markovic
2016-10-04 18:05 ` [Qemu-devel] [PATCH 2/4] linux-user: Update termbits.h for Mips32 Aleksandar Markovic
2016-10-04 18:05 ` [Qemu-devel] [PATCH 3/4] linux-user: Redirect termbits.h for Mips64 to " Aleksandar Markovic
2016-10-04 18:05 ` [Qemu-devel] [PATCH 4/4] linux-user: Fix fadvise64() syscall support " Aleksandar Markovic
2016-10-04 20:42 ` Peter Maydell
2016-10-04 20:58 ` Aleksandar Markovic
2016-10-05 10:02 ` Aleksandar Markovic
2016-10-05 12:38 ` Peter Maydell
2016-10-06 11:03 ` Aleksandar Markovic
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.