[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Minios-devel] [UNIKRAFT/LIBMICROPYTHON PATCH v3 4/6] Add patches.
Hey Felipe, Please see one comment inline. Reviewed-by: Vlad-Andrei Badoiu <vlad_andrei.badoiu@xxxxxxxxxxxxxxx> On 09.10.2019 10:14, Felipe Huici wrote: > Add patches to fix compilation errors and to adapt unix/main.c and > modlwip.c to Unikraft. > > Signed-off-by: Felipe Huici <felipe.huici@xxxxxxxxx> > --- > patches/0001-missing-board-defines.patch | 11 + > patches/0002-clearup-nlrpush-frame.patch | 10 + > ...compile-guard-gc-function-unix-alloc.patch | 16 ++ > patches/0004-adapt-main-c-to-unikraft.patch | 46 ++++ > patches/0005-adapt-modlwip-to-unikraft.patch | 242 ++++++++++++++++++ > 5 files changed, 325 insertions(+) > create mode 100644 patches/0001-missing-board-defines.patch > create mode 100644 patches/0002-clearup-nlrpush-frame.patch > create mode 100644 patches/0003-compile-guard-gc-function-unix-alloc.patch > create mode 100644 patches/0004-adapt-main-c-to-unikraft.patch > create mode 100644 patches/0005-adapt-modlwip-to-unikraft.patch > > diff --git a/patches/0001-missing-board-defines.patch > b/patches/0001-missing-board-defines.patch > new file mode 100644 > index 0000000..22a7313 > --- /dev/null > +++ b/patches/0001-missing-board-defines.patch > @@ -0,0 +1,11 @@ > +--- a/unix/mpconfigport.h.orig 2017-11-18 08:43:56.096441368 +0100 > ++++ b/unix/mpconfigport.h 2017-11-18 08:42:05.225463413 +0100 > +@@ -25,6 +25,8 @@ > + */ > + > + // options to control how MicroPython is built > ++#define MICROPY_HW_BOARD_NAME "unix" > ++#define MICROPY_HW_MCU_NAME "unknown-cpu" > + > + #define MICROPY_ALLOC_PATH_MAX (PATH_MAX) > + #define MICROPY_PERSISTENT_CODE_LOAD (1) > diff --git a/patches/0002-clearup-nlrpush-frame.patch > b/patches/0002-clearup-nlrpush-frame.patch > new file mode 100644 > index 0000000..44b5849 > --- /dev/null > +++ b/patches/0002-clearup-nlrpush-frame.patch > @@ -0,0 +1,10 @@ > +--- a/py/nlrx64.c.orig 2017-08-23 11:50:10.000000000 +0200 > ++++ b/py/nlrx64.c 2017-11-21 14:44:45.513728670 +0100 > +@@ -64,6 +64,7 @@ > + #if defined(__APPLE__) || defined(__MACH__) > + "pop %rbp \n" // undo function's prelude > + #endif > ++ "leaveq \n" // clean up our frame > + "movq (%rsp), %rax \n" // load return %rip > + "movq %rax, 16(%rdi) \n" // store %rip into nlr_buf > + "movq %rbp, 24(%rdi) \n" // store %rbp into nlr_buf > diff --git a/patches/0003-compile-guard-gc-function-unix-alloc.patch > b/patches/0003-compile-guard-gc-function-unix-alloc.patch > new file mode 100644 > index 0000000..6863e68 > --- /dev/null > +++ b/patches/0003-compile-guard-gc-function-unix-alloc.patch > @@ -0,0 +1,16 @@ > +--- a/unix/alloc.c 2019-10-02 11:16:25.154625696 +0200 > ++++ b/unix/alloc.c 2019-10-02 11:16:47.878383872 +0200 > +@@ -79,11 +79,13 @@ > + } > + } > + > ++#if MICROPY_ENABLE_GC > + void mp_unix_mark_exec(void) { > + for (mmap_region_t *rg = MP_STATE_VM(mmap_region_head); rg != NULL; rg > = rg->next) { > + gc_collect_root(rg->ptr, rg->len / sizeof(mp_uint_t)); > + } > + } > ++#endif Currently enabling the GC is not viable. In the future we should have a config option to toggle the GC. > + > + #if MICROPY_FORCE_PLAT_ALLOC_EXEC > + // Provide implementation of libffi ffi_closure_* functions in terms > diff --git a/patches/0004-adapt-main-c-to-unikraft.patch > b/patches/0004-adapt-main-c-to-unikraft.patch > new file mode 100644 > index 0000000..d924d58 > --- /dev/null > +++ b/patches/0004-adapt-main-c-to-unikraft.patch > @@ -0,0 +1,46 @@ > +--- a/unix/main.c 2017-08-23 03:50:11.000000000 +0200 > ++++ b/unix/main.c 2019-10-07 20:47:18.419884044 +0200 > +@@ -51,6 +51,8 @@ > + #include "genhdr/mpversion.h" > + #include "input.h" > + > ++#include <uk/plat/memory.h> > ++ > + // Command line options, with their defaults > + STATIC bool compile_only = false; > + STATIC uint emit_opt = MP_EMIT_OPT_NONE; > +@@ -614,14 +616,26 @@ > + } > + } > + > +- if (ret == NOTHING_EXECUTED || inspect) { > +- if (isatty(0)) { > +- prompt_read_history(); > +- ret = do_repl(); > +- prompt_write_history(); > +- } else { > +- ret = execute_from_lexer(LEX_SRC_STDIN, NULL, > MP_PARSE_FILE_INPUT, false); > +- } > ++ /* see if script is available from initrd */ > ++ struct ukplat_memregion_desc img; > ++ char *cstr; > ++ if (ukplat_memregion_find_initrd0(&img) >= 0) { > ++ cstr = (char *)img.base; > ++ ret = do_str(cstr); > ++ } > ++ /* repl mode */ > ++ else { > ++ #if MICROPY_REPL_EVENT_DRIVEN > ++ pyexec_event_repl_init(); > ++ for (;;) { > ++ int c = mp_hal_stdin_rx_chr(); > ++ if (pyexec_event_repl_process_char(c)) { > ++ break; > ++ } > ++ } > ++ #else > ++ pyexec_friendly_repl(); > ++ #endif > + } > + > + #if MICROPY_PY_MICROPYTHON_MEM_INFO > diff --git a/patches/0005-adapt-modlwip-to-unikraft.patch > b/patches/0005-adapt-modlwip-to-unikraft.patch > new file mode 100644 > index 0000000..f1f99e2 > --- /dev/null > +++ b/patches/0005-adapt-modlwip-to-unikraft.patch > @@ -0,0 +1,242 @@ > +--- a/extmod/modlwip.c 2017-08-23 03:50:08.000000000 +0200 > ++++ b/extmod/modlwip.c 2019-10-08 09:30:52.025714373 +0200 > +@@ -29,6 +29,16 @@ > + #include <string.h> > + #include <stdio.h> > + > ++#include <uk/print.h> > ++#include <netif/uknetdev.h> > ++ > ++#include "lwip/init.h" > ++#include "lwip/timeouts.h" > ++#include "lwip/tcp.h" > ++#include "lwip/udp.h" > ++#include "lwip/dns.h" > ++#include "lwip/igmp.h" > ++ > + #include "py/nlr.h" > + #include "py/objlist.h" > + #include "py/runtime.h" > +@@ -38,20 +48,7 @@ > + > + #include "lib/netutils/netutils.h" > + > +-#include "lwip/init.h" > +-#include "lwip/timers.h" > +-#include "lwip/tcp.h" > +-#include "lwip/udp.h" > +-//#include "lwip/raw.h" > +-#include "lwip/dns.h" > +-#include "lwip/tcp_impl.h" > +-#include "lwip/igmp.h" > +- > +-#if 0 // print debugging info > +-#define DEBUG_printf DEBUG_printf > +-#else // don't print debugging info > +-#define DEBUG_printf(...) (void)0 > +-#endif > ++#define DEBUG_printf uk_pr_debug > + > + // All socket options should be globally distinct, > + // because we ignore option levels for efficiency. > +@@ -264,6 +261,11 @@ > + #else > + mp_hal_delay_ms(1); > + #endif > ++ > ++ /* !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! */ > ++ uknetdev_poll_all(); > ++ sys_check_timeouts(); > ++ /* !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! */ > + } > + > + > /*******************************************************************************/ > +@@ -305,6 +307,7 @@ > + lwip_socket_obj_t *socket = (lwip_socket_obj_t*)arg; > + > + socket->state = STATE_CONNECTED; > ++ DEBUG_printf("Socket %p connected\n", socket); > + return ERR_OK; > + } > + > +@@ -346,6 +349,7 @@ > + // is idle. > + tcp_poll(newpcb, _lwip_tcp_accept_finished, 1); > + } > ++ DEBUG_printf("Accepted new connection on socket %p\n", socket); > + return ERR_OK; > + } > + } > +@@ -498,6 +502,7 @@ > + u16_t write_len = MIN(available, len); > + > + err_t err = tcp_write(socket->pcb.tcp, buf, write_len, > TCP_WRITE_FLAG_COPY); > ++ DEBUG_printf("Write to socket %p @%p %u bytes: %d\n", socket, buf, > write_len, err); > + > + if (err != ERR_OK) { > + *_errno = error_lookup_table[-err]; > +@@ -524,6 +529,7 @@ > + } > + > + mp_uint_t start = mp_hal_ticks_ms(); > ++ DEBUG_printf("Wait for data on socket %p to receive...\n", socket); > + while (socket->state == STATE_CONNECTED && socket->incoming.pbuf == > NULL) { > + if (socket->timeout != -1 && mp_hal_ticks_ms() - start > > socket->timeout) { > + *_errno = MP_ETIMEDOUT; > +@@ -531,6 +537,7 @@ > + } > + poll_sockets(); > + } > ++ DEBUG_printf("Done\n"); > + > + if (socket->state == STATE_PEER_CLOSED) { > + if (socket->incoming.pbuf == NULL) { > +@@ -636,6 +643,7 @@ > + STATIC mp_obj_t lwip_socket_close(mp_obj_t self_in) { > + lwip_socket_obj_t *socket = self_in; > + bool socket_is_listener = false; > ++ err_t err; > + > + if (socket->pcb.tcp == NULL) { > + return mp_const_none; > +@@ -644,8 +652,14 @@ > + case MOD_NETWORK_SOCK_STREAM: { > + if (socket->pcb.tcp->state == LISTEN) { > + socket_is_listener = true; > +- } > +- if (tcp_close(socket->pcb.tcp) != ERR_OK) { > ++ } else { > ++ /* Flush output queue */ > ++ tcp_output(socket->pcb.tcp); > ++ } > ++ > ++ err = tcp_close(socket->pcb.tcp); > ++ DEBUG_printf("Closed socket %p: %d\n", socket, err); > ++ if (err != ERR_OK) { > + DEBUG_printf("lwip_close: had to call tcp_abort()\n"); > + tcp_abort(socket->pcb.tcp); > + } > +@@ -660,6 +674,7 @@ > + if (!socket_is_listener) { > + pbuf_free(socket->incoming.pbuf); > + } else { > ++ DEBUG_printf("Abort incoming connection request %p\n", > socket->incoming.connection); > + tcp_abort(socket->incoming.connection); > + } > + socket->incoming.pbuf = NULL; > +@@ -694,6 +709,7 @@ > + mp_raise_OSError(error_lookup_table[-err]); > + } > + > ++ DEBUG_printf("lwip_close: Bind socket %p\n", socket); > + return mp_const_none; > + } > + STATIC MP_DEFINE_CONST_FUN_OBJ_2(lwip_socket_bind_obj, lwip_socket_bind); > +@@ -716,6 +732,7 @@ > + socket->pcb.tcp = new_pcb; > + tcp_accept(new_pcb, _lwip_tcp_accept); > + > ++ DEBUG_printf("lwip_listen: Listen on socket %p\n", socket); > + return mp_const_none; > + } > + STATIC MP_DEFINE_CONST_FUN_OBJ_2(lwip_socket_listen_obj, > lwip_socket_listen); > +@@ -748,9 +765,11 @@ > + mp_raise_OSError(MP_ETIMEDOUT); > + } > + } else { > ++ DEBUG_printf("Wait for connection on socket %p\n", socket); > + while (socket->incoming.connection == NULL) { > + poll_sockets(); > + } > ++ DEBUG_printf("Done\n"); > + } > + } > + > +@@ -773,6 +792,7 @@ > + tcp_arg(socket2->pcb.tcp, (void*)socket2); > + tcp_err(socket2->pcb.tcp, _lwip_tcp_error); > + tcp_recv(socket2->pcb.tcp, _lwip_tcp_recv); > ++ DEBUG_printf("New socket for endpoint connection: %p\n", socket2); > + > + tcp_accepted(listener); > + > +@@ -1226,6 +1246,7 @@ > + // Support functions for memory protection. lwIP has its own memory > management > + // routines for its internal structures, and since they might be called in > + // interrupt handlers, they need some protection. > ++/* > + sys_prot_t sys_arch_protect() { > + return (sys_prot_t)MICROPY_BEGIN_ATOMIC_SECTION(); > + } > +@@ -1233,6 +1254,7 @@ > + void sys_arch_unprotect(sys_prot_t state) { > + MICROPY_END_ATOMIC_SECTION((mp_uint_t)state); > + } > ++*/ > + > + > /******************************************************************************/ > + // Polling callbacks for the interfaces connected to lwIP. Right now it > calls > +@@ -1246,6 +1268,7 @@ > + STATIC nic_poll_t lwip_poll_list; > + > + void mod_lwip_register_poll(void (* poll)(void *arg), void *poll_arg) { > ++ DEBUG_printf("Register poll: %p (argp %p)\n", poll, poll_arg); > + lwip_poll_list.poll = poll; > + lwip_poll_list.poll_arg = poll_arg; > + } > +@@ -1256,15 +1279,21 @@ > + > + > /******************************************************************************/ > + // The lwip global functions. > ++#include <netif/uknetdev.h> > + > + STATIC mp_obj_t mod_lwip_reset() { > +- lwip_init(); > ++ DEBUG_printf("lwip reset\n"); > ++ //lwip_init(); > + lwip_poll_list.poll = NULL; > ++ > ++ /* Register uknetdev polling to molwip */ > ++ mod_lwip_register_poll(uknetdev_poll_all, NULL); > + return mp_const_none; > + } > + MP_DEFINE_CONST_FUN_OBJ_0(mod_lwip_reset_obj, mod_lwip_reset); > + > + STATIC mp_obj_t mod_lwip_callback() { > ++ DEBUG_printf("Exec callback\n"); > + if (lwip_poll_list.poll != NULL) { > + lwip_poll_list.poll(lwip_poll_list.poll_arg); > + } > +@@ -1295,6 +1324,7 @@ > + if (n_args > 2) { > + mp_warning("getaddrinfo constraints not supported"); > + } > ++ DEBUG_printf("getaddrinfo\n"); > + > + mp_obj_t host_in = args[0], port_in = args[1]; > + const char *host = mp_obj_str_get_str(host_in); > +@@ -1335,13 +1365,13 @@ > + STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(lwip_getaddrinfo_obj, 2, 6, > lwip_getaddrinfo); > + > + // Debug functions > +- > ++/* > + STATIC mp_obj_t lwip_print_pcbs() { > + tcp_debug_print_pcbs(); > + return mp_const_none; > + } > + MP_DEFINE_CONST_FUN_OBJ_0(lwip_print_pcbs_obj, lwip_print_pcbs); > +- > ++*/ > + #ifdef MICROPY_PY_LWIP > + > + STATIC const mp_rom_map_elem_t mp_module_lwip_globals_table[] = { > +@@ -1349,7 +1379,7 @@ > + { MP_ROM_QSTR(MP_QSTR_reset), MP_ROM_PTR(&mod_lwip_reset_obj) }, > + { MP_ROM_QSTR(MP_QSTR_callback), MP_ROM_PTR(&mod_lwip_callback_obj) }, > + { MP_ROM_QSTR(MP_QSTR_getaddrinfo), MP_ROM_PTR(&lwip_getaddrinfo_obj) }, > +- { MP_ROM_QSTR(MP_QSTR_print_pcbs), MP_ROM_PTR(&lwip_print_pcbs_obj) }, > ++ //{ MP_ROM_QSTR(MP_QSTR_print_pcbs), MP_ROM_PTR(&lwip_print_pcbs_obj) }, > + // objects > + { MP_ROM_QSTR(MP_QSTR_socket), MP_ROM_PTR(&lwip_socket_type) }, > + #ifdef MICROPY_PY_LWIP_SLIP _______________________________________________ Minios-devel mailing list Minios-devel@xxxxxxxxxxxxxxxxxxxx https://lists.xenproject.org/mailman/listinfo/minios-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |