CSa32/Constellation.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
#	 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
     4
#-----------------------------------------------
hh
parents:
diff changeset
     5
	ARGS
hh
parents:
diff changeset
     6
	DS	ssl				# ssl switch
hh
parents:
diff changeset
     7
	DS	topo				# topology
hh
parents:
diff changeset
     8
# returns:	nothing
hh
parents:
diff changeset
     9
	PROLOC
hh
parents:
diff changeset
    10
	DL	this, ConstellationL		# this Constellation instance
hh
parents:
diff changeset
    11
	DL	thisP				# -->this Constellation
hh
parents:
diff changeset
    12
	DL	deP				# -->Debug
hh
parents:
diff changeset
    13
	DL	len
hh
parents:
diff changeset
    14
	DL	pid
hh
parents:
diff changeset
    15
	DL	stat
hh
parents:
diff changeset
    16
	DL	bad				# "some node BAD" exit indicator
hh
parents:
diff changeset
    17
	EPILOC
hh
parents:
diff changeset
    18
#-----------------------------------------------
hh
parents:
diff changeset
    19
	.global Constellation
hh
parents:
diff changeset
    20
Constellation:
hh
parents:
diff changeset
    21
	PROLOG
hh
parents:
diff changeset
    22
	lea	this(bp), b			# -->this Constellation
hh
parents:
diff changeset
    23
	mov	b, thisP(bp)			# save -->this Constellation
hh
parents:
diff changeset
    24
#	lea	this, b				# -->this inst
hh
parents:
diff changeset
    25
# set debid
hh
parents:
diff changeset
    26
	lea	Cn.debug(b), a			# -->Debug
hh
parents:
diff changeset
    27
	mov	a, deP(bp)			# save -->Debug locally
hh
parents:
diff changeset
    28
	mov	C.csP, c			# -->CS
hh
parents:
diff changeset
    29
	cmp	$Cn.ring, topo(bp)		# ring topology ?
hh
parents:
diff changeset
    30
	je	0f
hh
parents:
diff changeset
    31
	mov	C.mn(c), a			# num. of nodes
hh
parents:
diff changeset
    32
	mov	a, Cn.nodes(b)
hh
parents:
diff changeset
    33
	mov	C.mp0(c), a			# port # of fist node
hh
parents:
diff changeset
    34
	mov	a, Cn.first(b)
hh
parents:
diff changeset
    35
	movl	$Cn.mash, Cn.topo(b)
hh
parents:
diff changeset
    36
	push	$8f
hh
parents:
diff changeset
    37
	jmp	1f
hh
parents:
diff changeset
    38
0:	mov	C.rn(c), a			# num. of nodes
hh
parents:
diff changeset
    39
	mov	a, Cn.nodes(b)
hh
parents:
diff changeset
    40
	mov	C.rp0(c), a			# port # of fist node
hh
parents:
diff changeset
    41
	mov	a, Cn.first(b)
hh
parents:
diff changeset
    42
	movl	$Cn.ring, Cn.topo(b)
hh
parents:
diff changeset
    43
	push	$7f
hh
parents:
diff changeset
    44
1:	cmp	$0, ssl(bp)			# SSL ?
hh
parents:
diff changeset
    45
	jz	2f				# no
hh
parents:
diff changeset
    46
	movl	$1, Cn.ssl(b)
hh
parents:
diff changeset
    47
	addl	$500, Cn.first(b)		# first SSL port #
hh
parents:
diff changeset
    48
	push	$6f
hh
parents:
diff changeset
    49
	jmp	9f
hh
parents:
diff changeset
    50
2:	movl	$0, Cn.ssl(b)
hh
parents:
diff changeset
    51
	push	$5f
hh
parents:
diff changeset
    52
	jmp	9f
hh
parents:
diff changeset
    53
5:	.ascii	"non\0"
hh
parents:
diff changeset
    54
6:	.ascii	"\0"
hh
parents:
diff changeset
    55
7:	.ascii	"RING\0"
hh
parents:
diff changeset
    56
8:	.ascii	"MASH\0"
hh
parents:
diff changeset
    57
9:	DEBID	"%sSSL %s", 2
hh
parents:
diff changeset
    58
# check # of nodes
hh
parents:
diff changeset
    59
	movL	$0, bad(bp)
hh
parents:
diff changeset
    60
	cmp	$1, Cn.nodes(b)			# num of nodes
hh
parents:
diff changeset
    61
	jl	ConstellationR			# < 1 ? nothing to do
hh
parents:
diff changeset
    62
	jg	0f
hh
parents:
diff changeset
    63
	LOG	0, "1 node configuration not implemented yet"
hh
parents:
diff changeset
    64
	jmp	ConstellationR
hh
parents:
diff changeset
    65
0:	LOG	5, "initializing..."
hh
parents:
diff changeset
    66
# determine divisor for random next node choise
hh
parents:
diff changeset
    67
	mov     $1, a
hh
parents:
diff changeset
    68
        shl     $31, a
hh
parents:
diff changeset
    69
        not     a             			# MAX_INT
hh
parents:
diff changeset
    70
        xor     d, d
hh
parents:
diff changeset
    71
        divl    Cn.nodes(b)
hh
parents:
diff changeset
    72
        mov     a, Cn.div(b)			# save divisor (MAX_INT / nodes)
hh
parents:
diff changeset
    73
# allocate "forward" indicator shared by nodes in constellation
hh
parents:
diff changeset
    74
	push	$0
hh
parents:
diff changeset
    75
	push	$-1
hh
parents:
diff changeset
    76
	push	$0x21				# PROT_READ | PROT_WRITE
hh
parents:
diff changeset
    77
	push	$0x03				# MAP_SHARED | MAP_ANONYMOUS
hh
parents:
diff changeset
    78
	push	$4
hh
parents:
diff changeset
    79
	push	$0
hh
parents:
diff changeset
    80
	call	mmap
hh
parents:
diff changeset
    81
	cmp	$-1, a
hh
parents:
diff changeset
    82
	jne	0f
hh
parents:
diff changeset
    83
	SYSERR	"mmap"
hh
parents:
diff changeset
    84
0:	mov	thisP(bp), b
hh
parents:
diff changeset
    85
	mov	a, Cn.forwP(b)			# save -->forw
hh
parents:
diff changeset
    86
	movl	$1, (a)				# enable forwarding
hh
parents:
diff changeset
    87
	mov	C.csP, c			# -->CS
hh
parents:
diff changeset
    88
	push	C.ttl(c)
hh
parents:
diff changeset
    89
	push	Cn.nodes(b)
hh
parents:
diff changeset
    90
	LOG	1, "%d node(s), ttl=%d starting..."
hh
parents:
diff changeset
    91
# start processes for all nodes in constellation
hh
parents:
diff changeset
    92
	mov	Cn.first(b), d			# first node#
hh
parents:
diff changeset
    93
	mov	d, c
hh
parents:
diff changeset
    94
	add	Cn.nodes(b), c			# last node + 1
hh
parents:
diff changeset
    95
0:	pusha
hh
parents:
diff changeset
    96
	call	fork
hh
parents:
diff changeset
    97
	cmp	$0, a
hh
parents:
diff changeset
    98
	jnz	1f				# parent
hh
parents:
diff changeset
    99
	popa
hh
parents:
diff changeset
   100
	push	d				# node's port#
hh
parents:
diff changeset
   101
	push	b				# -->Cnstlln
hh
parents:
diff changeset
   102
	call	Node
hh
parents:
diff changeset
   103
1:	mov	a, pid(bp)
hh
parents:
diff changeset
   104
	popa
hh
parents:
diff changeset
   105
	push	pid(bp)				# nodes's pid
hh
parents:
diff changeset
   106
	push	d				# node's port#
hh
parents:
diff changeset
   107
	LOG	3, "node %u established in process %u", 2
hh
parents:
diff changeset
   108
	inc	d
hh
parents:
diff changeset
   109
	cmp	d, c				# last node ?
hh
parents:
diff changeset
   110
	jg	0b				# no, continue forking
hh
parents:
diff changeset
   111
# wait for completion of node processes
hh
parents:
diff changeset
   112
	LOG	5, "all nodes established, waiting for them to terminate..."
hh
parents:
diff changeset
   113
	movl	$0, bad(bp)
hh
parents:
diff changeset
   114
0:	lea	stat(bp), a
hh
parents:
diff changeset
   115
	cmp	$0, bad(bp)			# status still OK ?
hh
parents:
diff changeset
   116
	je	1f				# yes
hh
parents:
diff changeset
   117
	mov	Cn.forwP(b), a			# -->forward switch
hh
parents:
diff changeset
   118
	movl	$0, (a)				# disable forwarding
hh
parents:
diff changeset
   119
1:	mov	a, (sp)				# -->return status of task
hh
parents:
diff changeset
   120
	call	wait
hh
parents:
diff changeset
   121
	mov	thisP(bp), b
hh
parents:
diff changeset
   122
	cmp	$0, a				# normal return from wait?
hh
parents:
diff changeset
   123
	jl	3f				# no, all subtasks finshed
hh
parents:
diff changeset
   124
	mov	a, pid(bp)			# save subtask's pid
hh
parents:
diff changeset
   125
	mov	stat(bp), a
hh
parents:
diff changeset
   126
	test	$0x7f, a			# subtask ended by exit ?
hh
parents:
diff changeset
   127
	jnz	2f				# no, killed
hh
parents:
diff changeset
   128
	and	$0xff00, a			# extract subtask rc
hh
parents:
diff changeset
   129
	jz	1f				# rc = 0
hh
parents:
diff changeset
   130
	movl	$1, bad(bp)			# non zero rc, turn on BAD switch
hh
parents:
diff changeset
   131
1:	push	a				# rc
hh
parents:
diff changeset
   132
	push	pid(bp)				# pid
hh
parents:
diff changeset
   133
	LOG	4, "node process %u ended with exit(%d)"
hh
parents:
diff changeset
   134
	jmp	0b				# continue waiting for other subtasks
hh
parents:
diff changeset
   135
2:	movl	$1, bad(bp)			# subtask killed, turn on BAD switch
hh
parents:
diff changeset
   136
	push	pid(bp)
hh
parents:
diff changeset
   137
	LOG	4, "node process %u killed"
hh
parents:
diff changeset
   138
	jmp	0b				# continue waiting for other subtasks
hh
parents:
diff changeset
   139
hh
parents:
diff changeset
   140
# opers of all nodes finished
hh
parents:
diff changeset
   141
3:	cmp	$0, bad(bp)			# all nodes ended OK ?
hh
parents:
diff changeset
   142
	je	0f				# yes
hh
parents:
diff changeset
   143
	push	$7f
hh
parents:
diff changeset
   144
	jmp	9f
hh
parents:
diff changeset
   145
0:	push	$8f
hh
parents:
diff changeset
   146
	jmp	9f
hh
parents:
diff changeset
   147
7:	.ascii	"with ERROR\0"
hh
parents:
diff changeset
   148
8:	.ascii	"OK\0"
hh
parents:
diff changeset
   149
9:	LOG	1, "ENDED %s"
hh
parents:
diff changeset
   150
ConstellationR:
hh
parents:
diff changeset
   151
	push	bad(bp)
hh
parents:
diff changeset
   152
	call	exit
hh
parents:
diff changeset
   153
#-----------------------------------------------
hh
parents:
diff changeset
   154
	.end
hh
parents:
diff changeset
   155