From owner-p4-projects@FreeBSD.ORG Sun Sep 24 12:18:55 2006 Return-Path: X-Original-To: p4-projects@freebsd.org Delivered-To: p4-projects@freebsd.org Received: by hub.freebsd.org (Postfix, from userid 32767) id 3652716A40F; Sun, 24 Sep 2006 12:18:55 +0000 (UTC) X-Original-To: perforce@FreeBSD.org Delivered-To: perforce@FreeBSD.org Received: from mx1.FreeBSD.org (mx1.freebsd.org [216.136.204.125]) by hub.freebsd.org (Postfix) with ESMTP id 0917716A403 for ; Sun, 24 Sep 2006 12:18:55 +0000 (UTC) (envelope-from als@FreeBSD.org) Received: from repoman.freebsd.org (repoman.freebsd.org [216.136.204.115]) by mx1.FreeBSD.org (Postfix) with ESMTP id DAB4C43D46 for ; Sun, 24 Sep 2006 12:18:52 +0000 (GMT) (envelope-from als@FreeBSD.org) Received: from repoman.freebsd.org (localhost [127.0.0.1]) by repoman.freebsd.org (8.13.6/8.13.6) with ESMTP id k8OCIqsi014419 for ; Sun, 24 Sep 2006 12:18:52 GMT (envelope-from als@FreeBSD.org) Received: (from perforce@localhost) by repoman.freebsd.org (8.13.6/8.13.4/Submit) id k8OCIpIo014416 for perforce@freebsd.org; Sun, 24 Sep 2006 12:18:51 GMT (envelope-from als@FreeBSD.org) Date: Sun, 24 Sep 2006 12:18:51 GMT Message-Id: <200609241218.k8OCIpIo014416@repoman.freebsd.org> X-Authentication-Warning: repoman.freebsd.org: perforce set sender to als@FreeBSD.org using -f From: Alex Lyashkov To: Perforce Change Reviews Cc: Subject: PERFORCE change 106596 for review X-BeenThere: p4-projects@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: p4 projects tree changes List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sun, 24 Sep 2006 12:18:55 -0000 http://perforce.freebsd.org/chv.cgi?CH=106596 Change 106596 by als@als_head on 2006/09/24 12:18:28 merge HEAD Affected files ... .. //depot/projects/jail2/sys/amd64/conf/NOTES#4 integrate .. //depot/projects/jail2/sys/amd64/ia32/ia32_sigtramp.S#2 integrate .. //depot/projects/jail2/sys/compat/freebsd32/freebsd32_proto.h#6 integrate .. //depot/projects/jail2/sys/compat/freebsd32/freebsd32_syscall.h#6 integrate .. //depot/projects/jail2/sys/compat/freebsd32/freebsd32_syscalls.c#6 integrate .. //depot/projects/jail2/sys/compat/freebsd32/freebsd32_sysent.c#6 integrate .. //depot/projects/jail2/sys/compat/freebsd32/syscalls.master#6 integrate .. //depot/projects/jail2/sys/compat/linux/linux_file.c#4 integrate .. //depot/projects/jail2/sys/compat/linux/linux_socket.c#3 integrate .. //depot/projects/jail2/sys/conf/files.amd64#5 integrate .. //depot/projects/jail2/sys/conf/files.i386#4 integrate .. //depot/projects/jail2/sys/dev/acpica/Osd/OsdHardware.c#2 integrate .. //depot/projects/jail2/sys/dev/bge/if_bge.c#6 integrate .. //depot/projects/jail2/sys/dev/exca/exca.c#2 integrate .. //depot/projects/jail2/sys/dev/ipmi/ipmi.c#2 integrate .. //depot/projects/jail2/sys/dev/ipmi/ipmi_acpi.c#1 branch .. //depot/projects/jail2/sys/dev/ipmi/ipmi_isa.c#1 branch .. //depot/projects/jail2/sys/dev/ipmi/ipmi_kcs.c#1 branch .. //depot/projects/jail2/sys/dev/ipmi/ipmi_pci.c#2 integrate .. //depot/projects/jail2/sys/dev/ipmi/ipmi_smbios.c#2 integrate .. //depot/projects/jail2/sys/dev/ipmi/ipmi_smbus.c#1 branch .. //depot/projects/jail2/sys/dev/ipmi/ipmi_smic.c#1 branch .. //depot/projects/jail2/sys/dev/ipmi/ipmi_ssif.c#1 branch .. //depot/projects/jail2/sys/dev/ipmi/ipmivars.h#2 integrate .. //depot/projects/jail2/sys/dev/sound/pcm/buffer.c#3 integrate .. //depot/projects/jail2/sys/dev/sound/pcm/buffer.h#3 integrate .. //depot/projects/jail2/sys/dev/sound/pcm/channel.c#2 integrate .. //depot/projects/jail2/sys/dev/sound/pcm/channel.h#2 integrate .. //depot/projects/jail2/sys/dev/sound/pcm/channel_if.m#2 integrate .. //depot/projects/jail2/sys/dev/sound/pcm/dsp.c#2 integrate .. //depot/projects/jail2/sys/dev/sound/pcm/dsp.h#2 integrate .. //depot/projects/jail2/sys/dev/sound/pcm/mixer.c#2 integrate .. //depot/projects/jail2/sys/dev/sound/pcm/mixer.h#3 integrate .. //depot/projects/jail2/sys/dev/sound/pcm/sound.c#4 integrate .. //depot/projects/jail2/sys/dev/sound/pcm/sound.h#3 integrate .. //depot/projects/jail2/sys/i386/conf/NOTES#5 integrate .. //depot/projects/jail2/sys/kern/kern_descrip.c#8 integrate .. //depot/projects/jail2/sys/kern/kern_event.c#2 integrate .. //depot/projects/jail2/sys/kern/kern_proc.c#4 integrate .. //depot/projects/jail2/sys/kern/tty.c#4 integrate .. //depot/projects/jail2/sys/kern/tty_pty.c#2 integrate .. //depot/projects/jail2/sys/kern/tty_tty.c#2 integrate .. //depot/projects/jail2/sys/kern/vfs_aio.c#4 integrate .. //depot/projects/jail2/sys/modules/ipmi/Makefile#2 integrate .. //depot/projects/jail2/sys/net/if_bridge.c#6 integrate .. //depot/projects/jail2/sys/netinet/if_ether.c#3 integrate .. //depot/projects/jail2/sys/netinet/tcp_input.c#5 integrate .. //depot/projects/jail2/sys/sys/event.h#2 integrate .. //depot/projects/jail2/sys/sys/ipmi.h#2 integrate .. //depot/projects/jail2/sys/sys/mbuf.h#4 integrate .. //depot/projects/jail2/sys/sys/param.h#4 integrate .. //depot/projects/jail2/sys/sys/soundcard.h#2 integrate Differences ... ==== //depot/projects/jail2/sys/amd64/conf/NOTES#4 (text+ko) ==== @@ -4,7 +4,7 @@ # This file contains machine dependent kernel configuration notes. For # machine independent notes, look in /sys/conf/NOTES. # -# $FreeBSD: src/sys/amd64/conf/NOTES,v 1.58 2006/07/29 18:38:53 marcel Exp $ +# $FreeBSD: src/sys/amd64/conf/NOTES,v 1.59 2006/09/22 22:11:28 jhb Exp $ # # @@ -346,6 +346,7 @@ # # Miscellaneous hardware: # +# ipmi: Intelligent Platform Management Interface # smbios: DMI/SMBIOS entry point # vpd: Vital Product Data kernel interface # cy: Cyclades serial driver @@ -368,6 +369,7 @@ device digi_Xe device digi_Xem device digi_Xr +device ipmi # Parallel (8255 PPI) basic I/O (mode 0) port (e.g. Advantech PCL-724) device pbio hint.pbio.0.at="isa" ==== //depot/projects/jail2/sys/amd64/ia32/ia32_sigtramp.S#2 (text+ko) ==== @@ -23,7 +23,7 @@ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * - * $FreeBSD: src/sys/amd64/ia32/ia32_sigtramp.S,v 1.2 2003/08/22 23:19:02 peter Exp $ + * $FreeBSD: src/sys/amd64/ia32/ia32_sigtramp.S,v 1.3 2006/09/23 13:42:09 davidxu Exp $ */ #include "opt_compat.h" @@ -45,8 +45,6 @@ calll *IA32_SIGF_HANDLER(%esp) leal IA32_SIGF_UC(%esp),%eax /* get ucontext */ pushl %eax - movl IA32_UC_GS(%eax),%gs /* restore %gs */ - movl IA32_UC_FS(%eax),%fs /* restore %fs */ movl IA32_UC_ES(%eax),%es /* restore %es */ movl IA32_UC_DS(%eax),%ds /* restore %ds */ movl $SYS_sigreturn,%eax @@ -62,8 +60,6 @@ calll *IA32_SIGF_HANDLER(%esp) leal IA32_SIGF_UC4(%esp),%eax/* get ucontext */ pushl %eax - movl IA32_UC4_GS(%eax),%gs /* restore %gs */ - movl IA32_UC4_FS(%eax),%fs /* restore %fs */ movl IA32_UC4_ES(%eax),%es /* restore %es */ movl IA32_UC4_DS(%eax),%ds /* restore %ds */ movl $344,%eax /* 4.x SYS_sigreturn */ ==== //depot/projects/jail2/sys/compat/freebsd32/freebsd32_proto.h#6 (text+ko) ==== @@ -2,8 +2,8 @@ * System call prototypes. * * DO NOT EDIT-- this file is automatically generated. - * $FreeBSD: src/sys/compat/freebsd32/freebsd32_proto.h,v 1.65 2006/09/22 15:05:33 davidxu Exp $ - * created from FreeBSD: src/sys/compat/freebsd32/syscalls.master,v 1.78 2006/09/22 15:04:28 davidxu Exp + * $FreeBSD: src/sys/compat/freebsd32/freebsd32_proto.h,v 1.66 2006/09/23 00:27:53 davidxu Exp $ + * created from FreeBSD: src/sys/compat/freebsd32/syscalls.master,v 1.79 2006/09/23 00:27:11 davidxu Exp */ #ifndef _FREEBSD32_SYSPROTO_H_ ==== //depot/projects/jail2/sys/compat/freebsd32/freebsd32_syscall.h#6 (text+ko) ==== @@ -2,8 +2,8 @@ * System call numbers. * * DO NOT EDIT-- this file is automatically generated. - * $FreeBSD: src/sys/compat/freebsd32/freebsd32_syscall.h,v 1.63 2006/09/22 15:05:33 davidxu Exp $ - * created from FreeBSD: src/sys/compat/freebsd32/syscalls.master,v 1.78 2006/09/22 15:04:28 davidxu Exp + * $FreeBSD: src/sys/compat/freebsd32/freebsd32_syscall.h,v 1.64 2006/09/23 00:27:53 davidxu Exp $ + * created from FreeBSD: src/sys/compat/freebsd32/syscalls.master,v 1.79 2006/09/23 00:27:11 davidxu Exp */ #define FREEBSD32_SYS_syscall 0 @@ -300,6 +300,7 @@ #define FREEBSD32_SYS_freebsd32_getcontext 421 #define FREEBSD32_SYS_freebsd32_setcontext 422 #define FREEBSD32_SYS_freebsd32_swapcontext 423 +#define FREEBSD32_SYS_sigwait 429 #define FREEBSD32_SYS_thr_exit 431 #define FREEBSD32_SYS_thr_self 432 #define FREEBSD32_SYS_thr_kill 433 ==== //depot/projects/jail2/sys/compat/freebsd32/freebsd32_syscalls.c#6 (text+ko) ==== @@ -2,8 +2,8 @@ * System call names. * * DO NOT EDIT-- this file is automatically generated. - * $FreeBSD: src/sys/compat/freebsd32/freebsd32_syscalls.c,v 1.54 2006/09/22 15:05:33 davidxu Exp $ - * created from FreeBSD: src/sys/compat/freebsd32/syscalls.master,v 1.78 2006/09/22 15:04:28 davidxu Exp + * $FreeBSD: src/sys/compat/freebsd32/freebsd32_syscalls.c,v 1.55 2006/09/23 00:27:53 davidxu Exp $ + * created from FreeBSD: src/sys/compat/freebsd32/syscalls.master,v 1.79 2006/09/23 00:27:11 davidxu Exp */ const char *freebsd32_syscallnames[] = { @@ -436,7 +436,7 @@ "#426", /* 426 = __acl_set_link */ "#427", /* 427 = __acl_delete_link */ "#428", /* 428 = __acl_aclcheck_link */ - "#429", /* 429 = sigwait */ + "sigwait", /* 429 = sigwait */ "#430", /* 430 = thr_create; */ "thr_exit", /* 431 = thr_exit */ "thr_self", /* 432 = thr_self */ ==== //depot/projects/jail2/sys/compat/freebsd32/freebsd32_sysent.c#6 (text+ko) ==== @@ -2,8 +2,8 @@ * System call switch table. * * DO NOT EDIT-- this file is automatically generated. - * $FreeBSD: src/sys/compat/freebsd32/freebsd32_sysent.c,v 1.64 2006/09/22 15:05:34 davidxu Exp $ - * created from FreeBSD: src/sys/compat/freebsd32/syscalls.master,v 1.78 2006/09/22 15:04:28 davidxu Exp + * $FreeBSD: src/sys/compat/freebsd32/freebsd32_sysent.c,v 1.65 2006/09/23 00:27:53 davidxu Exp $ + * created from FreeBSD: src/sys/compat/freebsd32/syscalls.master,v 1.79 2006/09/23 00:27:11 davidxu Exp */ #include "opt_compat.h" @@ -461,7 +461,7 @@ { 0, (sy_call_t *)nosys, AUE_NULL, NULL, 0, 0 }, /* 426 = __acl_set_link */ { 0, (sy_call_t *)nosys, AUE_NULL, NULL, 0, 0 }, /* 427 = __acl_delete_link */ { 0, (sy_call_t *)nosys, AUE_NULL, NULL, 0, 0 }, /* 428 = __acl_aclcheck_link */ - { 0, (sy_call_t *)nosys, AUE_NULL, NULL, 0, 0 }, /* 429 = sigwait */ + { AS(sigwait_args), (sy_call_t *)sigwait, AUE_SIGWAIT, NULL, 0, 0 }, /* 429 = sigwait */ { 0, (sy_call_t *)nosys, AUE_NULL, NULL, 0, 0 }, /* 430 = thr_create; */ { AS(thr_exit_args), (sy_call_t *)thr_exit, AUE_NULL, NULL, 0, 0 }, /* 431 = thr_exit */ { AS(thr_self_args), (sy_call_t *)thr_self, AUE_NULL, NULL, 0, 0 }, /* 432 = thr_self */ ==== //depot/projects/jail2/sys/compat/freebsd32/syscalls.master#6 (text+ko) ==== @@ -1,4 +1,4 @@ - $FreeBSD: src/sys/compat/freebsd32/syscalls.master,v 1.78 2006/09/22 15:04:28 davidxu Exp $ + $FreeBSD: src/sys/compat/freebsd32/syscalls.master,v 1.79 2006/09/23 00:27:11 davidxu Exp $ ; from: @(#)syscalls.master 8.2 (Berkeley) 1/13/94 ; from: src/sys/kern/syscalls.master 1.107 ; @@ -714,7 +714,8 @@ 427 AUE_NULL UNIMPL __acl_delete_link 428 AUE_NULL UNIMPL __acl_aclcheck_link ; XXX implement -429 AUE_SIGWAIT UNIMPL sigwait +429 AUE_SIGWAIT NOPROTO { int sigwait(const sigset_t *set, \ + int *sig); } 430 AUE_NULL UNIMPL thr_create; 431 AUE_NULL NOPROTO { void thr_exit(long *state); } 432 AUE_NULL NOPROTO { int thr_self(long *id); } ==== //depot/projects/jail2/sys/compat/linux/linux_file.c#4 (text+ko) ==== @@ -27,7 +27,7 @@ */ #include -__FBSDID("$FreeBSD: src/sys/compat/linux/linux_file.c,v 1.97 2006/09/10 13:47:56 netchild Exp $"); +__FBSDID("$FreeBSD: src/sys/compat/linux/linux_file.c,v 1.98 2006/09/23 19:06:54 netchild Exp $"); #include "opt_compat.h" #include "opt_mac.h" @@ -49,6 +49,7 @@ #include #include #include +#include #include #include @@ -480,6 +481,10 @@ char *path; int error; + /* linux convention */ + if (args->flags & ~(F_OK | X_OK | W_OK | R_OK)) + return (EINVAL); + LCONVPATHEXIST(td, args->path, &path); #ifdef DEBUG @@ -488,6 +493,7 @@ #endif error = kern_access(td, path, UIO_SYSSPACE, args->flags); LFREEPATH(path); + return (error); } @@ -724,12 +730,28 @@ struct linux_pread_args *uap; { struct pread_args bsd; + struct vnode *vp; + int error; bsd.fd = uap->fd; bsd.buf = uap->buf; bsd.nbyte = uap->nbyte; bsd.offset = uap->offset; - return pread(td, &bsd); + + error = pread(td, &bsd); + + if (error == 0) { + /* This seems to violate POSIX but linux does it */ + if ((error = fgetvp(td, uap->fd, &vp)) != 0) + return (error); + if (vp->v_type == VDIR) { + vrele(vp); + return (EISDIR); + } + vrele(vp); + } + + return (error); } int ==== //depot/projects/jail2/sys/compat/linux/linux_socket.c#3 (text+ko) ==== @@ -27,7 +27,7 @@ */ #include -__FBSDID("$FreeBSD: src/sys/compat/linux/linux_socket.c,v 1.70 2006/07/19 18:28:52 jhb Exp $"); +__FBSDID("$FreeBSD: src/sys/compat/linux/linux_socket.c,v 1.71 2006/09/23 19:06:54 netchild Exp $"); /* XXX we use functions that might not exist. */ #include "opt_compat.h" @@ -611,6 +611,8 @@ error = kern_bind(td, linux_args.s, sa); free(sa, M_SONAME); + if (error == EADDRNOTAVAIL && linux_args.namelen != sizeof(struct sockaddr_in)) + return (EINVAL); return (error); } @@ -719,8 +721,11 @@ bsd_args.anamelen = PTRIN(linux_args.namelen);/* XXX */ error = accept(td, &bsd_args); bsd_to_linux_sockaddr((struct sockaddr *)bsd_args.name); - if (error) + if (error) { + if (error == EFAULT && linux_args.namelen != sizeof(struct sockaddr_in)) + return (EINVAL); return (error); + } if (linux_args.addr) { error = linux_sa_put(PTRIN(linux_args.addr)); if (error) { @@ -1135,7 +1140,7 @@ break; } if (name == -1) - return (EINVAL); + return (ENOPROTOOPT); bsd_args.name = name; bsd_args.val = PTRIN(linux_args.optval); ==== //depot/projects/jail2/sys/conf/files.amd64#5 (text+ko) ==== @@ -1,7 +1,7 @@ # This file tells config what files go into building a kernel, # files marked standard are always included. # -# $FreeBSD: src/sys/conf/files.amd64,v 1.93 2006/09/05 16:55:12 anholt Exp $ +# $FreeBSD: src/sys/conf/files.amd64,v 1.94 2006/09/22 22:11:28 jhb Exp $ # # The long compile-with and dependency lines are required because of # limitations in config: backslash-newline doesn't work in strings, and @@ -161,7 +161,13 @@ dev/if_ndis/if_ndis_usb.c optional ndis usb dev/io/iodev.c optional io dev/ipmi/ipmi.c optional ipmi -dev/ipmi/ipmi_smbios.c optional ipmi isa +dev/ipmi/ipmi_acpi.c optional ipmi acpi +dev/ipmi/ipmi_isa.c optional ipmi isa +dev/ipmi/ipmi_kcs.c optional ipmi +dev/ipmi/ipmi_smic.c optional ipmi +dev/ipmi/ipmi_smbus.c optional ipmi smbus +dev/ipmi/ipmi_smbios.c optional ipmi +dev/ipmi/ipmi_ssif.c optional ipmi smbus dev/ipmi/ipmi_pci.c optional ipmi pci dev/fdc/fdc.c optional fdc dev/fdc/fdc_acpi.c optional fdc ==== //depot/projects/jail2/sys/conf/files.i386#4 (text+ko) ==== @@ -1,7 +1,7 @@ # This file tells config what files go into building a kernel, # files marked standard are always included. # -# $FreeBSD: src/sys/conf/files.i386,v 1.565 2006/08/15 12:54:28 netchild Exp $ +# $FreeBSD: src/sys/conf/files.i386,v 1.566 2006/09/22 22:11:28 jhb Exp $ # # The long compile-with and dependency lines are required because of # limitations in config: backslash-newline doesn't work in strings, and @@ -196,7 +196,13 @@ dev/if_ndis/if_ndis_usb.c optional ndis usb dev/io/iodev.c optional io dev/ipmi/ipmi.c optional ipmi -dev/ipmi/ipmi_smbios.c optional ipmi isa +dev/ipmi/ipmi_acpi.c optional ipmi acpi +dev/ipmi/ipmi_isa.c optional ipmi isa +dev/ipmi/ipmi_kcs.c optional ipmi +dev/ipmi/ipmi_smic.c optional ipmi +dev/ipmi/ipmi_smbus.c optional ipmi smbus +dev/ipmi/ipmi_smbios.c optional ipmi +dev/ipmi/ipmi_ssif.c optional ipmi smbus dev/ipmi/ipmi_pci.c optional ipmi pci dev/kbd/kbd.c optional atkbd | sc | ukbd | vt dev/le/if_le_isa.c optional le isa ==== //depot/projects/jail2/sys/dev/acpica/Osd/OsdHardware.c#2 (text+ko) ==== @@ -30,7 +30,7 @@ */ #include -__FBSDID("$FreeBSD: src/sys/dev/acpica/Osd/OsdHardware.c,v 1.20 2006/04/04 02:22:38 njl Exp $"); +__FBSDID("$FreeBSD: src/sys/dev/acpica/Osd/OsdHardware.c,v 1.21 2006/09/24 09:39:17 hrs Exp $"); #include @@ -126,7 +126,9 @@ error = acpi_os_check_port(InPort, Width); if (error != 0) { - printf("acpi: bad read from port 0x%03x (%d)\n", (int)InPort, Width); + if (bootverbose) + printf("acpi: bad read from port 0x%03x (%d)\n", + (int)InPort, Width); if (error == -1) return (AE_BAD_PARAMETER); } @@ -159,8 +161,9 @@ error = acpi_os_check_port(OutPort, Width); if (error != 0) { - printf("acpi: bad write to port 0x%03x (%d), val %#x\n", (int)OutPort, - Width, Value); + if (bootverbose) + printf("acpi: bad write to port 0x%03x (%d), val %#x\n", + (int)OutPort, Width, Value); if (error == -1) return (AE_BAD_PARAMETER); } ==== //depot/projects/jail2/sys/dev/bge/if_bge.c#6 (text+ko) ==== @@ -32,7 +32,7 @@ */ #include -__FBSDID("$FreeBSD: src/sys/dev/bge/if_bge.c,v 1.148 2006/09/18 22:18:21 jkim Exp $"); +__FBSDID("$FreeBSD: src/sys/dev/bge/if_bge.c,v 1.149 2006/09/23 18:55:49 scottl Exp $"); /* * Broadcom BCM570x family gigabit ethernet driver for FreeBSD. @@ -79,6 +79,7 @@ #include #include #include +#include #include #include @@ -419,7 +420,16 @@ DRIVER_MODULE(miibus, bge, miibus_driver, miibus_devclass, 0, 0); static int bge_fake_autoneg = 0; +static int bge_allow_asf = 1; + TUNABLE_INT("hw.bge.fake_autoneg", &bge_fake_autoneg); +TUNABLE_INT("hw.bge.allow_asf", &bge_allow_asf); + +SYSCTL_NODE(_hw, OID_AUTO, bge, CTLFLAG_RD, 0, "BGE driver parameters"); +SYSCTL_INT(_hw_bge, OID_AUTO, fake_autoneg, CTLFLAG_RD, &bge_fake_autoneg, 0, + "Enable fake autonegotiation for certain blade systems"); +SYSCTL_INT(_hw_bge, OID_AUTO, allow_asf, CTLFLAG_RD, &bge_allow_asf, 0, + "Allow ASF mode if available"); static uint32_t bge_readmem_ind(struct bge_softc *sc, int off) @@ -2179,8 +2189,8 @@ } sc->bge_asf_mode = 0; - if (bge_readmem_ind(sc, BGE_SOFTWARE_GENCOMM_SIG) - == BGE_MAGIC_NUMBER) { + if (bge_allow_asf && (bge_readmem_ind(sc, BGE_SOFTWARE_GENCOMM_SIG) + == BGE_MAGIC_NUMBER)) { if (bge_readmem_ind(sc, BGE_SOFTWARE_GENCOMM_NICCFG) & BGE_HWCFG_ASF) { sc->bge_asf_mode |= ASF_ENABLE; ==== //depot/projects/jail2/sys/dev/exca/exca.c#2 (text+ko) ==== @@ -53,7 +53,7 @@ */ #include -__FBSDID("$FreeBSD: src/sys/dev/exca/exca.c,v 1.24 2006/03/09 16:28:24 imp Exp $"); +__FBSDID("$FreeBSD: src/sys/dev/exca/exca.c,v 1.25 2006/09/24 00:26:33 imp Exp $"); #include #include @@ -179,11 +179,7 @@ struct mem_map_index_st *map; struct pccard_mem_handle *mem; uint32_t offset; -#if 0 - int mem8 = (mem->kind == PCCARD_A_MEM_ATTR); -#else - int mem8 = 1; -#endif + int mem8 = 1 /* mem->kind == PCCARD_A_MEM_ATTR */; map = &mem_map_index[win]; mem = &sc->mem[win]; ==== //depot/projects/jail2/sys/dev/ipmi/ipmi.c#2 (text) ==== @@ -25,24 +25,21 @@ */ #include -__FBSDID("$FreeBSD: src/sys/dev/ipmi/ipmi.c,v 1.3 2006/05/16 14:36:26 phk Exp $"); +__FBSDID("$FreeBSD: src/sys/dev/ipmi/ipmi.c,v 1.4 2006/09/22 22:11:29 jhb Exp $"); #include #include +#include +#include +#include #include #include +#include #include +#include #include - -#include -#include -#include - -#include -#include -#include +#include #include -#include #ifdef LOCAL_MODULE #include @@ -52,29 +49,7 @@ #include #endif -struct ipmi_done_list { - u_char *data; - int channel; - int msgid; - int len; - TAILQ_ENTRY(ipmi_done_list) list; -}; - -#define MAX_TIMEOUT 3 * hz - -static int ipmi_wait_for_ibf(device_t, int); -static int ipmi_wait_for_obf(device_t, int); -static void ipmi_clear_obf(device_t, int); -static void ipmi_error(device_t); -static void ipmi_check_read(device_t); -static int ipmi_write(device_t, u_char *, int); -static void ipmi_wait_for_tx_okay(device_t); -static void ipmi_wait_for_rx_okay(device_t); -static void ipmi_wait_for_not_busy(device_t); -static void ipmi_set_busy(device_t); -static int ipmi_ready_to_read(device_t); #ifdef IPMB -static int ipmi_handle_attn(device_t dev); static int ipmi_ipmb_checksum(u_char, int); static int ipmi_ipmb_send_message(device_t, u_char, u_char, u_char, u_char, u_char, int) @@ -92,11 +67,10 @@ static int on = 1; SYSCTL_NODE(_hw, OID_AUTO, ipmi, CTLFLAG_RD, 0, "IPMI driver parameters"); SYSCTL_INT(_hw_ipmi, OID_AUTO, on, CTLFLAG_RW, - &on, 0, ""); + &on, 0, ""); static struct cdevsw ipmi_cdevsw = { .d_version = D_VERSION, - .d_flags = D_NEEDGIANT, .d_open = ipmi_open, .d_close = ipmi_close, .d_ioctl = ipmi_ioctl, @@ -106,60 +80,126 @@ MALLOC_DEFINE(M_IPMI, "ipmi", "ipmi"); -static int -ipmi_open(struct cdev *dev, int flags, int fmt, struct thread *td) +static int +ipmi_open(struct cdev *cdev, int flags, int fmt, struct thread *td) { + struct ipmi_device *dev; struct ipmi_softc *sc; if (!on) - return ENOENT; + return (ENOENT); - sc = dev->si_drv1; - if (sc->ipmi_refcnt) { - return EBUSY; + dev = cdev->si_drv1; + sc = dev->ipmi_softc; + IPMI_LOCK(sc); + if (dev->ipmi_open) { + IPMI_UNLOCK(sc); + return (EBUSY); } - sc->ipmi_refcnt = 1; + dev->ipmi_open = 1; + IPMI_UNLOCK(sc); - return 0; + return (0); } -static int -ipmi_poll(struct cdev *dev, int poll_events, struct thread *td) +static int +ipmi_poll(struct cdev *cdev, int poll_events, struct thread *td) { + struct ipmi_device *dev; struct ipmi_softc *sc; int revents = 0; - sc = dev->si_drv1; + dev = cdev->si_drv1; + sc = dev->ipmi_softc; - ipmi_check_read(sc->ipmi_dev); - + IPMI_LOCK(sc); if (poll_events & (POLLIN | POLLRDNORM)) { - if (!TAILQ_EMPTY(&sc->ipmi_done)) + if (!TAILQ_EMPTY(&dev->ipmi_completed_requests)) revents |= poll_events & (POLLIN | POLLRDNORM); - if (TAILQ_EMPTY(&sc->ipmi_done) && sc->ipmi_requests == 0) { + if (dev->ipmi_requests == 0) revents |= POLLERR; - } } if (revents == 0) { if (poll_events & (POLLIN | POLLRDNORM)) - selrecord(td, &sc->ipmi_select); + selrecord(td, &dev->ipmi_select); } + IPMI_UNLOCK(sc); + + return (revents); +} + +static void +ipmi_purge_completed_requests(struct ipmi_device *dev) +{ + struct ipmi_request *req; - return revents; + while (!TAILQ_EMPTY(&dev->ipmi_completed_requests)) { + req = TAILQ_FIRST(&dev->ipmi_completed_requests); + TAILQ_REMOVE(&dev->ipmi_completed_requests, req, ir_link); + dev->ipmi_requests--; + ipmi_free_request(req); + } } -static int -ipmi_close(struct cdev *dev, int flags, int fmt, struct thread *td) +static int +ipmi_close(struct cdev *cdev, int flags, int fmt, struct thread *td) { + struct ipmi_request *req, *nreq; + struct ipmi_device *dev; struct ipmi_softc *sc; - int error = 0; +#ifdef CLONING + int bit; +#endif + + dev = cdev->si_drv1; + sc = dev->ipmi_softc; + + IPMI_LOCK(sc); + if (dev->ipmi_requests) { + /* Throw away any pending requests for this device. */ + TAILQ_FOREACH_SAFE(req, &sc->ipmi_pending_requests, ir_link, + nreq) { + if (req->ir_owner == dev) { + TAILQ_REMOVE(&sc->ipmi_pending_requests, req, + ir_link); + dev->ipmi_requests--; + ipmi_free_request(req); + } + } + + /* Throw away any pending completed requests for this device. */ + ipmi_purge_completed_requests(dev); + + /* + * If we still have outstanding requests, they must be stuck + * in an interface driver, so wait for those to drain. + */ + dev->ipmi_closing = 1; + while (dev->ipmi_requests > 0) { + msleep(&dev->ipmi_requests, &sc->ipmi_lock, PWAIT, + "ipmidrain", 0); + ipmi_purge_completed_requests(dev); + } + } - sc = dev->si_drv1; +#ifdef CLONING + /* Detach this sub-device from the main driver. */ + bit = minor(cdev) % 32; + sc->ipmi_cdev_mask &= ~(1 << bit); + TAILQ_REMOVE(&sc->ipmi_cdevs, dev, ipmi_link); + IPMI_UNLOCK(sc); - sc->ipmi_refcnt = 0; + /* Cleanup. */ + cdev->si_drv1 = NULL; + free(dev, M_IPMI); + destroy_dev(cdev); +#else + dev->ipmi_open = 0; + IPMI_UNLOCK(sc); +#endif - return error; + return (0); } #ifdef IPMB @@ -171,707 +211,384 @@ for (; len; len--) { sum += *data++; } - return -sum; + return (-sum); } +/* XXX: Needs work */ static int ipmi_ipmb_send_message(device_t dev, u_char channel, u_char netfn, u_char command, u_char seq, u_char *data, int data_len) { - u_char *temp; struct ipmi_softc *sc = device_get_softc(dev); + struct ipmi_request *req; + u_char slave_addr = 0x52; int error; - u_char slave_addr = 0x52; - temp = malloc(data_len + 10, M_IPMI, M_WAITOK); - bzero(temp, data_len + 10); - temp[0] = IPMI_APP_REQUEST << 2; - temp[1] = IPMI_SEND_MSG; - temp[2] = channel; - temp[3] = slave_addr; - temp[4] = netfn << 2; - temp[5] = ipmi_ipmb_check_sum(&temp[3], 2); - temp[6] = sc->ipmi_address; - temp[7] = seq << 2 | sc->ipmi_lun; - temp[8] = command; + req = ipmi_alloc_driver_request(IPMI_ADDR(IPMI_APP_REQUEST, 0), + IPMI_SEND_MSG, data_len + 8, 0); + req->ir_request[0] = channel; + req->ir_request[1] = slave_addr; + req->ir_request[2] = IPMI_ADDR(netfn, 0); + req->ir_request[3] = ipmi_ipmb_checksum(&req->ir_request[1], 2); + req->ir_request[4] = sc->ipmi_address; + req->ir_request[5] = IPMI_ADDR(seq, sc->ipmi_lun); + req->ir_request[6] = command; - bcopy(data, &temp[9], data_len); - temp[data_len + 9] = ipmi_ipmb_check(&temp[6], data_len + 3); - ipmi_write(sc->ipmi_dev, temp, data_len + 9); - free(temp, M_IPMI); + bcopy(data, &req->ir_request[7], data_len); + temp[data_len + 7] = ipmi_ipmb_checksum(&req->ir_request[4], + data_len + 3); - while (!ipmi_ready_to_read(dev)) - DELAY(1000); - temp = malloc(IPMI_MAX_RX, M_IPMI, M_WAITOK); - bzero(temp, IPMI_MAX_RX); - error = ipmi_read(dev, temp, IPMI_MAX_RX); - free(temp, M_IPMI); + ipmi_submit_driver_request(sc, req); + error = req->ir_error; + ipmi_free_request(req); - return error; + return (error); } static int -ipmi_handle_attn(device_t dev) +ipmi_handle_attn(struct ipmi_softc *sc) { - u_char temp[IPMI_MAX_RX]; - struct ipmi_softc *sc = device_get_softc(dev); + struct ipmi_request *req; int error; device_printf(sc->ipmi_dev, "BMC has a message\n"); - temp[0] = IPMI_APP_REQUEST << 2; - temp[1] = IPMI_GET_MSG_FLAGS; - ipmi_write(sc->ipmi_dev, temp, 2); - while (!ipmi_ready_to_read(dev)) - DELAY(1000); - bzero(temp, IPMI_MAX_RX); - error = ipmi_read(dev, temp, IPMI_MAX_RX); + req = ipmi_alloc_driver_request(IPMI_ADDR(IPMI_APP_REQUEST, 0), + IPMI_GET_MSG_FLAGS, 0, 1); + + ipmi_submit_driver_request(sc, req); - if (temp[2] == 0) { - if (temp[3] & IPMI_MSG_BUFFER_FULL) { + if (req->ir_error == 0 && req->ir_compcode == 0) { + if (req->ir_reply[0] & IPMI_MSG_BUFFER_FULL) { device_printf(sc->ipmi_dev, "message buffer full"); } - if (temp[3] & IPMI_WDT_PRE_TIMEOUT) { + if (req->ir_reply[0] & IPMI_WDT_PRE_TIMEOUT) { device_printf(sc->ipmi_dev, "watchdog about to go off"); } - if (temp[3] & IPMI_MSG_AVAILABLE) { - temp[0] = IPMI_APP_REQUEST << 2; - temp[1] = IPMI_GET_MSG; - ipmi_write(sc->ipmi_dev, temp, 2); - while (!ipmi_ready_to_read(dev)) - DELAY(1000); - bzero(temp, IPMI_MAX_RX); - error = ipmi_read(dev, temp, IPMI_MAX_RX); + if (req->ir_reply[0] & IPMI_MSG_AVAILABLE) { + ipmi_free_request(req); + + req = ipmi_alloc_driver_request( + IPMI_ADDR(IPMI_APP_REQUEST, 0), IPMI_GET_MSG, 0, + 16); device_printf(sc->ipmi_dev, "throw out message "); dump_buf(temp, 16); } - } else - return -1; - return error; + } + error = req->ir_error; + ipmi_free_request(req); + + return (error); } #endif -static int -ipmi_ready_to_read(device_t dev) -{ - struct ipmi_softc *sc = device_get_softc(dev); - int status, flags; - - if (sc->ipmi_bios_info.smic_mode) { - flags = INB(sc, sc->ipmi_smic_flags); -#ifdef IPMB - if (flags & SMIC_STATUS_SMS_ATN) { - ipmi_handle_attn(dev); - return 0; - } -#endif - if (flags & SMIC_STATUS_RX_RDY) - return 1; - } else if (sc->ipmi_bios_info.kcs_mode) { - status = INB(sc, sc->ipmi_kcs_status_reg); -#ifdef IPMB - if (status & KCS_STATUS_SMS_ATN) { - ipmi_handle_attn(dev); - return 0; - } +#ifdef IPMICTL_SEND_COMMAND_32 +#define PTRIN(p) ((void *)(uintptr_t)(p)) +#define PTROUT(p) ((uintptr_t)(p)) #endif - if (status & KCS_STATUS_OBF) - return 1; - } else { - device_printf(dev,"Unsupported mode\n"); - } - - return 0; -} -void -ipmi_intr(void *arg) { - device_t dev = arg; - - ipmi_check_read(dev); -} - -static void -ipmi_check_read(device_t dev){ - struct ipmi_softc *sc = device_get_softc(dev); - struct ipmi_done_list *item; - int status; - u_char *temp; - - if (!sc->ipmi_requests) - return; - - untimeout((timeout_t *)ipmi_check_read, dev, sc->ipmi_timeout_handle); - - if(ipmi_ready_to_read(dev)) { - sc->ipmi_requests--; - temp = malloc(IPMI_MAX_RX, M_IPMI, M_WAITOK); - bzero(temp, IPMI_MAX_RX); - status = ipmi_read(dev, temp, IPMI_MAX_RX); - item = malloc(sizeof(struct ipmi_done_list), M_IPMI, M_WAITOK); - bzero(item, sizeof(struct ipmi_done_list)); - item->data = temp; - item->len = status; - if (ticks - sc->ipmi_timestamp > MAX_TIMEOUT) { - device_printf(dev, "read timeout when ready\n"); - TAILQ_INSERT_TAIL(&sc->ipmi_done, item, list); - selwakeup(&sc->ipmi_select); - } else if (status) { - TAILQ_INSERT_TAIL(&sc->ipmi_done, item, list); - selwakeup(&sc->ipmi_select); - } - } else { - if (ticks - sc->ipmi_timestamp > MAX_TIMEOUT) { - sc->ipmi_requests--; - device_printf(dev, "read timeout when not ready\n"); - temp = malloc(IPMI_MAX_RX, M_IPMI, M_WAITOK); - bzero(temp, IPMI_MAX_RX); - sc->ipmi_busy = 0; - wakeup(&sc->ipmi_busy); - status = -1; - item = malloc(sizeof(struct ipmi_done_list), - M_IPMI, M_WAITOK); - bzero(item, sizeof(struct ipmi_done_list)); - item->data = temp; - item->len = status; - TAILQ_INSERT_TAIL(&sc->ipmi_done, item, list); - selwakeup(&sc->ipmi_select); - } - } - if (sc->ipmi_requests) - sc->ipmi_timeout_handle - = timeout((timeout_t *)ipmi_check_read, dev, hz/30); -} - static int -ipmi_ioctl(struct cdev *dev __unused, u_long cmd, caddr_t data, +ipmi_ioctl(struct cdev *cdev, u_long cmd, caddr_t data, int flags, struct thread *td) { struct ipmi_softc *sc; + struct ipmi_device *dev; + struct ipmi_request *kreq; struct ipmi_req *req = (struct ipmi_req *)data; struct ipmi_recv *recv = (struct ipmi_recv *)data; struct ipmi_addr addr; - struct ipmi_done_list *item; - u_char *temp; +#ifdef IPMICTL_SEND_COMMAND_32 + struct ipmi_req32 *req32 = (struct ipmi_req32 *)data; + struct ipmi_recv32 *recv32 = (struct ipmi_recv32 *)data; + union { + struct ipmi_req req; + struct ipmi_recv recv; + } thunk32; +#endif int error, len; - sc = dev->si_drv1; + dev = cdev->si_drv1; + sc = dev->ipmi_softc; + +#ifdef IPMICTL_SEND_COMMAND_32 + /* Convert 32-bit structures to native. */ + switch (cmd) { + case IPMICTL_SEND_COMMAND_32: + req = &thunk32.req; + req->addr = PTRIN(req32->addr); + req->addr_len = req32->addr_len; + req->msgid = req32->msgid; + req->msg.netfn = req32->msg.netfn; + req->msg.cmd = req32->msg.cmd; + req->msg.data_len = req32->msg.data_len; + req->msg.data = PTRIN(req32->msg.data); + break; + case IPMICTL_RECEIVE_MSG_TRUNC_32: + case IPMICTL_RECEIVE_MSG_32: + recv = &thunk32.recv; + recv->addr = PTRIN(recv32->addr); + recv->addr_len = recv32->addr_len; + recv->msg.data_len = recv32->msg.data_len; + recv->msg.data = PTRIN(recv32->msg.data); + break; + } +#endif switch (cmd) { +#ifdef IPMICTL_SEND_COMMAND_32 + case IPMICTL_SEND_COMMAND_32: +#endif case IPMICTL_SEND_COMMAND: + /* + * XXX: Need to add proper handling of this. >>> TRUNCATED FOR MAIL (1000 lines) <<<