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

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

?? rtl_time.c

?? fsmlabs的real time linux的內核
?? C
字號:
/* * rtl_time.c * * PPC-specific clock support * * Copyright (C) 1999 Cort Dougan <cort@fsmlabs.com> */#include <linux/module.h>#include <linux/kernel.h>#include <linux/errno.h>#include <linux/sched.h>#include <linux/timex.h>#include <linux/mc146818rtc.h>#include <asm/smp.h>#include <asm/system.h>#include <asm/io.h>#include <asm/time.h>#include <rtl_core.h>#include <rtl_time.h>#include <rtl.h>static void _decr_uninit (clockid_t clock);static int _decr_init (clockid_t clock);static hrtime_t _decr_gettime (struct rtl_clock *);static int _decr_settimer (struct rtl_clock *, hrtime_t interval);static int _decr_settimermode (struct rtl_clock *, int mode);unsigned int decr_intercept(struct pt_regs *);unsigned long linux_decrs = 0;unsigned long linux_decrementer_count = 0, rtl_decrementer_count;unsigned long last_tb = 0;/* * Handle >=2.4.0 vs. earlier differences * --- * decrementer_count changed to tb_ticks_per_jiffy in 2.4.0 * * The interrupt handler in linux/ppc is more complicated with later * versions so we have a flag to just tell it to not touch the decr. * This should prevent others from messing with the code without * understanding it, too. *   -- Cort <cort@fsmlabs.com> */#if LINUX_2_4_0_FINAL_OR_LATER#define decrementer_count tb_ticks_per_jiffyextern unsigned long disarm_decr[NR_CPUS];#else /* LINUX_2_4_0_FINAL_OR_LATER */extern unsigned decrementer_count;#endif /* LINUX_2_4_0_FINAL_OR_LATER */void default_handler(struct pt_regs *regs);MODULE_AUTHOR("Cort Dougan <cort@fsmlabs.com>");MODULE_DESCRIPTION("RTLinux PPC Timer Module");struct rtl_clock decr_clock ={	_decr_init, _decr_uninit,	_decr_gettime,	NULL, /* sethrtime */	_decr_settimer,	_decr_settimermode,	default_handler, /* handler */	RTL_CLOCK_MODE_ONESHOT, /* mode */};hrtime_t _decr_gettime (struct rtl_clock *clock){	unsigned long tbu, tbl, tbu1;	hrtime_t tb, ret;	/*	 * Possible bug pointed out by Niklaus Giger where	 * the timebase goes from ~0x0 to 0x0.  This	 * catches that case now.  -- Cort	 */	do {		asm volatile("mftbu	%2\n\t"			     "mftb 	%0\n\t"			     "mftbu	%1\n\t"			     : "=r" (tbl), "=r" (tbu), "=r" (tbu1) );	} while (tbu != tbu1);	tb = (hrtime_t)tbl + ((hrtime_t)tbu<<32);	/*	 * Changed this calculation so we take into account the	 * fact that decrementer ticks are not even multiples of	 * ns's.	 *	 * First we get the number of linux ticks that have occurred	 * so far, which is an even multiple of ns's (NSECS_PER_SEC/HZ).	 * Then, get the next fraction of a linux tick and compute	 * the number of ns as best we can with 64-bit arithmetic.	 *   -- Cort	 */	ret = (tb / linux_decrementer_count) * ((hrtime_t)NSECS_PER_SEC/HZ);	ret += ((tb % linux_decrementer_count) * ((hrtime_t)NSECS_PER_SEC/HZ))		/ linux_decrementer_count;	return ret;}static int _decr_settimer(struct rtl_clock *clock, hrtime_t interval){	unsigned long t;	if (interval)	{		/*		 * ns to decr ticks, rounds down -- Cort		 * fixed to round up as required by posix -- Michael		 * fixed to compute ticks with 64-bit arithmetic so		 * we don't lose precision.  We need this precision		 * because PPC decrementer ticks are not always multiples		 * of ns's.  Still rounds up.		 *  -- Cort		 */		t = (ulong)((interval * (hrtime_t)linux_decrementer_count) / ((hrtime_t)NSECS_PER_SEC/(hrtime_t)HZ)) + 1;		if (decr_clock.mode == RTL_CLOCK_MODE_PERIODIC)			clock->resolution = interval;		else			clock->resolution = 1;		/* sanity check to make sure we're not setting a bad value */		if (t < 1)			t = 1;		/*		 * If next tick is set for a time beyond when Linux wants a tick		 * then just set it for when Linux wants it.  This skips the		 * case when we're already overdue for a Linux tick.		 *   -- Cort		 */		else if ( (linux_decrs < linux_decrementer_count) &&			  (t > (linux_decrementer_count - linux_decrs)) )		{			t = linux_decrementer_count - linux_decrs;		}				rtl_decrementer_count = t;	}		/*	 * actually setup the decrementer, taking into account the	 * time that has elapsed since the decrementer crossed 0	 */	{		unsigned long dval;		dval = get_dec();		set_dec(rtl_decrementer_count);		decr_clock.arch.istimerset = 1;	}	return 0;}static int _decr_settimermode(struct rtl_clock *clock, int mode){	clock->mode = mode;	return 0;}clockid_t rtl_getbestclock (unsigned int cpu){        return &decr_clock;}hrtime_t gethrtime(void){	return _decr_gettime(&decr_clock);}hrtime_t gethrtimeres(void){	return (NSECS_PER_SEC/HZ)/linux_decrementer_count;}int init_module (void){	/* keep a copy of the decrementer count that Linux wants */	linux_decrementer_count = decrementer_count;	rtl_init_standard_clocks();	return 0;}void cleanup_module(void){	rtl_cleanup_standard_clocks();	decrementer_count = linux_decrementer_count;}unsigned int decr_intercept(struct pt_regs *regs){	unsigned long dval;	int d;	void (*handler)( struct pt_regs *regs) = decr_clock.handler;		/*	 * Compute the # ticks since last interrupt so	 * we can keep track of how many Linux has accrued	 */	{		unsigned long diff, tb;		asm volatile("mftb 	%0" : "=r" (tb) );		diff = tb - last_tb;		last_tb = tb;		linux_decrs += diff;	}		/*	 * If it's one-shot clear the handler and reset the 	 * timer.	 */	if ( decr_clock.mode == RTL_CLOCK_MODE_ONESHOT )	{		decr_clock.arch.istimerset = 0;	} else {		dval = get_dec();		while ((d = (int)get_dec()) == dval)			;		if ( (int)(d + rtl_decrementer_count) < 500 )		{			printk("_decr_intercept(): d %08x decr_count %08lx too low: time overrun likely\n",			       d, rtl_decrementer_count);			set_dec(rtl_decrementer_count);		}		else			set_dec(d + rtl_decrementer_count);	}		/*	 * Give Linux a timer interrupt if one is due.	 *	 * Linux/ppc >=2.4.0 handles all pending interrupts in a single	 * call to the interrupt handler by looking at the timebase	 * so for it we just give it one pend.  For earlier versions	 * of Linux we have to give it a timer interrupt for each	 * on that it has missed.	 *   -- Cort <cort@fsmlabs.com>	 */#if LINUX_2_4_0_FINAL_OR_LATER	if ( linux_decrs >= linux_decrementer_count )	{		rtl_local_pend_vec(0,0);		while ( linux_decrs >= linux_decrementer_count )			linux_decrs -= linux_decrementer_count;	}#else	  	if ( linux_decrs >= linux_decrementer_count )	{		if ( !rtl_local_ispending_irq(0) )		{			rtl_local_pend_vec(0,0);			linux_decrs -= linux_decrementer_count;		}	}#endif /* LINUX_2_4_0_FINAL_OR_LATER */		if ( handler != default_handler )		handler(regs);	if (!decr_clock.arch.istimerset)	{		/* setup the next tick to be when Linux wants one		 * since we don't have anything pending		 */		if ( linux_decrementer_count > linux_decrs)			set_dec(linux_decrementer_count - linux_decrs);		else			set_dec(linux_decrementer_count);		decr_clock.arch.istimerset = 1;	}		return 0;}static int _decr_init (clockid_t clock){	rtl_decrementer_count = linux_decrementer_count;	/* we're taking over control of the decr so tell linux to leave it alone */#if LINUX_2_4_0_FINAL_OR_LATER	disarm_decr[smp_processor_id()] = 1;#else	decrementer_count = 0;#endif		asm volatile("mftb 	%0" : "=r" (last_tb) );	if ( rtl_request_local_irq(0, decr_intercept, 0) )	{		printk("Failed getting local timer irq\n");		return -1;	}	set_dec(rtl_decrementer_count);	  	return 0;}static void _decr_uninit (clockid_t clock){	rtl_free_local_irq(0,0);		/* give decr control back to linux */#if LINUX_2_4_0_FINAL_OR_LATER	disarm_decr[smp_processor_id()] = 0;#else	decrementer_count = linux_decrementer_count;#endif		clock->handler = RTL_CLOCK_DEFAULTS.handler;}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
精品国产乱码久久久久久免费| 久久久久99精品一区| 精品91自产拍在线观看一区| 最新日韩av在线| 久久狠狠亚洲综合| 在线免费精品视频| 国产精品日韩成人| 国产在线日韩欧美| 欧美日韩国产综合一区二区三区| 中文字幕av一区二区三区高 | 蜜乳av一区二区| www.成人在线| 3d成人动漫网站| 国产精品久久久久久久岛一牛影视| 亚洲高清不卡在线| jlzzjlzz国产精品久久| 精品国产区一区| 视频一区欧美日韩| 欧美视频一区在线| 亚洲欧洲综合另类| www.亚洲人| 国产精品天美传媒| 国产精品原创巨作av| 2021国产精品久久精品| 偷拍日韩校园综合在线| 欧美亚洲尤物久久| 亚洲在线观看免费视频| 色呦呦国产精品| 亚洲人午夜精品天堂一二香蕉| 国产高清无密码一区二区三区| 欧美成人精品3d动漫h| 欧美aaaaaa午夜精品| 欧美色倩网站大全免费| 偷拍与自拍一区| 91精品久久久久久久久99蜜臂| 亚洲成人久久影院| 欧美精品在欧美一区二区少妇| 亚洲福利视频导航| 91精品国产91久久久久久一区二区 | 精品久久久久久最新网址| 日韩精品一级中文字幕精品视频免费观看 | 成人在线视频一区| 国产精品国产三级国产aⅴ入口| 国产成人免费在线观看| 国产精品美女久久久久av爽李琼| 福利电影一区二区三区| 国产精品午夜春色av| 99久久久无码国产精品| 亚洲品质自拍视频网站| 玖玖九九国产精品| 久久亚洲一区二区三区四区| 国产夫妻精品视频| 中文字幕一区av| 欧美吞精做爰啪啪高潮| 美女任你摸久久 | 国产欧美日韩不卡| 91麻豆福利精品推荐| 亚洲国产日日夜夜| 欧美xxxxxxxxx| 国产aⅴ综合色| 亚洲码国产岛国毛片在线| 欧美人成免费网站| 国产精品性做久久久久久| 亚洲色图色小说| 欧美一级夜夜爽| 高清国产午夜精品久久久久久| 亚洲免费观看高清在线观看| 欧美一区二区三区性视频| 丰满放荡岳乱妇91ww| 亚洲国产精品自拍| 国产欧美一区二区三区网站| 欧美丝袜丝交足nylons图片| 激情欧美一区二区三区在线观看| 亚洲美女视频一区| 久久亚洲精品小早川怜子| 欧美制服丝袜第一页| 国产在线视频一区二区三区| 一区二区三区视频在线观看| 久久婷婷久久一区二区三区| 欧美亚男人的天堂| 成人污视频在线观看| 奇米影视一区二区三区小说| 中文字幕日韩一区| 久久蜜桃香蕉精品一区二区三区| 欧美在线观看视频在线| 国产v日产∨综合v精品视频| 日韩成人一级片| 国产精品免费网站在线观看| 日韩欧美一级二级| 欧美老女人在线| 91日韩在线专区| 国产91精品精华液一区二区三区| 日韩福利电影在线| 亚洲伊人色欲综合网| 亚洲国产高清aⅴ视频| 久久综合999| 日韩一区二区精品在线观看| 精品入口麻豆88视频| 欧美日韩国产片| 在线精品视频免费播放| 91免费小视频| 成人精品免费看| 国产精品一二三四五| 另类小说视频一区二区| 日韩国产欧美三级| 亚洲成人动漫在线观看| 一区二区三区**美女毛片| 午夜精品久久一牛影视| 亚洲综合在线观看视频| 最新中文字幕一区二区三区| 国产精品全国免费观看高清| 中文字幕av资源一区| 亚洲国产精品ⅴa在线观看| 欧美国产乱子伦| 欧美国产日本韩| 亚洲日穴在线视频| 亚洲精品国产精品乱码不99| 亚洲免费视频中文字幕| 亚洲一本大道在线| 午夜不卡av免费| 视频精品一区二区| 老司机精品视频导航| 久久99久久99| 国产风韵犹存在线视精品| 粉嫩aⅴ一区二区三区四区| 成人国产电影网| 91论坛在线播放| 欧美日本在线一区| 日韩精品一区二区在线观看| 国产亚洲成年网址在线观看| 国产精品免费看片| 最新不卡av在线| 日日夜夜免费精品视频| 开心九九激情九九欧美日韩精美视频电影 | 精品国产123| 国产精品天干天干在线综合| 亚洲精品五月天| 亚瑟在线精品视频| 国内精品久久久久影院一蜜桃| 国产宾馆实践打屁股91| 色偷偷88欧美精品久久久| 欧美日韩1234| 国产色综合一区| 亚洲综合一二区| 精一区二区三区| 不卡av在线免费观看| 欧美电视剧在线观看完整版| 国产日韩精品久久久| 一区二区三区.www| 狠狠色丁香久久婷婷综合_中| 成人动漫中文字幕| 欧美一级片免费看| 亚洲三级视频在线观看| 日本不卡1234视频| 99国产精品久久久| 日韩亚洲欧美中文三级| 成人免费在线播放视频| 麻豆久久久久久| 91蜜桃在线免费视频| 日韩精品一区二区三区四区视频| 1000部国产精品成人观看| 麻豆成人免费电影| 色哟哟一区二区在线观看| 精品久久久久久久久久久久久久久久久| 国产精品久久久久久久蜜臀| 石原莉奈一区二区三区在线观看| 粉嫩久久99精品久久久久久夜| 8x8x8国产精品| 亚洲乱码中文字幕| 精品中文av资源站在线观看| 91在线精品秘密一区二区| 日韩精品中文字幕在线不卡尤物| 一区二区三区国产精品| 国产精品77777| 日韩欧美一级二级三级久久久| 一区二区三区在线观看视频| 国产999精品久久久久久| 欧美精品一卡两卡| 亚洲一区二区偷拍精品| 成人免费视频免费观看| 精品国产露脸精彩对白 | 久久精品国产精品亚洲红杏| 色综合视频一区二区三区高清| 国产肉丝袜一区二区| 久久精品国产亚洲5555| 在线不卡中文字幕播放| 亚洲精品国产精品乱码不99| 成人在线视频一区二区| 久久久精品tv| 国产精品99久久久久久似苏梦涵| 日韩女优制服丝袜电影| 免费在线观看视频一区| 69堂国产成人免费视频| 午夜国产精品一区| 欧美日韩一区中文字幕| 五月天久久比比资源色| 国产精品夜夜爽| 激情综合色综合久久| 欧美精品一二三四| 亚洲国产wwwccc36天堂|