mlibc: Add ioctl.
authorJan Nieuwenhuizen <janneke@gnu.org>
Sun, 22 Apr 2018 09:42:47 +0000 (11:42 +0200)
committerJan Nieuwenhuizen <janneke@gnu.org>
Sun, 22 Apr 2018 09:42:47 +0000 (11:42 +0200)
* stage0/x86.M1 (SYS_ioctl): New define.
* lib/linux-mes.c (ioctl): New syscall.
* lib/linux-gcc.c (ioctl): New syscall.
* include/sys/ioctl.h: New file.

include/sys/ioctl.h [new file with mode: 0644]
lib/linux-gcc.c
lib/linux-mes.c
stage0/x86.M1

diff --git a/include/sys/ioctl.h b/include/sys/ioctl.h
new file mode 100644 (file)
index 0000000..d24fd82
--- /dev/null
@@ -0,0 +1,36 @@
+/* -*-comment-start: "//";comment-end:""-*-
+ * Mes --- Maxwell Equations of Software
+ * Copyright © 2018 Jan (janneke) Nieuwenhuizen <janneke@gnu.org>
+ *
+ * This file is part of Mes.
+ *
+ * Mes is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3 of the License, or (at
+ * your option) any later version.
+ *
+ * Mes is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Mes.  If not, see <http://www.gnu.org/licenses/>.
+ */
+#ifndef __MES_SYS_IOCTL_H
+#define __MES_SYS_IOCTL_H 1
+
+#if __GNUC__ && POSIX
+#undef __MES_SYS_IOCTL_H
+#include_next <sys/ioctl.h>
+
+#else // !(__GNUC__ && POSIX)
+
+#define TCGETS 0x5401
+#define TCGETA 0x5405
+int ioctl (int fd, unsigned long request, ...);
+
+#endif // !(__GNUC__ && POSIX)
+
+#endif // __MES_SYS_IOCTL_H
+
index ca9424402b98b649a04d63d5f1dbd9ab8a837c2b..4f357b10f4b31d134974fa56ac3d8c90d2ebd4ce 100644 (file)
@@ -137,6 +137,37 @@ brk (void *p)
 #endif
 }
 
+int
+ioctl (int fd, unsigned long request, ...)
+{
+#if !__TINYC__
+  int p;
+  asm (
+       "mov    %%ebp,%%eax\n\t"
+       "add    $0x10,%%eax\n\t"
+       "mov    (%%eax),%%eax\n\t"
+       "mov    %%eax,%0\n\t"
+       : "=p" (p)
+       : //no inputs ""
+       );
+  int r;
+  //syscall (SYS_ioctl, fd));
+  asm (
+       "mov    %1,%%ebx\n\t"
+       "mov    %2,%%ecx\n\t"
+       "mov    %3,%%edx\n\t"
+
+       "mov    $0x36, %%eax\n\t"
+       "int    $0x80\n\t"
+       "mov    %%eax,%0\n\t"
+       : "=r" (r)
+       : "" (fd), "" (request), "" (p)
+       : "eax", "ebx", "ecx", "edx"
+       );
+  return r;
+#endif
+}
+
 int
 fsync (int fd)
 {
index 06f55a8e3686cd6ef455fbaa4bca81da1eb1ad15..75dee3a9bada284373e3a856bf7605cbb08d616b 100644 (file)
@@ -69,6 +69,17 @@ brk ()
   asm ("int____$0x80");
 }
 
+void
+ioctl ()
+{
+  asm ("mov____0x8(%ebp),%ebx !8");
+  asm ("mov____0x8(%ebp),%ecx !12");
+  asm ("mov____0x8(%ebp),%edx !16");
+
+  asm ("mov____$i32,%eax SYS_ioctl");
+  asm ("int____$0x80");
+}
+
 void
 fsync ()
 {
index 85f9c3ad633d2c5f693eafcb29247c55435dc375..80dadfcd165ed7081b7c969fb97bb3b8d32e807e 100644 (file)
@@ -205,5 +205,6 @@ DEFINE SYS_chmod  0f000000
 DEFINE SYS_lseek  13000000
 DEFINE SYS_access 21000000
 DEFINE SYS_brk    2d000000
+DEFINE SYS_ioctl  36000000
 DEFINE SYS_fsync  76000000
 DEFINE SYS_getcwd b7000000