summaryrefslogtreecommitdiff
path: root/usr/src/uts/sun4/os/mp_startup.c
diff options
context:
space:
mode:
authorjb145095 <none@none>2007-04-16 22:09:13 -0700
committerjb145095 <none@none>2007-04-16 22:09:13 -0700
commit982b91072930da051b05465dbd43c5ff024c96bc (patch)
treef3507859e6f847df9556881455e4059f294fc25e /usr/src/uts/sun4/os/mp_startup.c
parent789e0dbbcdddab55f064dbca13950cb068a30efe (diff)
downloadillumos-gate-onnv_63.tar.gz
6479998 CPU DR should not panic the system on memory allocation failureonnv_63
Diffstat (limited to 'usr/src/uts/sun4/os/mp_startup.c')
-rw-r--r--usr/src/uts/sun4/os/mp_startup.c28
1 files changed, 16 insertions, 12 deletions
diff --git a/usr/src/uts/sun4/os/mp_startup.c b/usr/src/uts/sun4/os/mp_startup.c
index cb793f3563..8436db7273 100644
--- a/usr/src/uts/sun4/os/mp_startup.c
+++ b/usr/src/uts/sun4/os/mp_startup.c
@@ -46,7 +46,7 @@
#endif /* TRAPTRACE */
#include <sys/cpu_sgnblk_defs.h>
-extern void cpu_intrq_setup(struct cpu *);
+extern int cpu_intrq_setup(struct cpu *);
extern void cpu_intrq_cleanup(struct cpu *);
extern void cpu_intrq_register(struct cpu *);
@@ -280,7 +280,7 @@ int trap_trace_inuse[NCPU];
/*
* Routine to set up a CPU to prepare for starting it up.
*/
-void
+int
setup_cpu_common(int cpuid)
{
struct cpu *cp = NULL;
@@ -292,6 +292,7 @@ setup_cpu_common(int cpuid)
#endif /* TRAPTRACE */
extern void idle();
+ int rval;
ASSERT(MUTEX_HELD(&cpu_lock));
ASSERT(cpu[cpuid] == NULL);
@@ -419,13 +420,16 @@ setup_cpu_common(int cpuid)
if (nosteal_nsec == -1)
cmp_set_nosteal_interval();
- cpu_intrq_setup(cp);
+ if ((rval = cpu_intrq_setup(cp)) != 0) {
+ return (rval);
+ }
/*
* Initialize MMU context domain information.
*/
sfmmu_cpu_init(cp);
+ return (0);
}
/*
@@ -450,8 +454,10 @@ cleanup_cpu_common(int cpuid)
cpu_uninit_private(cp);
/* Free cpu ID string and brand string. */
- kmem_free(cp->cpu_idstr, strlen(cp->cpu_idstr) + 1);
- kmem_free(cp->cpu_brandstr, strlen(cp->cpu_brandstr) + 1);
+ if (cp->cpu_idstr)
+ kmem_free(cp->cpu_idstr, strlen(cp->cpu_idstr) + 1);
+ if (cp->cpu_brandstr)
+ kmem_free(cp->cpu_brandstr, strlen(cp->cpu_brandstr) + 1);
cpu_vm_data_destroy(cp);
@@ -512,7 +518,8 @@ cleanup_cpu_common(int cpuid)
*/
disp_cpu_fini(cp);
cpu_pa[cpuid] = 0;
- sfmmu_cpu_cleanup(cp);
+ if (CPU_MMU_CTXP(cp))
+ sfmmu_cpu_cleanup(cp);
bzero(cp, sizeof (*cp));
/*
@@ -651,11 +658,6 @@ slave_startup(void)
extern struct cpu *cpu[NCPU]; /* pointers to all CPUs */
-extern void setup_cpu_common(int);
-extern void common_startup_init(cpu_t *, int);
-extern void start_cpu(int, void(*func)(int));
-extern void cold_flag_set(int cpuid);
-
/*
* cpu_bringup_set is a tunable (via /etc/system, debugger, etc.) that
* can be used during debugging to control which processors are brought
@@ -752,7 +754,9 @@ start_other_cpus(int flag)
ASSERT(cpu[cpuid] == NULL);
- setup_cpu_common(cpuid);
+ if (setup_cpu_common(cpuid)) {
+ cmn_err(CE_PANIC, "cpu%d: setup failed", cpuid);
+ }
common_startup_init(cpu[cpuid], cpuid);