[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Minios-devel] [UNIKRAFT/LIBMICROPYTHON PATCH 4/7] Add patches.
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 + + #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 -- 2.20.1 _______________________________________________ Minios-devel mailing list Minios-devel@xxxxxxxxxxxxxxxxxxxx https://lists.xenproject.org/mailman/listinfo/minios-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |