50
50
< span class ="keyword "> let</ span > < span class ="variable declaration "> foo</ span > < span class ="operator "> =</ span > < span class ="numeric_literal "> 1</ span > < span class ="semicolon "> ;</ span >
51
51
< span class ="keyword "> let</ span > < span class ="keyword "> mut</ span > < span class ="variable declaration mutable "> o</ span > < span class ="operator "> =</ span > < span class ="numeric_literal "> 0</ span > < span class ="semicolon "> ;</ span >
52
52
< span class ="module crate_root default_library library "> core</ span > < span class ="operator "> ::</ span > < span class ="module default_library library "> arch</ span > < span class ="operator "> ::</ span > < span class ="macro default_library library unsafe "> asm</ span > < span class ="macro_bang "> !</ span > < span class ="parenthesis macro "> (</ span >
53
- < span class ="string_literal macro "> "%input = </ span > < span class =" variable " > O </ span > < span class =" string_literal macro " > pLoad _ {</ span > < span class ="variable "> 0</ span > < span class ="string_literal macro "> }"</ span > < span class ="comma macro "> ,</ span >
53
+ < span class ="string_literal macro "> "%input = OpLoad _ {</ span > < span class ="variable "> 0</ span > < span class ="string_literal macro "> }"</ span > < span class ="comma macro "> ,</ span >
54
54
< span class ="macro default_library library macro "> concat</ span > < span class ="macro_bang macro "> !</ span > < span class ="parenthesis macro "> (</ span > < span class ="string_literal macro "> "%result = "</ span > < span class ="comma macro "> ,</ span > < span class ="string_literal macro "> "bar"</ span > < span class ="comma macro "> ,</ span > < span class ="string_literal macro "> " _ %input"</ span > < span class ="parenthesis macro "> )</ span > < span class ="comma macro "> ,</ span >
55
- < span class ="string_literal macro "> "OpStore {</ span > < span class ="variable "> 1</ span > < span class ="string_literal macro "> } %result</ span > < span class =" variable " > "</ span > < span class ="comma macro "> ,</ span >
55
+ < span class ="string_literal macro "> "OpStore {</ span > < span class ="variable "> 1</ span > < span class ="string_literal macro "> } %result"</ span > < span class ="comma macro "> ,</ span >
56
56
< span class ="keyword control macro "> in</ span > < span class ="parenthesis macro "> (</ span > < span class ="reg library macro "> reg</ span > < span class ="parenthesis macro "> )</ span > < span class ="operator macro "> &</ span > < span class ="variable macro "> foo</ span > < span class ="comma macro "> ,</ span >
57
57
< span class ="keyword control macro "> in</ span > < span class ="parenthesis macro "> (</ span > < span class ="reg library macro "> reg</ span > < span class ="parenthesis macro "> )</ span > < span class ="operator macro "> &</ span > < span class ="keyword macro "> mut</ span > < span class ="variable macro mutable "> o</ span > < span class ="comma macro "> ,</ span >
58
58
< span class ="parenthesis macro "> )</ span > < span class ="semicolon "> ;</ span >
94
94
< span class ="keyword macro "> options</ span > < span class ="parenthesis macro "> (</ span > < span class ="keyword macro "> noreturn</ span > < span class ="parenthesis macro "> )</ span > < span class ="comma macro "> ,</ span >
95
95
< span class ="parenthesis macro "> )</ span > < span class ="semicolon "> ;</ span >
96
96
< span class ="brace "> }</ span >
97
+ < span class ="brace "> }</ span >
98
+ < span class ="comment "> // taken from https://github.com/rust-embedded/cortex-m/blob/47921b51f8b960344fcfa1255a50a0d19efcde6d/cortex-m/src/asm.rs#L254-L274</ span >
99
+ < span class ="attribute_bracket attribute "> #</ span > < span class ="attribute_bracket attribute "> [</ span > < span class ="builtin_attr attribute "> inline</ span > < span class ="attribute_bracket attribute "> ]</ span >
100
+ < span class ="keyword "> pub</ span > < span class ="keyword unsafe "> unsafe</ span > < span class ="keyword "> fn</ span > < span class ="function declaration public unsafe "> bootstrap</ span > < span class ="parenthesis "> (</ span > < span class ="value_param declaration "> msp</ span > < span class ="colon "> :</ span > < span class ="keyword "> *</ span > < span class ="keyword "> const</ span > < span class ="builtin_type "> u32</ span > < span class ="comma "> ,</ span > < span class ="value_param declaration "> rv</ span > < span class ="colon "> :</ span > < span class ="keyword "> *</ span > < span class ="keyword "> const</ span > < span class ="builtin_type "> u32</ span > < span class ="parenthesis "> )</ span > < span class ="operator "> -></ span > < span class ="builtin_type "> !</ span > < span class ="brace "> {</ span >
101
+ < span class ="comment "> // Ensure thumb mode is set.</ span >
102
+ < span class ="keyword "> let</ span > < span class ="variable declaration "> rv</ span > < span class ="operator "> =</ span > < span class ="parenthesis "> (</ span > < span class ="value_param "> rv</ span > < span class ="keyword "> as</ span > < span class ="builtin_type "> u32</ span > < span class ="parenthesis "> )</ span > < span class ="bitwise "> |</ span > < span class ="numeric_literal "> 1</ span > < span class ="semicolon "> ;</ span >
103
+ < span class ="keyword "> let</ span > < span class ="variable declaration "> msp</ span > < span class ="operator "> =</ span > < span class ="value_param "> msp</ span > < span class ="keyword "> as</ span > < span class ="builtin_type "> u32</ span > < span class ="semicolon "> ;</ span >
104
+ < span class ="module crate_root default_library library "> core</ span > < span class ="operator "> ::</ span > < span class ="module default_library library "> arch</ span > < span class ="operator "> ::</ span > < span class ="macro default_library library unsafe "> asm</ span > < span class ="macro_bang "> !</ span > < span class ="parenthesis macro "> (</ span >
105
+ < span class ="string_literal macro "> "mrs {</ span > < span class ="variable "> tmp</ span > < span class ="string_literal macro "> }, CONTROL"</ span > < span class ="comma macro "> ,</ span >
106
+ < span class ="string_literal macro "> "bics {</ span > < span class ="variable "> tmp</ span > < span class ="string_literal macro "> }, {</ span > < span class ="variable "> spsel</ span > < span class ="string_literal macro "> }"</ span > < span class ="comma macro "> ,</ span >
107
+ < span class ="string_literal macro "> "msr CONTROL, {</ span > < span class ="variable "> tmp</ span > < span class ="string_literal macro "> }"</ span > < span class ="comma macro "> ,</ span >
108
+ < span class ="string_literal macro "> "isb"</ span > < span class ="comma macro "> ,</ span >
109
+ < span class ="string_literal macro "> "msr MSP, {</ span > < span class ="variable "> msp</ span > < span class ="string_literal macro "> }"</ span > < span class ="comma macro "> ,</ span >
110
+ < span class ="string_literal macro "> "bx {</ span > < span class ="variable "> rv</ span > < span class ="string_literal macro "> }"</ span > < span class ="comma macro "> ,</ span >
111
+ < span class ="comment macro "> // `out(reg) _` is not permitted in a `noreturn` asm! call,</ span >
112
+ < span class ="comment macro "> // so instead use `in(reg) 0` and don't restore it afterwards.</ span >
113
+ < span class ="variable declaration macro "> tmp</ span > < span class ="operator macro "> =</ span > < span class ="keyword control macro "> in</ span > < span class ="parenthesis macro "> (</ span > < span class ="reg library macro "> reg</ span > < span class ="parenthesis macro "> )</ span > < span class ="numeric_literal macro "> 0</ span > < span class ="comma macro "> ,</ span >
114
+ < span class ="variable declaration macro "> spsel</ span > < span class ="operator macro "> =</ span > < span class ="keyword control macro "> in</ span > < span class ="parenthesis macro "> (</ span > < span class ="reg library macro "> reg</ span > < span class ="parenthesis macro "> )</ span > < span class ="numeric_literal macro "> 2</ span > < span class ="comma macro "> ,</ span >
115
+ < span class ="variable declaration macro "> msp</ span > < span class ="operator macro "> =</ span > < span class ="keyword control macro "> in</ span > < span class ="parenthesis macro "> (</ span > < span class ="reg library macro "> reg</ span > < span class ="parenthesis macro "> )</ span > < span class ="variable macro "> msp</ span > < span class ="comma macro "> ,</ span >
116
+ < span class ="variable declaration macro "> rv</ span > < span class ="operator macro "> =</ span > < span class ="keyword control macro "> in</ span > < span class ="parenthesis macro "> (</ span > < span class ="reg library macro "> reg</ span > < span class ="parenthesis macro "> )</ span > < span class ="variable macro "> rv</ span > < span class ="comma macro "> ,</ span >
117
+ < span class ="keyword macro "> options</ span > < span class ="parenthesis macro "> (</ span > < span class ="keyword macro "> noreturn</ span > < span class ="comma macro "> ,</ span > < span class ="keyword macro "> nomem</ span > < span class ="comma macro "> ,</ span > < span class ="keyword macro "> nostack</ span > < span class ="parenthesis macro "> )</ span > < span class ="comma macro "> ,</ span >
118
+ < span class ="parenthesis macro "> )</ span > < span class ="semicolon "> ;</ span >
97
119
< span class ="brace "> }</ span > </ code > </ pre >
0 commit comments