stubdom: use host's gcc
PATCH 1/1 stubdom: use host's gcc
stubdom: use host's gcc
This makes stubdom use the host's gcc instead of downloading/compiling binutils+gcc. That requires a bunch of changes and even uncovered a few bugs, but saves a lot of time.
Signed-off-by Samuel Thibault <[email protected]>
extras/mini-os/Config.mk +4 -4
@@ -38,15 +38,15 @@ # This must be before include minios.mk! include $(MINI-OS_ROOT)/$(TARGET_ARCH_DIR)/arch.mk -extra_incl := $(foreach dir,$(EXTRA_INC),-I$(MINI-OS_ROOT)/include/$(dir)) +extra_incl := $(foreach dir,$(EXTRA_INC),-I$(realpath $(MINI-OS_ROOT)/include/$(dir))) -DEF_CPPFLAGS += -I$(MINI-OS_ROOT)/include +DEF_CPPFLAGS += -I$(realpath $(MINI-OS_ROOT)/include) DEF_CPPFLAGS += -D__MINIOS__ ifeq ($(libc),y) DEF_CPPFLAGS += -DHAVE_LIBC -DEF_CPPFLAGS += -I$(MINI-OS_ROOT)/include/posix -DEF_CPPFLAGS += -I$(XEN_ROOT)/tools/xenstore +DEF_CPPFLAGS += -I$(realpath $(MINI-OS_ROOT)/include/posix) +DEF_CPPFLAGS += -I$(realpath $(XEN_ROOT)/tools/xenstore) endif ifneq ($(LWIPDIR),)
extras/mini-os/arch/x86/mm.c +1 -1
@@ -549,7 +549,7 @@#define L2_P2M_MASK (L2_P2M_ENTRIES - 1)#define L3_P2M_MASK (L3_P2M_ENTRIES - 1) -unsigned long *l1_list, *l2_list, *l3_list; +unsigned long *l1_list =NULL , *l2_list =NULL , *l3_list;unsigned long pfn; l3_list = (unsigned long *)alloc_page ();
extras/mini-os/blkfront.c +12 -9
@@ -84,7 +84,7 @@free (dev); } -struct blkfront_dev *init_blkfront (char *nodename,struct blkfront_info *info) +struct blkfront_dev *init_blkfront (char *_nodename,struct blkfront_info *info) {xenbus_transaction_t xbt;char * err;
@@ -93,11 +93,9 @@int retry=0 ;char * msg;char * c; +char * nodename = _nodename ? _nodename :"device/vbd/768" ;struct blkfront_dev *dev; - -if (!nodename) - nodename ="device/vbd/768" ;char path[strlen (nodename) +1 +10 +1 ];
@@ -342,13 +340,14 @@void blkfront_io (struct blkfront_aiocb *aiocbp,int write) {unsigned long flags; +DEFINE_WAIT (w); +ASSERT (!aiocbp->aio_cb); aiocbp->aio_cb = blkfront_aio_cb;blkfront_aio (aiocbp, write); aiocbp->data =NULL ;local_irq_save (flags); -DEFINE_WAIT (w);while (1 ) {blkfront_aio_poll (aiocbp->aio_dev);if (aiocbp->data)
@@ -393,6 +392,7 @@void blkfront_sync (struct blkfront_dev *dev) {unsigned long flags; +DEFINE_WAIT (w);if (dev->info.mode ==O_RDWR ) {if (dev->info.barrier ==1 )
@@ -404,7 +404,6 @@/* Note: This won't finish if another thread enqueues requests. */ local_irq_save (flags); -DEFINE_WAIT (w);while (1 ) {blkfront_aio_poll (dev);if (RING_FREE_REQUESTS (&dev->ring) ==RING_SIZE (&dev->ring))
@@ -424,6 +423,7 @@RING_IDX rp, cons;struct blkif_response *rsp;int more; +int nr_consumed; moretodo: #ifdef HAVE_LIBC
@@ -437,14 +437,17 @@rmb ();/* Ensure we see queued responses up to 'rp'. */ cons = dev->ring.rsp_cons; -int nr_consumed =0 ; + nr_consumed =0 ;while ((cons != rp)) { +struct blkfront_aiocb *aiocbp; +int status; + rsp =RING_GET_RESPONSE (&dev->ring, cons); nr_consumed++; -struct blkfront_aiocb *aiocbp = (void *) (uintptr_t ) rsp->id; -int status = rsp->status; + aiocbp = (void *) (uintptr_t ) rsp->id; + status = rsp->status;if (status !=BLKIF_RSP_OKAY )printk ("block error %d for op %d\n" , status, rsp->operation);
extras/mini-os/events.c +6 -3
@@ -207,10 +207,11 @@int evtchn_alloc_unbound (domid_t pal,evtchn_handler_t handler,void *data,evtchn_port_t *port) { +int err;evtchn_alloc_unbound_t op; op.dom =DOMID_SELF ; op.remote_dom = pal; -int err =HYPERVISOR_event_channel_op (EVTCHNOP_alloc_unbound, &op); + err =HYPERVISOR_event_channel_op (EVTCHNOP_alloc_unbound, &op);if (err)return err; *port =bind_evtchn (op.port, handler, data);
@@ -224,13 +225,15 @@ evtchn_handler_t handler, void *data, evtchn_port_t *local_port) { + int err; +evtchn_port_t port;evtchn_bind_interdomain_t op; op.remote_dom = pal; op.remote_port = remote_port; -int err =HYPERVISOR_event_channel_op (EVTCHNOP_bind_interdomain, &op); + err =HYPERVISOR_event_channel_op (EVTCHNOP_bind_interdomain, &op);if (err)return err; -evtchn_port_t port = op.local_port; + port = op.local_port; *local_port =bind_evtchn (port, handler, data);return err; }
extras/mini-os/fbfront.c +8 -11
@@ -64,7 +64,7 @@free (dev); } -struct kbdfront_dev *init_kbdfront (char *nodename,int abs_pointer) +struct kbdfront_dev *init_kbdfront (char *_nodename,int abs_pointer) {xenbus_transaction_t xbt;char * err;
@@ -72,11 +72,8 @@struct xenkbd_page *s;int retry=0 ;char * msg; - +char * nodename = _nodename ? _nodename :"device/vkbd/0" ;struct kbdfront_dev *dev; - -if (!nodename) - nodename ="device/vkbd/0" ;char path[strlen (nodename) +1 +10 +1 ];
@@ -351,7 +348,7 @@return i; } -struct fbfront_dev *init_fbfront (char *nodename,unsigned long *mfns,int width,int height,int depth,int stride,int n) +struct fbfront_dev *init_fbfront (char *_nodename,unsigned long *mfns,int width,int height,int depth,int stride,int n) {xenbus_transaction_t xbt;char * err;
@@ -361,9 +358,9 @@char * msg;int i, j;struct fbfront_dev *dev; - -if (!nodename) - nodename ="device/vfb/0" ; +int max_pd; +unsigned long mapped; +char * nodename = _nodename ? _nodename :"device/vfb/0" ;char path[strlen (nodename) +1 +10 +1 ];
@@ -392,8 +389,8 @@ dev->offset =0 ; dev->events =NULL ; -const int max_pd =sizeof (s->pd) /sizeof (s->pd[0 ]); -unsigned long mapped =0 ; + max_pd =sizeof (s->pd) /sizeof (s->pd[0 ]); + mapped =0 ;for (i =0 ; mapped < n && i < max_pd; i++) {unsigned long *pd = (unsigned long *)alloc_page ();
extras/mini-os/hypervisor.c +2 -1
@@ -72,9 +72,10 @@void force_evtchn_callback (void ) { +int save;vcpu_info_t *vcpu; vcpu = &HYPERVISOR_shared_info->vcpu_info[smp_processor_id ()]; -int save = vcpu->evtchn_upcall_mask; + save = vcpu->evtchn_upcall_mask;while (vcpu->evtchn_upcall_pending) { vcpu->evtchn_upcall_mask =1 ;
extras/mini-os/include/ctype.h +5 -0
@@ -1,6 +1,9 @@#ifndef _CTYPE_H#define _CTYPE_H +#ifdef HAVE_LIBC +#include_next <ctype.h> +#else /* * NOTE! This ctype does not handle EOF like the standard C * library is required to.
@@ -53,3 +56,5 @@#define toupper (c) __toupper(c)#endif + +#endif
extras/mini-os/include/errno.h +5 -0
@@ -2,6 +2,8 @@#define _ERRNO_H#include <errno-base.h> + +typedef int error_t ;#define EDEADLK 35/* Resource deadlock would occur */ #define ENAMETOOLONG 36/* File name too long */
@@ -107,6 +109,9 @@#define EOWNERDEAD 130/* Owner died */ #define ENOTRECOVERABLE 131/* State not recoverable */ + +#define EFTYPE 132/* Inappropriate file type or format */ +#ifdef HAVE_LIBC #include <sched.h> extern int errno;
extras/mini-os/include/ia64/arch_spinlock.h +1 -1
@@ -27,7 +27,7 @@#include "atomic.h" -#define ARCH_SPIN_LOCK_UNLOCKED (spinlock_t) { 0 } +#define ARCH_SPIN_LOCK_UNLOCKED { 0 }#define SPIN_LOCK_UNUSED 0#define SPIN_LOCK_USED 1
extras/mini-os/include/sys/lock.h new file +52 -0
52 lines not on this page · raw message
extras/mini-os/include/types.h +7 -2
@@ -36,9 +36,11 @@#endif /* FreeBSD compat types */ +#ifndef HAVE_LIBC typedef unsigned char u_char ;typedef unsigned int u_int ;typedef unsigned long u_long ; +#endif #ifdef __i386__typedef long long quad_t ;typedef unsigned long long u_quad_t ;
@@ -79,11 +81,14 @@typedef u64 uint64_t ,uintmax_t ;typedef s64 int64_t ,intmax_t ;typedef u64 off_t ; +#endif +typedef intptr_t ptrdiff_t ; -#define INT_MAX ((int)(~0U>>1)) -#define UINT_MAX (~0U) +#ifndef HAVE_LIBC typedef long ssize_t ;#endif +typedef unsigned long size_t ; +#endif /* _TYPES_H_ */
extras/mini-os/include/wait.h +1 -22
@@ -2,29 +2,8 @@#define __WAIT_H__#include <sched.h> -#include <list.h> -#include <lib.h> #include <os.h> - -struct wait_queue -{ -struct thread *thread; -struct list_head thread_list; -}; - -struct wait_queue_head -{ -/* TODO - lock required? */ -struct list_head thread_list; -}; - -#define DECLARE_WAIT_QUEUE_HEAD (name) \ - struct wait_queue_head name = \ - { .thread_list = { &(name).thread_list, &(name).thread_list} } - -#define __WAIT_QUEUE_HEAD_INITIALIZER (name) { \ - .thread_list = { &(name).thread_list, &(name).thread_list } } - +#include <waittypes.h> #define DEFINE_WAIT (name) \ struct wait_queue name = { \
extras/mini-os/include/waittypes.h new file +26 -0
@@ -0,0 +1,26 @@ +#ifndef __WAITTYPE_H__ +#define __WAITTYPE_H__ + +#include <list.h> + +struct thread ; +struct wait_queue +{ +struct thread *thread; +struct list_head thread_list; +}; + +struct wait_queue_head +{ +/* TODO - lock required? */ +struct list_head thread_list; +}; + +#define DECLARE_WAIT_QUEUE_HEAD (name) \ + struct wait_queue_head name = \ + { .thread_list = { &(name).thread_list, &(name).thread_list} } + +#define __WAIT_QUEUE_HEAD_INITIALIZER (name) { \ + .thread_list = { &(name).thread_list, &(name).thread_list } } + +#endif
extras/mini-os/include/x86/arch_spinlock.h +1 -1
@@ -7,7 +7,7 @@#include "os.h" -#define ARCH_SPIN_LOCK_UNLOCKED (spinlock_t) { 1 } +#define ARCH_SPIN_LOCK_UNLOCKED { 1 }/* * Simple spin lock operations. There are two variants, one clears IRQ's
extras/mini-os/include/xmalloc.h +2 -0
@@ -10,6 +10,8 @@#define xfree (ptr) free(ptr)#else + +#include <limits.h> #define DEFAULT_ALIGN (sizeof(unsigned long))#define malloc (size) _xmalloc(size, DEFAULT_ALIGN)
extras/mini-os/kernel.c +2 -0
@@ -449,6 +449,8 @@ } pci_dev =init_pcifront (NULL ); +if (!pci_dev) +return ;printk ("PCI devices:\n" );pcifront_scan (pci_dev, print); }
extras/mini-os/lib/ctype.c +2 -0
@@ -1,3 +1,4 @@ +#ifndef HAVE_LIBC #include <ctype.h> unsigned char _ctype[] = {
@@ -25,3 +26,4 @@ _U,_U,_U,_U,_U,_U,_U,_P,_U,_U,_U,_U,_U,_U,_U,_L,/* 208-223 */ _L,_L,_L,_L,_L,_L,_L,_L,_L,_L,_L,_L,_L,_L,_L,_L,/* 224-239 */ _L,_L,_L,_L,_L,_L,_L,_P,_L,_L,_L,_L,_L,_L,_L,_L}; /* 240-255 */ +#endif
extras/mini-os/lib/printf.c +1 -0
@@ -62,6 +62,7 @@#include <lib.h> #include <mm.h> #include <ctype.h> +#include <limits.h> /** * simple_strtoul - convert a string to an unsigned long
extras/mini-os/lib/xmalloc.c +2 -2
@@ -139,7 +139,7 @@void *_xmalloc (size_t size,size_t align) { -struct xmalloc_hdr *i, *hdr =NULL ; +struct xmalloc_hdr *i, *tmp, *hdr =NULL ;uintptr_t data_begin;size_t hdr_size;/* unsigned long flags; */
@@ -155,7 +155,7 @@/* Search free list. */ /* spin_lock_irqsave(&freelist_lock, flags); */ -list_for_each_entry ( i, &freelist, freelist ) +list_for_each_entry_safe ( i, tmp, &freelist, freelist ) { data_begin =align_up ((uintptr_t )i + hdr_size, align);
extras/mini-os/lock.c new file +111 -0
111 lines not on this page · raw message
extras/mini-os/lwip-net.c +6 -2
@@ -93,6 +93,9 @@static err_t low_level_output (struct netif *netif,struct pbuf *p) { +if (!dev) +return ERR_OK ; +#ifdef ETH_PAD_SIZE pbuf_header (p, -ETH_PAD_SIZE );/* drop the padding word */ #endif
@@ -342,7 +345,7 @@struct ip_addr ipaddr = {htonl (IF_IPADDR ) };struct ip_addr netmask = {htonl (IF_NETMASK ) };struct ip_addr gw = {0 }; -char *ip; +char *ip =NULL ;tprintk ("Waiting for network.\n" );
@@ -380,5 +383,6 @@/* Shut down the network */ void stop_networking (void ) { -shutdown_netfront (dev); +if (dev) +shutdown_netfront (dev); }
extras/mini-os/main.c +1 -1
@@ -52,6 +52,7 @@#ifdef CONFIG_QEMU char *vm;char path[128 ]; +int domid;#endif int i;
@@ -74,7 +75,6 @@ }/* Fetch argc, argv from XenStore */ -int domid; domid =xenbus_read_integer ("target" );if (domid ==-1 ) {printk ("Couldn't read target\n" );
extras/mini-os/minios.mk +4 -3
@@ -6,13 +6,14 @@ # Define some default flags. # NB. '-Wcast-qual' is nasty, so I omitted it. -DEF_CFLAGS += -fno-builtin -Wall -Werror -Wredundant-decls -Wno-format +DEF_CFLAGS += -fno-builtin -Wall -Werror -Wredundant-decls -Wno-format -Wno-redundant-decls DEF_CFLAGS += $(call cc-option,$(CC),-fno-stack-protector,) +DEF_CFLAGS += $(call cc-option,$(CC),-fgnu89-inline) DEF_CFLAGS += -Wstrict-prototypes -Wnested-externs -Wpointer-arith -Winline DEF_CPPFLAGS += -D__XEN_INTERFACE_VERSION__=$(XEN_INTERFACE_VERSION) -DEF_ASFLAGS = -D__ASSEMBLY__ -DEF_LDFLAGS = +DEF_ASFLAGS += -D__ASSEMBLY__ +DEF_LDFLAGS += ifeq ($(debug),y) DEF_CFLAGS += -g
extras/mini-os/mm.c +2 -0
@@ -361,6 +361,7 @@ } +#ifndef __ia64__int free_physical_pages (xen_pfn_t *mfns,int n) {struct xen_memory_reservation reservation;
@@ -371,6 +372,7 @@ reservation.domid =DOMID_SELF ; return HYPERVISOR_memory_op(XENMEM_decrease_reservation, &reservation); } +#endif #ifdef HAVE_LIBC void *sbrk (ptrdiff_t increment)
extras/mini-os/netfront.c +12 -16
@@ -95,8 +95,9 @@void network_rx (struct netfront_dev *dev) { -RING_IDX rp,cons; +RING_IDX rp,cons,req_prod;struct netif_rx_response *rx; +int nr_consumed, some, more, i, notify; moretodo:
@@ -104,12 +105,13 @@rmb ();/* Ensure we see queued responses up to 'rp'. */ cons = dev->rx.rsp_cons; -int nr_consumed=0 ; -int some =0 ; + nr_consumed =0 ; + some =0 ;while ((cons != rp) && !some) {struct net_buffer * buf;unsigned char * page; +int id; rx =RING_GET_RESPONSE (&dev->rx, cons);
@@ -122,7 +124,7 @@if (rx->status ==NETIF_RSP_NULL )continue ; -int id = rx->id; + id = rx->id;BUG_ON (id >=NET_TX_RING_SIZE ); buf = &dev->rx_buffers[id];
@@ -151,19 +153,15 @@ } dev->rx.rsp_cons=cons; -int more;RING_FINAL_CHECK_FOR_RESPONSES (&dev->rx,more);if (more && !some) goto moretodo; -RING_IDX req_prod = dev->rx.req_prod_pvt; - -int i; -netif_rx_request_t *req; + req_prod = dev->rx.req_prod_pvt;for (i=0 ; i<nr_consumed; i++) {int id =xennet_rxidx (req_prod + i); - req =RING_GET_REQUEST (&dev->rx, req_prod + i); +netif_rx_request_t *req =RING_GET_REQUEST (&dev->rx, req_prod + i);struct net_buffer * buf = &dev->rx_buffers[id];void * page = buf->page;
@@ -178,7 +176,6 @@ dev->rx.req_prod_pvt = req_prod + i; -int notify;RING_PUSH_REQUESTS_AND_CHECK_NOTIFY (&dev->rx, notify);if (notify)notify_remote_via_evtchn (dev->evtchn);
@@ -199,6 +196,7 @@for (cons = dev->tx.rsp_cons; cons != prod; cons++) {struct netif_tx_response *txrsp; +struct net_buffer *buf; txrsp =RING_GET_RESPONSE (&dev->tx, cons);if (txrsp->status ==NETIF_RSP_NULL )
@@ -209,7 +207,7 @@ id = txrsp->id;BUG_ON (id >=NET_TX_RING_SIZE ); -struct net_buffer * buf = &dev->tx_buffers[id]; + buf = &dev->tx_buffers[id];gnttab_end_access (buf->gref); buf->gref=GRANT_INVALID_REF ;
@@ -298,7 +296,7 @@free (dev); } -struct netfront_dev *init_netfront (char *nodename,void (*thenetif_rx)(unsigned char * data,int len),unsigned char rawmac[6 ],char **ip) +struct netfront_dev *init_netfront (char *_nodename,void (*thenetif_rx)(unsigned char * data,int len),unsigned char rawmac[6 ],char **ip) {xenbus_transaction_t xbt;char * err;
@@ -308,11 +306,9 @@int retry=0 ;int i;char * msg; +char * nodename = _nodename ? _nodename :"device/vif/0" ;struct netfront_dev *dev; - -if (!nodename) - nodename ="device/vif/0" ;char path[strlen (nodename) +1 +10 +1 ];
extras/mini-os/pcifront.c +2 -4
@@ -49,18 +49,16 @@free (dev); } -struct pcifront_dev *init_pcifront (char *nodename) +struct pcifront_dev *init_pcifront (char *_nodename) {xenbus_transaction_t xbt;char * err;char * message=NULL ;int retry=0 ;char * msg; +char * nodename = _nodename ? _nodename :"device/pci/0" ;struct pcifront_dev *dev; - -if (!nodename) - nodename ="device/pci/0" ;char path[strlen (nodename) +1 +10 +1 ];
extras/mini-os/sched.c +3 -3
@@ -75,7 +75,7 @@void schedule (void ) {struct thread *prev, *next, *thread; -struct list_head *iterator; +struct list_head *iterator, *next_iterator;unsigned long flags; prev = current;
@@ -97,7 +97,7 @@s_time_t now =NOW ();s_time_t min_wakeup_time = now +SECONDS (10 ); next =NULL ; -list_for_each (iterator, &idle_thread->thread_list) +list_for_each_safe (iterator, next_iterator, &idle_thread->thread_list) { thread = list_entry(iterator, struct thread, thread_list);if (!is_runnable (thread) && thread->wakeup_time !=0LL )
@@ -128,7 +128,7 @@inturrupted at the return instruction. And therefore at safe point. */ if (prev != next)switch_threads (prev, next); -list_for_each (iterator, &exited_threads) +list_for_each_safe (iterator, next_iterator, &exited_threads) { thread = list_entry(iterator, struct thread, thread_list);if (thread != prev)
extras/mini-os/xenbus/xenbus.c +32 -21
170 lines not on this page · raw message
stubdom/Makefile +34 -67
205 lines not on this page · raw message
stubdom/binutils.patch deleted +0 -14
@@ -1,14 +0,0 @@ -It looks like binutils has troubles with makeinfo and the doc generation. -We don't need it anyway - ---- binutils-2.18/bfd/Makefile.inorig 2008-01-16 16:17:43.004484000 +0000 -+++ binutils-2.18/bfd/Makefile.in 2008-01-16 16:17:50.505526000 +0000 -@@ -271,7 +271,7 @@ - INCDIR = $(srcdir)/../include - CSEARCH = -I. -I$(srcdir) -I$(INCDIR) - MKDEP = gcc -MM --SUBDIRS = doc po -+SUBDIRS = po - bfddocdir = doc - bfdlib_LTLIBRARIES = libbfd.la - AM_CFLAGS = $(WARN_CFLAGS)
stubdom/gcc.patch deleted +0 -31
@@ -1,31 +0,0 @@ -Backported from later versions - ---- gcc-4.2.2/gcc/config.gcc 2007-11-22 16:27:45.000000000 +0000 -+++ gcc-4.2.2/gcc/config.gcc 2007-11-22 16:23:00.000000000 +0000 -@@ -1033,6 +1033,11 @@ - tmake_file="i386/t-i386elf t-svr4" - use_fixproto=yes - ;; -+x86_64-*-elf*) -+ tm_file="${tm_file} i386/unix.h i386/att.h dbxelf.h elfos.h i386/i386elf.h i386/x86-64.h" -+ tmake_file="i386/t-i386elf t-svr4" -+ use_fixproto=yes -+ ;; - i[34567]86-sequent-ptx4* | i[34567]86-sequent-sysv4*) - if test x$gas = xyes - then - -We don't have a libc yet at this stage. Unused anyway - ---- gcc-4.2.2/gcc/unwind-generic.h.orig 2008-01-11 18:54:40.000000000 +0100 -+++ gcc-4.2.2/gcc/unwind-generic.h 2008-01-11 18:54:31.000000000 +0100 -@@ -203,7 +203,6 @@ - compatible with the standard ABI for IA-64, we inline these. */ - - #ifdef __ia64__ --#include <stdlib.h> - - static inline _Unwind_Ptr - _Unwind_GetDataRelBase (struct _Unwind_Context *_C) -Backported from later versions -