summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMatthieu Herrb <matthieu@cvs.openbsd.org>1998-02-17 23:49:32 +0000
committerMatthieu Herrb <matthieu@cvs.openbsd.org>1998-02-17 23:49:32 +0000
commit185c1e53c88c0f99d32dd8744c7c2283e38c7aaa (patch)
tree86fe54b6e9b846be2e8fea242aa97c1cd342e21a
parent7e873f48bff5884f2fecc61729b41743bb2aa8a7 (diff)
add an in-kernel /dev/xf86 aperture driver. the 'machdep.allowaperture'
sysctl controls whether it is permitted to access it. This sysctl can only be manipulated when securelevel=0, hence in sysctl.conf
-rw-r--r--sys/arch/i386/conf/GENERIC3
-rw-r--r--sys/arch/i386/i386/machdep.c19
-rw-r--r--sys/arch/i386/i386/mem.c40
-rw-r--r--sys/arch/i386/include/cpu.h6
4 files changed, 61 insertions, 7 deletions
diff --git a/sys/arch/i386/conf/GENERIC b/sys/arch/i386/conf/GENERIC
index 3cb01c4d356..50b4226818c 100644
--- a/sys/arch/i386/conf/GENERIC
+++ b/sys/arch/i386/conf/GENERIC
@@ -1,4 +1,4 @@
-# $OpenBSD: GENERIC,v 1.60 1998/01/06 02:35:18 deraadt Exp $
+# $OpenBSD: GENERIC,v 1.61 1998/02/17 23:49:28 matthieu Exp $
# $NetBSD: GENERIC,v 1.48 1996/05/20 18:17:23 mrg Exp $
#
# GENERIC -- everything that's currently supported
@@ -17,6 +17,7 @@ option GPL_MATH_EMULATE # floating point emulation
#option VM86 # Virtual 8086 emulation
#option USER_LDT # user-settable LDT; used by WINE
option XSERVER
+option APERTURE # in-kernel aperture driver for XFree86
# Some BIOSes don't get the size of extended memory right. If you
# have a broken BIOS, uncomment the following and set the value
diff --git a/sys/arch/i386/i386/machdep.c b/sys/arch/i386/i386/machdep.c
index 90c45de024f..dbae8873a20 100644
--- a/sys/arch/i386/i386/machdep.c
+++ b/sys/arch/i386/i386/machdep.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: machdep.c,v 1.77 1998/01/22 02:30:46 niklas Exp $ */
+/* $OpenBSD: machdep.c,v 1.78 1998/02/17 23:49:29 matthieu Exp $ */
/* $NetBSD: machdep.c,v 1.214 1996/11/10 03:16:17 thorpej Exp $ */
/*-
@@ -230,6 +230,14 @@ int bus_mem_add_mapping __P((bus_addr_t, bus_size_t,
extern u_int cnvmem; /* BIOS's conventional memory size */
extern u_int extmem; /* BIOS's extended memory size */
+#ifdef APERTURE
+#ifdef INSECURE
+int allowaperture = 1;
+#else
+int allowaperture = 0;
+#endif
+#endif
+
void cyrix6x86_cpu_setup __P((const char *));
void intel586_cpu_setup __P((const char *));
@@ -1871,6 +1879,15 @@ cpu_sysctl(name, namelen, oldp, oldlenp, newp, newlen, p)
return (ENOTDIR); /* overloaded */
dev = chrtoblk((dev_t)name[1]);
return sysctl_rdstruct(oldp, oldlenp, newp, &dev, sizeof(dev));
+#ifdef APERTURE
+ case CPU_ALLOWAPERTURE:
+ if (securelevel > 0)
+ return (sysctl_rdint(oldp, oldlenp, newp,
+ allowaperture));
+ else
+ return (sysctl_int(oldp, oldlenp, newp, newlen,
+ &allowaperture));
+#endif
default:
return EOPNOTSUPP;
}
diff --git a/sys/arch/i386/i386/mem.c b/sys/arch/i386/i386/mem.c
index 175b016f334..4b1ec10f896 100644
--- a/sys/arch/i386/i386/mem.c
+++ b/sys/arch/i386/i386/mem.c
@@ -60,6 +60,13 @@
extern char *vmmap; /* poor name! */
caddr_t zeropage;
+/* open counter for aperture */
+static int ap_open_count = 0;
+extern int allowaperture;
+
+#define VGA_START 0xA0000
+#define VGA_END 0xBFFFF
+
/*ARGSUSED*/
int
mmopen(dev, flag, mode, p)
@@ -79,7 +86,21 @@ mmopen(dev, flag, mode, p)
}
break;
#endif
-
+#ifdef APERTURE
+ case 4:
+ if (suser(p->p_ucred, &p->p_acflag) != 0) {
+ return(EPERM);
+ }
+ if (!allowaperture) {
+ return(EPERM);
+ }
+ /* authorize only one simultaneous open() */
+ if (ap_open_count > 0) {
+ return(EPERM);
+ }
+ ap_open_count++;
+ break;
+#endif
default:
break;
}
@@ -93,7 +114,11 @@ mmclose(dev, flag, mode, p)
int flag, mode;
struct proc *p;
{
-
+#ifdef APERTURE
+ if (minor(dev) == 4) {
+ ap_open_count--;
+ }
+#endif
return (0);
}
@@ -215,7 +240,16 @@ mmmmap(dev, off, prot)
if (!kernacc((caddr_t)off, NBPG, B_READ))
return -1;
return i386_btop(vtophys(off));
-
+#ifdef APERTURE
+/* minor device 4 is aperture driver */
+ case 4:
+ if (allowaperture
+ && (((off >= VGA_START && off <= VGA_END )
+ || (unsigned)off > (unsigned)ctob(physmem))))
+ return i386_btop(off);
+ else
+ return -1;
+#endif
default:
return -1;
}
diff --git a/sys/arch/i386/include/cpu.h b/sys/arch/i386/include/cpu.h
index 33527023919..fed648fadf4 100644
--- a/sys/arch/i386/include/cpu.h
+++ b/sys/arch/i386/include/cpu.h
@@ -1,4 +1,4 @@
-/* $OpenBSD: cpu.h,v 1.19 1997/12/17 08:54:51 downsj Exp $ */
+/* $OpenBSD: cpu.h,v 1.20 1998/02/17 23:49:31 matthieu Exp $ */
/* $NetBSD: cpu.h,v 1.35 1996/05/05 19:29:26 christos Exp $ */
/*-
@@ -234,7 +234,8 @@ void setconf __P((void));
#define CPU_BIOS 2 /* BIOS variables */
#define CPU_BLK2CHR 3 /* convert blk maj into chr one */
#define CPU_CHR2BLK 4 /* convert chr maj into blk one */
-#define CPU_MAXID 5 /* number of valid machdep ids */
+#define CPU_ALLOWAPERTURE 5 /* allow mmap of /dev/xf86 */
+#define CPU_MAXID 6 /* number of valid machdep ids */
#define CTL_MACHDEP_NAMES { \
{ 0, 0 }, \
@@ -242,6 +243,7 @@ void setconf __P((void));
{ "bios", CTLTYPE_INT }, \
{ "blk2chr", CTLTYPE_STRUCT }, \
{ "chr2blk", CTLTYPE_STRUCT }, \
+ { "allowaperture", CTLTYPE_INT }, \
}
#endif /* !_I386_CPU_H_ */