aboutsummaryrefslogtreecommitdiff
path: root/ports/esp8266/modesp.c
diff options
context:
space:
mode:
authorDamien George2019-10-06 23:29:40 +1100
committerDamien George2019-12-12 20:15:28 +1100
commitb47e155bd07e5765b804c404411825b15378c0b6 (patch)
tree48e7c57050d5164e5482c5d9b1b2c2e921729031 /ports/esp8266/modesp.c
parentb310930dba3a35dbe4d790f461caf27d78b4c7b9 (diff)
py/persistentcode: Add ability to relocate loaded native code.
Implements text, rodata and bss generalised relocations, as well as generic qstr-object linking. This allows importing dynamic native modules on all supported architectures in a unified way.
Diffstat (limited to 'ports/esp8266/modesp.c')
-rw-r--r--ports/esp8266/modesp.c12
1 files changed, 10 insertions, 2 deletions
diff --git a/ports/esp8266/modesp.c b/ports/esp8266/modesp.c
index 2aeb3d690..a3cc2eca7 100644
--- a/ports/esp8266/modesp.c
+++ b/ports/esp8266/modesp.c
@@ -28,6 +28,7 @@
#include "py/gc.h"
#include "py/runtime.h"
+#include "py/persistentcode.h"
#include "py/mperrno.h"
#include "py/mphal.h"
#include "drivers/dht/dht.h"
@@ -282,7 +283,7 @@ void esp_native_code_init(void) {
esp_native_code_erased = 0;
}
-void *esp_native_code_commit(void *buf, size_t len) {
+void *esp_native_code_commit(void *buf, size_t len, void *reloc) {
//printf("COMMIT(buf=%p, len=%u, start=%08x, cur=%08x, end=%08x, erased=%08x)\n", buf, len, esp_native_code_start, esp_native_code_cur, esp_native_code_end, esp_native_code_erased);
len = (len + 3) & ~3;
@@ -294,6 +295,14 @@ void *esp_native_code_commit(void *buf, size_t len) {
void *dest;
if (esp_native_code_location == ESP_NATIVE_CODE_IRAM1) {
dest = (void*)esp_native_code_cur;
+ } else {
+ dest = (void*)(FLASH_START + esp_native_code_cur);
+ }
+ if (reloc) {
+ mp_native_relocate(reloc, buf, (uintptr_t)dest);
+ }
+
+ if (esp_native_code_location == ESP_NATIVE_CODE_IRAM1) {
memcpy(dest, buf, len);
} else {
SpiFlashOpResult res;
@@ -313,7 +322,6 @@ void *esp_native_code_commit(void *buf, size_t len) {
if (res != SPI_FLASH_RESULT_OK) {
mp_raise_OSError(res == SPI_FLASH_RESULT_TIMEOUT ? MP_ETIMEDOUT : MP_EIO);
}
- dest = (void*)(FLASH_START + esp_native_code_cur);
}
esp_native_code_cur += len;