]> xenbits.xensource.com Git - unikraft/libs/micropython.git/commitdiff
Add patches.
authorFelipe Huici <felipe.huici@neclab.eu>
Tue, 8 Oct 2019 07:47:40 +0000 (09:47 +0200)
committerFelipe Huici <felipe.huici@neclab.eu>
Wed, 9 Oct 2019 13:32:51 +0000 (15:32 +0200)
Add patches to fix compilation errors and to adapt unix/main.c and
modlwip.c to Unikraft.

Signed-off-by: Felipe Huici <felipe.huici@neclab.eu>
Reviewed-by: Vlad-Andrei Badoiu <vlad_andrei.badoiu@stud.acs.upb.ro>
patches/0001-missing-board-defines.patch [new file with mode: 0644]
patches/0002-clearup-nlrpush-frame.patch [new file with mode: 0644]
patches/0003-compile-guard-gc-function-unix-alloc.patch [new file with mode: 0644]
patches/0004-adapt-main-c-to-unikraft.patch [new file with mode: 0644]
patches/0005-adapt-modlwip-to-unikraft.patch [new file with mode: 0644]

diff --git a/patches/0001-missing-board-defines.patch b/patches/0001-missing-board-defines.patch
new file mode 100644 (file)
index 0000000..22a7313
--- /dev/null
@@ -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 (file)
index 0000000..44b5849
--- /dev/null
@@ -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 (file)
index 0000000..6863e68
--- /dev/null
@@ -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 (file)
index 0000000..d924d58
--- /dev/null
@@ -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 (file)
index 0000000..f1f99e2
--- /dev/null
@@ -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