Subject: mac68k and gcc 4
To: None <port-mac68k@netbsd.org>
From: Dave Huang <khym@azeotrope.org>
List: port-mac68k
Date: 06/03/2006 20: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: khym@azeotrope.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++