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
|