summaryrefslogtreecommitdiff
path: root/py
diff options
context:
space:
mode:
Diffstat (limited to 'py')
-rw-r--r--py/asmrv32.c14
-rw-r--r--py/binary.c20
-rw-r--r--py/misc.h2
-rw-r--r--py/mpconfig.h11
4 files changed, 30 insertions, 17 deletions
diff --git a/py/asmrv32.c b/py/asmrv32.c
index 158b55219..723d32cdd 100644
--- a/py/asmrv32.c
+++ b/py/asmrv32.c
@@ -573,12 +573,8 @@ void asm_rv32_meta_comparison_ne(asm_rv32_t *state, mp_uint_t rs1, mp_uint_t rs2
}
void asm_rv32_meta_comparison_lt(asm_rv32_t *state, mp_uint_t rs1, mp_uint_t rs2, mp_uint_t rd, bool unsigned_comparison) {
- // slt(u) rd, rs1, rs2
- if (unsigned_comparison) {
- asm_rv32_opcode_sltu(state, rd, rs1, rs2);
- } else {
- asm_rv32_opcode_slt(state, rd, rs1, rs2);
- }
+ // slt|sltu rd, rs1, rs2
+ asm_rv32_emit_word_opcode(state, RV32_ENCODE_TYPE_R(0x33, (0x02 | (unsigned_comparison ? 1 : 0)), 0x00, rd, rs1, rs2));
}
void asm_rv32_meta_comparison_le(asm_rv32_t *state, mp_uint_t rs1, mp_uint_t rs2, mp_uint_t rd, bool unsigned_comparison) {
@@ -588,11 +584,7 @@ void asm_rv32_meta_comparison_le(asm_rv32_t *state, mp_uint_t rs1, mp_uint_t rs2
// ... ; PC + 8
asm_rv32_opcode_cli(state, rd, 1);
asm_rv32_opcode_beq(state, rs1, rs2, 8);
- if (unsigned_comparison) {
- asm_rv32_opcode_sltu(state, rd, rs1, rs2);
- } else {
- asm_rv32_opcode_slt(state, rd, rs1, rs2);
- }
+ asm_rv32_meta_comparison_lt(state, rs1, rs2, rd, unsigned_comparison);
}
#endif // MICROPY_EMIT_RV32
diff --git a/py/binary.c b/py/binary.c
index 48d3421bc..ef2857b43 100644
--- a/py/binary.c
+++ b/py/binary.c
@@ -69,11 +69,13 @@ size_t mp_binary_get_size(char struct_type, char val_type, size_t *palign) {
case 'Q':
size = 8;
break;
+ #if MICROPY_PY_STRUCT_UNSAFE_TYPECODES
case 'P':
case 'O':
case 'S':
size = sizeof(void *);
break;
+ #endif
case 'e':
size = 2;
break;
@@ -119,12 +121,14 @@ size_t mp_binary_get_size(char struct_type, char val_type, size_t *palign) {
align = alignof(long long);
size = sizeof(long long);
break;
+ #if MICROPY_PY_STRUCT_UNSAFE_TYPECODES
case 'P':
case 'O':
case 'S':
align = alignof(void *);
size = sizeof(void *);
break;
+ #endif
case 'e':
align = 2;
size = 2;
@@ -280,12 +284,14 @@ mp_obj_t mp_binary_get_val_array(char typecode, void *p, size_t index) {
case 'd':
return mp_obj_new_float_from_d(((double *)p)[index]);
#endif
- // Extension to CPython: array of objects
+ // Extension to CPython: array of objects
+ #if MICROPY_PY_STRUCT_UNSAFE_TYPECODES
case 'O':
return ((mp_obj_t *)p)[index];
// Extension to CPython: array of pointers
case 'P':
return mp_obj_new_int((mp_int_t)(uintptr_t)((void **)p)[index]);
+ #endif
}
return MP_OBJ_NEW_SMALL_INT(val);
}
@@ -334,9 +340,9 @@ mp_obj_t mp_binary_get_val(char struct_type, char val_type, byte *p_base, byte *
long long val = mp_binary_get_int(size, is_signed(val_type), (struct_type == '>'), p);
- if (val_type == 'O') {
+ if (MICROPY_PY_STRUCT_UNSAFE_TYPECODES && val_type == 'O') {
return (mp_obj_t)(mp_uint_t)val;
- } else if (val_type == 'S') {
+ } else if (MICROPY_PY_STRUCT_UNSAFE_TYPECODES && val_type == 'S') {
const char *s_val = (const char *)(uintptr_t)(mp_uint_t)val;
return mp_obj_new_str_from_cstr(s_val);
#if MICROPY_PY_BUILTINS_FLOAT
@@ -407,9 +413,11 @@ void mp_binary_set_val(char struct_type, char val_type, mp_obj_t val_in, byte *p
mp_uint_t val;
switch (val_type) {
+ #if MICROPY_PY_STRUCT_UNSAFE_TYPECODES
case 'O':
val = (mp_uint_t)val_in;
break;
+ #endif
#if MICROPY_PY_BUILTINS_FLOAT
case 'e':
val = mp_encode_half_float(mp_obj_get_float_to_f(val_in));
@@ -474,10 +482,12 @@ void mp_binary_set_val_array(char typecode, void *p, size_t index, mp_obj_t val_
((double *)p)[index] = mp_obj_get_float_to_d(val_in);
break;
#endif
+ #if MICROPY_PY_STRUCT_UNSAFE_TYPECODES
// Extension to CPython: array of objects
case 'O':
((mp_obj_t *)p)[index] = val_in;
break;
+ #endif
default:
#if MICROPY_LONGINT_IMPL != MICROPY_LONGINT_IMPL_NONE
if (mp_obj_is_exact_type(val_in, &mp_type_int)) {
@@ -534,9 +544,11 @@ void mp_binary_set_val_array_from_int(char typecode, void *p, size_t index, mp_i
((double *)p)[index] = (double)val;
break;
#endif
- // Extension to CPython: array of pointers
+ // Extension to CPython: array of pointers
+ #if MICROPY_PY_STRUCT_UNSAFE_TYPECODES
case 'P':
((void **)p)[index] = (void *)(uintptr_t)val;
break;
+ #endif
}
}
diff --git a/py/misc.h b/py/misc.h
index 86ac2ec9a..5c1cc2f7a 100644
--- a/py/misc.h
+++ b/py/misc.h
@@ -26,6 +26,8 @@
#ifndef MICROPY_INCLUDED_PY_MISC_H
#define MICROPY_INCLUDED_PY_MISC_H
+#include "py/mpconfig.h"
+
// a mini library of useful types and functions
/** types *******************************************************/
diff --git a/py/mpconfig.h b/py/mpconfig.h
index 8775b74bb..5fe0e822f 100644
--- a/py/mpconfig.h
+++ b/py/mpconfig.h
@@ -30,9 +30,9 @@
// as well as a fallback to generate MICROPY_GIT_TAG if the git repo or tags
// are unavailable.
#define MICROPY_VERSION_MAJOR 1
-#define MICROPY_VERSION_MINOR 26
+#define MICROPY_VERSION_MINOR 27
#define MICROPY_VERSION_MICRO 0
-#define MICROPY_VERSION_PRERELEASE 0
+#define MICROPY_VERSION_PRERELEASE 1
// Combined version as a 32-bit number for convenience to allow version
// comparison. Doesn't include prerelease state.
@@ -1601,6 +1601,13 @@ typedef time_t mp_timestamp_t;
#define MICROPY_PY_STRUCT (MICROPY_CONFIG_ROM_LEVEL_AT_LEAST_CORE_FEATURES)
#endif
+// Whether struct module provides unsafe and non-standard typecodes O, P, S.
+// These typecodes are not in CPython and can cause crashes by accessing arbitrary
+// memory.
+#ifndef MICROPY_PY_STRUCT_UNSAFE_TYPECODES
+#define MICROPY_PY_STRUCT_UNSAFE_TYPECODES (1)
+#endif
+
// Whether to provide "sys" module
#ifndef MICROPY_PY_SYS
#define MICROPY_PY_SYS (MICROPY_CONFIG_ROM_LEVEL_AT_LEAST_CORE_FEATURES)