诡异的函数设计
时间:2006-09-15 来源:oliliango
看2.6.12内核中提供的禁中断的函数,有个:void local_irq_save(unsigned long flags)和void local_irq_restore(unsigned long flags)分别是用来做禁止中断时状态的保护和恢复中断时状态的恢复,看到ldd3中对于这两个函数的调用特别指出时直接传递而不是指针传递,令我很是不解,不解的是:作为传值调用的函数实参怎么能够保存函数调用返回之后的状态呢,这和C的基础知识冲突了。结果实际看了内核的代码才发现这个“函数”实际上是宏......
faint了......
内核代码中是这么写的:
#define local_irq_save(flags) local_irq_save_ptr(&flags)
现在就清楚了实际上怎么回事了。这里一并把实际的函数也贴上存档备忘:
static inline void local_irq_save_ptr(unsigned long *flags) { unsigned long msr; msr = mfmsr(); *flags = msr; #ifdef CONFIG_BOOKE __asm__ __volatile__("wrteei 0": : :"memory"); #else SET_MSR_EE(msr & ~MSR_EE); #endif __asm__ __volatile__("": : :"memory"); } |
遗留的是要考虑清楚为什么要这么定义,是出于什么目的要这么转换一下......
达人来指教就好了。
相关阅读 更多 +