#define MODULE #define __KERNEL__ #include #include #include #include #include #include extern void *sys_call_table[]; flush_t() { __asm__ __volatile__ ( "movl %%cr3, %%eax\n\t" "movl %%eax, %%cr3\n\t" :::"ax", "cc"); } disable_cache() { __asm__ __volatile__ ( "cli\n\t" "movl %%cr0, %%eax\n\t" "orl $0x60000000, %%eax\n\t" "movl %%eax, %%cr0\n\t" "wbinvd\n\t" "sti\n\t" :::"ax", "cc"); return 0; } enable_cache() { __asm__ __volatile__ ( "cli\n\t" "movl %%cr0, %%eax\n\t" "andl $0x9fffffff, %%eax\n\t" "movl %%eax, %%cr0\n\t" "wbinvd\n\t" "sti\n\t" :::"ax", "cc"); return 0; } disable_cache_wt() { __asm__ __volatile__ ( "cli\n\t" "movl %%cr0, %%eax\n\t" "andl $0xdfffffff, %%eax\n\t" "orl $0x40000000, %%eax\n\t" "movl %%eax, %%cr0\n\t" "wbinvd\n\t" "sti\n\t" :::"ax", "cc"); return 0; } disable_page_cache(unsigned long pg) { pte_t *pte = pte_offset(pmd_offset(pgd_offset(current->mm, pg), pg), pg); *(unsigned *)pte |= 0x18; flush_t(); return 0; } enable_page_cache(unsigned long pg) { pte_t *pte = pte_offset(pmd_offset(pgd_offset(current->mm, pg), pg), pg); *(unsigned *)pte &= ~0x18; flush_t(); return 0; } init_module() { sys_call_table[250] = disable_cache; sys_call_table[251] = enable_cache; sys_call_table[252] = disable_cache_wt; sys_call_table[253] = disable_page_cache; sys_call_table[254] = enable_page_cache; return 0; } cleanup_module() { sys_call_table[250] = sys_call_table[251] = sys_call_table[252] = 0; sys_call_table[253] = sys_call_table[254] = 0; }