lphi = (l >> 16) & 0xf;
        switch ((l >> 12) & 0xf) {
        case 0:
-               return !lphi ? 24 : -1;         /* 16MB */
+               return !lphi ? 24 : 0;          /* 16MB */
                break;
        case 1:
                return 16;                      /* 64kB */
                break;
        case 3:
-               return !lphi ? 34 : -1;         /* 16GB */
+               return !lphi ? 34 : 0;          /* 16GB */
                break;
        case 7:
                return (16 << 8) + 12;          /* 64kB in 4kB */
                        return (24 << 8) + 12;  /* 16MB in 4kB */
                break;
        }
-       return -1;
+       return 0;
 }
 
 static inline int kvmppc_hpte_base_page_shift(unsigned long h, unsigned long l)
 
 static inline unsigned long kvmppc_actual_pgsz(unsigned long v, unsigned long r)
 {
-       return 1ul << kvmppc_hpte_actual_page_shift(v, r);
+       int shift = kvmppc_hpte_actual_page_shift(v, r);
+
+       if (shift)
+               return 1ul << shift;
+       return 0;
 }
 
 static inline int kvmppc_pgsize_lp_encoding(int base_shift, int actual_shift)
                va_low ^= v >> (SID_SHIFT_1T - 16);
        va_low &= 0x7ff;
 
-       if (b_pgshift == 12) {
+       if (b_pgshift <= 12) {
                if (a_pgshift > 12) {
                        sllp = (a_pgshift == 16) ? 5 : 4;
                        rb |= sllp << 5;        /*  AP field */