get_paca()->mm_ctx_id = context->id;
 #ifdef CONFIG_PPC_MM_SLICES
+       VM_BUG_ON(!mm->context.addr_limit);
        get_paca()->mm_ctx_low_slices_psize = context->low_slices_psize;
        memcpy(&get_paca()->mm_ctx_high_slices_psize,
-              &context->high_slices_psize, SLICE_ARRAY_SIZE);
+              &context->high_slices_psize, TASK_SLICE_ARRAY_SZ(mm));
 #else /* CONFIG_PPC_MM_SLICES */
        get_paca()->mm_ctx_user_psize = context->user_psize;
        get_paca()->mm_ctx_sllp = context->sllp;
 
        if (mm->task_size <= SLICE_LOW_TOP)
                return;
 
-       for (i = 0; i < SLICE_NUM_HIGH; i++)
+       for (i = 0; i < GET_HIGH_SLICE_INDEX(mm->context.addr_limit); i++)
                if (!slice_high_has_vma(mm, i))
                        __set_bit(i, ret->high_slices);
 }
                        ret->low_slices |= 1u << i;
 
        hpsizes = mm->context.high_slices_psize;
-       for (i = 0; i < SLICE_NUM_HIGH; i++) {
+       for (i = 0; i < GET_HIGH_SLICE_INDEX(mm->context.addr_limit); i++) {
                mask_index = i & 0x1;
                index = i >> 1;
                if (((hpsizes[index] >> (mask_index * 4)) & 0xf) == psize)
        }
 }
 
-static int slice_check_fit(struct slice_mask mask, struct slice_mask available)
+static int slice_check_fit(struct mm_struct *mm,
+                          struct slice_mask mask, struct slice_mask available)
 {
        DECLARE_BITMAP(result, SLICE_NUM_HIGH);
+       unsigned long slice_count = GET_HIGH_SLICE_INDEX(mm->context.addr_limit);
 
        bitmap_and(result, mask.high_slices,
-                  available.high_slices, SLICE_NUM_HIGH);
+                  available.high_slices, slice_count);
 
        return (mask.low_slices & available.low_slices) == mask.low_slices &&
-               bitmap_equal(result, mask.high_slices, SLICE_NUM_HIGH);
+               bitmap_equal(result, mask.high_slices, slice_count);
 }
 
 static void slice_flush_segments(void *parm)
        mm->context.low_slices_psize = lpsizes;
 
        hpsizes = mm->context.high_slices_psize;
-       for (i = 0; i < SLICE_NUM_HIGH; i++) {
+       for (i = 0; i < GET_HIGH_SLICE_INDEX(mm->context.addr_limit); i++) {
                mask_index = i & 0x1;
                index = i >> 1;
                if (test_bit(i, mask.high_slices))
                /* Check if we fit in the good mask. If we do, we just return,
                 * nothing else to do
                 */
-               if (slice_check_fit(mask, good_mask)) {
+               if (slice_check_fit(mm, mask, good_mask)) {
                        slice_dbg(" fits good !\n");
                        return addr;
                }
        slice_or_mask(&potential_mask, &good_mask);
        slice_print_mask(" potential", potential_mask);
 
-       if ((addr != 0 || fixed) && slice_check_fit(mask, potential_mask)) {
+       if ((addr != 0 || fixed) && slice_check_fit(mm, mask, potential_mask)) {
                slice_dbg(" fits potential !\n");
                goto convert;
        }
        slice_print_mask(" mask", mask);
        slice_print_mask(" available", available);
 #endif
-       return !slice_check_fit(mask, available);
+       return !slice_check_fit(mm, mask, available);
 }
 #endif