Plan 9 from Bell Labs’s /usr/web/sources/contrib/uriel/changes/2006/0323/2

Copyright © 2021 Plan 9 Foundation.
Distributed under the MIT License.
Download the Plan 9 distribution.


kernel: new system calls semacquire, semrelease 
 [rsc] --rw-rw-r-- M 1061556 glenda sys 19699 Mar 23 11:05 sys/include/libc.h
	/n/sourcesdump/2006/0323/plan9/sys/include/libc.h:659,664 - 
	/n/sourcesdump/2006/0324/plan9/sys/include/libc.h:659,666
	  extern	int	segdetach(void*);
	  extern	int	segflush(void*, ulong);
	  extern	int	segfree(void*, ulong);
	+ extern	int	semacquire(long*, int);
	+ extern	long	semrelease(long*, long);
	  extern	int	sleep(long);
	  extern	int	stat(char*, uchar*, int);
	  extern	Waitmsg*	wait(void);
 [rsc] --rw-rw-r-- M 1061556 rsc sys 1865 Mar 23 12:25 sys/man/2/semacquire
 [rsc] --rw-rw-r-- M 1061556 glenda sys 3626 Mar 23 11:04 sys/src/9/alphapc/fns.h
	/n/sourcesdump/2006/0323/plan9/sys/src/9/alphapc/fns.h:12,18 - 
	/n/sourcesdump/2006/0324/plan9/sys/src/9/alphapc/fns.h:12,18
	  int	cistrncmp(char*, char*, int);
	  void	cpuidprint(void);
	  void	cserve(ulong, ulong);
	- #define cycles(x)
	+ #define cycles(x)	do{}while(0)
	  void	timeradd(Timer *);
	  void	timerdel(Timer *);
	  int	dmacount(int);
 [rsc] --rw-rw-r-- M 1061556 glenda sys 9367 Mar 23 11:04 sys/src/9/alphapc/l.s
	/n/sourcesdump/2006/0323/plan9/sys/src/9/alphapc/l.s:193,198 - 
	/n/sourcesdump/2006/0324/plan9/sys/src/9/alphapc/l.s:193,212
	  	BEQ	R0, inc1		/* write failed, retry */
	  	RET
	  
	+ TEXT	cmpswap(SB), $-8
	+ 	MOVQ	R0, R1	/* p */
	+ 	MOVL	old+4(FP), R2
	+ 	MOVL	new+8(FP), R3
	+ 	MOVLL	(R1), R0
	+ 	CMPEQ	R0, R2, R4
	+ 	BEQ	R4, fail	/* if R0 != [sic] R2, goto fail */
	+ 	MOVQ	R3, R0
	+ 	MOVLC	R0, (R1)
	+ 	RET
	+ fail:
	+ 	MOVL	$0, R0
	+ 	RET
	+ 	
	  TEXT	fpenab(SB), $-8
	  	MOVQ	R0, R16
	  	CALL_PAL $PALwrfen
 [rsc] --rw-rw-r-- M 1061556 glenda sys 13748 Mar 23 11:02 sys/src/9/alphapc/main.c
	/n/sourcesdump/2006/0323/plan9/sys/src/9/alphapc/main.c:73,78 - 
	/n/sourcesdump/2006/0324/plan9/sys/src/9/alphapc/main.c:73,80
	  		print("dumpopts: read %s=%s\n", confname[i], confval[i]);
	  }
	  
	+ extern void (*i8237alloc)(void);
	+ 
	  void
	  main(void)
	  {
	/n/sourcesdump/2006/0323/plan9/sys/src/9/alphapc/main.c:87,92 - 
	/n/sourcesdump/2006/0324/plan9/sys/src/9/alphapc/main.c:89,96
	  	archinit();
	  	xinit();
	  	memholes();
	+ 	if(i8237alloc != nil)
	+ 		i8237alloc();
	  	mmuinit();
	  	if(arch->coreinit)
	  		arch->coreinit();
 [rsc] --rw-rw-r-- M 1061556 glenda bitsy 5829 Mar 23 11:03 sys/src/9/bitsy/dat.h
	/n/sourcesdump/2006/0323/plan9/sys/src/9/bitsy/dat.h:32,41 - 
	/n/sourcesdump/2006/0324/plan9/sys/src/9/bitsy/dat.h:32,37
	   */
	  #define AOUT_MAGIC	(E_MAGIC)
	  
	- enum {
	- 	Lockcycles = 0,	/* Don't measure lock latencies */
	- };
	- 
	  struct Lock
	  {
	  	ulong	key;
	/n/sourcesdump/2006/0323/plan9/sys/src/9/bitsy/dat.h:44,50 - 
	/n/sourcesdump/2006/0324/plan9/sys/src/9/bitsy/dat.h:40,45
	  	Proc	*p;
	  	Mach	*m;
	  	ushort	isilock;
	- 	uvlong	lockcycles;	/* Measure lock latencies */
	  };
	  
	  struct Label
 [rsc] --rw-rw-r-- M 1061556 glenda bitsy 3063 Mar 23 11:04 sys/src/9/bitsy/fns.h
	/n/sourcesdump/2006/0323/plan9/sys/src/9/bitsy/fns.h:12,19 - 
	/n/sourcesdump/2006/0324/plan9/sys/src/9/bitsy/fns.h:12,20
	  int	cistrncmp(char*, char*, int);
	  void	clockinit(void);
	  ulong	clockpower(int);
	+ int	cmpswap(long*, long, long);
	  #define	coherence()
	- #define cycles(x)
	+ #define cycles(x)	do{}while(0)
	  #define	dcflush(a, b)
	  void	delay(int);
	  void	µcpower(int);
 [rsc] --rw-rw-r-- M 1061556 glenda bitsy 8951 Mar 23 11:04 sys/src/9/bitsy/main.c
	/n/sourcesdump/2006/0323/plan9/sys/src/9/bitsy/main.c:522,533 - 
	/n/sourcesdump/2006/0324/plan9/sys/src/9/bitsy/main.c:522,533
	  long
	  _xdec(long *p)
	  {
	- 	int x;
	+ 	int s;
	  	long v;
	  
	- 	x = splhi();
	+ 	s = splhi();
	  	v = --*p;
	- 	splx(x);
	+ 	splx(s);
	  	return v;
	  }
	  
	/n/sourcesdump/2006/0323/plan9/sys/src/9/bitsy/main.c:534,542 - 
	/n/sourcesdump/2006/0324/plan9/sys/src/9/bitsy/main.c:534,555
	  void
	  _xinc(long *p)
	  {
	- 	int x;
	+ 	int s;
	  
	- 	x = splhi();
	+ 	s = splhi();
	  	++*p;
	- 	splx(x);
	+ 	splx(s);
	  }
	+ 
	+ int
	+ cmpswap(long *addr, long old, long new)
	+ {
	+ 	int r, s;
	+ 	
	+ 	s = splhi();
	+ 	if(r = (*addr==old))
	+ 		*addr = new;
	+ 	splx(s);
	+ 	return r;
	+ }
	+ 
 [rsc] --rw-rw-r-- M 1061556 glenda sys 2767 Mar 23 11:03 sys/src/9/mtx/fns.h
	/n/sourcesdump/2006/0323/plan9/sys/src/9/mtx/fns.h:5,13 - 
	/n/sourcesdump/2006/0324/plan9/sys/src/9/mtx/fns.h:5,14
	  void	clockinit(void);
	  void	clockintr(Ureg*);
	  void	clockintrsched(void);
	+ int	cmpswap(long*, long, long);
	  #define coherence()	eieio()
	  void	cpuidprint(void);
	- #define cycles(x)
	+ #define cycles(x)	do{}while(0)
	  void	dcflush(void*, ulong);
	  void	delay(int);
	  void	dumpregs(Ureg*);
 [rsc] --rw-rw-r-- M 1061556 glenda sys 11000 Mar 23 11:04 sys/src/9/mtx/l.s
	/n/sourcesdump/2006/0323/plan9/sys/src/9/mtx/l.s:301,306 - 
	/n/sourcesdump/2006/0324/plan9/sys/src/9/mtx/l.s:301,322
	  	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
	+ 
	  TEXT	getpvr(SB), $0
	  	MOVW	SPR(PVR), R3
	  	RETURN
 [rsc] --rw-rw-r-- M 1061556 glenda sys 19249 Mar 23 11:03 sys/src/9/pc/devarch.c
	/n/sourcesdump/2006/0323/plan9/sys/src/9/pc/devarch.c:497,502 - 
	/n/sourcesdump/2006/0324/plan9/sys/src/9/pc/devarch.c:497,518
	  }
	  
	  /*
	+  * 386 has no compare-and-swap instruction.
	+  * Run it with interrupts turned off instead.
	+  */
	+ static int
	+ cmpswap386(long *addr, long old, long new)
	+ {
	+ 	int r, s;
	+ 	
	+ 	s = splhi();
	+ 	if(r = (*addr == old))
	+ 		*addr = new;
	+ 	splx(s);
	+ 	return r;
	+ }
	+ 
	+ /*
	   * On a uniprocessor, you'd think that coherence could be nop,
	   * but it can't.  We still need a barrier when using coherence() in
	   * device drivers.
	/n/sourcesdump/2006/0323/plan9/sys/src/9/pc/devarch.c:506,511 - 
	/n/sourcesdump/2006/0324/plan9/sys/src/9/pc/devarch.c:522,529
	   */
	  void (*coherence)(void) = nop;
	  
	+ int (*cmpswap)(long*, long, long) = cmpswap386;
	+ 
	  PCArch* arch;
	  extern PCArch* knownarch[];
	  
	/n/sourcesdump/2006/0323/plan9/sys/src/9/pc/devarch.c:787,792 - 
	/n/sourcesdump/2006/0324/plan9/sys/src/9/pc/devarch.c:805,817
	  		n += snprint(buf+n, sizeof buf-n, "nop\n");
	  	else
	  		n += snprint(buf+n, sizeof buf-n, "0x%p\n", coherence);
	+ 	n += snprint(buf+n, sizeof buf-n, "cmpswap ");
	+ 	if(cmpswap == cmpswap386)
	+ 		n += snprint(buf+n, sizeof buf-n, "cmpswap386\n");
	+ 	else if(cmpswap == cmpswap486)
	+ 		n += snprint(buf+n, sizeof buf-n, "cmpswap486\n");
	+ 	else
	+ 		n += snprint(buf+n, sizeof buf-n, "0x%p\n", cmpswap);
	  	n += snprint(buf+n, sizeof buf-n, "i8253set %s\n", doi8253set ? "on" : "off");
	  	buf[n] = 0;
	  	return readstr(offset, a, nn, buf);
	/n/sourcesdump/2006/0323/plan9/sys/src/9/pc/devarch.c:896,901 - 
	/n/sourcesdump/2006/0324/plan9/sys/src/9/pc/devarch.c:921,929
	  	 */
	  	if(X86FAMILY(m->cpuidax) == 3)
	  		conf.copymode = 1;
	+ 
	+ 	if(X86FAMILY(m->cpuidax) >= 4)
	+ 		cmpswap = cmpswap486;
	  
	  	if(X86FAMILY(m->cpuidax) >= 5)
	  		coherence = mb586;
 [rsc] --rw-rw-r-- M 1061556 glenda sys 4531 Mar 23 11:05 sys/src/9/pc/fns.h
	/n/sourcesdump/2006/0323/plan9/sys/src/9/pc/fns.h:5,10 - 
	/n/sourcesdump/2006/0324/plan9/sys/src/9/pc/fns.h:5,12
	  void	archinit(void);
	  void	bootargs(void*);
	  void	clockintr(Ureg*, void*);
	+ int	(*cmpswap)(long*, long, long);
	+ int	cmpswap486(long*, long, long);
	  void	(*coherence)(void);
	  void	cpuid(char*, int*, int*);
	  int	cpuidentify(void);
 [rsc] --rw-rw-r-- M 1061556 glenda sys 28552 Mar 23 11:05 sys/src/9/pc/l.s
	/n/sourcesdump/2006/0323/plan9/sys/src/9/pc/l.s:839,844 - 
	/n/sourcesdump/2006/0324/plan9/sys/src/9/pc/l.s:839,857
	  	XCHGW	AX, (BX)
	  	RET
	  
	+ TEXT cmpswap486(SB), $0
	+ 	MOVL	addr+0(FP), BX
	+ 	MOVL	old+4(FP), AX
	+ 	MOVL	new+8(FP), CX
	+ 	LOCK
	+ 	BYTE $0x0F; BYTE $0xB1; BYTE $0x0B	/* CMPXCHGL CX, (BX) */
	+ 	JNZ didnt
	+ 	MOVL	$1, AX
	+ 	RET
	+ didnt:
	+ 	XORL	AX,AX
	+ 	RET
	+ 
	  TEXT mul64fract(SB), $0
	  /*
	   * Multiply two 64-bit number s and keep the middle 64 bits from the 128-bit result
 [rsc] --rw-rw-r-- M 1061556 glenda sys 22669 Mar 23 11:04 sys/src/9/port/portdat.h
	/n/sourcesdump/2006/0323/plan9/sys/src/9/port/portdat.h:40,45 - 
	/n/sourcesdump/2006/0324/plan9/sys/src/9/port/portdat.h:40,46
	  typedef struct Sargs	Sargs;
	  typedef struct Schedq	Schedq;
	  typedef struct Segment	Segment;
	+ typedef struct Sema	Sema;
	  typedef struct Timer	Timer;
	  typedef struct Timers	Timers;
	  typedef struct Uart	Uart;
	/n/sourcesdump/2006/0323/plan9/sys/src/9/port/portdat.h:389,394 - 
	/n/sourcesdump/2006/0324/plan9/sys/src/9/port/portdat.h:390,404
	  	void	(*pgfree)(Page*);
	  };
	  
	+ struct Sema
	+ {
	+ 	Rendez;
	+ 	long	*addr;
	+ 	int	waiting;
	+ 	Sema	*next;
	+ 	Sema	*prev;
	+ };
	+ 
	  struct Segment
	  {
	  	Ref;
	/n/sourcesdump/2006/0323/plan9/sys/src/9/port/portdat.h:407,412 - 
	/n/sourcesdump/2006/0324/plan9/sys/src/9/port/portdat.h:417,424
	  	Pte	**map;
	  	int	mapsize;
	  	Pte	*ssegmap[SSEGMAPSIZE];
	+ 	Lock	semalock;
	+ 	Sema	sema;
	  	ulong	mark;		/* portcountrefs */
	  };
	  
 [rsc] --rw-rw-r-- M 1061556 glenda sys 13992 Mar 23 11:06 sys/src/9/port/segment.c
	/n/sourcesdump/2006/0323/plan9/sys/src/9/port/segment.c:70,75 - 
	/n/sourcesdump/2006/0324/plan9/sys/src/9/port/segment.c:70,77
	  	s->base = base;
	  	s->top = base+(size*BY2PG);
	  	s->size = size;
	+ 	s->sema.prev = &s->sema;
	+ 	s->sema.next = &s->sema;
	  
	  	mapsize = ROUND(size, PTEPERTAB)/PTEPERTAB;
	  	if(mapsize > nelem(s->ssegmap)){
	/n/sourcesdump/2006/0323/plan9/sys/src/9/port/segment.c:789,791 - 
	/n/sourcesdump/2006/0324/plan9/sys/src/9/port/segment.c:791,794
	  		s->profile[pc>>LRESPROF] += TK2MS(1);
	  	}
	  }
	+ 
 [rsc] --rw-rw-r-- M 1061556 rsc sys 2424 Mar 23 11:03 sys/src/9/port/semaphore.p
 [rsc] --rw-rw-r-- M 1061556 glenda sys 21535 Mar 23 11:03 sys/src/9/port/sysproc.c
	[diffs elided - too long]
	[diff -c /n/sourcesdump/2006/0323/plan9/sys/src/9/port/sysproc.c /n/sourcesdump/2006/0324/plan9/sys/src/9/port/sysproc.c]
 [rsc] --rw-rw-r-- M 1061556 glenda sys 927 Mar 23 11:05 sys/src/libc/9syscall/sys.h
	/n/sourcesdump/2006/0323/plan9/sys/src/libc/9syscall/sys.h:35,40 - 
	/n/sourcesdump/2006/0324/plan9/sys/src/libc/9syscall/sys.h:35,42
	  #define	RENDEZVOUS	34
	  #define	UNMOUNT		35
	  #define	_WAIT		36
	+ #define	SEMACQUIRE	37
	+ #define	SEMRELEASE	38
	  #define	SEEK		39
	  #define	FVERSION	40
	  #define	ERRSTR		41
	/n/sourcesdump/2006/0323/plan9/sys/src/libc/9syscall/sys.h:44,48 - 
	/n/sourcesdump/2006/0324/plan9/sys/src/libc/9syscall/sys.h:46,50
	  #define	FWSTAT		45
	  #define	MOUNT		46
	  #define	AWAIT		47
	- #define PREAD		50
	- #define PWRITE		51
	+ #define	PREAD		50
	+ #define	PWRITE		51
 [rsc] --rw-rw-r-- M 1061556 rsc sys 1865 Mar 23 12:25 sys/man/2/semacquire


Bell Labs OSI certified Powered by Plan 9

(Return to Plan 9 Home Page)

Copyright © 2021 Plan 9 Foundation. All Rights Reserved.
Comments to webmaster@9p.io.