Files
solutions/09-keyboard/task1.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");