SWIハンドラにてシステムモード固定ではなく呼び出し元のモードのスタックを使用するように変更

(割り込みハンドラから呼び出した場合は割り込みハンドラのスタックを使用するということ)。

git-svn-id: file:///Volumes/Transfer/gigaleak_20231201/2020-09-30%20-%20paladin.7z/paladin/ctr_firmware@220 b871894f-2f95-9b40-918c-086798483c85
This commit is contained in:
nakasima 2009-01-28 02:47:02 +00:00
parent c06d09c5b4
commit 340ab42c26
2 changed files with 61 additions and 82 deletions

View File

@ -220,7 +220,9 @@ asm void i_stupDAbtVeneer( void )
asm void i_stupSwiSemihosting( void )
{
// 割り込み禁止
msr cpsr_cxsf, #(HW_PSR_SYS_MODE | HW_PSR_IRQ_DISABLE | HW_PSR_FIQ_DISABLE)
mrs r12, cpsr
orr r12, r12, #(HW_PSR_IRQ_DISABLE | HW_PSR_FIQ_DISABLE)
msr cpsr_cxsf, r12
ldmfd sp!, {r11, r12, lr}
add sp, sp, #12
msr cpsr_cxsf, #(HW_PSR_SVC_MODE | HW_PSR_IRQ_DISABLE | HW_PSR_FIQ_DISABLE)
@ -229,7 +231,7 @@ asm void i_stupSwiSemihosting( void )
msr spsr_cxsf, lr
ldmfd sp!, {lr}
semi_vector
// セミホスティングアドレスはSVCモード
// セミホスティングアドレスはSVCモードでないとARMデバッガがエラーを出力
movs pc, lr
}
@ -238,48 +240,53 @@ asm void i_stupSwiHandler( void )
INASM_EXTERN( _start )
// SVCモード
msr cpsr_cxsf, #(HW_PSR_SYS_MODE | HW_PSR_IRQ_DISABLE | HW_PSR_FIQ_DISABLE)
mrs sp, spsr
// ユーザモードならシステムモードへ
tst sp, #HW_PSR_SYS_MODE ^ HW_PSR_USR_MODE
orreq sp, sp, #HW_PSR_SYS_MODE
// 割り込み禁止
orr sp, sp, #(HW_PSR_IRQ_DISABLE | HW_PSR_FIQ_DISABLE)
msr cpsr_cxsf, sp
// システムモード
// 呼び出し元のモード
sub sp, sp, #12
stmfd sp!, {r11, r12, lr}
add r12, sp, #16 // ユーザスタック内のSPSR_svc、LR_svc退避アドレスをコピー
add r12, sp, #24 // ユーザスタック内のSPSR_svc、LR_svc退避アドレスをコピー
msr cpsr_cxsf, #(HW_PSR_SVC_MODE | HW_PSR_IRQ_DISABLE | HW_PSR_FIQ_DISABLE)
// SVCモード
mov sp, r12 // ※SP_svc
mov r12, lr
mrs r11, spsr
msr cpsr_cxsf, #(HW_PSR_SYS_MODE | HW_PSR_IRQ_DISABLE | HW_PSR_FIQ_DISABLE)
// システムモード
add lr, sp, #16
stmia lr, {r11, r12} // SPSR_svc、LR_svcを退避
and r11, r11, #HW_PSR_IRQ_DISABLE // IRQ許可状態 コピー
orr r11, r11, #HW_PSR_SYS_MODE // FIQ許可
stmfd sp!, {r11, lr} // SPSR_svc、LR_svcを退避
// ユーザモードならシステムモードへ
tst r11, #HW_PSR_SYS_MODE ^ HW_PSR_USR_MODE
orreq r11, r11, #HW_PSR_SYS_MODE
// 割り込み状態継承
msr cpsr_cxsf, r11
mov lr, r12
ldrh r12, [lr, #-2] // システムコールNo取得(ハーフワードアクセス対応)
mov r12, r12, lsl #1
and r12, r12, #SVC_ID_PREMASK<<SVC_ID_SHIFT
// 呼び出し元のモード
ldrh r11, [r12, #-2] // システムコールNo取得
mov r11, r11, lsl #1
and r11, r11, #SVC_ID_PREMASK<<SVC_ID_SHIFT
cmp r12, #(SVC_ID_SEMIHOST_ARM & SVC_ID_PREMASK)<<SVC_ID_SHIFT // SVC_ID_SEMIHOST_ARM = 0x12
cmpne r12, #(SVC_ID_SEMIHOST_THUMB & SVC_ID_PREMASK)<<SVC_ID_SHIFT // SVC_ID_SEMIHOST_THUMB = 0xab
cmp r11, #(SVC_ID_SEMIHOST_ARM & SVC_ID_PREMASK)<<SVC_ID_SHIFT // SVC_ID_SEMIHOST_ARM = 0x12
cmpne r11, #(SVC_ID_SEMIHOST_THUMB & SVC_ID_PREMASK)<<SVC_ID_SHIFT // SVC_ID_SEMIHOST_THUMB = 0xab
beq i_stupSwiSemihosting
adr r11, SWI_Table // システムコールアドレス 取得
ldrh r12, [r11, r12]
adr r12, SWI_Table // システムコールアドレス 取得
ldrh r11, [r12, r11]
ldr r11, =HW_BROM
orr r12, r12, r11
ldr r12, =HW_BROM
orr r12, r11, r12
blx r12
swi_return
// 割り込み禁止
msr cpsr_cxsf, #(HW_PSR_SYS_MODE | HW_PSR_IRQ_DISABLE | HW_PSR_FIQ_DISABLE)
mrs r12, cpsr
orr r12, r12, #(HW_PSR_IRQ_DISABLE | HW_PSR_FIQ_DISABLE)
msr cpsr_cxsf, r12
ldmfd sp!, {r11, r12, lr}
add sp, sp, #12
msr cpsr_cxsf, #(HW_PSR_SVC_MODE | HW_PSR_IRQ_DISABLE | HW_PSR_FIQ_DISABLE)

View File

@ -1,17 +1,3 @@
[Breakpoints\1]
Processor=ARM946E_S_0
dwTarget Count=1
dwAction=0
dwState=0
Parent Image=C:\nctr\ctr_firmware_bak\bootrom\build\bootrom\thread\ARM9\bin\ARM9-MG20EMU.thumb\Release\thread9.axf
dwSet By Source Pos=0
Image=C:\nctr\ctr_firmware_bak\bootrom\build\bootrom\thread\ARM9\bin\ARM9-MG20EMU.thumb\Release\thread9.axf
File=c:\\nctr\\ctr_firmware_bak\\bootrom\\build\\libraries\\init\\common\\crt0_excp.c
dwLine=222
dwColumn=1
dwAddressLo=176
dwAddressHi=0
dwBreakpoint Size=0
[CLI]
dwParse=1
dwEcho=1
@ -39,15 +25,15 @@ dwRefresh=1
[Docking]
biBarID_0=AMAAAAAABJAAAAAAAMAAAAAAIEAAAAAAKOAAAAAABPAAAAAAOPPPPPPPMEAAAAAAAAAAAAAAAAPBAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
biBarID_4=AMAAAAAABJAAAAAAILDAAAAABJAAAAAAMGAAAAAAAIAAAAAAOPPPPPPPJACAAAAAAAAAAAAAAAPIAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
biBarID_65539=LCCAAAAAKJBAAAAAILDAAAAABJAAAAAAMGAAAAAAAIAAAAAAGMCAAAAABLCAAAAACAAAAAAABAPCAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
biBarID_65539=LCCAAAAAKJBAAAAAILDAAAAABJAAAAAAMGAAAAAAAIAAAAAAOHCAAAAAPFCAAAAACAAAAAAABAPCAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
biBarID_1114115=AMAAAAAABJAAAAAAILDAAAAABJAAAAAAMGAAAAAAAIAAAAAAOPPPPPPPJACAAAAAAAAAAAAAAAPIAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
biBarID_65538=BEBAAAAACCBAAAAAAMAAAAAAIEAAAAAAAMAAAAAAICAAAAAAHFAAAAAACFDAAAAACAAAAAAABAPCAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
biBarID_65538=BEBAAAAAOHBAAAAAAMAAAAAAIEAAAAAAAMAAAAAAICAAAAAAODAAAAAAGLCAAAAACAAAAAAABAPCAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
biBarID_1=AMAAAAAABJAAAAAAILDAAAAABJAAAAAAMGAAAAAAAIAAAAAAOPPPPPPPCHBAAAAAAAAAAAAAAAPIAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
biBarID_65540=JCBAAAAAACBAAAAAAMAAAAAAIEAAAAAAAMAAAAAAMGAAAAAALHEAAAAACNAAAAAACAAAAAAABAPCAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
biBarID_7=MFBAAAAAIKAAAAAAILDAAAAABJAAAAAAMGAAAAAAAIAAAAAADJEAAAAAFJBAAAAACAAAAAAABAPCAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
biBarID_65540=JCBAAAAAACBAAAAAAMAAAAAAIEAAAAAAAMAAAAAAMGAAAAAADMDAAAAAIPAAAAAACAAAAAAABAPCAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
biBarID_7=MFBAAAAAIKAAAAAAILDAAAAABJAAAAAAMGAAAAAAAIAAAAAANIDAAAAANJBAAAAACAAAAAAABAPCAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
biBarID_6=AMAAAAAABJAAAAAAAMAAAAAAIEAAAAAAKOAAAAAAICAAAAAAOPPPPPPPMBAAAAAAAAAAAAAAAAPBAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
biBarID_65543=AMAAAAAABJAAAAAAGDCAAAAAAMAAAAAAMGAAAAAAAIAAAAAAAIBAAAAADEBAAAAAAAAAAAAAAAPIAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
biBarID_8=AMAAAAAABJAAAAAAKHBAAAAAAMAAAAAAMGAAAAAAAIAAAAAAOPPPPPPPDEBAAAAAAAAAAAAAAAPIAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
biBarID_65543=AMAAAAAABJAAAAAAFFCAAAAAAMAAAAAAMGAAAAAAAIAAAAAABGBAAAAADEBAAAAAAAAAAAAAAAPIAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
biBarID_8=AMAAAAAABJAAAAAALFBAAAAAAMAAAAAAMGAAAAAAAIAAAAAAOPPPPPPPDEBAAAAAAAAAAAAAAAPIAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
[Docking\OpenStates]
biBarID_0=BAAAAAAA
biBarID_4=BAAAAAAA
@ -59,7 +45,11 @@ biBarID_65539=BAAAAAAA
biBarID_65540=BAAAAAAA
biBarID_65543=BAAAAAAA
[Images\Image_0]
Filename=C:\nctr\ctr_firmware_bak\bootrom\build\bootrom\thread\ARM9\bin\ARM9-MG20EMU.thumb\Release\thread9.axf
Filename=C:\nctr\ctr_firmware_bak\bootrom\build\bootrom\thread\thread9.axf
Processor=ARM946E_S_0
dwProfileState=0
[Images\Image_1]
Filename=C:\nctr\ctr_firmware\bootrom\build\bootrom\thread\thread9.axf
Processor=ARM946E_S_0
dwProfileState=0
[Interface\AutoRefresh]
@ -107,7 +97,7 @@ dwShow Margin=1
dwShow Tooltips=1
dwInitViewState=0
[MainWnd]
biWndPlacement=MCAAAAAAAAAAAAAABAAAAAAAPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPEJAAAAAANKAAAAAAEFEAAAAAGIDAAAAA
biWndPlacement=MCAAAAAAAAAAAAAABAAAAAAAPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPNNAAAAAAIMAAAAAANJEAAAAABKDAAAAA
[Memory]
dwActiveTab=0
dwApplyToAllTabs=0
@ -152,7 +142,7 @@ dwListSize=4
dwTargetAccessSize=0
dwAutoRefresh=1
[Output]
dwActiveTab=0
dwActiveTab=1
[ProcessorRegisters\ARM946E_S_0]
dwFormatID=-1
dwRefresh=0
@ -162,10 +152,10 @@ dwRefresh=1
[RecentFileList]
dwFileCount=4
[RecentImageList]
File_1=C:\nctr\ctr_firmware_bak\bootrom\build\bootrom\thread\ARM9\bin\ARM9-MG20EMU.thumb\Release\thread9.axf
File_2=C:\twl\twl_firmware_bak\build\norfirm\ds-launcher\ARM9\bin\ARM9-TS\Release\ds_launcher9.axf
File_3=c:\twl\twl_firmware_bak\bootrom\build\bootrom\ts\ARM9\bin\ARM9-BB.thumb\Release\brom9_ts.axf
File_4=C:\twl\twl_wrapsdk_bak\build\tests\os\alarm-1\bin\ARM9-BB\Release\alerm.axf
File_1=C:\nctr\ctr_firmware\bootrom\build\bootrom\thread\thread9.axf
File_2=C:\nctr\ctr_firmware_bak\bootrom\build\bootrom\thread\thread9.axf
File_3=C:\twl\twl_firmware_bak\build\norfirm\ds-launcher\ARM9\bin\ARM9-TS\Release\ds_launcher9.axf
File_4=c:\twl\twl_firmware_bak\bootrom\build\bootrom\ts\ARM9\bin\ARM9-BB.thumb\Release\brom9_ts.axf
dwFileCount=4
[RecentSymbolsList]
File_1=C:\IrisSubp\IrisSubpMon\IrisSubpMon_Data\ThumbRelease\IrisSubpMon.axf
@ -175,7 +165,7 @@ dwMode=1
dwCommsChannel=0
dwArmSWI=1193046
dwThumbSWI=171
dwSHVector=176
dwSHVector=208
dwDCCSHVector=458752
dwECVector=27
dwTopOfMemory=524288
@ -213,8 +203,8 @@ dwBar#2=0
dwBarID=59423
dwHorz=1
dwFloating=1
dwXPos=1175
dwYPos=425
dwXPos=913
dwYPos=433
dwBars=3
dwBar#0=0
dwBar#1=7
@ -223,8 +213,8 @@ dwBar#2=0
dwBarID=59423
dwHorz=1
dwFloating=1
dwXPos=91
dwYPos=870
dwXPos=66
dwYPos=714
dwBars=3
dwBar#0=0
dwBar#1=2
@ -233,8 +223,8 @@ dwBar#2=0
dwBarID=59423
dwHorz=1
dwFloating=1
dwXPos=714
dwYPos=709
dwXPos=642
dwYPos=627
dwBars=3
dwBar#0=0
dwBar#1=3
@ -243,8 +233,8 @@ dwBar#2=0
dwBarID=59423
dwHorz=1
dwFloating=1
dwXPos=1151
dwYPos=230
dwXPos=967
dwYPos=268
dwBars=3
dwBar#0=0
dwBar#1=4
@ -265,10 +255,10 @@ dwRefresh=1
dwFormatID=-1
dwRefresh=1
[Views]
dwLastView=3
dwLastView=1
[Views\View_0]
UnitName=ARM946E_S_0
ImageName=C:\nctr\ctr_firmware_bak\bootrom\build\bootrom\thread\ARM9\bin\ARM9-MG20EMU.thumb\Release\thread9.axf
ImageName=C:\nctr\ctr_firmware\bootrom\build\bootrom\thread\thread9.axf
dwDisassembly=1
FileName=none
dwMixedView=0
@ -277,28 +267,10 @@ dwShowLineNumbers=1
biWndPlacement=MCAAAAAAAAAAAAAABAAAAAAAPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPAAAAAAAAAAAAAAAAOGCAAAAAFMAAAAAA
[Views\View_1]
UnitName=ARM946E_S_0
ImageName=C:\nctr\ctr_firmware_bak\bootrom\build\bootrom\thread\ARM9\bin\ARM9-MG20EMU.thumb\Release\thread9.axf
ImageName=C:\nctr\ctr_firmware\bootrom\build\bootrom\thread\thread9.axf
dwDisassembly=0
FileName=c:\\nctr\\ctr_firmware_bak\\bootrom\\build\\libraries\\os\\common\\os_system.c
FileName=c:\\nctr\\ctr_firmware\\bootrom\\build\\libraries\\init\\common\\crt0_excp.c
dwMixedView=0
dwShowMargin=1
dwShowLineNumbers=1
biWndPlacement=MCAAAAAAAAAAAAAABAAAAAAAPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPGBAAAAAAGBAAAAAAEICAAAAALNAAAAAA
[Views\View_2]
UnitName=ARM946E_S_0
ImageName=C:\nctr\ctr_firmware_bak\bootrom\build\bootrom\thread\ARM9\bin\ARM9-MG20EMU.thumb\Release\thread9.axf
dwDisassembly=0
FileName=c:\\nctr\\ctr_firmware_bak\\bootrom\\build\\libraries\\init\\common\\crt0_excp.c
dwMixedView=0
dwShowMargin=1
dwShowLineNumbers=1
biWndPlacement=MCAAAAAAAAAAAAAABAAAAAAAPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPMCAAAAAAMCAAAAAAKJCAAAAABPAAAAAA
[Views\View_3]
UnitName=ARM946E_S_0
ImageName=C:\nctr\ctr_firmware_bak\bootrom\build\bootrom\thread\ARM9\bin\ARM9-MG20EMU.thumb\Release\thread9.axf
dwDisassembly=0
FileName=c:\\nctr\\ctr_firmware_bak\\bootrom\\build\\libraries\\os\\common\\os_printf.c
dwMixedView=0
dwShowMargin=1
dwShowLineNumbers=1
biWndPlacement=MCAAAAAAAAAAAAAABAAAAAAAPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPCEAAAAAACEAAAAAAALCAAAAAHABAAAAA