diff options
-rw-r--r-- | lib/libarch/amd64/Makefile | 9 | ||||
-rw-r--r-- | lib/libarch/amd64/amd64_get_mtrr.2 | 165 | ||||
-rw-r--r-- | lib/libarch/amd64/amd64_get_mtrr.c | 33 | ||||
-rw-r--r-- | lib/libarch/amd64/amd64_set_mtrr.c | 32 |
4 files changed, 235 insertions, 4 deletions
diff --git a/lib/libarch/amd64/Makefile b/lib/libarch/amd64/Makefile index 4864470c866..5e17493b768 100644 --- a/lib/libarch/amd64/Makefile +++ b/lib/libarch/amd64/Makefile @@ -1,16 +1,17 @@ -# $OpenBSD: Makefile,v 1.4 2004/02/28 13:37:42 deraadt Exp $ +# $OpenBSD: Makefile,v 1.5 2004/02/28 23:51:35 deraadt Exp $ # $NetBSD: Makefile,v 1.1 1996/02/21 02:45:47 jtk Exp $ MANSUBDIR=amd64 -MAN+= amd64_get_ldt.2 amd64_iopl.2 amd64_get_ioperm.2 +MAN+= amd64_get_ldt.2 amd64_iopl.2 amd64_get_ioperm.2 amd64_get_mtrr.2 MLINKS+=amd64_get_ldt.2 amd64_set_ldt.2 \ - amd64_get_ioperm.2 amd64_set_ioperm.2 + amd64_get_ioperm.2 amd64_set_ioperm.2 \ + amd64_get_mtrr.2 amd64_set_mtrr.2 .if ${MACHINE_ARCH} == "amd64" .PATH: ${LIBC}/amd64 NOPIC= SRCS+= amd64_get_ldt.c amd64_set_ldt.c amd64_iopl.c amd64_get_ioperm.c \ - amd64_set_ioperm.c + amd64_set_ioperm.c amd64_set_mtrr.c amd64_get_mtrr.c .include <bsd.lib.mk> .else NOPROG= diff --git a/lib/libarch/amd64/amd64_get_mtrr.2 b/lib/libarch/amd64/amd64_get_mtrr.2 new file mode 100644 index 00000000000..64f52788084 --- /dev/null +++ b/lib/libarch/amd64/amd64_get_mtrr.2 @@ -0,0 +1,165 @@ +.\" $NetBSD: amd64_get_mtrr.2,v 1.6 2002/02/20 20:40:48 gmcgarry Exp $ +.\" +.\" Copyright (c) 2001 The NetBSD Foundation, Inc. +.\" All rights reserved. +.\" +.\" This code is derived from software contributed to The NetBSD Foundation +.\" by Gregory McGarry. +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in the +.\" documentation and/or other materials provided with the distribution. +.\" 3. All advertising materials mentioning features or use of this software +.\" must display the following acknowledgement: +.\" This product includes software developed by the NetBSD +.\" Foundation, Inc. and its contributors. +.\" 4. Neither the name of The NetBSD Foundation nor the names of its +.\" contributors may be used to endorse or promote products derived +.\" from this software without specific prior written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS +.\" ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +.\" TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +.\" PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS +.\" BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +.\" CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +.\" SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +.\" CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +.\" ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +.\" POSSIBILITY OF SUCH DAMAGE. +.\" +.Dd November 10, 2001 +.Dt amd64_GET_MTRR 3 amd64 +.Os +.Sh NAME +.Nm amd64_get_mtrr , +.Nm amd64_set_mtrr +.Nd access Memory Type Range Registers +.Sh LIBRARY +.Lb libamd64 +.Sh SYNOPSIS +.Fd #include \*[Lt]sys/types.h\*[Gt] +.Fd #include \*[Lt]machine/sysarch.h\*[Gt] +.Fd #include \*[Lt]machine/mtrr.h\*[Gt] +.Ft int +.Fn amd64_get_mtrr "struct mtrr *mtrrp" "int *n" +.Ft int +.Fn amd64_set_mtrr "struct mtrr *mtrrp" "int *n" +.Sh DESCRIPTION +These functions provide an interface to the MTRR registers found on +686-class processors for controlling processor access to memory ranges. +This is most useful for accessing devices such as video accelerators +on +.Xr pci 4 +and +.Xr agp 4 +busses. For example, enabling write-combining allows bus-write transfers +to be combined into a larger transfer before bursting over the bus. This +can increase performance of write operations 2.5 times or more. +.Pp +.Fa mtrrp +is a pointer to one or more mtrr structures, as described below. The +.Fa n +argument is a pointer to an integer containing the number of structures +pointed to by +.Fa mtrrp . +For +.Fn amd64_set_mtrr +the integer pointed to by +.Fa n +will be updated to reflect the actual number of MTRRs successfully set. +For +.Fn amd64_get_mtrr +no more than +.Fa n +structures will be copied out, and the integer value pointed to by +.Fa n +will be updated to reflect the actual number of valid structures +retrieved. +A NULL argument to +.Fa mtrrp +will result in just the number of MTRRs available being returned +in the integer pointed to by +.Fa n . +.Pp +The argument +.Fa mtrrp +has the following structure: +.Bd -literal +struct mtrr { + uint64_t base; + uint64_t len; + uint8_t type; + int flags; + pid_t owner; +}; +.Ed +.Pp +The location of the mapping is described by its physical base address +.Em base +and length +.Em len . +Valid values for +.Em type +are: +.Pp +.Bl -tag -offset indent -width MTRR_TYPE_UNDEF1 -compact +.It MTRR_TYPE_UC +uncached memory +.It MTRR_TYPE_WC +use write-combining +.It MTRR_TYPE_WT +use write-through caching +.It MTRR_TYPE_WP +write-protected memory +.It MTRR_TYPE_WB +use write-back caching +.El +.Pp +Valid values for +.Em flags +are: +.Pp +.Bl -tag -offset indent -width MTRR_PRIVATE -compact +.It MTRR_PRIVATE +own range, reset the MTRR when the current process exits +.It MTRR_FIXED +use fixed range MTRR +.It MTRR_VALID +entry is valid +.El +.Pp +The +.Em owner +member the PID of the user process which claims the mapping. It is +only valid if MTRR_PRIVATE is set in +.Em flags . +To clear/reset MTRRs, use a +.Em flags +field without MTRR_VALID set. +.Sh RETURN VALUES +Upon successful completion zero is returned, otherwise -1 is returned +on failure, and the global variable +.Va errno +is set to indicate the error. The integer value pointed to by +.Fa n +will be container the number of successfully processed mtrr structures +in both cases. +.Sh ERRORS +.Bl -tag -width [EINVAL] +.It Bq Er ENOSYS +The currently running kernel or CPU has no MTRR support. +.It Bq Er EINVAL +The currently running kernel has no MTRR support, or one of the mtrr +structures pointed to by +.Fa mtrrp +is invalid. +.It Bq Er EBUSY +No unused MTRRs are available. +.El diff --git a/lib/libarch/amd64/amd64_get_mtrr.c b/lib/libarch/amd64/amd64_get_mtrr.c new file mode 100644 index 00000000000..22980fbc36a --- /dev/null +++ b/lib/libarch/amd64/amd64_get_mtrr.c @@ -0,0 +1,33 @@ +/* $OpenBSD: amd64_get_mtrr.c,v 1.1 2004/02/28 23:51:35 deraadt Exp $ */ + +/* + * Copyright (c) 2004 Theo de Raadt + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +#include <sys/cdefs.h> +#include <sys/types.h> +#include <machine/segments.h> +#include <machine/sysarch.h> + +int +amd64_get_mtrr(struct mtrr *mtrr, int *n) +{ + struct amd64_get_mtrr_args a; + + a.mtrrp = mtrr; + a.n = n; + + return sysarch(AMD64_GET_MTRR, (void *)&a); +} diff --git a/lib/libarch/amd64/amd64_set_mtrr.c b/lib/libarch/amd64/amd64_set_mtrr.c new file mode 100644 index 00000000000..e20c5d17dc6 --- /dev/null +++ b/lib/libarch/amd64/amd64_set_mtrr.c @@ -0,0 +1,32 @@ +/* $OpenBSD: amd64_set_mtrr.c,v 1.1 2004/02/28 23:51:35 deraadt Exp $ */ + +/* + * Copyright (c) 2004 Theo de Raadt + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +#include <sys/cdefs.h> +#include <sys/types.h> +#include <machine/segments.h> +#include <machine/sysarch.h> + +int +amd64_set_mtrr(struct mtrr *mtrr, int *n) +{ + struct amd64_set_mtrr_args a; + + a.mtrrp = mtrr; + a.n = n; + return sysarch(AMD64_SET_MTRR, (void *)&a); +} |