CSa32/CS.S
author hh
Thu, 21 Nov 2019 14:55:10 +0100
changeset 0 5c129dd80d4f
permissions -rw-r--r--
--
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
0
hh
parents:
diff changeset
     1
	.include "DS.S"
hh
parents:
diff changeset
     2
#-----------------------------------------------
hh
parents:
diff changeset
     3
#	S T A T I C   V A R I A B L E S
hh
parents:
diff changeset
     4
#-----------------------------------------------
hh
parents:
diff changeset
     5
	.data
hh
parents:
diff changeset
     6
	.global C.csP
hh
parents:
diff changeset
     7
C.csP:	.int	0				# -->CS
hh
parents:
diff changeset
     8
	.text
hh
parents:
diff changeset
     9
#-----------------------------------------------
hh
parents:
diff changeset
    10
#	M A I N   R O U T I N E
hh
parents:
diff changeset
    11
#-----------------------------------------------
hh
parents:
diff changeset
    12
# takes values from ENV, establishes task for comm nodes and waits for their completion
hh
parents:
diff changeset
    13
	ARGS
hh
parents:
diff changeset
    14
	DS	prgP				# -->progname
hh
parents:
diff changeset
    15
# returns	nothing
hh
parents:
diff changeset
    16
	PROLOC
hh
parents:
diff changeset
    17
	DL	this, CSL			# CS - top level attr vector
hh
parents:
diff changeset
    18
	DL	deP				# -->Debug
hh
parents:
diff changeset
    19
	DL	status				# status returned from wait
hh
parents:
diff changeset
    20
	DL	pid				# PID returned from wait
hh
parents:
diff changeset
    21
	DL	bad				# cummulative subtask rc
hh
parents:
diff changeset
    22
	DL	s, 256				# string buf
hh
parents:
diff changeset
    23
	EPILOC
hh
parents:
diff changeset
    24
#-----------------------------------------------
hh
parents:
diff changeset
    25
	.global _start
hh
parents:
diff changeset
    26
_start:
hh
parents:
diff changeset
    27
	PROLOG
hh
parents:
diff changeset
    28
	lea	this(bp), b			# -->CS
hh
parents:
diff changeset
    29
	mov	b, C.csP			# save -->CS
hh
parents:
diff changeset
    30
	lea	C.debug(b), a			# -->Debug
hh
parents:
diff changeset
    31
	mov	a, deP(bp)
hh
parents:
diff changeset
    32
# initialize static debug vars
hh
parents:
diff changeset
    33
	push	prgP(bp)			# argv[0] -->prgname
hh
parents:
diff changeset
    34
	call	D.init				# initialize static debug vars
hh
parents:
diff changeset
    35
	push	D.prgNameP
hh
parents:
diff changeset
    36
# indetify itself
hh
parents:
diff changeset
    37
	DEBID	"client/server demo"
hh
parents:
diff changeset
    38
	movl	$1, C.debMaxLev(b)		# default debug level
hh
parents:
diff changeset
    39
# initialize top level ctrl values vector
hh
parents:
diff changeset
    40
	ShareA					# allocate shared structure
hh
parents:
diff changeset
    41
	mov	C.csP, b
hh
parents:
diff changeset
    42
	mov	a, C.shP(b)			# save -->shared struct in vector
hh
parents:
diff changeset
    43
	movl	$0, S.msgs(a)			# init msg cntr
hh
parents:
diff changeset
    44
	movl	$0, S.conns(a)			# init connection cntr
hh
parents:
diff changeset
    45
	push	$1				# initial semaphore value
hh
parents:
diff changeset
    46
	push	$1				# semaphore shared between processes
hh
parents:
diff changeset
    47
	lea	S.counter_sem(a), c
hh
parents:
diff changeset
    48
	push	c
hh
parents:
diff changeset
    49
#	call	sem_init			# initialize shared counters semaphore
hh
parents:
diff changeset
    50
#	cmp	$0, a
hh
parents:
diff changeset
    51
#	jz	0f
hh
parents:
diff changeset
    52
#	SYSERR	"sem_init of shared counters semaphore"
hh
parents:
diff changeset
    53
#0:
hh
parents:
diff changeset
    54
	SYS	sem_init
hh
parents:
diff changeset
    55
# set default values
hh
parents:
diff changeset
    56
	mov	C.csP, b
hh
parents:
diff changeset
    57
	movl	$3, C.ttl(b)			# default TTL
hh
parents:
diff changeset
    58
	movl	$11000, C.rp0(b)		# default bind port for the 1. node in ring
hh
parents:
diff changeset
    59
	movl	$12000, C.mp0(b)		# default bind port for the 1. node in mash
hh
parents:
diff changeset
    60
	movl	$0, C.rn(b)			# default # of nodes in ring
hh
parents:
diff changeset
    61
	movl	$0, C.mn(b)			# default # of nodes in mash
hh
parents:
diff changeset
    62
	movl	$0, C.ssl(b)			# default ssl switch - 0=noSSL
hh
parents:
diff changeset
    63
	movl	$77, C.connTh(b)		# conn retries threshold
hh
parents:
diff changeset
    64
	mov	$0f, a
hh
parents:
diff changeset
    65
	mov	a, C.txtP(b)			# default payload text
hh
parents:
diff changeset
    66
	jmp	1f
hh
parents:
diff changeset
    67
0:	.ascii "bla bla\0"
hh
parents:
diff changeset
    68
1:
hh
parents:
diff changeset
    69
# get control values from ENV
hh
parents:
diff changeset
    70
# get max debug level
hh
parents:
diff changeset
    71
	GETINTENV "DEB"
hh
parents:
diff changeset
    72
	mov	C.csP, b
hh
parents:
diff changeset
    73
	mov	a, C.debMaxLev(b)
hh
parents:
diff changeset
    74
	cmp	$-1, a				# debug level -1 means search subroutines
hh
parents:
diff changeset
    75
	jne	0f
hh
parents:
diff changeset
    76
	call	D.subr
hh
parents:
diff changeset
    77
	jmp	C.ret
hh
parents:
diff changeset
    78
0:
hh
parents:
diff changeset
    79
# get message payload text
hh
parents:
diff changeset
    80
	push	$0f
hh
parents:
diff changeset
    81
	call	getenv
hh
parents:
diff changeset
    82
	cmp	$0, a
hh
parents:
diff changeset
    83
	jz	1f
hh
parents:
diff changeset
    84
	mov	C.csP, b
hh
parents:
diff changeset
    85
	mov	a, C.txtP(b)
hh
parents:
diff changeset
    86
	jmp	1f
hh
parents:
diff changeset
    87
0:	.asciz "T"
hh
parents:
diff changeset
    88
1:
hh
parents:
diff changeset
    89
# get TTL
hh
parents:
diff changeset
    90
	GETINTENV "TTL"
hh
parents:
diff changeset
    91
	jz	0f
hh
parents:
diff changeset
    92
	mov	a, C.ttl(b)
hh
parents:
diff changeset
    93
0:
hh
parents:
diff changeset
    94
# get # of nodes in each topology
hh
parents:
diff changeset
    95
	GETINTENV "I"
hh
parents:
diff changeset
    96
	jz	0f
hh
parents:
diff changeset
    97
	mov	a, C.rn(b)
hh
parents:
diff changeset
    98
	mov	a, C.mn(b)
hh
parents:
diff changeset
    99
0:
hh
parents:
diff changeset
   100
# get # of nodes in ring
hh
parents:
diff changeset
   101
	GETINTENV "RN"
hh
parents:
diff changeset
   102
	jz	0f
hh
parents:
diff changeset
   103
	mov	a, C.rn(b)
hh
parents:
diff changeset
   104
0:
hh
parents:
diff changeset
   105
# get # of nodes in mash
hh
parents:
diff changeset
   106
	GETINTENV "MN"
hh
parents:
diff changeset
   107
	jz	0f
hh
parents:
diff changeset
   108
	mov	a, C.mn(b)
hh
parents:
diff changeset
   109
0:
hh
parents:
diff changeset
   110
	add	C.rn(b), a
hh
parents:
diff changeset
   111
	cmp	$3, C.ssl(b)
hh
parents:
diff changeset
   112
	jne	1f
hh
parents:
diff changeset
   113
	add	a, a				# double # of nodes when both SSL and nonSSL
hh
parents:
diff changeset
   114
1:	mov	C.shP(b), c			# -->shared counters
hh
parents:
diff changeset
   115
	mov	a, S.act(c)			# save # of active nodes
hh
parents:
diff changeset
   116
# get first ring node's bind port#
hh
parents:
diff changeset
   117
	GETINTENV "RP0"
hh
parents:
diff changeset
   118
	jz	0f
hh
parents:
diff changeset
   119
	mov	a, C.rp0(b)
hh
parents:
diff changeset
   120
0:
hh
parents:
diff changeset
   121
# get first mash node's bind port#
hh
parents:
diff changeset
   122
	GETINTENV "MP0"
hh
parents:
diff changeset
   123
	jz	0f
hh
parents:
diff changeset
   124
	mov	a, C.mp0(b)
hh
parents:
diff changeset
   125
0:
hh
parents:
diff changeset
   126
# get random() seed
hh
parents:
diff changeset
   127
	GETINTENV "RS"
hh
parents:
diff changeset
   128
	jz	0f
hh
parents:
diff changeset
   129
	push	a
hh
parents:
diff changeset
   130
	call	srandom
hh
parents:
diff changeset
   131
0:
hh
parents:
diff changeset
   132
# get pacing interval (real num in seconds)
hh
parents:
diff changeset
   133
	movl	$0, C.pace.tv_sec(b)
hh
parents:
diff changeset
   134
	movl	$0, C.pace.tv_nsec(b)
hh
parents:
diff changeset
   135
	movl	$0, C.pacing(b)
hh
parents:
diff changeset
   136
	push	$0f
hh
parents:
diff changeset
   137
	call	getenv
hh
parents:
diff changeset
   138
	jmp	1f
hh
parents:
diff changeset
   139
0:	.asciz "P"
hh
parents:
diff changeset
   140
1:
hh
parents:
diff changeset
   141
	test	a, a				# env P set ?
hh
parents:
diff changeset
   142
	jz	3f				# no
hh
parents:
diff changeset
   143
	push	a
hh
parents:
diff changeset
   144
	call	atof				# convert to double
hh
parents:
diff changeset
   145
	fstl	(sp)				# tempor save
hh
parents:
diff changeset
   146
	mov	C.csP, b
hh
parents:
diff changeset
   147
	fisttpl	C.pace.tv_sec(b)		# truncated integral part = secs
hh
parents:
diff changeset
   148
	fldl	(sp)
hh
parents:
diff changeset
   149
	fisubl	C.pace.tv_sec(b)		# fraction part
hh
parents:
diff changeset
   150
	fimull	1f				# * 10^9 = nanosecs
hh
parents:
diff changeset
   151
	fistl	C.pace.tv_nsec(b)
hh
parents:
diff changeset
   152
	jmp	2f
hh
parents:
diff changeset
   153
0:	.double	0
hh
parents:
diff changeset
   154
1:	.int	1000000000			# 10^9
hh
parents:
diff changeset
   155
2:
hh
parents:
diff changeset
   156
	cmp	$0, C.pace.tv_sec(b)
hh
parents:
diff changeset
   157
	jnz	0f
hh
parents:
diff changeset
   158
	cmp	$0, C.pace.tv_nsec(b)
hh
parents:
diff changeset
   159
	jz	3f
hh
parents:
diff changeset
   160
0:	movl	$1, C.pacing(b)
hh
parents:
diff changeset
   161
3:
hh
parents:
diff changeset
   162
# get ssl switch value and save it as mask
hh
parents:
diff changeset
   163
# switch: 0 = noSSL, 1 = SSL, 2 = both
hh
parents:
diff changeset
   164
# mask: 01B=noSSL, 10B=SSL, 11B=both
hh
parents:
diff changeset
   165
	GETINTENV "SSL"				# returned zero means SSL=0 or SSL by default 0
hh
parents:
diff changeset
   166
	inc	a				# change switch to mask
hh
parents:
diff changeset
   167
	mov	a, C.ssl(b)
hh
parents:
diff changeset
   168
	cmp	$1, a
hh
parents:
diff changeset
   169
	je	C.cont				# no SSL
hh
parents:
diff changeset
   170
	cmp	$2, a
hh
parents:
diff changeset
   171
	je	0f				# only SSL
hh
parents:
diff changeset
   172
	mov	C.shP(b), a			# -->shared mem
hh
parents:
diff changeset
   173
	shll	$1, S.act(a)			# double # of active nodes when running both SSL and nonSSL
hh
parents:
diff changeset
   174
# get SSL CA cert dir path
hh
parents:
diff changeset
   175
0:
hh
parents:
diff changeset
   176
	push	$0f
hh
parents:
diff changeset
   177
	call	getenv
hh
parents:
diff changeset
   178
	jmp	1f
hh
parents:
diff changeset
   179
0:	.asciz "CAP"
hh
parents:
diff changeset
   180
1:
hh
parents:
diff changeset
   181
	test	a, a
hh
parents:
diff changeset
   182
	jnz	1f
hh
parents:
diff changeset
   183
	mov	$0f, a
hh
parents:
diff changeset
   184
	jmp	1f
hh
parents:
diff changeset
   185
0:	.asciz	"/home/local/etc/ssl/certs/"
hh
parents:
diff changeset
   186
1:
hh
parents:
diff changeset
   187
	mov	C.csP, b
hh
parents:
diff changeset
   188
	mov	a, C.caPathP(b)			# save -->SSL CA certs path
hh
parents:
diff changeset
   189
# get SSL dir path
hh
parents:
diff changeset
   190
	push	$0f
hh
parents:
diff changeset
   191
	call	getenv
hh
parents:
diff changeset
   192
	jmp	1f
hh
parents:
diff changeset
   193
0:	.asciz "CEP"
hh
parents:
diff changeset
   194
1:
hh
parents:
diff changeset
   195
	test	a, a
hh
parents:
diff changeset
   196
	jz	0f				# ceP not set, try to determine
hh
parents:
diff changeset
   197
	mov	C.csP, b
hh
parents:
diff changeset
   198
	mov	a, C.cePathP(b)			# save -->SSL dir path
hh
parents:
diff changeset
   199
	jmp	1f
hh
parents:
diff changeset
   200
# determine home path (needed to locate SSL keys & certificates)
hh
parents:
diff changeset
   201
0:
hh
parents:
diff changeset
   202
	push	prgP(bp)			# -->first parm - progname w/ path
hh
parents:
diff changeset
   203
	call	dirname				# get prog dirname
hh
parents:
diff changeset
   204
	push	a
hh
parents:
diff changeset
   205
	call	strlen				# dirname length
hh
parents:
diff changeset
   206
	lea	1f-0f(a), a			# + suffix length
hh
parents:
diff changeset
   207
	sub	a, sp				# allocate space for cePath
hh
parents:
diff changeset
   208
	mov	C.csP, b
hh
parents:
diff changeset
   209
	mov	sp, C.cePathP(b)		# save -->SSL path
hh
parents:
diff changeset
   210
	push	prgP(bp)
hh
parents:
diff changeset
   211
	call	dirname				# get home dirname
hh
parents:
diff changeset
   212
	push	a				# -->home dirname
hh
parents:
diff changeset
   213
	mov	C.csP, b
hh
parents:
diff changeset
   214
	push	C.cePathP(b)			# -->SSL path
hh
parents:
diff changeset
   215
	call	strcpy				# copy dirname to SSL path
hh
parents:
diff changeset
   216
	call	strlen				# end of dirname
hh
parents:
diff changeset
   217
	push	$0f				# -->suffix
hh
parents:
diff changeset
   218
	mov	C.csP, b
hh
parents:
diff changeset
   219
	mov	C.cePathP(b), c
hh
parents:
diff changeset
   220
	lea	(c, a), a			# -->end of dirname
hh
parents:
diff changeset
   221
	push	a
hh
parents:
diff changeset
   222
	call	strcpy				# copy suffix to SSL path
hh
parents:
diff changeset
   223
	jmp	1f
hh
parents:
diff changeset
   224
0:	.asciz	"/../CS/"
hh
parents:
diff changeset
   225
1:
hh
parents:
diff changeset
   226
# testing sandbox
hh
parents:
diff changeset
   227
	mov	C.csP, b
hh
parents:
diff changeset
   228
	pushl	C.debMaxLev(b)
hh
parents:
diff changeset
   229
	cmp	$9, C.debMaxLev(b)
hh
parents:
diff changeset
   230
	jne	C.cont
hh
parents:
diff changeset
   231
hh
parents:
diff changeset
   232
	LOG	9, "debug=%u, testing...", 1
hh
parents:
diff changeset
   233
	DebugA
hh
parents:
diff changeset
   234
	mov	a, deP(bp)
hh
parents:
diff changeset
   235
	DEBID	"TEST"
hh
parents:
diff changeset
   236
	LOG	9, "progress"
hh
parents:
diff changeset
   237
hh
parents:
diff changeset
   238
	mov	C.csP, b
hh
parents:
diff changeset
   239
	mov	C.shP(b), a
hh
parents:
diff changeset
   240
	push	S.act(a)
hh
parents:
diff changeset
   241
	LOG	9, "shared act=%u"
hh
parents:
diff changeset
   242
hh
parents:
diff changeset
   243
	jmp	C.ret
hh
parents:
diff changeset
   244
# normal execution
hh
parents:
diff changeset
   245
C.cont:
hh
parents:
diff changeset
   246
	push	C.debMaxLev(b)
hh
parents:
diff changeset
   247
	push	C.ssl(b)
hh
parents:
diff changeset
   248
	push	C.pace.tv_nsec(b)
hh
parents:
diff changeset
   249
	push	C.pace.tv_sec(b)
hh
parents:
diff changeset
   250
	push	C.ttl(b)
hh
parents:
diff changeset
   251
	push	C.rn(b)
hh
parents:
diff changeset
   252
	push	C.mn(b)
hh
parents:
diff changeset
   253
	push	D.prgNameP
hh
parents:
diff changeset
   254
	LOG	1, "pgm=%s, mash nodes=%d, ring nodes=%d, ttl=%d, pacing=%ld.%09ld, SSL mask=0x%02x, debug=%u", 8
hh
parents:
diff changeset
   255
	testl	$2, C.ssl(b)
hh
parents:
diff changeset
   256
	jz	0f
hh
parents:
diff changeset
   257
	push	C.caPathP(b)
hh
parents:
diff changeset
   258
	push	C.cePathP(b)
hh
parents:
diff changeset
   259
	LOG	1, "SSL path=%s, SSL CA path=%s"
hh
parents:
diff changeset
   260
0:
hh
parents:
diff changeset
   261
# create constellation processes RING/MASH, nonSSL/SSL
hh
parents:
diff changeset
   262
	mov	$0, c				# iter counter
hh
parents:
diff changeset
   263
	mov	C.ssl(b), d			# SSL mask (01b = noSSL, 10b = SSL, 11b = both)
hh
parents:
diff changeset
   264
# iterate on SSL variants
hh
parents:
diff changeset
   265
C.iterateOnSsl:
hh
parents:
diff changeset
   266
	test	$1, d				# check lowest bit of mask
hh
parents:
diff changeset
   267
	jz	C.nextSsslVar			# next SSL variant
hh
parents:
diff changeset
   268
	pusha
hh
parents:
diff changeset
   269
# create RING
hh
parents:
diff changeset
   270
	SYS	fork
hh
parents:
diff changeset
   271
	jnz	1f				# parent
hh
parents:
diff changeset
   272
	popa
hh
parents:
diff changeset
   273
	pushl	$Cn.ring			# RING topology
hh
parents:
diff changeset
   274
	push	c				# use iter ctr as SSL switch
hh
parents:
diff changeset
   275
	call	Constellation			# create RING constellation
hh
parents:
diff changeset
   276
1:	push	a
hh
parents:
diff changeset
   277
	LOG	5, "RING started in process %d"
hh
parents:
diff changeset
   278
	lea 	4(sp), sp
hh
parents:
diff changeset
   279
# create MASH
hh
parents:
diff changeset
   280
	SYS	fork
hh
parents:
diff changeset
   281
	jnz	1f				# parent
hh
parents:
diff changeset
   282
	popa
hh
parents:
diff changeset
   283
	pushl	$Cn.mash			# MASH topology
hh
parents:
diff changeset
   284
	push	c				# use iter ctr as SSL switch
hh
parents:
diff changeset
   285
	call	Constellation			# create MASH constellation
hh
parents:
diff changeset
   286
1:	push	a
hh
parents:
diff changeset
   287
	LOG	5, "MASH started in process %d"
hh
parents:
diff changeset
   288
	lea 	4(sp), sp
hh
parents:
diff changeset
   289
hh
parents:
diff changeset
   290
	popa
hh
parents:
diff changeset
   291
C.nextSsslVar:
hh
parents:
diff changeset
   292
	shr	$1, d				# shift to test next SSL bit
hh
parents:
diff changeset
   293
	inc	c				# incr ctr
hh
parents:
diff changeset
   294
	cmp	$2, c
hh
parents:
diff changeset
   295
	jl	C.iterateOnSsl
hh
parents:
diff changeset
   296
# wait for constellation processes completion
hh
parents:
diff changeset
   297
	LOG	5, "waiting for constellations to terminate"
hh
parents:
diff changeset
   298
	movl	$0, bad(bp)			# clear cummulative rc
hh
parents:
diff changeset
   299
C.iterateOnWait:
hh
parents:
diff changeset
   300
	lea	status(bp), a
hh
parents:
diff changeset
   301
	push	a				# -->return status of task
hh
parents:
diff changeset
   302
	call	wait
hh
parents:
diff changeset
   303
	mov	a, pid(bp)			# save pid
hh
parents:
diff changeset
   304
	cmp	$-1, a				# a task ended?
hh
parents:
diff changeset
   305
	jne	0f				# yes
hh
parents:
diff changeset
   306
	call	__errno_location
hh
parents:
diff changeset
   307
	cmp	$10, (a)			# error == ECHILD ?
hh
parents:
diff changeset
   308
	je	C.ret				# yes, no other subtasks
hh
parents:
diff changeset
   309
	SYSERR	"wait"
hh
parents:
diff changeset
   310
0:
hh
parents:
diff changeset
   311
#	push	status(bp)			# status of task
hh
parents:
diff changeset
   312
#	push	a				# pid
hh
parents:
diff changeset
   313
#	LOG	5, "status returned from task %u: 0x%08x"
hh
parents:
diff changeset
   314
	mov	status(bp), d
hh
parents:
diff changeset
   315
	test	$0x7f, d
hh
parents:
diff changeset
   316
	jnz	1f				# task killed, ABEND
hh
parents:
diff changeset
   317
	and	$0xff00, d			# task exited, extract rc
hh
parents:
diff changeset
   318
	shr	$8, d
hh
parents:
diff changeset
   319
	or	d, bad(bp)			# accumulate rc
hh
parents:
diff changeset
   320
	push	d				# task rc
hh
parents:
diff changeset
   321
	push	pid(bp)				# task pid
hh
parents:
diff changeset
   322
	LOG	5, "constellation task %u ended with exit(%d)"
hh
parents:
diff changeset
   323
	jmp	C.iterateOnWait			# wait for other tasks
hh
parents:
diff changeset
   324
1:	push	d
hh
parents:
diff changeset
   325
	push	pid(bp)
hh
parents:
diff changeset
   326
	LOG	5, "constellation task %u killed, status=0x%x", 2
hh
parents:
diff changeset
   327
2:
hh
parents:
diff changeset
   328
# ABEND
hh
parents:
diff changeset
   329
	LOG	0, "ABEND, kill all tasks"
hh
parents:
diff changeset
   330
	pushl	$15				# SIGTERM
hh
parents:
diff changeset
   331
	pushl	$0				# all tasks
hh
parents:
diff changeset
   332
#	call	kill
hh
parents:
diff changeset
   333
	SYS	kill
hh
parents:
diff changeset
   334
	pushl	$1
hh
parents:
diff changeset
   335
	call	exit
hh
parents:
diff changeset
   336
# normal end
hh
parents:
diff changeset
   337
C.ret:	movl	C.csP, b			# -->CS vector
hh
parents:
diff changeset
   338
	movl	C.shP(b), b			# -->Share
hh
parents:
diff changeset
   339
	pushl	S.conns(b)			# no. of connections made
hh
parents:
diff changeset
   340
	pushl	S.msgs(b)			# no. of messages sent
hh
parents:
diff changeset
   341
	LOG	1, "END, forwards=%d, connections=%d", 2
hh
parents:
diff changeset
   342
	push	bad(bp)
hh
parents:
diff changeset
   343
	call	exit
hh
parents:
diff changeset
   344
#-----------------------------------------------
hh
parents:
diff changeset
   345
#	 C O N S T E L L A T I O N   O P E R A T I O N S
hh
parents:
diff changeset
   346
#-----------------------------------------------
hh
parents:
diff changeset
   347
	ARGS
hh
parents:
diff changeset
   348
	DS	ssl				# ssl switch
hh
parents:
diff changeset
   349
	DS	topo				# topology
hh
parents:
diff changeset
   350
# returns:	nothing
hh
parents:
diff changeset
   351
	PROLOC
hh
parents:
diff changeset
   352
	DL	this, ConstellationL		# this Constellation instance
hh
parents:
diff changeset
   353
	DL	thisP				# -->this Constellation
hh
parents:
diff changeset
   354
	DL	deP				# -->Debug
hh
parents:
diff changeset
   355
	DL	last				# last node#
hh
parents:
diff changeset
   356
	DL	pid				# pid returned from wait
hh
parents:
diff changeset
   357
	DL	stat				# stat returned from wait
hh
parents:
diff changeset
   358
	DL	bad				# "some node BAD" exit indicator
hh
parents:
diff changeset
   359
	DL	catched				# count of returned node tasks
hh
parents:
diff changeset
   360
	DL	killed				# count of killed node tasks
hh
parents:
diff changeset
   361
	EPILOC
hh
parents:
diff changeset
   362
#-----------------------------------------------
hh
parents:
diff changeset
   363
	.global Constellation
hh
parents:
diff changeset
   364
Constellation:
hh
parents:
diff changeset
   365
	PROLOG
hh
parents:
diff changeset
   366
	lea	this(bp), b			# -->this Constellation
hh
parents:
diff changeset
   367
	mov	b, thisP(bp)			# save -->this Constellation
hh
parents:
diff changeset
   368
# set debid
hh
parents:
diff changeset
   369
	lea	Cn.debug(b), a			# -->Debug
hh
parents:
diff changeset
   370
	mov	a, deP(bp)			# save -->Debug locally
hh
parents:
diff changeset
   371
	mov	C.csP, c			# -->CS
hh
parents:
diff changeset
   372
	cmp	$Cn.ring, topo(bp)		# ring topology ?
hh
parents:
diff changeset
   373
	je	0f
hh
parents:
diff changeset
   374
	mov	C.mn(c), a			# num. of nodes
hh
parents:
diff changeset
   375
	mov	a, Cn.nodes(b)
hh
parents:
diff changeset
   376
	mov	C.mp0(c), a			# port # of fist node
hh
parents:
diff changeset
   377
	mov	a, Cn.first(b)
hh
parents:
diff changeset
   378
	movl	$Cn.mash, Cn.topo(b)
hh
parents:
diff changeset
   379
	push	$8f
hh
parents:
diff changeset
   380
	jmp	1f
hh
parents:
diff changeset
   381
0:	mov	C.rn(c), a			# num. of nodes
hh
parents:
diff changeset
   382
	mov	a, Cn.nodes(b)
hh
parents:
diff changeset
   383
	mov	C.rp0(c), a			# port # of fist node
hh
parents:
diff changeset
   384
	mov	a, Cn.first(b)
hh
parents:
diff changeset
   385
	movl	$Cn.ring, Cn.topo(b)
hh
parents:
diff changeset
   386
	push	$7f
hh
parents:
diff changeset
   387
1:	cmp	$0, ssl(bp)			# SSL ?
hh
parents:
diff changeset
   388
	jz	2f				# no
hh
parents:
diff changeset
   389
	movl	$1, Cn.ssl(b)
hh
parents:
diff changeset
   390
	addl	$500, Cn.first(b)		# first SSL port #
hh
parents:
diff changeset
   391
	push	$6f
hh
parents:
diff changeset
   392
	jmp	9f
hh
parents:
diff changeset
   393
2:	movl	$0, Cn.ssl(b)
hh
parents:
diff changeset
   394
	push	$5f
hh
parents:
diff changeset
   395
	jmp	9f
hh
parents:
diff changeset
   396
5:	.ascii	"non\0"
hh
parents:
diff changeset
   397
6:	.ascii	"\0"
hh
parents:
diff changeset
   398
7:	.ascii	"RING\0"
hh
parents:
diff changeset
   399
8:	.ascii	"MASH\0"
hh
parents:
diff changeset
   400
9:	DEBID	"%sSSL %s", 2
hh
parents:
diff changeset
   401
# check # of nodes
hh
parents:
diff changeset
   402
	movL	$0, bad(bp)
hh
parents:
diff changeset
   403
	cmp	$1, Cn.nodes(b)			# num of nodes
hh
parents:
diff changeset
   404
	jl	Cn.ret			# < 1 ? nothing to do
hh
parents:
diff changeset
   405
	jg	0f
hh
parents:
diff changeset
   406
	LOG	0, "1 node configuration not implemented yet"
hh
parents:
diff changeset
   407
	jmp	Cn.ret
hh
parents:
diff changeset
   408
0:	LOG	5, "initializing..."
hh
parents:
diff changeset
   409
# determine divisor for random next node choise
hh
parents:
diff changeset
   410
	mov     $1, a
hh
parents:
diff changeset
   411
        shl     $31, a
hh
parents:
diff changeset
   412
        not     a             			# MAX_INT
hh
parents:
diff changeset
   413
        xor     d, d
hh
parents:
diff changeset
   414
        divl    Cn.nodes(b)
hh
parents:
diff changeset
   415
        mov     a, Cn.div(b)			# save divisor (MAX_INT / nodes)
hh
parents:
diff changeset
   416
# allocate "forward" indicator shared by nodes in constellation
hh
parents:
diff changeset
   417
	push	$0
hh
parents:
diff changeset
   418
	push	$-1
hh
parents:
diff changeset
   419
	push	$0x21				# PROT_READ | PROT_WRITE
hh
parents:
diff changeset
   420
	push	$0x03				# MAP_SHARED | MAP_ANONYMOUS
hh
parents:
diff changeset
   421
	push	$4
hh
parents:
diff changeset
   422
	push	$0
hh
parents:
diff changeset
   423
#	call	mmap
hh
parents:
diff changeset
   424
#	cmp	$-1, a
hh
parents:
diff changeset
   425
#	jne	0f
hh
parents:
diff changeset
   426
#	SYSERR	"mmap"
hh
parents:
diff changeset
   427
#0:	mov	thisP(bp), b
hh
parents:
diff changeset
   428
	SYS	mmap
hh
parents:
diff changeset
   429
	mov	a, Cn.forwP(b)			# save -->forw
hh
parents:
diff changeset
   430
	movl	$1, (a)				# enable forwarding
hh
parents:
diff changeset
   431
	push	Cn.nodes(b)
hh
parents:
diff changeset
   432
	LOG	1, "%u nodes starting..."
hh
parents:
diff changeset
   433
# start processes for all nodes in constellation
hh
parents:
diff changeset
   434
	mov	Cn.first(b), d			# first node#
hh
parents:
diff changeset
   435
	mov	d, c
hh
parents:
diff changeset
   436
	add	Cn.nodes(b), c			# last node + 1
hh
parents:
diff changeset
   437
Cn.iterateOnFork:
hh
parents:
diff changeset
   438
	pusha
hh
parents:
diff changeset
   439
#	call	fork
hh
parents:
diff changeset
   440
	SYS	fork
hh
parents:
diff changeset
   441
	cmp	$0, a
hh
parents:
diff changeset
   442
	jnz	1f				# parent
hh
parents:
diff changeset
   443
	popa
hh
parents:
diff changeset
   444
	push	d				# node's port#
hh
parents:
diff changeset
   445
	push	b				# -->Cnstlln
hh
parents:
diff changeset
   446
	call	Node
hh
parents:
diff changeset
   447
1:	mov	a, pid(bp)
hh
parents:
diff changeset
   448
	popa
hh
parents:
diff changeset
   449
	push	pid(bp)				# nodes's pid
hh
parents:
diff changeset
   450
	push	d				# node's port#
hh
parents:
diff changeset
   451
	LOG	4, "node %u established in process %u", 2
hh
parents:
diff changeset
   452
	inc	d
hh
parents:
diff changeset
   453
	cmp	d, c				# last node ?
hh
parents:
diff changeset
   454
	jg	Cn.iterateOnFork		# no, continue forking
hh
parents:
diff changeset
   455
# wait for completion of node processes
hh
parents:
diff changeset
   456
	LOG	2, "all nodes established, waiting for them to terminate..."
hh
parents:
diff changeset
   457
	movl	$0, bad(bp)			# accumulated return status of node tasks
hh
parents:
diff changeset
   458
	movl	$0, killed(bp)			# num. of killed node tasks
hh
parents:
diff changeset
   459
	movl	$0, catched(bp)			# num. of returned node tasks
hh
parents:
diff changeset
   460
	lea	-12(sp), sp			# prepare space for loop
hh
parents:
diff changeset
   461
Cn.iterateOnWait:
hh
parents:
diff changeset
   462
	cmp	$0, bad(bp)			# constellation status still OK ?
hh
parents:
diff changeset
   463
	je	1f				# yes
hh
parents:
diff changeset
   464
	mov	Cn.forwP(b), a			# -->forwarding switch
hh
parents:
diff changeset
   465
	movl	$0, (a)				# disable forwarding between nodes
hh
parents:
diff changeset
   466
1:
hh
parents:
diff changeset
   467
	lea	stat(bp), c
hh
parents:
diff changeset
   468
	mov	c, (sp)				# -->return status of task
hh
parents:
diff changeset
   469
	call	wait
hh
parents:
diff changeset
   470
	mov	thisP(bp), b
hh
parents:
diff changeset
   471
	cmp	$-1, a				# normal return from wait?
hh
parents:
diff changeset
   472
	jne	0f				# yes
hh
parents:
diff changeset
   473
	call	__errno_location
hh
parents:
diff changeset
   474
	cmp	$10, (a)			# error == ECHILD ?
hh
parents:
diff changeset
   475
	je	Cn.allFinished			# yes, no subtasks
hh
parents:
diff changeset
   476
	SYSERR	"wait"
hh
parents:
diff changeset
   477
0:
hh
parents:
diff changeset
   478
	incl	catched(bp)
hh
parents:
diff changeset
   479
	mov	a, pid(bp)			# save subtask's pid
hh
parents:
diff changeset
   480
	mov	a, (sp)
hh
parents:
diff changeset
   481
	mov	stat(bp), c			# subtask return status
hh
parents:
diff changeset
   482
	mov	c, 4(sp)
hh
parents:
diff changeset
   483
	test	$0x7f, c			# subtask ended by exit ?
hh
parents:
diff changeset
   484
	jnz	2f				# no, killed
hh
parents:
diff changeset
   485
	and	$0xff00, c			# extract subtask rc
hh
parents:
diff changeset
   486
	jz	1f				# rc = 0
hh
parents:
diff changeset
   487
	movl	$1, bad(bp)			# non zero rc, turn on BAD switch
hh
parents:
diff changeset
   488
1:	shr	$8, c
hh
parents:
diff changeset
   489
	mov	c, 4(sp)			# rc
hh
parents:
diff changeset
   490
	mov	a, (sp)				# pid
hh
parents:
diff changeset
   491
	LOG	4, "node process %u ended by exit(%d)"
hh
parents:
diff changeset
   492
	jmp	Cn.iterateOnWait		# continue waiting for other subtasks
hh
parents:
diff changeset
   493
2:	movl	$1, bad(bp)			# subtask killed, turn on BAD switch
hh
parents:
diff changeset
   494
	incl	killed(bp)			# counter of killed
hh
parents:
diff changeset
   495
	mov	c, 4(sp)			# status
hh
parents:
diff changeset
   496
	mov	a, (sp)				# pid
hh
parents:
diff changeset
   497
	LOG	4, "node process %u killed, status=0x%x"
hh
parents:
diff changeset
   498
	jmp	Cn.iterateOnWait		# continue waiting for other subtasks
hh
parents:
diff changeset
   499
hh
parents:
diff changeset
   500
# opers of all nodes finished
hh
parents:
diff changeset
   501
Cn.allFinished:
hh
parents:
diff changeset
   502
	push	killed(bp)
hh
parents:
diff changeset
   503
	push	catched(bp)
hh
parents:
diff changeset
   504
	mov	thisP(bp), b
hh
parents:
diff changeset
   505
	push	Cn.nodes(b)
hh
parents:
diff changeset
   506
	cmp	$0, bad(bp)			# all nodes ended OK ?
hh
parents:
diff changeset
   507
	je	0f				# yes
hh
parents:
diff changeset
   508
	push	$7f
hh
parents:
diff changeset
   509
	jmp	9f
hh
parents:
diff changeset
   510
0:	push	$8f
hh
parents:
diff changeset
   511
	jmp	9f
hh
parents:
diff changeset
   512
7:	.ascii	"with ERROR\0"
hh
parents:
diff changeset
   513
8:	.ascii	"OK\0"
hh
parents:
diff changeset
   514
9:	LOG	1, "ENDED %s, %u spawned, %u catched, %u killed"
hh
parents:
diff changeset
   515
Cn.ret:
hh
parents:
diff changeset
   516
	push	bad(bp)
hh
parents:
diff changeset
   517
	call	exit
hh
parents:
diff changeset
   518
#-----------------------------------------------
hh
parents:
diff changeset
   519
#	G E T   I N T   V A L U E S   F R O M   E N V
hh
parents:
diff changeset
   520
#-----------------------------------------------
hh
parents:
diff changeset
   521
	ARGS
hh
parents:
diff changeset
   522
	DS	key				# -->env key string
hh
parents:
diff changeset
   523
# returns	int value or 0 if not found
hh
parents:
diff changeset
   524
	PROLOC
hh
parents:
diff changeset
   525
	EPILOC
hh
parents:
diff changeset
   526
#-----------------------------------------------
hh
parents:
diff changeset
   527
C.getArg:
hh
parents:
diff changeset
   528
	PROLOG
hh
parents:
diff changeset
   529
	pushl	key(bp)				# -->env key string
hh
parents:
diff changeset
   530
	call	getenv				# get value
hh
parents:
diff changeset
   531
	test	a, a
hh
parents:
diff changeset
   532
	jz	0f				# not found in ENV
hh
parents:
diff changeset
   533
	push	a
hh
parents:
diff changeset
   534
	call	atoi				# convert to int
hh
parents:
diff changeset
   535
0:
hh
parents:
diff changeset
   536
	EPILOG_R
hh
parents:
diff changeset
   537
#-----------------------------------------------
hh
parents:
diff changeset
   538
#	A B N O R M A L   E N D
hh
parents:
diff changeset
   539
#-----------------------------------------------
hh
parents:
diff changeset
   540
	ARGS
hh
parents:
diff changeset
   541
	DS	deP				# -->Debug
hh
parents:
diff changeset
   542
	PROLOC
hh
parents:
diff changeset
   543
	EPILOC
hh
parents:
diff changeset
   544
#-----------------------------------------------
hh
parents:
diff changeset
   545
	.globl	C.abend
hh
parents:
diff changeset
   546
C.abend:
hh
parents:
diff changeset
   547
	PROLOG
hh
parents:
diff changeset
   548
	LOG	0, "ABEND"
hh
parents:
diff changeset
   549
	push	$15				# SIGTERM
hh
parents:
diff changeset
   550
	push	$0				# kill all
hh
parents:
diff changeset
   551
#	call	kill
hh
parents:
diff changeset
   552
	SYS	kill
hh
parents:
diff changeset
   553
	push	$1
hh
parents:
diff changeset
   554
	call	exit
hh
parents:
diff changeset
   555
#-----------------------------------------------
hh
parents:
diff changeset
   556
	.end