blob: 3f83356fcc4ccd7485a1de19f6c7a01c0022ef8d [file] [log] [blame]
yuezonghe824eb0c2024-06-27 02:32:26 -07001
2#include <linux/module.h>
3#include <linux/signal.h>
4#include <linux/mm.h>
5#include <linux/hardirq.h>
6#include <linux/init.h>
7#include <linux/kprobes.h>
8#include <linux/uaccess.h>
9#include <linux/page-flags.h>
10#include <linux/sched.h>
11#include <linux/highmem.h>
12#include <linux/perf_event.h>
13#include <asm/exception.h>
14#include <asm/pgtable.h>
15#include <asm/system_misc.h>
16#include <asm/system_info.h>
17#include <asm/tlbflush.h>
18#include <asm/mach/map.h>
19#include <linux/slab.h>
20#include "fault.h"
21#ifdef CONFIG_MMU
22#ifdef CONFIG_KPROBES
23static inline int notify_page_fault(struct pt_regs*regs,unsigned int fsr){int
24ret=(0x821+7610-0x25db);if(!user_mode(regs)){preempt_disable();if(kprobe_running
25()&&kprobe_fault_handler(regs,fsr))ret=(0x1418+3031-0x1fee);preempt_enable();}
26return ret;}
27#else
28static inline int notify_page_fault(struct pt_regs*regs,unsigned int fsr){return
29(0xbd2+3187-0x1845);}
30#endif
31void show_pte(struct mm_struct*mm,unsigned long addr){pgd_t*pgd;if(!mm)mm=&
32init_mm;printk(KERN_ALERT"\x70\x67\x64\x20\x3d\x20\x25\x70" "\n",mm->pgd);pgd=
33pgd_offset(mm,addr);printk(KERN_ALERT
34"\x5b\x25\x30\x38\x6c\x78\x5d\x20\x2a\x70\x67\x64\x3d\x25\x30\x38\x6c\x6c\x78",
35addr,(long long)pgd_val(*pgd));do{pud_t*pud;pmd_t*pmd;pte_t*pte;if(pgd_none(*pgd
36))break;if(pgd_bad(*pgd)){printk("\x28\x62\x61\x64\x29");break;}pud=pud_offset(
37pgd,addr);if(PTRS_PER_PUD!=(0x1e30+502-0x2025))printk(
38"\x2c\x20\x2a\x70\x75\x64\x3d\x25\x30\x38\x6c\x6c\x78",(long long)pud_val(*pud))
39;if(pud_none(*pud))break;if(pud_bad(*pud)){printk("\x28\x62\x61\x64\x29");break;
40}pmd=pmd_offset(pud,addr);if(PTRS_PER_PMD!=(0x5c2+7093-0x2176))printk(
41"\x2c\x20\x2a\x70\x6d\x64\x3d\x25\x30\x38\x6c\x6c\x78",(long long)pmd_val(*pmd))
42;if(pmd_none(*pmd))break;if(pmd_bad(*pmd)){printk("\x28\x62\x61\x64\x29");break;
43}if(PageHighMem(pfn_to_page(pmd_val(*pmd)>>PAGE_SHIFT)))break;pte=pte_offset_map
44(pmd,addr);printk("\x2c\x20\x2a\x70\x74\x65\x3d\x25\x30\x38\x6c\x6c\x78",(long
45long)pte_val(*pte));
46#ifndef CONFIG_ARM_LPAE
47printk("\x2c\x20\x2a\x70\x70\x74\x65\x3d\x25\x30\x38\x6c\x6c\x78",(long long)
48pte_val(pte[PTE_HWTABLE_PTRS]));
49#endif
50pte_unmap(pte);}while((0x22f6+523-0x2501));printk("\n");}
51#else
52void show_pte(struct mm_struct*mm,unsigned long addr){}
53#endif
54static void __do_kernel_fault(struct mm_struct*mm,unsigned long addr,unsigned
55int fsr,struct pt_regs*regs){if(fixup_exception(regs))return;bust_spinlocks(
56(0x42d+6784-0x1eac));printk(KERN_ALERT
57"\x55\x6e\x61\x62\x6c\x65\x20\x74\x6f\x20\x68\x61\x6e\x64\x6c\x65\x20\x6b\x65\x72\x6e\x65\x6c\x20\x25\x73\x20\x61\x74\x20\x76\x69\x72\x74\x75\x61\x6c\x20\x61\x64\x64\x72\x65\x73\x73\x20\x25\x30\x38\x6c\x78" "\n"
58,(addr<PAGE_SIZE)?
59"\x4e\x55\x4c\x4c\x20\x70\x6f\x69\x6e\x74\x65\x72\x20\x64\x65\x72\x65\x66\x65\x72\x65\x6e\x63\x65"
60:"\x70\x61\x67\x69\x6e\x67\x20\x72\x65\x71\x75\x65\x73\x74",addr);show_pte(mm,
61addr);die("\x4f\x6f\x70\x73",regs,fsr);bust_spinlocks((0x950+629-0xbc5));do_exit
62(SIGKILL);}static void __do_user_fault(struct task_struct*tsk,unsigned long addr
63,unsigned int fsr,unsigned int sig,int code,struct pt_regs*regs){struct siginfo
64si;
65#ifdef CONFIG_DEBUG_USER
66if(((user_debug&UDBG_SEGV)&&(sig==SIGSEGV))||((user_debug&UDBG_BUS)&&(sig==
67SIGBUS))){printk(KERN_DEBUG
68"\x25\x73\x3a\x20\x75\x6e\x68\x61\x6e\x64\x6c\x65\x64\x20\x70\x61\x67\x65\x20\x66\x61\x75\x6c\x74\x20\x28\x25\x64\x29\x20\x61\x74\x20\x30\x78\x25\x30\x38\x6c\x78\x2c\x20\x63\x6f\x64\x65\x20\x30\x78\x25\x30\x33\x78" "\n"
69,tsk->comm,sig,addr,fsr);show_pte(tsk->mm,addr);show_regs(regs);}
70#endif
71tsk->thread.address=addr;tsk->thread.error_code=fsr;tsk->thread.trap_no=
72(0x1198+2168-0x1a02);si.si_signo=sig;si.si_errno=(0x735+2159-0xfa4);si.si_code=
73code;si.si_addr=(void __user*)addr;force_sig_info(sig,&si,tsk);}void do_bad_area
74(unsigned long addr,unsigned int fsr,struct pt_regs*regs){struct task_struct*tsk
75=current;struct mm_struct*mm=tsk->active_mm;if(user_mode(regs))__do_user_fault(
76tsk,addr,fsr,SIGSEGV,SEGV_MAPERR,regs);else __do_kernel_fault(mm,addr,fsr,regs);
77}
78#ifdef CONFIG_MMU
79#define VM_FAULT_BADMAP 65536
80#define VM_FAULT_BADACCESS 131072
81static inline bool access_error(unsigned int fsr,struct vm_area_struct*vma){
82unsigned int mask=VM_READ|VM_WRITE|VM_EXEC;if(fsr&FSR_WRITE)mask=VM_WRITE;if(fsr
83&FSR_LNX_PF)mask=VM_EXEC;return vma->vm_flags&mask?false:true;}static int
84__kprobes __do_page_fault(struct mm_struct*mm,unsigned long addr,unsigned int
85fsr,unsigned int flags,struct task_struct*tsk){struct vm_area_struct*vma;int
86fault;vma=find_vma(mm,addr);fault=VM_FAULT_BADMAP;if(unlikely(!vma))goto out;if(
87unlikely(vma->vm_start>addr))goto check_stack;good_area:if(access_error(fsr,vma)
88){fault=VM_FAULT_BADACCESS;goto out;}return handle_mm_fault(mm,vma,addr&
89PAGE_MASK,flags);check_stack:if(vma->vm_flags&VM_GROWSDOWN&&addr>=
90FIRST_USER_ADDRESS&&!expand_stack(vma,addr))goto good_area;out:return fault;}
91static int __kprobes do_page_fault(unsigned long addr,unsigned int fsr,struct
92pt_regs*regs){struct task_struct*tsk;struct mm_struct*mm;int fault,sig,code;int
93write=fsr&FSR_WRITE;unsigned int flags=FAULT_FLAG_ALLOW_RETRY|
94FAULT_FLAG_KILLABLE|(write?FAULT_FLAG_WRITE:(0x327+3606-0x113d));if(
95notify_page_fault(regs,fsr))return(0x44d+3467-0x11d8);tsk=current;mm=tsk->mm;if(
96interrupts_enabled(regs))local_irq_enable();if(!mm||pagefault_disabled())goto
97no_context;if(!down_read_trylock(&mm->mmap_sem)){if(!user_mode(regs)&&!
98search_exception_tables(regs->ARM_pc))goto no_context;retry:down_read(&mm->
99mmap_sem);}else{might_sleep();
100#ifdef CONFIG_DEBUG_VM
101if(!user_mode(regs)&&!search_exception_tables(regs->ARM_pc))goto no_context;
102#endif
103}fault=__do_page_fault(mm,addr,fsr,flags,tsk);if((fault&VM_FAULT_RETRY)&&
104fatal_signal_pending(current))return(0x464+2791-0xf4b);perf_sw_event(
105PERF_COUNT_SW_PAGE_FAULTS,(0x1a54+750-0x1d41),regs,addr);if(!(fault&
106VM_FAULT_ERROR)&&flags&FAULT_FLAG_ALLOW_RETRY){if(fault&VM_FAULT_MAJOR){tsk->
107maj_flt++;perf_sw_event(PERF_COUNT_SW_PAGE_FAULTS_MAJ,(0x104d+2685-0x1ac9),regs,
108addr);}else{tsk->min_flt++;perf_sw_event(PERF_COUNT_SW_PAGE_FAULTS_MIN,
109(0x1aa+120-0x221),regs,addr);}if(fault&VM_FAULT_RETRY){flags&=~
110FAULT_FLAG_ALLOW_RETRY;goto retry;}}up_read(&mm->mmap_sem);if(likely(!(fault&(
111VM_FAULT_ERROR|VM_FAULT_BADMAP|VM_FAULT_BADACCESS))))return(0x798+6836-0x224c);
112if(fault&VM_FAULT_OOM){pagefault_out_of_memory();return(0xc8d+3713-0x1b0e);}if(!
113user_mode(regs))goto no_context;if(fault&VM_FAULT_SIGBUS){sig=SIGBUS;code=
114BUS_ADRERR;}else{sig=SIGSEGV;code=fault==VM_FAULT_BADACCESS?SEGV_ACCERR:
115SEGV_MAPERR;}__do_user_fault(tsk,addr,fsr,sig,code,regs);return
116(0x354+7953-0x2265);no_context:__do_kernel_fault(mm,addr,fsr,regs);return
117(0x22fc+79-0x234b);}
118#else
119static int do_page_fault(unsigned long addr,unsigned int fsr,struct pt_regs*regs
120){return(0xd1d+2859-0x1848);}
121#endif
122#ifdef CONFIG_MMU
123static int __kprobes do_translation_fault(unsigned long addr,unsigned int fsr,
124struct pt_regs*regs){unsigned int index;pgd_t*pgd,*pgd_k;pud_t*pud,*pud_k;pmd_t*
125pmd,*pmd_k;if(addr<TASK_SIZE)return do_page_fault(addr,fsr,regs);if(
126interrupts_enabled(regs))local_irq_enable();if(user_mode(regs))goto bad_area;
127index=pgd_index(addr);pgd=cpu_get_pgd()+index;pgd_k=init_mm.pgd+index;if(
128pgd_none(*pgd_k))goto bad_area;if(!pgd_present(*pgd))set_pgd(pgd,*pgd_k);pud=
129pud_offset(pgd,addr);pud_k=pud_offset(pgd_k,addr);if(pud_none(*pud_k))goto
130bad_area;if(!pud_present(*pud))set_pud(pud,*pud_k);pmd=pmd_offset(pud,addr);
131pmd_k=pmd_offset(pud_k,addr);
132#ifdef CONFIG_ARM_LPAE
133index=(0x1c5+4393-0x12ee);
134#else
135index=(addr>>SECTION_SHIFT)&(0x286+7418-0x1f7f);
136#endif
137if(pmd_none(pmd_k[index]))goto bad_area;copy_pmd(pmd,pmd_k);return
138(0x105f+2739-0x1b12);bad_area:do_bad_area(addr,fsr,regs);return
139(0x12b7+2483-0x1c6a);}
140#else
141static int do_translation_fault(unsigned long addr,unsigned int fsr,struct
142pt_regs*regs){return(0x1446+4583-0x262d);}
143#endif
144static int do_sect_fault(unsigned long addr,unsigned int fsr,struct pt_regs*regs
145){if(interrupts_enabled(regs))local_irq_enable();do_bad_area(addr,fsr,regs);
146return(0x807+5063-0x1bce);}static int do_bad(unsigned long addr,unsigned int fsr
147,struct pt_regs*regs){return(0x5d+2345-0x985);}struct fsr_info{int(*fn)(unsigned
148 long addr,unsigned int fsr,struct pt_regs*regs);int sig;int code;const char*
149name;};
150#ifdef CONFIG_ARM_LPAE
151#include "fsr-3level.c"
152#else
153#include "fsr-2level.c"
154#endif
155void __init hook_fault_code(int nr,int(*fn)(unsigned long,unsigned int,struct
156pt_regs*),int sig,int code,const char*name){if(nr<(0x1c69+2519-0x2640)||nr>=
157ARRAY_SIZE(fsr_info))BUG();fsr_info[nr].fn=fn;fsr_info[nr].sig=sig;fsr_info[nr].
158code=code;fsr_info[nr].name=name;}
159#ifdef CONFIG_MODEM_CODE_IS_MAPPING
160static DECLARE_RWSEM(shrinker_rwsem);atomic_t _code_page_count=ATOMIC_INIT(
161(0xdf7+4574-0x1fd5));struct addr_info{struct list_head node;unsigned long vaddr;
162unsigned long kaddr;unsigned long page_index;};enum modem_access_technology{GSM=
163(0x3fb+8974-0x2709),UTRAN=(0xdb6+10-0xdbf),LTE=(0x4a4+1237-0x977),COM=
164(0x1163+2440-0x1ae8),NR_MODEM_ACCESS=(0x172a+824-0x1a5e)};struct list_head
165modem_page_list[NR_MODEM_ACCESS]={LIST_HEAD_INIT(modem_page_list[
166(0x200+3972-0x1184)]),LIST_HEAD_INIT(modem_page_list[(0x519+3610-0x1332)]),
167LIST_HEAD_INIT(modem_page_list[(0x1166+2931-0x1cd7)]),LIST_HEAD_INIT(
168modem_page_list[(0x127a+1583-0x18a6)]),};unsigned int page_used[(0x98c+41-0x98d)
169];struct completion page_completion[(0x10ac+3855-0x1f93)*(0x251+2654-0xc8f)];
170static void unmap_pte_range(pmd_t*pmd,unsigned long addr,unsigned long end){
171pte_t*pte;pte=pte_offset_kernel(pmd,addr);do{pte_t ptent=ptep_get_and_clear(&
172init_mm,addr,pte);WARN_ON(!pte_none(ptent)&&!pte_present(ptent));}while(pte++,
173addr+=PAGE_SIZE,addr!=end);}static void unmap_pmd_range(pud_t*pud,unsigned long
174addr,unsigned long end){pmd_t*pmd;unsigned long next;pmd=pmd_offset(pud,addr);do
175{next=pmd_addr_end(addr,end);if(pmd_none_or_clear_bad(pmd))continue;
176unmap_pte_range(pmd,addr,next);}while(pmd++,addr=next,addr!=end);}static void
177unmap_pud_range(pgd_t*pgd,unsigned long addr,unsigned long end){pud_t*pud;
178unsigned long next;pud=pud_offset(pgd,addr);do{next=pud_addr_end(addr,end);if(
179pud_none_or_clear_bad(pud))continue;unmap_pmd_range(pud,addr,next);}while(pud++,
180addr=next,addr!=end);}static void unmap_page_range(unsigned long addr,unsigned
181long end){pgd_t*pgd;unsigned long next;BUG_ON(addr>=end);pgd=pgd_offset_k(addr);
182do{next=pgd_addr_end(addr,end);if(pgd_none_or_clear_bad(pgd))continue;
183unmap_pud_range(pgd,addr,next);}while(pgd++,addr=next,addr!=end);}void
184shrink_modem_mem(unsigned int access_type){int i=(0x790+5554-0x1d42);unsigned
185long vaddr;struct addr_info*addr,*tmp_addr;struct list_head tmp_page_list;for(i=
186(0x632+3326-0x1330);i<NR_MODEM_ACCESS;i++){if(i==access_type)continue;down_write
187(&shrinker_rwsem);list_replace_init(&modem_page_list[i],&tmp_page_list);up_write
188(&shrinker_rwsem);list_for_each_entry_safe(addr,tmp_addr,&tmp_page_list,node){
189list_del_init(&addr->node);page_completion[addr->page_index].done=
190(0x21b+3760-0x10cb);page_used[addr->page_index/BITS_PER_LONG]&=~(
191(0x9a+3573-0xe8e)<<(addr->page_index%BITS_PER_LONG));vaddr=addr->vaddr&PAGE_MASK
192;if(vaddr<cpps_global_var.cpko_text_start||vaddr>cpps_global_var.modem_text_end)
193{panic(
194"\x61\x64\x64\x72\x5f\x69\x6e\x66\x6f\x3a\x20\x25\x30\x38\x78\x20\x69\x73\x20\x20\x64\x65\x73\x74\x72\x6f\x79"
195,addr);}flush_cache_vunmap(vaddr,vaddr+PAGE_SIZE);unmap_page_range(vaddr,vaddr+
196PAGE_SIZE);flush_tlb_kernel_range(vaddr,vaddr+PAGE_SIZE);
197#ifdef CONFIG_DEBUG_RODATA
198unsigned int flags;local_irq_save(flags);set_memory_rw(addr->kaddr,
199(0x48d+6813-0x1f29));local_irq_restore(flags);
200#endif
201free_page(addr->kaddr);kfree(addr);atomic_dec(&_code_page_count);};}}
202EXPORT_SYMBOL(shrink_modem_mem);phys_addr_t virt_is_mapping(unsigned long addr){
203pgd_t*pgd;pmd_t*pmd;pte_t*ptep,pte;unsigned long pfn;pgd=pgd_offset_k(addr);if(!
204pgd_none(*pgd)){pmd=pmd_offset(pgd,addr);if(!pmd_none(*pmd)){ptep=pte_offset_map
205(pmd,addr);pte=*ptep;if(pte_present(pte)){pfn=pte_pfn(pte);return __pfn_to_phys(
206pfn);}}}return(0xe71+3860-0x1d85);}static int sync_pgd(unsigned long addr,
207unsigned int fsr,struct pt_regs*regs){unsigned int index;pgd_t*pgd,*pgd_k;pud_t*
208pud,*pud_k;pmd_t*pmd,*pmd_k;index=pgd_index(addr);pgd=cpu_get_pgd()+index;pgd_k=
209init_mm.pgd+index;if(pgd_none(*pgd_k))goto bad_area;if(!pgd_present(*pgd))
210set_pgd(pgd,*pgd_k);pud=pud_offset(pgd,addr);pud_k=pud_offset(pgd_k,addr);if(
211pud_none(*pud_k))goto bad_area;if(!pud_present(*pud))set_pud(pud,*pud_k);pmd=
212pmd_offset(pud,addr);pmd_k=pmd_offset(pud_k,addr);
213#ifdef CONFIG_ARM_LPAE
214index=(0xf2a+201-0xff3);
215#else
216index=(addr>>SECTION_SHIFT)&(0x1648+2661-0x20ac);
217#endif
218if(pmd_none(pmd_k[index]))goto bad_area;copy_pmd(pmd,pmd_k);return
219(0x1100+3839-0x1fff);bad_area:do_bad_area(addr,fsr,regs);return
220(0x1f04+1244-0x23e0);}unsigned long*read_code_file(unsigned long page_index){
221unsigned long*code_buf;ssize_t result;code_buf=get_zeroed_page(GFP_ATOMIC);if(!
222code_buf)panic(
223"\x6d\x65\x6d\x65\x6f\x72\x79\x20\x6e\x6f\x74\x20\x65\x6e\x6f\x75\x67\x68\x21\x21"
224);atomic_inc(&_code_page_count);if(IS_ERR(cpps_global_var.fp_code)||
225cpps_global_var.fp_code==NULL){panic(
226"\x6f\x70\x65\x6e\x20\x66\x69\x6c\x65\x20\x65\x72\x72\x6f\x72" "\n");}
227mm_segment_t old_fs;old_fs=get_fs();set_fs(KERNEL_DS);loff_t pos;pos=page_index*
228PAGE_SIZE+cpps_global_var.modem_offset;result=vfs_read(cpps_global_var.fp_code,(
229char*)code_buf,PAGE_SIZE,&pos);if(result<(0x10ea+5558-0x26a0)){panic(
230"\x72\x65\x61\x64\x20\x63\x6f\x64\x65\x20\x66\x69\x6c\x65\x20\x65\x72\x72\x6f\x72" "\n"
231);}
232#ifdef CONFIG_DEBUG_RODATA
233unsigned int flags;local_irq_save(flags);set_memory_ro((unsigned long)code_buf,
234(0xa36+5305-0x1eee));local_irq_restore(flags);
235#endif
236set_fs(old_fs);return code_buf;}void read_code_mapping(unsigned long addr,
237unsigned int fsr,struct pt_regs*regs){unsigned long offset;unsigned long vaddr;
238const struct mem_type*mtype;unsigned long*vir_codebuf;unsigned long page_index;
239unsigned long page_shift;if(virt_is_mapping(addr&PAGE_MASK)!=(0x4a7+2584-0xebf))
240{sync_pgd(addr&PAGE_MASK,fsr,regs);return;}vaddr=addr&PAGE_MASK;offset=vaddr&(~
241cpps_global_var.cpko_text_start);page_index=offset>>PAGE_SHIFT;page_shift=
242page_index%BITS_PER_LONG;if((page_used[page_index/BITS_PER_LONG]>>page_shift)&
243(0x70+5278-0x150d)){wait_for_completion(&page_completion[page_index]);sync_pgd(
244vaddr,fsr,regs);return;}else page_used[page_index/BITS_PER_LONG]|=(
245(0x6ec+106-0x755)<<page_shift);local_irq_enable();vir_codebuf=read_code_file(
246page_index);struct addr_info*addr_info;addr_info=kzalloc(sizeof(struct addr_info
247),GFP_KERNEL);addr_info->kaddr=vir_codebuf;addr_info->vaddr=addr;addr_info->
248page_index=page_index;down_write(&shrinker_rwsem);if(vaddr<cpps_global_var.
249__utran_modem_text_start)list_add(&addr_info->node,&modem_page_list[GSM]);else
250if(vaddr<cpps_global_var.__lte_modem_text_start)list_add(&addr_info->node,&
251modem_page_list[UTRAN]);else if(vaddr<cpps_global_var.__comm_modem_text_start)
252list_add(&addr_info->node,&modem_page_list[LTE]);else list_add(&addr_info->node,
253&modem_page_list[COM]);up_write(&shrinker_rwsem);local_irq_disable();mtype=
254get_mem_type(MT_MEMORY);ioremap_page(vaddr,__pa(vir_codebuf),mtype);sync_pgd(
255vaddr,fsr,regs);flush_icache_range(vaddr,vaddr+PAGE_SIZE);if(waitqueue_active(&
256page_completion[page_index].wait))complete_all(&page_completion[page_index]);
257return;}
258#endif
259asmlinkage void __exception do_DataAbort(unsigned long addr,unsigned int fsr,
260struct pt_regs*regs){const struct fsr_info*inf=fsr_info+fsr_fs(fsr);struct
261siginfo info;
262#ifdef CONFIG_MODEM_CODE_IS_MAPPING
263if(addr!=(0x1227+4777-0x24d0)&&addr>=cpps_global_var.cpko_text_start&&addr<=
264cpps_global_var.modem_text_end){read_code_mapping(addr,fsr&~FSR_LNX_PF,regs);
265return;}
266#endif
267if(!inf->fn(addr,fsr&~FSR_LNX_PF,regs))return;printk(KERN_ALERT
268"\x55\x6e\x68\x61\x6e\x64\x6c\x65\x64\x20\x66\x61\x75\x6c\x74\x3a\x20\x25\x73\x20\x28\x30\x78\x25\x30\x33\x78\x29\x20\x61\x74\x20\x30\x78\x25\x30\x38\x6c\x78" "\n"
269,inf->name,fsr,addr);info.si_signo=inf->sig;info.si_errno=(0x84d+4540-0x1a09);
270info.si_code=inf->code;info.si_addr=(void __user*)addr;arm_notify_die("",regs,&
271info,fsr,(0x6a0+3136-0x12e0));}void __init hook_ifault_code(int nr,int(*fn)(
272unsigned long,unsigned int,struct pt_regs*),int sig,int code,const char*name){if
273(nr<(0x1372+2431-0x1cf1)||nr>=ARRAY_SIZE(ifsr_info))BUG();ifsr_info[nr].fn=fn;
274ifsr_info[nr].sig=sig;ifsr_info[nr].code=code;ifsr_info[nr].name=name;}
275asmlinkage void __exception do_PrefetchAbort(unsigned long addr,unsigned int
276ifsr,struct pt_regs*regs){const struct fsr_info*inf=ifsr_info+fsr_fs(ifsr);
277struct siginfo info;
278#ifdef CONFIG_MODEM_CODE_IS_MAPPING
279if(addr!=(0x191f+107-0x198a)&&addr>=cpps_global_var.cpko_text_start&&addr<=
280cpps_global_var.modem_text_end){read_code_mapping(addr,ifsr|FSR_LNX_PF,regs);
281return;}
282#endif
283if(!inf->fn(addr,ifsr|FSR_LNX_PF,regs))return;printk(KERN_ALERT
284"\x55\x6e\x68\x61\x6e\x64\x6c\x65\x64\x20\x70\x72\x65\x66\x65\x74\x63\x68\x20\x61\x62\x6f\x72\x74\x3a\x20\x25\x73\x20\x28\x30\x78\x25\x30\x33\x78\x29\x20\x61\x74\x20\x30\x78\x25\x30\x38\x6c\x78" "\n"
285,inf->name,ifsr,addr);info.si_signo=inf->sig;info.si_errno=(0x67c+1861-0xdc1);
286info.si_code=inf->code;info.si_addr=(void __user*)addr;arm_notify_die("",regs,&
287info,ifsr,(0xe2c+1528-0x1424));}
288#ifndef CONFIG_ARM_LPAE
289static int __init exceptions_init(void){if(cpu_architecture()>=CPU_ARCH_ARMv6){
290hook_fault_code((0xd16+306-0xe44),do_translation_fault,SIGSEGV,SEGV_MAPERR,
291"\x49\x2d\x63\x61\x63\x68\x65\x20\x6d\x61\x69\x6e\x74\x65\x6e\x61\x6e\x63\x65\x20\x66\x61\x75\x6c\x74"
292);}if(cpu_architecture()>=CPU_ARCH_ARMv7){hook_fault_code((0x1854+1865-0x1f9a),
293do_bad,SIGSEGV,SEGV_MAPERR,
294"\x73\x65\x63\x74\x69\x6f\x6e\x20\x61\x63\x63\x65\x73\x73\x20\x66\x6c\x61\x67\x20\x66\x61\x75\x6c\x74"
295);hook_fault_code((0xdcd+2406-0x172d),do_bad,SIGSEGV,SEGV_MAPERR,
296"\x73\x65\x63\x74\x69\x6f\x6e\x20\x61\x63\x63\x65\x73\x73\x20\x66\x6c\x61\x67\x20\x66\x61\x75\x6c\x74"
297);}
298#ifdef CONFIG_MODEM_CODE_IS_MAPPING
299int index=(0x13fb+4063-0x23da);for(index=(0x2059+1717-0x270e);index<
300(0x1b59+5-0x1b36)*(0x19e3+1660-0x203f);index++)init_completion(&page_completion[
301index]);
302#endif
303return(0x539+698-0x7f3);}arch_initcall(exceptions_init);
304#endif
305