Skip to content

Commit 755b014

Browse files
dhylandspfalcon
authored andcommitted
unix: machine_mem improvements
This basically introduces the MICROPY_MACHINE_MEM_GET_READ_ADDR and MICROPY_MACHINE_MEM_GET_WRITE_ADDR macros. If one of them is not defined, then a default identity function is provided.
1 parent acaccb3 commit 755b014

File tree

4 files changed

+40
-15
lines changed

4 files changed

+40
-15
lines changed

extmod/machine_mem.c

Lines changed: 28 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,9 +25,35 @@
2525
*/
2626

2727
#include "extmod/machine_mem.h"
28+
#include "py/nlr.h"
2829

2930
#if MICROPY_PY_MACHINE
3031

32+
// If you wish to override the functions for mapping the machine_mem read/write
33+
// address, then add a #define for MICROPY_MACHINE_MEM_GET_READ_ADDR and/or
34+
// MICROPY_MACHINE_MEM_GET_WRITE_ADDR in yopur mpconfigport.h. Since the
35+
// prototypes are identical, it is allowable for both of the macros to evaluate
36+
// the to same function.
37+
//
38+
// It is expected that the modmachine.c file for a given port will provide the
39+
// implementations, if the default implementation isn't used.
40+
41+
#if !defined(MICROPY_MACHINE_MEM_GET_READ_ADDR) || !defined(MICROPY_MACHINE_MEM_GET_WRITE_ADDR)
42+
STATIC uintptr_t machine_mem_get_addr(mp_obj_t addr_o, uint align) {
43+
uintptr_t addr = mp_obj_int_get_truncated(addr_o);
44+
if ((addr & (align - 1)) != 0) {
45+
nlr_raise(mp_obj_new_exception_msg_varg(&mp_type_ValueError, "address %08x is not aligned to %d bytes", addr, align));
46+
}
47+
return addr;
48+
}
49+
#if !defined(MICROPY_MACHINE_MEM_GET_READ_ADDR)
50+
#define MICROPY_MACHINE_MEM_GET_READ_ADDR machine_mem_get_addr
51+
#endif
52+
#if !defined(MICROPY_MACHINE_MEM_GET_WRITE_ADDR)
53+
#define MICROPY_MACHINE_MEM_GET_WRITE_ADDR machine_mem_get_addr
54+
#endif
55+
#endif
56+
3157
STATIC void machine_mem_print(const mp_print_t *print, mp_obj_t self_in, mp_print_kind_t kind) {
3258
(void)kind;
3359
machine_mem_obj_t *self = MP_OBJ_TO_PTR(self_in);
@@ -42,7 +68,7 @@ STATIC mp_obj_t machine_mem_subscr(mp_obj_t self_in, mp_obj_t index, mp_obj_t va
4268
return MP_OBJ_NULL; // op not supported
4369
} else if (value == MP_OBJ_SENTINEL) {
4470
// load
45-
uintptr_t addr = machine_mem_get_read_addr(index, self->elem_size);
71+
uintptr_t addr = MICROPY_MACHINE_MEM_GET_READ_ADDR(index, self->elem_size);
4672
uint32_t val;
4773
switch (self->elem_size) {
4874
case 1: val = (*(uint8_t*)addr); break;
@@ -52,7 +78,7 @@ STATIC mp_obj_t machine_mem_subscr(mp_obj_t self_in, mp_obj_t index, mp_obj_t va
5278
return mp_obj_new_int(val);
5379
} else {
5480
// store
55-
uintptr_t addr = machine_mem_get_write_addr(index, self->elem_size);
81+
uintptr_t addr = MICROPY_MACHINE_MEM_GET_WRITE_ADDR(index, self->elem_size);
5682
uint32_t val = mp_obj_get_int(value);
5783
switch (self->elem_size) {
5884
case 1: (*(uint8_t*)addr) = val; break;

extmod/machine_mem.h

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -25,8 +25,8 @@
2525
*/
2626

2727

28-
#ifndef MICROPY_EXTMOD_MACHINE_MEM
29-
#define MICROPY_EXTMOD_MACHINE_MEM
28+
#ifndef __MICROPY_INCLUDED_EXTMOD_MACHINE_MEM_H__
29+
#define __MICROPY_INCLUDED_EXTMOD_MACHINE_MEM_H__
3030

3131
#include "py/obj.h"
3232

@@ -41,10 +41,11 @@ extern const machine_mem_obj_t machine_mem8_obj;
4141
extern const machine_mem_obj_t machine_mem16_obj;
4242
extern const machine_mem_obj_t machine_mem32_obj;
4343

44-
// It is expected that a port will provide the following 2 functions.
45-
// We define the prototypes here, but the modmachine.c file for a port should
46-
// provide the implementation
47-
uintptr_t machine_mem_get_read_addr(mp_obj_t addr_o, uint align);
48-
uintptr_t machine_mem_get_write_addr(mp_obj_t addr_o, uint align);
44+
#if defined(MICROPY_MACHINE_MEM_GET_READ_ADDR)
45+
uintptr_t MICROPY_MACHINE_MEM_GET_READ_ADDR(mp_obj_t addr_o, uint align);
46+
#endif
47+
#if defined(MICROPY_MACHINE_MEM_GET_WRITE_ADDR)
48+
uintptr_t MICROPY_MACHINE_MEM_GET_WRITE_ADDR(mp_obj_t addr_o, uint align);
49+
#endif
4950

50-
#endif /* MICROPY_EXTMOD_MACHINE_MEM */
51+
#endif // __MICROPY_INCLUDED_EXTMOD_MACHINE_MEM_H__

unix/modmachine.c

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@
4242

4343
#if MICROPY_PY_MACHINE
4444

45-
uintptr_t machine_mem_get_read_addr(mp_obj_t addr_o, uint align) {
45+
uintptr_t mod_machine_mem_get_addr(mp_obj_t addr_o, uint align) {
4646
uintptr_t addr = mp_obj_int_get_truncated(addr_o);
4747
if ((addr & (align - 1)) != 0) {
4848
nlr_raise(mp_obj_new_exception_msg_varg(&mp_type_ValueError, "address %08x is not aligned to %d bytes", addr, align));
@@ -72,10 +72,6 @@ uintptr_t machine_mem_get_read_addr(mp_obj_t addr_o, uint align) {
7272
return addr;
7373
}
7474

75-
uintptr_t machine_mem_get_write_addr(mp_obj_t addr_o, uint align) {
76-
return machine_mem_get_read_addr(addr_o, align);
77-
}
78-
7975
STATIC const mp_rom_map_elem_t machine_module_globals_table[] = {
8076
{ MP_ROM_QSTR(MP_QSTR___name__), MP_ROM_QSTR(MP_QSTR_umachine) },
8177

unix/mpconfigport.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -108,6 +108,8 @@
108108
#define MICROPY_PY_USELECT (1)
109109
#endif
110110
#define MICROPY_PY_MACHINE (1)
111+
#define MICROPY_MACHINE_MEM_GET_READ_ADDR mod_machine_mem_get_addr
112+
#define MICROPY_MACHINE_MEM_GET_WRITE_ADDR mod_machine_mem_get_addr
111113

112114
// Define to MICROPY_ERROR_REPORTING_DETAILED to get function, etc.
113115
// names in exception messages (may require more RAM).

0 commit comments

Comments
 (0)