From owner-svn-src-projects@FreeBSD.ORG Mon Oct 31 16:05:34 2011 Return-Path: Delivered-To: svn-src-projects@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 6760C106564A; Mon, 31 Oct 2011 16:05:34 +0000 (UTC) (envelope-from brooks@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id 3E8938FC1C; Mon, 31 Oct 2011 16:05:34 +0000 (UTC) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.4/8.14.4) with ESMTP id p9VG5Ypm023692; Mon, 31 Oct 2011 16:05:34 GMT (envelope-from brooks@svn.freebsd.org) Received: (from brooks@localhost) by svn.freebsd.org (8.14.4/8.14.4/Submit) id p9VG5YGe023691; Mon, 31 Oct 2011 16:05:34 GMT (envelope-from brooks@svn.freebsd.org) Message-Id: <201110311605.p9VG5YGe023691@svn.freebsd.org> From: Brooks Davis Date: Mon, 31 Oct 2011 16:05:34 +0000 (UTC) To: src-committers@freebsd.org, svn-src-projects@freebsd.org X-SVN-Group: projects MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r226968 - projects/varsym X-BeenThere: svn-src-projects@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: "SVN commit messages for the src " projects" tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 31 Oct 2011 16:05:34 -0000 Author: brooks Date: Mon Oct 31 16:05:33 2011 New Revision: 226968 URL: http://svn.freebsd.org/changeset/base/226968 Log: Create a branch to merge varsym patches into. Added: - copied from r226967, head/ Directory Properties: projects/varsym/ (props changed) From owner-svn-src-projects@FreeBSD.ORG Mon Oct 31 23:27:25 2011 Return-Path: Delivered-To: svn-src-projects@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 368B5106566B; Mon, 31 Oct 2011 23:27:25 +0000 (UTC) (envelope-from brooks@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id 2267D8FC13; Mon, 31 Oct 2011 23:27:25 +0000 (UTC) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.4/8.14.4) with ESMTP id p9VNRPAn038663; Mon, 31 Oct 2011 23:27:25 GMT (envelope-from brooks@svn.freebsd.org) Received: (from brooks@localhost) by svn.freebsd.org (8.14.4/8.14.4/Submit) id p9VNROEf038638; Mon, 31 Oct 2011 23:27:24 GMT (envelope-from brooks@svn.freebsd.org) Message-Id: <201110312327.p9VNROEf038638@svn.freebsd.org> From: Brooks Davis Date: Mon, 31 Oct 2011 23:27:24 +0000 (UTC) To: src-committers@freebsd.org, svn-src-projects@freebsd.org X-SVN-Group: projects MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r226973 - in projects/varsym: . bin/ln lib/libc/sys lib/libutil sys/amd64/conf sys/compat/freebsd32 sys/conf sys/kern sys/sys tools/regression/usr.bin/varsym usr.bin/varsym X-BeenThere: svn-src-projects@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: "SVN commit messages for the src " projects" tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 31 Oct 2011 23:27:25 -0000 Author: brooks Date: Mon Oct 31 23:27:24 2011 New Revision: 226973 URL: http://svn.freebsd.org/changeset/base/226973 Log: Bring in an updated varsym patch from my P4 tree. Added: projects/varsym/TODO projects/varsym/lib/libc/sys/varsym.2 projects/varsym/sys/kern/kern_varsym.c projects/varsym/sys/sys/varsym.h projects/varsym/tools/regression/usr.bin/varsym/ projects/varsym/tools/regression/usr.bin/varsym/Makefile projects/varsym/tools/regression/usr.bin/varsym/regress.all_unset.out projects/varsym/tools/regression/usr.bin/varsym/regress.all_unset_default.out projects/varsym/tools/regression/usr.bin/varsym/regress.disabled_get.out projects/varsym/tools/regression/usr.bin/varsym/regress.disabled_list.out projects/varsym/tools/regression/usr.bin/varsym/regress.disabled_set.out projects/varsym/tools/regression/usr.bin/varsym/regress.list_basic.out projects/varsym/tools/regression/usr.bin/varsym/regress.list_clear_proc.out projects/varsym/tools/regression/usr.bin/varsym/regress.nobody_set.out projects/varsym/tools/regression/usr.bin/varsym/regress.nobody_set_denied.out projects/varsym/tools/regression/usr.bin/varsym/regress.nobody_set_toomany.out projects/varsym/tools/regression/usr.bin/varsym/regress.printenv_override.out projects/varsym/tools/regression/usr.bin/varsym/regress.printenv_proc.out projects/varsym/tools/regression/usr.bin/varsym/regress.printenv_sys.out projects/varsym/tools/regression/usr.bin/varsym/regress.proc_basic.out projects/varsym/tools/regression/usr.bin/varsym/regress.sh projects/varsym/tools/regression/usr.bin/varsym/regress.sys_basic.out projects/varsym/tools/regression/usr.bin/varsym/regress.sys_cleared.out projects/varsym/tools/regression/usr.bin/varsym/regress.sys_deleted.out projects/varsym/tools/regression/usr.bin/varsym/regress.sys_override.out projects/varsym/tools/regression/usr.bin/varsym/regress.t projects/varsym/usr.bin/varsym/ projects/varsym/usr.bin/varsym/Makefile projects/varsym/usr.bin/varsym/varsym.1 projects/varsym/usr.bin/varsym/varsym.c Modified: projects/varsym/bin/ln/ln.1 projects/varsym/lib/libc/sys/Makefile.inc projects/varsym/lib/libc/sys/Symbol.map projects/varsym/lib/libutil/login.conf.5 projects/varsym/lib/libutil/login_cap.h projects/varsym/lib/libutil/login_class.3 projects/varsym/lib/libutil/login_class.c projects/varsym/sys/amd64/conf/GENERIC projects/varsym/sys/compat/freebsd32/freebsd32_misc.c projects/varsym/sys/compat/freebsd32/freebsd32_proto.h projects/varsym/sys/compat/freebsd32/freebsd32_syscall.h projects/varsym/sys/compat/freebsd32/freebsd32_syscalls.c projects/varsym/sys/compat/freebsd32/freebsd32_sysent.c projects/varsym/sys/compat/freebsd32/freebsd32_systrace_args.c projects/varsym/sys/compat/freebsd32/syscalls.master projects/varsym/sys/conf/files projects/varsym/sys/conf/options projects/varsym/sys/kern/init_sysent.c projects/varsym/sys/kern/kern_exec.c projects/varsym/sys/kern/kern_fork.c projects/varsym/sys/kern/syscalls.c projects/varsym/sys/kern/syscalls.master projects/varsym/sys/kern/systrace_args.c projects/varsym/sys/kern/vfs_lookup.c projects/varsym/sys/sys/priv.h projects/varsym/sys/sys/proc.h projects/varsym/sys/sys/syscall.h projects/varsym/sys/sys/syscall.mk projects/varsym/sys/sys/sysproto.h Added: projects/varsym/TODO ============================================================================== --- /dev/null 00:00:00 1970 (empty, because file is newly added) +++ projects/varsym/TODO Mon Oct 31 23:27:24 2011 (r226973) @@ -0,0 +1,5 @@ +pre-commit: +- get review, tweak as necessicary + +post-commit: +- add jail or vimage support Modified: projects/varsym/bin/ln/ln.1 ============================================================================== --- projects/varsym/bin/ln/ln.1 Mon Oct 31 21:05:19 2011 (r226972) +++ projects/varsym/bin/ln/ln.1 Mon Oct 31 23:27:24 2011 (r226973) @@ -212,6 +212,47 @@ No options may be supplied in this simpl which performs a .Xr link 2 operation using the two passed arguments. +.Sh VARIANT SYMLINKS +.Dx +supports a special kind of dynamic +symbolic link called a +.Em variant symlink . +The +.Ar source_file +of a variant symlink may contain one or more +variable names. Each of these variable +names is enclosed in braces and preceded by a +dollar sign in the style of variable references in +.Xr sh 1 +and +.Xr csh 1 . +.Pp +Whenever a variant symlink is followed, each +variable found in +.Ar source_file +is replaced by its associated value. +In this manner, a variant symlink may resolve to different +paths based on context. The facility +supports per-process, per-user, and system-wide varsyms. +.Pp +Varsym variables can be set with the +.Xr varsym 1 +utility. Regular +.Xr environ 7 +environment variables are +not used to resolve variant symlinks. +.Ss EXAMPLE +.Bd -literal -offset indent +sysctl -w vfs.varsym.enable=1 + +ln -s 'a%{fubar}b' test + +echo 'Hello' > axxb +echo 'Goodbye' > ayyb + +varsym fubar=xx cat test +varsym fubar=yy cat test +.Ed .Sh COMPATIBILITY The .Fl h , @@ -236,7 +277,8 @@ extension and should not be used in port .Xr readlink 2 , .Xr stat 2 , .Xr symlink 2 , -.Xr symlink 7 +.Xr symlink 7 , +.Xr varsym 1 .Sh STANDARDS The .Nm @@ -251,4 +293,4 @@ command conforms to An .Nm command appeared in -.At v1 . +.At v1 . Variant Symlinks appeared in DragonFly BSD . Modified: projects/varsym/lib/libc/sys/Makefile.inc ============================================================================== --- projects/varsym/lib/libc/sys/Makefile.inc Mon Oct 31 21:05:19 2011 (r226972) +++ projects/varsym/lib/libc/sys/Makefile.inc Mon Oct 31 23:27:24 2011 (r226973) @@ -114,7 +114,7 @@ MAN+= sctp_generic_recvmsg.2 sctp_generi swapon.2 symlink.2 sync.2 sysarch.2 syscall.2 \ timer_create.2 timer_delete.2 timer_settime.2 \ truncate.2 umask.2 undelete.2 \ - unlink.2 utimes.2 utrace.2 uuidgen.2 vfork.2 wait.2 write.2 + unlink.2 utimes.2 utrace.2 uuidgen.2 varsym.2 vfork.2 wait.2 write.2 MLINKS+=access.2 eaccess.2 access.2 faccessat.2 MLINKS+=brk.2 sbrk.2 @@ -210,4 +210,5 @@ MLINKS+=truncate.2 ftruncate.2 MLINKS+=unlink.2 unlinkat.2 MLINKS+=utimes.2 futimes.2 utimes.2 futimesat.2 utimes.2 lutimes.2 MLINKS+=wait.2 wait3.2 wait.2 wait4.2 wait.2 waitpid.2 -MLINKS+=write.2 pwrite.2 write.2 pwritev.2 write.2 writev.2 +MLINKS+=write.2 pwrite.2 write.2 writev.2 write.2 pwritev.2 +MLINKS+=varsym.2 varsym_set.2 varsym.2 varsym_get.2 varsym.2 varsym_list.2 Modified: projects/varsym/lib/libc/sys/Symbol.map ============================================================================== --- projects/varsym/lib/libc/sys/Symbol.map Mon Oct 31 21:05:19 2011 (r226972) +++ projects/varsym/lib/libc/sys/Symbol.map Mon Oct 31 23:27:24 2011 (r226973) @@ -326,6 +326,9 @@ FBSD_1.0 { pread; pwrite; truncate; + varsym_set; + varsym_get; + varsym_list; }; FBSD_1.1 { Added: projects/varsym/lib/libc/sys/varsym.2 ============================================================================== --- /dev/null 00:00:00 1970 (empty, because file is newly added) +++ projects/varsym/lib/libc/sys/varsym.2 Mon Oct 31 23:27:24 2011 (r226973) @@ -0,0 +1,205 @@ +.\" Copyright (c) 2008 The Aerospace Corporation +.\" All rights reserved. +.\" +.\" 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. Neither the name of the author nor the names of its contributors may +.\" be used to endorse or promote products derived from this software +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHOR 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 AUTHOR 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. +.\" +.\" $FreeBSD$ +.\" +.Dd March 29 2008 +.Dt VARSYM 2 +.Os +.Sh NAME +.Nm varsym +.Nd manipulate variant symlink variables +.Sh LIBRARY +.Lb libc +.Sh SYNOPSIS +.In varsym.h +.Ft int +.Fn varsym_set "int scope" "id_t which" "const char *name" "const char *data" +.Ft int +.Fn varsym_get "int scope" "id_t which" "const char *name" "const char *buf" "size_t *size" +.Ft int +.Fn varsym_list "int scope" "id_t which" "const char *buf" "size_t *size" +.Sh DESCRIPTION +The +.Fn varsym_set +function +sets the variable +.Fa name +in the object specifed by +.Fa scope +and +.Fa which +to the value in the null-terminated string pointed to by +.Fa data . +If +.Fa data +is +.Dv NULL +then the variable will be deleted. +If +.Fa name +is +.Dv NULL +then all variables will be deleted. +.Pp +The +.Fn varsym_get +function +writes the value of the variable +.Fa name +in the object specifed by +.Fa scope +and +.Fa which +to the buffer +.Fa buf +as a null-terminated string. +The number of bytes written to +.Fa which +are copied back to the variable pointed to by +.Fa size. +.Pp +The +.Fn varsym_list +function +writes the names and values of variables +in the object specifed by +.Fa scope +and +.Fa which +to the buffer +.Fa buf +with nulls between each entry and a final null indicating end of list. +The number of bytes written to +.Fa which +are copied back to the variable pointed to by +.Fa size. +.Pp +The +.Fa scope +argument may be one of: +.Bl -tag -width VARSYM_PROC +.It Dv VARSYM_SYS +Get or set variables in the global system scope. +.It Dv VARSYM_PROC +Get or set variables for the given process. +.El +.Pp +The following +.Xr sysctl 3 +MIB variables control the operation of variant symlinks: +.Bl -tag -width vfs.varsym.enable +.It Va vfs.varsym.enable +Enables support for variant symlinks when set to a non-zero value. +Defaults to off. +.It Va vfs.varsym.allow_default +If set to a non-zero value, variant symlinks may be created with default +values to be used if no variable is set. +These values are specified by placing a colon after the variable name in the +link. +For example +.Va ${VAR:defaultvalue} . +.Pp +.Sy WARNING : +Default values should not be used in any way that will effect the execution +of setuid programs unless users can not control the values of variant +symlinks. +Administrators are advised to disable default value support when user +control of per-process values is allowed. +.It Va vfs.varsym.max_proc_setsize +Limits the number of per-processes variables that can be set. +The default limit is 32. +This limit is only enforced if unprivleged control is allowed by +.Va security.bsd.unprivileged_varsym_set_proc . +.It Va security.bsd.unprivileged_varsym_set_proc +If set to a non-zero value, non-root users may set per-process variant symlink +variables. +.El +.Sh RETURN VALUES +.Rv -std varsym_set varsym_get varsym_list +.Sh ERRORS +The +.Fn varsym_set , +.Fn varsym_get , +and +.Fn varsym_list +functions will fail and take no action if: +.Bl -tag -width Er +.It Bq Er EINVAL +An invalid value is passed for +.Fa scope +or +.Fa which . +.It Bq Er EPERM +The +.Fa which +variable is set to a value other than 0 or the current processes pid when +.Fa scope +is +.Dv VARSYM_PROC . +.It Bq Er EOVERFLOW +The buffer passed to +.Fn varsym_get +or +.Fn varsym_list +is too small for the data to be returned. +.It Bq Er E2BIG +For the +.Fn varsym_set +function, the maximum number of variant symlinks for this object has been +reached. +.It Bq Er ENOENT +The requested variant symlink variable does not exist. +.It Bq Er ENOSYS +The system does not support variant symlinks or the support has been +disabled by setting the +.Xr sysctl 3 +MIB +.Va vfs.varsym.enable +to 0. +.It Bq Er EFAULT +One of buffers is outside the process's allocated address space. +.It Bq Er ENAMETOOLONG +The value of +.Fa name +is longer than +.Dv MAXVARSYM_NAME +or +the value of +.Fa data +is longer than +.Dv MAXVARSYM_DATA . +.El +.Sh SEE ALSO +.Xr varsym_clear 3 +.Sh HISTORY +This version of variant symlinks is derived from variant symlink support that +first appeared in DragonFlyBSD 1.0. +.Sh BUGS +The +.Fa which +argument is effectivly unused at this time and must be 0 or the current +processes pid. Modified: projects/varsym/lib/libutil/login.conf.5 ============================================================================== --- projects/varsym/lib/libutil/login.conf.5 Mon Oct 31 21:05:19 2011 (r226972) +++ projects/varsym/lib/libutil/login.conf.5 Mon Oct 31 23:27:24 2011 (r226973) @@ -245,6 +245,8 @@ from other means. .It "timezone string Default value of $TZ environment variable. .It "umask number 022 Initial umask. Should always have a leading 0 to ensure octal interpretation. +.It "varsym list A comma-separated list of variant symlink variables and +values to which they are to be set. .It "welcome file /etc/motd File containing welcome message. .El .Sh AUTHENTICATION Modified: projects/varsym/lib/libutil/login_cap.h ============================================================================== --- projects/varsym/lib/libutil/login_cap.h Mon Oct 31 21:05:19 2011 (r226972) +++ projects/varsym/lib/libutil/login_cap.h Mon Oct 31 23:27:24 2011 (r226973) @@ -50,7 +50,8 @@ #define LOGIN_SETMAC 0x0100 /* set user default MAC label */ #define LOGIN_SETCPUMASK 0x0200 /* set user cpumask */ #define LOGIN_SETLOGINCLASS 0x0400 /* set login class in the kernel */ -#define LOGIN_SETALL 0x07ff /* set everything */ +#define LOGIN_SETVARSYM 0x0800 /* set process variant symlink vars */ +#define LOGIN_SETALL 0x0fff /* set everything */ #define BI_AUTH "authorize" /* accepted authentication */ #define BI_REJECT "reject" /* rejected authentication */ @@ -118,6 +119,7 @@ const char *login_setcryptfmt(login_cap_ int setclasscontext(const char *, unsigned int); void setclasscpumask(login_cap_t *); +void setclassvarsyms(login_cap_t *, const struct passwd *); int setusercontext(login_cap_t *, const struct passwd *, uid_t, unsigned int); void setclassresources(login_cap_t *); void setclassenvironment(login_cap_t *, const struct passwd *, int); Modified: projects/varsym/lib/libutil/login_class.3 ============================================================================== --- projects/varsym/lib/libutil/login_class.3 Mon Oct 31 21:05:19 2011 (r226972) +++ projects/varsym/lib/libutil/login_class.3 Mon Oct 31 23:27:24 2011 (r226973) @@ -175,6 +175,9 @@ no action will be taken. .It LOGIN_SETLOGINCLASS Set the login class of the current process using .Xr setloginclass 2 . +.It LOGIN_SETVARSYM +Set process scope variant symlink variables using the list type capability +"varsym=var1=val1,var2=val2..,varN=valN". .It LOGIN_SETALL Enables all of the above settings. .El @@ -214,6 +217,7 @@ with LOG_ERR priority and directed to th .Xr setlogin 2 , .Xr setloginclass 2 , .Xr setuid 2 , +.Xr varsym 2 , .Xr getcap 3 , .Xr initgroups 3 , .Xr login_cap 3 , Modified: projects/varsym/lib/libutil/login_class.c ============================================================================== --- projects/varsym/lib/libutil/login_class.c Mon Oct 31 21:05:19 2011 (r226972) +++ projects/varsym/lib/libutil/login_class.c Mon Oct 31 23:27:24 2011 (r226973) @@ -32,6 +32,7 @@ __FBSDID("$FreeBSD$"); #include #include #include +#include #include #include @@ -136,9 +137,15 @@ static struct login_vars { }; static char * -substvar(const char * var, const struct passwd * pwd, int hlen, int pch, int nlen) +substvar(const char * var, const struct passwd * pwd) { - char *np = NULL; + char *np = NULL; + int hlen = pwd ? strlen(pwd->pw_dir) : 0; + int nlen = pwd ? strlen(pwd->pw_name) : 0; + char pch = 0; + + if (hlen && pwd->pw_dir[hlen-1] != '/') + ++pch; if (var != NULL) { int tildes = 0; @@ -196,18 +203,12 @@ void setclassenvironment(login_cap_t *lc, const struct passwd * pwd, int paths) { struct login_vars *vars = paths ? pathvars : envars; - int hlen = pwd ? strlen(pwd->pw_dir) : 0; - int nlen = pwd ? strlen(pwd->pw_name) : 0; - char pch = 0; - - if (hlen && pwd->pw_dir[hlen-1] != '/') - ++pch; while (vars->tag != NULL) { const char * var = paths ? login_getpath(lc, vars->tag, NULL) : login_getcapstr(lc, vars->tag, NULL, NULL); - char * np = substvar(var, pwd, hlen, pch, nlen); + char * np = substvar(var, pwd); if (np != NULL) { setenv(vars->var, np, vars->overwrite); @@ -233,7 +234,7 @@ setclassenvironment(login_cap_t *lc, con char *np; *p++ = '\0'; - if ((np = substvar(p, pwd, hlen, pch, nlen)) != NULL) { + if ((np = substvar(p, pwd)) != NULL) { setenv(*set_env, np, 1); free(np); } @@ -347,6 +348,31 @@ setclasscpumask(login_cap_t *lc) } +void +setclassvarsyms(login_cap_t *lc, const struct passwd * pwd) +{ + const char **varsyms = login_getcaplist(lc, "varsym", ","); + + if (varsyms != NULL) { + while (*varsyms != NULL) { + char *p = strchr(*varsyms, '='); + + if (p != NULL) { /* Discard invalid entries */ + char *np; + + *p++ = '\0'; + if ((np = substvar(p, pwd)) != NULL) { + /* XXX: should we only ignore ENOSYS? */ + (void)varsym_set(VARSYM_PROC, 0, *varsyms, np); + free(np); + } + } + ++varsyms; + } + } +} + + /* * setclasscontext() * @@ -400,6 +426,9 @@ setlogincontext(login_cap_t *lc, const s /* Set cpu affinity */ if (flags & LOGIN_SETCPUMASK) setclasscpumask(lc); + /* Set variant symlink variables */ + if (flags & LOGIN_SETVARSYM) + setclassvarsyms(lc, pwd); } return (mymask); } Modified: projects/varsym/sys/amd64/conf/GENERIC ============================================================================== --- projects/varsym/sys/amd64/conf/GENERIC Mon Oct 31 21:05:19 2011 (r226972) +++ projects/varsym/sys/amd64/conf/GENERIC Mon Oct 31 23:27:24 2011 (r226973) @@ -42,6 +42,7 @@ options MSDOSFS # MSDOS Filesystem options CD9660 # ISO 9660 Filesystem options PROCFS # Process filesystem (requires PSEUDOFS) options PSEUDOFS # Pseudo-filesystem framework +options VARSYM # Variant symlink support options GEOM_PART_GPT # GUID Partition Tables. options GEOM_LABEL # Provides labelization options COMPAT_FREEBSD32 # Compatible with i386 binaries Modified: projects/varsym/sys/compat/freebsd32/freebsd32_misc.c ============================================================================== --- projects/varsym/sys/compat/freebsd32/freebsd32_misc.c Mon Oct 31 21:05:19 2011 (r226972) +++ projects/varsym/sys/compat/freebsd32/freebsd32_misc.c Mon Oct 31 23:27:24 2011 (r226973) @@ -75,6 +75,7 @@ __FBSDID("$FreeBSD$"); #include #include #include +#include #include #include #include @@ -2514,6 +2515,92 @@ freebsd32_nmount(struct thread *td, return error; } +#ifdef VARSYM +int +freebsd32_varsym_set(struct thread *td, struct freebsd32_varsym_set_args *uap) +{ + struct varsym_set_args ap; + + ap.scope = uap->scope; + ap.which = (uap->whichlo | ((id_t)uap->whichhi << 32)); + ap.name = uap->name; + ap.data = uap->data; + + return (varsym_set(td, &ap)); +} + + +int +freebsd32_varsym_get(struct thread *td, struct freebsd32_varsym_get_args *uap) +{ + int error; + id_t which; + size_t bufsize; + uint32_t bufsize32; + + which = (uap->whichlo | ((id_t)uap->whichhi << 32)); + + if ((error = copyin(uap->size, &bufsize32, sizeof(bufsize32))) != 0) + return(error); + bufsize = bufsize32; + + if ((error = kern_varsym_get(td, uap->scope, which, uap->name, + uap->buf, &bufsize)) != 0) + return(error); + + bufsize32 = bufsize; + error = copyout(&bufsize32, uap->size, sizeof(bufsize32)); + + return(error); +} + +int +freebsd32_varsym_list(struct thread *td, struct freebsd32_varsym_list_args *uap) +{ + int error; + id_t which; + size_t bufsize; + uint32_t bufsize32; + + which = (uap->whichlo | ((id_t)uap->whichhi << 32)); + + if ((error = copyin(uap->size, &bufsize32, sizeof(bufsize32))) != 0) + return(error); + bufsize = bufsize32; + + if ((error = kern_varsym_list(td, uap->scope, which, uap->buf, + &bufsize)) != 0) + return(error); + + bufsize32 = bufsize; + error = copyout(&bufsize32, uap->size, sizeof(bufsize32)); + + return(error); +} + +#else /* VARSYM */ +int +freebsd32_varsym_set(struct thread *td, struct freebsd32_varsym_set_args *uap) +{ + + return (ENOSYS); +} + +int +freebsd32_varsym_get(struct thread *td, struct freebsd32_varsym_get_args *uap) +{ + + return (ENOSYS); +} + +int +freebsd32_varsym_list(struct thread *td, struct freebsd32_varsym_list_args *uap) +{ + + return (ENOSYS); +} +#endif /* VARSYM */ + #if 0 int freebsd32_xxx(struct thread *td, struct freebsd32_xxx_args *uap) Modified: projects/varsym/sys/compat/freebsd32/freebsd32_proto.h ============================================================================== --- projects/varsym/sys/compat/freebsd32/freebsd32_proto.h Mon Oct 31 21:05:19 2011 (r226972) +++ projects/varsym/sys/compat/freebsd32/freebsd32_proto.h Mon Oct 31 23:27:24 2011 (r226973) @@ -580,6 +580,28 @@ struct freebsd32_posix_fallocate_args { char len1_l_[PADL_(uint32_t)]; uint32_t len1; char len1_r_[PADR_(uint32_t)]; char len2_l_[PADL_(uint32_t)]; uint32_t len2; char len2_r_[PADR_(uint32_t)]; }; +struct freebsd32_varsym_set_args { + char scope_l_[PADL_(int)]; int scope; char scope_r_[PADR_(int)]; + char whichlo_l_[PADL_(uint32_t)]; uint32_t whichlo; char whichlo_r_[PADR_(uint32_t)]; + char whichhi_l_[PADL_(uint32_t)]; uint32_t whichhi; char whichhi_r_[PADR_(uint32_t)]; + char name_l_[PADL_(const char *)]; const char * name; char name_r_[PADR_(const char *)]; + char data_l_[PADL_(const char *)]; const char * data; char data_r_[PADR_(const char *)]; +}; +struct freebsd32_varsym_get_args { + char scope_l_[PADL_(int)]; int scope; char scope_r_[PADR_(int)]; + char whichlo_l_[PADL_(uint32_t)]; uint32_t whichlo; char whichlo_r_[PADR_(uint32_t)]; + char whichhi_l_[PADL_(uint32_t)]; uint32_t whichhi; char whichhi_r_[PADR_(uint32_t)]; + char name_l_[PADL_(const char *)]; const char * name; char name_r_[PADR_(const char *)]; + char buf_l_[PADL_(char *)]; char * buf; char buf_r_[PADR_(char *)]; + char size_l_[PADL_(uint32_t *)]; uint32_t * size; char size_r_[PADR_(uint32_t *)]; +}; +struct freebsd32_varsym_list_args { + char scope_l_[PADL_(int)]; int scope; char scope_r_[PADR_(int)]; + char whichlo_l_[PADL_(uint32_t)]; uint32_t whichlo; char whichlo_r_[PADR_(uint32_t)]; + char whichhi_l_[PADL_(uint32_t)]; uint32_t whichhi; char whichhi_r_[PADR_(uint32_t)]; + char buf_l_[PADL_(char *)]; char * buf; char buf_r_[PADR_(char *)]; + char size_l_[PADL_(uint32_t *)]; uint32_t * size; char size_r_[PADR_(uint32_t *)]; +}; #if !defined(PAD64_REQUIRED) && defined(__powerpc__) #define PAD64_REQUIRED #endif @@ -690,6 +712,9 @@ int freebsd32_msgctl(struct thread *, st int freebsd32_shmctl(struct thread *, struct freebsd32_shmctl_args *); int freebsd32_pselect(struct thread *, struct freebsd32_pselect_args *); int freebsd32_posix_fallocate(struct thread *, struct freebsd32_posix_fallocate_args *); +int freebsd32_varsym_set(struct thread *, struct freebsd32_varsym_set_args *); +int freebsd32_varsym_get(struct thread *, struct freebsd32_varsym_get_args *); +int freebsd32_varsym_list(struct thread *, struct freebsd32_varsym_list_args *); #ifdef COMPAT_43 @@ -1065,6 +1090,9 @@ int freebsd7_freebsd32_shmctl(struct thr #define FREEBSD32_SYS_AUE_freebsd32_shmctl AUE_SHMCTL #define FREEBSD32_SYS_AUE_freebsd32_pselect AUE_SELECT #define FREEBSD32_SYS_AUE_freebsd32_posix_fallocate AUE_NULL +#define FREEBSD32_SYS_AUE_freebsd32_varsym_set AUE_NULL +#define FREEBSD32_SYS_AUE_freebsd32_varsym_get AUE_NULL +#define FREEBSD32_SYS_AUE_freebsd32_varsym_list AUE_NULL #undef PAD_ #undef PADL_ Modified: projects/varsym/sys/compat/freebsd32/freebsd32_syscall.h ============================================================================== --- projects/varsym/sys/compat/freebsd32/freebsd32_syscall.h Mon Oct 31 21:05:19 2011 (r226972) +++ projects/varsym/sys/compat/freebsd32/freebsd32_syscall.h Mon Oct 31 23:27:24 2011 (r226973) @@ -424,4 +424,7 @@ #define FREEBSD32_SYS_rctl_add_rule 528 #define FREEBSD32_SYS_rctl_remove_rule 529 #define FREEBSD32_SYS_freebsd32_posix_fallocate 530 -#define FREEBSD32_SYS_MAXSYSCALL 532 +#define FREEBSD32_SYS_freebsd32_varsym_set 532 +#define FREEBSD32_SYS_freebsd32_varsym_get 533 +#define FREEBSD32_SYS_freebsd32_varsym_list 534 +#define FREEBSD32_SYS_MAXSYSCALL 535 Modified: projects/varsym/sys/compat/freebsd32/freebsd32_syscalls.c ============================================================================== --- projects/varsym/sys/compat/freebsd32/freebsd32_syscalls.c Mon Oct 31 21:05:19 2011 (r226972) +++ projects/varsym/sys/compat/freebsd32/freebsd32_syscalls.c Mon Oct 31 23:27:24 2011 (r226973) @@ -555,4 +555,7 @@ const char *freebsd32_syscallnames[] = { "rctl_remove_rule", /* 529 = rctl_remove_rule */ "freebsd32_posix_fallocate", /* 530 = freebsd32_posix_fallocate */ "#531", /* 531 = posix_fadvise */ + "freebsd32_varsym_set", /* 532 = freebsd32_varsym_set */ + "freebsd32_varsym_get", /* 533 = freebsd32_varsym_get */ + "freebsd32_varsym_list", /* 534 = freebsd32_varsym_list */ }; Modified: projects/varsym/sys/compat/freebsd32/freebsd32_sysent.c ============================================================================== --- projects/varsym/sys/compat/freebsd32/freebsd32_sysent.c Mon Oct 31 21:05:19 2011 (r226972) +++ projects/varsym/sys/compat/freebsd32/freebsd32_sysent.c Mon Oct 31 23:27:24 2011 (r226973) @@ -592,4 +592,7 @@ struct sysent freebsd32_sysent[] = { { AS(rctl_remove_rule_args), (sy_call_t *)sys_rctl_remove_rule, AUE_NULL, NULL, 0, 0, 0, SY_THR_STATIC }, /* 529 = rctl_remove_rule */ { AS(freebsd32_posix_fallocate_args), (sy_call_t *)freebsd32_posix_fallocate, AUE_NULL, NULL, 0, 0, 0, SY_THR_STATIC }, /* 530 = freebsd32_posix_fallocate */ { 0, (sy_call_t *)nosys, AUE_NULL, NULL, 0, 0, 0, SY_THR_ABSENT }, /* 531 = posix_fadvise */ + { AS(freebsd32_varsym_set_args), (sy_call_t *)freebsd32_varsym_set, AUE_NULL, NULL, 0, 0, 0, SY_THR_STATIC }, /* 532 = freebsd32_varsym_set */ + { AS(freebsd32_varsym_get_args), (sy_call_t *)freebsd32_varsym_get, AUE_NULL, NULL, 0, 0, 0, SY_THR_STATIC }, /* 533 = freebsd32_varsym_get */ + { AS(freebsd32_varsym_list_args), (sy_call_t *)freebsd32_varsym_list, AUE_NULL, NULL, 0, 0, 0, SY_THR_STATIC }, /* 534 = freebsd32_varsym_list */ }; Modified: projects/varsym/sys/compat/freebsd32/freebsd32_systrace_args.c ============================================================================== --- projects/varsym/sys/compat/freebsd32/freebsd32_systrace_args.c Mon Oct 31 21:05:19 2011 (r226972) +++ projects/varsym/sys/compat/freebsd32/freebsd32_systrace_args.c Mon Oct 31 23:27:24 2011 (r226973) @@ -3034,6 +3034,40 @@ systrace_args(int sysnum, void *params, *n_args = 5; break; } + /* freebsd32_varsym_set */ + case 532: { + struct freebsd32_varsym_set_args *p = params; + iarg[0] = p->scope; /* int */ + uarg[1] = p->whichlo; /* uint32_t */ + uarg[2] = p->whichhi; /* uint32_t */ + uarg[3] = (intptr_t) p->name; /* const char * */ + uarg[4] = (intptr_t) p->data; /* const char * */ + *n_args = 5; + break; + } + /* freebsd32_varsym_get */ + case 533: { + struct freebsd32_varsym_get_args *p = params; + iarg[0] = p->scope; /* int */ + uarg[1] = p->whichlo; /* uint32_t */ + uarg[2] = p->whichhi; /* uint32_t */ + uarg[3] = (intptr_t) p->name; /* const char * */ + uarg[4] = (intptr_t) p->buf; /* char * */ + uarg[5] = (intptr_t) p->size; /* uint32_t * */ + *n_args = 6; + break; + } + /* freebsd32_varsym_list */ + case 534: { + struct freebsd32_varsym_list_args *p = params; + iarg[0] = p->scope; /* int */ + uarg[1] = p->whichlo; /* uint32_t */ + uarg[2] = p->whichhi; /* uint32_t */ + uarg[3] = (intptr_t) p->buf; /* char * */ + uarg[4] = (intptr_t) p->size; /* uint32_t * */ + *n_args = 5; + break; + } default: *n_args = 0; break; @@ -8093,6 +8127,75 @@ systrace_setargdesc(int sysnum, int ndx, break; }; break; + /* freebsd32_varsym_set */ + case 532: + switch(ndx) { + case 0: + p = "int"; + break; + case 1: + p = "uint32_t"; + break; + case 2: + p = "uint32_t"; + break; + case 3: + p = "const char *"; + break; + case 4: + p = "const char *"; + break; + default: + break; + }; + break; + /* freebsd32_varsym_get */ + case 533: + switch(ndx) { + case 0: + p = "int"; + break; + case 1: + p = "uint32_t"; + break; + case 2: + p = "uint32_t"; + break; + case 3: + p = "const char *"; + break; + case 4: + p = "char *"; + break; + case 5: + p = "uint32_t *"; + break; + default: + break; + }; + break; + /* freebsd32_varsym_list */ + case 534: + switch(ndx) { + case 0: + p = "int"; + break; + case 1: + p = "uint32_t"; + break; + case 2: + p = "uint32_t"; + break; + case 3: + p = "char *"; + break; + case 4: + p = "uint32_t *"; + break; + default: + break; + }; + break; default: break; }; Modified: projects/varsym/sys/compat/freebsd32/syscalls.master ============================================================================== --- projects/varsym/sys/compat/freebsd32/syscalls.master Mon Oct 31 21:05:19 2011 (r226972) +++ projects/varsym/sys/compat/freebsd32/syscalls.master Mon Oct 31 23:27:24 2011 (r226973) @@ -992,3 +992,13 @@ uint32_t offset1, uint32_t offset2,\ uint32_t len1, uint32_t len2); } 531 AUE_NULL UNIMPL posix_fadvise +532 AUE_NULL STD { int freebsd32_varsym_set(int scope, \ + uint32_t whichlo, uint32_t whichhi, \ + const char *name, const char *data); } +533 AUE_NULL STD { int freebsd32_varsym_get(int scope, \ + uint32_t whichlo, uint32_t whichhi, \ + const char *name, \ + char *buf, uint32_t *size); } +534 AUE_NULL STD { int freebsd32_varsym_list(int scope, \ + uint32_t whichlo, uint32_t whichhi, \ + char *buf, uint32_t *size); } Modified: projects/varsym/sys/conf/files ============================================================================== --- projects/varsym/sys/conf/files Mon Oct 31 21:05:19 2011 (r226972) +++ projects/varsym/sys/conf/files Mon Oct 31 23:27:24 2011 (r226973) @@ -2358,6 +2358,7 @@ kern/kern_time.c standard kern/kern_timeout.c standard kern/kern_umtx.c standard kern/kern_uuid.c standard +kern/kern_varsym.c standard kern/kern_xxx.c standard kern/link_elf.c standard kern/linker_if.m standard Modified: projects/varsym/sys/conf/options ============================================================================== --- projects/varsym/sys/conf/options Mon Oct 31 21:05:19 2011 (r226972) +++ projects/varsym/sys/conf/options Mon Oct 31 23:27:24 2011 (r226973) @@ -183,6 +183,7 @@ SYSVSEM opt_sysvipc.h SYSVSHM opt_sysvipc.h SW_WATCHDOG opt_watchdog.h TURNSTILE_PROFILING +VARSYM VFS_AIO VERBOSE_SYSINIT opt_global.h WLCACHE opt_wavelan.h Modified: projects/varsym/sys/kern/init_sysent.c ============================================================================== --- projects/varsym/sys/kern/init_sysent.c Mon Oct 31 21:05:19 2011 (r226972) +++ projects/varsym/sys/kern/init_sysent.c Mon Oct 31 23:27:24 2011 (r226973) @@ -566,4 +566,7 @@ struct sysent sysent[] = { { AS(rctl_remove_rule_args), (sy_call_t *)sys_rctl_remove_rule, AUE_NULL, NULL, 0, 0, 0, SY_THR_STATIC }, /* 529 = rctl_remove_rule */ { AS(posix_fallocate_args), (sy_call_t *)sys_posix_fallocate, AUE_NULL, NULL, 0, 0, 0, SY_THR_STATIC }, /* 530 = posix_fallocate */ { 0, (sy_call_t *)nosys, AUE_NULL, NULL, 0, 0, 0, SY_THR_ABSENT }, /* 531 = posix_fadvise */ + { AS(varsym_set_args), (sy_call_t *)sys_varsym_set, AUE_NULL, NULL, 0, 0, 0, SY_THR_STATIC }, /* 532 = varsym_set */ + { AS(varsym_get_args), (sy_call_t *)sys_varsym_get, AUE_NULL, NULL, 0, 0, 0, SY_THR_STATIC }, /* 533 = varsym_get */ + { AS(varsym_list_args), (sy_call_t *)sys_varsym_list, AUE_NULL, NULL, 0, 0, 0, SY_THR_STATIC }, /* 534 = varsym_list */ }; Modified: projects/varsym/sys/kern/kern_exec.c ============================================================================== --- projects/varsym/sys/kern/kern_exec.c Mon Oct 31 21:05:19 2011 (r226972) +++ projects/varsym/sys/kern/kern_exec.c Mon Oct 31 23:27:24 2011 (r226973) @@ -729,6 +729,14 @@ interpret: change_svgid(newcred, newcred->cr_gid); p->p_ucred = newcred; newcred = NULL; + +#ifdef VARSYM + /* + * Clear local varsym variables. + * Do not clear privleged varsym variables. + */ + varsymset_clean(&p->p_varsymset); +#endif } else { if (oldcred->cr_uid == oldcred->cr_ruid && oldcred->cr_gid == oldcred->cr_rgid) Modified: projects/varsym/sys/kern/kern_fork.c ============================================================================== --- projects/varsym/sys/kern/kern_fork.c Mon Oct 31 21:05:19 2011 (r226972) +++ projects/varsym/sys/kern/kern_fork.c Mon Oct 31 23:27:24 2011 (r226973) @@ -426,6 +426,14 @@ do_fork(struct thread *td, int flags, st else newsigacts = sigacts_alloc(); +#ifdef VARSYM + /* + * Initialize and copy varsyms + */ + varsymset_init(&p2->p_varsymset, &p1->p_varsymset); + varsymset_init(&p2->p_varsymset_priv, &p1->p_varsymset_priv); +#endif + /* * Copy filedesc. */ Added: projects/varsym/sys/kern/kern_varsym.c ============================================================================== --- /dev/null 00:00:00 1970 (empty, because file is newly added) +++ projects/varsym/sys/kern/kern_varsym.c Mon Oct 31 23:27:24 2011 (r226973) @@ -0,0 +1,723 @@ +/* + * Copyright (c) 2003,2004 The DragonFly Project. All rights reserved. + * Copyright (c) 2007-2009 The Aerospace Corporation. All rights reserved. + * + * This code is derived from software contributed to The DragonFly Project + * by Matthew Dillon + * + * 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. Neither the name of The DragonFly Project 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 COPYRIGHT HOLDERS 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 + * COPYRIGHT HOLDERS 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. + * + * $FreeBSD$ + * $DragonFly: src/sys/kern/kern_varsym.c,v 1.6 2005/01/14 02:25:08 joerg Exp $ + */ + +/* + * This module implements variable storage and management for variant + * symlinks. These variables may also be used for general purposes. + */ + +#include "opt_varsym.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#ifdef VARSYM + +SYSCTL_NODE(_vfs, OID_AUTO, varsym, CTLFLAG_RD, NULL, + "Variant symlink managment"); + +int varsym_enable = 0; +SYSCTL_INT(_vfs_varsym, OID_AUTO, enable, CTLFLAG_RW, &varsym_enable, 0, + "Enable Variant Symlinks"); +TUNABLE_INT("vfs.varsym.enable", + &varsym_enable); + +static int varsym_allow_default = 0; +SYSCTL_INT(_vfs_varsym, OID_AUTO, allow_default, CTLFLAG_RW, + &varsym_allow_default, 0, + "allow variables to have default values"); +TUNABLE_INT("vfs.varsym.allow_default", + &varsym_allow_default); + +static int varsym_max_proc_setsize = 32; +SYSCTL_INT(_vfs_varsym, OID_AUTO, max_proc_setsize, CTLFLAG_RW, + &varsym_max_proc_setsize, 0, + "maximum number of varsym variables on a process"); +TUNABLE_INT("vfs.varsym_max_proc_setsize", + &varsym_max_proc_setsize); + +static int unprivileged_varsym_set_proc = 1; +SYSCTL_INT(_security_bsd, OID_AUTO, unprivileged_varsym_set_proc, CTLFLAG_RW, + &unprivileged_varsym_set_proc, 0, + "allow unprivileged users to set per-process varsym variables"); +TUNABLE_INT("security.bsd.unprivileged_varsym_set_proc", + &unprivileged_varsym_set_proc); + +MALLOC_DEFINE(M_VARSYM, "varsym", "variable sets for variant symlinks"); +static struct mtx varsym_mutex; +static struct varsymset varsymset_sys; + +static int varsymmake(int scope, const char *name, const char *data); +static void varsymdrop(varsym_t var); +static struct varsyment * varsymlookup(struct varsymset *vss, const char *name, + int namelen); +static int varsym_clear(struct thread *td, int scope, id_t which); +static int vss2buf(struct varsymset *vss, char *buf, int *bytes, + int maxsize); +static varsym_t varsymfind(int scope, const char *name, int namelen); + +/* + * Initialize the variant symlink subsystem + */ +static void +varsym_sysinit(void *dummy) +{ + mtx_init(&varsym_mutex, "varsym", NULL, MTX_DEF); + varsymset_init(&varsymset_sys, NULL); +} +SYSINIT(announce, SI_SUB_INTRINSIC, SI_ORDER_FIRST, varsym_sysinit, NULL); + +/* + * Initialize the varsymset for proc0 + */ +static void +varsym_p0init(void *dummy) +{ + PROC_LOCK(&proc0); + varsymset_init(&proc0.p_varsymset, NULL); + varsymset_init(&proc0.p_varsymset_priv, NULL); + PROC_UNLOCK(&proc0); +} +SYSINIT(p0init, SI_SUB_INTRINSIC, SI_ORDER_SECOND, varsym_p0init, NULL); + +/* + * varsymreplace() - called from namei + * + * Do variant symlink variable substitution + */ +int +varsymreplace(char *cp, int linklen, int maxlen) +{ + int rlen; + int xlen; + int nlen; *** DIFF OUTPUT TRUNCATED AT 1000 LINES *** From owner-svn-src-projects@FreeBSD.ORG Tue Nov 1 17:18:57 2011 Return-Path: Delivered-To: svn-src-projects@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id E5078106566C; Tue, 1 Nov 2011 17:18:57 +0000 (UTC) (envelope-from pho@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id CA7908FC16; Tue, 1 Nov 2011 17:18:57 +0000 (UTC) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.4/8.14.4) with ESMTP id pA1HIvkH076472; Tue, 1 Nov 2011 17:18:57 GMT (envelope-from pho@svn.freebsd.org) Received: (from pho@localhost) by svn.freebsd.org (8.14.4/8.14.4/Submit) id pA1HIvMW076471; Tue, 1 Nov 2011 17:18:57 GMT (envelope-from pho@svn.freebsd.org) Message-Id: <201111011718.pA1HIvMW076471@svn.freebsd.org> From: Peter Holm Date: Tue, 1 Nov 2011 17:18:57 +0000 (UTC) To: src-committers@freebsd.org, svn-src-projects@freebsd.org X-SVN-Group: projects MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r226999 - projects/stress2/misc X-BeenThere: svn-src-projects@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: "SVN commit messages for the src " projects" tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Tue, 01 Nov 2011 17:18:58 -0000 Author: pho Date: Tue Nov 1 17:18:57 2011 New Revision: 226999 URL: http://svn.freebsd.org/changeset/base/226999 Log: Added regression test for rename() cache problem, fixed in r226967. Added: projects/stress2/misc/rename6.sh (contents, props changed) Added: projects/stress2/misc/rename6.sh ============================================================================== --- /dev/null 00:00:00 1970 (empty, because file is newly added) +++ projects/stress2/misc/rename6.sh Tue Nov 1 17:18:57 2011 (r226999) @@ -0,0 +1,148 @@ +#!/bin/sh + +# +# Copyright (c) 2011 Peter Holm +# All rights reserved. +# +# 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. +# +# THIS SOFTWARE IS PROVIDED BY THE AUTHOR 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 AUTHOR 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. +# +# $FreeBSD$ +# + +[ `id -u ` -ne 0 ] && echo "Must be root!" && exit 1 + +# Demonstrate rename(2) cache problem, where the original name lingers in the VFS cache. + +# Original test scenario by Anton Yuzhaninov + +. ../default.cfg + +here=`pwd` +cd /tmp +sed '1,/^EOF/d' < $here/$0 > rename6.c +cc -o rename6 -Wall -Wextra -O2 rename6.c +rm -f rename6.c +cd $here + +mount | grep $mntpoint | grep -q /dev/md && umount -f $mntpoint +mdconfig -l | grep -q md$mdstart && mdconfig -d -u $mdstart +mdconfig -a -t swap -s 2g -u $mdstart +bsdlabel -w md$mdstart auto +newfs -U md${mdstart}$part > /dev/null +mount /dev/md${mdstart}$part $mntpoint +chmod 777 $mntpoint + +su ${testuser} -c "cd $mntpoint; /tmp/rename6" + +while mount | grep -q md${mdstart}$part; do + umount $mntpoint || sleep 1 +done +mdconfig -d -u $mdstart +rm -f /tmp/rename6 +exit +EOF +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +pid_t spid; +const char *logfile = "test.log"; + +void +cleanup() +{ + kill(spid, SIGINT); +} + +static void +Stat() +{ + struct stat sb; + int i; + + setproctitle("Stat"); + for (;;) { + for (i = 0; i < 1000; i++) { + stat(logfile, &sb); + } + usleep(1000); + } +} + +int +main(void) +{ + struct stat sb1, sb2; + int fd, i; + char new[128]; + + if ((spid = fork()) == 0) + Stat(); + + setproctitle("main"); + atexit(cleanup); + for (i = 0; i < 20000; i++) { + sprintf(new, "test.log.%05d", i); + if ((fd = open(logfile, O_RDWR | O_CREAT | O_TRUNC, 0644)) == -1) + err(1, "creat(%s)", logfile); + close(fd); +#if 1 + if (rename(logfile, new) == -1) + warn("rename(%s, %s)", logfile, new); +#else + /* No cache problem is seen */ + if (link(logfile, new) == -1) + err(1, "link(%s, %s)", logfile, new); + if (unlink(logfile) == -1) + err(1, "unlink(%s)", logfile); +#endif + /* + * stat() for logfile and new will be identical sometimes, + * but only when Stat() is running. + */ + if (stat(logfile, &sb1) == 0 && stat(new, &sb2) == 0 && + bcmp(&sb1, &sb2, sizeof(sb1)) == 0) { + fprintf(stderr, "At loop #%d\n", i); + fprintf(stderr, "%-15s: ino = %d, nlink = %d, size = %jd\n", + logfile, sb1.st_ino, sb1.st_nlink, sb1.st_blocks); + fprintf(stderr, "%-15s: ino = %d, nlink = %d, size = %jd\n", + new , sb2.st_ino, sb2.st_nlink, sb2.st_blocks); + } + unlink(new); + } + + kill(spid, SIGINT); + wait(NULL); + + return (0); +} From owner-svn-src-projects@FreeBSD.ORG Wed Nov 2 16:39:11 2011 Return-Path: Delivered-To: svn-src-projects@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 656C4106566C; Wed, 2 Nov 2011 16:39:11 +0000 (UTC) (envelope-from nwhitehorn@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id 4B1E18FC0A; Wed, 2 Nov 2011 16:39:11 +0000 (UTC) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.4/8.14.4) with ESMTP id pA2GdBpR029498; Wed, 2 Nov 2011 16:39:11 GMT (envelope-from nwhitehorn@svn.freebsd.org) Received: (from nwhitehorn@localhost) by svn.freebsd.org (8.14.4/8.14.4/Submit) id pA2GdBmM029494; Wed, 2 Nov 2011 16:39:11 GMT (envelope-from nwhitehorn@svn.freebsd.org) Message-Id: <201111021639.pA2GdBmM029494@svn.freebsd.org> From: Nathan Whitehorn Date: Wed, 2 Nov 2011 16:39:11 +0000 (UTC) To: src-committers@freebsd.org, svn-src-projects@freebsd.org X-SVN-Group: projects MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r227021 - projects/pseries/dev/ofw X-BeenThere: svn-src-projects@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: "SVN commit messages for the src " projects" tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 02 Nov 2011 16:39:11 -0000 Author: nwhitehorn Date: Wed Nov 2 16:39:10 2011 New Revision: 227021 URL: http://svn.freebsd.org/changeset/base/227021 Log: Add an interface for the strange PAPR/FDT concept of phandles by adding a rountine to look up client interface phandles from device tree cross references. This can be optimized further, but works and should eventually replace the abuse of ihandles in ofw_fdt. Modified: projects/pseries/dev/ofw/ofw_bus_subr.c projects/pseries/dev/ofw/openfirm.c projects/pseries/dev/ofw/openfirm.h Modified: projects/pseries/dev/ofw/ofw_bus_subr.c ============================================================================== --- projects/pseries/dev/ofw/ofw_bus_subr.c Wed Nov 2 14:28:36 2011 (r227020) +++ projects/pseries/dev/ofw/ofw_bus_subr.c Wed Nov 2 16:39:10 2011 (r227021) @@ -285,6 +285,7 @@ ofw_bus_search_intrmap(void *intr, int i i = imapsz; while (i > 0) { bcopy(mptr + physsz + intrsz, &parent, sizeof(parent)); + parent = OF_xref_phandle(parent); if (OF_searchprop(parent, "#interrupt-cells", &pintrsz, sizeof(pintrsz)) == -1) pintrsz = 1; /* default */ @@ -292,7 +293,10 @@ ofw_bus_search_intrmap(void *intr, int i /* Compute the map stride size. */ tsz = physsz + intrsz + sizeof(phandle_t) + pintrsz; - KASSERT(i >= tsz, ("ofw_bus_search_intrmap: truncated map")); + KASSERT(i >= tsz, ("ofw_bus_search_intrmap: truncated map " + "(imapsz: %d, tsz: %d, physsz: %d, intrsz: %d, " + "sizeof(phandle_t): %zd, pintrsz: %d)", imapsz, tsz, + physsz, intrsz, sizeof(phandle_t), pintrsz)); /* * XXX: Apple hardware uses a second cell to set information Modified: projects/pseries/dev/ofw/openfirm.c ============================================================================== --- projects/pseries/dev/ofw/openfirm.c Wed Nov 2 14:28:36 2011 (r227020) +++ projects/pseries/dev/ofw/openfirm.c Wed Nov 2 16:39:10 2011 (r227021) @@ -364,6 +364,47 @@ OF_package_to_path(phandle_t package, ch return (OFW_PACKAGE_TO_PATH(ofw_obj, package, buf, len)); } +/* Look up effective phandle (see FDT/PAPR spec) */ +static phandle_t +OF_child_xref_phandle(phandle_t parent, phandle_t xref) +{ + /* + * Recursively descend from parent, looking for a node with a property + * named either "phandle", "ibm,phandle", or "linux,phandle" that + * matches the xref we are looking for. + */ + phandle_t child, rxref; + + for (child = OF_child(parent); child != 0; child = OF_peer(child)) { + rxref = OF_child_xref_phandle(child, xref); + if (rxref != -1) + return (rxref); + + if (OF_getprop(child, "phandle", &rxref, sizeof(rxref)) == -1 && + OF_getprop(child, "ibm,phandle", &rxref, + sizeof(rxref)) == -1 && OF_getprop(child, + "linux,phandle", &rxref, sizeof(rxref)) == -1) + continue; + + if (rxref == xref) + return (child); + } + + return (-1); +} + +phandle_t +OF_xref_phandle(phandle_t xref) +{ + phandle_t node; + + node = OF_child_xref_phandle(OF_peer(0), xref); + if (node == -1) + return (xref); + + return (node); +} + /* Call the method in the scope of a given instance. */ int OF_call_method(const char *method, ihandle_t instance, int nargs, int nreturns, Modified: projects/pseries/dev/ofw/openfirm.h ============================================================================== --- projects/pseries/dev/ofw/openfirm.h Wed Nov 2 14:28:36 2011 (r227020) +++ projects/pseries/dev/ofw/openfirm.h Wed Nov 2 16:39:10 2011 (r227021) @@ -117,6 +117,14 @@ ssize_t OF_canon(const char *path, char phandle_t OF_finddevice(const char *path); ssize_t OF_package_to_path(phandle_t node, char *buf, size_t len); +/* + * Some OF implementations (IBM, FDT) have a concept of effective phandles + * used for device-tree cross-references. Given one of these, returns the + * real phandle. If one can't be found (or running on OF implementations + * without this property), returns its input. + */ +phandle_t OF_xref_phandle(phandle_t xref); + /* Device I/O functions */ ihandle_t OF_open(const char *path); void OF_close(ihandle_t instance); From owner-svn-src-projects@FreeBSD.ORG Wed Nov 2 20:11:19 2011 Return-Path: Delivered-To: svn-src-projects@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 85A75106564A; Wed, 2 Nov 2011 20:11:19 +0000 (UTC) (envelope-from nwhitehorn@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id 752A28FC15; Wed, 2 Nov 2011 20:11:19 +0000 (UTC) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.4/8.14.4) with ESMTP id pA2KBJnw036419; Wed, 2 Nov 2011 20:11:19 GMT (envelope-from nwhitehorn@svn.freebsd.org) Received: (from nwhitehorn@localhost) by svn.freebsd.org (8.14.4/8.14.4/Submit) id pA2KBJFu036417; Wed, 2 Nov 2011 20:11:19 GMT (envelope-from nwhitehorn@svn.freebsd.org) Message-Id: <201111022011.pA2KBJFu036417@svn.freebsd.org> From: Nathan Whitehorn Date: Wed, 2 Nov 2011 20:11:19 +0000 (UTC) To: src-committers@freebsd.org, svn-src-projects@freebsd.org X-SVN-Group: projects MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r227031 - projects/pseries/powerpc/ofw X-BeenThere: svn-src-projects@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: "SVN commit messages for the src " projects" tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 02 Nov 2011 20:11:19 -0000 Author: nwhitehorn Date: Wed Nov 2 20:11:19 2011 New Revision: 227031 URL: http://svn.freebsd.org/changeset/base/227031 Log: Use the phandle cross-reference tools here and avoid making requests with invalid phandles that could crash certain badly-written OF implementations. Modified: projects/pseries/powerpc/ofw/ofw_pcibus.c Modified: projects/pseries/powerpc/ofw/ofw_pcibus.c ============================================================================== --- projects/pseries/powerpc/ofw/ofw_pcibus.c Wed Nov 2 19:35:31 2011 (r227030) +++ projects/pseries/powerpc/ofw/ofw_pcibus.c Wed Nov 2 20:11:19 2011 (r227031) @@ -213,11 +213,13 @@ ofw_pcibus_enum_devtree(device_t dev, u_ icells = 1; OF_getprop(child, "interrupt-parent", &iparent, sizeof(iparent)); - OF_getprop(iparent, "#interrupt-cells", &icells, - sizeof(icells)); + iparent = OF_xref_phandle(iparent); - if (iparent != 0) + if (iparent != 0) { + OF_getprop(iparent, "#interrupt-cells", + &icells, sizeof(icells)); intr[0] = MAP_IRQ(iparent, intr[0]); + } if (iparent != 0 && icells > 1) { powerpc_config_intr(intr[0], @@ -344,6 +346,8 @@ ofw_pcibus_assign_interrupt(device_t dev iparent = -1; if (OF_getprop(node, "interrupt-parent", &iparent, sizeof(iparent)) < 0) iparent = -1; + else + iparent = OF_xref_phandle(iparent); /* * Any AAPL,interrupts property gets priority and is From owner-svn-src-projects@FreeBSD.ORG Wed Nov 2 20:55:56 2011 Return-Path: Delivered-To: svn-src-projects@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 474DE106564A; Wed, 2 Nov 2011 20:55:56 +0000 (UTC) (envelope-from nwhitehorn@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id 2BEEA8FC08; Wed, 2 Nov 2011 20:55:56 +0000 (UTC) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.4/8.14.4) with ESMTP id pA2Ktuj0037951; Wed, 2 Nov 2011 20:55:56 GMT (envelope-from nwhitehorn@svn.freebsd.org) Received: (from nwhitehorn@localhost) by svn.freebsd.org (8.14.4/8.14.4/Submit) id pA2KtuoW037948; Wed, 2 Nov 2011 20:55:56 GMT (envelope-from nwhitehorn@svn.freebsd.org) Message-Id: <201111022055.pA2KtuoW037948@svn.freebsd.org> From: Nathan Whitehorn Date: Wed, 2 Nov 2011 20:55:56 +0000 (UTC) To: src-committers@freebsd.org, svn-src-projects@freebsd.org X-SVN-Group: projects MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r227033 - in projects/pseries: dev/uart powerpc/pseries X-BeenThere: svn-src-projects@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: "SVN commit messages for the src " projects" tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 02 Nov 2011 20:55:56 -0000 Author: nwhitehorn Date: Wed Nov 2 20:55:55 2011 New Revision: 227033 URL: http://svn.freebsd.org/changeset/base/227033 Log: Turn the POWER hypervisor console into a kind of uart(4). When controlling actual serial ports via the hvterm-protocol interface, it has support for regular UARTy things like baud rates and flow control. Modified: projects/pseries/dev/uart/uart_cpu_powerpc.c projects/pseries/powerpc/pseries/phyp_console.c Modified: projects/pseries/dev/uart/uart_cpu_powerpc.c ============================================================================== --- projects/pseries/dev/uart/uart_cpu_powerpc.c Wed Nov 2 20:45:44 2011 (r227032) +++ projects/pseries/dev/uart/uart_cpu_powerpc.c Wed Nov 2 20:55:55 2011 (r227033) @@ -42,11 +42,18 @@ __FBSDID("$FreeBSD$"); bus_space_tag_t uart_bus_space_io = &bs_le_tag; bus_space_tag_t uart_bus_space_mem = &bs_le_tag; +extern struct uart_class uart_phyp_class __attribute__((weak)); + int uart_cpu_eqres(struct uart_bas *b1, struct uart_bas *b2) { - - return ((pmap_kextract(b1->bsh) == pmap_kextract(b2->bsh)) ? 1 : 0); + if (b1->bst == NULL && b2->bst == NULL) + return ((b1->bsh == b2->bsh) ? 1 : 0); + else if (b1->bst != NULL && b2->bst != NULL) + return ((pmap_kextract(b1->bsh) == pmap_kextract(b2->bsh)) ? + 1 : 0); + else + return (0); } static int @@ -54,16 +61,21 @@ ofw_get_uart_console(phandle_t opts, pha const char *outputdev) { char buf[64]; - phandle_t input; + phandle_t input, output; + *result = -1; if (OF_getprop(opts, inputdev, buf, sizeof(buf)) == -1) - return (ENXIO); + return (ENOENT); input = OF_finddevice(buf); if (input == -1) - return (ENXIO); + return (ENOENT); if (OF_getprop(opts, outputdev, buf, sizeof(buf)) == -1) - return (ENXIO); - if (OF_finddevice(buf) != input) + return (ENOENT); + output = OF_finddevice(buf); + if (output == -1) + return (ENOENT); + + if (input != output) /* UARTs are bidirectional */ return (ENXIO); *result = input; @@ -75,28 +87,42 @@ uart_cpu_getdev(int devtype, struct uart { char buf[64]; struct uart_class *class; - phandle_t input, opts; + ihandle_t stdout; + phandle_t input, opts, chosen; + cell_t reg; int error; - class = &uart_z8530_class; - if (class == NULL) - return (ENXIO); - if ((opts = OF_finddevice("/options")) == -1) return (ENXIO); + if ((chosen = OF_finddevice("/chosen")) == -1) + return (ENXIO); switch (devtype) { case UART_DEV_CONSOLE: - if (ofw_get_uart_console(opts, &input, "input-device", - "output-device")) { + do { + /* Check if OF has an active stdin/stdout */ + input = -1; + if (OF_getprop(chosen, "stdout", &stdout, + sizeof(stdout)) == sizeof(stdout) && stdout != 0) + input = OF_instance_to_package(stdout); + if (input != -1) + break; + + /* Guess what OF would have done had it had such */ + if (ofw_get_uart_console(opts, &input, "input-device", + "output-device") == 0) + break; + /* * At least some G5 Xserves require that we * probe input-device-1 as well */ - if (ofw_get_uart_console(opts, &input, "input-device-1", - "output-device-1")) - return (ENXIO); - } + "output-device-1") == 0) + break; + } while (0); + + if (input == -1) + return (ENXIO); break; case UART_DEV_DBGPORT: if (!getenv_string("hw.uart.dbgport", buf, sizeof(buf))) @@ -124,12 +150,24 @@ uart_cpu_getdev(int devtype, struct uart class = &uart_ns8250_class; di->bas.regshft = 0; di->bas.chan = 0; + } else if (strcmp(buf,"vty") == 0) { + class = &uart_phyp_class; + di->bas.regshft = 0; + di->bas.chan = input; } else return (ENXIO); - error = OF_decode_addr(input, 0, &di->bas.bst, &di->bas.bsh); - if (error) - return (error); + if (strcmp(buf,"vty") == 0) { + if (OF_getproplen(input, "reg") != sizeof(reg)) + return (ENXIO); + OF_getprop(input, "reg", ®, sizeof(reg)); + di->bas.bsh = reg; + di->bas.bst = NULL; + } else { + error = OF_decode_addr(input, 0, &di->bas.bst, &di->bas.bsh); + if (error) + return (error); + } di->ops = uart_getops(class); Modified: projects/pseries/powerpc/pseries/phyp_console.c ============================================================================== --- projects/pseries/powerpc/pseries/phyp_console.c Wed Nov 2 20:45:44 2011 (r227032) +++ projects/pseries/powerpc/pseries/phyp_console.c Wed Nov 2 20:55:55 2011 (r227033) @@ -25,8 +25,6 @@ #include __FBSDID("$FreeBSD: projects/pseries/powerpc/phyp/phyp_console.c 214348 2010-10-25 15:41:12Z nwhitehorn $"); -#include "opt_comconsole.h" - #include #include #include @@ -39,178 +37,133 @@ __FBSDID("$FreeBSD: projects/pseries/pow #include #include - -#include +#include +#include +#include #include "phyp-hvcall.h" +#include "uart_if.h" -static tsw_outwakeup_t phyptty_outwakeup; - -static struct ttydevsw phyp_ttydevsw = { - .tsw_flags = TF_NOPREFIX, - .tsw_outwakeup = phyptty_outwakeup, -}; - -static int polltime; -static cell_t termno; -static struct callout phyp_callout; static union { uint64_t u64[2]; char str[16]; } phyp_inbuf; static uint64_t phyp_inbuflen = 0; -static struct tty *tp = NULL; - -#if defined(KDB) && defined(ALT_BREAK_TO_DEBUGGER) -static int alt_break_state; -#endif - -static void phyp_timeout(void *); - -static cn_probe_t phyp_cnprobe; -static cn_init_t phyp_cninit; -static cn_term_t phyp_cnterm; -static cn_getc_t phyp_cngetc; -static cn_putc_t phyp_cnputc; - -CONSOLE_DRIVER(phyp); - -static void -cn_drvinit(void *unused) -{ - phandle_t dev; - if (phyp_consdev.cn_pri != CN_DEAD && - phyp_consdev.cn_name[0] != '\0') { - dev = OF_finddevice("/vdevice/vty"); - if (dev == -1) - return; - - OF_getprop(dev, "reg", &termno, sizeof(termno)); - tp = tty_alloc(&phyp_ttydevsw, NULL); - tty_init_console(tp, 0); - tty_makedev(tp, NULL, "%s", "phypvty"); - - polltime = 1; - - callout_init(&phyp_callout, CALLOUT_MPSAFE); - callout_reset(&phyp_callout, polltime, phyp_timeout, NULL); - } -} - -SYSINIT(cndev, SI_SUB_CONFIGURE, SI_ORDER_MIDDLE, cn_drvinit, NULL); - -static void -phyptty_outwakeup(struct tty *tp) -{ - int len, err; - uint64_t buf[2]; - - for (;;) { - len = ttydisc_getc(tp, buf, sizeof buf); - if (len == 0) - break; - - do { - err = phyp_hcall(H_PUT_TERM_CHAR, termno, - (register_t)len, buf[0], buf[1]); - } while (err == H_BUSY); - } -} - -static void -phyp_timeout(void *v) -{ - int c; +enum { + HVTERM1, HVTERMPROT +}; - tty_lock(tp); - while ((c = phyp_cngetc(NULL)) != -1) - ttydisc_rint(tp, c, 0); - ttydisc_rint_done(tp); - tty_unlock(tp); +/* + * Low-level UART interface + */ +static int phyp_uart_probe(struct uart_bas *bas); +static void phyp_uart_init(struct uart_bas *bas, int baudrate, int databits, + int stopbits, int parity); +static void phyp_uart_term(struct uart_bas *bas); +static void phyp_uart_putc(struct uart_bas *bas, int c); +static int phyp_uart_rxready(struct uart_bas *bas); +static int phyp_uart_getc(struct uart_bas *bas, struct mtx *hwmtx); + +static struct uart_ops phyp_uart_ops = { + .probe = phyp_uart_probe, + .init = phyp_uart_init, + .term = phyp_uart_term, + .putc = phyp_uart_putc, + .rxready = phyp_uart_rxready, + .getc = phyp_uart_getc, +}; - callout_reset(&phyp_callout, polltime, phyp_timeout, NULL); -} +struct uart_class uart_phyp_class = { + "uart", + NULL, + sizeof(struct uart_softc), + .uc_ops = &phyp_uart_ops, + .uc_range = 1, + .uc_rclk = 0x5bbc +}; -static void -phyp_cnprobe(struct consdev *cp) +static int +phyp_uart_probe(struct uart_bas *bas) { - phandle_t dev; - - dev = OF_finddevice("/vdevice/vty"); + phandle_t node = bas->chan; + char buf[64]; - if (dev == -1) { - cp->cn_pri = CN_DEAD; - return; + if (OF_getprop(node, "name", buf, sizeof(buf)) <= 0) + return (ENXIO); + if (strcmp(buf, "vty") != 0) + return (ENXIO); + + if (OF_getprop(node, "device_type", buf, sizeof(buf)) <= 0) + return (ENXIO); + if (strcmp(buf, "serial") != 0) + return (ENXIO); + + if (OF_getprop(node, "compatible", buf, sizeof(buf)) <= 0) + return (ENXIO); + if (strcmp(buf, "hvterm1") == 0) { + bas->regshft = HVTERM1; + return (0); + } else if (strcmp(buf, "hvterm-protocol") == 0) { + bas->regshft = HVTERMPROT; + return (0); } - - OF_getprop(dev, "reg", &termno, sizeof(termno)); - cp->cn_pri = CN_NORMAL; + + return (ENXIO); } static void -phyp_cninit(struct consdev *cp) +phyp_uart_init(struct uart_bas *bas, int baudrate __unused, + int databits __unused, int stopbits __unused, int parity __unused) { - - /* XXX: This is the alias, but that should be good enough */ - strcpy(cp->cn_name, "phypcons"); } static void -phyp_cnterm(struct consdev *cp) +phyp_uart_term(struct uart_bas *bas __unused) { } static int -phyp_cngetc(struct consdev *cp) +phyp_uart_getc(struct uart_bas *bas, struct mtx *hwmtx) { int ch, err; -#if defined(KDB) && defined(ALT_BREAK_TO_DEBUGGER) - int kdb_brk; -#endif - /* XXX: thread safety */ + uart_lock(hwmtx); if (phyp_inbuflen == 0) { - err = phyp_pft_hcall(H_GET_TERM_CHAR, termno, 0, 0, 0, - &phyp_inbuflen, &phyp_inbuf.u64[0], &phyp_inbuf.u64[1]); - if (err != H_SUCCESS) + err = phyp_pft_hcall(H_GET_TERM_CHAR, (uint64_t)bas->bsh, + 0, 0, 0, &phyp_inbuflen, &phyp_inbuf.u64[0], + &phyp_inbuf.u64[1]); + if (err != H_SUCCESS) { + uart_unlock(hwmtx); return (-1); + } } - if (phyp_inbuflen == 0) + if (phyp_inbuflen == 0) { + uart_unlock(hwmtx); return (-1); + } ch = phyp_inbuf.str[0]; phyp_inbuflen--; if (phyp_inbuflen > 0) memcpy(&phyp_inbuf.str[0], &phyp_inbuf.str[1], phyp_inbuflen); -#if defined(KDB) && defined(ALT_BREAK_TO_DEBUGGER) - if ((kdb_brk = kdb_alt_break(ch, &alt_break_state)) != 0) { - switch (kdb_brk) { - case KDB_REQ_DEBUGGER: - kdb_enter(KDB_WHY_BREAK, - "Break sequence on console"); - break; - case KDB_REQ_PANIC: - kdb_panic("Panic sequence on console"); - break; - case KDB_REQ_REBOOT: - kdb_reboot(); - break; - - } - } -#endif + uart_unlock(hwmtx); return (ch); } static void -phyp_cnputc(struct consdev *cp, int c) +phyp_uart_putc(struct uart_bas *bas, int c) { uint64_t cbuf; cbuf = (uint64_t)c << 56; - phyp_hcall(H_PUT_TERM_CHAR, termno, 1UL, cbuf, 0); + phyp_hcall(H_PUT_TERM_CHAR, (uint64_t)bas->bsh, 1UL, cbuf, 0); } +static int +phyp_uart_rxready(struct uart_bas *bas) +{ + return (1); +} From owner-svn-src-projects@FreeBSD.ORG Wed Nov 2 21:02:42 2011 Return-Path: Delivered-To: svn-src-projects@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id DAE87106566C; Wed, 2 Nov 2011 21:02:42 +0000 (UTC) (envelope-from cognet@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id CA2488FC0A; Wed, 2 Nov 2011 21:02:42 +0000 (UTC) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.4/8.14.4) with ESMTP id pA2L2g8v038261; Wed, 2 Nov 2011 21:02:42 GMT (envelope-from cognet@svn.freebsd.org) Received: (from cognet@localhost) by svn.freebsd.org (8.14.4/8.14.4/Submit) id pA2L2g4M038259; Wed, 2 Nov 2011 21:02:42 GMT (envelope-from cognet@svn.freebsd.org) Message-Id: <201111022102.pA2L2g4M038259@svn.freebsd.org> From: Olivier Houchard Date: Wed, 2 Nov 2011 21:02:42 +0000 (UTC) To: src-committers@freebsd.org, svn-src-projects@freebsd.org X-SVN-Group: projects MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r227035 - projects/armv6/sys/arm/include X-BeenThere: svn-src-projects@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: "SVN commit messages for the src " projects" tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 02 Nov 2011 21:02:42 -0000 Author: cognet Date: Wed Nov 2 21:02:42 2011 New Revision: 227035 URL: http://svn.freebsd.org/changeset/base/227035 Log: Crude implementation of the atomic operations for armv6/v7 Modified: projects/armv6/sys/arm/include/atomic.h Modified: projects/armv6/sys/arm/include/atomic.h ============================================================================== --- projects/armv6/sys/arm/include/atomic.h Wed Nov 2 20:58:47 2011 (r227034) +++ projects/armv6/sys/arm/include/atomic.h Wed Nov 2 21:02:42 2011 (r227035) @@ -45,11 +45,13 @@ #ifndef _KERNEL #include +#else +#include #endif -#define mb() -#define wmb() -#define rmb() +#define mb() +#define wmb() +#define rmb() #ifndef I32_bit #define I32_bit (1 << 7) /* IRQ disable */ @@ -58,6 +60,118 @@ #define F32_bit (1 << 6) /* FIQ disable */ #endif +/* XXX: Rethink for userland later as those won't be defined */ +#if defined(ARM_ARCH_6) || defined(ARM_ARCH_7) + +static __inline void +atomic_set_32(volatile uint32_t *address, uint32_t setmask) +{ + uint32_t tmp = 0, tmp2 = 0; + + __asm __volatile("1: ldrex %0, [%2]\n" + "orr %0, %0, %3\n" + "strex %1, %0, [%2]\n" + "cmp %1, #0\n" + "bne 1b\n" + : "=&r" (tmp), "+r" (tmp2) + , "+r" (address), "+r" (setmask) : : "memory"); + +} + +static __inline void +atomic_clear_32(volatile uint32_t *address, uint32_t setmask) +{ + uint32_t tmp = 0, tmp2 = 0; + + __asm __volatile("1: ldrex %0, [%2]\n" + "bic %0, %0, %3\n" + "strex %1, %0, [%2]\n" + "cmp %1, #0\n" + "bne 1b\n" + : "=&r" (tmp), "+r" (tmp2) + ,"+r" (address), "+r" (setmask) : : "memory"); +} + +static __inline u_int32_t +atomic_cmpset_32(volatile u_int32_t *p, volatile u_int32_t cmpval, volatile u_int32_t newval) +{ + uint32_t ret; + + __asm __volatile("1: ldrex %0, [%1]\n" + "cmp %0, %2\n" + "movne %0, #0\n" + "bne 2f\n" + "strex %0, %3, [%1]\n" + "cmp %0, #0\n" + "bne 1b\n" + "moveq %0, #1\n" + "2:" + : "=&r" (ret) + ,"+r" (p), "+r" (cmpval), "+r" (newval) : : "memory"); + return (ret); +} + +static __inline void +atomic_add_32(volatile u_int32_t *p, u_int32_t val) +{ + uint32_t tmp = 0, tmp2 = 0; + + __asm __volatile("1: ldrex %0, [%2]\n" + "add %0, %0, %3\n" + "strex %1, %0, [%2]\n" + "cmp %1, #0\n" + "bne 1b\n" + : "=&r" (tmp), "+r" (tmp2) + ,"+r" (p), "+r" (val) : : "memory"); +} + +static __inline void +atomic_subtract_32(volatile u_int32_t *p, u_int32_t val) +{ + uint32_t tmp = 0, tmp2 = 0; + + __asm __volatile("1: ldrex %0, [%2]\n" + "sub %0, %0, %3\n" + "strex %1, %0, [%2]\n" + "cmp %1, #0\n" + "bne 1b\n" + : "=&r" (tmp), "+r" (tmp2) + ,"+r" (p), "+r" (val) : : "memory"); +} + +static __inline uint32_t +atomic_fetchadd_32(volatile uint32_t *p, uint32_t val) +{ + uint32_t tmp = 0, tmp2 = 0, ret = 0; + + __asm __volatile("1: ldrex %0, [%3]\n" + "add %1, %0, %4\n" + "strex %2, %1, [%3]\n" + "cmp %2, #0\n" + "bne 1b\n" + : "+r" (ret), "=&r" (tmp), "+r" (tmp2) + ,"+r" (p), "+r" (val) : : "memory"); + return (ret); +} + +static __inline uint32_t +atomic_readandclear_32(volatile u_int32_t *p) +{ + uint32_t ret, tmp = 0, tmp2 = 0; + + __asm __volatile("1: ldrex %0, [%3]\n" + "mov %1, #0\n" + "strex %2, %1, [%3]\n" + "cmp %2, #0\n" + "bne 1b\n" + : "=r" (ret), "=&r" (tmp), "+r" (tmp2) + ,"+r" (p) : : "memory"); + return (ret); +} + + +#else /* < armv6 */ + #define __with_interrupts_disabled(expr) \ do { \ u_int cpsr_save, tmp; \ @@ -288,6 +402,20 @@ atomic_fetchadd_32(volatile uint32_t *p, #endif /* _KERNEL */ + +static __inline uint32_t +atomic_readandclear_32(volatile u_int32_t *p) +{ + + return (__swp(0, p)); +} + +#undef __with_interrupts_disabled + +#endif /* _LOCORE */ + +#endif /* Arch >= v6 */ + static __inline int atomic_load_32(volatile uint32_t *v) { @@ -301,17 +429,6 @@ atomic_store_32(volatile uint32_t *dst, *dst = src; } -static __inline uint32_t -atomic_readandclear_32(volatile u_int32_t *p) -{ - - return (__swp(0, p)); -} - -#undef __with_interrupts_disabled - -#endif /* _LOCORE */ - #define atomic_add_long(p, v) \ atomic_add_32((volatile u_int *)(p), (u_int)(v)) #define atomic_add_acq_long atomic_add_long @@ -385,4 +502,5 @@ atomic_readandclear_32(volatile u_int32_ #define atomic_load_acq_32 atomic_load_32 #define atomic_store_rel_32 atomic_store_32 + #endif /* _MACHINE_ATOMIC_H_ */ From owner-svn-src-projects@FreeBSD.ORG Wed Nov 2 21:03:27 2011 Return-Path: Delivered-To: svn-src-projects@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 5B87A1065670; Wed, 2 Nov 2011 21:03:27 +0000 (UTC) (envelope-from cognet@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id 4B83D8FC15; Wed, 2 Nov 2011 21:03:27 +0000 (UTC) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.4/8.14.4) with ESMTP id pA2L3Rw3038318; Wed, 2 Nov 2011 21:03:27 GMT (envelope-from cognet@svn.freebsd.org) Received: (from cognet@localhost) by svn.freebsd.org (8.14.4/8.14.4/Submit) id pA2L3Riq038316; Wed, 2 Nov 2011 21:03:27 GMT (envelope-from cognet@svn.freebsd.org) Message-Id: <201111022103.pA2L3Riq038316@svn.freebsd.org> From: Olivier Houchard Date: Wed, 2 Nov 2011 21:03:27 +0000 (UTC) To: src-committers@freebsd.org, svn-src-projects@freebsd.org X-SVN-Group: projects MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r227036 - projects/armv6/sys/arm/arm X-BeenThere: svn-src-projects@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: "SVN commit messages for the src " projects" tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 02 Nov 2011 21:03:27 -0000 Author: cognet Date: Wed Nov 2 21:03:26 2011 New Revision: 227036 URL: http://svn.freebsd.org/changeset/base/227036 Log: Set arm_dcache_align for armv7 as well, as busdma needs the information. Modified: projects/armv6/sys/arm/arm/cpufunc.c Modified: projects/armv6/sys/arm/arm/cpufunc.c ============================================================================== --- projects/armv6/sys/arm/arm/cpufunc.c Wed Nov 2 21:02:42 2011 (r227035) +++ projects/armv6/sys/arm/arm/cpufunc.c Wed Nov 2 21:03:26 2011 (r227036) @@ -1094,6 +1094,9 @@ get_cachetype_cp15() __asm __volatile("mrc p15, 1, %0, c0, c0, 0" : "=r" (csize)); arm_cache_type[sel] = csize; + arm_dcache_align = 1 << + (CPUV7_CT_xSIZE_LEN(csize) + 4); + arm_dcache_align_mask = arm_dcache_align - 1; } if (type == CACHE_ICACHE || type == CACHE_SEP_CACHE) { sel = (i << 1) | 1; From owner-svn-src-projects@FreeBSD.ORG Wed Nov 2 21:13:35 2011 Return-Path: Delivered-To: svn-src-projects@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 10F3C1065670; Wed, 2 Nov 2011 21:13:35 +0000 (UTC) (envelope-from nwhitehorn@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id 009AB8FC14; Wed, 2 Nov 2011 21:13:35 +0000 (UTC) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.4/8.14.4) with ESMTP id pA2LDYSn038670; Wed, 2 Nov 2011 21:13:34 GMT (envelope-from nwhitehorn@svn.freebsd.org) Received: (from nwhitehorn@localhost) by svn.freebsd.org (8.14.4/8.14.4/Submit) id pA2LDYKQ038668; Wed, 2 Nov 2011 21:13:34 GMT (envelope-from nwhitehorn@svn.freebsd.org) Message-Id: <201111022113.pA2LDYKQ038668@svn.freebsd.org> From: Nathan Whitehorn Date: Wed, 2 Nov 2011 21:13:34 +0000 (UTC) To: src-committers@freebsd.org, svn-src-projects@freebsd.org X-SVN-Group: projects MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r227037 - projects/pseries/powerpc/pseries X-BeenThere: svn-src-projects@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: "SVN commit messages for the src " projects" tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 02 Nov 2011 21:13:35 -0000 Author: nwhitehorn Date: Wed Nov 2 21:13:34 2011 New Revision: 227037 URL: http://svn.freebsd.org/changeset/base/227037 Log: Hypothetical support for hvterm-protocol systems. Modified: projects/pseries/powerpc/pseries/phyp_console.c Modified: projects/pseries/powerpc/pseries/phyp_console.c ============================================================================== --- projects/pseries/powerpc/pseries/phyp_console.c Wed Nov 2 21:03:26 2011 (r227036) +++ projects/pseries/powerpc/pseries/phyp_console.c Wed Nov 2 21:13:34 2011 (r227037) @@ -49,11 +49,22 @@ static union { char str[16]; } phyp_inbuf; static uint64_t phyp_inbuflen = 0; +static uint8_t phyp_outseqno = 0; enum { HVTERM1, HVTERMPROT }; +#define VS_DATA_PACKET_HEADER 0xff +#define VS_CONTROL_PACKET_HEADER 0xfe +#define VSV_SET_MODEM_CTL 0x01 +#define VSV_MODEM_CTL_UPDATE 0x02 +#define VSV_RENEGOTIATE_CONNECTION 0x03 +#define VS_QUERY_PACKET_HEADER 0xfd +#define VSV_SEND_VERSION_NUMBER 0x01 +#define VSV_SEND_MODEM_CTL_STATUS 0x02 +#define VS_QUERY_RESPONSE_PACKET_HEADER 0xfc + /* * Low-level UART interface */ @@ -156,10 +167,26 @@ phyp_uart_getc(struct uart_bas *bas, str static void phyp_uart_putc(struct uart_bas *bas, int c) { - uint64_t cbuf; - - cbuf = (uint64_t)c << 56; - phyp_hcall(H_PUT_TERM_CHAR, (uint64_t)bas->bsh, 1UL, cbuf, 0); + uint16_t seqno; + union { + uint64_t u64; + char bytes[8]; + } cbuf; + + switch (bas->regshft) { + case HVTERM1: + cbuf.bytes[0] = c; + break; + case HVTERMPROT: + seqno = phyp_outseqno++; + cbuf.bytes[0] = VS_DATA_PACKET_HEADER; + cbuf.bytes[1] = 5; /* total length */ + cbuf.bytes[2] = (seqno >> 8) & 0xff; + cbuf.bytes[3] = seqno & 0xff; + cbuf.bytes[4] = c; + break; + } + phyp_hcall(H_PUT_TERM_CHAR, (uint64_t)bas->bsh, 1UL, cbuf.u64, 0); } static int From owner-svn-src-projects@FreeBSD.ORG Wed Nov 2 21:15:12 2011 Return-Path: Delivered-To: svn-src-projects@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id AC539106566B; Wed, 2 Nov 2011 21:15:12 +0000 (UTC) (envelope-from cognet@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id 9C3DF8FC15; Wed, 2 Nov 2011 21:15:12 +0000 (UTC) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.4/8.14.4) with ESMTP id pA2LFCf4038759; Wed, 2 Nov 2011 21:15:12 GMT (envelope-from cognet@svn.freebsd.org) Received: (from cognet@localhost) by svn.freebsd.org (8.14.4/8.14.4/Submit) id pA2LFC7W038757; Wed, 2 Nov 2011 21:15:12 GMT (envelope-from cognet@svn.freebsd.org) Message-Id: <201111022115.pA2LFC7W038757@svn.freebsd.org> From: Olivier Houchard Date: Wed, 2 Nov 2011 21:15:12 +0000 (UTC) To: src-committers@freebsd.org, svn-src-projects@freebsd.org X-SVN-Group: projects MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r227038 - projects/armv6/sys/arm/include X-BeenThere: svn-src-projects@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: "SVN commit messages for the src " projects" tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 02 Nov 2011 21:15:12 -0000 Author: cognet Date: Wed Nov 2 21:15:12 2011 New Revision: 227038 URL: http://svn.freebsd.org/changeset/base/227038 Log: Define _ARM_ARCH_6 if _ARM_ARCH_7 is defined, too. Modified: projects/armv6/sys/arm/include/asm.h Modified: projects/armv6/sys/arm/include/asm.h ============================================================================== --- projects/armv6/sys/arm/include/asm.h Wed Nov 2 21:13:34 2011 (r227037) +++ projects/armv6/sys/arm/include/asm.h Wed Nov 2 21:15:12 2011 (r227038) @@ -134,7 +134,8 @@ #define _ARM_ARCH_7 #endif -#if defined (__ARM_ARCH_6__) || defined (__ARM_ARCH_6J__) +#if defined(_ARM_ARCH_7) || defined (__ARM_ARCH_6__) || \ + defined (__ARM_ARCH_6J__) #define _ARM_ARCH_6 #endif From owner-svn-src-projects@FreeBSD.ORG Wed Nov 2 21:46:22 2011 Return-Path: Delivered-To: svn-src-projects@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id A4A7D106564A; Wed, 2 Nov 2011 21:46:22 +0000 (UTC) (envelope-from cognet@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id 94AB08FC08; Wed, 2 Nov 2011 21:46:22 +0000 (UTC) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.4/8.14.4) with ESMTP id pA2LkMQX039705; Wed, 2 Nov 2011 21:46:22 GMT (envelope-from cognet@svn.freebsd.org) Received: (from cognet@localhost) by svn.freebsd.org (8.14.4/8.14.4/Submit) id pA2LkMe7039703; Wed, 2 Nov 2011 21:46:22 GMT (envelope-from cognet@svn.freebsd.org) Message-Id: <201111022146.pA2LkMe7039703@svn.freebsd.org> From: Olivier Houchard Date: Wed, 2 Nov 2011 21:46:22 +0000 (UTC) To: src-committers@freebsd.org, svn-src-projects@freebsd.org X-SVN-Group: projects MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r227039 - projects/armv6/sys/conf X-BeenThere: svn-src-projects@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: "SVN commit messages for the src " projects" tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 02 Nov 2011 21:46:22 -0000 Author: cognet Date: Wed Nov 2 21:46:22 2011 New Revision: 227039 URL: http://svn.freebsd.org/changeset/base/227039 Log: The elf trampoline needs cpufunc_asm_armv7.S too Modified: projects/armv6/sys/conf/Makefile.arm Modified: projects/armv6/sys/conf/Makefile.arm ============================================================================== --- projects/armv6/sys/conf/Makefile.arm Wed Nov 2 21:15:12 2011 (r227038) +++ projects/armv6/sys/conf/Makefile.arm Wed Nov 2 21:46:22 2011 (r227039) @@ -76,7 +76,7 @@ FILES_CPU_FUNC = $S/$M/$M/cpufunc_asm_ar $S/$M/$M/cpufunc_asm_xscale.S $S/$M/$M/cpufunc_asm.S \ $S/$M/$M/cpufunc_asm_xscale_c3.S $S/$M/$M/cpufunc_asm_armv5_ec.S \ $S/$M/$M/cpufunc_asm_fa526.S $S/$M/$M/cpufunc_asm_sheeva.S \ - $S/$M/$M/cpufunc_asm_pj4b.S + $S/$M/$M/cpufunc_asm_pj4b.S $S/$M/$M/cpufunc_asm_armv7.S KERNEL_EXTRA=trampoline KERNEL_EXTRA_INSTALL=kernel.gz.tramp From owner-svn-src-projects@FreeBSD.ORG Wed Nov 2 21:48:31 2011 Return-Path: Delivered-To: svn-src-projects@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id BE3E81065670; Wed, 2 Nov 2011 21:48:31 +0000 (UTC) (envelope-from cognet@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id AD0CA8FC1A; Wed, 2 Nov 2011 21:48:31 +0000 (UTC) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.4/8.14.4) with ESMTP id pA2LmVJL039803; Wed, 2 Nov 2011 21:48:31 GMT (envelope-from cognet@svn.freebsd.org) Received: (from cognet@localhost) by svn.freebsd.org (8.14.4/8.14.4/Submit) id pA2LmVJ8039798; Wed, 2 Nov 2011 21:48:31 GMT (envelope-from cognet@svn.freebsd.org) Message-Id: <201111022148.pA2LmVJ8039798@svn.freebsd.org> From: Olivier Houchard Date: Wed, 2 Nov 2011 21:48:31 +0000 (UTC) To: src-committers@freebsd.org, svn-src-projects@freebsd.org X-SVN-Group: projects MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r227040 - in projects/armv6/sys: arm/arm conf X-BeenThere: svn-src-projects@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: "SVN commit messages for the src " projects" tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 02 Nov 2011 21:48:31 -0000 Author: cognet Date: Wed Nov 2 21:48:31 2011 New Revision: 227040 URL: http://svn.freebsd.org/changeset/base/227040 Log: Introduce ARM_L2_PIPT, as arm can have either a PIPT or a VIPT L2 cache. Based on work by Ben Gray, as found here : https://gitorious.org/+freebsd-omap-team/freebsd/freebsd-omap/commits/bengray-wip Modified: projects/armv6/sys/arm/arm/busdma_machdep-v6.c projects/armv6/sys/arm/arm/pmap-v6.c projects/armv6/sys/arm/arm/vm_machdep.c projects/armv6/sys/conf/options.arm Modified: projects/armv6/sys/arm/arm/busdma_machdep-v6.c ============================================================================== --- projects/armv6/sys/arm/arm/busdma_machdep-v6.c Wed Nov 2 21:46:22 2011 (r227039) +++ projects/armv6/sys/arm/arm/busdma_machdep-v6.c Wed Nov 2 21:48:31 2011 (r227040) @@ -106,6 +106,7 @@ struct bounce_page { struct sync_list { vm_offset_t vaddr; /* kva of bounce buffer */ + bus_addr_t busaddr; /* Physical address */ bus_size_t datacount; /* client data count */ STAILQ_ENTRY(sync_list) slinks; }; @@ -785,6 +786,7 @@ _bus_dmamap_load_buffer(bus_dma_tag_t dm STAILQ_INSERT_TAIL(&(map->slist), sl, slinks); sl->vaddr = vaddr; sl->datacount = sgsize; + sl->busaddr = curaddr; } @@ -1090,6 +1092,16 @@ _bus_dmamap_fix_user(vm_offset_t buf, bu } #endif +#ifdef ARM_L2_PIPT +#define l2cache_wb_range(va, pa, size) cpu_l2cache_wb_range(pa, size) +#define l2cache_wbinv_range(va, pa, size) cpu_l2cache_wbinv_range(pa, size) +#define l2cache_inv_range(va, pa, size) cpu_l2cache_inv_range(pa, size) +#else +#define l2cache_wb_range(va, pa, size) cpu_l2cache_wb_range(va, size) +#define l2cache_wbinv_range(va, pa, size) cpu_l2cache_wbinv_range(va, size) +#define l2cache_inv_range(va, pa, size) cpu_l2cache_wbinv_range(va, size) +#endif + void _bus_dmamap_sync(bus_dma_tag_t dmat, bus_dmamap_t map, bus_dmasync_op_t op) { @@ -1101,6 +1113,7 @@ _bus_dmamap_sync(bus_dma_tag_t dmat, bus vm_offset_t bbuf; char _tmp_cl[arm_dcache_align], _tmp_clend[arm_dcache_align]; #endif + int listcount = 0; /* if buffer was from user space, it it possible that this * is not the same vm map. The fix is to map each page in @@ -1116,10 +1129,10 @@ _bus_dmamap_sync(bus_dma_tag_t dmat, bus if ((bpage = STAILQ_FIRST(&map->bpages)) != NULL) { /* Handle data bouncing. */ - CTR4(KTR_BUSDMA, "%s: tag %p tag flags 0x%x op 0x%x " "performing bounce", __func__, dmat, dmat->flags, op); + printf("FAUT QUE CA BOUNCE\n"); if (op & BUS_DMASYNC_PREWRITE) { while (bpage != NULL) { bcopy((void *)bpage->datavaddr, @@ -1127,6 +1140,9 @@ _bus_dmamap_sync(bus_dma_tag_t dmat, bus bpage->datacount); cpu_dcache_wb_range((vm_offset_t)bpage->vaddr, bpage->datacount); + l2cache_wb_range((vm_offset_t)bpage->vaddr, + (vm_offset_t)bpage->busaddr, + bpage->datacount); bpage = STAILQ_NEXT(bpage, links); } dmat->bounce_zone->total_bounced++; @@ -1138,6 +1154,9 @@ _bus_dmamap_sync(bus_dma_tag_t dmat, bus cpu_dcache_inv_range((vm_offset_t)bpage->vaddr, bpage->datacount); + l2cache_inv_range((vm_offset_t)bpage->vaddr, + (vm_offset_t)bpage->busaddr, + bpage->datacount); while (bpage != NULL) { bcopy((void *)bpage->vaddr, (void *)bpage->datavaddr, @@ -1148,6 +1167,11 @@ _bus_dmamap_sync(bus_dma_tag_t dmat, bus } } + sl = STAILQ_FIRST(&map->slist); + while (sl) { + listcount++; + sl = STAILQ_NEXT(sl, slinks); + } if ((sl = STAILQ_FIRST(&map->slist)) != NULL) { /* ARM caches are not self-snooping for dma */ @@ -1158,6 +1182,8 @@ _bus_dmamap_sync(bus_dma_tag_t dmat, bus case BUS_DMASYNC_PREWRITE: while (sl != NULL) { cpu_dcache_wb_range(sl->vaddr, sl->datacount); + l2cache_wb_range(sl->vaddr, sl->busaddr, + sl->datacount); sl = STAILQ_NEXT(sl, slinks); } break; @@ -1165,17 +1191,23 @@ _bus_dmamap_sync(bus_dma_tag_t dmat, bus case BUS_DMASYNC_PREREAD: while (sl != NULL) { /* write back the unaligned portions */ + vm_paddr_t physaddr = sl->busaddr, ephysaddr; buf = sl->vaddr; len = sl->datacount; ebuf = buf + len; /* end of buffer */ + ephysaddr = physaddr + len; unalign = buf & arm_dcache_align_mask; if (unalign) { /* wbinv leading fragment */ buf &= ~arm_dcache_align_mask; + physaddr &= ~arm_dcache_align_mask; cpu_dcache_wbinv_range(buf, arm_dcache_align); + l2cache_wbinv_range(buf, physaddr, + arm_dcache_align); buf += arm_dcache_align; - /* number byte in buffer wbinv */ + physaddr += arm_dcache_align; + /* number byte in buffer wbinv */ unalign = arm_dcache_align - unalign; if (len > unalign) len -= unalign; @@ -1187,11 +1219,15 @@ _bus_dmamap_sync(bus_dma_tag_t dmat, bus /* wbinv trailing fragment */ len -= unalign; ebuf -= unalign; + ephysaddr -= unalign; cpu_dcache_wbinv_range(ebuf, - arm_dcache_align); + arm_dcache_align); + l2cache_wbinv_range(ebuf, ephysaddr, + arm_dcache_align); } if (ebuf > buf) { cpu_dcache_inv_range(buf, len); + l2cache_inv_range(buf, physaddr, len); } sl = STAILQ_NEXT(sl, slinks); } @@ -1200,6 +1236,8 @@ _bus_dmamap_sync(bus_dma_tag_t dmat, bus case BUS_DMASYNC_PREWRITE | BUS_DMASYNC_PREREAD: while (sl != NULL) { cpu_dcache_wbinv_range(sl->vaddr, sl->datacount); + l2cache_wbinv_range(sl->vaddr, + sl->busaddr, sl->datacount); sl = STAILQ_NEXT(sl, slinks); } break; @@ -1210,10 +1248,13 @@ _bus_dmamap_sync(bus_dma_tag_t dmat, bus panic("_bus_dmamap_sync: wrong user map. apply fix"); while (sl != NULL) { /* write back the unaligned portions */ + vm_paddr_t physaddr; buf = sl->vaddr; len = sl->datacount; + physaddr = sl->busaddr; bbuf = buf & ~arm_dcache_align_mask; ebuf = buf + len; + physaddr = physaddr & ~arm_dcache_align_mask; unalign = buf & arm_dcache_align_mask; if (unalign) { memcpy(_tmp_cl, (void *)bbuf, unalign); @@ -1227,6 +1268,7 @@ _bus_dmamap_sync(bus_dma_tag_t dmat, bus } /* inv are cache length aligned */ cpu_dcache_inv_range(bbuf, len); + l2cache_inv_range(bbuf, physaddr, len); unalign = (vm_offset_t)buf & arm_dcache_align_mask; if (unalign) { Modified: projects/armv6/sys/arm/arm/pmap-v6.c ============================================================================== --- projects/armv6/sys/arm/arm/pmap-v6.c Wed Nov 2 21:46:22 2011 (r227039) +++ projects/armv6/sys/arm/arm/pmap-v6.c Wed Nov 2 21:48:31 2011 (r227040) @@ -2372,7 +2372,11 @@ pmap_change_attr(vm_offset_t sva, vm_siz pte = *ptep &~ L2_S_CACHE_MASK; cpu_idcache_wbinv_range(tmpva, PAGE_SIZE); +#ifdef ARM_L2_PIPT + cpu_l2cache_wbinv_range(pte & L2_S_FRAME, PAGE_SIZE); +#else cpu_l2cache_wbinv_range(tmpva, PAGE_SIZE); +#endif cpu_tlb_flushID_SE(tmpva); dprintf("%s: for va:%x ptep:%x pte:%x\n", Modified: projects/armv6/sys/arm/arm/vm_machdep.c ============================================================================== --- projects/armv6/sys/arm/arm/vm_machdep.c Wed Nov 2 21:46:22 2011 (r227039) +++ projects/armv6/sys/arm/arm/vm_machdep.c Wed Nov 2 21:48:31 2011 (r227040) @@ -485,7 +485,11 @@ arm_remap_nocache(void *addr, vm_size_t for (; tomap < (vm_offset_t)ret + size; tomap += PAGE_SIZE, vaddr += PAGE_SIZE, physaddr += PAGE_SIZE, i++) { cpu_idcache_wbinv_range(vaddr, PAGE_SIZE); +#ifdef ARM_L2_PIPT + cpu_l2cache_wbinv_range(physaddr, PAGE_SIZE); +#else cpu_l2cache_wbinv_range(vaddr, PAGE_SIZE); +#endif pmap_kenter_nocache(tomap, physaddr); cpu_tlb_flushID_SE(vaddr); arm_nocache_allocated[i / BITS_PER_INT] |= 1 << (i % Modified: projects/armv6/sys/conf/options.arm ============================================================================== --- projects/armv6/sys/conf/options.arm Wed Nov 2 21:46:22 2011 (r227039) +++ projects/armv6/sys/conf/options.arm Wed Nov 2 21:48:31 2011 (r227040) @@ -3,6 +3,7 @@ ARM9_CACHE_WRITE_THROUGH opt_global.h ARM_CACHE_LOCK_ENABLE opt_global.h ARMFPE opt_global.h ARM_KERN_DIRECTMAP opt_vm.h +ARM_L2_PIPT opt_global.h ARM_USE_SMALL_ALLOC opt_global.h AT91C_MASTER_CLOCK opt_global.h AT91C_MAIN_CLOCK opt_at91.h From owner-svn-src-projects@FreeBSD.ORG Wed Nov 2 23:18:19 2011 Return-Path: Delivered-To: svn-src-projects@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id B2E291065670; Wed, 2 Nov 2011 23:18:19 +0000 (UTC) (envelope-from cognet@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id A2E7F8FC0A; Wed, 2 Nov 2011 23:18:19 +0000 (UTC) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.4/8.14.4) with ESMTP id pA2NIJp4042710; Wed, 2 Nov 2011 23:18:19 GMT (envelope-from cognet@svn.freebsd.org) Received: (from cognet@localhost) by svn.freebsd.org (8.14.4/8.14.4/Submit) id pA2NIJuO042708; Wed, 2 Nov 2011 23:18:19 GMT (envelope-from cognet@svn.freebsd.org) Message-Id: <201111022318.pA2NIJuO042708@svn.freebsd.org> From: Olivier Houchard Date: Wed, 2 Nov 2011 23:18:19 +0000 (UTC) To: src-committers@freebsd.org, svn-src-projects@freebsd.org X-SVN-Group: projects MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r227041 - projects/armv6/sys/arm/arm X-BeenThere: svn-src-projects@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: "SVN commit messages for the src " projects" tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 02 Nov 2011 23:18:19 -0000 Author: cognet Date: Wed Nov 2 23:18:19 2011 New Revision: 227041 URL: http://svn.freebsd.org/changeset/base/227041 Log: Remove debugging printf Modified: projects/armv6/sys/arm/arm/busdma_machdep-v6.c Modified: projects/armv6/sys/arm/arm/busdma_machdep-v6.c ============================================================================== --- projects/armv6/sys/arm/arm/busdma_machdep-v6.c Wed Nov 2 21:48:31 2011 (r227040) +++ projects/armv6/sys/arm/arm/busdma_machdep-v6.c Wed Nov 2 23:18:19 2011 (r227041) @@ -1132,7 +1132,6 @@ _bus_dmamap_sync(bus_dma_tag_t dmat, bus CTR4(KTR_BUSDMA, "%s: tag %p tag flags 0x%x op 0x%x " "performing bounce", __func__, dmat, dmat->flags, op); - printf("FAUT QUE CA BOUNCE\n"); if (op & BUS_DMASYNC_PREWRITE) { while (bpage != NULL) { bcopy((void *)bpage->datavaddr, From owner-svn-src-projects@FreeBSD.ORG Thu Nov 3 12:24:45 2011 Return-Path: Delivered-To: svn-src-projects@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 37F60106566C; Thu, 3 Nov 2011 12:24:45 +0000 (UTC) (envelope-from linimon@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id 27D838FC12; Thu, 3 Nov 2011 12:24:45 +0000 (UTC) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.4/8.14.4) with ESMTP id pA3COj3p070359; Thu, 3 Nov 2011 12:24:45 GMT (envelope-from linimon@svn.freebsd.org) Received: (from linimon@localhost) by svn.freebsd.org (8.14.4/8.14.4/Submit) id pA3COjWT070355; Thu, 3 Nov 2011 12:24:45 GMT (envelope-from linimon@svn.freebsd.org) Message-Id: <201111031224.pA3COjWT070355@svn.freebsd.org> From: Mark Linimon Date: Thu, 3 Nov 2011 12:24:45 +0000 (UTC) To: src-committers@freebsd.org, svn-src-projects@freebsd.org X-SVN-Group: projects MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r227057 - projects/portbuild/scripts X-BeenThere: svn-src-projects@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: "SVN commit messages for the src " projects" tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Thu, 03 Nov 2011 12:24:45 -0000 Author: linimon (doc,ports committer) Date: Thu Nov 3 12:24:44 2011 New Revision: 227057 URL: http://svn.freebsd.org/changeset/base/227057 Log: Make these scripts' error messages a bit more verbose. Modified: projects/portbuild/scripts/clean-chroot projects/portbuild/scripts/cleanup-chroots projects/portbuild/scripts/cleanup-tmp Modified: projects/portbuild/scripts/clean-chroot ============================================================================== --- projects/portbuild/scripts/clean-chroot Thu Nov 3 12:03:03 2011 (r227056) +++ projects/portbuild/scripts/clean-chroot Thu Nov 3 12:24:44 2011 (r227057) @@ -12,7 +12,7 @@ kill_procs() while [ ! -z "${pids}" ]; do pids=$(fstat -f "${dir}${mount}" | tail +2 | awk '{print $3}' | sort -u) if [ ! -z "${pids}" ]; then - echo "Killing off pids in ${dir}" + echo "clean-chroot: Killing off pids in ${dir}" ps -p $pids kill -KILL ${pids} 2> /dev/null sleep 2 @@ -27,11 +27,11 @@ cleanup_mount() { if [ -d ${chroot}${mount} ]; then mdir=$(fstat -f ${chroot}${mount} | head -2 | tail -1 | awk '{print $5}') if [ "${mdir}" = "MOUNT" ]; then - umount -f ${chroot}${mount} || echo "Cleanup of ${chroot}${mount} on $(hostname) failed!" + umount -f ${chroot}${mount} || echo "clean-chroot: Cleanup of ${chroot}${mount} on $(hostname) failed!" fi if [ "${mdir}" = "${chroot}${mount}" ]; then kill_procs ${chroot} ${mount} - umount -f ${chroot}${mount} || echo "Cleanup of ${chroot}${mount} on $(hostname) failed!" + umount -f ${chroot}${mount} || echo "clean-chroot: Cleanup of ${chroot}${mount} on $(hostname) failed!" fi fi } Modified: projects/portbuild/scripts/cleanup-chroots ============================================================================== --- projects/portbuild/scripts/cleanup-chroots Thu Nov 3 12:03:03 2011 (r227056) +++ projects/portbuild/scripts/cleanup-chroots Thu Nov 3 12:24:44 2011 (r227057) @@ -25,7 +25,7 @@ kill_procs() while [ ! -z "${pids}" ]; do pids=$(fstat -f "$dir" | tail +2 | awk '{print $3}' | sort -u) if [ ! -z "${pids}" ]; then - echo "Killing off pids in ${dir} on $(hostname)" + echo "cleanup-chroots: Killing off pids in ${dir} on $(hostname)" ps -p $pids kill -KILL ${pids} 2> /dev/null sleep 2 @@ -42,11 +42,11 @@ cleanup_mount() { if [ -d ${chroot}${mount} ]; then mdir=$(fstat -f ${chroot}${mount} | head -2 | tail -1 | awk '{print $5}') if [ "${mdir}" = "MOUNT" ]; then - umount ${chroot}${mount} || echo "Cleanup of ${chroot}${mount} on $(hostname) failed!" + umount ${chroot}${mount} || echo "cleanup-chroots: Cleanup of ${chroot}${mount} on $(hostname) failed!" fi if [ "${mdir}" = "${chroot}${mount}" ]; then kill_procs ${chroot}${mount} - umount ${chroot}${mount} || echo "Cleanup of ${chroot}${mount} on $(hostname) failed!" + umount ${chroot}${mount} || echo "cleanup-chroots: Cleanup of ${chroot}${mount} on $(hostname) failed!" fi fi } @@ -58,7 +58,7 @@ cleanup_all() { mounts=$(mount | grep ${chroot} | awk '{print $3}') if [ ! -z "${mounts}" ]; then if [ $VERBOSE ]; then - echo "trying to kill off mounts:" + echo "cleanup-chroots: trying to kill off mounts:" echo ${mounts} echo fi @@ -90,12 +90,12 @@ else fi if [ ! -z "${old_chroots}" ]; then - echo "non-empty chroots > 1 hr old found on $(hostname):" + echo "cleanup-chroots: non-empty chroots > 1 hr old found on $(hostname):" echo ${old_chroots} echo else if [ $VERBOSE ]; then - echo "no non-empty chroots > 1 hr old found on $(hostname)." + echo "cleanup-chroots: no non-empty chroots > 1 hr old found on $(hostname)." echo fi fi @@ -117,12 +117,12 @@ if [ ! -z "${old_chroots}" ]; then fi if [ ! -z "${stale_chroots}" ]; then - echo "non-empty, > 1 hr old stale chroots found on $(hostname):" + echo "cleanup-chroots: non-empty, > 1 hr old stale chroots found on $(hostname):" echo ${stale_chroots} echo else if [ $VERBOSE ]; then - echo "no non-empty, > 1 hr old stale chroots found on $(hostname)." + echo "cleanup-chroots: no non-empty, > 1 hr old stale chroots found on $(hostname)." echo fi fi @@ -162,12 +162,12 @@ for build in ${builds}; do done if [ ! -z "${stale_builds}" ]; then - echo "empty stale builds found on $(hostname):" + echo "cleanup-chroots: empty stale builds found on $(hostname):" echo ${stale_builds} echo else if [ $VERBOSE ]; then - echo "no empty stale builds found on $(hostname)." + echo "cleanup-chroots: no empty stale builds found on $(hostname)." echo fi fi @@ -178,7 +178,7 @@ if [ ! -z "${stale_builds}" ]; then # XXX MCL HACK! what I really want is "give me the next 2 subdirs after $build" mounts=$(mount | grep "${build}" | awk '{print $3}' | grep -E "/dev$") if [ $VERBOSE ]; then - echo "suspected stale mounts on $(hostname):" + echo "cleanup-chroots: suspected stale mounts on $(hostname):" echo ${mounts} echo fi Modified: projects/portbuild/scripts/cleanup-tmp ============================================================================== --- projects/portbuild/scripts/cleanup-tmp Thu Nov 3 12:03:03 2011 (r227056) +++ projects/portbuild/scripts/cleanup-tmp Thu Nov 3 12:24:44 2011 (r227057) @@ -30,37 +30,37 @@ old_script_caches=$(find /tmp/2* -type d old_setupnodes=$(find /tmp/setupnode.* -type f -prune -mmin +${REMOVE_SETUPNODE_TIME} 2> /dev/null) if [ ! -z "${old_dotsetupdirs}" ]; then - echo "non-empty stale dotsetupdirs found on $(hostname):" + echo "cleanup-tmp: non-empty stale dotsetupdirs found on $(hostname):" echo ${old_dotsetupdirs} echo rm -rf ${old_dotsetupdirs} else if [ $VERBOSE ]; then - echo "no non-empty stale dotsetupdirs found on $(hostname)." + echo "cleanup-tmp: no non-empty stale dotsetupdirs found on $(hostname)." echo fi fi if [ ! -z "${old_script_caches}" ]; then - echo "non-empty stale script_caches found on $(hostname):" + echo "cleanup-tmp: non-empty stale script_caches found on $(hostname):" echo ${old_script_caches} echo rm -rf ${old_script_caches} else if [ $VERBOSE ]; then - echo "no non-empty stale script_caches found on $(hostname)." + echo "cleanup-tmp: no non-empty stale script_caches found on $(hostname)." echo fi fi if [ ! -z "${old_setupnodes}" ]; then - echo "non-empty stale setupnodes found on $(hostname):" + echo "cleanup-tmp: non-empty stale setupnodes found on $(hostname):" echo ${old_setupnodes} echo rm -rf ${old_setupnodes} else if [ $VERBOSE ]; then - echo "no non-empty stale setupnodes found on $(hostname)." + echo "cleanup-tmp: no non-empty stale setupnodes found on $(hostname)." echo fi fi From owner-svn-src-projects@FreeBSD.ORG Thu Nov 3 18:09:11 2011 Return-Path: Delivered-To: svn-src-projects@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 816D7106564A; Thu, 3 Nov 2011 18:09:11 +0000 (UTC) (envelope-from delphij@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id 585F88FC08; Thu, 3 Nov 2011 18:09:11 +0000 (UTC) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.4/8.14.4) with ESMTP id pA3I9BOZ080999; Thu, 3 Nov 2011 18:09:11 GMT (envelope-from delphij@svn.freebsd.org) Received: (from delphij@localhost) by svn.freebsd.org (8.14.4/8.14.4/Submit) id pA3I9BJY080998; Thu, 3 Nov 2011 18:09:11 GMT (envelope-from delphij@svn.freebsd.org) Message-Id: <201111031809.pA3I9BJY080998@svn.freebsd.org> From: Xin LI Date: Thu, 3 Nov 2011 18:09:11 +0000 (UTC) To: src-committers@freebsd.org, svn-src-projects@freebsd.org X-SVN-Group: projects MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r227060 - projects/head_mfi X-BeenThere: svn-src-projects@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: "SVN commit messages for the src " projects" tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Thu, 03 Nov 2011 18:09:11 -0000 Author: delphij Date: Thu Nov 3 18:09:11 2011 New Revision: 227060 URL: http://svn.freebsd.org/changeset/base/227060 Log: Copy head over to a branch where we will work on an updated mfi(4) driver. Added: - copied from r227059, head/ Directory Properties: projects/head_mfi/ (props changed) From owner-svn-src-projects@FreeBSD.ORG Thu Nov 3 20:29:21 2011 Return-Path: Delivered-To: svn-src-projects@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 3D6861065670; Thu, 3 Nov 2011 20:29:21 +0000 (UTC) (envelope-from cognet@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id 2D3838FC1B; Thu, 3 Nov 2011 20:29:21 +0000 (UTC) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.4/8.14.4) with ESMTP id pA3KTLXW085702; Thu, 3 Nov 2011 20:29:21 GMT (envelope-from cognet@svn.freebsd.org) Received: (from cognet@localhost) by svn.freebsd.org (8.14.4/8.14.4/Submit) id pA3KTLPC085700; Thu, 3 Nov 2011 20:29:21 GMT (envelope-from cognet@svn.freebsd.org) Message-Id: <201111032029.pA3KTLPC085700@svn.freebsd.org> From: Olivier Houchard Date: Thu, 3 Nov 2011 20:29:21 +0000 (UTC) To: src-committers@freebsd.org, svn-src-projects@freebsd.org X-SVN-Group: projects MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r227063 - projects/armv6/sys/arm/arm X-BeenThere: svn-src-projects@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: "SVN commit messages for the src " projects" tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Thu, 03 Nov 2011 20:29:21 -0000 Author: cognet Date: Thu Nov 3 20:29:20 2011 New Revision: 227063 URL: http://svn.freebsd.org/changeset/base/227063 Log: In the wb/inv operations, make sure the addresses are aligned on a cache line boundary. Modified: projects/armv6/sys/arm/arm/cpufunc_asm_armv7.S Modified: projects/armv6/sys/arm/arm/cpufunc_asm_armv7.S ============================================================================== --- projects/armv6/sys/arm/arm/cpufunc_asm_armv7.S Thu Nov 3 18:55:18 2011 (r227062) +++ projects/armv6/sys/arm/arm/cpufunc_asm_armv7.S Thu Nov 3 20:29:20 2011 (r227063) @@ -141,6 +141,10 @@ ENTRY(armv7_idcache_wbinv_all) ENTRY(armv7_dcache_wb_range) ldr ip, .Larmv7_line_size + sub r3, ip, #1 + and r2, r0, r3 + add r1, r1, r2 + bic r0, r0, r3 .Larmv7_wb_next: mcr p15, 0, r0, c7, c10, 1 /* Clean D cache SE with VA */ add r0, r0, ip @@ -151,6 +155,10 @@ ENTRY(armv7_dcache_wb_range) ENTRY(armv7_dcache_wbinv_range) ldr ip, .Larmv7_line_size + sub r3, ip, #1 + and r2, r0, r3 + add r1, r1, r2 + bic r0, r0, r3 .Larmv7_wbinv_next: mcr p15, 0, r0, c7, c14, 1 /* Purge D cache SE with VA */ add r0, r0, ip @@ -165,6 +173,10 @@ ENTRY(armv7_dcache_wbinv_range) */ ENTRY(armv7_dcache_inv_range) ldr ip, .Larmv7_line_size + sub r3, ip, #1 + and r2, r0, r3 + add r1, r1, r2 + bic r0, r0, r3 .Larmv7_inv_next: mcr p15, 0, r0, c7, c6, 1 /* Invalidate D cache SE with VA */ add r0, r0, ip @@ -175,6 +187,10 @@ ENTRY(armv7_dcache_inv_range) ENTRY(armv7_idcache_wbinv_range) ldr ip, .Larmv7_line_size + sub r3, ip, #1 + and r2, r0, r3 + add r1, r1, r2 + bic r0, r0, r3 .Larmv7_id_wbinv_next: mcr p15, 0, r0, c7, c5, 1 /* Invalidate I cache SE with VA */ mcr p15, 0, r0, c7, c14, 1 /* Purge D cache SE with VA */ From owner-svn-src-projects@FreeBSD.ORG Thu Nov 3 21:29:33 2011 Return-Path: Delivered-To: svn-src-projects@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id EAA10106564A; Thu, 3 Nov 2011 21:29:33 +0000 (UTC) (envelope-from cognet@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id DAB848FC17; Thu, 3 Nov 2011 21:29:33 +0000 (UTC) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.4/8.14.4) with ESMTP id pA3LTXop087577; Thu, 3 Nov 2011 21:29:33 GMT (envelope-from cognet@svn.freebsd.org) Received: (from cognet@localhost) by svn.freebsd.org (8.14.4/8.14.4/Submit) id pA3LTX1E087575; Thu, 3 Nov 2011 21:29:33 GMT (envelope-from cognet@svn.freebsd.org) Message-Id: <201111032129.pA3LTX1E087575@svn.freebsd.org> From: Olivier Houchard Date: Thu, 3 Nov 2011 21:29:33 +0000 (UTC) To: src-committers@freebsd.org, svn-src-projects@freebsd.org X-SVN-Group: projects MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r227065 - projects/armv6/sys/arm/arm X-BeenThere: svn-src-projects@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: "SVN commit messages for the src " projects" tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Thu, 03 Nov 2011 21:29:34 -0000 Author: cognet Date: Thu Nov 3 21:29:33 2011 New Revision: 227065 URL: http://svn.freebsd.org/changeset/base/227065 Log: Don't forget to set the PTE once we're done calculating it :) Modified: projects/armv6/sys/arm/arm/pmap-v6.c Modified: projects/armv6/sys/arm/arm/pmap-v6.c ============================================================================== --- projects/armv6/sys/arm/arm/pmap-v6.c Thu Nov 3 21:20:22 2011 (r227064) +++ projects/armv6/sys/arm/arm/pmap-v6.c Thu Nov 3 21:29:33 2011 (r227065) @@ -2377,6 +2377,7 @@ pmap_change_attr(vm_offset_t sva, vm_siz #else cpu_l2cache_wbinv_range(tmpva, PAGE_SIZE); #endif + *ptep = pte; cpu_tlb_flushID_SE(tmpva); dprintf("%s: for va:%x ptep:%x pte:%x\n", From owner-svn-src-projects@FreeBSD.ORG Fri Nov 4 01:58:55 2011 Return-Path: Delivered-To: svn-src-projects@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 8D04D106566C; Fri, 4 Nov 2011 01:58:55 +0000 (UTC) (envelope-from ambrisko@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id 7D8898FC0C; Fri, 4 Nov 2011 01:58:55 +0000 (UTC) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.4/8.14.4) with ESMTP id pA41wto5095947; Fri, 4 Nov 2011 01:58:55 GMT (envelope-from ambrisko@svn.freebsd.org) Received: (from ambrisko@localhost) by svn.freebsd.org (8.14.4/8.14.4/Submit) id pA41wthw095945; Fri, 4 Nov 2011 01:58:55 GMT (envelope-from ambrisko@svn.freebsd.org) Message-Id: <201111040158.pA41wthw095945@svn.freebsd.org> From: Doug Ambrisko Date: Fri, 4 Nov 2011 01:58:55 +0000 (UTC) To: src-committers@freebsd.org, svn-src-projects@freebsd.org X-SVN-Group: projects MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r227067 - projects/head_mfi/sys/dev/mpt X-BeenThere: svn-src-projects@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: "SVN commit messages for the src " projects" tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Fri, 04 Nov 2011 01:58:55 -0000 Author: ambrisko Date: Fri Nov 4 01:58:55 2011 New Revision: 227067 URL: http://svn.freebsd.org/changeset/base/227067 Log: Change mpt(4) probe to be an exact match to a PCI device ID. The current code makes the mpt(4) check for 0x005A and mistakenly attach to a mfi(4) device 0x005B. Without this fix, mpt(4) will panic if this mfi(4) card is in the system. Reviewed by: mjacob Modified: projects/head_mfi/sys/dev/mpt/mpt_pci.c Modified: projects/head_mfi/sys/dev/mpt/mpt_pci.c ============================================================================== --- projects/head_mfi/sys/dev/mpt/mpt_pci.c Thu Nov 3 21:57:02 2011 (r227066) +++ projects/head_mfi/sys/dev/mpt/mpt_pci.c Fri Nov 4 01:58:55 2011 (r227067) @@ -232,7 +232,7 @@ mpt_pci_probe(device_t dev) return (ENXIO); } - switch ((pci_get_device(dev) & ~1)) { + switch (pci_get_device(dev)) { case PCI_PRODUCT_LSI_FC909: desc = "LSILogic FC909 FC Adapter"; break; From owner-svn-src-projects@FreeBSD.ORG Fri Nov 4 02:34:53 2011 Return-Path: Delivered-To: svn-src-projects@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 2B427106566B; Fri, 4 Nov 2011 02:34:53 +0000 (UTC) (envelope-from ambrisko@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id 1A0B78FC14; Fri, 4 Nov 2011 02:34:53 +0000 (UTC) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.4/8.14.4) with ESMTP id pA42YqAC097078; Fri, 4 Nov 2011 02:34:52 GMT (envelope-from ambrisko@svn.freebsd.org) Received: (from ambrisko@localhost) by svn.freebsd.org (8.14.4/8.14.4/Submit) id pA42Yq2d097074; Fri, 4 Nov 2011 02:34:52 GMT (envelope-from ambrisko@svn.freebsd.org) Message-Id: <201111040234.pA42Yq2d097074@svn.freebsd.org> From: Doug Ambrisko Date: Fri, 4 Nov 2011 02:34:52 +0000 (UTC) To: src-committers@freebsd.org, svn-src-projects@freebsd.org X-SVN-Group: projects MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r227068 - in projects/head_mfi/sys: conf dev/mfi modules/mfi X-BeenThere: svn-src-projects@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: "SVN commit messages for the src " projects" tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Fri, 04 Nov 2011 02:34:53 -0000 Author: ambrisko Date: Fri Nov 4 02:34:52 2011 New Revision: 227068 URL: http://svn.freebsd.org/changeset/base/227068 Log: First cut at updating mfi(4) to support newer LSI MegaRAID SAS cards. Specifically, add support for "Drake Skinny" and "ThunderBolt" LSI cards. Initial code was supplied by LSI under BSD license. Several improvements were done by myself. Such things like making it work in a static kernel, be able to boot of the RAID, performance improvements. I removed some fairly complicated code that seemed to directly access the disks under the firmware. It doesn't seem to be needed and significantly slowed down the performance of the driver and caused tons of sense errors to be reported. This code is being checked in this area so others can help me get it into shape to commit into the FreeBSD tree. Assistance has been volunteered by iXsystems. We might want to re-work the JBOD attachment that creates /dev/mfisyspd? node for each disk. Performance is faster then prior cards. It works okay with WITNESS and INVARIANTS on amd64 and i386. I recall seeing a use after free time bug with FreeBSD 8 and a Drake Skinny card with WITNESS and INVARIANTS on. First task is get all of the new structures to be named in FreeBSD style format. Next is probably to deal with the 64bit addressing changes that are mostly around the #ifdef __amd64__ checks. Thanks to LSI for providing the initial code. Obtained from: LSI Added: projects/head_mfi/sys/dev/mfi/mfi_syspd.c projects/head_mfi/sys/dev/mfi/mfi_tbolt.c Modified: projects/head_mfi/sys/conf/files projects/head_mfi/sys/dev/mfi/mfi.c projects/head_mfi/sys/dev/mfi/mfi_cam.c projects/head_mfi/sys/dev/mfi/mfi_disk.c projects/head_mfi/sys/dev/mfi/mfi_ioctl.h projects/head_mfi/sys/dev/mfi/mfi_linux.c projects/head_mfi/sys/dev/mfi/mfi_pci.c projects/head_mfi/sys/dev/mfi/mfireg.h projects/head_mfi/sys/dev/mfi/mfivar.h projects/head_mfi/sys/modules/mfi/Makefile Modified: projects/head_mfi/sys/conf/files ============================================================================== --- projects/head_mfi/sys/conf/files Fri Nov 4 01:58:55 2011 (r227067) +++ projects/head_mfi/sys/conf/files Fri Nov 4 02:34:52 2011 (r227068) @@ -1410,6 +1410,8 @@ dev/mfi/mfi.c optional mfi dev/mfi/mfi_debug.c optional mfi dev/mfi/mfi_pci.c optional mfi pci dev/mfi/mfi_disk.c optional mfi +dev/mfi/mfi_syspd.c optional mfi +dev/mfi/mfi_tbolt.c optional mfi dev/mfi/mfi_linux.c optional mfi compat_linux dev/mfi/mfi_cam.c optional mfip scbus dev/mii/acphy.c optional miibus | acphy Modified: projects/head_mfi/sys/dev/mfi/mfi.c ============================================================================== --- projects/head_mfi/sys/dev/mfi/mfi.c Fri Nov 4 01:58:55 2011 (r227067) +++ projects/head_mfi/sys/dev/mfi/mfi.c Fri Nov 4 02:34:52 2011 (r227068) @@ -79,10 +79,11 @@ __FBSDID("$FreeBSD$"); #include #include #include +#include +#include static int mfi_alloc_commands(struct mfi_softc *); static int mfi_comms_init(struct mfi_softc *); -static int mfi_wait_command(struct mfi_softc *, struct mfi_command *); static int mfi_get_controller_info(struct mfi_softc *); static int mfi_get_log_state(struct mfi_softc *, struct mfi_evt_log_state **); @@ -93,16 +94,18 @@ static void mfi_data_cb(void *, bus_dma_ static void mfi_startup(void *arg); static void mfi_intr(void *arg); static void mfi_ldprobe(struct mfi_softc *sc); +static void mfi_syspdprobe(struct mfi_softc *sc); static int mfi_aen_register(struct mfi_softc *sc, int seq, int locale); static void mfi_aen_complete(struct mfi_command *); -static int mfi_aen_setup(struct mfi_softc *, uint32_t); static int mfi_add_ld(struct mfi_softc *sc, int); static void mfi_add_ld_complete(struct mfi_command *); +static int mfi_add_sys_pd(struct mfi_softc *sc, int); +static void mfi_add_sys_pd_complete(struct mfi_command *); static struct mfi_command * mfi_bio_command(struct mfi_softc *); static void mfi_bio_complete(struct mfi_command *); -static int mfi_mapcmd(struct mfi_softc *, struct mfi_command *); +static struct mfi_command *mfi_build_ldio(struct mfi_softc *,struct bio*); +static struct mfi_command *mfi_build_syspdio(struct mfi_softc *,struct bio*); static int mfi_send_frame(struct mfi_softc *, struct mfi_command *); -static void mfi_complete(struct mfi_softc *, struct mfi_command *); static int mfi_abort(struct mfi_softc *, struct mfi_command *); static int mfi_linux_ioctl_int(struct cdev *, u_long, caddr_t, int, struct thread *); static void mfi_timeout(void *); @@ -110,12 +113,17 @@ static int mfi_user_command(struct mfi_s struct mfi_ioc_passthru *); static void mfi_enable_intr_xscale(struct mfi_softc *sc); static void mfi_enable_intr_ppc(struct mfi_softc *sc); -static int32_t mfi_read_fw_status_xscale(struct mfi_softc *sc); -static int32_t mfi_read_fw_status_ppc(struct mfi_softc *sc); +static int32_t mfi_read_fw_status_xscale(struct mfi_softc *sc); +static int32_t mfi_read_fw_status_ppc(struct mfi_softc *sc); static int mfi_check_clear_intr_xscale(struct mfi_softc *sc); static int mfi_check_clear_intr_ppc(struct mfi_softc *sc); -static void mfi_issue_cmd_xscale(struct mfi_softc *sc,uint32_t bus_add,uint32_t frame_cnt); -static void mfi_issue_cmd_ppc(struct mfi_softc *sc,uint32_t bus_add,uint32_t frame_cnt); +static void mfi_issue_cmd_xscale(struct mfi_softc *sc, bus_addr_t bus_add,uint32_t frame_cnt); +static void mfi_issue_cmd_ppc(struct mfi_softc *sc, bus_addr_t bus_add,uint32_t frame_cnt); +static int mfi_config_lock(struct mfi_softc *sc, uint32_t opcode); +static void mfi_config_unlock(struct mfi_softc *sc, int locked); +static int mfi_check_command_pre(struct mfi_softc *sc, struct mfi_command *cm); +static void mfi_check_command_post(struct mfi_softc *sc, struct mfi_command *cm); +static int mfi_check_for_sscd(struct mfi_softc *sc, struct mfi_command *cm); SYSCTL_NODE(_hw, OID_AUTO, mfi, CTLFLAG_RD, 0, "MFI driver parameters"); static int mfi_event_locale = MFI_EVT_LOCALE_ALL; @@ -152,6 +160,7 @@ static struct cdevsw mfi_cdevsw = { MALLOC_DEFINE(M_MFIBUF, "mfibuf", "Buffers for the MFI driver"); #define MFI_INQ_LENGTH SHORT_INQUIRY_LENGTH +struct mfi_skinny_dma_info mfi_skinny; static void mfi_enable_intr_xscale(struct mfi_softc *sc) @@ -162,12 +171,17 @@ mfi_enable_intr_xscale(struct mfi_softc static void mfi_enable_intr_ppc(struct mfi_softc *sc) { - MFI_WRITE4(sc, MFI_ODCR0, 0xFFFFFFFF); if (sc->mfi_flags & MFI_FLAGS_1078) { + MFI_WRITE4(sc, MFI_ODCR0, 0xFFFFFFFF); MFI_WRITE4(sc, MFI_OMSK, ~MFI_1078_EIM); - } else if (sc->mfi_flags & MFI_FLAGS_GEN2) { + } + else if (sc->mfi_flags & MFI_FLAGS_GEN2) { + MFI_WRITE4(sc, MFI_ODCR0, 0xFFFFFFFF); MFI_WRITE4(sc, MFI_OMSK, ~MFI_GEN2_EIM); } + else if (sc->mfi_flags & MFI_FLAGS_SKINNY) { + MFI_WRITE4(sc, MFI_OMSK, ~0x00000001); + } } static int32_t @@ -205,35 +219,51 @@ mfi_check_clear_intr_ppc(struct mfi_soft if (!(status & MFI_1078_RM)) { return 1; } - } else if (sc->mfi_flags & MFI_FLAGS_GEN2) { + } + else if (sc->mfi_flags & MFI_FLAGS_GEN2) { if (!(status & MFI_GEN2_RM)) { return 1; } } - - MFI_WRITE4(sc, MFI_ODCR0, status); + else if (sc->mfi_flags & MFI_FLAGS_SKINNY) { + if (!(status & MFI_SKINNY_RM)) { + return 1; + } + } + if (sc->mfi_flags & MFI_FLAGS_SKINNY) + MFI_WRITE4(sc, MFI_OSTS, status); + else + MFI_WRITE4(sc, MFI_ODCR0, status); return 0; } static void -mfi_issue_cmd_xscale(struct mfi_softc *sc,uint32_t bus_add,uint32_t frame_cnt) +mfi_issue_cmd_xscale(struct mfi_softc *sc, bus_addr_t bus_add, uint32_t frame_cnt) { MFI_WRITE4(sc, MFI_IQP,(bus_add >>3)|frame_cnt); } static void -mfi_issue_cmd_ppc(struct mfi_softc *sc,uint32_t bus_add,uint32_t frame_cnt) +mfi_issue_cmd_ppc(struct mfi_softc *sc, bus_addr_t bus_add, uint32_t frame_cnt) { - MFI_WRITE4(sc, MFI_IQP, (bus_add |frame_cnt <<1)|1 ); + if (sc->mfi_flags & MFI_FLAGS_SKINNY) { + MFI_WRITE4(sc, MFI_IQPL, (bus_add | frame_cnt <<1)|1 ); + MFI_WRITE4(sc, MFI_IQPH, 0x00000000); + } else { + MFI_WRITE4(sc, MFI_IQP, (bus_add | frame_cnt <<1)|1 ); + } } -static int +int mfi_transition_firmware(struct mfi_softc *sc) { uint32_t fw_state, cur_state; int max_wait, i; + uint32_t cur_abs_reg_val = 0; + uint32_t prev_abs_reg_val = 0; - fw_state = sc->mfi_read_fw_status(sc)& MFI_FWSTATE_MASK; + cur_abs_reg_val = sc->mfi_read_fw_status(sc); + fw_state = cur_abs_reg_val & MFI_FWSTATE_MASK; while (fw_state != MFI_FWSTATE_READY) { if (bootverbose) device_printf(sc->mfi_dev, "Waiting for firmware to " @@ -244,25 +274,41 @@ mfi_transition_firmware(struct mfi_softc device_printf(sc->mfi_dev, "Firmware fault\n"); return (ENXIO); case MFI_FWSTATE_WAIT_HANDSHAKE: - MFI_WRITE4(sc, MFI_IDB, MFI_FWINIT_CLEAR_HANDSHAKE); - max_wait = 2; + if (sc->mfi_flags & MFI_FLAGS_SKINNY || sc->mfi_flags & MFI_FLAGS_TBOLT) + MFI_WRITE4(sc, MFI_SKINNY_IDB, MFI_FWINIT_CLEAR_HANDSHAKE); + else + MFI_WRITE4(sc, MFI_IDB, MFI_FWINIT_CLEAR_HANDSHAKE); + max_wait = MFI_RESET_WAIT_TIME; break; case MFI_FWSTATE_OPERATIONAL: - MFI_WRITE4(sc, MFI_IDB, MFI_FWINIT_READY); - max_wait = 10; + if (sc->mfi_flags & MFI_FLAGS_SKINNY || sc->mfi_flags & MFI_FLAGS_TBOLT) + //MFI_WRITE4(sc, MFI_SKINNY_IDB, MFI_FWINIT_READY); + MFI_WRITE4(sc, MFI_SKINNY_IDB, 7); + else + MFI_WRITE4(sc, MFI_IDB, MFI_FWINIT_READY); + max_wait = MFI_RESET_WAIT_TIME; break; case MFI_FWSTATE_UNDEFINED: case MFI_FWSTATE_BB_INIT: - max_wait = 2; + max_wait = MFI_RESET_WAIT_TIME; + break; + case MFI_FWSTATE_FW_INIT_2: + max_wait = MFI_RESET_WAIT_TIME; break; case MFI_FWSTATE_FW_INIT: - case MFI_FWSTATE_DEVICE_SCAN: case MFI_FWSTATE_FLUSH_CACHE: - max_wait = 20; + max_wait = MFI_RESET_WAIT_TIME; + break; + case MFI_FWSTATE_DEVICE_SCAN: + max_wait = MFI_RESET_WAIT_TIME; /* wait for 180 seconds */ + prev_abs_reg_val = cur_abs_reg_val; break; case MFI_FWSTATE_BOOT_MESSAGE_PENDING: - MFI_WRITE4(sc, MFI_IDB, MFI_FWINIT_HOTPLUG); - max_wait = 10; + if (sc->mfi_flags & MFI_FLAGS_SKINNY || sc->mfi_flags & MFI_FLAGS_TBOLT) + MFI_WRITE4(sc, MFI_SKINNY_IDB, MFI_FWINIT_HOTPLUG); + else + MFI_WRITE4(sc, MFI_IDB, MFI_FWINIT_HOTPLUG); + max_wait = MFI_RESET_WAIT_TIME; break; default: device_printf(sc->mfi_dev,"Unknown firmware state %#x\n", @@ -270,12 +316,20 @@ mfi_transition_firmware(struct mfi_softc return (ENXIO); } for (i = 0; i < (max_wait * 10); i++) { - fw_state = sc->mfi_read_fw_status(sc) & MFI_FWSTATE_MASK; + + cur_abs_reg_val = sc->mfi_read_fw_status(sc); + fw_state = cur_abs_reg_val & MFI_FWSTATE_MASK; if (fw_state == cur_state) DELAY(100000); else break; } + if (fw_state == MFI_FWSTATE_DEVICE_SCAN) { + /* Check the device scanning progress */ + if (prev_abs_reg_val != cur_abs_reg_val) { + continue; + } + } if (fw_state == cur_state) { device_printf(sc->mfi_dev, "Firmware stuck in state " "%#x\n", fw_state); @@ -286,26 +340,31 @@ mfi_transition_firmware(struct mfi_softc } static void -mfi_addr32_cb(void *arg, bus_dma_segment_t *segs, int nsegs, int error) +mfi_addr_cb(void *arg, bus_dma_segment_t *segs, int nsegs, int error) { - uint32_t *addr; + bus_addr_t *addr; addr = arg; *addr = segs[0].ds_addr; } + int mfi_attach(struct mfi_softc *sc) { uint32_t status; int error, commsz, framessz, sensesz; int frames, unit, max_fw_sge; + uint32_t tb_mem_size = 0; + if(sc == NULL) + return EINVAL; - device_printf(sc->mfi_dev, "Megaraid SAS driver Ver 3.00 \n"); + device_printf(sc->mfi_dev, "Megaraid SAS driver Ver %s \n",MEGASAS_VERSION); mtx_init(&sc->mfi_io_lock, "MFI I/O lock", NULL, MTX_DEF); sx_init(&sc->mfi_config_lock, "MFI config"); TAILQ_INIT(&sc->mfi_ld_tqh); + TAILQ_INIT(&sc->mfi_syspd_tqh); TAILQ_INIT(&sc->mfi_aen_pids); TAILQ_INIT(&sc->mfi_cam_ccbq); @@ -314,15 +373,32 @@ mfi_attach(struct mfi_softc *sc) mfi_initq_busy(sc); mfi_initq_bio(sc); + //atomic_set(&sc->fw_reset_no_pci_access, 0); + sc->adpreset = 0; + sc->last_seq_num = 0; + sc->disableOnlineCtrlReset = 1; + sc->issuepend_done = 1; + sc->hw_crit_error = 0; + if (sc->mfi_flags & MFI_FLAGS_1064R) { sc->mfi_enable_intr = mfi_enable_intr_xscale; sc->mfi_read_fw_status = mfi_read_fw_status_xscale; sc->mfi_check_clear_intr = mfi_check_clear_intr_xscale; sc->mfi_issue_cmd = mfi_issue_cmd_xscale; } + else if(sc->mfi_flags & MFI_FLAGS_TBOLT) { + sc->mfi_enable_intr = mfi_tbolt_enable_intr_ppc; + sc->mfi_disable_intr = mfi_tbolt_disable_intr_ppc; + sc->mfi_read_fw_status = mfi_tbolt_read_fw_status_ppc; + sc->mfi_check_clear_intr = mfi_tbolt_check_clear_intr_ppc; + sc->mfi_issue_cmd = mfi_tbolt_issue_cmd_ppc; + sc->mfi_adp_reset = mfi_tbolt_adp_reset; + sc->mfi_tbolt = 1; + TAILQ_INIT(&sc->mfi_cmd_tbolt_tqh); + } else { sc->mfi_enable_intr = mfi_enable_intr_ppc; - sc->mfi_read_fw_status = mfi_read_fw_status_ppc; + sc->mfi_read_fw_status = mfi_read_fw_status_ppc; sc->mfi_check_clear_intr = mfi_check_clear_intr_ppc; sc->mfi_issue_cmd = mfi_issue_cmd_ppc; } @@ -334,6 +410,32 @@ mfi_attach(struct mfi_softc *sc) "error %d\n", error); return (ENXIO); } + // + + //Start: LSIP200113393 + if (bus_dma_tag_create( sc->mfi_parent_dmat, /* parent */ + 1, 0, /* algnmnt, boundary */ + BUS_SPACE_MAXADDR_32BIT,/* lowaddr */ + BUS_SPACE_MAXADDR, /* highaddr */ + NULL, NULL, /* filter, filterarg */ + MEGASAS_MAX_NAME*sizeof(bus_addr_t), /* maxsize */ + 1, /* msegments */ + MEGASAS_MAX_NAME*sizeof(bus_addr_t), /* maxsegsize */ + 0, /* flags */ + NULL, NULL, /* lockfunc, lockarg */ + &sc->verbuf_h_dmat)) { + device_printf(sc->mfi_dev, "Cannot allocate verbuf_h_dmat DMA tag\n"); + return (ENOMEM); + } + if (bus_dmamem_alloc(sc->verbuf_h_dmat, (void **)&sc->verbuf, + BUS_DMA_NOWAIT, &sc->verbuf_h_dmamap)) { + device_printf(sc->mfi_dev, "Cannot allocate verbuf_h_dmamap memory\n"); + return (ENOMEM); + } + bzero(sc->verbuf, MEGASAS_MAX_NAME*sizeof(bus_addr_t)); + bus_dmamap_load(sc->verbuf_h_dmat, sc->verbuf_h_dmamap, + sc->verbuf, MEGASAS_MAX_NAME*sizeof(bus_addr_t), mfi_addr_cb, &sc->verbuf_h_busaddr, 0); + //End: LSIP200113393 /* * Get information needed for sizing the contiguous memory for the @@ -347,6 +449,94 @@ mfi_attach(struct mfi_softc *sc) max_fw_sge = (status & MFI_FWSTATE_MAXSGL_MASK) >> 16; sc->mfi_max_sge = min(max_fw_sge, ((MFI_MAXPHYS / PAGE_SIZE) + 1)); + /* ThunderBolt Support get the contiguous memory */ + + if(sc->mfi_flags & MFI_FLAGS_TBOLT) { + mfi_tbolt_init_globals(sc); + device_printf(sc->mfi_dev,"MaxCmd = %x MaxSgl = %x state = %x \n", + sc->mfi_max_fw_cmds, sc->mfi_max_sge, status); + tb_mem_size = mfi_tbolt_get_memory_requirement(sc); + + if (bus_dma_tag_create( sc->mfi_parent_dmat, /* parent */ + 1, 0, /* algnmnt, boundary */ + BUS_SPACE_MAXADDR_32BIT,/* lowaddr */ + BUS_SPACE_MAXADDR, /* highaddr */ + NULL, NULL, /* filter, filterarg */ + tb_mem_size, /* maxsize */ + 1, /* msegments */ + tb_mem_size, /* maxsegsize */ + 0, /* flags */ + NULL, NULL, /* lockfunc, lockarg */ + &sc->mfi_tb_dmat)) { + device_printf(sc->mfi_dev, "Cannot allocate comms DMA tag\n"); + return (ENOMEM); + } + if (bus_dmamem_alloc(sc->mfi_tb_dmat, (void **)&sc->request_message_pool, + BUS_DMA_NOWAIT, &sc->mfi_tb_dmamap)) { + device_printf(sc->mfi_dev, "Cannot allocate comms memory\n"); + return (ENOMEM); + } + bzero(sc->request_message_pool, tb_mem_size); + bus_dmamap_load(sc->mfi_tb_dmat, sc->mfi_tb_dmamap, + sc->request_message_pool, tb_mem_size, mfi_addr_cb, &sc->mfi_tb_busaddr, 0); + + /* For ThunderBolt memory init */ + if (bus_dma_tag_create( sc->mfi_parent_dmat, /* parent */ + 0x100, 0, /* algnmnt, boundary */ + BUS_SPACE_MAXADDR_32BIT,/* lowaddr */ + BUS_SPACE_MAXADDR, /* highaddr */ + NULL, NULL, /* filter, filterarg */ + MFI_FRAME_SIZE, /* maxsize */ + 1, /* msegments */ + MFI_FRAME_SIZE, /* maxsegsize */ + 0, /* flags */ + NULL, NULL, /* lockfunc, lockarg */ + &sc->mfi_tb_init_dmat)) { + device_printf(sc->mfi_dev, "Cannot allocate init DMA tag\n"); + return (ENOMEM); + } + if (bus_dmamem_alloc(sc->mfi_tb_init_dmat, (void **)&sc->mfi_tb_init, + BUS_DMA_NOWAIT, &sc->mfi_tb_init_dmamap)) { + device_printf(sc->mfi_dev, "Cannot allocate init memory\n"); + return (ENOMEM); + } + bzero(sc->mfi_tb_init, MFI_FRAME_SIZE); + bus_dmamap_load(sc->mfi_tb_init_dmat, sc->mfi_tb_init_dmamap, + sc->mfi_tb_init, MFI_FRAME_SIZE, mfi_addr_cb, &sc->mfi_tb_init_busaddr, 0); + if(mfi_tbolt_init_desc_pool(sc, sc->request_message_pool, tb_mem_size)) { + device_printf(sc->mfi_dev,"Thunderbolt pool preparation error\n"); + return 0; + } + + /* + Allocate DMA memory mapping for MPI2 IOC Init descriptor, + we are taking it diffrent from what we have allocated for Request + and reply descriptors to avoid confusion later + */ + tb_mem_size = sizeof(struct MPI2_IOC_INIT_REQUEST); + if (bus_dma_tag_create( sc->mfi_parent_dmat, /* parent */ + 1, 0, /* algnmnt, boundary */ + BUS_SPACE_MAXADDR_32BIT,/* lowaddr */ + BUS_SPACE_MAXADDR, /* highaddr */ + NULL, NULL, /* filter, filterarg */ + tb_mem_size, /* maxsize */ + 1, /* msegments */ + tb_mem_size, /* maxsegsize */ + 0, /* flags */ + NULL, NULL, /* lockfunc, lockarg */ + &sc->mfi_tb_ioc_init_dmat)) { + device_printf(sc->mfi_dev, "Cannot allocate comms DMA tag\n"); + return (ENOMEM); + } + if (bus_dmamem_alloc(sc->mfi_tb_ioc_init_dmat, (void **)&sc->mfi_tb_ioc_init_desc, + BUS_DMA_NOWAIT, &sc->mfi_tb_ioc_init_dmamap)) { + device_printf(sc->mfi_dev, "Cannot allocate comms memory\n"); + return (ENOMEM); + } + bzero(sc->mfi_tb_ioc_init_desc, tb_mem_size); + bus_dmamap_load(sc->mfi_tb_ioc_init_dmat, sc->mfi_tb_ioc_init_dmamap, + sc->mfi_tb_ioc_init_desc, tb_mem_size, mfi_addr_cb, &sc->mfi_tb_ioc_init_busaddr, 0); + } /* * Create the dma tag for data buffers. Used both for block I/O * and for various internal data queries. @@ -396,8 +586,7 @@ mfi_attach(struct mfi_softc *sc) } bzero(sc->mfi_comms, commsz); bus_dmamap_load(sc->mfi_comms_dmat, sc->mfi_comms_dmamap, - sc->mfi_comms, commsz, mfi_addr32_cb, &sc->mfi_comms_busaddr, 0); - + sc->mfi_comms, commsz, mfi_addr_cb, &sc->mfi_comms_busaddr, 0); /* * Allocate DMA memory for the command frames. Keep them in the * lower 4GB for efficiency. Calculate the size of the commands at @@ -414,6 +603,8 @@ mfi_attach(struct mfi_softc *sc) } else { sc->mfi_sge_size = sizeof(struct mfi_sg32); } + if (sc->mfi_flags & MFI_FLAGS_SKINNY) + sc->mfi_sge_size = sizeof(struct mfi_sg_skinny); frames = (sc->mfi_sge_size * sc->mfi_max_sge - 1) / MFI_FRAME_SIZE + 2; sc->mfi_cmd_size = frames * MFI_FRAME_SIZE; framessz = sc->mfi_cmd_size * sc->mfi_max_fw_cmds; @@ -438,8 +629,7 @@ mfi_attach(struct mfi_softc *sc) } bzero(sc->mfi_frames, framessz); bus_dmamap_load(sc->mfi_frames_dmat, sc->mfi_frames_dmamap, - sc->mfi_frames, framessz, mfi_addr32_cb, &sc->mfi_frames_busaddr,0); - + sc->mfi_frames, framessz, mfi_addr_cb, &sc->mfi_frames_busaddr,0); /* * Allocate DMA memory for the frame sense data. Keep them in the * lower 4GB for efficiency @@ -465,40 +655,63 @@ mfi_attach(struct mfi_softc *sc) return (ENOMEM); } bus_dmamap_load(sc->mfi_sense_dmat, sc->mfi_sense_dmamap, - sc->mfi_sense, sensesz, mfi_addr32_cb, &sc->mfi_sense_busaddr, 0); - + sc->mfi_sense, sensesz, mfi_addr_cb, &sc->mfi_sense_busaddr, 0); if ((error = mfi_alloc_commands(sc)) != 0) return (error); - if ((error = mfi_comms_init(sc)) != 0) - return (error); + /* Before moving the FW to operational state, check whether + * hostmemory is required by the FW or not + */ - if ((error = mfi_get_controller_info(sc)) != 0) - return (error); + /* ThunderBolt MFI_IOC2 INIT */ + if(sc->mfi_flags & MFI_FLAGS_TBOLT) + { + sc->mfi_disable_intr(sc); + if((error = mfi_tbolt_init_MFI_queue(sc)) != 0) + { + device_printf(sc->mfi_dev,"TB Init has failed with error %d\n",error); + return error; + } - mtx_lock(&sc->mfi_io_lock); - if ((error = mfi_aen_setup(sc, 0), 0) != 0) { - mtx_unlock(&sc->mfi_io_lock); - return (error); - } - mtx_unlock(&sc->mfi_io_lock); + if((error = mfi_tbolt_alloc_cmd(sc)) != 0) + return error; + sc->mfi_irq_rid = 0; + if ((sc->mfi_irq = bus_alloc_resource_any(sc->mfi_dev, SYS_RES_IRQ, + &sc->mfi_irq_rid, RF_SHAREABLE | RF_ACTIVE)) == NULL) { + device_printf(sc->mfi_dev, "Cannot allocate interrupt\n"); + return (EINVAL); + } + if (bus_setup_intr(sc->mfi_dev, sc->mfi_irq, INTR_MPSAFE|INTR_TYPE_BIO, + NULL, mfi_intr_tbolt, sc, &sc->mfi_intr)) { + device_printf(sc->mfi_dev, "Cannot set up interrupt\n"); + return (EINVAL); + } + sc->mfi_enable_intr(sc); + sc->map_id = 0; + } + else + { + + if ((error = mfi_comms_init(sc)) != 0) + return (error); - /* - * Set up the interrupt handler. XXX This should happen in - * mfi_pci.c - */ - sc->mfi_irq_rid = 0; - if ((sc->mfi_irq = bus_alloc_resource_any(sc->mfi_dev, SYS_RES_IRQ, - &sc->mfi_irq_rid, RF_SHAREABLE | RF_ACTIVE)) == NULL) { - device_printf(sc->mfi_dev, "Cannot allocate interrupt\n"); - return (EINVAL); - } - if (bus_setup_intr(sc->mfi_dev, sc->mfi_irq, INTR_MPSAFE|INTR_TYPE_BIO, - NULL, mfi_intr, sc, &sc->mfi_intr)) { - device_printf(sc->mfi_dev, "Cannot set up interrupt\n"); - return (EINVAL); + sc->mfi_irq_rid = 0; + if ((sc->mfi_irq = bus_alloc_resource_any(sc->mfi_dev, SYS_RES_IRQ, + &sc->mfi_irq_rid, RF_SHAREABLE | RF_ACTIVE)) == NULL) { + device_printf(sc->mfi_dev, "Cannot allocate interrupt\n"); + return (EINVAL); + } + if (bus_setup_intr(sc->mfi_dev, sc->mfi_irq, INTR_MPSAFE|INTR_TYPE_BIO, + NULL, mfi_intr, sc, &sc->mfi_intr)) { + device_printf(sc->mfi_dev, "Cannot set up interrupt\n"); + return (EINVAL); + } + sc->mfi_enable_intr(sc); } - + if ((error = mfi_get_controller_info(sc)) != 0) + return (error); + sc->disableOnlineCtrlReset = 0; + /* Register a config hook to probe the bus for arrays */ sc->mfi_ich.ich_func = mfi_startup; sc->mfi_ich.ich_arg = sc; @@ -507,6 +720,10 @@ mfi_attach(struct mfi_softc *sc) "hook\n"); return (EINVAL); } + if ((error = mfi_aen_setup(sc, 0), 0) != 0) { + mtx_unlock(&sc->mfi_io_lock); + return (error); + } /* * Register a shutdown handler. @@ -548,6 +765,8 @@ mfi_attach(struct mfi_softc *sc) return (0); } + + static int mfi_alloc_commands(struct mfi_softc *sc) { @@ -578,8 +797,11 @@ mfi_alloc_commands(struct mfi_softc *sc) cm->cm_sc = sc; cm->cm_index = i; if (bus_dmamap_create(sc->mfi_buffer_dmat, 0, - &cm->cm_dmamap) == 0) + &cm->cm_dmamap) == 0) { + mtx_lock(&sc->mfi_io_lock); mfi_release_command(cm); + mtx_unlock(&sc->mfi_io_lock); + } else break; sc->mfi_total_cmds++; @@ -594,6 +816,8 @@ mfi_release_command(struct mfi_command * struct mfi_frame_header *hdr; uint32_t *hdr_data; + mtx_assert(&cm->cm_sc->mfi_io_lock, MA_OWNED); + /* * Zero out the important fields of the frame, but make sure the * context field is preserved. For efficiency, handle the fields @@ -618,6 +842,7 @@ mfi_release_command(struct mfi_command * cm->cm_data = NULL; cm->cm_sg = 0; cm->cm_total_frame_size = 0; + cm->retry_for_fw_reset = 0; mfi_enqueue_free(cm); } @@ -629,13 +854,19 @@ mfi_dcmd_command(struct mfi_softc *sc, s struct mfi_command *cm; struct mfi_dcmd_frame *dcmd; void *buf = NULL; - + uint32_t context = 0; + mtx_assert(&sc->mfi_io_lock, MA_OWNED); - + cm = mfi_dequeue_free(sc); if (cm == NULL) return (EBUSY); + /* Zero out the MFI frame */ + context = cm->cm_frame->header.context; + bzero(cm->cm_frame,sizeof (union mfi_frame)); + cm->cm_frame->header.context = context; + if ((bufsize > 0) && (bufp != NULL)) { if (*bufp == NULL) { buf = malloc(bufsize, M_MFIBUF, M_NOWAIT|M_ZERO); @@ -655,6 +886,7 @@ mfi_dcmd_command(struct mfi_softc *sc, s dcmd->header.timeout = 0; dcmd->header.flags = 0; dcmd->header.data_len = bufsize; + dcmd->header.scsi_status = 0; dcmd->opcode = opcode; cm->cm_sg = &dcmd->sgl; cm->cm_total_frame_size = MFI_DCMD_FRAME_SIZE; @@ -676,11 +908,17 @@ mfi_comms_init(struct mfi_softc *sc) struct mfi_init_frame *init; struct mfi_init_qinfo *qinfo; int error; + uint32_t context = 0; mtx_lock(&sc->mfi_io_lock); if ((cm = mfi_dequeue_free(sc)) == NULL) return (EBUSY); + /* Zero out the MFI frame */ + context = cm->cm_frame->header.context; + bzero(cm->cm_frame,sizeof (union mfi_frame)); + cm->cm_frame->header.context = context; + /* * Abuse the SG list area of the frame to hold the init_qinfo * object; @@ -741,10 +979,13 @@ mfi_get_controller_info(struct mfi_softc BUS_DMASYNC_POSTREAD); bus_dmamap_unload(sc->mfi_buffer_dmat, cm->cm_dmamap); - max_sectors_1 = (1 << ci->stripe_sz_ops.min) * ci->max_strips_per_io; + + //max_sectors_1 = (1 << ci->stripe_sz_ops.min) * ci->max_strips_per_io; + max_sectors_1 = (1 << ci->stripe_sz_ops.max) * ci->max_strips_per_io; max_sectors_2 = ci->max_request_size; sc->mfi_max_io = min(max_sectors_1, max_sectors_2); - + sc->disableOnlineCtrlReset = ci->properties.OnOffProperties.disableOnlineCtrlReset; + out: if (ci) free(ci, M_MFIBUF); @@ -760,6 +1001,7 @@ mfi_get_log_state(struct mfi_softc *sc, struct mfi_command *cm = NULL; int error; + mtx_lock(&sc->mfi_io_lock); error = mfi_dcmd_command(sc, &cm, MFI_DCMD_CTRL_EVENT_GETINFO, (void **)log_state, sizeof(**log_state)); if (error) @@ -778,11 +1020,12 @@ mfi_get_log_state(struct mfi_softc *sc, out: if (cm) mfi_release_command(cm); + mtx_unlock(&sc->mfi_io_lock); return (error); } -static int +int mfi_aen_setup(struct mfi_softc *sc, uint32_t seq_start) { struct mfi_evt_log_state *log_state = NULL; @@ -817,7 +1060,7 @@ mfi_aen_setup(struct mfi_softc *sc, uint return 0; } -static int +int mfi_wait_command(struct mfi_softc *sc, struct mfi_command *cm) { @@ -840,7 +1083,6 @@ mfi_wait_command(struct mfi_softc *sc, s msleep(cm, &sc->mfi_io_lock, PRIBIO, "mfiwait", 0); return (cm->cm_error); } - void mfi_free(struct mfi_softc *sc) { @@ -889,7 +1131,70 @@ mfi_free(struct mfi_softc *sc) sc->mfi_comms_dmamap); if (sc->mfi_comms_dmat != NULL) bus_dma_tag_destroy(sc->mfi_comms_dmat); + + /* ThunderBolt contiguous memory free here */ + + if(sc->mfi_flags & MFI_FLAGS_TBOLT) + { + if (sc->mfi_tb_busaddr != 0) + bus_dmamap_unload(sc->mfi_tb_dmat, sc->mfi_tb_dmamap); + if (sc->request_message_pool != NULL) + bus_dmamem_free(sc->mfi_tb_dmat, sc->request_message_pool, + sc->mfi_tb_dmamap); + if (sc->mfi_tb_dmat != NULL) + bus_dma_tag_destroy(sc->mfi_tb_dmat); + + /* Version buffer memory free */ + // Start LSIP200113393 + if (sc->verbuf_h_busaddr != 0) + bus_dmamap_unload(sc->verbuf_h_dmat, sc->verbuf_h_dmamap); + if (sc->verbuf != NULL) + bus_dmamem_free(sc->verbuf_h_dmat, sc->verbuf, + sc->verbuf_h_dmamap); + if (sc->verbuf_h_dmat != NULL) + bus_dma_tag_destroy(sc->verbuf_h_dmat); + + // End LSIP200113393 + /* ThunderBolt INIT pcaket memory Free */ + if (sc->mfi_tb_init_busaddr != 0) + bus_dmamap_unload(sc->mfi_tb_init_dmat, sc->mfi_tb_init_dmamap); + if (sc->mfi_tb_init != NULL) + bus_dmamem_free(sc->mfi_tb_init_dmat, sc->mfi_tb_init, + sc->mfi_tb_init_dmamap); + if (sc->mfi_tb_init_dmat != NULL) + bus_dma_tag_destroy(sc->mfi_tb_init_dmat); + /* ThunderBolt IOC Init Desc memory free here */ + + if (sc->mfi_tb_ioc_init_busaddr != 0) + bus_dmamap_unload(sc->mfi_tb_ioc_init_dmat, sc->mfi_tb_ioc_init_dmamap); + if (sc->mfi_tb_ioc_init_desc != NULL) + bus_dmamem_free(sc->mfi_tb_ioc_init_dmat, sc->mfi_tb_ioc_init_desc, sc->mfi_tb_ioc_init_dmamap); + if (sc->mfi_tb_ioc_init_dmat != NULL) + bus_dma_tag_destroy(sc->mfi_tb_ioc_init_dmat); + + for(int i=0; i < sc->mfi_max_fw_cmds; i++) + { + if (sc->mfi_cmd_pool_tbolt != NULL) + { + if (sc->mfi_cmd_pool_tbolt[i] != NULL) + { + free(sc->mfi_cmd_pool_tbolt[i], M_MFIBUF); + sc->mfi_cmd_pool_tbolt[i] = NULL; + } + } + } + if (sc->mfi_cmd_pool_tbolt != NULL) + { + free(sc->mfi_cmd_pool_tbolt, M_MFIBUF); + sc->mfi_cmd_pool_tbolt = NULL; + } + if (sc->request_desc_pool != NULL) + { + free(sc->request_desc_pool, M_MFIBUF); + sc->request_desc_pool = NULL; + } + } if (sc->mfi_buffer_dmat != NULL) bus_dma_tag_destroy(sc->mfi_buffer_dmat); if (sc->mfi_parent_dmat != NULL) @@ -912,10 +1217,12 @@ mfi_startup(void *arg) config_intrhook_disestablish(&sc->mfi_ich); - sc->mfi_enable_intr(sc); + //sc->mfi_enable_intr(sc); sx_xlock(&sc->mfi_config_lock); mtx_lock(&sc->mfi_io_lock); mfi_ldprobe(sc); + if (sc->mfi_flags & MFI_FLAGS_SKINNY) + mfi_syspdprobe(sc); mtx_unlock(&sc->mfi_io_lock); sx_xunlock(&sc->mfi_config_lock); } @@ -976,6 +1283,9 @@ mfi_shutdown(struct mfi_softc *sc) if (sc->mfi_aen_cm != NULL) mfi_abort(sc, sc->mfi_aen_cm); + if (sc->map_update_cmd != NULL) + mfi_abort(sc, sc->map_update_cmd); + dcmd = &cm->cm_frame->dcmd; dcmd->header.flags = MFI_FRAME_DIR_NONE; cm->cm_flags = MFI_CMD_POLLED; @@ -986,9 +1296,80 @@ mfi_shutdown(struct mfi_softc *sc) } mfi_release_command(cm); + sc->shutdown_issued = 1; mtx_unlock(&sc->mfi_io_lock); return (error); } +static void +mfi_syspdprobe(struct mfi_softc *sc) +{ + struct mfi_frame_header *hdr; + struct mfi_command *cm = NULL; + struct mfi_pd_list *pdlist = NULL; + struct mfi_system_pd *syspd; + int error, i; + + sx_assert(&sc->mfi_config_lock,SA_XLOCKED); + mtx_assert(&sc->mfi_io_lock,MA_OWNED); + /* Add SYSTEM PD's */ + error = mfi_dcmd_command(sc, &cm, MFI_DCMD_PD_LIST_QUERY, + (void **)&pdlist, sizeof(*pdlist)); + if (error){ + device_printf(sc->mfi_dev,"Error while forming SYSTEM PD list\n"); + goto out; + } + + cm->cm_flags = MFI_CMD_DATAIN | MFI_CMD_POLLED; + cm->cm_frame->dcmd.mbox[0] = MR_PD_QUERY_TYPE_EXPOSED_TO_HOST; + cm->cm_frame->dcmd.mbox[1] = 0; + if (mfi_mapcmd(sc, cm) != 0) { + device_printf(sc->mfi_dev, "Failed to get syspd device listing\n"); + goto out; + } + bus_dmamap_sync(sc->mfi_buffer_dmat,cm->cm_dmamap, + BUS_DMASYNC_POSTREAD); + bus_dmamap_unload(sc->mfi_buffer_dmat, cm->cm_dmamap); + hdr = &cm->cm_frame->header; + if (hdr->cmd_status != MFI_STAT_OK) { + device_printf(sc->mfi_dev, "MFI_DCMD_PD_LIST_QUERY failed %x\n", + hdr->cmd_status); + goto out; + } + for (i=0;icount;i++) { + if(pdlist->addr[i].device_id == pdlist->addr[i].encl_device_id) + goto skip_sys_pd_add; + /* Get each PD and add it to the system */ + if (!TAILQ_EMPTY(&sc->mfi_syspd_tqh)) { + TAILQ_FOREACH(syspd, &sc->mfi_syspd_tqh,pd_link) { + if (syspd->pd_id == pdlist->addr[i].device_id) + goto skip_sys_pd_add; + } + } + mfi_add_sys_pd(sc,pdlist->addr[i].device_id); + skip_sys_pd_add:; + + } + /* Delete SYSPD's whose state has been changed */ + if (!TAILQ_EMPTY(&sc->mfi_syspd_tqh)) { + TAILQ_FOREACH(syspd, &sc->mfi_syspd_tqh,pd_link) { + for (i=0;icount;i++) { + if (syspd->pd_id == pdlist->addr[i].device_id) + goto skip_sys_pd_delete; + } + mtx_lock(&Giant); + device_delete_child(sc->mfi_dev,syspd->pd_dev); + mtx_unlock(&Giant); +skip_sys_pd_delete:; + } + } +out: + if (pdlist) + free(pdlist, M_MFIBUF); + if (cm) + mfi_release_command(cm); + + return; +} static void mfi_ldprobe(struct mfi_softc *sc) @@ -1082,8 +1463,79 @@ format_class(int8_t class) } static void -mfi_decode_evt(struct mfi_softc *sc, struct mfi_evt_detail *detail) +mfi_decode_evt(struct mfi_softc *sc, struct mfi_evt_detail *detail,uint8_t probe_sys_pd) { + struct mfi_system_pd *syspd = NULL; + switch (detail->arg_type) { + case MR_EVT_ARGS_NONE: +#define MR_EVT_CTRL_HOST_BUS_SCAN_REQUESTED 0x0152 + if (detail->code == MR_EVT_CTRL_HOST_BUS_SCAN_REQUESTED) { + device_printf(sc->mfi_dev,"HostBus scan raised\n"); + if (probe_sys_pd) { + /* Probe for new SYSPD's and Delete invalid SYSPD's */ + sx_xlock(&sc->mfi_config_lock); + mtx_lock(&sc->mfi_io_lock); + mfi_syspdprobe(sc); + mtx_unlock(&sc->mfi_io_lock); + sx_xunlock(&sc->mfi_config_lock); + } + } + break; + case MR_EVT_ARGS_LD_STATE: + /* During load time driver reads all the events starting from the one that + * has been logged after shutdown. Avoid these old events. + */ + if (!TAILQ_EMPTY(&sc->mfi_ld_tqh)) { + if (detail->args.ld_state.new_state == MFI_LD_STATE_OFFLINE ) { + /* Remove the LD */ + struct mfi_disk *ld = NULL; + TAILQ_FOREACH(ld, &sc->mfi_ld_tqh, ld_link) { + if (ld->ld_id == detail->args.ld_state.ld.target_id) + break; + } + /* + Fix: for kernel panics when SSCD is removed + KASSERT(ld != NULL, ("volume dissappeared")); + */ + if(ld != NULL) + { + mtx_lock(&Giant); + device_delete_child(sc->mfi_dev, ld->ld_dev); + mtx_unlock(&Giant); + } + } + } + break; + case MR_EVT_ARGS_PD: +#define MR_EVT_PD_REMOVED 0x0070 +#define MR_EVT_PD_INSERTED 0x005b + if (detail->code == MR_EVT_PD_REMOVED) { + if (probe_sys_pd) { + /* If the removed device is a SYSPD then delete it */ + if (!TAILQ_EMPTY(&sc->mfi_syspd_tqh)) { + TAILQ_FOREACH(syspd,&sc->mfi_syspd_tqh,pd_link) { + if (syspd->pd_id == detail->args.pd.device_id) { + mtx_lock(&Giant); + device_delete_child(sc->mfi_dev,syspd->pd_dev); + mtx_unlock(&Giant); + break; + } + } + } + } + } + if (detail->code == MR_EVT_PD_INSERTED) { + if (probe_sys_pd) { + /* Probe for new SYSPD's */ + sx_xlock(&sc->mfi_config_lock); + mtx_lock(&sc->mfi_io_lock); + mfi_syspdprobe(sc); + mtx_unlock(&sc->mfi_io_lock); + sx_xunlock(&sc->mfi_config_lock); + } + } + break; + } device_printf(sc->mfi_dev, "%d (%s/0x%04x/%s) - %s\n", detail->seq, format_timestamp(detail->time), detail->evt_class.members.locale, @@ -1113,12 +1565,16 @@ mfi_aen_register(struct mfi_softc *sc, i < current_aen.members.evt_class) current_aen.members.evt_class = prior_aen.members.evt_class; + mtx_lock(&sc->mfi_io_lock); mfi_abort(sc, sc->mfi_aen_cm); + mtx_unlock(&sc->mfi_io_lock); } } + mtx_lock(&sc->mfi_io_lock); error = mfi_dcmd_command(sc, &cm, MFI_DCMD_CTRL_EVENT_WAIT, (void **)&ed, sizeof(*ed)); + mtx_unlock(&sc->mfi_io_lock); if (error) { goto out; } @@ -1128,11 +1584,14 @@ mfi_aen_register(struct mfi_softc *sc, i ((uint32_t *)&dcmd->mbox)[1] = locale; cm->cm_flags = MFI_CMD_DATAIN; cm->cm_complete = mfi_aen_complete; - + + sc->last_seq_num = seq; sc->mfi_aen_cm = cm; + mtx_lock(&sc->mfi_io_lock); mfi_enqueue_ready(cm); mfi_startio(sc); + mtx_unlock(&sc->mfi_io_lock); out: return (error); @@ -1148,6 +1607,8 @@ mfi_aen_complete(struct mfi_command *cm) int seq = 0, aborted = 0; sc = cm->cm_sc; + mtx_assert(&sc->mfi_io_lock, MA_OWNED); + hdr = &cm->cm_frame->header; if (sc->mfi_aen_cm == NULL) *** DIFF OUTPUT TRUNCATED AT 1000 LINES *** From owner-svn-src-projects@FreeBSD.ORG Fri Nov 4 16:10:26 2011 Return-Path: Delivered-To: svn-src-projects@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id D389F1065672; Fri, 4 Nov 2011 16:10:26 +0000 (UTC) (envelope-from sbruno@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id AC54E8FC1F; Fri, 4 Nov 2011 16:10:26 +0000 (UTC) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.4/8.14.4) with ESMTP id pA4GAQiW025116; Fri, 4 Nov 2011 16:10:26 GMT (envelope-from sbruno@svn.freebsd.org) Received: (from sbruno@localhost) by svn.freebsd.org (8.14.4/8.14.4/Submit) id pA4GAQ6X025115; Fri, 4 Nov 2011 16:10:26 GMT (envelope-from sbruno@svn.freebsd.org) Message-Id: <201111041610.pA4GAQ6X025115@svn.freebsd.org> From: Sean Bruno Date: Fri, 4 Nov 2011 16:10:26 +0000 (UTC) To: src-committers@freebsd.org, svn-src-projects@freebsd.org X-SVN-Group: projects MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r227084 - projects/xendom0 X-BeenThere: svn-src-projects@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: "SVN commit messages for the src " projects" tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Fri, 04 Nov 2011 16:10:26 -0000 Author: sbruno Date: Fri Nov 4 16:10:26 2011 New Revision: 227084 URL: http://svn.freebsd.org/changeset/base/227084 Log: Deleting this project branch do to ENOTIME Deleted: projects/xendom0/ From owner-svn-src-projects@FreeBSD.ORG Sat Nov 5 16:04:57 2011 Return-Path: Delivered-To: svn-src-projects@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id D22B6106566B; Sat, 5 Nov 2011 16:04:57 +0000 (UTC) (envelope-from nwhitehorn@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id C12E48FC13; Sat, 5 Nov 2011 16:04:57 +0000 (UTC) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.4/8.14.4) with ESMTP id pA5G4v20074654; Sat, 5 Nov 2011 16:04:57 GMT (envelope-from nwhitehorn@svn.freebsd.org) Received: (from nwhitehorn@localhost) by svn.freebsd.org (8.14.4/8.14.4/Submit) id pA5G4v9a074651; Sat, 5 Nov 2011 16:04:57 GMT (envelope-from nwhitehorn@svn.freebsd.org) Message-Id: <201111051604.pA5G4v9a074651@svn.freebsd.org> From: Nathan Whitehorn Date: Sat, 5 Nov 2011 16:04:57 +0000 (UTC) To: src-committers@freebsd.org, svn-src-projects@freebsd.org X-SVN-Group: projects MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r227109 - in projects/pseries: conf powerpc/pseries X-BeenThere: svn-src-projects@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: "SVN commit messages for the src " projects" tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sat, 05 Nov 2011 16:04:57 -0000 Author: nwhitehorn Date: Sat Nov 5 16:04:57 2011 New Revision: 227109 URL: http://svn.freebsd.org/changeset/base/227109 Log: Add the beginnings of the pSeries PIC driver. IPIs work, at least, which is all I could test in QEMU. A few other changes (to RTAS and the platform infrastructure) will be required to make non-IPIs work. Added: projects/pseries/powerpc/pseries/xics.c (contents, props changed) Modified: projects/pseries/conf/files.powerpc Modified: projects/pseries/conf/files.powerpc ============================================================================== --- projects/pseries/conf/files.powerpc Sat Nov 5 12:01:51 2011 (r227108) +++ projects/pseries/conf/files.powerpc Sat Nov 5 16:04:57 2011 (r227109) @@ -219,6 +219,7 @@ powerpc/pseries/phyp_console.c optional powerpc/pseries/platform_chrp.c optional pseries powerpc/pseries/rtas_dev.c optional pseries powerpc/pseries/rtas_pci.c optional pseries pci +powerpc/pseries/xics.c optional pseries powerpc64 powerpc/psim/iobus.c optional psim powerpc/psim/ata_iobus.c optional ata psim powerpc/psim/openpic_iobus.c optional psim Added: projects/pseries/powerpc/pseries/xics.c ============================================================================== --- /dev/null 00:00:00 1970 (empty, because file is newly added) +++ projects/pseries/powerpc/pseries/xics.c Sat Nov 5 16:04:57 2011 (r227109) @@ -0,0 +1,264 @@ +/*- + * Copyright 2011 Nathan Whitehorn + * + * 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. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 AUTHOR 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. + * + * $FreeBSD$ + */ + +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +#include +#include +#include +#include + +#include +#include + +#include "phyp-hvcall.h" +#include "pic_if.h" + +#define XICS_PRIORITY 5 /* Random non-zero number */ +#define XICS_IPI 2 +#define MAX_XICS_IRQS 255 /* XXX: Should be 2^24, but causes problem */ + +static int xics_probe(device_t); +static int xics_attach(device_t); + +static void xics_bind(device_t dev, u_int irq, cpuset_t cpumask); +static void xics_dispatch(device_t, struct trapframe *); +static void xics_enable(device_t, u_int, u_int); +static void xics_eoi(device_t, u_int); +static void xics_ipi(device_t, u_int); +static void xics_mask(device_t, u_int); +static void xics_unmask(device_t, u_int); + +static device_method_t xics_methods[] = { + /* Device interface */ + DEVMETHOD(device_probe, xics_probe), + DEVMETHOD(device_attach, xics_attach), + + /* PIC interface */ + DEVMETHOD(pic_bind, xics_bind), + DEVMETHOD(pic_dispatch, xics_dispatch), + DEVMETHOD(pic_enable, xics_enable), + DEVMETHOD(pic_eoi, xics_eoi), + DEVMETHOD(pic_ipi, xics_ipi), + DEVMETHOD(pic_mask, xics_mask), + DEVMETHOD(pic_unmask, xics_unmask), + + { 0, 0 }, +}; + +struct xics_softc { + int ibm_int_on; + int ibm_int_off; + int ibm_get_xive; + int ibm_set_xive; + + /* XXX: inefficient -- hash table? tree? */ + struct { + int irq; + int vector; + } intvecs[256]; + int nintvecs; +}; + +static driver_t xics_driver = { + "xics", + xics_methods, + sizeof(struct xics_softc) +}; + +static devclass_t xics_devclass; + +DRIVER_MODULE(xics, nexus, xics_driver, xics_devclass, 0, 0); + +static int +xics_probe(device_t dev) +{ + if (ofw_bus_get_name(dev) == NULL || strcmp(ofw_bus_get_name(dev), + "interrupt-controller") != 0) + return (ENXIO); + + if (!ofw_bus_is_compatible(dev, "ibm,ppc-xicp")) + return (ENXIO); + + device_set_desc(dev, "PAPR virtual interrupt controller"); + return (BUS_PROBE_GENERIC); +} + +static int +xics_attach(device_t dev) +{ + struct xics_softc *sc; + + sc = device_get_softc(dev); + sc->nintvecs = 0; + sc->ibm_int_on = rtas_token_lookup("ibm,int-on"); + sc->ibm_int_off = rtas_token_lookup("ibm,int-off"); + sc->ibm_set_xive = rtas_token_lookup("ibm,set-xive"); + sc->ibm_get_xive = rtas_token_lookup("ibm,get-xive"); + + powerpc_register_pic(dev, ofw_bus_get_node(dev), MAX_XICS_IRQS, + 1 /* Number of IPIs */, FALSE); + return (0); +} + +/* + * PIC I/F methods. + */ + +static void +xics_bind(device_t dev, u_int irq, cpuset_t cpumask) +{ + struct xics_softc *sc = device_get_softc(dev); + uint64_t status; + + /* + * XXX: This is very special and just needs a mask. + * For the moment, just play dirty and get the first word. + */ + rtas_call_method(sc->ibm_set_xive, 3, 1, (uint64_t)irq, + cpumask.__bits[0], XICS_PRIORITY, &status); +} + +static void +xics_dispatch(device_t dev, struct trapframe *tf) +{ + struct xics_softc *sc; + uint64_t xirr, junk; + int i; + + sc = device_get_softc(dev); + for (;;) { + /* Return value in R4, use the PFT call */ + phyp_pft_hcall(H_XIRR, 0, 0, 0, 0, &xirr, &junk, &junk); + xirr &= 0x00ffffff; + + if (xirr == 0) { /* No more pending interrupts? */ + phyp_hcall(H_CPPR, (uint64_t)0xff); + break; + } + if (xirr == XICS_IPI) { /* Magic number for IPIs */ + xirr = MAX_XICS_IRQS; /* Map to FreeBSD magic */ + phyp_hcall(H_IPI, (uint64_t)(PCPU_GET(cpuid)), + 0xff); /* Clear IPI */ + } + + /* XXX: super inefficient */ + for (i = 0; i < sc->nintvecs; i++) { + if (sc->intvecs[i].irq == xirr) + break; + } + + KASSERT(i < sc->nintvecs, ("Unmapped XIRR")); + powerpc_dispatch_intr(sc->intvecs[i].vector, tf); + } +} + +static void +xics_enable(device_t dev, u_int irq, u_int vector) +{ + struct xics_softc *sc; + uint64_t status, cpumask; + int i; + + sc = device_get_softc(dev); + + KASSERT(sc->nintvecs + 1 < sizeof(sc->intvecs)/sizeof(sc->intvecs[0]), + ("Too many XICS interrupts")); + + /* XXX: not thread safe */ + sc->intvecs[sc->nintvecs].irq = irq; + sc->intvecs[sc->nintvecs].vector = vector; + sc->nintvecs++; + + /* IPIs are also enabled */ + if (irq == MAX_XICS_IRQS) + return; + + /* Bind to all CPUs to start */ + cpumask = 0; + CPU_FOREACH(i) + cpumask |= (1ULL << i); + + rtas_call_method(sc->ibm_set_xive, 3, 1, (uint64_t)irq, cpumask, + XICS_PRIORITY, &status); + xics_unmask(dev, irq); +} + +static void +xics_eoi(device_t dev, u_int irq) +{ + uint64_t xirr; + + if (irq == MAX_XICS_IRQS) /* Remap IPI interrupt to internal value */ + irq = XICS_IPI; + xirr = irq | (XICS_PRIORITY << 24); + + phyp_hcall(H_EOI, xirr); +} + +static void +xics_ipi(device_t dev, u_int cpu) +{ + + phyp_hcall(H_IPI, (uint64_t)cpu, XICS_PRIORITY); +} + +static void +xics_mask(device_t dev, u_int irq) +{ + struct xics_softc *sc = device_get_softc(dev); + uint64_t status; + + if (irq == MAX_XICS_IRQS) + return; + + /* XXX: These RTAS calls are problematic, since RTAS needs locks */ + rtas_call_method(sc->ibm_int_off, 1, 1, (uint64_t)irq, &status); +} + +static void +xics_unmask(device_t dev, u_int irq) +{ + struct xics_softc *sc = device_get_softc(dev); + uint64_t status; + + if (irq == MAX_XICS_IRQS) + return; + + /* XXX: These RTAS calls are problematic, since RTAS needs locks */ + rtas_call_method(sc->ibm_int_on, 1, 1, (uint64_t)irq, &status); +} From owner-svn-src-projects@FreeBSD.ORG Sat Nov 5 17:29:28 2011 Return-Path: Delivered-To: svn-src-projects@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 8DFE61065674; Sat, 5 Nov 2011 17:29:28 +0000 (UTC) (envelope-from nwhitehorn@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id 5D8258FC19; Sat, 5 Nov 2011 17:29:28 +0000 (UTC) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.4/8.14.4) with ESMTP id pA5HTSBs077637; Sat, 5 Nov 2011 17:29:28 GMT (envelope-from nwhitehorn@svn.freebsd.org) Received: (from nwhitehorn@localhost) by svn.freebsd.org (8.14.4/8.14.4/Submit) id pA5HTSXA077631; Sat, 5 Nov 2011 17:29:28 GMT (envelope-from nwhitehorn@svn.freebsd.org) Message-Id: <201111051729.pA5HTSXA077631@svn.freebsd.org> From: Nathan Whitehorn Date: Sat, 5 Nov 2011 17:29:28 +0000 (UTC) To: src-committers@freebsd.org, svn-src-projects@freebsd.org X-SVN-Group: projects MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r227113 - in projects/pseries/powerpc: include powerpc pseries X-BeenThere: svn-src-projects@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: "SVN commit messages for the src " projects" tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sat, 05 Nov 2011 17:29:28 -0000 Author: nwhitehorn Date: Sat Nov 5 17:29:28 2011 New Revision: 227113 URL: http://svn.freebsd.org/changeset/base/227113 Log: Allow platform modules to set the CPU interrupt priority state, and implement this on pSeries. Modified: projects/pseries/powerpc/include/platform.h projects/pseries/powerpc/powerpc/mp_machdep.c projects/pseries/powerpc/powerpc/platform.c projects/pseries/powerpc/powerpc/platform_if.m projects/pseries/powerpc/pseries/platform_chrp.c Modified: projects/pseries/powerpc/include/platform.h ============================================================================== --- projects/pseries/powerpc/include/platform.h Sat Nov 5 16:47:47 2011 (r227112) +++ projects/pseries/powerpc/include/platform.h Sat Nov 5 17:29:28 2011 (r227113) @@ -52,6 +52,7 @@ int platform_smp_first_cpu(struct cpuref int platform_smp_next_cpu(struct cpuref *); int platform_smp_get_bsp(struct cpuref *); int platform_smp_start_cpu(struct pcpu *); +void platform_smp_ap_init(void); const char *installed_platform(void); void platform_probe_and_attach(void); Modified: projects/pseries/powerpc/powerpc/mp_machdep.c ============================================================================== --- projects/pseries/powerpc/powerpc/mp_machdep.c Sat Nov 5 16:47:47 2011 (r227112) +++ projects/pseries/powerpc/powerpc/mp_machdep.c Sat Nov 5 17:29:28 2011 (r227113) @@ -90,6 +90,9 @@ machdep_ap_bootstrap(void) #endif decr_ap_init(); + /* Give platform code a chance to do anything necessary */ + platform_smp_ap_init(); + /* Serialize console output and AP count increment */ mtx_lock_spin(&ap_boot_mtx); ap_awake++; Modified: projects/pseries/powerpc/powerpc/platform.c ============================================================================== --- projects/pseries/powerpc/powerpc/platform.c Sat Nov 5 16:47:47 2011 (r227112) +++ projects/pseries/powerpc/powerpc/platform.c Sat Nov 5 17:29:28 2011 (r227113) @@ -141,6 +141,12 @@ platform_smp_start_cpu(struct pcpu *cpu) return (PLATFORM_SMP_START_CPU(plat_obj, cpu)); } +void +platform_smp_ap_init() +{ + PLATFORM_SMP_AP_INIT(plat_obj); +} + #ifdef SMP struct cpu_group * cpu_topo(void) Modified: projects/pseries/powerpc/powerpc/platform_if.m ============================================================================== --- projects/pseries/powerpc/powerpc/platform_if.m Sat Nov 5 16:47:47 2011 (r227112) +++ projects/pseries/powerpc/powerpc/platform_if.m Sat Nov 5 17:29:28 2011 (r227113) @@ -80,6 +80,10 @@ CODE { { return (VM_MAX_ADDRESS); } + static void platform_null_smp_ap_init(platform_t plat) + { + return; + } }; /** @@ -185,6 +189,14 @@ METHOD int smp_start_cpu { }; /** + * @brief Start a CPU + * + */ +METHOD void smp_ap_init { + platform_t _plat; +} DEFAULT platform_null_smp_ap_init; + +/** * @brief Return SMP topology */ METHOD cpu_group_t smp_topo { Modified: projects/pseries/powerpc/pseries/platform_chrp.c ============================================================================== --- projects/pseries/powerpc/pseries/platform_chrp.c Sat Nov 5 16:47:47 2011 (r227112) +++ projects/pseries/powerpc/pseries/platform_chrp.c Sat Nov 5 17:29:28 2011 (r227113) @@ -68,6 +68,7 @@ static u_long chrp_timebase_freq(platfor static int chrp_smp_first_cpu(platform_t, struct cpuref *cpuref); static int chrp_smp_next_cpu(platform_t, struct cpuref *cpuref); static int chrp_smp_get_bsp(platform_t, struct cpuref *cpuref); +static void chrp_smp_ap_init(platform_t); #ifdef SMP static int chrp_smp_start_cpu(platform_t, struct pcpu *cpu); static struct cpu_group *chrp_smp_topo(platform_t plat); @@ -85,6 +86,7 @@ static platform_method_t chrp_methods[] PLATFORMMETHOD(platform_real_maxaddr, chrp_real_maxaddr), PLATFORMMETHOD(platform_timebase_freq, chrp_timebase_freq), + PLATFORMMETHOD(platform_smp_ap_init, chrp_smp_ap_init), PLATFORMMETHOD(platform_smp_first_cpu, chrp_smp_first_cpu), PLATFORMMETHOD(platform_smp_next_cpu, chrp_smp_next_cpu), PLATFORMMETHOD(platform_smp_get_bsp, chrp_smp_get_bsp), @@ -128,6 +130,9 @@ chrp_attach(platform_t plat) pmap_mmu_install("mmu_phyp", BUS_PROBE_SPECIFIC); cpu_idle_hook = phyp_cpu_idle; + + /* Set interrupt priority */ + phyp_hcall(H_CPPR, 0xff); } #endif @@ -368,4 +373,13 @@ phyp_cpu_idle(void) { phyp_hcall(H_CEDE); } + +static void +chrp_smp_ap_init(platform_t platform) +{ + if (!(mfmsr() & PSL_HV)) { + /* Set interrupt priority */ + phyp_hcall(H_CPPR, 0xff); + } +} #endif From owner-svn-src-projects@FreeBSD.ORG Sat Nov 5 17:43:03 2011 Return-Path: Delivered-To: svn-src-projects@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 3D6E01065672; Sat, 5 Nov 2011 17:43:03 +0000 (UTC) (envelope-from nwhitehorn@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id 23CFA8FC19; Sat, 5 Nov 2011 17:43:03 +0000 (UTC) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.4/8.14.4) with ESMTP id pA5Hh3lQ078076; Sat, 5 Nov 2011 17:43:03 GMT (envelope-from nwhitehorn@svn.freebsd.org) Received: (from nwhitehorn@localhost) by svn.freebsd.org (8.14.4/8.14.4/Submit) id pA5Hh3gr078073; Sat, 5 Nov 2011 17:43:03 GMT (envelope-from nwhitehorn@svn.freebsd.org) Message-Id: <201111051743.pA5Hh3gr078073@svn.freebsd.org> From: Nathan Whitehorn Date: Sat, 5 Nov 2011 17:43:03 +0000 (UTC) To: src-committers@freebsd.org, svn-src-projects@freebsd.org X-SVN-Group: projects MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r227114 - in projects/pseries/powerpc: ofw pseries X-BeenThere: svn-src-projects@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: "SVN commit messages for the src " projects" tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sat, 05 Nov 2011 17:43:03 -0000 Author: nwhitehorn Date: Sat Nov 5 17:43:02 2011 New Revision: 227114 URL: http://svn.freebsd.org/changeset/base/227114 Log: Fix thread-safety problems in xics, and convert the RTAS mutex to a spin lock so that it can be used from interrupt context. Modified: projects/pseries/powerpc/ofw/rtas.c projects/pseries/powerpc/pseries/xics.c Modified: projects/pseries/powerpc/ofw/rtas.c ============================================================================== --- projects/pseries/powerpc/ofw/rtas.c Sat Nov 5 17:29:28 2011 (r227113) +++ projects/pseries/powerpc/ofw/rtas.c Sat Nov 5 17:43:02 2011 (r227114) @@ -93,7 +93,7 @@ rtas_setup(void *junk) return; } - mtx_init(&rtas_mtx, "RTAS", MTX_DEF, 0); + mtx_init(&rtas_mtx, "RTAS", NULL, MTX_SPIN); /* RTAS must be called with everything turned off in MSR */ rtasmsr = mfmsr(); @@ -208,7 +208,7 @@ rtas_call_method(cell_t token, int nargs args.token = token; va_start(ap, nreturns); - mtx_lock(&rtas_mtx); + mtx_lock_spin(&rtas_mtx); rtas_bounce_offset = 0; args.nargs = nargs; @@ -232,7 +232,7 @@ rtas_call_method(cell_t token, int nargs __asm __volatile ("sync"); rtas_real_unmap(argsptr, &args, sizeof(args)); - mtx_unlock(&rtas_mtx); + mtx_unlock_spin(&rtas_mtx); if (result < 0) return (result); Modified: projects/pseries/powerpc/pseries/xics.c ============================================================================== --- projects/pseries/powerpc/pseries/xics.c Sat Nov 5 17:29:28 2011 (r227113) +++ projects/pseries/powerpc/pseries/xics.c Sat Nov 5 17:43:02 2011 (r227114) @@ -81,6 +81,8 @@ static device_method_t xics_methods[] = }; struct xics_softc { + struct mtx sc_mtx; + int ibm_int_on; int ibm_int_off; int ibm_get_xive; @@ -121,10 +123,11 @@ xics_probe(device_t dev) static int xics_attach(device_t dev) { - struct xics_softc *sc; + struct xics_softc *sc = device_get_softc(dev); - sc = device_get_softc(dev); + mtx_init(&sc->sc_mtx, "XICS", NULL, MTX_DEF); sc->nintvecs = 0; + sc->ibm_int_on = rtas_token_lookup("ibm,int-on"); sc->ibm_int_off = rtas_token_lookup("ibm,int-off"); sc->ibm_set_xive = rtas_token_lookup("ibm,set-xive"); @@ -199,10 +202,12 @@ xics_enable(device_t dev, u_int irq, u_i KASSERT(sc->nintvecs + 1 < sizeof(sc->intvecs)/sizeof(sc->intvecs[0]), ("Too many XICS interrupts")); - /* XXX: not thread safe */ + mtx_lock(&sc->sc_mtx); sc->intvecs[sc->nintvecs].irq = irq; sc->intvecs[sc->nintvecs].vector = vector; + mb(); sc->nintvecs++; + mtx_unlock(&sc->sc_mtx); /* IPIs are also enabled */ if (irq == MAX_XICS_IRQS) @@ -246,7 +251,6 @@ xics_mask(device_t dev, u_int irq) if (irq == MAX_XICS_IRQS) return; - /* XXX: These RTAS calls are problematic, since RTAS needs locks */ rtas_call_method(sc->ibm_int_off, 1, 1, (uint64_t)irq, &status); } @@ -259,6 +263,5 @@ xics_unmask(device_t dev, u_int irq) if (irq == MAX_XICS_IRQS) return; - /* XXX: These RTAS calls are problematic, since RTAS needs locks */ rtas_call_method(sc->ibm_int_on, 1, 1, (uint64_t)irq, &status); } From owner-svn-src-projects@FreeBSD.ORG Sat Nov 5 17:43:28 2011 Return-Path: Delivered-To: svn-src-projects@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id A0E041065673; Sat, 5 Nov 2011 17:43:28 +0000 (UTC) (envelope-from nwhitehorn@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id 913588FC1A; Sat, 5 Nov 2011 17:43:28 +0000 (UTC) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.4/8.14.4) with ESMTP id pA5HhSK6078124; Sat, 5 Nov 2011 17:43:28 GMT (envelope-from nwhitehorn@svn.freebsd.org) Received: (from nwhitehorn@localhost) by svn.freebsd.org (8.14.4/8.14.4/Submit) id pA5HhSVL078122; Sat, 5 Nov 2011 17:43:28 GMT (envelope-from nwhitehorn@svn.freebsd.org) Message-Id: <201111051743.pA5HhSVL078122@svn.freebsd.org> From: Nathan Whitehorn Date: Sat, 5 Nov 2011 17:43:28 +0000 (UTC) To: src-committers@freebsd.org, svn-src-projects@freebsd.org X-SVN-Group: projects MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r227115 - projects/pseries/powerpc/pseries X-BeenThere: svn-src-projects@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: "SVN commit messages for the src " projects" tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sat, 05 Nov 2011 17:43:28 -0000 Author: nwhitehorn Date: Sat Nov 5 17:43:28 2011 New Revision: 227115 URL: http://svn.freebsd.org/changeset/base/227115 Log: H_CEDE seems to make some CPUs hang, at least in QEMU, so turn it off for now. Modified: projects/pseries/powerpc/pseries/platform_chrp.c Modified: projects/pseries/powerpc/pseries/platform_chrp.c ============================================================================== --- projects/pseries/powerpc/pseries/platform_chrp.c Sat Nov 5 17:43:02 2011 (r227114) +++ projects/pseries/powerpc/pseries/platform_chrp.c Sat Nov 5 17:43:28 2011 (r227115) @@ -371,7 +371,9 @@ chrp_reset(platform_t platform) static void phyp_cpu_idle(void) { + #ifdef NOTYET /* Causes hangs on QEMU */ phyp_hcall(H_CEDE); + #endif } static void From owner-svn-src-projects@FreeBSD.ORG Sat Nov 5 19:58:05 2011 Return-Path: Delivered-To: svn-src-projects@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 6E2D7106564A; Sat, 5 Nov 2011 19:58:05 +0000 (UTC) (envelope-from cognet@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id 5E73E8FC1A; Sat, 5 Nov 2011 19:58:05 +0000 (UTC) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.4/8.14.4) with ESMTP id pA5Jw5lF082329; Sat, 5 Nov 2011 19:58:05 GMT (envelope-from cognet@svn.freebsd.org) Received: (from cognet@localhost) by svn.freebsd.org (8.14.4/8.14.4/Submit) id pA5Jw577082327; Sat, 5 Nov 2011 19:58:05 GMT (envelope-from cognet@svn.freebsd.org) Message-Id: <201111051958.pA5Jw577082327@svn.freebsd.org> From: Olivier Houchard Date: Sat, 5 Nov 2011 19:58:05 +0000 (UTC) To: src-committers@freebsd.org, svn-src-projects@freebsd.org X-SVN-Group: projects MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r227119 - projects/armv6/sys/arm/arm X-BeenThere: svn-src-projects@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: "SVN commit messages for the src " projects" tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sat, 05 Nov 2011 19:58:05 -0000 Author: cognet Date: Sat Nov 5 19:58:05 2011 New Revision: 227119 URL: http://svn.freebsd.org/changeset/base/227119 Log: When handling bounce pages, on POSTREAD, invalidate cache for all bounce pages, not just the first one. Also, make sure the address and the size are dataline cache size aligned, it should be ok to invalidate before and after the buffer, as long as it stays in the bounce page, as those bits aren't supposed to be used anyway. Modified: projects/armv6/sys/arm/arm/busdma_machdep-v6.c Modified: projects/armv6/sys/arm/arm/busdma_machdep-v6.c ============================================================================== --- projects/armv6/sys/arm/arm/busdma_machdep-v6.c Sat Nov 5 19:25:21 2011 (r227118) +++ projects/armv6/sys/arm/arm/busdma_machdep-v6.c Sat Nov 5 19:58:05 2011 (r227119) @@ -1157,6 +1157,22 @@ _bus_dmamap_sync(bus_dma_tag_t dmat, bus (vm_offset_t)bpage->busaddr, bpage->datacount); while (bpage != NULL) { + vm_offset_t startv; + vm_paddr_t startp; + int len; + + startv = bpage->vaddr &~ arm_dcache_align_mask; + startp = bpage->busaddr &~ arm_dcache_align_mask; + len = bpage->datacount; + + if (startv != bpage->vaddr) + len += bpage->vaddr & arm_dcache_align_mask; + if (len & arm_dcache_align_mask) + len = (len - + (len & arm_dcache_align_mask)) + + arm_dcache_align; + cpu_dcache_inv_range(startv, len); + l2cache_inv_range(startv, startp, len); bcopy((void *)bpage->vaddr, (void *)bpage->datavaddr, bpage->datacount); From owner-svn-src-projects@FreeBSD.ORG Sat Nov 5 22:44:37 2011 Return-Path: Delivered-To: svn-src-projects@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 784891065670; Sat, 5 Nov 2011 22:44:37 +0000 (UTC) (envelope-from andreast@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id 683758FC12; Sat, 5 Nov 2011 22:44:37 +0000 (UTC) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.4/8.14.4) with ESMTP id pA5MibMR087952; Sat, 5 Nov 2011 22:44:37 GMT (envelope-from andreast@svn.freebsd.org) Received: (from andreast@localhost) by svn.freebsd.org (8.14.4/8.14.4/Submit) id pA5Mibk0087950; Sat, 5 Nov 2011 22:44:37 GMT (envelope-from andreast@svn.freebsd.org) Message-Id: <201111052244.pA5Mibk0087950@svn.freebsd.org> From: Andreas Tobler Date: Sat, 5 Nov 2011 22:44:37 +0000 (UTC) To: src-committers@freebsd.org, svn-src-projects@freebsd.org X-SVN-Group: projects MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r227125 - projects/pseries/powerpc/pseries X-BeenThere: svn-src-projects@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: "SVN commit messages for the src " projects" tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sat, 05 Nov 2011 22:44:37 -0000 Author: andreast Date: Sat Nov 5 22:44:37 2011 New Revision: 227125 URL: http://svn.freebsd.org/changeset/base/227125 Log: Adjust the size of the packet we pass to phyp_hcall. Suggested by: nwhitehorn Modified: projects/pseries/powerpc/pseries/phyp_console.c Modified: projects/pseries/powerpc/pseries/phyp_console.c ============================================================================== --- projects/pseries/powerpc/pseries/phyp_console.c Sat Nov 5 22:33:19 2011 (r227124) +++ projects/pseries/powerpc/pseries/phyp_console.c Sat Nov 5 22:44:37 2011 (r227125) @@ -186,7 +186,7 @@ phyp_uart_putc(struct uart_bas *bas, int cbuf.bytes[4] = c; break; } - phyp_hcall(H_PUT_TERM_CHAR, (uint64_t)bas->bsh, 1UL, cbuf.u64, 0); + phyp_hcall(H_PUT_TERM_CHAR, (uint64_t)bas->bsh, 5UL, cbuf.u64, 0); } static int