[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-ia64-devel] Mini-OS registers and libgcc
Hello, Dietmar Hahn, le Wed 13 Feb 2008 11:53:59 +0100, a écrit : > Am Dienstag, 12. Februar 2008 schrieb Samuel Thibault: > > Is there a reason for using -mfixed-range=f2-f5,f12-f15,f32-f127 > > when compiling Mini-OS? Is it really needed since it doesn't > > have a user-land? (though I guess some support would be needed in > > switch_context for instance) > > To handle this in a clean way the trap_frame has to be expanded and some fp > registers have to stored/restored in trap handling. Ok. Would this be needed in order to be able to use libgcc.a? > > Then, are there other reasons for using __*div/di*.S instead of just > > linking with libgcc? > > It's possible to use libgcc.a but the flag -mconstant-gp has to be removed > from the mini-os makefiles and a clean way to add libgcc.a is needed. Something like the attached patch? Actually I'm asking because for other purpose, I would need __divdi on x86_32, and using libgcc.a is a really simple solution. > By the way current mini-os crashed with Unaligned Reference. > A small change is needed: > static void maybe_split(struct xmalloc_hdr *hdr, size_t size, size_t block) > { > struct xmalloc_hdr *extra; > - size_t leftover = block - size; > + size_t leftover; > +#if defined(__ia64__) > + size = (size +7 ) & ~7; /* alignment needed on 8 byte boundary. */ > +#endif > + leftover = block - size; Does the following patch work? diff -r 3cc84775d725 extras/mini-os/lib/xmalloc.c --- a/extras/mini-os/lib/xmalloc.c Tue Feb 12 17:04:32 2008 +0000 +++ b/extras/mini-os/lib/xmalloc.c Wed Feb 13 12:03:52 2008 +0000 @@ -62,10 +62,19 @@ struct xmalloc_pad size_t hdr_size; }; +/* Return size, increased to alignment with align. */ +static inline size_t align_up(size_t size, size_t align) +{ + return (size + align - 1) & ~(align - 1); +} + static void maybe_split(struct xmalloc_hdr *hdr, size_t size, size_t block) { struct xmalloc_hdr *extra; - size_t leftover = block - size; + size_t leftover; + size = align_up(size, __alignof__(struct xmalloc_hdr)); + size = align_up(size, __alignof__(struct xmalloc_pad)); + leftover = block - size; /* If enough is left to make a block, put it on free list. */ if ( leftover >= (2 * (sizeof(struct xmalloc_hdr) + sizeof(struct xmalloc_pad))) ) @@ -98,12 +107,6 @@ static struct xmalloc_hdr *xmalloc_new_p maybe_split(hdr, size, PAGE_SIZE); return hdr; -} - -/* Return size, increased to alignment with align. */ -static inline size_t align_up(size_t size, size_t align) -{ - return (size + align - 1) & ~(align - 1); } /* Big object? Just use the page allocator. */ Samuel Attachment:
patch _______________________________________________ Xen-ia64-devel mailing list Xen-ia64-devel@xxxxxxxxxxxxxxxxxxx http://lists.xensource.com/xen-ia64-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |