* This software is part of the SBCL system. See the README file for
* more information.
*
* This software is derived from the CMU CL system, which was
* written at Carnegie Mellon University and released into the
* public domain. The software is in the public domain and is
* provided with absolutely no warranty. See the COPYING and CREDITS
* files for more information.
*/
#ifndef _GENCGC_PRIVATE_H_
#define _GENCGC_PRIVATE_H_
void zero_dirty_pages(page_index_t start, page_index_t end, int page_type);
#define page_bytes_used(index) (page_table[index].bytes_used_ & ~1)
#define page_need_to_zero(index) (page_table[index].bytes_used_ & 1)
#define set_page_bytes_used(index,val) \
page_table[index].bytes_used_ = (val) | page_need_to_zero(index)
#define set_page_need_to_zero(index,val) \
page_table[index].bytes_used_ = page_bytes_used(index) | val
#if !CONDENSED_PAGE_TABLE
#define set_page_scan_start_offset(index,val) \
page_table[index].scan_start_offset_ = val
#define page_scan_start_offset(index) page_table[index].scan_start_offset_
#else
#define SCAN_START_OFS_MAX UINT_MAX
static void __attribute__((unused))
set_page_scan_start_offset(page_index_t index, os_vm_size_t offset)
{
unsigned int lsb = offset !=0 && IS_ALIGNED(offset, GENCGC_CARD_BYTES);
os_vm_size_t scaled = (offset >> (lsb ? GENCGC_CARD_SHIFT-1 : WORD_SHIFT)) | lsb;
if (scaled > SCAN_START_OFS_MAX) {
gc_assert(lsb == 1);
scaled = SCAN_START_OFS_MAX;
}
page_table[index].scan_start_offset_ = scaled;
}
static os_vm_size_t scan_start_offset_iterated(page_index_t index)
{
page_index_t tot_offset_in_pages = 0;
unsigned int offset;
do {
page_index_t lookback_page = index - tot_offset_in_pages;
offset = page_table[lookback_page].scan_start_offset_;
tot_offset_in_pages += offset >> 1;
} while (offset == SCAN_START_OFS_MAX);
return (os_vm_size_t)tot_offset_in_pages << GENCGC_CARD_SHIFT;
}
static os_vm_size_t __attribute__((unused)) page_scan_start_offset(page_index_t index)
{
return page_table[index].scan_start_offset_ != SCAN_START_OFS_MAX
? (os_vm_size_t)(page_table[index].scan_start_offset_ & ~1)
<< ((page_table[index].scan_start_offset_ & 1) ?
(GENCGC_CARD_SHIFT-1) : WORD_SHIFT)
: scan_start_offset_iterated(index);
}
#endif
enum prot_mode { PHYSICAL, LOGICAL };
static inline enum prot_mode protection_mode(page_index_t page) {
#if CODE_PAGES_USE_SOFT_PROTECTION
return ((page_table[page].type & PAGE_TYPE_MASK) == CODE_PAGE_TYPE)
? LOGICAL : PHYSICAL;
#else
return PHYSICAL;
#endif
}
#ifndef LISP_FEATURE_SB_THREAD
#define SINGLE_THREAD_BOXED_REGION (struct alloc_region*)(STATIC_SPACE_START + 2*N_WORD_BYTES)
#endif
#endif