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

📄 swi.s

📁 深圳市微逻辑电子有限公司 巨果&#8226 Kingmos&reg 系统核心
💻 S
字号:
/* ******************************************************
 * @copyright(c) 版权所有,1998-2003微逻辑。保留所有权利。
 * ******************************************************
 * 
 * ******************************************************
 * 文件说明:线程切换功能
 * 版本号:1.0.0
 * 开发时期:2001-04-04
 * 作者:李林
 * 修改记录:
 * *******************************************************
 */

.nolist
.include "def.inc"
.include "linkage.inc"
.include "cpu.inc"
.list

.equ	USER_MODE	,	0x10	@2_10000
.equ	FIQ_MODE	,	0x11	@2_10001
.equ	IRQ_MODE	,	0x12	@2_10010
.equ	SVC_MODE	,	0x13	@2_10011
.equ	ABORT_MODE	,	0x17	@2_10111
.equ	UNDEF_MODE	,	0x1b	@2_11011
.equ	SYS_MODE ,	0x1f	@2_11111

	.extern SwitchToProcessByHandle
	.extern SwitchBackProcess
	.extern DoImplementCallBack

	.text

@===========================================================
	@ r0  ->  	lpPrevTSS
	@ r1  ->    lpNextTSS
	@ r2  ->    &lpCurThread
	@ r3  ->    lpNext
@===========================================================
	ENTRY Switch

	str     r3, [r2]
	add     r0, r0, #0x8
	add     r1, r1, #0x8
	stmia   r0, { r0-r14 }

	ldmia   r1, { r0 - r14 }
	mov    pc, r14


@typedef struct _SYSCALL
@{
@	UINT uiCallMode;	// 输入之前的模式; 输出,将要切换到的新模式
@	DWORD dwCallInfo;
@	PFNVOID pfnRetAdress;
@	UINT uiArg[1];		//可变长度
@}SYSCALL, FAR * LPSYSCALL;
@PFNVOID DoImplementCallBack( LPSYSCALL lpCallInfo )

	ENTRY KL_ImplementCallBack
	b _ImplementCallBack
	
	ENTRY KL_ImplementCallBack4	

_ImplementCallBack:
	
	stmfd sp!, {r0-r3}
	sub   sp, sp, #12
	mov   r0, sp
	bl    DoImplementCallBack
	cmp   r0, #0
	moveq pc, lr					@假如无效,直接返回
    
	ldr  lr, =0xF0100000            @返回地址
	ldr  r12, [sp]                  @调用模式
	add  sp, sp, #12

	msr  cpsr_c, #SVC_MODE | 0x80        @ switch to svc_mode and IRQ disable
	msr  spsr_c, r12                @
	mov  lr,     r0                 @ 调用地址

	msr  cpsr_c, #SYS_MODE | 0x80        @ switch to sys_mode and IRQ disable
	ldmfd sp!, {r0-r3}

	msr  cpsr_c, #SVC_MODE | 0x80        @ switch to svc_mode and IRQ disable
	movs pc, lr



    ENTRY _CallInMode
    @调用从系统模式到用户模式
    @int _CallInMode( LPVOID (r0)lpParam, LPVOID (r1)lpIP, LPVOID (r2)sp, UINT (r3)mode )
    @
	msr  cpsr_c, #SYS_MODE        @ switch to sys_mode
	@mov  lr, #0x0
	ldr   lr, =0xF0100000         @return sys adr
    mov  sp, r2
	msr  cpsr_c, #SVC_MODE | 0x80        @ switch to svc_mode and IRQ disable
    msr  spsr, r3              @
    movs pc, r1                @ 决不返回
    
    ENTRY SwitchToStackSpace
    mov  sp, r0
    mov  pc, lr
        

@=======================================================
@VOID HandlerException( LPJMP_EXCEPTION jmp_data, int retv, UINT mode )
@
@=======================================================

    ENTRY HandlerException

	ldmia  r0!, {r4 - r12, sp, lr}
	
	ldmia  r0!, {r3}                  @ r3 = return pc

	movs   r0, r1					 @ return value
	moveq  r0, #1

	msr   cpsr_c, #SVC_MODE | 0x80    @ switch to svc_mode and IRQ disable
    msr   spsr, r2				    @					

	movs  pc, r3

	@内核调用功能,该部分代码需要与 callsrv.s 同步改动
	
    ENTRY KC_CaptureException    

    @ copy to EXCEPTION_CONTEXT struct
	mov    r12, #0
	add    r1, pc, #_KC_ExceptionRet-(.+8)
	stmfd  sp!, {r1}		@ return address	
	stmfd  sp!, {r4 - r12, sp, lr}

	@ call sys api
	mov  r0, sp	
	stmfd sp!, {lr}
    bl   KL_CaptureException
    ldmfd sp!, {lr}
   
    add  sp, sp, #48		@ popup EXCEPTION_CONTEXT struct 
    mov   pc, lr			@ common  return 

_KC_ExceptionRet:    
    mov   pc, lr			@ common  return 


	

⌨️ 快捷键说明

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