3 * Copyright 2001-2003 Ximian, Inc
4 * Copyright 2003-2010 Novell, Inc.
6 * Licensed under the MIT license. See LICENSE file in the project root for full license information.
8 #ifndef __MONO_SGEN_CARD_TABLE_INLINES_H__
9 #define __MONO_SGEN_CARD_TABLE_INLINES_H__
11 /*WARNING: This function returns the number of cards regardless of overflow in case of overlapping cards.*/
12 mword
sgen_card_table_number_of_cards_in_range (mword address
, mword size
);
13 guint8
* sgen_find_next_card (guint8
*card_data
, guint8
*end
);
15 void sgen_card_table_reset_region (mword start
, mword end
);
16 void* sgen_card_table_align_pointer (void *ptr
);
17 void sgen_card_table_mark_range (mword address
, mword size
);
18 void sgen_cardtable_scan_object (GCObject
*obj
, mword obj_size
, guint8
*cards
,
21 gboolean
sgen_card_table_get_card_data (guint8
*dest
, mword address
, mword cards
);
23 guint8
* sgen_card_table_alloc_mod_union (char *obj
, mword obj_size
);
24 void sgen_card_table_free_mod_union (guint8
*mod_union
, char *obj
, mword obj_size
);
26 void sgen_card_table_update_mod_union_from_cards (guint8
*dest
, guint8
*start_card
, size_t num_cards
);
27 void sgen_card_table_update_mod_union (guint8
*dest
, char *obj
, mword obj_size
, size_t *out_num_cards
);
28 void sgen_card_table_preclean_mod_union (guint8
*cards
, guint8
*cards_preclean
, size_t num_cards
);
30 guint8
* sgen_get_card_table_configuration (int *shift_bits
, gpointer
*mask
);
31 guint8
* sgen_get_target_card_table_configuration (int *shift_bits
, target_mgreg_t
*mask
);
33 void sgen_card_table_init (SgenRememberedSet
*remset
);
35 /*How many bytes a single card covers*/
38 /* How many bits of the address space is covered by the card table.
39 * If this value is smaller than the number of address bits, card aliasing is required.
41 #define CARD_TABLE_BITS 32
43 #define CARD_SIZE_IN_BYTES (1 << CARD_BITS)
44 #define CARD_COUNT_BITS (CARD_TABLE_BITS - CARD_BITS)
45 #define CARD_COUNT_IN_BYTES (1 << CARD_COUNT_BITS)
46 #define CARD_MASK ((1 << CARD_COUNT_BITS) - 1)
48 #if SIZEOF_VOID_P * 8 > CARD_TABLE_BITS
49 #define SGEN_HAVE_OVERLAPPING_CARDS 1
52 #if TARGET_SIZEOF_VOID_P * 8 > CARD_TABLE_BITS
53 #define SGEN_TARGET_HAVE_OVERLAPPING_CARDS 1
56 extern guint8
*sgen_cardtable
;
59 #ifdef SGEN_HAVE_OVERLAPPING_CARDS
62 sgen_card_table_get_card_address (mword address
)
64 return sgen_cardtable
+ ((address
>> CARD_BITS
) & CARD_MASK
);
67 extern guint8
*sgen_shadow_cardtable
;
69 #define SGEN_SHADOW_CARDTABLE_END (sgen_shadow_cardtable + CARD_COUNT_IN_BYTES)
72 sgen_card_table_get_shadow_card_address (mword address
)
74 return sgen_shadow_cardtable
+ ((address
>> CARD_BITS
) & CARD_MASK
);
77 static inline gboolean
78 sgen_card_table_card_begin_scanning (mword address
)
80 return *sgen_card_table_get_shadow_card_address (address
) != 0;
84 sgen_card_table_prepare_card_for_scanning (guint8
*card
)
88 #define sgen_card_table_get_card_scan_address sgen_card_table_get_shadow_card_address
93 sgen_card_table_get_card_address (mword address
)
95 return sgen_cardtable
+ (address
>> CARD_BITS
);
98 static inline gboolean
99 sgen_card_table_card_begin_scanning (mword address
)
101 guint8
*card
= sgen_card_table_get_card_address (address
);
102 gboolean res
= *card
;
108 sgen_card_table_prepare_card_for_scanning (guint8
*card
)
113 #define sgen_card_table_get_card_scan_address sgen_card_table_get_card_address
117 static inline gboolean
118 sgen_card_table_address_is_marked (mword address
)
120 return *sgen_card_table_get_card_address (address
) != 0;
124 sgen_card_table_mark_address (mword address
)
126 *sgen_card_table_get_card_address (address
) = 1;
130 sgen_card_table_get_card_offset (char *ptr
, char *base
)
132 return (ptr
- base
) >> CARD_BITS
;