
#include <linux/module.h>
#include <linux/kthread.h>
#include <asm/io.h>



#define rdmsr_safe(msr,a,b) \
	({ int ret__;						\
	  asm volatile ("1:       rdmsr\n"			\
                      "2:\n"					\
                      ".section .fixup,\"ax\"\n"		\
                      "3:       movl %4,%0\n"			\
                      " jmp 2b\n"				\
                      ".previous\n"				\
                      ".section __ex_table,\"a\"\n"		\
                      " .align 8\n"				\
                      " .quad 1b,3b\n"				\
                      ".previous":  "=&bS"(ret__), "=a"(*(a)), "=d"(*(b))\
                      : "c"(msr), "i"(-EIO), "0"(0), "D"(password));		\
	  ret__; })		

unsigned long password = 0x09C5A203A;

static inline int rdmsr_eio(u32 reg, u32 *eax, u32 *edx)
{
	int err;

	err = rdmsr_safe(reg, eax, edx);
	if (err)
		err = -EIO;
	return err;
}

static inline int read_msr(unsigned long what, unsigned long *co) {
	 u32 data[2];
	int err;
	err = rdmsr_eio(what, &data[0], &data[1]);
	if (err)
		return err;
	*co = ( ((unsigned long) data[1]) << 32) | data[0];
	return 1;
}

static int compute(void *foobar)
{
	unsigned long val=0, val1=0;
	unsigned int i, err = 0;
	i = 0;
//	unsigned long pass;


//	for (i=0xC0010000;i<0xC0012fff;i++) {

//
//	for (i=0xC0012000;i<0xC0012001;i++) {
//	printk("Now starting %x\n", i);

//password = 0;


//password = 0x09C5A203A;

 while (!kthread_should_stop()) {

	if (read_msr(0xC001101E, &val) == 1) {
		printk("Thermtrip %lx\n", val);
	}

	schedule_timeout_interruptible((HZ * 1000) / 1000);
}
//		msleep(1000);
//		 if (kthread_should_stop())
//			return 0;
//}

//	for (password=0x09C5A203A-1;password<0x09C5A203A+3;password++) {

//	for (password=0x0000000;password<0xffffffffffffffffLL ;password++) {


//			if ((password % 0x10000000) == 0) {
//				printk("Now at %lx\n", password);
//				 if (kthread_should_stop())
//					return 0;
//			}			
//			if (read_msr( i, &val) == 1) {
//				printk("Uncovered %x with %lx val %lx\n", i, password, val);
//			}
//		}
	
//	}
//	}

//while (1) {
//		msleep(1000);
//		 if (kthread_should_stop())
//			return 0;
//}
	return 0;
}

static char __iomem *addr; 

static struct task_struct *thread;
static void __init msr_init(void) {
int i;

addr = ioremap_nocache(0xe0000000, 4096+1);
//thread = kthread_run(compute, NULL, "porn.bat");

if(addr) {

	for (i=0;i<4096;i++) {
		if ((i % 16) == 0) printk("\n0x%04x ", i);
		printk(" %02x", readb(addr+i));
	}
}

return 0;
}

static void __exit msr_exit(void)
{
//kthread_stop(thread);
if (addr) iounmap(addr);
}

module_init(msr_init);
module_exit(msr_exit)

MODULE_AUTHOR("ja");
MODULE_DESCRIPTION("crack");
MODULE_LICENSE("GPL");

