44 lines
1.0 KiB
C
44 lines
1.0 KiB
C
#include<linux/module.h>
|
|
#include<linux/printk.h>
|
|
#include<linux/mm.h>
|
|
#include<asm/desc.h>
|
|
#include<linux/kernel.h>
|
|
#include<asm/traps.h>
|
|
|
|
|
|
static u64 kern_page; // u64 - macro meaning unsigned 64 bits
|
|
static gate
|
|
static struct desc_ptr default_idtr; // to save existing idtr
|
|
|
|
static int __init IDT_rebuild(void)
|
|
{
|
|
struct desc_ptr idtr; // here we're going to store our new interupts table
|
|
pr_info("---IDT-REBUILD INITIATED---");
|
|
store_idt(&default_idtr); // getting current idtr and store it
|
|
pr_info("obtained idtr");
|
|
pr_info("allocating new memory page");
|
|
kern_page = __get_free_page(GFP_KERNEL);
|
|
if (!kern_page)
|
|
{
|
|
return -ENOMEM;
|
|
}
|
|
idtr.address = kern_page; // going to store
|
|
idtr.size = default_idtr.size;
|
|
return 0;
|
|
}
|
|
|
|
static void __exit IDT_restore(void)
|
|
{
|
|
struct desc_ptr idtr;
|
|
store_idt(&idtr);
|
|
if (idtr.address != default_idtr.address || idtr.size != default_idtr.size)
|
|
{
|
|
load_idt(&default_idtr);
|
|
free_page(kern_page);
|
|
}
|
|
}
|
|
|
|
module_init(IDT_rebuild);
|
|
module_exit(IDT_restore);
|
|
MODULE_LICENSE("GPL");
|