Merging ^/head r277777 through r277803.
This commit is contained in:
commit
76f411ce48
@ -444,14 +444,26 @@ op_minus(struct val *a, struct val *b)
|
||||
return (r);
|
||||
}
|
||||
|
||||
/*
|
||||
* We depend on undefined behaviour giving a result (in r).
|
||||
* To test this result, pass it as volatile. This prevents
|
||||
* optimizing away of the test based on the undefined behaviour.
|
||||
*/
|
||||
void
|
||||
assert_times(intmax_t a, intmax_t b, intmax_t r)
|
||||
assert_times(intmax_t a, intmax_t b, volatile intmax_t r)
|
||||
{
|
||||
/*
|
||||
* if first operand is 0, no overflow is possible,
|
||||
* else result of division test must match second operand
|
||||
* If the first operand is 0, no overflow is possible,
|
||||
* else the result of the division test must match the
|
||||
* second operand.
|
||||
*
|
||||
* Be careful to avoid overflow in the overflow test, as
|
||||
* in assert_div(). Overflow in division would kill us
|
||||
* with a SIGFPE before getting the test wrong. In old
|
||||
* buggy versions, optimization used to give a null test
|
||||
* instead of a SIGFPE.
|
||||
*/
|
||||
if (a != 0 && r / a != b)
|
||||
if ((a == -1 && b == INTMAX_MIN) || (a != 0 && r / a != b))
|
||||
errx(ERR_EXIT, "overflow");
|
||||
}
|
||||
|
||||
|
@ -20,7 +20,7 @@
|
||||
ifdef(`__win32__', `dnl', `dnl
|
||||
ifdef(`TEMPFILE', `dnl', `define(`TEMPFILE', maketemp(/tmp/cfXXXXXX))dnl
|
||||
syscmd(sh _CF_DIR_`'sh/makeinfo.sh _CF_DIR_ > TEMPFILE)dnl
|
||||
include(TEMPFILE)dnl
|
||||
ifdef(`_NO_MAKEINFO_',, `include(TEMPFILE)')dnl
|
||||
syscmd(rm -f TEMPFILE)dnl')')
|
||||
#####
|
||||
######################################################################
|
||||
|
@ -537,6 +537,7 @@ ip_print(netdissect_options *ndo,
|
||||
struct protoent *proto;
|
||||
|
||||
ipds->ip = (const struct ip *)bp;
|
||||
ND_TCHECK(ipds->ip->ip_vhl);
|
||||
if (IP_V(ipds->ip) != 4) { /* print version if != 4 */
|
||||
ND_PRINT((ndo, "IP%u ", IP_V(ipds->ip)));
|
||||
if (IP_V(ipds->ip) == 6)
|
||||
@ -545,10 +546,7 @@ ip_print(netdissect_options *ndo,
|
||||
else if (!ndo->ndo_eflag)
|
||||
ND_PRINT((ndo, "IP "));
|
||||
|
||||
if ((u_char *)(ipds->ip + 1) > ndo->ndo_snapend) {
|
||||
ND_PRINT((ndo, "%s", tstr));
|
||||
return;
|
||||
}
|
||||
ND_TCHECK(*ipds->ip);
|
||||
if (length < sizeof (struct ip)) {
|
||||
ND_PRINT((ndo, "truncated-ip %u", length));
|
||||
return;
|
||||
@ -677,6 +675,11 @@ ip_print(netdissect_options *ndo,
|
||||
ND_PRINT((ndo, " ip-proto-%d", ipds->ip->ip_p));
|
||||
}
|
||||
}
|
||||
return;
|
||||
|
||||
trunc:
|
||||
ND_PRINT((ndo, "%s", tstr));
|
||||
return;
|
||||
}
|
||||
|
||||
void
|
||||
|
@ -64,7 +64,7 @@ sl_if_print(netdissect_options *ndo,
|
||||
register u_int length = h->len;
|
||||
register const struct ip *ip;
|
||||
|
||||
if (caplen < SLIP_HDRLEN) {
|
||||
if (caplen < SLIP_HDRLEN || length < SLIP_HDRLEN) {
|
||||
ND_PRINT((ndo, "%s", tstr));
|
||||
return (caplen);
|
||||
}
|
||||
|
@ -17,7 +17,8 @@ M4FILES!= find ${SENDMAIL_CF_DIR} -type f -name '*.m4' -print
|
||||
|
||||
.mc.cf: ${M4FILES}
|
||||
${RM} ${.TARGET}
|
||||
${M4} -D_CF_DIR_=${SENDMAIL_CF_DIR}/ ${SENDMAIL_M4_FLAGS} \
|
||||
${M4} -D_CF_DIR_=${SENDMAIL_CF_DIR}/ -D_NO_MAKEINFO_ \
|
||||
${SENDMAIL_M4_FLAGS} \
|
||||
${SENDMAIL_CF_DIR}/m4/cf.m4 ${.IMPSRC} > ${.TARGET}
|
||||
${CHMOD} ${ROMODE} ${.TARGET}
|
||||
|
||||
|
@ -72,7 +72,7 @@ pt_ucontext_to_fpreg(const ucontext_t *uc, struct fpreg *r)
|
||||
memcpy(r, &uc->uc_mcontext.mc_fpstate, sizeof(struct save87));
|
||||
else {
|
||||
int i;
|
||||
struct savexmm *sx = (struct savexmm *)&uc->uc_mcontext.mc_fpstate;
|
||||
const struct savexmm *sx = (const struct savexmm *)&uc->uc_mcontext.mc_fpstate;
|
||||
memcpy(&r->fpr_env, &sx->sv_env, sizeof(r->fpr_env));
|
||||
for (i = 0; i < 8; ++i)
|
||||
memcpy(&r->fpr_acc[i], &sx->sv_fp[i].fp_acc, 10);
|
||||
|
@ -25,7 +25,7 @@
|
||||
.\"
|
||||
.\" $FreeBSD$
|
||||
.\"
|
||||
.Dd January 14, 2010
|
||||
.Dd January 27, 2015
|
||||
.Dt GMOUNTVER 8
|
||||
.Os
|
||||
.Sh NAME
|
||||
@ -110,7 +110,7 @@ GEOM class.
|
||||
This can be set to a number between 0 and 3 inclusive.
|
||||
If set to 0 minimal debug information is printed, and if set to 3 the
|
||||
maximum amount of debug information is printed.
|
||||
.It Va kern.geom.mountver.check.check_ident : No 1
|
||||
.It Va kern.geom.mountver.check_ident : No 1
|
||||
This can be set to 0 or 1.
|
||||
If set to 0,
|
||||
.Nm
|
||||
|
@ -1,5 +1,6 @@
|
||||
.\"
|
||||
.\" Copyright (c) 2003 Bruce M Simpson <bms@spc.org>
|
||||
.\" Copyright (c) 2014 The FreeBSD Foundation
|
||||
.\" All rights reserved.
|
||||
.\"
|
||||
.\" Redistribution and use in source and binary forms, with or without
|
||||
@ -25,7 +26,7 @@
|
||||
.\"
|
||||
.\" $FreeBSD$
|
||||
.\"
|
||||
.Dd July 21, 2003
|
||||
.Dd January 27, 2015
|
||||
.Dt PMAP_ENTER 9
|
||||
.Os
|
||||
.Sh NAME
|
||||
@ -35,34 +36,129 @@
|
||||
.In sys/param.h
|
||||
.In vm/vm.h
|
||||
.In vm/pmap.h
|
||||
.Ft void
|
||||
.Ft int
|
||||
.Fo pmap_enter
|
||||
.Fa "pmap_t pmap" "vm_offset_t va" "vm_page_t p" "vm_prot_t prot"
|
||||
.Fa "boolean_t wired"
|
||||
.Fa "pmap_t pmap" "vm_offset_t va" "vm_page_t m" "vm_prot_t prot"
|
||||
.Fa "u_int flags" "int8_t psind"
|
||||
.Fc
|
||||
.Sh DESCRIPTION
|
||||
The
|
||||
.Fn pmap_enter
|
||||
function inserts the given physical page
|
||||
.Fa p ,
|
||||
into the physical map
|
||||
.Fa pmap ,
|
||||
at the virtual address
|
||||
.Fa va ,
|
||||
function creates a mapping in the physical map
|
||||
.Fa pmap
|
||||
from the virtual address
|
||||
.Fa va
|
||||
to the physical page
|
||||
.Fa m
|
||||
with the protection
|
||||
.Fa prot .
|
||||
If
|
||||
.Fa wired
|
||||
is
|
||||
.Dv TRUE ,
|
||||
then increment the wired count for the page as soon as the mapping
|
||||
is inserted into
|
||||
.Fa pmap .
|
||||
.Sh IMPLEMENTATION NOTES
|
||||
This routine MAY NOT lazy-evaluate the entry; it is required by
|
||||
specification to make the requested entry at the time it is called.
|
||||
Any previous mapping at the virtual address
|
||||
.Fa va
|
||||
is destroyed.
|
||||
.Pp
|
||||
The
|
||||
.Fa flags
|
||||
argument may have the following values:
|
||||
.Bl -tag -width ".Dv PMAP_ENTER_NOSLEEP"
|
||||
.It Dv VM_PROT_READ
|
||||
A read access to the given virtual address triggered the call.
|
||||
.It Dv VM_PROT_WRITE
|
||||
A write access to the given virtual address triggered the call.
|
||||
.It Dv VM_PROT_EXECUTE
|
||||
An execute access to the given virtual address triggered the call.
|
||||
.It Dv PMAP_ENTER_WIRED
|
||||
The mapping should be marked as wired.
|
||||
.It Dv PMAP_ENTER_NOSLEEP
|
||||
This function may not sleep during creation of the mapping.
|
||||
If the mapping cannot be created without sleeping, an appropriate
|
||||
Mach VM error is returned.
|
||||
.El
|
||||
If the
|
||||
.Dv PMAP_ENTER_NOSLEEP
|
||||
flag is not specified, this function must create the requested mapping
|
||||
before returning.
|
||||
It may not fail.
|
||||
In order to create the requested mapping, this function may destroy
|
||||
any non-wired mapping in any pmap.
|
||||
.Pp
|
||||
The
|
||||
.Fa psind
|
||||
parameter specifies the page size that should be used by the mapping.
|
||||
The supported page sizes are described by the global array
|
||||
.Dv pagesizes[] .
|
||||
The desired page size is specified by passing the index of the array
|
||||
element that equals the desired page size.
|
||||
.Pp
|
||||
When the
|
||||
.Fn pmap_enter
|
||||
function destroys or updates a managed mapping, including an existing
|
||||
mapping at virtual address
|
||||
.Fa va ,
|
||||
it updates the
|
||||
.Ft vm_page
|
||||
structure corresponding to the previously mapped physical page.
|
||||
If the physical page was accessed through the managed mapping,
|
||||
then the
|
||||
.Ft vm_page
|
||||
structure's
|
||||
.Dv PGA_REFERENCED
|
||||
aflag is set.
|
||||
If the physical page was modified through the managed mapping, then the
|
||||
.Fn vm_page_dirty
|
||||
function is called on the
|
||||
.Ft vm_page
|
||||
structure.
|
||||
.Pp
|
||||
The
|
||||
.Dv PGA_WRITEABLE
|
||||
aflag must be set for the page
|
||||
.Fa m
|
||||
if the new mapping is managed and writeable.
|
||||
It is advised to clear
|
||||
.Dv PGA_WRITEABLE
|
||||
for destroyed mappings if the implementation can ensure
|
||||
that no other writeable managed mappings for the previously
|
||||
mapped pages exist.
|
||||
.Pp
|
||||
If the page
|
||||
.Fa m
|
||||
is managed, the page must be busied by the caller
|
||||
or the owning object must be locked.
|
||||
In the later case, the
|
||||
.Dv PMAP_ENTER_NOSLEEP
|
||||
must be specified by the caller.
|
||||
.Pp
|
||||
The
|
||||
.Fn pmap_enter
|
||||
function must handle the multiprocessor TLB consistency for the
|
||||
given address.
|
||||
.Sh NOTES
|
||||
On amd64, arm and i386 architectures the existing implementation
|
||||
of the
|
||||
.Nm
|
||||
function is incomplete, only value 0 for
|
||||
.Fa psind
|
||||
is supported.
|
||||
Other supported architectures have
|
||||
.Dv pagesizes[]
|
||||
array of size 1.
|
||||
.Sh RETURN VALUES
|
||||
If successful, the
|
||||
.Fn pmap_enter
|
||||
function returns
|
||||
.Er KERN_SUCCESS .
|
||||
If the
|
||||
.Dv PMAP_ENTER_NOSLEEP
|
||||
flag was specified and the resources required for the mapping cannot
|
||||
be acquired without sleeping,
|
||||
.Dv KERN_RESOURCE_SHORTAGE
|
||||
is returned.
|
||||
.Sh SEE ALSO
|
||||
.Xr pmap 9
|
||||
.Sh AUTHORS
|
||||
This manual page was written by
|
||||
.An Bruce M Simpson Aq Mt bms@spc.org .
|
||||
This manual page was first written by
|
||||
.An Bruce M Simpson Aq Mt bms@spc.org
|
||||
and then rewritten by
|
||||
.An Alan Cox Aq Mt alc@FreeBSD.org
|
||||
and
|
||||
.An Konstantin Belousov Aq Mt kib@FreeBSD.org .
|
||||
|
@ -2749,6 +2749,8 @@ acpi_EnterSleepState(struct acpi_softc *sc, int state)
|
||||
return_ACPI_STATUS (AE_OK);
|
||||
}
|
||||
|
||||
EVENTHANDLER_INVOKE(power_suspend_early);
|
||||
stop_all_proc();
|
||||
EVENTHANDLER_INVOKE(power_suspend);
|
||||
|
||||
if (smp_started) {
|
||||
@ -2892,6 +2894,8 @@ acpi_EnterSleepState(struct acpi_softc *sc, int state)
|
||||
thread_unlock(curthread);
|
||||
}
|
||||
|
||||
resume_all_proc();
|
||||
|
||||
EVENTHANDLER_INVOKE(power_resume);
|
||||
|
||||
/* Allow another sleep request after a while. */
|
||||
|
@ -332,22 +332,6 @@ fbd_detach(device_t dev)
|
||||
return (err);
|
||||
}
|
||||
|
||||
static int
|
||||
fbd_suspend(device_t dev)
|
||||
{
|
||||
|
||||
vt_fb_suspend();
|
||||
return (bus_generic_suspend(dev));
|
||||
}
|
||||
|
||||
static int
|
||||
fbd_resume(device_t dev)
|
||||
{
|
||||
|
||||
vt_fb_resume();
|
||||
return (bus_generic_resume(dev));
|
||||
}
|
||||
|
||||
static device_method_t fbd_methods[] = {
|
||||
/* Device interface */
|
||||
DEVMETHOD(device_probe, fbd_probe),
|
||||
@ -355,8 +339,6 @@ static device_method_t fbd_methods[] = {
|
||||
DEVMETHOD(device_detach, fbd_detach),
|
||||
|
||||
DEVMETHOD(device_shutdown, bus_generic_shutdown),
|
||||
DEVMETHOD(device_suspend, fbd_suspend),
|
||||
DEVMETHOD(device_resume, fbd_resume),
|
||||
|
||||
{ 0, 0 }
|
||||
};
|
||||
|
@ -549,7 +549,7 @@ sc_attach_unit(int unit, int flags)
|
||||
|
||||
/* Register suspend/resume/shutdown callbacks for the kernel console. */
|
||||
if (sc_console_unit == unit) {
|
||||
EVENTHANDLER_REGISTER(power_suspend, scsuspend, NULL,
|
||||
EVENTHANDLER_REGISTER(power_suspend_early, scsuspend, NULL,
|
||||
EVENTHANDLER_PRI_ANY);
|
||||
EVENTHANDLER_REGISTER(power_resume, scresume, NULL,
|
||||
EVENTHANDLER_PRI_ANY);
|
||||
|
@ -76,9 +76,8 @@ struct vtblk_softc {
|
||||
#define VTBLK_FLAG_READONLY 0x0002
|
||||
#define VTBLK_FLAG_DETACH 0x0004
|
||||
#define VTBLK_FLAG_SUSPEND 0x0008
|
||||
#define VTBLK_FLAG_DUMPING 0x0010
|
||||
#define VTBLK_FLAG_BARRIER 0x0020
|
||||
#define VTBLK_FLAG_WC_CONFIG 0x0040
|
||||
#define VTBLK_FLAG_BARRIER 0x0010
|
||||
#define VTBLK_FLAG_WC_CONFIG 0x0020
|
||||
|
||||
struct virtqueue *vtblk_vq;
|
||||
struct sglist *vtblk_sglist;
|
||||
@ -95,6 +94,7 @@ struct vtblk_softc {
|
||||
int vtblk_request_count;
|
||||
enum vtblk_cache_mode vtblk_write_cache;
|
||||
|
||||
struct bio_queue vtblk_dump_queue;
|
||||
struct vtblk_request vtblk_dump_request;
|
||||
};
|
||||
|
||||
@ -162,7 +162,7 @@ static void vtblk_queue_completed(struct vtblk_softc *,
|
||||
struct bio_queue *);
|
||||
static void vtblk_done_completed(struct vtblk_softc *,
|
||||
struct bio_queue *);
|
||||
static void vtblk_drain_vq(struct vtblk_softc *, int);
|
||||
static void vtblk_drain_vq(struct vtblk_softc *);
|
||||
static void vtblk_drain(struct vtblk_softc *);
|
||||
|
||||
static void vtblk_startio(struct vtblk_softc *);
|
||||
@ -177,9 +177,10 @@ static int vtblk_quiesce(struct vtblk_softc *);
|
||||
static void vtblk_vq_intr(void *);
|
||||
static void vtblk_stop(struct vtblk_softc *);
|
||||
|
||||
static void vtblk_dump_prepare(struct vtblk_softc *);
|
||||
static void vtblk_dump_quiesce(struct vtblk_softc *);
|
||||
static int vtblk_dump_write(struct vtblk_softc *, void *, off_t, size_t);
|
||||
static int vtblk_dump_flush(struct vtblk_softc *);
|
||||
static void vtblk_dump_complete(struct vtblk_softc *);
|
||||
|
||||
static void vtblk_set_write_cache(struct vtblk_softc *, int);
|
||||
static int vtblk_write_cache_enabled(struct vtblk_softc *sc,
|
||||
@ -302,6 +303,7 @@ vtblk_attach(device_t dev)
|
||||
sc->vtblk_dev = dev;
|
||||
VTBLK_LOCK_INIT(sc, device_get_nameunit(dev));
|
||||
bioq_init(&sc->vtblk_bioq);
|
||||
TAILQ_INIT(&sc->vtblk_dump_queue);
|
||||
TAILQ_INIT(&sc->vtblk_req_free);
|
||||
TAILQ_INIT(&sc->vtblk_req_ready);
|
||||
|
||||
@ -506,25 +508,19 @@ vtblk_dump(void *arg, void *virtual, vm_offset_t physical, off_t offset,
|
||||
int error;
|
||||
|
||||
dp = arg;
|
||||
error = 0;
|
||||
|
||||
if ((sc = dp->d_drv1) == NULL)
|
||||
return (ENXIO);
|
||||
|
||||
VTBLK_LOCK(sc);
|
||||
|
||||
if ((sc->vtblk_flags & VTBLK_FLAG_DUMPING) == 0) {
|
||||
vtblk_dump_prepare(sc);
|
||||
sc->vtblk_flags |= VTBLK_FLAG_DUMPING;
|
||||
}
|
||||
vtblk_dump_quiesce(sc);
|
||||
|
||||
if (length > 0)
|
||||
error = vtblk_dump_write(sc, virtual, offset, length);
|
||||
else if (virtual == NULL && offset == 0)
|
||||
error = vtblk_dump_flush(sc);
|
||||
else {
|
||||
error = EINVAL;
|
||||
sc->vtblk_flags &= ~VTBLK_FLAG_DUMPING;
|
||||
}
|
||||
if (error || (virtual == NULL && offset == 0))
|
||||
vtblk_dump_complete(sc);
|
||||
|
||||
VTBLK_UNLOCK(sc);
|
||||
|
||||
@ -996,7 +992,7 @@ vtblk_done_completed(struct vtblk_softc *sc, struct bio_queue *queue)
|
||||
}
|
||||
|
||||
static void
|
||||
vtblk_drain_vq(struct vtblk_softc *sc, int skip_done)
|
||||
vtblk_drain_vq(struct vtblk_softc *sc)
|
||||
{
|
||||
struct virtqueue *vq;
|
||||
struct vtblk_request *req;
|
||||
@ -1006,9 +1002,7 @@ vtblk_drain_vq(struct vtblk_softc *sc, int skip_done)
|
||||
last = 0;
|
||||
|
||||
while ((req = virtqueue_drain(vq, &last)) != NULL) {
|
||||
if (!skip_done)
|
||||
vtblk_bio_done(sc, req->vbr_bp, ENXIO);
|
||||
|
||||
vtblk_bio_done(sc, req->vbr_bp, ENXIO);
|
||||
vtblk_request_enqueue(sc, req);
|
||||
}
|
||||
|
||||
@ -1031,7 +1025,7 @@ vtblk_drain(struct vtblk_softc *sc)
|
||||
vtblk_queue_completed(sc, &queue);
|
||||
vtblk_done_completed(sc, &queue);
|
||||
|
||||
vtblk_drain_vq(sc, 0);
|
||||
vtblk_drain_vq(sc);
|
||||
}
|
||||
|
||||
while ((req = vtblk_request_next_ready(sc)) != NULL) {
|
||||
@ -1256,31 +1250,16 @@ vtblk_stop(struct vtblk_softc *sc)
|
||||
}
|
||||
|
||||
static void
|
||||
vtblk_dump_prepare(struct vtblk_softc *sc)
|
||||
vtblk_dump_quiesce(struct vtblk_softc *sc)
|
||||
{
|
||||
device_t dev;
|
||||
struct virtqueue *vq;
|
||||
|
||||
dev = sc->vtblk_dev;
|
||||
vq = sc->vtblk_vq;
|
||||
|
||||
vtblk_stop(sc);
|
||||
|
||||
/*
|
||||
* Drain all requests caught in-flight in the virtqueue,
|
||||
* skipping biodone(). When dumping, only one request is
|
||||
* outstanding at a time, and we just poll the virtqueue
|
||||
* for the response.
|
||||
* Spin here until all the requests in-flight at the time of the
|
||||
* dump are completed and queued. The queued requests will be
|
||||
* biodone'd once the dump is finished.
|
||||
*/
|
||||
vtblk_drain_vq(sc, 1);
|
||||
|
||||
if (virtio_reinit(dev, sc->vtblk_features) != 0) {
|
||||
panic("%s: cannot reinit VirtIO block device during dump",
|
||||
device_get_nameunit(dev));
|
||||
}
|
||||
|
||||
virtqueue_disable_intr(vq);
|
||||
virtio_reinit_complete(dev);
|
||||
while (!virtqueue_empty(sc->vtblk_vq))
|
||||
vtblk_queue_completed(sc, &sc->vtblk_dump_queue);
|
||||
}
|
||||
|
||||
static int
|
||||
@ -1326,6 +1305,17 @@ vtblk_dump_flush(struct vtblk_softc *sc)
|
||||
return (vtblk_poll_request(sc, req));
|
||||
}
|
||||
|
||||
static void
|
||||
vtblk_dump_complete(struct vtblk_softc *sc)
|
||||
{
|
||||
|
||||
vtblk_dump_flush(sc);
|
||||
|
||||
VTBLK_UNLOCK(sc);
|
||||
vtblk_done_completed(sc, &sc->vtblk_dump_queue);
|
||||
VTBLK_LOCK(sc);
|
||||
}
|
||||
|
||||
static void
|
||||
vtblk_set_write_cache(struct vtblk_softc *sc, int wc)
|
||||
{
|
||||
|
@ -53,6 +53,8 @@ static struct vt_driver vt_fb_driver = {
|
||||
.vd_priority = VD_PRIORITY_GENERIC+10,
|
||||
.vd_fb_ioctl = vt_fb_ioctl,
|
||||
.vd_fb_mmap = vt_fb_mmap,
|
||||
.vd_suspend = vt_fb_suspend,
|
||||
.vd_resume = vt_fb_resume,
|
||||
};
|
||||
|
||||
VT_DRIVER_DECLARE(vt_fb, vt_fb_driver);
|
||||
@ -450,15 +452,15 @@ vt_fb_attach(struct fb_info *info)
|
||||
}
|
||||
|
||||
void
|
||||
vt_fb_resume(void)
|
||||
vt_fb_suspend(struct vt_device *vd)
|
||||
{
|
||||
|
||||
vt_resume();
|
||||
vt_suspend(vd);
|
||||
}
|
||||
|
||||
void
|
||||
vt_fb_suspend(void)
|
||||
vt_fb_resume(struct vt_device *vd)
|
||||
{
|
||||
|
||||
vt_suspend();
|
||||
vt_resume(vd);
|
||||
}
|
||||
|
@ -33,8 +33,8 @@
|
||||
#define _DEV_VT_HW_FB_VT_FB_H_
|
||||
/* Generic framebuffer interface call vt_fb_attach to init VT(9) */
|
||||
int vt_fb_attach(struct fb_info *info);
|
||||
void vt_fb_resume(void);
|
||||
void vt_fb_suspend(void);
|
||||
void vt_fb_resume(struct vt_device *vd);
|
||||
void vt_fb_suspend(struct vt_device *vd);
|
||||
|
||||
vd_init_t vt_fb_init;
|
||||
vd_blank_t vt_fb_blank;
|
||||
|
@ -90,8 +90,6 @@ SYSCTL_INT(_kern_vt, OID_AUTO, _name, CTLFLAG_RWTUN, &vt_##_name, _default,\
|
||||
struct vt_driver;
|
||||
|
||||
void vt_allocate(struct vt_driver *, void *);
|
||||
void vt_resume(void);
|
||||
void vt_suspend(void);
|
||||
|
||||
typedef unsigned int vt_axis_t;
|
||||
|
||||
@ -162,6 +160,9 @@ struct vt_device {
|
||||
#define VD_PASTEBUFSZ(vd) ((vd)->vd_pastebuf.vpb_bufsz)
|
||||
#define VD_PASTEBUFLEN(vd) ((vd)->vd_pastebuf.vpb_len)
|
||||
|
||||
void vt_resume(struct vt_device *vd);
|
||||
void vt_suspend(struct vt_device *vd);
|
||||
|
||||
/*
|
||||
* Per-window terminal screen buffer.
|
||||
*
|
||||
@ -314,6 +315,8 @@ typedef int vd_fb_mmap_t(struct vt_device *, vm_ooffset_t, vm_paddr_t *, int,
|
||||
typedef void vd_drawrect_t(struct vt_device *, int, int, int, int, int,
|
||||
term_color_t);
|
||||
typedef void vd_setpixel_t(struct vt_device *, int, int, term_color_t);
|
||||
typedef void vd_suspend_t(struct vt_device *);
|
||||
typedef void vd_resume_t(struct vt_device *);
|
||||
|
||||
struct vt_driver {
|
||||
char vd_name[16];
|
||||
@ -337,6 +340,10 @@ struct vt_driver {
|
||||
/* Update display setting on vt switch. */
|
||||
vd_postswitch_t *vd_postswitch;
|
||||
|
||||
/* Suspend/resume handlers. */
|
||||
vd_suspend_t *vd_suspend;
|
||||
vd_resume_t *vd_resume;
|
||||
|
||||
/* Priority to know which one can override */
|
||||
int vd_priority;
|
||||
#define VD_PRIORITY_DUMB 10
|
||||
|
@ -167,6 +167,8 @@ static void vt_update_static(void *);
|
||||
#ifndef SC_NO_CUTPASTE
|
||||
static void vt_mouse_paste(void);
|
||||
#endif
|
||||
static void vt_suspend_handler(void *priv);
|
||||
static void vt_resume_handler(void *priv);
|
||||
|
||||
SET_DECLARE(vt_drv_set, struct vt_driver);
|
||||
|
||||
@ -2552,6 +2554,12 @@ vt_upgrade(struct vt_device *vd)
|
||||
vd->vd_flags |= VDF_ASYNC;
|
||||
callout_reset(&vd->vd_timer, hz / VT_TIMERFREQ, vt_timer, vd);
|
||||
vd->vd_timer_armed = 1;
|
||||
|
||||
/* Register suspend/resume handlers. */
|
||||
EVENTHANDLER_REGISTER(power_suspend_early, vt_suspend_handler,
|
||||
vd, EVENTHANDLER_PRI_ANY);
|
||||
EVENTHANDLER_REGISTER(power_resume, vt_resume_handler, vd,
|
||||
EVENTHANDLER_PRI_ANY);
|
||||
}
|
||||
|
||||
VT_UNLOCK(vd);
|
||||
@ -2655,26 +2663,54 @@ vt_allocate(struct vt_driver *drv, void *softc)
|
||||
termcn_cnregister(vd->vd_windows[VT_CONSWINDOW]->vw_terminal);
|
||||
}
|
||||
|
||||
void
|
||||
vt_suspend()
|
||||
static void
|
||||
vt_suspend_handler(void *priv)
|
||||
{
|
||||
struct vt_device *vd;
|
||||
|
||||
vd = priv;
|
||||
if (vd->vd_driver != NULL && vd->vd_driver->vd_suspend != NULL)
|
||||
vd->vd_driver->vd_suspend(vd);
|
||||
}
|
||||
|
||||
static void
|
||||
vt_resume_handler(void *priv)
|
||||
{
|
||||
struct vt_device *vd;
|
||||
|
||||
vd = priv;
|
||||
if (vd->vd_driver != NULL && vd->vd_driver->vd_resume != NULL)
|
||||
vd->vd_driver->vd_resume(vd);
|
||||
}
|
||||
|
||||
void
|
||||
vt_suspend(struct vt_device *vd)
|
||||
{
|
||||
int error;
|
||||
|
||||
if (vt_suspendswitch == 0)
|
||||
return;
|
||||
/* Save current window. */
|
||||
main_vd->vd_savedwindow = main_vd->vd_curwindow;
|
||||
vd->vd_savedwindow = vd->vd_curwindow;
|
||||
/* Ask holding process to free window and switch to console window */
|
||||
vt_proc_window_switch(main_vd->vd_windows[VT_CONSWINDOW]);
|
||||
vt_proc_window_switch(vd->vd_windows[VT_CONSWINDOW]);
|
||||
|
||||
/* Wait for the window switch to complete. */
|
||||
error = 0;
|
||||
VT_LOCK(vd);
|
||||
while (vd->vd_curwindow != vd->vd_windows[VT_CONSWINDOW] && error == 0)
|
||||
error = cv_wait_sig(&vd->vd_winswitch, &vd->vd_lock);
|
||||
VT_UNLOCK(vd);
|
||||
}
|
||||
|
||||
void
|
||||
vt_resume()
|
||||
vt_resume(struct vt_device *vd)
|
||||
{
|
||||
|
||||
if (vt_suspendswitch == 0)
|
||||
return;
|
||||
/* Switch back to saved window */
|
||||
if (main_vd->vd_savedwindow != NULL)
|
||||
vt_proc_window_switch(main_vd->vd_savedwindow);
|
||||
main_vd->vd_savedwindow = NULL;
|
||||
if (vd->vd_savedwindow != NULL)
|
||||
vt_proc_window_switch(vd->vd_savedwindow);
|
||||
vd->vd_savedwindow = NULL;
|
||||
}
|
||||
|
@ -2421,8 +2421,6 @@ key_setdumpsp(struct secpolicy *sp, u_int8_t type, u_int32_t seq,
|
||||
struct mbuf *result = NULL, *m;
|
||||
struct seclifetime lt;
|
||||
|
||||
SPTREE_RLOCK_ASSERT();
|
||||
|
||||
m = key_setsadbmsg(type, 0, SADB_SATYPE_UNSPEC, seq, pid, sp->refcnt);
|
||||
if (!m)
|
||||
goto fail;
|
||||
|
@ -191,13 +191,13 @@ phyp_iommu_map(device_t dev, bus_dma_segment_t *segs, int *nsegs,
|
||||
|
||||
tce = trunc_page(segs[i].ds_addr);
|
||||
tce |= 0x3; /* read/write */
|
||||
if (papr_supports_stuff_tce) {
|
||||
error = phyp_hcall(H_STUFF_TCE, window->map->iobn,
|
||||
alloced, tce, allocsize/PAGE_SIZE);
|
||||
} else {
|
||||
for (j = 0; j < allocsize; j += PAGE_SIZE)
|
||||
error = phyp_hcall(H_PUT_TCE, window->map->iobn,
|
||||
alloced + j, tce + j);
|
||||
for (j = 0; j < allocsize; j += PAGE_SIZE) {
|
||||
error = phyp_hcall(H_PUT_TCE, window->map->iobn,
|
||||
alloced + j, tce + j);
|
||||
if (error < 0) {
|
||||
panic("IOMMU mapping error: %d\n", error);
|
||||
return (ENOMEM);
|
||||
}
|
||||
}
|
||||
|
||||
segs[i].ds_addr = alloced + (segs[i].ds_addr & PAGE_MASK);
|
||||
|
@ -182,6 +182,7 @@ EVENTHANDLER_DECLARE(shutdown_final, shutdown_fn);
|
||||
typedef void (*power_change_fn)(void *);
|
||||
EVENTHANDLER_DECLARE(power_resume, power_change_fn);
|
||||
EVENTHANDLER_DECLARE(power_suspend, power_change_fn);
|
||||
EVENTHANDLER_DECLARE(power_suspend_early, power_change_fn);
|
||||
|
||||
/* Low memory event */
|
||||
typedef void (*vm_lowmem_handler_t)(void *, int);
|
||||
|
@ -495,11 +495,15 @@ quotaon(struct thread *td, struct mount *mp, int type, void *fname)
|
||||
struct nameidata nd;
|
||||
|
||||
error = priv_check(td, PRIV_UFS_QUOTAON);
|
||||
if (error)
|
||||
if (error != 0) {
|
||||
vfs_unbusy(mp);
|
||||
return (error);
|
||||
}
|
||||
|
||||
if (mp->mnt_flag & MNT_RDONLY)
|
||||
if ((mp->mnt_flag & MNT_RDONLY) != 0) {
|
||||
vfs_unbusy(mp);
|
||||
return (EROFS);
|
||||
}
|
||||
|
||||
ump = VFSTOUFS(mp);
|
||||
dq = NODQUOT;
|
||||
|
@ -92,6 +92,9 @@ ufs_quotactl(mp, cmds, id, arg)
|
||||
void *arg;
|
||||
{
|
||||
#ifndef QUOTA
|
||||
if ((cmds >> SUBCMDSHIFT) == Q_QUOTAON)
|
||||
vfs_unbusy(mp);
|
||||
|
||||
return (EOPNOTSUPP);
|
||||
#else
|
||||
struct thread *td;
|
||||
@ -112,11 +115,16 @@ ufs_quotactl(mp, cmds, id, arg)
|
||||
break;
|
||||
|
||||
default:
|
||||
if (cmd == Q_QUOTAON)
|
||||
vfs_unbusy(mp);
|
||||
return (EINVAL);
|
||||
}
|
||||
}
|
||||
if ((u_int)type >= MAXQUOTAS)
|
||||
if ((u_int)type >= MAXQUOTAS) {
|
||||
if (cmd == Q_QUOTAON)
|
||||
vfs_unbusy(mp);
|
||||
return (EINVAL);
|
||||
}
|
||||
|
||||
switch (cmd) {
|
||||
case Q_QUOTAON:
|
||||
|
@ -411,6 +411,8 @@ mf_fgets(SPACE *sp, enum e_spflag spflag)
|
||||
unlink(tmpfname);
|
||||
if ((outfile = fopen(tmpfname, "w")) == NULL)
|
||||
err(1, "%s", fname);
|
||||
if (outfile != NULL && outfile != stdout)
|
||||
fclose(outfile);
|
||||
fchown(fileno(outfile), sb.st_uid, sb.st_gid);
|
||||
fchmod(fileno(outfile), sb.st_mode & ALLPERMS);
|
||||
outfname = tmpfname;
|
||||
|
@ -324,7 +324,7 @@ applies(struct s_command *cp)
|
||||
} else
|
||||
r = 1;
|
||||
}
|
||||
} else if (MATCH(cp->a1)) {
|
||||
} else if (cp->a1 && MATCH(cp->a1)) {
|
||||
/*
|
||||
* If the second address is a number less than or
|
||||
* equal to the line number first selected, only
|
||||
|
@ -1796,6 +1796,10 @@ process_file(char *filename)
|
||||
|
||||
if (filename == NULL) {
|
||||
io = my_popen(command, "r", &pid_of_command);
|
||||
if (io == NULL) {
|
||||
printf("Can't popen the command %s\n", command);
|
||||
return;
|
||||
}
|
||||
} else {
|
||||
io = fopen(filename, "r");
|
||||
if (io == NULL) {
|
||||
@ -1808,8 +1812,10 @@ process_file(char *filename)
|
||||
if (cnts == NULL) {
|
||||
/* Nothing we can do */
|
||||
printf("Nothing to do -- no counters built\n");
|
||||
if (io) {
|
||||
fclose(io);
|
||||
if (filename) {
|
||||
fclose(io);
|
||||
} else {
|
||||
my_pclose(io, pid_of_command);
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user