⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 atomic-ops.txt

📁 h内核
💻 TXT
字号:
			       =====================================			       FUJITSU FR-V KERNEL ATOMIC OPERATIONS			       =====================================On the FR-V CPUs, there is only one atomic Read-Modify-Write operation: the SWAP/SWAPIinstruction. Unfortunately, this alone can't be used to implement the following operations: (*) Atomic add to memory (*) Atomic subtract from memory (*) Atomic bit modification (set, clear or invert) (*) Atomic compare and exchangeOn such CPUs, the standard way of emulating such operations in uniprocessor mode is to disableinterrupts, but on the FR-V CPUs, modifying the PSR takes a lot of clock cycles, and it has to bedone twice. This means the CPU runs for a relatively long time with interrupts disabled,potentially having a great effect on interrupt latency.=============NEW ALGORITHM=============To get around this, the following algorithm has been implemented. It operates in a way similar tothe LL/SC instruction pairs supported on a number of platforms. (*) The CCCR.CC3 register is reserved within the kernel to act as an atomic modify abort flag. (*) In the exception prologues run on kernel->kernel entry, CCCR.CC3 is set to 0 (Undefined     state). (*) All atomic operations can then be broken down into the following algorithm:     (1) Set ICC3.Z to true and set CC3 to True (ORCC/CKEQ/ORCR).     (2) Load the value currently in the memory to be modified into a register.     (3) Make changes to the value.     (4) If CC3 is still True, simultaneously and atomically (by VLIW packing):	 (a) Store the modified value back to memory.	 (b) Set ICC3.Z to false (CORCC on GR29 is sufficient for this - GR29 holds the current	     task pointer in the kernel, and so is guaranteed to be non-zero).     (5) If ICC3.Z is still true, go back to step (1).This works in a non-SMP environment because any interrupt or other exception that happens betweensteps (1) and (4) will set CC3 to the Undefined, thus aborting the store in (4a), and causing thecondition in ICC3 to remain with the Z flag set, thus causing step (5) to loop back to step (1).This algorithm suffers from two problems: (1) The condition CCCR.CC3 is cleared unconditionally by an exception, irrespective of whether or     not any changes were made to the target memory location during that exception. (2) The branch from step (5) back to step (1) may have to happen more than once until the store     manages to take place. In theory, this loop could cycle forever because there are too many     interrupts coming in, but it's unlikely.=======EXAMPLE=======Taking an example from include/asm-frv/atomic.h:	static inline int atomic_add_return(int i, atomic_t *v)	{		unsigned long val;		asm("0:						\n"It starts by setting ICC3.Z to true for later use, and also transforming that into CC3 being in theTrue state.		    "	orcc		gr0,gr0,gr0,icc3	\n"	<-- (1)		    "	ckeq		icc3,cc7		\n"	<-- (1)Then it does the load. Note that the final phase of step (1) is done at the same time as theload. The VLIW packing ensures they are done simultaneously. The ".p" on the load must not beremoved without swapping the order of these two instructions.		    "	ld.p		%M0,%1			\n"	<-- (2)		    "	orcr		cc7,cc7,cc3		\n"	<-- (1)Then the proposed modification is generated. Note that the old value can be retained if required(such as in test_and_set_bit()).		    "	add%I2		%1,%2,%1		\n"	<-- (3)Then it attempts to store the value back, contingent on no exception having cleared CC3 since itwas set to True.		    "	cst.p		%1,%M0		,cc3,#1	\n"	<-- (4a)It simultaneously records the success or failure of the store in ICC3.Z.		    "	corcc		gr29,gr29,gr0	,cc3,#1	\n"	<-- (4b)Such that the branch can then be taken if the operation was aborted.		    "	beq		icc3,#0,0b		\n"	<-- (5)		    : "+U"(v->counter), "=&r"(val)		    : "NPr"(i)		    : "memory", "cc7", "cc3", "icc3"		    );		return val;	}=============CONFIGURATION=============The atomic ops implementation can be made inline or out-of-line by changing theCONFIG_FRV_OUTOFLINE_ATOMIC_OPS configuration variable. Making it out-of-line has a number ofadvantages: - The resulting kernel image may be smaller - Debugging is easier as atomic ops can just be stepped over and they can be breakpointedKeeping it inline also has a number of advantages: - The resulting kernel may be Faster   - no out-of-line function calls need to be made   - the compiler doesn't have half its registers clobbered by making a callThe out-of-line implementations live in arch/frv/lib/atomic-ops.S.

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -