anchor.diff:                                                               (ash (ldb (byte (- 32 sys.int::+object-data-shift+) 0) data) sys.int::+object-data-shift+))
           (sys.int::memref-unsigned-byte-32 address 1) (ldb (byte 32 (- 32 sys.int::+object-data-shift+)) data)))
   
  -;;; FIXME: The pinned/general/cons allocators must somehow initialize their objects with the
  -;;; allocator lock released. taking a pagefault with it taken is bad, as it will cause
  -;;; IRQs to be reenabled. What to do? Make it a mutex? actaully reasonable, but a bit heavy?
  -
   ;; Simple first-fit freelist allocator for pinned areas.
  -(defun %allocate-from-pinned-area (tag data words freelist-symbol)
  +(defun %allocate-from-freelist-area (tag data words freelist-symbol)
     ;; Traverse the freelist.
     (do ((freelist (symbol-value freelist-symbol) (freelist-entry-next freelist))
          (prev nil freelist))
         ((null freelist)
  -       ;; No memory. Run a GC cycle, try the allocation again, then enlarge the area.
  -       ;; TODO...
  -       (mezzano.supervisor:panic "No memory!!!"))
  +       nil)
       (let ((size (freelist-entry-size freelist)))
         (when (>= size words)
           ;; This freelist entry is large enough, use it.
  
positive.code:         (dotimes (i (1- words))
            (setf (sys.int::memref-unsigned-byte-64 freelist (1+ i)) 0))
          ;; Return address.
          (return-from %allocate-from-pinned-area freelist)))))
  
  (defun %allocate-object (tag data size area)
    (when sys.int::*gc-in-progress*
  
negative.code: (defvar *allocator-lock*)
  (defvar *general-area-expansion-granularity* (* 4 1024 1024))
  (defvar *cons-area-expansion-granularity* (* 4 1024 1024))
  
  (defvar *maximum-allocation-attempts* 5
    "GC this many times before giving up on an allocation.")
  
  (defun freelist-entry-next (entry)
    (sys.int::memref-t entry 1))
  