/* * kdb_trap - field a TRACE or BPT trap * Return non-zero if we "handled" the trap. */ int kdb_trap(int type, db_regs_t *regs) { switch (type) { case T_TRACE: /* single-step */ case T_BREAKPOINT: /* breakpoint */ /* case T_WATCHPOINT:*/ break; case -1: break; default: kdbprinttrap(type, 0); if (db_recover != 0) { /* This will longjmp back to db_command_loop */ db_error("Caught exception in ddb.\n"); /*NOTREACHED*/ } /* * Tell caller "We did NOT handle the trap." * Caller should panic or whatever. */ return 0; } /* * We'd like to be on a separate debug stack here, but * that's easier to do in locore.s before we get here. * See sun3/locore.s:T_TRACE for stack switch code. */ ddb_regs = *regs; db_active++; cnpollc(true); /* set polling mode, unblank video */ db_trap(type, 0); /* where the work happens */ cnpollc(false); /* resume interrupt mode */ db_active--; *regs = ddb_regs; /* * Indicate that single_step is for KDB. * But lock out interrupts to prevent TRACE_KDB from setting the * trace bit in the current SR (and trapping while exiting KDB). */ (void)spl7(); /* * Tell caller "We HAVE handled the trap." * Caller will return to locore and rte. */ return 1; }
setbram() /* reset checksum in bram... done when bram updated */ { register long i = 0; register int j, level; register struct bram_mem *p = BRAM->opts.opt_array; level=spl7(); for (; p<&BRAM->opts.opt_array[BRAM_SIZE-2]; p++) i += p->byte; BRAM->opts.opt_array[BRAM_SIZE - 1].byte = i & 0xff; BRAM->opts.opt_array[BRAM_SIZE - 2].byte = (i >> 8) & 0xff; splx(level); }
checkbram() /* return 1 if bram has valid checksum. If not, clear */ /* the battery backed ram, putting in a valid checksum */ { register long i = 0; register int j,level; register struct bram_mem *p = BRAM->opts.opt_array; level=spl7(); /* critical section */ for (; p<&BRAM->opts.opt_array[BRAM_SIZE-2]; p++) i += p->byte; j = (BRAM->opts.opt_array[BRAM_SIZE - 2].byte << 8) + BRAM->opts.opt_array[BRAM_SIZE - 1].byte; i %= (1 << 16); /* truncate to checksum size */ if ( i == j) { splx(level); return(1); } initbram(); /* reinitialize */ splx(level); return(0); }
/* * New time entry-- return TOD with milliseconds, timezone, * DST flag */ ftime() { register struct a { struct timeb *tp; } *uap; struct timeb t; register unsigned ms; uap = (struct a *)u.u_ap; spl7(); t.time = time; ms = lbolt; spl0(); if (ms > HZ) { ms -= HZ; t.time++; } t.millitm = (1000*ms)/HZ; t.timezone = TIMEZONE; t.dstflag = DSTFLAG; if (copyout((caddr_t)&t, (caddr_t)uap->tp, sizeof(t)) < 0) u.u_error = EFAULT; }
/* set the real time */ void afs_osi_SetTime(osi_timeval_t * atv) { #if defined(AFS_AIX32_ENV) struct timestruc_t t; t.tv_sec = atv->tv_sec; t.tv_nsec = atv->tv_usec * 1000; ksettimer(&t); /* Was -> settimer(TIMEOFDAY, &t); */ #elif defined(AFS_SUN5_ENV) stime(atv->tv_sec); #elif defined(AFS_SGI_ENV) struct stimea { sysarg_t time; } sta; AFS_GUNLOCK(); sta.time = atv->tv_sec; stime(&sta); AFS_GLOCK(); #elif defined(AFS_DARWIN_ENV) #ifndef AFS_DARWIN80_ENV AFS_GUNLOCK(); setthetime(atv); AFS_GLOCK(); #endif #else /* stolen from kern_time.c */ #ifndef AFS_AUX_ENV boottime.tv_sec += atv->tv_sec - time.tv_sec; #endif #ifdef AFS_HPUX_ENV { #if !defined(AFS_HPUX1122_ENV) /* drop the setting of the clock for now. spl7 is not * known on hpux11.22 */ ulong_t s; struct timeval t; t.tv_sec = atv->tv_sec; t.tv_usec = atv->tv_usec; s = spl7(); time = t; (void)splx(s); resettodr(atv); #endif } #else { int s; s = splclock(); time = *atv; (void)splx(s); } resettodr(); #endif #ifdef AFS_AUX_ENV logtchg(atv->tv_sec); #endif #endif /* AFS_DARWIN_ENV */ AFS_STATCNT(osi_SetTime); }
/* set the real time */ void afs_osi_SetTime(osi_timeval_t * atv) { #if defined(AFS_AIX32_ENV) struct timestruc_t t; t.tv_sec = atv->tv_sec; t.tv_nsec = atv->tv_usec * 1000; ksettimer(&t); /* Was -> settimer(TIMEOFDAY, &t); */ #elif defined(AFS_SUN55_ENV) stime(atv->tv_sec); #elif defined(AFS_SUN5_ENV) /* * To get more than second resolution we can use adjtime. The problem * is that the usecs from the server are wrong (by now) so it isn't * worth complicating the following code. */ struct stimea { time_t time; } sta; sta.time = atv->tv_sec; stime(&sta, NULL); #elif defined(AFS_SGI_ENV) struct stimea { sysarg_t time; } sta; AFS_GUNLOCK(); sta.time = atv->tv_sec; stime(&sta); AFS_GLOCK(); #elif defined(AFS_DARWIN_ENV) #ifndef AFS_DARWIN80_ENV AFS_GUNLOCK(); setthetime(atv); AFS_GLOCK(); #endif #else /* stolen from kern_time.c */ #ifndef AFS_AUX_ENV boottime.tv_sec += atv->tv_sec - time.tv_sec; #endif #ifdef AFS_HPUX_ENV { #if !defined(AFS_HPUX1122_ENV) /* drop the setting of the clock for now. spl7 is not * known on hpux11.22 */ register ulong_t s; struct timeval t; t.tv_sec = atv->tv_sec; t.tv_usec = atv->tv_usec; s = spl7(); time = t; (void)splx(s); resettodr(atv); #endif } #else { register int s; s = splclock(); time = *atv; (void)splx(s); } resettodr(); #endif #ifdef AFS_AUX_ENV logtchg(atv->tv_sec); #endif #endif /* AFS_DARWIN_ENV */ AFS_STATCNT(osi_SetTime); }
/* * Stop all interrupt activities in the system */ void i_cpr_stop_intr(void) { (void) spl7(); }