svn commit: r198430 - in projects/ppc64: . lib/libc/gen sys
sys/amd64/acpica sys/boot/i386/zfsboot sys/boot/zfs
sys/cddl/boot/zfs sys/dev/ata sys/dev/fb sys/dev/siis
sys/dev/syscons sys/dev/xen/xen...
Nathan Whitehorn
nwhitehorn at FreeBSD.org
Fri Oct 23 22:07:35 UTC 2009
Author: nwhitehorn
Date: Fri Oct 23 22:07:34 2009
New Revision: 198430
URL: http://svn.freebsd.org/changeset/base/198430
Log:
IFC @ 192428 to get actually working SMP
Modified:
projects/ppc64/ (props changed)
projects/ppc64/lib/libc/gen/wordexp.c
projects/ppc64/sys/ (props changed)
projects/ppc64/sys/amd64/acpica/acpi_wakecode.S
projects/ppc64/sys/boot/i386/zfsboot/zfsboot.c
projects/ppc64/sys/boot/zfs/zfs.c
projects/ppc64/sys/boot/zfs/zfsimpl.c
projects/ppc64/sys/cddl/boot/zfs/zfsimpl.h
projects/ppc64/sys/dev/ata/ata-queue.c
projects/ppc64/sys/dev/ata/atapi-cd.c
projects/ppc64/sys/dev/ata/atapi-fd.c
projects/ppc64/sys/dev/ata/atapi-tape.c
projects/ppc64/sys/dev/fb/vesa.c
projects/ppc64/sys/dev/fb/vesa.h
projects/ppc64/sys/dev/siis/siis.c
projects/ppc64/sys/dev/syscons/syscons.c
projects/ppc64/sys/dev/xen/xenpci/ (props changed)
projects/ppc64/sys/kern/kern_exec.c
projects/ppc64/sys/kern/kern_ktrace.c
projects/ppc64/sys/kern/kern_shutdown.c
projects/ppc64/sys/kern/subr_bus.c
projects/ppc64/sys/kern/subr_taskqueue.c
projects/ppc64/sys/net/bpf.c
projects/ppc64/sys/netinet/if_ether.c
projects/ppc64/sys/netinet/in.c
projects/ppc64/sys/netinet6/in6.c
projects/ppc64/sys/powerpc/aim/clock.c
projects/ppc64/sys/powerpc/aim/machdep.c
projects/ppc64/sys/powerpc/aim/mp_cpudep.c
projects/ppc64/sys/sys/interrupt.h
projects/ppc64/sys/sys/ktrace.h
projects/ppc64/tools/regression/lib/libc/gen/test-wordexp.c
projects/ppc64/usr.sbin/mfiutil/mfiutil.8 (props changed)
Modified: projects/ppc64/lib/libc/gen/wordexp.c
==============================================================================
--- projects/ppc64/lib/libc/gen/wordexp.c Fri Oct 23 22:04:18 2009 (r198429)
+++ projects/ppc64/lib/libc/gen/wordexp.c Fri Oct 23 22:07:34 2009 (r198430)
@@ -28,8 +28,10 @@
#include <sys/cdefs.h>
#include <sys/types.h>
#include <sys/wait.h>
+#include <errno.h>
#include <fcntl.h>
#include <paths.h>
+#include <signal.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
@@ -73,6 +75,24 @@ wordexp(const char * __restrict words, w
return (0);
}
+static size_t
+we_read_fully(int fd, char *buffer, size_t len)
+{
+ size_t done;
+ ssize_t nread;
+
+ done = 0;
+ do {
+ nread = _read(fd, buffer + done, len - done);
+ if (nread == -1 && errno == EINTR)
+ continue;
+ if (nread <= 0)
+ break;
+ done += nread;
+ } while (done != len);
+ return done;
+}
+
/*
* we_askshell --
* Use the `wordexp' /bin/sh builtin function to do most of the work
@@ -90,20 +110,31 @@ we_askshell(const char *words, wordexp_t
size_t sofs; /* Offset into we->we_strings */
size_t vofs; /* Offset into we->we_wordv */
pid_t pid; /* Process ID of child */
+ pid_t wpid; /* waitpid return value */
int status; /* Child exit status */
+ int error; /* Our return value */
+ int serrno; /* errno to return */
char *ifs; /* IFS env. var. */
char *np, *p; /* Handy pointers */
char *nstrings; /* Temporary for realloc() */
char **nwv; /* Temporary for realloc() */
+ sigset_t newsigblock, oldsigblock;
+ serrno = errno;
if ((ifs = getenv("IFS")) == NULL)
ifs = " \t\n";
if (pipe(pdes) < 0)
return (WRDE_NOSPACE); /* XXX */
+ (void)sigemptyset(&newsigblock);
+ (void)sigaddset(&newsigblock, SIGCHLD);
+ (void)_sigprocmask(SIG_BLOCK, &newsigblock, &oldsigblock);
if ((pid = fork()) < 0) {
+ serrno = errno;
_close(pdes[0]);
_close(pdes[1]);
+ (void)_sigprocmask(SIG_SETMASK, &oldsigblock, NULL);
+ errno = serrno;
return (WRDE_NOSPACE); /* XXX */
}
else if (pid == 0) {
@@ -114,6 +145,7 @@ we_askshell(const char *words, wordexp_t
int devnull;
char *cmd;
+ (void)_sigprocmask(SIG_SETMASK, &oldsigblock, NULL);
_close(pdes[0]);
if (_dup2(pdes[1], STDOUT_FILENO) < 0)
_exit(1);
@@ -139,10 +171,11 @@ we_askshell(const char *words, wordexp_t
* the expanded words separated by nulls.
*/
_close(pdes[1]);
- if (_read(pdes[0], wbuf, 8) != 8 || _read(pdes[0], bbuf, 8) != 8) {
- _close(pdes[0]);
- _waitpid(pid, &status, 0);
- return (flags & WRDE_UNDEF ? WRDE_BADVAL : WRDE_SYNTAX);
+ if (we_read_fully(pdes[0], wbuf, 8) != 8 ||
+ we_read_fully(pdes[0], bbuf, 8) != 8) {
+ error = flags & WRDE_UNDEF ? WRDE_BADVAL : WRDE_SYNTAX;
+ serrno = errno;
+ goto cleanup;
}
wbuf[8] = bbuf[8] = '\0';
nwords = strtol(wbuf, NULL, 16);
@@ -162,33 +195,38 @@ we_askshell(const char *words, wordexp_t
if ((nwv = realloc(we->we_wordv, (we->we_wordc + 1 +
(flags & WRDE_DOOFFS ? we->we_offs : 0)) *
sizeof(char *))) == NULL) {
- _close(pdes[0]);
- _waitpid(pid, &status, 0);
- return (WRDE_NOSPACE);
+ error = WRDE_NOSPACE;
+ goto cleanup;
}
we->we_wordv = nwv;
if ((nstrings = realloc(we->we_strings, we->we_nbytes)) == NULL) {
- _close(pdes[0]);
- _waitpid(pid, &status, 0);
- return (WRDE_NOSPACE);
+ error = WRDE_NOSPACE;
+ goto cleanup;
}
for (i = 0; i < vofs; i++)
if (we->we_wordv[i] != NULL)
we->we_wordv[i] += nstrings - we->we_strings;
we->we_strings = nstrings;
- if (_read(pdes[0], we->we_strings + sofs, nbytes) != nbytes) {
- _close(pdes[0]);
- _waitpid(pid, &status, 0);
- return (flags & WRDE_UNDEF ? WRDE_BADVAL : WRDE_SYNTAX);
+ if (we_read_fully(pdes[0], we->we_strings + sofs, nbytes) != nbytes) {
+ error = flags & WRDE_UNDEF ? WRDE_BADVAL : WRDE_SYNTAX;
+ serrno = errno;
+ goto cleanup;
}
- if (_waitpid(pid, &status, 0) < 0 || !WIFEXITED(status) ||
- WEXITSTATUS(status) != 0) {
- _close(pdes[0]);
- return (flags & WRDE_UNDEF ? WRDE_BADVAL : WRDE_SYNTAX);
- }
+ error = 0;
+cleanup:
_close(pdes[0]);
+ do
+ wpid = _waitpid(pid, &status, 0);
+ while (wpid < 0 && errno == EINTR);
+ (void)_sigprocmask(SIG_SETMASK, &oldsigblock, NULL);
+ if (error != 0) {
+ errno = serrno;
+ return (error);
+ }
+ if (wpid < 0 || !WIFEXITED(status) || WEXITSTATUS(status) != 0)
+ return (flags & WRDE_UNDEF ? WRDE_BADVAL : WRDE_SYNTAX);
/*
* Break the null-terminated expanded word strings out into
Modified: projects/ppc64/sys/amd64/acpica/acpi_wakecode.S
==============================================================================
--- projects/ppc64/sys/amd64/acpica/acpi_wakecode.S Fri Oct 23 22:04:18 2009 (r198429)
+++ projects/ppc64/sys/amd64/acpica/acpi_wakecode.S Fri Oct 23 22:07:34 2009 (r198430)
@@ -88,6 +88,11 @@ wakeup_start:
movb $0, reset_video - wakeup_start
lcall $0xc000, $3
+ /* When we reach here, int 0x10 should be ready. Hide cursor. */
+ movb $0x01, %ah
+ movb $0x20, %ch
+ int $0x10
+
/* Re-start in case the previous BIOS call clobbers them. */
jmp wakeup_start
1:
Modified: projects/ppc64/sys/boot/i386/zfsboot/zfsboot.c
==============================================================================
--- projects/ppc64/sys/boot/i386/zfsboot/zfsboot.c Fri Oct 23 22:04:18 2009 (r198429)
+++ projects/ppc64/sys/boot/i386/zfsboot/zfsboot.c Fri Oct 23 22:07:34 2009 (r198430)
@@ -474,6 +474,7 @@ probe_drive(struct dsk *dsk, spa_t **spa
slba = hdr.hdr_lba_table;
elba = slba + hdr.hdr_entries / entries_per_sec;
while (slba < elba) {
+ dsk->start = 0;
if (drvread(dsk, sec, slba, 1))
return;
for (part = 0; part < entries_per_sec; part++) {
@@ -494,7 +495,6 @@ probe_drive(struct dsk *dsk, spa_t **spa
*/
dsk = copy_dsk(dsk);
}
- break;
}
}
slba++;
@@ -857,12 +857,13 @@ static void
printf(const char *fmt,...)
{
va_list ap;
- char buf[10];
+ char buf[20];
char *s;
- unsigned u;
+ unsigned long long u;
int c;
int minus;
int prec;
+ int l;
int len;
int pad;
@@ -871,6 +872,7 @@ printf(const char *fmt,...)
if (c == '%') {
minus = 0;
prec = 0;
+ l = 0;
nextfmt:
c = *fmt++;
switch (c) {
@@ -892,6 +894,9 @@ printf(const char *fmt,...)
case 'c':
putchar(va_arg(ap, int));
continue;
+ case 'l':
+ l++;
+ goto nextfmt;
case 's':
s = va_arg(ap, char *);
if (prec) {
@@ -914,7 +919,17 @@ printf(const char *fmt,...)
}
continue;
case 'u':
- u = va_arg(ap, unsigned);
+ switch (l) {
+ case 2:
+ u = va_arg(ap, unsigned long long);
+ break;
+ case 1:
+ u = va_arg(ap, unsigned long);
+ break;
+ default:
+ u = va_arg(ap, unsigned);
+ break;
+ }
s = buf;
do
*s++ = '0' + u % 10U;
Modified: projects/ppc64/sys/boot/zfs/zfs.c
==============================================================================
--- projects/ppc64/sys/boot/zfs/zfs.c Fri Oct 23 22:04:18 2009 (r198429)
+++ projects/ppc64/sys/boot/zfs/zfs.c Fri Oct 23 22:07:34 2009 (r198430)
@@ -100,7 +100,7 @@ zfs_open(const char *upath, struct open_
f->f_fsdata = (void *)fp;
if (spa->spa_root_objset.os_type != DMU_OST_ZFS) {
- printf("Unexpected object set type %lld\n",
+ printf("Unexpected object set type %llu\n",
spa->spa_root_objset.os_type);
rc = EIO;
goto out;
@@ -413,7 +413,7 @@ zfs_dev_init(void)
if (vdev_probe(vdev_read, (void*) (uintptr_t) fd, 0))
close(fd);
- for (slice = 1; slice <= 4; slice++) {
+ for (slice = 1; slice <= 128; slice++) {
sprintf(devname, "disk%dp%d:", unit, slice);
fd = open(devname, O_RDONLY);
if (fd == -1) {
Modified: projects/ppc64/sys/boot/zfs/zfsimpl.c
==============================================================================
--- projects/ppc64/sys/boot/zfs/zfsimpl.c Fri Oct 23 22:04:18 2009 (r198429)
+++ projects/ppc64/sys/boot/zfs/zfsimpl.c Fri Oct 23 22:07:34 2009 (r198430)
@@ -53,6 +53,8 @@ static char *zfs_temp_buf, *zfs_temp_end
#define TEMP_SIZE (1*SPA_MAXBLOCKSIZE)
+static int zio_read(spa_t *spa, const blkptr_t *bp, void *buf);
+
static void
zfs_init(void)
{
@@ -897,6 +899,33 @@ ilog2(int n)
}
static int
+zio_read_gang(spa_t *spa, const blkptr_t *bp, const dva_t *dva, void *buf)
+{
+ zio_gbh_phys_t zio_gb;
+ vdev_t *vdev;
+ int vdevid;
+ off_t offset;
+ int i;
+
+ vdevid = DVA_GET_VDEV(dva);
+ offset = DVA_GET_OFFSET(dva);
+ STAILQ_FOREACH(vdev, &spa->spa_vdevs, v_childlink)
+ if (vdev->v_id == vdevid)
+ break;
+ if (!vdev || !vdev->v_read)
+ return (EIO);
+ if (vdev->v_read(vdev, bp, &zio_gb, offset, SPA_GANGBLOCKSIZE))
+ return (EIO);
+
+ for (i = 0; i < SPA_GBH_NBLKPTRS; i++) {
+ if (zio_read(spa, &zio_gb.zg_blkptr[i], buf))
+ return (EIO);
+ }
+
+ return (0);
+}
+
+static int
zio_read(spa_t *spa, const blkptr_t *bp, void *buf)
{
int cpfunc = BP_GET_COMPRESS(bp);
@@ -920,20 +949,27 @@ zio_read(spa_t *spa, const blkptr_t *bp,
if (!dva->dva_word[0] && !dva->dva_word[1])
continue;
- vdevid = DVA_GET_VDEV(dva);
- offset = DVA_GET_OFFSET(dva);
- STAILQ_FOREACH(vdev, &spa->spa_vdevs, v_childlink)
- if (vdev->v_id == vdevid)
- break;
- if (!vdev || !vdev->v_read)
- continue;
- if (vdev->v_read(vdev, bp, pbuf, offset, psize))
- continue;
+ if (DVA_GET_GANG(dva)) {
+ printf("ZFS: gang block detected!\n");
+ if (zio_read_gang(spa, bp, dva, buf))
+ return (EIO);
+ } else {
+ vdevid = DVA_GET_VDEV(dva);
+ offset = DVA_GET_OFFSET(dva);
+ STAILQ_FOREACH(vdev, &spa->spa_vdevs, v_childlink)
+ if (vdev->v_id == vdevid)
+ break;
+ if (!vdev || !vdev->v_read) {
+ continue;
+ }
+ if (vdev->v_read(vdev, bp, pbuf, offset, psize))
+ continue;
- if (cpfunc != ZIO_COMPRESS_OFF) {
- if (zio_decompress_data(cpfunc, pbuf, psize,
- buf, lsize))
- return (EIO);
+ if (cpfunc != ZIO_COMPRESS_OFF) {
+ if (zio_decompress_data(cpfunc, pbuf, psize,
+ buf, lsize))
+ return (EIO);
+ }
}
return (0);
@@ -1331,13 +1367,13 @@ zfs_mount_dataset(spa_t *spa, uint64_t o
dsl_dataset_phys_t *ds;
if (objset_get_dnode(spa, &spa->spa_mos, objnum, &dataset)) {
- printf("ZFS: can't find dataset %lld\n", objnum);
+ printf("ZFS: can't find dataset %llu\n", objnum);
return (EIO);
}
ds = (dsl_dataset_phys_t *) &dataset.dn_bonus;
if (zio_read(spa, &ds->ds_bp, objset)) {
- printf("ZFS: can't read object set for dataset %lld\n", objnum);
+ printf("ZFS: can't read object set for dataset %llu\n", objnum);
return (EIO);
}
@@ -1367,7 +1403,8 @@ zfs_mount_root(spa_t *spa, objset_phys_t
*/
if (zap_lookup(spa, &dir, DMU_POOL_PROPS, &props) == 0
&& objset_get_dnode(spa, &spa->spa_mos, props, &propdir) == 0
- && zap_lookup(spa, &propdir, "bootfs", &bootfs) == 0)
+ && zap_lookup(spa, &propdir, "bootfs", &bootfs) == 0
+ && bootfs != 0)
return zfs_mount_dataset(spa, bootfs, objset);
/*
@@ -1425,7 +1462,7 @@ zfs_lookup(spa_t *spa, const char *upath
int symlinks_followed = 0;
if (spa->spa_root_objset.os_type != DMU_OST_ZFS) {
- printf("ZFS: unexpected object set type %lld\n",
+ printf("ZFS: unexpected object set type %llu\n",
spa->spa_root_objset.os_type);
return (EIO);
}
Modified: projects/ppc64/sys/cddl/boot/zfs/zfsimpl.h
==============================================================================
--- projects/ppc64/sys/cddl/boot/zfs/zfsimpl.h Fri Oct 23 22:04:18 2009 (r198429)
+++ projects/ppc64/sys/cddl/boot/zfs/zfsimpl.h Fri Oct 23 22:07:34 2009 (r198430)
@@ -374,6 +374,24 @@ typedef struct vdev_label {
#define VDEV_LABEL_END_SIZE (2 * sizeof (vdev_label_t))
#define VDEV_LABELS 4
+/*
+ * Gang block headers are self-checksumming and contain an array
+ * of block pointers.
+ */
+#define SPA_GANGBLOCKSIZE SPA_MINBLOCKSIZE
+#define SPA_GBH_NBLKPTRS ((SPA_GANGBLOCKSIZE - \
+ sizeof (zio_block_tail_t)) / sizeof (blkptr_t))
+#define SPA_GBH_FILLER ((SPA_GANGBLOCKSIZE - \
+ sizeof (zio_block_tail_t) - \
+ (SPA_GBH_NBLKPTRS * sizeof (blkptr_t))) /\
+ sizeof (uint64_t))
+
+typedef struct zio_gbh {
+ blkptr_t zg_blkptr[SPA_GBH_NBLKPTRS];
+ uint64_t zg_filler[SPA_GBH_FILLER];
+ zio_block_tail_t zg_tail;
+} zio_gbh_phys_t;
+
enum zio_checksum {
ZIO_CHECKSUM_INHERIT = 0,
ZIO_CHECKSUM_ON,
Modified: projects/ppc64/sys/dev/ata/ata-queue.c
==============================================================================
--- projects/ppc64/sys/dev/ata/ata-queue.c Fri Oct 23 22:04:18 2009 (r198429)
+++ projects/ppc64/sys/dev/ata/ata-queue.c Fri Oct 23 22:07:34 2009 (r198430)
@@ -150,15 +150,11 @@ ata_atapicmd(device_t dev, u_int8_t *ccb
int count, int flags, int timeout)
{
struct ata_request *request = ata_alloc_request();
- struct ata_device *atadev = device_get_softc(dev);
int error = ENOMEM;
if (request) {
request->dev = dev;
- if ((atadev->param.config & ATA_PROTO_MASK) == ATA_PROTO_ATAPI_12)
- bcopy(ccb, request->u.atapi.ccb, 12);
- else
- bcopy(ccb, request->u.atapi.ccb, 16);
+ bcopy(ccb, request->u.atapi.ccb, 16);
request->data = data;
request->bytecount = count;
request->transfersize = min(request->bytecount, 65534);
Modified: projects/ppc64/sys/dev/ata/atapi-cd.c
==============================================================================
--- projects/ppc64/sys/dev/ata/atapi-cd.c Fri Oct 23 22:04:18 2009 (r198429)
+++ projects/ppc64/sys/dev/ata/atapi-cd.c Fri Oct 23 22:07:34 2009 (r198430)
@@ -863,9 +863,7 @@ acd_strategy(struct bio *bp)
}
request->dev = dev;
request->bio = bp;
- bcopy(ccb, request->u.atapi.ccb,
- (atadev->param.config & ATA_PROTO_MASK) ==
- ATA_PROTO_ATAPI_12 ? 16 : 12);
+ bcopy(ccb, request->u.atapi.ccb, 16);
request->data = bp->bio_data;
request->bytecount = count * blocksize;
request->transfersize = min(request->bytecount, 65534);
Modified: projects/ppc64/sys/dev/ata/atapi-fd.c
==============================================================================
--- projects/ppc64/sys/dev/ata/atapi-fd.c Fri Oct 23 22:04:18 2009 (r198429)
+++ projects/ppc64/sys/dev/ata/atapi-fd.c Fri Oct 23 22:07:34 2009 (r198430)
@@ -240,9 +240,7 @@ afd_strategy(struct bio *bp)
}
request->dev = dev;
request->bio = bp;
- bcopy(ccb, request->u.atapi.ccb,
- (atadev->param.config & ATA_PROTO_MASK) ==
- ATA_PROTO_ATAPI_12 ? 16 : 12);
+ bcopy(ccb, request->u.atapi.ccb, 16);
request->data = bp->bio_data;
request->bytecount = count * fdp->sectorsize;
request->transfersize = min(request->bytecount, 65534);
Modified: projects/ppc64/sys/dev/ata/atapi-tape.c
==============================================================================
--- projects/ppc64/sys/dev/ata/atapi-tape.c Fri Oct 23 22:04:18 2009 (r198429)
+++ projects/ppc64/sys/dev/ata/atapi-tape.c Fri Oct 23 22:07:34 2009 (r198430)
@@ -373,7 +373,6 @@ static void
ast_strategy(struct bio *bp)
{
device_t dev = bp->bio_dev->si_drv1;
- struct ata_device *atadev = device_get_softc(dev);
struct ast_softc *stp = device_get_ivars(dev);
struct ata_request *request;
u_int32_t blkcount;
@@ -426,9 +425,7 @@ ast_strategy(struct bio *bp)
}
request->dev = dev;
request->driver = bp;
- bcopy(ccb, request->u.atapi.ccb,
- (atadev->param.config & ATA_PROTO_MASK) ==
- ATA_PROTO_ATAPI_12 ? 16 : 12);
+ bcopy(ccb, request->u.atapi.ccb, 16);
request->data = bp->bio_data;
request->bytecount = blkcount * stp->blksize;
request->transfersize = min(request->bytecount, 65534);
Modified: projects/ppc64/sys/dev/fb/vesa.c
==============================================================================
--- projects/ppc64/sys/dev/fb/vesa.c Fri Oct 23 22:04:18 2009 (r198429)
+++ projects/ppc64/sys/dev/fb/vesa.c Fri Oct 23 22:07:34 2009 (r198430)
@@ -74,8 +74,7 @@ typedef struct adp_state adp_state_t;
/* VESA video adapter */
static video_adapter_t *vesa_adp = NULL;
-static int vesa_state_buf_size = 0;
-#define VESA_BIOS_BUFSIZE (3 * PAGE_SIZE)
+static ssize_t vesa_state_buf_size = -1;
/* VESA functions */
#if 0
@@ -188,7 +187,7 @@ static int vesa_bios_load_palette2(int s
#define STATE_REG (1<<3)
#define STATE_MOST (STATE_HW | STATE_DATA | STATE_REG)
#define STATE_ALL (STATE_HW | STATE_DATA | STATE_DAC | STATE_REG)
-static int vesa_bios_state_buf_size(void);
+static ssize_t vesa_bios_state_buf_size(void);
static int vesa_bios_save_restore(int code, void *p, size_t size);
static int vesa_bios_get_line_length(void);
static int vesa_bios_set_line_length(int pixel, int *bytes, int *lines);
@@ -282,6 +281,10 @@ vesa_bios_post(void)
}
regs.R_DL = 0x80;
x86bios_call(®s, 0xc000, 0x0003);
+
+ if (x86bios_get_intr(0x10) == 0)
+ return (1);
+
return (0);
}
@@ -532,7 +535,7 @@ vesa_bios_load_palette2(int start, int c
}
#endif
-static int
+static ssize_t
vesa_bios_state_buf_size(void)
{
x86regs_t regs;
@@ -557,9 +560,6 @@ vesa_bios_save_restore(int code, void *p
uint32_t offs;
void *buf;
- if (size > VESA_BIOS_BUFSIZE)
- return (1);
-
if (code != STATE_SAVE && code != STATE_LOAD)
return (1);
@@ -808,12 +808,11 @@ vesa_bios_init(void)
if (x86bios_get_intr(0x10) == 0) {
if (vesa_bios_post() != 0)
return (1);
- offs = x86bios_get_intr(0x10);
- if (offs == 0)
- return (1);
- if (bootverbose)
+ if (bootverbose) {
+ offs = x86bios_get_intr(0x10);
printf("VESA: interrupt vector installed (0x%x)\n",
BIOS_SADDRTOLADDR(offs));
+ }
}
x86bios_init_regs(®s);
@@ -879,6 +878,21 @@ vesa_bios_init(void)
if (vesa_bios_get_mode(vesa_vmodetab[i], &vmode))
continue;
+ vmode.v_modeattr = le16toh(vmode.v_modeattr);
+ vmode.v_wgran = le16toh(vmode.v_wgran);
+ vmode.v_wsize = le16toh(vmode.v_wsize);
+ vmode.v_waseg = le16toh(vmode.v_waseg);
+ vmode.v_wbseg = le16toh(vmode.v_wbseg);
+ vmode.v_posfunc = le32toh(vmode.v_posfunc);
+ vmode.v_bpscanline = le16toh(vmode.v_bpscanline);
+ vmode.v_width = le16toh(vmode.v_width);
+ vmode.v_height = le16toh(vmode.v_height);
+ vmode.v_lfb = le32toh(vmode.v_lfb);
+ vmode.v_offscreen = le32toh(vmode.v_offscreen);
+ vmode.v_offscreensize = le16toh(vmode.v_offscreensize);
+ vmode.v_linbpscanline = le16toh(vmode.v_linbpscanline);
+ vmode.v_maxpixelclock = le32toh(vmode.v_maxpixelclock);
+
/* reject unsupported modes */
#if 0
if ((vmode.v_modeattr & (V_MODESUPP | V_MODEOPTINFO
@@ -1417,11 +1431,14 @@ vesa_save_state(video_adapter_t *adp, vo
if (adp != vesa_adp)
return ((*prevvidsw->save_state)(adp, p, size));
- if (vesa_state_buf_size == 0)
+ if (vesa_state_buf_size == -1) {
vesa_state_buf_size = vesa_bios_state_buf_size();
+ if (vesa_state_buf_size == 0)
+ return (1);
+ }
if (size == 0)
- return (sizeof(int) + vesa_state_buf_size);
- else if (size < (sizeof(int) + vesa_state_buf_size))
+ return (offsetof(adp_state_t, regs) + vesa_state_buf_size);
+ else if (size < (offsetof(adp_state_t, regs) + vesa_state_buf_size))
return (1);
((adp_state_t *)p)->sig = V_STATE_SIG;
@@ -1438,22 +1455,36 @@ vesa_load_state(video_adapter_t *adp, vo
if ((adp != vesa_adp) || (((adp_state_t *)p)->sig != V_STATE_SIG))
return ((*prevvidsw->load_state)(adp, p));
+ if (vesa_state_buf_size <= 0)
+ return (1);
+
+ /*
+ * If the current mode is not the same, probably it was powered down.
+ * Try BIOS POST to restore a sane state.
+ */
+ mode = vesa_bios_get_current_mode();
+ if (mode >= 0 && (mode & 0x1ff) != adp->va_mode &&
+ VESA_MODE(adp->va_mode))
+ (void)vesa_bios_post();
+
ret = vesa_bios_save_restore(STATE_LOAD, ((adp_state_t *)p)->regs,
vesa_state_buf_size);
/*
- * If the current mode is not restored properly, try BIOS POST and
- * force setting the mode.
+ * If the desired mode is not restored, force setting the mode.
*/
- flags = adp->va_info.vi_flags;
- if (!(flags & V_INFO_GRAPHICS))
- flags &= ~V_INFO_LINEAR;
- mode = adp->va_mode | ((flags & V_INFO_LINEAR) ? 0x4000 : 0);
- if (vesa_bios_get_current_mode() != mode && vesa_bios_post() == 0 &&
- x86bios_get_intr(0x10) != 0) {
- int10_set_mode(adp->va_initial_bios_mode);
- vesa_bios_set_mode(mode);
+ mode = vesa_bios_get_current_mode();
+ if (mode >= 0 && (mode & 0x1ff) != adp->va_mode &&
+ VESA_MODE(adp->va_mode)) {
+ mode = adp->va_mode;
+ flags = adp->va_info.vi_flags;
+ if ((flags & V_INFO_GRAPHICS) != 0 &&
+ (flags & V_INFO_LINEAR) != 0)
+ mode |= 0x4000;
+ (void)vesa_bios_set_mode(mode);
+ (void)(*vidsw[adp->va_index]->set_hw_cursor)(adp, -1, -1);
}
+
return (ret);
}
Modified: projects/ppc64/sys/dev/fb/vesa.h
==============================================================================
--- projects/ppc64/sys/dev/fb/vesa.h Fri Oct 23 22:04:18 2009 (r198429)
+++ projects/ppc64/sys/dev/fb/vesa.h Fri Oct 23 22:07:34 2009 (r198430)
@@ -108,7 +108,21 @@ struct vesa_mode
u_int32_t v_lfb;
u_int32_t v_offscreen;
u_int16_t v_offscreensize;
-};
+ /* 3.0 implementations */
+ u_int16_t v_linbpscanline;
+ u_int8_t v_bankipages;
+ u_int8_t v_linipages;
+ u_int8_t v_linredmasksize;
+ u_int8_t v_linredfieldpos;
+ u_int8_t v_lingreenmasksize;
+ u_int8_t v_lingreenfieldpos;
+ u_int8_t v_linbluemasksize;
+ u_int8_t v_linbluefieldpos;
+ u_int8_t v_linresmasksize;
+ u_int8_t v_linresfieldpos;
+ u_int32_t v_maxpixelclock;
+ u_int8_t v_reserved1[190];
+} __packed;
#ifdef _KERNEL
Modified: projects/ppc64/sys/dev/siis/siis.c
==============================================================================
--- projects/ppc64/sys/dev/siis/siis.c Fri Oct 23 22:04:18 2009 (r198429)
+++ projects/ppc64/sys/dev/siis/siis.c Fri Oct 23 22:07:34 2009 (r198430)
@@ -80,7 +80,6 @@ static void siis_portinit(device_t dev);
static int siis_wait_ready(device_t dev, int t);
static int siis_sata_connect(struct siis_channel *ch);
-static int siis_sata_phy_reset(device_t dev);
static void siis_issue_read_log(device_t dev);
static void siis_process_read_log(device_t dev, union ccb *ccb);
@@ -1250,16 +1249,27 @@ siis_portinit(device_t dev)
siis_wait_ready(dev, 1000);
}
-#if 0
-static void
+static int
siis_devreset(device_t dev)
{
struct siis_channel *ch = device_get_softc(dev);
+ int timeout = 0;
+ uint32_t val;
ATA_OUTL(ch->r_mem, SIIS_P_CTLSET, SIIS_P_CTL_DEV_RESET);
- siis_wait_ready(dev, 1000);
+ while (((val = ATA_INL(ch->r_mem, SIIS_P_STS)) &
+ SIIS_P_CTL_DEV_RESET) != 0) {
+ DELAY(1000);
+ if (timeout++ > 100) {
+ device_printf(dev, "device reset stuck (timeout %dms) "
+ "status = %08x\n", timeout, val);
+ return (EBUSY);
+ }
+ }
+ if (bootverbose)
+ device_printf(dev, "device reset time=%dms\n", timeout);
+ return (0);
}
-#endif
static int
siis_wait_ready(device_t dev, int t)
@@ -1287,6 +1297,7 @@ siis_reset(device_t dev)
{
struct siis_channel *ch = device_get_softc(dev);
int i;
+ uint32_t val;
if (bootverbose)
device_printf(dev, "SIIS reset...\n");
@@ -1303,10 +1314,7 @@ siis_reset(device_t dev)
}
xpt_done(fccb);
}
- /* Disable port interrupts */
- ATA_OUTL(ch->r_mem, SIIS_P_IECLR, 0x0000FFFF);
- /* Kill the engine and requeue all running commands. */
- siis_portinit(dev);
+ /* Requeue all running commands. */
for (i = 0; i < SIIS_MAX_SLOTS; i++) {
/* Do we have a running request on slot? */
if (ch->slot[i].state < SIIS_SLOT_RUNNING)
@@ -1314,8 +1322,23 @@ siis_reset(device_t dev)
/* XXX; Commands in loading state. */
siis_end_transaction(&ch->slot[i], SIIS_ERR_INNOCENT);
}
+ /* Disable port interrupts */
+ ATA_OUTL(ch->r_mem, SIIS_P_IECLR, 0x0000FFFF);
+ /* Set speed limit. */
+ if (ch->sata_rev == 1)
+ val = ATA_SC_SPD_SPEED_GEN1;
+ else if (ch->sata_rev == 2)
+ val = ATA_SC_SPD_SPEED_GEN2;
+ else if (ch->sata_rev == 3)
+ val = ATA_SC_SPD_SPEED_GEN3;
+ else
+ val = 0;
+ ATA_OUTL(ch->r_mem, SIIS_P_SCTL,
+ ATA_SC_DET_IDLE | val | ((ch->pm_level > 0) ? 0 :
+ (ATA_SC_IPM_DIS_PARTIAL | ATA_SC_IPM_DIS_SLUMBER)));
+ siis_devreset(dev);
/* Reset and reconnect PHY, */
- if (!siis_sata_phy_reset(dev)) {
+ if (!siis_sata_connect(ch)) {
ch->devices = 0;
/* Enable port interrupts */
ATA_OUTL(ch->r_mem, SIIS_P_IESET, SIIS_P_IX_ENABLED);
@@ -1327,9 +1350,8 @@ siis_reset(device_t dev)
return;
}
/* Wait for clearing busy status. */
- if (siis_wait_ready(dev, 10000)) {
+ if (siis_wait_ready(dev, 10000))
device_printf(dev, "device ready timeout\n");
- }
ch->devices = 1;
/* Enable port interrupts */
ATA_OUTL(ch->r_mem, SIIS_P_IS, 0xFFFFFFFF);
@@ -1420,32 +1442,6 @@ siis_sata_connect(struct siis_channel *c
return (1);
}
-static int
-siis_sata_phy_reset(device_t dev)
-{
- struct siis_channel *ch = device_get_softc(dev);
- uint32_t val;
-
- if (bootverbose)
- device_printf(dev, "hardware reset ...\n");
- ATA_OUTL(ch->r_mem, SIIS_P_SCTL, ATA_SC_IPM_DIS_PARTIAL |
- ATA_SC_IPM_DIS_SLUMBER | ATA_SC_DET_RESET);
- DELAY(50000);
- if (ch->sata_rev == 1)
- val = ATA_SC_SPD_SPEED_GEN1;
- else if (ch->sata_rev == 2)
- val = ATA_SC_SPD_SPEED_GEN2;
- else if (ch->sata_rev == 3)
- val = ATA_SC_SPD_SPEED_GEN3;
- else
- val = 0;
- ATA_OUTL(ch->r_mem, SIIS_P_SCTL,
- ATA_SC_DET_IDLE | val | ((ch->pm_level > 0) ? 0 :
- (ATA_SC_IPM_DIS_PARTIAL | ATA_SC_IPM_DIS_SLUMBER)));
- DELAY(50000);
- return (siis_sata_connect(ch));
-}
-
static void
siisaction(struct cam_sim *sim, union ccb *ccb)
{
Modified: projects/ppc64/sys/dev/syscons/syscons.c
==============================================================================
--- projects/ppc64/sys/dev/syscons/syscons.c Fri Oct 23 22:04:18 2009 (r198429)
+++ projects/ppc64/sys/dev/syscons/syscons.c Fri Oct 23 22:07:34 2009 (r198430)
@@ -343,17 +343,46 @@ sc_alloc_tty(int index, int devnum)
return (tp);
}
+#ifdef SC_PIXEL_MODE
+static int
+sc_initial_mode(video_adapter_t *adp, int unit)
+{
+ video_info_t info;
+ int depth, vmode;
+ int i;
+
+ vmode = 0;
+ (void)resource_int_value("sc", unit, "vesa_mode", &vmode);
+ if (vmode < M_VESA_BASE || vmode > M_VESA_MODE_MAX)
+ vmode = 0;
+
+ /*
+ * If the default mode is not supported, search for an available
+ * 800x600 graphics mode with the highest color depth.
+ */
+ if (vmode == 0 || vidd_get_info(adp, vmode, &info) != 0) {
+ depth = vmode = 0;
+ for (i = M_VESA_BASE; i <= M_VESA_MODE_MAX; i++)
+ if (vidd_get_info(adp, i, &info) == 0 &&
+ (info.vi_flags & V_INFO_GRAPHICS) != 0 &&
+ info.vi_width == 800 && info.vi_height == 600 &&
+ info.vi_depth > depth) {
+ vmode = i;
+ depth = info.vi_depth;
+ }
+ }
+
+ return (vmode);
+}
+#endif
+
int
sc_attach_unit(int unit, int flags)
{
sc_softc_t *sc;
scr_stat *scp;
-#ifdef SC_PIXEL_MODE
- video_info_t info;
-#endif
int vc;
struct cdev *dev;
- unsigned int vmode = 0;
flags &= ~SC_KERNEL_CONSOLE;
@@ -374,25 +403,24 @@ sc_attach_unit(int unit, int flags)
if (sc_console == NULL) /* sc_console_unit < 0 */
sc_console = scp;
- (void)resource_int_value("sc", unit, "vesa_mode", &vmode);
- if (vmode < M_VESA_BASE || vmode > M_VESA_MODE_MAX)
- vmode = M_VESA_FULL_800;
-
#ifdef SC_PIXEL_MODE
- if ((sc->config & SC_VESAMODE)
- && (vidd_get_info(sc->adp, vmode, &info) == 0)) {
+ if ((sc->config & SC_VESAMODE) != 0) {
+ int vmode;
+ vmode = sc_initial_mode(sc->adp, unit);
+ if (vmode >= M_VESA_BASE) {
#ifdef DEV_SPLASH
- if (sc->flags & SC_SPLASH_SCRN)
- splash_term(sc->adp);
+ if (sc->flags & SC_SPLASH_SCRN)
+ splash_term(sc->adp);
#endif
- sc_set_graphics_mode(scp, NULL, vmode);
- sc_set_pixel_mode(scp, NULL, 0, 0, 16, 8);
- sc->initial_mode = vmode;
+ sc_set_graphics_mode(scp, NULL, vmode);
+ sc_set_pixel_mode(scp, NULL, 0, 0, 16, 8);
+ sc->initial_mode = vmode;
#ifdef DEV_SPLASH
- /* put up the splash again! */
- if (sc->flags & SC_SPLASH_SCRN)
- splash_init(sc->adp, scsplash_callback, sc);
+ /* put up the splash again! */
+ if (sc->flags & SC_SPLASH_SCRN)
+ splash_init(sc->adp, scsplash_callback, sc);
#endif
+ }
}
#endif /* SC_PIXEL_MODE */
Modified: projects/ppc64/sys/kern/kern_exec.c
==============================================================================
--- projects/ppc64/sys/kern/kern_exec.c Fri Oct 23 22:04:18 2009 (r198429)
+++ projects/ppc64/sys/kern/kern_exec.c Fri Oct 23 22:07:34 2009 (r198430)
@@ -326,7 +326,7 @@ do_execve(td, args, mac_p)
struct ucred *newcred = NULL, *oldcred;
struct uidinfo *euip;
register_t *stack_base;
- int error, len = 0, i;
+ int error, i;
struct image_params image_params, *imgp;
struct vattr attr;
int (*img_first)(struct image_params *);
@@ -602,18 +602,12 @@ interpret:
execsigs(p);
/* name this process - nameiexec(p, ndp) */
- if (args->fname) {
- len = min(nd.ni_cnd.cn_namelen,MAXCOMLEN);
- bcopy(nd.ni_cnd.cn_nameptr, p->p_comm, len);
- } else {
- if (vn_commname(binvp, p->p_comm, MAXCOMLEN + 1) == 0)
- len = MAXCOMLEN;
- else {
- len = sizeof(fexecv_proc_title);
- bcopy(fexecv_proc_title, p->p_comm, len);
- }
- }
- p->p_comm[len] = 0;
+ bzero(p->p_comm, sizeof(p->p_comm));
+ if (args->fname)
+ bcopy(nd.ni_cnd.cn_nameptr, p->p_comm,
+ min(nd.ni_cnd.cn_namelen, MAXCOMLEN));
+ else if (vn_commname(binvp, p->p_comm, sizeof(p->p_comm)) != 0)
+ bcopy(fexecv_proc_title, p->p_comm, sizeof(fexecv_proc_title));
bcopy(p->p_comm, td->td_name, sizeof(td->td_name));
/*
Modified: projects/ppc64/sys/kern/kern_ktrace.c
==============================================================================
--- projects/ppc64/sys/kern/kern_ktrace.c Fri Oct 23 22:04:18 2009 (r198429)
+++ projects/ppc64/sys/kern/kern_ktrace.c Fri Oct 23 22:07:34 2009 (r198430)
@@ -256,6 +256,10 @@ ktrace_resize_pool(u_int newsize)
return (ktr_requestpool);
}
+/* ktr_getrequest() assumes that ktr_comm[] is the same size as td_name[]. */
+CTASSERT(sizeof(((struct ktr_header *)NULL)->ktr_comm) ==
+ (sizeof((struct thread *)NULL)->td_name));
+
static struct ktr_request *
ktr_getrequest(int type)
{
@@ -283,7 +287,8 @@ ktr_getrequest(int type)
microtime(&req->ktr_header.ktr_time);
req->ktr_header.ktr_pid = p->p_pid;
req->ktr_header.ktr_tid = td->td_tid;
- bcopy(td->td_name, req->ktr_header.ktr_comm, MAXCOMLEN + 1);
+ bcopy(td->td_name, req->ktr_header.ktr_comm,
+ sizeof(req->ktr_header.ktr_comm));
req->ktr_buffer = NULL;
req->ktr_header.ktr_len = 0;
} else {
Modified: projects/ppc64/sys/kern/kern_shutdown.c
==============================================================================
--- projects/ppc64/sys/kern/kern_shutdown.c Fri Oct 23 22:04:18 2009 (r198429)
+++ projects/ppc64/sys/kern/kern_shutdown.c Fri Oct 23 22:07:34 2009 (r198430)
@@ -618,16 +618,14 @@ void
kproc_shutdown(void *arg, int howto)
{
struct proc *p;
- char procname[MAXCOMLEN + 1];
int error;
if (panicstr)
return;
p = (struct proc *)arg;
- strlcpy(procname, p->p_comm, sizeof(procname));
printf("Waiting (max %d seconds) for system process `%s' to stop...",
- kproc_shutdown_wait, procname);
+ kproc_shutdown_wait, p->p_comm);
error = kproc_suspend(p, kproc_shutdown_wait * hz);
if (error == EWOULDBLOCK)
@@ -640,16 +638,14 @@ void
kthread_shutdown(void *arg, int howto)
{
struct thread *td;
- char procname[MAXCOMLEN + 1];
int error;
if (panicstr)
return;
td = (struct thread *)arg;
- strlcpy(procname, td->td_name, sizeof(procname));
printf("Waiting (max %d seconds) for system thread `%s' to stop...",
- kproc_shutdown_wait, procname);
+ kproc_shutdown_wait, td->td_name);
error = kthread_suspend(td, kproc_shutdown_wait * hz);
if (error == EWOULDBLOCK)
Modified: projects/ppc64/sys/kern/subr_bus.c
==============================================================================
--- projects/ppc64/sys/kern/subr_bus.c Fri Oct 23 22:04:18 2009 (r198429)
+++ projects/ppc64/sys/kern/subr_bus.c Fri Oct 23 22:07:34 2009 (r198430)
@@ -3861,8 +3861,8 @@ int
bus_describe_intr(device_t dev, struct resource *irq, void *cookie,
const char *fmt, ...)
{
- char descr[MAXCOMLEN];
va_list ap;
+ char descr[MAXCOMLEN + 1];
if (dev->parent == NULL)
return (EINVAL);
Modified: projects/ppc64/sys/kern/subr_taskqueue.c
==============================================================================
--- projects/ppc64/sys/kern/subr_taskqueue.c Fri Oct 23 22:04:18 2009 (r198429)
+++ projects/ppc64/sys/kern/subr_taskqueue.c Fri Oct 23 22:07:34 2009 (r198430)
@@ -301,7 +301,7 @@ taskqueue_start_threads(struct taskqueue
struct thread *td;
struct taskqueue *tq;
int i, error;
- char ktname[MAXCOMLEN];
+ char ktname[MAXCOMLEN + 1];
if (count <= 0)
return (EINVAL);
@@ -309,7 +309,7 @@ taskqueue_start_threads(struct taskqueue
tq = *tqp;
va_start(ap, name);
- vsnprintf(ktname, MAXCOMLEN, name, ap);
+ vsnprintf(ktname, sizeof(ktname), name, ap);
va_end(ap);
tq->tq_threads = malloc(sizeof(struct thread *) * count, M_TASKQUEUE,
Modified: projects/ppc64/sys/net/bpf.c
==============================================================================
--- projects/ppc64/sys/net/bpf.c Fri Oct 23 22:04:18 2009 (r198429)
+++ projects/ppc64/sys/net/bpf.c Fri Oct 23 22:07:34 2009 (r198430)
*** DIFF OUTPUT TRUNCATED AT 1000 LINES ***
More information about the svn-src-projects
mailing list