|
@@ -424,9 +424,18 @@ void __init setup_system(void)
|
|
|
DBG(" <- setup_system()\n");
|
|
|
}
|
|
|
|
|
|
+static u64 slb0_limit(void)
|
|
|
+{
|
|
|
+ if (cpu_has_feature(CPU_FTR_1T_SEGMENT)) {
|
|
|
+ return 1UL << SID_SHIFT_1T;
|
|
|
+ }
|
|
|
+ return 1UL << SID_SHIFT;
|
|
|
+}
|
|
|
+
|
|
|
#ifdef CONFIG_IRQSTACKS
|
|
|
static void __init irqstack_early_init(void)
|
|
|
{
|
|
|
+ u64 limit = slb0_limit();
|
|
|
unsigned int i;
|
|
|
|
|
|
/*
|
|
@@ -436,10 +445,10 @@ static void __init irqstack_early_init(void)
|
|
|
for_each_possible_cpu(i) {
|
|
|
softirq_ctx[i] = (struct thread_info *)
|
|
|
__va(lmb_alloc_base(THREAD_SIZE,
|
|
|
- THREAD_SIZE, 0x10000000));
|
|
|
+ THREAD_SIZE, limit));
|
|
|
hardirq_ctx[i] = (struct thread_info *)
|
|
|
__va(lmb_alloc_base(THREAD_SIZE,
|
|
|
- THREAD_SIZE, 0x10000000));
|
|
|
+ THREAD_SIZE, limit));
|
|
|
}
|
|
|
}
|
|
|
#else
|
|
@@ -470,7 +479,7 @@ static void __init exc_lvl_early_init(void)
|
|
|
*/
|
|
|
static void __init emergency_stack_init(void)
|
|
|
{
|
|
|
- unsigned long limit;
|
|
|
+ u64 limit;
|
|
|
unsigned int i;
|
|
|
|
|
|
/*
|
|
@@ -482,7 +491,7 @@ static void __init emergency_stack_init(void)
|
|
|
* bringup, we need to get at them in real mode. This means they
|
|
|
* must also be within the RMO region.
|
|
|
*/
|
|
|
- limit = min(0x10000000ULL, lmb.rmo_size);
|
|
|
+ limit = min(slb0_limit(), lmb.rmo_size);
|
|
|
|
|
|
for_each_possible_cpu(i) {
|
|
|
unsigned long sp;
|