u32 desc1, desc2;
u32 *pgtable, *cpt;
u32 start, end;
+ u32 mask;
if (in_cb & WCB_C_BIT)
bits |= 8;
if (in_cb & WCB_B_BIT)
bits |= 4;
- size += addr & (PAGE_SIZE - 1);
- size = ALIGN(size, PAGE_SIZE);
+ mask = PAGE_SIZE - 1;
+ size += addr & mask;
+ size = (size + mask) & ~mask;
addr &= ~(PAGE_SIZE - 1);
start = addr;
case 3: /* fine table */
cpt = __va(desc1 & 0xfffff000);
desc2 = cpt[(addr >> 10) & 0x3ff];
+ break;
default:
return -EINVAL;
}
switch (desc2 & 3) {
case 1: /* large page */
- *_addr = (desc2 & 0xffff0000) | (addr & 0xffff);
+ *_addr = (desc2 & ~0xffff) | (addr & 0xffff);
break;
case 2: /* small page */
- *_addr = (desc2 & 0xfffff000) | (addr & 0x0fff);
+ *_addr = (desc2 & ~0x0fff) | (addr & 0x0fff);
break;
case 3: /* tiny page */
- *_addr = (desc2 & 0xfffffc00) | (addr & 0x03ff);
+ *_addr = (desc2 & ~0x03ff) | (addr & 0x03ff);
break;
default:
return -EINVAL;