Skip to content

Commit ed59c3b

Browse files
committed
Initial windows-arm (32T) support. Untested.
1 parent d4c1215 commit ed59c3b

File tree

8 files changed

+172
-0
lines changed

8 files changed

+172
-0
lines changed

lib/win_arm/stackman.lib

2.93 KB
Binary file not shown.

src/platforms/platform.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,10 @@
3737
#include "switch_x64_msvc.h" /* MS Visual Studio on X64 */
3838
#define _STACKMAN_PLATFORM x64_msvc
3939
#define _STACKMAN_ABI win_x64
40+
#elif defined(_M_ARM)
41+
#include "switch_arm_msvc.h" /* MS Visual Studio on ARM */
42+
#define _STACKMAN_PLATFORM arm_msvc
43+
#define _STACKMAN_ABI win_arm
4044
#endif
4145

4246

src/platforms/switch_arm_msvc.asm

Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
2+
3+
; this code is adopted from the switch_arm_gcc.S
4+
; which again was generated from switch_arm_gcc.h
5+
6+
THUMB
7+
8+
EXPORT |stackman_switch|
9+
ALIGN
10+
|stackman_switch| PROC
11+
push {r4 - r10, fp, lr} ;9 x 4bytes
12+
add fp, sp, #28 ; (4x7) fp must point to the previous fp on the stack
13+
14+
; also push floating point registers and fpscr (status&control register)
15+
vpush {q4-q7}
16+
vmrs r2,fpscr
17+
push {r2} ;5 x 4bytes
18+
; total of 14 words pushed, satisfying 8 byte stack alignment.
19+
20+
; args are r0=callback, r1=context
21+
; shuffle calling arguments into r0, r1 and r2
22+
; for the call to the callback.
23+
mov r3, r0
24+
mov r0, r1 ;context
25+
mov r2, sp ;stack pointer
26+
mov r1, #0 ;operation
27+
mov r5, r0 ;store these a bit
28+
mov r4, r3
29+
blx r3 ;first callback
30+
mov r2, r0 ;store new stackpointer in register, for next cb,
31+
; switch stack pointer, maintaing fp offset
32+
sub r1, sp, r0
33+
mov sp, r0 ;switch stack pointer
34+
sub fp, fp, r1
35+
36+
mov r1, #1 ;operation
37+
mov r0, r5 ;context
38+
blx r4 ;second callback
39+
; pop and return
40+
pop {r2}
41+
vmsr fpscr, r2
42+
vpop {q4, q5, q6, q7}
43+
pop {r4-r9, r10, fp, pc}
44+
ENDP
45+
46+
EXPORT |stackman_call|
47+
ALIGN
48+
|stackman_call| PROC
49+
; args are r0 = callback, r1 = context, r2=stack
50+
push {r4, fp, lr}
51+
add fp, sp, #4 ;fp must always point to the last fp (r11)
52+
mov r3, r0
53+
mov r0, r1 ;context
54+
mov r1, r2 ;stack
55+
; store current sp in nv register
56+
mov r4, sp
57+
mov r2, sp ; new stack
58+
59+
; change stack
60+
mov sp, r1
61+
mov r1, #2 ; callback opcode
62+
blx r3 ; call callback, with context, opcode, new stack
63+
; restore stack (could do: sub sp, fp #12)
64+
mov sp, r4
65+
; return
66+
pop {r4, fp, pc}
67+
ENDP
68+
69+
END

src/platforms/switch_arm_msvc.h

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
/* The actual stack saving function, which just stores the stack,
2+
* this declared in an .asm file
3+
*/
4+
#ifndef STACKMAN_ASSEMBLY_SRC
5+
#define STACKMAN_ASSEMBLY_SRC switch_arm_msvc.asm
6+
#define STACKMAN_HAVE_CALL 1
7+
#define STACKMAN_STACK_ALIGN 8
8+
#endif

vs2019/stackman.sln

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,14 +12,19 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "stackman", "stackman\stackm
1212
EndProject
1313
Global
1414
GlobalSection(SolutionConfigurationPlatforms) = preSolution
15+
Debug|ARM = Debug|ARM
1516
Debug|x64 = Debug|x64
1617
Debug|x86 = Debug|x86
1718
EndGlobalSection
1819
GlobalSection(ProjectConfigurationPlatforms) = postSolution
20+
{CAFDBD3E-9D0D-4E90-BB6D-6C2A19F5EF53}.Debug|ARM.ActiveCfg = Debug|ARM
21+
{CAFDBD3E-9D0D-4E90-BB6D-6C2A19F5EF53}.Debug|ARM.Build.0 = Debug|ARM
1922
{CAFDBD3E-9D0D-4E90-BB6D-6C2A19F5EF53}.Debug|x64.ActiveCfg = Debug|x64
2023
{CAFDBD3E-9D0D-4E90-BB6D-6C2A19F5EF53}.Debug|x64.Build.0 = Debug|x64
2124
{CAFDBD3E-9D0D-4E90-BB6D-6C2A19F5EF53}.Debug|x86.ActiveCfg = Debug|Win32
2225
{CAFDBD3E-9D0D-4E90-BB6D-6C2A19F5EF53}.Debug|x86.Build.0 = Debug|Win32
26+
{BF7D0638-AC4F-4206-B426-66CDDD468281}.Debug|ARM.ActiveCfg = Debug|ARM
27+
{BF7D0638-AC4F-4206-B426-66CDDD468281}.Debug|ARM.Build.0 = Debug|ARM
2328
{BF7D0638-AC4F-4206-B426-66CDDD468281}.Debug|x64.ActiveCfg = Debug|x64
2429
{BF7D0638-AC4F-4206-B426-66CDDD468281}.Debug|x64.Build.0 = Debug|x64
2530
{BF7D0638-AC4F-4206-B426-66CDDD468281}.Debug|x86.ActiveCfg = Debug|Win32

vs2019/stackman/stackman.vcxproj

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,10 @@
11
<?xml version="1.0" encoding="utf-8"?>
22
<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
33
<ItemGroup Label="ProjectConfigurations">
4+
<ProjectConfiguration Include="Debug|ARM">
5+
<Configuration>Debug</Configuration>
6+
<Platform>ARM</Platform>
7+
</ProjectConfiguration>
48
<ProjectConfiguration Include="Debug|Win32">
59
<Configuration>Debug</Configuration>
610
<Platform>Win32</Platform>
@@ -31,8 +35,15 @@
3135
<PlatformToolset>v142</PlatformToolset>
3236
<CharacterSet>Unicode</CharacterSet>
3337
</PropertyGroup>
38+
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|ARM'" Label="Configuration">
39+
<ConfigurationType>StaticLibrary</ConfigurationType>
40+
<UseDebugLibraries>true</UseDebugLibraries>
41+
<PlatformToolset>v142</PlatformToolset>
42+
<CharacterSet>Unicode</CharacterSet>
43+
</PropertyGroup>
3444
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
3545
<ImportGroup Label="ExtensionSettings">
46+
<Import Project="$(VCTargetsPath)\BuildCustomizations\marmasm.props" />
3647
<Import Project="$(VCTargetsPath)\BuildCustomizations\masm.props" />
3748
</ImportGroup>
3849
<ImportGroup Label="Shared">
@@ -43,6 +54,9 @@
4354
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
4455
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
4556
</ImportGroup>
57+
<ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|ARM'" Label="PropertySheets">
58+
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
59+
</ImportGroup>
4660
<PropertyGroup Label="UserMacros" />
4761
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
4862
<LinkIncremental>true</LinkIncremental>
@@ -53,6 +67,10 @@
5367
<LinkIncremental>true</LinkIncremental>
5468
<OutDir>$(SolutionDir)\..\lib\win_x64\</OutDir>
5569
</PropertyGroup>
70+
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|ARM'">
71+
<LinkIncremental>true</LinkIncremental>
72+
<OutDir>$(SolutionDir)\..\lib\win_arm\</OutDir>
73+
</PropertyGroup>
5674
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
5775
<ClCompile>
5876
<WarningLevel>Level3</WarningLevel>
@@ -91,8 +109,28 @@
91109
<AdditionalOptions>/Brepro %(AdditionalOptions)</AdditionalOptions>
92110
</Lib>
93111
</ItemDefinitionGroup>
112+
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|ARM'">
113+
<ClCompile>
114+
<WarningLevel>Level3</WarningLevel>
115+
<SDLCheck>true</SDLCheck>
116+
<PreprocessorDefinitions>_DEBUG;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>
117+
<ConformanceMode>true</ConformanceMode>
118+
<PrecompiledHeader>NotUsing</PrecompiledHeader>
119+
<PrecompiledHeaderFile>pch.h</PrecompiledHeaderFile>
120+
<DebugInformationFormat>OldStyle</DebugInformationFormat>
121+
</ClCompile>
122+
<Link>
123+
<SubSystem>
124+
</SubSystem>
125+
<GenerateDebugInformation>true</GenerateDebugInformation>
126+
</Link>
127+
<Lib>
128+
<AdditionalOptions>/Brepro %(AdditionalOptions)</AdditionalOptions>
129+
</Lib>
130+
</ItemDefinitionGroup>
94131
<ItemGroup>
95132
<ClInclude Include="..\..\src\platforms\platform.h" />
133+
<ClInclude Include="..\..\src\platforms\switch_arm_msvc.h" />
96134
<ClInclude Include="..\..\src\platforms\switch_x64_msvc.h" />
97135
<ClInclude Include="..\..\src\platforms\switch_x86_msvc.h" />
98136
<ClInclude Include="..\..\src\stackman.h" />
@@ -103,23 +141,32 @@
103141
<ClCompile Include="..\..\src\stackman.c" />
104142
<ClCompile Include="template.c">
105143
<AssemblerOutput Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">AssemblyCode</AssemblerOutput>
144+
<AssemblerOutput Condition="'$(Configuration)|$(Platform)'=='Debug|ARM'">AssemblyCode</AssemblerOutput>
106145
<SupportJustMyCode Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">false</SupportJustMyCode>
146+
<SupportJustMyCode Condition="'$(Configuration)|$(Platform)'=='Debug|ARM'">false</SupportJustMyCode>
107147
<BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">Default</BasicRuntimeChecks>
148+
<BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug|ARM'">Default</BasicRuntimeChecks>
108149
<OmitFramePointers Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">false</OmitFramePointers>
150+
<OmitFramePointers Condition="'$(Configuration)|$(Platform)'=='Debug|ARM'">false</OmitFramePointers>
109151
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">true</ExcludedFromBuild>
152+
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|ARM'">true</ExcludedFromBuild>
110153
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</ExcludedFromBuild>
111154
</ClCompile>
112155
</ItemGroup>
113156
<ItemGroup>
157+
<MARMASM Include="..\..\src\platforms\switch_arm_msvc.asm" />
114158
<MASM Include="..\..\src\platforms\switch_x64_msvc.asm">
115159
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</ExcludedFromBuild>
160+
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|ARM'">true</ExcludedFromBuild>
116161
</MASM>
117162
<MASM Include="..\..\src\platforms\switch_x86_msvc.asm">
118163
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">true</ExcludedFromBuild>
164+
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|ARM'">true</ExcludedFromBuild>
119165
</MASM>
120166
</ItemGroup>
121167
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
122168
<ImportGroup Label="ExtensionTargets">
169+
<Import Project="$(VCTargetsPath)\BuildCustomizations\marmasm.targets" />
123170
<Import Project="$(VCTargetsPath)\BuildCustomizations\masm.targets" />
124171
</ImportGroup>
125172
</Project>

vs2019/stackman/stackman.vcxproj.filters

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,9 @@
3333
<ClInclude Include="..\..\src\stackman_switch.h">
3434
<Filter>Header Files</Filter>
3535
</ClInclude>
36+
<ClInclude Include="..\..\src\platforms\switch_arm_msvc.h">
37+
<Filter>Header Files</Filter>
38+
</ClInclude>
3639
</ItemGroup>
3740
<ItemGroup>
3841
<ClCompile Include="..\..\src\stackman.c">
@@ -50,4 +53,9 @@
5053
<Filter>Source Files</Filter>
5154
</MASM>
5255
</ItemGroup>
56+
<ItemGroup>
57+
<MARMASM Include="..\..\src\platforms\switch_arm_msvc.asm">
58+
<Filter>Source Files</Filter>
59+
</MARMASM>
60+
</ItemGroup>
5361
</Project>

vs2019/test/test.vcxproj

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,10 @@
11
<?xml version="1.0" encoding="utf-8"?>
22
<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
33
<ItemGroup Label="ProjectConfigurations">
4+
<ProjectConfiguration Include="Debug|ARM">
5+
<Configuration>Debug</Configuration>
6+
<Platform>ARM</Platform>
7+
</ProjectConfiguration>
48
<ProjectConfiguration Include="Debug|Win32">
59
<Configuration>Debug</Configuration>
610
<Platform>Win32</Platform>
@@ -30,6 +34,12 @@
3034
<PlatformToolset>v142</PlatformToolset>
3135
<CharacterSet>Unicode</CharacterSet>
3236
</PropertyGroup>
37+
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|ARM'" Label="Configuration">
38+
<ConfigurationType>Application</ConfigurationType>
39+
<UseDebugLibraries>true</UseDebugLibraries>
40+
<PlatformToolset>v142</PlatformToolset>
41+
<CharacterSet>Unicode</CharacterSet>
42+
</PropertyGroup>
3343
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
3444
<ImportGroup Label="ExtensionSettings">
3545
</ImportGroup>
@@ -41,6 +51,9 @@
4151
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
4252
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
4353
</ImportGroup>
54+
<ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|ARM'" Label="PropertySheets">
55+
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
56+
</ImportGroup>
4457
<PropertyGroup Label="UserMacros" />
4558
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
4659
<LinkIncremental>true</LinkIncremental>
@@ -50,6 +63,9 @@
5063
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
5164
<LinkIncremental>true</LinkIncremental>
5265
</PropertyGroup>
66+
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|ARM'">
67+
<LinkIncremental>true</LinkIncremental>
68+
</PropertyGroup>
5369
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
5470
<ClCompile>
5571
<WarningLevel>Level3</WarningLevel>
@@ -81,6 +97,21 @@
8197
<AdditionalLibraryDirectories>..\..\lib\win_x64;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
8298
</Link>
8399
</ItemDefinitionGroup>
100+
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|ARM'">
101+
<ClCompile>
102+
<WarningLevel>Level3</WarningLevel>
103+
<SDLCheck>true</SDLCheck>
104+
<PreprocessorDefinitions>_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
105+
<ConformanceMode>true</ConformanceMode>
106+
<AdditionalIncludeDirectories>..\..\src</AdditionalIncludeDirectories>
107+
</ClCompile>
108+
<Link>
109+
<SubSystem>Console</SubSystem>
110+
<GenerateDebugInformation>true</GenerateDebugInformation>
111+
<AdditionalDependencies>stackman.lib;%(AdditionalDependencies)</AdditionalDependencies>
112+
<AdditionalLibraryDirectories>..\..\lib\win_arm;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
113+
</Link>
114+
</ItemDefinitionGroup>
84115
<ItemGroup>
85116
<ClCompile Include="..\..\tests\test.c" />
86117
</ItemGroup>

0 commit comments

Comments
 (0)