Date: Thu, 14 Jun 2012 17:54:52 +0000 (UTC) From: Alan Cox <alc@FreeBSD.org> To: src-committers@freebsd.org, svn-src-user@freebsd.org Subject: svn commit: r237087 - in user/alc/superpages: lib/libc/gen libexec/rtld-elf sys/amd64/amd64 sys/arm/include sys/dev/usb sys/dev/usb/quirk sys/geom/part sys/kern sys/sys Message-ID: <201206141754.q5EHsqAa009752@svn.freebsd.org>
next in thread | raw e-mail | index | archive | help
Author: alc Date: Thu Jun 14 17:54:52 2012 New Revision: 237087 URL: http://svn.freebsd.org/changeset/base/237087 Log: MFC r237086 Loop back fixes to comments and a KASSERT(). Added: user/alc/superpages/sys/arm/include/atags.h - copied unchanged from r237086, head/sys/arm/include/atags.h Modified: user/alc/superpages/lib/libc/gen/fstab.c user/alc/superpages/libexec/rtld-elf/map_object.c user/alc/superpages/sys/amd64/amd64/pmap.c user/alc/superpages/sys/dev/usb/quirk/usb_quirk.c user/alc/superpages/sys/dev/usb/usbdevs user/alc/superpages/sys/geom/part/g_part_gpt.c user/alc/superpages/sys/kern/kern_descrip.c user/alc/superpages/sys/kern/kern_event.c user/alc/superpages/sys/sys/filedesc.h Directory Properties: user/alc/superpages/ (props changed) user/alc/superpages/lib/libc/ (props changed) user/alc/superpages/sys/ (props changed) Modified: user/alc/superpages/lib/libc/gen/fstab.c ============================================================================== --- user/alc/superpages/lib/libc/gen/fstab.c Thu Jun 14 17:47:54 2012 (r237086) +++ user/alc/superpages/lib/libc/gen/fstab.c Thu Jun 14 17:54:52 2012 (r237087) @@ -39,6 +39,7 @@ __FBSDID("$FreeBSD$"); #include <sys/stat.h> #include <errno.h> +#include <fcntl.h> #include <fstab.h> #include <paths.h> #include <stdio.h> @@ -246,6 +247,8 @@ getfsfile(name) int setfsent() { + int fd; + if (_fs_fp) { rewind(_fs_fp); LineNo = 0; @@ -257,11 +260,18 @@ setfsent() else setfstab(getenv("PATH_FSTAB")); } - if ((_fs_fp = fopen(path_fstab, "r")) != NULL) { + fd = _open(path_fstab, O_RDONLY | O_CLOEXEC); + if (fd == -1) { + error(errno); + return (0); + } + _fs_fp = fdopen(fd, "r"); + if (_fs_fp != NULL) { LineNo = 0; return(1); } error(errno); + _close(fd); return(0); } Modified: user/alc/superpages/libexec/rtld-elf/map_object.c ============================================================================== --- user/alc/superpages/libexec/rtld-elf/map_object.c Thu Jun 14 17:47:54 2012 (r237086) +++ user/alc/superpages/libexec/rtld-elf/map_object.c Thu Jun 14 17:54:52 2012 (r237087) @@ -38,7 +38,7 @@ #include "debug.h" #include "rtld.h" -static Elf_Ehdr *get_elf_header (int, const char *); +static Elf_Ehdr *get_elf_header(int, const char *); static int convert_prot(int); /* Elf flags -> mmap protection */ static int convert_flags(int); /* Elf flags -> mmap flags */ @@ -121,7 +121,7 @@ map_object(int fd, const char *path, con if ((segs[nsegs]->p_align & (PAGE_SIZE - 1)) != 0) { _rtld_error("%s: PT_LOAD segment %d not page-aligned", path, nsegs); - return NULL; + goto error; } break; @@ -161,12 +161,12 @@ map_object(int fd, const char *path, con } if (phdyn == NULL) { _rtld_error("%s: object is not dynamically-linked", path); - return NULL; + goto error; } if (nsegs < 0) { _rtld_error("%s: too few PT_LOAD segments", path); - return NULL; + goto error; } /* @@ -183,13 +183,12 @@ map_object(int fd, const char *path, con if (mapbase == (caddr_t) -1) { _rtld_error("%s: mmap of entire address space failed: %s", path, rtld_strerror(errno)); - return NULL; + goto error; } if (base_addr != NULL && mapbase != base_addr) { _rtld_error("%s: mmap returned wrong address: wanted %p, got %p", path, base_addr, mapbase); - munmap(mapbase, mapsize); - return NULL; + goto error1; } for (i = 0; i <= nsegs; i++) { @@ -201,10 +200,10 @@ map_object(int fd, const char *path, con data_prot = convert_prot(segs[i]->p_flags); data_flags = convert_flags(segs[i]->p_flags) | MAP_FIXED; if (mmap(data_addr, data_vlimit - data_vaddr, data_prot, - data_flags, fd, data_offset) == (caddr_t) -1) { + data_flags | MAP_PREFAULT_READ, fd, data_offset) == (caddr_t) -1) { _rtld_error("%s: mmap of data failed: %s", path, rtld_strerror(errno)); - return NULL; + goto error1; } /* Do BSS setup */ @@ -221,7 +220,7 @@ map_object(int fd, const char *path, con mprotect(clear_page, PAGE_SIZE, data_prot|PROT_WRITE)) { _rtld_error("%s: mprotect failed: %s", path, rtld_strerror(errno)); - return NULL; + goto error1; } memset(clear_addr, 0, nclear); @@ -240,7 +239,7 @@ map_object(int fd, const char *path, con data_flags | MAP_ANON, -1, 0) == (caddr_t)-1) { _rtld_error("%s: mmap of bss failed: %s", path, rtld_strerror(errno)); - return NULL; + goto error1; } } } @@ -273,7 +272,7 @@ map_object(int fd, const char *path, con if (obj->phdr == NULL) { obj_free(obj); _rtld_error("%s: cannot allocate program header", path); - return NULL; + goto error1; } memcpy((char *)obj->phdr, (char *)hdr + hdr->e_phoff, phsize); obj->phdr_alloc = true; @@ -293,63 +292,72 @@ map_object(int fd, const char *path, con obj->relro_page = obj->relocbase + trunc_page(relro_page); obj->relro_size = round_page(relro_size); - return obj; + munmap(hdr, PAGE_SIZE); + return (obj); + +error1: + munmap(mapbase, mapsize); +error: + munmap(hdr, PAGE_SIZE); + return (NULL); } static Elf_Ehdr * -get_elf_header (int fd, const char *path) +get_elf_header(int fd, const char *path) { - static union { - Elf_Ehdr hdr; - char buf[PAGE_SIZE]; - } u; - ssize_t nbytes; - - if ((nbytes = pread(fd, u.buf, PAGE_SIZE, 0)) == -1) { - _rtld_error("%s: read error: %s", path, rtld_strerror(errno)); - return NULL; - } - - /* Make sure the file is valid */ - if (nbytes < (ssize_t)sizeof(Elf_Ehdr) || !IS_ELF(u.hdr)) { - _rtld_error("%s: invalid file format", path); - return NULL; - } - if (u.hdr.e_ident[EI_CLASS] != ELF_TARG_CLASS - || u.hdr.e_ident[EI_DATA] != ELF_TARG_DATA) { - _rtld_error("%s: unsupported file layout", path); - return NULL; - } - if (u.hdr.e_ident[EI_VERSION] != EV_CURRENT - || u.hdr.e_version != EV_CURRENT) { - _rtld_error("%s: unsupported file version", path); - return NULL; - } - if (u.hdr.e_type != ET_EXEC && u.hdr.e_type != ET_DYN) { - _rtld_error("%s: unsupported file type", path); - return NULL; - } - if (u.hdr.e_machine != ELF_TARG_MACH) { - _rtld_error("%s: unsupported machine", path); - return NULL; - } + Elf_Ehdr *hdr; - /* - * We rely on the program header being in the first page. This is - * not strictly required by the ABI specification, but it seems to - * always true in practice. And, it simplifies things considerably. - */ - if (u.hdr.e_phentsize != sizeof(Elf_Phdr)) { - _rtld_error( - "%s: invalid shared object: e_phentsize != sizeof(Elf_Phdr)", path); - return NULL; - } - if (u.hdr.e_phoff + u.hdr.e_phnum * sizeof(Elf_Phdr) > (size_t)nbytes) { - _rtld_error("%s: program header too large", path); - return NULL; - } + hdr = mmap(NULL, PAGE_SIZE, PROT_READ, MAP_PRIVATE | MAP_PREFAULT_READ, + fd, 0); + if (hdr == (Elf_Ehdr *)MAP_FAILED) { + _rtld_error("%s: read error: %s", path, rtld_strerror(errno)); + return (NULL); + } + + /* Make sure the file is valid */ + if (!IS_ELF(*hdr)) { + _rtld_error("%s: invalid file format", path); + goto error; + } + if (hdr->e_ident[EI_CLASS] != ELF_TARG_CLASS || + hdr->e_ident[EI_DATA] != ELF_TARG_DATA) { + _rtld_error("%s: unsupported file layout", path); + goto error; + } + if (hdr->e_ident[EI_VERSION] != EV_CURRENT || + hdr->e_version != EV_CURRENT) { + _rtld_error("%s: unsupported file version", path); + goto error; + } + if (hdr->e_type != ET_EXEC && hdr->e_type != ET_DYN) { + _rtld_error("%s: unsupported file type", path); + goto error; + } + if (hdr->e_machine != ELF_TARG_MACH) { + _rtld_error("%s: unsupported machine", path); + goto error; + } - return (&u.hdr); + /* + * We rely on the program header being in the first page. This is + * not strictly required by the ABI specification, but it seems to + * always true in practice. And, it simplifies things considerably. + */ + if (hdr->e_phentsize != sizeof(Elf_Phdr)) { + _rtld_error( + "%s: invalid shared object: e_phentsize != sizeof(Elf_Phdr)", path); + goto error; + } + if (hdr->e_phoff + hdr->e_phnum * sizeof(Elf_Phdr) > + (size_t)PAGE_SIZE) { + _rtld_error("%s: program header too large", path); + goto error; + } + return (hdr); + +error: + munmap(hdr, PAGE_SIZE); + return (NULL); } void Modified: user/alc/superpages/sys/amd64/amd64/pmap.c ============================================================================== --- user/alc/superpages/sys/amd64/amd64/pmap.c Thu Jun 14 17:47:54 2012 (r237086) +++ user/alc/superpages/sys/amd64/amd64/pmap.c Thu Jun 14 17:54:52 2012 (r237087) @@ -2587,7 +2587,7 @@ pmap_demote_pde(pmap_t pmap, pd_entry_t /* * Demote the pv entry. This depends on the earlier demotion * of the mapping. Specifically, the (re)creation of a per- - * page pv entry might trigger the execution of pmap_collect(), + * page pv entry might trigger the execution of pmap_pv_reclaim(), * which might reclaim a newly (re)created per-page pv entry * and destroy the associated mapping. In order to destroy * the mapping, the PDE must have already changed from mapping @@ -4450,8 +4450,9 @@ small_mappings: pmap = PV_PMAP(pv); PMAP_LOCK(pmap); pde = pmap_pde(pmap, pv->pv_va); - KASSERT((*pde & PG_PS) == 0, ("pmap_clear_write: found" - " a 2mpage in page %p's pv list", m)); + KASSERT((*pde & PG_PS) == 0, + ("pmap_remove_write: found a 2mpage in page %p's pv list", + m)); pte = pmap_pde_to_pte(pde, pv->pv_va); retry: oldpte = *pte; Copied: user/alc/superpages/sys/arm/include/atags.h (from r237086, head/sys/arm/include/atags.h) ============================================================================== --- /dev/null 00:00:00 1970 (empty, because file is newly added) +++ user/alc/superpages/sys/arm/include/atags.h Thu Jun 14 17:54:52 2012 (r237087, copy of r237086, head/sys/arm/include/atags.h) @@ -0,0 +1,129 @@ +/*- + * Copyright (c) 2012 M. Warner Losh. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * $FreeBSD$ + */ + +#ifndef __MACHINE_ATAGS_H__ +#define __MACHINE_ATAGS_H__ + +/* + * Linux boot ABI compatable ATAG definitions. All these structures + * assume tight packing, but since they are all uint32_t's, I've not + * bothered to do the usual alignment dance. + */ + +#define LBABI_MAX_COMMAND_LINE 1024 + +struct arm_lbabi_header +{ + uint32_t size; /* Size of this node, including header */ + uint32_t tag; /* Node type */ +}; + +#define ATAG_NONE 0x00000000 /* End of atags list */ +#define ATAG_CORE 0x54410001 /* List must start with ATAG_CORE */ +#define ATAG_MEM 0x54410002 /* Multiple ATAG_MEM nodes possible */ +#define ATAG_VIDEOTEXT 0x54410003 /* Video parameters */ +#define ATAG_RAMDISK 0x54410004 /* Describes the ramdisk parameters */ +#define ATAG_INITRD 0x54410005 /* Deprecated ramdisk -- used va not pa */ +#define ATAG_INITRD2 0x54420005 /* compressed ramdisk image */ +#define ATAG_SERIAL 0x54410006 /* 64-bits of serial number */ +#define ATAG_REVISION 0x54410007 /* Board revision */ +#define ATAG_VIDEOLFB 0x54410008 /* vesafb framebuffer */ +#define ATAG_CMDLINE 0x54410009 /* Command line */ + +/* + * ATAG_CORE data + */ +struct arm_lbabi_core +{ + uint32_t flags; /* bit 0 == read-only */ + uint32_t pagesize; + uint32_t rootdev; +}; + +/* + * ATAG_MEM data -- Can be more than one to describe different + * banks. + */ +struct arm_lbabi_mem32 +{ + uint32_t size; + uint32_t start; /* start of physical memory */ +}; + +/* + * ATAG_INITRD2 - Compressed ramdisk image details + */ +struct arm_lbabi_initrd +{ + uint32_t start; /* pa of start */ + uint32_t size; /* How big the ram disk is */ +}; + +/* + * ATAG_SERIAL - serial number + */ +struct arm_lbabi_serial_number +{ + uint32_t low; + uint32_t high; +}; + +/* + * ATAG_REVISION - board revision + */ +struct arm_lbabi_revision +{ + uint32_t rev; +}; + +/* + * ATAG_CMDLINE - Command line from uboot + */ +struct arm_lbabi_command_line +{ + char command[1]; /* Minimum command length */ +}; + +struct arm_lbabi_tag +{ + struct arm_lbabi_header tag_hdr; + union { + struct arm_lbabi_core tag_core; + struct arm_lbabi_mem32 tag_mem; + struct arm_lbabi_initrd tag_initrd; + struct arm_lbabi_serial_number tag_sn; + struct arm_lbabi_revision tag_rev; + struct arm_lbabi_command_line tag_cmd; + } u; +}; + +#define ATAG_TAG(a) (a)->tag_hdr.tag +#define ATAG_SIZE(a) (a)->tag_hdr.size +#define ATAG_NEXT(a) (struct arm_lbabi_tag *)((char *)(a) + ATAG_SIZE(a)) + +#endif /* __MACHINE_ATAGS_H__ */ Modified: user/alc/superpages/sys/dev/usb/quirk/usb_quirk.c ============================================================================== --- user/alc/superpages/sys/dev/usb/quirk/usb_quirk.c Thu Jun 14 17:47:54 2012 (r237086) +++ user/alc/superpages/sys/dev/usb/quirk/usb_quirk.c Thu Jun 14 17:54:52 2012 (r237087) @@ -454,7 +454,13 @@ static struct usb_quirk_entry usb_quirks USB_QUIRK(ROLAND, SD20, 0x0000, 0xffff, UQ_AU_VENDOR_CLASS), USB_QUIRK(ROLAND, SD80, 0x0000, 0xffff, UQ_AU_VENDOR_CLASS), USB_QUIRK(ROLAND, UA700, 0x0000, 0xffff, UQ_AU_VENDOR_CLASS), + USB_QUIRK(EGO, M4U, 0x0000, 0xffff, UQ_SINGLE_CMD_MIDI), + USB_QUIRK(LOGILINK, U2M, 0x0000, 0xffff, UQ_SINGLE_CMD_MIDI), USB_QUIRK(MEDELI, DD305, 0x0000, 0xffff, UQ_SINGLE_CMD_MIDI, UQ_MATCH_VENDOR_ONLY), + USB_QUIRK(REDOCTANE, GHMIDI, 0x0000, 0xffff, UQ_SINGLE_CMD_MIDI), + USB_QUIRK(TEXTECH, U2M_1, 0x0000, 0xffff, UQ_SINGLE_CMD_MIDI), + USB_QUIRK(TEXTECH, U2M_2, 0x0000, 0xffff, UQ_SINGLE_CMD_MIDI), + USB_QUIRK(WCH2, U2M, 0x0000, 0xffff, UQ_SINGLE_CMD_MIDI), /* * Quirks for manufacturers which USB devices does not respond Modified: user/alc/superpages/sys/dev/usb/usbdevs ============================================================================== --- user/alc/superpages/sys/dev/usb/usbdevs Thu Jun 14 17:47:54 2012 (r237086) +++ user/alc/superpages/sys/dev/usb/usbdevs Thu Jun 14 17:54:52 2012 (r237087) @@ -487,6 +487,7 @@ vendor BROADCOM 0x0a5c Broadcom vendor GREENHOUSE 0x0a6b GREENHOUSE vendor MEDELI 0x0a67 Medeli vendor GEOCAST 0x0a79 Geocast Network Systems +vendor EGO 0x0a92 EGO systems vendor IDQUANTIQUE 0x0aba id Quantique vendor ZYDAS 0x0ace Zydas Technology Corporation vendor NEODIO 0x0aec Neodio @@ -611,6 +612,7 @@ vendor INITIO 0x13fd Initio Corporation vendor EMTEC 0x13fe Emtec vendor NOVATEL 0x1410 Novatel Wireless vendor MERLIN 0x1416 Merlin +vendor REDOCTANE 0x1430 RedOctane vendor WISTRONNEWEB 0x1435 Wistron NeWeb vendor RADIOSHACK 0x1453 Radio Shack vendor HUAWEI3COM 0x1472 Huawei-3Com @@ -633,6 +635,7 @@ vendor FIBERLINE 0x1582 Fiberline vendor SPARKLAN 0x15a9 SparkLAN vendor SOUNDGRAPH 0x15c2 Soundgraph, Inc. vendor AMIT2 0x15c5 AMIT +vendor TEXTECH 0x15ca Textech International Ltd. vendor SOHOWARE 0x15e8 SOHOware vendor UMAX 0x1606 UMAX Data Systems vendor INSIDEOUT 0x1608 Inside Out Networks @@ -723,6 +726,7 @@ vendor MARVELL 0x9e88 Marvell Technolog vendor 3COM3 0xa727 3Com vendor DATAAPEX 0xdaae DataApex vendor HP2 0xf003 Hewlett Packard +vendor LOGILINK 0xfc08 LogiLink vendor USRP 0xfffe GNU Radio USRP /* @@ -1472,6 +1476,10 @@ product EGALAX TPANEL 0x0001 Touch Pane product EGALAX TPANEL2 0x0002 Touch Panel product EGALAX2 TPANEL 0x0001 Touch Panel +/* EGO Products */ +product EGO DUMMY 0x0000 Dummy Product +product EGO M4U 0x1020 ESI M4U + /* Eicon Networks */ product EICON DIVA852 0x4905 Diva 852 ISDN TA @@ -2090,6 +2098,10 @@ product LINKSYS4 WUSB54GCV3 0x0077 WUSB5 product LINKSYS4 RT3070 0x0078 RT3070 product LINKSYS4 WUSB600NV2 0x0079 WUSB600N v2 +/* Logilink products */ +product LOGILINK DUMMY 0x0000 Dummy product +product LOGILINK U2M 0x0101 LogiLink USB MIDI Cable + /* Logitech products */ product LOGITECH M2452 0x0203 M2452 keyboard product LOGITECH M4848 0x0301 M4848 mouse @@ -2813,6 +2825,10 @@ product REALTEK RTL8187B_0 0x8189 RTL818 product REALTEK RTL8187B_1 0x8197 RTL8187B Wireless Adapter product REALTEK RTL8187B_2 0x8198 RTL8187B Wireless Adapter +/* RedOctane products */ +product REDOCTANE DUMMY 0x0000 Dummy product +product REDOCTANE GHMIDI 0x474b GH MIDI INTERFACE + /* Renesas products */ product RENESAS RX610 0x0053 RX610 RX-Stick @@ -3249,6 +3265,11 @@ product SYNTECH CYPHERLAB100 0x1000 Ciph /* Teclast products */ product TECLAST TLC300 0x3203 USB Media Player +/* TexTech products */ +product TEXTECH DUMMY 0x0000 Dummy product +product TEXTECH U2M_1 0x0101 Textech USB MIDI cable +product TEXTECH U2M_2 0x1806 Textech USB MIDI cable + /* Supra products */ product DIAMOND2 SUPRAEXPRESS56K 0x07da Supra Express 56K modem product DIAMOND2 SUPRA2890 0x0b4a SupraMax 2890 56K Modem @@ -3421,7 +3442,9 @@ product WAVESENSE JAZZ 0xaaaa Jazz bloo /* WCH products */ product WCH CH341SER 0x5523 CH341/CH340 USB-Serial Bridge +product WCH2 DUMMY 0x0000 Dummy product product WCH2 CH341SER 0x7523 CH341/CH340 USB-Serial Bridge +product WCH2 U2M 0X752d CH345 USB2.0-MIDI /* Western Digital products */ product WESTERN COMBO 0x0200 Firewire USB Combo Modified: user/alc/superpages/sys/geom/part/g_part_gpt.c ============================================================================== --- user/alc/superpages/sys/geom/part/g_part_gpt.c Thu Jun 14 17:47:54 2012 (r237086) +++ user/alc/superpages/sys/geom/part/g_part_gpt.c Thu Jun 14 17:54:52 2012 (r237087) @@ -341,9 +341,6 @@ gpt_update_bootcamp(struct g_part_table disable: table->bootcamp = 0; - bzero(table->mbr + DOSPARTOFF, DOSPARTSIZE * NDOSPART); - gpt_write_mbr_entry(table->mbr, 0, 0xee, 1ull, - MIN(table->lba[GPT_ELT_SECHDR], UINT32_MAX)); } static struct gpt_hdr * @@ -589,10 +586,6 @@ g_part_gpt_bootcode(struct g_part_table codesz = MIN(codesz, gpp->gpp_codesize); if (codesz > 0) bcopy(gpp->gpp_codeptr, table->mbr, codesz); - - /* Mark the PMBR active since some BIOS require it. */ - if (!table->bootcamp) - table->mbr[DOSPARTOFF] = 0x80; /* status */ return (0); } @@ -601,7 +594,6 @@ g_part_gpt_create(struct g_part_table *b { struct g_provider *pp; struct g_part_gpt_table *table; - quad_t last; size_t tblsz; /* We don't nest, which means that our depth should be 0. */ @@ -617,11 +609,6 @@ g_part_gpt_create(struct g_part_table *b pp->sectorsize) return (ENOSPC); - last = (pp->mediasize / pp->sectorsize) - 1; - - le16enc(table->mbr + DOSMAGICOFFSET, DOSMAGIC); - gpt_write_mbr_entry(table->mbr, 0, 0xee, 1, MIN(last, UINT32_MAX)); - /* Allocate space for the header */ table->hdr = g_malloc(sizeof(struct gpt_hdr), M_WAITOK | M_ZERO); @@ -1047,6 +1034,16 @@ g_part_gpt_write(struct g_part_table *ba if (table->bootcamp) gpt_update_bootcamp(basetable); + /* Update partition entries in the PMBR if Boot Camp disabled. */ + if (!table->bootcamp) { + bzero(table->mbr + DOSPARTOFF, DOSPARTSIZE * NDOSPART); + gpt_write_mbr_entry(table->mbr, 0, 0xee, 1, + MIN(pp->mediasize / pp->sectorsize - 1, UINT32_MAX)); + /* Mark the PMBR active since some BIOS require it. */ + table->mbr[DOSPARTOFF] = 0x80; + } + le16enc(table->mbr + DOSMAGICOFFSET, DOSMAGIC); + /* Write the PMBR */ buf = g_malloc(pp->sectorsize, M_WAITOK | M_ZERO); bcopy(table->mbr, buf, MBRSIZE); Modified: user/alc/superpages/sys/kern/kern_descrip.c ============================================================================== --- user/alc/superpages/sys/kern/kern_descrip.c Thu Jun 14 17:47:54 2012 (r237086) +++ user/alc/superpages/sys/kern/kern_descrip.c Thu Jun 14 17:54:52 2012 (r237087) @@ -102,7 +102,7 @@ __FBSDID("$FreeBSD$"); static MALLOC_DEFINE(M_FILEDESC, "filedesc", "Open file descriptor table"); static MALLOC_DEFINE(M_FILEDESC_TO_LEADER, "filedesc_to_leader", - "file desc to leader structures"); + "file desc to leader structures"); static MALLOC_DEFINE(M_SIGIO, "sigio", "sigio structures"); MALLOC_DECLARE(M_FADVISE); @@ -114,22 +114,21 @@ static uma_zone_t file_zone; #define DUP_FIXED 0x1 /* Force fixed allocation */ #define DUP_FCNTL 0x2 /* fcntl()-style errors */ -static int closefp(struct filedesc *fdp, int fd, struct file *fp, - struct thread *td); -static int do_dup(struct thread *td, int flags, int old, int new, +static int closefp(struct filedesc *fdp, int fd, struct file *fp, + struct thread *td, int holdleaders); +static int do_dup(struct thread *td, int flags, int old, int new, register_t *retval); -static int fd_first_free(struct filedesc *, int, int); -static int fd_last_used(struct filedesc *, int); -static void fdgrowtable(struct filedesc *, int); -static void fdunused(struct filedesc *fdp, int fd); -static void fdused(struct filedesc *fdp, int fd); -static int fill_vnode_info(struct vnode *vp, struct kinfo_file *kif); -static int fill_socket_info(struct socket *so, struct kinfo_file *kif); -static int fill_pts_info(struct tty *tp, struct kinfo_file *kif); -static int fill_pipe_info(struct pipe *pi, struct kinfo_file *kif); -static int fill_procdesc_info(struct procdesc *pdp, - struct kinfo_file *kif); -static int fill_shm_info(struct file *fp, struct kinfo_file *kif); +static int fd_first_free(struct filedesc *fdp, int low, int size); +static int fd_last_used(struct filedesc *fdp, int size); +static void fdgrowtable(struct filedesc *fdp, int nfd); +static void fdunused(struct filedesc *fdp, int fd); +static void fdused(struct filedesc *fdp, int fd); +static int fill_pipe_info(struct pipe *pi, struct kinfo_file *kif); +static int fill_procdesc_info(struct procdesc *pdp, struct kinfo_file *kif); +static int fill_pts_info(struct tty *tp, struct kinfo_file *kif); +static int fill_shm_info(struct file *fp, struct kinfo_file *kif); +static int fill_socket_info(struct socket *so, struct kinfo_file *kif); +static int fill_vnode_info(struct vnode *vp, struct kinfo_file *kif); /* * A process is initially started out with NDFILE descriptors stored within @@ -183,10 +182,10 @@ struct filedesc0 { */ volatile int openfiles; /* actual number of open files */ struct mtx sigio_lock; /* mtx to protect pointers to sigio */ -void (*mq_fdclose)(struct thread *td, int fd, struct file *fp); +void (*mq_fdclose)(struct thread *td, int fd, struct file *fp); /* A mutex to protect the association between a proc and filedesc. */ -static struct mtx fdesc_mtx; +static struct mtx fdesc_mtx; /* * If low >= size, just return low. Otherwise find the first zero bit in the @@ -243,8 +242,12 @@ fd_last_used(struct filedesc *fdp, int s static int fdisused(struct filedesc *fdp, int fd) { - KASSERT(fd >= 0 && fd < fdp->fd_nfiles, - ("file descriptor %d out of range (0, %d)", fd, fdp->fd_nfiles)); + + FILEDESC_LOCK_ASSERT(fdp); + + KASSERT(fd >= 0 && fd < fdp->fd_nfiles, + ("file descriptor %d out of range (0, %d)", fd, fdp->fd_nfiles)); + return ((fdp->fd_map[NDSLOT(fd)] & NDBIT(fd)) != 0); } @@ -256,8 +259,8 @@ fdused(struct filedesc *fdp, int fd) { FILEDESC_XLOCK_ASSERT(fdp); - KASSERT(!fdisused(fdp, fd), - ("fd already used")); + + KASSERT(!fdisused(fdp, fd), ("fd=%d is already used", fd)); fdp->fd_map[NDSLOT(fd)] |= NDBIT(fd); if (fd > fdp->fd_lastfile) @@ -274,10 +277,9 @@ fdunused(struct filedesc *fdp, int fd) { FILEDESC_XLOCK_ASSERT(fdp); - KASSERT(fdisused(fdp, fd), - ("fd is already unused")); - KASSERT(fdp->fd_ofiles[fd] == NULL, - ("fd is still in use")); + + KASSERT(fdisused(fdp, fd), ("fd=%d is already unused", fd)); + KASSERT(fdp->fd_ofiles[fd] == NULL, ("fd=%d is still in use", fd)); fdp->fd_map[NDSLOT(fd)] &= ~NDBIT(fd); if (fd < fdp->fd_freefile) @@ -427,23 +429,13 @@ sys_fcntl(struct thread *td, struct fcnt return (error); } -static inline struct file * -fdtofp(int fd, struct filedesc *fdp) -{ - - FILEDESC_LOCK_ASSERT(fdp); - - if (fd < 0 || fd >= fdp->fd_nfiles) - return (NULL); - - return (fdp->fd_ofiles[fd]); -} - static inline int fdunwrap(int fd, cap_rights_t rights, struct filedesc *fdp, struct file **fpp) { - *fpp = fdtofp(fd, fdp); + FILEDESC_LOCK_ASSERT(fdp); + + *fpp = fget_locked(fdp, fd); if (*fpp == NULL) return (EBADF); @@ -492,7 +484,7 @@ kern_fcntl(struct thread *td, int fd, in case F_GETFD: FILEDESC_SLOCK(fdp); - if ((fp = fdtofp(fd, fdp)) == NULL) { + if ((fp = fget_locked(fdp, fd)) == NULL) { FILEDESC_SUNLOCK(fdp); error = EBADF; break; @@ -504,7 +496,7 @@ kern_fcntl(struct thread *td, int fd, in case F_SETFD: FILEDESC_XLOCK(fdp); - if ((fp = fdtofp(fd, fdp)) == NULL) { + if ((fp = fget_locked(fdp, fd)) == NULL) { FILEDESC_XUNLOCK(fdp); error = EBADF; break; @@ -677,8 +669,7 @@ kern_fcntl(struct thread *td, int fd, in vfslocked = 0; /* Check for race with close */ FILEDESC_SLOCK(fdp); - if (fd < 0 || fd >= fdp->fd_nfiles || - fp != fdp->fd_ofiles[fd]) { + if (fget_locked(fdp, fd) != fp) { FILEDESC_SUNLOCK(fdp); flp->l_whence = SEEK_SET; flp->l_start = 0; @@ -686,7 +677,7 @@ kern_fcntl(struct thread *td, int fd, in flp->l_type = F_UNLCK; vfslocked = VFS_LOCK_GIANT(vp->v_mount); (void) VOP_ADVLOCK(vp, (caddr_t)p->p_leader, - F_UNLCK, flp, F_POSIX); + F_UNLCK, flp, F_POSIX); VFS_UNLOCK_GIANT(vfslocked); vfslocked = 0; } else @@ -743,7 +734,7 @@ kern_fcntl(struct thread *td, int fd, in /* FALLTHROUGH */ case F_READAHEAD: FILEDESC_SLOCK(fdp); - if ((fp = fdtofp(fd, fdp)) == NULL) { + if ((fp = fget_locked(fdp, fd)) == NULL) { FILEDESC_SUNLOCK(fdp); error = EBADF; break; @@ -820,7 +811,7 @@ do_dup(struct thread *td, int flags, int return (flags & DUP_FCNTL ? EINVAL : EBADF); FILEDESC_XLOCK(fdp); - if (old >= fdp->fd_nfiles || fdp->fd_ofiles[old] == NULL) { + if (fget_locked(fdp, old) == NULL) { FILEDESC_XUNLOCK(fdp); return (EBADF); } @@ -885,7 +876,7 @@ do_dup(struct thread *td, int flags, int *retval = new; if (delfp != NULL) { - (void) closefp(fdp, new, delfp, td); + (void) closefp(fdp, new, delfp, td, 1); /* closefp() drops the FILEDESC lock for us. */ } else { FILEDESC_XUNLOCK(fdp); @@ -1117,22 +1108,24 @@ fgetown(sigiop) * Function drops the filedesc lock on return. */ static int -closefp(struct filedesc *fdp, int fd, struct file *fp, struct thread *td) +closefp(struct filedesc *fdp, int fd, struct file *fp, struct thread *td, + int holdleaders) { struct file *fp_object; - int error, holdleaders; + int error; FILEDESC_XLOCK_ASSERT(fdp); - if (td->td_proc->p_fdtol != NULL) { - /* - * Ask fdfree() to sleep to ensure that all relevant - * process leaders can be traversed in closef(). - */ - fdp->fd_holdleaderscount++; - holdleaders = 1; - } else { - holdleaders = 0; + if (holdleaders) { + if (td->td_proc->p_fdtol != NULL) { + /* + * Ask fdfree() to sleep to ensure that all relevant + * process leaders can be traversed in closef(). + */ + fdp->fd_holdleaderscount++; + } else { + holdleaders = 0; + } } /* @@ -1197,8 +1190,7 @@ kern_close(td, fd) AUDIT_SYSCLOSE(td, fd); FILEDESC_XLOCK(fdp); - if (fd < 0 || fd >= fdp->fd_nfiles || - (fp = fdp->fd_ofiles[fd]) == NULL) { + if ((fp = fget_locked(fdp, fd)) == NULL) { FILEDESC_XUNLOCK(fdp); return (EBADF); } @@ -1207,7 +1199,7 @@ kern_close(td, fd) fdunused(fdp, fd); /* closefp() drops the FILEDESC lock for us. */ - return (closefp(fdp, fd, fp, td)); + return (closefp(fdp, fd, fp, td, 1)); } /* @@ -1370,6 +1362,7 @@ sys_fpathconf(struct thread *td, struct vp = fp->f_vnode; if (vp != NULL) { int vfslocked; + vfslocked = VFS_LOCK_GIANT(vp->v_mount); vn_lock(vp, LK_SHARED | LK_RETRY); error = VOP_PATHCONF(vp, uap->name, td->td_retval); @@ -1380,7 +1373,7 @@ sys_fpathconf(struct thread *td, struct error = EINVAL; } else { td->td_retval[0] = PIPE_BUF; - error = 0; + error = 0; } } else { error = EOPNOTSUPP; @@ -1834,11 +1827,8 @@ fdfree(struct thread *td) vp = fp->f_vnode; locked = VFS_LOCK_GIANT(vp->v_mount); (void) VOP_ADVLOCK(vp, - (caddr_t)td->td_proc-> - p_leader, - F_UNLCK, - &lf, - F_POSIX); + (caddr_t)td->td_proc->p_leader, F_UNLCK, + &lf, F_POSIX); VFS_UNLOCK_GIANT(locked); FILEDESC_XLOCK(fdp); fdrop(fp, td); @@ -2027,6 +2017,7 @@ void fdcloseexec(struct thread *td) { struct filedesc *fdp; + struct file *fp; int i; /* Certain daemons might not have file descriptors. */ @@ -2034,31 +2025,20 @@ fdcloseexec(struct thread *td) if (fdp == NULL) return; - FILEDESC_XLOCK(fdp); - /* * We cannot cache fd_ofiles or fd_ofileflags since operations * may block and rip them out from under us. */ + FILEDESC_XLOCK(fdp); for (i = 0; i <= fdp->fd_lastfile; i++) { - if (fdp->fd_ofiles[i] != NULL && - (fdp->fd_ofiles[i]->f_type == DTYPE_MQUEUE || + fp = fdp->fd_ofiles[i]; + if (fp != NULL && (fp->f_type == DTYPE_MQUEUE || (fdp->fd_ofileflags[i] & UF_EXCLOSE))) { - struct file *fp; - - knote_fdclose(td, i); - /* - * NULL-out descriptor prior to close to avoid - * a race while close blocks. - */ - fp = fdp->fd_ofiles[i]; fdp->fd_ofiles[i] = NULL; fdp->fd_ofileflags[i] = 0; fdunused(fdp, i); - if (fp->f_type == DTYPE_MQUEUE) - mq_fdclose(td, i, fp); - FILEDESC_XUNLOCK(fdp); - (void) closef(fp, td); + (void) closefp(fdp, i, fp, td, 0); + /* closefp() drops the FILEDESC lock. */ FILEDESC_XLOCK(fdp); } } @@ -2123,6 +2103,9 @@ closef(struct file *fp, struct thread *t struct filedesc *fdp; struct file *fp_object; + fdp = td->td_proc->p_fd; + FILEDESC_UNLOCK_ASSERT(fdp); + /* * POSIX record locking dictates that any close releases ALL * locks owned by this process. This is handled by setting @@ -2139,7 +2122,7 @@ closef(struct file *fp, struct thread *t * node, not the capability itself. */ (void)cap_funwrap(fp, 0, &fp_object); - if ((fp_object->f_type == DTYPE_VNODE) && (td != NULL)) { + if (fp_object->f_type == DTYPE_VNODE && td != NULL) { int vfslocked; vp = fp_object->f_vnode; @@ -2150,7 +2133,7 @@ closef(struct file *fp, struct thread *t lf.l_len = 0; lf.l_type = F_UNLCK; (void) VOP_ADVLOCK(vp, (caddr_t)td->td_proc->p_leader, - F_UNLCK, &lf, F_POSIX); + F_UNLCK, &lf, F_POSIX); } fdtol = td->td_proc->p_fdtol; if (fdtol != NULL) { @@ -2158,7 +2141,6 @@ closef(struct file *fp, struct thread *t * Handle special case where file descriptor table is * shared between multiple process leaders. */ - fdp = td->td_proc->p_fd; FILEDESC_XLOCK(fdp); for (fdtol = fdtol->fdl_next; fdtol != td->td_proc->p_fdtol; @@ -2174,8 +2156,8 @@ closef(struct file *fp, struct thread *t lf.l_type = F_UNLCK; vp = fp_object->f_vnode; (void) VOP_ADVLOCK(vp, - (caddr_t)fdtol->fdl_leader, - F_UNLCK, &lf, F_POSIX); + (caddr_t)fdtol->fdl_leader, F_UNLCK, &lf, + F_POSIX); FILEDESC_XLOCK(fdp); fdtol->fdl_holdcount--; if (fdtol->fdl_holdcount == 0 && @@ -2602,8 +2584,7 @@ dupfdopen(struct thread *td, struct file * closed, then reject. */ FILEDESC_XLOCK(fdp); - if (dfd < 0 || dfd >= fdp->fd_nfiles || - (fp = fdp->fd_ofiles[dfd]) == NULL) { + if ((fp = fget_locked(fdp, dfd)) == NULL) { FILEDESC_XUNLOCK(fdp); return (EBADF); } Modified: user/alc/superpages/sys/kern/kern_event.c ============================================================================== --- user/alc/superpages/sys/kern/kern_event.c Thu Jun 14 17:47:54 2012 (r237086) +++ user/alc/superpages/sys/kern/kern_event.c Thu Jun 14 17:54:52 2012 (r237087) @@ -692,7 +692,7 @@ sys_kqueue(struct thread *td, struct kqu if (error) goto done2; - /* An extra reference on `nfp' has been held for us by falloc(). */ + /* An extra reference on `fp' has been held for us by falloc(). */ kq = malloc(sizeof *kq, M_KQUEUE, M_WAITOK | M_ZERO); mtx_init(&kq->kq_lock, "kqueue", NULL, MTX_DEF|MTX_DUPOK); TAILQ_INIT(&kq->kq_head); Modified: user/alc/superpages/sys/sys/filedesc.h ============================================================================== --- user/alc/superpages/sys/sys/filedesc.h Thu Jun 14 17:47:54 2012 (r237086) +++ user/alc/superpages/sys/sys/filedesc.h Thu Jun 14 17:54:52 2012 (r237087) @@ -105,6 +105,7 @@ struct filedesc_to_leader { SX_NOTRECURSED) #define FILEDESC_XLOCK_ASSERT(fdp) sx_assert(&(fdp)->fd_sx, SX_XLOCKED | \ SX_NOTRECURSED) +#define FILEDESC_UNLOCK_ASSERT(fdp) sx_assert(&(fdp)->fd_sx, SX_UNLOCKED) struct thread; @@ -141,7 +142,12 @@ static __inline struct file * fget_locked(struct filedesc *fdp, int fd) { - return ((unsigned int)fd >= fdp->fd_nfiles ? NULL : fdp->fd_ofiles[fd]); + FILEDESC_LOCK_ASSERT(fdp); + + if (fd < 0 || fd >= fdp->fd_nfiles) + return (NULL); + + return (fdp->fd_ofiles[fd]); } #endif /* _KERNEL */
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201206141754.q5EHsqAa009752>