* Copyright (c) 1992 OMRON Corporation.
* Copyright (c) 1982, 1986 Regents of the University of California.
* %sccs.include.redist.c%
* from: hp300/hp300/sys_machdep.c 7.11 (Berkeley) 12/27/92
* @(#)sys_machdep.c 7.4 (Berkeley) %G%
register struct vtrace_args
*uap
;
case VTR_DISABLE
: /* disable a trace point */
case VTR_ENABLE
: /* enable a trace point */
if (uap
->value
< 0 || uap
->value
>= TR_NFLAGS
)
*retval
= traceflags
[uap
->value
];
traceflags
[uap
->value
] = uap
->request
;
case VTR_VALUE
: /* return a trace point setting */
if (uap
->value
< 0 || uap
->value
>= TR_NFLAGS
)
*retval
= traceflags
[uap
->value
];
case VTR_UALARM
: /* set a real-time ualarm, less than 1 min */
if (uap
->value
<= 0 || uap
->value
> 60 * hz
|| nvualarm
> 5)
timeout(vdoualarm
, (caddr_t
)p
->p_pid
, uap
->value
);
trace(TR_STAMP
, uap
->value
, p
->p_pid
);
/* XXX should be in an include file somewhere */
#define CC_EXTPURGE 0x80000000
* Note that what we do here for a 68040 is different than HP-UX.
* In 'pux they either act on a line (len == 16), a page (len == NBPG)
* or the whole cache (len == anything else).
* In BSD we attempt to be more optimal when acting on "odd" sizes.
* For lengths up to 1024 we do all affected lines, up to 2*NBPG we
* do pages, above that we do the entire cache.
if (mmutype
== MMU_68040
) {
(req
& ~CC_EXTPURGE
) != CC_PURGE
&& len
> 2*NBPG
)
if ((curproc
->p_md
.md_flags
& MDP_HPUX
) &&
len
!= 16 && len
!= NBPG
)
addr
= (caddr_t
)((int)addr
& ~0xF);
addr
= (caddr_t
)((int)addr
& ~PGOFSET
);
* Convert to physical address if needed.
* If translation fails, we perform operation on
* entire cache (XXX is this a rational thing to do?)
(pa
== 0 || ((int)addr
& PGOFSET
) == 0)) {
pa
= pmap_extract(&curproc
->p_vmspace
->vm_pmap
,
case CC_EXTPURGE
|CC_IPURGE
:
} else if (inc
== NBPG
) {
case CC_EXTPURGE
|CC_PURGE
:
DCFA(); /* note: flush not purge */
case CC_EXTPURGE
|CC_FLUSH
:
case CC_EXTPURGE
|CC_PURGE
:
case CC_EXTPURGE
|CC_FLUSH
:
case CC_EXTPURGE
|CC_IPURGE
: