From owner-svn-src-projects@FreeBSD.ORG Sun Aug 21 18:23:10 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 6DD4B1065676; Sun, 21 Aug 2011 18:23:10 +0000 (UTC) (envelope-from mav@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id 13BAB8FC15; Sun, 21 Aug 2011 18:23:10 +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 p7LIN9Do014481; Sun, 21 Aug 2011 18:23:09 GMT (envelope-from mav@svn.freebsd.org) Received: (from mav@localhost) by svn.freebsd.org (8.14.4/8.14.4/Submit) id p7LIN9i8014479; Sun, 21 Aug 2011 18:23:09 GMT (envelope-from mav@svn.freebsd.org) Message-Id: <201108211823.p7LIN9i8014479@svn.freebsd.org> From: Alexander Motin Date: Sun, 21 Aug 2011 18:23:09 +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: r225064 - projects/zfsd/head/sys/cam/scsi 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: Sun, 21 Aug 2011 18:23:10 -0000 Author: mav Date: Sun Aug 21 18:23:09 2011 New Revision: 225064 URL: http://svn.freebsd.org/changeset/base/225064 Log: Do not delay boot if we are not going to run daemon process. Otherwise boot will wait infinitely. Modified: projects/zfsd/head/sys/cam/scsi/scsi_enc.c Modified: projects/zfsd/head/sys/cam/scsi/scsi_enc.c ============================================================================== --- projects/zfsd/head/sys/cam/scsi/scsi_enc.c Sun Aug 21 16:38:16 2011 (r225063) +++ projects/zfsd/head/sys/cam/scsi/scsi_enc.c Sun Aug 21 18:23:09 2011 (r225064) @@ -940,9 +940,11 @@ enc_ctor(struct cam_periph *periph, void * through our state machine so that physical path data is * present. */ - enc->enc_boot_hold_ch.ich_func = enc_nop_confighook_cb; - enc->enc_boot_hold_ch.ich_arg = enc; - config_intrhook_establish(&enc->enc_boot_hold_ch); + if (enc->enc_vec.poll_status != NULL) { + enc->enc_boot_hold_ch.ich_func = enc_nop_confighook_cb; + enc->enc_boot_hold_ch.ich_arg = enc; + config_intrhook_establish(&enc->enc_boot_hold_ch); + } /* * The softc field is set only once the enc is fully initialized From owner-svn-src-projects@FreeBSD.ORG Mon Aug 22 19:46: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 A3E8C106566B; Mon, 22 Aug 2011 19:46:25 +0000 (UTC) (envelope-from mdf@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id 7B87F8FC14; Mon, 22 Aug 2011 19:46: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 p7MJkPfx065862; Mon, 22 Aug 2011 19:46:25 GMT (envelope-from mdf@svn.freebsd.org) Received: (from mdf@localhost) by svn.freebsd.org (8.14.4/8.14.4/Submit) id p7MJkP5E065861; Mon, 22 Aug 2011 19:46:25 GMT (envelope-from mdf@svn.freebsd.org) Message-Id: <201108221946.p7MJkP5E065861@svn.freebsd.org> From: Matthew D Fleming Date: Mon, 22 Aug 2011 19:46:25 +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: r225086 - projects/ino64 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, 22 Aug 2011 19:46:25 -0000 Author: mdf Date: Mon Aug 22 19:46:25 2011 New Revision: 225086 URL: http://svn.freebsd.org/changeset/base/225086 Log: Branch to integrate Gleb Kurtsou's ino64 GSoC project. Added: - copied from r225085, head/ Directory Properties: projects/ino64/ (props changed) From owner-svn-src-projects@FreeBSD.ORG Mon Aug 22 23:27:23 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 A3F9E106566C; Mon, 22 Aug 2011 23:27:23 +0000 (UTC) (envelope-from mdf@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id 8941E8FC12; Mon, 22 Aug 2011 23:27:23 +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 p7MNRNof072824; Mon, 22 Aug 2011 23:27:23 GMT (envelope-from mdf@svn.freebsd.org) Received: (from mdf@localhost) by svn.freebsd.org (8.14.4/8.14.4/Submit) id p7MNRNbe072812; Mon, 22 Aug 2011 23:27:23 GMT (envelope-from mdf@svn.freebsd.org) Message-Id: <201108222327.p7MNRNbe072812@svn.freebsd.org> From: Matthew D Fleming Date: Mon, 22 Aug 2011 23:27:23 +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: r225095 - in projects/ino64: include lib/libc/gen 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, 22 Aug 2011 23:27:23 -0000 Author: mdf Date: Mon Aug 22 23:27:23 2011 New Revision: 225095 URL: http://svn.freebsd.org/changeset/base/225095 Log: Hide DIR definition by making it an opaque struct typedef. GSoC r222617, r222832. Code by Gleb Kurtsou. Added: projects/ino64/lib/libc/gen/dirent-private.h (contents, props changed) Modified: projects/ino64/include/dirent.h projects/ino64/lib/libc/gen/closedir.c projects/ino64/lib/libc/gen/fts-compat.c projects/ino64/lib/libc/gen/fts.c projects/ino64/lib/libc/gen/getcwd.c projects/ino64/lib/libc/gen/opendir.c projects/ino64/lib/libc/gen/readdir.c projects/ino64/lib/libc/gen/rewinddir.c projects/ino64/lib/libc/gen/seekdir.c projects/ino64/lib/libc/gen/telldir.c Modified: projects/ino64/include/dirent.h ============================================================================== --- projects/ino64/include/dirent.h Mon Aug 22 23:20:13 2011 (r225094) +++ projects/ino64/include/dirent.h Mon Aug 22 23:27:23 2011 (r225095) @@ -55,24 +55,8 @@ /* definitions for library routines operating on directories. */ #define DIRBLKSIZ 1024 -struct _telldir; /* see telldir.h */ -struct pthread_mutex; - -/* structure describing an open directory. */ -typedef struct _dirdesc { - int dd_fd; /* file descriptor associated with directory */ - long dd_loc; /* offset in current buffer */ - long dd_size; /* amount of data returned by getdirentries */ - char *dd_buf; /* data buffer */ - int dd_len; /* size of data buffer */ - long dd_seek; /* magic cookie returned by getdirentries */ - long dd_rewind; /* magic cookie for rewinding */ - int dd_flags; /* flags for readdir */ - struct pthread_mutex *dd_lock; /* lock */ - struct _telldir *dd_td; /* telldir position recording */ -} DIR; - -#define dirfd(dirp) ((dirp)->dd_fd) +struct _dirdesc; +typedef struct _dirdesc DIR; /* flags for opendir2 */ #define DTF_HIDEW 0x0001 /* hide whiteout entries */ Modified: projects/ino64/lib/libc/gen/closedir.c ============================================================================== --- projects/ino64/lib/libc/gen/closedir.c Mon Aug 22 23:20:13 2011 (r225094) +++ projects/ino64/lib/libc/gen/closedir.c Mon Aug 22 23:27:23 2011 (r225095) @@ -42,6 +42,7 @@ __FBSDID("$FreeBSD$"); #include "un-namespace.h" #include "libc_private.h" +#include "dirent-private.h" #include "telldir.h" /* Added: projects/ino64/lib/libc/gen/dirent-private.h ============================================================================== --- /dev/null 00:00:00 1970 (empty, because file is newly added) +++ projects/ino64/lib/libc/gen/dirent-private.h Mon Aug 22 23:27:23 2011 (r225095) @@ -0,0 +1,54 @@ +/*- + * Copyright (c) 1989, 1993 + * The Regents of the University of California. 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 University 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 REGENTS 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 REGENTS 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$ + */ + +#ifndef _DIRENT_PRIVATE_H_ +#define _DIRENT_PRIVATE_H_ + +struct _telldir; /* see telldir.h */ +struct pthread_mutex; + +/* structure describing an open directory. */ +struct _dirdesc { + int dd_fd; /* file descriptor associated with directory */ + long dd_loc; /* offset in current buffer */ + long dd_size; /* amount of data returned by getdirentries */ + char *dd_buf; /* data buffer */ + int dd_len; /* size of data buffer */ + long dd_seek; /* magic cookie returned by getdirentries */ + long dd_rewind; /* magic cookie for rewinding */ + int dd_flags; /* flags for readdir */ + struct pthread_mutex *dd_lock; /* lock */ + struct _telldir *dd_td; /* telldir position recording */ +}; + +#define dirfd(dirp) ((dirp)->dd_fd) + +#endif /* !_DIRENT_PRIVATE_H_ */ Modified: projects/ino64/lib/libc/gen/fts-compat.c ============================================================================== --- projects/ino64/lib/libc/gen/fts-compat.c Mon Aug 22 23:20:13 2011 (r225094) +++ projects/ino64/lib/libc/gen/fts-compat.c Mon Aug 22 23:27:23 2011 (r225095) @@ -52,6 +52,8 @@ __FBSDID("$FreeBSD$"); #include "fts-compat.h" #include "un-namespace.h" +#include "dirent-private.h" + FTSENT *__fts_children_44bsd(FTS *, int); int __fts_close_44bsd(FTS *); void *__fts_get_clientptr_44bsd(FTS *); Modified: projects/ino64/lib/libc/gen/fts.c ============================================================================== --- projects/ino64/lib/libc/gen/fts.c Mon Aug 22 23:20:13 2011 (r225094) +++ projects/ino64/lib/libc/gen/fts.c Mon Aug 22 23:27:23 2011 (r225095) @@ -52,6 +52,8 @@ __FBSDID("$FreeBSD$"); #include #include "un-namespace.h" +#include "dirent-private.h" + static FTSENT *fts_alloc(FTS *, char *, size_t); static FTSENT *fts_build(FTS *, int); static void fts_lfree(FTSENT *); Modified: projects/ino64/lib/libc/gen/getcwd.c ============================================================================== --- projects/ino64/lib/libc/gen/getcwd.c Mon Aug 22 23:20:13 2011 (r225094) +++ projects/ino64/lib/libc/gen/getcwd.c Mon Aug 22 23:27:23 2011 (r225095) @@ -46,6 +46,8 @@ __FBSDID("$FreeBSD$"); #include #include "un-namespace.h" +#include "dirent-private.h" + #define ISDOT(dp) \ (dp->d_name[0] == '.' && (dp->d_name[1] == '\0' || \ (dp->d_name[1] == '.' && dp->d_name[2] == '\0'))) Modified: projects/ino64/lib/libc/gen/opendir.c ============================================================================== --- projects/ino64/lib/libc/gen/opendir.c Mon Aug 22 23:20:13 2011 (r225094) +++ projects/ino64/lib/libc/gen/opendir.c Mon Aug 22 23:27:23 2011 (r225095) @@ -46,6 +46,7 @@ __FBSDID("$FreeBSD$"); #include #include "un-namespace.h" +#include "dirent-private.h" #include "telldir.h" static DIR * __opendir_common(int, const char *, int); Modified: projects/ino64/lib/libc/gen/readdir.c ============================================================================== --- projects/ino64/lib/libc/gen/readdir.c Mon Aug 22 23:20:13 2011 (r225094) +++ projects/ino64/lib/libc/gen/readdir.c Mon Aug 22 23:27:23 2011 (r225095) @@ -42,6 +42,7 @@ __FBSDID("$FreeBSD$"); #include "un-namespace.h" #include "libc_private.h" +#include "dirent-private.h" #include "telldir.h" /* Modified: projects/ino64/lib/libc/gen/rewinddir.c ============================================================================== --- projects/ino64/lib/libc/gen/rewinddir.c Mon Aug 22 23:20:13 2011 (r225094) +++ projects/ino64/lib/libc/gen/rewinddir.c Mon Aug 22 23:27:23 2011 (r225095) @@ -36,6 +36,7 @@ __FBSDID("$FreeBSD$"); #include #include +#include "dirent-private.h" #include "telldir.h" void Modified: projects/ino64/lib/libc/gen/seekdir.c ============================================================================== --- projects/ino64/lib/libc/gen/seekdir.c Mon Aug 22 23:20:13 2011 (r225094) +++ projects/ino64/lib/libc/gen/seekdir.c Mon Aug 22 23:27:23 2011 (r225095) @@ -40,6 +40,7 @@ __FBSDID("$FreeBSD$"); #include "un-namespace.h" #include "libc_private.h" +#include "dirent-private.h" #include "telldir.h" /* Modified: projects/ino64/lib/libc/gen/telldir.c ============================================================================== --- projects/ino64/lib/libc/gen/telldir.c Mon Aug 22 23:20:13 2011 (r225094) +++ projects/ino64/lib/libc/gen/telldir.c Mon Aug 22 23:27:23 2011 (r225095) @@ -43,6 +43,7 @@ __FBSDID("$FreeBSD$"); #include "un-namespace.h" #include "libc_private.h" +#include "dirent-private.h" #include "telldir.h" /* From owner-svn-src-projects@FreeBSD.ORG Mon Aug 22 23:54:13 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 0E0E1106566C; Mon, 22 Aug 2011 23:54:13 +0000 (UTC) (envelope-from mdf@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id EF5358FC13; Mon, 22 Aug 2011 23:54: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 p7MNsC5s074765; Mon, 22 Aug 2011 23:54:12 GMT (envelope-from mdf@svn.freebsd.org) Received: (from mdf@localhost) by svn.freebsd.org (8.14.4/8.14.4/Submit) id p7MNsC9B074753; Mon, 22 Aug 2011 23:54:12 GMT (envelope-from mdf@svn.freebsd.org) Message-Id: <201108222354.p7MNsC9B074753@svn.freebsd.org> From: Matthew D Fleming Date: Mon, 22 Aug 2011 23:54: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: r225097 - in projects/ino64: include lib/libc/gen usr.sbin/cpucontrol usr.sbin/lpr/common_source usr.sbin/newsyslog 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, 22 Aug 2011 23:54:13 -0000 Author: mdf Date: Mon Aug 22 23:54:12 2011 New Revision: 225097 URL: http://svn.freebsd.org/changeset/base/225097 Log: Avoid using dirfd name there is dirfd() macro already. Use dirfd() instead of dirp->dd_fd. Replace dirfd() macro with exported libc symbol. Use _dirfd() macro internally. GSoC r222835, r222836, r222837. Code by Gleb Kurtsou. Added: projects/ino64/lib/libc/gen/dirfd.c (contents, props changed) Modified: projects/ino64/include/dirent.h projects/ino64/lib/libc/gen/Makefile.inc projects/ino64/lib/libc/gen/Symbol.map projects/ino64/lib/libc/gen/dirent-private.h projects/ino64/lib/libc/gen/fts-compat.c projects/ino64/lib/libc/gen/fts.c projects/ino64/lib/libc/gen/getcwd.c projects/ino64/usr.sbin/cpucontrol/cpucontrol.c projects/ino64/usr.sbin/lpr/common_source/common.c projects/ino64/usr.sbin/newsyslog/newsyslog.c Modified: projects/ino64/include/dirent.h ============================================================================== --- projects/ino64/include/dirent.h Mon Aug 22 23:39:40 2011 (r225096) +++ projects/ino64/include/dirent.h Mon Aug 22 23:54:12 2011 (r225097) @@ -80,6 +80,7 @@ int alphasort(const struct dirent **, c DIR *__opendir2(const char *, int); int getdents(int, char *, int); int getdirentries(int, char *, int, long *); +int dirfd(DIR *); #endif DIR *opendir(const char *); DIR *fdopendir(int); Modified: projects/ino64/lib/libc/gen/Makefile.inc ============================================================================== --- projects/ino64/lib/libc/gen/Makefile.inc Mon Aug 22 23:39:40 2011 (r225096) +++ projects/ino64/lib/libc/gen/Makefile.inc Mon Aug 22 23:54:12 2011 (r225097) @@ -9,7 +9,7 @@ SRCS+= __getosreldate.c __xuname.c \ _thread_init.c \ alarm.c arc4random.c assert.c aux.c basename.c check_utility_compat.c \ clock.c closedir.c confstr.c \ - crypt.c ctermid.c daemon.c devname.c dirname.c disklabel.c \ + crypt.c ctermid.c daemon.c devname.c dirfd.c dirname.c disklabel.c \ dlfcn.c drand48.c elf_utils.c erand48.c err.c errlst.c errno.c \ exec.c fdevname.c feature_present.c fmtcheck.c fmtmsg.c fnmatch.c \ fpclassify.c frexp.c fstab.c ftok.c fts.c fts-compat.c ftw.c \ Modified: projects/ino64/lib/libc/gen/Symbol.map ============================================================================== --- projects/ino64/lib/libc/gen/Symbol.map Mon Aug 22 23:39:40 2011 (r225096) +++ projects/ino64/lib/libc/gen/Symbol.map Mon Aug 22 23:54:12 2011 (r225097) @@ -359,6 +359,7 @@ FBSD_1.1 { FBSD_1.2 { basename_r; cfmakesane; + dirfd; endutxent; getpagesizes; getutxent; Modified: projects/ino64/lib/libc/gen/dirent-private.h ============================================================================== --- projects/ino64/lib/libc/gen/dirent-private.h Mon Aug 22 23:39:40 2011 (r225096) +++ projects/ino64/lib/libc/gen/dirent-private.h Mon Aug 22 23:54:12 2011 (r225097) @@ -49,6 +49,6 @@ struct _dirdesc { struct _telldir *dd_td; /* telldir position recording */ }; -#define dirfd(dirp) ((dirp)->dd_fd) +#define _dirfd(dirp) ((dirp)->dd_fd) #endif /* !_DIRENT_PRIVATE_H_ */ Added: projects/ino64/lib/libc/gen/dirfd.c ============================================================================== --- /dev/null 00:00:00 1970 (empty, because file is newly added) +++ projects/ino64/lib/libc/gen/dirfd.c Mon Aug 22 23:54:12 2011 (r225097) @@ -0,0 +1,50 @@ +/*- + * Copyright (c) 1989, 1993 + * The Regents of the University of California. 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 University 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 REGENTS 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 REGENTS 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$ + */ + +#include +__FBSDID("$FreeBSD$"); + +#include "namespace.h" +#include + +#include +#include "un-namespace.h" + +#include "dirent-private.h" + +int +dirfd(DIR *dirp) +{ + if (dirp == NULL) + return (-1); + + return (_dirfd(dirp)); +} Modified: projects/ino64/lib/libc/gen/fts-compat.c ============================================================================== --- projects/ino64/lib/libc/gen/fts-compat.c Mon Aug 22 23:39:40 2011 (r225096) +++ projects/ino64/lib/libc/gen/fts-compat.c Mon Aug 22 23:54:12 2011 (r225097) @@ -713,7 +713,7 @@ fts_build(sp, type) */ cderrno = 0; if (nlinks || type == BREAD) { - if (fts_safe_changedir(sp, cur, dirfd(dirp), NULL)) { + if (fts_safe_changedir(sp, cur, _dirfd(dirp), NULL)) { if (nlinks && type == BREAD) cur->fts_errno = errno; cur->fts_flags |= FTS_DONTCHDIR; Modified: projects/ino64/lib/libc/gen/fts.c ============================================================================== --- projects/ino64/lib/libc/gen/fts.c Mon Aug 22 23:39:40 2011 (r225096) +++ projects/ino64/lib/libc/gen/fts.c Mon Aug 22 23:54:12 2011 (r225097) @@ -710,7 +710,7 @@ fts_build(sp, type) */ cderrno = 0; if (nlinks || type == BREAD) { - if (fts_safe_changedir(sp, cur, dirfd(dirp), NULL)) { + if (fts_safe_changedir(sp, cur, _dirfd(dirp), NULL)) { if (nlinks && type == BREAD) cur->fts_errno = errno; cur->fts_flags |= FTS_DONTCHDIR; Modified: projects/ino64/lib/libc/gen/getcwd.c ============================================================================== --- projects/ino64/lib/libc/gen/getcwd.c Mon Aug 22 23:39:40 2011 (r225096) +++ projects/ino64/lib/libc/gen/getcwd.c Mon Aug 22 23:54:12 2011 (r225097) @@ -119,7 +119,7 @@ getcwd(pt, size) for (first = 1;; first = 0) { /* Stat the current level. */ - if (dir != NULL ? _fstat(dirfd(dir), &s) : lstat(".", &s)) + if (dir != NULL ? _fstat(_dirfd(dir), &s) : lstat(".", &s)) goto err; /* Save current node values. */ @@ -141,13 +141,13 @@ getcwd(pt, size) } /* Open and stat parent directory. */ - fd = _openat(dir != NULL ? dirfd(dir) : AT_FDCWD, + fd = _openat(dir != NULL ? _dirfd(dir) : AT_FDCWD, "..", O_RDONLY); if (fd == -1) goto err; if (dir) (void) closedir(dir); - if (!(dir = fdopendir(fd)) || _fstat(dirfd(dir), &s)) { + if (!(dir = fdopendir(fd)) || _fstat(_dirfd(dir), &s)) { _close(fd); goto err; } @@ -173,7 +173,7 @@ getcwd(pt, size) continue; /* Save the first error for later. */ - if (fstatat(dirfd(dir), dp->d_name, &s, + if (fstatat(_dirfd(dir), dp->d_name, &s, AT_SYMLINK_NOFOLLOW)) { if (!save_errno) save_errno = errno; Modified: projects/ino64/usr.sbin/cpucontrol/cpucontrol.c ============================================================================== --- projects/ino64/usr.sbin/cpucontrol/cpucontrol.c Mon Aug 22 23:39:40 2011 (r225096) +++ projects/ino64/usr.sbin/cpucontrol/cpucontrol.c Mon Aug 22 23:54:12 2011 (r225097) @@ -290,7 +290,7 @@ do_update(const char *dev) int error; struct ucode_handler *handler; struct datadir *dir; - DIR *dirfd; + DIR *dirp; struct dirent *direntry; char buf[MAXPATHLEN]; @@ -319,12 +319,12 @@ do_update(const char *dev) * Process every image in specified data directories. */ SLIST_FOREACH(dir, &datadirs, next) { - dirfd = opendir(dir->path); - if (dirfd == NULL) { + dirp = opendir(dir->path); + if (dirp == NULL) { WARNX(1, "skipping directory %s: not accessible", dir->path); continue; } - while ((direntry = readdir(dirfd)) != NULL) { + while ((direntry = readdir(dirp)) != NULL) { if (direntry->d_namlen == 0) continue; error = snprintf(buf, sizeof(buf), "%s/%s", dir->path, @@ -338,7 +338,7 @@ do_update(const char *dev) } handler->update(dev, buf); } - error = closedir(dirfd); + error = closedir(dirp); if (error != 0) WARN(0, "closedir(%s)", dir->path); } Modified: projects/ino64/usr.sbin/lpr/common_source/common.c ============================================================================== --- projects/ino64/usr.sbin/lpr/common_source/common.c Mon Aug 22 23:39:40 2011 (r225096) +++ projects/ino64/usr.sbin/lpr/common_source/common.c Mon Aug 22 23:54:12 2011 (r225097) @@ -130,7 +130,7 @@ getq(const struct printer *pp, struct jo seteuid(uid); return (-1); } - if (fstat(dirp->dd_fd, &stbuf) < 0) + if (fstat(dirfd(dirp), &stbuf) < 0) goto errdone; seteuid(uid); Modified: projects/ino64/usr.sbin/newsyslog/newsyslog.c ============================================================================== --- projects/ino64/usr.sbin/newsyslog/newsyslog.c Mon Aug 22 23:39:40 2011 (r225096) +++ projects/ino64/usr.sbin/newsyslog/newsyslog.c Mon Aug 22 23:54:12 2011 (r225097) @@ -1448,7 +1448,7 @@ static void delete_oldest_timelog(const struct conf_entry *ent, const char *archive_dir) { char *logfname, *s, *dir, errbuf[80]; - int dirfd, i, logcnt, max_logcnt, valid; + int dir_fd, i, logcnt, max_logcnt, valid; struct oldlog_entry *oldlogs; size_t logfname_len; struct dirent *dp; @@ -1483,7 +1483,7 @@ delete_oldest_timelog(const struct conf_ /* First we create a 'list' of all archived logfiles */ if ((dirp = opendir(dir)) == NULL) err(1, "Cannot open log directory '%s'", dir); - dirfd = dirfd(dirp); + dir_fd = dirfd(dirp); while ((dp = readdir(dirp)) != NULL) { if (dp->d_type != DT_REG) continue; @@ -1575,7 +1575,7 @@ delete_oldest_timelog(const struct conf_ if (noaction) printf("\trm -f %s/%s\n", dir, oldlogs[i].fname); - else if (unlinkat(dirfd, oldlogs[i].fname, 0) != 0) { + else if (unlinkat(dir_fd, oldlogs[i].fname, 0) != 0) { snprintf(errbuf, sizeof(errbuf), "Could not delet old logfile '%s'", oldlogs[i].fname); From owner-svn-src-projects@FreeBSD.ORG Tue Aug 23 00:25:16 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 521ED1065673; Tue, 23 Aug 2011 00:25:16 +0000 (UTC) (envelope-from mdf@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id 3F1508FC0C; Tue, 23 Aug 2011 00:25:16 +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 p7N0PGol076838; Tue, 23 Aug 2011 00:25:16 GMT (envelope-from mdf@svn.freebsd.org) Received: (from mdf@localhost) by svn.freebsd.org (8.14.4/8.14.4/Submit) id p7N0PGFd076829; Tue, 23 Aug 2011 00:25:16 GMT (envelope-from mdf@svn.freebsd.org) Message-Id: <201108230025.p7N0PGFd076829@svn.freebsd.org> From: Matthew D Fleming Date: Tue, 23 Aug 2011 00:25:16 +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: r225099 - in projects/ino64/sys/boot: arm/at91/boot2 arm/ixp425/boot2 common i386/boot2 i386/gptboot pc98/boot2 powerpc/boot1.chrp sparc64/boot1 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, 23 Aug 2011 00:25:16 -0000 Author: mdf Date: Tue Aug 23 00:25:15 2011 New Revision: 225099 URL: http://svn.freebsd.org/changeset/base/225099 Log: boot: Use 32 bit ufs_ino_t to keep boot2 small and prevent 64-bit math on 32-bit machines. GSoC r222839. Code by Gleb Kurtsou. Modified: projects/ino64/sys/boot/arm/at91/boot2/boot2.c projects/ino64/sys/boot/arm/ixp425/boot2/boot2.c projects/ino64/sys/boot/common/ufsread.c projects/ino64/sys/boot/i386/boot2/boot2.c projects/ino64/sys/boot/i386/gptboot/gptboot.c projects/ino64/sys/boot/pc98/boot2/boot2.c projects/ino64/sys/boot/powerpc/boot1.chrp/boot1.c projects/ino64/sys/boot/sparc64/boot1/boot1.c Modified: projects/ino64/sys/boot/arm/at91/boot2/boot2.c ============================================================================== --- projects/ino64/sys/boot/arm/at91/boot2/boot2.c Tue Aug 23 00:12:24 2011 (r225098) +++ projects/ino64/sys/boot/arm/at91/boot2/boot2.c Tue Aug 23 00:25:15 2011 (r225099) @@ -93,7 +93,6 @@ static int dsk_meta; static void load(void); static int parse(void); -static int xfsread(ino_t, void *, size_t); static int dskread(void *, unsigned, unsigned); #ifdef FIXUP_BOOT_DRV static void fixup_boot_drv(caddr_t, int, int, int); @@ -109,7 +108,7 @@ static void fixup_boot_drv(caddr_t, int, #endif static inline int -xfsread(ino_t inode, void *buf, size_t nbyte) +xfsread(ufs_ino_t inode, void *buf, size_t nbyte) { if ((size_t)fsread(inode, buf, nbyte) != nbyte) return -1; @@ -152,7 +151,7 @@ int main(void) { int autoboot, c = 0; - ino_t ino; + ufs_ino_t ino; dmadat = (void *)(0x20000000 + (16 << 20)); board_init(); @@ -196,7 +195,7 @@ load(void) Elf32_Ehdr eh; static Elf32_Phdr ep[2]; caddr_t p; - ino_t ino; + ufs_ino_t ino; uint32_t addr; int i, j; #ifdef FIXUP_BOOT_DRV Modified: projects/ino64/sys/boot/arm/ixp425/boot2/boot2.c ============================================================================== --- projects/ino64/sys/boot/arm/ixp425/boot2/boot2.c Tue Aug 23 00:12:24 2011 (r225098) +++ projects/ino64/sys/boot/arm/ixp425/boot2/boot2.c Tue Aug 23 00:25:15 2011 (r225099) @@ -97,7 +97,6 @@ static int disk_layout; static void load(void); static int parse(void); -static int xfsread(ino_t, void *, size_t); static int dskread(void *, unsigned, unsigned); static int drvread(void *, unsigned, unsigned); #ifdef FIXUP_BOOT_DRV @@ -113,7 +112,7 @@ static void fixup_boot_drv(caddr_t, int, #endif static inline int -xfsread(ino_t inode, void *buf, size_t nbyte) +xfsread(ufs_ino_t inode, void *buf, size_t nbyte) { if ((size_t)fsread(inode, buf, nbyte) != nbyte) return -1; @@ -157,7 +156,7 @@ main(void) { const char *bt; int autoboot, c = 0; - ino_t ino; + ufs_ino_t ino; dmadat = (void *)(0x1c0000); p_memset((char *)dmadat, 0, 32 * 1024); @@ -205,7 +204,7 @@ load(void) Elf32_Ehdr eh; static Elf32_Phdr ep[2]; caddr_t p; - ino_t ino; + ufs_ino_t ino; uint32_t addr; int i, j; #ifdef FIXUP_BOOT_DRV Modified: projects/ino64/sys/boot/common/ufsread.c ============================================================================== --- projects/ino64/sys/boot/common/ufsread.c Tue Aug 23 00:12:24 2011 (r225098) +++ projects/ino64/sys/boot/common/ufsread.c Tue Aug 23 00:25:15 2011 (r225099) @@ -58,6 +58,8 @@ __FBSDID("$FreeBSD$"); #define cgbase(fs, c) ((ufs2_daddr_t)((fs)->fs_fpg * (c))) #endif +typedef uint32_t ufs_ino_t; + /* * We use 4k `virtual' blocks for filesystem data, whatever the actual * filesystem block size. FFS blocks are always a multiple of 4k. @@ -85,14 +87,14 @@ struct dmadat { }; static struct dmadat *dmadat; -static ino_t lookup(const char *); -static ssize_t fsread(ino_t, void *, size_t); +static ufs_ino_t lookup(const char *); +static ssize_t fsread(ufs_ino_t, void *, size_t); static uint8_t ls, dsk_meta; static uint32_t fs_off; static __inline uint8_t -fsfind(const char *name, ino_t * ino) +fsfind(const char *name, ufs_ino_t * ino) { char buf[DEV_BSIZE]; struct direct *d; @@ -116,12 +118,12 @@ fsfind(const char *name, ino_t * ino) return 0; } -static ino_t +static ufs_ino_t lookup(const char *path) { char name[MAXNAMLEN + 1]; const char *s; - ino_t ino; + ufs_ino_t ino; ssize_t n; uint8_t dt; @@ -163,7 +165,7 @@ static int sblock_try[] = SBLOCKSEARCH; #endif static ssize_t -fsread(ino_t inode, void *buf, size_t nbyte) +fsread(ufs_ino_t inode, void *buf, size_t nbyte) { #ifndef UFS2_ONLY static struct ufs1_dinode dp1; @@ -171,7 +173,7 @@ fsread(ino_t inode, void *buf, size_t nb #ifndef UFS1_ONLY static struct ufs2_dinode dp2; #endif - static ino_t inomap; + static ufs_ino_t inomap; char *blkbuf; void *indbuf; struct fs fs; Modified: projects/ino64/sys/boot/i386/boot2/boot2.c ============================================================================== --- projects/ino64/sys/boot/i386/boot2/boot2.c Tue Aug 23 00:12:24 2011 (r225098) +++ projects/ino64/sys/boot/i386/boot2/boot2.c Tue Aug 23 00:25:15 2011 (r225099) @@ -140,7 +140,6 @@ static uint8_t ioctrl = IO_KEYBOARD; void exit(int); static void load(void); static int parse(void); -static int xfsread(ino_t, void *, size_t); static int dskread(void *, unsigned, unsigned); static void printf(const char *,...); static void putchar(int); @@ -172,7 +171,7 @@ strcmp(const char *s1, const char *s2) #include "ufsread.c" static inline int -xfsread(ino_t inode, void *buf, size_t nbyte) +xfsread(ufs_ino_t inode, void *buf, size_t nbyte) { if ((size_t)fsread(inode, buf, nbyte) != nbyte) { printf("Invalid %s\n", "format"); @@ -224,7 +223,7 @@ int main(void) { uint8_t autoboot; - ino_t ino; + ufs_ino_t ino; kname = NULL; dmadat = (void *)(roundup2(__base + (int32_t)&_end, 0x10000) - __base); @@ -306,7 +305,7 @@ load(void) static Elf32_Phdr ep[2]; static Elf32_Shdr es[2]; caddr_t p; - ino_t ino; + ufs_ino_t ino; uint32_t addr; int i, j; Modified: projects/ino64/sys/boot/i386/gptboot/gptboot.c ============================================================================== --- projects/ino64/sys/boot/i386/gptboot/gptboot.c Tue Aug 23 00:12:24 2011 (r225098) +++ projects/ino64/sys/boot/i386/gptboot/gptboot.c Tue Aug 23 00:25:15 2011 (r225099) @@ -89,14 +89,13 @@ static struct bootinfo bootinfo; void exit(int); static void load(void); static int parse(char *, int *); -static int xfsread(ino_t, void *, size_t); static int dskread(void *, daddr_t, unsigned); static uint32_t memsize(void); #include "ufsread.c" static inline int -xfsread(ino_t inode, void *buf, size_t nbyte) +xfsread(ufs_ino_t inode, void *buf, size_t nbyte) { if ((size_t)fsread(inode, buf, nbyte) != nbyte) { @@ -137,7 +136,7 @@ main(void) { char cmd[512], cmdtmp[512]; int autoboot, dskupdated; - ino_t ino; + ufs_ino_t ino; dmadat = (void *)(roundup2(__base + (int32_t)&_end, 0x10000) - __base); v86.ctl = V86_FLAGS; @@ -246,7 +245,7 @@ load(void) static Elf32_Phdr ep[2]; static Elf32_Shdr es[2]; caddr_t p; - ino_t ino; + ufs_ino_t ino; uint32_t addr, x; int fmt, i, j; Modified: projects/ino64/sys/boot/pc98/boot2/boot2.c ============================================================================== --- projects/ino64/sys/boot/pc98/boot2/boot2.c Tue Aug 23 00:12:24 2011 (r225098) +++ projects/ino64/sys/boot/pc98/boot2/boot2.c Tue Aug 23 00:25:15 2011 (r225099) @@ -142,7 +142,6 @@ static uint8_t ioctrl = IO_KEYBOARD; void exit(int); static void load(void); static int parse(void); -static int xfsread(ino_t, void *, size_t); static int dskread(void *, unsigned, unsigned); static void printf(const char *,...); static void putchar(int); @@ -174,7 +173,7 @@ strcmp(const char *s1, const char *s2) #include "ufsread.c" static inline int -xfsread(ino_t inode, void *buf, size_t nbyte) +xfsread(ufs_ino_t inode, void *buf, size_t nbyte) { if ((size_t)fsread(inode, buf, nbyte) != nbyte) { printf("Invalid %s\n", "format"); @@ -353,7 +352,7 @@ main(void) int i; #endif uint8_t autoboot; - ino_t ino; + ufs_ino_t ino; dmadat = (void *)(roundup2(__base + (int32_t)&_end, 0x10000) - __base); v86.ctl = V86_FLAGS; @@ -444,7 +443,7 @@ load(void) static Elf32_Phdr ep[2]; static Elf32_Shdr es[2]; caddr_t p; - ino_t ino; + ufs_ino_t ino; uint32_t addr; int i, j; Modified: projects/ino64/sys/boot/powerpc/boot1.chrp/boot1.c ============================================================================== --- projects/ino64/sys/boot/powerpc/boot1.chrp/boot1.c Tue Aug 23 00:12:24 2011 (r225098) +++ projects/ino64/sys/boot/powerpc/boot1.chrp/boot1.c Tue Aug 23 00:25:15 2011 (r225099) @@ -45,7 +45,6 @@ static char bootargs[128]; static ofwh_t bootdev; static struct fs fs; -static ino_t inomap; static char blkbuf[BSIZEMAX]; static unsigned int fsblks; @@ -490,7 +489,7 @@ load(const char *fname) Elf32_Ehdr eh; Elf32_Phdr ph; caddr_t p; - ino_t ino; + ufs_ino_t ino; int i; if ((ino = lookup(fname)) == 0) { Modified: projects/ino64/sys/boot/sparc64/boot1/boot1.c ============================================================================== --- projects/ino64/sys/boot/sparc64/boot1/boot1.c Tue Aug 23 00:12:24 2011 (r225098) +++ projects/ino64/sys/boot/sparc64/boot1/boot1.c Tue Aug 23 00:25:15 2011 (r225099) @@ -385,7 +385,7 @@ load(const char *fname) Elf64_Ehdr eh; Elf64_Phdr ph; caddr_t p; - ino_t ino; + ufs_ino_t ino; int i; if ((ino = lookup(fname)) == 0) { From owner-svn-src-projects@FreeBSD.ORG Tue Aug 23 12:45:02 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 C2B631065673; Tue, 23 Aug 2011 12:45:02 +0000 (UTC) (envelope-from gber@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id 961F48FC0C; Tue, 23 Aug 2011 12:45:02 +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 p7NCj2Lk003009; Tue, 23 Aug 2011 12:45:02 GMT (envelope-from gber@svn.freebsd.org) Received: (from gber@localhost) by svn.freebsd.org (8.14.4/8.14.4/Submit) id p7NCj2ac003008; Tue, 23 Aug 2011 12:45:02 GMT (envelope-from gber@svn.freebsd.org) Message-Id: <201108231245.p7NCj2ac003008@svn.freebsd.org> From: Grzegorz Bernacki Date: Tue, 23 Aug 2011 12:45:02 +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: r225107 - projects/armv6 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, 23 Aug 2011 12:45:02 -0000 Author: gber Date: Tue Aug 23 12:45:02 2011 New Revision: 225107 URL: http://svn.freebsd.org/changeset/base/225107 Log: Create branch to add support for armv6 and armv7 and for SMP on arm. Approved by: cognet (mentor) Added: - copied from r225106, head/ Directory Properties: projects/armv6/ (props changed) From owner-svn-src-projects@FreeBSD.ORG Tue Aug 23 13:07:30 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 954E01065670; Tue, 23 Aug 2011 13:07:30 +0000 (UTC) (envelope-from mav@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id 851588FC18; Tue, 23 Aug 2011 13:07:30 +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 p7ND7Utl003746; Tue, 23 Aug 2011 13:07:30 GMT (envelope-from mav@svn.freebsd.org) Received: (from mav@localhost) by svn.freebsd.org (8.14.4/8.14.4/Submit) id p7ND7UBC003744; Tue, 23 Aug 2011 13:07:30 GMT (envelope-from mav@svn.freebsd.org) Message-Id: <201108231307.p7ND7UBC003744@svn.freebsd.org> From: Alexander Motin Date: Tue, 23 Aug 2011 13:07:30 +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: r225108 - projects/zfsd/head/sys/cam/scsi 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, 23 Aug 2011 13:07:30 -0000 Author: mav Date: Tue Aug 23 13:07:30 2011 New Revision: 225108 URL: http://svn.freebsd.org/changeset/base/225108 Log: Last SAF-TE spec draft defines the field to identify real number of thermostats. Use it to report real state of things. Unluckily, when it is zero, it is impossible to say whether there are no sensors or this field is not implemented. In this case report "status not available" when no error reported to not inflate expectations. Map temperature sensors status to the respective out of range flags. Modified: projects/zfsd/head/sys/cam/scsi/scsi_enc_safte.c Modified: projects/zfsd/head/sys/cam/scsi/scsi_enc_safte.c ============================================================================== --- projects/zfsd/head/sys/cam/scsi/scsi_enc_safte.c Tue Aug 23 12:45:02 2011 (r225107) +++ projects/zfsd/head/sys/cam/scsi/scsi_enc_safte.c Tue Aug 23 13:07:30 2011 (r225108) @@ -83,7 +83,6 @@ static int perf_slotop(enc_softc_t *, ui #define SAFT_SCRATCH 64 -#define NPSEUDO_THERM 16 #define NPSEUDO_ALARM 1 struct scfg { /* @@ -96,6 +95,7 @@ struct scfg { uint8_t Ntherm; /* Number of Temperature Sensors */ uint8_t Nspkrs; /* Number of Speakers */ uint8_t Nalarm; /* Number of Alarms (at least one) */ + uint8_t Ntstats; /* Number of Thermostats */ /* * Cached Flag Bytes for Global Status */ @@ -158,8 +158,6 @@ safte_getconfig(enc_softc_t *ssc) ENC_FREE(sdata); return (EIO); } - ENC_VLOG(ssc, "Nfans %d Npwr %d Nslots %d Lck %d Ntherm %d Nspkrs %d\n", - sdata[0], sdata[1], sdata[2], sdata[3], sdata[4], sdata[5]); cfg->Nfans = sdata[0]; cfg->Npwr = sdata[1]; cfg->Nslots = sdata[2]; @@ -167,6 +165,14 @@ safte_getconfig(enc_softc_t *ssc) cfg->Ntherm = sdata[4]; cfg->Nspkrs = sdata[5]; cfg->Nalarm = NPSEUDO_ALARM; + if (amt >= 7) + cfg->Ntstats = sdata[6] & 0x0f; + else + cfg->Ntstats = 0; + ENC_VLOG(ssc, "Nfans %d Npwr %d Nslots %d Lck %d Ntherm %d Nspkrs %d " + "Ntstats %d\n", + cfg->Nfans, cfg->Npwr, cfg->Nslots, cfg->DoorLock, cfg->Ntherm, + cfg->Nspkrs, cfg->Ntstats); ENC_FREE(sdata); return (0); } @@ -265,7 +271,7 @@ safte_rdstat(enc_softc_t *ssc, int slpfl * if only one fan or no thermometers, * else the NONCRITICAL error is set. */ - if (cc->Nfans == 1 || cc->Ntherm == 0) + if (cc->Nfans == 1 || (cc->Ntherm + cc->Ntstats) == 0) cache->enc_status |= SES_ENCSTAT_CRITICAL; else cache->enc_status |= SES_ENCSTAT_NONCRITICAL; @@ -433,6 +439,21 @@ safte_rdstat(enc_softc_t *ssc, int slpfl } r++; + /* + * Now, for "pseudo" thermometers, we have two bytes + * of information in enclosure status- 16 bits. Actually, + * the MSB is a single TEMP ALERT flag indicating whether + * any other bits are set, but, thanks to fuzzy thinking, + * in the SAF-TE spec, this can also be set even if no + * other bits are set, thus making this really another + * binary temperature sensor. + */ + + SAFT_BAIL(r + cc->Ntherm, hiwater, sdata); + tempflags = sdata[r + cc->Ntherm]; + SAFT_BAIL(r + cc->Ntherm + 1, hiwater, sdata); + tempflags |= (tempflags << 8) | sdata[r + cc->Ntherm + 1]; + for (i = 0; i < cc->Ntherm; i++) { SAFT_BAIL(r, hiwater, sdata); /* @@ -465,7 +486,11 @@ safte_rdstat(enc_softc_t *ssc, int slpfl * value and set SES_OBJSTAT_NOTAVAIL. We'll depend on the * temperature flags for warnings. */ - cache->elm_map[oid].encstat[0] = SES_OBJSTAT_NOTAVAIL; + if (tempflags & (1 << i)) { + cache->elm_map[oid].encstat[0] = SES_OBJSTAT_CRIT; + cache->enc_status |= SES_ENCSTAT_CRITICAL; + } else + cache->elm_map[oid].encstat[0] = SES_OBJSTAT_OK; cache->elm_map[oid].encstat[1] = 0; cache->elm_map[oid].encstat[2] = sdata[r]; cache->elm_map[oid].encstat[3] = 0; @@ -473,24 +498,10 @@ safte_rdstat(enc_softc_t *ssc, int slpfl r++; } - /* - * Now, for "pseudo" thermometers, we have two bytes - * of information in enclosure status- 16 bits. Actually, - * the MSB is a single TEMP ALERT flag indicating whether - * any other bits are set, but, thanks to fuzzy thinking, - * in the SAF-TE spec, this can also be set even if no - * other bits are set, thus making this really another - * binary temperature sensor. - */ - - SAFT_BAIL(r, hiwater, sdata); - tempflags = sdata[r++]; - SAFT_BAIL(r, hiwater, sdata); - tempflags |= (tempflags << 8) | sdata[r++]; - - for (i = 0; i < NPSEUDO_THERM; i++) { + for (i = 0; i <= cc->Ntstats; i++) { cache->elm_map[oid].encstat[1] = 0; - if (tempflags & (1 << (NPSEUDO_THERM - i - 1))) { + if (tempflags & (1 << + ((i == cc->Ntstats) ? 15 : (cc->Ntherm + i)))) { cache->elm_map[oid].encstat[0] = SES_OBJSTAT_CRIT; cache->elm_map[4].encstat[2] = 0xff; /* @@ -505,12 +516,18 @@ safte_rdstat(enc_softc_t *ssc, int slpfl * Just say 'OK', and use the reserved value of * zero. */ - cache->elm_map[oid].encstat[0] = SES_OBJSTAT_OK; + if (cc->Ntstats == 0) + cache->elm_map[oid].encstat[0] = + SES_OBJSTAT_NOTAVAIL; + else + cache->elm_map[oid].encstat[0] = + SES_OBJSTAT_OK; cache->elm_map[oid].encstat[2] = 0; cache->elm_map[oid].encstat[3] = 0; } cache->elm_map[oid++].svalid = 1; } + r += 2; /* * Get alarm status. @@ -1006,7 +1023,7 @@ safte_softc_init(enc_softc_t *ssc, int d */ cc = ssc->enc_private; ssc->enc_cache.nelms = cc->Nfans + cc->Npwr + cc->Nslots + - cc->DoorLock + cc->Ntherm + cc->Nspkrs + NPSEUDO_THERM + + cc->DoorLock + cc->Ntherm + cc->Nspkrs + cc->Ntstats + 1 + NPSEUDO_ALARM; ssc->enc_cache.elm_map = ENC_MALLOCZ(ssc->enc_cache.nelms * sizeof(enc_element_t)); @@ -1030,7 +1047,7 @@ safte_softc_init(enc_softc_t *ssc, int d ssc->enc_cache.elm_map[r++].enctype = ELMTYP_ALARM; for (i = 0; i < cc->Ntherm; i++) ssc->enc_cache.elm_map[r++].enctype = ELMTYP_THERM; - for (i = 0; i < NPSEUDO_THERM; i++) + for (i = 0; i <= cc->Ntstats; i++) ssc->enc_cache.elm_map[r++].enctype = ELMTYP_THERM; ssc->enc_cache.elm_map[r++].enctype = ELMTYP_ALARM; cc->slotoff = (uint8_t) r; From owner-svn-src-projects@FreeBSD.ORG Tue Aug 23 13:25:29 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 AA4E61065674; Tue, 23 Aug 2011 13:25:29 +0000 (UTC) (envelope-from mav@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id 9AAB98FC1F; Tue, 23 Aug 2011 13:25:29 +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 p7NDPTlM004402; Tue, 23 Aug 2011 13:25:29 GMT (envelope-from mav@svn.freebsd.org) Received: (from mav@localhost) by svn.freebsd.org (8.14.4/8.14.4/Submit) id p7NDPTCf004400; Tue, 23 Aug 2011 13:25:29 GMT (envelope-from mav@svn.freebsd.org) Message-Id: <201108231325.p7NDPTCf004400@svn.freebsd.org> From: Alexander Motin Date: Tue, 23 Aug 2011 13:25:29 +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: r225110 - projects/zfsd/head/sys/cam/scsi 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, 23 Aug 2011 13:25:29 -0000 Author: mav Date: Tue Aug 23 13:25:29 2011 New Revision: 225110 URL: http://svn.freebsd.org/changeset/base/225110 Log: Tuning r225108, trust ETA flag zero status also when there is some thermometer available. Modified: projects/zfsd/head/sys/cam/scsi/scsi_enc_safte.c Modified: projects/zfsd/head/sys/cam/scsi/scsi_enc_safte.c ============================================================================== --- projects/zfsd/head/sys/cam/scsi/scsi_enc_safte.c Tue Aug 23 13:17:09 2011 (r225109) +++ projects/zfsd/head/sys/cam/scsi/scsi_enc_safte.c Tue Aug 23 13:25:29 2011 (r225110) @@ -516,7 +516,7 @@ safte_rdstat(enc_softc_t *ssc, int slpfl * Just say 'OK', and use the reserved value of * zero. */ - if (cc->Ntstats == 0) + if ((cc->Ntherm + cc->Ntstats) == 0) cache->elm_map[oid].encstat[0] = SES_OBJSTAT_NOTAVAIL; else From owner-svn-src-projects@FreeBSD.ORG Tue Aug 23 13:36: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 403601065672; Tue, 23 Aug 2011 13:36:35 +0000 (UTC) (envelope-from mav@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id 309A38FC14; Tue, 23 Aug 2011 13:36: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 p7NDaZfh004809; Tue, 23 Aug 2011 13:36:35 GMT (envelope-from mav@svn.freebsd.org) Received: (from mav@localhost) by svn.freebsd.org (8.14.4/8.14.4/Submit) id p7NDaZYi004807; Tue, 23 Aug 2011 13:36:35 GMT (envelope-from mav@svn.freebsd.org) Message-Id: <201108231336.p7NDaZYi004807@svn.freebsd.org> From: Alexander Motin Date: Tue, 23 Aug 2011 13:36:35 +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: r225112 - projects/zfsd/head/sys/cam/scsi 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, 23 Aug 2011 13:36:35 -0000 Author: mav Date: Tue Aug 23 13:36:34 2011 New Revision: 225112 URL: http://svn.freebsd.org/changeset/base/225112 Log: Element descriptor is optional for SES devices. Respecting that, report empty string for SAF-TE devices where there is no descriptor, instead of returning confusing EINVAL error. Modified: projects/zfsd/head/sys/cam/scsi/scsi_enc.c Modified: projects/zfsd/head/sys/cam/scsi/scsi_enc.c ============================================================================== --- projects/zfsd/head/sys/cam/scsi/scsi_enc.c Tue Aug 23 13:36:09 2011 (r225111) +++ projects/zfsd/head/sys/cam/scsi/scsi_enc.c Tue Aug 23 13:36:34 2011 (r225112) @@ -475,10 +475,6 @@ enc_ioctl(struct cdev *dev, u_long cmd, break; case ENCIOC_GETELMDESC: - if (enc->enc_vec.get_elm_desc == NULL) { - error = EINVAL; - break; - } error = copyin(addr, &elmd, sizeof(elmd)); if (error) break; @@ -486,9 +482,12 @@ enc_ioctl(struct cdev *dev, u_long cmd, error = EINVAL; break; } - error = enc->enc_vec.get_elm_desc(enc, &elmd); - if (error) - break; + if (enc->enc_vec.get_elm_desc != NULL) { + error = enc->enc_vec.get_elm_desc(enc, &elmd); + if (error) + break; + } else + elmd.elm_desc_len = 0; error = copyout(&elmd, addr, sizeof(elmd)); break; From owner-svn-src-projects@FreeBSD.ORG Wed Aug 24 07:49:18 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 A2105106566B; Wed, 24 Aug 2011 07:49:18 +0000 (UTC) (envelope-from gber@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id 9109D8FC08; Wed, 24 Aug 2011 07:49:18 +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 p7O7nI64039319; Wed, 24 Aug 2011 07:49:18 GMT (envelope-from gber@svn.freebsd.org) Received: (from gber@localhost) by svn.freebsd.org (8.14.4/8.14.4/Submit) id p7O7nIVZ039310; Wed, 24 Aug 2011 07:49:18 GMT (envelope-from gber@svn.freebsd.org) Message-Id: <201108240749.p7O7nIVZ039310@svn.freebsd.org> From: Grzegorz Bernacki Date: Wed, 24 Aug 2011 07:49:18 +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: r225134 - in projects/armv6/sys: arm/arm arm/include 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, 24 Aug 2011 07:49:18 -0000 Author: gber Date: Wed Aug 24 07:49:18 2011 New Revision: 225134 URL: http://svn.freebsd.org/changeset/base/225134 Log: Initial support for armv6/v7. Obtained from: Marvell, Semihalf Added: projects/armv6/sys/arm/arm/cpufunc_asm_armv7.S projects/armv6/sys/arm/arm/cpufunc_asm_pj4b.S projects/armv6/sys/arm/arm/mp_machdep.c projects/armv6/sys/arm/arm/pmap-v6.c Modified: projects/armv6/sys/arm/arm/bus_space_asm_generic.S projects/armv6/sys/arm/arm/cpufunc.c projects/armv6/sys/arm/arm/cpufunc_asm.S projects/armv6/sys/arm/arm/elf_trampoline.c projects/armv6/sys/arm/arm/identcpu.c projects/armv6/sys/arm/arm/locore.S projects/armv6/sys/arm/arm/swtch.S projects/armv6/sys/arm/include/armreg.h projects/armv6/sys/arm/include/cpuconf.h projects/armv6/sys/arm/include/cpufunc.h projects/armv6/sys/arm/include/pmap.h projects/armv6/sys/arm/include/pte.h projects/armv6/sys/arm/include/smp.h projects/armv6/sys/conf/Makefile.arm projects/armv6/sys/conf/files.arm projects/armv6/sys/conf/options.arm Modified: projects/armv6/sys/arm/arm/bus_space_asm_generic.S ============================================================================== --- projects/armv6/sys/arm/arm/bus_space_asm_generic.S Wed Aug 24 07:28:04 2011 (r225133) +++ projects/armv6/sys/arm/arm/bus_space_asm_generic.S Wed Aug 24 07:49:18 2011 (r225134) @@ -51,7 +51,7 @@ ENTRY(generic_bs_r_1) ldrb r0, [r1, r2] RET -#if (ARM_ARCH_4 + ARM_ARCH_5) > 0 +#if (ARM_ARCH_4 + ARM_ARCH_5 + ARM_ARCH_6) > 0 ENTRY(generic_armv4_bs_r_2) ldrh r0, [r1, r2] RET @@ -69,7 +69,7 @@ ENTRY(generic_bs_w_1) strb r3, [r1, r2] RET -#if (ARM_ARCH_4 + ARM_ARCH_5) > 0 +#if (ARM_ARCH_4 + ARM_ARCH_5 + ARM_ARCH_6) > 0 ENTRY(generic_armv4_bs_w_2) strh r3, [r1, r2] RET @@ -97,7 +97,7 @@ ENTRY(generic_bs_rm_1) RET -#if (ARM_ARCH_4 + ARM_ARCH_5) > 0 +#if (ARM_ARCH_4 + ARM_ARCH_5 + ARM_ARCH_6) > 0 ENTRY(generic_armv4_bs_rm_2) add r0, r1, r2 mov r1, r3 @@ -145,7 +145,7 @@ ENTRY(generic_bs_wm_1) RET -#if (ARM_ARCH_4 + ARM_ARCH_5) > 0 +#if (ARM_ARCH_4 + ARM_ARCH_5 + ARM_ARCH_6) > 0 ENTRY(generic_armv4_bs_wm_2) add r0, r1, r2 mov r1, r3 @@ -193,7 +193,7 @@ ENTRY(generic_bs_rr_1) RET -#if (ARM_ARCH_4 + ARM_ARCH_5) > 0 +#if (ARM_ARCH_4 + ARM_ARCH_5 + ARM_ARCH_6) > 0 ENTRY(generic_armv4_bs_rr_2) add r0, r1, r2 mov r1, r3 @@ -241,7 +241,7 @@ ENTRY(generic_bs_wr_1) RET -#if (ARM_ARCH_4 + ARM_ARCH_5) > 0 +#if (ARM_ARCH_4 + ARM_ARCH_5 + ARM_ARCH_6) > 0 ENTRY(generic_armv4_bs_wr_2) add r0, r1, r2 mov r1, r3 @@ -288,7 +288,7 @@ ENTRY(generic_bs_sr_1) RET -#if (ARM_ARCH_4 + ARM_ARCH_5) > 0 +#if (ARM_ARCH_4 + ARM_ARCH_5 + ARM_ARCH_6) > 0 ENTRY(generic_armv4_bs_sr_2) add r0, r1, r2 mov r1, r3 @@ -320,7 +320,7 @@ ENTRY(generic_bs_sr_4) * copy region */ -#if (ARM_ARCH_4 + ARM_ARCH_5) > 0 +#if (ARM_ARCH_4 + ARM_ARCH_5 + ARM_ARCH_6) > 0 ENTRY(generic_armv4_bs_c_2) add r0, r1, r2 ldr r2, [sp, #0] Modified: projects/armv6/sys/arm/arm/cpufunc.c ============================================================================== --- projects/armv6/sys/arm/arm/cpufunc.c Wed Aug 24 07:28:04 2011 (r225133) +++ projects/armv6/sys/arm/arm/cpufunc.c Wed Aug 24 07:49:18 2011 (r225134) @@ -98,6 +98,10 @@ int arm_pcache_unified; int arm_dcache_align; int arm_dcache_align_mask; +u_int arm_cache_level; +u_int arm_cache_type[14]; +u_int arm_cache_loc; + /* 1 == use cpu_sleep(), 0 == don't */ int cpu_do_powersave; int ctrl; @@ -472,6 +476,126 @@ struct cpu_functions arm10_cpufuncs = { }; #endif /* CPU_ARM10 */ +#ifdef CPU_MV_PJ4B +struct cpu_functions pj4bv7_cpufuncs = { + /* CPU functions */ + + cpufunc_id, /* id */ + arm11_drain_writebuf, /* cpwait */ + + /* MMU functions */ + + cpufunc_control, /* control */ + cpufunc_domains, /* Domain */ + pj4b_setttb, /* Setttb */ + cpufunc_faultstatus, /* Faultstatus */ + cpufunc_faultaddress, /* Faultaddress */ + + /* TLB functions */ + + armv7_tlb_flushID, /* tlb_flushID */ + armv7_tlb_flushID_SE, /* tlb_flushID_SE */ + armv7_tlb_flushID, /* tlb_flushI */ + armv7_tlb_flushID_SE, /* tlb_flushI_SE */ + armv7_tlb_flushID, /* tlb_flushD */ + armv7_tlb_flushID_SE, /* tlb_flushD_SE */ + + /* Cache operations */ + armv7_idcache_wbinv_all, /* icache_sync_all */ + armv7_icache_sync_range, /* icache_sync_range */ + + armv7_dcache_wbinv_all, /* dcache_wbinv_all */ + armv7_dcache_wbinv_range, /* dcache_wbinv_range */ + armv7_dcache_inv_range, /* dcache_inv_range */ + armv7_dcache_wb_range, /* dcache_wb_range */ + + armv7_idcache_wbinv_all, /* idcache_wbinv_all */ + armv7_idcache_wbinv_range, /* idcache_wbinv_all */ + + (void *)cpufunc_nullop, /* l2cache_wbinv_all */ + (void *)cpufunc_nullop, /* l2cache_wbinv_range */ + (void *)cpufunc_nullop, /* l2cache_inv_range */ + (void *)cpufunc_nullop, /* l2cache_wb_range */ + + /* Other functions */ + + pj4b_drain_readbuf, /* flush_prefetchbuf */ + arm11_drain_writebuf, /* drain_writebuf */ + pj4b_flush_brnchtgt_all, /* flush_brnchtgt_C */ + pj4b_flush_brnchtgt_va, /* flush_brnchtgt_E */ + + pj4b_sleep, /* sleep */ + + /* Soft functions */ + + cpufunc_null_fixup, /* dataabt_fixup */ + cpufunc_null_fixup, /* prefetchabt_fixup */ + + arm11_context_switch, /* context_switch */ + + pj4bv7_setup /* cpu setup */ +}; + +struct cpu_functions pj4bv6_cpufuncs = { + /* CPU functions */ + + cpufunc_id, /* id */ + arm11_drain_writebuf, /* cpwait */ + + /* MMU functions */ + + cpufunc_control, /* control */ + cpufunc_domains, /* Domain */ + pj4b_setttb, /* Setttb */ + cpufunc_faultstatus, /* Faultstatus */ + cpufunc_faultaddress, /* Faultaddress */ + + /* TLB functions */ + + arm11_tlb_flushID, /* tlb_flushID */ + arm11_tlb_flushID_SE, /* tlb_flushID_SE */ + arm11_tlb_flushI, /* tlb_flushI */ + arm11_tlb_flushI_SE, /* tlb_flushI_SE */ + arm11_tlb_flushD, /* tlb_flushD */ + arm11_tlb_flushD_SE, /* tlb_flushD_SE */ + + /* Cache operations */ + armv6_icache_sync_all, /* icache_sync_all */ + pj4b_icache_sync_range, /* icache_sync_range */ + + armv6_dcache_wbinv_all, /* dcache_wbinv_all */ + pj4b_dcache_wbinv_range, /* dcache_wbinv_range */ + pj4b_dcache_inv_range, /* dcache_inv_range */ + pj4b_dcache_wb_range, /* dcache_wb_range */ + + armv6_idcache_wbinv_all, /* idcache_wbinv_all */ + pj4b_idcache_wbinv_range, /* idcache_wbinv_all */ + + pj4b_l2cache_wbinv_all, /* l2cache_wbinv_all */ + pj4b_l2cache_wbinv_range, /* l2cache_wbinv_range */ + pj4b_l2cache_inv_range, /* l2cache_inv_range */ + pj4b_l2cache_wb_range, /* l2cache_wb_range */ + + /* Other functions */ + + pj4b_drain_readbuf, /* flush_prefetchbuf */ + arm11_drain_writebuf, /* drain_writebuf */ + pj4b_flush_brnchtgt_all, /* flush_brnchtgt_C */ + pj4b_flush_brnchtgt_va, /* flush_brnchtgt_E */ + + pj4b_sleep, /* sleep */ + + /* Soft functions */ + + cpufunc_null_fixup, /* dataabt_fixup */ + cpufunc_null_fixup, /* prefetchabt_fixup */ + + arm11_context_switch, /* context_switch */ + + pj4bv6_setup /* cpu setup */ +}; +#endif /* CPU_MV_PJ4B */ + #ifdef CPU_SA110 struct cpu_functions sa110_cpufuncs = { /* CPU functions */ @@ -854,10 +978,10 @@ u_int cputype; u_int cpu_reset_needs_v4_MMU_disable; /* flag used in locore.s */ #if defined(CPU_ARM7TDMI) || defined(CPU_ARM8) || defined(CPU_ARM9) || \ - defined (CPU_ARM9E) || defined (CPU_ARM10) || \ + defined (CPU_ARM9E) || defined (CPU_ARM10) || defined (CPU_ARM11) || \ defined(CPU_XSCALE_80200) || defined(CPU_XSCALE_80321) || \ defined(CPU_XSCALE_PXA2X0) || defined(CPU_XSCALE_IXP425) || \ - defined(CPU_FA526) || defined(CPU_FA626TE) || \ + defined(CPU_FA526) || defined(CPU_FA626TE) || defined(CPU_MV_PJ4B) || \ defined(CPU_XSCALE_80219) || defined(CPU_XSCALE_81342) static void get_cachetype_cp15(void); @@ -871,12 +995,15 @@ static int arm_dcache_l2_linesize; static void get_cachetype_cp15() { - u_int ctype, isize, dsize; + u_int ctype, isize, dsize, cpuid; + u_int clevel, csize, i, sel; u_int multiplier; + u_char type; __asm __volatile("mrc p15, 0, %0, c0, c0, 1" : "=r" (ctype)); + cpuid = cpufunc_id(); /* * ...and thus spake the ARM ARM: * @@ -884,57 +1011,86 @@ get_cachetype_cp15() * reserved ID register is encountered, the System Control * processor returns the value of the main ID register. */ - if (ctype == cpufunc_id()) + if (ctype == cpuid) goto out; - if ((ctype & CPU_CT_S) == 0) - arm_pcache_unified = 1; + if (CPU_CT_FORMAT(ctype) == CPU_CT_ARMV7) { + __asm __volatile("mrc p15, 1, %0, c0, c0, 1" + : "=r" (clevel)); + arm_cache_level = clevel; + arm_cache_loc = CPU_CLIDR_LOC(arm_cache_level) + 1; + i = 0; + while ((type = (clevel & 0x7)) && i < 7) { + if (type == CACHE_DCACHE || type == CACHE_UNI_CACHE || + type == CACHE_SEP_CACHE) { + sel = i << 1; + __asm __volatile("mcr p15, 2, %0, c0, c0, 0" + : : "r" (sel)); + __asm __volatile("mrc p15, 1, %0, c0, c0, 0" + : "=r" (csize)); + arm_cache_type[sel] = csize; + } + if (type == CACHE_ICACHE || type == CACHE_SEP_CACHE) { + sel = (i << 1) | 1; + __asm __volatile("mcr p15, 2, %0, c0, c0, 0" + : : "r" (sel)); + __asm __volatile("mrc p15, 1, %0, c0, c0, 0" + : "=r" (csize)); + arm_cache_type[sel] = csize; + } + i++; + clevel >>= 3; + } + } else { + if ((ctype & CPU_CT_S) == 0) + arm_pcache_unified = 1; - /* - * If you want to know how this code works, go read the ARM ARM. - */ + /* + * If you want to know how this code works, go read the ARM ARM. + */ - arm_pcache_type = CPU_CT_CTYPE(ctype); + arm_pcache_type = CPU_CT_CTYPE(ctype); - if (arm_pcache_unified == 0) { - isize = CPU_CT_ISIZE(ctype); - multiplier = (isize & CPU_CT_xSIZE_M) ? 3 : 2; - arm_picache_line_size = 1U << (CPU_CT_xSIZE_LEN(isize) + 3); - if (CPU_CT_xSIZE_ASSOC(isize) == 0) { - if (isize & CPU_CT_xSIZE_M) - arm_picache_line_size = 0; /* not present */ + if (arm_pcache_unified == 0) { + isize = CPU_CT_ISIZE(ctype); + multiplier = (isize & CPU_CT_xSIZE_M) ? 3 : 2; + arm_picache_line_size = 1U << (CPU_CT_xSIZE_LEN(isize) + 3); + if (CPU_CT_xSIZE_ASSOC(isize) == 0) { + if (isize & CPU_CT_xSIZE_M) + arm_picache_line_size = 0; /* not present */ + else + arm_picache_ways = 1; + } else { + arm_picache_ways = multiplier << + (CPU_CT_xSIZE_ASSOC(isize) - 1); + } + arm_picache_size = multiplier << (CPU_CT_xSIZE_SIZE(isize) + 8); + } + + dsize = CPU_CT_DSIZE(ctype); + multiplier = (dsize & CPU_CT_xSIZE_M) ? 3 : 2; + arm_pdcache_line_size = 1U << (CPU_CT_xSIZE_LEN(dsize) + 3); + if (CPU_CT_xSIZE_ASSOC(dsize) == 0) { + if (dsize & CPU_CT_xSIZE_M) + arm_pdcache_line_size = 0; /* not present */ else - arm_picache_ways = 1; + arm_pdcache_ways = 1; } else { - arm_picache_ways = multiplier << - (CPU_CT_xSIZE_ASSOC(isize) - 1); + arm_pdcache_ways = multiplier << + (CPU_CT_xSIZE_ASSOC(dsize) - 1); } - arm_picache_size = multiplier << (CPU_CT_xSIZE_SIZE(isize) + 8); - } - - dsize = CPU_CT_DSIZE(ctype); - multiplier = (dsize & CPU_CT_xSIZE_M) ? 3 : 2; - arm_pdcache_line_size = 1U << (CPU_CT_xSIZE_LEN(dsize) + 3); - if (CPU_CT_xSIZE_ASSOC(dsize) == 0) { - if (dsize & CPU_CT_xSIZE_M) - arm_pdcache_line_size = 0; /* not present */ - else - arm_pdcache_ways = 1; - } else { - arm_pdcache_ways = multiplier << - (CPU_CT_xSIZE_ASSOC(dsize) - 1); - } - arm_pdcache_size = multiplier << (CPU_CT_xSIZE_SIZE(dsize) + 8); + arm_pdcache_size = multiplier << (CPU_CT_xSIZE_SIZE(dsize) + 8); - arm_dcache_align = arm_pdcache_line_size; + arm_dcache_align = arm_pdcache_line_size; - arm_dcache_l2_assoc = CPU_CT_xSIZE_ASSOC(dsize) + multiplier - 2; - arm_dcache_l2_linesize = CPU_CT_xSIZE_LEN(dsize) + 3; - arm_dcache_l2_nsets = 6 + CPU_CT_xSIZE_SIZE(dsize) - - CPU_CT_xSIZE_ASSOC(dsize) - CPU_CT_xSIZE_LEN(dsize); + arm_dcache_l2_assoc = CPU_CT_xSIZE_ASSOC(dsize) + multiplier - 2; + arm_dcache_l2_linesize = CPU_CT_xSIZE_LEN(dsize) + 3; + arm_dcache_l2_nsets = 6 + CPU_CT_xSIZE_SIZE(dsize) - + CPU_CT_xSIZE_ASSOC(dsize) - CPU_CT_xSIZE_LEN(dsize); - out: - arm_dcache_align_mask = arm_dcache_align - 1; + out: + arm_dcache_align_mask = arm_dcache_align - 1; + } } #endif /* ARM7TDMI || ARM8 || ARM9 || XSCALE */ @@ -1108,6 +1264,30 @@ set_cpufuncs() goto out; } #endif /* CPU_ARM10 */ +#if defined(CPU_MV_PJ4B) + if (cputype == CPU_ID_MV88SV581X_V6 || + cputype == CPU_ID_MV88SV581X_V7 || + cputype == CPU_ID_ARM_88SV581X_V6 || + cputype == CPU_ID_ARM_88SV581X_V7) { + if (cpu_pfr(0) & ARM_PFR0_THUMBEE_MASK) + cpufuncs = pj4bv7_cpufuncs; + else + cpufuncs = pj4bv6_cpufuncs; + + pj4b_config(); + get_cachetype_cp15(); + pmap_pte_init_mmu_v6(); + goto out; + } else if (cputype == CPU_ID_ARM_88SV584X || + cputype == CPU_ID_MV88SV584X) { + cpufuncs = pj4bv6_cpufuncs; + pj4b_config(); + get_cachetype_cp15(); + pmap_pte_init_mmu_v6(); + goto out; + } + +#endif /* CPU_MV_PJ4B */ #ifdef CPU_SA110 if (cputype == CPU_ID_SA110) { cpufuncs = sa110_cpufuncs; @@ -1978,6 +2158,75 @@ arm11_setup(args) } #endif /* CPU_ARM11 */ +#ifdef CPU_MV_PJ4B +void +pj4bv6_setup(char *args) +{ + int cpuctrl; + + cpuctrl = CPU_CONTROL_MMU_ENABLE | CPU_CONTROL_SYST_ENABLE + | CPU_CONTROL_IC_ENABLE | CPU_CONTROL_DC_ENABLE + | CPU_CONTROL_BPRD_ENABLE | CPU_CONTROL_V6_EXTPAGE + | CPU_CONTROL_L2_ENABLE ; + +#ifndef ARM32_DISABLE_ALIGNMENT_FAULTS + cpuctrl |= CPU_CONTROL_AFLT_ENABLE; +#endif + +#ifdef __ARMEB__ + cpuctrl |= CPU_CONTROL_BEND_ENABLE; +#endif + + if (vector_page == ARM_VECTORS_HIGH) + cpuctrl |= CPU_CONTROL_VECRELOC; + + /* Clear out the cache */ + cpu_idcache_wbinv_all(); + cpu_l2cache_wbinv_all(); + + /* Now really make sure they are clean. */ + __asm __volatile ("mcr\tp15, 0, r0, c7, c7, 0" : : ); + + /* Set the control register */ + ctrl = cpuctrl; + cpu_control(0xffffffff, cpuctrl); + + /* And again. */ + cpu_idcache_wbinv_all(); + cpu_l2cache_wbinv_all(); +} + +void +pj4bv7_setup(args) + char *args; +{ + int cpuctrl; + + cpuctrl = CPU_CONTROL_MMU_ENABLE | CPU_CONTROL_DC_ENABLE + | (0xf << 3) | CPU_CONTROL_BPRD_ENABLE + | CPU_CONTROL_IC_ENABLE | (0x5 << 16) | (1 < 22) + | CPU_CONTROL_V6_EXTPAGE; + +#ifndef ARM32_DISABLE_ALIGNMENT_FAULTS + cpuctrl |= CPU_CONTROL_AFLT_ENABLE; +#endif + if (vector_page == ARM_VECTORS_HIGH) + cpuctrl |= CPU_CONTROL_VECRELOC; + + /* Clear out the cache */ + cpu_idcache_wbinv_all(); + cpu_l2cache_wbinv_all(); + + /* Set the control register */ + ctrl = cpuctrl; + cpu_control(0xFFFFFFFF, cpuctrl); + + /* And again. */ + cpu_idcache_wbinv_all(); + cpu_l2cache_wbinv_all(); +} +#endif /* CPU_MV_PJ4B */ + #ifdef CPU_SA110 struct cpu_option sa110_options[] = { #ifdef COMPAT_12 Modified: projects/armv6/sys/arm/arm/cpufunc_asm.S ============================================================================== --- projects/armv6/sys/arm/arm/cpufunc_asm.S Wed Aug 24 07:28:04 2011 (r225133) +++ projects/armv6/sys/arm/arm/cpufunc_asm.S Wed Aug 24 07:49:18 2011 (r225134) @@ -65,6 +65,10 @@ ENTRY(cpufunc_id) mrc p15, 0, r0, c0, c0, 0 RET +ENTRY(cpufunc_cpuid) + mrc p15, 0, r0, c0, c0, 0 + RET + ENTRY(cpu_get_control) mrc p15, 0, r0, c1, c0, 0 RET Added: projects/armv6/sys/arm/arm/cpufunc_asm_armv7.S ============================================================================== --- /dev/null 00:00:00 1970 (empty, because file is newly added) +++ projects/armv6/sys/arm/arm/cpufunc_asm_armv7.S Wed Aug 24 07:49:18 2011 (r225134) @@ -0,0 +1,194 @@ +/*- + * Copyright (C) 2011 MARVELL INTERNATIONAL LTD. + * All rights reserved. + * + * Developed by Semihalf. + * + * 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 MARVELL nor the names of contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY 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 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. + */ + +#include +__FBSDID("$FreeBSD$"); + +#define isb mcr p15, 0, r0, c7, c5, 4 +#define dsb mcr p15, 0, r0, c7, c10, 4 +#define TTB (0x59) + +.Lcoherency_level: + .word _C_LABEL(arm_cache_loc) +.Lcache_type: + .word _C_LABEL(arm_cache_type) +.Lway_mask: + .word 0x3ff +.Lmax_index: + .word 0x7fff +.Lpage_mask: + .word 0xfff + +ENTRY(armv7_setttb) + bic r0, r0, #0x18 + mcr p15, 0, r0, c2, c0, 0 /* load new TTB */ + mcr p15, 0, r0, c7, c5, 4 /* ISB */ + RET + +ENTRY(armv7_tlb_flushID) + mcr p15, 0, r0, c7, c10, 4 /* DSB */ + mcr p15, 0, r0, c8, c7, 0 /* flush I+D tlb */ + mcr p15, 0, r0, c7, c5, 6 /* flush BTB */ + mcr p15, 0, r0, c7, c10, 4 /* DSB */ + mov pc, lr + +ENTRY(armv7_tlb_flushID_SE) + ldr r1, .Lpage_mask + bic r0, r0, r1 + mcr p15, 0, r0, c8, c7, 1 /* flush D tlb single entry */ + mcr p15, 0, r0, c7, c5, 6 /* flush BTB */ + mcr p15, 0, r0, c7, c10, 4 /* DSB */ + mov pc, lr + +/* Based on algorithm from ARM Architecture Reference Manual */ +ENTRY(armv7_dcache_wbinv_all) + stmdb sp!, {r4, r5, r6, r7, r8, r9} + + /* Get cache level */ + ldr r0, .Lcoherency_level + ldr r3, [r0] + cmp r3, #0 + beq Finished + /* For each cache level */ + mov r8, #0 +Loop1: + /* Get cache type for given level */ + mov r2, r8, lsl #2 + ldr r0, .Lcache_type + ldr r1, [r0, r2] + + /* Get line size */ + and r2, r1, #7 + add r2, r2, #4 + + /* Get number of ways */ + ldr r4, .Lway_mask + ands r4, r4, r1, lsr #3 + clz r5, r4 + + /* Get max index */ + ldr r7, .Lmax_index + ands r7, r7, r1, lsr #13 +Loop2: + mov r9, r4 +Loop3: + mov r6, r8, lsl #1 + orr r6, r6, r9, lsl r5 + orr r6, r6, r7, lsl r2 + + /* Clean and invalidate data cache by way/index */ + mcr p15, 0, r6, c7, c14, 2 + subs r9, r9, #1 + bge Loop3 + subs r7, r7, #1 + bge Loop2 +Skip: + add r8, r8, #1 + cmp r3, r8 + bne Loop1 +Finished: + mcr p15, 0, r0, c7, c5, 4 + mcr p15, 0, r0, c7, c5, 5 + ldmia sp!, {r4, r5, r6, r7, r8, r9} +RET + +ENTRY(armv7_idcache_wbinv_all) + stmdb sp!, {lr} + bl armv7_dcache_wbinv_all + mcr p15, 0, r0, c7, c5, 0 /* Invalidate I cache SE with VA */ + mcr p15, 0, r0, c7, c10, 4 + mcr p15, 0, r0, c7, c5, 4 + ldmia sp!, {lr} +RET + +/* XXX Temporary set it to 32 for MV cores, however this value should be + * get from Cache Type register + */ +.Larmv7_line_size: + .word 32 + +ENTRY(armv7_dcache_wb_range) + ldr ip, .Larmv7_line_size +.Larmv7_wb_next: + mcr p15, 0, r0, c7, c10, 1 /* Clean D cache SE with VA */ + add r0, r0, ip + subs r1, r1, ip + bhi .Larmv7_wb_next + mcr p15, 0, r0, c7, c10, 4 /* drain the write buffer */ + bx lr + + +ENTRY(armv7_dcache_wbinv_range) + ldr ip, .Larmv7_line_size +.Larmv7_wbinv_next: + mcr p15, 0, r0, c7, c14, 1 /* Purge D cache SE with VA */ + add r0, r0, ip + subs r1, r1, ip + bhi .Larmv7_wbinv_next + mcr p15, 0, r0, c7, c10, 4 /* drain the write buffer */ + bx lr + +/* + * Note, we must not invalidate everything. If the range is too big we + * must use wb-inv of the entire cache. + */ +ENTRY(armv7_dcache_inv_range) + ldr ip, .Larmv7_line_size +.Larmv7_inv_next: + mcr p15, 0, r0, c7, c6, 1 /* Invalidate D cache SE with VA */ + add r0, r0, ip + subs r1, r1, ip + bhi .Larmv7_inv_next + mcr p15, 0, r0, c7, c10, 4 /* drain the write buffer */ + bx lr + +ENTRY(armv7_idcache_wbinv_range) + ldr ip, .Larmv7_line_size +.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 */ + add r0, r0, ip + subs r1, r1, ip + bhi .Larmv7_id_wbinv_next + mcr p15, 0, r0, c7, c10, 4 /* drain the write buffer */ + bx lr + +ENTRY_NP(armv7_icache_sync_range) + ldr ip, .Larmv7_line_size +.Larmv7_sync_next: + mcr p15, 0, r0, c7, c5, 1 /* Invalidate I cache SE with VA */ + mcr p15, 0, r0, c7, c10, 1 /* Clean D cache SE with VA */ + add r0, r0, ip + subs r1, r1, ip + bhi .Larmv7_sync_next + mcr p15, 0, r0, c7, c10, 4 /* drain the write buffer */ + bx lr + Added: projects/armv6/sys/arm/arm/cpufunc_asm_pj4b.S ============================================================================== --- /dev/null 00:00:00 1970 (empty, because file is newly added) +++ projects/armv6/sys/arm/arm/cpufunc_asm_pj4b.S Wed Aug 24 07:49:18 2011 (r225134) @@ -0,0 +1,190 @@ +/*- + * Copyright (C) 2011 MARVELL INTERNATIONAL LTD. + * All rights reserved. + * + * Developed by Semihalf. + * + * 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 MARVELL nor the names of contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY 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 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. + */ + +#include +__FBSDID("$FreeBSD$"); + +#include + +.Lpj4b_cache_line_size: + .word _C_LABEL(arm_pdcache_line_size) + +ENTRY(pj4b_setttb) + /* Cache synchronization is not required as this core has PIPT caches */ + mcr p15, 0, r1, c7, c10, 4 /* drain the write buffer */ + mcr p15, 0, r0, c2, c0, 0 /* load new TTB */ + mcr p15, 0, r0, c8, c7, 0 /* invalidate I+D TLBs */ + RET + +ENTRY_NP(armv6_icache_sync_all) + /* + * We assume that the code here can never be out of sync with the + * dcache, so that we can safely flush the Icache and fall through + * into the Dcache cleaning code. + */ + mov r0, #0 + mcr p15, 0, r0, c7, c5, 0 /* Invalidate ICache */ + mcr p15, 0, r0, c7, c10, 0 /* Clean (don't invalidate) DCache */ + mcr p15, 0, r0, c7, c10, 4 /* drain the write buffer */ + RET + +ENTRY(pj4b_icache_sync_range) + sub r1, r1, #1 + add r1, r0, r1 + mcrr p15, 0, r1, r0, c5 /* invalidate IC range */ + mcrr p15, 0, r1, r0, c12 /* clean DC range */ + mcr p15, 0, r0, c7, c10, 4 /* drain the write buffer */ + RET + +ENTRY(pj4b_dcache_inv_range) + sub r1, r1, #1 + add r1, r0, r1 + mcrr p15, 0, r1, r0, c6 /* invalidate DC range */ + mcr p15, 0, r0, c7, c10, 4 /* drain the write buffer */ + RET + +ENTRY(pj4b_dcache_wb_range) + sub r1, r1, #1 + add r1, r0, r1 + mcrr p15, 0, r1, r0, c12 /* clean DC range */ + mcr p15, 0, r0, c7, c10, 4 /* drain the write buffer */ + RET + +ENTRY(pj4b_dcache_wbinv_range) + sub r1, r1, #1 + add r1, r0, r1 + mcrr p15, 0, r1, r0, c14 /* clean and invalidate DC range */ + mcr p15, 0, r0, c7, c10, 4 /* drain the write buffer */ + RET + +ENTRY(armv6_idcache_wbinv_all) + mov r0, #0 + mcr p15, 0, r0, c7, c5, 0 /* invalidate ICache */ + mcr p15, 0, r0, c7, c14, 0 /* clean and invalidate DCache */ + mcr p15, 0, r0, c7, c10, 4 /* drain the write buffer */ + RET + +ENTRY(armv6_dcache_wbinv_all) + mov r0, #0 + mcr p15, 0, r0, c7, c14, 0 /* clean and invalidate DCache */ + mcr p15, 0, r0, c7, c10, 4 /* drain the write buffer */ + RET + +ENTRY(pj4b_idcache_wbinv_range) + sub r1, r1, #1 + add r1, r0, r1 + mcrr p15, 0, r1, r0, c5 /* invalidate IC range */ + mcrr p15, 0, r1, r0, c14 /* clean and invalidate DC range */ + mcr p15, 0, r0, c7, c10, 4 /* drain the write buffer */ + RET + +ENTRY(pj4b_l2cache_wbinv_all) + mcr p15, 1, r0, c7, c11, 0 /* L2C clean all */ + mcr p15, 1, r0, c7, c7, 0 /* L2C invalidate all */ + mcr p15, 0, r0, c7, c10, 4 /* drain the write buffer */ + RET + +ENTRY(pj4b_l2cache_wbinv_range) + ldr ip, .Lpj4b_cache_line_size + ldr ip, [ip] + sub r1, r1, #1 /* Don't overrun */ + sub r3, ip, #1 + and r2, r0, r3 + add r1, r1, r2 + bic r0, r0, r3 +1: + mcr p15, 1, r0, c7, c15, 1 /* L2C clean and invalidate entry */ + add r0, r0, ip + subs r1, r1, ip + bpl 1b + mcr p15, 0, r0, c7, c10, 4 /* drain the write buffer */ + RET + +ENTRY(pj4b_l2cache_wb_range) + ldr ip, .Lpj4b_cache_line_size + ldr ip, [ip] + sub r1, r1, #1 /* Don't overrun */ + sub r3, ip, #1 + and r2, r0, r3 + add r1, r1, r2 + bic r0, r0, r3 +1: + mcr p15, 1, r0, c7, c11, 1 /* L2C clean single entry by MVA */ + add r0, r0, ip + subs r1, r1, ip + bpl 1b + mcr p15, 0, r0, c7, c10, 4 /* drain the write buffer */ + RET + +ENTRY(pj4b_l2cache_inv_range) + ldr ip, .Lpj4b_cache_line_size + ldr ip, [ip] + sub r1, r1, #1 /* Don't overrun */ + sub r3, ip, #1 + and r2, r0, r3 + add r1, r1, r2 + bic r0, r0, r3 +1: + mcr p15, 1, r0, c7, c7, 1 /* L2C invalidate single entry by MVA */ + add r0, r0, ip + subs r1, r1, ip + bpl 1b + mcr p15, 0, r0, c7, c10, 4 /* drain the write buffer */ + RET + +ENTRY(pj4b_drain_readbuf) + mcr p15, 0, r0, c7, c5, 4 /* flush prefetch buffers */ + RET + +ENTRY(pj4b_flush_brnchtgt_all) + mcr p15, 0, r0, c7, c5, 6 /* flush entrie branch target cache */ + RET + +ENTRY(pj4b_flush_brnchtgt_va) + mcr p15, 0, r0, c7, c5, 7 /* flush branch target cache by VA */ + RET + +ENTRY(pj4b_sleep) + mcr p15, 0, r0, c7, c10, 4 /* drain the write buffer */ + mcr p15, 0, r0, c7, c0, 4 /* wait for interrupt */ + RET + +ENTRY(pj4b_config) + /* Set Auxiliary Debug Modes Control 2 register */ + mrc p15, 1, r0, c15, c1, 2 + bic r0, r0, #(1 << 23) + orr r0, r0, #(1 << 25) + orr r0, r0, #(1 << 27) + orr r0, r0, #(1 << 29) + orr r0, r0, #(1 << 30) + mcr p15, 1, r0, c15, c1, 2 + + RET Modified: projects/armv6/sys/arm/arm/elf_trampoline.c ============================================================================== --- projects/armv6/sys/arm/arm/elf_trampoline.c Wed Aug 24 07:28:04 2011 (r225133) +++ projects/armv6/sys/arm/arm/elf_trampoline.c Wed Aug 24 07:49:18 2011 (r225134) @@ -72,7 +72,13 @@ void __startC(void); #define cpu_idcache_wbinv_all xscale_cache_purgeID #elif defined(CPU_XSCALE_81342) #define cpu_idcache_wbinv_all xscalec3_cache_purgeID +#elif defined(CPU_MV_PJ4B) +#if !defined(SOC_MV_ARMADAXP) +#define cpu_idcache_wbinv_all armv6_idcache_wbinv_all +#else +#define cpu_idcache_wbinv_all() armadaxp_idcache_wbinv_all #endif +#endif /* CPU_MV_PJ4B */ #ifdef CPU_XSCALE_81342 #define cpu_l2cache_wbinv_all xscalec3_l2cache_purge #elif defined(SOC_MV_KIRKWOOD) || defined(SOC_MV_DISCOVERY) @@ -81,6 +87,7 @@ void __startC(void); #define cpu_l2cache_wbinv_all() #endif +static void armadaxp_idcache_wbinv_all(void); int arm_picache_size; int arm_picache_line_size; @@ -306,7 +313,18 @@ arm9_setup(void) arm9_dcache_index_max = 0U - arm9_dcache_index_inc; } +static void +armadaxp_idcache_wbinv_all(void) +{ + uint32_t feat; + __asm __volatile("mrc p15, 0, %0, c0, c1, 0" : "=r" (feat)); + if (feat & ARM_PFR0_THUMBEE_MASK) + armv7_idcache_wbinv_all(); + else + armv6_idcache_wbinv_all(); + +} #ifdef KZIP static unsigned char *orig_input, *i_input, *i_output; Modified: projects/armv6/sys/arm/arm/identcpu.c ============================================================================== --- projects/armv6/sys/arm/arm/identcpu.c Wed Aug 24 07:28:04 2011 (r225133) +++ projects/armv6/sys/arm/arm/identcpu.c Wed Aug 24 07:49:18 2011 (r225134) @@ -301,8 +301,17 @@ const struct cpuidtab cpuids[] = { { CPU_ID_MV88FR571_VD, CPU_CLASS_MARVELL, "Feroceon 88FR571-VD", generic_steppings }, - - { CPU_ID_MV88FR571_41, CPU_CLASS_MARVELL, "Early Feroceon 88FR571", + { CPU_ID_MV88SV581X_V6, CPU_CLASS_MARVELL, "Sheeva 88SV581x", + generic_steppings }, + { CPU_ID_ARM_88SV581X_V6, CPU_CLASS_MARVELL, "Sheeva 88SV581x", + generic_steppings }, + { CPU_ID_MV88SV581X_V7, CPU_CLASS_MARVELL, "Sheeva 88SV581x", + generic_steppings }, + { CPU_ID_ARM_88SV581X_V7, CPU_CLASS_MARVELL, "Sheeva 88SV581x", + generic_steppings }, + { CPU_ID_MV88SV584X, CPU_CLASS_MARVELL, "Sheeva 88SV584x", + generic_steppings }, + { CPU_ID_ARM_88SV584X, CPU_CLASS_MARVELL, "Sheeva 88SV584x", generic_steppings }, { 0, CPU_CLASS_NONE, NULL, NULL } @@ -358,13 +367,81 @@ static const char * const wtnames[] = { "**unknown 15**", }; +static void +print_enadis(int enadis, char *s) +{ + + printf(" %s %sabled", s, (enadis == 0) ? "dis" : "en"); +} extern int ctrl; enum cpu_class cpu_class = CPU_CLASS_NONE; + +u_int cpu_pfr(int num) +{ + u_int feat; + + switch (num) { + case 0: + __asm __volatile("mrc p15, 0, %0, c0, c1, 0" + : "=r" (feat)); + break; + case 1: + __asm __volatile("mrc p15, 0, %0, c0, c1, 1" + : "=r" (feat)); + break; + default: + panic("Processor Feature Register %d not implemented", num); + break; + } + + return (feat); +} + +static +void identify_armv7(void) +{ + u_int feature; + + printf("Supported features:"); + /* Get Processor Feature Register 0 */ + feature = cpu_pfr(0); + + if (feature & ARM_PFR0_ARM_ISA_MASK) + printf(" ARM_ISA"); + + if (feature & ARM_PFR0_THUMB2) + printf(" THUMB2"); + else if (feature & ARM_PFR0_THUMB) + printf(" THUMB"); + + if (feature & ARM_PFR0_JAZELLE_MASK) + printf(" JAZELLE"); *** DIFF OUTPUT TRUNCATED AT 1000 LINES *** From owner-svn-src-projects@FreeBSD.ORG Wed Aug 24 07:52: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 6ACF4106564A; Wed, 24 Aug 2011 07:52:55 +0000 (UTC) (envelope-from gber@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id 59AB08FC0A; Wed, 24 Aug 2011 07:52: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 p7O7qtfc039461; Wed, 24 Aug 2011 07:52:55 GMT (envelope-from gber@svn.freebsd.org) Received: (from gber@localhost) by svn.freebsd.org (8.14.4/8.14.4/Submit) id p7O7qt1E039460; Wed, 24 Aug 2011 07:52:55 GMT (envelope-from gber@svn.freebsd.org) Message-Id: <201108240752.p7O7qt1E039460@svn.freebsd.org> From: Grzegorz Bernacki Date: Wed, 24 Aug 2011 07:52: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: r225135 - 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, 24 Aug 2011 07:52:55 -0000 Author: gber Date: Wed Aug 24 07:52:55 2011 New Revision: 225135 URL: http://svn.freebsd.org/changeset/base/225135 Log: Created new implementation of busdma for armv6. Submitted by: Mark Tinguely Added: projects/armv6/sys/arm/arm/busdma_machdep-v6.c Added: projects/armv6/sys/arm/arm/busdma_machdep-v6.c ============================================================================== --- /dev/null 00:00:00 1970 (empty, because file is newly added) +++ projects/armv6/sys/arm/arm/busdma_machdep-v6.c Wed Aug 24 07:52:55 2011 (r225135) @@ -0,0 +1,1502 @@ +/*- + * Copyright (c) 2010 Mark Tinguely + * Copyright (c) 2004 Olivier Houchard + * Copyright (c) 2002 Peter Grehan + * Copyright (c) 1997, 1998 Justin T. Gibbs. + * 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, + * without modification, immediately at the beginning of the file. + * 2. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * 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. + * + * From i386/busdma_machdep.c 191438 2009-04-23 20:24:19Z jhb + */ + +#include +__FBSDID("$FreeBSD: head/sys/arm/arm/v7_busdma_machdep.c 191438 2010-02-01 12:00:00Z jhb $"); + +#define _ARM32_BUS_DMA_PRIVATE +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include + +#include +#include +#include +#include + +#define MAX_BPAGES 64 +#define BUS_DMA_COULD_BOUNCE BUS_DMA_BUS3 +#define BUS_DMA_MIN_ALLOC_COMP BUS_DMA_BUS4 + +#define FIX_DMAP_BUS_DMASYNC_POSTREAD + +struct bounce_zone; + +struct bus_dma_tag { + bus_dma_tag_t parent; + bus_size_t alignment; + bus_size_t boundary; + bus_addr_t lowaddr; + bus_addr_t highaddr; + bus_dma_filter_t *filter; + void *filterarg; + bus_size_t maxsize; + u_int nsegments; + bus_size_t maxsegsz; + int flags; + int ref_count; + int map_count; + bus_dma_lock_t *lockfunc; + void *lockfuncarg; + bus_dma_segment_t *segments; + struct bounce_zone *bounce_zone; + /* + * DMA range for this tag. If the page doesn't fall within + * one of these ranges, an error is returned. The caller + * may then decide what to do with the transfer. If the + * range pointer is NULL, it is ignored. + */ + struct arm32_dma_range *ranges; + int _nranges; + +}; + +struct bounce_page { + vm_offset_t vaddr; /* kva of bounce buffer */ + bus_addr_t busaddr; /* Physical address */ + vm_offset_t datavaddr; /* kva of client data */ + bus_size_t datacount; /* client data count */ + STAILQ_ENTRY(bounce_page) links; +}; + +struct sync_list { + vm_offset_t vaddr; /* kva of bounce buffer */ + bus_size_t datacount; /* client data count */ + STAILQ_ENTRY(sync_list) slinks; +}; + +int busdma_swi_pending; + +struct bounce_zone { + STAILQ_ENTRY(bounce_zone) links; + STAILQ_HEAD(bp_list, bounce_page) bounce_page_list; + int total_bpages; + int free_bpages; + int reserved_bpages; + int active_bpages; + int total_bounced; + int total_deferred; + int map_count; + bus_size_t alignment; + bus_addr_t lowaddr; + char zoneid[8]; + char lowaddrid[20]; + struct sysctl_ctx_list sysctl_tree; + struct sysctl_oid *sysctl_tree_top; +}; + +static struct mtx bounce_lock; +static int total_bpages; +static int busdma_zonecount; +static STAILQ_HEAD(, bounce_zone) bounce_zone_list; + +SYSCTL_NODE(_hw, OID_AUTO, busdma, CTLFLAG_RD, 0, "Busdma parameters"); +SYSCTL_INT(_hw_busdma, OID_AUTO, total_bpages, CTLFLAG_RD, &total_bpages, 0, + "Total bounce pages"); + +struct bus_dmamap { + struct bp_list bpages; + int pagesneeded; + int pagesreserved; + bus_dma_tag_t dmat; + void *buf; /* unmapped buffer pointer */ + bus_size_t buflen; /* unmapped buffer length */ + pmap_t pmap; + bus_dmamap_callback_t *callback; + void *callback_arg; + STAILQ_ENTRY(bus_dmamap) links; + STAILQ_HEAD(,sync_list) slist; +}; + +static STAILQ_HEAD(, bus_dmamap) bounce_map_waitinglist; +static STAILQ_HEAD(, bus_dmamap) bounce_map_callbacklist; + +static void init_bounce_pages(void *dummy); +static int alloc_bounce_zone(bus_dma_tag_t dmat); +static int alloc_bounce_pages(bus_dma_tag_t dmat, u_int numpages); +static int reserve_bounce_pages(bus_dma_tag_t dmat, bus_dmamap_t map, + int commit); +static bus_addr_t add_bounce_page(bus_dma_tag_t dmat, bus_dmamap_t map, + vm_offset_t vaddr, bus_size_t size); +static void free_bounce_page(bus_dma_tag_t dmat, struct bounce_page *bpage); +int run_filter(bus_dma_tag_t dmat, bus_addr_t paddr); +static int _bus_dmamap_count_pages(bus_dma_tag_t dmat, bus_dmamap_t map, + void *buf, bus_size_t buflen, int flags); + +static __inline int +_bus_dma_can_bounce(vm_offset_t lowaddr, vm_offset_t highaddr) +{ + int i; + for (i = 0; phys_avail[i] && phys_avail[i + 1]; i += 2) { + if ((lowaddr >= phys_avail[i] && lowaddr <= phys_avail[i + 1]) + || (lowaddr < phys_avail[i] && + highaddr > phys_avail[i])) + return (1); + } + return (0); +} + +static __inline struct arm32_dma_range * +_bus_dma_inrange(struct arm32_dma_range *ranges, int nranges, + bus_addr_t curaddr) +{ + struct arm32_dma_range *dr; + int i; + + for (i = 0, dr = ranges; i < nranges; i++, dr++) { + if (curaddr >= dr->dr_sysbase && + round_page(curaddr) <= (dr->dr_sysbase + dr->dr_len)) + return (dr); + } + + return (NULL); +} + +/* + * Return true if a match is made. + * + * To find a match walk the chain of bus_dma_tag_t's looking for 'paddr'. + * + * If paddr is within the bounds of the dma tag then call the filter callback + * to check for a match, if there is no filter callback then assume a match. + */ +int +run_filter(bus_dma_tag_t dmat, bus_addr_t paddr) +{ + int retval; + + retval = 0; + + do { + if (((paddr > dmat->lowaddr && paddr <= dmat->highaddr) + || ((paddr & (dmat->alignment - 1)) != 0)) + && (dmat->filter == NULL + || (*dmat->filter)(dmat->filterarg, paddr) != 0)) + retval = 1; + + dmat = dmat->parent; + } while (retval == 0 && dmat != NULL); + return (retval); +} + +/* + * Convenience function for manipulating driver locks from busdma (during + * busdma_swi, for example). Drivers that don't provide their own locks + * should specify &Giant to dmat->lockfuncarg. Drivers that use their own + * non-mutex locking scheme don't have to use this at all. + */ +void +busdma_lock_mutex(void *arg, bus_dma_lock_op_t op) +{ + struct mtx *dmtx; + + dmtx = (struct mtx *)arg; + switch (op) { + case BUS_DMA_LOCK: + mtx_lock(dmtx); + break; + case BUS_DMA_UNLOCK: + mtx_unlock(dmtx); + break; + default: + panic("Unknown operation 0x%x for busdma_lock_mutex!", op); + } +} + +/* + * dflt_lock should never get called. It gets put into the dma tag when + * lockfunc == NULL, which is only valid if the maps that are associated + * with the tag are meant to never be defered. + * XXX Should have a way to identify which driver is responsible here. + */ +static void +dflt_lock(void *arg, bus_dma_lock_op_t op) +{ + panic("driver error: busdma dflt_lock called"); +} + +/* + * Allocate a device specific dma_tag. + */ +int +bus_dma_tag_create(bus_dma_tag_t parent, bus_size_t alignment, + bus_size_t boundary, bus_addr_t lowaddr, + bus_addr_t highaddr, bus_dma_filter_t *filter, + void *filterarg, bus_size_t maxsize, int nsegments, + bus_size_t maxsegsz, int flags, bus_dma_lock_t *lockfunc, + void *lockfuncarg, bus_dma_tag_t *dmat) +{ + bus_dma_tag_t newtag; + int error = 0; + +#if 0 + if (!parent) + parent = arm_root_dma_tag; +#endif + + /* Basic sanity checking */ + if (boundary != 0 && boundary < maxsegsz) + maxsegsz = boundary; + + /* Return a NULL tag on failure */ + *dmat = NULL; + + if (maxsegsz == 0) { + return (EINVAL); + } + + newtag = (bus_dma_tag_t)malloc(sizeof(*newtag), M_DEVBUF, + M_ZERO | M_NOWAIT); + if (newtag == NULL) { + CTR4(KTR_BUSDMA, "%s returned tag %p tag flags 0x%x error %d", + __func__, newtag, 0, error); + return (ENOMEM); + } + + newtag->parent = parent; + newtag->alignment = alignment; + newtag->boundary = boundary; + newtag->lowaddr = trunc_page((vm_paddr_t)lowaddr) + (PAGE_SIZE - 1); + newtag->highaddr = trunc_page((vm_paddr_t)highaddr) + + (PAGE_SIZE - 1); + newtag->filter = filter; + newtag->filterarg = filterarg; + newtag->maxsize = maxsize; + newtag->nsegments = nsegments; + newtag->maxsegsz = maxsegsz; + newtag->flags = flags; + newtag->ref_count = 1; /* Count ourself */ + newtag->map_count = 0; + newtag->ranges = bus_dma_get_range(); + newtag->_nranges = bus_dma_get_range_nb(); + if (lockfunc != NULL) { + newtag->lockfunc = lockfunc; + newtag->lockfuncarg = lockfuncarg; + } else { + newtag->lockfunc = dflt_lock; + newtag->lockfuncarg = NULL; + } + newtag->segments = NULL; + + /* Take into account any restrictions imposed by our parent tag */ + if (parent != NULL) { + newtag->lowaddr = MIN(parent->lowaddr, newtag->lowaddr); + newtag->highaddr = MAX(parent->highaddr, newtag->highaddr); + if (newtag->boundary == 0) + newtag->boundary = parent->boundary; + else if (parent->boundary != 0) + newtag->boundary = MIN(parent->boundary, + newtag->boundary); + if ((newtag->filter != NULL) || + ((parent->flags & BUS_DMA_COULD_BOUNCE) != 0)) + newtag->flags |= BUS_DMA_COULD_BOUNCE; + if (newtag->filter == NULL) { + /* + * Short circuit looking at our parent directly + * since we have encapsulated all of its information + */ + newtag->filter = parent->filter; + newtag->filterarg = parent->filterarg; + newtag->parent = parent->parent; + } + if (newtag->parent != NULL) + atomic_add_int(&parent->ref_count, 1); + } + + if (_bus_dma_can_bounce(newtag->lowaddr, newtag->highaddr) + || newtag->alignment > 1) + newtag->flags |= BUS_DMA_COULD_BOUNCE; + + if (((newtag->flags & BUS_DMA_COULD_BOUNCE) != 0) && + (flags & BUS_DMA_ALLOCNOW) != 0) { + struct bounce_zone *bz; + + /* Must bounce */ + + if ((error = alloc_bounce_zone(newtag)) != 0) { + free(newtag, M_DEVBUF); + return (error); + } + bz = newtag->bounce_zone; + + if (ptoa(bz->total_bpages) < maxsize) { + int pages; + + pages = atop(maxsize) - bz->total_bpages; + + /* Add pages to our bounce pool */ + if (alloc_bounce_pages(newtag, pages) < pages) + error = ENOMEM; + } + /* Performed initial allocation */ + newtag->flags |= BUS_DMA_MIN_ALLOC_COMP; + } else + newtag->bounce_zone = NULL; + + if (error != 0) { + free(newtag, M_DEVBUF); + } else { + *dmat = newtag; + } + CTR4(KTR_BUSDMA, "%s returned tag %p tag flags 0x%x error %d", + __func__, newtag, (newtag != NULL ? newtag->flags : 0), error); + return (error); +} + +int +bus_dma_tag_destroy(bus_dma_tag_t dmat) +{ + bus_dma_tag_t dmat_copy; + int error; + + error = 0; + dmat_copy = dmat; + + if (dmat != NULL) { + + if (dmat->map_count != 0) { + error = EBUSY; + goto out; + } + + while (dmat != NULL) { + bus_dma_tag_t parent; + + parent = dmat->parent; + atomic_subtract_int(&dmat->ref_count, 1); + if (dmat->ref_count == 0) { + if (dmat->segments != NULL) + free(dmat->segments, M_DEVBUF); + free(dmat, M_DEVBUF); + /* + * Last reference count, so + * release our reference + * count on our parent. + */ + dmat = parent; + } else + dmat = NULL; + } + } +out: + CTR3(KTR_BUSDMA, "%s tag %p error %d", __func__, dmat_copy, error); + return (error); +} + +/* + * Allocate a handle for mapping from kva/uva/physical + * address space into bus device space. + */ +int +bus_dmamap_create(bus_dma_tag_t dmat, int flags, bus_dmamap_t *mapp) +{ + int error; + + error = 0; + + *mapp = (bus_dmamap_t)malloc(sizeof(**mapp), M_DEVBUF, + M_NOWAIT | M_ZERO); + if (*mapp == NULL) { + CTR3(KTR_BUSDMA, "%s: tag %p error %d", __func__, dmat, ENOMEM); + return (ENOMEM); + } + STAILQ_INIT(&((*mapp)->slist)); + + if (dmat->segments == NULL) { + dmat->segments = (bus_dma_segment_t *)malloc( + sizeof(bus_dma_segment_t) * dmat->nsegments, M_DEVBUF, + M_NOWAIT); + if (dmat->segments == NULL) { + CTR3(KTR_BUSDMA, "%s: tag %p error %d", + __func__, dmat, ENOMEM); + free(*mapp, M_DEVBUF); + *mapp = NULL; + return (ENOMEM); + } + } + /* + * Bouncing might be required if the driver asks for an active + * exclusion region, a data alignment that is stricter than 1, and/or + * an active address boundary. + */ + if (dmat->flags & BUS_DMA_COULD_BOUNCE) { + + /* Must bounce */ + struct bounce_zone *bz; + int maxpages; + + if (dmat->bounce_zone == NULL) { + if ((error = alloc_bounce_zone(dmat)) != 0) { + free(*mapp, M_DEVBUF); + *mapp = NULL; + return (error); + } + } + bz = dmat->bounce_zone; + + /* Initialize the new map */ + STAILQ_INIT(&((*mapp)->bpages)); + + /* + * Attempt to add pages to our pool on a per-instance + * basis up to a sane limit. + */ + maxpages = MAX_BPAGES; + if ((dmat->flags & BUS_DMA_MIN_ALLOC_COMP) == 0 + || (bz->map_count > 0 && bz->total_bpages < maxpages)) { + int pages; + + pages = MAX(atop(dmat->maxsize), 1); + pages = MIN(maxpages - bz->total_bpages, pages); + pages = MAX(pages, 1); + if (alloc_bounce_pages(dmat, pages) < pages) + error = ENOMEM; + + if ((dmat->flags & BUS_DMA_MIN_ALLOC_COMP) == 0) { + if (error == 0) + dmat->flags |= BUS_DMA_MIN_ALLOC_COMP; + } else { + error = 0; + } + } + bz->map_count++; + } + if (error == 0) + dmat->map_count++; + CTR4(KTR_BUSDMA, "%s: tag %p tag flags 0x%x error %d", + __func__, dmat, dmat->flags, error); + return (error); +} + +/* + * Destroy a handle for mapping from kva/uva/physical + * address space into bus device space. + */ +int +bus_dmamap_destroy(bus_dma_tag_t dmat, bus_dmamap_t map) +{ + if (STAILQ_FIRST(&map->bpages) != NULL || + STAILQ_FIRST(&map->slist) != NULL) { + CTR3(KTR_BUSDMA, "%s: tag %p error %d", + __func__, dmat, EBUSY); + return (EBUSY); + } + if (dmat->bounce_zone) + dmat->bounce_zone->map_count--; + free(map, M_DEVBUF); + dmat->map_count--; + CTR2(KTR_BUSDMA, "%s: tag %p error 0", __func__, dmat); + return (0); +} + + +/* + * Allocate a piece of memory that can be efficiently mapped into + * bus device space based on the constraints lited in the dma tag. + * A dmamap to for use with dmamap_load is also allocated. + */ +int +bus_dmamem_alloc(bus_dma_tag_t dmat, void** vaddr, int flags, + bus_dmamap_t *mapp) +{ + int mflags, len; + + if (flags & BUS_DMA_NOWAIT) + mflags = M_NOWAIT; + else + mflags = M_WAITOK; + + /* ARM non-snooping caches need a map for the VA cache sync structure */ + + *mapp = (bus_dmamap_t)malloc(sizeof(**mapp), M_DEVBUF, + M_NOWAIT | M_ZERO); + if (*mapp == NULL) { + CTR4(KTR_BUSDMA, "%s: tag %p tag flags 0x%x error %d", + __func__, dmat, dmat->flags, ENOMEM); + return (ENOMEM); + } + + STAILQ_INIT(&((*mapp)->slist)); + + if (dmat->segments == NULL) { + dmat->segments = (bus_dma_segment_t *)malloc( + sizeof(bus_dma_segment_t) * dmat->nsegments, M_DEVBUF, + mflags); + if (dmat->segments == NULL) { + CTR4(KTR_BUSDMA, "%s: tag %p tag flags 0x%x error %d", + __func__, dmat, dmat->flags, ENOMEM); + free(*mapp, M_DEVBUF); + *mapp = NULL; + return (ENOMEM); + } + } + + if (flags & BUS_DMA_ZERO) + mflags |= M_ZERO; + + /* + * XXX: + * (dmat->alignment < dmat->maxsize) is just a quick hack; the exact + * alignment guarantees of malloc need to be nailed down, and the + * code below should be rewritten to take that into account. + * + * In the meantime, we'll warn the user if malloc gets it wrong. + * + * allocate at least a cache line. This should help avoid cache + * corruption. + */ + len = max(dmat->maxsize, arm_dcache_align); + if (len <= PAGE_SIZE && + (dmat->alignment < len) && + !_bus_dma_can_bounce(dmat->lowaddr, dmat->highaddr)) { + *vaddr = malloc(len, M_DEVBUF, mflags); + } else { + /* + * XXX Use Contigmalloc until it is merged into this facility + * and handles multi-seg allocations. Nobody is doing + * multi-seg allocations yet though. + * XXX Certain AGP hardware does. + */ + *vaddr = contigmalloc(len, M_DEVBUF, mflags, + 0ul, dmat->lowaddr, dmat->alignment? dmat->alignment : 1ul, + dmat->boundary); + } + if (*vaddr == NULL) { + CTR4(KTR_BUSDMA, "%s: tag %p tag flags 0x%x error %d", + __func__, dmat, dmat->flags, ENOMEM); + free(*mapp, M_DEVBUF); + *mapp = NULL; + return (ENOMEM); + } else if ((uintptr_t)*vaddr & (dmat->alignment - 1)) { + printf("bus_dmamem_alloc failed to align memory properly.\n"); + } + dmat->map_count++; + + if (flags & BUS_DMA_COHERENT) + pmap_change_attr((vm_offset_t)*vaddr, len, + BUS_DMA_NOCACHE); + + CTR4(KTR_BUSDMA, "%s: tag %p tag flags 0x%x error %d", + __func__, dmat, dmat->flags, 0); + return (0); +} + +/* + * Free a piece of memory and it's allociated dmamap, that was allocated + * via bus_dmamem_alloc. Make the same choice for free/contigfree. + */ +void +bus_dmamem_free(bus_dma_tag_t dmat, void *vaddr, bus_dmamap_t map) +{ + int len; + +#ifdef mftnotyet + pmap_change_attr((vm_offset_t)vaddr, dmat->maxsize, ARM_WRITE_BACK); +#endif + len = max(dmat->maxsize, arm_dcache_align); + if (len <= PAGE_SIZE && + (dmat->alignment < len) && + !_bus_dma_can_bounce(dmat->lowaddr, dmat->highaddr)) + free(vaddr, M_DEVBUF); + else { + contigfree(vaddr, len, M_DEVBUF); + } + dmat->map_count--; + free(map, M_DEVBUF); + CTR3(KTR_BUSDMA, "%s: tag %p flags 0x%x", __func__, dmat, dmat->flags); +} + +static int +_bus_dmamap_count_pages(bus_dma_tag_t dmat, bus_dmamap_t map, + void *buf, bus_size_t buflen, int flags) +{ + vm_offset_t vaddr; + vm_offset_t vendaddr; + bus_addr_t paddr; + + if (map->pagesneeded == 0) { + CTR5(KTR_BUSDMA, "lowaddr= %d, boundary= %d, alignment= %d" + " map= %p, pagesneeded= %d", + dmat->lowaddr, dmat->boundary, dmat->alignment, + map, map->pagesneeded); + /* + * Count the number of bounce pages + * needed in order to complete this transfer + */ + vaddr = (vm_offset_t)buf; + vendaddr = (vm_offset_t)buf + buflen; + + while (vaddr < vendaddr) { + if (__predict_true(map->pmap == pmap_kernel())) + paddr = pmap_kextract(vaddr); + else + paddr = pmap_extract(map->pmap, vaddr); + if (((dmat->flags & BUS_DMA_COULD_BOUNCE) != 0) && + run_filter(dmat, paddr) != 0) { + map->pagesneeded++; + } + vaddr += (PAGE_SIZE - ((vm_offset_t)vaddr & PAGE_MASK)); + + } + CTR1(KTR_BUSDMA, "pagesneeded= %d", map->pagesneeded); + } + + /* Reserve Necessary Bounce Pages */ + if (map->pagesneeded != 0) { + mtx_lock(&bounce_lock); + if (flags & BUS_DMA_NOWAIT) { + if (reserve_bounce_pages(dmat, map, 0) != 0) { + map->pagesneeded = 0; + mtx_unlock(&bounce_lock); + return (ENOMEM); + } + } else { + if (reserve_bounce_pages(dmat, map, 1) != 0) { + /* Queue us for resources */ + map->dmat = dmat; + map->buf = buf; + map->buflen = buflen; + STAILQ_INSERT_TAIL(&bounce_map_waitinglist, + map, links); + mtx_unlock(&bounce_lock); + return (EINPROGRESS); + } + } + mtx_unlock(&bounce_lock); + } + + return (0); +} + +/* + * Utility function to load a linear buffer. lastaddrp holds state + * between invocations (for multiple-buffer loads). segp contains + * the starting segment on entrace, and the ending segment on exit. + * first indicates if this is the first invocation of this function. + */ +static __inline int +_bus_dmamap_load_buffer(bus_dma_tag_t dmat, + bus_dmamap_t map, + void *buf, bus_size_t buflen, + int flags, + bus_addr_t *lastaddrp, + bus_dma_segment_t *segs, + int *segp, + int first) +{ + bus_size_t sgsize; + bus_addr_t curaddr, lastaddr, baddr, bmask; + vm_offset_t vaddr; + struct sync_list *sl; + int seg, error; + + if ((dmat->flags & BUS_DMA_COULD_BOUNCE) != 0) { + error = _bus_dmamap_count_pages(dmat, map, buf, buflen, flags); + if (error) + return (error); + } + + sl = NULL; + vaddr = (vm_offset_t)buf; + lastaddr = *lastaddrp; + bmask = ~(dmat->boundary - 1); + + for (seg = *segp; buflen > 0 ; ) { + /* + * Get the physical address for this segment. + */ + if (__predict_true(map->pmap == pmap_kernel())) + curaddr = pmap_kextract(vaddr); + else + curaddr = pmap_extract(map->pmap, vaddr); + + /* + * Compute the segment size, and adjust counts. + */ + sgsize = PAGE_SIZE - ((u_long)curaddr & PAGE_MASK); + if (sgsize > dmat->maxsegsz) + sgsize = dmat->maxsegsz; + if (buflen < sgsize) + sgsize = buflen; + + /* + * Make sure we don't cross any boundaries. + */ + if (dmat->boundary > 0) { + baddr = (curaddr + dmat->boundary) & bmask; + if (sgsize > (baddr - curaddr)) + sgsize = (baddr - curaddr); + } + + if (((dmat->flags & BUS_DMA_COULD_BOUNCE) != 0) && + map->pagesneeded != 0 && run_filter(dmat, curaddr)) { + curaddr = add_bounce_page(dmat, map, vaddr, sgsize); + } else { + /* add_sync_list(dmat, map, vaddr, sgsize, cflag); */ + sl = (struct sync_list *)malloc(sizeof(struct sync_list), + M_DEVBUF, M_NOWAIT | M_ZERO); + if (sl == NULL) + goto cleanup; + STAILQ_INSERT_TAIL(&(map->slist), sl, slinks); + sl->vaddr = vaddr; + sl->datacount = sgsize; + } + + + if (dmat->ranges) { + struct arm32_dma_range *dr; + + dr = _bus_dma_inrange(dmat->ranges, dmat->_nranges, + curaddr); + if (dr == NULL) { + _bus_dmamap_unload(dmat, map); + return (EINVAL); + } + /* + * In a valid DMA range. Translate the physical + * memory address to an address in the DMA window. + */ + curaddr = (curaddr - dr->dr_sysbase) + dr->dr_busbase; + } + + /* + * Insert chunk into a segment, coalescing with + * previous segment if possible. + */ + if (first) { + segs[seg].ds_addr = curaddr; + segs[seg].ds_len = sgsize; + first = 0; + } else { + if (curaddr == lastaddr && + (segs[seg].ds_len + sgsize) <= dmat->maxsegsz && + (dmat->boundary == 0 || + (segs[seg].ds_addr & bmask) == (curaddr & bmask))) + segs[seg].ds_len += sgsize; + else { + if (++seg >= dmat->nsegments) + break; + segs[seg].ds_addr = curaddr; + segs[seg].ds_len = sgsize; + } + } + + lastaddr = curaddr + sgsize; + vaddr += sgsize; + buflen -= sgsize; + } + + *segp = seg; + *lastaddrp = lastaddr; +cleanup: + /* + * Did we fit? + */ + if (buflen != 0) { + _bus_dmamap_unload(dmat, map); + return(EFBIG); /* XXX better return value here? */ + } + return (0); +} + +/* + * Map the buffer buf into bus space using the dmamap map. + */ +int +bus_dmamap_load(bus_dma_tag_t dmat, bus_dmamap_t map, void *buf, + bus_size_t buflen, bus_dmamap_callback_t *callback, + void *callback_arg, int flags) +{ + bus_addr_t lastaddr = 0; + int error, nsegs = 0; + + flags |= BUS_DMA_WAITOK; + map->callback = callback; + map->callback_arg = callback_arg; + map->pmap = kernel_pmap; + + error = _bus_dmamap_load_buffer(dmat, map, buf, buflen, flags, + &lastaddr, dmat->segments, &nsegs, 1); + + CTR5(KTR_BUSDMA, "%s: tag %p tag flags 0x%x error %d nsegs %d", + __func__, dmat, dmat->flags, error, nsegs + 1); + + if (error == EINPROGRESS) { + return (error); + } + + if (error) + (*callback)(callback_arg, dmat->segments, 0, error); + else + (*callback)(callback_arg, dmat->segments, nsegs + 1, 0); + + /* + * Return ENOMEM to the caller so that it can pass it up the stack. + * This error only happens when NOWAIT is set, so deferal is disabled. + */ + if (error == ENOMEM) + return (error); + + return (0); +} + + +/* + * Like _bus_dmamap_load(), but for mbufs. + */ +static __inline int +_bus_dmamap_load_mbuf_sg(bus_dma_tag_t dmat, bus_dmamap_t map, + struct mbuf *m0, bus_dma_segment_t *segs, int *nsegs, + int flags) +{ + int error; + + M_ASSERTPKTHDR(m0); + map->pmap = kernel_pmap; + + flags |= BUS_DMA_NOWAIT; + *nsegs = 0; + error = 0; + if (m0->m_pkthdr.len <= dmat->maxsize) { + int first = 1; + bus_addr_t lastaddr = 0; + struct mbuf *m; + + for (m = m0; m != NULL && error == 0; m = m->m_next) { + if (m->m_len > 0) { + error = _bus_dmamap_load_buffer(dmat, map, + m->m_data, m->m_len, + flags, &lastaddr, + segs, nsegs, first); + first = 0; + } + } + } else { + error = EINVAL; + } + + /* XXX FIXME: Having to increment nsegs is really annoying */ + ++*nsegs; + CTR5(KTR_BUSDMA, "%s: tag %p tag flags 0x%x error %d nsegs %d", + __func__, dmat, dmat->flags, error, *nsegs); + return (error); +} + +int +bus_dmamap_load_mbuf(bus_dma_tag_t dmat, bus_dmamap_t map, + struct mbuf *m0, + bus_dmamap_callback2_t *callback, void *callback_arg, + int flags) +{ + int nsegs, error; + + error = _bus_dmamap_load_mbuf_sg(dmat, map, m0, dmat->segments, &nsegs, + flags); + + if (error) { + /* force "no valid mappings" in callback */ + (*callback)(callback_arg, dmat->segments, 0, 0, error); + } else { + (*callback)(callback_arg, dmat->segments, + nsegs, m0->m_pkthdr.len, error); + } + CTR5(KTR_BUSDMA, "%s: tag %p tag flags 0x%x error %d nsegs %d", + __func__, dmat, dmat->flags, error, nsegs); + + return (error); +} + +int +bus_dmamap_load_mbuf_sg(bus_dma_tag_t dmat, bus_dmamap_t map, + struct mbuf *m0, bus_dma_segment_t *segs, int *nsegs, + int flags) +{ + return (_bus_dmamap_load_mbuf_sg(dmat, map, m0, segs, nsegs, flags)); +} + +/* + * Like _bus_dmamap_load(), but for uios. + */ +int +bus_dmamap_load_uio(bus_dma_tag_t dmat, bus_dmamap_t map, + struct uio *uio, + bus_dmamap_callback2_t *callback, void *callback_arg, + int flags) +{ + bus_addr_t lastaddr; + int nsegs, error, first, i; + bus_size_t resid; + struct iovec *iov; + + flags |= BUS_DMA_NOWAIT; + resid = uio->uio_resid; + iov = uio->uio_iov; + + if (uio->uio_segflg == UIO_USERSPACE) { + KASSERT(uio->uio_td != NULL, + ("bus_dmamap_load_uio: USERSPACE but no proc")); + map->pmap = vmspace_pmap(uio->uio_td->td_proc->p_vmspace); + } else + map->pmap = kernel_pmap; + + nsegs = 0; + error = 0; + first = 1; + lastaddr = (bus_addr_t) 0; + for (i = 0; i < uio->uio_iovcnt && resid != 0 && !error; i++) { + /* + * Now at the first iovec to load. Load each iovec + * until we have exhausted the residual count. + */ + bus_size_t minlen = + resid < iov[i].iov_len ? resid : iov[i].iov_len; *** DIFF OUTPUT TRUNCATED AT 1000 LINES *** From owner-svn-src-projects@FreeBSD.ORG Wed Aug 24 09:54: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 D653D106564A; Wed, 24 Aug 2011 09:54: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 C78E88FC14; Wed, 24 Aug 2011 09:54: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 p7O9sLE7043316; Wed, 24 Aug 2011 09:54:21 GMT (envelope-from cognet@svn.freebsd.org) Received: (from cognet@localhost) by svn.freebsd.org (8.14.4/8.14.4/Submit) id p7O9sLCe043314; Wed, 24 Aug 2011 09:54:21 GMT (envelope-from cognet@svn.freebsd.org) Message-Id: <201108240954.p7O9sLCe043314@svn.freebsd.org> From: Olivier Houchard Date: Wed, 24 Aug 2011 09:54: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: r225141 - 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, 24 Aug 2011 09:54:21 -0000 Author: cognet Date: Wed Aug 24 09:54:21 2011 New Revision: 225141 URL: http://svn.freebsd.org/changeset/base/225141 Log: Remove dead code Noticed by: dmarion Modified: projects/armv6/sys/arm/arm/cpufunc.c Modified: projects/armv6/sys/arm/arm/cpufunc.c ============================================================================== --- projects/armv6/sys/arm/arm/cpufunc.c Wed Aug 24 09:08:07 2011 (r225140) +++ projects/armv6/sys/arm/arm/cpufunc.c Wed Aug 24 09:54:21 2011 (r225141) @@ -2150,7 +2150,6 @@ arm11_setup(args) __asm __volatile ("mcr\tp15, 0, r0, c7, c7, 0" : : ); /* Set the control register */ - curcpu()->ci_ctrl = cpuctrl; cpu_control(0xffffffff, cpuctrl); /* And again. */ From owner-svn-src-projects@FreeBSD.ORG Wed Aug 24 13:35: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 25ACC106566B; Wed, 24 Aug 2011 13:35:57 +0000 (UTC) (envelope-from gber@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id F069D8FC1E; Wed, 24 Aug 2011 13:35: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 p7ODZuS8056866; Wed, 24 Aug 2011 13:35:56 GMT (envelope-from gber@svn.freebsd.org) Received: (from gber@localhost) by svn.freebsd.org (8.14.4/8.14.4/Submit) id p7ODZu5e056862; Wed, 24 Aug 2011 13:35:56 GMT (envelope-from gber@svn.freebsd.org) Message-Id: <201108241335.p7ODZu5e056862@svn.freebsd.org> From: Grzegorz Bernacki Date: Wed, 24 Aug 2011 13:35: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: r225143 - 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, 24 Aug 2011 13:35:57 -0000 Author: gber Date: Wed Aug 24 13:35:56 2011 New Revision: 225143 URL: http://svn.freebsd.org/changeset/base/225143 Log: Few small fixes and whitespace removal. Submitted by: Damjan Marion Modified: projects/armv6/sys/arm/arm/cpufunc_asm_armv7.S projects/armv6/sys/arm/arm/pmap-v6.c projects/armv6/sys/conf/options.arm Modified: projects/armv6/sys/arm/arm/cpufunc_asm_armv7.S ============================================================================== --- projects/armv6/sys/arm/arm/cpufunc_asm_armv7.S Wed Aug 24 12:18:29 2011 (r225142) +++ projects/armv6/sys/arm/arm/cpufunc_asm_armv7.S Wed Aug 24 13:35:56 2011 (r225143) @@ -62,7 +62,7 @@ ENTRY(armv7_tlb_flushID) ENTRY(armv7_tlb_flushID_SE) ldr r1, .Lpage_mask - bic r0, r0, r1 + bic r0, r0, r1 mcr p15, 0, r0, c8, c7, 1 /* flush D tlb single entry */ mcr p15, 0, r0, c7, c5, 6 /* flush BTB */ mcr p15, 0, r0, c7, c10, 4 /* DSB */ @@ -83,7 +83,7 @@ Loop1: /* Get cache type for given level */ mov r2, r8, lsl #2 ldr r0, .Lcache_type - ldr r1, [r0, r2] + ldr r1, [r0, r2] /* Get line size */ and r2, r1, #7 @@ -93,7 +93,7 @@ Loop1: ldr r4, .Lway_mask ands r4, r4, r1, lsr #3 clz r5, r4 - + /* Get max index */ ldr r7, .Lmax_index ands r7, r7, r1, lsr #13 @@ -145,7 +145,6 @@ ENTRY(armv7_dcache_wb_range) mcr p15, 0, r0, c7, c10, 4 /* drain the write buffer */ bx lr - ENTRY(armv7_dcache_wbinv_range) ldr ip, .Larmv7_line_size .Larmv7_wbinv_next: @@ -155,7 +154,7 @@ ENTRY(armv7_dcache_wbinv_range) bhi .Larmv7_wbinv_next mcr p15, 0, r0, c7, c10, 4 /* drain the write buffer */ bx lr - + /* * Note, we must not invalidate everything. If the range is too big we * must use wb-inv of the entire cache. Modified: projects/armv6/sys/arm/arm/pmap-v6.c ============================================================================== --- projects/armv6/sys/arm/arm/pmap-v6.c Wed Aug 24 12:18:29 2011 (r225142) +++ projects/armv6/sys/arm/arm/pmap-v6.c Wed Aug 24 13:35:56 2011 (r225143) @@ -3614,7 +3614,7 @@ pmap_map_chunk(vm_offset_t l1pt, vm_offs #ifdef VERBOSE_INIT_ARM printf("pmap_map_chunk: pa=0x%x va=0x%x size=0x%x resid=0x%x " - "prot=0x%x cache=%d\n", pa, va, size, resid, prot, cache); + "prot=0x%x type=%d\n", pa, va, size, resid, prot, type); #endif f1 = l1_mem_types[type]; Modified: projects/armv6/sys/conf/options.arm ============================================================================== --- projects/armv6/sys/conf/options.arm Wed Aug 24 12:18:29 2011 (r225142) +++ projects/armv6/sys/conf/options.arm Wed Aug 24 13:35:56 2011 (r225143) @@ -41,5 +41,3 @@ AT91_TSC opt_at91.h AT91_KWIKBYTE opt_at91.h AT91_MCI_HAS_4WIRE opt_at91.h AT91_MCI_SLOT_B opt_at91.h -CPU_FA526 opt_global.h -CPU_FA626TE opt_global.h From owner-svn-src-projects@FreeBSD.ORG Wed Aug 24 14:09: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 10319106564A; Wed, 24 Aug 2011 14:09:33 +0000 (UTC) (envelope-from mav@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id F33F18FC12; Wed, 24 Aug 2011 14:09:32 +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 p7OE9Wfp057879; Wed, 24 Aug 2011 14:09:32 GMT (envelope-from mav@svn.freebsd.org) Received: (from mav@localhost) by svn.freebsd.org (8.14.4/8.14.4/Submit) id p7OE9Wm6057870; Wed, 24 Aug 2011 14:09:32 GMT (envelope-from mav@svn.freebsd.org) Message-Id: <201108241409.p7OE9Wm6057870@svn.freebsd.org> From: Alexander Motin Date: Wed, 24 Aug 2011 14:09:32 +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: r225144 - in projects/zfsd/head/sys/cam: ata scsi 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, 24 Aug 2011 14:09:33 -0000 Author: mav Date: Wed Aug 24 14:09:32 2011 New Revision: 225144 URL: http://svn.freebsd.org/changeset/base/225144 Log: First part of SAF-TE driver refactoring to the new fsm-based model: - make configuration and status reading asynchronous. Modified: projects/zfsd/head/sys/cam/ata/ata_all.c projects/zfsd/head/sys/cam/ata/ata_all.h projects/zfsd/head/sys/cam/scsi/scsi_all.c projects/zfsd/head/sys/cam/scsi/scsi_all.h projects/zfsd/head/sys/cam/scsi/scsi_enc.c projects/zfsd/head/sys/cam/scsi/scsi_enc_internal.h projects/zfsd/head/sys/cam/scsi/scsi_enc_safte.c projects/zfsd/head/sys/cam/scsi/scsi_enc_ses.c Modified: projects/zfsd/head/sys/cam/ata/ata_all.c ============================================================================== --- projects/zfsd/head/sys/cam/ata/ata_all.c Wed Aug 24 13:35:56 2011 (r225143) +++ projects/zfsd/head/sys/cam/ata/ata_all.c Wed Aug 24 14:09:32 2011 (r225144) @@ -762,3 +762,44 @@ semb_send_diagnostic(struct ccb_ataio *a length > 0 ? data_ptr[0] : 0, 0x82, length / 4); } +void +semb_read_buffer(struct ccb_ataio *ataio, + u_int32_t retries, void (*cbfcnp)(struct cam_periph *, union ccb*), + uint8_t tag_action, uint8_t page_code, + uint8_t *data_ptr, uint16_t length, uint32_t timeout) +{ + + length = min(length, 1020); + length = (length + 3) & ~3; + cam_fill_ataio(ataio, + retries, + cbfcnp, + /*flags*/CAM_DIR_IN, + tag_action, + data_ptr, + length, + timeout); + ata_28bit_cmd(ataio, ATA_SEP_ATTN, + page_code, 0x00, length / 4); +} + +void +semb_write_buffer(struct ccb_ataio *ataio, + u_int32_t retries, void (*cbfcnp)(struct cam_periph *, union ccb *), + uint8_t tag_action, uint8_t *data_ptr, uint16_t length, uint32_t timeout) +{ + + length = min(length, 1020); + length = (length + 3) & ~3; + cam_fill_ataio(ataio, + retries, + cbfcnp, + /*flags*/length ? CAM_DIR_OUT : CAM_DIR_NONE, + tag_action, + data_ptr, + length, + timeout); + ata_28bit_cmd(ataio, ATA_SEP_ATTN, + length > 0 ? data_ptr[0] : 0, 0x80, length / 4); +} + Modified: projects/zfsd/head/sys/cam/ata/ata_all.h ============================================================================== --- projects/zfsd/head/sys/cam/ata/ata_all.h Wed Aug 24 13:35:56 2011 (r225143) +++ projects/zfsd/head/sys/cam/ata/ata_all.h Wed Aug 24 14:09:32 2011 (r225144) @@ -152,4 +152,14 @@ void semb_send_diagnostic(struct ccb_ata uint8_t tag_action, uint8_t *data_ptr, uint16_t param_list_length, uint32_t timeout); +void semb_read_buffer(struct ccb_ataio *ataio, + u_int32_t retries, void (*cbfcnp)(struct cam_periph *, union ccb*), + uint8_t tag_action, uint8_t page_code, + uint8_t *data_ptr, uint16_t allocation_length, uint32_t timeout); + +void semb_write_buffer(struct ccb_ataio *ataio, + u_int32_t retries, void (*cbfcnp)(struct cam_periph *, union ccb *), + uint8_t tag_action, uint8_t *data_ptr, uint16_t param_list_length, + uint32_t timeout); + #endif Modified: projects/zfsd/head/sys/cam/scsi/scsi_all.c ============================================================================== --- projects/zfsd/head/sys/cam/scsi/scsi_all.c Wed Aug 24 13:35:56 2011 (r225143) +++ projects/zfsd/head/sys/cam/scsi/scsi_all.c Wed Aug 24 14:09:32 2011 (r225144) @@ -3564,7 +3564,7 @@ scsi_devid_is_naa_ieee_reg(uint8_t *bufp return 0; if (descr->length < sizeof(struct scsi_vpd_id_naa_ieee_reg)) return 0; - if ((naa->naa >> SVPD_ID_NAA_NAA_SHIFT) != SVPD_ID_NAA_IEEE_REG) + if (0 && (naa->naa >> SVPD_ID_NAA_NAA_SHIFT) != SVPD_ID_NAA_IEEE_REG) return 0; return 1; } @@ -4276,6 +4276,66 @@ scsi_send_diagnostic(struct ccb_scsiio * timeout); } +void +scsi_read_buffer(struct ccb_scsiio *csio, u_int32_t retries, + void (*cbfcnp)(struct cam_periph *, union ccb*), + uint8_t tag_action, int mode, + uint8_t buffer_id, u_int32_t offset, + uint8_t *data_ptr, uint32_t allocation_length, + uint8_t sense_len, uint32_t timeout) +{ + struct scsi_read_buffer *scsi_cmd; + + scsi_cmd = (struct scsi_read_buffer *)&csio->cdb_io.cdb_bytes; + memset(scsi_cmd, 0, sizeof(*scsi_cmd)); + scsi_cmd->opcode = READ_BUFFER; + scsi_cmd->byte2 = mode; + scsi_cmd->buffer_id = buffer_id; + scsi_ulto3b(offset, scsi_cmd->offset); + scsi_ulto3b(allocation_length, scsi_cmd->length); + + cam_fill_csio(csio, + retries, + cbfcnp, + /*flags*/CAM_DIR_IN, + tag_action, + data_ptr, + allocation_length, + sense_len, + sizeof(*scsi_cmd), + timeout); +} + +void +scsi_write_buffer(struct ccb_scsiio *csio, u_int32_t retries, + void (*cbfcnp)(struct cam_periph *, union ccb *), + uint8_t tag_action, int mode, + uint8_t buffer_id, u_int32_t offset, + uint8_t *data_ptr, uint32_t param_list_length, + uint8_t sense_len, uint32_t timeout) +{ + struct scsi_write_buffer *scsi_cmd; + + scsi_cmd = (struct scsi_write_buffer *)&csio->cdb_io.cdb_bytes; + memset(scsi_cmd, 0, sizeof(*scsi_cmd)); + scsi_cmd->opcode = WRITE_BUFFER; + scsi_cmd->byte2 = mode; + scsi_cmd->buffer_id = buffer_id; + scsi_ulto3b(offset, scsi_cmd->offset); + scsi_ulto3b(param_list_length, scsi_cmd->length); + + cam_fill_csio(csio, + retries, + cbfcnp, + /*flags*/param_list_length ? CAM_DIR_OUT : CAM_DIR_NONE, + tag_action, + data_ptr, + param_list_length, + sense_len, + sizeof(*scsi_cmd), + timeout); +} + void scsi_start_stop(struct ccb_scsiio *csio, u_int32_t retries, void (*cbfcnp)(struct cam_periph *, union ccb *), Modified: projects/zfsd/head/sys/cam/scsi/scsi_all.h ============================================================================== --- projects/zfsd/head/sys/cam/scsi/scsi_all.h Wed Aug 24 13:35:56 2011 (r225143) +++ projects/zfsd/head/sys/cam/scsi/scsi_all.h Wed Aug 24 14:09:32 2011 (r225144) @@ -1487,6 +1487,20 @@ void scsi_send_diagnostic(struct ccb_scs uint16_t param_list_length, uint8_t sense_len, uint32_t timeout); +void scsi_read_buffer(struct ccb_scsiio *csio, u_int32_t retries, + void (*cbfcnp)(struct cam_periph *, union ccb*), + uint8_t tag_action, int mode, + uint8_t buffer_id, u_int32_t offset, + uint8_t *data_ptr, uint32_t allocation_length, + uint8_t sense_len, uint32_t timeout); + +void scsi_write_buffer(struct ccb_scsiio *csio, u_int32_t retries, + void (*cbfcnp)(struct cam_periph *, union ccb *), + uint8_t tag_action, int mode, + uint8_t buffer_id, u_int32_t offset, + uint8_t *data_ptr, uint32_t param_list_length, + uint8_t sense_len, uint32_t timeout); + void scsi_read_write(struct ccb_scsiio *csio, u_int32_t retries, void (*cbfcnp)(struct cam_periph *, union ccb *), u_int8_t tag_action, int readop, u_int8_t byte2, Modified: projects/zfsd/head/sys/cam/scsi/scsi_enc.c ============================================================================== --- projects/zfsd/head/sys/cam/scsi/scsi_enc.c Wed Aug 24 13:35:56 2011 (r225143) +++ projects/zfsd/head/sys/cam/scsi/scsi_enc.c Wed Aug 24 14:09:32 2011 (r225144) @@ -429,7 +429,7 @@ enc_ioctl(struct cdev *dev, u_long cmd, cam_periph_unlock(periph); break; } - tmp = cache->enc_status & ~ENCI_SVALID; + tmp = cache->enc_status; cam_periph_unlock(periph); error = copyout(&tmp, addr, sizeof(tmp)); cache->enc_status = tmp; Modified: projects/zfsd/head/sys/cam/scsi/scsi_enc_internal.h ============================================================================== --- projects/zfsd/head/sys/cam/scsi/scsi_enc_internal.h Wed Aug 24 13:35:56 2011 (r225143) +++ projects/zfsd/head/sys/cam/scsi/scsi_enc_internal.h Wed Aug 24 14:09:32 2011 (r225144) @@ -139,7 +139,6 @@ struct enc_softc { enc_cache_t enc_daemon_cache; struct sx enc_cache_lock; -#define ENCI_SVALID 0x80 uint8_t enc_flags; #define ENC_FLAG_INVALID 0x01 #define ENC_FLAG_INITIALIZED 0x02 Modified: projects/zfsd/head/sys/cam/scsi/scsi_enc_safte.c ============================================================================== --- projects/zfsd/head/sys/cam/scsi/scsi_enc_safte.c Wed Aug 24 13:35:56 2011 (r225143) +++ projects/zfsd/head/sys/cam/scsi/scsi_enc_safte.c Wed Aug 24 14:09:32 2011 (r225144) @@ -45,6 +45,7 @@ __FBSDID("$FreeBSD: head/sys/cam/scsi/sc #include #include +#include #include @@ -52,8 +53,6 @@ __FBSDID("$FreeBSD: head/sys/cam/scsi/sc * SAF-TE Type Device Emulation */ -static int safte_getconfig(enc_softc_t *); -static int safte_rdstat(enc_softc_t *, int); static int set_elm_status_sel(enc_softc_t *, encioc_elm_status_t *, int); static int wrbuf16(enc_softc_t *, uint8_t, uint8_t, uint8_t, uint8_t, int); static void wrslot_stat(enc_softc_t *, int); @@ -81,8 +80,54 @@ static int perf_slotop(enc_softc_t *, ui #define SAFTE_WT_ACTPWS 0x14 /* turn on/off power supply */ #define SAFTE_WT_GLOBAL 0x15 /* send global command */ - #define SAFT_SCRATCH 64 +#define SCSZ 0x8000 + +typedef enum { + SAFTE_UPDATE_NONE, + SAFTE_UPDATE_READCONFIG, + SAFTE_UPDATE_READENCSTATUS, + SAFTE_UPDATE_READSLOTSTATUS, + SAFTE_NUM_UPDATE_STATES +} safte_update_action; + +static fsm_fill_handler_t safte_fill_read_buf_io; +static fsm_done_handler_t safte_process_config; +static fsm_done_handler_t safte_process_status; +static fsm_done_handler_t safte_process_slotstatus; + +static struct enc_fsm_state enc_fsm_states[SAFTE_NUM_UPDATE_STATES] = +{ + { "SAFTE_UPDATE_NONE", 0, 0, 0, NULL, NULL, NULL }, + { + "SAFTE_UPDATE_READCONFIG", + SAFTE_RD_RDCFG, + SAFT_SCRATCH, + 60 * 1000, + safte_fill_read_buf_io, + safte_process_config, + enc_error + }, + { + "SAFTE_UPDATE_READENCSTATUS", + SAFTE_RD_RDESTS, + SCSZ, + 60 * 1000, + safte_fill_read_buf_io, + safte_process_status, + enc_error + }, + { + "SAFTE_UPDATE_READSLOTSTATUS", + SAFTE_RD_RDDSTS, + SCSZ, + 60 * 1000, + safte_fill_read_buf_io, + safte_process_slotstatus, + enc_error + } +}; + #define NPSEUDO_ALARM 1 struct scfg { /* @@ -124,121 +169,127 @@ struct scfg { static char *safte_2little = "Too Little Data Returned (%d) at line %d\n"; #define SAFT_BAIL(r, x, k) \ if ((r) >= (x)) { \ - ENC_LOG(ssc, safte_2little, x, __LINE__);\ + ENC_LOG(enc, safte_2little, x, __LINE__);\ ENC_FREE((k)); \ return (EIO); \ } static int -safte_getconfig(enc_softc_t *ssc) +safte_fill_read_buf_io(enc_softc_t *enc, struct enc_fsm_state *state, + union ccb *ccb, uint8_t *buf) +{ + + if (state->page_code != SAFTE_RD_RDCFG && + enc->enc_cache.nelms == 0) { + enc_update_request(enc, SAFTE_UPDATE_READCONFIG); + return (-1); + } + + if (enc->enc_type == ENC_SEMB_SAFT) { + semb_read_buffer(&ccb->ataio, /*retries*/5, + enc_done, MSG_SIMPLE_Q_TAG, + state->page_code, buf, state->buf_size, + state->timeout); + } else { + scsi_read_buffer(&ccb->csio, /*retries*/5, + enc_done, MSG_SIMPLE_Q_TAG, 1, + state->page_code, 0, buf, state->buf_size, + SSD_FULL_SIZE, state->timeout); + } + return (0); +} + +static int +safte_process_config(enc_softc_t *enc, struct enc_fsm_state *state, + union ccb *ccb, uint8_t **bufp, int xfer_len) { struct scfg *cfg; - int err, amt; - char *sdata; - static char cdb[10] = - { READ_BUFFER, 1, SAFTE_RD_RDCFG, 0, 0, 0, 0, 0, SAFT_SCRATCH, 0 }; + uint8_t *buf = *bufp; + int i, r; - cfg = ssc->enc_private; + cfg = enc->enc_private; if (cfg == NULL) return (ENXIO); - sdata = ENC_MALLOC(SAFT_SCRATCH); - if (sdata == NULL) - return (ENOMEM); - - amt = SAFT_SCRATCH; - err = enc_runcmd(ssc, cdb, 10, sdata, &amt); - if (err) { - ENC_FREE(sdata); - return (err); - } - amt = SAFT_SCRATCH - amt; - if (amt < 6) { - ENC_LOG(ssc, "too little data (%d) for configuration\n", amt); - ENC_FREE(sdata); + if (xfer_len < 6) { + ENC_LOG(enc, "too little data (%d) for configuration\n", + xfer_len); return (EIO); } - cfg->Nfans = sdata[0]; - cfg->Npwr = sdata[1]; - cfg->Nslots = sdata[2]; - cfg->DoorLock = sdata[3]; - cfg->Ntherm = sdata[4]; - cfg->Nspkrs = sdata[5]; + cfg->Nfans = buf[0]; + cfg->Npwr = buf[1]; + cfg->Nslots = buf[2]; + cfg->DoorLock = buf[3]; + cfg->Ntherm = buf[4]; + cfg->Nspkrs = buf[5]; cfg->Nalarm = NPSEUDO_ALARM; - if (amt >= 7) - cfg->Ntstats = sdata[6] & 0x0f; + if (xfer_len >= 7) + cfg->Ntstats = buf[6] & 0x0f; else cfg->Ntstats = 0; - ENC_VLOG(ssc, "Nfans %d Npwr %d Nslots %d Lck %d Ntherm %d Nspkrs %d " + ENC_VLOG(enc, "Nfans %d Npwr %d Nslots %d Lck %d Ntherm %d Nspkrs %d " "Ntstats %d\n", cfg->Nfans, cfg->Npwr, cfg->Nslots, cfg->DoorLock, cfg->Ntherm, cfg->Nspkrs, cfg->Ntstats); - ENC_FREE(sdata); - return (0); -} - -static int -safte_rdstat(enc_softc_t *ssc, int slpflg) -{ - int err, oid, r, i, hiwater, nitems, amt; - uint16_t tempflags; - size_t buflen; - uint8_t status, oencstat; - char *sdata, cdb[10]; - struct scfg *cc = ssc->enc_private; - enc_cache_t *cache = &ssc->enc_cache; - - /* - * The number of objects overstates things a bit, - * both for the bogus 'thermometer' entries and - * the drive status (which isn't read at the same - * time as the enclosure status), but that's okay. - */ - buflen = 4 * cc->Nslots; - if (cache->nelms > buflen) - buflen = cache->nelms; - sdata = ENC_MALLOC(buflen); - if (sdata == NULL) + enc->enc_cache.nelms = cfg->Nfans + cfg->Npwr + cfg->Nslots + + cfg->DoorLock + cfg->Ntherm + cfg->Nspkrs + cfg->Ntstats + 1 + + NPSEUDO_ALARM; + ENC_FREE_AND_NULL(enc->enc_cache.elm_map); + enc->enc_cache.elm_map = + ENC_MALLOCZ(enc->enc_cache.nelms * sizeof(enc_element_t)); + if (enc->enc_cache.elm_map == NULL) { + enc->enc_cache.nelms = 0; return (ENOMEM); - - cdb[0] = READ_BUFFER; - cdb[1] = 1; - cdb[2] = SAFTE_RD_RDESTS; - cdb[3] = 0; - cdb[4] = 0; - cdb[5] = 0; - cdb[6] = 0; - cdb[7] = (buflen >> 8) & 0xff; - cdb[8] = buflen & 0xff; - cdb[9] = 0; - amt = buflen; - err = enc_runcmd(ssc, cdb, 10, sdata, &amt); - if (err) { - ENC_FREE(sdata); - return (err); } - hiwater = buflen - amt; - + r = 0; /* - * invalidate all status bits. + * Note that this is all arranged for the convenience + * in later fetches of status. */ - for (i = 0; i < cache->nelms; i++) - cache->elm_map[i].svalid = 0; - oencstat = cache->enc_status & ALL_ENC_STAT; - ssc->enc_cache.enc_status = 0; + for (i = 0; i < cfg->Nfans; i++) + enc->enc_cache.elm_map[r++].enctype = ELMTYP_FAN; + cfg->pwroff = (uint8_t) r; + for (i = 0; i < cfg->Npwr; i++) + enc->enc_cache.elm_map[r++].enctype = ELMTYP_POWER; + for (i = 0; i < cfg->DoorLock; i++) + enc->enc_cache.elm_map[r++].enctype = ELMTYP_DOORLOCK; + for (i = 0; i < cfg->Nspkrs; i++) + enc->enc_cache.elm_map[r++].enctype = ELMTYP_ALARM; + for (i = 0; i < cfg->Ntherm; i++) + enc->enc_cache.elm_map[r++].enctype = ELMTYP_THERM; + for (i = 0; i <= cfg->Ntstats; i++) + enc->enc_cache.elm_map[r++].enctype = ELMTYP_THERM; + enc->enc_cache.elm_map[r++].enctype = ELMTYP_ALARM; + cfg->slotoff = (uint8_t) r; + for (i = 0; i < cfg->Nslots; i++) + enc->enc_cache.elm_map[r++].enctype = ELMTYP_DEVICE; + enc_update_request(enc, SAFTE_UPDATE_READENCSTATUS); + enc_update_request(enc, SAFTE_UPDATE_READSLOTSTATUS); + + return (0); +} + +static int +safte_process_status(enc_softc_t *enc, struct enc_fsm_state *state, + union ccb *ccb, uint8_t **bufp, int xfer_len) +{ + struct scfg *cfg; + uint8_t *buf = *bufp; + int oid, r, i, nitems; + uint16_t tempflags; + enc_cache_t *cache = &enc->enc_cache; + + cfg = enc->enc_private; + if (cfg == NULL) + return (ENXIO); - /* - * Now parse returned buffer. - * If we didn't get enough data back, - * that's considered a fatal error. - */ oid = r = 0; - for (nitems = i = 0; i < cc->Nfans; i++) { - SAFT_BAIL(r, hiwater, sdata); + for (nitems = i = 0; i < cfg->Nfans; i++) { + SAFT_BAIL(r, xfer_len, buf); /* * 0 = Fan Operational * 1 = Fan is malfunctioning @@ -247,7 +298,7 @@ safte_rdstat(enc_softc_t *ssc, int slpfl */ cache->elm_map[oid].encstat[1] = 0; /* resvd */ cache->elm_map[oid].encstat[2] = 0; /* resvd */ - switch ((int)(uint8_t)sdata[r]) { + switch ((int)buf[r]) { case 0: nitems++; cache->elm_map[oid].encstat[0] = SES_OBJSTAT_OK; @@ -271,7 +322,7 @@ safte_rdstat(enc_softc_t *ssc, int slpfl * if only one fan or no thermometers, * else the NONCRITICAL error is set. */ - if (cc->Nfans == 1 || (cc->Ntherm + cc->Ntstats) == 0) + if (cfg->Nfans == 1 || (cfg->Ntherm + cfg->Ntstats) == 0) cache->enc_status |= SES_ENCSTAT_CRITICAL; else cache->enc_status |= SES_ENCSTAT_NONCRITICAL; @@ -285,7 +336,7 @@ safte_rdstat(enc_softc_t *ssc, int slpfl * if only one fan or no thermometers, * else the NONCRITICAL error is set. */ - if (cc->Nfans == 1) + if (cfg->Nfans == 1) cache->enc_status |= SES_ENCSTAT_CRITICAL; else cache->enc_status |= SES_ENCSTAT_NONCRITICAL; @@ -297,8 +348,8 @@ safte_rdstat(enc_softc_t *ssc, int slpfl break; default: cache->elm_map[oid].encstat[0] = SES_OBJSTAT_UNSUPPORTED; - ENC_LOG(ssc, "Unknown fan%d status 0x%x\n", i, - sdata[r] & 0xff); + ENC_LOG(enc, "Unknown fan%d status 0x%x\n", i, + buf[r] & 0xff); break; } cache->elm_map[oid++].svalid = 1; @@ -309,18 +360,18 @@ safte_rdstat(enc_softc_t *ssc, int slpfl * No matter how you cut it, no cooling elements when there * should be some there is critical. */ - if (cc->Nfans && nitems == 0) { + if (cfg->Nfans && nitems == 0) { cache->enc_status |= SES_ENCSTAT_CRITICAL; } - for (i = 0; i < cc->Npwr; i++) { - SAFT_BAIL(r, hiwater, sdata); + for (i = 0; i < cfg->Npwr; i++) { + SAFT_BAIL(r, xfer_len, buf); cache->elm_map[oid].encstat[0] = SES_OBJSTAT_UNKNOWN; cache->elm_map[oid].encstat[1] = 0; /* resvd */ cache->elm_map[oid].encstat[2] = 0; /* resvd */ cache->elm_map[oid].encstat[3] = 0x20; /* requested on */ - switch ((uint8_t)sdata[r]) { + switch (buf[r]) { case 0x00: /* pws operational and on */ cache->elm_map[oid].encstat[0] = SES_OBJSTAT_OK; break; @@ -359,25 +410,25 @@ safte_rdstat(enc_softc_t *ssc, int slpfl cache->enc_status |= SES_ENCSTAT_INFO; break; default: - ENC_LOG(ssc, "unknown power supply %d status (0x%x)\n", - i, sdata[r] & 0xff); + ENC_LOG(enc, "unknown power supply %d status (0x%x)\n", + i, buf[r] & 0xff); break; } - ssc->enc_cache.elm_map[oid++].svalid = 1; + enc->enc_cache.elm_map[oid++].svalid = 1; r++; } /* * Skip over Slot SCSI IDs */ - r += cc->Nslots; + r += cfg->Nslots; /* * We always have doorlock status, no matter what, * but we only save the status if we have one. */ - SAFT_BAIL(r, hiwater, sdata); - if (cc->DoorLock) { + SAFT_BAIL(r, xfer_len, buf); + if (cfg->DoorLock) { /* * 0 = Door Locked * 1 = Door Unlocked, or no Lock Installed @@ -385,7 +436,7 @@ safte_rdstat(enc_softc_t *ssc, int slpfl */ cache->elm_map[oid].encstat[1] = 0; cache->elm_map[oid].encstat[2] = 0; - switch ((uint8_t)sdata[r]) { + switch (buf[r]) { case 0: cache->elm_map[oid].encstat[0] = SES_OBJSTAT_OK; cache->elm_map[oid].encstat[3] = 0; @@ -402,8 +453,8 @@ safte_rdstat(enc_softc_t *ssc, int slpfl default: cache->elm_map[oid].encstat[0] = SES_OBJSTAT_UNSUPPORTED; - ENC_LOG(ssc, "unknown lock status 0x%x\n", - sdata[r] & 0xff); + ENC_LOG(enc, "unknown lock status 0x%x\n", + buf[r] & 0xff); break; } cache->elm_map[oid++].svalid = 1; @@ -414,11 +465,11 @@ safte_rdstat(enc_softc_t *ssc, int slpfl * We always have speaker status, no matter what, * but we only save the status if we have one. */ - SAFT_BAIL(r, hiwater, sdata); - if (cc->Nspkrs) { + SAFT_BAIL(r, xfer_len, buf); + if (cfg->Nspkrs) { cache->elm_map[oid].encstat[1] = 0; cache->elm_map[oid].encstat[2] = 0; - if (sdata[r] == 1) { + if (buf[r] == 1) { /* * We need to cache tone urgency indicators. * Someday. @@ -426,14 +477,14 @@ safte_rdstat(enc_softc_t *ssc, int slpfl cache->elm_map[oid].encstat[0] = SES_OBJSTAT_NONCRIT; cache->elm_map[oid].encstat[3] = 0x8; cache->enc_status |= SES_ENCSTAT_NONCRITICAL; - } else if (sdata[r] == 0) { + } else if (buf[r] == 0) { cache->elm_map[oid].encstat[0] = SES_OBJSTAT_OK; cache->elm_map[oid].encstat[3] = 0; } else { cache->elm_map[oid].encstat[0] = SES_OBJSTAT_UNSUPPORTED; cache->elm_map[oid].encstat[3] = 0; - ENC_LOG(ssc, "unknown spkr status 0x%x\n", - sdata[r] & 0xff); + ENC_LOG(enc, "unknown spkr status 0x%x\n", + buf[r] & 0xff); } cache->elm_map[oid++].svalid = 1; } @@ -449,13 +500,13 @@ safte_rdstat(enc_softc_t *ssc, int slpfl * binary temperature sensor. */ - SAFT_BAIL(r + cc->Ntherm, hiwater, sdata); - tempflags = sdata[r + cc->Ntherm]; - SAFT_BAIL(r + cc->Ntherm + 1, hiwater, sdata); - tempflags |= (tempflags << 8) | sdata[r + cc->Ntherm + 1]; + SAFT_BAIL(r + cfg->Ntherm, xfer_len, buf); + tempflags = buf[r + cfg->Ntherm]; + SAFT_BAIL(r + cfg->Ntherm + 1, xfer_len, buf); + tempflags |= (tempflags << 8) | buf[r + cfg->Ntherm + 1]; - for (i = 0; i < cc->Ntherm; i++) { - SAFT_BAIL(r, hiwater, sdata); + for (i = 0; i < cfg->Ntherm; i++) { + SAFT_BAIL(r, xfer_len, buf); /* * Status is a range from -10 to 245 deg Celsius, * which we need to normalize to -20 to -245 according @@ -492,16 +543,16 @@ safte_rdstat(enc_softc_t *ssc, int slpfl } else cache->elm_map[oid].encstat[0] = SES_OBJSTAT_OK; cache->elm_map[oid].encstat[1] = 0; - cache->elm_map[oid].encstat[2] = sdata[r]; + cache->elm_map[oid].encstat[2] = buf[r]; cache->elm_map[oid].encstat[3] = 0; cache->elm_map[oid++].svalid = 1; r++; } - for (i = 0; i <= cc->Ntstats; i++) { + for (i = 0; i <= cfg->Ntstats; i++) { cache->elm_map[oid].encstat[1] = 0; if (tempflags & (1 << - ((i == cc->Ntstats) ? 15 : (cc->Ntherm + i)))) { + ((i == cfg->Ntstats) ? 15 : (cfg->Ntherm + i)))) { cache->elm_map[oid].encstat[0] = SES_OBJSTAT_CRIT; cache->elm_map[4].encstat[2] = 0xff; /* @@ -516,7 +567,7 @@ safte_rdstat(enc_softc_t *ssc, int slpfl * Just say 'OK', and use the reserved value of * zero. */ - if ((cc->Ntherm + cc->Ntstats) == 0) + if ((cfg->Ntherm + cfg->Ntstats) == 0) cache->elm_map[oid].encstat[0] = SES_OBJSTAT_NOTAVAIL; else @@ -536,24 +587,31 @@ safte_rdstat(enc_softc_t *ssc, int slpfl cache->elm_map[oid].encstat[3] = cache->elm_map[oid].priv; cache->elm_map[oid++].svalid = 1; - /* - * Now get drive slot status - */ - cdb[2] = SAFTE_RD_RDDSTS; - amt = buflen; - err = enc_runcmd(ssc, cdb, 10, sdata, &amt); - if (err) { - ENC_FREE(sdata); - return (err); - } - hiwater = buflen - amt; - for (r = i = 0; i < cc->Nslots; i++, r += 4) { - SAFT_BAIL(r+3, hiwater, sdata); + return (0); +} + +static int +safte_process_slotstatus(enc_softc_t *enc, struct enc_fsm_state *state, + union ccb *ccb, uint8_t **bufp, int xfer_len) +{ + struct scfg *cfg; + uint8_t *buf = *bufp; + enc_cache_t *cache = &enc->enc_cache; + int oid, r, i; + uint8_t status; + + cfg = enc->enc_private; + if (cfg == NULL) + return (ENXIO); + + oid = cfg->slotoff; + for (r = i = 0; i < cfg->Nslots; i++, r += 4) { + SAFT_BAIL(r+3, xfer_len, buf); cache->elm_map[oid].encstat[0] = SES_OBJSTAT_UNSUPPORTED; cache->elm_map[oid].encstat[1] = (uint8_t) i; cache->elm_map[oid].encstat[2] = 0; cache->elm_map[oid].encstat[3] = 0; - status = sdata[r+3]; + status = buf[r+3]; if ((status & 0x1) == 0) { /* no device */ cache->elm_map[oid].encstat[0] = SES_OBJSTAT_NOTINSTALLED; @@ -568,29 +626,28 @@ safte_rdstat(enc_softc_t *ssc, int slpfl } cache->elm_map[oid++].svalid = 1; } - /* see comment below about sticky enclosure status */ - cache->enc_status |= ENCI_SVALID | oencstat; - ENC_FREE(sdata); return (0); } static int -set_elm_status_sel(enc_softc_t *ssc, encioc_elm_status_t *elms, int slp) +set_elm_status_sel(enc_softc_t *enc, encioc_elm_status_t *elms, int slp) { int idx; enc_element_t *ep; - struct scfg *cc = ssc->enc_private; + struct scfg *cc = enc->enc_private; if (cc == NULL) return (0); idx = (int)elms->elm_idx; - ep = &ssc->enc_cache.elm_map[idx]; + ep = &enc->enc_cache.elm_map[idx]; switch (ep->enctype) { case ELMTYP_DEVICE: if (elms->cstat[0] & SESCTL_PRDFAIL) { ep->priv |= 0x40; + } else { + ep->priv &= ~0x40; } /* SESCTL_RSTSWAP has no correspondence in SAF-TE */ if (elms->cstat[0] & SESCTL_DISABLE) { @@ -599,13 +656,15 @@ set_elm_status_sel(enc_softc_t *ssc, enc * Hmm. Try to set the 'No Drive' flag. * Maybe that will count as a 'disable'. */ + } else { + ep->priv &= ~0x80; } if (ep->priv & 0xc6) { ep->priv &= ~0x1; } else { ep->priv |= 0x1; /* no errors */ } - wrslot_stat(ssc, slp); + wrslot_stat(enc, slp); break; case ELMTYP_POWER: /* @@ -613,7 +672,7 @@ set_elm_status_sel(enc_softc_t *ssc, enc * do the 'disable' for a power supply. */ if (elms->cstat[0] & SESCTL_DISABLE) { - (void) wrbuf16(ssc, SAFTE_WT_ACTPWS, + (void) wrbuf16(enc, SAFTE_WT_ACTPWS, idx - cc->pwroff, 0, 0, slp); } break; @@ -624,7 +683,7 @@ set_elm_status_sel(enc_softc_t *ssc, enc */ if (elms->cstat[0] & SESCTL_DISABLE) { /* remember- fans are the first items, so idx works */ - (void) wrbuf16(ssc, SAFTE_WT_FANSPD, idx, 0, 0, slp); + (void) wrbuf16(enc, SAFTE_WT_FANSPD, idx, 0, 0, slp); } break; case ELMTYP_DOORLOCK: @@ -633,7 +692,7 @@ set_elm_status_sel(enc_softc_t *ssc, enc */ if (elms->cstat[0] & SESCTL_DISABLE) { cc->flag2 &= ~SAFT_FLG2_LOCKDOOR; - (void) wrbuf16(ssc, SAFTE_WT_GLOBAL, cc->flag1, + (void) wrbuf16(enc, SAFTE_WT_GLOBAL, cc->flag1, cc->flag2, 0, slp); } break; @@ -644,7 +703,7 @@ set_elm_status_sel(enc_softc_t *ssc, enc if (elms->cstat[0] & SESCTL_DISABLE) { cc->flag2 &= ~SAFT_FLG1_ALARM; ep->priv |= 0x40; /* Muted */ - (void) wrbuf16(ssc, SAFTE_WT_GLOBAL, cc->flag1, + (void) wrbuf16(enc, SAFTE_WT_GLOBAL, cc->flag1, cc->flag2, 0, slp); } break; @@ -659,12 +718,12 @@ set_elm_status_sel(enc_softc_t *ssc, enc * This function handles all of the 16 byte WRITE BUFFER commands. */ static int -wrbuf16(enc_softc_t *ssc, uint8_t op, uint8_t b1, uint8_t b2, +wrbuf16(enc_softc_t *enc, uint8_t op, uint8_t b1, uint8_t b2, uint8_t b3, int slp) { int err, amt; char *sdata; - struct scfg *cc = ssc->enc_private; + struct scfg *cc = enc->enc_private; static char cdb[10] = { WRITE_BUFFER, 1, 0, 0, 0, 0, 0, 0, 16, 0 }; if (cc == NULL) @@ -674,14 +733,14 @@ wrbuf16(enc_softc_t *ssc, uint8_t op, ui if (sdata == NULL) return (ENOMEM); - ENC_DLOG(ssc, "saf_wrbuf16 %x %x %x %x\n", op, b1, b2, b3); + ENC_DLOG(enc, "saf_wrbuf16 %x %x %x %x\n", op, b1, b2, b3); sdata[0] = op; sdata[1] = b1; sdata[2] = b2; sdata[3] = b3; amt = -16; - err = enc_runcmd(ssc, cdb, 10, sdata, &amt); + err = enc_runcmd(enc, cdb, 10, sdata, &amt); ENC_FREE(sdata); return (err); } @@ -693,17 +752,17 @@ wrbuf16(enc_softc_t *ssc, uint8_t op, ui * returning an error. */ static void -wrslot_stat(enc_softc_t *ssc, int slp) +wrslot_stat(enc_softc_t *enc, int slp) { int i, amt; enc_element_t *ep; char cdb[10], *sdata; - struct scfg *cc = ssc->enc_private; + struct scfg *cc = enc->enc_private; if (cc == NULL) return; - ENC_DLOG(ssc, "saf_wrslot\n"); + ENC_DLOG(enc, "saf_wrslot\n"); cdb[0] = WRITE_BUFFER; cdb[1] = 1; cdb[2] = 0; @@ -721,12 +780,12 @@ wrslot_stat(enc_softc_t *ssc, int slp) sdata[0] = SAFTE_WT_DSTAT; for (i = 0; i < cc->Nslots; i++) { - ep = &ssc->enc_cache.elm_map[cc->slotoff + i]; - ENC_DLOG(ssc, "saf_wrslot %d <- %x\n", i, ep->priv & 0xff); + ep = &enc->enc_cache.elm_map[cc->slotoff + i]; + ENC_DLOG(enc, "saf_wrslot %d <- %x\n", i, ep->priv & 0xff); sdata[1 + (3 * i)] = ep->priv & 0xff; } amt = -(cc->Nslots * 3 + 1); - (void) enc_runcmd(ssc, cdb, 10, sdata, &amt); + (void) enc_runcmd(enc, cdb, 10, sdata, &amt); ENC_FREE(sdata); } @@ -734,11 +793,11 @@ wrslot_stat(enc_softc_t *ssc, int slp) * This function issues the "PERFORM SLOT OPERATION" command. */ static int -perf_slotop(enc_softc_t *ssc, uint8_t slot, uint8_t opflag, int slp) +perf_slotop(enc_softc_t *enc, uint8_t slot, uint8_t opflag, int slp) { int err, amt; char *sdata; - struct scfg *cc = ssc->enc_private; + struct scfg *cc = enc->enc_private; static char cdb[10] = { WRITE_BUFFER, 1, 0, 0, 0, 0, 0, 0, SAFT_SCRATCH, 0 }; @@ -752,9 +811,9 @@ perf_slotop(enc_softc_t *ssc, uint8_t sl sdata[0] = SAFTE_WT_SLTOP; sdata[1] = slot; sdata[2] = opflag; - ENC_DLOG(ssc, "saf_slotop slot %d op %x\n", slot, opflag); + ENC_DLOG(enc, "saf_slotop slot %d op %x\n", slot, opflag); amt = -SAFT_SCRATCH; - err = enc_runcmd(ssc, cdb, 10, sdata, &amt); + err = enc_runcmd(enc, cdb, 10, sdata, &amt); ENC_FREE(sdata); return (err); } @@ -762,39 +821,40 @@ perf_slotop(enc_softc_t *ssc, uint8_t sl static void safte_softc_cleanup(struct cam_periph *periph) { - enc_softc_t *ssc; + enc_softc_t *enc; - ssc = periph->softc; - ENC_FREE_AND_NULL(ssc->enc_cache.elm_map); - ENC_FREE_AND_NULL(ssc->enc_private); - ssc->enc_cache.nelms = 0; + enc = periph->softc; + ENC_FREE_AND_NULL(enc->enc_cache.elm_map); + ENC_FREE_AND_NULL(enc->enc_private); + enc->enc_cache.nelms = 0; } static int -safte_init_enc(enc_softc_t *ssc) +safte_init_enc(enc_softc_t *enc) { int err; static char cdb0[6] = { SEND_DIAGNOSTIC }; - err = enc_runcmd(ssc, cdb0, 6, NULL, 0); + err = enc_runcmd(enc, cdb0, 6, NULL, 0); if (err) { return (err); } DELAY(5000); - err = wrbuf16(ssc, SAFTE_WT_GLOBAL, 0, 0, 0, 1); + err = wrbuf16(enc, SAFTE_WT_GLOBAL, 0, 0, 0, 1); return (err); } static int -safte_get_enc_status(enc_softc_t *ssc, int slpflg) +safte_get_enc_status(enc_softc_t *enc, int slpflg) { - return (safte_rdstat(ssc, slpflg)); + + return (0); } static int -safte_set_enc_status(enc_softc_t *ssc, uint8_t encstat, int slpflg) +safte_set_enc_status(enc_softc_t *enc, uint8_t encstat, int slpflg) { - struct scfg *cc = ssc->enc_private; + struct scfg *cc = enc->enc_private; if (cc == NULL) return (0); /* @@ -803,46 +863,39 @@ safte_set_enc_status(enc_softc_t *ssc, u * that is, things set in enclosure status stay set (as implied * by conditions set in reading object status) until cleared. */ - ssc->enc_cache.enc_status &= ~ALL_ENC_STAT; - ssc->enc_cache.enc_status |= (encstat & ALL_ENC_STAT); - ssc->enc_cache.enc_status |= ENCI_SVALID; + enc->enc_cache.enc_status &= ~ALL_ENC_STAT; + enc->enc_cache.enc_status |= (encstat & ALL_ENC_STAT); cc->flag1 &= ~(SAFT_FLG1_ALARM|SAFT_FLG1_GLOBFAIL|SAFT_FLG1_GLOBWARN); if ((encstat & (SES_ENCSTAT_CRITICAL|SES_ENCSTAT_UNRECOV)) != 0) { cc->flag1 |= SAFT_FLG1_ALARM|SAFT_FLG1_GLOBFAIL; } else if ((encstat & SES_ENCSTAT_NONCRITICAL) != 0) { cc->flag1 |= SAFT_FLG1_GLOBWARN; } - return (wrbuf16(ssc, SAFTE_WT_GLOBAL, cc->flag1, cc->flag2, 0, slpflg)); + return (wrbuf16(enc, SAFTE_WT_GLOBAL, cc->flag1, cc->flag2, 0, slpflg)); } static int -safte_get_elm_status(enc_softc_t *ssc, encioc_elm_status_t *elms, int slpflg) +safte_get_elm_status(enc_softc_t *enc, encioc_elm_status_t *elms, int slpflg) { int i = (int)elms->elm_idx; - if ((ssc->enc_cache.enc_status & ENCI_SVALID) == 0 || - (ssc->enc_cache.elm_map[i].svalid) == 0) { - int err = safte_rdstat(ssc, slpflg); - if (err) - return (err); - } - elms->cstat[0] = ssc->enc_cache.elm_map[i].encstat[0]; - elms->cstat[1] = ssc->enc_cache.elm_map[i].encstat[1]; - elms->cstat[2] = ssc->enc_cache.elm_map[i].encstat[2]; - elms->cstat[3] = ssc->enc_cache.elm_map[i].encstat[3]; + elms->cstat[0] = enc->enc_cache.elm_map[i].encstat[0]; + elms->cstat[1] = enc->enc_cache.elm_map[i].encstat[1]; + elms->cstat[2] = enc->enc_cache.elm_map[i].encstat[2]; + elms->cstat[3] = enc->enc_cache.elm_map[i].encstat[3]; return (0); } static int -safte_set_elm_status(enc_softc_t *ssc, encioc_elm_status_t *elms, int slp) +safte_set_elm_status(enc_softc_t *enc, encioc_elm_status_t *elms, int slp) { int idx, err; *** DIFF OUTPUT TRUNCATED AT 1000 LINES *** From owner-svn-src-projects@FreeBSD.ORG Wed Aug 24 14:12: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 C6D26106564A; Wed, 24 Aug 2011 14:12:35 +0000 (UTC) (envelope-from gber@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id ACDC08FC19; Wed, 24 Aug 2011 14:12: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 p7OECZ62058068; Wed, 24 Aug 2011 14:12:35 GMT (envelope-from gber@svn.freebsd.org) Received: (from gber@localhost) by svn.freebsd.org (8.14.4/8.14.4/Submit) id p7OECZC5058058; Wed, 24 Aug 2011 14:12:35 GMT (envelope-from gber@svn.freebsd.org) Message-Id: <201108241412.p7OECZC5058058@svn.freebsd.org> From: Grzegorz Bernacki Date: Wed, 24 Aug 2011 14:12:35 +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: r225146 - in projects/armv6/sys: arm/arm arm/include 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, 24 Aug 2011 14:12:36 -0000 Author: gber Date: Wed Aug 24 14:12:35 2011 New Revision: 225146 URL: http://svn.freebsd.org/changeset/base/225146 Log: Added initial Cortex-Axx support. Submitted by: Damjan Marion Modified: projects/armv6/sys/arm/arm/identcpu.c projects/armv6/sys/arm/arm/locore.S projects/armv6/sys/arm/arm/swtch.S projects/armv6/sys/arm/include/armreg.h projects/armv6/sys/arm/include/cpuconf.h projects/armv6/sys/arm/include/md_var.h projects/armv6/sys/arm/include/pmap.h projects/armv6/sys/conf/files.arm projects/armv6/sys/conf/options.arm Modified: projects/armv6/sys/arm/arm/identcpu.c ============================================================================== --- projects/armv6/sys/arm/arm/identcpu.c Wed Aug 24 14:11:00 2011 (r225145) +++ projects/armv6/sys/arm/arm/identcpu.c Wed Aug 24 14:12:35 2011 (r225146) @@ -235,6 +235,17 @@ const struct cpuidtab cpuids[] = { { CPU_ID_ARM1026EJS, CPU_CLASS_ARM10EJ, "ARM1026EJ-S", generic_steppings }, + { CPU_ID_CORTEXA8R1, CPU_CLASS_CORTEXA, "Cortex A8-r1", + generic_steppings }, + { CPU_ID_CORTEXA8R2, CPU_CLASS_CORTEXA, "Cortex A8-r2", + generic_steppings }, + { CPU_ID_CORTEXA8R3, CPU_CLASS_CORTEXA, "Cortex A8-r3", + generic_steppings }, + { CPU_ID_CORTEXA9R1, CPU_CLASS_CORTEXA, "Cortex A9-r1", + generic_steppings }, + { CPU_ID_CORTEXA9R2, CPU_CLASS_CORTEXA, "Cortex A9-r2", + generic_steppings }, + { CPU_ID_SA110, CPU_CLASS_SA1, "SA-110", sa110_steppings }, { CPU_ID_SA1100, CPU_CLASS_SA1, "SA-1100", @@ -336,6 +347,7 @@ const struct cpu_classtab cpu_classes[] { "ARM9EJ-S", "CPU_ARM9E" }, /* CPU_CLASS_ARM9EJS */ { "ARM10E", "CPU_ARM10" }, /* CPU_CLASS_ARM10E */ { "ARM10EJ", "CPU_ARM10" }, /* CPU_CLASS_ARM10EJ */ + { "Cortex-A", "CPU_CORTEXA" }, /* CPU_CLASS_CORTEXA */ { "SA-1", "CPU_SA110" }, /* CPU_CLASS_SA1 */ { "XScale", "CPU_XSCALE_..." }, /* CPU_CLASS_XSCALE */ { "ARM11J", "CPU_ARM11" }, /* CPU_CLASS_ARM11J */ Modified: projects/armv6/sys/arm/arm/locore.S ============================================================================== --- projects/armv6/sys/arm/arm/locore.S Wed Aug 24 14:11:00 2011 (r225145) +++ projects/armv6/sys/arm/arm/locore.S Wed Aug 24 14:12:35 2011 (r225146) @@ -162,7 +162,7 @@ Lunmapped: mcr p15, 0, r0, c2, c0, 0 /* Set TTB */ mcr p15, 0, r0, c8, c7, 0 /* Flush TLB */ -#if defined(CPU_ARM11) || defined(CPU_MV_PJ4B) +#if defined(CPU_ARM11) || defined(CPU_CORTEXA) || defined(CPU_MV_PJ4B) mov r0, #0 mcr p15, 0, r0, c13, c0, 1 /* Set ASID to 0 */ #endif @@ -172,7 +172,7 @@ Lunmapped: mcr p15, 0, r0, c3, c0, 0 /* Enable MMU */ mrc p15, 0, r0, c1, c0, 0 -#if defined(CPU_ARM11) || defined(CPU_MV_PJ4B) +#if defined(CPU_ARM11) || defined(CPU_CORTEXA) || defined(CPU_MV_PJ4B) orr r0, r0, #CPU_CONTROL_V6_EXTPAGE #endif orr r0, r0, #(CPU_CONTROL_MMU_ENABLE | CPU_CONTROL_DC_ENABLE) Modified: projects/armv6/sys/arm/arm/swtch.S ============================================================================== --- projects/armv6/sys/arm/arm/swtch.S Wed Aug 24 14:11:00 2011 (r225145) +++ projects/armv6/sys/arm/arm/swtch.S Wed Aug 24 14:12:35 2011 (r225146) @@ -141,7 +141,7 @@ ENTRY(cpu_throw) /* Switch to lwp0 context */ ldr r9, .Lcpufuncs -#if !defined(CPU_ARM11) && !defined(CPU_MV_PJ4B) +#if !defined(CPU_ARM11) && !defined(CPU_CORTEXA) && !defined(CPU_MV_PJ4B) mov lr, pc ldr pc, [r9, #CF_IDCACHE_WBINV_ALL] #endif @@ -335,7 +335,7 @@ ENTRY(cpu_switch) cmpeq r0, r5 /* Same DACR? */ beq .Lcs_context_switched /* yes! */ -#if !defined(CPU_ARM11) && !defined(CPU_MV_PJ4B) +#if !defined(CPU_ARM11) && !defined(CPU_CORTEXA) && !defined(CPU_MV_PJ4B) /* * Definately need to flush the cache. */ @@ -367,7 +367,7 @@ ENTRY(cpu_switch) beq .Lcs_same_vector str r0, [r7] /* Otherwise, update it */ -#if !defined(CPU_ARM11) && !defined(CPU_MV_PJ4B) +#if !defined(CPU_ARM11) && !defined(CPU_CORTEXA) && !defined(CPU_MV_PJ4B) /* * Need to sync the cache to make sure that last store is * visible to the MMU. Modified: projects/armv6/sys/arm/include/armreg.h ============================================================================== --- projects/armv6/sys/arm/include/armreg.h Wed Aug 24 14:11:00 2011 (r225145) +++ projects/armv6/sys/arm/include/armreg.h Wed Aug 24 14:12:35 2011 (r225146) @@ -146,6 +146,11 @@ #define CPU_ID_ARM1026EJS 0x4106a260 #define CPU_ID_ARM1136JS 0x4107b360 #define CPU_ID_ARM1136JSR1 0x4117b360 +#define CPU_ID_CORTEXA8R1 0x411fc080 +#define CPU_ID_CORTEXA8R2 0x412fc080 +#define CPU_ID_CORTEXA8R3 0x413fc080 +#define CPU_ID_CORTEXA9R1 0x411fc090 +#define CPU_ID_CORTEXA9R2 0x412fc090 #define CPU_ID_SA110 0x4401a100 #define CPU_ID_SA1100 0x4401a110 #define CPU_ID_TI925T 0x54029250 Modified: projects/armv6/sys/arm/include/cpuconf.h ============================================================================== --- projects/armv6/sys/arm/include/cpuconf.h Wed Aug 24 14:11:00 2011 (r225145) +++ projects/armv6/sys/arm/include/cpuconf.h Wed Aug 24 14:12:35 2011 (r225146) @@ -64,6 +64,7 @@ defined(CPU_FA526) + \ defined(CPU_FA626TE) + \ defined(CPU_XSCALE_IXP425)) + \ + defined(CPU_CORTEXA) + \ defined(CPU_MV_PJ4B) /* @@ -93,12 +94,18 @@ #define ARM_ARCH_6 0 #endif -#define ARM_NARCH (ARM_ARCH_4 + ARM_ARCH_5 + ARM_ARCH_6) +#if defined(CPU_CORTEXA) +#define ARM_ARCH_7A 1 +#else +#define ARM_ARCH_7A 0 +#endif + +#define ARM_NARCH (ARM_ARCH_4 + ARM_ARCH_5 + ARM_ARCH_6 | ARM_ARCH_7A) #if ARM_NARCH == 0 && !defined(KLD_MODULE) && defined(_KERNEL) #error ARM_NARCH is 0 #endif -#if ARM_ARCH_5 || ARM_ARCH_6 +#if ARM_ARCH_5 || ARM_ARCH_6 || ARM_ARCH_7A /* * We could support Thumb code on v4T, but the lack of clean interworking * makes that hard. @@ -116,6 +123,8 @@ * * ARM_MMU_V6 ARMv6 MMU. * + * ARM_MMU_V7 ARMv7 MMU. + * * ARM_MMU_SA1 StrongARM SA-1 MMU. Compatible with generic * ARM MMU, but has no write-through cache mode. * @@ -144,6 +153,12 @@ #define ARM_MMU_V6 0 #endif +#if defined(CPU_CORTEXA) +#define ARM_MMU_V7 1 +#else +#define ARM_MMU_V7 0 +#endif + #if (defined(CPU_SA110) || defined(CPU_SA1100) || defined(CPU_SA1110) ||\ defined(CPU_IXP12X0)) #define ARM_MMU_SA1 1 @@ -160,7 +175,7 @@ #endif #define ARM_NMMUS (ARM_MMU_MEMC + ARM_MMU_GENERIC + ARM_MMU_V6 + \ - ARM_MMU_SA1 + ARM_MMU_XSCALE) + ARM_MMU_V7 + ARM_MMU_SA1 + ARM_MMU_XSCALE) #if ARM_NMMUS == 0 && !defined(KLD_MODULE) && defined(_KERNEL) #error ARM_NMMUS is 0 #endif Modified: projects/armv6/sys/arm/include/md_var.h ============================================================================== --- projects/armv6/sys/arm/include/md_var.h Wed Aug 24 14:11:00 2011 (r225145) +++ projects/armv6/sys/arm/include/md_var.h Wed Aug 24 14:12:35 2011 (r225146) @@ -62,6 +62,7 @@ enum cpu_class { CPU_CLASS_ARM9EJS, CPU_CLASS_ARM10E, CPU_CLASS_ARM10EJ, + CPU_CLASS_CORTEXA, CPU_CLASS_SA1, CPU_CLASS_XSCALE, CPU_CLASS_ARM11J, Modified: projects/armv6/sys/arm/include/pmap.h ============================================================================== --- projects/armv6/sys/arm/include/pmap.h Wed Aug 24 14:11:00 2011 (r225145) +++ projects/armv6/sys/arm/include/pmap.h Wed Aug 24 14:12:35 2011 (r225146) @@ -297,7 +297,7 @@ extern int pmap_needs_pte_sync; /* * User-visible names for the ones that vary with MMU class. */ -#if ARM_MMU_V6 == 1 +#if (ARM_MMU_V6 + ARM_MMU_V7) != 0 #define L2_AP(x) (L2_AP0(x)) #else #define L2_AP(x) (L2_AP0(x) | L2_AP1(x) | L2_AP2(x) | L2_AP3(x)) @@ -343,7 +343,7 @@ extern int pmap_needs_pte_sync; #define L1_C_PROTO L1_C_PROTO_xscale #define L2_S_PROTO L2_S_PROTO_xscale -#elif ARM_MMU_V6 == 1 +#elif (ARM_MMU_V6 + ARM_MMU_V7) != 0 #define L2_S_PROT_U (L2_AP0(2)) /* user access */ #define L2_S_PROT_R (L2_APX|L2_AP0(1)) /* read access */ @@ -399,7 +399,8 @@ extern int pmap_needs_pte_sync; * These macros return various bits based on kernel/user and protection. * Note that the compiler will usually fold these at compile time. */ -#if ARM_MMU_V6 == 0 +#if (ARM_MMU_V6 + ARM_MMU_V7) == 0 + #define L1_S_PROT_U (L1_S_AP(AP_U)) #define L1_S_PROT_W (L1_S_AP(AP_W)) #define L1_S_PROT_MASK (L1_S_PROT_U|L1_S_PROT_W) @@ -495,7 +496,7 @@ extern pt_entry_t pte_l2_s_proto; extern void (*pmap_copy_page_func)(vm_paddr_t, vm_paddr_t); extern void (*pmap_zero_page_func)(vm_paddr_t, int, int); -#if (ARM_MMU_GENERIC + ARM_MMU_V6 + ARM_MMU_SA1) != 0 || defined(CPU_XSCALE_81342) +#if (ARM_MMU_GENERIC + ARM_MMU_V6 + ARM_MMU_V7 + ARM_MMU_SA1) != 0 || defined(CPU_XSCALE_81342) void pmap_copy_page_generic(vm_paddr_t, vm_paddr_t); void pmap_zero_page_generic(vm_paddr_t, int, int); @@ -509,7 +510,7 @@ void pmap_pte_init_arm9(void); #if defined(CPU_ARM10) void pmap_pte_init_arm10(void); #endif /* CPU_ARM10 */ -#if defined(ARM_MMU_V6) +#if (ARM_MMU_V6 + ARM_MMU_V7) != 0 void pmap_pte_init_mmu_v6(void); #endif /* CPU_ARM11 */ #endif /* (ARM_MMU_GENERIC + ARM_MMU_SA1) != 0 */ Modified: projects/armv6/sys/conf/files.arm ============================================================================== --- projects/armv6/sys/conf/files.arm Wed Aug 24 14:11:00 2011 (r225145) +++ projects/armv6/sys/conf/files.arm Wed Aug 24 14:12:35 2011 (r225146) @@ -8,7 +8,7 @@ arm/arm/blockio.S standard arm/arm/bootconfig.c standard arm/arm/bus_space_asm_generic.S standard arm/arm/busdma_machdep.c optional cpu_arm9 | cpu_arm9e | cpu_fa526 | cpu_sa1100 | cpu_sa1110 | cpu_xscale_80219 | cpu_xscale_80321 | cpu_xscale_81342 | cpu_xscale_ixp425 | cpu_xscale_ixp435 | cpu_xscale_pxa2x0 -arm/arm/busdma_machdep-v6.c optional cpu_arm11 | cpu_mv_pj4b +arm/arm/busdma_machdep-v6.c optional cpu_arm11 | cpu_cortexa | cpu_mv_pj4b arm/arm/copystr.S standard arm/arm/cpufunc.c standard arm/arm/cpufunc_asm.S standard @@ -35,7 +35,7 @@ arm/arm/minidump_machdep.c optional mem arm/arm/mp_machdep.c optional smp arm/arm/nexus.c standard arm/arm/pmap.c optional cpu_arm9 | cpu_arm9e | cpu_fa526 | cpu_sa1100 | cpu_sa1110 | cpu_xscale_80219 | cpu_xscale_80321 | cpu_xscale_81342 | cpu_xscale_ixp425 | cpu_xscale_ixp435 | cpu_xscale_pxa2x0 -arm/arm/pmap-v6.c optional cpu_arm11 | cpu_mv_pj4b +arm/arm/pmap-v6.c optional cpu_arm11 | cpu_cortexa | cpu_mv_pj4b arm/arm/setcpsr.S standard arm/arm/setstack.s standard arm/arm/stack_machdep.c optional ddb | stack Modified: projects/armv6/sys/conf/options.arm ============================================================================== --- projects/armv6/sys/conf/options.arm Wed Aug 24 14:11:00 2011 (r225145) +++ projects/armv6/sys/conf/options.arm Wed Aug 24 14:12:35 2011 (r225146) @@ -10,6 +10,7 @@ COUNTS_PER_SEC opt_timer.h CPU_ARM9 opt_global.h CPU_ARM9E opt_global.h CPU_ARM11 opt_global.h +CPU_CORTEXA opt_global.h CPU_FA526 opt_global.h CPU_FA626TE opt_global.h CPU_MV_PJ4B opt_global.h From owner-svn-src-projects@FreeBSD.ORG Wed Aug 24 14:53:49 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 E3576106566B; Wed, 24 Aug 2011 14:53:49 +0000 (UTC) (envelope-from mav@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id D33948FC0C; Wed, 24 Aug 2011 14:53:49 +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 p7OErnAN059319; Wed, 24 Aug 2011 14:53:49 GMT (envelope-from mav@svn.freebsd.org) Received: (from mav@localhost) by svn.freebsd.org (8.14.4/8.14.4/Submit) id p7OErneC059317; Wed, 24 Aug 2011 14:53:49 GMT (envelope-from mav@svn.freebsd.org) Message-Id: <201108241453.p7OErneC059317@svn.freebsd.org> From: Alexander Motin Date: Wed, 24 Aug 2011 14:53:49 +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: r225147 - projects/zfsd/head/sys/cam/scsi 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, 24 Aug 2011 14:53:50 -0000 Author: mav Date: Wed Aug 24 14:53:49 2011 New Revision: 225147 URL: http://svn.freebsd.org/changeset/base/225147 Log: Try to read global flags on startup. Fix SAFT_BAIL() macro usage. Modified: projects/zfsd/head/sys/cam/scsi/scsi_enc_safte.c Modified: projects/zfsd/head/sys/cam/scsi/scsi_enc_safte.c ============================================================================== --- projects/zfsd/head/sys/cam/scsi/scsi_enc_safte.c Wed Aug 24 14:12:35 2011 (r225146) +++ projects/zfsd/head/sys/cam/scsi/scsi_enc_safte.c Wed Aug 24 14:53:49 2011 (r225147) @@ -70,6 +70,7 @@ static int perf_slotop(enc_softc_t *, ui #define SAFTE_RD_RDCFG 0x00 /* read enclosure configuration */ #define SAFTE_RD_RDESTS 0x01 /* read enclosure status */ #define SAFTE_RD_RDDSTS 0x04 /* read drive slot status */ +#define SAFTE_RD_RDGFLG 0x05 /* read global flags */ /* * WRITE BUFFER ('set' commands) IDs- placed in offset 0 of databuf @@ -86,6 +87,7 @@ static int perf_slotop(enc_softc_t *, ui typedef enum { SAFTE_UPDATE_NONE, SAFTE_UPDATE_READCONFIG, + SAFTE_UPDATE_READGFLAGS, SAFTE_UPDATE_READENCSTATUS, SAFTE_UPDATE_READSLOTSTATUS, SAFTE_NUM_UPDATE_STATES @@ -93,6 +95,7 @@ typedef enum { static fsm_fill_handler_t safte_fill_read_buf_io; static fsm_done_handler_t safte_process_config; +static fsm_done_handler_t safte_process_gflags; static fsm_done_handler_t safte_process_status; static fsm_done_handler_t safte_process_slotstatus; @@ -109,6 +112,15 @@ static struct enc_fsm_state enc_fsm_stat enc_error }, { + "SAFTE_UPDATE_READGFLAGS", + SAFTE_RD_RDGFLG, + 16, + 60 * 1000, + safte_fill_read_buf_io, + safte_process_gflags, + enc_error + }, + { "SAFTE_UPDATE_READENCSTATUS", SAFTE_RD_RDESTS, SCSZ, @@ -167,10 +179,9 @@ struct scfg { #define SAFT_PRIVATE sizeof (struct scfg) static char *safte_2little = "Too Little Data Returned (%d) at line %d\n"; -#define SAFT_BAIL(r, x, k) \ +#define SAFT_BAIL(r, x) \ if ((r) >= (x)) { \ ENC_LOG(enc, safte_2little, x, __LINE__);\ - ENC_FREE((k)); \ return (EIO); \ } @@ -266,6 +277,7 @@ safte_process_config(enc_softc_t *enc, s for (i = 0; i < cfg->Nslots; i++) enc->enc_cache.elm_map[r++].enctype = ELMTYP_DEVICE; + enc_update_request(enc, SAFTE_UPDATE_READGFLAGS); enc_update_request(enc, SAFTE_UPDATE_READENCSTATUS); enc_update_request(enc, SAFTE_UPDATE_READSLOTSTATUS); @@ -273,6 +285,24 @@ safte_process_config(enc_softc_t *enc, s } static int +safte_process_gflags(enc_softc_t *enc, struct enc_fsm_state *state, + union ccb *ccb, uint8_t **bufp, int xfer_len) +{ + struct scfg *cfg; + uint8_t *buf = *bufp; + + cfg = enc->enc_private; + if (cfg == NULL) + return (ENXIO); + + SAFT_BAIL(3, xfer_len); + cfg->flag1 = buf[1]; + cfg->flag2 = buf[2]; + + return (0); +} + +static int safte_process_status(enc_softc_t *enc, struct enc_fsm_state *state, union ccb *ccb, uint8_t **bufp, int xfer_len) { @@ -289,7 +319,7 @@ safte_process_status(enc_softc_t *enc, s oid = r = 0; for (nitems = i = 0; i < cfg->Nfans; i++) { - SAFT_BAIL(r, xfer_len, buf); + SAFT_BAIL(r, xfer_len); /* * 0 = Fan Operational * 1 = Fan is malfunctioning @@ -366,7 +396,7 @@ safte_process_status(enc_softc_t *enc, s for (i = 0; i < cfg->Npwr; i++) { - SAFT_BAIL(r, xfer_len, buf); + SAFT_BAIL(r, xfer_len); cache->elm_map[oid].encstat[0] = SES_OBJSTAT_UNKNOWN; cache->elm_map[oid].encstat[1] = 0; /* resvd */ cache->elm_map[oid].encstat[2] = 0; /* resvd */ @@ -427,7 +457,7 @@ safte_process_status(enc_softc_t *enc, s * We always have doorlock status, no matter what, * but we only save the status if we have one. */ - SAFT_BAIL(r, xfer_len, buf); + SAFT_BAIL(r, xfer_len); if (cfg->DoorLock) { /* * 0 = Door Locked @@ -465,7 +495,7 @@ safte_process_status(enc_softc_t *enc, s * We always have speaker status, no matter what, * but we only save the status if we have one. */ - SAFT_BAIL(r, xfer_len, buf); + SAFT_BAIL(r, xfer_len); if (cfg->Nspkrs) { cache->elm_map[oid].encstat[1] = 0; cache->elm_map[oid].encstat[2] = 0; @@ -500,13 +530,13 @@ safte_process_status(enc_softc_t *enc, s * binary temperature sensor. */ - SAFT_BAIL(r + cfg->Ntherm, xfer_len, buf); + SAFT_BAIL(r + cfg->Ntherm, xfer_len); tempflags = buf[r + cfg->Ntherm]; - SAFT_BAIL(r + cfg->Ntherm + 1, xfer_len, buf); + SAFT_BAIL(r + cfg->Ntherm + 1, xfer_len); tempflags |= (tempflags << 8) | buf[r + cfg->Ntherm + 1]; for (i = 0; i < cfg->Ntherm; i++) { - SAFT_BAIL(r, xfer_len, buf); + SAFT_BAIL(r, xfer_len); /* * Status is a range from -10 to 245 deg Celsius, * which we need to normalize to -20 to -245 according @@ -606,7 +636,7 @@ safte_process_slotstatus(enc_softc_t *en oid = cfg->slotoff; for (r = i = 0; i < cfg->Nslots; i++, r += 4) { - SAFT_BAIL(r+3, xfer_len, buf); + SAFT_BAIL(r+3, xfer_len); cache->elm_map[oid].encstat[0] = SES_OBJSTAT_UNSUPPORTED; cache->elm_map[oid].encstat[1] = (uint8_t) i; cache->elm_map[oid].encstat[2] = 0; From owner-svn-src-projects@FreeBSD.ORG Wed Aug 24 21:14:29 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 6A7BA106566B; Wed, 24 Aug 2011 21:14:29 +0000 (UTC) (envelope-from jilles@stack.nl) Received: from mx1.stack.nl (relay04.stack.nl [IPv6:2001:610:1108:5010::107]) by mx1.freebsd.org (Postfix) with ESMTP id 08FC38FC08; Wed, 24 Aug 2011 21:14:29 +0000 (UTC) Received: from turtle.stack.nl (turtle.stack.nl [IPv6:2001:610:1108:5010::132]) by mx1.stack.nl (Postfix) with ESMTP id 0AB231DD781; Wed, 24 Aug 2011 23:14:28 +0200 (CEST) Received: by turtle.stack.nl (Postfix, from userid 1677) id 028CC173CB; Wed, 24 Aug 2011 23:14:27 +0200 (CEST) Date: Wed, 24 Aug 2011 23:14:27 +0200 From: Jilles Tjoelker To: gk@freebsd.org Message-ID: <20110824211427.GB96070@stack.nl> References: <201108222354.p7MNsC9B074753@svn.freebsd.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <201108222354.p7MNsC9B074753@svn.freebsd.org> User-Agent: Mutt/1.5.21 (2010-09-15) Cc: svn-src-projects@freebsd.org, Matthew D Fleming , src-committers@freebsd.org Subject: Re: svn commit: r225097 - in projects/ino64: include lib/libc/gen usr.sbin/cpucontrol usr.sbin/lpr/common_source usr.sbin/newsyslog 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, 24 Aug 2011 21:14:29 -0000 On Mon, Aug 22, 2011 at 11:54:12PM +0000, Matthew D Fleming wrote: > Author: mdf > Date: Mon Aug 22 23:54:12 2011 > New Revision: 225097 > URL: http://svn.freebsd.org/changeset/base/225097 > Log: > Avoid using dirfd name there is dirfd() macro already. > Use dirfd() instead of dirp->dd_fd. > Replace dirfd() macro with exported libc symbol. > Use _dirfd() macro internally. > GSoC r222835, r222836, r222837. > Code by Gleb Kurtsou. > Added: projects/ino64/lib/libc/gen/dirfd.c > ============================================================================== > --- /dev/null 00:00:00 1970 (empty, because file is newly added) > +++ projects/ino64/lib/libc/gen/dirfd.c Mon Aug 22 23:54:12 2011 (r225097) [snip] > +int > +dirfd(DIR *dirp) > +{ > + if (dirp == NULL) > + return (-1); > + > + return (_dirfd(dirp)); > +} Why have this check here? I think the original behaviour (a segfault) is more useful here since the return value of this interface is often not checked. -- Jilles Tjoelker From owner-svn-src-projects@FreeBSD.ORG Wed Aug 24 22:14: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 62561106564A; Wed, 24 Aug 2011 22:14:56 +0000 (UTC) (envelope-from mdf@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id 3991C8FC15; Wed, 24 Aug 2011 22:14: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 p7OMEu0S072761; Wed, 24 Aug 2011 22:14:56 GMT (envelope-from mdf@svn.freebsd.org) Received: (from mdf@localhost) by svn.freebsd.org (8.14.4/8.14.4/Submit) id p7OMEuMP072758; Wed, 24 Aug 2011 22:14:56 GMT (envelope-from mdf@svn.freebsd.org) Message-Id: <201108242214.p7OMEuMP072758@svn.freebsd.org> From: Matthew D Fleming Date: Wed, 24 Aug 2011 22:14: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: r225154 - in projects/ino64/sys/ufs: ffs ufs 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, 24 Aug 2011 22:14:56 -0000 Author: mdf Date: Wed Aug 24 22:14:55 2011 New Revision: 225154 URL: http://svn.freebsd.org/changeset/base/225154 Log: Use fixed-width types in on-disk structures. This takes care of all the ino_t references I could find that were on-disk. GSoC r223157. Code by Gleb Kurtsou. Modified: projects/ino64/sys/ufs/ffs/fs.h projects/ino64/sys/ufs/ufs/dinode.h Modified: projects/ino64/sys/ufs/ffs/fs.h ============================================================================== --- projects/ino64/sys/ufs/ffs/fs.h Wed Aug 24 22:07:38 2011 (r225153) +++ projects/ino64/sys/ufs/ffs/fs.h Wed Aug 24 22:14:55 2011 (r225154) @@ -338,7 +338,7 @@ struct fs { ufs2_daddr_t fs_csaddr; /* blk addr of cyl grp summary area */ int64_t fs_pendingblocks; /* (u) blocks being freed */ u_int32_t fs_pendinginodes; /* (u) inodes being freed */ - ino_t fs_snapinum[FSMAXSNAP];/* list of snapshot inode numbers */ + u_int32_t fs_snapinum[FSMAXSNAP];/* list of snapshot inode numbers */ u_int32_t fs_avgfilesize; /* expected average file size */ u_int32_t fs_avgfpdir; /* expected # of files per directory */ int32_t fs_save_cgsize; /* save real cg size to use fs_bsize */ @@ -695,8 +695,8 @@ struct jsegrec { */ struct jrefrec { uint32_t jr_op; - ino_t jr_ino; - ino_t jr_parent; + uint32_t jr_ino; + uint32_t jr_parent; uint16_t jr_nlink; uint16_t jr_mode; off_t jr_diroff; @@ -709,8 +709,8 @@ struct jrefrec { */ struct jmvrec { uint32_t jm_op; - ino_t jm_ino; - ino_t jm_parent; + uint32_t jm_ino; + uint32_t jm_parent; uint16_t jm_unused; off_t jm_oldoff; off_t jm_newoff; Modified: projects/ino64/sys/ufs/ufs/dinode.h ============================================================================== --- projects/ino64/sys/ufs/ufs/dinode.h Wed Aug 24 22:07:38 2011 (r225153) +++ projects/ino64/sys/ufs/ufs/dinode.h Wed Aug 24 22:14:55 2011 (r225154) @@ -146,7 +146,7 @@ struct ufs2_dinode { ufs2_daddr_t di_db[NDADDR]; /* 112: Direct disk blocks. */ ufs2_daddr_t di_ib[NIADDR]; /* 208: Indirect disk blocks. */ u_int64_t di_modrev; /* 232: i_modrev for NFSv4 */ - ino_t di_freelink; /* 240: SUJ: Next unlinked inode. */ + u_int32_t di_freelink; /* 240: SUJ: Next unlinked inode. */ uint32_t di_spare[3]; /* 244: Reserved; currently unused */ }; @@ -168,7 +168,7 @@ struct ufs2_dinode { struct ufs1_dinode { u_int16_t di_mode; /* 0: IFMT, permissions; see below. */ int16_t di_nlink; /* 2: File link count. */ - ino_t di_freelink; /* 4: SUJ: Next unlinked inode. */ + u_int32_t di_freelink; /* 4: SUJ: Next unlinked inode. */ u_int64_t di_size; /* 8: File byte count. */ int32_t di_atime; /* 16: Last access time. */ int32_t di_atimensec; /* 20: Last access time. */ From owner-svn-src-projects@FreeBSD.ORG Wed Aug 24 22:46: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 08EB0106566B; Wed, 24 Aug 2011 22:46:19 +0000 (UTC) (envelope-from mav@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id EC3318FC0C; Wed, 24 Aug 2011 22:46:18 +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 p7OMkI0Z073782; Wed, 24 Aug 2011 22:46:18 GMT (envelope-from mav@svn.freebsd.org) Received: (from mav@localhost) by svn.freebsd.org (8.14.4/8.14.4/Submit) id p7OMkIQK073780; Wed, 24 Aug 2011 22:46:18 GMT (envelope-from mav@svn.freebsd.org) Message-Id: <201108242246.p7OMkIQK073780@svn.freebsd.org> From: Alexander Motin Date: Wed, 24 Aug 2011 22:46:18 +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: r225155 - projects/zfsd/head/sys/cam/scsi 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, 24 Aug 2011 22:46:19 -0000 Author: mav Date: Wed Aug 24 22:46:18 2011 New Revision: 225155 URL: http://svn.freebsd.org/changeset/base/225155 Log: Completely rewrite SAF-TE write operations, using new fsm-based model. Change some SES emulation aspects, trying to be closer to the specs. Modified: projects/zfsd/head/sys/cam/scsi/scsi_enc_safte.c Modified: projects/zfsd/head/sys/cam/scsi/scsi_enc_safte.c ============================================================================== --- projects/zfsd/head/sys/cam/scsi/scsi_enc_safte.c Wed Aug 24 22:14:55 2011 (r225154) +++ projects/zfsd/head/sys/cam/scsi/scsi_enc_safte.c Wed Aug 24 22:46:18 2011 (r225155) @@ -53,10 +53,7 @@ __FBSDID("$FreeBSD: head/sys/cam/scsi/sc * SAF-TE Type Device Emulation */ -static int set_elm_status_sel(enc_softc_t *, encioc_elm_status_t *, int); static int wrbuf16(enc_softc_t *, uint8_t, uint8_t, uint8_t, uint8_t, int); -static void wrslot_stat(enc_softc_t *, int); -static int perf_slotop(enc_softc_t *, uint8_t, uint8_t, int); #define ALL_ENC_STAT (SES_ENCSTAT_CRITICAL | SES_ENCSTAT_UNRECOV | \ SES_ENCSTAT_NONCRITICAL | SES_ENCSTAT_INFO) @@ -90,14 +87,17 @@ typedef enum { SAFTE_UPDATE_READGFLAGS, SAFTE_UPDATE_READENCSTATUS, SAFTE_UPDATE_READSLOTSTATUS, + SAFTE_PROCESS_CONTROL_REQS, SAFTE_NUM_UPDATE_STATES } safte_update_action; static fsm_fill_handler_t safte_fill_read_buf_io; +static fsm_fill_handler_t safte_fill_control_request; static fsm_done_handler_t safte_process_config; static fsm_done_handler_t safte_process_gflags; static fsm_done_handler_t safte_process_status; static fsm_done_handler_t safte_process_slotstatus; +static fsm_done_handler_t safte_process_control_request; static struct enc_fsm_state enc_fsm_states[SAFTE_NUM_UPDATE_STATES] = { @@ -137,10 +137,30 @@ static struct enc_fsm_state enc_fsm_stat safte_fill_read_buf_io, safte_process_slotstatus, enc_error + }, + { + "SAFTE_PROCESS_CONTROL_REQS", + 0, + SCSZ, + 60 * 1000, + safte_fill_control_request, + safte_process_control_request, + enc_error } }; -#define NPSEUDO_ALARM 1 +typedef struct safte_control_request { + int elm_idx; + uint8_t elm_stat[4]; + int result; + TAILQ_ENTRY(safte_control_request) links; +} safte_control_request_t; +TAILQ_HEAD(safte_control_reqlist, safte_control_request); +typedef struct safte_control_reqlist safte_control_reqlist_t; +enum { + SES_SETSTATUS_ENC_IDX = -1 +}; + struct scfg { /* * Cached Configuration @@ -151,7 +171,6 @@ struct scfg { uint8_t DoorLock; /* Door Lock Installed */ uint8_t Ntherm; /* Number of Temperature Sensors */ uint8_t Nspkrs; /* Number of Speakers */ - uint8_t Nalarm; /* Number of Alarms (at least one) */ uint8_t Ntstats; /* Number of Thermostats */ /* * Cached Flag Bytes for Global Status @@ -164,6 +183,15 @@ struct scfg { uint8_t pwroff; uint8_t slotoff; #define SAFT_ALARM_OFFSET(cc) (cc)->slotoff - 1 + + encioc_enc_status_t adm_status; + encioc_enc_status_t enc_status; + encioc_enc_status_t slot_status; + + safte_control_reqlist_t requests; + safte_control_request_t *current_request; + int current_request_stage; + int current_request_stages; }; #define SAFT_FLG1_ALARM 0x1 @@ -233,7 +261,6 @@ safte_process_config(enc_softc_t *enc, s cfg->DoorLock = buf[3]; cfg->Ntherm = buf[4]; cfg->Nspkrs = buf[5]; - cfg->Nalarm = NPSEUDO_ALARM; if (xfer_len >= 7) cfg->Ntstats = buf[6] & 0x0f; else @@ -244,8 +271,7 @@ safte_process_config(enc_softc_t *enc, s cfg->Nspkrs, cfg->Ntstats); enc->enc_cache.nelms = cfg->Nfans + cfg->Npwr + cfg->Nslots + - cfg->DoorLock + cfg->Ntherm + cfg->Nspkrs + cfg->Ntstats + 1 + - NPSEUDO_ALARM; + cfg->DoorLock + cfg->Ntherm + cfg->Nspkrs + cfg->Ntstats + 1; ENC_FREE_AND_NULL(enc->enc_cache.elm_map); enc->enc_cache.elm_map = ENC_MALLOCZ(enc->enc_cache.nelms * sizeof(enc_element_t)); @@ -266,13 +292,12 @@ safte_process_config(enc_softc_t *enc, s enc->enc_cache.elm_map[r++].enctype = ELMTYP_POWER; for (i = 0; i < cfg->DoorLock; i++) enc->enc_cache.elm_map[r++].enctype = ELMTYP_DOORLOCK; - for (i = 0; i < cfg->Nspkrs; i++) + if (cfg->Nspkrs > 0) enc->enc_cache.elm_map[r++].enctype = ELMTYP_ALARM; for (i = 0; i < cfg->Ntherm; i++) enc->enc_cache.elm_map[r++].enctype = ELMTYP_THERM; for (i = 0; i <= cfg->Ntstats; i++) enc->enc_cache.elm_map[r++].enctype = ELMTYP_THERM; - enc->enc_cache.elm_map[r++].enctype = ELMTYP_ALARM; cfg->slotoff = (uint8_t) r; for (i = 0; i < cfg->Nslots; i++) enc->enc_cache.elm_map[r++].enctype = ELMTYP_DEVICE; @@ -299,6 +324,12 @@ safte_process_gflags(enc_softc_t *enc, s cfg->flag1 = buf[1]; cfg->flag2 = buf[2]; + cfg->adm_status = 0; + if (cfg->flag1 & SAFT_FLG1_GLOBFAIL) + cfg->adm_status |= SES_ENCSTAT_CRITICAL; + else if (cfg->flag1 & SAFT_FLG1_GLOBWARN) + cfg->adm_status |= SES_ENCSTAT_NONCRITICAL; + return (0); } @@ -317,6 +348,7 @@ safte_process_status(enc_softc_t *enc, s return (ENXIO); oid = r = 0; + cfg->enc_status = 0; for (nitems = i = 0; i < cfg->Nfans; i++) { SAFT_BAIL(r, xfer_len); @@ -328,16 +360,16 @@ safte_process_status(enc_softc_t *enc, s */ cache->elm_map[oid].encstat[1] = 0; /* resvd */ cache->elm_map[oid].encstat[2] = 0; /* resvd */ + if (cfg->flag1 & SAFT_FLG1_ENCFANFAIL) + cache->elm_map[oid].encstat[3] |= 0x40; + else + cache->elm_map[oid].encstat[3] &= ~0x40; switch ((int)buf[r]) { case 0: nitems++; cache->elm_map[oid].encstat[0] = SES_OBJSTAT_OK; - /* - * We could get fancier and cache - * fan speeds that we have set, but - * that isn't done now. - */ - cache->elm_map[oid].encstat[3] = 7; + if ((cache->elm_map[oid].encstat[3] & 0x37) == 0) + cache->elm_map[oid].encstat[3] |= 0x27; break; case 1: @@ -346,35 +378,37 @@ safte_process_status(enc_softc_t *enc, s /* * FAIL and FAN STOPPED synthesized */ - cache->elm_map[oid].encstat[3] = 0x40; + cache->elm_map[oid].encstat[3] |= 0x10; + cache->elm_map[oid].encstat[3] &= ~0x07; /* * Enclosure marked with CRITICAL error * if only one fan or no thermometers, * else the NONCRITICAL error is set. */ if (cfg->Nfans == 1 || (cfg->Ntherm + cfg->Ntstats) == 0) - cache->enc_status |= SES_ENCSTAT_CRITICAL; + cfg->enc_status |= SES_ENCSTAT_CRITICAL; else - cache->enc_status |= SES_ENCSTAT_NONCRITICAL; + cfg->enc_status |= SES_ENCSTAT_NONCRITICAL; break; case 2: cache->elm_map[oid].encstat[0] = SES_OBJSTAT_NOTINSTALLED; - cache->elm_map[oid].encstat[3] = 0; + cache->elm_map[oid].encstat[3] |= 0x10; + cache->elm_map[oid].encstat[3] &= ~0x07; /* * Enclosure marked with CRITICAL error * if only one fan or no thermometers, * else the NONCRITICAL error is set. */ if (cfg->Nfans == 1) - cache->enc_status |= SES_ENCSTAT_CRITICAL; + cfg->enc_status |= SES_ENCSTAT_CRITICAL; else - cache->enc_status |= SES_ENCSTAT_NONCRITICAL; + cfg->enc_status |= SES_ENCSTAT_NONCRITICAL; break; case 0x80: cache->elm_map[oid].encstat[0] = SES_OBJSTAT_UNKNOWN; cache->elm_map[oid].encstat[3] = 0; - cache->enc_status |= SES_ENCSTAT_INFO; + cfg->enc_status |= SES_ENCSTAT_INFO; break; default: cache->elm_map[oid].encstat[0] = SES_OBJSTAT_UNSUPPORTED; @@ -390,10 +424,8 @@ safte_process_status(enc_softc_t *enc, s * No matter how you cut it, no cooling elements when there * should be some there is critical. */ - if (cfg->Nfans && nitems == 0) { - cache->enc_status |= SES_ENCSTAT_CRITICAL; - } - + if (cfg->Nfans && nitems == 0) + cfg->enc_status |= SES_ENCSTAT_CRITICAL; for (i = 0; i < cfg->Npwr; i++) { SAFT_BAIL(r, xfer_len); @@ -408,24 +440,24 @@ safte_process_status(enc_softc_t *enc, s case 0x01: /* pws operational and off */ cache->elm_map[oid].encstat[0] = SES_OBJSTAT_OK; cache->elm_map[oid].encstat[3] = 0x10; - cache->enc_status |= SES_ENCSTAT_INFO; + cfg->enc_status |= SES_ENCSTAT_INFO; break; case 0x10: /* pws is malfunctioning and commanded on */ cache->elm_map[oid].encstat[0] = SES_OBJSTAT_CRIT; cache->elm_map[oid].encstat[3] = 0x61; - cache->enc_status |= SES_ENCSTAT_NONCRITICAL; + cfg->enc_status |= SES_ENCSTAT_NONCRITICAL; break; case 0x11: /* pws is malfunctioning and commanded off */ cache->elm_map[oid].encstat[0] = SES_OBJSTAT_NONCRIT; cache->elm_map[oid].encstat[3] = 0x51; - cache->enc_status |= SES_ENCSTAT_NONCRITICAL; + cfg->enc_status |= SES_ENCSTAT_NONCRITICAL; break; case 0x20: /* pws is not present */ cache->elm_map[oid].encstat[0] = SES_OBJSTAT_NOTINSTALLED; cache->elm_map[oid].encstat[3] = 0; - cache->enc_status |= SES_ENCSTAT_INFO; + cfg->enc_status |= SES_ENCSTAT_INFO; break; case 0x21: /* pws is present */ /* @@ -437,7 +469,7 @@ safte_process_status(enc_softc_t *enc, s case 0x80: /* Unknown or Not Reportable Status */ cache->elm_map[oid].encstat[0] = SES_OBJSTAT_UNKNOWN; cache->elm_map[oid].encstat[3] = 0; - cache->enc_status |= SES_ENCSTAT_INFO; + cfg->enc_status |= SES_ENCSTAT_INFO; break; default: ENC_LOG(enc, "unknown power supply %d status (0x%x)\n", @@ -449,9 +481,13 @@ safte_process_status(enc_softc_t *enc, s } /* - * Skip over Slot SCSI IDs + * Copy Slot SCSI IDs */ - r += cfg->Nslots; + for (i = 0; i < cfg->Nslots; i++) { + SAFT_BAIL(r, xfer_len); + cache->elm_map[cfg->slotoff + i].encstat[1] = buf[r]; + r++; + } /* * We always have doorlock status, no matter what, @@ -478,7 +514,7 @@ safte_process_status(enc_softc_t *enc, s case 0x80: cache->elm_map[oid].encstat[0] = SES_OBJSTAT_UNKNOWN; cache->elm_map[oid].encstat[3] = 0; - cache->enc_status |= SES_ENCSTAT_INFO; + cfg->enc_status |= SES_ENCSTAT_INFO; break; default: cache->elm_map[oid].encstat[0] = @@ -497,24 +533,12 @@ safte_process_status(enc_softc_t *enc, s */ SAFT_BAIL(r, xfer_len); if (cfg->Nspkrs) { + cache->elm_map[oid].encstat[0] = SES_OBJSTAT_OK; cache->elm_map[oid].encstat[1] = 0; cache->elm_map[oid].encstat[2] = 0; - if (buf[r] == 1) { - /* - * We need to cache tone urgency indicators. - * Someday. - */ - cache->elm_map[oid].encstat[0] = SES_OBJSTAT_NONCRIT; - cache->elm_map[oid].encstat[3] = 0x8; - cache->enc_status |= SES_ENCSTAT_NONCRITICAL; - } else if (buf[r] == 0) { - cache->elm_map[oid].encstat[0] = SES_OBJSTAT_OK; - cache->elm_map[oid].encstat[3] = 0; - } else { - cache->elm_map[oid].encstat[0] = SES_OBJSTAT_UNSUPPORTED; - cache->elm_map[oid].encstat[3] = 0; - ENC_LOG(enc, "unknown spkr status 0x%x\n", - buf[r] & 0xff); + if (buf[r] == 0) { + cache->elm_map[oid].encstat[0] |= SESCTL_DISABLE; + cache->elm_map[oid].encstat[3] |= 0x40; } cache->elm_map[oid++].svalid = 1; } @@ -569,7 +593,7 @@ safte_process_status(enc_softc_t *enc, s */ if (tempflags & (1 << i)) { cache->elm_map[oid].encstat[0] = SES_OBJSTAT_CRIT; - cache->enc_status |= SES_ENCSTAT_CRITICAL; + cfg->enc_status |= SES_ENCSTAT_CRITICAL; } else cache->elm_map[oid].encstat[0] = SES_OBJSTAT_OK; cache->elm_map[oid].encstat[1] = 0; @@ -589,7 +613,7 @@ safte_process_status(enc_softc_t *enc, s * Set 'over temperature' failure. */ cache->elm_map[oid].encstat[3] = 8; - cache->enc_status |= SES_ENCSTAT_CRITICAL; + cfg->enc_status |= SES_ENCSTAT_CRITICAL; } else { /* * We used to say 'not available' and synthesize a @@ -610,13 +634,8 @@ safte_process_status(enc_softc_t *enc, s } r += 2; - /* - * Get alarm status. - */ - cache->elm_map[oid].encstat[0] = SES_OBJSTAT_OK; - cache->elm_map[oid].encstat[3] = cache->elm_map[oid].priv; - cache->elm_map[oid++].svalid = 1; - + cache->enc_status = + cfg->enc_status | cfg->slot_status | cfg->adm_status; return (0); } @@ -628,119 +647,281 @@ safte_process_slotstatus(enc_softc_t *en uint8_t *buf = *bufp; enc_cache_t *cache = &enc->enc_cache; int oid, r, i; - uint8_t status; cfg = enc->enc_private; if (cfg == NULL) return (ENXIO); + cfg->slot_status = 0; oid = cfg->slotoff; for (r = i = 0; i < cfg->Nslots; i++, r += 4) { SAFT_BAIL(r+3, xfer_len); - cache->elm_map[oid].encstat[0] = SES_OBJSTAT_UNSUPPORTED; - cache->elm_map[oid].encstat[1] = (uint8_t) i; - cache->elm_map[oid].encstat[2] = 0; + cache->elm_map[oid].encstat[2] &= SESCTL_RQSID; cache->elm_map[oid].encstat[3] = 0; - status = buf[r+3]; - if ((status & 0x1) == 0) { /* no device */ - cache->elm_map[oid].encstat[0] = - SES_OBJSTAT_NOTINSTALLED; + if ((buf[r+3] & 0x01) == 0) { /* no device */ + cache->elm_map[oid].encstat[0] = SES_OBJSTAT_NOTINSTALLED; + } else if (buf[r+0] & 0x02) { + cache->elm_map[oid].encstat[0] = SES_OBJSTAT_CRIT; + cfg->slot_status |= SES_ENCSTAT_CRITICAL; + } else if (buf[r+0] & 0x40) { + cache->elm_map[oid].encstat[0] = SES_OBJSTAT_NONCRIT; + cfg->slot_status |= SES_ENCSTAT_NONCRITICAL; } else { cache->elm_map[oid].encstat[0] = SES_OBJSTAT_OK; } - if (status & 0x2) { - cache->elm_map[oid].encstat[2] = 0x8; - } - if ((status & 0x4) == 0) { - cache->elm_map[oid].encstat[3] = 0x10; + if (buf[r+3] & 0x2) { + if (buf[r+3] & 0x01) + cache->elm_map[oid].encstat[2] |= SESCTL_RQSRMV; + else + cache->elm_map[oid].encstat[2] |= SESCTL_RQSINS; } + if ((buf[r+3] & 0x04) == 0) + cache->elm_map[oid].encstat[3] |= SESCTL_DEVOFF; + if (buf[r+0] & 0x02) + cache->elm_map[oid].encstat[3] |= SESCTL_RQSFLT; + if (buf[r+0] & 0x40) + cache->elm_map[oid].encstat[0] |= SESCTL_PRDFAIL; cache->elm_map[oid++].svalid = 1; } + + cache->enc_status = + cfg->enc_status | cfg->slot_status | cfg->adm_status; return (0); } static int -set_elm_status_sel(enc_softc_t *enc, encioc_elm_status_t *elms, int slp) +safte_fill_control_request(enc_softc_t *enc, struct enc_fsm_state *state, + union ccb *ccb, uint8_t *buf) { - int idx; - enc_element_t *ep; - struct scfg *cc = enc->enc_private; + struct scfg *cfg; + enc_element_t *ep, *ep1; + safte_control_request_t *req; + int i, idx, xfer_len; - if (cc == NULL) - return (0); + cfg = enc->enc_private; + if (cfg == NULL) + return (ENXIO); - idx = (int)elms->elm_idx; - ep = &enc->enc_cache.elm_map[idx]; + if (enc->enc_cache.nelms == 0) { + enc_update_request(enc, SAFTE_UPDATE_READCONFIG); + return (-1); + } - switch (ep->enctype) { - case ELMTYP_DEVICE: - if (elms->cstat[0] & SESCTL_PRDFAIL) { - ep->priv |= 0x40; - } else { - ep->priv &= ~0x40; - } - /* SESCTL_RSTSWAP has no correspondence in SAF-TE */ - if (elms->cstat[0] & SESCTL_DISABLE) { - ep->priv |= 0x80; - /* - * Hmm. Try to set the 'No Drive' flag. - * Maybe that will count as a 'disable'. - */ - } else { - ep->priv &= ~0x80; - } - if (ep->priv & 0xc6) { - ep->priv &= ~0x1; - } else { - ep->priv |= 0x1; /* no errors */ - } - wrslot_stat(enc, slp); - break; - case ELMTYP_POWER: - /* - * Okay- the only one that makes sense here is to - * do the 'disable' for a power supply. - */ - if (elms->cstat[0] & SESCTL_DISABLE) { - (void) wrbuf16(enc, SAFTE_WT_ACTPWS, - idx - cc->pwroff, 0, 0, slp); - } - break; - case ELMTYP_FAN: - /* - * Okay- the only one that makes sense here is to - * set fan speed to zero on disable. - */ - if (elms->cstat[0] & SESCTL_DISABLE) { - /* remember- fans are the first items, so idx works */ - (void) wrbuf16(enc, SAFTE_WT_FANSPD, idx, 0, 0, slp); - } - break; - case ELMTYP_DOORLOCK: - /* - * Well, we can 'disable' the lock. - */ - if (elms->cstat[0] & SESCTL_DISABLE) { - cc->flag2 &= ~SAFT_FLG2_LOCKDOOR; - (void) wrbuf16(enc, SAFTE_WT_GLOBAL, cc->flag1, - cc->flag2, 0, slp); - } - break; - case ELMTYP_ALARM: - /* - * Well, we can 'disable' the alarm. - */ - if (elms->cstat[0] & SESCTL_DISABLE) { - cc->flag2 &= ~SAFT_FLG1_ALARM; - ep->priv |= 0x40; /* Muted */ - (void) wrbuf16(enc, SAFTE_WT_GLOBAL, cc->flag1, - cc->flag2, 0, slp); + if (cfg->current_request == NULL) { + cfg->current_request = TAILQ_FIRST(&cfg->requests); + TAILQ_REMOVE(&cfg->requests, cfg->current_request, links); + cfg->current_request_stage = 0; + cfg->current_request_stages = 1; + } + req = cfg->current_request; + + idx = (int)req->elm_idx; + if (req->elm_idx == SES_SETSTATUS_ENC_IDX) { + cfg->adm_status = req->elm_stat[0] & ALL_ENC_STAT; + cfg->flag1 &= ~(SAFT_FLG1_GLOBFAIL|SAFT_FLG1_GLOBWARN); + if (req->elm_stat[0] & (SES_ENCSTAT_CRITICAL|SES_ENCSTAT_UNRECOV)) + cfg->flag1 |= SAFT_FLG1_GLOBFAIL; + else if (req->elm_stat[0] & SES_ENCSTAT_NONCRITICAL) + cfg->flag1 |= SAFT_FLG1_GLOBWARN; + buf[0] = SAFTE_WT_GLOBAL; + buf[1] = cfg->flag1; + buf[2] = cfg->flag2; + buf[3] = 0; + xfer_len = 16; + } else { + ep = &enc->enc_cache.elm_map[idx]; + + switch (ep->enctype) { + case ELMTYP_DEVICE: + switch (cfg->current_request_stage) { + case 0: + ep->priv = 0; + if (req->elm_stat[0] & SESCTL_PRDFAIL) + ep->priv |= 0x40; + if (req->elm_stat[3] & SESCTL_RQSFLT) + ep->priv |= 0x02; + if ((ep->priv & 0x46) == 0) + ep->priv |= 0x01; /* no errors */ + + buf[0] = SAFTE_WT_DSTAT; + for (i = 0; i < cfg->Nslots; i++) { + ep1 = &enc->enc_cache.elm_map[cfg->slotoff + i]; + buf[1 + (3 * i)] = ep1->priv; + buf[2 + (3 * i)] = ep1->priv >> 8; + } + xfer_len = cfg->Nslots * 3 + 1; +#define DEVON(x) (!(((x)[2] & SESCTL_RQSINS) | \ + ((x)[2] & SESCTL_RQSRMV) | \ + ((x)[3] & SESCTL_DEVOFF))) + if (DEVON(req->elm_stat) != DEVON(ep->encstat)) + cfg->current_request_stages++; +#define IDON(x) (!!((x)[2] & SESCTL_RQSID)) + if (IDON(req->elm_stat) != IDON(ep->encstat)) + cfg->current_request_stages++; + break; + case 1: + case 2: + buf[0] = SAFTE_WT_SLTOP; + buf[1] = idx - cfg->slotoff; + if (cfg->current_request_stage == 1 && + DEVON(req->elm_stat) != DEVON(ep->encstat)) { + if (DEVON(req->elm_stat)) + buf[2] = 0x01; + else + buf[2] = 0x02; + } else { + if (IDON(req->elm_stat)) + buf[2] = 0x04; + else + buf[2] = 0x00; + ep->encstat[2] &= ~SESCTL_RQSID; + ep->encstat[2] |= req->elm_stat[2] & + SESCTL_RQSID; + } + xfer_len = 64; + break; + default: + return (EINVAL); + } + break; + case ELMTYP_POWER: + cfg->current_request_stages = 2; + switch (cfg->current_request_stage) { + case 0: + if (req->elm_stat[3] & SESCTL_RQSTFAIL) { + cfg->flag1 |= SAFT_FLG1_ENCPWRFAIL; + } else { + cfg->flag1 &= ~SAFT_FLG1_ENCPWRFAIL; + } + buf[0] = SAFTE_WT_GLOBAL; + buf[1] = cfg->flag1; + buf[2] = cfg->flag2; + buf[3] = 0; + xfer_len = 16; + break; + case 1: + buf[0] = SAFTE_WT_ACTPWS; + buf[1] = idx - cfg->pwroff; + if (req->elm_stat[3] & SESCTL_RQSTON) + buf[2] = 0x01; + else + buf[2] = 0x00; + buf[3] = 0; + xfer_len = 16; + default: + return (EINVAL); + } + break; + case ELMTYP_FAN: + if ((req->elm_stat[3] & 0x7) != 0) + cfg->current_request_stages = 2; + switch (cfg->current_request_stage) { + case 0: + if (req->elm_stat[3] & SESCTL_RQSTFAIL) + cfg->flag1 |= SAFT_FLG1_ENCFANFAIL; + else + cfg->flag1 &= ~SAFT_FLG1_ENCFANFAIL; + buf[0] = SAFTE_WT_GLOBAL; + buf[1] = cfg->flag1; + buf[2] = cfg->flag2; + buf[3] = 0; + xfer_len = 16; + break; + case 1: + buf[0] = SAFTE_WT_FANSPD; + buf[1] = idx; + if (req->elm_stat[3] & SESCTL_RQSTON) { + if ((req->elm_stat[3] & 0x7) == 7) + buf[2] = 4; + else if ((req->elm_stat[3] & 0x7) >= 5) + buf[2] = 3; + else if ((req->elm_stat[3] & 0x7) >= 3) + buf[2] = 2; + else + buf[2] = 1; + } else + buf[2] = 0; + buf[3] = 0; + xfer_len = 16; + ep->encstat[3] = req->elm_stat[3] & 0x67; + default: + return (EINVAL); + } + break; + case ELMTYP_DOORLOCK: + if (req->elm_stat[3] & 0x1) + cfg->flag2 &= ~SAFT_FLG2_LOCKDOOR; + else + cfg->flag2 |= SAFT_FLG2_LOCKDOOR; + buf[0] = SAFTE_WT_GLOBAL; + buf[1] = cfg->flag1; + buf[2] = cfg->flag2; + buf[3] = 0; + xfer_len = 16; + break; + case ELMTYP_ALARM: + if ((req->elm_stat[0] & SESCTL_DISABLE) || + (req->elm_stat[3] & 0x40)) { + cfg->flag2 &= ~SAFT_FLG1_ALARM; + } else if ((req->elm_stat[3] & 0x0f) != 0) { + cfg->flag2 |= SAFT_FLG1_ALARM; + } else { + cfg->flag2 &= ~SAFT_FLG1_ALARM; + } + buf[0] = SAFTE_WT_GLOBAL; + buf[1] = cfg->flag1; + buf[2] = cfg->flag2; + buf[3] = 0; + xfer_len = 16; + ep->encstat[3] = req->elm_stat[3]; + break; + default: + return (EINVAL); } - break; - default: - break; } - ep->svalid = 0; + + if (enc->enc_type == ENC_SEMB_SAFT) { + semb_write_buffer(&ccb->ataio, /*retries*/5, + enc_done, MSG_SIMPLE_Q_TAG, + buf, xfer_len, state->timeout); + } else { + scsi_write_buffer(&ccb->csio, /*retries*/5, + enc_done, MSG_SIMPLE_Q_TAG, 1, + 0, 0, buf, xfer_len, + SSD_FULL_SIZE, state->timeout); + } + return (0); +} + +static int +safte_process_control_request(enc_softc_t *enc, struct enc_fsm_state *state, + union ccb *ccb, uint8_t **bufp, int xfer_len) +{ + struct scfg *cfg; + safte_control_request_t *req; + int idx, type; + + cfg = enc->enc_private; + if (cfg == NULL) + return (ENXIO); + + if (++cfg->current_request_stage >= cfg->current_request_stages) { + req = cfg->current_request; + idx = req->elm_idx; + if (idx == SES_SETSTATUS_ENC_IDX) + type = -1; + else + type = enc->enc_cache.elm_map[idx].enctype; + if (type == ELMTYP_DEVICE) + enc_update_request(enc, SAFTE_UPDATE_READSLOTSTATUS); + else + enc_update_request(enc, SAFTE_UPDATE_READENCSTATUS); + cfg->current_request = NULL; + req->result = 0; + wakeup(req); + } else { + enc_update_request(enc, SAFTE_PROCESS_CONTROL_REQS); + } return (0); } @@ -775,79 +956,6 @@ wrbuf16(enc_softc_t *enc, uint8_t op, ui return (err); } -/* - * This function updates the status byte for the device slot described. - * - * Since this is an optional SAF-TE command, there's no point in - * returning an error. - */ -static void -wrslot_stat(enc_softc_t *enc, int slp) -{ - int i, amt; - enc_element_t *ep; - char cdb[10], *sdata; - struct scfg *cc = enc->enc_private; - - if (cc == NULL) - return; - - ENC_DLOG(enc, "saf_wrslot\n"); - cdb[0] = WRITE_BUFFER; - cdb[1] = 1; - cdb[2] = 0; - cdb[3] = 0; - cdb[4] = 0; - cdb[5] = 0; - cdb[6] = 0; - cdb[7] = 0; - cdb[8] = cc->Nslots * 3 + 1; - cdb[9] = 0; - - sdata = ENC_MALLOCZ(cc->Nslots * 3 + 1); - if (sdata == NULL) - return; - - sdata[0] = SAFTE_WT_DSTAT; - for (i = 0; i < cc->Nslots; i++) { - ep = &enc->enc_cache.elm_map[cc->slotoff + i]; - ENC_DLOG(enc, "saf_wrslot %d <- %x\n", i, ep->priv & 0xff); - sdata[1 + (3 * i)] = ep->priv & 0xff; - } - amt = -(cc->Nslots * 3 + 1); - (void) enc_runcmd(enc, cdb, 10, sdata, &amt); - ENC_FREE(sdata); -} - -/* - * This function issues the "PERFORM SLOT OPERATION" command. - */ -static int -perf_slotop(enc_softc_t *enc, uint8_t slot, uint8_t opflag, int slp) -{ - int err, amt; - char *sdata; - struct scfg *cc = enc->enc_private; - static char cdb[10] = - { WRITE_BUFFER, 1, 0, 0, 0, 0, 0, 0, SAFT_SCRATCH, 0 }; - - if (cc == NULL) - return (0); - - sdata = ENC_MALLOCZ(SAFT_SCRATCH); - if (sdata == NULL) - return (ENOMEM); - - sdata[0] = SAFTE_WT_SLTOP; - sdata[1] = slot; - sdata[2] = opflag; - ENC_DLOG(enc, "saf_slotop slot %d op %x\n", slot, opflag); - amt = -SAFT_SCRATCH; - err = enc_runcmd(enc, cdb, 10, sdata, &amt); - ENC_FREE(sdata); - return (err); -} - static void safte_softc_cleanup(struct cam_periph *periph) { @@ -882,26 +990,23 @@ safte_get_enc_status(enc_softc_t *enc, i } static int -safte_set_enc_status(enc_softc_t *enc, uint8_t encstat, int slpflg) +safte_set_enc_status(enc_softc_t *enc, uint8_t encstat, int slpflag) { - struct scfg *cc = enc->enc_private; - if (cc == NULL) - return (0); - /* - * Since SAF-TE devices aren't necessarily sticky in terms - * of state, make our soft copy of enclosure status 'sticky'- - * that is, things set in enclosure status stay set (as implied - * by conditions set in reading object status) until cleared. - */ - enc->enc_cache.enc_status &= ~ALL_ENC_STAT; - enc->enc_cache.enc_status |= (encstat & ALL_ENC_STAT); - cc->flag1 &= ~(SAFT_FLG1_ALARM|SAFT_FLG1_GLOBFAIL|SAFT_FLG1_GLOBWARN); - if ((encstat & (SES_ENCSTAT_CRITICAL|SES_ENCSTAT_UNRECOV)) != 0) { - cc->flag1 |= SAFT_FLG1_ALARM|SAFT_FLG1_GLOBFAIL; - } else if ((encstat & SES_ENCSTAT_NONCRITICAL) != 0) { - cc->flag1 |= SAFT_FLG1_GLOBWARN; - } - return (wrbuf16(enc, SAFTE_WT_GLOBAL, cc->flag1, cc->flag2, 0, slpflg)); + struct scfg *cfg; + safte_control_request_t req; + + cfg = enc->enc_private; + if (cfg == NULL) + return (ENXIO); + + req.elm_idx = SES_SETSTATUS_ENC_IDX; + req.elm_stat[0] = encstat & 0xf; + + TAILQ_INSERT_TAIL(&cfg->requests, &req, links); + enc_update_request(enc, SAFTE_PROCESS_CONTROL_REQS); + cam_periph_sleep(enc->periph, &req, PUSER, "encstat", 0); + + return (req.result); } static int @@ -916,150 +1021,28 @@ safte_get_elm_status(enc_softc_t *enc, e return (0); } - static int -safte_set_elm_status(enc_softc_t *enc, encioc_elm_status_t *elms, int slp) +safte_set_elm_status(enc_softc_t *enc, encioc_elm_status_t *elms, int slpflag) { - int idx, err; - enc_element_t *ep; - struct scfg *cc; - + struct scfg *cfg; + safte_control_request_t req; - ENC_DLOG(enc, "safte_set_objstat(%d): %x %x %x %x\n", - (int)elms->elm_idx, elms->cstat[0], elms->cstat[1], elms->cstat[2], - elms->cstat[3]); + cfg = enc->enc_private; + if (cfg == NULL) + return (ENXIO); - /* - * If this is clear, we don't do diddly. - */ - if ((elms->cstat[0] & SESCTL_CSEL) == 0) { + /* If this is clear, we don't do diddly. */ + if ((elms->cstat[0] & SESCTL_CSEL) == 0) return (0); - } - err = 0; - /* - * Check to see if the common bits are set and do them first. - */ - if (elms->cstat[0] & ~SESCTL_CSEL) { - err = set_elm_status_sel(enc, elms, slp); - if (err) - return (err); - } - - cc = enc->enc_private; - if (cc == NULL) - return (0); + req.elm_idx = elms->elm_idx; + memcpy(&req.elm_stat, elms->cstat, sizeof(req.elm_stat)); - idx = (int)elms->elm_idx; - ep = &enc->enc_cache.elm_map[idx]; + TAILQ_INSERT_TAIL(&cfg->requests, &req, links); + enc_update_request(enc, SAFTE_PROCESS_CONTROL_REQS); + cam_periph_sleep(enc->periph, &req, PUSER, "encstat", 0); - switch (ep->enctype) { - case ELMTYP_DEVICE: - { - uint8_t slotop = 0; - /* - * XXX: I should probably cache the previous state - * XXX: of SESCTL_DEVOFF so that when it goes from - * XXX: true to false I can then set PREPARE FOR OPERATION - * XXX: flag in PERFORM SLOT OPERATION write buffer command. - */ - if (elms->cstat[2] & (SESCTL_RQSINS|SESCTL_RQSRMV)) { - slotop |= 0x2; - } - if (elms->cstat[2] & SESCTL_RQSID) { - slotop |= 0x4; - } - err = perf_slotop(enc, (uint8_t) idx - (uint8_t) cc->slotoff, - slotop, slp); - if (err) - return (err); - if (elms->cstat[3] & SESCTL_RQSFLT) { - ep->priv |= 0x2; - } else { - ep->priv &= ~0x2; - } - if (ep->priv & 0xc6) { - ep->priv &= ~0x1; - } else { - ep->priv |= 0x1; /* no errors */ - } - wrslot_stat(enc, slp); - break; - } - case ELMTYP_POWER: - if (elms->cstat[3] & SESCTL_RQSTFAIL) { - cc->flag1 |= SAFT_FLG1_ENCPWRFAIL; - } else { - cc->flag1 &= ~SAFT_FLG1_ENCPWRFAIL; - } - err = wrbuf16(enc, SAFTE_WT_GLOBAL, cc->flag1, - cc->flag2, 0, slp); - if (err) - return (err); - if (elms->cstat[3] & SESCTL_RQSTON) { - (void) wrbuf16(enc, SAFTE_WT_ACTPWS, - idx - cc->pwroff, 0, 0, slp); - } else { - (void) wrbuf16(enc, SAFTE_WT_ACTPWS, - idx - cc->pwroff, 0, 1, slp); - } - break; - case ELMTYP_FAN: - if (elms->cstat[3] & SESCTL_RQSTFAIL) { - cc->flag1 |= SAFT_FLG1_ENCFANFAIL; - } else { - cc->flag1 &= ~SAFT_FLG1_ENCFANFAIL; - } - err = wrbuf16(enc, SAFTE_WT_GLOBAL, cc->flag1, - cc->flag2, 0, slp); - if (err) - return (err); - if (elms->cstat[3] & SESCTL_RQSTON) { - uint8_t fsp; - if ((elms->cstat[3] & 0x7) == 7) { - fsp = 4; - } else if ((elms->cstat[3] & 0x7) == 6) { - fsp = 3; - } else if ((elms->cstat[3] & 0x7) == 4) { - fsp = 2; - } else { - fsp = 1; - } - (void) wrbuf16(enc, SAFTE_WT_FANSPD, idx, fsp, 0, slp); - } else { - (void) wrbuf16(enc, SAFTE_WT_FANSPD, idx, 0, 0, slp); - } - break; - case ELMTYP_DOORLOCK: - if (elms->cstat[3] & 0x1) { - cc->flag2 &= ~SAFT_FLG2_LOCKDOOR; - } else { - cc->flag2 |= SAFT_FLG2_LOCKDOOR; - } - (void) wrbuf16(enc, SAFTE_WT_GLOBAL, cc->flag1, - cc->flag2, 0, slp); - break; - case ELMTYP_ALARM: - /* - * On all nonzero but the 'muted' bit, we turn on the alarm, - */ - elms->cstat[3] &= ~0xa; - if (elms->cstat[3] & 0x40) { - cc->flag2 &= ~SAFT_FLG1_ALARM; - } else if (elms->cstat[3] != 0) { - cc->flag2 |= SAFT_FLG1_ALARM; - } else { - cc->flag2 &= ~SAFT_FLG1_ALARM; - } - ep->priv = elms->cstat[3]; - (void) wrbuf16(enc, SAFTE_WT_GLOBAL, cc->flag1, - cc->flag2, 0, slp); - break; - default: - break; - } *** DIFF OUTPUT TRUNCATED AT 1000 LINES *** From owner-svn-src-projects@FreeBSD.ORG Wed Aug 24 23:33:36 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 119501065672; Wed, 24 Aug 2011 23:33:36 +0000 (UTC) (envelope-from mdf356@gmail.com) Received: from mail-vw0-f54.google.com (mail-vw0-f54.google.com [209.85.212.54]) by mx1.freebsd.org (Postfix) with ESMTP id B21F88FC12; Wed, 24 Aug 2011 23:33:35 +0000 (UTC) Received: by vws18 with SMTP id 18so1957095vws.13 for ; Wed, 24 Aug 2011 16:33:35 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma; h=mime-version:sender:in-reply-to:references:date :x-google-sender-auth:message-id:subject:from:to:content-type :content-transfer-encoding; bh=ndVZ1C5+JuOALNP1vuh5/JH+TBBuMUIm/A++D5ptFzI=; b=pcc47OXSrEAdwOc3XbkmvmKx6u3moWeu9MwS0L/rDuetdc33eX04TUdG5MNjqeXY8T ldUREeO5j+KEOANL4dJDTpLIESwYTL8Qzm/uA25DiFMbFsi/Bfnw17bze2A5oacrKKWG eDSJ2xbnGRSPp61na8uPpahj3Y23MjN5PO9oI= MIME-Version: 1.0 Received: by 10.52.33.145 with SMTP id r17mr5655771vdi.511.1314227364838; Wed, 24 Aug 2011 16:09:24 -0700 (PDT) Sender: mdf356@gmail.com Received: by 10.229.98.8 with HTTP; Wed, 24 Aug 2011 16:09:24 -0700 (PDT) In-Reply-To: <201108242214.p7OMEuMP072758@svn.freebsd.org> References: <201108242214.p7OMEuMP072758@svn.freebsd.org> Date: Wed, 24 Aug 2011 16:09:24 -0700 X-Google-Sender-Auth: EGWffUH5RwkRa_2Pqi0p5rzR5fE Message-ID: From: mdf@FreeBSD.org To: src-committers@freebsd.org, svn-src-projects@freebsd.org Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: quoted-printable Cc: Subject: Re: svn commit: r225154 - in projects/ino64/sys/ufs: ffs ufs 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, 24 Aug 2011 23:33:36 -0000 On Wed, Aug 24, 2011 at 3:14 PM, Matthew D Fleming wrote: > Author: mdf > Date: Wed Aug 24 22:14:55 2011 > New Revision: 225154 > URL: http://svn.freebsd.org/changeset/base/225154 > > Log: > =A0Use fixed-width types in on-disk structures. =A0This takes care of all= the > =A0ino_t references I could find that were on-disk. > > =A0GSoC r223157. > =A0Code by Gleb Kurtsou. Note that I've explicitly left all the XXXfid structs alone; when ino_t is changed to 64-bit they will use 64-bit members for inode number. The only in-tree one that may be a problem is ReiserFS which will have a 32 byte FID after compiler padding is applied. This can be reduced to 24 bytes by reordering the members. In theory, IIRC, even 32 bits is an okay FID, however I have seen a note at $WORK that NFSv2 has 32 byte file handles and BSD is using 8 bytes for the fsid. If anyone knows anything more, please let me know. For the moment I think my plan is to re-order the members of various implementations to keep them smaller, and leave it as an ino_t in the struct definition. Thanks, matthew > Modified: > =A0projects/ino64/sys/ufs/ffs/fs.h > =A0projects/ino64/sys/ufs/ufs/dinode.h > > Modified: projects/ino64/sys/ufs/ffs/fs.h > =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D > --- projects/ino64/sys/ufs/ffs/fs.h =A0 =A0 Wed Aug 24 22:07:38 2011 =A0 = =A0 =A0 =A0(r225153) > +++ projects/ino64/sys/ufs/ffs/fs.h =A0 =A0 Wed Aug 24 22:14:55 2011 =A0 = =A0 =A0 =A0(r225154) > @@ -338,7 +338,7 @@ struct fs { > =A0 =A0 =A0 =A0ufs2_daddr_t fs_csaddr; =A0 =A0 =A0 =A0 /* blk addr of cyl= grp summary area */ > =A0 =A0 =A0 =A0int64_t =A0fs_pendingblocks; =A0 =A0 =A0/* (u) blocks bein= g freed */ > =A0 =A0 =A0 =A0u_int32_t fs_pendinginodes; =A0 =A0 /* (u) inodes being fr= eed */ > - =A0 =A0 =A0 ino_t =A0 =A0fs_snapinum[FSMAXSNAP];/* list of snapshot ino= de numbers */ > + =A0 =A0 =A0 u_int32_t fs_snapinum[FSMAXSNAP];/* list of snapshot inode = numbers */ > =A0 =A0 =A0 =A0u_int32_t fs_avgfilesize; =A0 =A0 =A0 /* expected average = file size */ > =A0 =A0 =A0 =A0u_int32_t fs_avgfpdir; =A0 =A0 =A0 =A0 =A0/* expected # of= files per directory */ > =A0 =A0 =A0 =A0int32_t =A0fs_save_cgsize; =A0 =A0 =A0 =A0/* save real cg = size to use fs_bsize */ > @@ -695,8 +695,8 @@ struct jsegrec { > =A0*/ > =A0struct jrefrec { > =A0 =A0 =A0 =A0uint32_t =A0 =A0 =A0 =A0jr_op; > - =A0 =A0 =A0 ino_t =A0 =A0 =A0 =A0 =A0 jr_ino; > - =A0 =A0 =A0 ino_t =A0 =A0 =A0 =A0 =A0 jr_parent; > + =A0 =A0 =A0 uint32_t =A0 =A0 =A0 =A0jr_ino; > + =A0 =A0 =A0 uint32_t =A0 =A0 =A0 =A0jr_parent; > =A0 =A0 =A0 =A0uint16_t =A0 =A0 =A0 =A0jr_nlink; > =A0 =A0 =A0 =A0uint16_t =A0 =A0 =A0 =A0jr_mode; > =A0 =A0 =A0 =A0off_t =A0 =A0 =A0 =A0 =A0 jr_diroff; > @@ -709,8 +709,8 @@ struct jrefrec { > =A0*/ > =A0struct jmvrec { > =A0 =A0 =A0 =A0uint32_t =A0 =A0 =A0 =A0jm_op; > - =A0 =A0 =A0 ino_t =A0 =A0 =A0 =A0 =A0 jm_ino; > - =A0 =A0 =A0 ino_t =A0 =A0 =A0 =A0 =A0 jm_parent; > + =A0 =A0 =A0 uint32_t =A0 =A0 =A0 =A0jm_ino; > + =A0 =A0 =A0 uint32_t =A0 =A0 =A0 =A0jm_parent; > =A0 =A0 =A0 =A0uint16_t =A0 =A0 =A0 =A0jm_unused; > =A0 =A0 =A0 =A0off_t =A0 =A0 =A0 =A0 =A0 jm_oldoff; > =A0 =A0 =A0 =A0off_t =A0 =A0 =A0 =A0 =A0 jm_newoff; > > Modified: projects/ino64/sys/ufs/ufs/dinode.h > =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D > --- projects/ino64/sys/ufs/ufs/dinode.h Wed Aug 24 22:07:38 2011 =A0 =A0 = =A0 =A0(r225153) > +++ projects/ino64/sys/ufs/ufs/dinode.h Wed Aug 24 22:14:55 2011 =A0 =A0 = =A0 =A0(r225154) > @@ -146,7 +146,7 @@ struct ufs2_dinode { > =A0 =A0 =A0 =A0ufs2_daddr_t =A0 =A0di_db[NDADDR]; =A0/* 112: Direct disk = blocks. */ > =A0 =A0 =A0 =A0ufs2_daddr_t =A0 =A0di_ib[NIADDR]; =A0/* 208: Indirect dis= k blocks. */ > =A0 =A0 =A0 =A0u_int64_t =A0 =A0 =A0 di_modrev; =A0 =A0 =A0/* 232: i_modr= ev for NFSv4 */ > - =A0 =A0 =A0 ino_t =A0 =A0 =A0 =A0 =A0 di_freelink; =A0 =A0/* 240: SUJ: = Next unlinked inode. */ > + =A0 =A0 =A0 u_int32_t =A0 =A0 =A0 di_freelink; =A0 =A0/* 240: SUJ: Next= unlinked inode. */ > =A0 =A0 =A0 =A0uint32_t =A0 =A0 =A0 =A0di_spare[3]; =A0 =A0/* 244: Reserv= ed; currently unused */ > =A0}; > > @@ -168,7 +168,7 @@ struct ufs2_dinode { > =A0struct ufs1_dinode { > =A0 =A0 =A0 =A0u_int16_t =A0 =A0 =A0 di_mode; =A0 =A0 =A0 =A0/* =A0 0: IF= MT, permissions; see below. */ > =A0 =A0 =A0 =A0int16_t =A0 =A0 =A0 =A0 di_nlink; =A0 =A0 =A0 /* =A0 2: Fi= le link count. */ > - =A0 =A0 =A0 ino_t =A0 =A0 =A0 =A0 =A0 di_freelink; =A0 =A0/* =A0 4: SUJ= : Next unlinked inode. */ > + =A0 =A0 =A0 u_int32_t =A0 =A0 =A0 di_freelink; =A0 =A0/* =A0 4: SUJ: Ne= xt unlinked inode. */ > =A0 =A0 =A0 =A0u_int64_t =A0 =A0 =A0 di_size; =A0 =A0 =A0 =A0/* =A0 8: Fi= le byte count. */ > =A0 =A0 =A0 =A0int32_t =A0 =A0 =A0 =A0 di_atime; =A0 =A0 =A0 /* =A016: La= st access time. */ > =A0 =A0 =A0 =A0int32_t =A0 =A0 =A0 =A0 di_atimensec; =A0 /* =A020: Last a= ccess time. */ > From owner-svn-src-projects@FreeBSD.ORG Thu Aug 25 00:14: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 55DC8106566C; Thu, 25 Aug 2011 00:14:31 +0000 (UTC) (envelope-from mav@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id 3B8F48FC14; Thu, 25 Aug 2011 00:14: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 p7P0EVxA076392; Thu, 25 Aug 2011 00:14:31 GMT (envelope-from mav@svn.freebsd.org) Received: (from mav@localhost) by svn.freebsd.org (8.14.4/8.14.4/Submit) id p7P0EVOj076390; Thu, 25 Aug 2011 00:14:31 GMT (envelope-from mav@svn.freebsd.org) Message-Id: <201108250014.p7P0EVOj076390@svn.freebsd.org> From: Alexander Motin Date: Thu, 25 Aug 2011 00:14: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: r225157 - projects/zfsd/head/sys/cam/scsi 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, 25 Aug 2011 00:14:31 -0000 Author: mav Date: Thu Aug 25 00:14:30 2011 New Revision: 225157 URL: http://svn.freebsd.org/changeset/base/225157 Log: Make SAF-TE driver emulate Array Device Slots instead of Device Slots. This allows to pass to enclosure six more data bits, describing device state from RAID PoV. Add kern.cam.enc.%d.emulate_array_devices tunable, allowing to revert to the original behavior. Modified: projects/zfsd/head/sys/cam/scsi/scsi_enc_safte.c Modified: projects/zfsd/head/sys/cam/scsi/scsi_enc_safte.c ============================================================================== --- projects/zfsd/head/sys/cam/scsi/scsi_enc_safte.c Wed Aug 24 23:49:21 2011 (r225156) +++ projects/zfsd/head/sys/cam/scsi/scsi_enc_safte.c Thu Aug 25 00:14:30 2011 (r225157) @@ -162,6 +162,7 @@ enum { }; struct scfg { + int emulate_array_devices; /* * Cached Configuration */ @@ -300,7 +301,9 @@ safte_process_config(enc_softc_t *enc, s enc->enc_cache.elm_map[r++].enctype = ELMTYP_THERM; cfg->slotoff = (uint8_t) r; for (i = 0; i < cfg->Nslots; i++) - enc->enc_cache.elm_map[r++].enctype = ELMTYP_DEVICE; + enc->enc_cache.elm_map[r++].enctype = + cfg->emulate_array_devices ? ELMTYP_ARRAY_DEV : + ELMTYP_DEVICE; enc_update_request(enc, SAFTE_UPDATE_READGFLAGS); enc_update_request(enc, SAFTE_UPDATE_READENCSTATUS); @@ -485,7 +488,8 @@ safte_process_status(enc_softc_t *enc, s */ for (i = 0; i < cfg->Nslots; i++) { SAFT_BAIL(r, xfer_len); - cache->elm_map[cfg->slotoff + i].encstat[1] = buf[r]; + if (!cfg->emulate_array_devices) + cache->elm_map[cfg->slotoff + i].encstat[1] = buf[r]; r++; } @@ -656,6 +660,8 @@ safte_process_slotstatus(enc_softc_t *en oid = cfg->slotoff; for (r = i = 0; i < cfg->Nslots; i++, r += 4) { SAFT_BAIL(r+3, xfer_len); + if (cfg->emulate_array_devices) + cache->elm_map[oid].encstat[1] = 0; cache->elm_map[oid].encstat[2] &= SESCTL_RQSID; cache->elm_map[oid].encstat[3] = 0; if ((buf[r+3] & 0x01) == 0) { /* no device */ @@ -681,6 +687,20 @@ safte_process_slotstatus(enc_softc_t *en cache->elm_map[oid].encstat[3] |= SESCTL_RQSFLT; if (buf[r+0] & 0x40) cache->elm_map[oid].encstat[0] |= SESCTL_PRDFAIL; + if (cfg->emulate_array_devices) { + if (buf[r+0] & 0x04) + cache->elm_map[oid].encstat[1] |= 0x02; + if (buf[r+0] & 0x08) + cache->elm_map[oid].encstat[1] |= 0x04; + if (buf[r+0] & 0x10) + cache->elm_map[oid].encstat[1] |= 0x08; + if (buf[r+0] & 0x20) + cache->elm_map[oid].encstat[1] |= 0x10; + if (buf[r+1] & 0x01) + cache->elm_map[oid].encstat[1] |= 0x20; + if (buf[r+1] & 0x02) + cache->elm_map[oid].encstat[1] |= 0x01; + } cache->elm_map[oid++].svalid = 1; } @@ -733,6 +753,7 @@ safte_fill_control_request(enc_softc_t * switch (ep->enctype) { case ELMTYP_DEVICE: + case ELMTYP_ARRAY_DEV: switch (cfg->current_request_stage) { case 0: ep->priv = 0; @@ -742,6 +763,20 @@ safte_fill_control_request(enc_softc_t * ep->priv |= 0x02; if ((ep->priv & 0x46) == 0) ep->priv |= 0x01; /* no errors */ + if (cfg->emulate_array_devices) { + if (req->elm_stat[1] & 0x01) + ep->priv |= 0x200; + if (req->elm_stat[1] & 0x02) + ep->priv |= 0x04; + if (req->elm_stat[1] & 0x04) + ep->priv |= 0x08; + if (req->elm_stat[1] & 0x08) + ep->priv |= 0x10; + if (req->elm_stat[1] & 0x10) + ep->priv |= 0x20; + if (req->elm_stat[1] & 0x20) + ep->priv |= 0x100; + } buf[0] = SAFTE_WT_DSTAT; for (i = 0; i < cfg->Nslots; i++) { @@ -912,7 +947,7 @@ safte_process_control_request(enc_softc_ type = -1; else type = enc->enc_cache.elm_map[idx].enctype; - if (type == ELMTYP_DEVICE) + if (type == ELMTYP_DEVICE || type == ELMTYP_ARRAY_DEV) enc_update_request(enc, SAFTE_UPDATE_READSLOTSTATUS); else enc_update_request(enc, SAFTE_UPDATE_READENCSTATUS); @@ -1068,6 +1103,7 @@ int safte_softc_init(enc_softc_t *enc, int doinit) { struct scfg *cfg; + char buf[32]; if (doinit == 0) { safte_softc_cleanup(enc->periph); @@ -1088,6 +1124,10 @@ safte_softc_init(enc_softc_t *enc, int d enc->enc_cache.enc_status = 0; TAILQ_INIT(&cfg->requests); + cfg->emulate_array_devices = 1; + snprintf(buf, sizeof(buf), "kern.cam.enc.%d.emulate_array_devices", + enc->periph->unit_number); + TUNABLE_INT_FETCH(buf, &cfg->emulate_array_devices); return (0); } From owner-svn-src-projects@FreeBSD.ORG Thu Aug 25 11:02:02 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 3A5861065673; Thu, 25 Aug 2011 11:02:02 +0000 (UTC) (envelope-from mav@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id 2A7238FC16; Thu, 25 Aug 2011 11:02:02 +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 p7PB22Oa000860; Thu, 25 Aug 2011 11:02:02 GMT (envelope-from mav@svn.freebsd.org) Received: (from mav@localhost) by svn.freebsd.org (8.14.4/8.14.4/Submit) id p7PB22w5000857; Thu, 25 Aug 2011 11:02:02 GMT (envelope-from mav@svn.freebsd.org) Message-Id: <201108251102.p7PB22w5000857@svn.freebsd.org> From: Alexander Motin Date: Thu, 25 Aug 2011 11:02:02 +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: r225173 - projects/zfsd/head/sys/cam/scsi 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, 25 Aug 2011 11:02:02 -0000 Author: mav Date: Thu Aug 25 11:02:01 2011 New Revision: 225173 URL: http://svn.freebsd.org/changeset/base/225173 Log: Remove some strange lock operations. Modified: projects/zfsd/head/sys/cam/scsi/scsi_enc.c projects/zfsd/head/sys/cam/scsi/scsi_enc_ses.c Modified: projects/zfsd/head/sys/cam/scsi/scsi_enc.c ============================================================================== --- projects/zfsd/head/sys/cam/scsi/scsi_enc.c Thu Aug 25 10:00:38 2011 (r225172) +++ projects/zfsd/head/sys/cam/scsi/scsi_enc.c Thu Aug 25 11:02:01 2011 (r225173) @@ -242,10 +242,8 @@ enc_open(struct cdev *dev, int flags, in return (ENXIO); } - if (cam_periph_acquire(periph) != CAM_REQ_CMP) { - cam_periph_unlock(periph); + if (cam_periph_acquire(periph) != CAM_REQ_CMP) return (ENXIO); - } cam_periph_lock(periph); @@ -273,9 +271,6 @@ enc_close(struct cdev *dev, int flag, in { struct cam_periph *periph; struct enc_softc *softc; - int error; - - error = 0; periph = (struct cam_periph *)dev->si_drv1; if (periph == NULL) Modified: projects/zfsd/head/sys/cam/scsi/scsi_enc_ses.c ============================================================================== --- projects/zfsd/head/sys/cam/scsi/scsi_enc_ses.c Thu Aug 25 10:00:38 2011 (r225172) +++ projects/zfsd/head/sys/cam/scsi/scsi_enc_ses.c Thu Aug 25 11:02:01 2011 (r225173) @@ -2563,8 +2563,6 @@ ses_set_enc_status(enc_softc_t *enc, uin enc_update_request(enc, SES_PROCESS_CONTROL_REQS); cam_periph_sleep(enc->periph, &req, PUSER, "encstat", 0); - sx_slock(&enc->enc_cache_lock); - return (req.result); } From owner-svn-src-projects@FreeBSD.ORG Thu Aug 25 11:39:32 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 90293106566B; Thu, 25 Aug 2011 11:39:32 +0000 (UTC) (envelope-from mav@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id 806588FC14; Thu, 25 Aug 2011 11:39:32 +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 p7PBdWYr002020; Thu, 25 Aug 2011 11:39:32 GMT (envelope-from mav@svn.freebsd.org) Received: (from mav@localhost) by svn.freebsd.org (8.14.4/8.14.4/Submit) id p7PBdWbW002018; Thu, 25 Aug 2011 11:39:32 GMT (envelope-from mav@svn.freebsd.org) Message-Id: <201108251139.p7PBdWbW002018@svn.freebsd.org> From: Alexander Motin Date: Thu, 25 Aug 2011 11:39:32 +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: r225174 - projects/zfsd/head/sys/cam/scsi 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, 25 Aug 2011 11:39:32 -0000 Author: mav Date: Thu Aug 25 11:39:32 2011 New Revision: 225174 URL: http://svn.freebsd.org/changeset/base/225174 Log: Drop the periph lock during M_WAITOK buffer allocation. Modified: projects/zfsd/head/sys/cam/scsi/scsi_enc.c Modified: projects/zfsd/head/sys/cam/scsi/scsi_enc.c ============================================================================== --- projects/zfsd/head/sys/cam/scsi/scsi_enc.c Thu Aug 25 11:02:01 2011 (r225173) +++ projects/zfsd/head/sys/cam/scsi/scsi_enc.c Thu Aug 25 11:39:32 2011 (r225174) @@ -744,8 +744,11 @@ enc_fsm_step(enc_softc_t *enc) cur_state = &enc->enc_fsm_states[enc->current_action]; buf = NULL; - if (cur_state->buf_size != 0) + if (cur_state->buf_size != 0) { + cam_periph_unlock(enc->periph); buf = malloc(cur_state->buf_size, M_SCSIENC, M_WAITOK|M_ZERO); + cam_periph_lock(enc->periph); + } error = 0; ccb = NULL; From owner-svn-src-projects@FreeBSD.ORG Thu Aug 25 11:49: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 A85AF106566C; Thu, 25 Aug 2011 11:49:34 +0000 (UTC) (envelope-from jhb@freebsd.org) Received: from cyrus.watson.org (cyrus.watson.org [65.122.17.42]) by mx1.freebsd.org (Postfix) with ESMTP id 7EAE78FC08; Thu, 25 Aug 2011 11:49:34 +0000 (UTC) Received: from bigwig.baldwin.cx (66.111.2.69.static.nyinternet.net [66.111.2.69]) by cyrus.watson.org (Postfix) with ESMTPSA id 1CCE846B1A; Thu, 25 Aug 2011 07:49:34 -0400 (EDT) Received: from jhbbsd.localnet (unknown [209.249.190.124]) by bigwig.baldwin.cx (Postfix) with ESMTPSA id B03B68A02F; Thu, 25 Aug 2011 07:49:33 -0400 (EDT) From: John Baldwin To: mdf@freebsd.org Date: Thu, 25 Aug 2011 07:49:32 -0400 User-Agent: KMail/1.13.5 (FreeBSD/8.2-CBSD-20110617; KDE/4.5.5; amd64; ; ) References: <201108242214.p7OMEuMP072758@svn.freebsd.org> In-Reply-To: MIME-Version: 1.0 Content-Type: Text/Plain; charset="iso-8859-1" Content-Transfer-Encoding: 7bit Message-Id: <201108250749.32660.jhb@freebsd.org> X-Greylist: Sender succeeded SMTP AUTH, not delayed by milter-greylist-4.2.6 (bigwig.baldwin.cx); Thu, 25 Aug 2011 07:49:33 -0400 (EDT) Cc: svn-src-projects@freebsd.org, src-committers@freebsd.org Subject: Re: svn commit: r225154 - in projects/ino64/sys/ufs: ffs ufs 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, 25 Aug 2011 11:49:34 -0000 On Wednesday, August 24, 2011 7:09:24 pm mdf@freebsd.org wrote: > On Wed, Aug 24, 2011 at 3:14 PM, Matthew D Fleming wrote: > > Author: mdf > > Date: Wed Aug 24 22:14:55 2011 > > New Revision: 225154 > > URL: http://svn.freebsd.org/changeset/base/225154 > > > > Log: > > Use fixed-width types in on-disk structures. This takes care of all the > > ino_t references I could find that were on-disk. > > > > GSoC r223157. > > Code by Gleb Kurtsou. > > Note that I've explicitly left all the XXXfid structs alone; when > ino_t is changed to 64-bit they will use 64-bit members for inode > number. The only in-tree one that may be a problem is ReiserFS which > will have a 32 byte FID after compiler padding is applied. This can > be reduced to 24 bytes by reordering the members. In theory, IIRC, > even 32 bits is an okay FID, however I have seen a note at $WORK that > NFSv2 has 32 byte file handles and BSD is using 8 bytes for the fsid. > > If anyone knows anything more, please let me know. For the moment I > think my plan is to re-order the members of various implementations to > keep them smaller, and leave it as an ino_t in the struct definition. One suggestion I do have in regards to this branch. Earlier there was a request to increase the userland dev_t to 32-bits. The primary user of this would seem to be OpenAFS. Gleb did not agree to do this, but I actually think we should go ahead and bump dev_t. Changing for the layout of stat is a lot of work and I'd rather err on the side of being too future proof than deciding 2 years from now "gee, we really could have used a bigger dev_t". -- John Baldwin From owner-svn-src-projects@FreeBSD.ORG Thu Aug 25 12:09:40 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 E8476106566B; Thu, 25 Aug 2011 12:09:40 +0000 (UTC) (envelope-from mav@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id D7E688FC12; Thu, 25 Aug 2011 12:09:40 +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 p7PC9eOY002932; Thu, 25 Aug 2011 12:09:40 GMT (envelope-from mav@svn.freebsd.org) Received: (from mav@localhost) by svn.freebsd.org (8.14.4/8.14.4/Submit) id p7PC9e3w002929; Thu, 25 Aug 2011 12:09:40 GMT (envelope-from mav@svn.freebsd.org) Message-Id: <201108251209.p7PC9e3w002929@svn.freebsd.org> From: Alexander Motin Date: Thu, 25 Aug 2011 12:09:40 +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: r225175 - projects/zfsd/head/sys/cam/scsi 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, 25 Aug 2011 12:09:41 -0000 Author: mav Date: Thu Aug 25 12:09:40 2011 New Revision: 225175 URL: http://svn.freebsd.org/changeset/base/225175 Log: Make emulate_array_devices global to not bother with locking and kenv. This also makes it writable sysctl. Modified: projects/zfsd/head/sys/cam/scsi/scsi_enc.c projects/zfsd/head/sys/cam/scsi/scsi_enc_safte.c Modified: projects/zfsd/head/sys/cam/scsi/scsi_enc.c ============================================================================== --- projects/zfsd/head/sys/cam/scsi/scsi_enc.c Thu Aug 25 11:39:32 2011 (r225174) +++ projects/zfsd/head/sys/cam/scsi/scsi_enc.c Thu Aug 25 12:09:40 2011 (r225175) @@ -40,6 +40,7 @@ __FBSDID("$FreeBSD$"); #include #include #include +#include #include #include @@ -76,6 +77,9 @@ static periph_start_t enc_start; static void enc_async(void *, uint32_t, struct cam_path *, void *); static enctyp enc_type(struct ccb_getdev *); +SYSCTL_NODE(_kern_cam, OID_AUTO, enc, CTLFLAG_RD, 0, + "CAM Enclosure Services driver"); + static struct periph_driver encdriver = { enc_init, "enc", TAILQ_HEAD_INITIALIZER(encdriver.units), /* generation */ 0 Modified: projects/zfsd/head/sys/cam/scsi/scsi_enc_safte.c ============================================================================== --- projects/zfsd/head/sys/cam/scsi/scsi_enc_safte.c Thu Aug 25 11:39:32 2011 (r225174) +++ projects/zfsd/head/sys/cam/scsi/scsi_enc_safte.c Thu Aug 25 12:09:40 2011 (r225175) @@ -37,6 +37,7 @@ __FBSDID("$FreeBSD: head/sys/cam/scsi/sc #include #include #include +#include #include #include @@ -162,7 +163,6 @@ enum { }; struct scfg { - int emulate_array_devices; /* * Cached Configuration */ @@ -214,6 +214,12 @@ static char *safte_2little = "Too Little return (EIO); \ } +int emulate_array_devices = 1; +SYSCTL_DECL(_kern_cam_enc); +SYSCTL_INT(_kern_cam_enc, OID_AUTO, emulate_array_devices, CTLFLAG_RW, + &emulate_array_devices, 0, "Emulate Array Devices for SAF-TE"); +TUNABLE_INT("kern.cam.enc.emulate_array_devices", &emulate_array_devices); + static int safte_fill_read_buf_io(enc_softc_t *enc, struct enc_fsm_state *state, union ccb *ccb, uint8_t *buf) @@ -302,7 +308,7 @@ safte_process_config(enc_softc_t *enc, s cfg->slotoff = (uint8_t) r; for (i = 0; i < cfg->Nslots; i++) enc->enc_cache.elm_map[r++].enctype = - cfg->emulate_array_devices ? ELMTYP_ARRAY_DEV : + emulate_array_devices ? ELMTYP_ARRAY_DEV : ELMTYP_DEVICE; enc_update_request(enc, SAFTE_UPDATE_READGFLAGS); @@ -488,7 +494,7 @@ safte_process_status(enc_softc_t *enc, s */ for (i = 0; i < cfg->Nslots; i++) { SAFT_BAIL(r, xfer_len); - if (!cfg->emulate_array_devices) + if (cache->elm_map[cfg->slotoff + i].enctype == ELMTYP_DEVICE) cache->elm_map[cfg->slotoff + i].encstat[1] = buf[r]; r++; } @@ -660,7 +666,7 @@ safte_process_slotstatus(enc_softc_t *en oid = cfg->slotoff; for (r = i = 0; i < cfg->Nslots; i++, r += 4) { SAFT_BAIL(r+3, xfer_len); - if (cfg->emulate_array_devices) + if (cache->elm_map[oid].enctype == ELMTYP_ARRAY_DEV) cache->elm_map[oid].encstat[1] = 0; cache->elm_map[oid].encstat[2] &= SESCTL_RQSID; cache->elm_map[oid].encstat[3] = 0; @@ -687,7 +693,7 @@ safte_process_slotstatus(enc_softc_t *en cache->elm_map[oid].encstat[3] |= SESCTL_RQSFLT; if (buf[r+0] & 0x40) cache->elm_map[oid].encstat[0] |= SESCTL_PRDFAIL; - if (cfg->emulate_array_devices) { + if (cache->elm_map[oid].enctype == ELMTYP_ARRAY_DEV) { if (buf[r+0] & 0x04) cache->elm_map[oid].encstat[1] |= 0x02; if (buf[r+0] & 0x08) @@ -763,7 +769,7 @@ safte_fill_control_request(enc_softc_t * ep->priv |= 0x02; if ((ep->priv & 0x46) == 0) ep->priv |= 0x01; /* no errors */ - if (cfg->emulate_array_devices) { + if (ep->enctype == ELMTYP_ARRAY_DEV) { if (req->elm_stat[1] & 0x01) ep->priv |= 0x200; if (req->elm_stat[1] & 0x02) @@ -1103,7 +1109,6 @@ int safte_softc_init(enc_softc_t *enc, int doinit) { struct scfg *cfg; - char buf[32]; if (doinit == 0) { safte_softc_cleanup(enc->periph); @@ -1124,10 +1129,6 @@ safte_softc_init(enc_softc_t *enc, int d enc->enc_cache.enc_status = 0; TAILQ_INIT(&cfg->requests); - cfg->emulate_array_devices = 1; - snprintf(buf, sizeof(buf), "kern.cam.enc.%d.emulate_array_devices", - enc->periph->unit_number); - TUNABLE_INT_FETCH(buf, &cfg->emulate_array_devices); return (0); } From owner-svn-src-projects@FreeBSD.ORG Thu Aug 25 12:28:41 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 CD1B61065670; Thu, 25 Aug 2011 12:28:41 +0000 (UTC) (envelope-from mav@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id BD5F48FC0A; Thu, 25 Aug 2011 12:28:41 +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 p7PCSfDH003560; Thu, 25 Aug 2011 12:28:41 GMT (envelope-from mav@svn.freebsd.org) Received: (from mav@localhost) by svn.freebsd.org (8.14.4/8.14.4/Submit) id p7PCSflY003558; Thu, 25 Aug 2011 12:28:41 GMT (envelope-from mav@svn.freebsd.org) Message-Id: <201108251228.p7PCSflY003558@svn.freebsd.org> From: Alexander Motin Date: Thu, 25 Aug 2011 12:28:41 +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: r225176 - projects/zfsd/head/sys/cam/scsi 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, 25 Aug 2011 12:28:41 -0000 Author: mav Date: Thu Aug 25 12:28:41 2011 New Revision: 225176 URL: http://svn.freebsd.org/changeset/base/225176 Log: Reread SES enclosure status after writing it. Modified: projects/zfsd/head/sys/cam/scsi/scsi_enc_ses.c Modified: projects/zfsd/head/sys/cam/scsi/scsi_enc_ses.c ============================================================================== --- projects/zfsd/head/sys/cam/scsi/scsi_enc_ses.c Thu Aug 25 12:09:40 2011 (r225175) +++ projects/zfsd/head/sys/cam/scsi/scsi_enc_ses.c Thu Aug 25 12:28:41 2011 (r225176) @@ -1824,6 +1824,7 @@ ses_process_control_request(enc_softc_t * o Some SCSI status error. */ ses_terminate_control_requests(&ses->ses_pending_requests, 0); + enc_update_request(enc, SES_UPDATE_GETSTATUS); return (0); } From owner-svn-src-projects@FreeBSD.ORG Thu Aug 25 14:51: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 50AA2106564A; Thu, 25 Aug 2011 14:51:28 +0000 (UTC) (envelope-from ed@hoeg.nl) Received: from mx0.hoeg.nl (mx0.hoeg.nl [IPv6:2a01:4f8:101:5343::aa]) by mx1.freebsd.org (Postfix) with ESMTP id E198B8FC18; Thu, 25 Aug 2011 14:51:27 +0000 (UTC) Received: by mx0.hoeg.nl (Postfix, from userid 1000) id EEA212A28CB3; Thu, 25 Aug 2011 16:51:26 +0200 (CEST) Date: Thu, 25 Aug 2011 16:51:26 +0200 From: Ed Schouten To: John Baldwin Message-ID: <20110825145126.GZ1929@hoeg.nl> References: <201108242214.p7OMEuMP072758@svn.freebsd.org> <201108250749.32660.jhb@freebsd.org> MIME-Version: 1.0 Content-Type: multipart/signed; micalg=pgp-sha1; protocol="application/pgp-signature"; boundary="LEvbv2kWtJBEQZjR" Content-Disposition: inline In-Reply-To: <201108250749.32660.jhb@freebsd.org> User-Agent: Mutt/1.5.21 (2010-09-15) Cc: svn-src-projects@freebsd.org, mdf@freebsd.org, src-committers@freebsd.org Subject: Re: svn commit: r225154 - in projects/ino64/sys/ufs: ffs ufs 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, 25 Aug 2011 14:51:28 -0000 --LEvbv2kWtJBEQZjR Content-Type: text/plain; charset=us-ascii Content-Disposition: inline Content-Transfer-Encoding: quoted-printable Hi John, * John Baldwin , 20110825 13:49: > One suggestion I do have in regards to this branch. Earlier there was a > request to increase the userland dev_t to 32-bits. I assume you mean 64-bits? It is already 32-bits. Greetings, --=20 Ed Schouten WWW: http://80386.nl/ --LEvbv2kWtJBEQZjR Content-Type: application/pgp-signature -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.4.11 (FreeBSD) iQIcBAEBAgAGBQJOVmFuAAoJEG5e2P40kaK7a6sP/jNCETw3iDK2ld93go2bjhLO 6Y253zkJ+o+YpHQE5pqOXqeV7QK1eHXt4FxXnQdAkbIWbnEUwk03bZgRKf2aSpYJ RO8/+P8lIejLQl3nHbcO6oSNWp+aL2braeGqfzqVjvzv1mRhH0+oA1+x0MwTkfbj i4F/xKYei+G1w5sq8MuKMvMeoXKrZ26tCyN5E0l4tMLGmzrR+OMEL9HGaVlzvaUw LEK+ob7AVRIzcZ3g25xgGMOebRl1Q2YyFT/FjibEMicrJXNeccmRAZSXiq8T3lpQ c4UAmzs3crwL8SI6Z2BBIaKd33MBovYVBaJm4/psI883Qv6GL19msyb+Xs+L7daE ohhf6wtFXu0o1dKAOvsf08TNRQFiBua1pIvkR/3ijXyXSeXXVHs8p40IuxGt9BnA BkohxH/JNGff10fOYtIzz5rktWfmoRuSCJ4LkwFRKl/T3YQfFOfXZj+BvspwY5Ac k7Vfsg0qB2vizLtdF41MxtuCt6YUcpV2VLSr9NtwhxXpEl/RyzoYCR/F0JQ+Usfc eM9qGK+kXvDxWw1cUjhG62irWuRATNukI7cqxyU/H+T0nMD0sddrtR49XQ3XdijT p3DqVaaoPVwbkdQSSvqN2mX3cWvqE9cPpOV0zcMtqgvBYKAoGwIhTZOkUj1ZsAiS 8QfpwvxA0iv+2CXczKNl =b4em -----END PGP SIGNATURE----- --LEvbv2kWtJBEQZjR-- From owner-svn-src-projects@FreeBSD.ORG Thu Aug 25 15:42:59 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 AC634106566B; Thu, 25 Aug 2011 15:42:59 +0000 (UTC) (envelope-from jhb@freebsd.org) Received: from cyrus.watson.org (cyrus.watson.org [65.122.17.42]) by mx1.freebsd.org (Postfix) with ESMTP id 82CEB8FC19; Thu, 25 Aug 2011 15:42:59 +0000 (UTC) Received: from bigwig.baldwin.cx (66.111.2.69.static.nyinternet.net [66.111.2.69]) by cyrus.watson.org (Postfix) with ESMTPSA id 3802946B2D; Thu, 25 Aug 2011 11:42:59 -0400 (EDT) Received: from jhbbsd.localnet (unknown [209.249.190.124]) by bigwig.baldwin.cx (Postfix) with ESMTPSA id BA42F8A02F; Thu, 25 Aug 2011 11:42:58 -0400 (EDT) From: John Baldwin To: Ed Schouten Date: Thu, 25 Aug 2011 11:42:58 -0400 User-Agent: KMail/1.13.5 (FreeBSD/8.2-CBSD-20110617; KDE/4.5.5; amd64; ; ) References: <201108242214.p7OMEuMP072758@svn.freebsd.org> <201108250749.32660.jhb@freebsd.org> <20110825145126.GZ1929@hoeg.nl> In-Reply-To: <20110825145126.GZ1929@hoeg.nl> MIME-Version: 1.0 Content-Type: Text/Plain; charset="iso-8859-15" Content-Transfer-Encoding: 7bit Message-Id: <201108251142.58276.jhb@freebsd.org> X-Greylist: Sender succeeded SMTP AUTH, not delayed by milter-greylist-4.2.6 (bigwig.baldwin.cx); Thu, 25 Aug 2011 11:42:58 -0400 (EDT) Cc: svn-src-projects@freebsd.org, mdf@freebsd.org, src-committers@freebsd.org Subject: Re: svn commit: r225154 - in projects/ino64/sys/ufs: ffs ufs 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, 25 Aug 2011 15:42:59 -0000 On Thursday, August 25, 2011 10:51:26 am Ed Schouten wrote: > Hi John, > > * John Baldwin , 20110825 13:49: > > One suggestion I do have in regards to this branch. Earlier there was a > > request to increase the userland dev_t to 32-bits. > > I assume you mean 64-bits? It is already 32-bits. Yes, sorry. -- John Baldwin From owner-svn-src-projects@FreeBSD.ORG Thu Aug 25 17:05: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 D96B41065670; Thu, 25 Aug 2011 17:05:55 +0000 (UTC) (envelope-from mdf@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id C9CA78FC13; Thu, 25 Aug 2011 17:05: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 p7PH5trd011895; Thu, 25 Aug 2011 17:05:55 GMT (envelope-from mdf@svn.freebsd.org) Received: (from mdf@localhost) by svn.freebsd.org (8.14.4/8.14.4/Submit) id p7PH5tE6011893; Thu, 25 Aug 2011 17:05:55 GMT (envelope-from mdf@svn.freebsd.org) Message-Id: <201108251705.p7PH5tE6011893@svn.freebsd.org> From: Matthew D Fleming Date: Thu, 25 Aug 2011 17:05: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: r225178 - projects/ino64/lib/libc/gen 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, 25 Aug 2011 17:05:55 -0000 Author: mdf Date: Thu Aug 25 17:05:55 2011 New Revision: 225178 URL: http://svn.freebsd.org/changeset/base/225178 Log: Segfault on bad input like the original, as no callers are checking the return code. Requested by: Jilles Tjoelker Modified: projects/ino64/lib/libc/gen/dirfd.c Modified: projects/ino64/lib/libc/gen/dirfd.c ============================================================================== --- projects/ino64/lib/libc/gen/dirfd.c Thu Aug 25 15:51:54 2011 (r225177) +++ projects/ino64/lib/libc/gen/dirfd.c Thu Aug 25 17:05:55 2011 (r225178) @@ -43,8 +43,6 @@ __FBSDID("$FreeBSD$"); int dirfd(DIR *dirp) { - if (dirp == NULL) - return (-1); return (_dirfd(dirp)); } From owner-svn-src-projects@FreeBSD.ORG Thu Aug 25 17:33:20 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 9630D1065670; Thu, 25 Aug 2011 17:33:20 +0000 (UTC) (envelope-from mdf@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id 839708FC08; Thu, 25 Aug 2011 17:33:20 +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 p7PHXK5v012740; Thu, 25 Aug 2011 17:33:20 GMT (envelope-from mdf@svn.freebsd.org) Received: (from mdf@localhost) by svn.freebsd.org (8.14.4/8.14.4/Submit) id p7PHXKd5012734; Thu, 25 Aug 2011 17:33:20 GMT (envelope-from mdf@svn.freebsd.org) Message-Id: <201108251733.p7PHXKd5012734@svn.freebsd.org> From: Matthew D Fleming Date: Thu, 25 Aug 2011 17:33:20 +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: r225179 - in projects/ino64/tools/tools/shlib-compat: . test test/libtest1 test/libtest2 test/libtest3 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, 25 Aug 2011 17:33:20 -0000 Author: mdf Date: Thu Aug 25 17:33:20 2011 New Revision: 225179 URL: http://svn.freebsd.org/changeset/base/225179 Log: Add shlib-compat script, associated tests, etc. GSoC r222108, r222616, r222833, r222846, r223083, r223375, r224842, r224843, r224844. Code by Gleb Kurtsou. Added: projects/ino64/tools/tools/shlib-compat/ projects/ino64/tools/tools/shlib-compat/Makefile.sysfake (contents, props changed) projects/ino64/tools/tools/shlib-compat/README (contents, props changed) projects/ino64/tools/tools/shlib-compat/makesyscalls-fake.sh (contents, props changed) projects/ino64/tools/tools/shlib-compat/shlib-compat-dirs.sh (contents, props changed) projects/ino64/tools/tools/shlib-compat/shlib-compat.py (contents, props changed) projects/ino64/tools/tools/shlib-compat/test/ projects/ino64/tools/tools/shlib-compat/test/Makefile (contents, props changed) projects/ino64/tools/tools/shlib-compat/test/Makefile.inc (contents, props changed) projects/ino64/tools/tools/shlib-compat/test/Versions.def (contents, props changed) projects/ino64/tools/tools/shlib-compat/test/libtest1/ projects/ino64/tools/tools/shlib-compat/test/libtest1/Makefile (contents, props changed) projects/ino64/tools/tools/shlib-compat/test/libtest1/Symbol.map (contents, props changed) projects/ino64/tools/tools/shlib-compat/test/libtest1/test.c (contents, props changed) projects/ino64/tools/tools/shlib-compat/test/libtest2/ projects/ino64/tools/tools/shlib-compat/test/libtest2/Makefile (contents, props changed) projects/ino64/tools/tools/shlib-compat/test/libtest2/Symbol.map (contents, props changed) projects/ino64/tools/tools/shlib-compat/test/libtest2/test.c (contents, props changed) projects/ino64/tools/tools/shlib-compat/test/libtest3/ projects/ino64/tools/tools/shlib-compat/test/libtest3/Makefile (contents, props changed) projects/ino64/tools/tools/shlib-compat/test/libtest3/Symbol.map (contents, props changed) projects/ino64/tools/tools/shlib-compat/test/libtest3/test.c (contents, props changed) projects/ino64/tools/tools/shlib-compat/test/regress.1-1.out (contents, props changed) projects/ino64/tools/tools/shlib-compat/test/regress.1-2.out (contents, props changed) projects/ino64/tools/tools/shlib-compat/test/regress.1-3.out (contents, props changed) projects/ino64/tools/tools/shlib-compat/test/regress.2-1.out (contents, props changed) projects/ino64/tools/tools/shlib-compat/test/regress.2-2.out (contents, props changed) projects/ino64/tools/tools/shlib-compat/test/regress.2-3.out (contents, props changed) projects/ino64/tools/tools/shlib-compat/test/regress.3-1.out (contents, props changed) projects/ino64/tools/tools/shlib-compat/test/regress.3-2.out (contents, props changed) projects/ino64/tools/tools/shlib-compat/test/regress.3-3.out (contents, props changed) projects/ino64/tools/tools/shlib-compat/test/regress.m4 (contents, props changed) projects/ino64/tools/tools/shlib-compat/test/regress.sh (contents, props changed) projects/ino64/tools/tools/shlib-compat/test/regress.t (contents, props changed) Added: projects/ino64/tools/tools/shlib-compat/Makefile.sysfake ============================================================================== --- /dev/null 00:00:00 1970 (empty, because file is newly added) +++ projects/ino64/tools/tools/shlib-compat/Makefile.sysfake Thu Aug 25 17:33:20 2011 (r225179) @@ -0,0 +1,9 @@ +# $FreeBSD$ + +SRCS+= syscalls-fake.c +CLEANFILES+= syscalls-fake.c + +syscalls-fake.c: ${.CURDIR}/../../sys/kern/syscalls.master + sh ${.CURDIR}/../../tools/tools/shlib-compat/makesyscalls-fake.sh \ + ${.CURDIR}/../../sys/kern/syscalls.master > ${.TARGET} + Added: projects/ino64/tools/tools/shlib-compat/README ============================================================================== --- /dev/null 00:00:00 1970 (empty, because file is newly added) +++ projects/ino64/tools/tools/shlib-compat/README Thu Aug 25 17:33:20 2011 (r225179) @@ -0,0 +1,19 @@ +ABI compatibility checker for shared libraries with symbol versioning. + +shlib-compat uses dwarf debugging symbols to recreate definitions of +exported symbols, including function arguments and structural types. + +The shlib-compat.py script requires devel/dwarfdump port to be +installed. + + +Syscalls in libc are implemented as assembly stubs and thus have no +debugging symbols attached. To enable sysfake stubs rebuild libc +adding the following to /etc/make.conf: + +LIBC_EXTRAMK=/usr/src/tools/tools/shlib-compat/Makefile.sysfake + +To compare libc.so versions compiled with sysfake stubs: +./shlib-compat -v --alias-prefix __sysfake_ --alias-prefix __sysfake_freebsd8_ \ + --exclude-ver FBSDprivate \ + --out-orig out-orig.c --out-new out-new.c libc.so.7.orig libc.so.7.new Added: projects/ino64/tools/tools/shlib-compat/makesyscalls-fake.sh ============================================================================== --- /dev/null 00:00:00 1970 (empty, because file is newly added) +++ projects/ino64/tools/tools/shlib-compat/makesyscalls-fake.sh Thu Aug 25 17:33:20 2011 (r225179) @@ -0,0 +1,124 @@ +#! /bin/sh - +# $FreeBSD$ + +set -e + +case $# in + 0) echo "usage: $0 input-file " 1>&2 + exit 1 + ;; +esac + +if [ -n "$2" -a -f "$2" ]; then + . $2 +fi + +sed -e ' +s/\$//g +:join + /\\$/{a\ + + N + s/\\\n// + b join + } +2,${ + /^#/!s/\([{}()*,]\)/ \1 /g +} +' < $1 | awk ' + BEGIN { + printf "#include \n" + printf "#include \n" + printf "\n" + printf "#include \n" + printf "#include \n" + printf "#include \n" + printf "#include \n" + printf "#include \n" + printf "#include \n" + printf "#include \n" + printf "#include \n" + printf "#include \n" + printf "#include \n" + printf "#include \n" + printf "#include \n" + printf "#include \n" + printf "#include \n" + printf "#include \n" + printf "#include \n" + printf "#include \n" + printf "#include \n" + printf "#include \n" + printf "#include \n" + printf "#include \n" + printf "#include \n" + printf "#include \n" + printf "#include \n" + printf "#include \n" + printf "#include \n" + printf "\n" + printf "#ifndef _ACL_PRIVATE\n" + printf "#define _ACL_PRIVATE\n" + printf "#endif\n" + printf "#include \n" + printf "\n" + printf "#ifndef EBUSY\n" + printf "#define errno 0\n" + printf "#define EBUSY 0\n" + printf "#endif\n" + printf "#include \n" + printf "\n" + printf "struct ostatfs;\n" + printf "struct osigaction;\n" + printf "struct osigcontext;\n" + printf "struct ucontext4;\n" + printf "struct oaiocb;\n" + printf "struct msqid_ds_old;\n" + printf "struct shmid_ds_old;\n" + printf "struct sctp_sndrcvinfo;\n" + printf "union semun_old;\n" + printf "typedef unsigned int osigset_t;\n" + printf "\n" + } + NF < 4 || $1 !~ /^[0-9]+$/ { + next + } + $3 ~ "UNIMPL" || $3 ~ "OBSOL" || $3 ~ "NODEF" || $3 ~ "NOPROTO" || + $3 ~ "NOSTD"{ + next + } + $4 == "{" { + if ($3 ~ /COMPAT[0-9]*/) { + n = split($3, flags, /\|/) + for (i = 1; i <= n; i++) { + if (flags[i] == "COMPAT") { + $6 = "o" $6 + } else if (flags[i] ~ /COMPAT[0-9]+/) { + sub(/COMPAT/, "freebsd", flags[i]) + $6 = flags[i] "_" $6 + } + } + } + $6 = "__sysfake_" $6 + r = "" + if ($5 != "void") + r = "0" + def = "" + impl = "" + for ( i = 5; i <= NF; i++) { + if ($i == ";") + break; + if ($i == "," || $i == ")") + impl = impl " __unused" + impl = impl " " $i + def = def " " $i + } + printf "%s;\n", def + printf "%s\n{ return %s; }\n", impl, r + next + } + { + printf "invalid line: " + print + } +' Added: projects/ino64/tools/tools/shlib-compat/shlib-compat-dirs.sh ============================================================================== --- /dev/null 00:00:00 1970 (empty, because file is newly added) +++ projects/ino64/tools/tools/shlib-compat/shlib-compat-dirs.sh Thu Aug 25 17:33:20 2011 (r225179) @@ -0,0 +1,45 @@ +#!/bin/sh -e + +SHLIB_COMPAT=$(dirname $0)/shlib-compat + +if [ $# -ne 3 ]; then + echo "Usage: $0 orig-dir new-dir output-dir" + exit 1 +fi + +orig=$1 +new=$2 +out=$3 + +remove_empty() { + local i + for i in $*; do + [ -s $i ] || rm -f $i + done +} + +test_file() { + local i + for i in $*; do + if [ \! -f $1 ]; then + echo "file not found: $1" + return 1 + fi + done +} + +rorig=`realpath $orig` +rnew=`realpath $new` +list=`(cd $rorig; ls; cd $rnew; ls) | sort -u` +for i in $list; do + echo $i + test_file $orig/$i $new/$i || continue + $SHLIB_COMPAT --out-orig $out/$i.orig.c --out-new $out/$i.new.c -v \ + $orig/$i $new/$i > $out/$i.cmp 2> $out/$i.err || true + remove_empty $out/$i.orig.c $out/$i.new.c $out/$i.cmp $out/$i.err + if [ -f $out/$i.orig.c -a -f $out/$i.new.c ]; then + astyle --quiet --style=bsd -k3 $out/$i.orig.c $out/$i.new.c + rm -f $out/$i.orig.c.orig $out/$i.new.c.orig + diff -u $out/$i.orig.c $out/$i.new.c > $out/$i.diff || true + fi +done Added: projects/ino64/tools/tools/shlib-compat/shlib-compat.py ============================================================================== --- /dev/null 00:00:00 1970 (empty, because file is newly added) +++ projects/ino64/tools/tools/shlib-compat/shlib-compat.py Thu Aug 25 17:33:20 2011 (r225179) @@ -0,0 +1,1055 @@ +#!/usr/bin/env python + +# Copyright (c) 2010 Gleb Kurtsou +# 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. + +import os +import sys +import re +import optparse + +class Config(object): + version = '0.1' + # controlled by user + verbose = 0 + dump = False + no_dump = False + version_filter = None + symbol_filter = None + alias_prefixes = [] + # misc opts + objdump = 'objdump' + dwarfdump = 'dwarfdump' + # debug + cmpcache_enabled = True + dwarfcache_enabled = True + + class FileConfig(object): + filename = None + out = sys.stdout + def init(self, outname): + if outname and outname != '-': + self.out = open(outname, "w") + + origfile = FileConfig() + newfile = FileConfig() + + @classmethod + def init(cls): + cls.version_filter = StrFilter() + cls.symbol_filter = StrFilter() + +class App(object): + result_code = 0 + +# {{{ misc + +class StrFilter(object): + def __init__(self): + self.exclude = [] + self.include = [] + + def compile(self): + self.re_exclude = [ re.compile(x) for x in self.exclude ] + self.re_include = [ re.compile(x) for x in self.include ] + + def match(self, s): + if len(self.re_include): + matched = False + for r in self.re_include: + if r.match(s): + matched = True + break + if not matched: + return False + for r in self.re_exclude: + if r.match(s): + return False + return True + +class Cache(object): + + class CacheStats(object): + def __init__(self): + self.hit = 0 + self.miss = 0 + + def show(self, name): + total = self.hit + self.miss + if total == 0: + ratio = '(undef)' + else: + ratio = '%f' % (self.hit/float(total)) + return '%s cache stats: hit: %d; miss: %d; ratio: %s' % \ + (name, self.hit, self.miss, ratio) + + def __init__(self, enabled=True, stats=None): + self.enabled = enabled + self.items = {} + if stats == None: + self.stats = Cache.CacheStats() + else: + self.stats = stats + + def get(self, id): + if self.enabled and self.items.has_key(id): + self.stats.hit += 1 + return self.items[id] + else: + self.stats.miss += 1 + return None + + def put(self, id, obj): + if self.enabled: + if self.items.has_key(id) and obj is not self.items[id]: + #raise ValueError("Item is already cached: %d (%s, %s)" % + # (id, self.items[id], obj)) + print >> sys.stderr, "WARN: Item is already cached: %d (%s, %s)" % \ + (id, self.items[id], obj) + self.items[id] = obj + + def replace(self, id, obj): + if self.enabled: + assert self.items.has_key(id) + self.items[id] = obj + +class ListDiff(object): + def __init__(self, orig, new): + self.orig = set(orig) + self.new = set(new) + self.common = self.orig & self.new + self.added = self.new - self.common + self.removed = self.orig - self.common + +class PrettyPrinter(object): + def __init__(self): + self.stack = [] + + def run_nested(self, obj): + ex = obj._pp_ex(self) + self.stack.append(ex) + + def run(self, obj): + self._result = obj._pp(self) + return self._result + + def nested(self): + return sorted(set(self.stack)) + + def result(self): + return self._result; + +# }}} + +#{{{ symbols and version maps + +class Symbol(object): + def __init__(self, name, offset, version, lib): + self.name = name + self.offset = offset + self.version = version + self.lib = lib + self.definition = None + + @property + def name_ver(self): + return self.name + '@' + self.version + + def __repr__(self): + return "Symbol(%s, 0x%x, %s)" % (self.name, self.offset, self.version) + +class CommonSymbol(object): + def __init__(self, origsym, newsym): + if origsym.name != newsym.name or origsym.version != newsym.version: + raise RuntimeError("Symbols have different names: %s", + [origsym, newsym]) + self.origsym = origsym + self.newsym = newsym + self.name = newsym.name + self.version = newsym.version + + def __repr__(self): + return "CommonSymbol(%s, %s)" % (self.name, self.version) + +class SymbolAlias(object): + def __init__(self, alias, prefix, offset): + assert alias.startswith(prefix) + self.alias = alias + self.name = alias[len(prefix):] + self.offset = offset + + def __repr__(self): + return "SymbolAlias(%s, 0x%x)" % (self.alias, self.offset) + + +class VersionMap(object): + def __init__(self, name): + self.name = name + self.symbols = {} + + def append(self, symbol): + if (self.symbols.has_key(symbol.name)): + raise ValueError("Symbol is already defined %s@%s" % + (symbol.name, self.name)) + self.symbols[symbol.name] = symbol + + def names(self): + return self.symbols.keys() + + def __repr__(self): + return repr(self.symbols.values()) + +# }}} + +# {{{ types and definitions + +class Def(object): + _is_alias = False + + def __init__(self, id, name, **kwargs): + self.id = id + self.name = name + self.attrs = kwargs + + def __getattr__(self, attr): + if not self.attrs.has_key(attr): + raise AttributeError('%s in %s' % (attr, str(self))) + return self.attrs[attr] + + def _name_opt(self, default=''): + if not self.name: + return default + return self.name + + def _alias(self): + if self._is_alias: + return self.type._alias() + return self + + def __cmp__(self, other): + # TODO assert 'self' and 'other' belong to different libraries + #print 'cmp defs: %s, %s' % (self, other) + a = self._alias() + try: + b = other._alias() + except AttributeError: + return 1 + r = cmp(a.__class__, b.__class__) + if r == 0: + if a.id != 0 and b.id != 0: + ind = (long(a.id) << 32) + b.id + r = Dwarf.cmpcache.get(ind) + if r != None: + return r + else: + ind = 0 + r = cmp(a.attrs, b.attrs) + if ind != 0: + Dwarf.cmpcache.put(ind, r) + else: + r = 0 + #raise RuntimeError('Comparing different classes: %s, %s' % + # (a.__class__.__name__, b.__class__.__name__)) + return r + + def __repr__(self): + p = [] + if hasattr(self, 'name'): + p.append("name=%s" % self.name) + for (k, v) in self.attrs.items(): + if isinstance(v, Def): + v = v.__class__.__name__ + '(...)' + p.append("%s=%s" % (k, v)) + return self.__class__.__name__ + '(' + ', '.join(p) + ')' + + def _mapval(self, param, vals): + if param not in vals.keys(): + raise NotImplementedError("Invalid value '%s': %s" % + (param, str(self))) + return vals[param] + + def _pp_ex(self, pp): + raise NotImplementedError('Extended pretty print not implemeted: %s' % + str(self)) + + def _pp(self, pp): + raise NotImplementedError('Pretty print not implemeted: %s' % str(self)) + +class AnonymousDef(Def): + def __init__(self, id, **kwargs): + Def.__init__(self, id, None, **kwargs) + +class Void(AnonymousDef): + _instance = None + + def __new__(cls, *args, **kwargs): + if not cls._instance: + cls._instance = super(Void, cls).__new__( + cls, *args, **kwargs) + return cls._instance + + def __init__(self): + AnonymousDef.__init__(self, 0) + + def _pp(self, pp): + return "void" + +class VarArgs(AnonymousDef): + def _pp(self, pp): + return "..." + +class PointerDef(AnonymousDef): + def _pp(self, pp): + t = pp.run(self.type) + return "%s*" % (t,) + +class BaseTypeDef(Def): + def _pp(self, pp): + if self.encoding in ['DW_ATE_signed', 'DW_ATE_unsigned', 'DW_ATE_unsigned_char' ]: + sign = '' if self.encoding == 'DW_ATE_signed' else 'u' + bits = int(self.byte_size) * 8 + return '%sint%s_t' % (sign, bits) + elif self.encoding == 'DW_ATE_signed_char' and int(self.byte_size) == 1: + return 'char'; + elif self.encoding == 'DW_ATE_float': + return self._mapval(self.byte_size, { + '16': 'long double', + '8': 'double', + '4': 'float', + }) + raise NotImplementedError('Invalid encoding: %s' % self) + +class TypeAliasDef(Def): + _is_alias = True + def _pp(self, pp): + alias = self._alias() + # push typedef name + if self.name and not alias.name: + alias.name = 'T(%s)' % self.name + # return type with modifiers + return self.type._pp(pp) + +class EnumerationTypeDef(Def): + def _pp(self, pp): + return 'enum ' + self._name_opt('UNKNOWN') + +class ConstTypeDef(AnonymousDef): + _is_alias = True + def _pp(self, pp): + return 'const ' + self.type._pp(pp) + +class VolatileTypeDef(AnonymousDef): + _is_alias = True + def _pp(self, pp): + return 'volatile ' + self.type._pp(pp) + +class ArrayDef(AnonymousDef): + def _pp(self, pp): + t = pp.run(self.type) + assert len(self.subranges) == 1 + try: + sz = int(self.subranges[0].upper_bound) + 1 + except ValueError: + s = re.sub(r'\(.+\)', '', self.subranges[0].upper_bound) + sz = int(s) + 1 + return '%s[%s]' % (t, sz) + +class ArraySubrangeDef(AnonymousDef): + pass + +class FunctionDef(Def): + def _pp(self, pp): + result = pp.run(self.result) + if not self.params: + params = "void" + else: + params = ', '.join([ pp.run(x) for x in self.params ]) + return "%s %s(%s);" % (result, self.name, params) + +class FunctionTypeDef(Def): + def _pp(self, pp): + result = pp.run(self.result) + if not self.params: + params = "void" + else: + params = ', '.join([ pp.run(x) for x in self.params ]) + return "F(%s, %s, (%s))" % (self._name_opt(), result, params) + +class ParameterDef(Def): + def _pp(self, pp): + t = pp.run(self.type) + return "%s %s" % (t, self._name_opt()) + +# TODO +class StructForwardDef(Def): + pass + +class IncompleteDef(Def): + def update(self, complete, cache=None): + self.complete = complete + complete.incomplete = self + if cache != None: + cached = cache.get(self.id) + if cached != None and isinstance(cached, IncompleteDef): + cache.replace(self.id, complete) + +class StructIncompleteDef(IncompleteDef): + def _pp(self, pp): + return "struct %s" % (self.name,) + +class UnionIncompleteDef(IncompleteDef): + def _pp(self, pp): + return "union %s" % (self.name,) + +class StructDef(Def): + def _pp_ex(self, pp, suffix=';'): + members = [ pp.run(x) for x in self.members ] + return "struct %s { %s }%s" % \ + (self._name_opt(), ' '.join(members), suffix) + def _pp(self, pp): + if self.name: + pp.run_nested(self) + return "struct %s" % (self.name,) + else: + return self._pp_ex(pp, suffix='') + +class UnionDef(Def): + def _pp_ex(self, pp, suffix=';'): + members = [ pp.run(x) for x in self.members ] + return "union %s { %s }%s" % \ + (self._name_opt(), ' '.join(members), suffix) + def _pp(self, pp): + if self.name: + pp.run_nested(self) + return "union %s" % (self.name,) + else: + return self._pp_ex(pp, suffix='') + +class MemberDef(Def): + def _pp(self, pp): + t = pp.run(self.type) + return "%s %s;" % (t, self._name_opt()) + +class Dwarf(object): + + cmpcache = Cache(enabled=Config.cmpcache_enabled) + + def __init__(self, dump): + self.dump = dump + + def _build_optarg_type(self, praw): + type = praw.optarg('type', Void()) + if type != Void(): + type = self.buildref(praw.unit, type) + return type + + def build_subprogram(self, raw): + params = [ self.build(x) for x in raw.nested ] + result = self._build_optarg_type(raw) + return FunctionDef(raw.id, raw.name, params=params, result=result) + + def build_subroutine_type(self, raw): + params = [ self.build(x) for x in raw.nested ] + result = self._build_optarg_type(raw) + return FunctionTypeDef(raw.id, raw.optname, params=params, result=result) + + def build_formal_parameter(self, raw): + type = self.buildref(raw.unit, raw.arg('type')) + return ParameterDef(raw.id, raw.optname, type=type) + + def build_pointer_type(self, raw): + type = self._build_optarg_type(raw) + return PointerDef(raw.id, type=type) + + def build_member(self, raw): + type = self.buildref(raw.unit, raw.arg('type')) + return MemberDef(raw.id, raw.name, type=type) + + def build_structure_type(self, raw): + incomplete = raw.unit.incomplete.get(raw.id) + if incomplete == None: + incomplete = StructIncompleteDef(raw.id, raw.optname) + raw.unit.incomplete.put(raw.id, incomplete) + else: + return incomplete + members = [ self.build(x) for x in raw.nested ] + byte_size = raw.optarg('byte_size', None) + if byte_size == None: + obj = StructForwardDef(raw.id, raw.name, members=members, + forcename=raw.name) + obj = StructDef(raw.id, raw.optname, members=members, + byte_size=byte_size) + incomplete.update(obj, cache=raw.unit.cache) + return obj + + def build_union_type(self, raw): + incomplete = raw.unit.incomplete.get(raw.id) + if incomplete == None: + incomplete = UnionIncompleteDef(raw.id, raw.optname) + raw.unit.incomplete.put(raw.id, incomplete) + else: + return incomplete + members = [ self.build(x) for x in raw.nested ] + byte_size = raw.optarg('byte_size', None) + obj = UnionDef(raw.id, raw.optname, members=members, + byte_size=byte_size) + obj.incomplete = incomplete + incomplete.complete = obj + return obj + + def build_typedef(self, raw): + type = self.buildref(raw.unit, raw.arg('type')) + return TypeAliasDef(raw.id, raw.name, type=type) + + def build_const_type(self, raw): + type = self._build_optarg_type(raw) + return ConstTypeDef(raw.id, type=type) + + def build_volatile_type(self, raw): + type = self.buildref(raw.unit, raw.arg('type')) + return VolatileTypeDef(raw.id, type=type) + + def build_enumeration_type(self, raw): + # TODO handle DW_TAG_enumerator ??? + return EnumerationTypeDef(raw.id, name=raw.optname, + byte_size=raw.arg('byte_size')) + + def build_base_type(self, raw): + return BaseTypeDef(raw.id, raw.optname, + byte_size=raw.arg('byte_size'), encoding=raw.arg('encoding')) + + def build_array_type(self, raw): + type = self.buildref(raw.unit, raw.arg('type')) + subranges = [ self.build(x) for x in raw.nested ] + return ArrayDef(raw.id, type=type, subranges=subranges) + + def build_subrange_type(self, raw): + type = self.buildref(raw.unit, raw.arg('type')) + return ArraySubrangeDef(raw.id, type=type, + upper_bound=raw.arg('upper_bound')) + + def build_unspecified_parameters(self, raw): + return VarArgs(raw.id) + + def _get_id(self, id): + try: + return int(id) + except ValueError: + if (id.startswith('<') and id.endswith('>')): + return int(id[1:-1]) + else: + raise ValueError("Invalid dwarf id: %s" % id) + + def build(self, raw): + obj = raw.unit.cache.get(raw.id) + if obj != None: + return obj + builder_name = raw.tag.replace('DW_TAG_', 'build_') + try: + builder = getattr(self, builder_name) + except AttributeError: + raise AttributeError("Unknown dwarf tag: %s" % raw) + obj = builder(raw) + raw.unit.cache.put(obj.id, obj) + return obj + + def buildref(self, unit, id): + id = self._get_id(id) + raw = unit.tags[id] + obj = self.build(raw) + return obj + +# }}} + +class Shlib(object): + def __init__(self, libfile): + self.libfile = libfile + self.versions = {} + self.alias_syms = {} + + def parse_objdump(self): + objdump = ObjdumpParser(self.libfile) + objdump.run() + for p in objdump.dynamic_symbols: + vername = p['ver'] + if vername.startswith('(') and vername.endswith(')'): + vername = vername[1:-1] + if not Config.version_filter.match(vername): + continue + if not Config.symbol_filter.match(p['symbol']): + continue + sym = Symbol(p['symbol'], p['offset'], vername, self) + if not self.versions.has_key(vername): + self.versions[vername] = VersionMap(vername) + self.versions[vername].append(sym) + if Config.alias_prefixes: + self.local_offsetmap = objdump.local_offsetmap + for p in objdump.local_symbols: + for prefix in Config.alias_prefixes: + if not p['symbol'].startswith(prefix): + continue + alias = SymbolAlias(p['symbol'], prefix, p['offset']) + if self.alias_syms.has_key(alias.name): + prevalias = self.alias_syms[alias.name] + if alias.name != prevalias.name or \ + alias.offset != prevalias.offset: + print >> sys.stderr, "WARN: Symbol alias is " \ + "already defined: %s: %s at %08x -- %s at %08x" % \ + (alias.alias, alias.name, alias.offset, + prevalias.name, prevalias.offset) + self.alias_syms[alias.name] = alias + + def parse_dwarfdump(self): + dwarfdump = DwarfdumpParser(self.libfile) + def lookup(sym): + raw = None + try: + raw = dwarfdump.offsetmap[sym.offset] + except: + try: + localnames = self.local_offsetmap[sym.offset] + localnames.sort(key=lambda x: -len(x)) + for localname in localnames: + if not self.alias_syms.has_key(localname): + continue + alias = self.alias_syms[localname] + raw = dwarfdump.offsetmap[alias.offset] + break + except: + pass + return raw + dwarfdump.run() + dwarf = Dwarf(dwarfdump) + for ver in self.versions.values(): + for sym in ver.symbols.values(): + raw = lookup(sym); + if not raw: + print >> sys.stderr, "WARN: Symbol %s (%s) not found at offset 0x%x" % \ + (sym.name_ver, self.libfile, sym.offset) + continue + if Config.verbose >= 3: + print "Parsing symbol %s (%s)" % (sym.name_ver, self.libfile) + sym.definition = dwarf.build(raw) + + def parse(self): + self.parse_objdump() + self.parse_dwarfdump() + +# {{{ parsers + +class Parser(object): + def __init__(self, proc): + self.proc = proc + self.parser = self.parse_begin + + def run(self): + fd = os.popen(self.proc, 'r') + while True: + line = fd.readline() + if (not line): + break + line = line.strip() + if (line): + self.parser(line) + + def parse_begin(self, line): + print(line) + +class ObjdumpParser(Parser): + + re_header = re.compile('(?P\w*)\s*SYMBOL TABLE:') + + re_local_symbol = re.compile('(?P[0-9a-fA-F]+)\s+(?P\w+)\s+(?P\w+)\s+(?P
[^\s]+)\s+(?P[0-9a-fA-F]+)\s*(?P[^\s]*)') + re_lame_symbol = re.compile('(?P[0-9a-fA-F]+)\s+(?P\w+)\s+\*[A-Z]+\*') + + re_dynamic_symbol = re.compile('(?P[0-9a-fA-F]+)\s+(?P\w+)\s+(?P\w+)\s+(?P
[^\s]+)\s+(?P[0-9a-fA-F]+)\s*(?P[^\s]*)\s*(?P[^\s]*)') + + def __init__(self, libfile): + Parser.__init__(self, "%s -wtT %s" % (Config.objdump, libfile)) + self.dynamic_symbols = [] + self.local_symbols = [] + self.local_offsetmap = {} + + def parse_begin(self, line): + self.parse_header(line) + + def add_symbol(self, table, symbol, offsetmap = None): + offset = int(symbol['offset'], 16); + symbol['offset'] = offset + if (offset == 0): + return + table.append(symbol) + if offsetmap != None: + if not offsetmap.has_key(offset): + offsetmap[offset] = [symbol['symbol']] + else: + offsetmap[offset].append(symbol['symbol']) + + def parse_header(self, line): + m = self.re_header.match(line) + if (m): + table = m.group('table') + if (table == "DYNAMIC"): + self.parser = self.parse_dynamic + elif table == '': + self.parser = self.parse_local + else: + raise ValueError("Invalid symbol table: %s" % table) + return True + return False + + def parse_local(self, line): + if (self.parse_header(line)): + return + if (self.re_lame_symbol.match(line)): + return + m = self.re_local_symbol.match(line) + if (not m): + return + #raise ValueError("Invalid symbol definition: %s" % line) + p = m.groupdict() + if (p['symbol'] and p['symbol'].find('@') == -1): + self.add_symbol(self.local_symbols, p, self.local_offsetmap); + + def parse_dynamic(self, line): + if (self.parse_header(line)): + return + if (self.re_lame_symbol.match(line)): + return + m = self.re_dynamic_symbol.match(line) + if (not m): + raise ValueError("Invalid symbol definition: %s" % line) + p = m.groupdict() + if (p['symbol'] and p['ver']): + self.add_symbol(self.dynamic_symbols, p); + +class DwarfdumpParser(Parser): + + tagcache_stats = Cache.CacheStats() + + class Unit(object): + def __init__(self): + self.cache = Cache(enabled=Config.dwarfcache_enabled, + stats=DwarfdumpParser.tagcache_stats) + self.incomplete = Cache() + self.tags = {} + + class Tag(object): + def __init__(self, unit, data): + self.unit = unit + self.id = int(data['id']) + self.level = int(data['level']) + self.tag = data['tag'] + self.args = {} + self.nested = [] + + @property + def name(self): + return self.arg('name') + + @property + def optname(self): + return self.optarg('name', None) + + def arg(self, a): + name = 'DW_AT_' + a + try: + return self.args[name] + except KeyError: + raise KeyError("Argument '%s' not found in %s: %s" % + (name, self, self.args)) + + def optarg(self, a, default): + try: + return self.arg(a) + except KeyError: + return default + *** DIFF OUTPUT TRUNCATED AT 1000 LINES *** From owner-svn-src-projects@FreeBSD.ORG Thu Aug 25 17:35:10 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 E9D96106564A; Thu, 25 Aug 2011 17:35:10 +0000 (UTC) (envelope-from mav@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id D9F1D8FC0A; Thu, 25 Aug 2011 17:35:10 +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 p7PHZAXm012836; Thu, 25 Aug 2011 17:35:10 GMT (envelope-from mav@svn.freebsd.org) Received: (from mav@localhost) by svn.freebsd.org (8.14.4/8.14.4/Submit) id p7PHZAfE012834; Thu, 25 Aug 2011 17:35:10 GMT (envelope-from mav@svn.freebsd.org) Message-Id: <201108251735.p7PHZAfE012834@svn.freebsd.org> From: Alexander Motin Date: Thu, 25 Aug 2011 17:35:10 +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: r225180 - projects/zfsd/head/sys/cam/scsi 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, 25 Aug 2011 17:35:11 -0000 Author: mav Date: Thu Aug 25 17:35:10 2011 New Revision: 225180 URL: http://svn.freebsd.org/changeset/base/225180 Log: Map "OK" bit to "No Error". Modified: projects/zfsd/head/sys/cam/scsi/scsi_enc_safte.c Modified: projects/zfsd/head/sys/cam/scsi/scsi_enc_safte.c ============================================================================== --- projects/zfsd/head/sys/cam/scsi/scsi_enc_safte.c Thu Aug 25 17:33:20 2011 (r225179) +++ projects/zfsd/head/sys/cam/scsi/scsi_enc_safte.c Thu Aug 25 17:35:10 2011 (r225180) @@ -694,6 +694,8 @@ safte_process_slotstatus(enc_softc_t *en if (buf[r+0] & 0x40) cache->elm_map[oid].encstat[0] |= SESCTL_PRDFAIL; if (cache->elm_map[oid].enctype == ELMTYP_ARRAY_DEV) { + if (buf[r+0] & 0x01) + cache->elm_map[oid].encstat[1] |= 0x80; if (buf[r+0] & 0x04) cache->elm_map[oid].encstat[1] |= 0x02; if (buf[r+0] & 0x08) @@ -767,8 +769,6 @@ safte_fill_control_request(enc_softc_t * ep->priv |= 0x40; if (req->elm_stat[3] & SESCTL_RQSFLT) ep->priv |= 0x02; - if ((ep->priv & 0x46) == 0) - ep->priv |= 0x01; /* no errors */ if (ep->enctype == ELMTYP_ARRAY_DEV) { if (req->elm_stat[1] & 0x01) ep->priv |= 0x200; @@ -782,7 +782,11 @@ safte_fill_control_request(enc_softc_t * ep->priv |= 0x20; if (req->elm_stat[1] & 0x20) ep->priv |= 0x100; + if (req->elm_stat[1] & 0x80) + ep->priv |= 0x01; } + if (ep->priv == 0) + ep->priv |= 0x01; /* no errors */ buf[0] = SAFTE_WT_DSTAT; for (i = 0; i < cfg->Nslots; i++) { From owner-svn-src-projects@FreeBSD.ORG Thu Aug 25 17:43:06 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 76FC21065670; Thu, 25 Aug 2011 17:43:06 +0000 (UTC) (envelope-from mdf@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id 677DB8FC13; Thu, 25 Aug 2011 17:43:06 +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 p7PHh66P013132; Thu, 25 Aug 2011 17:43:06 GMT (envelope-from mdf@svn.freebsd.org) Received: (from mdf@localhost) by svn.freebsd.org (8.14.4/8.14.4/Submit) id p7PHh6Uo013130; Thu, 25 Aug 2011 17:43:06 GMT (envelope-from mdf@svn.freebsd.org) Message-Id: <201108251743.p7PHh6Uo013130@svn.freebsd.org> From: Matthew D Fleming Date: Thu, 25 Aug 2011 17:43:06 +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: r225182 - projects/ino64/lib/libc 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, 25 Aug 2011 17:43:06 -0000 Author: mdf Date: Thu Aug 25 17:43:06 2011 New Revision: 225182 URL: http://svn.freebsd.org/changeset/base/225182 Log: Support including extra Makefiles during libc build. GSoC r222834. Code by Gleb Kurtsou. Modified: projects/ino64/lib/libc/Makefile Modified: projects/ino64/lib/libc/Makefile ============================================================================== --- projects/ino64/lib/libc/Makefile Thu Aug 25 17:42:27 2011 (r225181) +++ projects/ino64/lib/libc/Makefile Thu Aug 25 17:43:06 2011 (r225182) @@ -140,6 +140,12 @@ libkern.${LIBC_ARCH}:: ${KMSRCS} cp -p ${.ALLSRC} ${DESTDIR}/sys/libkern/${LIBC_ARCH} .endif +# LIBC_EXTRAMK is used by the shlib-compat check script. Normally +# libc syscalls are assembly files with no dwarf debug output. +.if defined(LIBC_EXTRAMK) && !empty(LIBC_EXTRAMK) +.include "${LIBC_EXTRAMK}" +.endif + .include # Disable warnings in contributed sources. From owner-svn-src-projects@FreeBSD.ORG Fri Aug 26 16:49:18 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 5FCA7106564A; Fri, 26 Aug 2011 16:49:18 +0000 (UTC) (envelope-from mdf@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id 0B3AB8FC12; Fri, 26 Aug 2011 16:49:18 +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 p7QGnHfV062956; Fri, 26 Aug 2011 16:49:17 GMT (envelope-from mdf@svn.freebsd.org) Received: (from mdf@localhost) by svn.freebsd.org (8.14.4/8.14.4/Submit) id p7QGnH3P062952; Fri, 26 Aug 2011 16:49:17 GMT (envelope-from mdf@svn.freebsd.org) Message-Id: <201108261649.p7QGnH3P062952@svn.freebsd.org> From: Matthew D Fleming Date: Fri, 26 Aug 2011 16:49:17 +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: r225192 - projects/ino64/tools/tools/shlib-compat 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, 26 Aug 2011 16:49:18 -0000 Author: mdf Date: Fri Aug 26 16:49:17 2011 New Revision: 225192 URL: http://svn.freebsd.org/changeset/base/225192 Log: Update shlib-compat scripts with latest version from GSoC branch. GSoC r225420. Code by Gleb Kurtsou. Modified: projects/ino64/tools/tools/shlib-compat/README projects/ino64/tools/tools/shlib-compat/shlib-compat-dirs.sh projects/ino64/tools/tools/shlib-compat/shlib-compat.py Modified: projects/ino64/tools/tools/shlib-compat/README ============================================================================== --- projects/ino64/tools/tools/shlib-compat/README Fri Aug 26 16:03:34 2011 (r225191) +++ projects/ino64/tools/tools/shlib-compat/README Fri Aug 26 16:49:17 2011 (r225192) @@ -14,6 +14,7 @@ adding the following to /etc/make.conf: LIBC_EXTRAMK=/usr/src/tools/tools/shlib-compat/Makefile.sysfake To compare libc.so versions compiled with sysfake stubs: -./shlib-compat -v --alias-prefix __sysfake_ --alias-prefix __sysfake_freebsd8_ \ +./shlib-compat.py -v --alias-prefix __sysfake_ \ + --alias-prefix __sysfake_freebsd8_ \ --exclude-ver FBSDprivate \ --out-orig out-orig.c --out-new out-new.c libc.so.7.orig libc.so.7.new Modified: projects/ino64/tools/tools/shlib-compat/shlib-compat-dirs.sh ============================================================================== --- projects/ino64/tools/tools/shlib-compat/shlib-compat-dirs.sh Fri Aug 26 16:03:34 2011 (r225191) +++ projects/ino64/tools/tools/shlib-compat/shlib-compat-dirs.sh Fri Aug 26 16:49:17 2011 (r225192) @@ -2,7 +2,7 @@ SHLIB_COMPAT=$(dirname $0)/shlib-compat -if [ $# -ne 3 ]; then +if [ $# -lt 3 ]; then echo "Usage: $0 orig-dir new-dir output-dir" exit 1 fi @@ -10,6 +10,7 @@ fi orig=$1 new=$2 out=$3 +shift 3 remove_empty() { local i @@ -34,7 +35,7 @@ list=`(cd $rorig; ls; cd $rnew; ls) | so for i in $list; do echo $i test_file $orig/$i $new/$i || continue - $SHLIB_COMPAT --out-orig $out/$i.orig.c --out-new $out/$i.new.c -v \ + $SHLIB_COMPAT --out-orig $out/$i.orig.c --out-new $out/$i.new.c -v "$@" \ $orig/$i $new/$i > $out/$i.cmp 2> $out/$i.err || true remove_empty $out/$i.orig.c $out/$i.new.c $out/$i.cmp $out/$i.err if [ -f $out/$i.orig.c -a -f $out/$i.new.c ]; then Modified: projects/ino64/tools/tools/shlib-compat/shlib-compat.py ============================================================================== --- projects/ino64/tools/tools/shlib-compat/shlib-compat.py Fri Aug 26 16:03:34 2011 (r225191) +++ projects/ino64/tools/tools/shlib-compat/shlib-compat.py Fri Aug 26 16:49:17 2011 (r225192) @@ -44,6 +44,9 @@ class Config(object): # debug cmpcache_enabled = True dwarfcache_enabled = True + w_alias = True + w_cached = False + w_symbol = True class FileConfig(object): filename = None @@ -63,6 +66,10 @@ class Config(object): class App(object): result_code = 0 +def warn(cond, msg): + if cond: + print >> sys.stderr, "WARN: " + msg + # {{{ misc class StrFilter(object): @@ -125,8 +132,8 @@ class Cache(object): if self.items.has_key(id) and obj is not self.items[id]: #raise ValueError("Item is already cached: %d (%s, %s)" % # (id, self.items[id], obj)) - print >> sys.stderr, "WARN: Item is already cached: %d (%s, %s)" % \ - (id, self.items[id], obj) + warn(Config.w_cached, "Item is already cached: %d (%s, %s)" % \ + (id, self.items[id], obj)) self.items[id] = obj def replace(self, id, obj): @@ -325,8 +332,9 @@ class PointerDef(AnonymousDef): return "%s*" % (t,) class BaseTypeDef(Def): + inttypes = ['DW_ATE_signed', 'DW_ATE_unsigned', 'DW_ATE_unsigned_char'] def _pp(self, pp): - if self.encoding in ['DW_ATE_signed', 'DW_ATE_unsigned', 'DW_ATE_unsigned_char' ]: + if self.encoding in self.inttypes: sign = '' if self.encoding == 'DW_ATE_signed' else 'u' bits = int(self.byte_size) * 8 return '%sint%s_t' % (sign, bits) @@ -449,7 +457,11 @@ class UnionDef(Def): class MemberDef(Def): def _pp(self, pp): t = pp.run(self.type) - return "%s %s;" % (t, self._name_opt()) + if self.bit_size: + bits = ":%s" % self.bit_size + else: + bits = "" + return "%s %s%s;" % (t, self._name_opt(), bits) class Dwarf(object): @@ -465,6 +477,8 @@ class Dwarf(object): return type def build_subprogram(self, raw): + if raw.optname == None: + raw.setname('SUBPROGRAM_NONAME_' + raw.arg('low_pc')); params = [ self.build(x) for x in raw.nested ] result = self._build_optarg_type(raw) return FunctionDef(raw.id, raw.name, params=params, result=result) @@ -475,7 +489,7 @@ class Dwarf(object): return FunctionTypeDef(raw.id, raw.optname, params=params, result=result) def build_formal_parameter(self, raw): - type = self.buildref(raw.unit, raw.arg('type')) + type = self._build_optarg_type(raw) return ParameterDef(raw.id, raw.optname, type=type) def build_pointer_type(self, raw): @@ -484,7 +498,8 @@ class Dwarf(object): def build_member(self, raw): type = self.buildref(raw.unit, raw.arg('type')) - return MemberDef(raw.id, raw.name, type=type) + return MemberDef(raw.id, raw.name, type=type, + bit_size=raw.optarg('bit_size', None)) def build_structure_type(self, raw): incomplete = raw.unit.incomplete.get(raw.id) @@ -519,7 +534,7 @@ class Dwarf(object): return obj def build_typedef(self, raw): - type = self.buildref(raw.unit, raw.arg('type')) + type = self._build_optarg_type(raw) return TypeAliasDef(raw.id, raw.name, type=type) def build_const_type(self, raw): @@ -527,7 +542,7 @@ class Dwarf(object): return ConstTypeDef(raw.id, type=type) def build_volatile_type(self, raw): - type = self.buildref(raw.unit, raw.arg('type')) + type = self._build_optarg_type(raw) return VolatileTypeDef(raw.id, type=type) def build_enumeration_type(self, raw): @@ -547,7 +562,7 @@ class Dwarf(object): def build_subrange_type(self, raw): type = self.buildref(raw.unit, raw.arg('type')) return ArraySubrangeDef(raw.id, type=type, - upper_bound=raw.arg('upper_bound')) + upper_bound=raw.optarg('upper_bound', 0)) def build_unspecified_parameters(self, raw): return VarArgs(raw.id) @@ -614,10 +629,10 @@ class Shlib(object): prevalias = self.alias_syms[alias.name] if alias.name != prevalias.name or \ alias.offset != prevalias.offset: - print >> sys.stderr, "WARN: Symbol alias is " \ + warn(Config.w_alias, "Symbol alias is " \ "already defined: %s: %s at %08x -- %s at %08x" % \ (alias.alias, alias.name, alias.offset, - prevalias.name, prevalias.offset) + prevalias.name, prevalias.offset)) self.alias_syms[alias.name] = alias def parse_dwarfdump(self): @@ -645,14 +660,17 @@ class Shlib(object): for sym in ver.symbols.values(): raw = lookup(sym); if not raw: - print >> sys.stderr, "WARN: Symbol %s (%s) not found at offset 0x%x" % \ - (sym.name_ver, self.libfile, sym.offset) + warn(Config.w_symbol, "Symbol %s (%s) not found at offset 0x%x" % \ + (sym.name_ver, self.libfile, sym.offset)) continue if Config.verbose >= 3: print "Parsing symbol %s (%s)" % (sym.name_ver, self.libfile) sym.definition = dwarf.build(raw) def parse(self): + if not os.path.isfile(self.libfile): + print >> sys.stderr, ("No such file: %s" % self.libfile) + sys.exit(1) self.parse_objdump() self.parse_dwarfdump() @@ -672,6 +690,10 @@ class Parser(object): line = line.strip() if (line): self.parser(line) + err = fd.close() + if err: + print >> sys.stderr, ("Execution failed: %s" % self.proc) + sys.exit(2) def parse_begin(self, line): print(line) @@ -772,6 +794,9 @@ class DwarfdumpParser(Parser): def optname(self): return self.optarg('name', None) + def setname(self, name): + self.args['DW_AT_name'] = name + def arg(self, a): name = 'DW_AT_' + a try: @@ -979,8 +1004,8 @@ def dump_symbols(commonver): sym = ver.symbols[symname] if not sym.origsym.definition or not sym.newsym.definition: # XXX - print >> sys.stderr, 'WARN: Missing symbol definition: %s@%s' % \ - (symname, ver.name) + warn(Config.w_symbol, 'Missing symbol definition: %s@%s' % \ + (symname, ver.name)) continue d_orig.run(sym.origsym) d_new.run(sym.newsym) @@ -1007,6 +1032,11 @@ if __name__ == '__main__': parser.add_option('--include-ver', action='append', metavar="RE") parser.add_option('--exclude-sym', action='append', metavar="RE") parser.add_option('--include-sym', action='append', metavar="RE") + for opt in ['alias', 'cached', 'symbol']: + parser.add_option("--w-" + opt, + action="store_true", dest="w_" + opt) + parser.add_option("--w-no-" + opt, + action="store_false", dest="w_" + opt) (opts, args) = parser.parse_args() if len(args) != 2: @@ -1036,6 +1066,11 @@ if __name__ == '__main__': getattr(v, a).extend(opt) Config.version_filter.compile() Config.symbol_filter.compile() + for w in ['w_alias', 'w_cached', 'w_symbol']: + if hasattr(opts, w): + v = getattr(opts, w) + if v != None: + setattr(Config, w, v) (Config.origfile.filename, Config.newfile.filename) = (args[0], args[1]) From owner-svn-src-projects@FreeBSD.ORG Fri Aug 26 17:02:54 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 21366106564A; Fri, 26 Aug 2011 17:02:54 +0000 (UTC) (envelope-from mdf@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id 103D78FC13; Fri, 26 Aug 2011 17:02:54 +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 p7QH2ruO063405; Fri, 26 Aug 2011 17:02:53 GMT (envelope-from mdf@svn.freebsd.org) Received: (from mdf@localhost) by svn.freebsd.org (8.14.4/8.14.4/Submit) id p7QH2riL063402; Fri, 26 Aug 2011 17:02:53 GMT (envelope-from mdf@svn.freebsd.org) Message-Id: <201108261702.p7QH2riL063402@svn.freebsd.org> From: Matthew D Fleming Date: Fri, 26 Aug 2011 17:02:53 +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: r225193 - in projects/ino64/sys: fs/unionfs kern 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, 26 Aug 2011 17:02:54 -0000 Author: mdf Date: Fri Aug 26 17:02:53 2011 New Revision: 225193 URL: http://svn.freebsd.org/changeset/base/225193 Log: Skip empty directory entries (entries with zero inode number) during name lookup. GSoC r222838. Code by Gleb Kurtsou. Modified: projects/ino64/sys/fs/unionfs/union_subr.c projects/ino64/sys/kern/vfs_default.c Modified: projects/ino64/sys/fs/unionfs/union_subr.c ============================================================================== --- projects/ino64/sys/fs/unionfs/union_subr.c Fri Aug 26 16:49:17 2011 (r225192) +++ projects/ino64/sys/fs/unionfs/union_subr.c Fri Aug 26 17:02:53 2011 (r225193) @@ -1177,7 +1177,7 @@ unionfs_check_rmdir(struct vnode *vp, st edp = (struct dirent*)&buf[sizeof(buf) - uio.uio_resid]; for (dp = (struct dirent*)buf; !error && dp < edp; dp = (struct dirent*)((caddr_t)dp + dp->d_reclen)) { - if (dp->d_type == DT_WHT || + if (dp->d_type == DT_WHT || dp->d_fileno == 0 || (dp->d_namlen == 1 && dp->d_name[0] == '.') || (dp->d_namlen == 2 && !bcmp(dp->d_name, "..", 2))) continue; Modified: projects/ino64/sys/kern/vfs_default.c ============================================================================== --- projects/ino64/sys/kern/vfs_default.c Fri Aug 26 16:49:17 2011 (r225192) +++ projects/ino64/sys/kern/vfs_default.c Fri Aug 26 17:02:53 2011 (r225193) @@ -339,8 +339,8 @@ dirent_exists(struct vnode *vp, const ch if (error) goto out; - if ((dp->d_type != DT_WHT) && - !strcmp(dp->d_name, dirname)) { + if (dp->d_type != DT_WHT && dp->d_fileno != 0 && + strcmp(dp->d_name, dirname) == 0) { found = 1; goto out; } From owner-svn-src-projects@FreeBSD.ORG Fri Aug 26 17:28:29 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 D4C3B106564A; Fri, 26 Aug 2011 17:28:29 +0000 (UTC) (envelope-from mdf@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id C3BD08FC0C; Fri, 26 Aug 2011 17:28:29 +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 p7QHSTCN064211; Fri, 26 Aug 2011 17:28:29 GMT (envelope-from mdf@svn.freebsd.org) Received: (from mdf@localhost) by svn.freebsd.org (8.14.4/8.14.4/Submit) id p7QHST4m064209; Fri, 26 Aug 2011 17:28:29 GMT (envelope-from mdf@svn.freebsd.org) Message-Id: <201108261728.p7QHST4m064209@svn.freebsd.org> From: Matthew D Fleming Date: Fri, 26 Aug 2011 17:28:29 +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: r225195 - projects/ino64/include/protocols 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, 26 Aug 2011 17:28:29 -0000 Author: mdf Date: Fri Aug 26 17:28:29 2011 New Revision: 225195 URL: http://svn.freebsd.org/changeset/base/225195 Log: Don't use ino_t in dumprestore protocol definition. GSoC r222842. Code by Gleb Kurtsou. Modified: projects/ino64/include/protocols/dumprestore.h Modified: projects/ino64/include/protocols/dumprestore.h ============================================================================== --- projects/ino64/include/protocols/dumprestore.h Fri Aug 26 17:08:22 2011 (r225194) +++ projects/ino64/include/protocols/dumprestore.h Fri Aug 26 17:28:29 2011 (r225195) @@ -65,6 +65,15 @@ #endif #define CHECKSUM (int)84446 +/* + * Since ino_t size is changing to 64-bits, yet we desire this structure to + * remain compatible with exiting dump formats, we do NOT use ino_t here, + * but rather define a 32-bit type in its place. At some point, it may be + * necessary to use some of the c_spare[] in order to fully support 64-bit + * inode numbers. + */ +typedef uint32_t dump_ino_t; + union u_spcl { char dummy[TP_BSIZE]; struct s_spcl { @@ -73,7 +82,7 @@ union u_spcl { int32_t c_old_ddate; /* date of previous dump */ int32_t c_volume; /* dump volume number */ int32_t c_old_tapea; /* logical block of this record */ - ino_t c_inumber; /* number of inode */ + dump_ino_t c_inumber; /* number of inode */ int32_t c_magic; /* magic number (see above) */ int32_t c_checksum; /* record checksum */ /* From owner-svn-src-projects@FreeBSD.ORG Fri Aug 26 17:37:09 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 8F1F8106566B; Fri, 26 Aug 2011 17:37:09 +0000 (UTC) (envelope-from mdf@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id 6477D8FC0A; Fri, 26 Aug 2011 17:37:09 +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 p7QHb9ds064547; Fri, 26 Aug 2011 17:37:09 GMT (envelope-from mdf@svn.freebsd.org) Received: (from mdf@localhost) by svn.freebsd.org (8.14.4/8.14.4/Submit) id p7QHb9JZ064544; Fri, 26 Aug 2011 17:37:09 GMT (envelope-from mdf@svn.freebsd.org) Message-Id: <201108261737.p7QHb9JZ064544@svn.freebsd.org> From: Matthew D Fleming Date: Fri, 26 Aug 2011 17:37:09 +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: r225197 - in projects/ino64/sys/fs: hpfs ntfs 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, 26 Aug 2011 17:37:09 -0000 Author: mdf Date: Fri Aug 26 17:37:09 2011 New Revision: 225197 URL: http://svn.freebsd.org/changeset/base/225197 Log: Use C99-style struct initialization for dirent in preparation for changing the structure. GSoC r222843. Code by Gleb Kurtsou. Modified: projects/ino64/sys/fs/hpfs/hpfs_vnops.c projects/ino64/sys/fs/ntfs/ntfs_vnops.c Modified: projects/ino64/sys/fs/hpfs/hpfs_vnops.c ============================================================================== --- projects/ino64/sys/fs/hpfs/hpfs_vnops.c Fri Aug 26 17:35:22 2011 (r225196) +++ projects/ino64/sys/fs/hpfs/hpfs_vnops.c Fri Aug 26 17:37:09 2011 (r225197) @@ -797,10 +797,21 @@ hpfs_de_uiomove ( } -static struct dirent hpfs_de_dot = - { 0, sizeof(struct dirent), DT_DIR, 1, "." }; -static struct dirent hpfs_de_dotdot = - { 0, sizeof(struct dirent), DT_DIR, 2, ".." }; +static struct dirent hpfs_de_dot = { + .d_fileno = 0, + .d_reclen = sizeof(struct dirent), + .d_type = DT_DIR, + .d_namlen = 1, + .d_name = "." +}; +static struct dirent hpfs_de_dotdot = { + .d_fileno = 0, + .d_reclen = sizeof(struct dirent), + .d_type = DT_DIR, + .d_namlen = 2, + .d_name = ".." +}; + int hpfs_readdir(ap) struct vop_readdir_args /* { Modified: projects/ino64/sys/fs/ntfs/ntfs_vnops.c ============================================================================== --- projects/ino64/sys/fs/ntfs/ntfs_vnops.c Fri Aug 26 17:35:22 2011 (r225196) +++ projects/ino64/sys/fs/ntfs/ntfs_vnops.c Fri Aug 26 17:37:09 2011 (r225197) @@ -493,8 +493,13 @@ ntfs_readdir(ap) /* Simulate . in every dir except ROOT */ if( ip->i_number != NTFS_ROOTINO ) { - struct dirent dot = { NTFS_ROOTINO, - sizeof(struct dirent), DT_DIR, 1, "." }; + struct dirent dot = { + .d_fileno = NTFS_ROOTINO, + .d_reclen = sizeof(struct dirent), + .d_type = DT_DIR, + .d_namlen = 1, + .d_name = "." + }; if( uio->uio_offset < sizeof(struct dirent) ) { dot.d_fileno = ip->i_number; @@ -508,8 +513,13 @@ ntfs_readdir(ap) /* Simulate .. in every dir including ROOT */ if( uio->uio_offset < 2 * sizeof(struct dirent) ) { - struct dirent dotdot = { NTFS_ROOTINO, - sizeof(struct dirent), DT_DIR, 2, ".." }; + struct dirent dotdot = { + .d_fileno = NTFS_ROOTINO, + .d_reclen = sizeof(struct dirent), + .d_type = DT_DIR, + .d_namlen = 2, + .d_name = ".." + }; error = uiomove((char *)&dotdot,sizeof(struct dirent),uio); if(error) From owner-svn-src-projects@FreeBSD.ORG Fri Aug 26 17:45: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 62F241065676; Fri, 26 Aug 2011 17:45:57 +0000 (UTC) (envelope-from mdf@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id 384648FC15; Fri, 26 Aug 2011 17:45: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 p7QHjv1b064836; Fri, 26 Aug 2011 17:45:57 GMT (envelope-from mdf@svn.freebsd.org) Received: (from mdf@localhost) by svn.freebsd.org (8.14.4/8.14.4/Submit) id p7QHjva1064833; Fri, 26 Aug 2011 17:45:57 GMT (envelope-from mdf@svn.freebsd.org) Message-Id: <201108261745.p7QHjva1064833@svn.freebsd.org> From: Matthew D Fleming Date: Fri, 26 Aug 2011 17:45: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: r225198 - in projects/ino64/sys: kern sys 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, 26 Aug 2011 17:45:57 -0000 Author: mdf Date: Fri Aug 26 17:45:56 2011 New Revision: 225198 URL: http://svn.freebsd.org/changeset/base/225198 Log: Add kern_fhstat() wrapper, adjust fhstat() to use it. GSoC r222844. Gode by Gleb Kurtsou. Modified: projects/ino64/sys/kern/vfs_syscalls.c projects/ino64/sys/sys/syscallsubr.h Modified: projects/ino64/sys/kern/vfs_syscalls.c ============================================================================== --- projects/ino64/sys/kern/vfs_syscalls.c Fri Aug 26 17:37:09 2011 (r225197) +++ projects/ino64/sys/kern/vfs_syscalls.c Fri Aug 26 17:45:56 2011 (r225198) @@ -4637,15 +4637,25 @@ struct fhstat_args { }; #endif int -fhstat(td, uap) - struct thread *td; - register struct fhstat_args /* { - struct fhandle *u_fhp; - struct stat *sb; - } */ *uap; +fhstat(struct thread *td, struct fhstat_args *uap) { struct stat sb; - fhandle_t fh; + struct fhandle fh; + int error; + + error = copyin(uap->u_fhp, &fh, sizeof(fh)); + if (error != 0) + return (error); + error = kern_fhstat(td, fh, &sb); + if (error != 0) + return (error); + error = copyout(&sb, uap->sb, sizeof(sb)); + return (error); +} + +int +kern_fhstat(struct thread *td, struct fhandle fh, struct stat *sb) +{ struct mount *mp; struct vnode *vp; int vfslocked; @@ -4654,9 +4664,6 @@ fhstat(td, uap) error = priv_check(td, PRIV_VFS_FHSTAT); if (error) return (error); - error = copyin(uap->u_fhp, &fh, sizeof(fhandle_t)); - if (error) - return (error); if ((mp = vfs_busyfs(&fh.fh_fsid)) == NULL) return (ESTALE); vfslocked = VFS_LOCK_GIANT(mp); @@ -4666,12 +4673,9 @@ fhstat(td, uap) VFS_UNLOCK_GIANT(vfslocked); return (error); } - error = vn_stat(vp, &sb, td->td_ucred, NOCRED, td); + error = vn_stat(vp, sb, td->td_ucred, NOCRED, td); vput(vp); VFS_UNLOCK_GIANT(vfslocked); - if (error) - return (error); - error = copyout(&sb, uap->sb, sizeof(sb)); return (error); } Modified: projects/ino64/sys/sys/syscallsubr.h ============================================================================== --- projects/ino64/sys/sys/syscallsubr.h Fri Aug 26 17:37:09 2011 (r225197) +++ projects/ino64/sys/sys/syscallsubr.h Fri Aug 26 17:45:56 2011 (r225198) @@ -89,6 +89,7 @@ int kern_fchmodat(struct thread *td, int int kern_fchownat(struct thread *td, int fd, char *path, enum uio_seg pathseg, int uid, int gid, int flag); int kern_fcntl(struct thread *td, int fd, int cmd, intptr_t arg); +int kern_fhstat(struct thread *td, fhandle_t fh, struct stat *buf); int kern_fhstatfs(struct thread *td, fhandle_t fh, struct statfs *buf); int kern_fstat(struct thread *td, int fd, struct stat *sbp); int kern_fstatfs(struct thread *td, int fd, struct statfs *buf); From owner-svn-src-projects@FreeBSD.ORG Fri Aug 26 21:27: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 ECA5E106564A; Fri, 26 Aug 2011 21:27: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 DCF7A8FC12; Fri, 26 Aug 2011 21:27: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 p7QLRLhE071496; Fri, 26 Aug 2011 21:27:21 GMT (envelope-from cognet@svn.freebsd.org) Received: (from cognet@localhost) by svn.freebsd.org (8.14.4/8.14.4/Submit) id p7QLRLJ8071494; Fri, 26 Aug 2011 21:27:21 GMT (envelope-from cognet@svn.freebsd.org) Message-Id: <201108262127.p7QLRLJ8071494@svn.freebsd.org> From: Olivier Houchard Date: Fri, 26 Aug 2011 21:27: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: r225202 - 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: Fri, 26 Aug 2011 21:27:22 -0000 Author: cognet Date: Fri Aug 26 21:27:21 2011 New Revision: 225202 URL: http://svn.freebsd.org/changeset/base/225202 Log: Add arm11_setup For armv7, we could use the wfi instruction, except our toolchain is too old to support it. Obtained from: NetBSD Modified: projects/armv6/sys/arm/arm/cpufunc_asm_arm11.S Modified: projects/armv6/sys/arm/arm/cpufunc_asm_arm11.S ============================================================================== --- projects/armv6/sys/arm/arm/cpufunc_asm_arm11.S Fri Aug 26 21:22:34 2011 (r225201) +++ projects/armv6/sys/arm/arm/cpufunc_asm_arm11.S Fri Aug 26 21:27:21 2011 (r225202) @@ -122,3 +122,8 @@ ENTRY(arm11_tlb_flushD_SE) ENTRY(arm11_drain_writebuf) mcr p15, 0, r0, c7, c10, 4 /* drain write buffer */ mov pc, lr + +ENTRY_NP(arm11_setup) + mov r0, #0 + mcr p15, 0, r0, c7, c0, 4 /* wait for interrupt */ + RET From owner-svn-src-projects@FreeBSD.ORG Fri Aug 26 23: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 D0360106566B; Fri, 26 Aug 2011 23:05:34 +0000 (UTC) (envelope-from mav@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id C12468FC0A; Fri, 26 Aug 2011 23: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 p7QN5Y9P074545; Fri, 26 Aug 2011 23:05:34 GMT (envelope-from mav@svn.freebsd.org) Received: (from mav@localhost) by svn.freebsd.org (8.14.4/8.14.4/Submit) id p7QN5YHb074543; Fri, 26 Aug 2011 23:05:34 GMT (envelope-from mav@svn.freebsd.org) Message-Id: <201108262305.p7QN5YHb074543@svn.freebsd.org> From: Alexander Motin Date: Fri, 26 Aug 2011 23: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: r225205 - projects/zfsd/head/sys/cam/scsi 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, 26 Aug 2011 23:05:34 -0000 Author: mav Date: Fri Aug 26 23:05:34 2011 New Revision: 225205 URL: http://svn.freebsd.org/changeset/base/225205 Log: Report proper zero length when no descriptor available for element. Modified: projects/zfsd/head/sys/cam/scsi/scsi_enc_ses.c Modified: projects/zfsd/head/sys/cam/scsi/scsi_enc_ses.c ============================================================================== --- projects/zfsd/head/sys/cam/scsi/scsi_enc_ses.c Fri Aug 26 22:33:41 2011 (r225204) +++ projects/zfsd/head/sys/cam/scsi/scsi_enc_ses.c Fri Aug 26 23:05:34 2011 (r225205) @@ -2606,8 +2606,10 @@ ses_get_elm_desc(enc_softc_t *enc, encio /* Assume caller has already checked obj_id validity */ elmpriv = enc->enc_cache.elm_map[i].elm_private; /* object might not have a descriptor */ - if (elmpriv == NULL || elmpriv->descr == NULL) + if (elmpriv == NULL || elmpriv->descr == NULL) { + elmd->elm_desc_len = 0; return (0); + } if (elmd->elm_desc_len > elmpriv->descr_len) elmd->elm_desc_len = elmpriv->descr_len; copyout(elmpriv->descr, elmd->elm_desc_str, elmd->elm_desc_len); From owner-svn-src-projects@FreeBSD.ORG Fri Aug 26 23:45: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 DD1D2106566C; Fri, 26 Aug 2011 23:45:27 +0000 (UTC) (envelope-from mav@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id CD0B98FC12; Fri, 26 Aug 2011 23:45: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 p7QNjRQQ075714; Fri, 26 Aug 2011 23:45:27 GMT (envelope-from mav@svn.freebsd.org) Received: (from mav@localhost) by svn.freebsd.org (8.14.4/8.14.4/Submit) id p7QNjRWu075711; Fri, 26 Aug 2011 23:45:27 GMT (envelope-from mav@svn.freebsd.org) Message-Id: <201108262345.p7QNjRWu075711@svn.freebsd.org> From: Alexander Motin Date: Fri, 26 Aug 2011 23:45: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: r225206 - projects/zfsd/head/share/examples/ses/srcs 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, 26 Aug 2011 23:45:27 -0000 Author: mav Date: Fri Aug 26 23:45:27 2011 New Revision: 225206 URL: http://svn.freebsd.org/changeset/base/225206 Log: Unify getencstat output. Tune type and status names to match SES specification. Modified: projects/zfsd/head/share/examples/ses/srcs/eltsub.c projects/zfsd/head/share/examples/ses/srcs/getencstat.c Modified: projects/zfsd/head/share/examples/ses/srcs/eltsub.c ============================================================================== --- projects/zfsd/head/share/examples/ses/srcs/eltsub.c Fri Aug 26 23:05:34 2011 (r225205) +++ projects/zfsd/head/share/examples/ses/srcs/eltsub.c Fri Aug 26 23:45:27 2011 (r225206) @@ -53,16 +53,16 @@ geteltnm(int type) sprintf(rbuf, "Unspecified"); break; case ELMTYP_DEVICE: - sprintf(rbuf, "Device"); + sprintf(rbuf, "Device Slot"); break; case ELMTYP_POWER: - sprintf(rbuf, "Power supply"); + sprintf(rbuf, "Power Supply"); break; case ELMTYP_FAN: - sprintf(rbuf, "Cooling element"); + sprintf(rbuf, "Cooling"); break; case ELMTYP_THERM: - sprintf(rbuf, "Temperature sensors"); + sprintf(rbuf, "Temperature Sensors"); break; case ELMTYP_DOORLOCK: sprintf(rbuf, "Door Lock"); @@ -71,31 +71,31 @@ geteltnm(int type) sprintf(rbuf, "Audible alarm"); break; case ELMTYP_ESCC: - sprintf(rbuf, "Enclosure services controller electronics"); + sprintf(rbuf, "Enclosure Eervices Controller Electronics"); break; case ELMTYP_SCC: - sprintf(rbuf, "SCC controller electronics"); + sprintf(rbuf, "SCC Controller Electronics"); break; case ELMTYP_NVRAM: - sprintf(rbuf, "Nonvolatile cache"); + sprintf(rbuf, "Nonvolatile Cache"); break; case ELMTYP_INV_OP_REASON: sprintf(rbuf, "Invalid Operation Reason"); break; case ELMTYP_UPS: - sprintf(rbuf, "Uninterruptible power supply"); + sprintf(rbuf, "Uninterruptible Power Supply"); break; case ELMTYP_DISPLAY: sprintf(rbuf, "Display"); break; case ELMTYP_KEYPAD: - sprintf(rbuf, "Key pad entry device"); + sprintf(rbuf, "Key Pad Entry"); break; case ELMTYP_ENCLOSURE: sprintf(rbuf, "Enclosure"); break; case ELMTYP_SCSIXVR: - sprintf(rbuf, "SCSI port/transceiver"); + sprintf(rbuf, "SCSI Port/Transceiver"); break; case ELMTYP_LANGUAGE: sprintf(rbuf, "Language"); @@ -110,22 +110,22 @@ geteltnm(int type) sprintf(rbuf, "Current Sensor"); break; case ELMTYP_SCSI_TGT: - sprintf(rbuf, "SCSI target port"); + sprintf(rbuf, "SCSI Target Port"); break; case ELMTYP_SCSI_INI: - sprintf(rbuf, "SCSI initiator port"); + sprintf(rbuf, "SCSI Initiator Port"); break; case ELMTYP_SUBENC: - sprintf(rbuf, "Simple sub-enclosure"); + sprintf(rbuf, "Simple Subenclosure"); break; case ELMTYP_ARRAY_DEV: - sprintf(rbuf, "Array device"); + sprintf(rbuf, "Array Device Slot"); break; case ELMTYP_SAS_EXP: - sprintf(rbuf, "SAS expander"); + sprintf(rbuf, "SAS Expander"); break; case ELMTYP_SAS_CONN: - sprintf(rbuf, "SAS connector"); + sprintf(rbuf, "SAS Connector"); break; default: (void) sprintf(rbuf, "", type); @@ -140,31 +140,34 @@ scode2ascii(u_char code) static char rbuf[32]; switch (code & 0xf) { case SES_OBJSTAT_UNSUPPORTED: - sprintf(rbuf, "status not supported"); + sprintf(rbuf, "Unsupported"); break; case SES_OBJSTAT_OK: - sprintf(rbuf, "ok"); + sprintf(rbuf, "OK"); break; case SES_OBJSTAT_CRIT: - sprintf(rbuf, "critical"); + sprintf(rbuf, "Critical"); break; case SES_OBJSTAT_NONCRIT: - sprintf(rbuf, "non-critical"); + sprintf(rbuf, "Noncritical"); break; case SES_OBJSTAT_UNRECOV: - sprintf(rbuf, "unrecoverable"); + sprintf(rbuf, "Unrecoverable"); break; case SES_OBJSTAT_NOTINSTALLED: - sprintf(rbuf, "not installed"); + sprintf(rbuf, "Not Installed"); break; case SES_OBJSTAT_UNKNOWN: - sprintf(rbuf, "unknown status"); + sprintf(rbuf, "Unknown"); break; case SES_OBJSTAT_NOTAVAIL: - sprintf(rbuf, "status not available"); + sprintf(rbuf, "Not Available"); + break; + case SES_OBJSTAT_NOACCESS: + sprintf(rbuf, "No Access Allowed"); break; default: - sprintf(rbuf, "unknown status code %x", code & 0xf); + sprintf(rbuf, "", code & 0xf); break; } return (rbuf); @@ -177,7 +180,7 @@ stat2ascii(int eletype __unused, u_char static char ebuf[256], *scode; scode = scode2ascii(cstat[0]); - sprintf(ebuf, "Status=%s (bytes=0x%02x 0x%02x 0x%02x 0x%02x)", + sprintf(ebuf, "status: %s (0x%02x 0x%02x 0x%02x 0x%02x)", scode, cstat[0], cstat[1], cstat[2], cstat[3]); return (ebuf); } Modified: projects/zfsd/head/share/examples/ses/srcs/getencstat.c ============================================================================== --- projects/zfsd/head/share/examples/ses/srcs/getencstat.c Fri Aug 26 23:05:34 2011 (r225205) +++ projects/zfsd/head/share/examples/ses/srcs/getencstat.c Fri Aug 26 23:45:27 2011 (r225206) @@ -166,14 +166,11 @@ main(int a, char **v) (void)ioctl(fd, ENCIOC_GETELMDEVNAMES, (caddr_t)&objdn); fprintf(stdout, "Element 0x%x: %s", ob.elm_idx, geteltnm(objp[i].elm_type)); - if ((ob.cstat[0] & 0xf) == SES_OBJSTAT_OK) - fprintf(stdout, ", OK (%s)", - stat2ascii(objp[i].elm_type, ob.cstat)); - else - fprintf(stdout, ", %s", - stat2ascii(objp[i].elm_type, ob.cstat)); - fprintf(stdout, ", descriptor: '%s'", - objd.elm_desc_str); + fprintf(stdout, ", %s", + stat2ascii(objp[i].elm_type, ob.cstat)); + if (objd.elm_desc_len > 0) + fprintf(stdout, ", descriptor: '%s'", + objd.elm_desc_str); if (objdn.elm_names_len > 0) fprintf(stdout, ", dev: '%s'", objdn.elm_devnames); From owner-svn-src-projects@FreeBSD.ORG Sat Aug 27 12:09:07 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 135C6106564A; Sat, 27 Aug 2011 12:09:07 +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 03F118FC08; Sat, 27 Aug 2011 12:09:07 +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 p7RC96U2002867; Sat, 27 Aug 2011 12:09:06 GMT (envelope-from cognet@svn.freebsd.org) Received: (from cognet@localhost) by svn.freebsd.org (8.14.4/8.14.4/Submit) id p7RC96SA002865; Sat, 27 Aug 2011 12:09:06 GMT (envelope-from cognet@svn.freebsd.org) Message-Id: <201108271209.p7RC96SA002865@svn.freebsd.org> From: Olivier Houchard Date: Sat, 27 Aug 2011 12:09:06 +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: r225210 - 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, 27 Aug 2011 12:09:07 -0000 Author: cognet Date: Sat Aug 27 12:09:06 2011 New Revision: 225210 URL: http://svn.freebsd.org/changeset/base/225210 Log: When I said setup, I really meant sleep. Modified: projects/armv6/sys/arm/arm/cpufunc_asm_arm11.S Modified: projects/armv6/sys/arm/arm/cpufunc_asm_arm11.S ============================================================================== --- projects/armv6/sys/arm/arm/cpufunc_asm_arm11.S Sat Aug 27 08:49:55 2011 (r225209) +++ projects/armv6/sys/arm/arm/cpufunc_asm_arm11.S Sat Aug 27 12:09:06 2011 (r225210) @@ -123,7 +123,7 @@ ENTRY(arm11_drain_writebuf) mcr p15, 0, r0, c7, c10, 4 /* drain write buffer */ mov pc, lr -ENTRY_NP(arm11_setup) +ENTRY_NP(arm11_sleep) mov r0, #0 mcr p15, 0, r0, c7, c0, 4 /* wait for interrupt */ RET From owner-svn-src-projects@FreeBSD.ORG Sat Aug 27 12:10: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 97FF6106566C; Sat, 27 Aug 2011 12:10:12 +0000 (UTC) (envelope-from mav@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id 7DEB78FC12; Sat, 27 Aug 2011 12:10: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 p7RCACCD002941; Sat, 27 Aug 2011 12:10:12 GMT (envelope-from mav@svn.freebsd.org) Received: (from mav@localhost) by svn.freebsd.org (8.14.4/8.14.4/Submit) id p7RCACgb002936; Sat, 27 Aug 2011 12:10:12 GMT (envelope-from mav@svn.freebsd.org) Message-Id: <201108271210.p7RCACgb002936@svn.freebsd.org> From: Alexander Motin Date: Sat, 27 Aug 2011 12:10: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: r225211 - projects/zfsd/head/sys/cam/scsi 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, 27 Aug 2011 12:10:12 -0000 Author: mav Date: Sat Aug 27 12:10:12 2011 New Revision: 225211 URL: http://svn.freebsd.org/changeset/base/225211 Log: Fix/Implement I/O errors handling: - make done() method called even after I/O errors to handle them, - pass error argument to done() method, - return error code to user-level. Modified: projects/zfsd/head/sys/cam/scsi/scsi_enc.c projects/zfsd/head/sys/cam/scsi/scsi_enc_internal.h projects/zfsd/head/sys/cam/scsi/scsi_enc_safte.c projects/zfsd/head/sys/cam/scsi/scsi_enc_ses.c Modified: projects/zfsd/head/sys/cam/scsi/scsi_enc.c ============================================================================== --- projects/zfsd/head/sys/cam/scsi/scsi_enc.c Sat Aug 27 12:09:06 2011 (r225210) +++ projects/zfsd/head/sys/cam/scsi/scsi_enc.c Sat Aug 27 12:10:12 2011 (r225211) @@ -739,6 +739,7 @@ enc_fsm_step(enc_softc_t *enc) uint8_t *buf; struct enc_fsm_state *cur_state; int error; + uint32_t xfer_len; ENC_DLOG(enc, "%s enter %p\n", __func__, enc); @@ -760,30 +761,27 @@ enc_fsm_step(enc_softc_t *enc) ccb = cam_periph_getccb(enc->periph, CAM_PRIORITY_NORMAL); error = cur_state->fill(enc, cur_state, ccb, buf); - if (error == 0) { - error = cam_periph_runccb(ccb, cur_state->error, - ENC_CFLAGS, - ENC_FLAGS|SF_QUIET_IR, NULL); - } - } + if (error != 0) + goto done; - - if (error == 0) { - uint32_t len; + error = cam_periph_runccb(ccb, cur_state->error, + ENC_CFLAGS, + ENC_FLAGS|SF_QUIET_IR, NULL); + } - len = 0; - if (ccb != NULL) { - if (ccb->ccb_h.func_code == XPT_ATA_IO) - len = ccb->ataio.dxfer_len - ccb->ataio.resid; - else - len = ccb->csio.dxfer_len - ccb->csio.resid; - } + if (ccb != NULL) { + if (ccb->ccb_h.func_code == XPT_ATA_IO) + xfer_len = ccb->ataio.dxfer_len - ccb->ataio.resid; + else + xfer_len = ccb->csio.dxfer_len - ccb->csio.resid; + } else + xfer_len = 0; - cam_periph_unlock(enc->periph); - cur_state->done(enc, cur_state, ccb, &buf, len); - cam_periph_lock(enc->periph); - } + cam_periph_unlock(enc->periph); + cur_state->done(enc, cur_state, ccb, &buf, error, xfer_len); + cam_periph_lock(enc->periph); +done: ENC_DLOG(enc, "%s exit - result %d\n", __func__, error); ENC_FREE_AND_NULL(buf); if (ccb != NULL) Modified: projects/zfsd/head/sys/cam/scsi/scsi_enc_internal.h ============================================================================== --- projects/zfsd/head/sys/cam/scsi/scsi_enc_internal.h Sat Aug 27 12:09:06 2011 (r225210) +++ projects/zfsd/head/sys/cam/scsi/scsi_enc_internal.h Sat Aug 27 12:10:12 2011 (r225211) @@ -72,7 +72,7 @@ typedef int fsm_error_handler_t(union cc uint32_t sflags); typedef int fsm_done_handler_t(enc_softc_t *ssc, struct enc_fsm_state *state, union ccb *ccb, - uint8_t **bufp, int xfer_len); + uint8_t **bufp, int error, int xfer_len); struct enc_fsm_state { const char *name; Modified: projects/zfsd/head/sys/cam/scsi/scsi_enc_safte.c ============================================================================== --- projects/zfsd/head/sys/cam/scsi/scsi_enc_safte.c Sat Aug 27 12:09:06 2011 (r225210) +++ projects/zfsd/head/sys/cam/scsi/scsi_enc_safte.c Sat Aug 27 12:10:12 2011 (r225211) @@ -247,7 +247,7 @@ safte_fill_read_buf_io(enc_softc_t *enc, static int safte_process_config(enc_softc_t *enc, struct enc_fsm_state *state, - union ccb *ccb, uint8_t **bufp, int xfer_len) + union ccb *ccb, uint8_t **bufp, int error, int xfer_len) { struct scfg *cfg; uint8_t *buf = *bufp; @@ -256,7 +256,8 @@ safte_process_config(enc_softc_t *enc, s cfg = enc->enc_private; if (cfg == NULL) return (ENXIO); - + if (error != 0) + return (error); if (xfer_len < 6) { ENC_LOG(enc, "too little data (%d) for configuration\n", xfer_len); @@ -320,7 +321,7 @@ safte_process_config(enc_softc_t *enc, s static int safte_process_gflags(enc_softc_t *enc, struct enc_fsm_state *state, - union ccb *ccb, uint8_t **bufp, int xfer_len) + union ccb *ccb, uint8_t **bufp, int error, int xfer_len) { struct scfg *cfg; uint8_t *buf = *bufp; @@ -328,7 +329,8 @@ safte_process_gflags(enc_softc_t *enc, s cfg = enc->enc_private; if (cfg == NULL) return (ENXIO); - + if (error != 0) + return (error); SAFT_BAIL(3, xfer_len); cfg->flag1 = buf[1]; cfg->flag2 = buf[2]; @@ -344,7 +346,7 @@ safte_process_gflags(enc_softc_t *enc, s static int safte_process_status(enc_softc_t *enc, struct enc_fsm_state *state, - union ccb *ccb, uint8_t **bufp, int xfer_len) + union ccb *ccb, uint8_t **bufp, int error, int xfer_len) { struct scfg *cfg; uint8_t *buf = *bufp; @@ -355,6 +357,8 @@ safte_process_status(enc_softc_t *enc, s cfg = enc->enc_private; if (cfg == NULL) return (ENXIO); + if (error != 0) + return (error); oid = r = 0; cfg->enc_status = 0; @@ -651,7 +655,7 @@ safte_process_status(enc_softc_t *enc, s static int safte_process_slotstatus(enc_softc_t *enc, struct enc_fsm_state *state, - union ccb *ccb, uint8_t **bufp, int xfer_len) + union ccb *ccb, uint8_t **bufp, int error, int xfer_len) { struct scfg *cfg; uint8_t *buf = *bufp; @@ -661,7 +665,8 @@ safte_process_slotstatus(enc_softc_t *en cfg = enc->enc_private; if (cfg == NULL) return (ENXIO); - + if (error != 0) + return (error); cfg->slot_status = 0; oid = cfg->slotoff; for (r = i = 0; i < cfg->Nslots; i++, r += 4) { @@ -940,7 +945,7 @@ safte_fill_control_request(enc_softc_t * static int safte_process_control_request(enc_softc_t *enc, struct enc_fsm_state *state, - union ccb *ccb, uint8_t **bufp, int xfer_len) + union ccb *ccb, uint8_t **bufp, int error, int xfer_len) { struct scfg *cfg; safte_control_request_t *req; @@ -950,8 +955,10 @@ safte_process_control_request(enc_softc_ if (cfg == NULL) return (ENXIO); + req = cfg->current_request; + if (req->result == 0) + req->result = error; if (++cfg->current_request_stage >= cfg->current_request_stages) { - req = cfg->current_request; idx = req->elm_idx; if (idx == SES_SETSTATUS_ENC_IDX) type = -1; @@ -962,7 +969,6 @@ safte_process_control_request(enc_softc_ else enc_update_request(enc, SAFTE_UPDATE_READENCSTATUS); cfg->current_request = NULL; - req->result = 0; wakeup(req); } else { enc_update_request(enc, SAFTE_PROCESS_CONTROL_REQS); @@ -1046,6 +1052,7 @@ safte_set_enc_status(enc_softc_t *enc, u req.elm_idx = SES_SETSTATUS_ENC_IDX; req.elm_stat[0] = encstat & 0xf; + req.result = 0; TAILQ_INSERT_TAIL(&cfg->requests, &req, links); enc_update_request(enc, SAFTE_PROCESS_CONTROL_REQS); @@ -1082,6 +1089,7 @@ safte_set_elm_status(enc_softc_t *enc, e req.elm_idx = elms->elm_idx; memcpy(&req.elm_stat, elms->cstat, sizeof(req.elm_stat)); + req.result = 0; TAILQ_INSERT_TAIL(&cfg->requests, &req, links); enc_update_request(enc, SAFTE_PROCESS_CONTROL_REQS); Modified: projects/zfsd/head/sys/cam/scsi/scsi_enc_ses.c ============================================================================== --- projects/zfsd/head/sys/cam/scsi/scsi_enc_ses.c Sat Aug 27 12:09:06 2011 (r225210) +++ projects/zfsd/head/sys/cam/scsi/scsi_enc_ses.c Sat Aug 27 12:10:12 2011 (r225211) @@ -1234,7 +1234,7 @@ out: */ static int ses_process_pages(enc_softc_t *enc, struct enc_fsm_state *state, - union ccb *ccb, uint8_t **bufp, int xfer_len) + union ccb *ccb, uint8_t **bufp, int error, int xfer_len) { ses_softc_t *ses; struct scsi_diag_page *page; @@ -1245,6 +1245,10 @@ ses_process_pages(enc_softc_t *enc, stru ses = enc->enc_private; err = -1; + if (error != 0) { + err = error; + goto out; + } if (xfer_len < sizeof(*page)) { ENC_LOG(enc, "Unable to parse Diag Pages List Header\n"); err = EIO; @@ -1283,7 +1287,7 @@ out: */ static int ses_process_config(enc_softc_t *enc, struct enc_fsm_state *state, - union ccb *ccb, uint8_t **bufp, int xfer_len) + union ccb *ccb, uint8_t **bufp, int error, int xfer_len) { struct ses_iterator iter; ses_softc_t *ses; @@ -1315,6 +1319,10 @@ ses_process_config(enc_softc_t *enc, str buf = *bufp; err = -1;; + if (error != 0) { + err = error; + goto out; + } if (xfer_len < sizeof(cfg_page->hdr)) { ENC_LOG(enc, "Unable to parse SES Config Header\n"); err = EIO; @@ -1492,7 +1500,7 @@ out: */ static int ses_process_status(enc_softc_t *enc, struct enc_fsm_state *state, - union ccb *ccb, uint8_t **bufp, int xfer_len) + union ccb *ccb, uint8_t **bufp, int error, int xfer_len) { struct ses_iterator iter; enc_element_t *element; @@ -1515,6 +1523,10 @@ ses_process_status(enc_softc_t *enc, str page = (struct ses_status_page *)buf; length = ses_page_length(&page->hdr); + if (error != 0) { + err = error; + goto out; + } /* * Make sure the length fits in the buffer. * @@ -1660,7 +1672,7 @@ static int ses_get_elm_addlstatus_sas(en */ static int ses_process_elm_addlstatus(enc_softc_t *enc, struct enc_fsm_state *state, - union ccb *ccb, uint8_t **bufp, int xfer_len) + union ccb *ccb, uint8_t **bufp, int error, int xfer_len) { struct ses_iterator iter; int eip; @@ -1679,6 +1691,10 @@ ses_process_elm_addlstatus(enc_softc_t * buf = *bufp; err = -1; + if (error != 0) { + err = error; + goto out; + } ses_cache_free_elm_addlstatus(enc, enc_cache); ses_cache->elm_addlstatus_page = (struct ses_addl_elem_status_page *)buf; @@ -1813,7 +1829,7 @@ out: static int ses_process_control_request(enc_softc_t *enc, struct enc_fsm_state *state, - union ccb *ccb, uint8_t **bufp, int xfer_len) + union ccb *ccb, uint8_t **bufp, int error, int xfer_len) { ses_softc_t *ses; @@ -1823,14 +1839,14 @@ ses_process_control_request(enc_softc_t * o Generation count wrong. * o Some SCSI status error. */ - ses_terminate_control_requests(&ses->ses_pending_requests, 0); + ses_terminate_control_requests(&ses->ses_pending_requests, error); enc_update_request(enc, SES_UPDATE_GETSTATUS); return (0); } static int ses_publish_physpaths(enc_softc_t *enc, struct enc_fsm_state *state, - union ccb *ccb, uint8_t **bufp, int xfer_len) + union ccb *ccb, uint8_t **bufp, int error, int xfer_len) { struct ses_iterator iter; enc_cache_t *enc_cache; @@ -1857,7 +1873,7 @@ ses_publish_physpaths(enc_softc_t *enc, static int ses_publish_cache(enc_softc_t *enc, struct enc_fsm_state *state, - union ccb *ccb, uint8_t **bufp, int xfer_len) + union ccb *ccb, uint8_t **bufp, int error, int xfer_len) { sx_xlock(&enc->enc_cache_lock); @@ -1879,7 +1895,7 @@ ses_publish_cache(enc_softc_t *enc, stru */ static int ses_process_elm_descs(enc_softc_t *enc, struct enc_fsm_state *state, - union ccb *ccb, uint8_t **bufp, int xfer_len) + union ccb *ccb, uint8_t **bufp, int error, int xfer_len) { ses_softc_t *ses; struct ses_iterator iter; @@ -1900,6 +1916,10 @@ ses_process_elm_descs(enc_softc_t *enc, buf = *bufp; err = -1; + if (error != 0) { + err = error; + goto out; + } ses_cache_free_elm_descs(enc, enc_cache); ses_cache->elm_descs_page = (struct ses_elem_descr_page *)buf; *bufp = NULL; From owner-svn-src-projects@FreeBSD.ORG Sat Aug 27 13:05:39 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 4A3B71065674; Sat, 27 Aug 2011 13:05:39 +0000 (UTC) (envelope-from mav@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id 217878FC17; Sat, 27 Aug 2011 13:05:39 +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 p7RD5dSL004609; Sat, 27 Aug 2011 13:05:39 GMT (envelope-from mav@svn.freebsd.org) Received: (from mav@localhost) by svn.freebsd.org (8.14.4/8.14.4/Submit) id p7RD5djx004607; Sat, 27 Aug 2011 13:05:39 GMT (envelope-from mav@svn.freebsd.org) Message-Id: <201108271305.p7RD5djx004607@svn.freebsd.org> From: Alexander Motin Date: Sat, 27 Aug 2011 13:05:38 +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: r225212 - projects/zfsd/head/sys/cam/scsi 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, 27 Aug 2011 13:05:39 -0000 Author: mav Date: Sat Aug 27 13:05:38 2011 New Revision: 225212 URL: http://svn.freebsd.org/changeset/base/225212 Log: Drop wrbuf16() function, not used any more. Modified: projects/zfsd/head/sys/cam/scsi/scsi_enc_safte.c Modified: projects/zfsd/head/sys/cam/scsi/scsi_enc_safte.c ============================================================================== --- projects/zfsd/head/sys/cam/scsi/scsi_enc_safte.c Sat Aug 27 12:10:12 2011 (r225211) +++ projects/zfsd/head/sys/cam/scsi/scsi_enc_safte.c Sat Aug 27 13:05:38 2011 (r225212) @@ -54,7 +54,7 @@ __FBSDID("$FreeBSD: head/sys/cam/scsi/sc * SAF-TE Type Device Emulation */ -static int wrbuf16(enc_softc_t *, uint8_t, uint8_t, uint8_t, uint8_t, int); +static int safte_set_enc_status(enc_softc_t *enc, uint8_t encstat, int slpflag); #define ALL_ENC_STAT (SES_ENCSTAT_CRITICAL | SES_ENCSTAT_UNRECOV | \ SES_ENCSTAT_NONCRITICAL | SES_ENCSTAT_INFO) @@ -976,37 +976,6 @@ safte_process_control_request(enc_softc_ return (0); } -/* - * This function handles all of the 16 byte WRITE BUFFER commands. - */ -static int -wrbuf16(enc_softc_t *enc, uint8_t op, uint8_t b1, uint8_t b2, - uint8_t b3, int slp) -{ - int err, amt; - char *sdata; - struct scfg *cc = enc->enc_private; - static char cdb[10] = { WRITE_BUFFER, 1, 0, 0, 0, 0, 0, 0, 16, 0 }; - - if (cc == NULL) - return (0); - - sdata = ENC_MALLOCZ(16); - if (sdata == NULL) - return (ENOMEM); - - ENC_DLOG(enc, "saf_wrbuf16 %x %x %x %x\n", op, b1, b2, b3); - - sdata[0] = op; - sdata[1] = b1; - sdata[2] = b2; - sdata[3] = b3; - amt = -16; - err = enc_runcmd(enc, cdb, 10, sdata, &amt); - ENC_FREE(sdata); - return (err); -} - static void safte_softc_cleanup(struct cam_periph *periph) { @@ -1021,15 +990,22 @@ safte_softc_cleanup(struct cam_periph *p static int safte_init_enc(enc_softc_t *enc) { + struct scfg *cfg; int err; static char cdb0[6] = { SEND_DIAGNOSTIC }; + cfg = enc->enc_private; + if (cfg == NULL) + return (ENXIO); + err = enc_runcmd(enc, cdb0, 6, NULL, 0); if (err) { return (err); } DELAY(5000); - err = wrbuf16(enc, SAFTE_WT_GLOBAL, 0, 0, 0, 1); + cfg->flag1 = 0; + cfg->flag2 = 0; + err = safte_set_enc_status(enc, 0, 1); return (err); } From owner-svn-src-projects@FreeBSD.ORG Sat Aug 27 15:36:50 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 32969106564A; Sat, 27 Aug 2011 15:36:50 +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 22D6D8FC0C; Sat, 27 Aug 2011 15:36:50 +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 p7RFaoqo011401; Sat, 27 Aug 2011 15:36:50 GMT (envelope-from cognet@svn.freebsd.org) Received: (from cognet@localhost) by svn.freebsd.org (8.14.4/8.14.4/Submit) id p7RFanYt011399; Sat, 27 Aug 2011 15:36:49 GMT (envelope-from cognet@svn.freebsd.org) Message-Id: <201108271536.p7RFanYt011399@svn.freebsd.org> From: Olivier Houchard Date: Sat, 27 Aug 2011 15:36:49 +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: r225217 - projects/armv6/contrib/binutils/gas/config 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, 27 Aug 2011 15:36:50 -0000 Author: cognet Date: Sat Aug 27 15:36:49 2011 New Revision: 225217 URL: http://svn.freebsd.org/changeset/base/225217 Log: Add definitions for cortex-a9 and vfpv3 Submitted by: Damjan Marion Modified: projects/armv6/contrib/binutils/gas/config/tc-arm.c Modified: projects/armv6/contrib/binutils/gas/config/tc-arm.c ============================================================================== --- projects/armv6/contrib/binutils/gas/config/tc-arm.c Sat Aug 27 15:31:30 2011 (r225216) +++ projects/armv6/contrib/binutils/gas/config/tc-arm.c Sat Aug 27 15:36:49 2011 (r225217) @@ -20008,6 +20008,9 @@ static const struct arm_cpu_option_table {"cortex-a8", ARM_ARCH_V7A, ARM_FEATURE(0, FPU_VFP_V3 | FPU_NEON_EXT_V1), NULL}, + {"cortex-a9", ARM_ARCH_V7A, ARM_FEATURE(0, FPU_VFP_V3 + | FPU_NEON_EXT_V1), + NULL}, {"cortex-r4", ARM_ARCH_V7R, FPU_NONE, NULL}, {"cortex-m3", ARM_ARCH_V7M, FPU_NONE, NULL}, /* ??? XSCALE is really an architecture. */ @@ -20106,6 +20109,7 @@ static const struct arm_option_cpu_value {"vfp", FPU_ARCH_VFP_V2}, {"vfp9", FPU_ARCH_VFP_V2}, {"vfp3", FPU_ARCH_VFP_V3}, + {"vfpv3", FPU_ARCH_VFP_V3}, {"vfp10", FPU_ARCH_VFP_V2}, {"vfp10-r0", FPU_ARCH_VFP_V1}, {"vfpxd", FPU_ARCH_VFP_V1xD}, From owner-svn-src-projects@FreeBSD.ORG Sat Aug 27 15:41:49 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 405FE106564A; Sat, 27 Aug 2011 15:41:49 +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 30EA08FC08; Sat, 27 Aug 2011 15:41:49 +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 p7RFfnZx011573; Sat, 27 Aug 2011 15:41:49 GMT (envelope-from cognet@svn.freebsd.org) Received: (from cognet@localhost) by svn.freebsd.org (8.14.4/8.14.4/Submit) id p7RFfnkE011571; Sat, 27 Aug 2011 15:41:49 GMT (envelope-from cognet@svn.freebsd.org) Message-Id: <201108271541.p7RFfnkE011571@svn.freebsd.org> From: Olivier Houchard Date: Sat, 27 Aug 2011 15:41:49 +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: r225218 - 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, 27 Aug 2011 15:41:49 -0000 Author: cognet Date: Sat Aug 27 15:41:48 2011 New Revision: 225218 URL: http://svn.freebsd.org/changeset/base/225218 Log: Add armv7_cpu_sleep, since the method used in arm11_sleep is deprecated Submitted by: Damjan Marion 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 Sat Aug 27 15:36:49 2011 (r225217) +++ projects/armv6/sys/arm/arm/cpufunc_asm_armv7.S Sat Aug 27 15:41:48 2011 (r225218) @@ -191,3 +191,8 @@ ENTRY_NP(armv7_icache_sync_range) mcr p15, 0, r0, c7, c10, 4 /* drain the write buffer */ bx lr +ENTRY(armv7_cpu_sleep) + mcr p15, 0, r0, c7, c10, 4 /* drain the write buffer */ + /* FIXME: replace with WFI instruction when AS will support it */ + .word 0xe320f003 /* wait for interrupt */ + bx lr From owner-svn-src-projects@FreeBSD.ORG Sat Aug 27 18:55:40 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 EF1041065675; Sat, 27 Aug 2011 18:55:40 +0000 (UTC) (envelope-from ed@hoeg.nl) Received: from mx0.hoeg.nl (mx0.hoeg.nl [IPv6:2a01:4f8:101:5343::aa]) by mx1.freebsd.org (Postfix) with ESMTP id 8C1578FC14; Sat, 27 Aug 2011 18:55:40 +0000 (UTC) Received: by mx0.hoeg.nl (Postfix, from userid 1000) id 8FB3B2A28CB3; Sat, 27 Aug 2011 20:55:39 +0200 (CEST) Date: Sat, 27 Aug 2011 20:55:39 +0200 From: Ed Schouten To: John Baldwin Message-ID: <20110827185539.GB1929@hoeg.nl> References: <201108242214.p7OMEuMP072758@svn.freebsd.org> <201108250749.32660.jhb@freebsd.org> <20110825145126.GZ1929@hoeg.nl> <201108251142.58276.jhb@freebsd.org> MIME-Version: 1.0 Content-Type: multipart/signed; micalg=pgp-sha1; protocol="application/pgp-signature"; boundary="5YKxbtAlDq2FnV+Q" Content-Disposition: inline In-Reply-To: <201108251142.58276.jhb@freebsd.org> User-Agent: Mutt/1.5.21 (2010-09-15) Cc: svn-src-projects@freebsd.org, mdf@freebsd.org, src-committers@freebsd.org Subject: Re: svn commit: r225154 - in projects/ino64/sys/ufs: ffs ufs 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, 27 Aug 2011 18:55:41 -0000 --5YKxbtAlDq2FnV+Q Content-Type: text/plain; charset=us-ascii Content-Disposition: inline Content-Transfer-Encoding: quoted-printable I think if we're ever going to consider extending dev_t, we should just nuke the entire major/minor number thing. If we're only going to fill them with 64 bits of random garbage, we'd better just display them hexadecimal or something. This patch removes all the use of major()/minor()/makedev() as far as possible from all non-contributed software: http://80386.nl/pub/major-minor.txt Keep in mind that this doesn't conflict with POSIX, because POSIX only describes dev_t, not the division in major/minor numbers. For example, the output of ls -l on device nodes is implementation defined. I suspect this message will cause bikesheds. ;-) --=20 Ed Schouten WWW: http://80386.nl/ --5YKxbtAlDq2FnV+Q Content-Type: application/pgp-signature -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.4.11 (FreeBSD) iQIcBAEBAgAGBQJOWT2rAAoJEG5e2P40kaK7wcsP/A6mHlnNqfIMBwW6OnhgPw37 XUvf5pB4ZM3KuVk1BV/qTAqLFFz/UZ0uwYr/nByWVhEJA7Ie/QzsoGbmUXTjRhhB gBXMiUaI4BQFFLlYZe4Vycm8R58u0V1P37QhHKbFxm44y/HFJT15HFMfZJGMXpY2 ixZAoIdtaMGF7H4MpKUcTa8NyFY2NlzN/g1FuQttZ2Vk2JrzVgAPgetMG9LK7R+m ju6UrX96ZYiIhsi8SqENaDNqzwLJc5wXGmcrQ8Nuka02DwjUcEv3mPiwnN8QmOV1 4eY6x+cYGFwFEgJkTXg8BmGVRB9XcT53Al9MNX+S90WrQvZUbVfecROjkyukLlNy epNsoEQISqGFeuIiVwrNR3tGg6+KeWzZJ/pXZk1KT8A00en/ZscHjWrzQ5RHrXME Lt6tHaI4dLv2ARA2yo+KWRqG9taK5egfxQIC82D3TPek/yfK12zcUsUbvpToLEk3 6ijC73Un0sRf5tcPFxNdWzq6+N2yd1Gu45KVKZOWDHKxUKb07oZiglaUMHTA+FaN 50sZx+IsSS1BEfDxn3jZ9DiaGl2xgn9XB8+v6McYJeoE1sG55OwUL9jo46TKN/jY t2C75OxtUgo/+4XuK2fGyH33yfZsTZPeaWS4LO2Tns6khEfpTBtmJsip8V9hC9b2 xkmyae0676u9Q/J1X8hH =Gfo0 -----END PGP SIGNATURE----- --5YKxbtAlDq2FnV+Q-- From owner-svn-src-projects@FreeBSD.ORG Sat Aug 27 21:23: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 51AE1106566B; Sat, 27 Aug 2011 21:23:22 +0000 (UTC) (envelope-from mav@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id 4182C8FC0A; Sat, 27 Aug 2011 21:23: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 p7RLNMPo021472; Sat, 27 Aug 2011 21:23:22 GMT (envelope-from mav@svn.freebsd.org) Received: (from mav@localhost) by svn.freebsd.org (8.14.4/8.14.4/Submit) id p7RLNMcg021467; Sat, 27 Aug 2011 21:23:22 GMT (envelope-from mav@svn.freebsd.org) Message-Id: <201108272123.p7RLNMcg021467@svn.freebsd.org> From: Alexander Motin Date: Sat, 27 Aug 2011 21:23: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: r225219 - projects/zfsd/head/sys/cam/scsi 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, 27 Aug 2011 21:23:22 -0000 Author: mav Date: Sat Aug 27 21:23:21 2011 New Revision: 225219 URL: http://svn.freebsd.org/changeset/base/225219 Log: Tune destruction sequence, including aborting queued control requests. Cover for some edge cases is still ongoing. Modified: projects/zfsd/head/sys/cam/scsi/scsi_enc.c projects/zfsd/head/sys/cam/scsi/scsi_enc_internal.h projects/zfsd/head/sys/cam/scsi/scsi_enc_safte.c projects/zfsd/head/sys/cam/scsi/scsi_enc_ses.c Modified: projects/zfsd/head/sys/cam/scsi/scsi_enc.c ============================================================================== --- projects/zfsd/head/sys/cam/scsi/scsi_enc.c Sat Aug 27 15:41:48 2011 (r225218) +++ projects/zfsd/head/sys/cam/scsi/scsi_enc.c Sat Aug 27 21:23:21 2011 (r225219) @@ -120,9 +120,11 @@ enc_oninvalidate(struct cam_periph *peri enc = periph->softc; + enc->enc_flags |= ENC_FLAG_INVALID; + /* If the sub-driver has an invalidate routine, call it */ if (enc->enc_vec.softc_invalidate != NULL) - enc->enc_vec.softc_invalidate(periph); + enc->enc_vec.softc_invalidate(enc); /* * Unregister any async callbacks. @@ -146,8 +148,6 @@ enc_oninvalidate(struct cam_periph *peri } callout_drain(&enc->status_updater); - enc->enc_flags |= ENC_FLAG_INVALID; - xpt_print(periph->path, "lost device\n"); } @@ -165,7 +165,7 @@ enc_dtor(struct cam_periph *periph) /* If the sub-driver has a cleanup routine, call it */ if (enc->enc_vec.softc_cleanup != NULL) - enc->enc_vec.softc_cleanup(periph); + enc->enc_vec.softc_cleanup(enc); if (enc->enc_boot_hold_ch.ich_func != NULL) { config_intrhook_disestablish(&enc->enc_boot_hold_ch); @@ -916,11 +916,11 @@ enc_ctor(struct cam_periph *periph, void case ENC_SES_SCSI2: case ENC_SES_PASSTHROUGH: case ENC_SEMB_SES: - err = ses_softc_init(enc, 1); + err = ses_softc_init(enc); break; case ENC_SAFT: case ENC_SEMB_SAFT: - err = safte_softc_init(enc, 1); + err = safte_softc_init(enc); break; case ENC_SEN: case ENC_NONE: Modified: projects/zfsd/head/sys/cam/scsi/scsi_enc_internal.h ============================================================================== --- projects/zfsd/head/sys/cam/scsi/scsi_enc_internal.h Sat Aug 27 15:41:48 2011 (r225218) +++ projects/zfsd/head/sys/cam/scsi/scsi_enc_internal.h Sat Aug 27 21:23:21 2011 (r225219) @@ -84,9 +84,9 @@ struct enc_fsm_state { fsm_error_handler_t *error; }; -typedef int (enc_softc_init_t)(enc_softc_t *, int); -typedef void (enc_softc_invalidate_t)(struct cam_periph *); -typedef void (enc_softc_cleanup_t)(struct cam_periph *); +typedef int (enc_softc_init_t)(enc_softc_t *); +typedef void (enc_softc_invalidate_t)(enc_softc_t *); +typedef void (enc_softc_cleanup_t)(enc_softc_t *); typedef int (enc_init_enc_t)(enc_softc_t *); typedef int (enc_get_enc_status_t)(enc_softc_t *, int); typedef int (enc_set_enc_status_t)(enc_softc_t *, encioc_enc_status_t, int); Modified: projects/zfsd/head/sys/cam/scsi/scsi_enc_safte.c ============================================================================== --- projects/zfsd/head/sys/cam/scsi/scsi_enc_safte.c Sat Aug 27 15:41:48 2011 (r225218) +++ projects/zfsd/head/sys/cam/scsi/scsi_enc_safte.c Sat Aug 27 21:23:21 2011 (r225219) @@ -162,6 +162,18 @@ enum { SES_SETSTATUS_ENC_IDX = -1 }; +static void +safte_terminate_control_requests(safte_control_reqlist_t *reqlist, int result) +{ + safte_control_request_t *req; + + while ((req = TAILQ_FIRST(reqlist)) != NULL) { + TAILQ_REMOVE(reqlist, req, links); + req->result = result; + wakeup(req); + } +} + struct scfg { /* * Cached Configuration @@ -977,11 +989,18 @@ safte_process_control_request(enc_softc_ } static void -safte_softc_cleanup(struct cam_periph *periph) +safte_softc_invalidate(enc_softc_t *enc) +{ + struct scfg *cfg; + + cfg = enc->enc_private; + safte_terminate_control_requests(&cfg->requests, ENXIO); +} + +static void +safte_softc_cleanup(enc_softc_t *enc) { - enc_softc_t *enc; - enc = periph->softc; ENC_FREE_AND_NULL(enc->enc_cache.elm_map); ENC_FREE_AND_NULL(enc->enc_private); enc->enc_cache.nelms = 0; @@ -1084,6 +1103,7 @@ safte_poll_status(enc_softc_t *enc) static struct enc_vec safte_enc_vec = { + .softc_invalidate = safte_softc_invalidate, .softc_cleanup = safte_softc_cleanup, .init_enc = safte_init_enc, .get_enc_status = safte_get_enc_status, @@ -1094,15 +1114,10 @@ static struct enc_vec safte_enc_vec = }; int -safte_softc_init(enc_softc_t *enc, int doinit) +safte_softc_init(enc_softc_t *enc) { struct scfg *cfg; - if (doinit == 0) { - safte_softc_cleanup(enc->periph); - return (0); - } - enc->enc_vec = safte_enc_vec; enc->enc_fsm_states = enc_fsm_states; Modified: projects/zfsd/head/sys/cam/scsi/scsi_enc_ses.c ============================================================================== --- projects/zfsd/head/sys/cam/scsi/scsi_enc_ses.c Sat Aug 27 15:41:48 2011 (r225218) +++ projects/zfsd/head/sys/cam/scsi/scsi_enc_ses.c Sat Aug 27 21:23:21 2011 (r225219) @@ -1477,7 +1477,7 @@ ses_process_config(enc_softc_t *enc, str out: if (err) - ses_softc_cleanup(enc->periph); + ses_softc_cleanup(enc); else { enc_update_request(enc, SES_UPDATE_GETSTATUS); enc_update_request(enc, SES_UPDATE_GETELMDESCS); @@ -2538,18 +2538,18 @@ out: } static void -ses_softc_invalidate(struct cam_periph *periph) +ses_softc_invalidate(enc_softc_t *enc) { + ses_softc_t *ses; + + ses = enc->enc_private; + ses_terminate_control_requests(&ses->ses_requests, ENXIO); } static void -ses_softc_cleanup(struct cam_periph *periph) +ses_softc_cleanup(enc_softc_t *enc) { - enc_softc_t *enc; - CAM_DEBUG(periph->path, CAM_DEBUG_SUBTRACE, - ("entering ses_softc_cleanup(%p)\n", periph)); - enc = periph->softc; ses_cache_free(enc, &enc->enc_cache); ses_cache_free(enc, &enc->enc_daemon_cache); ENC_FREE_AND_NULL(enc->enc_private); @@ -2767,16 +2767,12 @@ static struct enc_vec ses_enc_vec = * \return 0 on success, errno otherwise. */ int -ses_softc_init(enc_softc_t *enc, int doinit) +ses_softc_init(enc_softc_t *enc) { ses_softc_t *ses_softc; CAM_DEBUG(enc->periph->path, CAM_DEBUG_SUBTRACE, ("entering enc_softc_init(%p)\n", enc)); - if (doinit == 0) { - ses_softc_cleanup(enc->periph); - return (0); - } enc->enc_vec = ses_enc_vec; enc->enc_fsm_states = enc_fsm_states;