WARNING - OLD ARCHIVES

This is an archived copy of the Xen.org mailing list, which we have preserved to ensure that existing links to archives are not broken. The live archive, which contains the latest emails, can be found at http://lists.xen.org/
   
 
 
Xen 
 
Home Products Support Community News
 
   
 

xen-devel

[Xen-devel] POC: ncurses in stubdom

Ferenc Wagner <wferi@xxxxxxx> writes:

> Error opening terminal: unknown.
>
> Now let's try to hardwire the terminal type to xterm or similar...

Yeah, calling setenv("TERM","xterm",1) before initialization resulted
in a working ncurses stub domain!  Patches against Xen-3.3.1 attached.

 * One needs to apply xen_ncurses.patch only, that references the
 other two (so tune the paths).

 * fpathconf() is stubbed in main.c, because I don't understand the
 issue yet.

 * access() is also blatantly stubbed, as it's pointless in stub
 domains anyway.

 * Most other changes are debatable as well, but they're quite small
 and should be even smaller in the development version, where some
 issues are already fixed.

 * Example from http://www.captain.at/howto-curses-example.php.

I think something like this (but done right) would be useful in the
official packages as well.

Comments welcome!
-- 
Thanks,
Feri.
diff -ru xen-3.3.1.orig/extras/mini-os/lib/sys.c 
xen-3.3.1/extras/mini-os/lib/sys.c
--- xen-3.3.1.orig/extras/mini-os/lib/sys.c     2009-01-05 12:26:58.000000000 
+0100
+++ xen-3.3.1/extras/mini-os/lib/sys.c  2009-04-28 19:43:43.151850562 +0200
@@ -147,6 +147,16 @@
     return 1;
 }
 
+pid_t tcgetpgrp(int fd)
+{
+    return 1;
+}
+
+pid_t getpgrp(void)
+{
+    return 1;
+}
+
 char *getcwd(char *buf, size_t size)
 {
     snprintf(buf, size, "/");
@@ -364,6 +374,20 @@
     return -1;
 }
 
+int tcflush(int fd, int queue_selector)
+{
+    switch (files[fd].type) {
+        case FTYPE_CONSOLE:
+            /* Already flushed */
+            return 0;
+        default:
+            break;
+    }
+    printk("tcflush(%d): Bad descriptor\n", fd);
+    errno = EBADF;
+    return -1;
+}
+
 int close(int fd)
 {
     printk("close(%d)\n", fd);
@@ -472,6 +496,8 @@
 out:
     return ret;
 }
+/* We do not have symlinks */
+int lstat(const char *path, struct stat *buf) __attribute__((alias("stat")));
 
 int fstat(int fd, struct stat *buf)
 {
@@ -509,6 +535,12 @@
     return -1;
 }
 
+/* Dummy implementation: always true */
+int access(const char *path, int mode)
+{
+       return 0;
+}
+
 int ftruncate(int fd, off_t length)
 {
     switch (files[fd].type) {
diff -ru xen-3.3.1.orig/extras/mini-os/Makefile 
xen-3.3.1/extras/mini-os/Makefile
--- xen-3.3.1.orig/extras/mini-os/Makefile      2009-01-05 12:26:58.000000000 
+0100
+++ xen-3.3.1/extras/mini-os/Makefile   2009-04-28 19:43:43.151850562 +0200
@@ -20,7 +20,7 @@
 
 # Define some default flags for linking.
 LDLIBS := 
-APP_LDLIBS := 
+APP_LDLIBS := -lncurses
 LDARCHLIB := -L$(OBJ_DIR)/$(TARGET_ARCH_DIR) -l$(ARCH_LIB_NAME)
 LDFLAGS_FINAL := -T $(TARGET_ARCH_DIR)/minios-$(XEN_TARGET_ARCH).lds
 
diff -ru xen-3.3.1.orig/stubdom/c/main.c xen-3.3.1/stubdom/c/main.c
--- xen-3.3.1.orig/stubdom/c/main.c     2009-01-05 12:26:58.000000000 +0100
+++ xen-3.3.1/stubdom/c/main.c  2009-04-28 20:01:02.296994535 +0200
@@ -1,8 +1,84 @@
 #include <stdio.h>
 #include <unistd.h>
+#include <stdlib.h>
+
+#include <time.h>
+#include <ncurses/curses.h>
+
+long
+fpathconf (int fd, int name)
+{
+       return 0;
+}
+
+int current_getch;
+int doloop = 1;
+static WINDOW *mainwnd;
+static WINDOW *screen;
+WINDOW *my_win;
+
+int now_sec, now_min, now_hour, now_day, now_wday, now_month, now_year;
+time_t now;
+struct tm *now_tm;
+       
+void screen_init(void) {
+   mainwnd = initscr();
+   noecho();
+   cbreak();
+   nodelay(mainwnd, TRUE);
+   refresh(); // 1)
+   wrefresh(mainwnd);
+   screen = newwin(13, 27, 1, 1);
+   box(screen, ACS_VLINE, ACS_HLINE);
+}
+
+static void update_display(void) {
+   curs_set(0);
+   mvwprintw(screen,1,1,"-------- HEADER --------");
+   mvwprintw(screen,3,6,"TIME: %d:%d:%d", now_hour, now_min, now_sec);
+   mvwprintw(screen,5,6,"DATE: %d-%d-%d", now_day, now_month, now_year);
+   mvwprintw(screen,7,6,"PRESS q TO END");
+   mvwprintw(screen,10,1,"-------- FOOTER --------");
+   wrefresh(screen);
+   refresh();
+}
+
+void screen_end(void) {
+   endwin();
+}
+
+void maketime(void) {
+       // Get the current date/time
+       now = time (NULL);
+       now_tm = localtime (&now);
+   now_sec = now_tm->tm_sec;
+       now_min = now_tm->tm_min;
+       now_hour = now_tm->tm_hour;
+       now_day = now_tm->tm_mday;
+       now_wday = now_tm->tm_wday;
+       now_month = now_tm->tm_mon + 1;
+       now_year = now_tm->tm_year + 1900;
+}
 
 int main(void) {
         sleep(2);
-        printf("Hello, world!\n");
+        printf("Hello, ncurses world!\n");
+       sleep(2);
+
+       setenv("TERM","xterm",1);
+
+   screen_init();
+   while (doloop) {
+      current_getch = getch();
+      if (current_getch == 113) {
+         doloop = 0;
+      }
+      maketime();
+      update_display();
+      sleep(1);
+   }
+   screen_end();
+   printf("TEST ENDS\n");
+
         return 0;
 }
diff -ru xen-3.3.1.orig/stubdom/Makefile xen-3.3.1/stubdom/Makefile
--- xen-3.3.1.orig/stubdom/Makefile     2009-01-05 12:26:58.000000000 +0100
+++ xen-3.3.1/stubdom/Makefile  2009-04-28 19:43:43.159849073 +0200
@@ -20,6 +20,8 @@
 LWIP_VERSION=1.3.0
 GRUB_URL?=http://alpha.gnu.org/gnu/grub
 GRUB_VERSION=0.97
+NCURSES_URL?=ftp://invisible-island.net/ncurses
+NCURSES_VERSION=5.7
 
 WGET=wget -c
 
@@ -59,8 +61,8 @@
 TARGET_CPPFLAGS += -isystem $(CURDIR)/$(MINI_OS)/include/posix
 TARGET_CPPFLAGS += -isystem $(CROSS_PREFIX)/$(GNU_TARGET_ARCH)-xen-elf/include
 TARGET_CPPFLAGS += -isystem $(GCC_INSTALL)include
-TARGET_CPPFLAGS += -isystem $(CURDIR)/lwip/src/include
-TARGET_CPPFLAGS += -isystem $(CURDIR)/lwip/src/include/ipv4
+TARGET_CPPFLAGS += -isystem $(CURDIR)/lwip-$(XEN_TARGET_ARCH)/src/include
+TARGET_CPPFLAGS += -isystem $(CURDIR)/lwip-$(XEN_TARGET_ARCH)/src/include/ipv4
 TARGET_CPPFLAGS += -I$(CURDIR)/include
 
 TARGET_LDFLAGS += -nostdlib -L$(CROSS_PREFIX)/$(GNU_TARGET_ARCH)-xen-elf/lib
@@ -85,6 +87,7 @@
 newlib-$(NEWLIB_VERSION): newlib-$(NEWLIB_VERSION).tar.gz
        tar xzf $<
        patch -d $@ -p0 < newlib.patch
+       patch -d $@ -p0 < ~/xen/newlib_memalign.patch
        touch $@
 
 NEWLIB_STAMPFILE=$(CROSS_ROOT)/$(GNU_TARGET_ARCH)-xen-elf/lib/libc.a
@@ -117,6 +120,27 @@
          $(MAKE) libz.a && \
          $(MAKE) install )
 
+###############
+# Cross-ncurses
+###############
+
+ncurses-$(NCURSES_VERSION).tar.gz:
+       $(WGET) $(NCURSES_URL)/$@
+
+ncurses-$(XEN_TARGET_ARCH): ncurses-$(NCURSES_VERSION).tar.gz
+       tar xzf $<
+       mv ncurses-$(NCURSES_VERSION) $@
+       chmod -R o+w $@
+       patch -d $@ -p1 < ~/xen/ncurses.patch
+
+NCURSES_STAMPFILE=$(CROSS_ROOT)/$(GNU_TARGET_ARCH)-xen-elf/lib/libncurses.a
+.PHONY: cross-ncurses
+cross-ncurses: $(NCURSES_STAMPFILE)
+$(NCURSES_STAMPFILE): ncurses-$(XEN_TARGET_ARCH) $(NEWLIB_STAMPFILE)
+       ( cd $< && \
+         CFLAGS="$(TARGET_CPPFLAGS) $(TARGET_CFLAGS)" CC=$(CC) ./configure 
--prefix=$(CROSS_PREFIX)/$(GNU_TARGET_ARCH)-xen-elf --disable-database 
--with-fallbacks="ansi,linux,vt102,xterm" && \
+         $(MAKE) BUILD_CCFLAGS="-DHAVE_CONFIG_H -I../ncurses -I$(srcdir) 
-I$(INCDIR) -I../include" install.libs )
+
 ##############
 # Cross-libpci
 ##############
@@ -162,7 +186,7 @@
 #######
 
 .PHONY: $(CROSS_ROOT)
-$(CROSS_ROOT): cross-newlib cross-zlib cross-libpci
+$(CROSS_ROOT): cross-newlib cross-zlib cross-ncurses cross-libpci
 
 mk-headers-$(XEN_TARGET_ARCH):
        mkdir -p include/xen && \
diff -ru ncurses-5.7.orig/form/form.h ncurses-5.7/form/form.h
--- ncurses-5.7.orig/form/form.h        2009-04-28 17:39:41.421348906 +0200
+++ ncurses-5.7/form/form.h     2009-04-28 17:47:53.500200395 +0200
@@ -38,6 +38,9 @@
 #include <curses.h>
 #include <eti.h>
 
+/* Xen header bug workaround */
+#undef current
+
 #ifdef __cplusplus
   extern "C" {
 #endif
diff -ru ncurses-5.7.orig/ncurses/base/lib_newterm.c 
ncurses-5.7/ncurses/base/lib_newterm.c
--- ncurses-5.7.orig/ncurses/base/lib_newterm.c 2009-04-28 17:39:41.465351220 
+0200
+++ ncurses-5.7/ncurses/base/lib_newterm.c      2009-04-28 17:48:27.471847654 
+0200
@@ -48,6 +48,9 @@
 #include <term.h>              /* clear_screen, cup & friends, cur_term */
 #include <tic.h>
 
+/* Xen header bug workaround */
+#undef current
+
 MODULE_ID("$Id: lib_newterm.c,v 1.73 2008/08/16 21:20:48 Werner.Fink Exp $")
 
 #ifndef ONLCR                  /* Allows compilation under the QNX 4.2 OS */
diff -ru ncurses-5.7.orig/ncurses/tinfo/lib_baudrate.c 
ncurses-5.7/ncurses/tinfo/lib_baudrate.c
--- ncurses-5.7.orig/ncurses/tinfo/lib_baudrate.c       2009-04-28 
17:39:41.471850972 +0200
+++ ncurses-5.7/ncurses/tinfo/lib_baudrate.c    2009-04-28 17:42:55.999849179 
+0200
@@ -95,6 +95,24 @@
     int sp;                    /* the actual speed */
 };
 
+/* Copied from Linux' /usr/include/bits/termios.h, Mini-OS has no support for 
these */
+#define  B0     0000000         /* hang up */
+#define  B50    0000001
+#define  B75    0000002
+#define  B110   0000003
+#define  B134   0000004
+#define  B150   0000005
+#define  B200   0000006
+#define  B300   0000007
+#define  B600   0000010
+#define  B1200  0000011
+#define  B1800  0000012
+#define  B2400  0000013
+#define  B4800  0000014
+#define  B9600  0000015
+#define  B19200 0000016
+#define  B38400 0000017
+
 static struct speed const speeds[] =
 {
     {B0, 0},
@@ -223,7 +241,7 @@
        ospeed = _nc_ospeed(result);
 #else /* !USE_OLD_TTY */
 #ifdef TERMIOS
-       ospeed = cfgetospeed(&cur_term->Nttyb);
+       ospeed = B38400; /* not applicable */
 #else
        ospeed = cur_term->Nttyb.sg_ospeed;
 #endif
diff -ru ncurses-5.7.orig/ncurses/tinfo/lib_kernel.c 
ncurses-5.7/ncurses/tinfo/lib_kernel.c
--- ncurses-5.7.orig/ncurses/tinfo/lib_kernel.c 2009-04-28 17:39:41.467853660 
+0200
+++ ncurses-5.7/ncurses/tinfo/lib_kernel.c      2009-04-28 17:39:50.968287551 
+0200
@@ -48,6 +48,11 @@
 #include <curses.priv.h>
 #include <term.h>              /* cur_term */
 
+/* Copied from Linux' /usr/include/bits/termios.h, Mini-OS has no support for 
these */
+#define VERASE 2
+#define VKILL 3
+#define TCIFLUSH        0
+
 MODULE_ID("$Id: lib_kernel.c,v 1.24 2004/05/08 17:11:21 tom Exp $")
 
 static int
diff -ru ncurses-5.7.orig/ncurses/tty/lib_twait.c 
ncurses-5.7/ncurses/tty/lib_twait.c
--- ncurses-5.7.orig/ncurses/tty/lib_twait.c    2009-04-28 17:39:41.475852203 
+0200
+++ ncurses-5.7/ncurses/tty/lib_twait.c 2009-04-28 17:39:50.968287551 +0200
@@ -41,8 +41,6 @@
 **     comments, none of the original code remains - T.Dickey).
 */
 
-#include <curses.priv.h>
-
 #if defined __HAIKU__ && defined __BEOS__
 #undef __BEOS__
 #endif
@@ -68,6 +66,8 @@
 
 #undef CUR
 
+#include <curses.priv.h>
+
 MODULE_ID("$Id: lib_twait.c,v 1.59 2008/08/30 20:08:19 tom Exp $")
 
 static long
diff -ru ncurses-5.7.orig/ncurses/tty/tty_update.c 
ncurses-5.7/ncurses/tty/tty_update.c
--- ncurses-5.7.orig/ncurses/tty/tty_update.c   2009-04-28 17:39:41.475852203 
+0200
+++ ncurses-5.7/ncurses/tty/tty_update.c        2009-04-28 17:39:50.971849134 
+0200
@@ -42,8 +42,6 @@
  *
  *-----------------------------------------------------------------*/
 
-#include <curses.priv.h>
-
 #if defined __HAIKU__ && defined __BEOS__
 #undef __BEOS__
 #endif
@@ -75,6 +73,8 @@
 #endif
 #endif
 
+#include <curses.priv.h>
+
 #include <ctype.h>
 #include <term.h>
 
--- newlib/libc/include/malloc.h.orig   2009-04-28 17:58:18.919855472 +0200
+++ newlib/libc/include/malloc.h        2009-04-28 17:58:51.472346774 +0200
@@ -73,6 +73,7 @@
 #else
 extern _PTR _memalign_r _PARAMS ((struct _reent *, size_t, size_t));
 #endif
+#define posix_memalign memalign
 
 extern struct mallinfo mallinfo _PARAMS ((void));
 #ifdef __CYGWIN__
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-devel