From cb529aaf25814d19d30207929c359d5f6cac040d Mon Sep 17 00:00:00 2001
From: Raymond Toy <toy.raymond@gmail.com>
Date: Sat, 8 May 2021 22:12:59 +0000
Subject: [PATCH] Address #89: Clean up page flags

---
 src/lisp/gencgc.h | 55 ++++++++++++++++++++++++++++-------------------
 1 file changed, 33 insertions(+), 22 deletions(-)

diff --git a/src/lisp/gencgc.h b/src/lisp/gencgc.h
index 363736fa9..60f650604 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.
-- 
GitLab