struct sb_map
{
relptr(sb_map) self;
+ Size offset;
Size npages;
bool use64;
};
* been set.
*/
void
-sb_map_initialize(sb_map *m, char *base, Size npages)
+sb_map_initialize(sb_map *m, char *base, Size offset, Size npages)
{
relptr_store(base, m->self, m);
+ m->offset = offset;
m->npages = npages;
if (sizeof(Size) <= 4 || (base != NULL && npages < maxpages_4b))
m->use64 = false;
sb_map_set(sb_map *m, Size pageno, void *ptr)
{
char *base = sb_map_base(m);
+ Assert(pageno >= m->offset);
+ pageno -= m->offset;
Assert(pageno < m->npages);
if (m->use64)
sb_map_get(sb_map *m, Size pageno)
{
char *base = sb_map_base(m);
+ Assert(pageno >= m->offset);
+ pageno -= m->offset;
Assert(pageno < m->npages);
if (m->use64)
FreePageManagerInitialize(region->fpm, region->region_start, NULL, false);
FreePageManagerPut(region->fpm, metadata_bytes / FPM_PAGE_SIZE,
new_region_net_pages);
- sb_map_initialize(region->pagemap, NULL, new_region_net_pages);
+ sb_map_initialize(region->pagemap, NULL, metadata_bytes / FPM_PAGE_SIZE,
+ new_region_net_pages);
region->contiguous_pages = new_region_net_pages; /* Now fix the value. */
freelist = Min(fls(new_region_net_pages), NUM_PRIVATE_FREELISTS);
dlist_push_head(&private_freelist[freelist], ®ion->fl_node);
typedef struct sb_map sb_map;
extern Size sb_map_size(char *base, Size npages);
-extern void sb_map_initialize(sb_map *, char *base, Size npages);
+extern void sb_map_initialize(sb_map *, char *base, Size offset, Size npages);
extern void sb_map_set(sb_map *, Size pageno, void *ptr);
extern void *sb_map_get(sb_map *, Size pageno);