arch/openrisc/kernel/head.S

Source file repositories/reference/linux-study-clean/arch/openrisc/kernel/head.S

File Facts

System
Linux kernel
Corpus path
arch/openrisc/kernel/head.S
Extension
.S
Size
40329 bytes
Lines
1567
Domain
Architecture Layer
Bucket
arch/openrisc
Inferred role
Architecture Layer: arch/openrisc
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

* jump to kernel entry (start_kernel)
	 */
	LOAD_SYMBOL_2_GPR(r30, start_kernel)
	l.jr    r30
	 l.nop

_flush_tlb:
	/*
	 *  I N V A L I D A T E   T L B   e n t r i e s
	 */
	LOAD_SYMBOL_2_GPR(r5,SPR_DTLBMR_BASE(0))
	LOAD_SYMBOL_2_GPR(r6,SPR_ITLBMR_BASE(0))
	l.addi	r7,r0,128 /* Maximum number of sets */
1:
	l.mtspr	r5,r0,0x0
	l.mtspr	r6,r0,0x0

	l.addi	r5,r5,1
	l.addi	r6,r6,1
	l.sfeq	r7,r0
	l.bnf	1b
	 l.addi	r7,r7,-1

	l.jr	r9
	 l.nop

#ifdef CONFIG_SMP
secondary_wait:
	/* Doze the cpu until we are asked to run */
	/* If we dont have power management skip doze */
	l.mfspr r25,r0,SPR_UPR
	l.andi  r25,r25,SPR_UPR_PMP
	l.sfeq  r25,r0
	l.bf	secondary_check_release
	 l.nop

	/* Setup special secondary exception handler */
	LOAD_SYMBOL_2_GPR(r3, _secondary_evbar)
	tophys(r25,r3)
	l.mtspr	r0,r25,SPR_EVBAR

	/* Enable Interrupts */
	l.mfspr	r25,r0,SPR_SR
	l.ori	r25,r25,SPR_SR_IEE
	l.mtspr	r0,r25,SPR_SR

	/* Unmask interrupts interrupts */
	l.mfspr r25,r0,SPR_PICMR
	l.ori   r25,r25,0xffff
	l.mtspr	r0,r25,SPR_PICMR

	/* Doze */
	l.mfspr r25,r0,SPR_PMR
	LOAD_SYMBOL_2_GPR(r3, SPR_PMR_DME)
	l.or    r25,r25,r3
	l.mtspr r0,r25,SPR_PMR

	/* Wakeup - Restore exception handler */
	l.mtspr	r0,r0,SPR_EVBAR

secondary_check_release:
	/*
	 * Check if we actually got the release signal, if not go-back to
	 * sleep.
	 */
	l.mfspr	r25,r0,SPR_COREID
	LOAD_SYMBOL_2_GPR(r3, secondary_release)
	tophys(r4, r3)
	l.lwz	r3,0(r4)
	l.sfeq	r25,r3

Annotation

Implementation Notes