diff --git a/src/lisp/gencgc.h b/src/lisp/gencgc.h index 363736fa9e3aa2c9009f635a23e94e35cfc97a5d..60f650604a92b99ab29fd3121c811e7d82def4bc 100644 --- a/src/lisp/gencgc.h +++ b/src/lisp/gencgc.h @@ -35,13 +35,39 @@ int gc_write_barrier(void *); */ #define PAGE_NEEDS_ZEROING_MARKER 0xdead0000 +/* + * The various fields packed into the struct page flags member. + */ + +/* + * The generation that this page belongs to. This should be valid for + * all pages that may have objects allocated, even current allocation + * region pages - this allows the space of an object to be easily + * determined. + */ + +#define PAGE_GENERATION_MASK 0x0000000f +#define PAGE_GENERATION(page) \ + (page_table[page].flags & PAGE_GENERATION_MASK) + +#define PAGE_FLAGS(page, mask) (page_table[page].flags & (mask)) +#define PAGE_FLAGS_UPDATE(page, mmask, mflags) \ + (page_table[page].flags = (page_table[page].flags & ~(mmask)) | (mflags)) + + +/* + * After the generation, we have a set of bits. This defines the + * location of the first of the bit fields. + */ +#define PAGE_BASE_BIT_SHIFT 4 + /* * Set when the page is write protected. If it is writen into it is * made writable and this flag is cleared. This should always reflect * the actual write_protect status of a page. */ -#define PAGE_WRITE_PROTECTED_MASK 0x00000010 +#define PAGE_WRITE_PROTECTED_MASK (1 << PAGE_BASE_BIT_SHIFT) #define PAGE_WRITE_PROTECTED(page) \ (page_table[page].flags & PAGE_WRITE_PROTECTED_MASK) @@ -51,14 +77,14 @@ int gc_write_barrier(void *); * the bytes_used must be 0. */ -#define PAGE_ALLOCATED_MASK 0x00000040 +#define PAGE_ALLOCATED_MASK (1 << (PAGE_BASE_BIT_SHIFT + 1)) #define PAGE_ALLOCATED(page) (page_table[page].flags & PAGE_ALLOCATED_MASK) /* * Unboxed region flag: 1 for unboxed objects, 0 for boxed objects. */ -#define PAGE_UNBOXED_MASK 0x00000080 -#define PAGE_UNBOXED_SHIFT 7 +#define PAGE_UNBOXED_SHIFT (PAGE_BASE_BIT_SHIFT + 2) +#define PAGE_UNBOXED_MASK (1 << PAGE_UNBOXED_SHIFT) #define PAGE_UNBOXED(page) (page_table[page].flags & PAGE_UNBOXED_MASK) #define PAGE_UNBOXED_VAL(page) (PAGE_UNBOXED(page) >> PAGE_UNBOXED_SHIFT) @@ -67,7 +93,7 @@ int gc_write_barrier(void *); * set. It's only valid during a GC for allocated pages. */ -#define PAGE_DONT_MOVE_MASK 0x00000100 +#define PAGE_DONT_MOVE_MASK (1 << (PAGE_BASE_BIT_SHIFT + 3)) #define PAGE_DONT_MOVE(page) \ (page_table[page].flags & PAGE_DONT_MOVE_MASK) @@ -77,28 +103,13 @@ int gc_write_barrier(void *); * valid when the page is allocated. */ -#define PAGE_LARGE_OBJECT_MASK 0x00000200 -#define PAGE_LARGE_OBJECT_SHIFT 9 +#define PAGE_LARGE_OBJECT_SHIFT (PAGE_BASE_BIT_SHIFT + 4) +#define PAGE_LARGE_OBJECT_MASK (1 << PAGE_LARGE_OBJECT_SHIFT) #define PAGE_LARGE_OBJECT(page) \ (page_table[page].flags & PAGE_LARGE_OBJECT_MASK) #define PAGE_LARGE_OBJECT_VAL(page) \ (PAGE_LARGE_OBJECT(page) >> PAGE_LARGE_OBJECT_SHIFT) -/* - * The generation that this page belongs to. This should be valid for - * all pages that may have objects allocated, even current allocation - * region pages - this allows the space of an object to be easily - * determined. - */ - -#define PAGE_GENERATION_MASK 0x0000000f -#define PAGE_GENERATION(page) \ - (page_table[page].flags & PAGE_GENERATION_MASK) - -#define PAGE_FLAGS(page, mask) (page_table[page].flags & (mask)) -#define PAGE_FLAGS_UPDATE(page, mmask, mflags) \ - (page_table[page].flags = (page_table[page].flags & ~(mmask)) | (mflags)) - struct page { /* * Page flags.