From mboxrd@z Thu Jan 1 00:00:00 1970 X-Spam-Checker-Version: SpamAssassin 3.4.4 (2020-01-24) on inbox.vuxu.org X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=DKIM_SIGNED,DKIM_VALID autolearn=ham autolearn_force=no version=3.4.4 Received: (qmail 23796 invoked from network); 21 Aug 2021 09:26:12 -0000 Received: from 1ess.inri.net (216.126.196.35) by inbox.vuxu.org with ESMTPUTF8; 21 Aug 2021 09:26:12 -0000 Received: from pb-smtp1.pobox.com ([64.147.108.70]) by 1ess; Sat Aug 21 04:27:57 -0400 2021 Received: from pb-smtp1.pobox.com (unknown [127.0.0.1]) by pb-smtp1.pobox.com (Postfix) with ESMTP id DA257D452F for <9front@9front.org>; Sat, 21 Aug 2021 04:27:49 -0400 (EDT) (envelope-from unobe@cpan.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed; d=pobox.com; h=message-id :to:subject:date:from:in-reply-to:mime-version:content-type :content-transfer-encoding; s=sasl; bh=15Kknq3yFwReKCRg3cMzJSr7v Vk+sSLXblOc/QLKLgs=; b=x4tlhMtt3h9jvMX6+A0d+UEq1u3OWUca9xRpaf3lf H1k2h/AUCiz/XIcMb1o3DZVoWLHcT76VEAsamVvd5KB7701l2ZH07Jh8i/pDN5cR 6uievysXjPHFqlpQ0U7iUp9g+6MJ+zF2y+eY7j3aFgrLarwpvS4rRzFeH+Kx9V8p Jk= Received: from pb-smtp1.nyi.icgroup.com (unknown [127.0.0.1]) by pb-smtp1.pobox.com (Postfix) with ESMTP id BF7E7D452D for <9front@9front.org>; Sat, 21 Aug 2021 04:27:49 -0400 (EDT) (envelope-from unobe@cpan.org) Received: from strider (unknown [47.34.135.186]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by pb-smtp1.pobox.com (Postfix) with ESMTPSA id A84AED452C for <9front@9front.org>; Sat, 21 Aug 2021 04:27:47 -0400 (EDT) (envelope-from unobe@cpan.org) Message-ID: To: 9front@9front.org Date: Sat, 21 Aug 2021 01:27:45 -0700 From: unobe@cpan.org In-Reply-To: MIME-Version: 1.0 Content-Type: text/plain; charset="UTF-8" X-Pobox-Relay-ID: AA863E2E-0259-11EC-B3B0-8B3BC6D8090B-09620299!pb-smtp1.pobox.com Content-Transfer-Encoding: quoted-printable List-ID: <9front.9front.org> List-Help: X-Glyph: ➈ X-Bullshit: anonymous anonymous database factory-aware firewall-oriented rails Subject: Re: [9front] [PATCH] mk for only supported archs Reply-To: 9front@9front.org Precedence: bulk The mtx and ppc (ucu config) kernel now build. I've also added a Readme for the ppc kernel. I gleaned the Readme and some code from the Plan 9 kernel found on github; I assume it was updated after 9front had forked. I made some minor edits to Readme, but otherwise I left the code received as-is (namely, ppc/^(trap.c l.s devce.c) ). I did not see any manual page for devce. As for (emulated) hardware, QEMU emulates the G3 but not the G2. 'mk kernels' now completes without failure. Quoth unobe@cpan.org: > I'm testing that all the "supported" archs build. This is the rc > script I use: >=20 > #!/bin/rc > echo Updating system > sysupdate || exit 'sysupdate failed' > . /sys/lib/rootstub > cd /sys/src > objtypes_default=3D`{cat mkfile.proto| grep 'CPUS=3D' | sed -e 's/CPUS=3D= //'} > if (~ $objtypes '') > objtypes=3D($cputype `{{for (f in $cputype $objtypes_default) echo $f}= | sort | uniq -u}) > for (objtype in $objtypes) > for (mk in nuke all install clean) > mk $mk || exit 'mk '^$mk^' failed for '^$objtype >=20 > cd /sys/man > mk || exit '/sys/man failed' >=20 > cd /sys/doc > mk || exit '/sys/doc failed' >=20 > cd /sys/src > mk kernels || exit 'mk kernels failed' >=20 --- //.git/fs/object/8c796bf8b9c10a0845717c47af908e47dfe14482/tree//sys/s= rc/9/mtx/dat.h +++ /sys/src/9/mtx/dat.h @@ -71,6 +71,8 @@ FPinit, FPactive, FPinactive, + + FPillegal=3D 0x100, }; =20 struct Confmem --- //.git/fs/object/8c796bf8b9c10a0845717c47af908e47dfe14482/tree//sys/s= rc/9/mtx/devarch.c +++ /sys/src/9/mtx/devarch.c @@ -130,7 +130,6 @@ uchar *cp; ushort *sp; ulong *lp; - IOMap *m; Rdwrfn *fn; =20 switch((ulong)c->qid.path){ --- //.git/fs/object/8c796bf8b9c10a0845717c47af908e47dfe14482/tree//sys/s= rc/9/mtx/fns.h +++ /sys/src/9/mtx/fns.h @@ -47,7 +47,6 @@ void ioinit(void); int iprint(char*, ...); int isaconfig(char*, int, ISAConf*); -#define kexit(a) #define kmapinval() void links(void); void mmuinit(void); @@ -88,6 +87,10 @@ void tlbflushall(void); #define userureg(ur) (((ur)->status & MSR_PR) !=3D 0) void watchreset(void); + +/* devarch */ +Dirtab* addarchfile(char*, int, long(*)(Chan*, void*, long, vlong),=20 + long(*)(Chan*, void*, long, vlong)); =20 #define waserror() (up->nerrlab++, setlabel(&up->errlab[up->nerrlab-1])) #define KADDR(a) ((void*)((ulong)(a)|KZERO)) --- //.git/fs/object/8c796bf8b9c10a0845717c47af908e47dfe14482/tree//sys/s= rc/9/mtx/mem.h +++ /sys/src/9/mtx/mem.h @@ -2,6 +2,9 @@ * Memory and machine-specific definitions. Used in C and assembler. */ =20 +#define MIN(a, b) ((a) < (b)? (a): (b)) +#define MAX(a, b) ((a) > (b)? (a): (b)) + /* * Sizes */ @@ -31,7 +34,8 @@ /* * Time */ -#define HZ 100 /* clock frequency */ +#define HZ (100) /* clock frequency */ +#define MS2HZ (1000/HZ) /* millisec per clock tick */ #define TK2SEC(t) ((t)/HZ) /* ticks to seconds */ =20 /* --- //.git/fs/object/8c796bf8b9c10a0845717c47af908e47dfe14482/tree//sys/s= rc/9/mtx/mkfile +++ /sys/src/9/mtx/mkfile @@ -58,8 +58,8 @@ /$objtype/lib/libmemdraw.a\ /$objtype/lib/libdraw.a\ /$objtype/lib/libip.a\ - /$objtype/lib/libc.a\ /$objtype/lib/libsec.a\ + /$objtype/lib/libc.a\ =20 ETHER=3D`{echo devether.c ether*.c | sed 's/\.c/.'$O'/g'} VGA=3D`{echo devvga.c screen.c vga*.c | sed 's/\.c/.'$O'/g'} --- //.git/fs/object/8c796bf8b9c10a0845717c47af908e47dfe14482/tree//sys/s= rc/9/mtx/mtx +++ /sys/src/9/mtx/mtx @@ -9,6 +9,7 @@ proc mnt srv + shr dup ssl cap --- //.git/fs/object/8c796bf8b9c10a0845717c47af908e47dfe14482/tree//sys/s= rc/9/mtx/pcimtx.c +++ /sys/src/9/mtx/pcimtx.c @@ -115,7 +115,7 @@ int pcicfgrw8(int tbdf, int rno, int data, int read) { - int o, x; + int o; =20 switch(pcicfgmode){ case 1: --- //.git/fs/object/8c796bf8b9c10a0845717c47af908e47dfe14482/tree//sys/s= rc/9/mtx/raven.c +++ /sys/src/9/mtx/raven.c @@ -3,6 +3,7 @@ */ #include "u.h" #include "../port/lib.h" +#include "../port/pci.h" #include "mem.h" #include "dat.h" #include "fns.h" --- //.git/fs/object/8c796bf8b9c10a0845717c47af908e47dfe14482/tree//sys/s= rc/9/mtx/trap.c +++ /sys/src/9/mtx/trap.c @@ -1,5 +1,6 @@ #include "u.h" #include "../port/lib.h" +#include "../port/pci.h" #include "mem.h" #include "dat.h" #include "fns.h" @@ -632,7 +633,7 @@ up->s =3D *((Sargs*)(sp+BY2WD)); up->psstate =3D sysctab[scallnr]; =20 - ret =3D systab[scallnr](up->s.args); + ret =3D systab[scallnr]((char *)up->s.args); poperror(); }else{ /* failure: save the error buffer for errstr */ --- //.git/fs/object/8c796bf8b9c10a0845717c47af908e47dfe14482/tree//sys/s= rc/boot/zynq/mkfile +++ /sys/src/boot/zynq/mkfile @@ -7,6 +7,9 @@ =20 all:V: $TARG =20 +install:V: + echo install not supported >[1=3D2] + clean:V: rm -rf $TARG *.$O @{objtype=3D$cputype mk -f mkfile.port clean} --- //.git/fs/object/8c796bf8b9c10a0845717c47af908e47dfe14482/tree//sys/s= rc/cmd/mkfile +++ /sys/src/cmd/mkfile @@ -8,8 +8,9 @@ YFLAGS=3D-d =20 NOTSYS=3Dsml|dup|.+\..+ +NOTPOWER=3D|dtracy PCONLY=3D|vmx -NOMK=3D$NOTSYS`{~ $objtype (386 amd64) || echo $PCONLY} +NOMK=3D$NOTSYS$NOTPOWER`{~ $objtype (386 amd64) || echo $PCONLY} =20 cpuobjtype=3D`{sed -n 's/^O=3D//p' /$cputype/mkfile} DIRS=3D`{echo */mkfile | sed 's,/mkfile *,\n,g' | grep -v '^('$NOMK')$'} --- //.git/fs/object/8c796bf8b9c10a0845717c47af908e47dfe14482/tree//sys/s= rc/mkfile.proto +++ /sys/src/mkfile.proto @@ -2,8 +2,8 @@ # common mkfile parameters shared by all architectures # =20 -OS=3D05678qv -CPUS=3Dspim arm arm64 amd64 386 power mips +OS=3D5678qv +CPUS=3Darm arm64 amd64 386 power mips CFLAGS=3D-FTVw LEX=3Dlex YACC=3Dyacc --- /tmp/diff100001999533 +++ sys/src/9/ppc/Readme @@ -1,0 +1,26 @@ +This directory contains source code for two PowerPC ports, + +The kernel made with + mk 'CONF=3Dblast' +is an 8260 kernel. The 8260 (PowerQUICC II, e.g. Apple G2) is an +embedded PowerPC with on-chip DMA, Uart, Ethernet, ATM controllers and +a few other things. + +The 8260-specific code is in m8260.c (no surprises there) and in the +device drivers for SMC uart (uartsmc.c) and FCC ethernet (etherfcc.c). + +The kernel made with + mk 'CONF=3Ducu' +is a PowerPC 750/755 (e.g., Apple G3) kernel using the saturn chip for +Ether and Uart. + +We run both kernels on Lucent proprietary boards, but the kernels are +pretty generic. On a different board, the ports may be hooked up differ= ently, +the clocks may be running at different speeds, the memory banks may be +configured differently and this will require tweaking the Ethernet setup= , +Uart setup, Memory bank setup and several other things as well. + +There is 8260 and Ucu specific code in l.s too (lucu.s and lblast.s). +These differences primarily concern the state of the system at bootup. +In the case of the ucu, virtual memory is already on when the kernel +starts. --- //.git/fs/object/8c796bf8b9c10a0845717c47af908e47dfe14482/tree/sys/sr= c/9/ppc/clock.c +++ sys/src/9/ppc/clock.c @@ -82,6 +82,11 @@ } =20 ulong +=C2=B5s(void) +{ + return fastticks2us(m->ticks); +} +ulong perfticks(void) { return (ulong)fastticks(nil); --- //.git/fs/object/8c796bf8b9c10a0845717c47af908e47dfe14482/tree/sys/sr= c/9/ppc/dat.h +++ sys/src/9/ppc/dat.h @@ -15,7 +15,7 @@ typedef struct Sys Sys; typedef struct Ureg Ureg; typedef struct Vctl Vctl; -typedef long Tval; +typedef uvlong Tval; =20 #pragma incomplete Ureg #pragma incomplete Imap @@ -37,8 +37,9 @@ ulong sr; ulong pc; Proc *p; - ulong pid; + Mach *m; ushort isilock; + long lockcycles; }; =20 struct Label --- /tmp/diff100001999542 +++ sys/src/9/ppc/devce.c @@ -1,0 +1,191 @@ +// +// channel element driver +// +#include "u.h" +#include "../port/lib.h" +#include "mem.h" +#include "dat.h" +#include "fns.h" +#include "io.h" +#include "../port/error.h" +#include "msaturn.h" + +enum{ + Ucuunknown =3D 0, + Ucu64, + + Ndsp =3D 16, + + Cedead =3D 0, + Cereset, + Celoaded, + Cerunning, +=09 + Qdir =3D 0, + Qctl, + Qce, + + Cpldbase =3D Saturn + 0x6000000, + Cplducuversion_ucu =3D 0x1c, + Cebase =3D Saturn + 0x3000000, + Cesize =3D 0x100000, +}; + +typedef struct Cpld Cpld; +struct Cpld{ + uchar led; + uchar fpga1; + uchar slotid; + uchar version; + uchar watchdog; + uchar spi; + uchar asicreset; + uchar dspreset; + uchar generalreset; + uchar ucuversion; + uchar fpga2; +}; + +typedef struct Circbuf Circbuf; +struct Circbuf{ + uchar *nextin; + uchar *nextout; + uchar *start; + uchar *end; +}; + +typedef struct Dsp Dsp; +struct Dsp{ + Ref; + int state; + Circbuf *cb; +}; + +typedef struct Ce Ce; +struct Ce{ + int ucutype; + Ce *ces[Ndsp]; +}; + +static Cpld*cpld =3D (Cpld*)Cpldbase; +static Ce ce; + +static void +ceinit(void) +{ + if(cpld->ucuversion & Cplducuversion_ucu) + ce.ucutype =3D Ucu64; + else{ + print("ceinit: unsuppoerted UCU\n"); + return; + } + +} + +static Chan* +ceattach(char*spec) +{ + return devattach('C', spec); +} + +#define DEV(q) ((int)(((q).path >> 8) & 0xff)) +#define TYPE(q) ((int)((q).path & 0xff)) +#define QID(d, t) ((((d) & 0xff) << 8) | (t)) + +static int +cegen(Chan*c, char*, Dirtab*, int, int i, Dir*dp) +{ + Qid qid; + + switch(TYPE(c->qid)){ + case Qdir: + if(i =3D=3D DEVDOTDOT){ + mkqid(&qid, QID(0, Qdir), 0, QTDIR); + devdir(c, qid, "#C", 0, eve, 0555, dp); + return 1; + } + + if(i =3D=3D 0){ + mkqid(&qid, QID(-1, Qctl), 0, QTFILE); + devdir(c, qid, "cectl", 0, eve, 0644, dp); + return 1; + } + + if (--i >=3D Ndsp) + return -1; +=09 + mkqid(&qid, QID(Qce, i), 0, QTFILE); + snprint(up->genbuf, sizeof(up->genbuf), "ce%d", i); + devdir(c, qid, up->genbuf, 0, eve, 0644, dp); + return 1; + + default: + return -1; + } +} + +static Walkqid * +cewalk(Chan*c, Chan*nc, char**name, int nname) +{ + return devwalk(c, nc, name, nname, 0, 0, cegen); +} + +static int +cestat(Chan*c, uchar*db, int n) +{ + return devstat(c, db, n, 0, 0, cegen); +} + +static Chan* +ceopen(Chan*c, int omode) +{ + c->mode =3D openmode(omode); + c->flag |=3D COPEN; + c->offset =3D 0; + return c; +} + +static void +ceclose(Chan*) +{} + +static long +ceread(Chan*c, void*a, long n, vlong) +{ + switch(TYPE(c->qid)){ + case Qdir: + return devdirread(c, a, n, 0, 0, cegen); +=09 + default: + error("unsupported operation"); + } + return 0; +} + +static long +cewrite(Chan*, void*, long, vlong) +{ + return 0; +} + +Dev cedevtab =3D { + 'C', + "channel element", + + devreset, + ceinit, + devshutdown, + ceattach, + cewalk, + cestat, + ceopen, + devcreate, + ceclose, + ceread, + devbread, + cewrite, + devbwrite, + devremove, + devwstat, + devpower, +}; --- //.git/fs/object/8c796bf8b9c10a0845717c47af908e47dfe14482/tree/sys/sr= c/9/ppc/fns.h +++ sys/src/9/ppc/fns.h @@ -1,7 +1,9 @@ #include "../port/portfns.h" =20 +ulong cankaddr(ulong); void clockinit(void); void clockintr(Ureg*); +int cmpswap(long*, long, long); void cpuidprint(void); void cycles(uvlong*); void dbgputc(int c); --- //.git/fs/object/8c796bf8b9c10a0845717c47af908e47dfe14482/tree/sys/sr= c/9/ppc/l.s +++ sys/src/9/ppc/l.s @@ -346,7 +346,6 @@ RETURN =20 TEXT tas(SB), $0 -TEXT _tas(SB), $0 MOVW R3, R4 MOVW $0xdead, R5 tas1: @@ -360,6 +359,42 @@ EIEIO tas0: SYNC + RETURN + +TEXT _xinc(SB), $0 /* void _xinc(long *); */ + MOVW R3, R4 +xincloop: + DCBF (R4) /* fix for 603x bug */ + LWAR (R4), R3 + ADD $1, R3 + STWCCC R3, (R4) + BNE xincloop + RETURN + +TEXT _xdec(SB), $0 /* long _xdec(long *); */ + MOVW R3, R4 +xdecloop: + DCBF (R4) /* fix for 603x bug */ + LWAR (R4), R3 + ADD $-1, R3 + STWCCC R3, (R4) + BNE xdecloop + RETURN + +TEXT cmpswap(SB),$0 /* int cmpswap(long*, long, long) */ + MOVW R3, R4 /* addr */ + MOVW old+4(FP), R5 + MOVW new+8(FP), R6 + DCBF (R4) /* fix for 603x bug? */ + LWAR (R4), R3 + CMP R3, R5 + BNE fail + STWCCC R6, (R4) + BNE fail + MOVW $1, R3 + RETURN +fail: + MOVW $0, R3 RETURN =20 TEXT tlbflushall(SB), $0 --- //.git/fs/object/8c796bf8b9c10a0845717c47af908e47dfe14482/tree/sys/sr= c/9/ppc/mem.h +++ sys/src/9/ppc/mem.h @@ -8,6 +8,9 @@ #include "blast.h" #endif =20 +#define MIN(a, b) ((a) < (b)? (a): (b)) +#define MAX(a, b) ((a) > (b)? (a): (b)) + /* * Sizes */ @@ -37,7 +40,8 @@ /* * Time */ -#define HZ 1000 /* clock frequency */ +#define HZ (1000) /* clock frequency */ +#define MS2HZ (HZ) /* millisec per clock tick */ #define TK2SEC(t) ((t)/HZ) /* ticks to seconds */ =20 /* --- //.git/fs/object/8c796bf8b9c10a0845717c47af908e47dfe14482/tree/sys/sr= c/9/ppc/mkfile +++ sys/src/9/ppc/mkfile @@ -37,6 +37,7 @@ tod.$O\ xalloc.$O\ random.$O\ + userinit.$O\ =20 OBJ=3D\ l.$O\ @@ -60,8 +61,9 @@ /$objtype/lib/libmemlayer.a\ /$objtype/lib/libmemdraw.a\ /$objtype/lib/libdraw.a\ - /$objtype/lib/libc.a\ /$objtype/lib/libsec.a\ + /$objtype/lib/libip.a\ + /$objtype/lib/libc.a\ =20 ETHER=3D`{echo devether.c ether*.c | sed 's/\.c/.'$O'/g'} VGA=3D`{echo devvga.c screen.c vga*.c | sed 's/\.c/.'$O'/g'} --- //.git/fs/object/8c796bf8b9c10a0845717c47af908e47dfe14482/tree/sys/sr= c/9/ppc/saturntimer.c +++ sys/src/9/ppc/saturntimer.c @@ -72,7 +72,7 @@ } =20 void -timerset(uvlong next) +timerset(Tval next) { ulong offset; uvlong now; --- //.git/fs/object/8c796bf8b9c10a0845717c47af908e47dfe14482/tree/sys/sr= c/9/ppc/trap.c +++ sys/src/9/ppc/trap.c @@ -11,6 +11,14 @@ static Lock vctllock; Vctl *vctl[256]; =20 +int nintr[10]; +int nintro; +int dblintr[64]; +ulong thisto[32]; +ulong thistoo; +vlong vnot[64]; +ulong vnon[64]; + void intrenable(int irq, void (*f)(Ureg*, void*), void* a, char *name) { @@ -368,6 +376,62 @@ vp[n] =3D 0x4e800021; /* BL (LR) */ }else vp[n] =3D (18<<26)|(pa&0x3FFFFFC)|3; /* bla */ +} + +void +intr(Ureg *ureg) +{ + int vno, pvno, i; + Vctl *ctl, *v; + void (*pt)(Proc*, int, vlong); + uvlong tt, x; + + cycles(&tt); + pt =3D proctrace; + pvno =3D -1; + for(i =3D 0; i < 64; i++){ + vno =3D intvec(); + if(vno =3D=3D 0) + break; + cycles(&x); + vnot[vno] -=3D x; + if(vno =3D=3D pvno) + dblintr[vno]++; + pvno =3D vno; + if(pt && up && up->trace) + pt(up, (vno << 16) | SInts, 0); +=09 + if(vno > nelem(vctl) || (ctl =3D vctl[vno]) =3D=3D 0) { + iprint("spurious intr %d\n", vno); + return; + } + + for(v =3D ctl; v !=3D nil; v =3D v->next) + if(v->f) + v->f(ureg, v->a); + + intend(vno); /* reenable the interrupt */ + + if(pt && up && up->trace) + pt(up, (vno << 16) | SInte, 0); + cycles(&x); + vnot[vno] +=3D x; + vnon[vno]++; + } + if(i < nelem(nintr)) + nintr[i]++; + else + nintro++; + cycles(&x); + tt =3D x - tt; + i =3D tt / 3600; /* 100 microseconds units */ + if(i < nelem(thisto)) + thisto[i]++; + else + thistoo++; + + if(up) + preempted(); } =20 char* --- //.git/fs/object/8c796bf8b9c10a0845717c47af908e47dfe14482/tree/sys/sr= c/9/ppc/ucu +++ sys/src/9/ppc/ucu @@ -1,11 +1,13 @@ dev root cons + swap env pipe proc mnt srv + shr dup ssl cap