亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? arch.h

?? fsmlabs的real time linux的內核
?? H
?? 第 1 頁 / 共 2 頁
字號:
/* * (C) Finite State Machine Labs Inc. 1999 <business@fsmlabs.com> * * Released under the terms of GPL 2. * Open RTLinux makes use of a patented process described in * US Patent 5,995,745. Use of this process is governed * by the Open RTLinux Patent License which can be obtained from * www.fsmlabs.com/PATENT or by sending email to * licensequestions@fsmlabs.com */#include <linux/config.h>#include <linux/irq.h>#include <asm/irq.h>#include <asm/hw_irq.h>#include <asm/apic.h>#include <arch/constants.h>#include <rtl_core.h>extern struct irq_control_s  irq_control;static struct irq_control_s pre_patch_control;#define RTL_NR_IRQS NR_IRQS/* interface to the hardware controller handlers */struct hw_interrupt_type *rtl_irq_desc[NR_IRQS];static struct hw_interrupt_type *save_linux_irq_desc[NR_IRQS];static inline int rtl_irq_controller_get_irq(struct pt_regs r){	return r.orig_eax & 0xff;}static inline void rtl_irq_controller_ack(unsigned int irq) {	if(rtl_irq_desc[irq]) rtl_irq_desc[irq]->ack(irq);}static inline void rtl_irq_controller_enable(unsigned int irq){	if(rtl_irq_desc[irq]) 		rtl_irq_desc[irq]->enable(irq);}static inline void rtl_irq_controller_disable(unsigned int irq){	if(rtl_irq_desc[irq]) rtl_irq_desc[irq]->disable(irq);}void rtl_soft_cli(void);void rtl_soft_sti(void);void rtl_soft_save_flags(unsigned long *);void rtl_soft_restore_flags(unsigned long );void rtl_soft_local_irq_save(unsigned long *);void rtl_soft_local_irq_restore(unsigned long );/* dispatching rt and linux handlers */asmlinkage void (*xdo_IRQ)(struct pt_regs);struct rtl_global_handlers;static inline void dispatch_linux_irq(struct pt_regs *regs,unsigned int irq){	xdo_IRQ(*regs);}#ifdef CONFIG_X86_LOCAL_APICstatic void rtl_local_intercept(MACHDEPREGS );static inline void dispatch_rtl_local_handler(int pnd, struct pt_regs *r){	rtl_local[rtl_getcpuid()].rt_handlers[pnd](r);}struct {        void (*smp_reschedule_interrupt)(void);        void (*smp_invalidate_interrupt)(void);        void (*smp_error_interrupt)(void);        void (*smp_apic_timer_interrupt)(struct pt_regs *);        void (*smp_call_function_interrupt)(void);	void (*rtl_reschedule)(int cpu);        void (*smp_spurious_interrupt)(void); }local_code;#endif#define FAKE_REGS { 0, 0, 0, 0, 0, 0, 0, __KERNEL_DS, 0, 0, (long)rtl_soft_sti, __KERNEL_CS, ARCH_DEFINED_ENABLE, 0, 0 }	/* Called with soft disable set */inline void soft_dispatch_global(unsigned int irq){	struct pt_regs r = FAKE_REGS;	DeclareAndInit(cpu_id);		r.orig_eax = irq;		L_CLEAR(l_ienable);		xdo_IRQ(r);}#ifdef CONFIG_X86_LOCAL_APICvoid dispatch_local_linux_irq(struct pt_regs *r, int pnd){/*  soft_dispatch_local(VECTOR_TO_LOCAL_PND(r->orig_eax)); */ soft_dispatch_local(r->orig_eax);/*  __sti(); */}/* #define localdbg() do { if (test_bit(rtl_getcpuid(), &rtl_reserved_cpumask)) rtl_printf("l%x\n", vector); } while (0) */#define localdbg() do {;} while (0)void soft_dispatch_local(unsigned int vector){/* 	unsigned int vector = LOCAL_PND_TO_VECTOR(pnd); */	rtl_soft_cli();/* 		conpr("d"); conprn(vector); */	switch(vector){	/* IPI for rescheduling */		case RESCHEDULE_VECTOR:			localdbg();			local_code.smp_reschedule_interrupt();			break;		case INVALIDATE_TLB_VECTOR:			/* IPI for invalidation */			localdbg();			local_code.smp_invalidate_interrupt();			break;		case CALL_FUNCTION_VECTOR:			localdbg();			local_code.smp_call_function_interrupt();			break;		case SPURIOUS_APIC_VECTOR:			localdbg();			local_code.smp_spurious_interrupt();			break;		case ERROR_APIC_VECTOR:			localdbg();			local_code.smp_error_interrupt();			break;		case LOCAL_TIMER_VECTOR:			{			struct pt_regs r=  FAKE_REGS;			localdbg();			local_code.smp_apic_timer_interrupt(&r);			}			break;		default:			printk("RTL: bad local vector %x\n",vector);			break;	}}#endif/* Virtual functions for soft irq descriptor table */void rtl_virt_shutdown(unsigned int irq) {	G_DISABLE(irq) ;	rtl_irq_desc[irq]->shutdown(irq);}unsigned int rtl_virt_startup (unsigned int irq){ 	G_ENABLED(irq) ; 	return (rtl_irq_desc[irq]->startup(irq));}#if LINUX_VERSION_CODE < 0x020300void rtl_virt_handle (unsigned int irq, struct pt_regs * regs){ 	rtl_irq_desc[irq]->handle(irq, regs);}#endifstatic void rtl_virt_ack (unsigned int irq){ return;}#ifdef CONFIG_SMPstatic void rtl_virt_set_affinity(unsigned int irq, unsigned long mask){	if(rtl_irq_desc[irq] && rtl_irq_desc[irq]->set_affinity) {		rtl_irq_desc[irq]->set_affinity(irq, mask);	}}extern unsigned long irq_affinity [NR_IRQS];int rtl_irq_set_affinity (unsigned int irq, const unsigned long *mask, unsigned long *oldmask){	rtl_irqstate_t flags;	if (irq >= RTL_RESCHEDULE_VECTOR - 0x20) {		return -1;	}	if (!rtl_irq_desc[irq] || !rtl_irq_desc[irq]->set_affinity) {		return -1;	}	if (oldmask) {		*oldmask = irq_affinity[irq];	}	if (! mask) {		return 0;	}	if (!(*mask & cpu_online_map))		return -EINVAL;	rtl_no_interrupts (flags);	rtl_spin_lock (&rtl_global.hard_irq_controller_lock);	irq_affinity[irq] = *mask;	rtl_irq_desc[irq]->set_affinity(irq, *mask);	rtl_spin_unlock (&rtl_global.hard_irq_controller_lock);	rtl_restore_interrupts (flags);	return 0;}#elsestatic void rtl_virt_set_affinity(unsigned int irq, unsigned long mask){;}int rtl_irq_set_affinity (unsigned int irq, const unsigned long *mask, unsigned long *oldmask){ return -1;}#endifvoid rtl_virt_enable(unsigned int);void rtl_virt_disable(unsigned int);struct hw_interrupt_type rtl_generic_type =  {\	"RTLinux virtual irq",	rtl_virt_startup,	rtl_virt_shutdown,	rtl_virt_enable,	rtl_virt_disable,	rtl_virt_ack,	rtl_virt_enable,	rtl_virt_set_affinity,#if LINUX_VERSION_CODE < 0x020300	rtl_virt_handle#endif};#ifdef CONFIG_SMP/* Michael's reschedule interrupt hack (use a global interrupt for it) */static void rtl_ack_apic(unsigned int irq) {	ack_APIC_irq();}static void rtl_null_enable(unsigned int irq) {}struct hw_interrupt_type rtl_resched_irq_type =  {\	"RTLinux reschedule irq",	rtl_virt_startup,	rtl_virt_shutdown,	rtl_null_enable,	rtl_virt_disable,	rtl_ack_apic,	rtl_virt_enable,	rtl_virt_set_affinity,#if LINUX_VERSION_CODE < 0x020300	rtl_virt_handle /* nothing */#endif};#endifvoid (*local_ret_from_intr)(void);enum pfunctions {pf___start_rtlinux_patch,pf___stop_rtlinux_patch,pf_rtl_emulate_iret,pf_irq_desc,pf_do_IRQ,pf_ret_from_intr,pf_rtl_exception_intercept,#ifdef CONFIG_X86_LOCAL_APICpf_smp_spurious_interrupt,#define PF_LOCAL_START pf_smp_spurious_interruptpf_smp_error_interrupt,pf_smp_apic_timer_interrupt,#ifdef CONFIG_SMPpf_smp_reschedule_interrupt,pf_smp_invalidate_interrupt,pf_smp_call_function_interrupt,pf_rtl_reschedule,#define PF_LOCAL_END pf_smp_call_function_interrupt#else#define PF_LOCAL_END pf_smp_apic_timer_interrupt#endif /* CONFIG_SMP */#endif};/* #define DEBUG_RTLINUX 1 */#ifdef DEBUG_RTLINUX_PATCH_TABLEstatic void print_patch_table(void){	const struct func_table *p = &__start_rtlinux_funcs;	struct patch_table *start_rtlinux_patch = p[0].address;	struct patch_table *stop_rtlinux_patch = p[1].address;	struct patch_table *pt;;	printk("RTLinux table print start=%x stop=%x\n",p,&__stop_rtlinux_funcs);        for(; p <= &__stop_rtlinux_funcs;p++) {		printk("RTLinux function table %x => %x\n",p,p->address);        }	for(pt = start_rtlinux_patch; pt < stop_rtlinux_patch; pt++)		printk("RTLinux patch table %x => %x %x\n",pt,pt->address,pt->magic);        return;}#endif#define JUMP_SIZE 5#define MAX_JUMPS 20/* TODO patch_failure should do a recovery */#define patch_failure(x) {printk(x); return; }static char saved_jumps[MAX_JUMPS][JUMP_SIZE];static void save_jump(char *p, enum pfunctions pf){	int i;	if(pf > MAX_JUMPS){		patch_failure("RTLinux FATAL ERROR; too many jumps\n");	}else for(i=0;i<5;i++)saved_jumps[pf][i] = p[i];}static void unpatch_jump(char *p, enum pfunctions pf){	int i;	if(pf > MAX_JUMPS){		patch_failure("RTLinux FATAL ERROR; too many jumps in unpatch\n");	}else for(i=0;i<5;i++)p[i] = saved_jumps[pf][i];}static void patch_jump(char *code_to_patch,char *target){	int distance;        distance = (int)target - ((int)code_to_patch +5) ;        *code_to_patch++= 0xe9; /* jump */        *code_to_patch++ = ((char *)&distance)[0];        *code_to_patch++ = ((char *)&distance)[1];        *code_to_patch++ = ((char *)&distance)[2];        *code_to_patch = ((char *)&distance)[3];}/* IF THIS IS EVER CHANGED IN linux/arch/i386/rtlinux.h   IT MUST BE CHANGED HERE TOO   */#define ACK_MAGIC 0x12344321struct patch_table { char * address; unsigned long magic;};struct func_table { char * address;};extern const struct func_table *__start_rtlinux_funcs;extern const struct func_table *__stop_rtlinux_funcs;#ifdef CONFIG_X86_IO_APIC/* our version of level-triggered IO APIC irq controller */#if LINUX_VERSION_CODE >= 0x020300static struct hw_interrupt_type *linux_ioapic_level_irq_type_ptr = 0;static struct hw_interrupt_type rtl_ioapic_level_irq_type;void static rtl_mask_and_ack_level_ioapic_irq(unsigned int i){	linux_ioapic_level_irq_type_ptr->disable(i); /* mask */	linux_ioapic_level_irq_type_ptr->end(i);	/* ack */}void static rtl_end_level_io_apic_irq(unsigned int i){	linux_ioapic_level_irq_type_ptr->enable(i); /* unmask */}#endif#endif /* CONFIG_X86_IO_APIC */#ifdef CONFIG_X86_LOCAL_APICvoid start_apic_ack(void);void end_apic_ack(void);static void rtl_local_irq_controller_ack(void){	asm __volatile__("start_apic_ack:\t\n");        ack_APIC_irq();	asm __volatile__("end_apic_ack:\t\n");}static inline char * match_ack(char *caller){	const struct func_table *pfunc = (struct func_table *)&__start_rtlinux_funcs;	struct patch_table *p = (struct patch_table *)pfunc[pf___start_rtlinux_patch].address;	char *closest=0;	unsigned dis=0x7fffffff; /* distance *//* 	printk("searching %x\n", (unsigned) caller); */       	for(; (ulong)p < (ulong)pfunc[pf___stop_rtlinux_patch].address;p++) {		if (p->magic != ACK_MAGIC) {			continue;		} else {/* 			printk("%x, %x, %d\n", p->address, caller, dis); */			if ((unsigned) p->address >= (unsigned) caller &&				dis > ((unsigned)p->address - (unsigned)caller)) {			dis = (ulong)p->address - (ulong)caller;			closest = p->address;			}		}	}	return closest;}static void zap_ack_apic(char *apic_caller){	int i;	int ack_len = (int) end_apic_ack  - (int)start_apic_ack;	char *call_point = match_ack(apic_caller);	if(call_point){#ifdef DEBUG_RTLINUX		printk("RTLinux debug zapping %x at %x\n",(unsigned int)apic_caller,(unsigned int)call_point);#endif		for(i=0; i<ack_len; i++)			call_point[i]= 0x90;	}}static void unzap_ack_apic(char *apic_caller){	int i;	int ack_len = (int) end_apic_ack  - (int)start_apic_ack;	char *call_point = match_ack(apic_caller);	if(call_point){#ifdef DEBUG_RTLINUX		printk("RTLinux debug unzapping %x at %x\n",(unsigned int)apic_caller,(unsigned int)call_point);#endif		for(i=0; i<ack_len; i++)			call_point[i]= ((char *)start_apic_ack)[i];	}}/* i8259.cBUILD_SMP_INTERRUPT(reschedule_interrupt,RESCHEDULE_VECTOR)

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产一区二区免费在线| 日韩精品一区在线观看| 日韩欧美第一区| 国产精品久久精品日日| 蜜臀a∨国产成人精品| 91论坛在线播放| 欧美国产精品劲爆| 黄色日韩三级电影| 欧美丰满一区二区免费视频| 亚洲欧美经典视频| 国产自产高清不卡| 欧美成人乱码一区二区三区| 亚洲高清在线精品| 在线观看一区二区精品视频| 中文字幕一区二区三区四区不卡| 国产在线看一区| 欧美v国产在线一区二区三区| 一区二区三区精品视频| 成人免费看视频| 国产欧美日韩精品在线| 国产一二精品视频| xnxx国产精品| 国产资源在线一区| 精品99999| 国产精品一二二区| 国产丝袜美腿一区二区三区| 国产精品一区在线观看乱码| 欧美v日韩v国产v| 狠狠色狠狠色综合系列| 久久蜜臀中文字幕| 国产乱色国产精品免费视频| 久久夜色精品国产欧美乱极品| 久久国产精品色| 亚洲精品一区二区三区香蕉| 精品一区二区在线播放| 精品成人佐山爱一区二区| 激情综合网天天干| 久久久国产综合精品女国产盗摄| 国产在线精品一区二区不卡了| 久久久99精品免费观看不卡| 成人激情开心网| 依依成人精品视频| 欧美日韩视频在线一区二区| 美腿丝袜亚洲一区| 久久亚洲一级片| 91亚洲国产成人精品一区二区三| 亚洲精品网站在线观看| 欧美日本国产视频| 国产一区二区三区黄视频 | 国产高清亚洲一区| 国产精品视频九色porn| 色中色一区二区| 日韩成人免费看| 久久久久亚洲综合| 日本久久电影网| 日韩电影一二三区| 国产欧美一区视频| 精品视频免费在线| 国产精品18久久久久久久久久久久| 亚洲天堂a在线| 欧美一区二区在线不卡| 成人激情免费网站| 视频在线观看91| 国产精品理伦片| 91麻豆精品国产| 欧美男女性生活在线直播观看| 久久精品二区亚洲w码| 国产精品久久久久久久久动漫 | 欧美午夜一区二区三区 | 99精品久久免费看蜜臀剧情介绍| 香蕉乱码成人久久天堂爱免费| 久久伊人蜜桃av一区二区| 在线观看日韩毛片| 国产激情偷乱视频一区二区三区 | 国产精品日产欧美久久久久| 欧美伊人精品成人久久综合97| 国产乱人伦偷精品视频免下载| 亚洲影院久久精品| 日本一区二区三区国色天香| 欧美日韩成人在线| 97久久超碰精品国产| 免费久久99精品国产| 亚洲综合丁香婷婷六月香| 国产三级一区二区| 日韩欧美高清dvd碟片| 欧美三级电影在线观看| a美女胸又www黄视频久久| 国产在线视频一区二区| 美女在线一区二区| 亚洲综合色网站| 综合激情网...| 国产精品麻豆网站| 国产日韩在线不卡| 精品国产123| 欧美伊人久久大香线蕉综合69 | 在线国产电影不卡| 国产精品综合二区| 日本在线不卡视频| 亚洲一二三区在线观看| 亚洲天堂2014| 中文字幕在线一区免费| 国产精品久久久一区麻豆最新章节| 亚洲精品一区在线观看| 欧美刺激午夜性久久久久久久 | 久久99精品久久久久久动态图| 亚洲一区在线看| 亚洲激情校园春色| 亚洲免费观看在线视频| 日韩一区在线看| 国产精品久久久久久久久久久免费看| 国产三级精品三级在线专区| 国产亚洲一区二区三区| 欧美国产1区2区| 日本中文字幕一区二区有限公司| 亚洲成人av免费| 日韩电影免费在线看| 青青青伊人色综合久久| 麻豆精品一区二区| 久久er99热精品一区二区| 国产露脸91国语对白| 国产不卡在线一区| av一区二区三区黑人| 91麻豆精品一区二区三区| 日本道精品一区二区三区| 欧美亚洲自拍偷拍| 337p亚洲精品色噜噜| 欧美电影免费提供在线观看| 欧美成人精品福利| 欧美激情综合五月色丁香小说| 国产精品欧美一区喷水| 樱花影视一区二区| 欧美bbbbb| 国产.欧美.日韩| 色综合视频在线观看| 欧美精品xxxxbbbb| 欧美不卡视频一区| 最新国产精品久久精品| 亚洲一区影音先锋| 久久99热99| 99精品国产99久久久久久白柏 | 97久久超碰国产精品电影| 91福利社在线观看| 欧美精品一区二区三区很污很色的| 国产丝袜欧美中文另类| 亚洲精品菠萝久久久久久久| 麻豆精品在线播放| 99久久精品免费看| 日韩写真欧美这视频| 一区在线中文字幕| 青娱乐精品在线视频| 99riav一区二区三区| 91.麻豆视频| 亚洲日本在线天堂| 国精产品一区一区三区mba视频 | 亚洲午夜影视影院在线观看| 极品少妇一区二区| 欧美伊人久久大香线蕉综合69| 欧美大片日本大片免费观看| 亚洲激情一二三区| 国产成人在线观看| 91精品欧美久久久久久动漫| 最新中文字幕一区二区三区| 九九精品视频在线看| 欧美系列亚洲系列| 成人欧美一区二区三区1314| 精品一二三四在线| 制服丝袜激情欧洲亚洲| 亚洲日本va在线观看| 国产很黄免费观看久久| 欧美一级片在线看| 亚洲动漫第一页| 91久久人澡人人添人人爽欧美 | 国产高清精品在线| 欧美一二三区精品| 午夜精品成人在线视频| 一本色道**综合亚洲精品蜜桃冫| 久久看人人爽人人| 麻豆精品视频在线观看视频| 欧美日韩和欧美的一区二区| 亚洲欧美日韩国产一区二区三区| 国产一区二区三区免费在线观看| 宅男在线国产精品| 日精品一区二区| 欧美日韩综合不卡| 亚洲高清三级视频| 在线观看亚洲精品视频| 亚洲人成网站在线| 成人黄页在线观看| 国产亚洲精品aa| 国产成人鲁色资源国产91色综| 日韩欧美一区在线| 日本强好片久久久久久aaa| 欧美日韩美少妇| 天堂久久久久va久久久久| 欧美日韩大陆一区二区| 日韩国产在线一| 91精品国产福利在线观看 | 精品福利一区二区三区| 另类人妖一区二区av| 精品福利视频一区二区三区|