]> git.ipfire.org Git - thirdparty/glibc.git/commitdiff
2002-04-28 Roland McGrath <roland@frob.com>
authorRoland McGrath <roland@gnu.org>
Sun, 28 Apr 2002 20:09:03 +0000 (20:09 +0000)
committerRoland McGrath <roland@gnu.org>
Sun, 28 Apr 2002 20:09:03 +0000 (20:09 +0000)
* sysdeps/mach/hurd/i386/sys/io.h: New file.
* sysdeps/mach/hurd/i386/ioperm.c: New file.
* sysdeps/mach/hurd/i386/Dist: Add them.
* sysdeps/mach/hurd/i386/Versions
(libc: GLIBC_2.2.6): New set, add ioperm.
* sysdeps/mach/hurd/i386/Makefile [$(subdir) = misc]
(sysdep_routines): Append ioperm here.
(sysdep_headers): Append sys/io.h here.
* sysdeps/mach/i386/configure.in: New file.
Check to set HAVE_I386_IO_PERM_MODIFY.
* config.h.in (HAVE_I386_IO_PERM_MODIFY): #undef it.
* sysdeps/mach/i386/configure: New file.
* mach/Makefile (user-interfaces): Add i386/mach_i386 to the list.

config.h.in
mach/Makefile
sysdeps/mach/hurd/i386/Dist
sysdeps/mach/hurd/i386/Makefile
sysdeps/mach/hurd/i386/Versions
sysdeps/mach/hurd/i386/ioperm.c [new file with mode: 0644]
sysdeps/mach/hurd/i386/sys/io.h [new file with mode: 0644]
sysdeps/mach/i386/configure [new file with mode: 0755]
sysdeps/mach/i386/configure.in [new file with mode: 0644]

index a268e5e7164c4296ca16c3e5ae6fd235b5ed418d..af1b010aa9111c8475a75dc6def5572d3f480215 100644 (file)
    disabling the support as well.  */
 #undef USE_NONOPTION_FLAGS
 
+/* Mach/i386 specific: define if the `i386_io_perm_*' RPCs are available.  */
+#undef HAVE_I386_IO_PERM_MODIFY
+
 /*
 \f */
 
index ef6a6105d63924f3d3b8548e5b3412a7a2a42660..9b1e06bd6ed78fd751d0e7321eb548d6934152ec 100644 (file)
@@ -1,4 +1,4 @@
-# Copyright (C) 1991,92,93,94,95,96,97,98,2001 Free Software Foundation, Inc.
+# Copyright (C) 1991,92,93,94,95,96,97,98,2001,02 Free Software Foundation, Inc.
 # This file is part of the GNU C Library.
 
 # The GNU C Library is free software; you can redistribute it and/or
@@ -41,7 +41,7 @@ interface-library := libmachuser
 user-interfaces := $(addprefix mach/,mach_interface mach_port mach_host        \
                                     memory_object_user                 \
                                     memory_object_default              \
-                                    exc mach4                          \
+                                    exc mach4 i386/mach_i386           \
                                     default_pager default_pager_helper \
                    )\
                   $(addprefix device/,device device_request)
index c58180257eb7797ef20bba11fd114fb90a989de1..82c44df00b7cbc4ef0bd759488204932677f20f3 100644 (file)
@@ -1 +1,3 @@
 static-start.S
+sys/io.h
+ioperm.c
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..0eef17e8f2c64221241db4e28bbce68f1e21b9f5 100644 (file)
@@ -0,0 +1,4 @@
+ifeq ($(subdir),misc)
+sysdep_routines += ioperm
+sysdep_headers += sys/io.h
+endif
index 5731d9e01ecca488626aee12732aeeafedcaae7f..67e6d94204f6d212313a6a3433cb95cc4de5f4f3 100644 (file)
@@ -4,4 +4,7 @@ libc {
     __register_frame; __register_frame_table; __deregister_frame;
     __frame_state_for; __register_frame_info_table;
   }
+  GLIBC_2.2.6 {
+    ioperm;
+  }
 }
diff --git a/sysdeps/mach/hurd/i386/ioperm.c b/sysdeps/mach/hurd/i386/ioperm.c
new file mode 100644 (file)
index 0000000..39139bc
--- /dev/null
@@ -0,0 +1,54 @@
+/* Access to hardware i/o ports.  Hurd/x86 version.
+   Copyright (C) 2002 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   The GNU C Library 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
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, write to the Free
+   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+   02111-1307 USA.  */
+
+#include <sys/io.h>
+#include <hurd.h>
+#include <mach/i386/mach_i386.h>
+
+int
+ioperm (unsigned long int from, unsigned long int num, int turn_on)
+{
+#if ! HAVE_I386_IO_PERM_MODIFY
+  return __hurd_fail (ENOSYS);
+#else
+  error_t err;
+  device_t devmaster;
+
+  /* With the device master port we get a capability that represents
+     this range of io ports.  */
+  err = __get_privileged_ports (NULL, &devmaster);
+  if (! err)
+    {
+      io_perm_t perm;
+      err = __i386_io_perm_create (devmaster, from, from + num, &perm);
+      __mach_port_deallocate (__mach_task_self (), devmaster);
+      if (! err)
+       {
+         /* Now we add or remove that set from our task's bitmap.  */
+         err = __i386_io_perm_modify (__mach_task_self (), perm, turn_on);
+         __mach_port_deallocate (__mach_task_self (), perm);
+       }
+
+      if (err == MIG_BAD_ID)   /* Old kernels don't have these RPCs.  */
+       err = ENOSYS;
+    }
+
+  return err ? __hurd_fail (err) : 0;
+#endif
+}
diff --git a/sysdeps/mach/hurd/i386/sys/io.h b/sysdeps/mach/hurd/i386/sys/io.h
new file mode 100644 (file)
index 0000000..49ac998
--- /dev/null
@@ -0,0 +1,178 @@
+/* Access to hardware i/o ports.  GNU/x86 version.
+   Copyright (C) 2002 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   The GNU C Library 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
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, write to the Free
+   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+   02111-1307 USA.  */
+
+#ifndef        _SYS_IO_H
+#define        _SYS_IO_H       1
+
+#include <features.h>
+
+__BEGIN_DECLS
+
+/* If TURN_ON is TRUE, request for permission to do direct i/o on the
+   port numbers in the range [FROM,FROM+NUM-1].  Otherwise, turn I/O
+   permission off for that range.  This call requires root privileges.  */
+extern int ioperm (unsigned long int __from, unsigned long int __num,
+                   int __turn_on) __THROW;
+
+/* Set the I/O privilege level to LEVEL.  If LEVEL>3, permission to
+   access any I/O port is granted.  This call requires root
+   privileges. */
+extern int iopl (int __level) __THROW;
+
+#if defined __GNUC__ && __GNUC__ >= 2
+
+static __inline unsigned char
+inb (unsigned short int port)
+{
+  unsigned char _v;
+
+  __asm__ __volatile__ ("inb %w1,%0":"=a" (_v):"Nd" (port));
+  return _v;
+}
+
+static __inline unsigned char
+inb_p (unsigned short int port)
+{
+  unsigned char _v;
+
+  __asm__ __volatile__ ("inb %w1,%0\noutb %%al,$0x80":"=a" (_v):"Nd" (port));
+  return _v;
+}
+
+static __inline unsigned short int
+inw (unsigned short int port)
+{
+  unsigned short _v;
+
+  __asm__ __volatile__ ("inw %w1,%0":"=a" (_v):"Nd" (port));
+  return _v;
+}
+
+static __inline unsigned short int
+inw_p (unsigned short int port)
+{
+  unsigned short int _v;
+
+  __asm__ __volatile__ ("inw %w1,%0\noutb %%al,$0x80":"=a" (_v):"Nd" (port));
+  return _v;
+}
+
+static __inline unsigned int
+inl (unsigned short int port)
+{
+  unsigned int _v;
+
+  __asm__ __volatile__ ("inl %w1,%0":"=a" (_v):"Nd" (port));
+  return _v;
+}
+
+static __inline unsigned int
+inl_p (unsigned short int port)
+{
+  unsigned int _v;
+  __asm__ __volatile__ ("inl %w1,%0\noutb %%al,$0x80":"=a" (_v):"Nd" (port));
+  return _v;
+}
+
+static __inline void
+outb (unsigned char value, unsigned short int port)
+{
+  __asm__ __volatile__ ("outb %b0,%w1": :"a" (value), "Nd" (port));
+}
+
+static __inline void
+outb_p (unsigned char value, unsigned short int port)
+{
+  __asm__ __volatile__ ("outb %b0,%w1\noutb %%al,$0x80": :"a" (value),
+                       "Nd" (port));
+}
+
+static __inline void
+outw (unsigned short int value, unsigned short int port)
+{
+  __asm__ __volatile__ ("outw %w0,%w1": :"a" (value), "Nd" (port));
+
+}
+
+static __inline void
+outw_p (unsigned short int value, unsigned short int port)
+{
+  __asm__ __volatile__ ("outw %w0,%w1\noutb %%al,$0x80": :"a" (value),
+                       "Nd" (port));
+}
+
+static __inline void
+outl (unsigned int value, unsigned short int port)
+{
+  __asm__ __volatile__ ("outl %0,%w1": :"a" (value), "Nd" (port));
+}
+
+static __inline void
+outl_p (unsigned int value, unsigned short int port)
+{
+  __asm__ __volatile__ ("outl %0,%w1\noutb %%al,$0x80": :"a" (value),
+                       "Nd" (port));
+}
+
+static __inline void
+insb (unsigned short int port, void *addr, unsigned long int count)
+{
+  __asm__ __volatile__ ("cld ; rep ; insb":"=D" (addr),
+                       "=c" (count):"d" (port), "0" (addr), "1" (count));
+}
+
+static __inline void
+insw (unsigned short int port, void *addr, unsigned long int count)
+{
+  __asm__ __volatile__ ("cld ; rep ; insw":"=D" (addr),
+                       "=c" (count):"d" (port), "0" (addr), "1" (count));
+}
+
+static __inline void
+insl (unsigned short int port, void *addr, unsigned long int count)
+{
+  __asm__ __volatile__ ("cld ; rep ; insl":"=D" (addr),
+                       "=c" (count):"d" (port), "0" (addr), "1" (count));
+}
+
+static __inline void
+outsb (unsigned short int port, const void *addr, unsigned long int count)
+{
+  __asm__ __volatile__ ("cld ; rep ; outsb":"=S" (addr),
+                       "=c" (count):"d" (port), "0" (addr), "1" (count));
+}
+
+static __inline void
+outsw (unsigned short int port, const void *addr, unsigned long int count)
+{
+  __asm__ __volatile__ ("cld ; rep ; outsw":"=S" (addr),
+                       "=c" (count):"d" (port), "0" (addr), "1" (count));
+}
+
+static __inline void
+outsl (unsigned short int port, const void *addr, unsigned long int count)
+{
+  __asm__ __volatile__ ("cld ; rep ; outsl":"=S" (addr),
+                       "=c" (count):"d" (port), "0" (addr), "1" (count));
+}
+
+#endif /* GNU C */
+
+__END_DECLS
+#endif /* _SYS_IO_H */
diff --git a/sysdeps/mach/i386/configure b/sysdeps/mach/i386/configure
new file mode 100755 (executable)
index 0000000..2efe79f
--- /dev/null
@@ -0,0 +1,30 @@
+echo $ac_n "checking for i386_io_perm_modify in mach_i386.defs""... $ac_c" 1>&6
+echo "configure:4: checking for i386_io_perm_modify in mach_i386.defs" >&5
+if eval "test \"`echo '$''{'libc_cv_mach_i386_ioports'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  cat > conftest.$ac_ext <<EOF
+#line 9 "configure"
+#include "confdefs.h"
+#include <mach/i386/mach_i386.defs>
+EOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+  egrep "i386_io_perm_modify" >/dev/null 2>&1; then
+  rm -rf conftest*
+  libc_cv_mach_i386_ioports=yes
+else
+  rm -rf conftest*
+  libc_cv_mach_i386_ioports=no
+fi
+rm -f conftest*
+
+fi
+
+echo "$ac_t""$libc_cv_mach_i386_ioports" 1>&6
+if test $libc_cv_mach_i386_ioports = yes; then
+  cat >> confdefs.h <<\EOF
+#define HAVE_I386_IO_PERM_MODIFY 1
+EOF
+
+fi
diff --git a/sysdeps/mach/i386/configure.in b/sysdeps/mach/i386/configure.in
new file mode 100644 (file)
index 0000000..f35d2f7
--- /dev/null
@@ -0,0 +1,11 @@
+sinclude(./aclocal.m4)dnl Autoconf lossage.
+GLIBC_PROVIDES dnl See aclocal.m4 in the top level source directory.
+
+AC_CACHE_CHECK(for i386_io_perm_modify in mach_i386.defs,
+              libc_cv_mach_i386_ioports, [dnl
+AC_EGREP_HEADER(i386_io_perm_modify, mach/i386/mach_i386.defs,
+               libc_cv_mach_i386_ioports=yes,
+               libc_cv_mach_i386_ioports=no)])
+if test $libc_cv_mach_i386_ioports = yes; then
+  AC_DEFINE([HAVE_I386_IO_PERM_MODIFY])
+fi