svn commit: r223503 - in projects/pseries: amd64/ia32 amd64/include
amd64/pci boot/common boot/i386/libi386 boot/i386/zfsboot
cam/ata cam/scsi cddl/contrib/opensolaris/uts/common/sys
compat/freebsd...
Andreas Tobler
andreast at FreeBSD.org
Fri Jun 24 14:03:12 UTC 2011
Author: andreast
Date: Fri Jun 24 14:03:10 2011
New Revision: 223503
URL: http://svn.freebsd.org/changeset/base/223503
Log:
MFC.
Added:
projects/pseries/dev/usb/template/usb_template_audio.c
- copied unchanged from r223501, head/sys/dev/usb/template/usb_template_audio.c
projects/pseries/dev/usb/template/usb_template_kbd.c
- copied unchanged from r223501, head/sys/dev/usb/template/usb_template_kbd.c
projects/pseries/dev/usb/template/usb_template_modem.c
- copied unchanged from r223501, head/sys/dev/usb/template/usb_template_modem.c
projects/pseries/dev/usb/template/usb_template_mouse.c
- copied unchanged from r223501, head/sys/dev/usb/template/usb_template_mouse.c
projects/pseries/fs/nfsclient/nfs_clkdtrace.c
- copied unchanged from r223501, head/sys/fs/nfsclient/nfs_clkdtrace.c
projects/pseries/fs/nfsclient/nfs_kdtrace.h
- copied unchanged from r223501, head/sys/fs/nfsclient/nfs_kdtrace.h
projects/pseries/modules/dtrace/dtnfscl/
- copied from r223501, head/sys/modules/dtrace/dtnfscl/
projects/pseries/powerpc/ps3/ohci_ps3.c
- copied unchanged from r223501, head/sys/powerpc/ps3/ohci_ps3.c
projects/pseries/powerpc/ps3/ps3disk.c
- copied unchanged from r223501, head/sys/powerpc/ps3/ps3disk.c
projects/pseries/x86/include/pci_cfgreg.h
- copied unchanged from r223501, head/sys/x86/include/pci_cfgreg.h
projects/pseries/x86/pci/pci_bus.c
- copied unchanged from r223501, head/sys/x86/pci/pci_bus.c
Deleted:
projects/pseries/amd64/pci/pci_bus.c
projects/pseries/i386/pci/pci_bus.c
Modified:
projects/pseries/amd64/ia32/ia32_sigtramp.S
projects/pseries/amd64/include/pci_cfgreg.h
projects/pseries/boot/common/load_elf_obj.c
projects/pseries/boot/i386/libi386/biosacpi.c
projects/pseries/boot/i386/zfsboot/zfsldr.S
projects/pseries/cam/ata/ata_da.c
projects/pseries/cam/ata/ata_xpt.c
projects/pseries/cam/scsi/scsi_xpt.c
projects/pseries/cddl/contrib/opensolaris/uts/common/sys/ctf_api.h
projects/pseries/compat/freebsd32/freebsd32_misc.c
projects/pseries/compat/freebsd32/freebsd32_proto.h
projects/pseries/compat/freebsd32/freebsd32_syscall.h
projects/pseries/compat/freebsd32/freebsd32_syscalls.c
projects/pseries/compat/freebsd32/freebsd32_sysent.c
projects/pseries/compat/freebsd32/syscalls.master
projects/pseries/compat/linprocfs/linprocfs.c
projects/pseries/conf/files
projects/pseries/conf/files.amd64
projects/pseries/conf/files.i386
projects/pseries/conf/files.pc98
projects/pseries/conf/files.powerpc
projects/pseries/dev/acpica/acpi.c
projects/pseries/dev/acpica/acpi_cpu.c
projects/pseries/dev/acpica/acpi_pci.c
projects/pseries/dev/acpica/acpi_pcib_acpi.c
projects/pseries/dev/acpica/acpi_resource.c
projects/pseries/dev/acpica/acpivar.h
projects/pseries/dev/ath/ah_osdep.c
projects/pseries/dev/ath/ath_hal/ah.h
projects/pseries/dev/ath/ath_hal/ah_internal.h
projects/pseries/dev/ath/ath_hal/ah_regdomain.c
projects/pseries/dev/ath/ath_hal/ar5210/ar5210_attach.c
projects/pseries/dev/ath/ath_hal/ar5210/ar5210_beacon.c
projects/pseries/dev/ath/ath_hal/ar5211/ar5211_attach.c
projects/pseries/dev/ath/ath_hal/ar5211/ar5211_beacon.c
projects/pseries/dev/ath/ath_hal/ar5211/ar5211_xmit.c
projects/pseries/dev/ath/ath_hal/ar5212/ar5112.c
projects/pseries/dev/ath/ath_hal/ar5212/ar5212_attach.c
projects/pseries/dev/ath/ath_hal/ar5212/ar5212_beacon.c
projects/pseries/dev/ath/ath_hal/ar5212/ar5212_xmit.c
projects/pseries/dev/ath/ath_hal/ar5312/ar5312_attach.c
projects/pseries/dev/ath/ath_hal/ar5416/ar2133.c
projects/pseries/dev/ath/ath_hal/ar5416/ar5416_attach.c
projects/pseries/dev/ath/ath_hal/ar5416/ar5416_beacon.c
projects/pseries/dev/ath/ath_hal/ar5416/ar5416_misc.c
projects/pseries/dev/ath/ath_hal/ar5416/ar5416_xmit.c
projects/pseries/dev/ath/ath_hal/ar9001/ar9130_attach.c
projects/pseries/dev/ath/ath_hal/ar9001/ar9160_attach.c
projects/pseries/dev/ath/ath_hal/ar9002/ar9280_attach.c
projects/pseries/dev/ath/ath_hal/ar9002/ar9285_attach.c
projects/pseries/dev/ath/ath_hal/ar9002/ar9287_attach.c
projects/pseries/dev/ath/if_ath.c
projects/pseries/dev/ath/if_ath_sysctl.c
projects/pseries/dev/ath/if_ath_sysctl.h
projects/pseries/dev/atkbdc/atkbd.c
projects/pseries/dev/cardbus/cardbus_cis.c
projects/pseries/dev/dc/if_dc.c
projects/pseries/dev/e1000/if_igb.c
projects/pseries/dev/e1000/if_igb.h
projects/pseries/dev/firewire/fwohci.c
projects/pseries/dev/pccbb/pccbb.c
projects/pseries/dev/pccbb/pccbb_pci.c
projects/pseries/dev/pci/pci.c
projects/pseries/dev/sound/usb/uaudio.c
projects/pseries/dev/usb/input/atp.c
projects/pseries/dev/usb/input/uhid.c
projects/pseries/dev/usb/net/if_aue.c
projects/pseries/dev/usb/net/if_axe.c
projects/pseries/dev/usb/net/if_cdce.c
projects/pseries/dev/usb/net/if_cue.c
projects/pseries/dev/usb/net/if_ipheth.c
projects/pseries/dev/usb/net/if_kue.c
projects/pseries/dev/usb/net/if_mos.c
projects/pseries/dev/usb/net/if_rue.c
projects/pseries/dev/usb/net/if_udav.c
projects/pseries/dev/usb/net/uhso.c
projects/pseries/dev/usb/serial/u3g.c
projects/pseries/dev/usb/serial/uark.c
projects/pseries/dev/usb/serial/ubsa.c
projects/pseries/dev/usb/serial/uchcom.c
projects/pseries/dev/usb/serial/ucycom.c
projects/pseries/dev/usb/serial/uftdi.c
projects/pseries/dev/usb/serial/ugensa.c
projects/pseries/dev/usb/serial/uipaq.c
projects/pseries/dev/usb/serial/ulpt.c
projects/pseries/dev/usb/serial/umcs.c
projects/pseries/dev/usb/serial/umct.c
projects/pseries/dev/usb/serial/umodem.c
projects/pseries/dev/usb/serial/umoscom.c
projects/pseries/dev/usb/serial/uplcom.c
projects/pseries/dev/usb/serial/uslcom.c
projects/pseries/dev/usb/serial/uvisor.c
projects/pseries/dev/usb/serial/uvscom.c
projects/pseries/dev/usb/storage/umass.c
projects/pseries/dev/usb/template/usb_template.c
projects/pseries/dev/usb/template/usb_template.h
projects/pseries/dev/usb/template/usb_template_cdce.c
projects/pseries/dev/usb/template/usb_template_msc.c
projects/pseries/dev/usb/template/usb_template_mtp.c
projects/pseries/dev/usb/usb_hub.c
projects/pseries/dev/usb/usb_ioctl.h
projects/pseries/dev/usb/usb_lookup.c
projects/pseries/dev/usb/usbdevs
projects/pseries/dev/usb/usbdi.h
projects/pseries/dev/usb/wlan/if_rum.c
projects/pseries/dev/usb/wlan/if_run.c
projects/pseries/dev/usb/wlan/if_uath.c
projects/pseries/dev/usb/wlan/if_upgt.c
projects/pseries/dev/usb/wlan/if_ural.c
projects/pseries/dev/usb/wlan/if_urtw.c
projects/pseries/dev/usb/wlan/if_zyd.c
projects/pseries/dev/vr/if_vr.c
projects/pseries/dev/vr/if_vrreg.h
projects/pseries/dev/xl/if_xl.c
projects/pseries/fs/nfs/nfs_commonkrpc.c
projects/pseries/fs/nfs/nfsport.h
projects/pseries/fs/nfs/nfsproto.h
projects/pseries/fs/nfsclient/nfs_clbio.c
projects/pseries/fs/nfsclient/nfs_clkrpc.c
projects/pseries/fs/nfsclient/nfs_clnode.c
projects/pseries/fs/nfsclient/nfs_clport.c
projects/pseries/fs/nfsclient/nfs_clsubs.c
projects/pseries/fs/nfsclient/nfs_clvnops.c
projects/pseries/fs/nfsserver/nfs_nfsdcache.c
projects/pseries/fs/nfsserver/nfs_nfsdkrpc.c
projects/pseries/fs/nfsserver/nfs_nfsdserv.c
projects/pseries/fs/nfsserver/nfs_nfsdsocket.c
projects/pseries/geom/part/g_part_bsd.c
projects/pseries/i386/include/param.h
projects/pseries/i386/include/pci_cfgreg.h
projects/pseries/ia64/conf/NOTES
projects/pseries/ia64/ia64/busdma_machdep.c
projects/pseries/ia64/ia64/machdep.c
projects/pseries/ia64/ia64/pmap.c
projects/pseries/ia64/include/ia64_cpu.h
projects/pseries/kern/imgact_aout.c
projects/pseries/kern/kern_clocksource.c
projects/pseries/kern/sys_process.c
projects/pseries/kgssapi/gss_impl.c
projects/pseries/modules/Makefile
projects/pseries/modules/cxgbe/if_cxgbe/Makefile
projects/pseries/modules/dtrace/Makefile
projects/pseries/modules/dtrace/dtraceall/dtraceall.c
projects/pseries/modules/kgssapi_krb5/Makefile
projects/pseries/modules/nfscl/Makefile
projects/pseries/modules/nfscommon/Makefile
projects/pseries/modules/usb/template/Makefile
projects/pseries/net/if_gre.c
projects/pseries/net/if_gre.h
projects/pseries/net/route.c
projects/pseries/net/route.h
projects/pseries/net80211/ieee80211_ht.c
projects/pseries/net80211/ieee80211_var.h
projects/pseries/netgraph/bluetooth/drivers/ubt/ng_ubt.c
projects/pseries/netgraph/bluetooth/drivers/ubtbcmfw/ubtbcmfw.c
projects/pseries/netgraph/ng_ether.c
projects/pseries/netinet/if_ether.c
projects/pseries/netinet/ipfw/ip_dn_io.c
projects/pseries/netinet/ipfw/ip_fw_pfil.c
projects/pseries/netinet/libalias/alias_db.c
projects/pseries/netinet/libalias/alias_ftp.c
projects/pseries/netinet/libalias/alias_local.h
projects/pseries/netinet/libalias/libalias.3
projects/pseries/netinet/sctp.h
projects/pseries/netinet/sctp_uio.h
projects/pseries/netinet/sctp_usrreq.c
projects/pseries/netinet/tcp_output.c
projects/pseries/nfsclient/nfs_krpc.c
projects/pseries/nfsserver/nfs_srvkrpc.c
projects/pseries/powerpc/aim/copyinout.c
projects/pseries/powerpc/aim/locore32.S
projects/pseries/powerpc/aim/locore64.S
projects/pseries/powerpc/aim/machdep.c
projects/pseries/powerpc/aim/mmu_oea64.c
projects/pseries/powerpc/aim/mp_cpudep.c
projects/pseries/powerpc/aim/swtch32.S
projects/pseries/powerpc/aim/swtch64.S
projects/pseries/powerpc/aim/trap.c
projects/pseries/powerpc/aim/trap_subr32.S
projects/pseries/powerpc/aim/trap_subr64.S
projects/pseries/powerpc/booke/copyinout.c
projects/pseries/powerpc/booke/interrupt.c
projects/pseries/powerpc/booke/trap.c
projects/pseries/powerpc/include/pcpu.h
projects/pseries/powerpc/ofw/ofwcall32.S
projects/pseries/powerpc/powerpc/db_trace.c
projects/pseries/powerpc/powerpc/mp_machdep.c
projects/pseries/powerpc/ps3/if_glc.c
projects/pseries/powerpc/ps3/ps3-hvcall.h
projects/pseries/powerpc/ps3/ps3-hvcall.master
projects/pseries/powerpc/ps3/ps3bus.c
projects/pseries/powerpc/ps3/ps3bus.h
projects/pseries/powerpc/ps3/ps3pic.c
projects/pseries/rpc/rpc_generic.c
projects/pseries/rpc/rpcsec_gss.h
projects/pseries/sparc64/include/tsb.h
projects/pseries/sparc64/include/vmparam.h
projects/pseries/sparc64/sparc64/intr_machdep.c
projects/pseries/sparc64/sparc64/mp_machdep.c
projects/pseries/sparc64/sparc64/pmap.c
projects/pseries/sparc64/sparc64/tlb.c
projects/pseries/sys/diskpc98.h
projects/pseries/sys/dtrace_bsd.h
projects/pseries/sys/param.h
projects/pseries/sys/systm.h
projects/pseries/ufs/ffs/ffs_alloc.c
projects/pseries/ufs/ffs/ffs_extern.h
projects/pseries/ufs/ffs/ffs_snapshot.c
projects/pseries/ufs/ffs/ffs_softdep.c
projects/pseries/vm/vm_fault.c
projects/pseries/vm/vm_page.c
projects/pseries/vm/vm_page.h
projects/pseries/x86/x86/tsc.c
Directory Properties:
projects/pseries/ (props changed)
projects/pseries/amd64/include/xen/ (props changed)
projects/pseries/boot/ (props changed)
projects/pseries/boot/i386/efi/ (props changed)
projects/pseries/boot/ia64/efi/ (props changed)
projects/pseries/boot/ia64/ski/ (props changed)
projects/pseries/boot/powerpc/boot1.chrp/ (props changed)
projects/pseries/boot/powerpc/ofw/ (props changed)
projects/pseries/cddl/contrib/opensolaris/ (props changed)
projects/pseries/conf/ (props changed)
projects/pseries/contrib/dev/acpica/ (props changed)
projects/pseries/contrib/octeon-sdk/ (props changed)
projects/pseries/contrib/pf/ (props changed)
projects/pseries/contrib/x86emu/ (props changed)
Modified: projects/pseries/amd64/ia32/ia32_sigtramp.S
==============================================================================
--- projects/pseries/amd64/ia32/ia32_sigtramp.S Fri Jun 24 13:58:56 2011 (r223502)
+++ projects/pseries/amd64/ia32/ia32_sigtramp.S Fri Jun 24 14:03:10 2011 (r223503)
@@ -79,8 +79,20 @@ ia32_osigcode:
jmp 1b
+/*
+ * The lcall $7,$0 emulator cannot use the call gate that does an
+ * inter-privilege transition. The reason is that the call gate
+ * does not disable interrupts, and, before the swapgs is
+ * executed, we would have a window where the ring 0 code is
+ * executed with the wrong gsbase.
+ *
+ * Instead, reflect the lcall $7,$0 back to ring 3 trampoline
+ * which sets up the frame for int $0x80.
+ */
ALIGN_TEXT
lcall_tramp:
+ cmpl $SYS_vfork,%eax
+ je 2f
pushl %ebp
movl %esp,%ebp
pushl 0x24(%ebp) /* arg 6 */
@@ -91,8 +103,19 @@ lcall_tramp:
pushl 0x10(%ebp) /* arg 1 */
pushl 0xc(%ebp) /* gap */
int $0x80
- leave
+ leavel
+1:
lretl
+2:
+ /*
+ * vfork handling is special and relies on the libc stub saving
+ * the return ip in %ecx. If vfork failed, then there is no
+ * child which can corrupt the frame created by call gate.
+ */
+ int $0x80
+ jb 1b
+ addl $8,%esp
+ jmpl *%ecx
#endif
ALIGN_TEXT
Modified: projects/pseries/amd64/include/pci_cfgreg.h
==============================================================================
--- projects/pseries/amd64/include/pci_cfgreg.h Fri Jun 24 13:58:56 2011 (r223502)
+++ projects/pseries/amd64/include/pci_cfgreg.h Fri Jun 24 14:03:10 2011 (r223503)
@@ -1,43 +1,6 @@
/*-
- * Copyright (c) 1997, Stefan Esser <se at freebsd.org>
- * 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 unmodified, this list of conditions, and the following
- * disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
- * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
- * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
- * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * $FreeBSD$
- *
+ * This file is in the public domain.
*/
+/* $FreeBSD$ */
-#define CONF1_ADDR_PORT 0x0cf8
-#define CONF1_DATA_PORT 0x0cfc
-
-#define CONF1_ENABLE 0x80000000ul
-#define CONF1_ENABLE_CHK 0x80000000ul
-#define CONF1_ENABLE_MSK 0x7f000000ul
-#define CONF1_ENABLE_CHK1 0xff000001ul
-#define CONF1_ENABLE_MSK1 0x80000001ul
-#define CONF1_ENABLE_RES1 0x80000000ul
-
-int pcie_cfgregopen(uint64_t base, uint8_t minbus, uint8_t maxbus);
-int pci_cfgregopen(void);
-u_int32_t pci_cfgregread(int bus, int slot, int func, int reg, int bytes);
-void pci_cfgregwrite(int bus, int slot, int func, int reg, u_int32_t data, int bytes);
+#include <x86/pci_cfgreg.h>
Modified: projects/pseries/boot/common/load_elf_obj.c
==============================================================================
--- projects/pseries/boot/common/load_elf_obj.c Fri Jun 24 13:58:56 2011 (r223502)
+++ projects/pseries/boot/common/load_elf_obj.c Fri Jun 24 14:03:10 2011 (r223503)
@@ -196,7 +196,7 @@ static int
__elfN(obj_loadimage)(struct preloaded_file *fp, elf_file_t ef, u_int64_t off)
{
Elf_Ehdr *hdr;
- Elf_Shdr *shdr;
+ Elf_Shdr *shdr, *cshdr, *lshdr;
vm_offset_t firstaddr, lastaddr;
int i, nsym, res, ret, shdrbytes, symstrindex;
@@ -294,12 +294,35 @@ __elfN(obj_loadimage)(struct preloaded_f
/* Clear the whole area, including bss regions. */
kern_bzero(firstaddr, lastaddr - firstaddr);
- /* Now read it all in. */
- for (i = 0; i < hdr->e_shnum; i++) {
- if (shdr[i].sh_addr == 0 || shdr[i].sh_type == SHT_NOBITS)
- continue;
- if (kern_pread(ef->fd, (vm_offset_t)shdr[i].sh_addr,
- shdr[i].sh_size, (off_t)shdr[i].sh_offset) != 0) {
+ /* Figure section with the lowest file offset we haven't loaded yet. */
+ for (cshdr = NULL; /* none */; /* none */)
+ {
+ /*
+ * Find next section to load. The complexity of this loop is
+ * O(n^2), but with the number of sections being typically
+ * small, we do not care.
+ */
+ lshdr = cshdr;
+
+ for (i = 0; i < hdr->e_shnum; i++) {
+ if (shdr[i].sh_addr == 0 ||
+ shdr[i].sh_type == SHT_NOBITS)
+ continue;
+ /* Skip sections that were loaded already. */
+ if (lshdr != NULL &&
+ lshdr->sh_offset >= shdr[i].sh_offset)
+ continue;
+ /* Find section with smallest offset. */
+ if (cshdr == lshdr ||
+ cshdr->sh_offset > shdr[i].sh_offset)
+ cshdr = &shdr[i];
+ }
+
+ if (cshdr == lshdr)
+ break;
+
+ if (kern_pread(ef->fd, (vm_offset_t)cshdr->sh_addr,
+ cshdr->sh_size, (off_t)cshdr->sh_offset) != 0) {
printf("\nelf" __XSTRING(__ELF_WORD_SIZE)
"_obj_loadimage: read failed\n");
goto out;
Modified: projects/pseries/boot/i386/libi386/biosacpi.c
==============================================================================
--- projects/pseries/boot/i386/libi386/biosacpi.c Fri Jun 24 13:58:56 2011 (r223502)
+++ projects/pseries/boot/i386/libi386/biosacpi.c Fri Jun 24 14:03:10 2011 (r223503)
@@ -61,7 +61,7 @@ biosacpi_detect(void)
return;
/* export values from the RSDP */
- sprintf(buf, "%p", VTOP(rsdp));
+ sprintf(buf, "%u", VTOP(rsdp));
setenv("hint.acpi.0.rsdp", buf, 1);
revision = rsdp->Revision;
if (revision == 0)
Modified: projects/pseries/boot/i386/zfsboot/zfsldr.S
==============================================================================
--- projects/pseries/boot/i386/zfsboot/zfsldr.S Fri Jun 24 13:58:56 2011 (r223502)
+++ projects/pseries/boot/i386/zfsboot/zfsldr.S Fri Jun 24 14:03:10 2011 (r223503)
@@ -16,7 +16,6 @@
*/
/* Memory Locations */
- .set MEM_REL,0x700 # Relocation address
.set MEM_ARG,0x900 # Arguments
.set MEM_ORG,0x7c00 # Origin
.set MEM_BUF,0x8000 # Load area
@@ -91,26 +90,18 @@ main: cld # String ops inc
mov %cx,%ss # Set up
mov $start,%sp # stack
/*
- * Relocate ourself to MEM_REL. Since %cx == 0, the inc %ch sets
- * %cx == 0x100.
- */
- mov %sp,%si # Source
- mov $MEM_REL,%di # Destination
- incb %ch # Word count
- rep # Copy
- movsw # code
-/*
* If we are on a hard drive, then load the MBR and look for the first
* FreeBSD slice. We use the fake partition entry below that points to
* the MBR when we call nread. The first pass looks for the first active
* FreeBSD slice. The second pass looks for the first non-active FreeBSD
* slice if the first one fails.
*/
- mov $part4,%si # Partition
+ mov $part4,%si # Dummy partition
cmpb $0x80,%dl # Hard drive?
jb main.4 # No
- movb $0x1,%dh # Block count
- callw nread # Read MBR
+ xor %eax,%eax # Read MBR
+ movl $MEM_BUF,%ebx # from first
+ callw nread # sector
mov $0x1,%cx # Two passes
main.1: mov $MEM_BUF+PRT_OFF,%si # Partition table
movb $0x1,%dh # Partition
@@ -139,52 +130,51 @@ main.4: xor %dx,%dx # Partition:drive
/*
* Ok, we have a slice and drive in %dx now, so use that to locate and
* load boot2. %si references the start of the slice we are looking
- * for, so go ahead and load up the 64 sectors starting at sector 1024
+ * for, so go ahead and load up the 128 sectors starting at sector 1024
* (i.e. after the two vdev labels). We don't have do anything fancy
* here to allow for an extra copy of boot1 and a partition table
* (compare to this section of the UFS bootstrap) so we just load it
- * all at 0x8000. The first part of boot2 is BTX, which wants to run
+ * all at 0x9000. The first part of boot2 is BTX, which wants to run
* at 0x9000. The boot2.bin binary starts right after the end of BTX,
* so we have to figure out where the start of it is and then move the
- * binary to 0xc000. After we have moved the client, we relocate BTX
- * itself to 0x9000 - doing it in this order means that none of the
- * memcpy regions overlap which would corrupt the copy. Normally, BTX
- * clients start at MEM_USR, or 0xa000, but when we use btxld to
- * create zfsboot2, we use an entry point of 0x2000. That entry point is
- * relative to MEM_USR; thus boot2.bin starts at 0xc000.
+ * binary to 0xc000. Normally, BTX clients start at MEM_USR, or 0xa000,
+ * but when we use btxld to create zfsboot2, we use an entry point of
+ * 0x2000. That entry point is relative to MEM_USR; thus boot2.bin
+ * starts at 0xc000.
*
* The load area and the target area for the client overlap so we have
* to use a decrementing string move. We also play segment register
* games with the destination address for the move so that the client
* can be larger than 16k (which would overflow the zero segment since
- * the client starts at 0xc000). Relocating BTX is easy since the load
- * area and target area do not overlap.
+ * the client starts at 0xc000).
*/
main.5: mov %dx,MEM_ARG # Save args
- movb $NSECT,%dh # Sector count
+ mov $NSECT,%cx # Sector count
movl $1024,%eax # Offset to boot2
- callw nread.1 # Read disk
-main.6: mov $MEM_BUF,%si # BTX (before reloc)
- mov 0xa(%si),%bx # Get BTX length and set
+ mov $MEM_BTX,%ebx # Destination buffer
+main.6: pushal # Save params
+ callw nread # Read disk
+ popal # Restore
+ incl %eax # Advance to
+ add $SIZ_SEC,%ebx # next sector
+ loop main.6 # If not last, read another
+ mov MEM_BTX+0xa,%bx # Get BTX length
mov $NSECT*SIZ_SEC-1,%di # Size of load area (less one)
- mov %di,%si # End of load
- add $MEM_BUF,%si # area
+ mov %di,%si # End of load area, 0x9000 rel
sub %bx,%di # End of client, 0xc000 rel
mov %di,%cx # Size of
inc %cx # client
+ mov $(MEM_BTX)>>4,%dx # Segment
+ mov %dx,%ds # addressing 0x9000
mov $(MEM_USR+2*SIZ_PAG)>>4,%dx # Segment
mov %dx,%es # addressing 0xc000
std # Move with decrement
rep # Relocate
movsb # client
- mov %ds,%dx # Back to
- mov %dx,%es # zero segment
- mov $MEM_BUF,%si # BTX (before reloc)
- mov $MEM_BTX,%di # BTX
- mov %bx,%cx # Get BTX length
- cld # Increment this time
- rep # Relocate
- movsb # BTX
+ cld # Back to increment
+ xor %dx,%dx # Back
+ mov %ds,%dx # to zero
+ mov %dx,%es # segment
/*
* Enable A20 so we can access memory above 1 meg.
@@ -211,32 +201,35 @@ seta20.3: sti # Enable interrupts
/*
* Trampoline used to call read from within zfsldr. Sets up an EDD
- * packet on the stack and passes it to read.
+ * packet on the stack and passes it to read. We assume that the
+ * destination address is always segment-aligned.
*
* %eax - int - LBA to read in relative to partition start
+ * %ebx - ptr - destination address
* %dl - byte - drive to read from
- * %dh - byte - num sectors to read
* %si - ptr - MBR partition entry
*/
-nread: xor %eax,%eax # Sector offset in partition
-nread.1: xor %ecx,%ecx # Get
+nread: xor %ecx,%ecx # Get
addl 0x8(%si),%eax # LBA
adc $0,%ecx
pushl %ecx # Starting absolute block
pushl %eax # block number
- push %es # Address of
- push $MEM_BUF # transfer buffer
- xor %ax,%ax # Number of
- movb %dh,%al # blocks to
- push %ax # transfer
+ shr $4,%ebx # Convert to segment
+ push %bx # Address of
+ push $0 # transfer buffer
+ push $0x1 # Read 1 sector
push $0x10 # Size of packet
mov %sp,%bp # Packet pointer
callw read # Read from disk
+ jc nread.1 # If error, fail
lea 0x10(%bp),%sp # Clear stack
- jnc return # If success, return
- mov $msg_read,%si # Otherwise, set the error
- # message and fall through to
- # the error routine
+ ret # If success, return
+nread.1: mov %ah,%al # Format
+ mov $read_err,%di # error
+ call hex8 # code
+ mov $msg_read,%si # Set the error message and
+ # fall through to the error
+ # routine
/*
* Print out the error message pointed to by %ds:(%si) followed
* by a prompt, wait for a keypress, and then reboot the machine.
@@ -259,14 +252,6 @@ putstr: lodsb # Get char
jne putstr.0 # No
/*
- * Overused return code. ereturn is used to return an error from the
- * read function. Since we assume putstr succeeds, we (ab)use the
- * same code when we return from putstr.
- */
-ereturn: movb $0x1,%ah # Invalid
- stc # argument
-return: retw # To caller
-/*
* Reads sectors from the disk. If EDD is enabled, then check if it is
* installed and use it if it is. If it is not installed or not enabled, then
* fall back to using CHS. Since we use a LBA, if we are using CHS, we have to
@@ -294,14 +279,30 @@ read: cmpb $0x80,%dl # Hard drive?
retw # To caller
read.1: mov $msg_chs,%si
jmp error
-msg_chs: .asciz "CHS not supported"
+
+/*
+ * AL to hex, saving the result to [EDI].
+ */
+hex8: push %ax # Save
+ shrb $0x4,%al # Do upper
+ call hex8.1 # 4
+ pop %ax # Restore
+hex8.1: andb $0xf,%al # Get lower 4
+ cmpb $0xa,%al # Convert
+ sbbb $0x69,%al # to hex
+ das # digit
+ orb $0x20,%al # To lower case
+ stosb # Save char
+ ret # (Recursive)
/* Messages */
-msg_read: .asciz "Read"
-msg_part: .asciz "Boot"
+msg_chs: .asciz "CHS not supported"
+msg_read: .ascii "Read error: "
+read_err: .asciz "XX"
+msg_part: .asciz "Boot error"
-prompt: .asciz " error\r\n"
+prompt: .asciz "\r\n"
.org PRT_OFF,0x90
Modified: projects/pseries/cam/ata/ata_da.c
==============================================================================
--- projects/pseries/cam/ata/ata_da.c Fri Jun 24 13:58:56 2011 (r223502)
+++ projects/pseries/cam/ata/ata_da.c Fri Jun 24 14:03:10 2011 (r223503)
@@ -818,7 +818,7 @@ adagetattr(struct bio *bp)
int ret = -1;
struct cam_periph *periph;
- if (bp->bio_disk == NULL || bp->bio_disk->d_drv1)
+ if (bp->bio_disk == NULL || bp->bio_disk->d_drv1 == NULL)
return ENXIO;
periph = (struct cam_periph *)bp->bio_disk->d_drv1;
if (periph->path == NULL)
Modified: projects/pseries/cam/ata/ata_xpt.c
==============================================================================
--- projects/pseries/cam/ata/ata_xpt.c Fri Jun 24 13:58:56 2011 (r223502)
+++ projects/pseries/cam/ata/ata_xpt.c Fri Jun 24 14:03:10 2011 (r223503)
@@ -1601,6 +1601,34 @@ ata_device_transport(struct cam_path *pa
}
static void
+ata_dev_advinfo(union ccb *start_ccb)
+{
+ struct cam_ed *device;
+ struct ccb_dev_advinfo *cdai;
+ off_t amt;
+
+ start_ccb->ccb_h.status = CAM_REQ_INVALID;
+ device = start_ccb->ccb_h.path->device;
+ cdai = &start_ccb->cdai;
+ switch(cdai->buftype) {
+ case CDAI_TYPE_SERIAL_NUM:
+ if (cdai->flags & CDAI_FLAG_STORE)
+ break;
+ start_ccb->ccb_h.status = CAM_REQ_CMP;
+ cdai->provsiz = device->serial_num_len;
+ if (device->serial_num_len == 0)
+ break;
+ amt = device->serial_num_len;
+ if (cdai->provsiz > cdai->bufsiz)
+ amt = cdai->bufsiz;
+ memcpy(cdai->buf, device->serial_num, amt);
+ break;
+ default:
+ break;
+ }
+}
+
+static void
ata_action(union ccb *start_ccb)
{
@@ -1650,7 +1678,13 @@ ata_action(union ccb *start_ccb)
xpt_done(start_ccb);
break;
}
- /* FALLTHROUGH */
+ xpt_action_default(start_ccb);
+ break;
+ }
+ case XPT_DEV_ADVINFO:
+ {
+ ata_dev_advinfo(start_ccb);
+ break;
}
default:
xpt_action_default(start_ccb);
Modified: projects/pseries/cam/scsi/scsi_xpt.c
==============================================================================
--- projects/pseries/cam/scsi/scsi_xpt.c Fri Jun 24 13:58:56 2011 (r223502)
+++ projects/pseries/cam/scsi/scsi_xpt.c Fri Jun 24 14:03:10 2011 (r223503)
@@ -2440,12 +2440,13 @@ scsi_dev_advinfo(union ccb *start_ccb)
struct ccb_dev_advinfo *cdai;
off_t amt;
+ start_ccb->ccb_h.status = CAM_REQ_INVALID;
device = start_ccb->ccb_h.path->device;
cdai = &start_ccb->cdai;
switch(cdai->buftype) {
case CDAI_TYPE_SCSI_DEVID:
if (cdai->flags & CDAI_FLAG_STORE)
- break;
+ return;
cdai->provsiz = device->device_id_len;
if (device->device_id_len == 0)
break;
@@ -2456,7 +2457,7 @@ scsi_dev_advinfo(union ccb *start_ccb)
break;
case CDAI_TYPE_SERIAL_NUM:
if (cdai->flags & CDAI_FLAG_STORE)
- break;
+ return;
cdai->provsiz = device->serial_num_len;
if (device->serial_num_len == 0)
break;
@@ -2490,7 +2491,7 @@ scsi_dev_advinfo(union ccb *start_ccb)
}
break;
default:
- break;
+ return;
}
start_ccb->ccb_h.status = CAM_REQ_CMP;
Modified: projects/pseries/cddl/contrib/opensolaris/uts/common/sys/ctf_api.h
==============================================================================
--- projects/pseries/cddl/contrib/opensolaris/uts/common/sys/ctf_api.h Fri Jun 24 13:58:56 2011 (r223502)
+++ projects/pseries/cddl/contrib/opensolaris/uts/common/sys/ctf_api.h Fri Jun 24 14:03:10 2011 (r223503)
@@ -65,7 +65,7 @@ typedef long ctf_id_t;
* filling in ctf_sect_t structures and passing them to ctf_bufopen():
*/
typedef struct ctf_sect {
- char *cts_name; /* section name (if any) */
+ const char *cts_name; /* section name (if any) */
ulong_t cts_type; /* section type (ELF SHT_... value) */
ulong_t cts_flags; /* section flags (ELF SHF_... value) */
#if defined(sun)
Modified: projects/pseries/compat/freebsd32/freebsd32_misc.c
==============================================================================
--- projects/pseries/compat/freebsd32/freebsd32_misc.c Fri Jun 24 13:58:56 2011 (r223502)
+++ projects/pseries/compat/freebsd32/freebsd32_misc.c Fri Jun 24 14:03:10 2011 (r223503)
@@ -1416,6 +1416,19 @@ freebsd32_pwrite(struct thread *td, stru
return (pwrite(td, &ap));
}
+#ifdef COMPAT_43
+int
+ofreebsd32_lseek(struct thread *td, struct ofreebsd32_lseek_args *uap)
+{
+ struct lseek_args nuap;
+
+ nuap.fd = uap->fd;
+ nuap.offset = uap->offset;
+ nuap.whence = uap->whence;
+ return (lseek(td, &nuap));
+}
+#endif
+
int
freebsd32_lseek(struct thread *td, struct freebsd32_lseek_args *uap)
{
Modified: projects/pseries/compat/freebsd32/freebsd32_proto.h
==============================================================================
--- projects/pseries/compat/freebsd32/freebsd32_proto.h Fri Jun 24 13:58:56 2011 (r223502)
+++ projects/pseries/compat/freebsd32/freebsd32_proto.h Fri Jun 24 14:03:10 2011 (r223503)
@@ -3,7 +3,7 @@
*
* DO NOT EDIT-- this file is automatically generated.
* $FreeBSD$
- * created from FreeBSD
+ * created from FreeBSD: head/sys/compat/freebsd32/syscalls.master 223166 2011-06-16 22:05:56Z kib
*/
#ifndef _FREEBSD32_SYSPROTO_H_
@@ -690,6 +690,11 @@ int freebsd32_posix_fallocate(struct thr
#if !defined(PAD64_REQUIRED) && defined(__powerpc__)
#define PAD64_REQUIRED
#endif
+struct ofreebsd32_lseek_args {
+ char fd_l_[PADL_(int)]; int fd; char fd_r_[PADR_(int)];
+ char offset_l_[PADL_(int)]; int offset; char offset_r_[PADR_(int)];
+ char whence_l_[PADL_(int)]; int whence; char whence_r_[PADR_(int)];
+};
struct ofreebsd32_stat_args {
char path_l_[PADL_(char *)]; char * path; char path_r_[PADR_(char *)];
char ub_l_[PADL_(struct ostat32 *)]; struct ostat32 * ub; char ub_r_[PADR_(struct ostat32 *)];
@@ -747,6 +752,7 @@ struct ofreebsd32_getdirentries_args {
#ifdef PAD64_REQUIRED
#else
#endif
+int ofreebsd32_lseek(struct thread *, struct ofreebsd32_lseek_args *);
int ofreebsd32_stat(struct thread *, struct ofreebsd32_stat_args *);
int ofreebsd32_lstat(struct thread *, struct ofreebsd32_lstat_args *);
int ofreebsd32_sigaction(struct thread *, struct ofreebsd32_sigaction_args *);
@@ -923,6 +929,7 @@ int freebsd7_freebsd32_shmctl(struct thr
#define FREEBSD32_SYS_AUE_freebsd32_wait4 AUE_WAIT4
#define FREEBSD32_SYS_AUE_freebsd4_freebsd32_getfsstat AUE_GETFSSTAT
+#define FREEBSD32_SYS_AUE_ofreebsd32_lseek AUE_LSEEK
#define FREEBSD32_SYS_AUE_freebsd32_recvmsg AUE_RECVMSG
#define FREEBSD32_SYS_AUE_freebsd32_sendmsg AUE_SENDMSG
#define FREEBSD32_SYS_AUE_freebsd32_recvfrom AUE_RECVFROM
Modified: projects/pseries/compat/freebsd32/freebsd32_syscall.h
==============================================================================
--- projects/pseries/compat/freebsd32/freebsd32_syscall.h Fri Jun 24 13:58:56 2011 (r223502)
+++ projects/pseries/compat/freebsd32/freebsd32_syscall.h Fri Jun 24 14:03:10 2011 (r223503)
@@ -3,7 +3,7 @@
*
* DO NOT EDIT-- this file is automatically generated.
* $FreeBSD$
- * created from FreeBSD
+ * created from FreeBSD: head/sys/compat/freebsd32/syscalls.master 223166 2011-06-16 22:05:56Z kib
*/
#define FREEBSD32_SYS_syscall 0
@@ -25,7 +25,7 @@
#define FREEBSD32_SYS_chown 16
#define FREEBSD32_SYS_break 17
#define FREEBSD32_SYS_freebsd4_freebsd32_getfsstat 18
- /* 19 is obsolete olseek */
+ /* 19 is old freebsd32_lseek */
#define FREEBSD32_SYS_getpid 20
#define FREEBSD32_SYS_mount 21
#define FREEBSD32_SYS_unmount 22
Modified: projects/pseries/compat/freebsd32/freebsd32_syscalls.c
==============================================================================
--- projects/pseries/compat/freebsd32/freebsd32_syscalls.c Fri Jun 24 13:58:56 2011 (r223502)
+++ projects/pseries/compat/freebsd32/freebsd32_syscalls.c Fri Jun 24 14:03:10 2011 (r223503)
@@ -3,7 +3,7 @@
*
* DO NOT EDIT-- this file is automatically generated.
* $FreeBSD$
- * created from FreeBSD
+ * created from FreeBSD: head/sys/compat/freebsd32/syscalls.master 223166 2011-06-16 22:05:56Z kib
*/
const char *freebsd32_syscallnames[] = {
@@ -29,7 +29,7 @@ const char *freebsd32_syscallnames[] = {
"chown", /* 16 = chown */
"break", /* 17 = break */
"compat4.freebsd32_getfsstat", /* 18 = freebsd4 freebsd32_getfsstat */
- "obs_olseek", /* 19 = obsolete olseek */
+ "compat.freebsd32_lseek", /* 19 = old freebsd32_lseek */
"getpid", /* 20 = getpid */
"mount", /* 21 = mount */
"unmount", /* 22 = unmount */
Modified: projects/pseries/compat/freebsd32/freebsd32_sysent.c
==============================================================================
--- projects/pseries/compat/freebsd32/freebsd32_sysent.c Fri Jun 24 13:58:56 2011 (r223502)
+++ projects/pseries/compat/freebsd32/freebsd32_sysent.c Fri Jun 24 14:03:10 2011 (r223503)
@@ -3,7 +3,7 @@
*
* DO NOT EDIT-- this file is automatically generated.
* $FreeBSD$
- * created from FreeBSD
+ * created from FreeBSD: head/sys/compat/freebsd32/syscalls.master 223166 2011-06-16 22:05:56Z kib
*/
#include "opt_compat.h"
@@ -66,7 +66,7 @@ struct sysent freebsd32_sysent[] = {
{ AS(chown_args), (sy_call_t *)chown, AUE_CHOWN, NULL, 0, 0, 0, SY_THR_STATIC }, /* 16 = chown */
{ AS(obreak_args), (sy_call_t *)obreak, AUE_NULL, NULL, 0, 0, 0, SY_THR_STATIC }, /* 17 = break */
{ compat4(AS(freebsd4_freebsd32_getfsstat_args),freebsd32_getfsstat), AUE_GETFSSTAT, NULL, 0, 0, 0, SY_THR_STATIC }, /* 18 = freebsd4 freebsd32_getfsstat */
- { 0, (sy_call_t *)nosys, AUE_NULL, NULL, 0, 0, 0, SY_THR_ABSENT }, /* 19 = obsolete olseek */
+ { compat(AS(ofreebsd32_lseek_args),freebsd32_lseek), AUE_LSEEK, NULL, 0, 0, 0, SY_THR_STATIC }, /* 19 = old freebsd32_lseek */
{ 0, (sy_call_t *)getpid, AUE_GETPID, NULL, 0, 0, 0, SY_THR_STATIC }, /* 20 = getpid */
{ AS(mount_args), (sy_call_t *)mount, AUE_MOUNT, NULL, 0, 0, 0, SY_THR_STATIC }, /* 21 = mount */
{ AS(unmount_args), (sy_call_t *)unmount, AUE_UMOUNT, NULL, 0, 0, 0, SY_THR_STATIC }, /* 22 = unmount */
Modified: projects/pseries/compat/freebsd32/syscalls.master
==============================================================================
--- projects/pseries/compat/freebsd32/syscalls.master Fri Jun 24 13:58:56 2011 (r223502)
+++ projects/pseries/compat/freebsd32/syscalls.master Fri Jun 24 14:03:10 2011 (r223503)
@@ -89,7 +89,8 @@
18 AUE_GETFSSTAT COMPAT4 { int freebsd32_getfsstat( \
struct statfs32 *buf, long bufsize, \
int flags); }
-19 AUE_LSEEK OBSOL olseek
+19 AUE_LSEEK COMPAT { int freebsd32_lseek(int fd, int offset, \
+ int whence); }
20 AUE_GETPID NOPROTO { pid_t getpid(void); }
21 AUE_MOUNT NOPROTO { int mount(char *type, char *path, \
int flags, caddr_t data); }
Modified: projects/pseries/compat/linprocfs/linprocfs.c
==============================================================================
--- projects/pseries/compat/linprocfs/linprocfs.c Fri Jun 24 13:58:56 2011 (r223502)
+++ projects/pseries/compat/linprocfs/linprocfs.c Fri Jun 24 14:03:10 2011 (r223503)
@@ -1049,6 +1049,15 @@ linprocfs_doproccmdline(PFS_FILL_ARGS)
PROC_UNLOCK(p);
return (ret);
}
+
+ /*
+ * Mimic linux behavior and pass only processes with usermode
+ * address space as valid. Return zero silently otherwize.
+ */
+ if (p->p_vmspace == &vmspace0) {
+ PROC_UNLOCK(p);
+ return (0);
+ }
if (p->p_args != NULL) {
sbuf_bcpy(sb, p->p_args->ar_args, p->p_args->ar_length);
PROC_UNLOCK(p);
@@ -1073,6 +1082,15 @@ linprocfs_doprocenviron(PFS_FILL_ARGS)
PROC_UNLOCK(p);
return (ret);
}
+
+ /*
+ * Mimic linux behavior and pass only processes with usermode
+ * address space as valid. Return zero silently otherwize.
+ */
+ if (p->p_vmspace == &vmspace0) {
+ PROC_UNLOCK(p);
+ return (0);
+ }
PROC_UNLOCK(p);
ret = linprocfs_doargv(td, p, sb, ps_string_env);
Modified: projects/pseries/conf/files
==============================================================================
--- projects/pseries/conf/files Fri Jun 24 13:58:56 2011 (r223502)
+++ projects/pseries/conf/files Fri Jun 24 14:03:10 2011 (r223503)
@@ -1991,8 +1991,12 @@ dev/usb/quirk/usb_quirk.c optional usb
#
# USB templates
#
-dev/usb/template/usb_template.c optional usb_template
+dev/usb/template/usb_template.c optional usb_template
+dev/usb/template/usb_template_audio.c optional usb_template
dev/usb/template/usb_template_cdce.c optional usb_template
+dev/usb/template/usb_template_kbd.c optional usb_template
+dev/usb/template/usb_template_modem.c optional usb_template
+dev/usb/template/usb_template_mouse.c optional usb_template
dev/usb/template/usb_template_msc.c optional usb_template
dev/usb/template/usb_template_mtp.c optional usb_template
#
Modified: projects/pseries/conf/files.amd64
==============================================================================
--- projects/pseries/conf/files.amd64 Fri Jun 24 13:58:56 2011 (r223502)
+++ projects/pseries/conf/files.amd64 Fri Jun 24 14:03:10 2011 (r223503)
@@ -128,7 +128,6 @@ amd64/amd64/trap.c standard
amd64/amd64/uio_machdep.c standard
amd64/amd64/uma_machdep.c standard
amd64/amd64/vm_machdep.c standard
-amd64/pci/pci_bus.c optional pci
amd64/pci/pci_cfgreg.c optional pci
crypto/aesni/aesencdec_amd64.S optional aesni
crypto/aesni/aeskeys_amd64.S optional aesni
@@ -315,7 +314,8 @@ x86/isa/isa.c standard
x86/isa/isa_dma.c standard
x86/isa/nmi.c standard
x86/isa/orm.c optional isa
-x86/pci/qpi.c standard
+x86/pci/pci_bus.c optional pci
+x86/pci/qpi.c optional pci
x86/x86/busdma_machdep.c standard
x86/x86/dump_machdep.c standard
x86/x86/io_apic.c standard
Modified: projects/pseries/conf/files.i386
==============================================================================
--- projects/pseries/conf/files.i386 Fri Jun 24 13:58:56 2011 (r223502)
+++ projects/pseries/conf/files.i386 Fri Jun 24 14:03:10 2011 (r223503)
@@ -352,7 +352,6 @@ i386/linux/linux_support.s optional comp
dependency "linux_assym.h"
i386/linux/linux_sysent.c optional compat_linux
i386/linux/linux_sysvec.c optional compat_linux
-i386/pci/pci_bus.c optional pci
i386/pci/pci_cfgreg.c optional pci
i386/pci/pci_pir.c optional pci
i386/svr4/svr4_locore.s optional compat_svr4 \
@@ -405,7 +404,8 @@ x86/isa/isa.c optional isa
x86/isa/isa_dma.c optional isa
x86/isa/nmi.c standard
x86/isa/orm.c optional isa
-x86/pci/qpi.c standard
+x86/pci/pci_bus.c optional pci
+x86/pci/qpi.c optional pci
x86/x86/busdma_machdep.c standard
x86/x86/dump_machdep.c standard
x86/x86/io_apic.c optional apic
Modified: projects/pseries/conf/files.pc98
==============================================================================
--- projects/pseries/conf/files.pc98 Fri Jun 24 13:58:56 2011 (r223502)
+++ projects/pseries/conf/files.pc98 Fri Jun 24 14:03:10 2011 (r223503)
@@ -199,7 +199,6 @@ i386/linux/linux_support.s optional comp
dependency "linux_assym.h"
i386/linux/linux_sysent.c optional compat_linux
i386/linux/linux_sysvec.c optional compat_linux
-i386/pci/pci_bus.c optional pci
i386/pci/pci_cfgreg.c optional pci
i386/pci/pci_pir.c optional pci
i386/svr4/svr4_locore.s optional compat_svr4 \
@@ -249,6 +248,7 @@ pc98/pc98/pc98_machdep.c standard
x86/isa/atpic.c optional atpic
x86/isa/clock.c standard
x86/isa/isa.c optional isa
+x86/pci/pci_bus.c optional pci
x86/x86/busdma_machdep.c standard
x86/x86/dump_machdep.c standard
x86/x86/io_apic.c optional apic
Modified: projects/pseries/conf/files.powerpc
==============================================================================
--- projects/pseries/conf/files.powerpc Fri Jun 24 13:58:56 2011 (r223502)
+++ projects/pseries/conf/files.powerpc Fri Jun 24 14:03:10 2011 (r223503)
@@ -203,11 +203,13 @@ powerpc/powerpc/syncicache.c standard
powerpc/powerpc/sys_machdep.c standard
powerpc/powerpc/uio_machdep.c standard
powerpc/ps3/ehci_ps3.c optional ps3 ehci
+powerpc/ps3/ohci_ps3.c optional ps3 ohci
powerpc/ps3/if_glc.c optional ps3 glc
powerpc/ps3/mmu_ps3.c optional ps3
powerpc/ps3/platform_ps3.c optional ps3
powerpc/ps3/ps3ata.c optional ps3 ps3ata
powerpc/ps3/ps3bus.c optional ps3
+powerpc/ps3/ps3disk.c optional ps3
powerpc/ps3/ps3pic.c optional ps3
powerpc/ps3/ps3_syscons.c optional ps3 sc
powerpc/ps3/ps3-hvcall.S optional ps3 sc
Modified: projects/pseries/dev/acpica/acpi.c
==============================================================================
--- projects/pseries/dev/acpica/acpi.c Fri Jun 24 13:58:56 2011 (r223502)
+++ projects/pseries/dev/acpica/acpi.c Fri Jun 24 14:03:10 2011 (r223503)
@@ -151,6 +151,7 @@ static ACPI_STATUS acpi_sleep_disable(st
static ACPI_STATUS acpi_EnterSleepState(struct acpi_softc *sc, int state);
static void acpi_shutdown_final(void *arg, int howto);
static void acpi_enable_fixed_events(struct acpi_softc *sc);
+static BOOLEAN acpi_has_hid(ACPI_HANDLE handle);
static int acpi_wake_sleep_prep(ACPI_HANDLE handle, int sstate);
static int acpi_wake_run_prep(ACPI_HANDLE handle, int sstate);
static int acpi_wake_prep_walk(int sstate);
@@ -1855,6 +1856,13 @@ acpi_probe_child(ACPI_HANDLE handle, UIN
break;
if (acpi_parse_prw(handle, &prw) == 0)
AcpiSetupGpeForWake(handle, prw.gpe_handle, prw.gpe_bit);
+
+ /*
+ * Ignore devices that do not have a _HID or _CID. They should
+ * be discovered by other buses (e.g. the PCI bus driver).
+ */
+ if (!acpi_has_hid(handle))
+ break;
/* FALLTHROUGH */
case ACPI_TYPE_PROCESSOR:
case ACPI_TYPE_THERMAL:
@@ -2043,6 +2051,30 @@ acpi_BatteryIsPresent(device_t dev)
}
/*
+ * Returns true if a device has at least one valid device ID.
+ */
+static BOOLEAN
+acpi_has_hid(ACPI_HANDLE h)
+{
+ ACPI_DEVICE_INFO *devinfo;
+ BOOLEAN ret;
+
+ if (h == NULL ||
+ ACPI_FAILURE(AcpiGetObjectInfo(h, &devinfo)))
+ return (FALSE);
+
+ ret = FALSE;
+ if ((devinfo->Valid & ACPI_VALID_HID) != 0)
+ ret = TRUE;
+ else if ((devinfo->Valid & ACPI_VALID_CID) != 0)
+ if (devinfo->CompatibleIdList.Count > 0)
+ ret = TRUE;
+
+ AcpiOsFree(devinfo);
+ return (ret);
+}
+
+/*
* Match a HID string against a handle
*/
BOOLEAN
Modified: projects/pseries/dev/acpica/acpi_cpu.c
==============================================================================
--- projects/pseries/dev/acpica/acpi_cpu.c Fri Jun 24 13:58:56 2011 (r223502)
+++ projects/pseries/dev/acpica/acpi_cpu.c Fri Jun 24 14:03:10 2011 (r223503)
@@ -856,6 +856,10 @@ acpi_cpu_cx_list(struct acpi_cpu_softc *
sbuf_printf(&sb, "C%d/%d ", i + 1, sc->cpu_cx_states[i].trans_lat);
if (sc->cpu_cx_states[i].type < ACPI_STATE_C3)
sc->cpu_non_c3 = i;
+#ifndef __ia64__
+ else
+ cpu_can_deep_sleep = 1;
+#endif
}
sbuf_trim(&sb);
sbuf_finish(&sb);
Modified: projects/pseries/dev/acpica/acpi_pci.c
==============================================================================
--- projects/pseries/dev/acpica/acpi_pci.c Fri Jun 24 13:58:56 2011 (r223502)
+++ projects/pseries/dev/acpica/acpi_pci.c Fri Jun 24 14:03:10 2011 (r223503)
@@ -209,38 +209,24 @@ acpi_pci_update_device(ACPI_HANDLE handl
device_t child;
/*
- * Lookup and remove the unused device that acpi0 creates when it walks
- * the namespace creating devices.
+ * Occasionally a PCI device may show up as an ACPI device
+ * with a _HID. (For example, the TabletPC TC1000 has a
+ * second PCI-ISA bridge that has a _HID for an
+ * acpi_sysresource device.) In that case, leave ACPI-CA's
+ * device data pointing at the ACPI-enumerated device.
*/
child = acpi_get_device(handle);
if (child != NULL) {
- if (device_is_alive(child)) {
- /*
- * The TabletPC TC1000 has a second PCI-ISA bridge
- * that has a _HID for an acpi_sysresource device.
- * In that case, leave ACPI-CA's device data pointing
- * at the ACPI-enumerated device.
- */
- device_printf(child,
- "Conflicts with PCI device %d:%d:%d\n",
- pci_get_bus(pci_child), pci_get_slot(pci_child),
- pci_get_function(pci_child));
- return;
- }
KASSERT(device_get_parent(child) ==
devclass_get_device(devclass_find("acpi"), 0),
("%s: child (%s)'s parent is not acpi0", __func__,
acpi_name(handle)));
- device_delete_child(device_get_parent(child), child);
+ return;
}
/*
* Update ACPI-CA to use the PCI enumerated device_t for this handle.
*/
- status = AcpiDetachData(handle, acpi_fake_objhandler);
- if (ACPI_FAILURE(status))
- printf("WARNING: Unable to detach object data from %s - %s\n",
- acpi_name(handle), AcpiFormatException(status));
status = AcpiAttachData(handle, acpi_fake_objhandler, pci_child);
if (ACPI_FAILURE(status))
printf("WARNING: Unable to attach object data to %s - %s\n",
Modified: projects/pseries/dev/acpica/acpi_pcib_acpi.c
==============================================================================
--- projects/pseries/dev/acpica/acpi_pcib_acpi.c Fri Jun 24 13:58:56 2011 (r223502)
+++ projects/pseries/dev/acpica/acpi_pcib_acpi.c Fri Jun 24 14:03:10 2011 (r223503)
@@ -357,32 +357,14 @@ acpi_pcib_map_msi(device_t pcib, device_
return (PCIB_MAP_MSI(device_get_parent(bus), dev, irq, addr, data));
}
-static u_long acpi_host_mem_start = 0x80000000;
-TUNABLE_ULONG("hw.acpi.host_mem_start", &acpi_host_mem_start);
-
struct resource *
acpi_pcib_acpi_alloc_resource(device_t dev, device_t child, int type, int *rid,
u_long start, u_long end, u_long count, u_int flags)
{
- /*
- * If no memory preference is given, use upper 32MB slot most
- * bioses use for their memory window. Typically other bridges
- * before us get in the way to assert their preferences on memory.
- * Hardcoding like this sucks, so a more MD/MI way needs to be
- * found to do it. This is typically only used on older laptops
- * that don't have pci busses behind pci bridge, so assuming > 32MB
- * is likely OK.
- *
- * PCI-PCI bridges may allocate smaller ranges for their windows,
- * but the heuristics here should apply to those, so we allow
- * several different end addresses.
- */
- if (type == SYS_RES_MEMORY && start == 0UL && (end == ~0UL ||
- end == 0xffffffff))
- start = acpi_host_mem_start;
- if (type == SYS_RES_IOPORT && start == 0UL && (end == ~0UL ||
- end == 0xffff || end == 0xffffffff))
- start = 0x1000;
+
+#if defined(__i386__) || defined(__amd64__)
+ start = hostb_alloc_start(type, start, end, count);
+#endif
return (bus_generic_alloc_resource(dev, child, type, rid, start, end,
count, flags));
}
Modified: projects/pseries/dev/acpica/acpi_resource.c
==============================================================================
--- projects/pseries/dev/acpica/acpi_resource.c Fri Jun 24 13:58:56 2011 (r223502)
+++ projects/pseries/dev/acpica/acpi_resource.c Fri Jun 24 14:03:10 2011 (r223503)
@@ -32,6 +32,7 @@ __FBSDID("$FreeBSD$");
#include <sys/param.h>
#include <sys/kernel.h>
#include <sys/bus.h>
+#include <sys/limits.h>
#include <sys/malloc.h>
#include <sys/module.h>
@@ -139,6 +140,249 @@ acpi_config_intr(device_t dev, ACPI_RESO
INTR_POLARITY_HIGH : INTR_POLARITY_LOW);
}
+struct acpi_resource_context {
+ struct acpi_parse_resource_set *set;
+ device_t dev;
+ void *context;
+};
+
+#ifdef ACPI_DEBUG_OUTPUT
+static const char *
+acpi_address_range_name(UINT8 ResourceType)
+{
+ static char buf[16];
+
+ switch (ResourceType) {
+ case ACPI_MEMORY_RANGE:
+ return ("Memory");
+ case ACPI_IO_RANGE:
+ return ("IO");
+ case ACPI_BUS_NUMBER_RANGE:
+ return ("Bus Number");
+ default:
+ snprintf(buf, sizeof(buf), "type %u", ResourceType);
+ return (buf);
+ }
+}
+#endif
+
+static ACPI_STATUS
+acpi_parse_resource(ACPI_RESOURCE *res, void *context)
+{
+ struct acpi_parse_resource_set *set;
+ struct acpi_resource_context *arc;
+ UINT64 min, max, length, gran;
+ const char *name;
+ device_t dev;
+
+ arc = context;
+ dev = arc->dev;
+ set = arc->set;
+
+ switch (res->Type) {
+ case ACPI_RESOURCE_TYPE_END_TAG:
+ ACPI_DEBUG_PRINT((ACPI_DB_RESOURCES, "EndTag\n"));
+ break;
+ case ACPI_RESOURCE_TYPE_FIXED_IO:
+ if (res->Data.FixedIo.AddressLength <= 0)
+ break;
+ ACPI_DEBUG_PRINT((ACPI_DB_RESOURCES, "FixedIo 0x%x/%d\n",
+ res->Data.FixedIo.Address, res->Data.FixedIo.AddressLength));
+ set->set_ioport(dev, arc->context, res->Data.FixedIo.Address,
+ res->Data.FixedIo.AddressLength);
+ break;
+ case ACPI_RESOURCE_TYPE_IO:
+ if (res->Data.Io.AddressLength <= 0)
+ break;
+ if (res->Data.Io.Minimum == res->Data.Io.Maximum) {
+ ACPI_DEBUG_PRINT((ACPI_DB_RESOURCES, "Io 0x%x/%d\n",
+ res->Data.Io.Minimum, res->Data.Io.AddressLength));
+ set->set_ioport(dev, arc->context, res->Data.Io.Minimum,
+ res->Data.Io.AddressLength);
+ } else {
+ ACPI_DEBUG_PRINT((ACPI_DB_RESOURCES, "Io 0x%x-0x%x/%d\n",
+ res->Data.Io.Minimum, res->Data.Io.Maximum,
+ res->Data.Io.AddressLength));
+ set->set_iorange(dev, arc->context, res->Data.Io.Minimum,
+ res->Data.Io.Maximum, res->Data.Io.AddressLength,
+ res->Data.Io.Alignment);
+ }
+ break;
+ case ACPI_RESOURCE_TYPE_FIXED_MEMORY32:
+ if (res->Data.FixedMemory32.AddressLength <= 0)
+ break;
+ ACPI_DEBUG_PRINT((ACPI_DB_RESOURCES, "FixedMemory32 0x%x/%d\n",
+ res->Data.FixedMemory32.Address,
+ res->Data.FixedMemory32.AddressLength));
+ set->set_memory(dev, arc->context, res->Data.FixedMemory32.Address,
+ res->Data.FixedMemory32.AddressLength);
+ break;
+ case ACPI_RESOURCE_TYPE_MEMORY32:
+ if (res->Data.Memory32.AddressLength <= 0)
+ break;
+ if (res->Data.Memory32.Minimum == res->Data.Memory32.Maximum) {
+ ACPI_DEBUG_PRINT((ACPI_DB_RESOURCES, "Memory32 0x%x/%d\n",
+ res->Data.Memory32.Minimum, res->Data.Memory32.AddressLength));
+ set->set_memory(dev, arc->context, res->Data.Memory32.Minimum,
+ res->Data.Memory32.AddressLength);
+ } else {
+ ACPI_DEBUG_PRINT((ACPI_DB_RESOURCES, "Memory32 0x%x-0x%x/%d\n",
+ res->Data.Memory32.Minimum, res->Data.Memory32.Maximum,
+ res->Data.Memory32.AddressLength));
+ set->set_memoryrange(dev, arc->context, res->Data.Memory32.Minimum,
+ res->Data.Memory32.Maximum, res->Data.Memory32.AddressLength,
+ res->Data.Memory32.Alignment);
+ }
*** DIFF OUTPUT TRUNCATED AT 1000 LINES ***
More information about the svn-src-projects
mailing list