[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

 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.