#ifndef __KERN_MM_SWAP_H__ #define __KERN_MM_SWAP_H__ #include #include #include #include /* * * swap_entry_t * -------------------------------------------- * | offset | reserved | 0 | * -------------------------------------------- * 24 bits 7 bits 1 bit * */ #define MAX_SWAP_OFFSET_LIMIT (1 << 24) extern size_t max_swap_offset; /* * * swap_offset - takes a swap_entry (saved in pte), and returns * the corresponding offset in swap mem_map. * */ #define swap_offset(entry) ({ \ size_t __offset = (entry >> 8); \ if (!(__offset > 0 && __offset < max_swap_offset)) { \ panic("invalid swap_entry_t = %08x.\n", entry); \ } \ __offset; \ }) struct swap_manager { const char *name; /* Global initialization for the swap manager */ int (*init) (void); /* Initialize the priv data inside mm_struct */ int (*init_mm) (struct mm_struct *mm); /* Called when tick interrupt occured */ int (*tick_event) (struct mm_struct *mm); /* Called when map a swappable page into the mm_struct */ int (*map_swappable) (struct mm_struct *mm, uintptr_t addr, struct Page *page, int swap_in); /* When a page is marked as shared, this routine is called to * delete the addr entry from the swap manager */ int (*set_unswappable) (struct mm_struct *mm, uintptr_t addr); /* Try to swap out a page, return then victim */ int (*swap_out_victim) (struct mm_struct *mm, struct Page **ptr_page, int in_tick); /* check the page relpacement algorithm */ int (*check_swap)(void); }; extern volatile int swap_init_ok; int swap_init(void); int swap_init_mm(struct mm_struct *mm); int swap_tick_event(struct mm_struct *mm); int swap_map_swappable(struct mm_struct *mm, uintptr_t addr, struct Page *page, int swap_in); int swap_set_unswappable(struct mm_struct *mm, uintptr_t addr); int swap_out(struct mm_struct *mm, int n, int in_tick); int swap_in(struct mm_struct *mm, uintptr_t addr, struct Page **ptr_result); //#define MEMBER_OFFSET(m,t) ((int)(&((t *)0)->m)) //#define FROM_MEMBER(m,t,a) ((t *)((char *)(a) - MEMBER_OFFSET(m,t))) #endif