Improve cpu_idle():
o cpu_idle_hook is expected to be called with interrupts disabled and re-enables interrupts on return. o sync with x86: don't idle when the CPU has runnable tasks o have callers of ia64_call_pal_static() disable interrupts and re-enable interrupts. o add, but compile-out, support for idle mode. This will be enabled at some later time, after proper testing.
This commit is contained in:
parent
27242311a3
commit
e726a6b70c
@ -56,7 +56,14 @@ acpi_machdep_quirks(int *quirks)
|
|||||||
void
|
void
|
||||||
acpi_cpu_c1()
|
acpi_cpu_c1()
|
||||||
{
|
{
|
||||||
|
#ifdef INVARIANTS
|
||||||
|
register_t ie;
|
||||||
|
|
||||||
|
ie = intr_disable();
|
||||||
|
KASSERT(ie == 0, ("%s called with interrupts enabled\n", __func__));
|
||||||
|
#endif
|
||||||
ia64_call_pal_static(PAL_HALT_LIGHT, 0, 0, 0);
|
ia64_call_pal_static(PAL_HALT_LIGHT, 0, 0, 0);
|
||||||
|
ia64_enable_intr();
|
||||||
}
|
}
|
||||||
|
|
||||||
void *
|
void *
|
||||||
|
@ -411,12 +411,34 @@ cpu_halt()
|
|||||||
void
|
void
|
||||||
cpu_idle(int busy)
|
cpu_idle(int busy)
|
||||||
{
|
{
|
||||||
struct ia64_pal_result res;
|
register_t ie;
|
||||||
|
|
||||||
if (cpu_idle_hook != NULL)
|
#if 0
|
||||||
|
if (!busy) {
|
||||||
|
critical_enter();
|
||||||
|
cpu_idleclock();
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
ie = intr_disable();
|
||||||
|
KASSERT(ie != 0, ("%s called with interrupts disabled\n", __func__));
|
||||||
|
|
||||||
|
if (sched_runnable())
|
||||||
|
ia64_enable_intr();
|
||||||
|
else if (cpu_idle_hook != NULL) {
|
||||||
(*cpu_idle_hook)();
|
(*cpu_idle_hook)();
|
||||||
else
|
/* The hook must enable interrupts! */
|
||||||
res = ia64_call_pal_static(PAL_HALT_LIGHT, 0, 0, 0);
|
} else {
|
||||||
|
ia64_call_pal_static(PAL_HALT_LIGHT, 0, 0, 0);
|
||||||
|
ia64_enable_intr();
|
||||||
|
}
|
||||||
|
|
||||||
|
#if 0
|
||||||
|
if (!busy) {
|
||||||
|
cpu_activeclock();
|
||||||
|
critical_exit();
|
||||||
|
}
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
@ -644,9 +666,12 @@ calculate_frequencies(void)
|
|||||||
{
|
{
|
||||||
struct ia64_sal_result sal;
|
struct ia64_sal_result sal;
|
||||||
struct ia64_pal_result pal;
|
struct ia64_pal_result pal;
|
||||||
|
register_t ie;
|
||||||
|
|
||||||
|
ie = intr_disable();
|
||||||
sal = ia64_sal_entry(SAL_FREQ_BASE, 0, 0, 0, 0, 0, 0, 0);
|
sal = ia64_sal_entry(SAL_FREQ_BASE, 0, 0, 0, 0, 0, 0, 0);
|
||||||
pal = ia64_call_pal_static(PAL_FREQ_RATIOS, 0, 0, 0);
|
pal = ia64_call_pal_static(PAL_FREQ_RATIOS, 0, 0, 0);
|
||||||
|
intr_restore(ie);
|
||||||
|
|
||||||
if (sal.sal_status == 0 && pal.pal_status == 0) {
|
if (sal.sal_status == 0 && pal.pal_status == 0) {
|
||||||
if (bootverbose) {
|
if (bootverbose) {
|
||||||
|
@ -39,42 +39,39 @@ ia64_pal_entry: .quad 0
|
|||||||
*/
|
*/
|
||||||
ENTRY(ia64_call_pal_static, 4)
|
ENTRY(ia64_call_pal_static, 4)
|
||||||
|
|
||||||
.regstk 4,5,0,0
|
.regstk 4,4,0,0
|
||||||
palret = loc0
|
palret = loc0
|
||||||
entry = loc1
|
entry = loc1
|
||||||
rpsave = loc2
|
rpsave = loc2
|
||||||
pfssave = loc3
|
pfssave = loc3
|
||||||
psrsave = loc4
|
|
||||||
|
|
||||||
alloc pfssave=ar.pfs,4,5,0,0
|
alloc pfssave=ar.pfs,4,4,0,0
|
||||||
;;
|
;;
|
||||||
mov rpsave=rp
|
mov rpsave=rp
|
||||||
|
|
||||||
movl entry=@gprel(ia64_pal_entry)
|
movl entry=@gprel(ia64_pal_entry)
|
||||||
|
|
||||||
1: mov palret=ip // for return address
|
1: mov palret=ip // for return address
|
||||||
;;
|
;;
|
||||||
add entry=entry,gp
|
add entry=entry,gp
|
||||||
mov psrsave=psr
|
add palret=2f-1b,palret // calculate return address
|
||||||
mov r28=in0 // procedure number
|
mov r28=in0 // procedure number
|
||||||
;;
|
|
||||||
ld8 entry=[entry] // read entry point
|
|
||||||
mov r29=in1 // copy arguments
|
mov r29=in1 // copy arguments
|
||||||
mov r30=in2
|
mov r30=in2
|
||||||
mov r31=in3
|
mov r31=in3
|
||||||
;;
|
;;
|
||||||
mov b6=entry
|
ld8 entry=[entry] // read entry point
|
||||||
add palret=2f-1b,palret // calculate return address
|
|
||||||
;;
|
|
||||||
mov b0=palret
|
mov b0=palret
|
||||||
rsm psr.i // disable interrupts
|
;;
|
||||||
|
mov b6=entry
|
||||||
;;
|
;;
|
||||||
br.cond.sptk b6 // call into firmware
|
br.cond.sptk b6 // call into firmware
|
||||||
2: mov psr.l=psrsave
|
;;
|
||||||
|
2:
|
||||||
mov rp=rpsave
|
mov rp=rpsave
|
||||||
mov ar.pfs=pfssave
|
mov ar.pfs=pfssave
|
||||||
;;
|
;;
|
||||||
srlz.d
|
|
||||||
br.ret.sptk rp
|
br.ret.sptk rp
|
||||||
|
;;
|
||||||
END(ia64_call_pal_static)
|
END(ia64_call_pal_static)
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
Loading…
x
Reference in New Issue
Block a user