5050 < 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 >
5151 < 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 >
5252 < 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 >
5454 < 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 >
5656 < 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 >
5757 < 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 >
5858 < span class ="parenthesis macro "> )</ span > < span class ="semicolon "> ;</ span >
9494 < 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 >
9595 < span class ="parenthesis macro "> )</ span > < span class ="semicolon "> ;</ span >
9696 < 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 >
97119< span class ="brace "> }</ span > </ code > </ pre >
0 commit comments