19#if defined(PICO_RP2350) && !defined(__riscv)
21#define RCP_MASK_TRUE _u(0xa500a500)
22#define RCP_MASK_FALSE _u(0x00c300c3)
23#define RCP_MASK_INTXOR _u(0x96009600)
29#define __rcpinline __force_inline
36#if __ARM_ARCH_8M_MAIN__
37#define rcp_asm pico_default_asm_volatile
38#elif __ARM_ARCH_8M_BASE__
39#define rcp_asm(...) ({pico_default_asm_volatile(".cpu cortex-m33\n" __VA_ARGS__); pico_default_asm_volatile(".cpu cortex-m23"); })
41#define rcp_asm(...) ({pico_default_asm_volatile(".cpu cortex-m33\n" __VA_ARGS__); pico_default_asm_volatile(".cpu cortex-m0plus"); })
43#error unknown ARM architecture
56static __rcpinline
void rcp_salt_core0(uint64_t salt) {
58 "mcrr p7, #8, %0, %1, c0\n"
59 : :
"r" (salt & 0xffffffffu),
"r" (salt >> 32)
63static __rcpinline
void rcp_salt_core0_nodelay(uint64_t salt) {
65 "mcrr2 p7, #8, %0, %1, c0\n"
66 : :
"r" (salt & 0xffffffffu),
"r" (salt >> 32)
71static __rcpinline
void rcp_salt_core1(uint64_t salt) {
73 "mcrr p7, #8, %0, %1, c1\n"
74 : :
"r" (salt & 0xffffffffu),
"r" (salt >> 32)
78static __rcpinline
void rcp_salt_core1_nodelay(uint64_t salt) {
80 "mcrr2 p7, #8, %0, %1, c1\n"
81 : :
"r" (salt & 0xffffffffu),
"r" (salt >> 32)
86#define rcp_canary_get(tag) ({ \
87 uint32_t __canary_u32; \
89 "mrc p7, #0, %0, c%c1, c%c2, #1\n" \
90 : "=r" (__canary_u32) \
91 : "i" ((tag >> 4) & 0xf), "i" (tag & 0xf) \
96#define rcp_canary_get_nodelay(tag) ({ \
97 uint32_t __canary_u32; \
99 "mrc2 p7, #0, %0, c%c1, c%c2, #1\n" \
100 : "=r" (__canary_u32) \
101 : "i" (((tag) >> 4) & 0xf), "i" ((tag) & 0xf) \
107#define rcp_canary_check(tag, canary) ({ \
109 "mcr p7, #0, %0, c%c1, c%c2, #1\n" \
111 "i" (((tag) >> 4) & 0xf), "i" ((tag) & 0xf) \
115#define rcp_canary_check_nodelay(tag, canary) ({ \
117 "mcr2 p7, #0, %0, c%c1, c%c2, #1\n" \
119 "i" (((tag) >> 4) & 0xf), "i" ((tag) & 0xf) \
127static __rcpinline uint32_t rcp_canary_status(
void) {
129 rcp_asm (
"mrc p7, #1, %0, c0, c0, #0\n" :
"=r" (ret));
133static __rcpinline uint32_t rcp_canary_status_nodelay(
void) {
135 rcp_asm (
"mrc2 p7, #1, %0, c0, c0, #0\n" :
"=r" (ret));
143static __rcpinline
void rcp_bvalid(uint32_t b) {
144 rcp_asm (
"mcr p7, #1, %0, c0, c0, #0\n" : :
"r" (b));
147static __rcpinline
void rcp_bvalid_nodelay(uint32_t b) {
148 rcp_asm (
"mcr2 p7, #1, %0, c0, c0, #0\n" : :
"r" (b));
152static __rcpinline
void rcp_btrue(uint32_t b) {
153 rcp_asm (
"mcr p7, #2, %0, c0, c0, #0\n" : :
"r" (b));
156static __rcpinline
void rcp_btrue_nodelay(uint32_t b) {
157 rcp_asm (
"mcr2 p7, #2, %0, c0, c0, #0\n" : :
"r" (b));
161static __rcpinline
void rcp_bfalse(uint32_t b) {
162 rcp_asm (
"mcr p7, #3, %0, c0, c0, #1\n" : :
"r" (b));
165static __rcpinline
void rcp_bfalse_nodelay(uint32_t b) {
166 rcp_asm (
"mcr2 p7, #3, %0, c0, c0, #1\n" : :
"r" (b));
170static __rcpinline
void rcp_b2valid(uint32_t b0, uint32_t b1) {
171 rcp_asm (
"mcrr p7, #0, %0, %1, c8\n" : :
"r" (b0),
"r" (b1));
174static __rcpinline
void rcp_b2valid_nodelay(uint32_t b0, uint32_t b1) {
175 rcp_asm (
"mcrr2 p7, #0, %0, %1, c8\n" : :
"r" (b0),
"r" (b1));
179static __rcpinline
void rcp_b2and(uint32_t b0, uint32_t b1) {
180 rcp_asm (
"mcrr p7, #1, %0, %1, c0\n" : :
"r" (b0),
"r" (b1));
183static __rcpinline
void rcp_b2and_nodelay(uint32_t b0, uint32_t b1) {
184 rcp_asm (
"mcrr2 p7, #1, %0, %1, c0\n" : :
"r" (b0),
"r" (b1));
188static __rcpinline
void rcp_b2or(uint32_t b0, uint32_t b1) {
189 rcp_asm (
"mcrr p7, #2, %0, %1, c0\n" : :
"r" (b0),
"r" (b1));
192static __rcpinline
void rcp_b2or_nodelay(uint32_t b0, uint32_t b1) {
193 rcp_asm (
"mcrr2 p7, #2, %0, %1, c0\n" : :
"r" (b0),
"r" (b1));
197static __rcpinline
void rcp_bxorvalid(uint32_t b, uint32_t mask) {
198 rcp_asm (
"mcrr p7, #3, %0, %1, c8\n" : :
"r" (b),
"r" (mask));
201static __rcpinline
void rcp_bxorvalid_nodelay(uint32_t b, uint32_t mask) {
202 rcp_asm (
"mcrr2 p7, #3, %0, %1, c8\n" : :
"r" (b),
"r" (mask));
206static __rcpinline
void rcp_bxortrue(uint32_t b, uint32_t mask) {
207 rcp_asm (
"mcrr p7, #4, %0, %1, c0\n" : :
"r" (b),
"r" (mask));
210static __rcpinline
void rcp_bxortrue_nodelay(uint32_t b, uint32_t mask) {
211 rcp_asm (
"mcrr2 p7, #4, %0, %1, c0\n" : :
"r" (b),
"r" (mask));
215static __rcpinline
void rcp_bxorfalse(uint32_t b, uint32_t mask) {
216 rcp_asm (
"mcrr p7, #5, %0, %1, c8\n" : :
"r" (b),
"r" (mask));
219static __rcpinline
void rcp_bxorfalse_nodelay(uint32_t b, uint32_t mask) {
220 rcp_asm (
"mcrr2 p7, #5, %0, %1, c8\n" : :
"r" (b),
"r" (mask));
227static __rcpinline
void rcp_ivalid(uint32_t x, uint32_t parity) {
228 rcp_asm (
"mcrr p7, #6, %0, %1, c8\n" : :
"r" (x),
"r" (parity));
231static __rcpinline
void rcp_ivalid_nodelay(uint32_t x, uint32_t parity) {
232 rcp_asm (
"mcrr2 p7, #6, %0, %1, c8\n" : :
"r" (x),
"r" (parity));
236static __rcpinline
void rcp_iequal(uint32_t x, uint32_t y) {
237 rcp_asm (
"mcrr p7, #7, %0, %1, c0\n" : :
"r" (x),
"r" (y));
240static __rcpinline
void rcp_iequal_nodelay(uint32_t x, uint32_t y) {
241 rcp_asm (
"mcrr2 p7, #7, %0, %1, c0\n" : :
"r" (x),
"r" (y));
249static __rcpinline uint8_t rcp_random_byte(
void) {
251 rcp_asm (
"mrc2 p7, #2, %0, c0, c0, #0\n" :
"=r" (ret));
258static __rcpinline uint8_t rcp_random_byte_nodelay(
void) {
260 rcp_asm (
"mrc2 p7, #2, %0, c0, c0, #0\n" :
"=r" (ret));
269#define rcp_count_set(cnt) rcp_asm ( \
270 "mcr p7, #4, r0, c%c0, c%c1, #0\n" \
271 : : "i"(((cnt) >> 4) & 0xf), "i"((cnt) & 0xf) \
274#define rcp_count_set_nodelay(cnt) rcp_asm ( \
275 "mcr2 p7, #4, r0, c%c0, c%c1, #0\n" \
276 : : "i"(((cnt) >> 4) & 0xf), "i"((cnt) & 0xf) \
281#define rcp_count_check(cnt) rcp_asm ( \
282 "mcr p7, #5, r0, c%c0, c%c1, #1\n" \
283 : : "i"(((cnt) >> 4) & 0xf), "i"((cnt) & 0xf) \
286#define rcp_count_check_nodelay(cnt) rcp_asm ( \
287 "mcr2 p7, #5, r0, c%c0, c%c1, #1\n" \
288 : : "i"(((cnt) >> 4) & 0xf), "i"((cnt) & 0xf) \
296static __rcpinline __attribute__((noreturn))
void rcp_panic(
void) {
297 rcp_asm(
"cdp p7, #0, c0, c0, c0, #1");
298 __builtin_unreachable();
311 mcr p7, #1, \r , c0, c0, #0
314.macro rcp_bvalid_nodelay r
315 mcr2 p7, #1, \r , c0, c0, #0
320 mcr p7, #2, \r , c0, c0, #0
323.macro rcp_btrue_nodelay r
324 mcr2 p7, #2, \r , c0, c0, #0
329 mcr p7, #3, \r , c0, c0, #1
332.macro rcp_bfalse_nodelay r
333 mcr2 p7, #3, \r , c0, c0, #1
337.macro rcp_b2valid b0, b1
338 mcrr p7, #0, \b0 , \b1 , c8
341.macro rcp_b2valid_nodelay b0, b1
342 mcrr2 p7, #0, \b0 , \b1 , c8
346.macro rcp_b2and b0, b1
347 mcrr p7, #1, \b0 , \b1 , c0
350.macro rcp_b2and_nodelay b0, b1
351 mcrr2 p7, #1, \b0 , \b1 , c0
355.macro rcp_b2or b0, b1
356 mcrr p7, #2, \b0 , \b1 , c0
359.macro rcp_b2or_nodelay b0, b1
360 mcrr2 p7, #2, \b0 , \b1 , c0
364.macro rcp_bxorvalid b, mask
365 mcrr p7, #3, \b , \mask , c8
368.macro rcp_bxorvalid_nodelay b, mask
369 mcrr2 p7, #3, \b , \mask , c8
373.macro rcp_bxortrue b, mask
374 mcrr p7, #4, \b , \mask , c0
377.macro rcp_bxortrue_nodelay b, mask
378 mcrr2 p7, #4, \b , \mask , c0
382.macro rcp_bxorfalse b, mask
383 mcrr p7, #5, \b , \mask , c8
386.macro rcp_bxorfalse_nodelay b, mask
387 mcrr2 p7, #5, \b , \mask , c8
391.macro rcp_ivalid x, parity
392 mcrr p7, #6, \x , \parity , c8
395.macro rcp_ivalid_nodelay x, parity
396 mcrr2 p7, #6, \x , \parity , c8
400.macro rcp_iequal x, y
401 mcrr p7, #7, \x , \y , c0
404.macro rcp_iequal_nodelay x, y
405 mcrr2 p7, #7, \x , \y , c0
409.macro rcp_switch_u8_to_ch_cl macro_name, x, args:vararg
411\macro_name c0, c0, \args
413\macro_name c0, c1, \args
415\macro_name c0, c2, \args
417\macro_name c0, c3, \args
419\macro_name c0, c4, \args
421\macro_name c0, c5, \args
423\macro_name c0, c6, \args
425\macro_name c0, c7, \args
427\macro_name c0, c8, \args
429\macro_name c0, c9, \args
431\macro_name c0, c10, \args
433\macro_name c0, c11, \args
435\macro_name c0, c12, \args
437\macro_name c0, c13, \args
439\macro_name c0, c14, \args
441\macro_name c0, c15, \args
443\macro_name c1, c0, \args
445\macro_name c1, c1, \args
447\macro_name c1, c2, \args
449\macro_name c1, c3, \args
451\macro_name c1, c4, \args
453\macro_name c1, c5, \args
455\macro_name c1, c6, \args
457\macro_name c1, c7, \args
459\macro_name c1, c8, \args
461\macro_name c1, c9, \args
463\macro_name c1, c10, \args
465\macro_name c1, c11, \args
467\macro_name c1, c12, \args
469\macro_name c1, c13, \args
471\macro_name c1, c14, \args
473\macro_name c1, c15, \args
475\macro_name c2, c0, \args
477\macro_name c2, c1, \args
479\macro_name c2, c2, \args
481\macro_name c2, c3, \args
483\macro_name c2, c4, \args
485\macro_name c2, c5, \args
487\macro_name c2, c6, \args
489\macro_name c2, c7, \args
491\macro_name c2, c8, \args
493\macro_name c2, c9, \args
495\macro_name c2, c10, \args
497\macro_name c2, c11, \args
499\macro_name c2, c12, \args
501\macro_name c2, c13, \args
503\macro_name c2, c14, \args
505\macro_name c2, c15, \args
507\macro_name c3, c0, \args
509\macro_name c3, c1, \args
511\macro_name c3, c2, \args
513\macro_name c3, c3, \args
515\macro_name c3, c4, \args
517\macro_name c3, c5, \args
519\macro_name c3, c6, \args
521\macro_name c3, c7, \args
523\macro_name c3, c8, \args
525\macro_name c3, c9, \args
527\macro_name c3, c10, \args
529\macro_name c3, c11, \args
531\macro_name c3, c12, \args
533\macro_name c3, c13, \args
535\macro_name c3, c14, \args
537\macro_name c3, c15, \args
539\macro_name c4, c0, \args
541\macro_name c4, c1, \args
543\macro_name c4, c2, \args
545\macro_name c4, c3, \args
547\macro_name c4, c4, \args
549\macro_name c4, c5, \args
551\macro_name c4, c6, \args
553\macro_name c4, c7, \args
555\macro_name c4, c8, \args
557\macro_name c4, c9, \args
559\macro_name c4, c10, \args
561\macro_name c4, c11, \args
563\macro_name c4, c12, \args
565\macro_name c4, c13, \args
567\macro_name c4, c14, \args
569\macro_name c4, c15, \args
571\macro_name c5, c0, \args
573\macro_name c5, c1, \args
575\macro_name c5, c2, \args
577\macro_name c5, c3, \args
579\macro_name c5, c4, \args
581\macro_name c5, c5, \args
583\macro_name c5, c6, \args
585\macro_name c5, c7, \args
587\macro_name c5, c8, \args
589\macro_name c5, c9, \args
591\macro_name c5, c10, \args
593\macro_name c5, c11, \args
595\macro_name c5, c12, \args
597\macro_name c5, c13, \args
599\macro_name c5, c14, \args
601\macro_name c5, c15, \args
603\macro_name c6, c0, \args
605\macro_name c6, c1, \args
607\macro_name c6, c2, \args
609\macro_name c6, c3, \args
611\macro_name c6, c4, \args
613\macro_name c6, c5, \args
615\macro_name c6, c6, \args
617\macro_name c6, c7, \args
619\macro_name c6, c8, \args
621\macro_name c6, c9, \args
623\macro_name c6, c10, \args
625\macro_name c6, c11, \args
627\macro_name c6, c12, \args
629\macro_name c6, c13, \args
631\macro_name c6, c14, \args
633\macro_name c6, c15, \args
635\macro_name c7, c0, \args
637\macro_name c7, c1, \args
639\macro_name c7, c2, \args
641\macro_name c7, c3, \args
643\macro_name c7, c4, \args
645\macro_name c7, c5, \args
647\macro_name c7, c6, \args
649\macro_name c7, c7, \args
651\macro_name c7, c8, \args
653\macro_name c7, c9, \args
655\macro_name c7, c10, \args
657\macro_name c7, c11, \args
659\macro_name c7, c12, \args
661\macro_name c7, c13, \args
663\macro_name c7, c14, \args
665\macro_name c7, c15, \args
667\macro_name c8, c0, \args
669\macro_name c8, c1, \args
671\macro_name c8, c2, \args
673\macro_name c8, c3, \args
675\macro_name c8, c4, \args
677\macro_name c8, c5, \args
679\macro_name c8, c6, \args
681\macro_name c8, c7, \args
683\macro_name c8, c8, \args
685\macro_name c8, c9, \args
687\macro_name c8, c10, \args
689\macro_name c8, c11, \args
691\macro_name c8, c12, \args
693\macro_name c8, c13, \args
695\macro_name c8, c14, \args
697\macro_name c8, c15, \args
699\macro_name c9, c0, \args
701\macro_name c9, c1, \args
703\macro_name c9, c2, \args
705\macro_name c9, c3, \args
707\macro_name c9, c4, \args
709\macro_name c9, c5, \args
711\macro_name c9, c6, \args
713\macro_name c9, c7, \args
715\macro_name c9, c8, \args
717\macro_name c9, c9, \args
719\macro_name c9, c10, \args
721\macro_name c9, c11, \args
723\macro_name c9, c12, \args
725\macro_name c9, c13, \args
727\macro_name c9, c14, \args
729\macro_name c9, c15, \args
731\macro_name c10, c0, \args
733\macro_name c10, c1, \args
735\macro_name c10, c2, \args
737\macro_name c10, c3, \args
739\macro_name c10, c4, \args
741\macro_name c10, c5, \args
743\macro_name c10, c6, \args
745\macro_name c10, c7, \args
747\macro_name c10, c8, \args
749\macro_name c10, c9, \args
751\macro_name c10, c10, \args
753\macro_name c10, c11, \args
755\macro_name c10, c12, \args
757\macro_name c10, c13, \args
759\macro_name c10, c14, \args
761\macro_name c10, c15, \args
763\macro_name c11, c0, \args
765\macro_name c11, c1, \args
767\macro_name c11, c2, \args
769\macro_name c11, c3, \args
771\macro_name c11, c4, \args
773\macro_name c11, c5, \args
775\macro_name c11, c6, \args
777\macro_name c11, c7, \args
779\macro_name c11, c8, \args
781\macro_name c11, c9, \args
783\macro_name c11, c10, \args
785\macro_name c11, c11, \args
787\macro_name c11, c12, \args
789\macro_name c11, c13, \args
791\macro_name c11, c14, \args
793\macro_name c11, c15, \args
795\macro_name c12, c0, \args
797\macro_name c12, c1, \args
799\macro_name c12, c2, \args
801\macro_name c12, c3, \args
803\macro_name c12, c4, \args
805\macro_name c12, c5, \args
807\macro_name c12, c6, \args
809\macro_name c12, c7, \args
811\macro_name c12, c8, \args
813\macro_name c12, c9, \args
815\macro_name c12, c10, \args
817\macro_name c12, c11, \args
819\macro_name c12, c12, \args
821\macro_name c12, c13, \args
823\macro_name c12, c14, \args
825\macro_name c12, c15, \args
827\macro_name c13, c0, \args
829\macro_name c13, c1, \args
831\macro_name c13, c2, \args
833\macro_name c13, c3, \args
835\macro_name c13, c4, \args
837\macro_name c13, c5, \args
839\macro_name c13, c6, \args
841\macro_name c13, c7, \args
843\macro_name c13, c8, \args
845\macro_name c13, c9, \args
847\macro_name c13, c10, \args
849\macro_name c13, c11, \args
851\macro_name c13, c12, \args
853\macro_name c13, c13, \args
855\macro_name c13, c14, \args
857\macro_name c13, c15, \args
859\macro_name c14, c0, \args
861\macro_name c14, c1, \args
863\macro_name c14, c2, \args
865\macro_name c14, c3, \args
867\macro_name c14, c4, \args
869\macro_name c14, c5, \args
871\macro_name c14, c6, \args
873\macro_name c14, c7, \args
875\macro_name c14, c8, \args
877\macro_name c14, c9, \args
879\macro_name c14, c10, \args
881\macro_name c14, c11, \args
883\macro_name c14, c12, \args
885\macro_name c14, c13, \args
887\macro_name c14, c14, \args
889\macro_name c14, c15, \args
891\macro_name c15, c0, \args
893\macro_name c15, c1, \args
895\macro_name c15, c2, \args
897\macro_name c15, c3, \args
899\macro_name c15, c4, \args
901\macro_name c15, c5, \args
903\macro_name c15, c6, \args
905\macro_name c15, c7, \args
907\macro_name c15, c8, \args
909\macro_name c15, c9, \args
911\macro_name c15, c10, \args
913\macro_name c15, c11, \args
915\macro_name c15, c12, \args
917\macro_name c15, c13, \args
919\macro_name c15, c14, \args
921\macro_name c15, c15, \args
923.error
"Value outside of range 0-255"
928.macro rcp_count_set_impl h, l
929mcr p7, #4, r0, \h , \l , #0
931.macro rcp_count_set cnt
932rcp_switch_u8_to_ch_cl rcp_count_set_impl, \cnt
935.macro rcp_count_set_nodelay_impl h, l
936mcr2 p7, #4, r0, \h , \l , #0
938.macro rcp_count_set_nodelay cnt
939rcp_switch_u8_to_ch_cl rcp_count_set_nodelay_impl, \cnt
944.macro rcp_count_check_impl h, l
945 mcr p7, #5, r0, \h, \l, #1
947.macro rcp_count_check cnt
948rcp_switch_u8_to_ch_cl rcp_count_check_impl, \cnt
951.macro rcp_count_check_nodelay_impl h, l
952 mcr2 p7, #5, r0, \h, \l, #1
954.macro rcp_count_check_nodelay cnt
955rcp_switch_u8_to_ch_cl rcp_count_check_nodelay_impl, \cnt
959.macro rcp_canary_get_impl h, l, x
960 mrc p7, #0, \x, \h, \l, #1
963.macro rcp_canary_get x, tag
964rcp_switch_u8_to_ch_cl rcp_canary_get_impl \tag, \x
968.macro rcp_canary_get_nodelay_impl h, l, x
969 mrc2 p7, #0, \x, \h, \l, #1
972.macro rcp_canary_get_nodelay x, tag
973rcp_switch_u8_to_ch_cl rcp_canary_get_nodelay_impl \tag, \x
977.macro rcp_canary_check_impl h, l, x
978 mcr p7, #0, \x, \h, \l, #1
981.macro rcp_canary_check x, tag
982rcp_switch_u8_to_ch_cl rcp_canary_check_impl \tag, \x
985.macro rcp_canary_check_nodelay_impl h, l, x
986 mcr2 p7, #0, \x, \h, \l, #1
989.macro rcp_canary_check_nodelay x, tag
990rcp_switch_u8_to_ch_cl rcp_canary_check_nodelay_impl \tag, \x
994 cdp p7, #0, c0, c0, c0, #1