List Info

Thread: mac68k and gcc 4




mac68k and gcc 4
user name
2006-06-04 01:33:41
I tried building a -current mac68k kernel with the
newly-imported gcc
4, and ran into a few errors, most of which I'm not too
sure about
how to solve.

First is:
/usr/src.local/sys/arch/mac68k/mac68k/macrom.c: In function
'mrg_DTInstall':
/usr/src.local/sys/arch/mac68k/mac68k/macrom.c:180: error:
invalid lvalue in assignment

        caddr_t ptr, prev;

        __asm volatile ("movl %%a0,%0" :
"=g" (ptr));

        (caddr_t *)prev = &mrg_DTList;
 
I think changing the last line to:
	prev = (caddr_t)&mrg_DTList;
will do the same thing.

After changing that, I run into another problem in macrom.c:
/usr/src.local/sys/arch/mac68k/mac68k/macrom.c: In function
'mrg_aline_super':
/usr/src.local/sys/arch/mac68k/mac68k/macrom.c:728: error:
unknown register name 'fp' in 'asm'

/* 	put a0 in a0 */
/* 	put a1 in a1 */
/* 	put d0 in d0 */
/* 	put d1 in d1 */
/*	put trapaddr in a2 */
/* save a6 */
/* 	call the damn routine */
/* restore a6 */
/* 	store d0 in d0bucket */
/* 	store a0 in d0bucket */
/* This will change a2,a1,d1,d0,a0 and possibly a6 */

	__asm volatile (
	"	movl	%2,%%d0	\n"
	"	movl	%2(4),%%d1	\n"
	"	movl	%2(32),%%a0	\n"
	"	movl	%2(36),%%a1	\n"
	"	movl	%3,%%a2		\n"
	"	jbsr	%%a2		\n"
	"	movl	%%a0,%0		\n"
	"	movl	%%d0,%1"

		: "=g" (a0bucket), "=g" (d0bucket)

		: "a" (&frame->f_regs), "g"
(trapaddr)

		:
"d0","d1","a0","a1
","a2",
#ifdef __ELF__
			  "fp"
#else
			  "a6"
#endif

I don't know why the clobber register spec is
"fp" for ELF and "a6"
otherwise... isn't "fp" just an alias for
"a6"? I tried changing it to
use "a6" unconditionally, but that doesn't work
either:

/usr/src.local/sys/arch/mac68k/mac68k/macrom.c: In function
'mrg_aline_super':
/usr/src.local/sys/arch/mac68k/mac68k/macrom.c:763: error:
%a6 cannot be used in asm here

The comments say "save a6" and "restore
a6", but I don't see where
that happens. They also say that it'll possibly change A6,
but I don't
see when that would happen either. Are there some ROM
toolbox calls
that will modify A6? That seems like it'd be a bad thing
for a
subroutine to not restore the frame pointer...

Anyways, I don't know if it's the right thing to do, but I
just
removed fp/a6 from the list of clobbered registers.

That gets us past macrom.c and on to this:
cc1: warnings being treated as errors
/usr/src.local/sys/arch/m68k/m68k/pmap_motorola.c: In
function 'pmap_changebit':
/usr/src.local/sys/arch/m68k/m68k/pmap_motorola.c:2518:
warning: 'pg_' may be used uninitialized in this function
/usr/src.local/sys/arch/m68k/m68k/pmap_motorola.c:2525:
warning: 'pg_' may be used uninitialized in this function

It's complaining about these two macros:

#define	pa_to_pvh(pa)							\
({									\
	int bank_, pg_;							\
									\
	bank_ = vm_physseg_find(atop((pa)), &pg_);			\
	&vm_physmem[bank_].pmseg.pvent[pg_];				\
})

#define	pa_to_attribute(pa)						\
({									\
	int bank_, pg_;							\
									\
	bank_ = vm_physseg_find(atop((pa)), &pg_);			\
	&vm_physmem[bank_].pmseg.attrs[pg_];				\
})

And I suppose that gcc is right that vm_physseg_find may not
set
pg_... it looks like vm_physseg_find returns -1 if it
didn't find what
it was looking for, but I don't know how to check for that
due to the
way those macros are written. Initializing pg_=0 gets rid of
the
warning, but it seems like that's just sweeping the problem
under the
rug 
-- 
Name: Dave Huang         |  Mammal, mammal / their names are
called /
INet: khymazeotrope.org |  they raise a paw / the bat, the cat
/
FurryMUCK: Dahan         |  dolphin and dog / koala bear and
hog -- TMBG
Dahan: Hani G Y+C 30 Y++ L+++ W- C++ T++ A+ E+ S++ V++ F-
Q+++ P+ B+ PA+ PL++
mac68k and gcc 4
user name
2006-06-04 01:51:15
BTW, I should mention that after making those changes in my
previous
email, the resulting kernel boots and seems to work fine on
my 660av 
[1-2]

about | contact  Other archives ( Real Estate discussion Medical topics )