- Include <machine/prom.h> to get the prototype for prom_halt().

- If there is no gdb device, just return without trying to return any
  value since gdb_handle_exception() returns void.
- When calling prom_halt(), pass in a value telling it to actually halt
  and not to randomly choose whether or not to halt or reboot depending on
  whatever value happened to be in a0 when the call was made.
This commit is contained in:
John Baldwin 2001-03-28 01:54:06 +00:00
parent 6b8b8c7fdc
commit 82da2f64b3
9 changed files with 57 additions and 58 deletions

View File

@ -99,6 +99,7 @@
#include <sys/signal.h>
#include <sys/cons.h>
#include <machine/prom.h>
#include <machine/reg.h>
#include <ddb/ddb.h>
@ -625,7 +626,7 @@ gdb_handle_exception (db_regs_t *raw_regs, int type, int code)
while (1)
{
if (gdbdev == NODEV) /* somebody's removed it */
return 1; /* get out of here */
return; /* get out of here */
remcomOutBuffer[0] = 0;
getpacket (remcomInBuffer);
@ -644,7 +645,7 @@ gdb_handle_exception (db_regs_t *raw_regs, int type, int code)
return;
case 'k':
prom_halt();
prom_halt(1);
/*NOTREACHED*/
break;

View File

@ -210,7 +210,6 @@ configure(void *dummy)
void
cpu_rootconf()
{
int order = 0;
#if defined(NFS) && defined(NFS_ROOT)
#if !defined(BOOTP_NFSROOT)
if (nfs_diskless_valid)

View File

@ -267,10 +267,9 @@ static int
getit(void)
{
int high, low;
int s;
critical_t s;
s = save_intr();
disable_intr();
s = critical_enter();
/* Select timer0 and latch counter value. */
outb(TIMER_MODE, TIMER_SEL0 | TIMER_LATCH);
@ -278,7 +277,7 @@ getit(void)
low = inb(TIMER_CNTR0);
high = inb(TIMER_CNTR0);
restore_intr(s);
critical_exit(s);
return ((high << 8) | low);
}
@ -369,10 +368,9 @@ static void
set_timer_freq(u_int freq, int intr_freq)
{
int new_timer0_max_count;
int s;
critical_t s;
s = save_intr();
disable_intr();
s = critical_enter();
timer_freq = freq;
new_timer0_max_count = TIMER_DIV(intr_freq);
if (new_timer0_max_count != timer0_max_count) {
@ -381,15 +379,16 @@ set_timer_freq(u_int freq, int intr_freq)
outb(TIMER_CNTR0, timer0_max_count & 0xff);
outb(TIMER_CNTR0, timer0_max_count >> 8);
}
restore_intr(s);
critical_exit(s);
}
static void
handleclock(void* arg)
{
if (timecounter->tc_get_timecount == i8254_get_timecount) {
int s = save_intr();
disable_intr();
critical_t s;
s = critical_enter();
if (i8254_ticked)
i8254_ticked = 0;
else {
@ -397,7 +396,7 @@ handleclock(void* arg)
i8254_lastcount = 0;
}
clkintr_pending = 0;
restore_intr(s);
critical_exit(s);
}
hardclock(arg);
@ -567,10 +566,9 @@ i8254_get_timecount(struct timecounter *tc)
{
u_int count;
u_int high, low;
int s;
critical_t s;
s = save_intr();
disable_intr();
s = critical_enter();
/* Select timer0 and latch counter value. */
outb(TIMER_MODE, TIMER_SEL0 | TIMER_LATCH);
@ -588,7 +586,7 @@ i8254_get_timecount(struct timecounter *tc)
i8254_lastcount = count;
count += i8254_offset;
restore_intr(s);
critical_exit(s);
return (count);
}
@ -640,13 +638,14 @@ sysbeepstop(void *chan)
int
sysbeep(int pitch, int period)
{
int s = save_intr();
disable_intr();
critical_t s;
s = critical_enter();
if (acquire_timer2(TIMER_SQWAVE|TIMER_16BIT))
if (!beeping) {
/* Something else owns it. */
restore_intr(s);
critical_exit(s);
return (-1); /* XXX Should be EBUSY, but nobody cares anyway. */
}
@ -660,7 +659,7 @@ sysbeep(int pitch, int period)
beeping = period;
timeout(sysbeepstop, (void *)NULL, period);
}
restore_intr(s);
critical_exit(s);
return (0);
}

View File

@ -154,7 +154,7 @@ kdb_trap(a0, a1, a2, entry, regs)
db_regs_t *regs;
{
int ddb_mode = !(boothowto & RB_GDB);
int s;
critical_t s;
/*
* Don't bother checking for usermode, since a benign entry
@ -191,8 +191,7 @@ kdb_trap(a0, a1, a2, entry, regs)
ddb_regs = *regs;
s = save_intr();
disable_intr();
s = critical_enter();
#if 0
db_printf("stopping %x\n", PCPU_GET(other_cpus));
@ -215,7 +214,7 @@ kdb_trap(a0, a1, a2, entry, regs)
restart_cpus(stopped_cpus);
#endif
restore_intr(s);
critical_exit(s);
*regs = ddb_regs;
@ -269,8 +268,12 @@ db_write_bytes(addr, size, data)
void
Debugger(const char* msg)
{
u_int saveintr;
printf("%s\n", msg);
saveintr = alpha_pal_swpipl(ALPHA_PSL_IPL_HIGH);
__asm("call_pal 0x81"); /* XXX bugchk */
alpha_pal_swpipl(saveintr);
}
/*

View File

@ -76,7 +76,7 @@ ASSYM(GD_IDLEPCBPHYS, offsetof(struct globaldata, gd_idlepcbphys));
ASSYM(MTX_LOCK, offsetof(struct mtx, mtx_lock));
ASSYM(MTX_RECURSE, offsetof(struct mtx, mtx_recurse));
ASSYM(MTX_SAVEINTR, offsetof(struct mtx, mtx_saveintr));
ASSYM(MTX_SAVECRIT, offsetof(struct mtx, mtx_savecrit));
ASSYM(MTX_UNOWNED, MTX_UNOWNED);
ASSYM(P_ADDR, offsetof(struct proc, p_addr));

View File

@ -116,7 +116,7 @@ interrupt(a0, a1, a2, framep)
#endif
case ALPHA_INTR_CLOCK: /* clock interrupt */
CTR0(KTR_INTR, "clock interrupt");
/* CTR0(KTR_INTR, "clock interrupt"); */
if (PCPU_GET(cpuid) != hwrpb->rpb_primary_cpu_id) {
CTR0(KTR_INTR, "ignoring clock on secondary");
atomic_subtract_int(&p->p_intr_nesting_level, 1);

View File

@ -2100,14 +2100,13 @@ alpha_fpstate_check(struct proc *p)
* For SMP, we should check the fpcurproc of each cpu.
*/
#ifndef SMP
int s;
critical_t s;
s = save_intr();
disable_intr();
s = critical_enter();
if (p->p_addr->u_pcb.pcb_hw.apcb_flags & ALPHA_PCB_FLAGS_FEN)
if (p != PCPU_GET(fpcurproc))
panic("alpha_check_fpcurproc: bogus");
restore_intr(s);
critical_exit(s);
#endif
}
@ -2127,10 +2126,9 @@ alpha_fpstate_check(struct proc *p)
void
alpha_fpstate_save(struct proc *p, int write)
{
int s;
critical_t s;
s = save_intr();
disable_intr();
s = critical_enter();
if (p == PCPU_GET(fpcurproc)) {
/*
* If curproc != fpcurproc, then we need to enable FEN
@ -2165,7 +2163,7 @@ alpha_fpstate_save(struct proc *p, int write)
alpha_pal_wrfen(0);
}
}
restore_intr(s);
critical_exit(s);
}
/*
@ -2176,10 +2174,9 @@ alpha_fpstate_save(struct proc *p, int write)
void
alpha_fpstate_drop(struct proc *p)
{
int s;
critical_t s;
s = save_intr();
disable_intr();
s = critical_enter();
if (p == PCPU_GET(fpcurproc)) {
if (p == curproc) {
/*
@ -2195,7 +2192,7 @@ alpha_fpstate_drop(struct proc *p)
}
PCPU_SET(fpcurproc, NULL);
}
restore_intr(s);
critical_exit(s);
}
/*
@ -2205,13 +2202,12 @@ alpha_fpstate_drop(struct proc *p)
void
alpha_fpstate_switch(struct proc *p)
{
int s;
critical_t s;
/*
* Enable FEN so that we can access the fp registers.
*/
s = save_intr();
disable_intr();
s = critical_enter();
alpha_pal_wrfen(1);
if (PCPU_GET(fpcurproc)) {
/*
@ -2238,7 +2234,7 @@ alpha_fpstate_switch(struct proc *p)
}
p->p_md.md_flags |= MDP_FPUSED;
restore_intr(s);
critical_exit(s);
}
/*

View File

@ -113,8 +113,8 @@ init_bootstrap_console()
promcnattach(alpha_console);
}
static int enter_prom __P((void));
static void leave_prom __P((int));
static critical_t enter_prom __P((void));
static void leave_prom __P((critical_t));
/*
@ -134,16 +134,16 @@ promcnputc(dev, c)
{
prom_return_t ret;
unsigned char *to = (unsigned char *)0x20000000;
int s;
critical_t s;
s = enter_prom(); /* disable_intr() and map prom */
s = enter_prom(); /* critical_enter() and map prom */
*to = c;
do {
ret.bits = prom_putstr(alpha_console, to, 1);
} while ((ret.u.retval & 1) == 0);
leave_prom(s); /* unmap prom and restore_intr(s) */
leave_prom(s); /* unmap prom and critical_exit(s) */
}
/*
@ -188,12 +188,13 @@ promcncheckc(dev)
return (-1);
}
static int
static critical_t
enter_prom()
{
pt_entry_t *lev1map;
int s = save_intr();
disable_intr();
critical_t s;
s = critical_enter();
if (!prom_mapped) {
#ifdef SIMOS
@ -219,8 +220,8 @@ enter_prom()
}
static void
leave_prom __P((s))
int s;
leave_prom(s)
critical_t s;
{
pt_entry_t *lev1map;
@ -232,11 +233,11 @@ leave_prom __P((s))
lev1map[0] = saved_pte[0]; /* XXX */
prom_cache_sync(); /* XXX */
}
restore_intr(s);
critical_exit(s);
}
static void
prom_cache_sync __P((void))
prom_cache_sync(void)
{
ALPHA_TBIA();
alpha_pal_imb();
@ -272,7 +273,7 @@ prom_halt(halt)
/*
* Turn off interrupts, for sanity.
*/
disable_intr();
critical_enter();
/*
* Set "boot request" part of the CPU state depending on what

View File

@ -76,7 +76,7 @@ ASSYM(GD_IDLEPCBPHYS, offsetof(struct globaldata, gd_idlepcbphys));
ASSYM(MTX_LOCK, offsetof(struct mtx, mtx_lock));
ASSYM(MTX_RECURSE, offsetof(struct mtx, mtx_recurse));
ASSYM(MTX_SAVEINTR, offsetof(struct mtx, mtx_saveintr));
ASSYM(MTX_SAVECRIT, offsetof(struct mtx, mtx_savecrit));
ASSYM(MTX_UNOWNED, MTX_UNOWNED);
ASSYM(P_ADDR, offsetof(struct proc, p_addr));