Call for help: clang/llvm for sparc64

John-Mark Gurney jmg at funkthat.com
Tue Jan 28 19:48:36 UTC 2014


Craig Butler wrote this message on Tue, Jan 28, 2014 at 10:04 +0000:
> On Mon, 2014-01-27 at 22:54 +0100, Roman Divacky wrote:
> 
> > On Mon, Jan 27, 2014 at 09:50:52PM +0000, Craig Butler wrote:
> > > 
> > > 
> > > > Btw, can someone test this patch? ie. compile (with gcc) sparc64
> > > > kernel
> > > > with it and boot it?
> > > > 
> > > > > Yes, I had to fix that but forgot to upstream it.
> > > > > 
> > > > > Index: sparc64/include/pcpu.h
> > > > > ===================================================================
> > > > > --- sparc64/include/pcpu.h      (revision 259767)
> > > > > +++ sparc64/include/pcpu.h      (working copy)
> > > > > @@ -70,9 +70,26 @@
> > > > >  struct pcb;
> > > > >  struct pcpu;
> > > > >  
> > > > > -register struct pcb *curpcb __asm__(__XSTRING(PCB_REG));
> > > > > -register struct pcpu *pcpup __asm__(__XSTRING(PCPU_REG));
> > > > > +static __inline __pure2 struct pcb *
> > > > > +__curpcb(void)
> > > > > +{
> > > > > +       struct pcb *pcb;
> > > > >  
> > > > > +       __asm("ldx [%" __XSTRING(PCB_REG) "], %0" : "=r" (pcb));
> > > > > +       return (pcb);
> > > > > +}
> > > > > +#define curpcb (__curpcb())
> > > > > +
> > > > > +static __inline __pure2 struct pcpu *
> > > > > +__curpcpu(void)
> > > > > +{
> > > > > +       struct pcpu *pcpu;
> > > > > +
> > > > > +       __asm("ldx [%" __XSTRING(PCPU_REG) "], %0" : "=r" (pcpu));
> > > > > +       return (pcpu);
> > > > > +}
> > > > > +#define pcpup  (__curpcpu())
> > > > > +
> > > > >  #define        PCPU_GET(member)        (pcpup->pc_ ## member)
> > > > >  
> > > > >  static __inline __pure2 struct thread *
> > > > > 
> > > > > 
> > > > > the llvm sparc64 is not yet ready for wide consumption. Once llvm
> > > > > 3.4 is imported
> > > > > (days now) the sparc64 backend will be enabled as well. Then I plan
> > > > > to backport
> > > > > all the fixes from llvm trunk to enable it to selfhost. So that we
> > > > > can build
> > > > > llvm 3.5 with llvm itself. This is necesary as llvm is becoming
> > > > > c++11 only.
> > > > > 
> > > 
> > > Do you want us to apply that patch to /usr/src/sys/sparc64/include/pcpu.h then make with gcc ??
> > > Do we have to pull down HEAD or can this be applied over a 9.2|10-RELEASE ?
> > > Which gcc ??
> > 
> > -current and in-base gcc I would think would be the best. But 10.0R should work
> > too.
> > 
> > Roman
> 
> 
> Hello Roman, Kurt and list
> 
> I think the diff got broken somehow, it was failing bulk at 70 and kept
> creating a reject.. so I went ahead an altered the file anyway.
> 
> I can confirm that the code does indeed compile however the installed
> kernel panics on boot (just after ZFS)... something it doesn't do on a
> stock kernel.
> 
> ////
> sym1: No NVRAM, ID 7, Fast-40, LVD, parity checking
> nexus0: <syscons> type unknown (no driver attached)
> uart0: <Non-standard ns8250 class UART with FIFOs> at port 0x3f8-0x3ff
> irq 43 on isa0
> uart0: console (9600,n,8,1)
> uart1: <Non-standard ns8250 class UART with FIFOs> at port 0x2e8-0x2ef
> irq 43 on isa0
> ZFS WARNING: Recommended minimum kmem_size is 512MB; expect unstable
> behavior.
>              Consider tuning vm.kmem_size and vm.kmem_size_max
>              in /boot/loader.conf.
> ZFS filesystem version: 5
> ZFS storage pool version: features support (5000)
> Timecounter "tick" frequency 0 Hz quality 1000
> panic: trap: division by zero (kernel)
> cpuid = 0
> KDB: stack backtrace:
> #0 0xc0883d78 at trap+0x558
> Uptime: 1s
> Automatic reboot in 15 seconds - press a key on the console to abort
> Rebooting...
> Resettin
> LOM event: +11h2m54s host reset
> ////
> 
> --- sparc64/include/pcpu.h.orig	2014-01-28 04:40:28.058580261 +0000
> +++ sparc64/include/pcpu.h	2014-01-28 04:45:01.423571144 +0000
> @@ -70,8 +70,25 @@
>  struct pcb;
>  struct pcpu;
>  
> -register struct pcb *curpcb __asm__(__XSTRING(PCB_REG));
> -register struct pcpu *pcpup __asm__(__XSTRING(PCPU_REG));
> +static __inline __pure2 struct pcb *
> +__curpcb(void)
> + {
> +      struct pcb *pcb;
> +
> +      __asm("ldx [%" __XSTRING(PCB_REG) "], %0" : "=r" (pcb));
> +      return (pcb);
> + }
> +#define curpcb (__curpcb())
> +
> +static __inline __pure2 struct pcpu *
> +__curpcpu(void)
> + {
> +      struct pcpu *pcpu;
> +
> +      __asm("ldx [%" __XSTRING(PCPU_REG) "], %0" : "=r" (pcpu));
> +      return (pcpu);
> + }
> +#define pcpup  (__curpcpu())
>  
>  #define	PCPU_GET(member)	(pcpup->pc_ ## member)
> 
> 
> I ran the buildkernel and installkernel in a script session, I can make
> these available if desired.

After talking w/ Roman, I belive that this patch is wrong...  The
reason the ldx works for curthread is that it is the first member of
pcpu...  For pcpu and curpcb, we just need to mov the register...

Here is a new patch.. I have not tried to compile, so adjust as
necessary...  If you do need to adjust the patch, please reply with
the working and compilable patch so I can commit...

Thanks for the testing.

-- 
  John-Mark Gurney				Voice: +1 415 225 5579

     "All that I will do, has been done, All that I have, has not."
-------------- next part --------------
A non-text attachment was scrubbed...
Name: sparc64.pcbpcpu.patch
Type: text/x-diff
Size: 835 bytes
Desc: not available
URL: <http://lists.freebsd.org/pipermail/freebsd-sparc64/attachments/20140128/cad76ac4/attachment.patch>


More information about the freebsd-sparc64 mailing list