1 #include <linux/config.h>
\r
2 #include <linux/module.h>
\r
3 #include <linux/kernel.h>
\r
4 #include <linux/init.h>
\r
5 #include <linux/miscdevice.h>
\r
6 #include <asm/memory.h>
\r
8 #define MMUHACK_MINOR 225
\r
9 #define DEVICE_NAME "mmuhack"
\r
12 #include <linux/version.h>
\r
13 static const char __module_kernel_version_gcc3[] __attribute__((__used__)) __attribute__((section(".modinfo"))) =
\r
14 "kernel_version=" UTS_RELEASE;
\r
17 static ssize_t mmuhack_open(struct inode *inode, struct file *filp)
\r
19 unsigned int *pgtable;
\r
25 // get the pointer to the translation table base...
\r
27 "stmdb sp!, {r0}\n\t"
\r
28 "mrc p15, 0, r0, c2, c0, 0\n\t"
\r
30 "ldmia sp!, {r0}\n\t": "=r"(ttb)
\r
33 pgtable = __va(ttb);
\r
35 for (i = 0; i < 4096; i ++) if ( (pgtable[i] & 3) == 1 ) {
\r
36 cpt = __va(pgtable[i] & 0xfffffc00);
\r
38 for (j = 0; j < 256; j ++) {/*
\r
39 if ( (cpt[j] & 0xfe00000f) == 0x02000002 ) {
\r
40 // set C and B bits in upper 32MB memory area...
\r
41 printk("Set C&B bits %08x\n",cpt[j]);
\r
46 if (((cpt[j] & 0xff000000) == 0x02000000) && ((cpt[j] & 12)==0) )
\r
48 //printk("Set C&B bits %08x\n",cpt[j]);
\r
51 //if ((a>=0x31 && a<=0x36) && ((cpt[i] & 12)==0))
\r
52 if (((cpt[j] & 0xff000000) == 0x03000000) && ((cpt[j] & 12)==0))
\r
54 //printk("Set C&B bits %08x\n",cpt[j]);
\r
55 //printf("SDL c and b bits not set, overwriting\n");
\r
61 // drain the write buffer and flush the tlb caches...
\r
63 "stmdb sp!, {r0}\n\t"
\r
65 "mcr 15, 0, r0, cr7, cr10, 4\n\t"
\r
66 "mcr 15, 0, r0, cr8, cr7, 0\n\t"
\r
67 "ldmia sp!, {r0}\n\t"
\r
71 printk("MMU hack applied.\n");
\r
76 static struct file_operations mmuhack_fops = {
\r
82 static struct miscdevice mmuhack = {
\r
83 MMUHACK_MINOR, DEVICE_NAME, &mmuhack_fops
\r
86 static int __init mmuhack_init(void)
\r
88 misc_register(&mmuhack);
\r
90 printk("MMSP2 MMU Hack module.\n");
\r
95 static void __exit mmuhack_exit(void)
\r
97 misc_deregister(&mmuhack);
\r
99 printk(KERN_ALERT "MMU Hack module removed.\n");
\r
103 module_init(mmuhack_init);
\r
104 module_exit(mmuhack_exit);
\r