[BUG FOUND] in select-case of server side interfaces

Technical questions regarding the XTC tools and programming with XMOS.
sprajagopal
Member++
Posts: 18
Joined: Thu Jul 23, 2015 4:22 pm

[BUG FOUND] in select-case of server side interfaces

Post by sprajagopal »

Hi all,
I am using a select-case of this form:
TOOLS VERSION: 14.2.1
XS2-L1 chips.

Code: Select all

while(1){
   select{
     case server_interface_if[int i].func():
         // processing
     break;
    }
}
I get a ET_LOAD_STORE memory access exception. I did a 'info reg' in xgdb:

Code: Select all

r0             0x8	8
r1             0xf002a80	251669120
r2             0xfe	254
r3             0x84	132
r4             0x1f3b0	127920
r5             0x0	0
r6             0x80061802	-2147084286
r7             0x8	8
r8             0x1d470	119920
r9             0x0	0
r10            0x1ff08	130824
r11            0x5	5
cp             0x15850	88144
dp             0x15f24	89892
sp             0x1d3f0	119792
lr             0x10084	65668	 _InitChildThread + 0
pc             0x1201a	73754	 _Smuart_master_0 + 406
sr             0x10	16
spc            0x1201a	73754	 _Smuart_master_0 + 406
ssr            0x0	0
et             0x5	5
ed             0xf002a80	251669120
sed            0x10005	65541
kep            0x10080	65664
ksp            0x12d78	77176
The crash is at spc, 0x1201a.
I did a dissassembly inside xgdb.

Code: Select all

0x00011e84 <muart_master+0>:	entsp (lu6)     0x680
0x00011e88 <muart_master+4>:	stw (lru6)      r4, sp[0x67f]
0x00011e8c <muart_master+8>:	stw (lru6)      r5, sp[0x67e]
0x00011e90 <muart_master+12>:	stw (lru6)      r6, sp[0x67d]
0x00011e94 <muart_master+16>:	stw (lru6)      r7, sp[0x67c]
0x00011e98 <muart_master+20>:	stw (lru6)      r8, sp[0x67b]
0x00011e9c <muart_master+24>:	stw (lru6)      r9, sp[0x67a]
0x00011ea0 <muart_master+28>:	stw (lru6)      r10, sp[0x679]
0x00011ea4 <muart_master+32>:	add (2rus)      r4, r2, 0x0
0x00011ea6 <muart_master+34>:	add (2rus)      r10, r1, 0x0
0x00011ea8 <muart_master+36>:	stw (ru6)       r10, sp[0x6]
0x00011eaa <muart_master+38>:	add (2rus)      r6, r0, 0x0
0x00011eac <muart_master+40>:	ldw (2rus)      r0, r10[0x0]
0x00011eae <muart_master+42>:	add (2rus)      r1, r6, 0x0
0x00011eb0 <muart_master+44>:	bl (lu10)       -0x134
0x00011eb4 <muart_master+48>:	ldaw (ru6)      r0, sp[0x38]
0x00011eb6 <muart_master+50>:	ldc (ru6)       r5, 0x0
0x00011eb8 <muart_master+52>:	ldc (lru6)      r2, 0x1900
0x00011ebc <muart_master+56>:	add (2rus)      r1, r5, 0x0
0x00011ebe <muart_master+58>:	bl (lu10)       0x75d
0x00011ec2 <muart_master+62>:	ldaw (ru6)      r0, sp[0x30]
0x00011ec4 <muart_master+64>:	ldc (ru6)       r9, 0x20
0x00011ec6 <muart_master+66>:	add (2rus)      r1, r5, 0x0
0x00011ec8 <muart_master+68>:	add (2rus)      r2, r9, 0x0
0x00011eca <muart_master+70>:	bl (lu10)       0x757
0x00011ece <muart_master+74>:	ldaw (ru6)      r0, sp[0x28]
0x00011ed0 <muart_master+76>:	add (2rus)      r1, r5, 0x0
0x00011ed2 <muart_master+78>:	add (2rus)      r2, r9, 0x0
0x00011ed4 <muart_master+80>:	bl (lu10)       0x752
0x00011ed8 <muart_master+84>:	ldaw (ru6)      r8, sp[0x20]
0x00011eda <muart_master+86>:	add (2rus)      r0, r8, 0x0
0x00011edc <muart_master+88>:	add (2rus)      r1, r5, 0x0
0x00011ede <muart_master+90>:	add (2rus)      r2, r9, 0x0
0x00011ee0 <muart_master+92>:	bl (lu10)       0x74c
0x00011ee4 <muart_master+96>:	ldaw (ru6)      r0, sp[0x18]
0x00011ee6 <muart_master+98>:	add (2rus)      r1, r5, 0x0
0x00011ee8 <muart_master+100>:	add (2rus)      r2, r9, 0x0
0x00011eea <muart_master+102>:	bl (lu10)       0x747
0x00011eee <muart_master+106>:	ldaw (ru6)      r0, sp[0x10]
0x00011ef0 <muart_master+108>:	add (2rus)      r1, r5, 0x0
0x00011ef2 <muart_master+110>:	add (2rus)      r2, r9, 0x0
0x00011ef4 <muart_master+112>:	bl (lu10)       0x742
0x00011ef8 <muart_master+116>:	ldaw (ru6)      r0, sp[0x8]
0x00011efa <muart_master+118>:	add (2rus)      r1, r5, 0x0
0x00011efc <muart_master+120>:	add (2rus)      r2, r9, 0x0
0x00011efe <muart_master+122>:	bl (lu10)       0x73d
0x00011f02 <muart_master+126>:	stw (ru6)       r5, sp[0x20]
0x00011f04 <muart_master+128>:	ldc (lru6)      r0, 0xc8
0x00011f08 <muart_master+132>:	stw (ru6)       r0, sp[0x21]
0x00011f0a <muart_master+134>:	ldc (lru6)      r0, 0x190
0x00011f0e <muart_master+138>:	stw (ru6)       r0, sp[0x22]
0x00011f10 <muart_master+140>:	ldc (lru6)      r0, 0x258
0x00011f14 <muart_master+144>:	stw (ru6)       r0, sp[0x23]
0x00011f16 <muart_master+146>:	ldc (lru6)      r0, 0x320
0x00011f1a <muart_master+150>:	stw (ru6)       r0, sp[0x24]
0x00011f1c <muart_master+152>:	ldc (lru6)      r0, 0x3e8
0x00011f20 <muart_master+156>:	stw (ru6)       r0, sp[0x25]
0x00011f22 <muart_master+158>:	ldc (lru6)      r0, 0x4b0
0x00011f26 <muart_master+162>:	stw (ru6)       r0, sp[0x26]
0x00011f28 <muart_master+164>:	ldc (lru6)      r0, 0x578
0x00011f2c <muart_master+168>:	stw (ru6)       r0, sp[0x27]
0x00011f2e <muart_master+170>:	ldc (ru6)       r7, 0x8
0x00011f30 <muart_master+172>:	bu (u6)         0x7
0x00011f32 <muart_master+174>:	add (2rus)      r0, r5, 0x0
0x00011f34 <muart_master+176>:	bl (lu10)       0x153c
0x00011f38 <muart_master+180>:	mkmsk (rus)     r0, 0x1
0x00011f3a <muart_master+182>:	add (2rus)      r1, r9, 0x0
0x00011f3c <muart_master+184>:	bl (lu10)       0x1538
0x00011f40 <muart_master+188>:	clre (0r)       
0x00011f42 <muart_master+190>:	ldap (u10)      r11, 0x17
0x00011f44 <muart_master+192>:	setv (1r)       res[r6], r11
0x00011f46 <muart_master+194>:	add (2rus)      r0, r5, 0x0
0x00011f48 <muart_master+196>:	ldw (3r)        r1, r4[r0]
0x00011f4a <muart_master+198>:	ldw (2rus)      r1, r1[0x0]
0x00011f4c <muart_master+200>:	ldap (u10)      r11, 0x63
0x00011f4e <muart_master+202>:	setv (1r)       res[r1], r11
0x00011f50 <muart_master+204>:	add (2rus)      r11, r0, 0x0
0x00011f52 <muart_master+206>:	setev (1r)      res[r1], r11
0x00011f54 <muart_master+208>:	add (2rus)      r0, r0, 0x1
0x00011f56 <muart_master+210>:	eq (2rus)       r1, r0, 0x8
0x00011f58 <muart_master+212>:	bf (ru6)        r1, -0x9
0x00011f5a <muart_master+214>:	eeu (1r)        res[r6]
0x00011f5c <muart_master+216>:	add (2rus)      r0, r5, 0x0
0x00011f5e <muart_master+218>:	setsr (u6)      0x1
0x00011f60 <muart_master+220>:	clrsr (u6)      0x1
0x00011f62 <muart_master+222>:	bu (u6)         0x4
0x00011f64 <muart_master+224>:	ldw (3r)        r1, r4[r0]
0x00011f66 <muart_master+226>:	ldw (2rus)      r1, r1[0x0]
0x00011f68 <muart_master+228>:	eeu (1r)        res[r1]
0x00011f6a <muart_master+230>:	add (2rus)      r0, r0, 0x1
0x00011f6c <muart_master+232>:	lsu (3r)        r1, r0, r7
0x00011f6e <muart_master+234>:	bt (ru6)        r1, -0x6
0x00011f70 <muart_master+236>:	waiteu (0r)      *
0x00011f72 <muart_master+238>:	int (2r)        r9, res[r6] *
0x00011f74 <muart_master+240>:	ldw (2rus)      r0, r10[0x0]
0x00011f76 <muart_master+242>:	add (2rus)      r1, r9, 0x0
0x00011f78 <muart_master+244>:	ldaw (lru6)     r2, sp[0x678]
0x00011f7c <muart_master+248>:	bl (lu10)       -0x1b0
0x00011f80 <muart_master+252>:	bt (ru6)        r0, -0x21
0x00011f82 <muart_master+254>:	lsu (3r)        r0, r9, r7
0x00011f84 <muart_master+256>:	ecallf (1r)     r0
0x00011f86 <muart_master+258>:	ldaw (ru6)      r0, sp[0x30]
0x00011f88 <muart_master+260>:	ldw (3r)        r0, r0[r9]
0x00011f8a <muart_master+262>:	ldw (3r)        r1, r8[r9]
0x00011f8c <muart_master+264>:	add (3r)        r2, r1, r0
0x00011f8e <muart_master+266>:	ldc (lru6)      r1, 0x640
0x00011f92 <muart_master+270>:	lsu (3r)        r1, r2, r1
0x00011f94 <muart_master+272>:	ldaw (ru6)      r11, sp[0x28]
0x00011f96 <muart_master+274>:	ecallf (1r)     r1
0x00011f98 <muart_master+276>:	ldaw (lru6)     r1, sp[0x678]
0x00011f9c <muart_master+280>:	ld8u (3r)       r1, r1[r5]
0x00011f9e <muart_master+282>:	ldaw (ru6)      r3, sp[0x38]
0x00011fa0 <muart_master+284>:	stw (l3r)       r1, r3[r2]
0x00011fa4 <muart_master+288>:	add (2rus)      r0, r0, 0x1
0x00011fa6 <muart_master+290>:	ldw (lru6)      r2, cp[0x17d]
0x00011faa <muart_master+294>:	lmul (l6r)      r2, r3, r0, r2, r5, r5
0x00011fae <muart_master+298>:	shr (2rus)      r2, r2, 0x6
0x00011fb0 <muart_master+300>:	ldc (lru6)      r3, 0xc8
0x00011fb4 <muart_master+304>:	mul (l3r)       r2, r2, r3
0x00011fb8 <muart_master+308>:	sub (3r)        r0, r0, r2
0x00011fba <muart_master+310>:	ldaw (ru6)      r2, sp[0x30]
0x00011fbc <muart_master+312>:	stw (l3r)       r0, r2[r9]
0x00011fc0 <muart_master+316>:	ldw (3r)        r2, r11[r9]
0x00011fc2 <muart_master+318>:	eq (3r)         r2, r2, r0
0x00011fc4 <muart_master+320>:	bf (ru6)        r2, 0x13
0x00011fc6 <muart_master+322>:	add (2rus)      r0, r0, 0x1
0x00011fc8 <muart_master+324>:	ldw (lru6)      r2, cp[0x17d]
0x00011fcc <muart_master+328>:	lmul (l6r)      r2, r3, r0, r2, r5, r5
0x00011fd0 <muart_master+332>:	shr (2rus)      r2, r2, 0x6
0x00011fd2 <muart_master+334>:	ldc (lru6)      r3, 0xc8
0x00011fd6 <muart_master+338>:	mul (l3r)       r2, r2, r3
0x00011fda <muart_master+342>:	sub (3r)        r0, r0, r2
0x00011fdc <muart_master+344>:	stw (l3r)       r0, r11[r9]
0x00011fe0 <muart_master+348>:	ldaw (ru6)      r0, sp[0x18]
0x00011fe2 <muart_master+350>:	add (2rus)      r2, r0, 0x0
0x00011fe4 <muart_master+352>:	ldw (3r)        r0, r2[r9]
0x00011fe6 <muart_master+354>:	add (2rus)      r0, r0, 0x1
0x00011fe8 <muart_master+356>:	stw (l3r)       r0, r2[r9]
0x00011fec <muart_master+360>:	ldaw (ru6)      r0, sp[0x8]
0x00011fee <muart_master+362>:	add (2rus)      r2, r0, 0x0
0x00011ff0 <muart_master+364>:	ldw (3r)        r0, r2[r9]
0x00011ff2 <muart_master+366>:	add (2rus)      r0, r0, 0x1
0x00011ff4 <muart_master+368>:	stw (l3r)       r0, r2[r9]
0x00011ff8 <muart_master+372>:	ldw (3r)        r0, r4[r9]
0x00011ffa <muart_master+374>:	ldw (2rus)      r2, r0[0x4]
0x00011ffc <muart_master+376>:	bf (lru6)       r2, -0x67
0x00012000 <muart_master+380>:	ldw (2rus)      r2, r0[0x2]
0x00012002 <muart_master+382>:	ldw (2rus)      r3, r0[0x3]
0x00012004 <muart_master+384>:	getd (l2r)      r11, res[r2]
0x00012008 <muart_master+388>:	setd (r2r)      res[r2], r3
0x0001200a <muart_master+390>:	outct (rus)     res[r2], 0x1 *
0x0001200c <muart_master+392>:	setd (r2r)      res[r2], r11
0x0001200e <muart_master+394>:	stw (2rus)      r5, r0[0x4]
0x00012010 <muart_master+396>:	bu (lu6)        -0x71
0x00012014 <muart_master+400>:	get (0r)        r11, ed
0x00012016 <muart_master+402>:	zext (rus)      r11, 0x10
0x00012018 <muart_master+404>:	ldw (3r)        r1, r4[r11]
0x0001201a <muart_master+406>:	ldw (2rus)      r0, r1[0x0]
0x0001201c <muart_master+408>:	in (2r)         r2, res[r0] *
0x0001201e <muart_master+410>:	ldc (lru6)      r3, 0xfe
0x00012022 <muart_master+414>:	add (3r)        r3, r2, r3
0x00012024 <muart_master+416>:	zext (rus)      r3, 0x8
0x00012026 <muart_master+418>:	sub (3r)        r2, r2, r3
0x00012028 <muart_master+420>:	setd (r2r)      res[r0], r2
0x0001202a <muart_master+422>:	bf (ru6)        r3, 0x6
0x0001202c <muart_master+424>:	lsu (3r)        r1, r11, r7
0x0001202e <muart_master+426>:	ecallf (1r)     r1
0x00012030 <muart_master+428>:	ldaw (ru6)      r1, sp[0x8]
0x00012032 <muart_master+430>:	ldw (3r)        r1, r1[r11]
0x00012034 <muart_master+432>:	out (r2r)       res[r0], r5 *
0x00012036 <muart_master+434>:	bu (u6)         0x3d
0x00012038 <muart_master+436>:	outct (rus)     res[r0], 0x1 *
0x0001203a <muart_master+438>:	in (2r)         r2, res[r0] *
0x0001203c <muart_master+440>:	ldw (2rus)      r3, r1[0x4]
0x0001203e <muart_master+442>:	eq (3r)         r2, r3, r2
0x00012040 <muart_master+444>:	bt (ru6)        r2, 0x7
0x00012042 <muart_master+446>:	ldw (2rus)      r2, r1[0x2]
0x00012044 <muart_master+448>:	ldw (2rus)      r3, r1[0x3]
0x00012046 <muart_master+450>:	getd (l2r)      r9, res[r2]
0x0001204a <muart_master+454>:	setd (r2r)      res[r2], r3
0x0001204c <muart_master+456>:	outct (rus)     res[r2], 0x1 *
0x0001204e <muart_master+458>:	setd (r2r)      res[r2], r9
0x00012050 <muart_master+460>:	mkmsk (rus)     r2, 0x1
0x00012052 <muart_master+462>:	stw (2rus)      r2, r1[0x4]
0x00012054 <muart_master+464>:	lsu (3r)        r1, r11, r7
0x00012056 <muart_master+466>:	ecallf (1r)     r1
0x00012058 <muart_master+468>:	ldaw (ru6)      r1, sp[0x8]
0x0001205a <muart_master+470>:	ldw (3r)        r10, r1[r11]
0x0001205c <muart_master+472>:	lss (3r)        r1, r5, r10
0x0001205e <muart_master+474>:	bf (ru6)        r1, 0x1e
0x00012060 <muart_master+476>:	ldaw (ru6)      r2, sp[0x28]
0x00012062 <muart_master+478>:	ldw (3r)        r3, r2[r11]
0x00012064 <muart_master+480>:	ldw (3r)        r1, r8[r11]
0x00012066 <muart_master+482>:	add (3r)        r1, r1, r3
0x00012068 <muart_master+484>:	ldc (lru6)      r9, 0x640
0x0001206c <muart_master+488>:	lsu (3r)        r9, r1, r9
0x0001206e <muart_master+490>:	ecallf (1r)     r9
0x00012070 <muart_master+492>:	ldaw (ru6)      r9, sp[0x38]
0x00012072 <muart_master+494>:	ldw (3r)        r1, r9[r1]
0x00012074 <muart_master+496>:	stw (ru6)       r1, sp[0x7]
0x00012076 <muart_master+498>:	sub (2rus)      r1, r10, 0x1
0x00012078 <muart_master+500>:	ldaw (ru6)      r9, sp[0x8]
0x0001207a <muart_master+502>:	stw (l3r)       r1, r9[r11]
0x0001207e <muart_master+506>:	add (2rus)      r3, r3, 0x1
0x00012080 <muart_master+508>:	ldw (lru6)      r9, cp[0x17d]
0x00012084 <muart_master+512>:	lmul (l6r)      r9, r10, r3, r9, r5, r5
0x00012088 <muart_master+516>:	shr (2rus)      r9, r9, 0x6
0x0001208a <muart_master+518>:	ldc (lru6)      r10, 0xc8
0x0001208e <muart_master+522>:	mul (l3r)       r9, r9, r10
0x00012092 <muart_master+526>:	sub (3r)        r3, r3, r9
0x00012094 <muart_master+528>:	stw (l3r)       r3, r2[r11]
0x00012098 <muart_master+532>:	ldw (ru6)       r2, sp[0x7]
0x0001209a <muart_master+534>:	bu (u6)         0x8
0x0001209c <muart_master+536>:	ldaw (ru6)      r1, sp[0x10]
0x0001209e <muart_master+538>:	add (2rus)      r2, r1, 0x0
0x000120a0 <muart_master+540>:	ldw (3r)        r1, r2[r11]
0x000120a2 <muart_master+542>:	add (2rus)      r1, r1, 0x1
0x000120a4 <muart_master+544>:	stw (l3r)       r1, r2[r11]
0x000120a8 <muart_master+548>:	mkmsk (rus)     r1, 0x20
0x000120aa <muart_master+550>:	add (2rus)      r2, r1, 0x0
0x000120ac <muart_master+552>:	ldw (ru6)       r10, sp[0x6]
0x000120ae <muart_master+554>:	out (r2r)       res[r0], r5 *
0x000120b0 <muart_master+556>:	out (r2r)       res[r0], r2 *
0x000120b2 <muart_master+558>:	out (r2r)       res[r0], r1 *
0x000120b4 <muart_master+560>:	outct (rus)     res[r0], 0x1 *
0x000120b6 <muart_master+562>:	bu (lu6)        -0xbd
0x000120ba <muart_master+566>:	stw (2rus)      r0, r0[0x0]
The machine instruction of problem is

Code: Select all

0x0001201a <muart_master+406>:	ldw (2rus)      r0, r1[0x0]
which is a load instruction to copy a memory address to r0 register using a base address, r1 register in this case, and an index number, 0x0 in this case. So, the index itself is not problematic. I checked value of r1 at time of crash from info reg:

Code: Select all

r1             0xf002a80	251669120
This seems a rather large value considering the 64kb memory of each core. The "ed" (exception data) register also confirms this:

Code: Select all

ed             0xf002a80	251669120
The problem is that all of this code is part of the internal assembly code for interface await cases on server side. So how did the r1 register suddenly point to a erroneous memory location? Is this a known issue? It certainly seems so from the number of google results for this particular error. Has anybody found a workaround of sorts for this?
Thanks again,
Prasanna.
Last edited by sprajagopal on Thu Oct 20, 2016 12:10 pm, edited 1 time in total.


Gothmag
XCore Addict
Posts: 129
Joined: Wed May 11, 2016 3:50 pm

Post by Gothmag »

That specific exception wouldn't be uncommon. Most people have probably managed that and been completely clueless as to why. What board/silicon are you using, tools version, can you post more of your code? Looks like it'd be some odd codegen bug or you've got a bug in your code somewhere you're not seeing.
sprajagopal
Member++
Posts: 18
Joined: Thu Jul 23, 2015 4:22 pm

Post by sprajagopal »

Gothmag wrote:That specific exception wouldn't be uncommon. Most people have probably managed that and been completely clueless as to why. What board/silicon are you using, tools version, can you post more of your code? Looks like it'd be some odd codegen bug or you've got a bug in your code somewhere you're not seeing.
I'm sure the specific exception is common. The issue for me is that it's part of an server interface await case.
I've edited the original post to add the tools version and board details.
henk
Respected Member
Posts: 347
Joined: Wed Jan 27, 2016 5:21 pm

Post by henk »

Hi,

Please report this as a bug on <http://www.xmos.com/rt3/SelfService/Cre ... t-bug.html>, that way it is logged and tracked.

Cheers,
Henk
robertxmos
XCore Addict
Posts: 169
Joined: Fri Oct 23, 2015 10:23 am

Post by robertxmos »

Could you post a fuller example of the failure?
(It is far easier to debug the intermediate tree or llvm-ir than the assembler output)
Thank you.