use mcs locks in the pae kernel Reference: /n/atom/patch/applied/paemcslock Date: Sat Jun 7 05:29:20 CES 2014 Signed-off-by: quanstro@quanstro.net --- /sys/src/9/pcpae/main.c Sat Jun 7 05:29:08 2014 +++ /sys/src/9/pcpae/main.c Sat Jun 7 05:29:08 2014 @@ -682,4 +682,6 @@ /* this is an admission that the scheduler is not very good */ if(m->machno != 0) halt(); + else + pause(); } --- /sys/src/9/pcpae/fns.h Sat Jun 7 05:29:08 2014 +++ /sys/src/9/pcpae/fns.h Sat Jun 7 05:29:08 2014 @@ -5,16 +5,16 @@ void archinit(void); void bootargs(void*); usize cankaddr(uintmem); +int cas(int*, int, int); void clockintr(Ureg*, void*); -#define cmpswap(a, b, c) cmpswap486(a, b, c) int cmpswap486(long*, long, long); +#define cmpswap(a, b, c) cmpswap486(a, b, c) void (*coherence)(void); -void cpuid(int, Cpuidreg*); void cpuid1(Cpuidreg*); int cpuidentify(void); +void cpuid(int, Cpuidreg*); void cpuidprint(void); void cycles(uvlong*); -int cas(int*, int, int); void delay(int); #define evenaddr(x) /* x86 doesn't care */ void fpclear(void); @@ -22,21 +22,21 @@ void fpoff(void); void fprestore(FPsave*); void fpsave(FPsave*); +char* getconf(char*); u32int getcr0(void); u32int getcr2(void); u32int getcr3(void); u32int getcr4(void); -char* getconf(char*); void guesscpuhz(int); void halt(void); int i8042auxcmd(int); int i8042auxcmds(uchar*, int); void i8042auxenable(void (*)(int)); -void i8042reset(void); -void i8042kbdenable(void); void i8042init(void); -void i8250console(void); +void i8042kbdenable(void); +void i8042reset(void); void* i8250alloc(int, int, int); +void i8250console(void); void i8250mouse(char*, int (*)(Queue*, int), int); void i8250setmouseputc(char*, int (*)(Queue*, int)); void i8253enable(void); @@ -48,28 +48,29 @@ int i8259enable(Vctl*); void i8259init(void); int i8259isr(int); -void i8259on(void); void i8259off(void); -void idle(void); +void i8259on(void); void idlehands(void); +void idle(void); int inb(int); +u32int inl(int); void insb(int, void*, int); u16int ins(int); -void inss(int, void*, int); -u32int inl(int); void insl(int, void*, int); +void inss(int, void*, int); int intrdisable(int, void (*)(Ureg *, void *), void*, int, char*); int intrenable(int, void (*)(Ureg*, void*), void*, int, char*); void introff(void); void intron(void); void invlpg(uintptr); +int ioalloc(int, int, int, char*); void iofree(int); void ioinit(void); -int iounused(int, int); -int ioalloc(int, int, int, char*); int ioreserve(int, int, int, char*); +int iounused(int, int); int iprint(char*, ...); int isaconfig(char*, int, ISAConf*); +u32int k10monmwait32(u32int*, u32int); void* kaddr(uintmem); #define kmapinval() void lgdt(ushort[3]); @@ -82,34 +83,35 @@ void meminit(void); void memorysummary(void); void mfence(void); -#define mmuflushtlb() putcr3(PADDR(m->pdpt)) void mmuidle(void); void mmuinit(void); PTE* mmuwalk(PTE*, uintptr, int, int); +u32int (*monmwait32)(u32int*, u32int); +#define monmwait(v, o) ((int)monmwait32((u32int*)(v), (u32int)(o))) +u32int nopmonmwait32(u32int*, u32int); uchar nvramread(int); void nvramwrite(int, uchar); void outb(int, int); +void outl(int, u32int); void outsb(int, void*, int); void outs(int, u16int); -void outss(int, void*, int); -void outl(int, u32int); void outsl(int, void*, int); +void outss(int, void*, int); uintmem paddr(void*); +void pause(void); int pcicap(Pcidev*, int); -int pcicfgr8(Pcidev*, int); int pcicfgr16(Pcidev*, int); int pcicfgr32(Pcidev*, int); -void pcicfgw8(Pcidev*, int, int); +int pcicfgr8(Pcidev*, int); void pcicfgw16(Pcidev*, int, int); void pcicfgw32(Pcidev*, int, int); +void pcicfgw8(Pcidev*, int, int); void pciclrbme(Pcidev*); void pciclrioe(Pcidev*); void pciclrmwi(Pcidev*); int pcigetpms(Pcidev*); void pcihinv(Pcidev*); uchar pciipin(Pcidev*, uchar); -Pcidev* pcimatch(Pcidev*, int, int); -Pcidev* pcimatchtbdf(int); void pcireset(void); int pciscan(int, Pcidev**); void pcisetbme(Pcidev*); @@ -119,10 +121,10 @@ void pcmcisread(PCMslot*); int pcmcistuple(int, int, int, void*, int); PCMmap* pcmmap(int, u32int, int, int); -int pcmspecial(char*, ISAConf*); int (*_pcmspecial)(char *, ISAConf *); -void pcmspecialclose(int); +int pcmspecial(char*, ISAConf*); void (*_pcmspecialclose)(int); +void pcmspecialclose(int); void pcmunmap(int, PCMmap*); int pdbmap(PTE*, uintmem, uintptr, int); void pdptinit(PTE*, PTE*); @@ -142,36 +144,47 @@ void syncclock(void); void syscallfmt(int, uintptr, va_list); void sysretfmt(int, va_list, long, uvlong, uvlong); +int tas(void*); void* tmpmap(Page*); void tmpunmap(void*); void touser(void*); void trapenable(int, void (*)(Ureg*, void*), void*, char*); -void trapinit(void); void trapinit0(void); -int tas(void*); +void trapinit(void); uvlong tscticks(uvlong*); -uintptr umbmalloc(uintmem, int, int); void umbfree(uintptr, int); +uintptr umbmalloc(uintmem, int, int); uintmem upaalloc(int, int); void upafree(uintmem, int); void upareserve(uintmem, int); #define userureg(ur) (((ur)->cs & 0xFFFF) == UESEL) void vectortable(void); -void* vmap(uintmem, usize); void* vmappat(uintmem, usize, int); int vmapsync(uintptr); +void* vmap(uintmem, usize); void vunmap(void*, usize); void wbinvd(void); void wrmsr(int, vlong); int xchgw(ushort*, int); - +#define mmuflushtlb() putcr3(PADDR(m->pdpt)) +Pcidev* pcimatch(Pcidev*, int, int); +Pcidev* pcimatchtbdf(int); #define waserror() (up->nerrlab++, setlabel(&up->errlab[up->nerrlab-1])) #define KADDR(a) kaddr(a) #define PADDR(a) paddr((void*)(a)) - #define dcflush(a, b) +#define BIOSSEG(a) KADDR(((uint)(a))<<4) + +int cas32(void*, u32int, u32int); +int cas64(void*, u64int, u64int); +u32int fas32(u32int*, u32int); +u64int fas64(u64int*, u64int); + +#define cas(p, e, n) cas32((p), (u32int)(e), (u32int)(n)) +#define casp(p, e, n) cas32((p), (u32int)(e), (u32int)(n)) +#define fas(p, v) ((int)fas32((u32int*)(p), (u32int)(v))) +#define fasp(p, v) ((void*)fas32((u32int*)(p), (u32int)(v))) #define PTR2UINT(p) ((uintptr)(p)) #define UINT2PTR(i) ((void*)(i)) -#define BIOSSEG(a) KADDR(((uint)(a))<<4) --- /sys/src/9/pcpae/l.s Sat Jun 7 05:29:08 2014 +++ /sys/src/9/pcpae/l.s Sat Jun 7 05:29:08 2014 @@ -673,6 +673,40 @@ XORL AX,AX RET +#define MONITOR BYTE $0x0f; BYTE $0x01; BYTE $0xc8 +#define MWAIT BYTE $0x0f; BYTE $0x01; BYTE $0xc9 + +/* + * uintptr monmwait(void*, uintptr) + */ +TEXT k10monmwait32(SB),1,$-4 + MOVL adr+0(FP), BP + MOVL val+4(FP), BX + +_mmstart32: + CMPL (BP), BX /* changed yet? */ + JNE _mmdone32 + + MOVL BP, AX /* linear address to monitor */ + XORL CX, CX /* extensions */ + XORL DX, DX /* hints */ + MONITOR + + CMPL (BP), BX /* changed yet? */ + JNE _mmdone32 + + /*XORL CX, CX*/ /* extensions (different from monitor) */ + XORL AX, AX /* hints */ + MWAIT + /* questionable: pop out on irq */ +_mmdone32: + MOVL (BP), AX + RET + +TEXT pause(SB), 1, $-4 + PAUSE + RET + TEXT mul64fract(SB), 1, $0 /* * Multiply two 64-bit number s and keep the middle 64 bits from the 128-bit result