Move the biasedCardTableBase out of the non-public GcHeap structure,
and back to DvmGlobals where it can be found. Create dvmIsValidCard to
access the values hidden in the GcHeap.

This is a half-step to inlining dvmMarkCard and dvmCardFromAddr.

Change-Id: I50158915802d7f08ddadb60ca6907afd279df2a8
diff --git a/vm/alloc/CardTable.c b/vm/alloc/CardTable.c
index 49562a7..c8d7f08 100644
--- a/vm/alloc/CardTable.c
+++ b/vm/alloc/CardTable.c
@@ -91,7 +91,7 @@
         biasedBase += offset + (offset < 0 ? 0x100 : 0);
     }
     assert(((uintptr_t)biasedBase & 0xff) == GC_CARD_DIRTY);
-    gcHeap->biasedCardTableBase = biasedBase;
+    gDvm.biasedCardTableBase = biasedBase;
 
     return true;
 }
@@ -105,15 +105,24 @@
 }
 
 /*
+ * Returns true iff the address is within the bounds of the card table.
+ */
+bool dvmIsValidCard(const u1 *cardAddr)
+{
+    GcHeap *h = gDvm.gcHeap;
+    return cardAddr >= h->cardTableBase &&
+        cardAddr < &h->cardTableBase[h->cardTableLength];
+}
+
+/*
  * Returns the address of the relevent byte in the card table, given
  * an address on the heap.
  */
 u1 *dvmCardFromAddr(const void *addr)
 {
-    GcHeap *h = gDvm.gcHeap;
-    u1 *cardAddr = h->biasedCardTableBase + ((uintptr_t)addr >> GC_CARD_SHIFT);
-    assert(cardAddr >= h->cardTableBase);
-    assert(cardAddr < &h->cardTableBase[h->cardTableLength]);
+    u1 *biasedBase = gDvm.biasedCardTableBase;
+    u1 *cardAddr = biasedBase + ((uintptr_t)addr >> GC_CARD_SHIFT);
+    assert(dvmIsValidCard(cardAddr));
     return cardAddr;
 }
 
@@ -122,10 +131,8 @@
  */
 void *dvmAddrFromCard(const u1 *cardAddr)
 {
-    GcHeap *h = gDvm.gcHeap;
-    assert(cardAddr >= h->cardTableBase);
-    assert(cardAddr < &h->cardTableBase[h->cardTableLength]);
-    uintptr_t offset = cardAddr - h->biasedCardTableBase;
+    assert(dvmIsValidCard(cardAddr));
+    uintptr_t offset = cardAddr - gDvm.biasedCardTableBase;
     return (void *)(offset << GC_CARD_SHIFT);
 }