#!/usr/bin/env python3
from math import ceil as c
def get_offsets(addr):
    if addr % 4096:
        print("You must align to 4096!")
        return 0
    if addr > 2 ** 47:
        print("Address too big!")
        return 0


    pte = (addr >> 12) & 0x1ff 
    pde = (addr >> 21) & 0x1ff 
    pdpe =(addr >> 30) & 0x1ff 
    pml4 =(addr >> 39) & 0x1ff 
    print("pte:\t{}\npde:\t{}\npdpe:\t{}\npml4:\t{}".format(pte, pde, pdpe, pml4))

def get_table_size(addr):
    pte_cnt = c(c(addr / (1 << 12)) / 512) * 512
    pde_cnt = c(c(addr / (1 << 21)) / 512) * 512
    pdpe_cnt = c(c(addr / (1 << 30)) / 512) * 512
    pml4_cnt = c(c(addr / (1 << 39)) / 512) * 512


    return((pte_cnt + pde_cnt + pdpe_cnt + pml4_cnt) * 8)

ts = get_table_size(68719476736) 
print(hex(ts))

