Call for help: clang/llvm for sparc64

Craig Butler craig001 at lerwick.hopto.org
Tue Jan 28 10:02:55 UTC 2014


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.

Kind Regards

Craig Butler


More information about the freebsd-sparc64 mailing list