| # This upgrader moves memory pool attributes from a vector of pointers to the |
| # next free page and a vector of the limit of each pool to sections which each |
| # represent one pool and which hold the page shift amount, the next free page, |
| # and the total pages in the pool. |
| def upgrader(cpt): |
| systems = {} |
| for sec in cpt.sections(): |
| ptrs = cpt.get(sec, 'ptrs', fallback=None) |
| limits = cpt.get(sec, 'limits', fallback=None) |
| |
| if ptrs and limits: |
| systems[sec] = ptrs, limits |
| |
| for sec, (ptrs, limits) in systems.items(): |
| |
| ptrs = list(map(int, ptrs.split())) |
| limits = list(map(int, limits.split())) |
| |
| if len(ptrs) != len(limits): |
| print( |
| f"'{sec}ptrs' and '{limits}limits' were not the same length!") |
| |
| cpt.set(sec, 'num_mem_pools', str(len(ptrs))) |
| |
| cpt.remove_option(sec, 'ptrs') |
| cpt.remove_option(sec, 'limits') |
| |
| # Assume the page shift is 12, for a 4KiB page. |
| page_shift = 12 |
| |
| for idx, (ptr, limit) in enumerate(zip(ptrs, limits)): |
| new_sec = f'{sec}.memPool{idx}' |
| cpt.add_section(new_sec) |
| cpt.set(new_sec, 'page_shift', str(page_shift)) |
| # Since there's no way to tell where the pool actually started, |
| # just assume it started wherever it is right now. |
| cpt.set(new_sec, 'start_page', str(ptr >> page_shift)) |
| cpt.set(new_sec, 'free_page_num', str(ptr >> page_shift)) |
| cpt.set(new_sec, 'total_pages', str((limit - ptr) >> page_shift)) |