diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..567609b --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +build/ diff --git a/LICENSE b/LICENSE index 687ee36..797ffcc 100644 --- a/LICENSE +++ b/LICENSE @@ -1,4 +1,4 @@ -Copyright (c) 2013-2017 Cesanta Software Limited +Copyright (c) 2013-2025 Cesanta Software Limited All rights reserved This software is dual-licensed: you can redistribute it and/or modify diff --git a/mjs/Makefile b/Makefile similarity index 55% rename from mjs/Makefile rename to Makefile index dc3620e..d265d7e 100644 --- a/mjs/Makefile +++ b/Makefile @@ -1,22 +1,28 @@ -REPO_ROOT = .. +MAKEFLAGS += --warn-undefined-variables SRCPATH = src -VPATH = $(REPO_ROOT)/common $(REPO_ROOT)/frozen src BUILD_DIR = build +RD ?= docker run -v $(CURDIR):$(CURDIR) --user=$(shell id -u):$(shell id -g) -w $(CURDIR) +DOCKER_GCC ?= $(RD) mgos/gcc +DOCKER_CLANG ?= $(RD) mgos/clang + include $(SRCPATH)/mjs_sources.mk -TOP_SOURCES = $(addprefix $(SRCPATH)/, $(SOURCES)) TOP_HEADERS = $(addprefix $(SRCPATH)/, $(HEADERS)) -TOP_SOURCES_DIRS = $(sort $(dir $(TOP_SOURCES))) -TOP_HEADERS_DIRS = $(sort $(dir $(TOP_HEADERS))) - -MFLAGS += -I. -I$(REPO_ROOT) -Isrc -MFLAGS += -DMJS_MAIN -DMJS_EXPOSE_PRIVATE -DCS_ENABLE_STDIO -DMJS_ENABLE_DEBUG -CFLAGS += -lm -W -Wall -g -CFLAGS += $(MFLAGS) $(CFLAGS_EXTRA) -COMMON_CFLAGS = -DCS_MMAP +TOP_MJS_PUBLIC_HEADERS = $(addprefix $(SRCPATH)/, $(MJS_PUBLIC_HEADERS)) +TOP_MJS_SOURCES = $(addprefix $(SRCPATH)/, $(MJS_SOURCES)) +TOP_COMMON_SOURCES = $(addprefix $(SRCPATH)/, $(COMMON_SOURCES)) + +CFLAGS_EXTRA ?= +MFLAGS += -I. -Isrc -Isrc/frozen +MFLAGS += -DMJS_MAIN -DMJS_EXPOSE_PRIVATE -DCS_ENABLE_STDIO -DMJS_ENABLE_DEBUG -I../frozen +MFLAGS += $(CFLAGS_EXTRA) +CFLAGS += -lm -std=c99 -Wall -Wextra -pedantic -g $(MFLAGS) +COMMON_CFLAGS = -DCS_MMAP -DMJS_MODULE_LINES ASAN_CFLAGS = -fsanitize=address +.PHONY: all test test_full difftest ci-test + VERBOSE ?= ifeq ($(VERBOSE),1) Q := @@ -35,56 +41,57 @@ ifeq ($(UNAME_S),Linux) ASAN_CFLAGS += -fsanitize=leak endif -PROG = $(BUILD_DIR)/mjs - -all: $(PROG) - -TESTUTIL_FILES = $(REPO_ROOT)/common/cs_dirent.c \ - $(REPO_ROOT)/common/cs_time.c \ - $(REPO_ROOT)/common/test_util.c +ifeq ($(UNAME_S),Darwin) + MFLAGS += -D_DARWIN_C_SOURCE +endif -mjs.c: $(TOP_SOURCES) mjs.h Makefile - @printf "AMALGAMATING\tmjs.c\n" - $(Q) (cd .. && tools/amalgam.py \ - --autoinc --exportable-headers -I mjs --prefix MJS \ - --public-header mjs.h --ignore mjs/mjs.h \ - --first mjs/src/license.h,mjs/src/internal.h,common/platform.h,common/platforms/platform_windows.h,common/platforms/platform_unix.h,common/platforms/platform_esp_lwip.h $(TOP_SOURCES)) > $@ +PROG = $(BUILD_DIR)/mjs -mjs.h: $(TOP_HEADERS) $(TOP_SOURCES) Makefile - @printf "AMALGAMATING\tmjs.h\n" - $(Q) (cd .. && tools/amalgam.py \ - --autoinc --exportable-headers -I mjs --prefix MJS \ - --ignore mjs/mjs.h \ - --first mjs/src/license.h,common/platform.h $(filter %_public.h,$(TOP_HEADERS))) > $@ +all: mjs.c mjs_no_common.c $(PROG) + +TESTUTIL_FILES = $(SRCPATH)/common/cs_dirent.c \ + $(SRCPATH)/common/cs_time.c \ + $(SRCPATH)/common/test_main.c \ + $(SRCPATH)/common/test_util.c + +mjs.h: $(TOP_MJS_PUBLIC_HEADERS) Makefile tools/amalgam.py + @printf "AMALGAMATING $@\n" + $(Q) (tools/amalgam.py \ + --autoinc -I src --prefix MJS --strict --license src/mjs_license.h \ + --first common/platform.h $(TOP_MJS_PUBLIC_HEADERS)) > $@ + +mjs.c: $(TOP_COMMON_SOURCES) $(TOP_MJS_SOURCES) mjs.h Makefile + @printf "AMALGAMATING $@\n" + $(Q) (tools/amalgam.py \ + --autoinc -I src -I src/frozen --prefix MJS --license src/mjs_license.h \ + --license src/mjs_license.h --public-header mjs.h --autoinc-ignore mjs_*_public.h \ + --first mjs_common_guard_begin.h,common/platform.h,common/platforms/platform_windows.h,common/platforms/platform_unix.h,common/platforms/platform_esp_lwip.h \ + $(TOP_COMMON_SOURCES) $(TOP_MJS_SOURCES)) > $@ + +mjs_no_common.c: $(TOP_MJS_SOURCES) mjs.h Makefile + @printf "AMALGAMATING $@\n" + $(Q) (tools/amalgam.py \ + --autoinc -I src -I src/frozen --prefix MJS --license src/mjs_license.h \ + --public-header mjs.h --ignore mjs.h,*common/*,*frozen.[ch] \ + --first mjs_common_guard_begin.h,common/platform.h,common/platforms/platform_windows.h,common/platforms/platform_unix.h,common/platforms/platform_esp_lwip.h \ + $(TOP_MJS_SOURCES)) > $@ CFLAGS += $(COMMON_CFLAGS) # NOTE: we compile straight from sources, not from the single amalgamated file, # in order to make sure that all sources include the right headers -$(PROG): $(TOP_SOURCES) $(TOP_HEADERS) $(BUILD_DIR) - $(CLANG) $(CFLAGS) $(CPPFLAGS) $(TOP_SOURCES) -o $(PROG) +$(PROG): $(TOP_MJS_SOURCES) $(TOP_COMMON_SOURCES) $(TOP_HEADERS) $(BUILD_DIR) + $(DOCKER_CLANG) clang $(CFLAGS) $(TOP_MJS_SOURCES) $(TOP_COMMON_SOURCES) -o $(PROG) $(BUILD_DIR): mkdir -p $@ -$(BUILD_DIR)/%.o: %.c $(TOP_HEADERS) +$(BUILD_DIR)/%.o: %.c $(TOP_HEADERS) mjs.h $(CLANG) $(CFLAGS) $(CPPFLAGS) -c -o $@ $< -# On Windows and Mac, run container as root since volume sharing on those OSes -# doesn't play nice with unprivileged user. -# -# On other OSes, run it as the current user. -DOCKER_USER_ARG = -ifneq ($(OS),Windows_NT) -UNAME_S := $(shell uname -s) -ifneq ($(UNAME_S),Darwin) -DOCKER_USER_ARG = --user $$(id -u):$$(id -u) -endif -endif - -COMMON_TEST_FLAGS = -W -Wall -I. -I$(REPO_ROOT) -g3 -O0 $(COMMON_CFLAGS) $< $(TESTUTIL_FILES) -DMJS_MEMORY_STATS +COMMON_TEST_FLAGS = -W -Wall -I. -Isrc -g3 -O0 $(COMMON_CFLAGS) $< $(TESTUTIL_FILES) -DMJS_MEMORY_STATS -include $(REPO_ROOT)/common.mk +#include $(REPO_ROOT)/common.mk # ==== Test Variants ==== # @@ -128,12 +135,14 @@ TEST_VARIANTS = # params: # # 1: binary name component, e.g. "clang_O1_offset_4_whatever_else" -# 2: compiler, like "clang" or "gcc" -# 3: compiler flags +# 2: docker image to run compiler and binary in +# 3: full path to compiler, like "/usr/bin/clang-3.6" or "/usr/bin/gcc" +# 4: compiler flags define compile_test $(BUILD_DIR)/unit_test_$1: tests/unit_test.c mjs.c $(TESTUTIL_FILES) $(BUILD_DIR) - @echo BUILDING $$@ with $2, flags: "'$3'" - $2 $$(COMMON_TEST_FLAGS) $3 -lm -o $$@ + @echo BUILDING $$@ with $2[$3], flags: "'$4'" + $(RD) --entrypoint $3 $2 $$(COMMON_TEST_FLAGS) $4 -ldl -lm -o $$@ + $(RD) --entrypoint ./$$@ $2 TEST_VARIANTS += $(BUILD_DIR)/unit_test_$1 endef @@ -143,7 +152,7 @@ endef # 2: binary name component, typically the same as compiler: "clang" or "gcc" # 3: additional compiler flags define compile_test_with_compiler -$(eval $(call compile_test,$2,$1,$3)) +$(eval $(call compile_test,$3,$1,$2,$4)) endef # params: @@ -151,9 +160,9 @@ endef # 2: binary name component, like "O0" or whatever # 3: additional compiler flags define compile_test_with_opt -$(eval $(call compile_test_with_compiler,$(CLANG),clang_$2,$(ASAN_CFLAGS) $1 $3)) -$(eval $(call compile_test_with_compiler,$(CLANG),clang_32bit_$2,-m32 $1 $3)) -$(eval $(call compile_test_with_compiler,gcc,gcc_$2,$1 $3)) +$(eval $(call compile_test_with_compiler,mgos/clang,/usr/bin/clang-3.6,clang_$2,$(ASAN_CFLAGS) $1 $3)) +$(eval $(call compile_test_with_compiler,mgos/clang,/usr/bin/clang-3.6,clang_32bit_$2,-m32 $1 $3)) +$(eval $(call compile_test_with_compiler,mgos/gcc,/usr/bin/gcc,gcc_$2,$1 $3)) endef # params: @@ -187,37 +196,34 @@ $(eval $(call compile_test_all)) # Run all tests from $(TEST_VARIANTS) test_full: $(TEST_VARIANTS) $(PROG) - for f in $(TEST_VARIANTS); do \ - echo ; echo running $$f; \ - $$f; \ - done +# for f in $(TEST_VARIANTS); do \ +# echo ; echo running $$f; \ +# $$f; \ +# done # Run just a single test (a first one from $(TEST_VARIANTS)) test: $(firstword $(TEST_VARIANTS)) - $< +# $< clean: - rm -rf $(BUILD_DIR) *.obj mjs.c mjs.h - -print_sources: - @echo $(TOP_SOURCES) $(TOP_HEADERS) + rm -rf $(BUILD_DIR) *.obj mjs.c mjs.h _CL_* -print_source_dirs: - @echo $(TOP_SOURCES_DIRS) $(TOP_HEADERS_DIRS) +difftest: + @TMP=`mktemp -t checkout-diff.XXXXXX`; \ + git diff >$$TMP ; \ + if [ -s "$$TMP" ]; then echo found diffs in checkout:; git status -s; head -n 50 "$$TMP"; exit 1; fi; \ + rm $$TMP ################################### Windows targets for wine, with MSVC6 -$(PROG).exe: $(BUILD_DIR) $(TOP_HEADERS) mjs.c - wine cl $(MFLAGS) mjs.c -O1 -MD /Fe$@ +ci-test: $(BUILD_DIR) vc98 vc2017 test_full -$(BUILD_DIR)/unit_test.exe: tests/unit_test.c mjs.c $(TESTUTIL_FILES) $(BUILD_DIR) - wine cl -I. -I$(REPO_ROOT) $< $(TESTUTIL_FILES) -o $@ +$(PROG).exe: $(BUILD_DIR) $(TOP_HEADERS) mjs.c + $(RD) mgos/vc98 wine cl mjs.c $(CLFLAGS) $(MFLAGS) /Fe$@ -wtest: $(BUILD_DIR)/unit_test.exe - wine $(BUILD_DIR)/unit_test.exe +TEST_SOURCES = tests/unit_test.c $(TESTUTIL_FILES) +CLFLAGS = /DWIN32_LEAN_AND_MEAN /MD /O1 /TC /W2 /WX /I.. /I. /DNDEBUG /DMJS_MEMORY_STATS +vc98 vc2017: mjs.c mjs.h + $(RD) mgos/$@ wine cl $(TEST_SOURCES) $(CLFLAGS) /Fe$@.exe + $(RD) mgos/$@ wine ./$@.exe -difftest: - @TMP=`mktemp -t checkout-diff.XXXXXX`; \ - git diff >$$TMP ; \ - if [ -s "$$TMP" ]; then echo found diffs in checkout:; git status -s; head -n 50 "$$TMP"; exit 1; fi; \ - rm $$TMP diff --git a/README.md b/README.md index b093a6a..eb2a36b 100644 --- a/README.md +++ b/README.md @@ -12,8 +12,8 @@ implements a strict subset of ES6 (JavaScript version 6): - Any valid mJS code is a valid ES6 code. - Any valid ES6 code is not necessarily a valid mJS code. -On 32-bit ARM mJS engine takes about 25k of flash memory, and less than 1k -of RAM (see [intro article](http://goo.gl/zJYyWF)). +On 32-bit ARM mJS engine takes about 50k of flash memory, and less than 1k +of RAM (see [intro article](https://mongoose-os.com/blog/mjs-a-new-approach-to-embedded-scripting/)). mJS is part of [MongooseOS](https://mongoose-os.com), where it enables scripting for IoT devices. @@ -61,20 +61,42 @@ where it enables scripting for IoT devices.
'some_string'.slice(start, end);
Return a substring between two indices. Example: - 'abcdef'.slice(1,3) === 'bc';
+ 'abcdef'.slice(1,3) === 'bc'; + +
'abc'.at(0);
+
Return numeric byte value at given string index. Example: + 'abc'.at(0) === 0x61;
+ +
'abc'.indexOf(substr[, fromIndex]);
+
Return index of first occurence of substr within the string or `-1` + if not found. + 'abc'.indexOf('bc') === 1;
+ +
chr(n);
+
Return 1-byte string whose ASCII code is the integer `n`. If `n` is + not numeric or outside of `0-255` range, `null` is returned. Example: + chr(0x61) === 'a';
let a = [1,2,3,4,5]; a.splice(start, deleteCount, ...);
Change the contents of an array by removing existing elements and/or adding new elements. Example: let a = [1,2,3,4,5]; a.splice(1, 2, 100, 101, 102); a === [1,100,101,102,4,5];
-
let s = fstr(ptrVar, offset, length);
+
let s = mkstr(ptrVar, length);
Create a string backed by a C memory chunk. A string s starts - at memory location ptrVar + offset, and is length bytes long. - Short form is also available: fstr(ptrVar, length).
+ at memory location ptrVar, and is length bytes long. + +
let s = mkstr(ptrVar, offset, length, copy = false);
+
Like `mkstr(ptrVar, length)`, but string s starts + at memory location ptrVar + offset, and the caller can specify + whether the string needs to be copied to the internal mjs buffer. By default + it's not copied.
let f = ffi('int foo(int)');
Import C function into mJS. See next section.
+ +
gc(full);
+
Perform garbage collection. If `full` is `true`, reclaim RAM to OS.
# C/C++ interoperability @@ -122,7 +144,97 @@ In order to make FFI work, mJS must be able to get the address of a C function by its name. On POSIX systems, `dlsym()` API can do that. On Windows, `GetProcAddress()`. On embedded systems, a system resolver should be either manually written, or be implemented with some aid from a firmware -linker script. mJS resolver uses `dlsym`-compatible signature. +linker script. mJS resolver uses `dlsym`-compatible signature. + +## Converting structs to objects + +mJS provides a helper to facilitate coversion of C structs to JS objects. +The functions is called `s2o` and takes two parameters: foreign pointer to +the struct and foreign pointer to the struct's descriptor which specifies +names and offsets of the struct's members. Here's an simple example: + +C/C++ side code: +```c +#include "mjs.h" + +struct my_struct { + int a; + const char *b; + double c; + struct mg_str d; + struct mg_str *e; + float f; + bool g; +}; + +static const struct mjs_c_struct_member my_struct_descr[] = { + {"a", offsetof(struct my_struct, a), MJS_STRUCT_FIELD_TYPE_INT, NULL}, + {"b", offsetof(struct my_struct, b), MJS_STRUCT_FIELD_TYPE_CHAR_PTR, NULL}, + {"c", offsetof(struct my_struct, c), MJS_STRUCT_FIELD_TYPE_DOUBLE, NULL}, + {"d", offsetof(struct my_struct, d), MJS_STRUCT_FIELD_TYPE_MG_STR, NULL}, + {"e", offsetof(struct my_struct, e), MJS_STRUCT_FIELD_TYPE_MG_STR_PTR, NULL}, + {"f", offsetof(struct my_struct, f), MJS_STRUCT_FIELD_TYPE_FLOAT, NULL}, + {"g", offsetof(struct my_struct, g), MJS_STRUCT_FIELD_TYPE_BOOL, NULL}, + {NULL, 0, MJS_STRUCT_FIELD_TYPE_INVALID, NULL}, +}; + +const struct mjs_c_struct_member *get_my_struct_descr(void) { + return my_struct_descr; +}; +``` + +JS side code: +```js +// Assuming `s` is a foreign pointer to an instance of `my_struct`, obtained elsewhere. +let sd = ffi('void *get_my_struct_descr(void)')(); +let o = s2o(s, sd); +print(o.a, o.b); +``` + +Nested structs are also supported - use `MJS_STRUCT_FIELD_TYPE_STRUCT` field type +and provide pointer to the definition: + +```c +struct my_struct2 { + int8_t i8; + int16_t i16; + uint8_t u8; + uint16_t u16; +}; + +static const struct mjs_c_struct_member my_struct2_descr[] = { + {"i8", offsetof(struct my_struct2, i8), MJS_STRUCT_FIELD_TYPE_INT8, NULL}, + {"i16", offsetof(struct my_struct2, i16), MJS_STRUCT_FIELD_TYPE_INT16, NULL}, + {"u8", offsetof(struct my_struct2, u8), MJS_STRUCT_FIELD_TYPE_UINT8, NULL}, + {"u16", offsetof(struct my_struct2, u16), MJS_STRUCT_FIELD_TYPE_UINT16, NULL}, + {NULL, 0, MJS_STRUCT_FIELD_TYPE_INVALID, NULL}, +}; + +struct my_struct { + struct my_struct2 s; + struct my_struct2 *sp; +}; + +static const struct mjs_c_struct_member my_struct_descr[] = { + {"s", offsetof(struct my_struct, s), MJS_STRUCT_FIELD_TYPE_STRUCT, my_struct2_descr}, + {"sp", offsetof(struct my_struct, sp), MJS_STRUCT_FIELD_TYPE_STRUCT_PTR, my_struct2_descr}, + {NULL, 0, MJS_STRUCT_FIELD_TYPE_INVALID, NULL}, +}; +``` + +For complicated cases, a custom conversion function can be invoked that returns value: +```c +mjs_val_t custom_value_func(struct mjs *mjs, void *ap) { + /* Do something with ap, construct and return mjs_val_t */ +} + +static const struct mjs_c_struct_member my_struct_descr[] = { + ... + {"x", offsetof(struct my_struct, x), MJS_STRUCT_FIELD_TYPE_CUSTOM, custom_value_func}, + ... +}; +``` + # Complete embedding example @@ -212,3 +324,17 @@ happy to work on a solution with you. Prototyping: While your project is still in prototyping stage and not for sale, you can use MJS’s open source code without license restrictions. + +# See also +- [Mongoose Web Server Library](https://mongoose.ws/) - a robust, open-source solution licensed under GPLv2, designed to seamlessly integrate web server functionality into your embedded devices. +- With complementary [Mongoose Wizard](https://mongoose.ws/wizard/) - a no-code visual tool that enables rapid WebUI creation without the need for frontend expertise. + +# Technical guides + +Technical atricles and deep dives into embedded networking technologies: +- [Embedded Web Server: A Comprehensive Guide for Modern Connected Devices](https://mongoose.ws/articles/embedded-web-server-a-comprehensive-guide-for-modern-connected-devices/) +- [Building Embedded Web Device Dashboards](https://mongoose.ws/articles/building-embedded-web-device-dashboard/) +- [ESP32 Device Dashboard: A Step-by-Step Guide for Developers](https://mongoose.ws/articles/esp32-device-dashboard/) +- [How to build an STM32 Web Dashboard](https://mongoose.ws/articles/stm32-device-dashboard/) +- [STM32 WebSocket Guide](https://mongoose.ws/articles/stm32-websocket-guide/) +- [Web File Manager on STM32, ESP32 and Embedded Linux](https://mongoose.ws/articles/building-a-web-file-manager-on-stm32-esp32-embedded-linux/) diff --git a/common/cs_dbg.c b/common/cs_dbg.c deleted file mode 100644 index 4c7369d..0000000 --- a/common/cs_dbg.c +++ /dev/null @@ -1,72 +0,0 @@ -/* - * Copyright (c) 2014-2016 Cesanta Software Limited - * All rights reserved - */ - -#include "common/cs_dbg.h" - -#include -#include -#include - -#include "common/cs_time.h" - -enum cs_log_level cs_log_threshold WEAK = -#if CS_ENABLE_DEBUG - LL_VERBOSE_DEBUG; -#else - LL_ERROR; -#endif - -#if CS_ENABLE_STDIO - -FILE *cs_log_file WEAK = NULL; - -#if CS_LOG_ENABLE_TS_DIFF -double cs_log_ts WEAK; -#endif - -enum cs_log_level cs_log_cur_msg_level WEAK = LL_NONE; - -void cs_log_print_prefix(enum cs_log_level level, const char *func) WEAK; -void cs_log_print_prefix(enum cs_log_level level, const char *func) { - char prefix[21]; - strncpy(prefix, func, 20); - prefix[20] = '\0'; - if (cs_log_file == NULL) cs_log_file = stderr; - cs_log_cur_msg_level = level; - fprintf(cs_log_file, "%-20s ", prefix); -#if CS_LOG_ENABLE_TS_DIFF - { - double now = cs_time(); - fprintf(cs_log_file, "%7u ", (unsigned int) ((now - cs_log_ts) * 1000000)); - cs_log_ts = now; - } -#endif -} - -void cs_log_printf(const char *fmt, ...) WEAK; -void cs_log_printf(const char *fmt, ...) { - va_list ap; - va_start(ap, fmt); - vfprintf(cs_log_file, fmt, ap); - va_end(ap); - fputc('\n', cs_log_file); - fflush(cs_log_file); - cs_log_cur_msg_level = LL_NONE; -} - -void cs_log_set_file(FILE *file) WEAK; -void cs_log_set_file(FILE *file) { - cs_log_file = file; -} - -#endif /* CS_ENABLE_STDIO */ - -void cs_log_set_level(enum cs_log_level level) WEAK; -void cs_log_set_level(enum cs_log_level level) { - cs_log_threshold = level; -#if CS_LOG_ENABLE_TS_DIFF && CS_ENABLE_STDIO - cs_log_ts = cs_time(); -#endif -} diff --git a/common/cs_dbg.h b/common/cs_dbg.h deleted file mode 100644 index c75f6b0..0000000 --- a/common/cs_dbg.h +++ /dev/null @@ -1,83 +0,0 @@ -/* - * Copyright (c) 2014-2016 Cesanta Software Limited - * All rights reserved - */ - -#ifndef CS_COMMON_CS_DBG_H_ -#define CS_COMMON_CS_DBG_H_ - -#include "common/platform.h" - -#if CS_ENABLE_STDIO -#include -#endif - -#ifndef CS_ENABLE_DEBUG -#define CS_ENABLE_DEBUG 0 -#endif - -#ifndef CS_LOG_ENABLE_TS_DIFF -#define CS_LOG_ENABLE_TS_DIFF 0 -#endif - -#ifdef __cplusplus -extern "C" { -#endif /* __cplusplus */ - -enum cs_log_level { - LL_NONE = -1, - LL_ERROR = 0, - LL_WARN = 1, - LL_INFO = 2, - LL_DEBUG = 3, - LL_VERBOSE_DEBUG = 4, - - _LL_MIN = -2, - _LL_MAX = 5, -}; - -void cs_log_set_level(enum cs_log_level level); - -#if CS_ENABLE_STDIO - -void cs_log_set_file(FILE *file); -extern enum cs_log_level cs_log_threshold; -void cs_log_print_prefix(enum cs_log_level level, const char *func); -void cs_log_printf(const char *fmt, ...); - -#define LOG(l, x) \ - do { \ - if (cs_log_threshold >= l) { \ - cs_log_print_prefix(l, __func__); \ - cs_log_printf x; \ - } \ - } while (0) - -#ifndef CS_NDEBUG - -#define DBG(x) \ - do { \ - if (cs_log_threshold >= LL_VERBOSE_DEBUG) { \ - cs_log_print_prefix(LL_VERBOSE_DEBUG, __func__); \ - cs_log_printf x; \ - } \ - } while (0) - -#else /* NDEBUG */ - -#define DBG(x) - -#endif - -#else /* CS_ENABLE_STDIO */ - -#define LOG(l, x) -#define DBG(x) - -#endif - -#ifdef __cplusplus -} -#endif /* __cplusplus */ - -#endif /* CS_COMMON_CS_DBG_H_ */ diff --git a/common/cs_file.h b/common/cs_file.h deleted file mode 100644 index d62fa8d..0000000 --- a/common/cs_file.h +++ /dev/null @@ -1,32 +0,0 @@ -/* - * Copyright (c) 2015 Cesanta Software Limited - * All rights reserved - */ - -#ifndef CS_COMMON_CS_FILE_H_ -#define CS_COMMON_CS_FILE_H_ - -#include "common/platform.h" - -#ifdef __cplusplus -extern "C" { -#endif /* __cplusplus */ - -/* - * Read whole file `path` in memory. It is responsibility of the caller - * to `free()` allocated memory. File content is guaranteed to be - * '\0'-terminated. File size is returned in `size` variable, which does not - * count terminating `\0`. - * Return: allocated memory, or NULL on error. - */ -char *cs_read_file(const char *path, size_t *size); - -#ifdef CS_MMAP -char *cs_mmap_file(const char *path, size_t *size); -#endif - -#ifdef __cplusplus -} -#endif /* __cplusplus */ - -#endif /* CS_COMMON_CS_FILE_H_ */ diff --git a/common/cs_time.c b/common/cs_time.c deleted file mode 100644 index 7eaa4c3..0000000 --- a/common/cs_time.c +++ /dev/null @@ -1,48 +0,0 @@ -/* - * Copyright (c) 2014-2016 Cesanta Software Limited - * All rights reserved - */ - -#include "common/cs_time.h" - -#ifndef _WIN32 -#include -/* - * There is no sys/time.h on ARMCC. - */ -#if !(defined(__ARMCC_VERSION) || defined(__ICCARM__)) && \ - !defined(__TI_COMPILER_VERSION__) && \ - (!defined(CS_PLATFORM) || CS_PLATFORM != CS_P_NXP_LPC) -#include -#endif -#else -#include -#endif - -double cs_time(void) WEAK; -double cs_time(void) { - double now; -#ifndef _WIN32 - struct timeval tv; - if (gettimeofday(&tv, NULL /* tz */) != 0) return 0; - now = (double) tv.tv_sec + (((double) tv.tv_usec) / 1000000.0); -#else - SYSTEMTIME sysnow; - FILETIME ftime; - GetLocalTime(&sysnow); - SystemTimeToFileTime(&sysnow, &ftime); - /* - * 1. VC 6.0 doesn't support conversion uint64 -> double, so, using int64 - * This should not cause a problems in this (21th) century - * 2. Windows FILETIME is a number of 100-nanosecond intervals since January - * 1, 1601 while time_t is a number of _seconds_ since January 1, 1970 UTC, - * thus, we need to convert to seconds and adjust amount (subtract 11644473600 - * seconds) - */ - now = (double) (((int64_t) ftime.dwLowDateTime + - ((int64_t) ftime.dwHighDateTime << 32)) / - 10000000.0) - - 11644473600; -#endif /* _WIN32 */ - return now; -} diff --git a/common/cs_time.h b/common/cs_time.h deleted file mode 100644 index 4d3e716..0000000 --- a/common/cs_time.h +++ /dev/null @@ -1,22 +0,0 @@ -/* - * Copyright (c) 2014-2016 Cesanta Software Limited - * All rights reserved - */ - -#ifndef CS_COMMON_CS_TIME_H_ -#define CS_COMMON_CS_TIME_H_ - -#include "common/platform.h" - -#ifdef __cplusplus -extern "C" { -#endif /* __cplusplus */ - -/* Sub-second granularity time(). */ -double cs_time(void); - -#ifdef __cplusplus -} -#endif /* __cplusplus */ - -#endif /* CS_COMMON_CS_TIME_H_ */ diff --git a/common/cs_varint.c b/common/cs_varint.c deleted file mode 100644 index e19beea..0000000 --- a/common/cs_varint.c +++ /dev/null @@ -1,52 +0,0 @@ -/* - * Copyright (c) 2014-2017 Cesanta Software Limited - * All rights reserved - */ - -#include "common/cs_varint.h" - -/* - * Strings in AST are encoded as tuples (length, string). - * Length is variable-length: if high bit is set in a byte, next byte is used. - * Small string length (less then 128 bytes) is encoded in 1 byte. - */ -int64_t cs_varint_decode(const uint8_t *p, int *llen) { - int64_t i = 0, num = 0; - - do { - /* - * Each byte of varint contains 7 bits, in little endian order. - * MSB is a continuation bit: it tells whether next byte is used. - */ - num |= ((int64_t)(p[i] & 0x7f)) << (7 * i); - /* - * First we increment i, then check whether it is within boundary and - * whether decoded byte had continuation bit set. - */ - } while ((unsigned int) ++i < sizeof(int64_t) && (p[i - 1] & 0x80)); - *llen = i; - - return num; -} - -/* Return number of bytes to store length */ -int cs_varint_llen(int64_t num) { - int n = 0; - - do { - n++; - } while (num >>= 7); - - return n; -} - -int cs_varint_encode(int64_t num, uint8_t *p) { - int i, llen = cs_varint_llen(num); - - for (i = 0; i < llen; i++) { - p[i] = (num & 0x7f) | (i < llen - 1 ? 0x80 : 0); - num >>= 7; - } - - return llen; -} diff --git a/common/cs_varint.h b/common/cs_varint.h deleted file mode 100644 index ff98308..0000000 --- a/common/cs_varint.h +++ /dev/null @@ -1,23 +0,0 @@ -/* - * Copyright (c) 2014-2017 Cesanta Software Limited - * All rights reserved - */ - -#ifndef CS_COMMON_CS_VARINT_H_ -#define CS_COMMON_CS_VARINT_H_ - -#include - -#if defined(__cplusplus) -extern "C" { -#endif /* __cplusplus */ - -int cs_varint_encode(int64_t num, uint8_t *to); -int64_t cs_varint_decode(const uint8_t *from, int *llen); -int cs_varint_llen(int64_t num); - -#if defined(__cplusplus) -} -#endif /* __cplusplus */ - -#endif /* CS_COMMON_CS_VARINT_H_ */ diff --git a/common/mg_mem.h b/common/mg_mem.h deleted file mode 100644 index 3efdc3b..0000000 --- a/common/mg_mem.h +++ /dev/null @@ -1,25 +0,0 @@ -/* - * Copyright (c) 2014-2016 Cesanta Software Limited - * All rights reserved - */ - -#ifndef CS_COMMON_MG_MEM_H_ -#define CS_COMMON_MG_MEM_H_ - -#ifndef MG_MALLOC -#define MG_MALLOC malloc -#endif - -#ifndef MG_CALLOC -#define MG_CALLOC calloc -#endif - -#ifndef MG_REALLOC -#define MG_REALLOC realloc -#endif - -#ifndef MG_FREE -#define MG_FREE free -#endif - -#endif /* CS_COMMON_MG_MEM_H_ */ diff --git a/common/platforms/esp/debug_coredump.mk b/common/platforms/esp/debug_coredump.mk deleted file mode 100644 index 2caaa8f..0000000 --- a/common/platforms/esp/debug_coredump.mk +++ /dev/null @@ -1,27 +0,0 @@ -# This provides a debug_coredump target for ESP8266 and ESP32. - -OBJ_DIR ?= build/objs -BIN_FILE ?= $(OBJ_DIR)/$(APP).bin -ELF_FILE ?= $(OBJ_DIR)/fw.elf - -debug_coredump: -ifndef CONSOLE_LOG - $(error Please set CONSOLE_LOG) -endif - docker run --rm -i --tty=true \ - -v $(APP_MOUNT_PATH):$(DOCKER_APP_PATH) \ - -v $(MGOS_PATH_ABS):$(DOCKER_MGOS_PATH) \ - -v $(MGOS_PATH_ABS):$(MGOS_PATH_ABS) \ - -v $(realpath $(BIN_FILE)):/app.bin \ - -v $(realpath $(ELF_FILE)):/app.elf \ - -v $(realpath $(CONSOLE_LOG)):/console.log \ - $(SDK_VERSION) /bin/bash -c "\ - cd $(DOCKER_APP_PATH)/$(APP_SUBDIR); \ - $(DOCKER_MGOS_PATH)/common/platforms/esp/serve_core.py \ - --rom $(DOCKER_MGOS_PATH)/common/platforms/$(APP_PLATFORM)/rom/rom.bin \ - --irom /app.bin --irom_addr $(IROM_MAP_ADDR) \ - /console.log & \ - $(GDB) /app.elf \ - -ex 'target remote 127.0.0.1:1234' \ - -ex 'set confirm off' \ - -ex 'add-symbol-file $(DOCKER_MGOS_PATH)/common/platforms/$(APP_PLATFORM)/rom/rom.elf 0x40000000'" diff --git a/common/platforms/esp/serve_core.py b/common/platforms/esp/serve_core.py deleted file mode 100755 index 6e1a6a6..0000000 --- a/common/platforms/esp/serve_core.py +++ /dev/null @@ -1,330 +0,0 @@ -#!/usr/bin/env python - -# -# usage: tools/serve_core.py --iram firmware/0x00000.bin --irom firmware/0x11000.bin /tmp/esp-console.log -# -# Then you can connect with gdb. The ESP8266 SDK image provides a debugger with -# reasonable support of lx106. Example invocation: -# -# docker run -v $PWD:/cesanta -ti \ -# docker.cesanta.com/esp8266-build-oss:latest \ -# xt-gdb /cesanta/fw/platforms/esp8266/build/fw.out \ -# -ex "target remote localhost:1234" -# -# If you run on OSX or windows, you have to put the IP of your host instead of -# localhost since gdb will run in a virtualmachine. - -import SocketServer -import argparse -import base64 -import binascii -import ctypes -import json -import os -import struct -import sys - -IRAM_BASE=0x40100000 -IROM_BASE=0x40200000 -ROM_BASE= 0x40000000 - -parser = argparse.ArgumentParser(description='Serve ESP core dump to GDB') -parser.add_argument('--port', dest='port', default=1234, type=int, help='listening port') -parser.add_argument('--iram', dest='iram', help='iram firmware section') -parser.add_argument('--iram_addr', dest='iram_addr', - type=lambda x: int(x,16), help='iram firmware section') -parser.add_argument('--irom', dest='irom', required=False, help='irom firmware section') -parser.add_argument('--irom_addr', dest='irom_addr', - type=lambda x: int(x,16), help='irom firmware section') -parser.add_argument('--rom', dest='rom', required=False, help='rom section') -parser.add_argument('--rom_addr', dest='rom_addr', default=ROM_BASE, - type=lambda x: int(x,16), help='rom section') -parser.add_argument('log', help='serial log containing core dump snippet') - -args = parser.parse_args() - -START_DELIM = '--- BEGIN CORE DUMP ---' -END_DELIM = '---- END CORE DUMP ----' - - -configMAX_TASK_NAME_LEN = 16 -XT_SOL_FRMSZ = 32 -XT_STK_FRMSZ = 192 -XT_STK_EXTRA = 112 -XCHAL_EXTRA_SA_SIZE = 48 - -class FreeRTOSTask(object): - handle = 0 - pxTopOfStack = 0 - uxPriority = 0 - pxStack = 0 - pcTaskName = "" - - def __init__(self, handle, data): - self.handle = handle - self.pxTopOfStack = struct.unpack('= 0: - self.pcTaskName = self.pcTaskName[0:i] - - def __str__(self): - return "0x%08x '%s' pri %d sp 0x%08x (%d free)" % ( - self.handle, self.pcTaskName, self.uxPriority, self.pxTopOfStack, - self.pxTopOfStack - self.pxStack) - - -class Core(object): - def __init__(self, filename): - self._dump = self._read(filename) - self.mem = self._map_core(self._dump) - if args.iram: - self.mem.extend(self._map_firmware(args.iram_addr, args.iram, IRAM_BASE)) - if args.irom: - self.mem.extend(self._map_firmware(args.irom_addr, args.irom, IROM_BASE)) - if args.rom_addr: - self.mem.extend(self._map_firmware(args.rom_addr, args.rom, ROM_BASE)) - self.regs = base64.decodestring(self._dump['REGS']['data']) - self.tasks = dict((a, self._parse_tcb(a)) for a in self._dump.get('tasks', [])) - - def get_cur_task_for_cpu(self, cpu_no): - tt = self._dump.get('tasks', []) - if cpu_no < len(tt): - return tt[cpu_no] - else: - return None - - def _parse_tcb(self, addr): - sizeofTCB = 352 # sizeof(taskTCB) - # Task ID is the address of the TCB and must be in DRAM. - tcb_data = self.read(addr, sizeofTCB) - if tcb_data[3] != '\x3f': - return None - return FreeRTOSTask(addr, tcb_data) - - - def _search_backwards(self, f, start_offset, pattern): - offset = start_offset - while True: - offset = max(0, offset - 10000) - f.seek(offset) - data = f.read(min(10000, start_offset)) - pos = data.rfind(pattern) - if pos >= 0: - return offset + pos - elif offset == 0: - return -1 - offset += 5000 - - def _read(self, filename): - with open(filename) as f: - f.seek(0, os.SEEK_END) - size = f.tell() - end_pos = self._search_backwards(f, f.tell(), END_DELIM) - if end_pos == -1: - print >>sys.stderr, "Cannot find end delimiter:", END_DELIM - sys.exit(1) - start_pos = self._search_backwards(f, end_pos, START_DELIM) - if start_pos == -1: - print >>sys.stderr, "Cannot find start delimiter:", START_DELIM - sys.exit(1) - start_pos += len(START_DELIM) - - print >>sys.stderr, "Found core at %d - %d" % (start_pos, end_pos) - f.seek(start_pos) - core_json = f.read(end_pos - start_pos) - return json.loads(core_json.replace('\n', '').replace('\r', '')) - - def _map_core(self, core): - mem = [] - for k, v in core.items(): - if not isinstance(v, dict) or k == 'REGS': - continue - data = base64.decodestring(v["data"]) - print >>sys.stderr, "Mapping {0}: {1} @ {2:#02x}".format(k, len(data), v["addr"]) - if "crc32" in v: - crc32 = ctypes.c_uint32(binascii.crc32(data)) - expected_crc32 = ctypes.c_uint32(v["crc32"]) - if crc32.value != expected_crc32.value: - print >>sys.stderr, "CRC mismatch, section corrupted %s %s" % (crc32, expected_crc32) - sys.exit(1) - mem.append((v["addr"], v["addr"] + len(data), data)) - return mem - - def _map_firmware(self, addr, filename, base): - if addr is None: - name = os.path.splitext(os.path.basename(filename))[0] - addr = base + int(name, 16) - with open(filename) as f: - data = f.read() - result = [] - i = 0 - magic, count = struct.unpack('>sys.stderr, "Mapping IROM: {0} @ {1:#02x}".format(irom_len, addr) - result.append((addr, addr + irom_len, data[i:i+irom_len+16])) - # The rest (IRAM) will be in the core. - else: - print >>sys.stderr, "Mapping {0} at {1:#02x}".format(filename, addr) - result.append((addr, addr + len(data), data)) - return result - - def read(self, addr, size): - for base, end, data in self.mem: - if addr >= base and addr < end: - return data[addr - base : addr - base + size] - print >>sys.stderr, "Unmapped addr", hex(addr) - return "\0" * size - - -class GDBHandler(SocketServer.BaseRequestHandler): - def handle(self): - self._core = core = Core(args.log) - self._curtask = None - print >>sys.stderr, "Loaded core dump from last snippet in ", args.log - - while self.expect_packet_start(): - pkt = self.read_packet() - #print >>sys.stderr, ">>", pkt - if pkt == "?": # status -> trap - self.send_str("S09") - elif pkt == "g": # dump registers - regs = core.regs - if self._curtask: - # Dump specific task's registers - t = self._curtask - sp = t.pxTopOfStack - # The first word on the stack of a task determines how - # task's execution ended: by yield (0) or int/exc (non-0). - exit, pc, ps = struct.unpack('>sys.stderr, "task %x pc %x sp %x" % (self._curtask.handle, pc, sp) - self.send_str(self.encode_bytes(regs)) - elif pkt[0] == "G": # set registers - core.regs = self.decode_bytes(pkt[1:]) - self.send_str("OK") - elif pkt[0] == "m": # read memory - addr, size = [int(n, 16) for n in pkt[1:].split(',')] - if addr < 0x10000000 and addr > 0x80000: - print >>sys.stderr, 'fixup %08x' % addr - addr |= 0x40000000 - bs = core.read(addr, size) - #if bs == "\0\0\0\0": - # bs = "\x01\0\0\0" - #print >>sys.stderr, "<<", " ".join("{:02x}".format(ord(c)) for c in bs) - self.send_str(self.encode_bytes(bs)) - elif pkt.startswith("Hg"): - tid = int(pkt[2:], 16) - self._curtask = core.tasks.get(tid) - self.send_str("OK") - elif pkt.startswith("Hc-1"): - # cannot continue, this is post mortem debugging - self.send_str("E01") - elif pkt == "qC": - t = core.get_cur_task_for_cpu(0) - if t: - self.send_str("QC%016x" % t) - self.send_str("1") - elif pkt == "qAttached": - self.send_str("1") - elif pkt == "qSymbol::": - self.send_str("OK") - elif pkt == "qfThreadInfo": - if core.tasks: - self.send_str("m%s" % ",".join("%016x" % t for t in core.tasks)) - else: - self.send_str("l") - elif pkt == "qsThreadInfo": - self.send_str("l") - elif pkt.startswith("qThreadExtraInfo,"): - self.send_thread_extra_info(int(pkt[17:], 16)) - elif pkt[0] == "T": - tid = int(pkt[1:], 16) - if tid in core.tasks: - self.send_str("OK") - else: - self.send_str("ERR00") - elif pkt in ("qTStatus", "qOffsets", "D") or pkt.startswith("qSupported"): - # silently ignore - self.send_str("") - else: - print >>sys.stderr, "Ignoring unknown command '%s'" % (pkt,) - self.send_str("") - - print >>sys.stderr, "GDB closed the connection" - - def encode_bytes(self, bs): - return "".join("{0:02x}".format(ord(i)) for i in bs) - - def decode_bytes(self, s): - return s.decode('hex') - - def send_ack(self): - self.request.sendall("+"); - - def send_nack(self): - self.request.sendall("-"); - - def send_str(self, s): - self.request.sendall("${0}#{1:02x}".format(s, self._checksum(s))) - - def _checksum(self, s): - return sum(ord(i) for i in s) % 0x100 - - def expect_packet_start(self): - return len(self.read_until('$')) > 0 - - def read_packet(self): - pkt = self.read_until('#') - chk = "" - chk += self.request.recv(1) - chk += self.request.recv(1) - if len(chk) != 2: - return "" - if int(chk, 16) != self._checksum(pkt): - print >>sys.stderr, "Bad checksum for {0}; got: {1} want: {2:02x}".format(pkt, chk, "want:", self._checksum(pkt)) - self.send_nack() - return "" - - self.send_ack() - return pkt - - def read_until(self, limit): - buf = '' - while True: - ch = self.request.recv(1) - if len(ch) == 0: # eof - return "" - if ch == limit: - return buf - buf += ch - - def send_thread_extra_info(self, tid): - task = self._core.tasks.get(tid) - if task: - self.send_str(binascii.hexlify(str(task))) - else: - self.send_str(binascii.hexlify('[Invalid task 0x%08x]' % tid)) - - - -class TCPServer(SocketServer.TCPServer): - allow_reuse_address = True - -server = TCPServer(('0.0.0.0', args.port), GDBHandler) -print "Waiting for gdb on", args.port -server.serve_forever() diff --git a/common/platforms/esp/src/esp_mmap.c b/common/platforms/esp/src/esp_mmap.c deleted file mode 100644 index b44e1ec..0000000 --- a/common/platforms/esp/src/esp_mmap.c +++ /dev/null @@ -1,268 +0,0 @@ -/* - * Copyright (c) 2014-2016 Cesanta Software Limited - * All rights reserved - */ - -/* - * This is a generic implementation of SPIFFS mmapping on esp8266 and esp32. - * - * Each of these two archs has arch-specific header which fills a few gaps, - * see e.g. fw/platforms/esp32/src/esp32_mmap.h. - * - * It already works, but there are a few major TODO-s: - * - * - Use linked list instead of fixed-size array of mmap descriptors - * - On esp32, implement reading unaligned bytes from flash in a generic - * manner, and rename read_unaligned_byte() below to read_mmapped_byte() - * - On esp32, use spi_flash_mmap() to map flash area at some address, and - * get rid of FLASH_READ_BYTE() (see fw/platforms/esp32/src/esp32_mmap.h) - */ - -#include -#include -#include - -#include "common/platforms/esp/src/esp_mmap.h" - -#include "common/cs_dbg.h" -#include "common/mbuf.h" -#include "common/spiffs/spiffs.h" -#include "common/spiffs/spiffs_nucleus.h" - -#ifdef CS_MMAP - -#define MMAP_DESCS_ADD_SIZE 4 - -#define MMAP_ADDR_MASK ((1 << MMAP_ADDR_BITS) - 1) - -struct mbuf mmap_descs_mbuf; -struct mmap_desc *mmap_descs = NULL; -static struct mmap_desc *cur_mmap_desc; - -/* - * Reads unaligned byte, handles spiffs-mmapped addresses properly. - * - * TODO(dfrank): handle reading unaligned bytes on esp32 in a generic way, - * and rename this function to read_mmapped_byte(). - */ -IRAM NOINSTR static uint8_t read_unaligned_byte(uint8_t *addr) { - uint32_t *base = (uint32_t *) ((uintptr_t) addr & ~0x3); - uint32_t word; - - if (addr >= (uint8_t *) MMAP_BASE && addr < (uint8_t *) MMAP_END) { - struct mmap_desc *desc = MMAP_DESC_FROM_ADDR(addr); - int block = ((uintptr_t) addr & MMAP_ADDR_MASK) / SPIFFS_PAGE_DATA_SIZE; - int off = ((uintptr_t) addr & MMAP_ADDR_MASK) % SPIFFS_PAGE_DATA_SIZE; - uint8_t *ea = (uint8_t *) desc->blocks[block] + off; - - /* - * This is commented because on esp32 we might have more than one - * mount points - * - * TODO(dfrank): somehow deduce that from the address, and uncomment - */ -#if 0 - if (ea < (uint8_t *) FLASH_BASE(cs_spiffs_get_fs())) { - printf("MMAP invalid address %p: block %d, off %d, pages %d, desc %d\n", - ea, block, off, desc->pages, desc - mmap_descs); - *(int *) 1 = 1; - } -#endif - - return FLASH_READ_BYTE(ea); - } - - word = *base; - return (uint8_t)(word >> 8 * ((uintptr_t) addr & 0x3)); -} - -IRAM NOINSTR int esp_mmap_exception_handler(uint32_t vaddr, uint8_t *pc, - long *pa2) { - int pc_inc = 0; - - uint32_t instr = (uint32_t) read_unaligned_byte(pc) | ((uint32_t) read_unaligned_byte(pc + 1) << 8); - uint8_t at = (instr >> 4) & 0xf; - - uint32_t val = 0; - - if ((instr & 0xf00f) == 0x2) { - /* l8ui at, as, imm r = 0 */ - val = read_unaligned_byte((uint8_t *) vaddr); - pc_inc = 3; - } else if ((instr & 0x700f) == 0x1002) { - /* - * l16ui at, as, imm r = 1 - * l16si at, as, imm r = 9 - */ - val = read_unaligned_byte((uint8_t *) vaddr) | - read_unaligned_byte((uint8_t *) vaddr + 1) << 8; - if (instr & 0x8000) val = (int16_t) val; - pc_inc = 3; - } else if ((instr & 0xf00f) == 0x2002 || (instr & 0xf) == 0x8) { - /* - * l32i at, as, imm r = 2 - * l32i.n at, as, imm - */ - /* - * TODO(dfrank): provide fast code path for aligned access since - * all mmap 32-bit loads will be aligned. - */ - val = read_unaligned_byte((uint8_t *) vaddr) | - read_unaligned_byte((uint8_t *) vaddr + 1) << 8 | - read_unaligned_byte((uint8_t *) vaddr + 2) << 16 | - read_unaligned_byte((uint8_t *) vaddr + 3) << 24; - pc_inc = ((instr & 0xf) == 0x8) ? 2 : 3; - } else { - fprintf(stderr, "cannot emulate flash mem instr at pc = %p\n", (void *) pc); - } - - if (pc_inc > 0) { - /* - * a0 and a1 are never used as scratch registers. - * Here we assume that a2...15 are laid out contiguously in the struct. - */ - *(pa2 + at - 2) = val; - } - - return pc_inc; -} - -static struct mmap_desc *alloc_mmap_desc(void) { - size_t i; - size_t descs_cnt = mmap_descs_mbuf.len / sizeof(struct mmap_desc); - for (i = 0; i < descs_cnt; i++) { - if (mmap_descs[i].blocks == NULL) { - return &mmap_descs[i]; - } - } - - /* Failed to find an empty descriptor, need to grow mbuf */ - int old_len = mmap_descs_mbuf.len; - mbuf_append(&mmap_descs_mbuf, NULL, MMAP_DESCS_ADD_SIZE * sizeof(struct mmap_desc)); - mmap_descs = (struct mmap_desc *)mmap_descs_mbuf.buf; - memset(mmap_descs_mbuf.buf + old_len, 0, mmap_descs_mbuf.len - old_len); - - /* Call this function again; this time it should succeed */ - return alloc_mmap_desc(); -} - -void *mmap(void *addr, size_t len, int prot, int flags, int fd, off_t offset) { - int pages = (len + SPIFFS_PAGE_DATA_SIZE - 1) / SPIFFS_PAGE_DATA_SIZE; - struct mmap_desc *desc = alloc_mmap_desc(); - (void) addr; - (void) prot; - (void) flags; - (void) offset; - - if (len == 0) { - return NULL; - } - - if (desc == NULL) { - LOG(LL_ERROR, ("cannot allocate mmap desc")); - return MAP_FAILED; - } - - cur_mmap_desc = desc; - desc->pages = 0; - desc->blocks = (uint32_t *) calloc(sizeof(uint32_t), pages); - if (desc->blocks == NULL) { - LOG(LL_ERROR, ("Out of memory")); - return MAP_FAILED; - } - desc->base = MMAP_ADDR_FROM_DESC(desc); - - { - spiffs *fs; - fd = esp_translate_fd(fd, &fs); - if (fd < 0) { - LOG(LL_ERROR, ("Failed to translate fd: %d", fd)); - return NULL; - } - - int32_t t; - t = SPIFFS_read(fs, fd, DUMMY_MMAP_BUFFER_START, len); - if (t != (int32_t)len) { - LOG(LL_ERROR, ("Spiffs dummy read failed: expected len: %d, actual: %d", - len, t)); - return NULL; - } - /* - * this breaks the posix-like mmap abstraction but file descriptors are a - * scarse resource here. - */ - t = SPIFFS_close(fs, fd); - if (t != 0) { - LOG(LL_ERROR, ("Failed to close descr after dummy read: %d", t)); - return NULL; - } - } - - return desc->base; -} - -int munmap(void *addr, size_t len) { - size_t i; - size_t descs_cnt = mmap_descs_mbuf.len / sizeof(struct mmap_desc); - - (void) len; - - if (addr != NULL) { - for (i = 0; i < descs_cnt; i++) { - if (mmap_descs[i].base == addr) { - free(mmap_descs[i].blocks); - memset(&mmap_descs[i], 0, sizeof(mmap_descs[i])); - return 0; - } - } - } - - /* didn't find the mapping with the given addr */ - LOG(LL_ERROR, ("Didn't find the mapping for the addr %p", addr)); - return -1; -} - -/* - * Relocate mmapped pages. - */ -void esp_spiffs_on_page_move_hook(spiffs *fs, spiffs_file fh, - spiffs_page_ix src_pix, - spiffs_page_ix dst_pix) { - size_t i, j; - (void) fh; - uint32_t fbase = FLASH_BASE(fs); - size_t descs_cnt = mmap_descs_mbuf.len / sizeof(struct mmap_desc); - for (i = 0; i < descs_cnt; i++) { - if (mmap_descs[i].blocks) { - for (j = 0; j < mmap_descs[i].pages; j++) { - uint32_t addr = mmap_descs[i].blocks[j]; - uint32_t page = SPIFFS_PADDR_TO_PAGE(fs, addr - fbase); - if (page == src_pix) { - int delta = (int) dst_pix - (int) src_pix; - mmap_descs[i].blocks[j] += delta * LOG_PAGE_SIZE; - } - } - } - } -} - -int esp_spiffs_dummy_read(spiffs *fs, u32_t addr, u32_t size, u8_t *dst) { - (void) fs; - (void) size; - - if (dst >= DUMMY_MMAP_BUFFER_START && dst < DUMMY_MMAP_BUFFER_END) { - if ((addr - SPIFFS_PAGE_HEADER_SIZE) % LOG_PAGE_SIZE == 0) { - addr &= MMAP_ADDR_MASK; - cur_mmap_desc->blocks[cur_mmap_desc->pages++] = FLASH_BASE(fs) + addr; - } - return 1; - } - - return 0; -} - -void esp_mmap_init(void) { - mbuf_init(&mmap_descs_mbuf, 0); -} - -#endif /* CS_MMAP */ diff --git a/common/platforms/esp/src/esp_mmap.h b/common/platforms/esp/src/esp_mmap.h deleted file mode 100644 index 9965228..0000000 --- a/common/platforms/esp/src/esp_mmap.h +++ /dev/null @@ -1,71 +0,0 @@ -/* - * Copyright (c) 2014-2016 Cesanta Software Limited - * All rights reserved - */ - -#ifndef CS_COMMON_PLATFORMS_ESP_SRC_ESP_MMAP_H_ -#define CS_COMMON_PLATFORMS_ESP_SRC_ESP_MMAP_H_ - -#include - -#include "common/spiffs/spiffs.h" -#include "common/platform.h" - -/* - * Platform-dependent header should define the following macros: - * - * - MMAP_BASE: base address for mmapped points; e.g. ((void *) 0x10000000) - * - MMAP_END: end address for mmapped points; e.g. ((void *) 0x20000000) - * - * So with the example values given above, the range 0x10000000 - 0x20000000 is - * used for all mmapped areas. We need to partition it further, by choosing the - * optimal tradeoff between the max number of mmapped areas and the max size - * of the mmapped area. Within the example range, we have 28 bits, and we - * need to define two more macros which will define how these bits are used: - * - * - MMAP_ADDR_BITS: how many bits are used for the address within each - * mmapped area; - * - MMAP_NUM_BITS: how many bits are used for the number of mmapped area. - */ - -#if CS_PLATFORM == CS_P_ESP32 -#include "fw/platforms/esp32/src/esp32_fs.h" -#include "fw/platforms/esp32/src/esp32_mmap.h" -#elif CS_PLATFORM == CS_P_ESP8266 -#include "fw/platforms/esp8266/src/esp8266_mmap.h" -#include "fw/platforms/esp8266/src/esp_fs.h" -#else -#error unsupported CS_PLATFORM: only esp32 and esp8266 are supported -#endif - -#ifdef CS_MMAP - -#define MMAP_NUM_MASK ((1 << MMAP_NUM_BITS) - 1) - -#define MMAP_DESC_FROM_ADDR(addr) \ - (&mmap_descs[(((uintptr_t) addr) >> MMAP_ADDR_BITS) & MMAP_NUM_MASK]) -#define MMAP_ADDR_FROM_DESC(desc) \ - ((void *) ((uintptr_t) MMAP_BASE | ((desc - mmap_descs) << MMAP_ADDR_BITS))) - -struct mmap_desc { - void *base; - uint32_t pages; - uint32_t *blocks; /* pages long */ -}; - -extern struct mmap_desc *mmap_descs; - -IRAM NOINSTR int esp_mmap_exception_handler(uint32_t vaddr, uint8_t *pc, - long *pa2); -int esp_spiffs_dummy_read(spiffs *fs, u32_t addr, u32_t size, u8_t *dst); - -/* - * Arch-dependent: translates vfs file descriptor from vfs to a spiffs file - * descriptor; also returns an instance of spiffs through the pointer. - */ -int esp_translate_fd(int fd, spiffs **pfs); - -void esp_mmap_init(void); - -#endif /* CS_MMAP */ -#endif /* CS_COMMON_PLATFORMS_ESP_SRC_ESP_MMAP_H_ */ diff --git a/common/platforms/esp/stub_flasher.c b/common/platforms/esp/stub_flasher.c deleted file mode 100644 index f1ad80d..0000000 --- a/common/platforms/esp/stub_flasher.c +++ /dev/null @@ -1,399 +0,0 @@ -/* - * Copyright (c) 2014-2016 Cesanta Software Limited - * All rights reserved - * - * Spiffy flasher. Implements strong checksums (MD5) and can use higher - * baud rates. Actual max baud rate will differe from device to device, - * but 921K seems to be common. - * - * SLIP protocol is used for communication. - * First packet is a single byte - command number. - * After that, a packet with a variable number of 32-bit (LE) arguments, - * depending on command. - * - * Then command produces variable number of packets of output, but first - * packet of length 1 is the response code: 0 for success, non-zero - error. - * - * See individual command description below. - */ - -#include "stub_flasher.h" - -#include -#include - -#include "rom_functions.h" - -#if defined(ESP8266) -#include "eagle_soc.h" -#include "ets_sys.h" -#elif defined(ESP32) -#include "soc/uart_reg.h" -#endif - -#include "slip.h" -#include "uart.h" - -/* Param: baud rate. */ -uint32_t params[1] __attribute__((section(".params"))); - -#define FLASH_BLOCK_SIZE 65536 -#define FLASH_SECTOR_SIZE 4096 -#define FLASH_PAGE_SIZE 256 - -/* These consts should be in sync with flasher_client.go */ -#define UART_BUF_SIZE (8 * FLASH_SECTOR_SIZE) -#define FLASH_WRITE_SIZE FLASH_SECTOR_SIZE - -#define UART_RX_INTS (UART_RXFIFO_FULL_INT_ENA | UART_RXFIFO_TOUT_INT_ENA) - -extern uint32_t _bss_start, _bss_end; - -#ifdef ESP8266 -#define REG_SPI_BASE(i) (0x60000200 - i * 0x100) - -#define SPI_CMD_REG(i) (REG_SPI_BASE(i) + 0x0) -#define SPI_FLASH_RDID (BIT(28)) - -#define SPI_W0_REG(i) (REG_SPI_BASE(i) + 0x40) -#endif - -int do_flash_erase(uint32_t addr, uint32_t len) { - if (addr % FLASH_SECTOR_SIZE != 0) return 0x32; - if (len % FLASH_SECTOR_SIZE != 0) return 0x33; - if (SPIUnlock() != 0) return 0x34; - - while (len > 0 && (addr % FLASH_BLOCK_SIZE != 0)) { - if (SPIEraseSector(addr / FLASH_SECTOR_SIZE) != 0) return 0x35; - len -= FLASH_SECTOR_SIZE; - addr += FLASH_SECTOR_SIZE; - } - - while (len > FLASH_BLOCK_SIZE) { - if (SPIEraseBlock(addr / FLASH_BLOCK_SIZE) != 0) return 0x36; - len -= FLASH_BLOCK_SIZE; - addr += FLASH_BLOCK_SIZE; - } - - while (len > 0) { - if (SPIEraseSector(addr / FLASH_SECTOR_SIZE) != 0) return 0x37; - len -= FLASH_SECTOR_SIZE; - addr += FLASH_SECTOR_SIZE; - } - - return 0; -} - -struct uart_buf { - uint8_t data[UART_BUF_SIZE]; - uint32_t nr; - uint8_t *pr, *pw; -}; - -uint32_t ccount(void) { - uint32_t r; - __asm volatile("rsr.ccount %0" : "=a"(r)); - return r; -} - -struct write_progress { - uint32_t num_written; - uint32_t buf_level; -}; - -struct write_result { - uint32_t wait_time; - uint32_t write_time; - uint32_t erase_time; - uint32_t total_time; - uint8_t digest[16]; -}; - -static struct uart_buf ub; - -void uart_isr(void *arg) { - uint32_t int_st = READ_PERI_REG(UART_INT_ST_REG(0)); - uint8_t fifo_len; - while ((fifo_len = READ_PERI_REG(UART_STATUS_REG(0))) > 0 && - ub.nr < UART_BUF_SIZE) { - while (fifo_len-- > 0 && ub.nr < UART_BUF_SIZE) { - uint8_t byte = READ_PERI_REG(UART_FIFO_REG(0)); - *ub.pw++ = byte; - ub.nr++; - if (ub.pw >= ub.data + UART_BUF_SIZE) ub.pw = ub.data; - } - } - WRITE_PERI_REG(UART_INT_CLR_REG(0), int_st); - (void) arg; -} - -int do_flash_write(uint32_t addr, uint32_t len, uint32_t erase) { - uint32_t num_erased = 0; - struct MD5Context ctx; - MD5Init(&ctx); - - if (addr % FLASH_SECTOR_SIZE != 0) return 0x32; - if (len % FLASH_SECTOR_SIZE != 0) return 0x33; - if (SPIUnlock() != 0) return 0x34; - - ub.nr = 0; - ub.pr = ub.pw = ub.data; - ets_isr_attach(ETS_UART0_INUM, uart_isr, &ub); - uint32_t saved_conf1 = READ_PERI_REG(UART_CONF1_REG(0)); - /* Reduce frequency of UART interrupts */ - WRITE_PERI_REG(UART_CONF1_REG(0), UART_RX_TOUT_EN | - (20 << UART_RX_TOUT_THRHD_S) | - (100 << UART_RXFIFO_FULL_THRHD_S)); - SET_PERI_REG_MASK(UART_INT_ENA_REG(0), UART_RX_INTS); - ets_isr_unmask(1 << ETS_UART0_INUM); - - struct write_result wr; - memset(&wr, 0, sizeof(wr)); - - struct write_progress wp = {.num_written = 0, .buf_level = ub.nr}; - SLIP_send(&wp, sizeof(wp)); - wr.total_time = ccount(); - while (wp.num_written < len) { - volatile uint32_t *nr = &ub.nr; - /* Prepare the space ahead. */ - uint32_t start_count = ccount(); - while (erase && num_erased < wp.num_written + FLASH_WRITE_SIZE) { - const uint32_t num_left = (len - num_erased); - if (num_left >= FLASH_BLOCK_SIZE && addr % FLASH_BLOCK_SIZE == 0) { - if (SPIEraseBlock(addr / FLASH_BLOCK_SIZE) != 0) return 0x35; - num_erased += FLASH_BLOCK_SIZE; - } else { - /* len % FLASH_SECTOR_SIZE == 0 is enforced, no further checks needed */ - if (SPIEraseSector(addr / FLASH_SECTOR_SIZE) != 0) return 0x36; - num_erased += FLASH_SECTOR_SIZE; - } - } - wr.erase_time += ccount() - start_count; - start_count = ccount(); - /* Wait for data to arrive. */ - wp.buf_level = *nr; - while (*nr < FLASH_WRITE_SIZE) { - } - wr.wait_time += ccount() - start_count; - MD5Update(&ctx, ub.pr, FLASH_WRITE_SIZE); - start_count = ccount(); - if (SPIWrite(addr, (uint32_t *) ub.pr, FLASH_WRITE_SIZE) != 0) return 0x37; - wr.write_time += ccount() - start_count; - ets_intr_lock(); - *nr -= FLASH_WRITE_SIZE; - ets_intr_unlock(); - addr += FLASH_WRITE_SIZE; - ub.pr += FLASH_WRITE_SIZE; - if (ub.pr >= ub.data + UART_BUF_SIZE) ub.pr = ub.data; - wp.num_written += FLASH_WRITE_SIZE; - SLIP_send(&wp, sizeof(wp)); - } - - ets_isr_mask(1 << ETS_UART0_INUM); - WRITE_PERI_REG(UART_CONF1_REG(0), saved_conf1); - MD5Final(wr.digest, &ctx); - - wr.total_time = ccount() - wr.total_time; - SLIP_send(&wr, sizeof(wr)); - - return 0; -} - -int do_flash_read(uint32_t addr, uint32_t len, uint32_t block_size, - uint32_t max_in_flight) { - uint8_t buf[FLASH_SECTOR_SIZE]; - uint8_t digest[16]; - struct MD5Context ctx; - uint32_t num_sent = 0, num_acked = 0; - if (block_size > sizeof(buf)) return 0x52; - MD5Init(&ctx); - while (num_acked < len) { - while (num_sent < len && num_sent - num_acked < max_in_flight) { - uint32_t n = len - num_sent; - if (n > block_size) n = block_size; - if (SPIRead(addr, (uint32_t *) buf, n) != 0) return 0x53; - send_packet(buf, n); - MD5Update(&ctx, buf, n); - addr += n; - num_sent += n; - } - { - if (SLIP_recv(&num_acked, sizeof(num_acked)) != 4) return 0x54; - if (num_acked > num_sent) return 0x55; - } - } - MD5Final(digest, &ctx); - send_packet(digest, sizeof(digest)); - return 0; -} - -int do_flash_digest(uint32_t addr, uint32_t len, uint32_t digest_block_size) { - uint8_t buf[FLASH_SECTOR_SIZE]; - uint8_t digest[16]; - uint32_t read_block_size = - digest_block_size ? digest_block_size : sizeof(buf); - struct MD5Context ctx; - if (digest_block_size > sizeof(buf)) return 0x62; - MD5Init(&ctx); - while (len > 0) { - uint32_t n = len; - struct MD5Context block_ctx; - MD5Init(&block_ctx); - if (n > read_block_size) n = read_block_size; - if (SPIRead(addr, (uint32_t *) buf, n) != 0) return 0x63; - MD5Update(&ctx, buf, n); - if (digest_block_size > 0) { - MD5Update(&block_ctx, buf, n); - MD5Final(digest, &block_ctx); - send_packet(digest, sizeof(digest)); - } - addr += n; - len -= n; - } - MD5Final(digest, &ctx); - send_packet(digest, sizeof(digest)); - return 0; -} - -int do_flash_read_chip_id(void) { - uint32_t chip_id = 0; - WRITE_PERI_REG(SPI_CMD_REG(0), SPI_FLASH_RDID); - while (READ_PERI_REG(SPI_CMD_REG(0)) & SPI_FLASH_RDID) { - } - chip_id = READ_PERI_REG(SPI_W0_REG(0)) & 0xFFFFFF; - send_packet((uint8_t *) &chip_id, sizeof(chip_id)); - return 0; -} - -uint8_t cmd_loop(void) { - uint8_t cmd; - do { - uint32_t args[4]; - uint32_t len = SLIP_recv(&cmd, 1); - if (len != 1) { - continue; - } - uint8_t resp = 0xff; - switch (cmd) { - case CMD_FLASH_ERASE: { - len = SLIP_recv(args, sizeof(args)); - if (len == 8) { - resp = do_flash_erase(args[0] /* addr */, args[1] /* len */); - } else { - resp = 0x31; - } - break; - } - case CMD_FLASH_WRITE: { - len = SLIP_recv(args, sizeof(args)); - if (len == 12) { - resp = do_flash_write(args[0] /* addr */, args[1] /* len */, - args[2] /* erase */); - } else { - resp = 0x41; - } - break; - } - case CMD_FLASH_READ: { - len = SLIP_recv(args, sizeof(args)); - if (len == 16) { - resp = do_flash_read(args[0] /* addr */, args[1], /* len */ - args[2] /* block_size */, - args[3] /* max_in_flight */); - } else { - resp = 0x51; - } - break; - } - case CMD_FLASH_DIGEST: { - len = SLIP_recv(args, sizeof(args)); - if (len == 12) { - resp = do_flash_digest(args[0] /* addr */, args[1], /* len */ - args[2] /* digest_block_size */); - } else { - resp = 0x61; - } - break; - } - case CMD_FLASH_READ_CHIP_ID: { - resp = do_flash_read_chip_id(); - break; - } - case CMD_FLASH_ERASE_CHIP: { - resp = SPIEraseChip(); - break; - } - case CMD_BOOT_FW: - case CMD_REBOOT: { - resp = 0; - SLIP_send(&resp, 1); - return cmd; - } - } - SLIP_send(&resp, 1); - } while (cmd != CMD_BOOT_FW && cmd != CMD_REBOOT); - return cmd; -} - -void stub_main(void) { - uint32_t baud_rate = params[0]; - uint32_t greeting = 0x4941484f; /* OHAI */ - uint8_t last_cmd; - - /* This points at us right now, reset for next boot. */ - ets_set_user_start(0); - - memset(&_bss_start, 0, (&_bss_end - &_bss_start)); - -/* Selects SPI functions for flash pins. */ -#if defined(ESP8266) - SelectSpiFunction(); - SET_PERI_REG_MASK(0x3FF00014, 1); /* Switch to 160 MHz */ -#elif defined(ESP32) - spi_flash_attach(0, 0); -#endif - - SPIParamCfg(0, 16 * 1024 * 1024, FLASH_BLOCK_SIZE, FLASH_SECTOR_SIZE, - FLASH_PAGE_SIZE, 0xffff); - - if (baud_rate > 0) { - ets_delay_us(10000); - set_baud_rate(0, baud_rate); - } - - /* Give host time to get ready too. */ - ets_delay_us(50000); - - SLIP_send(&greeting, 4); - - last_cmd = cmd_loop(); - - ets_delay_us(10000); - - if (last_cmd == CMD_BOOT_FW) { -#if defined(ESP8266) - /* - * Find the return address in our own stack and change it. - * "flash_finish" it gets to the same point, except it doesn't need to - * patch up its RA: it returns from UartDwnLdProc, then from f_400011ac, - * then jumps to 0x4000108a, then checks strapping bits again (which will - * not have changed), and then proceeds to 0x400010a8. - */ - volatile uint32_t *sp = &baud_rate; - while (*sp != (uint32_t) 0x40001100) sp++; - *sp = 0x400010a8; - /* - * The following dummy asm fragment acts as a barrier, to make sure function - * epilogue, including return address loading, is added after our stack - * patching. - */ - __asm volatile("nop.n"); - return; /* To 0x400010a8 */ -#elif defined(ESP32) -/* TODO(rojer) */ -#endif - } else { - software_reset(); - } - /* Not reached */ -} diff --git a/common/platforms/esp32/rom/ESP32_ROM.txt b/common/platforms/esp32/rom/ESP32_ROM.txt deleted file mode 100644 index 632f09a..0000000 --- a/common/platforms/esp32/rom/ESP32_ROM.txt +++ /dev/null @@ -1,172789 +0,0 @@ - -rom.elf: file format elf32-xtensa-le - - -Disassembly of section .text: - -40000000 <_start>: -40000000: 49c500 s32e a0, a5, -16 -40000003: 49d510 s32e a1, a5, -12 -40000006: 49e520 s32e a2, a5, -8 -40000009: 49f530 s32e a3, a5, -4 -4000000c: 003400 rfwo - ... - -40000010 <_xtos_alloca_handler>: -40000010: 4128 l32i.n a2, a1, 16 -40000012: 5138 l32i.n a3, a1, 20 -40000014: 6148 l32i.n a4, a1, 24 -40000016: 01d112 addmi a1, a1, 0x100 -40000019: 13d100 wsr.excsave1 a0 -4000001c: 034800 rsr.windowbase a0 -4000001f: 4080f0 rotw -1 -40000022: 03e620 rsr.ps a2 -40000025: 343820 extui a3, a2, 8, 4 -40000028: 303340 xor a3, a3, a4 -4000002b: 000846 j 40000050 <_WindowUnderflow4+0x10> - ... - -40000040 <_WindowUnderflow4>: -40000040: 09c500 l32e a0, a5, -16 -40000043: 09d510 l32e a1, a5, -12 -40000046: 09e520 l32e a2, a5, -8 -40000049: 09f530 l32e a3, a5, -4 -4000004c: 003500 rfwu -4000004f: d14000 mul16s a4, a0, a0 -40000052: 338003 lsip f0, a0, 204 -40000055: 223011 l32r a1, 3ffc8918 <_bss_end_btdm+0x89a8> -40000058: e62030 lsi f3, a0, 0x398 -4000005b: 201013 lsi f1, a0, 128 -4000005e: 74f700 extui a15, a0, 7, 8 -40000061: f0dd lsi f13, a0, 0 -40000063: e74080 lsi f8, a0, 0x39c -40000066: 5778 l32i.n a7, a7, 20 -40000068: 4080f0 rotw -1 -4000006b: 003446 j 40000140 <_WindowUnderflow12> - ... - -40000080 <_WindowOverflow8>: -40000080: 49c900 s32e a0, a9, -16 -40000083: 09d100 l32e a0, a1, -12 -40000086: 49d910 s32e a1, a9, -12 -40000089: 49e920 s32e a2, a9, -8 -4000008c: 49f930 s32e a3, a9, -4 -4000008f: 498040 s32e a4, a0, -32 -40000092: 499050 s32e a5, a0, -28 -40000095: 49a060 s32e a6, a0, -24 -40000098: 49b070 s32e a7, a0, -20 -4000009b: 003400 rfwo - ... - -400000c0 <_WindowUnderflow8>: -400000c0: 09c900 l32e a0, a9, -16 -400000c3: 09d910 l32e a1, a9, -12 -400000c6: 09e920 l32e a2, a9, -8 -400000c9: 09d170 l32e a7, a1, -12 -400000cc: 09f930 l32e a3, a9, -4 -400000cf: 098740 l32e a4, a7, -32 -400000d2: 099750 l32e a5, a7, -28 -400000d5: 09a760 l32e a6, a7, -24 -400000d8: 09b770 l32e a7, a7, -20 -400000db: 003500 rfwu - ... - -40000100 <_WindowOverflow12>: -40000100: 49cd00 s32e a0, a13, -16 -40000103: 09d100 l32e a0, a1, -12 -40000106: 49dd10 s32e a1, a13, -12 -40000109: 49ed20 s32e a2, a13, -8 -4000010c: 49fd30 s32e a3, a13, -4 -4000010f: 494040 s32e a4, a0, -48 -40000112: 495050 s32e a5, a0, -44 -40000115: 496060 s32e a6, a0, -40 -40000118: 497070 s32e a7, a0, -36 -4000011b: 498080 s32e a8, a0, -32 -4000011e: 499090 s32e a9, a0, -28 -40000121: 49a0a0 s32e a10, a0, -24 -40000124: 49b0b0 s32e a11, a0, -20 -40000127: 003400 rfwo - ... - -40000140 <_WindowUnderflow12>: -40000140: 09cd00 l32e a0, a13, -16 -40000143: 09dd10 l32e a1, a13, -12 -40000146: 09ed20 l32e a2, a13, -8 -40000149: 09d1b0 l32e a11, a1, -12 -4000014c: 09fd30 l32e a3, a13, -4 -4000014f: 094b40 l32e a4, a11, -48 -40000152: 095b50 l32e a5, a11, -44 -40000155: 096b60 l32e a6, a11, -40 -40000158: 097b70 l32e a7, a11, -36 -4000015b: 098b80 l32e a8, a11, -32 -4000015e: 099b90 l32e a9, a11, -28 -40000161: 09aba0 l32e a10, a11, -24 -40000164: 09bbb0 l32e a11, a11, -20 -40000167: 003500 rfwu -4000016a: 480000 ssx f0, a0, a0 -4000016d: 3ffe04 lsi f0, a14, 252 - ... - -40000180 <_Level2Vector>: -40000180: 61d220 xsr.excsave2 a2 -40000183: 0002a0 jx a2 - ... - -400001c0 <_Level3Vector>: -400001c0: 61d320 xsr.excsave3 a2 -400001c3: 0002a0 jx a2 - ... - -40000200 <_Level4Vector>: -40000200: 61d420 xsr.excsave4 a2 -40000203: 0002a0 jx a2 - ... - -40000240 <_Level5Vector>: -40000240: 61d520 xsr.excsave5 a2 -40000243: 0002a0 jx a2 - ... - -40000280 <_DebugExceptionVector>: -40000280: 13d620 wsr.excsave6 a2 -40000283: 827c movi.n a2, -8 -40000285: 005100 simcall -40000288: ffff06 j 40000288 <_DebugExceptionVector+0x8> - ... - -400002c0 <_NMIExceptionVector>: -400002c0: 003710 rfi 7 - ... - -40000300 <_KernelExceptionVector>: -40000300: 004100 break 1, 0 -40000303: fffe46 j 40000300 <_KernelExceptionVector> - ... - -40000340 <_UserExceptionVector>: -40000340: ffd112 addmi a1, a1, 0xffffff00 -40000343: 4129 s32i.n a2, a1, 16 -40000345: 5139 s32i.n a3, a1, 20 -40000347: ff8931 l32r a3, 4000016c <_WindowUnderflow12+0x2c> -4000034a: 03e820 rsr.exccause a2 -4000034d: a03230 addx4 a3, a2, a3 -40000350: 0338 l32i.n a3, a3, 0 -40000352: 6149 s32i.n a4, a1, 24 -40000354: 0003a0 jx a3 - ... - -400003c0 <_DoubleExceptionVector>: -400003c0: 004140 break 1, 4 -400003c3: fffe46 j 400003c0 <_DoubleExceptionVector> - ... - -40000400 <_ResetVector>: -40000400: 001306 j 40000450 <_ResetHandler> -40000403: abab00 movltz.s f10, f11, a0 -40000406: 380000 lsi f0, a0, 224 -40000409: 3ff000 f64cmph a15, a0, a0, 3 -4000040c: ff .byte 0xff -4000040d: ff .byte 0xff -4000040e: ff .byte 0xff -4000040f: 7f .byte 0x7f -40000410: 000000 ill -40000413: 000000 ill -40000416: 1f4000 f64cmph a4, a0, a0, 1 -40000419: 222221 l32r a2, 3ffc8ca4 <_bss_end_btdm+0x8d34> -4000041c: 000000 ill -4000041f: 04c3e0 extui a12, a14, 3, 1 -40000422: f84000 lsi f0, a0, 0x3e0 -40000425: 4000d4 lsi f13, a0, 0x100 -40000428: d5c8 l32i.n a12, a5, 52 -4000042a: 544000 extui a4, a0, 0, 6 -4000042d: 0009 s32i.n a0, a0, 0 -4000042f: 0a2840 add.s f2, f8, f4 -40000432: f84000 lsi f0, a0, 0x3e0 -40000435: 000a add.n a0, a0, a0 -40000437: 064840 lsi f4, a8, 24 -4000043a: fe .byte 0xfe -4000043b: 3f .byte 0x3f -4000043c: 0c68 l32i.n a6, a12, 0 -4000043e: 4c4000 lsi f0, a0, 0x130 -40000441: 3ffe06 j 4001043d - ... - -40000450 <_ResetHandler>: -40000450: 00a002 movi a0, 0 -40000453: 13e400 wsr.intenable a0 -40000456: 03eb20 rsr.prid a2 -40000459: ffea31 l32r a3, 40000404 <_ResetVector+0x4> -4000045c: 119237 bne a2, a3, 40000471 <_ResetHandler+0x21> -4000045f: ffea31 l32r a3, 40000408 <_ResetVector+0x8> -40000462: 002332 l32i a3, a3, 0 -40000465: 0873f7 bbci a3, 31, 40000471 <_ResetHandler+0x21> -40000468: ffe921 l32r a2, 4000040c <_ResetVector+0xc> -4000046b: 103320 and a3, a3, a2 -4000046e: 0003c0 callx0 a3 -40000471: ffe721 l32r a2, 40000410 <_ResetVector+0x10> -40000474: 03eb30 rsr.prid a3 -40000477: 743030 extui a3, a3, 0, 8 -4000047a: 228c beqz.n a2, 40000480 <_ResetHandler+0x30> -4000047c: 03cc bnez.n a3, 40000480 <_ResetHandler+0x30> -4000047e: 0209 s32i.n a0, a2, 0 -40000480: ffe521 l32r a2, 40000414 <_ResetVector+0x14> -40000483: 13e720 wsr.vecbase a2 -40000486: 531c movi.n a3, 21 -40000488: 136330 wsr.atomctl a3 -4000048b: 006120 rsil a2, 1 -4000048e: ffe221 l32r a2, 40000418 <_ResetVector+0x18> -40000491: ffe251 l32r a5, 4000041c <_ResetVector+0x1c> -40000494: ffe361 l32r a6, 40000420 <_ResetVector+0x20> -40000497: 030c movi.n a3, 0 -40000499: 027d mov.n a7, a2 -4000049b: 106650 and a6, a6, a5 -4000049e: 000846 j 400004c3 <_ResetHandler+0x73> - ... -400004ad: 000000 ill -400004b0: 506340 witlb a4, a3 -400004b3: 002000 isync -400004b6: f03d nop.n -400004b8: f03d nop.n -400004ba: c03350 sub a3, a3, a5 -400004bd: 14b3b6 bltui a3, 16, 400004d5 <_ResetHandler+0x85> -400004c0: 417470 srli a7, a7, 4 -400004c3: 344070 extui a4, a7, 0, 4 -400004c6: e61367 beq a3, a6, 400004b0 <_ResetHandler+0x60> -400004c9: 506340 witlb a4, a3 -400004cc: c03350 sub a3, a3, a5 -400004cf: edb3f6 bgeui a3, 16, 400004c0 <_ResetHandler+0x70> -400004d2: 002000 isync -400004d5: ffd151 l32r a5, 4000041c <_ResetVector+0x1c> -400004d8: 030c movi.n a3, 0 -400004da: 207220 or a7, a2, a2 -400004dd: 344070 extui a4, a7, 0, 4 -400004e0: 50e340 wdtlb a4, a3 -400004e3: c03350 sub a3, a3, a5 -400004e6: 417470 srli a7, a7, 4 -400004e9: f0b3f6 bgeui a3, 16, 400004dd <_ResetHandler+0x8d> -400004ec: 002030 dsync -400004ef: 01a032 movi a3, 1 -400004f2: 036120 rsr.memctl a2 -400004f5: 202230 or a2, a2, a3 -400004f8: 136120 wsr.memctl a2 -400004fb: ffca41 l32r a4, 40000424 <_ResetVector+0x24> -400004fe: ffca51 l32r a5, 40000428 <_ResetVector+0x28> -40000501: 0468 l32i.n a6, a4, 0 -40000503: 1478 l32i.n a7, a4, 4 -40000505: 2488 l32i.n a8, a4, 8 -40000507: 3428 l32i.n a2, a4, 12 -40000509: 081226 beqi a2, 1, 40000515 <_ResetHandler+0xc5> -4000050c: 03eb20 rsr.prid a2 -4000050f: ffbd31 l32r a3, 40000404 <_ResetVector+0x4> -40000512: 0a1237 beq a2, a3, 40000520 <_ResetHandler+0xd0> -40000515: 0828 l32i.n a2, a8, 0 -40000517: 0629 s32i.n a2, a6, 0 -40000519: 664b addi.n a6, a6, 4 -4000051b: 884b addi.n a8, a8, 4 -4000051d: f43677 bltu a6, a7, 40000515 <_ResetHandler+0xc5> -40000520: 10c442 addi a4, a4, 16 -40000523: da3457 bltu a4, a5, 40000501 <_ResetHandler+0xb1> -40000526: 002000 isync -40000529: 110c movi.n a1, 1 -4000052b: 134910 wsr.windowstart a1 -4000052e: 134800 wsr.windowbase a0 -40000531: 002010 rsync -40000534: 000c movi.n a0, 0 -40000536: ffbd41 l32r a4, 4000042c <_ResetVector+0x2c> -40000539: 13d240 wsr.excsave2 a4 -4000053c: ffbd41 l32r a4, 40000430 <_ResetVector+0x30> -4000053f: 13d340 wsr.excsave3 a4 -40000542: ffbc41 l32r a4, 40000434 <_ResetVector+0x34> -40000545: 13d440 wsr.excsave4 a4 -40000548: ffbc51 l32r a5, 40000438 <_ResetVector+0x38> -4000054b: 006542 s32i a4, a5, 0 -4000054e: ffbb41 l32r a4, 4000043c <_ResetVector+0x3c> -40000551: 13d540 wsr.excsave5 a4 -40000554: ffbb51 l32r a5, 40000440 <_ResetVector+0x40> -40000557: 006542 s32i a4, a5, 0 -4000055a: 001a85 call0 40000704 <_stext+0x1a4> -4000055d: 000000 ill - -40000560 <_stext>: -40000560: fe3f20 f64iter a3, a15, a2, 3, 1 -40000563: 3f .byte 0x3f -40000564: 040020 extui a0, a2, 0, 1 -40000567: d5d000 extui a13, a0, 16, 14 -4000056a: 6c4000 lsi f0, a0, 0x1b0 -4000056d: 4000d6 bgez a0, 40000971 <_Level2FromVector+0x1d> -40000570: abab addi.n a10, a11, 10 -40000572: d40000 extui a0, a0, 0, 14 -40000575: bf .byte 0xbf -40000576: 244000 extui a4, a0, 0, 3 -40000579: 4000c0 lsi f12, a0, 0x100 -4000057c: 0de8 l32i.n a14, a13, 0 -4000057e: 484000 ssx f4, a0, a0 -40000581: 3ffe05 call0 40040564 -40000584: 0448 l32i.n a4, a4, 0 -40000586: fe .byte 0xfe -40000587: 3f .byte 0x3f -40000588: 050023 lsi f2, a0, 20 -4000058b: 000700 lsi f0, a7, 0 -4000058e: 058000 extui a8, a0, 16, 1 -40000591: 000000 ill -40000594: 000000 ill -40000597: 0650c0 lsi f12, a0, 24 -4000059a: fe .byte 0xfe -4000059b: 3f .byte 0x3f -4000059c: 000000 ill -4000059f: 065880 lsi f8, a8, 24 -400005a2: fe .byte 0xfe -400005a3: 3f .byte 0x3f -400005a4: 00c034 lsi f3, a0, 0 -400005a7: 000040 lsi f4, a0, 0 -400005aa: 0038 l32i.n a3, a0, 0 -400005ac: 0a19 s32i.n a1, a10, 0 -400005ae: 004000 break 0, 0 -400005b1: c088 l32i.n a8, a0, 48 -400005b3: ea28 l32i.n a2, a10, 56 -400005b5: 000a add.n a0, a0, a0 -400005b7: 0c6040 lsi f4, a0, 48 -400005ba: fe .byte 0xfe -400005bb: 3f .byte 0x3f -400005bc: 0648 l32i.n a4, a6, 0 -400005be: fe .byte 0xfe -400005bf: 3f .byte 0x3f -400005c0: 050024 lsi f2, a0, 20 -400005c3: 000000 ill -400005c6: c05300 sub a5, a3, a0 -400005c9: 3ffe11 l32r a1, 3ffd05c4 <_bss_end_btdm+0x10654> -400005cc: 064c movi.n a6, 64 -400005ce: fe .byte 0xfe -400005cf: 3f .byte 0x3f -400005d0: 050025 call8 400055d4 -400005d3: 000000 ill -400005d6: 008401 l32r a0, 3ffc07e8 <_bss_end_btdm+0x878> -400005d9: 0000f0 callx12 a0 -400005dc: f9c2d4 lsi f13, a2, 0x3e4 -400005df: 3f .byte 0x3f -400005e0: f96024 lsi f2, a0, 0x3e4 -400005e3: 3f .byte 0x3f -400005e4: f96000 lsi f0, a0, 0x3e4 -400005e7: 3f .byte 0x3f -400005e8: f96350 lsi f5, a3, 0x3e4 -400005eb: 3f .byte 0x3f -400005ec: 0e .byte 0xe -400005ed: 000033 lsi f3, a0, 0 -400005f0: abcd lsi f12, a11, 44 -400005f2: ff .byte 0xff -400005f3: ff .byte 0xff -400005f4: 001234 lsi f3, a2, 0 -400005f7: e66d00 lsi f0, a13, 0x398 -400005fa: ff .byte 0xff -400005fb: ff .byte 0xff -400005fc: deec bnez.n a14, 4000062d <_stext+0xcd> -400005fe: ff .byte 0xff -400005ff: ff .byte 0xff -40000600: 000001 l32r a0, 3ffc0600 <_bss_end_btdm+0x690> -40000603: 000000 ill -40000606: 2d0000 lsi f0, a0, 180 -40000609: 7f .byte 0x7f -4000060a: 2d4c95 call4 4002dad4 -4000060d: 5851f4 mula.da.ll.lddec m1, a1, m1, a15 -40000610: ff .byte 0xff -40000611: ff .byte 0xff -40000612: ff .byte 0xff -40000613: 7f .byte 0x7f -40000614: 345987 bbc a9, a8, 4000064c <_stext+0xec> -40000617: 0b5f12 s16i a1, a15, 22 -4000061a: 4e .byte 0x4e -4000061b: 0ce383 lsi f8, a3, 48 -4000061e: fe .byte 0xfe -4000061f: ff .byte 0xff -40000620: 0041a7 ball a1, a10, 40000624 <_stext+0xc4> -40000623: f4ec00 extui a14, a0, 12, 16 -40000626: ff .byte 0xff -40000627: ff .byte 0xff -40000628: ff .byte 0xff -40000629: ef .byte 0xef -4000062a: ff .byte 0xff -4000062b: ff .byte 0xff -4000062c: 001000 movsp a0, a0 -4000062f: 00ff00 lsi f0, a15, 0 -40000632: 000000 ill -40000635: ff .byte 0xff -40000636: 000000 ill -40000639: 00ff00 lsi f0, a15, 0 -4000063c: 000000 ill -4000063f: ff .byte 0xff -40000640: 404040 lsi f4, a0, 0x100 -40000643: 625440 lsi f4, a4, 0x188 -40000646: 3ff9 s32i.n a15, a15, 12 -40000648: 1f .byte 0x1f -40000649: 51eb85 call0 40052504 -4000064c: 609c beqz.n a0, 40000666 <_stext+0x106> -4000064e: 3ff9 s32i.n a15, a15, 12 -40000650: 492493 lsi f9, a4, 0x124 -40000653: ffff92 s32ri a9, a15, 0x3fc -40000656: ff .byte 0xff -40000657: 3f .byte 0x3f -40000658: 015180 slli a5, a1, 24 -4000065b: e08000 subx4 a8, a0, a0 -4000065e: 3ffa add.n a3, a15, a15 -40000660: f9c4a6 blti a4, 32, 4000065d <_stext+0xfd> -40000663: 3f .byte 0x3f -40000664: fae0a0 rsqrt0.s f14, f0 -40000667: 3f .byte 0x3f -40000668: fae0a4 lsi f10, a0, 0x3e8 -4000066b: 3f .byte 0x3f -4000066c: fae030 const.s f14, 0 -4000066f: 3f .byte 0x3f -40000670: c4a9 s32i.n a10, a4, 48 -40000672: 3ff9 s32i.n a15, a15, 12 -40000674: fae084 lsi f8, a0, 0x3e8 -40000677: 3f .byte 0x3f -40000678: c4ad lsi f10, a4, 16 -4000067a: 3ff9 s32i.n a15, a15, 12 -4000067c: fae093 lsi f9, a0, 0x3e8 -4000067f: 3f .byte 0x3f -40000680: f9c4d0 lsi f13, a4, 0x3e4 -40000683: 3f .byte 0x3f -40000684: e088 l32i.n a8, a0, 56 -40000686: 3ffa add.n a3, a15, a15 -40000688: fff1f0 f64cmph a15, a1, a15, 15 -4000068b: ff .byte 0xff -4000068c: c4bc beqz.n a4, 400006cc <_stext+0x16c> -4000068e: 3ff9 s32i.n a15, a15, 12 -40000690: cf .byte 0xcf -40000691: 3ff9c4 lsi f12, a9, 252 -40000694: 1fec bnez.n a15, 400006b9 <_stext+0x159> -40000696: 184000 lsxp f4, a0, a0 -40000699: 400011 l32r a1, 3ffd069c <_bss_end_btdm+0x1072c> -4000069c: 001150 movsp a5, a1 -4000069f: 118440 slli a8, a4, 12 -400006a2: b84000 lsi f0, a0, 0x2e0 -400006a5: 400011 l32r a1, 3ffd06a8 <_bss_end_btdm+0x10738> -400006a8: fae0b0 nexp01.s f14, f0 -400006ab: 3f .byte 0x3f -400006ac: e0ac beqz.n a0, 400006de <_stext+0x17e> -400006ae: 3ffa add.n a3, a15, a15 -400006b0: e0a8 l32i.n a10, a0, 56 -400006b2: 3ffa add.n a3, a15, a15 -400006b4: 1d48 l32i.n a4, a13, 4 -400006b6: 584000 ssxp f4, a0, a0 -400006b9: 001d mov.n a1, a0 -400006bb: 1d7040 lsi f4, a0, 116 -400006be: b44000 extui a4, a0, 0, 12 -400006c1: 3ffae0 f64cmph a15, a10, a14, 3 -400006c4: e038 l32i.n a3, a0, 56 -400006c6: 3ffa add.n a3, a15, a15 -400006c8: e0b8 l32i.n a11, a0, 56 -400006ca: 3ffa add.n a3, a15, a15 -400006cc: 6498 l32i.n a9, a4, 24 -400006ce: 3ff9 s32i.n a15, a15, 12 -400006d0: 6478 l32i.n a7, a4, 24 -400006d2: 3ff9 s32i.n a15, a15, 12 -400006d4: 6458 l32i.n a5, a4, 24 -400006d6: 3ff9 s32i.n a15, a15, 12 -400006d8: 800000 add a0, a0, a0 -400006db: 7f .byte 0x7f -400006dc: 400000 ssr a0 -400006df: ffff00 f64cmph a15, a15, a0, 15 -400006e2: ff .byte 0xff -400006e3: 000000 ill -400006e6: 007ff0 sddr32.p a15 -400006e9: 000800 lsi f0, a8, 0 -400006ec: ff .byte 0xff -400006ed: ff .byte 0xff -400006ee: 1f .byte 0x1f -400006ef: 000000 ill -400006f2: 443800 extui a3, a0, 8, 5 -400006f5: 3ff965 call8 4004068c -400006f8: 006996 bltz a9, 40000702 <_stext+0x1a2> -400006fb: c2b400 quou a11, a4, a0 -400006fe: 3ff9 s32i.n a15, a15, 12 -40000700: c01c movi.n a0, 28 -40000702: 0c4000 lsi f0, a0, 48 -40000705: 961100 lsi f0, a1, 0x258 -40000708: ff .byte 0xff -40000709: ff9631 l32r a3, 40000564 <_stext+0x4> -4000070c: 13e630 wsr.ps a3 -4000070f: 002010 rsync -40000712: ff9561 l32r a6, 40000568 <_stext+0x8> -40000715: ff9571 l32r a7, 4000056c <_stext+0xc> -40000718: 000c movi.n a0, 0 -4000071a: 0648 l32i.n a4, a6, 0 -4000071c: 1658 l32i.n a5, a6, 4 -4000071e: 2638 l32i.n a3, a6, 8 -40000720: 111326 beqi a3, 1, 40000735 <_stext+0x1d5> -40000723: 03eb20 rsr.prid a2 -40000726: ff9231 l32r a3, 40000570 <_stext+0x10> -40000729: 0b1237 beq a2, a3, 40000738 <_stext+0x1d8> -4000072c: 000146 j 40000735 <_stext+0x1d5> -4000072f: 090000 l32e a0, a0, -64 -40000732: 444b04 lsi f0, a11, 0x110 -40000735: f83457 bltu a4, a5, 40000731 <_stext+0x1d1> -40000738: 66cb addi.n a6, a6, 12 -4000073a: dc3677 bltu a6, a7, 4000071a <_stext+0x1ba> -4000073d: 06f855 call4 400076c4 -40000740: 120c movi.n a2, 1 -40000742: 005100 simcall -40000745: 0041f0 break 1, 15 -40000748: fffd06 j 40000740 <_stext+0x1e0> - ... - -4000074c <_xtos_set_exception_handler>: -4000074c: 004136 entry a1, 32 -4000074f: f83c movi.n a8, 63 -40000751: 03b827 bgeu a8, a2, 40000758 <_xtos_set_exception_handler+0xc> -40000754: 020c movi.n a2, 0 -40000756: f01d retw.n -40000758: ff8aa1 l32r a10, 40000580 <_stext+0x20> -4000075b: 1182e0 slli a8, a2, 2 -4000075e: 23ac beqz.n a3, 40000784 <_xtos_set_exception_handler+0x38> -40000760: ff8591 l32r a9, 40000574 <_stext+0x14> -40000763: 2a8a add.n a2, a10, a8 -40000765: 002222 l32i a2, a2, 0 -40000768: ff85b1 l32r a11, 4000057c <_stext+0x1c> -4000076b: 059397 bne a3, a9, 40000774 <_xtos_set_exception_handler+0x28> -4000076e: ff82b1 l32r a11, 40000578 <_stext+0x18> -40000771: 203990 or a3, a9, a9 -40000774: ff84c1 l32r a12, 40000584 <_stext+0x24> -40000777: aa8a add.n a10, a10, a8 -40000779: 8c8a add.n a8, a12, a8 -4000077b: 08b9 s32i.n a11, a8, 0 -4000077d: 0a39 s32i.n a3, a10, 0 -4000077f: d11297 beq a2, a9, 40000754 <_xtos_set_exception_handler+0x8> -40000782: f01d retw.n -40000784: 2a8a add.n a2, a10, a8 -40000786: 0228 l32i.n a2, a2, 0 -40000788: ff7b91 l32r a9, 40000574 <_stext+0x14> -4000078b: fff7c6 j 4000076e <_xtos_set_exception_handler+0x22> - ... - -40000790 <_xtos_syscall_handler>: -40000790: 03b130 rsr.epc1 a3 -40000793: 030120 rsr.lend a2 -40000796: 333b addi.n a3, a3, 3 -40000798: 0c9237 bne a2, a3, 400007a8 <_xtos_syscall_handler+0x18> -4000079b: 030220 rsr.lcount a2 -4000079e: 628c beqz.n a2, 400007a8 <_xtos_syscall_handler+0x18> -400007a0: 220b addi.n a2, a2, -1 -400007a2: 130220 wsr.lcount a2 -400007a5: 030030 rsr.lbeg a3 -400007a8: 4128 l32i.n a2, a1, 16 -400007aa: 13b130 wsr.epc1 a3 -400007ad: 5138 l32i.n a3, a1, 20 -400007af: 056256 bnez a2, 40000809 <_SyscallException+0x3a> -400007b2: 396132 s32i a3, a1, 228 -400007b5: 3a6142 s32i a4, a1, 232 -400007b8: 3b6152 s32i a5, a1, 236 -400007bb: ff7331 l32r a3, 40000588 <_stext+0x28> -400007be: 03e620 rsr.ps a2 -400007c1: 13e630 wsr.ps a3 -400007c4: 03b130 rsr.epc1 a3 -400007c7: 01d112 addmi a1, a1, 0x100 -400007ca: 002010 rsync -400007cd: 040c movi.n a4, 0 - -400007cf <_SyscallException>: -400007cf: 008136 entry a1, 64 -400007d2: 0001f5 call12 400007f0 <_SyscallException+0x21> -400007d5: ff6de1 l32r a14, 4000058c <_stext+0x2c> -400007d8: 0cea add.n a0, a12, a14 -400007da: f01d retw.n -400007dc: 13e620 wsr.ps a2 -400007df: 020c movi.n a2, 0 -400007e1: a548 l32i.n a4, a5, 40 -400007e3: 002010 rsync -400007e6: 13b130 wsr.epc1 a3 -400007e9: 9538 l32i.n a3, a5, 36 -400007eb: b558 l32i.n a5, a5, 44 -400007ed: 003000 rfe -400007f0: 006136 entry a1, 48 -400007f3: ff67c1 l32r a12, 40000590 <_stext+0x30> -400007f6: c0ca add.n a12, a0, a12 -400007f8: 006136 entry a1, 48 -400007fb: 00cd mov.n a12, a0 -400007fd: 006136 entry a1, 48 -40000800: 00cd mov.n a12, a0 -40000802: 002136 entry a1, 16 -40000805: 0bbd mov.n a11, a11 -40000807: f01d retw.n -40000809: f27c movi.n a2, -1 -4000080b: 01d112 addmi a1, a1, 0x100 -4000080e: 003000 rfe -40000811: 000000 ill - -40000814 <_xtos_l1int_handler>: -40000814: 7159 s32i.n a5, a1, 28 -40000816: ff5c21 l32r a2, 40000588 <_stext+0x28> -40000819: 03b130 rsr.epc1 a3 -4000081c: 61e620 xsr.ps a2 -4000081f: 0139 s32i.n a3, a1, 0 -40000821: 1129 s32i.n a2, a1, 4 -40000823: 3b2122 l32i a2, a1, 236 -40000826: 01d112 addmi a1, a1, 0x100 -40000829: 002010 rsync -4000082c: ff5a41 l32r a4, 40000594 <_stext+0x34> -4000082f: 203430 or a3, a4, a3 -40000832: 904430 addx2 a4, a4, a3 - -40000835 <_LevelOneInterrupt>: -40000835: 020136 entry a1, 0x100 -40000838: 0061f0 rsil a15, 1 -4000083b: ff57e1 l32r a14, 40000598 <_stext+0x38> -4000083e: 03e2f0 rsr.interrupt a15 -40000841: 03e4c0 rsr.intenable a12 -40000844: 1ed8 l32i.n a13, a14, 4 -40000846: 10ffc0 and a15, a15, a12 -40000849: 0303c0 rsr.sar a12 -4000084c: 31d9 s32i.n a13, a1, 12 -4000084e: 092f16 beqz a15, 400008e4 <_LevelOneInterrupt+0xaf> -40000851: 21c9 s32i.n a12, a1, 8 -40000853: 8129 s32i.n a2, a1, 32 -40000855: ffaf22 movi a2, -1 -40000858: 40ffc0 nsau a12, a15 -4000085b: ff50f1 l32r a15, 4000059c <_stext+0x3c> -4000085e: 400c00 ssr a12 -40000861: 91f0f0 srl a15, a15 -40000864: 3022f0 xor a2, a2, a15 -40000867: ff4ed1 l32r a13, 400005a0 <_stext+0x40> -4000086a: 13e3f0 wsr.intclear a15 -4000086d: b0ccd0 addx8 a12, a12, a13 -40000870: 402cd2 l32i a13, a12, 0x100 -40000873: 0066f0 rsil a15, 6 -40000876: 0ef8 l32i.n a15, a14, 0 -40000878: 1ed9 s32i.n a13, a14, 4 -4000087a: 10ffd0 and a15, a15, a13 -4000087d: 13e4f0 wsr.intenable a15 -40000880: 002010 rsync -40000883: 0060f0 rsil a15, 0 -40000886: 0302d0 rsr.lcount a13 -40000889: 0300f0 rsr.lbeg a15 -4000088c: 91d9 s32i.n a13, a1, 36 -4000088e: 0301d0 rsr.lend a13 -40000891: a1f9 s32i.n a15, a1, 40 -40000893: b1d9 s32i.n a13, a1, 44 -40000895: 0310d0 rsr.acclo a13 -40000898: 0311f0 rsr.acchi a15 -4000089b: c1d9 s32i.n a13, a1, 48 -4000089d: d1f9 s32i.n a15, a1, 52 -4000089f: 0cd8 l32i.n a13, a12, 0 -400008a1: 01fd mov.n a15, a1 -400008a3: 012ce2 l32i a14, a12, 4 -400008a6: 000df0 callx12 a13 -400008a9: 91d8 l32i.n a13, a1, 36 -400008ab: a1e8 l32i.n a14, a1, 40 -400008ad: b1f8 l32i.n a15, a1, 44 -400008af: 1302d0 wsr.lcount a13 -400008b2: 1300e0 wsr.lbeg a14 -400008b5: 1301f0 wsr.lend a15 -400008b8: c1d8 l32i.n a13, a1, 48 -400008ba: d1e8 l32i.n a14, a1, 52 -400008bc: 1310d0 wsr.acclo a13 -400008bf: 1311e0 wsr.acchi a14 -400008c2: ff35e1 l32r a14, 40000598 <_stext+0x38> -400008c5: 03e2f0 rsr.interrupt a15 -400008c8: 0066d0 rsil a13, 6 -400008cb: 0ed8 l32i.n a13, a14, 0 -400008cd: 31c8 l32i.n a12, a1, 12 -400008cf: 10ddc0 and a13, a13, a12 -400008d2: 10ffd0 and a15, a15, a13 -400008d5: 01ff56 bnez a15, 400008f8 <_LevelOneInterrupt+0xc3> -400008d8: 8128 l32i.n a2, a1, 32 -400008da: 1ec9 s32i.n a12, a14, 4 -400008dc: 21c8 l32i.n a12, a1, 8 -400008de: 13e4d0 wsr.intenable a13 -400008e1: 0063d0 rsil a13, 3 -400008e4: ff3001 l32r a0, 400005a4 <_stext+0x44> -400008e7: ff2bd1 l32r a13, 40000594 <_stext+0x34> -400008ea: 1303c0 wsr.sar a12 -400008ed: 2000d0 or a0, a0, a13 -400008f0: 900d00 addx2 a0, a13, a0 -400008f3: 0063d0 rsil a13, 3 -400008f6: f01d retw.n -400008f8: 40ffd0 nsau a13, a15 -400008fb: ff29c1 l32r a12, 400005a0 <_stext+0x40> -400008fe: b0cdc0 addx8 a12, a13, a12 -40000901: 412ce2 l32i a14, a12, 0x104 -40000904: 10ff20 and a15, a15, a2 -40000907: 10ffe0 and a15, a15, a14 -4000090a: ff23e1 l32r a14, 40000598 <_stext+0x38> -4000090d: f47f56 bnez a15, 40000858 <_LevelOneInterrupt+0x23> -40000910: ff23f1 l32r a15, 4000059c <_stext+0x3c> -40000913: 400d00 ssr a13 -40000916: 91d0f0 srl a13, a15 -40000919: 412cf2 l32i a15, a12, 0x104 -4000091c: 13e3d0 wsr.intclear a13 -4000091f: 2022f0 or a2, a2, a15 -40000922: 3022d0 xor a2, a2, a13 -40000925: ffd1c6 j 40000870 <_LevelOneInterrupt+0x3b> - -40000928 <_xtos_restore_intlevel>: -40000928: 002136 entry a1, 16 -4000092b: 13e620 wsr.ps a2 -4000092e: 002010 rsync -40000931: f01d retw.n - ... - -40000934 <_xtos_set_vpri>: -40000934: 002136 entry a1, 16 -40000937: 023d mov.n a3, a2 -40000939: ff1741 l32r a4, 40000598 <_stext+0x38> -4000093c: 006670 rsil a7, 6 -4000093f: 1428 l32i.n a2, a4, 4 -40000941: 0458 l32i.n a5, a4, 0 -40000943: 1439 s32i.n a3, a4, 4 -40000945: 105530 and a5, a5, a3 -40000948: 13e450 wsr.intenable a5 -4000094b: 13e670 wsr.ps a7 -4000094e: 002010 rsync -40000951: f01d retw.n - ... - -40000954 <_Level2FromVector>: -40000954: 61d220 xsr.excsave2 a2 -40000957: ffd112 addmi a1, a1, 0xffffff00 -4000095a: 4129 s32i.n a2, a1, 16 -4000095c: ff0b21 l32r a2, 40000588 <_stext+0x28> -4000095f: 6149 s32i.n a4, a1, 24 -40000961: 7159 s32i.n a5, a1, 28 -40000963: 13e620 wsr.ps a2 -40000966: 002010 rsync -40000969: 3b2122 l32i a2, a1, 236 -4000096c: 01d112 addmi a1, a1, 0x100 -4000096f: 03b240 rsr.epc2 a4 -40000972: ff0851 l32r a5, 40000594 <_stext+0x34> -40000975: 204540 or a4, a5, a4 -40000978: 904540 addx2 a4, a5, a4 -4000097b: 020136 entry a1, 0x100 -4000097e: 0062f0 rsil a15, 2 -40000981: 03e2f0 rsr.interrupt a15 -40000984: 03e4c0 rsr.intenable a12 -40000987: ff08d1 l32r a13, 400005a8 <_stext+0x48> -4000098a: 10ffc0 and a15, a15, a12 -4000098d: 10ffd0 and a15, a15, a13 -40000990: 0303e0 rsr.sar a14 -40000993: 06ef16 beqz a15, 40000a05 <_Level2FromVector+0xb1> -40000996: 21e9 s32i.n a14, a1, 8 -40000998: 0302d0 rsr.lcount a13 -4000099b: 0300e0 rsr.lbeg a14 -4000099e: 91d9 s32i.n a13, a1, 36 -400009a0: 0301d0 rsr.lend a13 -400009a3: a1e9 s32i.n a14, a1, 40 -400009a5: b1d9 s32i.n a13, a1, 44 -400009a7: 0310d0 rsr.acclo a13 -400009aa: 0311e0 rsr.acchi a14 -400009ad: c1d9 s32i.n a13, a1, 48 -400009af: d1e9 s32i.n a14, a1, 52 -400009b1: 60c0f0 neg a12, a15 -400009b4: 10ccf0 and a12, a12, a15 -400009b7: 13e3c0 wsr.intclear a12 -400009ba: fef9d1 l32r a13, 400005a0 <_stext+0x40> -400009bd: fe1c movi.n a14, 31 -400009bf: 40fcc0 nsau a12, a12 -400009c2: c0fec0 sub a15, a14, a12 -400009c5: 60f0f0 neg a15, a15 -400009c8: 1fcff2 addi a15, a15, 31 -400009cb: b0cfd0 addx8 a12, a15, a13 -400009ce: 0cd8 l32i.n a13, a12, 0 -400009d0: 1ce8 l32i.n a14, a12, 4 -400009d2: 20f110 or a15, a1, a1 -400009d5: 000df0 callx12 a13 -400009d8: 03e2f0 rsr.interrupt a15 -400009db: 03e4c0 rsr.intenable a12 -400009de: fef2d1 l32r a13, 400005a8 <_stext+0x48> -400009e1: 10ffc0 and a15, a15, a12 -400009e4: 10ffd0 and a15, a15, a13 -400009e7: fc6f56 bnez a15, 400009b1 <_Level2FromVector+0x5d> -400009ea: 91d8 l32i.n a13, a1, 36 -400009ec: a1e8 l32i.n a14, a1, 40 -400009ee: b1f8 l32i.n a15, a1, 44 -400009f0: 1302d0 wsr.lcount a13 -400009f3: 1300e0 wsr.lbeg a14 -400009f6: 1301f0 wsr.lend a15 -400009f9: c1d8 l32i.n a13, a1, 48 -400009fb: d1e8 l32i.n a14, a1, 52 -400009fd: 1310d0 wsr.acclo a13 -40000a00: 1311e0 wsr.acchi a14 -40000a03: 21e8 l32i.n a14, a1, 8 -40000a05: fee901 l32r a0, 400005ac <_stext+0x4c> -40000a08: fee3d1 l32r a13, 40000594 <_stext+0x34> -40000a0b: 1303e0 wsr.sar a14 -40000a0e: 2000d0 or a0, a0, a13 -40000a11: 900d00 addx2 a0, a13, a0 -40000a14: 0063e0 rsil a14, 3 -40000a17: f01d retw.n -40000a19: 3b6522 s32i a2, a5, 236 -40000a1c: 4528 l32i.n a2, a5, 16 -40000a1e: 6548 l32i.n a4, a5, 24 -40000a20: 7558 l32i.n a5, a5, 28 -40000a22: 003210 rfi 2 -40000a25: 000000 ill - -40000a28 <_Level3FromVector>: -40000a28: 61d320 xsr.excsave3 a2 -40000a2b: ffd112 addmi a1, a1, 0xffffff00 -40000a2e: 4129 s32i.n a2, a1, 16 -40000a30: fed621 l32r a2, 40000588 <_stext+0x28> -40000a33: 6149 s32i.n a4, a1, 24 -40000a35: 7159 s32i.n a5, a1, 28 -40000a37: 13e620 wsr.ps a2 -40000a3a: 002010 rsync -40000a3d: 3b2122 l32i a2, a1, 236 -40000a40: 01d112 addmi a1, a1, 0x100 -40000a43: 03b340 rsr.epc3 a4 -40000a46: fed351 l32r a5, 40000594 <_stext+0x34> -40000a49: 204540 or a4, a5, a4 -40000a4c: 904540 addx2 a4, a5, a4 -40000a4f: 020136 entry a1, 0x100 -40000a52: 0063f0 rsil a15, 3 -40000a55: 03e2f0 rsr.interrupt a15 -40000a58: 03e4c0 rsr.intenable a12 -40000a5b: fed5d1 l32r a13, 400005b0 <_stext+0x50> -40000a5e: 10ffc0 and a15, a15, a12 -40000a61: 10ffd0 and a15, a15, a13 -40000a64: 0303e0 rsr.sar a14 -40000a67: 06ef16 beqz a15, 40000ad9 <_Level3FromVector+0xb1> -40000a6a: 21e9 s32i.n a14, a1, 8 -40000a6c: 0302d0 rsr.lcount a13 -40000a6f: 0300e0 rsr.lbeg a14 -40000a72: 91d9 s32i.n a13, a1, 36 -40000a74: 0301d0 rsr.lend a13 -40000a77: a1e9 s32i.n a14, a1, 40 -40000a79: b1d9 s32i.n a13, a1, 44 -40000a7b: 0310d0 rsr.acclo a13 -40000a7e: 0311e0 rsr.acchi a14 -40000a81: c1d9 s32i.n a13, a1, 48 -40000a83: d1e9 s32i.n a14, a1, 52 -40000a85: 60c0f0 neg a12, a15 -40000a88: 10ccf0 and a12, a12, a15 -40000a8b: 13e3c0 wsr.intclear a12 -40000a8e: fec4d1 l32r a13, 400005a0 <_stext+0x40> -40000a91: fe1c movi.n a14, 31 -40000a93: 40fcc0 nsau a12, a12 -40000a96: c0fec0 sub a15, a14, a12 -40000a99: 60f0f0 neg a15, a15 -40000a9c: 1fcff2 addi a15, a15, 31 -40000a9f: b0cfd0 addx8 a12, a15, a13 -40000aa2: 0cd8 l32i.n a13, a12, 0 -40000aa4: 1ce8 l32i.n a14, a12, 4 -40000aa6: 20f110 or a15, a1, a1 -40000aa9: 000df0 callx12 a13 -40000aac: 03e2f0 rsr.interrupt a15 -40000aaf: 03e4c0 rsr.intenable a12 -40000ab2: febfd1 l32r a13, 400005b0 <_stext+0x50> -40000ab5: 10ffc0 and a15, a15, a12 -40000ab8: 10ffd0 and a15, a15, a13 -40000abb: fc6f56 bnez a15, 40000a85 <_Level3FromVector+0x5d> -40000abe: 91d8 l32i.n a13, a1, 36 -40000ac0: a1e8 l32i.n a14, a1, 40 -40000ac2: b1f8 l32i.n a15, a1, 44 -40000ac4: 1302d0 wsr.lcount a13 -40000ac7: 1300e0 wsr.lbeg a14 -40000aca: 1301f0 wsr.lend a15 -40000acd: c1d8 l32i.n a13, a1, 48 -40000acf: d1e8 l32i.n a14, a1, 52 -40000ad1: 1310d0 wsr.acclo a13 -40000ad4: 1311e0 wsr.acchi a14 -40000ad7: 21e8 l32i.n a14, a1, 8 -40000ad9: feb601 l32r a0, 400005b4 <_stext+0x54> -40000adc: feaed1 l32r a13, 40000594 <_stext+0x34> -40000adf: 1303e0 wsr.sar a14 -40000ae2: 2000d0 or a0, a0, a13 -40000ae5: 900d00 addx2 a0, a13, a0 -40000ae8: f01d retw.n -40000aea: 3b6522 s32i a2, a5, 236 -40000aed: 4528 l32i.n a2, a5, 16 -40000aef: 6548 l32i.n a4, a5, 24 -40000af1: 7558 l32i.n a5, a5, 28 -40000af3: 003310 rfi 3 - ... - -40000af8 <_Level4FromVector>: -40000af8: feb021 l32r a2, 400005b8 <_stext+0x58> -40000afb: d209 s32i.n a0, a2, 52 -40000afd: feaf01 l32r a0, 400005bc <_stext+0x5c> -40000b00: e219 s32i.n a1, a2, 56 -40000b02: 0008 l32i.n a0, a0, 0 -40000b04: 106232 s32i a3, a2, 64 -40000b07: 61d400 xsr.excsave4 a0 -40000b0a: 116242 s32i a4, a2, 68 -40000b0d: f209 s32i.n a0, a2, 60 -40000b0f: 03b130 rsr.epc1 a3 -40000b12: 03e840 rsr.exccause a4 -40000b15: 3239 s32i.n a3, a2, 12 -40000b17: 4249 s32i.n a4, a2, 16 -40000b19: 03ee30 rsr.excvaddr a3 -40000b1c: 056232 s32i a3, a2, 20 -40000b1f: 03d140 rsr.excsave1 a4 -40000b22: 6249 s32i.n a4, a2, 24 -40000b24: 38a002 movi a0, 56 -40000b27: 126252 s32i a5, a2, 72 -40000b2a: 136262 s32i a6, a2, 76 -40000b2d: 146272 s32i a7, a2, 80 -40000b30: 156282 s32i a8, a2, 84 -40000b33: 166292 s32i a9, a2, 88 -40000b36: 1762a2 s32i a10, a2, 92 -40000b39: 1862b2 s32i a11, a2, 96 -40000b3c: 1962c2 s32i a12, a2, 100 -40000b3f: 1a62d2 s32i a13, a2, 104 -40000b42: 1b62e2 s32i a14, a2, 108 -40000b45: 1c62f2 s32i a15, a2, 112 -40000b48: f8c082 addi a8, a0, -8 -40000b4b: 20c2a2 addi a10, a2, 32 -40000b4e: 408020 rotw 2 -40000b51: fdb056 bnez a0, 40000b30 <_Level4FromVector+0x38> -40000b54: 408020 rotw 2 -40000b57: 034930 rsr.windowstart a3 -40000b5a: 034840 rsr.windowbase a4 -40000b5d: 1239 s32i.n a3, a2, 4 -40000b5f: 2249 s32i.n a4, a2, 8 -40000b61: 130c movi.n a3, 1 -40000b63: 040c movi.n a4, 0 -40000b65: 134930 wsr.windowstart a3 -40000b68: 134840 wsr.windowbase a4 -40000b6b: 002010 rsync -40000b6e: fe9211 l32r a1, 400005b8 <_stext+0x58> -40000b71: 000c movi.n a0, 0 -40000b73: fe9321 l32r a2, 400005c0 <_stext+0x60> -40000b76: 13e620 wsr.ps a2 -40000b79: 002010 rsync -40000b7c: 0303e0 rsr.sar a14 -40000b7f: 01e9 s32i.n a14, a1, 0 -40000b81: 0302e0 rsr.lcount a14 -40000b84: a1e9 s32i.n a14, a1, 40 -40000b86: 0300e0 rsr.lbeg a14 -40000b89: b1e9 s32i.n a14, a1, 44 -40000b8b: 0301e0 rsr.lend a14 -40000b8e: c1e9 s32i.n a14, a1, 48 -40000b90: 0310e0 rsr.acclo a14 -40000b93: 81e9 s32i.n a14, a1, 32 -40000b95: 0311e0 rsr.acchi a14 -40000b98: 91e9 s32i.n a14, a1, 36 -40000b9a: 03e2f0 rsr.interrupt a15 -40000b9d: 03e4c0 rsr.intenable a12 -40000ba0: fe89d1 l32r a13, 400005c4 <_stext+0x64> -40000ba3: 10ffc0 and a15, a15, a12 -40000ba6: 10ffd0 and a15, a15, a13 -40000ba9: 02af16 beqz a15, 40000bd7 <_Level4FromVector+0xdf> -40000bac: 60e0f0 neg a14, a15 -40000baf: 10eef0 and a14, a14, a15 -40000bb2: 13e3e0 wsr.intclear a14 -40000bb5: fe7ac1 l32r a12, 400005a0 <_stext+0x40> -40000bb8: 40fee0 nsau a14, a14 -40000bbb: b0cec0 addx8 a12, a14, a12 -40000bbe: 0cd8 l32i.n a13, a12, 0 -40000bc0: 1c68 l32i.n a6, a12, 4 -40000bc2: 000dd0 callx4 a13 -40000bc5: 03e2f0 rsr.interrupt a15 -40000bc8: 03e4c0 rsr.intenable a12 -40000bcb: fe7ed1 l32r a13, 400005c4 <_stext+0x64> -40000bce: 10ffc0 and a15, a15, a12 -40000bd1: 10ffd0 and a15, a15, a13 -40000bd4: fd4f56 bnez a15, 40000bac <_Level4FromVector+0xb4> -40000bd7: a1d8 l32i.n a13, a1, 40 -40000bd9: b1e8 l32i.n a14, a1, 44 -40000bdb: c1f8 l32i.n a15, a1, 48 -40000bdd: 1302d0 wsr.lcount a13 -40000be0: 1300e0 wsr.lbeg a14 -40000be3: 1301f0 wsr.lend a15 -40000be6: 81d8 l32i.n a13, a1, 32 -40000be8: 91e8 l32i.n a14, a1, 36 -40000bea: 1310d0 wsr.acclo a13 -40000bed: 1311e0 wsr.acchi a14 -40000bf0: 01f8 l32i.n a15, a1, 0 -40000bf2: 1303f0 wsr.sar a15 -40000bf5: 423c movi.n a2, 52 -40000bf7: 13e620 wsr.ps a2 -40000bfa: 002010 rsync -40000bfd: 1128 l32i.n a2, a1, 4 -40000bff: 022132 l32i a3, a1, 8 -40000c02: 134920 wsr.windowstart a2 -40000c05: 134830 wsr.windowbase a3 -40000c08: 002010 rsync -40000c0b: fe6b11 l32r a1, 400005b8 <_stext+0x58> -40000c0e: 38a062 movi a6, 56 -40000c11: e0c172 addi a7, a1, -32 -40000c14: f8c6e2 addi a14, a6, -8 -40000c17: 20c7f2 addi a15, a7, 32 -40000c1a: 112f42 l32i a4, a15, 68 -40000c1d: 122f52 l32i a5, a15, 72 -40000c20: 132f62 l32i a6, a15, 76 -40000c23: 142f72 l32i a7, a15, 80 -40000c26: 152f82 l32i a8, a15, 84 -40000c29: 162f92 l32i a9, a15, 88 -40000c2c: 172fa2 l32i a10, a15, 92 -40000c2f: 182fb2 l32i a11, a15, 96 -40000c32: 408020 rotw 2 -40000c35: fdb656 bnez a6, 40000c14 <_Level4FromVector+0x11c> -40000c38: 192742 l32i a4, a7, 100 -40000c3b: 1a2752 l32i a5, a7, 104 -40000c3e: 1b2762 l32i a6, a7, 108 -40000c41: 1c2772 l32i a7, a7, 112 -40000c44: 408020 rotw 2 -40000c47: 3128 l32i.n a2, a1, 12 -40000c49: 4138 l32i.n a3, a1, 16 -40000c4b: 13b120 wsr.epc1 a2 -40000c4e: 13e830 wsr.exccause a3 -40000c51: 5128 l32i.n a2, a1, 20 -40000c53: 13ee20 wsr.excvaddr a2 -40000c56: 6138 l32i.n a3, a1, 24 -40000c58: 13d130 wsr.excsave1 a3 -40000c5b: d108 l32i.n a0, a1, 52 -40000c5d: f128 l32i.n a2, a1, 60 -40000c5f: 102132 l32i a3, a1, 64 -40000c62: e118 l32i.n a1, a1, 56 -40000c64: 003410 rfi 4 - ... - -40000c68 <_Level5FromVector>: -40000c68: fe5821 l32r a2, 400005c8 <_stext+0x68> -40000c6b: d209 s32i.n a0, a2, 52 -40000c6d: fe5701 l32r a0, 400005cc <_stext+0x6c> -40000c70: e219 s32i.n a1, a2, 56 -40000c72: 0008 l32i.n a0, a0, 0 -40000c74: 106232 s32i a3, a2, 64 -40000c77: 61d500 xsr.excsave5 a0 -40000c7a: 116242 s32i a4, a2, 68 -40000c7d: f209 s32i.n a0, a2, 60 -40000c7f: 03b130 rsr.epc1 a3 -40000c82: 03e840 rsr.exccause a4 -40000c85: 3239 s32i.n a3, a2, 12 -40000c87: 4249 s32i.n a4, a2, 16 -40000c89: 03ee30 rsr.excvaddr a3 -40000c8c: 056232 s32i a3, a2, 20 -40000c8f: 03d140 rsr.excsave1 a4 -40000c92: 6249 s32i.n a4, a2, 24 -40000c94: 38a002 movi a0, 56 -40000c97: 126252 s32i a5, a2, 72 -40000c9a: 136262 s32i a6, a2, 76 -40000c9d: 146272 s32i a7, a2, 80 -40000ca0: 156282 s32i a8, a2, 84 -40000ca3: 166292 s32i a9, a2, 88 -40000ca6: 1762a2 s32i a10, a2, 92 -40000ca9: 1862b2 s32i a11, a2, 96 -40000cac: 1962c2 s32i a12, a2, 100 -40000caf: 1a62d2 s32i a13, a2, 104 -40000cb2: 1b62e2 s32i a14, a2, 108 -40000cb5: 1c62f2 s32i a15, a2, 112 -40000cb8: f8c082 addi a8, a0, -8 -40000cbb: 20c2a2 addi a10, a2, 32 -40000cbe: 408020 rotw 2 -40000cc1: fdb056 bnez a0, 40000ca0 <_Level5FromVector+0x38> -40000cc4: 408020 rotw 2 -40000cc7: 034930 rsr.windowstart a3 -40000cca: 034840 rsr.windowbase a4 -40000ccd: 1239 s32i.n a3, a2, 4 -40000ccf: 2249 s32i.n a4, a2, 8 -40000cd1: 130c movi.n a3, 1 -40000cd3: 040c movi.n a4, 0 -40000cd5: 134930 wsr.windowstart a3 -40000cd8: 134840 wsr.windowbase a4 -40000cdb: 002010 rsync -40000cde: fe3a11 l32r a1, 400005c8 <_stext+0x68> -40000ce1: 000c movi.n a0, 0 -40000ce3: fe3b21 l32r a2, 400005d0 <_stext+0x70> -40000ce6: 13e620 wsr.ps a2 -40000ce9: 002010 rsync -40000cec: 0303e0 rsr.sar a14 -40000cef: 01e9 s32i.n a14, a1, 0 -40000cf1: 0302e0 rsr.lcount a14 -40000cf4: a1e9 s32i.n a14, a1, 40 -40000cf6: 0300e0 rsr.lbeg a14 -40000cf9: b1e9 s32i.n a14, a1, 44 -40000cfb: 0301e0 rsr.lend a14 -40000cfe: c1e9 s32i.n a14, a1, 48 -40000d00: 0310e0 rsr.acclo a14 -40000d03: 81e9 s32i.n a14, a1, 32 -40000d05: 0311e0 rsr.acchi a14 -40000d08: 91e9 s32i.n a14, a1, 36 -40000d0a: 03e2f0 rsr.interrupt a15 -40000d0d: 03e4c0 rsr.intenable a12 -40000d10: fe31d1 l32r a13, 400005d4 <_stext+0x74> -40000d13: 10ffc0 and a15, a15, a12 -40000d16: 10ffd0 and a15, a15, a13 -40000d19: 02af16 beqz a15, 40000d47 <_Level5FromVector+0xdf> -40000d1c: 60e0f0 neg a14, a15 -40000d1f: 10eef0 and a14, a14, a15 -40000d22: 13e3e0 wsr.intclear a14 -40000d25: fe1ec1 l32r a12, 400005a0 <_stext+0x40> -40000d28: 40fee0 nsau a14, a14 -40000d2b: b0cec0 addx8 a12, a14, a12 -40000d2e: 0cd8 l32i.n a13, a12, 0 -40000d30: 1c68 l32i.n a6, a12, 4 -40000d32: 000dd0 callx4 a13 -40000d35: 03e2f0 rsr.interrupt a15 -40000d38: 03e4c0 rsr.intenable a12 -40000d3b: fe26d1 l32r a13, 400005d4 <_stext+0x74> -40000d3e: 10ffc0 and a15, a15, a12 -40000d41: 10ffd0 and a15, a15, a13 -40000d44: fd4f56 bnez a15, 40000d1c <_Level5FromVector+0xb4> -40000d47: a1d8 l32i.n a13, a1, 40 -40000d49: b1e8 l32i.n a14, a1, 44 -40000d4b: c1f8 l32i.n a15, a1, 48 -40000d4d: 1302d0 wsr.lcount a13 -40000d50: 1300e0 wsr.lbeg a14 -40000d53: 1301f0 wsr.lend a15 -40000d56: 81d8 l32i.n a13, a1, 32 -40000d58: 91e8 l32i.n a14, a1, 36 -40000d5a: 1310d0 wsr.acclo a13 -40000d5d: 1311e0 wsr.acchi a14 -40000d60: 01f8 l32i.n a15, a1, 0 -40000d62: 1303f0 wsr.sar a15 -40000d65: 523c movi.n a2, 53 -40000d67: 13e620 wsr.ps a2 -40000d6a: 002010 rsync -40000d6d: 1128 l32i.n a2, a1, 4 -40000d6f: 022132 l32i a3, a1, 8 -40000d72: 134920 wsr.windowstart a2 -40000d75: 134830 wsr.windowbase a3 -40000d78: 002010 rsync -40000d7b: fe1311 l32r a1, 400005c8 <_stext+0x68> -40000d7e: 38a062 movi a6, 56 -40000d81: e0c172 addi a7, a1, -32 -40000d84: f8c6e2 addi a14, a6, -8 -40000d87: 20c7f2 addi a15, a7, 32 -40000d8a: 112f42 l32i a4, a15, 68 -40000d8d: 122f52 l32i a5, a15, 72 -40000d90: 132f62 l32i a6, a15, 76 -40000d93: 142f72 l32i a7, a15, 80 -40000d96: 152f82 l32i a8, a15, 84 -40000d99: 162f92 l32i a9, a15, 88 -40000d9c: 172fa2 l32i a10, a15, 92 -40000d9f: 182fb2 l32i a11, a15, 96 -40000da2: 408020 rotw 2 -40000da5: fdb656 bnez a6, 40000d84 <_Level5FromVector+0x11c> -40000da8: 192742 l32i a4, a7, 100 -40000dab: 1a2752 l32i a5, a7, 104 -40000dae: 1b2762 l32i a6, a7, 108 -40000db1: 1c2772 l32i a7, a7, 112 -40000db4: 408020 rotw 2 -40000db7: 3128 l32i.n a2, a1, 12 -40000db9: 4138 l32i.n a3, a1, 16 -40000dbb: 13b120 wsr.epc1 a2 -40000dbe: 13e830 wsr.exccause a3 -40000dc1: 5128 l32i.n a2, a1, 20 -40000dc3: 13ee20 wsr.excvaddr a2 -40000dc6: 6138 l32i.n a3, a1, 24 -40000dc8: 13d130 wsr.excsave1 a3 -40000dcb: d108 l32i.n a0, a1, 52 -40000dcd: f128 l32i.n a2, a1, 60 -40000dcf: 102132 l32i a3, a1, 64 -40000dd2: e118 l32i.n a1, a1, 56 -40000dd4: 003510 rfi 5 - ... - -40000dd8 <_xtos_cause3_handler>: -40000dd8: 320c movi.n a2, 3 -40000dda: 000286 j 40000de8 <_xtos_c_wrapper_handler> -40000ddd: 000000 ill -40000de0: fdc332 addi a3, a3, -3 -40000de3: 332a add.n a3, a3, a2 -40000de5: 000446 j 40000dfa <_xtos_c_wrapper_handler+0x12> - -40000de8 <_xtos_c_wrapper_handler>: -40000de8: 7159 s32i.n a5, a1, 28 -40000dea: 8129 s32i.n a2, a1, 32 -40000dec: 03e620 rsr.ps a2 -40000def: fde631 l32r a3, 40000588 <_stext+0x28> -40000df2: 1129 s32i.n a2, a1, 4 -40000df4: 342020 extui a2, a2, 0, 4 -40000df7: e542f6 bgeui a2, 4, 40000de0 <_xtos_cause3_handler+0x8> -40000dfa: 03b120 rsr.epc1 a2 -40000dfd: 13e630 wsr.ps a3 -40000e00: 0129 s32i.n a2, a1, 0 -40000e02: 3b2122 l32i a2, a1, 236 -40000e05: 01d112 addmi a1, a1, 0x100 -40000e08: 002010 rsync -40000e0b: fde241 l32r a4, 40000594 <_stext+0x34> -40000e0e: 203430 or a3, a4, a3 -40000e11: 904430 addx2 a4, a4, a3 - -40000e14 <_GeneralException>: -40000e14: 020136 entry a1, 0x100 -40000e17: 0303c0 rsr.sar a12 -40000e1a: 11d8 l32i.n a13, a1, 4 -40000e1c: 03e6e0 rsr.ps a14 -40000e1f: 34d0d0 extui a13, a13, 0, 4 -40000e22: 34f0e0 extui a15, a14, 0, 4 -40000e25: 30eef0 xor a14, a14, a15 -40000e28: 30eed0 xor a14, a14, a13 -40000e2b: 13e6e0 wsr.ps a14 -40000e2e: fdd4d1 l32r a13, 40000580 <_stext+0x20> -40000e31: 81f8 l32i.n a15, a1, 32 -40000e33: 21c9 s32i.n a12, a1, 8 -40000e35: 0302c0 rsr.lcount a12 -40000e38: 0300e0 rsr.lbeg a14 -40000e3b: 91c9 s32i.n a12, a1, 36 -40000e3d: 0301c0 rsr.lend a12 -40000e40: a1e9 s32i.n a14, a1, 40 -40000e42: b1c9 s32i.n a12, a1, 44 -40000e44: 0310c0 rsr.acclo a12 -40000e47: 0311e0 rsr.acchi a14 -40000e4a: c1c9 s32i.n a12, a1, 48 -40000e4c: d1e9 s32i.n a14, a1, 52 -40000e4e: a0cfd0 addx4 a12, a15, a13 -40000e51: 0cc8 l32i.n a12, a12, 0 -40000e53: 01ed mov.n a14, a1 -40000e55: 1c8c beqz.n a12, 40000e5a <_GeneralException+0x46> -40000e57: 000cf0 callx12 a12 -40000e5a: 91d8 l32i.n a13, a1, 36 -40000e5c: a1e8 l32i.n a14, a1, 40 -40000e5e: b1f8 l32i.n a15, a1, 44 -40000e60: 1302d0 wsr.lcount a13 -40000e63: 1300e0 wsr.lbeg a14 -40000e66: 1301f0 wsr.lend a15 -40000e69: c1d8 l32i.n a13, a1, 48 -40000e6b: d1e8 l32i.n a14, a1, 52 -40000e6d: 1310d0 wsr.acclo a13 -40000e70: 1311e0 wsr.acchi a14 -40000e73: 21e8 l32i.n a14, a1, 8 -40000e75: 0063c0 rsil a12, 3 -40000e78: 1303e0 wsr.sar a14 -40000e7b: fdca01 l32r a0, 400005a4 <_stext+0x44> -40000e7e: fdc5d1 l32r a13, 40000594 <_stext+0x34> -40000e81: 2000d0 or a0, a0, a13 -40000e84: 900d00 addx2 a0, a13, a0 -40000e87: f01d retw.n -40000e89: 000000 ill - -40000e8c : -40000e8c: 004136 entry a1, 32 -40000e8f: 20a220 or a10, a2, a2 -40000e92: 01a6b2 movi a11, 0x601 -40000e95: 20c330 or a12, a3, a3 -40000e98: 008f25 call8 4000178c -40000e9b: 202aa0 or a2, a10, a10 -40000e9e: f01d retw.n - -40000ea0 <_isatty_r>: -40000ea0: 00c136 entry a1, 96 -40000ea3: 02ad mov.n a10, a2 -40000ea5: 03bd mov.n a11, a3 -40000ea7: 01cd mov.n a12, a1 -40000ea9: 0ae225 call8 4000bccc <_fstat_r> -40000eac: 014a96 bltz a10, 40000ec4 <_isatty_r+0x24> -40000eaf: fdca21 l32r a2, 400005d8 <_stext+0x78> -40000eb2: 1198 l32i.n a9, a1, 4 -40000eb4: 180c movi.n a8, 1 -40000eb6: 109920 and a9, a9, a2 -40000eb9: e0d992 addmi a9, a9, 0xffffe000 -40000ebc: 020c movi.n a2, 0 -40000ebe: 832890 moveqz a2, a8, a9 -40000ec1: f01d retw.n -40000ec3: 020c00 andb b0, b12, b0 -40000ec6: f01d retw.n - -40000ec8 : -40000ec8: 006136 entry a1, 48 -40000ecb: 028d mov.n a8, a2 -40000ecd: 1898 l32i.n a9, a8, 4 -40000ecf: 68c8 l32i.n a12, a8, 24 -40000ed1: 48d8 l32i.n a13, a8, 16 -40000ed3: 0199 s32i.n a9, a1, 0 -40000ed5: 0898 l32i.n a9, a8, 0 -40000ed7: 6ca7a2 movi a10, 0x76c -40000eda: 1199 s32i.n a9, a1, 4 -40000edc: 5898 l32i.n a9, a8, 20 -40000ede: 90ccc0 addx2 a12, a12, a12 -40000ee1: 9a9a add.n a9, a10, a9 -40000ee3: 2199 s32i.n a9, a1, 8 -40000ee5: fdbe91 l32r a9, 400005e0 <_stext+0x80> -40000ee8: 90ddd0 addx2 a13, a13, a13 -40000eeb: c9ca add.n a12, a9, a12 -40000eed: fdbd91 l32r a9, 400005e4 <_stext+0x84> -40000ef0: fdbbb1 l32r a11, 400005dc <_stext+0x7c> -40000ef3: 38e8 l32i.n a14, a8, 12 -40000ef5: 28f8 l32i.n a15, a8, 8 -40000ef7: 03ad mov.n a10, a3 -40000ef9: d9da add.n a13, a9, a13 -40000efb: 032d mov.n a2, a3 -40000efd: 55d0a5 call8 40056c08 -40000f00: f01d retw.n - ... - -40000f04 : -40000f04: 004136 entry a1, 32 -40000f07: fdb881 l32r a8, 400005e8 <_stext+0x88> -40000f0a: 0888 l32i.n a8, a8, 0 -40000f0c: 282a add.n a2, a8, a2 -40000f0e: 010222 l8ui a2, a2, 1 -40000f11: 242020 extui a2, a2, 0, 3 -40000f14: f01d retw.n - ... - -40000f18 : -40000f18: 004136 entry a1, 32 -40000f1b: fdb381 l32r a8, 400005e8 <_stext+0x88> -40000f1e: 0888 l32i.n a8, a8, 0 -40000f20: 282a add.n a2, a8, a2 -40000f22: 010222 l8ui a2, a2, 1 -40000f25: 142020 extui a2, a2, 0, 2 -40000f28: f01d retw.n - ... - -40000f2c : -40000f2c: 004136 entry a1, 32 -40000f2f: fdae81 l32r a8, 400005e8 <_stext+0x88> -40000f32: 0888 l32i.n a8, a8, 0 -40000f34: 882a add.n a8, a8, a2 -40000f36: 010892 l8ui a9, a8, 1 -40000f39: 180c movi.n a8, 1 -40000f3b: 239900 sext a9, a9, 7 -40000f3e: 00a996 bltz a9, 40000f4c -40000f41: f7c292 addi a9, a2, -9 -40000f44: 020c movi.n a2, 0 -40000f46: 832890 moveqz a2, a8, a9 -40000f49: f01d retw.n -40000f4b: 082d00 lsx f2, a13, a0 -40000f4e: f01d retw.n - -40000f50 : -40000f50: 004136 entry a1, 32 -40000f53: fda581 l32r a8, 400005e8 <_stext+0x88> -40000f56: 0888 l32i.n a8, a8, 0 -40000f58: 282a add.n a2, a8, a2 -40000f5a: 010222 l8ui a2, a2, 1 -40000f5d: 082c movi.n a8, 32 -40000f5f: 102280 and a2, a2, a8 -40000f62: f01d retw.n - -40000f64 : -40000f64: 004136 entry a1, 32 -40000f67: fda081 l32r a8, 400005e8 <_stext+0x88> -40000f6a: 0888 l32i.n a8, a8, 0 -40000f6c: 282a add.n a2, a8, a2 -40000f6e: 010222 l8ui a2, a2, 1 -40000f71: 480c movi.n a8, 4 -40000f73: 102280 and a2, a2, a8 -40000f76: f01d retw.n - -40000f78 : -40000f78: 004136 entry a1, 32 -40000f7b: fd9b81 l32r a8, 400005e8 <_stext+0x88> -40000f7e: 0888 l32i.n a8, a8, 0 -40000f80: 282a add.n a2, a8, a2 -40000f82: 010292 l8ui a9, a2, 1 -40000f85: 180c movi.n a8, 1 -40000f87: 149090 extui a9, a9, 0, 2 -40000f8a: fec992 addi a9, a9, -2 -40000f8d: 020c movi.n a2, 0 -40000f8f: 832890 moveqz a2, a8, a9 -40000f92: f01d retw.n - -40000f94 : -40000f94: 004136 entry a1, 32 -40000f97: fd9481 l32r a8, 400005e8 <_stext+0x88> -40000f9a: 0888 l32i.n a8, a8, 0 -40000f9c: 282a add.n a2, a8, a2 -40000f9e: 010282 l8ui a8, a2, 1 -40000fa1: 721c movi.n a2, 23 -40000fa3: 102280 and a2, a2, a8 -40000fa6: f01d retw.n - -40000fa8 : -40000fa8: 004136 entry a1, 32 -40000fab: fd8f81 l32r a8, 400005e8 <_stext+0x88> -40000fae: 0888 l32i.n a8, a8, 0 -40000fb0: 282a add.n a2, a8, a2 -40000fb2: 010282 l8ui a8, a2, 1 -40000fb5: 97a022 movi a2, 151 -40000fb8: 102280 and a2, a2, a8 -40000fbb: f01d retw.n -40000fbd: 000000 ill - -40000fc0 : -40000fc0: 004136 entry a1, 32 -40000fc3: fd8981 l32r a8, 400005e8 <_stext+0x88> -40000fc6: 0888 l32i.n a8, a8, 0 -40000fc8: 282a add.n a2, a8, a2 -40000fca: 010222 l8ui a2, a2, 1 -40000fcd: 081c movi.n a8, 16 -40000fcf: 102280 and a2, a2, a8 -40000fd2: f01d retw.n - -40000fd4 : -40000fd4: 004136 entry a1, 32 -40000fd7: fd8481 l32r a8, 400005e8 <_stext+0x88> -40000fda: 0888 l32i.n a8, a8, 0 -40000fdc: 282a add.n a2, a8, a2 -40000fde: 010222 l8ui a2, a2, 1 -40000fe1: 880c movi.n a8, 8 -40000fe3: 102280 and a2, a2, a8 -40000fe6: f01d retw.n - -40000fe8 : -40000fe8: 004136 entry a1, 32 -40000feb: fd7f81 l32r a8, 400005e8 <_stext+0x88> -40000fee: 0888 l32i.n a8, a8, 0 -40000ff0: 282a add.n a2, a8, a2 -40000ff2: 010292 l8ui a9, a2, 1 -40000ff5: 180c movi.n a8, 1 -40000ff7: 149090 extui a9, a9, 0, 2 -40000ffa: 990b addi.n a9, a9, -1 -40000ffc: 020c movi.n a2, 0 -40000ffe: 832890 moveqz a2, a8, a9 -40001001: f01d retw.n - ... - -40001004 : -40001004: 004136 entry a1, 32 -40001007: 0ae865 call8 4000be8c <__getreent> -4000100a: 0e2a82 l32i a8, a10, 56 -4000100d: 203aa0 or a3, a10, a10 -40001010: 88fc bnez.n a8, 4000104c -40001012: 18a0a2 movi a10, 24 -40001015: 0ae8a5 call8 4000bea0 -40001018: fd7541 l32r a4, 400005ec <_stext+0x8c> -4000101b: e3a9 s32i.n a10, a3, 56 -4000101d: 005a42 s16i a4, a10, 0 -40001020: fd7441 l32r a4, 400005f0 <_stext+0x90> -40001023: 580c movi.n a8, 5 -40001025: 015a42 s16i a4, a10, 2 -40001028: fd7341 l32r a4, 400005f4 <_stext+0x94> -4000102b: 055a82 s16i a8, a10, 10 -4000102e: 025a42 s16i a4, a10, 4 -40001031: fd7141 l32r a4, 400005f8 <_stext+0x98> -40001034: b80c movi.n a8, 11 -40001036: 035a42 s16i a4, a10, 6 -40001039: 065a82 s16i a8, a10, 12 -4000103c: fd7041 l32r a4, 400005fc <_stext+0x9c> -4000103f: fd7081 l32r a8, 40000600 <_stext+0xa0> -40001042: fd7091 l32r a9, 40000604 <_stext+0xa4> -40001045: 045a42 s16i a4, a10, 8 -40001048: 4a89 s32i.n a8, a10, 16 -4000104a: 5a99 s32i.n a9, a10, 20 -4000104c: e338 l32i.n a3, a3, 56 -4000104e: 4329 s32i.n a2, a3, 16 -40001050: 020c movi.n a2, 0 -40001052: 5329 s32i.n a2, a3, 20 -40001054: f01d retw.n - ... - -40001058 : -40001058: 004136 entry a1, 32 -4000105b: 0ae325 call8 4000be8c <__getreent> -4000105e: 0e2a82 l32i a8, a10, 56 -40001061: 202aa0 or a2, a10, a10 -40001064: 88fc bnez.n a8, 400010a0 -40001066: 18a0a2 movi a10, 24 -40001069: 0ae365 call8 4000bea0 -4000106c: fd6031 l32r a3, 400005ec <_stext+0x8c> -4000106f: e2a9 s32i.n a10, a2, 56 -40001071: 005a32 s16i a3, a10, 0 -40001074: fd5f31 l32r a3, 400005f0 <_stext+0x90> -40001077: 580c movi.n a8, 5 -40001079: 015a32 s16i a3, a10, 2 -4000107c: fd5e31 l32r a3, 400005f4 <_stext+0x94> -4000107f: 055a82 s16i a8, a10, 10 -40001082: 025a32 s16i a3, a10, 4 -40001085: fd5c31 l32r a3, 400005f8 <_stext+0x98> -40001088: b80c movi.n a8, 11 -4000108a: 035a32 s16i a3, a10, 6 -4000108d: 065a82 s16i a8, a10, 12 -40001090: fd5b31 l32r a3, 400005fc <_stext+0x9c> -40001093: fd5b81 l32r a8, 40000600 <_stext+0xa0> -40001096: fd5b91 l32r a9, 40000604 <_stext+0xa4> -40001099: 045a32 s16i a3, a10, 8 -4000109c: 4a89 s32i.n a8, a10, 16 -4000109e: 5a99 s32i.n a9, a10, 20 -400010a0: e288 l32i.n a8, a2, 56 -400010a2: fd5aa1 l32r a10, 4000060c <_stext+0xac> -400010a5: 4898 l32i.n a9, a8, 16 -400010a7: fd5821 l32r a2, 40000608 <_stext+0xa8> -400010aa: 58b8 l32i.n a11, a8, 20 -400010ac: 82a9a0 mull a10, a9, a10 -400010af: 82bb20 mull a11, a11, a2 -400010b2: abaa add.n a10, a11, a10 -400010b4: 82b920 mull a11, a9, a2 -400010b7: a22920 muluh a2, a9, a2 -400010ba: 9b1b addi.n a9, a11, 1 -400010bc: 2a2a add.n a2, a10, a2 -400010be: 1a0c movi.n a10, 1 -400010c0: 0139b7 bltu a9, a11, 400010c5 -400010c3: 0a0c movi.n a10, 0 -400010c5: 2a2a add.n a2, a10, a2 -400010c7: 5829 s32i.n a2, a8, 20 -400010c9: 4899 s32i.n a9, a8, 16 -400010cb: fd5181 l32r a8, 40000610 <_stext+0xb0> -400010ce: 102280 and a2, a2, a8 -400010d1: f01d retw.n - ... - -400010d4 : -400010d4: 004136 entry a1, 32 -400010d7: 0288 l32i.n a8, a2, 0 -400010d9: fd4e91 l32r a9, 40000614 <_stext+0xb4> -400010dc: 838980 moveqz a8, a9, a8 -400010df: fd4e91 l32r a9, 40000618 <_stext+0xb8> -400010e2: 31af80 srai a10, a8, 31 -400010e5: b29890 mulsh a9, a8, a9 -400010e8: 989a add.n a9, a8, a9 -400010ea: 319090 srai a9, a9, 16 -400010ed: c099a0 sub a9, a9, a10 -400010f0: fd4ba1 l32r a10, 4000061c <_stext+0xbc> -400010f3: 82a9a0 mull a10, a9, a10 -400010f6: 88aa add.n a8, a8, a10 -400010f8: fd4aa1 l32r a10, 40000620 <_stext+0xc0> -400010fb: 8288a0 mull a8, a8, a10 -400010fe: fd49a1 l32r a10, 40000624 <_stext+0xc4> -40001101: 8299a0 mull a9, a9, a10 -40001104: 889a add.n a8, a8, a9 -40001106: fd4291 l32r a9, 40000610 <_stext+0xb0> -40001109: a89a add.n a10, a8, a9 -4000110b: a38a80 movltz a8, a10, a8 -4000110e: 0289 s32i.n a8, a2, 0 -40001110: 102890 and a2, a8, a9 -40001113: f01d retw.n -40001115: 000000 ill - -40001118 <__sread>: -40001118: 004136 entry a1, 32 -4000111b: 0793b2 l16si a11, a3, 14 -4000111e: 02ad mov.n a10, a2 -40001120: 04cd mov.n a12, a4 -40001122: 20d550 or a13, a5, a5 -40001125: 0ac825 call8 4000bda8 <_read_r> -40001128: 00ca96 bltz a10, 40001138 <__sread+0x20> -4000112b: 152382 l32i a8, a3, 84 -4000112e: 88aa add.n a8, a8, a10 -40001130: 156382 s32i a8, a3, 84 -40001133: 000346 j 40001144 <__sread+0x2c> -40001136: 920000 lsi f0, a0, 0x248 -40001139: 810613 lsi f1, a6, 0x204 -4000113c: fd3b addi.n a15, a13, 3 -4000113e: 108980 and a8, a9, a8 -40001141: 065382 s16i a8, a3, 12 -40001144: 0a2d mov.n a2, a10 -40001146: f01d retw.n - -40001148 <__seofread>: -40001148: 004136 entry a1, 32 -4000114b: 020c movi.n a2, 0 -4000114d: f01d retw.n - ... - -40001150 <__swrite>: -40001150: 004136 entry a1, 32 -40001153: 061382 l16ui a8, a3, 12 -40001156: 0b6887 bbci a8, 8, 40001165 <__swrite+0x15> -40001159: 0793b2 l16si a11, a3, 14 -4000115c: 02ad mov.n a10, a2 -4000115e: 0c0c movi.n a12, 0 -40001160: 2d0c movi.n a13, 2 -40001162: 0ac2a5 call8 4000bd8c <_lseek_r> -40001165: 061392 l16ui a9, a3, 12 -40001168: fd3081 l32r a8, 40000628 <_stext+0xc8> -4000116b: 0793b2 l16si a11, a3, 14 -4000116e: 108980 and a8, a9, a8 -40001171: 065382 s16i a8, a3, 12 -40001174: 20a220 or a10, a2, a2 -40001177: 20c440 or a12, a4, a4 -4000117a: 20d550 or a13, a5, a5 -4000117d: 0abf25 call8 4000bd70 <_write_r> -40001180: 0a2d mov.n a2, a10 -40001182: f01d retw.n - -40001184 <__sseek>: -40001184: 004136 entry a1, 32 -40001187: 0793b2 l16si a11, a3, 14 -4000118a: 02ad mov.n a10, a2 -4000118c: 04cd mov.n a12, a4 -4000118e: 20d550 or a13, a5, a5 -40001191: 0abfa5 call8 4000bd8c <_lseek_r> -40001194: 061382 l16ui a8, a3, 12 -40001197: 0d0a66 bnei a10, -1, 400011a8 <__sseek+0x24> -4000119a: fd2391 l32r a9, 40000628 <_stext+0xc8> -4000119d: 108980 and a8, a9, a8 -400011a0: 065382 s16i a8, a3, 12 -400011a3: 000346 j 400011b4 <__sseek+0x30> -400011a6: 910000 srl a0, a0 -400011a9: a2fd21 l32r a2, 3ffe9da0 <__stack_app+0x1f70> -400011ac: 801563 lsi f6, a5, 0x200 -400011af: 2089 s32i.n a8, a0, 8 -400011b1: 065382 s16i a8, a3, 12 -400011b4: 0a2d mov.n a2, a10 -400011b6: f01d retw.n - -400011b8 <__sclose>: -400011b8: 004136 entry a1, 32 -400011bb: 0793b2 l16si a11, a3, 14 -400011be: 20a220 or a10, a2, a2 -400011c1: 0ab7a5 call8 4000bd3c <_close_r> -400011c4: 202aa0 or a2, a10, a10 -400011c7: 000090 retw - ... - -400011cc : -400011cc: 004136 entry a1, 32 -400011cf: 02cd mov.n a12, a2 -400011d1: fd0521 l32r a2, 400005e8 <_stext+0x88> -400011d4: 080c movi.n a8, 0 -400011d6: 02b8 l32i.n a11, a2, 0 -400011d8: 2c8a add.n a2, a12, a8 -400011da: 000292 l8ui a9, a2, 0 -400011dd: 2b9a add.n a2, a11, a9 -400011df: 010222 l8ui a2, a2, 1 -400011e2: 20c9a2 addi a10, a9, 32 -400011e5: 142020 extui a2, a2, 0, 2 -400011e8: 220b addi.n a2, a2, -1 -400011ea: 839a20 moveqz a9, a10, a2 -400011ed: 092d mov.n a2, a9 -400011ef: 938a add.n a9, a3, a8 -400011f1: 000992 l8ui a9, a9, 0 -400011f4: ab9a add.n a10, a11, a9 -400011f6: 010aa2 l8ui a10, a10, 1 -400011f9: 20c9d2 addi a13, a9, 32 -400011fc: 14a0a0 extui a10, a10, 0, 2 -400011ff: aa0b addi.n a10, a10, -1 -40001201: 839da0 moveqz a9, a13, a10 -40001204: c02290 sub a2, a2, a9 -40001207: 32cc bnez.n a2, 4000120e -40001209: 881b addi.n a8, a8, 1 -4000120b: fc9956 bnez a9, 400011d8 -4000120e: f01d retw.n - -40001210 : -40001210: 006136 entry a1, 48 -40001213: 000382 l8ui a8, a3, 0 -40001216: 024d mov.n a4, a2 -40001218: 055816 beqz a8, 40001271 -4000121b: fcf321 l32r a2, 400005e8 <_stext+0x88> -4000121e: 331b addi.n a3, a3, 1 -40001220: 0228 l32i.n a2, a2, 0 -40001222: 03ad mov.n a10, a3 -40001224: 0129 s32i.n a2, a1, 0 -40001226: 228a add.n a2, a2, a8 -40001228: 010272 l8ui a7, a2, 1 -4000122b: 20c822 addi a2, a8, 32 -4000122e: 147070 extui a7, a7, 0, 2 -40001231: 770b addi.n a7, a7, -1 -40001233: 838270 moveqz a8, a2, a7 -40001236: 747080 extui a7, a8, 0, 8 -40001239: 002865 call8 400014c0 -4000123c: 0a5d mov.n a5, a10 -4000123e: 000046 j 40001243 -40001241: 064d mov.n a4, a6 -40001243: 000422 l8ui a2, a4, 0 -40001246: 641b addi.n a6, a4, 1 -40001248: 52ac beqz.n a2, 40001271 -4000124a: 0188 l32i.n a8, a1, 0 -4000124c: 982a add.n a9, a8, a2 -4000124e: 0109a2 l8ui a10, a9, 1 -40001251: 20c292 addi a9, a2, 32 -40001254: 14a0a0 extui a10, a10, 0, 2 -40001257: aa0b addi.n a10, a10, -1 -40001259: 8329a0 moveqz a2, a9, a10 -4000125c: 742020 extui a2, a2, 0, 8 -4000125f: de9277 bne a2, a7, 40001241 -40001262: 06ad mov.n a10, a6 -40001264: 03bd mov.n a11, a3 -40001266: 20c550 or a12, a5, a5 -40001269: 002e65 call8 40001550 -4000126c: fd1a56 bnez a10, 40001241 -4000126f: 042d mov.n a2, a4 -40001271: f01d retw.n - ... - -40001274 : -40001274: 002136 entry a1, 16 -40001277: 000282 l8ui a8, a2, 0 -4000127a: 000392 l8ui a9, a3, 0 -4000127d: 3a0c movi.n a10, 3 -4000127f: 529897 bne a8, a9, 400012d5 -40001282: 20b230 or a11, a2, a3 -40001285: 530ba7 bnone a11, a10, 400012dc -40001288: 30b230 xor a11, a2, a3 -4000128b: 318ba7 bany a11, a10, 400012c0 -4000128e: 221b addi.n a2, a2, 1 -40001290: 0b2816 beqz a8, 40001346 -40001293: 331b addi.n a3, a3, 1 -40001295: 4302a7 bnone a2, a10, 400012dc -40001298: 000282 l8ui a8, a2, 0 -4000129b: 000392 l8ui a9, a3, 0 -4000129e: 221b addi.n a2, a2, 1 -400012a0: 319897 bne a8, a9, 400012d5 -400012a3: 09f816 beqz a8, 40001346 -400012a6: 331b addi.n a3, a3, 1 -400012a8: 3002a7 bnone a2, a10, 400012dc -400012ab: 000282 l8ui a8, a2, 0 -400012ae: 000392 l8ui a9, a3, 0 -400012b1: 221b addi.n a2, a2, 1 -400012b3: 1e9897 bne a8, a9, 400012d5 -400012b6: 08c816 beqz a8, 40001346 -400012b9: 331b addi.n a3, a3, 1 -400012bb: 000746 j 400012dc -400012be: 0c0000 lsi f0, a0, 48 -400012c1: 7608 l32i.n a0, a6, 28 -400012c3: 0f88 l32i.n a8, a15, 0 -400012c5: 000282 l8ui a8, a2, 0 -400012c8: 000392 l8ui a9, a3, 0 -400012cb: 221b addi.n a2, a2, 1 -400012cd: 049897 bne a8, a9, 400012d5 -400012d0: 331b addi.n a3, a3, 1 -400012d2: fff816 beqz a8, 400012d5 -400012d5: c02890 sub a2, a8, a9 -400012d8: f01d retw.n -400012da: 410000 srli a0, a0, 0 -400012dd: 71fcd5 call4 400732ac <__bss_start+0x32ac> -400012e0: fcd8 l32i.n a13, a12, 60 -400012e2: 238076 loop a0, 40001309 -400012e5: 0288 l32i.n a8, a2, 0 -400012e7: 0398 l32i.n a9, a3, 0 -400012e9: 1158f0 slli a5, a8, 1 -400012ec: 5c9897 bne a8, a9, 4000134c -400012ef: 209850 or a9, a8, a5 -400012f2: 1ac977 bnall a9, a7, 40001310 -400012f5: 1288 l32i.n a8, a2, 4 -400012f7: 1398 l32i.n a9, a3, 4 -400012f9: 1158f0 slli a5, a8, 1 -400012fc: 4c9897 bne a8, a9, 4000134c -400012ff: 209850 or a9, a8, a5 -40001302: 06c977 bnall a9, a7, 4000130c -40001305: 228b addi.n a2, a2, 8 -40001307: 338b addi.n a3, a3, 8 -40001309: fff546 j 400012e2 -4000130c: 224b addi.n a2, a2, 4 -4000130e: 334b addi.n a3, a3, 4 -40001310: 320847 bnone a8, a4, 40001346 -40001313: fcc851 l32r a5, 40000634 <_stext+0xd4> -40001316: fcc861 l32r a6, 40000638 <_stext+0xd8> -40001319: 290857 bnone a8, a5, 40001346 -4000131c: fcc871 l32r a7, 4000063c <_stext+0xdc> -4000131f: 230867 bnone a8, a6, 40001346 -40001322: 200877 bnone a8, a7, 40001346 -40001325: 224b addi.n a2, a2, 4 -40001327: 334b addi.n a3, a3, 4 -40001329: 198076 loop a0, 40001346 -4000132c: 0288 l32i.n a8, a2, 0 -4000132e: 0398 l32i.n a9, a3, 0 -40001330: 224b addi.n a2, a2, 4 -40001332: 169897 bne a8, a9, 4000134c -40001335: 0d0847 bnone a8, a4, 40001346 -40001338: 0a0857 bnone a8, a5, 40001346 -4000133b: 070867 bnone a8, a6, 40001346 -4000133e: 040877 bnone a8, a7, 40001346 -40001341: 334b addi.n a3, a3, 4 -40001343: fff886 j 40001329 -40001346: 020c movi.n a2, 0 -40001348: f01d retw.n -4000134a: 900000 addx2 a0, a0, a0 -4000134d: 3028 l32i.n a2, a0, 12 -4000134f: 218247 bany a2, a4, 40001374 -40001352: fcb851 l32r a5, 40000634 <_stext+0xd4> -40001355: ed0847 bnone a8, a4, 40001346 -40001358: 248257 bany a2, a5, 40001380 -4000135b: fcb761 l32r a6, 40000638 <_stext+0xd8> -4000135e: e40857 bnone a8, a5, 40001346 -40001361: 278267 bany a2, a6, 4000138c -40001364: de0867 bnone a8, a6, 40001346 -40001367: 75a880 extui a10, a8, 24, 8 -4000136a: 75b890 extui a11, a9, 24, 8 -4000136d: c02ab0 sub a2, a10, a11 -40001370: f01d retw.n -40001372: 800000 add a0, a0, a0 -40001375: 9074a0 addx2 a7, a4, a10 -40001378: b074b0 addx8 a7, a4, a11 -4000137b: c02a add.n a12, a0, a2 -4000137d: f01d retw.n -4000137f: a88000 lsi f0, a0, 0x2a0 -40001382: b89074 lsi f7, a0, 0x2e0 -40001385: 2ab074 lsi f7, a0, 168 -40001388: f01dc0 subx8 a1, a13, a12 -4000138b: a08000 addx4 a8, a0, a0 -4000138e: b09075 call12 3ffb1c94 <_data_end_btdm+0x1d84> -40001391: 2ab075 call12 4002be98 -40001394: f01dc0 subx8 a1, a13, a12 - ... - -40001398 : -40001398: 004136 entry a1, 32 -4000139b: 20a220 or a10, a2, a2 -4000139e: 20b330 or a11, a3, a3 -400013a1: ffed25 call8 40001274 -400013a4: 202aa0 or a2, a10, a10 -400013a7: f01d retw.n -400013a9: 000000 ill - -400013ac : -400013ac: 002136 entry a1, 16 -400013af: 20a220 or a10, a2, a2 -400013b2: ffa042 movi a4, 255 -400013b5: fc9f51 l32r a5, 40000634 <_stext+0xd4> -400013b8: fca061 l32r a6, 40000638 <_stext+0xd8> -400013bb: fca071 l32r a7, 4000063c <_stext+0xdc> -400013be: 0be307 bbsi a3, 0, 400013cd -400013c1: 17e317 bbsi a3, 1, 400013dc -400013c4: 380c movi.n a8, 3 -400013c6: 2a0a87 bnone a10, a8, 400013f4 -400013c9: 0016c6 j 40001428 -400013cc: 038200 lsi f0, a2, 12 -400013cf: 331b00 clamps a1, a11, 7 -400013d2: 004a82 s8i a8, a10, 0 -400013d5: 889c beqz.n a8, 400013f1 -400013d7: aa1b addi.n a10, a10, 1 -400013d9: e76317 bbci a3, 1, 400013c4 -400013dc: 000382 l8ui a8, a3, 0 -400013df: 004a82 s8i a8, a10, 0 -400013e2: b88c beqz.n a8, 400013f1 -400013e4: 010382 l8ui a8, a3, 1 -400013e7: 332b addi.n a3, a3, 2 -400013e9: 014a82 s8i a8, a10, 1 -400013ec: aa2b addi.n a10, a10, 2 -400013ee: fd2856 bnez a8, 400013c4 -400013f1: f01d retw.n -400013f3: 080c00 lsx f0, a12, a0 -400013f6: 138876 loop a8, 4000140d -400013f9: 0388 l32i.n a8, a3, 0 -400013fb: 334b addi.n a3, a3, 4 -400013fd: 0f0847 bnone a8, a4, 40001410 -40001400: 110857 bnone a8, a5, 40001415 -40001403: 150867 bnone a8, a6, 4000141c -40001406: 0a89 s32i.n a8, a10, 0 -40001408: 010877 bnone a8, a7, 4000140d -4000140b: aa4b addi.n a10, a10, 4 -4000140d: f01d retw.n -4000140f: 4a8200 madd.s f8, f2, f0 -40001412: f01d00 subx8 a1, a13, a0 -40001415: 005a82 s16i a8, a10, 0 -40001418: f01d retw.n -4000141a: 820000 mull a0, a0, a0 -4000141d: 005a add.n a0, a0, a5 -4000141f: 080c movi.n a8, 0 -40001421: 024a82 s8i a8, a10, 2 -40001424: f01d retw.n -40001426: 0c0000 lsi f0, a0, 48 -40001429: 7608 l32i.n a0, a6, 28 -4000142b: 0c88 l32i.n a8, a12, 0 -4000142d: 000382 l8ui a8, a3, 0 -40001430: 331b addi.n a3, a3, 1 -40001432: 004a82 s8i a8, a10, 0 -40001435: aa1b addi.n a10, a10, 1 -40001437: fff816 beqz a8, 4000143a -4000143a: f01d retw.n - -4000143c : -4000143c: 004136 entry a1, 32 -4000143f: 0aa4e5 call8 4000be8c <__getreent> -40001442: 20b220 or a11, a2, a2 -40001445: 0000a5 call8 40001450 <_strdup_r> -40001448: 202aa0 or a2, a10, a10 -4000144b: f01d retw.n -4000144d: 000000 ill - -40001450 <_strdup_r>: -40001450: 004136 entry a1, 32 -40001453: 20a330 or a10, a3, a3 -40001456: 0006a5 call8 400014c0 -40001459: 01ca42 addi a4, a10, 1 -4000145c: 04bd mov.n a11, a4 -4000145e: 02ad mov.n a10, a2 -40001460: 0a7525 call8 4000bbb4 <_malloc_r> -40001463: 0a2d mov.n a2, a10 -40001465: 5a8c beqz.n a10, 4000146e <_strdup_r+0x1e> -40001467: 03bd mov.n a11, a3 -40001469: 04cd mov.n a12, a4 -4000146b: 0ae5e5 call8 4000c2c8 -4000146e: f01d retw.n - -40001470 : -40001470: 004136 entry a1, 32 -40001473: 03ad mov.n a10, a3 -40001475: b24a add.n a11, a2, a4 -40001477: 028d mov.n a8, a2 -40001479: 000046 j 4000147e -4000147c: 881b addi.n a8, a8, 1 -4000147e: 0e98b7 bne a8, a11, 40001490 -40001481: c02820 sub a2, a8, a2 -40001484: c04420 sub a4, a4, a2 -40001487: 0a9d mov.n a9, a10 -40001489: 34ec bnez.n a4, 400014b0 -4000148b: 0002c6 j 4000149a -4000148e: 920000 lsi f0, a0, 0x248 -40001491: 0008 l32i.n a0, a0, 0 -40001493: fe5956 bnez a9, 4000147c -40001496: fff9c6 j 40001481 -40001499: 026500 andb b6, b5, b0 -4000149c: 2a2a00 mul.s f2, f10, f0 -4000149f: f01d retw.n -400014a1: 000000 ill -400014a4: 061426 beqi a4, 1, 400014ae -400014a7: 0048b2 s8i a11, a8, 0 -400014aa: 440b addi.n a4, a4, -1 -400014ac: 881b addi.n a8, a8, 1 -400014ae: 991b addi.n a9, a9, 1 -400014b0: 0009b2 l8ui a11, a9, 0 -400014b3: fedb56 bnez a11, 400014a4 -400014b6: c099a0 sub a9, a9, a10 -400014b9: 0048b2 s8i a11, a8, 0 -400014bc: 292a add.n a2, a9, a2 -400014be: f01d retw.n - -400014c0 : -400014c0: 002136 entry a1, 16 -400014c3: fcc232 addi a3, a2, -4 -400014c6: ffa042 movi a4, 255 -400014c9: fc5a51 l32r a5, 40000634 <_stext+0xd4> -400014cc: fc5b61 l32r a6, 40000638 <_stext+0xd8> -400014cf: fc5b71 l32r a7, 4000063c <_stext+0xdc> -400014d2: 06e207 bbsi a2, 0, 400014dc -400014d5: 0de217 bbsi a2, 1, 400014e6 -400014d8: 000706 j 400014f8 -400014db: 038200 lsi f0, a2, 12 -400014de: 331b04 lsi f0, a11, 204 -400014e1: 88ac beqz.n a8, 4000150d -400014e3: 116317 bbci a3, 1, 400014f8 -400014e6: 332b addi.n a3, a3, 2 -400014e8: 0388 l32i.n a8, a3, 0 -400014ea: 2e0867 bnone a8, a6, 4000151c -400014ed: 078877 bany a8, a7, 400014f8 -400014f0: 333b addi.n a3, a3, 3 -400014f2: c02320 sub a2, a3, a2 -400014f5: f01d retw.n -400014f7: 080c00 lsx f0, a12, a0 -400014fa: 0f8876 loop a8, 4000150d -400014fd: 1388 l32i.n a8, a3, 4 -400014ff: 334b addi.n a3, a3, 4 -40001501: 0a0847 bnone a8, a4, 4000150f -40001504: 0c0857 bnone a8, a5, 40001514 -40001507: 110867 bnone a8, a6, 4000151c -4000150a: ff0877 bnone a8, a7, 4000150d -4000150d: 333b addi.n a3, a3, 3 -4000150f: c02320 sub a2, a3, a2 -40001512: f01d retw.n -40001514: 331b addi.n a3, a3, 1 -40001516: c02320 sub a2, a3, a2 -40001519: f01d retw.n -4000151b: 332b00 clamps a2, a11, 7 -4000151e: c02320 sub a2, a3, a2 -40001521: f01d retw.n - ... - -40001524 : -40001524: 004136 entry a1, 32 -40001527: fc3081 l32r a8, 400005e8 <_stext+0x88> -4000152a: 029d mov.n a9, a2 -4000152c: 08a8 l32i.n a10, a8, 0 -4000152e: 000506 j 40001546 -40001531: ba8a add.n a11, a10, a8 -40001533: 010bc2 l8ui a12, a11, 1 -40001536: 20c8b2 addi a11, a8, 32 -40001539: 14c0c0 extui a12, a12, 0, 2 -4000153c: cc0b addi.n a12, a12, -1 -4000153e: 838bc0 moveqz a8, a11, a12 -40001541: 004982 s8i a8, a9, 0 -40001544: 991b addi.n a9, a9, 1 -40001546: 000982 l8ui a8, a9, 0 -40001549: fe4856 bnez a8, 40001531 -4000154c: f01d retw.n - ... - -40001550 : -40001550: 004136 entry a1, 32 -40001553: 02cd mov.n a12, a2 -40001555: fc2421 l32r a2, 400005e8 <_stext+0x88> -40001558: 080c movi.n a8, 0 -4000155a: 02a8 l32i.n a10, a2, 0 -4000155c: 000d46 j 40001595 -4000155f: 2c8a00 lsi f0, a10, 176 -40001562: 000292 l8ui a9, a2, 0 -40001565: 2a9a add.n a2, a10, a9 -40001567: 010222 l8ui a2, a2, 1 -4000156a: 20c9b2 addi a11, a9, 32 -4000156d: 142020 extui a2, a2, 0, 2 -40001570: 220b addi.n a2, a2, -1 -40001572: 839b20 moveqz a9, a11, a2 -40001575: 092d mov.n a2, a9 -40001577: 938a add.n a9, a3, a8 -40001579: 000992 l8ui a9, a9, 0 -4000157c: ba9a add.n a11, a10, a9 -4000157e: 010bb2 l8ui a11, a11, 1 -40001581: 20c9d2 addi a13, a9, 32 -40001584: 14b0b0 extui a11, a11, 0, 2 -40001587: bb0b addi.n a11, a11, -1 -40001589: 839db0 moveqz a9, a13, a11 -4000158c: c02290 sub a2, a2, a9 -4000158f: 72cc bnez.n a2, 4000159a -40001591: 881b addi.n a8, a8, 1 -40001593: 398c beqz.n a9, 4000159a -40001595: c79847 bne a8, a4, 40001560 -40001598: 020c movi.n a2, 0 -4000159a: f01d retw.n -4000159c: 000382 l8ui a8, a3, 0 -4000159f: 331b addi.n a3, a3, 1 -400015a1: 004a82 s8i a8, a10, 0 -400015a4: 440b addi.n a4, a4, -1 -400015a6: 74ac beqz.n a4, 400015d1 -400015a8: aa1b addi.n a10, a10, 1 -400015aa: 048816 beqz a8, 400015f6 -400015ad: 3d6317 bbci a3, 1, 400015ee -400015b0: 000382 l8ui a8, a3, 0 -400015b3: 440b addi.n a4, a4, -1 -400015b5: 004a82 s8i a8, a10, 0 -400015b8: 549c beqz.n a4, 400015d1 -400015ba: aa1b addi.n a10, a10, 1 -400015bc: 68bc beqz.n a8, 400015f6 -400015be: 010382 l8ui a8, a3, 1 -400015c1: 332b addi.n a3, a3, 2 -400015c3: 004a82 s8i a8, a10, 0 -400015c6: 440b addi.n a4, a4, -1 -400015c8: 548c beqz.n a4, 400015d1 -400015ca: aa1b addi.n a10, a10, 1 -400015cc: e8dc bnez.n a8, 400015ee -400015ce: 000906 j 400015f6 -400015d1: f01d retw.n - ... - -400015d4 : -400015d4: 002136 entry a1, 16 -400015d7: 02ad mov.n a10, a2 -400015d9: ff4416 beqz a4, 400015d1 -400015dc: ffa0b2 movi a11, 255 -400015df: fc1551 l32r a5, 40000634 <_stext+0xd4> -400015e2: fc1561 l32r a6, 40000638 <_stext+0xd8> -400015e5: fc1571 l32r a7, 4000063c <_stext+0xdc> -400015e8: b0e307 bbsi a3, 0, 4000159c -400015eb: c1e317 bbsi a3, 1, 400015b0 -400015ee: 380c movi.n a8, 3 -400015f0: 540a87 bnone a10, a8, 40001648 -400015f3: 002746 j 40001694 -400015f6: 090c movi.n a9, 0 -400015f8: 28ea07 bbsi a10, 0, 40001624 -400015fb: 32ea17 bbsi a10, 1, 40001631 -400015fe: 1344a6 blti a4, 4, 40001615 -40001601: 218240 srai a8, a4, 2 -40001604: f03d nop.n -40001606: 038876 loop a8, 4000160d -40001609: 0a99 s32i.n a9, a10, 0 -4000160b: aa4b addi.n a10, a10, 4 -4000160d: 1188e0 slli a8, a8, 2 -40001610: c04480 sub a4, a4, a8 -40001613: 948c beqz.n a4, 40001620 -40001615: 004a92 s8i a9, a10, 0 -40001618: 440b addi.n a4, a4, -1 -4000161a: 01caa2 addi a10, a10, 1 -4000161d: ff4456 bnez a4, 40001615 -40001620: f01d retw.n -40001622: 920000 lsi f0, a0, 0x248 -40001625: 004a add.n a0, a0, a4 -40001627: 440b addi.n a4, a4, -1 -40001629: ff3416 beqz a4, 40001620 -4000162c: aa1b addi.n a10, a10, 1 -4000162e: cc6a17 bbci a10, 1, 400015fe -40001631: 004a92 s8i a9, a10, 0 -40001634: 440b addi.n a4, a4, -1 -40001636: fe6416 beqz a4, 40001620 -40001639: 014a92 s8i a9, a10, 1 -4000163c: 440b addi.n a4, a4, -1 -4000163e: fde416 beqz a4, 40001620 -40001641: aa2b addi.n a10, a10, 2 -40001643: ffedc6 j 400015fe -40001646: 0c0000 lsi f0, a0, 48 -40001649: 7608 l32i.n a0, a6, 28 -4000164b: 1988 l32i.n a8, a9, 4 -4000164d: 4354a6 blti a4, 5, 40001694 -40001650: 0388 l32i.n a8, a3, 0 -40001652: 334b addi.n a3, a3, 4 -40001654: 1408b7 bnone a8, a11, 4000166c -40001657: 1d0857 bnone a8, a5, 40001678 -4000165a: 260867 bnone a8, a6, 40001684 -4000165d: 0a89 s32i.n a8, a10, 0 -4000165f: fcc442 addi a4, a4, -4 -40001662: aa4b addi.n a10, a10, 4 -40001664: 8e0877 bnone a8, a7, 400015f6 -40001667: ffe2c6 j 400015f6 -4000166a: 820000 mull a0, a0, a0 -4000166d: 004a add.n a0, a0, a4 -4000166f: 440b addi.n a4, a4, -1 -40001671: aa1b addi.n a10, a10, 1 -40001673: ffdfc6 j 400015f6 -40001676: 820000 mull a0, a0, a0 -40001679: 005a add.n a0, a0, a5 -4000167b: fec442 addi a4, a4, -2 -4000167e: aa2b addi.n a10, a10, 2 -40001680: ffdc86 j 400015f6 -40001683: 5a8200 msub.s f8, f2, f0 -40001686: 080c00 lsx f0, a12, a0 -40001689: 024a82 s8i a8, a10, 2 -4000168c: fdc442 addi a4, a4, -3 -4000168f: aa3b addi.n a10, a10, 3 -40001691: ffd846 j 400015f6 -40001694: 080c movi.n a8, 0 -40001696: 108876 loop a8, 400016aa -40001699: 000382 l8ui a8, a3, 0 -4000169c: 331b addi.n a3, a3, 1 -4000169e: 004a82 s8i a8, a10, 0 -400016a1: 440b addi.n a4, a4, -1 -400016a3: 648c beqz.n a4, 400016ad -400016a5: aa1b addi.n a10, a10, 1 -400016a7: fff816 beqz a8, 400016aa -400016aa: ffd206 j 400015f6 -400016ad: f01d retw.n - ... - -400016b0 : -400016b0: 004136 entry a1, 32 -400016b3: 0a7da5 call8 4000be8c <__getreent> -400016b6: 20b220 or a11, a2, a2 -400016b9: 20c330 or a12, a3, a3 -400016bc: 000065 call8 400016c4 <_strndup_r> -400016bf: 202aa0 or a2, a10, a10 -400016c2: f01d retw.n - -400016c4 <_strndup_r>: -400016c4: 004136 entry a1, 32 -400016c7: 434a add.n a4, a3, a4 -400016c9: 03cd mov.n a12, a3 -400016cb: 000086 j 400016d1 <_strndup_r+0xd> -400016ce: 01ccc2 addi a12, a12, 1 -400016d1: 139c47 bne a12, a4, 400016e8 <_strndup_r+0x24> -400016d4: c04c30 sub a4, a12, a3 -400016d7: 20a220 or a10, a2, a2 -400016da: 01c4b2 addi a11, a4, 1 -400016dd: 0a4d65 call8 4000bbb4 <_malloc_r> -400016e0: 0a2d mov.n a2, a10 -400016e2: cacc bnez.n a10, 400016f2 <_strndup_r+0x2e> -400016e4: f01d retw.n -400016e6: 820000 mull a0, a0, a0 -400016e9: 000c movi.n a0, 0 -400016eb: fdf856 bnez a8, 400016ce <_strndup_r+0xa> -400016ee: fff886 j 400016d4 <_strndup_r+0x10> -400016f1: b33000 movgez a3, a0, a0 -400016f4: c44020 extui a4, a2, 0, 13 -400016f7: bce520 lsi f2, a5, 0x2f0 -400016fa: 400a add.n a4, a0, a0 -400016fc: 0c8042 lsi f4, a0, 48 -400016ff: 443203 lsi f0, a2, 0x110 -40001702: f01d00 subx8 a1, a13, a0 -40001705: 000000 ill - -40001708 : -40001708: 004136 entry a1, 32 -4000170b: 02ad mov.n a10, a2 -4000170d: 020c movi.n a2, 0 -4000170f: 53cc bnez.n a3, 40001718 -40001711: 0004c6 j 40001728 -40001714: a81b addi.n a10, a8, 1 -40001716: 082d mov.n a2, a8 -40001718: 20b330 or a11, a3, a3 -4000171b: 0ae225 call8 4000c53c -4000171e: 208aa0 or a8, a10, a10 -40001721: fefa56 bnez a10, 40001714 -40001724: 000090 retw -40001727: b33000 movgez a3, a0, a0 -4000172a: e12520 lsi f2, a5, 0x384 -4000172d: a00a add.n a10, a0, a0 -4000172f: 202a add.n a2, a0, a2 -40001731: 000090 retw - -40001734 : -40001734: 004136 entry a1, 32 -40001737: 0022a2 l32i a10, a2, 0 -4000173a: 20c220 or a12, a2, a2 -4000173d: 20b330 or a11, a3, a3 -40001740: 0d0c movi.n a13, 0 -40001742: 0af665 call8 4000c6a8 <__strtok_r> -40001745: 0a2d mov.n a2, a10 -40001747: f01d retw.n -40001749: 000000 ill - -4000174c : -4000174c: 004136 entry a1, 32 -4000174f: fba681 l32r a8, 400005e8 <_stext+0x88> -40001752: 029d mov.n a9, a2 -40001754: 08a8 l32i.n a10, a8, 0 -40001756: 000546 j 4000176f -40001759: ba8a add.n a11, a10, a8 -4000175b: 010bc2 l8ui a12, a11, 1 -4000175e: e0c8b2 addi a11, a8, -32 -40001761: 14c0c0 extui a12, a12, 0, 2 -40001764: feccc2 addi a12, a12, -2 -40001767: 838bc0 moveqz a8, a11, a12 -4000176a: 004982 s8i a8, a9, 0 -4000176d: 991b addi.n a9, a9, 1 -4000176f: 000982 l8ui a8, a9, 0 -40001772: fe3856 bnez a8, 40001759 -40001775: f01d retw.n - ... - -40001778 : -40001778: 004136 entry a1, 32 -4000177b: 0a7125 call8 4000be8c <__getreent> -4000177e: 20b220 or a11, a2, a2 -40001781: 0a5ba5 call8 4000bd3c <_close_r> -40001784: 202aa0 or a2, a10, a10 -40001787: f01d retw.n -40001789: 000000 ill - -4000178c : -4000178c: 00a136 entry a1, 80 -4000178f: 9179 s32i.n a7, a1, 36 -40001791: 10c172 addi a7, a1, 16 -40001794: 1179 s32i.n a7, a1, 4 -40001796: 30c172 addi a7, a1, 48 -40001799: 0179 s32i.n a7, a1, 0 -4000179b: 870c movi.n a7, 8 -4000179d: 6149 s32i.n a4, a1, 24 -4000179f: 7159 s32i.n a5, a1, 28 -400017a1: 8169 s32i.n a6, a1, 32 -400017a3: 2179 s32i.n a7, a1, 8 -400017a5: 0a6e65 call8 4000be8c <__getreent> -400017a8: 2188 l32i.n a8, a1, 8 -400017aa: 891c movi.n a9, 24 -400017ac: d84b addi.n a13, a8, 4 -400017ae: 21d9 s32i.n a13, a1, 8 -400017b0: 0529d7 blt a9, a13, 400017b9 -400017b3: 1188 l32i.n a8, a1, 4 -400017b5: 000286 j 400017c3 -400017b8: 298700 lsi f0, a7, 164 -400017bb: 472c03 lsi f0, a12, 0x11c -400017be: 2179 s32i.n a7, a1, 8 -400017c0: 002182 l32i a8, a1, 0 -400017c3: 022172 l32i a7, a1, 8 -400017c6: 20b220 or a11, a2, a2 -400017c9: 887a add.n a8, a8, a7 -400017cb: fcc882 addi a8, a8, -4 -400017ce: 08d8 l32i.n a13, a8, 0 -400017d0: 03cd mov.n a12, a3 -400017d2: 0a5825 call8 4000bd54 <_open_r> -400017d5: 0a2d mov.n a2, a10 -400017d7: f01d retw.n -400017d9: 000000 ill - -400017dc : -400017dc: 004136 entry a1, 32 -400017df: 0a6ae5 call8 4000be8c <__getreent> -400017e2: 20b220 or a11, a2, a2 -400017e5: 20c330 or a12, a3, a3 -400017e8: 04dd mov.n a13, a4 -400017ea: 0a5be5 call8 4000bda8 <_read_r> -400017ed: 0a2d mov.n a2, a10 -400017ef: f01d retw.n -400017f1: 000000 ill - -400017f4 : -400017f4: 004136 entry a1, 32 -400017f7: 0a6965 call8 4000be8c <__getreent> -400017fa: 20b220 or a11, a2, a2 -400017fd: 0a4e65 call8 4000bce4 <_sbrk_r> -40001800: 202aa0 or a2, a10, a10 -40001803: f01d retw.n -40001805: 000000 ill - -40001808 : -40001808: 004136 entry a1, 32 -4000180b: 0a6825 call8 4000be8c <__getreent> -4000180e: 20b220 or a11, a2, a2 -40001811: 0a42e5 call8 4000bc40 <_times_r> -40001814: 202aa0 or a2, a10, a10 -40001817: f01d retw.n -40001819: 000000 ill - -4000181c : -4000181c: 004136 entry a1, 32 -4000181f: 0a66e5 call8 4000be8c <__getreent> -40001822: 20b220 or a11, a2, a2 -40001825: 20c330 or a12, a3, a3 -40001828: 04dd mov.n a13, a4 -4000182a: 0a5465 call8 4000bd70 <_write_r> -4000182d: 0a2d mov.n a2, a10 -4000182f: f01d retw.n -40001831: 000000 ill - -40001834 <__get_current_time_locale>: -40001834: 004136 entry a1, 32 -40001837: fb8321 l32r a2, 40000644 <_stext+0xe4> -4000183a: f01d retw.n - -4000183c <__time_load_locale>: -4000183c: 004136 entry a1, 32 -4000183f: 020c movi.n a2, 0 -40001841: f01d retw.n - ... - -40001844