arch/m68k/fpsp040/bugfix.S

Source file repositories/reference/linux-study-clean/arch/m68k/fpsp040/bugfix.S

File Facts

System
Linux kernel
Corpus path
arch/m68k/fpsp040/bugfix.S
Extension
.S
Size
14062 bytes
Lines
496
Domain
Architecture Layer
Bucket
arch/m68k
Inferred role
Architecture Layer: arch/m68k
Status
atlas-only

Why This File Exists

CPU and platform-specific kernel glue: boot entry, traps, syscall entry, interrupts, page tables, context switch, and low-level barriers.

Dependency Surface

Detected Declarations

Annotated Snippet

bfextu	CMDREG1B(%a6){#3:#3},%d0	|get 1st src
	bfextu	CMDREG3B(%a6){#6:#3},%d1	|get 3rd dest
	cmpb	%d0,%d1
	beqs	op0			|if equal, continue bugfix
|
| Check for cu dest equal to nu dest.  If so, go and fix the
| bug condition.  Otherwise, exit.
|
	bfextu	CMDREG1B(%a6){#6:#3},%d0	|get 1st dest
	cmpb	%d0,%d1			|cmp 1st dest with 3rd dest
	beqs	op0			|if equal, continue bugfix
|
| Check for cu and xu register conflict.
|
	bfextu	CMDREG2B(%a6){#6:#3},%d1	|get 2nd dest
	cmpb	%d0,%d1			|cmp 1st dest with 2nd dest
	beqs	op0_xu			|if equal, continue bugfix
	bfextu	CMDREG1B(%a6){#3:#3},%d0	|get 1st src
	cmpb	%d0,%d1			|cmp 1st src with 2nd dest
	beq	op0_xu
	bne	fix_done		|if the reg checks fail, exit
|
| We have the opclass 0 situation.
|
op0:
	bfextu	CMDREG1B(%a6){#3:#3},%d0	|get source register no
	movel	#7,%d1
	subl	%d0,%d1
	clrl	%d0
	bsetl	%d1,%d0
	fmovemx %d0,ETEMP(%a6)		|load source to ETEMP

	moveb	#0x12,%d0
	bfins	%d0,CMDREG1B(%a6){#0:#6}	|opclass 2, extended
|
|	Set ETEMP exponent bit 15 as the opposite of ete14
|
	btst	#6,ETEMP_EX(%a6)		|check etemp exponent bit 14
	beq	setete15
	bclr	#etemp15_bit,STAG(%a6)
	bra	finish
setete15:
	bset	#etemp15_bit,STAG(%a6)
	bra	finish

|
| We have the case in which a conflict exists between the cu src or
| dest and the dest of the xu.  We must clear the instruction in
| the cu and restore the state, allowing the instruction in the
| xu to complete.  Remember, the instruction in the nu
| was exceptional, and was completed by the appropriate handler.
| If the result of the xu instruction is not exceptional, we can
| restore the instruction from the cu to the frame and continue
| processing the original exception.  If the result is also
| exceptional, we choose to kill the process.
|
|	Items saved from the stack:
|
|		$3c stag     - L_SCR1
|		$40 cmdreg1b - L_SCR2
|		$44 dtag     - L_SCR3
|
| The cu savepc is set to zero, and the frame is restored to the
| fpu.
|
op0_xu:
	movel	STAG(%a6),L_SCR1(%a6)
	movel	CMDREG1B(%a6),L_SCR2(%a6)
	movel	DTAG(%a6),L_SCR3(%a6)
	andil	#0xe0000000,L_SCR3(%a6)

Annotation

Implementation Notes