diff --git a/cores/esp8266/abi.cpp b/cores/esp8266/abi.cpp index ff865d9ca..eeb3be2bb 100644 --- a/cores/esp8266/abi.cpp +++ b/cores/esp8266/abi.cpp @@ -25,7 +25,10 @@ extern "C" { #include "osapi.h" #include "mem.h" } +#include +#include +using __cxxabiv1::__guard; void *operator new(size_t size) { size = ((size + 3) & ~((size_t)0x3)); @@ -56,6 +59,34 @@ void __cxa_deleted_virtual(void) { panic(); } +typedef struct { + uint8_t guard; + uint8_t ps; +} guard_t; + +extern "C" int __cxa_guard_acquire(__guard* pg) +{ + uint8_t ps = xt_rsil(15); + if (reinterpret_cast(pg)->guard) { + xt_wsr_ps(ps); + return 0; + } + reinterpret_cast(pg)->ps = ps; + return 1; +} + +extern "C" void __cxa_guard_release(__guard* pg) +{ + reinterpret_cast(pg)->guard = 1; + xt_wsr_ps(reinterpret_cast(pg)->ps); +} + +extern "C" void __cxa_guard_abort(__guard* pg) +{ + xt_wsr_ps(reinterpret_cast(pg)->ps); +} + + namespace std { void __throw_bad_function_call() { panic();