CSa32/Debug.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
#	A B S T R A C T  S T R U C T U R E S
hh
parents:
diff changeset
     4
#-----------------------------------------------
hh
parents:
diff changeset
     5
#-----------------------------------------------
hh
parents:
diff changeset
     6
#	S T A T I C   V A R I A B L E S
hh
parents:
diff changeset
     7
#-----------------------------------------------
hh
parents:
diff changeset
     8
	.data
hh
parents:
diff changeset
     9
D.t0:	.int	0				# initial timestamp in usecs
hh
parents:
diff changeset
    10
D.semP:	.int	0				# -->semaphore for debug output
hh
parents:
diff changeset
    11
	.globl	D.prgNameP
hh
parents:
diff changeset
    12
D.prgNameP:
hh
parents:
diff changeset
    13
	.int	0				# -->prog name
hh
parents:
diff changeset
    14
#-----------------------------------------------
hh
parents:
diff changeset
    15
#	D E B U G   I N I T
hh
parents:
diff changeset
    16
#-----------------------------------------------
hh
parents:
diff changeset
    17
# initialize static debug vars
hh
parents:
diff changeset
    18
	ARGS
hh
parents:
diff changeset
    19
 	DS	prgP				# -->program name
hh
parents:
diff changeset
    20
# returns:	nothing
hh
parents:
diff changeset
    21
	PROLOC
hh
parents:
diff changeset
    22
	EPILOC
hh
parents:
diff changeset
    23
#-----------------------------------------------
hh
parents:
diff changeset
    24
	.text
hh
parents:
diff changeset
    25
	.global D.init
hh
parents:
diff changeset
    26
D.init:
hh
parents:
diff changeset
    27
	PROLOG
hh
parents:
diff changeset
    28
	push	prgP(bp)
hh
parents:
diff changeset
    29
	call	strlen
hh
parents:
diff changeset
    30
	inc	a
hh
parents:
diff changeset
    31
	push	a
hh
parents:
diff changeset
    32
	call	malloc
hh
parents:
diff changeset
    33
	mov	a, D.prgNameP			# save -->prog name for debugging
hh
parents:
diff changeset
    34
	push	prgP(bp)
hh
parents:
diff changeset
    35
	push	a
hh
parents:
diff changeset
    36
	call	strcpy
hh
parents:
diff changeset
    37
	movl	$0, D.t0
hh
parents:
diff changeset
    38
	call	D.getTs				# get actual time - t0 = actual time
hh
parents:
diff changeset
    39
	mov	a, D.t0				# set t0 to actual time
hh
parents:
diff changeset
    40
hh
parents:
diff changeset
    41
	jmp	3f
hh
parents:
diff changeset
    42
	push	$0
hh
parents:
diff changeset
    43
	push	$t
hh
parents:
diff changeset
    44
	call	gettimeofday			# get initial timestamp t0
hh
parents:
diff changeset
    45
	cmp	$0, a
hh
parents:
diff changeset
    46
	jz	0f
hh
parents:
diff changeset
    47
	ERR	"gettimeofday"
hh
parents:
diff changeset
    48
0:	lea	t, b				# compute (1000000*secs+usecs)
hh
parents:
diff changeset
    49
	mov	secs(b), c
hh
parents:
diff changeset
    50
	mov	$1000000, a
hh
parents:
diff changeset
    51
	mul	c				# 1000000*secs
hh
parents:
diff changeset
    52
	add	usecs(b), a			# 1000000*secs+usecs
hh
parents:
diff changeset
    53
	movl	a, D.t0				# save low 32 bits of timestamp in t0
hh
parents:
diff changeset
    54
3:
hh
parents:
diff changeset
    55
	push	$0				# allocate semaphore for debug output
hh
parents:
diff changeset
    56
	push	$-1
hh
parents:
diff changeset
    57
	push	$0x21				# PROT_READ | PROT_WRITE
hh
parents:
diff changeset
    58
	push	$0x03				# MAP_SHARED | MAP_ANONYMOUS
hh
parents:
diff changeset
    59
	push	$16				# semaphore size
hh
parents:
diff changeset
    60
	push	$0
hh
parents:
diff changeset
    61
	call	mmap				# get shared storage for semaphore
hh
parents:
diff changeset
    62
	cmp	$-1, a
hh
parents:
diff changeset
    63
	jne	0f
hh
parents:
diff changeset
    64
	ERR	"mmap"
hh
parents:
diff changeset
    65
0:	mov	a, D.semP			# save -->semaphore
hh
parents:
diff changeset
    66
hh
parents:
diff changeset
    67
	push	$1				# initial semaphore value
hh
parents:
diff changeset
    68
	push	$1				# semaphore shared between processes
hh
parents:
diff changeset
    69
	pushl	D.semP
hh
parents:
diff changeset
    70
	call	sem_init			# initialize semaphore
hh
parents:
diff changeset
    71
	cmp	$0, a
hh
parents:
diff changeset
    72
	jz	0f
hh
parents:
diff changeset
    73
	ERR	"sem_init of debug semaphore"
hh
parents:
diff changeset
    74
0:
hh
parents:
diff changeset
    75
	EPILOG
hh
parents:
diff changeset
    76
#-----------------------------------------------
hh
parents:
diff changeset
    77
#	S E T   D E B U G   I D
hh
parents:
diff changeset
    78
#-----------------------------------------------
hh
parents:
diff changeset
    79
# sets debug ID according to format
hh
parents:
diff changeset
    80
	ARGS
hh
parents:
diff changeset
    81
 	DS	deP 				# -->Debug instance
hh
parents:
diff changeset
    82
	DS	argc				# # of values to be put into deb ID
hh
parents:
diff changeset
    83
	DS	formP				# -->format
hh
parents:
diff changeset
    84
#	...					# values
hh
parents:
diff changeset
    85
# returns:	nothing
hh
parents:
diff changeset
    86
	PROLOC
hh
parents:
diff changeset
    87
	EPILOC
hh
parents:
diff changeset
    88
#-----------------------------------------------
hh
parents:
diff changeset
    89
	.global D.setId
hh
parents:
diff changeset
    90
D.setId:
hh
parents:
diff changeset
    91
	PROLOG
hh
parents:
diff changeset
    92
# format debug ID
hh
parents:
diff changeset
    93
	mov	argc(bp), c			# no. of values
hh
parents:
diff changeset
    94
0:	mov	formP(bp,c,4), a		# push values and format
hh
parents:
diff changeset
    95
	push	a
hh
parents:
diff changeset
    96
	dec	c
hh
parents:
diff changeset
    97
	jns	0b				# iterate on values
hh
parents:
diff changeset
    98
	pushl	$D.idL				# max deb ID len
hh
parents:
diff changeset
    99
	mov	deP(bp), b			# -->Debug instance
hh
parents:
diff changeset
   100
	lea	D.id(b), a			# -->DebId
hh
parents:
diff changeset
   101
	push	a
hh
parents:
diff changeset
   102
	call	snprintf			# construct DebId
hh
parents:
diff changeset
   103
	cmp	$0, a
hh
parents:
diff changeset
   104
	jnl	0f
hh
parents:
diff changeset
   105
	ERR	"DEBID snprintf"
hh
parents:
diff changeset
   106
0:
hh
parents:
diff changeset
   107
	LOG	6, "debid '%s' set", 1
hh
parents:
diff changeset
   108
	EPILOG
hh
parents:
diff changeset
   109
#-----------------------------------------------
hh
parents:
diff changeset
   110
#	P R I N T   D E B U G   M S G
hh
parents:
diff changeset
   111
#-----------------------------------------------
hh
parents:
diff changeset
   112
# outputs to stderr the synchronized debug msg with time diff from program start
hh
parents:
diff changeset
   113
# 	on appripriate debug level, flushes stderr
hh
parents:
diff changeset
   114
	ARGS
hh
parents:
diff changeset
   115
	ac = 40
hh
parents:
diff changeset
   116
 	DS	deP 				# -->Debug instance
hh
parents:
diff changeset
   117
 	DS	level				# msg debug level
hh
parents:
diff changeset
   118
	DS	argc				# # of values to be used in msg
hh
parents:
diff changeset
   119
	DS	form				# -->format
hh
parents:
diff changeset
   120
#	...					# values
hh
parents:
diff changeset
   121
# returns:	nothing
hh
parents:
diff changeset
   122
	PROLOC
hh
parents:
diff changeset
   123
	ac = 0
hh
parents:
diff changeset
   124
	EPILOC
hh
parents:
diff changeset
   125
#-----------------------------------------------
hh
parents:
diff changeset
   126
	.global D.log
hh
parents:
diff changeset
   127
D.log:
hh
parents:
diff changeset
   128
	PROLOG
hh
parents:
diff changeset
   129
hh
parents:
diff changeset
   130
	mov	C.csP, c
hh
parents:
diff changeset
   131
	mov	level(bp), a			# msg debug level
hh
parents:
diff changeset
   132
	cmp	C.debMaxLev(c), a		# max debug level >= msg debug level ?
hh
parents:
diff changeset
   133
	jg	3f				# nothing to print, leave
hh
parents:
diff changeset
   134
	cmp	$7, C.debMaxLev(c)		# on max debug level = 7 print level 7 only
hh
parents:
diff changeset
   135
	jne	0f
hh
parents:
diff changeset
   136
	cmp	$7, a				# msg debug level = 7 ?
hh
parents:
diff changeset
   137
	jne	3f
hh
parents:
diff changeset
   138
# prepare output string of msg
hh
parents:
diff changeset
   139
0:	mov	argc(bp), c			# no. of values
hh
parents:
diff changeset
   140
0:	mov	form(bp,c,4), a			# copy values and format
hh
parents:
diff changeset
   141
	push	a
hh
parents:
diff changeset
   142
	dec	c
hh
parents:
diff changeset
   143
	jns	0b
hh
parents:
diff changeset
   144
	push	$D.msgL				# msg buffer len
hh
parents:
diff changeset
   145
	mov	deP(bp), b			# -->Debug instance
hh
parents:
diff changeset
   146
	lea	D.msg(b), a			# -->msg buffer
hh
parents:
diff changeset
   147
	push	a
hh
parents:
diff changeset
   148
	call	snprintf			# construct msg in buffer
hh
parents:
diff changeset
   149
	cmp	$0, a
hh
parents:
diff changeset
   150
	jnl	0f
hh
parents:
diff changeset
   151
	ERR	"LOG snprintf"
hh
parents:
diff changeset
   152
# synchronize with other tasks
hh
parents:
diff changeset
   153
0:	pushl	D.semP
hh
parents:
diff changeset
   154
	call	sem_wait			# synchronize
hh
parents:
diff changeset
   155
	cmp	$0, a
hh
parents:
diff changeset
   156
	jz	0f
hh
parents:
diff changeset
   157
	ERR	"LOG sem_wait"
hh
parents:
diff changeset
   158
# get timestamp
hh
parents:
diff changeset
   159
0:	call	D.getTs				# time from beg of program in usecs
hh
parents:
diff changeset
   160
# print debug msg
hh
parents:
diff changeset
   161
	mov	deP(bp), b			# -->Debug instance
hh
parents:
diff changeset
   162
	lea	D.msg(b), c			# -->msg text
hh
parents:
diff changeset
   163
	push	c
hh
parents:
diff changeset
   164
	lea	D.id(b), c			# -->instance debug ID
hh
parents:
diff changeset
   165
	push	c
hh
parents:
diff changeset
   166
	push	a				# tdiff in usecs
hh
parents:
diff changeset
   167
	push	$1f
hh
parents:
diff changeset
   168
	push	stderr
hh
parents:
diff changeset
   169
	call	fprintf
hh
parents:
diff changeset
   170
	jmp	2f
hh
parents:
diff changeset
   171
1:	.ascii	"%09u %s: %s\n\0"
hh
parents:
diff changeset
   172
# flush stderr
hh
parents:
diff changeset
   173
2:	push	stderr
hh
parents:
diff changeset
   174
	call	fflush				# flush stderr
hh
parents:
diff changeset
   175
# free semaphore
hh
parents:
diff changeset
   176
	pushl	D.semP
hh
parents:
diff changeset
   177
	call	sem_post			# free semaphore
hh
parents:
diff changeset
   178
	cmp	$0, a
hh
parents:
diff changeset
   179
	jz	3f
hh
parents:
diff changeset
   180
	ERR	"LOG sem_post"
hh
parents:
diff changeset
   181
3:
hh
parents:
diff changeset
   182
	EPILOG
hh
parents:
diff changeset
   183
#-----------------------------------------------
hh
parents:
diff changeset
   184
#	G E T   T I M E S T A M P   I N   U S E C S
hh
parents:
diff changeset
   185
#-----------------------------------------------
hh
parents:
diff changeset
   186
# returns timestamp in usecs from beg of program
hh
parents:
diff changeset
   187
# returns:	int value
hh
parents:
diff changeset
   188
	PROLOC
hh
parents:
diff changeset
   189
	DL	t, timevalL			# timestamp buffer
hh
parents:
diff changeset
   190
	EPILOC
hh
parents:
diff changeset
   191
#-----------------------------------------------
hh
parents:
diff changeset
   192
	.global D.getTs
hh
parents:
diff changeset
   193
D.getTs:
hh
parents:
diff changeset
   194
	PROLOG
hh
parents:
diff changeset
   195
	push	$0
hh
parents:
diff changeset
   196
	lea	t(bp), b			# -->timeval buffer
hh
parents:
diff changeset
   197
	push	b
hh
parents:
diff changeset
   198
	call	gettimeofday
hh
parents:
diff changeset
   199
# compute time delta from program start = t-t0 in usecs
hh
parents:
diff changeset
   200
# tdiff = (1000000*ts.secs+ts.usecs)-t0
hh
parents:
diff changeset
   201
	lea	t(bp), b			# actual timestamp
hh
parents:
diff changeset
   202
	mov	secs(b), c			# t.secs
hh
parents:
diff changeset
   203
	mov	$1000000, a
hh
parents:
diff changeset
   204
	mul	c				# 1000000*t.secs
hh
parents:
diff changeset
   205
	add	usecs(b), a			# 1000000*t.secs+t.usecs
hh
parents:
diff changeset
   206
	sub	D.t0, a				# 1000000*t.secs+t.usecs-t0
hh
parents:
diff changeset
   207
	EPILOG_R
hh
parents:
diff changeset
   208
#-----------------------------------------------
hh
parents:
diff changeset
   209
#	S U B R O U T I N E S   L I S T
hh
parents:
diff changeset
   210
#-----------------------------------------------
hh
parents:
diff changeset
   211
# print subroutines names and addresses
hh
parents:
diff changeset
   212
# localize address from env ADDR= in subroutine
hh
parents:
diff changeset
   213
	PROLOC
hh
parents:
diff changeset
   214
	DL	wAddr				# wanted addr
hh
parents:
diff changeset
   215
	EPILOC
hh
parents:
diff changeset
   216
#-----------------------------------------------
hh
parents:
diff changeset
   217
	.global	 D.subr
hh
parents:
diff changeset
   218
D.subr:
hh
parents:
diff changeset
   219
	PROLOG
hh
parents:
diff changeset
   220
	movl	$0, wAddr(bp)
hh
parents:
diff changeset
   221
	pushl	$0f
hh
parents:
diff changeset
   222
	call	getenv				# get env ADDR
hh
parents:
diff changeset
   223
	lea	4(sp), sp
hh
parents:
diff changeset
   224
	jmp	1f
hh
parents:
diff changeset
   225
0:	.ascii "ADDR\0"
hh
parents:
diff changeset
   226
1:	cmp	$0, a
hh
parents:
diff changeset
   227
	jz	0f				# no addr wanted
hh
parents:
diff changeset
   228
	pushl	$16
hh
parents:
diff changeset
   229
	pushl	$0
hh
parents:
diff changeset
   230
	push	a
hh
parents:
diff changeset
   231
	call	strtol				# convert str to hex
hh
parents:
diff changeset
   232
	lea	12(sp), sp
hh
parents:
diff changeset
   233
	mov	a, wAddr(bp)			# searched addr
hh
parents:
diff changeset
   234
0:
hh
parents:
diff changeset
   235
	pushl	$0				# end of list
hh
parents:
diff changeset
   236
	SUBRLIST				# print and push list of subroutines
hh
parents:
diff changeset
   237
	cmp	$0, wAddr(bp)			# address wanted ?
hh
parents:
diff changeset
   238
	je	D.subrR
hh
parents:
diff changeset
   239
	mov	wAddr(bp), d
hh
parents:
diff changeset
   240
	mov	sp, b				# -->beg of subr list
hh
parents:
diff changeset
   241
	xor	a, a
hh
parents:
diff changeset
   242
	jmp	1f
hh
parents:
diff changeset
   243
0:	lea	8(b), b
hh
parents:
diff changeset
   244
1:	cmpl	$0, (b)				# end of list ?
hh
parents:
diff changeset
   245
	je	2f				# yes
hh
parents:
diff changeset
   246
	cmp	4(b), d				# -->subr > wanted addr ?
hh
parents:
diff changeset
   247
	jb	0b				# yes, next
hh
parents:
diff changeset
   248
	cmp	4(b), a				# -->subr > last found ?
hh
parents:
diff changeset
   249
	jnb	0b				# no, next
hh
parents:
diff changeset
   250
	mov	(b), c				# get subr name
hh
parents:
diff changeset
   251
	mov	4(b), a				# get subr addr
hh
parents:
diff changeset
   252
	jmp	0b				# next
hh
parents:
diff changeset
   253
2:	test	a, a
hh
parents:
diff changeset
   254
	jnz	1f
hh
parents:
diff changeset
   255
	push	d
hh
parents:
diff changeset
   256
	push	$0f
hh
parents:
diff changeset
   257
	push	stderr
hh
parents:
diff changeset
   258
	call	fprintf
hh
parents:
diff changeset
   259
	jmp	D.subrR
hh
parents:
diff changeset
   260
0:	.ascii	"addr %p not found in subroutines\n\0"
hh
parents:
diff changeset
   261
1:	sub	a, d
hh
parents:
diff changeset
   262
	push	d				# offset in subr
hh
parents:
diff changeset
   263
	push	c				# subroutine name
hh
parents:
diff changeset
   264
	pushl	wAddr(bp)			# wanted addr
hh
parents:
diff changeset
   265
	push	$0f
hh
parents:
diff changeset
   266
	push	stderr
hh
parents:
diff changeset
   267
	call	fprintf
hh
parents:
diff changeset
   268
	jmp	D.subrR
hh
parents:
diff changeset
   269
0:	.ascii	"searched addr %p in subroutine %s at offset %x\n\0"
hh
parents:
diff changeset
   270
D.subrR:
hh
parents:
diff changeset
   271
	EPILOG
hh
parents:
diff changeset
   272
#-----------------------------------------------
hh
parents:
diff changeset
   273
	.end