P8000/WEGA/src/uts/sys/lock.s

937 lines
16 KiB
ArmAsm

.seg
.psec data
.data
fp := r15;
sp := rr14;
_lockwstr::
.byte %40
.byte %5b
.byte %24
.byte %5d
.byte %6c
.byte %6f
.byte %63
.byte %6b
.byte %2e
.byte %63
.byte %9
.byte %9
.byte %52
.byte %65
.byte %76
.byte %20
.byte %3a
.byte %20
.byte %34
.byte %2e
.byte %31
.byte %20
.byte %9
.byte %30
.byte %38
.byte %2f
.byte %32
.byte %37
.byte %2f
.byte %38
.byte %33
.byte %20
.byte %31
.byte %31
.byte %3a
.byte %35
.byte %35
.byte %3a
.byte %31
.byte %34
.byte %0
.byte 0
.comm 0, _buffer1;
.comm 0, _buffer2;
.comm 0, _buffer3;
.comm 0, _buffer4;
.comm 0, _buffer5;
.comm 0, _canonb;
.comm 4, _rootdir;
.comm 4, _runq;
.comm 2, _lbolt;
.comm 4, _lifetime;
.comm 4, _time;
.comm 2, _nblkdev;
.comm 2, _nchrdev;
.comm 2, _mpid;
.comm 1, _runin;
.comm 1, _runout;
.comm 1, _runrun;
.comm 1, _curpri;
.comm 2, _maxmem;
.comm 2, _umemory;
.comm 4, _swplo;
.comm 2, _nswap;
.comm 2, _updlock;
.comm 4, _rablock;
.comm 128, _msgbuf;
.comm 2, _rootdev;
.comm 2, _swapdev;
.comm 2, _pipedev;
.comm 4, _serial;
.comm 2, _numterm;
.comm 2, _manboot;
.comm 2, _blkacty;
.comm 2, _cputype;
.comm 112, _sysinfo;
.comm 6, _syswait;
.comm 2, _dk_busy;
.comm 128, _dk_time;
.comm 12, _dk_numb;
.comm 12, _dk_wds;
.comm 4, _tk_nin;
.comm 4, _tk_nout;
.comm 200, _callout;
L6000:
.byte %00,%00,%01,%1e,%00,%00,%01,%4a
.byte %00,%00,%02,%56,%00,%00,%02,%56
.byte %00,%00,%02,%56,%00,%00,%02,%56
.byte %00,%00,%02,%56,%00,%00,%02,%56
.byte %00,%00,%01,%76,%00,%00,%02,%02
.byte %00,%00,%02,%56,%00,%00,%02,%42
.byte %00,%00,%02,%56,%00,%00,%02,%56
.byte %00,%00,%02,%56,%00,%00,%02,%56
.byte %00,%00,%02,%2e,%00,%00,%02,%74
.byte %00,%00,%02,%56,%00,%00,%02,%56
.byte %00,%00,%02,%56,%00,%00,%02,%56
.byte %00,%00,%02,%56,%00,%00,%02,%56
.byte %00,%00,%02,%4e,%00,%00,%02,%46
.byte %00,%00,%02,%56,%00,%00,%02,%38
.even
/*~~lkdata:*/
.psec
.code
_lkdata::
{
sub fp,#~L2
ldm _stkseg+~L1+%0012(fp),r8,#6
ldl rr2,_u+%0024
ldl |_stkseg+~L1+%000c|(fp),rr2
ldl rr4,#_stkseg+~L1+4
add r5,fp
ldl rr2,#_stkseg+~L1+8
add r3,fp
ldl rr6,|_stkseg+~L1+%000c|(fp)
calr _lkfront
ldl rr12,rr2
testl rr2
jp z,L1000
ldl rr2,|_stkseg+~L1+%0008|(fp)
ldl |_stkseg+~L1+%0000|(fp),rr2
ldl rr4,|_stkseg+~L1+%000c|(fp)
ld r7,rr4(#%0002)
bit r7,#2
jr z,L1180
ld r7,#%0080
jr L1170
L1180:
sub r7,r7
L1170:
ldl rr4,rr12
ldl rr2,|_stkseg+~L1+%0004|(fp)
calr _locked
test r2
jp nz,L1000
ldl rr2,rr12
add r3,#%004a
ldl rr10,rr2
ldl rr2,|_stkseg+~L1+%000c|(fp)
ld r4,rr2(#%0002)
bit r4,#0
jr z,L1190
sub r4,r4
jr L1200
L1190:
ld r4,#%0100
L1200:
ld |_stkseg+~L1+%0010|(fp),r4
jp L1010
L1160:
ldl rr2,rr8
inc r3,#10
ldl rr4,|_stkseg+~L1+%0008|(fp)
cpl rr4,@rr2
jp lt,L1150
ldl rr2,rr8(#%0006)
cpl rr2,_u+%0020
jp nz,L1140
ldl rr4,rr8(#%000a)
cpl rr4,|_stkseg+~L1+%0004|(fp)
jr gt,L1210
ldk r3,#1
jr L1220
L1210:
sub r3,r3
L1220:
ldl rr4,rr8(#%000e)
cpl rr4,|_stkseg+~L1+%0004|(fp)
jr gt,L1230
ldk r4,#2
jr L1240
L1230:
sub r4,r4
L1240:
add r3,r4
ldl rr4,rr8(#%000a)
cpl rr4,|_stkseg+~L1+%0008|(fp)
jr gt,L1250
ldk r4,#4
jr L1260
L1250:
sub r4,r4
L1260:
add r3,r4
ldl rr4,rr8(#%000e)
cpl rr4,|_stkseg+~L1+%0008|(fp)
jr gt,L1270
ldk r4,#8
jr L1280
L1270:
sub r4,r4
L1280:
add r3,r4
ld r4,rr8(#%0004)
and r4,#%0100
cp r4,|_stkseg+~L1+%0010|(fp)
jr nz,L1290
ld r4,#%0010
jr L1130
L1290:
sub r4,r4
L1130:
add r3,r4
ld r2,r3
dec r2,#4
cp r2,#%001b
jp ugt,L1010
rl r2,#2
ldl rr4,L6000(r2)
jp @rr4
test |_stkseg+~L1+%0010|(fp)
jr z,L1120
ldl rr4,rr8(#%000a)
ldl |_stkseg+~L1+%0000|(fp),rr4
jp L1110
L1120:
ldl rr2,|_stkseg+~L1+%0008|(fp)
ldl |_stkseg+~L1+%0000|(fp),rr2
ldl rr6,rr10
ld r5,|_stkseg+~L1+%0010|(fp)
ldl rr2,|_stkseg+~L1+%0004|(fp)
calr _lockadd
test r2
jr z,L1060
test |_stkseg+~L1+%0010|(fp)
jp nz,L1000
ldl rr2,rr8(#%000a)
cpl rr2,|_stkseg+~L1+%0004|(fp)
jr ge,L1090
ldl rr2,|_stkseg+~L1+%0004|(fp)
ldl |_stkseg+~L1+%0000|(fp),rr2
ldl rr2,rr8(#%000a)
ld r5,#%0100
ldl rr6,rr10
calr _lockadd
test r2
jr z,L1100
test |_stkseg+~L1+%0010|(fp)
jr z,L1040
ldl rr2,rr8(#%000a)
ldl |_stkseg+~L1+%0000|(fp),rr2
ldl rr6,rr10
ld r5,|_stkseg+~L1+%0010|(fp)
ldl rr2,|_stkseg+~L1+%0004|(fp)
calr _lockadd
test r2
jr nz,L1080
ldl rr2,_locklist
testl rr2
jr nz,L1070
ldl rr4,@rr8
ldl @rr10,rr4
ldl rr6,@rr10
calr _lockfree
ldb _u+%0015,#%23
jr L1000
L1100:
ldl rr2,|_stkseg+~L1+%0008|(fp)
ldl |_stkseg+~L1+%0000|(fp),rr2
ldl rr6,@rr10
sub r5,r5
ldl rr2,|_stkseg+~L1+%0004|(fp)
calr _lockadd
test r2
jr z,L1060
ldl rr2,@rr8
ldl @rr10,rr2
ldl rr6,@rr10
calr _lockfree
jr L1000
L1090:
ldl rr2,|_stkseg+~L1+%0008|(fp)
ldl |_stkseg+~L1+%0000|(fp),rr2
ldl rr2,rr8(#%000a)
sub r5,r5
ldl rr6,rr10
calr _lockadd
test r2
jr nz,L1000
L1060:
ldl rr2,rr8
inc r3,#10
ldl rr4,|_stkseg+~L1+%0008|(fp)
L1030:
ldl @rr2,rr4
jr L1000
L1070:
ldl rr2,rr8(#%000e)
ldl |_stkseg+~L1+%0004|(fp),rr2
cpl rr2,|_stkseg+~L1+%0008|(fp)
jr nz,L1010
jr L1000
L1080:
test |_stkseg+~L1+%0010|(fp)
jr z,L1050
ldl rr2,rr8(#%000e)
ldl |_stkseg+~L1+%0004|(fp),rr2
cpl rr2,|_stkseg+~L1+%0008|(fp)
jr nz,L1010
jr L1000
L1050:
ldl rr2,rr8(#%000a)
cpl rr2,|_stkseg+~L1+%0004|(fp)
jr ge,L1040
ldl rr2,rr8
inc r3,#14
ldl rr4,|_stkseg+~L1+%0004|(fp)
ldl @rr2,rr4
jr L1010
ldl rr2,rr8
inc r3,#10
ldl rr4,|_stkseg+~L1+%0004|(fp)
jr L1030
ldl rr2,rr8(#%000e)
cpl rr2,|_stkseg+~L1+%0004|(fp)
jr z,L1020
L1140:
ldl rr10,rr8
jr L1010
L1020:
ldl rr2,rr8(#%000a)
ldl |_stkseg+~L1+%0004|(fp),rr2
L1040:
ldl rr2,@rr8
ldl @rr10,rr2
ldl rr6,rr8
calr _lockfree
L1010:
ldl rr8,@rr10
testl rr8
jp nz,L1160
L1150:
ldl rr2,|_stkseg+~L1+%0008|(fp)
ldl |_stkseg+~L1+%0000|(fp),rr2
L1110:
ldl rr6,rr10
ld r5,|_stkseg+~L1+%0010|(fp)
ldl rr2,|_stkseg+~L1+%0004|(fp)
calr _lockadd
L1000:
ldm r8,_stkseg+~L1+%0012(fp),#6
add fp,#~L2
ret
~L1 := 0
~L2 := 30
} /* _lkdata */
.psec data
.data
/*~~unlk:*/
.psec
.code
_unlk::
{
sub fp,#~L2
ldm _stkseg+%0010(fp),r8,#6
ldl rr2,_u+%0024
ldl |_stkseg+~L1+%000c|(fp),rr2
ldl rr4,#_stkseg+~L1+4
add r5,fp
ldl rr2,#_stkseg+~L1+8
add r3,fp
ldl rr6,|_stkseg+~L1+%000c|(fp)
calr _lkfront
ldl rr12,rr2
testl rr2
jr z,L700
add r3,#%004a
ldl rr10,rr2
jr L710
L760:
ld r2,rr8(#%0004)
bit r2,#4
jr z,L720
ldl rr2,rr8
inc r3,#4
res @rr2,#4
ldl rr6,rr8
call _wakeup
L720:
ldl rr2,rr8(#%000a)
cpl rr2,|_stkseg+~L1+%0004|(fp)
jr ge,L730
ldl rr2,rr8
inc r3,#14
ldl rr4,|_stkseg+~L1+%0008|(fp)
cpl rr4,@rr2
jr ge,L730
ldl rr2,rr8(#%000e)
ldl |_stkseg+~L1+%0000|(fp),rr2
ld r5,rr8(#%0004)
ldl rr6,rr8
ldl rr2,|_stkseg+~L1+%0008|(fp)
calr _lockadd
test r2
jr nz,L700
ldl rr2,rr8
inc r3,#14
ldl rr4,|_stkseg+~L1+%0004|(fp)
ldl @rr2,rr4
jr L700
L730:
ldl rr2,rr8
inc r3,#10
ldl rr4,|_stkseg+~L1+%0004|(fp)
cpl rr4,@rr2
jr gt,L740
ldl rr2,rr8
inc r3,#14
ldl rr6,|_stkseg+~L1+%0008|(fp)
cpl rr6,@rr2
jr ge,L740
ldl rr2,rr8
inc r3,#10
ldl rr0,|_stkseg+~L1+%0008|(fp)
ldl @rr2,rr0
jr L700
L740:
ldl rr2,rr8
inc r3,#14
ldl rr4,|_stkseg+~L1+%0004|(fp)
ldl @rr2,rr4
L750:
ldl rr10,rr8
jr L710
L770:
ldl rr2,rr8(#%0006)
cpl rr2,_u+%20
jr nz,L750
ldl rr2,rr8
inc r3,#10
ldl rr4,|_stkseg+~L1+%0008|(fp)
cpl rr4,@rr2
jr le,L700
ldl rr2,rr8(#%000e)
cpl rr2,|_stkseg+~L1+%0004|(fp)
jr le,L750
ldl rr2,rr8
inc r3,#10
ldl rr4,|_stkseg+~L1+%0004|(fp)
cpl rr4,@rr2
jr gt,L760
ldl rr2,rr8(#%000e)
cpl rr2,|_stkseg+~L1+%0008|(fp)
jr gt,L760
ldl rr2,@rr8
ldl @rr10,rr2
ldl rr6,rr8
calr _lockfree
L710:
ldl rr8,@rr10
testl rr8
jr nz,L770
L700:
ldm r8,_stkseg+%0010(fp),#6
add fp,#~L2
ret
~L1 := 0
~L2 := 28
} /* _unlk */
.psec data
.data
/*~~locked:*/
.psec
.code
_locked::
{
sub fp,#~L2
ldm _stkseg+%0012(fp),r8,#6
ld |_stkseg+~L1+%000a|(fp),r7
ldl rr8,_stkseg+~L1+%0022(fp)
ldl rr10,rr2
ldl rr12,rr4
ldl rr2,rr12(#%004a)
ldl |_stkseg+~L1+%000c|(fp),rr2
jr L600
L610:
ldl rr2,|_stkseg+~L1+%000c|(fp)
ldl rr4,@rr2
ldl |_stkseg+~L1+%000c|(fp),rr4
jr L600
L650:
inc r3,#10
cpl rr8,@rr2
jr le,L620
ldl rr2,|_stkseg+~L1+%000c|(fp)
ldl rr4,rr2(#%0006)
cpl rr4,_u+%0020
jr z,L610
inc r3,#14
cpl rr10,@rr2
jr ge,L610
ldl rr2,|_stkseg+~L1+%000c|(fp)
inc r3,#4
ld r4,|_stkseg+~L1+%000a|(fp)
and r4,#%0100
and r4,@rr2
jr nz,L610
bit |_stkseg+~L1+%000a|(fp),#7
jr z,L660
ldb _u+%0015,#%0d
L640:
ldk r2,#1
jr L630
L660:
ldl rr6,|_stkseg+~L1+%000c|(fp)
calr _deadlock
test r2
jr nz,L640
ldl rr2,|_stkseg+~L1+%000c|(fp)
inc r3,#4
set @rr2,#4
ldl rr6,|_stkseg+~L1+%000c|(fp)
ld r5,#%0028
call _sleep
ldl rr2,rr12(#%004a)
ldl |_stkseg+~L1+%000c|(fp),rr2
testb _u+%0015
jr nz,L640
L600:
ldl rr2,|_stkseg+~L1+%000c|(fp)
testl rr2
jr nz,L650
L620:
sub r2,r2
L630:
ldm r8,_stkseg+%0012(fp),#6
add fp,#~L2
ret
~L1 := 0
~L2 := 30
} /* _locked */
.psec data
.data
/*~~deadlock:*/
.psec
.code
_deadlock::
{
sub fp,#~L2
ldm _stkseg+%000a(fp),r10,#4
ldl rr12,rr6
jr L500
L540:
ldl rr2,rr12(#%0006)
ldl rr4,rr2(#%0016)
ldl rr10,rr4
cpl rr4,#_locklist
jr c,L510
ld r3,_Nflock
mult rr2,#%0012
ldl rr4,#_locklist
add r5,r3
cpl rr10,rr4
jr nc,L510
ldl rr2,rr10(#%0006)
cpl rr2,_u+%0020
jr nz,L520
ldb _u+%0015,#35
ldk r2,#1
jr L530
L520:
ldl rr12,rr10
L500:
ldl rr2,rr12(#%0006)
cpb @rr2,#%01
jr z,L540
L510:
sub r2,r2
L530:
ldm r10,_stkseg+%000a(fp),#4
add fp,#~L2
ret
~L1 := 0
~L2 := 18
} /* _deadlock */
.psec data
.data
/*~~unlock:*/
.psec
.code
_unlock::
{
sub fp,#~L2
ldm _stkseg+%0010(fp),r8,#6
ldl rr12,rr6
ldl rr2,rr12(#%004a)
testl rr2
jr z,L400
ldl rr2,rr6
add r3,#%004a
ldl rr8,rr2
clr |_stkseg+~L1+%000e|(fp)
clr |_stkseg+~L1+%000c|(fp)
ld r2,|_stkseg+~L1+%000c|(fp)
sla r2,#2
ldl rr4,_u+%0068(r2)
testl rr4
jr z,L410
ld r2,|_stkseg+~L1+%000c|(fp)
sla r2,#2
ldl rr4,_u+%0068(r2)
inc r5,#2
cpl rr12,@rr4
jr ne,L410
inc |_stkseg+~L1+%000e|(fp),#1
L410:
inc |_stkseg+~L1+%000c|(fp),#1
cp |_stkseg+~L1+%000c|(fp),#%0014
jr lt,_unlock+%26
test |_stkseg+~L1+%000e|(fp)
jr z,L420
jr L400
L430:
ldl rr2,@rr10
ldl @rr8,rr2
ldl rr6,rr10
calr _lockfree
jr L420
L440:
ldl rr2,rr10(#%0006)
cpl rr2,_u+%0020
jr z,L430
ldl rr8,rr10
L420:
ldl rr10,@rr8
testl rr10
jr nz,L440
L400:
ldm r8,_stkseg+%0010(fp),#6
add fp,#~L2
ret
~L1 := 0
~L2 := 28
} /* _unlock */
.psec data
.data
/*~~lockalloc:*/
.psec
.code
_lockalloc::
{
dec fp,#~L2
ldm _stkseg+4(fp),r10,#4
ldl rr12,#_locklist
ldl rr2,rr12(#6)
testl rr2
jr nz,L300
ldl rr2,rr12
inc r3,#6
ldl rr4,#_proc
ldl @rr2,rr4
ldl rr10,#_locklist+18
jr L310
L320:
ldl rr6,rr10
calr _lockfree
add r11,#18
L310:
ld r3,_Nflock
mult rr2,#18
ldl rr4,#_locklist
add r5,r3
cpl rr10,rr4
jr c,L320
L300:
ldl rr10,@rr12
testl rr10
jr nz,L330
ldb _u+21,#%23
subl rr2,rr2
jr L340
L330:
ldl rr2,@rr10
ldl @rr12,rr2
subl rr2,rr2
ldl @rr10,rr2
ldl rr2,rr10
L340:
ldm r10,_stkseg+4(fp),#4
inc fp,#~L2
ret
~L1 := 0
~L2 := 12
} /* _lockalloc */
.psec data
.data
/*~~lockfree:*/
.psec
.code
_lockfree::
{
dec fp,#~L2
ldm _stkseg+4(fp),r10,#4
ldl rr12,rr6
ldl rr10,#0
ld r2,r12(#4)
bit r2,#4
jr z,L10
ldl rr2,rr6
inc r3,#4
res @rr2,#4
ldl rr6,rr12
call _wakeup
L10:
ldl rr2,@rr10
ldl @r12,rr2
ldl @r10,rr12
ldm r10,_stkseg+4(fp),#4
inc fp,#~L2
ret
~L1 := 0
~L2 := 12
} /* _lockfree */
.psec data
.data
/*~~lockadd:*/
.psec
.code
_lockadd::
{
sub fp,#~L2
ldm _stkseg+18(fp),r8,#6
ldl rr8,rr2
ld r11,r5
ldl rr12,rr6
calr _lockalloc
ldl |_stkseg+~L1+12|(fp),rr2
testl rr2
jr nz,L20
ldb _stkseg+~L1+21,#%23
ldk r2,#1
jr L30
L20:
ldl rr2,|_stkseg+~L1+12|(fp)
ldl rr4,@rr12
ldl @rr2,rr4
ldl rr4,|_stkseg+~L1+12|(fp)
ldl @rr12,rr4
ldl rr2,|_stkseg+~L1+12|(fp)
inc r3,#6
ldl rr4,_u+32
ldl @rr2,rr4
ldl rr2,|_stkseg+~L1+12|(fp)
inc r3,#10
ldl @rr2,rr8
ldl rr2,|_stkseg+~L1+12|(fp)
inc r3,#14
ldl rr4,_stkseg+~L1+34(fp)
ldl @rr2,rr4
ldl rr2,|_stkseg+~L1+12|(fp)
inc r3,#4
ld @rr2,r11
sub r2,r2
L30:
ldm r8,_stkseg+18(fp),#6
add fp,#~L2
ret
~L1 := 0
~L2 := 30
} /* _lockadd */
.psec data
.data
L5000:
.byte %50,%41,%4e,%49,%43,%20,%69,%70
.byte %20,%6e,%75,%6c,%6c,%20,%69,%6e
.byte %20,%6c,%6b,%66,%72,%6f,%6e,%74
.byte %0a,%00
.even
/*~~lkfront:*/
.psec
.code
_lkfront::
{
sub fp,#~L2
ldm _stkseg+36(fp),r8,#6
ldl rr8,rr2
ldl rr10,rr4
ldl rr12,rr6
ld r7,@rr12
call _getf
ldl |_stkseg+~L1+22|(fp),rr2
testl rr2
jr nz,L40
jr L50
L70:
ldl rr6,#L5000
call _printf
jr L50
L90:
ldl rr6,|_stkseg+~L1+%1a|(fp)
ld r5,#%0080
call _access
test r2
jr z,L60
L80:
ldb _u+21,#%0d
jr L50
L100:
ld r4,rr2(#%0006)
bit r4,#12
jr z,L80
ldb _u+21,#%1d
jr L50
L40:
ldl rr2,|_stkseg+~L1+22|(fp)
ldl rr4,rr2(#%0002)
ldl |_stkseg+~L1+26|(fp),rr4
testl rr4
jr z,L70
ldl rr2,|_stkseg+~L1+22|(fp)
ldb rl4,@rr2
extsb r4
and r4,#%0002
test r4
jr z,L90
L60:
ld |_stkseg+~L1+30|(fp),#%7000
ldl rr2,|_stkseg+~L1+26|(fp)
ld r4,rr2(#%0006)
and r4,#%f000
and r4,|_stkseg+~L1+30|(fp)
jr nz,L100
ldl rr6,rr12(#%0004)
ldl rr4,#%0000000c
add r5,fp
ldk r3,#10
call _copyin
test r2
jr z,L110
ldb _u+21,#%0e
jr L50
L120:
ldb _u+21,#%16
L50:
subl rr2,rr2
jr L200
L110:
ld r2,rr12(#%0002)
cp r2,#%0000
jr lt,L120
cp r2,#%0007
jr gt,L120
bit r2,#1
jr z,L130
cp |_stkseg+~L1+20|(fp),#%0001
jr nz,L140
ldl rr2,|_stkseg+~L1+22|(fp)
ldl rr4,rr2(#%0006)
jr L150
L140:
cp |_stkseg+~L1+20|(fp),#%0002
jr nz,L160
ldl rr2,|_stkseg+~L1+26|(fp)
ldl rr4,rr2(#%000e)
L150:
addl rr4,|_stkseg+~L1+16|(fp)
ldl |_stkseg+~L1+16|(fp),rr4
L160:
ldl rr2,|_stkseg+~L1+16|(fp)
ldl @rr10,rr2
jr L170
L130:
ldl rr2,|_stkseg+~L1+22|(fp)
ldl rr4,rr2(#%0006)
ldl @rr10,rr4
L170:
ldl rr2,@rr10
cpl rr2,#%00000000
jr lt,L120
ldl rr2,|_stkseg+~L1+12|(fp)
testl rr2
jr z,L180
ldl rr2,@rr10
addl rr2,|_stkseg+~L1+12|(fp)
jr L190
L180:
ldl rr2,#%40000000
L190:
ldl @rr8,rr2
ldl rr2,@rr10
cpl rr2,@rr8
jr ge,L120
ldl rr2,@rr10
ldl _u+40,rr2
ldl rr2,|_stkseg+~L1+%1a|(fp)
L200:
ldm r8,_stkseg+~L1+36(fp),#6
add fp,#~L2
ret
~L1 := 0
~L2 := 48
} /* _lkfront */
.psec data
.data