From owner-p4-projects@FreeBSD.ORG Thu Jun 21 10:51:41 2007 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 15A6816A478; Thu, 21 Jun 2007 10:51:41 +0000 (UTC) X-Original-To: perforce@FreeBSD.org Delivered-To: perforce@FreeBSD.org Received: from mx1.freebsd.org (mx1.freebsd.org [69.147.83.52]) by hub.freebsd.org (Postfix) with ESMTP id CC47916A476 for ; Thu, 21 Jun 2007 10:51:40 +0000 (UTC) (envelope-from lulf@FreeBSD.org) Received: from repoman.freebsd.org (repoman.freebsd.org [69.147.83.41]) by mx1.freebsd.org (Postfix) with ESMTP id BC55613C4C5 for ; Thu, 21 Jun 2007 10:51:40 +0000 (UTC) (envelope-from lulf@FreeBSD.org) Received: from repoman.freebsd.org (localhost [127.0.0.1]) by repoman.freebsd.org (8.13.8/8.13.8) with ESMTP id l5LApejR034627 for ; Thu, 21 Jun 2007 10:51:40 GMT (envelope-from lulf@FreeBSD.org) Received: (from perforce@localhost) by repoman.freebsd.org (8.13.8/8.13.8/Submit) id l5LApdue034623 for perforce@freebsd.org; Thu, 21 Jun 2007 10:51:39 GMT (envelope-from lulf@FreeBSD.org) Date: Thu, 21 Jun 2007 10:51:39 GMT Message-Id: <200706211051.l5LApdue034623@repoman.freebsd.org> X-Authentication-Warning: repoman.freebsd.org: perforce set sender to lulf@FreeBSD.org using -f From: Ulf Lilleengen To: Perforce Change Reviews Cc: Subject: PERFORCE change 122083 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: Thu, 21 Jun 2007 10:51:41 -0000 http://perforce.freebsd.org/chv.cgi?CH=122083 Change 122083 by lulf@lulf_carrot on 2007/06/21 10:51:31 - integrate Affected files ... .. //depot/projects/soc2007/lulf/gvinum_fixup/sys/conf/NOTES#8 integrate .. //depot/projects/soc2007/lulf/gvinum_fixup/sys/conf/files#10 integrate .. //depot/projects/soc2007/lulf/gvinum_fixup/sys/conf/files.sparc64#3 integrate .. //depot/projects/soc2007/lulf/gvinum_fixup/sys/conf/files.sun4v#3 integrate .. //depot/projects/soc2007/lulf/gvinum_fixup/sys/conf/options#7 integrate .. //depot/projects/soc2007/lulf/gvinum_fixup/sys/geom/part/g_part.c#6 integrate .. //depot/projects/soc2007/lulf/gvinum_fixup/sys/geom/part/g_part.h#3 integrate .. //depot/projects/soc2007/lulf/gvinum_fixup/sys/geom/part/g_part_mbr.c#2 integrate .. //depot/projects/soc2007/lulf/gvinum_fixup/sys/i386/cpufreq/smist.c#2 integrate .. //depot/projects/soc2007/lulf/gvinum_fixup/sys/i386/isa/clock.c#3 integrate .. //depot/projects/soc2007/lulf/gvinum_fixup/sys/i386/xbox/xboxfb.c#2 integrate .. //depot/projects/soc2007/lulf/gvinum_fixup/sys/kern/kern_conf.c#3 integrate .. //depot/projects/soc2007/lulf/gvinum_fixup/sys/kern/kern_descrip.c#5 integrate .. //depot/projects/soc2007/lulf/gvinum_fixup/sys/kern/kern_fork.c#5 integrate .. //depot/projects/soc2007/lulf/gvinum_fixup/sys/kern/kern_ntptime.c#2 integrate .. //depot/projects/soc2007/lulf/gvinum_fixup/sys/kern/kern_priv.c#3 integrate .. //depot/projects/soc2007/lulf/gvinum_fixup/sys/kern/kern_resource.c#5 integrate .. //depot/projects/soc2007/lulf/gvinum_fixup/sys/kern/sched_ule.c#5 integrate .. //depot/projects/soc2007/lulf/gvinum_fixup/sys/kern/subr_unit.c#2 integrate .. //depot/projects/soc2007/lulf/gvinum_fixup/sys/kern/subr_witness.c#6 integrate .. //depot/projects/soc2007/lulf/gvinum_fixup/sys/kern/vfs_cache.c#3 integrate .. //depot/projects/soc2007/lulf/gvinum_fixup/sys/modules/Makefile#5 integrate .. //depot/projects/soc2007/lulf/gvinum_fixup/sys/sys/priv.h#5 integrate .. //depot/projects/soc2007/lulf/gvinum_fixup/sys/sys/tree.h#2 integrate .. //depot/projects/soc2007/lulf/gvinum_fixup/sys/vm/vm_contig.c#6 integrate .. //depot/projects/soc2007/lulf/gvinum_fixup/sys/vm/vm_fault.c#4 integrate .. //depot/projects/soc2007/lulf/gvinum_fixup/sys/vm/vm_mmap.c#4 integrate .. //depot/projects/soc2007/lulf/gvinum_fixup/sys/vm/vm_object.c#5 integrate .. //depot/projects/soc2007/lulf/gvinum_fixup/sys/vm/vm_page.c#6 integrate .. //depot/projects/soc2007/lulf/gvinum_fixup/sys/vm/vm_page.h#3 integrate .. //depot/projects/soc2007/lulf/gvinum_fixup/sys/vm/vm_pageout.c#6 integrate .. //depot/projects/soc2007/lulf/gvinum_fixup/sys/vm/vm_pageq.c#5 integrate .. //depot/projects/soc2007/lulf/gvinum_fixup/sys/vm/vm_phys.c#2 integrate .. //depot/projects/soc2007/lulf/gvinum_fixup/sys/vm/vm_zeroidle.c#4 integrate Differences ... ==== //depot/projects/soc2007/lulf/gvinum_fixup/sys/conf/NOTES#8 (text+ko) ==== @@ -1,4 +1,4 @@ -# $FreeBSD: src/sys/conf/NOTES,v 1.1432 2007/06/13 14:01:42 rwatson Exp $ +# $FreeBSD: src/sys/conf/NOTES,v 1.1434 2007/06/16 04:57:03 alc Exp $ # # NOTES -- Lines that can be cut/pasted into kernel and hints configs. # @@ -125,10 +125,6 @@ options MAXPHYS=(128*1024) -# Options for the VM subsystem -# Deprecated options supported for backwards compatibility -#options PQ_NOOPT # No coloring - # This allows you to actually store this configuration file into # the kernel binary itself, where it may be later read by saying: # strings -n 3 /boot/kernel/kernel | sed -n 's/^___//p' > MYKERNEL @@ -584,17 +580,7 @@ # for in a captured lab environment :-) options SCTP_WITH_NO_CSUM # -# Logging, this is another debug tool thats way -# cool.. but does take resources so its off -# by default. To do any logging you must first -# enable SCTP_STAT_LOGGING. This gets the utilities -# into the code base that actually do the logging and -# alocates a hugh fixed circular buffer that logging -# uses (about 80,000 entires that are probably 8 long -# words or so long.. so it does take a LOT of memory). -# Its cool for real-time debugging though. -# -options SCTP_STAT_LOGGING + # # All that options after that turn on specific types of # logging. You can monitor CWND growth, flight size @@ -605,25 +591,19 @@ # I have not yet commited the tools to get and print # the logs, I will do that eventually .. before then # if you want them send me an email rrs@freebsd.org +# You basically must have KTR enabled for these +# and you then set the sysctl to turn on/off various +# logging bits. Use ktrdump to pull the log and run +# it through a dispaly program.. and graphs and other +# things too. # -options SCTP_LOG_MAXBURST -options SCTP_LOG_RWND -options SCTP_CWND_LOGGING -options SCTP_CWND_MONITOR -options SCTP_BLK_LOGGING -options SCTP_STR_LOGGING -options SCTP_FR_LOGGING -options SCTP_MAP_LOGGING -options SCTP_SACK_LOGGING -options SCTP_LOCK_LOGGING -options SCTP_RTTVAR_LOGGING -options SCTP_SB_LOGGING -options SCTP_EARLYFR_LOGGING -options SCTP_NAGLE_LOGGING -options SCTP_WAKE_LOGGING -options SCTP_RECV_RWND_LOGGING -options SCTP_SACK_RWND_LOGGING -options SCTP_MBUF_LOGGING +options SCTP_LOCK_LOGGING +options SCTP_MBUF_LOGGING +options SCTP_MBCNT_LOGGING +options SCTP_PACKET_LOGGING +options SCTP_LTRACE_CHUNKS +options SCTP_LTRACE_ERRORS + # altq(9). Enable the base part of the hooks with the ALTQ option. # Individual disciplines must be built into the base system and can not be ==== //depot/projects/soc2007/lulf/gvinum_fixup/sys/conf/files#10 (text+ko) ==== @@ -1,4 +1,4 @@ -# $FreeBSD: src/sys/conf/files,v 1.1220 2007/06/13 14:01:42 rwatson Exp $ +# $FreeBSD: src/sys/conf/files,v 1.1222 2007/06/16 04:57:04 alc Exp $ # # The long compile-with and dependency lines are required because of # limitations in config: backslash-newline doesn't work in strings, and @@ -1205,6 +1205,11 @@ fs/unionfs/union_subr.c optional unionfs fs/unionfs/union_vfsops.c optional unionfs fs/unionfs/union_vnops.c optional unionfs +fs/tmpfs/tmpfs_vnops.c optional tmpfs +fs/tmpfs/tmpfs_fifoops.c optional tmpfs +fs/tmpfs/tmpfs_vfsops.c optional tmpfs +fs/tmpfs/tmpfs_subr.c optional tmpfs +fs/tmpfs/tmpfs_uma.c optional tmpfs gdb/gdb_cons.c optional gdb gdb/gdb_main.c optional gdb gdb/gdb_packet.c optional gdb @@ -2073,6 +2078,7 @@ vm/vm_pageout.c standard vm/vm_pageq.c standard vm/vm_pager.c standard +vm/vm_phys.c standard vm/vm_unix.c standard vm/vm_zeroidle.c standard vm/vnode_pager.c standard ==== //depot/projects/soc2007/lulf/gvinum_fixup/sys/conf/files.sparc64#3 (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.sparc64,v 1.89 2007/06/11 00:38:06 marcel Exp $ +# $FreeBSD: src/sys/conf/files.sparc64,v 1.91 2007/06/18 21:49:42 marius Exp $ # # The long compile-with and dependency lines are required because of # limitations in config: backslash-newline doesn't work in strings, and @@ -46,6 +46,7 @@ dev/esp/esp_sbus.c optional esp sbus dev/fb/creator.c optional creator sc dev/fb/fb.c optional sc +dev/fb/gallant12x22.c optional sc dev/fb/machfb.c optional machfb sc dev/hwpmc/hwpmc_sparc64.c optional hwpmc dev/kbd/kbd.c optional atkbd | sc | ukbd @@ -80,7 +81,6 @@ sparc64/isa/isa_dma.c optional isa sparc64/isa/ofw_isa.c optional ebus | isa sparc64/pci/apb.c optional pci -sparc64/pci/ofw_pci.c optional pci sparc64/pci/ofw_pcib.c optional pci sparc64/pci/ofw_pcib_subr.c optional pci sparc64/pci/ofw_pcibus.c optional pci ==== //depot/projects/soc2007/lulf/gvinum_fixup/sys/conf/files.sun4v#3 (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.sun4v,v 1.9 2007/06/11 00:38:06 marcel Exp $ +# $FreeBSD: src/sys/conf/files.sun4v,v 1.10 2007/06/18 21:49:42 marius Exp $ # # The long compile-with and dependency lines are required because of # limitations in config: backslash-newline doesn't work in strings, and @@ -47,7 +47,6 @@ sparc64/sparc64/gdb_machdep.c optional gdb sun4v/sun4v/hv_pci.c optional pci sun4v/sun4v/trap_trace.S optional trap_tracing -sparc64/pci/ofw_pci.c optional pci sparc64/pci/ofw_pcib.c optional pci sparc64/pci/ofw_pcib_subr.c optional pci sparc64/pci/ofw_pcibus.c optional pci ==== //depot/projects/soc2007/lulf/gvinum_fixup/sys/conf/options#7 (text+ko) ==== @@ -1,4 +1,4 @@ -# $FreeBSD: src/sys/conf/options,v 1.593 2007/06/13 14:01:42 rwatson Exp $ +# $FreeBSD: src/sys/conf/options,v 1.596 2007/06/16 04:57:04 alc Exp $ # # On the handling of kernel options # @@ -196,6 +196,7 @@ PSEUDOFS opt_dontuse.h REISERFS opt_dontuse.h SMBFS opt_dontuse.h +TMPFS opt_dontuse.h UDF opt_dontuse.h UMAPFS opt_dontuse.h UNIONFS opt_dontuse.h @@ -397,30 +398,18 @@ # SCTP # SCTP opt_sctp.h -SCTP_DEBUG opt_sctp.h -SCTP_HIGH_SPEED opt_sctp.h -SCTP_LOG_MAXBURST opt_sctp.h -SCTP_LOG_RWND opt_sctp.h -SCTP_STAT_LOGGING opt_sctp.h -SCTP_CWND_LOGGING opt_sctp.h -SCTP_CWND_MONITOR opt_sctp.h -SCTP_BLK_LOGGING opt_sctp.h -SCTP_STR_LOGGING opt_sctp.h -SCTP_FR_LOGGING opt_sctp.h -SCTP_MAP_LOGGING opt_sctp.h -SCTP_SACK_LOGGING opt_sctp.h -SCTP_LOCK_LOGGING opt_sctp.h -SCTP_RTTVAR_LOGGING opt_sctp.h -SCTP_SB_LOGGING opt_sctp.h -SCTP_WITH_NO_CSUM opt_sctp.h -SCTP_EARLYFR_LOGGING opt_sctp.h -SCTP_NAGLE_LOGGING opt_sctp.h -SCTP_WAKE_LOGGING opt_sctp.h -SCTP_RECV_RWND_LOGGING opt_sctp.h -SCTP_SACK_RWND_LOGGING opt_sctp.h -SCTP_FLIGHT_LOGGING opt_sctp.h -SCTP_MBUF_LOGGING opt_sctp.h -SCTP_PACKET_LOGGING opt_sctp.h +SCTP_DEBUG opt_sctp.h # Enable debug printfs +SCTP_HIGH_SPEED opt_sctp.h # Enable Sally Floyds HS TCP CC +SCTP_WITH_NO_CSUM opt_sctp.h # Use this at your peril +SCTP_LOCK_LOGGING opt_sctp.h # Log to KTR lock activity +SCTP_MBUF_LOGGING opt_sctp.h # Log to KTR general mbuf aloc/free +SCTP_MBCNT_LOGGING opt_sctp.h # Log to KTR mbcnt activity +SCTP_PACKET_LOGGING opt_sctp.h # Log to a packet buffer last N packets +SCTP_LTRACE_CHUNKS opt_sctp.h # Log to KTR chunks processed +SCTP_LTRACE_ERRORS opt_sctp.h # Log to KTR error returns. +# +# +# # Netgraph(4). Use option NETGRAPH to enable the base netgraph code. # Each netgraph node type can be either be compiled into the kernel @@ -566,7 +555,6 @@ NO_SWAPPING opt_vm.h MALLOC_MAKE_FAILURES opt_vm.h MALLOC_PROFILE opt_vm.h -PQ_NOOPT opt_vmpage.h # The MemGuard replacement allocator used for tamper-after-free detection DEBUG_MEMGUARD opt_vm.h ==== //depot/projects/soc2007/lulf/gvinum_fixup/sys/geom/part/g_part.c#6 (text+ko) ==== @@ -25,7 +25,7 @@ */ #include -__FBSDID("$FreeBSD: src/sys/geom/part/g_part.c,v 1.8 2007/06/06 05:01:41 marcel Exp $"); +__FBSDID("$FreeBSD: src/sys/geom/part/g_part.c,v 1.9 2007/06/17 22:19:19 marcel Exp $"); #include #include @@ -136,6 +136,81 @@ return (NULL); } +void +g_part_geometry_heads(off_t blocks, u_int sectors, off_t *bestchs, + u_int *bestheads) +{ + static u_int candidate_heads[] = { 1, 2, 16, 32, 64, 128, 255, 0 }; + off_t chs, cylinders; + u_int heads; + int idx; + + *bestchs = 0; + *bestheads = 0; + for (idx = 0; candidate_heads[idx] != 0; idx++) { + heads = candidate_heads[idx]; + cylinders = blocks / heads / sectors; + if (cylinders < heads || cylinders < sectors) + break; + if (cylinders > 1023) + continue; + chs = cylinders * heads * sectors; + if (chs > *bestchs || (chs == *bestchs && *bestheads == 1)) { + *bestchs = chs; + *bestheads = heads; + } + } +} + +static void +g_part_geometry(struct g_part_table *table, struct g_consumer *cp, + off_t blocks) +{ + static u_int candidate_sectors[] = { 1, 9, 17, 33, 63, 0 }; + off_t chs, bestchs; + u_int heads, sectors; + int idx; + + if (g_getattr("GEOM::fwsectors", cp, §ors) != 0 || + sectors < 1 || sectors > 63 || + g_getattr("GEOM::fwheads", cp, &heads) != 0 || + heads < 1 || heads > 255) { + table->gpt_fixgeom = 0; + table->gpt_heads = 0; + table->gpt_sectors = 0; + bestchs = 0; + for (idx = 0; candidate_sectors[idx] != 0; idx++) { + sectors = candidate_sectors[idx]; + g_part_geometry_heads(blocks, sectors, &chs, &heads); + if (chs == 0) + continue; + /* + * Prefer a geometry with sectors > 1, but only if + * it doesn't bump down the numbver of heads to 1. + */ + if (chs > bestchs || (chs == bestchs && heads > 1 && + table->gpt_sectors == 1)) { + bestchs = chs; + table->gpt_heads = heads; + table->gpt_sectors = sectors; + } + } + /* + * If we didn't find a geometry at all, then the disk is + * too big. This means we can use the maximum number of + * heads and sectors. + */ + if (bestchs == 0) { + table->gpt_heads = 255; + table->gpt_sectors = 63; + } + } else { + table->gpt_fixgeom = 1; + table->gpt_heads = heads; + table->gpt_sectors = sectors; + } +} + struct g_part_entry * g_part_new_entry(struct g_part_table *table, int index, quad_t start, quad_t end) @@ -574,6 +649,12 @@ g_topology_unlock(); + /* Make sure the provider has media. */ + if (pp->mediasize == 0 || pp->sectorsize == 0) { + error = ENODEV; + goto fail; + } + /* Make sure we can nest and if so, determine our depth. */ error = g_getattr("PART::isleaf", cp, &attr); if (!error && attr) { @@ -583,6 +664,14 @@ error = g_getattr("PART::depth", cp, &attr); table->gpt_depth = (!error) ? attr + 1 : 0; + /* + * Synthesize a disk geometry. Some partitioning schemes + * depend on it and since some file systems need it even + * when the partitition scheme doesn't, we do it here in + * scheme-independent code. + */ + g_part_geometry(table, cp, pp->mediasize / pp->sectorsize); + error = G_PART_CREATE(table, gpp); if (error) goto fail; @@ -1217,6 +1306,15 @@ g_topology_unlock(); + /* + * Short-circuit the whole probing galore when there's no + * media present. + */ + if (pp->mediasize == 0 || pp->sectorsize == 0) { + error = ENODEV; + goto fail; + } + /* Make sure we can nest and if so, determine our depth. */ error = g_getattr("PART::isleaf", cp, &attr); if (!error && attr) { @@ -1231,6 +1329,15 @@ goto fail; table = gp->softc; + + /* + * Synthesize a disk geometry. Some partitioning schemes + * depend on it and since some file systems need it even + * when the partitition scheme doesn't, we do it here in + * scheme-independent code. + */ + g_part_geometry(table, cp, pp->mediasize / pp->sectorsize); + error = G_PART_READ(table, cp); if (error) goto fail; @@ -1311,6 +1418,10 @@ (uintmax_t)table->gpt_first); sbuf_printf(sb, "%s%ju\n", indent, (uintmax_t)table->gpt_last); + sbuf_printf(sb, "%s%u\n", indent, + table->gpt_sectors); + sbuf_printf(sb, "%s%u\n", indent, + table->gpt_heads); G_PART_DUMPCONF(table, NULL, sb, indent); } } @@ -1349,7 +1460,6 @@ struct g_part_table *table; struct g_kerneldump *gkd; struct g_provider *pp; - int attr; pp = bp->bio_to; gp = pp->geom; @@ -1387,6 +1497,14 @@ case BIO_FLUSH: break; case BIO_GETATTR: + if (g_handleattr_int(bp, "GEOM::fwheads", table->gpt_heads)) + return; + if (g_handleattr_int(bp, "GEOM::fwsectors", table->gpt_sectors)) + return; + if (g_handleattr_int(bp, "PART::isleaf", table->gpt_isleaf)) + return; + if (g_handleattr_int(bp, "PART::depth", table->gpt_depth)) + return; if (!strcmp("GEOM::kerneldump", bp->bio_attribute)) { /* * Check that the partition is suitable for kernel @@ -1405,25 +1523,6 @@ if (gkd->offset + gkd->length > pp->mediasize) gkd->length = pp->mediasize - gkd->offset; gkd->offset += entry->gpe_offset; - } else if (!strcmp("PART::isleaf", bp->bio_attribute)) { - if (bp->bio_length != sizeof(int)) { - g_io_deliver(bp, EFAULT); - return; - } - attr = table->gpt_isleaf ? 1 : 0; - bcopy(&attr, bp->bio_data, sizeof(int)); - bp->bio_completed = sizeof(int); - g_io_deliver(bp, 0); - return; - } else if (!strcmp("PART::depth", bp->bio_attribute)) { - if (bp->bio_length != sizeof(int)) { - g_io_deliver(bp, EFAULT); - return; - } - bcopy(&table->gpt_depth, bp->bio_data, sizeof(int)); - bp->bio_completed = sizeof(int); - g_io_deliver(bp, 0); - return; } break; default: ==== //depot/projects/soc2007/lulf/gvinum_fixup/sys/geom/part/g_part.h#3 (text+ko) ==== @@ -23,7 +23,7 @@ * (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: src/sys/geom/part/g_part.h,v 1.2 2007/05/08 20:18:17 marcel Exp $ + * $FreeBSD: src/sys/geom/part/g_part.h,v 1.3 2007/06/17 22:19:19 marcel Exp $ */ #ifndef _GEOM_PART_H_ @@ -87,12 +87,25 @@ */ uint32_t gpt_smhead; uint32_t gpt_smtail; + /* + * gpt_sectors and gpt_heads are the fixed or synchesized number + * of sectors per track and heads (resp) that make up a disks + * geometry. This is to support partitioning schemes as well as + * file systems that work on a geometry. The MBR scheme and the + * MS-DOS (FAT) file system come to mind. + * We keep track of whether the geometry is fixed or synchesized + * so that a partitioning scheme can correct the synthesized + * geometry, based on the on-disk metadata. + */ + uint32_t gpt_sectors; + uint32_t gpt_heads; int gpt_depth; /* Sub-partitioning level. */ int gpt_isleaf:1; /* Cannot be sub-partitioned. */ int gpt_created:1; /* Newly created. */ int gpt_modified:1; /* Table changes have been made. */ int gpt_opened:1; /* Permissions obtained. */ + int gpt_fixgeom:1; /* Geometry is fixed. */ }; struct g_part_entry *g_part_new_entry(struct g_part_table *, int, quad_t, @@ -127,4 +140,6 @@ unsigned int gpp_version; }; +void g_part_geometry_heads(off_t, u_int, off_t *, u_int *); + #endif /* !_GEOM_PART_H_ */ ==== //depot/projects/soc2007/lulf/gvinum_fixup/sys/geom/part/g_part_mbr.c#2 (text+ko) ==== @@ -25,7 +25,7 @@ */ #include -__FBSDID("$FreeBSD: src/sys/geom/part/g_part_mbr.c,v 1.1 2007/06/13 04:27:36 marcel Exp $"); +__FBSDID("$FreeBSD: src/sys/geom/part/g_part_mbr.c,v 1.2 2007/06/17 22:19:19 marcel Exp $"); #include #include @@ -50,7 +50,6 @@ struct g_part_mbr_table { struct g_part_table base; u_char mbr[MBRSIZE]; - int spt; /* Sectors/track. */ }; struct g_part_mbr_entry { @@ -119,31 +118,52 @@ return (EINVAL); } +static void +mbr_set_chs(struct g_part_table *table, uint32_t lba, u_char *cylp, u_char *hdp, + u_char *secp) +{ + uint32_t cyl, hd, sec; + + sec = lba % table->gpt_sectors + 1; + lba /= table->gpt_sectors; + hd = lba % table->gpt_heads; + lba /= table->gpt_heads; + cyl = lba; + if (cyl > 1023) + sec = hd = cyl = ~0; + + *cylp = cyl & 0xff; + *hdp = hd & 0xff; + *secp = (sec & 0x3f) | ((cyl >> 2) & 0xc0); +} + static int g_part_mbr_add(struct g_part_table *basetable, struct g_part_entry *baseentry, struct g_part_parms *gpp) { struct g_part_mbr_entry *entry; struct g_part_mbr_table *table; - uint32_t start, size; + uint32_t start, size, sectors; if (gpp->gpp_parms & G_PART_PARM_LABEL) return (EINVAL); + sectors = basetable->gpt_sectors; + entry = (struct g_part_mbr_entry *)baseentry; table = (struct g_part_mbr_table *)basetable; start = gpp->gpp_start; size = gpp->gpp_size; - if (size < table->spt) + if (size < sectors) return (EINVAL); - if (start % table->spt) { - size = size - table->spt + (start % table->spt); - start = start - (start % table->spt) + table->spt; + if (start % sectors) { + size = size - sectors + (start % sectors); + start = start - (start % sectors) + sectors; } - if (size % table->spt) - size = size - (size % table->spt); - if (size < table->spt) + if (size % sectors) + size = size - (size % sectors); + if (size < sectors) return (EINVAL); if (baseentry->gpe_deleted) @@ -155,6 +175,10 @@ baseentry->gpe_end = start + size - 1; entry->ent.dp_start = start; entry->ent.dp_size = size; + mbr_set_chs(basetable, baseentry->gpe_start, &entry->ent.dp_scyl, + &entry->ent.dp_shd, &entry->ent.dp_ssect); + mbr_set_chs(basetable, baseentry->gpe_end, &entry->ent.dp_ecyl, + &entry->ent.dp_ehd, &entry->ent.dp_esect); return (mbr_parse_type(gpp->gpp_type, &entry->ent.dp_typ)); } @@ -165,27 +189,19 @@ struct g_provider *pp; struct g_part_mbr_table *table; uint64_t msize; - int error, spt; pp = gpp->gpp_provider; cp = LIST_FIRST(&pp->consumers); - error = g_getattr("GEOM::fwsectors", cp, &spt); - if (error) - spt = 17; - else if (spt == 0) - spt = 1; - - if (pp->sectorsize < MBRSIZE || pp->mediasize < spt * pp->sectorsize) + if (pp->sectorsize < MBRSIZE) return (ENOSPC); msize = pp->mediasize / pp->sectorsize; - basetable->gpt_first = spt; - basetable->gpt_last = msize - (msize % spt) - 1; + basetable->gpt_first = basetable->gpt_sectors; + basetable->gpt_last = msize - (msize % basetable->gpt_sectors) - 1; table = (struct g_part_mbr_table *)basetable; le16enc(table->mbr + DOSMAGICOFFSET, DOSMAGIC); - table->spt = spt; return (0); } @@ -262,23 +278,13 @@ struct g_part_mbr_table *table; struct g_part_mbr_entry *entry; u_char *buf, *p; - uint64_t msize; - int error, index, spt; - - error = g_getattr("GEOM::fwsectors", cp, &spt); - if (error) - spt = 17; - else if (spt == 0) - spt = 1; + off_t chs, msize; + u_int sectors, heads; + int error, index; pp = cp->provider; table = (struct g_part_mbr_table *)basetable; - table->spt = spt; - msize = pp->mediasize / pp->sectorsize; - basetable->gpt_first = spt; - basetable->gpt_last = msize - (msize % spt) - 1; - basetable->gpt_entries = NDOSPART; buf = g_read_data(cp, 0L, pp->sectorsize, &error); if (buf == NULL) @@ -303,10 +309,19 @@ continue; if (ent.dp_start == 0 || ent.dp_size == 0) continue; - if ((ent.dp_start % spt) != 0) + sectors = ent.dp_esect & 0x3f; + if (sectors > basetable->gpt_sectors && + !basetable->gpt_fixgeom) { + g_part_geometry_heads(msize, sectors, &chs, &heads); + if (chs != 0) { + basetable->gpt_sectors = sectors; + basetable->gpt_heads = heads; + } + } + if ((ent.dp_start % basetable->gpt_sectors) != 0) printf("GEOM: %s: partition %d does not start on a " "track boundary.\n", pp->name, index + 1); - if ((ent.dp_size % spt) != 0) + if ((ent.dp_size % basetable->gpt_sectors) != 0) printf("GEOM: %s: partition %d does not end on a " "track boundary.\n", pp->name, index + 1); @@ -314,6 +329,11 @@ index + 1, ent.dp_start, ent.dp_start + ent.dp_size - 1); entry->ent = ent; } + + basetable->gpt_entries = NDOSPART; + basetable->gpt_first = basetable->gpt_sectors; + basetable->gpt_last = msize - (msize % basetable->gpt_sectors) - 1; + return (0); } ==== //depot/projects/soc2007/lulf/gvinum_fixup/sys/i386/cpufreq/smist.c#2 (text+ko) ==== @@ -36,7 +36,7 @@ */ #include -__FBSDID("$FreeBSD: src/sys/i386/cpufreq/smist.c,v 1.1 2005/04/19 16:38:24 njl Exp $"); +__FBSDID("$FreeBSD: src/sys/i386/cpufreq/smist.c,v 1.2 2007/06/17 07:18:23 njl Exp $"); #include #include @@ -45,6 +45,7 @@ #include #include +#include #include #include @@ -71,6 +72,8 @@ struct cf_setting sets[2]; /* Only two settings. */ }; +static char smist_magic[] = "Copyright (c) 1999 Intel Corporation"; + static void smist_identify(driver_t *driver, device_t parent); static int smist_probe(device_t dev); static int smist_attach(device_t dev); @@ -147,34 +150,84 @@ return (0); } -static int -set_ownership(device_t dev) +/* Temporary structure to hold mapped page and status. */ +struct set_ownership_data { + int smi_cmd; + int command; + int result; + void *buf; +}; + +/* Perform actual SMI call to enable SpeedStep. */ +static void +set_ownership_cb(void *arg, bus_dma_segment_t *segs, int nsegs, int error) { - int result; - struct smist_softc *sc; - vm_paddr_t pmagic; - static char magic[] = "Copyright (c) 1999 Intel Corporation"; + struct set_ownership_data *data; - sc = device_get_softc(dev); - if (!sc) - return (ENXIO); + data = arg; + if (error) { + data->result = error; + return; + } - pmagic = vtophys(magic); - + /* Copy in the magic string and send it by writing to the SMI port. */ + strlcpy(data->buf, smist_magic, PAGE_SIZE); __asm __volatile( "movl $-1, %%edi\n\t" "out %%al, (%%dx)\n" - : "=D" (result) - : "a" (sc->command), + : "=D" (data->result) + : "a" (data->command), "b" (0), "c" (0), - "d" (sc->smi_cmd), - "S" (pmagic) + "d" (data->smi_cmd), + "S" ((uint32_t)segs[0].ds_addr) ); +} - DPRINT(dev, "taking ownership over BIOS return %d\n", result); +static int +set_ownership(device_t dev) +{ + struct smist_softc *sc; + struct set_ownership_data cb_data; + bus_dma_tag_t tag; + bus_dmamap_t map; + + /* + * Specify the region to store the magic string. Since its address is + * passed to the BIOS in a 32-bit register, we have to make sure it is + * located in a physical page below 4 GB (i.e., for PAE.) + */ + sc = device_get_softc(dev); + if (bus_dma_tag_create(/*parent*/ NULL, + /*alignment*/ PAGE_SIZE, /*no boundary*/ 0, + /*lowaddr*/ BUS_SPACE_MAXADDR_32BIT, /*highaddr*/ BUS_SPACE_MAXADDR, + NULL, NULL, /*maxsize*/ PAGE_SIZE, /*segments*/ 1, + /*maxsegsize*/ PAGE_SIZE, 0, busdma_lock_mutex, &Giant, + &tag) != 0) { + device_printf(dev, "can't create mem tag\n"); + return (ENXIO); + } + if (bus_dmamem_alloc(tag, &cb_data.buf, BUS_DMA_NOWAIT, &map) != 0) { + bus_dma_tag_destroy(tag); + device_printf(dev, "can't alloc mapped mem\n"); + return (ENXIO); + } - return (result ? ENXIO : 0); + /* Load the physical page map and take ownership in the callback. */ + cb_data.smi_cmd = sc->smi_cmd; + cb_data.command = sc->command; + if (bus_dmamap_load(tag, map, cb_data.buf, PAGE_SIZE, set_ownership_cb, + &cb_data, BUS_DMA_NOWAIT) != 0) { + bus_dmamem_free(tag, cb_data.buf, map); + bus_dma_tag_destroy(tag); + device_printf(dev, "can't load mem\n"); + return (ENXIO); + }; + DPRINT(dev, "taking ownership over BIOS return %d\n", cb_data.result); + bus_dmamap_unload(tag, map); + bus_dmamem_free(tag, cb_data.buf, map); + bus_dma_tag_destroy(tag); + return (cb_data.result ? ENXIO : 0); } static int ==== //depot/projects/soc2007/lulf/gvinum_fixup/sys/i386/isa/clock.c#3 (text+ko) ==== @@ -33,7 +33,7 @@ */ #include -__FBSDID("$FreeBSD: src/sys/i386/isa/clock.c,v 1.236 2007/06/04 18:25:07 dwmalone Exp $"); +__FBSDID("$FreeBSD: src/sys/i386/isa/clock.c,v 1.237 2007/06/15 22:58:13 peter Exp $"); /* * Routines to handle clock hardware. @@ -56,12 +56,15 @@ #include #include #include +#include +#include #include #include #include #include #include #include +#include #include #include #include @@ -930,4 +933,100 @@ DRIVER_MODULE(attimer, isa, attimer_driver, attimer_devclass, 0, 0); DRIVER_MODULE(attimer, acpi, attimer_driver, attimer_devclass, 0, 0); + +/* + * Linux-style /dev/nvram driver + * + * cmos ram starts at bytes 14 through 128, for a total of 114 bytes. + * bytes 16 through 31 are checksummed at byte 32. + * Unlike Linux, you have to take care of the checksums yourself. + * The driver exposes byte 14 as file offset 0. + */ + +#define NVRAM_FIRST RTC_DIAG /* 14 */ +#define NVRAM_LAST 128 + +static d_open_t nvram_open; +static d_read_t nvram_read; +static d_write_t nvram_write; + +static struct cdev *nvram_dev; + +static struct cdevsw nvram_cdevsw = { + .d_version = D_VERSION, + .d_flags = D_NEEDGIANT, + .d_open = nvram_open, + .d_read = nvram_read, + .d_write = nvram_write, + .d_name = "nvram", +}; + +static int +nvram_open(struct cdev *dev __unused, int flags, int fmt __unused, + struct thread *td) +{ + int error = 0; + + if (flags & FWRITE) + error = securelevel_gt(td->td_ucred, 0); + + return (error); +} + +static int +nvram_read(struct cdev *dev, struct uio *uio, int flags) +{ + int nv_off; + u_char v; + int error = 0; + + while (uio->uio_resid > 0 && error == 0) { + nv_off = uio->uio_offset + NVRAM_FIRST; + if (nv_off < NVRAM_FIRST || nv_off >= NVRAM_LAST) + return (0); /* Signal EOF */ + /* Single byte at a time */ + v = rtcin(nv_off); + error = uiomove(&v, 1, uio); + } + return (error); + +} + +static int +nvram_write(struct cdev *dev, struct uio *uio, int flags) +{ + int nv_off; + u_char v; + int error = 0; + + while (uio->uio_resid > 0 && error == 0) { + nv_off = uio->uio_offset + NVRAM_FIRST; + if (nv_off < NVRAM_FIRST || nv_off >= NVRAM_LAST) + return (0); /* Signal EOF */ + /* Single byte at a time */ + error = uiomove(&v, 1, uio); + writertc(nv_off, v); + } + return (error); +} + +static int +nvram_modevent(module_t mod __unused, int type, void *data __unused) +{ + switch (type) { + case MOD_LOAD: + nvram_dev = make_dev(&nvram_cdevsw, 0, + UID_ROOT, GID_KMEM, 0640, "nvram"); + break; + case MOD_UNLOAD: + case MOD_SHUTDOWN: + destroy_dev(nvram_dev); + break; + default: + return (EOPNOTSUPP); + } + return (0); +} +DEV_MODULE(nvram, nvram_modevent, NULL); + #endif /* DEV_ISA */ ==== //depot/projects/soc2007/lulf/gvinum_fixup/sys/i386/xbox/xboxfb.c#2 (text+ko) ==== @@ -23,10 +23,11 @@ * 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: src/sys/i386/xbox/xboxfb.c,v 1.4 2006/03/03 14:52:57 rink Exp $ */ +#include +__FBSDID("$FreeBSD: src/sys/i386/xbox/xboxfb.c,v 1.5 2007/06/16 21:31:53 marius Exp $"); + /* * This is the syscon(4)-ized version of the Xbox Frame Buffer driver. It * supports about all features required, such as mouse support. @@ -71,7 +72,7 @@ char* sc_framebuffer; /* pointer to the font used */ - struct gfb_font* sc_font; + const struct gfb_font* sc_font; }; #define SCREEN_WIDTH 640 @@ -79,7 +80,7 @@ #define XBOXFB_DRIVER_NAME "xboxsc" -extern struct gfb_font bold8x16; +extern const struct gfb_font bold8x16; >>> TRUNCATED FOR MAIL (1000 lines) <<<