B+dYXWVUTSRQPONMLKJIHGFEDCBA@?>=<;:9876543210/.-,+*)     !,root0~ !!!A B!],!ꕸ!ꕸAC!!!XDEFGHIJKLMN!蓩! !4]cdefgh!蓪! !4Hijklmnopqrs!蓫! !5!蓫! !6͘!蓬! !7~!蓬! !7!蓭! !8m!蓭! !8!蓮! !9!蓮!!:M!! !:}!蓯!5!:]!蓯!9!;!蓰!W!<!蓰!C!<!蓱!!=i@!蓲!!>M    !!!>LH !!!>M!!!?M!!!?M !!!@l!"#$%&'!蓴!!@()*+,-./012!!!AM45678!!!AM9:;<=!!!Bm>?@ABCD!!!B}EFGHIJKL!!!C MNOPQRSTU!!!C]VWXYZ[!!!DM\]^_`!蓷!!Dlabcdefg!蓷!!EMhijkl!!!EMmnopq!!!EMrstuv!! !FMwxyz{!! !FM|}~!! !FM!!!G/p!!!GM!!!HMp!!!H/p!!!HM!!!IM!!!I!!!I}!H!H!J!!K!J/p!!`!K]x!!a!K/p!!b!K/H!!c!K=!!d!KM!!f!L/p!!g!LM!!i!LM!!j!LM!!k!MM!!l!M=!!n!M/p!!o!MM!!p!NM!!r!NM!!s!NM!!t!Oz(     !!u!Om!!w!O!!x!P,!x!x!Pm !"!!{!QgP#$%&'()!!}!Ry*+,-./01!!~!R}X23456789!!!Rx:;<=>?@A!!!S)B!!!SMCDEFG!!!SkHIJKLMN!!!SOPQRSTUVWXY! ! !T\]^_`abcd!! !Tgefghijk!!!Uglmnopqr!!!Ustuvwxyz{|}! ! !V}!! !X !!!XA `! @! @!gA! K! K!Ya! J! J!Ya! J! J!Ya! K! K!Ya! K! K!Ya! K! K!Ya! K! K!YAm ! I! I!Za! @! @!Ya! A! A!Ya! A! A!Za! B! B!Za! B! B!Za! C! C!Za! D! D!Za! D! D!Za! E! E!Za ! E! E!Za ! F! F!Za ! G! G!Za ! G! G!Za ! H! H!Za! H! H!Za! I! I!ZA! J! J![a! J! J!Za! J! J!Za ! J! J![a(! J! J![a0! J! J![a8! J! J![A! ! ![!! ! ![!! ! ![!! ! ![!! ! ![!! ! ![!! ! ![Am ! ! !]!!!!\!!!!\!!!!\!!!!\!!!!\!! ! !\!! ! !\!! ! !\!! ! !\! ! ! !\! ! ! !\! ! ! !\! ! ! !\! ! ! !\!! ! !\!! ! !]A! ! !]! ! ! !]! ! ! !]! ! ! !]! (! ! !]! 0! ! !]! 8! ! !]A ! ! !^! ! ! !b! ! ! !b! ! ! !b! ! ! !b! ! ! !b! ! ! !b! ! ! !b! ! ! !b! ! ! !b! ! ! !b! ! ! !b! ! ! !b! ! ! !b! ! ! !b! ! ! !c! ! ! !c!!!!b!!!!_!!!!_!!!!_!!!!_!!!!_!!!!_!!!!_!!!!_! !!!_! !!!_! !!!_! !!!_! !!!_!!!!_!!!!_!!!!_!!!!`!!!!`!!!!`!!!!`!!!!`!!!!`!!!!`!!!!`!!!!`!!!!`!!!!`!!!!`!!!!`!!!!a!!!!a!!!!a! !!!a!!!!a! !!!a! !!!a!!!!a!! ! !a!$! ! !a!G! ! !b! ! ! !c! ! ! !c! ! ! !c! ! ! !c! ! ! !c! ! ! !c! ! ! !c! ! !! !!c! ! !! !!c! ! "! "!c! ! "! "!c! ! #! #!c! ! #! #!c! ! $! $!c! ! $! $!c! ! %! %!d! ! %! %!d! ! &! &!d! ! &! &!d! ! '! '!d! ! '! '!d! ! (! (!d! ! (! (!d! ! )! )!d! ! )! )!d! ! *! *!d! ! *! *!d! ! +! +!d! ! +! +!d! ! ,! ,!d! ! -! -!d! ! -! -!d! ! .! .!e! ! .! .!e! ! /! /!e! ! /! /!e! ! 0! 0!e! ! 0! 0!e! ! 1! 1!e! ! 1! 1!e! ! 2! 2!e! ! 2! 2!e! ! 3! 3!e! ! 3! 3!e! ! 4! 4!e! ! 4! 4!e! ! 5! 5!f! ! 5! 5!f! ! 6! 6!f! ! 6! 6!f! ! 7! 7!f! ! 7! 7!f! ! 8! 8!f! ! 9! 9!f! ! :! :!f! ! :! :!f! ! ;! ;!f! ! ;! ;!f! ! ! >!f! ! >! >!f! ! ?! ?!f!! ?! ?!g!! @! @!gA@!!!ꕐA!!!lA !!!gA !!!gB!!!hh!!!h}!!!i!!!igF!!!irx!!!j7S!!!lA!!!!l~"#!!!l s$!!!lA0%! ! !m8&!! !mA0'! (! (!mpp!mA(!!!rA`)!!!n*!!!n:+!!!nm,!!!n}-!!!nA.!!!o //!!!o 01!!!o 2!!!o 3!!!o F4!!!o -5!!!o 6!!!o 7!!!oU8!! !p9!! !p:!! !p;!! !p <!! !p=!! !p>!! !p~?!! !p<@!! !pA!! !qB!! !q`C!! !qD!! !qE!! !q(F!! !q&G!! !qdH!! !q)I!!!qgJ!!!rK!!!rCL!!!rFM!!!r%N!!!rO!!!rAP! ! !sQ!! !r R!ꔾ! !rS!! !s]TUVWXY!! !s}Z[\]^_`a!! !sDb!! !scd!!(!sef!!)!tgh!!)%!t@ijklmnopqrs!!!tMuvwxy!!!umxz{|}~!!!uM!!!v=!!!vM!!!v}!!!wLH!!!w]!!!xM!!!x]!!!x]!!!y{!!!yI!!!yx!!!z!!!z]!!!zM!!!{M!!!{]!!!{!!!{=!!!|}!!!|]!!!|]!!!|M!!!}/p   !!!}}  !!!}k!!!~ !"#!!!~n $%&'()*!!!?b+,-.!!!?b/012!!!J3!!!$ 45!!!m6789:;<!! !ꕀ=>?@ABCDE!! !ꕀ]FGHIJK!! !ꕁL!! !ꕁ5M!! !ꕁ%NO!! !ꕁ]PQRSTU!! !ꕁ VWXYZ[\]^_`!! !ꕂh!! !ꕂUi!p!ꕂj!p!ꕃOk!! !ꕃl!! !ꕃ m!! !ꕃn!! !ꕃ.o!! !ꕃp!p!ꕃq!p!ꕃ r!p!ꕃps!! !ꕃt!p!ꕄu!p!ꕄ~v!! !ꕄ<w!p!ꕄx!p!ꕄy!p!ꕄ`z!p!ꕄ{!p!ꕄ|!p!ꕅ(}!p!ꕅ&~!p!ꕅd!p!ꕅ!! !ꕅa!! !ꕅ !! !ꕅ!! !ꕅ!! !ꕅH!! !ꕆp! ! !ꕇ!! !ꕇ/(!! !ꕇM!! !ꕇ]!! !ꕇ/p!! !ꕈ=!! !ꕈ !! !ꕈpp!ꕈpp!ꕈpp!ꕈpp!ꕈ)!p!ꕈg!p!ꕉ!p!ꕉC!p!ꕉF!p!ꕉ%!p!ꕉ!p!ꕉ!!!ꕊlp!!!ꕋV!!!ꕋ/p!!!ꕋlp!!!ꕌ!!!ꕍlP!!!ꕍX!!!ꕎk!!!ꕎ\!!!ꕎ|0 !!!ꕏ|X    !!!ꕏ|H!!!ꕏA!\!\!ꕥA@!M!M!ꕕ !"#$%&!!M!ꕒJKLMNOPQRST!!M!ꕕ!!M!ꕕ!u!M!ꕗ!^!M!ꕘK!!M!ꕘL!!M!ꕘ\!V!M!ꕛ٢! ! !ꕜM !! !ꕜ!!]!ꕝ !"#$%&!8O!C!ꕣ=`!8B!C!ꕥA !!!ꕦA !)N!)N!ꕲA`!)L!)L!ꕧ$/u!!]#!ꕦ$!!]$!ꕦ$!!]%!ꕦ$!!]%!ꕧA0!]!]!ꕪ$!M3!&!ꕪA0!]!]!ꕫ$!M6!'!ꕫA0!]!]!ꕫ$!M!ꕷA !ꕸ!ꕾ!ꕾ!ꕸ!ꕺ!ꕺ!ꕸ!ꕺ!ꕺ!ꕸ!ꕺ!ꕺ!ꕸ!ꕺ!ꕺ!ꕸ!ꕺ!ꕺ!ꕸ!ꕺ!ꕺ!ꕸ!ꕺ!ꕺ!ꕸ!ꕺ!ꕺ!ꕸ!ꕻ!ꕻ!ꕸ!ꕻ!ꕻ!ꕸ!ꕻ!ꕻ!ꕸ!ꕻ!ꕻ!ꕸ!ꕻ!ꕻ!ꕸ!ꕻ!ꕻ!ꕹ!ꕻ!ꕻ!ꕹ!ꕻ!ꕻ!ꕹ!ꕻ!ꕻ!ꕹ!ꕻ!ꕻ!ꕹ!ꕻ!ꕻ!ꕹ!ꕻ!ꕻ!ꕹ!ꕻ!ꕻ!ꕹ!ꕻ!ꕻ!ꕹ!ꕻ!ꕻ!ꕹ!ꕻ!ꕻ!ꕹ!ꕼ!ꕼ!ꕹ!ꕼ!ꕼ!ꕹ!ꕼ!ꕼ!ꕹ!ꕼ!ꕼ!ꕹ!ꕼ!ꕼ!ꕹ!ꕼ!ꕼ!ꕹ!ꕼ!ꕼ!ꕹ!ꕼ!ꕼ!ꕹ!ꕼ!ꕼ!ꕹ!ꕼ!ꕼ!ꕹ!ꕼ!ꕼ!ꕹ!ꕼ!ꕼ!ꕹ!ꕼ!ꕼ!ꕹ!ꕼ!ꕼ!ꕹ!ꕼ!ꕼ!ꕹ!ꕼ!ꕼ!ꕹ!ꕼ!ꕼ!ꕹ!ꕼ!ꕼ!ꕹ!ꕽ!ꕽ!ꕹ!ꕽ!ꕽ!ꕹ!ꕽ!ꕽ!ꕹ!ꕽ!ꕽ!ꕹ!ꕽ!ꕽ!ꕹ!ꕽ!ꕽ!ꕹ!ꕽ!ꕽ!ꕹ!ꕽ!ꕽ!ꕺ!ꕽ!ꕽ!ꕺ!ꕽ!ꕽ!ꕺ!ꕽ!ꕽ!ꕺ!ꕽ!ꕽ!ꕺ!ꕽ!ꕽ!ꕺ!ꕽ!ꕽ!ꕺ!ꕽ!ꕽ!ꕺ!ꕽ!ꕽ!ꕺ!ꕾ!ꕾ!ꕺ!ꕾ!ꕾ!ꕺ!ꕾ!ꕾ!ꕺ!ꕾ!ꕾ!ꕺ!ꕾ!ꕾ!ꕺ!ꕾ!ꕾ...binWdevetclibmntsystmpusruunixlost+found...as9asldardump lorder nm size strip maketouchsorttsortbsccacctcomcryptcatchgrpchmodchowncmpcpsetcpiocmtdddifffile find!grep"num#pr$rm%od&sum'tail(wc)xd*test+du,mv,ln,cp-r32-r3200.rmdir/mkdir0ls0l0lc0lf0ll0lr1stty1STTY2wi9503basename4date5echo6env7expr8kill9line:mesg;nicesleep?sync@teeAtimeBttyCunameDwhoEwriteFdirnameGfalseGpdp11Gu370Gu3bGu3b10Gu3b2Gu3b5GvaxHloginInewgrpJpasswdKpsLsuMtrueMridgeNipcrmOipcsPedPredQsedRdfSdlistTshTrshUcshVmailVrmailu!R QIH.textQ .dataHHRH@.bssI 0  !2$0 Hb[WX?@DHLP~T%p %% q  p :(T 4(, 4hX 4@0 4 $D"$ !%$D$$D!0A21 Z2#!! ~TǎPǞLǮHǾD@XXW@8~<p,#χ# /! ~<ǎ8@@WH@~Dq  -^ !0V(20@J4(202$p""(W"0o(20@d4(20$p""`W"HzVH t(" l PP 0+xj7Ћ^ RBȋFȓ"fؓ !p ! ttxe~Dǎ@HHWH@~Dpqp$ *lx' "&4) (p 0x!#"0/#pq0x!#" '( z( .*z( sz o!(&z| ( H PjXP`6hpxHzఆBȓxณx@(DHLPT࠶Xਸ਼\శ`p4 ~Dǎ@HHW@x T.0$'Bd ံx@@WP<@D~Hr..lp< x%"'&d -(&d $&ndhL/D LQ :,%&,(&d fLs ~HǎDǞ@Ǯ<PPWH ~4p#8Chz@(.  H@8l<pg^8@^?Qa1l&! 7Rb1L&# 3Td1,&' 1Xh1 8<pg^8@\?Qa1`&! 7Rb1@&# 3Td1 &' 1Xh18<pg^8@^?Qa1l&! 7Rb1L&# 3Td1,&' 1Xh1 @ 8<p2g^8@^?Qa1`&! 7Rb1@&# 3Td1 &' 1Xh1#F#,:C,3 ܐ 4 ȋ xD hzxz8<pg^8@\?Qa1`&! 7Rb1@&# 3Td1 &' 1Xh1 hz xz8<p.6g^8@^?Qa1`&! 7Rb1@&# 3Td1 &' 1Xh1 #@ Thzxz8<pg^8@\?Qa1`&! 7Rb1@&# 3Td1 &' 1Xh1 $hz xz8<.p5g^8@^?Qa1`&! 7Rb1@&# 3Td1 &' 1Xh1 p#\ hzxz8<pg^8@\?Qa1`&! 7Rb1@&# 3Td1 &' 1Xh1 hz xz8<p.4g^8@^?Qa1`&! 7Rb1@&# 3Td1 &' 1Xh1 hz@xznlz\^|zLzz#xR|8<l@@8|<l@g^8^?Qa1`&! 7Rb1@&# 3Td1 &' 1Xh1hzxz@|8<pg^8@^?Qa1`&! 7Rb1@&# 3Td1 &' 1Xh1(hz@xzl8<pg^8@\?Qa1`&! 7Rb1@&# 3Td1 &' 1Xh1thzxz@8|<pg^8@\?Qa1`&! 7Rb1@&# 3Td1 &' 1Xh1hz@xzl8<pg^8@\?Qa1`&! 7Rb1@&# 3Td1 &' 1Xh1hzxz|8<lg^8@^?Qa1`&! 7Rb1@&# 3Td1 &' 1Xh1Thzxz|8<pg^8@\?Qa1`&! 7Rb1@&# 3Td1 &' 1Xh1hzxzl8<pg^8@\?Qa1`&! 7Rb1@&# 3Td1 &' 1Xh1#z\hzxz8<pg^8@\?Qa1`&! 7Rb1@&# 3Td1 &' 1Xh1,hz xz8<.p3g^8@^?Qa1`&! 7Rb1@&# 3Td1 &' 1Xh1xhzxz@hz@xz@8p@hz@l< |<g^8^?Qa1`&! 7Rb1@&# 3Td1 &' 1Xh1hzxzhzxz8p@hzl< |<g^8^?Qa1`&! 7Rb1@&# 3Td1 &' 1Xh1#wB#ؓw2g^8^?Qa1`&! 7Rb1@&# 3Td1 &' 1Xh1~4HHWH@~Dpz&"p#W΀$v(0drrp(0d~Dǎ@HHW8!P88W?\`dhl~pሶﴶ (08ְ֠֐ (&u>WkP@^0Qa1l&! ;Rb1L&# 5Td1,&' 2Xh1 pqqpd  88 88 8 jpׁ[pm 8J8X@`HhP0 0~!t8B8 8[!0#!)! 08#V0p$0W&s.0Ppdρ48,p[pm pב[(Un8U\8{ pבjs `@[%' ^%# >%! 0Qa1H;Rb105Td12Xh1p!hp"p"hϑ8p[pm(phpב[Hs `@[%' \%# <%! 0Qa1H;Rb105Td12Xh1p!hp"p"hϑ8p[pm(phpב[  ﰀS<S8p$@WBBᐧ B05_5'5ЋRBBᐧ B05^5'5ЋRBBᐧ B05^~5'5ЋRJBBᐧ B05^25'5ЋQBBᐧ B05]5'5ЋQBBᐧ B05]5'5ЋQfBBᐧ B05]N5'5ЋQBBᐧ B05]5'5ЋPBBᐧ B05\5'5ЋPBBᐧ B05\j5'5ЋP6BBᐧ B05\5'5ЋOBBᐧ B05[5'5ЋOBBᐧ B05[5'5ЋORᐧ B05[H5'5ЋOᐧ B05[ 5'5ЋNᐧ B05Z5'5ЋNᐧ B05Z5'5ЋN`ᐧ B05ZX5'5ЋN$ᐧ B05Z5'5ЋMᐧ B05Y5'5ЋMᐧ B05Y5'5ЋMpᐧ B05Yh5'5ЋM4ᐧ B05Y,5'5ЋLᐧ B05X5'5ЋLᐧ B05X5'5ЋLᐧ B05Xx5'5ЋLDBBᐧ B05X.5'5ЋKᐧ B05W5'5ЋKBB5'5ЋKBB5'5ЋKtz&̓h. ᐧ! 7"zz" @Kz6 &hRH&h2J'z"z ؅ 'g ',gڋ0t' !z $.t 0VZz.t7 2!z0zA4>tz!p#zpc0#0V'Dg>Iǁ'xgzDz. !'Ч'f΋IlXI`XILWI@WI,z'ftz'ԓfXFBp&`W="=2=$p==(p=='='7'z4 Hfz'e2 "($e HB(@e`l(XeBB. 0SG zB'7SGzB'7S'7SGd7 SrGP 0S`G>z'7S8'7S F'7SF'7RF'7R؋F'7RF7 RF 0RFn' 0RrFPzF(tc"'  0R((cVEz>(c.' 0Qҋ(cE'0QEz !(^,  @ @ '7QL'7Q8Pz' '0P'0P.'0P'7Pd'0P'0P<'0Px'7Pb(ԓaD0z !(bP  @< @0'7 O'7 OڋXz    0O' 0O4' 0Ob'7 OLv' 0O.' 0OF' 0N'7 N(`B'  ` 0NBz !(jh  @T @H ' 7 ND'7N0\z  ' ! 0M'0MЋ:'  0M'7M|'  0Mt'0MbH'  0M@'7M*)^Z@z !(n  @t @h$p'7  ! L'7 L0`zp  p'  ! 0LF' 0L2>p'  ! 0L '7 Kp'  ! 0K' 0KRp'  ! 0K'7 Kx)@\?D'0KP?.z !(Z$  @ @'0J'7Jދz)d[0'0J'0J.'0Jx'7Jbd'0JL'0J:<'0J$'7J)|[>=z !(bH  @4 @(' 0I'7 Iz)Z4' 0IF' 0I22' 0I'7 Iv' 0H' 0HЋF' 0H'7 H)Yʋ*(Y.z !(f\  @H @<' 0G'7  Gxz*DX8' 0G6' !0G6' 0G'7 "F~' 0F' 0FJ' 0F'7 #F|*\W:Hz"*W*Wrz !(jt  @` @Tp'  0E'7 E"z*V@p'  0Ep' !0EX>p'  0E4'7 "Ep'  0D' 0DLp'  0D'7 #D*ȓU֋8t *Up   0DT82 *Uv'pF  0D7 + U:'pG  0Cڋ7zR+T0 p!  0C+0T7P +LT'p ! 0C,7 zV+\TB2p '! 0BЋ+pS6z !(Z$  @ @'0Bd'7BPz+Sn0'0B'0B.'0A'7Aҋd'0A'0A<'0A'7A~+R5Lz !(^D  @0 @$' 0A'7 @z+ȓR4' 0@' 0@2' 0@'7 @tv' 0@V' 0@DF' 0@&'7 @+Q>3'  ` 0?֋3z !(f`  @L @@'  0?p'7?\z,Pz<'  0?'0?:'  0>'7>Ƌ|'  0>'0>H'  0>p'7>Z,O2(z !(j  @l @`p'  ! 0='7 =ʋ,z,@N@p'  ! 0=~' 0=j>p'  ! 0=B'7 =,p'  ! 0=' 0<Rp'  ! 0<'7 <,XMދ0|z !(f\  @H @<  0<:'7<$z,|MB8  0;'0;ʋ6  0;'7;~  0;r'0;`J  0;>'7;(,LV.z !(jt  @` @T   0:'7 : z,K@   0:L' 0:8>   0:'7 9   09' 09‹L   09'7 9,ГJ-T ,J'  z!0#z 4'aRp z!0  'z !&l  @t @h$z`' ! 08'78v0z-IDz`' ! 08('08Bz`' ! 07'77ҋz`' ! 07'07Pz`' ! 07l'77V-H+$@ -@Hj'p  z!0#z 4'paRp z!0  pp'pz !&t  @ @@Xz`@'p !  06V'7 6@Nz-PG^HXz`@'p !  05' 05֋FXz`@'p !  05'7 5Xz`@'p !  05^' 05LZXz`@'p !  05'7 5-hF2(p -F'  z!0#z 4'aRp z!0  'z !&p  @ @|4z`p' ! 04'7  3@z-EHz`p' ! 03' !03Fz`p' ! 03\'7 "3Bz`p' ! 03' 03Tz`p' ! 02'7 #2-C&( -ؓCp'X  z!0#z 4p'XaRp z!0  XX'pXz !&t  @ @L@z`('X !  01'7 1\z-BL@z`('X !  01R' !01:J@z`('X !  01 '7 "0@z`('X !  00' 00^@z`('X !  00v'7 #0\.A$(z8؅.$Ab'.8A:  z!0#z &Qp z!0  z !&l  @t @h$z`' ! 0/P'7/:0z.T@ZDz`' ! 0.'0.؋Bz`' ! 0.'7.z`' ! 0.l'0.ZPz`' ! 0.0'7..l?J!z8.?"'pp.>p  z!0#z &pQp z!0  pz !&t  @ @@Xz`@'p !  0- '7 ,Nz.>HXz`@'p !  0,' 0,FXz`@'p !  0,Z'7 ,DXz`@'p !  0,' 0,ZXz`@'p !  0+'7 +.ؓ<z8.<'/<  z!0#z &Qp z!0  z !&p  @ @|4z`p' ! 0*'7  *@z/,;Hz`p' ! 0*D' !0*,Fz`p' ! 0*'7 ")z`p' ! 0)' 0)Tz`p' ! 0)|'7 #)b/D:0pz8x/h:jx'XX/|:BX  z!0#z &XQp z!0  Xz !&t  @ @L@z`('X !  0(R'7 (:\z/9ZL@z`('X !  0'' !0'΋J@z`('X !  0''7 "'@z`('X !  0'R' 0'<^@z`('X !  0' '7 #&/8B W1 z@@ z@ z!z./ԓ7'&0&^z @r/7Ǘ07j007X'"0L76'&0%0p7!B  W z0@ z0 z!z01&\ؔ 0@ċ@0@8'!7z '" !# 060!(7z @('"z05ދ( "zz"0Г57z '" !#P'!!z!05b!7z"z Ǘ 15,1L5'8)zz"/147z '" !#14X!B  W z0@ z0 z!z01&T 0@80@p'!'z0 1 Ć 1ȓ3!(7z <  ! (z"7z@  "z 'z1z z, 'z1 h'! 7"zz" z. 'z1 Ǘ 1222'8)zz"/2@2d!!2t2B!B  W z0@ z0 z!z01&\ؔ 0@ċ@0@8'!7z '" !# 21l!(7z @('"z21( "zz"207z '" !#P'!!z!30!7z"z Ǘ 3(0h3\0V'8)zz"/30$7z '" !#3/!B  W z0@ z0 z!z01&T 0@80@p'!'z0 1 Ć 3ؓ/(!(7z <  ! (z"7z@  "z 'z1z z, 'z1 h'! 7"zz" z. 'z1 Ǘ 4-4$-'8)zz"/4P-!!4-~ppr'7'7tz 'z1z tz 'z1z LJ2x(!z $.x 0\ x81z02p.xpc 0LJ2|(!z $.| 0̈ |81z02p.|pc 0`z> 4+'7@4+n z> 4ԓ+B'74+ t z 0 5*`@W'' \%# <%! ?Qa1H7Rb103Td11Xh1x' 0t' 0 z 0 5(**`@W'' \%# <%! ?Qa1H7Rb103Td11Xh1z @!0J : .$ ! 2 @xTp'7p$b %p'7pċ2p'7p5H(ҋ pvz  @DᐶH :zp&xWvz&@DH @@DHp@DHNvz5d' @@DH5' \@DH > @DH `@W%' ^%# >%! ?Qa1H7Rb103Td11Xh1 @DᐶH xz84p&W@DH5& $@DH  @DH@DHn W%' \%# <%! ?Qa1T7Rb1<3Td1$1Xh1 n0W'' ^%# >%! ?Qa1T7Rb1<3Td1$1Xh1 . >$4p`@W'' \%# <%! ?Qa1T7Rb1<3Td1$1Xh1 n W%' \%# <%! ?Qa1H7Rb103Td11Xh1n0W'' ^%# >%! ?Qa1H7Rb103Td11Xh1. >$C(p`@W'' \%# <%! ?Qa1H7Rb103Td11Xh1n W%' \%# <%! ?Qa1T7Rb1<3Td1$1Xh1 n0W'' ^%# >%! ?Qa1T7Rb1<3Td1$1Xh1 . >$3p`@W'' \%# <%! ?Qa1T7Rb1<3Td1$1Xh1 n W%' \%# <%! ?Qa1H7Rb103Td11Xh1n0W'' ^%# >%! ?Qa1H7Rb103Td11Xh1. >$Dp`@W'' \%# <%! ?Qa1H7Rb103Td11Xh1Ln W'' ^%# >%! ?Qa1T7Rb1<3Td1$1Xh1 . >$0p`@W'' ^%# >%! ?Qa1T7Rb1<3Td1$1Xh1 n W'' \%# <%! ?Qa1H7Rb103Td11Xh1. >$0p`@W'' ^%# >%! ?Qa1H7Rb103Td11Xh1~pǎlǞhǮdǾ`\W  ?1`zWX   r(  r( 28 b( ^ b( B lD w878H70<70070$ !<6ؓ`<XXWH~Dp7zl.p  z 87p '@ $Nl !4 '0 h.p>l Trl.p!  8'0 .p>l   c N!^ NL  c Nq 0 .p>l  T7  c! !0 Z N0 H.p>l  4R6b7V4'0.p>l~DHHW@lvlJTJ&0ึ7L 7P*` 7lN N 7:@7H "! ᐧ!_B ʓ 7 "! 7! "! =7! t#! 7! T#! =7! 0$! 7ħ! $! =!z N4@@W@8~<p;z(x8 ;z"z;z ߁( "'q! ~<ǎ8@@WX<@DHLΠ ΰ P ~T 0 !p"2     )`P/Qހ p}   |Q  b( zN &W   W  . $W z ZT  )(! )   pq}8~TǎPǞLǮHǾD@<XXW@48~<pސЋ Wq;zz'~<ǎ8Ǟ4@@W@88ȧ~<99L9v9̓jpހЋ>  b(:>:,:$z(pZ  " 8$:,ڋ0:<ʋ :L:\z(b^p8W:lV:rF:b6:R&:Bz:,q;z~<ǎ8@@W@~P  p<` & ᐋ q~Dǎ@Ǟ<Ǯ8HHWW8 ȧ~4zpzJFpሣqzHDpH zzp>Wz$ p>(W< >\ >Tz2   >x > 2@z P  zpAzpAFz8qzpAzpALD<z2zzpAzpA ~LǎHǞDǮ@Ǿ<8PPWH8<@~D:Ҁ@zpz!z! *'z" ' "z"/ qz @z"zz@gZ%' l%# D%! 0Qa1t&! 9Rb1T&# 4Td14&' 1Xh1  qzz~Dǎ@Ǟ<Ǯ8HHW@8~< @@zP5(20%p0z1z30t @z"zz@gX%' n%# F%! 0Qa1h&! 9Rb1H&# 4Td1(&' 1Xh1x~<ǎ8@@W8 ȧ~4p@z@@zZP>z>dPP>@z@ʋ pP@z z@@zpp~488W8P@z288W0 @ȓ\00WH48<@~Dzrt84p>W.PϠÕz?XΆzzz'$ p""?W"z,(p?W(?lrTz2.p?@W(z|?.?   z'p#"A z'p#"A .zpAzpA ~Dǎ@Ǟ<Ǯ8Ǿ4HHW@48~<@zr@@:P?z?ēPP?@@@@z@@z ȊJP?z?ZPP?@z@̓l@z@@z@pP ~<ǎ8Ǟ4@@WP@DH~Lpzp @z҆p`zTz z(dz!AP ሲPPrz(^z \ሊ 6z(z!AP ሲPP@z f ~LǎHǞDǮ@PPW@~<p@0@,@\pz@l^@xNz@< @,@@(~<@@W888W8B0v88W8B8xBzBBz u0B<V88W8BX88WH@~DBhq:B ซ  BBpPPBh BBB!BBltB(7^~Dǎ@HHW8D"t88W@8~<BzณrހHqz~<ǎ8@@WP48<~@q 8  z  (R(JpCW ^  L$ DR4 D .D8 `  L$ DPҋ4 DhDd ^  L$ DZ4 D6Dȓ&ސD ^  L$ Dދ4 EEސE0^E8z ( !E\F !*   Ep ᐧ.DHLp xg^D x<;Qa1h&! 5Rb1H&# 2Td1(&' 0Xh1 | | | P(E~@ǎ<Ǟ8Ǯ4PPWP48<~@q !   !^  L$ Eȓ4EfEVz ! $(!  (! pEWސFvސFjސF ^F(z ( !FL !*   F`f ᐧ.DHLp xg^D x<;Qa1h&! 5Rb1H&# 2Td1(&' 0Xh1 | | | P(Fb~@ǎ<Ǟ8Ǯ4PPWH4~8  !^  L$ F4FFГzH  ,pF*pFpFGz !*   G> ᐧ.<~@Dp xg^< x<;Qa1h&! 5Rb1H&# 2Td1(&' 0Xh1 | | | P(G4:~8ǎ4HHW@8~<pzzzzGP~<ǎ8@@WP48<~@q  z  ((  `  L$ Gx24 GGGz ( !!G !*   HJ ᐧ.DHLp xg^D x<;Qa1h&! 5Rb1H&# 2Td1(&' 0Xh1 | | | P(H F~@ǎ<Ǟ8Ǯ4PPW@8~<pzH@& ~<ǎ8@@WXOPQRSTUVWXYZ[\]^_`ab8<@D~HqDZ zz zzH`zzz(H*'0(20d0(20 0 #L$ ! HJ4 ! H&Hԓzzz(Hz  (! r (!  X,zz( z:zz( zI Z ᐧ.LPTp xg^L x<;Qa1h&! 5Rb1H&# 2Td1(&' 0Xh1 | | | P(I@V~HǎDǞ@Ǯ<Ǿ8XXWP8<~@qzz z I`$zzI'0(20d0(20 0 #L$ ! I4 ! InIؓ^zBIDz  (! 0 (!   J ᐧ.DHLp xg^D x<;Qa1h&! 5Rb1H&# 2Td1(&' 0Xh1 | | | P(J4~@ǎ<Ǟ8PPW@8~<pzJP~<ǎ8@@W@8~<pzJp~~<ǎ8@@W@ ~<qN"J ~<@@W@ ~<qB"J ~<@@W@ ~<q"J^ ~<@@W@ ~<q"Jؓ ~<@@WH ~8zpJWᐧ<.@Dp x g^< x<;Qa1h&! 5Rb1H&# 2Td1(&' 0Xh1 | | |P(K馋$ K$~8HHWH4~8qǁz ^  L$ K@4KXKpާt jf  T(p K芋8pKbKRᐧ<KЧ@~Dp xg^< x>;Qa1h&! 5Rb1H&# 2Td1(&' 0Xh1 | | | P(KؓFKf~8ǎ4HHW8   (  (  *   cMPMz Nz N&  c& & L(Vl $( N ( FpLW M, LD88W@8~!z7qz33B2" !0q2z'.z !Bg ~Dǎ@Ǟ<HHW?PTX\`~d rTp Tp y 0,wƋ@TpTp Tp x0,wTp Tp x0s,wFs !ϡTpTpzP'jQx|r7z(!j(^s^,0Q*|m0 !yTX|TX'jQ|Vrz(!jQ{7z(!j(,Q*{m0 !y8TX|TXUZ(Q*>s{l0 !xTXTX ሲBᐧ~dǎ`Ǟ\ǮXǾTPWW@Tl4TlpTlThQԶThzF@ ThQ0z,Qz RdzRēzQГy@@W@ "BBd0 ``!w  @@W  "BBdW@ "0 ``!v  @@W ċJ !z082110z !z (Ȳ̲ΰаѶز !z $W8 "2zzzȄFBpS8W̋8̋,̋ ̋SP88W8ȶzF  ,̋(̋̋SpӒ88W  "zW  " W@8 ~< b(p4p"pSҢѶp~<ǎ8@@W ц "W ц "W ц "\\zW8 "\z\P\zzS88W@0 1 Ѷ@ز0ܲW@(( pSWg( d(pTW0̋b " PXe@v0X!PXYxzT4 PXn0  ZzLdPX0 ``!q6   @@WH@~DdzЎրpP`.ր  0PXpPX#l!8pц"!8p`~Dǎ@HHW`DHLPTXz~\qz z z  z 0 pUxW P  0 !o   !   P  0 !oP   s2!  !#   V P  0 !n  0  c#!  !# s2!  !# !   P  0 !nP  0  c#!  !#0  c#!  !# s2!  !# !  UNpcc P  ! 0 !mp  0 #!  +#0 #!  ,# s2!  !#   a*pUW P  ! 0 !l   !   P  ! 0 !l`   s2!  !#   V P  ! 0 !k  0  c#!  !# s2!  !# !   P  ! 0 !k`  0  c#!  !#0  c#!  !# s2!  !# !  U^ h *!z $*P!P!c!UГ~\ǎXǞTǮPǾLHD``W`DHL~PrzV ሶp'qሣnTZ*' ^%# >%! ;Qa1d5Rb1L2Td14&' 0Xh1 X &(!  (! pUWYTz܋\ q~\Xp!M@TWYTzTPVV.T! V^T0PVXpAM@T WYTz VƦ(eYxzVƆz> 0P&PVj~PǎLǞHǮD``W zz" ! W8@1z0H88WP@DH~L pq qpYPXYYkYȎ(z YЎ܎Y$ YY0  YY!fL QY܎P Y҆ pYІYҲY0Y̲Y(!e P Y Z%PZP Zx pZ ܆Z޲Z0YZ(!eT YZ$Z( 0ZZ,(!e~LǎHǞDǮ@PPWH@X8~D_X<* 8a^0zp'dz'!X~Dǎ@HHWh@~Dp~ xnPX(' x ^%# >%! ;Qa1\5Rb1D2Td1,0Xh1 P\XzdTr>HNT!$"#1L b(.L b(XX`<T~$TjXV`0\!bq~Dǎ@hhWxDH~LpAz"΀ dhJd7 1z1d00z18Nl.prtu(z  z  u0 d!a PX PXPXuTPT.XV02"z14`0 P!arPXPX~LǎHǞDxxWH@~Dp b(z z `\Jz.*pXWz(2HWz (z,z0"YY 2~Dǎ@HHWD~H"X! pXԓ:XԓXȓ6  ГXԓX pXXԓXԓXȓ  ܓXԓXX DpXXԓbXԓXȓ^  >Xԓ0`![0 `!^` tdx|td b( ppXp PX.PXPXq (@0L!Z0 L!^PXPX P`z!~HǎDW8 ȧ~4pYxzNJY YxzzYxpp~488W8YxzY@&YxzYxYxzp88W8YPXYYYY=YY88W`@D~HpYX[:'!>LX Z2!8\Bwp Z~HǎDǞ@``W8 ȧ~4p qPZzpz2PZQPZZpZ[ZpZA͸ZpPZPZPZzUPZP͸WP͸PZzQPZ~488W@48~ !~~ j! !!p""|0,#h~ ~(40 >p !~~ j! !0~#! ~zȓKp 7 #! ~~ ~(40 = !~~ 0j! #! !!p""|0?#y!!p""|0A#d'qj"2@RC4 @r4 0ȅ2N2 3@ 'j"2@94@0C4p23w W3 0 X  X ~ ~(40 K(<j 0,{K Xjaf'AFXXZ Xjp$ X a  f ' A  F XXQj hj HH p~ ~(40 , !~~!0j"#0E182090+1rpx0W0D^N0d1P :0e<!   p r   h@~410~$ !  ! 02 0#  ظXI P|>K (    h@~410~$ !  ! 02 0#  XI |K pR  $   q0~C10~$ !  ! 02 0#  TXI   8 ,|0K 0~C10~$ !  ! 02 0#  XI @,|HKq,|`K~~!j0X.XXj 0 X! XjHh~ ~(40 ' !~~!j"p|0,~1~#rz0,pxpWr r|x64v/h~ ~(40 & !~~!j"*~~F!vXr-TvXr.(E5~ ~(20 %~~ j"=\ >H$X7T X74~~!X7~ ~(20 $~~ j"=$ X7~~!X7\X7<1&234v>CD0#X~ ~(40 #D !~~ 0j! #! !*:* 0'# 0\#~ ~(40 " !~~ j!  !  '! 0  t \!pxW!!!!p!T!'6!\! rz,\G|K ~2! ~|KLZ~ ~(40   !~~!j"*0~~|#Kɠ~LǎHǞDǮ@PPW $ !  W@~~(40 ~~@j@W8~ !  $ !  ~$~ 2!  88W~!~W~W`@DHLPT~XP^\0 #"( + "  -^\Q^\ p1@ΐ. ~Hΐ0 Aj0ސ ̈ *ސ ̈:zA@ސ ̈* ސ ̈:zpޠeΐ. TB 9Ȍ19#59'3( E e 0@ (@@0@ (@@ @+ @-1p@GDD@>@B*  p@GDD@0 p,=:yp6p?qq5yq`( K ?0@@A@ q5'@sA@  6! #;K;;#\ 2  ~XǎTǞPǮLǾHD@``WH@~Dpq' ~Dǎ@HHW80:88Wp [B8ȧTT.X88W0<@DH~Lq ހ /@.P P ~pW dPP!9TX"@B~r!4CA@P pHq%( 6.P)  ~~LǎHǞDǮ@Ǿ<W0~s@1tC@ p:G @ /$A B!  1~W@8~5p(`pq91A 31906~HǎDǞ@PPWP48<@DH~LȎH! ! жȶܶրqpN$ x((lx! ( 2܊Ȃ  !(hրp0qp((q$ sqp'( (&l   N ܶpp  P! ! xF p(P ض~LǎHǞDǮ@Ǿ<84PPW! !܊! WP<@DH~Ly   s  Rq(+p#X((p(psp~LǎHǞDǮ@Ǿ<PPW0+K "AC1!WAC$AhAC%hAC&hACWQWPX%AC1QCGxBBSD"vt ('"AC8('p'"$AC4$X$AhAC!FhAC"     BG G!    g   ,Q"%(  D b j D p     ~@ǎ<HHWH<@~DpǐLJ D   ph  ph' (. ( d   ~Dǎ@Ǟ<HHW8 ȧ~4p  *        |'Q!R D D ph%  ' ph7! ,~488W@8~<p  ( ppPWh( ppph^씧*    ph& ppPWh VW @  ~<ǎ8@@WP pRh a!` !WH@~Dq l~Dǎ@HHWH<@~Dr '$~Dǎ@Ǟ<HHWH<0@~Dr 0 (+R a(a( <r NwX   @   "    t  )r!  )a!"  ph~Dǎ@Ǟ<HHW@~<p.`W .`&0 2  &' V  ~<@@WX?@DHLP~Ts @  aP/\ (  )Z  ' ph7! X (  <~TǎPǞLǮHǾD@XXWP<@DH~Lp   W |tlǧ" !D  40,'  W     )V  H )     ,^   aP/\ +! (() )((f  ' ph7! hBW  D ,,-  ~TǎPǞLǮHǾD@<XXW@\.`P.\(0 2  . xn  @@WP.p0>@DH".L @.M.p.@.DPPW!![W[W![W!;0H[ڤW[ ڎW[W2![lW2![PW[BWC2!,[W[W [W!00[ٺWH .(N0n8@HPX` W`X .(N0n8Ɏ@ɮHPԩة>^觾[ [W [W[. W2![ذWA0~: r:2rqrp?5p?:pprq3rp?:ppp:sp2~ǎWPT.> PPW0@ A#1 ! 1Wp  $Wpǀǐ Ǡǰ $WWpހވސޘޜǼ @P PP$PpRUhP$%py}kg,P$(VP p:w]ѡ[q" ,(0(ְ(Fp@c(stdxX܋ ` d` P$([P  ,(0(ְ(` d` (P$[PQ̡P! ! ,(0(ְ(` d` 'Π- 8ы0):@0CAMр ѡ(P$[P Q фP р}-!ш},(0(ְ(` d` / qфыh` d` / qфы4` csd(u$+\-` d#h.l*x0Āelh%ox0XeEfgGn9ld`  d` @   "  !`d` }; -!10@@ V 8@  /  +!10"  /  !10 @ /00 0ѡ $@ZPECѡMѡ p } u ^d` } pq 5#"0ѡP n b V J@  6@ *d`   d`  @     0 9: @  z WC0_D0_D0d` - p&@ 4  a@ ' - pX Oo620x 0 "X     @ / &  g `h`  0!#иި0,@0ȧN(ް ް80 - D  5  +  g ю 0ѡaP P .aP6 QaP PP ׶`p8gި 06P,QPU):RECAaFSRQaVrgaga,- +aea E`rvp #2#: @ / &  g `h`  0<#0,@0ȧN(ް Dް80` P,/Q)-0!-! B +!    ! E00@qA0- '1qA@Aq@ `  .'qF<Ad &$  A@> QP&#1qA@Aq@@p` #H  @ &   !  g `h` 0#ި0,@0ȧN(ްް8ި ,`  FF=11=CCAM 0AMAP,VA@ E@ p}@gd``  >    @ިpެް/,(0(ְ(zkg(P$(VPp: w q&,(0(ְ(@ިpެް@ekd,$( DA4,(0(ިިְ( ֠ި/,(0(ְ(Jkd(P$(VP@:0D A&,(0(|ְ(ިpTkg($( wq( ,(0($ְ(     / ֠ި/,(0(ְ(Jkd*P$(VP@<0D A&,(0(tְ(ި fpp\kg,$( wq,,(0(ְ( ֠/,(0(ְ(Jkd*P$(VP@< D A&,(0(`ְ(H{ p   $( @  @ , 2 ! . 00  +    pހؐވذސޘޜWH@~Dp  W & !   D 6ހh  @  x(  ! p!h!7 R   .   W    ~Dǎ@HHWh x(  WP@DH~Lr @D''!'n )7p) ~LǎHǞDǮ@PPW2!6[W2![WPHx~Lp(,j~LǎHPPWPHx~Lp(,"~LǎHPPW`?8<@DH~Lp.ޠߨߨ:T 2pߨ pp  :X ސ Jp  C@:8 6p  : @$:@$ 1 P@$`^P5%cR:W^XP'86 0":B0C9"5 4r+!+ @$0:  ?05N?:@ 5p  5 @$0:  ߨ( ( :߹( 0 &009 4 @$05p (  5(Tߨ &1ߨ  &0   9( ~LǎHǞDǮ@Ǿ<8`ߨ`W   ?  ?0 6    W6    W @(#)pass0.c 6.1 87/11/24 @(#)paths.h 6.1 87/11/24 @(#)sgs.h 6.1 87/11/24 @(#)systems.h 6.1 87/11/24 @(#)pass0.h 6.1 87/11/24//usr/tmp/TMPDIR/usr/tmp//tmpXXXXXXd@ %s: assembler - %s PDP920 System V Release 2.0 9/1/83ljasljascannot exec ljasasasasasasasas.orUsage: %sas [options] file Nonexistent file /tmp/tmp/tmp/tmp/tmp/tmp/tmpasm4/tmp/usr/bin/m4Assembly inhibited wCan't open %s Can't find %s Try again status %o Fatal error in %s AAA@P %SRCS% @(#)instab.c 6.1 87/11/24 @(#)systems.h 6.1 87/11/24 @(#)symbols.h 6.1 87/11/24 @(#)instab.h 6.1 87/11/24.file.ln.def.endef.val.scl.type.line.tag.size.dimalignblockcommoncsectdsectexternal externd!global"lcomm#origin$byte%code&data&equ'space(word)halfword*double+addand aslbasrcchkcslhdlslddlsrelsl`lsrampynotsubaddiandiaslirasrischkicslixdlslitdlsriudivilsliplsriqmpyineginotioriremisubixoricallrScbit dcomp8dfixr1dfixt0dfloat9divdradd3drcomp:drdiv6drmpy5drneg2drsub4eadd,ediv/empy.esub-fixr!fixt float)lcomp(ldregsClusAmakedr7makerd'negor radd#rcomp*rdiv&readNremretWrmpy%rneg"rsub$sbit sebjsehzsus@tbittransDwriteOxor loadloadploadbloadbploaddloaddploadhloadhpladdrladdrpelogrLelogwLitestLtreadcLtreaddLtwritecLtwritedLnopflushLrumBtrapexitLcallkcall[trap;loop move movei test Ptesti Pstore storeb stored storeh br bri illegal expression operandillegal expressionillegal expression operandsillegal expression operandsSymbols Difference Must be Same Typeillegal expression operandsillegal expression operandsillegal expressionDon't Known This Section!!!<!t!" "X""#<##$ $l$%%P%%&&@&|&&'0'l''( (\(()),))*+4+@+T+`ttt+t,<,,--<-P-d----.t..4.P.//0p1235\5t6888:X<,?T@@BxD$EGLI|KNPxRUWpYYZZZZ]H_b ddddddde ef@ffttttfgi0ihjDjdjkk(k|kkkmoprTs++++++iiiiikhkFkFkFkFyacc stack overflowsyntax errormultiply defined labelAlignval Out of RangeOnly Absolue value in ValCount Out of RangeByteval Out of RangeCount or Byteval Forward or External Not AlllowedNegative or Null Size of CommonOnly Absolue value in SizeOnly Absolue value in ValSymbol cannot be a LcommonLocctr no Forward or External Label or not AbsoluteBackward ORIGIN Not Allowedonly 1 .file allowed.file name exceeds 14 charsVal Out of RangeOnly Absolue value in ValVal Out of RangeOnly Absolue value in ValUnknown Symbol Type in ExpressionUnknown Symbol Type in ExpressionUnknown Symbol Type in ExpressionUnknown Symbol Type in ExpressionMust be In CODE SectionUnknown Symbol Type in ExpressionMust be In CODE SectionUnknown Symbol Type in ExpressionEntry Point Out of RangeOnly Absolue value in ValVal Out of RangeOnly Absolue value in ValMust be In CODE SectionUnknown Symbol Type in ExpressionVal Out of RangeOnly Absolue value in ValMust be In CODE SectionUnknown Symbol Type in ExpressionSyntax ErrorSyntax ErrorSyntax ErrorVal Out of RangeOnly Absolue value in ValSyntax ErrorValue Out of RangeOnly Absolue value in ValStore must be in DATAUnknown Symbol Type in ExpressionStore must be in DATAUnknown Symbol Type in ExpressionStore must be in DATAUnknown Symbol Type in ExpressionStore must be in DATAUnknown Symbol Type in ExpressionMust be In CODE SectionUnknown Symbol Type in ExpressionMust be In CODE SectionUnknown Symbol Type in ExpressionSyntax ErrorMust be In CODE SectionUnknown Symbol Type in ExpressionSyntax ErrorMust be In CODE SectionUnknown Symbol Type in ExpressionSyntax ErrorMust be In CODE SectionUnknown Symbol Type in ExpressionSyntax ErrorMust be In CODE SectionUnknown Symbol Type in ExpressionValue Out of RangeOnly Absolue value in ValMust be In CODE SectionUnknown Symbol Type in ExpressionValue Out of RangeOnly Absolue value in ValMust be In CODE SectionUnknown Symbol Type in ExpressionValue Out of RangeOnly Absolue value in ValMust be In CODE SectionUnknown Symbol Type in ExpressionValue Out of RangeOnly Absolue value in ValMust be In CODE SectionUnknown Symbol Type in ExpressionNegative Value in Count Not AllowedBeware if Optimised optionUndefined symbol in Count Undefined Symbol in Count Negative Value in Count Not AllowedCount Not Absoluteundefined symbol in 'DATA or CODE' PseudoExpression Must Be Data or CodeExpression term Not Same TypeSection and Pseudo Must Be Same TypeUndefine Right Symbol in 'DATA or CODE' ExpressionUndefine Left Symbol in 'DATA or CODE' ExpressionExpression Term Must be Same Typebad type in 'DATA or CODE' Pseudoundefined symbol in 'equ' expressionUndefine Symbol in 'EQU' ExpressionUndefine Left Symbol in 'EQU' ExpressionIncompatibility Beetwen Symbol in '=' Expressionbad type in 'equ' expressionundefined symbol in 'DATA or CODE' PseudoExpression Must Be Data or CodeExpression term Not Same TypeSection and Pseudo Must Be Same TypeUndefine Right Symbol in 'DATA or CODE' ExpressionUndefine Left Symbol in 'DATA or CODE' ExpressionExpression Term Must be Same Typebad type in 'DATA or CODE' Pseudoundefined symbol in 'equ' expressionUndefine Symbol in 'EQU' ExpressionUndefine Left Symbol in 'EQU' ExpressionIncompatibility Beetwen Symbol in '=' Expressionbad type in 'equ' expressionValue Byte OverflowOnly Absolue value in ByteValue Byte OverflowOnly Absolue value in Byteillegal floating point expressionillegal fixed point expressionData type not allowed hereSymbol Description not AllowedSymbol Description not AllowedSymbol Description not Allowed @(#)gencode.c 6.1 87/11/24 @(#)symbols.h 6.1 87/11/24 @(#)systems.h 6.1 87/11/24 @(#)instab.h 6.1 87/11/24 @(#)gendefs.h 6.1 87/11/24 @(#)expand.h 6.1 87/11/24 @(#)expand2.h 6.1 87/11/24 @(#)systems.h 6.1 87/11/24Illegal flag (%c) - ignoredUnknown Optimisable LengthUnknown Optimisable Length.rUnable to open input fileCan't Allocate MemoryCan't Allocate Memory.text(text).data(data).bss(bss)7 %SRCS% @(#)symbols.c 6.1 87/11/24 @(#)systems.h 6.1 87/11/24 @(#)symbols.h 6.1 87/11/24 @(#)symbols2.h 6.1 87/11/24Symbol table overflowHash table overflow~~( ********************************************************************* SYMBOLS TABLE ********************************************************************* name value class section --------------------------------------------------------------------- #%-14s %-15s %06x DUM TVDEF EXTERN Undefined Absolute data (10) .text (15) .data (14) .bss %3d cannot realloc string tablecannot malloc string table@ @(#)code.c 6.1 87/11/24 @(#)systems.h 6.1 87/11/24 @(#)symbols.h 6.1 87/11/24 @(#)codeout.h 6.1 87/11/24 @(#)gendefs.h 6.1 87/11/24 @(#)instab.h 6.1 87/11/24 @(#)alloc_li.h 6.1 87/11/24 DCan't Allocate MemoryCan't Allocate MemoryCan't Allocate MemorySection Not Allowed for LI~Section Not Allowed when flyflop sectionSection Not Allowed @(#)expand1.c 6.1 87/11/24 @(#)systems.h 6.1 87/11/24 @(#)symbols.h 6.1 87/11/24 @(#)expand.h 6.1 87/11/24 @(#)expand2.h 6.1 87/11/24 @(#)systems.h 6.1 87/11/24 @(#)gendefs.h 6.1 87/11/24000&0Unknown SDI type What is This Section!!!!Not Use this Section with OptimiseUnknown SDI TypeTable overflow: some optimizations lost (Labels)RftllltUnknown SDI type What is This Section!!!!Not Use this Section with OptimiseUnknown SDI TypeTable overflow: some optimizations lost (SDIs)Table overflow: some optimizations lost (SelSet) --------------- elm ssentry ------------- sdicnt :%d itype :%d minaddr :%d maxaddr :%d labptr :%x constant :%d  @(#)expand2.c 6.1 87/11/24 @(#)symbols.h 6.1 87/11/24 @(#)systems.h 6.1 87/11/24 @(#)expand.h 6.1 87/11/24 @(#)expand2.h 6.1 87/11/24 @(#)systems.h 6.1 87/11/24@(#)errors.c 6.1 87/11/24 @(#)systems.h 6.1 87/11/24 @(#)gendefs.h 6.1 87/11/24Too many errors - Goodbye Warning:  Assembler: %s as_line %u(cline %u): %s%s  @(#)addr2.c 6.1 87/11/24 @(#)systems.h 6.1 87/11/24 @(#)symbols.h 6.1 87/11/24 @(#)instab.h 6.1 87/11/24 @(#)gendefs.h 6.1 87/11/24 @(#)codeout.h 6.1 87/11/24 @(#)expand.h 6.1 87/11/24 @(#)expand2.h 6.1 87/11/24 @(#)systems.h 6.1 87/11/24`phDisplacement OverflowDisplacement OverflowUnknown Address SizeDisplacement OverflowDisplacement OverflowUnknown Address SizeDisplacement OverflowDisplacement OverflowUnknown Address Size.dataDisplacement OverflowDisplacement OverflowUnknown Address Size.bssD'ont make Difference with ExternalUnknown Symbol TypeUnknown Relocate Size SymbolOverflow Number of RelocDisplacement OverflowDisplacement OverflowUnknown Address Size.text.data.bssD'ont make Difference with ExternalUnknown Symbol TypeUnknown Relocate Size SymbolOverflow Number of RelocDisplacement OverflowDisplacement OverflowUnknown Address Size.text.data.bssUnknown Symbol TypeUnknown Relocate Size SymbolOverflow Number of RelocOnly Data Undefine Symbol is Allowed Displacement OverflowDisplacement OverflowUnknown Address SizeD'ont make Difference with External Symbol Type Must be CODEUnknown Relocate Size SymbolOverflow Number of RelocSymbols Must be in the CODESubtract External Symbol Not AllowedSymbols Must be Same TypeDisplacement OverflowDisplacement OverflowUnknown Address Size Difference between Symbols not in Current SectionUnknown Relocate Size SymbolOverflow Number of RelocSubstract External Not AllowedSymbol and Section Must be Same TypeDisplacement OverflowDisplacement OverflowUnknown Address SizeD'ont make Difference with ExternalUnknown Relocate Size SymbolOverflow Number of RelocSymbols Must be in the DATASymbols Must be in the CODEOdd DisplacementOdd DisplacementOdd DisplacementOdd DisplacementPL,LLOverflow Number of RelocSymbol with Unknown TypeDisplacement OverflowDisplacement OverflowUnknown Address SizeDisplacement OverflowDisplacement OverflowUnknown Relocate Size.dataOverflow Number of RelocUnknown Section typeOptimize Type not AllowedOptimize Type not AllowedOptimize Type not AllowedOptimize Type not AllowedOptimize Type not AllowedOptimize Type not AllowedOptimize Type not AllowedOptimize Type not AllowedOptimize Type not AllowedOptimize Type not AllowedD8`\0$dT(4dP%srcatwrwwww+w(text)(data)(bss)Cannot Open Output File : ERRNO = %dCannot Open Temporary (symbol) FileCannot Open Temporary (line no) FileCannot Open Temporary (list) FileCannot Open Temporary (gbl sym) Filetrouble writing; probably out of temp-file spacetrouble writing; probably out of temp-file spaceCannot Open Temporary (gbl sym) Filetrouble writing; probably out of temp-file spacetrouble writing; probably out of temp-file spaceCannot Open Temporary (listing) FileCannot Open Temporary (listing) FilePP-1+0P %SRCS% PPP|sort/bin/sort/bin/cat @(#)addr1.c 6.1 87/11/24 @(#)systems.h 6.1 87/11/24 @(#)gendefs.h 6.1 87/11/24 @(#)symbols.h 6.1 87/11/24 @(#)codeout.h 6.1 87/11/24.file%08x %5d %06x %-8s %s%c%08xNULL %5d %06x %-8s %c %5d %s%c %s PAGE %d %c------------------------------------------------------------------------------------------------------------ Ass. line No PC Ass. Code assembler input file line ------------------------------------------------------------------------------------------------------------ Undefined Section NumberNot Allowed Type of SectionIllegal structure, union, or enumeration tagToo many array dimensions for symbolic debug""*"8t*Unbalanced Symbol Table Entries-Too Many Scope Beginnings3 @(#)codeout.c 6.1 87/11/24 @(#)systems.h 6.1 87/11/24 @(#)symbols.h 6.1 87/11/24 @(#)codeout.h 6.1 87/11/24 @(#)gendefs.h 6.1 87/11/24 @(#)instab.h 6.1 87/11/24 @(#)bool.h 6.1 87/11/24 @(#)alloc_li.h 6.1 87/11/24 Þ`ƎPNumber of bits Not AllowedNumber of bits Not AllowedCan't print source listingJ``ʬ``````````````````````````````````ʜ.Invalid action routineUnbalanced Symbol Table Entries-Missing Scope EndingsUnknown li type @(#)getstab.c 6.1 87/11/24 @(#)systems.h 6.1 87/11/24 @(#)gendefs.h 6.1 87/11/24 @(#)symbols.h 6.1 87/11/24 @(#)obj.c 6.1 87/11/24 @(#)sgs.h 6.1 87/11/24 @(#)systems.h 6.1 87/11/24 @(#)symbols.h 6.1 87/11/24 @(#)gendefs.h 6.1 87/11/24 @(#)codeout.h 6.1 87/11/24rCannot Open Temporary Filereloc:Reference to symbol not in symbol tablereloc:Reference to symbol not in symbol tableҔҜҤҬ.text.data.bsssymout: Unknown symbol in symbol tableSymbol Table Stack OverflowUnbalanced Symbol Table Entries-Too Many Scope EndsYYYu.text .data@.bss @(#)symlist.c 6.1 87/11/24 @(#)systems.h 6.1 87/11/24 @(#)gendefs.h 6.1 87/11/24 @(#)symbols.h 6.1 87/11/24 @(#)codeout.h 6.1 87/11/24@Cannot allocate storage``تتتتتت`ت`تت`  &'()*.+,/-1 !"#$%rlh  dcbj |~  }xzHGC56HIGyCEFDHVGHCGsCTI4LEFDuwIIEFDEFDHGHCGCAHvGHCGCIIXEFDEFDIRIEFDEFDH]GHCG^C\[IIEFDEFDW0:<379;?@=>PQ82BJKMNOSUYZe_`aikmnopqt{fg_[%#G]zH-  V KJk?P= / .+   D \ifI       w; utmgTJGX8#n 5                     FK-.J     %()*+ !"#$E&'-F.-F.-.-.3JHI1/CGJJJJGJJ>-F.-F.-F.&'-.-.4C3D3JHI1C>>>>>>7>>>7>>>>J>>-.-.-F.-.2G>>-.26>6>6>6>>J666>5>5>>6666 9=Cgh&'rrr18  :;yz{|<>@DFOQT^np_buw!$%,-.0234567jcd  ~iiii`sxa(l)*k ef}AGIKLJMNRoqv"#+/?iEiPiUtmVZBHSiXi\iiW[Y] |  x     `` ` ` ` (8 H ` ܶ|ܶffffffffffffffffffffސސސސސސސސސސސސ^^^^^^^^^^^^^^^^^^^^@@@@@@@@@@@@h$$$$$$$$$$>>>>>>PPPPPPPPPPjjjjjj 888  (D` Wrong Identifier SizerInvalid Instruction Mnemoniquethis instruction won't exist or is changing semantics on future architecturesUnknown Lexical UnitUnknown Lexical UnitUnknown Lexical UnitUnknown Lexical UnitUnknown Lexical UnitUnknown Lexical UnitUnknown Lexical UnitUnknown Lexical UnitUnknown Lexical UnitUnknown Lexical UnitUnknown Lexical UnitUnknown Lexical UnitUnknown Lexical UnitUnknown Lexical UnitUnknown Lexical UnitUnknown Lexical UnitUnknown Lexical UnitUnknown Lexical UnitUnknown Lexical UnitUnknown Lexical UnitUnknown Lexical UnitUnknown Lexical UnitUnknown Lexical UnitUnknown Lexical UnitUnknown Lexical Unit Wrong FieldOverflow Hexa valueOverflow Hexa valueUnknown Lexical UnitUnknown Lexical UnitUnknown Lexical UnitUnknown Lexical UnitUnknown Lexical UnitWrong Field SyntaxString Define in Bad field car must be 'Unknown Lexical Unit,--,5/?01234>C@DAAAAAAAAAAEB:<8?????????????????????????????????????????????????????.hx @(#)atof.c 6.1 87/11/23 @(#)calloc.c 6.1 87/11/23 @(#)ctype.c 6.1 87/11/23 ((((( H @(#)execvp.c 6.1 87/11/23 ltttldshPATH:/bin:/usr/bin/bin/sh @(#)getenv.c 6.1 87/11/23 @(#)ldexp.c 6.1 87/11/23 @(#)malloc.c 6.1 87/11/23 @(#)memset.c 6.1 87/11/23 @(#)mktemp.c 6.1 87/11/23 @(#)mon.c 6.1 87/11/23 PROFDIRmon.out @(#)perror.c 6.1 87/11/23 : Unknown error @(#)sleep.c 6.1 87/11/23 @(#)data.c 6.1 87/11/23 h @(#)flsbuf.c 6.1 87/11/23 @(#)stdiom.h 6.1 87/11/23 @(#)fopen.c 6.1 87/11/23 @(#)fprintf.c 6.1 87/11/23 @(#)fread.c 6.1 87/11/23 @(#)stdiom.h 6.1 87/11/23 @(#)fseek.c 6.1 87/11/23 @(#)ftell.c 6.1 87/11/23 @(#)fwrite.c 6.1 87/11/23 @(#)stdiom.h 6.1 87/11/23 @(#)printf.c 6.1 87/11/23 @(#)sprintf.c 6.1 87/11/23  @(#)errlst.c 6.1 87/11/23 (@Lh| ,@P`p 0<Th ,HX.Error 0Not ownerNo such file or directoryNo such processInterrupted system callI/O errorNo such device or addressArg list too longExec format errorBad file numberNo child processesNo more processesNot enough spacePermission deniedBad addressBlock device requiredDevice busyFile existsCross-device linkNo such deviceNot a directoryIs a directoryInvalid argumentFile table overflowToo many open filesNot a typewriterText file busyFile too largeNo space left on deviceIllegal seekRead-only file systemToo many linksBroken pipeArgument out of domainResult too largeNo message of desired typeIdentifier removedChannel number out of rangeLevel 2 not synchronizedLevel 3 haltedLevel 3 resetLink number out of rangeProtocol driver not attachedNo CSI structure availableLevel 2 haltedDeadlock condition if locked @(#)frexp.c 6.1 87/11/23 @(#)isatty.c 6.1 87/11/23 @(#)memchr.c 6.1 87/11/23 000000000000000000000123456789abcdef0123456789ABCDEF @(#)filbuf.c 6.1 87/11/23 @(#)findiop.c 6.1 87/11/23 @(#)dowrite.c 6.1 87/11/23 @(#)print.h 6.1 87/11/23 @(#)ecvt.c 6.1 87/11/23 Fn CAy7Aׄ@È@Y@$u!R2 G%`.textG .data``H`@.bss%( 0  !2$0 `"r[WP@DH~Lq ζ  ( 0 8 @ ` p`p -p U(!  U(! B D(!  D(!  E J Ih a(! Z a(! ( t(! >0m#(! 2pWp H H. P Ppp I*p X X4 H Hp H H ` `p H Hl h hp H H4 p p ` `j `   `!   8p)p"'"!0p H H x xlp r J     !   @p)p"'"!Z H(p! ؓ% Hp1 !!   0p1 'F  &:  ,           &2  &  & ȶ %    t x"   L&ڎ&&&p   0 <$2  0  R   x  ,  0    0 0^ t =| Г$\ ؓ$P $D $8  &.  &  &  Ȇ % ~LǎHǞDǮ@PPWPDH~Lp `d  p P X(   p H   pp p  L     p0  4   @ 8p1$    p X  H p 0 0  '^  p h !   p  T! X( !!   p  x! `0 7  !   p1 !!   p  ! !!   p ! X  x  `   '@ 0 ^  !   p  p! X( !!   p  h!  !   p  H! !!   p h0  ` 1  !   p160 #1p"0 2  @ @2!p"$"#  !  p ! X  h0  0 ^  ~LǎHǞDPPW0 d 00W8 ȓV ؓJ > 2  !(  !  ! Ȇ   88WH<@~D q   `( '    ~Dǎ@Ǟ<HHW00 . & / (WP<@DH~LpnL >. ؋~  z  hz Z~LǎHǞDǮ@Ǿ<PPWP8<@D~H PqL xp tfp pL6  |     @d  dPL L " l Ls ~HǎDǞ@Ǯ<Ǿ8PPWH@~D!pqJ!p p!!!  ГNn!'Vր!!!!~Dǎ@HHW@ ~<q@ @ z@~<@@W@@D ~Hq  vp΋\ * Ȋ ȋ6vx' (  x( ~(z 0 Tvx' @(< ~HǎDǞ@@@W$ *  WH@~Dpqz'~Dǎ@HHW8088Wpj[BP48<@DH~LH! !  րqpN$   x((lx! ( 2  !(hր p0qp((q$  sqp'( (&   n :p p  P! ! xF p(P   ~LǎHǞDǮ@Ǿ<84PPW! !!  WP<@DH~Ly   s  Rq(+p#X((p(psp~LǎHǞDǮ@Ǿ<PPW0+K "AC1!WAC$AhAC%hAC&hACWQWPX%AC1QCGxBBSD"vt ('"AC8('p'"$AC4$X$AhAC!FhAC"     BG G!     g   ,Q"%(  D b j D p     ~@ǎ<HHWH<@~DpǐLJ D   p  p' (. (   ~Dǎ@Ǟ<HHW8 ȧ~4p  *        |'Q!R D D p%  ' p7! ,~488W@8~<p  ( ppP!`WЋ( ppاЋ^,*    pЋ& ppP!`WW @  ~<ǎ8@@WP pR a!` !WH@~Dq l~Dǎ@HHWH<@~Dr '$~Dǎ@Ǟ<HHWH<0@~Dr 0 (+R a(a( <r NwX   @   "    t  )r!  )a!"P  p~Dǎ@Ǟ<HHW@~<p.`W .`&0 2  &'  ~<@@W@\.`P .\(0 2  .  >  @@WP.p0>@DH".L @.M.p.@.DPPW[`W![BW8 @ "88W!;0`[W[B[ ֆW[W2![W2![WC2!,[W2![hW[P(W ([$((W!00[WH .(N0n8@HPX` W`X .(N0n8Ɏ@ɮHPԩة>^觾[ [TW[:. W2![W0W@8~8 PPWA~"t0As3r21~WpǼ @P PP$PpRUжP$%py}kg,P$(VP p:w]ѡ[q" ,(0(Rְ(Fp@c(stdxX܋ ` d` P$([P  ,(0(ְ(` d` (P$[PQ̡P! ! ,(0(Pְ(` d` 'Π- 8ы0):@0CAMр ѡ(P$[P Q фP р}-!ш},(0(xְ(` d` / q0фыh` d` / q@фы4` csd(u$+\-` d#h.l*x0Āelh%ox0XeEfgGn9ld`  d` @   "  !`d` }; -!10@@ V 8@  /  +!10"  /  !10 @ /00 0ѡ $@ZPECѡMѡ p } u ^d` } pq 5#"0ѡP n b V J@  6@ *d`   d`  @     0 9: @  z WC00_D0@_D00d` - p&@ 4  a@ ' - pX Oo620x 0 "X     @ / &  g `h`  0!#и0,@0ȧN( 80 - D  5  +  g ю 0ѡaP P .aP6 QaP PP ׶`p8g 06P,QPU):RECAaFSRQaVrgaga,- +aea E`rvp #2#: @ / &  g `h`  0<#0,@0ȧN(80` P,/Q)-0!-! B +!    ! E00@qA0- '1qA@Aq@ `  .'qF<Ad &$  A@> QP&#1qA@Aq@@p` #H  @ &   !  g `h` 0#0,@0ȧN(8 ,`  FF=11=CCAM 0AMAP,VA@ E@ p}@gd``  >    @p/,(0(ְ(zkg(P$(VPp: w q&,(0(<ְ(@p@ekd,$( DA4,(0(ְ( ֠/,(0(ְ(Jkd(P$(VP@:0D A&,(0(,ְ(pTkg($( wq( ,(0(ְ(     / ֠/,(0(ְ(Jkd*P$(VP@<0D A&,(0($ְ( fpp\kg,$( wq,,(0(ְ( ֠/,(0(lְ(Jkd*P$(VP@< D A&,(0(ְ(H{ p   $( @  f@ , 2 ! . 00  +    pؐذW Ћ (  WP@DH~Lr @D''!'N )7`)t ~LǎHǞDǮ@PPW!)[W2!6[WPHx~Lp(,j~LǎHPPWPHx~Lp(,"~LǎHPPW`?8<@DH~Lp.ޠ:T 2p pp  :X ސ Jp  C@:8 6p  : @$:@$ 1 P@$`^P5%cR:W^XP'86 0":B0C9"5 4r+!+ @$0:  ?05N?:@ 5p  5 @$0:  ( ( :( 0 &009 4 @$05p (  5(T &1  &0   9( ~LǎHǞDǮ@Ǿ<8``W   ?  ?0 6    W6    WX<@DHLPҧ~TsRNW  ( ( D ߢ \ pױ'(R (> )     ,N   aP/\ +! (() )((  ' p7! XBW  D ,,-V | ~TǎPǞLǮHǾD@<XXW0@ A#1 ! 1W @(#)as.c 6.1 87/11/24 ````xos43.s21sms-o would overwrite %sunknown option '%s' ignored, /tmp/ctm%05.5dno file .s given-o forbidden with several files%s: -o-Ecppmacroas: . %s%sas : Can't open source file : %s Can't find %s Try again Fatal error in %s ran out of memory (savestr) rr %-120.120s %-35.35s%-80.80s %-35.35s%-80.80s  /bin/as9as9 P `  /lib/cpp/bin/macro/bin/time @(#)calloc.c 6.1 87/11/23 @(#)malloc.c 6.1 87/11/23 @(#)memset.c 6.1 87/11/23 @(#)mon.c 6.1 87/11/23 PROFDIRmon.out @(#)perror.c 6.1 87/11/23 : Unknown error @(#)data.c 6.1 87/11/23 !p!p!x#h3p @(#)fgets.c 6.1 87/11/23 @(#)stdiom.h 6.1 87/11/23 @(#)filbuf.c 6.1 87/11/23 @(#)flsbuf.c 6.1 87/11/23 @(#)stdiom.h 6.1 87/11/23 @(#)fopen.c 6.1 87/11/23 @(#)fprintf.c 6.1 87/11/23 @(#)printf.c 6.1 87/11/23 @(#)sprintf.c 6.1 87/11/23 @(#)dup2.c 6.1 87/11/23 Cx @(#)errlst.c 6.1 87/11/23  ,HXp|  ,DP\p(8P`l <\x.Error 0Not ownerNo such file or directoryNo such processInterrupted system callI/O errorNo such device or addressArg list too longExec format errorBad file numberNo child processesNo more processesNot enough spacePermission deniedBad addressBlock device requiredDevice busyFile existsCross-device linkNo such deviceNot a directoryIs a directoryInvalid argumentFile table overflowToo many open filesNot a typewriterText file busyFile too largeNo space left on deviceIllegal seekRead-only file systemToo many linksBroken pipeArgument out of domainResult too largeNo message of desired typeIdentifier removedChannel number out of rangeLevel 2 not synchronizedLevel 3 haltedLevel 3 resetLink number out of rangeProtocol driver not attachedNo CSI structure availableLevel 2 haltedDeadlock condition if locked @(#)getenv.c 6.1 87/11/23 @(#)isatty.c 6.1 87/11/23 @(#)memccpy.c 6.1 87/11/23 000000000000000000000123456789abcdef0123456789ABCDEF @(#)findiop.c 6.1 87/11/23 @(#)dowrite.c 6.1 87/11/23 @(#)print.h 6.1 87/11/23 @(#)ecvt.c 6.1 87/11/23 Fn CAy7Aׄ@È@Y@$ @(#)fwrite.c 6.1 87/11/23 @(#)stdiom.h 6.1 87/11/23 @(#)memchr.c 6.1 87/11/23 u!S y.text .data@.bssHHy 0  !2$0 ^ [W@48~<r )ԡp~<ǎ8Ǟ4@@WX<~@p )pnD(ND~HD(HRTdx ܧ~@ǎ<XXW8 ȧ~4p (p~488WXD~Hp-`6((F  0-~(*hXV!8ގ 0.~(*. ߖN!8V NV u p( ֋N.4(Ӓ( J ՚^Vq'(< u2 p* e !.@+R>P1 (\%  % ( 111 X.t*11P1\(!    0.~((r5H*B11P1\5H(!  ~HǎDXXWH@~Dq<% (  p X~Dǎ@HHWP@DH~Lr<%^(  (>4* ~LǎHǞDǮ@PPWH<@~Dq<$ (  4)~Dǎ@ Ǟ<HHWH@~Dq<$t   (2~Dǎ@HHWP@DH~Lr<$  ( ~ @z*~LǎHǞDǮ@PPWH@~Dp V( 0L#( p.W z( 0e#( |p.W>r/Pȓ&ʋH,ά2,ΈhPhP>/ȓ&Jzz,d#z,,z "/%,؋\VbB|0++J .,8 ͺ/ȓ%D6,8 |,0,,8$v++d++P++<:.0Lȓ$B . ؋++ȋ++++؋1Ѕ0#0#ҋz @0#Rր1p˞ 1!11p1P++ S:0ȓ#t,`̲,, "1",؋++?L~Dǎ@HHWXLP~T1H".rހ1܋R((P1DH101^,۸H1@ q1Ѐpހ1((P1<H101^,XH18і  qr1!\*˦H2 ~TǎPǞLXXWH<@~Dp π ($*( ~Dǎ@ Ǟ<HHW@5l~0>0ж>0|>0lf5l0>0 ,N5l0>0   &5l0>0// /   11 122 233 `35l>0&& 0&P   6 00 077 788 8 && h& Hh'' ('H ()))hHh , N6"""###   |!!`!@` @$$$ ((`(%%@%`-- -@+++ ,,,***44466h6 L n  ȶ>8@>8!>8 >8 !!p#00 D!*00 |jP%p00(# %09(# %00#0^؎hP>+* !(., 04ʋ++(+ 04x+,Q:+0%Q*( 04^,X,++ +p+lP|4 405^(+(5 ǰ54Ǟ4nj, z+x, zLb~LǎHPPWY&YpYpW Y(YY Y2! Y ## W>8!>8>8>8W8Mj\MH:M&Ҷ*88WP?8<@DH~Lޠր>0>@ސжxFP  FP! 5@(5@H5H!!!5H|5H!2!!5X5X    *ApC߱Y'0FP#X$'r(",5`t',5` 5`B5X5X5@!5@'9,5`D FP!8sp$!r X(' 7<#5`(t',5` 5`B5X5X5@!5@'9,5`+p#!Xr(!5`(t',5` 5`B5X5X5@!5@'9,5``Ljx FP 5X5X5@!5@܋2 !ȆȶYt@5X5X5@!5@ ""( >@ 5X5X5@!5@ (5@ 5@(5@F5H!!!5H 5H!2!!5X5X    >@X5P!!! " >C 5PX& 5P1>CޠF~LǎHǞDǮ@Ǿ<8PPW $ !  W85@(5@F5H5H5H! 5X5X   88W85P !  $ !  5P΋$5P 2!  88W 5X5X5@5@W0#~*z!v!p""ZxW"!  !D!  !!  !( (,!  !88!0 0 !444 40!0 0 !4848t! J!@40 r (70@  *B" ӧ! L!@40 r (70@  B" ӧ!  b!@0 B (40.20 J" ! (!  !DD~W@@#TF4J>1:1p23ZW302 10!02 10!0(2( (10!0828 810!0424 4140!40828 8140!402 10!h02 10!L02 R50%10!0D2D D10!@@W~pA0 'z!!p""ZW" ! $$z ! $$R (!( ($$ * 8!8 8$$ 4!4 4$0$4 4چ 8!8 8$0$4 4 ! $$ ! $$b ! $4 * D!D D$  ~WH48<@~Ds<(   (,   (Hp,0~Dǎ@Ǟ<Ǯ8 Ǿ4HHWH4!2#!& ((0[: sHHW0Bz#! @ $!A $ @@@(B@ WH@~Dp+( ! 8 !7~Dǎ@HHW( 0/#   WPH~Lp6 0[ԧ~(P[ 0\^(,,,Ȉ ,ж,~LǎHPPW~0 020 x2 X2P%p00(# %09(# %00#hP%0a(# %0f(# %0#>P%0A(# %0F(# %0#r k`8 7 : 9@PEp0(G@ u@ BtCAEЋ@@~W0C!1B  Wp`dh~lp, zp , z, + r4\< \(^(N  \86\4)pF 8\D0\P܋\0.>(,048<@Dn\,\Dq 9~lǎhǞdǮ`ppWhTX\`~dp(]6 ~(P^,+00]4, (,04+7~dǎ`Ǟ\ǮXǾThhWX?@DHLP~T@Dְ@֠֐ (_2kP3Qa1pq&Pp     Rpׁp" 2ȶ !pN !0#!)! 0#  䎀p]W_ԓ:Lpρ4,pp" pבH( V  D@{pב sp`[3Qa1p!p"p"ϑpp"(ppבLsp`[3Qa1p!p"p"ϑpp"(ppב ~@  p]W h   ̋ڸ   z__ b \ǧǷ`NJNJ'`0    X (*;%`p&((fP(6 p` ` \W .!0 #`̓'0 ȋ ȋ  Ǘǧ  ܧ(H(t a" ȋ ȋ w W(!  W(! 2@ I(! N I(! 6 R4 X( , $  a(rqwȋaTRatBa2a"aԓa|tp `ȋPb'7 b0(!0l#b8Z 0Ȇ 4 ` BȆbdVb0++(+p_(bVbГ:'7Vȶ  bȆ(c'!1'(0ȋ"ȋȋȋȋȋȋȋȋȋ\ l'4nc< ̋T  ! 0cPZʴ ˖ċ ! !'!z 0#ʨJ 0#xȆ'(ދ'(ȋȆ'!$'!$ȋȋȋzȋfc`ȋ6$'ȋ' hP ' n%# F%! ;Qa1t&! 5Rb1T&# 2Td14&' 0Xh1 )ȋ%'|ȋ܋؋ԋЋ̋ȋċȋ6cp$ȋ ȋ5 ȋ ¶ȋ œȋ ~ȋ bȋlȋ^†ȋDrȋ0ȋ"ȋB~TǎPǞLǮHǾD@XXWH@~D+؆phX+p pd(0.d'dȓ΋~d(.dؓ'd>d((LJd^dPw8pC~Dǎ@HHWWWPD~HL+ώL4` &,(e(  0p1e(0`'  (0e'  0|p1e$(04'\  06p1e,(N04'`(~HǎDPPWH  0z( ,#0e8HHW@~<pep(n,P ~<@@WW a q(0 #0@`4p@    WP c!>6(t,04 0exʋ< 6(t,04 0ePPW `^اX\`Ǿܧdhl~p^P^X^ P^XD.P^Hǘ L^5t!$"( , 0f@Qe| (!  (! 6 (! /(! pfW r+VxpZ@t(x,|08 < 0ft Q^DR^8T^,|(, 0 0fГ紋~f  =q !> !"( , 0g JqLf  =q !P> !"( , 0g<tqp"( , 0gP^=.n"( , 0gZx@nZ0x(, 0 0g,|q$  .tnR&|4x^ $|. >$(04| 8t x$|(04. >$R^Q^| (! /(! pf(W &zQ Q^z^Q^tPW^ x$|. >$(04n htzPW^ x$|. >$(04N^zx^W^^ntV^ x$|. >$(04n zx^W^^ntV^ x$|. >$(04^^z&xnn>!+,tnt >tx!ni~pǎlǞhǮdǾ`\XW~~8N<$"B$ z" 8 !+p z, $!,~WP H>~L #~P z%p"B.>Bz%p"#2$2."#'.x2 2 ! ǎ>s>C> zp(.,$iJ~LǎHPPW8 n(4n( x++h888W0 ГL*H“ +p 400W@~(,0i`ߌxN '(J i  '7z>(,0i8$\ j8* 7GzN(.,0 4#0i‹ '( ǸX ll(( Ǚ!J jx  'z(,0j@<(`  jċ* 7z.('.,0 4#0j~ċf L j  7z(.,#0j̓݊~tl(펐0lQ( * &~*|p~hǎdǞ`Ǯ\ǾXTppW`HLP~TpxǧW$. 'z0k^(ܴ}րHd(`J8'^\>X^("X.\7# , Lj, 'z(W0k$^,|zp~TǎPǞLǮH``W`HLP~TpǧW$. 'z0kP^(ۄ|pրH\(zJ8'^\>X^("X.\7# Lj((z, 0k|{zp)~TǎPǞLǮH``WH<@~Dp: ,$  'Tw8pzpDp *0$z!pqw8pp !@PV@ 11@ 10!!p"p׺p00!!" P ! z#1p"'p !z#  zLzD~Dǎ@Ǟ<HHWXDHLP~Tր$ǘT 0k0(@!@x0p$ 'ΔJ$  z 0kԓhw8p080Ǹ488Lj8 y Lj8~TǎPǞLǮHǾDXXW( 1# #1 W ! WpHLPTX\0~`qzËǼ4 < +*"(p&( , 0l֋Np+ZzpQp^l!p^h+>d^(<(z (z , 0l<\d.h+*p.d"p!bhnlPzp*p"'12$z:zI4.h"p!p !2p!'p21$10;~`zǎ\ǞXǮTǾPLHppWX8<@D@HL~PPt^VPV Lj < H @ Px^ Ty w>73 7  $ (( Q^VV1@ `q(Dp~PǎLǞHǮDǾ@<8XXWH<@~Dpx    W WP ~Dǎ@Ǟ<HHW@1" #  W 80 (20 ,"0@ 4(20W 03( " W 1 $ W8 88W   W!(  ! WX<~@p+p Z& hD zD~HD({TPLDR[.& z  z  $~@ǎ<XXWWWWWWWPH~Lp(((pmW5@,( z0nXϴ|,rbǀЎ(<bLǀ$Q z&ЎzЋ Ћ, z" z0n ,( z0n, |,( z0nȓ΄L(8( $a(ǀ$! ! z"020# H! ,(xP %z(0nҋD! ,(wP %z(0o ͎V( z0o8\$`0ǀ z0o`V ~vh( NF8("RYPX`tn`QPJ<,& Z ( |lfXJB4c$ z0o8~LǎHPPW8,hЋ(@Ў88WPH~L`\Zp z\ ,(sJP %z(,,0o H ,(rP %z(0oȓЎ У  z(  , ,$~LǎHPPW@8~<pǀ(&(  $ B 2hh~<ǎ8@@W8 ȧ~4p(&(  $  hR~488W8ȓڲڸN+p 'f, "0#R+ ++x ."d88W`X~\ ppxp rFqpwp 0q 0(,q(y 0 ((0,80H4@8qDy\ր(0qp(y2 ,0,qyqP~\ǎX``W8xVȎ488W8tj`V,8: br88WX~@pD&mD~HD(n TdNV V~@XXWH~Dp@Fz* 'z(0rØ2wp~DHHWP~LH Jpr(m>+Ȇ&, (  ,ض,,ا ,@H'vpHb  (DW^(P 0s^,„!'cd w~LPPWH丧LPTX\`~d֠X + Zz D Ǫ 6 .4<p* * z(0sH u plX! ( 0s\P .( >Xm.r eZ v~ ( 0s7<!u" ( 0ssD"jv s@. { ( 0sēd /& ( , 0s67!tf ( 0t\]b& ( , 0t #( ( 0u.7s ( 0u8d^ pP^,H(7,!sp^,n( ( 0ul׎(ߞ\,n(( ( 0u \ Q^?nP^?^@^^D<DG$ z<'" sp67|<!r&s<"g ( 0uГs8 8x ( 0ut7 !q ( 0v@ u p" .( 0Q^?<'" rZ67|<!qs4"f ( 0vDs0 8w ( 0vl^7 !p ( 0v*$.$T8'7 qf 0vϞhx7 !p 0v w(ej47 !o 0w$d^D^407 !ol 0wT (dBn8A !10 4d. z$0<'" o67|<!ns,"d ( 0w&s( 8u ( 0w7 !n  ( 0wГ u p& .( 0Q^?T47 !m 0wP)(^@Q^@^DTԷ^Dn@n?`^(P^,Q(Yd̋Ǫ~dǎ`Ǟ\ǮXǾTPLHHWpLPTX\`~dr$L({ P^l,Tpb)nl09 m`9(!l 0x0( ؀N (ؓ( 0xX(j   (g]-' n%# F%! 0Qa1`&! 0Rb1@&# 9Td1 &' 4Xh1++D+p:x,(`V$ (0x~,`Tx((` ,z,$WzN'^l(Q^l)( h.h ph   8)9 k 0xħ()>+~(I +DV V' 7  (!dֆ ~HǎDXXWP@DH~Lp!(:H(!0(( e Hϡ,8 (r!d   ~LǎHǞDǮ@PPWP@DH~Lp1( d P(<  <*8 r!cj  ~LǎHǞDǮ@PPWXDHLP~T`bXp(Xz'dLjO^֐lj+8 z(X  z(W 0 (r@pTLp(W,,'Lj(EǙ5p+֐ (,$LJ0,(z+؎z(V<<  {   a`  0 r+&Q  pd Lj83 0( 0{P~,(z`+؎V{D(U@Ƿ<   {L rpw8pQ~TǎPǞLǮHǾDXXWhLPTX\`~dpLt  F<^    p)P<  (Tx)N$zB<   $ )rz$ 1$(<,@,H'0 H4  z^Ǘ4 zp '(S  Ǘ4z  h) p :zzǧh0 XLPǪ(<4&'R ǧqێz̋) p zǧ (Rr0, )z(0{`,j, hLP2$'Q ǧqۆ Ǫ(a ) z(Y0{^,ދyǙ+ ,!"&4 ضHh'|NpL , " 'z0{T Ǚ  `~dǎ`Ǟ\ǮXǾTPLhhWH@~Dq08"p@"""+  <   $ $ $x{(P8$ $N{(P$@ $&{(O$ $$  H H(~Dǎ@HHW@8~ʶا($  z~<@@WXDH~Lրx'H0!10 1P0!4  LDp)P{ؓ_P(N ,$, @0,(s<Lj~LǎHǞDXXWX?@DHLP~T+ր֐+ (y7H 01(2Q8%,!DG%$!H! !P 14$Q 00>@8+  " <2y@("Ǚp0(&!87 R#!D7%#!H4$  >@h+  " "wDpw֐l)"^y'$"  ' '"B + ' , +  + '" p#ǙpJ'$0 # 8 + ' , + '" p#wDp! p zj!0"*' !H7#1#'$1H#1D#','4 !,(" ((>{$J (WW$W,8pK0~TǎPǞLǮHǾD@XXW (!8WLPTX\`~dpW8^|$ 0'4 R0 0(,, 0{40bLJ0 "ק408 Ǹ4'R >ǘ8 0|~(r4j|LJ-:h(|XY h(H888 8yJ 4ȋ((,, 0|d~|p!~dǎ`Ǟ\ǮXǾTPLWP<~@+ ZpzF|'XF|'XxF: qd~@ǎ<PPWH<@~DրX$2x0" (F\ 2w8p  (F8 Lj8~Dǎ@Ǟ<HHW@~<pHH$ $$P .` H$ @ $$ x|(E~$ $P|(ET$@ $&|(E,$ $$  ~<@@W`DHLPTX~\HL}̓Tv}TjpH' 7~ TF}ȓT0}ēT}T}S}Swp}S~(S~DS~\S֐ )~Stblj9~,SV$~S@6$~ēS$~̓S }Rx0p}(Cȋp Ƿ8Ǹ6H8,z3 0,z3+*~ܓRprf, (+=RJW,  R0}R$w4EǙq~\ǎXǞTǮPǾLHD``WDHLPTX~\P, zz4++p P,8 0^(Ƨ|+xf,8Sp P,8 0^(S^,8I,| .,8*AJ,8H+,8Hҧx P^x+`,8H LH,8H0    L `p+  Kր++ !"+L&?4q +!(!9Mq(!9MtX 0^((!9M6Lj5ր@$Q  ! $ (!9LLjD^|>x ^(-, z P,8 0 ^(+p,, z P,8 0T^( AրHp,z,zvǨ0j ǸǺ8H  Iڋv!9Kr눷v!9KqǪ4qLj8[pF$46+,  +І ǧ'0 ,!<K P,8 0t^(fr W_XZ f+ !<Jz ++p !=J(,06,0!<J  P,8 0^(XhX`+hlr rH+*hlr rhl+r r, z+pr rr r+r rȣbNd+ p F`!9HhP `hP pp+ vvzX|ڋ<vz   vz|!9HZvz vvz+    P,8 0ԧ^(p   ^uXW0^8eƆ `0PLz*^H,z,z ATP^z!8CZ^R^nQVz!8C*WNnzanz^WNzU^%,N^z(, 0.^nV^^5Nnz (.!% @`&^( 0 ~, |f^5Nnz (.!% ?,^( 0,~,\| ?+&|<^  ?^^(,0^^4^|^8<.7n++Nnz (.!" (^5Nz (.!% >&^( 0\~,R @>@^ >P^^5 !=N&^~(, 0  : ( ^,~04 0n   .t|  =!9?. !8?^Q^'"(  =vw(p~W^4P0%1T^%!.^3^3^^P~pǎlǞhǮdǾ`\XW8ȧdhlpѧtx~|ËP^,Y (p""pp^0papa papap e+" <6;<!:p"08 ( 0tBl 8A4 ( 0 Q .&;+ ;6& n103((p"&2n 1 (p"&2n1(p"&2n1D(p"&2n1H(p"&2A0n(p"2$D 6$s$#(}~^^4 P^^ ;!9$ ( 04^P ( 0n,(.r (! !(! HpW j(! 20d#(! &pHW W zU^$^ ^(^^,0~4$.>"4^$P .>H( z( ,#4 8+$+І X^(0  !<: ^X (  . +  !) n,1&21! 4 + ^0%! ) n,1 &21 !0# !!<:W (:+0!7 ( 0.^0Q^0X z+p.8(z(, H(5|H5j+ , 569.`5(h55@ .>H( z( ,#4W (+0!6\ ( 0p+Z^$PPN (B & . +  !!9 #!d z  nzp! &nzp"'!'^^(^ ^,^^0^^4^^8^0^<^^@^.>^DH 0   Q^ W_Z X Q^:Q^ W nzp!&nzp"'!'4 g,+"Q^++^,Q^, P^++pn+`fW znzp ((   T!<6D^0Q^0W^&;4!2 ( 0~b+n+`^,Q^,+n+`F4Q8+e" n,.4R"e!& Ln4V >+^0%V   n,^4% !% 4!<5^0Q^0n((& ׋jQ^ Q^+( n0 ( ^0PË&!!=4Z^P.! 0 ~|ǎxǞtǮpǾlhd88Wh@D~Hp+؆ L+؎  Lր(%P`P(%Td$(%XLj8L8  0Г{l,,NB @. ,$ 0 \ \L!72~HǎDǞ@hhWhD~Hf,aP/Rd!8^d2*ppzZ8'5ZD'5Zݖ .V!.L!.P*LT!81qd~HǎDhhWPDH~Llp.pǎlP ϑ!/&l!716!/~LǎHǞDPPWP0H~LPrV<!0*(P,8 0P^,xp,0,0,0~LǎHPPWH~Dp6"( 0xr~DHHW@~q000@@p  37~W@~f0Jq p'p'rt 4"$0 0 ~W !   W`?<@DHL~Pp  p0"W( _W0 '0 \DH  HH00 p$LJg88~PǎLǞHǮDǾ@<``W8 ȧ~4 q l ~488W`LPTX~\ ,(zNpQ d  ȀH d! 0ܓu!rprs  p`X(' l%# D%! 0Qa1h&! 9Rb1H&# 4Td1(&' 1Xh1 0&T p2p@@p\ z z`+0($((, 0sd  B z4((,,0 0sJ z@(4((,,0 0Xr+Z z( z: z0($((, 0rX~\ǎXǞTǮPǾL``W`LPTX~\ǹ  |B ,((, 0qQ 2 (dH d! 0q!rpr@ȓojƠ((p`X(' n%# F%! 0Qa1h&! 9Rb1H&# 4Td1(&' 1Xh1   * p  gX(' n%# F%! 0Qa1h&! 9Rb1H&# 4Td1(&' 1Xh1 H&p ,(n(, 0oDp`X(' l%# D%! 0Qa1h&! 9Rb1H&# 4Td1(&' 1Xh18Q 2 (dH d! D0XnZ!p@ȓl@ Ơ  p`X(' l%# D%! 0Qa1h&! 9Rb1H&# 4Td1(&' 1Xh1   ~\ǎXǞTǮPǾL``WWWH~Dp p0lȀp80Tpd&p d 8 0l~DHHWH~Dp 0lNdpp(Pep2"pƠ 2p 0k~DHHW`LPTX\ѧ`~d~|hP^^ !; ( 0(kb6Ȏ (Z 0Pk6. g(!  g(! ,"(! ^"(! J j>0^Q^W zz4  z z+jg (\Y (N&F,(R((, 0lj&'Q(   0  "^Y(^Q^4P^\ !; ( 0i. X(L^Q^.n(& ^Q^6  ! ( 0̓i ^Q^^Q^4 !H ( 0h:^Q^+^Q^g ( +^V^Q !; ( 0h,n!(& 6  ! ( 00g   X + ^Q^, ς  ! ( 0Tgzn` V`~dǎ`Ǟ\ǮXǾTPLW8Ȏ PP `VQP܋88W80  L( ,88W  (Nz (WP@DH~LPd ȀHd 0e!rprcԷ  PpQ%P!4~LǎHǞDǮ@PPW8 ȧ~4.qYر (PދtZ|P !:Ȇ,$lN!(! y  X>@Yp~488W@~<pضYd.Yp'W (P>@~<@@W@8~@~<ǎ8@@WW  2!`0 0WH@~Dpqz'~Dǎ@HHW8088Wp j[BP48<@DH~LH! !  րqpN$   x((lx! ( 2  !(hր Hp0qp((q$  sqp'( (&    rp p  P! ! xF p(P   ~LǎHǞDǮ@Ǿ<84PPW! !!  WP<@DH~Ly   s  Rq(+p#X((p(psp~LǎHǞDǮ@Ǿ<PPW0+K "AC1!WAC$AhAC%hAC&hACWQWPX%AC1QCGxBBSD"vt ('"AC8('p'"$AC4$X$AhAC!FhAC"     BG G!    g   ,Q"%(  D b j D p     ~@ǎ<HHWH<@~DpǐLJ D   p  p' (. (l   ~Dǎ@Ǟ<HHW8 ȧ~4p  *        |'Q!R D D p%  ' p7! ,~488W@8~<p  ( ppPW( ppȧ^D*    p& ppPاW W @  ~<ǎ8@@WP pR a!` !WH@~Dq( l~Dǎ@HHWH<@~Dr '$~Dǎ@Ǟ<HHWH<0@~Dr 0 (+R a(a( <r NwX   @   "     t  )r!  )a!"  p~Dǎ@Ǟ<HHW@~<p.`W .`&0 2  &' .  ~<@@WX?@DHLP~Ts @  aP/\ (  )   ' p7! X (  <~TǎPǞLǮHǾD@XXWP<@DH~Lp   W |tlǧ" !D  40,'  W     )V  H )     ,^   aP/\ +! (() )((  ' p7! hBW  D ,,-  ~TǎPǞLǮHǾD@<XXW@\.`P.\(0 2 ܋ . ГF  @@W@~<p~     W    ~<@@W@\.`.\T@@W@.` >`#&@@WX@~D.x qώxTP.LH@HU(~Dǎ@XXWP.p0>@DH".L @.M.p.@.DPPW!["W[W![W[W2![W2![WC2!,[W2![W[pW [DW!00[WH .(N0n8@HPX` W`X .(N0n8Ɏ@ɮHPԩة>^觾[ [W+[TW<[@W [,W2![WW@8~؍ PPW0@ A#1 ! 1WpǼ @P PP$PpRUP$%py}kg,P$(VP p:w]ѡ[q" ,(0(ְ(Fp@c(stdxX܋ ` d` P$([P  ,(0( ְ(` d` (P$[PQ̡P! ! ,(0(ְ(` d` 'Π- 8ы0):@0CAMр ѡ(P$[P Q фP р}-!ш},(0(ְ(` d` / qфыh` d` / qСфы4` csd(u$+\-` d#h.l*x0Āelh%ox0XeEfgGn9ld`  d` @   "  !`d` }; -!10@@ V 8@  /  +!10"  /  !10 @ /00 0ѡ $@ZPECѡMѡ p } u ^d` } pq 5#"0ѡP n b V J@  6@ *d`   d`  @     0 9: @  z WC0_D0Ћ_D0d` - p&@ 4  a@ ' - pX Oo620x 0 "X     @ / &  g `h`  0!#и0,@0ȧN(d80 - D  5  +  g ю 0ѡaP P .aP6 QaP PP ׶`p8g 06P,QPU):RECAaFSRQaVrgaga,- +aea E`rvp #2#: @ / &  g `h`  0<#0,@0ȧN(80` P,/Q)-0!-! B +!    ! E00@qA0- '1qA@Aq@ `  .'qF<Ad &$  A@> QP&#1qA@Aq@@p` #H  @ &   !  g `h` 0#0,@0ȧN(z8 ,`  FF=11=CCAM 0AMAP,VA@ E@ p}@gd``  >    @p/,(0( ְ(zkg(P$(VPp: w q&,(0( ְ(@p@ekd,$( DA4,(0( ְ( ֠/,(0( ְ(Jkd(P$(VP@:0D A&,(0( tְ(pTkg($( wq( ,(0( ְ(     / ֠/,(0( ְ(Jkd*P$(VP@<0D A&,(0( lְ( fpp\kg,$( wq,,(0( ְ( ֠/,(0( ְ(Jkd*P$(VP@< D A&,(0( Xְ(H{ p   $( @  @ , 2 ! . 00  +   "  pؐذWhLPTX\`~dpЩ.   id!0i!#"(    % %Xx!! . $  * iߎ ޠ l h  [ h  iΰl cf[^d!0i!#"( cs [(~(^ *>h^,"~(^ *;^,h    ~dǎ`Ǟ\ǮXǾTPLhhWP8<@DHL~P~P^^^ϞT^^x^:d2pW^Q^ΰ L +!R  ->^Q^l![RQ^ i^P v i0& i 7W(!^Q^.^Q^e E|t^Q^d4! i+ - B!s` T). 2 l.242# .242""7^P l$^PLh(^z ^P~PǎLǞHǮDǾ@<8W`<@DHLP~T~ XcsR[\RP^\*)bѸ!!0#.0i#"( ^\P!+"  4nX  c ~TǎPǞLǮHǾD@<``WH<@~Dp^qV ̜1 ]2 - qR Z -87#@]$*'B2 2#:q q1 ]2~Dǎ@Ǟ<HHW (  WP@DH~Lr @D''!'֞ )7ܠ) ~LǎHǞDǮ@PPW ! ^ 0(,01  !W2!6[8W`@DHLPT~XP^\0i #"( + "  -^\Q^\ p1@ΐ. ~Hΐ0 Aj0ސ ̈ *ސ ̈:zA@ސ ̈* ސ ̈:zpޠieΐ. TB 9Ȍ19#59'3( E e 0@ (@@0@ (@@ @+ @-1pi@GDD@>@B*  pi@GDD@0 p,=:yp6p?qq5yq@( K ?0@@A@ q5'@sA@  6! #;K;;#\ 2  ~XǎTǞPǮLǾHD@``WPHx~Lp(,j~LǎHPPWPHx~Lp(,"~LǎHPPW`?8<@DH~Lp.ޠ:T 2p pp  :X ސ p  C@:8 6p  : @$:@$ 1 P@$`^P5%cR:W^XP'86 0":B0C9"5 4r+!+ @$0:  ?05N?:@ 5p  5 @$0:  ( ( :( 0 &009 4 @$05p (  5(T &1  &0   9( ~LǎHǞDǮ@Ǿ<8``WP@D~Hr :  .LhpL8":GA5pp!`' pq90A@3 95pL1"P>5p(`pq91A 31906~HǎDǞ@PPW   ?  ?0 6    W6    WA0~: r:2rqrp?5p?:pprq3rp?:ppp:sp2~ǎWz*z+z,z-z|SG&G f g h i j kai(l]he4c$4f`d[\g(bj^Z$_k3 G3QD-/9A6,MK7MV!5Rai]heRcf`d[\gbR^ZJ_R'wNORNOX]snop#P\^yH}|{ErqBHTS*ai]Rhec f`d[\g]bj^Z_ `][\^Zzx_[\^ZuCt@mW)v1U%1Y)~ai0 %]2hec.+f`d[\gLbj^Za_I]he&c" f`d[\gb^Za_]hecFf`d[\g^Z]_hecf`d[\g^Z@8_=><?:;L9r -Urrronr=1lk rrrrrrrrrrrrrrrrrr5OeHa^^N9 6*; SRQS 0i ('" T#-1 +$R,92Q7OLJIGCA;98z&6a3106("( 3)*  !!""" ###$%%&&&))(*''+ ,,,----.//00 111             / .*+,-6! &&078&%$( " #) &' '&&4''''123'''''' ,}{+XYZ[\~| !.0129>>nrsz !-7@=@Wopqtuv& )/ENIJKL3<<]^_`abcdelmy"'UHSDwx%$SFO456(*8TVUQR:?#MPABC; @(#)expr0.c 6.1 87/11/24 @(#)system.h 6.1 87/11/24 @(#)structs.h 6.1 87/11/24 @(#)extrns.h 6.1 87/11/24 @(#)sgsmacros.h 6.1 87/11/24 @(#)ldmacros.h 6.1 87/11/24 @(#)globs.c 6.1 87/11/24 @(#)system.h 6.1 87/11/24 @(#)structs.h 6.1 87/11/24 @(#)paths.h 6.1 87/11/24 @(#)params.h 6.1 87/11/24 a.out @(#)ld00.c 6.1 87/11/24 @(#)system.h 6.1 87/11/24 @(#)structs.h 6.1 87/11/24 @(#)extrns.h 6.1 87/11/24 @(#)list.h 6.1 87/11/24 @(#)sgs.h 6.1 87/11/24 @(#)sgsmacros.h 6.1 87/11/24 @(#)paths.h 6.1 87/11/24 rCan't open file %s for inputCan't read 1st word of file %s! file %s is of unknown type: magic number = %6.2xifile nesting limit exceeded with file %sCan't seek to the beginning of file %s | $ $ $ $ T $ $ h8 $ $ $ $  $  $ $ $ $ $ $ h-e flag does not specify a legal symbol name: %s-f flag does not specify a two-byte number: %s-f flag does not specify a two-byte number: %s-o flag does not specify a valid file name: %s-o file name too large (> 128 char); truncated to (%s)-u flag does not specify a legal symbol name: %stoo many -L options, %d allowedno directory given with -L-L path too long(%s)-VS flag does not specify a numeric value: %s-VS flag does not specify a numeric value: %sr.ar.athe -l flag (specifying a default library) is not supported%s%s%.8s%s/lib%s%s%.8s%s/libcan't find library lib%s.a11/lib/usr/lib @(#)system.h 6.1 87/11/24 @(#)bool.h 6.1 87/11/24 @(#)paths.h 6.1 87/11/24 @(#)sgs.h 6.1 87/11/24 @(#)structs.h 6.1 87/11/24 @(#)extrns.h 6.1 87/11/24 @(#)instr.h 6.1 87/11/24 h| <Tt4Tt ,Ll<\|4Tt4Tl P,\bad switch yylook %d *command line*optional header size (%d bytes) is too small to contain the UNIX a.out header (%d bytes)both -r and -s flags are set. -s flag turned offpflag(%d) less than Bflag, set to value of Bflag(%d) %sld : %s : Version %sPDP920 System V Release 2.0 9/1/83 : VAX 11/780 : UN*X TSFXFP5lFhFP5H5I5@E5E5D5Fx>LFP>TG`>\L>dFP>pFp>xFP>FP>Gh>Gp>FP>G>FP6>OH>H6>Q6>FP>FP>H?H?H?H6?H6?$H6?0H6?<H6?HI6?TH6?`H6?lI6?xI@6?H6?H06?H86?H06?H6?FP?G?FP?FP?J6?I6?I6@I6@JP6@I6@(I06@4IH6@@I6@PI6@`I86@lFP@|FP@FP5@KH@K`@FP@K6@FP@FP@FP@FP@RP@FP@K6@FP@T6@T6AFPAFPA$FPA,FPA4FPA<J6ADJ6APJ6A\K6AhJ6AtJ6AK6AJ6AKP6AK6AFP6AJ`6AJ@6AJH6AJ6AFPAFPBK86B Kp6BK6B$K6B0K6B<J6BHJ6BTK86B`K6BlK6BxFPBFPBFPBFPBU6BM06BMX6BL6BMh6BL6BM6BN6CFP6C N86CM6C(MX6C4M6C@M6CLNh6CXN6CdN6CpN6C|N6CM6CN6CFP6CN6CN6CN6CO6CO6CFP6CP6D Q6DP6D$Q6D0Q 6D<QX6DHP86DTPX6D`P86DlQ6DxQ6DQ6DR6DR6DQ6DP6DQ6DR6DR6DFP6DFP6EFP6EFP6E Rx6E0S06E<TX6EHTX6ETTh6E`T6ElTx6ExFP6EFP6ES6ES6ET6EFP6EFP6ET6EU 6EFP6FFP6FFP6F U6F0FP6F<5l 87%>?('.>?&?9:>?:>?)>?>?>?>?>?>?>?>?>?>?>?>?>?>?>? $&?>?>?>?>?>?>?>?>?>?>? 8#?1/0??29:>?>?,+"*->?>?>?>?>?>?>?>?>?>?>?>?>?>?>?!>?>?>?>?>?>?>?>?>?>?<==;>?>?>?>?>?>?>?>?6>?>?>?>?>?>?>?>?>?>?>?>?>?>?>?>?>?>?>? >?>?>?>?>?>?>?>?>?>?>?>?>?>?>?>?>?>?>?>?3>?4>? >?5>?>?>?>?>?>?>?>?>?>?>?>?>?>? >?>?>?>?>?>?>? >?       EA B !"#$%&'()* B CFGH+,-./0123MMMMMMMMOPQRS T!U4"V3#W$X%Y&Z'[(\56)]*^78+_,`4N-a.b0c?3d5f956@ 786g:4T7h;8i:k<=4e9_;l9N<m=nAo9j>BpDqTt?:KrUu;VvA<=WwXx???YyZz[{Dq>\|?Kr]}_~`ab{e?fghiDjklmln?tuvwxIyz|}~JIKIIIIIIIIIILIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIKIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIMMMMMMMMMMMMMMMMMMNsNsNsNsNsNsNsNsNsNsNsNsNsNsNsNsssssssssssssssssssssssssssssssssNsNsNsNsNsNsssssssssssssX  $$/0111111188AAAAAA$$$$$$$$$$$$$$$$$X$$$AAAAAA$$$$$$$$$$$$$$$$$X$$ @(#)lists.c 6.1 87/11/24 @(#)system.h 6.1 87/11/24 @(#)list.h 6.1 87/11/24 @(#)structs.h 6.1 87/11/24 @(#)sgsmacros.h 6.1 87/11/24 ##(#P#|##$X$%D#%%%&& &X&t&&&<''D'l''( (4(\(' @(#)util.c 6.1 87/11/24 @(#)system.h 6.1 87/11/24 @(#)structs.h 6.1 87/11/24 @(#)extrns.h 6.1 87/11/24 @(#)sgs.h 6.1 87/11/24 @(#)sgsmacros.h 6.1 87/11/24 %.1lx is not a power of 2memory allocation failure on %d-byte 'calloc' call%s run is too large and complex : %d %s%sld warning: fatal: @(#)system.h 6.1 87/11/24 @(#)bool.h 6.1 87/11/24 @(#)attributes.h 6.1 87/11/24 @(#)list.h 6.1 87/11/24 @(#)structs.h 6.1 87/11/24 @(#)extrns.h 6.1 87/11/24 @(#)sgs.h 6.1 87/11/24 @(#)sgsmacros.h 6.1 87/11/24 @(#)ldmacros.h 6.1 87/11/24 syntax error%s : scanned line = (%s)1`1l1l13<? 3@? ? ? ? 3D3X? 3h3? 334? 4455 ? 5$5(5x5556H6X? ? ? 6h6x? 6? ? ? ? 66? 6? ? ? ? ? ? ? 667 7P778999 9,9<9H9T9`9p? ? ? ? 9|99:4:x? ::; ;P;;;;;== =8=P=h==================? ? =>>>,>H>d>>>>>>??.tvyacc stack overflowsyntax errorREGIONS command not allowed in a %s loadregion %s has invalid lengthvirtual 0 (paddr %.1lx) of region %s is not a multiple of 16addresses of region %s (vaddr=%.1lx len=%.1lx) exceed 64KREGIONS specification ignoredvirtual address %.1lx exceeds 0xffff: truncated to %.1lxMEMORY specification ignoredbad attribute value in MEMORY directive: %cusage of unimplemented syntaxusage of unimplemented syntaxusage of unimplemented syntaxusage of unimplemented syntaxusage of unimplemented syntaxusage of unimplemented syntaxbonding excludes alignment*group*bad flag value in SECTIONS directive: -%scan not specify an owner for section within a groupsection %s not built%s is a reserved section namebonding excludes alignmentcan not bond a section within a groupcan not align a section within a groupstatement ignoredunexpected EOFbad fill valuesemicolon required after expression @(#)special.c 6.1 87/11/24 @(#)system.h 6.1 87/11/24 @(#)params.h 6.1 87/11/24 @(#)structs.h 6.1 87/11/24 @(#)slotvec.h 6.1 87/11/24 @(#)extrns.h 6.1 87/11/24 @(#)list.h 6.1 87/11/24 @(#)sgs.h 6.1 87/11/24 @(#)sgsmacros.h 6.1 87/11/24 .text_btext_etext.data_bdata_edata.bss_bbss_end*vax.default.file*.text*group*.data.bssfile %s is of unknown type: magic number = %06.1x.textrelocation overflow (+) : %x for symbol: index %ld, section %s, file %srelocation overflow (-) : %x for symbol: index %ld, section %s, file %sDEEDEEHH\HHI0Ifail to read the reloc entries of section %s of %sreloc entry (%10.1lx, %ld %d) found for non-relocatable symbol, in section %s of file %sIllegal relocation type %d found in section %s in file %sfail to copy the rest of section %s of file %sfail to copy the bytes that need no reloc of section %s of file %sReloc entries out of order in section %s of file %sfail to read the field to be relocated of section %s of file %sNo reloc entry found for symbol: index %ld, section %s, file %sunknown flag: %su @(#)alloc.c 6.1 87/11/24 @(#)system.h 6.1 87/11/24 @(#)structs.h 6.1 87/11/24 @(#)extrns.h 6.1 87/11/24 @(#)list.h 6.1 87/11/24 @(#)params.h 6.1 87/11/24 @(#)sgsmacros.h 6.1 87/11/24 @(#)ldmacros.h 6.1 87/11/24 bond address %.2lx for %.8s is outside all configured memoryGROUPbond address %.2lx for %.8s is not in configured memoryGROUPbond address %.2lx for %.8s overlays previously allocated section %.8s at %.2lxGROUP%.8s, bonded at %.2lx, won't fit into configured memoryGROUP%.8s at %.2lx overlays previously allocated section %.8s at %.2lxGROUP%.8s enters unconfigured memory at %.2lxGROUPDSECT %.8s can't be given an ownercan't allocate section %.8s into owner %.8sDSECT %.8s can't be linked to an attributecan't allocate %.8s with attr %xinternal error: audit_groups, findsanode failureinternal error: audit_groups, address mismatchcan't allocate output section %.8s, of size %10.1lxinternal error: in allocate lists, list confusion (%d %d) @(#)dump.c 6.1 87/11/24 @(#)system.h 6.1 87/11/24 @(#)structs.h 6.1 87/11/24 @(#)extrns.h 6.1 87/11/24 @(#)expr1.c 6.1 87/11/24 @(#)system.h 6.1 87/11/24 @(#)structs.h 6.1 87/11/24 @(#)extrns.h 6.1 87/11/24 @(#)sgsmacros.h 6.1 87/11/24 @(#)ldmacros.h 6.1 87/11/24 ]b] ]]bbbbb^L`(`L`bb`|b``b`bba ba0aTaxaa`abb8b\bbbmisuse of DOT symbol in assignment instructionundefined symbol in expressionALIGN illegal in this contextillegal assignment of physical address to DOTphy of absolute symbol %s is illegalsymbol %s is undefinedinternal error: no symtab entry for DOToperand of PHY must be a nameillegal operator in expressionsymbol %s from file %s being redefinedabsolute symbol %s being redefined @(#)ld01.c 6.1 87/11/24 @(#)system.h 6.1 87/11/24 @(#)structs.h 6.1 87/11/24 @(#)extrns.h 6.1 87/11/24 @(#)list.h 6.1 87/11/24 @(#)sgsmacros.h 6.1 87/11/24 @(#)instr.h 6.1 87/11/24 @(#)ldmacros.h 6.1 87/11/24 arinstr.datainstr.dataCan't open 'instr.data'%07ld %07ld %07ld %07ld %07ld %07ld %07ld %07ld %07ld %07ld %07ld %07ld %07ld %07ld %07ld %07ld %07ld %07ld @(#)ld1.c 6.1 87/11/24 @(#)system.h 6.1 87/11/24 @(#)structs.h 6.1 87/11/24 @(#)extrns.h 6.1 87/11/24 @(#)list.h 6.1 87/11/24 @(#)params.h 6.1 87/11/24 @(#)sgsmacros.h 6.1 87/11/24 @(#)ldmacros.h 6.1 87/11/24 @(#)sgs.h 6.1 87/11/24 inimplemented feature: value definition for symbol %.8s*dfltmemmemory types %.8s and %.8s overlap%ld` %ld` %ld` %ld` Can't open file %sfail to read section headers of file %scan't read archive header from archive %sarchive %s is emptycan't read archive header from archive %sarchive symbol directory is missing from archive %s execute 'ar ts %s' to restore archive symbol directorycan't read archive symbol directory number of symbols from archive %sarchive symbol table is empty in archive %s execute 'ar ts %s' to restore archive symbol tablearchive symbol directory in archive %s is too largecan't read archive symbol directory of archive %scan't read archive string table of archive %stoo few symbol names in string table for archive %scan't read archive header of archive %sinvalid archive size for file %scan't read file header of archive %scan't read archive header of archive %sinvalid archive size for file %scan't read file header of archive %sfail to seek to symbol table when search librariesfail to read symbol table when search libraries.bssfail to read symbol table when search librariesfail to read symbol table when search librariescan't read archive header of archive %sinvalid archive size for file %scan't read file header of archive %sfail to read symbol table when search libraries.tv.tvfail to read section headers of file %sfail to read section header of file %sfile %s has a section name which is a reserved ld identifier: %.8sfail to seek to symbol table of file %slibrary %s, member has no relocation informationfile %s has no relocation informationfail to read string table of file %sfail to read string table of file %sfail to read string table of file %s(common).bssr! @(#)ld2.c 6.1 87/11/24 @(#)system.h 6.1 87/11/24 @(#)structs.h 6.1 87/11/24 @(#)extrns.h 6.1 87/11/24 @(#)list.h 6.1 87/11/24 @(#)params.h 6.1 87/11/24 @(#)sgsmacros.h 6.1 87/11/24 @(#)patch.h 6.1 87/11/24 (common).bss.data*default.bond.file*GROUP containing section %.8s is too big.text*default.bond.file*adding %s(%.8s) to multiple output sections%s(%.8s) not foundattempt to decrement DOT.text.data.bss-pad%2d-.dotsection %.8s in file %s too biginternal error: split_scns, size of %.8s exceeds its new displacement%c%x%.6ssection %.8s in file %s is too big.patch0%d.patch%d.text.data.bss @(#)version.c 6.1 87/11/24 1.5: 3/13/83 @(#)maps.c 6.1 87/11/24 @(#)system.h 6.1 87/11/24 @(#)structs.h 6.1 87/11/24 @(#)attributes.h 6.1 87/11/24 @(#)extrns.h 6.1 87/11/24 @(#)sgsmacros.h 6.1 87/11/24 .tv XIWR MEMORY CONFIGURATION name origin length attributes %-8.8s %08.2lx %08.2lx LINK EDITOR MEMORY MAP output input virtual section section address size *avail* %08.2lx %08.2lx %-8.8s %08.2lx %08.2lx DSECT NOLOAD uninitialized *fill* %08.2lx %08.2lx %06.2x %-8.8s %08.2lx %08.2lx %s (%d) @(#)output.c 6.1 87/11/24 @(#)system.h 6.1 87/11/24 @(#)structs.h 6.1 87/11/24 @(#)extrns.h 6.1 87/11/24 @(#)slotvec.h 6.1 87/11/24 @(#)sgs.h 6.1 87/11/24 @(#)patch.h 6.1 87/11/24 @(#)sgsmacros.h 6.1 87/11/24 @(#)instr.h 6.1 87/11/24 @(#)params.h 6.1 87/11/24 @(#)ldmacros.h 6.1 87/11/24 wr+r+wwError(s). No output written to %sCan't create output file %s/dev/null.patchSection %.8s starts on an odd byte boundary!Symbol referencing errors. No output written to %sOutput file %s not executableCannot complete output file %s. Write error.fail to write size of string table for file %sI/O error on output file %sI/O error on output file %sI/O error on output file %sI/O error on output file %srr(common)Can't open %sinternal error: fail to seek to the member of %sfail to read file header of %sfail to read section headers of %sfail to read section header %d of %sSeek to %s section %.8s failedSeek to %s section %.8s reloc entries failedSeek to %s section %.8s lnno failedfail to read lnno of section %.8s of file %sline nbr entry (%ld %d) found for non-relocatable symbol: section %.8s, file %srLLlr %ld` fail to read archive header of file %sinvalid archive size for file %sfail to read symbol table of file %sno string table in file %sfail to skip the aux entry of %sundefined first referenced symbol in file %-20.20s %sfail to skip the aux entries of %sfail to read aux entries of file %s.text.data.bssSections .text .data or .bss not found. Optional header may be useless__startup___startup_main.patch0%d.patch%dfail to write symbol name %s in string table for file %s @(#)slotvec.c 6.1 87/11/24 @(#)system.h 6.1 87/11/24 @(#)define2.h 6.1 87/11/24 @(#)structs.h 6.1 87/11/24 @(#)paths.h 6.1 87/11/24 @(#)slotvec.h 6.1 87/11/24 @(#)extrns.h 6.1 87/11/24 fail to allocate %ld bytes for slotvec table @(#)syms.c 6.1 87/11/24 @(#)system.h 6.1 87/11/24 @(#)structs.h 6.1 87/11/24 @(#)paths.h 6.1 87/11/24 @(#)extrns.h 6.1 87/11/24 @(#)sgsmacros.h 6.1 87/11/24 @(#)instr.h 6.1 87/11/24 @(#)ldmacros.h 6.1 87/11/24 internal error: symbol table overflowSymbol %s in %s is multiply defined.Symbol %s in %s is multiply defined. First defined in %sSymbol %s in %s is multiply defined. First defined in %sSymbol %s in %s is multiply defined.Making aux entry %d for symbol %s out of sequenceinternal error: aux table overflowOverwriting aux entry %d of symbol %sinternal error: aux table overflowinternal error: negative symbol table idinternal error: invalid symbol table idinternal error: negative aux table idinternal error: invalid aux table idfail to read symbol table of file %sno string table in file %sMultiply defined symbol %s, in %s, has more than one sizefail to read aux entries of file %sfail to skip aux entry of %sfail to skip the aux entry of %sfail to read aux entries of %sfail to skip the aux entry of %sfail to skip the mem of struct of %sinternal error: symbol table overflow.dot%03d @(#)instr.c 6.1 87/11/24 @(#)reject.c 6.1 87/11/23 @(#)yyless.c 6.1 87/11/23 @(#)yywrap.c 6.1 87/11/23 @(#)sgetl.c 6.1 87/11/23 @(#)calloc.c 6.1 87/11/23 @(#)malloc.c 6.1 87/11/23 @(#)memset.c 6.1 87/11/23 @(#)mon.c 6.1 87/11/23 PROFDIRmon.out @(#)perror.c 6.1 87/11/23 : Unknown error @(#)data.c 6.1 87/11/23  @(#)filbuf.c 6.1 87/11/23 @(#)flsbuf.c 6.1 87/11/23 @(#)stdiom.h 6.1 87/11/23 @(#)fopen.c 6.1 87/11/23 @(#)fprintf.c 6.1 87/11/23 @(#)fread.c 6.1 87/11/23 @(#)stdiom.h 6.1 87/11/23 @(#)fseek.c 6.1 87/11/23 @(#)ftell.c 6.1 87/11/23 @(#)fwrite.c 6.1 87/11/23 @(#)stdiom.h 6.1 87/11/23 @(#)printf.c 6.1 87/11/23 @(#)rew.c 6.1 87/11/23 @(#)scanf.c 6.1 87/11/23 @(#)sprintf.c 6.1 87/11/23 " @(#)errlst.c 6.1 87/11/23  (<P`t 0DXl(DXt.Error 0Not ownerNo such file or directoryNo such processInterrupted system callI/O errorNo such device or addressArg list too longExec format errorBad file numberNo child processesNo more processesNot enough spacePermission deniedBad addressBlock device requiredDevice busyFile existsCross-device linkNo such deviceNot a directoryIs a directoryInvalid argumentFile table overflowToo many open filesNot a typewriterText file busyFile too largeNo space left on deviceIllegal seekRead-only file systemToo many linksBroken pipeArgument out of domainResult too largeNo message of desired typeIdentifier removedChannel number out of rangeLevel 2 not synchronizedLevel 3 haltedLevel 3 resetLink number out of rangeProtocol driver not attachedNo CSI structure availableLevel 2 haltedDeadlock condition if locked @(#)getenv.c 6.1 87/11/23 @(#)isatty.c 6.1 87/11/23 @(#)memchr.c 6.1 87/11/23 000000000000000000000123456789abcdef0123456789ABCDEF @(#)doscan.c 6.1 87/11/23 lbbbtl| @(#)findiop.c 6.1 87/11/23 @(#)dowrite.c 6.1 87/11/23 @(#)print.h 6.1 87/11/23 @(#)ungetc.c 6.1 87/11/23 @(#)atof.c 6.1 87/11/23 @(#)ctype.c 6.1 87/11/23 ((((( H @(#)ecvt.c 6.1 87/11/23 Fn CAy7Aׄ@È@Y@$ @(#)ldexp.c 6.1 87/11/23 @(#)frexp.c 6.1 87/11/23 u!T mh.textmh .datan@.bss-- 0  !2$0 "+[WP@DHޠ~L. B  BpՍ Hx -q x(! 0a#(! ~p0W a!0 !!0 t a!0 !!0 D a!0 !!0 LX a!0 !!0 ( a!0 !!0  a!0 !!0 ` a!0 !!0 T a!0 !!0 $'X= qI0+0(0!0!0 0!.0@0H 0P 0X0`0h@04$ X= X 02004@01p0,Ѐ0#00     0p0hW0p  X ~LǎHǞDǮ@PPW@~<p0h$ XГ<> p0h~<@@W@~<“P0` pp,0` 0xX;V04"00=L.r0# ` \$c00. 4; ~<@@W@ J"dV0# ‹"c800. r @@W@~< d0`j 0x00 < p" 0xX:.x|0" ;>cT0# 0`  tE~<@@W@ ln0`F05( 0xH 92H40" 0# @@W@Z (0:t :R0:0X,8fV (m00. $c00. @@W@` ċf0` R>05 (0x  HP7r0# V (@@WH@~D0 0!XX7 `pހ9q0"8p0X0xh0Xq" 0xXt6h&00F0ж0q0`w~Dǎ@HHW@407 7080ЍX5 0(9J r@@WP~@0P70ȍ 0G(7G(.$ 0PXē5Z0!7p(0x0#<0 6$ 0PX4~@PPWH0P600" 0PX4*0P5 50P6.0$ 0PX 3.0$(7n T0?(5?0(,$ 0PX<3fHHW@ 0X`3$x@@W@ 0PX2>@@W8d88W8 ȧ~4p0 6"0 60؆ 5&~488WH<@~Dp8 0X !X1q0`~Dǎ@Ǟ<HHW 0X20$00`0WH@~Dpp 0X0xP0Xa" 0xX1$q0`"~Dǎ@HHWH@~Dpހ3q0ȍ&0" 0PXؓ00ȓ2:0P2B0ȍ$ 0PX0F0V0 2<&0@'3 0@ 2Hp0؆V0 1&0@'3^ 0@ 1p0VP 1&0@'3 *P@ 1p~Dǎ@HHW@~<p0x 0'0000000000ж0,0H~<@@W@~<0x0p (00,/~<@@WHX\`dhl~pr0x000  (0,0004Pw ^8. <$ 0PX0-^Pw <& P <0 < ^Q^PV^0΀x(p @q^P @'/  @(0N v0 00} ~pǎlǞhǮdǾ`\XW@0P <.| <,00P0жPvPBt"%880!-( Xx+P1 2#0/# ! !PHP$L0x0PH $Pp 0,|P$l 0+^P*h 0+@P0d 0+"P8` 0+* 0PX0PH*@@W@8~<p| 0X b 0X< 0x ".0Xp0xpq0`~<ǎ8@@W80@ȅĔ <0x 0H"L0@0  |0@ l0* *0+<Xē(0жP088W@ 0xX(@@W@P05 P.c (00xH(N@@W@H -.!-- @@W  0/#   (! !0/ !W@x 000H'N 0H '60  1H('@@W8 ȧ~4pȋt((~488W8 !00 # HH"! H!ԋ"L L88W8@&b88WHTX\~``XT%PXP`0!' P`Php$0q ' $ 0PXx%6z zph`PX P`p!PppFPX j PXX$F0q & $ 0PXȓ$dp0 <P`P`0Ph P` &0* 0P00xX#Hg0ȓ%0'^00'H00'20ؓxp xQ%pPX!p0xp"ϡ<pހPpސ  8qPX &j 0(,0ħ4PPg D^8$ <$ 0PXX"0g <&( <v0$& \0 PXp"%PX p!40x p1!%p0x ! ړ|00.ʓ~`ǎ\ǞXǮTW@~<0$p0#\p0v0 # $ 0PX@!"v Q(! H0B#(! pW (! D (!  & }(! 0`#(! pW  Xp 0 v0p00#Fp0`p0 X 0 00#p0~<@@WX?@DHLPܧ~Tp   q   p (,  X(  0  l ؓX" !% ( !0A21 Z2#!! ~TǎPǞLǮHǾD@XXW@8~<p,χ /! ~<ǎ8@@WXDHL~PpxH x$ 0PXJxpd`PPN0!PP  `ր֐0* 0P00xX8P` Ph< 6^0 H0) .0 Z`* 0P00xX\ ^P>TP`!&"#1^TP ` a* 0P00xXրp`p p`x p(fP Q P x$ 0PX ^x p! p`p 0xb#(`V QP 6x$ 0PX̓rxppp A0!C( 10 pp~PǎLǞHǮDXXW ~qBc@0 470~W8$ 88WP<@D~Hp, LLpǀ1'2ב סzH@80(L LLp  ~HǎDǞ@Ǯ<PPW :"4 mn2"'W Q!Q Q 0<- # -- p'-JF" 4#  m  n 4#  m  n!0F 4# m n$--Ć mn n ؋2$21  ----W@8- P~<2!0!!l1l-A!42A!4"1#x(2"#"2A!42A!4"1#t't'"dt'"drt'"d\8 d# 2! 0!("d*~<ǎ8@-@W@!:#:#"0$0 #0*0W8 00  0 B!41 -RA!*P%00(# %09(# $@ <^2 00  0 B!4188Wp* [B@8~     BG G!    g   ,Q"%(  D b j D p     ~@ǎ<HHWH<@~DpǐLJ D   p8  p8' (. (   ~Dǎ@Ǟ<HHW8 ȧ~4p  *        |'Q!R D D p8%  ' p87! ,~488W@8~<p  ( ppP0W8( pp@8^턧*    p8& ppP0W8fW @  ~<ǎ8@@WP pR8 a!` !W@~<p.`W .`&0 2  &'  ~<@@W@\.`.\8T@@W@.` >`#&@@WX@~D.x qώxTP.LH@HU(~Dǎ@XXWP.p0>@DH".L @.M.p.@.DPPW!![W[W![W![ W[W2![W2![WC2!,[W2![`W[HW [W!00[WH .(N0n8@HPX` W`X .(N0n8Ɏ@ɮHPԩة>^觾[ [W [,W2![WWPT.> PPWp.....Ǽ/ @P PP/$PpRU8P/$%py}kg,P/$(VP p:w]ѡ[q" ,/(0/(ְ/(Fp/@c(stdxX܋ `/ d`/ P/$([P  ,/(0/(ְ/(`/ d`/ (P/$[PQ̡P! ! ,/(0/(ְ/(`/ d`/ 'Π- 8ы0):@0CAMр ѡ(P/$[P Q фP р}-!ш},/(0/(ְ/(`/ d`/ / q#фыh`/ d`/ / q#ȡфы4/./`/ csd(u$+\-` d#h.l*x0Āelh%ox0XeEfgGn9ld`/  /d`/ @ / / "  !/`d`/ }.; -!10.@@ V 8@  /  +!10."  /  !10. @ /00 0ѡ $@ZPECѡMѡ p/ }/ u// ^d`/ } pq 5#"0ѡP n b V J@ / 6@ */d`/ / / d`/ / @     0 9: @ / /z /WC0#_D0#ȋ_D0#d`/ - /p&@ 4//  a@ '/ -// pX Oo620.x 0 .."X.  //   @ / & / g `h`/ / 0!#и.0/,@/0ȧN(.t.8/0 - ..D  5  + .. ..g ю 0ѡaP/ P .aP6 QaP P/P/ ׶`/p/8g. 06P/,QPU):RECAaFSRQaVrgaga/,- +aea E`.rvp/// #2#: @ / & / g `h`/ / 0<#0/,@/0ȧN(..8/0`/ P/,/Q)-0!-.! .B +.! .   .! .E00@qA0- '1qA@Aq@ `  .'qF<Ad &$ / /A@> QP&#1qA@Aq@/@p/`/ #H / @ & /  ! / g `h`/ 0#.0/,@/0ȧN(..8. /,`/  FF=11=CCAM 0AMAP/,VA@/ E@/ p/}@.g/d``//  >  / /// @.p../#,/(0/(ְ/(zkg(P/$(VPp: w q&#,/(0/(ְ/(@.p..@ekd,/$( .DA4.,/(0/(.$.ְ/( ֠/./#,/(0/( ְ/(Jkd(P/$(VP@:0D A&#,/(0/( ְ/(.pTkg(/$( wq( ,/(0/( ,ְ/(     / ֠/./#,/(0/( ְ/(Jkd*P/$(VP@<0D A&#,/(0/( |ְ/(. fp/p\kg,/$( .wq,.,/(0/( ְ/( ֠///#,/(0/( ְ/(Jkd*P/$(VP@< D A&#,/(0/( hְ/(H{ p   /$( @  ^@ , 2 ! . 00  +    p.ؐ.ذ...WhLPTX\`~dpЩ.   %ad!0%a!#"(    % %Xh!! . 4  * %aߎ ޠ l h  [ h  %aΰl cf[^T!0%a!#"(  cs [(~(^ *>h^,"~(^ *;^,h    ~dǎ`Ǟ\ǮXǾTPLhhWP8<@DHL~P~P^^^ϞT^^x^:d2p#W^Q^ΰ L +!R  ->^Q^\![RQ^ %a^P v %a0& %a 7W(!^Q^.^Q^e E|t^Q^d$! %a+ - B!s` T). 2 l.242# .242""7^P l$^PLh(^z ^P~PǎLǞHǮDǾ@<8W`<@DHLP~T~ XcsR[\RP^\*)b!!0#.0%a#"( ^\P!+"  DnX  c ~TǎPǞLǮHǾD@<``WH<@~Dp^qV  ,1 ]2 - qR Z -87#@]$*'B2 2# q q1 ]2~Dǎ@Ǟ<HHWH@~Dp `W & !   D 6ހ8  @  DH(  ! p!8!7 dR   .   W    ~Dǎ@HHWP@DH~Lr @D''!' )7 P)l ~LǎHǞDǮ@PPW ! ^ 0(,01  !W2!6[ W`@DHLPT~XP^\0%a #"( + "  -^\Q^\ p1@ΐ. ~Hΐ0 Aj0ސ ̈ *ސ ̈:zA@ސ ̈* ސ ̈:zpޠ%aeΐ. TB 9Ȍ19#59'3( E e 0@ (@@0@ (@@ @+ @-1p%a@GDD@>@B*  p%a@GDD@0 p$$,=:yp6p?qq5yq%8($ K ?0@@A@ q5'@sA@  6! #;K;;#\ 2  ~XǎTǞPǮLǾHD@``WPHx~Lp(,j~LǎHPPWPHx~Lp(,"~LǎHPPW`?8<@DH~Lp.ޠ//:T 2p/ p///p  :X ސ& /p  C@:8 6p  : @$:@$ 1 P@$`^P5%cR:W^XP'86 0":B0C9"5 4r+!+ @$0:  ?05N?:@ 5p  5 @$0:  /( /( /:/( 0 &009 4 @$05p (  5(T/ &1/  &0   9( ~LǎHǞDǮ@Ǿ<8`/`WP@D~Hr :  .LpL8":GA5pp!`' pq90A@3 95pL1"P>5p(`pq91A 31906~HǎDǞ@PPW0 1 @4AW   ?  ?0 6    W6    WX<@DHLPҧ~TsRNW  ( ( D R \ pױ8'(R (> )     ,   aP/\ +! (() )((  ' p87! BW  D ,,- , ~TǎPǞLǮHǾD@<XXWA0~: r:2rqrp?5p?:pprq3rp?:ppp:sp2~ǎW0@ A#1 ! 1W @(#)ar.c 6.1 87/11/24 T$.ar: bad option `%c' ar: one of [%s] must be specified ar: only one of [%s] allowed ar: cannot open %s ar: %s cannot create <%s> arar: cannot create third temp %s ar: abi not allowed with q ar: %s cannot open arar: cannot create temp file ! ! ar: %s not in archive format ar: %s cannot seek ar: creating %s ar: cannot create %s ! ! ar: %s not in archive format usage: ar [%s][%s] [posname] archive files ... ar: %s does not exist ar: %s not found ar: %s cannot open ar: creating %s ar: cannot create %s ` %-16s%-12ld%-6u%-6u%-8o%-10ld%-2sar: %s internal header generation error %ld%o%d%d%ld` ar: malformed archive (at %ld) ar: %s bad header layout for %s arar: cannot create second temp ar: phase error on %s %c - %s /%6d/%6d%7ld %-12.12s %-4.4s ar write error` ar: cannot make symbol directory ar: internal error, archive %s out of order! ar: too many external symbols ar: internal error, archive %s out of order! ar: %s cannot skip string table for %s %-16s%-12ld%-6u%-6u%-8o%-10ld%-2s/ ar: %s internal header generation error R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R ar: internal error, archive %s out of order! ar: (warning) file %.16s in pre 5.0 format ar: (warning) file %.16s pretends to be an object file //usr/tmp/TMPDIR/tmpXXXXXXPar: %s cannot get string table space ar: %s missing string table for %s ar: %s bad strings table for %s ar: %s bad string table offset for %s ar: %s cannot grow string table ar: %s cannot grow string table r-w-s@x- r-w-sx-r-w-tx- 0@XhxmrxtdpquvcbailsAAA @(#)sputl.c 6.1 87/11/23 @(#)ctime.c 6.1 87/11/23 Day Mon 00 00:00:00 1900 SunMonTueWedThuFriSatJanFebMarAprMayJunJulAugSepOctNovDecTZpPDTPSTW`/Lw/K:/JMFw/ @(#)getenv.c 6.1 87/11/23 @(#)malloc.c 6.1 87/11/23 @(#)mktemp.c 6.1 87/11/23 @(#)mon.c 6.1 87/11/23 PROFDIRmon.out @(#)perror.c 6.1 87/11/23 : Unknown error @(#)data.c 6.1 87/11/23 @@H8@8 @(#)flsbuf.c 6.1 87/11/23 @(#)stdiom.h 6.1 87/11/23 @(#)fprintf.c 6.1 87/11/23 @(#)scanf.c 6.1 87/11/23 @(#)sprintf.c 6.1 87/11/23 H @(#)errlst.c 6.1 87/11/23    8 D ` t       ! !!$!8!H!X!h!|!!!!!!"""("4"L"`"|"""""##$#@#P.Error 0Not ownerNo such file or directoryNo such processInterrupted system callI/O errorNo such device or addressArg list too longExec format errorBad file numberNo child processesNo more processesNot enough spacePermission deniedBad addressBlock device requiredDevice busyFile existsCross-device linkNo such deviceNot a directoryIs a directoryInvalid argumentFile table overflowToo many open filesNot a typewriterText file busyFile too largeNo space left on deviceIllegal seekRead-only file systemToo many linksBroken pipeArgument out of domainResult too largeNo message of desired typeIdentifier removedChannel number out of rangeLevel 2 not synchronizedLevel 3 haltedLevel 3 resetLink number out of rangeProtocol driver not attachedNo CSI structure availableLevel 2 haltedDeadlock condition if locked @(#)isatty.c 6.1 87/11/23 000000000000000000000123456789abcdef0123456789ABCDEF @(#)doscan.c 6.1 87/11/23 ZDZ:Z:Z:Z\Z\Z\Z\Z\Z\Z\ZLZ\Z\Z\Z\Z\ZDZ\Z\ZT @(#)filbuf.c 6.1 87/11/23 @(#)dowrite.c 6.1 87/11/23 @(#)print.h 6.1 87/11/23 @(#)ungetc.c 6.1 87/11/23 @(#)atof.c 6.1 87/11/23 @(#)ctype.c 6.1 87/11/23 ((((( H @(#)ecvt.c 6.1 87/11/23 Fn CAy7Aׄ@È@Y@$ @(#)ldexp.c 6.1 87/11/23 @(#)memset.c 6.1 87/11/23 @(#)fwrite.c 6.1 87/11/23 @(#)stdiom.h 6.1 87/11/23 @(#)frexp.c 6.1 87/11/23 @(#)memchr.c 6.1 87/11/23 u!TY A84 `.text .data ` `A8`@.bssMM4; 0  !2$0  `#BFB[WxL~P qeT/h~hǎl-2.dp(,t 0T7`@@4 p (,t ܧ0T7_֋$4   7[~PǎLxxWpT~Xp*\0-@\.^>`NdN(NhN,NlN0Nn 0N4_&`\.^ l_?0 .d>hNl |N(^  ^‹0   ^ ^ ^| ȓ^f ؓ^P ^:   ^  ^ @ $]  8] ,]"4L  (8Y~XǎTppWXDHL~Pp 52&4 x8Yb]qd7V!Y$4 t8Y Vē\Ǝ\F7V!Y@4 p8XV\`|\T~PǎLǞHǮDXXWxLPTX~\pç-X -Z-` -b-X .`6R*0 94 W-H`(M .h>lt(x,| 0`[0-(.p>NXN([&p.>Z ) ! -HQ0*54 (V~\ǎXǞTǮPǾLWpHLPTX\~`pZ.P^-X -Z-` -b-XҎ .d4v*0 <4 U-Hd(K XQd^&xYb. 4*0 <4( ܓUXNYt"!!! K!2!!4x4x 84xNJ&4|!4|84x4x 94xM&4|!4|9!!! J!2!!4x4x 84xMn&4|!4|84x4x 94xM&4|!4|9W@W0%t!!! I!2!!4x4x 84xLb&4|!4|84x4x 94xL&4|!4|9V4 , !9V-HQ0(54L ا(R~`ǎ\ǞXǮTǾPLHWXDHLPTX~\p *Un-6` #v 4(Qjr-X -Z-` -b-XŽ-HЋ ./r*0 :4 P-H(F ` &> .*0 :4 PhpÞ7t!P$4 |8P(0-"t.x>|$SЋt.x<S^| (* (pSPSvx .`/6 `%T XhS:S( * !1-HQ0*54t x(O-  ~\ǎXǞTǮPǾLHDWXHLPTX\~`p RZ-6`  b 4(NVP-X -Z-` -b-XŽ .,j*0 :4 M-H(C L QZ& (*0 :4 MPJÞ7x!M$4 8M ^|Pz-x%,PVx.|<Px .d,Z d"x L\P^x.|dPF3P4 * !E-  -HQ.(54x (L ~`ǎ\ǞXǮTǾPLHWXlptx~|p*4(KO\-p-h -p-p +&4 8K* ր-h.*$4 8J  ޠ -H @vNh $(,. >$0  4.)&84$ JHM-~ 0  0.>NN(NPN,M:.>N(,0#4MXd $(08@. >$~HLL~|ǎxǞtǮpǾlWP~LpptLpLvx.|z"ԓL`-dpx (. >$@px (. >$ ! !~K 'K~LPPWDH~Lp:K~'&4 8G .l'$4@ 8GHl d.z00 #0 # -P < }^z 0  Z Z7X!G<(84t  Fd " -P4FH-P-xX -!N!>PP.TIƋ -x4ԓEڋ&4EҀ-xR.Pr*0 84 EpP.T4I&-H&P.TDITހ  .PɋV&P.TXHTހ -  .PHx~LǎHǞDW@~<p-(tH*qHpH~<@@W8^   p 0 s !( !(  2tL !p@Ghl !pHGDH !pPG $ !pXF88W8` dNgF^`(p``p`F,`jFfFV88WHp~Dpg(g(,2(( R$jxE֋n x.|>~En@7*x.|>~NاN(EpBn 0   tvn 0 q.xE.put|Et,.D0D4.>N@N(DhD|pD~|Dv,.D~Dn4.>NN(DJГD:~DHHW@8~<p<D   njpW8CNDC<LC(4CTC &0Ch\C\ @ ,,C:dC.4 &(C$BL4x4x 4x8|"4|!4|  B~<ǎ8@@Wx@DH~Lp LJ eDPB4p>J.p! ' ?4>7t!>h rPD4x4x 4x7$ 4|!4|jA>4x4x$  !4x6$4|!4| !!! 3'1  tt4<D4x4x 4x6 4|4| ~LǎHǞDǮ@xxWpDH~Lp e d =7P<!|n  p>* !!4x:.4x4xb!!! 1` !2!!!  !4x3 d!!!1 !2!!!4|14| !  ! 4x4x 4x3h 4|!4|~LǎHǞDWP@DH~LpqDp$4 9T"qpq$z Ǚqpㆠ0 @y  z "4~LǎHǞDǮ@PPWPDH~Lp&4 78^ u4 p,4 78( F$4 7!Xx~LǎHǞDPPWh@DHLPT~Xp-p-;>LǸ( ,ގ { P^P#^P̧^P,^X-*- :^^Ǹ` Q e%h&84 6Tj ` <(_>`;F- _W     6(^5W,Z { ~^Q^^X^^T^^T^^Zu~XǎTǞPǮLǾHD@WXDHLP~TqB - V(! Z V(!  z(! >0a#(! 2p)W,:-,- --- -(-@--08t-P4) )3-P-P,) 2 02q!!#"$ -x6 2qtd-x8t-H4* )3"-H-88.Lt-h4 ^-h(-\: 2q t -X4*D )2&XQ 2q$-X4* )1΋`4* *0*1>-0-$14+ )1ngQ +b t-8@6 2qt-pNW 2qr-p4+@ )|0Q dZ: 2q t-`4+ )x0LW 2q-`4+ )t/ʋQ zZ: 2q tf-4,0 )p/RLW 2q-4, )l/ 74, )h.*t~TǎPǞLǮH ǾDXXW" 2q W8 ȧ~4p &z~488WH<@~Dq R-+  ,,  0  ~Dǎ@Ǟ<HHW   WxD~Hq . e (" .8L<!-D.$""\1 2#0/# ! !L "\. '1 rh.'0Xn.'0>t.'0$|.' 0 ~HǎDWx~Dp j  e'" -(7H<!+.L"!Xjx.H./P!<'!' ,&7 !+h # 6~DWH@~Dp R:' ,*"7!* ~Dǎ@HHWP@DH~Lp  rL`.`.P.P Ǘ,' +N7]!*t].Z ]7Q$) ]$0 *]`. *fWP.WP.]( >`.M"M(MM~LǎHǞDǮ@PPWH<@~Dp rB )~Dǎ@Ǟ<HHW`@~Dp..dr 0  |ut7P!(6Zpz.xBX.Ȇ.P.5p#h#1(! \(.'7 (27H!'LH 7' (.ċ~7H!'L.Ȳ.Ķ.lL8H0P.p..2...Ď.Ȳ.Ķ.~Dǎ@W`DHLPހ ~T.r .Ȇ)9 '9X!&>.\ !'XҠ.ċ9X!% x\  h.\ !'XD.\ !" \X u ~TǎPǞLǮHǾD``Wh~<p ! .@0b(7\' &. ~<hhW@~<p.&' %Ύ ~<@@WhD~Hqv/8! N!8$& N %>!8#bp4N/<(Ze  $pV<!8#X/4"@V /4/0.'!  D ' $<$7 !" >$' $ v~HǎDWh~<p ! .@T0`(7X' #n ~<hhWPDH~Lpހ .r f' VG7!# 0( ""7 (!! ~LǎHǞDPPWh~<p ! .@,T$7' ": ~<hhWPDH~LpTPHG'!0 ! 7 ! x ~LǎHǞDPPW@~<pz*"7' !H ~<@@W  2!`0 0W0  $W8( P$0 0"0 $$ $P0QP0R88W8^0! $ 0 < 0*$11$2$ T"$ 88W0~@2q!$"$ d @2q!$"( !@+B $ @-$ 1@2q!$"$ D 0!*@0A$p2qAGDD@0 ~W0~@2q!$"$ d @2q!$"( !@+B $ @-$ 1@2q!$"$ D 0!*@0A$p2qAGDD@0 ~WH@~Dpq'~Dǎ@HHW80 288W8$ 88WP<@D~Hp, 1LLpǀ21'2ב2ס2z1H@80(L LLp  ~HǎDǞ@Ǯ<PPW :"4 mn2"'W Q!Q Q 0<] # ]] p']JF" 4#  m  n 4#  m  n!0F 4# m n$]]Ć mn n1 12$21  1]]]]W@8] 1X~<2!0!!1t11t]A!42A!4"1#x(2"#"12A!42A!4"1#t't'"dt'"drt'"d\8 d# 2! 0!("d*~<ǎ8@]@W@!:#:#"0$0 #0*0W81 100  0 B!41 -RA!*P%00(# %09(# $@ <1^1Ȇ2 100  0 B!4188Wp "[B@8~     BG G! H    g   ,Q"%(  D b j D p     ~@ǎ<HHWH<@~DpǐLJ D   p8h  p8h' (. ( Ă   ~Dǎ@Ǟ<HHW8 ȧ~4p  *        |'Q!R D D p8h%  ' p8h7! ,~488W@8~<p  ( ppP`8W8h( pp9p8h^,*    p8h& ppP`8W8h &W @  ~<ǎ8@@WP pR8h a!` !WH@~Dq# l~Dǎ@HHWH<@~Dr '$~Dǎ@Ǟ<HHWH<0@~Dr 0 (+R a(a( <r NwX   @   "   r t  )r!  )a!"  p8h~Dǎ@Ǟ<HHW@~<p.`W .`&0 2  &'  ~<@@WX?@DHLP~Ts @  aP/\ (  )  ' p8h7! X (  <~TǎPǞLǮHǾD@XXWP<@DH~Lp   W |tlǧ" !  40,'  W     )"V  H`#@@WX@~D.x qώxTP.LH@HU(~Dǎ@XXWP.p0>@DH".L @.M.p.@x.DPPW[W![W[W2![W2![WC2!,[W2![W[h;W ;[<;;W2![W;WPT.> PPWp^^^^^Ǽ_ @P PP_$PpRU8hP_$%py}kg,P_$(VP p:w]ѡ[q" ,_(0_(ְ_(Fp_@c(stdxX܋ `_ d`_ P_$([P  ,_(0_( ְ_(`_ d`_ (P_$[PQ̡P! ! ,_(0_(ְ_(`_ d`_ 'Π- 8ы0):@0CAMр ѡ(P_$[P Q фP р}-!ш},_(0_(ְ_(`_ d`_ / q?ȡфыh`_ d`_ / q?ءфы4_^_`_ csd(u$+\-` d#h.l*x0Āelh%ox0XeEfgGn9ld`_  _d`_ @ _ _ "  !_`d`_ }^; -!10^@@ V 8@  /  +!10^"  /  !10^ @ /00 0ѡ $@ZPECѡMѡ p_ }_ u__ ^d`_ } pq 5#"0ѡP n b V J@ _ 6@ *_d`_ _ _ d`_ _ @     0 9: @ _ _z _WC0?ȋ_D0?؋_D0?d`_ - _p&@ 4__  a@ '_ -__ pX Oo620^x 0 ^^"X^  __   @ / & _ g `h`_ _ 0!#и^0_,@_0ȧN(^d^8_0 - ^^D  5  + ^^ ^^g ю 0ѡaP_ P .aP6 QaP P_P_ ׶`_p_8g^ 06P_,QPU):RECAaFSRQaVrgaga_,- +aea E`^rvp___ #2#: @ / & _ g `h`_ _ 0<#0_,@_0ȧN(^^8_0`_ P_,/Q)-0!-^! ^B +^! ^   ^! ^E00@qA0- '1qA@Aq@ `  .'qF<Ad &$ _ _A@> QP&#1qA@Aq@_@p_`_ #H _ @ & _  ! _ g `h`_ 0#^0_,@_0ȧN(^z^8^ _,`_  FF=11=CCAM 0AMAP_,VA@_ E@_ p_}@^g_d``__  >  _ ___ @^p^^/?,_(0_( ְ_(zkg(P_$(VPp: w q&?,_(0_( ְ_(@^p^^@ekd,_$( ^DA4^,_(0_(^ ^ְ_( ֠_^/?,_(0_( ְ_(Jkd(P_$(VP@:0D A&?,_(0_( tְ_(^pTkg(_$( wq( ,_(0_( ְ_(     / ֠_^/?,_(0_( ְ_(Jkd*P_$(VP@<0D A&?,_(0_( lְ_(^ fp_p\kg,_$( ^wq,^,_(0_( ְ_( ֠__/?,_(0_( ְ_(Jkd*P_$(VP@< D A&?,_(0_( Xְ_(H{ p   _$( @  @ , 2 ! . 00  +    p^ؐ^ذ^^^WhLPTX\`~dpЩ.   2qd݌!02q!#"(    % %X!! . $  * 2qߎ ޠ l h  [ h  2qΰl cf[^!02q!#"( cs [(~(^ *>h^,"~(^ *;^,h    ~dǎ`Ǟ\ǮXǾTPLhhWP8<@DHL~P~P^^^ϞT^^x^:d2p@W^Q^ΰ Ld +!R  ->^Q^ ![RQ^ 2q^P v 2q0& 2q 7W(!^Q^.^Q^e E|t^Q^d! 2q+ - Bp!s` T). 2 l.242# .242""7^P l$^PLh(^z ^P~PǎLǞHǮDǾ@<8W`<@DHLP~T~ XcsR[\RP^\*)bX!!0#.02q#"( ^\P!+"  4nX  c ~TǎPǞLǮHǾD@<``WH<@~Dp^qV $1 ]2 - qR Z -87#@]$*'B2 2#q q1 ]2~Dǎ@Ǟ<HHW4h 9x(  WP@DH~Lr @D''!'> )7 )d ~LǎHǞDǮ@PPW ! ^ 0(,01  !W2!6[0W`@DHLPT~XP^\02q #"( + "  -^\Q^\ p1@ΐ. ~Hΐ0 Aj0ސ ̈ *ސ ̈:zA@ސ ̈* ސ ̈:zpޠ2qeΐ. TB 9Ȍ19#59'3( E e 0@ (@@0@ (@@ @+ @-1p2q@GDD@>@B*  p2q@GDD@0 pAA,=:yp6p?qq5yqAH(A K ?0@@A@ q5'@sA@  6! #;K;;#\ 2  ~XǎTǞPǮLǾHD@``WPHx~Lp(,j~LǎHPPWPHx~Lp(,"~LǎHPPW`?8<@DH~Lp.ޠ__:T 2p_ p___p  :X ސAp _p  C@:8 6p  : @$:@$ 1 P@$`^P5%cR:W^XP'86 0":B0C9"5 4r+!+ @$0:  ?05N?:@ 5p  5 @$0:  _( _( _:_( 0 &009 4 @$05p (  5(T_ &1_  &0   9( ~LǎHǞDǮ@Ǿ<8`_`WP@D~Hr :  .LxpL8";:GA5pp!`' pq90A@3 95pL1";P>5p(`pq91A 31906~HǎDǞ@PPW   ?  ?0 6    W6    WX<@DHLPҧ~TsRNW  ( ( D  \ pױ8h'(R (> )     ,~   aP/\ +! (() )((  ' p8h7! ЈBW  D ,,- ͬ ~TǎPǞLǮHǾD@<XXWA0~: r:2rqrp?5p?:pprq3rp?:ppp:sp2~ǎW0@ A#1 ! 1W @(#)fcns.c 6.1 87/11/24 @(#)sgs.h 6.1 87/11/24 %-14.14s 0x%.8lx %6d %6d 0%.6ho 0x%.8lx %-14.14s %.20s %6d %6d 0%.6ho 0x%.8lx %sdump: cannot ldahread %s 0%.6ho %5hu 0x%8lx 0x%.8lx %10ld 0x%.4hx 0x%.4hx 0%.6ho %5hu %.20s 0x%.8lx %6ld 0x%.4hx DEC16DEC32NON DEC RELFLG EXEC LNNO LSYMS MINMAL UPDATE SWABD PATCH%sdump: cannot ldfhread %s %sdump: cannot ldohseek %s %sdump: cannot FREAD %s %.4hx %sdump: cannot FREAD %s %.4hx%sdump: cannot ldshread section %d %-8.8s 0x%.8lx 0x%.8lx 0x%.8lx 0x%.8lx 0x%.8lx 0x%.8lx 0x%.8lx %5hu %5hu 0x%.8lx %5hu %5hu %sdump: section %s not in file %s %sdump: cannot ldshread section %d %sdump: cannot ldsseek section %d %sdump: section: %s not in file: %s %s AUXABS $,4<DLT\dlt|DIR16REL16IND16DIR24REL24DIR32OFF8OFF16SEG12DIR32SOPT16IND24IND32RELBYTERELWORDRELLONGPCRBYTEPCRWORDPCRLONGDIR10REL10REL32cannot open %s %sdump: cannot ldshread section %d %sdump: cannot ldrseek section %d %sdump: cannot FREAD %s 0x%.8lx %10ld %6d 0x%.8lx %10ld UNKNOWN<> %s %sdump: section %s not in file %s cannot open %s %sdump: cannot ldshread section %d %sdump: cannot ldlseek section %d %sdump: cannot FREAD %s %10ld %5hu %10ld %5hu<> %s 0x%.8lx %5hu %sdump: section: %s not in file %s %s: no symbols %sdump: cannot ldtbseek %s %sdump: cannot ldtbread entry %ld <>[%ld] %sdump: cannot ldtbread entry %d [%ld] a %8ld 0x%.8lx 0x%.8lx 0x%.8lx %-5hu a %8ld 0x%.4hx 0x%.4hx 0x%.8lx 0x%.8lx %-5hu m2 %-8ld m1 %-8.8s 0x%.8lx %6hd 0x%.4hx 0x%.2x %3d %s %sdump: cannot ldtbseek %s %sdump: cannot ldtbread entry %ld <>%sdump: cannot fread aux entry %ld no function "%s" in symbol table 0x%.8lx %5hu no line number >= %5hu no line numbers for function %sdump: cannot ldlitem entry %hu %10ld %5hu 0x%.8lx %5hu 0x%.8lx %5hu : _%c (08null arg char short int long float double struct union enum enmem Uchar Ushort Uint Ulong *%s ()%s []%s %s (08@HPX`hpxefcn null auto externstaticreg extdeflabel ulabelstrmemargm'tstrtagunmem untag typdefustat entag enmem regprmbitfldblock fcn endstrfile %s hidden ???????.tva1 %14s a3 0x%.8lx 0x%.4hx 0x%.4hx a2 0x%.8lx 0x%.4hx 0x%.4hx 0x%.4hx a%d %10ld 0x%.8lx 0x%.8lx 0x%.8lx %5hu 0x%.4hx 0x%.4hx 0x%.4hx 0x%.4hx %5hu 0x%.4hx 0x%.4hx 0x%.8lx 0x%.8lx %5hu 0x%.4hx 0x%.4hx 0x%.4hx 0x%.4hx%5hu  BSS, , , PADREG DSECTNOLOADCOPYTEXTDATAcannot ldahread archive header cannot seek to end of symbol table [%ld] cannot read string table cannot read symbol table header cannot read symbol table header cannot allocate space for array cannot read archive symbol table %10ld premature EOF @(#)main.c 6.1 87/11/24 @(#)filedefs.h 6.1 87/11/24 @(#)dumpmap.h 6.1 87/11/24 @(#)sgs.h 6.1 87/11/24 usage: %sdump [flags] _f_i_l_e ... 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF @(#)openobject.c 6.1 87/11/24 @(#)sgs.h 6.1 87/11/24 @(#)filedefs.h 6.1 87/11/24 %sdump: cannot open %s %sdump: bad magic %s %sdump: cannot allocate memory @(#)process.c 6.1 87/11/24 @(#)filedefs.h 6.1 87/11/24 @(#)flagdefs.h 6.1 87/11/24 @(#)process.h 6.1 87/11/24 @(#)sgs.h 6.1 87/11/24 %sdump: cannot ldaopen %s %s[%.14s](p P  !t!!""P#P ***ARCHIVE HEADER*** Member Name Date Uid Gid Mode Size ***FILE HEADER*** Magic Nscns Time/Date Symptr Nsyms Opthdr Flags ***OPTIONAL HEADER in HEX*** ***SECTION HEADER*** Name Paddr Vaddr Scnptr Relptr Lnnoptr Flags Size Nreloc Nlnno ***SECTION DATA in HEX*** ***RELOCATION INFORMATION*** Vaddr Symndx Type ***LINE NUMBER INFORMATION*** Symndx/Paddr Lnno ***LINE NUMBERS FOR FUNCTION*** Symndx/Paddr Lnno ***SYMBOL TABLE INFORMATION*** [Index] m1 Name Value Scnum Type Sclass Numaux Name [Index] m2 Offset Value Scnum Type Sclass Numaux Name [Index] a Tagndx Misc Misc Fcnary Fcnary Tvdnx ***STRING TABLE INFORMATION*** [Offset] Name #$$t$%<%\%%&((D ***ARCHIVE HEADER*** Member Name Date Uid Gid Mode Size ***FILE HEADER*** Magic Nscns Time/Date Symptr Nsyms Opthdr Flags ***OPTIONAL HEADER in HEX*** ***SECTION HEADER*** Name Paddr Vaddr Scnptr Relptr Lnnoptr Flags Size Nreloc Nlnno ***SECTION DATA in HEX*** ***RELOCATION INFORMATION*** Vaddr Symndx Type Name ***LINE NUMBER INFORMATION*** Symndx/Paddr Lnno Name ***LINE NUMBERS FOR FUNCTION*** Symndx/Paddr Lnno ***SYMBOL TABLE INFORMATION*** [Index] m1 Name Value Scnum Type Sclass Numaux Name [Index] m2 Offset Value Scnum Type Sclass Numaux Name [INDEX] a1 Fname [Index] a2 Tvfill Tvlen Tvran[0] Tvran[1] [Index] a3 Scnlen Nreloc Nlinno [Index] a4 Tagndx Fsize Lnnoptr Endndx Tvndx [Index] a5 Tagndx Fsize Dim[0] Dim[1] Dim[2] Dim[3] Tvndx [Index] a6 Tagndx Lnno Size Lnnoptr Endndx Tvndx [Index] a7 Tagndx Lnno Size Dim[0] Dim[1] Dim[2] Dim[3] Tvndx ***STRING TABLE*** [Offset] Name ***ARCHIVE SYMBOL TABLE*** Offset Name @(#)setflags.c 6.1 87/11/24 @(#)flagdefs.h 6.1 87/11/24 @(#)sgs.h 6.1 87/11/24 ),8)l+@,8)$)x)<,8,8,8)`,8*`)0, ,8)T)H*,,+4,8,8,8)usage: %sdump [flags] [-z _f_c_n_n_a_m_e [number] | -z_f_c_n_n_a_m_e[,number]] file ... usage: %sdump [flags] [-n _n_a_m_e | -n_n_a_m_e] file ... usage: %sdump [flags] [-d _n_u_m_b_e_r | -d_n_u_m_b_e_r] file ... usage: %sdump [flags] [-d_n_u_m_b_e_r | -d _n_u_m_b_e_r] file... %s: dump -%s PDP920 System V Release 2.0 9/1/83%sdump: unknown option "%c" ignored usage: %sdump [flags] [+t _n_u_m_b_e_r | +t_n_u_m_b_e_r] file ... usage: %sdump [flags] [+d _n_u_m_b_e_r | +d_n_u_m_b_e_r] file ... usage: %sdump [flags] [+d_n_u_m_b_e_r | +d _n_u_m_b_e_r] file ... usage: %sdump [flags] [+z _n_u_m_b_e_r | +z_n_u_m_b_e_r] file ... usage: %sdump [flags] [+z_n_u_m_b_e_r | +z _n_u_m_b_e_r] file ... %sdump: unknown option "+%s" ignored h,  @(#)ldaclose.c 6.1 87/11/23 @(#)ldaopen.c 6.1 87/11/23 r @(#)ldahread.c 6.1 87/11/23 %ld%o%d%d%ld` @(#)ldclose.c 6.1 87/11/23 %ld` @(#)ldfhread.c 6.1 87/11/23 @(#)ldgetname.c 6.1 87/11/23 @(#)ldlread.c 6.1 87/11/23 @(#)ldlseek.c 6.1 87/11/23 @(#)ldohseek.c 6.1 87/11/23 @(#)ldopen.c 6.1 87/11/23 %ld` r! @(#)ldrseek.c 6.1 87/11/23 @(#)ldshread.c 6.1 87/11/23 @(#)ldsseek.c 6.1 87/11/23 @(#)ldtbread.c 6.1 87/11/23 @(#)ldtbseek.c 6.1 87/11/23 @(#)sgetl.c 6.1 87/11/23 @(#)vldldptr.c 6.1 87/11/23 @(#)lddef.h 6.1 87/11/23 @(#)allocldptr.c 6.1 87/11/23 @(#)lddef.h 6.1 87/11/23 @(#)freeldptr.c 6.1 87/11/23 @(#)lddef.h 6.1 87/11/23 @(#)atoi.c 6.1 87/11/23 @(#)atol.c 6.1 87/11/23 @(#)calloc.c 6.1 87/11/23 @(#)ctime.c 6.1 87/11/23 Day Mon 00 00:00:00 1900 SunMonTueWedThuFriSatJanFebMarAprMayJunJulAugSepOctNovDecTZp11PDTPSTW`/Lw/K:/JMFw/ @(#)ctype.c 6.1 87/11/23 ((((( H @(#)getenv.c 6.1 87/11/23 @(#)malloc.c 6.1 87/11/23 @(#)memset.c 6.1 87/11/23 @(#)mon.c 6.1 87/11/23 PROFDIRmon.out @(#)perror.c 6.1 87/11/23 : Unknown error @(#)data.c 6.1 87/11/23 `H`H`Pb@rH8h @(#)filbuf.c 6.1 87/11/23 @(#)flsbuf.c 6.1 87/11/23 @(#)stdiom.h 6.1 87/11/23 @(#)fopen.c 6.1 87/11/23 @(#)fprintf.c 6.1 87/11/23 @(#)fread.c 6.1 87/11/23 @(#)stdiom.h 6.1 87/11/23 @(#)fseek.c 6.1 87/11/23 @(#)ftell.c 6.1 87/11/23 @(#)printf.c 6.1 87/11/23 @(#)scanf.c 6.1 87/11/23 @(#)sprintf.c 6.1 87/11/23 P @(#)errlst.c 6.1 87/11/23 ;;<< <0>>(>8>D>\>p>>>>>>??4?P?`.Error 0Not ownerNo such file or directoryNo such processInterrupted system callI/O errorNo such device or addressArg list too longExec format errorBad file numberNo child processesNo more processesNot enough spacePermission deniedBad addressBlock device requiredDevice busyFile existsCross-device linkNo such deviceNot a directoryIs a directoryInvalid argumentFile table overflowToo many open filesNot a typewriterText file busyFile too largeNo space left on deviceIllegal seekRead-only file systemToo many linksBroken pipeArgument out of domainResult too largeNo message of desired typeIdentifier removedChannel number out of rangeLevel 2 not synchronizedLevel 3 haltedLevel 3 resetLink number out of rangeProtocol driver not attachedNo CSI structure availableLevel 2 haltedDeadlock condition if locked @(#)isatty.c 6.1 87/11/23 000000000000000000000123456789abcdef0123456789ABCDEF @(#)doscan.c 6.1 87/11/23 yyyyyyyyyyyyyyyyyyyyy @(#)findiop.c 6.1 87/11/23 @(#)dowrite.c 6.1 87/11/23 @(#)print.h 6.1 87/11/23 @(#)ungetc.c 6.1 87/11/23 @(#)atof.c 6.1 87/11/23 @(#)ecvt.c 6.1 87/11/23 Fn CAy7Aׄ@È@Y@$ @(#)ldexp.c 6.1 87/11/23 @(#)fwrite.c 6.1 87/11/23 @(#)stdiom.h 6.1 87/11/23 @(#)frexp.c 6.1 87/11/23 @(#)memchr.c 6.1 87/11/23 : # "@(#)lorder 6.1 87/11/24" # COMMON LORDER # # trap "rm -f /tmp/$$sym?ef; exit" 0 1 2 13 15 case $# in 0) echo usage: lorder file ... exit ;; 1) case $1 in *.o) set $1 $1 esac esac # The following sed script is commented here. # The egrep pipe insures that we only have lines # that contain file names and the external # declarations associated with each file. # The first two parts of the sed script put the pattern # (in this case the file name) into the hold space # and creates the "filename filename" lines and # writes them out. The first part is for .o files, # the second is for .o's in archives. # The next 3 sections of code are exactly alike but # they handle different external symbols, namely the # symbols that are defined in the text section, data section # or symbols that are referenced but not defined in this file. # A line containing the symbol (from the pattern space) and # the file it is referenced in (from the hold space) is # put into the pattern space. # If its text or data it is written out to the symbol definition # (symdef) file, otherwise it was referenced but not declared # in this file so it is written out to the symbol referenced # (symref) file. # nm -e $* | egrep "\\.o:|\\.o]:|\\|extern" | sed ' /\.o:$/{ s/:// s/^.* // h s/.*/& &/ p d } /\.o]:$/{ s/]:// s/^.*\[// h s/.*/& &/ p d } /|\.text/{ s/ *|.*// G s/\n/ / w '/tmp/$$symdef' d } /|\.data/{ s/ *|.*// G s/\n/ / w '/tmp/$$symdef' d } s/ *|.*// G s/\n/ / w '/tmp/$$symref' d ' sort /tmp/$$symdef -o /tmp/$$symdef sort /tmp/$$symref -o /tmp/$$symref join /tmp/$$symref /tmp/$$symdef | sed 's/[^ ]* *//' u!T k1PV .textk .data  1Pl@.bss==V% 0  !2$0  "#[WH@~Dqt$   8#RP  P >P \ u p~.7 L  7P h"7 d  7fP ]tM"~Dǎ@HHWXHLP~Tq -lP T(!  T(! ^ V  x(! 0d#(! pWPPPX`hx-J`hh-"hxpl`xTH 05&1 d5)tw\<(P( 0`:PP(P@ 0\^(:`9`h<6(p 0X:b2PP(p$ h0p^(:0$p< h0p: ~TǎPǞL ǮHXXWh~@pP  r ̋>P(1r  !.r `h@p1pr(X!4ԋr r(P Q eZD8"& r xpx'>D2ҋ," r xp'2P r0&r +r#NXp>r&r +2$<r(r *$ԋr0x r )r *`h<r()p7~0!@.P@7JT! r~@hhWp<@~DP  lqJ P  .H < 8HA!C1(qP !  ~Dǎ@Ǟ<ppWxDHLPTX~\pP  ~x* r Pp/*րr P 1t!0 .P 1`!/ xdzVP t  X*r ؓ.Z gX( r Pp.`.& r Pp .t(% e(!  e(! 8J (!  (! phW d fP t  X*0r PpA|pl(<- 0  րr րr(P t  X*Pp1PN|pl(4-bZRt($L4t($4t($ P t6   X*^0(p1l0dp1@PpPN|>(4,P t  4X*^0(p1l0dp1@@r Pp+rP t   HX*0r PpPN|P\4^(+t.` 8Pp>f.h#p"*d*Ƌ* 0  Z*dQ Pp%*Pp0*lp*^~,^fP"Pp%*0Pp*"d!x))^z0P !z zp!'))P  ~\ǎXǞTǮPǾLHDW?hDHLPT~XpP  p r Pp(\P 1!)8 .P 1p!)  g (`XP(z4(b(J&րr  րr(P  R  X*Pp1PNpl(4'\.p  0  N*tQ Pp%'Pp0&0*Pp>v.x#p"&J,^vP"Pp%&Pp&h*^tP %ē&@̓&,^z0P !z zp!'ԓ%ܓ%.\%΋%P  ~XǎTǞPǮLǾHDW?H@DHLP~Tqxޠ  pdx"   ZRQHr0%.X  n.X*Vxn÷  xv x xHV<4(!"n)xnx ! qް  00 sޠ  .p$Pp .x#zFp"Pp .x#RPp@ .x#4~TǎPǞLǮHǾD@W ~103001CBD@CA@qpwtqpABD1G0~W! " ! 0)2! 02!20! "#(WH0~Dr( !t&"ppW̋ r@P r `hr(rr `hr(r`rr H`hr(&r0~DHHW8(((l(n(dJ(L(B((*88W8('''P r0r P((Fr(p(,r  88W8P('p'88W8 ȧ~4p  : ~488WH<@~Dq R  ,  0  ~Dǎ@Ǟ<HHW   WxD~Hq. e (" N8L<!$"\1 2#0/# ! !L \ '!Brh'!(Xn'!>t' $|' ڎ ~HǎDWx~DpZ  e'" 7H<!L"hjxH. P!<'!' r&7 !( &~DWP@DH~Lp: rL`x`tPpP  Ǘ' 7M!<tMXpZ M7Q$ M$0 M`p fWPtWPxM( >`p=""=(v==~LǎHǞDǮ@PPWhD~Hqv~ N!8 N !8JpZ4N(be  pV<!8LX"@V /4.!  D ' $7 ! >$'  .~HǎDWPDH~Lpހ r f' VG7!# 0( "7 (! ~LǎHǞDPPWPDH~LpTPHG'!0 ` 7 ! ~LǎHǞDPPW@~<pJ*"7'  ~<@@W  $W8( P$ " $$ $PQPR88W8^! $ < *$11$2$"$ 88WH@~Dpqz'~Dǎ@HHW8088Wp jj[BP48<@DH~LMHM! MM! MMNMNNN րNqpN$NN  N x((lx! ( 2NM  !(hրN Np0qp((q$N N sqp'( (&l   N NpN p  PN! M!N xF pN(PNNN N NN ~LǎHǞDǮ@Ǿ<84PPWN! !N! N WP<@DH~Ly   s  Rq(+p#X((p(pspN~LǎHǞDǮ@Ǿ<PPW0+K "AC1!WAC$AhAC%hAC&hACWQWPX%AC1QCGxBBSD"vt ('"AC8('p'"$AC4$X$AhAC!FhAC"%  ~<ǎ8@@W8 ȧ~4p T g "Q%(   ~488WH<΀ ~@q R  Bb p"'(! ,>     BG G!    g   ,Q"%(  D b j D p     ~@ǎ<HHWH<@~DpǐLJ D   p"  p"' (. ( <   ~Dǎ@Ǟ<HHW8 ȧ~4p  *        |'Q!R D D p"%  ' p"7! ,~488W@8~<p  ( ppPrHW"؋( pp#"؋^*    p"؋& ppPrHW" VW @  ~<ǎ8@@WP pR" a!` !WH@~Dq(d l~Dǎ@HHWH<@~Dr '$~Dǎ@Ǟ<HHWH<0@~Dr 0 (+R a(a( <r NwX   @   "    t  )r!  )a!"  p"~Dǎ@Ǟ<HHW@~<p.`W .`&0 2  &'   ~<@@WX?@DHLP~Ts @$b  aP/\ (  )R  ' p"7! X (  <~TǎPǞLǮHǾD@XXWP<@DH~Lp   W |tlǧ" !L  40,'  W     )V  H`#@@WX@~D.x qώxTP.LH@HU(d~Dǎ@XXW@48~<p P     Z   & pp#"؋$ ppPrHW"؋2 p"z @  ~<ǎ8Ǟ4@@WP.p0>@DH".L @.M.p.@(.DPPWXDHL~Pp.%x(%t %p7pTD lb  T~PǎLǞHǮDXXW[0W![W. >$.;0 [W[B[ W[W2![W2![WC2!,[W[P%W %[$%%W!00[WH .(N0n8@HPX` W`X .(N0n8Ɏ@ɮHPԩة>^觾[ [TW[:. W2![W%W@8~ PPWpNNNNNǼO @P PPO$PpRU"ضPO$%py}kg,PO$(VP p:w]ѡ[q" ,O(0O(ְO(FpO@c(stdxX܋ `O d`O PO$([P  ,O(0O(\ְO(`O d`O (PO$[PQ̡P! ! ,O(0O(ְO(`O d`O 'Π- 8ы0):@0CAMр ѡ(PO$[P Q фP р}-!ш},O(0O(ְO(`O d`O / q*hфыh`O d`O / q*xфы4ONO`O csd(u$+\-` d#h.l*x0Āelh%ox0XeEfgGn9ld`O  Od`O @ O O "  !O`d`O }N; -!10N@@ V 8@  /  +!10N"  /  !10N @ /00 0ѡ $@ZPECѡMѡ pO }O uOO ^d`O } pq 5#"0ѡP n b V J@ O 6@ *Od`O O O d`O O @     0 9: @ O Oz OWC0*h_D0*x_D0*hd`O - Op&@ 4OO  a@ 'O -OO pX Oo620Nx 0 NN"XN  OO   @ / & O g `h`O O 0!#иN0O,@O0ȧN(NN8O0 - NND  5  + NN NNg ю 0ѡaPO P .aP6 QaP POPO ׶`OpO8gN 06PO,QPU):RECAaFSRQaVrgagaO,- +aea E`NrvpOOO #2#: @ / & O g `h`O O 0<#0O,@O0ȧN(N N8O0`O PO,/Q)-0!-N! NB +N! N   N! NE00@qA0- '1qA@Aq@ `  .'qF<Ad &$ O OA@> QP&#1qA@Aq@O@pO`O #H O @ & O  ! O g `h`O 0#N0O,@O0ȧN(NN8N O,`O  FF=11=CCAM 0AMAPO,VA@O E@O pO}@NgOd``OO  >  O OOO @NpNN/*@,O(0O(.ְO(zkg(PO$(VPp: w q&*@,O(0O(ְO(@NpNN@ekd,O$( NDA4N,O(0O(NdNְO( ֠ON/*T,O(0O(ְO(Jkd(PO$(VP@:0D A&*T,O(0O( ְO(NpTkg(O$( wq( ,O(0O( lְO(     / ֠ON/*T,O(0O( ְO(Jkd*PO$(VP@<0D A&*T,O(0O( ְO(N fpOp\kg,O$( Nwq,N,O(0O( LְO( ֠OO/*@,O(0O( ְO(Jkd*PO$(VP@< D A&*@,O(0O( ְO(H{ p   O$( @  n@ , 2 ! . 00  +   ߒ  pNؐNذNNNWhLPTX\`~dpЩ.   ,1d!0,1!#"(    % %Xh!! . t  * ,1ߎ ޠ l h  [ h  ,1ΰl cf[^T!0,1!#"(  Xcs [(~(^ *>h^,"~(^ *;^,h    ~dǎ`Ǟ\ǮXǾTPLhhWP8<@DHL~P~P^^^ϞT^^x^:d2p*W^Q^ΰ L +!R  ->^Q^\![RQ^ ,1^P v ,10& ,1 7W(!^Q^.^Q^e E|t^Q^d$! ,1+ - B!s` T)Z. 2 l.242# .242""7^P l$^PLh(^z ^P~PǎLǞHǮDǾ@<8W`<@DHLP~T~ XcsR[\RP^\*)b!!0#.0,1#"( ^\P!+"  nX  c ~TǎPǞLǮHǾD@<``WH<@~Dp^qV T1 ]2 - qR Z -87#@]$*'B2 2#q q1 ]2~Dǎ@Ǟ<HHWH@~Dp pW & !   D 6ހ؋  @  T#(  ! p!"!7 R   .   W    ~Dǎ@HHW؋ #(  WP@DH~Lr @D''!'־ )7 8)D ~LǎHǞDǮ@PPW ! ^ 0(,01  !W2!6[(W2![W`@DHLPT~XP^\0,1 #"( + "  -^\Q^\ p1@ΐ. ~Hΐ0 Aj0ސ ̈ *ސ ̈:zA@ސ ̈* ސ ̈:zpޠ,1eΐ. TB 9Ȍ19#59'3( E e 0@ (@@0@ (@@ @+ @-1p,1@GDD@>@B*  p,1@GDD@0 p++,=:yp6p?qq5yq,(+ K ?0@@A@ q5'@sA@  6! #;K;;#\ 2  ~XǎTǞPǮLǾHD@``WPHx~Lp(,j~LǎHPPWPHx~Lp(,"~LǎHPPW`?8<@DH~Lp.ޠOO:T 2pO pOOOp  :X ސ-X Op  C@:8 6p  : @$:@$ 1 P@$`^P5%cR:W^XP'86 0":B0C9"5 4r+!+ @$0:  ?05N?:@ 5p  5 @$0:  O( O( O:O( 0 &009 4 @$05p (  5(TO &1O  &0   9( ~LǎHǞDǮ@Ǿ<8`O`WP@D~Hr :  .LxpL8"%:GA5pp!`' pq90A@3 95pL1"%P>5p(`pq91A 31906~HǎDǞ@PPW   ?  ?0 6    W6    WX<@DHLPҧ~TsRNW  ( ( D : \ pױ"'(R (> )     ,   aP/\ +! (() )((  ' p"7! BW  D ,,-  ~TǎPǞLǮHǾD@<XXWA0~: r:2rqrp?5p?:pprq3rp?:ppp:sp2~ǎW0@ A#1 ! 1W @(#)main.c 6.1 87/11/24 @(#)sgs.h 6.1 87/11/24 @(#)defs.h 6.1 87/11/24 usage: %snm [-o|x|d] [-V] [-T] [-v] [-h] [-n] [-e] [-f] [-u] file ... %snm: %s: bad magic %snm: %s: cannot open @(#)setflags.c 6.1 87/11/24 @(#)paths.h 6.1 87/11/24 @(#)sgs.h 6.1 87/11/24 @(#)defs.h 6.1 87/11/24 P\t(h+1 -2 +0 -1 %s: nm -%s PDP920 System V Release 2.0 9/1/83%snm: unknown option "%c" ignored %s/%snmf%d/tmpawk -f %s/%snmawk %s/lib%s/%snms%d/tmpsort -t'|' %s %s >>%ssort -t'|' %s %s/tmp/tmp @(#)process.c 6.1 87/11/24 @(#)defs.h 6.1 87/11/24 wwno symbolscannot build list of section namescannot open temporary file (-f option); cannot proceedcannot open temporary file (-[vn] option); cannot proceedcannot read archive headercannot open for additional processingcannot process symbol table (bad format)cannot process symbol table (bad format)abnormal termination during sortabnormal termination in -f option Symbols from %s[%.16s]: Undefined symbols from %s[%.16s]:  Symbols from %s: Undefined symbols from %s: @(#)prosym.c 6.1 87/11/24 @(#)defs.h 6.1 87/11/24 @(#)prosym.h 6.1 87/11/24 H < H < H H H < < H < H H H H < < <| .tv<> %s <><>.text.data.bss<><><>??????| | | |%5d| |%-.8s | .tv.text.data.bss<>|%5d| |%-8.8s| |%.14s fcnregXName Value Class Type Size Line Section Name Value Class Type Size Line Section Name Value Class Type Size Line Section XName Value Class Type Size Line Section File Name Value Class Type Size Line Section File Name Value Class Type Size Line Section File   8%-20s|%8ld|%-6.6s%-20s|0x%.8lx|%-6.6s%-20s|0%.11lo|%-6.6s\p%-20s|%8ld|%-6.6s%-20s|0x%.8lx|%-6.6s%-20s|0%.11lo|%-6.6s%-20s| |%-6.6s%-20s| |%-6.6s%-20s| |%-6.6s@|%-20.20s| | file | | | | %-20.20s | | file | | | | %-20.20s | | file | | | | |%6hd|0x%.4hx|0%.6ho| | | (|%6ld|0x%.4lx|0%.6lo<L\| | |  (08autoexternstaticextdeflabelulabelstrmemargm'tstrtagunmemuntagtypdefustatentagenmemregprmbitfld\dlt|blockendstrfileerrorerrorhidden @(#)decotype.c 6.1 87/11/24 @(#)defs.h 6.1 87/11/24 @(#)decotype.h 6.1 87/11/24 [ ]( )*-%.8s[%hd]intarg(08|%18s|%17s|%14sLT\|%16s|%13s|%14scharshortlongfloatdoublestructunionenumenmemUcharUshortUintUlong @(#)fcns.c 6.1 87/11/24 @(#)sgs.h 6.1 87/11/24 @(#)defs.h 6.1 87/11/24 x|0%snm: %s: %s @(#)ldaclose.c 6.1 87/11/23 @(#)ldaopen.c 6.1 87/11/23 r @(#)ldahread.c 6.1 87/11/23 %ld%o%d%d%ld` @(#)ldclose.c 6.1 87/11/23 %ld` @(#)ldgetname.c 6.1 87/11/23 @(#)ldopen.c 6.1 87/11/23 %ld` r! @(#)ldshread.c 6.1 87/11/23 @(#)ldtbread.c 6.1 87/11/23 @(#)ldtbseek.c 6.1 87/11/23 @(#)vldldptr.c 6.1 87/11/23 @(#)lddef.h 6.1 87/11/23 @(#)allocldptr.c 6.1 87/11/23 @(#)lddef.h 6.1 87/11/23 @(#)freeldptr.c 6.1 87/11/23 @(#)lddef.h 6.1 87/11/23 @(#)calloc.c 6.1 87/11/23 @(#)malloc.c 6.1 87/11/23 @(#)memset.c 6.1 87/11/23 @(#)mon.c 6.1 87/11/23 PROFDIRmon.out @(#)perror.c 6.1 87/11/23 : Unknown error @(#)data.c 6.1 87/11/23 rXrXr`tPX" @(#)flsbuf.c 6.1 87/11/23 @(#)stdiom.h 6.1 87/11/23 @(#)fopen.c 6.1 87/11/23 @(#)fprintf.c 6.1 87/11/23 @(#)fread.c 6.1 87/11/23 @(#)stdiom.h 6.1 87/11/23 @(#)fseek.c 6.1 87/11/23 @(#)ftell.c 6.1 87/11/23 @(#)scanf.c 6.1 87/11/23 @(#)setbuf.c 6.1 87/11/23 @(#)sprintf.c 6.1 87/11/23 @(#)system.c 6.1 87/11/23 -csh/bin/sh` @(#)errlst.c 6.1 87/11/23 &p&x&&&&&&'''('<'P'd'x''''''''( ( (4(H(X(h((((((() ) )<)X)h)x)))).Error 0Not ownerNo such file or directoryNo such processInterrupted system callI/O errorNo such device or addressArg list too longExec format errorBad file numberNo child processesNo more processesNot enough spacePermission deniedBad addressBlock device requiredDevice busyFile existsCross-device linkNo such deviceNot a directoryIs a directoryInvalid argumentFile table overflowToo many open filesNot a typewriterText file busyFile too largeNo space left on deviceIllegal seekRead-only file systemToo many linksBroken pipeArgument out of domainResult too largeNo message of desired typeIdentifier removedChannel number out of rangeLevel 2 not synchronizedLevel 3 haltedLevel 3 resetLink number out of rangeProtocol driver not attachedNo CSI structure availableLevel 2 haltedDeadlock condition if locked @(#)getenv.c 6.1 87/11/23 @(#)isatty.c 6.1 87/11/23 000000000000000000000123456789abcdef0123456789ABCDEF @(#)doscan.c 6.1 87/11/23 XXXXXXXXXXXXXXXXXXXXX @(#)filbuf.c 6.1 87/11/23 @(#)findiop.c 6.1 87/11/23 @(#)dowrite.c 6.1 87/11/23 @(#)print.h 6.1 87/11/23 @(#)ungetc.c 6.1 87/11/23 @(#)atof.c 6.1 87/11/23 @(#)ctype.c 6.1 87/11/23 ((((( H @(#)ecvt.c 6.1 87/11/23 Fn CAy7Aׄ@È@Y@$ @(#)ldexp.c 6.1 87/11/23 @(#)fwrite.c 6.1 87/11/23 @(#)stdiom.h 6.1 87/11/23 @(#)frexp.c 6.1 87/11/23 @(#)memchr.c 6.1 87/11/23 u!T R@D@.textR@ .dataR@.bss--D@  0  !2$0 z [WPH~LqT P8~( ~LǎHPPWx@DHL ~Pq!t - o(!  o(! 28 V(! v V(! B d\ xP`TH 0&1 ؓz3)!$8 ԓ0 @#TfP P^P u pPQ e~T@L(T\>T$hT!TT"8p Г>$!V6PP8 ̓P"8 ȓP N~PǎLǞHǮDǾ@xxWHDH~LpPP e:lll Xp DPPZ xP1P!H P .p.P#(dP! !hBP! Sp~LǎHǞDW8 ȧ~4p R~488WxD~Hqj. e (" 8L<!<"V\1 2#0/# ! !L B\8'rh4'Xn0'~>t,'d$|(' J ~HǎDWx~Dp   e'" p7H<!&d"jx`.P!<'!' &7 ! V~DW@~<p.&' n ~<@@WhD~Hqvf N!8 N !8ZpB4N(Je  |pV<!84X"@V /4.!  D ' $7 ! >$'  ~HǎDWPDH~Lpހ r f' VG7!# 0( "7 (! ~LǎHǞDPPWh  $W8( P$h h"h $$ $P`QP`R88W8^h! $ h< h*$11$2$"$ 88WH@~Dpqz'~Dǎ@HHW8088Wp Bj[BP48<@DH~L-H-! --! --.-... ր.qpN$..  . x((lx! ( 2.-  !(hր. .p0qp((q$. . sqp'( (&    .p. p  P.! -!. xF p.(P... . .. ~LǎHǞDǮ@Ǿ<84PPW.! !.! . WP<@DH~Ly   s  Rq(+p#X((p(psp.~LǎHǞDǮ@Ǿ<PPW0+K "AC1!WAC$AhAC%hAC&hACWQWPX%AC1QCGxBBSD"vt ('"AC8('p'"$AC4$X$AhAC!FhAC"     BG G!     g   ,Q"%(  D b j D p     ~@ǎ<HHWH<@~DpǐLJ D   p  p' (. (    ~Dǎ@Ǟ<HHW8 ȧ~4p  *        |'Q!R D D p%  ' p7! ,~488W@8~<p  ( ppPPW( pp^*    p& ppPPW .W @  ~<ǎ8@@WP pR a!` !WH@~Dq&< l~Dǎ@HHWH<@~Dr '$~Dǎ@Ǟ<HHWH<0@~Dr 0 (+R a(a( <r NwX   @   "    t  )r!  )a!"h  p~Dǎ@Ǟ<HHW@~<p.`W .`&0 2  &'  ~<@@WX?@DHLP~Ts @":  aP/\ (  )z  ' p7! X (  <~TǎPǞLǮHǾD@XXWP<@DH~Lp   W |tlǧ" !   40,'  W     )V  H`#@@WX@~D.x qώxTP.LH@HU(T~Dǎ@XXW@48~<p P     Z   & pp$ ppPPW2 pj @  ~<ǎ8Ǟ4@@WP.p0>@DH".L @.M.p.@.DPPW[W![W[W2![W2![WC2!,[W[h W  [<  W2![W W@8~ PPWp.....Ǽ/ @P PP/$PpRUP/$%py}kg,P/$(VP p:w]ѡ[q" ,/(0/(ְ/(Fp/@c(stdxX܋ `/ d`/ P/$([P  ,/(0/(\ְ/(`/ d`/ (P/$[PQ̡P! ! ,/(0/(ְ/(`/ d`/ 'Π- 8ы0):@0CAMр ѡ(P/$[P Q фP р}-!ш},/(0/(ְ/(`/ d`/ / q%фыh`/ d`/ / q%фы4/./`/ csd(u$+\-` d#h.l*x0Āelh%ox0XeEfgGn9ld`/  /d`/ @ / / "  !/`d`/ }.; -!10.@@ V 8@  /  +!10."  /  !10. @ /00 0ѡ $@ZPECѡMѡ p/ }/ u// ^d`/ } pq 5#"0ѡP n b V J@ / 6@ */d`/ / / d`/ / @     0 9: @ / /z /WC0%_D0%_D0%d`/ - /p&@ 4//  a@ '/ -// pX Oo620.x 0 .."X.  //   @ / & / g `h`/ / 0!#и.0/,@/0ȧN(..8/0 - ..D  5  + .. ..g ю 0ѡaP/ P .aP6 QaP P/P/ ׶`/p/8g. 06P/,QPU):RECAaFSRQaVrgaga/,- +aea E`.rvp/// #2#: @ / & / g `h`/ / 0<#0/,@/0ȧN(. .8/0`/ P/,/Q)-0!-.! .B +.! .   .! .E00@qA0- '1qA@Aq@ `  .'qF<Ad &$ / /A@> QP&#1qA@Aq@/@p/`/ #H / @ & /  ! / g `h`/ 0#.0/,@/0ȧN(..8. /,`/  FF=11=CCAM 0AMAP/,VA@/ E@/ p/}@.g/d``//  >  / /// @.p../$,/(0/(.ְ/(zkg(P/$(VPp: w q&$,/(0/(ְ/(@.p..@ekd,/$( .DA4.,/(0/(.d.ְ/( ֠/./$,/(0/(ְ/(Jkd(P/$(VP@:0D A&$,/(0/( ְ/(.pTkg(/$( wq( ,/(0/( lְ/(     / ֠/./$,/(0/( ְ/(Jkd*P/$(VP@<0D A&$,/(0/( ְ/(. fp/p\kg,/$( .wq,.,/(0/( Lְ/( ֠///$,/(0/( ְ/(Jkd*P/$(VP@< D A&$,/(0/( ְ/(H{ p   /$( @  @ , 2 ! . 00  +    p.ؐ.ذ...WhLPTX\`~dpЩ.   &d!0&!#"(    % %Xh!! . t  * &ߎ ޠ l h  [ h  &ΰl cf[^T!0&!#"(  Xcs [(~(^ *>h^,"~(^ *;^,h    ~dǎ`Ǟ\ǮXǾTPLhhWP8<@DHL~P~P^^^ϞT^^x^:d2p%@W^Q^ΰ L +!R  ->^Q^\![RQ^ &^P v &0& & 7W(!^Q^.^Q^e E|t^Q^d$! &+ - B!s` T)Z. 2 l.242# .242""7^P l$^PLh(^z ^P~PǎLǞHǮDǾ@<8W`<@DHLP~T~ XcsR[\RP^\*)b!!0#.0&#"( ^\P!+"  nX  c ~TǎPǞLǮHǾD@<``WH<@~Dp^qV Ѥ1 ]2 - qR Z -87#@]$*'B2 2#Bq q1 ]2~Dǎ@Ǟ<HHWH@~Dp ٘W & !   D 6ހ  @  |(  ! p!!7 R   .   W    ~Dǎ@HHW (  WP@DH~Lr @D''!' )7 8)ʔ ~LǎHǞDǮ@PPW ! ^ 0(,01  !W2!6[(W2![W`@DHLPT~XP^\0& #"( + "  -^\Q^\ p1@ΐ. ~Hΐ0 Aj0ސ ̈ *ސ ̈:zA@ސ ̈* ސ ̈:zpޠ&eΐ. TB 9Ȍ19#59'3( E e 0@ (@@0@ (@@ @+ @-1p&@GDD@>@B*  p&@GDD@0 p&X&X,=:yp6p?qq5yq&(&X K ?0@@A@ q5'@sA@  6! #;K;;#\ 2  ~XǎTǞPǮLǾHD@``WPHx~Lp(,j~LǎHPPWPHx~Lp(,"~LǎHPPW`?8<@DH~Lp.ޠ//:T 2p/ p///p  :X ސ' /p  C@:8 6p  : @$:@$ 1 P@$`^P5%cR:W^XP'86 0":B0C9"5 4r+!+ @$0:  ?05N?:@ 5p  5 @$0:  /( /( /:/( 0 &009 4 @$05p (  5(T/ &1/  &0   9( ~LǎHǞDǮ@Ǿ<8`/`WP@D~Hr :  .LxpL8" :GA5pp!`' pq90A@3 95pL1" P>5p(`pq91A 31906~HǎDǞ@PPW   ?  ?0 6    W6    WX<@DHLPҧ~TsRNW  ( ( D b \ pױ'(R (> )     ,   aP/\ +! (() )((6  ' p7! BW  D ,,- < ~TǎPǞLǮHǾD@<XXWA0~: r:2rqrp?5p?:pprq3rp?:ppp:sp2~ǎW0@ A#1 ! 1W @(#)fcns.c 6.1 87/11/24 @(#)sgs.h 6.1 87/11/24 @(#)defs.h 6.1 87/11/24 %ssize: %s: %s @(#)main.c 6.1 87/11/24 @(#)sgs.h 6.1 87/11/24 @(#)defs.h 6.1 87/11/24 %s: size-%s PDP920 System V Release 2.0 9/1/83%ssize: unknown option "%c" ignored usage: %ssize [-Voxd] file ... %s[%.16s]%s: %ssize: %s: cannot read archive header %s: %ssize: %s: bad magic %ssize: %s: cannot open  @(#)process.c 6.1 87/11/24 @(#)sgs.h 6.1 87/11/24 @(#)defs.h 6.1 87/11/24 @(#)process.h 6.1 87/11/24 + %s:%s: cannot ldohseekcannot read aouthdrcannot read section header(%s)%ld%lo%lx Section Size Physical Address Virtual Address  T %-8.8s 0x%.8lx 0x%.8lx 0x%.8lx %-8.8s 0%.11lo 0%.11lo 0%.11lo %-8.8s %10ld %10ld %10ld  = 0x%lx = 0%lo = %ld @(#)ldaclose.c 6.1 87/11/23 @(#)ldahread.c 6.1 87/11/23 %ld%o%d%d%ld` @(#)ldclose.c 6.1 87/11/23 %ld` @(#)ldohseek.c 6.1 87/11/23 @(#)ldopen.c 6.1 87/11/23 %ld` r! @(#)ldshread.c 6.1 87/11/23 @(#)vldldptr.c 6.1 87/11/23 @(#)lddef.h 6.1 87/11/23 @(#)allocldptr.c 6.1 87/11/23 @(#)lddef.h 6.1 87/11/23 @(#)freeldptr.c 6.1 87/11/23 @(#)lddef.h 6.1 87/11/23 @(#)calloc.c 6.1 87/11/23 @(#)malloc.c 6.1 87/11/23 @(#)memset.c 6.1 87/11/23 @(#)mon.c 6.1 87/11/23 PROFDIRmon.out @(#)perror.c 6.1 87/11/23 : Unknown error @(#)data.c 6.1 87/11/23 P(P(P0R b( @(#)flsbuf.c 6.1 87/11/23 @(#)stdiom.h 6.1 87/11/23 @(#)fopen.c 6.1 87/11/23 @(#)fprintf.c 6.1 87/11/23 @(#)fread.c 6.1 87/11/23 @(#)stdiom.h 6.1 87/11/23 @(#)fseek.c 6.1 87/11/23 @(#)printf.c 6.1 87/11/23 @(#)scanf.c 6.1 87/11/23 @(#)setbuf.c 6.1 87/11/23 @(#)sprintf.c 6.1 87/11/23 r0 @(#)errlst.c 6.1 87/11/23 !!!!8!H!`!l!!!!!!!"""4"@"L"`"p"""""""###(#@#P#\#t#####$$$,$L$h$x.Error 0Not ownerNo such file or directoryNo such processInterrupted system callI/O errorNo such device or addressArg list too longExec format errorBad file numberNo child processesNo more processesNot enough spacePermission deniedBad addressBlock device requiredDevice busyFile existsCross-device linkNo such deviceNot a directoryIs a directoryInvalid argumentFile table overflowToo many open filesNot a typewriterText file busyFile too largeNo space left on deviceIllegal seekRead-only file systemToo many linksBroken pipeArgument out of domainResult too largeNo message of desired typeIdentifier removedChannel number out of rangeLevel 2 not synchronizedLevel 3 haltedLevel 3 resetLink number out of rangeProtocol driver not attachedNo CSI structure availableLevel 2 haltedDeadlock condition if locked @(#)getenv.c 6.1 87/11/23 @(#)isatty.c 6.1 87/11/23 000000000000000000000123456789abcdef0123456789ABCDEF @(#)doscan.c 6.1 87/11/23 >>>>? ? ? ? ? ? ? >? ? ? ? ? >? ? ? @(#)filbuf.c 6.1 87/11/23 @(#)findiop.c 6.1 87/11/23 @(#)dowrite.c 6.1 87/11/23 @(#)print.h 6.1 87/11/23 @(#)ungetc.c 6.1 87/11/23 @(#)atof.c 6.1 87/11/23 @(#)ctype.c 6.1 87/11/23 ((((( H @(#)ecvt.c 6.1 87/11/23 Fn CAy7Aׄ@È@Y@$ @(#)ldexp.c 6.1 87/11/23 @(#)fwrite.c 6.1 87/11/23 @(#)stdiom.h 6.1 87/11/23 @(#)frexp.c 6.1 87/11/23 @(#)memchr.c 6.1 87/11/23 u!U x%5.textx .data%x@.bss==5/ 0  !2$0 z2j[W8P +ȎP   88Wp~D%8,%0"%(% %P P(P(q P  .H- ` P(! P(d P(! P(%0djj 0P0H(!I4  qP ! I~DppWp@H~D !H(PP u(qp P  .H, \r P  -H P0.\" FX  z~X\qP ! OP(LH:րP(0P0H!G xP(~Dǎ@ppWp@~Dp~ P  .H+x nhL P  * Bh p &hqP ! u~Dǎ@ppWDH~LpR P  .X*( ))8 B(z P  '0 )8LBXP 1P!B)8lBT<P  0# )8AlP0P0P!E)8A2.z(KpqP ! ~LǎHǞDWh~@P * pP 1|!A 0P0|!D lP 1h!A0 <q 0   p*|"|(7 n e d 0  l0P0h!C qP Qq rq eD)8?J.d! 8P ! A4"P 1!?)8?NHP ! @"P 1!? .0P0!B X.!HP0!!! P08 P0!~@W?@DHLP~T P DP8tP ' VP@ ;,pP 1l!>  | j gq !  (llP l , 4Z !:@Tp| g2t*.}(@ t 0PXl!@T }P 1X!< zq 0  6%0 `d( d b%0z 0  \|4l,$l(3 %0 ^^z_X Z X0PXX!?H ΋6}.P 1X!; qqP oQVB4l! 2P8PX3~TǎPǞLǮHǾD@W`@D~HqdP8.L#l L\ j g]q]qq~HǎDǞ@``WH@~DpTP 1H!: 0P0H!=@ r zqpJ P 2zH!9 60P0zH!< P01~Dǎ@HHW@D~Hp: P  .X ( ))808x P  ( ))8X8<P 1L!8)87P P v0P0L!;)87@.x(kqP ! P00X~HǎDǞ@W@  @( ")86@@W8$ȆP=d0" )86"> $ `$QP=  P= QP=  88W8ȋ"$$$$$ $88WH@~Dq(p"8"fL ":%f4| "J"&%0x  "2  "\2n @"x$% 6  \#>%(\( |"`"~h.  #L2r "h ~Dǎ@HHW@  R%,% "%(%0%8 !%2% (%(%0%8  %0* 0!rL%(>%84%* D!.@@WPﰧDH~Lp0P`!5l %Ɠ <0P`P(52"%`0P0P 1>0P`P(4"%00PXP 1LP@.")80(0P`!4< (%j<0P`P(4"H%\0P 90| (,~LǎHǞDPPWPH~Lp)8( 7/ pWP <P (P0 'PX 'tP  P8 P0 '@PX '.lP` 'Ph7lJ7^P0 &PX &P` &ȋ~LǎHPPW864>665555Ύ588W85=5=5p=5`=88W8=50=5"=5=588W84444P  P8 P0 $PX $Ph56P5*P5P` $88WXHLP~Tqt $)8 ,3.(Ph 0|23(P 0x2X2(P 0t2.2(P  0p22(P@   (0l1ړċ^P $7)8 0 h* PP  P u@ p8 e. ~7)8 L d*P  ePP Pؓ p6')8 h0Pؓ*>P  QP(P`$)8 P)'"')8 )N7)8 `)')8!()l!\!:-*$!h%<X):, $!|%F0P`X )bztPh1VP1JP1>P12P@1&.~TǎPǞLǮHXXWH@~Dp%@ P Q "`!JnQ u" p"x! DQP  ePh"\%P0"!(P"X%fPX"!QdP P0QLPX>PІDPP"T$P`" HP  e4"P$P`"&Ph"L$XP0#&|P"H$"PX#$&FP  eP0"'PX"'zP0(PX(PPPP%PPP0!! P 'PX 'Pؓ)8#@%*%Q( Q%0Q$ QQ 8QP` P0PX%@ h~Dǎ@HHWxD~HqL#d'+ \1 2 /!'\#l*'h#t*'n#|*'t#*' |#*#`"`0P`L<!'"#%ܓ6~HǎDWX8+LQ PQ$XXW8Q +88WP@DH~Lq -܋ V(! V(! Z x(! r0l#(! fp$W%n% `%(T%@H)8$\ $l0$t"@&1)8$ $X"7)t%.%0$)8$ $T! h% .%($)8$ $P! 4%%0%8%(% ~LǎHǞD Ǯ@PPW8 ȧ~4p : J ~488WH<@~Dq   R%  T,  0  ~Dǎ@Ǟ<HHW   WxD~Hq . e (" !^8L<! %"\1 2#0/# ! !L \%'%brh%'%HXn%'%.>t%'%$|%' $ ~HǎDWx~Dp  e'" 7H<!%"xjx%.$@P!<'!' &7 !8 ^~DWH@~Dpz:' "7! ~Dǎ@HHWP@DH~Lp rL`&8`&4P&0P  @Ǘ' 7M!tM&0Z M7Q$ M$0 M`&0 fWP&4WP&8M( >`&0="=(==~LǎHǞDǮ@PPWh~<p ! .@0b(7\'  ~<hhW@~<p.&' F ~<@@WhD~Hqjv&> N!8 N !8v2p4N&("e  TpV<!8 X&"@V /4&.!  D ' $7 !j >$' x n~HǎDWh~<p ! .@T0`(7X'  ~<hhWPDH~Lpހ r f' VG7!# 0( F"7 (! ~LǎHǞDPPWh~<p ! .@,T$7'  ~<hhWPDH~LpTPHG'!0 8 7 ! ~LǎHǞDPPW@~<pJ*"7'  ~<@@W'  $W8( P$' '"' $$ $P'QP'R88W8^'! $ '< '*$11$2$"$ 88WH@~Dpqz'~Dǎ@HHW8088Wp Bj[BP48<@DH~LMHM! MM! MMNMNNN րNqpN$NN  N x((lx! ( 2NM  !(hրN Np0qp((q$N N sqp'( (&$    NpN p  PN! M!N xF pN(PNNN N NN ~LǎHǞDǮ@Ǿ<84PPWN! !N! N WP<@DH~Ly   s  Rq(+p#X((p(pspN~LǎHǞDǮ@Ǿ<PPW0+K "AC1!WAC$AhAC%hAC&hACWQWPX%AC1QCGxBBSD"vt ('"AC8('p'"$AC4$X$AhAC!FhAC"     BG G!    g   ,Q"%(  D b j D p     ~@ǎ<HHWH<@~DpǐLJ D   p-  p-' (. ( $   ~Dǎ@Ǟ<HHW8 ȧ~4p  *        |'Q!R D D p-%  ' p-7! ,~488W@8~<p  ( ppPQ8W-( pp. -^*    p-& ppPQ8W- >W @  ~<ǎ8@@WP pR- a!` !WH@~Dq( l~Dǎ@HHWH<@~Dr '$~Dǎ@Ǟ<HHWH<0@~Dr 0 (+R a(a( <r NwX   @   "    t  )r!  )a!"  p-~Dǎ@Ǟ<HHW@~<p.`W .`&0 2  &'   ~<@@WX?@DHLP~Ts @$  aP/\ (  )z  ' p-7! X (  <~TǎPǞLǮHǾD@XXWP<@DH~Lp   W |tlǧ" !,  40,'  W     )V  H )@     ,^   aP/\ +! (() )((  ' p-7! hBW  D ,,-n  ~TǎPǞLǮHǾD@<XXW@\.`.\) @@W@.` >`#@@WX@~D.x qώxTP.L֧H@HU(|~Dǎ@XXWP.p0>@DH".L @.M.p.@H.DPPW[W![W[W2![W2![WC2!,[W[X/W /[,//W!00[WH .(N0n8@HPX` W`X .(N0n8Ɏ@ɮHPԩة>^觾[![ZW [DW![*W2![W/W@8~( PPW0@ A#1 ! 1WpNNNNNǼO @P PPO$PpRU-PO$%py}kg,PO$(VP p:w]ѡ[q" ,O(0O(ְO(FpO@c(stdxX܋ `O d`O PO$([P  ,O(0O(\ְO(`O d`O (PO$[PQ̡P! ! ,O(0O(ְO(`O d`O 'Π- 8ы0):@0CAMр ѡ(PO$[P Q фP р}-!ш},O(0O(ְO(`O d`O / q4фыh`O d`O / q4ȡфы4ONO`O csd(u$+\-` d#h.l*x0Āelh%ox0XeEfgGn9ld`O  Od`O @ O O "  !O`d`O }N; -!10N@@ V 8@  /  +!10N"  /  !10N @ /00 0ѡ $@ZPECѡMѡ pO }O uOO ^d`O } pq 5#"0ѡP n b V J@ O 6@ *Od`O O O d`O O @     0 9: @ O Oz OWC04_D04ȋ_D04d`O - Op&@ 4OO  a@ 'O -OO pX Oo620Nx 0 NN"XN  OO   @ / & O g `h`O O 0!#иN0O,@O0ȧN(NN8O0 - NND  5  + NN NNg ю 0ѡaPO P .aP6 QaP POPO ׶`OpO8gN 06PO,QPU):RECAaFSRQaVrgagaO,- +aea E`NrvpOOO #2#: @ / & O g `h`O O 0<#0O,@O0ȧN(N N8O0`O PO,/Q)-0!-N! NB +N! N   N! NE00@qA0- '1qA@Aq@ `  .'qF<Ad &$ O OA@> QP&#1qA@Aq@O@pO`O #H O @ & O  ! O g `h`O 0#N0O,@O0ȧN(NN8N O,`O  FF=11=CCAM 0AMAPO,VA@O E@O pO}@NgOd``OO  >  O OOO @NpNN/4,O(0O(.ְO(zkg(PO$(VPp: w q&4,O(0O(ְO(@NpNN@ekd,O$( NDA4N,O(0O(NdNְO( ֠ON/4,O(0O(ְO(Jkd(PO$(VP@:0D A&4,O(0O( ְO(NpTkg(O$( wq( ,O(0O( lְO(     / ֠ON/4,O(0O( ְO(Jkd*PO$(VP@<0D A&4,O(0O( ְO(N fpOp\kg,O$( Nwq,N,O(0O( LְO( ֠OO/4,O(0O( ְO(Jkd*PO$(VP@< D A&4,O(0O( ְO(H{ p   O$( @  F@ , 2 ! . 00  +   j  pNؐNذNNNWhLPTX\`~dpЩ.   6d!06!#"(    % %Xh!! . t  * 6ߎ ޠ l h  [ h  6ΰl cf[^T!06!#"(  Xcs [(~(^ *>h^,"~(^ *;^,h    ~dǎ`Ǟ\ǮXǾTPLhhWP8<@DHL~P~P^^^ϞT^^x^:d2p4W^Q^ΰ L +!R  ->^Q^\![RQ^ 6^P v 60& 6 7W(!^Q^.^Q^e E|t^Q^d$! 6+ - B!s` T)Z. 2 l.242# .242""7^P l$^PLh(^z ^P~PǎLǞHǮDǾ@<8W`<@DHLP~T~ XcsR[\RP^\*)b!!0#.06#"( ^\P!+"  nX  c ~TǎPǞLǮHǾD@<``WH<@~Dp^qV T1 ]2 - qR Z -87#@]$*'B2 2#q q1 ]2~Dǎ@Ǟ<HHWH@~Dp HW & !   D 6ހ)  @  ,.((  ! p!-!7 R   .   W    ~Dǎ@HHW) .((  WP@DH~Lr @D''!'֖ )7ܘ)D ~LǎHǞDǮ@PPW ! ^ 0(,01  !W2!6[W2![W`@DHLPT~XP^\06 #"( + "  -^\Q^\ p1@ΐ. ~Hΐ0 Aj0ސ ̈ *ސ ̈:zA@ސ ̈* ސ ̈:zpޠ6eΐ. TB 9Ȍ19#59'3( E e 0@ (@@0@ (@@ @+ @-1p6@GDD@>@B*  p6@GDD@0 p66,=:yp6p?qq5yq6X(6 K ?0@@A@ q5'@sA@  6! #;K;;#\ 2  ~XǎTǞPǮLǾHD@``WPHx~Lp(,j~LǎHPPWPHx~Lp(,"~LǎHPPW`?8<@DH~Lp.ޠOO:T 2pO pOOOp  :X ސ7 Op  C@:8 6p  : @$:@$ 1 P@$`^P5%cR:W^XP'86 0":B0C9"5 4r+!+ @$0:  ?05N?:@ 5p  5 @$0:  O( O( O:O( 0 &009 4 @$05p (  5(TO &1O  &0   9( ~LǎHǞDǮ@Ǿ<8`O`WP@D~Hr :  .LhpL8"/:GA5pp!`' pq90A@3 95pL1"/P>5p(`pq91A 31906~HǎDǞ@PPW   ?  ?0 6    W6    WA0~: r:2rqrp?5p?:pprq3rp?:ppp:sp2~ǎW @(#)buildfcns.c 6.1 87/11/24 @(#)defs.h 6.1 87/11/24 @(#)sgs.h 6.1 87/11/24 cannot read section header for section %s could not seek to line numbers could not read line numbers could not locate new symbol table index could not write line numbers .textcould not read archive headercould not read string table w.textCould not read reloc info for sect. %d Could not seek to reloc entries in sect: %d could not read relocation couldn't fwrite No index found for relocation entry: %lo malloc failed, can't reset relocation @(#)buildtmp.c 6.1 87/11/24 @(#)defs.h 6.1 87/11/24 cannot copy optional headercannot copy section headerscannot copy sectionscannot copy relocation informationcannot copy symbol tablecannot copy external symbolscannot copy relocation entriescannot copy line numberscannot copy external symbolscannot copy relocation informationcannot copy symbol tablecannot copy external symbolscannot copy relocation information @(#)checkflags.c 6.1 87/11/24 no symbol tableno local symbolsrelocation entries; cannot strip @(#)copytmp.c 6.1 87/11/24 @(#)defs.h 6.1 87/11/24 rcannot recreate fileheadercannot recreate stripped filecannot recreate stripped filecannot read temp filecannot recreate stripped filecannot recreate stripped file @(#)fcns.c 6.1 87/11/24 @(#)sgs.h 6.1 87/11/24 @(#)defs.h 6.1 87/11/24 .4H%sstrip: %s: %s @(#)main.c 6.1 87/11/24 @(#)paths.h 6.1 87/11/24 @(#)sgs.h 6.1 87/11/24 wrusage: %sstrip [-l] [-x] [-r] file ... %s/%sstrp1%d/tmp%s/%sstrp2%d/tmp%s/%sstrp3%d/tmp%s/%sstrp4%d/tmp%s/%sstrp5%d/tmp%sstrip: %s: cannot open %sstrip: %s: bad magic error in archive hdr read %s %s cannot open temporary file %s for reading cammot open temporary file %s for writting %sstrip: Warning - symbol directory deleted from archive %s execute `ar ts %s` to restore symbol directory. ! can't recreate filecan't recreate file /tmp/tmp/tmp/tmp/tmp @(#)process.c 6.1 87/11/24 @(#)paths.h 6.1 87/11/24 @(#)sgs.h 6.1 87/11/24 @(#)defs.h 6.1 87/11/24 rrwwwwcannot read file headernot the correct magic numbercannot open temporary filecannot open temporary filecannot write cannot stripcannot write, cannot stripcannot open temporary filecannot open temporary filecan't copy archive header back` %-16s%-12ld%-6u%-6u%-8o%-10ldcannot recreate archive header @(#)setflags.c 6.1 87/11/24 @(#)sgs.h 6.1 87/11/24 @(#)defs.h 6.1 87/11/24 %%D%t%t%t%t%8%t%t%t%t%t%,%s: strip -%s PDP920 System V Release 2.0 9/1/83%sstrip: unknown option "%c" ignored %sstrip: -l and -s are incompatible options %sstrip: -x and -r are incompatible options @(#)ldaclose.c 6.1 87/11/23 @(#)ldaopen.c 6.1 87/11/23 r @(#)ldahread.c 6.1 87/11/23 %ld%o%d%d%ld` @(#)ldclose.c 6.1 87/11/23 %ld` @(#)ldfhread.c 6.1 87/11/23 @(#)ldgetname.c 6.1 87/11/23 @(#)ldlseek.c 6.1 87/11/23 @(#)ldohseek.c 6.1 87/11/23 @(#)ldopen.c 6.1 87/11/23 %ld` r! @(#)ldrseek.c 6.1 87/11/23 @(#)ldshread.c 6.1 87/11/23 @(#)ldsseek.c 6.1 87/11/23 @(#)ldtbread.c 6.1 87/11/23 @(#)ldtbseek.c 6.1 87/11/23 @(#)vldldptr.c 6.1 87/11/23 @(#)lddef.h 6.1 87/11/23 @(#)allocldptr.c 6.1 87/11/23 @(#)lddef.h 6.1 87/11/23 @(#)freeldptr.c 6.1 87/11/23 @(#)lddef.h 6.1 87/11/23 @(#)calloc.c 6.1 87/11/23 @(#)malloc.c 6.1 87/11/23 @(#)memset.c 6.1 87/11/23 @(#)mon.c 6.1 87/11/23 PROFDIRmon.out @(#)perror.c 6.1 87/11/23 : Unknown error @(#)data.c 6.1 87/11/23 QHQHQPS@cH- @(#)flsbuf.c 6.1 87/11/23 @(#)stdiom.h 6.1 87/11/23 @(#)fopen.c 6.1 87/11/23 @(#)fprintf.c 6.1 87/11/23 @(#)fread.c 6.1 87/11/23 @(#)stdiom.h 6.1 87/11/23 @(#)fseek.c 6.1 87/11/23 @(#)ftell.c 6.1 87/11/23 @(#)fwrite.c 6.1 87/11/23 @(#)stdiom.h 6.1 87/11/23 @(#)scanf.c 6.1 87/11/23 @(#)sprintf.c 6.1 87/11/23 sP @(#)errlst.c 6.1 87/11/23 00000011 141H1X1l11111111222(2<2P2d2x22222223 3 3<3P3l3333344.Error 0Not ownerNo such file or directoryNo such processInterrupted system callI/O errorNo such device or addressArg list too longExec format errorBad file numberNo child processesNo more processesNot enough spacePermission deniedBad addressBlock device requiredDevice busyFile existsCross-device linkNo such deviceNot a directoryIs a directoryInvalid argumentFile table overflowToo many open filesNot a typewriterText file busyFile too largeNo space left on deviceIllegal seekRead-only file systemToo many linksBroken pipeArgument out of domainResult too largeNo message of desired typeIdentifier removedChannel number out of rangeLevel 2 not synchronizedLevel 3 haltedLevel 3 resetLink number out of rangeProtocol driver not attachedNo CSI structure availableLevel 2 haltedDeadlock condition if locked @(#)getenv.c 6.1 87/11/23 @(#)isatty.c 6.1 87/11/23 @(#)memchr.c 6.1 87/11/23 000000000000000000000123456789abcdef0123456789ABCDEF @(#)doscan.c 6.1 87/11/23 gg g g g,g,g,g,g,g,g,gg,g,g,g,g,gg,g,g$ @(#)filbuf.c 6.1 87/11/23 @(#)findiop.c 6.1 87/11/23 @(#)dowrite.c 6.1 87/11/23 @(#)print.h 6.1 87/11/23 @(#)ungetc.c 6.1 87/11/23 @(#)atof.c 6.1 87/11/23 @(#)ctype.c 6.1 87/11/23 ((((( H @(#)ecvt.c 6.1 87/11/23 Fn CAy7Aׄ@È@Y@$ @(#)ldexp.c 6.1 87/11/23 @(#)frexp.c 6.1 87/11/23 u!V 088 .text0 .data  88@.bssFF8@ 0  !2$0  ؓ";[WX@DHL~Pqޠ !  ޠ  "   "   @  8 +,  ,~lϧ4ZP& -,6   @ $T}& X,( eo" p}$ 3R& pp -p ftpbp !,pp,p !UN8:H&8H   ȓ  Г 1xܓw6$xtPB   .T " tF*,.T  74~PǎLǞHǮDǾ@XXW@~<P  (ppx h7ZLI1x 'vZ&v1x8'v4F1xv 6 ~<@@WH<@P~D( ZǑNy<W%b"kRV wpǙ~Dǎ@Ǟ<HHW@~<p}t}`~<@@WWH<@~DphdjV1X`r*lxB nH > &r  0  ~Dǎ@Ǟ<HHW8ȶжؓUx'.Ȇ k88WPDH~LpH1xszր(! 81xsPLj1xs,֐ x)ȓvҋX)1xԓrlj$!1xrLj1xrǙրDLjvH1hk`~LǎHǞDPPWH@~Dpu'1xr'x#'1xq1xqLJqF1x q, uZuNwpq>u01x0qN<u wpLjm~Dǎ@HHWP?8<@DHϡ~L zQp -dffXqʋ !lq, ! H {~LǎHǞDǮ@Ǿ<8PPW8   B( > B(  S  t( 0b#( pPW ! 1 #  !ȋ  0 #  ! 0 #  !j| 0 #  !FX 0 #  !"4 0 #  !  0 #  !‹ 0 #  ! 0 #  !z 0 #  !Tf 0@ #  !.@ 0 #  !  ! 88W@X~<pX      bp ؋Hԓ".qqt~<@@W8 ȧ~4p pX  ! q~488W DHLPTX~\pp *~(o1hdx ( xV P^̧^^,.Ԏ, .o^P^^   x.T( x nǧǚq(.p$.,nr.nԈXǙ{xnԀV` ֐^Pf& ؓD   (()*zQ^V0^P '1x<i0Z^n̈a  Ǫ N`lP^^(^llW^  lP @l* P^֠Z^ċ^Q^.ؓNz dkQ^^PP̧^tؓtt (P^؋^Ǖ.`r` ܎^.<: ~\:<]"!< p P8W~LǎHǞDǮ@Ǿ<WH<@~DpD xtlF!  pp'q Lj  @  6Q(6p  @  ~Dǎ@Ǟ<HHW$1 2! WXLP~Tpp  ( Qx   Q   "       2' 1x11x(P,Rp x8 $1x(N`~TǎPǞLXXW@8~(4QL"~HǎDW@ 1xȓL1xܓLp @@Wx 0FQ^FxxW@8~<pڧw~<ǎ8@@WH<@~DpHhjljHhq !A [(1xKf&(q!Ǚ~Dǎ@Ǟ<HHhHW0A ~ (qp Bpp &  1  ~ǎǞWH@~D/ f~ " pq {Jp{P{ p~Dǎ@HHW0~s@1tC@ p:G @ /$A B!  1~W 000060@/40.00s010@C0(20͎.sWL 0s#< 0.# 2 0/# 0.#  WD 0s#4 0.#, 0/# 0.# W A04A0*4A0.400@/4*&@1C0(20*WP<@DH~L,3p$֐ x ,!@ = = 2 \D)t !Ǚm  xJT~LǎHǞDǮ@Ǿ<PPW8 ȧ~4p ؋D! 2 =2!0=#t~488W@8~<pl }^ /HxD $8! 2 {2! ,q~<ǎ8@@W .103000.0010@C10W8ȧTT.X88W?(@DHLP~Tqǐ  ސȓ   /9 .X8XKV/lpW X(X KDqu 68i  /~TǎPǞLǮHǾD@WH<@0~DqH`HHHI   ώ  p~H/8Vj~Hqq'/!H/Z ZH$ $yF> -ܓؓHȓF t. (p !!(qwJ8p~Dǎ@Ǟ<HHW@~< Hp:Q*DNIwp~<@@W@ 0~4pր ȧ8<8!2pȶ~4ǎ0@@W8 ȧ~4p  +7G ~488W`8~<pǀ(5zX@HFB *t @H X X~<ǎ8``W84G488W8ȧ@DHLPT~XrP^$Fְ8+R"4.V ǻ&l P^(!0/#(! ^(Pް`PT^0,6n(\.^(0Ͼ,P^4րL(R" 3FVP 4?Lj^4Pf X;@4PPQPP: ^4 X: Q^$^4P*1xd+<t$\>4 =(ώ\8|h (! C!1B" ,|hb0|h.\*\ |R qzK ^(P/e$43 ~XǎTǞPǮLǾHD@88WH<@@~D0!΀p?p&Ȕ p*p[ Xpΐ-Dy ,ΐ]y2 AtxpXpYs x '!pF0A,0(<V#~Dǎ@Ǟ<HHW@8~<p 0 q ~<ǎ8@@W`@DH~L(yx@'/@@ (P )/p /Zq')Q/!Q ! ).p /qy'/H//Pp q pQ).Q !Q*~LǎHǞDǮ@``W@48~<p@  *. f ~<ǎ8Ǟ4@@WP@~Dp-  9t@X  <40 !7"   T(-H !.H!8 Bx0$!7Z"   d(,ؓ!X! !.H!8 h0<!6*",2$   (+>.L: @Lt .H:P @H!!H!7 ,@L~Dǎ@PPW`@DHLPT~X08P @ 0 6Vt@*r0@!4@L@,*>hpHx  5\0$!4^ ؓ.8Q8p@ 80 3 88֠Pp hp@>0*3 ׋((V @ 4x$0<!3&*L"(8H.\7( @^ !.\((.q(% !L~XǎTǞPǮLǾHD@``WP@DH(~L$' 3Th@䜋4p !b0X!1FPXz Hz >z 4z  *z  z ֐`\rĈ!2t hqq0x!1@z @x*&\*.&xHqp 1 b0 !0b[~LǎHǞDǮ@PPWX~@pȓ- 0N!/ N e:2vP80` 00P!/| (P$$ 0n"0!/  1008 P /0F!. PF($(0<!.^*"#  /  P2L P0!!T P!- T80`0P0208P0Ķ~@XXW8Ȇ $88WX85h $< @ XXW@8~<p  H  (>^ ~<ǎ8@@W  WPH~Lq2r*L ! *'p *| *x0*>(82*6 ~LǎHPPW8T *43 0488W8 ȧ~4p "fwp~488W`~<pq  @P! 0 # ) $ 02 0 #)  !02 @*B|~<``Wh<~@qD1&1x*'(ҋT0h ^g!0t/> 0g!1؍/T/F<1x*'(>$/6/ ~@ǎ<hhWH~D0|x(P// ./ ƶpVP:4P= / P;ދp|x'q  ؂T !˼}X{qp؋:!21x(+&(j~DHHW@8~<pq  ͘Ȏ Ȏr^ Pa. +,+(V<Г  +0~<ǎ8@@W(@DH~LF ǒ n|Ԇtp||`+0(+4׀B   ;   |'  #( |) Ԏ| \|q*! Z  R( |)" &'qГ4  qސ| ܋ +Dפ py q7q   ГR / 2      .0q : =q =|! 0;#q |!Pɨ 0P! q'!! ~P|7!q2" |؋ d~LǎHǞDǮ@W8Z! Hܶض!!!  1   w88WH<@~Dp&( (h+TҬ+l#R HP H(!% H)!+P+~Dǎ@Ǟ<HHWX?@DHLP~T hpxְ֠h֐p h(+ kP3Qa1p߁.p- q   qp  Rpq,p.` 2 q!pj ,!0#!)! 0#q      BG G!@    g   ,Q"%(  D b j D p     ~@ǎ<HHWH<@~DpǐLJ D   p5X  p5X' (. (    ~Dǎ@Ǟ<HHW8 ȧ~4p  *        |'Q!R D D p5X%  ' p5X7! ,~488W@8~<p  ( ppPW5X( pp6`5X^*    p5X& ppPȧW5X W @  ~<ǎ8@@WP pR5X a!` !WH@~Dq' l~Dǎ@HHWH<@~Dr '$~Dǎ@Ǟ<HHWH<0@~Dr 0 (+R a(a( <r NwX   @   "   R t  )r!  )a!"  p5X~Dǎ@Ǟ<HHW@~<p.`W .`&0 2  &'   ~<@@WX?@DHLP~Ts @  aP/\ (  )  ' p5X7! X (  <~TǎPǞLǮHǾD@XXWP<@DH~Lp   W |tlǧ" !  40,'  W     )V  H`#F@@WX@~D.x qώxTP.LH@HU(~Dǎ@XXWP.p0>@DH".L @.M.p.@.DPPWXDHL~Pp.8(8 87Vj^pTD 4*  T~PǎLǞHǮDXXW ! ^ 0(,01  !W!![W[W![W. >$.;0 [VW!;0 [4W[B[ W2![W2![W[W2![W[8@W 8@[l8@8@W!00[BWH .(N0n8@HPX` W`X .(N0n8Ɏ@ɮHPԩة>^觾[![W [W [dW[J. W2![ WPT.>x PPWp  $Wpǀǐ Ǡǰ $WWpǼ @P PP$PpRU5XP$%py}kg,P$(VP p:w]ѡ[q" ,(0(ְ(Fp@c(stdxX܋ ` d` P$([P  ,(0( ְ(` d` (P$[PQ̡P! ! ,(0(ְ(` d` 'Π- 8ы0):@0CAMр ѡ(P$[P Q фP р}-!ш},(0(ְ(` d` / q8фыh` d` / q8фы4` csd(u$+\-` d#h.l*x0Āelh%ox0XeEfgGn9ld`  d` @   "  !`d` }; -!10@@ V 8@  /  +!10"  /  !10 @ /00 0ѡ $@ZPECѡMѡ p } u ^d` } pq 5#"0ѡP n b V J@  6@ *d`   d`  @     0 9: @  z WC08_D08_D08d` - p&@ 4  a@ ' - pX Oo620x 0 "X     @ / &  g `h`  0!#и0,@0ȧN(80 - D  5  +  g ю 0ѡaP P .aP6 QaP PP ׶`p8g 06P,QPU):RECAaFSRQaVrgaga,- +aea E`rvp #2#: @ / &  g `h`  0<#0,@0ȧN(,80` P,/Q)-0!-! B +!    ! E00@qA0- '1qA@Aq@ `  .'qF<Ad &$  A@> QP&#1qA@Aq@@p` #H  @ &   !  g `h` 0#0,@0ȧN(8 ,`  FF=11=CCAM 0AMAP,VA@ E@ p}@gd``  >    @p/8h,(0( ְ(zkg(P$(VPp: w q&8h,(0( ְ(@p@ekd,$( DA4,(0( ְ( ֠/8|,(0( ְ(Jkd(P$(VP@:0D A&8|,(0( tְ(pTkg($( wq( ,(0( ְ(     / ֠/8|,(0( ְ(Jkd*P$(VP@<0D A&8|,(0( lְ( fpp\kg,$( wq,,(0( ְ( ֠/8h,(0( ְ(Jkd*P$(VP@< D A&8h,(0( Xְ(H{ p   $( @  f@ , 2 ! . 00  +   ߊ  pؐذWhLPTX\`~dpЩ.   /dT!0/!#"(   % %X!! .d  * /ߎ ޠ l h  [ h  /ΰl cf[^!0/!#"( Hcs [(~(^ *>h^,"~(^ *;^,h    ~dǎ`Ǟ\ǮXǾTPLhhWP8<@DHL~P~P^^^ϞT^^x^:d2p8W^Q^ΰ L, +!R  ->^Q^![RQ^ /^P v /0& / 7W(!^Q^.^Q^e E|t^Q^d՜! /+ - B8!s` T)z. 2 l.242# .242""7^P l$^PLh(^z ^P~PǎLǞHǮDǾ@<8W`<@DHLP~T~ XcsR[\RP^\*)b !!0#.0/#"( ^\P!+"  tnX  c ~TǎPǞLǮHǾD@<``WH<@~Dp^qV ϼ1 ]2 - qR Z -87#@]$*'B2 2#Zq q1 ]2~Dǎ@Ǟ<HHW1X 6h(  WP@DH~Lr @D''!' )7) ~LǎHǞDǮ@PPW2!6[xW`@DHLPT~XP^\0/ #"( + "  -^\Q^\ p1@ΐ. ~Hΐ0 Aj0ސ ̈ *ސ ̈:zA@ސ ̈* ސ ̈:zpޠ/eΐ. TB 9Ȍ19#59'3( E e 0@ (@@0@ (@@ @+ @-1p/@GDD@>@B*  p/@GDD@0 p99,=:yp6p?qq5yq9(9 K ?0@@A@ q5'@sA@  6! #;K;;#\ 2  ~XǎTǞPǮLǾHD@``WPHx~Lp(,j~LǎHPPWPHx~Lp(,"~LǎHPPW`?8<@DH~Lp.ޠ:T 2p pp  :X ސ: p  C@:8 6p  : @$:@$ 1 P@$`^P5%cR:W^XP'86 0":B0C9"5 4r+!+ @$0:  ?05N?:@ 5p  5 @$0:  ( ( :( 0 &009 4 @$05p (  5(T &1  &0   9( ~LǎHǞDǮ@Ǿ<8``WP@D~Hr :  .LxpL8"/:GA5pp!`' pq90A@3 95pL1"/P>5p(`pq91A 31906~HǎDǞ@PPW   ?  ?0 6    W6    WX<@DHLPҧ~TsRNW  ( ( D  \ pױ5X'(R (> )8     ,˾   aP/\ +! (() )((.  ' p5X7! BW  D ,,-  ~TǎPǞLǮHǾD@<XXWA0~: r:2rqrp?5p?:pprq3rp?:ppp:sp2~ǎW0@ A#1 ! 1W @(#)main.c 6.1 87/11/24 $$#|=^();&<>*?[]:$`'"\ :=;{}&>|Reading "=" type args on command line. Reading internal rules. Reading environment. No description argument after -f flagCannot open %s.IGNORE.SILENT.SUFFIXESNo suffix list. No arguments or description file @ *** %s NOT REMOVED. *** %s removed..PRECIOUSr--Reading %s Description file error %sOpen directories: %d: %s Macros: %s = %s Lookup chain: %s %s %s: %s done=%d (MAIN NAME) depends on: commands: %s -f`  $ l8  Unknown flag argument %cZZZZZZZZZZZZZZZZMAKEFLAGS=@0pRELEASEmakefileMakefileMAKEFLAGS @(#)doname.c 6.1 87/11/24 *<%@<?@%@<*.a%@?%@@@doname(%s,%d) TIME(%s)=%ld look for explicit deps. %d TIME(%s)=%ld Too many command lines for `%s' look for implicit rules. %d archmem = %s archname = %s right match = %s %s ---%s--- %s TIME(%s)=%ld Looking for Single suffix rule. .DEFAULTlook for DEFAULT rule. %d Don't know how to make %s`%s' not remade because of errors `%s' is up to date. @touch(%s) $(MAKE) %s%s %s%s *** Error code %d*** Termination code %d (ignored) <!$! nulled, predecessor circle $! nulled, too many predecessors @(#)misc.c 6.1 87/11/24 Hash table overflowCannot allocate memoryCannot allocate memoryCannot allocate memoryCannot allocate memoryout of memoryout of memoryinfinitely recursive macro?*:*=*@*<%?@*<%?Cannot alloc mem./setvar: %s = %s noreset = %d envflg = %d Mflags = 0%o [@*! %s is not an archiveBAD ARCHIVE|v @(#)rules.c 6.1 87/11/24 LXdlt|(0Px08Xt  0 8 X       !!@!P!X!p!x!!!!!!" ""4"P"`"h"""""## #(#H#P#p######$$$ $@$H$h$$$$$$$%%(%8%@%X%t%%%%%%&&&&4&T&d&t&|&&&&''' '0'8'X'p''''''''''((8(H(X(`(x((((((()))()4)<)\)|)))))*0*D.p:.c:.SUFFIXES: .out .o .c .c~ .p .p~ .e .e~ .r .r~ .f .f~ .F .F~ .y .y~ .l .l~ .s .s~ .sh .sh~ .h .h~MAKE=makeYACC=yaccYFLAGS=LEX=lexLFLAGS=LD=ldLDFLAGS=CC=ccCFLAGS=-OAS=asASFLAGS=GET=getGFLAGS=F77=f77FFLAGS=-OPC=pcPCFLAGS=-ORFLAGS=EFLAGS= $(CC) $(CFLAGS) $< -o $@ $(LDFLAGS).c~: $(GET) $(GFLAGS) -p $< > $*.c $(CC) $(CFLAGS) $*.c -o $* $(LDFLAGS) -rm -f $*.c $(PC) $(PCFLAGS) $< -o $@ $(LDFLAGS).p~: $(GET) $(GFLAGS) -p $< > $*.p $(PC) $(PCFLAGS) $*.p -o $* $(LDFLAGS) -rm -f $*.p.sh: cp $< $@; chmod +x $@.sh~: $(GET) $(GFLAGS) -p $< > $*.sh cp $*.sh $*; chmod +x $@ -rm -f $*.sh.f .F .r .e: $(F77) $(RFLAGS) $(EFLAGS) $(FFLAGS) $< -o $@ $(LDFLAGS).f~: $(GET) $(GFLAGS) -p $< > $*.f $(F77) $(FFLAGS) $*.f -o $* $(LDFLAGS) -rm -f $*.f.F~: $(GET) $(GFLAGS) -p $< > $*.F $(F77) $(FFLAGS) $*.F -o $* $(LDFLAGS) -rm -f $*.F.r~: $(GET) $(GFLAGS) -p $< > $*.r $(F77) $(RFLAGS) $*.r -o $* $(LDFLAGS) -rm -f $*.r.e~: $(GET) $(GFLAGS) -p $< > $*.e $(F77) $(EFLAGS) $*.e -o $* $(LDFLAGS) -rm -f $*.e.c.o: $(CC) $(CFLAGS) -c $<.c~.o: $(GET) $(GFLAGS) -p $< > $*.c $(CC) $(CFLAGS) -c $*.c -rm -f $*.c.c~.c: $(GET) $(GFLAGS) -p $< > $*.c.p.o: $(PC) $(FLAGS) -c $<.p~.o: $(GET) $(GFLAGS) -p $< > $*.p $(PC) $(PCFLAGS) -c $*.p -rm -f $*.p.p~.p: $(GET) $(GFLAGS) -p $< > $*.p.f.o .F.o .r.o .e.o: $(F77) $(RFLAGS) $(EFLAGS) $(FFLAGS) -c $<.f~.o: $(GET) $(GFLAGS) -p $< > $*.f $(F77) $(FFLAGS) -c $*.f -rm -f $*.f.f~.f: $(GET) $(GFLAGS) -p $< > $*.f.F~.o: $(GET) $(GFLAGS) -p $< > $*.F $(F77) $(FFLAGS) -c $*.F -rm -f $*.F.F~.F: $(GET) $(GFLAGS) -p $< > $*.F.r~.o: $(GET) $(GFLAGS) -p $< > $*.r $(F77) $(RFLAGS) -c $*.r -rm -f $*.r.r~.r: $(GET) $(GFLAGS) -p $< > $*.r.e~.o: $(GET) $(GFLAGS) -p $< > $*.e $(F77) $(EFLAGS) -c $*.e -rm -f $*.e.e~.e: $(GET) $(GFLAGS) -p $< > $*.e.s.o: $(AS) $(ASFLAGS) -o $@ $<.s~.o: $(GET) $(GFLAGS) -p $< > $*.s $(AS) $(ASFLAGS) -o $*.o $*.s -rm -f $*.s.y.o: $(YACC) $(YFLAGS) $< $(CC) $(CFLAGS) -c y.tab.c rm y.tab.c mv y.tab.o $@.y~.o: $(GET) $(GFLAGS) -p $< > $*.y $(YACC) $(YFLAGS) $*.y $(CC) $(CFLAGS) -c y.tab.c rm -f y.tab.c $*.y mv y.tab.o $*.o.l.o: $(LEX) $(LFLAGS) $< $(CC) $(CFLAGS) -c lex.yy.c rm lex.yy.c mv lex.yy.o $@.l~.o: $(GET) $(GFLAGS) -p $< > $*.l $(LEX) $(LFLAGS) $*.l $(CC) $(CFLAGS) -c lex.yy.c rm -f lex.yy.c $*.l mv lex.yy.o $*.o.y.c : $(YACC) $(YFLAGS) $< mv y.tab.c $@.y~.c : $(GET) $(GFLAGS) -p $< > $*.y $(YACC) $(YFLAGS) $*.y mv y.tab.c $*.c -rm -f $*.y.l.c : $(LEX) $< mv lex.yy.c $@.c.a: $(CC) -c $(CFLAGS) $< ar rv $@ $*.o rm -f $*.o.c~.a: $(GET) $(GFLAGS) -p $< > $*.c $(CC) -c $(CFLAGS) $*.c ar rv $@ $*.o rm -f $*.[co].p.a: $(PC) -c $(PCFLAGS) $< ar rv $@ $*.o rm -f $*.o.p~.a: $(GET) $(GFLAGS) -p $< > $*.p $(PC) -c $(CFLAGS) $*.p ar rv $@ $*.o rm -f $*.[po].s.a: $(AS) $(ASFLAGS) $< ar rv $@ $*.o rm -f $*.o.s~.a: $(GET) $(GFLAGS) -p $< > $*.s $(AS) $(ASFLAGS) -o $*.o $*.s ar rv $@ $*.o -rm -f $*.[so].h~.h: $(GET) $(GFLAGS) -p $< > $*.hmarkfile.o: markfile A=@;echo "static char _sccsid[] = \042`grep $$A'(#)' markfile`\042;" > markfile.c cc -c markfile.c rm -f markfile.c @(#)dosys.c 6.1 87/11/24 -ce-cshSHELL/bin/shCouldn't load Shellbad wait codeCannot load %stouch: file %s does not exist. Cannot touch %s Bad character %c (octal %o), line %d line too longincluderCannot read or get %sInclude file: "%s" Cannot open %s___`apeccddPddedde<eHeTe`epeyacc stack overflowsyntax errorInconsistent rules lines for `%s' Multiple rules lines for `%s' .SUFFIXES.SUFFIXESToo many leftsMust be a separator on rules line %d             @(#)dyndep.c 6.1 87/11/24 @(#)prtmem.c 6.1 87/11/24 @(#)sgetl.c 6.1 87/11/23 @(#)calloc.c 6.1 87/11/23 @(#)ctype.c 6.1 87/11/23 ((((( H @(#)malloc.c 6.1 87/11/23 @(#)memset.c 6.1 87/11/23 @(#)sleep.c 6.1 87/11/23 @(#)data.c 6.1 87/11/23 5X @(#)filbuf.c 6.1 87/11/23 @(#)flsbuf.c 6.1 87/11/23 @(#)stdiom.h 6.1 87/11/23 @(#)fopen.c 6.1 87/11/23 @(#)fprintf.c 6.1 87/11/23 @(#)fread.c 6.1 87/11/23 @(#)stdiom.h 6.1 87/11/23 @(#)fseek.c 6.1 87/11/23 @(#)ftell.c 6.1 87/11/23 @(#)printf.c 6.1 87/11/23 @(#)scanf.c 6.1 87/11/23 @(#)sprintf.c 6.1 87/11/23 @(#)system.c 6.1 87/11/23 -csh/bin/sh @(#)ungetc.c 6.1 87/11/23  @(#)isatty.c 6.1 87/11/23 000000000000000000000123456789abcdef0123456789ABCDEF @(#)doscan.c 6.1 87/11/23 @(#)findiop.c 6.1 87/11/23 @(#)dowrite.c 6.1 87/11/23 @(#)print.h 6.1 87/11/23 @(#)atof.c 6.1 87/11/23 @(#)ecvt.c 6.1 87/11/23 Fn CAy7Aׄ@È@Y@$ @(#)ldexp.c 6.1 87/11/23 @(#)fwrite.c 6.1 87/11/23 @(#)stdiom.h 6.1 87/11/23 @(#)frexp.c 6.1 87/11/23 @(#)memchr.c 6.1 87/11/23 u!V ;p$8.text; .data88p<8@.bss--$% 0  !2$0 8J [WH48<~@ p| b  HdP ; 4D D0 p   0(l. 4# 0m 0n 0(# 0(m nns0(0("0(p0(qp0(< 0(~@ǎ<Ǟ8Ǯ4HHW0  Z 0 d : , 00#2 ) 0 Wh@DHLPTЧ~XPp^d`c,>?> 2a*mыq `  0#  pd0020(^dQ^dp0 0F0(^dQ^dN0( 0(0( 0( 0(qp: 080000  .*:0000 08..*0000~0(`\0P`0L\d \  .*ȓz0000q00~XǎTǞPǮLǾHD@hhW0 Г 00W8$ 88WP<@D~Hp, LLpǀ1'2בסzH@80(L LLp  ~HǎDǞ@Ǯ<PPW :"4 mn2"'W Q!Q Q 0<- # -- p'-JF" 4#  m  n 4#  m  n!0F 4# m n$--Ć mn n ȋ2$21  ----W@8- @~<2!0!!\1\-A!42A!4"1#x(2"#"t2A!42A!4"1#t't'"dt'"drt'"d\8 d# 2! 0!("d*~<ǎ8@-@W@!:#:#"0$0 #0*0W8 00  0 B!41 -RA!*P%00(# %09(# $@ <^2 00  0 B!4188Wpr[B@8~     BG G!H    g   ,Q"%(  D b j D p     ~@ǎ<HHWH<@~DpǐLJ D   p#  p#' (. (Ă   ~Dǎ@Ǟ<HHW8 ȧ~4p  *        |'Q!R D D p#%  ' p#7! ,~488W@8~<p  ( ppP0xW#( pp$#^*    p#& ppP0xW#&W @  ~<ǎ8@@WP pR# a!` !W@~<p.`W .`&0 2  &'   ~<@@W[W![W[WC2!,[W[%W %[%%W![bW [W![*W2![W%WPT.> PPWP48<@DH~L.`H.h! .`.`! .h.h.t.`.p.t.|ր.pqpN$.p.| .|x((lx! ( 2.t.`  !(hր.|.tp0qp((q$.t .|sqp'( (&\   >  .tp.|p  P.t! .`!.t xF p.p(P.p.x.p .|.p.|~LǎHǞDǮ@Ǿ<84PPW.p! !.t! .|WP<@DH~Ly   s  Rq(+p#X((p(psp.x~LǎHǞDǮ@Ǿ<PPW0+K "AC1!WAC$AhAC%hAC&hACWQWPX%AC1QCGxBBSD"vt ('"AC8('p'"$AC4$X$AhAC!FhAC" QP&#1qA@Aq@/@p/`/ #H / @ & /  ! / g `h`/ 0#.0/,@/0ȧN(.r.8. /,`/  FF=11=CCAM 0AMAP/,VA@/ E@/ p/}@.g/d``//  >  / /// @.p../),/(0/(Vְ/(zkg(P/$(VPp: w q&),/(0/(ְ/(@.p..@ekd,/$( .DA4.,/(0/(..ְ/( ֠/./),/(0/(Fְ/(Jkd(P/$(VP@:0D A&),/(0/(ְ/(.pTkg(/$( wq( ,/(0/(ְ/(     / ֠/./),/(0/(@ְ/(Jkd*P/$(VP@<0D A&),/(0/(ְ/(. fp/p\kg,/$( .wq,.,/(0/(tְ/( ֠///),/(0/(,ְ/(Jkd*P/$(VP@< D A&),/(0/(ְ/(H{ p   /$( @  ~@ , 2 ! . 00  +    p.ؐ.ذ...WP@DH~Lr @D''!' )7H)\ ~LǎHǞDǮ@PPW2!6[WPHx~Lp(,j~LǎHPPWPHx~Lp(,"~LǎHPPW`?8<@DH~Lp.ޠ//:T 2p/ p///p  :X ސ*x /Jp  C@:8 6p  : @$:@$ 1 P@$`^P5%cR:W^XP'86 0":B0C9"5 4r+!+ @$0:  ?05N?:@ 5p  5 @$0:  /( /( /:/( 0 &009 4 @$05p (  5(T/ &1/  &0   9( ~LǎHǞDǮ@Ǿ<8`/`W   ?  ?0 6    W6    WX<@DHLPҧ~TsRNW  ( ( D  \ pױ#'(R (> )@     ,۾   aP/\ +! (() )((  ' p#7! BW  D ,,-V  ~TǎPǞLǮHǾD@<XXW0@ A#1 ! 1W @(#)touch.c 6.1 87/11/24 amcusage: touch [-amc] [mmddhhmm[yy]] file ... touch: %s cannot create touch: %s cannot stat touch: cannot change times on %s  @(#)ctime.c 6.1 87/11/23 Day Mon 00 00:00:00 1900 SunMonTueWedThuFriSatJanFebMarAprMayJunJulAugSepOctNovDecTZpPDTPSTW`/Lw/K:/JMFw/ @(#)getenv.c 6.1 87/11/23 @(#)getopt.c 6.1 87/11/23 --: illegal option -- : illegal option -- : option requires an argument -- : option requires an argument --  @(#)mon.c 6.1 87/11/23 PROFDIRmon.out @(#)perror.c 6.1 87/11/23 : Unknown error @(#)data.c 6.1 87/11/23 0002B# @(#)flsbuf.c 6.1 87/11/23 @(#)stdiom.h 6.1 87/11/23 @(#)fprintf.c 6.1 87/11/23 R @(#)errlst.c 6.1 87/11/23 &&&&0&@&X&d&&&&&&&''','8'D'X'h'x'''''''(( (8(H(T(l(((((())$)D)`)p.Error 0Not ownerNo such file or directoryNo such processInterrupted system callI/O errorNo such device or addressArg list too longExec format errorBad file numberNo child processesNo more processesNot enough spacePermission deniedBad addressBlock device requiredDevice busyFile existsCross-device linkNo such deviceNot a directoryIs a directoryInvalid argumentFile table overflowToo many open filesNot a typewriterText file busyFile too largeNo space left on deviceIllegal seekRead-only file systemToo many linksBroken pipeArgument out of domainResult too largeNo message of desired typeIdentifier removedChannel number out of rangeLevel 2 not synchronizedLevel 3 haltedLevel 3 resetLink number out of rangeProtocol driver not attachedNo CSI structure availableLevel 2 haltedDeadlock condition if locked @(#)isatty.c 6.1 87/11/23 @(#)malloc.c 6.1 87/11/23 000000000000000000000123456789abcdef0123456789ABCDEF @(#)dowrite.c 6.1 87/11/23 @(#)print.h 6.1 87/11/23 @(#)ecvt.c 6.1 87/11/23 Fn CAy7Aׄ@È@Y@$ @(#)fwrite.c 6.1 87/11/23 @(#)stdiom.h 6.1 87/11/23 @(#)memchr.c 6.1 87/11/23 u!^ [!gH.text[ .dataHH!\H@.bss==g, 0  !2$0 H"%[WPDH~Lq 6F|p@ @(tQ -0!0(200(20 "0T# 0o#؋8 -(@0!! @0 @ p !! @86t@8$rFt' d"@$t"!@@T +P@@@@$0( @0! @0 @ p'!? @Hq0@pCր#HvAր#HhAր#HZA ր#HLAր$H>Aր$H0BCBCBCB C BCCq(1@@qq@0"!! @0 @ p !A؆(@0|"r4zA5^AABA؎8@(!Ax"PpBBPBPBpǁu3`0 (2ƋBpBpPBpBp2p "BBBqptX!24N3l3T3Jp32\ 3382@0BxA<A؎2H&\ 0&P&BBB  ABA A Asp( 0B!AABBB A A18pA؆ RAA؆  @0qBxPB%B! ϕ* BP/y<֐BBx BP.yB Bx!`@0Bx*4BP.~BxT$~LǎHǞDPPWh<@DHLP~TQ^XP^dAA ѓ ޠ&P" d*,   p-pAq$)q!n\(*!DP^` `^`P   d n@0R ѓ ޠ&P$ `)H   p,ҋH^dQ^dB^`q2h Br&Bqf((Ph\ p \qqqqǘq~\^XQA @(@(P^XZ@(qp1A#4B!(( P@(qpqpA%A * AX r P^X^dPBx @0 ҋ BP+lB \B!v^dP%~TǎPǞLǮHǾD@<hhWP <@DsH~L掁   ptp891pTp+p8t7p!$!V ֠p DZǁJp!p1p!!! 07p!$!n6.t W3~LǎHǞDǮ@Ǿ<PPWH8<@~Dz'tp D@'"0WF"p("0W $x s! s:z:)t 7~Dǎ@Ǟ<Ǯ8HHW`8<@DHL~PPA^BBABnހ{ϮTЎ&P$ "  Z(Bn &J^Q^("*   0 q=qnq 2֠ހBZQqp.T!%Tpp.T!  < X'p"TH h|  WA{*@0 'qB B~PǎLǞHǮDǾ@<8W1 2"*W@ ~<qB v \!r'* H B!!$q (~<@@W8 B!88WX?8<@DH~L~Pޠ&P" @H   p"AB'R *    ̋jp!p0WpD$pPtp     t$~LǎHǞDǮ@Ǿ<8XXW80! @A88W@~<BxZp`Bd:BxBx~<@@W@0NP@ p!-!%p P@ p>@00Bp a BpaW8@8Ȇ:xB@8|:&`B88W8~<A@8@8`" |@0qppX @ @"z .`.@zz"b.B``q@0~<ǎ8W8 88WH<@~Dp&p  ~Dǎ@Ǟ<HHW@~<   Bx@0 Bxp@0: !JqBxp$Z~<@@Wx@DHLPT~XP@@TP(^tP@H^dndtyD! ! p2(  (0-#'0-# q/81#(- #@$$"$ '!B(K@B$LDD@>`@.\:&1S^l!e\pE(Ȍ (DŽՋ 1P0e^h P(Ȅ!2΀08 .2(70$@ǎ`(0.#~\'0.#qZ 8'q#B ((- 2(0$#"$ '(+ '#"$ (00# ~((- (0$#"$ Ӌq 0 F( $Ӌ0  , ! <,q(  ( P(  xAqAp H^tQ^t^d(Q^d@@nta  4~XǎTǞPǮLǾHD@xxW * X1 2*@T<!*@T&@T@TW@0Ap8~<&qD4sz 1 p q 1pTȋD1p  1 p p4!p11  p 1 ~<ǎ8@@WW@@ #(@H2@$4W  2$AC0W  s! WP<@DH~Lh.p@@(p@Hlp@`@hsh M(!  M(! . (! 8 (! 4 .  z(! 0b#(! pWn<#p, p"p A؋ Ahhhh hhVh $hp@(:$ Ћhh@(hh6h $hB HP  hh(hhlp'!hh $&lpϧht lxjhhh-~LǎHǞDǮ@Ǿ<PPW 0020@$4340WX<@DHLP~Ts!(q(pq(0W  )0W  ",)0W  ڋpq(D'0W t'( ()0W )*D()(*t))(<~d'$01(s!sNj (t)'(~TǎPǞLǮHǾD@<XXW@ p 0ސ$ ~ pp ,qrprw1<~ǎǞW8“(88W888W@8 ~<q@  q A(APspsp( & AІ ~<ǎ8@@Wp[BX?@DHLP~Tp=r=b 0 =p$= =X ==p T p=p q=  ( ^% %! 01'q2! 'q/ !' :Gq21304!:'q.%,/ %H== =P=q9(9#0@@5601 0= =)~TǎPǞLǮHǾD@XXWH@~D,-p&  pp,~ &"P  &!~Dǎ@HHW!21!0W! W!120WX?@DHLP~Tr8     *8  ' p*P7! ` ?  ~TǎPǞLǮHǾD@XXWH@~Dp W & !   D 6ހ&P  @  +`(  ! p!*P!7  R   .   W    ~Dǎ@HHW8 ȧ~4p&P.q+`(~488W@8~<pp ~W  < r  v,   ~<ǎ8@@W8 ȧ~4p T g "Q%(   ~488WH<΀ ~@q R  Bb p*P'(! ,>     BG G!     g   ,Q"%(  D b j D p     ~@ǎ<HHWH<@~DpǐLJ D   p*P  p*P' (. ( <   ~Dǎ@Ǟ<HHW8 ȧ~4p  *        |'Q!R D D p*P%  ' p*P7! ,~488W@8~<p  ( ppPW*P( pp+X*P^*    p*P& ppPW*PVW @  ~<ǎ8@@WP pR*P a!` !WH@~Dq"4 l~Dǎ@HHWH<@~Dr '$~Dǎ@Ǟ<HHWH<0@~Dr 0 (+R a(a( <r NwX   @   "    t  )r!  )a!"  p*P~Dǎ@Ǟ<HHW`DHLPTX~\q  *"(  D   p*P   Ǘ  8 І ρ  ' p*P7! 0 @  0 *>  (|~\ǎXǞTǮPǾLHD``W@48~<p P     Z   & pp+X*P$ ppPW*P2 p*Pr @  ~<ǎ8Ǟ4@@WP.p0>@DH".L @.M.p.@ .DPPW[W![W[W2![W2![WC2!,[W2![pW[X,W ,[,,,W!00[WH .(N0n8@HPX` W`X .(N0n8Ɏ@ɮHPԩة>^觾[![ZW!?[FW [,W2![W,W@8~@ PPWP48<@DH~L>`H>h! >`>`! >h>h>t>`>p>t>|ր>pqpN$>p>| >|x((lx! ( 2>t>`  !(hր>|>tp0qp((q$>t >|sqp'( (&    >tp>|p  P>t! >`!>t xF p>p(P>p>x>p >|>p>|~LǎHǞDǮ@Ǿ<84PPW>p! !>t! >|WP<@DH~Ly   s  Rq(+p#((p(psp>x~LǎHǞDǮ@Ǿ<PPWA~"t0As3r21~W0+K "AC1!WAC$AhAC%hAC&hACWQWPX%AC1QCGxBBSD"vt ('"AC8('p'"$AC4$X$AhAC!FhAC">>>>Ǽ? @P PP?$PpRU*PP?$%py}kg,P?$(VP p:w]ѡ[q" ,?(0?(Rְ?(Fp?@c(stdxX܋ `? d`? P?$([P  ,?(0?(ְ?(`? d`? (P?$[PQ̡P! ! ,?(0?(Pְ?(`? d`? 'Π- 8ы0):@0CAMр ѡ(P?$[P Q фP р}-!ш},?(0?(xְ?(`? d`? / q1Сфыh`? d`? / q1фы4?>?`? csd(u$+\-` d#h.l*x0Āelh%ox0XeEfgGn9ld`?  ?d`? @ ? ? "  !?`d`? }>; -!10>@@ V 8@  /  +!10>"  /  !10> @ /00 0ѡ $@ZPECѡMѡ p? }? u?? ^d`? } pq 5#"0ѡP n b V J@ ? 6@ *?d`? ? ? d`? ? @     0 9: @ ? ?z ?WC01Ћ_D01_D01d`? - ?p&@ 4??  a@ '? -?? pX Oo620>x 0 >>"X>  ??   @ / & ? g `h`? ? 0!#и>0?,@?0ȧN(> >8?0 - >>D  5  + >> >>g ю 0ѡaP? P .aP6 QaP P?P? ׶`?p?8g> 06P?,QPU):RECAaFSRQaVrgaga?,- +aea E`>rvp??? #2#: @ / & ? g `h`? ? 0<#0?,@?0ȧN(>>8?0`? P?,/Q)-0!->! >B +>! >   >! >E00@qA0- '1qA@Aq@ `  .'qF<Ad &$ ? ?A@> QP&#1qA@Aq@?@p?`? #H ? @ & ?  ! ? g `h`? 0#>0?,@?0ȧN(>>8> ?,`?  FF=11=CCAM 0AMAP?,VA@? E@? p?}@>g?d``??  >  ? ??? @>p>>/1,?(0?(ְ?(zkg(P?$(VPp: w q&1,?(0?(<ְ?(@>p>>@ekd,?$( >DA4>,?(0?(>>ְ?( ֠?>/1,?(0?(ְ?(Jkd(P?$(VP@:0D A&1,?(0?(,ְ?(>pTkg(?$( wq( ,?(0?(ְ?(     / ֠?>/1,?(0?(ְ?(Jkd*P?$(VP@<0D A&1,?(0?($ְ?(> fp?p\kg,?$( >wq,>,?(0?(ְ?( ֠??/1,?(0?(lְ?(Jkd*P?$(VP@< D A&1,?(0?(ְ?(H{ p   ?$( @  @ , 2 ! . 00  +   *  p>ؐ>ذ>>>W&P +`(  WP@DH~Lr @D''!' )7H) ~LǎHǞDǮ@PPW2!6[WPHx~Lp(,j~LǎHPPWPHx~Lp(,"~LǎHPPW`?8<@DH~Lp.ޠ??:T 2p? p???p  :X ސ2p ?Jp  C@:8 6p  : @$:@$ 1 P@$`^P5%cR:W^XP'86 0":B0C9"5 4r+!+ @$0:  ?05N?:@ 5p  5 @$0:  ?( ?( ?:?( 0 &009 4 @$05p (  5(T? &1?  &0   9( ~LǎHǞDǮ@Ǿ<8`?`W   ?  ?0 6    W6    WX<@DHLPҧ~TsRNW  ( ( D Z \ pױ*P'(R (> )     ,   aP/\ +! (() )((  ' p*P7! BW  D ,,-V 4 ~TǎPǞLǮHǾD@<XXW0@ A#1 ! 1W @(#)sort.c 6.1 87/11/24 --can't identify output filepath name too long: too many keyscan check only 1 fileallocation error before sort%s/stm%.5uaacan't locate tempstdinallocation error before mergerrwarning: missing NEWLINE added at EOFwarning: missing NEWLINE added at end of input file fatal: record too largesortingrmergingwarning: missing NEWLINE at EOF addedfatal: line too longrdisorder: non-unique: wcan't create wcan't create can't open sort:  $! !! !!! 0 P!!! ! d !!! !(invalid use of command line optionsinvalid use of command line optionsinvalid use of command line optionsread error on stdinwrite error while $P$\B  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`ABCDEFGHIJKLMNOPQRSTUVWXYZ{|}~  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~!p$$$$$$|$x$t$p$l$h$d/usr/tmp/tmpdecnovoctsepaugjuljunmayaprmarfebjan @(#)ctype.c 6.1 87/11/23 ((((( H @(#)mon.c 6.1 87/11/23 PROFDIRmon.out @(#)perror.c 6.1 87/11/23 : Unknown error @(#)data.c 6.1 87/11/23 *P @(#)fgets.c 6.1 87/11/23 @(#)stdiom.h 6.1 87/11/23 @(#)filbuf.c 6.1 87/11/23 @(#)flsbuf.c 6.1 87/11/23 @(#)stdiom.h 6.1 87/11/23 @(#)fopen.c 6.1 87/11/23 @(#)fputs.c 6.1 87/11/23 @(#)stdiom.h 6.1 87/11/23 @(#)setbuf.c 6.1 87/11/23 @(#)sprintf.c 6.1 87/11/23  @(#)errlst.c 6.1 87/11/23 -------..,.@.P.d.x......./// /4/H/\/p///////00040H0d0000001.Error 0Not ownerNo such file or directoryNo such processInterrupted system callI/O errorNo such device or addressArg list too longExec format errorBad file numberNo child processesNo more processesNot enough spacePermission deniedBad addressBlock device requiredDevice busyFile existsCross-device linkNo such deviceNot a directoryIs a directoryInvalid argumentFile table overflowToo many open filesNot a typewriterText file busyFile too largeNo space left on deviceIllegal seekRead-only file systemToo many linksBroken pipeArgument out of domainResult too largeNo message of desired typeIdentifier removedChannel number out of rangeLevel 2 not synchronizedLevel 3 haltedLevel 3 resetLink number out of rangeProtocol driver not attachedNo CSI structure availableLevel 2 haltedDeadlock condition if locked @(#)getenv.c 6.1 87/11/23 @(#)isatty.c 6.1 87/11/23 @(#)malloc.c 6.1 87/11/23 @(#)memccpy.c 6.1 87/11/23 000000000000000000000123456789abcdef0123456789ABCDEF @(#)findiop.c 6.1 87/11/23 @(#)dowrite.c 6.1 87/11/23 @(#)print.h 6.1 87/11/23 @(#)ecvt.c 6.1 87/11/23 Fn CAy7Aׄ@È@Y@$ @(#)fwrite.c 6.1 87/11/23 @(#)stdiom.h 6.1 87/11/23 @(#)memchr.c 6.1 87/11/23 u!^ E$XP.textE .dataPPFP@.bss$X  0  !2$0 P"[WP@D ~Hqސ!*| .~>L nd~6pL*p ( qzp$ wݎ0 $pxv ~HǎDǞ@W  W  WH<@ހ~D   Ljyq~pppx  q~Dǎ@Ǟ<HHW 0!2W8 "~88W@ 1@@W@~   ~<ǎ8@@W8 ȧ~4p T g "Q%(   ~488WH<΀ ~@q R  Bb p '(! ,>     BG G!    g   ,Q"%(  D b j D p     ~@ǎ<HHWH<@~DpǐLJ D   p   p ' (. (   ~Dǎ@Ǟ<HHW8 ȧ~4p  *        |'Q!R D D p %  ' p 7! ,~488W@8~<p  ( ppP 0W ( pp  ^T*    p & ppP 0W W @  ~<ǎ8@@WP pR a!` !WH@~Dq"$ l~Dǎ@HHWH<@~Dr '$~Dǎ@Ǟ<HHWH<0@~Dr 0 (+R a(a( <r NwX   @   "    t  )r!  )a!"P  p ~Dǎ@Ǟ<HHW@~<p.`W .`&0 2  &'~  ~<@@W@\.`P.\(0 2 ԋ . ȓ  @@W@\.`.\|@@W@.` >`#N@@WX@~D.x qώxTP.LH@HU(~Dǎ@XXW[W![W[W2![W2![WC2!,[W[h W  [<  W2![W W@8~ PPWpǼ @P PP$PpRU P$%py}kg,P$(VP p:w]ѡ[q" ,(0(ְ(Fp@c(stdxX܋ ` d` P$([P  ,(0(\ְ(` d` (P$[PQ̡P! ! ,(0(ְ(` d` 'Π- 8ы0):@0CAMр ѡ(P$[P Q фP р}-!ш},(0(ְ(` d` / qxфыh` d` / qфы4` csd(u$+\-` d#h.l*x0Āelh%ox0XeEfgGn9ld`  d` @   "  !`d` }; -!10@@ V 8@  /  +!10"  /  !10 @ /00 0ѡ $@ZPECѡMѡ p } u ^d` } pq 5#"0ѡP n b V J@  6@ *d`   d`  @     0 9: @  z WC0x_D0_D0xd` - p&@ 4  a@ ' - pX Oo620x 0 "X     @ / &  g `h`  0!#и0,@0ȧN(80 - D  5  +  g ю 0ѡaP P .aP6 QaP PP ׶`p8g 06P,QPU):RECAaFSRQaVrgaga,- +aea E`rvp #2#: @ / &  g `h`  0<#0,@0ȧN( 80` P,/Q)-0!-! B +!    ! E00@qA0- '1qA@Aq@ `  .'qF<Ad &$  A@> QP&#1qA@Aq@@p` #H  @ &   !  g `h` 0#0,@0ȧN(8 ,`  FF=11=CCAM 0AMAP,VA@ E@ p}@gd``  >    @p/P,(0(.ְ(zkg(P$(VPp: w q&P,(0(ְ(@p@ekd,$( DA4,(0(dְ( ֠/d,(0(ְ(Jkd(P$(VP@:0D A&d,(0( ְ(pTkg($( wq( ,(0( lְ(     / ֠/d,(0( ְ(Jkd*P$(VP@<0D A&d,(0( ְ( fpp\kg,$( wq,,(0( Lְ( ֠/P,(0( ְ(Jkd*P$(VP@< D A&P,(0( ְ(H{ p   $( @  @ , 2 ! . 00  +    pؐذWhLPTX\`~dpЩ.   Ad!0A!#"(    % %Xh!! . t  * Aߎ ޠ l h  [ h  Aΰl cf[^T!0A!#"(  Xcs [(~(^ *>h^,"~(^ *;^,h    ~dǎ`Ǟ\ǮXǾTPLhhWP8<@DHL~P~P^^^ϞT^^x^:d2pW^Q^ΰ L +!R  ->^Q^\![RQ^ A^P v A0& A 7W(!^Q^.^Q^e E|t^Q^d$! A+ - B!s` T)Z. 2 l.242# .242""7^P l$^PLh(^z ^P~PǎLǞHǮDǾ@<8W`<@DHLP~T~ XcsR[\RP^\*)b!!0#.0A#"( ^\P!+"  nX  c ~TǎPǞLǮHǾD@<``WH<@~Dp^qV  1 ]2 - qR Z -87#@]$*'B2 2# "q q1 ]2~Dǎ@Ǟ<HHWH@~Dp ݰW & !   D 6ހ  @  ٔ (  ! p! !7 R   .   W    ~Dǎ@HHW  (  WP@DH~Lr @D''!' )7 h)L ~LǎHǞDǮ@PPW ! ^ 0(,01  !W2!6[(W2![W`@DHLPT~XP^\0A #"( + "  -^\Q^\ p1@ΐ. ~Hΐ0 Aj0ސ ̈ *ސ ̈:zA@ސ ̈* ސ ̈:zpޠAeΐ. TB 9Ȍ19#59'3( E e 0@ (@@0@ (@@ @+ @-1pA@GDD@>@B*  pA@GDD@0 p,=:yp6p?qq5yq( K ?0@@A@ q5'@sA@  6! #;K;;#\ 2  ~XǎTǞPǮLǾHD@``WPHx~Lp(,j~LǎHPPWPHx~Lp(,"~LǎHPPW`?8<@DH~Lp.ޠ:T 2p pp  :X ސh p  C@:8 6p  : @$:@$ 1 P@$`^P5%cR:W^XP'86 0":B0C9"5 4r+!+ @$0:  ?05N?:@ 5p  5 @$0:  ( ( :( 0 &009 4 @$05p (  5(T &1  &0   9( ~LǎHǞDǮ@Ǿ<8``WP@D~Hr :  .LpL8" :GA5pp!`' pq90A@3 95pL1" P>5p(`pq91A 31906~HǎDǞ@PPW0 1 @4AW   ?  ?0 6    W6    WX<@DHLPҧ~TsRNW  ( ( D J \ pױ '(R (> )װ     ,   aP/\ +! (() )((ľ  ' p 7! BW  D ,,- $ ~TǎPǞLǮHǾD@<XXWA0~: r:2rqrp?5p?:pprq3rp?:ppp:sp2~ǎW0@ A#1 ! 1W @(#)tsort.c 6.1 87/11/24 %s rcannot open %s%sodd datatoo many itemstsort: %s%s cycle in dataprogram error @(#)malloc.c 6.1 87/11/23 @(#)mon.c 6.1 87/11/23 PROFDIRmon.out @(#)perror.c 6.1 87/11/23 : Unknown error @(#)data.c 6.1 87/11/23  @ @ H"82@ @(#)flsbuf.c 6.1 87/11/23 @(#)stdiom.h 6.1 87/11/23 @(#)fopen.c 6.1 87/11/23 @(#)fprintf.c 6.1 87/11/23 @(#)printf.c 6.1 87/11/23 @(#)scanf.c 6.1 87/11/23 BH @(#)errlst.c 6.1 87/11/23 (8L`t0DXhx0Lhx.Error 0Not ownerNo such file or directoryNo such processInterrupted system callI/O errorNo such device or addressArg list too longExec format errorBad file numberNo child processesNo more processesNot enough spacePermission deniedBad addressBlock device requiredDevice busyFile existsCross-device linkNo such deviceNot a directoryIs a directoryInvalid argumentFile table overflowToo many open filesNot a typewriterText file busyFile too largeNo space left on deviceIllegal seekRead-only file systemToo many linksBroken pipeArgument out of domainResult too largeNo message of desired typeIdentifier removedChannel number out of rangeLevel 2 not synchronizedLevel 3 haltedLevel 3 resetLink number out of rangeProtocol driver not attachedNo CSI structure availableLevel 2 haltedDeadlock condition if locked @(#)getenv.c 6.1 87/11/23 @(#)isatty.c 6.1 87/11/23 000000000000000000000123456789abcdef0123456789ABCDEF @(#)doscan.c 6.1 87/11/23 2,2"2"2"2D2D2D2D2D2D2D242D2D2D2D2D2,2D2D2< @(#)filbuf.c 6.1 87/11/23 @(#)findiop.c 6.1 87/11/23 @(#)dowrite.c 6.1 87/11/23 @(#)print.h 6.1 87/11/23 @(#)ungetc.c 6.1 87/11/23 @(#)atof.c 6.1 87/11/23 @(#)ctype.c 6.1 87/11/23 ((((( H @(#)ecvt.c 6.1 87/11/23 Fn CAy7Aׄ@È@Y@$ @(#)ldexp.c 6.1 87/11/23 @(#)memset.c 6.1 87/11/23 @(#)fwrite.c 6.1 87/11/23 @(#)stdiom.h 6.1 87/11/23 @(#)frexp.c 6.1 87/11/23 @(#)memchr.c 6.1 87/11/23 u!a °&uX.text° .dataXX&X@.bss))u@ 0  !2$0 Xv[W`?@DHLP~Tp0 qW- q+q. C@0:)  @$059 3)q0 #"$ .H* C@0:)  @$059 3)q0 #"$ 1 @E @e^q@+@- 0q* qް@KDD@0 1 0P?`ް@!^X^X5[^Xs 50^X6 ^X5#  2 0 ~TǎP ǞLǮHǾD@``W8HH HLL 0X0,$<0`TU<<   ~E<N<   ~XV=8|*==F=88W8=Ȳ 1= ` h=@8 `88W8I88W8 Ȇȋ I88WPH~Lq@`"@ ohoppoxvopHoN="'X |0=8=1=@8tP^(P 0^,LP^(P ?0^,LP^(P @0^,L~2|F ho==o=opophopo \qzq4poq=z 0 d =oX =q8H===8=1=z~LǎHPPWP~<==Zo(# @poo ,$ :qqPq  #pq@"j`qqPq q : @# pq  ohp(4 f = $Pq #H $q=z=q~<PPWH<@~Dր   qP!(qȓ`,pq# Xqض    !Pq #d$q0`&pP zzFttF` o o!!! o o!2!!o==z 1 P=z0 q(@  ~Dǎ@Ǟ<HHWH~DpB <P(| x7vH 0)~DHHWh@~DpqH`2H ؓ> pqȓ  P (!  (! 4 ^ (! (!   0 @(! 0!#(! pW zp&) v&  z"z z  p2$  1)qqPq @< #4 z  zp)   z P zp) &"zp) =$| zp)\%P  Pzp)zz z p! )\  P= zp)qqPq  i fqȋ(    z P zp) &4zp) 8"zp) =0: zp)  !P zp) =zp)6P zp) &zp) =8qqPq  f  iqȋ fH,$hH  . 2ox!H<lH@`qqPq %!0q0 qȆzxqD P.p Ћ p ؋ l . P 8) (P zp2)zz z p) qȧ\qQ ,q%d  `P zp2)zz z p)qȧd \p\ q , nqq8` qȧ`dq`qȋP zzz%d  `qȧdP zp2)zz z p)\qdq<` qȧd\qzdq  &P  zp2$  %1)z"z zp 7!)qqPq  #4j   z  zp) 7h8 zp)\%   z  zp)\ p zwqp)@!07#0#H ! p) qpōpxjVp zwqp)@!02#0% ! p) qpōpHx H!pP P) \  qqPq poqV (ko!ouH&zqqqPq  ,qȋq )HHuqqȋxH$ oouH&z<qqPq  ,qPq!#!wo(\p\o( `)o\H.*:JpHxZ NfHHVp* xz xlop cw@0`vvn~488W8 ȧ~4pq& tq|upRqq&q|qq: bpv u~488W@8~<pv VnJqx N ދq q~<ǎ8@@Wqq=(=(2!(!( <8>qP=q qP=q d ^qP=q8qP=qqqW8ȓzPq+*"qj B@Pq-*"q2 v 88W8ȓȋqP*$q rqP/$qh p>qP%$q4 :v [88W8ȓ\&qq@v q^88W8 ȧ~4qqPq  ?Hq*b p :+@  ~488W8 ȧ~4qqPq Hq- pqq6Pq - q!!!~488WX8~<pv qqPq  # Pq  #p:qP(q) :pqqPq q [ܓqqPq q ]ؓd,&v qqPq  Pqe. Ў q ! qȓ\9Pq 0  q^P 0:B A0:0 109:P0*pώP qrq "-p$Pq #ЋqQ \q n(!  n(! 4Z "(! "(! : bt@ r(! f r(! F tL(Rq*!Bq(!2q)!"q-!qq q"q!qq "xk ,Jj`Tqqȋ Pq +qȋ,Pq -q@&p  @ ؓ  ƋqqPq  (q)p@ p P z >" @ : :q -  p 80 d` rLpJqq]pqqPq q![!pP@- $` ‹N@-pr&\`~ t <:(2~<ǎ8XXW     W !  W0H~Lp z  pf=z 0@ q o PPPoP oNP"29 9 0 4A!րq2(80!P !=BqІ !X@qq =XHq^PX\'0o^(qv=& xzo xe ~LǎHWqqPq   h> !$ q0B! q$# q! q q"0#"' WH<@~Dq&&e6 t~Dǎ@Ǟ<HHW0!>@0@@9 Ћ @a@@f !@! 0 WP@DH~Lpޠv(&df8v(h v(N(v,&dB v(qdtV~LǎHǞDǮ@PPWH<@~D*p  &c HP zzz zDp &c ~Dǎ@Ǟ<HHW@8 2~< p z jP zpz؎4zpU zzpz؎  zpz~<ǎ8@ @W@8~%! ?Qa1H7Rb103Td11Xh1. r .h".h2!.h#p"72(#.h" ' r(9"' ' r(' '0 ` r(3p$#.h r(.h^h% 0#(0<# 0:#N^h% %(0<# ! Nh9$3)$.h02 ǞhgY7Qa1.h"'^h%0P#%o^ >0 p {@##p*\ ' '@o]  )o< o\ '<.h"0#".hX,g$N'0s0#*'#"'7\B hX' V' 'B'ɗ:)  'ɗ:) ! .h^t[.h\ Z^tV.hV H^tX.hT 4^tZ.h] ^tY.hU .h^ .h(0&# z.h9"' ''0s  h 9)' ''0s h 9)' '`' ɗ r' .tR.h,'3).h.'5).h-'4).h/'6).h0# ):5,1 d 0:)  ?0L :*09: 09#!41 ):D@1 'R(p$rh2.p$'  Y.h!.h.h8#  ׋D  h.h:B!.h$#.h"  ( * ' r"1 2"'j V 9"' 'L0 `(3p$#.h"0# ^h% 0# Nn(.h.h"0(200(20 "0# 0Q#.h N#` >h3 c^h%0W#N%212#0.h" \$.h"2C12*$$.h72'0#xP pR%|H7#%05|H.h72BǞh Wr   .h"7W0.h72.h02 t0,Vb J 0X@ְ0X{ 0X 0Tր0(  `( H<0X(0# 0(  ` 0T(,"v( 0( 4$  p04#  pU Z  p"0*|  pr0 0''P p%,  `%Dž04#  p.  p0 `2,  p82  p0"  p04#  p ?0' '(^t.h R --p$r.h"0#F@.hǒd   ` .hrd.h" 0#X.h0~ 21 0dh  h^t R-p$gY)' l%# D%! ?Qa1l&! 7Rb1L&# 3Td1,&' 1Xh1 `1 0".h82 t(p$r.hp$gY)' l%# D%! ?Qa1`&! 7Rb1@&# 3Td1 &' 1Xh1 h.h Lj{^LjT(,ׂv(|4 v a  D$.l{(+ H( = r  `0#  `.h.p>h(# "  `0#  `Nh8p4'#$.h.h82 .h82.h82(,ׂv((0!#ah aj0= q#RR  '  G.hǘ.h .h" 9() 0 `3)p$#rh:.h0 `3 (#  0''.h!.h r.h  zz"   `z `{0W'' \%# <%! ?Qa1H7Rb103Td11Xh1'0#8 P  L {07O  `""  `ǂDzbvP{0^?Qa1`&! 7Rb1@&# 3Td1 &' 1Xh1P z% >֐ `z%!  =s8  ^  `0#2  ` =(# ܓ *0 p {@##p*N& {80 {0LjLj{ ǘ x !W1 ' ' (.h-p$r.h0#!!p""W"ML 9 ?05 '` h0 ` =#D0oh 0  z.h0oxp"#"' '.h0 `3 R(# %Q.h!.h0 `p$#gY)' n%# F%! ?Qa1`&! 7Rb1@&# 3Td1 &' 1Xh120 ` =# oh  `" 9"' '' ɗސ@Xޠ ' ('  t  , ):$(0+R#  > q L  <'  A  . '   ^ ! 9"' '  <a 0# 0'' <0 #0@.h #  T.h0 #  :.h0 #  ".h0` #   ' '$gP{0\?Qa1l&! 7Rb1L&# 3Td1,&' 1Xh1  N' '    R 'J '    9"' '  h!* .h0}#!p""} ' ' z' l   , 9"' ' >' 0'  "   V ':  H 9"' '@   n W%' ^%# >%! ?Qa1H7Rb103Td11Xh1. >$ Z짗 'L  ܧ' '*  "'h1 0.h" 8Ǟh , .h02'0#'.h'>1 0.h"z",D0 p {@##p*F~ ا' '>h,@$ϓgY%' l%# D%! ?Qa1`&! 7Rb1@&# 3Td1 &' 1Xh1>h,@$82# }@'0# {(z"! {(''.h {(', ! 9"' }@' '  ǨP z% z% U0 h =(# F T$ h   h0#  h0 h =(# P  h  D &.h" .hR"0~#6%o 0,W.h"o^h%0#ϥ %.hb^hX5,@$2#" @5,$2.<4(#R 0 8-S.h"z",@.hR" 0#,.   D St  z") PZ^tP 6~dǎ`Ǟ\ǮXǾTPLxxW ! $ 0: W@48~ W(!  a$ w !JZ6 :8E VPw? :H^@ :X: !IEX\Q  ~PǎLǞHǮDǾ@<XXW@8~<=0v( ` !<dbjp P Q $ 0  z@@ =     ~<ǎ8@@WH<@~Dpސu؋"&: qo~Dǎ@Ǟ<HHWH8<@ =s 0~DI 8v,IǘpDp ,HE  @IXq( ( (HEBxpH(( $HE p  HHq( ( HD~Dǎ@Ǟ<Ǯ8HHWA0$~5p~W@8~<q4 " .> q(~<ǎ8@@WH<@~Dq P) ! hv |q  ȎV 8 ! p7  B 870J  x d'0s*1  '0s1  '0s1   ( 0~Dǎ@Ǟ<HHWH< @~Dѐ v$ v;*v1 lN v Av!!! v :"v! zpn(01 GA@  5  (30΋4y 50 5  030qy~Dǎ@Ǟ<HHW8 Ȏ Jv C 8 ȓBbv ̓ 88W@<v< v9J"v!<v!!! = v8"v =@@W0!~@AC$@Bt@ Ht$@BD@~ǎWP?8<@DH~Lq3|3n  ^28007C0 :C1 "07301!~LǎHǞDǮ@Ǿ< 8PPWH<@~Dr2Fq  p0(q!p~Dǎ@Ǟ<HHWXDHLP,~T1( + -0,1 +xvp}Vpא,xp׀,p ( }1p}q}H ~TǎPǞLǮHǾDXXW888Wh48<@DH~LP^dpzz4z,}P)pF^S^`,Ķ}P\}X^p}X}X( 2y*p\p {dz.8R  R$ *\b[P \<F}P,ȋ $<^dP  dPe  ( 2С ѡ y^ ypz1|-pRNy] V  s  ! | s  ! y]q 0 0 #  y)&  ($n {} +R^`Q^`}} }!Sn`(,},Ă*^`Q^`^\Q^\^dPhdPe y09p  Ћ`y\ ,p  8,p> ,y\ b }- (  .v$zH1@9p8n\1pg`$p"dp~LǎHǞDǮ@Ǿ<84hhWH<@~Dp}Xp}`vD' "pp}`<q,Dp}`q~Dǎ@Ǟ<HHWP<@DH~Lp (! "(! p(W $ ` %(q!nq VBp}H4q s! @pq,x&pq,q* ,!, q*,!, ,Ѝqzq <,!, q ,!, ,Ѝq0q s!  ,!, 0q s!  ,!, ,ЍqXpR׵,xץ, *' zFXpR׵,xץ,z *'V z(qN(q4q s! }hq'q &D ( @~LǎHǞDǮ@Ǿ<PPW ,N  ,,W 0: 2WH.@! 0:@ ?04 @HHWH.@  0:@ ?03 @HHWX@DH~Lr: 2  P: 2''8^P4%6: (*6.P P5):4 ~LǎHǞDǮ@XXW~ C?s@   @ ? 15"@?P '5B`@"7pwۅ3F5B`@6;p&nӈ3F5B`@/ip*3F5B5@`@/Np43b5bހ@PVސv O3h5bހ@XIސ5 j3h5bހ@Gސ{b3h6F4 06 ޠ?!ްTD-2 ?03 @?P46ޠ?!ްTD- 15"@?P '5B`@"7pwۅ3F5B`@6;p&nӈ3F5B`@/ip*3F5B5@`@/Np43b5bހ@PVސv O3h5bހ@XIސ5 j3h5bހ@Gސ{b3h6F43 ɮ Ɏ~W0: R@P:@@@?!TD- 8 .41>0?!TD-H0D2 8^! 8BP?!TD-8$ 8  @A@`~詮@?!@@?!@7@'$@Q4B?_0@5` `pPg194ޠ 0940p pg΀ٍ@ @55333p?x8194.ЩN HYB0D9DB40x.N343ހph؋n.ٍ@5Hٍ@m@35(3B3J3ހ?!ސTD-5 15"A LA`:4pC 5bހ@ސq3h5bހ ސ炗3h5b5`ހ@eqސa m35ޠ@/cް`p35ޠA"شްm36h3" ,"0~ɎɮWpPTD-4@\"`\Tdp5bހ@ܢސTb3h5bހ}ސa3h5bހ@`+Kސ-35ޠ@pްq335ޠA}ް36h?3Z@P:BN8 p.45>0H0 ,t 5:"N@@,PW 5 4Ƌ 0 08 80@(@:00~7@'D 14$`?Gp@5F1d9v4Gp?Gހ@5'p>ހ 533@$55"? \ 5p@43ހww35p@tހs35@@m%P3B5$@@P߰3$4 6 ?03a 0H0d"@,؆@@(PW 3X 3B0@00|@P:@@,ا8 .43>0H0 Ž"@,؆@@,PW 2 2.  ~ x,0 #0#0 0? 0?@ω?:000?@30P?`460A53PD`9}5Sp@baހ)T3W5Sp ހe3W5S5Pp!Ւހe&3s5sސ@3ޠ_e3y5sސ( 1ޠT@3y6W3@@P59"@?.BP95$3~ɞW0@@30P@`46!F ! l8 .41>0H0  1 !PW8 .42>0H0  0!:02: 0pPW, 0<,PW1  @ABj~詮@?!B@?!B7@'$@Q4B?_0@5` `pPg194ޠ 0940p pg΀ٍX X55333p?x8194.ЩN HYB0D9DB40x.N343ހph؋n.ٍX5HٍXmX35(3B3J3ހ?!ސTD-5 15"A LA`:4pC 5bހ@ސq3h5bހ ސ炗3h5b5`ހ@eqސa m35ޠ@/cް`p35ޠA"شްm36h3" ,"<~ɎɮWrPTD-4Bxb `V"`\Tdp5bހ@ܢސTb3h5bހ}ސa3h5bހ@`+Kސ-35ޠ@pްq335ޠA}ް36h?3N@P:BN8 .45>0H02, -L"N@@,PW - ,~ x,0 #ς   p/p%`q7?%>թW#&#@')63@6`3`d?栞f;5`Uspp~ɎW ! W1>0Pا^48H0  +!HPW !~Ä+40"9BK,\(1 # Ѐ     x,0 #0#0 0? 0?@ω?:000?@30P?`460A53PD`9}5Sp@baހ)T3W5Sp ހe3W5S5Pp!Ւހe&3s5sސ@3ޠ_e3y5sސ( 1ޠT@3y6W3@@P59"@?.BP95$30@@30P@`46!T  ~ɎɮW8 .41>0H0  *!P ~ɎɮW8 .42>0H0 )!J0D: )pP ~ɎɮW, )*,P ~ɎɮW5  0 0@0@:00H7@'D 14$`?Gp@5F1d9v4Gp?Gހ@5'p>ހ 533@$55"? \ 5p@43ހww35p@tހs35@@m%P3B5$@@P߰3$4 6 ?03a %P R% R"QUPpp  ! ! $PˀR"PpQp_p_qq !  @P,.Q,OPpQp_p_qq P !P%: % P Pp_pVqq Ph%     ~ɎɮW0 # @P:@@,8 X.44>0H0*"@,@*@<P ~ɎɮWv & \ %@P:@@,8 X.43>0H0~"@,@.@@P ~ɎɮWv %Z\ %DWWH@~Dpq' ~Dǎ@HHW80Z88Wp [BP@D~Hr :  .L$`pL8":GA5pp!`' pq90A@3 95pL1"P>5p(`pq91A 31906~HǎDǞ@PPWP48<@DH~L,H,! ,,! ,,-,--- ր-qpN$--  - x((lx! ( 2-,  !(hր-  -p0qp((q$- - sqp'( (& 4    -p- p  P-! ,!- xF p-(P--- - -- ~LǎHǞDǮ@Ǿ<84PPW-! !-! - WP<@DH~Ly   s  Rq(+p#X((p(psp-~LǎHǞDǮ@Ǿ<PPW0+K "AC1!WAC$AhAC%hAC&hACWQWPX%AC1QCGxBBSD"vt ('"AC8('p'"$AC4$X$AhAC!FhAC"~TǎPǞLǮHǾD@XXWH@~D p pph^ T"D0  (!~Dǎ@HHWWANm09c Wp  $Wpǀǐ Ǡǰ $WW!1021!0W!2! W!21!0W! W2!10B!0 W2!@4(ARQ!P4AQW!120WX?@DHLP~Tr8     *8  ' p87! ` ?  ~TǎPǞLǮHǾD@XXWH@~Dp W & !   D 6ހ8  @  H(  ! p!8!7 R   .   W    ~Dǎ@HHW8 ȧ~4p8.qH(~488W@8~<pp ~W  < r   ~<ǎ8@@W8 ȧ~4p T g "Q%(   ~488WH<΀ ~@q R  Bb p8'(! ,>     BG G!    g   ,Q"%(  D b j D p     ~@ǎ<HHWH<@~DpǐLJ D   p8  p8' (. (,   ~Dǎ@Ǟ<HHW8 ȧ~4p  *        |'Q!R D D p8%  ' p87! ,~488W@8~<p  ( ppP}W8( pp@8^ꔧ*    p8& ppP}W8ֆW @  ~<ǎ8@@WP pR8 a!` !WH@~Dq! l~Dǎ@HHWH<@~Dr '$~Dǎ@Ǟ<HHWH<0@~Dr 0 (+R a(a( <r NwX   @   "     t  )r!  )a!" 8  p8~Dǎ@Ǟ<HHW@~<p.`W .`&0 2  &'   ~<@@W`DHLPTX~\q  *"(  D    p8   Ǘ  8 NІ ρ  ' p87! (0 @ p 0 *>  (~\ǎXǞTǮPǾLHD``Wh?HLPTX`~\   r `d rd `p- -s\t.(r p . " ' ( <F   p-  F~\ǎXǞTǮPǾLHhhWP8<@D~Hq p߁-L8    Lp-L~HǎDǞ@Ǯ<Ǿ8PPW@\.`PT.\(0 2 T . HT  @@WX?@DHLP~T`T 2PP&L.H$D H Upס8 H  րLq 7|xHHLLH   HUp80L!HBL*!T D H  ~TǎPǞLǮHǾD@XXW@48~<p P     Z   & pp@8$ ppP}W82 p8 @  ~<ǎ8Ǟ4@@WP.p0>@DH".L @.M.p.@.DPPW!![ݢW[ݐW![rW. >$.;0X[FW[B2!>[ W[ W![ W[W2![ܼW2![ܠW*[܊.WC2!,[W2![HW[0@W @[@@W!00[WH .(N0n8@HPX` W`X .(N0n8Ɏ@ɮHPԩة>^觾[![2W [W[. W2![WA0~: r:2rqrp?5p?:pprq3rp?:ppp:sp2~ǎW@8~( PPWA~"t0As3r21~Wp.....Ǽ/ @P PP/$PpRU8P/$%py}kg,P/$(VP p:w]ѡ[q" ,/(0/(Zְ/(Fp/@c(stdxX܋ `/ d`/ P/$([P  ,/(0/(ְ/(`/ d`/ (P/$[PQ̡P! ! ,/(0/(Xְ/(`/ d`/ 'Π- 8ы0):@0CAMр ѡ(P/$[P Q фP р}-!ш},/(0/(ְ/(`/ d`/ / q!`фыh`/ d`/ / q!pфы4/./`/ csd(u$+\-` d#h.l*x0Āelh%ox0XeEfgGn9ld`/  /d`/ @ / / "  !/`d`/ }.; -!10.@@ V 8@  /  +!10."  /  !10. @ /00 0ѡ $@ZPECѡMѡ p/ }/ u// ^d`/ } pq 5#"0ѡP n b V J@ / 6@ */d`/ / / d`/ / @     0 9: @ / /z /WC0!`_D0!p_D0!`d`/ - /p&@ 4//  a@ '/ -// pX Oo620.x 0 .."X.  //   @ / & / g `h`/ / 0!#и.0/,@/0ȧN(. .8/0 - ..D  5  + .. ..g ю 0ѡaP/ P .aP6 QaP P/P/ ׶`/p/8g. 06P/,QPU):RECAaFSRQaVrgaga/,- +aea E`.rvp/// #2#: @ / & / g `h`/ / 0<#0/,@/0ȧN(. .8/0`/ P/,/Q)-0!-.! .B +.! .   .! .E00@qA0- '1qA@Aq@ `  .'qF<Ad &$ / /A@> QP&#1qA@Aq@/@p/`/ #H / @ & /  ! / g `h`/ 0#.0/,@/0ȧN(..8. /,`/  FF=11=CCAM 0AMAP/,VA@/ E@/ p/}@.g/d``//  >  / /// @.p../!8,/(0/(ְ/(zkg(P/$(VPp: w q&!8,/(0/(Dְ/(@.p..@ekd,/$( .DA4.,/(0/(..ְ/( ֠/./!L,/(0/(ְ/(Jkd(P/$(VP@:0D A&!L,/(0/(4ְ/(.pTkg(/$( wq( ,/(0/(ְ/(     / ֠/./!L,/(0/(ְ/(Jkd*P/$(VP@<0D A&!L,/(0/(,ְ/(. fp/p\kg,/$( .wq,.,/(0/(ְ/( ֠///!8,/(0/(tְ/(Jkd*P/$(VP@< D A&!8,/(0/(ְ/(H{ p   /$( @  ߦ@ , 2 ! . 00  +    p.ؐ.ذ...WH<@~Dp   p8a(^a( 2r w4    ( "   0+       ~Dǎ@Ǟ<HHW8 H(  WP@DH~Lr @D''!'݆ )7H) ~LǎHǞDǮ@PPW2!6[WPHx~Lp(,j~LǎHPPWPHx~Lp(,"~LǎHPPW`?8<@DH~Lp.ޠ//:T 2p/ p///p  :X ސ"  /Jp  C@:8 6p  : @$:@$ 1 P@$`^P5%cR:W^XP'86 0":B0C9"5 4r+!+ @$0:  ?05N?:@ 5p  5 @$0:  /( /( /:/( 0 &009 4 @$05p (  5(T/ &1/  &0   9( ~LǎHǞDǮ@Ǿ<8`/`W   ?  ?0 6    W6    WX<@DHLPҧ~TsRNW  ( ( D  \ pױ8'(R (> )     ,՞   aP/\ +! (() )((Ŧ  ' p87! רBW  D ,,-V  ~TǎPǞLǮHǾD@<XXW0@ A#1 ! 1W @(#)atof.c 6.1 87/11/24 @(#)bs.c 6.1 87/11/24 r ready /dev/ttyFloating exceptionBad graph outputPipe closedwwputrgetrCannot open %s puterrbs exitOut of code spaceInvalid expression!Invalid expression-csh/bin/shCannot forkl ^hhnh ( @|rFor?Else: no ifFi: no ifed %sibase/obase must be 8, 10, or 16Next: no forNo forFunc def.Nested `include'sCannot open fileMissing filenameName Required??Unbal. quoteExpressionReserved Name in ExpressionArg. countSubscript on local name%s: Source line %d: %s %s%s^| Dup. labelToo many labelsSymbol table overflowWrong delimiterTable too bigTable overflow288X;564444446D6D6D6D6D6D7T8<8$>KK:082223$;3>>HBB>P>H> >p@B|:;=LBCHEHFC$GGHlDtDExEG\GH$I\I|IKK(fbpcdArgOpen function, if, or for<%.6s> name contextNo labelOnly single dim. tablesSubscriptSubscr. rangeRangeNo labelStack overRecursionUndefined function Return: Too many args%d: %.16s ReturnTable: allocated namearg not tableStatement: %d Function stack: %.6s%s[%s]=%s %.6s=%s Compiler %s - execution error in source line %d%s[%d]%s=%s ConversionI/O%lx%lo%.10fOut of string spaceCannot access fileLast arg to open() must be r, w, or a , ) , %d: %.6s(%.20s%.20sIllegal graph functiongraph: arg countGraphic output never specifiedgraph: Bad dest.Dot not implementedwNo plot! t x  p   l   h      d    ` \    &8=>$''()27436#?!9015;./@ X$,4<DLT\dlt| T   P L H D @lkoXrxkXkxtw8zh=={@@ =q= etlcamnpfs??sinlogabsexpcoskeyargnuffunrunforqfiifelseelifgotoexitreturnfreturnnextwhiledumptraceonintrclearbreakcontinuecompileexecutestopincludeibaseobaseeditnargrandevalformatlastsubstrindextranssizeopencloseaccessftypematchmstringplottableitemiskeyatanceilfloorsqrttplot -TXXXXXXXXXXX @(#)string.c 6.1 87/11/24 RE errorgjgdj`jhgjLjhgjxjijjjjgjgjh @ @(#)fabs.c 6.1 87/11/23 @(#)floor.c 6.1 87/11/23 @(#)fmod.c 6.1 87/11/23 atanatan: DOMAIN error atan: input value was NAN atan: input value was INF ?_0@>v@<);_@9SL8@coscos: TLOSS error cos: input value was NAN cos: input value was INF expexp: input value was NAN exp: input value was INF loglog: SING error log: DOMAIN error log: input value was NAN log: input value was INF ?_0@>v@<);_@9SL8@sinsin: TLOSS error sin: input value was NAN sin: input value was INF sqrtsqrt: DOMAIN error powpow: SING error pow: DOMAIN error pow: input value was NAN pow: input value was INF powpow: input value was NAN pow: input value was INF @(#)matherr.c 6.1 87/11/23 @(#)calloc.c 6.1 87/11/23 @(#)ctype.c 6.1 87/11/23 ((((( H @(#)ldexp.c 6.1 87/11/23 @(#)malloc.c 6.1 87/11/23 @(#)memset.c 6.1 87/11/23 @(#)modf.c 6.1 87/11/23 @(#)mon.c 6.1 87/11/23 PROFDIRmon.out @(#)perror.c 6.1 87/11/23 : Unknown error @(#)rand.c 6.1 87/11/23  @(#)data.c 6.1 87/11/23 }}}8 @(#)fgets.c 6.1 87/11/23 @(#)stdiom.h 6.1 87/11/23 @(#)filbuf.c 6.1 87/11/23 @(#)flsbuf.c 6.1 87/11/23 @(#)stdiom.h 6.1 87/11/23 @(#)fopen.c 6.1 87/11/23 @(#)fprintf.c 6.1 87/11/23 @(#)fputs.c 6.1 87/11/23 @(#)stdiom.h 6.1 87/11/23 @(#)popen.c 6.1 87/11/23 -csh/bin/sh @(#)printf.c 6.1 87/11/23 @(#)puts.c 6.1 87/11/23 @(#)stdiom.h 6.1 87/11/23 @(#)setbuf.c 6.1 87/11/23 @(#)sprintf.c 6.1 87/11/23  @(#)errlst.c 6.1 87/11/23 (0<Xh0<T`l 8H`p|   0 L l  .Error 0Not ownerNo such file or directoryNo such processInterrupted system callI/O errorNo such device or addressArg list too longExec format errorBad file numberNo child processesNo more processesNot enough spacePermission deniedBad addressBlock device requiredDevice busyFile existsCross-device linkNo such deviceNot a directoryIs a directoryInvalid argumentFile table overflowToo many open filesNot a typewriterText file busyFile too largeNo space left on deviceIllegal seekRead-only file systemToo many linksBroken pipeArgument out of domainResult too largeNo message of desired typeIdentifier removedChannel number out of rangeLevel 2 not synchronizedLevel 3 haltedLevel 3 resetLink number out of rangeProtocol driver not attachedNo CSI structure availableLevel 2 haltedDeadlock condition if locked @(#)frexp.c 6.1 87/11/23 @(#)getenv.c 6.1 87/11/23 @(#)isatty.c 6.1 87/11/23 @(#)memccpy.c 6.1 87/11/23 000000000000000000000123456789abcdef0123456789ABCDEF @(#)fdopen.c 6.1 87/11/23 @(#)findiop.c 6.1 87/11/23 @(#)dowrite.c 6.1 87/11/23 @(#)print.h 6.1 87/11/23 @(#)ecvt.c 6.1 87/11/23 Fn CAy7Aׄ@È@Y@$ @(#)fwrite.c 6.1 87/11/23 @(#)stdiom.h 6.1 87/11/23 @(#)memchr.c 6.1 87/11/23 u!0I i#$ h.texti .data h h#jh@.bss--$"` 0  !2$0  h^3B[Wh<@DHLP~TqPp^d^`p\^dn\XQ^d'p!`nXp !p -^dn\Q^dp*p"'"!p׋-A"- J2& :Fp!'"(^dn\Q^dp*p"'"!-k(`nXQQ^`p*p"'"!\! ndjnXp p '$`nd ~TǎPǞLǮHǾD@<hhW8/   88W&0   WH@~Dp@:h!'"0.#X F!J " r6 c!.p W (7H/~Dǎ@HHWh@DHLPT~Xqް[Q^`P%^\jXn`  #!@  x, A!$p W0 0 >0( ȓP0( Г`0 > ,ؓGL. 0(! ( 0(! 2 z r(! 0a#(! p W00Г>& ݋ʋ08ؓ= ݋0@X= ݋j0H(|= ݋:0Px=f ݋ 0Xt=6 ݋ڋ0`p= ݋0hhl< ݋z0p8h< ݋J0x dp W 7 7h0P7P47B 7<77lD67HL6֋7$T6z@7@\6Vp6pd6j26 6F6l6"6pt5 6L 5ڋ 6B64  )v)0?p10( 9 (!>%ndj!`>nthThܓ>.4`0 0 Г40H+0H00 +Fl0  sF0` 0 0P  0 ^0 <0 &00 )=$H0(00 +L0(+xg`0p0  0  \"00  0 RpH00  0,00  08n0(+֋0 30  j0  j(! 0b#(! p W0`00   ؓ0`  0 Гn0`00   ̓H0`00   ȓv$ 0 H:"2$ 0 `:"0 10  D(!  D(! D 1(!  1(! p 2 ` 4x F(! z F(!  H  v(! N0b#(! Bp HW0X00   ē H2$0X00   0X  0 X0X  0 0X00   t0X  0 hR 0 0X00 + :$ 0 x8$ 0 8ҋ0P+ VPn0x + *T0x + 0x 0  "000 0+ Z.\T!!~XǎTǞPǮLǾHD@hhW@8~<pq 9999~9t9\9R9:)8> 2l † ~<ǎ8@@W R0F`:."@-@-(!@ !0@ 6f@ W8 H+88W8 ȧ~4ppp00p08p0@np0H\p0(Jp0P8p0X&p0`p0xp0hp0pp0p0p0ж000p 08pP0@p0@p0Pp0Xp0`p@0hpp0pp  0xp 0Hp0(p(0p00p80p@0p~488WH@ ~Dq QP~XQ -%2RX΀aXs&PQ XL1 F!̐  s a!pW  x P 8t@ \L `$ 8|ԋ`P t@0 X8 0XT(/!p"Xg~Dǎ@HHW* . W8- 'B88W@~<pD, &"'.~<@@W@~<p/% ~<@@W@8~<p r%%D .!q~<ǎ8@@W@8~X)0 X)0@p~LǎHǞDǮ@Ǿ<PPWH~@p"  (,D+z DQ $R!0(XD~@HsHW8 88W8 *88W@j00 *XtX dVVf@@W@~<08 pXX X0 f X0 f00q~<@@W@~<0@ pXX X0 f,X0 f00q~<@@W@JH>0H XX0 f`020 @@WH@~D&0X <PQPPXr0( TP:JX sX sXXp fXȋ0fq0~Dǎ@HHW@~p$*aP/R0*aP/Rq XqHa( z(   ы  p  ~Dǎ@ Ǟ<HHWX?@DHLP~Tp.r. b 0 . p$. . ..p  ċ 00p0. p q.  ( ^  ! 01'q2! 'q/  !' :Gq21304!:'q.(,/ (. .  . P.q9(9#0@@5601 0. .) ~TǎPǞLǮHǾD@XXWH@~Dx#@pX pp"  T"    P! ~Dǎ@HHW!1021!0W !  W!2! W!21!0W! W!120W@ 8~< .xp R q 2 pPP.x.x~<ǎ8@@W8 ȧ~4p.q!(~488W@8~<pp ~W  < r ^x x ~<ǎ8@@W8 ȧ~4p T g "Q%(   ~488WH<΀ ~@q R  Bb p '(! ,>     BG G!    g   ,Q"%(  D b j D p     ~@ǎ<HHWH<@~DpǐLJ D   p   p ' (. (l   ~Dǎ@Ǟ<HHW8 ȧ~4p  *        |'Q!R D D p %  ' p 7! ,~488W@8~<p  ( ppP0W ( pp! ^D*    p & ppP0W nW @  ~<ǎ8@@WP pR a!` !WH@~Dq< l~Dǎ@HHWH<@~Dr '$~Dǎ@Ǟ<HHWH<0@~Dr 0 (+R a(a( <r NwX   @   "   2 t  )r!  )a!"  p ~Dǎ@Ǟ<HHW@~<p.`W .`&0 2  &'.  ~<@@WP.p0>@DH".L @.M.p.@.DPPW!![ W[W![W!;0 h[W[ 䦆W[W! [W2![lW2![PWC2!,[W2![ W["`W "`["`"`W!00[WH .(N0n8@HPX` W`X .(N0n8Ɏ@ɮHPԩة>^觾[ [ W[. W2![W@8~0 PPW. $!@R!PEP @W!@@2S1P EWp.....Ǽ/ @P PP/$PpRU P/$%py}kg,P/$(VP p:w]ѡ[q" ,/(0/(Rְ/(Fp/@c(stdxX܋ `/ d`/ P/$([P  ,/(0/(ְ/(`/ d`/ (P/$[PQ̡P! ! ,/(0/(Pְ/(`/ d`/ 'Π- 8ы0):@0CAMр ѡ(P/$[P Q фP р}-!ш},/(0/(xְ/(`/ d`/ / q'@фыh`/ d`/ / q'Pфы4/./`/ csd(u$+\-` d#h.l*x0Āelh%ox0XeEfgGn9ld`/  /d`/ @ / / "  !/`d`/ }.; -!10.@@ V 8@  /  +!10."  /  !10. @ /00 0ѡ $@ZPECѡMѡ p/ }/ u// ^d`/ } pq 5#"0ѡP n b V J@ / 6@ */d`/ / / d`/ / @     0 9: @ / /z /WC0'@_D0'P_D0'@d`/ - /p&@ 4//  a@ '/ -// pX Oo620.x 0 .."X.  //   @ / & / g `h`/ / 0!#и.0/,@/0ȧN(. .8/0 - ..D  5  + .. ..g ю 0ѡaP/ P .aP6 QaP P/P/ ׶`/p/8g. 06P/,QPU):RECAaFSRQaVrgaga/,- +aea E`.rvp/// #2#: @ / & / g `h`/ / 0<#0/,@/0ȧN(..8/0`/ P/,/Q)-0!-.! .B +.! .   .! .E00@qA0- '1qA@Aq@ `  .'qF<Ad &$ / /A@> QP&#1qA@Aq@/@p/`/ #H / @ & /  ! / g `h`/ 0#.0/,@/0ȧN(..8. /,`/  FF=11=CCAM 0AMAP/,VA@/ E@/ p/}@.g/d``//  >  / /// @.p../',/(0/(ְ/(zkg(P/$(VPp: w q&',/(0/(<ְ/(@.p..@ekd,/$( .DA4.,/(0/(..ְ/( ֠/./',,/(0/(ְ/(Jkd(P/$(VP@:0D A&',,/(0/(,ְ/(.pTkg(/$( wq( ,/(0/(ְ/(     / ֠/./',,/(0/(ְ/(Jkd*P/$(VP@<0D A&',,/(0/($ְ/(. fp/p\kg,/$( .wq,.,/(0/(ְ/( ֠///',/(0/(lְ/(Jkd*P/$(VP@< D A&',/(0/(ְ/(H{ p   /$( @  @ , 2 ! . 00  +   "  p.ؐ.ذ...W !(  WP@DH~Lr @D''!' )7H)$ ~LǎHǞDǮ@PPW2!6[ΰWPHx~Lp(,j~LǎHPPWPHx~Lp(,"~LǎHPPW`?8<@DH~Lp.ޠ//:T 2p/ p///p  :X ސ' /Jp  C@:8 6p  : @$:@$ 1 P@$`^P5%cR:W^XP'86 0":B0C9"5 4r+!+ @$0:  ?05N?:@ 5p  5 @$0:  /( /( /:/( 0 &009 4 @$05p (  5(T/ &1/  &0   9( ~LǎHǞDǮ@Ǿ<8`/`W   ?  ?0 6    W6    WX<@DHLPҧ~TsRNW  ( ( D R \ pױ '(R (> )(     ,   aP/\ +! (() )((Ѷ  ' p 7! BW  D ,,-V , ~TǎPǞLǮHǾD@<XXW0@ A#1 ! 1W @(#)driver.c 5.4 87/12/29 illegal option: %s  >  >> >>>>>> > '-%c %s': Illegal name for output file ,(lH(L(xH LH48h8@8d$T4 @ 0 0 0 0 0 0 0 h 0 0 0 0  0 ( 0 P 0 0 0 0 0  0 0 x  0< < X <<<<< << 4 TRx D            bL--f-n-----n---L-Lcdb-lg-lz-z--T /ld/as/m4,,, , , , , , , , , , , , , , , , , , , , , , , , , , , , , - a:cgkl:mo:prstu:vwxA:B:CD:EF:I:L:MOPST:U:VW:X:Y:Z:#-X1004-X1004old style -W option, compilation aborted illegal option -W%c illegal option -T%c /ratfor/efl/cpp/ccom/fcom/pcom/peep/crt0.o/mcrt0.o/compXXXXXX%s%s/compXXXXXXillegal option -Y%c -E, and -P are mutually exclusive -E, and -P are mutually exclusive illegal option -%c%s /usr/lib/libcdb.a/lib/libp/usr/lib/libpillegal option -A%s illegal option -A%s illegal option -B%s illegal option -B%s %s%dsystem=unix(X(0((X((((((All options must come before file names, %s ignored %s: Warning: unknown suffix '.%c', file '%s' ignored rrError: Cannot read file %s %s w > %s Cannot exec %s Cannot fork %s Fatal error during load. Fatal error in file %s. bad wait codeTermination code %d -P-a-h-E-a-h-E-a-h-L-l-l-l-l-l-L-l-l-l-l-l-l-\-l-l-o-F-P-C-d11%s: Internal error -oTrying to load %s more than once pcrpf77rf-o%s: can't open %s %s: can't open %s %s: bad file copy from %s to %s da.out/usr/bin/m4/usr/bin/ratfor/usr/bin/efl/lib/cpp/lib/ccom/lib/fcom/lib/pcom/lib/peep/bin/as/lib/mcrt0.o/lib/crt0.o-lc-lm-lF77-lI77-lpc/bin/ld`/tmp/compXXXXXX @(#)atoi.c 6.1 87/11/23 @(#)calloc.c 6.1 87/11/23 @(#)ctype.c 6.1 87/11/23 ((((( H @(#)getopt.c 6.1 87/11/23 --: illegal option -- : illegal option -- : option requires an argument -- : option requires an argument --  @(#)malloc.c 6.1 87/11/23 @(#)memset.c 6.1 87/11/23 @(#)mktemp.c 6.1 87/11/23 @(#)mon.c 6.1 87/11/23 PROFDIRmon.out @(#)perror.c 6.1 87/11/23 : Unknown error @(#)strtok.c 6.1 87/11/23 @(#)data.c 6.1 87/11/23 0002B @(#)flsbuf.c 6.1 87/11/23 @(#)stdiom.h 6.1 87/11/23 @(#)fopen.c 6.1 87/11/23 @(#)fprintf.c 6.1 87/11/23 @(#)sprintf.c 6.1 87/11/23 R @(#)errlst.c 6.1 87/11/23 #H#P#\#x######$$$($<$P$\$t$$$$$$$$% % %0%@%X%h%%%%%%%&&0&@&P&l&&&.Error 0Not ownerNo such file or directoryNo such processInterrupted system callI/O errorNo such device or addressArg list too longExec format errorBad file numberNo child processesNo more processesNot enough spacePermission deniedBad addressBlock device requiredDevice busyFile existsCross-device linkNo such deviceNot a directoryIs a directoryInvalid argumentFile table overflowToo many open filesNot a typewriterText file busyFile too largeNo space left on deviceIllegal seekRead-only file systemToo many linksBroken pipeArgument out of domainResult too largeNo message of desired typeIdentifier removedChannel number out of rangeLevel 2 not synchronizedLevel 3 haltedLevel 3 resetLink number out of rangeProtocol driver not attachedNo CSI structure availableLevel 2 haltedDeadlock condition if locked @(#)getenv.c 6.1 87/11/23 @(#)isatty.c 6.1 87/11/23 000000000000000000000123456789abcdef0123456789ABCDEF @(#)findiop.c 6.1 87/11/23 @(#)dowrite.c 6.1 87/11/23 @(#)print.h 6.1 87/11/23 @(#)ecvt.c 6.1 87/11/23 Fn CAy7Aׄ@È@Y@$ @(#)fwrite.c 6.1 87/11/23 @(#)stdiom.h 6.1 87/11/23 @(#)memchr.c 6.1 87/11/23 u!g 1PnH.text .data1P@.bss66nH@ 0  !2$0 "1z[WH@~DqXpYP S ?!pW v a!pHW X Xn XRl  X6P((>00* 4W88R1@R"@ 488H HH HzH HdH HP8H H$H Hz ?PP #XX \Vf``^5h&'0hO$h \``pp((hxP$ pM  @ .r 0#-pq !L4j(L"0*"~Dǎ@HHW`D~HPTXpȧ\68 HKh<(MF0>0J $0 H"N HRb*'bQ!P0 Q%LU.LRQ! *%  XXLHP8P Pp%n  XxLNHT8T Tt%  XLxHX8X Xx$  XKH\8\ \|$  XKdnP`$^\P% Q\90 2'PTX \~XQ %Q0\Q%0^fPQ%QBTQ%*  X     8!0P&0@:8(90?z@G{55F::P&0@:(90?z@G{55F:Pz zz% ` \8 4 B P &0@:05F9: `P"  ? 8 P&0@:$91965F:"0 !K$ 0(@@91H3H91P3P91X3X91`3`091h3h891p3p&~HǎD``WH !0H~DG pq0F:pH!HzHKPPp~DHHW@XFtX ܓF\HX (F8H 4X0 8FX@ HEH  XP ؓEHXX ԓEH X` hEHXp xE`XГENXE<H:X ̓EX ȓEX ؓDH 4X DX ȓDH  X  DzHX   DVH X   D.HX ( ēD X 0CXCX<@@Wh~DppȆPH 6 &H H5H 5X L.HCHp H5H ?X T.HC'X `BWz z   DX hB  X p*B  X x*Bh9B1?z G{51X #4B8Hj9B1?z G{51X #4A9B1?z G{51X #4A̋69B1?z G{51X #4AH " 008X AhH  ,099361X #4A0H,099361X #4@H ,91962!X @H49B1?5g 51X #4@'7X ̓@dX @@R~DhhWX~HpTP^T .L>P^(F  jP<TLTTT0~HXXWH 1N?~8p A!? !? |~8HHW@~<pxp ~<@@WPDH~Lp( 2@!X >@9H0?z@G{52!6(X >hP0X3x@9x0?z@G{52!6(X (> @9P0?z@G{52!6(X 4=@9X0?z@G{52!6(X D=@0h961X P#4=@0p961X `#4=l0Px61X l#4=H0xH61X |#4=$X =X <l~LǎHǞDPPWxXDz h <N 8EB h ȓ!@$$R!@0B 9 'qLB'q1LC32'qС'q@,B'qMB *!N , +  {,D(80(8ϑ !#D # !#1q !! 'q# 0!@}$ 0! 9)*!@}$ , 'q ,01 }q !4r0q '0 #!0q @! <"  <! ( + q !q !q !!1@^487t0-0!,8@]4 q71!7q!A0]C*'q02'q~LǎHǞDǮ@Ǿ<84W  W W ( WX<@DHLP~T.x q@000A1J.x@ސް8 0p0:(10AJ   ~TǎPǞLǮHǾD@<XXWH8< @~DyPPP(P ,p  d' ! >PPP(P pZq HPPP(PL pq ~Dǎ@Ǟ<Ǯ8HHWX<@DH ~Lr (! ((! pXW G(! 0(#(! pW'q^xq f`PqJ<p  *(PTҋp P!P ""qT!T 8PT(>*q RP!P *qT!T TqPT(΋q P!P qT!T TqZ !(PTZ((q0R# ^P!P "(q0R#VT!T Tqq!q pqpq(p!Ћvq fq 'q! >(qp p z"d7(qR! !00 q qp$  (~LǎHǞDǮ@Ǿ<XXWA2  !~  vp@tPp@G@ `p@ At p@ AG :"p@ At !B V~WH@~Dq(0/2qq~Dǎ@HHW4(( 0( W0"@ $#@ BN  #W~pA!0r1!s30 ~WH<@ހ ~Dp9؋   xz9 9(ד *  8 92$(99 ~Dǎ@Ǟ<HHW8$ 88WP<@D~Hp, 0LLpǀ1'2בסz8H@80(L LLp  ~HǎDǞ@Ǯ<PPW :"4 mn2"'W Q!Q Q 0<; # ;; p';JF" 4#  m  n 4#  m  n!0F 4# m n$;; mn nT P2$21  T;ܶ;;;W@8; ȧ~<2!0!!1;A!42A!4"1#x(2"#"2A!42A!4"1#t't'"dt'"drt'"d\8 d# 2! 0!("d*~<ǎ8@;@W@!:#:#"0$0 #0*0W8( @00  0 B!41 -RA!*P%00(# %09(# $@ <0^82 D00  0 B!4188Wpz[B@8~!H PPWP48<@DH~LLHHLP! LHLH! LPLPL\LHLXL\LdրLXqpN$LXLd Ldx((lx! ( 2L\LH  !(hրLd L\p0qp((q$L\ Ldsqp'( (&     L\pLdp  PL\! LH!L\ xF pLX(PLXL`LX LdLXLd~LǎHǞDǮ@Ǿ<84PPWLX! !L\! LdWP<@DH~Ly   s  Rq(+p#((p(pspL`~LǎHǞDǮ@Ǿ<PPW0@ A#1 ! 1W0+K "AC1!WAC$AhAC%hAC&hACWQWPX%AC1QCGxBBSD"vt ('"AC8('p'"$AC4$X$AhAC!FhAC"     BG G!    g   ,Q"%(  D b j D p     ~@ǎ<HHWH<@~DpǐLJ D   pH  pH' (. ( <   ~Dǎ@Ǟ<HHW8 ȧ~4p  *        |'Q!R D D pH%  ' pH7! ,~488W@8~<p  ( ppP(WH( ppPH^霧*    pH& ppP(WHW @  ~<ǎ8@@WP pRH a!` !WH@~Dq(d l~Dǎ@HHWH<@~Dr '$~Dǎ@Ǟ<HHWH<0@~Dr 0 (+R a(a( <r NwX   @   "    t  )r!  )a!"@  pH~Dǎ@Ǟ<HHW@~<p.`W .`&0 2  &'   ~<@@WX?@DHLP~Ts @  aP/\ (  )  ' pH7! X (  <~TǎPǞLǮHǾD@XXWP<@DH~Lp   W |tlǧ" !  40,'  W     )bV  H )     ,   aP/\ +! (() )((N  ' pH7! BW  D ,,- , ~TǎPǞLǮHǾD@<XXW@~<p     W    ~<@@W@\.`.\H\@@W@.` >`#.@@WX@~D.x qώxTP.LVH@HU(~Dǎ@XXW@48~<p P     Z   & ppPH$ ppP(WH2 pHB @  ~<ǎ8Ǟ4@@W[xW![ZW![ >W[W2!6[W2![W2![WC2!,[W2![W[@W @[t@@W![JW [W2![WHW8$Ȏ"$$¶$$88W8$Ȇ$88W 1 W8$Ȏ*$$$ $88WH Lا@~D8p :p\<p\:" p N\\\:pހ\q,p\~Dǎ@HHWA~"t0As3r21~Wp^^^^^Ǽ_ @P PP_$PpRUHP_$%py}kg,P_$(VP p:w]ѡ[q" ,_(0_(ְ_(Fp_@c(stdxX܋ `_ d`_ P_$([P  ,_(0_( ְ_(`_ d`_ (P_$[PQ̡P! ! ,_(0_(ְ_(`_ d`_ 'Π- 8ы0):@0CAMр ѡ(P_$[P Q фP р}-!ш},_(0_(ְ_(`_ d`_ / q$pфыh`_ d`_ / q$фы4_^_`_ csd(u$+\-` d#h.l*x0Āelh%ox0XeEfgGn9ld`_  _d`_ @ _ _ "  !_`d`_ }^; -!10^@@ V 8@  /  +!10^"  /  !10^ @ /00 0ѡ $@ZPECѡMѡ p_ }_ u__ ^d`_ } pq 5#"0ѡP n b V J@ _ 6@ *_d`_ _ _ d`_ _ @     0 9: @ _ _z _WC0$p_D0$_D0$pd`_ - _p&@ 4__  a@ '_ -__ pX Oo620^x 0 ^^"X^  __   @ / & _ g `h`_ _ 0!#и^0_,@_0ȧN(^^8_0 - ^^D  5  + ^^ ^^g ю 0ѡaP_ P .aP6 QaP P_P_ ׶`_p_8g^ 06P_,QPU):RECAaFSRQaVrgaga_,- +aea E`^rvp___ #2#: @ / & _ g `h`_ _ 0<#0_,@_0ȧN(^\^8_0`_ P_,/Q)-0!-^! ^B +^! ^   ^! ^E00@qA0- '1qA@Aq@ `  .'qF<Ad &$ _ _A@> QP&#1qA@Aq@_@p_`_ #H _ @ & _  ! _ g `h`_ 0#^0_,@_0ȧN(^2^8^ _,`_  FF=11=CCAM 0AMAP_,VA@_ E@_ p_}@^g_d``__  >  _ ___ @^p^^/$H,_(0_( ְ_(zkg(P_$(VPp: w q&$H,_(0_( ְ_(@^p^^@ekd,_$( ^DA4^,_(0_(^ ^ְ_( ֠_^/$\,_(0_( ְ_(Jkd(P_$(VP@:0D A&$\,_(0_( tְ_(^pTkg(_$( wq( ,_(0_( ְ_(     / ֠_^/$\,_(0_( ְ_(Jkd*P_$(VP@<0D A&$\,_(0_( lְ_(^ fp_p\kg,_$( ^wq,^,_(0_( ְ_( ֠__/$H,_(0_( ְ_(Jkd*P_$(VP@< D A&$H,_(0_( Xְ_(H{ p   _$( @  @ , 2 ! . 00  +   B  p^ؐ^ذ^^^WhLPTX\`~dpЩ.   qd !0q!#"(    % %Xؘ!! . $  * qߎ ޠ l h  [ h  qΰl cf[^ׄ!0q!#"( cs [(~(^ *>h^,"~(^ *;^,h    ~dǎ`Ǟ\ǮXǾTPLhhWP8<@DHL~P~P^^^ϞT^^x^:d2p$W^Q^ΰ L +!R  ->^Q^Ռ![RQ^ q^P v q0& q 7W(!^Q^.^Q^e E|t^Q^dT! q+ - B!s` T). 2 l.242# .242""7^P l$^PLh(^z ^P~PǎLǞHǮDǾ@<8W`<@DHLP~T~ XcsR[\RP^\*)b!!0#.0q#"( ^\P!+"  4nX  c ~TǎPǞLǮHǾD@<``WH<@~Dp^qV  1 ]2 - qR Z -87#@]$*'B2 2# rq q1 ]2~Dǎ@Ǟ<HHWH X(  WP@DH~Lr @D''!'־ )7 )Ô ~LǎHǞDǮ@PPW ! ^ 0(,01  !W`@DHLPT~XP^\0q #"( + "  -^\Q^\ p1@ΐ. ~Hΐ0 Aj0ސ ̈ *ސ ̈:zA@ސ ̈* ސ ̈:zpޠqeΐ. TB 9Ȍ19#59'3( E e 0@ (@@0@ (@@ @+ @-1pq@GDD@>@B*  pq@GDD@0 p%%,=:yp6p?qq5yq%(% K ?0@@A@ q5'@sA@  6! #;K;;#\ 2  ~XǎTǞPǮLǾHD@``W0~@q!$"$ d @q!$"( !@+B $ @-$ 1@q!$"$ D 0!*@0A$pqAGDD@0 ~WPHx~Lp(,j~LǎHPPWPHx~Lp(,"~LǎHPPW`?8<@DH~Lp.ޠ__:T 2p_ p___p  :X ސ&8 _p  C@:8 6p  : @$:@$ 1 P@$`^P5%cR:W^XP'86 0":B0C9"5 4r+!+ @$0:  ?05N?:@ 5p  5 @$0:  _( _( _:_( 0 &009 4 @$05p (  5(T_ &1_  &0   9( ~LǎHǞDǮ@Ǿ<8`_`WP@D~Hr :  .LpL8"H:GA5pp!`' pq90A@3 95pL1"HP>5p(`pq91A 31906~HǎDǞ@PPW0 1 @4AW   ?  ?0 6    W6    WA0~: r:2rqrp?5p?:pprq3rp?:ppp:sp2~ǎW @(#)acctcom.c 5.1 87/05/29 @(#)acctdef.h 5.1 87/05/29 ,,,n,,,,,,,,,,,d,,|,0,$ LL$w%hu%hu%lf%lf%lf%lfC:E:H:I:O:S:abe:fg:hikl:mn:o:qrs:tu:vUnknown group%s: Unknown user %s open error on output file/usr/adm/pacctracctcom: cannot open %s ACCOUNTING RECORDS FROM: %sSTART AFT: %sSTART BEF: %sEND AFTER: %sEND BEFOR: %s MINR/WSYS HOGCPUCPUCOMMAND START END REAL%8.8s%8.8s(SECS)%8.8sCHARS%8.8sBLOCKS%8.8s%8.8s%8.8sMEAN%8.8sKCORENAME USER TTYNAME TIME TIME (SECS)%8.8s%8.8sUSER%8.8s(SECS)%8.8sTRNSFD%8.8s%8.8sFACTOR%8.8sFACTOR%8.8sSIZE(K)%8.8s F STAT ?#%-9.9s %-8.8s %-8d %-8.8s%.9s%.9s %8.2lf%8.2lf%8.2lf%8.2lf%8ld%8ld%8.2lf%8.2lf%8.2lf%8.2lf %1o %3o%ld:%ld:%ldacctcom: bad time:pattern syntax cmds=%ld Real=%-6.2f CPU=%-6.2f USER=%-6.2f SYS=%-6.2f CHAR=%-8.2f BLK=%-8.2f USR/TOT=%-4.2f HOG=%-4.2f No commands matched acctcom: cannot stat stdin /dev/nullacctcom: cannot stat /dev/null acctcom: %s %s Usage: acctcom [options] [files] Where options can be: %s -b read backwards through file %s -f print the fork/exec flag and exit status %s -h print hog factor (total-CPU-time/elapsed-time) %s -i print I/O counts %s -k show total Kcore minutes instead of memory size %s -m show mean memory size %s -r show CPU factor (user-time/(sys-time + user-time)) %s -t show separate system and user CPU times %s -v don't print column headings %s -a print average statistics of selected commands %s -q print average statistics only %s -l line show processes belonging to terminal /dev/line %s -u user show processes belonging to user name or user ID %s -u # show processes executed by super-user %s -u ? show processes executed by unknown UID's %s -g group show processes belonging to group name of group ID %s -s time show processes ending after time (hh[:mm[:ss]]) %s -e time show processes starting before time %s -S time show processes starting after time %s -E time show processes ending before time %s -n regex select commands matching the ed(1) regular expression %s -o file do not print, put selected pacct records into file %s -H factor show processes that exceed hog factor %s -O sec show processes that exceed CPU system time sec %s -C sec show processes that exceed total CPU time sec %s -I chars show processes that transfer more than char chars @(#)devtolin.c 6.1 87/11/23 @(#)acctdef.h 6.1 87/11/23 ??r/dev @(#)expand.c 6.1 87/11/23 @(#)lintodev.c 6.1 87/11/23 @(#)acctdef.h 6.1 87/11/23 /dev/xxxxxxxx @(#)regcmp.c 6.1 87/11/23 !L!L!L p L!L!L < @(#)regex.c 6.1 87/11/23 ')0)'()))))))$(t(`&4')0)'%T%)))%% %(%%x%x%x%x%h)))((((()))%<(L(<&((((stack overflow @(#)substr.c 6.1 87/11/23 @(#)uidtonam.c 6.1 87/11/23 @(#)acctdef.h 6.1 87/11/23 ? @(#)ctime.c 6.1 87/11/23 Day Mon 00 00:00:00 1900 SunMonTueWedThuFriSatJanFebMarAprMayJunJulAugSepOctNovDecTZpLHPDTPSTW`/Lw/K:/JMFw/ @(#)getenv.c 6.1 87/11/23 @(#)getgrnam.c 6.1 87/11/23 @(#)getopt.c 6.1 87/11/23 --: illegal option -- : illegal option -- : option requires an argument -- : option requires an argument --  @(#)getpwent.c 6.1 87/11/23 rr/etc/passwd @(#)getpwnam.c 6.1 87/11/23 @(#)getpwuid.c 6.1 87/11/23 @(#)isatty.c 6.1 87/11/23 @(#)malloc.c 6.1 87/11/23 @(#)memchr.c 6.1 87/11/23 @(#)mon.c 6.1 87/11/23 PROFDIRmon.out @(#)perror.c 6.1 87/11/23 : Unknown error @(#)strtol.c 6.1 87/11/23 @(#)data.c 6.1 87/11/23 88@08H @(#)fgets.c 6.1 87/11/23 @(#)stdiom.h 6.1 87/11/23 @(#)filbuf.c 6.1 87/11/23 @(#)flsbuf.c 6.1 87/11/23 @(#)stdiom.h 6.1 87/11/23 @(#)fopen.c 6.1 87/11/23 @(#)fprintf.c 6.1 87/11/23 @(#)fread.c 6.1 87/11/23 @(#)stdiom.h 6.1 87/11/23 @(#)fseek.c 6.1 87/11/23 @(#)fwrite.c 6.1 87/11/23 @(#)stdiom.h 6.1 87/11/23 @(#)rew.c 6.1 87/11/23 @(#)scanf.c 6.1 87/11/23 @(#)setbuf.c 6.1 87/11/23 @ @(#)ctype.c 6.1 87/11/23 ((((( H @(#)errlst.c 6.1 87/11/23  X ` l      !!!$!8!L!`!l!!!!!!!!"""0"@"P"h"x""""""##$#@#P#`#|###.Error 0Not ownerNo such file or directoryNo such processInterrupted system callI/O errorNo such device or addressArg list too longExec format errorBad file numberNo child processesNo more processesNot enough spacePermission deniedBad addressBlock device requiredDevice busyFile existsCross-device linkNo such deviceNot a directoryIs a directoryInvalid argumentFile table overflowToo many open filesNot a typewriterText file busyFile too largeNo space left on deviceIllegal seekRead-only file systemToo many linksBroken pipeArgument out of domainResult too largeNo message of desired typeIdentifier removedChannel number out of rangeLevel 2 not synchronizedLevel 3 haltedLevel 3 resetLink number out of rangeProtocol driver not attachedNo CSI structure availableLevel 2 haltedDeadlock condition if locked @(#)getgrent.c 6.1 87/11/23 rr/etc/group @(#)memccpy.c 6.1 87/11/23 000000000000000000000123456789abcdef0123456789ABCDEF @(#)doscan.c 6.1 87/11/23 ttztztzttttttttttttttttt @(#)findiop.c 6.1 87/11/23 @(#)dowrite.c 6.1 87/11/23 @(#)print.h 6.1 87/11/23 @(#)ungetc.c 6.1 87/11/23 @(#)atof.c 6.1 87/11/23 @(#)atoi.c 6.1 87/11/23 @(#)ecvt.c 6.1 87/11/23 Fn CAy7Aׄ@È@Y@$ @(#)ldexp.c 6.1 87/11/23 @(#)memset.c 6.1 87/11/23 @(#)frexp.c 6.1 87/11/23 u!h N0h,.textN0 .datahN@.bss)@)@,` 0  !2$0 ؓ[WXK@(~D"KSLTks K-"0{.K1! 0 1 @B!@@#%=1K1 A  r΀ aP/Wr0 ц0 1 qH0 v0 2@ aP/RA1 @1 !1 m 0 0 2 !~Dǎ@XXWhDHLP~Tqް > ),)   2* ?!  k V p!-  X(,  vXRD X( X P(8   0#)FBx+ p( :  lt 0 `(+  `ǞdP s p |)+  XH  0  1  2  qpp Ǟd),P   0p(! !0  1  2 !  $ ! "$ 2!  !#qqpxxx|!|!7 ~TǎPǞLǮHǾDhhW8f88W8 88W8 88W 0)@@~p)ހ\$! "#(! "'qA1 !ސ)ޠx X@)0)ss1pp@)@)0)ss1pp!@)8()0@sqw)rtww)A1r!pp0E, 2!0001~ǎǞǮ W` tP-^(P,ا^,P)ا^0P^4P-h^8P-H^l '@~ǎǞǮ Ǿ((W( ا ~pA $ @ P^n.d #"!  0.X.PǞT )"!#( )!0\pǮP(*"p$ϡϡPpϱ\pe^$^Ppe^ p!!Ǿ`sǾ`ϡsǾ`ϡsǮ`!!@х3 $Ǟh )"Ǟ`!)" (! ǎd $ ^Q^I $ # >l '@~ǎǞǮ Ǿ((Wp [B8ȧTT.X88W0<@DH~Lq ހ /`.P PhphW dPP!9TX"@Bhr!4CA@PpHq%( 6vP)  h~LǎHǞDǮ@Ǿ<W0~s@1tC@ p:G @ /$A B!  1~W@8~     BG G!     g   ,Q"%(  D b j D p     ~@ǎ<HHWH<@~DpǐLJ D   px  px' (. (   ~Dǎ@Ǟ<HHW8 ȧ~4p  *        |'Q!R D D px%  ' px7! ,~488W@8~<p  ( ppP3@Wx( ppx^̧*    px& ppP3@WxW @  ~<ǎ8@@WP pRx a!` !W@~<p.`W .`&0 2  &'  ~<@@W`<@D~Hp402 r.| T.NÞT T T.Np.p .x(' 'q.|>B!!   ̋ !T T.Nx <.|.p~HǎDǞ@Ǯ<``W.|.|W@48~<p P     Z   & ppx$ ppP3@Wx2 pxR @  ~<ǎ8Ǟ4@@W[W![W!;0[W[W2!6[W!%[nW[ZWC2!,[W2![(W[`W `[``W!00[WH .(N0n8@HPX` W`X .(N0n8Ɏ@ɮHPԩة>^觾[2![WhWPT.>H PPWp  $Wpǀǐ Ǡǰ $WWp.....Ǽ/ @P PP/$PpRUxP/$%py}kg,P/$(VP p:w]ѡ[q" ,/(0/(ְ/(Fp/@c(stdxX܋ `/ d`/ P/$([P  ,/(0/(,ְ/(`/ d`/ (P/$[PQ̡P! ! ,/(0/(ְ/(`/ d`/ 'Π- 8ы0):@0CAMр ѡ(P/$[P Q фP р}-!ш},/(0/(ְ/(`/ d`/ / q (фыh`/ d`/ / q 8фы4/./`/ csd(u$+\-` d#h.l*x0Āelh%ox0XeEfgGn9ld`/  /d`/ @ / / "  !/`d`/ }.; -!10.@@ V 8@  /  +!10."  /  !10. @ /00 0ѡ $@ZPECѡMѡ p/ }/ u// ^d`/ } pq 5#"0ѡP n b V J@ / 6@ */d`/ / / d`/ / @     0 9: @ / /z /WC0 (_D0 8_D0 (d`/ - /p&@ 4//  a@ '/ -// pX Oo620.x 0 .."X.  //   @ / & / g `h`/ / 0!#и.0/,@/0ȧN(..8/0 - ..D  5  + .. ..g ю 0ѡaP/ P .aP6 QaP P/P/ ׶`/p/8g. 06P/,QPU):RECAaFSRQaVrgaga/,- +aea E`.rvp/// #2#: @ / & / g `h`/ / 0<#0/,@/0ȧN(. \.8/0`/ P/,/Q)-0!-.! .B +.! .   .! .E00@qA0- '1qA@Aq@ `  .'qF<Ad &$ / /A@> QP&#1qA@Aq@/@p/`/ #H / @ & /  ! / g `h`/ 0#.0/,@/0ȧN(. 2.8. /,`/  FF=11=CCAM 0AMAP/,VA@/ E@/ p/}@.g/d``//  >  / /// @.p../ ,/(0/(ְ/(zkg(P/$(VPp: w q& ,/(0/(ְ/(@.p..@ekd,/$( .DA4.,/(0/(.4.ְ/( ֠/./ ,/(0/(ְ/(Jkd(P/$(VP@:0D A& ,/(0/(ְ/(.pTkg(/$( wq( ,/(0/(<ְ/(     / ֠/./ ,/(0/(ְ/(Jkd*P/$(VP@<0D A& ,/(0/(ְ/(. fp/p\kg,/$( .wq,.,/(0/(ְ/( ֠/// ,/(0/(ְ/(Jkd*P/$(VP@< D A& ,/(0/(xְ/(H{ p   /$( @  v@ , 2 ! . 00  +    p.ؐ.ذ...WH@~Dq l~Dǎ@HHWH<@~Dr  '$~Dǎ@Ǟ<HHWH<0@~Dr 0 (+R a(a( <r NwX   @   "    t  )r!  )a!"  px~Dǎ@Ǟ<HHW`DHLPTX~\q  *"(  D   px   Ǘ  8VІ ρ  ' px7! 0 @  0 *>  (~\ǎXǞTǮPǾLHD``WP@DH~Lr @D''!' )7)Ѽ ~LǎHǞDǮ@PPW2![4W2![WPHx~Lp(,j~LǎHPPWPHx~Lp(,"~LǎHPPW`?8<@DH~Lp.ޠ//:T 2p/ p///p  :X ސ! /p  C@:8 6p  : @$:@$ 1 P@$`^P5%cR:W^XP'86 0":B0C9"5 4r+!+ @$0:  ?05N?:@ 5p  5 @$0:  /( /( /:/( 0 &009 4 @$05p (  5(T/ &1/  &0   9( ~LǎHǞDǮ@Ǿ<8`/`WA~"t0As3r21~W   ?  ?0 6    W6    Wx (  WX<@DHLPҧ~TsRNW  ( ( D  \ pױx'(R (> )     ,n   aP/\ +! (() )((ˮ  ' px7! xBW  D ,,-V ڜ ~TǎPǞLǮHǾD@<XXW0@ A#1 ! 1W @(#)crypt.c 6.1 87/11/23 -kypkCrYpTkEy=XXXXXXXXEnter key:Cannot open /dev/tty CrYpTkEyusage: crypt [ -k ] [ key] cryptcrypt @(#)crypt.c 6.1 87/11/23 @(#)des_crypt.c 6.1 87/11/23 :2*" <4,$ >6.&@80( 91)! ;3+# =5-% ?7/'(08@ '/7?&.6>%- 5=$, 4<#+ 3;"* 2:!) 1991)! :2*" ;3+# <4,$?7/'>6.&=5-%      )4%/7(3-!0,1'8"5.*2$                                                                                                                                      @(#)desencrypt.c 6.1 87/11/23 @(#)desdecrypt.c 6.1 87/11/23 @(#)execvp.c 6.1 87/11/23 <DDD<4shPATH:/bin:/usr/bin/bin/sh @(#)getenv.c 6.1 87/11/23 @(#)getopt.c 6.1 87/11/23 --: illegal option -- : illegal option -- : option requires an argument -- : option requires an argument --  @(#)malloc.c 6.1 87/11/23 @(#)mon.c 6.1 87/11/23 PROFDIRmon.out @(#)perror.c 6.1 87/11/23 : Unknown error @(#)putenv.c 6.1 87/11/23 @(#)sleep.c 6.1 87/11/23 @(#)data.c 6.1 87/11/23 3P3P3X5HEPx @(#)filbuf.c 6.1 87/11/23 @(#)flsbuf.c 6.1 87/11/23 @(#)stdiom.h 6.1 87/11/23 @(#)fprintf.c 6.1 87/11/23 @(#)getpass.c 6.1 87/11/23 r/dev/tty @(#)setbuf.c 6.1 87/11/23 UX @(#)errlst.c 6.1 87/11/23 PXd0DXd|(8H`p8HXt.Error 0Not ownerNo such file or directoryNo such processInterrupted system callI/O errorNo such device or addressArg list too longExec format errorBad file numberNo child processesNo more processesNot enough spacePermission deniedBad addressBlock device requiredDevice busyFile existsCross-device linkNo such deviceNot a directoryIs a directoryInvalid argumentFile table overflowToo many open filesNot a typewriterText file busyFile too largeNo space left on deviceIllegal seekRead-only file systemToo many linksBroken pipeArgument out of domainResult too largeNo message of desired typeIdentifier removedChannel number out of rangeLevel 2 not synchronizedLevel 3 haltedLevel 3 resetLink number out of rangeProtocol driver not attachedNo CSI structure availableLevel 2 haltedDeadlock condition if locked @(#)isatty.c 6.1 87/11/23 000000000000000000000123456789abcdef0123456789ABCDEF @(#)fopen.c 6.1 87/11/23 @(#)fputs.c 6.1 87/11/23 @(#)stdiom.h 6.1 87/11/23 @(#)dowrite.c 6.1 87/11/23 @(#)print.h 6.1 87/11/23 @(#)ecvt.c 6.1 87/11/23 Fn CAy7Aׄ@È@Y@$ @(#)memccpy.c 6.1 87/11/23 @(#)findiop.c 6.1 87/11/23 @(#)fwrite.c 6.1 87/11/23 @(#)stdiom.h 6.1 87/11/23 @(#)memchr.c 6.1 87/11/23 u!h =`DH.text=` .data>@.bss--DH' 0  !2$0 "2[Wx<@DHLP~TqЋ ?!  e r v~ s!vp0W!84^HHJPP6XX"``   HV 0#?(H!HP!EX(H!Hp\ \\  `XZz  pqWP -  ހ!(FDJ,H'!H" X*H'!HXzf.Z\H, @ '!H !HؓxfPt!(!8. r H!H t  !D a!8 !D "H!H ~TǎPǞLǮHǾD@<xxWH@~D @ pp@@'&H!H ~Dǎ@HHW@8~<p !8!8M!8 ("!<!!<M!8!8-!8 "!<!!<-qh$(!  (! p0W!8!8$  !!8 p$!<!!< `XZ!8!8$  !!8 !<!!< !8!8^!8 ċ"!<!!<^!8!8.  @  ! !8 j.!<1!<  @  !#P!8!8^!8 "!<!!<^!8!8.  @  ! !8 .!<1!<  @  !#`F!8!8$!8 Z !<!!<$!8!8"  !!8 "!<!!< !q!!c~<ǎ8@@Wp [BP<@D~HP qQp `*p-p  p   L p! '":P F  bLMLJh   (H   \L"N P `pQP  QP ?b :  P ap!'",p P  ~ bNOLJJ  b d*   @>N"0Q?P z p PQP L P `pQP QP  P~HǎDǞ@Ǯ<PPWX?@DHLP~Tp-r-b 0-4p$- - --p  ܋ PPpP-p q-  ( ^   ! 01'q2! 'q/  !' :Gq21304!:'q. Ȇ,/  -- -P-q9(9#0@@5601 0- -) ~TǎPǞLǮHǾD@XXWH@~D''p  pp'0   "     ! ~Dǎ@HHW !  W!2! W!21!0W! W!120WH@~Dp W & !   D 6ހ!(  @  &8(  ! p!%(!7  R   .   W    ~Dǎ@HHW8 ȧ~4p!(.q&8(~488W@8~<pp ~W  < r '   ~<ǎ8@@W8 ȧ~4p T g "Q%(   ~488WH<΀ ~@q R  Bb p%('(! ,>     BG G!h    g   ,Q"%(  D b j D p     ~@ǎ<HHWH<@~DpǐLJ D   p%(  p%(' (. (   ~Dǎ@Ǟ<HHW8 ȧ~4p  *        |'Q!R D D p%(%  ' p%(7! ,~488W@8~<p  ( ppPP W%(( pp&0%(^*    p%(& ppPP W%(W @  ~<ǎ8@@WP pR%( a!` !WH@~Dq l~Dǎ@HHWH<@~Dr '$~Dǎ@Ǟ<HHWH<0@~Dr 0 (+R a(a( <r NwX   @   "    t  )r!  )a!"  p%(~Dǎ@Ǟ<HHW@~<p.`W .`&0 2  &'   ~<@@W@48~<p P     Z   & pp&0%($ ppPP W%(2 p%(B @  ~<ǎ8Ǟ4@@W[(W![ W![ W[W2![W2![WC2!,[W2![W[h'W '[<''W2![W'W@8~ PPWP48<@DH~L.`H.h! .`.`! .h.h.t.`.p.t.|ր.pqpN$.p.| .|x((lx! ( 2.t.`  !(hր.|x.tp0qp((q$.t .|sqp'( (&    .tp.|p  P.t! .`!.t xF p.p(P.p.x.p .|.p.|~LǎHǞDǮ@Ǿ<84PPW.p! !.t! .|WP<@DH~Ly   s  Rq(+p#X((p(psp.x~LǎHǞDǮ@Ǿ<PPW0+K "AC1!WAC$AhAC%hAC&hACWQWPX%AC1QCGxBBSD"vt ('"AC8('p'"$AC4$X$AhAC!FhAC" QP&#1qA@Aq@/@p/`/ #H / @ & /  ! / g `h`/ 0#.0/,@/0ȧN(..8. /,`/  FF=11=CCAM 0AMAP/,VA@/ E@/ p/}@.g/d``//  >  / /// @.p../+,/(0/(ְ/(zkg(P/$(VPp: w q&+,/(0/(<ְ/(@.p..@ekd,/$( .DA4.,/(0/(..ְ/( ֠/./+,/(0/(ְ/(Jkd(P/$(VP@:0D A&+,/(0/(,ְ/(.pTkg(/$( wq( ,/(0/(ְ/(     / ֠/./+,/(0/(ְ/(Jkd*P/$(VP@<0D A&+,/(0/($ְ/(. fp/p\kg,/$( .wq,.,/(0/(ְ/( ֠///+,/(0/(lְ/(Jkd*P/$(VP@< D A&+,/(0/(ְ/(H{ p   /$( @  @ , 2 ! . 00  +    p.ؐ.ذ...W!( &8(  WP@DH~Lr @D''!'ߎ )7H) ~LǎHǞDǮ@PPW2!6[WPHx~Lp(,j~LǎHPPWPHx~Lp(,"~LǎHPPW`?8<@DH~Lp.ޠ//:T 2p/ p///p  :X ސ, /Jp  C@:8 6p  : @$:@$ 1 P@$`^P5%cR:W^XP'86 0":B0C9"5 4r+!+ @$0:  ?05N?:@ 5p  5 @$0:  /( /( /:/( 0 &009 4 @$05p (  5(T/ &1/  &0   9( ~LǎHǞDǮ@Ǿ<8`/`W   ?  ?0 6    W6    WX<@DHLPҧ~TsRNW  ( ( D  \ pױ%('(R (> )H     ,צ   aP/\ +! (() )((  ' p%(7! ٰBW  D ,,-V  ~TǎPǞLǮHǾD@<XXW0@ A#1 ! 1W @(#)cat.c 6.1 87/11/23 |-rusvteusage: cat -usvte [-|file] ... cat: Cannot stat stdout cat: cannot open %s cat: cannot stat %s cat: input %s is output cat: close error cat: close error cat: output error cat: output error t4 @(#)getopt.c 6.1 87/11/23 --: illegal option -- : illegal option -- : option requires an argument -- : option requires an argument --  @(#)mon.c 6.1 87/11/23 PROFDIRmon.out @(#)perror.c 6.1 87/11/23 : Unknown error @(#)data.c 6.1 87/11/23 P0P0P8R(b0%( @(#)filbuf.c 6.1 87/11/23 @(#)flsbuf.c 6.1 87/11/23 @(#)stdiom.h 6.1 87/11/23 @(#)fopen.c 6.1 87/11/23 @(#)fprintf.c 6.1 87/11/23 @(#)setbuf.c 6.1 87/11/23 r8 @(#)errlst.c 6.1 87/11/23 ''(( (0(H(T(p((((((()))()4)H)X)h)x))))))***(*8*D*\*p******++4+P+`.Error 0Not ownerNo such file or directoryNo such processInterrupted system callI/O errorNo such device or addressArg list too longExec format errorBad file numberNo child processesNo more processesNot enough spacePermission deniedBad addressBlock device requiredDevice busyFile existsCross-device linkNo such deviceNot a directoryIs a directoryInvalid argumentFile table overflowToo many open filesNot a typewriterText file busyFile too largeNo space left on deviceIllegal seekRead-only file systemToo many linksBroken pipeArgument out of domainResult too largeNo message of desired typeIdentifier removedChannel number out of rangeLevel 2 not synchronizedLevel 3 haltedLevel 3 resetLink number out of rangeProtocol driver not attachedNo CSI structure availableLevel 2 haltedDeadlock condition if locked @(#)getenv.c 6.1 87/11/23 @(#)isatty.c 6.1 87/11/23 @(#)malloc.c 6.1 87/11/23 000000000000000000000123456789abcdef0123456789ABCDEF @(#)findiop.c 6.1 87/11/23 @(#)dowrite.c 6.1 87/11/23 @(#)print.h 6.1 87/11/23 @(#)ecvt.c 6.1 87/11/23 Fn CAy7Aׄ@È@Y@$ @(#)fwrite.c 6.1 87/11/23 @(#)stdiom.h 6.1 87/11/23 @(#)memchr.c 6.1 87/11/23 u!h 768.text7 .data8@.bss,H,H68 ` 0  !2$0 "z[WH<@~D H0J@ J"@("(ԓ @(@ rP@0  @80@ # p@Pq@P\~Dǎ@Ǟ<HHW 1  W 1  W0~@1!$"$ d @1!$"( !@+B $ @-$ 1@1!$"$ D 0!*@0A$p1AGDD@0 ~Wpz[B@8~<  p8 D~<ǎ8@@WX?@DHLP~Tp,Pr,Lb 0 ,P p$,L ,H p ,H,Pp   @X@Xp@`,Lp q,H  ( ^x * ! 01'q2! 'q/  !' :Gq21304!:'q.,/ h,L,L ,LP,Hq9(9#0@@5601 0,H ,H)~TǎPǞLǮHǾD@XXWH@~D h!Hp pp  ,"p  !~Dǎ@HHW!2! W!21!0W! W!120W8 ȧ~4p.q(~488W@8~<pp ~W  < r  h   ~<ǎ8@@W8 ȧ~4p T g "Q%(   ~488WH<΀ ~@q R  Bb p'(! ,>     BG G!0    g   ,Q"%(  D b j D p     ~@ǎ<HHWH<@~DpǐLJ D   p  p' (. (   ~Dǎ@Ǟ<HHW8 ȧ~4p  *        |'Q!R D D p%  ' p7! ,~488W@8~<p  ( ppP@hW( pp^T*    p& ppP@hWW @  ~<ǎ8@@WP pR a!` !W@~<p.`W .`&0 2  &' F  ~<@@W2![W[W![W[WC2!,[W[ `W  `[T ` `W![*W2![W hW@8~ PPWP48<@DH~L>`H>h! >`>`! >h>h>t>`>p>t>|ր>pqpN$>p>| >|x((lx! ( 2>t>`  !(hր>|h>tp0qp((q$>t >|sqp'( (&    >tp>|p  P>t! >`!>t xF p>p(P>p>x>p >|>p>|~LǎHǞDǮ@Ǿ<84PPW>p! !>t! >|WP<@DH~Ly   s  Rq(+p#X((p(psp>x~LǎHǞDǮ@Ǿ<PPW0+K "AC1!WAC$AhAC%hAC&hACWQWPX%AC1QCGxBBSD"vt ('"AC8('p'"$AC4$X$AhAC!FhAC">>>>Ǽ? @P PP?$PpRUP?$%py}kg,P?$(VP p:w]ѡ[q" ,?(0?(ְ?(Fp?@c(stdxX܋ `? d`? P?$([P  ,?(0?(tְ?(`? d`? (P?$[PQ̡P! ! ,?(0?(ְ?(`? d`? 'Π- 8ы0):@0CAMр ѡ(P?$[P Q фP р}-!ш},?(0?((ְ?(`? d`? / q%фыh`? d`? / q%фы4?>?`? csd(u$+\-` d#h.l*x0Āelh%ox0XeEfgGn9ld`?  ?d`? @ ? ? "  !?`d`? }>; -!10>@@ V 8@  /  +!10>"  /  !10> @ /00 0ѡ $@ZPECѡMѡ p? }? u?? ^d`? } pq 5#"0ѡP n b V J@ ? 6@ *?d`? ? ? d`? ? @     0 9: @ ? ?z ?WC0%_D0%_D0%d`? - ?p&@ 4??  a@ '? -?? pX Oo620>x 0 >>"X>  ??   @ / & ? g `h`? ? 0!#и>0?,@?0ȧN(>>8?0 - >>D  5  + >> >>g ю 0ѡaP? P .aP6 QaP P?P? ׶`?p?8g> 06P?,QPU):RECAaFSRQaVrgaga?,- +aea E`>rvp??? #2#: @ / & ? g `h`? ? 0<#0?,@?0ȧN(> >8?0`? P?,/Q)-0!->! >B +>! >   >! >E00@qA0- '1qA@Aq@ `  .'qF<Ad &$ ? ?A@> QP&#1qA@Aq@?@p?`? #H ? @ & ?  ! ? g `h`? 0#>0?,@?0ȧN(> >8> ?,`?  FF=11=CCAM 0AMAP?,VA@? E@? p?}@>g?d``??  >  ? ??? @>p>>/%,?(0?( Fְ?(zkg(P?$(VPp: w q&%,?(0?(ְ?(@>p>>@ekd,?$( >DA4>,?(0?(>|>ְ?( ֠?>/%,?(0?(6ְ?(Jkd(P?$(VP@:0D A&%,?(0?(ְ?(>pTkg(?$( wq( ,?(0?(ְ?(     / ֠?>/%,?(0?(0ְ?(Jkd*P?$(VP@<0D A&%,?(0?(ְ?(> fp?p\kg,?$( >wq,>,?(0?(dְ?( ֠??/%,?(0?(ְ?(Jkd*P?$(VP@< D A&%,?(0?(ְ?(H{ p   ?$( @  @ , 2 ! . 00  +    p>ؐ>ذ>>>WX?@DHLP~Tr8     *8   ' p7! x ?  ~TǎPǞLǮHǾD@XXWH@~Dp W & !   D 6ހ  @  (  ! p!!7 R   .   W    ~Dǎ@HHWH@~Dq l~Dǎ@HHWH<@~Dr '$~Dǎ@Ǟ<HHWH<0@~Dr 0 (+R a(a( <r NwX   @   "    t  )r!  )a!"x  p~Dǎ@Ǟ<HHW@~<p     W    ~<@@WP@DH~Lr @D''!' )7)l ~LǎHǞDǮ@PPW2!6[pW2![\W2![@W2![(WPHx~Lp(,j~LǎHPPWPHx~Lp(,"~LǎHPPW`?8<@DH~Lp.ޠ??:T 2p? p???p  :X ސ& ?p  C@:8 6p  : @$:@$ 1 P@$`^P5%cR:W^XP'86 0":B0C9"5 4r+!+ @$0:  ?05N?:@ 5p  5 @$0:  ?( ?( ?:?( 0 &009 4 @$05p (  5(T? &1?  &0   9( ~LǎHǞDǮ@Ǿ<8`?`WA~"t0As3r21~W   ?  ?0 6    W6    W (  WX<@DHLPҧ~TsRNW  ( ( D Ժ \ pױ'(R (> )     ,f   aP/\ +! (() )((.  ' p7! pBW  D ,,-V Ҕ ~TǎPǞLǮHǾD@<XXW0@ A#1 ! 1W @(#)chgrp.c 6.1 87/11/23 chgrp: usage: chgrp gid file ... chgrp: unknown group: %s @(#)atoi.c 6.1 87/11/23 @(#)ctype.c 6.1 87/11/23 ((((( H @(#)getgrnam.c 6.1 87/11/23 @(#)mon.c 6.1 87/11/23 PROFDIRmon.out @(#)perror.c 6.1 87/11/23 : Unknown error @(#)data.c 6.1 87/11/23 @x@x@BpRx @(#)flsbuf.c 6.1 87/11/23 @(#)stdiom.h 6.1 87/11/23 @(#)fprintf.c 6.1 87/11/23 b @(#)errlst.c 6.1 87/11/23 !P!X!d!!!!!!!"""0"D"X"d"|"""""""###(#8#H#`#p######$$$8$H$X$t$$$.Error 0Not ownerNo such file or directoryNo such processInterrupted system callI/O errorNo such device or addressArg list too longExec format errorBad file numberNo child processesNo more processesNot enough spacePermission deniedBad addressBlock device requiredDevice busyFile existsCross-device linkNo such deviceNot a directoryIs a directoryInvalid argumentFile table overflowToo many open filesNot a typewriterText file busyFile too largeNo space left on deviceIllegal seekRead-only file systemToo many linksBroken pipeArgument out of domainResult too largeNo message of desired typeIdentifier removedChannel number out of rangeLevel 2 not synchronizedLevel 3 haltedLevel 3 resetLink number out of rangeProtocol driver not attachedNo CSI structure availableLevel 2 haltedDeadlock condition if locked @(#)getenv.c 6.1 87/11/23 @(#)getgrent.c 6.1 87/11/23 rr/etc/group @(#)isatty.c 6.1 87/11/23 @(#)malloc.c 6.1 87/11/23 000000000000000000000123456789abcdef0123456789ABCDEF @(#)fgets.c 6.1 87/11/23 @(#)stdiom.h 6.1 87/11/23 @(#)filbuf.c 6.1 87/11/23 @(#)fopen.c 6.1 87/11/23 @(#)rew.c 6.1 87/11/23 @(#)dowrite.c 6.1 87/11/23 @(#)print.h 6.1 87/11/23 @(#)ecvt.c 6.1 87/11/23 Fn CAy7Aׄ@È@Y@$ @(#)memccpy.c 6.1 87/11/23 @(#)findiop.c 6.1 87/11/23 @(#)fwrite.c 6.1 87/11/23 @(#)stdiom.h 6.1 87/11/23 @(#)memchr.c 6.1 87/11/23 u!h 1$h.text1 .datahh2h@.bss--$ 0  !2$0 h"[WX?@DHLP~T 0 @ 0  p0( 0' R0 0,r   0' :Ā} ~TǎPǞLǮHǾD@XXWH<@~Dp0  <b)0+2N# "0-# 0=#*( ! r( ! q( r( ! rV 0 0  ,q0 0  0 l~Dǎ@Ǟ<HHWp0  0  002 70 0 W0 !0  u(! F0a#(! :pW 8   0 0 W0 +(D+( - =0 0 W 0 "0g(20t0g(20 ,0o# .0u#L s8 s   p#p  0 0 0 !0  x(! V0r#(! Jp`W$  I   0 0 Wp[BX?@DHLP~Tp-r-b 0 - p$- - H --p  d 0H0Hp0P-p q-  ( ^  ! 01'q2! 'q/ !' :Gq21304!:'q.,/ H-- -P-q9(9#0@@5601 0- -)~TǎPǞLǮHǾD@XXWH@~Dpp pp~ "P  !~Dǎ@HHW!21!0W! W!120W8 ȧ~4p.q (~488W@8~<pp ~W  < r    ~<ǎ8@@W8 ȧ~4p T g "Q%(   ~488WH<΀ ~@q R  Bb p'(! ,>     BG G!(    g   ,Q"%(  D b j D p     ~@ǎ<HHWH<@~DpǐLJ D   p  p' (. (   ~Dǎ@Ǟ<HHW8 ȧ~4p  *        |'Q!R D D p%  ' p7! ,~488W@8~<p  ( ppP0XW( pp^T*    p& ppP0XWW @  ~<ǎ8@@WP pR a!` !W@~<p.`W .`&0 2  &' F  ~<@@W![W[W![W[WC2!,[W[W [TW![*W2![WW@8~ PPWP48<@DH~L.`H.h! .`.`! .h.h.t.`.p.t.|ր.pqpN$.p.| .|x((lx! ( 2.t.`  !(hր.|`.tp0qp((q$.t .|sqp'( (&    .tp.|p  P.t! .`!.t xF p.p(P.p.x.p .|.p.|~LǎHǞDǮ@Ǿ<84PPW.p! !.t! .|WP<@DH~Ly   s  Rq(+p#X((p(psp.x~LǎHǞDǮ@Ǿ<PPW0+K "AC1!WAC$AhAC%hAC&hACWQWPX%AC1QCGxBBSD"vt ('"AC8('p'"$AC4$X$AhAC!FhAC" QP&#1qA@Aq@/@p/`/ #H / @ & /  ! / g `h`/ 0#.0/,@/0ȧN(.r.8. /,`/  FF=11=CCAM 0AMAP/,VA@/ E@/ p/}@.g/d``//  >  / /// @.p../h,/(0/(Vְ/(zkg(P/$(VPp: w q&h,/(0/(ְ/(@.p..@ekd,/$( .DA4.,/(0/(..ְ/( ֠/./|,/(0/(Fְ/(Jkd(P/$(VP@:0D A&|,/(0/(ְ/(.pTkg(/$( wq( ,/(0/(ְ/(     / ֠/./|,/(0/(@ְ/(Jkd*P/$(VP@<0D A&|,/(0/(ְ/(. fp/p\kg,/$( .wq,.,/(0/(tְ/( ֠///h,/(0/(,ְ/(Jkd*P/$(VP@< D A&h,/(0/(ְ/(H{ p   /$( @  @ , 2 ! . 00  +    p.ؐ.ذ...WP@DH~Lr @D''!' )7H)\ ~LǎHǞDǮ@PPW2!6[XWPHx~Lp(,j~LǎHPPWPHx~Lp(,"~LǎHPPW`?8<@DH~Lp.ޠ//:T 2p/ p///p  :X ސ /Jp  C@:8 6p  : @$:@$ 1 P@$`^P5%cR:W^XP'86 0":B0C9"5 4r+!+ @$0:  ?05N?:@ 5p  5 @$0:  /( /( /:/( 0 &009 4 @$05p (  5(T/ &1/  &0   9( ~LǎHǞDǮ@Ǿ<8`/`W   ?  ?0 6    W6    WX<@DHLPҧ~TsRNW  ( ( D z \ pױ'(R (> )߈     ,&   aP/\ +! (() )((  ' p7! 0BW  D ,,-V T ~TǎPǞLǮHǾD@<XXW0@ A#1 ! 1W @(#)chmod.c 6.1 87/11/23 Usage: chmod [ugoa][+-=][rwxstugo] file ... chmod: can't access %s chmod: can't change %s chmod: invalid mode :\httDP @(#)mon.c 6.1 87/11/23 PROFDIRmon.out @(#)perror.c 6.1 87/11/23 : Unknown error @(#)data.c 6.1 87/11/23 0h0h0p2`Bh @(#)flsbuf.c 6.1 87/11/23 @(#)stdiom.h 6.1 87/11/23 @(#)fprintf.c 6.1 87/11/23 Rp @(#)errlst.c 6.1 87/11/23 x  0DXl(<P`p(D`p.Error 0Not ownerNo such file or directoryNo such processInterrupted system callI/O errorNo such device or addressArg list too longExec format errorBad file numberNo child processesNo more processesNot enough spacePermission deniedBad addressBlock device requiredDevice busyFile existsCross-device linkNo such deviceNot a directoryIs a directoryInvalid argumentFile table overflowToo many open filesNot a typewriterText file busyFile too largeNo space left on deviceIllegal seekRead-only file systemToo many linksBroken pipeArgument out of domainResult too largeNo message of desired typeIdentifier removedChannel number out of rangeLevel 2 not synchronizedLevel 3 haltedLevel 3 resetLink number out of rangeProtocol driver not attachedNo CSI structure availableLevel 2 haltedDeadlock condition if locked @(#)getenv.c 6.1 87/11/23 @(#)isatty.c 6.1 87/11/23 @(#)malloc.c 6.1 87/11/23 000000000000000000000123456789abcdef0123456789ABCDEF @(#)dowrite.c 6.1 87/11/23 @(#)print.h 6.1 87/11/23 @(#)ecvt.c 6.1 87/11/23 Fn CAy7Aׄ@È@Y@$ @(#)fwrite.c 6.1 87/11/23 @(#)stdiom.h 6.1 87/11/23 @(#)memchr.c 6.1 87/11/23 u!h ;4.text; .data;@.bss--4# 0  !2$0 "B[WH<@~D0 (@ J@("(0 @(@ rP@0  @ 0@:# 8@Pq@P$~Dǎ@Ǟ<HHW Y  W0~@Y!$"$ d @Y!$"( !@+B $ @-$ 1@Y!$"$ D 0!*@0A$pYAGDD@0 ~Wpz[BH@~D 6 p(h Z~Dǎ@HHWX?@DHLP~Tp-Ȏr-Ćb 0 ,- p$- - --ȓp   @X@Xp@`-p q-  ( ^ B ! 01'q2! 'q/ . !' :Gq21304!:'q.,/ H-ħ-ħ -P-q9(9#0@@5601 0- -)6~TǎPǞLǮHǾD@XXWH@~D#$pp pp#~ D"4P  !~Dǎ@HHW!21!0W! W2!10B!0 W!120W8 ȧ~4p.q# (~488W@8~<pp ~W  < r #   ~<ǎ8@@W8 ȧ~4p T g "Q%(   ~488WH<΀ ~@q R  Bb p"'(! ,>     BG G!0    g   ,Q"%(  D b j D p     ~@ǎ<HHWH<@~DpǐLJ D   p"  p"' (. (   ~Dǎ@Ǟ<HHW8 ȧ~4p  *        |'Q!R D D p"%  ' p"7! ,~488W@8~<p  ( ppP@hW"( pp#"^t*    p"& ppP@hW"ކW @  ~<ǎ8@@WP pR" a!` !W@~<p.`W .`&0 2  &'  ~<@@W2![W[W![W[WC2!,[W[#W #[T##W![*W2![W#W@8~(\ (\88WH .0<~@pp p>8(p><p : pD*   :`.D 0p`a>@p : D*   :D  .p`a>D(X>Lp>Pp>Tp>Xp><q,q>8p>H~@ǎ<HHWPT.>" PPWP48<@DH~L>`H>h! >`>`! >h>h>t>`>p>t>|ր>pqpN$>p>| >|x((lx! ( 2>t>`  !(hր>|H>tp0qp((q$>t >|sqp'( (&    r>tp>|p  P>t! >`!>t xF p>p(P>p>x>p >|>p>|~LǎHǞDǮ@Ǿ<84PPW>p! !>t! >|WP<@DH~Ly   s  Rq(+p#((p(psp>x~LǎHǞDǮ@Ǿ<PPW0@ A#1 ! 1W0+K "AC1!WAC$AhAC%hAC&hACWQWPX%AC1QCGxBBSD"vt ('"AC8('p'"$AC4$X$AhAC!FhAC">>>>Ǽ? @P PP?$PpRU"P?$%py}kg,P?$(VP p:w]ѡ[q" ,?(0?(ְ?(Fp?@c(stdxX܋ `? d`? P?$([P  ,?(0?(tְ?(`? d`? (P?$[PQ̡P! ! ,?(0?(ְ?(`? d`? 'Π- 8ы0):@0CAMр ѡ(P?$[P Q фP р}-!ш},?(0?((ְ?(`? d`? / q)фыh`? d`? / q)(фы4?>?`? csd(u$+\-` d#h.l*x0Āelh%ox0XeEfgGn9ld`?  ?d`? @ ? ? "  !?`d`? }>; -!10>@@ V 8@  /  +!10>"  /  !10> @ /00 0ѡ $@ZPECѡMѡ p? }? u?? ^d`? } pq 5#"0ѡP n b V J@ ? 6@ *?d`? ? ? d`? ? @     0 9: @ ? ?z ?WC0)_D0)(_D0)d`? - ?p&@ 4??  a@ '? -?? pX Oo620>x 0 >>"X>  ??   @ / & ? g `h`? ? 0!#и>0?,@?0ȧN(>>8?0 - >>D  5  + >> >>g ю 0ѡaP? P .aP6 QaP P?P? ׶`?p?8g> 06P?,QPU):RECAaFSRQaVrgaga?,- +aea E`>rvp??? #2#: @ / & ? g `h`? ? 0<#0?,@?0ȧN(> >8?0`? P?,/Q)-0!->! >B +>! >   >! >E00@qA0- '1qA@Aq@ `  .'qF<Ad &$ ? ?A@> QP&#1qA@Aq@?@p?`? #H ? @ & ?  ! ? g `h`? 0#>0?,@?0ȧN(> >8> ?,`?  FF=11=CCAM 0AMAP?,VA@? E@? p?}@>g?d``??  >  ? ??? @>p>>/(,?(0?( Fְ?(zkg(P?$(VPp: w q&(,?(0?(ְ?(@>p>>@ekd,?$( >DA4>,?(0?(>|>ְ?( ֠?>/),?(0?(6ְ?(Jkd(P?$(VP@:0D A&),?(0?(ְ?(>pTkg(?$( wq( ,?(0?(ְ?(     / ֠?>/),?(0?(0ְ?(Jkd*P?$(VP@<0D A&),?(0?(ְ?(> fp?p\kg,?$( >wq,>,?(0?(dְ?( ֠??/(,?(0?(ְ?(Jkd*P?$(VP@< D A&(,?(0?(ְ?(H{ p   ?$( @  V@ , 2 ! . 00  +   z  p>ؐ>ذ>>>WX?@DHLP~Tr8     *8   ' p"7! 膰 ?  ~TǎPǞLǮHǾD@XXWH@~Dp xW & !   D 6ހ  @  \# (  ! p!"!7 R   .   W    ~Dǎ@HHWH@~Dq l~Dǎ@HHWH<@~Drt '$~Dǎ@Ǟ<HHWH<0@~Dr 0 (+R a(a( <r NwX   @   "    t  )r!  )a!"x  p"~Dǎ@Ǟ<HHW@~<pv     W    ~<@@WP@DH~Lr @D''!'؎ )7)< ~LǎHǞDǮ@PPW2!6[W2![W2![ٰW2![٘WPHx~Lp(,j~LǎHPPWPHx~Lp(,"~LǎHPPW`?8<@DH~Lp.ޠ??:T 2p? p???p  :X ސ*8 ?p  C@:8 6p  : @$:@$ 1 P@$`^P5%cR:W^XP'86 0":B0C9"5 4r+!+ @$0:  ?05N?:@ 5p  5 @$0:  ?( ?( ?:?( 0 &009 4 @$05p (  5(T? &1?  &0   9( ~LǎHǞDǮ@Ǿ<8`?`WA~"t0As3r21~W   ?  ?0 6    W6    W # (  WX<@DHLPҧ~TsRNW  ( ( D * \ pױ"'(R (> )@     ,   aP/\ +! (() )((  ' p"7! BW  D ,,-N  ~TǎPǞLǮHǾD@<XXW @(#)chown.c 6.1 87/11/23 usage: chown uid file ... chown: unknown user id %s @(#)atoi.c 6.1 87/11/23 @(#)ctype.c 6.1 87/11/23 ((((( H @(#)getpwnam.c 6.1 87/11/23 @(#)mon.c 6.1 87/11/23 PROFDIRmon.out @(#)perror.c 6.1 87/11/23 : Unknown error @(#)data.c 6.1 87/11/23 @x@x@BpRx" @(#)flsbuf.c 6.1 87/11/23 @(#)stdiom.h 6.1 87/11/23 @(#)fprintf.c 6.1 87/11/23 b @(#)errlst.c 6.1 87/11/23 $x$$$$$$$% % %0%D%X%l%%%%%%%%&&&(&<&P&`&p&&&&&&&''('D'`'p'''''.Error 0Not ownerNo such file or directoryNo such processInterrupted system callI/O errorNo such device or addressArg list too longExec format errorBad file numberNo child processesNo more processesNot enough spacePermission deniedBad addressBlock device requiredDevice busyFile existsCross-device linkNo such deviceNot a directoryIs a directoryInvalid argumentFile table overflowToo many open filesNot a typewriterText file busyFile too largeNo space left on deviceIllegal seekRead-only file systemToo many linksBroken pipeArgument out of domainResult too largeNo message of desired typeIdentifier removedChannel number out of rangeLevel 2 not synchronizedLevel 3 haltedLevel 3 resetLink number out of rangeProtocol driver not attachedNo CSI structure availableLevel 2 haltedDeadlock condition if locked @(#)getenv.c 6.1 87/11/23 @(#)getpwent.c 6.1 87/11/23 rr/etc/passwd @(#)isatty.c 6.1 87/11/23 @(#)malloc.c 6.1 87/11/23 @(#)memchr.c 6.1 87/11/23 @(#)strtol.c 6.1 87/11/23 000000000000000000000123456789abcdef0123456789ABCDEF @(#)fgets.c 6.1 87/11/23 @(#)stdiom.h 6.1 87/11/23 @(#)filbuf.c 6.1 87/11/23 @(#)fopen.c 6.1 87/11/23 @(#)rew.c 6.1 87/11/23 @(#)dowrite.c 6.1 87/11/23 @(#)print.h 6.1 87/11/23 @(#)ecvt.c 6.1 87/11/23 Fn CAy7Aׄ@È@Y@$ @(#)memccpy.c 6.1 87/11/23 @(#)findiop.c 6.1 87/11/23 @(#)fwrite.c 6.1 87/11/23 @(#)stdiom.h 6.1 87/11/23 u!h 68$.text6 .data86@.bss--$ 0  !2$0 "[WPDH~Lq 0  -(0  sptp0  -(0  lptp Z0  -"0 @0((0 0( 60 x00  ~08f0@l0(!!! 0(0(!2!! 0 080808n00!!!00<00!2!! 0 L0@0@0@0(!!! 0(0(!2!!00!!! 00z00!2!!<xx0H 6p 0 : .p2 0 0@xN(*0H (9l 0J0!H$#1 W8` x88W@p 0 `H 4L@@W@ 0 `` @@Wp[BX?@DHLP~Tp-r-b 0 - |p$- -8 --p  $ 0P0Pp0X-p q-  ( ^Г  ؋! 01'q2! 'q/  !' :Gq21304!:'q.,/ H-- -P-q9(9#0@@5601 0- -) ~TǎPǞLǮHǾD@XXWH@~D  p ppH~   " P   ! ~Dǎ@HHW!21!0W! W!120WH@~Dp W & !   D 6ހ@  @  P(  ! p!@!7  R   .   W    ~Dǎ@HHW8 ȧ~4p@.qP(~488W@8~<pp ~W  < r n   ( ~<ǎ8@@W8 ȧ~4p T g "Q%(   ~488WH<΀ ~@q R  Bb p@'(! ,>     BG G!Ȏ    g   ,Q"%(  D b j D p     ~@ǎ<HHWH<@~DpǐLJ D   p@  p@' (. (D   ~Dǎ@Ǟ<HHW8 ȧ~4p  *        |'Q!R D D p@%  ' p@7! ,~488W@8~<p  ( ppP0`W@( ppH@^*    p@& ppP0`W@^W @  ~<ǎ8@@WP pR@ a!` !WH@~Dq l~Dǎ@HHWH<@~Dr '$~Dǎ@Ǟ<HHWH<0@~Dr 0 (+R a(a( <r NwX   @   "    t  )r!  )a!"  p@~Dǎ@Ǟ<HHW@~<p.`W .`&0 2  &'   ~<@@W@\.`P\.\(0 2 \ . P ^\  @@W[W![W[W2![W2![WC2!,[W2![W[hW [<W2![W W@8~ PPWP48<@DH~L.`H.h! .`.`! .h.h.t.`.p.t.|ր.pqpN$.p.| .|x((lx! ( 2.t.`  !(hր.|x.tp0qp((q$.t .|sqp'( (&    .tp.|p  P.t! .`!.t xF p.p(P.p.x.p .|.p.|~LǎHǞDǮ@Ǿ<84PPW.p! !.t! .|WP<@DH~Ly   s  Rq(+p#X((p(psp.x~LǎHǞDǮ@Ǿ<PPW0+K "AC1!WAC$AhAC%hAC&hACWQWPX%AC1QCGxBBSD"vt ('"AC8('p'"$AC4$X$AhAC!FhAC" QP&#1qA@Aq@/@p/`/ #H / @ & /  ! / g `h`/ 0#.0/,@/0ȧN(..8. /,`/  FF=11=CCAM 0AMAP/,VA@/ E@/ p/}@.g/d``//  >  / /// @.p../#,/(0/(ְ/(zkg(P/$(VPp: w q&#,/(0/(<ְ/(@.p..@ekd,/$( .DA4.,/(0/(..ְ/( ֠/./$ ,/(0/(ְ/(Jkd(P/$(VP@:0D A&$ ,/(0/(,ְ/(.pTkg(/$( wq( ,/(0/(ְ/(     / ֠/./$ ,/(0/(ְ/(Jkd*P/$(VP@<0D A&$ ,/(0/($ְ/(. fp/p\kg,/$( .wq,.,/(0/(ְ/( ֠///#,/(0/(lְ/(Jkd*P/$(VP@< D A&#,/(0/(ְ/(H{ p   /$( @  F@ , 2 ! . 00  +   j  p.ؐ.ذ...W@ P(  WP@DH~Lr @D''!'. )7H) ~LǎHǞDǮ@PPW2!6[WPHx~Lp(,j~LǎHPPWPHx~Lp(,"~LǎHPPW`?8<@DH~Lp.ޠ//:T 2p/ p///p  :X ސ$ /Jp  C@:8 6p  : @$:@$ 1 P@$`^P5%cR:W^XP'86 0":B0C9"5 4r+!+ @$0:  ?05N?:@ 5p  5 @$0:  /( /( /:/( 0 &009 4 @$05p (  5(T/ &1/  &0   9( ~LǎHǞDǮ@Ǿ<8`/`W   ?  ?0 6    W6    WX<@DHLPҧ~TsRNW  ( ( D ٚ \ pױ@'(R (> )H     ,F   aP/\ +! (() )((  ' p@7! PBW  D ,,-V t ~TǎPǞLǮHǾD@<XXW0@ A#1 ! 1W @(#)cmp.c 6.1 87/11/23 rr%s %s differ: char %ld, line %ld %6ld %3o %3o usage: cmp [-l] [-s] file1 file2 cmp: cannot open %s cmp: EOF on %s  @(#)ctype.c 6.1 87/11/23 ((((( H @(#)mon.c 6.1 87/11/23 PROFDIRmon.out @(#)perror.c 6.1 87/11/23 : Unknown error @(#)data.c 6.1 87/11/23 0p0p0x2hBp@ @(#)filbuf.c 6.1 87/11/23 @(#)flsbuf.c 6.1 87/11/23 @(#)stdiom.h 6.1 87/11/23 @(#)fopen.c 6.1 87/11/23 @(#)fprintf.c 6.1 87/11/23 @(#)printf.c 6.1 87/11/23 Rx @(#)errlst.c 6.1 87/11/23     8 H ` l       !!!4!@!L!`!p!!!!!!!"""("@"P"\"t"""""###,#L#h#x.Error 0Not ownerNo such file or directoryNo such processInterrupted system callI/O errorNo such device or addressArg list too longExec format errorBad file numberNo child processesNo more processesNot enough spacePermission deniedBad addressBlock device requiredDevice busyFile existsCross-device linkNo such deviceNot a directoryIs a directoryInvalid argumentFile table overflowToo many open filesNot a typewriterText file busyFile too largeNo space left on deviceIllegal seekRead-only file systemToo many linksBroken pipeArgument out of domainResult too largeNo message of desired typeIdentifier removedChannel number out of rangeLevel 2 not synchronizedLevel 3 haltedLevel 3 resetLink number out of rangeProtocol driver not attachedNo CSI structure availableLevel 2 haltedDeadlock condition if locked @(#)getenv.c 6.1 87/11/23 @(#)isatty.c 6.1 87/11/23 @(#)malloc.c 6.1 87/11/23 000000000000000000000123456789abcdef0123456789ABCDEF @(#)findiop.c 6.1 87/11/23 @(#)dowrite.c 6.1 87/11/23 @(#)print.h 6.1 87/11/23 @(#)ecvt.c 6.1 87/11/23 Fn CAy7Aׄ@È@Y@$ @(#)fwrite.c 6.1 87/11/23 @(#)stdiom.h 6.1 87/11/23 @(#)memchr.c 6.1 87/11/23 u!h KG 8.textK .data 8 8L8@.bss,,G 0  !2$0  8" [WH@~DqP Q -J `>P( P H8 P  d(~Dǎ@HHW?DHLPT~XqΠ“)H d)8)(p W N( P 7 ' B r( P 7 ' Ǹ |( ,|7  !$ P  ܓ'T $' '0   P0'fP0 p d/P8P8P8P8P0\(t " >   P 7 &F P0/0P88P0  P0P8!P8P0P8 P0P0\' P P 0P0 4% P 0 T%z ڋ^`   nP0/:P86 P0 P8P8!P8P0P8 P0>`  @* P 0P0 p$ :P06  P0P@P@ ^P@h%t( P 7 $pP@%8XPH%  0 P 0PH #PPPP\% \ $  $4$,P@# PXPXP@,# P`P`(P@# PXPXPX" P 0PH ؓ"P`" P 0PH"PP P8:xP8P8P8P8P8P0p $ P0PhtPh Ph P8P(P8pP0p` P0p@P8#d 0& P H7!@Ph": 2( P 0P0d 8Ph" 2( P 0Ph P@ Ph! ( P 0P0 tP@"X * P 0P@ :~XǎTǞPǮLǾHDW@0P #ؓ<@@W@P@! " P 0P@@@Wp@DHX~Lp< * x ސ TP0P8px P0PP88Pp " P 9R pPp!LqPp" P 9 q !HqPpdPp|P  P (8/ $ P D9l4! P8 !pP0Pp* p~LǎHǞDǮ@ppW@~<P0P8p  P0PH*PHx PHP8~<@@W@8~<qq ! /xj /\'@ .( /'Tqq~<ǎ8@@WWp [B@8~     BG G!    g   ,Q"%(  D b j D p     ~@ǎ<HHWH<@~DpǐLJ D   p  p' (. (d   ~Dǎ@Ǟ<HHW8 ȧ~4p  *        |'Q!R D D p%  ' p7! ,~488W@8~<p  ( ppPQW؋( pp؋^*    p؋& ppPQW W @  ~<ǎ8@@WP pR a!` !WH@~Dq l~Dǎ@HHWH<@~Dr '$~Dǎ@Ǟ<HHWH<0@~Dr 0 (+R a(a( <r NwX   @   "    t  )r!  )a!"p  p~Dǎ@Ǟ<HHW@~<p.`W .`&0 2  &'  ~<@@W!![W![W2![W[W![jWA[W@[W[W! [:W2![$W2![WC2!,[W2![W[W [W![jW [TW2![8W8Ȏ"88W8Ȇ88W 1 W8Ȏ* 88WH ,@~D(p :p<<p<:" p<<<:pހ<q,p<~Dǎ@HHW8Ȏ"Г88W8Ȇ88W : W8Ȏ*ؓ 88WH >P<~@p pNX(pN\p : pD*  :.D 0p`aN`p : D* ^  :\D  .p`aNdNlpNppNtpNxpN\q,qNXpNh~@ǎ<HHWPT.>؍ PPWA~"t0As3r21~W0@ A#1 ! 1WpNNNNNǼO @P PPO$PpRUضPO$%py}kg,PO$(VP p:w]ѡ[q" ,O(0O(ְO(FpO@c(stdxX܋ `O d`O PO$([P  ,O(0O(<ְO(`O d`O (PO$[PQ̡P! ! ,O(0O(ְO(`O d`O 'Π- 8ы0):@0CAMр ѡ(PO$[P Q фP р}-!ш},O(0O(ְO(`O d`O / qфыh`O d`O / qфы4ONO`O csd(u$+\-` d#h.l*x0Āelh%ox0XeEfgGn9ld`O  Od`O @ O O "  !O`d`O }N; -!10N@@ V 8@  /  +!10N"  /  !10N @ /00 0ѡ $@ZPECѡMѡ pO }O uOO ^d`O } pq 5#"0ѡP n b V J@ O 6@ *Od`O O O d`O O @     0 9: @ O Oz OWC0_D0_D0d`O - Op&@ 4OO  a@ 'O -OO pX Oo620Nx 0 NN"XN  OO   @ / & O g `h`O O 0!#иN0O,@O0ȧN(N N8O0 - NND  5  + NN NNg ю 0ѡaPO P .aP6 QaP POPO ׶`OpO8gN 06PO,QPU):RECAaFSRQaVrgagaO,- +aea E`NrvpOOO #2#: @ / & O g `h`O O 0<#0O,@O0ȧN(N $N8O0`O PO,/Q)-0!-N! NB +N! N   N! NE00@qA0- '1qA@Aq@ `  .'qF<Ad &$ O OA@> QP&#1qA@Aq@O@pO`O #H O @ & O  ! O g `h`O 0#N0O,@O0ȧN(NN8N O,`O  FF=11=CCAM 0AMAPO,VA@O E@O pO}@NgOd``OO  >  O OOO @NpNN/X,O(0O(ְO(zkg(PO$(VPp: w q&X,O(0O(ְO(@NpNN@ekd,O$( NDA4N,O(0O(NDNְO( ֠ON/l,O(0O(ְO(Jkd(PO$(VP@:0D A&l,O(0O(ְO(NpTkg(O$( wq( ,O(0O(LְO(     / ֠ON/l,O(0O(ְO(Jkd*PO$(VP@<0D A&l,O(0O(ְO(N fpOp\kg,O$( Nwq,N,O(0O(,ְO( ֠OO/X,O(0O(ְO(Jkd*PO$(VP@< D A&X,O(0O(ְO(H{ p   O$( @  ~@ , 2 ! . 00  +    pNؐNذNNNW؋ (  W@~<p     W    ~<@@WP@DH~Lr @D''!' )7) ~LǎHǞDǮ@PPW2!6[ W0~@!$"$ d @!$"( !@+B $ @-$ 1@!$"$ D 0!*@0A$pAGDD@0 ~WPHx~Lp(,j~LǎHPPWPHx~Lp(,"~LǎHPPW`?8<@DH~Lp.ޠOO:T 2pO pOOOp  :X ސ` OJp  C@:8 6p  : @$:@$ 1 P@$`^P5%cR:W^XP'86 0":B0C9"5 4r+!+ @$0:  ?05N?:@ 5p  5 @$0:  O( O( O:O( 0 &009 4 @$05p (  5(TO &1O  &0   9( ~LǎHǞDǮ@Ǿ<8`O`W   ?  ?0 6    W6    WX<@DHLPҧ~TsRNW  ( ( D ۊ \ pױ'(R (> )X     ,6   aP/\ +! (() )((Ȏ  ' p7! @BW  D ,,- d ~TǎPǞLǮHǾD@<XXW@(#)cpset.c 6.1 87/11/23-o%s: Shouldn't be here... &h,/.//.//%s: unknown group-id '%s' %s: unknown user-id '%s' %s: badly formed mode '%s' %s: incorrect number of arguments %s: Can't access '%s' %s: Directory '%s' not found %s: Unexpected error %d %s: '%s' is not a directory /INStmpXXXXXXXX%s: couldn't open '%s' %s: couldn't create '%s' %s: warning: couldn't set modes on '%s' %s: warning: couldn't change user/group-id on '%s' /OLD/OLD%s: Could not unlink '%s' %s: Could not link in '%s' %s: Couldn't unlink '%s' %s: Couldn't link in '%s' %s: Couldn't unlink tmp '%s' %s: Usage: %s [-o] filename destination [mode [owner [group]]] %s: Couldn't unlink temporary file '%s' /rROOT/usr/src/destinations/usr/src/destinations/usr/src/destinations%s: error reading '%s', line > 256 characters--ignoring destination file %s: bad entry in '%s' -- ignoring destination file %s: warning: '%s' exists %s: bad entry in '%s' -- ignoring destination file / @(#)getenv.c 6.1 87/11/23 @(#)getgrnam.c 6.1 87/11/23 @(#)getpwnam.c 6.1 87/11/23 @(#)malloc.c 6.1 87/11/23 @(#)mktemp.c 6.1 87/11/23 @(#)mon.c 6.1 87/11/23 PROFDIRmon.out @(#)perror.c 6.1 87/11/23 : Unknown error @(#)strtol.c 6.1 87/11/23 @(#)data.c 6.1 87/11/23 QQQSc @(#)fgets.c 6.1 87/11/23 @(#)stdiom.h 6.1 87/11/23 @(#)filbuf.c 6.1 87/11/23 @(#)flsbuf.c 6.1 87/11/23 @(#)stdiom.h 6.1 87/11/23 @(#)fopen.c 6.1 87/11/23 @(#)fprintf.c 6.1 87/11/23 s @(#)ctype.c 6.1 87/11/23 ((((( H @(#)errlst.c 6.1 87/11/23  8D`t $8HXh|(4L`|$@P.Error 0Not ownerNo such file or directoryNo such processInterrupted system callI/O errorNo such device or addressArg list too longExec format errorBad file numberNo child processesNo more processesNot enough spacePermission deniedBad addressBlock device requiredDevice busyFile existsCross-device linkNo such deviceNot a directoryIs a directoryInvalid argumentFile table overflowToo many open filesNot a typewriterText file busyFile too largeNo space left on deviceIllegal seekRead-only file systemToo many linksBroken pipeArgument out of domainResult too largeNo message of desired typeIdentifier removedChannel number out of rangeLevel 2 not synchronizedLevel 3 haltedLevel 3 resetLink number out of rangeProtocol driver not attachedNo CSI structure availableLevel 2 haltedDeadlock condition if locked @(#)getgrent.c 6.1 87/11/23 rr/etc/group @(#)getpwent.c 6.1 87/11/23 rr/etc/passwd @(#)isatty.c 6.1 87/11/23 @(#)memccpy.c 6.1 87/11/23 @(#)memchr.c 6.1 87/11/23 000000000000000000000123456789abcdef0123456789ABCDEF @(#)findiop.c 6.1 87/11/23 @(#)rew.c 6.1 87/11/23 @(#)dowrite.c 6.1 87/11/23 @(#)print.h 6.1 87/11/23 @(#)atoi.c 6.1 87/11/23 @(#)ecvt.c 6.1 87/11/23 Fn CAy7Aׄ@È@Y@$ @(#)fwrite.c 6.1 87/11/23 @(#)stdiom.h 6.1 87/11/23 u!i% (x8.text .data88(8@.bss,,x 0  !2$0 8r1j[W` ` ` `"` `"` WPDH~Lq- W `$Xܶ`(XГVڲ`,ȶ`0` S(!  S(! Bh 6(! * 6(!  B f H V(!  V(!  v(! 0a#(! p`Waza aŒ*'0`0BC4$AhazaċR Ha‹< 0TX $'̓Lx/0aȓ? aē>abȓWb  @abȲbbzbbzbnbzbZbzbFbzbIbI~bc KV.czcczcczcczcc zc czcjc zc VczcBczc.` czc az JH-azRbz<J, hM Lbz$ 0cc  0c(c0P qc8azPc@  ,  (c^Vbz&  c\z0Lt& c\z"0cHcbcbR@dh" cbHċLbz$  c\z0L$ c\z"0cHcbc^ pbzp dh'Q" cbH4bzp8XmdhOazcbRcz cbGx>cb:qDzcH` ` (` `"c^` c`$` ` c^`"c`9c\bz.  c\z0L& c\z"0cHcbbz c  c(  ؋!(cb 6cb<c^ vqbzpdP cz2bzpbzp  'P" cbE4+ tM:cNcbL"0  cbDcX<pcX.  cb*$zTcz0c zcbb,cbH֋c zcbH zpa7V&z2bz&cb cbCcb  cb!2@/4cb6hbz &zb zz"cbaȓLr  ,( cb0aȓC4baȓNaȓ.cbaȓL 0 (@ cb0aȓB֋pcbaȓK,   s6aȓMqpraȓq.0 d aȓBN%8r4 ( cb0aȓB$bz:cNcbI"0  cbAcX,pcX  cbaȓ  cbJdh. cbAH Idl֐ pdh'J" cb@d 6'L" cb@(((_dhHazcbKb HpcNaȓH&"0  aȓ@pcXl  ahczaȓD@ q!(!$?"X~LǎHǞDPPW@0 d0?T" @@W@~  z" !  !0@R#1 & !@`$& !@ $ !!000qcbcH1c\cP cRcJcLcN` ` .` `"cX` cZ*` ` cX`"cZcTcN ` ` (` `"c^` c`$` ` c^`"c` cVbz ~<@@Wxlp~t֐ Ҁpz(,0 4z8 z <@cb/ zzD~HPcb  q8^LC|~tǎpǞlxxWh PcL^(PcN^,PcP^0PcR^4PcT^8PcV^׎&0 '7h$0 '6BcN>0  '6`$z8cP cR>0  @'6hcXcX  cTz4 |bȓ@czTb 0z`$z,@0  `'5czPcX b8cX b  (5NazBcL bʊ2cJ bzz" 50z cN z   cVcN cVz"= ǎ&0  '4r$0  '4Lp`(     BG G!     g   ,Q"%(  D b j D p     ~@ǎ<HHWH<@~DpǐLJ D   p  p' (. (   ~Dǎ@Ǟ<HHW8 ȧ~4p  *        |'Q!R D D p%  ' p7! ,~488W@8~<p  ( ppPXW( pp^*    p& ppPXW W @  ~<ǎ8@@WP pR a!` !WH@~Dq) l~Dǎ@HHWH<@~Dr '$~Dǎ@Ǟ<HHWH<0@~Dr 0 (+R a(a( <r NwX   @   "     t  )r!  )a!" h  p~Dǎ@Ǟ<HHW@~<p.`W .`&0 2  &'   ~<@@WP@DH~LB  p*7 yx   p0!b  , ~LǎHǞDǮ@PPWh?HLPTX`~\   r `d rd `p] ]st^(r p   ' ( <   p] X $&~\ǎXǞTǮPǾLHhhWP8<@D~Hq p߁]L8    Lxp]L~HǎDǞ@Ǯ<Ǿ8PPW@\.`P.\(0 2  .   @@WX?@DHLP~T` 2P&.$D  pס   րq 7d|x   p0!B*! D T  ~TǎPǞLǮHǾD@XXW@~<p     W    ~<@@W@\.`.\@@W@.` >`#@@WX@~D.x qώxTP.L뮧H@HU(t~Dǎ@XXWP.p0>@DH".L @.M.p.@@.DPPW!![jW [TW![:W2![ W[W![W. >$.;08[ԾW[B2!>[ ԌW[ vW![ VW/[W[W[W! ["W2![ W2![W2![W*[Ӻ.WC2!,[W2![xW[`W [4W!00[ WH .(N0n8@HPX` W`X .(N0n8Ɏ@ɮHPԩة>^觾[![bW<[PW [<W!["W[ . W2![WPT.> PPWA~"t0As3r21~Wp^^^^^Ǽ_ @P PP_$PpRUP_$%py}kg,P_$(VP p:w]ѡ[q" ,_(0_(ְ_(Fp_@c(stdxX܋ `_ d`_ P_$([P  ,_(0_(ְ_(`_ d`_ (P_$[PQ̡P! ! ,_(0_(ְ_(`_ d`_ 'Π- 8ы0):@0CAMр ѡ(P_$[P Q фP р}-!ш},_(0_(ְ_(`_ d`_ / qСфыh`_ d`_ / qфы4_^_`_ csd(u$+\-` d#h.l*x0Āelh%ox0XeEfgGn9ld`_  _d`_ @ _ _ "  !_`d`_ }^; -!10^@@ V 8@  /  +!10^"  /  !10^ @ /00 0ѡ $@ZPECѡMѡ p_ }_ u__ ^d`_ } pq 5#"0ѡP n b V J@ _ 6@ *_d`_ _ _ d`_ _ @     0 9: @ _ _z _WC0Ћ_D0_D0d`_ - _p&@ 4__  a@ '_ -__ pX Oo620^x 0 ^^"X^  __   @ / & _ g `h`_ _ 0!#и^0_,@_0ȧN(^l^8_0 - ^^D  5  + ^^ ^^g ю 0ѡaP_ P .aP6 QaP P_P_ ׶`_p_8g^ 06P_,QPU):RECAaFSRQaVrgaga_,- +aea E`^rvp___ #2#: @ / & _ g `h`_ _ 0<#0_,@_0ȧN(^^8_0`_ P_,/Q)-0!-^! ^B +^! ^   ^! ^E00@qA0- '1qA@Aq@ `  .'qF<Ad &$ _ _A@> QP&#1qA@Aq@_@p_`_ #H _ @ & _  ! _ g `h`_ 0#^0_,@_0ȧN(^^8^ _,`_  FF=11=CCAM 0AMAP_,VA@_ E@_ p_}@^g_d``__  >  _ ___ @^p^^/,_(0_(ְ_(zkg(P_$(VPp: w q&,_(0_(ְ_(@^p^^@ekd,_$( ^DA4^,_(0_(^^ְ_( ֠_^/,_(0_( ְ_(Jkd(P_$(VP@:0D A&,_(0_( |ְ_(^pTkg(_$( wq( ,_(0_( $ְ_(     / ֠_^/,_(0_( ְ_(Jkd*P_$(VP@<0D A&,_(0_( tְ_(^ fp_p\kg,_$( ^wq,^,_(0_( ְ_( ֠__/,_(0_( ְ_(Jkd*P_$(VP@< D A&,_(0_( `ְ_(H{ p   _$( @  @ , 2 ! . 00  +   ݺ  p^ؐ^ذ^^^WhLPTX\`~dpЩ.   d؄!0!#"(    % %X!! . ,  * ߎ ޠ l h  [ h  ΰl cf[^!0!#"(  cs [(~(^ *>h^,"~(^ *;^,h    ~dǎ`Ǟ\ǮXǾTPLhhWP8<@DHL~P~P^^^ϞT^^x^:d2pW^Q^ΰ L\ +!R  ->^Q^![RQ^ ^P v 0&  7W(!^Q^.^Q^e E|t^Q^d! + - Bh!s` T). 2 l.242# .242""7^P l$^PLh(^z ^P~PǎLǞHǮDǾ@<8W`<@DHLP~T~ XcsR[\RP^\*)bP!!0#.0#"( ^\P!+"  <nX  c ~TǎPǞLǮHǾD@<``WH<@~Dp^qV  $1 ]2 - qR Z -87#@]$*'B2 2# q q1 ]2~Dǎ@Ǟ<HHWH<@~Dp   pa(^a( 2r w4    ( "~   0+       ~Dǎ@Ǟ<HHW (  WP@DH~Lr @D''!'. )7 P)T ~LǎHǞDǮ@PPW ! ^ 0(,01  !W2!6[W`@DHLPT~XP^\0 #"( + "  -^\Q^\ p1@ΐ. ~Hΐ0 Aj0ސ ̈ *ސ ̈:zA@ސ ̈* ސ ̈:zpޠeΐ. TB 9Ȍ19#59'3( E e 0@ (@@0@ (@@ @+ @-1p@GDD@>@B*  p@GDD@0 p((,=:yp6p?qq5yqp(( K ?0@@A@ q5'@sA@  6! #;K;;#\ 2  ~XǎTǞPǮLǾHD@``WPHx~Lp(,j~LǎHPPWPHx~Lp(,"~LǎHPPW`?8<@DH~Lp.ޠ__:T 2p_ p___p  :X ސ _p  C@:8 6p  : @$:@$ 1 P@$`^P5%cR:W^XP'86 0":B0C9"5 4r+!+ @$0:  ?05N?:@ 5p  5 @$0:  _( _( _:_( 0 &009 4 @$05p (  5(T_ &1_  &0   9( ~LǎHǞDǮ@Ǿ<8`_`WP@D~Hr :  .LpL8" :GA5pp!`' pq90A@3 95pL1" P>5p(`pq91A 31906~HǎDǞ@PPW0 1 @4AW   ?  ?0 6    W6    WX<@DHLPҧ~TsRNW  ( ( D ɒ \ pױ'(R (> )ؘ     ,>   aP/\ +! (() )((  ' p7! HBW  D ,,-. l ~TǎPǞLǮHǾD@<XXWA0~: r:2rqrp?5p?:pprq3rp?:ppp:sp2~ǎW @(#)cpio.c 6.1 87/11/23 f       x%s wr/*cannot write in <%s> /dev/tty/dev/ttyCannot rename (/dev/tty missing) Options must include o|i|p Pass and Rename cannot be used together `B' option is irrelevant with the '-p' option <%s> ? Cannot read %s TRAILER!!!TRAILER!!!Cannot write %s Cannot chmod <%s> (errno:%d) Use `-d' option to copy <%s> Cannot link <%s> & <%s> (errno:%d) Cannot link <%s> & <%s> (errno:%d) Cannot create directory for <%s> (errno:%d) Cannot link <%s> & <%s> (errno:%d) Cannot chmod <%s> (errno:%d) <%s> ? Cannot read %s Cannot write %s Cannot chmod <%s> (errno:%d) %ld blocks Usage: cpio -o[acvB] collection %s %s cpio -i[cdmrstuvfB6VH] [pattern ...] ? %06o%06o%06o%06o%06o%06o%06o%06o%011lo%06o%011lo%s%6ho%6ho%6ho%6ho%6ho%6ho%6ho%6ho%11lo%6ho%11loOut of phase--get help Perhaps the "-c" option should be used TRAILER!!!Rename <%s> Skipped ..../Cannot create directory for <%s> (errno:%d) Cannot create directory <%s> (errno:%d) Cannot chmod <%s> (errno:%d) Cannot chown <%s> (errno:%d) cannot unlink current <%s> (errno:%d) current <%s> newer Attempt to pass file to self! Cannot create directory for <%s> (errno:%d) Cannot mknod <%s> (errno:%d) Cannot create directory for <%s> (errno:%d) Cannot create <%s> (errno:%d) %s linked to %s Cannot create directory for <%s> (errno:%d) Cannot link <%s> & <%s> (errno:%d) Too many links No memory for links %-7o%-6s%-6s%-6d%7ld %s %s *Cannot fork, try again /bin/mkdirmkdirrerrno: %d, Can't %s write outputread inputIf you want to go on, type device/file name when ready /dev/ttyThat didn't workmissing 'd' option rpwd../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../Cannot chdir (no `d' option) Cannot chdir - no write permission Cannot chdir P @(#)ctime.c 6.1 87/11/23 Day Mon 00 00:00:00 1900 SunMonTueWedThuFriSatJanFebMarAprMayJunJulAugSepOctNovDecTZp  PDTPSTW`/Lw/K:/JMFw/ @(#)getenv.c 6.1 87/11/23 @(#)getpwent.c 6.1 87/11/23 rr/etc/passwd @(#)getpwuid.c 6.1 87/11/23 @(#)malloc.c 6.1 87/11/23 @(#)memchr.c 6.1 87/11/23 @(#)mon.c 6.1 87/11/23 PROFDIRmon.out @(#)perror.c 6.1 87/11/23 : Unknown error @(#)strtol.c 6.1 87/11/23 @(#)data.c 6.1 87/11/23 hhp`h @(#)fgets.c 6.1 87/11/23 @(#)stdiom.h 6.1 87/11/23 @(#)filbuf.c 6.1 87/11/23 @(#)flsbuf.c 6.1 87/11/23 @(#)stdiom.h 6.1 87/11/23 @(#)fopen.c 6.1 87/11/23 @(#)fprintf.c 6.1 87/11/23 @(#)gets.c 6.1 87/11/23 @(#)stdiom.h 6.1 87/11/23 @(#)popen.c 6.1 87/11/23 -csh/bin/sh @(#)printf.c 6.1 87/11/23 @(#)puts.c 6.1 87/11/23 @(#)stdiom.h 6.1 87/11/23 @(#)rew.c 6.1 87/11/23 @(#)scanf.c 6.1 87/11/23 @(#)sprintf.c 6.1 87/11/23 p @(#)ctype.c 6.1 87/11/23 ((((( H @(#)errlst.c 6.1 87/11/23 0<Xl0@P`t ,DXt8H.Error 0Not ownerNo such file or directoryNo such processInterrupted system callI/O errorNo such device or addressArg list too longExec format errorBad file numberNo child processesNo more processesNot enough spacePermission deniedBad addressBlock device requiredDevice busyFile existsCross-device linkNo such deviceNot a directoryIs a directoryInvalid argumentFile table overflowToo many open filesNot a typewriterText file busyFile too largeNo space left on deviceIllegal seekRead-only file systemToo many linksBroken pipeArgument out of domainResult too largeNo message of desired typeIdentifier removedChannel number out of rangeLevel 2 not synchronizedLevel 3 haltedLevel 3 resetLink number out of rangeProtocol driver not attachedNo CSI structure availableLevel 2 haltedDeadlock condition if locked @(#)isatty.c 6.1 87/11/23 @(#)memccpy.c 6.1 87/11/23 000000000000000000000123456789abcdef0123456789ABCDEF @(#)doscan.c 6.1 87/11/23 ppppppppppppppppppppp @(#)fdopen.c 6.1 87/11/23 @(#)findiop.c 6.1 87/11/23 @(#)dowrite.c 6.1 87/11/23 @(#)print.h 6.1 87/11/23 @(#)ungetc.c 6.1 87/11/23 @(#)atof.c 6.1 87/11/23 @(#)ecvt.c 6.1 87/11/23 Fn CAy7Aׄ@È@Y@$ @(#)ldexp.c 6.1 87/11/23 @(#)memset.c 6.1 87/11/23 @(#)fwrite.c 6.1 87/11/23 @(#)stdiom.h 6.1 87/11/23 @(#)frexp.c 6.1 87/11/23 3u!i1 2H$.text2H .data2@.bss--$ 0  !2$0 "[W`?HLPTX~\0 ~0 \0N0 ,$d0 ,0 88ǨpH4Ƿ     | 8d*D c8& 8l8 N 0  0(0 d 00.08 0@0(00 0800@H 0 708(0@8,Г *vn 8 J 0  0(0 ` c900 08(8 \ 020(00 08 > 0 7088(0 <LB0( 0@ p0@2~\ǎXǞTǮPǾLH``WW0~@a!$"$ d @a!$"( !@+B $ @-$ 1@a!$"$ D 0!*@0A$paAGDD@0 ~Wp[B@8~     BG G!(    g   ,Q"%(  D b j D p     ~@ǎ<HHWH<@~DpǐLJ D   p  p' (. (   ~Dǎ@Ǟ<HHW8 ȧ~4p  *        |'Q!R D D p%  ' p7! ,~488W@8~<p  ( ppP0XW( pp ^*    p& ppP0XWW @  ~<ǎ8@@WP pR a!` !W@~<p.`W .`&0 2  &'   ~<@@W[W![W[W2!6[W2![WC2!,[W[hW [<W2![WWPT.> PPWP48<@DH~L.`H.h! .`.`! .h.h.t.`.p.t.|ր.pqpN$.p.| .|x((lx! ( 2.t.`  !(hր.|0.tp0qp((q$.t .|sqp'( (&    Z.tp.|p  P.t! .`!.t xF p.p(P.p.x.p .|.p.|~LǎHǞDǮ@Ǿ<84PPW.p! !.t! .|WP<@DH~Ly   s  Rq(+p#X((p(psp.x~LǎHǞDǮ@Ǿ<PPW0+K "AC1!WAC$AhAC%hAC&hACWQWPX%AC1QCGxBBSD"vt ('"AC8('p'"$AC4$X$AhAC!FhAC" QP&#1qA@Aq@/@p/`/ #H / @ & /  ! / g `h`/ 0#.0/,@/0ȧN(.Z.8. /,`/  FF=11=CCAM 0AMAP/,VA@/ E@/ p/}@.g/d``//  >  / /// @.p../!P,/(0/(Vְ/(zkg(P/$(VPp: w q&!P,/(0/(ְ/(@.p..@ekd,/$( .DA4.,/(0/(..ְ/( ֠/./!d,/(0/(Fְ/(Jkd(P/$(VP@:0D A&!d,/(0/(ְ/(.pTkg(/$( wq( ,/(0/(ְ/(     / ֠/./!d,/(0/(@ְ/(Jkd*P/$(VP@<0D A&!d,/(0/(ְ/(. fp/p\kg,/$( .wq,.,/(0/(tְ/( ֠///!P,/(0/(,ְ/(Jkd*P/$(VP@< D A&!P,/(0/(ְ/(H{ p   /$( @  @ , 2 ! . 00  +    p.ؐ.ذ...WP@DH~Lr @D''!' )70)\ ~LǎHǞDǮ@PPWPHx~Lp(,j~LǎHPPWPHx~Lp(,"~LǎHPPW`?8<@DH~Lp.ޠ//:T 2p/ p///p  :X ސ! /Jp  C@:8 6p  : @$:@$ 1 P@$`^P5%cR:W^XP'86 0":B0C9"5 4r+!+ @$0:  ?05N?:@ 5p  5 @$0:  /( /( /:/( 0 &009 4 @$05p (  5(T/ &1/  &0   9( ~LǎHǞDǮ@Ǿ<8`/`W   ?  ?0 6    W6    WX<@DHLPҧ~TsRNW  ( ( D J \ pױ'(R (> )X     ,   aP/\ +! (() )((  ' p7! BW  D ,,-V $ ~TǎPǞLǮHǾD@<XXW0@ A#1 ! 1W @(#)cmt.c 6.1 87/11/23 cmt-f-iTAPE/dev/rct/0nusage: cmt [ -f device ] command [ count ] ct: don't understand "%s" usage: cmt -i device init drive type usage: cmt -i device init drive type %s %s %d %d failedusage: cmt [ -f device ] command [ count ] ct: negative repeat count %s %s %d failedc"c"c$c!c&c#c'c%c%c8c9rtseodfsrfsfeofweoferaserewindretensioninitstatus @(#)atoi.c 6.1 87/11/23 @(#)ctype.c 6.1 87/11/23 ((((( H @(#)getenv.c 6.1 87/11/23 @(#)mon.c 6.1 87/11/23 PROFDIRmon.out @(#)perror.c 6.1 87/11/23 : Unknown error @(#)data.c 6.1 87/11/23 0h0h0p2`Bh @(#)flsbuf.c 6.1 87/11/23 @(#)stdiom.h 6.1 87/11/23 @(#)fprintf.c 6.1 87/11/23 Rp @(#)errlst.c 6.1 87/11/23 (8L`t0DXhx   0 L h x     .Error 0Not ownerNo such file or directoryNo such processInterrupted system callI/O errorNo such device or addressArg list too longExec format errorBad file numberNo child processesNo more processesNot enough spacePermission deniedBad addressBlock device requiredDevice busyFile existsCross-device linkNo such deviceNot a directoryIs a directoryInvalid argumentFile table overflowToo many open filesNot a typewriterText file busyFile too largeNo space left on deviceIllegal seekRead-only file systemToo many linksBroken pipeArgument out of domainResult too largeNo message of desired typeIdentifier removedChannel number out of rangeLevel 2 not synchronizedLevel 3 haltedLevel 3 resetLink number out of rangeProtocol driver not attachedNo CSI structure availableLevel 2 haltedDeadlock condition if locked @(#)isatty.c 6.1 87/11/23 @(#)malloc.c 6.1 87/11/23 000000000000000000000123456789abcdef0123456789ABCDEF @(#)dowrite.c 6.1 87/11/23 @(#)print.h 6.1 87/11/23 @(#)ecvt.c 6.1 87/11/23 Fn CAy7Aׄ@È@Y@$ @(#)fwrite.c 6.1 87/11/23 @(#)stdiom.h 6.1 87/11/23 @(#)memchr.c 6.1 87/11/23 u!iE ;x% .text;x .data  < @.bss--%& 0  !2$0  " z[WP@DH z~LqϡT0 \v|dR0(XP.n004L 0 08H0 0@l0Ht0P|z0XVNDB 0  B@ ΋0`! 0`^0`" 0`6r0`$ 0`J0`( 0`"0`  0` 0 !Xē nq10` 080hZ0h0h$ 08!Xԓ 0@0p0p0p$ 0@!X, 00(0x0x!X 80x000@0 0 !XT00000,0h0 0H0H0HՋ&0p!0P0P0P0!0 P0X0P0 0%\0` ,0 0(0h0 &00 f4 0`<p0 0 p0q'(ݓ0T0 R0000`   P000ր00qq0`*p$(((qpր00x00.0,p pW@0p00000p0 0 0 HH0@@W0   "1 2 0 W8 ȧ~40 p'*pQ 0( 9( k(  k( @b (  ( p * R b< w( w(  xpz~wvpyn0 p~488W80`az 0`AZ  88W0 00000(|0000W8 ȧ~4p  p0( p00Ћ4 H000Є00(0( 00~488W8 0`"  a  z  0`!  A  Z   0( xD \000 0((0D0 0(000 0(0( 88W8 0`"  a  z  0`!  A  Z   0( tD X000 0((0D0 0(000 0(0( 88W8 ȧ~4p&~488W@ 000!XX 000!Xl 0؆!!X @@Wp[BX?@DHLP~Tp-r-b 0 - p$- - --p  L 00p0-p q-  ( ^ ȓ   Ћ! 01'q2! 'q/ !' :Gq21304!:'q. ؆,/  H-- -P-q9(9#0@@5601 0- -)&~TǎPǞLǮHǾD@XXWH@~D&'p! pp&~ !"P  !!~Dǎ@HHW!21!0W! W!120W8 ȧ~4p!8.q&H(~488W@8~<pp ~W  < r &  ` ~<ǎ8@@W8 ȧ~4p T g "Q%(   ~488WH<΀ ~@q R  Bb p%8'(! ,>     BG G!    g   ,Q"%(  D b j D p     ~@ǎ<HHWH<@~DpǐLJ D   p%8  p%8' (. (|   ~Dǎ@Ǟ<HHW8 ȧ~4p  *        |'Q!R D D p%8%  ' p%87! ,~488W@8~<p  ( ppP0W%8( pp&@%8^,*    p%8& ppP0W%8W @  ~<ǎ8@@WP pR%8 a!` !W@~<p.`W .`&0 2  &'   ~<@@W[W![W!)[W[W2![tW2![XWC2!,[W2![(W[&W &[&&W!00[WH .(N0n8@HPX` W`X .(N0n8Ɏ@ɮHPԩة>^觾[2![W&W@8~ PPWP48<@DH~L.`H.h! .`.`! .h.h.t.`.p.t.|ր.pqpN$.p.| .|x((lx! ( 2.t.`  !(hր.|.tp0qp((q$.t .|sqp'( (&L   . .tp.|p  P.t! .`!.t xF p.p(P.p.x.p .|.p.|~LǎHǞDǮ@Ǿ<84PPW.p! !.t! .|WP<@DH~Ly   s  Rq(+p#X((p(psp.x~LǎHǞDǮ@Ǿ<PPW0+K "AC1!WAC$AhAC%hAC&hACWQWPX%AC1QCGxBBSD"vt ('"AC8('p'"$AC4$X$AhAC!FhAC" QP&#1qA@Aq@/@p/`/ #H / @ & /  ! / g `h`/ 0#.0/,@/0ȧN(.r.8. /,`/  FF=11=CCAM 0AMAP/,VA@/ E@/ p/}@.g/d``//  >  / /// @.p../+,/(0/(Vְ/(zkg(P/$(VPp: w q&+,/(0/(ְ/(@.p..@ekd,/$( .DA4.,/(0/(..ְ/( ֠/./+,/(0/(Fְ/(Jkd(P/$(VP@:0D A&+,/(0/(ְ/(.pTkg(/$( wq( ,/(0/(ְ/(     / ֠/./+,/(0/(@ְ/(Jkd*P/$(VP@<0D A&+,/(0/(ְ/(. fp/p\kg,/$( .wq,.,/(0/(tְ/( ֠///+,/(0/(,ְ/(Jkd*P/$(VP@< D A&+,/(0/(ְ/(H{ p   /$( @  @ , 2 ! . 00  +   2  p.ؐ.ذ...WP@DH~Lr @D''!'6 )7H)\ ~LǎHǞDǮ@PPW2!6[XWPHx~Lp(,j~LǎHPPWPHx~Lp(,"~LǎHPPW`?8<@DH~Lp.ޠ//:T 2p/ p///p  :X ސ,8 /Jp  C@:8 6p  : @$:@$ 1 P@$`^P5%cR:W^XP'86 0":B0C9"5 4r+!+ @$0:  ?05N?:@ 5p  5 @$0:  /( /( /:/( 0 &009 4 @$05p (  5(T/ &1/  &0   9( ~LǎHǞDǮ@Ǿ<8`/`W   ?  ?0 6    W6    WX<@DHLPҧ~TsRNW  ( ( D ۢ \ pױ%8'(R (> )߈     ,N   aP/\ +! (() )((  ' p%87! XBW  D ,,-V | ~TǎPǞLǮHǾD@<XXW0@ A#1 ! 1W @(#)dd.c 6.1 87/11/23 ibm,of=if=bs=ibs=obs=cbs=skip=seek=count=conv=ebcdicasciilcaseucaseswabnoerrorsyncdd: bad arg %s dd: cannot open %s dd: cannot create %s dd: counts cannot be zero dd: not enough memory dd read errordd write error%u+%u blocks in %u+%u blocks out %u truncated blocks     .<(+|&!$*);~-/,%_>?`:#@'="abcdefghijklmnopqr^stuvwxyz[]{ABCDEFGHI}JKLMNOPQR\STUVWXYZ01234567897-./% <=2&?'@Z{[lP}M]\Nk`Kaz^L~no|ཚmyO_ !"#$()*+, 013456 89:;>ABCDEFGHIQRSTUVWXYbcdefghipqrstuvwxjJ7-./% <=2&?'@Z{[lP}M]\Nk`Kaz^L~no|_myOС !"#$()*+, 01345689:;>ABCDEFGHIQRSTUVWXYbcdefghipqrstuvwx @(#)mon.c 6.1 87/11/23 PROFDIRmon.out @(#)perror.c 6.1 87/11/23 : Unknown error @(#)data.c 6.1 87/11/23 1112C%8 @(#)flsbuf.c 6.1 87/11/23 @(#)stdiom.h 6.1 87/11/23 @(#)fprintf.c 6.1 87/11/23 S @(#)errlst.c 6.1 87/11/23 ''''''(( (4(H(X(l(((((((()))()<)P)d)x)))))))* * *<*P*l*****++.Error 0Not ownerNo such file or directoryNo such processInterrupted system callI/O errorNo such device or addressArg list too longExec format errorBad file numberNo child processesNo more processesNot enough spacePermission deniedBad addressBlock device requiredDevice busyFile existsCross-device linkNo such deviceNot a directoryIs a directoryInvalid argumentFile table overflowToo many open filesNot a typewriterText file busyFile too largeNo space left on deviceIllegal seekRead-only file systemToo many linksBroken pipeArgument out of domainResult too largeNo message of desired typeIdentifier removedChannel number out of rangeLevel 2 not synchronizedLevel 3 haltedLevel 3 resetLink number out of rangeProtocol driver not attachedNo CSI structure availableLevel 2 haltedDeadlock condition if locked @(#)getenv.c 6.1 87/11/23 @(#)isatty.c 6.1 87/11/23 @(#)malloc.c 6.1 87/11/23 000000000000000000000123456789abcdef0123456789ABCDEF @(#)dowrite.c 6.1 87/11/23 @(#)print.h 6.1 87/11/23 @(#)ecvt.c 6.1 87/11/23 Fn CAy7Aׄ@È@Y@$ @(#)fwrite.c 6.1 87/11/23 @(#)stdiom.h 6.1 87/11/23 @(#)memchr.c 6.1 87/11/23 u!ih R (%.textR .data(R@.bss--% 0  !2$0 ȓ>j[W80 70@488W8:  88W@8~<p0(0(p "~<ǎ8@@W8P<88W(ا 0A ~  pӋ|h( bǗǰǗǰ@Ǘ$ǐǞ$Ǘ ǐǞ z(Ȉ e~ǎǞǮǾ ((W@48~<qp 9CǓpBB88BDŽD4~<ǎ8Ǟ4@@Wh<@~DpǁH4LL @ldx 'q!/p /p(q!Ջ-0 ~2j2V 2B20 0 1p0 h36h 1 10~Dǎ@Ǟ<hhWP?8<@DH~L{pr (*00,vLvpp00"qpp ~pq08p0@p00$H~LǎHǞDǮ@Ǿ<8PPW? ~0H0H0H080HQ60<,0@p 0Dp0P0P0P080HP0PF0<0H`0080@p 0Dpp0Xް0@ހ0`080H+p 0H 0P0I#$8*t~ǎǞǮ ǾW @~qpRpǙǨp,pǙǨp  pp^N8p@pCBDDApABpq8qpǁtHǔǁ8p~ǎǞǮ WXHLP~Tq-t' h(! h0b#(! \p@W0hD0h60p*`,Pp^4'yP0v0(2&0X 0`0\ 0d0D0x0X 0`00\@0dր0x#4(< 0x0dp0@0x00X 0`00#0 00`p\0`p00 0 0`00x@00#40x008p00p`00x08pZ0<p0B02H@~TǎPǞLǮHXXWp<@DHLP~Tp |W^X0^XU^hPhpqP^`X^ll 0q '^`pQ^ljp 0 n pP.l ^\pPX ^dnd^\^l`*.l p p ^hQp^hqp^XT^X~TǎP ǞLǮHǾD@<ppWH<@~Dr 088B080  p8~Dǎ@Ǟ<HHW@p~00! V0:pprtwր0|xwr 0'  rp~ǎW0~N 0H @, 08@0PR$ 0<E % Bp0#'4B 080 60H Q 00p%#!0 ~W`<@DHLP~Tp 400  0004q01ԧ2 0"0>p\"0q\ 000!!! 0000!2!!ΐ 04!!! 0404!2!!Π 0p    r  f00!!! 00&00!2!! ΐ   r  f04!!! 0404!2!! Π    *\ 0 !      $     0 0pq08'p$0hq0a00<! ~Dǎ@HHWXHLP~TsFH0h  Hhh@ a dc!  !h@ a dc!l1l 0h  hhB a dc   !h>@ a dcl l   hh h΋l!l0h@0000P)^(hn0h P 0004('0hh~TǎPǞLǮHXXWH<@~Dq x'~Dǎ@Ǟ<HHWP@D@H~Lsp xhDj` Z h! h $ ! h. l2! l !# 6!!ohh h l!l~LǎHǞDǮ@PPWP<@DH~Lp0pz< *x*l,(/` !! !!*(v02R0# )@40 #4(x*0Xr)(/`V  cz zz  czz~LǎHǞDǮ@Ǿ<PPW@ 1x(@@Wp  [BP48<@DH~L-H-! --! --.-... ր.qpN$..  . x((lx! ( 2.-  !(hր. .p0qp((q$. . sqp'( (&$    .p. p  P.! -!. xF p.(P... . .. ~LǎHǞDǮ@Ǿ<84PPW.! !.! . WP<@DH~Ly   s  Rq(+p#X((p(psp.~LǎHǞDǮ@Ǿ<PPW0+K "AC1!WAC$AhAC%hAC&hACWQWPX%AC1QCGxBBSD"vt ('"AC8('p'"$AC4$X$AhAC!FhAC"     BG G!     g   ,Q"%(  D b j D p     ~@ǎ<HHWH<@~DpǐLJ D   pX  pX' (. ( |   ~Dǎ@Ǟ<HHW8 ȧ~4p  *        |'Q!R D D pX%  ' pX7! ,~488W@8~<p  ( ppP0WX( pp`X^$*    pX& ppP0اWX W @  ~<ǎ8@@WP pRX a!` !WH@~DqT l~Dǎ@HHWH<@~Dr '$~Dǎ@Ǟ<HHWH<0@~Dr 0 (+R a(a( <r NwX   @   "   R t  )r!  )a!"  pX~Dǎ@Ǟ<HHW@~<p.`W .`&0 2  &'F  ~<@@W`DHLPTX~\q  *"(  D    pX   Ǘ  8І ρ  ' pX7! (0 @ p 0 *>  (<~\ǎXǞTǮPǾLHD``WP<@DH~Lp   W |tlǧ" !   40,'  W     )V  HW     ). ~LǎHǞDǮ@Ǿ<PPW@\.`Pt.\(0 2 t . ht  @@W!![W[W![W!;0[W[W2![W2![WC2!,[W2![XW[@W [W!00[WH .(N0n8@HPX` W`X .(N0n8Ɏ@ɮHPԩة>^觾[![BW [,W2![WW@8~ PPWA~"t0As3r21~Wp.....Ǽ/ @P PP/$PpRUXP/$%py}kg,P/$(VP p:w]ѡ[q" ,/(0/(Rְ/(Fp/@c(stdxX܋ `/ d`/ P/$([P  ,/(0/(ְ/(`/ d`/ (P/$[PQ̡P! ! ,/(0/(Pְ/(`/ d`/ 'Π- 8ы0):@0CAMр ѡ(P/$[P Q фP р}-!ш},/(0/(xְ/(`/ d`/ / q!фыh`/ d`/ / q!фы4/./`/ csd(u$+\-` d#h.l*x0Āelh%ox0XeEfgGn9ld`/  /d`/ @ / / "  !/`d`/ }.; -!10.@@ V 8@  /  +!10."  /  !10. @ /00 0ѡ $@ZPECѡMѡ p/ }/ u// ^d`/ } pq 5#"0ѡP n b V J@ / 6@ */d`/ / / d`/ / @     0 9: @ / /z /WC0!_D0!_D0!d`/ - /p&@ 4//  a@ '/ -// pX Oo620.x 0 .."X.  //   @ / & / g `h`/ / 0!#и.0/,@/0ȧN(. .8/0 - ..D  5  + .. ..g ю 0ѡaP/ P .aP6 QaP P/P/ ׶`/p/8g. 06P/,QPU):RECAaFSRQaVrgaga/,- +aea E`.rvp/// #2#: @ / & / g `h`/ / 0<#0/,@/0ȧN(..8/0`/ P/,/Q)-0!-.! .B +.! .   .! .E00@qA0- '1qA@Aq@ `  .'qF<Ad &$ / /A@> QP&#1qA@Aq@/@p/`/ #H / @ & /  ! / g `h`/ 0#.0/,@/0ȧN(..8. /,`/  FF=11=CCAM 0AMAP/,VA@/ E@/ p/}@.g/d``//  >  / /// @.p../!p,/(0/(ְ/(zkg(P/$(VPp: w q&!p,/(0/(<ְ/(@.p..@ekd,/$( .DA4.,/(0/(..ְ/( ֠/./!,/(0/(ְ/(Jkd(P/$(VP@:0D A&!,/(0/(,ְ/(.pTkg(/$( wq( ,/(0/(ְ/(     / ֠/./!,/(0/(ְ/(Jkd*P/$(VP@<0D A&!,/(0/($ְ/(. fp/p\kg,/$( .wq,.,/(0/(ְ/( ֠///!p,/(0/(lְ/(Jkd*P/$(VP@< D A&!p,/(0/(ְ/(H{ p   /$( @  @ , 2 ! . 00  +    p.ؐ.ذ...WX h(  WP@DH~Lr @D''!' )7H) ~LǎHǞDǮ@PPW2!6[WPHx~Lp(,j~LǎHPPWPHx~Lp(,"~LǎHPPW`?8<@DH~Lp.ޠ//:T 2p/ p///p  :X ސ"8 /Jp  C@:8 6p  : @$:@$ 1 P@$`^P5%cR:W^XP'86 0":B0C9"5 4r+!+ @$0:  ?05N?:@ 5p  5 @$0:  /( /( /:/( 0 &009 4 @$05p (  5(T/ &1/  &0   9( ~LǎHǞDǮ@Ǿ<8`/`W   ?  ?0 6    W6    WX<@DHLPҧ~TsRNW  ( ( D : \ pױX'(R (> )      ,   aP/\ +! (() )((~  ' pX7! BW  D ,,-V  ~TǎPǞLǮHǾD@<XXW0@ A#1 ! 1W @(#)diff.c 6.1 87/11/23 files too big, try -h /tmp/dXXXXXcannot create rcannot open /usr/lib/diffhcannot find diffharg countrrrr. > < ,,--- %d%s%dWarning: missing newline at end of file %s Warning: missing newline at end of file %s diff: %s%s X @(#)ctype.c 6.1 87/11/23 ((((( H @(#)malloc.c 6.1 87/11/23 @(#)mktemp.c 6.1 87/11/23 @(#)mon.c 6.1 87/11/23 PROFDIRmon.out @(#)perror.c 6.1 87/11/23 : Unknown error @(#)data.c 6.1 87/11/23 0002BX @(#)filbuf.c 6.1 87/11/23 @(#)flsbuf.c 6.1 87/11/23 @(#)stdiom.h 6.1 87/11/23 @(#)fopen.c 6.1 87/11/23 @(#)fprintf.c 6.1 87/11/23 @(#)fputs.c 6.1 87/11/23 @(#)stdiom.h 6.1 87/11/23 @(#)fseek.c 6.1 87/11/23 @(#)printf.c 6.1 87/11/23 R @(#)errlst.c 6.1 87/11/23 (8L`t0DXhx   0 L h x     .Error 0Not ownerNo such file or directoryNo such processInterrupted system callI/O errorNo such device or addressArg list too longExec format errorBad file numberNo child processesNo more processesNot enough spacePermission deniedBad addressBlock device requiredDevice busyFile existsCross-device linkNo such deviceNot a directoryIs a directoryInvalid argumentFile table overflowToo many open filesNot a typewriterText file busyFile too largeNo space left on deviceIllegal seekRead-only file systemToo many linksBroken pipeArgument out of domainResult too largeNo message of desired typeIdentifier removedChannel number out of rangeLevel 2 not synchronizedLevel 3 haltedLevel 3 resetLink number out of rangeProtocol driver not attachedNo CSI structure availableLevel 2 haltedDeadlock condition if locked @(#)getenv.c 6.1 87/11/23 @(#)isatty.c 6.1 87/11/23 @(#)memccpy.c 6.1 87/11/23 000000000000000000000123456789abcdef0123456789ABCDEF @(#)findiop.c 6.1 87/11/23 @(#)dowrite.c 6.1 87/11/23 @(#)print.h 6.1 87/11/23 @(#)ecvt.c 6.1 87/11/23 Fn CAy7Aׄ@È@Y@$ @(#)fwrite.c 6.1 87/11/23 @(#)stdiom.h 6.1 87/11/23 @(#)memchr.c 6.1 87/11/23 u!i \P &.text\P .data \@.bss==&+0 0  !2$0 ""[W? HLPTX~\p f!*8 ?!~ r cj m^HqT@ 4-J @ %@/*P@  ȋ  8` 0#Up4.$ %P.p /&p@('7G N(. 0. .,. @ .(.q s8R`)#dp$ $ |" !$ pq" $   -n@0 / $ (V $ C$ 8^~\ǎXǞTǮPǾLHWh@~Dp@0H/ԓ-BL  @!*@ ! > t `h4,0,֋,Ƌ|,T!zqz"0 # ,N.(@0 ,p&@0@8 .$B8<,<@D,ȓ !P 88pր!P:!P L+Ƌp!P B8!!P!!P@8  !P@8 #! ^!P B8!!P!@8!P 0;  {T+\t !P"@80(# l !PR"@80;#!PT !P2! !P#@8* !& !P0B82 !P"@80(#B !P2! !P#@8*!&  !P0B82| !P"@80)#@ !P2! !P#@8*!& > !P0B82( !P"@80{#d)‹!P6!P B8!\!P!!P@8P!P@8 c # Г t)F!P !PQρ@8 .n!0!P F(>:@80 "q@8( !P B8!P!P@8%!P@8 :Nj&!P!!PB8 P!P@8 ̆υ .h!0!P8ȓ'ڋ0@82 "q@8' '!Pf!P@8 B@8 @$@9 '0,'!P!P!P B8!L I 4&8B8@8 8D&T&8!P!!P@8  `&v !PB8Г&V\(~Dǎ@hhW DHLPTXȧ~\ H%t%^  ȶ@(p#:$  %% Lώ`` # > p&%(:$dq ! q4p$%(:$Z q ! s& h  l qp$% (:#΋~q ! !>(>(4F<(^<( 6=!Dx!8( ,    B (  N ҋq   . % @  'q!(% ("X`,1 ~\ǎXǞTǮPǾLHDW@ .<  h00$ x  d  `.<#"<@@WP<@D~H` `QP p@(Z %% %"% !%  B߁@8((!  (! p pWǧ     @ ' ! LL L Z  "@,L' ^(L' JL' !6 @ .L J :q'!OH%% %% %  ~HǎDǞ@Ǯ<PPW ~!P!PP!P@8 ކ!Pǩ p@8 q!@ AH@ A@ ! 8@8  { /!P ~ǎǞǮ W0 Ћ$!P!PB8 P!P@8 φ ʆ /@8*!PN!PP@8\!P!P!P!PB8 j!PP@8*@8/!PB8 &!P@8  00W!P!P!PB8 l!P!P@8 Ӌ&!P!PB8 *!P@8 !P@8#uW@8B@9h4 @:0"q !W 1@2~  ~t΀prw΀(xp&prw΀ xp~xLJprw΀;(΀;(:<΀.(ΐ%(Pyprw Ww΀:x< ΀?x0sp&prw΀ xprwzA0C .R n & NNNNNNuDG =>>> ր>qpN$>>  > x((lx! ( 2>=  !(hր> >p0qp((q$> > sqp'( (&|   ^ *>p> p  P>! =!> xF p>(P>>> > >> ~LǎHǞDǮ@Ǿ<84PPW>! !>! > WP<@DH~Ly   s  Rq(+p#X((p(psp>~LǎHǞDǮ@Ǿ<PPW0+K "AC1!WAC$AhAC%hAC&hACWQWPX%AC1QCGxBBSD"vt ('"AC8('p'"$AC4$X$AhAC!FhAC"r>b 0D>p$> > >>p  BHBHpBP>p q>  ( ^$ $! 01'q2! 'q/ !' :Gq21304!:'q.$,/  $>> >P>q9(9#0@@5601 0> >)N~TǎPǞLǮHǾD@XXWH@~D+8,p$Ȉ pp+` $"|  `$!P~Dǎ@HHW !  W!2! W!21!0W! W2!10B!0 W!120WX?@DHLP~Tr8     *8   ' p(7! ` ?  ~TǎPǞLǮHǾD@XXWH@~Dp W & !   D 6ހ$  @  *(  ! p!(!7  R   .   W    ~Dǎ@HHW8 ȧ~4p$.q*(~488W@8~<pp ~W  < r  >+8 p ~<ǎ8@@W8 ȧ~4p T g "Q%(   ~488WH<΀ ~@q R  Bb p('(! ,>     BG G!Ȏ    g   ,Q"%(  D b j D p     ~@ǎ<HHWH<@~DpǐLJ D   p(  p(' (. (D   ~Dǎ@Ǟ<HHW8 ȧ~4p  *        |'Q!R D D p(%  ' p(7! ,~488W@8~<p  ( ppPBXW(( pp*(^<*    p(& ppPBXW(^W @  ~<ǎ8@@WP pR( a!` !WH@~Dq!d l~Dǎ@HHWH<@~Dr '$~Dǎ@Ǟ<HHWH<0@~Dr 0 (+R a(a( <r NwX   @   "    t  )r!  )a!"P  p(~Dǎ@Ǟ<HHW@~<p.`W .`&0 2  &'  ~<@@W@\.`P%.\(0 2 % . %%  @@W@\.`.\$ @@W@.` >`#@@WX@~D.x qώxTP.LnH@HU(|~Dǎ@XXW[8W![W[W2![W2![WC2!,[W2![W[+0W +0[l+0+0W![BW![*W2![W+8W@8~ PPWA~"t0As3r21~Wp>>>>>Ǽ? @P PP?$PpRU(P?$%py}kg,P?$(VP p:w]ѡ[q" ,?(0?(ְ?(Fp?@c(stdxX܋ `? d`? P?$([P  ,?(0?( ְ?(`? d`? (P?$[PQ̡P! ! ,?(0?(ְ?(`? d`? 'Π- 8ы0):@0CAMр ѡ(P?$[P Q фP р}-!ш},?(0?(ְ?(`? d`? / q08фыh`? d`? / q0Hфы4?>?`? csd(u$+\-` d#h.l*x0Āelh%ox0XeEfgGn9ld`?  ?d`? @ ? ? "  !?`d`? }>; -!10>@@ V 8@  /  +!10>"  /  !10> @ /00 0ѡ $@ZPECѡMѡ p? }? u?? ^d`? } pq 5#"0ѡP n b V J@ ? 6@ *?d`? ? ? d`? ? @     0 9: @ ? ?z ?WC008_D00H_D008d`? - ?p&@ 4??  a@ '? -?? pX Oo620>x 0 >>"X>  ??   @ / & ? g `h`? ? 0!#и>0?,@?0ȧN(>d>8?0 - >>D  5  + >> >>g ю 0ѡaP? P .aP6 QaP P?P? ׶`?p?8g> 06P?,QPU):RECAaFSRQaVrgaga?,- +aea E`>rvp??? #2#: @ / & ? g `h`? ? 0<#0?,@?0ȧN(>>8?0`? P?,/Q)-0!->! >B +>! >   >! >E00@qA0- '1qA@Aq@ `  .'qF<Ad &$ ? ?A@> QP&#1qA@Aq@?@p?`? #H ? @ & ?  ! ? g `h`? 0#>0?,@?0ȧN(>z>8> ?,`?  FF=11=CCAM 0AMAP?,VA@? E@? p?}@>g?d``??  >  ? ??? @>p>>/0,?(0?( ְ?(zkg(P?$(VPp: w q&0,?(0?( ְ?(@>p>>@ekd,?$( >DA4>,?(0?(> >ְ?( ֠?>/0$,?(0?( ְ?(Jkd(P?$(VP@:0D A&0$,?(0?( tְ?(>pTkg(?$( wq( ,?(0?( ְ?(     / ֠?>/0$,?(0?( ְ?(Jkd*P?$(VP@<0D A&0$,?(0?( lְ?(> fp?p\kg,?$( >wq,>,?(0?( ְ?( ֠??/0,?(0?( ְ?(Jkd*P?$(VP@< D A&0,?(0?( Xְ?(H{ p   ?$( @  @ , 2 ! . 00  +   B  p>ؐ>ذ>>>WhLPTX\`~dpЩ.   "qd !0"q!#"(    % %Xߘ!! . $  * "qߎ ޠ l h  [ h  "qΰl cf[^ބ!0"q!#"( cs [(~(^ *>h^,"~(^ *;^,h    ~dǎ`Ǟ\ǮXǾTPLhhWP8<@DHL~P~P^^^ϞT^^x^:d2p0xW^Q^ΰ L +!R  ->^Q^܌![RQ^ "q^P v "q0& "q 7W(!^Q^.^Q^e E|t^Q^dT! "q+ - B!s` T). 2 l.242# .242""7^P l$^PLh(^z ^P~PǎLǞHǮDǾ@<8W`<@DHLP~T~ XcsR[\RP^\*)b!!0#.0"q#"( ^\P!+"  4nX  c ~TǎPǞLǮHǾD@<``WH<@~Dp^qV Ҵ1 ]2 - qR Z -87#@]$*'B2 2#Rq q1 ]2~Dǎ@Ǟ<HHW$ *(  WP@DH~Lr @D''!'ݾ )7 ) ~LǎHǞDǮ@PPW ! ^ 0(,01  !W2!6[0W`@DHLPT~XP^\0"q #"( + "  -^\Q^\ p1@ΐ. ~Hΐ0 Aj0ސ ̈ *ސ ̈:zA@ސ ̈* ސ ̈:zpޠ"qeΐ. TB 9Ȍ19#59'3( E e 0@ (@@0@ (@@ @+ @-1p"q@GDD@>@B*  p"q@GDD@0 p1p1p,=:yp6p?qq5yq1(1p K ?0@@A@ q5'@sA@  6! #;K;;#\ 2  ~XǎTǞPǮLǾHD@``WPHx~Lp(,j~LǎHPPWPHx~Lp(,"~LǎHPPW`?8<@DH~Lp.ޠ??:T 2p? p???p  :X ސ1 ?p  C@:8 6p  : @$:@$ 1 P@$`^P5%cR:W^XP'86 0":B0C9"5 4r+!+ @$0:  ?05N?:@ 5p  5 @$0:  ?( ?( ?:?( 0 &009 4 @$05p (  5(T? &1?  &0   9( ~LǎHǞDǮ@Ǿ<8`?`WP@D~Hr :  .LxpL8"+8:GA5pp!`' pq90A@3 95pL1"+8P>5p(`pq91A 31906~HǎDǞ@PPW   ?  ?0 6    W6    WX<@DHLPҧ~TsRNW  ( ( D R \ pױ('(R (> )     ,   aP/\ +! (() )((®  ' p(7! BW  D ,,- , ~TǎPǞLǮHǾD@<XXWA0~: r:2rqrp?5p?:pprq3rp?:ppp:sp2~ǎW0@ A#1 ! 1W @(#)file.c 6.1 87/11/23 %s%s rcf:m:cannot open %s usage: file [-c] [-f ffile] [-m mfile] file... level off type opcode value string %d %d %d %d %lo subst%s:%s cannot open characterdirectory fifo block special (%d/%d) cannot open for reading empty sccs data c program textc program textfortran program textassembler program text[nt]roff, tbl, or eqn input textassembler program text[nt]roff, tbl, or eqn input textassembler program texttroff output data commands textEnglish textascii text with garbage rno memory for magic table cannot open magic file <%s>. fmt error, no tab after %son line %d fmt error, no tab after %son line %d fmt error, no tab after %son line %d file: magic tab overflow - increase NENT in file.c. %lo%lx%ldn|!t!!!!!!!!!!p!l!h!d!`!\!!!!!!"" ""!X"$bssintjmpclrtstmovsys/etc/magicfunctionsubroutinecommondimensionblockintegerrealdatadoublecharfloatdoublestructexterngloblbyteeventextdatacomm @(#)calloc.c 6.1 87/11/23 @(#)ctype.c 6.1 87/11/23 ((((( H @(#)getopt.c 6.1 87/11/23 --: illegal option -- : illegal option -- : option requires an argument -- : option requires an argument --  @(#)malloc.c 6.1 87/11/23 @(#)memset.c 6.1 87/11/23 @(#)mon.c 6.1 87/11/23 PROFDIRmon.out @(#)perror.c 6.1 87/11/23 : Unknown error @(#)data.c 6.1 87/11/23 BhBhBpD`Th( @(#)fgets.c 6.1 87/11/23 @(#)stdiom.h 6.1 87/11/23 @(#)filbuf.c 6.1 87/11/23 @(#)flsbuf.c 6.1 87/11/23 @(#)stdiom.h 6.1 87/11/23 @(#)fopen.c 6.1 87/11/23 @(#)fprintf.c 6.1 87/11/23 @(#)printf.c 6.1 87/11/23 @(#)scanf.c 6.1 87/11/23 dp @(#)errlst.c 6.1 87/11/23 , ,(,4,P,`,x,,,,,,---(-4-L-X-d-x-------...0.@.X.h.t.....///(/D/d//.Error 0Not ownerNo such file or directoryNo such processInterrupted system callI/O errorNo such device or addressArg list too longExec format errorBad file numberNo child processesNo more processesNot enough spacePermission deniedBad addressBlock device requiredDevice busyFile existsCross-device linkNo such deviceNot a directoryIs a directoryInvalid argumentFile table overflowToo many open filesNot a typewriterText file busyFile too largeNo space left on deviceIllegal seekRead-only file systemToo many linksBroken pipeArgument out of domainResult too largeNo message of desired typeIdentifier removedChannel number out of rangeLevel 2 not synchronizedLevel 3 haltedLevel 3 resetLink number out of rangeProtocol driver not attachedNo CSI structure availableLevel 2 haltedDeadlock condition if locked @(#)getenv.c 6.1 87/11/23 @(#)isatty.c 6.1 87/11/23 @(#)memccpy.c 6.1 87/11/23 000000000000000000000123456789abcdef0123456789ABCDEF @(#)doscan.c 6.1 87/11/23 JlJbJbJbJJJJJJJJtJJJJJJlJJJ| @(#)findiop.c 6.1 87/11/23 @(#)dowrite.c 6.1 87/11/23 @(#)print.h 6.1 87/11/23 @(#)ungetc.c 6.1 87/11/23 @(#)atof.c 6.1 87/11/23 @(#)ecvt.c 6.1 87/11/23 Fn CAy7Aׄ@È@Y@$ @(#)ldexp.c 6.1 87/11/23 @(#)fwrite.c 6.1 87/11/23 @(#)stdiom.h 6.1 87/11/23 @(#)frexp.c 6.1 87/11/23 @(#)memchr.c 6.1 87/11/23 u!i kP(R( .textkP .data  (k@.bss* * R(0 0  !2$0  "%[WP@DH~LpP ? 4 08rP((-^9  87$P(, !P(pPPs  P7t$<P`P PpbR -F% ,+*P Pp (+ $PP P{ J x6#rPq 6#NPP Pހ $pPȓ+<P /P(;P/+|p\PȆPȋ  :  5"/  PP*QȓPPPQІ$P ̓*TQ"~LǎHǞDǮ@PPW@~<p  ؓ)DQQ ~ . H"PPP~<@@WH@~D 8p ).FQQ  . ~ (8 ($ -, (PPjPPP~Dǎ@HHW@Q 3^ &QQ  (6 &\ . & PP!P@@WH<@~D | ('r:QQdp L $'B ,'(,  .  4&4| . nHp +q <&, ا~ .  D&TD p   . ȋ L&D    . tN T%D Ч   .   \%X,  dt, x` LD p$   . |V /   . 4 $lD    .  $  4, Г  ܓ D   . < .h:  . #,DH   .  + -qqW)cR R  "Dd   . ",`&W -p 0q  . \!  d@h  b`P  c 8  p   f . ʋ$!PPρ  . jD  PPρ   .  , D0rQЍ 4'+B 1ԶV1ĶVV . lFL/QЍ T'*j14V1$VضVVV . lhQؓ1 t')QV  . F ()r~Dǎ@Ǟ<HHWPR0%,2R%,R RR RW8PȎS)PP$PQPP$PpPP88W8 ȧ~4p W'W ~488W8 ȧ~4p W'W ~488W8 W8V8W8 Q88W8Pȓ*j88W@P Q0 Q @@W@P Q0 Q f@@W@P Q0 Q "@@W@@Q0!@@W@0Q @@WQRW@Q0 zp@@W@Q0  4@@W@0Q @@W -!  Q ! !R WQ RW8 ȧ~4p(~488WPDH~Lp Pp!0Pȓ$ȓB!!y!T,@! ~LǎHǞDPPWVVVVVVVWWHPȧ<觎@"~DPʋ PW,qWW.WQWQW QزWQڲWQܲWQ޲W QWVV,QVVWVW(QVVWVWW  QVV&VVWVW"VVWVWV؆  >WV؆& Wz0L Wz W pV؆V tV qzϋWZNV؆$ Wz0L Wz W 4(Q&" W V؆& Wz0L Wz W W pV؆VЋ V'&" W 0V؆V V y$~Dǎ@Ǟ<HHWxlp~t֐ҀQQpz(Qܧ,Q0Q4Qz8Qz <Q@W( zzD~HPW  q8^L#h~tǎpǞlxxWQVPW0  @+$P" - P RWH<@~Dpp*RdT`qp Pȷ!* qp* Ppǁp !* p  h#t*%n2P("~* * '  R* ~Dǎ@Ǟ<HHW8  ~4p!  np p~488Wh<@DHLѧP§~TP ^`Qا^X$0 t+t  WQ  @  W2{q ! /q~dQ }+֠Q  X+   q`Jp!v`+X: ` !&`X'! +^`Z`P^`ώXs\4 .   .ldqq /!(20Gq!4  ^d4^d ,QȓN^\Q^\\I}` ~d^XQl P/0 Pȧdh`^dP eP(zPȓn t<^dP/e4 Qؓ 0-( W~TǎPǞLǮHǾD@<hhWH8<@~Dq 'q 0?(100?(10. 0(100(10 j0*h0[\G0 !Bq@ BΠ]J"@D@ BΠ-JF)(0G q($  0G q($ D9*0 2  2#0 0 2  2#0'q@ B@9| p"H L<V4     ~Dǎ@Ǟ<Ǯ8HHWH@~DVqsq~ЎXQV XQ:QЋ VX X (!qV~Dǎ@HHWH@~DVq؎XQV QvQЋVX X (!qV~Dǎ@HHW<@~Dq T dDHL   p@j) j jj :Z jJ $0 h^~Dǎ@Ǟ<W0~@)!$"$ d @)!$"( !@+B $ @-$ 1@)!$"$ D 0!*@0A$p)AGDD@0 ~Wp "[B8ȧTT.X88W0<@DH~Lqx ހ /Pp.P P8pPW dtPP!9TX"@B8r!4CA@P8Hq%( 6fP)  8~LǎHǞDǮ@Ǿ<W0~s@1tC@ p:G @ /$A B!  1~W@8~     BG G!     g   ,Q"%(  D b j D p     ~@ǎ<HHWH<@~DpǐLJ D   p  p' (. ( 4   ~Dǎ@Ǟ<HHW8 ȧ~4p  *        |'Q!R D D p%  ' p7! ,~488W@8~<p  ( ppPZ0W( pp^<*    p& ppPZ0WW @  ~<ǎ8@@WP pR a!` !WH@~Dq-T l~Dǎ@HHWH<@~Dr '$~Dǎ@Ǟ<HHWH<0@~Dr 0 (+R a(a( <r NwX   @   "    t  )r!  )a!"0  p~Dǎ@Ǟ<HHW@~<p.`W .`&0 2  &'>  ~<@@Wh?HLPTX`~\   r `d rd `p+ +st,(r p   '& ȧ( <   p+ H (~\ǎXǞTǮPǾLHhhWP8<@D~Hq 0p߁+Ll8    LdZPp+L~HǎDǞ@Ǯ<Ǿ8PPWX?@DHLP~T` 2P&.$D  pס   րq 7 |x   p0!B*! D   ~TǎPǞLǮHǾD@XXWP.p0>@DH".L @.M.p.@.DPPW [W[W![W. >$.;0 [W!;0 [W[B2!>[ dW[ NW![ .W[W2![ W2![W[W*[.WC2!,[W2![W[p0W 0[D00W!00[WH .(N0n8@HPX` W`X .(N0n8Ɏ@ɮHPԩة>^觾[![rW [W[:. W2![W8W8Ȏ"Гʶ#X88W8Ȇ88W 1 W8Ȏ*ؓ 88WH ,@~D@p :p<<p<:" p~<<<:pހ<q,p<~Dǎ@HHW8$Ȏ"(Ҷ$$!`88W8$Ȇ$88W : W8$Ȏ*($ $88WH >0<~@0p pN8(pN<p : pD* R  :.D 0p`aN@p : D* 4  :$D  .p`aND NLpNPpNTpNXpN<q,qN8pNH~@ǎ<HHWPT.> PPWP48<@DH~LN`HNh! N`N`! NhNhNtN`NpNtN|րNpqpN$NpN| N|x((lx! ( 2NtN`  !(hրN|Ntp0qp((q$Nt N|sqp'( (&   v BNtpN|p  PNt! N`!Nt xF pNp(PNpNxNp N|NpN|~LǎHǞDǮ@Ǿ<84PPWNp! !Nt! N|WP<@DH~Ly   s  Rq(+p#((p(pspNx~LǎHǞDǮ@Ǿ<PPWA~"t0As3r21~W0@ A#1 ! 1W0+K "AC1!WAC$AhAC%hAC&hACWQWPX%AC1QCGxBBSD"vt ('"AC8('p'"$AC4$X$AhAC!FhAC" QP&#1qA@Aq@O@pO`O #H O @ & O  ! O g `h`O 0#N0O,@O0ȧN(N2N8N O,`O  FF=11=CCAM 0AMAPO,VA@O E@O pO}@NgOd``OO  >  O OOO @NpNN/,O(0O(ְO(zkg(PO$(VPp: w q&,O(0O(ְO(@NpNN@ekd,O$( NDA4N,O(0O(NLNְO( ֠ON/,O(0O(ְO(Jkd(PO$(VP@:0D A&,O(0O(ְO(NpTkg(O$( wq( ,O(0O(TְO(     / ֠ON/,O(0O(ְO(Jkd*PO$(VP@<0D A&,O(0O(ְO(N fpOp\kg,O$( Nwq,N,O(0O(4ְO( ֠OO/,O(0O(ְO(Jkd*PO$(VP@< D A&,O(0O(ְO(H{ p   O$( @  @ , 2 ! . 00  +     pNؐNذNNNWH<@~Dp   pa(^a( 2r w4    ( "   0+       ~Dǎ@Ǟ<HHW (  W@~<p>  "   W    ~<@@WP@DH~Lr @D''!'V )7H) ~LǎHǞDǮ@PPW2!6[0WPHx~Lp(,j~LǎHPPWPHx~Lp(,"~LǎHPPW`?8<@DH~Lp.ޠOO:T 2pO pOOOp  :X ސ  OJp  C@:8 6p  : @$:@$ 1 P@$`^P5%cR:W^XP'86 0":B0C9"5 4r+!+ @$0:  ?05N?:@ 5p  5 @$0:  O( O( O:O( 0 &009 4 @$05p (  5(TO &1O  &0   9( ~LǎHǞDǮ@Ǿ<8`O`W   ?  ?0 6    W6    WX<@DHLPҧ~TsRNW  ( ( D  \ pױ'(R (> )`     ,n   aP/\ +! (() )((ߦ  ' p7! xBW  D ,,- Ȝ ~TǎPǞLǮHǾD@<XXW @(#)find.c 6.1 87/11/23 /!(rpwdCannot execute `pwd' Usage: find path-list predicate-list find: parsing error find: missing conjunction find: bad starting directory TRAILER!!!-o-o!(-a!find: operand follows operand ;-ok;)(-print-depth-name-mtime-atime-ctime-user[0-9][0-9][0-9]*[0-9][0-9][0-9]find: cannot find -user name -inum-group[0-9][0-9][0-9]*[0-9][0-9][0-9]find: cannot find -group name -size-links-perm-type-exec-cpiofind: cannot create %s -ncpiofind: cannot create %s -newerfind: cannot access %s find: bad option %s find: incomplete statement < %s ... %s >? ./TRAILER!!!find: cannot copy %s Cannot read %s %.6ho%.6ho%.6ho%.6ho%.6ho%.6ho%.6ho%.6ho%.11lo%.6ho%.11lo%s{};/...find: bad status-- %s Pathname too longHuge directory %s --call administrator find: cannot chdir to %s find: cannot open %s find: cannot read %s find: bad directory tree cannot stat %s rfind: can't %s write outputread inputIf you want to go on, type device/file name when ready /dev/ttyThat didn't workX(  @(#)atoi.c 6.1 87/11/23 @(#)ctype.c 6.1 87/11/23 ((((( H @(#)execvp.c 6.1 87/11/23 '&'''''|shPATH:/bin:/usr/bin/bin/sh @(#)getenv.c 6.1 87/11/23 @(#)getgrnam.c 6.1 87/11/23 @(#)getpwnam.c 6.1 87/11/23 @(#)mon.c 6.1 87/11/23 PROFDIRmon.out @(#)perror.c 6.1 87/11/23 : Unknown error @(#)sleep.c 6.1 87/11/23 @(#)data.c 6.1 87/11/23 Z@Z@ZH\8l@ @(#)fgets.c 6.1 87/11/23 @(#)stdiom.h 6.1 87/11/23 @(#)filbuf.c 6.1 87/11/23 @(#)flsbuf.c 6.1 87/11/23 @(#)stdiom.h 6.1 87/11/23 @(#)fopen.c 6.1 87/11/23 @(#)fprintf.c 6.1 87/11/23 @(#)popen.c 6.1 87/11/23 -csh/bin/sh @(#)puts.c 6.1 87/11/23 @(#)stdiom.h 6.1 87/11/23 @(#)sprintf.c 6.1 87/11/23 |H @(#)errlst.c 6.1 87/11/23  (4P`x(4LXdx0@Xht(Dd.Error 0Not ownerNo such file or directoryNo such processInterrupted system callI/O errorNo such device or addressArg list too longExec format errorBad file numberNo child processesNo more processesNot enough spacePermission deniedBad addressBlock device requiredDevice busyFile existsCross-device linkNo such deviceNot a directoryIs a directoryInvalid argumentFile table overflowToo many open filesNot a typewriterText file busyFile too largeNo space left on deviceIllegal seekRead-only file systemToo many linksBroken pipeArgument out of domainResult too largeNo message of desired typeIdentifier removedChannel number out of rangeLevel 2 not synchronizedLevel 3 haltedLevel 3 resetLink number out of rangeProtocol driver not attachedNo CSI structure availableLevel 2 haltedDeadlock condition if locked @(#)getgrent.c 6.1 87/11/23 rr/etc/group @(#)getpwent.c 6.1 87/11/23 rr/etc/passwd @(#)isatty.c 6.1 87/11/23 @(#)malloc.c 6.1 87/11/23 @(#)memccpy.c 6.1 87/11/23 @(#)memchr.c 6.1 87/11/23 @(#)strtol.c 6.1 87/11/23 000000000000000000000123456789abcdef0123456789ABCDEF @(#)fdopen.c 6.1 87/11/23 @(#)findiop.c 6.1 87/11/23 @(#)rew.c 6.1 87/11/23 @(#)dowrite.c 6.1 87/11/23 @(#)print.h 6.1 87/11/23 @(#)ecvt.c 6.1 87/11/23 Fn CAy7Aׄ@È@Y@$ @(#)fwrite.c 6.1 87/11/23 @(#)stdiom.h 6.1 87/11/23 u!i Gd.textG .dataH@.bssd` 0  !2$0  "[Wh48<@DH~LP^dpzz4z )F^S^`ܶ (P\ 0^p 0 0( 2y*p\p {dz.8R  R$ *\b[P \<F  $^dP  dPe  ( 2JС ѡ y^ ypz1 -pRNy] V  s  ! | s  ! y]q 0 0 #  y)&  ($n { ( + ^`Q^` ( (  (!Sn`( (܂* b^`Q^`^\Q^\^dPhdPe y09p  Ћ y\ ,p  ,p> , y\ b }- R (  . v$ zH1@9p8n\1pg $p"dp~LǎHǞDǮ@Ǿ<84hhWH<@~Dp 0p 8vD' "pp 8<q,Dp 8q~Dǎ@Ǟ<HHWP<@DH~Lp (! "(! pW $ ` %(q!nq VBp @4q s! @pq&pqq* ! q*! qzq <! q ! q0q s!  ! 0q s!  ! qXpR׵ץ * zFXpR׵ץz * z(qN(q4q s!  Hq'q &D ( @~LǎHǞDǮ@Ǿ<PPW N  WPDH~Lp?Đ vbp W P P X Xx ` `d h hP p p< x x(      p 0#! pq h x ^Pppu  R) 0ǘ L   !0RqpbLq! !V~LǎHǞDPPWP@DH~LH!J  !. ph )!t!!! 0 P!Q0@ %0 @!! TpPޠ0&  q!pP p0 v  P  & !0!!  X: X )Z !X ȓB~LǎHǞDǮ@PPW@ ! ! X!! xX ԓ X Г h6! !X ؓ^ ` !X <@!*!0 !00X(@@W@~<ph ,' !&L . ( 2x $!pp Wp`qXrPsHt@u8v0w(x yz{|'p&h (" @D~<@@WX?@DHLP~Tr8N     *8  ' pH7!  ?   ~TǎPǞLǮHǾD@XXWpb[BP<@D~HP qQpp`*p-p pp ppLpp! '":`  hbLMLJ     L"vpP `pQP pQP ?b : pP ap!'",pp`pp~hbNOLJ  Dr   fN"XQ?P zppp`QP LpP `pQP QP p`~HǎDǞ@Ǯ<PPWA~"t0As3r21~WX?@DHLP~Tprb 04p$  p ܋ ``p`p q  ( ^ ! 01'q2! 'q/f !' :Gq21304!:'q.Ȇ,/   Pq9(9#0@@5601 0 )~TǎPǞLǮHǾD@XXWH@~DhHp pp "  !p~Dǎ@HHW !  W!2! W!21!0W! W2!10B!0 W!120WAZ WH@~Dp W & !   D 6ހH  @  X(  ! p!H!7  <R   .   W    ~Dǎ@HHW8 ȧ~4pH.qX(~488W@8~<pp ~W  < r  h P ~<ǎ8@@W8 ȧ~4p T g "Q%(   ~488WH<΀ ~@q R  Bb pH'(! ,>     BG G!     g   ,Q"%(  D b j D p     ~@ǎ<HHWH<@~DpǐLJ D   pH  pH' (. (l   ~Dǎ@Ǟ<HHW8 ȧ~4p  *        |'Q!R D D pH%  ' pH7! ,~488W@8~<p  ( ppP` WH( ppPH^*    pH& ppP` WHW @  ~<ǎ8@@WP pRH a!` !WH@~Dq!\ l~Dǎ@HHWH<@~Dr '$~Dǎ@Ǟ<HHWH<0@~Dr 0 (+R a(a( <r NwX   @   "    t  )r!  )a!"  pH~Dǎ@Ǟ<HHW@~<p.`W .`&0 2  &' N  ~<@@W@~<  pDQ  ,pa` qv  !f~<@@WX<@DHLPҧ~TsRNW  ( ( D b \ pױH'(R (> )8     ,   aP/\ +! (() )((  ' pH7! BW  D ,,-. < ~TǎPǞLǮHǾD@<XXW[W![W[W2![W2![WC2!,[W2![W[h`W `[<``W2![WhW@8~8 PPWP48<@DH~L`Hh! ``! hht`pt|րpqpN$p| |x((lx! ( 2t`  !(hր|xtp0qp((q$t |sqp'( (&    tp|p  Pt! `!t xF pp(Ppxp |p|~LǎHǞDǮ@Ǿ<84PPWp! !t! |WP<@DH~Ly   s  Rq(+p#((p(pspx~LǎHǞDǮ@Ǿ<PPW0@ A#1 ! 1W0+K "AC1!WAC$AhAC%hAC&hACWQWPX%AC1QCGxBBSD"vt ('"AC8('p'"$AC4$X$AhAC!FhAC" QP&#1qA@Aq@@p` #H  @ &   !  g `h` 0#0,@0ȧN(8 ,`  FF=11=CCAM 0AMAP,VA@ E@ p}@gd``  >    @p/`,(0(ְ(zkg(P$(VPp: w q&`,(0(<ְ(@p@ekd,$( DA4,(0(ְ( ֠/t,(0(ְ(Jkd(P$(VP@:0D A&t,(0(,ְ(pTkg($( wq( ,(0(ְ(     / ֠/t,(0(ְ(Jkd*P$(VP@<0D A&t,(0($ְ( fpp\kg,$( wq,,(0(ְ( ֠/`,(0(lְ(Jkd*P$(VP@< D A&`,(0(ְ(H{ p   $( @  @ , 2 ! . 00  +     pؐذWH X(  WP@DH~Lr @D''!' )7) ~LǎHǞDǮ@PPW2!6[WPHx~Lp(,j~LǎHPPWPHx~Lp(,"~LǎHPPW`?8<@DH~Lp.ޠ:T 2p pp  :X ސ( Jp  C@:8 6p  : @$:@$ 1 P@$`^P5%cR:W^XP'86 0":B0C9"5 4r+!+ @$0:  ?05N?:@ 5p  5 @$0:  ( ( :( 0 &009 4 @$05p (  5(T &1  &0   9( ~LǎHǞDǮ@Ǿ<8``W   ?  ?0 6    W6    W @(#)grep.c 6.1 87/11/23    0 Dh ( H \  h | TblcnsviUsage: grep -blcnsvi pattern file . . . %s:rgrep: can't open %s %ld %s:%s %ld:%ld:,,,, ,,$%s grep: RE error %d: Range endpoint too large.Bad number.``\digit'' out of range.Illegal or missing delimiter.No remembered search string.\( \) imbalance.Too many \(.More than 2 numbers given in \{ \}.} expected after \.First number exceeds second in \{ \}.[ ] imbalance.Regular expression overflow.Unknown regexp error code!! @ @(#)getopt.c 6.1 87/11/23 --: illegal option -- : illegal option -- : option requires an argument -- : option requires an argument --  @(#)memccpy.c 6.1 87/11/23 @(#)mon.c 6.1 87/11/23 PROFDIRmon.out @(#)perror.c 6.1 87/11/23 : Unknown error @(#)tolower.c 6.1 87/11/23 @(#)data.c 6.1 87/11/23 `0`0`8b(r0H @(#)filbuf.c 6.1 87/11/23 @(#)flsbuf.c 6.1 87/11/23 @(#)stdiom.h 6.1 87/11/23 @(#)fopen.c 6.1 87/11/23 @(#)fprintf.c 6.1 87/11/23 @(#)ftell.c 6.1 87/11/23 @(#)fwrite.c 6.1 87/11/23 @(#)stdiom.h 6.1 87/11/23 8 @(#)errlst.c 6.1 87/11/23 PXd0DXd|(8H`p8HXt.Error 0Not ownerNo such file or directoryNo such processInterrupted system callI/O errorNo such device or addressArg list too longExec format errorBad file numberNo child processesNo more processesNot enough spacePermission deniedBad addressBlock device requiredDevice busyFile existsCross-device linkNo such deviceNot a directoryIs a directoryInvalid argumentFile table overflowToo many open filesNot a typewriterText file busyFile too largeNo space left on deviceIllegal seekRead-only file systemToo many linksBroken pipeArgument out of domainResult too largeNo message of desired typeIdentifier removedChannel number out of rangeLevel 2 not synchronizedLevel 3 haltedLevel 3 resetLink number out of rangeProtocol driver not attachedNo CSI structure availableLevel 2 haltedDeadlock condition if locked @(#)getenv.c 6.1 87/11/23 @(#)isatty.c 6.1 87/11/23 @(#)malloc.c 6.1 87/11/23 @(#)memchr.c 6.1 87/11/23 000000000000000000000123456789abcdef0123456789ABCDEF @(#)findiop.c 6.1 87/11/23 @(#)dowrite.c 6.1 87/11/23 @(#)print.h 6.1 87/11/23 @(#)ecvt.c 6.1 87/11/23 Fn CAy7Aׄ@È@Y@$u!i 2$`X.text2 .dataXX3X@.bss--$` 0  !2$0 X"Z[WX?<@DHL~Pq80  T> 0 "'X ЋX ))2.T#: ϮT 0 !!! 0  0 11 2kt~PǎLǞHǮDǾ@<XXWp[BX?@DHLP~Tp-r-b 0 - |p$- -8 --p  $ 0(0(p00-p q-  ( ^ȓ  Ћ! 01'q2! 'q/  !' :Gq21304!:'q.؆,/ H-- -P-q9(9#0@@5601 0- -) ~TǎPǞLǮHǾD@XXWH@~Dp pp@~  " P   ! ~Dǎ@HHW!21!0W! W!120WH@~Dp W & !   D 6ހ8  @  H(  ! p!8!7  R   .   W    ~Dǎ@HHW8 ȧ~4p8.qH(~488W@8~<pp ~W  < r n  ( ~<ǎ8@@W8 ȧ~4p T g "Q%(   ~488WH<΀ ~@q R  Bb p8'(! ,>     BG G!Ȏ    g   ,Q"%(  D b j D p     ~@ǎ<HHWH<@~DpǐLJ D   p8  p8' (. (D   ~Dǎ@Ǟ<HHW8 ȧ~4p  *        |'Q!R D D p8%  ' p87! ,~488W@8~<p  ( ppP08W8( pp@8^*    p8& ppP08W8^W @  ~<ǎ8@@WP pR8 a!` !WH@~Dq l~Dǎ@HHWH<@~Dr '$~Dǎ@Ǟ<HHWH<0@~Dr 0 (+R a(a( <r NwX   @   "    t  )r!  )a!"  p8~Dǎ@Ǟ<HHW@~<p.`W .`&0 2  &'   ~<@@W@\.`PT.\(0 2 T . H ^T  @@W[W![W[W2![W2![WC2!,[W2![W[hW [<W2![WW@8~ PPWP48<@DH~L.`H.h! .`.`! .h.h.t.`.p.t.|ր.pqpN$.p.| .|x((lx! ( 2.t.`  !(hր.|x.tp0qp((q$.t .|sqp'( (&    .tp.|p  P.t! .`!.t xF p.p(P.p.x.p .|.p.|~LǎHǞDǮ@Ǿ<84PPW.p! !.t! .|WP<@DH~Ly   s  Rq(+p#X((p(psp.x~LǎHǞDǮ@Ǿ<PPW0+K "AC1!WAC$AhAC%hAC&hACWQWPX%AC1QCGxBBSD"vt ('"AC8('p'"$AC4$X$AhAC!FhAC" QP&#1qA@Aq@/@p/`/ #H / @ & /  ! / g `h`/ 0#.0/,@/0ȧN(..8. /,`/  FF=11=CCAM 0AMAP/,VA@/ E@/ p/}@.g/d``//  >  / /// @.p../,/(0/(ְ/(zkg(P/$(VPp: w q&,/(0/(<ְ/(@.p..@ekd,/$( .DA4.,/(0/(..ְ/( ֠/./,/(0/(ְ/(Jkd(P/$(VP@:0D A&,/(0/(,ְ/(.pTkg(/$( wq( ,/(0/(ְ/(     / ֠/./,/(0/(ְ/(Jkd*P/$(VP@<0D A&,/(0/($ְ/(. fp/p\kg,/$( .wq,.,/(0/(ְ/( ֠///,/(0/(lְ/(Jkd*P/$(VP@< D A&,/(0/(ְ/(H{ p   /$( @  F@ , 2 ! . 00  +   j  p.ؐ.ذ...W8 H(  WP@DH~Lr @D''!'. )7H) ~LǎHǞDǮ@PPW2!6[WPHx~Lp(,j~LǎHPPWPHx~Lp(,"~LǎHPPW`?8<@DH~Lp.ޠ//:T 2p/ p///p  :X ސ /Jp  C@:8 6p  : @$:@$ 1 P@$`^P5%cR:W^XP'86 0":B0C9"5 4r+!+ @$0:  ?05N?:@ 5p  5 @$0:  /( /( /:/( 0 &009 4 @$05p (  5(T/ &1/  &0   9( ~LǎHǞDǮ@Ǿ<8`/`W   ?  ?0 6    W6    WX<@DHLPҧ~TsRNW  ( ( D ٚ \ pױ8'(R (> )H     ,F   aP/\ +! (() )((  ' p87! PBW  D ,,-V t ~TǎPǞLǮHǾD@<XXW0@ A#1 ! 1W @(#)num.c 6.1 87/11/23 %crnum: cannot open %s %5d @(#)mon.c 6.1 87/11/23 PROFDIRmon.out @(#)perror.c 6.1 87/11/23 : Unknown error @(#)data.c 6.1 87/11/23 0H0H0P2@BH8 @(#)filbuf.c 6.1 87/11/23 @(#)flsbuf.c 6.1 87/11/23 @(#)stdiom.h 6.1 87/11/23 @(#)fopen.c 6.1 87/11/23 @(#)fprintf.c 6.1 87/11/23 @(#)printf.c 6.1 87/11/23 RP @(#)errlst.c 6.1 87/11/23 0@Xd,8DXhx 8HTl$D`p.Error 0Not ownerNo such file or directoryNo such processInterrupted system callI/O errorNo such device or addressArg list too longExec format errorBad file numberNo child processesNo more processesNot enough spacePermission deniedBad addressBlock device requiredDevice busyFile existsCross-device linkNo such deviceNot a directoryIs a directoryInvalid argumentFile table overflowToo many open filesNot a typewriterText file busyFile too largeNo space left on deviceIllegal seekRead-only file systemToo many linksBroken pipeArgument out of domainResult too largeNo message of desired typeIdentifier removedChannel number out of rangeLevel 2 not synchronizedLevel 3 haltedLevel 3 resetLink number out of rangeProtocol driver not attachedNo CSI structure availableLevel 2 haltedDeadlock condition if locked @(#)getenv.c 6.1 87/11/23 @(#)isatty.c 6.1 87/11/23 @(#)malloc.c 6.1 87/11/23 000000000000000000000123456789abcdef0123456789ABCDEF @(#)findiop.c 6.1 87/11/23 @(#)dowrite.c 6.1 87/11/23 @(#)print.h 6.1 87/11/23 @(#)ecvt.c 6.1 87/11/23 Fn CAy7Aׄ@È@Y@$ @(#)fwrite.c 6.1 87/11/23 @(#)stdiom.h 6.1 87/11/23 @(#)memchr.c 6.1 87/11/23 u!i T E.textT .data T@.bss,,E  0  !2$0 [W`~<p@69$L9 *P0@9DP  P7~<``W8hȄPX6PP"-9.-&P,8,X88W@ - 5@- @W@<@~DqHP` mNh.7 h,h P*P+^tXғp~Dǎ@Ǟ<WH8<@~Dqxt!0+1h "0-T! @0i$0i'"!0+1 "0x0a1pW l` F:&nж `NȆ ȋdЋXDxxؓP Pl!  t'!wB Ѐ  !P ` m $  (  ,ȎH x؎> PR! P2!2 i W  ! P `0m# ! ! P(x ^`TP  rq P0P8PD0#h+~Dǎ@ Ǟ<Ǯ8HHW8 0$@i4340  88WPH~L `pm P  P /Fx xP@  PH ~%pP@ P@!PP"QQP%!!!! "v 11 2Іp p4 $hP X+PP P@'7(#8+.X~LǎHPPWH~DPXpPPP`bx p` m` mrP@ !T" P81#!! 0xP@#4*xxPhPp  P ( qrZ  TȆ|2P( Ph!PPPP PPЎdp   J PXP   PXP ڋ  "  PX~DHHWH48<@~DpրP8xx P8xx(  >PHP!!! P P!2!! >xxP8 (  i W PHPHPH P($ P0q(ȓ܆F:  &PHqPH PHËv~Dǎ@Ǟ<Ǯ8Ǿ4HHW ~P8@2442#4$r @0:At@x'24189q018~ǎǞW@8~<րPPFP8  (  Q  ` a PP p>h pP|(P(@!PP0&PHPH΀ ~iW PHPHRDpW0PH PHPH~<ǎ8@@W@8~<p TpW   0PhP( PPPPPhPh PhP(PV`P( P(PhPPPPPhPhHPhP<PPPPPhPhPpPhDPXPXPpPhPPP`iW ^P@PhPhPhPh P(n$  !$ P`P`PhPp~<ǎ8@@W@~<j P`! PPqT n!Jq  ! P`P`PPPPPP+~<@@W *!!@i14340WH@~DqXZ,> p !!! l!2!! ` m J ' !dpP2p(((X0( F ~Dǎ@HHW8 ~4 p8~488W@~<pppH' t  ~<@@W8pp" 88W@bn !PN !   P!P@@W8$ 88WP<@D~Hp, LLpǀ1'2ב סzH@80(L LLp  ~HǎDǞ@Ǯ<PPW :"4 mn2"'W Q!Q Q 0<- # -- p'-JF" 4#  m  n 4#  m  n!0F 4# m n$-- mn n ؋2$21  ----W@8- P~<2!0!!l1l-A!42A!4"1#x(2"#"2A!42A!4"1#t't'"dt'"drt'"d\8 d# 2! 0!("d*~<ǎ8@-@W@!:#:#"0$0 #0*0W8 00  0 B!41 -RA!*P%00(# %09(# $@ <^2 00  0 B!4188WpB[B@8~x  $|    `  qHpH.z .``.`Jt.`Xč Ndzz<\  (pZz .`<H  J C q+ t~Dǎ@WH@~Dp W & !   D 6ހ  @  (  ! p!!7  <R   .   W    ~Dǎ@HHW8 ȧ~4p.q(~488W@8~<pp ~W  < r  f   ~<ǎ8@@W8 ȧ~4p T g "Q%(   ~488WH<΀ ~@q R  Bb p'(! ,>     BG G! Ў    g   ,Q"%(  D b j D p     ~@ǎ<HHWH<@~DpǐLJ D   p  p' (. ( L   ~Dǎ@Ǟ<HHW8 ȧ~4p  *        |'Q!R D D p%  ' p7! ,~488W@8~<p  ( ppPPW( pp^l*    p& ppPPWW @  ~<ǎ8@@WP pR a!` !WH@~DqL l~Dǎ@HHWH<@~Dr '$~Dǎ@Ǟ<HHWH<0@~Dr 0 (+R a(a( <r NwX   @   "    t  )r!  )a!"  p~Dǎ@Ǟ<HHW@~<p.`W .`&0 2  &'>  ~<@@W@\.`P.\(0 2  .   @@W@48~<p P     Z   & pp$ ppPPW2 pj @  ~<ǎ8Ǟ4@@WP.p0>@DH".L @.M.p.@@.DPPW ! ^ 0(,01  !W![*W[W![W[B![ W[W2![W2![WC2!,[W2![`W[H W  [  W!00[WH .(N0n8@HPX` W`X .(N0n8Ɏ@ɮHPԩة>^觾[![JW [W2![W WPT.> PPW!1021!0Wp.....Ǽ/ @P PP/$PpRUP/$%py}kg,P/$(VP p:w]ѡ[q" ,/(0/(Rְ/(Fp/@c(stdxX܋ `/ d`/ P/$([P  ,/(0/(ְ/(`/ d`/ (P/$[PQ̡P! ! ,/(0/(Pְ/(`/ d`/ 'Π- 8ы0):@0CAMр ѡ(P/$[P Q фP р}-!ш},/(0/(xְ/(`/ d`/ / q%фыh`/ d`/ / q%фы4/./`/ csd(u$+\-` d#h.l*x0Āelh%ox0XeEfgGn9ld`/  /d`/ @ / / "  !/`d`/ }.; -!10.@@ V 8@  /  +!10."  /  !10. @ /00 0ѡ $@ZPECѡMѡ p/ }/ u// ^d`/ } pq 5#"0ѡP n b V J@ / 6@ */d`/ / / d`/ / @     0 9: @ / /z /WC0%_D0%_D0%d`/ - /p&@ 4//  a@ '/ -// pX Oo620.x 0 .."X.  //   @ / & / g `h`/ / 0!#и.0/,@/0ȧN(. .8/0 - ..D  5  + .. ..g ю 0ѡaP/ P .aP6 QaP P/P/ ׶`/p/8g. 06P/,QPU):RECAaFSRQaVrgaga/,- +aea E`.rvp/// #2#: @ / & / g `h`/ / 0<#0/,@/0ȧN(..8/0`/ P/,/Q)-0!-.! .B +.! .   .! .E00@qA0- '1qA@Aq@ `  .'qF<Ad &$ / /A@> QP&#1qA@Aq@/@p/`/ #H / @ & /  ! / g `h`/ 0#.0/,@/0ȧN(..8. /,`/  FF=11=CCAM 0AMAP/,VA@/ E@/ p/}@.g/d``//  >  / /// @.p../%`,/(0/(ְ/(zkg(P/$(VPp: w q&%`,/(0/(<ְ/(@.p..@ekd,/$( .DA4.,/(0/(..ְ/( ֠/./%t,/(0/(ְ/(Jkd(P/$(VP@:0D A&%t,/(0/(,ְ/(.pTkg(/$( wq( ,/(0/(ְ/(     / ֠/./%t,/(0/(ְ/(Jkd*P/$(VP@<0D A&%t,/(0/($ְ/(. fp/p\kg,/$( .wq,.,/(0/(ְ/( ֠///%`,/(0/(lְ/(Jkd*P/$(VP@< D A&%`,/(0/(ְ/(H{ p   /$( @  @ , 2 ! . 00  +     p.ؐ.ذ...W (  WP@DH~Lr @D''!' )7H)< ~LǎHǞDǮ@PPW2!6[WPHx~Lp(,j~LǎHPPWPHx~Lp(,"~LǎHPPW`?8<@DH~Lp.ޠ//:T 2p/ p///p  :X ސ&( /Jp  C@:8 6p  : @$:@$ 1 P@$`^P5%cR:W^XP'86 0":B0C9"5 4r+!+ @$0:  ?05N?:@ 5p  5 @$0:  /( /( /:/( 0 &009 4 @$05p (  5(T/ &1/  &0   9( ~LǎHǞDǮ@Ǿ<8`/`W   ?  ?0 6    W6    WX<@DHLPҧ~TsRNW  ( ( D B \ pױ'(R (> )     ,   aP/\ +! (() )((  ' p7! BW  D ,,-V  ~TǎPǞLǮHǾD@<XXW0@ A#1 ! 1W @(#)pr.c 6.1 87/11/23 can't open %stoo many files$$0DXdrbad optionwidth too small/dev/tty %12.12s %4.4s %s Page %d %*ld%cpage-buffer overflow p~~r%s -- empty filepr: %sout of spacepr: %spr: %sB   @(#)ctime.c 6.1 87/11/23 Day Mon 00 00:00:00 1900 SunMonTueWedThuFriSatJanFebMarAprMayJunJulAugSepOctNovDecTZpPDTPSTW`/Lw/K:/JMFw/ @(#)ctype.c 6.1 87/11/23 ((((( H @(#)getenv.c 6.1 87/11/23 @(#)malloc.c 6.1 87/11/23 @(#)mon.c 6.1 87/11/23 PROFDIRmon.out @(#)perror.c 6.1 87/11/23 : Unknown error @(#)tolower.c 6.1 87/11/23 @(#)ttyname.c 6.1 87/11/23 /dev/ @(#)data.c 6.1 87/11/23 PPPRb @(#)filbuf.c 6.1 87/11/23 @(#)flsbuf.c 6.1 87/11/23 @(#)stdiom.h 6.1 87/11/23 @(#)fopen.c 6.1 87/11/23 @(#)fprintf.c 6.1 87/11/23 @(#)printf.c 6.1 87/11/23 @(#)setbuf.c 6.1 87/11/23 @(#)sprintf.c 6.1 87/11/23 @(#)ungetc.c 6.1 87/11/23 r @(#)errlst.c 6.1 87/11/23 !!!!!"""0"D"X"h"|"""""""###(#8#L#`#t#######$$$0$L$`$|$$$$$%% .Error 0Not ownerNo such file or directoryNo such processInterrupted system callI/O errorNo such device or addressArg list too longExec format errorBad file numberNo child processesNo more processesNot enough spacePermission deniedBad addressBlock device requiredDevice busyFile existsCross-device linkNo such deviceNot a directoryIs a directoryInvalid argumentFile table overflowToo many open filesNot a typewriterText file busyFile too largeNo space left on deviceIllegal seekRead-only file systemToo many linksBroken pipeArgument out of domainResult too largeNo message of desired typeIdentifier removedChannel number out of rangeLevel 2 not synchronizedLevel 3 haltedLevel 3 resetLink number out of rangeProtocol driver not attachedNo CSI structure availableLevel 2 haltedDeadlock condition if locked @(#)isatty.c 6.1 87/11/23 000000000000000000000123456789abcdef0123456789ABCDEF @(#)findiop.c 6.1 87/11/23 @(#)dowrite.c 6.1 87/11/23 @(#)print.h 6.1 87/11/23 @(#)ecvt.c 6.1 87/11/23 Fn CAy7Aׄ@È@Y@$ @(#)fwrite.c 6.1 87/11/23 @(#)stdiom.h 6.1 87/11/23 @(#)memchr.c 6.1 87/11/23 u!i ;P$.text;P .data;@.bss--$$p 0  !2$0 "[WX?@DHLP~Tqbi,:?B 6f.r" @0 2  ZpqD ^<+:Vt0 v~TǎPǞLǮHǾD@XXW@DHL~Ppȓ.&\'d0 0   @0"t 'pD:*T'>T*8   ! 0 0 '>0 0 &XRRB.. !@ L6< 2'X0 0 ~PǎLǞHǮDǾ@W   .N   ., /  WPD~Hp & d `0 2LL0'0 ~HǎDPPW8 ȧ~4q<P!~48yR8Wp ZR[BP<@D~HP8qQp`*p-p p<Lp!8'":0(  bLMLJ  X  @L"P8`pQP8QP8?b : P8ap!'",p00~bNOLJ  z  pN"Q?P8zp00QP8LP8`pQP8QP800~HǎDǞ@Ǯ<PPWPT.>8 PPWX?@DHLP~Tp-Ўr-̆b 0 - Tp$- -h --Гp   0808p0@-p q-Ȉ  ( ^" ! 01'q2! 'q/  !' :Gq21304!:'q.,/ -̧-̧ -P-q9(9#0@@5601 0- -) ~TǎPǞLǮHǾD@XXWH@~D$x%XpH pp$  $D"    @! ~Dǎ@HHWP<@DH~Lp  F (( x Z.8V  p " p  ~LǎHǞDǮ@Ǿ<PPW8.888W !  W!2! W!21!0W! W!120WH@~Dp W & !   D 6ހ  @  #(  ! p!"!7 R   .   W    ~Dǎ@HHW8 ȧ~4p.q#(~488W@8~<pp ~W  < r $x   ~<ǎ8@@W8 ȧ~4p T g "Q%(   ~488WH<΀ ~@q R  Bb p"'(! ,>     BG G!    g   ,Q"%(  D b j D p     ~@ǎ<HHWH<@~DpǐLJ D   p"  p"' (. ($   ~Dǎ@Ǟ<HHW8 ȧ~4p  *        |'Q!R D D p"%  ' p"7! ,~488W@8~<p  ( ppP0HW"( pp#"^*    p"& ppP0HW">W @  ~<ǎ8@@WP pR" a!` !W@~<p.`W .`&0 2  &'   ~<@@W@\.`P.\(0 2  .  ^  @@WP.p0>@DH".L @.M.p.@ .DPPW!![W[`W![BW. >$.;0[W[ W[W2!6[W2![W[WC2!,[W2![W[h$pW $p[<$p$pW!00[WH .(N0n8@HPX` W`X .(N0n8Ɏ@ɮHPԩة>^觾[![jW [TW[:. W2![W$xW@8~ QP&#1qA@Aq@/@p/`/ #H / @ & /  ! / g `h`/ 0#.0/,@/0ȧN(.Z.8. /,`/  FF=11=CCAM 0AMAP/,VA@/ E@/ p/}@.g/d``//  >  / /// @.p../)0,/(0/(Vְ/(zkg(P/$(VPp: w q&)0,/(0/(ְ/(@.p..@ekd,/$( .DA4.,/(0/(..ְ/( ֠/./)D,/(0/(Fְ/(Jkd(P/$(VP@:0D A&)D,/(0/(ְ/(.pTkg(/$( wq( ,/(0/(ְ/(     / ֠/./)D,/(0/(@ְ/(Jkd*P/$(VP@<0D A&)D,/(0/(ְ/(. fp/p\kg,/$( .wq,.,/(0/(tְ/( ֠///)0,/(0/(,ְ/(Jkd*P/$(VP@< D A&)0,/(0/(ְ/(H{ p   /$( @  F@ , 2 ! . 00  +   j  p.ؐ.ذ...WP@DH~Lr @D''!'n )70) ~LǎHǞDǮ@PPWPHx~Lp(,j~LǎHPPWPHx~Lp(,"~LǎHPPW`?8<@DH~Lp.ޠ//:T 2p/ p///p  :X ސ) /Jp  C@:8 6p  : @$:@$ 1 P@$`^P5%cR:W^XP'86 0":B0C9"5 4r+!+ @$0:  ?05N?:@ 5p  5 @$0:  /( /( /:/( 0 &009 4 @$05p (  5(T/ &1/  &0   9( ~LǎHǞDǮ@Ǿ<8`/`W   ?  ?0 6    W6    WX<@DHLPҧ~TsRNW  ( ( D  \ pױ"'(R (> )߀     ,؞   aP/\ +! (() )((  ' p"7! ڨBW  D ,,-V  ~TǎPǞLǮHǾD@<XXW0@ A#1 ! 1W @(#)rm.c 6.1 87/11/23 ..friusage: rm [-fir] file ... rm: cannot remove .. rm: %s non-existent directory %s: ? rm : cannot read %s %s/%.14srm: %s directory %s: ? %s: %o mode ? rm: %s not removed. %s: ? /bin/rmdirrmdirNo rmdir @(#)getopt.c 6.1 87/11/23 --: illegal option -- : illegal option -- : option requires an argument -- : option requires an argument --  @(#)isatty.c 6.1 87/11/23 @(#)mon.c 6.1 87/11/23 PROFDIRmon.out @(#)perror.c 6.1 87/11/23 : Unknown error @(#)sleep.c 6.1 87/11/23 @(#)data.c 6.1 87/11/23 0X0X0`2PBX" @(#)filbuf.c 6.1 87/11/23 @(#)flsbuf.c 6.1 87/11/23 @(#)stdiom.h 6.1 87/11/23 @(#)fprintf.c 6.1 87/11/23 @(#)printf.c 6.1 87/11/23 @(#)sprintf.c 6.1 87/11/23 R` @(#)errlst.c 6.1 87/11/23 %`%h%t%%%%%%&&&,&@&T&h&t&&&&&&&&''$'8'H'X'p'''''''((,(H(X(h((((.Error 0Not ownerNo such file or directoryNo such processInterrupted system callI/O errorNo such device or addressArg list too longExec format errorBad file numberNo child processesNo more processesNot enough spacePermission deniedBad addressBlock device requiredDevice busyFile existsCross-device linkNo such deviceNot a directoryIs a directoryInvalid argumentFile table overflowToo many open filesNot a typewriterText file busyFile too largeNo space left on deviceIllegal seekRead-only file systemToo many linksBroken pipeArgument out of domainResult too largeNo message of desired typeIdentifier removedChannel number out of rangeLevel 2 not synchronizedLevel 3 haltedLevel 3 resetLink number out of rangeProtocol driver not attachedNo CSI structure availableLevel 2 haltedDeadlock condition if locked @(#)getenv.c 6.1 87/11/23 @(#)malloc.c 6.1 87/11/23 000000000000000000000123456789abcdef0123456789ABCDEF @(#)dowrite.c 6.1 87/11/23 @(#)print.h 6.1 87/11/23 @(#)ecvt.c 6.1 87/11/23 Fn CAy7Aׄ@È@Y@$ @(#)fwrite.c 6.1 87/11/23 @(#)stdiom.h 6.1 87/11/23 @(#)memchr.c 6.1 87/11/23 u!j >$@.text> .data@@?@@.bss--$'( 0  !2$0 @" [WPDH~Lqt 0-#؋ 0x(20@b4(20$p""`W"0 ! 0 z0 " 0 b0 $ 0 J0 ( 0 20  0 0 0  0( 0( 9t0 0(0 RP+@ !"'!0ȓ tppD 0000@BÓI$2"pxqV0P(q!0@p 0000@C2B" 0@02"0P0P0@ 0!JA0P x':! !  ! !$!$ ~LǎHǞDPPWX<@DHLP~TR0 :^ x '|! !  ! J !$!!$ D! !  ! !$!!$pۋ! ! 8 *    !! 8 *  !$1!$ qҀwp~TǎPǞLǮHǾD@<XXWH~@ppW >&֋%(b! ! -! v !$!$- pV%>>$$"~DD! !  ! ԋ"!$!!$ E|~FF #! !  ! `"!$!$ G #:~@HHW@~<p ppld p! ! "  !! "!$!$ }rnp W l"` hP d@ `0 \  Xҋ#~<@@WH@~Dq  b ! ! ! (!W ! ! !$ W!$ ` ! ! ! *!0 ! ! ,(!$ 0!$ ~Dǎ@HHW@~<qJ! !  ! "!$!!$ q0(~<@@W@~< + x x@ 0  x x 0  x 0.# *  x 0 xpR0Z 0 9  x' p0 a $ f0  x' p . bBpy! `p0P~<@@Wp[BX?@DHLP~Tp-r-b 0<-p$- - --p  0X0Xp0`-p q-  ( ^ :  ! 01'q2! 'q/ !' :Gq21304!:'q. ,/  H-- -P-q9(9#0@@5601 0- -) F~TǎPǞLǮHǾD@XXWH@~D'0(p  pp'X~  < " ,P    ! ~Dǎ@HHW!21!0W! W!120W8 ȧ~4p!.q& (~488W@8~<pp ~W  < r  '0  ~<ǎ8@@W8 ȧ~4p T g "Q%(   ~488WH<΀ ~@q R  Bb p%'(! ,>     BG G! `    g   ,Q"%(  D b j D p     ~@ǎ<HHWH<@~DpǐLJ D   p%  p%' (. (܂   ~Dǎ@Ǟ<HHW8 ȧ~4p  *        |'Q!R D D p%%  ' p%7! ,~488W@8~<p  ( ppP0hW%( pp&%^*    p%& ppP0hW%W @  ~<ǎ8@@WP pR% a!` !WH@~Dq" l~Dǎ@HHWH<@~Dr '$~Dǎ@Ǟ<HHWH<0@~Dr 0 (+R a(a( <r NwX   @   "    t  )r!  )a!"0  p%~Dǎ@Ǟ<HHW@~<p.`W .`&0 2  &' ~  ~<@@WX?@DHLP~Ts @  aP/\ (  )R  ' p%7! X (  <~TǎPǞLǮHǾD@XXWP<@DH~Lp   W |tlǧ" !  40,'  W     )RV  HH PPWP48<@DH~L.`H.h! .`.`! .h.h.t.`.p.t.|ր.pqpN$.p.| .|x((lx! ( 2.t.`  !(hր.|x.tp0qp((q$.t .|sqp'( (&    .tp.|p  P.t! .`!.t xF p.p(P.p.x.p .|.p.|~LǎHǞDǮ@Ǿ<84PPW.p! !.t! .|WP<@DH~Ly   s  Rq(+p#X((p(psp.x~LǎHǞDǮ@Ǿ<PPW0+K "AC1!WAC$AhAC%hAC&hACWQWPX%AC1QCGxBBSD"vt ('"AC8('p'"$AC4$X$AhAC!FhAC" QP&#1qA@Aq@/@p/`/ #H / @ & /  ! / g `h`/ 0#.0/,@/0ȧN(..8. /,`/  FF=11=CCAM 0AMAP/,VA@/ E@/ p/}@.g/d``//  >  / /// @.p../,,/(0/(ְ/(zkg(P/$(VPp: w q&,,/(0/(ְ/(@.p..@ekd,/$( .DA4.,/(0/(..ְ/( ֠/./,,/(0/(ְ/(Jkd(P/$(VP@:0D A&,,/(0/(|ְ/(.pTkg(/$( wq( ,/(0/($ְ/(     / ֠/./,,/(0/(ְ/(Jkd*P/$(VP@<0D A&,,/(0/(tְ/(. fp/p\kg,/$( .wq,.,/(0/(ְ/( ֠///,,/(0/(ְ/(Jkd*P/$(VP@< D A&,,/(0/(`ְ/(H{ p   /$( @  ޮ@ , 2 ! . 00  +    p.ؐ.ذ...WH@~Dp W & !   D 6ހ!  @  & (  ! p!%!7 R   .   W    ~Dǎ@HHW! & (  WP@DH~Lr @D''!'F )7`) ~LǎHǞDǮ@PPW2!6[W2![WPHx~Lp(,j~LǎHPPWPHx~Lp(,"~LǎHPPW`?8<@DH~Lp.ޠ//:T 2p/ p///p  :X ސ, /Jp  C@:8 6p  : @$:@$ 1 P@$`^P5%cR:W^XP'86 0":B0C9"5 4r+!+ @$0:  ?05N?:@ 5p  5 @$0:  /( /( /:/( 0 &009 4 @$05p (  5(T/ &1/  &0   9( ~LǎHǞDǮ@Ǿ<8`/`W   ?  ?0 6    W6    WX<@DHLPҧ~TsRNW  ( ( D ՚ \ pױ%'(R (> )     ,F   aP/\ +! (() )((F  ' p%7! PBW  D ,,-V t ~TǎPǞLǮHǾD@<XXW0@ A#1 ! 1W @(#)od.c 6.1 87/11/23 |d* rod: cannot open %s hhhhhhhhhhhhxxxxxxx(hHx8X \t \r \n \f \b \0  @(#)mon.c 6.1 87/11/23 PROFDIRmon.out @(#)perror.c 6.1 87/11/23 : Unknown error @(#)data.c 6.1 87/11/23 0x0x02pBx% @(#)flsbuf.c 6.1 87/11/23 @(#)stdiom.h 6.1 87/11/23 @(#)fopen.c 6.1 87/11/23 @(#)fprintf.c 6.1 87/11/23 @(#)fread.c 6.1 87/11/23 @(#)stdiom.h 6.1 87/11/23 @(#)fseek.c 6.1 87/11/23 @(#)printf.c 6.1 87/11/23 R @(#)errlst.c 6.1 87/11/23 (( (,(H(X(p(|(((((() ) ),)D)P)\)p)))))))***(*8*P*`*l*****+++ +<+\+x+.Error 0Not ownerNo such file or directoryNo such processInterrupted system callI/O errorNo such device or addressArg list too longExec format errorBad file numberNo child processesNo more processesNot enough spacePermission deniedBad addressBlock device requiredDevice busyFile existsCross-device linkNo such deviceNot a directoryIs a directoryInvalid argumentFile table overflowToo many open filesNot a typewriterText file busyFile too largeNo space left on deviceIllegal seekRead-only file systemToo many linksBroken pipeArgument out of domainResult too largeNo message of desired typeIdentifier removedChannel number out of rangeLevel 2 not synchronizedLevel 3 haltedLevel 3 resetLink number out of rangeProtocol driver not attachedNo CSI structure availableLevel 2 haltedDeadlock condition if locked @(#)getenv.c 6.1 87/11/23 @(#)isatty.c 6.1 87/11/23 @(#)malloc.c 6.1 87/11/23 000000000000000000000123456789abcdef0123456789ABCDEF @(#)filbuf.c 6.1 87/11/23 @(#)findiop.c 6.1 87/11/23 @(#)dowrite.c 6.1 87/11/23 @(#)print.h 6.1 87/11/23 @(#)ecvt.c 6.1 87/11/23 Fn CAy7Aׄ@È@Y@$ @(#)fwrite.c 6.1 87/11/23 @(#)stdiom.h 6.1 87/11/23 @(#)memchr.c 6.1 87/11/23 u!jA 48$h.text4 .data84@.bss--$h 0  !2$0 "[W`@DHLPTЧ~XP^\(k-r Q^\Hp p&p!ڋ΋ p0 ^\Qn2(! (q!0# (q! (!!0#T  0 ! 0 !!0# 2ьp!   ^\Q )! 2N 0" !0 0 0(0(!0*)0#, 4pp  \ ,~XǎTǞPǮLǾHD@``Wp[BX?@DHLP~Tp-r-b 0 - |p$- -8 --p  $ 0000p08-p q-  ( ^X  `! 01'q2! 'q/  !' :Gq21304!:'q.h,/ hH-- -P-q9(9#0@@5601 0- -) ~TǎPǞLǮHǾD@XXWH@~Dp pp~  " P   ! ~Dǎ@HHW!21!0W! W!120WH@~Dp W & !   D 6ހȋ  @  (  ! p!!7  R   .   W    ~Dǎ@HHW8 ȧ~4pȋ.q(~488W@8~<pp ~W  < r n  ( ~<ǎ8@@W8 ȧ~4p T g "Q%(   ~488WH<΀ ~@q R  Bb p'(! ,>     BG G!Ȏ    g   ,Q"%(  D b j D p     ~@ǎ<HHWH<@~DpǐLJ D   p  p' (. (D   ~Dǎ@Ǟ<HHW8 ȧ~4p  *        |'Q!R D D p%  ' p7! ,~488W@8~<p  ( ppP0@Wȋ( ppЧȋ^*    pȋ& ppP0@W^W @  ~<ǎ8@@WP pR a!` !WH@~Dq l~Dǎ@HHWH<@~Dr '$~Dǎ@Ǟ<HHWH<0@~Dr 0 (+R a(a( <r NwX   @   "    t  )r!  )a!"  p~Dǎ@Ǟ<HHW@~<p.`W .`&0 2  &'   ~<@@W@\.`P.\(0 2  . ؓ ^  @@W[W![W[W2![W2![WC2!,[W2![W[hW [<W2![WW@8~ PPWP48<@DH~L.`H.h! .`.`! .h.h.t.`.p.t.|ր.pqpN$.p.| .|x((lx! ( 2.t.`  !(hր.|x.tp0qp((q$.t .|sqp'( (&    .tp.|p  P.t! .`!.t xF p.p(P.p.x.p .|.p.|~LǎHǞDǮ@Ǿ<84PPW.p! !.t! .|WP<@DH~Ly   s  Rq(+p#X((p(psp.x~LǎHǞDǮ@Ǿ<PPW0+K "AC1!WAC$AhAC%hAC&hACWQWPX%AC1QCGxBBSD"vt ('"AC8('p'"$AC4$X$AhAC!FhAC" QP&#1qA@Aq@/@p/`/ #H / @ & /  ! / g `h`/ 0#.0/,@/0ȧN(..8. /,`/  FF=11=CCAM 0AMAP/,VA@/ E@/ p/}@.g/d``//  >  / /// @.p../ ,/(0/(ְ/(zkg(P/$(VPp: w q& ,/(0/(<ְ/(@.p..@ekd,/$( .DA4.,/(0/(..ְ/( ֠/./ ,/(0/(ְ/(Jkd(P/$(VP@:0D A& ,/(0/(,ְ/(.pTkg(/$( wq( ,/(0/(ְ/(     / ֠/./ ,/(0/(ְ/(Jkd*P/$(VP@<0D A& ,/(0/($ְ/(. fp/p\kg,/$( .wq,.,/(0/(ְ/( ֠/// ,/(0/(lְ/(Jkd*P/$(VP@< D A& ,/(0/(ְ/(H{ p   /$( @  F@ , 2 ! . 00  +   j  p.ؐ.ذ...Wȋ (  WP@DH~Lr @D''!'. )7H) ~LǎHǞDǮ@PPW2!6[WPHx~Lp(,j~LǎHPPWPHx~Lp(,"~LǎHPPW`?8<@DH~Lp.ޠ//:T 2p/ p///p  :X ސ!H /Jp  C@:8 6p  : @$:@$ 1 P@$`^P5%cR:W^XP'86 0":B0C9"5 4r+!+ @$0:  ?05N?:@ 5p  5 @$0:  /( /( /:/( 0 &009 4 @$05p (  5(T/ &1/  &0   9( ~LǎHǞDǮ@Ǿ<8`/`W   ?  ?0 6    W6    WX<@DHLPҧ~TsRNW  ( ( D ٚ \ pױ'(R (> )H     ,F   aP/\ +! (() )((  ' p7! PBW  D ,,-V t ~TǎPǞLǮHǾD@<XXW0@ A#1 ! 1W @(#)sum.c 6.1 87/11/23 %s-rsum: Can't open %s sum: read error on %s %.5u%6ld%u %ld @(#)mon.c 6.1 87/11/23 PROFDIRmon.out @(#)perror.c 6.1 87/11/23 : Unknown error @(#)data.c 6.1 87/11/23 0P0P0X2HBP @(#)filbuf.c 6.1 87/11/23 @(#)flsbuf.c 6.1 87/11/23 @(#)stdiom.h 6.1 87/11/23 @(#)fopen.c 6.1 87/11/23 @(#)fprintf.c 6.1 87/11/23 @(#)printf.c 6.1 87/11/23 RX @(#)errlst.c 6.1 87/11/23 $8H\p,@Thx,@\x .Error 0Not ownerNo such file or directoryNo such processInterrupted system callI/O errorNo such device or addressArg list too longExec format errorBad file numberNo child processesNo more processesNot enough spacePermission deniedBad addressBlock device requiredDevice busyFile existsCross-device linkNo such deviceNot a directoryIs a directoryInvalid argumentFile table overflowToo many open filesNot a typewriterText file busyFile too largeNo space left on deviceIllegal seekRead-only file systemToo many linksBroken pipeArgument out of domainResult too largeNo message of desired typeIdentifier removedChannel number out of rangeLevel 2 not synchronizedLevel 3 haltedLevel 3 resetLink number out of rangeProtocol driver not attachedNo CSI structure availableLevel 2 haltedDeadlock condition if locked @(#)getenv.c 6.1 87/11/23 @(#)isatty.c 6.1 87/11/23 @(#)malloc.c 6.1 87/11/23 000000000000000000000123456789abcdef0123456789ABCDEF @(#)findiop.c 6.1 87/11/23 @(#)dowrite.c 6.1 87/11/23 @(#)print.h 6.1 87/11/23 @(#)ecvt.c 6.1 87/11/23 Fn CAy7Aׄ@È@Y@$ @(#)fwrite.c 6.1 87/11/23 @(#)stdiom.h 6.1 87/11/23 @(#)memchr.c 6.1 87/11/23 u!jO 4p4.text4p .data5@.bss--4 0  !2$0 "[WX?@DHLP~Tq!6 R0 ǧ - +ޠpt-R  )*  @60 xj l(! T0b#(! Hp@Wp. 0(  Z:(p00  q  (0 @820 @<  @4 p00'np  00'N00 $pۓ 0 B@8 t   @H" lp '00  x > *    ^ $00ӊ" !00p$ 100# ,  00 00' “L Z~TǎPǞLǮHǾD@XXW@0(0 Z00 800   ߋWp[BX?@DHLP~Tp-Ўr-̆b 0 \- p$- - ` --Гp  t @X@Xp@`-p q-Ȉ  ( ^  ! 01'q2! 'q/  !' :Gq21304!:'q. ,/  `-̧-̧ -P-q9(9#0@@5601 0- -) f~TǎPǞLǮHǾD@XXWH@~DpP pp@  L" h   H! ~Dǎ@HHWP<@DH~Lp (( x.8n`Rpr p* ~LǎHǞDǮ@Ǿ<PPW8.888W!21!0W! W!120W8 ȧ~4p.q(~488W@8~<pp ~W  < r   p ~<ǎ8@@W8 ȧ~4p T g "Q%(   ~488WH<΀ ~@q R  Bb p'(! ,>     BG G!(    g   ,Q"%(  D b j D p     ~@ǎ<HHWH<@~DpǐLJ D   p  p' (. (   ~Dǎ@Ǟ<HHW8 ȧ~4p  *        |'Q!R D D p%  ' p7! ,~488W@8~<p  ( ppP@hW( pp^<*    p& ppP@hWW @  ~<ǎ8@@WP pR a!` !W@~<p.`W .`&0 2  &'   ~<@@W[W![W![ ~W[W2![\W2![@W[2WC2!,[W2![W[W [W!00[WH .(N0n8@HPX` W`X .(N0n8Ɏ@ɮHPԩة>^觾[2![W@8~ PPWP48<@DH~L.`H.h! .`.`! .h.h.t.`.p.t.|ր.pqpN$.p.| .|x((lx! ( 2.t.`  !(hր.|.tp0qp((q$.t .|sqp'( (&d   F .tp.|p  P.t! .`!.t xF p.p(P.p.x.p .|.p.|~LǎHǞDǮ@Ǿ<84PPW.p! !.t! .|WP<@DH~Ly   s  Rq(+p#X((p(psp.x~LǎHǞDǮ@Ǿ<PPW0+K "AC1!WAC$AhAC%hAC&hACWQWPX%AC1QCGxBBSD"vt ('"AC8('p'"$AC4$X$AhAC!FhAC" QP&#1qA@Aq@/@p/`/ #H / @ & /  ! / g `h`/ 0#.0/,@/0ȧN(.r.8. /,`/  FF=11=CCAM 0AMAP/,VA@/ E@/ p/}@.g/d``//  >  / /// @.p../!,/(0/(Vְ/(zkg(P/$(VPp: w q&!,/(0/(ְ/(@.p..@ekd,/$( .DA4.,/(0/(..ְ/( ֠/./",/(0/(Fְ/(Jkd(P/$(VP@:0D A&",/(0/(ְ/(.pTkg(/$( wq( ,/(0/(ְ/(     / ֠/./",/(0/(@ְ/(Jkd*P/$(VP@<0D A&",/(0/(ְ/(. fp/p\kg,/$( .wq,.,/(0/(tְ/( ֠///!,/(0/(,ְ/(Jkd*P/$(VP@< D A&!,/(0/(ְ/(H{ p   /$( @  @ , 2 ! . 00  +    p.ؐ.ذ...WP@DH~Lr @D''!' )7H) ~LǎHǞDǮ@PPW2!6[WPHx~Lp(,j~LǎHPPWPHx~Lp(,"~LǎHPPW`?8<@DH~Lp.ޠ//:T 2p/ p///p  :X ސ" /Jp  C@:8 6p  : @$:@$ 1 P@$`^P5%cR:W^XP'86 0":B0C9"5 4r+!+ @$0:  ?05N?:@ 5p  5 @$0:  /( /( /:/( 0 &009 4 @$05p (  5(T/ &1/  &0   9( ~LǎHǞDǮ@Ǿ<8`/`W   ?  ?0 6    W6    WX<@DHLPҧ~TsRNW  ( ( D : \ pױ'(R (> )H     ,   aP/\ +! (() )((  ' p7! BW  D ,,-V  ~TǎPǞLǮHǾD@<XXW0@ A#1 ! 1W @(#)tail.c 6.1 87/11/23 DX||d|||||p-10ltail: cannot open input usage: tail [+/-[n][lbc][f]] [file] @(#)ctype.c 6.1 87/11/23 ((((( H @(#)mon.c 6.1 87/11/23 PROFDIRmon.out @(#)perror.c 6.1 87/11/23 : Unknown error @(#)sleep.c 6.1 87/11/23 @(#)data.c 6.1 87/11/23 @x@x@BpRx @(#)flsbuf.c 6.1 87/11/23 @(#)stdiom.h 6.1 87/11/23 @(#)fprintf.c 6.1 87/11/23 b @(#)errlst.c 6.1 87/11/23 0@Xd,8DXhx   8 H T l      !!$!D!`!p.Error 0Not ownerNo such file or directoryNo such processInterrupted system callI/O errorNo such device or addressArg list too longExec format errorBad file numberNo child processesNo more processesNot enough spacePermission deniedBad addressBlock device requiredDevice busyFile existsCross-device linkNo such deviceNot a directoryIs a directoryInvalid argumentFile table overflowToo many open filesNot a typewriterText file busyFile too largeNo space left on deviceIllegal seekRead-only file systemToo many linksBroken pipeArgument out of domainResult too largeNo message of desired typeIdentifier removedChannel number out of rangeLevel 2 not synchronizedLevel 3 haltedLevel 3 resetLink number out of rangeProtocol driver not attachedNo CSI structure availableLevel 2 haltedDeadlock condition if locked @(#)getenv.c 6.1 87/11/23 @(#)isatty.c 6.1 87/11/23 @(#)malloc.c 6.1 87/11/23 000000000000000000000123456789abcdef0123456789ABCDEF @(#)dowrite.c 6.1 87/11/23 @(#)print.h 6.1 87/11/23 @(#)ecvt.c 6.1 87/11/23 Fn CAy7Aׄ@È@Y@$ @(#)fwrite.c 6.1 87/11/23 @(#)stdiom.h 6.1 87/11/23 @(#)memchr.c 6.1 87/11/23 u!jX 5pDh.text5 .datap6@.bss--Dh 0  !2$0 "R[W`DHLPTX~\$P-Hp \&p!4ҋR @rPPP(:0p@ lx P! P!q0 (01 PPPP0  lfP P0P 䌑p\P PPP PP P( PP(g*P( P 0P Jȓ^ ~\ǎXǞTǮPǾLHD``WH@8<@~Dtq c(! l c(! H l  wD H 4  ,k~Dǎ@Ǟ<Ǯ8HHWp[BX?@DHLP~Tp-r-b 0 - \p$- - --p   P0P0pP8-p q-  ( ^0  8! 01'q2! 'q/  !' :Gq21304!:'q.@,/ @H-- -P-q9(9#0@@5601 0- -) ~TǎPǞLǮHǾD@XXWH@~Dpp pp~  l" P   h! ~Dǎ@HHW!21!0W! W!120W8 ȧ~4p.q(~488W@8~<pp ~W  < r   @ ~<ǎ8@@W8 ȧ~4p T g "Q%(   ~488WH<΀ ~@q R  Bb p'(! ,>     BG G!    g   ,Q"%(  D b j D p     ~@ǎ<HHWH<@~DpǐLJ D   p  p' (. (\   ~Dǎ@Ǟ<HHW8 ȧ~4p  *        |'Q!R D D p%  ' p7! ,~488W@8~<p  ( ppPP@W( pp^ *    p& ppPP@WvW @  ~<ǎ8@@WP pR a!` !WH@~Dq!\ l~Dǎ@HHWH<@~Dr '$~Dǎ@Ǟ<HHWH<0@~Dr 0 (+R a(a( <r NwX   @   "   " t  )r!  )a!"  p~Dǎ@Ǟ<HHW@~<p.`W .`&0 2  &'   ~<@@WX?@DHLP~Ts @Z  aP/\ (  )  ' p7! X (  <~TǎPǞLǮHǾD@XXW@\.`P.\(0 2  .  F  @@W[W![W[W2![W2![WC2!,[W[hW [<W2![WW@8~H PPWP48<@DH~L.`H.h! .`.`! .h.h.t.`.p.t.|ր.pqpN$.p.| .|x((lx! ( 2.t.`  !(hր.|x.tp0qp((q$.t .|sqp'( (&    .tp.|p  P.t! .`!.t xF p.p(P.p.x.p .|.p.|~LǎHǞDǮ@Ǿ<84PPW.p! !.t! .|WP<@DH~Ly   s  Rq(+p#X((p(psp.x~LǎHǞDǮ@Ǿ<PPW0+K "AC1!WAC$AhAC%hAC&hACWQWPX%AC1QCGxBBSD"vt ('"AC8('p'"$AC4$X$AhAC!FhAC" QP&#1qA@Aq@/@p/`/ #H / @ & /  ! / g `h`/ 0#.0/,@/0ȧN(..8. /,`/  FF=11=CCAM 0AMAP/,VA@/ E@/ p/}@.g/d``//  >  / /// @.p../"x,/(0/(ְ/(zkg(P/$(VPp: w q&"x,/(0/(ְ/(@.p..@ekd,/$( .DA4.,/(0/(..ְ/( ֠/./",/(0/(ְ/(Jkd(P/$(VP@:0D A&",/(0/(|ְ/(.pTkg(/$( wq( ,/(0/($ְ/(     / ֠/./",/(0/(ְ/(Jkd*P/$(VP@<0D A&",/(0/(tְ/(. fp/p\kg,/$( .wq,.,/(0/(ְ/( ֠///"x,/(0/(ְ/(Jkd*P/$(VP@< D A&"x,/(0/(`ְ/(H{ p   /$( @  .@ , 2 ! . 00  +   R  p.ؐ.ذ...WH@~Dp xW & !   D 6ހ  @  \(  ! p!!7 R   .   W    ~Dǎ@HHW (  WP@DH~Lr @D''!' )7`) ~LǎHǞDǮ@PPW2!6[W2![WPHx~Lp(,j~LǎHPPWPHx~Lp(,"~LǎHPPW`?8<@DH~Lp.ޠ//:T 2p/ p///p  :X ސ#` /Jp  C@:8 6p  : @$:@$ 1 P@$`^P5%cR:W^XP'86 0":B0C9"5 4r+!+ @$0:  ?05N?:@ 5p  5 @$0:  /( /( /:/( 0 &009 4 @$05p (  5(T/ &1/  &0   9( ~LǎHǞDǮ@Ǿ<8`/`W   ?  ?0 6    W6    WX<@DHLPҧ~TsRNW  ( ( D  \ pױ'(R (> )     ,   aP/\ +! (() )((F  ' p7! BW  D ,,-V  ~TǎPǞLǮHǾD@<XXW0@ A#1 ! 1W @(#)wc.c 6.1 87/11/23 rlwcwc: cannot open %s %s total %7ld%7ld%7ldusage: wc [-clw] [name ...]  @(#)mon.c 6.1 87/11/23 PROFDIRmon.out @(#)perror.c 6.1 87/11/23 : Unknown error @(#)data.c 6.1 87/11/23 PPPPPXRHbP @(#)flsbuf.c 6.1 87/11/23 @(#)stdiom.h 6.1 87/11/23 @(#)fopen.c 6.1 87/11/23 @(#)fprintf.c 6.1 87/11/23 @(#)fread.c 6.1 87/11/23 @(#)stdiom.h 6.1 87/11/23 @(#)printf.c 6.1 87/11/23 rX @(#)errlst.c 6.1 87/11/23 0@Th|   $ 8 L ` p       !!$!8!T!p!!!!!!.Error 0Not ownerNo such file or directoryNo such processInterrupted system callI/O errorNo such device or addressArg list too longExec format errorBad file numberNo child processesNo more processesNot enough spacePermission deniedBad addressBlock device requiredDevice busyFile existsCross-device linkNo such deviceNot a directoryIs a directoryInvalid argumentFile table overflowToo many open filesNot a typewriterText file busyFile too largeNo space left on deviceIllegal seekRead-only file systemToo many linksBroken pipeArgument out of domainResult too largeNo message of desired typeIdentifier removedChannel number out of rangeLevel 2 not synchronizedLevel 3 haltedLevel 3 resetLink number out of rangeProtocol driver not attachedNo CSI structure availableLevel 2 haltedDeadlock condition if locked @(#)getenv.c 6.1 87/11/23 @(#)isatty.c 6.1 87/11/23 @(#)malloc.c 6.1 87/11/23 000000000000000000000123456789abcdef0123456789ABCDEF @(#)filbuf.c 6.1 87/11/23 @(#)findiop.c 6.1 87/11/23 @(#)dowrite.c 6.1 87/11/23 @(#)print.h 6.1 87/11/23 @(#)ecvt.c 6.1 87/11/23 Fn CAy7Aׄ@È@Y@$ @(#)fwrite.c 6.1 87/11/23 @(#)stdiom.h 6.1 87/11/23 @(#)memchr.c 6.1 87/11/23 u!jd 9h$.text9 .datah:@.bss--$! 0  !2$0 "[W?X@DHLP~T X-a XB |"( 80 !ΰ;qY qKX ppX "d  ~Π.q K 0 Y%pϾX.qK0 0 uRQ +@ "(̓vҋx0 'p0(,Q%0 (# %0~(# .!q0(0( 0 0 0( @0Js~TǎPǞLǮHǾD@WH@~Dq  b !  (!7 !  7 ` !  *!0 ! L( 0 ~Dǎ@HHW@~< + x@ 0  x 0  0.# *  0pR0Z 0 9 ' p0 a $ f0 ' p . bBpy p0 ~<@@W1!~"ABCp΀xwtH!!~ǎWp[BX?@DHLP~Tp-r-b 0-,p$- - --p ԋ 0p0pp0x-p q-  ( ^( 0! 01'q2! 'q/^ !' :Gq21304!:'q.8,/ 8H-- -P-q9(9#0@@5601 0- -)~TǎPǞLǮHǾD@XXWH@~D!"ph pp"~ d"P  x`!h~Dǎ@HHW!21!0W! W!120WH@~Dp W & !   D 6ހ  @   (  ! p!!7  R   .   W    ~Dǎ@HHW8 ȧ~4p.q (~488W@8~<pp ~W  < r  !  ~<ǎ8@@W8 ȧ~4p T g "Q%(   ~488WH<΀ ~@q R  Bb p'(! ,>     BG G! x    g   ,Q"%(  D b j D p     ~@ǎ<HHWH<@~DpǐLJ D   p  p' (. (   ~Dǎ@Ǟ<HHW8 ȧ~4p  *        |'Q!R D D p%  ' p7! ,~488W@8~<p  ( ppP0W( pp ^*    p& ppP0WW @  ~<ǎ8@@WP pR a!` !WH@~Dq! l~Dǎ@HHWH<@~Dr '$~Dǎ@Ǟ<HHWH<0@~Dr 0 (+R a(a( <r NwX   @   "    t  )r!  )a!"0  p~Dǎ@Ǟ<HHW@~<p.`W .`&0 2  &'   ~<@@WX?@DHLP~Ts @  aP/\ (  )j  ' p7! X (  <~TǎPǞLǮHǾD@XXWP<@DH~Lp   W |tlǧ" !  40,'  W     )RV  H PPWP48<@DH~L.`H.h! .`.`! .h.h.t.`.p.t.|ր.pqpN$.p.| .|x((lx! ( 2.t.`  !(hր.|x.tp0qp((q$.t .|sqp'( (&    .tp.|p  P.t! .`!.t xF p.p(P.p.x.p .|.p.|~LǎHǞDǮ@Ǿ<84PPW.p! !.t! .|WP<@DH~Ly   s  Rq(+p#X((p(psp.x~LǎHǞDǮ@Ǿ<PPW0+K "AC1!WAC$AhAC%hAC&hACWQWPX%AC1QCGxBBSD"vt ('"AC8('p'"$AC4$X$AhAC!FhAC" QP&#1qA@Aq@/@p/`/ #H / @ & /  ! / g `h`/ 0#.0/,@/0ȧN(..8. /,`/  FF=11=CCAM 0AMAP/,VA@/ E@/ p/}@.g/d``//  >  / /// @.p../&,/(0/(ְ/(zkg(P/$(VPp: w q&&,/(0/(<ְ/(@.p..@ekd,/$( .DA4.,/(0/(..ְ/( ֠/./&,/(0/(ְ/(Jkd(P/$(VP@:0D A&&,/(0/(,ְ/(.pTkg(/$( wq( ,/(0/(ְ/(     / ֠/./&,/(0/(ְ/(Jkd*P/$(VP@<0D A&&,/(0/($ְ/(. fp/p\kg,/$( .wq,.,/(0/(ְ/( ֠///&,/(0/(lְ/(Jkd*P/$(VP@< D A&&,/(0/(ְ/(H{ p   /$( @  ޖ@ , 2 ! . 00  +   ۺ  p.ؐ.ذ...W  (  WP@DH~Lr @D''!'~ )7H) ~LǎHǞDǮ@PPW2!6[WPHx~Lp(,j~LǎHPPWPHx~Lp(,"~LǎHPPW`?8<@DH~Lp.ޠ//:T 2p/ p///p  :X ސ'x /Jp  C@:8 6p  : @$:@$ 1 P@$`^P5%cR:W^XP'86 0":B0C9"5 4r+!+ @$0:  ?05N?:@ 5p  5 @$0:  /( /( /:/( 0 &009 4 @$05p (  5(T/ &1/  &0   9( ~LǎHǞDǮ@Ǿ<8`/`W   ?  ?0 6    W6    WX<@DHLPҧ~TsRNW  ( ( D  \ pױ'(R (> )H     ,Ֆ   aP/\ +! (() )((  ' p7! נBW  D ,,-V  ~TǎPǞLǮHǾD@<XXW0@ A#1 ! 1W @(#)xd.c 6.1 87/11/23 r %crxd: %s cannot open xd: cannot open %s %s 0123456789ABCDEF @(#)mon.c 6.1 87/11/23 PROFDIRmon.out @(#)perror.c 6.1 87/11/23 : Unknown error @(#)data.c 6.1 87/11/23 0002B @(#)filbuf.c 6.1 87/11/23 @(#)flsbuf.c 6.1 87/11/23 @(#)stdiom.h 6.1 87/11/23 @(#)fopen.c 6.1 87/11/23 @(#)fprintf.c 6.1 87/11/23 @(#)fread.c 6.1 87/11/23 @(#)stdiom.h 6.1 87/11/23 @(#)fseek.c 6.1 87/11/23 @(#)printf.c 6.1 87/11/23 R @(#)errlst.c 6.1 87/11/23 """"###$#@#T#h#x#######$$$($8$H$\$p$$$$$$$%%%,%@%\%p%%%%%&& &0.Error 0Not ownerNo such file or directoryNo such processInterrupted system callI/O errorNo such device or addressArg list too longExec format errorBad file numberNo child processesNo more processesNot enough spacePermission deniedBad addressBlock device requiredDevice busyFile existsCross-device linkNo such deviceNot a directoryIs a directoryInvalid argumentFile table overflowToo many open filesNot a typewriterText file busyFile too largeNo space left on deviceIllegal seekRead-only file systemToo many linksBroken pipeArgument out of domainResult too largeNo message of desired typeIdentifier removedChannel number out of rangeLevel 2 not synchronizedLevel 3 haltedLevel 3 resetLink number out of rangeProtocol driver not attachedNo CSI structure availableLevel 2 haltedDeadlock condition if locked @(#)getenv.c 6.1 87/11/23 @(#)isatty.c 6.1 87/11/23 @(#)malloc.c 6.1 87/11/23 000000000000000000000123456789abcdef0123456789ABCDEF @(#)findiop.c 6.1 87/11/23 @(#)dowrite.c 6.1 87/11/23 @(#)print.h 6.1 87/11/23 @(#)ecvt.c 6.1 87/11/23 Fn CAy7Aׄ@È@Y@$ @(#)fwrite.c 6.1 87/11/23 @(#)stdiom.h 6.1 87/11/23 @(#)memchr.c 6.1 87/11/23 u!js (".text ( .data @.bsspp" 0  !2$0 Г" [W@ ~<q (08 8VV  p8 8V  p !   0Ά p>  ~<@@W80  P .08,( 0p0(88W@~<tpr8 8@ V 00~<@@W@~<tp8 8H V 00~<@@W8~8 8P V6V0088WH<@~Dp8 8 VZBp8 8 Vhp8p 8 V"@ ؋p8p 8 DV" hp8p 8 V" xVp8p 8 V"\ ,Vp8p 8 `V" ,p8p 8 VJ0 8  p8p 8 V:T8 8d lVVp8p 8 PPWX?@DHLP~Tpxrtb 0 x Dp$t p pxp  @@pHtp qp  ( ^`  h! 01'q2! 'q/v !' :Gq21304!:'q.p,/ phtt tPpq9(9#0@@5601 0p p)~TǎPǞLǮHǾD@XXWH@~Dp pp  "p  !~Dǎ@HHW!2! W!21!0W! W!120W8 ȧ~4pЋ.q (~488W@8~<pp ~W  < r f   ~<ǎ8@@W8 ȧ~4p T g "Q%(   ~488WH<΀ ~@q R  Bb p '(! ,>     BG G!    g   ,Q"%(  D b j D p     ~@ǎ<HHWH<@~DpǐLJ D   p   p ' (. (<   ~Dǎ@Ǟ<HHW8 ȧ~4p  *        |'Q!R D D p %  ' p 7! ,~488W@8~<p  ( ppPPW Ћ( pp ا Ћ^*    p Ћ& ppPPW W @  ~<ǎ8@@WP pR a!` !W[W![W[W2!6[W2![WC2!,[W[W [TW![*W2![WW@8~ !^@\%! `p' `q;n@Xl  Pn@\(  ~TǎPǞLǮHǾD@<@`@`W !s*!  !0a#!  pWp[BX?@DHLP~Tp-r-b 0 - Lp$- - --p   99p9-p q-  ( ^Г  ؋! 01'q2! 'q/ ~ !' :Gq21304!:'q.,/ h-- -P-q9(9#0@@5601 0- -)~TǎPǞLǮHǾD@XXWH@~Dp pp  "p  !~Dǎ@HHW!2! W!21!0W! W!120W8 ȧ~4p@.qP(~488W@8~<pp ~W  < r n  @ ~<ǎ8@@W8 ȧ~4p T g "Q%(   ~488WH<΀ ~@q R  Bb p@'(! ,>     BG G!    g   ,Q"%(  D b j D p     ~@ǎ<HHWH<@~DpǐLJ D   p@  p@' (. (\   ~Dǎ@Ǟ<HHW8 ȧ~4p  *        |'Q!R D D p@%  ' p@7! ,~488W@8~<p  ( ppP9 W@( ppH@^ *    p@& ppP9 W@vW @  ~<ǎ8@@WP pR@ a!` !W@~<p.`W .`&0 2  &'   ~<@@W@\.`P\.\(0 2 \ . P v\  @@W[ W![W[W2![W2![WC2!,[W2![W[W [TW![*W2![WW@8~ PPWP48<@DH~L.`H.h! .`.`! .h.h.t.`.p.t.|ր.pqpN$.p.| .|x((lx! ( 2.t.`  !(hր.|`.tp0qp((q$.t .|sqp'( (&    .tp.|p  P.t! .`!.t xF p.p(P.p.x.p .|.p.|~LǎHǞDǮ@Ǿ<84PPW.p! !.t! .|WP<@DH~Ly   s  Rq(+p#X((p(psp.x~LǎHǞDǮ@Ǿ<PPW0+K "AC1!WAC$AhAC%hAC&hACWQWPX%AC1QCGxBBSD"vt ('"AC8('p'"$AC4$X$AhAC!FhAC" QP&#1qA@Aq@/@p/`/ #H / @ & /  ! / g `h`/ 0#.0/,@/0ȧN(.r.8. /,`/  FF=11=CCAM 0AMAP/,VA@/ E@/ p/}@.g/d``//  >  / /// @.p../ ,/(0/(Vְ/(zkg(P/$(VPp: w q& ,/(0/(ְ/(@.p..@ekd,/$( .DA4.,/(0/(..ְ/( ֠/./ ,/(0/(Fְ/(Jkd(P/$(VP@:0D A& ,/(0/(ְ/(.pTkg(/$( wq( ,/(0/(ְ/(     / ֠/./ ,/(0/(@ְ/(Jkd*P/$(VP@<0D A& ,/(0/(ְ/(. fp/p\kg,/$( .wq,.,/(0/(tְ/( ֠/// ,/(0/(,ְ/(Jkd*P/$(VP@< D A& ,/(0/(ְ/(H{ p   /$( @  .@ , 2 ! . 00  +   R  p.ؐ.ذ...WP@DH~Lr @D''!'V )7H)\ ~LǎHǞDǮ@PPW2!6[XWPHx~Lp(,j~LǎHPPWPHx~Lp(,"~LǎHPPW`?8<@DH~Lp.ޠ//:T 2p/ p///p  :X ސ!` /Jp  C@:8 6p  : @$:@$ 1 P@$`^P5%cR:W^XP'86 0":B0C9"5 4r+!+ @$0:  ?05N?:@ 5p  5 @$0:  /( /( /:/( 0 &009 4 @$05p (  5(T/ &1/  &0   9( ~LǎHǞDǮ@Ǿ<8`/`W   ?  ?0 6    W6    WX<@DHLPҧ~TsRNW  ( ( D  \ pױ@'(R (> )߈     ,n   aP/\ +! (() )((  ' p@7! xBW  D ,,-V ٜ ~TǎPǞLǮHǾD@<XXW0@ A#1 ! 1W @(#)du.c 6.1 87/11/23 .usage: du [-ars] [name ...] %ld %s ...du: bad status < %s > du: link table overflow. %ld %s Huge directory < %s >--call administrator du: cannot open < %s > du: cannot read < %s > du: cannot read < %s > bad dir entry <%s> %ld %s @(#)mon.c 6.1 87/11/23 PROFDIRmon.out @(#)perror.c 6.1 87/11/23 : Unknown error @(#)data.c 6.1 87/11/23 909098;(K0@ @(#)flsbuf.c 6.1 87/11/23 @(#)stdiom.h 6.1 87/11/23 @(#)fprintf.c 6.1 87/11/23 @(#)printf.c 6.1 87/11/23 [8 @(#)errlst.c 6.1 87/11/23  ,H\p  0@Pdx4Hdx  ( 8.Error 0Not ownerNo such file or directoryNo such processInterrupted system callI/O errorNo such device or addressArg list too longExec format errorBad file numberNo child processesNo more processesNot enough spacePermission deniedBad addressBlock device requiredDevice busyFile existsCross-device linkNo such deviceNot a directoryIs a directoryInvalid argumentFile table overflowToo many open filesNot a typewriterText file busyFile too largeNo space left on deviceIllegal seekRead-only file systemToo many linksBroken pipeArgument out of domainResult too largeNo message of desired typeIdentifier removedChannel number out of rangeLevel 2 not synchronizedLevel 3 haltedLevel 3 resetLink number out of rangeProtocol driver not attachedNo CSI structure availableLevel 2 haltedDeadlock condition if locked @(#)getenv.c 6.1 87/11/23 @(#)isatty.c 6.1 87/11/23 @(#)malloc.c 6.1 87/11/23 000000000000000000000123456789abcdef0123456789ABCDEF @(#)dowrite.c 6.1 87/11/23 @(#)print.h 6.1 87/11/23 @(#)ecvt.c 6.1 87/11/23 Fn CAy7Aׄ@È@Y@$ @(#)fwrite.c 6.1 87/11/23 @(#)stdiom.h 6.1 87/11/23 @(#)memchr.c 6.1 87/11/23 u!j 8% .text8 .data9@.bss-p-p% "x 0  !2$0 " B[WXDHLP~Tp/0 0 0 0 ̓RX0 ȓ:@0 ē"( 0 Г0 q  F0 0 qs \ 0(0,  @0 Tpsl0 8 s )9( 0 Zspp0H6 0 p1<l "0L  @ Bp+T ~TǎPǞLǮHǾDXXW? HLPTX~\q0($ 0 h8|0,  @& 0 8Fh0 d\(n  0L0H(0L  @, 0`'(~`0H0( 0Hzz":0* 0J* 0 8~(Np0 `d 0 0L0 (7\!>!  y j& 0 7<0 \0x0 XP " 0   0 7& 0 $8Z| RV$ 0 876\ `) D 0 P70L    ` r0 T 40<0@ " R J0,0 P L 8^& 0 d8~\ǎXǞTǮPǾLHW0 -p@/ !C1AA-p/!-p-p W 0/#  WH0    0 1.(>,0  ȓ(HHWWp Jr[BPT.> PPWP48<@DH~L-H-! --! --.-... ր.qpN$..  . x((lx! ( 2.-  !(hր. .p0qp((q$. . sqp'( (&T   6 .p. p  P.! -!. xF p.(P... . .. ~LǎHǞDǮ@Ǿ<84PPW.! !.! . WP<@DH~Ly   s  Rq(+p#X((p(psp.~LǎHǞDǮ@Ǿ<PPW0+K "AC1!WAC$AhAC%hAC&hACWQWPX%AC1QCGxBBSD"vt ('"AC8('p'"$AC4$X$AhAC!FhAC"     BG G!`    g   ,Q"%(  D b j D p     ~@ǎ<HHWH<@~DpǐLJ D   p   p ' (. (܂   ~Dǎ@Ǟ<HHW8 ȧ~4p  *        |'Q!R D D p %  ' p 7! ,~488W@8~<p  ( ppP0xW ( pp!ȧ ^*    p & ppP0xW NW @  ~<ǎ8@@WP pR a!` !W@~<p.`W .`&0 2  &'  ~<@@WP.p0>@DH".L @.M.p.@.DPPW!![W![W[W![jW. >$.;0[>W[W2!6[W! [W2![WC2!,[W2![W["xW "x[t"x"xW![JW [4W![W2![W@8~ QP&#1qA@Aq@/@p/`/ #H / @ & /  ! / g `h`/ 0#.0/,@/0ȧN(.Z.8. /,`/  FF=11=CCAM 0AMAP/,VA@/ E@/ p/}@.g/d``//  >  / /// @.p../',/(0/(Vְ/(zkg(P/$(VPp: w q&',/(0/(ְ/(@.p..@ekd,/$( .DA4.,/(0/(..ְ/( ֠/./'$,/(0/(Fְ/(Jkd(P/$(VP@:0D A&'$,/(0/(ְ/(.pTkg(/$( wq( ,/(0/(ְ/(     / ֠/./'$,/(0/(@ְ/(Jkd*P/$(VP@<0D A&'$,/(0/(ְ/(. fp/p\kg,/$( .wq,.,/(0/(tְ/( ֠///',/(0/(,ְ/(Jkd*P/$(VP@< D A&',/(0/(ְ/(H{ p   /$( @  @ , 2 ! . 00  +   B  p.ؐ.ذ...WP@DH~Lr @D''!'F )70)$ ~LǎHǞDǮ@PPWPHx~Lp(,j~LǎHPPWPHx~Lp(,"~LǎHPPW`?8<@DH~Lp.ޠ//:T 2p/ p///p  :X ސ' /Jp  C@:8 6p  : @$:@$ 1 P@$`^P5%cR:W^XP'86 0":B0C9"5 4r+!+ @$0:  ?05N?:@ 5p  5 @$0:  /( /( /:/( 0 &009 4 @$05p (  5(T/ &1/  &0   9( ~LǎHǞDǮ@Ǿ<8`/`W   ?  ?0 6    W6    WX<@DHLPҧ~TsRNW  ( ( D  \ pױ '(R (> )     ,v   aP/\ +! (() )((  ' p 7! BW  D ,,-V  ~TǎPǞLǮHǾD@<XXW0@ A#1 ! 1W @(#)mv.c 6.1 87/11/23 mvmvmvlnmv-fcplnmvcp%s: command must be named cp|mv|ln--defaults to `cp' /usr/lib/mv_dir%s: cannot exec() /usr/lib/mv_dir %s: %s not found mvmvlncpcpmv%s: cannot access %s %s : <%s> directory %s/%s%s: %s and %s are identical %s: %s: %o mode %s: cannot unlink %s %s: different file system %s: no permission for %s %s: cannot open %s %s: cannot create %s %s: bad copy to %s %s: cannot unlink %s .mvcp [-f]Usage: %s%s f1 f2 %s%s f1 ... fn d1 mv [-f] d1 d2 @(#)isatty.c 6.1 87/11/23 @(#)malloc.c 6.1 87/11/23 @(#)mon.c 6.1 87/11/23 PROFDIRmon.out @(#)perror.c 6.1 87/11/23 : Unknown error @(#)data.c 6.1 87/11/23 0002B @(#)filbuf.c 6.1 87/11/23 @(#)flsbuf.c 6.1 87/11/23 @(#)stdiom.h 6.1 87/11/23 @(#)fprintf.c 6.1 87/11/23 @(#)sprintf.c 6.1 87/11/23 R @(#)errlst.c 6.1 87/11/23 #`#h#t######$$$,$@$T$h$t$$$$$$$$%%$%8%H%X%p%%%%%%%&&,&H&X&h&&&&.Error 0Not ownerNo such file or directoryNo such processInterrupted system callI/O errorNo such device or addressArg list too longExec format errorBad file numberNo child processesNo more processesNot enough spacePermission deniedBad addressBlock device requiredDevice busyFile existsCross-device linkNo such deviceNot a directoryIs a directoryInvalid argumentFile table overflowToo many open filesNot a typewriterText file busyFile too largeNo space left on deviceIllegal seekRead-only file systemToo many linksBroken pipeArgument out of domainResult too largeNo message of desired typeIdentifier removedChannel number out of rangeLevel 2 not synchronizedLevel 3 haltedLevel 3 resetLink number out of rangeProtocol driver not attachedNo CSI structure availableLevel 2 haltedDeadlock condition if locked @(#)getenv.c 6.1 87/11/23 000000000000000000000123456789abcdef0123456789ABCDEF @(#)dowrite.c 6.1 87/11/23 @(#)print.h 6.1 87/11/23 @(#)ecvt.c 6.1 87/11/23 Fn CAy7Aׄ@È@Y@$ @(#)fwrite.c 6.1 87/11/23 @(#)stdiom.h 6.1 87/11/23 @(#)memchr.c 6.1 87/11/23 u!j "p.text .datappp@.bss/p/p"X 0  !2$0 p"[W@~8q0 /0 x$z rp< << V~8@@Wp[BX?@DHLP~Tp/xr/tb 0 t/x Dp$/t /p /p/xp  0 0 p0(/tp q/p  ( ^ȓ  Ћ! 01'q2! 'q/v !' :Gq21304!:'q.؆,/ h/t/t /tP/pq9(9#0@@5601 0/p /p)~~TǎPǞLǮHǾD@XXWH@~D`@p pp "p  h!X~Dǎ@HHW!2! W!21!0W! W!120W8 ȧ~4pX.q h(~488W@8~<pp ~W  < r f`   ~<ǎ8@@W8 ȧ~4p T g "Q%(   ~488WH<΀ ~@q R  Bb pX'(! ,>     BG G!    g   ,Q"%(  D b j D p     ~@ǎ<HHWH<@~DpǐLJ D   pX  pX' (. (   ~Dǎ@Ǟ<HHW8 ȧ~4p  *        |'Q!R D D pX%  ' pX7! ,~488W@8~<p  ( ppP00WX( pp `X^ħ*    pX& ppP00WX.W @  ~<ǎ8@@WP pRX a!` !W[W![W[WC2!,[W[XW X[\XXW^(C2![*W2![W`W@8~@ PPWP48<@DH~L/H/! //! ///////ր/qpN$// /x((lx! ( 2//  !(hր/X/p0qp((q$/ /sqp'( (&    /p/p  P/! /!/ xF p/(P/// ///~LǎHǞDǮ@Ǿ<84PPW/! !/! /WP<@DH~Ly   s  Rq(+p#X((p(psp/~LǎHǞDǮ@Ǿ<PPW0+K "AC1!WAC$AhAC%hAC&hACWQWPX%AC1QCGxBBSD"vt ('"AC8('p'"$AC4$X$AhAC!FhAC"     BG G!p    g   ,Q"%(  D b j D p     ~@ǎ<HHWH<@~DpǐLJ D   p  p' (. (   ~Dǎ@Ǟ<HHW8 ȧ~4p  *        |'Q!R D D p%  ' p7! ,~488W@8~<p  ( ppP00W( pp^*    p& ppP00WW @  ~<ǎ8@@WP pR a!` !W@~<p.`W .`&0 2  &'   ~<@@W!![2W[ W![W[W2![WC2!,[W2![W[hW h[lhhW![BW [,W2![WpW@8~ PPWP48<@DH~L.`H.h! .`.`! .h.h.t.`.p.t.|ր.pqpN$.p.| .|x((lx! ( 2.t.`  !(hր.|H.tp0qp((q$.t .|sqp'( (&    r.tp.|p  P.t! .`!.t xF p.p(P.p.x.p .|.p.|~LǎHǞDǮ@Ǿ<84PPW.p! !.t! .|WP<@DH~Ly   s  Rq(+p#X((p(psp.x~LǎHǞDǮ@Ǿ<PPW0+K "AC1!WAC$AhAC%hAC&hACWQWPX%AC1QCGxBBSD"vt ('"AC8('p'"$AC4$X$AhAC!FhAC" QP&#1qA@Aq@/@p/`/ #H / @ & /  ! / g `h`/ 0#.0/,@/0ȧN(.r.8. /,`/  FF=11=CCAM 0AMAP/,VA@/ E@/ p/}@.g/d``//  >  / /// @.p../H,/(0/(Vְ/(zkg(P/$(VPp: w q&H,/(0/(ְ/(@.p..@ekd,/$( .DA4.,/(0/(..ְ/( ֠/./\,/(0/(Fְ/(Jkd(P/$(VP@:0D A&\,/(0/(ְ/(.pTkg(/$( wq( ,/(0/(ְ/(     / ֠/./\,/(0/(@ְ/(Jkd*P/$(VP@<0D A&\,/(0/(ְ/(. fp/p\kg,/$( .wq,.,/(0/(tְ/( ֠///H,/(0/(,ְ/(Jkd*P/$(VP@< D A&H,/(0/(ְ/(H{ p   /$( @  @ , 2 ! . 00  +    p.ؐ.ذ...WP@DH~Lr @D''!' )7H)\ ~LǎHǞDǮ@PPW2!6[XWPHx~Lp(,j~LǎHPPWPHx~Lp(,"~LǎHPPW`?8<@DH~Lp.ޠ//:T 2p/ p///p  :X ސ /Jp  C@:8 6p  : @$:@$ 1 P@$`^P5%cR:W^XP'86 0":B0C9"5 4r+!+ @$0:  ?05N?:@ 5p  5 @$0:  /( /( /:/( 0 &009 4 @$05p (  5(T/ &1/  &0   9( ~LǎHǞDǮ@Ǿ<8`/`W   ?  ?0 6    W6    WX<@DHLPҧ~TsRNW  ( ( D 2 \ pױ'(R (> )߈     ,   aP/\ +! (() )((  ' p7! BW  D ,,-V   ~TǎPǞLǮHǾD@<XXW0@ A#1 ! 1W @(#)rmdir.c 6.1 87/11/23 rmdir: usage: rmdir dirname ... ../........rmdir: %s non-existent rmdir: cannot stat "." rmdir: %s not a directory rmdir: cannot remove current directory rmdir: %s unreadable rmdir: %s not empty rmdir: cannot remove . or .. rmdir: %s: no permission rmdir: cannot remove mountable directory rmdir: %s not removed @(#)mon.c 6.1 87/11/23 PROFDIRmon.out @(#)perror.c 6.1 87/11/23 : Unknown error @(#)data.c 6.1 87/11/23 0@0@0H28B@ @(#)flsbuf.c 6.1 87/11/23 @(#)stdiom.h 6.1 87/11/23 @(#)fprintf.c 6.1 87/11/23 RH @(#)errlst.c 6.1 87/11/23 X`l$8L`l0@Phx$@P`|.Error 0Not ownerNo such file or directoryNo such processInterrupted system callI/O errorNo such device or addressArg list too longExec format errorBad file numberNo child processesNo more processesNot enough spacePermission deniedBad addressBlock device requiredDevice busyFile existsCross-device linkNo such deviceNot a directoryIs a directoryInvalid argumentFile table overflowToo many open filesNot a typewriterText file busyFile too largeNo space left on deviceIllegal seekRead-only file systemToo many linksBroken pipeArgument out of domainResult too largeNo message of desired typeIdentifier removedChannel number out of rangeLevel 2 not synchronizedLevel 3 haltedLevel 3 resetLink number out of rangeProtocol driver not attachedNo CSI structure availableLevel 2 haltedDeadlock condition if locked @(#)getenv.c 6.1 87/11/23 @(#)isatty.c 6.1 87/11/23 @(#)malloc.c 6.1 87/11/23 000000000000000000000123456789abcdef0123456789ABCDEF @(#)dowrite.c 6.1 87/11/23 @(#)print.h 6.1 87/11/23 @(#)ecvt.c 6.1 87/11/23 Fn CAy7Aׄ@È@Y@$ @(#)fwrite.c 6.1 87/11/23 @(#)stdiom.h 6.1 87/11/23 @(#)memchr.c 6.1 87/11/23 u!j| 1H$X.text1H .data1@.bss--$X 0  !2$0 "[W@8~<p    rh 2:Dqp ~<ǎ8@@WH@~Dpȋ /π(.8 .h<.ȓ F*A 4,hX'     lH8H4H 4h|.H  tH0H XPh.H DHH H! l d~Dǎ@HHWp[BX?@DHLP~Tp-r-b 0 - <p$- - --p   0 0 p0(-p q-  ( ^ؓ r ! 01'q2! 'q/ v !' :Gq21304!:'q.,/ p-- -P-q9(9#0@@5601 0- -)~TǎPǞLǮHǾD@XXWH@~Dp pp  t" dx   H! 8~Dǎ@HHW!1021!0W!21!0W! W2!@4(ARQ!P4AQW!120W8 ȧ~4pH.qX(~488W@8~<pp ~W  < r    ~<ǎ8@@W8 ȧ~4p T g "Q%(   ~488WH<΀ ~@q R  Bb pH'(! ,>     BG G!8    g   ,Q"%(  D b j D p     ~@ǎ<HHWH<@~DpǐLJ D   pH  pH' (. (   ~Dǎ@Ǟ<HHW8 ȧ~4p  *        |'Q!R D D pH%  ' pH7! ,~488W@8~<p  ( ppP00WH( ppPH^d*    pH& ppP00WHΆW @  ~<ǎ8@@WP pRH a!` !W@~<p.`W .`&0 2  &' V  ~<@@W!![W2![W[W![W/[W[W[W! [zW2![`WC2!,[W[(W [W!00[WH .(N0n8@HPX` W`X .(N0n8Ɏ@ɮHPԩة>^觾[ [,W2![WW@8~ PPWP48<@DH~L.`H.h! .`.`! .h.h.t.`.p.t.|ր.pqpN$.p.| .|x((lx! ( 2.t.`  !(hր.|.tp0qp((q$.t .|sqp'( (&4    .tp.|p  P.t! .`!.t xF p.p(P.p.x.p .|.p.|~LǎHǞDǮ@Ǿ<84PPW.p! !.t! .|WP<@DH~Ly   s  Rq(+p#X((p(psp.x~LǎHǞDǮ@Ǿ<PPW0+K "AC1!WAC$AhAC%hAC&hACWQWPX%AC1QCGxBBSD"vt ('"AC8('p'"$AC4$X$AhAC!FhAC" QP&#1qA@Aq@/@p/`/ #H / @ & /  ! / g `h`/ 0#.0/,@/0ȧN(.r.8. /,`/  FF=11=CCAM 0AMAP/,VA@/ E@/ p/}@.g/d``//  >  / /// @.p../,/(0/(Vְ/(zkg(P/$(VPp: w q&,/(0/(ְ/(@.p..@ekd,/$( .DA4.,/(0/(..ְ/( ֠/./,/(0/(Fְ/(Jkd(P/$(VP@:0D A&,/(0/(ְ/(.pTkg(/$( wq( ,/(0/(ְ/(     / ֠/./,/(0/(@ְ/(Jkd*P/$(VP@<0D A&,/(0/(ְ/(. fp/p\kg,/$( .wq,.,/(0/(tְ/( ֠///,/(0/(,ְ/(Jkd*P/$(VP@< D A&,/(0/(ְ/(H{ p   /$( @  @ , 2 ! . 00  +    p.ؐ.ذ...WP@DH~Lr @D''!' )7H)\ ~LǎHǞDǮ@PPW2!6[XWPHx~Lp(,j~LǎHPPWPHx~Lp(,"~LǎHPPW`?8<@DH~Lp.ޠ//:T 2p/ p///p  :X ސH /Jp  C@:8 6p  : @$:@$ 1 P@$`^P5%cR:W^XP'86 0":B0C9"5 4r+!+ @$0:  ?05N?:@ 5p  5 @$0:  /( /( /:/( 0 &009 4 @$05p (  5(T/ &1/  &0   9( ~LǎHǞDǮ@Ǿ<8`/`W   ?  ?0 6    W6    WX<@DHLPҧ~TsRNW  ( ( D j \ pױH'(R (> )߈     ,   aP/\ +! (() )((  ' pH7!  BW  D ,,-V D ~TǎPǞLǮHǾD@<XXW0@ A#1 ! 1W @(#)mkdir.c 6.1 87/11/23 mkdir: arg count ./..mkdir: cannot access %s mkdir: cannot make directory %s mkdir: cannot link %s mkdir: cannot link %s @(#)mon.c 6.1 87/11/23 PROFDIRmon.out @(#)perror.c 6.1 87/11/23 : Unknown error @(#)data.c 6.1 87/11/23 0@0@0H28B@H @(#)flsbuf.c 6.1 87/11/23 @(#)stdiom.h 6.1 87/11/23 @(#)fprintf.c 6.1 87/11/23 RH @(#)errlst.c 6.1 87/11/23 0DXh|(8L`t0L`| .Error 0Not ownerNo such file or directoryNo such processInterrupted system callI/O errorNo such device or addressArg list too longExec format errorBad file numberNo child processesNo more processesNot enough spacePermission deniedBad addressBlock device requiredDevice busyFile existsCross-device linkNo such deviceNot a directoryIs a directoryInvalid argumentFile table overflowToo many open filesNot a typewriterText file busyFile too largeNo space left on deviceIllegal seekRead-only file systemToo many linksBroken pipeArgument out of domainResult too largeNo message of desired typeIdentifier removedChannel number out of rangeLevel 2 not synchronizedLevel 3 haltedLevel 3 resetLink number out of rangeProtocol driver not attachedNo CSI structure availableLevel 2 haltedDeadlock condition if locked @(#)getenv.c 6.1 87/11/23 @(#)isatty.c 6.1 87/11/23 @(#)malloc.c 6.1 87/11/23 000000000000000000000123456789abcdef0123456789ABCDEF @(#)dowrite.c 6.1 87/11/23 @(#)print.h 6.1 87/11/23 @(#)ecvt.c 6.1 87/11/23 Fn CAy7Aׄ@È@Y@$ @(#)fwrite.c 6.1 87/11/23 @(#)stdiom.h 6.1 87/11/23 @(#)memchr.c 6.1 87/11/23 u!j f10.textf .data00g0@.bss%%1 0  !2$0 0"+[WxDH~LqLNp0 p<0(  x(! 0a#(! pPWl 0008080@0Hz0H0@f0P0PT0X0H0@80`08080h0808F,?n bCZ|RN "x:a2pW0h0h08080P0P0p0p0H0@0X0H0@0H0@0x0x00000808l0000000808<0000000808  00080800000008080`0`0808v00b00N00<00080800Ћ ( 0#a0E'0І,0P0P000ȶ008000`000000Ȇ00000 000&00000@0H0B\B0$h C&0BA0$ ГC&b0H0@zܓ&j  @2.tt z @ @ ! P @  p)0$  $)0B%|   8p!t0H0@,p8 1 1PpR  8  `PpR%'"" %'"  8!!0z" #!  tt .t1 010  0$>$3tHt 0p d0p0І ttt  ! 0tp2 tt 0p!0 T#0P1P1 1 1%11 1P1 P11   ~1)1)1 w1ltt.t % "~LǎHǞDxxWXDHLP~Tp1p1(V 8    b0Ў. 0p  *0R$>$160h ϑp 0ǁ d44vp >t1(4x 0$ >,'̋"41 p1 %000Ȇ&10 ,?18 180010Ȏ0P0p! %Ep#,~TǎPǞLǮHǾDXXWh8<@DHL~P0H0@ @1\^\Q"0@0X0H*yt( n\ sPЧ^XpR^TP^dh *nXǾd^Tp^`"{(`n`n\lߓ ^dT^dnXm~PǎLǞHǮDǾ@<8hhWH@~DqL0\0@200( D=b18 18$ H=>18 180Ȇh0@00ހ P ހ X b c <18 1800>4^ 1818z z `0`&z I  <1` 81`z ^00 1` , 1` 91818R001` D* 1` 9j1818~Dǎ@HHW8 ~4p 1ht( (~488W8"!01hR #5%    ! 0V  181888W818Ȏ <0@,/ҋ ,18181 18  @P /j 18| /" 1818$0HR .  18181 @P .R 18d ."! 18 11888W818ȆL -  1888WX~Dp 11p2, '3 1001pH!3H0PJ . 0H0@ J)0 1 1jz r jH2.JB!C1B1p*101~DXXWh<@~D% |  p   0 p0$  $0& ȓ1QP%  Q!Bp0 $%0!  0pq  "  !  0pq08zH5 . (1(  BJXL @*0p Z \4`PdHbTz2cTzp -L PRN0\ &0d ` b&cX81010~Dǎ@Ǟ<hhWs  !s'! !us.! @W0!% A0C10% (0/1 0 1@!4.% WP?8<@DH ~L 0  (  0 00 0  (pF   : q*p(+r)*0 0$x    0  (~LǎHǞDǮ@Ǿ<8PPW80! 0p n!z"0 # 81 d2, z"0 # 0 d2 ( z"0 # 0 d2  0 :0 ! 2 r   \ N!z"0 # !!z0  " 88WH8 <@~D  00p?01818\%"!\ s0!  $ ! %4$ 2!  !# s0!  " ! $ڋ" 2!  !#0q1818$  !$t$! xp_S~Dǎ@Ǟ<Ǯ8HHW0 Гh00W ! pW @DHLPT~Xpp pp  p  \\ώ\ /!'! /!\,F\ ώ\b\,v +& ċ  TH  ,  , ",Ћ    `*  l P^܋"1  `P%^܎  lІ    +v *Ԅ2  + H0 4 +Ȏ ހ4@~$r  rrrr^rP ܋'q! 1q((# (q ϡ(ρ"Nr((* ( L  T ְ  ր  | ϱlρ(>r(( !n(юǎ܋'q!P e  80   @  (B~XǎTǞPǮLǾHD@W@~@ PPWP48<@DH~L-H-! --! -------ր-qpN$-- -x((lx! ( 2--  !(hր--p0qp((q$- -sqp'( (&    -p-p  P-! -!- xF p-(P--- ---~LǎHǞDǮ@Ǿ<84PPW-! !-! -WP<@DH~Ly   s  Rq(+p#X((p(psp-~LǎHǞDǮ@Ǿ<PPW0+K "AC1!WAC$AhAC%hAC&hACWQWPX%AC1QCGxBBSD"vt ('"AC8('p'"$AC4$X$AhAC!FhAC"     BG G! ؎    g   ,Q"%(  D b j D p     ~@ǎ<HHWH<@~DpǐLJ D   p  p' (. (T   ~Dǎ@Ǟ<HHW8 ȧ~4p  *        |'Q!R D D p%  ' p7! ,~488W@8~<p  ( ppP4W( pp^鼧*    p& ppP4W&W @  ~<ǎ8@@WP pR a!` !WH@~Dq l~Dǎ@HHWH<@~Dr '$~Dǎ@Ǟ<HHWH<0@~Dr 0 (+R a(a( <r NwX   @   "    t  )r!  )a!"X  p~Dǎ@Ǟ<HHW@~<p.`W .`&0 2  &'  ~<@@WX?@DHLP~Ts @  aP/\ (  )  ' p7! X (  <~TǎPǞLǮHǾD@XXW@\.`P.\(0 2 ̋ . .  @@W@~<p     W    ~<@@W!![jW[XW![:W[W2!6[W2![W2![WC2!,[W2![W[W [tW![JW [W2![WWp.....Ǽ/ @P PP/$PpRUP/$%py}kg,P/$(VP p:w]ѡ[q" ,/(0/(Rְ/(Fp/@c(stdxX܋ `/ d`/ P/$([P  ,/(0/(ְ/(`/ d`/ (P/$[PQ̡P! ! ,/(0/(Pְ/(`/ d`/ 'Π- 8ы0):@0CAMр ѡ(P/$[P Q фP р}-!ш},/(0/(xְ/(`/ d`/ / qфыh`/ d`/ / qфы4/./`/ csd(u$+\-` d#h.l*x0Āelh%ox0XeEfgGn9ld`/  /d`/ @ / / "  !/`d`/ }.; -!10.@@ V 8@  /  +!10."  /  !10. @ /00 0ѡ $@ZPECѡMѡ p/ }/ u// ^d`/ } pq 5#"0ѡP n b V J@ / 6@ */d`/ / / d`/ / @     0 9: @ / /z /WC0_D0_D0d`/ - /p&@ 4//  a@ '/ -// pX Oo620.x 0 .."X.  //   @ / & / g `h`/ / 0!#и.0/,@/0ȧN(. .8/0 - ..D  5  + .. ..g ю 0ѡaP/ P .aP6 QaP P/P/ ׶`/p/8g. 06P/,QPU):RECAaFSRQaVrgaga/,- +aea E`.rvp/// #2#: @ / & / g `h`/ / 0<#0/,@/0ȧN(..8/0`/ P/,/Q)-0!-.! .B +.! .   .! .E00@qA0- '1qA@Aq@ `  .'qF<Ad &$ / /A@> QP&#1qA@Aq@/@p/`/ #H / @ & /  ! / g `h`/ 0#.0/,@/0ȧN(..8. /,`/  FF=11=CCAM 0AMAP/,VA@/ E@/ p/}@.g/d``//  >  / /// @.p../,/(0/(ְ/(zkg(P/$(VPp: w q&,/(0/(<ְ/(@.p..@ekd,/$( .DA4.,/(0/(..ְ/( ֠/./,/(0/(ְ/(Jkd(P/$(VP@:0D A&,/(0/(,ְ/(.pTkg(/$( wq( ,/(0/(ְ/(     / ֠/./,/(0/(ְ/(Jkd*P/$(VP@<0D A&,/(0/($ְ/(. fp/p\kg,/$( .wq,.,/(0/(ְ/( ֠///,/(0/(lְ/(Jkd*P/$(VP@< D A&,/(0/(ְ/(H{ p   /$( @  F@ , 2 ! . 00  +   j  p.ؐ.ذ...W (  WP@DH~Lr @D''!'. )70) ~LǎHǞDǮ@PPWPHx~Lp(,j~LǎHPPWPHx~Lp(,"~LǎHPPW`?8<@DH~Lp.ޠ//:T 2p/ p///p  :X ސP /Jp  C@:8 6p  : @$:@$ 1 P@$`^P5%cR:W^XP'86 0":B0C9"5 4r+!+ @$0:  ?05N?:@ 5p  5 @$0:  /( /( /:/( 0 &009 4 @$05p (  5(T/ &1/  &0   9( ~LǎHǞDǮ@Ǿ<8`/`W   ?  ?0 6    W6    WX<@DHLPҧ~TsRNW  ( ( D  \ pױ'(R (> )p     ,^   aP/\ +! (() )((Ύ  ' p7! hBW  D ,,-V ތ ~TǎPǞLǮHǾD@<XXW0@ A#1 ! 1W @(#)ls.c 6.1 87/11/23 >>> >>>>>>>>>>(>>>>>\F$8hprrRadCxmnlogrtucpFbqisfusage: ls -RadCxmnlogrtucpFbqisf [files] /etc/passwd%s file cannot be opened for reading /etc/passwd/etc/group%s file cannot be opened for reading /etc/groupCOLUMNSls: out of memory ...:ls: out of memory ls: out of memory total %ld*/%u %5u %ld %4ld %4d %-9.9s%-9u%-9.9s%-9u%3d,%3d%7ld %-7.7s %-4.4s %-12.12s %s%s%.14s%sr-w-@s@xS- r-w-sxS-r-w-txT-      ( H X hr%s unreadable ls: out of memory %s not found  HP. @(#)curses.c 6.1 87/11/23 @(#)curshdr.h 6.1 87/11/23  1 unknownPackaged for USG UNIX 6.0, 3/6/83 @(#)resetterm.c 6.1 87/11/23 @(#)curshdr.h 6.1 87/11/23 @(#)uparm.h 6.1 87/11/23 @(#)setupterm.c 6.1 87/11/23 @(#)curshdr.h 6.1 87/11/23 @(#)uparm.h 6.1 87/11/23 TERMunknownTERMINFO/usr/lib/terminfo/a//usr/lib/terminfo/ . /usr/lib/terminfo/ . No such terminal: corrupted term entry term entry too long LINESCOLUMNS @(#)def_shell.c 6.1 87/11/23 @(#)reset_prog.c 6.1 87/11/23 @(#)curshdr.h 6.1 87/11/23 @(#)uparm.h 6.1 87/11/23 @(#)resetshell.c 6.1 87/11/23 @(#)curshdr.h 6.1 87/11/23 @(#)uparm.h 6.1 87/11/23 @(#)atoi.c 6.1 87/11/23 @(#)calloc.c 6.1 87/11/23 @(#)ctime.c 6.1 87/11/23 Day Mon 00 00:00:00 1900 SunMonTueWedThuFriSatJanFebMarAprMayJunJulAugSepOctNovDecTZp,(PDTPSTW`/Lw/K:/JMFw/ @(#)ctype.c 6.1 87/11/23 ((((( H @(#)getenv.c 6.1 87/11/23 @(#)getopt.c 6.1 87/11/23 --: illegal option -- : illegal option -- : option requires an argument -- : option requires an argument --  @(#)isatty.c 6.1 87/11/23 @(#)malloc.c 6.1 87/11/23 @(#)memset.c 6.1 87/11/23 @(#)mon.c 6.1 87/11/23 PROFDIRmon.out @(#)perror.c 6.1 87/11/23 : Unknown error @(#)qsort.c 6.1 87/11/23 @(#)data.c 6.1 87/11/23 4446F @(#)fgetc.c 6.1 87/11/23 @(#)filbuf.c 6.1 87/11/23 @(#)flsbuf.c 6.1 87/11/23 @(#)stdiom.h 6.1 87/11/23 @(#)fopen.c 6.1 87/11/23 @(#)fprintf.c 6.1 87/11/23 @(#)fread.c 6.1 87/11/23 @(#)stdiom.h 6.1 87/11/23 @(#)printf.c 6.1 87/11/23 @(#)rew.c 6.1 87/11/23 V @(#)errlst.c 6.1 87/11/23  (8P\x $0<P`p0@Ldx<Xh.Error 0Not ownerNo such file or directoryNo such processInterrupted system callI/O errorNo such device or addressArg list too longExec format errorBad file numberNo child processesNo more processesNot enough spacePermission deniedBad addressBlock device requiredDevice busyFile existsCross-device linkNo such deviceNot a directoryIs a directoryInvalid argumentFile table overflowToo many open filesNot a typewriterText file busyFile too largeNo space left on deviceIllegal seekRead-only file systemToo many linksBroken pipeArgument out of domainResult too largeNo message of desired typeIdentifier removedChannel number out of rangeLevel 2 not synchronizedLevel 3 haltedLevel 3 resetLink number out of rangeProtocol driver not attachedNo CSI structure availableLevel 2 haltedDeadlock condition if locked 000000000000000000000123456789abcdef0123456789ABCDEF @(#)findiop.c 6.1 87/11/23 @(#)dowrite.c 6.1 87/11/23 @(#)print.h 6.1 87/11/23 @(#)ecvt.c 6.1 87/11/23 Fn CAy7Aׄ@È@Y@$ @(#)fwrite.c 6.1 87/11/23 @(#)stdiom.h 6.1 87/11/23 @(#)memchr.c 6.1 87/11/23 u!mN U(8$.textU .data(8U@.bss==$0( 0  !2$0 "b[WP@DHT~L@X -tl a(! > a(!  g$ h~ "**f@ @(&~@;p&J@9<n&@::&@=&@=&z@>l&F@>8j&@<6@;@< &@8@=@>(p0 @=@>N8~:@;@<@:@9@=@>ޠL *2@4  @4 !@4 @4ޠL 4@4 @4 !@4 @4ޠN v4@4  @4 p !@4 @4ޠ@J 4 ! !@0 @0*@0 @0ޠ HJ 4 ! !@2 @2*@2 @2ޠJ j4 ! !@4 @4*@4 @4ޠJ 4 ! !@6 @6*@6 @6@(8@ $ @ *@,T2~LǎHǞDǮ@PPW@ *} @0h "R@@W@ R(0@  #2 !"2 (0@  #" @(@(W@~ | ^"xp@08΋@  HPXr `Z @ lB t*  |        p@24zfR  ē: ̓" @ , ԓ t( p l h@ d `\Tp@6:& ^ 0 ^ 0 ^ @   (X~<@@W@~` \ 0 ^> 0 ^$ 0  5 0@ ^ 0 ^ 0 ^  0 ^Xp@0 ^v $^` 0^J <^4 H0 ^ P0 ^ \0@ ^ d0 ^ l0 ^ t0 ^T |0 ^r 0 ^X 0 ^>P2p@6 ^ ^ ^ ^ 0 ^ 0 ^ 0@ ^ 0 ^lL`p@2 ^D ^. ^ ^ 0 ^ 0 ^ 0@ ^ 0 ^ H D @ <@ 8x 4`0~<@@W ^.? -  WH@~Dp p "!4 " t  8 X0 F  , * q  D <  (! ( `q L( ~Dǎ@HHW@ X @@W@ p1`# d@@Wh @00@2@@4@6(@9,@:0@;4@<8@=<@>@@?D@@pH#4 hhW&h^p^(^t^,^x^0^|^4^^8^^<^^@^^D^^H^.h>l^L 6 Nj@0n@2r@4v@6.x@921$W0~@(!$"$ d @(!$"( !@+B $ @-$ 1@(!$"$ D 0!*@0A$p(AGDD@0 ~Wp[BX?@DHLP~Tp=r=b 0 D= p$= = ==p   @H@Hp@P=p q=  ( ^* B *! 01'q2! 'q/ . !' :Gq21304!:'q.*,/ *H== =P=q9(9#0@@5601 0= =) N~TǎPǞLǮHǾD@XXWH@~D001p*@ pp0X~  D*<" 4P   *8! ~Dǎ@HHW!21!0W! W!120W8 ȧ~4p*p.q/(~488W@8~<pp ~W  < r >00   ~<ǎ8@@W8 ȧ~4p T g "Q%(   ~488WH<΀ ~@q R  Bb p.p'(! ,>     BG G!h    g   ,Q"%(  D b j D p     ~@ǎ<HHWH<@~DpǐLJ D   p.p  p.p' (. (   ~Dǎ@Ǟ<HHW8 ȧ~4p  *        |'Q!R D D p.p%  ' p.p7! ,~488W@8~<p  ( ppP@XW.p( pp/x.p^*    p.p& ppP@XW.pW @  ~<ǎ8@@WP pR.p a!` !W@~<p.`W .`&0 2  &'   ~<@@W@\.`P*.\(0 2 * . * *  @@W@\.`.\*p@@W@.` >`#V@@WX@~D.x qώxTP.LH@HU(~Dǎ@XXW[W![W[W2!6[WC2!,[W[h0(W 0([<0(0(W2![W00W@8~x PPWP48<@DH~L>`H>h! >`>`! >h>h>t>`>p>t>|ր>pqpN$>p>| >|x((lx! ( 2>t>`  !(hր>|x>tp0qp((q$>t >|sqp'( (&    >tp>|p  P>t! >`!>t xF p>p(P>p>x>p >|>p>|~LǎHǞDǮ@Ǿ<84PPW>p! !>t! >|WP<@DH~Ly   s  Rq(+p#X((p(psp>x~LǎHǞDǮ@Ǿ<PPW0+K "AC1!WAC$AhAC%hAC&hACWQWPX%AC1QCGxBBSD"vt ('"AC8('p'"$AC4$X$AhAC!FhAC">>>>Ǽ? @P PP?$PpRU.pP?$%py}kg,P?$(VP p:w]ѡ[q" ,?(0?(ְ?(Fp?@c(stdxX܋ `? d`? P?$([P  ,?(0?(ְ?(`? d`? (P?$[PQ̡P! ! ,?(0?(ְ?(`? d`? 'Π- 8ы0):@0CAMр ѡ(P?$[P Q фP р}-!ш},?(0?(ְ?(`? d`? / q50фыh`? d`? / q5@фы4?>?`? csd(u$+\-` d#h.l*x0Āelh%ox0XeEfgGn9ld`?  ?d`? @ ? ? "  !?`d`? }>; -!10>@@ V 8@  /  +!10>"  /  !10> @ /00 0ѡ $@ZPECѡMѡ p? }? u?? ^d`? } pq 5#"0ѡP n b V J@ ? 6@ *?d`? ? ? d`? ? @     0 9: @ ? ?z ?WC050_D05@_D050d`? - ?p&@ 4??  a@ '? -?? pX Oo620>x 0 >>"X>  ??   @ / & ? g `h`? ? 0!#и>0?,@?0ȧN(>t>8?0 - >>D  5  + >> >>g ю 0ѡaP? P .aP6 QaP P?P? ׶`?p?8g> 06P?,QPU):RECAaFSRQaVrgaga?,- +aea E`>rvp??? #2#: @ / & ? g `h`? ? 0<#0?,@?0ȧN(>>8?0`? P?,/Q)-0!->! >B +>! >   >! >E00@qA0- '1qA@Aq@ `  .'qF<Ad &$ ? ?A@> QP&#1qA@Aq@?@p?`? #H ? @ & ?  ! ? g `h`? 0#>0?,@?0ȧN(>>8> ?,`?  FF=11=CCAM 0AMAP?,VA@? E@? p?}@>g?d``??  >  ? ??? @>p>>/5,?(0?(ְ?(zkg(P?$(VPp: w q&5,?(0?(ְ?(@>p>>@ekd,?$( >DA4>,?(0?(>$>ְ?( ֠?>/5,?(0?( ְ?(Jkd(P?$(VP@:0D A&5,?(0?( ְ?(>pTkg(?$( wq( ,?(0?( ,ְ?(     / ֠?>/5,?(0?( ְ?(Jkd*P?$(VP@<0D A&5,?(0?( |ְ?(> fp?p\kg,?$( >wq,>,?(0?( ְ?( ֠??/5,?(0?( ְ?(Jkd*P?$(VP@< D A&5,?(0?( hְ?(H{ p   ?$( @  @ , 2 ! . 00  +    p>ؐ>ذ>>>WhLPTX\`~dpЩ.   (d!0(!#"(    % %Xh!! . 4  * (ߎ ޠ l h  [ h  (ΰl cf[^T!0(!#"(  cs [(~(^ *>h^,"~(^ *;^,h    ~dǎ`Ǟ\ǮXǾTPLhhWP8<@DHL~P~P^^^ϞT^^x^:d2p5pW^Q^ΰ L +!R  ->^Q^\![RQ^ (^P v (0& ( 7W(!^Q^.^Q^e E|t^Q^d$! (+ - B!s` T). 2 l.242# .242""7^P l$^PLh(^z ^P~PǎLǞHǮDǾ@<8W`<@DHLP~T~ XcsR[\RP^\*)b!!0#.0(#"( ^\P!+"  DnX  c ~TǎPǞLǮHǾD@<``WH<@~Dp^qV  ,1 ]2 - qR Z -87#@]$*'B2 2# q q1 ]2~Dǎ@Ǟ<HHWH@~Dp רW & !   D 6ހ*p  @  ӌ/(  ! p!.p!7 R   .   W    ~Dǎ@HHWP@DH~Lr @D''!'6 )7 P) ~LǎHǞDǮ@PPW ! ^ 0(,01  !W2![HW`@DHLPT~XP^\0( #"( + "  -^\Q^\ p1@ΐ. ~Hΐ0 Aj0ސ ̈ *ސ ̈:zA@ސ ̈* ސ ̈:zpޠ(eΐ. TB 9Ȍ19#59'3( E e 0@ (@@0@ (@@ @+ @-1p(@GDD@>@B*  p(@GDD@0 p6h6h,=:yp6p?qq5yq6(6h K ?0@@A@ q5'@sA@  6! #;K;;#\ 2  ~XǎTǞPǮLǾHD@``WPHx~Lp(,j~LǎHPPWPHx~Lp(,"~LǎHPPW`?8<@DH~Lp.ޠ??:T 2p? p???p  :X ސ6 ?p  C@:8 6p  : @$:@$ 1 P@$`^P5%cR:W^XP'86 0":B0C9"5 4r+!+ @$0:  ?05N?:@ 5p  5 @$0:  ?( ?( ?:?( 0 &009 4 @$05p (  5(T? &1?  &0   9( ~LǎHǞDǮ@Ǿ<8`?`WP@D~Hr :  .LpL8"00:GA5pp!`' pq90A@3 95pL1"00P>5p(`pq91A 31906~HǎDǞ@PPW0 1 @4AW   ?  ?0 6    W6    WX<@DHLPҧ~TsRNW  ( ( D ˚ \ pױ.p'(R (> )     ,F   aP/\ +! (() )((N  ' p.p7! PBW  D ,,- t ~TǎPǞLǮHǾD@<XXWA0~: r:2rqrp?5p?:pprq3rp?:ppp:sp2~ǎW0@ A#1 ! 1W @(#)stty.c 6.1 87/11/23 rawekeolmineof%seraseintrquittimekillline-rawcookedsaneunknown mode: %s ffvtbstabnlcr ; eol; eof; ; ; ; speed input speed output speed oddp evenp -parity cs%c cstopb hupcl cread clocal line = %d; intrquiterasekillignbrk brkint -inpck ignpar parmrk -istrip inlcr igncr icrnl iuclc -ixon -ixany ixoff -opost olcuc onlcr ocrnl onocr onlret del-fill nul-fill -isig -icanon xcase -echo -echoe -echok echonl noflsh ffvtbstabnlcr eol; eof; ; ; ; speed input speed output speed line = %d; intrquiterasekill-parenb -parodd cs%c -cstopb -hupcl -cread -clocal -ignbrk -brkint -ignpar -parmrk -inpck -istrip -inlcr -igncr -icrnl -iuclc -ixon -ixany -ixoff -isig -icanon -xcase -echo -echoe -echok -echonl -noflsh -opost -olcuc -onlcr -ocrnl -onocr -onlret -ofill -ofdel ^- = %s %sDEL%s%c%s%s%d %s%s baud; %x:%x:%x:%x:%x:%x:%x:%x:%x:%x:%x:%x %x:%x:%x:%x:%x:%x:%x:%x:%x:%x:%x:%x########|#x#t###p###l###h###d###`###$$ $$$$ $,$4$< $D$L$T $\$d$l $t$|$$$$$$$$00$00$00$ 0$ 0$ 0$$$%#\00#X 0#T0#P0% @%@%#L%$%,%4%<%D%L#H00%T 0%\ 0%d 0%l%t%|%%%%%%%% % %@%@%%%%#D#@%&& &&&$&,&4&<&D&L&T#<&\&&d&&l&&t&|&&&&&&&&&&&&& & & & '@' @''#8'$','4+'<'D'L'T'\'d'l't'|'#4(#0''''' ' '@''@''@'@''#,#(#$# (( ((($(,##### @#@@# # "(4(<(D(L(T(\"(d(l(t(|tekrawbs1bs0vt1vt0ff1ff0nl1nl0cr3cr2cr1cr0nl-nlrawrawnl-nlrawhupcs5cs6cs7cs8600300200150134110o75i7575o50i5050o0i00i110o110i134o134i150o150i200o200i300o300i600o6001200i1200o12001800i1800o18002400i2400o24004800i4800o48009600i9600o960019200i19200o19200125000i125000o125000134.5i134.5o134.5-parity-evenp-oddpparityevenpoddpparenb-parenbparodd-paroddcstopb-cstopbhupcl-hupcl-hupclocal-clocalcread-cread-rawcookedsaneignbrk-ignbrkbrkint-brkintignpar-ignparparmrk-parmrkinpck-inpckistrip-istripinlcr-inlcrigncr-igncricrnl-icrnliuclc-iuclclcase-lcaseLCASE-LCASEixon-ixonixany-ixanyixoff-ixoff-rawcookedsaneisig-isigicanon-icanonxcase-xcaselcase-lcaseLCASE-LCASEecho-echoechoe-echoeechok-echoklfkc-lfkcechonl-echonlnoflsh-noflsh-rawcookedsaneopost-opostolcuc-olcuclcase-lcaseLCASE-LCASEonlcr-onlcrocrnl-ocrnlonocr-onocronlret-onlretfill-fillnul-filldel-fillofill-ofillofdel-ofdeltab0tabstab1tab2tab3-tabs-rawcookedtty33tn300ti700vt05tty37sanestty: usage: stty [-ag] [modes] @(#)atoi.c 6.1 87/11/23 @(#)ctype.c 6.1 87/11/23 ((((( H @(#)mon.c 6.1 87/11/23 PROFDIRmon.out @(#)perror.c 6.1 87/11/23 : Unknown error @(#)data.c 6.1 87/11/23 @h@h@pB`Rh.p @(#)flsbuf.c 6.1 87/11/23 @(#)stdiom.h 6.1 87/11/23 @(#)fprintf.c 6.1 87/11/23 @(#)printf.c 6.1 87/11/23 @(#)scanf.c 6.1 87/11/23 bp @(#)errlst.c 6.1 87/11/23 11 1,1H1X1p1|1111112 2 2,2D2P2\2p2222222333(383P3`3l33333444 4<4\4x4.Error 0Not ownerNo such file or directoryNo such processInterrupted system callI/O errorNo such device or addressArg list too longExec format errorBad file numberNo child processesNo more processesNot enough spacePermission deniedBad addressBlock device requiredDevice busyFile existsCross-device linkNo such deviceNot a directoryIs a directoryInvalid argumentFile table overflowToo many open filesNot a typewriterText file busyFile too largeNo space left on deviceIllegal seekRead-only file systemToo many linksBroken pipeArgument out of domainResult too largeNo message of desired typeIdentifier removedChannel number out of rangeLevel 2 not synchronizedLevel 3 haltedLevel 3 resetLink number out of rangeProtocol driver not attachedNo CSI structure availableLevel 2 haltedDeadlock condition if locked @(#)getenv.c 6.1 87/11/23 @(#)isatty.c 6.1 87/11/23 @(#)malloc.c 6.1 87/11/23 000000000000000000000123456789abcdef0123456789ABCDEF @(#)doscan.c 6.1 87/11/23 AAAABBBBBBBABBBBBABBA @(#)filbuf.c 6.1 87/11/23 @(#)dowrite.c 6.1 87/11/23 @(#)print.h 6.1 87/11/23 @(#)ungetc.c 6.1 87/11/23 @(#)atof.c 6.1 87/11/23 @(#)ecvt.c 6.1 87/11/23 Fn CAy7Aׄ@È@Y@$ @(#)ldexp.c 6.1 87/11/23 @(#)memset.c 6.1 87/11/23 @(#)fwrite.c 6.1 87/11/23 @(#)stdiom.h 6.1 87/11/23 @(#)frexp.c 6.1 87/11/23 @(#)memchr.c 6.1 87/11/23 u!m @(=` .text .data  @(@.bssMM=`;P 0  !2$0  ȓ"I[Wx@DHLPT~Xq ^ `P D ] `P($ ] `P0H'P80 ȓ[P85fa:`Tx x SP BPГSVx 4x PГS PSx  JQ Q(0Q0 Q85 `S@,Q(SHP( ]֋hS@pSP2  HNqpP(SP3  SP]nUXpQ8f,tSH Q(` Q0>-SHntSHS@v ! S@юU`QX Q0aP/RQQЧ^\>UQ~pސQ Q(0Q0 Q84p `U`Q`x xx  Fq FրQ(q Bq ! 7Bp *q*!Q( Uqx ސx   Fq EpUq   EqްSP Q82'` (T Epp(   E<q Eq 5pUA Dq DpP('!YxҀU:N   DjpQ8    (!   ~(! .   :6:   CqU qP()!YQ Q(0Q0 U0 `U`MQ^t^lUqްUPQ9^hPSP^d Q82 U2Q ^bnb&|^hnh^t'R (F(  ( n  BqdQ.e BXqq,!nb2xp[ ( ~( .P^s^s Q^sk ( ~(. P^r^r Q q (^r q ~( . q !ns&R   !   ~ .  nr!&U^l%* 'P(0(# D  :   @^sQ^rQlt^dR^d^hR^hU+^tQLx")!@: pP('!Ujhzԅp W`,r `րppWd@& RQ8^l12Q8Q( 6"*PppW%d@!Q8pph ^tQU`IRn\mx xPDH΀ ~Lq ސP8 > #(!  (! p0WP( S *<    >l *~x  N$ @ P, )  g`P  )0Q0  `O )x6 )|    = )\)J   =~)2P4PpRu55)   =B4Pp5(x x:(   <(x x Px x P(P8)!Q~LǎHǞDPPWP@DH ~LpU iPx $ xx֐Q( T:  ;q ;pQ(U P(U'!PPГEƋpP( Pp0֐P(ǧ &   PtXx@ x~LǎHǞDǮ@PPWH<@~DpހP8  : f  : :fpבp%  :.p%P(P8(!O\~Dǎ@Ǟ<HHWX?<@DHL~PְUhpzU: \Uq  BP( N ހ 9Bg gP T gLg gP W!M W W^Whz((*((  pxp\Uq  @րP(I   M$pUpڋW ( .W.Wހ!(!pppqWp'Q8!d@Q8Uq" ( " (&  7BQ8p'ҐU :    6P((!LU`Uq P(!Kԋ8րP(:(  K>W((*B(( 6 ((  ԋpP(W!KlU  P(W!J8րP( 36  JqJp p0  pP(W!Jj c^W 0( 9(0 ^W a( f( W^W A( F(7  ` !z.Wހ!(!"pppWpZQ8%Qd@    Q8  Q8p Q8xҐU :    3Q8    (!   ~(! .    (  2 (  3P((!H< P(!H qjU  P(!G4րP(  :  GP( pG6g`  &gȓ(` p pP T gГEhQ(gUg~PǎLǞHǮDǾ@<XXW@~<P(T gErH0p&Dq 4y'!04y;Ngg 0g  gвgg 0g ggg 0hg gg gg gggg< P9l~<@@WWH@~DրP(pR  D~Dǎ@HHW@P( D@@W 1A1    W@~<pP( DP( DP T gBN-~<@@WXHU`~L8zBx xgȆAJgȓThQ(hhP T gAP W!AP T gГA\p.W q phWx   %H hh S@ h(0h >4x  U`x6Vhh h :h!hh(h !ߓ&h!hh(WWWx xx xh<h`Q  `*+J` Q hPГ5fx xx xh<hP:܋ x xP! Q0 X(XQ0pF` `2` p2 `qQ(S@XqހPUXg`P.  0  $x  x   HQ :` `*'` Q  >x xQ((Q(PвU1zQ  Q80Z  LpQ8Q(QJQ(Q(z <  笋Q((Q(Q Q( Q80(  R QL0Q@pQ8 ! 1Q(PвU0t Xx{  "UXSH Q(P>Px   xx  hP3~.hQ(hQ(! QQ(hUh :SHPSHQ SH Q8< ~ !SHQ(x x3PГ)>` `)\` p)DhlP$X h`HPQ(! Q(UP82x Pвx(hH U0hP 0h Q( @0,S@XqUX &P T g1b/x @ xPx P ,  xx xx p t`  P V@P r0Up `.p hȓ.Гݰx Px&ؓxx P ` P Pgq Pxh  * xx! xx xPГ&WZx  U`%40$ 00# 0 2!W   (    WH@~Dp(,rq s~Dǎ@HHW`@DHLPT~XpހSPp!pP!^^^^zU^^p! z?*!SH  ~ ! :! !'p(  ! x!)z'p(  ! 6!%^8'p(  !  !)^^zޅpW!(q!%q- h9*F( !B!%^B'p*4qq "'/(;(200(20p8W# Dp!)qj!%b.p!)F!(4SH h@.^  g`x  xx   ׶2Px    xׄ!*p ,! !*p((玴   W ( ( ( SH  8z h@zi(!$^ R >  @z RD ( ~( . ((x  > SPΐP !SP~XǎTǞPǮLǾHD@``W! W@U`6Pxz { xx  xhXQ0`Q(H Q  P T gГ'P @@W80 ! 'D F88W@  B   hX ~LǎHǞDǮ@PPWH<~@pP T g:G8G   qP G!P T gГ$~@ǎ<HHWP<@D~HphPހh<P T ghP2^O_( OO^O (/(:(O:^O@( G(7O bOpOq .O  hPP O!P T gГl~HǎD Ǟ@Ǯ<PPWP@DH~LpH` `` p `qހPPP  $))ސi  0)0 ~ u pd0 0(D`h@iQ0 Q0"Up  q!zǩ ހz(0$ y rXpP, ). 8 L ps~LǎHǞDǮ@PPWX?@DHLP~Tp)ppޠU  .zii ްiޠUi (i i ސ)0d ؋'Z4 +))?  z RYP, +f <  T 7i  i i i ~TǎPǞLǮHǾD@XXW4PWp *[B@8~   q  Q ↰  &~TǎPǞLǮHǾD@<WH@~D4P6Xp: pp5  :" |   `:! P~Dǎ@HHWp  $Wpǀǐ Ǡǰ $WW!2! W!21!0W! W2!10B!0 W!120W8 ȧ~4p;.q@(~488W@8~<pp ~W  < r f4P   ~<ǎ8@@W8 ȧ~4p T g "Q%(   ~488WH<΀ ~@q R  Bb p?'(! ,>     BG G!    g   ,Q"%(  D b j D p     ~@ǎ<HHWH<@~DpǐLJ D   p?  p?' (. (|   ~Dǎ@Ǟ<HHW8 ȧ~4p  *        |'Q!R D D p?%  ' p?7! ,~488W@8~<p  ( ppPi8W?( pp@?^\*    p?& ppPi8W?ƆW @  ~<ǎ8@@WP pR? a!` !W@\.`.\;@@W@.` >`#@@WX@~D.x qώxTP.LH@HU(l~Dǎ@XXWP.p0>@DH".L @.M.p.@8.DPPWXDHL~Pp.;H(;D ;@7pT\   T~PǎLǞHǮDXXW[W![W. >$.;0 [W[B[ vW[W2!6[PW2![^觾[[. W2![WPT.>0 PPWP48<@DH~LN`HNh! N`N`! NhNhNtN`NpNtN|րNpqpN$NpN| N|x((lx! ( 2NtN`  !(hրN|xNtp0qp((q$Nt N|sqp'( (&    NtpN|p  PNt! N`!Nt xF pNp(PNpNxNp N|NpN|~LǎHǞDǮ@Ǿ<84PPWNp! !Nt! N|WP<@DH~Ly   s  Rq(+p#((p(pspNx~LǎHǞDǮ@Ǿ<PPWpNNNNNǼO @P PPO$PpRU?PO$%py}kg,PO$(VP p:w]ѡ[q" ,O(0O(ְO(FpO@c(stdxX܋ `O d`O PO$([P  ,O(0O(ְO(`O d`O (PO$[PQ̡P! ! ,O(0O(ְO(`O d`O 'Π- 8ы0):@0CAMр ѡ(PO$[P Q фP р}-!ш},O(0O(ְO(`O d`O / q@фыh`O d`O / qAфы4ONO`O csd(u$+\-` d#h.l*x0Āelh%ox0XeEfgGn9ld`O  Od`O @ O O "  !O`d`O }N; -!10N@@ V 8@  /  +!10N"  /  !10N @ /00 0ѡ $@ZPECѡMѡ pO }O uOO ^d`O } pq 5#"0ѡP n b V J@ O 6@ *Od`O O O d`O O @     0 9: @ O Oz OWC0@_D0A_D0@d`O - Op&@ 4OO  a@ 'O -OO pX Oo620Nx 0 NN"XN  OO   @ / & O g `h`O O 0!#иN0O,@O0ȧN(N\N8O0 - NND  5  + NN NNg ю 0ѡaPO P .aP6 QaP POPO ׶`OpO8gN 06PO,QPU):RECAaFSRQaVrgagaO,- +aea E`NrvpOOO #2#: @ / & O g `h`O O 0<#0O,@O0ȧN(NN8O0`O PO,/Q)-0!-N! NB +N! N   N! NE00@qA0- '1qA@Aq@ `  .'qF<Ad &$ O OA@> QP&#1qA@Aq@O@pO`O #H O @ & O  ! O g `h`O 0#N0O,@O0ȧN(NrN8N O,`O  FF=11=CCAM 0AMAPO,VA@O E@O pO}@NgOd``OO  >  O OOO @NpNN/@,O(0O(ְO(zkg(PO$(VPp: w q&@,O(0O(ְO(@NpNN@ekd,O$( NDA4N,O(0O(N$NְO( ֠ON/@,O(0O( ְO(Jkd(PO$(VP@:0D A&@,O(0O( ְO(NpTkg(O$( wq( ,O(0O( ,ְO(     / ֠ON/@,O(0O( ְO(Jkd*PO$(VP@<0D A&@,O(0O( |ְO(N fpOp\kg,O$( Nwq,N,O(0O( ְO( ֠OO/@,O(0O( ְO(Jkd*PO$(VP@< D A&@,O(0O( hְO(H{ p   O$( @  6@ , 2 ! . 00  +   Z  pNؐNذNNNWhLPTX\`~dpЩ.   4yd!04y!#"(    % %Xh!! . 4  * 4yߎ ޠ l h  [ h  4yΰl cf[^T!04y!#"(  cs [(~(^ *>h^,"~(^ *;^,h    ~dǎ`Ǟ\ǮXǾTPLhhWP8<@DHL~P~P^^^ϞT^^x^:d2pA8W^Q^ΰ L +!R  ->^Q^\![RQ^ 4y^P v 4y0& 4y 7W(!^Q^.^Q^e E|t^Q^d$! 4y+ - B!s` T). 2 l.242# .242""7^P l$^PLh(^z ^P~PǎLǞHǮDǾ@<8W`<@DHLP~T~ XcsR[\RP^\*)b!!0#.04y#"( ^\P!+"  DnX  c ~TǎPǞLǮHǾD@<``WH<@~Dp^qV  1 ]2 - qR Z -87#@]$*'B2 2# q q1 ]2~Dǎ@Ǟ<HHWH@~Dp 8W & !   D 6ހ;  @  @(  ! p!?!7 R   .   W    ~Dǎ@HHWP@DH~Lr @D''!' )7 8)ɬ ~LǎHǞDǮ@PPW ! ^ 0(,01  !W`@DHLPT~XP^\04y #"( + "  -^\Q^\ p1@ΐ. ~Hΐ0 Aj0ސ ̈ *ސ ̈:zA@ސ ̈* ސ ̈:zpޠ4yeΐ. TB 9Ȍ19#59'3( E e 0@ (@@0@ (@@ @+ @-1p4y@GDD@>@B*  p4y@GDD@0 pB0B0,=:yp6p?qq5yqBx(B0 K ?0@@A@ q5'@sA@  6! #;K;;#\ 2  ~XǎTǞPǮLǾHD@``WPHx~Lp(,j~LǎHPPWPHx~Lp(,"~LǎHPPW`?8<@DH~Lp.ޠOO:T 2pO pOOOp  :X ސB Op  C@:8 6p  : @$:@$ 1 P@$`^P5%cR:W^XP'86 0":B0C9"5 4r+!+ @$0:  ?05N?:@ 5p  5 @$0:  O( O( O:O( 0 &009 4 @$05p (  5(TO &1O  &0   9( ~LǎHǞDǮ@Ǿ<8`O`WP@D~Hr :  .LpL8"4P:GA5pp!`' pq90A@3 95pL1"4PP>5p(`pq91A 31906~HǎDǞ@PPW0 1 @4AW   ?  ?0 6    W6    WX<@DHLPҧ~TsRNW  ( ( D B \ pױ?'(R (> )(     ,   aP/\ +! (() )((N  ' p?7! BW  D ,,-  ~TǎPǞLǮHǾD@<XXWA0~: r:2rqrp?5p?:pprq3rp?:ppp:sp2~ǎW0@ A#1 ! 1W @(#)wi950.c 6.1 87/11/23 ( 6 6 < < < < z%s: can't open %s  X(%s) TERMgtty`},($0 8@ G4G0 *TYgf= f h @(#)wicom.c 6.1 87/11/23   P"%T%T%T%&&,&.''((<(()0*`**--.(..%s%d%lx%x%x%s%lx%x%s%s%x%lx%x < %sR%d2r23L233(3L223333333333334%s %d%3u (%s) >> %s_end****$)*D)))*X*l**hcKF_+ -pn sSurqdo.\/!> : copy the screen in a file named 'archwi' < : overwrite current window with last screen from '>' / (\) : search for string ASCII(binary) . : find next occurrence of string _ : search by nlist. name=/dev/kmem => nlist /unix c : chain the commands q : quit, end the processELOGR ELOGW TWRITEC TWRITED FLUSH TRAPEXIT ITEST REGN REGNB VERSION MOVE , NEG , ADD , SUB , MPY , DIV , REM , NOT , OR , XOR , AND , CBIT , SBIT , TBIT , CHK , NOP MOVEI , ADDI , SUBI , MPYI , NOTI , ANDI , CHKI , FIXT , FIXR , RNEG , RADD , RSUB , RMPY , RDIV , MAKERD , LCOMP , FLOAT , RCOMP , EADD , ESUB , EMPY , EDIV , DFIXT , DFIXR , DRNEG , DRADD , DRSUB , DRMPY , DRDIV , MAKEDR , DCOMP , DFLOAT , DRCOMP , TRAP SUS , LUS , RUM , LDREGS , TRANS , DIRT , MOVESR , MOVERS , MAINT , READ , WRITE , TEST > TEST < TEST = CALLR , TEST > TEST < TEST = RET , TEST <=TEST >=TEST !=KCALL TEST <=TEST >=TEST !=LSL , LSR , ASL , ASR , DLSL , DLSR , CSL , SEB , LSLI , LSRI , ASLI , ASRI , DLSLI , DLSRI , CSLI , SEH , BR > BR = CALL BR > BR < BR = LOOP , BR <=BR !=BR BR <=BR >=BR !=BR > BR = CALL BR > BR < BR = LOOP , BR <=BR !=BR BR <=BR >=BR != @(#)ctype.c 6.1 87/11/23 ((((( H @(#)errlst.c 6.1 87/11/23 6`6h6t666666777,7@7T7h7t7777777788$888H8X8p888888899,9H9X9h9999.Error 0Not ownerNo such file or directoryNo such processInterrupted system callI/O errorNo such device or addressArg list too longExec format errorBad file numberNo child processesNo more processesNot enough spacePermission deniedBad addressBlock device requiredDevice busyFile existsCross-device linkNo such deviceNot a directoryIs a directoryInvalid argumentFile table overflowToo many open filesNot a typewriterText file busyFile too largeNo space left on deviceIllegal seekRead-only file systemToo many linksBroken pipeArgument out of domainResult too largeNo message of desired typeIdentifier removedChannel number out of rangeLevel 2 not synchronizedLevel 3 haltedLevel 3 resetLink number out of rangeProtocol driver not attachedNo CSI structure availableLevel 2 haltedDeadlock condition if locked @(#)getenv.c 6.1 87/11/23 @(#)mon.c 6.1 87/11/23 PROFDIRmon.out @(#)nlist.c 6.1 87/11/23 @(#)perror.c 6.1 87/11/23 : Unknown error @(#)flsbuf.c 6.1 87/11/23 @(#)stdiom.h 6.1 87/11/23 @(#)scanf.c 6.1 87/11/23 @(#)sprintf.c 6.1 87/11/23 @(#)system.c 6.1 87/11/23 -csh/bin/shP @(#)isatty.c 6.1 87/11/23 @(#)malloc.c 6.1 87/11/23 @(#)data.c 6.1 87/11/23 iHiHiPk@{H? 000000000000000000000123456789abcdef0123456789ABCDEF @(#)doscan.c 6.1 87/11/23 zz z z z,z,z,z,z,z,z,zz,z,z,z,z,zz,z,z$ @(#)filbuf.c 6.1 87/11/23 @(#)dowrite.c 6.1 87/11/23 @(#)print.h 6.1 87/11/23 @(#)ungetc.c 6.1 87/11/23 @(#)atof.c 6.1 87/11/23 @(#)ecvt.c 6.1 87/11/23 Fn CAy7Aׄ@È@Y@$ @(#)ldexp.c 6.1 87/11/23 @(#)memset.c 6.1 87/11/23 @(#)fwrite.c 6.1 87/11/23 @(#)stdiom.h 6.1 87/11/23 @(#)frexp.c 6.1 87/11/23 @(#)memchr.c 6.1 87/11/23 u!o ".text .data@.bss/p/p" 0  !2$0 "[W@8~<qJHH HҋLL 7!@/$1! 팂J'!B@LJ!BqGA(C@ B(H@ !H ~<ǎ8@@Wp[BX?@DHLP~Tp/xr/tb 0 /x p$/t /p H /p/xp  | 0 0 p0(/tp q/p  ( ^ȓ  Ћ! 01'q2! 'q/  !' :Gq21304!:'q.؆,/ H/t/t /tP/pq9(9#0@@5601 0/p /p) ~TǎPǞLǮHǾD@XXWH@~Dp pp~  "P  !~Dǎ@HHW!21!0W! W!120W8 ȧ~4p8.qH(~488W@8~<pp ~W  < r    ~<ǎ8@@W8 ȧ~4p T g "Q%(   ~488WH<΀ ~@q R  Bb p8'(! ,>     BG G!(    g   ,Q"%(  D b j D p     ~@ǎ<HHWH<@~DpǐLJ D   p8  p8' (. (   ~Dǎ@Ǟ<HHW8 ȧ~4p  *        |'Q!R D D p8%  ' p87! ,~488W@8~<p  ( ppP00W8( pp@8^T*    p8& ppP00W8W @  ~<ǎ8@@WP pR8 a!` !WX?@DHLP~T`T 2PP&L.H$D H Upס8 H  րLq 7t|xHHLLH   HUp80L!HBL*!T D H  ~TǎPǞLǮHǾD@XXW[W![W[WC2!,[W[hW [<W2![WW@8~ PPWP48<@DH~L/H/! //! ///////ր/qpN$// /x((lx! ( 2//  !(hր/x/p0qp((q$/ /sqp'( (&    /p/p  P/! /!/ xF p/(P/// ///~LǎHǞDǮ@Ǿ<84PPW/! !/! /WP<@DH~Ly   s  Rq(+p#((p(psp/~LǎHǞDǮ@Ǿ<PPWA~"t0As3r21~W0+K "AC1!WAC$AhAC%hAC&hACWQWPX%AC1QCGxBBSD"vt ('"AC8('p'"$AC4$X$AhAC!FhAC" "Tp& ":pq/ " pq/ "p "p "p "p "pq: "pq: "tpF #Zp, !Dp  "pq: "pq: "pq !q P!q A!q M!| J7q!#T J7q!#,(N q  T T   -     (  ( (&  (  (0 (8J\Г R FPp"" H掰 ( (2   (B p# &| >~PǎLǞHǮDǾ@<  WH48<~@p| b  HdP ; 4DlD2 p    (l. 4# 0m 0n  (#  (m nns ( (" (p` (qp (<  (~@ǎ<Ǟ8Ǯ4HHW  Z 0 d : , 00#2 )  W0!^ B &D@ d01@*0@*0W8$ 88WP<@D~Hp, LLpǀ1'2בסzH@80(L LLp  ~HǎDǞ@Ǯ<PPW :"4 mn2"'W Q!Q Q 0<x # | p'JF" 4#  m  n 4#  m  n!0F 4# m n$ mn n 2$21  xW@8 8~<2!0!!T1TA!42A!4"1#x(2"#"l2A!42A!4"1#t't'"dt'"drt'"d\8 d# 2! 0!("d*~<ǎ8@@W@!:#:#"0$0 #0*0W8 00  0 B!41 -RA!*P%00(# %09(# $@ <^2 00  0 B!4188Wp "[B@8~ܶ``W8 ȧ~4pzzppW'z"z!ȋtz!z!&z!' zH':' ,' ' ȋ  (=~488WH@~DpWz.z z"  , p~Dǎ@HHWh<~@pnDW'' \%# <%! 0Qa1X0Rb1@8Td1(&' 3Xh1 f p   <DHDD' ! v! ! pD $ $ `^D>0Qa1t&! 0Rb1T&# 8Td14&' 3Xh1 ހ' x~@ǎ<hhW@ dȋ!02 $ @@W8 ȶ!02 $ 88W@~<pf O 0r~<@@WX?@DHLP~Tprb 0 \ p$  ( p    0 0p 8p q  ( ^ ! 01'q2! 'q/ . !' :Gq21304!:'q. ,/  H Pq9(9#0@@5601 0 )f~TǎPǞLǮHǾD@XXWH@~D  pP pp (~ L"P  H!~Dǎ@HHW!21!0W! W2!10B!0 W!120W8 ȧ~4p.q (~488W@8~<pp ~W  < r    x ~<ǎ8@@W8 ȧ~4p T g "Q%(   ~488WH<΀ ~@q R  Bb p '(! ,>     BG G!Ў    g   ,Q"%(  D b j D p     ~@ǎ<HHWH<@~DpǐLJ D   p   p ' (. (L   ~Dǎ@Ǟ<HHW8 ȧ~4p  *        |'Q!R D D p %  ' p 7! ,~488W@8~<p  ( ppP @W ( pp  ^D*    p & ppP @W W @  ~<ǎ8@@WP pR a!` !W@~<p.`W .`&0 2  &' 6  ~<@@W[W![zW2!>[ \W[W2![ PPWP48<@DH~L`Hh! ``! hht`pt|րpqpN$p| |x((lx! ( 2t`  !(hր|tp0qp((q$t |sqp'( (&<    tp|p  Pt! `!t xF pp(Ppxp |p|~LǎHǞDǮ@Ǿ<84PPWp! !t! |WP<@DH~Ly   s  Rq(+p#X((p(pspx~LǎHǞDǮ@Ǿ<PPW0+K "AC1!WAC$AhAC%hAC&hACWQWPX%AC1QCGxBBSD"vt ('"AC8('p'"$AC4$X$AhAC!FhAC" QP&#1qA@Aq@@p` #H  @ &   !  g `h` 0#0,@0ȧN(r8 ,`  FF=11=CCAM 0AMAP,VA@ E@ p}@gd``  >    @p/,(0(Vְ(zkg(P$(VPp: w q&,(0(ְ(@p@ekd,$( DA4,(0(ְ( ֠/,(0(Fְ(Jkd(P$(VP@:0D A&,(0(ְ(pTkg($( wq( ,(0(ְ(     / ֠/,(0(@ְ(Jkd*P$(VP@<0D A&,(0(ְ( fpp\kg,$( wq,,(0(tְ( ֠/,(0(,ְ(Jkd*P$(VP@< D A&,(0(ְ(H{ p   $( @  @ , 2 ! . 00  +     pؐذWP@DH~Lr @D''!' )7H)\ ~LǎHǞDǮ@PPW2!6[WPHx~Lp(,j~LǎHPPWPHx~Lp(,"~LǎHPPW`?8<@DH~Lp.ޠ:T 2p pp  :X ސ` Jp  C@:8 6p  : @$:@$ 1 P@$`^P5%cR:W^XP'86 0":B0C9"5 4r+!+ @$0:  ?05N?:@ 5p  5 @$0:  ( ( :( 0 &009 4 @$05p (  5(T &1  &0   9( ~LǎHǞDǮ@Ǿ<8``W   ?  ?0 6    W6    WX<@DHLPҧ~TsRNW  ( ( D ܊ \ pױ '(R (> )@     ,6   aP/\ +! (() )((  ' p 7! @BW  D ,,-V d ~TǎPǞLǮHǾD@<XXW0@ A#1 ! 1W @(#)date.c 6.1 87/11/23 xpppppppppppp HppHppp pXpp0pppp pppp`date: bad format character - %c date: no TOY clock date: bad conversion date: no permission /etc/wtmpJanFebMarAprMayJunJulAugSepOctNovDecSunMonTueWedThuFriSatold timenew time @(#)ctime.c 6.1 87/11/23 Day Mon 00 00:00:00 1900 SunMonTueWedThuFriSatJanFebMarAprMayJunJulAugSepOctNovDecTZpPDTPSTW`/Lw/K:/JMFw/ @(#)getenv.c 6.1 87/11/23 @(#)getut.c 6.1 87/11/23 /etc/utmp @(#)mon.c 6.1 87/11/23 PROFDIRmon.out @(#)perror.c 6.1 87/11/23 : Unknown error @(#)data.c 6.1 87/11/23  P P X"H2P @(#)flsbuf.c 6.1 87/11/23 @(#)stdiom.h 6.1 87/11/23 @(#)fprintf.c 6.1 87/11/23 BX @(#)errlst.c 6.1 87/11/23      ( @ L h |        ,@P`p 0<Th ,HX.Error 0Not ownerNo such file or directoryNo such processInterrupted system callI/O errorNo such device or addressArg list too longExec format errorBad file numberNo child processesNo more processesNot enough spacePermission deniedBad addressBlock device requiredDevice busyFile existsCross-device linkNo such deviceNot a directoryIs a directoryInvalid argumentFile table overflowToo many open filesNot a typewriterText file busyFile too largeNo space left on deviceIllegal seekRead-only file systemToo many linksBroken pipeArgument out of domainResult too largeNo message of desired typeIdentifier removedChannel number out of rangeLevel 2 not synchronizedLevel 3 haltedLevel 3 resetLink number out of rangeProtocol driver not attachedNo CSI structure availableLevel 2 haltedDeadlock condition if locked @(#)isatty.c 6.1 87/11/23 @(#)malloc.c 6.1 87/11/23 000000000000000000000123456789abcdef0123456789ABCDEF @(#)dowrite.c 6.1 87/11/23 @(#)print.h 6.1 87/11/23 @(#)ecvt.c 6.1 87/11/23 Fn CAy7Aׄ@È@Y@$ @(#)fwrite.c 6.1 87/11/23 @(#)stdiom.h 6.1 87/11/23 @(#)memchr.c 6.1 87/11/23 u!o 0".text0 .data@.bss/p/p"@ 0  !2$0 ؓ"[WH48<@~Dq4W-$n t xϷ6{  \q 0(! 0(! v(! 0\#(! pW   ~ r fv Zj\ L\ p00 qW00(07( !ѓ qq q   ώ  $~Dǎ@Ǟ<Ǯ8Ǿ4HHWp[BX?@DHLP~Tp/xr/tb 0 /x p$/t /p /p/xp  4 0 0 p0(/tp q/p  ( ^  ! 01'q2! 'q/ !' :Gq21304!:'q.,/ H/t/t /tP/pq9(9#0@@5601 0/p /p)~TǎPǞLǮHǾD@XXWH@~DH(pЈ ppp~ "P  !~Dǎ@HHW!21!0W! W!120W8 ȧ~4p@.q"P(~488W@8~<pp ~W  < r H  @ ~<ǎ8@@W8 ȧ~4p T g "Q%(   ~488WH<΀ ~@q R  Bb p!@'(! ,>     BG G!    g   ,Q"%(  D b j D p     ~@ǎ<HHWH<@~DpǐLJ D   p!@  p!@' (. (\   ~Dǎ@Ǟ<HHW8 ȧ~4p  *        |'Q!R D D p!@%  ' p!@7! ,~488W@8~<p  ( ppP00W!@( pp"H!@^ *    p!@& ppP00W!@vW @  ~<ǎ8@@WP pR!@ a!` !W8 PP !PNT T88W[W![W[WC2!,[W[h@W @[<@@W2![WHW@8~@ PPWP48<@DH~L/H/! //! ///////ր/qpN$// /x((lx! ( 2//  !(hր/x/p0qp((q$/ /sqp'( (&    /p/p  P/! /!/ xF p/(P/// ///~LǎHǞDǮ@Ǿ<84PPW/! !/! /WP<@DH~Ly   s  Rq(+p#X((p(psp/~LǎHǞDǮ@Ǿ<PPW0+K "AC1!WAC$AhAC%hAC&hACWQWPX%AC1QCGxBBSD"vt ('"AC8('p'"$AC4$X$AhAC!FhAC"     BG G!    g   ,Q"%(  D b j D p     ~@ǎ<HHWH<@~DpǐLJ D   p)x  p)x' (. (4   ~Dǎ@Ǟ<HHW8 ȧ~4p  *        |'Q!R D D p)x%  ' p)x7! ,~488W@8~<p  ( ppP1W)x( pp*)x^*    p)x& ppP1W)x~W @  ~<ǎ8@@WP pR)x a!` !W`DHLPTX~\q  *"(  D   p)x   Ǘ  8>І ρ  ' p)x7! 0 @  0 *> ^ (t~\ǎXǞTǮPǾLHD``WX?@DHLP~T`% 2%P&%.%$D % %pס)x %  ր%q 7|x%%%%%   %%p)x0%!%B%*!% D %  ~TǎPǞLǮHǾD@XXW[W![W!;0p[W[W[rWC2!,[W[@+PW +P[+P+PW!00[WH .(N0n8@HPX` W`X .(N0n8Ɏ@ɮHPԩة>^觾[2![@WPT.> PPWP48<@DH~L/H/! //! ///////ր/qpN$// /x((lx! ( 2//  !(hր//p0qp((q$/ /sqp'( (&    /p/p  P/! /!/ xF p/(P/// ///~LǎHǞDǮ@Ǿ<84PPW/! !/! /WP<@DH~Ly   s  Rq(+p#((p(psp/~LǎHǞDǮ@Ǿ<PPWA~"t0As3r21~W0+K "AC1!WAC$AhAC%hAC&hACWQWPX%AC1QCGxBBSD"vt ('"AC8('p'"$AC4$X$AhAC!FhAC"D  B !:p WV(T ]U\^  ~Dǎ@Ǟ<HHWH<@~Dr   d\R B  :p W(  pX ~Dǎ@Ǟ<HHW@80~<q ֋l H ,< Dl (X @l <, $ 88 4  0~<ǎ8@@WH<@~Dnp x   (2 h p hT~Dǎ@Ǟ<HHWPDH 0~L ( P X (Bրp8xqp `r h' h @ ~LǎHǞDPPW8 p88W@~<p &,  t !d|~<@@W0  F1   J$A"0$* 0!-WX<@DHLP~Tq ؓ, P!!  P  `pǑְ PB(:   P P\ P P"2* P Pp   $  !p W p    < p    :^ p v   . p F     8 P P)P P p    P P P P  P   P* P!0 p ^ p H*!    2 P P   ~TǎPǞLǮHǾD@<XXW@ ~<  X P   ` X  P   p    !  \ ~<@@W0~@i!$"$ d @i!$"( !@+B $ @-$ 1@i!$"$ D 0!*@0A$piAGDD@0 ~Wp 2:[BP48<@DH~LpHx! pp! xxpրqpN$ x((lx! ( 2p  !(hրXp0qp((q$ sqp'( (&    pp  P! p! xF p(P ~LǎHǞDǮ@Ǿ<84PPW! !! WP<@DH~Ly   s  Rq(+p#X((p(psp~LǎHǞDǮ@Ǿ<PPW0+K "AC1!WAC$AhAC%hAC&hACWQWPX%AC1QCGxBBSD"vt ('"AC8('p'"$AC4$X$AhAC!FhAC"     BG G!x    g   ,Q"%(  D b j D p     ~@ǎ<HHWH<@~DpǐLJ D   p   p ' (. (   ~Dǎ@Ǟ<HHW8 ȧ~4p  *        |'Q!R D D p %  ' p 7! ,~488W@8~<p  ( ppP!W ( pp( ^ħ*    p & ppP!W W @  ~<ǎ8@@WP pR a!` !W[W![W[WC2!,[W[h@W @[<@@W2![WHW@8~ PPW2!6[W @(#)expr.c 6.1 87/11/23 l ` ` ` 4 ` ` ` ` ` `( ` 8 ( 0 @ H01-\{0,1\}[0-9]*$-\{0,1\}[0-9]*$   -\{0,1\}[0-9]*$-\{0,1\}[0-9]*$non-numeric argument0000000Too many '\('sParen problemRE error expr: -2147483648@@@@@@pppppsyntax errorsyntax error0 syntax error                @!=>=><=<===:%/*-+&|match @(#)atol.c 6.1 87/11/23 @(#)ctype.c 6.1 87/11/23 ((((( H @(#)malloc.c 6.1 87/11/23 @(#)mon.c 6.1 87/11/23 PROFDIRmon.out @(#)perror.c 6.1 87/11/23 : Unknown error @(#)flsbuf.c 6.1 87/11/23 @(#)stdiom.h 6.1 87/11/23 C( @(#)errlst.c 6.1 87/11/23 08D`p$8D\ht(@Phx(8Tt.Error 0Not ownerNo such file or directoryNo such processInterrupted system callI/O errorNo such device or addressArg list too longExec format errorBad file numberNo child processesNo more processesNot enough spacePermission deniedBad addressBlock device requiredDevice busyFile existsCross-device linkNo such deviceNot a directoryIs a directoryInvalid argumentFile table overflowToo many open filesNot a typewriterText file busyFile too largeNo space left on deviceIllegal seekRead-only file systemToo many linksBroken pipeArgument out of domainResult too largeNo message of desired typeIdentifier removedChannel number out of rangeLevel 2 not synchronizedLevel 3 haltedLevel 3 resetLink number out of rangeProtocol driver not attachedNo CSI structure availableLevel 2 haltedDeadlock condition if locked @(#)getenv.c 6.1 87/11/23 @(#)isatty.c 6.1 87/11/23 @(#)data.c 6.1 87/11/23 ! ! !(#3  u!oA /$XX.text/ .dataXX0X@.bss--$X 0  !2$0 X"[W`DHLPTX~\ BQ!-! - 0Fp p }q   hpp080" !0 0(' )~\ǎXǞTǮPǾLH D``W8( 88WWW0~@q!$"$ d @q!$"( !@+B $ @-$ 1@q!$"$ D 0!*@0A$pqAGDD@0 ~Wp[BX?@DHLP~Tp-r-b 0 - p$- - 0 --p  L 0 0 p0(-p q-  ( ^  ! 01'q2! 'q/ !' :Gq21304!:'q.,/ H-- -P-q9(9#0@@5601 0- -)~TǎPǞLǮHǾD@XXWH@~D`p؈ pp~ "P  !~Dǎ@HHW!21!0W! W!120W8 ȧ~4p.q(~488W@8~<pp ~W  < r   X ~<ǎ8@@W8 ȧ~4p T g "Q%(   ~488WH<΀ ~@q R  Bb p'(! ,>     BG G!    g   ,Q"%(  D b j D p     ~@ǎ<HHWH<@~DpǐLJ D   p  p' (. (   ~Dǎ@Ǟ<HHW8 ȧ~4p  *        |'Q!R D D p%  ' p7! ,~488W@8~<p  ( ppP00W( pp^$*    p& ppP00WW @  ~<ǎ8@@WP pR a!` !W@~<p.`W .`&0 2  &'   ~<@@W[W![W[W!%[WC2!,[W[W [\W2![0W@8~ PPWP48<@DH~L.`H.h! .`.`! .h.h.t.`.p.t.|ր.pqpN$.p.| .|x((lx! ( 2.t.`  !(hր.|.tp0qp((q$.t .|sqp'( (&     .tp.|p  P.t! .`!.t xF p.p(P.p.x.p .|.p.|~LǎHǞDǮ@Ǿ<84PPW.p! !.t! .|WP<@DH~Ly   s  Rq(+p#X((p(psp.x~LǎHǞDǮ@Ǿ<PPW0+K "AC1!WAC$AhAC%hAC&hACWQWPX%AC1QCGxBBSD"vt ('"AC8('p'"$AC4$X$AhAC!FhAC" QP&#1qA@Aq@/@p/`/ #H / @ & /  ! / g `h`/ 0#.0/,@/0ȧN(.r.8. /,`/  FF=11=CCAM 0AMAP/,VA@/ E@/ p/}@.g/d``//  >  / /// @.p../X,/(0/(Vְ/(zkg(P/$(VPp: w q&X,/(0/(ְ/(@.p..@ekd,/$( .DA4.,/(0/(..ְ/( ֠/./l,/(0/(Fְ/(Jkd(P/$(VP@:0D A&l,/(0/(ְ/(.pTkg(/$( wq( ,/(0/(ְ/(     / ֠/./l,/(0/(@ְ/(Jkd*P/$(VP@<0D A&l,/(0/(ְ/(. fp/p\kg,/$( .wq,.,/(0/(tְ/( ֠///X,/(0/(,ְ/(Jkd*P/$(VP@< D A&X,/(0/(ְ/(H{ p   /$( @  @ , 2 ! . 00  +   :  p.ؐ.ذ...WP@DH~Lr @D''!'> )7H)\ ~LǎHǞDǮ@PPW2!6[ؐWPHx~Lp(,j~LǎHPPWPHx~Lp(,"~LǎHPPW`?8<@DH~Lp.ޠ//:T 2p/ p///p  :X ސ /Jp  C@:8 6p  : @$:@$ 1 P@$`^P5%cR:W^XP'86 0":B0C9"5 4r+!+ @$0:  ?05N?:@ 5p  5 @$0:  /( /( /:/( 0 &009 4 @$05p (  5(T/ &1/  &0   9( ~LǎHǞDǮ@Ǿ<8`/`W   ?  ?0 6    W6    WX<@DHLPҧ~TsRNW  ( ( D ܪ \ pױ'(R (> )ߠ     ,V   aP/\ +! (() )((  ' p7! `BW  D ,,-V ڄ ~TǎPǞLǮHǾD@<XXW0@ A#1 ! 1W @(#)kill.c 6.1 87/11/23 not a killable process grouppermission deniedinvalid signalno such processkill: %d: %s usage: kill [ -signo ] pid ... @(#)abs.c 6.1 87/11/23 @(#)atoi.c 6.1 87/11/23 @(#)ctype.c 6.1 87/11/23 ((((( H @(#)mon.c 6.1 87/11/23 PROFDIRmon.out @(#)perror.c 6.1 87/11/23 : Unknown error @(#)data.c 6.1 87/11/23 0@0@0H28B@ @(#)flsbuf.c 6.1 87/11/23 @(#)stdiom.h 6.1 87/11/23 @(#)fprintf.c 6.1 87/11/23 RH @(#)errlst.c 6.1 87/11/23 hp| 4H\p|,@P`x4P`p.Error 0Not ownerNo such file or directoryNo such processInterrupted system callI/O errorNo such device or addressArg list too longExec format errorBad file numberNo child processesNo more processesNot enough spacePermission deniedBad addressBlock device requiredDevice busyFile existsCross-device linkNo such deviceNot a directoryIs a directoryInvalid argumentFile table overflowToo many open filesNot a typewriterText file busyFile too largeNo space left on deviceIllegal seekRead-only file systemToo many linksBroken pipeArgument out of domainResult too largeNo message of desired typeIdentifier removedChannel number out of rangeLevel 2 not synchronizedLevel 3 haltedLevel 3 resetLink number out of rangeProtocol driver not attachedNo CSI structure availableLevel 2 haltedDeadlock condition if locked @(#)getenv.c 6.1 87/11/23 @(#)isatty.c 6.1 87/11/23 @(#)malloc.c 6.1 87/11/23 000000000000000000000123456789abcdef0123456789ABCDEF @(#)dowrite.c 6.1 87/11/23 @(#)print.h 6.1 87/11/23 @(#)ecvt.c 6.1 87/11/23 Fn CAy7Aׄ@È@Y@$ @(#)fwrite.c 6.1 87/11/23 @(#)stdiom.h 6.1 87/11/23 @(#)memchr.c 6.1 87/11/23 u!oF ".text .data@.bss/p/p" 0  !2$0 "[WH<@~D~H0 H&yH  ~Hqx ΀  H' H ! 0  h`~Dǎ@Ǟ<HHW@?! 0 Ћ?@@Wp[BX?@DHLP~Tp/xr/tb 0 T/x $p$/t /p /p/xp ̋ 0(0(p00/tp q/p  ( ^ j ! 01'q2! 'q/V !' :Gq21304!:'q.,/ H/t/t /tP/pq9(9#0@@5601 0/p /p)^~TǎPǞLǮHǾD@XXWH@~Dpp8 pp~ l4"\P  @0!0~Dǎ@HHW!21!0W! W!120W8 ȧ~4p.q (~488W@8~<pp ~W  < r f   ~<ǎ8@@W8 ȧ~4p T g "Q%(   ~488WH<΀ ~@q R  Bb p'(! ,>     BG G!    g   ,Q"%(  D b j D p     ~@ǎ<HHWH<@~DpǐLJ D   p  p' (. (    ~Dǎ@Ǟ<HHW8 ȧ~4p  *        |'Q!R D D p%  ' p7! ,~488W@8~<p  ( ppP08W( pp ^*    p& ppP08W&W @  ~<ǎ8@@WP pR a!` !W[W![W[WC2!,[W2![W[hW [<W2![WW@8~@ PPWP48<@DH~L/H/! //! ///////ր/qpN$// /x((lx! ( 2//  !(hր/x/p0qp((q$/ /sqp'( (&    /p/p  P/! /!/ xF p/(P/// ///~LǎHǞDǮ@Ǿ<84PPW/! !/! /WP<@DH~Ly   s  Rq(+p#X((p(psp/~LǎHǞDǮ@Ǿ<PPW0+K "AC1!WAC$AhAC%hAC&hACWQWPX%AC1QCGxBBSD"vt ('"AC8('p'"$AC4$X$AhAC!FhAC"Tr00,hTT?H <n y&  X0 2  qVp!n(>n( y!$86 ~LǎHǞDǮ@Ǿ<PPW@ PR@@W80  f`88Wp2[BP<@D~HPqQp `*p-p  p  L p!'":0H F bLMLJh  XH  4L"& P`pQP QP?b :  Pap!'",p 0P  ~bNOLJJ  :*  ГN"Q?Pz p 0PQPL P`pQPQP 0P~HǎDǞ@Ǯ<PPWX?@DHLP~Tp-؎r-Ԇb 0 t- p$- - --ؓp   0X0Xp0`-p q-Ј  ( ^H  P! 01'q2! 'q/ F !' :Gq21304!:'q.X,/ X-ԧ-ԧ -P-q9(9#0@@5601 0- -) ~~TǎPǞLǮHǾD@XXWH@~D`p pp  "    x! h~Dǎ@HHW !  W!2! W!21!0W! W!120Wh@~Dp >x $|     qHpH.z .@.@JD.@X܍ Ndzz<\  (pZz.@<H   C q+D~Dǎ@W8 ȧ~4p.q(~488W@8~<pp ~W  < r   x ~<ǎ8@@W8 ȧ~4p T g "Q%(   ~488WH<΀ ~@q R  Bb p'(! ,>     BG G!    g   ,Q"%(  D b j D p     ~@ǎ<HHWH<@~DpǐLJ D   p  p' (. (   ~Dǎ@Ǟ<HHW8 ȧ~4p  *        |'Q!R D D p%  ' p7! ,~488W@8~<p  ( ppP0hW( pp^D*    p& ppP0hWW @  ~<ǎ8@@WP pR a!` !W@~<p.`W .`&0 2  &' ^  ~<@@W@\.`P.\(0 2  .    @@W![RW[@W!["W![ W[W2![W2![WC2!,[W2![W[xW x[TxxW![*W2![WW@8~ PPWP48<@DH~L.`H.h! .`.`! .h.h.t.`.p.t.|ր.pqpN$.p.| .|x((lx! ( 2.t.`  !(hր.|`.tp0qp((q$.t .|sqp'( (&    .tp.|p  P.t! .`!.t xF p.p(P.p.x.p .|.p.|~LǎHǞDǮ@Ǿ<84PPW.p! !.t! .|WP<@DH~Ly   s  Rq(+p#X((p(psp.x~LǎHǞDǮ@Ǿ<PPW0+K "AC1!WAC$AhAC%hAC&hACWQWPX%AC1QCGxBBSD"vt ('"AC8('p'"$AC4$X$AhAC!FhAC" QP&#1qA@Aq@/@p/`/ #H / @ & /  ! / g `h`/ 0#.0/,@/0ȧN(.r.8. /,`/  FF=11=CCAM 0AMAP/,VA@/ E@/ p/}@.g/d``//  >  / /// @.p../"X,/(0/(Vְ/(zkg(P/$(VPp: w q&"X,/(0/(ְ/(@.p..@ekd,/$( .DA4.,/(0/(..ְ/( ֠/./"l,/(0/(Fְ/(Jkd(P/$(VP@:0D A&"l,/(0/(ְ/(.pTkg(/$( wq( ,/(0/(ְ/(     / ֠/./"l,/(0/(@ְ/(Jkd*P/$(VP@<0D A&"l,/(0/(ְ/(. fp/p\kg,/$( .wq,.,/(0/(tְ/( ֠///"X,/(0/(,ְ/(Jkd*P/$(VP@< D A&"X,/(0/(ְ/(H{ p   /$( @  @ , 2 ! . 00  +    p.ؐ.ذ...WP@DH~Lr @D''!' )7H)4 ~LǎHǞDǮ@PPW2!6[0WPHx~Lp(,j~LǎHPPWPHx~Lp(,"~LǎHPPW`?8<@DH~Lp.ޠ//:T 2p/ p///p  :X ސ# /Jp  C@:8 6p  : @$:@$ 1 P@$`^P5%cR:W^XP'86 0":B0C9"5 4r+!+ @$0:  ?05N?:@ 5p  5 @$0:  /( /( /:/( 0 &009 4 @$05p (  5(T/ &1/  &0   9( ~LǎHǞDǮ@Ǿ<8`/`W   ?  ?0 6    W6    WX<@DHLPҧ~TsRNW  ( ( D b \ pױ'(R (> )`     ,   aP/\ +! (() )((  ' p7! BW  D ,,-V < ~TǎPǞLǮHǾD@<XXW0@ A#1 ! 1W @(#)mesg.c 6.1 87/11/23 yncannot statis y is n usage: mesg [-y] [-n]usage: mesg [-y] [-n]mesg: %s cannot change mode @(#)getopt.c 6.1 87/11/23 --: illegal option -- : illegal option -- : option requires an argument -- : option requires an argument --  @(#)mon.c 6.1 87/11/23 PROFDIRmon.out @(#)perror.c 6.1 87/11/23 : Unknown error @(#)ttyname.c 6.1 87/11/23 /dev/ @(#)data.c 6.1 87/11/23 0x0x02pBx @(#)flsbuf.c 6.1 87/11/23 @(#)stdiom.h 6.1 87/11/23 @(#)fprintf.c 6.1 87/11/23 @(#)printf.c 6.1 87/11/23 R @(#)errlst.c 6.1 87/11/23 hp| 4H\p|   , @ P ` x      !!!4!P!`!p!!!!.Error 0Not ownerNo such file or directoryNo such processInterrupted system callI/O errorNo such device or addressArg list too longExec format errorBad file numberNo child processesNo more processesNot enough spacePermission deniedBad addressBlock device requiredDevice busyFile existsCross-device linkNo such deviceNot a directoryIs a directoryInvalid argumentFile table overflowToo many open filesNot a typewriterText file busyFile too largeNo space left on deviceIllegal seekRead-only file systemToo many linksBroken pipeArgument out of domainResult too largeNo message of desired typeIdentifier removedChannel number out of rangeLevel 2 not synchronizedLevel 3 haltedLevel 3 resetLink number out of rangeProtocol driver not attachedNo CSI structure availableLevel 2 haltedDeadlock condition if locked @(#)getenv.c 6.1 87/11/23 @(#)isatty.c 6.1 87/11/23 @(#)malloc.c 6.1 87/11/23 000000000000000000000123456789abcdef0123456789ABCDEF @(#)dowrite.c 6.1 87/11/23 @(#)print.h 6.1 87/11/23 @(#)ecvt.c 6.1 87/11/23 Fn CAy7Aׄ@È@Y@$ @(#)fwrite.c 6.1 87/11/23 @(#)stdiom.h 6.1 87/11/23 @(#)memchr.c 6.1 87/11/23 u!oW 3$@.text3 .data@@4@@.bss--$!( 0  !2$0 @" [WPDH~LzxP-fuqq6 h*qpFp!(8~LǎHǞDPPWW0~@!$"$ d @!$"( !@+B $ @-$ 1@!$"$ D 0!*@0A$pAGDD@0 ~Wp[B8ȧTT.X88W0<@DH~Lq ހ /.P P pW dPP!9TX"@Br!4CA@P Hq%( 6P)  ~LǎHǞDǮ@Ǿ<W0~s@1tC@ p:G @ /$A B!  1~W@8~     BG G!    g   ,Q"%(  D b j D p     ~@ǎ<HHWH<@~DpǐLJ D   p  p' (. (t   ~Dǎ@Ǟ<HHW8 ȧ~4p  *        |'Q!R D D p%  ' p7! ,~488W@8~<p  ( ppP00W( pp ^T*    p& ppP00WW @  ~<ǎ8@@WP pR a!` !W@~<p.`W .`&0 2  &'   ~<@@W[W![W!;0@[W[W"[W[WC2!,[W[P!(W !([$!(!(W!00[WH .(N0n8@HPX` W`X .(N0n8Ɏ@ɮHPԩة>^觾[2![PWPT.> PPWP48<@DH~L.`H.h! .`.`! .h.h.t.`.p.t.|ր.pqpN$.p.| .|x((lx! ( 2.t.`  !(hր.|.tp0qp((q$.t .|sqp'( (&    .tp.|p  P.t! .`!.t xF p.p(P.p.x.p .|.p.|~LǎHǞDǮ@Ǿ<84PPW.p! !.t! .|WP<@DH~Ly   s  Rq(+p#X((p(psp.x~LǎHǞDǮ@Ǿ<PPW0+K "AC1!WAC$AhAC%hAC&hACWQWPX%AC1QCGxBBSD"vt ('"AC8('p'"$AC4$X$AhAC!FhAC" QP&#1qA@Aq@/@p/`/ #H / @ & /  ! / g `h`/ 0#.0/,@/0ȧN(.r.8. /,`/  FF=11=CCAM 0AMAP/,VA@/ E@/ p/}@.g/d``//  >  / /// @.p../!p,/(0/(Vְ/(zkg(P/$(VPp: w q&!p,/(0/(ְ/(@.p..@ekd,/$( .DA4.,/(0/(..ְ/( ֠/./!,/(0/(Fְ/(Jkd(P/$(VP@:0D A&!,/(0/(ְ/(.pTkg(/$( wq( ,/(0/(ְ/(     / ֠/./!,/(0/(@ְ/(Jkd*P/$(VP@<0D A&!,/(0/(ְ/(. fp/p\kg,/$( .wq,.,/(0/(tְ/( ֠///!p,/(0/(,ְ/(Jkd*P/$(VP@< D A&!p,/(0/(ְ/(H{ p   /$( @  @ , 2 ! . 00  +    p.ؐ.ذ...WP@DH~Lr @D''!' )7H) ~LǎHǞDǮ@PPW2!6[WPHx~Lp(,j~LǎHPPWPHx~Lp(,"~LǎHPPW`?8<@DH~Lp.ޠ//:T 2p/ p///p  :X ސ" /Jp  C@:8 6p  : @$:@$ 1 P@$`^P5%cR:W^XP'86 0":B0C9"5 4r+!+ @$0:  ?05N?:@ 5p  5 @$0:  /( /( /:/( 0 &009 4 @$05p (  5(T/ &1/  &0   9( ~LǎHǞDǮ@Ǿ<8`/`W   ?  ?0 6    W6    WX<@DHLPҧ~TsRNW  ( ( D " \ pױ'(R (> )     ,   aP/\ +! (() )((  ' p7! BW  D ,,-V  ~TǎPǞLǮHǾD@<XXW0@ A#1 ! 1W @(#)nice.c 6.1 87/11/23 nice: argument must be numeric. nice: usage: nice [-num] command %s: %s @(#)atoi.c 6.1 87/11/23 @(#)ctype.c 6.1 87/11/23 ((((( H @(#)errlst.c 6.1 87/11/23 (@Lh| ,@P`p 0<Th ,HX.Error 0Not ownerNo such file or directoryNo such processInterrupted system callI/O errorNo such device or addressArg list too longExec format errorBad file numberNo child processesNo more processesNot enough spacePermission deniedBad addressBlock device requiredDevice busyFile existsCross-device linkNo such deviceNot a directoryIs a directoryInvalid argumentFile table overflowToo many open filesNot a typewriterText file busyFile too largeNo space left on deviceIllegal seekRead-only file systemToo many linksBroken pipeArgument out of domainResult too largeNo message of desired typeIdentifier removedChannel number out of rangeLevel 2 not synchronizedLevel 3 haltedLevel 3 resetLink number out of rangeProtocol driver not attachedNo CSI structure availableLevel 2 haltedDeadlock condition if locked @(#)execvp.c 6.1 87/11/23 ||tshPATH:/bin:/usr/bin/bin/sh @(#)getenv.c 6.1 87/11/23 @(#)mon.c 6.1 87/11/23 PROFDIRmon.out @(#)perror.c 6.1 87/11/23 : Unknown error @(#)sleep.c 6.1 87/11/23 @(#)data.c 6.1 87/11/23 0@0@0H28B@ @(#)flsbuf.c 6.1 87/11/23 @(#)stdiom.h 6.1 87/11/23 @(#)fprintf.c 6.1 87/11/23 RH @(#)isatty.c 6.1 87/11/23 @(#)malloc.c 6.1 87/11/23 000000000000000000000123456789abcdef0123456789ABCDEF @(#)dowrite.c 6.1 87/11/23 @(#)print.h 6.1 87/11/23 @(#)ecvt.c 6.1 87/11/23 Fn CAy7Aׄ@È@Y@$ @(#)fwrite.c 6.1 87/11/23 @(#)stdiom.h 6.1 87/11/23 @(#)memchr.c 6.1 87/11/23 u!o` 6 $.text6 .data6@.bss--$# 0  !2$0 ȓ"[WPH~Lqp^Tt  (F>P~ F\$   Dր  '7pH(80~LǎHPPW Wp2[B8ȧTT.X88W0<@DH~Lq ހ /؋.P P pW dܧPP!9TX"@B r!4CA@PHq%( 6ދP)   ~LǎHǞDǮ@Ǿ<W0~s@1tC@ p:G @ /$A B!  1~W@8~ PPWX?@DHLP~Tp-Ўr-̆b 0 - p$- - --Гp   0 0 p0(-p q-Ȉ  ( ^`" h! 01'q2! 'q/ v !' :Gq21304!:'q.p,/ p-̧-̧ -P-q9(9#0@@5601 0- -) ~TǎPǞLǮHǾD@XXWH@~D p ppH  t" d   H! 8~Dǎ@HHWP<@DH~Lp   0(( x .8 b p ʄ p j ~LǎHǞDǮ@Ǿ<PPW8.8x88W!1021!0W !  W!21!0W! W!120W8 ȧ~4p.q#(~488W@8~<pp ~W  < r     ~<ǎ8@@W8 ȧ~4p T g "Q%(   ~488WH<΀ ~@q R  Bb p!'(! ,>     BG G!@    g   ,Q"%(  D b j D p     ~@ǎ<HHWH<@~DpǐLJ D   p!  p!' (. (   ~Dǎ@Ǟ<HHW8 ȧ~4p  *        |'Q!R D D p!%  ' p!7! ,~488W@8~<p  ( ppP00W!( pp"!^d*    p!& ppP00W!W @  ~<ǎ8@@WP pR! a!` !WH@~Dq l~Dǎ@HHWH<@~Dr '$~Dǎ@Ǟ<HHWH<0@~Dr 0 (+R a(a( <r NwX   @   "    t  )r!  )a!"X  p!~Dǎ@Ǟ<HHW@~<p.`W .`&0 2  &'   ~<@@W[`W![BW!)[.W!;0[ W[W2!6[W2![W2![W[WC2!,[W[x#W #[L##W!00["WH .(N0n8@HPX` W`X .(N0n8Ɏ@ɮHPԩة>^觾[2![xWP48<@DH~L.`H.h! .`.`! .h.h.t.`.p.t.|ր.pqpN$.p.| .|x((lx! ( 2.t.`  !(hր.|.tp0qp((q$.t .|sqp'( (&T   6 .tp.|p  P.t! .`!.t xF p.p(P.p.x.p .|.p.|~LǎHǞDǮ@Ǿ<84PPW.p! !.t! .|WP<@DH~Ly   s  Rq(+p#X((p(psp.x~LǎHǞDǮ@Ǿ<PPW0+K "AC1!WAC$AhAC%hAC&hACWQWPX%AC1QCGxBBSD"vt ('"AC8('p'"$AC4$X$AhAC!FhAC" QP&#1qA@Aq@/@p/`/ #H / @ & /  ! / g `h`/ 0#.0/,@/0ȧN(..8. /,`/  FF=11=CCAM 0AMAP/,VA@/ E@/ p/}@.g/d``//  >  / /// @.p../#,/(0/(ְ/(zkg(P/$(VPp: w q&#,/(0/(<ְ/(@.p..@ekd,/$( .DA4.,/(0/(..ְ/( ֠/./#,/(0/(ְ/(Jkd(P/$(VP@:0D A&#,/(0/(,ְ/(.pTkg(/$( wq( ,/(0/(ְ/(     / ֠/./#,/(0/(ְ/(Jkd*P/$(VP@<0D A&#,/(0/($ְ/(. fp/p\kg,/$( .wq,.,/(0/(ְ/( ֠///#,/(0/(lְ/(Jkd*P/$(VP@< D A&#,/(0/(ְ/(H{ p   /$( @  ~@ , 2 ! . 00  +   ޢ  p.ؐ.ذ...W #(  WP@DH~Lr @D''!'f )70) ~LǎHǞDǮ@PPWPHx~Lp(,j~LǎHPPWPHx~Lp(,"~LǎHPPW`?8<@DH~Lp.ޠ//:T 2p/ p///p  :X ސ$x /Jp  C@:8 6p  : @$:@$ 1 P@$`^P5%cR:W^XP'86 0":B0C9"5 4r+!+ @$0:  ?05N?:@ 5p  5 @$0:  /( /( /:/( 0 &009 4 @$05p (  5(T/ &1/  &0   9( ~LǎHǞDǮ@Ǿ<8`/`W   ?  ?0 6    W6    WX<@DHLPҧ~TsRNW  ( ( D  \ pױ!'(R (> )     ,ؖ   aP/\ +! (() )((n  ' p!7! ڠBW  D ,,-V  ~TǎPǞLǮHǾD@<XXW0@ A#1 ! 1W @(#)nohup.c 6.1 87/11/23 waaausage: nohup command arg ... HOMEnohup: cannot open/create nohup.out /nohup.outnohup: cannot open/create nohup.out Sending output to %s /dev/tty%s: %s: %s nohup.out @(#)errlst.c 6.1 87/11/23 8H`l4@L`p(@P\t,Lhx.Error 0Not ownerNo such file or directoryNo such processInterrupted system callI/O errorNo such device or addressArg list too longExec format errorBad file numberNo child processesNo more processesNot enough spacePermission deniedBad addressBlock device requiredDevice busyFile existsCross-device linkNo such deviceNot a directoryIs a directoryInvalid argumentFile table overflowToo many open filesNot a typewriterText file busyFile too largeNo space left on deviceIllegal seekRead-only file systemToo many linksBroken pipeArgument out of domainResult too largeNo message of desired typeIdentifier removedChannel number out of rangeLevel 2 not synchronizedLevel 3 haltedLevel 3 resetLink number out of rangeProtocol driver not attachedNo CSI structure availableLevel 2 haltedDeadlock condition if locked @(#)execvp.c 6.1 87/11/23 ltttldshPATH:/bin:/usr/bin/bin/sh @(#)getenv.c 6.1 87/11/23 @(#)isatty.c 6.1 87/11/23 @(#)mon.c 6.1 87/11/23 PROFDIRmon.out @(#)perror.c 6.1 87/11/23 : Unknown error @(#)sleep.c 6.1 87/11/23 @(#)data.c 6.1 87/11/23 0@0@0H28B@! @(#)flsbuf.c 6.1 87/11/23 @(#)stdiom.h 6.1 87/11/23 @(#)fopen.c 6.1 87/11/23 @(#)fprintf.c 6.1 87/11/23 RH @(#)malloc.c 6.1 87/11/23 000000000000000000000123456789abcdef0123456789ABCDEF @(#)findiop.c 6.1 87/11/23 @(#)dowrite.c 6.1 87/11/23 @(#)print.h 6.1 87/11/23 @(#)ecvt.c 6.1 87/11/23 Fn CAy7Aׄ@È@Y@$ @(#)fwrite.c 6.1 87/11/23 @(#)stdiom.h 6.1 87/11/23 @(#)memchr.c 6.1 87/11/23 u!ok 5h&.text5h .data6@.bss--&X 0  !2$0 "[W@0 4<d8 J (0@T(0@ 0Hl X ,0 0Hzz"f0" 0J 00@0h!  b0h 0"r00@0h!  ~0j0H0J 0" 0H0 z"z!0@ |6@!n P%0x0x:@@W8 ȧ~4pq0j~ f0x 0x2!1/0xq0x0j q!p~488Wp[BX?@DHLP~Tp-r-b 0 l- p$- - --p   2x2xp2-p q-  ( ^  ! 01'q2! 'q/ > !' :Gq21304!:'q. ,/  H-- -P-q9(9#0@@5601 0- -) v~TǎPǞLǮHǾD@XXWH@~D`@pP pp~  L" tP   XH! H~Dǎ@HHW!21!0W! W!120W8 ȧ~4p.q(~488W@8~<pp ~W  < r  .`  ~<ǎ8@@W8 ȧ~4p T g "Q%(   ~488WH<΀ ~@q R  Bb p'(! ,>     BG G!    g   ,Q"%(  D b j D p     ~@ǎ<HHWH<@~DpǐLJ D   p  p' (. ($   ~Dǎ@Ǟ<HHW8 ȧ~4p  *        |'Q!R D D p%  ' p7! ,~488W@8~<p  ( ppP2W( pp^ԧ*    p& ppP2W>W @  ~<ǎ8@@WP pR a!` !WH@~Dq!$ l~Dǎ@HHWH<@~Dr '$~Dǎ@Ǟ<HHWH<0@~Dr 0 (+R a(a( <r NwX   @   "    t  )r!  )a!"`  p~Dǎ@Ǟ<HHW@~<p.`W .`&0 2  &'   ~<@@WX?@DHLP~Ts @"  aP/\ (  )  ' p7! X (  <~TǎPǞLǮHǾD@XXW [<W[(W![ W![ W[W2![W2![WC2!,[W[XW X[TXXW![*W2![W`W@8~H PPWP48<@DH~L.`H.h! .`.`! .h.h.t.`.p.t.|ր.pqpN$.p.| .|x((lx! ( 2.t.`  !(hր.|`.tp0qp((q$.t .|sqp'( (&    .tp.|p  P.t! .`!.t xF p.p(P.p.x.p .|.p.|~LǎHǞDǮ@Ǿ<84PPW.p! !.t! .|WP<@DH~Ly   s  Rq(+p#X((p(psp.x~LǎHǞDǮ@Ǿ<PPW0+K "AC1!WAC$AhAC%hAC&hACWQWPX%AC1QCGxBBSD"vt ('"AC8('p'"$AC4$X$AhAC!FhAC" QP&#1qA@Aq@/@p/`/ #H / @ & /  ! / g `h`/ 0#.0/,@/0ȧN(..8. /,`/  FF=11=CCAM 0AMAP/,VA@/ E@/ p/}@.g/d``//  >  / /// @.p../"8,/(0/(ְ/(zkg(P/$(VPp: w q&"8,/(0/(ְ/(@.p..@ekd,/$( .DA4.,/(0/(..ְ/( ֠/./"L,/(0/(ְ/(Jkd(P/$(VP@:0D A&"L,/(0/(|ְ/(.pTkg(/$( wq( ,/(0/($ְ/(     / ֠/./"L,/(0/(ְ/(Jkd*P/$(VP@<0D A&"L,/(0/(tְ/(. fp/p\kg,/$( .wq,.,/(0/(ְ/( ֠///"8,/(0/(ְ/(Jkd*P/$(VP@< D A&"8,/(0/(`ְ/(H{ p   /$( @  f@ , 2 ! . 00  +   ݊  p.ؐ.ذ...WH@~Dp ްW & !   D 6ހ  @  ڔ(  ! p!!7 R   .   W    ~Dǎ@HHW (  WP@DH~Lr @D''!' )7`) ~LǎHǞDǮ@PPW2!6[W2![WPHx~Lp(,j~LǎHPPWPHx~Lp(,"~LǎHPPW`?8<@DH~Lp.ޠ//:T 2p/ p///p  :X ސ#  /Jp  C@:8 6p  : @$:@$ 1 P@$`^P5%cR:W^XP'86 0":B0C9"5 4r+!+ @$0:  ?05N?:@ 5p  5 @$0:  /( /( /:/( 0 &009 4 @$05p (  5(T/ &1/  &0   9( ~LǎHǞDǮ@Ǿ<8`/`W   ?  ?0 6    W6    WX<@DHLPҧ~TsRNW  ( ( D R \ pױ'(R (> )     ,   aP/\ +! (() )((F  ' p7! BW  D ,,-V , ~TǎPǞLǮHǾD@<XXW0@ A#1 ! 1W @(#)pwd.c 6.1 87/11/23 rpwd: cannot stat .! pwd: cannot open .. pwd: cannot stat ..! pwd: cannot chdir to .. pwd: read error in .. pwd: read error in .. /... @(#)mon.c 6.1 87/11/23 PROFDIRmon.out @(#)perror.c 6.1 87/11/23 : Unknown error @(#)data.c 6.1 87/11/23 2224D @(#)flsbuf.c 6.1 87/11/23 @(#)stdiom.h 6.1 87/11/23 @(#)fopen.c 6.1 87/11/23 @(#)fprintf.c 6.1 87/11/23 @(#)fread.c 6.1 87/11/23 @(#)stdiom.h 6.1 87/11/23 T @(#)errlst.c 6.1 87/11/23 HP\x(<P\t   0 @ X h       !!0!@!P!l!!!.Error 0Not ownerNo such file or directoryNo such processInterrupted system callI/O errorNo such device or addressArg list too longExec format errorBad file numberNo child processesNo more processesNot enough spacePermission deniedBad addressBlock device requiredDevice busyFile existsCross-device linkNo such deviceNot a directoryIs a directoryInvalid argumentFile table overflowToo many open filesNot a typewriterText file busyFile too largeNo space left on deviceIllegal seekRead-only file systemToo many linksBroken pipeArgument out of domainResult too largeNo message of desired typeIdentifier removedChannel number out of rangeLevel 2 not synchronizedLevel 3 haltedLevel 3 resetLink number out of rangeProtocol driver not attachedNo CSI structure availableLevel 2 haltedDeadlock condition if locked @(#)getenv.c 6.1 87/11/23 @(#)isatty.c 6.1 87/11/23 @(#)malloc.c 6.1 87/11/23 000000000000000000000123456789abcdef0123456789ABCDEF @(#)filbuf.c 6.1 87/11/23 @(#)findiop.c 6.1 87/11/23 @(#)dowrite.c 6.1 87/11/23 @(#)print.h 6.1 87/11/23 @(#)ecvt.c 6.1 87/11/23 Fn CAy7Aׄ@È@Y@$ @(#)fwrite.c 6.1 87/11/23 @(#)stdiom.h 6.1 87/11/23 @(#)memchr.c 6.1 87/11/23 u!or / 8$.text/ .data 80@.bss$ 0  !2$0 "[WH<@ ~Dq" nǗ:0 9q̓ <ypT~Dǎ@Ǟ<HHWp[BX?@DHLP~TpЎr̆b 0  p$  Гp  t   p (p qȈ  ( ^  ! 01'q2! 'q/  !' :Gq21304!:'q. ,/  `̧̧ Pq9(9#0@@5601 0 ) ~TǎPǞLǮHǾD@XXWH@~D pP ppH  L" h   H! x~Dǎ@HHWP<@DH~Lp p(( xB8`Rp p* ~LǎHǞDǮ@Ǿ<PPW8888W!21!0W! W!120W8 ȧ~4p.q(~488W@8~<pp ~W  < r     ~<ǎ8@@W8 ȧ~4p T g "Q%(   ~488WH<΀ ~@q R  Bb p'(! ,>     BG G!    g   ,Q"%(  D b j D p     ~@ǎ<HHWH<@~DpǐLJ D   p  p' (. (<   ~Dǎ@Ǟ<HHW8 ȧ~4p  *        |'Q!R D D p%  ' p7! ,~488W@8~<p  ( ppP 0W( pp^*    p& ppP 0WVW @  ~<ǎ8@@WP pR a!` !W@~<p.`W .`&0 2  &' 6  ~<@@W[xW![ZW[W[BWC2!,[W[W [W!00[WH .(N0n8@HPX` W`X .(N0n8Ɏ@ɮHPԩة>^觾[2![W W@8~ PPWP48<@DH~L`Hh! ``! hht`pt|րpqpN$p| |x((lx! ( 2t`  !(hր|tp0qp((q$t |sqp'( (&L   . tp|p  Pt! `!t xF pp(Ppxp |p|~LǎHǞDǮ@Ǿ<84PPWp! !t! |WP<@DH~Ly   s  Rq(+p#X((p(pspx~LǎHǞDǮ@Ǿ<PPW0+K "AC1!WAC$AhAC%hAC&hACWQWPX%AC1QCGxBBSD"vt ('"AC8('p'"$AC4$X$AhAC!FhAC" QP&#1qA@Aq@@p` #H  @ &   !  g `h` 0#0,@0ȧN(r8 ,`  FF=11=CCAM 0AMAP,VA@ E@ p}@gd``  >    @p/,(0(Vְ(zkg(P$(VPp: w q&,(0(ְ(@p@ekd,$( DA4,(0(ְ( ֠/ ,(0(Fְ(Jkd(P$(VP@:0D A& ,(0(ְ(pTkg($( wq( ,(0(ְ(     / ֠/ ,(0(@ְ(Jkd*P$(VP@<0D A& ,(0(ְ( fpp\kg,$( wq,,(0(tְ( ֠/,(0(,ְ(Jkd*P$(VP@< D A&,(0(ְ(H{ p   $( @  @ , 2 ! . 00  +     pؐذWP@DH~Lr @D''!' )7H) ~LǎHǞDǮ@PPW2!6[WPHx~Lp(,j~LǎHPPWPHx~Lp(,"~LǎHPPW`?8<@DH~Lp.ޠ:T 2p pp  :X ސ Jp  C@:8 6p  : @$:@$ 1 P@$`^P5%cR:W^XP'86 0":B0C9"5 4r+!+ @$0:  ?05N?:@ 5p  5 @$0:  ( ( :( 0 &009 4 @$05p (  5(T &1  &0   9( ~LǎHǞDǮ@Ǿ<8``W   ?  ?0 6    W6    WX<@DHLPҧ~TsRNW  ( ( D ۊ \ pױ'(R (> )0     ,6   aP/\ +! (() )((  ' p7! @BW  D ,,-V d ~TǎPǞLǮHǾD@<XXW0@ A#1 ! 1W @(#)sleep.c 6.1 87/11/23 usage: sleep time sleep: bad character in argument @(#)mon.c 6.1 87/11/23 PROFDIRmon.out @(#)perror.c 6.1 87/11/23 : Unknown error @(#)sleep.c 6.1 87/11/23 @(#)data.c 6.1 87/11/23  @ @ H"82@ @(#)flsbuf.c 6.1 87/11/23 @(#)stdiom.h 6.1 87/11/23 @(#)fprintf.c 6.1 87/11/23 BH @(#)errlst.c 6.1 87/11/23 8H`l4@L`p(@P\t,Lhx.Error 0Not ownerNo such file or directoryNo such processInterrupted system callI/O errorNo such device or addressArg list too longExec format errorBad file numberNo child processesNo more processesNot enough spacePermission deniedBad addressBlock device requiredDevice busyFile existsCross-device linkNo such deviceNot a directoryIs a directoryInvalid argumentFile table overflowToo many open filesNot a typewriterText file busyFile too largeNo space left on deviceIllegal seekRead-only file systemToo many linksBroken pipeArgument out of domainResult too largeNo message of desired typeIdentifier removedChannel number out of rangeLevel 2 not synchronizedLevel 3 haltedLevel 3 resetLink number out of rangeProtocol driver not attachedNo CSI structure availableLevel 2 haltedDeadlock condition if locked @(#)getenv.c 6.1 87/11/23 @(#)isatty.c 6.1 87/11/23 @(#)malloc.c 6.1 87/11/23 000000000000000000000123456789abcdef0123456789ABCDEF @(#)dowrite.c 6.1 87/11/23 @(#)print.h 6.1 87/11/23 @(#)ecvt.c 6.1 87/11/23 Fn CAy7Aׄ@È@Y@$ @(#)fwrite.c 6.1 87/11/23 @(#)stdiom.h 6.1 87/11/23 @(#)memchr.c 6.1 87/11/23 u!ow ".text .data@.bss/p/p" 0  !2$0 ":[W8ȓ H88Wp[BX?@DHLP~Tp/xr/tb 0 T/x $p$/t /p /p/xp ̋ 0 0 p0(/tp q/p  ( ^ Z ! 01'q2! 'q/V !' :Gq21304!:'q.,/ H/t/t /tP/pq9(9#0@@5601 0/p /p)^~TǎPǞLǮHǾD@XXWH@~Dxp@ pp~ \<"LP  08! ~Dǎ@HHW!21!0W! W!120W8 ȧ~4p.q(~488W@8~<pp ~W  < r f   ~<ǎ8@@W8 ȧ~4p T g "Q%(   ~488WH<΀ ~@q R  Bb p'(! ,>     BG G!    g   ,Q"%(  D b j D p     ~@ǎ<HHWH<@~DpǐLJ D   p  p' (. (   ~Dǎ@Ǟ<HHW8 ȧ~4p  *        |'Q!R D D p%  ' p7! ,~488W@8~<p  ( ppP00W( pp^*    p& ppP00WW @  ~<ǎ8@@WP pR a!` !W[W![W[WC2!,[W[pW [DW$[W2![WW@8~@ PPWP48<@DH~L/H/! //! ///////ր/qpN$// /x((lx! ( 2//  !(hր/p/p0qp((q$/ /sqp'( (&    /p/p  P/! /!/ xF p/(P/// ///~LǎHǞDǮ@Ǿ<84PPW/! !/! /WP<@DH~Ly   s  Rq(+p#X((p(psp/~LǎHǞDǮ@Ǿ<PPW0+K "AC1!WAC$AhAC%hAC&hACWQWPX%AC1QCGxBBSD"vt ('"AC8('p'"$AC4$X$AhAC!FhAC"     BG G!     g   ,Q"%(  D b j D p     ~@ǎ<HHWH<@~DpǐLJ D   p  p' (. (   ~Dǎ@Ǟ<HHW8 ȧ~4p  *        |'Q!R D D p%  ' p7! ,~488W@8~<p  ( ppP` W( pp^4*    p& ppP` WW @  ~<ǎ8@@WP pR a!` !W@~<p.`W .`&0 2  &' &  ~<@@W[W![W![ nW[W2![LW2![0WC2!,[W2![W[xW x[xxW!00[WH .(N0n8@HPX` W`X .(N0n8Ɏ@ɮHPԩة>^觾[![W2![W@8~ PPWP48<@DH~L.`H.h! .`.`! .h.h.t.`.p.t.|ր.pqpN$.p.| .|x((lx! ( 2.t.`  !(hր.|.tp0qp((q$.t .|sqp'( (&L   . .tp.|p  P.t! .`!.t xF p.p(P.p.x.p .|.p.|~LǎHǞDǮ@Ǿ<84PPW.p! !.t! .|WP<@DH~Ly   s  Rq(+p#X((p(psp.x~LǎHǞDǮ@Ǿ<PPW0+K "AC1!WAC$AhAC%hAC&hACWQWPX%AC1QCGxBBSD"vt ('"AC8('p'"$AC4$X$AhAC!FhAC" QP&#1qA@Aq@/@p/`/ #H / @ & /  ! / g `h`/ 0#.0/,@/0ȧN(.r.8. /,`/  FF=11=CCAM 0AMAP/,VA@/ E@/ p/}@.g/d``//  >  / /// @.p../!P,/(0/(Vְ/(zkg(P/$(VPp: w q&!P,/(0/(ְ/(@.p..@ekd,/$( .DA4.,/(0/(..ְ/( ֠/./!d,/(0/(Fְ/(Jkd(P/$(VP@:0D A&!d,/(0/(ְ/(.pTkg(/$( wq( ,/(0/(ְ/(     / ֠/./!d,/(0/(@ְ/(Jkd*P/$(VP@<0D A&!d,/(0/(ְ/(. fp/p\kg,/$( .wq,.,/(0/(tְ/( ֠///!P,/(0/(,ְ/(Jkd*P/$(VP@< D A&!P,/(0/(ְ/(H{ p   /$( @  @ , 2 ! . 00  +   *  p.ؐ.ذ...WP@DH~Lr @D''!'. )7H)\ ~LǎHǞDǮ@PPW2!6[0WPHx~Lp(,j~LǎHPPWPHx~Lp(,"~LǎHPPW`?8<@DH~Lp.ޠ//:T 2p/ p///p  :X ސ! /Jp  C@:8 6p  : @$:@$ 1 P@$`^P5%cR:W^XP'86 0":B0C9"5 4r+!+ @$0:  ?05N?:@ 5p  5 @$0:  /( /( /:/( 0 &009 4 @$05p (  5(T/ &1/  &0   9( ~LǎHǞDǮ@Ǿ<8`/`W   ?  ?0 6    W6    WX<@DHLPҧ~TsRNW  ( ( D ۚ \ pױ'(R (> )ߠ     ,F   aP/\ +! (() )((  ' p7! PBW  D ,,-V t ~TǎPǞLǮHǾD@<XXW0@ A#1 ! 1W @(#)tee.c 6.1 87/11/23 aiusage: tee [ -i ] [ -a ] [file ] ... tee: cannot open %s  @(#)getopt.c 6.1 87/11/23 --: illegal option -- : illegal option -- : option requires an argument -- : option requires an argument --  @(#)mon.c 6.1 87/11/23 PROFDIRmon.out @(#)perror.c 6.1 87/11/23 : Unknown error @(#)data.c 6.1 87/11/23 `0`0`8b(r0 @(#)flsbuf.c 6.1 87/11/23 @(#)stdiom.h 6.1 87/11/23 @(#)fprintf.c 6.1 87/11/23 8 @(#)errlst.c 6.1 87/11/23 `ht,@Tht$8HXp  , H X h    .Error 0Not ownerNo such file or directoryNo such processInterrupted system callI/O errorNo such device or addressArg list too longExec format errorBad file numberNo child processesNo more processesNot enough spacePermission deniedBad addressBlock device requiredDevice busyFile existsCross-device linkNo such deviceNot a directoryIs a directoryInvalid argumentFile table overflowToo many open filesNot a typewriterText file busyFile too largeNo space left on deviceIllegal seekRead-only file systemToo many linksBroken pipeArgument out of domainResult too largeNo message of desired typeIdentifier removedChannel number out of rangeLevel 2 not synchronizedLevel 3 haltedLevel 3 resetLink number out of rangeProtocol driver not attachedNo CSI structure availableLevel 2 haltedDeadlock condition if locked @(#)getenv.c 6.1 87/11/23 @(#)isatty.c 6.1 87/11/23 @(#)malloc.c 6.1 87/11/23 000000000000000000000123456789abcdef0123456789ABCDEF @(#)dowrite.c 6.1 87/11/23 @(#)print.h 6.1 87/11/23 @(#)ecvt.c 6.1 87/11/23 Fn CAy7Aׄ@È@Y@$ @(#)fwrite.c 6.1 87/11/23 @(#)stdiom.h 6.1 87/11/23 @(#)memchr.c 6.1 87/11/23 u!o 40$.text4 .data05@.bss--$! 0  !2$0 ""[W`@D~HpLq ޓPpqXē^p>p!8X x|\0\ XLpXPT @X(0\s~HǎDǞ@``WP< ~@pNG81840qAyX$'GG!0!$0 H!  ! H X! X  !X  \2! \'G  P! X!  ! F X! X  !X  \2! \qpX0 ~@ǎ<PPWWp[B8ȧTT.X88W0<@DH~LqH ހP /@.P P p W dDPP!9TX"@Br!4CA@`P Hq%( 6P)  ~LǎHǞDǮ@Ǿ<W0~s@1tC@ p:G @ /$A B!  1~W@8~     BG G!8    g   ,Q"%(  D b j D p     ~@ǎ<HHWH<@~DpǐLJ D   p 8  p 8' (. (   ~Dǎ@Ǟ<HHW8 ȧ~4p  *        |'Q!R D D p 8%  ' p 87! ,~488W@8~<p  ( ppP00W 8( pp!@ 8^*    p 8& ppP00W 8W @  ~<ǎ8@@WP pR 8 a!` !W@~<p.`W .`&0 2  &'   ~<@@W[W![W!;0[W[ nW[W[RWC2!,[W[ !W ![!!W!00[WH .(N0n8@HPX` W`X .(N0n8Ɏ@ɮHPԩة>^觾[+[$W[ . W2![WPT.> PPWP48<@DH~L.`H.h! .`.`! .h.h.t.`.p.t.|ր.pqpN$.p.| .|x((lx! ( 2.t.`  !(hր.|`.tp0qp((q$.t .|sqp'( (&    .tp.|p  P.t! .`!.t xF p.p(P.p.x.p .|.p.|~LǎHǞDǮ@Ǿ<84PPW.p! !.t! .|WP<@DH~Ly   s  Rq(+p#X((p(psp.x~LǎHǞDǮ@Ǿ<PPW0+K "AC1!WAC$AhAC%hAC&hACWQWPX%AC1QCGxBBSD"vt ('"AC8('p'"$AC4$X$AhAC!FhAC" QP&#1qA@Aq@/@p/`/ #H / @ & /  ! / g `h`/ 0#.0/,@/0ȧN(.r.8. /,`/  FF=11=CCAM 0AMAP/,VA@/ E@/ p/}@.g/d``//  >  / /// @.p../!,/(0/(Vְ/(zkg(P/$(VPp: w q&!,/(0/(ְ/(@.p..@ekd,/$( .DA4.,/(0/(..ְ/( ֠/./" ,/(0/(Fְ/(Jkd(P/$(VP@:0D A&" ,/(0/(ְ/(.pTkg(/$( wq( ,/(0/(ְ/(     / ֠/./" ,/(0/(@ְ/(Jkd*P/$(VP@<0D A&" ,/(0/(ְ/(. fp/p\kg,/$( .wq,.,/(0/(tְ/( ֠///!,/(0/(,ְ/(Jkd*P/$(VP@< D A&!,/(0/(ְ/(H{ p   /$( @  N@ , 2 ! . 00  +   r  p.ؐ.ذ...WP@DH~Lr @D''!'v )7H) ~LǎHǞDǮ@PPW2!6[ԠWPHx~Lp(,j~LǎHPPWPHx~Lp(,"~LǎHPPW`?8<@DH~Lp.ޠ//:T 2p/ p///p  :X ސ" /Jp  C@:8 6p  : @$:@$ 1 P@$`^P5%cR:W^XP'86 0":B0C9"5 4r+!+ @$0:  ?05N?:@ 5p  5 @$0:  /( /( /:/( 0 &009 4 @$05p (  5(T/ &1/  &0   9( ~LǎHǞDǮ@Ǿ<8`/`W   ?  ?0 6    W6    WX<@DHLPҧ~TsRNW  ( ( D  \ pױ 8'(R (> )     ,ڎ   aP/\ +! (() )((  ' p 87! ܘBW  D ,,-V ټ ~TǎPǞLǮHǾD@<XXW0@ A#1 ! 1W @(#)time.c 6.1 87/11/23 time: cannot fork -- try again. %s: %s time: command terminated abnormally. realusersys    `lx000 .::. @(#)errlst.c 6.1 87/11/23 px(<Pdx  4HXh  <Xhx.Error 0Not ownerNo such file or directoryNo such processInterrupted system callI/O errorNo such device or addressArg list too longExec format errorBad file numberNo child processesNo more processesNot enough spacePermission deniedBad addressBlock device requiredDevice busyFile existsCross-device linkNo such deviceNot a directoryIs a directoryInvalid argumentFile table overflowToo many open filesNot a typewriterText file busyFile too largeNo space left on deviceIllegal seekRead-only file systemToo many linksBroken pipeArgument out of domainResult too largeNo message of desired typeIdentifier removedChannel number out of rangeLevel 2 not synchronizedLevel 3 haltedLevel 3 resetLink number out of rangeProtocol driver not attachedNo CSI structure availableLevel 2 haltedDeadlock condition if locked @(#)execvp.c 6.1 87/11/23  shPATH:/bin:/usr/bin/bin/sh @(#)getenv.c 6.1 87/11/23 @(#)mon.c 6.1 87/11/23 PROFDIRmon.out @(#)perror.c 6.1 87/11/23 : Unknown error @(#)sleep.c 6.1 87/11/23 @(#)data.c 6.1 87/11/23 0@0@0H28B@ 8 @(#)flsbuf.c 6.1 87/11/23 @(#)stdiom.h 6.1 87/11/23 @(#)fprintf.c 6.1 87/11/23 RH @(#)isatty.c 6.1 87/11/23 @(#)malloc.c 6.1 87/11/23 000000000000000000000123456789abcdef0123456789ABCDEF @(#)dowrite.c 6.1 87/11/23 @(#)print.h 6.1 87/11/23 @(#)ecvt.c 6.1 87/11/23 Fn CAy7Aׄ@È@Y@$ @(#)fwrite.c 6.1 87/11/23 @(#)stdiom.h 6.1 87/11/23 @(#)memchr.c 6.1 87/11/23 u!o 3X$.text3X .data4@.bss--$ 0  !2$0 "[WH@~Dq` ?!X : l  s40 $0(0z ,0 20(p p  H(pp ~Dǎ@HHWp2[BP<@D~HPxqQp`*p-p p|Lp!x'":00 F bLMLJh  H  L"Px`pQPxQPx?b : Pxap!'",p08~bNOLJJ   ԓ*   ~N" pQ?Pxzp08QPxLPx`pQPxQPx08~HǎDǞ@Ǯ<PPWX?@DHLP~Tp-؎r-Ԇb 0 - \p$- - P --ؓp   0@0@p0H-p q-Ј  ( ^(  0! 01'q2! 'q/  !' :Gq21304!:'q.8,/ 8-ԧ-ԧ -P-q9(9#0@@5601 0- -) ~TǎPǞLǮHǾD@XXWH@~Dph pp0  d"    `! ~Dǎ@HHW !  W!2! W!21!0W! W!120Wh@~Dp  >x $|     qHpH.z .@.@J.@XD Ndzz<\  (pZz.@<H r C q+~Dǎ@W8 ȧ~4p.q (~488W@8~<pp ~W  < r    ~<ǎ8@@W8 ȧ~4p T g "Q%(   ~488WH<΀ ~@q R  Bb p'(! ,>     BG G!    g   ,Q"%(  D b j D p     ~@ǎ<HHWH<@~DpǐLJ D   p  p' (. (   ~Dǎ@Ǟ<HHW8 ȧ~4p  *        |'Q!R D D p%  ' p7! ,~488W@8~<p  ( ppP0PW( pp ^*    p& ppP0PWW @  ~<ǎ8@@WP pR a!` !W@\.`P.\(0 2  .    @@W[@W!["W![ W[W2![W2![WC2!,[W2![W[W [TW![*W2![WW@8~ PPWP48<@DH~L.`H.h! .`.`! .h.h.t.`.p.t.|ր.pqpN$.p.| .|x((lx! ( 2.t.`  !(hր.|`.tp0qp((q$.t .|sqp'( (&    .tp.|p  P.t! .`!.t xF p.p(P.p.x.p .|.p.|~LǎHǞDǮ@Ǿ<84PPW.p! !.t! .|WP<@DH~Ly   s  Rq(+p#X((p(psp.x~LǎHǞDǮ@Ǿ<PPW0+K "AC1!WAC$AhAC%hAC&hACWQWPX%AC1QCGxBBSD"vt ('"AC8('p'"$AC4$X$AhAC!FhAC" QP&#1qA@Aq@/@p/`/ #H / @ & /  ! / g `h`/ 0#.0/,@/0ȧN(.r.8. /,`/  FF=11=CCAM 0AMAP/,VA@/ E@/ p/}@.g/d``//  >  / /// @.p../ ,/(0/(Vְ/(zkg(P/$(VPp: w q& ,/(0/(ְ/(@.p..@ekd,/$( .DA4.,/(0/(..ְ/( ֠/./ ,,/(0/(Fְ/(Jkd(P/$(VP@:0D A& ,,/(0/(ְ/(.pTkg(/$( wq( ,/(0/(ְ/(     / ֠/./ ,,/(0/(@ְ/(Jkd*P/$(VP@<0D A& ,,/(0/(ְ/(. fp/p\kg,/$( .wq,.,/(0/(tְ/( ֠/// ,/(0/(,ְ/(Jkd*P/$(VP@< D A& ,/(0/(ְ/(H{ p   /$( @  f@ , 2 ! . 00  +    p.ؐ.ذ...WP@DH~Lr @D''!' )7H)4 ~LǎHǞDǮ@PPW2!6[0WPHx~Lp(,j~LǎHPPWPHx~Lp(,"~LǎHPPW`?8<@DH~Lp.ޠ//:T 2p/ p///p  :X ސ  /Jp  C@:8 6p  : @$:@$ 1 P@$`^P5%cR:W^XP'86 0":B0C9"5 4r+!+ @$0:  ?05N?:@ 5p  5 @$0:  /( /( /:/( 0 &009 4 @$05p (  5(T/ &1/  &0   9( ~LǎHǞDǮ@Ǿ<8`/`W   ?  ?0 6    W6    WX<@DHLPҧ~TsRNW  ( ( D  \ pױ'(R (> )`     ,ڦ   aP/\ +! (() )((  ' p7! ܰBW  D ,,-V  ~TǎPǞLǮHǾD@<XXW0@ A#1 ! 1W @(#)tty.c 6.1 87/11/23 %s lsUsage: tty [-l] [-s] not a tty @(#)getopt.c 6.1 87/11/23 --: illegal option -- : illegal option -- : option requires an argument -- : option requires an argument --  @(#)mon.c 6.1 87/11/23 PROFDIRmon.out @(#)perror.c 6.1 87/11/23 : Unknown error @(#)ttyname.c 6.1 87/11/23 /dev/ @(#)flsbuf.c 6.1 87/11/23 @(#)stdiom.h 6.1 87/11/23 @(#)printf.c 6.1 87/11/23 Rh @(#)errlst.c 6.1 87/11/23  0HTp(4HXhx(8D\p4P`.Error 0Not ownerNo such file or directoryNo such processInterrupted system callI/O errorNo such device or addressArg list too longExec format errorBad file numberNo child processesNo more processesNot enough spacePermission deniedBad addressBlock device requiredDevice busyFile existsCross-device linkNo such deviceNot a directoryIs a directoryInvalid argumentFile table overflowToo many open filesNot a typewriterText file busyFile too largeNo space left on deviceIllegal seekRead-only file systemToo many linksBroken pipeArgument out of domainResult too largeNo message of desired typeIdentifier removedChannel number out of rangeLevel 2 not synchronizedLevel 3 haltedLevel 3 resetLink number out of rangeProtocol driver not attachedNo CSI structure availableLevel 2 haltedDeadlock condition if locked @(#)getenv.c 6.1 87/11/23 @(#)isatty.c 6.1 87/11/23 @(#)malloc.c 6.1 87/11/23 @(#)data.c 6.1 87/11/23 0`0`0h2XB` 000000000000000000000123456789abcdef0123456789ABCDEF @(#)dowrite.c 6.1 87/11/23 @(#)print.h 6.1 87/11/23 @(#)ecvt.c 6.1 87/11/23 Fn CAy7Aׄ@È@Y@$ @(#)fwrite.c 6.1 87/11/23 @(#)stdiom.h 6.1 87/11/23 @(#)memchr.c 6.1 87/11/23 u!o 4x$ .text4x .data  5 @.bss--$ 0  !2$0  " [Wh<@DHLP~TqP^d^\^`0 0Pa,B? NHvmzpHW^dQ^dVNF^`Q^`P0X^X.&^dQ^d^\Q^\ p 0#-`n\  X|lnd   n`  0PH.hHHH H |"L!L  0PH)`6X Xj FHH H ֋ L!L  0PH"n  HHH H h"L!L  0PH" dp   HHH H"L!L  0PH"$ :HH HLL ,~TǎPǞLǮHǾD@<hhWp[BP<@D~HPqQp`*p-p pLp!'":0` F bLMLJh   8H   L" P`pQPQP?b : Pap!'",p0X~bNOLJJ   t*  P N" Q?Pzp0XQPLP`pQPQP0X~HǎDǞ@Ǯ<PPWX?@DHLP~Tp-r-b 0 - p$- - --p   0h0hp0p-p q-  ( ^ȓ J Ћ! 01'q2! 'q/  !' :Gq21304!:'q.؆,/ -- -P-q9(9#0@@5601 0- -)~TǎPǞLǮHǾD@XXWH@~Dp pp L"<   !~Dǎ@HHW !  W!2! W!21!0W! W!120W8 ȧ~4p8.qH(~488W@8~<pp ~W  < r    ~<ǎ8@@W8 ȧ~4p T g "Q%(   ~488WH<΀ ~@q R  Bb p8'(! ,>     BG G!8    g   ,Q"%(  D b j D p     ~@ǎ<HHWH<@~DpǐLJ D   p8  p8' (. (   ~Dǎ@Ǟ<HHW8 ȧ~4p  *        |'Q!R D D p8%  ' p87! ,~488W@8~<p  ( ppP0xW8( pp@8^d*    p8& ppP0xW8ΆW @  ~<ǎ8@@WP pR8 a!` !W@~<p.`W .`&0 2  &' V  ~<@@W[W![W[WC2!,[W[W [|W90 [NW90 [.W2![WW@8~ PPWP48<@DH~L.`H.h! .`.`! .h.h.t.`.p.t.|ր.pqpN$.p.| .|x((lx! ( 2.t.`  !(hր.|8.tp0qp((q$.t .|sqp'( (&    b.tp.|p  P.t! .`!.t xF p.p(P.p.x.p .|.p.|~LǎHǞDǮ@Ǿ<84PPW.p! !.t! .|WP<@DH~Ly   s  Rq(+p#X((p(psp.x~LǎHǞDǮ@Ǿ<PPW0+K "AC1!WAC$AhAC%hAC&hACWQWPX%AC1QCGxBBSD"vt ('"AC8('p'"$AC4$X$AhAC!FhAC" QP&#1qA@Aq@/@p/`/ #H / @ & /  ! / g `h`/ 0#.0/,@/0ȧN(.r.8. /,`/  FF=11=CCAM 0AMAP/,VA@/ E@/ p/}@.g/d``//  >  / /// @.p../!,/(0/(Vְ/(zkg(P/$(VPp: w q&!,/(0/(ְ/(@.p..@ekd,/$( .DA4.,/(0/(..ְ/( ֠/./!,/(0/(Fְ/(Jkd(P/$(VP@:0D A&!,/(0/(ְ/(.pTkg(/$( wq( ,/(0/(ְ/(     / ֠/./!,/(0/(@ְ/(Jkd*P/$(VP@<0D A&!,/(0/(ְ/(. fp/p\kg,/$( .wq,.,/(0/(tְ/( ֠///!,/(0/(,ְ/(Jkd*P/$(VP@< D A&!,/(0/(ְ/(H{ p   /$( @  @ , 2 ! . 00  +    p.ؐ.ذ...WP@DH~Lr @D''!' )7H)\ ~LǎHǞDǮ@PPW2!6[XWPHx~Lp(,j~LǎHPPWPHx~Lp(,"~LǎHPPW`?8<@DH~Lp.ޠ//:T 2p/ p///p  :X ސ"8 /Jp  C@:8 6p  : @$:@$ 1 P@$`^P5%cR:W^XP'86 0":B0C9"5 4r+!+ @$0:  ?05N?:@ 5p  5 @$0:  /( /( /:/( 0 &009 4 @$05p (  5(T/ &1/  &0   9( ~LǎHǞDǮ@Ǿ<8`/`W   ?  ?0 6    W6    WX<@DHLPҧ~TsRNW  ( ( D j \ pױ8'(R (> )߈     ,   aP/\ +! (() )((  ' p87!  BW  D ,,-V D ~TǎPǞLǮHǾD@<XXW0@ A#1 ! 1W @(#)uname.c 6.1 87/11/23 asnN:rvmusage: uname [-snrvma] or uname -Nnode %.9s%.9suname: cannot write the nodename %.9s%.9s%.9s @(#)getopt.c 6.1 87/11/23 --: illegal option -- : illegal option -- : option requires an argument -- : option requires an argument --  @(#)mon.c 6.1 87/11/23 PROFDIRmon.out @(#)perror.c 6.1 87/11/23 : Unknown error @(#)data.c 6.1 87/11/23 0002B8 @(#)flsbuf.c 6.1 87/11/23 @(#)stdiom.h 6.1 87/11/23 @(#)fprintf.c 6.1 87/11/23 R @(#)errlst.c 6.1 87/11/23  4HXl(<Pdx   < P l     !!.Error 0Not ownerNo such file or directoryNo such processInterrupted system callI/O errorNo such device or addressArg list too longExec format errorBad file numberNo child processesNo more processesNot enough spacePermission deniedBad addressBlock device requiredDevice busyFile existsCross-device linkNo such deviceNot a directoryIs a directoryInvalid argumentFile table overflowToo many open filesNot a typewriterText file busyFile too largeNo space left on deviceIllegal seekRead-only file systemToo many linksBroken pipeArgument out of domainResult too largeNo message of desired typeIdentifier removedChannel number out of rangeLevel 2 not synchronizedLevel 3 haltedLevel 3 resetLink number out of rangeProtocol driver not attachedNo CSI structure availableLevel 2 haltedDeadlock condition if locked @(#)getenv.c 6.1 87/11/23 @(#)isatty.c 6.1 87/11/23 @(#)malloc.c 6.1 87/11/23 000000000000000000000123456789abcdef0123456789ABCDEF @(#)dowrite.c 6.1 87/11/23 @(#)print.h 6.1 87/11/23 @(#)ecvt.c 6.1 87/11/23 Fn CAy7Aׄ@È@Y@$ @(#)fwrite.c 6.1 87/11/23 @(#)stdiom.h 6.1 87/11/23 @(#)memchr.c 6.1 87/11/23 u!o \h:.text\ .datah\@.bss:(:(:+H 0  !2$0 "b[WX﨧HLP~Tq$X0B2D P P ( P(P0P8P@PHtPPPXXTPf:D$ Z<$ D&$ .\x^ - H(!  H(! 2 ?(!  ?(! v A| T(! n T(! B u(! R0a#(! FpWPHPH:DFP@P@4:,PX :0PX :4PX:8:<:@P0 P0:DP0 P0:H:L :,12$P0 P0P`PXTP0FP8:Dҋ*!$*@PHt>.b btJ :($20 :DvP`"Wzbz\zp:(Nz$ȓ):. ,PH2PP!PPPh'-P@dWzZzTPXL+RP0$($ (P@ (r ,$@(:("z,'7z"z3z$(T'P0Wzzz z'z"$h'Wz zTB  $p'~z"'7z"z3$|'V8Wz z(>  $'$H' FpPH 6$"~TǎPǞLǮHXXWH8<@R4~D PPpR8@')PhPhxǗtPPpR4xǧHD$$ $n$!$Ph(bPh tPP(4~Dǎ@Ǟ<Ǯ8HHW@0!$%P$%>$%,$%$<%$d$$$$$$$$$$ <$ @@W@:P)R@:P@W@:`- @:`@W0A!~q΀ (xp qp *t1Aq Bρ . C1 ~ǎǞW :p(\R5@"43@W 40 5PB0C&0@^C2@ 4@@ 40!:pWx~@p V !:xP0Wzzz zd P' &dD( :x X>|(.\ Q:x `L C!1g~<W8$ 88WP<@D~Hp, !`LLpǀ!1'2ב!ס!z!hH@80(L LLp  ~HǎDǞ@Ǯ<PPW :"4 mn2"'W Q!Q Q 0<=( # =,=0 p'=@JF" 4#  m  n 4#  m  n!0F 4# m n$=<=D mn n! !2$21  !=4=8=H=(W@8=P  ~<2!0!!!1!=PA!42A!4"1#x(2"#"!,2A!42A!4"1#t't'"dt'"drt'"d\8 d# 2! 0!("d*~<ǎ8@=P@W@!:#:#"0$0 #0*0W8!X !p00  0 B!41 -RA!*P%00(# %09(# $@ <!`^!h2 !t00  0 B!4188Wp[B@8~0Qa1t&! 0Rb1T&# 8Td14&' 3Xh1 ހ=x#' ~@ǎ<hhW@# <=x!02 $ =p@@W8# \#=x=p!02 $ 88W@~<p O #xr~<@@WX?@DHLP~Tp=r=b 04=p$= = ==p , RRpS=p q=  ( ^$R $ ! 01'q2! 'q/ !' :Gq21304!:'q.$(,/T $(== =P=q9(9#0@@5601 0= =)>~TǎPǞLǮHǾD@XXWH@~D+P,0p$X pp+x D$T"4  $P!~Dǎ@HHW!1021!0W!2! W!21!0W! W2!10B!0 W2!@4(ARQ!P4AQW!120Wh@~Dp >x $|    $ qHpH.z >$>J4>Xč Ndzz<\  (pZz><H J C q+T~Dǎ@WX?@DHLP~Tr8     *8,  ' p(7! ` ?  ~TǎPǞLǮHǾD@XXWH@~Dp W & !   D 6ހ$  @  )(  ! p!(!7 R   .   W    ~Dǎ@HHW8 ȧ~4p$.q)(~488W@8~<pp ~W  < r  +P  ~<ǎ8@@W8 ȧ~4p T g "Q%(   ~488WH<΀ ~@q R  Bb p('(! ,>     BG G!     g   ,Q"%(  D b j D p     ~@ǎ<HHWH<@~DpǐLJ D   p(  p(' (. ( <   ~Dǎ@Ǟ<HHW8 ȧ~4p  *        |'Q!R D D p(%  ' p(7! ,~488W@8~<p  ( ppPSW(( pp)(^ L*    p(& ppPSW( W @  ~<ǎ8@@WP pR( a!` !WH@~Dq) l~Dǎ@HHWH<@~Dr '$~Dǎ@Ǟ<HHWH<0@~Dr 0 (+R a(a( <r NwX   @   "    t  )r!  )a!"  p(~Dǎ@Ǟ<HHW@~<p.`W .`&0 2  &'  ~<@@WP<@DH~Lp   W |tlǧ" !T  40,'  W     )V  HlW     )v ~LǎHǞDǮ@Ǿ<PPW@~<  pDQ  ,pa` qv  !~<@@W@\.`P$.\(0 2 $̋ . $N$  @@W@48~<p P      Z   & pp)($ ppPSW(2 p(R @  ~<ǎ8Ǟ4@@WP.p0>@DH".L @.M.p.@.DPPW!![rW[PW![2W2!>[ W![ W@[W[W[W2![W2![WC2!,[W2![xW[`+HW +H[4+H+HW!00[ WH .(N0n8@HPX` W`X .(N0n8Ɏ@ɮHPԩة>^觾[![bW [W [,W2![W+PW8/Ȏ"0/¶// 88W8/Ȇ/88W : W8/Ȏ*0// /88WH >0<~@ p pN8(pN<p : pD* `  :.D 0p`aN@p : D*   :$D  .p`aND/NLpNPpNTpNXpN<q,qN8pNH~@ǎ<HHWPT.>( PPWP48<@DH~LN`HNh! N`N`! NhNhNtN`NpNtN|րNpqpN$NpN| N|x((lx! ( 2NtN`  !(hրN| Ntp0qp((q$Nt N|sqp'( (&   ~ JNtpN|p  PNt! N`!Nt xF pNp(PNpNxNp N|NpN|~LǎHǞDǮ@Ǿ<84PPWNp! !Nt! N|WP<@DH~Ly   s  Rq(+p#((p(pspNx~LǎHǞDǮ@Ǿ<PPWA~"t0As3r21~W0@ A#1 ! 1W0+K "AC1!WAC$AhAC%hAC&hACWQWPX%AC1QCGxBBSD"vt ('"AC8('p'"$AC4$X$AhAC!FhAC" QP&#1qA@Aq@O@pO`O #H O @ & O  ! O g `h`O 0#N0O,@O0ȧN(N*N8N O,`O  FF=11=CCAM 0AMAPO,VA@O E@O pO}@NgOd``OO  >  O OOO @NpNN/0,O(0O(ְO(zkg(PO$(VPp: w q&0,O(0O(ְO(@NpNN@ekd,O$( NDA4N,O(0O(NDNְO( ֠ON/0,O(0O(ְO(Jkd(PO$(VP@:0D A&0,O(0O(ְO(NpTkg(O$( wq( ,O(0O(LְO(     / ֠ON/0,O(0O(ְO(Jkd*PO$(VP@<0D A&0,O(0O(ְO(N fpOp\kg,O$( Nwq,N,O(0O(,ְO( ֠OO/0,O(0O(ְO(Jkd*PO$(VP@< D A&0,O(0O(ְO(H{ p   O$( @  6@ , 2 ! . 00  +   Z  pNؐNذNNNW$ )(  W@~<pю     W    ~<@@WP@DH~Lr @D''!'զ )7H)t ~LǎHǞDǮ@PPW2!6[ވWPHx~Lp(,j~LǎHPPWPHx~Lp(,"~LǎHPPW`?8<@DH~Lp.ޠOO:T 2pO pOOOp  :X ސ1 OJp  C@:8 6p  : @$:@$ 1 P@$`^P5%cR:W^XP'86 0":B0C9"5 4r+!+ @$0:  ?05N?:@ 5p  5 @$0:  O( O( O:O( 0 &009 4 @$05p (  5(TO &1O  &0   9( ~LǎHǞDǮ@Ǿ<8`O`W   ?  ?0 6    W6    WX<@DHLPҧ~TsRNW  ( ( D  \ pױ('(R (> )ٸ     ,;   aP/\ +! (() )((  ' p(7! BW  D ,,-V  ~TǎPǞLǮHǾD@<XXW @(#)who.c 6.1 87/11/23 ( `T< Iiamprocess not attached to terminal/dev/who: illegal option -- %c%s doesn't exist or isn't readableEmpty slot. %.8s NAME LINE TIME IDLE PID COMMENTS NAME LINE TIME %8.8s %s %12.12s %s %c %d %c %5d id=%4.4s term=%-3d exit=%-3d %s # users=%d Usage: who [-rbtpludAasHTq] [am i] [utmp_like_file] r run level b boot time t time changes p processes other than getty or users l login processes u useful information d dead processes A accounting information a all (rbtpludA options) s short form of who (no time since last output or pid) H print header T status of tty (+ writable, - not writable, x exclusive open, ? hung) q quick who /dev/%s . old . %2u:%2.2u?+-+--x? /dev/%sr/etc/inittab @(#)ctime.c 6.1 87/11/23 Day Mon 00 00:00:00 1900 SunMonTueWedThuFriSatJanFebMarAprMayJunJulAugSepOctNovDecTZp!|!xPDTPSTW`/Lw/K:/JMFw/ @(#)ctype.c 6.1 87/11/23 ((((( H @(#)getenv.c 6.1 87/11/23 @(#)getpwuid.c 6.1 87/11/23 @(#)getut.c 6.1 87/11/23 /etc/utmp @(#)mon.c 6.1 87/11/23 PROFDIRmon.out @(#)perror.c 6.1 87/11/23 : Unknown error @(#)ttyname.c 6.1 87/11/23 /dev/ @(#)data.c 6.1 87/11/23 SSS Ue( @(#)fgets.c 6.1 87/11/23 @(#)stdiom.h 6.1 87/11/23 @(#)filbuf.c 6.1 87/11/23 @(#)flsbuf.c 6.1 87/11/23 @(#)stdiom.h 6.1 87/11/23 @(#)fopen.c 6.1 87/11/23 @(#)fprintf.c 6.1 87/11/23 @(#)fseek.c 6.1 87/11/23 @(#)ftell.c 6.1 87/11/23 @(#)printf.c 6.1 87/11/23 @(#)setbuf.c 6.1 87/11/23 @(#)sprintf.c 6.1 87/11/23 u @(#)errlst.c 6.1 87/11/23 ,8,@,L,h,x,,,,,,---,-@-L-d-p-|-------.. .0.H.X.p......// /0/@/\/|//.Error 0Not ownerNo such file or directoryNo such processInterrupted system callI/O errorNo such device or addressArg list too longExec format errorBad file numberNo child processesNo more processesNot enough spacePermission deniedBad addressBlock device requiredDevice busyFile existsCross-device linkNo such deviceNot a directoryIs a directoryInvalid argumentFile table overflowToo many open filesNot a typewriterText file busyFile too largeNo space left on deviceIllegal seekRead-only file systemToo many linksBroken pipeArgument out of domainResult too largeNo message of desired typeIdentifier removedChannel number out of rangeLevel 2 not synchronizedLevel 3 haltedLevel 3 resetLink number out of rangeProtocol driver not attachedNo CSI structure availableLevel 2 haltedDeadlock condition if locked @(#)getpwent.c 6.1 87/11/23 rr/etc/passwd @(#)isatty.c 6.1 87/11/23 @(#)malloc.c 6.1 87/11/23 @(#)memccpy.c 6.1 87/11/23 @(#)memchr.c 6.1 87/11/23 @(#)strtol.c 6.1 87/11/23 000000000000000000000123456789abcdef0123456789ABCDEF @(#)findiop.c 6.1 87/11/23 @(#)rew.c 6.1 87/11/23 @(#)dowrite.c 6.1 87/11/23 @(#)print.h 6.1 87/11/23 @(#)ecvt.c 6.1 87/11/23 Fn CAy7Aׄ@È@Y@$ @(#)fwrite.c 6.1 87/11/23 @(#)stdiom.h 6.1 87/11/23 u!o P5`x.textP .dataxxQx@.bss--5` 0  !2$0 x" R[W?DHLPT~Xq@  $H̓# t@($H#l tǧ5R HE< 2U& H #H-(z ,D`-W'' n%# F%! 0Qa1h&! 0Rb1H&# 8Td1(&' 3Xh1@((VN  ,x6@  -F@  !@ Q -T4 .]!@ @  !RL @(0@ H\!HpϞ] H)!*qVRz&" @(0@ H  !0H#H  HpӆV@ HH  @(H : p @ BH4 > @(HH " jf-zH% .pH` ,s)ts-(\{ZHx%:#`@0#||%|  ! @0(.s<@0Hp !qV@0 h H <@0@0j (p}~XǎTǞPǮLǾHDW@~<p####~<@@WPH~L"p Hzp0@( 8!ʋ8#,#"$~80~LǎHPPW@ @(0@ HH8@@W8@0p88W`~<!p @!N D~<``WX8!<XXW8$ 88WP<@D~Hp, LLpǀP1'2בTסXzH@80(L LLp  ~HǎDǞ@Ǯ<PPW :"4 mn2"'W Q!Q Q 0<-( # -,-0 p'-@JF" 4#  m  n 4#  m  n!0F 4# m n$-<-D mn n$  2$21  $-4-8-H-(W@8-P ~<2!0!!1-PA!42A!4"1#x(2"#"2A!42A!4"1#t't'"dt'"drt'"d\8 d# 2! 0!("d*~<ǎ8@-P@W@!:#:#"0$0 #0*0W8 00  0 B!41 -RA!*P%00(# %09(# $@ <^2 00  0 B!4188Wp[B@8~0Qa1t&! 0Rb1T&# 8Td14&' 3Xh1 ހ-x'~@ǎ<hhW@ -x!02 $ -p@@W8 -x-p!02 $ 88W@~<pf O 0r~<@@WX?@DHLP~Tp-r-b 0-p$- -8 --p t @8@8p@@-p q-  ( ^R ! 01'q2! 'q/ !' :Gq21304!:'q.,/  H-- -P-q9(9#0@@5601 0- -)~TǎPǞLǮHǾD@XXWH@~DpЈ pp~ "P  !~Dǎ@HHW!21!0W! W2!10B!0 W2!@4(ARQ!P4AQW!120Wh@~Dp >x $|     qHpH.z ..JD.X Ndzz<\  (pZz$.<H  C q+~Dǎ@WX?@DHLP~Tr8     *8$  ' p(7! ` ?  ~TǎPǞLǮHǾD@XXWH@~Dp W & !   D 6ހ(  @  8(  ! p!(!7  R   .   W    ~Dǎ@HHW8 ȧ~4p(.q8(~488W@8~<pp ~W  < r   x ~<ǎ8@@W8 ȧ~4p T g "Q%(   ~488WH<΀ ~@q R  Bb p('(! ,>     BG G!     g   ,Q"%(  D b j D p     ~@ǎ<HHWH<@~DpǐLJ D   p(  p(' (. ( 4   ~Dǎ@Ǟ<HHW8 ȧ~4p  *        |'Q!R D D p(%  ' p(7! ,~488W@8~<p  ( ppP@HW(( pp0(^ D*    p(& ppP@HW( W @  ~<ǎ8@@WP pR( a!` !WH@~Dq)$ l~Dǎ@HHWH<@~Dr '$~Dǎ@Ǟ<HHWH<0@~Dr 0 (+R a(a( <r NwX   @   "    t  )r!  )a!"P  p(~Dǎ@Ǟ<HHW@~<p.`W .`&0 2  &'  ~<@@W`DHLPTX~\q  *"(  D    p(   Ǘ  8 І ρ  ' p(7! (0 @ p 0 *> ~ (~\ǎXǞTǮPǾLHD``WX<@DHLPҧ~TsRNW  ( ( D Z \ pױ('(R (> )     ,   aP/\ +! (() )(( F  ' p(7! BW  D ,,-  4 ~TǎPǞLǮHǾD@<XXW[W![W. >$.;0x[nW2!>[ LW[ 6W![ W[W[W2![W2![WC2!,[W2![W[W [\W!00[2WH .(N0n8@HPX` W`X .(N0n8Ɏ@ɮHPԩة>^觾[![W [W [TW[:. W2![WW8"TȎ""X"@ʶ"T"T (88W8"TȆ"T88W : W8"TȎ*"X"H"T "T88WH .0<~@(p p>8(p><p : pD*   :.D 0p`a>@p : D*   :$D  .p`a>D"P>Lp>Pp>Tp>Xp><q,q>8p>H~@ǎ<HHWPT.>P PPWP48<@DH~L>`H>h! >`>`! >h>h>t>`>p>t>|ր>pqpN$>p>| >|x((lx! ( 2>t>`  !(hր>|>tp0qp((q$>t >|sqp'( (&t   V ">tp>|p  P>t! >`!>t xF p>p(P>p>x>p >|>p>|~LǎHǞDǮ@Ǿ<84PPW>p! !>t! >|WP<@DH~Ly   s  Rq(+p#((p(psp>x~LǎHǞDǮ@Ǿ<PPWA~"t0As3r21~W0@ A#1 ! 1W0+K "AC1!WAC$AhAC%hAC&hACWQWPX%AC1QCGxBBSD"vt ('"AC8('p'"$AC4$X$AhAC!FhAC">>>>Ǽ? @P PP?$PpRU(P?$%py}kg,P?$(VP p:w]ѡ[q" ,?(0?(ְ?(Fp?@c(stdxX܋ `? d`? P?$([P  ,?(0?(<ְ?(`? d`? (P?$[PQ̡P! ! ,?(0?(ְ?(`? d`? 'Π- 8ы0):@0CAMр ѡ(P?$[P Q фP р}-!ш},?(0?(ְ?(`? d`? / q#0фыh`? d`? / q#@фы4?>?`? csd(u$+\-` d#h.l*x0Āelh%ox0XeEfgGn9ld`?  ?d`? @ ? ? "  !?`d`? }>; -!10>@@ V 8@  /  +!10>"  /  !10> @ /00 0ѡ $@ZPECѡMѡ p? }? u?? ^d`? } pq 5#"0ѡP n b V J@ ? 6@ *?d`? ? ? d`? ? @     0 9: @ ? ?z ?WC0#0_D0#@_D0#0d`? - ?p&@ 4??  a@ '? -?? pX Oo620>x 0 >>"X>  ??   @ / & ? g `h`? ? 0!#и>0?,@?0ȧN(> >8?0 - >>D  5  + >> >>g ю 0ѡaP? P .aP6 QaP P?P? ׶`?p?8g> 06P?,QPU):RECAaFSRQaVrgaga?,- +aea E`>rvp??? #2#: @ / & ? g `h`? ? 0<#0?,@?0ȧN(> T>8?0`? P?,/Q)-0!->! >B +>! >   >! >E00@qA0- '1qA@Aq@ `  .'qF<Ad &$ ? ?A@> QP&#1qA@Aq@?@p?`? #H ? @ & ?  ! ? g `h`? 0#>0?,@?0ȧN(>*>8> ?,`?  FF=11=CCAM 0AMAP?,VA@? E@? p?}@>g?d``??  >  ? ??? @>p>>/#,?(0?(ְ?(zkg(P?$(VPp: w q&#,?(0?(ְ?(@>p>>@ekd,?$( >DA4>,?(0?(>D>ְ?( ֠?>/#,?(0?(ְ?(Jkd(P?$(VP@:0D A&#,?(0?(ְ?(>pTkg(?$( wq( ,?(0?(Lְ?(     / ֠?>/#,?(0?(ְ?(Jkd*P?$(VP@<0D A&#,?(0?(ְ?(> fp?p\kg,?$( >wq,>,?(0?(,ְ?( ֠??/#,?(0?(ְ?(Jkd*P?$(VP@< D A&#,?(0?(ְ?(H{ p   ?$( @  @ , 2 ! . 00  +   :  p>ؐ>ذ>>>W( 8(  W@~<pn  r   W    ~<@@WP@DH~Lr @D''!'Ն )7)L ~LǎHǞDǮ@PPW2!6[`WPHx~Lp(,j~LǎHPPWPHx~Lp(,"~LǎHPPW`?8<@DH~Lp.ޠ??:T 2p? p???p  :X ސ% ?Jp  C@:8 6p  : @$:@$ 1 P@$`^P5%cR:W^XP'86 0":B0C9"5 4r+!+ @$0:  ?05N?:@ 5p  5 @$0:  ?( ?( ?:?( 0 &009 4 @$05p (  5(T? &1?  &0   9( ~LǎHǞDǮ@Ǿ<8`?`W   ?  ?0 6    W6    W @(#)write.c 6.1 87/11/23 w %s /dev/ 2345678901/dev/Usage: write user [terminal] Usage: write user [terminal] I cannot determine your terminal name. No reply possible. /dev/???/dev/%s is logged on more than one place. You are connected to "%s". Other locations are: %s is logged on more than one place. You are connected to "%s". Other locations are: Permission denied. %s is not at "%s". Permission denied. %s is not logged on. Cannot determine who you are. Warning: You have your terminal set to "mesg -n". No reply possible.  Message from %s (%s) [ %s ] ... Can no longer write to %s ! -cshUnable to fork. Try again later. /bin/shTimeout trying to open %s's line(%s). @(#)ctime.c 6.1 87/11/23 Day Mon 00 00:00:00 1900 SunMonTueWedThuFriSatJanFebMarAprMayJunJulAugSepOctNovDecTZpPDTPSTW`/Lw/K:/JMFw/ @(#)getenv.c 6.1 87/11/23 @(#)getpwuid.c 6.1 87/11/23 @(#)getut.c 6.1 87/11/23 /etc/utmp @(#)mon.c 6.1 87/11/23 PROFDIRmon.out @(#)perror.c 6.1 87/11/23 : Unknown error @(#)ttyname.c 6.1 87/11/23 /dev/ @(#)data.c 6.1 87/11/23 @X@X@`BPRX( @(#)fgets.c 6.1 87/11/23 @(#)stdiom.h 6.1 87/11/23 @(#)filbuf.c 6.1 87/11/23 @(#)flsbuf.c 6.1 87/11/23 @(#)stdiom.h 6.1 87/11/23 @(#)fopen.c 6.1 87/11/23 @(#)fprintf.c 6.1 87/11/23 @(#)fputs.c 6.1 87/11/23 @(#)stdiom.h 6.1 87/11/23 @(#)fwrite.c 6.1 87/11/23 @(#)stdiom.h 6.1 87/11/23 b` @(#)errlst.c 6.1 87/11/23 $8H\p   , @ T h x       !!,!@!\!x!!!!!".Error 0Not ownerNo such file or directoryNo such processInterrupted system callI/O errorNo such device or addressArg list too longExec format errorBad file numberNo child processesNo more processesNot enough spacePermission deniedBad addressBlock device requiredDevice busyFile existsCross-device linkNo such deviceNot a directoryIs a directoryInvalid argumentFile table overflowToo many open filesNot a typewriterText file busyFile too largeNo space left on deviceIllegal seekRead-only file systemToo many linksBroken pipeArgument out of domainResult too largeNo message of desired typeIdentifier removedChannel number out of rangeLevel 2 not synchronizedLevel 3 haltedLevel 3 resetLink number out of rangeProtocol driver not attachedNo CSI structure availableLevel 2 haltedDeadlock condition if locked @(#)getpwent.c 6.1 87/11/23 rr/etc/passwd @(#)isatty.c 6.1 87/11/23 @(#)malloc.c 6.1 87/11/23 @(#)memccpy.c 6.1 87/11/23 @(#)memchr.c 6.1 87/11/23 @(#)strtol.c 6.1 87/11/23 000000000000000000000123456789abcdef0123456789ABCDEF @(#)findiop.c 6.1 87/11/23 @(#)rew.c 6.1 87/11/23 @(#)dowrite.c 6.1 87/11/23 @(#)print.h 6.1 87/11/23 @(#)ctype.c 6.1 87/11/23 ((((( H @(#)ecvt.c 6.1 87/11/23 Fn CAy7Aׄ@È@Y@$: #ident " @(#)dirname.sh 6.1 87/11/23 " expr \ ${1-.}'/' : '\(/\)[^/]*/$' \ \| ${1-.}'/' : '\(.*[^/]\)//*[^/][^/]*//*$' \ \| . : # " @(#)false.sh 6.1 87/11/23 " exit 255 u!o b#p@ P.textb .dataPP#pcP@.bss&&@  0  !2$0 P"B[WpDHLPTX~\q|&F@<<??> ^ ޠ /& 2@ (&R@H @&>χ@ @ @HF8 ,@ (%@H @%@ @H @@@$%T @"0t -1q$ @"qP@e 0( 9(0  r @: @7V@@>2<$@8Wzz z ,$ @8zz"Z@,,$@( @) @* @+@ @: <p_.pܓ62†pF x.p,"0@ $!71(P@%  9P@  *9,5@@L5l`l 09t 095,n@ ;V 5@;B 4f8nP@eZ?P@ @s @s @; :@@ @b&@ @Q&aJ @%>Г4(6X 4 @ @P ~@(P@@ ( D% @ Г *:@!@p з!@ Г@ /  @ @!@p p!@pTC.`7`4`Z@!@p !Pް@^l=@ F@p8.l L4B^lQ^lpޠf*,4FT&*\%(p!q@P@(p! >P477@  d1~\ǎXǞTǮPǾLHDppWH<x@t~D)B h<q Jj JP( fp#pp( q :q !q!:!@ J0" p\J~ JO(pp?" $~Dǎ@Ǟ<W@ ~<q-& ȓ.~<@@WH<@~Dp&q'(ހ'((p&ހ'!0 2#$F)\) 6*L0\#@4& 'q !"(r'q'R 0 ! !!1 2~Dǎ@Ǟ<HHW@8~<!07#002#p""W"0v#0b2#p""W"pb(p#`!!002 7 qs/" ~<ǎ8@@Wh@~DpŽ nx0 T|   :X0 qHpH.z J`Jh(X(J(X1؍ Ndzz<\  (pZz.(<H 0.  /q.@~Dǎ@W`~ @1P $ 18  /T. P$ /0 r( $/H$2(!02 $ ($!.ܶ((``W8 ȧ~4p)zzppW')z"z!(t)z!z!&z!' zH(':(' ,(' (' (  (=~488WH@~Dp(Wz.z z"  ," p~Dǎ@HHWh<~@pnDW'' \%# <%! 0Qa1X0Rb1@8Td1(&' 3Xh1 f +p   <DHDD' !+b!+܋!+D $-$ `(^D>0Qa1t&! 0Rb1T&# 8Td14&' 3Xh1 ހ('*d~@ǎ<hhW@ *(!02 $ (@@W8 )((!02 $ 88W@~<p O  r~<@@W PW 0$@Z@9` 0!@W 0)h@ ~p)ހ 4$! "#(! "'qA1 !ސ)ޠ P X@)h0)iss1pp@)@)0)ss1pp!@)8()0 `@ xsqw)hrtww)A1r!pp0E,  2!0001~ǎǞǮ W( ا0  ,ا@ ~A!@)- ,B!A@ @/@-Xp,с, qA!0ް @Fppr$"-Xp$ρ-Xρш-Xpϑљ-Xѡ-Xpp-Xp!!sϑ-8s-8ϑs-8ρtF-8@a ,@,p -8 qA! , -B!A@ @0  ,@,trA!   BAD,!A@~ǎǞǮ Ǿ(WP?8<@D0H~Lp)qBp( ߗ)FBc!q 'q1 @)p) q! B'pް,)X Z 9 . K;c!1A&qrp)qp@)ހ)Z 4p !1&.9ZqF{)X)Y)X)Y~LǎHǞDǮ@Ǿ<8P)XPWp[B8ȧTT.X88W0<@DH~Lq ( ހ 0 /  .P P": Pp W d $PP!9TX"@B Pr!4CA@ @P!Hq%( 6P)   P~LǎHǞDǮ@Ǿ<W0~s@1tC@ p:G @ /$A B!  1~W@8~ PPW0@ A#1 ! 1WX?@DHLP~Tp=r=b 0=<p$= = ==p  DDpD=p q=  ( ^0j 8! 01'q2! 'q/^ !' :Gq21304!:'q.@,/ @== =P=q9(9#0@@5601 0= =)~TǎPǞLǮHǾD@XXWH@~D P pp pph \l"L  0h! ~Dǎ@HHWP<@DH~Lp (( xb>($zrp* pJ ~LǎHǞDǮ@Ǿ<PPW8>(#88W!1021!0W !  W!2! W!21!0W! W2!10B!0 W2!@4(ARQ!P4AQW!120W0A~@ $ pA '"' H 1pA '"(  p+r ' p-' 120 $ x X pA '"' @ '"$ Ћ$pA '""  r  @ 08#pA'"p ' #px' pX' 2pA '"$ Ћ$pA '""   ހA1pxwwp@pxwtp Ћ$ހApxwrp p@4 ~ǎǞWX?@DHLP~Tr8     *8  ' p7! ` ?  ~TǎPǞLǮHǾD@XXWH@~Dp W & !   D 6ހ  @  (  ! p!!7 R   .   W    ~Dǎ@HHW8 ȧ~4p.q(~488W@8~<pp ~W  < r  P H ~<ǎ8@@W8 ȧ~4p T g "Q%(   ~488WH<΀ ~@q R  Bb p'(! ,>     BG G!    g   ,Q"%(  D b j D p     ~@ǎ<HHWH<@~DpǐLJ D   p  p' (. (l   ~Dǎ@Ǟ<HHW8 ȧ~4p  *        |'Q!R D D p%  ' p7! ,~488W@8~<p  ( ppPDW( pp^*    p& ppPDȧWW @  ~<ǎ8@@WP pR a!` !WH@~Dq) l~Dǎ@HHWH<@~Dr '$~Dǎ@Ǟ<HHWH<0@~Dr 0 (+R a(a( <r NwX   @   "     t  )r!  )a!"  p~Dǎ@Ǟ<HHWP<@DH~Lp   W |tlǧ" ! t  40,'  W     ) V  HW     )  ~LǎHǞDǮ@Ǿ<PPWX<@DHLPҧ~TsRNW  ( ( D  \ pױ'(R (> )      ,   aP/\ +! (() )((~  ' p7! BW  D ,,-  ~TǎPǞLǮHǾD@<XXW`<@D~Hp<8J r>\ T.NÞT T T.N#p>P >X(' 'q>\>2!!    !T T.N ,>\|>P~HǎDǞ@Ǯ<``W>\>\W@\.`P.\(0 2  . &  @@W@~<p     W    ~<@@W@48~<p P  T    Z   & pp$ ppPDȧW2 pZ @  ~<ǎ8Ǟ4@@WP.p0>@DH".L @.M.p.@8.DPPWXDHL~Ppn.( 7 pT |r  T~PǎLǞHǮDXXW ! ^ 0(,01  !W [W2![׸W=[לW[׈W![jW. >$.;0P[>W. >$! 1.;[W!;0P[W[B2!>[ ִW[ ֞W![ ~W[W2!6[XW!%[FW2![,W"[W2![W[WC2!,[W2![ոW[ՠW [tW.[PW![6W!00[WH .(N0n8@HPX` W`X .(N0n8Ɏ@ɮHPԩة>^觾[![rW [W<[@W [,W[. W2![WP48<@DH~L>`H>h! >`>`! >h>h>t>`>p>t>|ր>pqpN$>p>| >|x((lx! ( 2>t>`  !(hր>| >tp0qp((q$>t >|sqp'( (&   ~ J>tp>|p  P>t! >`!>t xF p>p(P>p>x>p >|>p>|~LǎHǞDǮ@Ǿ<84PPW>p! !>t! >|WP<@DH~Ly   s  Rq(+p#((p(psp>x~LǎHǞDǮ@Ǿ<PPWA~"t0As3r21~W0+K "AC1!WAC$AhAC%hAC&hACWQWPX%AC1QCGxBBSD"vt ('"AC8('p'"$AC4$X$AhAC!FhAC">>>>Ǽ? @P PP?$PpRUP?$%py}kg,P?$(VP p:w]ѡ[q" ,?(0?(ְ?(Fp?@c(stdxX܋ `? d`? P?$([P  ,?(0?(lְ?(`? d`? (P?$[PQ̡P! ! ,?(0?(ְ?(`? d`? 'Π- 8ы0):@0CAMр ѡ(P?$[P Q фP р}-!ш},?(0?( ְ?(`? d`? / q фыh`? d`? / q0фы4?>?`? csd(u$+\-` d#h.l*x0Āelh%ox0XeEfgGn9ld`?  ?d`? @ ? ? "  !?`d`? }>; -!10>@@ V 8@  /  +!10>"  /  !10> @ /00 0ѡ $@ZPECѡMѡ p? }? u?? ^d`? } pq 5#"0ѡP n b V J@ ? 6@ *?d`? ? ? d`? ? @     0 9: @ ? ?z ?WC0 _D00_D0 d`? - ?p&@ 4??  a@ '? -?? pX Oo620>x 0 >>"X>  ??   @ / & ? g `h`? ? 0!#и>0?,@?0ȧN(> ,>8?0 - >>D  5  + >> >>g ю 0ѡaP? P .aP6 QaP P?P? ׶`?p?8g> 06P?,QPU):RECAaFSRQaVrgaga?,- +aea E`>rvp??? #2#: @ / & ? g `h`? ? 0<#0?,@?0ȧN(> l>8?0`? P?,/Q)-0!->! >B +>! >   >! >E00@qA0- '1qA@Aq@ `  .'qF<Ad &$ ? ?A@> QP&#1qA@Aq@?@p?`? #H ? @ & ?  ! ? g `h`? 0#>0?,@?0ȧN(>B>8> ?,`?  FF=11=CCAM 0AMAP?,VA@? E@? p?}@>g?d``??  >  ? ??? @>p>>/,?(0?(>ְ?(zkg(P?$(VPp: w q&,?(0?(ְ?(@>p>>@ekd,?$( >DA4>,?(0?(>t>ְ?( ֠?>/ ,?(0?(.ְ?(Jkd(P?$(VP@:0D A& ,?(0?(ְ?(>pTkg(?$( wq( ,?(0?(|ְ?(     / ֠?>/ ,?(0?((ְ?(Jkd*P?$(VP@<0D A& ,?(0?(ְ?(> fp?p\kg,?$( >wq,>,?(0?(\ְ?( ֠??/,?(0?(ְ?(Jkd*P?$(VP@< D A&,?(0?(ְ?(H{ p   ?$( @  ֆ@ , 2 ! . 00  +   Ӫ  p>ؐ>ذ>>>W (  W`DHLPTX~\q  *"(  D ӄ  p ҆  Ǘ  86І ρ  ' p7! Ԡ0 @  0 *> > (~\ǎXǞTǮPǾLHD``WP@DH~Lr @D''!' )7x) ~LǎHǞDǮ@PPWPHx~Lp(,j~LǎHPPWPHx~Lp(,"~LǎHPPW`?8<@DH~Lp.ޠ??:T 2p? p???p  :X ސ ?Jp  C@:8 6p  : @$:@$ 1 P@$`^P5%cR:W^XP'86 0":B0C9"5 4r+!+ @$0:  ?05N?:@ 5p  5 @$0:  ?( ?( ?:?( 0 &009 4 @$05p (  5(T? &1?  &0   9( ~LǎHǞDǮ@Ǿ<8`?`W   ?  ?0 6    W6    W @(#)login.c 6.1 87/11/23 r+/dev/tty??login: pri=Password:Unable to change directory to "%s" /dev/No utmp entry. You must exec "login" from the lowest level "sh". /etc/wtmpNo Root Directory Subsystem root: %s /bin/loginlogin/etc/loginloginNo /bin/login or /etc/login on root Bad group id. Bad user id. Your password has expired. Choose a new one /bin/passwdCannot execute /bin/passwd PATH=:/bin:/usr/bin:/etc/bin/shL%d=%sSHELL=PATH=No shell rr/etc/dialups/etc/d_passwdDialup Password:/bin/shDialup Password:Login incorrect <<<<<<<<$4,/dev/sysconsystty-SHELL=HOME=LOGNAME=MAIL=/usr/spool/mail/TERM=PnopePATH=:/bin:/usr/bin/etc/utmp @(#)a64l.c 6.1 87/11/23 @(#)crypt.c 6.1 87/11/23 :2*" <4,$ >6.&@80( 91)! ;3+# =5-% ?7/'(08@ '/7?&.6>%- 5=$, 4<#+ 3;"* 2:!) 1991)! :2*" ;3+# <4,$?7/'>6.&=5-%      )4%/7(3-!0,1'8"5.*2$                                                                                                                                      @(#)execvp.c 6.1 87/11/23 ,shPATH:/bin:/usr/bin/bin/sh @(#)getenv.c 6.1 87/11/23 @(#)getpwent.c 6.1 87/11/23 rr/etc/passwd @(#)getpwnam.c 6.1 87/11/23 @(#)isatty.c 6.1 87/11/23 @(#)memchr.c 6.1 87/11/23 @(#)mon.c 6.1 87/11/23 PROFDIRmon.out @(#)perror.c 6.1 87/11/23 : Unknown error @(#)sleep.c 6.1 87/11/23 @(#)strtol.c 6.1 87/11/23 @(#)data.c 6.1 87/11/23 DDDFV @(#)fgets.c 6.1 87/11/23 @(#)stdiom.h 6.1 87/11/23 @(#)filbuf.c 6.1 87/11/23 @(#)flsbuf.c 6.1 87/11/23 @(#)stdiom.h 6.1 87/11/23 @(#)fopen.c 6.1 87/11/23 @(#)fseek.c 6.1 87/11/23 @(#)fwrite.c 6.1 87/11/23 @(#)stdiom.h 6.1 87/11/23 @(#)getpass.c 6.1 87/11/23 r/dev/tty @(#)printf.c 6.1 87/11/23 @(#)rew.c 6.1 87/11/23 @(#)setbuf.c 6.1 87/11/23 @(#)sprintf.c 6.1 87/11/23 @(#)system.c 6.1 87/11/23 -csh/bin/sh @(#)ungetc.c 6.1 87/11/23 f @(#)ctype.c 6.1 87/11/23 ((((( H @(#)errlst.c 6.1 87/11/23 (0<Xh0<T`l 8H`p| 0Ll.Error 0Not ownerNo such file or directoryNo such processInterrupted system callI/O errorNo such device or addressArg list too longExec format errorBad file numberNo child processesNo more processesNot enough spacePermission deniedBad addressBlock device requiredDevice busyFile existsCross-device linkNo such deviceNot a directoryIs a directoryInvalid argumentFile table overflowToo many open filesNot a typewriterText file busyFile too largeNo space left on deviceIllegal seekRead-only file systemToo many linksBroken pipeArgument out of domainResult too largeNo message of desired typeIdentifier removedChannel number out of rangeLevel 2 not synchronizedLevel 3 haltedLevel 3 resetLink number out of rangeProtocol driver not attachedNo CSI structure availableLevel 2 haltedDeadlock condition if locked @(#)malloc.c 6.1 87/11/23 @(#)memccpy.c 6.1 87/11/23 000000000000000000000123456789abcdef0123456789ABCDEF @(#)findiop.c 6.1 87/11/23 @(#)fputs.c 6.1 87/11/23 @(#)stdiom.h 6.1 87/11/23 @(#)dowrite.c 6.1 87/11/23 @(#)print.h 6.1 87/11/23 @(#)ecvt.c 6.1 87/11/23 Fn CAy7Aׄ@È@Y@$u!o P8pL.textP8 .datapP@.bss'P'PL 0  !2$0 " [WP<@DH~L p0$  -   Ǘ *'  '  -,-0`   xP(+xP ضP$жP$P,P "  n/ (H LJ   +\`\~LǎHǞDǮ@Ǿ<PPW@ &@@W888WH <@~D VPr* (* x &'H tf} N8x &P( X 0)~Dǎ@Ǟ<HHW 0/# W 0'@~p'ހ$! "#(! "'qA1 !ސ'ޠ X@'0'ss1pp@'@'0'ss1pp!@'8()0@sqw'rtww'A1r!pp0E* (2!0001~ǎǞǮ W( ا0  +@0~A!@'+X +8B!A@ @/@+p*с+8 qA!0ްX@Fppr$"+p$ρ+ρш+pϑљ+ѡ+pp+p!!sϑ+xs+xϑs+xρtF+x@a +8@+pX+x qA! + +XB!A@ @0  +@+8trA!  pBAD+!A@~ǎǞǮ Ǿ(WP?8<@D0H~Lp'PqBp( ߗ'PFBc!q 'q1 @'Pp'P q! B'pް+' Z 9 . K;c!1A&qrp'Pqp@'Pހ' 4p !1&.9ZqF{''''~LǎHǞDǮ@Ǿ<8P'PWp[B8Ȏ"Z!88W8ȆT88W 1 W8Ȏ* 88WH +ȧ@~Dp :p;Г<p;:" p$n;;;:pހ;q,p;~Dǎ@HHW@8~<pp~<ǎ8@@W8 Ȏ"  P88W8 Ȇ 88W : W8 Ȏ*6   88WH =p<~@`p pMx(pM|p : pD*X  :.D 0p`aMp : D*  N  :<D  .p`aMMpMpMpMpM|q,qMxpM~@ǎ<HHWH@~D֋p( H~Dǎ@HHWPT.> PPWP48<@DH~LMHM! MM! MMMMMMMրMqpN$MM Mx((lx! ( 2MM  !(hրMhMp0qp((q$M Msqp'( (&    MpMp  PM! M!M xF pM(PMMM MMM~LǎHǞDǮ@Ǿ<84PPWM! !M! MWP<@DH~Ly   s  Rq(+p#((p(pspM~LǎHǞDǮ@Ǿ<PPW0@ A#1 ! 1W0+K "AC1!WAC$AhAC%hAC&hACWQWPX%AC1QCGxBBSD"vt ('"AC8('p'"$AC4$X$AhAC!FhAC"     BG G!     g   ,Q"%(  D b j D p     ~@ǎ<HHWH<@~DpǐLJ D   pp  pp' (. (    ~Dǎ@Ǟ<HHW8 ȧ~4p  *        |'Q!R D D pp%  ' pp7! ,~488W@8~<p  ( ppPR0Wp( ppxp^l*    pp& ppPR0WpֆW @  ~<ǎ8@@WP pRp a!` !WH@~Dqd l~Dǎ@HHWH<@~Dr '$~Dǎ@Ǟ<HHWH<0@~Dr 0 (+R a(a( <r NwX   @   "   Z t  )r!  )a!"  pp~Dǎ@Ǟ<HHW@~<p.`W .`&0 2  &' V  ~<@@W`<@D~HpZ r NL T.N~ÞT T T.NXpN@ NH(' 'qNL>B!!   ̋ !T T.Np <NLLlN@~HǎDǞ@Ǯ<``WNLNLW@~<p~     W    ~<@@W@48~<p P D    Z   & ppxp$ ppPR0Wp2 pp⺆ @  ~<ǎ8Ǟ4@@W [dW[PW![2W. >$.;0[W/[W[W[W2!6[W!%[W2![W2![WC2!,[W2![XW[@W [W.[W![W!00[WH .(N0n8@HPX` W`X .(N0n8Ɏ@ɮHPԩة>^觾[2![WW0~@)!$"$ d @)!$"( !@+B $ @-$ 1@)!$"$ D 0!*@0A$p)AGDD@0 ~W@8~~4ǎ088WA~"t0As3r21~W2!@4(ARQ!P4AQWp@D~H:p,*pp / $P npD^fzzz z$X,* *q L $| $! z~HǎDǞ@ppWpN`NhNpNxN|ǼO @P PPOPpRUpPO%py}kg,PO(VP p:w]ѡ[q" ,O0OְOFpO c(stdxX܋ `Od`OPO([P  ,O0OlְO`Od`O(PO[PQ̡P! ! ,O0OְO`Od`O'Π- 8ы0):@0CAMр ѡ(PO[P Q фP р}-!ш},O0O ְO`Od`O/ q$фыh`Od`O/ q$фы4NNԶN`Ocsd(u$+\-` d#h.l*x0Āelh%ox0XeEfgGn9ld`O Nd`O@ N N"  !N`d`O }N؍; -!10N@@ V 8@  /  +!10Nԋ"  /  !10N @ /00 0ѡ $@ZPECѡMѡ pN }NuNN ^d`O } pq 5#"0ѡP n b V J@ N6@ *Nd`ON Nd`ON@     0 9: @ NNz NWC0$_D0$_D0$d`O - Np&@ 4NN  a@ 'N-NN pX Oo620Nx 0 N؊Nً"XNً  NN   @ / & Ng `h`O N0!#иN0O @OȧN(N ,N8O - NNԋD  5  + NNԋ NNg ю 0ѡaPNP .aP6 QaP PNPN ׶`NpOgN 06PO QPU):RECAaFSRQaVrgagaO - +aea E`NrvpNNN #2#: @ / & Ng `h`O N0<#0O @OȧN(N lN8O`NPO /Q)-0!-N! NԋB +N! Nԋ   N! NE00@qA0- '1qA@Aq@ `  .'qF<Ad &$ N NA@> QP&#1qA@Aq@O pN`N#H N@ & N ! Ng `h`O0#N0O @OȧN(NBN8N O `N FF=11=CCAM 0AMAPO VA@NE@NpN}@NgNd``NN  >  N NNN @NpNN/$`,O0O>ְOzkg(PO(VPp: w q&$`,O0OְO@NpNN@ekd,O( NDA4N,O0ONtNְO ֠NN/$t,O0O.ְOJkd(PO(VP@:0D A&$t,O0OְONpTkg(O( wq( ,O0O|ְO     / ֠NN/$t,O0O(ְOJkd*PO(VP@<0D A&$t,O0OְON fpNp\kg,O( Nwq,N,O0O\ְO ֠NN/$`,O0OְOJkd*PO(VP@< D A&$`,O0OְOH{ p   O( @  @ , 2 ! . 00  +    pN`ؐNhذNpNxN|Wp (  W`DHLPTX~\q  *"(  D   pp   Ǘ  8І ρ  ' pp7! 0 @ 8 0 *> F ( ~\ǎXǞTǮPǾLHD``WP@DH~Lr @D''!' )7)˼ ~LǎHǞDǮ@PPWPHx~Lp(,j~LǎHPPWPHx~Lp(,"~LǎHPPW`?8<@DH~Lp.ޠOO:T 2pO pOOOp  :X ސ%h OJp  C@:8 6p  : @$:@$ 1 P@$`^P5%cR:W^XP'86 0":B0C9"5 4r+!+ @$0:  ?05N?:@ 5p  5 @$0:  O( O( O:O( 0 &009 4 @$05p (  5(TO &1O  &0   9( ~LǎHǞDǮ@Ǿ<8`O`W   ?  ?0 6    W6    Wh@~Dp^ >xV $|    %p qHpH.z O%άOJTOXԍ Ndzz<\  (pZzO<H  C tq+߼~Dǎ@WX<@DHLPҧ~TsRNW  ( ( D " \ pױp'(R (> )     ,   aP/\ +! (() )((  ' pp7! BW  D ,,->  ~TǎPǞLǮHǾD@<XXW![ W![ߺW @(#)newgrp.c 6.1 87/11/23 -/bin/sh%s Password: SorryPermission deniedUnknown groupYou have no shellHOME=LOGNAME=PATH=:/bin:/usr/binPATH=:/bin:/etc:/usr/bin @(#)crypt.c 6.1 87/11/23 :2*" <4,$ >6.&@80( 91)! ;3+# =5-% ?7/'(08@ '/7?&.6>%- 5=$, 4<#+ 3;"* 2:!) 1991)! :2*" ;3+# <4,$?7/'>6.&=5-%      )4%/7(3-!0,1'8"5.*2$                                                                                                                                      @(#)getgrent.c 6.1 87/11/23 rr/etc/group @(#)getgrnam.c 6.1 87/11/23 @(#)getpwent.c 6.1 87/11/23 rr/etc/passwd @(#)getpwnam.c 6.1 87/11/23 @(#)isatty.c 6.1 87/11/23 @(#)malloc.c 6.1 87/11/23 @(#)memchr.c 6.1 87/11/23 @(#)mon.c 6.1 87/11/23 PROFDIRmon.out @(#)perror.c 6.1 87/11/23 : Unknown error @(#)strtol.c 6.1 87/11/23 @(#)cuserid.c 6.1 87/11/23 @(#)data.c 6.1 87/11/23 R@R@RHT8d@p @(#)fgets.c 6.1 87/11/23 @(#)stdiom.h 6.1 87/11/23 @(#)filbuf.c 6.1 87/11/23 @(#)flsbuf.c 6.1 87/11/23 @(#)stdiom.h 6.1 87/11/23 @(#)fopen.c 6.1 87/11/23 @(#)fprintf.c 6.1 87/11/23 @(#)getpass.c 6.1 87/11/23 r/dev/tty @(#)rew.c 6.1 87/11/23 @(#)setbuf.c 6.1 87/11/23 tH @(#)atoi.c 6.1 87/11/23 @(#)ctype.c 6.1 87/11/23 ((((( H @(#)errlst.c 6.1 87/11/23    $ @ P h t      !!!$!<!H!T!h!x!!!!!!!"" "0"H"X"d"|"""""###4#T#p#.Error 0Not ownerNo such file or directoryNo such processInterrupted system callI/O errorNo such device or addressArg list too longExec format errorBad file numberNo child processesNo more processesNot enough spacePermission deniedBad addressBlock device requiredDevice busyFile existsCross-device linkNo such deviceNot a directoryIs a directoryInvalid argumentFile table overflowToo many open filesNot a typewriterText file busyFile too largeNo space left on deviceIllegal seekRead-only file systemToo many linksBroken pipeArgument out of domainResult too largeNo message of desired typeIdentifier removedChannel number out of rangeLevel 2 not synchronizedLevel 3 haltedLevel 3 resetLink number out of rangeProtocol driver not attachedNo CSI structure availableLevel 2 haltedDeadlock condition if locked @(#)getenv.c 6.1 87/11/23 @(#)getlogin.c 6.1 87/11/23 /etc/utmp @(#)getpwuid.c 6.1 87/11/23 @(#)memccpy.c 6.1 87/11/23 @(#)ttyslot.c 6.1 87/11/23 /etc/utmp 000000000000000000000123456789abcdef0123456789ABCDEF @(#)findiop.c 6.1 87/11/23 @(#)fputs.c 6.1 87/11/23 @(#)stdiom.h 6.1 87/11/23 @(#)dowrite.c 6.1 87/11/23 @(#)print.h 6.1 87/11/23 @(#)ecvt.c 6.1 87/11/23 Fn CAy7Aׄ@È@Y@$ @(#)ttyname.c 6.1 87/11/23 /dev/ @(#)fwrite.c 6.1 87/11/23 @(#)stdiom.h 6.1 87/11/23 u!p S%@9.textS .data%@S@.bss999$@ 0  !2$0 "[WhDHLPT X~\P "@t&t)&zǑP((ߓ*rP(pp$&P(p0&f P0,P08P(P0 P(P@"@%|^ P0PP(e ?PH PPs PXsPH* :P`PH P`bdp4PX PHQ&%H$̋PX PP pt$$f$ PhPhp ȓ$4p0 Ph<$h 0PhpnްAKDC@H !JްAKDC@H !$@ !  !1A'8+4/0,#Xl#Fp`0PhހP0, -A1AB"Hȓ#N PxPxPhFP P "b"hd(8&zd ?d bds  >bc.@9@Z!1"PhbʶP@'''ۓ' %$! L!nPP((%vp*P(l! P( P@!PP(eNPP &8PXpPPP`pP(p PH dP( P(- p&4$@   B$( 0 &" ؋ $(\  0#" lN< %f"  8 %.~\ǎXǞTǮPǾLHDhhWh8<@D~Hp,Ϟf:0   !'q ϞMx<0   !'q ~f\'q:yAt1C01# ~!M :qf*1q72!0u~HǎDǞ@Ǯ<Ǿ8W 0$@Z@9` 0!@W 09X@~p9xހ $! "#(! "'qA1 !ސ9ޠ( X@9X09Yss1pp@9s@9x09yss1pp!@98()08@Psqw9Xrtww9xA1r!pp0E< h2!0001~ǎǞǮ W( ا0  <ȧ@p~A!@9= <B!A@ @/@=Hp<с< qA!0ް@Fppr$"=Hp$ρ=Hρш=Hpϑљ=Hѡ=Hpp=Hp!!sϑ=(s=(ϑs=(ρtF=(@a <@     BG G!     g   ,Q"%(  D b j D p     ~@ǎ<HHWH<@~DpǐLJ D   p!  p!' (. ( |   ~Dǎ@Ǟ<HHW8 ȧ~4p  *        |'Q!R D D p!%  ' p!7! ,~488W@8~<p  ( ppPPW!؋( pp"!؋^ ,*    p!؋& ppPPW! W @  ~<ǎ8@@WP pR! a!` !WH@~Dq$ l~Dǎ@HHWH<@~Dr '$~Dǎ@Ǟ<HHWH<0@~Dr 0 (+R a(a( <r NwX   @   "   : t  )r!  )a!"ȍ  p!~Dǎ@Ǟ<HHW@~<p.`W .`&0 2  &'  ~<@@W`<@D~Hp##Z r dN< T.NFÞT T T.N "pN0 N8(' 'qN<>B!!   ̋ !T T.NPF؂ <N<4N0~HǎDǞ@Ǯ<``WN<N^觾[ [W<[@W [,W2![W$HW@8~ PPWP48<@DH~LN@HNH! N@N@! NHNHNTN@NPNTN\րNPqpN$NPN\ N\x((lx! ( 2NTN@  !(hրN\NTp0qp((q$NT N\sqp'( (&    NTpN\p  PNT! N@!NT xF pNP(PNPNXNP N\NPN\~LǎHǞDǮ@Ǿ<84PPWNP! !NT! N\WP<@DH~Ly   s  Rq(+p#((p(pspNX~LǎHǞDǮ@Ǿ<PPWA~"t0As3r21~W0+K "AC1!WAC$AhAC%hAC&hACWQWPX%AC1QCGxBBSD"vt ('"AC8('p'"$AC4$X$AhAC!FhAC"x $|    )` qHpH.z N`)`N`J,N`X$ Ndzz<\  (pZz,N`<H  C q+~Dǎ@WpNNNNNǼO @P PPO$PpRU!ضPO$%py}kg,PO$(VP p:w]ѡ[q" ,O(0O(ְO(FpO@c(stdxX܋ `O d`O PO$([P  ,O(0O(lְO(`O d`O (PO$[PQ̡P! ! ,O(0O(ְO(`O d`O 'Π- 8ы0):@0CAMр ѡ(PO$[P Q фP р}-!ш},O(0O( ְO(`O d`O / q)фыh`O d`O / q)фы4ONO`O csd(u$+\-` d#h.l*x0Āelh%ox0XeEfgGn9ld`O  Od`O @ O O "  !O`d`O }N; -!10N@@ V 8@  /  +!10N"  /  !10N @ /00 0ѡ $@ZPECѡMѡ pO }O uOO ^d`O } pq 5#"0ѡP n b V J@ O 6@ *Od`O O O d`O O @     0 9: @ O Oz OWC0)_D0)_D0)d`O - Op&@ 4OO  a@ 'O -OO pX Oo620Nx 0 NN"XN  OO   @ / & O g `h`O O 0!#иN0O,@O0ȧN(N dN8O0 - NND  5  + NN NNg ю 0ѡaPO P .aP6 QaP POPO ׶`OpO8gN 06PO,QPU):RECAaFSRQaVrgagaO,- +aea E`NrvpOOO #2#: @ / & O g `h`O O 0<#0O,@O0ȧN(N N8O0`O PO,/Q)-0!-N! NB +N! N   N! NE00@qA0- '1qA@Aq@ `  .'qF<Ad &$ O OA@> QP&#1qA@Aq@O@pO`O #H O @ & O  ! O g `h`O 0#N0O,@O0ȧN(NzN8N O,`O  FF=11=CCAM 0AMAPO,VA@O E@O pO}@NgOd``OO  >  O OOO @NpNN/)h,O(0O(>ְO(zkg(PO$(VPp: w q&)h,O(0O(ְO(@NpNN@ekd,O$( NDA4N,O(0O(NtNְO( ֠ON/)|,O(0O(.ְO(Jkd(PO$(VP@:0D A&)|,O(0O(ְO(NpTkg(O$( wq( ,O(0O(|ְO(     / ֠ON/)|,O(0O((ְO(Jkd*PO$(VP@<0D A&)|,O(0O(ְO(N fpOp\kg,O$( Nwq,N,O(0O(\ְO( ֠OO/)h,O(0O(ְO(Jkd*PO$(VP@< D A&)h,O(0O(ְO(H{ p   O$( @  N@ , 2 ! . 00  +   r  pNؐNذNNNW؋ "(  W`DHLPTX~\q  *"(  D L  p! N  Ǘ  8І ρ  ' p!7! h0 @ ְ 0 *>  (|~\ǎXǞTǮPǾLHD``WP@DH~Lr @D''!'؎ )7) ~LǎHǞDǮ@PPW![ W![WPHx~Lp(,j~LǎHPPWPHx~Lp(,"~LǎHPPW`?8<@DH~Lp.ޠOO:T 2pO pOOOp  :X ސ*p OJp  C@:8 6p  : @$:@$ 1 P@$`^P5%cR:W^XP'86 0":B0C9"5 4r+!+ @$0:  ?05N?:@ 5p  5 @$0:  O( O( O:O( 0 &009 4 @$05p (  5(TO &1O  &0   9( ~LǎHǞDǮ@Ǿ<8`O`W   ?  ?0 6    W6    W!1021!0WX<@DHLPҧ~TsRNW  ( ( D Ѳ \ pױ!'(R (> )ۘ     ,^   aP/\ +! (() )((F  ' p!7! hBW  D ,,- ό ~TǎPǞLǮHǾD@<XXW @(#)passwd.c 6.1 87/11/23 wUsage: passwd user Changing password for %s Permission denied. Old password:Sorry. Sorry: < %ld weeks since the last change You may not change this password. Too many failures - try later. New password:Password is too short - must be at least 6 digits Password cannot be circular shift of logonid Password must contain at least two alphabetic characters and at least one numeric or special character. Passwords must differ by at least 3 positions Re-enter new password:Too many tries; try again later. They don't match; try again. Temporary file busy; try again later. Cannot create temporary file Permission denied. cannot unlink %s cannot link %s to %s cannot unlink %s cannot link %s to %s cannot recover %s cannot unlink %s /etc/passwd/etc/opasswd/etc/ptmp @(#)a64l.c 6.1 87/11/23 @(#)crypt.c 6.1 87/11/23 :2*" <4,$ >6.&@80( 91)! ;3+# =5-% ?7/'(08@ '/7?&.6>%- 5=$, 4<#+ 3;"* 2:!) 1991)! :2*" ;3+# <4,$?7/'>6.&=5-%      )4%/7(3-!0,1'8"5.*2$                                                                                                                                      @(#)ctype.c 6.1 87/11/23 ((((( H @(#)getlogin.c 6.1 87/11/23 /etc/utmp @(#)getpwent.c 6.1 87/11/23 rr/etc/passwd @(#)l64a.c 6.1 87/11/23 @(#)memchr.c 6.1 87/11/23 @(#)mon.c 6.1 87/11/23 PROFDIRmon.out @(#)perror.c 6.1 87/11/23 : Unknown error @(#)putpwent.c 6.1 87/11/23 ,%s%s:%s:%u:%u:%s:%s:%s @(#)strtol.c 6.1 87/11/23 @(#)toupper.c 6.1 87/11/23 @(#)ttyslot.c 6.1 87/11/23 /etc/utmp @(#)data.c 6.1 87/11/23 PPPRb! @(#)fgets.c 6.1 87/11/23 @(#)stdiom.h 6.1 87/11/23 @(#)filbuf.c 6.1 87/11/23 @(#)flsbuf.c 6.1 87/11/23 @(#)stdiom.h 6.1 87/11/23 @(#)fopen.c 6.1 87/11/23 @(#)fprintf.c 6.1 87/11/23 @(#)getpass.c 6.1 87/11/23 r/dev/tty @(#)rew.c 6.1 87/11/23 @(#)setbuf.c 6.1 87/11/23 r @(#)errlst.c 6.1 87/11/23 %0%8%D%`%p%%%%%%%&&$&8&D&\&h&t&&&&&&&'''('@'P'h'x''''''((((8(T(t((.Error 0Not ownerNo such file or directoryNo such processInterrupted system callI/O errorNo such device or addressArg list too longExec format errorBad file numberNo child processesNo more processesNot enough spacePermission deniedBad addressBlock device requiredDevice busyFile existsCross-device linkNo such deviceNot a directoryIs a directoryInvalid argumentFile table overflowToo many open filesNot a typewriterText file busyFile too largeNo space left on deviceIllegal seekRead-only file systemToo many linksBroken pipeArgument out of domainResult too largeNo message of desired typeIdentifier removedChannel number out of rangeLevel 2 not synchronizedLevel 3 haltedLevel 3 resetLink number out of rangeProtocol driver not attachedNo CSI structure availableLevel 2 haltedDeadlock condition if locked @(#)getenv.c 6.1 87/11/23 @(#)isatty.c 6.1 87/11/23 @(#)malloc.c 6.1 87/11/23 @(#)memccpy.c 6.1 87/11/23 @(#)ttyname.c 6.1 87/11/23 /dev/ 000000000000000000000123456789abcdef0123456789ABCDEF @(#)findiop.c 6.1 87/11/23 @(#)fputs.c 6.1 87/11/23 @(#)stdiom.h 6.1 87/11/23 @(#)dowrite.c 6.1 87/11/23 @(#)print.h 6.1 87/11/23 @(#)ecvt.c 6.1 87/11/23 Fn CAy7Aׄ@È@Y@$ @(#)fwrite.c 6.1 87/11/23 @(#)stdiom.h 6.1 87/11/23 u!p# bXXP.textbX .dataXc@.bssXXP 0  !2$0 "[W`@DHLPT~Xp@ P^\@p@x 0@XEP@ ?!@ ( u. a!&p W@@@@@@@@@@@@ȋ@@Ћ@@@@p@@x@h@@T@@@@@A0 !  # @(Av.A   |2A +2:t00@S@@@@@A8 ! B @ 8A8p@ A @@@@@A@ ! B @A@pF@ A@@@@@A \ !(! AB(1&@C@C@, @C@ $>\ @8-?F @ @Ȏv@l@Ўb@X@N@D@:2't00@@@*@ж@ȶ@@@@@Ȏ@І @8,ʓ@؎ @؆  ,  @H=  ?   @x  ACH @\= @@ACP @h=T CH  dCHCX tCH :@@t>H@̓>.@>hP>V0CHpC <CЎ ҠC CҀCz"z(@Ў@Ȇ @@І qr@"8A  qH@  q*@@A( qp@@Ȏ * x=.(Cx ( ~XǎTǞPǮLǾHD@``W\`~<?p@?lx.X`.\Xx@?Bx.X6.\.@?x.X .\ \>p D$ 2 Dp$P $ | @:^ * @؎ @ =~<Wx~D7p @9r*̓= @ԓ9FDvhjjH=RL  :DpPj)D.TQp!PDh!79.{0~DxxW@~<ж؋Ћz 2 h$  @7L ؈! ' ! '() Гp+~<@@W8@p$|88W@~<<>\p47tt #dt t4  2!0<#|3Cz3@3p 2@WP@ ( ~(3`>q2(@  3"~TǎPǞLǮHǾD@xxW8ȓ 88W0@#20 A$WP<@DH~L\p߱B,  (! qЀӍhB 0(TB 9(@Bp@p1$C q Ѐ'@0**#"!B**#B(!`j)* @"B/y߁B (!q  ~LǎHǞDǮ@Ǿ<PPW 2@0 *0Ѐ1W B1@0 !02WH@~Dq2 !" @(7.V~Dǎ@HHW@~<r2 @.N~<@@W@~<r2" @.\3~<@@W@~<r3" @(-\2~<@@WX<@DH~Lq+ '#rR"RDU"rU@bRϰU( ' ( H.B~LǎHǞDǮ@Ǿ<XXW@~<p@(C  C"`X-@B h-p-@T-~CzP-j@@$C Cz0 #x-6@C C-@,@,C C 2!0<#,,~<@@W0~@ !$"$ d @ !$"( !@+B $ @-$ 1@ !$"$ D 0!*@0A$p AGDD@0 ~W8$ 88WP<@D~Hp,  LLpǀ h1'2ב lס pz H@80(L LLp  ~HǎDǞ@Ǯ<PPW :"4 mn2"'W Q!Q Q 0<-X # -\-` p'-pJF" 4#  m  n 4#  m  n!0F 4# m n$-l-t mn n <  82$21   <-d-h-x-XW@8- ~<2!0!!1-A!42A!4"1#x(2"#"2A!42A!4"1#t't'"dt'"drt'"d\8 d# 2! 0!("d*~<ǎ8@-@W@!:#:#"0$0 #0*0W8   (00  0 B!41 -RA!*P%00(# %09(# $@ < ^ 2  ,00  0 B!4188WpJ[B@8~   q  Q *  v~TǎPǞLǮHǾD@<WH@~Dp  pp  "   !~Dǎ@HHW!1021!0W !  W!2! W!21!0W! W2!A@BA!@10@AW2!10B!0 W2!@4(ARQ!P4AQW!120W0A~@ $ p  '"' H 1p  '"(  p+r ' p-' 120 $ x X p  '"' @ '"$ Ћ$p  '""  r  @ 08#p '"p ' #px' pX' 2p  '"$ Ћ$p  '""   ހ 1pxwwp@pxwtp Ћ$ހ pxwrp p@4 ~ǎǞWh@~DpV >x $|      qHpH.z >` $>`J>`X Ndzz<\  (pZz>`<H 2 C q+l~Dǎ@WX?@DHLP~Tr8     *8  ' p 7! ` ?  ~TǎPǞLǮHǾD@XXWH@~Dp W & !   D 6ހ  @  0(  ! p! !7  R   .   W    ~Dǎ@HHW8 ȧ~4p .q0(~488W@8~<pp ~W  < r  6 h ~<ǎ8@@W8 ȧ~4p T g "Q%(   ~488WH<΀ ~@q R  Bb p '(! ,>     BG G!     g   ,Q"%(  D b j D p     ~@ǎ<HHWH<@~DpǐLJ D   p   p ' (. (    ~Dǎ@Ǟ<HHW8 ȧ~4p  *        |'Q!R D D p %  ' p 7! ,~488W@8~<p  ( ppPW ( pp( ^4*    p & ppPW W @  ~<ǎ8@@WP pR a!` !WH@~Dq l~Dǎ@HHWH<@~Dr '$~Dǎ@Ǟ<HHWH<0@~Dr 0 (+R a(a( <r NwX   @   "    t  )r!  )a!"h  p ~Dǎ@Ǟ<HHW@~<p.`W .`&0 2  &'  ~<@@WX?@DHLP~Ts @  aP/\ (  ):  ' p 7! X (  <~TǎPǞLǮHǾD@XXW@\.`P <.\(0 2  < .  0 <  @@W@~<p     W    ~<@@W@48~<p P <    Z   & pp( $ ppPW 2 p  @  ~<ǎ8Ǟ4@@W [W[W![jW![ NW[W2![,W2![WC2!,[W2![W[W [W![rW [W<[@W [,W2![WWPT.> PPWA~"t0As3r21~Wp>>>>>Ǽ? @P PP?$PpRU P?$%py}kg,P?$(VP p:w]ѡ[q" ,?(0?(Rְ?(Fp?@c(stdxX܋ `? d`? P?$([P  ,?(0?(ְ?(`? d`? (P?$[PQ̡P! ! ,?(0?(Pְ?(`? d`? 'Π- 8ы0):@0CAMр ѡ(P?$[P Q фP р}-!ш},?(0?(xְ?(`? d`? / qфыh`? d`? / qфы4?>?`? csd(u$+\-` d#h.l*x0Āelh%ox0XeEfgGn9ld`?  ?d`? @ ? ? "  !?`d`? }>; -!10>@@ V 8@  /  +!10>"  /  !10> @ /00 0ѡ $@ZPECѡMѡ p? }? u?? ^d`? } pq 5#"0ѡP n b V J@ ? 6@ *?d`? ? ? d`? ? @     0 9: @ ? ?z ?WC0_D0_D0d`? - ?p&@ 4??  a@ '? -?? pX Oo620>x 0 >>"X>  ??   @ / & ? g `h`? ? 0!#и>0?,@?0ȧN(> >8?0 - >>D  5  + >> >>g ю 0ѡaP? P .aP6 QaP P?P? ׶`?p?8g> 06P?,QPU):RECAaFSRQaVrgaga?,- +aea E`>rvp??? #2#: @ / & ? g `h`? ? 0<#0?,@?0ȧN(>>8?0`? P?,/Q)-0!->! >B +>! >   >! >E00@qA0- '1qA@Aq@ `  .'qF<Ad &$ ? ?A@> QP&#1qA@Aq@?@p?`? #H ? @ & ?  ! ? g `h`? 0#>0?,@?0ȧN(>>8> ?,`?  FF=11=CCAM 0AMAP?,VA@? E@? p?}@>g?d``??  >  ? ??? @>p>>/x,?(0?(ְ?(zkg(P?$(VPp: w q&x,?(0?(<ְ?(@>p>>@ekd,?$( >DA4>,?(0?(>>ְ?( ֠?>/,?(0?(ְ?(Jkd(P?$(VP@:0D A&,?(0?(,ְ?(>pTkg(?$( wq( ,?(0?(ְ?(     / ֠?>/,?(0?(ְ?(Jkd*P?$(VP@<0D A&,?(0?($ְ?(> fp?p\kg,?$( >wq,>,?(0?(ְ?( ֠??/x,?(0?(lְ?(Jkd*P?$(VP@< D A&x,?(0?(ְ?(H{ p   ?$( @  @ , 2 ! . 00  +    p>ؐ>ذ>>>W 0(  WP@DH~Lr @D''!'v )7H) ~LǎHǞDǮ@PPW2!6[WPHx~Lp(,j~LǎHPPWPHx~Lp(,"~LǎHPPW`?8<@DH~Lp.ޠ??:T 2p? p???p  :X ސ@ ?Jp  C@:8 6p  : @$:@$ 1 P@$`^P5%cR:W^XP'86 0":B0C9"5 4r+!+ @$0:  ?05N?:@ 5p  5 @$0:  ?( ?( ?:?( 0 &009 4 @$05p (  5(T? &1?  &0   9( ~LǎHǞDǮ@Ǿ<8`?`W   ?  ?0 6    W6    WX<@DHLPҧ~TsRNW  ( ( D  \ pױ '(R (> )     ,ݎ   aP/\ +! (() )((v  ' p 7! ߘBW  D ,,- ܼ ~TǎPǞLǮHǾD@<XXW @(#)ps.c 6.1 87/11/23 X$8XpP ttyps [ -edalf ] [ -c corefile ] [ -s swapdev ] [ -n namelist ] [ -t tlist ] [ -p plist ] [ -u ulist ] [ -g glist ]lfeadn:s:c:t:p:g:u:/unix/dev/kmem/dev/memps: no memory usage: %s %s ps: no namelist ps: no mem ps: no mem F S UID PID PPID C PRI NI ADDR SZ WCHAN STIME TTY TIME COMD UID PID PPID C STIME TTY TIME COMMAND F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME COMD PID TTY TIME COMMAND /dev/unix/etc/passwdps: not enough memory r/devps: cannot open /dev /devps: cannot change to /dev ps: not enough memory for %d users ??%9x%6u%6u%3o %cOSWRIZTXX%8.8s%8.8u%6u%3d%4d%3d%7x%4d %-7.7s %2ld:%.2ld %.8s %.8s [ %.8s ] %.35s %.80sps: unknown user %s ps: error on lseek fd %d off %x ps: error on read ps: error on read ps: error on write %9.9s%6u%6u%3o %cOSWRIZT%8.8s%8.8u%6u%3d%4d%3d %2ld:%.2ld LTH_v_proc_swplo/etc/ps_data @(#)atoi.c 6.1 87/11/23 @(#)ctime.c 6.1 87/11/23 Day Mon 00 00:00:00 1900 SunMonTueWedThuFriSatJanFebMarAprMayJunJulAugSepOctNovDecTZp 4 0PDTPSTW`/Lw/K:/JMFw/ @(#)ctype.c 6.1 87/11/23 ((((( H @(#)getenv.c 6.1 87/11/23 @(#)getopt.c 6.1 87/11/23 --: illegal option -- : illegal option -- : option requires an argument -- : option requires an argument --  @(#)getpwent.c 6.1 87/11/23 rr/etc/passwd @(#)malloc.c 6.1 87/11/23 @(#)memchr.c 6.1 87/11/23 @(#)mon.c 6.1 87/11/23 PROFDIRmon.out @(#)nlist.c 6.1 87/11/23 @(#)perror.c 6.1 87/11/23 : Unknown error @(#)strtol.c 6.1 87/11/23 @(#)ttyname.c 6.1 87/11/23 /dev/ @(#)data.c 6.1 87/11/23  @(#)fgets.c 6.1 87/11/23 @(#)stdiom.h 6.1 87/11/23 @(#)filbuf.c 6.1 87/11/23 @(#)flsbuf.c 6.1 87/11/23 @(#)stdiom.h 6.1 87/11/23 @(#)fopen.c 6.1 87/11/23 @(#)fprintf.c 6.1 87/11/23 @(#)fread.c 6.1 87/11/23 @(#)stdiom.h 6.1 87/11/23 @(#)printf.c 6.1 87/11/23 @(#)rew.c 6.1 87/11/23 @(#)setbuf.c 6.1 87/11/23  @(#)errlst.c 6.1 87/11/23  (<P`t 0DXl(DXt.Error 0Not ownerNo such file or directoryNo such processInterrupted system callI/O errorNo such device or addressArg list too longExec format errorBad file numberNo child processesNo more processesNot enough spacePermission deniedBad addressBlock device requiredDevice busyFile existsCross-device linkNo such deviceNot a directoryIs a directoryInvalid argumentFile table overflowToo many open filesNot a typewriterText file busyFile too largeNo space left on deviceIllegal seekRead-only file systemToo many linksBroken pipeArgument out of domainResult too largeNo message of desired typeIdentifier removedChannel number out of rangeLevel 2 not synchronizedLevel 3 haltedLevel 3 resetLink number out of rangeProtocol driver not attachedNo CSI structure availableLevel 2 haltedDeadlock condition if locked @(#)isatty.c 6.1 87/11/23 @(#)memccpy.c 6.1 87/11/23 000000000000000000000123456789abcdef0123456789ABCDEF @(#)findiop.c 6.1 87/11/23 @(#)dowrite.c 6.1 87/11/23 @(#)print.h 6.1 87/11/23 @(#)ecvt.c 6.1 87/11/23 Fn CAy7Aׄ@È@Y@$ @(#)fwrite.c 6.1 87/11/23 @(#)stdiom.h 6.1 87/11/23 u!p1 WH ;.textWH .data W@.bss88;'  0  !2$0 ""[Wh<@DHLP~T֠Pq- t P   $+1~P Q ^`",  P " !dP  ! l P " !P ! 2 P " !|\$hP(8$TP($$@P(8P(D 6 (5T 4P 5 td0 P R^X" X |.p  /!f`5 52ldh\P8d3hP0  ȶP4TC R0P<4fR0,R0,ضP<P@P0XV jPV X / XX 3. X 2 . ~TǎPǞLǮHǾD@<hhW8\0 z4/ R88WpX\`d~hr4dll (+p +-*Ǻ r*.(*.,0P(/ 4! 8 ,';<, $ȋ $~hǎdǞ`Ǯ\ǾXppWW 09@Ч~p9(ހ$! "#(! "'qA1 !ސ9Hޠ X@909 ss1pp@9#@9(09)ss1pp!@9C8()0@0sqw9rtww9(A1r!pp0Exn $|     P qHpH.z N0 P\N0JN0X Ndzz<\  (pZzN0<H  C q+~Dǎ@W@8~<p pNPdf2Ɔ> ~<ǎ8@@WX?@DHLP~Tr8     *8  ' p$7! ` ?  ~TǎPǞLǮHǾD@XXWH@~Dp W & !   D 6ހ  @  %(  ! p!$!7 \R   .   W    ~Dǎ@HHW8 ȧ~4p .q%(~488W@8~<pp ~W  < r  '( @ ~<ǎ8@@W8 ȧ~4p T g "Q%(   ~488WH<΀ ~@q R  Bb p$'(! ,>     BG G!     g   ,Q"%(  D b j D p     ~@ǎ<HHWH<@~DpǐLJ D   p$  p$' (. (    ~Dǎ@Ǟ<HHW8 ȧ~4p  *        |'Q!R D D p$%  ' p$7! ,~488W@8~<p  ( ppPRPW$( pp%$^ *    p$& ppPRPW$ &W @  ~<ǎ8@@WP pR$ a!` !WH@~Dq, l~Dǎ@HHWH<@~Dr '$~Dǎ@Ǟ<HHWH<0@~Dr 0 (+R a(a( <r NwX   @   "   : t  )r!  )a!"ȍ  p$~Dǎ@Ǟ<HHW@~<p.`W .`&0 2  &'   ~<@@W`<@D~Hp&&Z rNl T.N^ÞT T T.N8 ZpN` Nh(' 'qNl>B!!      ̋  ! T T.Nhv  <Nl,LN`~HǎDǞ@Ǯ<``WNlNlW@\.`P .\(0 2  .    @@W@~<p  r   W    ~<@@W@48~<p P \    Z   & pp%$$ ppPRPW$2 p$ @  ~<ǎ8Ǟ4@@W [W2![W[W![W. >$.;0[vW!;0[TW![ 6W[W[W2!6[W!%[W2![W2![WC2!,[W2![W[x' W ' [L' ' W.[(W![W!00[WH .(N0n8@HPX` W`X .(N0n8Ɏ@ɮHPԩة>^觾[![JW [W2![W'(Wh<~@ ,p v$ D $$<D &NpD(NxNp~@ǎ<hhW8 ȧ0~4Vp ׆~4ǎ088WPT.> PPWA~"t0As3r21~W2!@4(ARQ!P4AQWp@D~Hp,pp / -x npD^fzzz z$X, *q L $ $! Z~HǎDǞ@ppWpNNNNNǼO @P PPO$PpRU$PO$%py}kg,PO$(VP p:w]ѡ[q" ,O(0O(ְO(FpO@c(stdxX܋ `O d`O PO$([P  ,O(0O(lְO(`O d`O (PO$[PQ̡P! ! ,O(0O(ְO(`O d`O 'Π- 8ы0):@0CAMр ѡ(PO$[P Q фP р}-!ш},O(0O( ְO(`O d`O / q-фыh`O d`O / q-фы4ONO`O csd(u$+\-` d#h.l*x0Āelh%ox0XeEfgGn9ld`O  Od`O @ O O "  !O`d`O }N; -!10N@@ V 8@  /  +!10N"  /  !10N @ /00 0ѡ $@ZPECѡMѡ pO }O uOO ^d`O } pq 5#"0ѡP n b V J@ O 6@ *Od`O O O d`O O @     0 9: @ O Oz OWC0-_D0-_D0-d`O - Op&@ 4OO  a@ 'O -OO pX Oo620Nx 0 NN"XN  OO   @ / & O g `h`O O 0!#иN0O,@O0ȧN(N ,N8O0 - NND  5  + NN NNg ю 0ѡaPO P .aP6 QaP POPO ׶`OpO8gN 06PO,QPU):RECAaFSRQaVrgagaO,- +aea E`NrvpOOO #2#: @ / & O g `h`O O 0<#0O,@O0ȧN(N lN8O0`O PO,/Q)-0!-N! NB +N! N   N! NE00@qA0- '1qA@Aq@ `  .'qF<Ad &$ O OA@> QP&#1qA@Aq@O@pO`O #H O @ & O  ! O g `h`O 0#N0O,@O0ȧN(NBN8N O,`O  FF=11=CCAM 0AMAPO,VA@O E@O pO}@NgOd``OO  >  O OOO @NpNN/-,O(0O(>ְO(zkg(PO$(VPp: w q&-,O(0O(ְO(@NpNN@ekd,O$( NDA4N,O(0O(NtNְO( ֠ON/-,O(0O(.ְO(Jkd(PO$(VP@:0D A&-,O(0O(ְO(NpTkg(O$( wq( ,O(0O(|ְO(     / ֠ON/-,O(0O((ְO(Jkd*PO$(VP@<0D A&-,O(0O(ְO(N fpOp\kg,O$( Nwq,N,O(0O(\ְO( ֠OO/-,O(0O(ְO(Jkd*PO$(VP@< D A&-,O(0O(ְO(H{ p   O$( @  @ , 2 ! . 00  +   2  pNؐNذNNNW %(  W`DHLPTX~\q  *"(  D    p$   Ǘ  8І ρ  ' p$7! (0 @ p 0 *>  (\~\ǎXǞTǮPǾLHD``WP@DH~Lr @D''!'N )70)Ȕ ~LǎHǞDǮ@PPWPHx~Lp(,j~LǎHPPWPHx~Lp(,"~LǎHPPW`?8<@DH~Lp.ޠOO:T 2pO pOOOp  :X ސ. OJp  C@:8 6p  : @$:@$ 1 P@$`^P5%cR:W^XP'86 0":B0C9"5 4r+!+ @$0:  ?05N?:@ 5p  5 @$0:  O( O( O:O( 0 &009 4 @$05p (  5(TO &1O  &0   9( ~LǎHǞDǮ@Ǿ<8`O`W   ?  ?0 6    W6    WX<@DHLPҧ~TsRNW  ( ( D  \ pױ$'(R (> )     ,~   aP/\ +! (() )((>  ' p$7! وBW  D ,,-Ž ֬ ~TǎPǞLǮHǾD@<XXW @(#)su.c 6.1 87/11/23 --surootsu: Unknown id: %s /dev/tty??/usr/adm/sulog/usr/adm/sulogPassword:/usr/adm/sulogsu: Sorry /usr/adm/sulogsu: Invalid ID su: No shell su: unable to obtain memory to expand environmentsu: unable to obtain memory to expand environmentaSU %.2d/%.2d %.2d:%.2d %c %s %s-%s suHOME=LOGNAME= $TERM=/bin/shPATH=:/bin:/usr/binPATH=/bin:/etc:/usr/binPS1=# @(#)crypt.c 6.1 87/11/23 :2*" <4,$ >6.&@80( 91)! ;3+# =5-% ?7/'(08@ '/7?&.6>%- 5=$, 4<#+ 3;"* 2:!) 1991)! :2*" ;3+# <4,$?7/'>6.&=5-%      )4%/7(3-!0,1'8"5.*2$                                                                                                                                      @(#)ctime.c 6.1 87/11/23 Day Mon 00 00:00:00 1900 SunMonTueWedThuFriSatJanFebMarAprMayJunJulAugSepOctNovDecTZp<8PDTPSTW`/Lw/K:/JMFw/ @(#)getenv.c 6.1 87/11/23 @(#)getpwent.c 6.1 87/11/23 rr/etc/passwd @(#)getpwnam.c 6.1 87/11/23 @(#)malloc.c 6.1 87/11/23 @(#)memchr.c 6.1 87/11/23 @(#)mon.c 6.1 87/11/23 PROFDIRmon.out @(#)perror.c 6.1 87/11/23 : Unknown error @(#)putenv.c 6.1 87/11/23 @(#)strtol.c 6.1 87/11/23 @(#)ttyname.c 6.1 87/11/23 /dev/ @(#)cuserid.c 6.1 87/11/23 @(#)data.c 6.1 87/11/23 R`R`RhTXd`$ @(#)fgets.c 6.1 87/11/23 @(#)stdiom.h 6.1 87/11/23 @(#)filbuf.c 6.1 87/11/23 @(#)flsbuf.c 6.1 87/11/23 @(#)stdiom.h 6.1 87/11/23 @(#)fopen.c 6.1 87/11/23 @(#)fprintf.c 6.1 87/11/23 @(#)getpass.c 6.1 87/11/23 r/dev/tty @(#)printf.c 6.1 87/11/23 @(#)rew.c 6.1 87/11/23 @(#)setbuf.c 6.1 87/11/23 th @(#)ctype.c 6.1 87/11/23 ((((( H @(#)errlst.c 6.1 87/11/23 )8)@)L)h)x))))))***,*@*L*d*p*|*******++ +0+H+X+p++++++,, ,0,@,\,|,,.Error 0Not ownerNo such file or directoryNo such processInterrupted system callI/O errorNo such device or addressArg list too longExec format errorBad file numberNo child processesNo more processesNot enough spacePermission deniedBad addressBlock device requiredDevice busyFile existsCross-device linkNo such deviceNot a directoryIs a directoryInvalid argumentFile table overflowToo many open filesNot a typewriterText file busyFile too largeNo space left on deviceIllegal seekRead-only file systemToo many linksBroken pipeArgument out of domainResult too largeNo message of desired typeIdentifier removedChannel number out of rangeLevel 2 not synchronizedLevel 3 haltedLevel 3 resetLink number out of rangeProtocol driver not attachedNo CSI structure availableLevel 2 haltedDeadlock condition if locked @(#)getlogin.c 6.1 87/11/23 /etc/utmp @(#)getpwuid.c 6.1 87/11/23 @(#)isatty.c 6.1 87/11/23 @(#)memccpy.c 6.1 87/11/23 @(#)ttyslot.c 6.1 87/11/23 /etc/utmp 000000000000000000000123456789abcdef0123456789ABCDEF @(#)findiop.c 6.1 87/11/23 @(#)fputs.c 6.1 87/11/23 @(#)stdiom.h 6.1 87/11/23 @(#)dowrite.c 6.1 87/11/23 @(#)print.h 6.1 87/11/23 @(#)ecvt.c 6.1 87/11/23 Fn CAy7Aׄ@È@Y@$ @(#)fwrite.c 6.1 87/11/23 @(#)stdiom.h 6.1 87/11/23 : # " @(#)true.sh 6.1 87/11/23 " exit 0 u!qr 8H$h.text8H .data8@.bss--$h" 0  !2$0 ":[WP<@DH~L S!: ?!  M 2 QЋ m!Đ V q  sl0 p  j0 p |  60 |p h (z0 p   0(0  p   8ҋZ0 <B p  l @~  0 20$H |v~LǎHǞDǮ@Ǿ<PPWH 1: $  (ؓHHW@8~<p"~<ǎ8@@WW0~@!$"$ d @!$"( !@+B $ @-$ 1@!$"$ D 0!*@0A$pAGDD@0 ~W0~@!$"$ d @!$"( !@+B $ @-$ 1@!$"$ D 0!*@0A$pAGDD@0 ~Wp[BP<@D~HPqQp0`*p-p 0p00L0p!'":0( F (bLMLJh  ȓH  L"0P`pQP0QP?b : 0Pap!'",p00 00~(bNOLJJ  *  vN"hQ?Pz0p00 QPL0P`pQPQP00 ~HǎDǞ@Ǯ<PPWX?@DHLP~Tp-r-b 0 |- dp$- - H --p   0000p08-p q-  ( ^X  `! 01'q2! 'q/  !' :Gq21304!:'q.h,/ h-- -P-q9(9#0@@5601 0- -) ~TǎPǞLǮHǾD@XXWH@~D#p pp"  "    ! ~Dǎ@HHW !  W!2! W!21!0W! W!120W8 ȧ~4pȋ.q!(~488W@8~<pp ~W  < r n  8 ~<ǎ8@@W8 ȧ~4p T g "Q%(   ~488WH<΀ ~@q R  Bb p '(! ,>     BG G!    g   ,Q"%(  D b j D p     ~@ǎ<HHWH<@~DpǐLJ D   p   p ' (. (l   ~Dǎ@Ǟ<HHW8 ȧ~4p  *        |'Q!R D D p %  ' p 7! ,~488W@8~<p  ( ppP0@W ȋ( pp!Ч ȋ^*    p ȋ& ppP0@W nW @  ~<ǎ8@@WP pR a!` !W@~<p.`W .`&0 2  &'   ~<@@W@\.`P.\(0 2  . ؓ n  @@W[W![bW[W@ 11@@WH@11.($tHHWP~LpxA.(>,01'40~LPPWP~LpA1.('>,4~LPPWC2!,[W[@"W "[""WPH~Lq>t.(5,(74~LǎHPPWH@15.($HHWH@15.($HHWH@14.($HHWH@14.($hHHW@ 4@@@WH@14.($HHWnN(^,n0[nzW2![`W@8~ PPWP48<@DH~L.`H.h! .`.`! .h.h.t.`.p.t.|ր.pqpN$.p.| .|x((lx! ( 2.t.`  !(hր.|.tp0qp((q$.t .|sqp'( (&   f 2.tp.|p  P.t! .`!.t xF p.p(P.p.x.p .|.p.|~LǎHǞDǮ@Ǿ<84PPW.p! !.t! .|WP<@DH~Ly   s  Rq(+p#X((p(psp.x~LǎHǞDǮ@Ǿ<PPW0+K "AC1!WAC$AhAC%hAC&hACWQWPX%AC1QCGxBBSD"vt ('"AC8('p'"$AC4$X$AhAC!FhAC" QP&#1qA@Aq@/@p/`/ #H / @ & /  ! / g `h`/ 0#.0/,@/0ȧN(.r.8. /,`/  FF=11=CCAM 0AMAP/,VA@/ E@/ p/}@.g/d``//  >  / /// @.p../',/(0/(Vְ/(zkg(P/$(VPp: w q&',/(0/(ְ/(@.p..@ekd,/$( .DA4.,/(0/(..ְ/( ֠/./',/(0/(Fְ/(Jkd(P/$(VP@:0D A&',/(0/(ְ/(.pTkg(/$( wq( ,/(0/(ְ/(     / ֠/./',/(0/(@ְ/(Jkd*P/$(VP@<0D A&',/(0/(ְ/(. fp/p\kg,/$( .wq,.,/(0/(tְ/( ֠///',/(0/(,ְ/(Jkd*P/$(VP@< D A&',/(0/(ְ/(H{ p   /$( @  6@ , 2 ! . 00  +   Z  p.ؐ.ذ...WP@DH~Lr @D''!'^ )7H)\ ~LǎHǞDǮ@PPW2!6[WPHx~Lp(,j~LǎHPPWPHx~Lp(,"~LǎHPPW`?8<@DH~Lp.ޠ//:T 2p/ p///p  :X ސ(@ /Jp  C@:8 6p  : @$:@$ 1 P@$`^P5%cR:W^XP'86 0":B0C9"5 4r+!+ @$0:  ?05N?:@ 5p  5 @$0:  /( /( /:/( 0 &009 4 @$05p (  5(T/ &1/  &0   9( ~LǎHǞDǮ@Ǿ<8`/`W   ?  ?0 6    W6    WX<@DHLPҧ~TsRNW  ( ( D  \ pױ '(R (> )ߠ     ,v   aP/\ +! (() )((  ' p 7! ڀBW  D ,,-V פ ~TǎPǞLǮHǾD@<XXW0@ A#1 ! 1W @(#)ipcrm.c 6.1 87/11/23 msqidshmidsemidmsgkeyshmkeysemkeyusage: ipcrm [ [-q msqid] [-m shmid] [-s semid] %s [-Q msgkey] [-M shmkey] [-S semkey] ... ]not foundpermission deniedunknown erroripcrm: %s(%ld): %s illegal key: %s q:m:s:Q:M:S: @(#)atoi.c 6.1 87/11/23 @(#)atol.c 6.1 87/11/23 @(#)ctype.c 6.1 87/11/23 ((((( H @(#)getopt.c 6.1 87/11/23 --: illegal option -- : illegal option -- : option requires an argument -- : option requires an argument --  @(#)mon.c 6.1 87/11/23 PROFDIRmon.out @(#)perror.c 6.1 87/11/23 : Unknown error @(#)data.c 6.1 87/11/23 0P0P0X2HBP @(#)flsbuf.c 6.1 87/11/23 @(#)stdiom.h 6.1 87/11/23 @(#)fprintf.c 6.1 87/11/23 @(#)printf.c 6.1 87/11/23 @(#)msgsys.c 6.1 87/11/23 RX @(#)semsys.c 6.1 87/11/23 @(#)shmsys.c 6.1 87/11/23 @(#)errlst.c 6.1 87/11/23 #####$$ $($<$P$`$t$$$$$$$%%% %0%D%X%l%%%%%%%%&&(&D&X&t&&&&&''.Error 0Not ownerNo such file or directoryNo such processInterrupted system callI/O errorNo such device or addressArg list too longExec format errorBad file numberNo child processesNo more processesNot enough spacePermission deniedBad addressBlock device requiredDevice busyFile existsCross-device linkNo such deviceNot a directoryIs a directoryInvalid argumentFile table overflowToo many open filesNot a typewriterText file busyFile too largeNo space left on deviceIllegal seekRead-only file systemToo many linksBroken pipeArgument out of domainResult too largeNo message of desired typeIdentifier removedChannel number out of rangeLevel 2 not synchronizedLevel 3 haltedLevel 3 resetLink number out of rangeProtocol driver not attachedNo CSI structure availableLevel 2 haltedDeadlock condition if locked @(#)getenv.c 6.1 87/11/23 @(#)isatty.c 6.1 87/11/23 @(#)malloc.c 6.1 87/11/23 000000000000000000000123456789abcdef0123456789ABCDEF @(#)dowrite.c 6.1 87/11/23 @(#)print.h 6.1 87/11/23 @(#)ecvt.c 6.1 87/11/23 Fn CAy7Aׄ@È@Y@$ @(#)fwrite.c 6.1 87/11/23 @(#)stdiom.h 6.1 87/11/23 @(#)memchr.c 6.1 87/11/23 u!qg RF8.textR .data88S8@.bss++F P 0  !2$0 8"j[W8ȧLPT~Xp>a<v? C Nb Vc Rtmp`WP P(P0P8P@P@P8zPHpjPP^PHhNP0BP(6PX*P`P PhPh x$0 2PhqГPX PP P`P`PXPPhtxPp H  4$>ppT~  4zPXp   P8 P  P00p 0P@ @P(@@ @֐P ސ ސ(PN,0~v 0  q7q(q. P0. P@̓P(.P "LB8ȓ+PP̆"p   P0,P@"P PXP8 P  P00 0P@ @P(@@ @֐P ސ( ސ(N,0vDj~TV ,  q7q(m|.P0$ēP@P(". P "(0,&0/P`p \ ( P@6P ,PXPP̎lP8 P P@0 0P  (~`ȓr   qj`7q(s.P@ P z`q2~XǎTǞPǮL88W@0 P@@W@~<rV\~<@@WP@ @DH~L p@ p<( 0 4Nx$! D(7p0  -8sqp  4dTN 0*\P8v  ,d (l~LǎHǞDPPW@XX.`0Xx A0x$:*@@W8$ 88WP<@D~Hp, hLLpǀ1'2בסzpH@80(L LLp  ~HǎDǞ@Ǯ<PPW :"4 mn2"'W Q!Q Q 0<+ # ++ p'+JF" 4#  m  n 4#  m  n!0F 4# m n$++ mn n 2$21  +ܶ+++W@8+ ~<2!0!!1+A!42A!4"1#x(2"#"42A!42A!4"1#t't'"dt'"drt'"d\8 d# 2! 0!("d*~<ǎ8@+@W@!:#:#"0$0 #0*0W8` x00  0 B!41 -RA!*P%00(# %09(# $@ <h^p2 |00  0 B!4188Wp [B@8~   q  Q   ~TǎPǞLǮHǾD@<WH@~D X!8p pp   "   !~Dǎ@HHW !  W!2! W!21!0W! W2!10B!0 W!120W8 ȧ~4p.q(~488W@8~<pp ~W  < r n X  ~<ǎ8@@W8 ȧ~4p T g "Q%(   ~488WH<΀ ~@q R  Bb p'(! ,>     BG G!Ȏ    g   ,Q"%(  D b j D p     ~@ǎ<HHWH<@~DpǐLJ D   p  p' (. (D   ~Dǎ@Ǟ<HHW8 ȧ~4p  *        |'Q!R D D p%  ' p7! ,~488W@8~<p  ( ppPPW( pp^L*    p& ppPPWW @  ~<ǎ8@@WP pR a!` !W@~<p.`W .`&0 2  &'  ~<@@W@\.`P.\(0 2 ԋ . ȓ&  @@W[W![W[W2![W2![WC2!,[W2![W[h PW  P[< P PW2![W XW8%Ȏ"%$$%%%88W8%Ȇ%88W 1 W8%Ȏ*%$#N% %88WH ,@~D p :p<<p<:" p%<<<:pހ<q,p<~Dǎ@HHW8%DȎ"%H%0" %D%D#88W8%DȆ%D88W : W8%DȎ*%H%8!>%D %D88WH >0<~@pp pN8(pN<p : pD*   :`.D 0p`aN@p : D* 6  :D  .p`aND%@NLpNPpNTpNXpN<q,qN8pNH~@ǎ<HHWPT.>" PPWP48<@DH~LN`HNh! N`N`! NhNhNtN`NpNtN|րNpqpN$NpN| N|x((lx! ( 2NtN`  !(hրN| Ntp0qp((q$Nt N|sqp'( (&   ~ JNtpN|p  PNt! N`!Nt xF pNp(PNpNxNp N|NpN|~LǎHǞDǮ@Ǿ<84PPWNp! !Nt! N|WP<@DH~Ly   s  Rq(+p#((p(pspNx~LǎHǞDǮ@Ǿ<PPW0@ A#1 ! 1W0+K "AC1!WAC$AhAC%hAC&hACWQWPX%AC1QCGxBBSD"vt ('"AC8('p'"$AC4$X$AhAC!FhAC" QP&#1qA@Aq@O@pO`O #H O @ & O  ! O g `h`O 0#N0O,@O0ȧN(N 2N8N O,`O  FF=11=CCAM 0AMAPO,VA@O E@O pO}@NgOd``OO  >  O OOO @NpNN/%,O(0O( FְO(zkg(PO$(VPp: w q&%,O(0O(ְO(@NpNN@ekd,O$( NDA4N,O(0O(N|NְO( ֠ON/%,O(0O(6ְO(Jkd(PO$(VP@:0D A&%,O(0O(ְO(NpTkg(O$( wq( ,O(0O(ְO(     / ֠ON/%,O(0O(0ְO(Jkd*PO$(VP@<0D A&%,O(0O(ְO(N fpOp\kg,O$( Nwq,N,O(0O(dְO( ֠OO/%,O(0O(ְO(Jkd*PO$(VP@< D A&%,O(0O(ְO(H{ p   O$( @  ~@ , 2 ! . 00  +   ٢  pNؐNذNNNWX?@DHLP~Tr8     *8   ' p7!  ?  ~TǎPǞLǮHǾD@XXWH@~Dp ٠W & !   D 6ހ  @  Մ(  ! p!!7 R   .   W    ~Dǎ@HHWH@~Dq l~Dǎ@HHWH<@~DrӜ '$~Dǎ@Ǟ<HHWH<0@~Dr 0 (+R a(a( <r NwX   @   "   ٪ t  )r!  )a!"8  p~Dǎ@Ǟ<HHW@~<pҞ     W    ~<@@WP@DH~Lr @D''!'ֶ )7)< ~LǎHǞDǮ@PPW2!6[ؠW0~@'A!$"$ d @'A!$"( !@+B $ @-$ 1@'A!$"$ D 0!*@0A$p'AAGDD@0 ~WPHx~Lp(,j~LǎHPPWPHx~Lp(,"~LǎHPPW`?8<@DH~Lp.ޠOO:T 2pO pOOOp  :X ސ(h Op  C@:8 6p  : @$:@$ 1 P@$`^P5%cR:W^XP'86 0":B0C9"5 4r+!+ @$0:  ?05N?:@ 5p  5 @$0:  O( O( O:O( 0 &009 4 @$05p (  5(TO &1O  &0   9( ~LǎHǞDǮ@Ǿ<8`O`WA~"t0As3r21~W   ?  ?0 6    W6    W (  WX<@DHLPҧ~TsRNW  ( ( D  \ pױ'(R (> )x     ,v   aP/\ +! (() )((v  ' p7! πBW  D ,,- ̤ ~TǎPǞLǮHǾD@<XXW @(#)ipcs.c 6.1 87/11/23 b$0b<H %6u %7d%7u %7uusage: ipcs [-abcmopqst] [-C corefile] [-N namelist] ipcs: no namelist ipcs: no memory file IPC status from %s as of %s%s%s%s%s%s%s Message Queues: CBYTES QNUM QBYTES LSPID LRPID STIME RTIME CTIME Message Queue facility not in system. SRrw-rw-rw-%7u%6u%6u%6u%s%s%s%s%s%s NATTCH SEGSZ CPID LPID ATIME DTIME CTIME Shared Memory: Shared Memory facility not in system. DCrw-rw-rw-%6u%6u%s%s%s%s NSEMS OTIME CTIME Semaphores: Semaphore facility not in system. --ra-ra-ra-ipcs: seek erroripcs: read error%9d%9d%9d%9d%c 0x %c%7d%s%#8.8x %9.8s%9.8s%9.8s%9.8s %2d:%2.2d:%2.2d no-entryT ID KEY MODE OWNER GROUP CREATOR CGROUPabcmopqstC:N:_time_msgque_sema_shmem_msginfo_seminfo_shminfo/unix/dev/kmem @(#)ctime.c 6.1 87/11/23 Day Mon 00 00:00:00 1900 SunMonTueWedThuFriSatJanFebMarAprMayJunJulAugSepOctNovDecTZpPDTPSTW`/Lw/K:/JMFw/ @(#)getenv.c 6.1 87/11/23 @(#)getgrgid.c 6.1 87/11/23 @(#)getopt.c 6.1 87/11/23 --: illegal option -- : illegal option -- : option requires an argument -- : option requires an argument --  @(#)getpwuid.c 6.1 87/11/23 @(#)mon.c 6.1 87/11/23 PROFDIRmon.out @(#)nlist.c 6.1 87/11/23 @(#)perror.c 6.1 87/11/23 : Unknown error @(#)data.c 6.1 87/11/23 PPPRb @(#)flsbuf.c 6.1 87/11/23 @(#)stdiom.h 6.1 87/11/23 @(#)fprintf.c 6.1 87/11/23 @(#)printf.c 6.1 87/11/23 r @(#)errlst.c 6.1 87/11/23 !@!H!T!p!!!!!!!" " "4"H"T"l"x"""""""###(#8#P#`#x######$ $($8$H$d$$$.Error 0Not ownerNo such file or directoryNo such processInterrupted system callI/O errorNo such device or addressArg list too longExec format errorBad file numberNo child processesNo more processesNot enough spacePermission deniedBad addressBlock device requiredDevice busyFile existsCross-device linkNo such deviceNot a directoryIs a directoryInvalid argumentFile table overflowToo many open filesNot a typewriterText file busyFile too largeNo space left on deviceIllegal seekRead-only file systemToo many linksBroken pipeArgument out of domainResult too largeNo message of desired typeIdentifier removedChannel number out of rangeLevel 2 not synchronizedLevel 3 haltedLevel 3 resetLink number out of rangeProtocol driver not attachedNo CSI structure availableLevel 2 haltedDeadlock condition if locked @(#)getgrent.c 6.1 87/11/23 rr/etc/group @(#)getpwent.c 6.1 87/11/23 rr/etc/passwd @(#)isatty.c 6.1 87/11/23 @(#)malloc.c 6.1 87/11/23 @(#)memchr.c 6.1 87/11/23 @(#)strtol.c 6.1 87/11/23 000000000000000000000123456789abcdef0123456789ABCDEF @(#)fgets.c 6.1 87/11/23 @(#)stdiom.h 6.1 87/11/23 @(#)filbuf.c 6.1 87/11/23 @(#)fopen.c 6.1 87/11/23 @(#)rew.c 6.1 87/11/23 @(#)dowrite.c 6.1 87/11/23 @(#)print.h 6.1 87/11/23 @(#)atoi.c 6.1 87/11/23 @(#)ctype.c 6.1 87/11/23 ((((( H @(#)ecvt.c 6.1 87/11/23 Fn CAy7Aׄ@È@Y@$ @(#)memccpy.c 6.1 87/11/23 @(#)findiop.c 6.1 87/11/23 @(#)fwrite.c 6.1 87/11/23 @(#)stdiom.h 6.1 87/11/23 u!ߋ H>.text .dataH@.bss66>/ 0  !2$0  n`[Wh8<@DH@LЧ~P#pz6zp@ ;P@()>l^W^d;L@0Q`@8^q@8@8 p@ (2>D#p*q$\q" {@ ؊y .!8R R $  *xf [!l  \X(!:@("p@ ;P4$=X  ! ܓ"@ !@  !(2<,! !!p ^!zppz1<-qRN!Rp ] & V +'s1"& 21{''s1"& 21 p ]o2 1@ 4!1 x p )!(  ($ n!  {@0+;Z^dQ^d @0!"!@0(1@02Wnd(;L @0;L*: !^dQ^d%!^`Q^`lp# xp09q:pBp \ ,q  :F,qH,:$p!\! !p@ R }-9&( !0 .9N$9zH1@9q8n`1qg9d $!q$!q~PǎLǞHǮDǾ@<8hhWH<@~Dp@8p@@vD' "pp@@<q,Dp@@q~Dǎ@Ǟ<HHWP<@DH~Lp (! "(! pW $ ` %(q!nq VBp@H4q s!& @pq;&pq;(q* ;T!;T q*;X!;X ;Xqzq <;T!;T q ;X!;X ;Xq0q s!&  ;T!;T 0q s!&  ;X!;X ;XqXpR׵;ץ;( *g* zFXpR׵;ץ;(z *f z(qN(q4q s!& @Pq'q &D ( @~LǎHǞDǮ@Ǿ<PPW ;TN  ;T;XW8J88WPDH~Lr@Xr@`r@h r@prv!rZxq /(q(8V@x( @dF@@ r@@`VH@ " xl p!dp(Wf@ d8@DqH,@p +rlST  h0TF 0#K&p@R5 @L @ 2@@pc @!.2x@@O6R@7!q2" \@AA AAPAXjAoA $~@ho@`oA(`,~LǎHǞDPPWH<@~D;PAP"APAXA`Ah@2@(ar  p&AhA`zp ,,ApAhAxA`Np;q(AXAhAxA` ptp@ A`Ah p0A`p ;p,AX,qAhA`Ah !!(  !    ܋ X =! pW w a! p W R pA Ah§A` AhppeAAA nAA FAA!bApA`  A7AA@.p""V1 4 p.,  A*Ap- A r A ?A`,A` AXAX2A`AXQAhA`  4 A ?&#p a! zq L A`"p1 #!AB! B~)pA`AXA`A`Ah0BB fBB N $ րAhB$ ApsB + - , PA`(PAXAPBBA @ ` 0B(Ax A ZB001"Bp, BxAAA AA4bXրApBAxZArq =LA` JB(AnA <@^!b'T\zB<  A V-((A= tBApAx`Q(Ah(A`(  6^"B0/bBpxBf@B0Bh6RB0ePBp  BpBeBBpehBBzBؓh H*B BsdH < @HB0YBz\B  DB0e dJ   10BBd&BpB BBcBBcxB0fBB0d  4Bf 1xA Ah0ApR##5% A`0Ax#  ! A! A2B0c,Bp   0A Ah0ApR##5% A`0Ax#  ! A! AL@( @? @@@@ȋ6ZA` Aps  B & '8h@@@@xp<,  ~Dǎ@Ǟ<HHWP@DH~Lp 40X9P  0! 9㶀@ p pAppqp  ?!6`T . /@ !8pW ^$@p pAX0p pAX D E8`pAX/RAxx( pApApx( pAx#PAX  xpAxpAX a! z 4pApp1A! xAx(B@ p D ppAp(Ax( ~LǎHǞDǮ@PPW8A`ȎAXA`AhAhA`(F88W0 A`Ў0ApPAx`AhPA` `Ahn00W8A`Ȇ88W8AhAp(A`Ax( v88W8ȓ p l nF AP! AP l B! B nBB^88WH8<@~DB  j@p@f~fAAB07!q2" @*܋0 ( !\pB0 @!q q !*f9d N@e f(p@B01'q2" B0)~Dǎ@Ǟ<Ǯ8HHW8BȆ^bBBp'nBp N88W8] BxAB]B(A88W@~<\\Ax ApQ(AAhPA`Z0Bph@^N =p<@NNYBpCBp A v~<@@W@~<pp$0A((B(PPBBAPBІ\"B?0sB00 "B Z@ BxPBx@P@   Bp$BpApppt A(K,~<@@W@@ Bx@ Bxn@2@Bx F@6?!YlBx? Bx@@W@8~<ր@pEJ  @   !"'qG( qE.E >E\.E. E.EE~<ǎ8@@WPDH~LpGހEBBBpG WB2E(TGpGq PBG(L@8B %G0@4 ?pGq BG(pGG( Bx(q0 "  B ! B JpGJEI)n X&B JAX ApAXs  B AXAXRJB  ~~LǎHǞDPPWP@DH΀~L֠AhpG JvJlEI(2V W<B ApJs  B JB  nGp@0B G'0@2?BpG'V΀pGAx8B B q  PA`( Gp@0B G'0@1?BpG'U~LǎHǞDǮ@PPW@8~<pJ AXAx J((:S  Bx`J( J(4J J Ax0AXAx!80AX(ABA(C@Wa~<ǎ8@@WXHL~Pq@ ϞT !D68~& 62!1 @  )  % \ %F@( @2!18 \,( %)0\2)pq[ !T@6TDPpX@`R@XQOD(@ <>T42@4QTR   Q8~PǎLǞHXXW8Ȇ:A0A((>nfAQ@@/J0J8/P 288W8ȓp@A $ AhA`88W0~ Ax@CsCpCrtpAxpAt@(B@AxP(AXA~W AxAp(p*110AXA0C1(20AxAXAx( AXAW@8~<pހE@J@ r$ pJ@1(2" ~<ǎ8@E@W@8~<AJHpEJ@ @ *pJP4!bJ@'q JH Es  JH~<ǎ8@@WPDHs~Lq qp  BxJ@"JX J`JXL`JXTJ0,J` 0J8*V?vNf! J`DJXpL  J`J0,J` 0J8)?J`J0x L`N`B1!C00N` 0J8)h?Mx! N`V"MV! L`4L`p~LǎHǞDPPWH@~Dr p J WAxAp ~Dǎ@HHW@~<HJHA !B(P`BJXBKpAH HzKAI@4J8J0(J0 tA IPA PPhPPpPAxPApPAX0(J(~<@@WPDH~L@!,|~D E8p~PR\( q \!qN("햓Pq p!q*!q !pApF! Ah(,A`(   ! xAx(P dQR`pApJQ:! pAXP@ApApAxAx(~LǎHǞDPPWH<@~DAhA`pGB q I( A`(ހEpG'q!pAhAh A`Q(AhAX~Dǎ@Ǟ<HHWH<@~DPxlpAhPPP zP2 P@HPP`! B4A!7# P`! B(! P`~J pqA`pA`xA`( &#Px#~Dǎ@Ǟ<HHWPDH~L(  $D E9ހPp\qp qzV;P;P$P@ qAPp@ AP0y(qR(&f !P %@P6PPQ7趋6P86 8P6PPPp g@ !p@ @ 1Z9!Rr@  009!(qq @ ~LǎHǞDPPW JPE "1 2" JPWH<@~DPPP"PPQpPPPxހEpGސPPxq@@( & @@ @H"pv!0 # L   1!> @0"1!0!p"";p1;(#p"'qI(l !]ր@HE G@HI( qހEpGq~Dǎ@Ǟ<HHW@48~<p*qI(( ~<ǎ8Ǟ4@@WH<@~Dp“J'$A p.pAx8x4֐Ax2֐A`pAh'x1 (pAh(DspAXnzpD(0AXN D:'(A~Dǎ@Ǟ<HHW 0( (1W8AhA`(  AhAh88W8D@0^88W@ 8~ X(>ҋ.DB> dpd*>0Rq, ~@HHW@X B R!0H R2" R 0\2 :2>,< 0-2 82 z ! \ 0\20!@d $s&"0#0!s#'"0#0!'"0# R# R R((RXRz =* X@@W`@D~Hp;T.N:TÎT TT.N:2-  pȓnD E70pApF! Ah(,A`( 0! xAx(pApfPX pAXx ȓjp 4aqiq cq5 qzpAp&qxώHq@\qp  \!qF("fp*! !ޜp6&H@ AhA8pAp@xAx(~Dǎ@HHWXDH~L@q|7<pAB 7 BHB!0 (@ @  ,B(0@ ?BI JAۮ 6^AP6 z5@`7 @X6@p 66pT P4p 4vpP T4p PT4D(| x8(pP T3p TP~LǎHǞDXXW8ȓ3788W@8~ RR4p &RRPR~HǎDǞ@``WRRR 0(R 9(RRW@~<pRR-DPRe0("9(Rr JPRe0(9(RRR~<@@W 1C~App~W@RR=PRe 0(. 9("R>? >=R@@W@48~<RpR  'RH'q2)#RR , RR~<ǎ8Ǟ4@@WA~r RdL( Rπΐ (! ΀."!(  R~ǎǞWW1 ~:BI0A@t@(G@q@(G@!B@J @@( ~WH<~@p`D<DjDԋ&D!DD ~@ǎ<HHW ~Ap0 470 400 40  ~W 2!1WAXPpAxPhR A2$10ApAx(BWAXPpAXPpAxPhAxPhAp  Ax PhQ( % Ph(0AR!@A1  2WP<@~DP&HqQ& &p0+(00T0+(00 (0-<ސ&T ;`-S`*ސ&\;`+S`b&p<&Qp!p!&&p\S`;`&S`JKLJ  *&t  &h*   *&  &*fJ"*X?"&& &p!&H'" :Sh ;;` VS`;` H :<&p&&H@QP&Hj&ShLMLJ  )Z&  &)6 b  )&B  &(L"(&P&H`pQP&H&QP&H?t!0:# 0;# &P&Hbp"273%#" ;Lp-"p+@0&P&Hp&@Z &! & ;@Sh&ShNOLJ  'v&L  &P'R ~  '6&ԓ^  &'N"'Q?P&H;4P&pR-+@"&p&@QP&HL&P&H`pQP&HQP&H&@Sh~Dǎ@Ǟ<PPWH@~Dpv  L;h(Z;hT";h ~Dǎ@HHWP~@p  'HD.Hx |D H p ;xp ;xDp !   ~@ǎ<Ǟ8PPW@8~<pp׀;xp;x)' hp!d' X'~TǎPǞLǮHhhWP8<@D~H pq=x p=x)'h  L  Lrh^L~HǎDǞ@Ǯ<Ǿ8PPWH@~DpqZ' f~Dǎ@HHW8088Wp: J[B8ȧTT.X88W0<@DH~Lq(@ ހ(H /`(8.P P*/p(W d(<PP!9TX"@B/r!4CA@(XPHq%( 6 NP)  /~LǎHǞDǮ@Ǿ<W0~s@1tC@ p:G @ /$A B!  1~W@8~X&  pZ p  ~LǎHǞDǮ@Ǿ<PPW8>X88W!1021!0W !  W!2! W!21!0W! W2!10B!0 W2!@4(ARQ!P4AQW!120WH<@~Dp   p-pa(^a( 2r w4    ( " 6   0+       ~Dǎ@Ǟ<HHW)p .(  W8 ȧ~4p)p.q.(~488W@8~<pp ~W  < r /  ~<ǎ8@@W8 ȧ~4p T g "Q%(   ~488WH<΀ ~@q R  Bb p-p'(! ,>     BG G!     g   ,Q"%(  D b j D p     ~@ǎ<HHWH<@~DpǐLJ D   p-p  p-p' (. (    ~Dǎ@Ǟ<HHW8 ȧ~4p  *        |'Q!R D D p-p%  ' p-p7! ,~488W@8~<p  ( ppPSW-p( pp.x-p^뜧*    p-p& ppPSW-p~W @  ~<ǎ8@@WP pR-p a!` !W@~<p.`W .`&0 2  &'  ~<@@WX?@DHLP/L~TRp/XL 4& q  p :(T (, xX/` P0/l ( /H"( !%$//t~/!0A21 Z2#!! ~TǎPǞLǮHǾD@XXW@8~<p,Pχ\ /! ~<ǎ8@@W!![W![W2![W[W![W!)[vW. >$.;0[FW!;0[$W[B2!>[ W[ ކW![ W[W2!6[W!%[W! [jW2![TW2![8W[*W*[.WC2!,[W2![W[/W /[//W!00[bWH .(N0n8@HPX` W`X .(N0n8Ɏ@ɮHPԩة>^觾[![W [W<[W [tW 90[XW[:. W2![W/WPT.>0 PPWH<@~Dy p$*aP/R0*aP/Rq XqHa( z(  ы   ~Dǎ@ Ǟ<HHW2!A@BA!@10@AWp>>>>>Ǽ? @P PP?$PpRU-pP?$%py}kg,P?$(VP p:w]ѡ[q" ,?(0?(ְ?(Fp?@c(stdxX܋ `? d`? P?$([P  ,?(0?(ְ?(`? d`? (P?$[PQ̡P! ! ,?(0?(ְ?(`? d`? 'Π- 8ы0):@0CAMр ѡ(P?$[P Q фP р}-!ш},?(0?(8ְ?(`? d`? / q4pфыh`? d`? / q4фы4?>?`? csd(u$+\-` d#h.l*x0Āelh%ox0XeEfgGn9ld`?  ?d`? @ ? ? "  !?`d`? }>; -!10>@@ V 8@  /  +!10>"  /  !10> @ /00 0ѡ $@ZPECѡMѡ p? }? u?? ^d`? } pq 5#"0ѡP n b V J@ ? 6@ *?d`? ? ? d`? ? @     0 9: @ ? ?z ?WC04p_D04_D04pd`? - ?p&@ 4??  a@ '? -?? pX Oo620>x 0 >>"X>  ??   @ / & ? g `h`? ? 0!#и>0?,@?0ȧN(> D>8?0 - >>D  5  + >> >>g ю 0ѡaP? P .aP6 QaP P?P? ׶`?p?8g> 06P?,QPU):RECAaFSRQaVrgaga?,- +aea E`>rvp??? #2#: @ / & ? g `h`? ? 0<#0?,@?0ȧN(>>8?0`? P?,/Q)-0!->! >B +>! >   >! >E00@qA0- '1qA@Aq@ `  .'qF<Ad &$ ? ?A@> QP&#1qA@Aq@?@p?`? #H ? @ & ?  ! ? g `h`? 0#>0?,@?0ȧN(>Z>8> ?,`?  FF=11=CCAM 0AMAP?,VA@? E@? p?}@>g?d``??  >  ? ??? @>p>>/4H,?(0?(Vְ?(zkg(P?$(VPp: w q&4H,?(0?(ְ?(@>p>>@ekd,?$( >DA4>,?(0?(>>ְ?( ֠?>/4\,?(0?(Fְ?(Jkd(P?$(VP@:0D A&4\,?(0?(ְ?(>pTkg(?$( wq( ,?(0?(ְ?(     / ֠?>/4\,?(0?(@ְ?(Jkd*P?$(VP@<0D A&4\,?(0?(ְ?(> fp?p\kg,?$( >wq,>,?(0?(tְ?( ֠??/4H,?(0?(,ְ?(Jkd*P?$(VP@< D A&4H,?(0?(ְ?(H{ p   ?$( @  .@ , 2 ! . 00  +   R  p>ؐ>ذ>>>WP@DH~Lr @D''!'V )70) ~LǎHǞDǮ@PPWPHx~Lp(,j~LǎHPPWPHx~Lp(,"~LǎHPPW`?8<@DH~Lp.ޠ??:T 2p? p???p  :X ސ4 ?Jp  C@:8 6p  : @$:@$ 1 P@$`^P5%cR:W^XP'86 0":B0C9"5 4r+!+ @$0:  ?05N?:@ 5p  5 @$0:  ?( ?( ?:?( 0 &009 4 @$05p (  5(T? &1?  &0   9( ~LǎHǞDǮ@Ǿ<8`?`W   ?  ?0 6    W6    WX<@DHLPҧ~TsRNW  ( ( D  \ pױ-p'(R (> )`     ,݆   aP/\ +! (() )((Ζ  ' p-p7! ߐBW  D ,,-V ܴ ~TǎPǞLǮHǾD@<XXW0@ A#1 ! 1W@(#)ed:ed.c 1.45 < 8 X $ l P p     eaeHOME-sp:qxusage: ed [-s] [-p string] [-x] [file] file name too longLLLLLLL(L LLLLLLLhLLLLLdL4hLplt4x(read may be incomplete - beware!ed.hup/ed.hup'\n' appendedline too long: lno = line too long: lno = !-csh/bin/shtoo longtab count -csh/bin/shLM M<M<M<M<M<M<M<LM<M<M<M<M<LL  $ < P ` t      !!$!0!<!T!t!!!!!""","L"X"t""""""##4#P#d#t######$$0$D$`$x$$$$% %X%%%%*&&Ra $Ha2 (Hc 7c2 1c3 "&*.26:>Cf p !%)-159=s 7u ,----write or open on pipe failedwarning:Z[ expecting `w'mark not lower casecannot open input filePWB spec problemnothing to undorestricted shellcannot create output filefilesystem out of space!cannot open filecannot linkRange endpoint too largeunknown commandsearch string not foundline out of rangebad numberbad rangeIllegal address countincomplete global expressionillegal suffixillegal or missing filenameno space after commandfork failed - try againmaximum of 64 characters in file names`\digit' out of rangeinterruptline too longillegal character in input filewrite errorout of memory for appendtemp file too bigI/O error on temp filemultiple globals not allowedglobal too longno matchillegal or missing delimiterreplacement string too longillegal move destinationno remembered search string'\( \)' imbalanceToo many `\(' smore than 2 numbers given'\}' expectedfirst number exceeds secondincomplete substitutenewline unexpected'[ ]' imbalanceregular expression overflowregular expression errorcommand expecteda, i, or c not allowed in Gend of line expectedno remembered replacement stringno remembered commandillegal redirectionpossible concurrent updatethe x command has become X (upper case)Warning: 'w' may destroy input file (due to `illegal char' read earlier)Caution: 'q' may lose data in buffer; 'w' may destroy input fileEncryption of string failedEncryption facility not availableCannot encrypt temporary fileEnter key: @SHELL/bin/rsh 87/11/23 @(#)tmpgetopt.c 6.1 : : optioncommands: illegal : illegal -- -- : illegal : illegal -- -- requires an argument -- requires an argument --  @(#)cryptio.c 5.1 87/05/29 p[0] not from same run_setkey as p[1] exec /bin/crypt -p 2>/dev/null @(#)p2open.c 5.1 87/05/29 rw-csh/bin/shp2close(fp1, fp2): fp1 not from same p2open() as fp2 @(#)calloc.c 6.1 87/11/23 @(#)execvp.c 6.1 87/11/23 bblbbbbbshPATH:/bin:/usr/bin/bin/sh @(#)getenv.c 6.1 87/11/23 @(#)malloc.c 6.1 87/11/23 @(#)memset.c 6.1 87/11/23 @(#)mon.c 6.1 87/11/23 PROFDIRmon.out @(#)perror.c 6.1 87/11/23 : Unknown error @(#)sleep.c 6.1 87/11/23 @(#)data.c 6.1 87/11/23 SSSUe-p @(#)fdopen.c 6.1 87/11/23 @(#)findiop.c 6.1 87/11/23 @(#)flsbuf.c 6.1 87/11/23 @(#)stdiom.h 6.1 87/11/23 @(#)fprintf.c 6.1 87/11/23 @(#)tempnam.c 6.1 87/11/23 //usr/tmp/TMPDIR/usr/tmp//tmpXXXXXXAAA/u @(#)errlst.c 6.1 87/11/23 0x00000001 1 101D1X1l11111111222(2<2P2`2p222222233(3D3`3p33333.Error 0Not ownerNo such file or directoryNo such processInterrupted system callI/O errorNo such device or addressArg list too longExec format errorBad file numberNo child processesNo more processesNot enough spacePermission deniedBad addressBlock device requiredDevice busyFile existsCross-device linkNo such deviceNot a directoryIs a directoryInvalid argumentFile table overflowToo many open filesNot a typewriterText file busyFile too largeNo space left on deviceIllegal seekRead-only file systemToo many linksBroken pipeArgument out of domainResult too largeNo message of desired typeIdentifier removedChannel number out of rangeLevel 2 not synchronizedLevel 3 haltedLevel 3 resetLink number out of rangeProtocol driver not attachedNo CSI structure availableLevel 2 haltedDeadlock condition if locked @(#)isatty.c 6.1 87/11/23 @(#)mktemp.c 6.1 87/11/23 000000000000000000000123456789abcdef0123456789ABCDEF @(#)dowrite.c 6.1 87/11/23 @(#)print.h 6.1 87/11/23 @(#)ecvt.c 6.1 87/11/23 Fn CAy7Aׄ@È@Y@$ @(#)fwrite.c 6.1 87/11/23 @(#)stdiom.h 6.1 87/11/23 @(#)memchr.c 6.1 87/11/23 u!ߌ: mp.textm .datappnp@.bss-- 0  !2$0 p"<[W@ 0 0(0004080@0x00IIlжl|||׶0I8]0@xHPX`]0hlpضx0( ;"00 n(! 0e#(! pW0(!0( ;N0000FH(00!H ;@DZ8ȋ&00!G0(0("0000 - I0X00000(0(00000(0(`F9x I!0($6 00!00$0(0(ؓ>9h@@WP@DH~L֐]0]0 #]1 n ]0؋"]0N^]0؋P  ;؋I08$ ]0El8LPI4 E48Iǁ !IǑP , ;I @($ ]0D7I08$ ]0Dj7JPIIǑI !@($$ ]0D 6P ! !(! ^ !(! n P(! 0:#(! p(W }(! 0a#(! pW8 ]0CJ6*I!!\I ! IV `` IRp(!  8I($T ]0B5II$ ]0Bt5T``lBH5(`p I!II+!I$ ]0A4ȋ I$ ]0A4! p040($ ]0AL4,'q1q0p0$| ]0@3‹P0 ! p0  H0($ ]0@3rIIpI!!I$ ]0@@3 Q \!$ ]0?2II I"!Q \!$ ]0?d2DII I$!I$ ]0?1Q \!$ ]0>1II VI ! BI ! .I ! I ! I !I !! Jx!  &!20Ix I! hp020($ ]0=h0H'q1q0 pBQI%Q"' !20I`0 I! 0 !0  H0($ ]0</`BI*!0I !I(! I !I&!I$ ]0;.! $ ]0;.II `I#!PI !I 0!.I)!I$ ]0;,. I%!I'!!0II @00+08$ ]0:-|PIIǑI @($ ]0:@- I  08$ ]0:,Q g"I !ȆI !Pe 1( 9(v0q!0R9!Jqq$ ]094,؋IqQ pI!!Q PI"!Q wX! $ ]08v+Vē8R+2 (8q (ߡ8D (8 Ipxq(ppI (850 (!"87*`! I"p!xI,!! $ ]07)6) (8q (ߡ8D (8 IpxDq(ppI (84F0 (!"86(! I"p!xI !I !!0II08$ ]05j(J@($ ]05>(I  8I($( ]05'I!< ;  ]04'I~LǎHǞDǮ@PPW! 0\#R! 0"0(# #09(# 08Z0 @ $# 00#0 #؋  08dW8 ~4pH0(0( &V0000V'\!,qPP- -zqPP-V- BX'\!0q'0!PP-  -qPP-tq \N!!! (!2!!qP!!!(` 11 2K~488WH@~DpP$.qq,P/ \VP\! @000!րX 0( 9((xq.  q   p( H0(#q؋~Dǎ@HHW 0!2W! 0\#! ؋W@8~<րxp"X (~<ǎ8@@W@~ $ qd qPP @X&Xqp0  qKPހ]0J؍ؓ !h(؍ ؓX ! 00@( P:~Dǎ@Ǟ<HHW8 $ : (]0(2!0*88W@~<p j`h' d<*>$ '2 h~<@@WH<@ ~D``pހ]0p|hq( &   :p!0 # H  !0128 :!0!p""-p1-#p0'q0 0(Z!Yր ]00| $0( (q!ހ]0p|qh~Dǎ@Ǟ<HHWH@<1@~Dt0(q!0(Z(~Dǎ@Ǟ<HHWH<@~D( ( p(W0000( P0 2PHxP؍qؓ܋$!q؍ ؓ   vPP b]0q qPP 8 q'q hXX PГZp]0l!q hhh phl!q hdpl]0!q p4pp pp]0 |(!q p|(ؓ8 xN؍qؓx$!q؍ ؓ,  Xp]0||؋,W%0 (# %0 # '0#`ހ8 0(! * \ء! ||8!2" q7!q2 0(! * \ء! ||d'!p"ׂ(8 0(! * \ء! |^|8!2" q'  ء! |p]0J؍ؓV !qh(؍ ؓ ! 00@( |]0 08XPh00@( .h!hh 08XPJh>p]0L؍ؓ !qh(؍ ؓ  p]0P؍qؓ \$!q؍ ؓ  p]0J؍ؓ !qh(؍ ؓ ` ! 00@( ؓ 0!0 00( PZ0:XQp]0J؍ؓ n !qh(؍ ؓ ! l *hhX ]0,p]0|'q pl]0'q p|lh'q p,p]0q~Dǎ@Ǟ<HHWH@~D@8(>08 p088 8pzb8(P08 p"080( H8 8&pl( q6PP@~Dǎ@HHWH@@~Dq χ0 1 ~Dǎ@HHW@~<0<0jP0evN؍qؓ$!q؍ ؓ !0 p L  ! ؍  !ؓ2 2! ܡ,!!11000@0~<@@Wp [BX?@DHLP~Tp-r-b 0 - ,p$- - --p  ԋ pppx-p q-  ( ^X  `! 01'q2! 'q/ ^ !' :Gq21304!:'q.h,/ hH-- -P-q9(9#0@@5601 0- -) ~TǎPǞLǮHǾD@XXWH@~Dhp pp~  " P   x! h~Dǎ@HHW!21!0W! W2!10B!0 W!120WH@~Dp W & !   D 6ހȋ  @  (  ! p!!7  R   .   W    ~Dǎ@HHW8 ȧ~4pȋ.q(~488W@8~<pp ~W  < r    ~<ǎ8@@W8 ȧ~4p T g "Q%(   ~488WH<΀ ~@q R  Bb p'(! ,>     BG G!@    g   ,Q"%(  D b j D p     ~@ǎ<HHWH<@~DpǐLJ D   p  p' (. (   ~Dǎ@Ǟ<HHW8 ȧ~4p  *        |'Q!R D D p%  ' p7! ,~488W@8~<p  ( ppPWȋ( ppЧȋ^l*    pȋ& ppPWֆW @  ~<ǎ8@@WP pR a!` !WH@~Dql l~Dǎ@HHWH<@~Dr '$~Dǎ@Ǟ<HHWH<0@~Dr 0 (+R a(a( <r NwX   @   "   j t  )r!  )a!"  p~Dǎ@Ǟ<HHW@~<p.`W .`&0 2  &' ^  ~<@@W[W![W[W2![W2![WC2!,[W2![W[hW [<W2![WW@8~ PPWP48<@DH~L.`H.h! .`.`! .h.h.t.`.p.t.|ր.pqpN$.p.| .|x((lx! ( 2.t.`  !(hր.|x.tp0qp((q$.t .|sqp'( (&    .tp.|p  P.t! .`!.t xF p.p(P.p.x.p .|.p.|~LǎHǞDǮ@Ǿ<84PPW.p! !.t! .|WP<@DH~Ly   s  Rq(+p#X((p(psp.x~LǎHǞDǮ@Ǿ<PPW0+K "AC1!WAC$AhAC%hAC&hACWQWPX%AC1QCGxBBSD"vt ('"AC8('p'"$AC4$X$AhAC!FhAC" QP&#1qA@Aq@/@p/`/ #H / @ & /  ! / g `h`/ 0#.0/,@/0ȧN(..8. /,`/  FF=11=CCAM 0AMAP/,VA@/ E@/ p/}@.g/d``//  >  / /// @.p../ `,/(0/(ְ/(zkg(P/$(VPp: w q& `,/(0/(<ְ/(@.p..@ekd,/$( .DA4.,/(0/(..ְ/( ֠/./ t,/(0/(ְ/(Jkd(P/$(VP@:0D A& t,/(0/(,ְ/(.pTkg(/$( wq( ,/(0/(ְ/(     / ֠/./ t,/(0/(ְ/(Jkd*P/$(VP@<0D A& t,/(0/($ְ/(. fp/p\kg,/$( .wq,.,/(0/(ְ/( ֠/// `,/(0/(lְ/(Jkd*P/$(VP@< D A& `,/(0/(ְ/(H{ p   /$( @  @ , 2 ! . 00  +    p.ؐ.ذ...Wȋ (  WP@DH~Lr @D''!' )7H) ~LǎHǞDǮ@PPW2!6[WPHx~Lp(,j~LǎHPPWPHx~Lp(,"~LǎHPPW`?8<@DH~Lp.ޠ//:T 2p/ p///p  :X ސ!( /Jp  C@:8 6p  : @$:@$ 1 P@$`^P5%cR:W^XP'86 0":B0C9"5 4r+!+ @$0:  ?05N?:@ 5p  5 @$0:  /( /( /:/( 0 &009 4 @$05p (  5(T/ &1/  &0   9( ~LǎHǞDǮ@Ǿ<8`/`W   ?  ?0 6    W6    WX<@DHLPҧ~TsRNW  ( ( D " \ pױ'(R (> )H     ,   aP/\ +! (() )((  ' p7! BW  D ,,-V  ~TǎPǞLǮHǾD@<XXW0@ A#1 ! 1W @(#)sed0.c 6.1 87/11/23 @(#)sed.h 6.1 87/11/23 L8rCannot open pattern-file: %s Unknown flag: %c Too many {'sllllllllLll \ lllllll \ <ll H p lll\lp llll4wwFirst RE may not be null Too much text: %s Unrecognized command: %s Too many commands: %s Too many }'s Duplicate labels: %s Too many labels: %s Too many labels: %s Too many files in w commands cannot open %s Too many files in w commands Cannot create %s Too many commands, last: %s Too many line numbers Undefined label: %s (sed: command garbled: %s Too much text: %s Label too long: %s No addresses allowed: %s Only one address allowed: %s Suffix too large - 512 max: %s @(#)sed1.c 6.1 87/11/23 @(#)sed.h 6.1 87/11/23 %(x$'(x%%'(x&(%L( (x&(x(x(x(x%,(x%@(x%Can't open %s output line too long. Output line too long. Output line too long. /0$023P86867d41\9:P:P:P3D9l56:P0:(1x112 9%s %s %s %s %s Too many appends after line %ld %ld Too many appends into hold space Too many reads after line%ld r0,($  \177 @\37\36\35\34\33\32\31\30\27\26\25\24\23\22\21\20\17\16\15\14\13 ->-<\07\06\05\04\03\02\01 @(#)mon.c 6.1 87/11/23 PROFDIRmon.out @(#)perror.c 6.1 87/11/23 : Unknown error @(#)data.c 6.1 87/11/23  @(#)filbuf.c 6.1 87/11/23 @(#)flsbuf.c 6.1 87/11/23 @(#)stdiom.h 6.1 87/11/23 @(#)fopen.c 6.1 87/11/23 @(#)fprintf.c 6.1 87/11/23  @(#)errlst.c 6.1 87/11/23 px(<Pdx  4HXh  <Xhx.Error 0Not ownerNo such file or directoryNo such processInterrupted system callI/O errorNo such device or addressArg list too longExec format errorBad file numberNo child processesNo more processesNot enough spacePermission deniedBad addressBlock device requiredDevice busyFile existsCross-device linkNo such deviceNot a directoryIs a directoryInvalid argumentFile table overflowToo many open filesNot a typewriterText file busyFile too largeNo space left on deviceIllegal seekRead-only file systemToo many linksBroken pipeArgument out of domainResult too largeNo message of desired typeIdentifier removedChannel number out of rangeLevel 2 not synchronizedLevel 3 haltedLevel 3 resetLink number out of rangeProtocol driver not attachedNo CSI structure availableLevel 2 haltedDeadlock condition if locked @(#)getenv.c 6.1 87/11/23 @(#)isatty.c 6.1 87/11/23 @(#)malloc.c 6.1 87/11/23 000000000000000000000123456789abcdef0123456789ABCDEF @(#)findiop.c 6.1 87/11/23 @(#)dowrite.c 6.1 87/11/23 @(#)print.h 6.1 87/11/23 @(#)ecvt.c 6.1 87/11/23 Fn CAy7Aׄ@È@Y@$ @(#)fwrite.c 6.1 87/11/23 @(#)stdiom.h 6.1 87/11/23 @(#)memchr.c 6.1 87/11/23 u!ߌMB 60d8.text60 .data6@.bss--d8 0  !2$0 ؓ"[W<@DHLP~TϹ -{' !0f(20T0f(20 0q# &0t#,0 0 600($ !x'gC$x 46f 00 p r Hq H00  H00 /&'H!X@"00"'H!XH"00 H00pf X $0    .X  ! HX0Pzqp}p&QFq~TǎPǞLǮHǾD@<WPDH~Lp 5ЍxX'<0 ~555bxl' n5 `65z8PCP5PCP55 ($5@ V  C ~ DC"PPP PPP 55؊0PB B(\5 BH5 PpaP/R B(" P @ ( 0 ZC  P5%P5! 40P9' P0(4P B B0P"#0@# 5Г ~LǎHǞDPPW@~<BzBBz 20 ppB p B(BH h\BzN` X`pB B `12$020~<@@WH<@~D5r P` 5' .` p 6~Dǎ@Ǟ<HHWWp[BX?@DHLP~Tp-r-b 0 $- p$- - --p  l pppp-p q-  ( ^ b ! 01'q2! 'q/  !' :Gq21304!:'q.,/ H-- -P-q9(9#0@@5601 0- -) .~TǎPǞLǮHǾD@XXWH@~Dp( pp8~  |$" lP   P ! @~Dǎ@HHW!21!0W! W2!10B!0 W!120W8 ȧ~4pX.qh(~488W@8~<pp ~W  < r    ~<ǎ8@@W8 ȧ~4p T g "Q%(   ~488WH<΀ ~@q R  Bb pX'(! ,>     BG G!h    g   ,Q"%(  D b j D p     ~@ǎ<HHWH<@~DpǐLJ D   pX  pX' (. (   ~Dǎ@Ǟ<HHW8 ȧ~4p  *        |'Q!R D D pX%  ' pX7! ,~488W@8~<p  ( ppPpWX( pp`X^|*    pX& ppPpWXW @  ~<ǎ8@@WP pRX a!` !W@~<p.`W .`&0 2  &' n  ~<@@W@\.`Pt.\(0 2 t . h t  @@WP.p0>@DH".L @.M.p.@ x.DPPW[W![W[W2![W2![hWC2!,[W2![8W[ W [W![W$[W 90[W2![W@8~ PPWP48<@DH~L.`H.h! .`.`! .h.h.t.`.p.t.|ր.pqpN$.p.| .|x((lx! ( 2.t.`  !(hր.|P.tp0qp((q$.t .|sqp'( (&    z.tp.|p  P.t! .`!.t xF p.p(P.p.x.p .|.p.|~LǎHǞDǮ@Ǿ<84PPW.p! !.t! .|WP<@DH~Ly   s  Rq(+p#X((p(psp.x~LǎHǞDǮ@Ǿ<PPW0+K "AC1!WAC$AhAC%hAC&hACWQWPX%AC1QCGxBBSD"vt ('"AC8('p'"$AC4$X$AhAC!FhAC" QP&#1qA@Aq@/@p/`/ #H / @ & /  ! / g `h`/ 0#.0/,@/0ȧN(.r.8. /,`/  FF=11=CCAM 0AMAP/,VA@/ E@/ p/}@.g/d``//  >  / /// @.p../#,/(0/(Vְ/(zkg(P/$(VPp: w q&#,/(0/(ְ/(@.p..@ekd,/$( .DA4.,/(0/(..ְ/( ֠/./#,/(0/(Fְ/(Jkd(P/$(VP@:0D A&#,/(0/(ְ/(.pTkg(/$( wq( ,/(0/(ְ/(     / ֠/./#,/(0/(@ְ/(Jkd*P/$(VP@<0D A&#,/(0/(ְ/(. fp/p\kg,/$( .wq,.,/(0/(tְ/( ֠///#,/(0/(,ְ/(Jkd*P/$(VP@< D A&#,/(0/(ְ/(H{ p   /$( @  @ , 2 ! . 00  +    p.ؐ.ذ...WP@DH~Lr @D''!' )7H)\ ~LǎHǞDǮ@PPW2!6[WPHx~Lp(,j~LǎHPPWPHx~Lp(,"~LǎHPPW`?8<@DH~Lp.ޠ//:T 2p/ p///p  :X ސ$ /Jp  C@:8 6p  : @$:@$ 1 P@$`^P5%cR:W^XP'86 0":B0C9"5 4r+!+ @$0:  ?05N?:@ 5p  5 @$0:  /( /( /:/( 0 &009 4 @$05p (  5(T/ &1/  &0   9( ~LǎHǞDǮ@Ǿ<8`/`W   ?  ?0 6    W6    WX<@DHLPҧ~TsRNW  ( ( D R \ pױX'(R (> )ߠ     ,   aP/\ +! (() )((  ' pX7! BW  D ,,-V , ~TǎPǞLǮHǾD@<XXW0@ A#1 ! 1W @(#)df.c 6.1 87/11/23 df: illegal arg -%c /etc/mnttabdf: cannot open %s /etc/mnttab%.32s/dev/dsk/%.23sdf: cannot open %s df: cannot stat %s (%-12s): bad block type %-6.6s %-10s (%-12s): %8ld blocks %7u i-nodes %-10s (%-12s): %8ld blocks total: %8ld blocks %7u i-nodes bad free count, b=%ld bad free block (%ld) read error %ld count = %d; errno = %d  (%-10.10s): is not a file system @(#)mon.c 6.1 87/11/23 PROFDIRmon.out @(#)perror.c 6.1 87/11/23 : Unknown error @(#)data.c 6.1 87/11/23 p p p(r X @(#)flsbuf.c 6.1 87/11/23 @(#)stdiom.h 6.1 87/11/23 @(#)fprintf.c 6.1 87/11/23 @(#)printf.c 6.1 87/11/23 @(#)sprintf.c 6.1 87/11/23 ( @(#)errlst.c 6.1 87/11/23    ( 8 P \ x      !! !$!0!<!P!`!p!!!!!!!"""0"@"L"d"x"""""###<#X#h.Error 0Not ownerNo such file or directoryNo such processInterrupted system callI/O errorNo such device or addressArg list too longExec format errorBad file numberNo child processesNo more processesNot enough spacePermission deniedBad addressBlock device requiredDevice busyFile existsCross-device linkNo such deviceNot a directoryIs a directoryInvalid argumentFile table overflowToo many open filesNot a typewriterText file busyFile too largeNo space left on deviceIllegal seekRead-only file systemToo many linksBroken pipeArgument out of domainResult too largeNo message of desired typeIdentifier removedChannel number out of rangeLevel 2 not synchronizedLevel 3 haltedLevel 3 resetLink number out of rangeProtocol driver not attachedNo CSI structure availableLevel 2 haltedDeadlock condition if locked @(#)getenv.c 6.1 87/11/23 @(#)isatty.c 6.1 87/11/23 @(#)malloc.c 6.1 87/11/23 000000000000000000000123456789abcdef0123456789ABCDEF @(#)dowrite.c 6.1 87/11/23 @(#)print.h 6.1 87/11/23 @(#)ecvt.c 6.1 87/11/23 Fn CAy7Aׄ@È@Y@$ @(#)fwrite.c 6.1 87/11/23 @(#)stdiom.h 6.1 87/11/23 @(#)memchr.c 6.1 87/11/23 .textX.data.bss-.text.data.bss-.text.data.bss-.text .data.bss-.textp!.data8.bss-p.text (.data8.bss.`.text .data8.bss.`.text .data8.bss.`.text 8.data8.bss.`.text 0 .data8.bss.`.text P.data88.bss.`.text P!.datap@.bss.`.textX.data .bss.`.text.data .bss.`.text``.data .bss.`.text.data.bss.`.text.data.bss.`.text.data.bss.`.text.data.bss.`.text.data.bss.`.text(.data.bss.`.text@.data.bss.`.textXX.data.bss.`.text.data.bss.`.text.data.bss.`.text .data.bss.`.text.data.bss.`.text.datap..bss.`.text.data# .bss.`.text8.data# .bss.`.text*.data# .bss.` .textX.data#.bss..text.data#H.bss.(.text/.data$0@.bss/.text0.data$p.bss/.text0.data$p.bss/X.text4@H.data$.bss0.text4 .data$@.bss0.text6@.data%0 .bss0_environ_exit_main__ndSaveReg0_sync_Flg0 _tflag0(__iobX_fprintf`_open_M00_read@_close_sprintfh_strncmp _printit_fd5_Fs_info5_Fs5_S5_stat_ustat_super@_lseekP_bsizeP_bshiftP_printf_nfsmes_alloc_blkno_buf3`_bread_errnocerror X_monitor_profil(_creat_write_perror 0"p.p_getenv_getpid____Argv_strrchr 2_strcpy 9C8_strlen _strcmpn __smbufpPX__sibufr__sobuf __stdbuf`\h_fclose _fflush T_freef__flsbuf __wrtchkLp z_malloc_isatty__doprnt_end(_sbrk|_brkX_ioctl0_realloc_memcpy/_ecvt0_fcvt0_fwrite44@_memchr6_btext_etext6_bdata_edata-_bbss-__startup_physblks__cleanup__countbase__countmax_sys_nerr_sys_errlist__bufendtab__lastbuf__xflsbuf__bufsync__findbuf__dowrite_Reduce_infu!ߌMC :hD.text:h .data;@.bss--D& 0  !2$0 " [Wx<@DHLP<~T H p 0 p 4 Hq H0   H0 /&'H!Xd"0 "'H!Xl"0 ` H߱0 f X $2    X  !$ HX0@pqpp$Q8Fq ~TǎPǞLǮHǾD@<xxWXHLP~Tpx '@   pT,C ~ @CP@PjPPPP(P0 '2P4  `P<P(z\PCPP( P(PB B(\P( BHP( PpaP/R B(" P @ (pFC ~ 0'C"'$,CpLC^C l<P*BP BГBq!2#C!0#'2J$J4AI$.($B C!0#'2J$J4ArG`.($rB P(!2#LB Pq̓.C!0#'2J$J4AI.($ CB0P!0#'2J$J4AxG@AxG AxG,.($z~TǎPǞLǮHXXW8$ 88WP<@D~Hp,  LLpǀp1'2בtסxz(H@80(L LLp  ~HǎDǞ@Ǯ<PPW :"4 mn2"'W Q!Q Q 0<- # -- p'-JF" 4#  m  n 4#  m  n!0F 4# m n$--Ć mn nD @2$21  D----W@8- ~<2!0!!1-A!42A!4"1#x(2"#"2A!42A!4"1#t't'"dt'"drt'"d\8 d# 2! 0!("d*~<ǎ8@-@W@!:#:#"0$0 #0*0W8 000  0 B!41 -RA!*P%00(# %09(# $@ < ^(2 400  0 B!4188Wpr[B@8~     BG G!P    g   ,Q"%(  D b j D p     ~@ǎ<HHWH<@~DpǐLJ D   p$`  p$`' (. (̂   ~Dǎ@Ǟ<HHW8 ȧ~4p  *        |'Q!R D D p$`%  ' p$`7! ,~488W@8~<p  ( ppPPhW$`( pp%h$`^ħ*    p$`& ppPPhW$`.W @  ~<ǎ8@@WP pR$` a!` !W@~<p.`W .`&0 2  &'   ~<@@W@\.`P |.\(0 2  | .  p . |  @@WP.p0>@DH".L @.M.p.@ .DPPW[0W![W[W2![WC2!,[W2![W[&W &[|&&W![RW$[W 90[0W2![W& WPT.> PPWP48<@DH~L.`H.h! .`.`! .h.h.t.`.p.t.|ր.pqpN$.p.| .|x((lx! ( 2.t.`  !(hր.|.tp0qp((q$.t .|sqp'( (&l   N .tp.|p  P.t! .`!.t xF p.p(P.p.x.p .|.p.|~LǎHǞDǮ@Ǿ<84PPW.p! !.t! .|WP<@DH~Ly   s  Rq(+p#X((p(psp.x~LǎHǞDǮ@Ǿ<PPW0+K "AC1!WAC$AhAC%hAC&hACWQWPX%AC1QCGxBBSD"vt ('"AC8('p'"$AC4$X$AhAC!FhAC" QP&#1qA@Aq@/@p/`/ #H / @ & /  ! / g `h`/ 0#.0/,@/0ȧN(.r.8. /,`/  FF=11=CCAM 0AMAP/,VA@/ E@/ p/}@.g/d``//  >  / /// @.p../*,/(0/(Vְ/(zkg(P/$(VPp: w q&*,/(0/(ְ/(@.p..@ekd,/$( .DA4.,/(0/(..ְ/( ֠/./*,/(0/(Fְ/(Jkd(P/$(VP@:0D A&*,/(0/(ְ/(.pTkg(/$( wq( ,/(0/(ְ/(     / ֠/./*,/(0/(@ְ/(Jkd*P/$(VP@<0D A&*,/(0/(ְ/(. fp/p\kg,/$( .wq,.,/(0/(tְ/( ֠///*,/(0/(,ְ/(Jkd*P/$(VP@< D A&*,/(0/(ְ/(H{ p   /$( @  v@ , 2 ! . 00  +    p.ؐ.ذ...WP@DH~Lr @D''!' )7H)\ ~LǎHǞDǮ@PPW2!6[WPHx~Lp(,j~LǎHPPWPHx~Lp(,"~LǎHPPW`?8<@DH~Lp.ޠ//:T 2p/ p///p  :X ސ+ /Jp  C@:8 6p  : @$:@$ 1 P@$`^P5%cR:W^XP'86 0":B0C9"5 4r+!+ @$0:  ?05N?:@ 5p  5 @$0:  /( /( /:/( 0 &009 4 @$05p (  5(T/ &1/  &0   9( ~LǎHǞDǮ@Ǿ<8`/`W   ?  ?0 6    W6    WX<@DHLPҧ~TsRNW  ( ( D   \ pױ$`'(R (> )@     ,ڶ   aP/\ +! (() )((  ' p$`7! BW  D ,,-V  ~TǎPǞLǮHǾD@<XXW0@ A#1 ! 1W @(#)dlist.c 6.1 87/11/23 /etc/mnttabdlist: cannot open MNTTAB %.32s/dev/dsk/%.23sdlist: cannot open %s (%-12s): bad block type dlist: cannot stat %s (%.32s) <%.32s> New file system 4kb (%.32s) <%.32s> Old file system 512b Fsname : %.6s Volname : %.6s Date last updated : %sUnits : %d Total logical blocks : %-10ld Total in bytes : %-10ld Total physical blocks : %-10ld %8ld Kbytes Number of free blocks : %-10ld %8ld Kbytes %5d.%1d %% Number of used blocks : %-10ld %8ld Kbytes %5d.%1d %% I-list size in blocks : %-10ld %8ld Kbytes Number total of inodes : %-10ld Number of free inodes : %-10ld %8ld blocks %5d.%1d %% Number of used inodes : %-10ld %8ld blocks %5d.%1d %% (%-32.32s): is not a file system @(#)ctime.c 6.1 87/11/23 Day Mon 00 00:00:00 1900 SunMonTueWedThuFriSatJanFebMarAprMayJunJulAugSepOctNovDecTZp<8PDTPSTW`/Lw/K:/JMFw/ @(#)getenv.c 6.1 87/11/23 @(#)mon.c 6.1 87/11/23 PROFDIRmon.out @(#)perror.c 6.1 87/11/23 : Unknown error @(#)data.c 6.1 87/11/23 PxPxPRpbx$` @(#)flsbuf.c 6.1 87/11/23 @(#)stdiom.h 6.1 87/11/23 @(#)fprintf.c 6.1 87/11/23 @(#)printf.c 6.1 87/11/23 @(#)sprintf.c 6.1 87/11/23 r @(#)errlst.c 6.1 87/11/23 ''''8'H'`'l'''''''(((4(@(L(`(p((((((()))()@)P)\)t)))))***,*L*h*x.Error 0Not ownerNo such file or directoryNo such processInterrupted system callI/O errorNo such device or addressArg list too longExec format errorBad file numberNo child processesNo more processesNot enough spacePermission deniedBad addressBlock device requiredDevice busyFile existsCross-device linkNo such deviceNot a directoryIs a directoryInvalid argumentFile table overflowToo many open filesNot a typewriterText file busyFile too largeNo space left on deviceIllegal seekRead-only file systemToo many linksBroken pipeArgument out of domainResult too largeNo message of desired typeIdentifier removedChannel number out of rangeLevel 2 not synchronizedLevel 3 haltedLevel 3 resetLink number out of rangeProtocol driver not attachedNo CSI structure availableLevel 2 haltedDeadlock condition if locked @(#)isatty.c 6.1 87/11/23 @(#)malloc.c 6.1 87/11/23 000000000000000000000123456789abcdef0123456789ABCDEF @(#)dowrite.c 6.1 87/11/23 @(#)print.h 6.1 87/11/23 @(#)ecvt.c 6.1 87/11/23 Fn CAy7Aׄ@È@Y@$ @(#)fwrite.c 6.1 87/11/23 @(#)stdiom.h 6.1 87/11/23 @(#)memchr.c 6.1 87/11/23 .textX.data.bss-.textX.data.bss-.textXx.data.bss-H.text  .data.bss-.text .data .bss-.text p!.data8.bss-p.text.data 8.bss.`.text.data @.bss.`.text.data @.bss.`.text8.data @.bss.`.text  .data @.bss.`.text@.data @8.bss.`.text@!.data%x@.bss.`.textH.data% .bss.`.text.data% .bss.`.textP`.data% .bss.`.text.data&.bss.`.text.data&.bss.`.text.data&.bss.`.text.data&.bss.`.text.data&.bss.`.text.data&.bss.`.text0X.data&.bss.`.text.data& .bss.`.text.data& .bss.`.text .data& .bss.`.text.data& .bss.`.text.data& .bss.`.text.data&(p..bss.`.text8.data* .bss.`.text0*.data* .bss.` .textX.data*.bss..text"P.data*H.bss.(.text4 .data+ @.bss/.text4.data+`.bss/.text4.data+`.bss/X.text8xH.data+.bss0.text8 .data+@.bss0.text:@.data,  .bss0_environ_exit _main__nd&SaveReg0_open__iob `_fprintfP_M0 _read_close_sprintfX_strncmp_printit _sync_super@_nfsmesp_printf_bsizeP_inosizeP_Fs_infoP_FsP(_SP0_stat_ustat_ctime`_fdPP_blknoh_asctime 4_tzset  _gmtime#(_getenv _tzname0-H_monitor _profil_creat_write_perror 7PXCP`_getpid____Argv _strrchr"_strcpy_errno& N'X&H_strlen_strcmpn__smbufPhe$`__sibufRp__sobufbx__stdbuf%hq%p_fclose_fflushD_free{t__flsbuf__wrtchk<_malloc8_isatty__doprnt"Pcerror_endr_sbrkT_brk0_ioctl4_realloc0_memcpy4(_ecvt4_fcvt50_fwrite88x_memchr:_btext_etext;_bdata_edata-_bbss-__startup_localtime_timezone_daylight__cleanup__countbase__countmax_sys_nerr_sys_errlist__bufendtab__lastbuf__xflsbuf__bufsync__findbuf__dowrite_Reduce_infu!ߒ =.p@.text .data@@=@@.bssXX.pH 0  !2$0 @OJ[WP<@DH~LRY-@   B`  ` p`q ('~ Hp0L 3(r8 ` ` pp ! `    `(H c,(`0`0 3(  ʌ P+p`q!!Tb'V `pp ` R 6 `pp! `  e `(e  ` `8Bp`p p$0` 70q$ ~LǎHǞDǮ@Ǿ<PPW@8~<pq<6X`H~<ǎ8@@W@8~<X:,xt~<ǎ8@@W@48~<ZǘX  :2*x t ~<ǎ8Ǟ4@@WH48<@~Dppzp`PtZ t~Dǎ@Ǟ< Ǯ8Ǿ4HHW@48~<BǘX*xt~<ǎ8 Ǟ4@@W8ȋ`Xl`X88l88WX2 ! X`XX`XXW8 ~4p p``@!! ^"!!21021(708``( ````! ,!1 1(20$A $r~488W@~<p`hw`p`x` `R``# !`0`10`x`A  `x `xq q ```xw4`x `Q( `p!%`xq`h `y` p`p`hp`~<@@W`x(! W8`Ȇ v88W@8~<q  p~<ǎ8@@W@48~<rp  Rp~<ǎ8Ǟ4@@WH<@~D`p ;`Kp ` &! " ; 0 h\pp    J 0pp  ~Dǎ@Ǟ<HHWH@~Dxp2 ΀΀V  Bpp"`P&R%|!~Dǎ@HHW@~<`z` h `^ | RRp (4 n(~<@@WH<@~D`  ` `00W@48~> p` p p`>@ pd~b  !0&# q2 !0># q ! ! `  Z` `KR`  x``x  ~<ǎ8Ǟ4@@W0 Гxx 00W0 `  0 # ` 00W8 ȧ~4p 00ЋQNp0QƋ4  RzQ Q~488W8ȓQ(0Q`` "0hQD/(RJ0Q&`Qt``T'QD0P Q088WH48<@~D2Q%- "%n    SPRϱ\czcГ{ \q 0(! 0(! v(! 0\#(! p"WRRH R R R~ Rrv Rfj\RX\ p00 qW00(07( !ѓRqqQq Q  QΓQl~Dǎ@Ǟ<Ǯ8Ǿ4HHW@8~<qNDRp0NpNh ND~<ǎ8@@W888W8c` `( p`  R:,*Qccc`c88W@~ 2^znP <    8bD ʋ~<ǎ8@@W8 ~4qߒ~488W@8~<p  J|`Њ`Ћ&`Ћ !''!LJ xp~<ǎ8@@W@8~<p,nLJފxp~<ǎ8@@W@8~<pczc Гp !0`2#l002#6  0# &0 #@0@2# 0P#z802#:0p2Z# 0# 60#6P02*# f0#?(?(?z J~.  '?'? :'>Z'>2 >>( >(>b(>D>8 6q'>  =>wp($="(,=ڋB P(4=‹(<=(D=(L='=r(T=Z (\=: j'="(d==wfLJ<Lj '<<Lj'ܓ<'ؓ: ;8 :Lj 9~<ǎ8Ǟ4@@W8 ȧ~4p~ \0\0!0@\ qp p\\ \p\~488WH8<@~Dp \ǁ W@~Dǎ@Ǟ<Ǯ8HHWH<@~Dp~ X \0\a!p"#" p\\܋^0\!p"#p#ǁ Ϙ Lj Q6^!ㆀ \\~Dǎ@Ǟ<HHW8Ԩ`^P\;Qa1h&! 5Rb1H&# 2Td1(&' 0Xh1\ا\ܧ 88W 0#00W`@DHL~PX/O pz   z *Wz >\$z  \z ְ\z   z 2(1P$   X. ^`p>[+XT\ . jpz<\   "  +`p+`\z  z~PǎLǞHǮDǾ@``Wz  W8`+`88W*+` z +`+`+`W@~<pczc Гz   |z  f6bz *4t 4l64 4X7z  48~<@@W8*488W8 ȧ~4q'*ض\=H!0/# q* \0'#p\\"? ! \~488WP~@p&z   x 2(1P    HH(2DKJDHL . ~@PPW8z   88W@~<p/J, > "Rz0  zr &z~<@@WH<@~Dp22 Xz zz   !* !  ؋ ̋\*1$&+11+1*1tz 8 z 0 +16z z+$1z*1p 2(1Pn+40܋F\&+L0 02+T0~Dǎ@Ǟ<HHWP?8<@DH~Lq \9lp\;Fqp\>:r`! \\t lp\L:,\`\b q  ~LǎHǞDǮ@Ǿ<8PPW8z F 88W@8~<q8^9q'p9,`.~<ǎ8@@W@8~<xX%0 # z% 0@ # jqW%0 # % 0H # '0=#6 2'E==Ljq~<ǎ8@@W/(`   PPP W@8~q  $dLzvQ , Qx   !)'qQT   !0 # !" 00 # ȋP: ,&P   !)"'qO   !0 # !" 00 # /(z?! w28q*!!01  w{l~TǎPǞLǮHǾD@<``W@~<p^.c(c(%Nc d@>/<'swp~<@@W8 ȧ~4p$Ħwp~488W@*r@@WH<@~DpdNzwqpߐa, rq۲dN~Dǎ@Ǟ<HHW8 ȧ~4p p( `2! ` !]  J  !0 7# ! `02 ! !3p~488W8 ȧ~4p px !"(f"( ,$! .`!>`0" Md {}|MJ  ! 0 1 '2m ! !3p~488W`<@DHLΠP ~TLΐ     A  V  $ړLzp  m ^X {Rz^\ L:p  @ /0` `h:"`!`rKp  H ` ! `h `h`3pрnj \ ^\ ` x ln\vY   p10qpc(`Hq `Pp $qրc!qրcv#q`H ހd@V?qcހd@6-qހ`8"3pP pJ0p:qQ^ZJp P^Z  3p}q/0``h8pZ  0  ! }}| `h p`膀Z \ *]   0 1+q,]"`!`2 `!`] xp݆ `H . `Ppǁ ``2hd?q(  38\‹4=q, 0& 3p ` \3Xn `l  * X  `*  "*]]] ]~ ~TǎPǞLǮHǾD@<``W`48~<А]Ѐ]p@"3]]D]& `h`!!``]]4~<ǎ8Ǟ4``WD~H`33 `2! `F  !0`# ! `3t p-Tr VpLL| `  !^L0^(GPh3`h4\`( `2! ` !] E  ! *ȋ6``  `` `h`!œ|~HǎDW 8<~@pD X.`!`qpZp"<   ,~@ǎ<Ǟ8W@`h `1!j`   !`h `1!jh`h`@@W <@DH~Lp PώЧ hiD /0 hn`h&/* , # r2, #~ r1pD `H>`  ` `8! !0s2 !`  `H`H `HRp"p`Pc8`H^j`Pc \ec :P0 x:/ f: /D/8z"z/Dzc". -jր/(02P# ր/(02@"` ` p`  ` `0/(D`   c`/(`0`04~LǎHǞDǮ@Ǿ<WP@D~HzpLP/(/( !d` Q8 !Y/(X20 28:T:0xB` $ ` ;$;:̋` z' $ ` c`[ p/(b\NP/(``c``` ,j,cc` jP/(\zR](LdL /8!ǞL:|`  ` c>`/(z\`  `  > `( ?`"z /(z z ~HǎDǞ@PPW8`  /(:88W8ȓa\d@c(/,$c 88WH@~Dq,`B'``.!`~Dǎ@HHWh8<@~Dp]֐/@7. : % q Ն fHbTX@YP6`%,. ~3`  %q :!~Dǎ@Ǟ<Ǯ8hhW@48~</@q]H :qpR/@qp~<ǎ8Ǟ4@@WP<@DH~Lpp ^ϱN"p) Ϲ" ϩ p ~LǎHǞDǮ@Ǿ<PPWH<@~Dp`   R"pbw`  (p L >p~Dǎ@Ǟ<HHWH< @~Dr  @ qW  H =bq =! $n `4L~Dǎ@Ǟ<HHW@8~<p~<ǎ8@@W8 88W@8~<p4(r`  8::',3F,"<|: X/8   :ڀ<` .;:;$ ~<ǎ8@@W@DHLPT~XϞ\/0` `hы%4 Y >!Z  5B :\ p p %:*    0  :\ $*    0 ` ! `h b `h`@    0 4* :\ p p $"*    0 |``q3p p  J  0 4`,:\#`l. 0 /(z !XFެ~XǎTǞP ǮLǾHD@W@~<p d@ ~<@@W@8~<p2# "D~<ǎ8@@WH<@~Dp;(  44 "B T  χxpp  x~Dǎ@Ǟ<HHW$P  @  >,P  H  W8;(ȶ]88W8 ȧ~4p&]W~488W@8~<pczc ГX8::4 *=r ~<ǎ8@@W@8~<p/0Lp  ` ρ `( `6:((  `hb~<ǎ8@@W 0 # !$    ]]W8 ȧ~4p.2  ~488W8 ȧ~4p.2 H 4~488W@~;:܋":;$ ~<ǎ8@@W8` "c,088WH@~Dq(ր!F RL~Dǎ@HHW@X.`[![!R@@W@2 28~<qh$ms~<ǎ8@@W8ȓ$d@88Wd@@ '~2bP/P5 Et@q507bP/P&:`P/S"0 !~W@0#~<@ @ !@p G@@ H@@˅#4N ~<@@W8+:0d@ ! d@dK88W@<0< ](!]( ](O<0@@W@X.`[8<0 |<0<0[](X[!O2@@WH@~D<0p ! 'N؋(<0](<0<0~Dǎ@HHW<0W8 ]( ~2 0 0 0@ (C@(1@^CA0 0@0480 0@4"0^00?01! ](!N88W8ȓpd@88W@8~<p6V .$ /* / . ( /  . 0 /^(<>< ހ^(t^) /! .PH /8^*( /rqL'q!'q!!/!!q!]^(( / ~<ǎ8@@W8<Ȏ ^(J 88W@8~<x. / Tqq(/ ~<ǎ8@@WP<@DH~LpFΐ=4^( <PI8W c` `8`0`P/( >֠/( Fc8744ȓ44_(~LǎH ǞDǮ@PPW_0 !_p_0(_W_0!< _02  _! _W`8<@DHL~PP^\P_ ^Xtp_0T@ccrXp!_0* __t(TH.X_0p"2_0#(! !)!) !__TQs   qr>hB}p5؆X` , bp5T 3 .p T^\ Q^\ _g\`    d` `( ` c c~PǎLǞHǮDǾ@<8``W0 ~< @ Ap G@@@ 1!@ A@  dL~W8 ~4Zp~488WH<@~Dc! qp~p:wp 6! qp~Dǎ@Ǟ<HHWh8<@DHL ~PsTnT  ^T]^`]pR^\]pR^Xj\^Xp^dJ{+r *!71'ndn`i"юk~PǎLǞHǮDǾ@<8hhW@8~<4p(H 0wp~<ǎ8@@WH8<@~DczcГ  py:\ p`p  bp`   2p c! c.~Dǎ@Ǟ<Ǯ8HHW@8~<9 /0pq3܋`~<ǎ8@@W@8~<ր`hp p/0&` `(`h`h`~<ǎ8@@W8``hd/0, 3P(`h88W`hW `h# ``hW8 ȧ~4p$`t```'( `(  ``h`~488W8``88W8 ȧ~4pVt ~488W8ȋ(`P` !`h88W 2!1W 0 0 0 0 00W  2!1!W   W0C 1B! # W@ ~<qddeBB>ddpBBB2dp !d  ~<@@W8e dP .e8BBeped88W@8~<np`Bؓ PBԓ*BГB0ee~<ǎ8@@W@~<`p&Bf ee~<@@W8f B 6Vee88WH<@~DpCH\p C|zCCree,Cx0CttCp B "Cl  Ch  ‹Cdx$ @jC`D$~  ܋6C\$J `CX$ rCT$ CPt$ fCL@$z 2CH $F CD  ʋC@ed#J pC CVVC0̎& CVBVVC,tC(`(eeB>VVLC$($b  VC $. VV p  |C R C Z Cd P lCH Q PC , Y 4C X 55(2~Dǎ@Ǟ<HHW8 *n 88W` ~<q@- D  ~<``W` ~<q@,  D  ~<``WX8,d  HTXXW@48~<q* fp 0VNF ږ"~<ǎ8Ǟ4@@WX?@DHLP~Tπ``؋p p      #2Dp p  p`     > Z  'n "!*( 0   .p p   '"q  =` `    H   l  @ V   j p pz ' !p p    >  [  @  `  `Z J >  >  <". 0`@`z$ 1H 0Г```,    ΐ  p  ` <LVΐ -` `  `  `p``p`p``Q<  ,  0 ```~TǎPǞLǮHǾD@XXW8ȋJ     8 8W8 ȧ0΀ ~4p p  \  !* N  (>      `  p p ~4ǎ088W@8~<````Ѐ``p/( '! :.!  ΀ `   /(   lz zHd &"NzW%W !' ~<ǎ8@@W@~pc4(2 qRqF  c(! |Pc^xX^cc4p^xPc^P( zP^^P$^z  zQ^^z   |` Q n   ^zh^z zQ^^z3V4^z485"L^z P^  ^z zQ^ ^z  ^z ^غz ԅpEW@  ۢ  3lhpv tb оX` @ `  X c~P^cPcc cc c cccc>cc κcc c  cx] 0  !zztzV !3}H6pc ^tJpހc,0rf qɋxt`P^``  3},` @ ` T}`  3|‹h 4:tц(:Dqd /X FlLD Fh80 .* / . / p0ؚ`pU!pۆ 3ȓ{j`x0H :<`/@&` `͘ ( 3ȓ{l5h{ ˚!`H`H3ض`H{| `Pp! `P. >c0Tcc00b^!p"pd tc0 8 tœJcL8F ! 5@zF!4 #!tNj0  N6 -* f3(yXp~"'*q4y!002 9юp4ynpp4yHɰ `<p  002 7`HN B0vc0sp ܋vc\vcDct -, r3(x::,  3wtӋ cc5wc ǜ cchct>ctFpړz n^z v,ccτz`..()<cz ccj؋Rc  _  `>Q^z 8F" 4pv4HuczcГu F _}_Q  $`       _4  _Ԏ_cTN` @ ` `^Q`R ^P `ȓb        "P  *` 2Г ̖^P(1 )6.`( t^zаtJ)︓t6`^`)<^(&..()>`l`d)@)2 )  ) `Pq_zFcc   phccc<t )>cc^cczcc^cc c\`Xzcc~PRq0)cc^ccz nVcc^cccc $)& ) c6LjrǸ\ | p v>Ҍ )zǻLjccczcГp,|ײ` `( ` c~\ǎXǞTǮPǾLHDW <~@qD4ħ~Xp Z _ ` 0 #p~@ǎ<W@8~<p3B"qp* xp b~<ǎ8@@WFW0~@F!$"$ d @F!$"( !@+B $ @-$ 1@F!$"$ D 0!*@0A$pFAGDD@0 ~W0~@F!$"$ d @F!$"( !@+B $ @-$ 1@F!$"$ D 0!*@0A$pFAGDD@0 ~WpR[BPT.> PPWX?@DHLP~Tp_r_b 0 _ p$_ _ __p  d eepe_p q_  ( ^H8  H@! 01'q2! 'q/ ~ !' :Gq21304!:'q.HH,/ HH__ _P_q9(9#0@@5601 0_ _) ~TǎPǞLǮHǾD@XXWH@~DFIpHx ppH  Ht"    xHp! h~Dǎ@HHWp  $Wpǀǐ Ǡǰ $WW!21!0W! W!120W8 ȧ~4pM.qR(~488W@8~<pp ~W  < r F Wh ~<ǎ8@@W8 ȧ~4p T g "Q%(   ~488WH<΀ ~@q R  Bb pQ'(! ,>     BG G!p    g   ,Q"%(  D b j D p     ~@ǎ<HHWH<@~DpǐLJ D   pQ  pQ' (. (   ~Dǎ@Ǟ<HHW8 ȧ~4p  *        |'Q!R D D pQ%  ' pQ7! ,~488W@8~<p  ( ppPeWQ( ppRQ^P*    pQ& ppPeWQW @  ~<ǎ8@@WP pRQ a!` !W!![*W [W[W![W!)[W2!;[W2!>[ W[ nW![ NW@[W[W2!6[ W! [ W2![W2![W[W*[.WC2!,[W2![pW[XHW H[,HHW!00[WH .(N0n8@HPX` W`X .(N0n8Ɏ@ɮHPԩة>^觾[![ZW:[DW [W+[ W!?[W<[W [W[. W2![W@8~><&>&<< @(#)hash.c 6.1 87/11/23 @(#)hash.h 6.1 87/11/23 @(#)defs.h 6.1 87/11/23 @(#)mac.h 6.1 87/11/23 @(#)mode.h 6.1 87/11/23 @(#)name.h 6.1 87/11/23 @(#)stak.h 6.1 87/11/23 @(#)brkincr.h 6.1 87/11/23 @(#)ctype.h 6.1 87/11/23 @(#)hashserv.c 6.1 87/11/23 @(#)hash.h 6.1 87/11/23 @(#)defs.h 6.1 87/11/23 @(#)mac.h 6.1 87/11/23 @(#)mode.h 6.1 87/11/23 @(#)name.h 6.1 87/11/23 @(#)stak.h 6.1 87/11/23 @(#)brkincr.h 6.1 87/11/23 @(#)ctype.h 6.1 87/11/23 hits cost command ) } is a shell builtin is a function (){ not found is hashed ( is a shell builtin is not found @(#)io.c 6.1 87/11/23 @(#)defs.h 6.1 87/11/23 @(#)mac.h 6.1 87/11/23 @(#)mode.h 6.1 87/11/23 @(#)name.h 6.1 87/11/23 @(#)stak.h 6.1 87/11/23 @(#)brkincr.h 6.1 87/11/23 @(#)ctype.h 6.1 87/11/23 @(#)dup.h 6.1 87/11/23 @(#)macro.c 6.1 87/11/23 @(#)defs.h 6.1 87/11/23 @(#)mac.h 6.1 87/11/23 @(#)mode.h 6.1 87/11/23 @(#)name.h 6.1 87/11/23 @(#)stak.h 6.1 87/11/23 @(#)brkincr.h 6.1 87/11/23 @(#)ctype.h 6.1 87/11/23 @(#)sym.h 6.1 87/11/23 @(#)main.c 6.1 87/11/23 @(#)defs.h 6.1 87/11/23 @(#)mac.h 6.1 87/11/23 @(#)mode.h 6.1 87/11/23 @(#)name.h 6.1 87/11/23 @(#)stak.h 6.1 87/11/23 @(#)brkincr.h 6.1 87/11/23 @(#)ctype.h 6.1 87/11/23 @(#)sym.h 6.1 87/11/23 @(#)timeout.h 6.1 87/11/23 @(#)dup.h 6.1 87/11/23 600SHELL/tmp/sh-dP @(#)msg.c 6.1 87/11/23 @(#)defs.h 6.1 87/11/23 @(#)mac.h 6.1 87/11/23 @(#)mode.h 6.1 87/11/23 @(#)name.h 6.1 87/11/23 @(#)stak.h 6.1 87/11/23 @(#)brkincr.h 6.1 87/11/23 @(#)ctype.h 6.1 87/11/23 @(#)sym.h 6.1 87/11/23 at line > : - unexpectedend of filesyntax error6|6x6!666"6t6p6l6h 6$666d6`(6\ 6X6T8\ 6P8d 8p8x 888886L88 86H888888889$ # .profile/etc/profile:/bin:/usr/binMAILHOMEPATHCDPATHIFSPS1PS2MAILCHECKSHACCTMAILPATH/dev/nullexportcannot dupreadonlyyou have mail - core dumpedbad option(s)parameter null or not setparameter not setbad substitutionno spaceno stack spacenot foundbad trapbad directorycannot shiftrestricted+ is not an identifierBad ulimitis read onlycannot createfork failed - too many processescannot fork: no swap spacecannot make pipecannot openbad numberarg list too longtext busytoo bigcannot executebad file numbercannot return when not in functioncannot export functionscannot unsetno home directoryexecute permission deniedtestunknown operator sh error: pwd too long666666777 7,7@7P7\7h7t7777777888setpwdcd[:.}{inifforfidocasedoneelifelseesacthenuntilwhileHangupQuitIllegal instructionTrace/BPT trapabortEMT trapFloating exceptionKilledBus errorSegment violationBad system callAlarm callTerminatedSignal 16Signal 17Child deathPower FailInteger overflowInteger divide by zeroFloating point overflowFloating point underflowFloating point divide by zeroFloating point inexact resultFloating point invalid operationbreakcontinueechoevalexecexitexporthashnewgrpreadreadonlyreturnshifttesttimestraptypeulimitumaskunsetwait @(#)name.c 6.1 87/11/23 @(#)defs.h 6.1 87/11/23 @(#)mac.h 6.1 87/11/23 @(#)mode.h 6.1 87/11/23 @(#)name.h 6.1 87/11/23 @(#)stak.h 6.1 87/11/23 @(#)brkincr.h 6.1 87/11/23 @(#)ctype.h 6.1 87/11/23 SHELL } (){ =SHELL2:h:2:82x2p;2::2:2:P:222: @(#)print.c 6.1 87/11/23 @(#)defs.h 6.1 87/11/23 @(#)mac.h 6.1 87/11/23 @(#)mode.h 6.1 87/11/23 @(#)name.h 6.1 87/11/23 @(#)stak.h 6.1 87/11/23 @(#)brkincr.h 6.1 87/11/23 @(#)ctype.h 6.1 87/11/23 @(#)pwd.c 6.1 87/11/23 @(#)mac.h 6.1 87/11/23 pwd: cannot stat .pwd: cannot open ..pwd: cannot stat ..pwd: read error in ..pwd: read error in ..../../../../../../../../../../../../../../../../../../../../../../../.. @(#)service.c 6.1 87/11/23 @(#)defs.h 6.1 87/11/23 @(#)mac.h 6.1 87/11/23 @(#)mode.h 6.1 87/11/23 @(#)name.h 6.1 87/11/23 @(#)stak.h 6.1 87/11/23 @(#)brkincr.h 6.1 87/11/23 @(#)ctype.h 6.1 87/11/23 xxxxxxx(xxxxptrace: @(#)setbrk.c 6.1 87/11/23 @(#)defs.h 6.1 87/11/23 @(#)mac.h 6.1 87/11/23 @(#)mode.h 6.1 87/11/23 @(#)name.h 6.1 87/11/23 @(#)stak.h 6.1 87/11/23 @(#)brkincr.h 6.1 87/11/23 @(#)ctype.h 6.1 87/11/23 @(#)sh.c 6.1 87/11/23 @(#)stak.c 6.1 87/11/23 @(#)defs.h 6.1 87/11/23 @(#)mac.h 6.1 87/11/23 @(#)mode.h 6.1 87/11/23 @(#)name.h 6.1 87/11/23 @(#)stak.h 6.1 87/11/23 @(#)brkincr.h 6.1 87/11/23 @(#)ctype.h 6.1 87/11/23 @(#)string.c 6.1 87/11/23 @(#)defs.h 6.1 87/11/23 @(#)mac.h 6.1 87/11/23 @(#)mode.h 6.1 87/11/23 @(#)name.h 6.1 87/11/23 @(#)stak.h 6.1 87/11/23 @(#)brkincr.h 6.1 87/11/23 @(#)ctype.h 6.1 87/11/23 @(#)test.c 6.1 87/11/23 @(#)defs.h 6.1 87/11/23 @(#)mac.h 6.1 87/11/23 @(#)mode.h 6.1 87/11/23 @(#)name.h 6.1 87/11/23 @(#)stak.h 6.1 87/11/23 @(#)brkincr.h 6.1 87/11/23 @(#)ctype.h 6.1 87/11/23 ][test] missingtestargument expected)]-otest-a!-le-ge-lt-gt-ne-eq!==-o-a-z-n-o-a-t-s-p-k-g-u-f-b-c-d-x-w-r!==)(test) expected @(#)word.c 6.1 87/11/23 @(#)defs.h 6.1 87/11/23 @(#)mac.h 6.1 87/11/23 @(#)mode.h 6.1 87/11/23 @(#)name.h 6.1 87/11/23 @(#)stak.h 6.1 87/11/23 @(#)brkincr.h 6.1 87/11/23 @(#)ctype.h 6.1 87/11/23 @(#)sym.h 6.1 87/11/23 @(#)xec.c 6.1 87/11/23 @(#)defs.h 6.1 87/11/23 @(#)mac.h 6.1 87/11/23 @(#)mode.h 6.1 87/11/23 @(#)name.h 6.1 87/11/23 @(#)stak.h 6.1 87/11/23 @(#)brkincr.h 6.1 87/11/23 @(#)ctype.h 6.1 87/11/23 @(#)sym.h 6.1 87/11/23 @(#)hash.h 6.1 87/11/23 t(0\l@`|x,DLx ...unknown builtin @(#)atoi.c 6.1 87/11/23 @(#)atol.c 6.1 87/11/23 @(#)ctype.c 6.1 87/11/23 ((((( H @(#)isatty.c 6.1 87/11/23 @(#)mon.c 6.1 87/11/23 PROFDIRmon.out @(#)perror.c 6.1 87/11/23 : Unknown error @(#)flsbuf.c 6.1 87/11/23 @(#)stdiom.h 6.1 87/11/23 0 @(#)errlst.c 6.1 87/11/23 IIIIIJJJ0JDJXJhJ|JJJJJJJKKK(K8KLK`KtKKKKKKKLLL0LLL`L|LLLLLMM .Error 0Not ownerNo such file or directoryNo such processInterrupted system callI/O errorNo such device or addressArg list too longExec format errorBad file numberNo child processesNo more processesNot enough spacePermission deniedBad addressBlock device requiredDevice busyFile existsCross-device linkNo such deviceNot a directoryIs a directoryInvalid argumentFile table overflowToo many open filesNot a typewriterText file busyFile too largeNo space left on deviceIllegal seekRead-only file systemToo many linksBroken pipeArgument out of domainResult too largeNo message of desired typeIdentifier removedChannel number out of rangeLevel 2 not synchronizedLevel 3 haltedLevel 3 resetLink number out of rangeProtocol driver not attachedNo CSI structure availableLevel 2 haltedDeadlock condition if locked @(#)getenv.c 6.1 87/11/23 @(#)data.c 6.1 87/11/23 e(e(e0g w(Qu!ߔ}i 9xC@ .text9x .data  C: @.bss]]@P8 0  !2$0  *$[WH8<@~D]<]! ]]! ]]]]]p]qp*:(( 1 p( .]]  qp,)p# ( p,  ]P]%1  p]]! p](P]^] ~Dǎ@Ǟ<Ǯ8HHW]! WP?8<@DH~Lp snq("lY7Qa1((p( ^psp!~LǎHǞDǮ@Ǿ<8PPWHLPTX\~`P^ly %(^Q^q zP^^^^ -P !HpW^Q^^Q^^Q^*([^ P^ Q^J0^Q^P^ . * HQ ." \ *[^<P^.* HQ 0h(10"0h(10 0l!P^^l^P^^Ԕ .0X0D1pW0x0c1p8W!EDH^P Q^ d  dJP ^,. P^(P^ X   .xr(11s  q!$"#,"'nWXV^hxd X!Z F o  x6^Q Q^ P^P^^P V^' [^^ ! ! ^>^(xpP^.P^P^ώm q 0(^P  .!^^'q!^Q^^P ~m^ :@(^Q*0^e*ߋ^Q0^ejn(^ : +-^Q^e HQ Ee^Q^e^P V^' [^^< % <^>^(p,^.! 0P^,P^P^ώm  0 q( ^P .!^<  <^Q^< 0q(~m<^P V^' [^^ % ^>^( (^p : 0܋х 0"! n]^J]Q^mm~mPNj^xP$^Q^ ^P P^^P P^ 0^ 1lnn('n^ ш] ^Q^" L^ Q^ nVan0^Q^ q0^Q^nVan– |^ Q^ :~`ǎ\ǞXǮTǾPLHW@\\.` @@WH8<@~Dr0  $Ǯp0R, -pqpًpxqp~Dǎ@Ǟ<Ǯ8HHWX?@DHLP~Tq p p( -Rp,p,p0 f r n ppp4p4$ $ p"| ,4 p"J <D p2< L p8 : :H ' pq| :y! ' pq|>p T! p8\dR`pHppPppX Vp`Fp, (q X(!  X(! 0r (! t (! 4 V\< x(! N0c#(! BpW pdpdphph pp phphptptp4p4pupuphphpvpv~p pphph^px phph:p|,p} xax'-!Ip Nphfb\php~p~/pph<(p puqpz pp,pp,pu"p pz  pd& p8n ,p(  pppppdp >>@= =&pzpzpPpdPpXpdp dpp4pَpp,0, ,  J "p4pppx 3 p,$ ēp|̓np}ԓXpdzp,2ܓpzp~p~ ~TǎPǞLǮHǾD@XXWWP<@DH~Ly:qyn :R )  p : qp ! p82~LǎHǞDǮ@Ǿ<PPWH@ ~Dp  ~Dǎ@HHW0@DHLPT~Xpΐ ΀ РpְppppPp^Pp^Ppx^P(^Pء^Pp^pp  B\ "p(.d"&.f4|p (pd p<q lqq q zqqpzpppppx,pzppppp(( pd pd p qqq zqq FpzDppp^ĶPpx^̶Pp^(Ppppp^°P^ðP(^Ppp| ( &~XǎTǞPǮLǾHD@WH<@~Dp4H * HH *H, lАppppzwp H2Hqppp~Dǎ@Ǟ<HHW8p,Ȇ\(pd$0 888W8p~Hp~  88W8ȓ88W888W@~bqNpz?Jp88W8 ȧ~4p~488WH@~Dpp,p JH8,h  H :f~p6 pupuPuWWu ~Dǎ@HHWH<@~Dp Pt8 L t  X‹pvu B  d  H D'vr! @~Dǎ@Ǟ<HHW@8~<q x48(J  t& p~<ǎ8@@W@8~<uX B   x.pTu   `v&!Pv%!Vzp vvqvH(~<ǎ8@@W@8~<p]Zp & /   Г rǀb@@ ē@@b&u@6pzۘP / .2$ؚpuz /hFv 2 v  x~<ǎ8@@W@8~<uvpu puv ؓ   '!'!vvvqvqp( R XPp vvvq~<ǎ8@@W@8~<+ xq Xמ Bpv2q uwv ~<ǎ8@@W@8~<upv& p!f'u'! Dv8 u րu h '!'!v$!H."~<ǎ8@@W8 ȧ~4p rj~488WH8<@~D/ z@x /qx /qz !<P8 Tqqz !8\qzq'/! qqq   /~Dǎ@Ǟ<Ǯ8HHW8v  !@Tu!H88W@~<ppv^u .Suz.  q  q ~<@@W@ ~4ppv d~88<fuz!puq Ѻpq q ~4@@W p~8p<E.pv"vv v v(8q <q ~8 WP?8<@DΐHώP~Lp "!B&t !  Jd ~X '!r T \ : `N,  Tq" ΰ  p z q"   H "!f ' 2 `D8`q  ( (0  qD``* p p< ppvp\p,pp z p ppp"4#0pv  !&"$ p\"PN~LǎHǞDǮ@Ǿ<8PPW@8~<vqv$uxR!uxr qpux#0 v f!v  qv(6v0!v0Pv(v( fv v(2v0!v0 v(v(p$q&~<ǎ8@@W@DHLPT~XQЧ^|P^x^tv8vqv<'\v8J\"dr"lVV~\ |>nx`   |  &h\nt`*p"L "Hv p"t xp.nt` h"̂ޠ#@v { 4q{v "n("q ,\nt`4\"D "@v *\pan\ |Jnx`[~\] 2  n( qv ~\v( yx)*qyᅐ2"<z,"uH| p"8 * qv -"qy6:'q!y ᅀln|hV^|P F &QЧ^| ܧ| nx`(n| r_FƲ:nv8g'v8 "x"qv<'v8  ^|*pv0ev(^p{Q}~XǎTǞPǮLǾHD@W@8~<pv<v8pv Pv<f(v8v8]T]"жv ~<ǎ8@@Wv@Wv@v@fv"v >vv"vvv W8"ؓvʆ u88W8"v u88W `<@DHLP~TpPppPx<pP,pGpPpPpG4pPr X \uF XE  XEuΰώXϞXmRp"uz< qp,q"# ufXx& +X ~ pvT  ϞX,p X ~ώXΰypыXv \ϞXvFpq qp\q>p"t0 p\v  qq"#ur ϞX`sXFp X~ X \vǗ8(0 X <ώXΰ*!X ώXΰtqtqr~TǎPǞLǮHǾD@< ` `WH@~Dp$ qpq   qtTq !  q t8p# q@p  vD   vDvDpptp~ #$ p8zpۮ~Dǎ@HHW@8~<pp րGqNzvGJ~<ǎ8@@W@~<ppu$ɰX~<@@Wq@q@vDW8 q@ sZq@vDvD88W@0 !.>?>@@W`<@DHLP~Tp /p. ΰ At vH  vP$RvP / u u ρ@N?uz 06$ȓ XX\r\@d?xsJͶ p%8y$qvXv` 6 /&vX(!`!  XQ$$p tk Г6~TǎPǞLǮHǾD@<``W8vPȶuvH x$ؓl88WP<@D~Hq<G  Ћ$uH|ސ%@$% % , O!O#%  Ǒ opǀ^J0vH&GpIvH`vP~HǎDǞ@Ǯ<PPW@~<qqLqLҴpXpXp` rptptt~<@@W8 ȧ~4p%$.pؓlh% p~488Wh8<@%0~D@vX v`02!01@ DŽ /p HL  @fP4! (!`*ΐ z v` v` (E~Dǎ@Ǟ<Ǯ8hhWvXW! ! W888WH<@~Dp΀  WX%D!   )  ~Dǎ@Ǟ<HHWH<@~DpWT%(@!  ( ~Dǎ@Ǟ<HHWH<@~Dp΀  hW8&Ӏ$   ~Dǎ@Ǟ<HHWH<@~Dp΀  hW8&$   ~Dǎ@Ǟ<HHWH<@~Dp΀  hW8&h$   ~Dǎ@Ǟ<HHWH8<ΐ  @ ~D Jpwx    bx\Xp&WшpVp:tpVpVp$2p2pVp  Zpl~Dǎ@Ǟ<Ǯ8HHWH8<@Π  ~D8 "p,&HЌ q v u~zp&8W np dPpT Rp HYp8 6p ,Qp p Xp  ~Dǎ@Ǟ<Ǯ8HHWH8<@~DpΠ  ǁ&Pc(!| (p 0< > ~<ǎ8@@W8 ȧ~4p*-X'(f~488WH<@~Dp ǁ\l :!'ܶ'܋(%!  $ ȅp)Wp   * qbqTqHq<q,q$ B Vpp MN :  R !  *ppv  L :  !  P p  pp0p~LǎHǞDǮ@Ǿ<PPWH8<@~D@vp@fp qy#q@Fpzp z?@ p\p?p p *`H  p J q q yz+?x   nx_/(! ^ (! Vp* W*d.*|"** x`*u~Dǎ@Ǟ<Ǯ8HHW@~<p&ppDpDn~<@@W@48~<DVppLJ >  H. pp~<ǎ8Ǟ4@@W8 F88W8 aJ88WH8<ΐ @~Dpd   uuz&*ēL`  *j> _q!  _zxp  _X `pd q F<q ~Dǎ@Ǟ<Ǯ8HHW@8~<p*Гjؓ؞~<ǎ8@@W8 ȧ~4pttL~488WX<@DH~Lְ y q!!= R*Ep E  Rs *ؓE^PT PE  L ~LǎHǞDǮ@Ǿ<XXWH<@~Dր q q' 2 2'  = Fx (D x ~Dǎ@Ǟ<HHW@8~p<PLp (FttH ptGttpppppq5 AhpL (Et ̰~HǎDǞ@Ǯ<xxWp~8p xhxp !xh<xx+xt^+Ȱx^ x^xx xtx,uzq @Zq q Eq ~8Wq xuuW@8~<p`>\p`x: q+ܓ u q zpx qquzq?BqXx,+++ؓ j"~<ǎ8@@W@8~4z!uzuuz$uzuuz U!,`u q zp !uzpq 3 ~Dǎ@Ǟ<HHW8 ȧ~4p pxpxx(,xxpxpqxp~488WH<@~DzR ~uz" u0,," !Wq ! yp~Dǎ@Ǟ<HHWH8<@~D&q !W !yp~Dǎ@Ǟ<Ǯ8HHW@~< ,p p /6, { zuz u ~<@@W   W  ` uWP<@~DHLu&HuzH ,uxpp,0,uċ5rpq {q (H H{p~Dǎ@Ǟ<PPW`8<~@pqΐ vq/4Dq !^ PuPuuuL4 uu! q4q `x$ \q "q!`!,zz 01 2q.~@ǎ<Ǟ8Wp@DHLPT~XpΠ    hjlpxt,ȧUohe.0FqNz06ppp'q0 \q@ d\3Jd\ 7q@ 6z   fx~$Ϟ  p`  Ry qp :z  qy  rq  p_.KTV~XǎTǞPǮLǾHD@W8 ȧ~4p puzuuz,Гuuq~488W8 ~4uz U,~ uz"zupqquqw uqzpuuu~488WH<@-~Dxp Zq'--y-xT w|dpu8 q81# ! !'q!q8!q8&~Dǎ@Ǟ<HHWH8<@ΐ ~D'p  &ppuԧpu~Dǎ@Ǟ<Ǯ8HHW8 ȧ~4pt~488WP@D~Hp-ȓv upd ttT-ēt6-t-Гjj -u>L(-u uLuL)8$~HǎDǞ@PPWXDHLP~TpTΰ p`,*9 N 8w~TǎPǞLǮHǾDXXW@~<p .}T~<@@W@8~<"~qp7`xx6   p * x$Xpqn ٧xx~<ǎ8@@W@8~0 #(! p7pW)(! )(! hp ;d `(!  `(! 2< >(! : >(! . \  |0q   " ΰ `Z p p  * " 7pxn  \L p p ! q$   qpxp\ qDppΠ   ' xp Ppxp p p   \ qDzp p  px pxN \ ppxp p  \Xp p px px  ! \! qp0: '. 7px j,p07ώQPl~LǎHǞDǮ@Ǿ<8PPW@8~<pxpx uxZ!uxrpux p0: # p 8pxpx xh!xrp xQ4xx"x xxxDxxxxxp p  $P~ X ~<ǎ8@@Wp8<@~D~Hq$ 7ZxxR{q# ?qq *!&HX . $D <8  qx  x<\( q ՋPF>\( q  Ћ[Rqj qxh( q].:Vqgqq7Z R x{*}x"qH>7ē~Dǎ@Ǟ<Ǯ8ppW@8~<pux8Bux2 !7ؓ~Lux@qxuxqx@bqxux~<ǎ8@@WX@Dΐ H ~L(rΐ   { xxq8u  xu$  u!" (!PT  ! sxp:p7TP:qBlp &qp:PTp pxPT* p*qp-x-q&PT*jpT.PxLjPP  ! :q"v|p:q {"Tp}q7x~LǎHǞDǮ@XXW?h@DHLP~Txpgqp &!  < x e!p8Wq4q4 xȎ8\܋xxȓHB"  8X& @8hxnހxp  zLy(\p&p \p\px ! x8xȋހyX42p  TZzPyF(8r\pp \p !&z  84xxx + 6~TǎP ǞLǮHǾD@Wh?@DHLPΠ ~Td֐xX|^pLjq  d.dzad8X |@~TǎPǞLǮHǾD@hhWP<@DH~Lp h R x@ q 8p8W`P` RώPΐ4 x'q!(py'&(,&( :\! &q x'!<x}6Nx|qox| |8ܓ88؋:|BP_^~LǎHǞDǮ@Ǿ<PPWH<@e~Dn h jxLqDp8W^jp9qR1& 0 !/* jpq /h] !]ƋpqB .4e]] !>q('/!e9]D~Dǎ@Ǟ<HHW !RP 5QVWP?8<@DH~LPpU  - $!p9W ^Xx fxx 6  (+ ދ BL  >p ㍐ϛ&  .p9@ : ** +9D ~LǎHǞDǮ@Ǿ<8PPWH<@~D؋2p u րq8b?8N-#rp9XW:^^Puq8pxu6րu؋pxq(9 ܆ذx "0ހx$y( pp9 v"xذxr x!z u؋Hހxp *?qy( px&x9 !xچ u؋ p Ȏ $ րuq8Vuԋ* Qq8Pu؋XF~Dǎ@Ǟ<HHWH<@΀ ~Dpuԋ& (j wp &~Dǎ@Ǟ<HHW89Z88WP<@0DH΀ ~LǪ Vz>  x&  q~LǎHǞDǮ@Ǿ<PPW xW yHWP@΀ ~DpyHpyHxJ!xrp bPu"ux 6uQ(xu pR!prp Pp"pp ppRpq5ppQppp Xpppx  2npp0ppqppp  p  pzt.H~L xP^Q P^ \9Vv6p,9̓^r9^bpoq6 <\pq5oPP^zpx pxp~Dǎ@PPWH@~Dpqqq*qPqqpz }qqLqpqz }Gۄ nqq qqqPq2qPq zpzqpqQq zppqpqpNq zq qPqRn qppqz(!" '|Gф HqqpqqP q~Dǎ@HHWH<@~Dp p qvp qPq qp2qp qqp q qzzq ~Dǎ@Ǟ<HHWqp4p&p   !WqW@pz"z|qq2@@W@~<ppppxp pz!zGVpqq tpzm"qqqp~<@@W 1  a(   z( 4  A(   Z(  _0W 0  0(  !9(1W@8~~Dǎ@Ǟ<HHWH<@~Dq    ,~Dǎ@Ǟ<HHW W8 ȧ~4ppz8pz,qNz pz;p s&q@~488W8 ȧ~4qL DqLppqNsprq@~488W8rr~rvp88W@8~<q 4prx0p r ~<ǎ8@@W@8~<q p ,prq ~<ǎ8@@W@8~<qp 6r &x q6~<ǎ8@@W0 A#1B WH<@~DytGP  ~Dǎ@Ǟ<HHW8 ȧ~4p-"qq (qV~488W@~<p "~<@@WW0 @ $## W8u:Г88W  2 "2!1  WWp@~Dp΀Hp (paXp؆$pH (paV;6pH (V~Dǎ@ppW@8~<p8; w, x~<ǎ8@@WH8<@~Dz )(!  )(! >x*(! *(!  &  (< ;(! ;(! j > 2 |tLj;,R;a6w*  Pwy (~Dǎ@Ǟ<Ǯ8HHWX8<@D~Hq(Dwx~w)^:NuE 4( upuLu ΐ uuuq@Lрq@XB.T"_*Tǡ;  A   L.TP.P"!P(!TTPAlPA`p]~HǎDǞ@Ǯ<Ǿ8XXW@48~<pǐ Aw@x姉 ~<ǎ8Ǟ4@@WH<@~Dp:; w). x~Dǎ@Ǟ<HHWP<@DH~Lyz )(!  )(! 2\ &(! F &(!  (,, >(!  >(! F |$;ē |;]w!&! +z, !  z!  ^+  .wx +>;ԓ~LǎHǞDǮ@Ǿ<PPWP<@DH~L{ )(  )( .<*( *( . (| ;pf^TB *r*اwyA *.~LǎHǞDǮ@Ǿ<PPWP<@DH~L{ (( (( " )  |tjb | LH" *f *@   wxQ *.~LǎHǞDǮ@Ǿ<PPWP<@DH~L{ &( &( 2 (  )p f^ & LH *f *D   wxU *.~LǎHǞDǮ@Ǿ<PPWX?@DHLP~T| (( (( " )  | ǧ+ !(1&1 !z0   !&!z7+ !  wx +2~TǎPǞLǮHǾD@XXWx@DHLPT~XP^tF|B ,(p;Wwz  Q^t| <(!  <(! 2` ((! ((!  )$ >,nt`nt`lnt`ыVJ < $ыnt` wz  0) P|p§^p^\Q^P^hQ^P^dQ^P^`[XVP^^l (D*^pPnt`<0xW^p~\ >z" 6<,T z w.<(Tzz  w<@wlw < ^`P ^lP <\w6~  <z  Xw <. 2^dP$z  zp<\x <=>H <q=>2"~<ǎ8@@W@0*2!!==@@W8 ȧ~4p >p .y*z&^qp? @ q = q=rz =y( 6~488WyP=W@=yPdp؆"p qNzp  pz =yP!^yP=@@W@8~<ppd ?wb1D>ē1D Cx480 02! @   Lj   0W  @     @    X     Lj(!$z z zR  4 @ $v (" Kvj >̓0f.>8l  "   q7q7~@ǎ<Ǟ8HHW@~6qx qDXD R &v '" I$>ܓ6  Dpd:p>ؓH pExWP$    p +F ?.Lpt D~@ǎ<Ǟ8HHW@qqpd 8by؋6! (! ! <V<q@@W8 ȧ~4py؋ &wp~488W8 ȧ~4p?44wz( z(    0 # 'z,z.y0!(# z,~488W8 ȧ~4pzLz z̶z @zz z z ~488WH8<@<~Dtpz  z  @  z0zzz!zz0   z    z0'8z(Vz(z(z(z( z(ppz(wvvPz,z zz,z,Py؋ 1 *z,z z,zpzz pz yاpyا~Dǎ@Ǟ<Ǯ8HHW@8~<p zƅp?0W?dt?`\LJ &B?\.ۋVb?XJ:?T"Wz>6z  ?h ?PWz`Xz?L ?HTz ?D8?@, ~<ǎ8@@W@8~<B zp P!nz P!4z?pAPzzz0zAzzzz~<ǎ8@@Wz(zz(Wzz(zW@8~<z(P`  Ruw?-?|-wx?x-z(z~<ǎ8@@W@DHLPT~Xp w'0W  @     @   P^P @^t P^P ^p PVP^l P^P ^^hP^P^dP^P^|PVP^`P^P^\P^P^x   B =yP2^lP*' ^`P?,: =yP?,^\Ptzd*( ?  ?z 0+z -  1@+@ +^hP@+^xP @  ?*7?ȓ+L 0p?W0 z@$+p^|P p1\*֋F^|P*@0*@<*@D*^xPH8?*x  ?*^  ?*D  @X*&~^dP?* ^pPb v" <@@h)@p!<*" C8?ܓ) @ @8 =yP?ؓ)r^ '7(J =yP?ԓ)6^tPd v" ;B@x)@ h v" Bb?Г(qC @ ( @( 8~XǎTǞPǮLǾH D@W`@~DxnHP^(%' ^%# >%! ?Qa1H7Rb103Td11Xh1^ XH &@\'(\.XXq^(H.X0^ &^~Dǎ@``WH<@~Dq6 q6P2@9@[P `py؋N'>'!2   0 Lwpz,z~Dǎ@Ǟ<HHW@8~<p Rtpd *6:t~<ǎ8@@W@~<pBp$pd )~<@@W@~<ptt~<@@W888WWH8<@~DYP-lVqސ1`@$q@$q@$rB2.p q@ZXPρqޠ1`6 $q@жuZ *~Dǎ@Ǟ<Ǯ8HHWP<@DH~Lppd &2:<@YnL ,C4A #GpI@# t{pd &> Wx~LǎHǞDǮ@Ǿ<PPW@8~<pP H1   0   0   0   B~<ǎ8@@W@8~ >p`>4p(z >>p pz >Vz z=J.L0~HǎDǞ@PPW8pAȓQpAQx88WhDHLPTX~\pЎpz zZVpBWW e &!/ z   >  z  rz  *:bLpv :DpvBBܓ^ B.RW BؓV FBu  z  Ћ Șz   B-6 Q$z  <Z^ C-J6 Q$z zzhWz  z  "z  ІFp$z 8@ 86z )z 7 7$h  (8z PD?Ȳp=Ŷp>ŤqNpz7xpqLpz 'z1z (<z ( 'z1z *>`z 9 $ 'z1z .`9&Vz z1 z Nzz WP,z 0 %z1z \z z1 z C   V zV!VWP,z 0 %z1z \pz   ~\ǎXǞTǮPǾLHDhhWP<@DH~LÊpz   4qF9 p \6^ Kt( 4 4 4H ,p 4^C5pz4l44q8 Vp $5"5RT  .C  J3 J‹* 3pz33\   qNz3lp~LǎHǞDǮ@Ǿ<PPW@~<p4 :~ C(H~<@@W`~<p@5 ,D  C8Hl~<``WX@DHL~PxpdƋqx [Tp4q !Q (u2*C%ΐ=q   =CHC%nv  CH!)! y p8 yN *ǞTp    N   D$.D hM D$`,D    D,$$(  D4up D<#( z DDt؋8 DL#" B DTtxp?~PǎLǞHǮDǾ@XXW@8~<pq'q!Чq ]D`F@~<ǎ8@@WH<@0~DqZ ppqq z~Dǎ@Ǟ<HHW@48 ~<Jp  hDpEZ~<ǎ8Ǟ4@@WX@DHL~Ppp.xpqp`"rq8 [Tp^p%puq !  =ppq D|,  ) FpEhj D:,  ) qDC  =pBp  =2 T'X( RTǾT.|0 !p"#"'4( 6ΰ D  '(Dx H  = p!prp~PǎLǞHǮDǾ@XXW@8 ~<q,"I ~<ǎ8@@WX0 0A~8< p=TR @>RSNR@ @< 0>>R01#!THTpDAB~8XXW(TW8ȩP^P.X(P(88W@8~<p pD  H~<ǎ8@@W8^8^H!^H-"^H^H2l0^H ^8!,88W8 ȧ~4p ^H^H*0~488W@48~<p+q-qP'q! Dȓ>~<ǎ8Ǟ4@@W8p888W8 ΆD88W8p888W@8~<^Lq(| p^Lwp~<ǎ8@@W@8~<^Lq46   p^Lwp~<ǎ8@@WH<@~DqJ  p8$~Dǎ@Ǟ<HHWP@DH~Lqu~}\uz:n|pDD!^88WH8<@~D8pzq p uNJ~Dǎ@Ǟ<Ǯ8HHW8p888W@8~<p L^Lq'!^2*~<ǎ8@@W8E88W@8~<qppEvr E9~<ǎ8@@W@8~<p@p|"@ E0Nt@nE,@E(>E\@fv~<ǎ8@@W8qHqP$488WXD$TLqPD.T0qHXXW@~<qp!<2F$F !~<@@W@8~<qXJ<  .~<ǎ8@@WP<@DH~L(  s8!H1Aǹ d 2F*7#0d#02#pFP% % rd& %~ q S(!  S(! 4r E(! E(!  P U())1 22!*2!F(r ()) 1 22!*2!F0z6 dȋ$ !!F8Dq b~LǎHǞDǮ@Ǿ<PPW ! W0WH ~4p8 ~4HHWH<@~Dp^z~Dǎ@ Ǟ<HHWH<@~Dpq pG pz$ zpz>pz΋d D(pz" z  r ~Dǎ@Ǟ<HHW@8~<p pGhpz F,pz$ zpz! z~<ǎ8@@W@8~<p pGlFpz Jpz! zpz pz~<ǎ8@@W888W@~<pvF'~<@@W@8~<qހzpVqp~<ǎ8@@W@8~<p pG\pz@pzpz$ zpz~<ǎ8@@W@48~<pz(` `  ~<ǎ8 Ǟ4@@W@48~<pz(` 0(` T~<ǎ8 Ǟ4@@WH<@~Dp pGp߀zZ G{ 6FG0pz" zpTGPn t&FH  >W!  ~Dǎ@Ǟ<HHW888W@ ~4p8<<h~4@@W@~8.>>?p!! . p~8@@W@~<p d    ~<@@WGW8HH v(H88W0~@HQ!$"$ d @HQ!$"( !@+B $ @-$ 1@HQ!$"$ D 0!*@0A$pHQAGDD@0 ~WPHx~Lp(,j~LǎHPPWPHx~Lp(,"~LǎHPPW`?8<@DH~Lp.ޠ^P^P:T 2p^P p^^^p  :X ސIx ^p  C@:8 6p  : @$:@$ 1 P@$`^P5%cR:W^XP'86 0":B0C9"5 4r+!+ @$0:  ?05N?:@ 5p  5 @$0:  ^P( ^( ^:^a( 0 &009 4 @$05p (  5(T^P &1^P  &0   9( ~LǎHǞDǮ@Ǿ<8`^P`WH<@~DpGp$p GnNlGNh  D) "G~Dǎ@Ǟ<HHW@8~ PPWH@~DGJpN ppI N"h  N!~Dǎ@HHW   ?  ?0 6    W6    Wp  $Wpǀǐ Ǡǰ $WWP<@DH~Lp  @(( x^& X2 Jpڄ p " ~LǎHǞDǮ@Ǿ<PPW8^88W!1021!0W !  W!2! W!21!0W! W2!10B!0 W@! @@WX?@DHLP~Tr8     *8l  ' pU7! ` ?  ~TǎPǞLǮHǾD@XXWH@~Dp W & !   D 6ހQ  @  V(  ! p!U!7  R   .   W    ~Dǎ@HHW8 ȧ~4pQ.qV(~488W@8~<pp ~W  < r G  ~<ǎ8@@W8 ȧ~4p T g "Q%(   ~488WH<΀ ~@q R  Bb pU'(! ,>     BG G!     g   ,Q"%(  D b j D p     ~@ǎ<HHWH<@~DpǐLJ D   pU  pU' (. (   ~Dǎ@Ǟ<HHW8 ȧ~4p  *        |'Q!R D D pU%  ' pU7! ,~488W@8~<p  ( ppP{WU( ppVU^׬*    pU& ppP{اWU~W @  ~<ǎ8@@WP pRU a!` !Wh?HLPTX`~\    r `d rd `p^Ћ ^st_(r p   'n P(P P<.   p^ P  ~\ǎXǞTǮPǾLHhhWP8<@D~Hq ^RFp߁^ЋLL8    Lp^L~HǎDǞ@Ǯ<Ǿ8PPW!![W [W[W![W!)[W8 @ 88W. >$.;0 [>W!;0 [W[B2!>[ W[ ֆW![ W/[W[W[W2!6[W!%[nW2![TW"[@W2![ W[W*[.W2![W[P8W P8[P8P8W'[W'[W!00[JWH .(N0n8@HPX` W`X .(N0n8Ɏ@ɮHPԩة>^觾[![W [W+[lW<[XW [DW[*. W2![W8PtȎ"PxP`PtPt88W8PtȆ|Pt88W : W8PtȎ*PxPh.Pt Pt88WH _Ч<~@p poؓ(pop : pD*  :.D 0p`aop : D*v  :$D  .p`aoPpopopopopo܋q,qoضpo~@ǎ<HHWA~"t0As3r21~W0@ A#1 ! 1W0A~@ $ pHQ '"' H 1pHQ '"(  p+r ' p-' 120 $ x X pHQ '"' @ '"$ Ћ$pHQ '""  r  @ 08#pHQ'"p ' #px' pX' 2pHQ '"$ Ћ$pHQ '""   ހHQ1pxwwp@pxwtp Ћ$ހHQpxwrp p@4 ~ǎǞWH<@~Dp   pUa(^a( 2r w4    ( "   0+       ~Dǎ@Ǟ<HHWQ V(  WH@~Dq l~Dǎ@HHWH<@~Drl '$~Dǎ@Ǟ<HHWH<0@~Dr 0 (+R a(a( <r NwX   @   "   J t  )r!  )a!"  pU~Dǎ@Ǟ<HHW@~<pn  Z   W    ~<@@W @(#)alloc.c 6.1 87/11/23 @(#)sh.local.h 6.1 87/11/23 @(#)doprnt.c 6.1 87/11/23 @(#)print.h 6.1 87/11/23  @     @  ,   +- +-0X0x +-0123456789ABCDEF0123456789abcdef @(#)printf.c 6.1 87/11/23 @(#)sh.c 6.1 87/11/23 @(#)sh.h 6.1 87/11/23 @(#)sh.local.h 6.1 87/11/23 @(#)sh.local.h 6.1 87/11/23 @(#)time.h 6.1 87/11/23 (<H\% # ..0a.outstatusHOMEhomeUSERuserTERMtermPATHpathpathshell/bin/csh/tmp/shverboseechoargvprompt/etc/profile.cshhome/.cshrchome/.loginverboseechologout .pathsavehisthome/.historysavehisthomehome/.logoutstatus Interrupted? %dpromptverbose-hmailYou have %smail. new %s in %s. New mailMail!^@DPXd<l8t-h-h./usr/ucb/bin/usr/binhistorysource~/.historyjobs @(#)sh.dir.c 6.1 87/11/23 @(#)sh.h 6.1 87/11/23 @(#)sh.local.h 6.1 87/11/23 @(#)sh.local.h 6.1 87/11/23 @(#)time.h 6.1 87/11/23 @(#)sh.dir.h 6.1 87/11/23 %s-lhomeUsage: dirs [ -l ]%s~%s/homeNo home directoryCan't change to home directory//.././cdpathNo other directoryDirectory stack not that deepBad directoryDirectory stack empty...cwd!Pdirs @(#)sh.dol.c 6.1 87/11/23 @(#)sh.h 6.1 87/11/23 @(#)sh.local.h 6.1 87/11/23 @(#)sh.local.h 6.1 87/11/23 @(#)time.h 6.1 87/11/23 AmbiguousUnmatched %c '`" Word too long*-*0101$< line too longargvargvNo file for $0argvVariable syntaxSubscript out of rangehtrqxeBad : mod in $$\'`"\'`"<<$\`<<<< terminator not foundLine overflowLine overflow#P#8#X\'`"argv @(#)sh.err.c 6.1 87/11/23 @(#)sh.h 6.1 87/11/23 @(#)sh.local.h 6.1 87/11/23 @(#)sh.local.h 6.1 87/11/23 @(#)time.h 6.1 87/11/23 . status%s: 1$ @(#)sh.exec.c 6.1 87/11/23 @(#)sh.h 6.1 87/11/23 @(#)sh.local.h 6.1 87/11/23 @(#)sh.local.h 6.1 87/11/23 @(#)time.h 6.1 87/11/23 ./pathNo matchCommand not foundshellshellshell/bin/csh/bin/sh echopath%H%L/bin/csh @(#)sh.exp.c 6.1 87/11/23 @(#)sh.h 6.1 87/11/23 @(#)sh.local.h 6.1 87/11/23 @(#)sh.local.h 6.1 87/11/23 @(#)time.h 6.1 87/11/23 ||&&|^&OtOOOOOOOPPPQ=<>Divide by 0Mod by 00}{(~!Expression syntax{ ... }Missing }statuserwxfdzoMissing file name0status!~=~!===>><<|&*/%+-()!~^Expression syntax @(#)sh.func.c 6.1 87/11/23 @(#)sh.h 6.1 87/11/23 @(#)sh.local.h 6.1 87/11/23 @(#)sh.local.h 6.1 87/11/23 @(#)time.h 6.1 87/11/23 '^'D%job(%job &Too few argumentsToo many arguments--Can't from terminalCan't from terminal aliasunaliasToo dangerous to alias that/bin/loginloginNot login shellEmpty ifthenImproper thenthenSyntax errorNot in while/foreachstatusExpression syntaxInvalid variableWords not ()'edNo matchExpression syntaxNot in while/foreachNot in while/foreachl,lkkhkLkkk\kkkkkktkkk\? thendefaultn@n4ndndn(ndndndndndnLnndndndn4'"then/endif not foundendif not foundendsw not foundend not foundlabel not found-nNo matchPATH==%o Improper maskNo job control in this shellNo match @(#)sh.glob.c 6.1 87/11/23 @(#)sh.h 6.1 87/11/23 @(#)sh.local.h 6.1 87/11/23 @(#)sh.local.h 6.1 87/11/23 @(#)time.h 6.1 87/11/23 noglobnonomatch{}{Unknown user: %shomeMissing ]Missing }Missing ]Missing ]Missing ]Arguments too longPathname too long{}{No matchAmbiguousUnmatched `` ... `Word too longToo many words from ``-`{[*? @(#)sh.hist.c 6.1 87/11/23 @(#)sh.h 6.1 87/11/23 @(#)sh.local.h 6.1 87/11/23 @(#)sh.local.h 6.1 87/11/23 @(#)time.h 6.1 87/11/23 10historyhistoryhistory-r-hhistoryUsage: history [ -r ] [ -h ] [ n ]history%6d @(#)sh.init.c 6.1 87/11/23 @(#)sh.local.h 6.1 87/11/23 22_22dP2i2_l2(42(42hp2_l2&2o2b2|h 2_l2_l2t2Id3d2x3e43o3c3 2ta3(30038`3@`3H @3P_(3X3`^$3h-3p+t3xJH3iH2p3q`3 l3"3$3t3c3 3t3`3K33q3 3f2l 344 442h4$4,444< 4D 2d 4L 2`4T4\2\4d2X4l4x42T44444442P4442L455 2H5 50585D5L5X5`5l5t55552D52@55555666(606@6H6\6d6x666URGPWRSYSBUSFPEILLINTHUPsetifend@setiffgendcdbg@aliasbreakbreakswcasechdircontinuedefaultdirsechoelseendifendswevalexecexitforeachglobgotohistoryjobskillloginlogoutnicenohupnotifyonintrpopdpushdrehashrepeatsetenvshiftsourcestopsuspendswitchtimeumaskunaliasunhashunsetunsetenvwaitwhilebreakbreakswcasedefaultelseendifendswexitforeachgotolabelswitchwhileHangupInterruptQUITQuitIllegal instructionTRAPTrace/BPT trapABRTAbortBNDSBoundsFloating exceptionKILLKilledBus errorSEGVSegmentation faultBad system callPIPEBroken pipeALRMAlarm clockTERMTerminatedUSR1User signal 1USR2User signal 2CHLDChild exitedPower failureUrgent conditionIOVFInteger overflowIDV0Integer divide by 0ROVFReal overflowRUVFReal underflowRDV0Real divide by 0RINXReal inexact resultRINVReal invalid operationRBFRReal invalid/unsupported operation @(#)sh.lex.c 6.1 87/11/23 @(#)sh.h 6.1 87/11/23 @(#)sh.local.h 6.1 87/11/23 @(#)sh.local.h 6.1 87/11/23 @(#)time.h 6.1 87/11/23 %sD"'`Unmatched Word too long htrqxeVariable syntaxExpansion buf ovflo:^$*-%Bad ! formtttttttttttt No prev subBad substituteNo prev lhsRhs too longBad ! modifier: Modifier failed44\4\\\4Subst buf ovflo(\p\\\(H-$*Bad ! arg selectorppp(=~: \ }No prev search: Event not foundignoreeof Use "logout" to logout. Use "exit" to leave csh. :# '`" ;&<>()| @(#)sh.misc.c 6.1 87/11/23 @(#)sh.h 6.1 87/11/23 @(#)sh.local.h 6.1 87/11/23 @(#)sh.local.h 6.1 87/11/23 @(#)time.h 6.1 87/11/23 Out of memory %sUndefined variable @(#)sh.parse.c 6.1 87/11/23 @(#)sh.h 6.1 87/11/23 @(#)sh.local.h 6.1 87/11/23 @(#)sh.local.h 6.1 87/11/23 @(#)time.h 6.1 87/11/23 Alias loop;& &Too many )'s;& &Too many )'sToo many ('s!&Badly placed (Missing name for redirectAmbiguous output redirectCan't << within ()'sAmbiguous input redirectBadly placed ()'sInvalid null command HHHH<<>() @(#)sh.print.c 6.1 87/11/23 @(#)sh.h 6.1 87/11/23 @(#)sh.local.h 6.1 87/11/23 @(#)sh.local.h 6.1 87/11/23 @(#)time.h 6.1 87/11/23 :%d%d:%d%d yP @(#)sh.proc.c 6.1 87/11/23 @(#)sh.h 6.1 87/11/23 @(#)sh.local.h 6.1 87/11/23 @(#)sh.local.h 6.1 87/11/23 @(#)time.h 6.1 87/11/23 @(#)sh.dir.h 6.1 87/11/23 @(#)sh.proc.h 6.1 87/11/23 @(#)wait.h 6.1 87/11/23 timetimenotify- BUG: waiting for background job! statusBUG: process flushed twiceݢ, & > >> < ; | )( << ... %d[%d] 4\\4) ) && |%s%s [%d]%s %c %10d %-21sRunning Exit %-16dDoneBUG: status=%-9o (core dumped) (wd: home(wd now: home -lUsage: jobs [ -l ] %s Bad signal numberUnknown signal; kill -l lists signals%s Arguments should be process id's%d: There are stopped jobs%#%-%+%%No current jobNo previous jobNo such jobAmbiguousNo job matches patternNo such job-No more processesNo job control in this shellNo job control in subshells @(#)sh.sem.c 6.1 87/11/23 @(#)sh.h 6.1 87/11/23 @(#)sh.local.h 6.1 87/11/23 @(#)sh.local.h 6.1 87/11/23 @(#)time.h 6.1 87/11/23 @(#)sh.proc.h 6.1 87/11/23 0+-0statusnicenicenohuptimestatus/dev/nullnoclobberCan't make pipe%s: File exists @(#)sh.set.c 6.1 87/11/23 @(#)sh.h 6.1 87/11/23 @(#)sh.local.h 6.1 87/11/23 @(#)sh.local.h 6.1 87/11/23 @(#)time.h 6.1 87/11/23 (=Syntax errorMissing )pathpathhistcharshistcharsuserUSERtermTERMhomeHOMESubscript errorSubscript out of range<>+-Syntax errorpathExpression syntaxBadly formed numberNo matchhistcharsargvNo more words:)Warning: ridiculously long PATH truncated PATH1 @(#)sh.time.c 6.1 87/11/23 @(#)sh.h 6.1 87/11/23 @(#)sh.local.h 6.1 87/11/23 @(#)sh.local.h 6.1 87/11/23 @(#)time.h 6.1 87/11/23 +-time%Uu %Ss %E %P%d.%01d%d.%01d%d%% @(#)sigretro.c 6.1 87/11/23 @(#)sigretro.h 6.1 87/11/23 @(#)sh.h 6.1 87/11/23 @(#)sh.local.h 6.1 87/11/23 @(#)sh.local.h 6.1 87/11/23 @(#)time.h 6.1 87/11/23 sigpause pid=0x%x (mask=0x%x) sigtramp:(%d) longjmp sigtramp: deferring signal %18 sigtramp:returning(func=IGN) for sig %d @(#)closedir.c 6.1 87/11/23 @(#)opendir.c 6.1 87/11/23 @(#)readdir.c 6.1 87/11/23 @(#)abort.c 6.1 87/11/23 @(#)atoi.c 6.1 87/11/23 @(#)ctype.c 6.1 87/11/23 ((((( H @(#)ecvt.c 6.1 87/11/23 Fn CAy7Aׄ@È@Y@$ @(#)errlst.c 6.1 87/11/23 JJJJJKKK8KLK`KpKKKKKKKKLL L0L@LTLhL|LLLLLLMM M$M8MTMhMMMMMMNN(.Error 0Not ownerNo such file or directoryNo such processInterrupted system callI/O errorNo such device or addressArg list too longExec format errorBad file numberNo child processesNo more processesNot enough spacePermission deniedBad addressBlock device requiredDevice busyFile existsCross-device linkNo such deviceNot a directoryIs a directoryInvalid argumentFile table overflowToo many open filesNot a typewriterText file busyFile too largeNo space left on deviceIllegal seekRead-only file systemToo many linksBroken pipeArgument out of domainResult too largeNo message of desired typeIdentifier removedChannel number out of rangeLevel 2 not synchronizedLevel 3 haltedLevel 3 resetLink number out of rangeProtocol driver not attachedNo CSI structure availableLevel 2 haltedDeadlock condition if locked @(#)getcwd.c 6.1 87/11/23 rpwd @(#)getenv.c 6.1 87/11/23 @(#)getpwnam.c 6.1 87/11/23 @(#)isatty.c 6.1 87/11/23 @(#)perror.c 6.1 87/11/23 : Unknown error @(#)sleep.c 6.1 87/11/23 @(#)tell.c 6.1 87/11/23 @(#)fgets.c 6.1 87/11/23 @(#)stdiom.h 6.1 87/11/23 @(#)filbuf.c 6.1 87/11/23 @(#)flsbuf.c 6.1 87/11/23 @(#)stdiom.h 6.1 87/11/23 @(#)popen.c 6.1 87/11/23 -csh/bin/sh @(#)dup2.c 6.1 87/11/23  @(#)getpwent.c 6.1 87/11/23 rr/etc/passwd @(#)memccpy.c 6.1 87/11/23 @(#)memchr.c 6.1 87/11/23 @(#)strtol.c 6.1 87/11/23 @(#)data.c 6.1 87/11/23 {{{}U @(#)fdopen.c 6.1 87/11/23 @(#)findiop.c 6.1 87/11/23 @(#)fopen.c 6.1 87/11/23 @(#)rew.c 6.1 87/11/23 .textX.data .bss].text.data(@.bss] .text 0$.datah9.bss^.text .data .bss^.textO.data .bss^.text% .data.bss^.text0.data!X.bss^.textBh>.data#`.bss^.textE8v.data$ 8.bss^.textK|.data%X .bss^.text\.data'@'.bss^.textvHJ.data+(.bss^.text ,.data-.bss^.text.data..bss^.text#.data6XD.bss^.text 1.data: .bss^.texti.data:.bss^.textπ1.data=.bss^.textX.data=H.bss^(.textp k.dataB@.bss^8.text8.dataCH(.bss^8.text .dataEp.bss^P.textP.dataF@@.bss^P.textX@.dataG .bss^P.text.dataG .bss^P.text `.dataG .bss^P.text.dataG.bss^P.text@.dataG(.bss^P.text.dataH .bss^P.text.dataH0(.bss^P.text.dataIX.bss^PX.text@.dataIp..bss^.text@ .dataNH(.bss^.text.dataNp .bss^.text`.dataN .bss^.text08.dataN .bss^.texth.dataN8.bss^.textH.dataO.bss^.textPX.dataO.bss^.text .dataO .bss^(.text (.dataO(.bss^.text .dataO(.bss^.text! .dataO(.bss^.text! .dataO(.bss^.text!8.dataO(.bss^.text!P8.dataO(.bss^.text!(.dataO( .bss^.text!(.dataOH@.bss^.text"P .dataO .bss^.text$(!.dataO@.bss^.text*0H.dataO0.bss^.text,x.dataP.bss_.text,.dataP.bss_.text,.dataP.bss_.text,.dataP.bss_.text,.dataP.bss_.text,.dataP.bss_.text-(.dataP .bss_.text-(0.dataP8.bss_.text-X .dataP8.bss_.text-x.dataP8.bss_.text- .dataP8.bss_.text-.dataP8.bss_.text- .dataP8.bss_.text-.dataP8.bss_.text-.dataP8.bss_.text-.dataP8.bss_.text-.dataP8.bss_.text..dataP8.bss_.text.(.dataP8.bss_.text.@.dataP8.bss_.text.X.dataP8.bss_.text.p.dataP8.bss_.text.(.dataP8.bss_.text..dataP8.bss_.text.X.dataP8.bss_.text/.dataP@.bss_.text/0.dataP@.bss_.text/.dataP@.bss_.text/ .dataP@.bss_.text0.dataP@.bss_.text0(.dataP@.bss_.text08.dataP@.bss_.text0P(.dataP@.bss_.text0x.dataP@.bss_.text0$.dataP@H.bss_0.text3H.dataP .bssp.text3@.dataP .bssp.text400.dataP .bssp.text6`.dataP8.bssp.text6`.dataV  .bssp.text7h@.dataV@ .bssp.text7.dataV` .bssp.text9x.dataV .bssp_environ _exit%_main__ndP8SaveRegp_malloc_sbrk._free_realloc __doprnt_putcharX__ctypeHP_ecvt_fcvt_strlen!8_printf(__stroutX_abort _strcmp!_quititp _getuid-_uidp(_loginshp,_chktimp0_time/%0_set_getenv _dinit%_fastp4_savestr"_saveblk_shvhedp8_set1_calloc_getpid-_putn_doldolpH_strspl4_shtemppP_signal/0_parintrpX_sigset_partermp`_phup_prompt _setintrpd_nofileph_arginppp_exiterrpt_intactpu_noexecpv_onelflgpx,p|6p}_setNS D_open.X_childp~_PerrorC_filep_dmoved_SHINp_isatty8_inttyp_SHOUTp_settell_setq8_getpgrp/$_shpgrpp_tpgrpp_opgrpp_oldiscp_pintr8_sighold_OLDSTDp_reslabp_setjmpP_haderrp_reenterp_srcunit_value_srccat_dohashJHAK"_processt_close,_goodbye<_rechist4U_unttyp_|_xfreeL_whylesp_gointrp_evalpp_evalvecpk(_HIST_cantellp_didfdsp_donefds(_fstat-_getgid-_copyv_Bq_errorB_strcpy! _strcat _creat,_dohist_adrof_getn_pintr1\_pjobsq_jobargv0_dojobs_bferrDP_draino_searchjl_pargvq_timflgq_blkfreel_gargvq _longjmpx_pendjob _paramlq(_justprq4_freelex_freesynθ_doneinpq5_closemH_chkstopq6q7_pnote_mailchk#d_eventnoq8_flush_errq@_lex_prlex_alias_syntaxŒ_executex_globone_blklen_number<_stat/_time0qH_gethdir$_didcchqL_dcopy_SHDIAGqN__exit-x_errnoG_ru0qP_shtimesq`_linelocqp_labufqx_lapux_aliasesu_alhistpu_alhisttu_alvecu_gflagu_gargcu_gnleftu_pargsu_pargcu_pnleftu_pargcpuu_lastevu_HISTSUB_bnameu_getcwdH_write0x_dheadu_printdu_dnewcwd0_dodirs&_dcwdv'_prefixl_dochngd(4_chdir,_dfind,_dfollow)_dfree._dcanon/_dopushd+t_digit _dopopd-_Dfix0_Dtest>_rscan_Dfix22_Dfix11|_ginitwP_Dvpv_Dcpv_Dpeekcv_unDredc>4_dolpv _dolcntv(_Dword2_copyblk_DgetC5|_any_QUOTES#0_Gcat_dolnxtv0_setDolp=_Dredc>D_Dgetdol6_dolmcntv8_dolmodv<_read._nulargv#@_alnumD_addla_udvar<_domod_Dpeekrdv@_Dtestq>_heredoc?0_unlink08_trim_scan_readcp_lseek.(_dobackp_nulvec#8_errsplvD_btoeof_onev$_perrorp_seterrD_seterr2D_seterrcE_one$_doexecE@_exerrvH_expathvP_pexerrG_tglobH_globvP_blkspl_xechoitI_closech,_justabs%8_havhashvX_hashK_xhashv`_texecG_execv-X_adrof1_lastsh%@I_execashId_lshift_blkpr_opendir`_readdir(K_expK_exp0K_exp1L_exp2M@_exp2aM_exp2bNX_exp2cN_exp3P _isaZh_Gmatch|_egetn\0_exp3aQl_exp4Rh_exp5S_exp6T_pfork0_evalavY_pwait֔_access,x_isbfunc\_lastchr_bfunc.H_dolabel^_dofg1D_dobg1_func] ^$_strip _donohup_(_dozip_l_prvars_x_plistѠ_doalias__unalias`_unset1 $`_isloginaL_dologin`_execl-(@_doifa'b_doelseb_dogotoc_btell_bseek<_wfreen2c_dobreakdP_toendn_doexitd<e4_letter_prereadg_doagainh_dowhilef_doendh GhpQiH_doswbrki_srchxj _srchn0_Stypex__Sgoalx`_getwordl_unreadcX_doechoo_echoo_doglobo[q`_setenvreqqs8_doumaskt_umask0({t_doevalt_gpathxh_gpathpxpxx_globcntx_noglobxx_collectw_sortbasxx_sorty8_globbedx_expandy_addpath_strend,_execbrc}H|@_match_amatch _entpx_tback_pword0_psaveh_mypipe_hfree_enthist_copylex$_dohist1_phist_dolet_dobg_dofg_dokill0_donice @_doset_shift l_dostop$_dotime _unset_dowait _mesg1X_alvecpx_hadhistx_getexcl_word_getC(_peekcx:_peekdx_exclpx_exclnxtx_exclcx<_getdol_quesargx_gethent_getsel_getsub_slhsx_lhsbx_rhsby_dosub_subword_matchs|_findev_noevX_matchevyH_bgetc<_ioctl-_blkcpy_bfreed_tell!_cfreeD_blkendh_blkcat$_dup2-_renum<_dup,_asyntaxx_asyn0_asyn3<_freenod$_syn0_syn1_syn1a_syn1b(_syn28_syn3Ɍ_RELPAR<_psecsψ_p2dig _linp=_linbufyP_pchild`y_times0_wait0PyyX_atoiz)z 4ڨ_pprint_pflush>@Iz(_pjwaitLSِ^z,i_palloc8_commandz0_cmdpz_cmdlenz_paddl_padssz_prusage _ptprint_ruadd _tvsub<_okpcntl0_pfind_pstart_pkill_kill._sleep_fork-}_nice.@_doiop_chkclob(_pipe._getinx_asx4 _getvx_xsetEh_operateh4_end_putn1_value1_madrof8_unsetv1 _unsetv _tvadd$_times0zz_sigsys_sigdispzd_pause.p__pause{_killpg8cerror$0J_popen*8_fgets!_pclose+_strchr 01d_strncmp!R0_alarm,_strcmpn!R__filbuf"_memccpy3U$).(__iobQ_fflush%,8V_fclose$xB'\__flsbuf%__wrtchk($__smbuf{__stdbufV_fcntl-_fdopen6h_brk._setpgrp/sigcode/F_fopen7_rewind9L1_strtol48_memchr3__sibuf}__sobufW7p_freopen7_btext_etext: _bdata _edata]_bbss]a__startup_settimes_initdesc_pathlist_nverbose_nexececho_loadhist_dosource_exitstat_importpath_enterhist_noregister_sigrelse_dumphist_neednote_savehist_getpwnam_Histlist_dtildepr_sigsetmask_sys_errlist_closedir_dounhash_psavejob_prestjob_doonintr_dologout_panystop_reexecute_doswitch_doforeach_docontin_dorepeat_dosetenv_dounsetenv_unsetenv_dosuspend_lastgpathp_nonomatch_acollect_globchars_matchdir_backeval_donotify_WORDMETA_setexclp_peekread_timesdone_pnoprocesses_proclist_gettimeofday_pcurrent_pprevious_pclrcurr_sigignore_pcurrjob_pflushall_pmaxindex_pgetcurr_pholdjob_sigchild_exportpath_plusplus_onlyread_timesdol_sigtable__Sigtramp_sigpause_sigblock__cleanup_Reduce_inf_sys_nerr_setpwent_getpwent_endpwent__bufendtab__bufsync__findbuf__lastbuf__xflsbuf_fgetpwent__findiopu!ߪ u%C.textu .data%v@.bss< < C) 0  !2$0 "&[WH<@~DXP .: "HTP(XP1PX%P`;P`%zPh;&PhPh;Uܓ-.PhPp9 rlqX5XWXGP*"X XIPtr2X-+  t&~Dǎ@Ǟ<HHWH<@~DpUU~Dǎ@Ǟ<HHWx?@DHLP~Tpq +qP? xtrejpWPPF,P  $\ 0#a$"XGP rqȓzP`8p8 *P""XGNPjP P` ܓ!P8Dvx8.Php8 *P""XFPP Phx|PXSpPPPDJPȎp(""XF&PB:PȎ* P"X EPPȆ h(8MPPP 4PDMrP H Px:xM>P!!!P;P!2!! hLvP PTP<P<:X|B`P*"X XD<PXPЋ,P Pp3~ "H"  Pp3FxK"H<P "89P ?(!  ?(! V +(!  +(! .*(! z*(!  !^ -R ^(! H ^(!  d  y(! 0m#(! p0WJސ(tJPЋzPن& PP h8&P J@(P OPqQؓQp?PPȆ$"X QؓAt"M(M( QL@Pw #"P >"XABP9tQjp%N "p d!RPPЋPن P HPq Qؓ Qp "p d!RPPЋVPlHL4p d!RPPP qPІ 0~TǎPǞLǮHǾD@xxWp@DH~LL^LTLJPPPLpR.`P=4PȎ* P"X ?P PpR BP7X<P* P"X8>PrX P> @P6P6"Xȓ>HPP3d 0#P6TP6FX;P*"XT X=P *$"Xl=Pt.`p!RPGpP;PPPȆ q* P"X= PpސR@ d.P""X<qP4$T   PJlD2~LǎHǞDǮ@ppWH<@~DqR[p hn[p\ *!44"4"Xؓ;P !pR[p,[p"X 3P+PAJ]>.]ȓ;(>;l@P#"X3P+NP+@~\ǎXǞTǮPǾL``W8]xPP88WXDH~Lqq!$  'q!'!! $"X2 "P(.<PX"'P0;d  !""7P8.;7PP.;P7"p Z $!  &"Xd18J8: ~LǎHǞDXXW8<@~Dq"X0! !0!#  !nHx'$H")\pF6p"X'/Hx'HH:. H=Nh: :b=*y: H:"H-RPȎ("X.H/0TP"&"X.H.P'~Dǎ@Ǟ<W@~<pts"X'.|"X.drsPp~<@@W8ȓX;;P88WH~D]v] p]8 !8v]:jqz"X ]7-bP4~DHHW8]; ]88W1C 1B# 1 2! W 0  40!10  W8@~Dp6 6 zt/ HD @(('Hz!H !H6D ~Dǎ@WXHL~P6pF78"67P(L H86N6t77T9    T77T~PǎLǞHXXW8$ 88WP<@D~Hp, LLpǀ1'2בסzH@80(L LLp  ~HǎDǞ@Ǯ<PPW :"4 mn2"'W Q!Q Q 0<<  # <$<( p'<8JF" 4#  m  n 4#  m  n!0F 4# m n$<4<< mn n 2$21  <,<0<@< W@8     BG G!    g   ,Q"%(  D b j D p     ~@ǎ<HHWH<@~DpǐLJ D   p&8  p&8' (. (t   ~Dǎ@Ǟ<HHW8 ȧ~4p  *        |'Q!R D D p&8%  ' p&87! ,~488W@8~<p  ( ppP]W&8( pp'@&8^*    p&8& ppP]W&8ֆW @  ~<ǎ8@@WP pR&8 a!` !WH@~Dq% l~Dǎ@HHWH<@~Dr '$~Dǎ@Ǟ<HHWH<0@~Dr 0 (+R a(a( <r NwX   @   "    j t  )r!  )a!"  p&8~Dǎ@Ǟ<HHW@~<p.`W .`&0 2  &'  ~<@@W8 0 2 #֋0 88W`DHLPTX~\q  *"(  D   p&8   Ǘ  8 І ρ  ' p&87! 0 @  0 *>  ( ~\ǎXǞTǮPǾLHD``WX?@DHLP~Ts @  aP/\ (  )  ' p&87! P (  <~TǎPǞLǮHǾD@XXWP<@DH~Lp   W |tlǧ" !  40,'  W     )V  H4W     ) ~LǎHǞDǮ@Ǿ<PPW@~<  pDQ  ,pa` qv  !~<@@Wh?HLPTX`~\   r `d rd `&pM` M`sltN`(r p > 2 ' )X()T )P<.V   pM`  ~\ǎXǞTǮPǾLHhhWP8<@D~Hq ^RFp߁M`LT8    LpM`L~HǎDǞ@Ǯ<Ǿ8PPW@\.`P"T.\(0 2 "T . "H"T  @@W@~<p>     W    ~<@@W@48~<p P ܴ    Z   & pp'@&8$ ppP]W&82 p&8z @  ~<ǎ8Ǟ4@@WP.p0>@DH".L @.M.p.@.DPPW!![W![W2![pW[XW![:W. >$.;0[W[B2!>[ W[ ƆWA[W@[W/[W[W[W2![W2![hW[ZW*[B.WC2!,[W2![W[)W )[))W.[W![~W!00[bWH .(N0n8@HPX` W`X .(N0n8Ɏ@ɮHPԩة>^觾[![W [W<[W90 [nW [TW[:. W2![W)WPT.> PPWA~"t0As3r21~Wh@~Dpn >x $|    / qHpH.z N`/N`JN`Xԍ Ndzz<\  (pZzN`<H * C q+~Dǎ@WpNNNNNǼO @P PPO$PpRU&8PO$%py}kg,PO$(VP p:w]ѡ[q" ,O(0O(ZְO(FpO@c(stdxX܋ `O d`O PO$([P  ,O(0O(ְO(`O d`O (PO$[PQ̡P! ! ,O(0O(XְO(`O d`O 'Π- 8ы0):@0CAMр ѡ(PO$[P Q фP р}-!ш},O(0O(ְO(`O d`O / q0фыh`O d`O / q0(фы4ONO`O csd(u$+\-` d#h.l*x0Āelh%ox0XeEfgGn9ld`O  Od`O @ O O "  !O`d`O }N; -!10N@@ V 8@  /  +!10N"  /  !10N @ /00 0ѡ $@ZPECѡMѡ pO }O uOO ^d`O } pq 5#"0ѡP n b V J@ O 6@ *Od`O O O d`O O @     0 9: @ O Oz OWC00_D00(_D00d`O - Op&@ 4OO  a@ 'O -OO pX Oo620Nx 0 NN"XN  OO   @ / & O g `h`O O 0!#иN0O,@O0ȧN(N N8O0 - NND  5  + NN NNg ю 0ѡaPO P .aP6 QaP POPO ׶`OpO8gN 06PO,QPU):RECAaFSRQaVrgagaO,- +aea E`NrvpOOO #2#: @ / & O g `h`O O 0<#0O,@O0ȧN(N N8O0`O PO,/Q)-0!-N! NB +N! N   N! NE00@qA0- '1qA@Aq@ `  .'qF<Ad &$ O OA@> QP&#1qA@Aq@O@pO`O #H O @ & O  ! O g `h`O 0#N0O,@O0ȧN(NN8N O,`O  FF=11=CCAM 0AMAPO,VA@O E@O pO}@NgOd``OO  >  O OOO @NpNN//,O(0O(ְO(zkg(PO$(VPp: w q&/,O(0O(DְO(@NpNN@ekd,O$( NDA4N,O(0O(NNְO( ֠ON/0,O(0O(ְO(Jkd(PO$(VP@:0D A&0,O(0O(4ְO(NpTkg(O$( wq( ,O(0O(ְO(     / ֠ON/0,O(0O(ְO(Jkd*PO$(VP@<0D A&0,O(0O(,ְO(N fpOp\kg,O$( Nwq,N,O(0O(ְO( ֠OO//,O(0O(tְO(Jkd*PO$(VP@< D A&/,O(0O(ְO(H{ p   O$( @  .@ , 2 ! . 00  +   R  pNؐNذNNNWH<@~Dp   p&8a(^a( 2r w4    ( "   0+       ~Dǎ@Ǟ<HHW"8 'H(  WP@DH~Lr @D''!' )7)d ~LǎHǞDǮ@PPW![ &W2!6[WPHx~Lp(,j~LǎHPPWPHx~Lp(,"~LǎHPPW`?8<@DH~Lp.ޠOO:T 2pO pOOOp  :X ސ0 OJp  C@:8 6p  : @$:@$ 1 P@$`^P5%cR:W^XP'86 0":B0C9"5 4r+!+ @$0:  ?05N?:@ 5p  5 @$0:  O( O( O:O( 0 &009 4 @$05p (  5(TO &1O  &0   9( ~LǎHǞDǮ@Ǿ<8`O`W   ?  ?0 6    W6    W!1021!0WX<@DHLPҧ~TsRNW  ( ( D 2 \ pױ&8'(R (> )     ,   aP/\ +! (() )((  ' p&87! BW  D ,,-   ~TǎPǞLǮHǾD@<XXW @(#)mail.c 6.1 87/11/24 w.HOMELOGNAMEmail: can't open %s for writing  :::::::::, P n n n n n ! a%s? r%srf:rpqietusage: mail [-erpqt] [-f file] [persons] mail: can't allocate hmboxMAILmail: can't allocate mailfilemail: permission denied! mail: cannot open %s No mail. Your mail is being forwarded to and your mailbox contains extra stuff mail: can't open %s usage invalid command mail: cannot append to %s mail: cannot save mail invalid command wrarmail: can't re-read %s mail: can't re-write %s mail: can't re-read %s copyback:Too many letters mail: can't rewrite %s mail: cannot copy mail back new mail arrived copymt:Too many letters r%c remote from %s forwarded by %s wwr > %s %s %s%s %.16s %.3s %.5sFrom>Frommail: cannot reopen %s for reading mail: can't malloc mail: cannot create %s Mail saved in %s Mail saved in %s mail: cannot save in dead letter wnull name mail %smail %suux - %s!rmail \(%s\)uux - %s!rmail %smail: cannot pipe to mail command a-unbounded forwarding mail: can't send to %s mail: cannot append to %s mail: cannot append to %s mail: error signal %d mail: %s not creatable after %d tries .-csh/bin/sh/tmp/maXXXXXFrom To: /usr/spool/mail/.lock/dead.letter/tmp/marXXXXXXForward to mail: no space for temp file /mboxXd q quit x exit without changing mail p print s [file] save (default mbox) w [file] same without header - print previous d delete + next (no delete) m [user] mail to user ! cmd execute cmd @(#)ctime.c 6.1 87/11/23 Day Mon 00 00:00:00 1900 SunMonTueWedThuFriSatJanFebMarAprMayJunJulAugSepOctNovDecTZpPDTPSTW`/Lw/K:/JMFw/ @(#)getenv.c 6.1 87/11/23 @(#)getlogin.c 6.1 87/11/23 /etc/utmp @(#)getopt.c 6.1 87/11/23 --: illegal option -- : illegal option -- : option requires an argument -- : option requires an argument --  @(#)getpwent.c 6.1 87/11/23 rr/etc/passwd @(#)getpwnam.c 6.1 87/11/23 @(#)getpwuid.c 6.1 87/11/23 @(#)malloc.c 6.1 87/11/23 @(#)memchr.c 6.1 87/11/23 @(#)mktemp.c 6.1 87/11/23 @(#)mon.c 6.1 87/11/23 PROFDIRmon.out @(#)perror.c 6.1 87/11/23 : Unknown error @(#)sleep.c 6.1 87/11/23 @(#)strtol.c 6.1 87/11/23 @(#)ttyslot.c 6.1 87/11/23 /etc/utmp @(#)data.c 6.1 87/11/23 ]]]_o&8 @(#)fgetc.c 6.1 87/11/23 @(#)fgets.c 6.1 87/11/23 @(#)stdiom.h 6.1 87/11/23 @(#)filbuf.c 6.1 87/11/23 @(#)flsbuf.c 6.1 87/11/23 @(#)stdiom.h 6.1 87/11/23 @(#)fopen.c 6.1 87/11/23 @(#)fprintf.c 6.1 87/11/23 @(#)fputc.c 6.1 87/11/23 @(#)fputs.c 6.1 87/11/23 @(#)stdiom.h 6.1 87/11/23 @(#)fread.c 6.1 87/11/23 @(#)stdiom.h 6.1 87/11/23 @(#)fseek.c 6.1 87/11/23 @(#)ftell.c 6.1 87/11/23 @(#)popen.c 6.1 87/11/23 -csh/bin/sh @(#)printf.c 6.1 87/11/23 @(#)rew.c 6.1 87/11/23 @(#)setbuf.c 6.1 87/11/23 @(#)sprintf.c 6.1 87/11/23  @(#)ctype.c 6.1 87/11/23 ((((( H @(#)errlst.c 6.1 87/11/23 +,, ,(,8,P,\,x,,,,,,-- -$-0-<-P-`-p-------...0.@.L.d.x.....///</X/h.Error 0Not ownerNo such file or directoryNo such processInterrupted system callI/O errorNo such device or addressArg list too longExec format errorBad file numberNo child processesNo more processesNot enough spacePermission deniedBad addressBlock device requiredDevice busyFile existsCross-device linkNo such deviceNot a directoryIs a directoryInvalid argumentFile table overflowToo many open filesNot a typewriterText file busyFile too largeNo space left on deviceIllegal seekRead-only file systemToo many linksBroken pipeArgument out of domainResult too largeNo message of desired typeIdentifier removedChannel number out of rangeLevel 2 not synchronizedLevel 3 haltedLevel 3 resetLink number out of rangeProtocol driver not attachedNo CSI structure availableLevel 2 haltedDeadlock condition if locked @(#)isatty.c 6.1 87/11/23 @(#)memccpy.c 6.1 87/11/23 @(#)ttyname.c 6.1 87/11/23 /dev/ 000000000000000000000123456789abcdef0123456789ABCDEF @(#)fdopen.c 6.1 87/11/23 @(#)findiop.c 6.1 87/11/23 @(#)dowrite.c 6.1 87/11/23 @(#)print.h 6.1 87/11/23 @(#)ecvt.c 6.1 87/11/23 Fn CAy7Aׄ@È@Y@$ @(#)fwrite.c 6.1 87/11/23 @(#)stdiom.h 6.1 87/11/23 W...Xct_dskpmtwrct~rdskrmtsxtconsoletty01tty02tty03tty04tty05tty06tty07tty8tty9tty10tty11tty12tty13tty14tty15tty16tty17tty18tty19tty20tty21tty22tty23tty24tty25tty26tty27tty28tty29tty30tty31tty08tty09ttymemkmemnullprferrorsysconsysttylpsxt000sxt001sxt002sxt003sxt004sxt005sxt006sxt007sxt010sxt011sxt012sxt013sxt014sxt015sxt016sxt017ttyp0ptyp0ttyp1ptyp1ttyp2ptyp2ttyp3ptyp3ttyp4ptyp4ttyp5ptyp5ttyp6ptyp6ttyp7ptyp7ttyp8ptyp8ttyp9ptyp9ttypaptypattypbptypbttypcptypcttypdptypdttypeptypettypfptypfttyq0ptyq0ttyq1ptyq1ttyq2ptyq2ttyq3ptyq3ttyq4ptyq4ttyq5ptyq5ttyq6ptyq6ttyq7ptyq7ttyq8ptyq8ttyq9ptyq9ttyqaptyqattyqbptyqbttyqc ptyqc ttyqd ptyqd ttyqe ptyqettyqfptyqftcpiprnetX.W..Y0Z0n[0q114\0q114n]0q119^0q119n_.W..`c0d0s0ac0d0s1bc0d0s2cc0d0s3dc0d0s4ec0d0s5fc0d0s6gc0d0s7hc0d0s8ic0d0s9jc0d0s10kc0d0s11lc0d0s12mc0d0s13nc0d0s14oc0d0s15p.W..q0mr0mns0it0inu0hv0hnw.W..x0y0nz0q114{0q114n|0q119}0q119n~.W..c0d0s0c0d0s1c0d0s2c0d0s3c0d0s4c0d0s5c0d0s6c0d0s7c0d0s8c0d0s9c0d0s10c0d0s11c0d0s12c0d0s13c0d0s14c0d0s15.W..0m0mn0i0in0h0hn.W..000001002003004005006007010011012013014015016017...bridge copyrights"log$templatesKtoolsRdiskbootSctbootcioTmtbootcioUcronVswapWwhodoXbootcopyYchrootZclri[dcopy\defgrp]defuser^devnm_dfsck`dksizeaffbfsbacfsckdfsdbegrpckfkillallglabelithmkfsimklost+foundjmknodkmkvtoclncheckmprtvtocnpwckosetmntpvolcopyqwallrmountsumounttlinkuunlinkvmvdirwvtocdftxfincyfreczvipw{filesave|tapesave}install~fusercrashcheckallfscknightgettydefsinitconspowerfailbcheckrcbrcinitlpmachconfrcrc.localTIMEZONEgrouppasswdshutdownmountlistprofileprofile.cshstdprofilestdcshrcchecklistissuemotdinittabadddiscaddfsinstall.rxmkfsinitcheckdateinstall.optioninitgettytelinitprfdcprfldprfprprfsnapprfstatmagicmnttabwtmputmpioctl.sysconftpusershostshosts.equivnetworksprotocolsrc.inetservicesftpdifconfigifcksuminitcpiprlogindlogin_netrouteroutedquerytracershdrwhodtelnetd...CONFIGSGLOBALSbootfilenameremotemakemacrocatnet_cs200rcstdbridgestdtty......u!ߤ} R`*AH.textR` .data*S@.bss==AH&8 0  !2$0 " *[Wp~<4  pqz0z֓4RP @ P r P(` bChLP0P1P2P3P P8  2: " 0#( "0%# 8  ~4q t 0 F@P L$~488WH<@4~D(vp(^ޓp   ^p  ! " nfq   Є$z! "  p!  ~Dǎ@Ǟ<HHWpT~Xpހd\\!\\Xp t^d^(^\^,^h^0^\^4^l.`>\^8cV(gV)kV*oV+~XǎTppWV0 P82!100 0& "!@ 0" "!  ! P(2!1 @W@~<p$pp~<pP V0'Г~<@@WX8 H        0  a 0  a 0 q       !XXW V(0P0@ BA@ C1!A   ! WH<@~DHH  >x  tT~Dǎ@Ǟ<HHWH@~D #Ppހܓ#P 8! pׁp .  l"\  @!0~Dǎ@HHW@~<p, 0\,,( (~<@@W8P,Ȇ ( 6,88WH<@~D,*0 , Z ,= 4 #8pp q !MM0B M,M(q pM PM8PM$pq !R  q:M( qPp'qp M ~Dǎ@Ǟ<HHW 1~.p@ At @@!~W觎N~ :p0'8 px' pX' 0ހ#yp rxwtpsq  0hp7\ހ#yp rxw΀ xp@ހ#yp rxwrp ΀a΀Aqpt   r g 0.#&.($ $D #y Ds((p`W`  t.> `0  `  D>.N 0 p(`@  `    ~ǎW#PWp[BX?@DHLP~TpMЎrM̆b 0\Mtp$M M MMГp  \(\(p\0Mp qMȈ  ( ^$: $! 01'q2! 'q/ !' :Gq21304!:'q.$,/4 $චM̧M̧ MPMq9(9#0@@5601 0M M)f~TǎPǞLǮHǾD@XXWP<@DH~Lp (( xbN8  p* p r ~LǎHǞDǮ@Ǿ<PPW8N8088W!2! W!21!0W! W!120WX?@DHLP~Tr8     *8\  ' p*7! ` ?  ~TǎPǞLǮHǾD@XXWH@~Dp W & !   D 6ހ&  @  +(  ! p!*!7  R   .   W    ~Dǎ@HHW8 ȧ~4p&.q+(~488W@8~<pp ~W  < r  #P  ~<ǎ8@@W8 ȧ~4p T g "Q%(   ~488WH<΀ ~@q R  Bb p*'(! ,>     BG G! h    g   ,Q"%(  D b j D p     ~@ǎ<HHWH<@~DpǐLJ D   p*  p*' (. (   ~Dǎ@Ǟ<HHW8 ȧ~4p  *        |'Q!R D D p*%  ' p*7! ,~488W@8~<p  ( ppP\8W*( pp+*^|*    p*& ppP\8W*W @  ~<ǎ8@@WP pR* a!` !WH@~Dq+d l~Dǎ@HHWH<@~Dr '$~Dǎ@Ǟ<HHWH<0@~Dr 0 (+R a(a( <r NwX   @   "    t  )r!  )a!"0  p*~Dǎ@Ǟ<HHW@\.`P&.\(0 2 & . &&  @@W@~<p^  B   W    ~<@@W@\.`.\&@@W@.` >`#@@WX@~D.x qώxTP.LH@HU(~Dǎ@XXWP.p0>@DH".L @.M.p.@ P.DPPW[W![W8 @ (R88W[ W![ W[W2!6[pW2![\W2![@W[2WC2!,[W2![W[&8W &8[&8&8W'[W'[W!00[zWH .(N0n8@HPX` W`X .(N0n8Ɏ@ɮHPԩة>^觾[90 [W2![W@8~X PPWP48<@DH~LN`HNh! N`N`! NhNhNtN`NpNtN|րNpqpN$NpN| N|x((lx! ( 2NtN`  !(hրN|Ntp0qp((q$Nt N|sqp'( (&,    NtpN|p  PNt! N`!Nt xF pNp(PNpNxNp N|NpN|~LǎHǞDǮ@Ǿ<84PPWNp! !Nt! N|WP<@DH~Ly   s  Rq(+p#((p(pspNx~LǎHǞDǮ@Ǿ<PPWA~"t0As3r21~W0+K "AC1!WAC$AhAC%hAC&hACWQWPX%AC1QCGxBBSD"vt ('"AC8('p'"$AC4$X$AhAC!FhAC" QP&#1qA@Aq@O@pO`O #H O @ & O  ! O g `h`O 0#N0O,@O0ȧN(NzN8N O,`O  FF=11=CCAM 0AMAPO,VA@O E@O pO}@NgOd``OO  >  O OOO @NpNN/+,O(0O( ְO(zkg(PO$(VPp: w q&+,O(0O( ְO(@NpNN@ekd,O$( NDA4N,O(0O(N NְO( ֠ON/, ,O(0O( ְO(Jkd(PO$(VP@:0D A&, ,O(0O( tְO(NpTkg(O$( wq( ,O(0O( ְO(     / ֠ON/, ,O(0O( ְO(Jkd*PO$(VP@<0D A&, ,O(0O( lְO(N fpOp\kg,O$( Nwq,N,O(0O( ְO( ֠OO/+,O(0O( ְO(Jkd*PO$(VP@< D A&+,O(0O( XְO(H{ p   O$( @  @ , 2 ! . 00  +   B  pNؐNذNNNWhLPTX\`~dpЩ.   #yd !0#y!#"(    % %X՘!! . $  * #yߎ ޠ l h  [ h  #yΰl cf[^Ԅ!0#y!#"( cs [(~(^ *>h^,"~(^ *;^,h    ~dǎ`Ǟ\ǮXǾTPLhhWP8<@DHL~P~P^^^ϞT^^x^:d2p,`W^Q^ΰ L +!R  ->^Q^Ҍ![RQ^ #y^P v #y0& #y 7W(!^Q^.^Q^e E|t^Q^dT! #y+ - B!s` T). 2 l.242# .242""7^P l$^PLh(^z ^P~PǎLǞHǮDǾ@<8W`<@DHLP~T~ XcsR[\RP^\*)b!!0#.0#y#"( ^\P!+"  4nX  c ~TǎPǞLǮHǾD@<``WH<@~Dp^qV  1 ]2 - qR Z -87#@]$*'B2 2# q q1 ]2~Dǎ@Ǟ<HHW& +(  WP@DH~Lr @D''!'Ӿ )7 P)| ~LǎHǞDǮ@PPW ! ^ 0(,01  !W!)[vW`@DHLPT~XP^\0#y #"( + "  -^\Q^\ p1@ΐ. ~Hΐ0 Aj0ސ ̈ *ސ ̈:zA@ސ ̈* ސ ̈:zpޠ#yeΐ. TB 9Ȍ19#59'3( E e 0@ (@@0@ (@@ @+ @-1p#y@GDD@>@B*  p#y@GDD@0 p-X-X,=:yp6p?qq5yq-(-X K ?0@@A@ q5'@sA@  6! #;K;;#\ 2  ~XǎTǞPǮLǾHD@``WPHx~Lp(,j~LǎHPPWPHx~Lp(,"~LǎHPPW`?8<@DH~Lp.ޠOO:T 2pO pOOOp  :X ސ- Op  C@:8 6p  : @$:@$ 1 P@$`^P5%cR:W^XP'86 0":B0C9"5 4r+!+ @$0:  ?05N?:@ 5p  5 @$0:  O( O( O:O( 0 &009 4 @$05p (  5(TO &1O  &0   9( ~LǎHǞDǮ@Ǿ<8`O`WP@D~Hr :  .LpL8"#P:GA5pp!`' pq90A@3 95pL1"#PP>5p(`pq91A 31906~HǎDǞ@PPW0 1 @4AW   ?  ?0 6    W6    WX<@DHLPҧ~TsRNW  ( ( D " \ pױ*'(R (> )p     ,   aP/\ +! (() )((  ' p*7! BW  D ,,-  ~TǎPǞLǮHǾD@<XXWA0~: r:2rqrp?5p?:pprq3rp?:ppp:sp2~ǎW0@ A#1 ! 1W @(#)boot.c 6.1 87/11/24 //dev/rnetbr_boot: opening raw networkbr_boot: ioctlboot: failed to open bootfile %s br_boot: reading bootfiler%2.2X%d%c%d%c%d%c%dbr_boot: raw net writeP8PFPdPjV0V>V\Vb/etc/bridge/ /etc/bridge/ @(#)ghostbynam.c 6.1 87/11/23 @(#)perror.c 6.1 87/11/23 : Error %.3d @(#)gethostent.c 6.1 87/11/23 r # r/etc/hosts @(#)inet_addr.c 6.1 87/11/23 V ` | @(#)errlst.c 6.1 87/11/23 @HTp  4HTlx(8P`x ,8DPp| $0<HT`lx ,8DP\ht(4@LXdp| $0<HT`lx  0 D d |    ! !8!X!h!!!!"""4"X"|"""""###,#<Error 0Not ownerNo such file or directoryNo such processInterrupted system callI/O errorNo such device or addressArg list too longExec format errorBad file numberNo child processesNo more processesNot enough spacePermission deniedBad addressBlock device requiredDevice busyFile existsCross-device linkNo such deviceNot a directoryIs a directoryInvalid argumentFile table overflowToo many open filesNot a typewriterText file busyFile too largeNo space left on deviceIllegal seekRead-only file systemToo many linksBroken pipeArgument out of domainResult too largeNo message of desired typeIdentifier removedError 37Error 38Error 39Error 40Error 41Error 42Error 43Error 44Deadlock condition if lockedError 46Error 47Error 48Error 49Error 50Error 51Error 52Error 53Error 54Error 55Error 56Error 57Error 58Error 59Error 60Error 61Error 62Error 63Error 64Error 65Error 66Error 67Error 68Error 69Error 70Error 71Error 72Error 73Error 74Error 75Error 76Error 77Error 78Error 79Error 80Error 81Error 82Error 83Error 84Error 85Error 86Error 87Error 88Error 89Error 90Error 91Error 92Error 93Error 94Error 95Error 96Error 97Error 98Error 99Error 100Error 101Error 102Error 103Error 104Error 105Error 106Error 107Error 108Error 109Error 110Error 111Error 112Error 113Error 114Error 115Error 116Error 117Error 118Error 119Error 120Error 121Error 122Error 123Error 124Error 125Error 126Error 127Error 128Error 129Error 130Error 131Error 132Error 133Error 134Operation would blockOperation now in progressOperation already in progressSocket operation on non-socketDestination address requiredMessage too longProtocol wrong type for socketProtocol not availableProtocol not supportedSocket type not supportedOperation not supported on socketProtocol family not supportedAddr. family not supported by proto familyAddress already in useCannot assign requested addressNetwork is downNetwork is unreachableNetwork dropped connection on resetSoftware caused connection abortConnection reset by peerNo buffer space availableSocket is already connectedSocket is not connectedCannot send after socket shutdownToo many references: cannot spliceConnection timed outConnection refusedToo many levels of symbolic linksFile name too longHost is downNo route to hostDirectory not emptyToo many processesToo many usersDisc quota exceeded @(#)ctype.c 6.1 87/11/23 ((((( H @(#)mon.c 6.1 87/11/23 PROFDIRmon.out @(#)sleep.c 6.1 87/11/23 @(#)fgets.c 6.1 87/11/23 @(#)stdiom.h 6.1 87/11/23 @(#)filbuf.c 6.1 87/11/23 @(#)flsbuf.c 6.1 87/11/23 @(#)stdiom.h 6.1 87/11/23 @(#)fopen.c 6.1 87/11/23 @(#)printf.c 6.1 87/11/23 @(#)rew.c 6.1 87/11/23 @(#)scanf.c 6.1 87/11/23 @(#)sprintf.c 6.1 87/11/23 @(#)dup2.c 6.1 87/11/23 ~P @(#)getenv.c 6.1 87/11/23 @(#)isatty.c 6.1 87/11/23 @(#)malloc.c 6.1 87/11/23 @(#)memccpy.c 6.1 87/11/23 @(#)data.c 6.1 87/11/23 \H\H\P^@nH* 000000000000000000000123456789abcdef0123456789ABCDEF @(#)doscan.c 6.1 87/11/23 @L@B@B@B@d@d@d@d@d@d@d@T@d@d@d@d@d@L@d@d@\ @(#)findiop.c 6.1 87/11/23 @(#)dowrite.c 6.1 87/11/23 @(#)print.h 6.1 87/11/23 @(#)ungetc.c 6.1 87/11/23 @(#)atof.c 6.1 87/11/23 @(#)ecvt.c 6.1 87/11/23 Fn CAy7Aׄ@È@Y@$ @(#)ldexp.c 6.1 87/11/23 @(#)memset.c 6.1 87/11/23 @(#)fwrite.c 6.1 87/11/23 @(#)stdiom.h 6.1 87/11/23 @(#)frexp.c 6.1 87/11/23 @(#)memchr.c 6.1 87/11/23 .textX.data.bss=.textm.datax.bss=.text.data .bss=.textp.data@.bss=.text 0#.dataX.bss=.text  .data@0.bssM.text.datap .bssM.text.data#P.bssM.text.data#X(.bssM.text .data$.bssM.text8p!.data$8.bssMp.text .data$ .bssN8(.text .data$.bssN`.text.data$.bssN`.text.data$.bssN`.text .data$.bssN`.text0(.data$@.bssN`.textXP .data% .bssN`.text!.data%8@.bssN`.text.data%x .bssN`.text.data% .bssN`.text8x.data% .bssN`.text.data% .bssN`.text`.data% .bssN`.text.data&.bssN`.text.data&.bssN`.text.data&.bssN`.text (.data& .bssN`.textH.data&8.bssN`.text` .data&8.bssN`.text.data&8.bssN`.text.data&8.bssN`.text.data&8.bssN`.text.data&8.bssN`.text.data&8.bssN`.text.data&8.bssN`.text.data&8.bssN`.text X.data&8.bssN`.text h.data&@.bssN`.text .data&@.bssN`.text!( .data&@.bssN`.text!H.data&@.bssN`.text!`.data&@ .bssN`.text"8.data&` .bssN`.text"P*.data& .bssN` .text&H.data& .bssN.text&`X.data&.bssN.text*X.data&.bssN.text+.data&8.bssN.text+.data+H.bssN(.text< H%.data,@x.bssO.textF(@.data, .bssO.textFh.data,@.bssO.textGx.data- .bssO.textG.data-8.bssO.textG .data-8p.bssO.textJ.data-.bssOX.textN@X.data.( .bssP.textO0.data.H .bssP.textOH.data.h.bssP.textP .data.h@.bssP.textR .data. .bssP.textR@.data. .bssP_environ_exit_main__nd&8SaveRegP_forkH_close_open_dup2(_setpgrp h_nfidP _perrorxP(_ioctl_uname!(_IP_srcP0_ibufferP8_read_eh_xh_bh'l_bowner\1T_obh_bsend,_bd_bload_strcpy_printf_obd _bpatch_sleep=p_sprintf_fopen_fscanf_fclose_IP_dstV(_obufferV0_oeh_oxh_write!H_fstat`G 8_strcmpS _ _errno#Pk8u_strlen_rewind@_fgets8 __ctype#x_domains\ cerror_monitor@_profil_creat\(\0_getenv!h_getpid____Argv$_strrchr_alarm_signal _setjmp*_pause_longjmp*__filbuf`_memccpy& *xl__iob&_fflush+_free% __flsbuf4__wrtchk__smbuf\8__stdbuf+_malloc"X_isatty" F0_freopen_lseek__doprnt+_scanf__doscan<_sscanf_dupG_end~P_sbrk 4_brk _getpgrp tsigcode _realloc%P_memcpy&`__sibuf^@__sobufnHFp_ecvtJ_fcvtJ_ungetcG_atofG_memsetO_fwriteP_ldexpNHO_frexpR(_memchrR_btext_etextS_bdata_edata=_bbss=__startup_EAddress_gethostbyname_brequest_turnaround_bstuffIP_sethostent_gethostent_endhostent_sys_nerr_sys_errlist_inet_addr__cleanup__countbase__countmax__bufendtab__bufsync__findbuf__lastbuf__xflsbuf__findiop__dowrite_Reduce_infu!ߤMR 2*hh.text2 .datahh3h@.bss--*h#` 0  !2$0 h"[W`~HD pqzr $0 4LNKOPQRS0 L b\0 P0(^(^\08 0^,,6(Dh@~D zpW (zp,H (LF(ZP20Àz 2pt8Àzz p8 z" pʋ,8Àzz Zp8 z" p @zpF@$z p @ &z"( "p 8z @zpF@$z p @ &z"( >p ~Dǎ@hhW@ ~<zq/S/TS H ~<@@WH  0a0  0 6(P0(^(,080"HHWH@~D "pހ " ! pׁp   " x   p! `~Dǎ@HHW2!h[xWnC2!o^(n,[nRWnC2!p^(n,[n*W2!d[W"Wp[BX?@DHLP~Tp-r-b 0 -p$- -  --p  6060p68-p q-  ( ^"ȓ  "Ћ! 01'q2! 'q/v !' :Gq21304!:'q."؆,/ "-- -P-q9(9#0@@5601 0- -)~TǎPǞLǮHǾD@XXW!21!0W! W!120W8 ȧ~4p#.q((~488W@8~<pp ~W  < r "   ~<ǎ8@@W8 ȧ~4p T g "Q%(   ~488WH<΀ ~@q R  Bb p''(! ,>     BG G!    g   ,Q"%(  D b j D p     ~@ǎ<HHWH<@~DpǐLJ D   p'  p'' (. (   ~Dǎ@Ǟ<HHW8 ȧ~4p  *        |'Q!R D D p'%  ' p'7! ,~488W@8~<p  ( ppP6@W'( pp('^*    p'& ppP6@W'W @  ~<ǎ8@@WP pR' a!` !WP.p0>@DH".L @.M.p.@ .DPPW[W![W8 @ 88W[ FW![ &W[W2![W2![WC2!,[W2![W[#`W #`[t#`#`W'[W'[W2![0W@8~Ѝ PPWP48<@DH~L.`H.h! .`.`! .h.h.t.`.p.t.|ր.pqpN$.p.| .|x((lx! ( 2.t.`  !(hր.|x.tp0qp((q$.t .|sqp'( (&    .tp.|p  P.t! .`!.t xF p.p(P.p.x.p .|.p.|~LǎHǞDǮ@Ǿ<84PPW.p! !.t! .|WP<@DH~Ly   s  Rq(+p#X((p(psp.x~LǎHǞDǮ@Ǿ<PPW0+K "AC1!WAC$AhAC%hAC&hACWQWPX%AC1QCGxBBSD"vt ('"AC8('p'"$AC4$X$AhAC!FhAC" QP&#1qA@Aq@/@p/`/ #H / @ & /  ! / g `h`/ 0#.0/,@/0ȧN(..8. /,`/  FF=11=CCAM 0AMAP/,VA@/ E@/ p/}@.g/d``//  >  / /// @.p../),/(0/(Vְ/(zkg(P/$(VPp: w q&),/(0/(ְ/(@.p..@ekd,/$( .DA4.,/(0/(..ְ/( ֠/./),/(0/(Fְ/(Jkd(P/$(VP@:0D A&),/(0/(ְ/(.pTkg(/$( wq( ,/(0/(ְ/(     / ֠/./),/(0/(@ְ/(Jkd*P/$(VP@<0D A&),/(0/(ְ/(. fp/p\kg,/$( .wq,.,/(0/(tְ/( ֠///),/(0/(,ְ/(Jkd*P/$(VP@< D A&),/(0/(ְ/(H{ p   /$( @  @ , 2 ! . 00  +    p.ؐ.ذ...WP@DH~Lr @D''!' )7`)\ ~LǎHǞDǮ@PPW!)[ٖW2!6[xWPHx~Lp(,j~LǎHPPWPHx~Lp(,"~LǎHPPW`?8<@DH~Lp.ޠ//:T 2p/ p///p  :X ސ) /Jp  C@:8 6p  : @$:@$ 1 P@$`^P5%cR:W^XP'86 0":B0C9"5 4r+!+ @$0:  ?05N?:@ 5p  5 @$0:  /( /( /:/( 0 &009 4 @$05p (  5(T/ &1/  &0   9( ~LǎHǞDǮ@Ǿ<8`/`W   ?  ?0 6    W6    WX<@DHLPҧ~TsRNW  ( ( D   \ pױ''(R (> )߈     ,ڶ   aP/\ +! (() )((  ' p'7! BW  D ,,-V  ~TǎPǞLǮHǾD@<XXW0@ A#1 ! 1W @(#)file.c 6.1 87/11/24 /br_file: open socketbr_file: bindbr_file: recvfrompHHHHH(HHHHHpbr_file: sendto080>0>0>0>/etc/bridge @(#)perror.c 6.1 87/11/23 : Error %.3d @(#)errlst.c 6.1 87/11/23 $8H\p,@Thx,@LXdp| ,8DP\ht(4@LXdp| $0<HT`lx ,8DP\ht @`  $ D p     !!4!P!l!!!!!""0"@"T"h"|"Error 0Not ownerNo such file or directoryNo such processInterrupted system callI/O errorNo such device or addressArg list too longExec format errorBad file numberNo child processesNo more processesNot enough spacePermission deniedBad addressBlock device requiredDevice busyFile existsCross-device linkNo such deviceNot a directoryIs a directoryInvalid argumentFile table overflowToo many open filesNot a typewriterText file busyFile too largeNo space left on deviceIllegal seekRead-only file systemToo many linksBroken pipeArgument out of domainResult too largeNo message of desired typeIdentifier removedError 37Error 38Error 39Error 40Error 41Error 42Error 43Error 44Deadlock condition if lockedError 46Error 47Error 48Error 49Error 50Error 51Error 52Error 53Error 54Error 55Error 56Error 57Error 58Error 59Error 60Error 61Error 62Error 63Error 64Error 65Error 66Error 67Error 68Error 69Error 70Error 71Error 72Error 73Error 74Error 75Error 76Error 77Error 78Error 79Error 80Error 81Error 82Error 83Error 84Error 85Error 86Error 87Error 88Error 89Error 90Error 91Error 92Error 93Error 94Error 95Error 96Error 97Error 98Error 99Error 100Error 101Error 102Error 103Error 104Error 105Error 106Error 107Error 108Error 109Error 110Error 111Error 112Error 113Error 114Error 115Error 116Error 117Error 118Error 119Error 120Error 121Error 122Error 123Error 124Error 125Error 126Error 127Error 128Error 129Error 130Error 131Error 132Error 133Error 134Operation would blockOperation now in progressOperation already in progressSocket operation on non-socketDestination address requiredMessage too longProtocol wrong type for socketProtocol not availableProtocol not supportedSocket type not supportedOperation not supported on socketProtocol family not supportedAddr. family not supported by proto familyAddress already in useCannot assign requested addressNetwork is downNetwork is unreachableNetwork dropped connection on resetSoftware caused connection abortConnection reset by peerNo buffer space availableSocket is already connectedSocket is not connectedCannot send after socket shutdownToo many references: cannot spliceConnection timed outConnection refusedToo many levels of symbolic linksFile name too longHost is downNo route to hostDirectory not emptyToo many processesToo many usersDisc quota exceeded @(#)mon.c 6.1 87/11/23 PROFDIRmon.out @(#)flsbuf.c 6.1 87/11/23 @(#)stdiom.h 6.1 87/11/23 @(#)sprintf.c 6.1 87/11/23 @(#)dup2.c 6.1 87/11/23 XX @(#)getenv.c 6.1 87/11/23 @(#)isatty.c 6.1 87/11/23 @(#)malloc.c 6.1 87/11/23 @(#)data.c 6.1 87/11/23 6P6P6X8HHP' 000000000000000000000123456789abcdef0123456789ABCDEF @(#)dowrite.c 6.1 87/11/23 @(#)print.h 6.1 87/11/23 @(#)ecvt.c 6.1 87/11/23 Fn CAy7Aׄ@È@Y@$ @(#)fwrite.c 6.1 87/11/23 @(#)stdiom.h 6.1 87/11/23 @(#)memchr.c 6.1 87/11/23 .textX.datah.bss-.text`M.datap.bss-.text`.data@.bss-.text .data.bss-.text8(.data.bss-.text`(.data.bss-.text.data.bss-.text.data .bss-.text.data".bss-.text .data".bss-.textp!.data"8.bss-p.text H.data".bss.`.text `.data".bss.`.text x .data".bss.`.text !.data"@.bss.`.text`.data#  .bss.`.text.data#@.bss.`.text.data#@.bss.`.text0(.data#@ .bss.`.textX.data#`.bss.`.textp .data#`.bss.`.text.data#`.bss.`.text.data#`.bss.`.text.data#`.bss.`.text.data#`.bss.`.text.data#`.bss.`.textX.data#`.bss.`.textP.data#h.bss.`.texth.data#h.bss.`.text.data#h .bss.`.text88.data# .bss.`.textp*.data# .bss.` .text8X.data#.bss..text.data#8.bss..text.data)H.bss.(.text,`.data)H@.bss/.text-.data).bss/.text- .data).bss/.text-8.data).bss/X.text0H.data*.bss0.text1 .data*@.bss0.text3(@.data*H .bss0_environh_exit_main__nd#`SaveReg0_forkX_close_open_dup28_setpgrpP_socket_s0 _perrorh_bind _port0(_buffer088_plen6(<_fs _oh(_fsopenl_fstatp_fsreply_ch0_srwh8_lseek_read_writeh_sh@_strcpy H_sendto`_errno"_sprintf",_strlen `cerror9 _monitor_profil_creatC60O68_getenv_getpid____Argv"_strrchr z__iob#_fclose Z(_fflush _free@d __flsbuf $n'__wrtchk zh\__smbuf6@__stdbuf(_mallocx_isatty@__doprnt_dup-_endXX_sbrk_brk_getpgrp\_ioctl- _reallocp_memcpy8__sibuf8H__sobufHP,h_ecvt-@_fcvt-_fwrite1 0_memchr30_btext_etext3h_bdatah_edata-_bbss-__startup_recvfrom_srequest_sys_nerr_sys_errlist__cleanup__countbase__countmax__lastbuf__xflsbuf__bufendtab__bufsync__findbuf__dowrite_Reduce_infu!ߤ]0 ;8!PA .text;8 .data!P;@.bss=0=0A - 0  !2$0 "[W`~HT pqzb TP  4LN*OPQRSP L $\P PP(^(^\P8 0^,\V(4tX` !P8@(VPXP8P8pP84 'P V( PP(^(,P80HH<@~DȋH & >x  t&~Dǎ@Ǟ<HHWH@~D +0pހ+0  ! pׁpp  \"Lh  0! ~Dǎ@HHW2!h[HWnC2!o^(n,[n"WnC2!p^(n,[nW2!d[W@~<p D  , ~<@@W8P Ȇ   88WH<@~D *  Z  =0 4 #8pp q !M8MXB MTMPq pMHPM`PMLpq !R  q:M( qPp'qp MH~Dǎ@Ǟ<HHW 1~.p@ At @@!~W觎N~ :p0'8 px' pX' 0ހ+Yp rxwtpsq  0hp7\ހ+Yp rxw΀ xp@ހ+Yp rxwrp ΀a΀Aqpt   r g 0.#&.($ $D +Y Ds((p@W`  t.> `0  `  D>.N 0 p(`@  `    ~ǎW+0Wpz[BX?@DHLP~TpMrMb 0M p$M M MM0p   \(\(p\0Mp qM  ( ^, ,! 01'q2! 'q/ f !' :Gq21304!:'q.,,/ ,ȶMM MPMq9(9#0@@5601 0M M) ~TǎPǞLǮHǾD@XXW!2! W!21!0W! W!120WX?@DHLP~Tr8     *8  ' p2`7! ` ?  ~TǎPǞLǮHǾD@XXWH@~Dp W & !   D 6ހ.`  @  3p(  ! p!2`!7  $R   .   W    ~Dǎ@HHW8 ȧ~4p.`.q3p(~488W@8~<pp ~W  < r >+0  8 ~<ǎ8@@W8 ȧ~4p T g "Q%(   ~488WH<΀ ~@q R  Bb p2`'(! ,>     BG G!    g   ,Q"%(  D b j D p     ~@ǎ<HHWH<@~DpǐLJ D   p2`  p2`' (. (l   ~Dǎ@Ǟ<HHW8 ȧ~4p  *        |'Q!R D D p2`%  ' p2`7! ,~488W@8~<p  ( ppP\8W2`( pp3h2`^*    p2`& ppP\8W2`nW @  ~<ǎ8@@WP pR2` a!` !WH@~DqL l~Dǎ@HHWH<@~Dr '$~Dǎ@Ǟ<HHWH<0@~Dr 0 (+R a(a( <r NwX   @   "    t  )r!  )a!"  p2`~Dǎ@Ǟ<HHW@~<p  *   W    ~<@@WP.p0>@DH".L @.M.p.@ .DPPW[W![rW8 @ *88W[ 6W[W2![W2![WC2!,[W2![W[-W -[--W'[W'[W2![@W@8~X PPWP48<@DH~LN`HNh! N`N`! NhNhNtN`NpNtN|րNpqpN$NpN| N|x((lx! ( 2NtN`  !(hրN|xNtp0qp((q$Nt N|sqp'( (&    NtpN|p  PNt! N`!Nt xF pNp(PNpNxNp N|NpN|~LǎHǞDǮ@Ǿ<84PPWNp! !Nt! N|WP<@DH~Ly   s  Rq(+p#((p(pspNx~LǎHǞDǮ@Ǿ<PPWA~"t0As3r21~W0+K "AC1!WAC$AhAC%hAC&hACWQWPX%AC1QCGxBBSD"vt ('"AC8('p'"$AC4$X$AhAC!FhAC" QP&#1qA@Aq@O@pO`O #H O @ & O  ! O g `h`O 0#N0O,@O0ȧN(NN8N O,`O  FF=11=CCAM 0AMAPO,VA@O E@O pO}@NgOd``OO  >  O OOO @NpNN/3x,O(0O(ְO(zkg(PO$(VPp: w q&3x,O(0O(<ְO(@NpNN@ekd,O$( NDA4N,O(0O(NNְO( ֠ON/3,O(0O(ְO(Jkd(PO$(VP@:0D A&3,O(0O(,ְO(NpTkg(O$( wq( ,O(0O(ְO(     / ֠ON/3,O(0O(ְO(Jkd*PO$(VP@<0D A&3,O(0O($ְO(N fpOp\kg,O$( Nwq,N,O(0O(ְO( ֠OO/3x,O(0O(lְO(Jkd*PO$(VP@< D A&3x,O(0O(ְO(H{ p   O$( @  @ , 2 ! . 00  +     pNؐNذNNNW.` 3p(  WP@DH~Lr @D''!' )7`) ~LǎHǞDǮ@PPW!)[W2!6[WPHx~Lp(,j~LǎHPPWPHx~Lp(,"~LǎHPPW`?8<@DH~Lp.ޠOO:T 2pO pOOOp  :X ސ4@ OJp  C@:8 6p  : @$:@$ 1 P@$`^P5%cR:W^XP'86 0":B0C9"5 4r+!+ @$0:  ?05N?:@ 5p  5 @$0:  O( O( O:O( 0 &009 4 @$05p (  5(TO &1O  &0   9( ~LǎHǞDǮ@Ǿ<8`O`W   ?  ?0 6    W6    WX<@DHLPҧ~TsRNW  ( ( D * \ pױ2`'(R (> )     ,   aP/\ +! (() )((  ' p2`7! BW  D ,,-V  ~TǎPǞLǮHǾD@<XXW0@ A#1 ! 1W @(#)name.c 6.1 87/11/24 /br_name: open socketbr_name: bindbr_name: recvfrombr_name: sendtoP9P: @(#)ghostbynam.c 6.1 87/11/23 @(#)perror.c 6.1 87/11/23 : Error %.3d @(#)gethostent.c 6.1 87/11/23 r # r/etc/hosts @(#)inet_addr.c 6.1 87/11/23   L @(#)errlst.c 6.1 87/11/23   ( 4 P ` x      !!!(!4!L!X!d!x!!!!!!!"""0"@"X"h"t"""""""## ##$#0#P#\#h#t###########$$$$($4$@$L$X$d$p$|$$$$$$$$$$%% %%$%0%<%H%T%`%l%x%%%%%%%%%%%&&& &,&8&D&P&\&h&t&&&&&&&&&&&''''('4'@'L'X'd'p'|''''(($(D(\(t((()))8)H)`)))))**8*\*t******+ +Error 0Not ownerNo such file or directoryNo such processInterrupted system callI/O errorNo such device or addressArg list too longExec format errorBad file numberNo child processesNo more processesNot enough spacePermission deniedBad addressBlock device requiredDevice busyFile existsCross-device linkNo such deviceNot a directoryIs a directoryInvalid argumentFile table overflowToo many open filesNot a typewriterText file busyFile too largeNo space left on deviceIllegal seekRead-only file systemToo many linksBroken pipeArgument out of domainResult too largeNo message of desired typeIdentifier removedError 37Error 38Error 39Error 40Error 41Error 42Error 43Error 44Deadlock condition if lockedError 46Error 47Error 48Error 49Error 50Error 51Error 52Error 53Error 54Error 55Error 56Error 57Error 58Error 59Error 60Error 61Error 62Error 63Error 64Error 65Error 66Error 67Error 68Error 69Error 70Error 71Error 72Error 73Error 74Error 75Error 76Error 77Error 78Error 79Error 80Error 81Error 82Error 83Error 84Error 85Error 86Error 87Error 88Error 89Error 90Error 91Error 92Error 93Error 94Error 95Error 96Error 97Error 98Error 99Error 100Error 101Error 102Error 103Error 104Error 105Error 106Error 107Error 108Error 109Error 110Error 111Error 112Error 113Error 114Error 115Error 116Error 117Error 118Error 119Error 120Error 121Error 122Error 123Error 124Error 125Error 126Error 127Error 128Error 129Error 130Error 131Error 132Error 133Error 134Operation would blockOperation now in progressOperation already in progressSocket operation on non-socketDestination address requiredMessage too longProtocol wrong type for socketProtocol not availableProtocol not supportedSocket type not supportedOperation not supported on socketProtocol family not supportedAddr. family not supported by proto familyAddress already in useCannot assign requested addressNetwork is downNetwork is unreachableNetwork dropped connection on resetSoftware caused connection abortConnection reset by peerNo buffer space availableSocket is already connectedSocket is not connectedCannot send after socket shutdownToo many references: cannot spliceConnection timed outConnection refusedToo many levels of symbolic linksFile name too longHost is downNo route to hostDirectory not emptyToo many processesToo many usersDisc quota exceeded @(#)ctype.c 6.1 87/11/23 ((((( H @(#)mon.c 6.1 87/11/23 PROFDIRmon.out @(#)fgets.c 6.1 87/11/23 @(#)stdiom.h 6.1 87/11/23 @(#)filbuf.c 6.1 87/11/23 @(#)flsbuf.c 6.1 87/11/23 @(#)stdiom.h 6.1 87/11/23 @(#)fopen.c 6.1 87/11/23 @(#)rew.c 6.1 87/11/23 @(#)sprintf.c 6.1 87/11/23 @(#)dup2.c 6.1 87/11/23 ~P @(#)getenv.c 6.1 87/11/23 @(#)isatty.c 6.1 87/11/23 @(#)malloc.c 6.1 87/11/23 @(#)memccpy.c 6.1 87/11/23 @(#)data.c 6.1 87/11/23 \H\H\P^@nH2` 000000000000000000000123456789abcdef0123456789ABCDEF @(#)findiop.c 6.1 87/11/23 @(#)dowrite.c 6.1 87/11/23 @(#)print.h 6.1 87/11/23 @(#)ecvt.c 6.1 87/11/23 Fn CAy7Aׄ@È@Y@$ @(#)fwrite.c 6.1 87/11/23 @(#)stdiom.h 6.1 87/11/23 @(#)memchr.c 6.1 87/11/23 .textX.data.bss=0.text1.data.bss=0.text.datah .bss=0.text.data@.bss=0.textP.data.bss=0.texth(.data.bss=0.text(.data.bss=0.text.data.bss=0.text#.dataX.bss=0.text .data 0.bssM.text .dataP .bssM.text .data+0.bssM.text .data+8(.bssM.text  .data,`.bssM.text p!.data,`8.bssMp.text H .data,.bssN`.text h.data,.bssN`.text .data,.bssN`.text  .data,.bssN`.text (.data,@.bssN`.text P .data, .bssN`.text0!.data,@.bssN`.text8.data-8 .bssN`.text8x.data-X .bssN`.text`.data-x .bssN`.text.data-.bssN`.text(.data-.bssN`.text@(.data- .bssN`.texth.data-.bssN`.text.data-.bssN`.text.data-.bssN`.text.data-.bssN`.text.data-.bssN`.text.data-.bssN`.textX.data-.bssN`.text@.data-.bssN`.textX.data-.bssN`.textp.data- .bssN`.text(8.data- .bssN`.text`*.data. .bssN` .text(H.data.  .bssN.textpX.data.@.bssN.text".data.@8.bssN.text".data3xH.bssN(.text4@.data3 .bssO.text4.data3@.bssO.text5.data4 .bssO.text5.data4 .bssO.text5.data4 .bssOX.text9HH.data4.bssP.text9 .data4@.bssP.text;@.data4 .bssP_environ_exit _main__nd-SaveRegP_forkh_close_open_dup2H_setpgrp@_socket_sP _perror_bindP_portP(_bufferP8h_plenV(_nlenX_name`_sendto_transV0'_strcmp H3?@_errno+0_sprintfK Up_strlen _writeXcerror _fopen@_rewind@_fclose_fgets b__ctype+X_domains\ m8_monitor _profil_creat(w\(\0_getenvx_getpid____Argv,_strrchr _strcpy h__filbuf _memccpy02`__iob.`_fflush43p_read_free0d__flsbuf__wrtchk,__smbuf\8__stdbuf3h_malloch_isatty04_freopen_lseek__doprnt"_dup5_end~P_sbrk _brk_getpgrpL_ioctl5_realloc`_memcpyp__sibuf^@__sobufnH4_ecvt5_fcvt6_fwrite99H_memchr;_btext_etext;_bdata_edata=0_bbss=0__startup_recvfrom_gethostbyname_sethostent_gethostent_endhostent_sys_nerr_sys_errlist_inet_addr__cleanup__countbase__countmax__bufendtab__bufsync__findbuf__lastbuf__xflsbuf__findiop__dowrite_Reduce_infu!ߤg@| =P)H;.text=P .data)H=@.bssG@G@;5P 0  !2$0 " J[WxL ~Pq"/  Pp/@f  ` dfMghijkp.p^G@p  :q^d^(,G@'0t^T^(^tG@ 0^,~pG@<@48~<p... .!. "~<ǎ8Ǟ4@@WH8<@~DpH// // !/ W ` H// /P"/ !/  H/// / !/ q~Dǎ@Ǟ<Ǯ8HHWH<@~DH  >x t~Dǎ@Ǟ<HHWH@~D -ppހ-p "X! pׁp~  "P  !~Dǎ@HHWnC2!o^(n,[n"WnC2!p^(n,[nW2!d[W@~<pL P(DLL4H H~<@@W8PLȆ H L88WH<@~DL*P@L Z LM0 4 #<8p8p q !]8]XB ]T]Pq p]HP]`4P]Lpq !R  q:]( q0Pp'qp ]H~Dǎ@Ǟ<HHW 1~.p@ At @@!~W觎N~ :p0'8 px' pX' 0ހ-p rxwtpsq  0hp7\ހ-p rxw΀ xp@ހ-p rxwrp ΀a΀Aqpt   r g 0.#&.($ $D - Ds((pW`  t.> `0  `  D>.N 0 p(`@  `    ~ǎW-pWpz[BX?@DHLP~Tp]r]b 0\]p$] ] ]]Hp  `(`(p`0]p q]  ( ^.Z .ȋ! 01'q2! 'q/. !' :Gq21304!:'q..І,/ .ȶ]] ]P]q9(9#0@@5601 0] ]) f~TǎPǞLǮHǾD@XXW!2! W!21!0W! W!120WX?@DHLP~Tr8     *8  ' p27! ` ?  ~TǎPǞLǮHǾD@XXWH@~Dp W & !   D 6ހ.  @  4(  ! p!2!7  R   .   W    ~Dǎ@HHW8 ȧ~4p..q4(~488W@8~<pp ~W  < r  F-p   ~<ǎ8@@W8 ȧ~4p T g "Q%(   ~488WH<΀ ~@q R  Bb p2'(! ,>     BG G!    g   ,Q"%(  D b j D p     ~@ǎ<HHWH<@~DpǐLJ D   p2  p2' (. (   ~Dǎ@Ǟ<HHW8 ȧ~4p  *        |'Q!R D D p2%  ' p27! ,~488W@8~<p  ( ppP`8W2( pp42^*    p2& ppP`8W2W @  ~<ǎ8@@WP pR2 a!` !WH@~Dq l~Dǎ@HHWH<@~Dr '$~Dǎ@Ǟ<HHWH<0@~Dr 0 (+R a(a( <r NwX   @   "    t  )r!  )a!"X  p2~Dǎ@Ǟ<HHW@~<p.`W .`&0 2  &'   ~<@@W@\.`P/.\(0 2 / . / f/  @@W@~<p     W    ~<@@WP.p0>@DH".L @.M.p.@ .DPPW[W![jW[W2![LW2![0WC2!,[W2![W[5PW 5P[5P5PW2![W@8~@ PPWP48<@DH~L^`H^h! ^`^`! ^h^h^t^`^p^t^|ր^pqpN$^p^| ^|x((lx! ( 2^t^`  !(hր^|^tp0qp((q$^t ^|sqp'( (&     ^tp^|p  P^t! ^`!^t xF p^p(P^p^x^p ^|^p^|~LǎHǞDǮ@Ǿ<84PPW^p! !^t! ^|WP<@DH~Ly   s  Rq(+p#((p(psp^x~LǎHǞDǮ@Ǿ<PPWA~"t0As3r21~W0+K "AC1!WAC$AhAC%hAC&hACWQWPX%AC1QCGxBBSD"vt ('"AC8('p'"$AC4$X$AhAC!FhAC" QP&#1qA@Aq@_@p_`_ #H _ @ & _  ! _ g `h`_ 0#^0_,@_0ȧN(^^8^ _,`_  FF=11=CCAM 0AMAP_,VA@_ E@_ p_}@^g_d``__  >  _ ___ @^p^^/5,_(0_(ְ_(zkg(P_$(VPp: w q&5,_(0_(<ְ_(@^p^^@ekd,_$( ^DA4^,_(0_(^^ְ_( ֠_^/5,_(0_(ְ_(Jkd(P_$(VP@:0D A&5,_(0_(,ְ_(^pTkg(_$( wq( ,_(0_(ְ_(     / ֠_^/5,_(0_(ְ_(Jkd*P_$(VP@<0D A&5,_(0_($ְ_(^ fp_p\kg,_$( ^wq,^,_(0_(ְ_( ֠__/5,_(0_(lְ_(Jkd*P_$(VP@< D A&5,_(0_(ְ_(H{ p   _$( @  >@ , 2 ! . 00  +   b  p^ؐ^ذ^^^W. 4(  WP@DH~Lr @D''!'& )7H) ~LǎHǞDǮ@PPW2!6[hWPHx~Lp(,j~LǎHPPWPHx~Lp(,"~LǎHPPW`?8<@DH~Lp.ޠ__:T 2p_ p___p  :X ސ6 _Jp  C@:8 6p  : @$:@$ 1 P@$`^P5%cR:W^XP'86 0":B0C9"5 4r+!+ @$0:  ?05N?:@ 5p  5 @$0:  _( _( _:_( 0 &009 4 @$05p (  5(T_ &1_  &0   9( ~LǎHǞDǮ@Ǿ<8`_`W   ?  ?0 6    W6    WX<@DHLPҧ~TsRNW  ( ( D ؒ \ pױ2'(R (> )     ,>   aP/\ +! (() )((  ' p27! HBW  D ,,-V l ~TǎPǞLǮHǾD@<XXW0@ A#1 ! 1W @(#)remote.c 6.1 87/11/24 usage: remote remote: unknown server name remote: socketBridge remote> remote: sendtoremote: recvfrom @(#)ghostbynam.c 6.1 87/11/23 @(#)perror.c 6.1 87/11/23 : Error %.3d @(#)gethostent.c 6.1 87/11/23 r # r/etc/hosts @(#)inet_addr.c 6.1 87/11/23 v @(#)errlst.c 6.1 87/11/23 "`"h"t""""""###,#@#T#h#t########$$$$8$H$X$p$$$$$$$%%%(%4%@%L%X%d%p%%%%%%%%%%&&& &,&8&D&P&\&h&t&&&&&&&&&&&''''('4'@'L'X'd'p'|''''''''''(( (($(0(<(H(T(`(l(x((((((((((())) ),)8)D)P)\)h)t))))))))**0*P*d*****++@+X+x++++,, ,<,T,x,,,,---$-8-L-\Error 0Not ownerNo such file or directoryNo such processInterrupted system callI/O errorNo such device or addressArg list too longExec format errorBad file numberNo child processesNo more processesNot enough spacePermission deniedBad addressBlock device requiredDevice busyFile existsCross-device linkNo such deviceNot a directoryIs a directoryInvalid argumentFile table overflowToo many open filesNot a typewriterText file busyFile too largeNo space left on deviceIllegal seekRead-only file systemToo many linksBroken pipeArgument out of domainResult too largeNo message of desired typeIdentifier removedError 37Error 38Error 39Error 40Error 41Error 42Error 43Error 44Deadlock condition if lockedError 46Error 47Error 48Error 49Error 50Error 51Error 52Error 53Error 54Error 55Error 56Error 57Error 58Error 59Error 60Error 61Error 62Error 63Error 64Error 65Error 66Error 67Error 68Error 69Error 70Error 71Error 72Error 73Error 74Error 75Error 76Error 77Error 78Error 79Error 80Error 81Error 82Error 83Error 84Error 85Error 86Error 87Error 88Error 89Error 90Error 91Error 92Error 93Error 94Error 95Error 96Error 97Error 98Error 99Error 100Error 101Error 102Error 103Error 104Error 105Error 106Error 107Error 108Error 109Error 110Error 111Error 112Error 113Error 114Error 115Error 116Error 117Error 118Error 119Error 120Error 121Error 122Error 123Error 124Error 125Error 126Error 127Error 128Error 129Error 130Error 131Error 132Error 133Error 134Operation would blockOperation now in progressOperation already in progressSocket operation on non-socketDestination address requiredMessage too longProtocol wrong type for socketProtocol not availableProtocol not supportedSocket type not supportedOperation not supported on socketProtocol family not supportedAddr. family not supported by proto familyAddress already in useCannot assign requested addressNetwork is downNetwork is unreachableNetwork dropped connection on resetSoftware caused connection abortConnection reset by peerNo buffer space availableSocket is already connectedSocket is not connectedCannot send after socket shutdownToo many references: cannot spliceConnection timed outConnection refusedToo many levels of symbolic linksFile name too longHost is downNo route to hostDirectory not emptyToo many processesToo many usersDisc quota exceeded @(#)ctype.c 6.1 87/11/23 ((((( H @(#)mon.c 6.1 87/11/23 PROFDIRmon.out @(#)data.c 6.1 87/11/23 `H`H`Pb@rH2 @(#)fgets.c 6.1 87/11/23 @(#)stdiom.h 6.1 87/11/23 @(#)filbuf.c 6.1 87/11/23 @(#)flsbuf.c 6.1 87/11/23 @(#)stdiom.h 6.1 87/11/23 @(#)fopen.c 6.1 87/11/23 @(#)fprintf.c 6.1 87/11/23 @(#)printf.c 6.1 87/11/23 @(#)rew.c 6.1 87/11/23 @(#)sprintf.c 6.1 87/11/23 P @(#)getenv.c 6.1 87/11/23 @(#)isatty.c 6.1 87/11/23 @(#)malloc.c 6.1 87/11/23 @(#)memccpy.c 6.1 87/11/23 000000000000000000000123456789abcdef0123456789ABCDEF @(#)findiop.c 6.1 87/11/23 @(#)dowrite.c 6.1 87/11/23 @(#)print.h 6.1 87/11/23 @(#)ecvt.c 6.1 87/11/23 Fn CAy7Aׄ@È@Y@$ @(#)fwrite.c 6.1 87/11/23 @(#)stdiom.h 6.1 87/11/23 @(#)memchr.c 6.1 87/11/23 .textX.data.bssG@.textB.data.bssG@.text.data .bssM0.text(.data@.bssM0.text(.data.bssM0.text(.data.bssM0.text8.data.bssM0.textP#.dataX.bssM0.text  .data`0.bss].text .data .bss].text .data-p.bss].text 8.data-x(.bss].text 8 .data..bss].text Xp!.data.8.bss]p.text  .data..bss^`.text .data..bss^`.text.data..bss^`.text .data..bss^`.text8.data.8.bss^`.text8(.data4@.bss^`.text`P .data4P .bss^`.text!.data4p@.bss^`.text.data4 .bss^`.text.data4 .bss^`.text8.data4 .bss^`.textx.data5 .bss^`.text8`.data50 .bss^`.text.data5P.bss^`.text.data5P.bss^`.text.data5P.bss^`.text.data5P.bss^`.text.data5P.bss^`.text.data5P.bss^`.text.data5P.bss^`.text0X.data5P.bss^`.text.data5X.bss^`.text.data5X .bss^`.textX8.data5x .bss^`.text*.data5 .bss^` .text XH.data5 .bss^.text X.data5.bss^.text$.data5H.bss^(.text6@.data6  .bss_.text7.data6@@.bss_.text7.data6.bss_.text7.data6.bss_X.text;`H.data7.bss`.text; .data7@.bss`.text=@.data7@ .bss`_environ_exit 8_main__nd5PSaveReg`__iob._fprintf_socket8_perror0_printf@_getline_sendto'D__filbufh__flsbuf<3X_strcmp ?K_errno-p_sprintf@W"Xa_strlen_writecerror (_fopen_rewind_fclose_fgets@n __ctype-_domains` y_monitor `_profil_creat_close`(`0_getenv_getpid____Argv._strrchr_strcpy __smbuf`82__sibufb@__sobufrH__stdbuf44_memccpy `t_fflush_read_free`__wrtchk_malloc_isatty`6_freopen_open_lseek__doprnt$_endP_sbrkT_brk0_ioctl7_realloc_memcpy 7_ecvt7_fcvt8_fwrite;;`_memchr=_btext_etext=_bdata_edataG@_bbssG@__startup_gethostbyname_recvfrom_printreply_sethostent_gethostent_endhostent_sys_nerr_sys_errlist_inet_addr__cleanup__countbase__countmax__bufendtab__lastbuf__bufsync__findbuf__xflsbuf__findiop__dowrite_Reduce_infu!ߤM; 2`$X.text2 .data`3@.bss--$X$ 0  !2$0 "[WH<@ ~DǑ"<dN&D $"(  <   X)  2p q` L |) 2   p+ |q ~Dǎ@Ǟ<HHWH@~D "pހ " ؈! pׁ0p&  <",  !~Dǎ@HHW"Wp[BX?@DHLP~Tp-r-b 0 - dp$- - 8 --p   0 0 p0(-p q-  ( ^#  # ! 01'q2! 'q/  !' :Gq21304!:'q.#(,/ #(-- -P-q9(9#0@@5601 0- -) ~TǎPǞLǮHǾD@XXW!21!0W! W!120W8 ȧ~4p$.q)(~488W@8~<pp ~W  < r  F"  ~<ǎ8@@W8 ȧ~4p T g "Q%(   ~488WH<΀ ~@q R  Bb p('(! ,>     BG G!    g   ,Q"%(  D b j D p     ~@ǎ<HHWH<@~DpǐLJ D   p(  p(' (. (4   ~Dǎ@Ǟ<HHW8 ȧ~4p  *        |'Q!R D D p(%  ' p(7! ,~488W@8~<p  ( ppP00W(( pp)(^̧*    p(& ppP00W(6W @  ~<ǎ8@@WP pR( a!` !WH@~Dq l~Dǎ@HHWH<@~Dr '$~Dǎ@Ǟ<HHWH<0@~Dr 0 (+R a(a( <r NwX   @   "    t  )r!  )a!"p  p(~Dǎ@Ǟ<HHW@~<p.`W .`&0 2  &'   ~<@@W8 0 2 #֋0 88W@\.`P$.\(0 2 $ . $ $  @@WP.p0>@DH".L @.M.p.@ h.DPPW!![2W[ W![W[W! [W2![W2![WC2!,[W[$W $[T$$W [,W2![W@8~ PPWP48<@DH~L.`H.h! .`.`! .h.h.t.`.p.t.|ր.pqpN$.p.| .|x((lx! ( 2.t.`  !(hր.|x.tp0qp((q$.t .|sqp'( (&    .tp.|p  P.t! .`!.t xF p.p(P.p.x.p .|.p.|~LǎHǞDǮ@Ǿ<84PPW.p! !.t! .|WP<@DH~Ly   s  Rq(+p#X((p(psp.x~LǎHǞDǮ@Ǿ<PPW0+K "AC1!WAC$AhAC%hAC&hACWQWPX%AC1QCGxBBSD"vt ('"AC8('p'"$AC4$X$AhAC!FhAC" QP&#1qA@Aq@/@p/`/ #H / @ & /  ! / g `h`/ 0#.0/,@/0ȧN(..8. /,`/  FF=11=CCAM 0AMAP/,VA@/ E@/ p/}@.g/d``//  >  / /// @.p../),/(0/(ְ/(zkg(P/$(VPp: w q&),/(0/(<ְ/(@.p..@ekd,/$( .DA4.,/(0/(..ְ/( ֠/./),/(0/(ְ/(Jkd(P/$(VP@:0D A&),/(0/(,ְ/(.pTkg(/$( wq( ,/(0/(ְ/(     / ֠/./),/(0/(ְ/(Jkd*P/$(VP@<0D A&),/(0/($ְ/(. fp/p\kg,/$( .wq,.,/(0/(ְ/( ֠///),/(0/(lְ/(Jkd*P/$(VP@< D A&),/(0/(ְ/(H{ p   /$( @  n@ , 2 ! . 00  +   ݒ  p.ؐ.ذ...W$ )(  WP@DH~Lr @D''!'V )7H) ~LǎHǞDǮ@PPW2!6[0WPHx~Lp(,j~LǎHPPWPHx~Lp(,"~LǎHPPW`?8<@DH~Lp.ޠ//:T 2p/ p///p  :X ސ*x /Jp  C@:8 6p  : @$:@$ 1 P@$`^P5%cR:W^XP'86 0":B0C9"5 4r+!+ @$0:  ?05N?:@ 5p  5 @$0:  /( /( /:/( 0 &009 4 @$05p (  5(T/ &1/  &0   9( ~LǎHǞDǮ@Ǿ<8`/`W   ?  ?0 6    W6    WX<@DHLPҧ~TsRNW  ( ( D  \ pױ('(R (> )`     ,n   aP/\ +! (() )((  ' p(7! xBW  D ,,-V ֜ ~TǎPǞLǮHǾD@<XXW0@ A#1 ! 1W@(#)makemacro.c 6.1 87/11/24wUsage: makemacro macros file already exists. Archiving in '.old' MAKEMACRO LINK: MAKEMACRO ACCESS: Unable to create file %s init.%sset interaction=nomacroechoconnect %slisten/etc/bridge/etc/bridge/macros/etc/bridge/macros.old @(#)perror.c 6.1 87/11/23 : Error %.3d @(#)errlst.c 6.1 87/11/23  8D`t $8HXh|(4L`|(4@LXdp| $0<HT`lx ,8DP\ht(4@LXdp| $0<Tp   4 P t    !! !D!h!!!!!""4"H"l""""""Error 0Not ownerNo such file or directoryNo such processInterrupted system callI/O errorNo such device or addressArg list too longExec format errorBad file numberNo child processesNo more processesNot enough spacePermission deniedBad addressBlock device requiredDevice busyFile existsCross-device linkNo such deviceNot a directoryIs a directoryInvalid argumentFile table overflowToo many open filesNot a typewriterText file busyFile too largeNo space left on deviceIllegal seekRead-only file systemToo many linksBroken pipeArgument out of domainResult too largeNo message of desired typeIdentifier removedError 37Error 38Error 39Error 40Error 41Error 42Error 43Error 44Deadlock condition if lockedError 46Error 47Error 48Error 49Error 50Error 51Error 52Error 53Error 54Error 55Error 56Error 57Error 58Error 59Error 60Error 61Error 62Error 63Error 64Error 65Error 66Error 67Error 68Error 69Error 70Error 71Error 72Error 73Error 74Error 75Error 76Error 77Error 78Error 79Error 80Error 81Error 82Error 83Error 84Error 85Error 86Error 87Error 88Error 89Error 90Error 91Error 92Error 93Error 94Error 95Error 96Error 97Error 98Error 99Error 100Error 101Error 102Error 103Error 104Error 105Error 106Error 107Error 108Error 109Error 110Error 111Error 112Error 113Error 114Error 115Error 116Error 117Error 118Error 119Error 120Error 121Error 122Error 123Error 124Error 125Error 126Error 127Error 128Error 129Error 130Error 131Error 132Error 133Error 134Operation would blockOperation now in progressOperation already in progressSocket operation on non-socketDestination address requiredMessage too longProtocol wrong type for socketProtocol not availableProtocol not supportedSocket type not supportedOperation not supported on socketProtocol family not supportedAddr. family not supported by proto familyAddress already in useCannot assign requested addressNetwork is downNetwork is unreachableNetwork dropped connection on resetSoftware caused connection abortConnection reset by peerNo buffer space availableSocket is already connectedSocket is not connectedCannot send after socket shutdownToo many references: cannot spliceConnection timed outConnection refusedToo many levels of symbolic linksFile name too longHost is downNo route to hostDirectory not emptyToo many processesToo many usersDisc quota exceeded @(#)mon.c 6.1 87/11/23 PROFDIRmon.out @(#)flsbuf.c 6.1 87/11/23 @(#)stdiom.h 6.1 87/11/23 @(#)fopen.c 6.1 87/11/23 @(#)fprintf.c 6.1 87/11/23 @(#)fputc.c 6.1 87/11/23 @(#)printf.c 6.1 87/11/23 @(#)sprintf.c 6.1 87/11/23 RH @(#)getenv.c 6.1 87/11/23 @(#)isatty.c 6.1 87/11/23 @(#)malloc.c 6.1 87/11/23 @(#)data.c 6.1 87/11/23 0@0@0H28B@( 000000000000000000000123456789abcdef0123456789ABCDEF @(#)findiop.c 6.1 87/11/23 @(#)dowrite.c 6.1 87/11/23 @(#)print.h 6.1 87/11/23 @(#)ecvt.c 6.1 87/11/23 Fn CAy7Aׄ@È@Y@$ @(#)fwrite.c 6.1 87/11/23 @(#)stdiom.h 6.1 87/11/23 @(#)memchr.c 6.1 87/11/23 .textX.data.bss-.text,.data8.bss-.text.data@.bss-.text.data .bss-.text.data".bss-.text .data".bss-.textp!.data"8.bss-p.text(.data#0.bss.`.text@.data#0.bss.`.textX .data#0.bss.`.textx!.data#0@.bss.`.text .data#p .bss.`.text.data# .bss.`.text`.data# .bss.`.text`.data# .bss.`.text`.data# .bss.`.textH.data$.bss.`.text`.data$.bss.`.textx.data$.bss.`.text.data$.bss.`.text.data$.bss.`.text.data$.bss.`.text.data$.bss.`.text.data$.bss.`.textX.data$.bss.`.textP.data$.bss.`.texth.data$.bss.`.text.data$ .bss.`.text88.data$8 .bss.`.textp*.data$X .bss.` .text8X.data$x.bss..text.data$x8.bss..text.data)H.bss.(.text,`@.data) .bss/.text,.data*@.bss/.text-H.data*X.bss/.text-`.data*X.bss/X.text0H.data*.bss0.text1@ .data*@.bss0.text3P@.data+ .bss0_environ_exit_main__nd$SaveReg0_printfh_accessH_unlinkP_link_perror_errno"_fopen _fputc_fprintf_strlen@_close`$_sprintf.80_writehcerrorE_monitor_profil_creatxO0 [0(_getenv_getpid____Argv#(_strrchrZ_strcpy(__iob$_fclosef)_fflush|_free@p __flsbufz(__wrtchk t H <__smbuf00__stdbuf)_mallocx_isatty@,h_freopen _open_lseek__doprnt_endRH_sbrk_brk_ioctl-H_reallocp_memcpy8__sibuf28__sobufB@,_ecvt-h_fcvt-_fwrite1H0_memchr3X_btext_etext3_bdata_edata-_bbss-__startup_file_name_arch_name_dir_name_sys_nerr_sys_errlist__cleanup__countbase__countmax__lastbuf__xflsbuf__bufendtab__bufsync__findbuf__findiop__dowrite_Reduce_infu!ߤU0l : h= .text: .datah:@.bss5050= 1 0  !2$0 ȓ""[W`@DH~Lprs <  r06r Ѐ+PR T$R P "X 0 50'R8(50 p ~LǎHǞDǮ@``WH<@~DH >x t~Dǎ@Ǟ<HHW0C!1B WH@~D *8pހē*8  ! pׁxpF  "  !x~Dǎ@HHW2!g[W2!d[W@~<p D, ~<@@W8PȆ  88WH<@~D* Z =0 4 #8pp q !M8MXB MTMPq pMHPM`PMLpq !R  q:M( qPp'qp MH~Dǎ@Ǟ<HHW 1~.p@ At @@!~W觎N~ :p0'8 px' pX' 0ހ*ap rxwtpsq  0hp7\ހ*ap rxw΀ xp@ހ*ap rxwrp ΀a΀Aqpt   r g 0.#&.($ $D *a Ds((pHW`  t.> `0  `  D>.N 0 p(`@  `    ~ǎW*8Wpz[BX?@DHLP~TpMrMb 0TM p$M M MMp   P(P(pP0Mp qM  ( ^+R +! 01'q2! 'q/ & !' :Gq21304!:'q.+,/ +ȶMM MPMq9(9#0@@5601 0M M) ^~TǎPǞLǮHǾD@XXW!2! W!21!0W! W!120WX?@DHLP~Tr8     *8  ' p/7! ` ?  ~TǎPǞLǮHǾD@XXWH@~Dp W & !   D 6ހ+  @  0(  ! p!/!7  R   .   W    ~Dǎ@HHW8 ȧ~4p+.q0(~488W@8~<pp ~W  < r >*8   ~<ǎ8@@W8 ȧ~4p T g "Q%(   ~488WH<΀ ~@q R  Bb p/'(! ,>     BG G!    g   ,Q"%(  D b j D p     ~@ǎ<HHWH<@~DpǐLJ D   p/  p/' (. (   ~Dǎ@Ǟ<HHW8 ȧ~4p  *        |'Q!R D D p/%  ' p/7! ,~488W@8~<p  ( ppPP8W/( pp0ȧ/^*    p/& ppPP8W/W @  ~<ǎ8@@WP pR/ a!` !WH@~Dq l~Dǎ@HHWH<@~Dr '$~Dǎ@Ǟ<HHWH<0@~Dr 0 (+R a(a( <r NwX   @   "    t  )r!  )a!"P  p/~Dǎ@Ǟ<HHW@~<p     W    ~<@@WP.p0>@DH".L @.M.p.@ .DPPW[W![rW[W2![TW2![8WC2!,[W2![W[1W 1[11W2![W@8~@ PPWP48<@DH~LN`HNh! N`N`! NhNhNtN`NpNtN|րNpqpN$NpN| N|x((lx! ( 2NtN`  !(hրN|Ntp0qp((q$Nt N|sqp'( (&     NtpN|p  PNt! N`!Nt xF pNp(PNpNxNp N|NpN|~LǎHǞDǮ@Ǿ<84PPWNp! !Nt! N|WP<@DH~Ly   s  Rq(+p#((p(pspNx~LǎHǞDǮ@Ǿ<PPWA~"t0As3r21~W0+K "AC1!WAC$AhAC%hAC&hACWQWPX%AC1QCGxBBSD"vt ('"AC8('p'"$AC4$X$AhAC!FhAC" QP&#1qA@Aq@O@pO`O #H O @ & O  ! O g `h`O 0#N0O,@O0ȧN(NN8N O,`O  FF=11=CCAM 0AMAPO,VA@O E@O pO}@NgOd``OO  >  O OOO @NpNN/2`,O(0O(ְO(zkg(PO$(VPp: w q&2`,O(0O(<ְO(@NpNN@ekd,O$( NDA4N,O(0O(NNְO( ֠ON/2t,O(0O(ְO(Jkd(PO$(VP@:0D A&2t,O(0O(,ְO(NpTkg(O$( wq( ,O(0O(ְO(     / ֠ON/2t,O(0O(ְO(Jkd*PO$(VP@<0D A&2t,O(0O($ְO(N fpOp\kg,O$( Nwq,N,O(0O(ְO( ֠OO/2`,O(0O(lְO(Jkd*PO$(VP@< D A&2`,O(0O(ְO(H{ p   O$( @  F@ , 2 ! . 00  +   j  pNؐNذNNNW+ 0(  WP@DH~Lr @D''!'. )7H) ~LǎHǞDǮ@PPW2!6[pWPHx~Lp(,j~LǎHPPWPHx~Lp(,"~LǎHPPW`?8<@DH~Lp.ޠOO:T 2pO pOOOp  :X ސ3( OJp  C@:8 6p  : @$:@$ 1 P@$`^P5%cR:W^XP'86 0":B0C9"5 4r+!+ @$0:  ?05N?:@ 5p  5 @$0:  O( O( O:O( 0 &009 4 @$05p (  5(TO &1O  &0   9( ~LǎHǞDǮ@Ǿ<8`O`W   ?  ?0 6    W6    WX<@DHLPҧ~TsRNW  ( ( D ٚ \ pױ/'(R (> )     ,F   aP/\ +! (() )((  ' p/7! PBW  D ,,-V t ~TǎPǞLǮHǾD@<XXW0@ A#1 ! 1W@(#)catnet.c 6.1 87/11/24cannot open socketcannot open filecannot connect to remote portremote write error @(#)ghostbynam.c 6.1 87/11/23 @(#)bcopy.c 6.1 87/11/23 @(#)perror.c 6.1 87/11/23 : Error %.3d @(#)gethostent.c 6.1 87/11/23 r # r/etc/hosts @(#)inet_addr.c 6.1 87/11/23 NXt @(#)errlst.c 6.1 87/11/23 (0<Xh   0 < T ` l       !!! !8!H!`!p!|!!!!!!!""" ","8"X"d"p"|""""""""""## ##$#0#<#H#T#`#l#x###########$$$ $,$8$D$P$\$h$t$$$$$$$$$$$%%%%(%4%@%L%X%d%p%|%%%%%%%%%%&& &&$&0&<&H&T&`&l&x&&&&&'','L'd'|'''(( (@(P(h(((()))@)d)|)))))***$Error 0Not ownerNo such file or directoryNo such processInterrupted system callI/O errorNo such device or addressArg list too longExec format errorBad file numberNo child processesNo more processesNot enough spacePermission deniedBad addressBlock device requiredDevice busyFile existsCross-device linkNo such deviceNot a directoryIs a directoryInvalid argumentFile table overflowToo many open filesNot a typewriterText file busyFile too largeNo space left on deviceIllegal seekRead-only file systemToo many linksBroken pipeArgument out of domainResult too largeNo message of desired typeIdentifier removedError 37Error 38Error 39Error 40Error 41Error 42Error 43Error 44Deadlock condition if lockedError 46Error 47Error 48Error 49Error 50Error 51Error 52Error 53Error 54Error 55Error 56Error 57Error 58Error 59Error 60Error 61Error 62Error 63Error 64Error 65Error 66Error 67Error 68Error 69Error 70Error 71Error 72Error 73Error 74Error 75Error 76Error 77Error 78Error 79Error 80Error 81Error 82Error 83Error 84Error 85Error 86Error 87Error 88Error 89Error 90Error 91Error 92Error 93Error 94Error 95Error 96Error 97Error 98Error 99Error 100Error 101Error 102Error 103Error 104Error 105Error 106Error 107Error 108Error 109Error 110Error 111Error 112Error 113Error 114Error 115Error 116Error 117Error 118Error 119Error 120Error 121Error 122Error 123Error 124Error 125Error 126Error 127Error 128Error 129Error 130Error 131Error 132Error 133Error 134Operation would blockOperation now in progressOperation already in progressSocket operation on non-socketDestination address requiredMessage too longProtocol wrong type for socketProtocol not availableProtocol not supportedSocket type not supportedOperation not supported on socketProtocol family not supportedAddr. family not supported by proto familyAddress already in useCannot assign requested addressNetwork is downNetwork is unreachableNetwork dropped connection on resetSoftware caused connection abortConnection reset by peerNo buffer space availableSocket is already connectedSocket is not connectedCannot send after socket shutdownToo many references: cannot spliceConnection timed outConnection refusedToo many levels of symbolic linksFile name too longHost is downNo route to hostDirectory not emptyToo many processesToo many usersDisc quota exceeded @(#)ctype.c 6.1 87/11/23 ((((( H @(#)mon.c 6.1 87/11/23 PROFDIRmon.out @(#)data.c 6.1 87/11/23 PHPHPPR@bH/ @(#)fgets.c 6.1 87/11/23 @(#)stdiom.h 6.1 87/11/23 @(#)filbuf.c 6.1 87/11/23 @(#)flsbuf.c 6.1 87/11/23 @(#)stdiom.h 6.1 87/11/23 @(#)fopen.c 6.1 87/11/23 @(#)rew.c 6.1 87/11/23 @(#)sprintf.c 6.1 87/11/23 rP @(#)getenv.c 6.1 87/11/23 @(#)isatty.c 6.1 87/11/23 @(#)malloc.c 6.1 87/11/23 @(#)memccpy.c 6.1 87/11/23 000000000000000000000123456789abcdef0123456789ABCDEF @(#)findiop.c 6.1 87/11/23 @(#)dowrite.c 6.1 87/11/23 @(#)print.h 6.1 87/11/23 @(#)ecvt.c 6.1 87/11/23 Fn CAy7Aׄ@È@Y@$ @(#)fwrite.c 6.1 87/11/23 @(#)stdiom.h 6.1 87/11/23 @(#)memchr.c 6.1 87/11/23 .textX.data.bss50.textp.data.bss50.textp.dataP .bss=0.text(.datap .bss=0.text8.data@.bss=0.text.data.bss=0.text.data.bss=0.text(#.dataX.bss=0.text .data(0.bssM.text.dataX .bssM.text.data*8.bssM.text .data*@(.bssM.text  .data+h.bssM.text 0p!.data+h8.bssMp.text  .data+.bssN`.text .data+.bssN`.text .data+.bssN`.text  .data+.bssN`.text .data+8.bssN`.text (.data0@.bssN`.text 8P .data1 .bssN`.text!.data18@.bssN`.text.data1x .bssN`.textx.data1 .bssN`.text`.data1 .bssN`.texth.data1.bssN`.text.data1.bssN`.text.data1.bssN`.text.data1.bssN`.text.data1.bssN`.text.data1.bssN`.text.data1.bssN`.textX.data1.bssN`.textX.data1.bssN`.textp.data1 .bssN`.text(8.data2 .bssN`.text`*.data2  .bssN` .text(H.data2@ .bssN.textpX.data2`.bssN.text!.data2`H.bssN(.text3@.data2 .bssO.text3.data2@.bssO.text4.data3.bssO.text4.data3.bssOX.text80H.data3.bssP.text8x .data3@.bssP.text:@.data3 .bssP_environ_exit _main__nd1SaveRegPx_socket_perror@_open__iob+_bcopy_connect_writeX_read_closeh_domainsP 0_strcmp )5_errno*8_sprintfA Kx_strlen cerror _fopen_rewind_fclose_fgets X__ctype*`c_monitor 8_profil_creatmP(yP0_getenvx_getpid____Argv+_strrchr _strcpy __smbufP8/__sibufR@__sobufbH__stdbuf00__filbuf @_memccpy0XL_fflush_free0__flsbuf__wrtchk_malloch_isatty03_freopen_lseek__doprnt!_endrP_sbrk$_brk_ioctl4_realloc`_memcpyp3_ecvt4_fcvt4_fwrite880_memchr:_btext_etext:_bdata_edata50_bbss50__startup_gethostbyname_sethostent_gethostent_endhostent_sys_nerr_sys_errlist_inet_addr__cleanup__countbase__countmax__bufendtab__lastbuf__bufsync__findbuf__xflsbuf__findiop__dowrite_Reduce_infHkqUZHyHyHyNb`O NuNVH8@HxHx .NSP#*@HxNWX# . JGlBG` Gdo~d30- ưGmJFg ;G ;m mBL N^NuNVH. *n &n$n(nBF`V0H/0+H2HЁ/NsP80H/0HЫ/NsP& g4D;CBE`A0HC0H2RE Em\ gd0RjתBE`A0H0A2HPRE Em g(0+yo0H/0+H/HxN. *n (n&n$nBn0H/0H2HЁ/NsP60H/0HЬ/NsP$ g:+B gSի g0Cl4 *l%BBF`\A0H8 gA0H0 gnA0HP g A0H0DlA0H0RF Fm g"0.yoB0.H/BN. *n (n&n$n<,0H/0HЬ/NsP&0H/0HЬ /NsP$0H/0H/NsP:0H/0,H/NsP8 g;F+C+B :;D gk׫ի Sk gv y=h 9 *@0*Fl 5F;n *l%C0.H+@ * l%B 0.H+@ 0El4:0*Dl 5D;nLHm lHmHmB0H/aOBF`A0HP .X2HЁ @0Gl .X2HЁ @0RE EmRFE \I G F m$|-|,A(HA &HBF`0H @Jgv0H/HR0@ | pNPBE`RA0H0H".\4H҂ A2H>A0HPA0HC0H2RE EmRFIGE Fm\L.J9g0. @b@@ | pN0H//</<&NthO `R0H/0.H//</<&NthO`,0H/0.H//<`0H/0.H//<#`/<&aXLN^NuNV 9fN:H`BN^NuNVH8*|<(m gLJTfHfHTNEX @^l 09ȑln&aJf`&lHTNFX(K fB `a.L8N^NuNVH<@*nahrg-yHnNmX$@HUNz`XR<0H/NG2X(@Jg&l/<Nw.//*/*/* *R//<0HSNthO 0H/HUHkNrO $|Jm g0H-@-C .ѭ .ѭJyo>09H/Hxd/.NyhP/NsP=@0.m o;n By - ̰l+n 0-H+@ &a`a - аl+n 0-H+@ *L&M$lHRNz`X:` Zn Al zn am SERRJEnB`pBL. 0H/0H//<NO NaHxHxZ0H/NyhP"9Ҁ/aPLN^NuNVH8*n.. (n gHUNz`X<0H/HU/<&NrBO |&B0``N @g( @g"`60,H80. @f/` /Nz`X<g0 @b>@@ | pN0H` GHH*` G0H` G*`BNq nf&|`&|/HSHnNthO HnNz`X6,gJ Cfn|0RCA0HSC0HA0HS.ARC0HBHn/<&NrP0H2H/Na./<&NrP0Hހ\Jf/<&NbXL8N^NuNVH8*n>.HxNaXHx/<XB/<aOHx/<XHU/<aO Gg GfHx/<XHmZ/<aONaHxNaXBE`6 GfHx/<B/<`Hx/<|B/<aORE EmBF`T0H& @JgB0H//<NPHx/<|Hx0H/NyhPAHPBa2ORF F mNaHxNaXHx/<B/<aO(|BF`J &@HSNw./<NPHx/<AJ0HHPBaORFP FmNaL8N^NuNVH>. &y G m`0H//<NPNaLN^NuNVH *n.. <.HUNz`X: El0Hr/NaX`0H//<NPNaHxNaXHx/<|BHxNa.aOHx/<|Hx0H/NyhPAHP/<4aOHx/<|Hx0H/NyhPA lHP/<EatOHx/<|Hx0H/NyhPA HP/<VaBONaHxNaXBF`Hx/<|B/<gaORF FmBF`b0H//<nNPHx0H/NyhP-@Hx/<|HxZ0H/NyhPAAHPBaORF FmNa`2 <~/HU/<w09RH&/NthORE Elz0H//<HnNthO /Hn09RH/NthO yR yFRnJFgNa/<N`XByRL N^NuNVH0ByR*|`B/-. G l,Hx 0H/NyhPX @RP0H @RPLN^NuNVH>. G l 0H @SPl0@ |BpLN^NuNV n h (N^NuNVH Ns*@Jf` HUNsXB`";|Hx/.NuP+@ J g L N^NuNVHJn f .9g#h 9h` p` 9LN^NuNVH8*n.. <.(UHUabX:(UJ gJ l Jg@/, NEXH/NG2X&@ gHS/, Nt^P`z/, NFX)K 0HL8N^NuNVH0*n(U lg 9|BE`z0H/aX,)F )y9|KBl)|$9|()yl*/9dHTN^P>HnHUNV,P>(U lfBG`>,0D@HL0N^NuNVH HxaNX-@fp`~/.a&X*@;|;n/.HmNsP .  gp`p/HxHnaO Jl ~Bp`/.aX*@.#Tp/.NsX L N^NuNVH Hx aX-@g.(nHTNEX:0H./aX-@fp` nBh/.aX&@7|7|HU/<HkNthO 0H'@(7E,Hx. n/( NJ>P n/( HTNt^PHx. n/( NH&PBHxHnaO Jl|`/.a(X&@<+/.NsX0HL8N^NuNVH *n>.0H/Hm N.P+@lp`40H//9pNsP;@0-H;@ -L N^NuNVH *n>.JnHxHUazPJlp`0Hx/90Hr //-N/O fB@`pL N^NuNVH *n>.Hx/90Hr //-N0*O f8B@L N^NuNVH0*n(n ~0SGJ@g __gB@`p`Jfp`pL0N^NuNVH8*n >.Hx./.NyhPt&@tBF`0H/HSaP6g0`n(yBE E lJTf Bf,=F4`$HUHlaJPJ@g0 @g @gR @gFIRE`0+H/0H/HxNsP/NyhP-@0H2HЁЮ8`p`BT0H/HSaP`RFkm:0 @g @g @g `p`<.: Efp`0H/HSaP6g`0+H/0H/HxNsP/NyhP-@0H2HЁЮ80Hй(@8HxHUHlNrBO 0H/HSaP6JCf0HL8N^NuNVH<*n ̗Hx.0. H/NyhPt$@Hx09~H/NsP:0H84BBG`0H/HRaPJ@g|HTNFXHSNFX0H`-yBC`r0HЮ @JPg`El*Hx0HЮ/0HЫ/NrO RB`2 f(K` HSHTNGP0H/NG2X&@ f|`nBBSCRC C mRGjmDJyf/*N/&XBJyf0 n f&$|HxHj N.P%@l|` BG`Hx/90Hr //*N/O<n|`BC`Hx@0Hй/Nr|PJftEl>0H2HЁ//<0HЫT/NthO 0@ k1RB`2 f(K` HSHTNGP0H/NG2X&@ f|`DBBSCRC CmfRGHx/9pNsP2Hm/*N/&XB0H2H/HSNIP&@ f(K` HSHTNGP+L BL/,N/&XB0HL0N^NuNVH09B>JGg,09D/0H//</<NthO`$09D//</<NthO <LN^NuNVa|-@HxNG2X#f Hx.<.Hx.0. H/NyhPt*@ n(h Ff*0H/HT0H/0H/NyhP//-N0*`(0H/HT0H/0H/NyhP//-N/O:UfB@`JEfp` Ffp`pL0N^NuNVH0*n>.<.(|tBE`NJ,-fB|-8Hx HUHl NrBO B,HxHl N.P)@lB,-p`0`REI. EmpL0N^NuNVH >. Hx.0H/NyhPt*@/-N/&XB--L N^NuNVH0>. *n Hx.0H/NyhPt(@HxHTN1PJlp`zBHm 0H/N3O <mN:0H/NG2X+@ f|`4Hx/- 0H/0H/aO<l/- NFXB `BF/,N/&XB0L0N^NuNVH8>. *n Hx.0H/NyhPt(@A &HHx#HTN1PJlp`xBHS0H/N3O <o;|`"HxHS0H/N3O <l:`(BmHx/- 0H/0H/a0O:m:-/,N/&XB0L8N^NuNVH8>. *n <.Hx.0H/NyhPt(@0H./N,X-@fp`/.N,X&@7|7|0H/0H/NyhP'@(7T,Hl HkNsPHxHxHnN-jO Jlz`. *n <.Hx.0H/NyhPt(@0H./N,X-@fp`/.N,X&@7|7|"0H/0H/NyhP'@(7T,Hl HkNsP0H/ m /(Hk.NrO HxHx HnN-jO Jlz` /.N,X&@:+JEm TfBE`z/.NsX/- NFXB 0L8N^NuNVH *n0-H/0- H/Hm"aO >l0`B mf:<`:<0H//- 0-H/0H/aO<0H/aX0HL N^NuNVH *n >. ;|;|;G/-HUN^P>l HUNsXL N^NuNVH *nBG|BE0-Hrb@@ |4 pN/- 0-H/Hm"N0O >oBG`HUaX>`0-H/0-H/Hm afO ;@l>-`0-H/aX`Hx/- 0-H/0-H/anO`Hx`Hm a&XJfjHx@Ns^X+@ gRHm Nl.HUHxa$O >JGf&Hx@ m /(Nr|PJg ~/- NFXB `~`|HU0H/aLP>m`Hm aXJfHm Nl.HUHxaO `|HU0H/aP>/- NFX`|HU0H/N4P>mr`Hm a.XJfHx@Ns^X+@ g`~`H|Hm 0H/N7zP``zBHU0H/a`nzBHU0H/`ZHUNsX`HU0H/a|PL N^NuNVN8f`. y/(NZnX/.aX y/(NYjXHnHnNV,PJ@gHx=NrXN^NuNVH0*n(y.gp`B<,sg lJ(fp`B* g|Jmgt0-HЭ @(Jg lJ("f^BN\XSmJf|)MN,sg0H//,NNP>l 0H/NfX/,NNFXN>BN`F lJ(#fN>Sm0,r@gHUNFX` lJ(g((g(g(g (fp`B8JNg0H/HU/,NNjO )@N`lJDg\09~H64mn 0-HR4Hx*0H/NuP)@NJNg lN hBHU/,NNP`)MN` `HUNFXJgJDf .gJNg lN0(H29~H6m`0H/HUa PL0N^NuNVH8*yBGBJJg mJ(fp`B> mJ("`*0-H/NX&@Jg+-fp`B>+8JgF nJg (2(HЁ @(f(BN\X` JngNc/.NFX`JmnfJgJNg0H//./-NNjO +@N`xJGgn09~H6: nhn n0(HR:Hx*0H/NuP+@NJNg( mN hB/./-NNP/.NFX`Nq+nNJngBn-g-sfNgvJNg mNJhgv mN (2(HЁS&@0-r@f mg \f `-sg`8  fBRnS mNdJng mN j+mNjBNmr`.Hx0HR/NuP(@ g*l0H//.HUNrO B5p L0N^NuNVH0*n(mBG`LBE`2Jg6HH/N G=o Gm GlHnNX @)fp;Gvp`a8(@Jf Nhp`HTaX/-VNFXBVp`BHnaP&@Jng* nfHnNX @)f f Nh`HSa"X,HSNFXf`f* mfHxDNfXp`8$nRd$ `/N X>m G n;Gvp` n pL(m0+vH//<HTNthO HTNz`X;@` :fBRJf L8N^NuNVH NHJgr?g, gJ g" Nq=| n0 `4Bn`HxHna|P*@ nf=|`a*@=|`L N^NuNVH *y#0Nh;| pmn+nV/.NE.N XL N^NuNVH0*n(y>-lnlr0,pHSrbR@@ |\ pNJGg0H/NfXBlpNc`0HUaX`&/- 0-H/0H/aO ` /- NF`L0N^NuNVH8>. <.*n(yBlp0 @fNgv FfB/,NNXHnNX0. nB0B/.NP&@/+Nh&`Nd3HHnNXHUHnaP @f Nh`HxBNEfP,sgNcHUNFX/,VNFXBV`\ 9ΰ4g.#4g"9| pNh/,VNE.N X`0H/NfX/,NNFXBN`L8N^NuNVH Hx/.aBP*@Jg n Pf HUaX L N^NuNVH<-y n*hN<- n -h/.Nz`X>0H n2(H8 n (6JDn, n&h(n`SGJGf0D@8` SDJDf`0H/HUNDP=@gp ng0H/HUNIP*@0H2HЁ:Hx0H/NuP(@ fp`0H//-/,NrO HUNFX*L n!LN(m0HЌ2HЁ$@0H n2(HЁ2H:0HЌ&@`SSSEJEf0HЮ&@:`SSSEJEfB@LHxNf`Hx`Hx`Hx`Hx`Hx`Nh` Hx`Hx`N^NuNVHnNX/<HnNP=@0.Hrb @@ | pN/<Nh&XNqN^NuNVH *yJmtf0-vH//<!`0-H//<4/<JNthO JVg$ mV/(/./<J/<?NO`/./<J/<dNO BNgXL N^NuNVH *yHnNXJ.gB@`. .g .gp`mnHnNZX n pL N^NuNVH0*n gHUNEXJ@fHxNfX`tHxNaXB94`P(mBG`(JTgHxHl/<&NrO NbIRGHx0-H/NsP2Hm*m fNaNaL0N^NuNVH<>. *n <.(y&mlnJlpgJGg 0H/a^XJGm0,pH rb@@ | pNHSaXJltf l=vl lV$hBE`"Hx 0H/NyhPHHЁ0:Jfںlvgz0,vH//<HnNthO /,VNFXHUNFXBVHnaX`lHSNDX`,/<aZ`HUNpXX`HUNn`HUa,`/,VNFXBVHUNFXBlp/,NNFXBNNcLHUHSNrO HH"<h@kNG2X(@Jf Nh`&lJmtf 0-vH/NX$@JgHRHS`(Hx&HmxHSNrO $mJ gHxHjHk&NrO /.NX+@Vmn;| pHT/.NrPL<N^NuNVH0*yHxNG2X(@JfNh`.Hx/<r/,NrO ;| pmnHTNXL0N^NuNVH0*yHxNG2X(@JfNh`4Hx/<R/,NrO ;| pmrmnHTNBF&f Gm HxXNrXJf G(o HxXNrXJGgN% @2nHx*0H/Nu\P&@Jgz$K`$0*H/HU/*NrO 0*H$j f l<gS  f.|HxHSNIP&@`S  f*k0+HS 0H/HSNPLHUNz`XrQo$JGgan/<NHUNrPHUaX`  faH`tJGg`09H/0H/NqP29H<HUNz`X2H4H҂ҀpPl0H/a./<NrP`aHU/<NrPL N^NuNV/<&aXN^NuNVH0*y0-r@f-sf&-rf`. GnJGoG 0@ |/0/<s`2 GOn GmG 0@ |/0/<` 0H//<NPLN^NuNVH>. JGg 0H/avXa0H/aPXLN^NuNVH>. JGg 0H/aBXapaLN^NuNVH>. 0H/aXaHLN^NuNVH>. 0H/aXaLN^NuNV/<arXN^NuNVH *|&~O`0SGJ@f/.Nz`X> . f$Hx0HrO/NsP2HҀ&*A B0H//.Hx0HrO/NsP&/NrO atL N^NuNV/./<NPaRHx!aXB9&N^NuNV/.NZ./<NPaHx"aXB9&N^NuNVHx#a:XN^NuNVHx$a(XN^NuNV 9ΰ0f <` <//<NPaN^NuNVHx%aXN^NuNVH *y/.NX-sg>/.NEXJ@o/.NE./-RNPJfmn;| p`|-sgN"`l-sgN`\-sga`N;mvHnNX/<bHnNPHrgrf mfHxD`NqHx'NfXL N^NuNVH<*yHnNXH f 9d//</<JNthO /<JNz`X>Hx0.H2HЁR/NuP(@ g$l/<JHRNsP0,H2H/0HЊ/HnNլO HRNz`X9@0-vmfJygl0-vH/NLXrgBrg*HxNNfX`Nh`/<Nh&`0H/HTNJ>P(@HT0-vH/N$(P`pBF`\rg"`R0H/NLXrfHTNE.`$HTNEX&@Jg"0H/HSNJ>P&@HS0H/N$(PRF F mHTNFXL0,H2HЁR oHxHNfX/-VNFXBV/-RNFXBRmr-rfNc`r)g`.r(fRl `"Sl l/<Nh&`Jl fNdBGJGg`HnNXHJf`&l0H/HR0,HЋ/NrO l0,B3RlJl f8mn;|pHT mV/(NP/-VNFXBVBRmrL. *y(U$mJ` 0*Gg&J$R f g &$J+JJHj /NLPLo0`pLN^NuNVH *na>0HrgJg0H/aRX`HUNh&Xp`0L N^NuNVH *y>-v/<*aXJ@f8mg0/<5N`Xmrmn;GvNL/N X`aL N^NuNVH *y/<FN`XmrmnJf~(` N >l0H/NfXmnL N^NuNVH *yHnNXHJg g" f@B/<WNP/N~`2J.f;|pmnHnNZ.N` /<ZNh&XL N^NuNVH8*n(yBG&lj`RG&S f G oHxJNfXHUNFX`*j)MjlrL8N^NuNVH<*y(mj&l$K>,`SGoRJg Gl+TjHTNFX`HSNz`X<Go<0HR29~Hl 09~H`0HR:0H/NG2X+@NJNfNh`0H/HS mN/(NrO mN1F mN (2HЁ @B-rf-fHSN`XNgv0H-T /HTNJ>P+@jf+njHxBNEfPFgJfSGn GmL @g Gm GlHnNX .?gv= .-g .+f.HnNX .=fBBBBNJ@fNK< @g F=n0HrA0HHnNX .-fNNK: @g^ E=o(Hx:`|0HrA0HRFEoHnNX .?g .,gJJ.f0H @-h -h-h-PH @+g @-g< @=NqA0H"@#h #h#h"N_.`BD` A0H FA2HRD DmA-h -h-h-P`BD Dl|A0H A2HRD`B/<NP/N~`2HnNX .?g/<Nh&`Hx;`Hx+NfXLN^NuNVH *ya>0HrgJg$`4/<Nh&`Hx(`Hx)NfX`ZJg UJg U P>(0H/a4X @g6N20H//<NPBNgX*ymrmrL N^NuNVH8A&HHSNX:NJ@g0 @g @fHx*0+HR/NuP*@ f Nh`(m0+H/HTHnNլO ~HTNz`X;@f  ;|BG0H/HUNP<lt0H/NfXHUNF`Z/<HSNPJ@g"x0H/N8X<l40H/Nf`$/<HSNPJ@gBD`/<Nh&XL8N^NuNVH0HnNXHJg g ffNgv`lNJ@gTHx0.H/NuP*@ g2(m0-H/HTHnNլO HTN`XHUNFX`Nh`/<Nh&XL0N^NuNVH >.BF*|` HGgRFR F>mB`" F&l 0HЮ`0HЮ &*@ L N^NuNVH8(y .ZfBZ`NJgHN&n&@ n*hBG`*-HH/HH/ /Hk.aOTTG nhmL8N^NuNVH /./. /.a O *@ .rg"rf4HH".`HH".`L N^NuNVH<*y(mZ fHxHxNuP(@`l0,HT>HxHTNDP<gP FgHxHTNIP(@Hx0H/NuP$@UG0H//,/*NrO HTNFX(J g+LZ0,HЬU&@ n`NhL.<.:.HxNaX(|<`,.nv0H2.Hgh g/,HUNPJ@gR FffFJFff< Fff0JEff& EfgJGg /,Nb`HTNXI JfvJGgNaL0N^NuNVH BG*|<`z-.nl/-/.NPJ@gX nffJJnff> nff00H2.Hg" n RG/-Nz`X n2(Hg K Jf0L N^NuNVH B4. nFn:. 8.6.` n n 8. 6.`6. 8.:. EdlEl Em: E3n4 Dm. D n( Cm" CnJnm n;nJnm n;op` BfBBRC Bop`<<`0H/NpXހRFEm0H/NpX nf DmR` |0@HHހSDf0HSހHx/NyhP2HЁ.HxHnNX .?f/<rN.N` /<wNh&XByLN^NuNVH<*n-HH/NX&@ f4`,`*$l  f xg Xf RJfB`6HTNMXB`(HnNMX(@ g ngHTNHfX.HTNFX g  f@Jg.*yBy&By,By*By( mvfz8<` ,g ,f 3(`, ,m ,n 3*`3,`3&p`",&@`P+f> +f/HUNPJ@g& +f6J+g +f(/HUNPJ@f+f6P +f f+ g* g gB/<HUHTaO `+H @b2@@ | pNHH,F+HH`3,p`"+H4`+HHrᡃ`+HHrF``HUNX>+HH @0Gn+HH @Pnp`B<+H @bj@@ | pN`8+HHrᡃR`FJFg`>/<HUHTaO `JFg4`"JFgD``HUNXJgf3& ng0.H/HT/. /.aOpL+H<HSHTHUNO :0 @ g^n @gV @g @ g @g @#gP @$g @&g<`0H/0HR/aP0H`g||`J,fBB,B,||`b ,fX||NB,`@-f$B,B,|B,;|<:DB,`||Bm:DB-f|!|#|%|"`B-!B-#B-%B-"` ng -~l -fB-JGg-HH/Hx!`JGg0-2*tHclHnNXJ.fBHxa\Pjr`FJGgB,f:xN-gD0H/Hx`JGgx-gBD0H/HxaPJGg,+g$0Hrg(0H/0H/aPJnf"+g0*vjg0*vH/NXL&lN f`2$k0+H,HUNz`Xf/HRHUNslO Jfp`B@L<@N^NuNVH0*y-fHxHxHxaO Ngvmr mpgr0-H @g @g `(|`(|RHTa2XJ@f:Hx1NfX0-tH"<h@mmHx N$XmnL0N^NuNVH0*y(m^ mf0(H/aX>HnNXHJgrgr?g fI flff0H2HgZJfmrJZg B/-ZaPJy&gBmt0-vH//<HnNthO HnN^BX``HTNX`Hx2NfX`J.fNdBHT/-f/-baOJ@gN`F/,/<NP0-,HHeHT/-f/-bNŤO /</<&NrPNa+L^L0N^NuNVH<*y̕z0-vH/NX(@HnNX @fHNdN=@ @ g n g n gNH g* g gj/<N.N`|*HnNX n n0.H//.HnNrO A0.HB(0.HT>`b|%BHnNHP$@ ng `B.BG`8 gz&j~HRNHfX-@|%HxHnHnNs8O B.0HR/HnHlNrO HRNFXBE`/<NXNaHRNFXN=@ @"gJnf0HL0H& @Jg,B0H/N%$P*@0H/HxHU0H/a|ORG G oNaL N^NuNVH0HxNaX/<FNbX/<FNbX~ `4B0H/N%$P*@ g `B(@HTHUHx0H/aORG G=oNaL0N^NuNVH<*n(n&|$|-|0. HD-@0. H//<HnNthO f$|`V f$|`J0,@ |$p0. mf>- `>, 0 @g @ gh @g6 @g @(gHS/.HRHn/<^NONb`0,H/HUN' P/N*X&@Jf&|`&|J0. mf"0,H//<'/<JNthO `~0-H//<5`&|B`d-mJ` n0(lg n-PJf0.H//.HUN؜O &@JgHSNz`Xrl-|P UJg0,H/0. H//<VHnNthO`L. *n <.:. fHUHU0H/0H/aO`mf\(UHTHU0H/0H/aOJFf2 lg BB/<i`/,&/,*/<rNO Nb gR(T gL`(M`lg(T fHTHU0H/0H/a`OJFf/,&/,*/<{NO NbL0N^NuNVH0*y>-vBF0HD(@HnNX @f/<HnNPJ@g|B0H/N%$P*@JgJf0H//<NPNa`Jg. G n(HTNw.0H//</<JNthO`0H//</<JNthO Hx /<JNgPHxNaX/<FNbX/<0NbX0H/BHU0H/aONaL0N^NuNVHnNX/<HnNPHrb:@@ |\ pNNdNŒ`Hx3NfX`/<Nh&`N^NuNVH >. <.*n`\Jg$HUNw.0RGH//<NO `, Gm0RGH//<`0RGH//<NPNbX0SFJ@fL N^NuNVH *|HxNaXNgvHx /<NgP/<@Nw.HUNw./<-NO NbJg"/<Nw./<PNPNbNaNgvHx /<yNgPBG`20H& @Jg 0HD/Hx0H/aO RG G oNaNgvHx /<NgP/<DHxHxalO NaL N^NuNVH NgvHx /<NgPNgv*|0/<HUNw./<NO NaJg/<`/<tN`XNgv*|4/<HUNw./<NO NaJg/<`/<tN`XNgvaNgv*|/<HUNw./<NO NaJg g/<1`/<tN`XN:HJfLNgv*|/<- G n*0HD` Gl0HD(@` Gl(|Jg> mg$HTNw.0-H//<eNO `>HTNw./<y`$ G n0-H//<`0-H//<NPNaL0N^NuNV-yHnNm.N`XN^NuNVH *yHnNXHJgr*g g fNmn;|pN`HHnN֮X+@VfNh`.mn;|pHnNZ.N` /<Nh&XL N^NuNVH0*y mV/(/<NPNa n<( n (2HЁ(@BG` SJfSFRGJFfJFg(0HS//.NIP-@gB/.NeP/<N`XL0N^NuNVH<*yA&HA$H#03HHSNXHJg r*g( g g f'|7|0+HSЫ(@N> GgB Gg< G~g6 G!g0 G*g* R7@NhHSN֮X+@Vf Nh`LHRNX0*HSЪ`mnmr;|p/-VNE.N ` /<Nh&XL.BEHx /<NgPNgvJGf&$MBDBF`*gRDE"RF Fm Ddm~JGfp`p/NaXBF`~-gpHmNwX(@0H//<&/<NthO -g&|`&|*REJGfA ` <7 @HPHTHS/<.NONbK"RF Fm|NaJEg2 Ef <U` <V/0H//<8NO NaLm0H/B/<2aO LN^NuNV/./. /<XHnNthOHn/<&NrP/<&Nz`XrKo4/<^/<&NrPNaHxNa./<&NsPN^NuNVHBG`0H @-h -h-h-P0H//<`NPx BEBF`0HrA0Hg@JEf0H/0H/aPx,z`BRE Efx- F=f20H/0H/aP` Eo0H/0HS/aPx,BERF F=oz/<m/<&NrPNaRG GmLN^NuNVH *yNJ@gD mvf,HxDNf`Hx/<oNP/N~X`0-vH/N)`0-vmfHnNXH g gF/<tNh&` nH>G_ GMfN$`@ GDfN$`2 GSfN%`$HnNX> @n0H/N%0`ZL N^NuNV nJf <`` n (@ f, .^/ .T//./</<NthO`" .T//./</<NthO <N^NuNVH .9.-y*|HxHx2Hx/NqP/NyhP/NsP-@Hx2Hx/NsP/NyhPЮ.N:l/HnNm./<~@/<NONaHm a./<NPNa/<~XN`XL N^NuNVHnNX/<HnNPHrb0@@ | pN/<N`X`/<`/<%`N^NuNVH|B3FHnNX @fHnNX&3FHnNX @fHnNX<`//<9NPxBE`g C0(` C0H//<?0H&/NthO rf/<E/<&NrPRD  m ~o~. |PRVD0RE @mr/</<&NrPNaFJFn6LN^NuNV/<GNXNa/9/9/9/9/<qNONaHnHnHnHnNLO/././././<NONa09PH//<NPNaN^NuNVH8*n(y g*&m*+K>-;G;G `0SGJ@f)MN`BNL8N^NuNVH0*y(mN(9l L0N^NuNVH>. |0pgpA` |0pgp0`0LN^NuNVH0*y(mN gJloSl THR`B@L0N^NuNVH0*y(mN gRlSL0N^NuNVH8*n(y&lNB- gJkfB+SBm`'S7k aj> G g G g G g S+@0H/aXHr%gnr gnJgr g`LByHa> |0pf G_g G.g G-g G!g G?f|JGga ;@`a>ByF G(ga> |0pf`a> |0pf G(g G)g`JyHfHJyFfaL> |0pf`\Jyg`a$> |0pf G_g G/g G.g` a>JGg G g G g G f`|"`|'a> G\f a>a>JGf`ھFf`a>``BBk` yHgZ`R|`Hr!gr"gr#gR`0r0gnr'gnr/g`r?grAgr^g|`L8N^NuNVH8*y(mN gJlfBF0`:,&Ta> G g G g G g9E(0H/azXHr%g(nNJgr g.-n/.Nz`X=@|B.0@ |*p`/-HnNPJ@g ` KJfBL N^NuNVH *ng`gff B@` ngpL N^NuNVH0BG(y*n`/-/.NPJ@gj0,H/HUaPJ@gX/-Nz`X n2(Hf"0.HHb n p`.B@`*0.HHb n RGKJfx0L0N^NuNVH0(yHxNaX*n`0.HHbxfrfl0,vH/HUaPJ@gXJg/-/.NPJ@g>Jng /-Nb`*JfJJfg0,ggHUaXKJfjJngNaL0N^NuNVH<(n*n      $yJgr?gl g gp`HnHU0*/HTa,O>f*HnHUHxHTaOJ@g Nhp`Fp`@J,f Go.Hx7NfXHxHU0*/HTatOB@`&n0HfHSaX: @g0`g jvfp`B<0*vjg(fp`0*rd Nhp`N @?fgJFg HSaZX`lJFgHx!NfX`X kNp`TBHU0*/HTaO`0BHU0*/BaO jvf/<RN`X`pL(mP`YGX gHm@Nn.0H//-< /<:NX @P`><LN^NuNV/.$/. /././././. /./<&NthO$N^NuNVH>. \  B9 G'g G"g G\g~ G^gx Gf^ ? `` |0pWf G f B9 `< G l^ 0H@ `0H//</< NthO < LN^NuNVH *n/</<&NrP`JgHH/a.` f/</<&NrPL N^NuNVH0*nBG(|<`F,.n80H2.Hg*/,HUNPJ@gRG/,Nz`X2-Hg I Jf0L0N^NuNVH 0. H/ajX*@ ^fHU`HU/<HnNthO Hn/<&NrPL N^NuNV0. H//<HnNthO Hn/<&NrPN^NuNVH -n/.Nz`X=@|B.*|<`/-HnNPJ@g ` K JfBL N^NuNVH *y0-vH//<HnNthO 0. @bJ@@ | pNHn/<aP`(Hn/<`Hn/<;` mV/(/<V`Na/. /.a P ng/. /.aPL N^NuNVH0*n(n -HH>0,Hrfp`B<HxJGg <(` <D//<HTHUaROHxJFg <` <\//<HHTHUa(OL0N^NuNVH8*n(n -HH>0,Hrfp`B<JFgHx/<P/9x`~JGg <` <(&@` gXJf,f,g&`BHxJGg <` <(//9xHTHUafOJGgHx/<\/9|HTHUaFOL8N^NuNVHx .&//.aO N^NuNVH *yHnNXHJgr*g g$ g fN;| pmnN`HHnN֮X+@VfNh`.mn;|pHnNZ.NZ` /<2Nh&XL N^NuNVH *nHxHm&HUaO L N^NuNVH<>. ͙&y<+v Fg Gfj0H/NTX$@Jg4A.*HJg (@`0H/NX&(@~`B0H/N%$P&@JgJfN`x0H/NX$@JfHxGNfX`VA&(H Gg*J`6Hx&HRHnNrO 0+Ff=k<` =k8=k6A*H0H/HTHUa.O L-y n0(:0H/0H/HSaO J@fL0H/HxHSatO J@o&HSNZ./<SaPNaNh`HSNhTX`$|<`*HEn0H2Hg/*HSNPJ@g g>0@ g6HRHTHUNO <*g JFoE `*g JFl /*/<&NsP/<[/<&NrPHRHTHUa*O *gE NbE JfBL$|,&@`@/<`+H @bP@@ | pN0H,+f(/`p+H@g`+HHr<0H2HFg `+HHr<0H2HfHR/<&NrP//<&NrP$|``0H/aX`+H @b@@ | pN0H,+fd`<+HHr<0H2HFfD`l0H/a`DH``*P+ g gt gZ+gεgL0. H/NyhP` n= n <®`BN^NuNVH8*y0. mf AJ&H `DB0. H/N%$P(@Jf B`(`(T g0. lfJl g l( fAJ`L8N^NuNVH 0. H/aX*@A. L N^NuNVH 0. H/a\X*@ gJfB` L N^NuNVH 0. H/aX*@ g-gB`pL N^NuNVH 0. H/adX*@ g-f-fB`-gp`pL N^NuNVH0*y mfr <"<h@mm|N:HJg$(|;|pmnHTNXa *`/9/<HnNthO A(H`Hx&0-H/a.HmxNrO ma/<rN`XHxHmxN. *y-sg mJ(H: GgJGfFgGfg$0/N8X<l0H/NfXg`fg$0/N8X<l0H/NfXgPm n` Geg Gdf* mJ(gm n0-H/N X`Jf-sf mpg mpg mpg mpg0-r@2g/<N`X mpf-og/<N`XNo|-sg,-f/< N`X`(mj+TjHTNF`JjfHUN#@X-sf m pfBR-sg/-RNFXBR/-NNFXBN/-VNFXBVBmnBmpmMraL0N^NuNVH0*n>.BE gZ(m|` RJfRSFJFfHTNlX m0zHTNz`X00H//<HTNthO 0L0N^NuNVH *ymnBmp mJh ;|paL N^NuNVH *yB/-JNP/ U0(H//<NO BNgXBmp mJ( fa`HxN&XaL N^NuNVH *yJn g0. H/Nf`&-og Hx>NgX-og Hx?NgXmnNcL N^NuNVH8*y(mJ&T gHk`0-H/a X&/Hla6Pa mJ/(NFX-sg* mpg0-tH"<h@mmmrBmpHTNTX+KJL8N^NuNVH *y>. |BEmn mJ( gB/-JNP/ U0(H//<3NO mJJg8Hx/-JNP//<V/<&Nz`X&/NthO JGl/<]/<&NrP`/<a`JGfz mJh ``BFaJFg BNgXJGl0H/`JFf Hx8NfXJEfaL N^NuNV0. /NzXN^NuNVH *y-ng mnNcL N^NuNVH *y-rgmr-sgN"L N^NuNV0.H//.NPN^NuNVH8*ymrBN&XHxHxNuP(@ f Nh`&l mJh| mJh| mJh| mJh mJh | | mJh | mJh& | mJh%|  mJh| mJh|  mJh | mJh+LZHTBN-&mBF`RFRRSGJGg@__gH |0gJFgRH |0f`B@`0L8N^NuNVH *n m'op'`0-H>0H//-/<JNrO |JB0p <JL N^NuNVH<*n >. n (R(@ n0(HU<`JGo ^fSFR` \fSFRH |0g>Bz`.H |0g HHHH0SFSEJEfSRF`0&|HH/HSNrP$@Jf`  @SFSGRJFnLBJGfJFo Hx6NfXL-Hx0HR/NuP(@ g&l0H//-HSNrO B3p L8N^NuNVH0*nHUNz`X>Hx*0HR/NuP(@ gHU/,NsP L0N^NuNVH8*nHxHUNEXH/NuP(@ fB`0&l`$>-0H//-HSNrO 0H*m f L8N^NuNVH *n fB`B mo <`0-H>0H//-/<&NrO |&B0p <&L N^NuNVH n*h L N^NuNVH8*n&|J g<(m mo$\HTNw./</<JNthO `T!f`B <JL8N^NuNV/.aXN^NuNVH8*n(n f <`^0,H/HUN' P&@0. @g @g2 @g$Jg0, H/HS/,aO `HSa `HSazXL8N^NuNV0.H//./9afO N^NuNVH *n0H> Gf-HH//.aP`Tg&-H @g @g B`8 <`0 <`(g-HHЮ`J f`-HHЮ L N^NuNVH0*n0HrfNqB@`BHU/. /.aBO (@ g0Hrf0`0@ gH`L0N^NuNVH>.0 @gNnd @g& @g( @g* @g,B`b <`Z <`R .P`J <r`B <`: <`2 <`* <R`" <8` @g @g @g @!g`LN^NuNVH 0. Hrbn@@ |j pN <0`X <4`P <,`H <`@ <`8*y>-v G n0H`Gm0H `B``L N^NuNVH<*n(n >-<,&m-lJGo0HSЋ @JfSGJFo0HSЮ @JfSF0HR/HUNDP:gr Eg0HR/HUNIP*@Hx*0H2HЁR/NuP$@ fHTNFXa`0H/HS/*NrO HUNFX*J&jJngB3p+LHTHUaPB`:0H//.0HЋ/NrO 0HЋ2HЁ @B0H2HЁ;@HTNFX L. -y*|&|v< n(sg` n(gHx/<HUNrO `#|z`,0H/HU0H/0H/NyhPЍ/NrO REDm0H/0H/NyhPЍ @BHUN_XDCo0`0H8flL N^NuNVH *y-sf&. HH/N./<&NsPNa|L N^NuNVH *y-sf/<N_XL N^NuNVH< n&h-yBC nJJg n (J` n0(H/NX&$@ n(sgH` n(fp`B: n(HH8*K`RJf n (h>(`H<FJFfJg F fg\cL-* f@S  m f8JEg2HH/a`*H@fg - gSRC  m f JDgRC`a| F m F~n`Dg, - g$SRC  m fJDgRCg - g`a6 F m F~nxRC`r* H@g* H@fJEg0H/N./<NPNa|BB9&-K`r n  m f$ nHH/N./<&NrP`Hx/./<&Ns8O /<&Nz`X o Na|B9&R nJfNa|`* H@fJEgab`*H@f\g - f a F mf F~n`` - fSRCfg - g - gSRC  m fJDgRC`  m fJEgHH/aXJCgJEg0H/aX` GgRSGJGf~B n1@L. GAm GFn 0H7`2 Gam Gfn 0HW` G0m G9n 0H0`B@LN^NuNVH >. n<( n*hBJFgH @4gro @7gjn @5g` @6gZ` @0gPn @%g @'fRSFHH* Ff`~RSF (fTRSF 8f@~RSF )f~RSFJFgH |0gHH/aX8Go `J 2fD~`H |0g.`0H//NyhP2HЁ*` @1g @2g @3g/<Nh&XB`6 @8gn @9gf @^fRSFHH*r@m Ff L N^NuNVHx /.aPN^NuNVHx/.arPN^NuNVH<*nN&n(@BD$mBG`0 Gf HRNlX:HRNz`XR@HRNz`XRRG GoBT9E0H/HUNHP&@Jg$Hx BBBHUN0O<l"HSNFXHUNFX0H/aX`8)KLl(/.NFX0H/` Ufa`Hxa XL,N^NuNVH0N&n(@/,NFX Tg2N*@;|;l;n /<N].HUN^PNPL0N^NuNV0. H/NzXN^NuNV0.H//.NPN^NuNV0. H/N8XN^NuNVH *n0.H/HUNP>gHUNFX0H/aXL N^NuNVH0*yN&n(@Hx& U0(H/N.Hl.NrO HxHx(Ns$P(gD T1|Hx U0(H/NX&/ /NrO T"UhBL0N^NuNVH N&n*@/NTXL N^NuNVH8*nN&n(@N&J@g4Hx HSHSHSHUN0O>lHUNFX0H/N XBTL8N^NuNVH N&n*@NL N^NuNVH >. *n HU0H/NPL N^NuNVH *n>.0@g4HUNEXJ@f HUNFX`*gHUHxN<`HUB`0H/HUNPL N^NuNVH >. *n gHxHUNP` HUNFXL N^NuNVH *n0.H/HUNP>gHUNFX0H/N XL N^NuNVH0*n.. |/N*X(@ gt;|B ;GJg4/NXJ@f;|/<N]X+@`;|/,`p l";|/<N].HUN^PH,Jg HUNsXL0N^NuNVH0N`n @ g @ g @ g @ gHUNs`p:>- Gm0H/aX>;G Gg,;G0@ |~;p0H/N*X(@ gJTgHUap`HUa`HUa`HUarXHnHnNV,P*n0- @fBB0-H/a\PHUNT`0-H/0-H/aml n!|`/.NoXJ@NqJgJNs&@Jf /.NF`07|#'n /<N].HSN^PJ@g HSNsXL mf/<HnNsP`0-H//<HnNthO Gf0-H/N*X&@6/<0HxHxHn //<Nh4O(@Jf`HTNjXJ@gHUa XL8N^NuNVH0*n;|B 0 @g @!NqHUNT`D mg0-H/N*X(@BT.-;|;|/HUN^PJ@g HUNsXL0N^NuNVH8*n m (hBF`" Ff HTNlX>HTNz`XRRF Fo;G*# G>mHx`JNs&@JfHx`8 m f"67G7|'m B HSaFX`7GHSaXB0H/a PL8N^NuNVH0>. <.*y` 0-Gg(M*U f gD g(`#/- NFXB ;|;F/-HUN^PJ@g HUNTXL0N^NuNVH0>. 0H/N*X*@JUg UfNs(@Jg0H/HTahPL0N^NuNVH n f$-y-y-y-y| `20. H @-h -h-h-P<9>BG`rHƍ>HFHx 0H/NsPA0Hrg:0H/N*X*@JUf& n gHx>0HR/NqP3>0` RGRF G>mpL N^NuNVH0*n>-0H/N*X(@Ng, Tf0*,/NhX;| ;|B /HUN^PJ@g` /NhX0H/HUaPL0N^NuNVH0*n>-0H/N*X(@JTfJf|/<N]X"-f 0Hr0H @)m0-H/NXJ@g;|`;| y+h/,HUN^PJ@g HUNTXL0N^NuNVH0*n0-H/N*X(@BHUNTXL0N^NuNVH0*y\`0-n f g(`8#\`0(M*U fHnHnNV,P>lNf*n0-n f `*\#\`L0N^NuNVH *n>.B`SGRJGfJfp`BL N^NuNVH8Ns*@Jf BNrXHxNG2X+@ f BNrX;| y+h/9~HUN^P>l BNrXHxaX*@Jmf m (hHxHTaBPJfHxHT/<rNrO #,#0Hx/</<DNrO Hx /< /<DNrO B&|D`Hx/N8PRXp mB&|D`Hx/N8PRXpm;| y+h/9~HUN^P>mHxaX*@Jmf. m (hHxHTaLPJfHxHT/<RNrO HUNsXL8N^NuNVH y&(/<`N]X#rNq/<cN]X#~rNq/<jN]X#rNq/<mN]X#vrNq#zHx"a XaN09PH29~H3l,0H/NX @B(;RG`BNrXBNrXL N^NuNVH0>. *n (y` @g @!g$(T g&0, Gf0 @f0,mf ` 9`BL0N^NuNVH<*n(y&T0- @g@n @gnV @ g.n. @g @g4HUNX`HUNN`HUHUHxa>P/NP`a`>-HUNX0H/N|`>-HUNX` g0-kf k$N HUNT`|HUNXNѢ`bHUNXJl fPN`F$m HUNXHxHRN`TJmg|`BF:--m HUNX/.0H/0H/BNO`<-&L g00+Ff:Jkg0H/HxHTNO HUHSN P fHUN`&S`HUHxaP&@f k fN J@f`HUHSN `HUHUHxaP/N$`tHUHSNt`fHUHUHxaP/N `LHUN~`HUNMX``HxHUHTN^O `HUNJ` @ g @ g* @ g2` @#gn @gD @gl @gH` @g @g @g` @gn: @ g>n @ g& @ g`^ @ g @gf @g^`B @ g*n @gH @ g @ g` @g @g @g`Ll0`LJGfr j f5|= Jj m j o|`t j mJ j g0* H/Hx/9NO 49~0* H/N8X: @f|`&5E 0.H/0* H/0H/aO <g4/* NFX Ff-$f/.0H/HUNO `0(U)n:)n &)n*)n.9n6)n20.H/HRHTaO <gB:B&B*B.B2N `r/* NFX9|Hxu0N&X0,HL4N^NuNVH >.Jn gp`X G>l6<<0@ |&:00H/N*X*@JUg Ug Ufp`p`p`0H/0H/N"JPL N^NuNVH<@*n(n <, 0- @gB`;F0H/N*X$@Jfp`tN&@7| y'h'm7F'l B /*HSN^PJ@gHSNXp`&4 y h g|0H/N,LX`jL<@N^NuNVH<*n(n &y gggHTHUN#nP` mf0- @f0-H/NX$@;j6;j80-H/N*X$@4 y%h+l+l0-H/HUaPHxN&XHTNXB+* S0( Ht @ PN|*0-H/0+ HTt @ PNX`HTNTXNPL<N^NuNVH8*yN(@0- @g @!gR`f/9DN&X`dHTNX0-H/N*X&@6 y'hHx BHUNPO `HTNX/-NX;| mfL8N^NuNVH y*P g$ mf yB(+0. H/HUaBPB@`pL N^NuNVH >. *y y|+0H/HUa PL N^NuNVH0*n>.0H0HN(@0- @g @!g*`29|9mH9@/-HTN^PJ@g NqHTNXL0N^NuNVH8*n(n &y gvggHTHUN#nP`p0- @fV,>HTNXf&|*0H/0+ H\t @ PNX`&B+*0H/ S0( HX`HTNXNPL8N^NuNVH0*y(UJn f0.HѬ*Rl0`0.HѬ&Rl.l$ lgHHx 0,H/NyhP\-@0.H nѐHx 0,H/NyhPZ @RP mgHHx 0-H/NyhP\-@0.H nѐHx 0-H/NyhPZ @RPL0N^NuNVH8*n(n &y gf ~0- @g,HTNsXNP`fBG`HTHUN#nP`9| B (+L`f+T/-HTN^P<gP Ff/-HTN[fP<f+L `N/, NFXB Ff9| HTHUN `HTNX(m fJGfp`B/NXL8N^NuNVH0*n(y|+Jl fJ,Cg0.@f HUNFX`0.H/HUHTafO L0N^NuNVH8*n(y&T g kgp`.B,+HUNEXH/BaP0.H/HUHSaO B@L8N^NuNVH<*n(n >.N&@Jf HTNF`'L 0- @g @!g`7m0@fL7|gp`B7@BkBk`H7|gp`pe7@`.HSHUN"P`h0@Hf0@g$lN&-@g7|`7|HxHTNEXH/NsP60SCJ@o f kfxJm fr nj nJ(g^N-@g4 n1| n1m/-/.N^PJ@g /.NXHUN#@XHUNXBNXT`jg7| y'h'm`g7|`7|J f/-HSN^P:g0 Ef./-HSN[fP:m+K JmfB`p/N`/+ NFXB EfJmg7| HSHUN ```HSNX-%f&m f`$k HTN2X(@ f$L` g HTHRNGP'J Gf4 g0HxHRNDP @f`$jJf0*HSЪ @B/+ NEX< @o.0H//+ NIP'@ m$` HSNXL.&l -yBF0- @g @!g>`~ gp-k0+HѮS n  fDHxHSNIP&@|HxNG2X$@JgB-j n HxHRHUaZO `"Jlg|`BF`|` m<gJlg|HTNX` <` l g l f`JGg n|*0,H/ n0( H\` nB(*0,H/ n P0( HXt @ PNXHTNX` lf|`l lf<<`\HTN`Jf-%g HTN`B l#fm$HTNTX` HTHUN"P|Jm f JFfB< m f0,H@JGg n|*0H/HS n0( H^`J mf HSNF`2HSNEXH/HxaFP nB(*0H/HS n P0( HZt @ PNPLgx0-H/NXJgd0-H/NX @0(HgDHx60H/NuP&@Jg,0H//<8/+NrO HxHSHUNPO ;|HxpN&XHUaXB@` mgHpL8N^NuNVH8*nN(@0- @f20-H/N*X&@6HTNXHxBHUNPO L8N^NuNVH >. *y0H/HUaPBmNPL N^NuNVH<*n(n &y|BEBG f HTN`XfDBm k f$0+H/N*X$@BR0+H/NXHTNXNP` mfBg>|/-&NFXB&#:/-*NFX/-.NFX/-2NFXJmgBmzfZ8-0- @fJGf<-%g~`0,@ |€>00H/N*X$@BR0H/NX l f~`HTHUN#nP~JEg0H/0H/HUNO f.HTNX0H/a.XN Jf/9DN&XL. JGm( G>l"N*@;| ;G/9zHUN^PL N^NuNVH8*n>.Jmf" m f0-H/N*X&@JSg-$g0H/HxHUNO N(@0- @fP0-H/N*X&@BS9|9m9G/-HTN^PJ@g HTNX0-H/N`HTNXL8N^NuNVH >. *y|*0H/0- HVt @ PNXBm/-NYjXL N^NuNVH N*@;n  y+hHx/. Hm NrBO +n /9~HUN^PL N^NuNVB/.Hx aO N^NuNV/. /.Hx aO N^NuNVB/<\Hx afO N^NuNVB/.Hx aLO N^NuNV/. /.Hx a0O N^NuNVB/<]HxaO N^NuNVH0*nN(@9|)M y)h/9~HTN^PL0N^NuNVH0*nN(@9|)M y)h/9~HTN^PL0N^NuNVH *n=m=m-m HUNX0.H//.0.H/NZ4O L N^NuNVH8*yJm,nB`d&m2 m2+P2Sm,fFNs(@Jf2HxaXBaX m.!|/-.NoX|&`HTalX7| B L8N^NuNVH0*y`N (U fNNfL0N^NuNVH<*n y#T0-H/0H/N!P>g,/- NFX0 @gz @gHUNTXNf(y9m lg$0,H/NX-@Jg n9h<0, @g @g @!g~`|*HS`0-H/N*X$@BR,-;|;|B ;G/HUN^PJ@g\HUNs`N;|;m;G/9zHUN^P`,)yv)yv y/(/<`N]Pl$` )m)m&m HUaX f:N|*B0, Ht @ PNXL. BFBE0H @-h -h-h-PBD69>`RHÇ>HCHx 0H/NsPA0HrgRE0H/N*X*@ UfRFRDRC D>m3h3jL N^NuNVH<*n>.,.(y&|J9g`:,B9&$m:0 @b@@ |d pN lf`*/aX09hH/09jH//<NO :`g lg0-0//-*0-.//-& 92/ Dl @//<NO`. lg$y Dl @//<NPHRN)tX-@/.N*X&@/.NFXNq/<&HS0@ |H/00H//</<ŨNthO/<ŨN|XLoL0N^NuNV/. NFXN^NuNVH N*@;|+n ;n;n  y/(HUN^PL N^NuNVH<>. *n y 6(@HxHUNEXH/NsP<$m`&L GgJGgSSFTJFo. *g +fA`A&H` .g /fA`HU0H/N'H/aO L.:.*n&yJGg(K`(S,%g4JGg|*HU0H/0+ H `B|*HU0H/0+ `*JGgB+*HU0H/ S0( `B+*HU0H/ S0( HPt @ PNPL8N^NuNVH0>. *n (yHU0H/HxHTaVOL0N^NuNVH8>. *n (y&T&T fp` kgp`HU0H/BHSaOB@L8N^NuNVH8*n.<.(n&yN&J@gm$`m$G+0- @g @!g` m gHTNEX-@ FfHTNFX`2+*G*HTNxXJf;mz6E*HxHTHUNPO JFf/.NFXB`+*G*/.NzX-@E*/.0H/N'H/aO `$HT0H/a$P`HTNxXHTNFXL8N^NuNVH0*nBF`0(m>-`JGg RSG  gRF`  gRSG`JGf*m f0L0N^NuNVH<*nHUaX<Hx Fl0H` </Nu\P(@ g$l>,-L-M`b&m<-`P gPBE  fRRESFf Eo0H` Ef `SFRSGJGn(l g$l>,JFn*m f/.NFX .Lg HSNFX`BL8N^NuNVH0*n(m mf0-@ |L>0`BGHUNX0H/HTNdPL0N^NuNVH/.B/9BHxMNO>LN^NuNVH0*y gJf|*0- HRt @ PN/-NXXHUa2XHUNXBHUN P`(m2 m2+P2HTNTXSm,Jm,nJ-&g /-.NoX/-.NTXJ-'g /-6NoX/-6NTXHUNTXL0N^NuNVH8(y fNqB`*T g lg0,H/N,X mg0-H/N,X-$f /-&NFX,*B,* T0( HRt @ PNG*HUaXHUNX mf$/-*NFX/-.NFX/-2NFXBHUN P/-:NFX/-NXX`&m>+S>HSNs`J>f(HUNTXJgRy+S> y/(HSN^PJ>fL8N^NuNVaJgaN^NuNVH0>. <.(y gp`Hx0H/N%XH/Ns$P*@Jg;|;|;G ;F 09BH/NWX+@|*Ns+@2gr;|,;|(Ns+@6gN m61|Ns+@.g, m.1| m.!| y!@T#B@`$/-6NTX/-2NTXHUNTXpL0N^NuNVH8*n(n BJf+L`&m`&SJf&L8N^NuNVH8>. <.*yzx fp`&U g6Jy'L>L8N^NuNVH<>. *y&U g kgp`L(M` 0+Gg(K&S f fp`0g*(&*`$k>'R> y/(HRN^PJ>fB@L. *n Hn0H/N%$P&@ g@0+Gf8Jk f2N(@Jg&9|)M /.HTN^PJ@gHTNXHUNFXL8N^NuNVH N*@;n +n HUNoXL N^NuNV/.HxaPN^NuNV/.HxaPN^NuNV-yBn`Rn n-Pf0.HN^NuNVH0Jn mh n> l`0. H/N*X(@Jf`HNg, Tf..,/NhX0@ y*pJ g n -T`/NhXNqBL0N^NuNVH>. Hx 0H/NsPœ @0HJLN^NuNVN^NuNVH0*yBG(m`(TRG f0L0N^NuNVH0>. *y(U fp`< lg`0 Gfl@$/,NZn`l$Jln /,NYjXB@L0N^NuNVH *yJ-*gAJ ` JL N^NuNVH *yJ-+gAB ` BL N^NuNVH *yJ-+g ` L N^NuNVH *y-*HL N^NuNVH *y-+HL N^NuNV n-Pg n0(nf n (:` .N^NuNVH0*n g(m*+L0-HЌ+@L0N^NuNVH<*n(n &m gep`*HSNz`X>f(F`HxHTHSaO 0HRHSNz`X<f)yB9y@`Hx HlHSaO 0HRHSNz`X:gHSNlX9@ 0HR l f"zHUNEX$@Jg%K0HR5@`BE0HR)J +K0H2HЁL0H/NG2X&@Jg40H///+NrO &0HГ'@HTNFX+K:` )T9G&L0.H/HSNbPL8N^NuNVJfp` n"H#P/. /.aPN^NuNVH0*n f `( ->fB`HUNEX(@Jg)U9G L0N^NuNVH0*n(n >.B.HUNz`X2H<JFl0HЍ*@`/<HnNrPSFJFnHUHnNrPBE`JA0H(HH/NlHx /NyhP` HxbNrXLN^NuNVH8>. *y&m(k0H`9@k? Sg HxNXX+L lJhg/-,NZnX-L8N^NuNVH8*yHx?NG2X(@JfB`>&lHx?HSNsPHSHH/N.NPPHUN4Xk L8N^NuNVH<*n(n gHxHUNEXH/NsP.fHUNFXB B`SJo&m+HxHUNJ>P*@ fE l$h5@5@ 5|c lh?)J jJhg,f/,,NZnX,)M pLJ,fBNWX,gz|0H/NhXa)m$)m()F, l&hN+4$@'j'J 7|/- NFX&kBB Bk7|d)KHxNX`0H/NhXHUaXLPJg HxNXX0H/NhXL0@N^NuNVH *n.. <.;FB +y F f//<ɚHm NthO /<ɝN].HUN^PJ@g HxJNrXL N^NuNVH ...B`  @gRp>o/NX*@ Ѕ @L N^NuNVH *nHx)HH/aP>Hx(HH/aP@;G2HUa XL N^NuNVH0*n>-209~H6<H:0@ |0H80@ |0H6Fo;F209~H2-0H/0H/NsP@ -o| -l|-HH/HUN>~PHx 0H/NyhP( @Jg0Hx 0H/NyhP( @ X2HЁ @(P)mL0N^NuNVH By y#NxNs*@Jf HxJNrXHx BHUaO L N^NuNVH<*n(|0- @vg @~g @g @g0`(N/9HUN^PJ@g HxKNrX`Jmf@ m $hv>B`SJfJg&Hx> m /(0, H/N.NrO /- NFX`"Hx 0, H/HUaO ` l lRl 0, H~ @Jm l mBG`(0@ |B00@ | |HpRG G m D)M;|~B ;|BmaNs*@JgP;|v/9HUN^PJ@g HxJNrXNs*@Jg;|+|HUNoXJ@gHxJ`#B`n/N/X&y mf +fLa& & @B`:Ng&+g /9HSN>PJg HxNXX/NhXRp m mf$;|"/<ɤN].HUN^PJ@fPL.`(m f`8| -f:,FoZ DfTJlgN&l gFH |~0H60@ |~600H2+HЁ2Hn Sg Jkf2S6 g Df28<JEf gNs$@Jfv`)K(K8lRF`f0@ @f0H/HUaP DgNs$@JgH5@5|HUHRNBPPJg0H2HR`5| JEf/-NFX`%m H5@ g5|`Bj5DBj+l-HUafXHUHRNBPPJg`0H/HUaP f fg Ns$@JgH5@ g5| |`5|  g5|`5|e j fHUHRNC`HUHRNBPPJg`J gJ-f0HfrNs$@Jg~HxNWX+@,J,f HRNTX`\5|H5@%y%m,HUHRNCPJf|`/-,NXXB,HxHUaPFJGfP`F0H/HUaPBL(mJGo:&L0-2H2-0HЁ/NG2X(@Jg0-0H/HTNJ>P(@Jf(KJFfBBB`@BT9m09|B9| 9l JFf+L`'LBkSGRF`~+LFL8N^NuNVH8*n>.(m` g&lBHTNFXS-(KSGJGn gJ-nBBB-`+LHUaXL8N^NuNVH<*n(n --gHUaX-HH-HH-HH⁰m4,f"Jf$m`JRg $jfJRf)J-p`2J-f$&y g/9HSN^PJ@fB-BL<N^NuNVH<*n(n &m`0+HSrb@@ |ɨ pN/+NEX>/+NFX` -fNs$@JgH5@ S@f5| %y%m,HUHRNBPPJgn/-(/-NaP/-NsXBNs$@Jg HUHRNBPNs$@Jg*5| H5@5|HUHRNCP|`|`5| 5|HUHRNCP/-,NXXB,B$B(B-` -fNs$@Jg5| H5@BjHUHRNCPB$Ns$@JgXHUHRNBP`J/+ NFX -f6Ns$@Jg*5|H5@%yHUHRNCPJf`^BkBS&kSl Jl n+K-gLJ g4HU/- N+P, m hJhf/-,NYjX- `/-,NYjX-BLJ,o$/,(/,NaP/,NsXBB,,HH/HTN>~P+l,0H/NhXL0N^NuNVH<*y(yNg>$l0*@ @g~ @gp @gpHSNFXBjBR$jf l$h+J)J,g /,,NYjXJ g/, NFXB ,0H/NhX`&j``&j `L.JGnp`Jg*m` -Y&@ yf -` -* -2-HЁ2HЁ S"(҅n m Pg:0-@g00H/aX(@Jfp` HTHUa6P< @fp` p`mB@L8N^NuNVH *n fB@`BG`m*m f0L N^NuNVH<(nJf`HxHxNT\P*@Jf`&M`$KHxHxNT\P&@%K gx7l'l'lNg. kRP0S@ @fl7ll/NhX(l fB `<&mNg./NhXHUNTX*K f(n` l(l fBL. JGnNqB`rHxHxNT\P*@JgHx0HT/NT\P+@f HUNTX`;GB yf -` -T+@ m0Bm L N^NuNVH8*n(n &MNg.`&kJf'L/NhXB@L8N^NuNVH *n`*mJfRmB@L N^NuNVH0*n>.JGn` yf -` -* -2H"Tm m Pg80-@g.0H/aX(@JfNqB`*HUHTa$P< @g ` -2H+@m L0N^NuNVH0*n>.Ng,(M` l Pfl(l f/NhXmom*m fB`0-Gf (mB`tHxHxNT\P(@Jf`)mB0-H2H9@;G)m -2HЁ)@9mmlNg, lRP/NhX L0N^NuNVH0*n>.JGfNq `lJGmBF(M`l(l fGJFn HUaXB`D(M`m*mmn0-Ff/-aXB`Jg /-aXB;F L0N^NuNVH0*n>.JGn$`j/NhX(mHUNTX fB`L*Lmm0mNg, mSP mJPf/NhX/-NT`m -2HЁ+@ L0N^NuNVH<..*n (n&nNg,HxD09H/NyhP-@ n n!M nB n!y n!K@Ry f$|`$T4/< .r5@5n5|N <Kr5@5|K 5|X g5|Ns`L-T n5P n5h n5h n5h n0NA r n1@A"n3H/NhXLHx0H/Hx`0H/0H/ ,Y`0H/0H//,`yNNq\0r h>f|G(JfRHx0.H/HxaO Hx0.H/HxxaO Hxd09~H//NyhP/NsP( yoSHx/Hx0a>O Hx/Hxa,O Hx/09~HT/aO Hx09~H/HxaO Hx09~H/HxaO 09 @g @fHx09H/HxtaO Hx09LH/Hx&aO Hx09NH/Hx a|O 09Ry @f 3dP`f 9 9Hxd 9c/NsP#Hxd 9c/NsP# 9й/ 9ййƐ/NsP6/9 9йƐ/NsP4/9 9йƐ/NsP=@Bl0`0H6nl0`0.H3P @n Hx^NrX09PH//9NyhPѹ09PH//9NyhPѹ`LN^NuNVH ..<.B0H/ X/NyhP$09 @g @g:JFfh` ng n fչ ng n fչ` ng n fչ ng n fչ` nf*|R`+Gm`f nf^*|t `8JfJg -g -m*-0-H(+G;F.<vK SJfJgJg Hx`NrXL N^NuNVH0..gR*|`. Іn 0-ng2 f0-H2.Hg(MK ,f*L f Hx^NrX,//NsPߕ nf߹ nf߹ L0N^NuNVH0..0. @g @f(|RJnB`R(|``Ng,`nJl f IJfJf /NhX`*T(*Sl /NhX XL0N^NuNVH0JgD .Y*@(Uddd"ReNg.*(Rl /NhXL0N^NuNV/<HxaP/<RHxaPN^NuNVH8*n ~ `8 Ѝ&@ +X,`0. H//a8P(@(&Rk 0+ kmSJlL8N^NuNVH ..,. :.gR*|`Jmf *+F;E`K eHxNrXL N^NuNVHx/< 9/aO N^NuNVH<$y*mgp`Ng.HRNl&X5|n&jL(K l fJl"gHRNkX5|n`(Tf yg NmNgh/NhX(K l fbJl"g\Ng.*l m U!mSl"%TL n  n /NhXA ,g0,"l$lHTaXB@`(TfpLJl$g0,"l$m n+h+l l* U!M m /NhXB@L0N^NuNVH<$y&jL(K l fbJl"g\Ng.*l m U!mSl"%TL n n /NhXA ,g0,"l$lHTaXB@`(TfpL. yLep` 0@ y"*p .gp`0-"L N^NuNVH8 || yf yf yg6(| f(Jf" ,&@###(|L`B\Ae*|.MB` Y*R m3aL8N^NuNVH 09 H/NtXXNVNMDa y#aTNU:Nq#pBHxB/<$B/<f Nh4O*@##HUNkX;|naSyHUNl&X;|pHUNkX30y@3@ y/NgXL N^NuNVH0##Hx09H/NSP(@#HxHxt09H/NyhP/NSP*@B`.(+G;|n+y y* U!M m RKt09HmL0N^NuNVH0#tt#txHx09NH/NSP#NHx09LH/NSP*@#"HxHx&09LH/NyhP/NSP(@B`Z*)G9| A)HA)HA)HA)H09Hm)yx yx( T!L l RI&09LHmL0N^NuNVH0*|{H`hJg mNJgT/-0-H/0- //-/-/Nh4O(@Jg"/,HldN]P>NqHTNjX>NqK(JfL0N^NuNV`NuNVH8|NmJyf.|Ry*y#(mLHTNW(X>, 0)@&T l T!lye)yx yx( T!L l g(K`HUNl&X;|n-mg:0-p& @(PAx(H (@Y(_A Y(` Hx_NrX+y y* U!M m SyL yLf HxNrXSyNm y/NgXL8N^NuNV yH< !N43 y P#L< ,h4R.JGlp`0Ng,Jm0H+@/NhXB@` /NhXpL N^NuNVH0 yf30ByR.2Fy2 y ey R*y`b(UNg. m U!m/-HUN^P<JFgJ g /- NFXHUNTX/NhX*L` 2m*UfL0N^NuNV##B.BFBBy 3"3$/<iHxh/<p/<NJON^NuNVH..//<pNt8P|NMLN^NuNVH8*n(n ..&M SJgg`B SJf L8N^NuNVH *n>.B`SGRJGfJfp`BL N^NuNVH *n.,.` SgSJl L N^NuNVH0*n(n ..JoSfL0N^NuNVH *n.. JoBSfL N^NuNVH 0.H//.NT\P*@Jg/.HUNsP L N^NuNVH 0. H/NG2X*@Jg0. H//-NsP L N^NuNVJg n/( NFX/.NTXN^NuNVH HxHxNT\P*@Jg B ;| L N^NuNVH HxHx0NT\P*@Jg B ;| L N^NuNVH Hx0. H/NT\P*@Jg B ;| L N^NuNVH<*n(n g g&m0-H.$l0,H,o"/HSHRNrO ƞ(l gF$l`8/HSHRNrO ǜ*m g &m0-H.Jf(l g $l0,H, g fL. <.0H29HЁ:E0H/NG2X*@Jf`0H/HUNJ>P*@ L N^NuNVH0>. <.09~H29H8DD`d0H2HЁ2Hl 0H2HЁ`0H:F0H/0H/aLP*@JfHTNFXB`E f(M` HUHTNGPBFJGn L0N^NuNVH0*n(n >.Hx0.H/NsP0.H:`XHH 0m 9n0`" Am Fn7` am fnWJEg` HH E0SGJ@fL0N^NuNVH0*n(n>.Hx0.H/NsP0.H<`4JFgHH`HH:0H E nr0`r7Ё F0SGJ@fL0N^NuNVH *n.,.*. fB`R-F-EB.GHUNEX=@BHx HnNݴO 80H/0.H/BHUNDOFL N^NuNVH *n0-/0-/0//<ʨ/<ʄNthO <ʄL N^NuNVH *n-/-/-///<ʷ/<ʖNthO <ʖL N^NuNVHx/<NsP/<N]X# y#N/<N]X#~N^NuNVH *n.. 0- @ g @ g( @ g" @gx @gr/- NFXHUNT`b 9ΰgf/9~HUN^PJ@g:/- NFXB .-;|/HUN^PJ@g`HUa`HUa*XL N^NuNVH<*n m &hHSNz`X>(-BN{4X$@JgHx0HT/NuP(@Jf.`JGgHTHUN}`8I NeB`HTHUN~*Prg* f&l`/,HSNGPHUNVX< @f L8N^NuNVH0*n(n HUNVX.rfJHTHUN~*PL0N^NuNVH0*n(n BGHTHUN}P< @fHUN}X0H`,HTHUN}P` Ff~` f~` fRG`L0N^NuNVH *ng *g ~fp`pL N^NuNVH8*n n<A&HHUN}XHSHUaBPrbz@@ | pNHSHUaP+ @> Ff G fBG|/+NFX`B|(k`:~|`4 FfHxHSHUaO (@BFBG`HxHSHUaO (@|`HUNFX n0 n 0 L8N^NuNVH *nHUNEX:BmBm+MBm L N^NuNVH0*n(n HTHUaPrfp`BHlHUaPrfp`,,>0SGJ@gHnHUa~Prfp`BL0N^NuNVH<*n(n HTHUaPPrfp`HlHUa8Prfp`,<B f0H`0 f$HlHUaPrfp`: Ef `0HR:0HT/NG2X&@Jfp`|$kHxHSNJ>P>`HHRHUaPrfHSNFXp`B f"//<HRNthO V.R0SGJ@n fSB)KBL+G G g GfJg^0- @6fT$m` j g$j4+J+j;jJmgJmg"0+ H/HU mdNP- fm 0- @6gSCHU mlNX`S@- Gg Gf60-&Hgm0-&HfHxHUNPm)kS@>+gm gm- g HU mlNXg0-THry`mRmSOm L-T<-V(mPJg- fF$l gJg jJg 0-@Pgmy``J+J+j;j Bm `.$m gJg jJg 0-@Pgm`Bm mL. &y<9*|RA0H(P0,V*0-"€fBG gHx`g BHT l`NPg( y(l 0,@(f llgHHT llNX@0H'F0,@Pf FmFBllW y(g y( , fD$k gJg jJg 0,@Pg lm`J)J)j9j Bl `.$l gJg jJg 0,@Pgl`Bl lgHHT l|NX@0H'F0,@f FmFBll y(, g HT lhNX, g80, Hrf HTNX, g0, @f HTNX l<0L g-f F- g F-g g -f`D2;F:0 @g @gHUN`HUN `HUN,XL pN^NuNVH8*n@(mH0-$H61.9..?-:g ~.A`..A0.C2.E3.;8.=-HH$pot-:g B`  @0H$/HUaP&|.8`|'NqNqNqNqNqNqFTJf|'Q |0(mLNqNqNq mH-;g"f-:g-g-`f-:g-FL8N^NuNVH0*n>.@ mTl"0-T@ |̲00F@y 3 P(mH00B|'NqNqNqNqNqNq NqNqNqNqNqNq NqNqNqNqNqNq NqNqNq4NqNqNqNqNqNq7NqNqNqF mTl6-4rf 0-T@ |̲00y 3 PL0N^NuNBNJg Ns#ENsNsNsNsNsNsNsNsNVH0@|'BG3 3PaBG`0H/aXRG G mBD*| z`609Z2Hg U NqNqNq0H̄ @"URDXE D mBD*|(|̺` UNqNqNq URDXR DmHx /<.8/<̎NO Hx/<f/<NO Hx/</<˄NO FL0N^NuNVH<*|R&y*0+mmBSBG|`v0+2Hg`A0H(PA0H$P)JHUNP;|;y ;|;| BG`0HrmRGmm09mBG(|`A0H RGI G mL0N^NuNVH0.. h @*PHxHUNP;GTp;@V ˼ @+P@  @+PD  @+PH 4 @+PL \ @+PP ˔ @(PA +HA+H;| HUNXL0N^NuNVH *n mH0 mP8L;Ns mH( mP8L;Ns m@.X mP8L;Ns mH mP8L;NsL N^NuNVH0*n+|X+|\+|`+|d+|h+|l+|p+|t+||>-T0@ |˔(pHT/<DHUNO )|<)| )|)|,L0N^NuNVN^NuNVN^NuNVN^NuNVN^NuNVN^NuNVN^NuNVN^NuNVN^NuNVN^NuNVH H:9X09dSydJ@f3d3ZfBG|`P0H29Zg80@ |h*pJg$J-gS-fm m ` HU m\NXRGFEmLL N^NuNVH *n-Bmm L N^NuNVH *n-Bmm L N^NuNVH8*n(n &nHx@HSHTNO 'M6'M'M'M&L8N^NuNVH *n.. -;g,JgHUaX-;fRHUa`HHUaXHUaP`8Jg HUaX-;fHUa^X-;f`HUaXHUaXHUa XL N^NuNVH0*n(mH-2@|'NqNqNq2FL0N^NuNVH0*n(mH-2@|'NqNqNq2FL0N^NuNVH *n0-T@ |̞00F@y 3 PL N^NuNVH *n0-T@ |̞00y 3 PL N^NuNVH *n-;g -gB`P-:g--;g-;g HUa*X`-;gHUaX--f`-pL N^NuNVH0*n-;g-`--g-;g -g`x(mL m@f(mH-0-:g`-:g` -:g@|'s-F-;gHUaLXp` -fBL0N^NuNVH0*n(mH-2@|'NqNqNq2FL0N^NuNVH0*n(mH-2@|'NqNqNq2FL0N^NuNV n"n .J@gQN^NuNV n . J@gBQN^Nu"m20) m3@B-Rmm@0-Vy`Jif""i+I+i;i Jif*mNummBm m nNumB-Bm-g f mD-NuNu-g mH-22NuNug Nu@|' -f m+HSm--G5p@``6``` ``-gk @` D@-R@-g:A@`RfP-- gm Nsf@-R@@A0-fG5p@ |͊ppm -/f0HZrA`B---.--.------J-)g--)--)B---| --|?--|--|--L N^NuNVH *n-JgBJ-g f~ `> f~ `4 f.~ `* f~` f~ ` f~ ` J-g~`BHH/Hx HUaO L N^NuNVH *n-&f-gZ-HH/HUaP-HH/HUaP- HH/HUaP-+HH/HUaP-,HH/HUa`X-HH/HUaP-HH/HUaP- HH/HUaP-+HH/HUaP-,HH/HUaPL N^NuNVH *n-g0Hx--HH/HUaO Hx-.HH/HUaO -g- 8-gLHx-/HUaO Hx-/HUaO Hx-.HH/HUaO L N^NuNVH *n-g,B--HH/HUaZO B-.HH/HUaDO -g-8-gN-fFB-/HUaO B-/HUaO B-.HH/HUaO L N^NuNVH *n-gFHx-/HUaO Hx-/HUaO Hx0HxHUa8O L N^NuNVH *n-gH-f0B-/HUaBO B-/HUa*O BHxHUaO L N^NuNVH *n>.-*H @b<@@ |d pNGA0HG G?A0HG@GA0HGA0HNqL N^NuNVH *n>.-*H @b<@@ |t pNGA0HG G?A0HG@GA0HGA0HNqL N^NuNVH *n>..-*H @bT@@ |Є pNGA0HA0HG G?A0HA0HG@GA0HA0HGA0HA0HNqL N^NuNVH *n>..-*H @bT@@ |Д pNGA0HA0HG G?A0HA0HG@GA0HA0HGA0HA0HNqL N^NuNVH *n..Sr b @@ |Ф pNB-HH/HUaO FHx /HUaO `FHUaX f m&`B-`FHUaX;@`HUalX@|'J-g|FFHUaX`ZF`RFHUa`HUaX@|'B--g-fm -FFHUa X| m *mP8L#Ns xf^ m :|*mP8L#Ns m@ f m d*mP8L#Ns m@ft0<` f4 m |*mP8L#Ns m@f:0<`d fV m |*mP8L#Ns m@ f m *mP8L#Ns m@f0<`  g f0<` g g*mP8L#Ns m \|*mP8L#Ns m@ fx m *mP8L#Ns m@fV0<` m@f\ m |*mP8L#Ns m@f mH 0< X m |<*mP8L#Ns f8 m  |*mP8L#Ns m@ f0<~` f0 m ^|*mP8L#Ns m@f~0<`_ Cf0<>` f0 m |*mP8L#Ns m@f40<`^ g f0<S`J f 0<)`6 m@g f4 m |*mP8L#Ns m@f0<r`o f0<` rf, m ^|*mP8L#Ns m@0<t` f0 m |*mP8L#Ns m@fL0<`v fZ m |*mP8L#Ns m@ f m *mP8L#Ns m@f0< ` 2f m 2|*mP8L#Ns m@0<` m@ m- f n` *mP8L#Ns m@BG5pg@k @`0D@`"-R@-gA@` -f0f( mD-g@k @`2D@`$-R@-gJA@` -f0f( mD-g@k @`2D@`$-R@-gA@`$ -f0f( mD-$g@k @`2D@`$-R@-gA@` -f0f( mD-#g@k @`2D@`$-R@-g*A@`d-gZ*mP8L#Ns-g4gJ-fg-fm *mP8L#Ns-gm0-Vy`*mP8L#Ns-gg B-J-fg-fm *mP8L#Ns -ff mD`$-R@-gA@-R@-gA@`( -f0f( mD-g@k @`2D@`$-R@-gA@-R@-gjA@` -f2f* mD-gBk @`4D@`&-R@-gA@`> -ff mD`$-R@-gA@@N````"`` `` `` F@` m `*mP8L#Ns m@BG m  &f8 `0 m@BG m  pf` m@BG5pfH UBF0p-g: -ff mD`"-R@-g0A@- m+HSmmf Jmgm*mP8L#Ns<<` -)fF"m20) m3@B-Rmm@0-Vy`Jif."i+I+i;i JifBm*mP8L#NsmmBm m n*mP8L#NsmB-Bm-g8f mD-*mP8L#Ns*mP8L#Ns-g& mH-22*mP8L#Ns*mP8L#Ns-f m@ mH0 mP8L!Ns-f m+HSm--G5p@``6``` ``-gk @` D@-R@-gA@`ffp mH(-- gm *mP8L!NsfL-R@@A0-fG5p@J-fm mH-g-22(*mP8L!NsfNg$-f mD.*mP8L!Ns mD*mP8L!Ns mD-*mP8L!NsH*|NnH*|NH*|NH*|NNVH0(mL mHJf(mHgJ-g:-gg"-f -"g mD` mD.-`X-`P-gH-2-;g`F2 m - g m m B--g-gVf-f--g| -`B-||B-m# m Ѡ`-%--fz-gs-0-`\m `T-gL-f>0 m B--g B- mRSmm m -! mP8L;NsL0N^NuNVH0(mL mHJf(mH-g.g"-f -"g mD` mD.-g-gVf-f --g| -`B-||B-m# m Ѡ`-%--f-g0s-0-;g-2F2-`vm `n-gf-;g-2F2-f>0 m B--g B- mRSmm m -! mP8L;NsL0N^NuNVH8*n+|͎X+|͖\+| p+|Ўt+|.|+|`+|$d+|h+|φl8-T0@ |˔&pHS/<DHUNO '|<'|Ѡ '|-;g '|,`'|ɜ,-*HH.0-$͎ @P ͊ @P ͆ @-0-/H |x0-1 ͒ @-2-H:E0H: |͂0P-2BEA(H`RE Em -"g\-"H:0-$rf0H` 0H @(P:` El A0H`JEf|0-$f -/g|B -!f-H:E0H:JEf-H:E0H:JEfJEf Ef Ef Ef-H:E0H:JEf@FFL8N^NuNVN^NuNVH0*n(mH@F'J-g.S-f(- fsm -"0m m J-g4S-f.- fm --22m m FL0N^NuNVH0*n.. @H,F'-:B-FF'-g ;| `B-F-f(HUNFXJf- f ;| :<E`;| m -g,-| -g-f|`6|`.B--H:E00H:0@ |p00HS@B-A+HA+HB--g|-g|B-|-2-2(mHF'm$-2 mD.FL0N^NuNVH0*n(mH-2@F'-G2F-;g-;g$HUN~X`-;g HUNtX-HUNXB-B-B-B-L0N^NuNVH8*nHUNhX||B-B- m@ mLf m Ѡ(m<&l+K+k;k HUNXJg;| L8N^NuNVH0*nm @F'(m f`t>, m9G>- m G8 lf(FHU m|NX fTmmB`(l+L+l;l Rmm@0-Vy`FL0N^NuNVH0*n--;g HUN~X(mH@F's m 0FHUNhX||B-B-L0N^NuNVH8 m@-&mHA:-H@0rb@@ |( pN| -gR`-@-g mL0Jgm s-0-g-G`|-0`m (m:, mJEfs-0-gB-G`:`h-g|@-g`Z`J|0`L| `B-g |@`0`-g``-f`-f&`|P`@`|@`4``-gb--Jgm  mL0Jgm -"g-g|pm -f`-gL`J-g"S-f-g|p-g `ZS-f mL`Jgm s-0-g-G`S-f-g| `B-||B--m#-gp`n mL`Jgm `m p` -"g-f|`S-f& mL`Jg@`6m <`-0`"-0 `-B-`-B-m `V-B-m `|`- -0 - mRSm- fJmfm Rmm@0-THry`(m:, m9E:- m E8 lf<mmB-m 0f8s-0`(l+L+l;l  mP8L;NsL8N^NuNVH8 mD. mHS-f m | mP8L;NsA&H+K+K mRR-m m X-.-g -@f -f-- mD&mH-2F2S-- gB- g*Jmfm `, m"mRRR-Sm`J-f m J-f| mP8L;Ns&mHJ-g mRS-` mRSmA:-H@0 @_b@@ |( pN| -g mD-2F2-`m m X`-@`Jmgz|``-gh|@-f`z`JmgH|0`| `x-g |@`f`-g``-fv`-f`Jmg-gP&@+K /*HUN^PJ@g NqHUNsXL.<./.axX(@Jf`dA*H*U gT0-FfD0-Gf . f . gJmfJg - f` *UJfJmf `0-Fd fBL0N^NuNVH . *|.Z` f -f `K.cBL N^NuNVH0*n>-RmJmf;|(m` 0,Gg(T f f0L0N^NuNVH ../arX*@Jg`GBm;|B `*|.Z`JgK.cBL N^NuNVH0*n.. ,.*.v0-H(l4(mǘmg І @BR(0Ho//HTN`*m fNq `.//HTNݴO *g*m f`0-H((m`L0N^NuNVH../afX, fp`N rfp`@Jg6/9aX"†f" 쾀fp` rfp`BLN^NuNVH..gg <` <` <LN^NuNVH..Jg `/a XLN^NuNVH../aX"€ LN^NuNVH../9aX-@/aX,fJg ` LN^NuNVH ..//9/<a8O ,Jm *@;| R ` /9/a`PL N^NuNVH *n..B*. BS lR D`&(؆ Ѝ @&f `c*`R,`L N^NuNVH8..,. doB`~Jf,*|B` dRKm 9( 9R(@ 9&@`SS SJf*+FR;| +| L8N^NuNVH0*|B`2Sm f&A(HS 9/HTHUNrO KR 9SmL0N^NuNVN^NuNVH *n0- @g @g& @g @gHUNsX`HUaF`HUaF`HUa`L N^NuNVH *n g/NtXHUNXL N^NuNVH<*nBB(m f HUNs`&l>+,-:(-6+g.Bk//HxHTNwO7@ Cf Jkfkf/-NFX$@JgJg6-jB/.NoX n/( NFXHUNTX*ntHxHTNJ>P+@ ;|;G;E+D +F/*HUN^PJ@f&JBgHRaXL-HUNX(@Jf/-*/- /-0-H/0-H/NO(@ f|0H/HUaP`$Hx/- NH&P&@ g+K -k T"n2 T"n3hHSNEX n1@ nBh T/(/( HxHSNwO n1@ GgN)MNs$@Jg/- NEX&@JfHRNTX|`D%K ;|+m$HUNoX`$M Gf <` <5@%T T/(HRN^P:g HRNsX GfJEg /NtXHTNXL.HUNX(@ mg,,-*;|;G/HUN^PJ@g HUNsXBHTaXL0N^NuNVH0>. <.*.(.&.Nz*@JfB`H0H/0H/HxNO (@Jf`/<N]X)@)E )D*+CB L0N^NuNVH0*n(|;` ,f `I <eBL0N^NuNVH0*n(|;` f `I <eBL0N^NuNVH *|;` Jf `K <eBL N^NuNVH0*n(m0,L0N^NuNVH0*n(m gHTNoXHTNsXBBL0N^NuNVH0*n y!@T#</9 NWX+@nfHUNTXNf/9NWX+@rfHUNTXNf0- /0-//-/-HxNO(@Jg6Jlg0HxHxHUNO /-NFXHUNTXNf0- /0-/HxNO (@)m)m )mr;l +lz+L 09~H6309H//9NyhP3 mf|` ;|;|`HUN2` mgHUNXHUNXL0N^NuNVH y*hT#< . rf /.a`6 . nf /.a`" y . f/.aB` /.NsXHn HnN\zPJ@ggNHgNL N^NuNVH8*n>-(y< Gg G f&lTB~;| gHS/- NGPBHUNXJf, G fHxHxHTNO T0,jlld9lhjf`J @gHUNs`,g*T,fTf/,nNZnXT`TT `0 @g @f lg"T/, /,$HTNO HTNXHxHxNuP&@Jg0S B0,j/Hx ,$S/HSHTNZOR ,L+@HUNo` THTNXL8N^NuNVH<*n>-(y< Gf&m HSNEX<HSNEX$@ fHUNsXHTNXJg&HS/,NGPg./,nNZnXT`,gT/,TNoX)K0HѬ, ,,$*x-g)l(8TD 6`BC-g)l,4T D0,`ef lf/,nNZnXTHUNX ,,(2Hf$JfB`pJ@flfb0,`cHRNFXT `HxHRNH&P$@0H/0,j/0H//,(HRHTNZOJDf)l(D)yF@0HѬ(0@f4HTN8X`(HUNsX0 @g @ f0H/HTNPLXHxHxHUaO /-nNZnX`R ;|HxHx`L N^NuNVH<*n/-NFX(m f`&L(SHSNFX f0@g /-TNoX/-TNX-g /-XNoX/-XNX-g /-\NoX/-\NXg/-v/-~NaP/-~NsXJg/-NFXBN$@5|%m /-zHRN^PJ@gHRNTX` $m+R`-S-JfHUNTXNfL<N^NuNVH0*nN(@Jg$+L\9|)|U@HTNoXB`pL0N^NuNVH0*ng (m~9| ``N(@JgT9nl9n/-vHTN^P>fg*U/-nNYjX`HTNX mf;| L0N^NuNVH8*n(n HTHUNPJgHTNFX`&l+ ,+HTaX*gR mf`ngHTHUaPJfl  l - c`F0-jЭ "oJmjNqHTNFXf.U `(JmjfJg pff Ѕ//HTHUa OL8N^NuNVH<*n(n ..,.A-H`$k *l-K n&P f( n -R- mU mf`Z gH$k**HSaX( Єn.-K&S(/.NFX-S- lNqU`  oU `ULP&@g0,cBgBU gHSHRNGP`$Kݭ mj0-jmld f;mhjU ` HSNFXgHUN` n!J n1B/.N` m~hJgx0-t@ y"-p n0($H/09(H/NyhP m2(Hm"HRNEXH, mjHRNF` mRhHR/-NGP`+J m1|LP+@Jfg/-nNYjXUJDg^ DoV 9F@(Hx/-9UBDRP mg~0H"-PmHxHUNPHUaRX -,(g,Jm`f&-f0U -L mX!@/-XNo`0@f HUN8XL N^NuNVH0*n0-`, mf-g<U*-$+E0 -,.0-fc 0-f.l ` .`D*-( -,.Jm`g -($JlBl ` .JDfJg +ED+yF@(BB0-f,l,& mg, ml fSB` moJf -gB-g -4o І"-4nB mgB-g 8l -8-@B `B-|gXJg0/ $/Hx/./-NO(@(gR$`Hx/.NuP(@ gB/.0-j/0H//HTHUNZO؆ -(l ,n+D(JfL0N^NuNVH *n -($,0-`.0-fd\ -,(,lN-g -4(, -4(ol.-g -8(, -8(ol0-beU L N^NuNVH *n/- /-$HUaO 0.H/HUaPL N^NuNVH0*n+yF$+m$(+m$, -$S+@0+|fB`F Gf/,vHUN[fP)M~T@p`&HUNsX/, /,$HTaO HTNXL0N^NuNVHHx0Nt(X*@;|;G y+h/<,N].HUN^PRmHxNX*@JgJ(y. g@#.B|BlBl y)hA&H`&J$S f& y!@TL GfB`fHUa`HUNsXpL0N^NuNVH<*n m (h0,H/0H/HxNO -@f HUNs` n!m n!m HxHxNuP$@JfHUNsX`&j67T, g| 'lB`| B ,R'@|P BkBkBk/-/-HxHRNwO7@;|+n/- NFX+J /9.HUN^PJ@gHUNsX/.NtXL<N^NuNVH ..BF*|D` f0H`2RFX F@mBF*|D` f 0H` RFX FmpL N^NuNVH<*n y!@T#<0@ @g @g`"HUN+ XJg"/-NTX m/(NFXN-(m9| 9| 9m9|/- HTN^PJ@g HTNTXN-nZ @g @g @gHUNsX`HUNX`THUa`;| /,HUN^P<JFf4NJfa\gT`FHxo/,FN.PBN`. Ff;|/,HUN[fP`THUNsXa`;| /,HUN^P<JFf4NJfagT`Hx/, N.PB(` Ff;|/,`|THUNsXB(`0-H/aX`HUN-X`T`^ @g @ g @ g`FfL0-Hr b0@@ | pN/- N- Gf~0H/Nf\XJfHx NnXT`0HH/Nn` l/(NFX/,NTXa,L8N^NuNVH0*y<0-H//<HnNthO /<HxHxHn/-/<Nh4O(@ gHTNjXp`BL0N^NuNVH0*n(y< g2Jmg")M,+m;mJgT`T` HUNFXL0N^NuNVH0*n(y< g2Jmg")MR+m;mJgT`T` HUNFXL0N^NuNVH0*y<(m, lRSlfDg00,H/HTNJ>P(@+L,9l)lJfU`HTNFXB,L0N^NuNVH0*y<(mR lRSlfFg00,H/HTNJ>P(@+LR9l)lJfU`/-RNFXBRL0N^NuNVH8. *y<(m809< H@g&m<+A0HRF7F`( lRRl 0, lfaJGgD Gf$Hx`/- N.P+L(/-HTN[fP`*HSNFXHTN+XNa Jfy@< L8N^NuNVH8*y<&m^Jk fJg-fN+(@Jf y< `9| 9| )K 9m9|Jk g S1k `09~H/HSNIPB^/-HTN^P>JGgD Gf$Hx/-FN.P+LN/-HTN[fP`*HSNFXHTN+XNaJfy< L8N^NuNVH8*y<&m8 g,>9~0H/NG2X(@JfB`THTHSNGP`409~H6>Hx(0H/NuP(@Jf`+L8&LBk 7GBk 'l& L8N^NuNVH8*y<&m^>9~0H/NG2X(@JfB`. gHTHSNGP` +L^&LBk 7GBk 'l& L8N^NuNVH<*n0-@ y"$p0*@ y&p(kT +@n(T g 0,mf +@jL<N^NuNVH0*n(y< ln,(/HUN^P>g Gf/HUN[fP` HUNsXBvL0N^NuNVH0*y<(mv mn/(HTNaPHTNsXL0N^NuNVH8>. *y<(mr f HUadX(@ Gf.,|yCyEyGyI`",B,yMyOyQ&mj(mn f,sg0H/0,H/a PL8N^NuNVH8>. <.&y< kn((Jvg//+vNaP*kvBv(m `4Hx0Nt(X*@ g~;|;GHx NG2X(@ f`V+L Ff Hx /<@` Hx/<J/,NrO /HUN^P:g" Ef'Mv/HUN[fP` HUNsXL8N^NuNVH<*n&mn$mj(kJ g(T g 0,jf +@r L<N^NuNVH *y<J,g4N f HxNnX/NnXJy< gNNJy< gN.rL N^NuNVH0*y<JRgN-D gPnJgrgZ gr`N.r` fGD`f/NX-Eff  f^|D`TB-DJgJ  gB fGD`f/NX  f`B-Dr b@@ |T pNf/NX`/<ތNR`N+(@Jg9| 9|9m/- HTN^PJ@gUHTN+XN`rHxNnXHxNnXN`PU`H`````4B-DJg&rgPrgz/HxNP`-Ef/HxNP`-E-E`-Ef/HxNP`-E-E`-Ef/HxNP`-E-E`nB-DJgrgBrgt`N-Ef -Eg/HxNP`-E-E`-Ef -Eg/HxNP`-E-E`-Ef -Eg/HxNP`-E-E`B-DJgrgHrgr/Hx`p-f/HxNP`--`H-f/HxNP`--`-f/HxNP`--`B-DJgrgBrgr`-f -g/HxNP`--`-f -g/HxNP`--`X-f -g/HxNP`--`" gv g* gB-DJy< gNNJy< fDL0N^NuNVH *y<J,g&N-JgHrgJy< g -fHx NnXB-NNJy< gN.r` f/NnX/NnX-f  f|`  g Hx NnX/NnX f/NnX  g>B-`6L N^NuNVH *y<JRg$N-D gnJg g`N.r` fGD`0@Df/NX`B-Dr b@@ |ޠ pN0@Df|`HxNnXHxNnXN`XU`P`v`r`n`j`H/NWX+@Ffp`h m!mFvHx0Nt(X(@ fp`H+L9| NJfHTNTXp`&NJf/-^NFXHTNTXp`BL0N^NuNVH0*n(y< lm HUNTX` *)MRlL0N^NuNVH0*y<Jmg(m+TSm9| B `Hx0Nt(X(@ fBL0N^NuNVH *y<HxHxNPHxHxNPHxHxNP-@-@E-ENL N^NuNVH *y< m h g m h fjBNnX`XHxHxNPHxHxNPHxHxNPBHxNPBHxNP-p-PENL N^NuNV/9<NTXNfN^NuNVH0*n(y<>-<-Tg8NJgBE`A0REHHH/NXFmBmGg6NJglBE`A0REHHH/NnXFmBmGgN09< Hf$GgN09< H fGJGg 3< a6`,,fHx/,FaP,fHx /, aPL0N^NuNVH0*y<(m)|9y< HTNoXU-f Hx/-FaP-f Hx /- a PL0N^NuNVH ..<.*y</NZnXUL N^NuNVH ..<.*y</NYjXUL N^NuNVH8*y<&m,a(@JfN9|9| )K 9|B,/-HTN^P>JGgP Gf2Hx`/- aLP+L(/-8NFXB8/-HTN[fP`HSNFXHTaXNL8N^NuNVH8*y<&mRa(@JfN9| 9| )K 9m9|BR/-HTN^P>JGgP Gf2Hx/-FaP+LN/-^NFXB^/-HTN[fP`HSNFXHTaXXNL8N^NuNVH8B(|A`.-@ S nRp@m3?<Hx/9atPHx/9aP/9aX*@+yL;yJJg 9"9䒀,` /9NZX"9€ 9䐁,Hx/a

$*@- 8J- fNJFg B- B- `@- R- m| - R- f /aX`//9HxaO :fRG Gm@a T!y</NoXL0N^NuNVH n.( n=h /avX*@ fX n,(//0.H/anO .< g.J< g/9< NsX#< n!yFB`(p`$/9A0.H//<@Hm/.aOL N^NuNVH8Ns*@JgHxHxNuP+@ f HUNT`/.aX&@ m (h89n ||9|)yB 9y@)n )n g*J+ f$/9AHx/<@HkHUadOJg0`$/9AHx/<@/<JHUa>OJg HUNsXL8N^NuNVH.. <$`PHx0H/NyhP>$`LHx0H/NyhP>$ @g(Hx0H/NyhP>. @<JFfJFfBLN^NuNVH .><9<Hx0H/NyhP>. @3<JFgTRy<Hx0H/NyhP>$*@HxHUNsP0@ |<$p 0@ |<$* `a `vL N^NuNVHBF>BE`0@ |<$08gHx0H/NyhP>/ @JfDHx0H/NyhP>0 @HGm"<Hx0H/NyhP>0 @H>Hx0H/NyhP>. @8fxRE EmTJFo"Hx0H/NyhP>$ @/aXLN^NuNVH<*n(n &n-|A$m HRNEXHg HRNHX;|+l;T+k ;S;n$+nHU n h NXL<N^NuNVH..Jg*/aPXJf0.H//aP//HxaHO LN^NuNVH ../aX*@*+yB;y@Jng| L N^NuNVH0*|< .g .>0@ |<$0<0H<$(@`Hx0H/NyhP>$ @ fPHx0H/NyhP>. @Hx0H/NyhP>.-@ @<3<RmSm `*Hx0H/NyhP>.(@<JFffL0N^NuNV .<% @N^NuNVH>9<`aSGJGnLN^NuNVHHxNaXBG`0@ |<$0<gHx0H/NyhP>, @0/Hx0H/NyhP>* @0/Hx0H/NyhP>( @0/Hx0H/NyhP>$/Nw./<&NONbHx0H/NyhP>. @<f6RG GmNaLN^NuNVJ< g> y< 9F o/9< NsX`/9< aXJfB< N^NuNV 9D fp`BN^NuNVH BnHx/<O/<JNl6O HxHxNSP*@Hx09~H/NyhP-@Hx09zH/NyhP-@Hx09|H/NyhP-@HxHx09xH/NyhPЮЮ$Ю/NSP+@z-mz .+@n -nP+@r -r+@v -v$+@~Hx09xH/NyhPЭ~+@Hx09zH/NyhPЭ+@Hx09|H/NyhPЭ+@HxHx NSP-@-|ߧ/.NEdX+@ .R @ .R"@f nBPHx NErfp`2 n1| n1| 3pHxNEXBLN^NuNVB-yA yA-hr yA-hn=|B9 n/(nNEdX#/.ND~X n1@ n/(zNEdX n!@ nBh n hn 0.SnJ@f =|0.SnJ@f 3p n hnJg .R m mp`BN^NuNVH B y*hrJmg .R m m y1| yJhgp`BL N^NuNVH *y n0( @fR mr=P0.gJNC>Jf@0. mr1@0.g;|l 3p#ANRNMlNT~ y/(/-N^P>g 9PHxiNr` /.NsXL N^NuNVHJf0<`Z yA .z>02J@f/<>Nt8X02LN^NuNV n gJn fB`.0. 2.  yA"(zҀ N^NuNV0. 2. N^NuNVH0. 2. > .r<02<02t塀LN^NuNVH0*n(y;l;l;l* ;lNL0N^NuNVH8*yAJmlfFNC>rfp`t mr0g mr1| 3p;|lJn fJmlg0(U0 gJf` m &h`(l l0 f f`0,/NDX&@Jf;|p`&k0ff;|p`g +f`z(l&kJn f mr0p g`PNC>rfp`BHSND~X9@BTBml mr1|HTND~X mr1@ 3pBL8N^NuNVH *yAJf R,p` - f nB/.NFXp`-m m+h n!n nBh nBP n/(NEdX n!@ nJf/<Nt8X09~29~ n1@JgT m (g -HxoNrX/.ND~X m1@=|0.SnJ@f mh+nBL N^NuNVH *yA m .g - HxoNrX -fB nBP n1| nB +n L N^NuNVH&yABG(k` (lBT9| ,fg9| kBh'L`RG09~H/NG2.a XJgLN^NuNVH>. Jy߆fp`VzBF`FHx 0H/NyhPA @Pf0`.Hx 0H/NyhPA @ Pf:RFy߆m0LN^NuNVH 0.H/axX> @f09߆Ry߆> @m Sy߆p`4Hx 0H/NyhPA*@* ;n+n#BL N^NuNVH<*n-yA n h (g n (HxoNrX0-/NDX(@;|BU;| n hBh n!M g: n&h0>$l HTaXHRajXf`(lJGgL. *n-|X$m &J`. yAf HxbNrXHUaJX*m'm &k0gHUa$XBHx0Nt(X(@JfHRNFXp`l9|Hx 0H/NyhPA @)P . P @)h9P .  @)h 9P n 0(9@$)J Hx 0H/NyhPA @/HTN^P=@gHRNFXHTNTXp` nRhlHRNEXH nѨnBL @fp`h;|;|Hx 0H/NyhPA @+PHx 0H/NyhPA @/HUN^P>gJnf HTNFXB`` mf mf mf0H/NIX> @gzHTNEX-@gj;|;|Hx 0H/NyhPA @+PHx 0H/NyhPA @/HUN^P>f Bn(n` /.NFX-k< n (4fRT`HTa2X$@JfRX` nRhl/- NEXH nѨnA .P"@#h2 n1FHRND~X n1@ n!J n1| n1| nBP n'hJfd kr1|/.ND~X kr1@ 3pByBy`(/.ND~X k81@ k8h'n8a>HTNEXJng HUNTX`pL0fA0HR`LByBy&mB0gRH0f0 gRL0gR\0 gR`0 gRP0gRd0gRhRF09߂H//+ NEXH/NsP: EmzAh0HR lDg ,DHxqNrX/+ NFX`&k kf)KD8f B8B4`)m4*l4`L8N^NuNVH *yA yA-hr n0g Jmg yxn y<omJmg&RNBFrf HxmNrX-m4f `0 n-h n h/( NFX .8fB4B8 mD+h@ m -h-mJgT nJ f HxoNrX n h B n/( NFX/.NHX .g n-h`-U-m` n-h n1|/.NJX .f*NI8BmN@6Jg HxgNrXL N^NuNVH -yA n*h4 fn` n hr0fr n hr1|HUND~X n hr1@ 3pByBy`0 n8f`$*m0@fJUfNC>JgxL N^NuNVH // /*|By ;y -g3A-g yRj-g yR-g yRnBy 0-H_@3 - _*_ NsL N^NuNV 9C fp`BN^NuNVH Hx/<a/<]Nl6O /<N]X# fBHxHxNSP*@##A+y+y;y~A~#B3@aHxHxNSP/anXHxHxNSP/aXN\d0-yrg Hx(NrXHxHxNSP/a^Xa Jg Hx)NrXHxNt(X+@f Hx(NrX m1|#\, y/(/-N^PH.g Hx(NrXL N^NuNVH8BG&yAHxHx NSP*@'M4'M0`HxHx NSP*@)MBU(MRGypf7GF+k0L8N^NuNVH0*n(yA P*@)M8)M@BG`PRG Gf9GD)Mg~Hx+Nr`p 9F,JzgzoNf+yF` 9F,JzgzoNf+yF`v/.NsXL N^NuNVH0*n(y;l;l;l$ ,PЬL;@L0N^NuNVH8(yA&l`:09~H/NG2X*@Jg.HUa6X0,RlJ@g'M`)M B&M0,yrm)KL8N^NuNVH8*n(yA&TP c(B*;y~6 -r7@0-F@HR7@BkkL8N^NuNVH>. GnJGmJfp`fp`bJy~fp`VzBF`FHx 0H/NyhPA @Pf0`.Hx 0H/NyhPA @ Pf:RFy~m0LN^NuNVH 0.H/a^X> @f09~Ry~> @m Sy~p`4Hx 0H/NyhPA*@* ;n+n#BL N^NuNVH8*n&yA(M`(lHTatXJfJ g k!M`'M 'LL8N^NuNVH<>. *n $|X-yA(MHx0Nt(X&@Jfp`k7|Hx ,/HkNrO HxHTNJ>P'@ (k HTNEX: Gf'y-y`,.&M$K` $K&ky~JfJGnjBHSaFXp`7GB@L(g*| gR gR gR& gR*m f L0N^NuNVH<*yABD&m f`y3@0`| S>( gf(K`LJf.B y3@RDHSa6XJgDHSaZX`g +l B`RF(l T>(gy3@`vR*HSarXJ@gSF m.oR"` +$@0* H/aX6 @gHS0H/aPJfnmJFga`L @fp`J;|;| Gf+y-y`fB` mf mf mf0-$H/N]0X> @gHTNEX$@Jg;|;| Gf+y-y`fBE(J`HRNFXNq$L-k4 nJPgR^JEfHRNFX`|`RF(lJfkDoRZ`(JHxHTNH&P$@ nRhl/- NEXH nѨn *-@A"n#h2A .\"@#h2 n1m$ 0*ytl5ytHRazX n!J n0 n'h4SkF jhJEg HUNTX`0pL9 G3 >9 y3@R*j0`/-NFXBURjF%m0*m Ug&j`BkPc(j8`BlP0-Sf60-Tf.$K>BF`0GRF F mJGf kx fNr`NrLF@OV@_z@      @@       @' 19@G@Ls@x@@@@    @$ -6>GR`W`@fl@qv @@  @@`@ @#@.;@GT@]h@s@ `@@ @&@+3<@>BD@K@Zi`v@@ @@@@@ꀐ@@ @ 0@!%,27<AKS@W[v*&  TVT !&1,C0OT Yx1 et3 m5(sԠV !~X6Vx1 !t3 !8?>2N$XR $V?   Vx1"*t3"2[8[ HVV^_mwaԠ$ x1#t3#X  or!bv%w#y!(T !/@9E&OYԠ_"` jԠ_#vT !pX T0 !x1%t3%T`0$Ԡ0$$ PԠ_%pp ()*+,-./23456789:;<=>?"'$%& !   #01 DisabledDisabled (1-16000 minutes)NoGroupAllGroups12345678910111213141516Low_AutoBaudAutoBaud5075110134.5150200300600120018002400360048007200960019.2K38.4K56K64KIGnoreOutofBandFlushVCInBandEscDTMNone (1-127 sixtieths of a second)None (1-127 nulls of padding) (1-512 bytes)ASCIIEBCDIC5678NormalDiscardyy/mm/dd hh:mm[:ss]NoneAlphaNumCRESCEDitingTermFormEfCOntrolPunctOffLexDebugShwDebugTMdebugTraceBDsTraceCallsHostTerminalPaperGlassFullHalfRecvOnlyXmitOnlyOFFONNoneOutputCrlfEchoCrlfNoneCTS_RTSXon_XoffEnq_AckDisabled (1-255 sixtieths of a sec)VerboseBriefEchoNoEchoMacroEchoNoMacroEchoMacroBreakNoMacroBreakBroadcastONBroadcastOFFLFInsertNoLFInsertCompletionNoCompletionASynchronousBYTEsynchronousBITsynchronousNoDataEditingDataEditingNoCmdEditingCmdEditing (1-8 sessions)TransparentScrollNoneOddEven10AutoParityUserLocalNMGlobalNM11.52IgnoreAsDTR (by DTE)AsDCD (by DCE)AlwaysAssertOnConnectionNoToggleToggleonDiscIGnoreListenOutofBandInBandNoneSendLongBreak"""

"OFFONNoneLRCCRC16CCITT16PassStripIncludeexclude481216UTSVIPMODE4CBASIC32703780HASPFree-FormSpecialDCEDTEAUditServerAddressAUToDisconnectAUtoLogoffBAudBinaryDataBlockCheckBootServerAddressBReakActionBReakCharBSCProtocolBSDelayBSPadBUffersizeCarrierSenseCharCodeCONNectAuditCRDelayCRPadDataBitsDataForwardDATEDefaultGatewayDeViceDIsconnectActionDLEDUplexECHODataECHOMaskECMCharEOMERAseERRorAuditFFDelayFFPadFlowControlFromFlowControlToFlushVCGlobalPassWordIdleTimerInitMacroInterActionINTerfaceTypeInternetPortLFDelayLFPadLFInsertionLineERAseLinePRotocolLocalEDitingLocalPassWordLogoffStrLongBReakActionMaxSessionsMOdeNMPromptPARItyPassCheckPermanentVCPrimaryNSPRIvilegePROmptRECvTimerReprintLineRESpTimerSOHSecondaryNSStopBitsSYNSyncCharCountTabDelayTabPadUseDCDoutUseDSRoutUseDTRinVERBatimWelcomeStringWordERAseXmitTimerXOFFXON ::= ... ::= [0-255] NNVNVNNVN2NVNVN<QQSQT<TLTTfT<Network Manager%03d::%d::ConnectCOnnECMConnecting...REMOTEREMOTENameNameUNNameUNDefineUNSave UNSave Internet Name `%s' ==> Name Server Error Message: X.XX4X.X&X XXXXWX:WXXXXXX[\[8[d[dZ[d[d[d[d[d[R[\[D[d[d[,]]]]]]ReaDPortid !%d defaultSession %d%s parameters %s configuration `%s' %s parameters %s configuration file %dsaved asReaD (
) DefaultParameters ReaD %s loaded fromSAve (
) DefaultParameters SAve %s SAve PARAmeters SAve PX^js!1=\{&/GTew(9N\s 3Wx0G^q &4;Lck)@cp3ZOK Err %d DISKIO INIT DISCONNECT CONNECT NAME SERVER REMOTE SRPARMREPLY PAUSED DEFineRemote: Macro: Password: (!%d) %sNo access allowedAutoDisconnect timer expiredTimeout failureNo responseNo more sessions for this portRemote received bad parametersUnknown errorsRemote received bad addressRemote is busyRemote is disabled or nonexistentRemote software incompatibleNo memory resourceIllegal request -- wrong stateNo Errormember already a membername invalidpassword invalidmapping not emptymember is not requestorname in usealias in usenew name in usealias not foundCan't display - NS Table too fullname not foundorganization not foundproperty name not foundmember not foundproperty name in usevalue invalidgroup property invalidname table is fullis out of memorydisk file is fullreports disk I/O errorreceives no response from the serverIllegal DISKIO commandDISKIO seek errorDISKIO read errorDISKIO write errorDrive door open or diskette missingCan't - diskette write protectedFile not found or in useCan't save -- directory fullDirectory emptyunusedInvalid syntaxParameter unknownThis command not implemented yetInsufficient privilegeCan't - no memoryUnknown CS/200 commandInvalid CS/200 commandNo current sessionNo other sessionsInvalid session numberMissing '='Missing SET what?Ambiguous parameter name, try one of:Bad parameter valueValue out of rangeSorryAbortedSHow what?No TM processunusedString truncatedAmbiguous, try one of: failedCan't handle rotaries yetRotary number out of rangePortid out of rangeGlobal Parameters savedStatistics saved interconnection formed disconnectedFile replaced@Can't SETD PRIvilegeInvalid remote commandParameter may not be SET, use SETDInvalid DATESHow parameters for which port?Macro definition too longCan't DEFine from a macroMacros nested too deeplyCan't REMoteSET this parameterCan't SETD this parameterCan't SET yet -- no session!Broadcast is not enabled for that portAddress not on local netNameServer %s %s Err %d Invalid %s syntax Parameter %s unknown Querying %s Name Server...PrimarySecondary Broadcast msg from %s: BRoadcastDefDEFinemacro definitionDisConnectDisconnecting...Disconnecting...DODOListenPauseRESumesession %d with %s resumed ROTROtarySWitchswitched to session %d InBandBreakOutBandBreakTransmitEchoparameter %s: value '%s' is %s Missing %s after parameter `%s' DATESET DATE%dflobaduequal signSETSETDefaultREMoteSETflobaduvalueillegalout of range%d %s < > : PVCAddress or name too long %s"" Td cnt Rd cntPort/session# state`nRDnn (none established) DSCNTDWAITCNNEGOTICONCTDATTN WAITDSMOURNP!%2d LISTENCOMMAND no connection(via interconnect)(passive !%d)(active !%d)(passive end)with !%2d/%d%s %s %s%s%10d%10d%10d%10d%10d%10dPNo active session on Portid !%d Sessions on Port !%d (%s)Sessions on Port !%dSHow!%-3d %s!%-3d Rotary unused !%-3d Active only Server Internet Addresses %s (Ethernet Address %s) (subnet mask%s)Physical Port Internet AddressesRotary Port Internet AddressesInternet Server Addresses%s - %s Primary Name Server %s - %s Secondary Name Server %s - %s AUdit Server Address %s - %s Boot Server %s - %s Default Gateway ADDRess = !%-3d %s ADDRess = (via Remote) %s ADDRess = !%-3d (Active only) ADDRess = (!%-3d) (Rotary unused) SHow MACrosMACRO %s = ( ) *SHow NAmesSHORTLONGSHow NetMAPNETWORK MAP%3d***%s-%s %s *** %d inactive node%s *** s%c!%d Rotary !%d = STATSHow STATistics%.2s %.4s rev. %.3s%.2s %.4s%s, booted on %.16s from %s PROMS: MP200 - %s ,4$44* * Unknown SU option SU call to what? Invalid SU command %6x: %02x PRIVATE SHARED PRIVSHR OTHER INITIAL %-9d%-8d%-9d%-9d CURRENT %-9d%-8d%-9d%-9d Total %d sessions bptf6>FN   ) ] (to leave remote mode) BRoadcast( ! ) (
) ( ) %-12s%s%s SHowReaDSAveSU %-8s%s%s %s [ ( ( [ | # | ( #, , [ ## | ], [ ##SET SETD %s %-16s= , | Name Priv:%4s%4s%4s%4s%4s%4s Shrd:%4s%4s%4s%4s%4s%4s %-7s %3d %3d %3d %3d %3d %3d %3d %3d %3d %3d %3d %3d 1K %d.%d%4d------------ TOTALAVAILINITPROC RESUMES STACK hh:mm:ss.mili.micro %-8s%-8d%-8d%s INTID NINTS hh:mm:ss.mili.micro %-8x%-8d %s TYPE IDmilli.micro PROC %-8s INT %-8x%03d.%03dNUNNgpwDEFUNDUNSbsaR0 Welcome to your Communications Server CS/200T> cs/200t# ir|QZkNoowqT r6.4X>@ESZaHrkrsD]&"4-0Hu18HvdKTUzUzV^::@| Ȓ3DESTdel{Œ(01>!\&?Q1^2\n1^yBB8BBB+BnBRoadcastConnect
[ ECM ]DEFine = ( )DisConnect[]DOEchoListenName = Pause[]ReaD
RESume[]ROtary! [+|-]= ![-!] , ...SAve<'><7>;y>;ڳ>;>;'>;`>;s>;Y>;@>;&N>; >:>:>:1>:i>:>:q>:X>:>R>:$>: >9>99>9p>9>9>9p>9VL>9<>9">9>8/>8e>8>8>8>8n=>8T{>8:>8 >8>7P>7Ӆ>7>7>7,>7l`>7R>78>7>72>6m>6ѡ>6>6 >6<>6jp>6P>66>6>6D>5w>5Ϫ>5>5>5A>5h{>5N>54>5>5C>4t>4ͦ>4>4>4B>4fs>4L>42>4>3>>3n>3˞>3>3>3~/>3d^>3J>30>3>2%>2T>2Ƀ>2>2>2|>2bF>2Hu>2.>2>1>16>1d>1>1>1y>1`>1FH>1,u>1>0>0>01>0^>0>0w>0]>0D>0*D>0p>/>/>/>/&>/R>/u}>/[>/A>/'>/)>.\>.ڇ>.>.>.>.s0>.YZ>.?>.%>. >- >-3>-\>->->-p>-W>-=1>-#Z>- >,>,>,>,+>,S>,n{>,T>,:>, >,">+I>+p>+>+>+>+l >+R:>+8a>+>+>*>*>* >*N>*t>*i>*O>*5>* >*/>)\>)΁>)>)>)>)g>)M8>)3\>)>(>(>(>(>(<>(~_>(d>(J>(0>(>'>':>']>'>'>'{>'a>'H>'.3>'U>&>&>&>&>&>&y'>&_H>&Eq>&+>&>%>%>%>%5>%V>%v~>%\>%B>%(>%>$>$=>$e>$>$>$s>$Y>$@>$&>$ F>#e>#؃>#>#>#>#p>#W">#=@>##^># {>">"շ>">">">"n3>"TP>":m>" >">!>!>!>! >!<>!kX>!Qs>!7>!>!> > > > ;> V> hy> N> 4> > >>>;>U>o>e>K>1>>>>)>C>\>|u>b>H>.>>>>(>@>X>yx>_>E>+>>>>$>;>R>vi>\>B>(>>>>>$>:>sP>Yn>?>%> >>>> > >p5>VI><^>"s>>>Է>>>>m>S>9/>J>^>q>ф>>>>i>O>5>>">4>G>a>s>>f>L>2>>>>>>)>}:>cK>Id>/t>>>>Ƕ>>>y>_>F >,>-><>L>c>r>>v>\>B>(>>>>> >>s(>Y>>?L>%Y> g>u>ׂ>>>>o>U>;>!>>>>>+>8>lD>RP>8[>o>{>>В>>>>h>N>4>>>>>>%>/>e9>KC>1M>W>i>r>|>>>{>a>G>->> > > > > > x> ^ > D> *> !> )> 1> A> H> P> tW> Z_> @f> &m> |> > ؊> > > > p> V> <> "> > > > > > > l> R> 8> > > > > > #> (> i-> O2> 56> C> G>K>P>T>X>\>eg>Kk>1o>s>v>y>}>>>{>a>G>->>>ߦ>ũ>>>w>]>C>)>>>>>>>s>Y>?>%> >>>>>>o>U>;>!>>>>>>>k>Q>7>>>>>>>>g>M>3>>>>>>>}>c>I>/>>>>>>>y>_>E>+>====S====w=Oo=g=n=f=]=KT=K=B=9={?=G5=,="==w =C====r=>= ===n=:==җ==j~=6q=t=f=Y=fK=2>=0="=#=b=.====]=)====Y=%{=k=[=Z=UI=!8='===P=====L====|l=HY=F=2==x =D====s=?= =׆=q=o\=;F=0===j=6==λ=뚤=f=2v=_=W=?=b(=.====]=)==t=[=YB=%)====T= ==渂=x=P]=B='= ==K===䯑={u=GY=<= ==v=B==ڟ=⦁=rd=>F= 8===m=9==с=r=iS=54===ߘ=d=0==e=ޔE=`$=,===ݏ=[='m=L=ܿ*=܋=V="==ۺ=ۆm=RJ='==ڵ=ځ=M==c=ٱ?=}=I===ج=xu=DP=+==ק=s=?= =Z=֣4=o=:==Ҫ=՞=j\=65===ԙ=e=1=Y=1=ӕ=`=,==w=ҐN=\%='==ѿ=ы=Wf=#<==к=І=R=y=O=϶$=ρ=M===α\=}1=I===ͬ=xe=D9= ==̧=s=?Y= <==ˢ=n=:=X=*=ʞ =i=5==S=ə$=d=0==w=ȔH=`=+==Ù=Ǐi=[9=' ==ƾ=Ɗw=VV="%==Ź=Ņ=Q`=.= =Ĵ=Ā=Lv=D==ï={=G=W=$=ª=v=B=V=3==q=== c=.==l=8=l=7==g=3=r=<==b=.=e=/==]=)=e=.==X=$=a=*==S==K===N=z=B= =}=I=n=5==x=D=O===s=?x= ====n=:c=(===iw=5<====d^=0"==Ǫ=m=_1=+==‹=N=Z=%==j=,=T= =s=6==O==M==~=J=R=#==y=Ef='===tx=@8= =׸=x=o8=:==҆=E=j=5==A==d=0=K= ==_=+D====ZJ=&===O=U = ==B==O==C==~=Jw=3===yv=E1==ܧ=b=t=?= =]==n=:=F===i=5>==̱=j=d#=/==^==^=*=A= ==Yz=%2===Z=T"===H==N=n=%==}=IY===}=x3=C==e==r=>= <===ml=9"==Ќ=@=h=3=o=#==b=.@==Ÿ=l=] =(==:==W=#d===}=R0===X= =L=o=!=={=GG==ު=\=v=A= =1==p== ^===mt=9!==z=&=g=3=:===b==-==P==\=(Q===S=W ="=c= ==Qb= =ю=h=6=~=~.=}2=}]=|=|L=|#={={RD=z=z=z[=y=yF=xQ=xu=x =wE=w;=v=vjW=v=u=u0H=tǘ=t^=sX=s=s$=rF=rS=q=q3=q=p=pH>=oߍ=ov=o(=nv=n<=m1=mk~=m=l=l1e=kȲ=k`=jj=j=j&=iN=iT=h=h1=h=g=gI2=f}=fw=f=e\=e==d=dlZ=d=c=c27=bɀ=b`=a2=a{=a&=` =`UT=_=_=_L=^=^I=]#=]xk=]=\=\>`=[է=[l=[4=Zz=Z2=Y=Yal=X=X=X'==W=WU=V =Vr=V=U=UJ?=T=Tx=T =Sp=S>=R=Rm;=R~=Q=Q3=Ph=Pa=O=O0=O'r=N=NU=MY=M=M=L=LJ_=K=Kx=KC=J=J>=I=ImF=I=H=H3=Gg=Ga=F=F&=F'e=E=EU=DC=D=D=C=CJ>=B}=Bx=B=AW=A>=@=@m=@N=?=?2=>&=>ad======'=)=7d=7l=7=6=62o=5ɪ=5`=4=4X=4&=3=3U&=2`=2=2=1 =1IE=0=0w=0=/I=/==.Ժ=.k=.+=-=-1=,=,`+=+c=+=+%=*)=*Ta=)=)=)=(==(Hs='ߪ='w='7=&m=&<=%=%k=%E=$=$0=#=#_;="q="="$=!0=!Se= = = =7=Gl==u= (=\=;==i=K=~=/==^=K=~=#==R6=h====F2=݄=t= ==:K=|=h==0=.a=Œ=\==%="v==P==7=h= = D= = sH= w= = 8= = gU= = = ,==[A=p== ==OJ=y=}===CQ==q== =76=d=e== =+9<<&<<<>sD<-|<+<*T<(<' <%j<#<"#< )<ܮ<93<<=<OA<<J<d<S<<z[< _< 3< g<<Io<<v<_y;w;0;; ;\;;;";A(;-;޳2;l7;%;;@;јD;QI; M;Q;|U;5Y;\;`;ac;g;j;m;Ep;s;u;qx;*{;};;U;;Ȇ;;:;;Y;x;r= ;k#;e#&;^(;X+;Qy-;J/;D]1;=3;7C5;06;*'8;#9; :;}<;=; c>;?::r:V::::::Ά:::j:P:6:U:9"9Z"9MD88ѷ9Q9IR9ѷ:o:IQ:73:Q:k:n:-:IP:d:0:ě:ѷ:҂:: b;i; ;-;;IH;#;*d;0n;7$;> ;D;K)J;Q;XD;^m;e`#;k;r{;y E;;X;Y2; ;;-;t;v;P;I*;;;;d;j;D;9;;; ;T;ěY;1;) ;o;Ѷ;;Di;ۋ@;;;_;覞;t;4L;{";;;O;z<n<<~<X<S< < C(< <<-f<<t:<<<^w<<J<H<< <"2<#W<%y<')<(<*c<,b<- <<7< <8<<~b<<<ڳN<ۄ*===x=Q=J===v=?=V=='=c=+=a=ʼ=3=L==m=֥=?m=4==y==KR== = = n=!W5=!="(="="O=#c=#=$4=$g=%-=%n=%׸=&@~=&C=' ='z='=(LW=(=)=)=)j=*X.=*=+)=+{=+?=,d=,=-5=-M=.=.o=.ؗ=/A[=/=0=0{=0e=1M'=1=2=2n=20=3X=3=4*u=47=4=5d=5z=66<=6=7=7p~=7?=8B=8=9=9|?=9=:M=:=;>=;=;=e7=>=?6=?r=@0=@p=@٬=ABj=A'=B=B|=B_=CN=C=D=DS=D=EY=Eˆ=F+D=F=F=Gex=G3=H6=H=If=Iq =I=JB=JQ=K =K|=K=LN;=L=M=Mi=M"=NY=N–=O+O=O=O=Pez=P2=Q6=Q=R\=Rq=R=SB=S;=T=T|=Tb=UN=U=V=V>=V=WY=Wb=X+=X=X=Ye:=Y=Z6=ZY=[=[p=[y=\B.=\=]=]|K=]=^M=^h=_=_=_=`Y6=`=a*=aO=a=bd=bf=c6=c=d}=dp.=d=eA=eC=f=f{=fW=gM=g=hh=h=h=iXy=i)=j)=j=j7=kc=k̖=l5E=l=m=moP=m=n@=n[=o =oz=oe=pL=p=ql=q=q=rWr=r=s(=sx=s#=tb=tz=u4&=u=v}=vn'=v=w?~=w(=x=xy|=x&=yJ=yz=z#=z=zu={V={=|'p=|=|=}aj=}=~2=~a= =l=W==SS===M=$=X=E===*>=^==6==/=d,=~=="=5t=i==i==; =o]=== P=@=t=C=ݓ==F5=z==&=v=K==f===QU===C="=V=1===(=\l== =X=-=a=C=ʑ==3,=gz===c=8=l=K=՘= =>2=r===e=C=w=J===I/=}z===^=N==@===T!=l===%M=Y==,=v=*=_ =T=Ǟ==01=d{===W=5=i=3={==; =oV=== /=@w=t==O==E=z&=m===KD====_=P==3=y=!=V=L==='=[c===3=,x=`==H==1=f=Z=Ξ==7'=kk===6=>,>F>`>z>>>>>>>0>J>d>~>>>>>>>4>N>h>>>>>>>>8>R>l>>>>>>>"><>V>p>>>>>> >&>@>Z>t>>>º>ܸ>>>*>D>^>x>>>Ɯ>>>>.>H>b>|>}>y>t>p>l>g>2b>L]>fX>S>N>I>D>?> :> 3> 6.> P(> j#> > > > > > > > 9> S> m> > > > > > > #> => W> q> > > > }> u> m> 'e> A]> [T> uL> C> :> 1> (> > > +> E> ^> x> > > > > >>.>H>b>|>>y>o>d>Y>N>2D>L9>f,>!>> >>>>>5>O>i>>>>ц>z>m>`>9S>SF>m9>,>>>>>>"><>V>p>>>>x>i> Z>&L>@=>Z.>t>>>>>>>)>C>]>w>t>c>S>C>2>">->G>`>z>>>ȫ>>>w>0f>JT>dB>~/>> >>>>>3>M>g>w>d>Q>>>+>>>6>P>j>>>>x>d>P> :>:&>T>m>>>>թ>> }>#h>=R>W=>q'>>>>>> >&>@t>Z^>tG>0>>>>>>)>C>]u>w]>E>->>>>>,>F>`>zi>O>6>>>>>/>I>c>}j>P>6>>>>>2>L>f|>a>F>+>>> > > 5> O> ii> M> 1> > > >!>!>!8>!Ri>!lL>!/>!>!>!>!>">"!~>";a>"UC>"o%>">">">"֬>"># n>#$P>#>1>#X>#q>#>#>#>#u>#U>$ 6>$'>$@>$Z>$t>$>$v>$T>$4>$>%>%)>%C>%]>%wo>%M>%+>% >%>%>&>&,>&Fa>&`?>&z>&>&>&Ǵ>&>&o>'L>'/)>'I>'b>'|>'>'w>'S>'0>' >(>(1>(K>(ez>(V>(1>( >(>(>)>)y>)4S>)N.>)h>)>)>)>)q>)K>*%>*>*6>*P>*j>*d>*=>*>*>*>+>+y>+9R>+S*>+m>+>+>+>+b>+9>,>,!>,;>,U>,oo>,F>,>,>,>,>- w>-$M>->#>-W>-q>->-{>-P>-&>->. >.&>.@{>.ZP>.t%>.>.>.>.w>.K>/ >/(>/B>/\>/vo>/B>/>/>/ݽ>/>0c>0+6>0E>0^>0x>0>0R>0$>0>0>1>1-l>1G=>1a>1z>1>1>1T>1%>1>2>2/>2Ig>2c8>2}>2>2>2x>2H>2>3>31>3K>3eU>3$>3>3>3̏>3^>4->4>43>4M>4gf>44>4>4>4Μ>4i>57>5>55>5O>5ik>58>5>5>5Н>5i>65>6>67>6Q>6ke>6/>6>6>6ґ>6]>7(>7>79>7S>7mQ>7>7>7>7z>7D>8>8!>8;>8Uj>8o3>8>8>8>8W>8 >9 >9#>9=x>9W@>9q>9>9>9`>9'>9>: >:%}>:?D>:Y >:r>:>:_>:&>:>:>; w>;'=>;A>;Z>;t>;T>;>;>;ۣ>;h><-><(><\{><><><Ë><>=>=*>=D]>=^!>=w>=>=i>=,>=>=>>s>>,6>>E>>_>>y{>>=>>>>>>>>C>?>?->?G>?aF>?{>?>?>?H>?>?>@>@/H>@I>@b>@|>@E>@>@>@>@A>A>A0>AJ{>Ad:>A}>A>At>A2>A>A>Bi>B2'>BK>Be>B^>B>B>B̔>BO>C >C>C3>CM?>Cf>C>Cr>C->C>C>D^>D>D4>DN>DhH>D>D>Dv>D0>D>E>E]>E6>EO>Ei>EB>E>E>Ek>E$>F>F>F7M>FQ>Fj>Fs>F+>F>Fњ>FQ>G>G>G8v>GR,>Gk>G>GO>G>Gһ>Gq>H'>H>H9>HSF>Hl>H>Hf>H>H>H>I9>I >I:>ITT>In>I>Ip>I#>I>I>J<>J!>J;>JUU>Jo>J>Jl>J>J>J>K 3>K">K<>KVH>Ko>K>K[>K >Kּ>Km>L >L#>L=~>LW.>Lp>L>L<>L>Lכ>LK>M >M$>M>X>MX>Mq>Mc>M>M>Mm>M>N >N%w>N?$>NX>Nr~>N+>N>N>N2>N>O >O&7>O?>OY>Os:>O>O>O=>O>O>P ?>P&>P@>PZ>>Ps>P>P=>P>Pڒ>P;>Q >Q'>QA7>QZ>Qt>Q3>Q>Q>Q->Q>R}>R(%>RA>R[u>Ru>R>Rl>R>Rۺ>Ra>S>S(>SBU>S[>Su>SI>S>S”>S:>S>T>T)*>TB>T\u>Tv>T>Tc>T>Tܬ>TP>U>U)>UC<>U\>Uv>U&>U>Um>U>U>VV>V)>VC>V]<>Vv>V>V">V>Vf>V>W>W*J>WC>W]>Ww,>W>Wm>W>Wݮ>WN>X>X*>XD,>X]>Xwk>X >X>XI>X>X>Y$>Y*>YDa>Y]>Yw>Y;>Y>Yv>Y>Y>ZM>Z*>ZD>Z^#>Zw>Z\>Z>ZĔ>Z0>Z>[g>[+>[D>[^9>[w>[p>[ >[Ĥ>[?>[>\s>\+ >\D>\^A>\w>\s>\ >\Ħ>\?>\>]q>]+ >]D>]^:>]w>]j>]>]Ě>]1>]>^`>^*>^D>^^$>^w>^R>^>^>^>^>_A>_*>_Dk>_^>_w>_+>_>_U>_>_~>`>`*>`D:>`]>`wb>`>`>`>`ݯ>`B>a>a*h>aC>a]>aw >a>aD>a>ag>a>b>b*>bC>b]=>bv>b_>b>b>b>b>c0>c)>cCO>c\>cvn>c>c>c>cܩ>c8>d>d)U>dB>d\q>du>d>d>d§>d4>d>eN>e(>eBg>e[>eu>e >e>e$>e۰>e<>f>f(R>fA>f[h>ft>f~>f>f>f>f>g0>g'>gAD>gZ>gtW>g>gi>g>g{>g>h >h'>h@>hZ$>hs>h3>h>hB>h>hP>i >i&]>i?>iYk>ir>iw>i>i>i>i>j >j%>j?>jX>jr'>j>j/>j>j8>j>k @>k$>k>G>kW>kqM>k>kS>k>kX>k>l ]>l#>l=a>lV>lpd>l>lg>l>li>l>m k>m">mmU>mol>m>ml>m>mk>m>ni>n!>n;g>nT>nnd>n>na>n>n]>n>oX>o >o:S>oS>omM>o>oF>o>o?>o>p7>p>p9/>pR>pl&>p>p>p>p>p>q>q>q7>qQu>qj>qi>q>q[>q>qM>r>r?>r6>rP0>ri>r >r>r>rχ>r>sv>s>s5d>sN>shQ>s>s>>s>s*>s>t>t>t4>tMu>tf>t_>t>tI>t̽>t2>t>u>u2>uL>uet>u~>uZ>u>u@>u>u%>v>v1 >vJ{>vc>v}_>v>vB>vɲ>v$>v>w>w/v>wH>wbW>w{>w7>w>w>w>w>xc>x->xGA>x`>xz>x>x>xh>x>xC>y>y,>yE>y^>yxd>y>y>>yĪ>y>y>z>z*Z>zC>z]0>zv>z>zq>z>zG>z>{>{(>{A>{[X>{t>{+>{>{>{f>{>| 7>|&>|@>|Yp>|r>|?>|>|>|v>|>} C>}$>}>>}Ww>}p>}C>}>}>}s>}>~ >>~">~<>~Ul>~n>~5>~>~>~c>~>*> >9>SS>l>>z>>?>>>2>>(>5E>A>N>[V>h>t>f>>>v>%>>ͅ>5>>>B> >>&O>2>?>L[>Y >e>rh>>>r>!>>|>+>>>3>> ><>#>0>=D>I>V>cJ>o>|>Q>>>V>>Ȯ>Z>>>^> >>!a>. >:>Gc>T>`>me>z>>e>>>e>>Һ>e>>>c> >>+`>8 >D>Q]>^>j>wY>>>T>>>O>>ܟ>H>>>A>>(>59>A>N>[0>g>t>&>>u>>>j>>ٸ>_>>> R>>%>2E>>>K>X7>d>q>~(>>t>>>c> >֭>S>>> A>>">/.>;>Hw>U>a>nc>{>>O>>>9>>Ӏ>">>i> >>R>+>8>E9>Q>^~>k >w>d>>>J>>Ì>.>>q>>>T>>(>56>A>Nx>[>g>tZ>>>:>>y>>̹>X>>>6> >u>%>1>>R>J>W>d.>p>}k> >>E>>> >ս>Z>>>3>>!n>. >:>GE>S>`>m>y>T>>>*>>a>>ޙ>5>>m>>>*>>6>Cu>P>\>iE>u>{>>>J>>>>ڳ>M>>> >>&M>2>?>L>X>eK>q>~}>>>F>>w>>֨>@>>o> >>"7>.>;f>G>T>a,>m>zZ>>>>>K>>x> >>:>>f>>*>7&>C>PQ>\>i|>v>>;>>d>>>">ڶ>K>>s> >>&.>2>?V>K>X}>e>q>~6>>\>>>>ɧ>9>>]>>>>!>.7>:>GZ>S>`}>m>y>1>>S>>t>>і>&>>F>>g>>)>6>B>O5>[>hT>t>s>>>>>=>>Z>>w>> >!>$>1=>=>JY>V>ct>p>|>>>5>>O>>i>>> >>&>>,>>8>EU>Q>^m>j>w>>>%>>;>>P>>e>>z>>>'>3>@+>L>Y?>e>rR>~>d>>v>>>>֙>">>2>>C>!>.R>:>Ga>S>`q>l>y>>>>>">Ī>0>ݷ>=>>I>>V>(>5b>A>Nm>Z>gw>s>>>>>>>˟>$>>,>> 5>>#=>/>H>UL>a>nS>z>Y>>_>>d>>i>>n>>s>>w>)>6{>B>O~>[>h>u>>>>>>>̇>>> >> >>$>0>=>I>V>b>o>{>>>>>>}>>z>>v>>r>>*n>6>Ch>O>\c>h>u]>>W>>Q>>J>>B>>;>> 3>>$)>0>= >I>V>b>o >{>>~>>s>>h>>\>>P>>D>>*7>6>C*>O>\>h>u >>>x>>i>>Y>>H>>8> >'>#>0><>I>U{>a>ni>z>W>>D>>0>Ŧ>>ޒ>>}>>i>>)S>5>B>>N>['>g>t>>>n>>V>>>>ײ>&>> > >>"f>.>;M>G>T2>`>m>y>>n>>R>>6>Ч>>>>m>>P>'>42>@>M>Y>e>rd>~>D>>$>>>s>>R>>1>>> }>,>9Z>E>R7>^>k>w>>^>>9>>>΁>>\>>6> >>%|>1>>T>J>W->c>p>|q>>H>>>>>a>>6>> >w>>*L>6>C>O>[>h^>t>1>>>m>>?>˨>>y>>K> >>">.>;S>G>T#>`>l>yZ>>(>>>^>>+>ܑ>>^>>+>>&>3\>?>L'>X>d>qW>}>!>>>P>>>~>>F>>>r>>+9>7>D>Pc>\>i)>u>>R>>>z>>>>ؠ>>d>> '>>">/K>;>H>To>`>m1>y>>R>>>r>>2>ܓ>>Q>>>o>&>3.>?>K>XJ>d>q>}e>>!>>>;>ǘ>>S>>>k>>%>*>6>C:>O>[>hP>t>>d>>>v>>->׉>>?>>>O>!>.>:^>F>S>_m>k>x >y>>,>>>8>Α>>C>>> L>>$>1T>=>J>V\>b>o >{b>>>g>>>l>>>p>>>r>>(>4s>@>M>Yt>e>r>~s>>>q>>>n>>>j>>>e>>+ >7`>C>P>\Y>h>t>Q>>>H>>>>>א>>3>>>(>!x>->:>Fk>R>_ >k]>w>>M>>>=>>>+>z>>> h>>$>0T><>H>U>>a>m>z)>v>>>_>>>G>ܓ>>->y> >>&_>2>>>KC>W>c>p%>|q>>>S>>>4>~>>>]>>><>(>4>A>Mb>Y>e>r>>~>>>a>>>:>Ԃ>>>Z>>>1>*x>6>C>ON>[>g>t">i>>>;>>> >S>>>#>h>>>,8>8|>D>Q>]J>i>u>>Z>>>&>i>˭>>2>v>>>>>!>->:>FG>R>^>k >wO>>>>T>>>>W>>>> Y>>">/>;Y>G>S>`>lW>x>>>S>>>>M>ڌ>>>E> >>#>0<>H>T>a/>mm>y>>">_>>>>N>ۊ>>><> x>>$>1)>=c>I>U>b>nM>z>>>5>n>>>>T>>>> 7>p>%>1>>>JQ>V>b>n>{0>g>>> >D>{>в>>>U>> >>&->2d>>>J>W>c9>on>{>> >B>v>>>>G>{>>>>I>&|>2>>>K>WH>c|>o>{>>D>w>>> >>>o>>>>4>e>&>2>>>K'>WX>c>o>{>>G>v>>>>3>a>>>>>K>&x>2>>>K>W0>c]>o>{>>>?>l>>>>>J>v>> >>&$>2P>>{>J>V>b>o'>{Q>|>>>>%>O>y>ܢ>>>> H>q>%>1>=>J>V<>bd>n>z>>>,>T>{>á>>>>=>e> >>$>0>=$>II>Uo>a>m>y>>*>O>t>>¾>>>*>O>s> >>#>0><$>HH>Tk>`>l>x>>>;>]>>>>>>(>I> k>>">.>:>G>S.>_O>ko>w>ƒ>>›>¨>´.>M>l>؋>>>> >$>!C>-a>9>E>Q>]>i>v>Â0>ÎM>Új>æ>ò>þ>>>>1>N>i>>>+>7>C>P>\(>hD>t^>Āy>Č>Ę>Ĥ>İ>ļ>>/>H>b>{>>>>)>5>B>N(>ZA>fX>rq>~>Ŋ>Ŗ>Ţ>Ů>ź>>+>C>Y>p>>>>'>3>?>L >X>d4>pJ>|_>ƈt>Ɣ>Ơ>Ƭ>Ƹ>>>>>+>>> R>e>%y>1>=>I>U>a>m>y>dž>ǒ!>Ǟ2>ǪD>ǶV>g>y>ڊ>>>> >>">/>;>G >S1>_@>kQ>w`>ȃo>ȏ>ț>ȧ>ȳ>ȿ>>>>>>>> ,>,;>8H>DV>Pb>\o>h}>t>ɀ>Ɍ>ɘ>ɤ>ɰ>ɼ>>>>>>>$>0>):>5E>AP>MZ>Ye>eo>qy>}>ʉ>ʕ>ʡ>ʭ>ʹ>ż>>>>>> >>&>2>>>J>V>b&>n.>z4>ˆ<>˒B>˞J>˪P>˶W>]>c>i>o>u>z> >>">.>:>F>R>^>j>v>̂>̎>̚>̦>̲>̾>>>>>>>>>*>6>B>N>Z>f>r>~>͊>͖>͢>ͮ>ͺ>>>>>>>>>&>2>>>J>V>b>n>z>Ά>Β>Ξ>Ϊ>ζ>>>>>>> >>">.>:>F>R>^>j>v>ς>ώ>Ϛ>Ϧ>ϲ>Ͼ>ʈ>փ>}>w>r>k>f>_>*Z>6S>BM>NE>Z>>f8>r0>~)>Њ!>Ж>Т>Ю >к>>>>>>> >>%>1>=>I>U>a>m{>yp>хf>ё\>ѝQ>ѩF>ѵ;>1>%>>>>>>> >,>8>D>P>\>h>t{>Ҁn>Ҍ`>ҘS>ҤE>Ұ8>Ҽ*>>>>>>>>>'>3>?>Kx>Wi>cY>oI>{9>Ӈ)>ӓ>ӟ>Ӫ>Ӷ>>>ڳ>>>~> l>[>"H>.7>:$>F>Q>]>i>u>ԁ>ԍ>ԙ>ԥy>Աf>ԽQ>>>)>>>>>>>(>4>@n>LX>XC>d->p>|>Շ>Փ>՟>ի>շ>z>b>K>4>>> >>">.>:>Ft>R[>^C>j*>v>ց>֍>֙>֥>ֱ>ֽw>^>C>)>>>>>>(>4m>@R>L6>X>c>o>{>ׇ>ד>ןr>׫T>׷7>>>>>>> j>L>"->.>9>E>Q>]>iv>uW>؁8>؍>ؘ>ؤ>ذ>ؼ>z>Y>9>>>>>>'s>3R>?0>K>V>b>n>z>نe>ْB>ٞ >٩>ٵ>>͓>p>L>)>>>> >,t>8O>D+>P>[>g>s>r>ڋM>ڗ&>ڣ>ڮ>ں>Ə>h>B>>>> >>%W>10>=>H>T>`>lh>x?>ۄ>ۏ>ۛ>ۧ>۳t>ۿJ> >>>>z>P>%>>)>5>A{>MP>Y%>d>p>|>܈w>ܔK>ܠ>ܫ>ܷ>Û>n>A>>>> >_>"1>.>9>E>Qz>]L>i>t>݀>݌>ݘb>ݤ3>ݰ>ݻ>ǥ>u>D>>>>>S>&">1>=>I>U^>a,>l>x>ބ>ސe>ޜ3>ި>޳>޿>h>5>>>>h>4>>)>5>Ad>M/>X>d>p>|\>߈'>ߓ>ߟ>߫>߷Q>>>ڮ>x>B> > >>!f>-0>8>D>P>\Q>h>s>>p>8>>>ຍ>T>>>>n>5> >>$>0K><>G>S>_`>k%>v>Ⴎ>s>6>>᱾>ὃ>F> >>>S>>>>'^>3 >>>J>Vf>b(>m>y>l>->>⨯>p>0>>װ>q>0>>>p>/>)>5>Al>M+>X>d>pf>|$>>㓟>^>>>–>S>>>>E> >> z>,6>7>C>Oh>[$>f>r>~U>>>䡅>?>>ij>m>'>>>R> >>"}>.6>9>E>Q^>]>h>t>>>>嗭>c>>>ƈ>>>>>a>> >>$7>/>;>GW>S >^>ju>v)>>捒>F>>氭>a>>>z>->>>E>>%>1[>= >H>Tp>`!>k>w>4>>皕>F>>罧>V>>>e>>>s>">&>2>>.>I>U>a9>l>x>A>>蛜>J>>辣>P>>>U>>>Y>>'>3[>?>J>V[>b>m>y[>>鐯>Y>>鳭>V>>֨>R>>>K>>>(D>3>?>K;>V>b>n1>y>>%>>r>>꿿>d> >>U>>>D>>(>42>?>K{>W>b>ng>z >녭>Q>>먗>:>>>">>e>>>K>>(>4/>?>Kp>W>b>nR>y>셒>2>>r>>쿰>O>>>+>>h>>>(B>3>?}>K>V>bV>m>y>,>>d>>>8>>o> >>A>>v>>'>3F>>>Jz>V>a>mG>x>z>>>D>>u> >զ>=>>m>>>3>&>2`>=>I>U$>`>lQ>w>{>>><>>f>>Ԑ>$>>M>>u>>%>1/><>HU>S>_{>k >v>2>>V>>z> >ǝ>->޿>O>>q> >>$!>/>;A>F>R`>]>i>u>>+>>H>>d>>> >>'>> A>>"[>->9t>E>P>\>g>s.>~>E>>[>>p>>υ>>>">> 5>> H>+>7Y>B>Nk>Y>e{>q>|>>>!>>/>>=>>I>>V>>a>>)l>4>@w>K>W>c>n>z>>>>>>$>ʧ>+>>0>>5>>9>&>2<>=>I?>T>`B>k>wD>>D>>E>>D>>D>>B>>A> >=>#>/;>:>F6>Q>]0>h>t,>>%>>>>>Ĕ>>ۋ>>>> x>> o>+>7c>B>NY>Y>eL>p>|>>>1>>#>>>̎>>}>>l>>\>>(I>3>?8>J>V$>a>m>x>>r>>\>>G>Ȼ>0>ߥ>>>> u>>$[>/>;C>F>R(>]>i>t>>d>>G>>+>ě> >~>>^>> ?>> >+>6>Bm>M>YL>d>p)>{>>t>>Q>>+>˙>>s>>M>>&>>&>2j>=>IB>T>`>k>v>Y>>/>>>m>>?>ݩ>>}>> N>>" >->8>DX>O>[&>f>q>}\>>+>>>^>>)>ؐ>>\>>%>>>(T>3>?>J>U>aI>l>x>s>>9>>>`>>&>ވ>>K>> >o>">.2>9>D>PS>[>g>rs>}>1>>>P>> >l>>'>>>A>>>(Z>3>?>Jp>U>a(>l>w><>>>P>>>a>Һ>>p>??? l???r?"?'?-w?3#?8?>{?D'?I?O~?U*?Z?`?f-?k?q?w/?|??1???1???0???/??Ƅ?-??ׁ?*??~?(??z?$?? u???p?!?&?,j?2?7?=c?C ?H?N[?T?Y?_S?d?j?pI?u?{?????5???*??v???i??ʶ?\??ۨ?N???????/??y???i?% ?*?0V?5?;?AD?F?L?R0?W?]y?c?h?nd?t?y?N???8??}? ??g? ??N??Ȓ?5??y???_???D??? (??j? ?"?(L?-?3?9/?>?Dp?J?O?UP?Z?`?f0?k?qp?w?|?N???,??k? ??G???#??_??֜?;??v???O??? (??c???%:?*?0s?6?;?AJ?F?L?R?W?]V?b?h?n*?s?yb?~??4??j?????k??ߗ?-??Y????? E??o??"?(.?-?3X?8?>?D?I?O>?T?Zg?_?e?k"?p?vJ?{?q???+??Q??w? ??/??U??y? ?ڝ?/??T??w? ??+? ?N??p?#?(?.#?3?9D?>?De?I?O?U?Z?`6?e?kU?p?vu?|??#??B??`??~? ??)??G??c??ڀ? ??)??D??_?? y??? ?"?(;?-?3T?8?>m?C?I?O?T?Z)?_?eA?j?pX?u?{p?????'??=??R??g??|??ΐ??٥?/??B??T?? h? ? y? ? ? ? !? '&? ,? 27? 7? =H? B? HX? M? Sh? X? ^x? d? i? o? t? z? ? +? ? :? ? G? ? U? ? b? ? n? ? z? ? ҆? ? ݒ? ? ? "? ? ,? ? 7? ? A? ? K? ? %S? *? 0]? 5? ;e? @? Fl? K? Qt? V? \{? a? g? m? r? x ? }? ? ? ? ? ? ? #? ? '? ? ,? ? /? ʱ? 2? մ? 6? ? 8? ? ;? ? =? ? ?? ? @? ? A? "? (B? -? 3A? 8? >B? C? IA? N? T@? Y? _?? d? j>? o? u;? z? 9? ? 6? ? 3? ? 0? ? ,? ? (? ? #? ǡ? ? Ҝ? ? ݗ? ? ? ? ? ? ? ? }? ? v? ? o? $? *f? /? 5]? :? @U? E? KL? P? VC? [? a8? f? l/? q? w$? |? ? ? ? ? ? |? ? p? ? c? ? V? ? I? ? ;? ٴ? -? ? ? ? ? ? ? y? ? i? ? Y? ? &H? +? 18? 6? <&? A? G? L? R? Wz? \? bg? g? mU? r? xA? }? -? ? ? ? ? z? ? e? ? P? ? :? İ? %? Ϛ? ? ڃ? ? k? ? U? ? ?D?I?N?TI?Y?_?dx?i?oB?t?z ?o??8???d??,???V???ŀ??G?ժ? ?o??5???\?? ? ??E??! ?&j?+?1-?6?;?AP?F?L?Qr?V?\4?a?f?lU?q?w?|u??4???T???q??/???K?Ǫ? ?h??$???>???W??? o??*??"?(A?-?2?8W?=?C?Hl?M?S$?X?]?c8?h?m?sK?x?~?]???n??$???3???B?Ü??P?Ӫ??^???j???u?? &???1??#?):?.?3?9B?>?C?II?N?S?YO?^?c?iT?n?t?yZ?~??]?? ?`?? ?b?? ?c???c?θ??c?޷? ?a?? ?_??? [???W??#?)R?.?3?9M?>?C?IF?N?S?Y>?^?c?i5?n?s?y,?~~??!?s???g?? ?[???N?Þ??@?Ӑ??1???!?q???`?? ?N???#;?(?-?3'?8v?=?C?H`?M?R?XK?]?b?h4?m?r?x?}j???Q???8????i???N?ǚ??1?}???_???@??? ? k???J?!?&?,(?1r?6?<?AO?F?K?Q,?Vu?[?a?fP?k?p?v*?{s???L???$?l???B????`?ʧ??4?{?? ?O???!?g?? ?9??? ?$O?)?.?4?9c?>?C?I1?Nv?S?X?^C?c?h?n?sS?x?}??b???+?o???7?z???A?ǃ???I?܌???P????V?? ??X?? ?&?+[?0?5?;?@[?E?J?P?UZ?Z?_?e?jW?o?t?z?S????M????E?????s????C?w????E?x?ҫ???D?w????A?t?? ? ??xd?}?????D?i????? ?D?i?ō?ʰ??????c??????6?Y? |????"?''?,I?1k?6?;?@?E?K?P5?UV?Zw?_?d?i?n?t?y;?~[?|???????!!V?!&m?!+?!0?!5?!:?!??!D?!J?!O&?!T=?!YT?!^j?!c?!h?!m?!r?!w?!|?!?!?!0?!F?![?!p?!?!?!?!?!?!?!?!?!*?!>?!R?!g?!z?!?!?!?!?!?!?"?"?" (?";?"M?"`?"s?"$?")?".?"3?"8?"=?"B?"H?"M?"R%?"W7?"\G?"aY?"fj?"k{?"p?"u?"z?"?"?"?"?"?"?"?"-?"=?"L?"\?"k?"z?"?"Ƙ?"˧?"ж?"?"?"?"?"?" ?"?"(?"5?#C?#Q?# ^?#k?#y?#?#!?#&?#+?#0?#5?#:?#??#D?#I?#O?#T?#Y?#^'?#c3?#h>?#mI?#rU?#w`?#|k?#v?#?#?#?#?#?#?#?#?#?#?#?#?#?#?#?#?#!?#)?#3?#_?(CO?(H??(M0?(R?(W?(\?(`?(e?(j?(o?(t?(y?(~?({?(i?(X?(G?(6?($?(?(?(?(?(?(?(?(Ô?(Ȃ?(o?(\?(J?(7?(#?(?(?(?(?(?(?)?)?) s?)_?)J?)6?)!"?)& ?)*?)/?)4?)9?)>?)C?)Hz?)Md?)RN?)W9?)\"?)a ?)e?)j?)o?)t?)y?)~?)p?)Y?)C?)+?)?)?)?)?)?)?)?)o?)W?)??)&?)?)?)?)?)?)?)y?)`?)G?).?)?*?*?* ?*?*?*y?* ^?*%D?**)?*/?*3?*8?*=?*B?*G?*Lm?*QR?*V5?*[?*_?*d?*i?*n?*s?*xr?*}V?*9?*?*?*?*?*?*?*n?*Q?*3?*?*?*?*?*ƞ?*ˀ?*a?*C?*%?*?*?*?*?*?*k?*L?+-?+ ?+ ?+?+?+?+m?+#M?+(-?+- ?+1?+6?+;?+@?+Ei?+JG?+O&?+T?+X?+]?+b?+g?+l\?+q:?+v?+z?+?+?+?+l?+I?+&?+?+?+?+?+v?+R?+/?+ ?+?+?+͟?+{?+V?+2?+ ?+?+?+?+z?+T?+/?, ?,?, ?,?,s?,M?, '?,%?,)?,.?,3?,8g?,=@?,B?,F?,K?,P?,U}?,ZV?,_.?,d?,h?,m?,r?,wg?,|??,?,?,?,?,t?,K?,"?,?,?,?,}?,S?,)?,?,?,ɬ?,΂?,X?,-?,?,?,?,?,X?,-?,?,?-?-?- S?-(?-?-?- ?-%x?-*L?-/?-3?-8?-=?-Bl?-G@?-L?-P?-U?-Z?-_]?-d/?-i?-m?-r?-ww?-|I?-?-?-?-?-a?-2?-?-?-?-u?-F?-?-?-?-ć?-W?-&?-?-?-ܕ?-e?-4?-?-?-?-p?-??. ?.?. ?.x?.F?.?.?.$?.)~?..L?.3?.7?.?2?2՟?2P?2?2?2`?2?2?2p?2?2?3~?3 -?3 ?3?3:?3?3 ?3%F?3)?3.?33Q?37?3?7?7b?7?7?7?7?77?7?7X?7?7y?7 ?7ę?7*?7͹?7I?7?7h?7?7?7?7?74?7?7Q?7?8n?8?8 ?8?8?85?8?8$O?8(?8-j?81?86?8;?8??8D+?8H?8MD?8Q?8V]?8Z?8_u?8d?8h?8m?8q?8v/?8z?8E?8?8[?8?8q?8?8?8?8?8$?8?88?8?8L?8?8^?8?8q?8?8Ղ?8 ?8ޔ?8?8?8-?8?8=?8?8M?9?9\?9 ?9k?9?9y?9?9"?9' ?9+?90?94?99&?9=?9B2?9F?9K>?9O?9TI?9X?9]T?9a?9f]?9j?9og?9s?9xp?9|?9y?9?9?9?9?9 ?9?9?9?9?9?9 ?9?9%?9?9*?9ɬ?9.?9ұ?92?9۴?96?9?99?9?9;?9?9=?9?:>?:?: @?:?:@?:?:A?:#?:(@?:,?:1??:5?::>?:>?:CA?;B?;G0?;K?;P ?;T?;Y?;]?;a?;fu?;j?;ob?;s?;xO?;|?;?$?>?> ?>Q?>?>?>|?>!?>&C?>*?>/ ?>3l?>7?><2?>@?>D?>IY?>M?>R?>V?>Z?>_C?>c?>h?>lh?>p?>u*?>y?>}?>L?>?>?>n?>?>/?>?>?>N?>?>?>m?>?>+?>?>?>H?>̧?>?>c?>?> ?>}?>?>9?>?>?>R?>?? ??i?? ??"??????9????#??(M??,??1??5`??9??>??Br??F??K(??O??S??X9??\??`??eH??i??m??rU??v??{ ??b??????n???? ??y????*??????2??????:??????A??͘????F??ڜ????J??????M??????O?@?@?@ P?@?@?@O?@?@?@$N?@(?@,?@1L?@5?@9?@>H?@B?@F?@KC?@O?@S?@X=?@\?@`?@e5?@i?@m?@r.?@v?@z?@$?@v?@?@?@k?@?@?@_?@?@?@R?@?@?@C?@?@?@4?@Ȅ?@?@$?@s?@?@?@a?@?@?@N?@?@?@9?A?A?A $?A r?A?A ?A[?A?A"?A'B?A+?A/?A4)?A8v?A?B9?B=?BB ?BFR?BJ?BN?BS?BWc?B[?B_?Bd.?Bhr?Bl?Bp?Bu?DB?DG?DKI?DO~?DS?DW?D\?D`P?Dd?Dh?Dl?Dq ?DuT?Dy?D}?D?D!?DU?D?D?D?D ?DR?D?D?D?D?DL?D~?D?D?D?DD?Du?Dѥ?D?D?D8?Dh?D?D?D?D(?DX?D?D?E?E?E E?Et?E?E?E?E!.?E%]?E)?E-?E1?E6?E:B?E>p?EB?EF?EJ?EO%?ESR?EW?E[?E_?Ed?Eh0?El\?Ep?Et?Ex?E} ?E7?Eb?E?E?E?E?E9?Ed?E?E?E?E ?E6?E`?E?E?E?E?E/?EX?Eԁ?Eت?E?E?E#?EL?Et?E?E?E?E?F:?Fb?F ?F?F?F?F$?FK?F#q?F'?F+?F/?F4 ?F8/?F?F`?F?F?F?F?F?F(?FI?Fj?Fً?Fݫ?F?F?F ?F,?FL?Fl?F?F?G?G?G ?G(?GG?Gf?G?G?G#?G'?G+?G0?G4:?G8W?G?HB?HF?HJ?HO?HS?HW1?H[E?H_Y?Hcn?Hg?Hk?Ho?Hs?Hw?H{?H?H ?H?H0?HB?HU?Hg?Hz?H?H?H?H?H?H?H?H?H?H)?H:?HK?H[?Hl?H|?Hݍ?H?H?H?H?H?H?H?H ?I?I'?I 6?ID?IS?Ib?Io?I~?I"?I&?I*?I.?I2?I6?I:?I>?IB?IG?IK?IO?IS(?IW5?I[A?I_M?IcY?Ige?Ikp?Io|?Is?Iw?I{?I?I?I?I?I?I?I?I?I?I?I?I?I!?I*?I3?I?L/?L ?L?L?L?L?L?L?L?L?L?L?Ls?Lc?LR?LB?L0?L?L?L?L?L?L?Lܶ?L?L?L?Ln?L[?LI?L6?L#?M?M?M?M ?M?M?M?M?Ms?M#^?M'J?M+5?M/ ?M3 ?M6?M:?M>?MB?MF?MJ?MNv?MRa?MVK?MZ4?M^?Mb?Me?Mi?Mm?Mq?Mu?My~?M}g?MP?M8?M ?M?M?M?M?M?M?Mv?M]?ME?M+?M?M?M?M?Mì?Mǒ?Mw?M]?MC?M(?M?M?M?M?M?M?Ml?MP?M5?M?N?N?N ?N ?N?No?NR?N5?N!?N$?N(?N,?N0?N4?N8h?N?OC?OF?OJ?ON?ORx?OVP?OZ(?O^?Oa?Oe?Oi?Om^?Oq5?Ou ?Ox?O|?O?Oh?O=?O?O?O?O?Ol?OA?O?O?O?O?Ok?O@?O?O?O?Oő?Oe?O9?O ?O?Oش?O܇?O[?O.?O?O?O?Oy?OK?O?O?P?P?P e?P7?P?P?P?P|?P!M?P%?P(?P,?P0?P4`?P8/?P<?P??PC?PGo?PK>?PO?PR?PV?PZz?P^I?Pb?Pe?Pi?Pm?PqQ?Pu?Px?P|?P?PU?P#?P?P?P?PV?P"?P?P?P?PS?P?P?P?P?PN?P?P?Pȯ?Pz?PD?P?P?Pۣ?Pm?P7?P?P?P?P^?P'?P?P?Q?QJ?Q ?Q ?Q?Ql?Q4?Q?Q?Q#?Q'S?Q+?Q.?Q2?Q6p?Q:7?Q=?QA?QE?QIP?QM?QP?QT?QXh?Q\-?Q_?Qc?Qg}?QkB?Qo?Qr?Qv?QzU?Q~?Q?Q?Qf?Q)?Q?Q?Qt?Q7?Q?Q?Q?QC?Q?Q?Q?QL?Q?Q?Qő?QS?Q?Q?Qԗ?QX?Q?Q?Q?Q[?Q?Q?Q?Q\?Q?Q?R?RZ?R ?R ?R?RV?R?R?R?R#P?R'?R*?R.?R2H?R6?R9?R=?RA=?RD?RH?RLt?RP1?RS?RW?R[f?R_"?Rb?Rf?RjU?Rn?Rq?Ru?RyC?R|?R?Rs?R.?R?R?R]?R?R?R?RD?R?R?Rp?R)?R?R?RS?R ?R?R|?R4?R?RҤ?R\?R?R?R?R9?R?R?R]?R?R?R?R7?S?S?S X?S?S?Sy?S.?S?S ?S$M?S(?S+?S/j?S3?S6?S:?S>:?SA?SE?SIU?SM?SP?STn?SX!?S[?S_?Sc8?Sf?Sj?SnO?Sr?Su?Syd?S}?S?Sx?S)?S?S?S;?S?S?SL?S?S?S\?S ?S?Sj?S?S?Sw?S&?S?Sʄ?S2?S?SՎ?S?T?TΈ?T,?T?Tu?T?T?T`?T?T?TK?T?T?T4?T?Uz?U?U?U a?U?U?UG?U?U?U",?U%?U)n?U-?U0?U4Q?U7?U;?U?2?UB?UFs?UJ?UM?UQR?UT?UX?U\0?U_?Ucn?Ug ?Uj?UnJ?Uq?Uu?Uy%?U|?U`?U?U?U9?U?Us?U?U?UJ?U?U?U?U?UW?U?U?U*?U?Ua?U?Uȗ?U2?U?Ug?U?Uڜ?U6?U?Uj?U?U?U7?U?Ui?U?U?V4?V?V e?V ?V?V.?V?V]?V?V"?V&#?V)?V-R?V0?V4?V8?V;?V?C?VB?VFp?VJ?VM?VQ1?VT?VX\?V[?V_?Vc?Vf?VjE?Vm?Vqm?Vu?Vx?V|*?V?VR?V?Vy?V ?V?V2?V?VX?V?V}?V?V?V3?V?VW?V?Vz?V ?VÜ?V-?Vʾ?VO?V?Vp?V?Vܐ?V!?V?V@?V?V`?V?V~?V ?V?W*?W?WH?W ?Wd?W?W?W?W?W )?W#?W'D?W*?W.^?W1?W5w?W9?W?XA?XE?XH?XL!?XO?XS$?XV?XZ'?X]?Xa'?Xd?Xh(?Xk?Xo)?Xr?Xv(?Xy?X}'?X?X&?X?X%?X?X!?X?X?X?X?X?X?X?X?X?X ?X?X?X?X?X|?X?Xu?X?Xm?X?Xd?X?X[?X?XR?X?XH?X?X=?X?X2?Y?Y&?Y?Y ?Y?Y ?Y?Y?Yx?Y ?Y$h?Y'?Y+Z?Y.?Y2J?Y5?Y9:?Y?[A?[EF?[H?[L ?[Ok?[R?[V.?[Y?[\?[`Q?[c?[g?[jr?[m?[q3?[t?[w?[{R?[~?[?[p?[?[.?[?[?[J?[?[?[e?[?[ ?[~?[?[9?[?[?[P?[?[ ?[f?[?[?[{?[?[2?[َ?[?[E?[?[?[V?[?[ ?[e?[?[?[t?\?\'?\?\ ?\4?\?\?\@?\?\?\#I?\&?\)?\-R?\0?\4?\7X?\:?\>?\A_?\D?\H ?\Kc?\N?\R?\Uf?\X?\\?\_i?\b?\f?\ii?\l?\p?\si?\v?\z?\}f?\?\?\c?\?\ ?\_?\?\?\Y?\?\?\R?\?\?\I?\?\?\@?\?\?\4?\Ɔ?\?\(?\y?\?\?\k?\ݻ?\ ?\\?\?\?\K?\?\?\9?\?\?]&?]u?]?] ?]_?]?]?]I?]?]?]#1?]&~?])?]-?]0f?]3?]6?]:J?]=?]@?]D/?]G{?]J?]N?]Q\?]T?]W?][>?]^?]a?]e?]hg?]k?]n?]rF?]u?]x?]|#?]l?]?]?]F?]?]?] ?]i?]?]?]@?]?]?]?]^?]?]?]2?]y?]?]?]M?]ǒ?]?]?]d?]ԩ?]?]4?]x?]?]?]G?]?]?]?]X?]?]?]#?^g?^?^?^ 0?^r?^?^?^;?^}?^?^#?^&B?^)?^,?^0?^3I?^6?^9?^= ?^@L?^C?^F?^J ?^MN?^P?^S?^W ?^ZL?^]?^`?^d ?^gI?^j?^m?^q?^tC?^w?^z?^}?^5?`A^?`D?`G?`J?`N?`Q*?`TS?`W{?`Z?`]?``?`d?`gB?`ji?`m?`p?`s?`w?`z-?`}R?`y?`?`?`?`?`7?`[?`?`?`?`?`?`:?`]?`?`?`?`?`?`5?`X?`{?`ş?`?`?`?`*?`L?`n?`ې?`޲?`?`?`?`9?`Y?`z?`?`?`?`?a?a=?a]?a }?a ?a?a?a?a?a9?a X?a#w?a&?a)?a,?a/?a3?a6,?a9I?a?d 8?d#1?d&+?d)$?d,?d/?d2 ?d5?d7?d:?d=?d@?dC?dF?dI?dL?dO?dR?dU?dX?d[?d^?da?ddw?dgm?djb?dmW?dpM?dsB?dv7?dy,?d|!?d?d ?d?d?d?d?d?d?d?d?d?d?d?dt?df?dY?dJ?d?gAx?gDG?gG?gI?gL?gO?gRS?gU"?gW?gZ?g]?g`Z?gc(?ge?gh?gk?gn^?gq+?gs?gv?gy?g|_?g*?g?g?g?gZ?g&?g?g?g?gS?g?g?g?g~?gH?g?g?g?go?g8?g?g?g?g\?g%?g?gǶ?g?gG?g?g?g՞?ge?g-?g?g?g?gH?g?g?g?gb?g(?g?g?gy?g>?h?h?h?h R?h ?h?h?hd?h(?h?h?h s?h#6?h%?h(?h+?h.C?h1?h3?h6?h9L?h<?h>?hA?hDS?hG?hI?hL?hOX?hR?hT?hW?hZZ?h]?h_?hb?heZ?hh?hj?hm?hpW?hs?hu?hx?h{R?h~?h?h?hJ?h?h?h?hA?h?h?hx?h4?h?h?hj?h&?h?h?hY?h?h?h?hF?h?h?hv?h0?h?hʥ?h_?h?h?hՋ?hE?h?hݷ?hp?h)?h?h?hR?h ?h?hz?h2?h?h?hW?i?i?i|?i 3?i ?i?iU?i ?i?iw?i-?i?i!?i$L?i'?i)?i,k?i/?i1?i4?i7;?i9?i?oA.?oC?oE?oH,?oJ?oL?oO(?oQ|?oS?oV#?oXv?oZ?o]?o_o?oa?od?ofg?oh?ok ?om]?oo?or?otR?ov?ox?o{E?o}?o?o8?o?o?o(?ox?o?o?og?o?o?oT?o?o?o@?o?o?o*?ox?o?o?o`?o?o?oH?o?o?o-?oz?o?o?o^?oɩ?o?o@?oЋ?o?o!?ol?oٷ?o?oK?o?o?o)?or?o?o?oN?o?o?o(?oq?o?o?oI?p?p?p!?ph?p ?p ?p=?p?p?p?pW?p?p?p)?p o?p"?p$?p'??p)?p+?p. ?p0R?p2?p4?p7?p9c?p;?p=?p@-?pBq?pD?pF?pI:?pK}?pM?pP?pRC?pT?pV?pY ?p[K?p]?p_?pb?pdO?pf?ph?pk?pmQ?po?pq?pt?pvQ?px?pz?p}?pN?p?p?p ?pI?p?p?p?pA?p?p?p?p7?pt?p?p?p)?pf?p?p?p?pV?p?p?p?pC?p~?p?p?p.?ph?pĢ?p?p?pP?p͉?p?p?p5?pn?pا?p?p?pP?p?p?p?p0?pg?p?p?p ?pC?pz?p?p?p?pS?q?q?q?q*?q _?q ?q ?q?q2?qg?q?q?q?q7?qk?q!?q#?q&?q(8?q*k?q,?q.?q1?q35?q5g?q7?q9?q;?q>.?q@_?qB?qD?qF?qI#?qKT?qM?qO?qQ?qT?qVD?qXs?qZ?q\?q_?qa0?qc_?qe?qg?qi?ql?qnF?qpt?qr?qt?qv?qy*?q{W?q}?q?q?q ?q6?qb?q?q?q?q?q?r@?rB?rE?rG;?rIY?rKw?rM?rO?rQ?rS?rV?rX%?rZB?r\^?r^{?r`?rb?rd?rf?ri?rk!?rm?s@?sB?sD?sF?sH?sJ?sM?sO?sQ?sS!?sU+?sW4?sY=?s[F?s]O?s_W?sa_?scg?seo?sgw?si?sk?sm?so?sq?ss?su?sw?sy?s{?s}?s?s?s?s?s?s?s?s?s?s?s?s?s?s?s ?s?s?s?s?s?s?s!?s#?s&?s(?s*?s,?s-?s/?s0?s1?s2?s3?s4?s5?s4?s5?s5?s5?s5?s4?s4?s2?s2?s1?s/?s.?s-?s+?s)?s'?s%?s"?s ?s?s?s?s?s?s ?s ?s?s?s?s?t?t?t?t?t ?t ?t ?t?t?t?t?t?t?t?t?t?t!?t#?t%?t'?t)z?t+s?t-k?t/c?t1[?t3R?t5J?t7A?t98?t;/?t=&?t??tA?tC ?tD?tF?tH?tJ?tL?tN?tP?tR?tT?tV?tX?tZ?t\|?t^p?t`d?tbW?tdK?tf??th2?tj%?tl?tn ?to?tq?ts?tu?tw?ty?t{?t}?t?t}?tn?t_?tP?tA?t0?t!?t?t?t?t?t?t?t?t?t?tz?ti?tW?tE?t3?t ?t?t?t?t?t?t?t?t?tv?tb?tN?t:?t%?t?t?t?t?t̾?tΨ?tГ?t}?tg?tR?t?t&?t?t?t?t?t?t?tz?ta?uG?u.?u?u?u?u ?u ?u ?uv?u[?u@?u%?u ?u?u?u?u?u ?u"b?u$E?u&)?u( ?u)?u+?u-?u/?u1y?u3\?u5>?u7 ?u9?u:?u?u@?uBh?uDI?uF)?uH ?uI?uK?uM?uO?uQj?uSI?uU)?uW?uX?uZ?u\?u^?u`a?ub@?ud?ue?ug?ui?uk?umq?uoO?uq,?us?ut?uv?ux?uzz?u|V?u~2?u ?u?u?u?uz?uU?u0?u ?u?u?u?ur?uL?u&?u?u?u?u?uc?u?v?v?v?vA?v?v?v?vB?v?v?v?v@?v?v?v}?v;?v?vǸ?vv?v4?v?vί?vl?v*?v?vդ?va?v?v?vܗ?vR?v?v?v?vB?v?v?vs?v.?v?v?v^?v?v?v?vF?v?v?vr?v+?w?w?wV?w?w?w ?w 7?w ?w?w]?w?w?w?w:?w?w?w]?w?w?w!?w#5?w$?w&?w(U?w* ?w+?w-t?w/)?w0?w2?w4E?w5?w7?w9a?w;?w{?w@-?wA?wC?wEE?wF?wH?wJ\?wL ?wM?wOq?wQ"?wR?wT?wV5?wW?wY?w[F?w\?w^?w`W?wb?wc?wee?wg?wh?wjr?wl!?wm?wo~?wq,?wr?wt?wv6?ww?wy?w{??w|?w~?wE?w?w?wK?w?w?wO?w?w?wQ?w?w?wR?w?w?wR?w?w?wP?w?w?wL?w?w?wH?w?w?wA?w?w?w:?w?w?w1?w?w?w&?w?ws?w?w?wf?w ?wDz?wW?w?w̢?wH?w?wё?w6?w?w?w#?w?wk?w?w޲?wU?w?w?w??w?w?w&?w?wk?w ?w?wP?w?w?w4?w?wu?w?w?wW?x?x?x7?x?xv?x ?x ?x S?x ?x?x/?x?xl?x ?x?xE?x?x?x?x?x!W?x"?x$?x&-?x'?x)e?x+?x,?x.8?x/?x1o?x3 ?x4?x6@?x7?x9u?x;?xC?x??xAw?xC?xD?xFB?xG?xIt?xK ?xL?xN>?xO?xQn?xS?xT?xV5?xW?xYd?xZ?x\?x^(?x_?xaU?xb?xd?xf?xg?xiB?xj?xlm?xn?xo?xq,?xr?xtT?xu?xw}?xy?xz?x|8?x}?x_?x?x?x?x?x=?x?xa?x?x?x?x?x:?x?x[?x?x}?x?x?x.?x?xN?x?xm?x?x?x?x?x8?x?xU?x?xr?x?x?x?x?x5?x?xP?x?xi?x?x?x?xŚ?x%?xȱ?x=?x?xS?x?xi?x?x~?x?x֒?x?x٦?x0?xܹ?xB?x?xU?x?xf?x?xw?x?x?x?x?x?x?x-?x?x;?x?xH?x?xU?x?xa?x?yl?y?yw?y?y?y ?y ?y ?y ?y?y?y?y?y&?y?y,?y?y2?y?y7?y?y!?yF?yH:?yI?yK5?yL?yN0?yO?yQ*?yR?yT#?yU?yW?yX?yZ?y[?y] ?y^?y`?ya~?yb?yds?ye?ygh?yh?yj]?yk?ymQ?yn?ypD?yq?ys6?yt?yv(?yw?yy?yz?y| ?y}?y~?yq?y?y`?y?yN?y?y?{t?{?{?{?{M?{?{?{?{"?{W?{?{?{?{*?{^?{?{?{?{-?{a?{?{?{?{,?{_?{?{?{?{(?{Y?{?{?{?{?{P?{?{?{?{?{A?{q?{š?{?{?{/?{^?{ˍ?{̼?{?{?{G?{u?{ң?{?{?{,?{Y?{؇?{ٳ?{?{ ?{9?{e?{ߒ?{?{?{?{@?{l?{?{?{?{?{A?{l?{?{?{?{?{=?{f?{?{?{?{ ?{2?{[?{?{?{?{?|"?|I?|p?|?|?|?| ?|1?| X?| ~?| ?| ?| ?|?|9?|^?|?|?|?|?|?|9?|]?|?|?|?|?| ?| 0?|!S?|"u?|#?|$?|%?|&?|(?|)A?|*b?|+?|,?|-?|.?|0?|1'?|2G?|3h?|4?|5?|6?|7?|9?|:$?|;C?|?|??|@?|A?|C?|D4?|ER?|Fo?|G?|H?|I?|J?|K?|M?|N7?|OS?|Po?|Q?|R?|S?|T?|U?|W?|X,?|YG?|Za?|[{?|\?|]?|^?|_?|`?|b?|c-?|dF?|e^?|fw?|g?|h?|i?|j?|k?|m?|n?|o5?|pL?|qb?|ry?|s?|t?|u?|v?|w?|x?|z?|{(?||=?|}R?|~g?||?|?|?|?|?|?|?|?|?|.?|A?|T?|f?|y?|?|?|?|?|?|?|?|?|?|)?|9?|J?|Z?|j?|z?|?|?|?|?|?|?|?|?|?|?| ?|-?|;?|I?|V?|d?|q?|~?|?|?|?|?|?|?|?|?|?|?|?| ?|?|#?|-?|8?|B?|L?|V?|`?|i?|s?||?|Ʌ?|ʎ?|˗?|̟?|ͨ?|ΰ?|ϸ?|?|?|?|?|?|?|?|?|?|?|?| ?|?|?|?|"?|'?|,?|1?|6?|;?|??|C?|G?|K?|O?|S?|V?|Y?|\?|_?|b?|e?|g?|i?|k?|m?|o?|q?|r?|s?|u?|u?|v?|w?|w?|w?}x?}x?}w?}w?}v?}v?}u?}t?}r?} q?} o?} n?} l?} j?}h?}e?}b?}`?}]?}Z?}W?}S?}P?}L?}H?}D?}@?}/?}?%?}@?}A?}B?}B?}C?}D?}E?}F?}G?}H?}I?}J?}K?}L?}Ms?}Nf?}OY?}PK?}Q>?}R0?}S"?}T?}U?}U?}V?}W?}X?}Y?}Z?}[?}\?}]}?}^m?}_]?}`L?}a?}?}?~?~?~T?~%?~?~?~?~f?~6?~?~?~ ?~ t?~ C?~ ?~ ?~ ?~~?~L?~?~?~?~?~Q?~?~?~?~?~R?~?~?~?~?~N?~?~?~?~{?~F?~ ?~ ?~!?~"p?~#:?~$?~$?~%?~&a?~'*?~'?~(?~)?~*N?~+?~+?~,?~-n?~.6?~.?~/?~0?~1S?~2?~2?~3?~4n?~54?~5?~6?~7?~8L?~9?~9?~:?~;`?~<%?~s?~?6?~??~@?~A?~BE?~C ?~C?~D?~EQ?~F?~F?~G?~H[?~I?~I?~J?~Ka?~L#?~L?~M?~Ne?~O&?~O?~P?~Qg?~R'?~R?~S?~Tf?~U%?~U?~V?~Wa?~X ?~X?~Y?~Z[?~[?~[?~\?~]R?~^?~^?~_?~`E?~a?~a?~b{?~c7?~c?~d?~ej?~f&?~f?~g?~hW?~i?~i?~j?~kA?~k?~l?~mo?~n(?~n?~o?~pT?~q ?~q?~r~?~s7?~s?~t?~u_?~v?~v?~w?~x=?~x?~y?~zb?~{?~{?~|?~};?~}?~~?~\?~?~?~|?~1?~?~?~O?~?~?~k?~?~?~?~9?~?~?~R?~?~?~i?~?~?~?~0?~?~?~D?~?~?~V?~?~?~g?~?~?~v?~&?~?~?~3?~?~?~??~?~?~I?~?~?~R?~?~?~Y?~?~?~_?~ ?~?~c?~?~?~f?~?~?~g?~?~?~g?~?~?~e?~?~?~a?~ ?~?~]?~?~?~V?~?~?~O?~?~?~E?~?~?~;?~?~?~.?~?~z?~ ?~?~l?~?~?~\?~?~å?~J?~?~Œ?~6?~?~~?~!?~?~h?~ ?~ʮ?~Q?~?~̖?~8?~?~|?~?~Ͽ?~a?~?~ѣ?~D?~?~Ӆ?~&?~?~f?~?~֥?~E?~?~؄?~#?~?~`?~?~۝?~;?~?~w?~?~޳?~P?~?~?~'?~?~`?~?~?~5?~?~m?~?~?~??~?~u?~?~?~D?~?~y?~?~?~F?~?~x?~?~?~C?~?~t?~ ?~?~V?>??X???@X?@?AY?A?BX?B?CW?C?DU?D?ER?E?FO?F?GK?G?HF?H?IA?I?J;?J?K5?K?L-?L?M%?M?N?N?O?O?P ?P?P?Qy?Q?Rn?R?Sb?S?TU?T?UG?U?V9?V?W*?W?X?X?Y ?Y?Y?Zp?Z?[^?[?\K?\?]8?]?^$?^?_?_?_?`o?`?aY?a?bB?b?c*?c?d?d?d?el?e?fR?f?g8?g?h?h?i?ir?i?jU?j?k7?k?l?l?l?mj?m?nJ?n?o)?o?p?pw?p?qU?q?r1?r?s?s|?s?tW?t?u2?u?v ?vx?v?wQ?w?x)?x?y?ym?y?zC?z?{?{?{?|Y?|?}-?}?~?~j?~?=???w??H?????O?????S?????Q?????L???z??C?? ?n??5???^??#???J?? ?o??1???T???u??5???S???p??-???H???a???x??1???F???Z???l??!?|??1???????K???V???_???g???n???r???v??"?x??#?x??"?w?? ?t???p???j???c???Z???P???D???7???(?x???g???U???A???,?z???b???J???/?|???_???A???"?l???K???(?r???M?•??&?n?÷??F?Ď???c?Ū??7?~?? ?P?Ǖ?? ?e?Ȫ??4?x?ɽ??E?ʉ???S?˖???_?̢??&?h?ͪ??-?n?ί??1?r?ϲ??3?s?г??2?q?Ѱ??.?m?ҫ??(?f?ӣ???\?ԙ???O?Ռ???@?|?ָ??.?i?פ???T?؏???0 3>0H0"N@@*PW  lcoshcosh: input value was NAN cosh: input value was INF   "( DRv.text .dataX.bss_errno_write_matherr_s_cosh_r_cosh_R_cosh mcountUNDERFLOWcontgreaterr_exp.o/ 568278252 98 100 100664 9486 ` u!<# .text" .data @.bss" " `P`P`ȓPP?6,Dz% 1p2)#$43$2%#WPBPv' ?G0e+50`9F4 P?1r7%`bDz% 1p2)#$43$2%#@ .Dz% 1p2)#x$43x$2%#jPBPV' ?G0e+50`9F4 P?1r7%`bDz% 1p2)#x$43x$2%#@*AN8 .44>0H0r"N@@(PW 8 "@*AN8 .43>0H0"N@@*PW  expexp: input value was NAN exp: input value was INF ?? ?A?bt?V?@?3?.?2?(>?IS?jp????:??1?S*?t??g??f??=?_$??x?/???)?Kb?mE?0?$? ?%?3?9J?[i?}???>??(?K9?m? ??????b:??'?̪?7??7l?[?~??D?? ?1?U?y???? ?-?R ?v>?y?? ?c?+?P.?t???3??+n?P?t??T?%??,?Q?v???? ?0(?UX?z??!?w??5??Z?.??D???<,?a??k?>???D?j????4?)^?O?u??k??+?5?\??#?Ϻ?[??C?jx?@????,?S?z??? ?5?>k?e??I?ۨ??*?Q?y??ȱ?V????g?O?'? ??.?V?~? ?-?W??G?p?e??*??:?b?0??q?"?-?V?q?K?0??#?L?u+?D?g???C?l_?????;?e??K?? ?5s?_@?????0?Z? ?.?\??-?X'???T??,S?V?}?#???,U?W'?????-?X??=?r??0?\Q???ޕ? ?5?a=???I??;?g?????C?o??,?m? ?M?yu??]??+s?X??j?(? ?7?d?????E?r??N??'?UJ??-?ݰ? >?8?f~?0????Kk?yW?O?S?b?1}?_???`??G?u??҇??/?^a?????He?wW?T?^?t?3?b??C???O^?~?W?? ?=)?l??h?@?,$?\???1?R?L?|??U? ?>!?n??ϯ?M?0?a?q?A??%?U?? ?%?L?K?|??h??BA?s?M???:??k??ϣ??3{?ez?×?ɞ??-?`6?Ē??A?)?\3?Ŏ?Y??&?Yt?ƌB?ƿ??$?W?Nj ?Ǿ%?M?$?W?ȋ?Ⱦt??%V?X?Ɍm? ??'s?[:?ʏ???*?^?˒??P?/?c?̘5?̜??5?j"?͞?i?!??v?ٮP???U?ڍ?Ť??5?m?ۦ?_??O?܇|?ܿ??1?i?ݢx??y?F??'?bi??v??L?z?D??8?r???$?ڞ? ?U??и?f?L#????C???????,?k?/?]?(?g?F??&3?e?a??$?d??r?$s?d???%?eo??G?&?ga???)?j[?D?@ 9@ ]@ t@ @ p@ @ @ 2.@ U@ y@ >@ @ @ @ ,~@ Pe@ tU@ O@ Q@ ]@ r@ (@ L@ p@ #@ g@ ݳ@ @&i@J@oC@@C@@h@& @J@og@#@@ݹ@@'u@La@qW@V@^@p@@*@O@u@X@@@ V@/@U/@z@.@ż@T@@6@\U@@@ͬ@@m@?[@eT@V@b@w@@#@I@p/@v@@ @ @/@Vj@|@v@ @@S@>@d@@Z@5@@'@N@u@@&@F@q@8@_@,@@@B@$@L.@s@C@@@-@9@a@s@I@*@@) @Q @y@&@D@m@@A@j#@u@@7@ @4"@\@7@@u@$@'@P@yo@G@*@@ @ F@ o@ 7@ Y@ @!@!<@!fJ@!@!@!n@" @"5f@"^@"@")@"@#@#/M@#Y@#@#@#ּ@$@$*@$T@$~@$@$&@$]@%'@%Q@%|D@%@%@%@&&@&P@&{7@&@&Њ@&D@'& @'P@'{@'@'ъ@'@('@(R@(}@(@(@(S@)*@)U@)O@)@)/@*@*/;@*Z@*s@*!@*@+ @+5k@+aE@+*@+@+@,@,=0@,iM@,v@,@,@-4@-F@-r@-Y@-@-T@.$???}?;?~a?~#?~w?~6?}?}?}s?}3?|E?|?|p?|0L?{?{N?{n?{.?zM?z?zm?z-?y?y?yn?y.4?xr?x?xo?x/?w ?w?wq;?w1?v?v{?vt[?v5K?uL?u]?ux}?u9?t?t@?t}?t??t?s$?s?sEw?s7?r?r?rL?r?q?q ?qU;?q{?p?p*?p^?p!?o?oF?oh?o+?n?n]?ntI?n7F?mR?mn?m?mC?m?lx?l?lQZ?l?k{?k"?k_?k#?ju?jZ?joN?j3R?ie?i?i?iC?iK?h̪?h?hU?h$?g?gm?gh(?g,?f?f?f{?f@?f?e?e ?eUc?e?d?d?dk?d0?c/?c?c?cG_?c 8?b?b?b_?b%.?aQ?a?aw?a>?ap?`?`X?`W?`{?_"?_?_r?_9q?_S?^D?^C?^UQ?^m?]?]?]r?]9p?]?\I?\?\W\?\?[?[d?[v.?[>?[?Z?Z?Z]?Z&?YG?Y?Y~?YG(?Y?X?X?Xi?X1?Wk?W(?W?WT?W?V?V?Vx?VA?V ?UE?U?Uf?U0K?T?T@?T?TVm?T ?S?S?S}m?SGP?S@?R??RK?Roe?R9?R?Q?QW?Qb?Q-"?P?P$?P?PW]?P"?O?O?Os?OMZ?OO?NR?Nb?Ny?ND?N?M*?M~?Mq?M=N?M?LT?L?Lk?L7A?L?K?K?Kf?K2?J?Jʔ?J?Jb?J/?IU?Iǧ?I?I`r?I,?Hq?H?H?H_S?H,?G?Gū?G?G_}?G,y?F?Fƙ?F?F`?F.+?Ev?E?E2?Ec?E1!?D?DE?D?Dg?D5[?D'?C?C?Cl?C:?C?B?B?BsR?BA?B?A4?A?A{ ?AI?A?@?@Q?@?@R?@!??`??D??3??]0??,9?>O?>q?>?>h?>8"?>v?=?=C?=u?=EB?=?b?/?.?.?.J?.^?.2?.q?-?-n?-?-S?-'@?,?,ί?,x?,vL?,J+?,?+ ?+ ?+?+n0?+BR?+?*?*?*N?*g?*<?*?)?)?)?)b?)7\?) ?(?(?(m?(_M?(48?( /?'0?'O?7?(?!?$?.?rB?P^?.? ??&?n??d?By? ?U??T??yv?X?6?h????w?oP?N2?-? ? ? ??-?gJ?Fo?%?>">>EN>>¼>>@n>_>b>}u><>>>zg>9>C>>xa>8 >>>wc>7M>G>R>wl>7>>>x{>8>d>>z>;;>>>}>>>>>>B>*>y>>HF> >T>>N>`>.> >U>>>%>^S> >>;>g>*%>>M>q>4>>[>}F>@@>J>c>퉌>L> >d>>ZB>>^>>h>,{>O>1>x#><%>6>V>鈆>L>>p>>^X>">~>'>p>5>>e>Z>I_>r>ӕ>>^>#W>>#>s>9,>>p>(>O>>۫>⡟>g>->>>B>F> >U>>`V>&>>ߴF>{ >A>>ϩ>ޖ>]>$>>ݳ,>zr>A> )>Л>ܘ>_>'F>>۶>~s>FI>.>!>ڞ#>f3>.Q>}>پ>ه>OX>>1>ب>qC>9>>I>ה>\>%>>ַ>ր>I>>S>ե>n>8T>>D>Ԕ>^m>(>>ӻ>Ӆe>OF>4>1>ҭ;>wS>Ay> >>Ѡ=>j>5>|>>Д>_7>)>>Ͽm>ϊE>U*> >>ζ,>΁H>Lq>>>ͮ>>y>E >> >̧>sC>>> >{>ˢS>n8>:+>+>8>ʞR>jz>6>>A>ɛ>h>4>>͕>Ț4>f>3>_>2>ǚ>g>3>>>ƛ8>hg>5>>A>ŝ>k>8>>ӯ>ġR>o><> >`>æC>t4>B1>;>R>¬u>z>H>,>>>U>P>[>>>C>Y>(>>}>k>df>3m>>ѡ>>p>?M>>>i>|>Ld>>>:>>Z>*" "" """( "P"Z"""""@"J"t" """"""" "."R"\"h"r".text.data.bss" _errno_write_s_exp_r_exp_R_exp mcount_matherrUNDERFLOWr_lg10.o/ 568278259 98 100 100664 1310 ` u!<.text .datat@.bsshh`PP`XP``P?Fx     ?  ?  ?# 0?$& %"0?M$2@?^&C%$% @?1r)%@##@]&WWd8 .41>0H0  !PW8 .42>0H0 !.2 `PW 2PWlog10log10: SING error log10: DOMAIN error log10: input value was NAN log10: input value was INF "(  B`lv.text.data.bssh_errno_write_matherr_s_log10_r_lg10_R_lg10 _r_alg10_R_alg10 mcountUNDERFLOWr_log.o/ 568278266 98 100 100664 1302 ` u!< .text .datax@.bss`pP`xP`P? Wpx 0  0?  ? 0; )@?1r%P?#P0?$& %"42%3@@/#4P?M#R%5%#% 0#@>%$#W0?M$2@?^&C%$% 0##Wd8 .41>0H0֎ % !PW8 .42>0H0v `!.R 4PW8 PWloglog: SING error log: DOMAIN error log: input value was NAN log: input value was INF   "( ,8BLn.text.datax.bss_errno_write_matherr_s_log_r_log_R_log mcountUNDERFLOWr_sin.o/ 568278274 98 100 100664 1556 ` u!=.text .datahT@.bss00?"94[.(#pQ `Pҋ` P`(P  I[^?I/?7.~ $!?"%0 0P5!@T)U$P`p p7U΀Ltv4%v,%r#x#Wp#uހ?!wG)w$p#p$#Pހ8d%!dd6#1%###?%~P  ! $ F@% 2p2)"$#43$2%# R " $^" P WP"W@9QB@A?$O!d'"@@ !PTD-6$09A4$7"1  ?#!@I%!lF@% 2r2)"$#43$2%#A^@*BN8 ȧ.45>0H0, "N@@&PW Z Dsinsin: TLOSS error sin: input value was NAN sin: input value was INF *0 :@ JP f h n p D^jt~.text.datah.bss0_errno_write_matherr_s_sin(_r_sin8_R_sinHmcountSinTableCosTableUNDERFLOWpi_reducer_sinh.o/ 568278281 98 100 100664 1094 ` u!= ( .text .dataX4@.bss`P`P`P  ?@!,!%"09SL[%2@<#4%2@>*#4%#%!# F@ !1$2@?%$!BT)U$%P?%5P9%##!%"0=lVe%2P@#5%0A##$!&.$(PTQ0?#1 ?�`S%$ ?# `B  W@*AN8 .44>0 3>0H0"N@@*PW x bsinhsinh: input value was NAN sinh: input value was INF   "( "N\.text .dataX.bss_errno_write_matherr_s_sinh_r_sinh_R_sinh mcountUNDERFLOWcontgreaterr_sqrt.o/ 568278325 98 100 100664 42184 ` u!=5.text .dataD@.bss88`ؓP`P`Pڌ@8ѷ@@?,F@% 1r2)#$43$2%#WP PT0 50DSqQ  ?F@% 1r2)#$43$2%#UqQ  >|@ ?qp8 &!#  &!#  aBD$U BqApJpM ?% ?5%W1>0P^48H0  j!PWsqrtsqrt: DOMAIN error <# =gj=kL=n=rR=u=y&c=|~=ˍ=="==K=U=bO==g`==\)==A===$===B===OS=-=4=Bz== =s=a\====Y=K=P=0=,=\=^====-=Q=tL====x=T==5;=JT=]=o=ŀ=Ə=ǝF=ȩ=ɴa=ʽ===K=~=l==ۉ===՛=F==+=ؽm=ٴ=ڪ=۟=ܓ=݆k=xA=i=X=G=5="Z=>=.=/=B=j=蛬==g=L=/====V==t=R=/= ====u=N=&c====~=R=&n=T=ˍ>N>>>>X>U|>N>">>>Tx>>>e>>K>>+>vd>U>;>_> z> bO> > %)> /> > Gp> > > g`> > &> > >B5>o>k>\)>>>s>>-T>>>A>O>>S>> >dF>>>r>\>%>$>9>1>>=>:>>r>B>>>G>>>L>p>>N>R>>OS>>>N{>->>L >5>4> H> > *>!Bz>!>!>";l>">">#2># ># >$(>$z>$>%s>%n>%>&>&a\>&>'d>'R>'>'>(B>(Y>(>)1L>)>)Ϫ>*>*mu>*$>+ >+Y>+X>+w>,Cr>,K>,>-,>-z>-P>.{>.a>.k>.0>/G>/U>/>0,>0y>0>1>1\>1I>1>2?">2^>2{>3 y>3kW>3>4>4K7>4>4>5*>5t >5>6>6Qj>6>6j>7->7v>7>8 >8Q>8>8U>9+>9tL>9>:>:L>:>:>;$>;l;>;>;>><><>=>=^>=>=x>>3>>y>>>?T>?L>?>?ت>@>@dc>@>@>A5;>Az>A>B3>BJT>B\>BL>C$>C]>C>C>D+>Do>D8>Dh>E<>E>Ej>F=>FK>F>F(>G>GY>GF>Gx>H#>Hf>H>H^>I/ >Iq>Ia>I>J9K>J{>J>K>KB>K>K>L>LI>L9>L>ML>MO>M >MK>Nv>NT>N>N~>OX>OX>O>Ol>P>PZj>P>P>QR>Q[x>Q>Qۉ>Rt>R[K>R>R>S_>SY>Sa>S>T>TWV>T>T՛>U>US>Uw>UF>V>VN>VE>V>W =>WH>W>W+>XV>XAp>Xw>Xm>XQ>Y9$>Yv>Y>Y2>Z/>Zm:>Z>Z>[%D>[bz>[>[ܴ>\>\V>\>\]>] >]I>]k>]>]w>^;>^xA>^>^>_,>_i>_>_>`>`X>`>`f>a >aG>a:>a>a#>b5>bp>b >b;>c"Z>c]j>cj>c\>d>>dI>d>d>d.>e3>enL>e>e/>f>fW>f>fB>gb>g@s>gzv>gj>gP>h((>ha>h>hX>i>iH>i>i{>i>j.8>jg>j>j>k >kL>k>k>k>l/>lh>ld>l>m>mKP>m>mU>m>n-$>new>n>n>o">oFA>o~R>oV>oM>p&8>p^>p>pͨ>q_>q=>qt>q5>q>r.>rR>r>rE>r>s/>sf>s >s>t >tC>tz>t>t>u>uU=>u>u>u&>v/>vf0>v>v >w d>w?>wu>w->wX>xw>xN>x>x>x>y&c>y\<>y >y>y>z3,>zh>z_>z>{ d>{>>{t<>{>{>|*>|Ic>|~>|>|>}>}R>}>}>}>~&n>~[8>~>~ī>~T>->b>>ˍ>>4>4c>N>h>>>> >>>>9>S >l>>>>ԃ>X>)>!>;>U|>o8>>>N>>> 7>">U>o}>>>>s>>Q>!>;>Tx>m>%>u>>>E>>>7>Q>jA>e>>>ε>>>>2>K>d>}>>>Ȑ>s>Q>+>,>D>]>vd>'>>>U>> >#Z>;>T>m7>>_>>u>>z>>1m>I>bO>z>>>>7>> >%)>=q>U>m>/>f>>>>>9>/W>Gp>_>w>>>>ײ>>>>7>Ox>g`>D>$>>>ޫ>{>G>&>=>U>mN>>>i>>>a>>*>B5>Y>qZ>>o>>u>>k>>-R>D>\)>s>>O>>>T>>>.6>Ez>\>s>/>d>>>>>5>-T>Do>[>r>>>>>>>>*>A>X>o>j>O>0>>>>>&`>=,>S>j>z>8>>ũ>\> > > a>7>M>dF>z>y> >>+>>;>>/>>E>\3>r>>>>\>>">>%><2>R>h>$>o>>>9>v>>>1>GI>]u>s>>>>$>=>S>f>$u>:>P>f>|>>>>>r>b>O>,9>B>X>m>>>p>D>>>>t>29>G>]>ss>+>>>A>>> <> >6~>L>a>wL>>p>>͉>>>>#>9>N>d>yu>>R>>$>>>I>$>9>OS>d>y>D>>>>\>>>$>9G>N{>c>x>>->R>u>>> >!>6>L >a>v$>.>5>8>:>8>4> ->#>3>H>\>q>>>>q>O>*>>>->Bz>WH>l>>>c>#>>>S> >&>;l>P>d>yl>>>U>>>'> >P>2>Go>[>p> >>>Ž> >>>o>(>=Q>Q>f(>z>>X>>>q>> >s>1>F>Z_>n>>5>w>>>/>g>>$>9>M0>a\>u>>>>>1>L>d>{>*>>>R>f>z>>>>>>>>>.>B>V>j>~p>Y>@>$>>>> >v>1L>E >X>l>>X> >>Ϫ>k>+> >>2Z>F>Y>mu>$>>{>$>>m>> >K>1>E>Y>l>;>>X>>l>>w>>y>/>Cr>V>jc>}>K>>*>˖>>h>>1>,>?>SO>f>z>Y>>>P>ڞ>>3>{>'>;>NE>a>t>>4>k>>>>0>\>!>4>G>Z>n>8>U>p>>͡>>>>>,>@>S >f>y>>>>> >>>>#>6>I>\>o>>e>I>+> >>>>w>,M>?">Q>d>w>^>(>>·>{>>>> > y>33>E>X>kW>~ >>i>>>j>>>Y>%>8>K7>]>pl>>>->>O>>i>>|>*><>O >a>t >>>z>>g>>M>>+>,>?>Qj>c>v5>>>X>>>j>> >l>->@>R^>d>v>?>>>>Q>>> >F>->?>Q>d>vQ>>>>>.>U>z>>>+>=>P>b3>tL>c>x>>>έ>>>>>(>:>L>^>p>>>>>>>>>>$>6~>Hi>ZS>l;>~!>>>>ũ>ׇ>c>>> >>0>B>Th>f9>x>>>i>1>>>~>@>>)>;y>M4>^>p>Y> >>p>>>x>">>!q>3>D>V\>g>y>7>>l>>ћ>/>>T>>)s>:>L>^>o>">>*>>+>ت>&>> >>0 >A~>R>dc>u>A>>>>>R>>>|>#>5;>F>W>iN>z>>S>>>J>>>3>}>'>9>JT>[>l>~>\> >±>>L>>>>$>*V>;>L>]>o>À:>Ñc>â>ó>>>>:> X>u>+><>M>^>o>ā>Ē>ģ(>Ĵ8>F>S>^>h> p>w>+|><>M>^>o>ŀ>ő~>Ţy>ųr>j>a>V>J>=>.>*>; >K>\>m>~>Ə>Ơ>Ʊe>G>(>>>>>'x>8Q>I(>Y>j>{>njv>ǝF>Ǯ>Ǿ>ϭ>x>A>>>#>4V>E>U>f>wU>Ȉ>Ș>ȩ>Ⱥ>>>۪>^>> >q>/ >?>Px>a#>q>ɂs>ɓ>ɣ>ɴa>>դ>C>>}>>(>9K>I>Zx>k >{>ʌ0>ʜ>ʭP>ʽ>i>>~>>>!>1>B>R>c>s>˄>˔>˥>˵>>v>>`>>D>(>9#>I>Y>jg>z>̋9>̛>̬>̼j>>.>>>L>>/>?]>O>` >pc>̀>͑ >͡\>ͱ>>K>>>->v>#>4>DJ>T>d>u>΅Q>Ε>Υ>ζ >D>~>>>#>X>'>7>G>X>hK>xx>ψ>Ϙ>Ϩ>Ϲ >F>l>>> >>*>:2>JN>Zj>j>z>Њ>К>Ъ>к>>>)>8> E>R>+]>;g>Kp>[x>k~>{>ы>ћ>ѫ>ѻ>ˋ>ۉ>>> {>t>+k>;b>KW>[K>k>>{0>ҋ >қ>Ҫ>Һ>>>>> y>_>*C>:&>J >Y>i>y>Ӊ>әa>ө<>ӹ>>>>q>E>>'>7>G>WV>g#>v>Ԇ>Ԗ>ԦJ>Զ>>՛>_>!>>>$a>4>C>S>cP>s >Ղ>Ւw>բ->ձ>>F>>>U>>>/Z>?>N>^T>m>}>֍E>֜>֬>ּ*>>i>>> =>>)p>9>H>X4>g>w\>׆>ז>צ>׵>+>Ը>C>>V>>"e>1>Ap>P>`v>o>w>؎>؞t>ح>ؽm>>a>>Q> >=>)>9$>H>X>gv>v>نR>ٕ>٥*>ٴ>>e>>2>>> ]>/>?>N~>]>m:>|>ڋ>ڛK>ڪ>ڹ>R>ب>>P>>>%D>4>C>S.>bz>q>ہ>ېX>۟>ۮ>۾,>q>ܴ>>8> x>>(>83>Go>V>e>u>܄U>ܓ>ܢ>ܱ>*>]>ߎ>>> >J>+w>:>I>X>h>wE>݆k>ݕ>ݤ>ݳ>>>:>Y>w>>>,>;>J>Z>i+>xA>އV>ޖi>ޥ|>޴>Þ>Ү>>>>>>,>;>K>Z >i>x>߇>ߖ>ߥ>ߴ>>>>>> >>+>:>I>X>g>v>>>ࣛ>ಋ>y>f>S>>>)> >>)>8>G>V>ev>tY>:>>>>ᾷ>͓>o>J>#>>>&>5>DU>S)>a>p>>o>>> >>ɦ>q>;>>>>"Z>1 >?>N>]j>l,>z>㉬>j>(>>ġ>\>>>>>>>+>:]>I>W>ft>u%>>䒃>0>>侉>3>>>.>>{>% >3>Bh>Q >_>nL>|>勊>(>>a>>Ԗ>/>>^>>>,>:>ID>W>ff>t>情>>栠>,>潷>B>>T>>b>>#l>1>@s>N>]w>k>zv>>r>>j>>_>>P>> >>>((>6>E>S>a>pa>~>>>蛬>>踃>>X>>)>>>[>+>:#>H>V>eH>s>>f>>>{>>0>>>8>>>.8><>J>Y0>g>u>!>o>꠼> >U>ˠ>>3>{>> >!O>/>=>L>Z]>h>v>>^>롛>>>P>ڋ>>>5>l>!>/>> >L@>Zr>h>v>>5>d>쯑>콾>>>@>i>>> >/>=+>KP>Ys>g>u>>>>7>U>q>؍>>>>> >-$>;:>IO>Wc>ew>s>>>>>>>>>>>">+>*3>8:>FA>TF>bK>pO>~R>T>V>V>V>U>T>Q>M>I> D>>>&8>40>B(>P>^>l >y>>>>>>ͨ>ۗ>>r>_>J>!5>/>=>J>X>f>t>>n>R>5>>>>>>t> R>.>) >6>D>R>`p>nH>|>>>>r>E>>>>>X>&>!>/>=>KW>Y!>f>t>|>C> >>>X>>>>`> >>'>5\>C>P>^>lL>z>>w>/>>>Q>>>m>>>>,2>9>G>U=>b>p>~B>>>?>>>6>>>&>>m>">/>=R>J>X>f0>s>k>>>=>>q> >>8>> d>>$>2 >?>ME>Z>hf>u>>>>->>D>>X>>i> >w>%>3>A>N>\>i>w>>>>>> >Ո>>>> r>>&c>3>AQ>N>\<>i>w$>> >{>>\>>:>>>> >X>%>3,>@>M>[e>h>v1>>>_>>%>Ɔ>>H>>> d>>$>1z>>>L0>Y>f>t<>>>A>>>@>ѓ>>8>>>*>!y>.><>Ic>V>c>qF>~>>#>l>>>@>ۆ>>>R>>>+>8Y>E>R>`>mT>z>> >E>>>>*>b>>> >:>&n>3>@>N>[8>hi>u>>>%>R>>ī>>>+>T>}>> >->;>H>>Ub>b>o>|>>>/>O>n>ˍ>ث>>??? ??4? ?'L?-?4c?:?Ax?H?N?U?[?b(?h?o9?u?|H??V??c??o??y????ʉ? ?׏???????? ????%?,?2?9???F?L?S ?Y?`?f}?l?ss?y?h??\??O??@??0???ǖ? ?ԃ??n??X??A??)????!?(f?.?5J?;?B+?H?O ?U|?[?b[?h?o8?u?|???\??5?? ?x??N?¹?#?ύ??_??1???i?? 7???j?"?)5?/?5?7?D?J?Q?Wc?]?c?jA?p?v?}?e???=????Y???+?p?ε?????? ?N???? X??? ?&]?,?2?9??^?E?K?R?X[?^?d?k?qR?w?}? ?E????3?n????W?Ȑ???;?s????Q??? ?+?a??%?,?25?8i?>?D?K?Q7?Wj?]?c?j?p3?vd?|???'?W?????C?q????(?U?߂????1?]?? ???1?#Z?)?/?5?;?B&?HN?Nu?T?Z?`?g?m7?s]?y?????;?_??????2?T?u?՗?۸????;?Z? z? ? ? ? ? ? %2? +P? 1m? 7? =? C? I? O? V? \4? bO? hj? n? t? z? ? ? ? ? 8? Q? i? ? ? ? ? ? ? ? !? 7? M? b? w? ? ? ? ? ? ? ? ? %)? +;? 1M? 7_? =q? C? I? O? U? [? a? g? m? t? z? ? /? =? K? X? f? s? ? ? ? ? °? ȼ? ? ? ? ? ? ? ? ? ?  ? )? 1? 9? A? #I? )P? /W? 5^? ;d? Aj? Gp? Mv? S|? Y? _? e? k? q? w? }? ? ? ? ? ? ? ? ? ? ? ? Ų? ˲? Ѳ? ײ? ݲ? ? ? ? ? ? ? ? ? ? ? ? %? +? 1? 7? =? C? I}? Ox? Ur? [l? af? g`? mY? sR? yK? D? ?}!??????o?Q?2????õ?ɕ?u?T?4??????k?I? &????!?'v?-R?3-?9 ?>?D?J?Pu?VO?\)?b?g?m?s?yh?@?????x?O?&?????V?+???ܫ??T?(????v? I????"?(d?.6?4?9???Ez?KJ?Q?V?\?b?hY?n(?s?y??a?/????d?1????a?,???֍?X?"????I??? ?m?5??!?'?-T?3?8?>?Do?J5?O?U?[?aK?g?l?r?x^?~"???m?0???y?;????B???ԅ?E????E????A? ??{?9?$?*?0q?6.?;?A?Gc?M?R?X?^R?d ?i?o?u=?z??j?$???O???x?0???W???{?1???S? ??s?(? ??E?? ?&`?,?1?7y?=,?B?H?NB?S?Y?_W?e?j?pj?v?{?z?*???8???D???N??ũ?V??֯?\???`? ??b? ? ?b? ?? a?& ?+?1]?7??4?:|?@?E?KX?P?V?\3?a?gn?m ?r?xE?}?~???R???$??Z???)??\??׏?(??Z???"??R? ???? E?%?+q?1?6?<2?A?G]?L?R?X?]?cC?h?nk?s?y?$??J??o???$??F??h??lj??ҩ?9??X??v???!?? =??Y?? s?&?+?1?6?<1?A?GI?L?R`?W?]u?c?h?n?s?y)?~?q?C?I.?N?S?YG?^?d?i_?n?t?yu?~?-???A???R???b???q??$?}??0???:???B?? ?I???N?$?)?/Q?4?9??S?D?I?OS?T?Y?_R?d?i?oO?t?y?J???D????C?I.?N{?S?Y?^_?c?h?nC?s?x?~$?o???O???-?v?? ?R???,?u?ҽ??M???#?j?????? ??W??!?'(?,m?1?6?<?!o?!?!?!?!2?!c?!?!?!?!#?!S?!ɂ?!α?!?!?!>?!m?!?!?!?!%?!S?"?"?" ?" ?"6?"b?"!?"&?"+?"1?"6@?";l?"@?"E?"J?"P?"UD?"Zo?"_?"d?"i?"o?"tB?"yl?"~?"?"?"?";?"d?"?"?"?"?"-?"U?"}?"?"?"?"?"A?"h?"?"?"?"?"'?"M?"r?#?# ?#?#?#,?#P?##u?#(?#-?#2?#8?#=(?#BL?#Go?#L?#Q?#V?#[?#a?#f@?#kb?#p?#u?#z?#?# ?#+?#L?#m?#?#?#?#?#?#/?#O?#o?#Ž?#ǭ?#?#?# ?#)?#G?#f?#?#?#?#?#?$?$ 5?$R?$o?$?$?$#?$(?$-?$3?$85?$=Q?$Bl?$G?$L?$Q?$V?$[?$a?$f(?$kB?$p\?$uv?$z?$?$?$?$?$?$'?$??$X?$p?$?$?$?$?$?$?$?$-?$C?$Z?$q?$?$?$?$?$?$?% ?% ?%5?%J?%^?%s?%"?%'?%,?%1?%6?%;?%A?%F?%K&?%P9?%UL?%Z_?%_r?%d?%i?%n?%s?%x?%}?%?%?%?%$?%5?%E?%V?%g?%w?%?%?%?%?%?%?%?%?%?%?% ?%/?%=?%K?%Y?%g?&u?&?& ?&?&?&?&?&$?&)?&.?&3?&9?&> ?&C?&H$?&M0?&R;?&WF?&\Q?&a\?&ff?&kq?&p{?&u?&z?&?&?&?&?&?&?&?&?&?&?&?&?&?& ?&?&?&"?&*?&1?&8?&??&E?&L?&R?&X?&_?'d?'j?' p?'u?'{?'?' ?'%?'*?'/?'4?'9?'>?'C?'H?'M?'R?'W?'\?'a?'f?'k?'p?'u?'z?'?'?'?'?'?'?'?'?'?'?'?'?'?'?'?'?'?'?'?'?'?'?'?'?'?'?(?(?( ?(?(?(?(?($?()?(.?(3?(8?(=?(B?(G?(L?(Q?(V?([?(`?(e?(j?(o?(t{?(yv?(~p?(k?(e?(_?(Y?(S?(M?(F?(@?(9?(2?(+?($?(?(?(?(?(?(?(?(?(?(?(?(?(?(?)?) ?)?)?)?)v?)"l?)'a?),W?)1L?)6A?);6?)@+?)E ?)J?)O ?)S?)X?)]?)b?)g?)l?)q?)v?){?)?)?)s?)f?)X?)J?)=?)/?) ?)?)?)?)?)?)?)ʹ?)Ϫ?)ԛ?)ً?){?)k?)[?)K?);?)+?)?* ?*?* ?*?*?*?*?*#?*(~?*-l?*2Z?*7H?*<5?*A#?*F?*J?*O?*T?*Y?*^?*c?*h?*mu?*ra?*wM?*|8?*$?*?*?*?*?*?*?*?*{?*f?*P?*:?*$?* ?*?*?*?*Գ?*ٜ?*ޅ?*m?*V?*??*'?*?*?+?+?+ ?+?+}?+d?+K?+#2?+(?+-?+1?+6?+;?+@?+E?+Jd?+OJ?+T/?+Y?+]?+b?+g?+l?+q?+vr?+{V?+;?+?+?+?+?+?+?+t?+X?+;?+?+?+?+?+ħ?+Ɋ?+l?+M?+/?+?+?+?+?+?+w?+W?+8?,?,?, ?,?,?,y?,!Y?,&8?,+?,/?,4?,9?,>?,Cr?,HQ?,M/?,R?,V?,[?,`?,e?,jc?,o@?,t?,x?,}?,?,?,n?,K?,'?,?,?,?,?,s?,N?,*?,?,?,ƻ?,˖?,q?,K?,&?,?,?,?,?,h?,B?,?-?-?- ?-?-Y?-1?- ?-"?-'?-,?-1k?-6C?-;?-??-D?-I?-Nx?-SO?-X&?-\?-a?-f?-k?-pV?-u-?-z?-~?-?-?-Y?-.?-?-?-?-?-W?-+?-?-?-?-|?-P?-$?-?-?-ڞ?-q?-D?-?-?-?-?-a?.3?.?. ?.?.{?.L?.?."?.'?.,?.1b?.63?.;?.??.D?.Iu?.NE?.S?.W?.\?.a?.fS?.k"?.o?.t?.y?.~^?.-?.?.?.?.f?.4?.?.?.?.k?.8?.?.?.?.l?.8?.?.?.ٞ?.j?.6?.?.?.?.d?.0?.?/?/ ?/\?/&?/?/?/!?/&P?/+?//?/4?/9w?/>A?/C ?/G?/L?/Qe?/V.?/Z?/_?/d?/iP?/n?/r?/w?/|p?/8?/?/?/?/U?/?/?/?/p?/7?/?/?/?/P?/?/?/͡?/f?/,?/?/?/{?/@?/?/?/?/R?0?0?0 ?0b?0%?0?0?0#o?0(3?0,?01?06{?0;>?0@?0D?0I?0NG?0S ?0W?0\?0aN?0f?0j?0o?0tS?0y?0}?0?0V?0?0?0?0W?0?0?0?0V?0?0?0?0S?0?0?0ΐ?0N?0 ?0?0?0G?0?0?0?0>?0?1?1u?1 2?1?1?1i?1%?1#?1(?1-Z?12?16?1;?1@I?1E?1I?1N{?1S6?1W?1\?1ag?1f"?1j?1o?1tQ?1y ?1}?1?18?1?1?1e?1?1?1?1I?1?1?1s?1+?1?1ě?1S?1 ?1?1z?12?1?1?1W?1?1?1|?12?2?2?2 U?2 ?2?2w?2-?2"?2'?2,M?21?25?2:m?2?"?2C?2H?2M??2Q?2V?2[\?2`?2d?2ix?2n+?2r?2w?2|E?2?2?2^?2?2?2v?2(?2?2?2??2?2?2T?2?2·?2h?2?2?2{?2,?2?2?2>?2?2?2N?2?2?3]?3 ?3 ?3l?3?3?3 y?3%(?3)?3.?333?37?3?3E?3J?3OG?3S?3X?3]P?3a?3f?3kW?3p?3t?3y]?3~ ?3?3b?3?3?3f?3?3?3i?3?3?3k?3?3?3l?3?3?3k?3?3?3j?3?3?3g?3?3?3c?3 ?4?4_?4 ?4?4Y?4?4?4!R?4%?4*?4/J?43?48?4=A?4A?4F?4K7?4O?4T?4Y,?4]?4by?4g?4k?4pl?4u?4y?4~^?4?4?4N?4?4?4>?4?4?4-?4?4v?4?4?4c?4?4ȫ?4O?4?4֖?49?4?4?4#?4?4i?4 ?4?5Q?5?5 ?58?5?5|?5?5 ?5%a?5*?5.?53E?57?5?5?5z?5?5?5T?5?5?5-?5?5g?5?5١?5>?5?5x?5?5?5M?5?5?6!?6?6 X?6?6?6+?6?6#a?6'?6,?612?65?6:g?6??6C?6H6?6L?6Qj?6V?6Z?6_7?6c?6hi?6m?6q?6v5?6z?6g?6?6?60?6?6a?6?6?6)?6?6X?6?6?6?6?6L?6?6z?6?6֧?6>?6?6j?6?6?6,?6?6X?6?7?7 ?7 ?7B?7?7l?7 ?7$?7)*?7-?72S?76?7;{?7@?7D?7I7?7M?7R^?7V?7[?7`?7d?7i=?7m?7rc?7v?7{?7?7?7??7?7b?7?7?7?7?7:?7?7]?7?7~?7?7Ġ?70?7?7Q?7?7q?7?7?7!?7?7@?7?7_?7?8}?8 ?8 ?8)?8?8F?8?8$c?8(?8-?82 ?86?8;)?8??8DD?8H?8M^?8Q?8Vy?8[?8_?8d?8h?8m8?8q?8vQ?8z?8i?8?8?8 ?8?8#?8?8:?8?8P?8?8f?8?8{?8?8Ð?8?8̤?8.?8ո?8B?8?8U?8?8h?8?8z?8?8?9?9?9 &?9?97?9?9G?9"?9'W?9+?90f?94?99u?9=?9B?9G ?9K?9P?9T?9Y&?9]?9b3?9f?9k@?9o?9tL?9x?9}X?9?9c?9?9n?9?9x?9?9?9?9?9?9?9?9?9"?9Ŧ?9*?9έ?91?9׵?98?9?9??9?9E?9?9K?9?:P?:?: U?: ?:Y?:?:]?:?:$a?:(?:-d?:1?:6g?::?:?i?:C?:Hk?:L?:Ql?:U?:Zm?:^?:cn?:g?:ln?:p?:un?:y?:~m?:?:l?:?:j?:?:h?:?:e?:?:b?:?:_?:?:[?:?:W?:?:R?:?:M?:?:H?:?:B?:?:;?:?:4?;?;-?; ?;&?;?;?;?; ?;$?;) ?;-?;2?;6~?;:?;?t?;C?;Hi?;L?;Q^?;U?;ZS?;^?;cG?;g?;l;?;p?;u.?;y?;~!?;?;?;?;?;?;?;p?;?;a?;?;R?;?;B?;?;2?;ũ?;!?;Ι?;?;ׇ?;?;v?;?;c?;?;Q?;?;>?;?<*?<?< ?<?<?<x?<?<#c?<'?<,N?<0?<58?<9?<>"??>?> `?>?>4?>?>?>!q?>%?>*D?>.?>3?>7?>;?>@Q?>D?>I"?>M?>Q?>V\?>Z?>_,?>c?>g?>ld?>p?>u3?>y?>~?>i?>?>7?>?>?>l?>?>9?>?>?>l?>?>8?>?>?>j?>?>5?>ћ?>?>e?>?>/?>?>?>^?>?>'?>????T?? ????????H?? ??%??)s??-??29??6??:???b??C??H(??L??P??UO??Y??^??bv??f??k:??o??s??x_??|??"??????F??????i????*??????K???? ??l????+??ˋ????J??ت?? ??h????&??????C???@?@^?@?@ ?@y?@?@5?@?@"?@'N?@+?@0 ?@4g?@8?@=!?@A~?@E?@J8?@N?@R?@WN?@[?@`?@dc?@h?@m?@qw?@u?@z/?@~?@?@A?@?@?@S?@?@ ?@d?@?@?@t?@?@)?@?@?@7?@ȑ?@?@E?@՟?@?@R?@?@?@^?@?@?@i?@?A?As?A ?A$?A|?A?A,?A?A#?A(4?A,?A0?A5;?A9?A=?ABA?AF?AJ?AOF?AS?AW?A\K?A`?Ad?AiN?Am?Aq?AvP?Az?A~?AR?A?A?AS?A?A?AS?A?A?AR?A?A?AP?A?A?AM?AȢ?A?AJ?A՞?A?AE?A?A?A@?A?A?A:?A?B?B3?B ?B ?B+?B}?B?B"?B#t?B'?B,?B0j?B4?B9?B=_?BA?BF?BJT?BN?BR?BWG?B[?B_?Bd:?Bh?Bl?Bq+?Bu|?By?B~?Bl?B?B ?B\?B?B?BK?B?B?B9?B?B?B&?Bu?B?B?Ba?B˰?B?BL?Bؚ?B?B6?B?B?B ?Bn?B?B?BV?C?C?C =?C?C?C$?Cq?C!?C& ?C*V?C.?C2?C7;?C;?C??CD?CHj?CL?CQ?CUM?CY?C]?Cb.?Cfy?Cj?Co?CsZ?Cw?C{?C:?C?C?C?Cc?C?C?CA?C?C?C?Cg?C?C?CC?C?C?C?Cg?Cѯ?C?CA?Cމ?C?C?Cb?C?C?C:?C?D?D?D X?D ?D?D.?Du?D?D#?D'J?D+?D/?D4?D8e?D?Hl?Hš?H?H?H"?HP?H}?H۪?H?H?H1?H^?H?H?H?H?I=?Ii?I ?I ?I?I?IF?Iq?I"?I&?I*?I/ ?I3K?I7v?I;?I??IC?IH#?ILN?IPx?IT?IX?I\?Ia#?IeM?Iiw?Im?Iq?Iu?Iz?I~I?Is?I?I?I?I?IB?Il?I?I?I?I?I8?Ia?I?I?I?I?I+?IT?I|?Iդ?I?I?I?IC?Ik?I?I?I?I?I/?JV?J}?J ?J?J?J?J??J f?J$?J(?J,?J0?J5%?J9K?J=q?JA?JE?JI?JN?JR-?JVR?JZx?J^?Jb?Jf?Jk ?Jo1?JsU?Jwz?J{?J?J?J ?J0?JU?Jy?J?J?J?J?J,?JP?Js?J?J?J?J?J#?JF?Ji?JҌ?J֯?J?J?J?J9?J\?J~?J?J?J?K?K(?KJ?K k?K?K?K?K?K!?K%3?K)T?K-u?K1?K5?K9?K=?KB?KF:?KJZ?KNz?KR?KV?KZ?K^?Kc?Kg;?KkZ?Koz?Ks?Kw?K{?K?K?K6?KU?Kt?K?K?K?K?K?K,?KK?Ki?K?K?K?K?K?K?K;?KY?Kv?Kڔ?Kޱ?K?K?K ?K&?KC?K`?K|?K?L?L?L ?L ?L(?LD?L`?L |?L$?L(?L,?L0?L5?L9#?L=>?LAZ?LEu?LI?LM?LQ?LU?LY?L^?Lb2?LfM?Ljg?Ln?Lr?Lv?Lz?L~?L?L?L9?LS?Lm?L?L?L?L?L?L?L?L8?LQ?Lj?L?Lě?Lȴ?L?L?L?L?L.?LG?L_?Lw?L?L?L?L?L?M?M?M 4?ML?Mc?Mz?M?M?M"?M&?M*?M/?M3?M70?M;G?M?]?MCs?MG?MK?MO?MS?MW?M[?M` ?Md"?Mh8?MlM?Mpc?Mtx?Mx?M|?M?M?M?M?M ?M?M4?MH?M\?Mq?M?M?M?M?M?M?M?M?M$?M7?MK?M^?Mq?Mބ?M?M?M?M?M?M?M?M?N-?N@?N R?Nd?Nv?N?N?N?N#?N'?N+?N/?N4?N8?N<'?N@8?NDJ?NH[?NLl?NP}?NT?NX?N\?N`?Nd?Nh?Nl?Nq?Nu?Ny!?N}1?NA?NQ?Na?Nq?N?N?N?N?N?N?N?N?N?N ?N?N'?N6?ND?NS?Na?Np?N~?Nڌ?Nޚ?N?N?N?N?N?N?N?N ?O?O#?O 1?O>?OK?OX?Oe?Or?O#~?O'?O+?O/?O3?O7?O;?O??OC?OG?OK?OP?OT?OX?O\)?O`5?Od@?OhK?OlW?Opb?Otm?Oxx?O|?O?O?O?O?O?O?O?O?O?O?O?O?O ?O?O ?O)?O3?O=?OF?OP?OY?Ob?Ol?Ou?O~?O?O?O?O?O?O?O?P?P?P ?P ?P?P?P?P?P"?P& ?P*?P.?P2#?P6*?P:2?P>9?PB@?PFG?PJN?PNU?PR\?PVc?PZj?P^p?Pbw?Pf~?Pj?Pn?Pr?Pv?Pz?P~?P?P?P?P?P?P?P?P?P?P?P?P?P?P?P?P?P?P?P?P ?P?P?P?P?P!?P%?P)?P,?P0?P4?P8?P;?Q??QB?Q E?QI?QL?QO?QR?QU?Q#X?Q'Z?Q+]?Q/`?Q3b?Q7e?Q;g?Q?j?QCl?QGn?QKp?QOr?QSt?QWv?Q[x?Q_y?Qc{?Qg}?Qk~?Qo?Qs?Qw?Q{?Q?Q?Q?Q?Q?Q?Q?Q?Q?Q?Q?Q?Q?Q?Q?Q?Q?QË?QNj?Qˋ?Qϊ?Qӊ?Q׉?Qۉ?Q߈?Q?Q?Q?Q?Q?Q?Q?Q?R~?R|?R {?Ry?Rw?Rv?Rt?Rr?R#p?R'n?R+k?R/i?R3g?R7d?R;b?R?_?RC]?RGZ?RKW?ROT?RSQ?RWN?R[K?R_H?RcE?RgB?Rk>?Ro;?Rs7?Rw4?R{0?R,?R(?R$?R ?R?R?R?R?R ?R?R?R?R?R?R?R?R?R?R?R?R?R?R?R?R޻?R?R?R?R?R?R?R?R?S?S?S y?Ss?Sl?Se?S_?SX?S"Q?S&J?S*C?S.?SB?SF?SJ ?SN?SQ?SU?SY?S]?Sa?Se?Si?Sm?Sq?Su?Sy?S}?S?S?S?S|?Ss?Sj?Sa?SX?SO?SE?S?Uk-?Uo?Us ?Uv?Uz?U~?U?U?U?U?Uw?Ue?UR?U@?U-?U?U?U?U?U?U?U?U?UŁ?Um?UZ?UF?U3?U?U ?U?U?U?U?U?U?U~?Uj?VU?VA?V,?V ?V?V?V?V?V?V#?V'?V+o?V/Z?V3E?V7/?V;?V??VB?VF?VJ?VN?VR?VV?VZk?V^T?Vb>?Vf(?Vj?Vm?Vq?Vu?Vy?V}?V?Vs?V\?VE?V-?V?V?V?V?V?V?V?Vr?VZ?VB?V*?V?V?V?V?Vϲ?Vә?Vׁ?Vi?VP?V7?V?V?V?V?V?V?V?Wp?WW?W =?W$?W ?W?W?W?W!?W%?W)p?W-V?W1?\O ?\R?\V?\Zy?\^G?\b?\e?\i?\m?\qO?\u?\x?\|?\?\U?\#?\?\?\?\Y?\'?\?\?\?\\?\)?\?\?\?\]?\*?\?\?\̐?\]?\)?\?\?\ߎ?\Z?\'?\?\?\?\W?\"?\?]?]?] Q?] ?]?]?]?]J?] ?]#?]'?]+w?]/A?]3 ?]6?]:?]>m?]B7?]F?]I?]M?]Qa?]U+?]X?]\?]`?]dT?]h?]k?]o?]s{?]wE?]{?]~?]?]k?]4?]?]?]?]Y?]"?]?]?]}?]F?]?]?]?]h?]1?]?]?]ʊ?]R?]?]?]٪?]r?]:?]?]?]?]Y?]!?]?]?]w?^>?^?^ ?^?^[?^"?^?^?^!w?^%=?^)?^,?^0?^4X?^8?^;?^??^Cq?^G7?^J?^N?^R?^VO?^Z?^]?^a?^ef?^i+?^l?^p?^t|?^xA?^|?^?^?^V?^?^?^?^i?^.?^?^?^|?^A?^?^?^?^R?^?^?^Þ?^b?^&?^?^Ү?^r?^5?^?^?^?^C?^?^?^?^P?^?^?_?_\?_ ?_?_?_g?_*?_?_!?_%q?_)4?_,?_0?_4z?_8?`+?`/?`3x?`76?`:?`>?`Bo?`F-?`I?`M?`Qe?`U"?`X?`\?``Z?`d?`g?`k?`oN?`s ?`v?`z?`~@?`?`?`v?`2?`?`?`g?`#?`?`?`W?`?`?`?`F?`?`?`y?`5?`?`̫?`f?`"?`?`ۘ?`S?`?`?`?`>?`?`?`n?`)?a?a?aX?a ?a?a?aA?a?a?a"n?a&(?a)?a-?a1U?a5?a8?a?b?b?bY?b ?b?bs?b&?b?b?b@?b?bɦ?bX?b ?bԾ?bq?b#?b?b?b;?b?b?bR?b?b?bh?c?c?c~?c 0?c?c?cE?c?c?c"Z?c& ?c)?c-n?c1 ?c4?c8?c<3?c??cC?cGF?cJ?cN?cRX?cV ?cY?c]j?ca?cd?ch{?cl,?co?cs?cw?d?d?dF?d?d ?d$N?d'?d+?d/V?d3?d6?d:]?d> ?dA?dEd?dI?dL?dPj?dT?dW?d[o?d_?db?dft?dj ?dm?dqy?du%?dx?d||?d(?d?d?d,?d?d?d.?d?d?d0?d?d?d2?d?d?d3?d?d?d3?d?dɉ?d3?d?dԈ?d3?d?d߈?d2?d?d?d0?d?d?d.?d?e?e,?e?e ?e(?e?e{?e%?e?e!w?e% ?e(?e,s?e0?e3?e7n?e;?e>?eBh?eF?eI?eMb?eQ ?eT?eX[?e\?e_?ecT?ef?ej?enL?eq?eu?eyD?e|?e?e;?e?e?e2?e?e?e(?e?ew?e?e?el?e?e?ea?e?e?eU?e?eɢ?eI?e?eԖ?eV?fA?fE?fID?fL?fP?fT1?fW?f[z?f_?fb?fff?fj ?fm?fqR?ft?fx?f|>?f?f?f)?f?fp?f?f?fZ?f?f?fC?f?f?f,?f?fr?f?f?fZ?f?fȟ?fB?f?fӇ?f)?f?fm?f?f?fT?f?f?f9?f?f}?f?g?gb?g ?g ?gF?g?g?g*?g?g#l?g' ?g*?g.O?g1?g5?g92?g?h?hy?h?h?hQ?h ?h$?h((?h+?h/b?h2?h6?h:8?h=?hAr?hE?hH?hLG?hO?hS?hW?hZ?h^U?ha?he?hi)?hl?hpa?hs?hw?h{4?h~?hl?h?h?h>?h?hu?h?h?hG?h?h}?h?h?hN?h?h?h?h?hT?h?hʉ?h#?hѾ?hX?h?h܌?h'?h?h[?h?h?h)?h?h\?h?i?i)?i?i ]?i?i?i)?i?i[?i ?i$?i('?i+?i/Y?i2?i6?i:#?i=?iAU?iD?iH?iL?iO?iSO?iV?iZ?i^?ia?ieH?ih?ily?ip?is?iw@?iz?i~p?i?i?i7?i?if?i?i?i,?i?iZ?i?i?i?i?iM?i?i{?i?i¨?i??i?il?i?iԙ?i0?i?i\?i?i?i?i?iK?i?iv?i ?i?j8?j?j c?j ?j?j#?j?jN?j?j#x?j'?j*?j.8?j1?j5b?j8?j?k?k^?k?k}?k ?k?k+?k?kI?k?kh?k?k?k?k?k2?k?kP?k?km?k?kڋ?k?k?k6?k?kR?k?ko?k?k?k?l?l5?l?l Q?l?ll?l?l?l?l!?l%0?l(?l,J?l/?l3e?l6?l:?l> ?lA?lE&?lH?lL@?lO?lSY?lV?lZr?l]?la?le?lh?ll1?lo?lsI?lv?lzb?l}?lz?l?l?l?l?l5?l?lL?l?ld?l?l{?l?l?l?l?l3?l?lI?l?l_?l?lu?l?l֋?l?lݠ?l*?l?l@?l?lT?l?li?l?l}?m?m?m?m ?m/?m?mC?m?mW?m ?m$j?m'?m+}?m/?m2?m6?m9?m=+?m@?mD>?mG?mKP?mN?mRb?mU?mYs?m\?m`?md ?mg?mk?mn?mr0?mu?my@?m|?mQ?m?ma?m?mq?m?m?m ?m?m?m?m(?m?m7?m?mF?m?mU?m?mc?m?mq?m?m?m?m؍?m?mߛ?m"?m?m/?m?m?nBD?nE?nIO?nL?nPY?nS?nWc?nZ?n^m?na?new?nh?nl?np?ns?nw?nz?n~?n?n ?n?n)?n?n1?n?n9?n?nA?n?nI?n?nQ?n?nX?n?n_?n?nf?n?nm?n?ns?n?ny?n?n?n?n?n?n?n?n?n?n?o?o?o?o ?o"?o?o'?o?o+?o?o#/?o&?o*3?o-?o17?o4?o8:?o;?o?=?oB?oFA?oI?oMC?oP?oTF?oW?o[I?o^?obK?oe?oiM?ol?opO?os?owQ?oz?o~R?o?oS?o?oT?o?oU?o?oV?o?oV?o?oV?o?oV?o?oV?o?oV?o?oU?o?oU?o?oT?o?oR?o?oQ?o?oO?o?oM?o?oK?o?oI?o?pG?p?p D?p ?pA?p?p>?p?p;?p"?p&8?p)?p-4?p0?p40?p7?p;,?p>?pB(?pE?pI#?pL?pP?pS?pW?pZ?p^?pa?pe?ph?pl ?po?ps?pv?py?p}|?p?pu?p?po?p?ph?p?pb?p?p[?p?pS?p?pL?p?pD?p?p=?p?p5?pƱ?p,?pͨ?p$?pԠ?p?pۗ?p?p?p ?p?p?p|?p?pr?p?pi?q?q_?q?q U?q?qJ?q?q@?q?q!5?q$?q(*?q+?q/?q2?q6?q9?q=?q@?qC?qGv?qJ?qNj?qQ?qU^?qX?q\R?q_?qcE?qf?qj8?qm?qq+?qt?qx?q{?q?q?q?q|?q?qn?q?q`?q?qR?q?qC?q?q5?q?q&?q?q?q?q?qĀ?q?qp?q?q`?q?qP?q?q@?q?q/?q?q?q?q?q?q?qt?r?rc?r ?r R?r?r@?r?r.?r?r"?r%?r) ?r,?r/?r3n?r6?r:[?r=?rAH?rD?rH5?rK?rO"?rR?rV?rY?r\?r`p?rc?rg\?rj?rnH?rq?ru3?rx?r|?r?r ?r?r?rj?r?rU?r?r??r?r)?r?r?r?r?rr?r?r\?r?rE?rĺ?r.?rˣ?r?rҌ?r?rt?r?r]?r?rE?r?r-?r?r?r?r?rq?s?sX?s ?s ??s?s&?s?s ?s?s!?s%g?s(?s,M?s/?s33?s6?s:?s=?s@?sDr?sG?sKW?sN?sR?v?v ?vq?v?v=?vϣ?v ?vo?v?v;?v?v?vm?v?v8?v?v?vi?v?v4?w?w?w d?w ?w/?w?w?w^?w?w!(?w$?w'?w+W?w.?w2 ?w5?w8?w?{B,?{E?{H?{L0?{O?{R?{V4?{Y?{\?{`7?{c?{f?{j:?{m?{p?{t?{?{?{??{?{?{@?{?{?{A?{?{?{A?{?{?{A?{?{?{A?{?{?{@?{Ǖ?{?{>?{ѓ?{?{=?{ۑ?{?{;?{?{?{8?{?{?{5?{?{?|2?|?|?| .?| ?|?|*?|~?|?|&?|!y?|$?|(!?|+t?|.?|2?|5o?|8?|<?|?i?|B?|F?|Ic?|L?|P ?|S]?|V?|Z?|]V?|`?|c?|gN?|j?|m?|qF?|t?|w?|{>?|~?|?|6?|?|?|-?|?|?|#?|v?|?|?|l?|?|?|b?|?|?|W?|?|?|L?|ǝ?|?|@?|ђ?|?|5?|ۆ?|?|(?|z?|?|?|m?|?|?|`?|?}?}R?}?} ?} D?}?}?}6?}?}?}!'?}$x?}'?}+?}.i?}1?}5 ?}8Y?};?}>?}BI?}E?}H?}L9?}O?}R?}V(?}Yw?}\?}`?}cf?}f?}j?}mT?}p?}s?}wB?}z?}}?}0?}?}?}?}l?}?} ?}Y?}?}?}E?}?}?}1?}?}?}?}k?}?}?}V?}Ƥ?}?}@?}Ў?}?}*?}x?}?}?}b?}?}?}K?}?}?}4?}?}?~?~j?~?~ ?~R?~?~?~:?~?~?~#!?~&n?~)?~-?~0U?~3?~6?~:;?~=?~@?~D!?~Gn?~J?~N?~QS?~T?~W?~[8?~^?~a?~e?~hi?~k?~o?~rM?~u?~x?~|1?~}?~?~?~`?~?~?~C?~?~?~%?~p?~?~?~R?~?~?~4?~?~?~?~`?~ī?~?~A?~Ό?~?~!?~l?~۷?~?~L?~?~?~+?~u?~?~ ?~T?~?~?3?}? ? ?[???9?? ?$?'`?*?-?1b?A?D?H>?K?N?R?Ub?X?[?_=?b?e?i?la?o?r?v;?y?|??]???6?~???W???/?w???O???'?n???E?ˍ???c?ث??9????V???+?r????5?5_W?5?6?6m?6T?7 ?7z>?7o?8,?8^?8?96?9?92?:?F?:)?:?;Fx?;?;?Sv?>q?>L??U???@?@UC?@e?@T?AT"?A?AY?BQ?B?B?CN?C?C?DI?D?D?EB?E?E?F;i?F ?F~?G2?G?G ?H(?Hz?Hh?I?IoT?I?J?Jb?J?Kh?KU?K?K?LFA?LW?Lm?M6P?M?Mղ?N%B?Nt?N?O'?ObA?O)?P?PN?PI?P?Q:.?Qn?Q֌?R$?Rru?R@?S ?S[?S?S^?TC?T?Tݵ?U*?Uwu?U"?V?V]:?V?V?WB?W?W?X%?Xq?XE?Y?YTC?Y?Y?Z5?Z?Z?[?[a?[.?[?\A%?\v?\շ?]?]i?]?]?^Gx?^!?^ک?_$ ?_m?_?`?`I?`?`?a#?al?a1?a?bF(?b?b?c?cg?c!?c?d>?d?d>?e?e]>?e?e?f3'?fzS?f]?gF?gO/?g?gܭ?h#S?hi?hK?h?il?~~?~4?~~????  "( V`j.text.data.bss8_errno_write_matherr_s_sqrt_r_sqrt_R_sqrt mcount",sqrt_nameUNDERFLOWMASK_MANTSqrtTabler_tan.o/ 568278336 98 100 100664 1292 ` u!=@ .textH< .dataHHh@.bss?"94[.(#pQ `Pҋ`P`P  O!D~.?I $!?"%0x9@ 4@4I4!@)D$!DP`pxyހ xހx7O΀Ftv*%v"%r#x#Wp#uހ?!wG)w$p#p$#P8d%!dd6#1%###?%~^% @ :1$2 >&#%!0>$2% %!# A@&PW"WW@9QB@@*BN8 H.45>0H0(,L "N@@(PWx ܋^ Ƌtantan: TLOSS error tan: input value was NAN tan: input value was INF *<0 <:<@ <J<P <<<<<<<&<2<<<.textH.dataHh.bss_errno_write_matherr_s_tan(_r_tan8_R_tanHmcountUNDERFLOWpi_reducer_tanh.o/ 568278343 98 100 100664 1082 ` u!=G( .textt .datah @.bss`ГP`ؓP`P  ).!: ! ?@!(%0v=t%1@Rl#4%1%0@@5/#A&4#W A-` @8;%!1S)U$!%"@=lVe%BP@#E%@A#$A#B$!P`54#2!&#?$  W?*!.8 .41>0?H0: !. & P?W tanhtanh: DOMAIN error tanh: input value was NAN tanh: input value was INF t tt t"t( ttt$t.t8tHtRtjttt.text.datah.bss_errno_write_matherr_s_tanh_r_tanh_R_tanh mcountUNDERFLOWpow_rr.o/ 568278353 98 100 100664 2585 ` u!=Q.text<4 .data@.bss`P`P ?W !)"0   :!4 @ !)2$10@?4@ 0! %@0 W@@?,F@% 1r2)#$43$2%#WP PT0 50DSqQ  ?F@% 1r2)#$43$2%#UqQ  >@%W?W  x)0#0 0? 0?0!0?#0@?$&0%3@?M$CP?^&T%5%0P?1r)"%%P##$8 .41>0H0 ! !PW8 .43>0H0 !.N TPW4 $PWWW%Bff*®*  F@  $!0?%!1)3$ 3@?%$@9%##% =lVe%!@@#$% A#$&?#1 x h    !   WxW0 @*A@8 .44>0H0"@@@&PWN4 @*A@8 .43>0H0b"@@@*PWPN$P4powpow: OVERFLOW error pow: DOMAIN error pow: input value was NAN pow: input value was INF powpow: input value was NAN pow: input value was INF < << <6<<<< < < < < < < <" <P<< << <*<L<j<v<<<<<<<<<<<<<<<"<><H<T<^<p<<<<<<<<<.text4.data.bss_errno_write_matherr_s_pow_pow_rr_Pow_rrmcountUSavePowerSqrtTableUNDERFLOWMASK_MANTpnanorinfcont_fastReducedsqDontNegate r_floor.o/ 568278360 98 100 100664 640 ` u!=X .text\ .data0,@.bss@`P<*<?$ <@@W@`ȓP<*<?# <@@W @(#)r_floor.c 6.1 87/11/23 \\" \Z\`\r \.text.data0.bssSaveReg _s_floormcount_s_modf_s_ceilXr_modf.o/ 568278362 98 100 100664 504 ` u!=ZD .textx, .dataxx(@.bss`P 1* "@K* 0@K#$ @?$@*A@*"$W @(#)r_modf.c 6.1 87/11/23 ,,.textx.datax(.bssSaveReg _s_modfmcount! / 568273427 0 0 0 1458 ` x 6 6 ,,, $ $ $ $ $ $ $& & ((++,,.....9>9>;;=^=^?6?6?6?6?6?6?6?6HHHHHHHHHHHHHHHH\*\*__aacjcje:e:e:e:kkmmozozqZqZsbsbvvwwzz|||||||nn~~ffSaveReg_abspath_push_popSaveReg_anySaveReg_anystrSaveReg_balbrkSaveReg_catSaveReg_clean_upSaveReg_curdir_findirSaveReg_dnameSaveReg_fatal_Fcnt_Fflags_Ffile_Ffunc_FvalueSaveReg_fdfopenSaveReg_giveupSaveReg_imatchSaveReg_indexSaveReg_lockit_onelock_unlockit_mylockSaveReg_lognameSaveReg_patoiSaveReg_patolSaveReg_regcmp___sp____stmax___size___i_size___rpush___rpopSaveReg_regex___braslist___bravar___cflg___execute___braelist___st___eptr____lptr____loc1___advance___xpop___xpush___getrnge___cclassSaveReg_renameSaveReg_repeatSaveReg_replSaveReg_satoiSaveReg_setsig_setsig1_MesgSaveReg_snameSaveReg_strendSaveReg_substrSaveReg_trnslatSaveReg_userdirSaveReg_userexitSaveReg_usernameSaveReg_verifySaveReg_xalloc_Freelist_Freeend_Lastbrk_xfree_xfreeallSaveReg_xlinkSaveReg_xopenSaveReg_xpipeSaveReg_xunlinkSaveReg_xwriteSaveReg_zeroSaveReg_zeropadSaveReg_Fjmpabspath.o/ 568273248 98 100 100664 1028 ` u!)`< .text .data@@.bssPPP<~@pHH~L~DVPLp0W  /LD`   . LD6 0.   / LD  / LDҋD  /D( HDHH@DD( BDD( &L! D~@ǎ<PPW 231W W @(#)abspath.c 6.1 87/11/23 HlL/B048<@D.text.data@.bssPSaveReg _abspath_push_popany.o/ 568273251 98 100 100664 388 ` u!)c.text8 .data88 @.bssXX 0 1 W @(#)any.c 6.1 87/11/23 .text8.data8 .bssXSaveReg _anyanystr.o/ 568273255 98 100 100664 468 ` u!)g .texth .datahh @.bssH<@~Dpֆ q ~Dǎ@Ǟ<HHW @(#)anystr.c 6.1 87/11/23 ,.texth.datah .bssSaveReg _anystr_anybal.o/ 568273259 98 100 100664 620 ` u!)k.text .data  @.bss@@`?DHLPT~X_{ 7 !2 q' y7 !2 q' zR7 !2B^)>^R(! (q'  ! K ~XǎTǞPǮLǾHD``W @(#)bal.c 6.1 87/11/23 .text .data  .bss@SaveReg _balbrkcat.o/ 568273262 98 100 100664 412 ` u!)n.textP .dataPP @.bsspp~$.(0.$q@tD@$A~W @(#)cat.c 6.1 87/11/23 .textP.dataP .bsspSaveReg _catclean.o/ 568273265 98 100 100664 362 ` u!)q.text .data @.bss00W @(#)clean.c 6.1 87/11/23 .text.data .bss0SaveReg _clean_upcurdir.o/ 568273273 98 100 100664 2460 ` u!)y4.text 4> .data  @.bss@8~<p.~<ǎ8@@W <@LDL~H ÎNÎLzH`p TLF:4Lz6/Ϯnl/ L΅Lz~P @j  ! /NHl 6 G$Pp \  P PQ%||LXzf P  ! /*$ P H P P P(1Dp l.l l@ v 00n ! /~HǎDǞ@Ǯ<W @(#)curdir.c 6.1 87/11/23 ...././etc/mnttabcurdir: cannot open /etc/mnttab! /dev/%sread/writeread only4. 4d4v 44 4 4 4444 44 4b4j4p4444 44 44 4444444$4*464L4R4` 4n 4444444 44444 44" 4L4\ 4v 4|4 444444444.text >.data .bssSaveReg _curdir_findirP_chdir_stat_open_fstat_close_read__iob_fprintf_sprintfdname.o/ 568273276 98 100 100664 484 ` u!)|0 .textx$ .dataxx @.bss8 ȧ~4p  /*(/ .~488W @(#)dname.c 6.1 87/11/23 $.textx.datax .bssSaveReg _dname_strlenfatal.o/ 568273281 98 100 100664 1452 ` u!).textp<& .datapp@@.bssH@~Dp %H"ր  ~!n"^R  B!2 @   W ? J 6 0 ~Dǎ@HHW @(#)fatal.c 6.1 87/11/23 : ] [ERROR<<$<( <* <><F <J <L <X<` <d <f <t < << << < < << < < < < < <<< < <0<2<8<D<N<T<.textp&.datap@.bssSaveReg _fatal_Fcnt_Fflags_write_Ffile_strlen_Ffunc_Fjmp_longjmp_exit_Fvalue_clean_up_userexitfdfopen.o/ 568273285 98 100 100664 652 ` u!) .text\ .data <@.bss@8~<p܍ h ( JP   p  "   !  ~<ǎ8@@W @(#)fdfopen.c 6.1 87/11/23 \ \& \4 \6 \@ \B \.text.data .bssSaveReg _fdfopen_Statbuf_fstat__iobgiveup.o/ 568273288 98 100 100664 512 ` u!)$ .text@ .data@@(@.bsshh8`ړ88W @(#)giveup.c 6.1 87/11/23 /( . .text@.data@(.bsshSaveReg _giveup_chdir_signal_abortimatch.o/ 568273291 98 100 100664 380 ` u!).text0 .data00 @.bssPP 0!2W @(#)imatch.c 6.1 87/11/23 .text0.data0 .bssPSaveReg _imatchindex.o/ 568273295 98 100 100664 492 ` u!)L.text .data ,@.bss0A~$^p pNϐ!!p pxp pp    $qp~ǎǞW @(#)index.c 6.1 87/11/23 .text.data .bssSaveReg _indexlockit.o/ 568273302 98 100 100664 2578 ` u!).text< .data8@.bssPP?DHLPT~Xp|  (P8(:|\|f ΀hd ΀.`  ! ! L< P' (    |$| H>n  FB: !@$$R!@0B 9 'qLB'q1LC32'qС'q@,B'qMB *!N , +  {,D(80(8ϑ !#D # !#1q !! 'q# 0!@}$ 0! 9)*!@}$ , 'q ,01 }q !4r0q '0 #!0q @! <"  <! ( + q !q !q !!1@^487t0-0!,8@]4 q71!7q!A0]C*'q02'q~LǎHǞDǮ@Ǿ<84W  W W ( W @(#)regcmp.c 6.1 87/11/23 D :T  2 pr    .text.dataP .bss(SaveReg _regcmp___sp____stmax___sizeP_malloc___rpush___rpopp_free___i_sizeregex.o/ 568273334 98 100 100664 4869 ` u!).text 4C .data  ,X5@.bss X<@DHLP~T.x q@000A1J.x@ސް8 0p0:(10AJ   ~TǎPǞLǮHǾD@<XXWH8< @~DyPȶPPP ,p  d' ! >PȶPPP pZq HPȶPPPL pq ~Dǎ@Ǟ<Ǯ8HHWX<@DH ~Lr (! ((! p W G(! 0(#(! p W'q^xq f`PqJ<p  *(PTҋp P!P ""qT!T 8PT(>*q RP!P *qT!T TqPT(΋q P!P qT!T TqZ !(PTZ((q0R# ^P!P "(q0R#VT!T Tqq!q pqpq(p!vq fq 'q! >(qp p z"d7(qR! !00 q qp$  (~LǎHǞDǮ@Ǿ<XXWA2  !~  vp@tPp@G@ `p@ At p@ AG :"p@ At !B V~WH@~Dq( /ldqq~Dǎ@HHW4( 0( W0"@ $#@ BN  #W @(#)regex.c 6.1 87/11/23 L8 ,PPPP@||||$ddddstack overflow 6 48 4< 4>  4`  4t 4v  4z 4|  4 4 4 4  4@ 4B  4H 4L 4N  4T 4l 4 4  4 4 4  4 4 4 4  4 4 4  4 4& 4 4 4D  4 4  4  4v 4x 4~ 4 4 4 4 4 4 4 4 4 4 4 4 4 4  4  4  4  4 $ 4 & 4 * 4 ,  4 < 4 > 4 F 4  4  4  4  4  4  4  4  4  4  4  4  4  4  4  4  4  4  4  4  4  4  4  4  4 $ 4 ( 4 , 4 0 4 4 4 8 4 < 4 @ 4 D 4 H 4 L 4 P 4 T 4 X 4 \ 4 ` 4 d 4 h 4 l 4 p 4 t 4 x 4 | 4  4  4  4  4  4  4.text C.data 5.bss SaveReg _regex((___cflg %(___st___eptr____lptr____loc11`___xpop___xpushd< XG_write_exitQ___braslist___bravar___execute___braelist___advance___getrnge___cclass rename.o/ 568273338 98 100 100664 828 ` u!)$.text| .data \@.bssP8<~@qܧDΧHL xDjH^LR~@ǎ< Ǟ8PPW @(#)rename.c 6.1 87/11/23 &|4|B|P |Z |\ |h |t |x |z | ||||.text.data .bssSaveReg _rename_signal_unlink_errno_xunlink_xlink_Fvaluerepeat.o/ 568273342 98 100 100664 428 ` u!) .text` .data`` @.bss@1!~"pwp!p(~ǎW @(#)repeat.c 6.1 87/11/23 .text`.data` .bssSaveReg _repeatrepl.o/ 568273346 98 100 100664 420 ` u!) .text8 .data88 @.bssXX@\.`0_.c@@W @(#)repl.c 6.1 87/11/23 $.text8.data8 .bssXSaveReg _repl_trnslatsatoi.o/ 568273350 98 100 100664 404 ` u!).textH .dataHH @.bsshh!1:@0P5@0(405@9(40קW @(#)satoi.c 6.1 87/11/23 .textH.dataH .bsshSaveReg _satoisetsig.o/ 568273355 98 100 100664 1572 ` u!).textX  .dataXX( @.bss@~<qD q~<@@WH@~Dppd|  dhpׁpH  8p(  px ~Dǎ@HHW @(#)setsig.c 6.1 87/11/23 dump.core ,<LXIllegal instructionTrace/BPT trapIOT trapEMT trapFloating exceptionKilledBus errorMemory faultBad system callBroken pipeAlarm clockSIGNAL: (ut12) (  6  r                   "  ( 4 >            .textX.dataX( .bssSaveReg _setsig_setsig1\_signal_Mesg_strlen_write_open_abort_exit_clean_up_userexitsname.o/ 568273358 98 100 100664 508 ` u!)H .text< .data @.bss8 ȧ~4p!/!0( /  / q~488W @(#)sname.c 6.1 87/11/23 <.text.data .bssSaveReg _sname_strlenstrend.o/ 568273362 98 100 100664 364 ` u!).text .data @.bss@@W @(#)strend.c 6.1 87/11/23 .text .data  .bss@SaveReg _strendsubstr.o/ 568273366 98 100 100664 420 ` u!).textX .dataXX @.bssxx~pA!0r1!s30 ~W @(#)substr.c 6.1 87/11/23 .textX.dataX .bssxSaveReg _substrtrnslat.o/ 568273370 98 100 100664 460 ` u!),.text .data  @.bss~pA8& q~ǎǞW @(#)trnslat.c 6.1 87/11/23 .text.data .bssSaveReg _trnslatuserdir.o/ 568273374 98 100 100664 612 ` u!) .textt .data T@.bss0@PPP8ކ 8 : : : : 02200@:4!0 1W @(#)userdir.c 6.1 87/11/23 t$tzttt.text.data .bss0SaveReg _userdir_getpwuserexit.o/ 568273378 98 100 100664 362 ` u!).text .data @.bss00W @(#)userexit.c 6.1 87/11/23 .text.data .bss0SaveReg _userexitusername.o/ 568273382 98 100 100664 694 ` u!) .text\ .data(4@.bss~\F \T\~\\\\\.text .data(.bssSaveReg _getpw_sprintf_usernameverify.o/ 568273386 98 100 100664 468 ` u!) .texth .datahh @.bssH<@~Dy$  q~Dǎ@Ǟ<HHW @(#)verify.c 6.1 87/11/23 2.texth.datah .bssSaveReg _verify_anyxalloc.o/ 568273393 98 100 100664 1504 ` u!)t.textl .dataPh@.bssH48<@~Dp p Z (UȋXR5(80H5(&1@#4q q! ࿀ 0#z pZp" ࿈  0 2p 2) *!' اq2~Dǎ@Ǟ<Ǯ8Ǿ4HHW(| ȋ 2(101Q5@0 @541 R11 W8PPж88W @(#)xalloc.c 6.1 87/11/23 out of space (ut9)??Nlll l ll4 lTlZ lzlllTlVl\l`lblhlplvl|ll.text.dataP.bssSaveReg _xalloc_Freeend_Lastbrk_sbrk_fatal_xfreeL_end_brk_Freelist_xfreeallxlink.o/ 568273397 98 100 100664 876 ` u!)T.text .dataHL@.bssPH~Lp  J  op((7( xd~LǎHPPW @(#)xlink.c 6.1 87/11/23 can't link `%s' to `%s' (%d)xlink", . B D \ ^ hr v x ~    .text.dataH.bssSaveReg _xlink_link_errno_Error_sprintf_fatal_xmsgxopen.o/ 568273402 98 100 100664 980 ` u!).text .dataL@.bss@@H@~Dp ~d'4''v4`~Dǎ@HHW @(#)xopen.c 6.1 87/11/23 `%s' unreadable (ut5)`%s' unwritable (ut6)`%s' unreadable or unwritable (ut7)xopen". 0 < > DL X Z `h p r x     .text.data.bss@SaveReg _xopen_open_errno_Error_sprintf_fatal_xmsgxpipe.o/ 568273406 98 100 100664 480 ` u!) .text@ .data@@(@.bsshh8 `88W @(#)xpipe.c 6.1 87/11/23 pipe&. .text@.data@(.bsshSaveReg _xpipe_pipe_xmsgxunlink.o/ 568273410 98 100 100664 488 ` u!* .textH .dataHH(@.bsspp@~<ph؋~<@@W @(#)xunlink.c 6.1 87/11/23 xunlink$* .textH.dataH(.bsspSaveReg _xunlink_unlink_xmsgxwrite.o/ 568273414 98 100 100664 516 ` u!*< .textP  .dataPP0@.bss@~<r (' pt~<@@W @(#)xwrite.c 6.1 87/11/23 xwrite , 2 8  .textP.dataP0.bssSaveReg _xwrite_write_xmsgzero.o/ 568273418 98 100 100664 372 ` u!* .text( .data(( @.bssHH@ 02!W @(#)zero.c 6.1 87/11/23 .text(.data( .bssHSaveReg _zerozeropad.o/ 568273422 98 100 100664 380 ` u!*.text0 .data00 @.bssPP 0 0 2W @(#)zeropad.c 6.1 87/11/23 .text0.data0 .bssPSaveReg _zeropadFjmp.o/ 568273426 98 100 100664 332 ` u!*.text .data @.bss @(#)Fjmp.c 6.1 87/11/23 .text.data .bss SaveReg _Fjmp(! / 568275134 0 0 0 4902 ` jjnn   $$*\*\-D-D0,0,222557p7p7p7pEEEEEEEEEOlOlRSSSSSj j j j j j j j j j u&u&u&{{{bb&&JJZZZZZZzzHHHHHHHHLLHHH88\\HH,,  TT&&###&''))-b-b-b/13 46"79B9B::<<>v@AC>C>IFIFKKPPRRTTVVXXZJZJZJZJ^^cncng"g"hhkknnnnnnnnu  00<<   ’’˚˚44ҰҰܬܬ:::bbffnn    **FF  #8#8%%()+V,.0:135:688:v*@AC.DFH6IKrLNPQS6TVX.YY]z_"_"_"_"_"b.ceg.hj~lmovqrtttwwwwy{b{b}~~~~~J.TH@@_errnocerrormcount_udivudiv_uremuremSaveReg_a64lSaveReg_abortSaveReg_absSaveReg__assertSaveReg_atofSaveReg_atoiSaveReg_atolSaveReg_bsearchSaveReg_calloc_cfreeSaveReg_clockSaveReg_setkey_encrypt_cryptSaveReg_ctime_localtime_asctime_tzset_timezone_gmtime_daylight_tznameSaveReg__ctype_exitSaveReg_dial_undial_device__debugSaveReg_drand48_erand48_lrand48_mrand48_srand48_seed48_lcong48_nrand48_jrand48SaveReg_ecvt_fcvtSaveReg_sys_errlist_sys_nerrSaveReg_execlp_execvpSaveReg_fpgetround_fpsetroundSaveReg_frexpSaveReg_ftokSaveReg_ftwSaveReg_gcvtSaveReg_getcwdSaveReg_getenvSaveReg_setgrent_endgrent_getgrent_fgetgrentSaveReg_getgrgidSaveReg_getgrnamSaveReg_getloginSaveReg_getopt_optind_optopt_opterr_optargSaveReg_getpwSaveReg_setpwent_endpwent_getpwent_fgetpwentSaveReg_getpwnamSaveReg_getpwuidSaveReg_getutent_getutid_getutline_pututline_setutent_endutent_utmpnameSaveReg_hcreate_hdestroy_hsearchSaveReg_isattySaveReg_ltol3_l3tolSaveReg_l64aSaveReg_ldexpSaveReg_lfindSaveReg_lsearchSaveReg_malloc_free_reallocSaveReg_memccpySaveReg_memchrSaveReg_memcmp_memcpySaveReg_memsetSaveReg_mktempSaveReg_modfSaveReg_monitor__countbase__countmax____ArgvSaveReg_nlistSaveReg_perrorSaveReg_putenvSaveReg_putpwentSaveReg_qsortSaveReg_srand_rand_Reduce_inf_setjmp_longjmpSaveReg_sleepSaveReg_ssignal_gsignal_strcat_strchr_strcmp_strcpy_strcspn_strlen_strcatn_strncat_strcmpn_strncmp_strcpyn_strncpy_strpbrk_strrchr_strspnSaveReg_strtodSaveReg_strtokSaveReg_strtolSaveReg_swabSaveReg_tellSaveReg_tfindSaveReg_tolowerSaveReg_toupperSaveReg_tsearch_tdelete_twalkSaveReg_ttynameSaveReg_ttyslotSaveReg_clearerrSaveReg_ctermidSaveReg_cuseridSaveReg__iob__smbuf__bufendtab__sibuf__sobuf__stdbuf__lastbuf__doprntSaveReg__doscanSaveReg_fdopenSaveReg_fgetcSaveReg_fgetsSaveReg__filbufSaveReg__findiopSaveReg__cleanup_fclose_fflush__xflsbuf__flsbuf__wrtchk__bufsync__findbufSaveReg_fopen_freopenSaveReg_fprintfSaveReg_fputcSaveReg_fputsSaveReg_freadSaveReg_fseekSaveReg_ftellSaveReg_fwriteSaveReg_getcharSaveReg_getpassSaveReg_getsSaveReg_getwSaveReg_popen_pcloseSaveReg_printfSaveReg_putcharSaveReg_putsSaveReg_putwSaveReg_rewindSaveReg_scanf_fscanf_sscanfSaveReg_setbufSaveReg_setvbufSaveReg_sprintfSaveReg__dowriteSaveReg_systemSaveReg_tempnamSaveReg_tmpfileSaveReg_tmpnamSaveReg_ungetcSaveReg_vfprintfSaveReg_vprintfSaveReg_vsprintf_access_acct_alarm_chdir_chmod_chown_chroot_close_creat_dupSaveReg_dup2_execl_execle_execv_execve__exit_fcntl_fork_fstat_ftime_getegid_geteuid_getgid_getpid_getppid_getuid_gtty_ioctl_kill_linkSaveReg_lockf_lseekSaveReg_msgget_msgctl_msgrcv_msgsnd_mknod_mount_exect_nice_open_pause_pipe_plock_profil_ptrace_read_sbrk_brk__ndSaveReg_semctl_semget_semop_setgid_setpgrp_getpgrp_setuidSaveReg_shmat_shmctl_shmdt_shmget_signalsigcode_snodename_stat_stime_stty_sync_syscall_swapfunc_sysmachdep_time_times_ulimit_umask_umount_uname_unlink_ustat_utime_wait_writecerror.o/ 568273449 98 100 100775 372 ` u!*)  .text .data@.bssW.text.data.bss_errnocerrormcount.o/ 568273452 98 100 100775 535 ` u!*,H   X.textX .data@.bss.& 4 420R$0# 00&212.WU.textX.data.bssmcount__countbase__countmax udiv.o/ 568273456 98 100 100775 352 ` u!*0  .text .data@.bss!/W.text.data.bss_udivudivurem.o/ 568273459 98 100 100775 352 ` u!*3  .text .data@.bss!/W.text.data.bss_uremurema64l.o/ 568273474 98 100 100775 432 ` u!*B  H .textH .data @.bss 0$@Z@9` 0!@W @(#)a64l.c 6.1 87/11/23 .textH.data .bssSaveReg _a64labort.o/ 568273478 98 100 100775 566 ` u!*FL   @(.text@ .data(@.bss8 60(88W @(#)abort.c 6.1 87/11/23   .text@.data(.bssSaveReg _abort_getpid_kill__cleanupabs.o/ 568273481 98 100 100775 384 ` u!*I   .text .data @.bssW @(#)abs.c 6.1 87/11/23 .text.data .bssSaveReg _absassert.o/ 568273485 98 100 100775 928 ` u!*M   P.text .dataP@.bssP@DH~Lp     '  '(!2 077q"0#(!*q*!  lf~LǎHǞDǮ@PPW @(#)assert.c 6.1 87/11/23 , line NNNNN Assertion failed: , file   *@x  .text.dataP.bssSaveReg __assert_write_strlen_abortatof.o/ 568273493 98 100 100775 1412 ` u!*U   p.text .datap@.bss  `@DHLPT~XP^\0 #"( + "  -^\Q^\ p1@ΐ. ~Hΐ0 Aj0ސ ̈ *ސ ̈:zA@ސ ̈* ސ ̈:zpޠeΐ. TB 9Ȍ19#59'3( E e 0@ (@@0@ (@@ @+ @-1p@GDD@>@B*  p@GDD@0 p,=:yp6p?qq5yq( K ?0@@A@ q5'@sA@  6! #;K;;#\ 2  ~XǎTǞPǮLǾHD@``W @(#)atof.c 6.1 87/11/23 `bh .text .datap.bss SaveReg _atof__ctype_ldexpatoi.o/ 568273497 98 100 100775 684 ` u!*Y   x.text .dataxx x@.bss0~@!$"$ d @!$"( !@+B $ @-$ 1@!$"$ D 0!*@0A$pAGDD@0 ~W @(#)atoi.c 6.1 87/11/23 ||||||F|H|.text.datax .bssSaveReg _atoi__ctypeatol.o/ 568273501 98 100 100775 684 ` u!*]   x.text .dataxx x@.bss0~@!$"$ d @!$"( !@+B $ @-$ 1@!$"$ D 0!*@0A$pAGDD@0 ~W @(#)atol.c 6.1 87/11/23 ||||||F|H|.text.datax .bssSaveReg _atol__ctypebsearch.o/ 568273506 98 100 100775 536 ` u!*bx  X.text .dataXX X@.bssxxP?8<@DH~Lq@.x W & q(~LǎHǞDǮ@Ǿ<8PPW @(#)bsearch.c 6.1 87/11/23 .text.dataX .bssxSaveReg _bsearchcalloc.o/ 568273510 98 100 100775 588 ` u!*f\   p .textp8 .data @.bss88H@~Dpq:'&~Dǎ@HHW8088W @(#)calloc.c 6.1 87/11/23   .textp.data .bss8SaveReg _calloc_malloc_memset_cfree_freeclock.o/ 568273515 98 100 100775 556 ` u!*kx   x( .textxH .data  ( @.bssHHH8D*@ <8@D@<8@D@HN HW @(#)clock.c 6.1 87/11/23 ,,,,.textx.data (.bssHSaveReg _clock_timescrypt.o/ 568273527 98 100 100775 3420 ` u!*w   hxP.text = .dataPPhP@.bss  x 0 @~p 0ހ $! "#(! "'qA1 !ސ Pޠ( X@ 0 ss1pp@ +@ 00 1ss1pp!@ K8()08@Psqw rtww 0A1r!pp0E P h2!0001~ǎǞǮ W( ا0   @p~A!@ P  B!A@ @/@p Pс  qA!0ް@Fppr$"p$ρρшpϑљѡppp!!sϑ s ϑs ρtF @a  @ p  qA!   B!A@ @0   @ trA!  BAD !A@~ǎǞǮ Ǿ(WP?8<@D0H~Lp qBp( ߗ FBc!q 'q1 @ p  q! B'pް h  Z 9 . K;c!1A&qrp qp@ ހ  4p !1&.9ZqF{    ~LǎHǞDǮ@Ǿ<8P PW @(#)crypt.c 6.1 87/11/23 :2*" <4,$ >6.&@80( 91)! ;3+# =5-% ?7/'(08@ '/7?&.6>%- 5=$, 4<#+ 3;"* 2:!) 1991)! :2*" ;3+# <4,$?7/'>6.&=5-%      )4%/7(3-!0,1'8"5.*2$                                                                                                                                           * 2 N T \ x       F P z             . V b r           2 D     . 4        @ .text=.dataPh.bss xSaveReg _setkey_encrypt$_cryptctime.o/ 568273536 98 100 100775 2599 ` u!*  xH .textx8 .data   @.bss88H8$ 88WP<@D~Hp, LLpǀ1'2בסzH@80(L LLp  ~HǎDǞ@Ǯ<PPW :"4 mn2"'W Q!Q Q 0<8 # <@ p'PJF" 4#  m  n 4#  m  n!0F 4# m n$LT mn n ȋ2$21  DHX8W@8` @~<2!0!!\1\`A!42A!4"1#x(2"#"t2A!42A!4"1#t't'"dt'"drt'"d\8 d# 2! 0!("d*~<ǎ8@`@W@!:#:#"0$0 #0*0W8 00  0 B!41 -RA!*P%00(# %09(# $@ <^2 00  0 B!4188W @(#)ctime.c 6.1 87/11/23 Day Mon 00 00:00:00 1900 SunMonTueWedThuFriSatJanFebMarAprMayJunJulAugSepOctNovDecTZpPDTPSTW`/Lw/K:/JMFw/(FPn`nv .6X`fnt 28L.textx.data .bss8HSaveReg _ctime_asctime_tzset(_gmtime,_getenv_tzname#_localtime_timezone_daylight ctype.o/ 568273540 98 100 100775 624 ` u!*  (.text .data(@.bss @(#)ctype.c 6.1 87/11/23 ((((( H .text.data(.bssSaveReg __ctypecuexit.o/ 568273544 98 100 100775 418 ` u!*   .text  .data@.bsspRJ[B.text .data.bss_exit_monitor__cleanupdial.o/ 568273559 98 100 100775 5592 ` u!*(  h0 `.text .data ` `h `@.bss  0p@D~H d& &   p   NN  d NTN : F $ d$l dl$x<@ h J l 2 $ h  F ` 0t 80&  ~HǎDǞ@ppW<@DH~LpXL*n ^X,\*hp F `\@%PD΀CLF>6.& x xaDQ:% x x.n ' R0         T   ~F0^  N B P(2p@!P!1 -2ZpA ̓   x  |  xp@p 0Z  J(   6 `    ~LǎHǞDǮ@Ǿ<Wh@DH~Lq  b   r b v x @ 0  "  0 &  $   /$S , S~  xn " lT l8'( h x h/ b2(3 ~LǎHǞDǮ@W8Ȍ  d6 ȶ dp  8X88W84 &88W8 ȓJ88W8 `88W @(#)dial.c 6.1 87/11/23 r/usr/lib/uucp/L-devices/usr/spool/uucp/LCK..<stty for remotewrite to acu%s: Semaphore failure ACUDIR# /dev//dev//dev/Can't unlink lock-file /dev//dev//dev//dev//usr/spool/uucp/LCK..      * 0 6  B D  J R x                    . : F R ` j v             * 4 B H p v |   6 D J b h p ~                   " ( . 4 8 :  P \ f l t x z         B H  V \  j p                    *  6 < H! ` p v            " ,# 8 n t ~   $       %   < P .text .data `h.bss 0SaveReg _dial_signal_fopen_errno_strcpy_strlen_strcat_geteuid_access_creat_getpid_write_undial `_alarm_fclose_open_perror_strncpy_ioctl__iob_fprintf_close_fcntl_strchr_strtok_strcmp_atoi_strrchr_fgets_unlink_utime_device"__debug Xdrand48.o/ 568273570 98 100 100775 2784 ` u!*   H.text< .dataH@.bss@048~<  pq9pA3p 9r  pq90A@3 9P@5@ $p!q!9"ސA3) 9$P3 53~<ǎ8Ǟ4Ǯ0@5@WH4~8p7N<!$#ހ (!D2!G0~<ÃLJt4B~8ǎ4HHW0 Гx0pq0W0 ГD`   00W c P  . P.    0 #b. c.  R&P% #. 0#2@ 4>0c# $. 0#0@4N@P @   W3 c m W      m W        WH4~8p7N<!$#ހ (!D2p7 N<rstDr$2~8ǎ4HHWH4~8p7N<!$#ހ (!D27 N<rstDr$2~8ǎ4HHW @(#)drand48.c 6.1 87/11/23 > 34m &P,2`lTZ|*:FRZbr&2>JXN.text<.dataH.bssSaveReg _drand48_erand48_lrand48_mrand48P_srand48_seed48p_lcong48_nrand48h_jrand48ecvt.o/ 568273578 98 100 100775 1624 ` u!*   X@.text .data@@@@.bssXPHx~Lp(,j~LǎHPPWPHx~Lp(,"~LǎHPPW`?8<@DH~Lp.ޠ:T 2p pp  :X ސ`  p  C@:8 6p  : @$:@$ 1 P@$`^P5%cR:W^XP'86 0":B0C9"5 4r+!+ @$0:  ?05N?:@ 5p  5 @$0:  ( ( :( 0 &009 4 @$05p (  5(T &1  &0   9( ~LǎHǞDǮ@Ǿ<8``W @(#)ecvt.c 6.1 87/11/23 Fn CAy7Aׄ@È@Y@$nt 6BN`2.text.data@.bssXSaveReg _ecvt_fcvt_Reduce_inferrlst.o/ 568273582 98 100 100775 2063 ` u!*@   p.text .datap.@.bss @(#)errlst.c 6.1 87/11/23 0@Th|$8L`p$8Tp.Error 0Not ownerNo such file or directoryNo such processInterrupted system callI/O errorNo such device or addressArg list too longExec format errorBad file numberNo child processesNo more processesNot enough spacePermission deniedBad addressBlock device requiredDevice busyFile existsCross-device linkNo such deviceNot a directoryIs a directoryInvalid argumentFile table overflowToo many open filesNot a typewriterText file busyFile too largeNo space left on deviceIllegal seekRead-only file systemToo many linksBroken pipeArgument out of domainResult too largeNo message of desired typeIdentifier removedChannel number out of rangeLevel 2 not synchronizedLevel 3 haltedLevel 3 resetLink number out of rangeProtocol driver not attachedNo CSI structure availableLevel 2 haltedDeadlock condition if locked  $(,048<@DHLPTX\`dhlptx|.text.datap..bssSaveReg _sys_errlist_sys_nerr execvp.o/ 568273589 98 100 100775 1368 ` u!*@  (h.text(8 .datah@.bss888ȧTT.X88W0<@DH~Lq ހ  /.P PpW dPP!9TX"@Br!4CA@0P(Hq%( 6P)  ~LǎHǞDǮ@Ǿ<W0~s@1tC@ p:G @ /$A B!  1~W @(#)execvp.c 6.1 87/11/23   shPATH:/bin:/usr/bin/bin/sh " .X \ ^ r   " .text(.datah.bss8SaveReg _execlp_execvp_getenv_strchr_execv_errno_sleepfpround.o/ 568273593 98 100 100775 576 ` u!*P   p .textp8 .data @.bss88@B `@z  `  ~<``W @(#)ftok.c 6.1 87/11/23 .textp.data .bss8SaveReg _ftok_statftw.o/ 568273610 98 100 100775 1620 ` u!*  (`.text .data``(`@.bssp@DHLPT~Xrl $l#W4p  @l W$l"Wl!W  x j  P $  /  /  \ ^^>^ A1!. C@ !q. !  ' (  jq  ^ qLH :l  &  D \    ޅ ~XǎTǞPǮLǾHD@W @(#)ftw.c 6.1 87/11/23 ...l l l6 l@ lB l| l l l llllll^lh lvll l lll llll$ l.text.data`(.bssSaveReg _ftw_stat_errno_open_strlen_malloc_close_strcpy_strcmp_lseek_free_readgcvt.o/ 568273616 98 100 100775 872 ` u!*    .text .data @.bss`DHLP~Ty^X (>\^(X'q-\   \'\q'q.1'q2qe\q\-q+\ \'q:0ۋ\>'q0'q.\\q 0 \(1'q2.\ 'q0.2\,q0\q.~TǎP ǞLǮHǾD``W @(#)gcvt.c 6.1 87/11/23 .text.data .bssSaveReg _gcvt_ecvtgetcwd.o/ 568273621 98 100 100775 836 ` u!*,  (.text .data(@.bssH<@~Dpp$p n D) "~Dǎ@Ǟ<HHW @(#)getcwd.c 6.1 87/11/23 rpwd   0 8 B T.text .data(.bssSaveReg _getcwd_errno_malloc_popen_fgets_pclose_strchrgetenv.o/ 568273626 98 100 100775 588 ` u!*   `.text .data`` `@.bss@8~4p ~4ǎ088W @(#)getgrgid.c 6.1 87/11/23   .textX.data .bss SaveReg ",_getgrgid_setgrent_getgrent_endgrentgetgrnam.o/ 568273641 98 100 100775 628 ` u!*X   ` .text`( .data @.bss((@8~<>4p ~<ǎ8@@W @(#)getgrnam.c 6.1 87/11/23     .text`.data .bss(SaveReg _strcmp",_getgrnam_setgrent_getgrent_endgrentgetlogin.o/ 568273647 98 100 100775 850 ` u!*,  0x.text .dataxx0x@.bssh<~@@ $p v$ D $$<D &D(~@ǎ<hhW @(#)getlogin.c 6.1 87/11/23 /etc/utmp    , BN V\.text .datax0.bssSaveReg _ttyslot_open_lseek_read_close_strncpy_getlogingetopt.o/ 568273654 98 100 100775 2020 ` u!*  .textX1 .data@.bssXXP<@D~HPqQpP`*p-p Pp̓PPLPp!'":  HbLMLJ`  P@  Г,L"PP`pQPPQP?b : PPap!'",pPPP~HbNOLJB  2$"  N"Q?PȋzPpPQPȋLPP`pQPQPP~HǎDǞ@Ǯ<PPW @(#)getopt.c 6.1 87/11/23 --: illegal option -- : illegal option -- : option requires an argument -- : option requires an argument -- <<< <& <2<:<F<P<f <t << <<< <<<<<<<<"<@<F<n<<<<< <<< <<<<<<&<2<:<F<L<\<v<~<<.text1.data.bssXSaveReg _getopt_optindP_strcmp_optopt_strchr_opterrH_strlen_write_optarggetpw.o/ 568273660 98 100 100775 976 ` u!*   `0.text`8 .data0@.bss88H<@~D8,("88 8x  'q8!!! 8 81!x#& fqA0:C! ݋(@14340*!!qA0:Cъ)   ~Dǎ@Ǟ<HHW @(#)getpw.c 6.1 87/11/23 r/etc/passwd *@H V  .text`.data0.bss8SaveReg _getpw_fopen_rewind__filbuf__ctypegetpwent.o/ 568273668 98 100 100775 1869 ` u!+  H0.text$ .dataH@.bss08Ȏ"288W8Ȇ88W : W8Ȏ*f 88WH <~@p p(pp : pD*  :.D 0p`ap : D*4&  :D  .p`a$p(p,p0pq,qp ~@ǎ<HHW @(#)getpwent.c 6.1 87/11/23 rr/etc/passwd  JXj,28@Pbp.text$.dataH.bss0SaveReg _fopen_rewind_fclose|"_fgets_strtol_strlen_memchr-_setpwent_endpwent_getpwent_fgetpwent getpwnam.o/ 568273673 98 100 100775 628 ` u!+ X   ` .text`( .data @.bss((H@~D>4p(~Dǎ@HHW @(#)getpwnam.c 6.1 87/11/23     .text`.data .bss(SaveReg _strncmp",_getpwnam_setpwent_getpwent_endpwentgetpwuid.o/ 568273678 98 100 100775 588 ` u!+D   X .textX  .data @.bss  8 ȧ0~4>4p ~4ǎ088W @(#)getpwuid.c 6.1 87/11/23   .textX.data .bss SaveReg ",_getpwuid_setpwent_getpwent_endpwentgetut.o/ 568273689 98 100 100775 3210 ` u!+ @  0X.text= .dataXXX @.bss0`~@4P $ .$ܶ r $$2!02 $ $!nܶ``W8 ȧ~4pzzpxW'z"z!tz!z!&z!' zH': ' , '  '   (=~488WH@~DpWz.z z"  , p~Dǎ@HHWh<~@pnDW'' \%# <%! 0Qa1X0Rb1@8Td1(&' 3Xh1 f p   <DHDD' !΋!!D $$ `^D>0Qa1t&! 0Rb1T&# 8Td14&' 3Xh1 ހ'~@ǎ<hhW@ !02 $ @@W8 <!02 $ 88W@~<p O ȓr~<@@W @(#)getut.c 6.1 87/11/23 /etc/utmp     & ,>DN ^  :HVdr&4>J Vb hv"(2Zn v2:x|.text=.dataX .bss0SaveReg _stat_unlink_open_errno_read_lseek_getutid_strncmp$_fcntl$T_write._close8 _strlen_strcpyB_getutent_getutline_pututline_setutent_endutent_utmpnamehsearch.o/ 568273698 98 100 100775 1794 ` u!+"   80.text8( .data0@.bss8 T&qp^88W888WH<@~Dr` `^ p  p!`Jp` a P/R  p< p!`prp b Fp`^`7Qa1p~Dǎ@Ǟ<HHW8 ~4B " q  PPp prr|Xa~488W8 ~4p prr4X`a~48 8W 0#00W @(#)hsearch.c 6.1 87/11/23 .: Bv 4 @bl~.4:|.text8(.data0.bssSaveReg _hcreate_calloc(_free_hsearchX_strcmp_hdestroyisatty.o/ 568273703 98 100 100775 448 ` u!+'   8 .text8 .data @.bssPT.>@ PPW @(#)isatty.c 6.1 87/11/23 .text8.data .bssSaveReg _isatty_ioctll3.o/ 568273709 98 100 100775 548 ` u!+-p   X.text .dataXXX@.bsspp2 ~4ApGApGAp!G2~W2 ~<p@GApGApGAp!G2~W @(#)l3.c 6.1 87/11/23 .text.dataX.bsspSaveReg _ltol3_l3toll64a.o/ 568273715 98 100 100775 496 ` u!+3P  p .textp8 .data @.bss88 8L0? .090Z2!s s? 8W @(#)l64a.c 6.1 87/11/23 .textp.data .bss8SaveReg _l64aldexp.o/ 568273722 98 100 100775 780 ` u!+:D   X .textX  .data @.bss  P@D~Hr :  .LpL8":GA5pp!`' pq90A@3 95pL1"P>5p(`pq91A 31906~HǎDǞ@PPW @(#)ldexp.c 6.1 87/11/23   .textX.data .bss SaveReg _ldexp_frexp_errnolfind.o/ 568273727 98 100 100775 480 ` u!+?@  x  .textx .data   @.bss@@H8<@~Dq .p W x(~Dǎ@Ǟ<Ǯ8HHW @(#)lfind.c 6.1 87/11/23 .textx.data  .bss@SaveReg _lfindlsearch.o/ 568273733 98 100 100775 544 ` u!+El   @.text` .data@@ @@.bss``P<@DH~Lq .x W &x((~LǎHǞDǮ@Ǿ<PPW @(#)lsearch.c 6.1 87/11/23 D.text.data@ .bss`SaveReg _lsearch_memcpymalloc.o/ 568273742 98 100 100775 1932 ` u!+N    p.text* .datapp p@.bss P48<@DH~LH! ! րqpN$ x((lx! ( 2  !(hր$p0qp((q$ sqp'( (&    rpp  P! ! xF p(P ~LǎHǞDǮ@Ǿ<84PPW! !! WP<@DH~Ly   s  Rq(+p#((p(psp~LǎHǞDǮ@Ǿ<PPW @(#)malloc.c 6.1 87/11/23 tttttttttt t&tJtXtbttttttt$tbtt ttttttttt"t0t:t@t|ttt tBt.text*.datap .bss SaveReg _malloc_sbrk_brk_freex_realloc_memcpymemccpy.o/ 568273748 98 100 100775 432 ` u!+T  H .textH .data @.bssA~"t0As3r21~W @(#)memccpy.c 6.1 87/11/23 .textH.data .bssSaveReg _memccpymemchr.o/ 568273753 98 100 100775 424 ` u!+Y  @ .text@ .data @.bss0@ A#1 ! 1W @(#)memchr.c 6.1 87/11/23 .text@.data .bssSaveReg _memchrmemcmp.o/ 568273759 98 100 100775 424 ` u!+_  @ .text@ .data @.bss01, A#1$B  W @(#)memcmp.c 6.1 87/11/23 .text@.data .bssSaveReg _memcmpmemcpy.o/ 568273767 98 100 100775 1420 ` u!+g  X.textX .data@.bss0+K "AC1!WAC$AhAC%hAC&hACWQWPX%AC1QCGxBBSD"vt ('"AC8('p'"$AC4$X$AhAC!FhAC"4P4f4r4x4444444.textp!.data8.bssPpSaveReg _monitor_profil_creat_write_perror_close_getenv_getpid____ArgvH_strrchr_strcpy__countbase__countmax nlist.o/ 568273804 98 100 100775 1468 ` u!+|   `.text .data`` `@.bssh<@DH LP΀~Ty  p   (up   ώl l XP X fyl !F  *l $XF  Q&    *     .!  ~  r'V R(84>   q  Q چ  ~TǎPǞLǮHǾD@<W @(#)nlist.c 6.1 87/11/23 d. dJ d^ d| d d d d d d d> dR dZ df d d ddd( d4 d.text.data` .bssSaveReg _nlist_open_read_close_lseek_malloc_free_strcmp_strncmpperror.o/ 568273810 98 100 100775 851 ` u!+4   8H.text .dataHH8H@.bssH@~Dpp pp  l"  h!~Dǎ@HHW @(#)perror.c 6.1 87/11/23 : Unknown errordd d dd d d d dd d d" d*d2 d.text.dataH8.bssSaveReg _perror_errno_strlen_write_sys_nerr_sys_errlist putenv.o/ 568273818 98 100 100775 1144 ` u!+   (X.text .dataXX(X@.bssH<@~Dpqx0 p Fxxp Z'p" ppp~Dǎ@Ǟ<HHWH<@~Dpp, L  q q~Dǎ@Ǟ<HHW 0=# 1 2W @(#)putenv.c 6.1 87/11/23 ddd dddd& d8d:dF dLdPdRdbddd|d~ddddd.text.dataX(.bssSaveReg _putenv_environ_realloc_malloc_memcpyputpwent.o/ 568273824 98 100 100775 738 ` u!+   @x.text .dataxx@x@.bssXP~T 8q,Q%(8 (, 0 ȋ  ~TǎPX XW @(#)putpwent.c 6.1 87/11/23 ,%s%s:%s:%u:%u:%s:%s:%s": .text.datax@.bssSaveReg _fprintf__flsbuf_putpwentqsort.o/ 568273833 98 100 100775 1672 ` u!+   (@.texth .data@@(@@.bsshhH8<@~Dr(P` h`,h( `ph`ppl(~Dǎ@Ǟ<Ǯ8HHW`@DHLPT~XPlueU^\!7(' aP..d/R.(4 pW ؍ (d p W  Ƌ،4)Dn8,*  (~XǎTǞPǮLǾHD@``WH<@~D֐lq:`0))`)&(q ~Dǎ@Ǟ<HHWP@DH~L֠lrD`:*> *2*&`*0 )'q ~LǎHǞDǮ@PPW @(#)qsort.c 6.1 87/11/23 LLLLL LL L L,L4LLLL LL& L2 L8LB LLL L L LL L.text.data@(.bsshSaveReg _qsort_malloc_realloc_memcpyrand.o/ 568273839 98 100 100775 488 ` u!+4   @(.text@ .data(@.bssWANm09c W @(#)rand.c 6.1 87/11/23 .text@.data(.bssSaveReg _srand_randri.o/ 568273845 98 100 100775 396 ` u!+  H.textH .data@.bss   ?  ?0 6    W6    W.textH.data.bss_Reduce_infsetjmp.o/ 568273851 98 100 100775 416 ` u!+  X.textX .data@.bssp  $Wpǀǐ Ǡǰ $WW.textX.data.bss_setjmp_longjmpsleep.o/ 568273858 98 100 100775 884 ` u!+p    (.text .data @.bss(P<@DH~Lp &(( xȓp p ~LǎHǞDǮ@Ǿ<PPW8P88W @(#)sleep.c 6.1 87/11/23   &, :@ HX p .text .data .bss(SaveReg _sleep_alarm_signal_setjmp_pause_longjmpssignal.o/ 568273865 98 100 100775 588 ` u!+   XH.texth .dataHH H@.bsshhX!( php hW8p!h "  p"02hW88W @(#)ssignal.c 6.1 87/11/23 LL L2L.text.dataH .bsshXSaveReg _ssignal_gsignalstrcat.o/ 568273871 98 100 100775 348 ` u!+  (.text( .data@.bss!1021!0W.text(.data.bss_strcatstrchr.o/ 568273877 98 100 100775 332 ` u!+  .text .data@.bss !  W.text.data.bss_strchrstrcmp.o/ 568273883 98 100 100775 340 ` u!+  .text .data@.bss!2! W.text .data.bss_strcmpstrcpy.o/ 568273889 98 100 100775 332 ` u!+  .text .data@.bss!21!0W.text.data.bss_strcpystrcspn.o/ 568273896 98 100 100775 348 ` u!+  (.text( .data@.bss!@@2S1PEW.text(.data.bss_strcspnstrlen.o/ 568273902 98 100 100775 332 ` u!+  .text .data@.bss! W.text.data.bss_strlenstrncat.o/ 568273908 98 100 100775 384 ` u!+  8.text8 .data@.bss2!A@BA!@10@AW.text8.data.bss_strcatn_strncatstrncmp.o/ 568273915 98 100 100775 384 ` u!+  8.text8 .data@.bss2!10B!0 W.text8.data.bss_strcmpn_strncmpstrncpy.o/ 568273921 98 100 100775 384 ` u!,  8.text8 .data@.bss2!@4(ARQ!P4AQW.text8.data.bss_strcpyn_strncpystrpbrk.o/ 568273928 98 100 100775 356 ` u!,  0.text0 .data@.bss. $!@R!PEP @W.text0.data.bss_strpbrkstrrchr.o/ 568273934 98 100 100775 340 ` u!,  .text .data@.bss!120W.text .data.bss_strrchrstrspn.o/ 568273940 98 100 100775 348 ` u!,  (.text( .data@.bss!@@2S1P EW.text(.data.bss_strspnstrtod.o/ 568273951 98 100 100775 1484 ` u!,   0.text0h .data@.bsshh`<@DHL P~TP^\ώX(!0+" -^\Q^\!p1@Π. JΠ0 Al0ޠ ̈ ޠ ̈:zA@ޠ ̈ޠ ̈:zp!aΠ. PL91935973<E( e0@ (@@0@ (@@ @+ @-1!p@GDD@B@Ap!@GDD@0 (:  ܆p)::|p8p?qq5|q`( K ?0@@A@ q5'@sA@  6! #;K;;#n\ 2  ~TǎPǞLǮHǾD@<``W @(#)strtod.c 6.1 87/11/23 @(#)atof.c 6.1 87/11/23 LLLLtLvLLLLLL&L L.text0 .data.bsshSaveReg _strtod__ctype_ldexpstrtok.o/ 568273958 98 100 100775 620 ` u!,&   H.texth .dataHH H@.bsshh@ 8~< hp Rq 2PPhh~<ǎ8@@W @(#)strtok.c 6.1 87/11/23 LL LL*L.text.dataH .bsshSaveReg _strtok_strspn_strpbrkstrtol.o/ 568273966 98 100 100775 1156 ` u!,.   0 .text0 .data @.bss0A~@ $ p '"' H 1p '"(  p+r ' p-' 120 $ x X p '"' @ '"$ Ћ$p '""  r  @ 08#p'"p ' #px' pX' 2p '"$ Ћ$p '""   ހ1pxwwp@pxwtp Ћ$ހpxwrp p@4 ~ǎǞW @(#)strtol.c 6.1 87/11/23 rt (*XZ.text0.data .bssSaveReg _strtol__ctypeswab.o/ 568273973 98 100 100775 448 ` u!,5   X .textX .data @.bss  1"~&@$2zDpHz"s(p '$(!~ǎW @(#)swab.c 6.1 87/11/23 .textX.data .bss SaveReg _swabtell.o/ 568273980 98 100 100775 432 ` u!,<   ( .text( .data @.bss@!D@@W @(#)tell.c 6.1 87/11/23 .text(.data .bssSaveReg _tell_lseektfind.o/ 568273986 98 100 100775 496 ` u!,BP  0.text .data00 0@.bssPPH<@~Dqp F8 W( q~Dǎ@Ǟ<HHW @(#)tfind.c 6.1 87/11/23 .text.data0 .bssPSaveReg _tfindtolower.o/ 568273993 98 100 100775 392 ` u!,I  .text .data @.bssAZ W @(#)tolower.c 6.1 87/11/23 .text .data .bssSaveReg _tolowertoupper.o/ 568273999 98 100 100775 392 ` u!,O  .text .data @.bssaz W @(#)toupper.c 6.1 87/11/23 .text .data .bssSaveReg _touppertsearch.o/ 568274008 98 100 100775 1104 ` u!,X`    (.textH .data(( (@.bssHHH<@~Dqp b8WD q ~Dǎ@Ǟ<HHWH8<@~Dqpǡ ,ǧ  q  W Q%% RN! <ǁ Lj( (! ~Dǎ@Ǟ<Ǯ8HHW@  @@WH<@~Dp(WJ(W((W((W~Dǎ@Ǟ<HHW @(#)tsearch.c 6.1 87/11/23 ,6 ,.text.data( .bssHSaveReg _tsearch_malloc_tdeleteP_free_twalkdttyname.o/ 568274017 98 100 100775 1116 ` u!,a  x(  .textxH .data  ( @.bssHH h@~Dp> >x& $|    @ qHpH.z H@HJHX Ndzz<\  (pZz<H<H " C q+~Dǎ@W @(#)ttyname.c 6.1 87/11/23 /dev/, , , ,R,X,^ ,d,n ,t,~ ,,,,,,.textx.data (.bssH SaveReg _ttyname_isatty_fstat_open_strcpy_strcat_stat_close_read_lseekttyslot.o/ 568274025 98 100 100775 888 ` u!,i`  0.text .data0@.bssp@D~H:p,*pp /  npD^fzzz z$X, *q L $| $! j~HǎDǞ@ppW @(#)ttyslot.c 6.1 87/11/23 /etc/utmp $ b n   .text .data0.bssSaveReg _ttyslot_ttyname_strrchr_open_strncmp_close_readclrerr.o/ 568274033 98 100 100775 398 ` u!,q   .text .data @.bss  W @(#)clrerr.c 6.1 87/11/23 .text.data .bssSaveReg _clearerrctermid.o/ 568274040 98 100 100775 496 ` u!,x<   @0.text@ .data0@.bss8 .88W @(#)ctermid.c 6.1 87/11/23 /dev/tty.text@.data0.bssSaveReg _ctermid_strcpycuserid.o/ 568274047 98 100 100775 706 ` u!,   (.textH .data(( (@.bssHH@8~<p pH4&2 ~<ǎ8@@W @(#)cuserid.c 6.1 87/11/23 ,, , , , , ,.text.data( .bssHSaveReg _cuserid_strcpy_getuid"_getlogin_getpwuid_endpwentdata.o/ 568274054 98 100 100775 1882 ` u!,(  8.text .data8@.bss @(#)data.c 6.1 87/11/23   .text.data8.bssSaveReg __iob__smbuf__sibuf__sobuf__stdbuf__bufendtab__lastbufdoprnt.o/ 568274069 98 100 100775 8130 ` u!,   H(x.text .dataxxHx@.bss(pȸжضǼ` @P PPdPpRUPd%py}kg,Pd(VP p:w]ѡ[q" ,h0hְhFpc(stdxX܋ ``d``Pd([P  ,h0hְh``d``(Pd[PQ̡P! ! ,h0hְh``d``'Π- 8ы0):@0CAMр ѡ(Pd[P Q фP р}-!ш},h0hְh``d``/ qфыh``d``/ qфы4H4D``csd(u$+\-` d#h.l*x0Āelh%ox0XeEfgGn9ld`` Xd``@ X L"  !X`d`` }8; -!104@@ V 8@  /  +!104"  /  !104 @ /00 0ѡ $@ZPECѡMѡ pX }LuDP ^d`` } pq 5#"0ѡP n b V J@ L6@ *Hd``H Ld``L@     0 9: @ LHz XWC0_D0_D0d`` - Xp&@ 4DP  a@ 'L-DP pX Oo6204x 0 89"X9  DP   @ / & Lg `h`` L0!#и0l@pȧN(8p - 84D  5  + 84 84g ю 0ѡaPLP .aP6 QaP PDPT ׶`Xpxg 06PlQPU):RECAaFSRQaVrgagal- +aea E`<rvp@DD #2#: @ / & Lg `h`` L0<#0l@pȧN(8p`LPl/Q)-0!-8! 4B +8! 4   8! 4E00@qA0- '1qA@Aq@ `  .'qF<Ad &$ T DA@> QP&#1qA@Aq@pX`L#H L@ & L ! Lg `h``0#0l@pȧN(28 l`L FF=11=CCAM 0AMAPlVA@LE@LpX}@4gDd``\H  >  P PP\ @p/x,h0hְhzkg(Pd(VPp: w q&x,h0h|ְh@p@ekd,d( 8DA48,h0h ְh ֠P舡/,h0hְhJkd(Pd(VP@:0D A&,h0hlְhpTkg(d( wq( ,h0hְh     / ֠T舡/,h0hְhJkd*Pd(VP@<0D A&,h0hdְh fp@p\kg,d( <wq,<,h0hְh ֠H\/x,h0hְhJkd*Pd(VP@< D A&x,h0hPְhH{ p   d( @  @ , 2 ! . 00  +    pؐذW 000000000000000000000123456789abcdef0123456789ABCDEF6djpv&flrx>DJPZhx$2F (LVlz:HR`v|    4 < J R r       6 h r x             . 6 P X p x   N T Z j |            N d p z          &,2Lpz(06<B\$.6<BHb(.BJPV\v 4TZ`fl.text.dataxH.bss($__doprnt_ecvt_fcvt.__bufendtab__dowrite__xflsbuf__bufsyncdoscan.o/ 568274087 98 100 100775 3620 ` u!,   Hx .text H h% .data  x $@.bss h hhLPTX\`~dpЩ.   d!0!#"(   % %Xp!! .D  * ߎ ޠ l h  [ h  ΰl cf[^\!0!#"( (cs [(~(^ *>h^,"~(^ *;^,h    ~dǎ`Ǟ\ǮXǾTPLhhWP8<@DHL~P~P^^^ϞT^^x^:d2p W^Q^ΰ L +!R  ->^Q^d![RQ^ ^P v 0&  7W(!^Q^.^Q^e E|t^Q^d,! + - B!s` T). 2 l.242# .242""7^P l$^PLh(^z ^P~PǎLǞHǮDǾ@<8W`<@DHLP~T~ XcsR[\RP^\*)b!!0#.0#"( ^\P!+"  TnX  c ~TǎPǞLǮHǾD@<``WH<@~Dp^qV 1 ]2 - qR Z -87#@]$*'B2 2#Rq q1 ]2~Dǎ@Ǟ<HHW @(#)doscan.c 6.1 87/11/23    ,,,,,,,,,,,,,,$ L L  L8 L: LR  L  L  L L L` Lb L  L L L  L LF  L  L L L L L L L  L L L:  L  L`  LR  Lx Lz L  L N  L  L  L  L  L  L  L $ L ( L , L 0 L 4 L 8 L < L @ L D L H L L L P L T L X L \ L ` L.text H%.data x.bss hSaveReg __doscan__ctype__filbuf_ungetc_atof_memsetfdopen.o/ 568274095 98 100 100775 746 ` u!,    .text .data @.bssH<@~D8p   pa(^a( 2r w4    ( "   0+       ~Dǎ@Ǟ<HHW @(#)fdopen.c 6.1 87/11/23  T .text.data .bssSaveReg _fdopen_lseek__findiop__bufendtabfgetc.o/ 568274104 98 100 100775 464 ` u!,   H .textH .data @.bss86 88W @(#)fgetc.c 6.1 87/11/23 .textH.data .bssSaveReg _fgetc__filbuffgets.o/ 568274113 98 100 100775 854 ` u!,L   (@.text( .data@@.bssX?@DHLP~Tr8     *8  ' p7! p ?  ~TǎPǞLǮHǾD@XXW @(#)fgets.c 6.1 87/11/23 @(#)stdiom.h 6.1 87/11/23 > ~   .text(.data@.bssSaveReg _fgets__filbuf_memccpy__bufendtab__bufsyncfilbuf.o/ 568274121 98 100 100775 960 ` u!,  P .textP .data @.bssH@~Dp 4W & !   D 6ހ  @  (  ! p!!7 R   .   W    ~Dǎ@HHW @(#)filbuf.c 6.1 87/11/23   * 4 6 ^ ` v .textP .data .bssSaveReg __filbuf__iob_fflush_read$__findbuf__lastbuf__bufendtabfindiop.o/ 568274129 98 100 100775 536 ` u!,8   @ .text@ .data @.bss (  W @(#)findiop.c 6.1 87/11/23  .text@.data .bssSaveReg __iob__findiop__lastbufflsbuf.o/ 568274142 98 100 100775 2758 ` u!,|  @.text! .data@@.bss8 ȧ~4p.q(~488W@8~<pp ~W  < r   ~<ǎ8@@W8 ȧ~4p T g "Q%(   ~488WH<΀ ~@q R  Bb p'(! ,>     BG G!     g   ,Q"%(  D b j D p     ~@ǎ<HHWH<@~DpǐLJ D   p  p' (. (   ~Dǎ@Ǟ<HHW8 ȧ~4p  *        |'Q!R D D p%  ' p7! ,~488W@8~<p  ( ppPW( pp^$*    p& ppPWƆW @  ~<ǎ8@@WP pR a!` !W @(#)flsbuf.c 6.1 87/11/23 @(#)stdiom.h 6.1 87/11/23   L \ rdf>@f:<,<~.text!.data@.bssSaveReg __iob_fclose_fflush_close_errno_free__flsbuf4"_write__wrtchk.x8l__smbuf__stdbuf_malloc_isattyB__cleanup__lastbuf__xflsbuf__bufendtab__bufsync__findbuffopen.o/ 568274152 98 100 100775 1078 ` u!,   .text .data @.bssH@~Dq< l~Dǎ@HHWH<@~Dr '$~Dǎ@Ǟ<HHWH<0@~Dr 0 (+R a(a( <r NwX   @   "    t  )r!  )a!"  p~Dǎ@Ǟ<HHW @(#)fopen.c 6.1 87/11/23   j  .text.data .bssSaveReg _fopen_freopen_fclose_open_lseek__findiop__bufendtabfprintf.o/ 568274159 98 100 100775 520 ` u!,T   (.textH .data(( (@.bssHH@~<p.`W .`&0 2  &'  ~<@@W @(#)fprintf.c 6.1 87/11/23 ,.text.data( .bssHSaveReg _fprintf__doprntfputc.o/ 568274167 98 100 100775 488 ` u!,4   ` .text`( .data @.bss((8 0 2 #*0 88W @(#)fputc.c 6.1 87/11/23  .text`.data .bss(SaveReg _fputc__flsbuffputs.o/ 568274177 98 100 100775 1124 ` u!-  @P.text .dataPP@P@.bss`DHLPTX~\q  *"(  D   p   Ǘ  8І ρ  ' p7! 80 @  0 *>  (~\ǎXǞTǮPǾLHD``W @(#)fputs.c 6.1 87/11/23 @(#)stdiom.h 6.1 87/11/23 t. t0 tH tt t t t t t tt.text .dataP@.bssSaveReg _fputs__wrtchk_memccpy_strlen_write$__bufendtab__xflsbuf__bufsyncfread.o/ 568274186 98 100 100775 862 ` u!- T   0@.text0 .data@@.bssX?@DHLP~Ts @   aP/\ (  )  ' p7! h (  <~TǎPǞLǮHǾD@XXW @(#)fread.c 6.1 87/11/23 @(#)stdiom.h 6.1 87/11/23 P    .text0.data@.bssSaveReg _fread__filbuf_memcpy__bufendtab__bufsyncfseek.o/ 568274195 98 100 100775 832 ` u!-x    (.textH .data(( (@.bssHHP<@DH~Lp   W |tlǧ" !  40,'  W     )jV  HHW     ) ~LǎHǞDǮ@Ǿ<PPW @(#)fseek.c 6.1 87/11/23 ,, ,,.text.data( .bssHSaveReg _fseek_lseek_fflushftell.o/ 568274203 98 100 100775 552 ` u!-t   H.texth .dataHH H@.bsshh@~<  pDQ  ,pa` qv  !օ~<@@W @(#)ftell.c 6.1 87/11/23 ,L.text.dataH .bsshSaveReg _ftell_lseekfwrite.o/ 568274213 98 100 100775 1228 ` u!-%|  @.text .data@@.bssX<@DHLPҧ~TsRNW  ( ( D  \ pױ'(R (> )     ,Z   aP/\ +! (() )((  ' p7! BW  D ,,-  ~TǎPǞLǮHǾD@<XXW @(#)fwrite.c 6.1 87/11/23 @(#)stdiom.h 6.1 87/11/23 : < r   & ( : lz .text .data@.bssSaveReg _fwrite__wrtchk_write_memcpy_memchr$__bufendtab__xflsbuf__bufsyncgetchar.o/ 568274221 98 100 100775 596 ` u!--   X .textX .data @.bss  8088W @(#)getchar.c 6.1 87/11/23  .textX .data .bss SaveReg _getchar__iob__filbufgetpass.o/ 568274231 98 100 100775 1504 ` u!-7d  0.text# .data0@.bss`<@D~Hp* r T.NÞT T T.N p (' 'q̎>j!!      $!$T T.N ̆~HǎDǞ@Ǯ<``WW @(#)getpass.c 6.1 87/11/23 r/dev/tty  $ J P R X ^j~         $ ( * 6<FNT~.text#.data0.bssSaveReg _getpass_fopen_setbuf_signal_ioctl__iob_fputs__filbuf__flsbuf_fclose_getpid_killgets.o/ 568274240 98 100 100775 1226 ` u!-@    @.text # .data@@.bssP@DH~LB$  p*7yx    p0!r  , ~LǎHǞDǮ@PPW @(#)gets.c 6.1 87/11/23 @(#)stdiom.h 6.1 87/11/23  ( 8:DHJRVXhjnpv x |~ .text #.data@.bssSaveReg _gets__iob__filbuf_memccpy__bufendtab__bufsyncgetw.o/ 568274249 98 100 100775 560 ` u!-I|   P.textp .dataPP P@.bssppH8<~@pϞD8 !)W     D~@ǎ<Ǟ8HHW @(#)getw.c 6.1 87/11/23 T.text.dataP .bsspSaveReg _getw__filbufpopen.o/ 568274259 98 100 100775 1516 ` u!-Sp  H0.textH  .data0@.bss  h?HLPTX`~\(   r `d rd `p  st (r p z 'n f(    p   ~\ǎXǞTǮPǾLHhhWP8<@D~Hq p߁ L8    L\RHp L~HǎDǞ@Ǯ<Ǿ8PPW @(#)popen.c 6.1 87/11/23 -csh/bin/sh$ 0BN V|       BLXdp~.textH.data0.bss SaveReg _popen_pipe_fork_close_fcntl_execl__exit_fdopen_pclose_fclose_signal_waitprintf.o/ 568274267 98 100 100775 632 ` u!-[   0.textP .data00 0@.bssPP@\.`P.\(0 2  .   @@W @(#)printf.c 6.1 87/11/23 44444 44 4.text.data0 .bssPSaveReg _printf__iob__doprntputchar.o/ 568274275 98 100 100775 612 ` u!-c   h .texth0 .data @.bss008  !" 88W @(#)putchar.c 6.1 87/11/23  .texth .data .bss0SaveReg _putchar__iob__flsbufputs.o/ 568274285 98 100 100775 1544 ` u!-m  @X.text/ .dataXX@X@.bssX?@DHLP~T` 2P&.$D  pס   րq 7|x   p0!B*! D   ~TǎPǞLǮHǾD@XXW @(#)puts.c 6.1 87/11/23 @(#)stdiom.h 6.1 87/11/23 |||||||||| |4|6|< |> |H|J|P |d|f|~ ||||||||||||| | ||||| ||||| | | |.text/.dataX@.bssSaveReg _puts__iob__wrtchk_memccpy$__bufendtab__xflsbuf__bufsyncputw.o/ 568274294 98 100 100775 560 ` u!-v|   P.textp .dataPP P@.bsspp@8~<X~X.`X\n\\Qq"^\!q^\ ~<ǎ8@ @W @(#)putw.c 6.1 87/11/23 T.text.dataP .bsspSaveReg _putw__flsbufrew.o/ 568274302 98 100 100775 544 ` u!-~X   x  .textx@ .data   @.bss@@@~<pB  2   W    ~<@@W @(#)rew.c 6.1 87/11/23 $ $.textx.data  .bss@SaveReg _rewind_fflush_lseekscanf.o/ 568274311 98 100 100775 740 ` u!-   x.text .dataxx x@.bss@\.`.\4@@W@.` >`#@@WX@~D.x qώxTP.LH@HU(~Dǎ@XXW @(#)scanf.c 6.1 87/11/23 || | |D |^ |.text.datax .bssSaveReg _scanf__iob__doscan_fscanf_sscanf_strlensetbuf.o/ 568274321 98 100 100775 848 ` u!-<    .text .data @.bss@48~<p P     Z   & pp$ ppPW2 p @  ~<ǎ8Ǟ4@@W @(#)setbuf.c 6.1 87/11/23   , @ B P h p .text .data .bssSaveReg _setbuf_free__stdbuf__smbuf_isatty__bufendtabsetvbuf.o/ 568274330 98 100 100775 780 ` u!-   ( .text( .data @.bss@48~<p    B  @(    pj'   !'   'p~<ǎ8Ǟ4@@W @(#)setvbuf.c 6.1 87/11/23 : |  .text(.data .bssSaveReg _setvbuf_free_malloc__bufendtabsprintf.o/ 568274339 98 100 100775 488 ` u!-4   ` .text`( .data @.bss((P.p0>@DH".L @.M.p.@.DPPW @(#)sprintf.c 6.1 87/11/23  .text`.data .bss(SaveReg _sprintf__doprntdowrite.o/ 568274348 98 100 100775 680 ` u!-   @P.text .dataPP@P@.bssP@DH~Lr @D''!' )7) ~LǎHǞDǮ@PPW @(#)dowrite.c 6.1 87/11/23 @(#)print.h 6.1 87/11/23 t t& t.text.dataP@.bssSaveReg _fwrite_memcpy__dowrite__bufsyncsystem.o/ 568274357 98 100 100775 816 ` u!-,   0x.text .dataxx0x@.bssXDHL~Pp6.( 7pT   T~PǎLǞHǮDXXW @(#)system.c 6.1 87/11/23 -csh/bin/sh    & > H .text .datax0.bssSaveReg _system_fork_execl__exit_signal_waittempnam.o/ 568274368 98 100 100775 1504 ` u!-  ``.text`h .data`@.bsshhX?@DHLP,~T"p8  q  p :(T (, pX@ H0L   (" !%dTd!0A21 Z2#!! ~TǎPǞLǮHǾD@XXW@8~<p,8χ, /! ~<ǎ8@@W @(#)tempnam.c 6.1 87/11/23 //usr/tmp/TMPDIR/usr/tmp//tmpXXXXXXAAA`LLL LL L> Lj L LL LL LL L L L&L. L6L< LBLpLLLdL.text`.data`.bsshSaveReg _tempnam_strlen_getenv_malloc_access_strcat_strncat_mktemp_strcpytmpfile.o/ 568274377 98 100 100775 572 ` u!-`   X0.textX0 .data0@.bss00X?~8@? 0p ?~8XXW @(#)tmpfile.c 6.1 87/11/23 w+/usr/tmp/  .textX.data0.bss0SaveReg _tmpfile_tmpnam_fopen_unlinktmpnam.o/ 568274386 98 100 100775 720 ` u!-   H @.text .data@@H@@.bss @~<q`*xlx!0a21 z2#!!~<@@W @(#)tmpnam.c 6.1 87/11/23 /usr/tmp/XXXXXXaaa/usr/tmp/llll ll ll( l.text .data@H.bss SaveReg _tmpnam_strcpy_strcat_mktempungetc.o/ 568274395 98 100 100775 480 ` u!-@  x  .textx .data   @.bss@@ ! ^ 0(,01  !W @(#)ungetc.c 6.1 87/11/23 .textx.data  .bss@SaveReg _ungetcvfprintf.o/ 568274405 98 100 100775 534 ` u!-T   (.textH .data(( (@.bssHH@~<p 1,W  "  &'  ~<@@W @(#)vfprintf.c 6.1 87/11/23 ,.text.data( .bssHSaveReg __doprnt_vfprintfvprintf.o/ 568274414 98 100 100775 616 ` u!-   x  .textx@ .data   @.bss@@@P (0 2  *    @@W @(#)vprintf.c 6.1 87/11/23 $$$$$ $$$.textx.data  .bss@SaveReg _vprintf__iob__doprntvsprintf.o/ 568274424 98 100 100775 494 ` u!-,   X .textX  .data @.bss  P@1 .@DH".L @.M.@.DPPW @(#)vsprintf.c 6.1 87/11/23 .textX.data .bss SaveReg __doprnt_vsprintfaccess.o/ 568274434 98 100 100775 364 ` u!.  .text .data@.bss!![JW.text.data.bss_accesscerroracct.o/ 568274443 98 100 100775 364 ` u!.   .text .data@.bss3[LW.text.data.bss_acctcerroralarm.o/ 568274452 98 100 100775 344 ` u!.  .text .data@.bss.text.data.bss_alarmcerrorchdir.o/ 568274461 98 100 100775 364 ` u!.  .text .data@.bss [LW.text.data.bss_chdircerrorchmod.o/ 568274470 98 100 100775 364 ` u!.&  .text .data@.bss![JW.text.data.bss_chmodcerrorchown.o/ 568274479 98 100 100775 372 ` u!./  .text  .data@.bss2![HW.text .data.bss_chowncerrorchroot.o/ 568274488 98 100 100775 364 ` u!.8  .text .data@.bss=[LW.text.data.bss_chrootcerrorclose.o/ 568274497 98 100 100775 364 ` u!.A  .text .data@.bss[PW.text.data.bss_closecerrorcreat.o/ 568274506 98 100 100775 364 ` u!.J  .text .data@.bss![JW.text.data.bss_creatcerrordup.o/ 568274515 98 100 100775 364 ` u!.S  .text .data@.bss!)[NW.text.data.bss_dupcerrordup2.o/ 568274524 98 100 100775 432 ` u!.\   ( .text( .data @.bss8 @ B88W @(#)dup2.c 6.1 87/11/23 .text(.data .bssSaveReg _dup2_dupexecl.o/ 568274533 98 100 100775 432 ` u!.e   0.text0 .data@.bss. >$.;0[6W.text0.data.bss_environ_execlcerrorexecle.o/ 568274542 98 100 100775 396 ` u!.n  8.text8 .data@.bss. >$! 1.;[*W.text8.data.bss_execlecerrorexecv.o/ 568274551 98 100 100775 416 ` u!.w   .text  .data@.bss!;0[DW.text .data.bss_environ_execvcerrorexecve.o/ 568274561 98 100 100775 364 ` u!.  .text .data@.bss2!;[HW.text.data.bss_execvecerrorexit.o/ 568274570 98 100 100775 324 ` u!.  .text .data@.bss[B.text.data.bss__exitfcntl.o/ 568274579 98 100 100775 372 ` u!.  .text  .data@.bss2!>[ DW.text .data.bss_fcntlcerrorfork.o/ 568274590 98 100 100775 364 ` u!.  .text .data@.bss[ NW.text.data.bss_forkcerrorfstat.o/ 568274600 98 100 100775 372 ` u!.  .text  .data@.bss![ FW.text .data.bss_fstatcerrorftime.o/ 568274609 98 100 100775 372 ` u!.  .text  .data@.bssB[ HW.text .data.bss_ftimecerrorgetegid.o/ 568274619 98 100 100775 336 ` u!.  .text .data@.bssA[W.text.data.bss_getegidcerrorgeteuid.o/ 568274628 98 100 100775 336 ` u!.  .text .data@.bss@[W.text.data.bss_geteuidcerrorgetgid.o/ 568274638 98 100 100775 336 ` u!.  .text .data@.bss/[W.text.data.bss_getgidcerrorgetpid.o/ 568274647 98 100 100775 336 ` u!.  .text .data@.bss[W.text.data.bss_getpidcerrorgetppid.o/ 568274656 98 100 100775 344 ` u!.  .text .data@.bss[W.text.data.bss_getppidcerrorgetuid.o/ 568274666 98 100 100775 336 ` u!.  .text .data@.bss[W.text.data.bss_getuidcerrorgtty.o/ 568274675 98 100 100775 364 ` u!.  .text .data@.bss2! [HW.text.data.bss_gttycerrorioctl.o/ 568274685 98 100 100775 364 ` u!.  .text .data@.bss2!6[HW.text.data.bss_ioctlcerrorkill.o/ 568274694 98 100 100775 364 ` u!/  .text .data@.bss!%[NW.text.data.bss_killcerrorlink.o/ 568274705 98 100 100775 364 ` u!/  .text .data@.bss! [JW.text.data.bss_linkcerrorlockf.o/ 568274717 98 100 100775 872 ` u!/    0.text  .data0p@.bssP0!.BDH .DHpW@.@@.@h@.@΋P@.@&@z Z J84 !& -PPW @(#)lockf.c 6.1 87/11/23  $<4Ll ~    .text .data0.bssSaveReg _lockf_fcntl_errnolseek.o/ 568274726 98 100 100775 364 ` u!/&  .text .data@.bss2![LW.text.data.bss_lseekcerrormsgsys.o/ 568274737 98 100 100775 720 ` u!/1   .text .data @.bss@ 11>@@WH@11.($ HHWP~LpxA.(>,01'4~LPPWP~LpA1.('>,4~LPPW @(#)msgsys.c 6.1 87/11/23 :x.text.data .bssSaveReg _msgget_syscall_msgctl_msgrcv _msgsndTmknod.o/ 568274747 98 100 100775 372 ` u!/;  .text  .data@.bss2![HW.text .data.bss_mknodcerrormount.o/ 568274757 98 100 100775 364 ` u!/E  .text .data@.bss2![HW.text.data.bss_mountcerrornexect.o/ 568274767 98 100 100775 364 ` u!/O  .text .data@.bss!;[JW.text.data.bss_exectcerrornice.o/ 568274777 98 100 100775 364 ` u!/Y  .text .data@.bss"[PW.text.data.bss_nicecerroropen.o/ 568274787 98 100 100775 364 ` u!/c  .text .data@.bss2![HW.text.data.bss_opencerrorpause.o/ 568274797 98 100 100775 356 ` u!/m  .text .data@.bss[RW.text.data.bss_pausecerrorpipe.o/ 568274807 98 100 100775 380 ` u!/w  (.text( .data@.bss*[J.W.text(.data.bss_pipecerrorplock.o/ 568274817 98 100 100775 356 ` u!/  .text .data@.bss-[PW.text.data.bss_plockcerrorprofil.o/ 568274827 98 100 100775 352 ` u!/  .text .data@.bssC2!,[W.text.data.bss_profilcerrorptrace.o/ 568274837 98 100 100775 412 ` u!/   (.text( .data@.bssPPC2![ :W.text(.data.bss_ptracecerror_errnoread.o/ 568274847 98 100 100775 364 ` u!/  .text .data@.bss2![HW.text.data.bss_readcerrorsbrk.o/ 568274857 98 100 100775 568 ` u!/\   X.textX .dataP@.bss[HW [W  .textX.data.bss_end_sbrk_brkcerror__ndsemsys.o/ 568274868 98 100 100775 632 ` u!/   X.textx .dataXX X@.bssxxPH~Lq>t.(5,(7$~LǎHPPWH@15.($HHWH@15.($HHW @(#)semsys.c 6.1 87/11/23 \\F\.text.dataX .bssxSaveReg _semctl_syscall_semget_semop,setgid.o/ 568274879 98 100 100775 364 ` u!/  .text .data@.bss.[PW.text.data.bss_setgidcerrorsetpgrp.o/ 568274889 98 100 100775 372 ` u!/   .text .data@.bss'[W'[W.text.data.bss_setpgrp_getpgrpcerrorsetuid.o/ 568274899 98 100 100775 364 ` u!/  .text .data@.bss![NW.text.data.bss_setuidcerrorshmsys.o/ 568274910 98 100 100775 672 ` u!/   `.text .data`` `@.bssH@14.($8HHWH@14.($HHW@ 4@@WH@14.($HHW @(#)shmsys.c 6.1 87/11/23 dd"dRd.text.data` .bssSaveReg _shmat_syscall_shmctl_shmdt_shmget8signal.o/ 568274922 98 100 100775 528 ` u!/\   P.textP .dataPP@.bssPP!00[JWH .(N0n8@HPX` W`X .(N0n8Ɏ@ɮHPԩة>^觾[4.text.dataP.bssP_signalcerrorsigcodesnodename.o/ 568274933 98 100 100775 387 ` u!/  .text  .data@.bss90 [FW.text .data.bsscerror_snodename stat.o/ 568274943 98 100 100775 364 ` u!/  .text .data@.bss![JW.text.data.bss_statcerrorstime.o/ 568274954 98 100 100775 372 ` u!0   .text  .data@.bss [HW.text .data.bss_stimecerrorstty.o/ 568274964 98 100 100775 364 ` u!0  .text .data@.bss2![LW.text.data.bss_sttycerrorsync.o/ 568274975 98 100 100775 336 ` u!0  .text .data@.bss$[W.text.data.bss_synccerrorsyscall.o/ 568274986 98 100 100775 372 ` u!0*  .text  .data@.bssnN(^,n0[nBW.text .data.bss_syscallcerrorswapfunc.o/ 568274997 98 100 100775 378 ` u!05  .text .data@.bss:[LW.text.data.bsscerror_swapfuncsysmachdep.o/ 568275009 98 100 100775 388 ` u!0A  .text  .data@.bss^(C2![BW.text .data.bsscerror_sysmachdeptime.o/ 568275019 98 100 100775 360 ` u!0K  .text .data@.bss [W.text .data.bss_timecerrortimes.o/ 568275030 98 100 100775 364 ` u!0V  .text .data@.bss+[LW.text.data.bss_timescerrorulimit.o/ 568275041 98 100 100775 364 ` u!0a  .text .data@.bss!?[NW.text.data.bss_ulimitcerrorumask.o/ 568275051 98 100 100775 356 ` u!0k  .text .data@.bss<[PW.text.data.bss_umaskcerrorumount.o/ 568275062 98 100 100775 364 ` u!0v  .text .data@.bss[LW.text.data.bss_umountcerroruname.o/ 568275074 98 100 100775 372 ` u!0  .text  .data@.bss90 [FW.text .data.bss_unamecerrorunlink.o/ 568275085 98 100 100775 364 ` u!0  .text .data@.bss [LW.text.data.bss_unlinkcerrorustat.o/ 568275096 98 100 100775 372 ` u!0  .text  .data@.bss 90[HW.text .data.bss_ustatcerrorutime.o/ 568275107 98 100 100775 364 ` u!0  .text .data@.bss![JW.text.data.bss_utimecerrorwait.o/ 568275118 98 100 100775 380 ` u!0  (.text( .data@.bss[J. W.text(.data.bss_waitcerrorwrite.o/ 568275129 98 100 100775 364 ` u!0  .text .data@.bss2![HW.text.data.bss_writecerroru!1( .textX .dataXX@.bss`` 0  !2$0 X[W  :@ H.textX.dataX.bss`_environX_exit_main__ndSYSC_ACCESSSYSC_ACCTSYSC_ALARMSYSC_CHDIRSYSC_CHMODSYSC_CHOWNSYSC_CHROOTSYSC_CLOSESYSC_CREATSYSC_EXECSYSC_EXECESYSC_EXITSYSC_FCNTLSYSC_FORKSYSC_FSTATSYSC_GETGIDSYSC_GETPIDSYSC_GETUIDSYSC_GTTYSYSC_IOCTLSYSC_KILLSYSC_LINKSYSC_LSEEKSYSC_MKNODSYSC_MOUNTSYSC_NICESYSC_OPENSYSC_PAUSESYSC_PIPESYSC_PLOCKSYSC_PROFSYSC_PTRACESYSC_READSYSC_BREAKSYSC_SETGIDSYSC_SETPGRPSYSC_SETUIDSYSC_SIGNALSYSC_STATSYSC_STIMESYSC_STTYSYSC_SWAPFSYSC_SYNCSYSC_TIMESYSC_TIMESSYSC_ULIMITSYSC_UMASKSYSC_UMOUNTSYSC_UNLINKSYSC_UTSSYSSYSC_UTIMESYSC_WAITSYSC_WRITESYSC_GETEUIDSYSC_GETEGIDSYSC_FTIMESYSC_SOCKSYSC_SOCKSENDSYSC_SOCKRECVSYSC_CONNECTSYSC_BINDSYSC_SETSOOPTSYSC_LISTENSYSC_ACCEPTSYSC_SHUTDWNSYSC_SOCKPAIRSYSC_GETPEERNMSYSC_RECVFROMSYSC_SENDTOSYSC_RECVMSGSYSC_SENDMSGSYSC_GETSONMSYSC_GETSOOPTSYSC_SETREUIDSYSC_SETREGIDSYSC_SYSMACHDEPSYSC_TRUNCSYSC_FTRUNCsnodename__startupu!1$p  (.text .data(@.bss 0  !2$0  [WXHLP~Trޠ  :s1X( '~TǎPǞLǮHXXW @(#)prof.c 6.1 87/11/23 &4(4,4.4>4L4N4V4X4^4j4.textX.data.bss.text .data .bss_environ_exit__mcrt0__ndSaveReg _btext_etext_sbrk_monitor_main___startup! / 568277502 0 0 0 686 ` 5^^ NN%L%L'')),,//1R1R3388;>;>==@D@DBBE&E&G^G^IIJJSaveReg_allocldptr__ldheadSaveReg_freeldptrSaveReg_ldacloseSaveReg_ldaopenSaveReg_ldahreadSaveReg_ldcloseSaveReg_ldfhreadSaveReg_ldgetnameSaveReg_ldlread_ldlinit_ldlitemSaveReg_ldlseekSaveReg_ldnlseekSaveReg_ldnrseekSaveReg_ldnshreadSaveReg_ldnsseekSaveReg_ldohseekSaveReg_ldopenSaveReg_ldrseekSaveReg_ldshreadSaveReg_ldsseekSaveReg_ldtbindexSaveReg_ldtbreadSaveReg_ldtbseekSaveReg_sgetlSaveReg_sputlSaveReg_vldldptrallocldptr.o/ 568277393 98 100 100664 636 ` u!9 .text\ .dataP @.bss8( P$Ȏ ȋ"ȋ $$ $PQPR88W @(#)allocldptr.c 6.1 87/11/23 @(#)lddef.h 6.1 87/11/23 \0\:\F\b\j\.text.dataP.bssSaveReg _calloc__ldhead_allocldptrfreeldptr.o/ 568277397 98 100 100664 631 ` u!9 .textL .data@ @.bss8^! $ < *$11$2$"$ 88W @(#)freeldptr.c 6.1 87/11/23 @(#)lddef.h 6.1 87/11/23 LL*L0 L<L>L^ L.text.data@.bssSaveReg __ldhead_free_freeldptr ldaclose.o/ 568277400 98 100 100664 543 ` u!9 .textP .dataPP @.bsspp8 ȧ~4p ~488W @(#)ldaclose.c 6.1 87/11/23 0 8 .textP.dataP .bsspSaveReg _fclose#_ldaclose_vldldptr_freeldptr ldaopen.o/ 568277405 98 100 100664 768 ` u!9 .text .data(|@.bssH<@~Dq R  ,  0  ~Dǎ@Ǟ<HHW   W @(#)ldaopen.c 6.1 87/11/23 r$0 HN ^ .text.data(.bssSaveReg _ldaopen_fopen0_vldldptr_allocldptr_freeldptr_hdrassignldahread.o/ 568277410 98 100 100664 1052 ` u!9.texth, .datahh8@.bssxD~Hq. e (" 8L<!"\1 2#0/# ! !L :\'&rh' Xn'>t'$|'  ~HǎDW @(#)ldahread.c 6.1 87/11/23 %ld%o%d%d%ld` ,L ,f ,v,~ , ,, ,, ,, , ,* ,:,D ,.texth.datah8.bssSaveReg _fseek_fread_strncmp_strncpy_sscanf_ldahread_vldldptrldclose.o/ 568277415 98 100 100664 909 ` u!9H.text .data(@.bss88x~Dp  e'" 7H<!4"jx0.lP!<'!' B&7 !( ~DW @(#)ldclose.c 6.1 87/11/23 %ld` J d t|     .text .data(.bss8SaveReg _ldclose_fseek_fread_strncmp_sscanf_fclose_vldldptr_freeldptr ldfhread.o/ 568277418 98 100 100664 572 ` u!9H .textx$ .dataxx @.bssH@~Dp:' "7! ~Dǎ@HHW @(#)ldfhread.c 6.1 87/11/23 $8 $P $.textx.datax .bssSaveReg _fseek_fread_ldfhread_vldldptrldgetname.o/ 568277424 98 100 100664 1329 ` u!9.text| .data0L@.bssP@DH~Lp rL``PP Ǘ|' f7!Lt8Z 7Q$ $0 ` fWPWP( >`"(n~LǎHǞDǮ@PPW @(#)ldgetname.c 6.1 87/11/23 (|F|T|^|j | | || || ||| || || |: |J|T|Z|r|z||||||.text.data0.bssSaveReg _free_ftell_fseek_fread_malloc_strcpy_strncpy_ldgetname_vldldptr ldlread.o/ 568277432 98 100 100664 1809 ` u!9.textd .data04@.bssH<@~Dp rB )~Dǎ@Ǟ<HHW`@~Dp.drr 0  |ut7P!>Zpz.x&BXІ.P5p#h#1(! \('7 27H!LH 7' z̋~7H!Tв̶ȋlL8H0Pp2̎в̶~Dǎ@W`DHLPހ ~Tr І)9 ^9X!F.\ !'XҠ̋9X! x\  h.\ !'XD.\ !" \X u ~TǎPǞLǮHǾD``W @(#)ldlread.c 6.1 87/11/23 d d d ddd"d8 dP d dd dddddddddd(d.d4d|dd d dd d.text.data0.bssSaveReg _ldlread_ldlinitl_ldlitemT_fread_fseek-_ldtbread_ldshread_saveldptr_maxlnnos ldlseek.o/ 568277436 98 100 100664 530 ` u!9< .textx$ .dataxx @.bssh~<p ! .@0b(7\' ~<hhW @(#)ldlseek.c 6.1 87/11/23 .$T $.textx.datax .bssSaveReg _ldlseek_fseek_ldshreadldnlseek.o/ 568277440 98 100 100664 517 ` u!9$ .text`  .data`` @.bssh~<p.@.b&7\' ~<hhW @(#)ldnlseek.c 6.1 87/11/23  B  .text`.data` .bssSaveReg _fseek_ldnlseek_ldnshread ldnrseek.o/ 568277444 98 100 100664 517 ` u!9$ .text`  .data`` @.bssh~<p.@.`&7X' ~<hhW @(#)ldnrseek.c 6.1 87/11/23  B  .text`.data` .bssSaveReg _fseek_ldnrseek_ldnshread ldnshread.o/ 568277448 98 100 100664 693 ` u!9 .text .data |@.bssXDHLP~Tq8( xøB)20 Z!B173Cݎ 6 * 8 (!>~TǎPǞLǮHǾDXXW @(#)ldnshread.c 6.1 87/11/23 .P  .text.data .bssSaveReg _fseek_fread_ldnshread_vldldptr ldnsseek.o/ 568277453 98 100 100664 517 ` u!9$ .text`  .data`` @.bssh~<p.@*T"7' Ď ~<hhW @(#)ldnsseek.c 6.1 87/11/23  >  .text`.data` .bssSaveReg _fseek_ldnsseek_ldnshread ldohseek.o/ 568277457 98 100 100664 516 ` u!9$ .text`  .data`` @.bss@~<p.&' Ǝ ~<@@W @(#)ldohseek.c 6.1 87/11/23  <  .text`.data` .bssSaveReg _fseek_ldohseek_vldldptrldopen.o/ 568277462 98 100 100664 1313 ` u!9.text .data8t@.bss  hD~Hqv N!8 N !8zpj4N(Pe  4pV<!8X "@V /4.!  D ' $7 !z >$' X >6~HǎDW @(#)ldopen.c 6.1 87/11/23 %ld` r! .4 T l |     $n    .text.data8.bss SaveReg _ldopen_fopen_fread_fseek_fclose_strncmp_sscanf%_vldldptr_allocldptr_freeldptr ldrseek.o/ 568277467 98 100 100664 530 ` u!9< .textx$ .dataxx @.bssh~<p ! .@0`(7X' ~<hhW @(#)ldrseek.c 6.1 87/11/23 .$T $.textx.datax .bssSaveReg _ldrseek_fseek_ldshreadldshread.o/ 568277471 98 100 100664 644 ` u!9 .textl .data L@.bssPDH~Lpހ r f' VG7!# 0( "7 (!n ~LǎHǞDPPW @(#)ldshread.c 6.1 87/11/23 ,l| l l.text.data .bssSaveReg _fseek_fread_ldshread_vldldptrldsseek.o/ 568277475 98 100 100664 522 ` u!94 .textp .datapp @.bssh~<p ! .@,T$7' ~<hhW @(#)ldsseek.c 6.1 87/11/23 .P .textp.datap .bssSaveReg _ldsseek_fseek_ldshreadldtbindex.o/ 568277480 98 100 100664 525 ` u!9, .texth .datahh @.bss8 ȧ~4p6 ~488W @(#)ldtbindex.c 6.1 87/11/23 * .texth.datah .bssSaveReg _ftell_ldtbindex_vldldptr ldtbread.o/ 568277485 98 100 100664 604 ` u!9h .textD .data $@.bssPDH~LpTPHG'!0  7 ! ~LǎHǞDPPW @(#)ldtbread.c 6.1 87/11/23 &DZ Dr D.text.data .bssSaveReg _fseek_fread_ldtbread_vldldptrldtbseek.o/ 568277489 98 100 100664 508 ` u!9 .textX .dataXX @.bssxx@~<p*"7' Ȏ ~<@@W @(#)ldtbseek.c 6.1 87/11/23 : .textX.dataX .bssxSaveReg _fseek_ldtbseek_vldldptrsgetl.o/ 568277493 98 100 100664 380 ` u!9.text0 .data00 @.bssPP  2!`0 0W @(#)sgetl.c 6.1 87/11/23 .text0.data0 .bssPSaveReg _sgetlsputl.o/ 568277496 98 100 100664 396 ` u!9.text@ .data@@ @.bss`` ~qBc@0 470~W @(#)sputl.c 6.1 87/11/23 .text@.data@ .bss`SaveReg _sputlvldldptr.o/ 568277501 98 100 100664 470 ` u!9 .text0 .data00@@.bsspp  $W @(#)vldldptr.c 6.1 87/11/23 @(#)lddef.h 6.1 87/11/23  .text0.data0@.bsspSaveReg __ldhead_vldldptr! / 568277939 0 0 0 1440 `  h h h   $$$.J.J.J88::::::@@@FFFLLLRRRX,X,X,\\\b$b$b$gjgjgjlllrrrwww{{{ lllhhhԒԒԒNNN<<<<PPP***ddSaveReg_erf_erfcSaveReg_fabsSaveReg_floor_ceilSaveReg_fmodSaveReg_gamma_signgamSaveReg_hypotSaveReg_jn_ynSaveReg_j0_y0SaveReg_j1_y1SaveReg_matherr_acos_d_acos_D_acos_asin_d_asin_D_asin_atan_d_atan_D_atan_atan2_d_atn2_D_atn2_cos_d_cos_D_cos_cosh_d_cosh_D_cosh_exp_d_exp_D_exp_log10_d_lg10_D_lg10_log_d_log_D_log_sin_d_sin_D_sin_sinh_d_sinh_D_sinh_sqrt_d_sqrt_D_sqrt_tan_d_tan_D_tan_tanh_d_tanh_D_tanh_pow_Pow_dd_pow_dd_s_acos_r_acos_R_acos_s_asin_r_asin_R_asin_s_atan_r_atan_R_atanTable_s_atan2_r_atn2_R_atn2_s_cos_r_cos_R_cosSinTableCosTable_s_cosh_r_cosh_R_cosh_s_exp_r_exp_R_exp_s_log10_r_lg10_R_lg10_r_alg10_R_alg10_s_log_r_log_R_log_s_sin_r_sin_R_sin_s_sinh_r_sinh_R_sinh_s_sqrt_r_sqrt_R_sqrtSqrtTable_s_tan_r_tan_R_tan_s_tanh_r_tanh_R_tanh_s_pow_pow_rr_Pow_rrSaveReg_s_floor_s_ceilSaveReg_s_modferf.o/ 568277554 98 100 100664 1184 ` u!:2 .text .data |@.bssX<!@DЧH0L@P:1~T0 "0?@:10$1 ?4!ZB1530@s(5ppsw3{50p33H3;ސ? ޠPBm5y6s5 "~TǎPǞLǮHǾD@<XXWP?8!<@0?D@H:1~L0"1 ?4x0@:@:10\p 250p333;50p333;s02151@5 6~LǎHǞDǮ@Ǿ<8PPW @(#)erf.c 6.1 87/11/23 @U=@I @/@C_@,@E<{ȊLW?~]@U=@J@뙤(!@X@CpuR?@V6@=5@ 4@ \C9@wPXO @SE97ȇ&@#Z}]? Ӊ[vD@V6@^H@Ɋ@g@MG@\k@AU*@a$@1&YEp? .text.data .bssSaveReg _erf_erfc_expfabs.o/ 568277556 98 100 100664 364 ` u!:4.text .data @.bss@@ 0: 2W @(#)fabs.c 6.1 87/11/23 .text .data  .bss@SaveReg _fabsfloor.o/ 568277559 98 100 100664 540 ` u!:7T .text< .data @.bssH.@ 0:@ ?04 @HHWH.@ 0:@ ?03 @HHW @(#)floor.c 6.1 87/11/23 <^<.text.data .bssSaveReg _floor_modf_ceilPfmod.o/ 568277563 98 100 100664 540 ` u!:;h .text\ .data <@.bssX@DH~Lr: 2  P: 2''8^P4%6: (*6.PP5):4 ~LǎHǞDǮ@XXW @(#)fmod.c 6.1 87/11/23 \.text.data .bssSaveReg _fmod_modfgamma.o/ 568277571 98 100 100664 2139 ` u!:C .textd% .datat@.bssx@DH~LpX\G~`p:.XN!q2q.P~!0@:>XX`  J!pAv l:XxP(5!0@P:P2PPP56.X`3 22X  X"p~LǎHǞDǮ@xxWx?8<@DH~Lp@  :WG e+:? 45 4 ?g0d3 Av0l:' ذؐ ?06'r85"53ذ53ذ53ذ535):ؐ3)5'3 & ?0:356 L@:6'?4p.?4p5'@:@4pذhؐp53ذx53ذ53ذ53ذ53ذ53ذP0535W^pذ83P@53^PPH53^XPP53^`PX535{^hذ`3{5r(6F~LǎHǞDǮ@Ǿ<8xxW @(#)gamma.c 6.1 87/11/23 @ !TD-gammagamma: SING error \I I%{uI|bZ >e'.6v$?7@gE0tTVm-{@j'Y`fHJW6v$Z!G?KhsCO{?Jrdfl?UUUUUE,dLd d dd d dd d(d2d@dv d ddFdLdhdrd|dd ddd$d.d8dBdLdRdbdjdxddddd.text%.data.bssSaveReg _gamma_signgam_modf_matherr_write_errno_sin_log_pos_gamma hypot.o/ 568277576 98 100 100664 800 ` u!:HX .text4 .data( @.bssh8<@~DpD~P: 2p.X: 21 :r1 :6pސ>Fޠf;:yp 5p?3pސ?5 3 63 ސ?5 A@p栞ހf;:rp5 jp?5'51 p΀:' 3BHLG H`"`~Dǎ@Ǟ<Ǯ8hhW @(#)hypot.c 6.1 87/11/23 hypot04N4\ 4.text.data(.bssSaveReg _hypot_matherr_errnojn.o/ 568277583 98 100 100664 1746 ` u!:O.text .dataHL@.bsshDHLPTX~\r: 2' '8CI!TD-:! .('8ҋ4": 2pR9 :P<. +0093675:4< 5!P` ^`^`0094B16:>` ^`  94'86 .`ޠ? +0093675:4<n^`56 ~\ǎXǞTǮPǾLHDhhWxDHLPTX~\p:``اd9hp `xΎ  !xCI!TD-: .((9pprP^ppJq68A0!965 4<M!r 2  ~\ǎXǞTǮPǾLHDW`@#@0 0>D94>HP @X,D"n.^"X``W @(#)jn.c 6.1 87/11/23 ynyn: DOMAIN error ynjn: TLOSS error z   4 @J T Vb    .text.dataH.bssSaveReg _jn_j0_j1_yn_matherr_write_errno_y0_y1_jn_errorj0.o/ 568277592 98 100 100664 2547 ` u!:X.textxT .dataxxP@.bssX!HBL1P~Ts:yp"p@ :qpq#4~( f0>F@f;:10?H5p7H (50p33395ppsw3y6~TǎPǞLǮHXXW?hHLPTX: ~\Z`dh `xƎ  !x@ :  ( 1܋ l0!5>F f;: ?04f*5 0r0[l5WA^pCt83u[l5R!^p#"3%A6r ^53~\ǎXǞTǮPǾLHW?@DHLC2CI!TD-P: ~TrX \>` Xp2,\" ."pRAŃ: P?`ް^x 5 @P06 r @1*50p33X3;5p361 >xB1(50p333;5p361@  656^xp5W5?! TD-^x4* p5{ ^x54& ^xp5u 5 3~TǎPǞLǮHǾD@W @(#)j0.c 6.1 87/11/23 y0y0: DOMAIN error y0j0: TLOSS error ?_0mȃD:X}`C$hJ5~^UvCb'"ci&6-BYyPYݿ$@:w|D:XC m"CZ9żYB٤hZBR-g1AW,4A1 4@LA.|?ATE^AgA` .A>ÇHuA9@j:EATE^AgJA`z!aA>j3GA Q;@of\6?!<KrF_،|{7cRlHkh}=A!<KrA$X A FVh`A X@άr*F@yW2}?RD co4T"C~e\mnBt! yE˔A45AD{3K[pD43! C:WeCU@?}B\BNkH AES'A.HW@ ϣ;?TTT< THTR T\ T TTTTTT T TT T TdTvTTTT TT$T:TNT.textx.dataxP.bssSaveReg _j0_y0_matherr_write_errno_log_sqrt_sin_cos_j0_asympt j1.o/ 568277601 98 100 100664 2587 ` u!:a.text| .data`@.bss`?H!LPT1XJ~\p:70"0@ @:101)>(:l0>F@f;:10  ?05H50@s (5ppsw3{50p33(3;5 6~\ǎXǞTǮPǾLH``W?xHLPTX~\p:Z`d~h `x  !x@ :( 15 @1 (50p33P3;5p3576ް?6^ 54 53 ~\ǎXǞTǮPǾLHW?@DHLCP2CI!TD-~T: >`nXċ \ Xp>,\",."ppAŃ: P?`ް?^x 5 @P06 r @1*50p33p3;5p361 >xB1(50p333;5p361@  656*^xp5W5@| 3!ҩ^x4* ^xp5u 5 3D p5{ ^x54` 0: 2  ~TǎPǞLǮHǾD@W @(#)j1.c 6.1 87/11/23 y1y1: DOMAIN error y1j1: TLOSS error ?_0mȃD?#h= 홙CǼ_ aBڭzYs@]An:@ɧQa @>JDO#h=C9u"Ck 8YBnxqB^J0A7*--A6aQ@f>?PtFZb)Y0O67?IYb`.wqPtFZbzXY޳w7/2 u?@8:O@ɒ M@(-b @6@pw@A.A%ѣA;B ЀA5īk&CAnHLF@GZ@@{?ĵ\HD~$/waPnC0ZÅcb(bC 3 i C‚ٓA@# D|PG'gDrjaXhCd+pJCx k"B{Bb Aљ=J$A7ڒAR@1q~k?||2|T |`|j |t ||| |||| | || | |X|j|||| |||.|>|.text.data`.bssSaveReg _j1_y1_matherr_write_errno_log_sqrt_sin_cos_j1_asympt matherr.o/ 568277604 98 100 100664 348 ` u!:d.text .data @.bss00W @(#)matherr.c 6.1 87/11/23 .text.data .bss0SaveReg _matherrd_acos.o/ 568277609 98 100 100664 1598 ` u!:i@ .text .dataP@.bssHH 0?@ 0~0?栐@- :010A53P?svp`ti5Sp ހ#hئ3W5Sp@ ހgB3W5Sp,hހtc3W5Sp@0ހ r!3W5SpCހY3W5S5Pp+ٵހ?A3s5sސ@O܎ޠj G3y5sސ` ޠi3y5sސ@]:ޠQqC3y5sސDR2ޠn3y6W30 #  ?!0TD-4 ~ɎǮW0?@40P?`35@ 0AP 5P? 5Px\` V`V` e`6`6Q`?p{5`?ڵ*p3(`?ڵ*p5`?p{3ct6`3` tc6`3`@tc6`3`VS0x<@ 45Ph5P   0A53P?svp`ti5Sp ހ#hئ3W5Sp@ ހgB3W5Sp,hހtc3W5Sp@0ހ r!3W5SpCހY3W5S5Pp+ٵހ?A3s5sސ@O܎ޠj G3y5sސ` ޠi3y5sސ@]:ޠQqC3y5sސDR2ޠn3y6W30 #  0@ !@TD-3W@ !TD-W@:000:00@P:@N8 .41>0H0|, f!N@@,PW, , acosacos: DOMAIN error acos: input value was NAN acos: input value was INF f.text .dataP.bssH_errno_write_matherr_acos_d_acos_D_acosUNDERFLOWd_asin.o/ 568277614 98 100 100664 1526 ` u!:n .text .dataP<@.bss 0?@ 0~0?栐@- :010A53P?svp`ti5Sp ހ#hئ3W5Sp@ ހgB3W5Sp,hހtc3W5Sp@0ހ r!3W5SpCހY3W5S5Pp+ٵހ?A3s5sސ@O܎ޠj G3y5sސ` ޠi3y5sސ@]:ޠQqC3y5sސDR2ޠn3y6W30 # ~ɞW0?@40P?`35@ 0AP 5P? 5Px\` V`Va e`2`6Q`?p{5`?ڵ*p3$`?ڵ*p5`?p{3ct6`3` tc6`3`@tc6`3bVS0x<@ 45Ph5P  0A53P?svp`ti5Sp ހ#hئ3W5Sp@ ހgB3W5Sp,hހtc3W5Sp@0ހ r!3W5SpCހY3W5S5Pp+ٵހ?A3s5sސ@O܎ޠj G3y5sސ` ޠi3y5sސ@]:ޠQqC3y5sސDR2ޠn3y6W30 #  0?!@TD-3 20?!@TD-40!TD-W?!TD-W@:00 @P:@N8 .41>0H0, !N@@(PWPr \asinasin: DOMAIN error asin: input value was NAN asin: input value was INF (DPZd.text .dataP.bss_errno_write_matherr_asin_d_asin_D_asinUNDERFLOWd_atan.o/ 568277618 98 100 100664 1272 ` u!:r .text .dataP4@.bss~ C?s@   @ ? 15"@?P '5B`@"7pwۅ3F5B`@6;p&nӈ3F5B`@/ip*3F5B5@`@/Np43b5bހ@PVސv O3h5bހ@XIސ5 j3h5bހ@Gސ{b3h6F4 06 ޠ?!ްTD-2 ?03 @?P46ޠ?!ްTD- 15"@?P '5B`@"7pwۅ3F5B`@6;p&nӈ3F5B`@/ip*3F5B5@`@/Np43b5bހ@PVސv O3h5bހ@XIސ5 j3h5bހ@Gސ{b3h6F43 ɮ Ɏ~W0: R@P:@@@?!TD- 8 .41>0?!TD-H0̎2 ! P?!TD-8 hatanatan: DOMAIN error atan: input value was NAN atan: input value was INF 6BLV^h.text .dataP.bss_errno_write_matherr_atan_d_atan_D_atanUNDERFLOWgreater.5d_atn2.o/ 568277623 98 100 100664 1480 ` u!:w .textpT .datappX@.bss !~@Qbs E@ g` Nbs@Qސ:Ď I i4:Ď=!TD-Ɏ~W?!TD-Ɏ~W xހ 6 C?s@   @ ? 15"@?P '5B`@"7pwۅ3F5B`@6;p&nӈ3F5B`@/ip*3F5B5@`@/Np43b5bހ@PVސv O3h5bހ@XIސ5 j3h5bހ@Gސ{b3h6F4ĩ 06 ޠ?!ްTD-2 ?03 @?P46ޠ?!ްTD- 15"@?P '5B`@"7pwۅ3F5B`@6;p&nӈ3F5B`@/ip*3F5B5@`@/Np43b5bހ@PVސv O3h5bހ@XIސ5 j3h5bހ@Gސ{b3h6F43 ɮ0: f@P:@@@?!TD- 8 p.41>0?!TD-H0B2v ,! P?!TD-" ދ  ͆Ɏ~W @ !0TD- -3atan2atan2: DOMAIN error atan2: input value was NAN atan2: input value was INF TTTTTTTT$T.textp .datapX.bss_errno_write_matherr_atan2_d_atn2_D_atn2 UNDERFLOWgreater.5d_cos.o/ 568277628 98 100 100664 1490 ` u!:| .text , .data  @.bss  @A@`~詮@?!@@?!@7@'$@Q4B?_0@5` `pPg194ޠ 0940p pg΀ٍ   55333p?x8194.ЩN HYB0D9DB40x.N343ހph؋n.ٍ 5Hٍ m 35(3B3J3ހ?!ސTD-5 15"A LA`:4pC 5bހ@ސq3h5bހ ސ炗3h5b5`ހ@eqސa m35ޠ@/cް`p35ޠA"شްm36h3" ,"0~ɎɮWpPTD-4@\"`\Tdp5bހ@ܢސTb3h5bހ}ސa3h5bހ@`+Kސ-35ޠ@pްq335ޠA}ް36h?3Z@P:BN8 P.45>0H0P,T :"N@@,PW f ?_0@>v@<);_@9SL8@coscos: TLOSS error cos: input value was NAN cos: input value was INF ,,*,4,<,,,,,,,,,,.text .data .bss_errno_write_matherr_cos_d_cos_D_cosUNDERFLOWd_cosh.o/ 568277633 98 100 100664 1174 ` u!: .textxD .dataxx@@.bss @00   ? w5 >" ;075 @>~P#o+3$5 @>PY~3$5 @?VlPh3$5 @?UUPUUG3$5 @?P3$5 ?32~7@'D 14$`?Gp@5F1d9v4Gp?Gހ@5'p>ހ 533 15"@? P\ 5Bp@43ހww3G5Bp@tހs3G5@@m%P3B5$@@P߰3$4 6 &T ?03 @?P6Bv rq$0 h#0 #'0h#0 C B3 ?03 0 h#0 #&0h#0  ~WT@P:@N8 x.43>0H0"N@@.PW } coshcosh: input value was NAN cosh: input value was INF DD DHDRD^DjD.textx.datax@.bss_errno_write_matherr_cosh_d_cosh_D_coshUNDERFLOWd_exp.o/ 568277637 98 100 100664 1258 ` u!: .textP .dataPP8@.bss 0 08 80@(@:00~7@'D 14$`?Gp@5F1d9v4Gp?Gހ@5'p>ހ 533@$55"? \ 5p@43ހww35p@tހs35@@m%P3B5$@@P߰3$4 6 ?03a 0H0"@@@(PWn xT b0@00|@P:@@8 P.43>0H0"@@@,PWn ҋT expexp: input value was NAN exp: input value was INF  2N\b&0<F.textP.dataP8.bss_errno_write_matherr_exp_d_exp_D_expUNDERFLOWd_lg10.o/ 568277642 98 100 100664 1290 ` u!: .textpd .datapph@.bss4  ~ x,0 #0#0 0? 0?@ω?:000?@30P?`460A53PD`9}5Sp@baހ)T3W5Sp ހe3W5S5Pp!Ւހe&3s5sސ@3ޠ_e3y5sސ( 1ޠT@3y6W3@@P59"@?.BP95$3 @k0U6~ɞW0@@30P@`46!< ! l8 p.41>0H0  v!PW8 p.42>0H0$v !:02 PW PWlog10log10: SING error log10: DOMAIN error log10: input value was NAN log10: input value was INF Tdvdddddddddd(dPdZd.textp.dataph.bss_errno_write_matherr_log10_d_lg10_D_lg10UNDERFLOWd_log.o/ 568277647 98 100 100664 1306 ` u!: .textp\ .datapp`@.bss.  ~ x,0 #0#0 0? 0?@ω?:000?@30P?`460A53PD`9}5Sp@baހ)T3W5Sp ހe3W5S5Pp!Ւހe&3s5sސ@3ޠ_e3y5sސ( 1ޠT@3y6W3@@P59"@?.BP95$3~ɞW0@@30P@`46!F ! l8 p.41>0H0  |!PW8 p.42>0H0*t !:02 PWЧ PWloglog: SING error log: DOMAIN error log: input value was NAN log: input value was INF N\p\|\\\\\\\\\"\<\L\V\\\.textp.datap`.bss_errno_write_matherr_log_d_log_D_logUNDERFLOWd_sin.o/ 568277652 98 100 100664 1506 ` u!: .text0< .data00@.bss1  @ABj~詮@?!B@?!B7@'$@Q4B?_0@5` `pPg194ޠ 0940p pg΀ٍ0 055333p?x8194.ЩN HYB0D9DB40x.N343ހph؋n.ٍ05Hٍ0m035(3B3J3ހ?!ސTD-5 15"A LA`:4pC 5bހ@ސq3h5bހ ސ炗3h5b5`ހ@eqސa m35ޠ@/cް`p35ޠA"شްm36h3" ,"<~ɎɮWrPTD-4Bxb `V"`\Tdp5bހ@ܢސTb3h5bހ}ސa3h5bހ@`+Kސ-35ޠ@pްq335ޠA}ް36h?3N@P:BN8 `.45>0H0B,d ,"N@@,PW v ܋?_0@>v@<);_@9SL8@sinsin: TLOSS error sin: input value was NAN sin: input value was INF <<.<8<@<<<<<<<<<&<.text0.data0.bss_errno_write_matherr_sin_d_sin_D_sinUNDERFLOWd_sinh.o/ 568277657 98 100 100664 1190 ` u!: .textT .data@@.bss 0@0P 0̧~0?0y@Q5D =G<0K5$`>Zpئ3&5$`>pm3&5$`?*p3&5$`?p#+3&5$`?UUpUUUK3&5$5 3<7P'U0A45p?Gހ@5W1u94Xހ?Gސ@58ހ>ސ 5330A53P? `\ 5Sހ@43ސww3X5Sހ@tސs3X5P@m%`3S55P@`߰3540607T0?@30P?`6Sχ05@ h4@ 48@h4@ T S40?@30@ h4@ 47@h4@  0 # Ɏ~W@@P:@N8 .43>0H0؎"N@@.PW  sinhsinh: input value was NAN sinh: input value was INF T*T8T`TjTvTT.text.data@.bss_errno_write_matherr_sinh_d_sinh_D_sinhUNDERFLOWd_sqrt.o/ 568277661 98 100 100664 786 ` u!: .text .data @.bss88~ x,0 #ς   p/p%`q7?%>թW#&#@')63@6`3`d?栞f;5`Uspp~ɎW ! W1>0P^48H0$  !HPWsqrtsqrt: DOMAIN error .text.data .bss8_errno_write_matherr_sqrt_d_sqrt_D_sqrt"sqrt_nameUNDERFLOWdsqrt_errd_tan.o/ 568277667 98 100 100664 1474 ` u!: .text .data@.bss 1@ $@AP:B@<~詮@?!P.H:$ 7@'$@Q4B?_0@5`xlp gpgpg194ޠ 0940Πΰpx|ހ xހxg΀ٍ 5533πϑ3xx|n` v`vnЅp@194.ЩNHY B0D9DB40x.Nπϑ343ހh؋8.ٍ5Hٍm35(3B3J3ހ?!ސTD-5 15"`pVm5bހ@X"ސ 3h5bހސ=3h5b5`ހ[ސh35ޠ@Mްs*}J35ޠgްCOm36h3  ,!"~ɎɮWp 06 @P:BN8 @.45>0H0b,D L"N@@,PWp V ?_0@>v@<);_@9SL8@tantan: TLOSS error tan: input value was NAN tan: input value was INF .text.data.bss_errno_write_matherr_tan_d_tan_D_tanUNDERFLOWd_tanh.o/ 568277671 98 100 100664 1174 ` u!: .textP, .dataPPP@.bss 0 0@3@:00r~0?@:00x0A53P`DC$5SpXހ3W5SpEހѱ3W5S5Pp@\<ހԧ3s5sސ@~:ޠ#3y5sސ@%ޠEA3y6W3Ǯ37P'U0A45p?Gހ@5W1u94Xހ?Gސ@58ހ>ސ 5330A53P? `\ 5Sހ@43ސww3X5Sހ@tސs3X5P@m%`3S55P@`߰35Pa3Sxސ p Wph X403Sp@5765?40 # ~ɎW@P:@@?0 # WN8 P.41>0?H0:U !O@(i P?W tanhtanh: DOMAIN error tanh: input value was NAN tanh: input value was INF ,,,,,, ,:,D,.textP .dataPP.bss_errno_write_matherr_tanh_d_tanh_D_tanhUNDERFLOWpow_dd.o/ 568277679 98 100 100664 2716 ` u!: \ .text" .data,@.bss88 !~Ä+40"9BK,\(1 # Ѐ     x,0 #0#0 0? 0?@ω?:000?@30P?`460A53PD`9}5Sp@baހ)T3W5Sp ހe3W5S5Pp!Ւހe&3s5sސ@3ޠ_e3y5sސ( 1ޠT@3y6W3@@P59"@?.BP95$30@@30P@`46!T  ~ɎɮW8 .41>0H0X  B!P ~ɎɮW8 .42>0H0 !J0D P ~ɎɮW8 R8P ~ɎɮW5  0 0@0@:00H7@'D 14$`?Gp@5F1d9v4Gp?Gހ@5'p>ހ 533@$55"? \ 5p@43ހww35p@tހs35@@m%P3B5$@@P߰3$4 6 ?03a %P R% R"QUPpp  ! ! $PˀR"PpQp_p_qq !  @P,.Q,OPpQp_p_qq P !P%: % P Pp_pVqq Ph%     ~ɎɮW0 # @P:@@88 .44>0H0"@8@*@<P ~ɎɮW 2 @P:@@88 .43>0H0֎"@8@.@@P ~ɎɮW  lpowpow: SING error pow: DOMAIN error pow: input value was NAN pow: input value was INF powpow: input value was NAN pow: input value was INF ".8B`jRd ,:@v.text".data.bss8_errno_write_matherr_pow_Pow_dd_pow_ddPUNDERFLOWZeroOrBadDontNegatedomain_errorzero_or_guinf_or_nannormalizer_acos.o/ 568277684 98 100 100664 1146 ` u!:p .text( .data((P@.bssxx  ?t ?5! ?$!0?#%!1Ih4@ 4@4@ $@? $A CA>թW%@?#@$1?%@>թW#B&A#@$&!#B42!x)@ $2 h2   !%"0<.6%2@ǐI#4%2@>#4%2%1@j#B%BP@<۷#E&4# W@I$W?W 3ֿ!!%"0<.6%2@ǐI#4%2@>#4%2%1@j#B%BP@<۷#E&4# ?$W?#W@*AN8 (.41>0H0D,- .!N@@&PW\ A acosacos: DOMAIN error acos: input value was NAN acos: input value was INF .text( .data(P.bssx_errno_write_matherr_s_acos_r_acos_R_acosUNDERFLOWcontgreaterr_asin.o/ 568277689 98 100 100664 1106 ` u!:H .text .dataP@.bssPP  ?N ?5! ?$!0?#%!1Ih4@ 4@4@ $@? $A CA>թW%@?#@$1?%@>թW#B&A#@$&!#B42!x)@ $2 h2   !%"0<.6%2@ǐI#4%2@>#4%2%1@j#B%BP@<۷#E&4# ?$!HW 3ֿ!!%"0<.6%2@ǐI#4%2@>#4%2%1@j#B%BP@<۷#E&4#  W@*@N8 .41>0H0j, T!N@@&PW4    asinasin: DOMAIN error asin: input value was NAN asin: input value was INF ~.text .dataP.bssP_errno_write_matherr_s_asin_r_asin_R_asinUNDERFLOWcontgreaterr_atan.o/ 568277697 98 100 100664 4978 ` u!:` .text@ .data@@@.bss88@`P? ` 8 7'Ŭ lDz% 1r2)#$43$2%# W SQ.<&PDz%Q 1r2)#$Q43$2%S#R?$‹ ?ۋ8 @.41>0?ۧH0&2E !Y P?Wt ʋatanatan: DOMAIN error atan: input value was NAN atan: input value was INF :l;c;D;A;ֱ;ě ;_L<<s<#դ<47|X>[>\>^>`>bl>d>e>gI> h> j0> k> l> n>o+>p<>q<>r)>s>s>t>u%>u>v1>v>v>w5>wd>w>w>w}>w^> w*>!v>"v>#v>$u>%t>&tI>'s>(r>)q>*p>+o>,nx>-m5>.k>/jn>0h>1gP>2e>3c>4a>5` >6]>7[>8Y>9WY>:T>;Rw>=M9>>Jv>?G>@D>AA>B>>C;G>D7>E4>F1 >G-q>H)>I%>J">K>L>M>N>O &>P>Q>Qk>R>S>T>U>V>W=>X>Y\>Z>[>\E>]]>^Z>_=>`>a>bA>c>d>eO>fr>g~y>hwd>ip3>jh>ka~>lY>mRW>nJ>oB>p:>q2>r*>s"6>t>uD>v>v>w>x>y>z۰>{Z>|>}U>~>>P>>F>><>F>1>>'$>>>w>> >=>_>r>su>i>gL>>Z>Ԗ>N9>>AO>>4$>v>&>> >> > >>u>w>g$>>XM>>I2>>9> >*1>F>K>>> >>>q_>>`>>Ol>>> >?>,b>t>t>b>?> >>lk>>Y>>FW>>2> >$>*> >>>l>8>W>W>B>.>-}>>>>>v>>`>`>J>>3!>>>:>r>x>>`>ԕ>Hn>4>/>>>>>qI>>W>>=>>#>w> 0>{>h>`>R>E>>*><>E>;>>c>զ>GM>>*`>> #>~g>>`>ѻ>B>ó>$\>ĕ>>vI>>W->ǁ>7>ǧ>>Ȉ>>g>ח>GI>ʶ>&p>˕>F>t>>R>>0>Ο>>}m>>Z>)>7>ѥ>,>҂Y>r>^u>d>:?>Ԩ>>ՃQ>>^K>˩>8>צ&>E>؀O>E>Z%>>3>ڠI> >yN>>Q>ܾ8>*[>ݖj>d>nH>>E>߱x>>>>_:>u>5>⠭> >v>a>L>>!W>>:>`>>4>>>r>ܸ>Ft>>>*>>U>>(E>V>R>c8> >4>j>>nu>>?*>e>>w>ߒ>Gv>E>>~>/>M> >V>>>Q>>>^>>S>=> >>Y>S>>>>>QI>>>>>L>+>Y>|s>v?#2?U??U???Q?A?a?v??K?}s?]?;??D?v?H?? ?= ?n?$?ѕ??4X?e??*?Z?*?[?????Pz?S?!???DJ?t??? ? 7 ? gv? ? -? y? (? X? ? 9? N? X? IX? yL? 5? ? ? 8? hn? "? ? g? &? V? ? p? ?3?C?r??7?]?/x?^???x?]?I7?x??Յ?3?2?aq????i?I?x$?r?Ե??1?_O?i???? 7? AF? lK? E? 5? ?!?!B?!m?!G?!?!?";?"B?"mT?"?"D?"?# ?#A^?#k?#?#?#E?$e?$>z?$h?$?$}?$i?%K?%:#?%c?%?%l?%?& ?&4Y?&]?&n?&?&[?'?'-?'Vq?'?'?'*?'T?($s?(M?(v?(?(ȋ?(x?)Z?)C3?)l?)?)?)/?*?*7p?*`?*?*?*z?+?+*B?+R?+z?+$?+[?+?,?,C?,k?,?,?,?- ?-3?-[[?-$?-?-Ҙ?-D?.!?.I}?.q ?.?.?.x?/?/6:?/]?/?/?/H?/s?0!?0H?0o?0?0?0?1 ?12i?1Y?8*X?8Oh?8tn?8k?8_?8J?9+?9-?9Q?9v?9R?9?9?: M?:-?:Rp?:v?:o?:?:H?;?;,?;QH?;u?;?;?;?<;?<*P??>CA?>f?>>?>?>?>v????;??^\?????????@(?@16?@T;?@w7?@*?@?@?A?A%?AHd?Ak!?A?A?A%?A?BQ?B:?B]Y?B?B>?Bģ?B?C T?C+?CM?Cp?CK?Cs?C֒?C?D?DHt~.8.text@ .data@.bss8_errno_write_matherr_s_atan_r_atan_R_atanTableUNDERFLOWr_atn2.o/ 568277702 98 100 100664 1074 ` u!:( .text .dataXd@.bss00  . 1@P  $Q 4B$#$)P W?Wqi  ! 0 #x!A C $.&  SQ.! ?!|&!Q!%"0+$%2@,ݼ#4%2@Sz#4%2%1@@#B%B @h#B&4#Q,   ! 0h  @I !#W ?$!P ?ۋ8 ا.41>0H0J !hp \PW 6Watan2atan2: DOMAIN error atan2: input value was NAN atan2: input value was INF B\hr|.text .dataX.bss0_errno_write_matherr_s_atan2_r_atn2_R_atn2 UNDERFLOWfinishatan2r_cos.o/ 568277807 98 100 100664 127024 ` u!;/.textd .data04@.bss?"94[.(#pQ   I[^?I1?;.~ $!?"%0 0P5!@)T$P`p p7U΀Ltv\%vT%r#x#Wp#uހ?!wG)w$p#p$#Pހ8d%!dd6#1%###?%~P  A! $ F@% 2p2)"$#h43h$2%#0 S " $"W"W?W@9QB@A?$O!f'"@@ !PTD-6$09A4$7"1  ?#!@I%!lF@% 2r2)"$#43$2%#A\@*BN8 .45>0H0Ǝ, "N@@&PW | fcoscos: TLOSS error cos: input value was NAN cos: input value was INF ?????????????????????????????????????????z?s?l?e?^?V?N?G???7?.?&??? ??????????????|?q?e?Y?M?A?5?(?????????????v?h?Y?I?:?*?? ?????????u?c?Q?@?.?? ????????p?\?H?4?? ???????v?`?J?4????????|?e?M?5????????n?T?;?!???????g?K?0???????k?N?1???????b?D?%??????k?L?,? ?????j?I?'??????]?;??????i?F?"?????n?I?$?????i?D??????]?6?????q?I? ????~?U?,?????[?1?????\?1?????V?*????w?J?????g?9? ????P?!????c?3????r?A????|?K?????P?????R?????O???߲?}?H???ި?s?=???ݛ?d?.???܉?R???۫?s?;???ڑ?Y? ??٭?t?:???،?R???ע?g?,??ֵ?z?>???Պ?M???ԗ?Z???ӡ?c?%??ҩ?j?,??Ѯ?o?/??а?p?0??ϰ?p?/??έ?l?+??ͧ?f?$??̟?]???˔?Q???ʆ?B??ɺ?v?1??Ȩ?c???Ǔ?M???{?5??ŧ?a???ċ?C??ô?l?$??“?J???o?&???H???j????????\???y?,???G???`???w?)???>???R???d???u?%???4???A???M???W???`? ??g???m???q???s???u???t???s???o???j???d? ??\???S???H???;???.??y???h? ??V???C???.??u???]???D???*??m???P???1??q???P???.??k? ??F??? ??[???2??k??????w???I??~???N?????O?????L??|???D??s? ??9?~?~f?}?}?})?|?|U?{?{?{?z?z??y?yi?x?x?x%?w?wM?v?vt?v?u?u.?t?tS?s?sx?s ?r?r-?q?qP?p?ps?p?o?o%?n?nF?m?mf?l?l?l?k?k3?j?jQ?i?in?h?h?h?g?g3?f?fN?e?eh?d?d?d?c?c&?b?b>?a?aU?`?`k?_?_?_ ?^?^ ?]?]4?\?\G?[?[Z?Z?Zl?Y?Y}?Y?X?X?W?W%?V?V4?U?UC?T?TP?S?S]?R?Ri?Q?Qu?P?P?P?O?O?N?N?M?M!?L?L)?K?K0?J?J7?I?I=?H?HB?G?GF?F?FJ?E?EN?D?DP?C?CR?B?BS?A?AT?@?@T????S?>?>Q?=?=O??*?*0?)?) ?(?(?'?'?&x?%?%f?$?$T?#?#A?"?".?!?!? ? ?z??d??N??6?????y??`??F??+?????e??H??*?? ?|??\? ? ?~ѝ?~?~[?~Ϲ?~?~v?~?~2?~̐?~?~K?~ʨ?~?~b?~ȿ?~?~x?~?~0?~Ō?~?~D?~ß?~?~U?~?~ ?~f?~?~?~t?~?~(?~?~?~4?~?~?~??~?~?~H?~?~?~P?~?~?~W?~?~?~[?~?~?~_?~?~ ?~`?~?~ ?~a?~?~ ?~_?~?~?~]?~?~?~X?~?~?~S?~?~?~K?~?~?~C?~?~?~8?~?~?~-?~~?~?~?~p?~?~?~a?~?~?~P?~?~?~>?~?~?~*?~x?~?~?~b?~?~?~K?~?~?~2?~?~?~?~d?~?~?~H?~?~?~*?~u?~?~ ?~V?~~?~}?~}4?~|~?~{?~{?~z[?~y?~x?~x6?~w?~v?~v?~uX?~t?~s?~s0?~rw?~q?~q?~pM?~o?~n?~n!?~mh?~l?~k?~k:?~j?~i?~i ?~hP?~g?~f?~f?~ec?~d?~c?~c0?~bt?~a?~`?~`??~_?~^?~^?~]K?~\?~[?~[?~ZT?~Y?~X?~X?~WZ?~V?~U?~U?~T^?~S?~R?~R ?~Q`?~P?~O?~O?~N^?~M?~L?~L?~KZ?~J?~I?~I?~HS?~G?~F?~F ?~EJ?~D?~C?~C?~B>?~A{?~@?~??~?/?~>k?~=?~&?}=1?}<;?};E?}:O?}9X?}8b?}7k?}6u?}5~?}4?}3?}2?}1?}0?}/?}.?}-?},?}+?}*?})?}(?}'?}&?}%?}$?}$?}# ?}"?}!?} ?}?}$?})?}.?}2?}7?};?}??}C?}G?}J?}M?}Q?}T?}W?}Y?}\?}^?} `?} b?} d?} f?} h?}i?}j?}k?}l?}m?}m?}n?}n?}n?|n?|n?|m?|m?|l?|k?|j?|i?|g?|f?|d?|b?|`?|^?|[?|Y?|V?|S?|P?|M?|I?|F?|B?|>?|:?|6?|1?|,?|(?|#?|?|?|?|?|?|?|?|?|?|?|?|?|?|?|?|Ѿ?|ж?|Ϯ?|Φ?|͞?|̕?|ˍ?|ʄ?|{?|r?|i?|`?|V?|L?|B?|8?|.?|$?|?|?|?|?|?|?|?|?|?|?|?|?|?|?|t?|g?|Z?|M?|??|1?|$?|?|?|?|?|?|?|?|?|?|?|?|p?|`?|P?|@?|/?|?|?|?|?|?|?|?|?|?|?|o?|\?|J?|7?|$?|?|?|?|?|?|?|?|?|q?|~]?|}H?||3?|{?|z ?|x?|w?|v?|u?|t?|s?|ro?|qX?|pA?|o*?|n?|l?|k?|j?|i?|h?|g?|fm?|eT?|d?|=v?|?|?{?{?{?{x?{P?{'?{?{?{?{?{[?{2?{?{?{?{?{a?{7?{ ?{?{?{?{a?{5?{ ?{?{?{߇?{Z?{.?{?{?{٨?{{?{N?{!?{?{?{Ҙ?{j?{4?xj?w?vQu?vO?vM?vL?vJO?vH?vF?vD?vC'?vA]?v??v=?v;?v:2?v8f?v6?v4?v3?v18?v/l?v-?v+?v*?v(:?v&m?v$?v"?v!?v8?vk?v?v?v?v3?vd?v?v?v?v )?v Z?v ?v?v?v?vK?v{?u?u?u ?u8?ug?u?u?u?u"?uP?u~?u?u?u?u4?ua?u?u߻?u?u?uA?um?u֙?u?u?u?uH?us?u˞?u?u?u?uI?ut?u?u?u?u?uE?un?u?u?u?u?u:?uc?u?u?u?u?u*?uR?uy?u?u?u?u?u;?ua?u?u?u?u?u?uC?ui?u?u?u?u?u~ ?u|D?uzh?ux?uv?ut?ur?uq?uo=?um`?uk?ui?ug?ue?ud ?ub.?u`P?u^q?u\?uZ?uX?uV?uU?uS8?uQX?uOy?uM?uK?uI?uG?uF?uD7?uBV?u@u?u>?u?tM?t\?tk?tz?t}?t{?ty?tw?tu?ts?tq?to?tm?tl?tj?th?tf,?td9?tbE?t`Q?t^^?t\j?tZu?tX?tV?tT?tR?tP?tN?tL?tJ?tH?tF?tD?tB?tA?t? ?t=?t;?t9%?t7.?t57?t3@?t1H?t/P?t-X?t+`?t)h?t'p?t%w?t#?t!?t?t?t?t?t?t?t?t?t?t ?t ?t ?t?t?t?t?s?s?s?s?s?s?s?s?s?s?s ?s ?s?s?s?s?s?s?s?s?s?s?s ?s!?s!?s"?s"?s"?s"?s"?s!?s!?s ?s?s?s?s?s?s?s?s?s?s?s?s ?s ?s?s?s?s?s?s?s?s?s?s?s?s?s?s?s?s?s?s?s?s}?s{?sy?sw?su?ss?sq?so?sm{?skt?sil?sgd?se\?scT?saL?s_D?s];?s[3?sY*?sW!?sU?sS?sQ?sN?sL?sJ?sH?sF?sD?sB?s@?s>?s?r?q?q?q?qϤ?q}?qV?q/?q?q?q¸?q?qh?q@?q?q?q?q?qu?qL?q#?q?q?q?q|?qR?q(?q?q?q?q~?qS?q'?q?q?q?qy?qM?q!?q?q?q?q}o?q{B?qy?qv?qt?qr?qp`?qn2?ql?qi?qg?qey?qcJ?qa?q^?q\?qZ?qX_?qV/?qS?qQ?qO?qMo?qK??qI?qF?qD?qB|?q@K?q>?q;?q9?q7?q5R?q3 ?q0?q.?q,?q*V?q(#?q%?q#?q!?qV?q#?q?q?q?qR?q?q?q ?q ?q J?q?q?q?qt?p>?p?p?p?pe?p/?p?p?p?pR?p?p?p?ps?p;?p?p?pؒ?pY?p ?p?pϮ?pu?p;?p?p?pč?pS?p?p?p?pi?p.?p?p?p|?pA?p?p?p?pQ?p?p?p?p^?p!?p?p?pj?p,?p?p?pr?p4?p?p?px?p9?p|?pz?px{?pv?o?o?oQ?o?o?ob?o?o?or?o"?o?o}?o{0?ox?ov?ot?o?m?me?m?mˊ?m?mƯ?mA?m?me?m?m?m?m?m=?m?m_?m?m?m?m?m0?m?mP?m?mo?m?m?m?m?m:?m?mW?m?ms?m?m}?m{?mx?mv7?ms?mqQ?mn?mlj?mi?mg?me?mb?m`'?m]?m[??mX?mVU?mS?mQk?mN?mL?mJ ?mG?mE?mB?m@3?m=?m;F?m8?m6Y?m3?m1k?m.?m,}?m*?m'?m%?m"?m %?m?m4?m?mC?m?mQ?m?m ^?m ?mk?m?mw?l?l?l?l?l?l?l?l?l%?l?l.?l?l6?lߺ?l>?l?lD?l?lJ?l?lP?l?lU?l?lY?l?l]?l?l`?l?lb?l?ld?l?le?l?lf?l?lf?l?le?l?ld?l?lb?l?l_?l?l\?l?lY?l?l~T?l{?lyO?lv?ltJ?lq?loC?ll?lj?h?h?h?h`?h?h?h8?h?h?h?hV?hݝ?h?h+?hr?hҹ?h?hE?hʋ?h?h?h\?h?h?h,?hq?h?h?h??h?h?h ?hP?h?h?h?h^?h?h?h'?hj?h?h?h1?hs?h?h}?h{8?hxz?hu?hr?hp=?hm~?hj?hg?he@?hb?h_?h]?hZ@?hW?hT?hQ?hO>?hL}?hI?hF?hD9?hAw?h>?h;?h92?h6p?h3?h0?h.(?h+f?h(?h%?h#?h Y?h?h?h?hJ?h?h?h ?h 8?ht?h?h?g$?g_?g?g?g?gH?g?g?g?g.?gh?g?g?g?gK?gՄ?gҼ?g?g,?gd?gǜ?g?g ?gB?gz?g?g?g?gU?g?g?g?g-?gc?g?g?g?g9?gn?g?g?g ?g@?gt?g?g?g?g|D?gyw?gv?gs?gq?gnD?gkw?gh?ge?gc?g`@?g]r?gZ?gW?gU?gR8?gOj?gL?gI?gF?gD-?gA]?g>?g;?g8?g6?g3M?g0}?g-?g*?g( ?g%:?g"h?g?g?g?g"?gP?g~?g?g ?g ?g4?ga?g?f?f?f?fA?fm?f?f?f?f?fH?fs?fޞ?f?f?f?fI?ft?f͞?f?f?f?fE?fo?f?f?f?f?f?dN?d^?dn?d}?d΍?d˜?dȬ?dŻ?d?d?d?d?d?d?d!?d/?d?`?`?`?`?`?`[?`}5?`z?`v?`s?`p?`ms?`jL?`g%?`c?``?`]?`Z?`W]?`T6?`Q ?`M?`J?`G?`Dj?`AA?`>?`:?`7?`4?`1q?`.G?`+?`'?`$?`!?`s?`H?`?`?`?`?` o?`C?`?`?_?_?_g?_:?_ ?_?_?_?_X?_+?_?_?_ء?_s?_E?_?_?_ȹ?_Ŋ?_[?_,?_?_?_?_n?_>?_?_?_?_}?_M?_?_?_?_?_X?_&?_?_?_?__?_|,?_x?_u?_r?_ob?_l/?_h?_e?_b?__b?_\.?_X?_U?_R?_O^?_L*?_H?_E?_B?_?W?_?]M?]J?]G\?]D?]@?]=x?]:,?]6?]3?]0F?],?])?]&`?]#?]?]x?]*?]?]?]A?] ?]?]U?]?\?\i?\?\?\{?\,?\?\?\=?\?\ݜ?\L?\?\ӫ?\Z?\ ?\ɸ?\g?\?\?\r?\!?\?\|?\*?\?\?\3?\?\?\9?\?\?\??\?\?\D?\?\?\}G?\y?\v?\sI?\o?\l?\iJ?\e?\b?\_I?\[?\X?\UG?\Q?\N?\KD?\G?\D?\A??\=?\:?\79?\3?\0?\-2?\)?\&?\#)?\?\x?\ ?\?\n?\?\ ?\b?\?\?[T?[?[?[F?[?[?[6?[?[?[%?[?[n?[?[ҷ?[[?[?[ȣ?[F?[?[?[0?[?[w?[?[?[^?[?[?[E?[?[?[*?[?[m?[?[?[P?[?[~?[{2?[w?[ts?[q?[m?[jS?[f?[c?[`1?[\?[Yo?[V?[R?[OL?[K?[H?[E'?[A?[>b?[;?[7?[4;?[0?[-v?[*?[&?[#M?[?[?["?[?[Z?[?[ ?[-?[?[d?Z?Z?Z5?Z?Zk?Z?Z?Z:?Z?Zm?Z?Zء?Z:?Z?Zm?Z?ZǞ?Z7?Z?Zh?Z?Z?Z1?Z?Z`?Z?Z?Z'?Z?ZU?Z?Z?Z?Z?ZF?Z?Zr?Z?Z|?Zy3?Zu?Zr^?Zn?Zk?Zh?Zd?ZaF?Z]?ZZo?ZW?ZS?ZP+?ZL?ZIR?ZE?ZBy?Z? ?Z;?Z82?Z4?Z1W?Z-?Z*|?Z'?Z#?Z 2?Z?ZU?Z?Zx?Z ?Z ?Z+?Z?ZL?Y?Ym?Y?Y?Y?Y?Y?V?V?V?V?Vo?V?VO?VѾ?V-?Vʝ?V ?V{?V?VX?V?V5?V?V?V?V?V[?V?V6?V?V?V}?V?VW?V?V0?V?V| ?Vxt?Vt?VqL?Vm?Vj#?Vf?Vb?V_e?V[?VX:?VT?VQ?VMy?VI?VFN?VB?V?!?V;?V7?V4^?V0?V-0?V)?V&?V"k?V?V;?V?V ?Vt?V ?V C?V?V?Uy?U?UG?U?U?U{?U?UH?U?U?Uz?U?UE?UϪ?U?Uu?U?U??U?U?Ul?U?U5?U?U?U`?U?U(?U?U?UQ?U?U?Uz?U?U>?U|?Uy?Uud?Uq?Un(?Uj?Uf?UcL?U_?U\?UXn?UT?UQ0?UM?UI?UFQ?UB?U??U;p?U7?U4/?U0?U,?U)L?U%?U" ?Uh?U?U%?U?U?U ??U?U?UX?T?T?To?T?T)?T?T?T>?T?T?TR?Tծ?T ?Te?T?T?Tw?T?T,?T?T?T?T8?T4?T1??T-?T)?T&??T"?T?T>?T?T?T:?T ?T?T6?T?S?S1?S?S?S+?S}?S?S#?Su?S?S?Sl?SѾ?S?Sa?SƲ?S?SU?S?S?SH?S?S?S9?S?S?S)?Sy?S?S?Sh?S?S?SU?S?S|?SyA?Su?Sq?Sn,?Sjz?Sf?Sc?S_c?S[?SW?STK?SP?SL?SI2?SE?SA?S>?S:d?S6?S2?S/G?S+?S'?S$*?S u?S?S ?SV?S?S ?S 5?S?S?R?R^?R?R?R:?R?R?R?R_?Rݧ?R?R9?Rҁ?R?R?RY?Rá?R?R0?Rw?R?R?RM?R?R?R!?Rg?R?R?R9?R?R?R ?RP?R?R|?Ry ?Rud?Rq?Rm?Rj2?Rfv?Rb?R^?R[C?RW?RS?RP?RLQ?RH?RD?RA?R=]?R9?R5?R2$?R.g?R*?R&?R#-?Ro?R?R?R3?Rt?R ?R?R7?Rw?Q?Q?Q8?Qx?Q?Q?Q8?Qw?Q߶?Q?Q5?Qt?Qг?Q?Q0?Qn?Q?Q?Q)?Qf?Q?Q?Q?Q]?Q?Q?Q?QQ?Q?Q?Q?QB?Q~?Q?Q}?Qz2?Qvm?Qr?Qn?Qk?QgZ?Qc?Q_?Q\ ?QXD?QT?QP?QL?QI-?QEf?QA?Q=?Q:?Q6L?Q2?Q.?Q*?Q'/?Q#h?Q?Q?Q?QH?Q?Q ?Q?Q'?Q^?P?P?P?P:?Pp?P?P?P?PI?Pۀ?P׵?P?P ?PV?Pȋ?P?P?P*?P^?P?P?P?P0?Pd?P?P?P?P2?Pf?P?P?P?P1?Pd?P|?Px?Pt?Pq-?Pm_?Pi?Pe?Pa?P^&?PZW?PV?PR?PN?PK?PGK?PC{?P??P;?P8 ?P4?M:?M6?M2?M.?M+?M'%?M#9?MN?Mb?Mv?M?M?M ?M?M?L?L?L?L$?L6?LI?L[?Lm?L?Lܑ?Lأ?LԵ?L?L?L?L?L ?L?L-?L>?LN?L_?Lo?L?L?L?L?L?L?L?L?L?L ?L~?Lz'?Lv6?LrD?LnR?Lj`?Lfn?Lb|?L^?LZ?LV?LR?LN?LJ?LF?LB?L>?L:?L7 ?L3?L/$?L+/?L';?L#G?LS?L^?Li?Lt?L?L ?L?L?K?K?K?K?K?K?K?K?K?K?K ?K?K?K&?K/?K7?K??KH?KP?KW?K`?Kg?Kn?Kv?K}?K?K?K?K?K?K?K?K?K|?Kx?Kt?Kp?Kl?Kh?Kd?K`?K\?KX?KT?KP?KL?KH?KD?KA?K=?K9 ?K5?K1?K-?K)?K%?K!?K"?K%?K'?K*?K ,?K .?K1?K2?J4?J6?J8?J9?J:?J;?J?J??J??J??J??J@?J??J??J??J??J>?J=?J?Ic3?I_'?I[?IW?IS?IN?IJ?IF?IB?I>?I:?I6?I2?I.?I*?I&s?I"e?IW?II?I;?I-?I?I ?I?I?H?H?H?H?H?H?H?Hv?Hf?HV?HF?H5?H%?H?H?H?H?H?H?H?H?H?Hx?Hf?HS?HA?H/?H?H ?H?H?H?H{?Hw?Hs?Ho?Hko?Hg[?HcG?H_3?H[?HW ?HR?HN?HJ?HF?HB?H>?H:x?H6b?H2M?H.7?H*!?H& ?H!?H?H?H?H?H ?H n?HV?H@?G(?G?G?G?G?G?G?G?Gi?GP?G8?G?G?G?G?G?G?G?Go?GU?G;?G!?G?G?G?G?G?G?Gg?GL?G0?G~?Gy?Gu?Gq?Gm?Gi?Gen?GaR?G]6?GY?GT?GP?GL?GH?GD?G@k?GH?E:?E5?E1?E-?E)d?E%5?E!?E?E?E{?EL?E ?E?E?D?D`?D1?D?D?D?Dq?D@?D?D?Dկ?D?DM?D?D?D?D?DW?D%?D?D?D?D]?D+?D?D?D?D`?D-?D?D?D}?Dy`?Du-?Dp?Dl?Dh?Dd]?D`)?D[?DW?DS?DOV?DK!?DF?DB?D>?D:M?D6?D1?D-?D)v?D%??D! ?D?D?Df?D/?D ?D?D?CS?C?C?C?Cu?C=?C?C?Cݕ?C\?C$?C?C̳?Cz?C@?C?C?C?C[?C"?C?C?Ct?C:?C?C?C?CP?C?C?C?C|d?Cx(?Cs?Co?Ckv?Cg:?Cb?C^?CZ?CVJ?CR ?CM?CI?CEW?CA?C?@9?@5w?@1#?@,?@(z?@$%?@?@|?@'?@?@|?@ '?@?@|??&????{??$????x??!????t??????o??????i??????b?? ????Y??????P??????F??????9??z??v??r-??m??iy??e??`??\j??X??S??OZ??J??F??BI??=??9??57??0??,??($??#??k??????V?? ?? ??@???>?>)?>?>n?>?>?>T?>?>٘?>:?>?>}?>?>?>a?>?>?>C?>?>?>%?>?>f?>?>?>E?>?>?>#?>}?>yb?>u?>p?>l??>g?>c{?>_?>Z?>VV?>Q?>M?>I0?>D?>@k?><?>7?>3C?>.?>*}?>&?>!?>S?>?>?>'?> ?>_?>?=?=2?=?=i?=?=?=:?=?=o?= ?=Ҥ?=>?=?=r?= ?=?=??=?=s?= ?=?=>?=?=o?= ?=?=9?=?=j?=?=z?=v1?=q?=m`?=h?=d?=`&?=[?=WT?=R?=N?=J?=E?=AE?=?;9?;5'?;0?;,5?;'?;#D?;?;R?;?;`?; ?;m?;?:z?:?:?: ?:?:?:?:"?:ۧ?:-?:ұ?:6?:ɻ?:@?:?:H?:?:Q?:?:Y?:?:a?:?:g?:?:n?:?:t?:?:}z?:x?:t?:p?:k?:g?:b?:^ ?:Y?:U ?:P?:L?:G?:C?:>?::?:5?:1?:,?:(?:#?:?:?:?:?: ?:?:?9?9?9?9?9?9?9?9 ?9ۊ?9?9҆?9?9ɂ?9?9}?9?9x?9?9r?9?9l?9?9e?9?9^?9?9V?9?9O?9|?9xF?9s?9o=?9j?9f3?9a?9])?9X?9T?9O?9K?9F?9B?9=?98?94u?9/?9+i?9&?9"\?9?9N?9?9@?9 ?91?9?8"?8?8?8?8?8z?8?8i?8?8X?8?8F?8ǽ?83?8?8!?8?8 ?8?8?8o?8?8[?8?8F?8?81?8?8?8z?8v?8qy?8l?8hb?8c?8_J?8Z?8V2?8Q?8M?8H?8D?8?s?8:?86Z?81?8-@?8(?8$%?8?8 ?8|?8?8 `?8?8C?7?7&?7?7 ?7z?7?7\?7?7=?7֮?7?7͎?7?7n?7?7N?7?7-?7?7 ?7{?7?7Y?7?77?7?7?7?7?7{^?7v?7r:?7m?7i?7d?7_?7[]?7V?7R8?7M?7I?7D~?7??7;W?76?720?7-?7)?7$s?7?7J?7?7!?7 ?7?7c?6?68?6?6 ?6x?6?6L?6߶?6 ?6։?6?6]?6?60?6?6?6j?6?6?6:O?65?61?6,?6'?6#I?6?6?6x?6?6 A?6?6 ?5n?5?56?5?5?5a?5?5'?5ً?5?5Q?5˴?5?5y?5?5>?5?5?5e?5?5(?5?5?5M?5?5?5p?5?5}2?5x?5s?5oT?5j?5f?5at?5\?5X4?5S?5N?5JS?5E?5A?5v?)9?)4?)/?)*?)%?) ?)?)?)1?) E?)X?)m?(?(?(?(?(?(?(?(?(?(.?(A?(S?(f?(x?(?(?(?(?(?(?(?(?(?(*?(0?(9??(4N?(/^?(*m?(%|?( ?(?(?(?( ?(?(?'?'?' ?'?''?'5?'B?'O?']?'j?'w?'ǃ?'?'?'?'?'?'?'?'?'?'?' ?'?'!?',?'}8?'xC?'sN?'nX?'id?'dn?'_x?'Z?'U?'P?'K?'F?'A?'?$:?$6?$3?$/?$+?$'?$#?$?$?$?$?$ ?$?$?$?$?$?$?$?$|?$w?$r?$m?$h?$c?$^?$Y?$T?$O?$J?$E?$@?$;?$6?$1?$,}?$'u?$"n?$g?$_?$W?$O?$ G?$??#6?#/?#&?#?#?# ?#?#?#?#?#?#?#?#?#?#?#?#?#?#?#|?#q?#g?#]?#R?#F?#|????ݛ?r?J?!????|?R?)?????W?,????{?vX?q-?l?f?a?\?WU?R*?L?G?B?={?8O?3"?-?(?#?q?E??? ??d?6? ????S?%???˛?l?>?????U?&????i?:? ?}?x?s{?nJ?i?c?^?Y?TX?O(?I?D???:e?53?0?*?%? n???? ?c?+????N???ݦ?o?7???Î?U????r?9????U????zn?u4?o?j?e?`L?[?U?P?Ka?F&?@?;?6u?1;?+?&?!?M??? ?]?!???l?/???y?w?92?3?.?)c?$???M?? ?|?6???d???ߐ?I??ϼ?u?.???X????:???b????{A?u?p?kg?f?`?[?VC?P?K?Fg?A?;?6?1A?+?&?!c???? 9???Y???x?-??ܖ?K??̳?h????8???R???m????}8?w?r?mP?h?b?]g?X?R?M}?H.?B?=?8D?2?-?(X?# ??k?? ?}?.???????O??خ?_??Ƚ?l???z?)???5???A???~L?x?s?nV?i?c?^_?Y ?S?Ng?I?C?>m?9?3?.s?) ?#?y?%??}? )???,???/??ޅ?1??Ά?1???0???/???.???+??~}?y'?s?ny?i"?c?^t?Y?S?Nn?I?C?>g?9?3?.`?)?#?V???M???B???7???+??w???j???[???L????9?3?.O?(?#???R? ????Q?????N????ǰ?H??x???@??p???6??d?{?v?q)?k?fW?`?[?V?P?KG?E?@s?; ?5?04?*?%`??? ?? J??t? ??2??[??ل??ά?@??g???"??I??o???(??}N?w?rr?m?g?b)?\?WN?Q?Lq?G?A?<&?6?1I?+?&k? ???? ???`?????1??Q??q??ď???=??[??y???%??A?}?x^?r?mz?h?b?]#?W?R>?L?GY?A?? 8? 3? -? (? "?  ? ?  ? ?  ? ? ? ? ? ? ? ? ? Հ? ? }? ? y? ? u? ? q? ? l? ? g? ? a? ? }\? w? rU? l? gO? a? \G? V? Q@? K? F8? @? ;1? 5? 0)? *? %? ? ? ?  ? ? ? ~? ? s? ? i? ? ^? ? R? ? F? ? ;? ? .? ? ? ? ? ? ? ? ? p? y? tc? n? iS? c? ^D? X? S3? M? H%? B? =? 7? 2? ,z? &? !j? ? X? ? E? ? 3??!?????p??]??H??3???? ?~??h??S??{8?8?3 ?-?(?"y??_?? F??+?????h??K?Խ?/?ɠ????g??I??+?????`?{?v@?p?k"?e?`?Zq?T?OQ?I?D1?>?9?3?-?(]?"?L?8?3"?-?'?"e??:?? ?{??P??$???c??7?Π? ?s??G?????S??%???_?z?u0?o?j?di?^?Y9?S?N?Ho?B?=??7?2 ?,t?&?!B???x? ?D???w??E???v??A?Ǧ? ?s??=???k??6???d?~?y,?s?m?hZ?b?]"?W?Q?LN?F?A?;x?5?0>?*?%?h??.???U???}??A???g??+?ō??O???t??6???X???|{?v?q;?k?e?`[?Z?U?O|?I?D;?>?8?3Z?-?(?"w??5?? ?R???m??)???D?Ӣ??]?»??w??1???H???`???yu?s?n.?h?b?]C?W?Q?LW?F?A?;k?5?0!?*|?$?3???E???T?? ?e???s??'?ʀ??5???A???N???Y?? ?{c?u?p?jm?d?_?Yu?S?N%?H?B?=.?7?1?,4?&? ?;??? @???F???I???K?ѣ??O???O???Q???Q???Q?|?v?qO?k?e?`L?Z?T?OJ?I?C?>F?8?2?-B?'?!?>_>>ݪ>O>>>A>>>->>wu>l>`>Ub>J>>>3K>'>>5>>y>>>^>>>D>>>&>>}f>r >f>[H>O>D>9&>->"g>> >B>>~>>Ҽ>Z>>>1>>j>>w>lB>`>Uz>J>>>3L>'>> >>T>>>&>>Y>>>%>>Z>|>q>f#>Z>OS>C>8>->!>K> >y>>>?>>k>>>,>>Z>>v>k>_>TA>H>=l>2>&>'>>M>>v> >֛>.>>R>>y> >>{,>o>dN>X>Ms>B>6>+#>>C>>a>>>>Ϡ>/>>K>>k>>>t>h>]->Q>FJ>:>/c>#>|> >>">>9>>O>>h>>|>>>x>l>a1>U>JC>>>3U>'>f>>z>>>>ט> >>1>>?>>L>{>pX>d>Yg>M>Br>6>+|> >> >>>>>Ϣ>)>>0>>6>>;>s>hD>\>QH>E>:K>.>#N>> T>>U>>V>>Z>>Y>>X>>W>v>kX>_>TU>H>=Q>1>&P>>K>>F>>@>><>>5>>->>$>y>n>b>W>K>@ >4>)>|>>o>>b>>X>>J>>;>>,>>|>p>e>Y>M>Bt>6>+e>>R>>?>>*>ڣ>>Î>>x>>b>>~N>r>g6>[>P>D>9 >-|>!>b> >G>>/>ܢ>>Ņ>>h>>O>>0>t>i>]>Q>Fb>:>/F>#>%> >>r>>S>>0>> >z>>Y>>v3>j>_ >Sz>G>0>%/>>>r>>M>߸>#>Ȏ>>c>>;>>>wy>k>`L>T>I">=>1>&]>>->>>i>>8>ɠ>>n>>?>> >xs>l>a?>U>J>>t>2>'>>>>q>>:>>>f>>->>>[>턾>y!>m>a>VL>J>?>3s>'>6>>>^>> >ր>>A>쳥>>e>>$>y>m>bF>V>K>?b>3>(>~>>=>>>V>ֳ>>m>>+>뜇>>@>y>m>bW>V>K>?i>3>(>z>>3>>>B>֜>>S>곬>>^>ꐷ>>yi>m>b>Vv>J>?&>3}>'>,>>>5>>>9>ʐ>>@>駖>>A>鄖>x>mD>a>U>JC>>>2>'@>>>@>>>:>Ս>>7>貉>>.>菀>>x(>lz>`>U>In>=>2>&a>>>W>>>G>ԗ>>:>籉>>'>v>>w>kf>_>T>HP><>0>%=>> >$>q>> >[>ǧ>>?>椋>>">n>u>j>^S>R>F>;3>/}>#>> _>>><>݅>>>d>宬>>=>勆>>t>ha>\>P>E7>9>->">W> >>*>p>ۺ>>F>下>>>[>䉠>}>r->fq>Z>N>C>>7>+> >P>>>>]>٣>>(>j>㪬>>0>u>{>o>d9>Xz>L>@>5@>)>>>A>>>>C>˃>>>@>~>␽>>y=>m{>a>U>J5>>r>2>&>->j>>> >`>Ԝ>>>P>᥋>>>A>v|>j>^>S,>Gf>;>/>$>R> >>>7>t>ѭ>>>W>࢏>>>;>ss>g>[>P>DP>8>,> >/> e>>> >A>w>¬>߶>߫>ߟL>ߓ>߇>{>p">dW>X>L>@>5*>)^>>>>+>^>>>>޿,>޳^>ާ>ޛ>ޏ>ބ)>xZ>l>`>T>I>=S>1>%>>>D>t>>>>5>ݻe>ݯ>ݣ>ݗ>݌#>݀R>t>h>\>Q >E7>9h>->!>> >J>v>>>>+>ܷW>ܫ>ܟ>ܓ>܈ >|4>p_>d>X>L>A >58>)b>>>> >6>`>։>ʲ>۾>۳>ۧ,>ۛU>ۏ>ۃ>w>k>` >TH>Ho><>0>$>> 6>]>>>>>>ںE>ڮj>ڢ>ږ>ڊ>>s(>gL>[q>O>C>7>,> )>M>q>>>>>$>G>ٵi>٩>ٝ>ّ>م>z>n9>b[>V|>J>>>2>'>%>F>f>>>>> >ؼ)>ذI>ؤh>ؘ>،>؀>t>i>]%>QC>Ee>9>->!>> >>4>U>q>Ύ>«>׶>ת>ן>ד>ׇ;>{W>os>c>W>K>?>3>(>4>N>i>>>>>>ֽ>ֱ!>֥:>֙W>֍p>ց>u>i>]>Q>F>:>.6>"M>e> |>>>>>> >շ >ի6>՟L>Փf>Շ|>{>o>c>W>K>@>4>()>>>R>g>{>>>Ժ>>Լ>԰>ԥ>ԙ>ԍ1>ԁD>uW>ii>]|>Q>E>9>->!>> > >>3>D>T>e>Ӷu>Ӫ>Ӟ>Ӓ>ӆ>z>n>b>V>K>?>3(>'7>F>T>b>q>>ߐ>Ӟ>Ǭ>һ>ү>ң>җ>ҋ>>t >h>\$>P0>D<>8L>,X> d>o>{>>>>ث>̵>>Ѵ>Ѩ>ќ>ѐ>ф>y>m >a>U>I&>=3>1<>%E>M> V>^>g>o>{>т>Ŋ>й>Э>С>Е>Љ>}>q>e>Y>M>A>5>)>>>>>>>>>Ͼ>ϲ!>Ϧ&>Ϛ*>ώ2>ς6>v:>j>>^A>RE>FH>:O>.R>"U>X> [>]>`>b>h>j>l>ζm>Ϊo>Ξq>Βr>Άw>zx>ny>bz>Vz>J{>>{>2>&>>>>~>~>ށ>Ҁ>>ͺ~>ͮ}>͢{>͖z>͊|>~z>rx>fv>Zt>Nr>Bo>6m>*n>k>h>e>a>^>Z>Z>W>̾S>̲O>̦K>̚F>̎B>̂A>v<>j7>^2>R->F(>:">.!>">> > >>>>>>˵>˩>˝>ˑ>˅>y>m>a>U>I>=>1>%>> >v>m>d>[>U>K>ʹB>ʭ8>ʡ.>ʕ$>ʉ>}>q >d>X>L>@>4>(>>>>>>>|>p>ɼc>ɰW>ɤJ>ɘ=>Ɍ0>ɀ#>t>h >[>O>C>7>+>>>>>>t>e>Z>ȿJ>ȳ;>ȧ,>ț>ȏ >Ȃ>v>j>^>R>F>:>.>">o> ^>L>;>)>> >>ǵ>ǩ>ǝ>Ǒ>Dž>y>mz>ag>UT>I@>=->1>%>> >>>>ܑ>|>k>ƸV>ƬA>Ơ,>Ɣ>ƈ>{>o>c>W>K>?>3l>'U>C>,>>>>>ҹ>ơ>ź>Ův>Ţ^>ŖF>Ŋ.>~>q>e>Y>M>A>5>)l>S>=>$> >>>Լ>Ȣ>ļ>İq>ĤV>Ę<>Č!>Ā>s>g>[>O>C>7e>+J>.>>>>>>և>j>þM>ò3>æ>Ù>Í>Á>u>i>]h>QJ>E+>9 >,> >>>w>X>8>>>¿>³>§>›}>]>ƒ=>w>j>^>R>F>:|>.[>":>> >>>>s>P>.> >>>>>xa>l>>`>S>G>;>/>#k>G> #>>>>ڔ>o>J>%>>>>>ym>mG>a!>T>H><>0>$e>>> >>>>~>W>/>>>>>k>zB>n>a>U>I>=z>1Q>%'>> >>>[>1>>>>>`>6> >z>n>b>V^>J2>> >1>%>> Z>.>>>ܬ>>R>%>>>>t>{F>o>b>V>J>>d>25>&>> >z>K> >>>Ē>b>2>>>>{v>oE>c>V>J>>>2U>&$>> >>^>->>>Ě>h>6>>>>{o>o<>c >V>J>>o>2?>& >> >o>;>>>С>m>8>>>>c>{2>n>b>V>J[>>%>1>%>> O>>>>t>@> >>>c>+>>z>n>bO>V>I>=>1l>%7>> >>S>>>Ϧ>p>6>>>>M>z>m>a>Uf>I+><>0>$y>B> >>>R>>>¡>e>(>>>r>y5>l>`>T>HC><>/>#>L> >>>V>>>>_> >>>b>x">k>_>Sf>G&>:>.>"e>%> >>f>%>>̣>a>$>>>^>>v>j>^Z>R>E>9>-O>! >>>F>>>|>8>>>p>,>>>u^>i>\>P>DO>8 >+>>9>>>l>&>>ə>S> >>><>>s>gg>[ >N>B>6M>*>>u>->>>X>>>~>5>>>]>~>q>e>Y7>L>@>4]>(>>}>3>>>V> >>u>)>>>J>{>o>cf>W>J>>>29>%>> R>>>k>!>>Æ>9>>>O>>y>mh>a>T>H|><->/>#>C> >>U>>ٹ>i>>>y>)>>>w;>j>^>RH>E>9>-T>!>>c>>>m>>>z>'>>>/>>t>h9>[>O>C?>6>*>G>>>K>>>M>>>R>>>S>}>q>eV>Y>L>@U>3>'>R>>>R>>ݤ>M>>>L>>>E>z>n>bA>U>I>=8>0>$>/> >>(>>u>>>i>>>_>>w>kQ>^>R>FE>9>->!4>>~>'>>p>>ʹ>]>>>L>>>t7>g>[~>O%>B>6k>*>>S>>>>>>ӂ>$>>g> >>P>|>p>d3>W>Ku>?>2>&[>> >;>>>>Ͽ>^>>><>>~>y>l>`[>S>G>;:>.>"w>> >P>>>->>h>>>?>>|>u>h>\R>O>C>7&>*>b>>>5>>l> >Ǧ>A>>v>>>}J>p>d~>X>K>?L>2>&>> >P>>>>ϴ>Q>>>>>K>x>l>`>S>GG>:>.v>" >> @>>n>>כ>2>>c>>>%>>tQ>g>[>O>B>6A>)>k>>>.>>W>>ƀ>>>@>>h>{>o>c#>V>JM>=>1t>%>> ,>>U>>z> >>0>>X>>{>w >j>^/>Q>EU>8>,w> >>)>>N>>n>>>>>A>>~`>q>e~>Y >L>@/>3>'L>>i>>>>ܥ>3>>O>>j>>>y>l>`/>S>GI>:>.f>!>~> >>#>>>>>U>>l>>>>s>g'>Z>N=>A>5R>(>j>>~>>>>ѩ>2>>E>>W>>zi>m>a~>U>H><>/>#(>> <>>K>>[>>m>>{>>>>t>h!>[>O.>B>6:>)>F>>V>>a>>l>>z>>> >>{>n>b>U>I(><>00>#>7> >C>>J>>P>>V>>`>>e>t>hj>[>Or>B>6v>)>z>>}>>>>҆>>> >>>>{>n>b>U>I><>0>#>> >>>>ؓ>>>>>>>>t>h >[>O>B>6>)>>>>z>>u>>r>>l>>e>>zb>m>aZ>T>HR>;>/J>">E> >;>>2>׭>+>>!>>>> >s>g>Z}>M>Aq>4>(d>>[>>N>>@>й>2>>'>>>>y >l>_>Su>F>:d>->!S>>F>>4>>#>ə>>>>x>>~d>q>eQ>X>L@>?>3,>&>> >>{>>e>>O>>8>>%>>w >j>]>Qj>D>8U>+><>>#>> >>>f>>L>>5>>|>o>b>Vp>I>=W>0>$:>> >>>q>>W>>9>>>>>to>g>[O>N>B/>5>)>>>a>>?>ݮ>!>Đ>>n>>K>>y,>l>`>Sv>F>:R>->!->> >z>>T>>.>> >y>>R>}>q+>d>X>Ks>>>2K>%>#> >>i>>?>ͫ>>>>Z>>/>u>i>\r>O>CG>6>*>>>X>>/>ޘ>>j>><>>>{>y>mL>`>T>G>:>.Y>!>(>>>c>>2>ə>>h>>:>>~>qn>d>X;>K>?>2r>%>>> > >o>>>>ͣ> >n>>8>>>uk>h>\4>O>B>6b>)>.>>>Z>>!>щ>>P>>>y>>yC>l>` >Sk>F>:1>-> >[>> >>>E>ȧ> >n>>1>>|>pT>c>W>Jz>=>1<>$>> a>>!>>>A>>>d>>#>>s>gA>Z>N>Ab>4>(>~>>;>>>Y>Ϸ>>s>>3>>>wK>j>^>Qc>D>8!>+~>>7>>>Q>߭> >f>>>z>>5>z>m>aH>T>G>;Z>.>">o>>%>>>8>ɓ>>G>>>U>}>q >dg>W>K>>s>1>%*>> >5>>>@>̜>>M>>>V>>t>gb>Z>N>Aj>4>(>p>>#>z>>(>>>0>>>4>>v>j7>]>P>D=>7>*>>>>>C>>>B>Ř>>B>>>D>y>l>`A>S>F>:B>-> >>>>>=>>>7>>>1>>>|->o>b>V%>Ix><>0 >#s>> >i>>>b>ʴ>>W>>>K>~>q>eB>X>K>?5>2>%>*> {>>>k>ٻ>>_>>>N>>>t@>g>Z>N.>A}>4>(>n>> >>P>>>&>k>Rf>9>>9>~>~p>~>~>~H>~m>~T}>~;>~!>~S>}>}Ն>} >}>}R>}o>}V>}=$>}#>} T>|>|ׄ>|>|>|S>|q>|X>|?>|%>| F>{>{z>{>{>{<>{s>{Zg>{@>{'>{.>z>zW>z>z>z>zu>z\C>zB>z)k>z>y>y$>yþ>yQ>y>ywv>y^>yD>y+,>y>xW>x>xy>x >x>xy,>x_>xFT>x,>xu>w>w>w$>w>wJ>wz>wah>wG>w.>w>v>v8>v>vS>v>v|n>vb>vI>v0>v>u7>u>uP>u>uh>u}>ud>uK>u1>u)>t>t?>t>t\>t>tq>te>tL>t3>t>t)>s>s;>s>sM>s>sg^>sM>s4v>s>s>r>rΕ>r>r>r3>rh>rO@>r5>rM>r>qa>q>qm>q>qx>qi>qP>q7>q>q>p>p!>p>p)>p>pk9>pQ>p8@>p>pF>o>oL>o>oX>o>ol]>oR>o9a>o>ok>n>nn>n>np>n>nmq>nS>n:z>n >nz>m>my>m>m>m>mn~>mT>m;{>m!>mx>l>l|>l>lx>l>los>lU>ll">l o>k>kh>k>ka>k>kp`>kV>k=X>k#>k N>j>jE>j>jB>j>jq7>jW>j>+>j$>j &>i>i>i>i >i>iq>iX~>i>>i%o>i >h_>h>hO>h>hF>hr>hY4>h?>h&">h >g>gٍ>g>gz>g>gse>gY>g@P>g&>g C>f>f->f>f>f>ft>fZz>f@>f'b>f >eI>eڽ>e8>e>e>et>e[>eAu>e'>eb>d>dF>d>d)>d>du >d[}>dA>d(f>d>cG>c۸>c(>c>c>cu>c[>cB^>c(>c=>b>b#>b‘>b>bn>bu>b\K>bB>b).>b>a >aw>a>aQ>a>av3>a\>aC >a)x>a>`P>`ܼ>`0>`>`>`vr>`\>`CH>`)>`>_>_>_e>_>_9>_v>_] >_C~>_)>_Q>^>^#>^Ì>^>^e>^v>^]5>^C>^*>^m>]>]D>]ì>]>]z>]v>]]H>]C>]*>]>\>\O>\õ>\>\>\v>\]S>\C>\*>\>[>[K>[ð>[>[>[v>[]H>[C>[*>[s>Z>ZA>Zä>Z>Zj>Zv>Z]/>ZC>Z)>Z]>Y>Y!>YÃ>Y>YM>Yv>Y]>YCp>Y)>Y2>X>X>XZ>X>X>Xvz>X\>XC9>X)>X>W_>Wܽ>W>W{>W>Wv8>W\>WB>W)Z>W>V>Vr>V>V5>V>Vu>V\L>VB>V)>Va>U>U!>U}>U>U5>Uu>U[>UBO>U(>U>T_>Tۺ>T>To>T>Tu+>T[>TA>T(9>T>S>SE>S>S>SX>St>S[ >SAb>S'>S>Rr>R>R">Ry>R>Rt(>RZ>R@>R'5>R >Q>Q9>Q>Q>QD>Qs>QY>Q@E>Q&>Q >PF>P٣>P>PM>P>Pr>PYJ>P?>P%>P O>O>O>OJ>O>O>OrL>OX>O>>O%E>O >N>N=>N>N>N;>Nq>NW>N>0>N$>N >M,>M}>M>M>Mp>Mp>MW>M=i>M#>M >LY>L֨>L>LH>L>Lo>LV=>L<>L">L )>Kx>K>K>Kj>K>Ko>KUT>K;>K!>KD>J>J>J+>Jx>J>Jn>JTf>J:>J >JJ>I>I>I5>I>I>Im>ISb>I9>I>IB>H>H>H*>Ht>H>Hl>HRQ>H8>H>H6>G>G>G>GZ>G>Gj>GQ;>G7>G>G>F\>FЫ>F>F;>F>Fi>FP>F6W>F>F>E4>Ez>E>E>EM>Eh>EN>E5&>El>E>D>D<>D>D>D>DgW>DM>D3>D$>Dh>C>C>C<>C>C>Cf>CLJ>C2>C>B>B^>Bˠ>B>B%>B~o>Bd>BJ>B15>Bw>A>A>AC>A>A>A}>AcG>AI>A/>A >@Q>@>@>@>@Q>@{>@a>@H>@.W>@>?>?>?S>?>?>?z>?`U>?F>?,>?>>M>>ߓ>>>>>>K>>x>>^>>E>>+G>>>=>=>=9>=u>=>=v>=]1>=Cm>=)>=><><•><><><[><'><7>;y>;ڳ>;>;'>;`>;s>;Y>;@>;&N>; >:>:>:1>:i>:>:q>:X>:>R>:$>: >9>99>9p>9>9>9p>9VL>9<>9">9>8/>8e>8>8>8>8n=>8T{>8:>8 >8>7P>7Ӆ>7>7>7,>7l`>7R>78>7>72>6m>6ѡ>6>6 >6<>6jp>6P>66>6>6D>5w>5Ϫ>5>5>5A>5h{>5N>54>5>5C>4t>4ͦ>4>4>4B>4fs>4L>42>4>3>>3n>3˞>3>3>3~/>3d^>3J>30>3>2%>2T>2Ƀ>2>2>2|>2bF>2Hu>2.>2>1>16>1d>1>1>1y>1`>1FH>1,u>1>0>0>01>0^>0>0w>0]>0D>0*D>0p>/>/>/>/&>/R>/u}>/[>/A>/'>/)>.\>.ڇ>.>.>.>.s0>.YZ>.?>.%>. >- >-3>-\>->->-p>-W>-=1>-#Z>- >,>,>,>,+>,S>,n{>,T>,:>, >,">+I>+p>+>+>+>+l >+R:>+8a>+>+>*>*>* >*N>*t>*i>*O>*5>* >*/>)\>)΁>)>)>)>)g>)M8>)3\>)>(>(>(>(>(<>(~_>(d>(J>(0>(>'>':>']>'>'>'{>'a>'H>'.3>'U>&>&>&>&>&>&y'>&_H>&Eq>&+>&>%>%>%>%5>%V>%v~>%\>%B>%(>%>$>$=>$e>$>$>$s>$Y>$@>$&>$ F>#e>#؃>#>#>#>#p>#W">#=@>##^># {>">"շ>">">">"n3>"TP>":m>" >">!>!>!>! >!<>!kX>!Qs>!7>!>!> > > > ;> V> hy> N> 4> > >>>;>U>o>e>K>1>>>>)>C>\>|u>b>H>.>>>>(>@>X>yx>_>E>+>>>>$>;>R>vi>\>B>(>>>>>$>:>sP>Yn>?>%> >>>> > >p5>VI><^>"s>>>Է>>>>m>S>9/>J>^>q>ф>>>>i>O>5>>">4>G>a>s>>f>L>2>>>>>>)>}:>cK>Id>/t>>>>Ƕ>>>y>_>F >,>-><>L>c>r>>v>\>B>(>>>>> >>s(>Y>>?L>%Y> g>u>ׂ>>>>o>U>;>!>>>>>+>8>lD>RP>8[>o>{>>В>>>>h>N>4>>>>>>%>/>e9>KC>1M>W>i>r>|>>>{>a>G>->> > > > > > x> ^ > D> *> !> )> 1> A> H> P> tW> Z_> @f> &m> |> > ؊> > > > p> V> <> "> > > > > > > l> R> 8> > > > > > #> (> i-> O2> 56> C> G>K>P>T>X>\>eg>Kk>1o>s>v>y>}>>>{>a>G>->>>ߦ>ũ>>>w>]>C>)>>>>>>>s>Y>?>%> >>>>>>o>U>;>!>>>>>>>k>Q>7>>>>>>>>g>M>3>>>>>>>}>c>I>/>>>>>>>y>_>E>+>====S====w=Oo=g=n=f=]=KT=K=B=9={?=G5=,="==w =C====r=>= ===n=:==җ==j~=6q=t=f=Y=fK=2>=0="=#=b=.====]=)====Y=%{=k=[=Z=UI=!8='===P=====L====|l=HY=F=2==x =D====s=?= =׆=q=o\=;F=0===j=6==λ=뚤=f=2v=_=W=?=b(=.====]=)==t=[=YB=%)====T= ==渂=x=P]=B='= ==K===䯑={u=GY=<= ==v=B==ڟ=⦁=rd=>F= 8===m=9==с=r=iS=54===ߘ=d=0==e=ޔE=`$=,===ݏ=[='m=L=ܿ*=܋=V="==ۺ=ۆm=RJ='==ڵ=ځ=M==c=ٱ?=}=I===ج=xu=DP=+==ק=s=?= =Z=֣4=o=:==Ҫ=՞=j\=65===ԙ=e=1=Y=1=ӕ=`=,==w=ҐN=\%='==ѿ=ы=Wf=#<==к=І=R=y=O=϶$=ρ=M===α\=}1=I===ͬ=xe=D9= ==̧=s=?Y= <==ˢ=n=:=X=*=ʞ =i=5==S=ə$=d=0==w=ȔH=`=+==Ù=Ǐi=[9=' ==ƾ=Ɗw=VV="%==Ź=Ņ=Q`=.= =Ĵ=Ā=Lv=D==ï={=G=W=$=ª=v=B=V=3==q=== c=.==l=8=l=7==g=3=r=<==b=.=e=/==]=)=e=.==X=$=a=*==S==K===N=z=B= =}=I=n=5==x=D=O===s=?x= ====n=:c=(===iw=5<====d^=0"==Ǫ=m=_1=+==‹=N=Z=%==j=,=T= =s=6==O==M==~=J=R=#==y=Ef='===tx=@8= =׸=x=o8=:==҆=E=j=5==A==d=0=K= ==_=+D====ZJ=&===O=U = ==B==O==C==~=Jw=3===yv=E1==ܧ=b=t=?= =]==n=:=F===i=5>==̱=j=d#=/==^==^=*=A= ==Yz=%2===Z=T"===H==N=n=%==}=IY===}=x3=C==e==r=>= <===ml=9"==Ќ=@=h=3=o=#==b=.@==Ÿ=l=] =(==:==W=#d===}=R0===X= =L=o=!=={=GG==ު=\=v=A= =1==p== ^===mt=9!==z=&=g=3=:===b==-==P==\=(Q===S=W ="=c= ==Qb= =ю=h=6=~=~.=}2=}]=|=|L=|#={={RD=z=z=z[=y=yF=xQ=xu=x =wE=w;=v=vjW=v=u=u0H=tǘ=t^=sX=s=s$=rF=rS=q=q3=q=p=pH>=oߍ=ov=o(=nv=n<=m1=mk~=m=l=l1e=kȲ=k`=jj=j=j&=iN=iT=h=h1=h=g=gI2=f}=fw=f=e\=e==d=dlZ=d=c=c27=bɀ=b`=a2=a{=a&=` =`UT=_=_=_L=^=^I=]#=]xk=]=\=\>`=[է=[l=[4=Zz=Z2=Y=Yal=X=X=X'==W=WU=V =Vr=V=U=UJ?=T=Tx=T =Sp=S>=R=Rm;=R~=Q=Q3=Ph=Pa=O=O0=O'r=N=NU=MY=M=M=L=LJ_=K=Kx=KC=J=J>=I=ImF=I=H=H3=Gg=Ga=F=F&=F'e=E=EU=DC=D=D=C=CJ>=B}=Bx=B=AW=A>=@=@m=@N=?=?2=>&=>ad======'=)=7d=7l=7=6=62o=5ɪ=5`=4=4X=4&=3=3U&=2`=2=2=1 =1IE=0=0w=0=/I=/==.Ժ=.k=.+=-=-1=,=,`+=+c=+=+%=*)=*Ta=)=)=)=(==(Hs='ߪ='w='7=&m=&<=%=%k=%E=$=$0=#=#_;="q="="$=!0=!Se= = = =7=Gl==u= (=\=;==i=K=~=/==^=K=~=#==R6=h====F2=݄=t= ==:K=|=h==0=.a=Œ=\==%="v==P==7=h= = D= = sH= w= = 8= = gU= = = ,==[A=p== ==OJ=y=}===CQ==q== =76=d=e== =+9<<&<<<>sD<-|<+<*T<(<' <%j<#<"#< )<ܮ<93<<=<OA<<J<d<S<<z[< _< 3< g<<Io<<v<_y;w;0;; ;\;;;";A(;-;޳2;l7;%;;@;јD;QI; M;Q;|U;5Y;\;`;ac;g;j;m;Ep;s;u;qx;*{;};;U;;Ȇ;;:;;Y;x;r= ;k#;e#&;^(;X+;Qy-;J/;D]1;=3;7C5;06;*'8;#9; :;}<;=; c>;?::r:V::::::Ά:::j:P:6:U:9"9Z"9MD88ѷ9Q9IR9ѷ:o:IQ:73:Q:k:n:-:IP:d:0:ě:ѷ:҂:: b;i; ;-;;IH;#;*d;0n;7$;> ;D;K)J;Q;XD;^m;e`#;k;r{;y E;;X;Y2; ;;-;t;v;P;I*;;;;d;j;D;9;;; ;T;ěY;1;) ;o;Ѷ;;Di;ۋ@;;;_;覞;t;4L;{";;;O;z<n<<~<X<S< < C(< <<-f<<t:<<<^w<<J<H<< <"2<#W<%y<')<(<*c<,b<- <<7< <8<<~b<<<ڳN<ۄ*===x=Q=J===v=?=V=='=c=+=a=ʼ=3=L==m=֥=?m=4==y==KR== = = n=!W5=!="(="="O=#c=#=$4=$g=%-=%n=%׸=&@~=&C=' ='z='=(LW=(=)=)=)j=*X.=*=+)=+{=+?=,d=,=-5=-M=.=.o=.ؗ=/A[=/=0=0{=0e=1M'=1=2=2n=20=3X=3=4*u=47=4=5d=5z=66<=6=7=7p~=7?=8B=8=9=9|?=9=:M=:=;>=;=;=e7=>=?6=?r=@0=@p=@٬=ABj=A'=B=B|=B_=CN=C=D=DS=D=EY=Eˆ=F+D=F=F=Gex=G3=H6=H=If=Iq =I=JB=JQ=K =K|=K=LN;=L=M=Mi=M"=NY=N–=O+O=O=O=Pez=P2=Q6=Q=R\=Rq=R=SB=S;=T=T|=Tb=UN=U=V=V>=V=WY=Wb=X+=X=X=Ye:=Y=Z6=ZY=[=[p=[y=\B.=\=]=]|K=]=^M=^h=_=_=_=`Y6=`=a*=aO=a=bd=bf=c6=c=d}=dp.=d=eA=eC=f=f{=fW=gM=g=hh=h=h=iXy=i)=j)=j=j7=kc=k̖=l5E=l=m=moP=m=n@=n[=o =oz=oe=pL=p=ql=q=q=rWr=r=s(=sx=s#=tb=tz=u4&=u=v}=vn'=v=w?~=w(=x=xy|=x&=yJ=yz=z#=z=zu={V={=|'p=|=|=}aj=}=~2=~a= =l=W==SS===M=$=X=E===*>=^==6==/=d,=~=="=5t=i==i==; =o]=== P=@=t=C=ݓ==F5=z==&=v=K==f===QU===C="=V=1===(=\l== =X=-=a=C=ʑ==3,=gz===c=8=l=K=՘= =>2=r===e=C=w=J===I/=}z===^=N==@===T!=l===%M=Y==,=v=*=_ =T=Ǟ==01=d{===W=5=i=3={==; =oV=== /=@w=t==O==E=z&=m===KD====_=P==3=y=!=V=L==='=[c===3=,x=`==H==1=f=Z=Ξ==7'=kk===6=>,>F>`>z>>>>>>>0>J>d>~>>>>>>>4>N>h>>>>>>>>8>R>l>>>>>>>"><>V>p>>>>>> >&>@>Z>t>>>º>ܸ>>>*>D>^>x>>>Ɯ>>>>.>H>b>|>}>y>t>p>l>g>2b>L]>fX>S>N>I>D>?> :> 3> 6.> P(> j#> > > > > > > > 9> S> m> > > > > > > #> => W> q> > > > }> u> m> 'e> A]> [T> uL> C> :> 1> (> > > +> E> ^> x> > > > > >>.>H>b>|>>y>o>d>Y>N>2D>L9>f,>!>> >>>>>5>O>i>>>>ц>z>m>`>9S>SF>m9>,>>>>>>"><>V>p>>>>x>i> Z>&L>@=>Z.>t>>>>>>>)>C>]>w>t>c>S>C>2>">->G>`>z>>>ȫ>>>w>0f>JT>dB>~/>> >>>>>3>M>g>w>d>Q>>>+>>>6>P>j>>>>x>d>P> :>:&>T>m>>>>թ>> }>#h>=R>W=>q'>>>>>> >&>@t>Z^>tG>0>>>>>>)>C>]u>w]>E>->>>>>,>F>`>zi>O>6>>>>>/>I>c>}j>P>6>>>>>2>L>f|>a>F>+>>> > > 5> O> ii> M> 1> > > >!>!>!8>!Ri>!lL>!/>!>!>!>!>">"!~>";a>"UC>"o%>">">">"֬>"># n>#$P>#>1>#X>#q>#>#>#>#u>#U>$ 6>$'>$@>$Z>$t>$>$v>$T>$4>$>%>%)>%C>%]>%wo>%M>%+>% >%>%>&>&,>&Fa>&`?>&z>&>&>&Ǵ>&>&o>'L>'/)>'I>'b>'|>'>'w>'S>'0>' >(>(1>(K>(ez>(V>(1>( >(>(>)>)y>)4S>)N.>)h>)>)>)>)q>)K>*%>*>*6>*P>*j>*d>*=>*>*>*>+>+y>+9R>+S*>+m>+>+>+>+b>+9>,>,!>,;>,U>,oo>,F>,>,>,>,>- w>-$M>->#>-W>-q>->-{>-P>-&>->. >.&>.@{>.ZP>.t%>.>.>.>.w>.K>/ >/(>/B>/\>/vo>/B>/>/>/ݽ>/>0c>0+6>0E>0^>0x>0>0R>0$>0>0>1>1-l>1G=>1a>1z>1>1>1T>1%>1>2>2/>2Ig>2c8>2}>2>2>2x>2H>2>3>31>3K>3eU>3$>3>3>3̏>3^>4->4>43>4M>4gf>44>4>4>4Μ>4i>57>5>55>5O>5ik>58>5>5>5Н>5i>65>6>67>6Q>6ke>6/>6>6>6ґ>6]>7(>7>79>7S>7mQ>7>7>7>7z>7D>8>8!>8;>8Uj>8o3>8>8>8>8W>8 >9 >9#>9=x>9W@>9q>9>9>9`>9'>9>: >:%}>:?D>:Y >:r>:>:_>:&>:>:>; w>;'=>;A>;Z>;t>;T>;>;>;ۣ>;h><-><(><\{><><><Ë><>=>=*>=D]>=^!>=w>=>=i>=,>=>=>>s>>,6>>E>>_>>y{>>=>>>>>>>>C>?>?->?G>?aF>?{>?>?>?H>?>?>@>@/H>@I>@b>@|>@E>@>@>@>@A>A>A0>AJ{>Ad:>A}>A>At>A2>A>A>Bi>B2'>BK>Be>B^>B>B>B̔>BO>C >C>C3>CM?>Cf>C>Cr>C->C>C>D^>D>D4>DN>DhH>D>D>Dv>D0>D>E>E]>E6>EO>Ei>EB>E>E>Ek>E$>F>F>F7M>FQ>Fj>Fs>F+>F>Fњ>FQ>G>G>G8v>GR,>Gk>G>GO>G>Gһ>Gq>H'>H>H9>HSF>Hl>H>Hf>H>H>H>I9>I >I:>ITT>In>I>Ip>I#>I>I>J<>J!>J;>JUU>Jo>J>Jl>J>J>J>K 3>K">K<>KVH>Ko>K>K[>K >Kּ>Km>L >L#>L=~>LW.>Lp>L>L<>L>Lכ>LK>M >M$>M>X>MX>Mq>Mc>M>M>Mm>M>N >N%w>N?$>NX>Nr~>N+>N>N>N2>N>O >O&7>O?>OY>Os:>O>O>O=>O>O>P ?>P&>P@>PZ>>Ps>P>P=>P>Pڒ>P;>Q >Q'>QA7>QZ>Qt>Q3>Q>Q>Q->Q>R}>R(%>RA>R[u>Ru>R>Rl>R>Rۺ>Ra>S>S(>SBU>S[>Su>SI>S>S”>S:>S>T>T)*>TB>T\u>Tv>T>Tc>T>Tܬ>TP>U>U)>UC<>U\>Uv>U&>U>Um>U>U>VV>V)>VC>V]<>Vv>V>V">V>Vf>V>W>W*J>WC>W]>Ww,>W>Wm>W>Wݮ>WN>X>X*>XD,>X]>Xwk>X >X>XI>X>X>Y$>Y*>YDa>Y]>Yw>Y;>Y>Yv>Y>Y>ZM>Z*>ZD>Z^#>Zw>Z\>Z>ZĔ>Z0>Z>[g>[+>[D>[^9>[w>[p>[ >[Ĥ>[?>[>\s>\+ >\D>\^A>\w>\s>\ >\Ħ>\?>\>]q>]+ >]D>]^:>]w>]j>]>]Ě>]1>]>^`>^*>^D>^^$>^w>^R>^>^>^>^>_A>_*>_Dk>_^>_w>_+>_>_U>_>_~>`>`*>`D:>`]>`wb>`>`>`>`ݯ>`B>a>a*h>aC>a]>aw >a>aD>a>ag>a>b>b*>bC>b]=>bv>b_>b>b>b>b>c0>c)>cCO>c\>cvn>c>c>c>cܩ>c8>d>d)U>dB>d\q>du>d>d>d§>d4>d>eN>e(>eBg>e[>eu>e >e>e$>e۰>e<>f>f(R>fA>f[h>ft>f~>f>f>f>f>g0>g'>gAD>gZ>gtW>g>gi>g>g{>g>h >h'>h@>hZ$>hs>h3>h>hB>h>hP>i >i&]>i?>iYk>ir>iw>i>i>i>i>j >j%>j?>jX>jr'>j>j/>j>j8>j>k @>k$>k>G>kW>kqM>k>kS>k>kX>k>l ]>l#>l=a>lV>lpd>l>lg>l>li>l>m k>m">mmU>mol>m>ml>m>mk>m>ni>n!>n;g>nT>nnd>n>na>n>n]>n>oX>o >o:S>oS>omM>o>oF>o>o?>o>p7>p>p9/>pR>pl&>p>p>p>p>p>q>q>q7>qQu>qj>qi>q>q[>q>qM>r>r?>r6>rP0>ri>r >r>r>rχ>r>sv>s>s5d>sN>shQ>s>s>>s>s*>s>t>t>t4>tMu>tf>t_>t>tI>t̽>t2>t>u>u2>uL>uet>u~>uZ>u>u@>u>u%>v>v1 >vJ{>vc>v}_>v>vB>vɲ>v$>v>w>w/v>wH>wbW>w{>w7>w>w>w>w>xc>x->xGA>x`>xz>x>x>xh>x>xC>y>y,>yE>y^>yxd>y>y>>yĪ>y>y>z>z*Z>zC>z]0>zv>z>zq>z>zG>z>{>{(>{A>{[X>{t>{+>{>{>{f>{>| 7>|&>|@>|Yp>|r>|?>|>|>|v>|>} C>}$>}>>}Ww>}p>}C>}>}>}s>}>~ >>~">~<>~Ul>~n>~5>~>~>~c>~>*> >9>SS>l>>z>>?>>>2>>(>5E>A>N>[V>h>t>f>>>v>%>>ͅ>5>>>B> >>&O>2>?>L[>Y >e>rh>>>r>!>>|>+>>>3>> ><>#>0>=D>I>V>cJ>o>|>Q>>>V>>Ȯ>Z>>>^> >>!a>. >:>Gc>T>`>me>z>>e>>>e>>Һ>e>>>c> >>+`>8 >D>Q]>^>j>wY>>>T>>>O>>ܟ>H>>>A>>(>59>A>N>[0>g>t>&>>u>>>j>>ٸ>_>>> R>>%>2E>>>K>X7>d>q>~(>>t>>>c> >֭>S>>> A>>">/.>;>Hw>U>a>nc>{>>O>>>9>>Ӏ>">>i> >>R>+>8>E9>Q>^~>k >w>d>>>J>>Ì>.>>q>>>T>>(>56>A>Nx>[>g>tZ>>>:>>y>>̹>X>>>6> >u>%>1>>R>J>W>d.>p>}k> >>E>>> >ս>Z>>>3>>!n>. >:>GE>S>`>m>y>T>>>*>>a>>ޙ>5>>m>>>*>>6>Cu>P>\>iE>u>{>>>J>>>>ڳ>M>>> >>&M>2>?>L>X>eK>q>~}>>>F>>w>>֨>@>>o> >>"7>.>;f>G>T>a,>m>zZ>>>>>K>>x> >>:>>f>>*>7&>C>PQ>\>i|>v>>;>>d>>>">ڶ>K>>s> >>&.>2>?V>K>X}>e>q>~6>>\>>>>ɧ>9>>]>>>>!>.7>:>GZ>S>`}>m>y>1>>S>>t>>і>&>>F>>g>>)>6>B>O5>[>hT>t>s>>>>>=>>Z>>w>> >!>$>1=>=>JY>V>ct>p>|>>>5>>O>>i>>> >>&>>,>>8>EU>Q>^m>j>w>>>%>>;>>P>>e>>z>>>'>3>@+>L>Y?>e>rR>~>d>>v>>>>֙>">>2>>C>!>.R>:>Ga>S>`q>l>y>>>>>">Ī>0>ݷ>=>>I>>V>(>5b>A>Nm>Z>gw>s>>>>>>>˟>$>>,>> 5>>#=>/>H>UL>a>nS>z>Y>>_>>d>>i>>n>>s>>w>)>6{>B>O~>[>h>u>>>>>>>̇>>> >> >>$>0>=>I>V>b>o>{>>>>>>}>>z>>v>>r>>*n>6>Ch>O>\c>h>u]>>W>>Q>>J>>B>>;>> 3>>$)>0>= >I>V>b>o >{>>~>>s>>h>>\>>P>>D>>*7>6>C*>O>\>h>u >>>x>>i>>Y>>H>>8> >'>#>0><>I>U{>a>ni>z>W>>D>>0>Ŧ>>ޒ>>}>>i>>)S>5>B>>N>['>g>t>>>n>>V>>>>ײ>&>> > >>"f>.>;M>G>T2>`>m>y>>n>>R>>6>Ч>>>>m>>P>'>42>@>M>Y>e>rd>~>D>>$>>>s>>R>>1>>> }>,>9Z>E>R7>^>k>w>>^>>9>>>΁>>\>>6> >>%|>1>>T>J>W->c>p>|q>>H>>>>>a>>6>> >w>>*L>6>C>O>[>h^>t>1>>>m>>?>˨>>y>>K> >>">.>;S>G>T#>`>l>yZ>>(>>>^>>+>ܑ>>^>>+>>&>3\>?>L'>X>d>qW>}>!>>>P>>>~>>F>>>r>>+9>7>D>Pc>\>i)>u>>R>>>z>>>>ؠ>>d>> '>>">/K>;>H>To>`>m1>y>>R>>>r>>2>ܓ>>Q>>>o>&>3.>?>K>XJ>d>q>}e>>!>>>;>ǘ>>S>>>k>>%>*>6>C:>O>[>hP>t>>d>>>v>>->׉>>?>>>O>!>.>:^>F>S>_m>k>x >y>>,>>>8>Α>>C>>> L>>$>1T>=>J>V\>b>o >{b>>>g>>>l>>>p>>>r>>(>4s>@>M>Yt>e>r>~s>>>q>>>n>>>j>>>e>>+ >7`>C>P>\Y>h>t>Q>>>H>>>>>א>>3>>>(>!x>->:>Fk>R>_ >k]>w>>M>>>=>>>+>z>>> h>>$>0T><>H>U>>a>m>z)>v>>>_>>>G>ܓ>>->y> >>&_>2>>>KC>W>c>p%>|q>>>S>>>4>~>>>]>>><>(>4>A>Mb>Y>e>r>>~>>>a>>>:>Ԃ>>>Z>>>1>*x>6>C>ON>[>g>t">i>>>;>>> >S>>>#>h>>>,8>8|>D>Q>]J>i>u>>Z>>>&>i>˭>>2>v>>>>>!>->:>FG>R>^>k >wO>>>>T>>>>W>>>> Y>>">/>;Y>G>S>`>lW>x>>>S>>>>M>ڌ>>>E> >>#>0<>H>T>a/>mm>y>>">_>>>>N>ۊ>>><> x>>$>1)>=c>I>U>b>nM>z>>>5>n>>>>T>>>> 7>p>%>1>>>JQ>V>b>n>{0>g>>> >D>{>в>>>U>> >>&->2d>>>J>W>c9>on>{>> >B>v>>>>G>{>>>>I>&|>2>>>K>WH>c|>o>{>>D>w>>> >>>o>>>>4>e>&>2>>>K'>WX>c>o>{>>G>v>>>>3>a>>>>>K>&x>2>>>K>W0>c]>o>{>>>?>l>>>>>J>v>> >>&$>2P>>{>J>V>b>o'>{Q>|>>>>%>O>y>ܢ>>>> H>q>%>1>=>J>V<>bd>n>z>>>,>T>{>á>>>>=>e> >>$>0>=$>II>Uo>a>m>y>>*>O>t>>¾>>>*>O>s> >>#>0><$>HH>Tk>`>l>x>>>;>]>>>>>>(>I> k>>">.>:>G>S.>_O>ko>w>ƒ>>›>¨>´.>M>l>؋>>>> >$>!C>-a>9>E>Q>]>i>v>Â0>ÎM>Új>æ>ò>þ>>>>1>N>i>>>+>7>C>P>\(>hD>t^>Āy>Č>Ę>Ĥ>İ>ļ>>/>H>b>{>>>>)>5>B>N(>ZA>fX>rq>~>Ŋ>Ŗ>Ţ>Ů>ź>>+>C>Y>p>>>>'>3>?>L >X>d4>pJ>|_>ƈt>Ɣ>Ơ>Ƭ>Ƹ>>>>>+>>> R>e>%y>1>=>I>U>a>m>y>dž>ǒ!>Ǟ2>ǪD>ǶV>g>y>ڊ>>>> >>">/>;>G >S1>_@>kQ>w`>ȃo>ȏ>ț>ȧ>ȳ>ȿ>>>>>>>> ,>,;>8H>DV>Pb>\o>h}>t>ɀ>Ɍ>ɘ>ɤ>ɰ>ɼ>>>>>>>$>0>):>5E>AP>MZ>Ye>eo>qy>}>ʉ>ʕ>ʡ>ʭ>ʹ>ż>>>>>> >>&>2>>>J>V>b&>n.>z4>ˆ<>˒B>˞J>˪P>˶W>]>c>i>o>u>z> >>">.>:>F>R>^>j>v>̂>̎>̚>̦>̲>̾>>>>>>>>>*>6>B>N>Z>f>r>~>͊>͖>͢>ͮ>ͺ>>>>>>>>>&>2>>>J>V>b>n>z>Ά>Β>Ξ>Ϊ>ζ>>>>>>> >>">.>:>F>R>^>j>v>ς>ώ>Ϛ>Ϧ>ϲ>Ͼ>ʈ>փ>}>w>r>k>f>_>*Z>6S>BM>NE>Z>>f8>r0>~)>Њ!>Ж>Т>Ю >к>>>>>>> >>%>1>=>I>U>a>m{>yp>хf>ё\>ѝQ>ѩF>ѵ;>1>%>>>>>>> >,>8>D>P>\>h>t{>Ҁn>Ҍ`>ҘS>ҤE>Ұ8>Ҽ*>>>>>>>>>'>3>?>Kx>Wi>cY>oI>{9>Ӈ)>ӓ>ӟ>Ӫ>Ӷ>>>ڳ>>>~> l>[>"H>.7>:$>F>Q>]>i>u>ԁ>ԍ>ԙ>ԥy>Աf>ԽQ>>>)>>>>>>>(>4>@n>LX>XC>d->p>|>Շ>Փ>՟>ի>շ>z>b>K>4>>> >>">.>:>Ft>R[>^C>j*>v>ց>֍>֙>֥>ֱ>ֽw>^>C>)>>>>>>(>4m>@R>L6>X>c>o>{>ׇ>ד>ןr>׫T>׷7>>>>>>> j>L>"->.>9>E>Q>]>iv>uW>؁8>؍>ؘ>ؤ>ذ>ؼ>z>Y>9>>>>>>'s>3R>?0>K>V>b>n>z>نe>ْB>ٞ >٩>ٵ>>͓>p>L>)>>>> >,t>8O>D+>P>[>g>s>r>ڋM>ڗ&>ڣ>ڮ>ں>Ə>h>B>>>> >>%W>10>=>H>T>`>lh>x?>ۄ>ۏ>ۛ>ۧ>۳t>ۿJ> >>>>z>P>%>>)>5>A{>MP>Y%>d>p>|>܈w>ܔK>ܠ>ܫ>ܷ>Û>n>A>>>> >_>"1>.>9>E>Qz>]L>i>t>݀>݌>ݘb>ݤ3>ݰ>ݻ>ǥ>u>D>>>>>S>&">1>=>I>U^>a,>l>x>ބ>ސe>ޜ3>ި>޳>޿>h>5>>>>h>4>>)>5>Ad>M/>X>d>p>|\>߈'>ߓ>ߟ>߫>߷Q>>>ڮ>x>B> > >>!f>-0>8>D>P>\Q>h>s>>p>8>>>ຍ>T>>>>n>5> >>$>0K><>G>S>_`>k%>v>Ⴎ>s>6>>᱾>ὃ>F> >>>S>>>>'^>3 >>>J>Vf>b(>m>y>l>->>⨯>p>0>>װ>q>0>>>p>/>)>5>Al>M+>X>d>pf>|$>>㓟>^>>>–>S>>>>E> >> z>,6>7>C>Oh>[$>f>r>~U>>>䡅>?>>ij>m>'>>>R> >>"}>.6>9>E>Q^>]>h>t>>>>嗭>c>>>ƈ>>>>>a>> >>$7>/>;>GW>S >^>ju>v)>>捒>F>>氭>a>>>z>->>>E>>%>1[>= >H>Tp>`!>k>w>4>>皕>F>>罧>V>>>e>>>s>">&>2>>.>I>U>a9>l>x>A>>蛜>J>>辣>P>>>U>>>Y>>'>3[>?>J>V[>b>m>y[>>鐯>Y>>鳭>V>>֨>R>>>K>>>(D>3>?>K;>V>b>n1>y>>%>>r>>꿿>d> >>U>>>D>>(>42>?>K{>W>b>ng>z >녭>Q>>먗>:>>>">>e>>>K>>(>4/>?>Kp>W>b>nR>y>셒>2>>r>>쿰>O>>>+>>h>>>(B>3>?}>K>V>bV>m>y>,>>d>>>8>>o> >>A>>v>>'>3F>>>Jz>V>a>mG>x>z>>>D>>u> >զ>=>>m>>>3>&>2`>=>I>U$>`>lQ>w>{>>><>>f>>Ԑ>$>>M>>u>>%>1/><>HU>S>_{>k >v>2>>V>>z> >ǝ>->޿>O>>q> >>$!>/>;A>F>R`>]>i>u>>+>>H>>d>>> >>'>> A>>"[>->9t>E>P>\>g>s.>~>E>>[>>p>>υ>>>">> 5>> H>+>7Y>B>Nk>Y>e{>q>|>>>!>>/>>=>>I>>V>>a>>)l>4>@w>K>W>c>n>z>>>>>>$>ʧ>+>>0>>5>>9>&>2<>=>I?>T>`B>k>wD>>D>>E>>D>>D>>B>>A> >=>#>/;>:>F6>Q>]0>h>t,>>%>>>>>Ĕ>>ۋ>>>> x>> o>+>7c>B>NY>Y>eL>p>|>>>1>>#>>>̎>>}>>l>>\>>(I>3>?8>J>V$>a>m>x>>r>>\>>G>Ȼ>0>ߥ>>>> u>>$[>/>;C>F>R(>]>i>t>>d>>G>>+>ě> >~>>^>> ?>> >+>6>Bm>M>YL>d>p)>{>>t>>Q>>+>˙>>s>>M>>&>>&>2j>=>IB>T>`>k>v>Y>>/>>>m>>?>ݩ>>}>> N>>" >->8>DX>O>[&>f>q>}\>>+>>>^>>)>ؐ>>\>>%>>>(T>3>?>J>U>aI>l>x>s>>9>>>`>>&>ވ>>K>> >o>">.2>9>D>PS>[>g>rs>}>1>>>P>> >l>>'>>>A>>>(Z>3>?>Jp>U>a(>l>w><>>>P>>>a>Һ>>p>??? l???r?"?'?-w?3#?8?>{?D'?I?O~?U*?Z?`?f-?k?q?w/?|??1???1???0???/??Ƅ?-??ׁ?*??~?(??z?$?? u???p?!?&?,j?2?7?=c?C ?H?N[?T?Y?_S?d?j?pI?u?{?????5???*??v???i??ʶ?\??ۨ?N???????/??y???i?% ?*?0V?5?;?AD?F?L?R0?W?]y?c?h?nd?t?y?N???8??}? ??g? ??N??Ȓ?5??y???_???D??? (??j? ?"?(L?-?3?9/?>?Dp?J?O?UP?Z?`?f0?k?qp?w?|?N???,??k? ??G???#??_??֜?;??v???O??? (??c???%:?*?0s?6?;?AJ?F?L?R?W?]V?b?h?n*?s?yb?~??4??j?????k??ߗ?-??Y????? E??o??"?(.?-?3X?8?>?D?I?O>?T?Zg?_?e?k"?p?vJ?{?q???+??Q??w? ??/??U??y? ?ڝ?/??T??w? ??+? ?N??p?#?(?.#?3?9D?>?De?I?O?U?Z?`6?e?kU?p?vu?|??#??B??`??~? ??)??G??c??ڀ? ??)??D??_?? y??? ?"?(;?-?3T?8?>m?C?I?O?T?Z)?_?eA?j?pX?u?{p?????'??=??R??g??|??ΐ??٥?/??B??T?? h? ? y? ? ? ? !? '&? ,? 27? 7? =H? B? HX? M? Sh? X? ^x? d? i? o? t? z? ? +? ? :? ? G? ? U? ? b? ? n? ? z? ? ҆? ? ݒ? ? ? "? ? ,? ? 7? ? A? ? K? ? %S? *? 0]? 5? ;e? @? Fl? K? Qt? V? \{? a? g? m? r? x ? }? ? ? ? ? ? ? #? ? '? ? ,? ? /? ʱ? 2? մ? 6? ? 8? ? ;? ? =? ? ?? ? @? ? A? "? (B? -? 3A? 8? >B? C? IA? N? T@? Y? _?? d? j>? o? u;? z? 9? ? 6? ? 3? ? 0? ? ,? ? (? ? #? ǡ? ? Ҝ? ? ݗ? ? ? ? ? ? ? ? }? ? v? ? o? $? *f? /? 5]? :? @U? E? KL? P? VC? [? a8? f? l/? q? w$? |? ? ? ? ? ? |? ? p? ? c? ? V? ? I? ? ;? ٴ? -? ? ? ? ? ? ? y? ? i? ? Y? ? &H? +? 18? 6? <&? A? G? L? R? Wz? \? bg? g? mU? r? xA? }? -? ? ? ? ? z? ? e? ? P? ? :? İ? %? Ϛ? ? ڃ? ? k? ? U? ? ?D?I?N?TI?Y?_?dx?i?oB?t?z ?o??8???d??,???V???ŀ??G?ժ? ?o??5???\?? ? ??E??! ?&j?+?1-?6?;?AP?F?L?Qr?V?\4?a?f?lU?q?w?|u??4???T???q??/???K?Ǫ? ?h??$???>???W??? o??*??"?(A?-?2?8W?=?C?Hl?M?S$?X?]?c8?h?m?sK?x?~?]???n??$???3???B?Ü??P?Ӫ??^???j???u?? &???1??#?):?.?3?9B?>?C?II?N?S?YO?^?c?iT?n?t?yZ?~??]?? ?`?? ?b?? ?c???c?θ??c?޷? ?a?? ?_??? [???W??#?)R?.?3?9M?>?C?IF?N?S?Y>?^?c?i5?n?s?y,?~~??!?s???g?? ?[???N?Þ??@?Ӑ??1???!?q???`?? ?N???#;?(?-?3'?8v?=?C?H`?M?R?XK?]?b?h4?m?r?x?}j???Q???8????i???N?ǚ??1?}???_???@??? ? k???J?!?&?,(?1r?6?<?AO?F?K?Q,?Vu?[?a?fP?k?p?v*?{s???L???$?l???B????`?ʧ??4?{?? ?O???!?g?? ?9??? ?$O?)?.?4?9c?>?C?I1?Nv?S?X?^C?c?h?n?sS?x?}??b???+?o???7?z???A?ǃ???I?܌???P????V?? ??X?? ?&?+[?0?5?;?@[?E?J?P?UZ?Z?_?e?jW?o?t?z?S????M????E?????s????C?w????E?x?ҫ???D?w????A?t?? ? ??xd?}?????D?i????? ?D?i?ō?ʰ??????c??????6?Y? |????"?''?,I?1k?6?;?@?E?K?P5?UV?Zw?_?d?i?n?t?y;?~[?|???????!!V?!&m?!+?!0?!5?!:?!??!D?!J?!O&?!T=?!YT?!^j?!c?!h?!m?!r?!w?!|?!?!?!0?!F?![?!p?!?!?!?!?!?!?!?!?!*?!>?!R?!g?!z?!?!?!?!?!?!?"?"?" (?";?"M?"`?"s?"$?")?".?"3?"8?"=?"B?"H?"M?"R%?"W7?"\G?"aY?"fj?"k{?"p?"u?"z?"?"?"?"?"?"?"?"-?"=?"L?"\?"k?"z?"?"Ƙ?"˧?"ж?"?"?"?"?"?" ?"?"(?"5?#C?#Q?# ^?#k?#y?#?#!?#&?#+?#0?#5?#:?#??#D?#I?#O?#T?#Y?#^'?#c3?#h>?#mI?#rU?#w`?#|k?#v?#?#?#?#?#?#?#?#?#?#?#?#?#?#?#?#?#!?#)?#3?#_?(CO?(H??(M0?(R?(W?(\?(`?(e?(j?(o?(t?(y?(~?({?(i?(X?(G?(6?($?(?(?(?(?(?(?(?(Ô?(Ȃ?(o?(\?(J?(7?(#?(?(?(?(?(?(?)?)?) s?)_?)J?)6?)!"?)& ?)*?)/?)4?)9?)>?)C?)Hz?)Md?)RN?)W9?)\"?)a ?)e?)j?)o?)t?)y?)~?)p?)Y?)C?)+?)?)?)?)?)?)?)?)o?)W?)??)&?)?)?)?)?)?)?)y?)`?)G?).?)?*?*?* ?*?*?*y?* ^?*%D?**)?*/?*3?*8?*=?*B?*G?*Lm?*QR?*V5?*[?*_?*d?*i?*n?*s?*xr?*}V?*9?*?*?*?*?*?*?*n?*Q?*3?*?*?*?*?*ƞ?*ˀ?*a?*C?*%?*?*?*?*?*?*k?*L?+-?+ ?+ ?+?+?+?+m?+#M?+(-?+- ?+1?+6?+;?+@?+Ei?+JG?+O&?+T?+X?+]?+b?+g?+l\?+q:?+v?+z?+?+?+?+l?+I?+&?+?+?+?+?+v?+R?+/?+ ?+?+?+͟?+{?+V?+2?+ ?+?+?+?+z?+T?+/?, ?,?, ?,?,s?,M?, '?,%?,)?,.?,3?,8g?,=@?,B?,F?,K?,P?,U}?,ZV?,_.?,d?,h?,m?,r?,wg?,|??,?,?,?,?,t?,K?,"?,?,?,?,}?,S?,)?,?,?,ɬ?,΂?,X?,-?,?,?,?,?,X?,-?,?,?-?-?- S?-(?-?-?- ?-%x?-*L?-/?-3?-8?-=?-Bl?-G@?-L?-P?-U?-Z?-_]?-d/?-i?-m?-r?-ww?-|I?-?-?-?-?-a?-2?-?-?-?-u?-F?-?-?-?-ć?-W?-&?-?-?-ܕ?-e?-4?-?-?-?-p?-??. ?.?. ?.x?.F?.?.?.$?.)~?..L?.3?.7?.?2?2՟?2P?2?2?2`?2?2?2p?2?2?3~?3 -?3 ?3?3:?3?3 ?3%F?3)?3.?33Q?37?3?7?7b?7?7?7?7?77?7?7X?7?7y?7 ?7ę?7*?7͹?7I?7?7h?7?7?7?7?74?7?7Q?7?8n?8?8 ?8?8?85?8?8$O?8(?8-j?81?86?8;?8??8D+?8H?8MD?8Q?8V]?8Z?8_u?8d?8h?8m?8q?8v/?8z?8E?8?8[?8?8q?8?8?8?8?8$?8?88?8?8L?8?8^?8?8q?8?8Ղ?8 ?8ޔ?8?8?8-?8?8=?8?8M?9?9\?9 ?9k?9?9y?9?9"?9' ?9+?90?94?99&?9=?9B2?9F?9K>?9O?9TI?9X?9]T?9a?9f]?9j?9og?9s?9xp?9|?9y?9?9?9?9?9 ?9?9?9?9?9?9 ?9?9%?9?9*?9ɬ?9.?9ұ?92?9۴?96?9?99?9?9;?9?9=?9?:>?:?: @?:?:@?:?:A?:#?:(@?:,?:1??:5?::>?:>?:CA?;B?;G0?;K?;P ?;T?;Y?;]?;a?;fu?;j?;ob?;s?;xO?;|?;?$?>?> ?>Q?>?>?>|?>!?>&C?>*?>/ ?>3l?>7?><2?>@?>D?>IY?>M?>R?>V?>Z?>_C?>c?>h?>lh?>p?>u*?>y?>}?>L?>?>?>n?>?>/?>?>?>N?>?>?>m?>?>+?>?>?>H?>̧?>?>c?>?> ?>}?>?>9?>?>?>R?>?? ??i?? ??"??????9????#??(M??,??1??5`??9??>??Br??F??K(??O??S??X9??\??`??eH??i??m??rU??v??{ ??b??????n???? ??y????*??????2??????:??????A??͘????F??ڜ????J??????M??????O?@?@?@ P?@?@?@O?@?@?@$N?@(?@,?@1L?@5?@9?@>H?@B?@F?@KC?@O?@S?@X=?@\?@`?@e5?@i?@m?@r.?@v?@z?@$?@v?@?@?@k?@?@?@_?@?@?@R?@?@?@C?@?@?@4?@Ȅ?@?@$?@s?@?@?@a?@?@?@N?@?@?@9?A?A?A $?A r?A?A ?A[?A?A"?A'B?A+?A/?A4)?A8v?A?B9?B=?BB ?BFR?BJ?BN?BS?BWc?B[?B_?Bd.?Bhr?Bl?Bp?Bu?DB?DG?DKI?DO~?DS?DW?D\?D`P?Dd?Dh?Dl?Dq ?DuT?Dy?D}?D?D!?DU?D?D?D?D ?DR?D?D?D?D?DL?D~?D?D?D?DD?Du?Dѥ?D?D?D8?Dh?D?D?D?D(?DX?D?D?E?E?E E?Et?E?E?E?E!.?E%]?E)?E-?E1?E6?E:B?E>p?EB?EF?EJ?EO%?ESR?EW?E[?E_?Ed?Eh0?El\?Ep?Et?Ex?E} ?E7?Eb?E?E?E?E?E9?Ed?E?E?E?E ?E6?E`?E?E?E?E?E/?EX?Eԁ?Eت?E?E?E#?EL?Et?E?E?E?E?F:?Fb?F ?F?F?F?F$?FK?F#q?F'?F+?F/?F4 ?F8/?F?F`?F?F?F?F?F?F(?FI?Fj?Fً?Fݫ?F?F?F ?F,?FL?Fl?F?F?G?G?G ?G(?GG?Gf?G?G?G#?G'?G+?G0?G4:?G8W?G?HB?HF?HJ?HO?HS?HW1?H[E?H_Y?Hcn?Hg?Hk?Ho?Hs?Hw?H{?H?H ?H?H0?HB?HU?Hg?Hz?H?H?H?H?H?H?H?H?H?H)?H:?HK?H[?Hl?H|?Hݍ?H?H?H?H?H?H?H?H ?I?I'?I 6?ID?IS?Ib?Io?I~?I"?I&?I*?I.?I2?I6?I:?I>?IB?IG?IK?IO?IS(?IW5?I[A?I_M?IcY?Ige?Ikp?Io|?Is?Iw?I{?I?I?I?I?I?I?I?I?I?I?I?I?I!?I*?I3?I?L/?L ?L?L?L?L?L?L?L?L?L?L?Ls?Lc?LR?LB?L0?L?L?L?L?L?L?Lܶ?L?L?L?Ln?L[?LI?L6?L#?M?M?M?M ?M?M?M?M?Ms?M#^?M'J?M+5?M/ ?M3 ?M6?M:?M>?MB?MF?MJ?MNv?MRa?MVK?MZ4?M^?Mb?Me?Mi?Mm?Mq?Mu?My~?M}g?MP?M8?M ?M?M?M?M?M?M?Mv?M]?ME?M+?M?M?M?M?Mì?Mǒ?Mw?M]?MC?M(?M?M?M?M?M?M?Ml?MP?M5?M?N?N?N ?N ?N?No?NR?N5?N!?N$?N(?N,?N0?N4?N8h?N?OC?OF?OJ?ON?ORx?OVP?OZ(?O^?Oa?Oe?Oi?Om^?Oq5?Ou ?Ox?O|?O?Oh?O=?O?O?O?O?Ol?OA?O?O?O?O?Ok?O@?O?O?O?Oő?Oe?O9?O ?O?Oش?O܇?O[?O.?O?O?O?Oy?OK?O?O?P?P?P e?P7?P?P?P?P|?P!M?P%?P(?P,?P0?P4`?P8/?P<?P??PC?PGo?PK>?PO?PR?PV?PZz?P^I?Pb?Pe?Pi?Pm?PqQ?Pu?Px?P|?P?PU?P#?P?P?P?PV?P"?P?P?P?PS?P?P?P?P?PN?P?P?Pȯ?Pz?PD?P?P?Pۣ?Pm?P7?P?P?P?P^?P'?P?P?Q?QJ?Q ?Q ?Q?Ql?Q4?Q?Q?Q#?Q'S?Q+?Q.?Q2?Q6p?Q:7?Q=?QA?QE?QIP?QM?QP?QT?QXh?Q\-?Q_?Qc?Qg}?QkB?Qo?Qr?Qv?QzU?Q~?Q?Q?Qf?Q)?Q?Q?Qt?Q7?Q?Q?Q?QC?Q?Q?Q?QL?Q?Q?Qő?QS?Q?Q?Qԗ?QX?Q?Q?Q?Q[?Q?Q?Q?Q\?Q?Q?R?RZ?R ?R ?R?RV?R?R?R?R#P?R'?R*?R.?R2H?R6?R9?R=?RA=?RD?RH?RLt?RP1?RS?RW?R[f?R_"?Rb?Rf?RjU?Rn?Rq?Ru?RyC?R|?R?Rs?R.?R?R?R]?R?R?R?RD?R?R?Rp?R)?R?R?RS?R ?R?R|?R4?R?RҤ?R\?R?R?R?R9?R?R?R]?R?R?R?R7?S?S?S X?S?S?Sy?S.?S?S ?S$M?S(?S+?S/j?S3?S6?S:?S>:?SA?SE?SIU?SM?SP?STn?SX!?S[?S_?Sc8?Sf?Sj?SnO?Sr?Su?Syd?S}?S?Sx?S)?S?S?S;?S?S?SL?S?S?S\?S ?S?Sj?S?S?Sw?S&?S?Sʄ?S2?S?SՎ?S?T?TΈ?T,?T?Tu?T?T?T`?T?T?TK?T?T?T4?T?Uz?U?U?U a?U?U?UG?U?U?U",?U%?U)n?U-?U0?U4Q?U7?U;?U?2?UB?UFs?UJ?UM?UQR?UT?UX?U\0?U_?Ucn?Ug ?Uj?UnJ?Uq?Uu?Uy%?U|?U`?U?U?U9?U?Us?U?U?UJ?U?U?U?U?UW?U?U?U*?U?Ua?U?Uȗ?U2?U?Ug?U?Uڜ?U6?U?Uj?U?U?U7?U?Ui?U?U?V4?V?V e?V ?V?V.?V?V]?V?V"?V&#?V)?V-R?V0?V4?V8?V;?V?C?VB?VFp?VJ?VM?VQ1?VT?VX\?V[?V_?Vc?Vf?VjE?Vm?Vqm?Vu?Vx?V|*?V?VR?V?Vy?V ?V?V2?V?VX?V?V}?V?V?V3?V?VW?V?Vz?V ?VÜ?V-?Vʾ?VO?V?Vp?V?Vܐ?V!?V?V@?V?V`?V?V~?V ?V?W*?W?WH?W ?Wd?W?W?W?W?W )?W#?W'D?W*?W.^?W1?W5w?W9?W?XA?XE?XH?XL!?XO?XS$?XV?XZ'?X]?Xa'?Xd?Xh(?Xk?Xo)?Xr?Xv(?Xy?X}'?X?X&?X?X%?X?X!?X?X?X?X?X?X?X?X?X?X ?X?X?X?X?X|?X?Xu?X?Xm?X?Xd?X?X[?X?XR?X?XH?X?X=?X?X2?Y?Y&?Y?Y ?Y?Y ?Y?Y?Yx?Y ?Y$h?Y'?Y+Z?Y.?Y2J?Y5?Y9:?Y?[A?[EF?[H?[L ?[Ok?[R?[V.?[Y?[\?[`Q?[c?[g?[jr?[m?[q3?[t?[w?[{R?[~?[?[p?[?[.?[?[?[J?[?[?[e?[?[ ?[~?[?[9?[?[?[P?[?[ ?[f?[?[?[{?[?[2?[َ?[?[E?[?[?[V?[?[ ?[e?[?[?[t?\?\'?\?\ ?\4?\?\?\@?\?\?\#I?\&?\)?\-R?\0?\4?\7X?\:?\>?\A_?\D?\H ?\Kc?\N?\R?\Uf?\X?\\?\_i?\b?\f?\ii?\l?\p?\si?\v?\z?\}f?\?\?\c?\?\ ?\_?\?\?\Y?\?\?\R?\?\?\I?\?\?\@?\?\?\4?\Ɔ?\?\(?\y?\?\?\k?\ݻ?\ ?\\?\?\?\K?\?\?\9?\?\?]&?]u?]?] ?]_?]?]?]I?]?]?]#1?]&~?])?]-?]0f?]3?]6?]:J?]=?]@?]D/?]G{?]J?]N?]Q\?]T?]W?][>?]^?]a?]e?]hg?]k?]n?]rF?]u?]x?]|#?]l?]?]?]F?]?]?] ?]i?]?]?]@?]?]?]?]^?]?]?]2?]y?]?]?]M?]ǒ?]?]?]d?]ԩ?]?]4?]x?]?]?]G?]?]?]?]X?]?]?]#?^g?^?^?^ 0?^r?^?^?^;?^}?^?^#?^&B?^)?^,?^0?^3I?^6?^9?^= ?^@L?^C?^F?^J ?^MN?^P?^S?^W ?^ZL?^]?^`?^d ?^gI?^j?^m?^q?^tC?^w?^z?^}?^5?`A^?`D?`G?`J?`N?`Q*?`TS?`W{?`Z?`]?``?`d?`gB?`ji?`m?`p?`s?`w?`z-?`}R?`y?`?`?`?`?`7?`[?`?`?`?`?`?`:?`]?`?`?`?`?`?`5?`X?`{?`ş?`?`?`?`*?`L?`n?`ې?`޲?`?`?`?`9?`Y?`z?`?`?`?`?a?a=?a]?a }?a ?a?a?a?a?a9?a X?a#w?a&?a)?a,?a/?a3?a6,?a9I?a?d 8?d#1?d&+?d)$?d,?d/?d2 ?d5?d7?d:?d=?d@?dC?dF?dI?dL?dO?dR?dU?dX?d[?d^?da?ddw?dgm?djb?dmW?dpM?dsB?dv7?dy,?d|!?d?d ?d?d?d?d?d?d?d?d?d?d?d?dt?df?dY?dJ?d?gAx?gDG?gG?gI?gL?gO?gRS?gU"?gW?gZ?g]?g`Z?gc(?ge?gh?gk?gn^?gq+?gs?gv?gy?g|_?g*?g?g?g?gZ?g&?g?g?g?gS?g?g?g?g~?gH?g?g?g?go?g8?g?g?g?g\?g%?g?gǶ?g?gG?g?g?g՞?ge?g-?g?g?g?gH?g?g?g?gb?g(?g?g?gy?g>?h?h?h?h R?h ?h?h?hd?h(?h?h?h s?h#6?h%?h(?h+?h.C?h1?h3?h6?h9L?h<?h>?hA?hDS?hG?hI?hL?hOX?hR?hT?hW?hZZ?h]?h_?hb?heZ?hh?hj?hm?hpW?hs?hu?hx?h{R?h~?h?h?hJ?h?h?h?hA?h?h?hx?h4?h?h?hj?h&?h?h?hY?h?h?h?hF?h?h?hv?h0?h?hʥ?h_?h?h?hՋ?hE?h?hݷ?hp?h)?h?h?hR?h ?h?hz?h2?h?h?hW?i?i?i|?i 3?i ?i?iU?i ?i?iw?i-?i?i!?i$L?i'?i)?i,k?i/?i1?i4?i7;?i9?i?oA.?oC?oE?oH,?oJ?oL?oO(?oQ|?oS?oV#?oXv?oZ?o]?o_o?oa?od?ofg?oh?ok ?om]?oo?or?otR?ov?ox?o{E?o}?o?o8?o?o?o(?ox?o?o?og?o?o?oT?o?o?o@?o?o?o*?ox?o?o?o`?o?o?oH?o?o?o-?oz?o?o?o^?oɩ?o?o@?oЋ?o?o!?ol?oٷ?o?oK?o?o?o)?or?o?o?oN?o?o?o(?oq?o?o?oI?p?p?p!?ph?p ?p ?p=?p?p?p?pW?p?p?p)?p o?p"?p$?p'??p)?p+?p. ?p0R?p2?p4?p7?p9c?p;?p=?p@-?pBq?pD?pF?pI:?pK}?pM?pP?pRC?pT?pV?pY ?p[K?p]?p_?pb?pdO?pf?ph?pk?pmQ?po?pq?pt?pvQ?px?pz?p}?pN?p?p?p ?pI?p?p?p?pA?p?p?p?p7?pt?p?p?p)?pf?p?p?p?pV?p?p?p?pC?p~?p?p?p.?ph?pĢ?p?p?pP?p͉?p?p?p5?pn?pا?p?p?pP?p?p?p?p0?pg?p?p?p ?pC?pz?p?p?p?pS?q?q?q?q*?q _?q ?q ?q?q2?qg?q?q?q?q7?qk?q!?q#?q&?q(8?q*k?q,?q.?q1?q35?q5g?q7?q9?q;?q>.?q@_?qB?qD?qF?qI#?qKT?qM?qO?qQ?qT?qVD?qXs?qZ?q\?q_?qa0?qc_?qe?qg?qi?ql?qnF?qpt?qr?qt?qv?qy*?q{W?q}?q?q?q ?q6?qb?q?q?q?q?q?r@?rB?rE?rG;?rIY?rKw?rM?rO?rQ?rS?rV?rX%?rZB?r\^?r^{?r`?rb?rd?rf?ri?rk!?rm?s@?sB?sD?sF?sH?sJ?sM?sO?sQ?sS!?sU+?sW4?sY=?s[F?s]O?s_W?sa_?scg?seo?sgw?si?sk?sm?so?sq?ss?su?sw?sy?s{?s}?s?s?s?s?s?s?s?s?s?s?s?s?s?s?s ?s?s?s?s?s?s?s!?s#?s&?s(?s*?s,?s-?s/?s0?s1?s2?s3?s4?s5?s4?s5?s5?s5?s5?s4?s4?s2?s2?s1?s/?s.?s-?s+?s)?s'?s%?s"?s ?s?s?s?s?s?s ?s ?s?s?s?s?t?t?t?t?t ?t ?t ?t?t?t?t?t?t?t?t?t?t!?t#?t%?t'?t)z?t+s?t-k?t/c?t1[?t3R?t5J?t7A?t98?t;/?t=&?t??tA?tC ?tD?tF?tH?tJ?tL?tN?tP?tR?tT?tV?tX?tZ?t\|?t^p?t`d?tbW?tdK?tf??th2?tj%?tl?tn ?to?tq?ts?tu?tw?ty?t{?t}?t?t}?tn?t_?tP?tA?t0?t!?t?t?t?t?t?t?t?t?t?tz?ti?tW?tE?t3?t ?t?t?t?t?t?t?t?t?tv?tb?tN?t:?t%?t?t?t?t?t̾?tΨ?tГ?t}?tg?tR?t?t&?t?t?t?t?t?t?tz?ta?uG?u.?u?u?u?u ?u ?u ?uv?u[?u@?u%?u ?u?u?u?u?u ?u"b?u$E?u&)?u( ?u)?u+?u-?u/?u1y?u3\?u5>?u7 ?u9?u:?u?u@?uBh?uDI?uF)?uH ?uI?uK?uM?uO?uQj?uSI?uU)?uW?uX?uZ?u\?u^?u`a?ub@?ud?ue?ug?ui?uk?umq?uoO?uq,?us?ut?uv?ux?uzz?u|V?u~2?u ?u?u?u?uz?uU?u0?u ?u?u?u?ur?uL?u&?u?u?u?u?uc?u?v?v?v?vA?v?v?v?vB?v?v?v?v@?v?v?v}?v;?v?vǸ?vv?v4?v?vί?vl?v*?v?vդ?va?v?v?vܗ?vR?v?v?v?vB?v?v?vs?v.?v?v?v^?v?v?v?vF?v?v?vr?v+?w?w?wV?w?w?w ?w 7?w ?w?w]?w?w?w?w:?w?w?w]?w?w?w!?w#5?w$?w&?w(U?w* ?w+?w-t?w/)?w0?w2?w4E?w5?w7?w9a?w;?w{?w@-?wA?wC?wEE?wF?wH?wJ\?wL ?wM?wOq?wQ"?wR?wT?wV5?wW?wY?w[F?w\?w^?w`W?wb?wc?wee?wg?wh?wjr?wl!?wm?wo~?wq,?wr?wt?wv6?ww?wy?w{??w|?w~?wE?w?w?wK?w?w?wO?w?w?wQ?w?w?wR?w?w?wR?w?w?wP?w?w?wL?w?w?wH?w?w?wA?w?w?w:?w?w?w1?w?w?w&?w?ws?w?w?wf?w ?wDz?wW?w?w̢?wH?w?wё?w6?w?w?w#?w?wk?w?w޲?wU?w?w?w??w?w?w&?w?wk?w ?w?wP?w?w?w4?w?wu?w?w?wW?x?x?x7?x?xv?x ?x ?x S?x ?x?x/?x?xl?x ?x?xE?x?x?x?x?x!W?x"?x$?x&-?x'?x)e?x+?x,?x.8?x/?x1o?x3 ?x4?x6@?x7?x9u?x;?xC?x??xAw?xC?xD?xFB?xG?xIt?xK ?xL?xN>?xO?xQn?xS?xT?xV5?xW?xYd?xZ?x\?x^(?x_?xaU?xb?xd?xf?xg?xiB?xj?xlm?xn?xo?xq,?xr?xtT?xu?xw}?xy?xz?x|8?x}?x_?x?x?x?x?x=?x?xa?x?x?x?x?x:?x?x[?x?x}?x?x?x.?x?xN?x?xm?x?x?x?x?x8?x?xU?x?xr?x?x?x?x?x5?x?xP?x?xi?x?x?x?xŚ?x%?xȱ?x=?x?xS?x?xi?x?x~?x?x֒?x?x٦?x0?xܹ?xB?x?xU?x?xf?x?xw?x?x?x?x?x?x?x-?x?x;?x?xH?x?xU?x?xa?x?yl?y?yw?y?y?y ?y ?y ?y ?y?y?y?y?y&?y?y,?y?y2?y?y7?y?y!?yF?yH:?yI?yK5?yL?yN0?yO?yQ*?yR?yT#?yU?yW?yX?yZ?y[?y] ?y^?y`?ya~?yb?yds?ye?ygh?yh?yj]?yk?ymQ?yn?ypD?yq?ys6?yt?yv(?yw?yy?yz?y| ?y}?y~?yq?y?y`?y?yN?y?y?{t?{?{?{?{M?{?{?{?{"?{W?{?{?{?{*?{^?{?{?{?{-?{a?{?{?{?{,?{_?{?{?{?{(?{Y?{?{?{?{?{P?{?{?{?{?{A?{q?{š?{?{?{/?{^?{ˍ?{̼?{?{?{G?{u?{ң?{?{?{,?{Y?{؇?{ٳ?{?{ ?{9?{e?{ߒ?{?{?{?{@?{l?{?{?{?{?{A?{l?{?{?{?{?{=?{f?{?{?{?{ ?{2?{[?{?{?{?{?|"?|I?|p?|?|?|?| ?|1?| X?| ~?| ?| ?| ?|?|9?|^?|?|?|?|?|?|9?|]?|?|?|?|?| ?| 0?|!S?|"u?|#?|$?|%?|&?|(?|)A?|*b?|+?|,?|-?|.?|0?|1'?|2G?|3h?|4?|5?|6?|7?|9?|:$?|;C?|?|??|@?|A?|C?|D4?|ER?|Fo?|G?|H?|I?|J?|K?|M?|N7?|OS?|Po?|Q?|R?|S?|T?|U?|W?|X,?|YG?|Za?|[{?|\?|]?|^?|_?|`?|b?|c-?|dF?|e^?|fw?|g?|h?|i?|j?|k?|m?|n?|o5?|pL?|qb?|ry?|s?|t?|u?|v?|w?|x?|z?|{(?||=?|}R?|~g?||?|?|?|?|?|?|?|?|?|.?|A?|T?|f?|y?|?|?|?|?|?|?|?|?|?|)?|9?|J?|Z?|j?|z?|?|?|?|?|?|?|?|?|?|?| ?|-?|;?|I?|V?|d?|q?|~?|?|?|?|?|?|?|?|?|?|?|?| ?|?|#?|-?|8?|B?|L?|V?|`?|i?|s?||?|Ʌ?|ʎ?|˗?|̟?|ͨ?|ΰ?|ϸ?|?|?|?|?|?|?|?|?|?|?|?| ?|?|?|?|"?|'?|,?|1?|6?|;?|??|C?|G?|K?|O?|S?|V?|Y?|\?|_?|b?|e?|g?|i?|k?|m?|o?|q?|r?|s?|u?|u?|v?|w?|w?|w?}x?}x?}w?}w?}v?}v?}u?}t?}r?} q?} o?} n?} l?} j?}h?}e?}b?}`?}]?}Z?}W?}S?}P?}L?}H?}D?}@?}/?}?%?}@?}A?}B?}B?}C?}D?}E?}F?}G?}H?}I?}J?}K?}L?}Ms?}Nf?}OY?}PK?}Q>?}R0?}S"?}T?}U?}U?}V?}W?}X?}Y?}Z?}[?}\?}]}?}^m?}_]?}`L?}a?}?}?~?~?~T?~%?~?~?~?~f?~6?~?~?~ ?~ t?~ C?~ ?~ ?~ ?~~?~L?~?~?~?~?~Q?~?~?~?~?~R?~?~?~?~?~N?~?~?~?~{?~F?~ ?~ ?~!?~"p?~#:?~$?~$?~%?~&a?~'*?~'?~(?~)?~*N?~+?~+?~,?~-n?~.6?~.?~/?~0?~1S?~2?~2?~3?~4n?~54?~5?~6?~7?~8L?~9?~9?~:?~;`?~<%?~s?~?6?~??~@?~A?~BE?~C ?~C?~D?~EQ?~F?~F?~G?~H[?~I?~I?~J?~Ka?~L#?~L?~M?~Ne?~O&?~O?~P?~Qg?~R'?~R?~S?~Tf?~U%?~U?~V?~Wa?~X ?~X?~Y?~Z[?~[?~[?~\?~]R?~^?~^?~_?~`E?~a?~a?~b{?~c7?~c?~d?~ej?~f&?~f?~g?~hW?~i?~i?~j?~kA?~k?~l?~mo?~n(?~n?~o?~pT?~q ?~q?~r~?~s7?~s?~t?~u_?~v?~v?~w?~x=?~x?~y?~zb?~{?~{?~|?~};?~}?~~?~\?~?~?~|?~1?~?~?~O?~?~?~k?~?~?~?~9?~?~?~R?~?~?~i?~?~?~?~0?~?~?~D?~?~?~V?~?~?~g?~?~?~v?~&?~?~?~3?~?~?~??~?~?~I?~?~?~R?~?~?~Y?~?~?~_?~ ?~?~c?~?~?~f?~?~?~g?~?~?~g?~?~?~e?~?~?~a?~ ?~?~]?~?~?~V?~?~?~O?~?~?~E?~?~?~;?~?~?~.?~?~z?~ ?~?~l?~?~?~\?~?~å?~J?~?~Œ?~6?~?~~?~!?~?~h?~ ?~ʮ?~Q?~?~̖?~8?~?~|?~?~Ͽ?~a?~?~ѣ?~D?~?~Ӆ?~&?~?~f?~?~֥?~E?~?~؄?~#?~?~`?~?~۝?~;?~?~w?~?~޳?~P?~?~?~'?~?~`?~?~?~5?~?~m?~?~?~??~?~u?~?~?~D?~?~y?~?~?~F?~?~x?~?~?~C?~?~t?~ ?~?~V?>??X???@X?@?AY?A?BX?B?CW?C?DU?D?ER?E?FO?F?GK?G?HF?H?IA?I?J;?J?K5?K?L-?L?M%?M?N?N?O?O?P ?P?P?Qy?Q?Rn?R?Sb?S?TU?T?UG?U?V9?V?W*?W?X?X?Y ?Y?Y?Zp?Z?[^?[?\K?\?]8?]?^$?^?_?_?_?`o?`?aY?a?bB?b?c*?c?d?d?d?el?e?fR?f?g8?g?h?h?i?ir?i?jU?j?k7?k?l?l?l?mj?m?nJ?n?o)?o?p?pw?p?qU?q?r1?r?s?s|?s?tW?t?u2?u?v ?vx?v?wQ?w?x)?x?y?ym?y?zC?z?{?{?{?|Y?|?}-?}?~?~j?~?=???w??H?????O?????S?????Q?????L???z??C?? ?n??5???^??#???J?? ?o??1???T???u??5???S???p??-???H???a???x??1???F???Z???l??!?|??1???????K???V???_???g???n???r???v??"?x??#?x??"?w?? ?t???p???j???c???Z???P???D???7???(?x???g???U???A???,?z???b???J???/?|???_???A???"?l???K???(?r???M?•??&?n?÷??F?Ď???c?Ū??7?~?? ?P?Ǖ?? ?e?Ȫ??4?x?ɽ??E?ʉ???S?˖???_?̢??&?h?ͪ??-?n?ί??1?r?ϲ??3?s?г??2?q?Ѱ??.?m?ҫ??(?f?ӣ???\?ԙ???O?Ռ???@?|?ָ??.?i?פ???T?؏???0 3>0H0"N@@*PW  coshcosh: input value was NAN cosh: input value was INF L L.LRL\LhLrL.text.data@.bss_errno_write_matherr_s_cosh_r_cosh_R_coshUNDERFLOWcontgreaterr_exp.o/ 568277830 98 100 100664 9330 ` u!;F#t .textX"l .dataXX@.bss!!P?6,Dz% 1p2)#$43$2%#WPBPv' ?G0e+50`9F4 P?1r7%`bDz% 1p2)#$43$2%#@ .Dz% 1p2)#8$438$2%#jPBPV' ?G0e+50`9F4 P?1r7%`bDz% 1p2)#8$438$2%#@*AN8 X.44>0H0"N@@(PWv \\ F@*AN8 X.43>0H0"N@@*PWv ʋ\ expexp: input value was NAN exp: input value was INF ?? ?A?bt?V?@?3?.?2?(>?IS?jp????:??1?S*?t??g??f??=?_$??x?/???)?Kb?mE?0?$? ?%?3?9J?[i?}???>??(?K9?m? ??????b:??'?̪?7??7l?[?~??D?? ?1?U?y???? ?-?R ?v>?y?? ?c?+?P.?t???3??+n?P?t??T?%??,?Q?v???? ?0(?UX?z??!?w??5??Z?.??D???<,?a??k?>???D?j????4?)^?O?u??k??+?5?\??#?Ϻ?[??C?jx?@????,?S?z??? ?5?>k?e??I?ۨ??*?Q?y??ȱ?V????g?O?'? ??.?V?~? ?-?W??G?p?e??*??:?b?0??q?"?-?V?q?K?0??#?L?u+?D?g???C?l_?????;?e??K?? ?5s?_@?????0?Z? ?.?\??-?X'???T??,S?V?}?#???,U?W'?????-?X??=?r??0?\Q???ޕ? ?5?a=???I??;?g?????C?o??,?m? ?M?yu??]??+s?X??j?(? ?7?d?????E?r??N??'?UJ??-?ݰ? >?8?f~?0????Kk?yW?O?S?b?1}?_???`??G?u??҇??/?^a?????He?wW?T?^?t?3?b??C???O^?~?W?? ?=)?l??h?@?,$?\???1?R?L?|??U? ?>!?n??ϯ?M?0?a?q?A??%?U?? ?%?L?K?|??h??BA?s?M???:??k??ϣ??3{?ez?×?ɞ??-?`6?Ē??A?)?\3?Ŏ?Y??&?Yt?ƌB?ƿ??$?W?Nj ?Ǿ%?M?$?W?ȋ?Ⱦt??%V?X?Ɍm? ??'s?[:?ʏ???*?^?˒??P?/?c?̘5?̜??5?j"?͞?i?!??v?ٮP???U?ڍ?Ť??5?m?ۦ?_??O?܇|?ܿ??1?i?ݢx??y?F??'?bi??v??L?z?D??8?r???$?ڞ? ?U??и?f?L#????C???????,?k?/?]?(?g?F??&3?e?a??$?d??r?$s?d???%?eo??G?&?ga???)?j[?D?@ 9@ ]@ t@ @ p@ @ @ 2.@ U@ y@ >@ @ @ @ ,~@ Pe@ tU@ O@ Q@ ]@ r@ (@ L@ p@ #@ g@ ݳ@ @&i@J@oC@@C@@h@& @J@og@#@@ݹ@@'u@La@qW@V@^@p@@*@O@u@X@@@ V@/@U/@z@.@ż@T@@6@\U@@@ͬ@@m@?[@eT@V@b@w@@#@I@p/@v@@ @ @/@Vj@|@v@ @@S@>@d@@Z@5@@'@N@u@@&@F@q@8@_@,@@@B@$@L.@s@C@@@-@9@a@s@I@*@@) @Q @y@&@D@m@@A@j#@u@@7@ @4"@\@7@@u@$@'@P@yo@G@*@@ @ F@ o@ 7@ Y@ @!@!<@!fJ@!@!@!n@" @"5f@"^@"@")@"@#@#/M@#Y@#@#@#ּ@$@$*@$T@$~@$@$&@$]@%'@%Q@%|D@%@%@%@&&@&P@&{7@&@&Њ@&D@'& @'P@'{@'@'ъ@'@('@(R@(}@(@(@(S@)*@)U@)O@)@)/@*@*/;@*Z@*s@*!@*@+ @+5k@+aE@+*@+@+@,@,=0@,iM@,v@,@,@-4@-F@-r@-Y@-@-T@.$???}?;?~a?~#?~w?~6?}?}?}s?}3?|E?|?|p?|0L?{?{N?{n?{.?zM?z?zm?z-?y?y?yn?y.4?xr?x?xo?x/?w ?w?wq;?w1?v?v{?vt[?v5K?uL?u]?ux}?u9?t?t@?t}?t??t?s$?s?sEw?s7?r?r?rL?r?q?q ?qU;?q{?p?p*?p^?p!?o?oF?oh?o+?n?n]?ntI?n7F?mR?mn?m?mC?m?lx?l?lQZ?l?k{?k"?k_?k#?ju?jZ?joN?j3R?ie?i?i?iC?iK?h̪?h?hU?h$?g?gm?gh(?g,?f?f?f{?f@?f?e?e ?eUc?e?d?d?dk?d0?c/?c?c?cG_?c 8?b?b?b_?b%.?aQ?a?aw?a>?ap?`?`X?`W?`{?_"?_?_r?_9q?_S?^D?^C?^UQ?^m?]?]?]r?]9p?]?\I?\?\W\?\?[?[d?[v.?[>?[?Z?Z?Z]?Z&?YG?Y?Y~?YG(?Y?X?X?Xi?X1?Wk?W(?W?WT?W?V?V?Vx?VA?V ?UE?U?Uf?U0K?T?T@?T?TVm?T ?S?S?S}m?SGP?S@?R??RK?Roe?R9?R?Q?QW?Qb?Q-"?P?P$?P?PW]?P"?O?O?Os?OMZ?OO?NR?Nb?Ny?ND?N?M*?M~?Mq?M=N?M?LT?L?Lk?L7A?L?K?K?Kf?K2?J?Jʔ?J?Jb?J/?IU?Iǧ?I?I`r?I,?Hq?H?H?H_S?H,?G?Gū?G?G_}?G,y?F?Fƙ?F?F`?F.+?Ev?E?E2?Ec?E1!?D?DE?D?Dg?D5[?D'?C?C?Cl?C:?C?B?B?BsR?BA?B?A4?A?A{ ?AI?A?@?@Q?@?@R?@!??`??D??3??]0??,9?>O?>q?>?>h?>8"?>v?=?=C?=u?=EB?=?b?/?.?.?.J?.^?.2?.q?-?-n?-?-S?-'@?,?,ί?,x?,vL?,J+?,?+ ?+ ?+?+n0?+BR?+?*?*?*N?*g?*<?*?)?)?)?)b?)7\?) ?(?(?(m?(_M?(48?( /?'0?'O?7?(?!?$?.?rB?P^?.? ??&?n??d?By? ?U??T??yv?X?6?h????w?oP?N2?-? ? ? ??-?gJ?Fo?%?>">>EN>>¼>>@n>_>b>}u><>>>zg>9>C>>xa>8 >>>wc>7M>G>R>wl>7>>>x{>8>d>>z>;;>>>}>>>>>>B>*>y>>HF> >T>>N>`>.> >U>>>%>^S> >>;>g>*%>>M>q>4>>[>}F>@@>J>c>퉌>L> >d>>ZB>>^>>h>,{>O>1>x#><%>6>V>鈆>L>>p>>^X>">~>'>p>5>>e>Z>I_>r>ӕ>>^>#W>>#>s>9,>>p>(>O>>۫>⡟>g>->>>B>F> >U>>`V>&>>ߴF>{ >A>>ϩ>ޖ>]>$>>ݳ,>zr>A> )>Л>ܘ>_>'F>>۶>~s>FI>.>!>ڞ#>f3>.Q>}>پ>ه>OX>>1>ب>qC>9>>I>ה>\>%>>ַ>ր>I>>S>ե>n>8T>>D>Ԕ>^m>(>>ӻ>Ӆe>OF>4>1>ҭ;>wS>Ay> >>Ѡ=>j>5>|>>Д>_7>)>>Ͽm>ϊE>U*> >>ζ,>΁H>Lq>>>ͮ>>y>E >> >̧>sC>>> >{>ˢS>n8>:+>+>8>ʞR>jz>6>>A>ɛ>h>4>>͕>Ț4>f>3>_>2>ǚ>g>3>>>ƛ8>hg>5>>A>ŝ>k>8>>ӯ>ġR>o><> >`>æC>t4>B1>;>R>¬u>z>H>,>>>U>P>[>>>C>Y>(>>}>k>df>3m>>ѡ>>p>?M>>>i>|>Ld>>>:>>Z>*,"l6"l"l"l"l"l"l&"lP"ll "lz"l"l"l"l"l"l "l "l."l8"lD"lN"l.textX.dataX.bss!_errno_write_s_exp_r_exp_R_exp_matherrUNDERFLOWr_lg10.o/ 568277837 98 100 100664 1154 ` u!;M\.text .datahL@.bss((?Fx     ?  ?  ?# 0?$& %"0?M$2@?^&C%$% @?1r)%@##@]&WWd8 .41>0H0&  !PW8 .42>0H0Ǝ !. PW VPWlog10log10: SING error log10: DOMAIN error log10: input value was NAN log10: input value was INF <HR\t~.text.datah.bss(_errno_write_matherr_s_log10_r_lg10_R_lg10_r_alg10_R_alg10UNDERFLOWr_log.o/ 568277844 98 100 100664 1154 ` u!;T .text .data`|@.bssPP? Wpx 0  0?  ? 0; )@?1r%P?#P0?$& %"42%3@@/#4P?M#R%5%#% 0#@>%$#W0?M$2@?^&C%$% 0##Wd8 .41>0H0  !PW8 .42>0H0 !.2 XPW *PWloglog: SING error log: DOMAIN error log: input value was NAN log: input value was INF (Jht~.text.data`.bssP_errno_write_matherr_s_log_r_log_R_logUNDERFLOWr_sin.o/ 568277852 98 100 100664 1408 ` u!;\P.text .dataP4@.bss?"94[.(#pQ   I[^?I/?7.~ $!?"%0 0P5!@T)U$P`p p7U΀LtvX%vP%r#x#Wp#uހ?!wG)w$p#p$#Pހ8d%!d d6#1%###?%~P  ! $ F@% 2p2)"$#43$2%# R " $^" P WP"W@9QB@A?$O!d'"@@ !PTD-6$09A4$7"1  ?#!@I%!lF@% 2r2)"$#43$2%#A^@*BN8 .45>0H0Ȏ, "N@@&PW ~ hsinsin: TLOSS error sin: input value was NAN sin: input value was INF B D J L      :FPZz.text.dataP.bss_errno_write_matherr_s_sin(_r_sin,_R_sin0SinTableCosTableUNDERFLOWpi_reducer_sinh.o/ 568277858 98 100 100664 946 ` u!;b .textT .data@@.bss  ?@!,!%"09SL[%2@<#4%2@>*#4%#%!# F@ !1$2@?%$!BT)U$%P?%5P9%##!%"0=lVe%2P@#5%0A##$!&.$(PTQ0?#1 ?�`S%$ ?# `B  W@*AN8 .44>0 3>0H0؎"N@@*PW  sinhsinh: input value was NAN sinh: input value was INF T*T8T\TfTrT|T.text.data@.bss_errno_write_matherr_s_sinh_r_sinh_R_sinhUNDERFLOWcontgreaterr_sqrt.o/ 568277900 98 100 100664 42028 ` u!; .text .datah@.bss@8ѷ@@?,F@% 1r2)#$43$2%#WP PT0 50DSqQ  ?F@% 1r2)#$43$2%#UqQ  >|@ ?qp &!#  &!#  aBD$U BqApJpM ?% ?5%W1>0P^48H0  !PWsqrtsqrt: DOMAIN error <# =gj=kL=n=rR=u=y&c=|~=ˍ=="==K=U=bO==g`==\)==A===$===B===OS=-=4=Bz== =s=a\====Y=K=P=0=,=\=^====-=Q=tL====x=T==5;=JT=]=o=ŀ=Ə=ǝF=ȩ=ɴa=ʽ===K=~=l==ۉ===՛=F==+=ؽm=ٴ=ڪ=۟=ܓ=݆k=xA=i=X=G=5="Z=>=.=/=B=j=蛬==g=L=/====V==t=R=/= ====u=N=&c====~=R=&n=T=ˍ>N>>>>X>U|>N>">>>Tx>>>e>>K>>+>vd>U>;>_> z> bO> > %)> /> > Gp> > > g`> > &> > >B5>o>k>\)>>>s>>-T>>>A>O>>S>> >dF>>>r>\>%>$>9>1>>=>:>>r>B>>>G>>>L>p>>N>R>>OS>>>N{>->>L >5>4> H> > *>!Bz>!>!>";l>">">#2># ># >$(>$z>$>%s>%n>%>&>&a\>&>'d>'R>'>'>(B>(Y>(>)1L>)>)Ϫ>*>*mu>*$>+ >+Y>+X>+w>,Cr>,K>,>-,>-z>-P>.{>.a>.k>.0>/G>/U>/>0,>0y>0>1>1\>1I>1>2?">2^>2{>3 y>3kW>3>4>4K7>4>4>5*>5t >5>6>6Qj>6>6j>7->7v>7>8 >8Q>8>8U>9+>9tL>9>:>:L>:>:>;$>;l;>;>;>><><>=>=^>=>=x>>3>>y>>>?T>?L>?>?ت>@>@dc>@>@>A5;>Az>A>B3>BJT>B\>BL>C$>C]>C>C>D+>Do>D8>Dh>E<>E>Ej>F=>FK>F>F(>G>GY>GF>Gx>H#>Hf>H>H^>I/ >Iq>Ia>I>J9K>J{>J>K>KB>K>K>L>LI>L9>L>ML>MO>M >MK>Nv>NT>N>N~>OX>OX>O>Ol>P>PZj>P>P>QR>Q[x>Q>Qۉ>Rt>R[K>R>R>S_>SY>Sa>S>T>TWV>T>T՛>U>US>Uw>UF>V>VN>VE>V>W =>WH>W>W+>XV>XAp>Xw>Xm>XQ>Y9$>Yv>Y>Y2>Z/>Zm:>Z>Z>[%D>[bz>[>[ܴ>\>\V>\>\]>] >]I>]k>]>]w>^;>^xA>^>^>_,>_i>_>_>`>`X>`>`f>a >aG>a:>a>a#>b5>bp>b >b;>c"Z>c]j>cj>c\>d>>dI>d>d>d.>e3>enL>e>e/>f>fW>f>fB>gb>g@s>gzv>gj>gP>h((>ha>h>hX>i>iH>i>i{>i>j.8>jg>j>j>k >kL>k>k>k>l/>lh>ld>l>m>mKP>m>mU>m>n-$>new>n>n>o">oFA>o~R>oV>oM>p&8>p^>p>pͨ>q_>q=>qt>q5>q>r.>rR>r>rE>r>s/>sf>s >s>t >tC>tz>t>t>u>uU=>u>u>u&>v/>vf0>v>v >w d>w?>wu>w->wX>xw>xN>x>x>x>y&c>y\<>y >y>y>z3,>zh>z_>z>{ d>{>>{t<>{>{>|*>|Ic>|~>|>|>}>}R>}>}>}>~&n>~[8>~>~ī>~T>->b>>ˍ>>4>4c>N>h>>>> >>>>9>S >l>>>>ԃ>X>)>!>;>U|>o8>>>N>>> 7>">U>o}>>>>s>>Q>!>;>Tx>m>%>u>>>E>>>7>Q>jA>e>>>ε>>>>2>K>d>}>>>Ȑ>s>Q>+>,>D>]>vd>'>>>U>> >#Z>;>T>m7>>_>>u>>z>>1m>I>bO>z>>>>7>> >%)>=q>U>m>/>f>>>>>9>/W>Gp>_>w>>>>ײ>>>>7>Ox>g`>D>$>>>ޫ>{>G>&>=>U>mN>>>i>>>a>>*>B5>Y>qZ>>o>>u>>k>>-R>D>\)>s>>O>>>T>>>.6>Ez>\>s>/>d>>>>>5>-T>Do>[>r>>>>>>>>*>A>X>o>j>O>0>>>>>&`>=,>S>j>z>8>>ũ>\> > > a>7>M>dF>z>y> >>+>>;>>/>>E>\3>r>>>>\>>">>%><2>R>h>$>o>>>9>v>>>1>GI>]u>s>>>>$>=>S>f>$u>:>P>f>|>>>>>r>b>O>,9>B>X>m>>>p>D>>>>t>29>G>]>ss>+>>>A>>> <> >6~>L>a>wL>>p>>͉>>>>#>9>N>d>yu>>R>>$>>>I>$>9>OS>d>y>D>>>>\>>>$>9G>N{>c>x>>->R>u>>> >!>6>L >a>v$>.>5>8>:>8>4> ->#>3>H>\>q>>>>q>O>*>>>->Bz>WH>l>>>c>#>>>S> >&>;l>P>d>yl>>>U>>>'> >P>2>Go>[>p> >>>Ž> >>>o>(>=Q>Q>f(>z>>X>>>q>> >s>1>F>Z_>n>>5>w>>>/>g>>$>9>M0>a\>u>>>>>1>L>d>{>*>>>R>f>z>>>>>>>>>.>B>V>j>~p>Y>@>$>>>> >v>1L>E >X>l>>X> >>Ϫ>k>+> >>2Z>F>Y>mu>$>>{>$>>m>> >K>1>E>Y>l>;>>X>>l>>w>>y>/>Cr>V>jc>}>K>>*>˖>>h>>1>,>?>SO>f>z>Y>>>P>ڞ>>3>{>'>;>NE>a>t>>4>k>>>>0>\>!>4>G>Z>n>8>U>p>>͡>>>>>,>@>S >f>y>>>>> >>>>#>6>I>\>o>>e>I>+> >>>>w>,M>?">Q>d>w>^>(>>·>{>>>> > y>33>E>X>kW>~ >>i>>>j>>>Y>%>8>K7>]>pl>>>->>O>>i>>|>*><>O >a>t >>>z>>g>>M>>+>,>?>Qj>c>v5>>>X>>>j>> >l>->@>R^>d>v>?>>>>Q>>> >F>->?>Q>d>vQ>>>>>.>U>z>>>+>=>P>b3>tL>c>x>>>έ>>>>>(>:>L>^>p>>>>>>>>>>$>6~>Hi>ZS>l;>~!>>>>ũ>ׇ>c>>> >>0>B>Th>f9>x>>>i>1>>>~>@>>)>;y>M4>^>p>Y> >>p>>>x>">>!q>3>D>V\>g>y>7>>l>>ћ>/>>T>>)s>:>L>^>o>">>*>>+>ت>&>> >>0 >A~>R>dc>u>A>>>>>R>>>|>#>5;>F>W>iN>z>>S>>>J>>>3>}>'>9>JT>[>l>~>\> >±>>L>>>>$>*V>;>L>]>o>À:>Ñc>â>ó>>>>:> X>u>+><>M>^>o>ā>Ē>ģ(>Ĵ8>F>S>^>h> p>w>+|><>M>^>o>ŀ>ő~>Ţy>ųr>j>a>V>J>=>.>*>; >K>\>m>~>Ə>Ơ>Ʊe>G>(>>>>>'x>8Q>I(>Y>j>{>njv>ǝF>Ǯ>Ǿ>ϭ>x>A>>>#>4V>E>U>f>wU>Ȉ>Ș>ȩ>Ⱥ>>>۪>^>> >q>/ >?>Px>a#>q>ɂs>ɓ>ɣ>ɴa>>դ>C>>}>>(>9K>I>Zx>k >{>ʌ0>ʜ>ʭP>ʽ>i>>~>>>!>1>B>R>c>s>˄>˔>˥>˵>>v>>`>>D>(>9#>I>Y>jg>z>̋9>̛>̬>̼j>>.>>>L>>/>?]>O>` >pc>̀>͑ >͡\>ͱ>>K>>>->v>#>4>DJ>T>d>u>΅Q>Ε>Υ>ζ >D>~>>>#>X>'>7>G>X>hK>xx>ψ>Ϙ>Ϩ>Ϲ >F>l>>> >>*>:2>JN>Zj>j>z>Њ>К>Ъ>к>>>)>8> E>R>+]>;g>Kp>[x>k~>{>ы>ћ>ѫ>ѻ>ˋ>ۉ>>> {>t>+k>;b>KW>[K>k>>{0>ҋ >қ>Ҫ>Һ>>>>> y>_>*C>:&>J >Y>i>y>Ӊ>әa>ө<>ӹ>>>>q>E>>'>7>G>WV>g#>v>Ԇ>Ԗ>ԦJ>Զ>>՛>_>!>>>$a>4>C>S>cP>s >Ղ>Ւw>բ->ձ>>F>>>U>>>/Z>?>N>^T>m>}>֍E>֜>֬>ּ*>>i>>> =>>)p>9>H>X4>g>w\>׆>ז>צ>׵>+>Ը>C>>V>>"e>1>Ap>P>`v>o>w>؎>؞t>ح>ؽm>>a>>Q> >=>)>9$>H>X>gv>v>نR>ٕ>٥*>ٴ>>e>>2>>> ]>/>?>N~>]>m:>|>ڋ>ڛK>ڪ>ڹ>R>ب>>P>>>%D>4>C>S.>bz>q>ہ>ېX>۟>ۮ>۾,>q>ܴ>>8> x>>(>83>Go>V>e>u>܄U>ܓ>ܢ>ܱ>*>]>ߎ>>> >J>+w>:>I>X>h>wE>݆k>ݕ>ݤ>ݳ>>>:>Y>w>>>,>;>J>Z>i+>xA>އV>ޖi>ޥ|>޴>Þ>Ү>>>>>>,>;>K>Z >i>x>߇>ߖ>ߥ>ߴ>>>>>> >>+>:>I>X>g>v>>>ࣛ>ಋ>y>f>S>>>)> >>)>8>G>V>ev>tY>:>>>>ᾷ>͓>o>J>#>>>&>5>DU>S)>a>p>>o>>> >>ɦ>q>;>>>>"Z>1 >?>N>]j>l,>z>㉬>j>(>>ġ>\>>>>>>>+>:]>I>W>ft>u%>>䒃>0>>侉>3>>>.>>{>% >3>Bh>Q >_>nL>|>勊>(>>a>>Ԗ>/>>^>>>,>:>ID>W>ff>t>情>>栠>,>潷>B>>T>>b>>#l>1>@s>N>]w>k>zv>>r>>j>>_>>P>> >>>((>6>E>S>a>pa>~>>>蛬>>踃>>X>>)>>>[>+>:#>H>V>eH>s>>f>>>{>>0>>>8>>>.8><>J>Y0>g>u>!>o>꠼> >U>ˠ>>3>{>> >!O>/>=>L>Z]>h>v>>^>롛>>>P>ڋ>>>5>l>!>/>> >L@>Zr>h>v>>5>d>쯑>콾>>>@>i>>> >/>=+>KP>Ys>g>u>>>>7>U>q>؍>>>>> >-$>;:>IO>Wc>ew>s>>>>>>>>>>>">+>*3>8:>FA>TF>bK>pO>~R>T>V>V>V>U>T>Q>M>I> D>>>&8>40>B(>P>^>l >y>>>>>>ͨ>ۗ>>r>_>J>!5>/>=>J>X>f>t>>n>R>5>>>>>>t> R>.>) >6>D>R>`p>nH>|>>>>r>E>>>>>X>&>!>/>=>KW>Y!>f>t>|>C> >>>X>>>>`> >>'>5\>C>P>^>lL>z>>w>/>>>Q>>>m>>>>,2>9>G>U=>b>p>~B>>>?>>>6>>>&>>m>">/>=R>J>X>f0>s>k>>>=>>q> >>8>> d>>$>2 >?>ME>Z>hf>u>>>>->>D>>X>>i> >w>%>3>A>N>\>i>w>>>>>> >Ո>>>> r>>&c>3>AQ>N>\<>i>w$>> >{>>\>>:>>>> >X>%>3,>@>M>[e>h>v1>>>_>>%>Ɔ>>H>>> d>>$>1z>>>L0>Y>f>t<>>>A>>>@>ѓ>>8>>>*>!y>.><>Ic>V>c>qF>~>>#>l>>>@>ۆ>>>R>>>+>8Y>E>R>`>mT>z>> >E>>>>*>b>>> >:>&n>3>@>N>[8>hi>u>>>%>R>>ī>>>+>T>}>> >->;>H>>Ub>b>o>|>>>/>O>n>ˍ>ث>>??? ??4? ?'L?-?4c?:?Ax?H?N?U?[?b(?h?o9?u?|H??V??c??o??y????ʉ? ?׏???????? ????%?,?2?9???F?L?S ?Y?`?f}?l?ss?y?h??\??O??@??0???ǖ? ?ԃ??n??X??A??)????!?(f?.?5J?;?B+?H?O ?U|?[?b[?h?o8?u?|???\??5?? ?x??N?¹?#?ύ??_??1???i?? 7???j?"?)5?/?5?7?D?J?Q?Wc?]?c?jA?p?v?}?e???=????Y???+?p?ε?????? ?N???? X??? ?&]?,?2?9??^?E?K?R?X[?^?d?k?qR?w?}? ?E????3?n????W?Ȑ???;?s????Q??? ?+?a??%?,?25?8i?>?D?K?Q7?Wj?]?c?j?p3?vd?|???'?W?????C?q????(?U?߂????1?]?? ???1?#Z?)?/?5?;?B&?HN?Nu?T?Z?`?g?m7?s]?y?????;?_??????2?T?u?՗?۸????;?Z? z? ? ? ? ? ? %2? +P? 1m? 7? =? C? I? O? V? \4? bO? hj? n? t? z? ? ? ? ? 8? Q? i? ? ? ? ? ? ? ? !? 7? M? b? w? ? ? ? ? ? ? ? ? %)? +;? 1M? 7_? =q? C? I? O? U? [? a? g? m? t? z? ? /? =? K? X? f? s? ? ? ? ? °? ȼ? ? ? ? ? ? ? ? ? ?  ? )? 1? 9? A? #I? )P? /W? 5^? ;d? Aj? Gp? Mv? S|? Y? _? e? k? q? w? }? ? ? ? ? ? ? ? ? ? ? ? Ų? ˲? Ѳ? ײ? ݲ? ? ? ? ? ? ? ? ? ? ? ? %? +? 1? 7? =? C? I}? Ox? Ur? [l? af? g`? mY? sR? yK? D? ?}!??????o?Q?2????õ?ɕ?u?T?4??????k?I? &????!?'v?-R?3-?9 ?>?D?J?Pu?VO?\)?b?g?m?s?yh?@?????x?O?&?????V?+???ܫ??T?(????v? I????"?(d?.6?4?9???Ez?KJ?Q?V?\?b?hY?n(?s?y??a?/????d?1????a?,???֍?X?"????I??? ?m?5??!?'?-T?3?8?>?Do?J5?O?U?[?aK?g?l?r?x^?~"???m?0???y?;????B???ԅ?E????E????A? ??{?9?$?*?0q?6.?;?A?Gc?M?R?X?^R?d ?i?o?u=?z??j?$???O???x?0???W???{?1???S? ??s?(? ??E?? ?&`?,?1?7y?=,?B?H?NB?S?Y?_W?e?j?pj?v?{?z?*???8???D???N??ũ?V??֯?\???`? ??b? ? ?b? ?? a?& ?+?1]?7??4?:|?@?E?KX?P?V?\3?a?gn?m ?r?xE?}?~???R???$??Z???)??\??׏?(??Z???"??R? ???? E?%?+q?1?6?<2?A?G]?L?R?X?]?cC?h?nk?s?y?$??J??o???$??F??h??lj??ҩ?9??X??v???!?? =??Y?? s?&?+?1?6?<1?A?GI?L?R`?W?]u?c?h?n?s?y)?~?q?C?I.?N?S?YG?^?d?i_?n?t?yu?~?-???A???R???b???q??$?}??0???:???B?? ?I???N?$?)?/Q?4?9??S?D?I?OS?T?Y?_R?d?i?oO?t?y?J???D????C?I.?N{?S?Y?^_?c?h?nC?s?x?~$?o???O???-?v?? ?R???,?u?ҽ??M???#?j?????? ??W??!?'(?,m?1?6?<?!o?!?!?!?!2?!c?!?!?!?!#?!S?!ɂ?!α?!?!?!>?!m?!?!?!?!%?!S?"?"?" ?" ?"6?"b?"!?"&?"+?"1?"6@?";l?"@?"E?"J?"P?"UD?"Zo?"_?"d?"i?"o?"tB?"yl?"~?"?"?"?";?"d?"?"?"?"?"-?"U?"}?"?"?"?"?"A?"h?"?"?"?"?"'?"M?"r?#?# ?#?#?#,?#P?##u?#(?#-?#2?#8?#=(?#BL?#Go?#L?#Q?#V?#[?#a?#f@?#kb?#p?#u?#z?#?# ?#+?#L?#m?#?#?#?#?#?#/?#O?#o?#Ž?#ǭ?#?#?# ?#)?#G?#f?#?#?#?#?#?$?$ 5?$R?$o?$?$?$#?$(?$-?$3?$85?$=Q?$Bl?$G?$L?$Q?$V?$[?$a?$f(?$kB?$p\?$uv?$z?$?$?$?$?$?$'?$??$X?$p?$?$?$?$?$?$?$?$-?$C?$Z?$q?$?$?$?$?$?$?% ?% ?%5?%J?%^?%s?%"?%'?%,?%1?%6?%;?%A?%F?%K&?%P9?%UL?%Z_?%_r?%d?%i?%n?%s?%x?%}?%?%?%?%$?%5?%E?%V?%g?%w?%?%?%?%?%?%?%?%?%?%?% ?%/?%=?%K?%Y?%g?&u?&?& ?&?&?&?&?&$?&)?&.?&3?&9?&> ?&C?&H$?&M0?&R;?&WF?&\Q?&a\?&ff?&kq?&p{?&u?&z?&?&?&?&?&?&?&?&?&?&?&?&?&?& ?&?&?&"?&*?&1?&8?&??&E?&L?&R?&X?&_?'d?'j?' p?'u?'{?'?' ?'%?'*?'/?'4?'9?'>?'C?'H?'M?'R?'W?'\?'a?'f?'k?'p?'u?'z?'?'?'?'?'?'?'?'?'?'?'?'?'?'?'?'?'?'?'?'?'?'?'?'?'?'?(?(?( ?(?(?(?(?($?()?(.?(3?(8?(=?(B?(G?(L?(Q?(V?([?(`?(e?(j?(o?(t{?(yv?(~p?(k?(e?(_?(Y?(S?(M?(F?(@?(9?(2?(+?($?(?(?(?(?(?(?(?(?(?(?(?(?(?(?)?) ?)?)?)?)v?)"l?)'a?),W?)1L?)6A?);6?)@+?)E ?)J?)O ?)S?)X?)]?)b?)g?)l?)q?)v?){?)?)?)s?)f?)X?)J?)=?)/?) ?)?)?)?)?)?)?)ʹ?)Ϫ?)ԛ?)ً?){?)k?)[?)K?);?)+?)?* ?*?* ?*?*?*?*?*#?*(~?*-l?*2Z?*7H?*<5?*A#?*F?*J?*O?*T?*Y?*^?*c?*h?*mu?*ra?*wM?*|8?*$?*?*?*?*?*?*?*?*{?*f?*P?*:?*$?* ?*?*?*?*Գ?*ٜ?*ޅ?*m?*V?*??*'?*?*?+?+?+ ?+?+}?+d?+K?+#2?+(?+-?+1?+6?+;?+@?+E?+Jd?+OJ?+T/?+Y?+]?+b?+g?+l?+q?+vr?+{V?+;?+?+?+?+?+?+?+t?+X?+;?+?+?+?+?+ħ?+Ɋ?+l?+M?+/?+?+?+?+?+?+w?+W?+8?,?,?, ?,?,?,y?,!Y?,&8?,+?,/?,4?,9?,>?,Cr?,HQ?,M/?,R?,V?,[?,`?,e?,jc?,o@?,t?,x?,}?,?,?,n?,K?,'?,?,?,?,?,s?,N?,*?,?,?,ƻ?,˖?,q?,K?,&?,?,?,?,?,h?,B?,?-?-?- ?-?-Y?-1?- ?-"?-'?-,?-1k?-6C?-;?-??-D?-I?-Nx?-SO?-X&?-\?-a?-f?-k?-pV?-u-?-z?-~?-?-?-Y?-.?-?-?-?-?-W?-+?-?-?-?-|?-P?-$?-?-?-ڞ?-q?-D?-?-?-?-?-a?.3?.?. ?.?.{?.L?.?."?.'?.,?.1b?.63?.;?.??.D?.Iu?.NE?.S?.W?.\?.a?.fS?.k"?.o?.t?.y?.~^?.-?.?.?.?.f?.4?.?.?.?.k?.8?.?.?.?.l?.8?.?.?.ٞ?.j?.6?.?.?.?.d?.0?.?/?/ ?/\?/&?/?/?/!?/&P?/+?//?/4?/9w?/>A?/C ?/G?/L?/Qe?/V.?/Z?/_?/d?/iP?/n?/r?/w?/|p?/8?/?/?/?/U?/?/?/?/p?/7?/?/?/?/P?/?/?/͡?/f?/,?/?/?/{?/@?/?/?/?/R?0?0?0 ?0b?0%?0?0?0#o?0(3?0,?01?06{?0;>?0@?0D?0I?0NG?0S ?0W?0\?0aN?0f?0j?0o?0tS?0y?0}?0?0V?0?0?0?0W?0?0?0?0V?0?0?0?0S?0?0?0ΐ?0N?0 ?0?0?0G?0?0?0?0>?0?1?1u?1 2?1?1?1i?1%?1#?1(?1-Z?12?16?1;?1@I?1E?1I?1N{?1S6?1W?1\?1ag?1f"?1j?1o?1tQ?1y ?1}?1?18?1?1?1e?1?1?1?1I?1?1?1s?1+?1?1ě?1S?1 ?1?1z?12?1?1?1W?1?1?1|?12?2?2?2 U?2 ?2?2w?2-?2"?2'?2,M?21?25?2:m?2?"?2C?2H?2M??2Q?2V?2[\?2`?2d?2ix?2n+?2r?2w?2|E?2?2?2^?2?2?2v?2(?2?2?2??2?2?2T?2?2·?2h?2?2?2{?2,?2?2?2>?2?2?2N?2?2?3]?3 ?3 ?3l?3?3?3 y?3%(?3)?3.?333?37?3?3E?3J?3OG?3S?3X?3]P?3a?3f?3kW?3p?3t?3y]?3~ ?3?3b?3?3?3f?3?3?3i?3?3?3k?3?3?3l?3?3?3k?3?3?3j?3?3?3g?3?3?3c?3 ?4?4_?4 ?4?4Y?4?4?4!R?4%?4*?4/J?43?48?4=A?4A?4F?4K7?4O?4T?4Y,?4]?4by?4g?4k?4pl?4u?4y?4~^?4?4?4N?4?4?4>?4?4?4-?4?4v?4?4?4c?4?4ȫ?4O?4?4֖?49?4?4?4#?4?4i?4 ?4?5Q?5?5 ?58?5?5|?5?5 ?5%a?5*?5.?53E?57?5?5?5z?5?5?5T?5?5?5-?5?5g?5?5١?5>?5?5x?5?5?5M?5?5?6!?6?6 X?6?6?6+?6?6#a?6'?6,?612?65?6:g?6??6C?6H6?6L?6Qj?6V?6Z?6_7?6c?6hi?6m?6q?6v5?6z?6g?6?6?60?6?6a?6?6?6)?6?6X?6?6?6?6?6L?6?6z?6?6֧?6>?6?6j?6?6?6,?6?6X?6?7?7 ?7 ?7B?7?7l?7 ?7$?7)*?7-?72S?76?7;{?7@?7D?7I7?7M?7R^?7V?7[?7`?7d?7i=?7m?7rc?7v?7{?7?7?7??7?7b?7?7?7?7?7:?7?7]?7?7~?7?7Ġ?70?7?7Q?7?7q?7?7?7!?7?7@?7?7_?7?8}?8 ?8 ?8)?8?8F?8?8$c?8(?8-?82 ?86?8;)?8??8DD?8H?8M^?8Q?8Vy?8[?8_?8d?8h?8m8?8q?8vQ?8z?8i?8?8?8 ?8?8#?8?8:?8?8P?8?8f?8?8{?8?8Ð?8?8̤?8.?8ո?8B?8?8U?8?8h?8?8z?8?8?9?9?9 &?9?97?9?9G?9"?9'W?9+?90f?94?99u?9=?9B?9G ?9K?9P?9T?9Y&?9]?9b3?9f?9k@?9o?9tL?9x?9}X?9?9c?9?9n?9?9x?9?9?9?9?9?9?9?9?9"?9Ŧ?9*?9έ?91?9׵?98?9?9??9?9E?9?9K?9?:P?:?: U?: ?:Y?:?:]?:?:$a?:(?:-d?:1?:6g?::?:?i?:C?:Hk?:L?:Ql?:U?:Zm?:^?:cn?:g?:ln?:p?:un?:y?:~m?:?:l?:?:j?:?:h?:?:e?:?:b?:?:_?:?:[?:?:W?:?:R?:?:M?:?:H?:?:B?:?:;?:?:4?;?;-?; ?;&?;?;?;?; ?;$?;) ?;-?;2?;6~?;:?;?t?;C?;Hi?;L?;Q^?;U?;ZS?;^?;cG?;g?;l;?;p?;u.?;y?;~!?;?;?;?;?;?;?;p?;?;a?;?;R?;?;B?;?;2?;ũ?;!?;Ι?;?;ׇ?;?;v?;?;c?;?;Q?;?;>?;?<*?<?< ?<?<?<x?<?<#c?<'?<,N?<0?<58?<9?<>"??>?> `?>?>4?>?>?>!q?>%?>*D?>.?>3?>7?>;?>@Q?>D?>I"?>M?>Q?>V\?>Z?>_,?>c?>g?>ld?>p?>u3?>y?>~?>i?>?>7?>?>?>l?>?>9?>?>?>l?>?>8?>?>?>j?>?>5?>ћ?>?>e?>?>/?>?>?>^?>?>'?>????T?? ????????H?? ??%??)s??-??29??6??:???b??C??H(??L??P??UO??Y??^??bv??f??k:??o??s??x_??|??"??????F??????i????*??????K???? ??l????+??ˋ????J??ت?? ??h????&??????C???@?@^?@?@ ?@y?@?@5?@?@"?@'N?@+?@0 ?@4g?@8?@=!?@A~?@E?@J8?@N?@R?@WN?@[?@`?@dc?@h?@m?@qw?@u?@z/?@~?@?@A?@?@?@S?@?@ ?@d?@?@?@t?@?@)?@?@?@7?@ȑ?@?@E?@՟?@?@R?@?@?@^?@?@?@i?@?A?As?A ?A$?A|?A?A,?A?A#?A(4?A,?A0?A5;?A9?A=?ABA?AF?AJ?AOF?AS?AW?A\K?A`?Ad?AiN?Am?Aq?AvP?Az?A~?AR?A?A?AS?A?A?AS?A?A?AR?A?A?AP?A?A?AM?AȢ?A?AJ?A՞?A?AE?A?A?A@?A?A?A:?A?B?B3?B ?B ?B+?B}?B?B"?B#t?B'?B,?B0j?B4?B9?B=_?BA?BF?BJT?BN?BR?BWG?B[?B_?Bd:?Bh?Bl?Bq+?Bu|?By?B~?Bl?B?B ?B\?B?B?BK?B?B?B9?B?B?B&?Bu?B?B?Ba?B˰?B?BL?Bؚ?B?B6?B?B?B ?Bn?B?B?BV?C?C?C =?C?C?C$?Cq?C!?C& ?C*V?C.?C2?C7;?C;?C??CD?CHj?CL?CQ?CUM?CY?C]?Cb.?Cfy?Cj?Co?CsZ?Cw?C{?C:?C?C?C?Cc?C?C?CA?C?C?C?Cg?C?C?CC?C?C?C?Cg?Cѯ?C?CA?Cމ?C?C?Cb?C?C?C:?C?D?D?D X?D ?D?D.?Du?D?D#?D'J?D+?D/?D4?D8e?D?Hl?Hš?H?H?H"?HP?H}?H۪?H?H?H1?H^?H?H?H?H?I=?Ii?I ?I ?I?I?IF?Iq?I"?I&?I*?I/ ?I3K?I7v?I;?I??IC?IH#?ILN?IPx?IT?IX?I\?Ia#?IeM?Iiw?Im?Iq?Iu?Iz?I~I?Is?I?I?I?I?IB?Il?I?I?I?I?I8?Ia?I?I?I?I?I+?IT?I|?Iդ?I?I?I?IC?Ik?I?I?I?I?I/?JV?J}?J ?J?J?J?J??J f?J$?J(?J,?J0?J5%?J9K?J=q?JA?JE?JI?JN?JR-?JVR?JZx?J^?Jb?Jf?Jk ?Jo1?JsU?Jwz?J{?J?J?J ?J0?JU?Jy?J?J?J?J?J,?JP?Js?J?J?J?J?J#?JF?Ji?JҌ?J֯?J?J?J?J9?J\?J~?J?J?J?K?K(?KJ?K k?K?K?K?K?K!?K%3?K)T?K-u?K1?K5?K9?K=?KB?KF:?KJZ?KNz?KR?KV?KZ?K^?Kc?Kg;?KkZ?Koz?Ks?Kw?K{?K?K?K6?KU?Kt?K?K?K?K?K?K,?KK?Ki?K?K?K?K?K?K?K;?KY?Kv?Kڔ?Kޱ?K?K?K ?K&?KC?K`?K|?K?L?L?L ?L ?L(?LD?L`?L |?L$?L(?L,?L0?L5?L9#?L=>?LAZ?LEu?LI?LM?LQ?LU?LY?L^?Lb2?LfM?Ljg?Ln?Lr?Lv?Lz?L~?L?L?L9?LS?Lm?L?L?L?L?L?L?L?L8?LQ?Lj?L?Lě?Lȴ?L?L?L?L?L.?LG?L_?Lw?L?L?L?L?L?M?M?M 4?ML?Mc?Mz?M?M?M"?M&?M*?M/?M3?M70?M;G?M?]?MCs?MG?MK?MO?MS?MW?M[?M` ?Md"?Mh8?MlM?Mpc?Mtx?Mx?M|?M?M?M?M?M ?M?M4?MH?M\?Mq?M?M?M?M?M?M?M?M?M$?M7?MK?M^?Mq?Mބ?M?M?M?M?M?M?M?M?N-?N@?N R?Nd?Nv?N?N?N?N#?N'?N+?N/?N4?N8?N<'?N@8?NDJ?NH[?NLl?NP}?NT?NX?N\?N`?Nd?Nh?Nl?Nq?Nu?Ny!?N}1?NA?NQ?Na?Nq?N?N?N?N?N?N?N?N?N?N ?N?N'?N6?ND?NS?Na?Np?N~?Nڌ?Nޚ?N?N?N?N?N?N?N?N ?O?O#?O 1?O>?OK?OX?Oe?Or?O#~?O'?O+?O/?O3?O7?O;?O??OC?OG?OK?OP?OT?OX?O\)?O`5?Od@?OhK?OlW?Opb?Otm?Oxx?O|?O?O?O?O?O?O?O?O?O?O?O?O?O ?O?O ?O)?O3?O=?OF?OP?OY?Ob?Ol?Ou?O~?O?O?O?O?O?O?O?P?P?P ?P ?P?P?P?P?P"?P& ?P*?P.?P2#?P6*?P:2?P>9?PB@?PFG?PJN?PNU?PR\?PVc?PZj?P^p?Pbw?Pf~?Pj?Pn?Pr?Pv?Pz?P~?P?P?P?P?P?P?P?P?P?P?P?P?P?P?P?P?P?P?P?P ?P?P?P?P?P!?P%?P)?P,?P0?P4?P8?P;?Q??QB?Q E?QI?QL?QO?QR?QU?Q#X?Q'Z?Q+]?Q/`?Q3b?Q7e?Q;g?Q?j?QCl?QGn?QKp?QOr?QSt?QWv?Q[x?Q_y?Qc{?Qg}?Qk~?Qo?Qs?Qw?Q{?Q?Q?Q?Q?Q?Q?Q?Q?Q?Q?Q?Q?Q?Q?Q?Q?Q?QË?QNj?Qˋ?Qϊ?Qӊ?Q׉?Qۉ?Q߈?Q?Q?Q?Q?Q?Q?Q?Q?R~?R|?R {?Ry?Rw?Rv?Rt?Rr?R#p?R'n?R+k?R/i?R3g?R7d?R;b?R?_?RC]?RGZ?RKW?ROT?RSQ?RWN?R[K?R_H?RcE?RgB?Rk>?Ro;?Rs7?Rw4?R{0?R,?R(?R$?R ?R?R?R?R?R ?R?R?R?R?R?R?R?R?R?R?R?R?R?R?R?R޻?R?R?R?R?R?R?R?R?S?S?S y?Ss?Sl?Se?S_?SX?S"Q?S&J?S*C?S.?SB?SF?SJ ?SN?SQ?SU?SY?S]?Sa?Se?Si?Sm?Sq?Su?Sy?S}?S?S?S?S|?Ss?Sj?Sa?SX?SO?SE?S?Uk-?Uo?Us ?Uv?Uz?U~?U?U?U?U?Uw?Ue?UR?U@?U-?U?U?U?U?U?U?U?U?UŁ?Um?UZ?UF?U3?U?U ?U?U?U?U?U?U?U~?Uj?VU?VA?V,?V ?V?V?V?V?V?V#?V'?V+o?V/Z?V3E?V7/?V;?V??VB?VF?VJ?VN?VR?VV?VZk?V^T?Vb>?Vf(?Vj?Vm?Vq?Vu?Vy?V}?V?Vs?V\?VE?V-?V?V?V?V?V?V?V?Vr?VZ?VB?V*?V?V?V?V?Vϲ?Vә?Vׁ?Vi?VP?V7?V?V?V?V?V?V?V?Wp?WW?W =?W$?W ?W?W?W?W!?W%?W)p?W-V?W1?\O ?\R?\V?\Zy?\^G?\b?\e?\i?\m?\qO?\u?\x?\|?\?\U?\#?\?\?\?\Y?\'?\?\?\?\\?\)?\?\?\?\]?\*?\?\?\̐?\]?\)?\?\?\ߎ?\Z?\'?\?\?\?\W?\"?\?]?]?] Q?] ?]?]?]?]J?] ?]#?]'?]+w?]/A?]3 ?]6?]:?]>m?]B7?]F?]I?]M?]Qa?]U+?]X?]\?]`?]dT?]h?]k?]o?]s{?]wE?]{?]~?]?]k?]4?]?]?]?]Y?]"?]?]?]}?]F?]?]?]?]h?]1?]?]?]ʊ?]R?]?]?]٪?]r?]:?]?]?]?]Y?]!?]?]?]w?^>?^?^ ?^?^[?^"?^?^?^!w?^%=?^)?^,?^0?^4X?^8?^;?^??^Cq?^G7?^J?^N?^R?^VO?^Z?^]?^a?^ef?^i+?^l?^p?^t|?^xA?^|?^?^?^V?^?^?^?^i?^.?^?^?^|?^A?^?^?^?^R?^?^?^Þ?^b?^&?^?^Ү?^r?^5?^?^?^?^C?^?^?^?^P?^?^?_?_\?_ ?_?_?_g?_*?_?_!?_%q?_)4?_,?_0?_4z?_8?`+?`/?`3x?`76?`:?`>?`Bo?`F-?`I?`M?`Qe?`U"?`X?`\?``Z?`d?`g?`k?`oN?`s ?`v?`z?`~@?`?`?`v?`2?`?`?`g?`#?`?`?`W?`?`?`?`F?`?`?`y?`5?`?`̫?`f?`"?`?`ۘ?`S?`?`?`?`>?`?`?`n?`)?a?a?aX?a ?a?a?aA?a?a?a"n?a&(?a)?a-?a1U?a5?a8?a?b?b?bY?b ?b?bs?b&?b?b?b@?b?bɦ?bX?b ?bԾ?bq?b#?b?b?b;?b?b?bR?b?b?bh?c?c?c~?c 0?c?c?cE?c?c?c"Z?c& ?c)?c-n?c1 ?c4?c8?c<3?c??cC?cGF?cJ?cN?cRX?cV ?cY?c]j?ca?cd?ch{?cl,?co?cs?cw?d?d?dF?d?d ?d$N?d'?d+?d/V?d3?d6?d:]?d> ?dA?dEd?dI?dL?dPj?dT?dW?d[o?d_?db?dft?dj ?dm?dqy?du%?dx?d||?d(?d?d?d,?d?d?d.?d?d?d0?d?d?d2?d?d?d3?d?d?d3?d?dɉ?d3?d?dԈ?d3?d?d߈?d2?d?d?d0?d?d?d.?d?e?e,?e?e ?e(?e?e{?e%?e?e!w?e% ?e(?e,s?e0?e3?e7n?e;?e>?eBh?eF?eI?eMb?eQ ?eT?eX[?e\?e_?ecT?ef?ej?enL?eq?eu?eyD?e|?e?e;?e?e?e2?e?e?e(?e?ew?e?e?el?e?e?ea?e?e?eU?e?eɢ?eI?e?eԖ?eV?fA?fE?fID?fL?fP?fT1?fW?f[z?f_?fb?fff?fj ?fm?fqR?ft?fx?f|>?f?f?f)?f?fp?f?f?fZ?f?f?fC?f?f?f,?f?fr?f?f?fZ?f?fȟ?fB?f?fӇ?f)?f?fm?f?f?fT?f?f?f9?f?f}?f?g?gb?g ?g ?gF?g?g?g*?g?g#l?g' ?g*?g.O?g1?g5?g92?g?h?hy?h?h?hQ?h ?h$?h((?h+?h/b?h2?h6?h:8?h=?hAr?hE?hH?hLG?hO?hS?hW?hZ?h^U?ha?he?hi)?hl?hpa?hs?hw?h{4?h~?hl?h?h?h>?h?hu?h?h?hG?h?h}?h?h?hN?h?h?h?h?hT?h?hʉ?h#?hѾ?hX?h?h܌?h'?h?h[?h?h?h)?h?h\?h?i?i)?i?i ]?i?i?i)?i?i[?i ?i$?i('?i+?i/Y?i2?i6?i:#?i=?iAU?iD?iH?iL?iO?iSO?iV?iZ?i^?ia?ieH?ih?ily?ip?is?iw@?iz?i~p?i?i?i7?i?if?i?i?i,?i?iZ?i?i?i?i?iM?i?i{?i?i¨?i??i?il?i?iԙ?i0?i?i\?i?i?i?i?iK?i?iv?i ?i?j8?j?j c?j ?j?j#?j?jN?j?j#x?j'?j*?j.8?j1?j5b?j8?j?k?k^?k?k}?k ?k?k+?k?kI?k?kh?k?k?k?k?k2?k?kP?k?km?k?kڋ?k?k?k6?k?kR?k?ko?k?k?k?l?l5?l?l Q?l?ll?l?l?l?l!?l%0?l(?l,J?l/?l3e?l6?l:?l> ?lA?lE&?lH?lL@?lO?lSY?lV?lZr?l]?la?le?lh?ll1?lo?lsI?lv?lzb?l}?lz?l?l?l?l?l5?l?lL?l?ld?l?l{?l?l?l?l?l3?l?lI?l?l_?l?lu?l?l֋?l?lݠ?l*?l?l@?l?lT?l?li?l?l}?m?m?m?m ?m/?m?mC?m?mW?m ?m$j?m'?m+}?m/?m2?m6?m9?m=+?m@?mD>?mG?mKP?mN?mRb?mU?mYs?m\?m`?md ?mg?mk?mn?mr0?mu?my@?m|?mQ?m?ma?m?mq?m?m?m ?m?m?m?m(?m?m7?m?mF?m?mU?m?mc?m?mq?m?m?m?m؍?m?mߛ?m"?m?m/?m?m?nBD?nE?nIO?nL?nPY?nS?nWc?nZ?n^m?na?new?nh?nl?np?ns?nw?nz?n~?n?n ?n?n)?n?n1?n?n9?n?nA?n?nI?n?nQ?n?nX?n?n_?n?nf?n?nm?n?ns?n?ny?n?n?n?n?n?n?n?n?n?n?o?o?o?o ?o"?o?o'?o?o+?o?o#/?o&?o*3?o-?o17?o4?o8:?o;?o?=?oB?oFA?oI?oMC?oP?oTF?oW?o[I?o^?obK?oe?oiM?ol?opO?os?owQ?oz?o~R?o?oS?o?oT?o?oU?o?oV?o?oV?o?oV?o?oV?o?oV?o?oV?o?oU?o?oU?o?oT?o?oR?o?oQ?o?oO?o?oM?o?oK?o?oI?o?pG?p?p D?p ?pA?p?p>?p?p;?p"?p&8?p)?p-4?p0?p40?p7?p;,?p>?pB(?pE?pI#?pL?pP?pS?pW?pZ?p^?pa?pe?ph?pl ?po?ps?pv?py?p}|?p?pu?p?po?p?ph?p?pb?p?p[?p?pS?p?pL?p?pD?p?p=?p?p5?pƱ?p,?pͨ?p$?pԠ?p?pۗ?p?p?p ?p?p?p|?p?pr?p?pi?q?q_?q?q U?q?qJ?q?q@?q?q!5?q$?q(*?q+?q/?q2?q6?q9?q=?q@?qC?qGv?qJ?qNj?qQ?qU^?qX?q\R?q_?qcE?qf?qj8?qm?qq+?qt?qx?q{?q?q?q?q|?q?qn?q?q`?q?qR?q?qC?q?q5?q?q&?q?q?q?q?qĀ?q?qp?q?q`?q?qP?q?q@?q?q/?q?q?q?q?q?q?qt?r?rc?r ?r R?r?r@?r?r.?r?r"?r%?r) ?r,?r/?r3n?r6?r:[?r=?rAH?rD?rH5?rK?rO"?rR?rV?rY?r\?r`p?rc?rg\?rj?rnH?rq?ru3?rx?r|?r?r ?r?r?rj?r?rU?r?r??r?r)?r?r?r?r?rr?r?r\?r?rE?rĺ?r.?rˣ?r?rҌ?r?rt?r?r]?r?rE?r?r-?r?r?r?r?rq?s?sX?s ?s ??s?s&?s?s ?s?s!?s%g?s(?s,M?s/?s33?s6?s:?s=?s@?sDr?sG?sKW?sN?sR?v?v ?vq?v?v=?vϣ?v ?vo?v?v;?v?v?vm?v?v8?v?v?vi?v?v4?w?w?w d?w ?w/?w?w?w^?w?w!(?w$?w'?w+W?w.?w2 ?w5?w8?w?{B,?{E?{H?{L0?{O?{R?{V4?{Y?{\?{`7?{c?{f?{j:?{m?{p?{t?{?{?{??{?{?{@?{?{?{A?{?{?{A?{?{?{A?{?{?{A?{?{?{@?{Ǖ?{?{>?{ѓ?{?{=?{ۑ?{?{;?{?{?{8?{?{?{5?{?{?|2?|?|?| .?| ?|?|*?|~?|?|&?|!y?|$?|(!?|+t?|.?|2?|5o?|8?|<?|?i?|B?|F?|Ic?|L?|P ?|S]?|V?|Z?|]V?|`?|c?|gN?|j?|m?|qF?|t?|w?|{>?|~?|?|6?|?|?|-?|?|?|#?|v?|?|?|l?|?|?|b?|?|?|W?|?|?|L?|ǝ?|?|@?|ђ?|?|5?|ۆ?|?|(?|z?|?|?|m?|?|?|`?|?}?}R?}?} ?} D?}?}?}6?}?}?}!'?}$x?}'?}+?}.i?}1?}5 ?}8Y?};?}>?}BI?}E?}H?}L9?}O?}R?}V(?}Yw?}\?}`?}cf?}f?}j?}mT?}p?}s?}wB?}z?}}?}0?}?}?}?}l?}?} ?}Y?}?}?}E?}?}?}1?}?}?}?}k?}?}?}V?}Ƥ?}?}@?}Ў?}?}*?}x?}?}?}b?}?}?}K?}?}?}4?}?}?~?~j?~?~ ?~R?~?~?~:?~?~?~#!?~&n?~)?~-?~0U?~3?~6?~:;?~=?~@?~D!?~Gn?~J?~N?~QS?~T?~W?~[8?~^?~a?~e?~hi?~k?~o?~rM?~u?~x?~|1?~}?~?~?~`?~?~?~C?~?~?~%?~p?~?~?~R?~?~?~4?~?~?~?~`?~ī?~?~A?~Ό?~?~!?~l?~۷?~?~L?~?~?~+?~u?~?~ ?~T?~?~?3?}? ? ?[???9?? ?$?'`?*?-?1b?A?D?H>?K?N?R?Ub?X?[?_=?b?e?i?la?o?r?v;?y?|??]???6?~???W???/?w???O???'?n???E?ˍ???c?ث??9????V???+?r????5?5_W?5?6?6m?6T?7 ?7z>?7o?8,?8^?8?96?9?92?:?F?:)?:?;Fx?;?;?Sv?>q?>L??U???@?@UC?@e?@T?AT"?A?AY?BQ?B?B?CN?C?C?DI?D?D?EB?E?E?F;i?F ?F~?G2?G?G ?H(?Hz?Hh?I?IoT?I?J?Jb?J?Kh?KU?K?K?LFA?LW?Lm?M6P?M?Mղ?N%B?Nt?N?O'?ObA?O)?P?PN?PI?P?Q:.?Qn?Q֌?R$?Rru?R@?S ?S[?S?S^?TC?T?Tݵ?U*?Uwu?U"?V?V]:?V?V?WB?W?W?X%?Xq?XE?Y?YTC?Y?Y?Z5?Z?Z?[?[a?[.?[?\A%?\v?\շ?]?]i?]?]?^Gx?^!?^ک?_$ ?_m?_?`?`I?`?`?a#?al?a1?a?bF(?b?b?c?cg?c!?c?d>?d?d>?e?e]>?e?e?f3'?fzS?f]?gF?gO/?g?gܭ?h#S?hi?hK?h?il?~~?~4?~~????2<F^jt~.text .datah.bss_errno_write_matherr_s_sqrt_r_sqrt_R_sqrt",sqrt_nameUNDERFLOWMASK_MANTSqrtTabler_tan.o/ 568277911 98 100 100664 1136 ` u!;h .text  .data  P@.bsspp?"94[.(#pQ   O!D~.?I $!?"%0x9@ 4@4I4!@)D$!DP`pxyހ xހx7O΀FtvN%vF%r#x#Wp#uހ?!wG)w$p#p$#P8d%!dd6#1%###?%~^% @ :1$2 >&#%!0>$2% %!# A@&PW"WW@9QB@@*BN8  .45>0H0L,$ 6"N@@(PWP 6 tantan: TLOSS error tan: input value was NAN tan: input value was INF .text .data P.bssp_errno_write_matherr_s_tan(_r_tan,_R_tan0UNDERFLOWpi_reducer_tanh.o/ 568277918 98 100 100664 926 ` u!; .textX4 .dataXXP@.bss  ).!: ! ?@!(%0v=t%1@Rl#4%1%0@@5/#A&4#W A-` @8;%!1S)U$!%"@=lVe%BP@#E%@A#$A#B$!P`54#2!&#?$  W?*!.8 X.41>0?H0:] !. &q P?W tanhtanh: DOMAIN error tanh: input value was NAN tanh: input value was INF 444 44$4.4F4P4.textX .dataXP.bss_errno_write_matherr_s_tanh_r_tanh_R_tanhUNDERFLOWpow_rr.o/ 568277927 98 100 100664 2477 ` u!;T .text0 .datat@.bss  ?W !)"0   :!4 @ !)2$10@?4@ 0! %@0 W@@?,F@% 1r2)#$43$2%#WP PT0 50DSqQ  ?F@% 1r2)#$43$2%#UqQ  >@%W?W  x)0#0 0? 0?0!0?#0@?$&0%3@?M$CP?^&T%5%0P?1r)"%%P##$8 .41>0H0  !PW8 .43>0H0 !.6 lPW <PWWW%Bff*®*  F@  $!0?%!1)3$ 3@?%$@9%##% =lVe%!@@#$% A#$&?#1 x h    !   WxW0 @*A@8 .44>0H0 "@@@&PW6ҋ @*A@8 .43>0H0z"@@@*PWP6<P&powpow: OVERFLOW error pow: DOMAIN error pow: input value was NAN pow: input value was INF powpow: input value was NAN pow: input value was INF $        84R^hr &0<FXj.text0.data.bss_errno_write_matherr_s_pow_pow_rr_Pow_rrUSavePowerSqrtTableUNDERFLOWMASK_MANTpnanorinfcont_fastReducedsqDontNegate r_floor.o/ 568277935 98 100 100664 532 ` u!;L .text4 .data @.bss@<*<?$ <@@W@<*<?# <@@W @(#)r_floor.c 6.1 87/11/23 4Z4.text.data .bssSaveReg _s_floor_s_modf_s_ceilLr_modf.o/ 568277937 98 100 100664 444 ` u!;.textp .datapp @.bss 1* "@K* 0@K#$ @?$@*A@*"$W @(#)r_modf.c 6.1 87/11/23 .textp.datap .bssSaveReg _s_modf! / 568282807 0 0 0 1532 ` ~@@ ` `JJJJJ00""& & & & & & & & AAAAAAAAALLLLLSSSSSSSSSSSddgggmZmZoJoJq.q.q.q.q.q.q.$$PP ,,tt $$$$$$::žžʹʹВВSaveReg_auxfSaveReg_chkidSaveReg_chksidSaveReg_cmrcheckSaveReg_date_ab_Datep_g2_mosizeSaveReg_date_baSaveReg_del_abSaveReg_del_baSaveReg_deltack_getinfo_errorlog_efd_promdelt_msg_verifSaveReg_dodelt_Timenow_Pgmr_First_esc_First_cmt_CDid_mrs_doixg_getadelSaveReg_do_file_had_standinp_nfiles_had_dirSaveReg_dohist_Mstr_getresp_mrfixup_Cstr_valmrs_Varg_stalloc_savecmt_QargSaveReg_doieSaveReg_dolist_getasidSaveReg_eqsidSaveReg_errorSaveReg_ftrans_copyrest_getrec_rec_cmp_argchop_sweepSaveReg_flushtoSaveReg_fmalloc_listsize_ptrlist_ptrcnt_ffree_ffreeallSaveReg_fmterrSaveReg_getlineSaveReg_gfSaveReg_lognameSaveReg_newstatsSaveReg_finduser_doflags_Sflags_permiss_ck_lock_l_strSaveReg_pf_abSaveReg_putline_Xcreate_Xiop_flushline_xrmSaveReg_readmod_remq_addq_chkix_setkeepSaveReg_setup_condset_ixgsetupSaveReg_sid_abSaveReg_sid_baSaveReg_sidtoserSaveReg_sinitSaveReg_stats_abSaveReg_xcreatSaveReg_xmsgauxf.o/ 568282575 98 100 100664 740 ` u!M .text .data@d@.bssH<@~Dp q   (! h (! " g  l@ @ vl  V p~Dǎ@Ǟ<HHW @(#)auxf.c 6.1 87/11/24 @(#)defines.h 6.1 87/11/24 (jv   .text .data@.bssSaveReg _auxf_sname_catchkid.o/ 568282580 98 100 100664 1252 ` u!M.text@L .data@@@.bssH@~Dp%%|WPrjVX(6 J(*pW.($ lq\r>"  "qp~Dǎ@HHW @(#)chkid.c 6.1 87/11/24 @(#)defines.h 6.1 87/11/24 LL. L` Lb LLLLL L LLLL L&L(LLLLLLLLLLLLLLLL.text@.data@.bssSaveReg _chkid_Did_id_any__ctype_strlen_strncmp_strchrchksid.o/ 568282584 98 100 100664 528 ` u!M\ .text`D .data``X@.bss8 4 $  88W @(#)chksid.c 6.1 87/11/24 @(#)defines.h 6.1 87/11/24 invalid sid (co8)LDRD.text`.data`X.bssSaveReg _chksid_fatalcmrcheck.o/ 568282589 98 100 100664 1090 ` u!M.textpT .datappX@.bss` ~dqހplҋhh R ((,^h^048<@D :n.hVhh !p,0h]ph R ((,^h^048<@D :.h~dǎ`W @(#)cmrcheck.c 6.1 87/11/24 @(#)filehand.h 6.1 87/11/24 %s is not a valid CMR. T0TF TX T T T T TT T T: TH TJ TR T.textp.datapX.bssSaveReg _strcpy_strlen_gf_sweep__iob_fprintf_strrchr_cmrcheckdate_ab.o/ 568282595 98 100 100664 1377 ` u!M0.text .dataPt@.bss88X8<@DHL~Pqж !ΐcF c ! f ~ n 2!ΰ   x!; ; P!; ; Tl(!4# 0m 0n.T#.T݋ T TT*  <T TT< TTT~PǎLǞHǮDǾ@<8XXW ,$m n n pW(P 0( 9(BP 0%00(# %09(# %00#*W @(#)date_ab.c 6.1 87/11/24 28    N\ ^  .text .dataP.bss8SaveReg _date_ab_tzset_Datep_g2\_mosize_timezone_localtime date_ba.o/ 568282601 98 100 100664 779 ` u!MH .textp< .datapp@@.bss8  ~4q :#"0@'!:#"00$ /@#!!:#"0$!@!:#"00$ /@#! :#"0$! @:#"00$ @#!:#"0$!@:#"00$ :@#!:#"0$!@:#"00$ :@#!:#"00$*0~488W @(#)date_ba.c 6.1 87/11/24 @(#)defines.h 6.1 87/11/24 <.textp.datap@.bssSaveReg _date_ba_localtime del_ab.o/ 568282606 98 100 100664 1048 ` u!M.text\ .dataH@.bssP@DH~Lpq  q dq q q,q zpq Tpq ȓ*  *  !qq pq p  d~LǎHǞDǮ@PPW @(#)del_ab.c 6.1 87/11/24 @(#)defines.h 6.1 87/11/24 4\ \ \ \ \\ \\ \*\R\d\.text .dataH.bssSaveReg _del_ab_fmterr_sid_ab_date_ab_Datep_index_strncpy_satoidel_ba.o/ 568282611 98 100 100664 864 ` u!Mp .textH .dataHHH@.bssH<@~Dyq!q) d!q !(,q!q !pq !qqq ! \qqq !(,qqq !(qqq ~Dǎ@ Ǟ<HHW @(#)del_ba.c 6.1 87/11/24 @(#)defines.h 6.1 87/11/24 %u%u`z    .textH.dataHH.bssSaveReg _del_ba_sid_ba_date_ba_cat_sprintfdeltack.o/ 568282626 98 100 100664 7000 ` u!N4'.text  .data X @.bssxxhPTX\~`s xp Г` ^ :vް h ! LR 6" $( T>  x ff  Px^(,00~*Px^(,00T Z ~`ǎ\ǞXǮTǾPW(HLPTX\~`sP^^^Г    ąZ B.+p""22$Q^ІJ    ܓ  L  p"' 0ft ȓPЎ 6 p (dd 0d d   0P \^ȓxdndЎ؋H 8dԓ*(ԓQ^ȋԀ^ȎQ |X 6^pQP ^Ј P ^̓tdjd NxHd00Q+p""^̋22$ Ԁ^̎P 0\VL    p&7ȧ( `t ȓJ~`ǎ\ǞXǮTǾPLHWPX\`d~hq0p/0R( \7RR.| ! `dV hFl8  XpT T$ t.R ^Rx^(,|048 *9lp N PV$ .R8*4t.v~hǎdǞ`Ǯ\ǾXPPWp`~dp T~hl((,^h^048<@D :n ~dǎ`ppW`~<p0X @ ~<``W @(#)deltack.c 6.1 87/11/24 @(#)had.h 6.1 87/11/24 @(#)defines.h 6.1 87/11/24 @(#)filehand.h 6.1 87/11/24 , ,aLOGPfile non existant at deltack no application found with -fz flagno FRED file or system name in admin directory ***CASSI REPORTS ERROR: no CMRS in pfile: %s CMRs not on P.file -serious inconsistancy,sdswyesyey%s ,swsda,,***CASSI REPORTS ERROR: no CMRS at sd no CMR's left, delta forbidden the CMRs for this delta now are: %s,OK ??you must input a least 1 valid cmr number enter new CMR number or 'CR' duplicate CMR number ignored invalid CMR ignored to many CMRs added no more allowed CMR number to delete or (CR) ? only one CMR left can't delete more not on list request ignored aaa/source/termLOG***CASSI REPORTS ERROR: can't write to FRED : %s Cassi Interface Msg not writable %s chpost %s q %s %s MID=%s MFS=%s MPA=%s q q ***CASSI REPORTS ERROR: can't write to BD/source : %s Cassi BD/source not writeable got to bad FRED file %s 28JPpv           8 BHTj~ &,28@FPVv  $*08> BDP \b hnv~   *0@FV\rx   <BVnt 46B PV ^d jpx  2FN` jx     !   "*06^"lv~!  # $ H  % &   !.text .data X.bssxSaveReg _deltack_error_getinfo _strcpy_strlen_strcat_fopen_efd_fprintf_fclose_strtok_msg_verif 0_had_fatal_Sflags_cat_printf_gets_strcmp_malloc_curdir_abspath_strchr_stat_logname_chmod_chown_sweep_gf_errorlog_promdeltdodelt.o/ 568282634 98 100 100664 2805 ` u!N P.text* .data$ @.bssHHx<@DHLP~TpΠ "d RRы"d.p!|.p 30 $Lh8"d(h P"d.h! D손zXht  \! 0D#! "t.X!  "t"th '"dX\`d lp\] m(! @c$(! TpW x@D`."] m 0 D\ V0Q0\: ,\] s XB d!c"d~TǎPǞLǮHǾD@<WH@~Dp \'~Dǎ@HHWH8<@ ~DqώH!!!  ," !0 R00(09(sq!p0 1 p") ~Dǎ@Ǟ<Ǯ8HHW @(#)dodelt.c 6.1 87/11/24 @(#)defines.h 6.1 87/11/24 H|D|||||Hclock set wrong!!! (co10)Clock may be set wrong! (co11) <>H R pr    ",.:FPV^2RZ\tTbp@.text*.data .bssHSaveReg _dodelt_Timenow_time_fatal__iob_fprintf_fmalloc_zero_eqsid_Pgmr_cat$._had_fredck_fmterr_doixg_getline_getadel<_del_ab_satoi9_stats_ab_First_esc_First_cmt_CDid_mrs_escdodelt dofile.o/ 568282640 98 100 100664 1630 ` u!N.text& .dataXt@.bss@@h똧@D~Hp-hF 0 lWlBh    @,p lL\!9L!9܋fL\j4'>N ( jWL!9d VpW~HǎDǞ@hhW @(#)dofile.c 6.1 87/11/24 @(#)defines.h 6.1 87/11/24 s.rs.%s/%s0B NT f l n v   &>JX dj |        .text&.dataX.bss@SaveReg _do_file_sname_imatch_Ffile_nfiles_gets_Statbuf_stat_had_dir_fopen_setbuf_fread_sprintf_fclose_had_standinpdohist.o/ 568282651 98 100 100664 4332 ` u!N 8..textb .data ,@.bssH~< p.H!.I0U#H' Նz@.K0v#.I0f#.H!4.I0t#.H!H'J I fp@q:0pv <pHH"~<HHWPﰧ<@DH~L֐p6"  ΐP!*2!0\#  q!DzPpϰb \HP<pP $Y~LǎHǞDǮ@Ǿ<PPWH <~@pgƧL!  !px|Jp0tfqRJD<D~@ǎ<HHWP<@DH~Lpπ q   (  <v  \q qkq PL  <ȓx H  ~LǎHǞDǮ@Ǿ<PPW@8~P(TTP PPP.``.p(d.th.xl.|!  >p|||.lpz ɋ*pb  >pH ,]~LǎHǞDWH<@~Dq ,'  4 '  r~Dǎ@Ǟ<HHW @(#)dolist.c 6.1 87/11/24 @(#)defines.h 6.1 87/11/24 bad range (co12)delta list syntax (co13)   JP f     *0 V\  .text.datap.bss SaveReg _dolist_getasid_fatal_enter_sid_ab_sidtosereqsid.o/ 568282667 98 100 100664 436 ` u!N+.textH .dataHH@@.bss 01021$21  W @(#)eqsid.c 6.1 87/11/24 @(#)defines.h 6.1 87/11/24 .textH.dataH@.bssSaveReg _eqsiderror.o/ 568282671 98 100 100664 424 ` u!N/ .text( .data(((@.bssPP8H88W @(#)error.c 6.1 87/11/24 %s .text(.data((.bssPSaveReg _error_printffilehand.o/ 568282686 98 100 100664 4538 ` u!N>.text B .data @.bss ( (X?@DHLP~Tprq8 ܓ"  qxL ؓ6 p  V     ԓ8  Г& xp> *  !  !΀ ,qr   ~TǎPǞLǮHǾD@XXW`DHLPTX~\sڎ&pp `p Rʋ" +9  '8 (ώ   ~\ǎXǞTǮPǾLHD``WP@DH~Lq΀ 1<.x9Jx  xp> !0 8#  L*'x 4   !0# ~LǎHǞDǮ@PPWH8<@0~Dp r N)L1  1   ! ~Dǎ@Ǟ<Ǯ8HHW0 1 ~B!@ptB@t@ Ct@ C@ B@Dp GB@DItB@t@ Ct*@ C@0B@Dp GB@DIB@pt, B@D@ HpBArpt!B@D@p~ǎ Wp DHLPTX~\p΀   lzq b  ~l ld    Hl p   ІF    &l 8 0  Ў&lq ċƎ~Xh<`2"pd^^d  (h T^^h` ("ppdl  (6` ^^`^^dh q2".0 8  ʋbZ  ‹n.`h`.d>`.dWB d (>d (W'0@ #  T ɋB ȋ2 "!0 8  ʋN(.h0 8  PHq@!0 8  `.h0 8  Hʋ͋l ((h< w  l ' !74@   D4    <͋4(!0 8  lʋ̎( l 0l* !  !*(*0 h`  d ~\ǎXǞTǮPǾLHDppW @(#)filehand.c 6.1 87/11/24 @(#)filehand.h 6.1 87/11/24 arrrarrar%s%c%s%c%s%c%s%c%s%c%s%c< B R  |         *  <  h      6 N  ,  V \ ~            $  D J \        @  l        4 : r H N r x       @  V      < N d .text B.data .bss (SaveReg _ftrans_fopen_fclose_unlink_malloc_fwrite_fread_free_getrec_fgetc_rec_cmp|_strcmp_argchop_sweep _fprintf_strncpy_copyrestflushto.o/ 568282691 98 100 100664 596 ` u!NCx .textT .data@@.bssH<@~Dp΀  L  !1 (2؎ ~Dǎ@Ǟ<HHW @(#)flushto.c 6.1 87/11/24 @(#)defines.h 6.1 87/11/24 4T` Tj T.text.data@.bssSaveReg _flushto_getline_fmterr_putlinefmalloc.o/ 568282697 98 100 100664 1632 ` u!NH.text,& .data@.bss@~<p0dp (: d p,rpfp@R$pp~<@@W8 ~4pT qp>PQWPppX~488W8ȋ: ppD (88W @(#)fmalloc.c 6.1 87/11/24 OUT OF SPACE (ut9)OUT OF SPACE (ut9)OUT OF SPACE (ut9)ffree: Pointer not pointing to allocated area,&,0 ,8,B,H ,N,T,h,n,x ,,, , ,, ,,,,, ,",(,6,B,^,d ,,,,,,,,,,,.text&.data.bssSaveReg _fmalloc_malloc_ptrlist_fatal_ptrcnt_realloc_ffree_free_listsize_ffreeallfmterr.o/ 568282701 98 100 100664 660 ` u!NM .textXD .dataXX`@.bss@~<pX'H~<@@W @(#)fmterr.c 6.1 87/11/24 @(#)defines.h 6.1 87/11/24 format error at line %u (co4)D& D( D.D4 D8 D: D@ D.textX.dataX`.bssSaveReg _fmterr_fclose_Error_sprintf_fatalgetline.o/ 568282707 98 100 100664 896 ` u!NS| .text  .data  p@.bssH@~DpL'X\:HHL\ <<"|XvX"q`\"&8'<  t2"|0X "|H8<@M"~Dǎ@HHW @(#)getline.c 6.1 87/11/24 @(#)defines.h 6.1 87/11/24 premature eof (co5)corrupted file (co6)(:     .text .data p.bssSaveReg _getline_putline_fgets_fclose_fatal_fseekgf.o/ 568282712 98 100 100664 788 ` u!NX8 .text .data`T@.bss((> (0`d:(,^`^0^t^4^h^8<@( : 8lr !l( 0R(W @(#)gf.c 6.1 87/11/24 @(#)filehand.h 6.1 87/11/24 /usr/lib/M2/DBBD/.fred/.FRED"(lv  .text .data`.bss(SaveReg _gf_cat_sweep_strrchrlogname.o/ 568282716 98 100 100664 524 ` u!N\ .textH .dataHH @.bsshh8 ȧ~4pގp  ~488W @(#)logname.c 6.1 87/11/24  $ .textH.dataH .bsshSaveReg _logname_getuid_getpwuid_endpwentnewstats.o/ 568282721 98 100 100664 622 ` u!Na .textxT .dataxxP@.bss`P~TqZ%^Z^(^Z^,^Z!0s^0~TǎP``W @(#)newstats.c 6.1 87/11/24 @(#)defines.h 6.1 87/11/24 %c%c %s/%s/%s &TBTR T\ T.textx.dataxP.bssSaveReg _repeat_sprintf_putline_newstatspermiss.o/ 568282729 98 100 100664 2502 ` u!Ni.text$3 .data@.bssX<@DH~L Rȓb  !q"p* Rv"pd*!Tp  "pp'U!  ~LǎHǞDǮ@Ǿ<XXWP@DH~Lq qaq px l p Rpqqq (pq'qf!O~LǎHǞDǮ@PPWH~Dp"pГ  8'0("  8p'0("PD , ~DHHWH< ~@qa PDDD7 ! 7 .Dp@ p~@ǎ<HHW @(#)permiss.c 6.1 87/11/24 @(#)defines.h 6.1 87/11/24 %dnot authorized to make deltas (co14)release %u < %u (floor) (co15)re    lease %u > %u (ceiling) (co16)release `%d' locked against editing (co23)SCCS file locked against editing (co23)*$2 $>$D $X $z $ $ $$$$$&$$$$$$$$$$8$>$B$D$R$d$f$l$r $v$x$~$$$$$$$ $$$$$$$$H$N$T $l$r$.text3.data.bssSaveReg _logname_getgid_sprintf_repl_strcmp_strend_getline_fmterr_doflags _Sflagsh_strlen_fmalloc_cat_permiss _fatal_patoi_Error_ck_lock_satoi_l_strp_finduserpf_ab.o/ 568282736 98 100 100664 1216 ` u!Npl.text .data`d@.bss88P@D0H~L~P ΋qy pqpqz  ($ )X  !:q0&p48<  r  y i6qx4$ qqqx0qx8  qqz qx<~LǎHǞDǮ@PPW @(#)pf_ab.c 6.1 87/11/24 @(#)defines.h 6.1 87/11/24 bad p-file format (co17)4b t     *.text.data`.bss8SaveReg _pf_ab_cat_sid_ab_index_strncpy_fatal_date_ab_Datep_strlen_fmallocputline.o/ 568282744 98 100 100664 2251 ` u!Nx.text,6 .data@.bssH<@~D1qhx   pp ((LL x\ppN2 @"@q@~Dǎ@Ǟ<HHWpP~Tp1^(jl~(dtj(^|Vj!00#7@27@! d!00#7@27@! ^1 02'@#'@! '@ !XhX^X!0h^(6^j^(^d^,^^!0s^0bT~TǎPppW8Ȇ  88W @(#)putline.c 6.1 87/11/24 @(#)defines.h 6.1 87/11/24 fputs could not write to file (ut13)%5u%05.5u%05.5u%05.5u%c%c%s %c%c %s/%s/%s (,*,4 ,6 ,< ,H ,L ,N ,\ ,h ,p,x,~, , , , ,,,,,,,,,,b,d,l,~,,,,,,8,>,H,L,N,Z,j,r,t,,,,,,,,,,,.text6.data.bssSaveReg _putline_Xcreate_Statbuf_stat_auxf_xcreat_fdfopen_Xiop_setbuf_chown_fputs_fatal8_rewind_sprintf_zeropad_fprintf_fclose_xrm_flushline rdmod.o/ 568282753 98 100 100664 2176 ` u!N.text, .data@.bssXDHL~PǨ"xx\\qMDD0p"x40"h8DPHx @^(:"x0*"h8DPXx P^(F*q IDE q TTQ"d%Q ET~T(P!!8 I ! >T@ (94 I   >T@ (9N6[T`~PǎLǞHǮDXXWX<@DHLҧPç~TyT wpp    x  "*TP  "x"x   ~TǎPǞLǮHǾD@<XXW8 ȧ~4p1T!4 "x"x12,~488WTN  D!M!M!4 !"d ! !$ !( ,  MW 1~ I " D   @^0 pI7 010 pD700p7$0 pD7 ǀ @@0 pI70$@@~ǎW @(#)rdmod.c 6.1 87/11/24 @(#)defines.h 6.1 87/11/24 beginsco25endsco26premature eof (co5)Inex conflict %s at line %u (%s) j,r,x,,,,,, , ,2 , ,,,l ,t,R,h ,.text.data.bssSaveReg _readmod_fprintf_fmterr_satoi_remq_addq_getline_fatal_fmalloc_chkix_setkeep_ffreesetup.o/ 568282761 98 100 100664 1194 ` u!N .text .data@t@.bss((X?@DHLP~TpP "dǐ̋Z'P'"d '"d'P!!'"d'4$"dg[+' l%# D%! ?Qa1`&! 7Rb1@&# 3Td1 &' 1Xh1 P >'P7"dB~TǎPǞLǮHǾD@XXWX?@DHLP~Tq g(! H g(! 2 i  x ‹ @χ,Dwp}~TǎPǞLǮHǾD@XXW10  !    0 ! W @(#)setup.c 6.1 87/11/24 @(#)defines.h 6.1 87/11/24 ~.text.data@.bss(SaveReg _setup_fmterr_condset_ixgsetupsid_ab.o/ 568282767 98 100 100664 568 ` u!N .textT .data@@.bss@ ~<q 0.! 0.! 0.! ~<@@W @(#)sid_ab.c 6.1 87/11/24 @(#)defines.h 6.1 87/11/24 T:TVTrT.text.data@.bssSaveReg _sid_ab_satoisid_ba.o/ 568282773 98 100 100664 584 ` u!N .textd .dataP@.bssH@~D 8qȓԋqq(8 !Гqq~Dǎ@HHW @(#)sid_ba.c 6.1 87/11/24 @(#)defines.h 6.1 87/11/24 %u.%u.%u.%u(d.dVd\d.text.dataP.bssSaveReg _sid_ba_sprintfsidtoser.o/ 568282779 98 100 100664 514 ` u!NT.text .data@@.bss 1~"d@@Js"dpǂx,pǂx pǂx r @~ǎW @(#)sidtoser.c 6.1 87/11/24 @(#)defines.h 6.1 87/11/24 .text.data@.bssSaveReg _sidtosersinit.o/ 568282786 98 100 100664 1404 ` u!N.textp .datapp@.bssH<@~Dp"  ē |L"^ RX\@X *zܓ  hX8 <~Dǎ@Ǟ<HHW @(#)sinit.c 6.1 87/11/24 @(#)defines.h 6.1 87/11/24 s.too long (co7)not an SCCS file (co1)more than one link (co3)*2 DJ V bh tz   $,8J.textp.datap.bssSaveReg _sinit_zero_strlen_fatal_sname_imatch_cat_xopen_fdfopen_setbuf_Statbuf_fstat_getline_fclose_fmterr_satoistats_ab.o/ 568282792 98 100 100664 674 ` u!N .text| .data@<@.bssH<@~Dy\ qq s  q pqpqn~Dǎ@Ǟ<HHW @(#)stats_ab.c 6.1 87/11/24 @(#)defines.h 6.1 87/11/24 (|N |p | | |.text.data@.bssSaveReg _getline_fmterr_satoi_stats_abxcreat.o/ 568282798 98 100 100664 1020 ` u!N.text .datapL@.bss00H@~DpJ j   &.J~t $X~Dǎ@HHW @(#)xcreat.c 6.1 87/11/24 @(#)defines.h 6.1 87/11/24 directory `%s' nonexistent (ut1)xcreat&4 < > D T V ^ ` fp t v |.text.datap.bss0SaveReg _xcreat_cat_dname_Statbuf_stat_Error_sprintf_fatal_unlink_creat_xmsgxmsg.o/ 568282805 98 100 100664 1180 ` u!N.text| .data@.bssH 1~D$> : H ~dpXphzr~J f'pR  >6p,p  pȓ~DHHW @(#)xmsg.c 6.1 87/11/24 @(#)defines.h 6.1 87/11/24 no file (ut3)`%s' nonexistent (ut4)directory `%s' unwritable (ut2)no space! (ut10)write error (ut8)errno = %d, function = `%s' (ut11)||n|x |z || | | | | || ||||| | || | |.text.data.bssSaveReg _xmsg_errno_Error_sprintf_cat_dname_fatalu!R ~H~H~H~@~@~H~H ~H P~H  $%~H f ~H!~H"~@1~@#~HO~@~@~488W@80~<q~H ~@. !7 ,,!4~<ǎ8@@W@8~<pހ~P&( (~<ǎ8@@W8(H88WP 0\# ^ . @ P-QP- W?0@DHLP ~TǢqjQώXH  \  ^ 0(B 9() 6 0p'!"D$< @&@, h  " X!ώX~TǎPǞLǮHǾD@WH@~DրpR  ' !VH8.T<PD~H 'q Hx ~Dǎ@W0  ~@(  00W8X88W@@~Dq*pГ:>.H pv`,F ̓p" 0.pZphp \ 8:Г ~Dǎ@@@WH~<p@Vp@x ~<Wp ~8q>>.Q%0A(# %0Z(# %0 #!! >~8pVpWVW !0 1 Wp:[BX?@DHLP~Tp-r-b 0-p$- -x --p  p-p q-  ( ^02 8! 01'q2! 'q/ !' :Gq21304!:'q.@,/ @h-- -P-q9(9#0@@5601 0- -) &~TǎPǞLǮHǾD@XXWH@~D& 'pp pp&H  4l" $p   h! ~Dǎ@HHW!2! W!21!0W! W!120WAZ WX?@DHLP~Tr8     *8  ' p#7! ` ?  ~TǎPǞLǮHǾD@XXWH@~Dp W & !   D 6ހ  @  $(  ! p!#!7  R   .   W    ~Dǎ@HHW8 ȧ~4p.q$(~488W@8~<pp ~W  < r v&    ~<ǎ8@@W8 ȧ~4p T g "Q%(   ~488WH<΀ ~@q R  Bb p#'(! ,>     BG G!    g   ,Q"%(  D b j D p     ~@ǎ<HHWH<@~DpǐLJ D   p#  p#' (. (   ~Dǎ@Ǟ<HHW8 ȧ~4p  *        |'Q!R D D p#%  ' p#7! ,~488W@8~<p  ( ppPW#( pp$ȧ#^̧*    p#& ppPW#6W @  ~<ǎ8@@WP pR# a!` !W@~<p.`W .`&0 2  &'   ~<@@W`DHLPTX~\q  *"(  D    p#   Ǘ  8vІ ρ  ' p#7! (0 @ p 0 *> F (~\ǎXǞTǮPǾLHD``W@\.`P.\(0 2 ܋ . Г   @@WP.p0>@DH".L @.M.p.@ h.DPPW[W![W[WC2!,[W2![W[h&W &[<&&W2![W& W@8~ PPWP48<@DH~L.`H.h! .`.`! .h.h.t.`.p.t.|ր.pqpN$.p.| .|x((lx! ( 2.t.`  !(hր.|x.tp0qp((q$.t .|sqp'( (&    .tp.|p  P.t! .`!.t xF p.p(P.p.x.p .|.p.|~LǎHǞDǮ@Ǿ<84PPW.p! !.t! .|WP<@DH~Ly   s  Rq(+p#((p(psp.x~LǎHǞDǮ@Ǿ<PPWA~"t0As3r21~W0+K "AC1!WAC$AhAC%hAC&hACWQWPX%AC1QCGxBBSD"vt ('"AC8('p'"$AC4$X$AhAC!FhAC" QP&#1qA@Aq@/@p/`/ #H / @ & /  ! / g `h`/ 0#.0/,@/0ȧN(.r.8. /,`/  FF=11=CCAM 0AMAP/,VA@/ E@/ p/}@.g/d``//  >  / /// @.p../+,/(0/(Vְ/(zkg(P/$(VPp: w q&+,/(0/(ְ/(@.p..@ekd,/$( .DA4.,/(0/(..ְ/( ֠/./+,,/(0/(Fְ/(Jkd(P/$(VP@:0D A&+,,/(0/(ְ/(.pTkg(/$( wq( ,/(0/(ְ/(     / ֠/./+,,/(0/(@ְ/(Jkd*P/$(VP@<0D A&+,,/(0/(ְ/(. fp/p\kg,/$( .wq,.,/(0/(tְ/( ֠///+,/(0/(,ְ/(Jkd*P/$(VP@< D A&+,/(0/(ְ/(H{ p   /$( @  &@ , 2 ! . 00  +   J  p.ؐ.ذ...WP@DH~Lr @D''!'N )7H)\ ~LǎHǞDǮ@PPW2!6[WPHx~Lp(,j~LǎHPPWPHx~Lp(,"~LǎHPPW`?8<@DH~Lp.ޠ//:T 2p/ p///p  :X ސ+ /Jp  C@:8 6p  : @$:@$ 1 P@$`^P5%cR:W^XP'86 0":B0C9"5 4r+!+ @$0:  ?05N?:@ 5p  5 @$0:  /( /( /:/( 0 &009 4 @$05p (  5(T/ &1/  &0   9( ~LǎHǞDǮ@Ǿ<8`/`W   ?  ?0 6    W6    WX<@DHLPҧ~TsRNW  ( ( D ٺ \ pױ#'(R (> )@     ,f   aP/\ +! (() )((  ' p#7! pBW  D ,,-V ה ~TǎPǞLǮHǾD@<XXW0@ A#1 ! 1W @(#)macro.c 6.1 87/11/24 parametre incorrect .%d%s%s endm plus d'espace memoire disponible ifcifcendcifeqifneifeqifncmacro~P0 @(#)index.c 6.1 87/11/23 @(#)ctype.c 6.1 87/11/23 ((((( H @(#)mon.c 6.1 87/11/23 PROFDIRmon.out @(#)perror.c 6.1 87/11/23 : Unknown error @(#)tolower.c 6.1 87/11/23 @(#)data.c 6.1 87/11/23 # @(#)fgets.c 6.1 87/11/23 @(#)stdiom.h 6.1 87/11/23 @(#)filbuf.c 6.1 87/11/23 @(#)flsbuf.c 6.1 87/11/23 @(#)stdiom.h 6.1 87/11/23 @(#)fprintf.c 6.1 87/11/23 @(#)fputs.c 6.1 87/11/23 @(#)stdiom.h 6.1 87/11/23 @(#)printf.c 6.1 87/11/23 @(#)sprintf.c 6.1 87/11/23  @(#)errlst.c 6.1 87/11/23 ''''8'H'`'l'''''''(((4(@(L(`(p((((((()))()@)P)\)t)))))***,*L*h*x.Error 0Not ownerNo such file or directoryNo such processInterrupted system callI/O errorNo such device or addressArg list too longExec format errorBad file numberNo child processesNo more processesNot enough spacePermission deniedBad addressBlock device requiredDevice busyFile existsCross-device linkNo such deviceNot a directoryIs a directoryInvalid argumentFile table overflowToo many open filesNot a typewriterText file busyFile too largeNo space left on deviceIllegal seekRead-only file systemToo many linksBroken pipeArgument out of domainResult too largeNo message of desired typeIdentifier removedChannel number out of rangeLevel 2 not synchronizedLevel 3 haltedLevel 3 resetLink number out of rangeProtocol driver not attachedNo CSI structure availableLevel 2 haltedDeadlock condition if locked @(#)getenv.c 6.1 87/11/23 @(#)isatty.c 6.1 87/11/23 @(#)malloc.c 6.1 87/11/23 @(#)memccpy.c 6.1 87/11/23 000000000000000000000123456789abcdef0123456789ABCDEF @(#)dowrite.c 6.1 87/11/23 @(#)print.h 6.1 87/11/23 @(#)ecvt.c 6.1 87/11/23 Fn CAy7Aׄ@È@Y@$ @(#)fwrite.c 6.1 87/11/23 @(#)stdiom.h 6.1 87/11/23 @(#)memchr.c 6.1 87/11/23 u!b r+8-8.textr .data+8r@.bss==-8. 0  !2$0 +z>J[W@P 0 PP(pR5P0EP`#4I@@WH~DPPpP.0PP(%'K8ppP~DHHWP@DH~LzPPP0P(%u!(# "!P P"0P!#0P20PP!P7!q2'(( P(pP P!PppPP'q PPpRQ0(QhQpQpPpQxQP0 H "PQh~PP(P(QqpבP0pסP` Qp!P0 Qp!P`Q PP(pR(P0P`  ) qpQhQ QQ؆P8 8XQ :>P(P(pQP(pRRHV~LǎHǞDǮ@PPWH@~DPpP RxqP |(! @0!#(! pxW (!  (! ܋D!ҋ Qhq(6phq P"q, Qhq(pċ`q = . Qhq(pȋ q =' . Qhq(jpqP(p!P0!!P00 Qhq(p q q *zQR"PfPP Rq *q /  Qhq(RpP^pt P !Vq *!q /!pPprpPpPq /!q *!p*DxP(p!P0!!P0RTPJ!!!  PP<Qh(ZpP(p#q0 ` QPŶpPpPP(p!P0!!P0 RxSQP6pPdP(Pp%!P0PPPP0!,+0##'!7q #  QhqpP(8p d Rq Qhq(p\P  Tq0R!#"!  Tq0R!#"! ` Tq0R!#"! 0 Tjq0R!#"!  T  6q0R!#"!  T q0R!#"!  T @ q0R!#"! d T  Rq Qhq("PqJ, Qhq(PqP :U q@ Rq Qhq(p RxS  ~Dǎ@HHW8P!PH P"0U#"!88W@8~<PdQրQhPL"QhP*P(pP P!QpQppqQxxq xV  x(:Q /nx!xPpqPQh!(( 1'q2" Qh(! P!PpqQ0PqQh!((pQh q!' P(! P(PPPPPP~<ǎ8@@WPﰧ<@DH~LpfPpώP!P <PPpPpPPpqRP >4 P(1PP(݋PPnP "J 0P(PP( " 0XPPpPpPtPpPPPŽ P(Dx V0#"(8dQ ," RHpP / P/z* /j ,. P.P(p (5 Q(P(P(pQcpPPP(pR!%P0P`P(xp  RHR켋vpQh(P(PpP~LǎHǞDǮ@Ǿ<PPW@80~<r '-V~<ǎ8@@W@DHLPT~XPRV^x(T Px^P PpP U4" P p!bP^܆P^PxA8 $0T1 21 A(P^춠P PpP ($Ϟ\\ pP4P(p!P0!!P0  ) , U$ȡ f(&ء <ħ'q!( !^Q^^P Q^&P(p!P0!!P0րxѶRP P pP \jb ѡ!!!!  ,"!2!!t U  J ѡ /r *fVqJ!!!  +"!2!!( UX> *((>\s!z!.\(j " 'TW%^q!&r\ \P!!!  *ڋ !2!!q'q!( Ry( R> )P((>\s!y!.\('q!(('n&͋r\ \P!!!  ) !2!!q'q!(j^ضPR ^Q !Ǟ ' VP(p!P0!!P0P(pP0P0^ ǎ^PPpP x~XǎTǞPǮLǾHD@WH<@~DPRPRx^PQPPSPRxPP #!PQPPP 0 P! P @!$PF H!"P P!nPPP  P! P XXPPD `!nPPP ( P! P XXPP h!RPP ⠋,XXx p!zP4PPXX.:XQ PPX x!BP4P>P!PP 《!JPU"XXPPրU^ ㈊!PP PPPP #x!qQh(pPq U!*q'0&#"$ ! P(p"P0  qW UZ "8ԋ֐xq " 2L'! ! xP(pP`!lP( xp!P`xvP 㐊!Qr 㘊! dPPPP<PP &PP`PPPPPPP8 82!08 R =& ( x2!0Qh*!PS8PRx88W80x # #! x ##88WPDH~LP(PrpP` p!P`('DP(p!P0('$((7'㨆(&(&Q Q~LǎHǞDPPW@0A@㨓@@W@ ~ϒɌz2l! L! Hꬍ * ]~LǎHǞDǮ@ Ǿ<PPWP?8<@DH~LDF`FdHHȶHжHضHH֠F`֐HրH H(JHp߱%p"q  HH HHqp k Rpq(p$ H2HDHH Hq!pHFH H!0#!(! 0H#q  pHp`WVHLp"qp4k,p(p$ pׁ(,Fh(~H lH@'pHp""$X210vs!pHpq#7p2p##ρkpׁ(p$'p#pׁ(ns!2p2:0H7p23#sp2p")3##ς k((p""(p""$7#'p""#p"ׂ( HжHȶH0F`#F!B!p""pW"4!! H!! H!! H!! H!! H!`! H!c! H!Q! H!P! Hz!X! Hf!Y! HR!R! H>!Z! H*! ! H! ! H! ! H1 0! H1!0 H! HHHpH^VHNH>H0H HH~LǎHǞDǮ@Ǿ<8PPWp[BX?@DHLP~TpMrMb 0 Mp$M MP MMp T IIpIMp qM  ( ^(  (! 01'q2! 'q/ !' :Gq21304!:'q.(,/ (MM MPMq9(9#0@@5601 0M M)~TǎPǞLǮHǾD@XXWH@~D./p(H pp/  (D"  (@!~Dǎ@HHW!1021!0W !  W!2! W!21!0W! W!120W8 ȧ~4p(x.q-(~488W@8~<pp ~W  < r  . 0 ~<ǎ8@@W8 ȧ~4p T g "Q%(   ~488WH<΀ ~@q R  Bb p,x'(! ,>     BG G! Ў    g   ,Q"%(  D b j D p     ~@ǎ<HHWH<@~DpǐLJ D   p,x  p,x' (. ( L   ~Dǎ@Ǟ<HHW8 ȧ~4p  *        |'Q!R D D p,x%  ' p,x7! ,~488W@8~<p  ( ppPIW,x( pp-,x^ *    p,x& ppPIW,x fW @  ~<ǎ8@@WP pR,x a!` !WH@~Dq$ l~Dǎ@HHWH<@~Dr '$~Dǎ@Ǟ<HHWH<0@~Dr 0 (+R a(a( <r NwX   @   "    t  )r!  )a!"  p,x~Dǎ@Ǟ<HHW@~<p.`W .`&0 2  &'.  ~<@@WX?@DHLP~Ts @   aP/\ (  )   ' p,x7! X (  <~TǎPǞLǮHǾD@XXWX<@DHLPҧ~TsRNW  ( ( D  \ pױ,x'(R (> )     ,~   aP/\ +! (() )((.  ' p,x7! BW  D ,,-~  ~TǎPǞLǮHǾD@<XXW@48~<p P     Z   & pp-,x$ ppPIW,x2 p,xj @  ~<ǎ8Ǟ4@@WP.p0>@DH".L @.M.p.@ x.DPPW[W![W[W2![W2![WC2!,[W[h.W .[<..W2![W.W@8~ PPWP48<@DH~LN`HNh! N`N`! NhNhNtN`NpNtN|րNpqpN$NpN| N|x((lx! ( 2NtN`  !(hրN|xNtp0qp((q$Nt N|sqp'( (&    NtpN|p  PNt! N`!Nt xF pNp(PNpNxNp N|NpN|~LǎHǞDǮ@Ǿ<84PPWNp! !Nt! N|WP<@DH~Ly   s  Rq(+p#((p(pspNx~LǎHǞDǮ@Ǿ<PPW0@ A#1 ! 1W0+K "AC1!WAC$AhAC%hAC&hACWQWPX%AC1QCGxBBSD"vt ('"AC8('p'"$AC4$X$AhAC!FhAC" QP&#1qA@Aq@O@pO`O #H O @ & O  ! O g `h`O 0#N0O,@O0ȧN(NN8N O,`O  FF=11=CCAM 0AMAPO,VA@O E@O pO}@NgOd``OO  >  O OOO @NpNN/3,O(0O(ְO(zkg(PO$(VPp: w q&3,O(0O(ְO(@NpNN@ekd,O$( NDA4N,O(0O(NNְO( ֠ON/3,O(0O(ְO(Jkd(PO$(VP@:0D A&3,O(0O(|ְO(NpTkg(O$( wq( ,O(0O($ְO(     / ֠ON/3,O(0O(ְO(Jkd*PO$(VP@<0D A&3,O(0O(tְO(N fpOp\kg,O$( Nwq,N,O(0O(ְO( ֠OO/3,O(0O(ְO(Jkd*PO$(VP@< D A&3,O(0O(`ְO(H{ p   O$( @  @ , 2 ! . 00  +   "  pNؐNذNNNWH@~Dp HW & !   D 6ހ(x  @  ,-(  ! p!,x!7 R   .   W    ~Dǎ@HHW(x -(  WP@DH~Lr @D''!'ږ )7x) ~LǎHǞDǮ@PPW2!6[W2![pWPHx~Lp(,j~LǎHPPWPHx~Lp(,"~LǎHPPW`?8<@DH~Lp.ޠOO:T 2pO pOOOp  :X ސ4 OJp  C@:8 6p  : @$:@$ 1 P@$`^P5%cR:W^XP'86 0":B0C9"5 4r+!+ @$0:  ?05N?:@ 5p  5 @$0:  O( O( O:O( 0 &009 4 @$05p (  5(TO &1O  &0   9( ~LǎHǞDǮ@Ǿ<8`O`W   ?  ?0 6    W6    W @(#)cpp.c 6.1 87/11/24 # %d "%s" token too long%s: unterminated macro callUnexpected EOF in commentProblems with writing output file; probably out of temp space xDDD xDDDDDDD DD((DD DtDD D D%s: too much pushbackno spacetoken too longr/bad include syntaxUnreasonable include nestingno spaceCan't find include file %stoo much definingillegal macro name%s: missing )bad formal: %stoo many formals: %s%s redefinedIf-less endifIf-less elsebad number for #linebad file for #linebad file for #lineundefined control 1 %s: %d: (in preprocessor if) too many defines%d%s: argument mismatch%s: macro recursion"%s"%s: actuals too long...////L//////.v/.///ifwr.* _ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz01234567890123456789. "'/\ "'\ too many -D options, ignoring %stoo many -U options, ignoring %sexcessive -I file (%s) ignoredunknown flag %sNo source file %sCan't create %sextraneous name %s/usr/includedefineundefincludeelseendififdefifndeflineclassidentunixridge__LINE____FILE__command lineProblems with output file; probably out of temp spaceV(x("P" @(#)yylex.c 6.1 87/11/24 <\ ==!=<=>=<<>>&&||   bt n f r \\+-*/%<>&^|?:!~(),definedIllegal character %c in preprocessor if"defined" modifying non-identifier "%s" in preprocessor if88888888888888888888888888888Illegal number %s;(;4;4;<<<= = =4=H=\=p=======>>$>D>d>>>>>>>>?yacc stack overflowsyntax error,<> -<> .<> /<> 0 1 #:  <  9 ;      !                   "%&'()*+,-./012345678$=  llaaLCC7)  $  -!~(*/%+- <>&^|  ?,():) @(#)ctype.c 6.1 87/11/23 ((((( H @(#)mon.c 6.1 87/11/23 PROFDIRmon.out @(#)perror.c 6.1 87/11/23 : Unknown error @(#)data.c 6.1 87/11/23 I I I(K[ ,x @(#)flsbuf.c 6.1 87/11/23 @(#)stdiom.h 6.1 87/11/23 @(#)fopen.c 6.1 87/11/23 @(#)fprintf.c 6.1 87/11/23 @(#)fread.c 6.1 87/11/23 @(#)stdiom.h 6.1 87/11/23 @(#)fwrite.c 6.1 87/11/23 @(#)stdiom.h 6.1 87/11/23 @(#)setbuf.c 6.1 87/11/23 @(#)sprintf.c 6.1 87/11/23 k( @(#)errlst.c 6.1 87/11/23 ////000$0@0T0h0x0000000111(181H1\1p1111111222,2@2\2p2222233 30.Error 0Not ownerNo such file or directoryNo such processInterrupted system callI/O errorNo such device or addressArg list too longExec format errorBad file numberNo child processesNo more processesNot enough spacePermission deniedBad addressBlock device requiredDevice busyFile existsCross-device linkNo such deviceNot a directoryIs a directoryInvalid argumentFile table overflowToo many open filesNot a typewriterText file busyFile too largeNo space left on deviceIllegal seekRead-only file systemToo many linksBroken pipeArgument out of domainResult too largeNo message of desired typeIdentifier removedChannel number out of rangeLevel 2 not synchronizedLevel 3 haltedLevel 3 resetLink number out of rangeProtocol driver not attachedNo CSI structure availableLevel 2 haltedDeadlock condition if locked @(#)getenv.c 6.1 87/11/23 @(#)isatty.c 6.1 87/11/23 @(#)malloc.c 6.1 87/11/23 @(#)memchr.c 6.1 87/11/23 000000000000000000000123456789abcdef0123456789ABCDEF @(#)filbuf.c 6.1 87/11/23 @(#)findiop.c 6.1 87/11/23 @(#)dowrite.c 6.1 87/11/23 @(#)print.h 6.1 87/11/23 @(#)ecvt.c 6.1 87/11/23 Fn CAy7Aׄ@È@Y@$u!: K7 .textK .data  K@.bss7 0  !2$0  "b[W8   (!BƴeB\ޓ$p<[.; b88W8/88W8 /~88W@ ` +2"`~@@W8Ȇ0088"-O$ FFrLԓ.j:-L -B88W@~<pȈ@L N2Ȉ2,~<@@WH<@~Dqۊ@N.Z ,N LLJj L    , 4΀ w' +q+~Dǎ@Ǟ<HHW@8΀ ~WD. W((W*fPP`.WjW   XԐ R؆hǞP@I   `!H `:!,`.P`V~LǎHǞDǮ@Ǿ<XXWWWWH  @ W8u@ @88WWW`R WXDHnLPHP8~TQa1. SpnP88Qa1. RnP(8Qa1. RnP8Qa1. RxnP8Qa1. RH H 1&  1%H 1%H  1% 81%  1% (1% 1%bnP 8Qa1. Q` @(1%nP 8Qa1. Q (1$nP 8Qa1. P (1$nP 8 Qa1. P| (1$8pH t ~TǎPǞLǮHǾDXXWhWHW@WWWи WWWWWW8 0 B( (BpBDXWD2 2022  02222 f0R0s 3Td0Fh0:2 22,2 0s Dz0zv00s <z08z0 T0s Hz 0\z@0@02s $z@ T0288W@4~8pp Dp  B<sqss><73c110@"RsY  ~@~8ǎ4@@W@8~<ppz!z ^ D0 ~  .]!    ~<ǎ8@@W@<~8 <~<qH~8@@W0  1D(818(<1(0<(< 00W@ ~<q Ghr~<@@WpDHLPTX>~\]xXoLC8  &     |^^]Xh*$ 1z      FB؎$ 1Zn CF , 1* E4 x( 1 E p+΀ΐ    P^l`K Г{\>?<F `  t` `nl` Pl`,hrB  UhǺ UTǻ^h[ h [6`` ,^lPR  'x)     v h  'x) ^l  2^l   _ZL(p_Y y,Z( F~\ǎXǞT ǮPǾLHDppW80 0A  @ r88W8  @88W@8~<p~<ǎ8@@WPDH~Lq}H    'x)   2y Xp "   ~LǎH ǞDPPW@8~<qLj : Lj( :Lj ~<ǎ8@@W@< < <@@WpLPTX\`~d?Rq pvtBiFzt=   njv4^W.jtʋNJ ^V  xxx , t t@tZt=" t?΋*  rt?, ^V  xxx , t x^P^^ P^^^(^p.l>|^, l xn΀ΐvǾtW>| t!   $t" Ԇtٓ yl yX Ǫ   @  t WTj  8Г  l h hh hh*"hєx84j .h   < s 0>h" #1x .h2`       *s x    z` t枋. hZ`  s   'x)    6єx6x xhx hxxt88  v t ;+Rr_ x_RNGx6x  Ϙ~dǎ`Ǟ\ǮXǾT PLWh<@DHLP~Tp#>ΰ@Π?PЧ^\^d^` XEQx"(~FQL"(RIQ "(&HP"( VGPȆ"(*BPd ыAPxd Q^dDPPQ^`CP88PpX9OXhZ:O0X@2;O\X <O|X=OTXȋ 4X  2Xn`^\P@X8.Q^\0,s X(X8Q^`vXX "d ѧXQ^`X(&d XQ^d^`tX XQ^`RXd <X,Xd Q^dXl$.X X^`PzX X8XL Xʋ2^dP(XXXXX0Xb,XJX6fpXL^dPB.X uX4XX薧XX~TǎPǞLǮHǾD@<hhW@8~<pp  @ s   'x)    x WsY0(   @ ԑ   @ s~<ǎ8@@W@~<p~<@@WH@~Dp 6 x &Lj--nPH8Qa1. 6x  (s x (~Dǎ@HHWH<~@p!p rΧ  |p h *ۺLJ \ x  W asi~    x  !0s)' 1x 10X ` xTD Qs1s3.D#"c!! u~@ǎ<HHW?HLPTX~\pXfxҔF(( s ZZ ΐ+΀** ǻ^p^(^xd.h>l^, dl p^:>lt    v +  hxx  t  FD%v΀+ΐZ`)) ǻ5 EE  EZEr*ps6  $    /x/x% $ xx  xlF^$   /x/x% $d2$   /x/x% $$6(c` P(x p6 x WsYz    ttp p 0s 2!'x) 20 X h x$WsY ܈p*xp p 0s 2!'x) 20 \Cx]Cj`d&߬]B`> ``œմ`ǎ`*6(~\ǎXǞTǮPǾLHWXDHLP~Tp΀rpBl X>W  Z*a2+:ZAЋ, T1  `*0(.~TǎPǞLǮHǾDXXWH<~@px ^ 4D\d~Dc4HD~@ǎ<HHWH<~@p. x !dX DD*D0 Rr40 D<b! ~@ǎ<HHWH8<@~Dq969~Dǎ@Ǟ<Ǯ8HHWPD~Hq N0 1.t4&(0!(x+>L~HǎDPPW@8~<~<ǎ8@@W@8~<pH΀_q=p,΀_ А \=qp~<ǎ8@@WXDHL~Prp (Tr T  T! * T ! 4rq e 0'L2 2mV(eT 0!>~PǎLǞHǮDXXWDHLPTX~\pΐ ts s.t!cZR L8T0 2|  s   'x)  d"  | lrlcn `.6`h . >$~(d&, B͢cr ^:^    'x)  P^x xo _~ -0 9 (pB:2_:"+9 p-76ΰ_ ^Π    lْ llap>QQ^|La 0 p.|ȋ*a 0 p!: -0 9 (p p-7(2դ 8~t\x ~^x` Z T L'"" . $'"" ^x^xp^x^xǕ ޢ^x^x  @ ^x  p>x!^xe@qv@_ 0 p'V$  l  ɪ_l ' 0 9 (p:2_6"+6ΰ_ ^Π > ' 0 9 (pZ   rЅt_f ' 0 9 (pЎ6._5 +5zΰ_ ^Π : ' 0 9 (pV&  d l l1l(qsќ]2 0 p'8_4x*p_  SX4T^xP ~\ǎXǞTǮPǾL HDW`DHL~Pp΀  W& چ+ [  W    'x)  XL X~Xq[ 0 T' р22ŀaQsY:2 :' .\1~PǎLǞH ǮD``WH<@~Dp!p,(x$ ' H    R!  ! j  ,   '  ")~Dǎ@Ǟ<HHWP<@DH~LqP > $ !X#NјЧЧ  l d*  N[e Ze+""& 2šh  $Px x <x 2$Px x x 2Y$x\$x  /x/x% $  Qx]>x . !0x-/ 1xx 10 (xV Jx>   1 x61 !xx ! ~LǎHǞDǮ@Ǿ<PPWp?DHLPT~Xp s&ԋ  p (^^ $     /x/x% $ xx  "   ֋l  x ,QsY .hT h Ȇi x    .!x/x-  0  2!/x/x$ 20"   4I    .l0 NlFBt0 0t 2!/x/x$ 20  ,(l  hԎld  l^\ (  !`"T h6    ~֠   ht \bx RQsY (   þl   .l!x/x+ d`Ǻ^ܧ      0( y\  0  2!/x/x$ 20QsY   xx    >           wl  "~XǎTǞPǮLǾHDppW`PT~Xp r>\ \4.\0 7(,0 4:~XǎTǞP``WLPTX\`~d!($^t^(^xl.h>p^,Ԋ[ΐ+p S     !0x!! 1xxx 10  !0s)' 1x 10  h>lNp ,(N,Nt:N0" %3  ~dǎ`Ǟ\ǮXǾTPLWH~DR`ph . $   /x/x% $ƴ~DHHWH~DH    1Th 1Tض 1TH 1TH|`nP8Qa1. 8p 1T2(lP (1T(2S(1Sֶ0 2S 2S(( 2S (2Sn8 M@@Mζ@MPMF`  ```nPx8 Qa1. `( F0p    'x) PRgPՐ\;Qa1h&! 5Rb1H&# 2Td1(&' 0Xh1nPh8Qa1. p(4~DHHWWWH8<@~D"pΐ΀x pp.p p~Dǎ@Ǟ<Ǯ8HHW p!W@ ~<p Rp0ppp~<@@WWWW觎 ~rB2"3#"$"'"("!" ~ǎW觎~p@0 ~ǎW~pgP8 Qa1~WP?8<@DH~Lq^LB pΰ  \   B8  )  P B8  ) @ .8(@ !1R ~LǎHǞD Ǯ@Ǿ<8PPW8  n88W@1~p Jx (0 (r q " ~ǎǞWP48<@DH~Lppנt x (\ T L@  &      Ǫ~LǎHǞD Ǯ@Ǿ<84PPWH0~DqB'4$d~DHHW@ x/x!0 # @@W@@ x/x!0 # V  @@W@@ x/x!0 #   $x  @@W@~ oL _B H~8XXW8x . (` 88W p@p DW p@!! WH8<@~DPp΀pא@n xx pנ4ZP* xx xx pǙ~Dǎ@Ǟ<Ǯ8HHWH .8 <$@(D,8px䆀, .O e)PL .O (ml Lиpb^ZP.|0P@$OP O &P.|0PZ~LǎHǞDǮ@W8 ȧ~4mp\do0pڋ"mpn zmt ymb xmr }mf |mv {Pm0(7(~Pop0(b7(V mpsPoq0(*7(mpstq ~488WH8<@~D܎*j^V p΀>ΐ"08> 288܆  <m2 m mD `܆ ~Dǎ@Ǟ<Ǯ8HHW8 0 0 !~4mp q ~488W8 ȧ0~4p p(  p~4ǎ088W8  * H88W8  ~4P Rq p  ~488W~@,x0 .  1!qA~W8Ȏ“88WH<@~D  ((!p""0W"`܎*^Vp΀?؋\jL,؋6p؋ ؎܆ m'm'܆@m' Po0(.9("xn=-j$>&X!0\=..$<'"^ >$-"+%=(р+nv-PԋX&#08|$*t/T%4^ m>Bm>!ܓf=Lm<<>m<"==/Ҏ&)#|*$̎bHt0\D j~Dǎ@Ǟ<HHW0 Ћ 00W8Mȧ~4Pp80 GNnP6Qa1*<~488WH8<~@ܓpҋv*F>Dp m  րpJBpD*pDDlh nlhhmnooz\~@ǎ<Ǟ8HHW@8΀#~p܋m/o* ("΀*pΐ/jm o B~H m܎ߐ ެm o ~TNlfxm *dm\RoB܎8  6mp ~<ǎ8Ǟ4@@WX8<@D~HBɜnOP 8Qa1֐pаРܓ8䰠܎ ` ^O8Qa1pxF֐qy:  y qȴm m~HǎDǞ@Ǯ<Ǿ8XXW8 ȧ~4p  0  ^~488W@~<pJ " F   :6  "Ȱ~<@@Wp<@DHLP~T'zd⺧h .p` p P^d x  xt2yԋJQ^d\Pܡ^cP^l 暓δX戋^l΀Xΐ+pZQ^l4   ~  \\D\ 0 -  Z+Z! nl`Óx^ctPtXߢXXhp ln hpmnoPtPlp\po0*hhd~TǎPǞLǮHǾD@<ppW8 ȧ~4Pl(p2(d׺lppm &pא0w tp~488WH8<@~D (ȶ܆ p΀ΐpm~uhp0pܼ  m momh*Pl (0p!po2lp pv ohhppm  @mpC~Dǎ@Ǟ<Ǯ8HHWH~D "  Ŵ(p& 0~DHHWH@~D$HHWH`@~Dh . hp41p!@ ʋpǀ~Dǎ@HHWH~D   ! 00!1 9( a0!1 z( A0!1 Z(WX,\]^_  +Z[ 6Y`P%'Æ ^%# >%! >Qa16Rb1`2Td140Xh1  `Px%' l%# D%! >Qa1&! 6Rb1p&# 2Td1<&' 0Xh1  `Ph%' l%# D%! >Qa1&! 6Rb1p&# 2Td1<&' 0Xh1  `PX%' l%# D%! >Qa1&! 6Rb1p&# 2Td1<&' 0Xh1  `PH%' \%# <%! >Qa16Rb1h2Td1<&' 0Xh1  `"P8%' d%# <%! >Qa16Rb1p&# 2Td1<&' 0Xh1  `P(%' l%# D%! >Qa1&! 6Rb1p&# 2Td1<&' 0Xh1  `1P%' l%# D%! >Qa1&! 6Rb1p&# 2Td1<&' 0Xh1  `P%' l%# D%! >Qa1&! 6Rb1p&# 2Td1<&' 0Xh1  `MP%' l%# D%! >Qa1&! 6Rb1p&# 2Td1<&' 0Xh1'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~  `OP%' l%# D%! >Qa1&! 6Rb1p&# 2Td1<&' 0Xh1  `P%' \%# <%! >Qa16Rb1`2Td140Xh1  `P%' l%# D%! >Qa1&! 6Rb1p&# 2Td1<&' 0Xh1  `֋P%' l%# D%! >Qa1&! 6Rb1p&# 2Td1<&' 0Xh1  `֚P%' d%# <%! >Qa16Rb1p&# 2Td1<&' 0Xh1  `P%' l%# D%! >Qa1&! 6Rb1p&# 2Td1<&' 0Xh1  `kP%' l%# D%! >Qa1&! 6Rb1p&# 2Td1<&' 0Xh1  `zPx%' d%# <%! >Qa16Rb1p&# 2Td1<&' 0Xh1  `؉Ph%' l%# D%! >Qa1&! 6Rb1p&# 2Td1<&' 0Xh1  `PX%' \%# <%! >Qa16Rb1h2Td1<&' 0Xh1  `PH%' l%# D%! >Qa1&! 6Rb1p&# 2Td1<&' 0Xh1  `ָP8%' \%# <%! >Qa16Rb1`2Td140Xh1  `֩P(%' l%# D%! >Qa1&! 6Rb1p&# 2Td1<&' 0Xh1  `@P%' \%# <%! >Qa16Rb1`2Td140Xh1  `mP%' l%# D%! >Qa1&! 6Rb1p&# 2Td1<&' 0Xh1  `P%' l%# D%! >Qa1&! 6Rb1p&# 2Td1<&' 0Xh1  `P%' l%# D%! >Qa1&! 6Rb1p&# 2Td1<&' 0Xh1  `P%' d%# <%! >Qa16Rb1p&# 2Td1<&' 0Xh1  `!P%' l%# D%! >Qa1&! 6Rb1p&# 2Td1<&' 0Xh1  `?P%' l%# D%! >Qa1&! 6Rb1p&# 2Td1<&' 0Xh1  `NP%' l%# D%! >Qa1&! 6Rb1p&# 2Td1<&' 0Xh1  `]P%' l%# D%! >Qa1&! 6Rb1p&# 2Td1<&' 0Xh1  `lP%' \%# <%! >Qa16Rb1h2Td1<&' 0Xh1  `{Px%' l%# D%! >Qa1&! 6Rb1p&# 2Td1<&' 0Xh1  `׊Ph%' d%# <%! >Qa16Rb1p&# 2Td1<&' 0Xh1  `יPX%' l%# D%! >Qa1&! 6Rb1p&# 2Td1<&' 0Xh1  `׷PH%' l%# D%! >Qa1&! 6Rb1p&# 2Td1<&' 0Xh1  `P8%' l%# D%! >Qa1&! 6Rb1p&# 2Td1<&' 0Xh1  `P(%' l%# D%! >Qa1&! 6Rb1p&# 2Td1<&' 0Xh1  `P%' \%# <%! >Qa16Rb1h2Td1<&' 0Xh1  `P%' l%# D%! >Qa1&! 6Rb1p&# 2Td1<&' 0Xh1  `P%' d%# <%! >Qa16Rb1p&# 2Td1<&' 0Xh1  `P%' l%# D%! >Qa1&! 6Rb1p&# 2Td1<&' 0Xh1  ` P%' \%# <%! >Qa16Rb1`2Td140Xh1  `/P%' l%# D%! >Qa1&! 6Rb1p&# 2Td1<&' 0Xh1  `>P%' l%# D%! >Qa1&! 6Rb1p&# 2Td1<&' 0Xh1  `\P%' \%# <%! >Qa16Rb1h2Td1<&' 0Xh1  `P%' d%# <%! >Qa16Rb1p&# 2Td1<&' 0Xh1  `P%' l%# D%! >Qa1&! 6Rb1p&# 2Td1<&' 0Xh1  `,Px%' \%# <%! >Qa16Rb1h2Td1<&' 0Xh1  `;Ph%' l%# D%! >Qa1&! 6Rb1p&# 2Td1<&' 0Xh1  `JPX%' d%# <%! >Qa16Rb1p&# 2Td1<&' 0Xh1  `YPH%' l%# D%! >Qa1&! 6Rb1p&# 2Td1<&' 0Xh1  `P8%' l%# D%! >Qa1&! 6Rb1p&# 2Td1<&' 0Xh1  `P(%' \%# <%! >Qa16Rb1`2Td140Xh1  `P%' l%# D%! >Qa1&! 6Rb1p&# 2Td1<&' 0Xh1  `.P%' l%# D%! >Qa1&! 6Rb1p&# 2Td1<&' 0Xh1  `=P%' l%# D%! >Qa1&! 6Rb1p&# 2Td1<&' 0Xh1  `jP%' d%# <%! >Qa16Rb1p&# 2Td1<&' 0Xh1  `yP%' l%# D%! >Qa1&! 6Rb1p&# 2Td1<&' 0Xh1  `وP%' \%# <%! >Qa16Rb1`2Td140Xh1  `ٗP%' l%# D%! >Qa1&! 6Rb1p&# 2Td1<&' 0Xh1  `٦P%' l%# D%! >Qa1&! 6Rb1p&# 2Td1<&' 0Xh1  `ٵP%' l%# D%! >Qa1&! 6Rb1p&# 2Td1<&' 0Xh1  `P%' \%# <%! >Qa16Rb1h2Td1<&' 0Xh1  `Px%' l%# D%! >Qa1&! 6Rb1p&# 2Td1<&' 0Xh1  `Ph%' d%# <%! >Qa16Rb1p&# 2Td1<&' 0Xh1  `PX%' l%# D%! >Qa1&! 6Rb1p&# 2Td1<&' 0Xh1  `PH%' \%# <%! >Qa16Rb1`2Td140Xh1  `P8%' l%# D%! >Qa1&! 6Rb1p&# 2Td1<&' 0Xh1  `P(%' l%# D%! >Qa1&! 6Rb1p&# 2Td1<&' 0Xh1  `-P%' l%# D%! >Qa1&! 6Rb1p&# 2Td1<&' 0Xh1  `اP%' l%# D%! >Qa1&! 6Rb1p&# 2Td1<&' 0Xh1  `ضP%' l%# D%! >Qa1&! 6Rb1p&# 2Td1<&' 0Xh1  `P%' l%# D%! >Qa1&! 6Rb1p&# 2Td1<&' 0Xh1  `P%' \%# <%! >Qa16Rb1h2Td1<&' 0Xh1  `P%' l%# D%! >Qa1&! 6Rb1p&# 2Td1<&' 0Xh1  `Qa16Rb1h2Td1<&' 0Xh1  `KP%' l%# D%! >Qa1&! 6Rb1p&# 2Td1<&' 0Xh1  `ZP%' d%# <%! >Qa16Rb1p&# 2Td1<&' 0Xh1  `iP%' l%# D%! >Qa1&! 6Rb1p&# 2Td1<&' 0Xh1  `xPx%' \%# <%! >Qa16Rb1`2Td140Xh1  `ڇPh%' l%# D%! >Qa1&! 6Rb1p&# 2Td1<&' 0Xh1  `ږPX%' l%# D%! >Qa1&! 6Rb1p&# 2Td1<&' 0Xh1  `ڥPH%' l%# D%! >Qa1&! 6Rb1p&# 2Td1<&' 0Xh1  `ڴP8%' \%# <%! >Qa16Rb1h2Td1<&' 0Xh1  `P(%' l%# D%! >Qa1&! 6Rb1p&# 2Td1<&' 0Xh1  `IP%' l%# D%! >Qa1&! 6Rb1p&# 2Td1<&' 0Xh1  `:P%' d%# <%! >Qa16Rb1p&# 2Td1<&' 0Xh1  `XP%' \%# <%! >Qa16Rb1`2Td140Xh1  `P%' d%# <%! >Qa16Rb1p&# 2Td1<&' 0Xh1  `wP%' l%# D%! >Qa1&! 6Rb1p&# 2Td1<&' 0Xh1  `ۆP%' l%# D%! >Qa1&! 6Rb1p&# 2Td1<&' 0Xh1  `ەP%' l%# D%! >Qa1&! 6Rb1p&# 2Td1<&' 0Xh1  `ۤP%' \%# <%! >Qa16Rb1h2Td1<&' 0Xh1  `P%' d%# <%! >Qa16Rb1p&# 2Td1<&' 0Xh1  `P%' \%# <%! >Qa16Rb1`2Td140Xh1  `Px%' l%# D%! >Qa1&! 6Rb1p&# 2Td1<&' 0Xh1  `۳Ph%' l%# D%! >Qa1&! 6Rb1p&# 2Td1<&' 0Xh1  `PX%' l%# D%! >Qa1&! 6Rb1p&# 2Td1<&' 0Xh1  `PH%' l%# D%! >Qa1&! 6Rb1p&# 2Td1<&' 0Xh1   !     !! !)! !, p !DHP  "p ! a0|!4 z( A0!4 Z( 00!4 9( t p ! 0!4 (8pp@DlnܶtnP88hQa1. @nP(8Qa1. ~ tҌnP8Qa1. nP8Qa1. lPnP%' ^%# >%! ;Qa1P5Rb182Td1 0Xh1m(. >$LnP%' \%# <%! ;Qa1P5Rb182Td1 0Xh18(. >$nP%' \%# <%! ;Qa1P5Rb182Td1 0Xh19(. >$nP%' \%# <%! ;Qa1P5Rb182Td1 0Xh1:(. >$`nP%' \%# <%! ;Qa1P5Rb182Td1 0Xh1;(. >$иNnP%' ^%# >%! ;Qa1P5Rb182Td1 0Xh1<(. >$ nP%' \%# <%! ;Qa1P5Rb182Td1 0Xh1=(. >$hnP%' \%# <%! ;Qa1P5Rb182Td1 0Xh1>(. >$nPx%' \%# <%! ;Qa1P5Rb182Td1 0Xh1?(. >$ nPh%' \%# <%! ;Qa1P5Rb182Td1 0Xh1@(. >$|nPX%' \%# <%! ;Qa1P5Rb182Td1 0Xh1A(. >$nPH%' \%# <%! ;Qa1P5Rb182Td1 0Xh1B(. >$4nP8%' \%# <%! ;Qa1P5Rb182Td1 0Xh1C(. >$nP(%' \%# <%! ;Qa1P5Rb182Td1 0Xh1D(. >$nP%' \%# <%! ;Qa1P5Rb182Td1 0Xh1E(. >$HnP%' \%# <%! ;Qa1P5Rb182Td1 0Xh1F(. >$nP%' \%# <%! ;Qa1P5Rb182Td1 0Xh1G(. >$nP%' \%# <%! ;Qa1P5Rb182Td1 0Xh1H(. >$\nP%' \%# <%! ;Qa1P5Rb182Td1 0Xh1I(. >$nP%' \%# <%! ;Qa1P5Rb182Td1 0Xh1J(. >$nP%' \%# <%! ;Qa1P5Rb182Td1 0Xh1K(. >$pnP%' \%# <%! ;Qa1P5Rb182Td1 0Xh11(. >$nP%' \%# <%! ;Qa1P5Rb182Td1 0Xh1L(. >$(nP%' \%# <%! ;Qa1P5Rb182Td1 0Xh1M(. >$nPx%' \%# <%! ;Qa1P5Rb182Td1 0Xh1N(. >$nPh%' \%# <%! ;Qa1P5Rb182Td1 0Xh1O(. >$$nPH%' \%# <%! ;Qa1P5Rb182Td1 0Xh1Q(. >$nP8%' \%# <%! ;Qa1P5Rb182Td1 0Xh1R(. >$PnP(%' \%# <%! ;Qa1P5Rb182Td1 0Xh1S(. >$nP%' \%# <%! ;Qa1P5Rb182Td1 0Xh1T(. >$nP%' \%# <%! ;Qa1P5Rb182Td1 0Xh1U(. >$dnP%' \%# <%! ;Qa1P5Rb182Td1 0Xh1c(. >$nP%' \%# <%! ;Qa1P5Rb182Td1 0Xh1d(. >$(nP%' \%# <%! ;Qa1P5Rb182Td1 0Xh1e(. >$nP%' \%# <%! ;Qa1P5Rb182Td1 0Xh1i(. >$nP%' \%# <%! ;Qa1P5Rb182Td1 0Xh1f(. >$$nP%' \%# <%! ;Qa1P5Rb182Td1 0Xh1j(. >$nP%' \%# <%! ;Qa1P5Rb182Td1 0Xh1a(. >$PnPx%' \%# <%! ;Qa1P5Rb182Td1 0Xh1b(. >$nPh%' \%# <%! ;Qa1P5Rb182Td1 0Xh1k(. >$nPX%' \%# <%! ;Qa1P5Rb182Td1 0Xh1g(. >$d~DHHWW0 ГH00W0 Г$00W0r `@ h pA$  (     P x t T |  X d ` \ p h l p WPH~LpMnP< x2P   8(V~LǎHPPW8 [~4fЎ*p[ft f~488W@8~<րpՠ8&G 0s ?Zp pՠp~<ǎ8@@W@8~( hxZE dZaR4 B h0( h p 9(F* ;(n ` 0 ` (D ` `^lP h~`ǎ\ǞXǮTǾPLHppWX<@DH~LqpǨΐEZ P| Tb PTp ǪLj~LǎHǞDǮ@Ǿ<XXWxDHLPTX~\P `^l `~X_VCp6      (Q\^t,ГDZ^^_  *Ljp _T Uΰ΀TpUЧ( =ΠWΐh RQ Pd^X`d d d ^>Q^}$hXhd^h^An|T|^h`2^h^xD^x T`` ` h, `dh \  ^Pdΐ_ t   ٓЧ(  =   ^pP pJ_\4 tP0 ` >( `J^lP `~\ǎXǞTǮPǾLHDWXDHLP~Tְ `֠ h ` hpz h0( X[@ h>Z[R h0( l hZ0 ` ~(> ` ` h~TǎPǞLǮHǾDXXWH~Dyj@mlIpyn@0N0Cʋ0 0C@V0k춋0 z  >(,~DHHWHx `eH> ` z 0 ` >(NfpHHWHx, hfЋ> h z 0 h >(8HHWPDH~LwpXXF; .  7(ZX\\OX:2( 8d  x 7~(>~LǎHǞDPPWXHLP~T֠ `֐ h ` htpvx 7~(pp h0( h@RVXV:Z 0 `  ~(0ZV `ܶ ` h~TǎPǞLǮHXXW8 ȧ~4uXV.\nH4zp>F>* ēUZU&~488WPH΀W~LX^p p4hDtt  k  !P Q ^"TL_Tދ Rh SP P8 N  m" J Lҋ M2 [sN KNs6[P  x xtqp 型w  f p7 P ` p6q 6(P(0DD( \R T.g咓qԓ6BWRx6(l~LǎHPPWW H                       Ķ ȶ ̶ Զ ض ܶ ж  W8%<88WH<~@prր s ,y <zTQ.Dʎրb  ~@ǎ<HHWH<@~DpaTtz  ħ )s x ) ~Dǎ@ Ǟ<HHW@8~<p Z @0LJ z ~<ǎ8@@WpHLP~Tqs !^a>$Ǟǩ b " &   hs!s#>h2#c!! YsY  0 ǎ0~dƆDdXoX` . >$~(v .g>0~( $YsY!t|YsY(  :~uh 0GM'vF!`8WsY ! 10#@db(dls1s3.l#"c!! $.%g0~(b R  4YsY$!6!(~TǎPǞLǮHppW@!@@W@8~<ݺpp,hp\`  X0E9/pE9ӓpi~<ǎ8@@WH8<@~Dpf֐s$i*zh\1\9֓8@ @ H 0,  Lj   CLj  @ "@8ʓܬ 8lۓ܌mzs   !x/  @  s   'x)  y s   !x, Hh~Dǎ@ Ǟ<Ǯ8HHWhX~HH,!8fB^AV:NCFD>96<.=&;?@> ")hp s n^\^(^`gT.P>X^,pPTg X#:>XL p *pZG~HhhWP48<~@q2(     ,   )*   )j  P  8zz *"zz ) Ds!s#>D2#c!! *Hs!s#>H2#c!! )  *  )z s  s 4z z@ L43c110Du< .m @!   ~@ǎ<Ǟ8Ǯ4PPWxDHLP΀ ΐ ~Tr.ps!s#>p2#c!! z  8xts!s#>t2#c!! V z H 4. 5 6 7߆N 6 , "    ΀g&(bp Nΰgs (   nQsY  F f  ^ gր 8~res   'x) ndW%' \%# <%! ;Qa1X5Rb1@2Td1(&' 0Xh1pd.X8$h^X^;Qa1h&! 5Rb1H&# 2Td1(&' 0Xh1H dz(s x (x ~TǎPǞLǮHǾDxxWXDH~LpPȆPPT$~TPqhjPL۴~p۞g 0(g)JppѪ~LǎHǞDXXWP<@D~Hpb۲֐L 0(g'"0  s ԋbD @  s   !x/  )s x ) y  @    Ld֐~HǎD Ǟ@Ǯ<PPW !WH<@~Dpfap | ~Dǎ@ Ǟ<HHW`DHLPTX~\p pΐ vbv (< ). & ' f0s  Ǹ LjPss\  (. ) & '6ΐ  p 0 g(( f: p y  0 ((bTR s  ǻ p y ` 0 ((R~\ǎXǞTǮPǾLHD``WXHL΀ ~Pp qx.xd@|T,Ǟ|  ||0Ǟx  dxZǞx.N  4Ǟ|x.$  |xQs P|s @;$|;"Ǟx 4x^xQs L|s <:|: Ǟ|ը |^xTs!s#>T2#c!! 0΀ ~|Ԡ(g)7.Ǟxp xǎ|r(g)8~PǎLǞHXXWH~Dd0  !((+p""W"%  6 h$.d(8080D.d(g00$dZ^d 5dsɴ>d^d dxds  j06~dӪ f 0Hd06djpҞp*~dҎ(Tg'00dQsY,$d2:~d^d 0FL'r0~dV0j~d^ 0&?'04~dѴ] 0'@'0~DHHWhHLPT~Xq  Ƅ  r֐ \Զ `Ԣ\`(g(7.\deNd@qО\ 0(g)@~|q\\ 0(g) 0~XǎT ǞPǮLǾHhhWPH~Ll .p !/((-p""W".l>p(6p.l>p(7pvlPt~ǎ  0(g'~p ppl~ς  > (gpF `p~.l>p(4p^l8,p(l.pp&lt~ǎΪ  0(g'.pp p.l>p(5p.l>pKQpj.l>pHNpN.l>pIOp2.l>pJPtp.l>pFLXp.l>pGM<p.l>p(g$p.l>p(gp~̀ǎpj T(Rg'8pH~(ǎpp (Sg'8Vp.l>p(g4p.l>p( gpl߈ ˘Wpݒls `~dǎpN (g'8|p~Vǎp@ˎ (g'8 plޔ ʤVpܞls \~p~Z pD(g(7p(~f~P pʐ(g(76p.l>pfp.l>p1gp.l>p2gpz.l>p*Clp^.l>p+DPpB.l>p,g4p&.l>p3gp .l>p&?p.l>p(Ap.l>p'@p.l>p)Bpls  >p!/g~pp.l>p-g`pRls  >p!.g6p(.l>p.gp T~LǎHPPWH<~@pǾpDhFD"W*|W*Γ`O8ph  ,W* ( rp X Fs   'x) ~@ǎ<HHWh@DHLPT~Xа\ 1ēIXh\\\`Ҏp`B`:\Ʋ  (`qqfQ\а 2nH2X\\|a pLQv\а2 3rGX"\Z\\`` b`qqP\а 4G>Xߦ\\^\&u zwqTP~\<Pf\а" 5vp+FX'T\R\`X\'pZ'\d\ H  T 6F < %.   :Ep { ʧ\а n\ .pN\ET Xݶ\s d\`p.dB.d\}$\0. ֨(\ |\dsL¦ j*\\  @  bIv\   \0 2!'x) 20~\gP؋^;Qa1h&! 5Rb1H&# 2Td1(&' 0Xh1и&\P~\Nu&\ ~\"\@~\\BF H   { @  p  f   @  ` ؄\ \!0 #!\1B 2$/x/x$ 21B b .>pK|\A؋0\p\AаΠ\p%΀ "A\\ AZ\ҘtcFx   'x)   @  \b ְ L \\b\\T\ X"@\:\  0@pǾ\ ␧\]!  @@4Ǿ\I  x\T  @?Ǿ\>Ih  ,\аp΀aΠ+Z? ,\\, &  (P $(@\ p P   x\  x\dDd\\ p P| \ !0s)' 1x 10\ <\ p P   붧\а (( 0( p P }\~XǎTǞPǮLǾHD@hhWH<~@ps !\46 pus @z 2B p,uZJs @z 2VҤ p@uDs1s3.D#"c!! uиJzP4& ptLDz@2 ptN8( M p~@ǎ<HHW8 j88W8 F88WWW8@|   @ 0 07x9     88WH<@~DpI6p$   /x/x% $$ ʧ  !0s)' 1x 10 R~Dǎ@Ǟ<HHWhPTX\`d~hpPݸ^Ppՠ^^|^(^p.l>t^,Ȑ t+Πΐ΀>t ךp>l>N (,t0|#446 .    I x<]sY &     Ix  lxx     s   'x) !6+P^ x#F  Ns!s#>2c& xu nP 8Qa1. , <s 2!'x) 2<7 xzFl$   /x/x% $62$   /x/x% $(6d[$Px    /x/x% $ xxL$  $E(h FlpLJ ? 1C 2$/x/x$ 21Tl( ?L    0 2!/x/x$ 20 pǗ(΀L0 @(@J< ՠ" Z 冠ՠfJW Prxd xX@0 2!/x/x$ 20LJ iT (ΐ΀l^ x x     \asi  D  k iz  7(p(0DD( e(DHH ea H$_(     xx.^P~hǎdǞ`Ǯ\ǾXTPWpTX\`dh~l@̶$   $pA(( !0($!$( !@ 1^^(^x.t>^,r t,[:΀+ ^p pP> p \  ?f   $$x    /x/x% $ LB    !0x!! 1xxx 10  !0s)' 1x 10  p.‹ "  z. .Z$x\   tNxp0 2(!.,..0..4,⢋d$$   /x/x% $"$   /x/x% $  xx  p  $   $p| pm NJ  d  zD>nP88Qa1.   Ljp -0  \|  ߓW\\Bԓ\P ~lǎhǞdǮ`Ǿ\XTWp<@DHLP~TP^\BdP0^dd^d x\^\P ^d1 PX^XXZ^\P\ΐPΠ^p p Rǽ  @ǻ 0l x  \asi ^l`s,s "z P Vȧhώ ` `d Fl Qzz%c\ X0  `"b84b  +  A<Z P^XPX^\P.*^d x c^d (3^d. 2`   'x)  ^d = s 2!'x) 2=^d x^\P vǽ  dǻ^d pp `hħ    a ^Ћ8P -s x -~TǎPǞLǮHǾD@ <ppW888W8 ȧ~4p  (6  ~488W (  !^p!(0  !  "*   (   (!  (  ! WW8188W8 88W     cW   aW   `W  W  W  W ` W ` W ` W 1 1`sp ! W 1 1`1sp W sp  ` W bP/PW bP/PWWH@~Dq.h.v  ~Dǎ@HHW@8~< qzwsppp B   H  !  !  ! QqZ:5! P P      ~<ǎ8@@W  W@~<p  ~<@@W W cW8x 0@|xh88WH@~Dq|0(Z~Dǎ@HHW8  0 !   ! 0Z 0088W@ 0@@WPﰧ@DH~L 0 p 06: P(&@ P  ~LǎHǞDǮ@PPW8 8z88W W8ȓ88W@Jt@@W0~ @B!ǃp4 (A' B~ǎW0~ @B!ǃp4 (A' B~ǎW 0 s1`13p W 0 s1`1p W觎@~ @2 pǁ' ( Z' B1 2~ǎW~ @!X@0q 74@0q 74@0q 74@0q 7$4#@0q 7!40#~W @!A0!C0#W@ H & @pDpDD~@ǎ<HHWH<~@qDDpDD~@ǎ<HHW 1!! W W W @~ BB"02s30C00݆@ ا@ ~W @"02C3000WH<~@pDp ؆D  ؋D:DǎDwB ؆  ؋LjwpD~@ǎ<HHWH<~@pDpLDDǎDwpLjwpD~@ǎ<HHW 0 1 " W 0"R1 0 0W W@0~< Hr'~<@@W@0~< Hr'~<@@W@ s < H^ .< ^ @@WH<@~Dp H: ܧ~Dǎ@ Ǟ<HHW8 H !J88W`8<@DHL~Pp$ހ ְ Ǘ,ۧX s  Hn x L .  @      d x J *  @      Ǚ LJ  Q88Q $\ H*ԧ\  $\ \$Lj~PǎLǞHǮDǾ@ <8``Wh<@DHLP~Tp(ހ |֠ ৮\, , s r H< Pxx  0 Pxx   Ǚu,v,  ܋nj88P (` HX`]d0$  d`  N0$    `j `(3~TǎPǞLǮH ǾD@<hhWH8<@~DBp0  d ǙǪ~Dǎ@Ǟ<Ǯ8HHWWP?8<@DH~LDZ P H@ pp   p tߋJ  P . p  p~LǎHǞDǮ@Ǿ<8P^ PWX@DH~LpΐPTΎ  .P.T ~LǎHǞDǮ@XXWX<@DH~LptǠǚ H2 s   , اT9s wpX : ~LǎHǞDǮ@Ǿ<XXWP<@~Dp H2&ǐ N wp(  L:wp~Dǎ@Ǟ<PPWX<@DH~Lְ P H<p & ftߋ^pTJ6p1  !p" ~LǎHǞD Ǯ@Ǿ<XXWh<@DHLP~Tp0(ހ R$   @,ۧ\Ǭ s qp x Hb *LZ^`  ^`    H l6   T   Hb z4Z^d  >^d    T RL $     Ru ~TǎPǞLǮHǾD@<hhWX<@DH~LpހP$DǗ,(4TF s & H N  VǙ0~LǎHǞDǮ@Ǿ<XXW ќ!0 H P @   @ H A$CWH<@~Dq  '0 #x# ǘ Hp ^Q p p 4Pp pK&~Dǎ@Ǟ<HHW 0 & x1WH<~@(q8wp   ꈶ D(q8"*Dwp  DD~@ǎ<HHWH<@~DpLJHNLjLJHHLj뎐HZLJH$Lj뎐LJHLj~Dǎ@Ǟ<HHWH48<@~Dpǐ  xǩ ԮԜ 2LJLjj  Ǚ a~Dǎ@Ǟ<Ǯ8Ǿ4HHWH<~@qDDDD~@ǎ<HHW@48~<֐p x  @ s   'x)     %! 0Qa1P?Rb187Td1 &' 3Xh1HDp.d0(nDP!%' ^%# >%! 0Qa1P?Rb187Td1 &' 3Xh1HDՐ.d0(J H  Հ !9&(hhW@~8p p '(("p""!XW"<Ղ<< b<\P<H<<4<< <  <<ݸݸ<Լ<$Ԩ<<$Ԍ<v<p<Z<,T<  <〆,<!<"<#<$<<܋<ȋ<Ӵ<Ӡ<ӌ<xl< d<  D<<0<(<<<<X< <<Ҫ<Ҙ<҄x<pd<\P<H<<4(< < <   < < < <0 2!'x) 20<<" ~488WH<~@q,DDpDD~@ǎ<HHWP<@DH~Ls x f Z N B| |.+s x +|~LǎHǞDǮ@ Ǿ<PPW8 ȧ~4p ]@ ]xL$(dL(qd(q\(`~488W(\W8 ȧ~4p \(q\(@`@8((``(`~488W@8~<qp \LxL(ǁdNLjLLL \LL(dL(qd~<ǎ8@@W88         $ ( 0,84<@DH0 0?x?x5 LP T88WH<~@q Zp Z Z ZzD²DDpDDŠDDD~@ǎ<HHW`HLPT~Xp((p$@W  ~Q. &R  R   (("p""'(W""Ǒ   !6~WjWzzP   hǗǎ c   T  8WǕǎ b n LJ b H W  nP> ,  ~b\T  0$   WeR  R 4 ` W R Je4 52Wzz h& U \&t&`\!8 \h 7 LJ\`d `D (. >$, (t%  \%5`h!8 th.\7 ǁ\`d _v (. >$^LJ`h  _( (. >$ W4 5bWaR t$ SFW aR h$b SZH 6 $ Ph`" `8b^t`" FW4 (  8^L : ( H>  ] v>H> t\ . ؆N< *  t X<8.   n\ J 8 D<  [ PLD4   손D<  &Zn  Z* d @  D<  VY ؆D< YZ   vpfV 0    ԆD<  XV D<X L8.   솀ІfF4 "  lh`P ,  ~l Z H  d  @ "f44"   ֋ċﰋzhhVǀLBLj((ǀ Lj@ǀLj  n0`B  f(Lzr 8( nH  8( D޴  f:( 8(:x<l(N  f(X~ :( zT  :( P  fF( 8(FQ L  F6 F8 F&`XQj  ;(z 6 f:($ ;(. h( 8  f(J 8(炧gsfVsY RQ *ǎP ۂxQs fZH O (. >$ے~XǎTǞPǮLǾHW8ȧP(\ CP^P^Pcb dP^P|tls ^V(\@(\Q@(`P(P`88W8 ȧ0~4@q B|tld\Ts H@@x@&(@"r~4ǎ088W@8~<ՠq"ՠՠը"ըըըըըpը~<ǎ8@@W  W@8~< q b<(@*Ӓ  q~<ǎ8@@W8ȓ>(@,,    88WXHΐ L~Ps @@ 0TTΐ~ ~ΐp ? ? ? ? VRJ( 7  ( 7` ZSNz( 9 v ( 7 .T"> ~(` :a. ( 7~  r r B(\`(!\@~PǎLǞHXXW@8~<ps$ x  D p 0 07x9 hd p 0 07x9   0 0@ ~<ǎ8@@W@8~<pH <c 2s 0x 0  @ r ~<ǎ8@@W@<$X< <  < <    < <  <<(&1 2!/x/x$ 20.<(1$  !xx ! << <<<<< < < < <  <@@W@8~<qb s 0 07x9  r ~<ǎ8@@W@8~<q 'Lp (@aP r s 0 07x9 ~<ǎ8@@W W80 0A .   88WP8<~@pbvDbLFP 8h H$DHLnH2  7  c*~@ǎ< Ǟ8PPWX@DH~Lq(s b~dX(#(4XE(`($ %8ds!s#>2#c!! s V t ls!s#>2#c!! |@ L! s  X(%((@"p"")8W"_(*0F(#p"")W"VЧhl(Tԧ<R(Z  Q  Xl L ,P  Y ~`.P:l\P'2JR`.P;@\P'2&| 2|!|$|#|"ҧ|%뺧aP%d.`H 8r ZP(.P" n D^P ^P @ & t`L 8sz= /> s   & F~LǎH ǞDǮ@WXDH~LqaP`\;Qa1h&! 5Rb1H&# 2Td1(&' 0Xh15\s!s#>2#c!!   vgX%' l%# D%! ;Qa1h&! 5Rb1H&# 2Td1(&' 0Xh1(s Fb&zX4(h>(\ls!s#>2#c!! .P.3҆t ls!s#>2#c!! |N. XP|.3^t(>(f41(20Z!p""*8W"p'806'6 |'6 |'7|'8ԋz` `'8㒋g^^;Qa1t&! 5Rb1T&# 2Td14&' 0Xh1 | g^\;Qa1h&! 5Rb1H&# 2Td1(&' 0Xh1`g^|>;Qa1t&! 5Rb1T&# 2Td14&' 0Xh1 | g^|<;Qa1h&! 5Rb1H&# 2Td1(&' 0Xh1(g^^;Qa1t&! 5Rb1T&# 2Td14&' 0Xh1 `|" r|'9TZ|`"TgPՀ\;Qa1h&! 5Rb1H&# 2Td1(&' 0Xh1Հ"gPՀ\;Qa1h&! 5Rb1H&# 2Td1(&' 0Xh1`" $|`  `"gP`\;Qa1h&! 5Rb1H&# 2Td1(&' 0Xh14|`.p:Pp.2p|%  gPՀ\;Qa1h&! 5Rb1H&# 2Td1(&' 0Xh1 66|` *Հ'9p"gP`\;Qa1h&! 5Rb1H&# 2Td1(&' 0Xh1~LǎH ǞDWhЈ $)0 2D.ddhhWhЈ ')0 2D.dݰdhhWhЈ (*0 2D.dhdhhWи8W0!@3(x0A 30WH~DpƎĦ@0( WdW@L L!L!d L~DHHWP8<@~Dpǀ@  H.LLLǞLǎHH88H ljǙk~Dǎ@Ǟ<Ǯ8PPW0 @08# 3 B" W 0@~*p  q" ~ǎW ~ǐ@p@0r    J@@* ǂ@LjǙǙ~ǎǞW?x<@DHL~PǩH r ǪǩdV 8HĆ @΀1nWP*%' n%# F%! 0Qa1&! 0Rb1X&# ;Td18&' 5Xh1 ~WLq(hMLp Ў L d L LǪL~PǎLǞHǮDǾ@<W 0~q88@"- ?0 @/ A? \@ ]C ^D _~WH<@~Dp x !pzWQl`5(T(L2p23+W3( ( p)(P (6()(  )wLj!R () (wLj)p x  ( \ (D Ǘx!: () Ǚw(p   *zzs s!J"͸zz)R!  ~Dǎ@Ǟ<HHWH<~@p  DTDQ`$(DDD D:D{bD DpDD ~@ǎ<HHWH8~<p0Dgx s.D!cjx vWzRz@Hz s 2Q`xxx14@8L s ΋"c&~<ǎ8HHWH<~@pB.$4$x X DD* nD48 DXb:dn!e ~@ǎ<HHW@~<p'(("p"".W" R  vfW e(~( (g'"  (  `$  4 68'  V  (   vj^ NBh2X"H86 L w wpzw fwpw@Jwphw*wpHF:\.@2~<@@W@8~<pp p'(("p""1W" ^L tb J 6 w0wp׋dw@wp:wZwp~<ǎ8@@WH<~@q'@  (("p""4xW" |fRBx.dǀ Lj4 ڋǀLj r^J6l"ǀ  Lj8@DDDDD~@ǎ<HHW@~<XX\X \ F\ (2(*"p""7XW".X\.X\ .X\j.X\R.X\>.X\&\p,X'X'wpًX.X\ .X\,\pX'wp.X\z.X\ f.X\R.X\>.X\&.X\|.X\d.X\\p .Xwp(\p@Xwp~<@@W0  @A30W 0cRRsY4Ў* R 1W@8~<pj'(\(T"p"":8W" ,*> x" u W gxxjVsYJЎ@&'( )6ր  vX  w t t t0ր n u wN t^ 0 ȋ d rb VJ> ȋ & p`΋D4w wpw nwp ȶ Ћw@BwpgxWsYrЎh uHTH rP ؋0wwp ȋ~<ǎ8@@Wx@DHLPT~XpP^t pR "pJFB'((Tvc(c(*4(( R#Hd!܋(( N! B!l \):0 .\>lNB():^$ ( .\>l> l \  \ &     d  h dhj():NN(.\>l.. -" .`>pl p\` .)!) d n):t*," .\>lPl \ ^ V Hs s4d "h dhts h):  ոb Z<s s(d bh Pdh  c(): Ts s(d h dh  nWd^s sFd l4h TdhpVWcs sdhdh|pQdVqs<x,q  ^tP xQ^tP~XǎTǞPǮL ǾHD@xxW`DH~LpT\  J `Q$,%  t > .T>\@XL T\ T P c:Dž  B 6ր   T J,\P cDž@ր 4 0  ǞUP v     bր  Ǟth   b.& (("p""=W"  ҋ r pbRP@<,(PPP 2s 0x 02s 0x 02s 0x 02s 0x 02s 0x 02P  'pwpp wpǀ@XPPPPPP@ P Lj("pwp~LǎHǞD``WH8<@A~D`ր ֐ ֠ p @  p ` ඐ p ~Dǎ@Ǟ<Ǯ8HHWH  1>(H H^ HWH  1>( HHW`?HLPTX~\p (ǀH2LjP֐ )"   & "  N>s  yh   0 0  0 >h x          (ǀH()2s>1(*Lj߂ D~\ǎXǞTǮPǾLH``W !    WH08 0<~@r XM s   'x)  Dy ~DM4Z~@ǎ< Ǟ8HHWpDHLPTX~\q` ѧdp  p '( ( "p""?W"(9 .`>dn `n8d .dv `>`4  " ): ``d >d K d  t`\dKHnd K*P .d^ `L (9.`>d `(9 (9|(9^(9>J 6 J8  H N(9 (9(9(9(9z(9^(9B (9,(9 (9"W! & x!(9(9.`>dl`dd*d  vd`d h`XdG d G .d  "s ܆;(9B "s >܆;T\W<s. s ܋ Ў6(( '\ы(9b "s ^܋Q`T@(9 "s ܋4gx|tWsYVЎLs ы2x [ 2x&s 0x^V J(9.^(9(9(9NǷ (9.ǻ~Ƿ@(9ǻT4(9Ӌn^VD  DB.h>l* ( ^p V ~\ǎXǞTǮPǾLHDppWP@~Dp ^  .H>L^V  H$ wp~Dǎ@PPW  1~0ǒ@@?p3΀&p f ǩ PY ( ("Y (D(  >Ǚ,RP"%  O~ǎǞ Ǯ WP?8<@DH~Lp Ƿ  ǠT *Wh Ǫ4L  Ǫ ǠH' W  "   Ǫ <ǻI(P~LǎHǞDǮ@Ǿ< 8PPW`@DHLPT~Xq *|x 0L' T30 Ǡ@ΐG΀H4 $ ' ۺ \\\ Ȏ \et \x`\X,PІ0 \F   ЎǪю \N H,\  w0Ћ <Hp v  xzp R v  xJp " v  x~XǎTǞPǮLǾHD @``W@48~<q Dǘ@ 6 $  x@8Ǚ y~<ǎ8Ǟ4@@W`<@DHLP~TpX.\2Іր Ǘ 4)>\ R! Ǚǐ -v(  vz( ǘ B t   Lj3~TǎPǞLǮHǾD@<``WhDHLPTX~\r ض ^V  ж W ^ ^ת^U^^P֠  @ *P  *M Ǫ֠ $ *N ǪΠ(ΰ') Q^xW ^ .^.l>p^U^^P P^  :Q^|  s 9)4 $ s 9 P^|^|^22.^P09$ 9P^xh   l yh  b V1 1 !xx !  xx  fm^n e $` fb  V1 1 !xx ! Pf^lP  ^  tH 0 ` xx    V1 1 !xx !             P^ `0 ` xx    V1 1 !xx !             P^ tB s  s 5Ћ H& A ^ xx    V1 1 !xx ! fiP ^  s   ^PHW ^<^%0 @ .(4<^U^^P   0> 0t(@ 0 0(0 TP0 (#00^%  &    #n^nV^xPq~\ǎXǞTǮPǾLHDW`?@DHLP~TpX Vΰ ϡ (Jv zd*>\zXX\   " iX(ԊȺX~TǎPǞLǮHǾD@``WXDH~Lp 8̎ ᒓ(XPpP<ǞPiX(' l%# D%! 0Qa1h&! =Rb1H&# 6Td1(&' 2Xh1ǞPLj ;hiX(' n%# F%! 0Qa1t&! =Rb1T&# 6Td14&' 2Xh1 LjI P!>T~LǎHǞDXXW` @1~<4*?p4 1@v~<``W @ @ GWX @ H  @n PCX%' ^%# >%! 0Qa1H?Rb107Td13Xh1. >$ о @XXW8 ȧ~4p  0  ~488W@~<p  ! Г~<@@W8 ȧ~4p5: ~488W@8~<p΀ 4  ~<ǎ8@@Wp\`d~h Xlΐހ p q    Xn PCx%' ^%# >%! 0Qa1H?Rb107Td13Xh1. >$p Ћ!q Xoo! X Г3 `~hǎdǞ`Ǯ\ppWX X ` & `n PC%' ^%# >%! 0Qa1H?Rb107Td13Xh1. >$ Г `XXW0   `P  ` 00W8ȓ88W觎~p nPC%' \%# <%! ?Qa1H7Rb103Td11Xh1A8.A!1  0  A0B~ǎW 0 @ 12WX\`~d ΐώkp q  jZkdn PC%' \%# <%! 0Qa1H?Rb107Td13Xh1. >$~k!~q!Xɨ60 ɸkf ɞ:~dǎ`Ǟ\ǮXWx   nXPC%' ^%# >%! 0Qa1H?Rb107Td13Xh1Xw `(h0p8. >$ Z" xxW0   P   00W8ȓ88WX8<@~D pΐ~ԋ q|  n 0  0nIPD6Qa1.PI! WX@|.>P !1Apq $а8ΐ<~ԋqxprp $p $Zq pаF(lp $YRND):`p,/Zp.  /<~Dǎ@Ǟ<Ǯ8XXW@p! $p @@W8p $88W888W@4~8`:~<` q<0 ~8ǎ4WH8<΀ ~@p qD,D0  2!'x/x- 20DD  D0   2! !x/x$ 20DD~@ǎ<Ǟ8HHW@~8p<,<`W'' l%# D%! 0Qa1`&! ;Rb1@&# 5Td1 &' 2Xh1<~8@@WH48<@~Dpݼ! X΀ z  $Z u.J :ݼ2   $   Π $ݼ   m~Dǎ@Ǟ<Ǯ8 Ǿ4HHWH8<~@pp>  26GG݈0p $ G p $G $s   Gpׁ %f Gpׁ %@J @ *G !! $Gpׁ %Gpׁ %G ~@ǎ<Ǟ8HHWH<@~Dp x   P xx? :z`XPx$t Lj !~Dǎ@Ǟ<HHW x   Jx   8 Q0xx  1W8 x    x  V 88W8 ȧ~4p x     x  V!   ~488W@8~<p† ~<ǎ8@@WH<~@px   x  4D0  2! !x/x$ 20D*v'xD Dp:ǎD\ VD@D~@ǎ<HHWPDH~Lpx  :Wx]  , $       x  :     x/x$ Lx  <     x/x$ x  <>     x/x$ x   LJTr:'0BOXx]    8     ~LǎHǞDPPWX?@DHLP~Tpx  *Wx]       Ž Wx]      fV S ( ='x~p  Rҧ'xV Px  \ xx8 xx2 1xx 12>  2 0xx 02rPxx(0xx0 0 7x?x1  0 07x?x= ~TǎPǞLǮHǾD@XXW@~<p x0  'x/x! s ~<@@WXpH.T0~DrO   HpP (. >$Or ~DXXWH@~DǁpsN  0  'x/x! s ~Dǎ@HHW8" h:  B .88W    WP<@D~HqR ,` O 9p  . qp*)0=t(Jtr()0=J(JJ pLUL:6F  +0<(Ird N$  :0<(I+*0 )h( &p>\ )6WsY   !(s p & p &(p= )= (t~<ǎ8@@WH@~Dq(0ƓB>  ا :0+(8ċ|: &0<  0+(88 &0< 8(0+H(8H(0   (0pا 90*(7Pe(00ȍ ~Dǎ@HHWP8<@D~Hp΀ L \s D9  &;$ &;t ֐ &8LZF &8 &@0 &H8)(  )H 6s @9  ! &P:  &X: ֐ &`s d6WsY :  %PD &8 &@0 &H9((  (` 5~HǎDǞ@Ǯ< Ǿ8PPWHND<~@pI"D$~@ǎ<HHWpPTX~\>||.s p|pt <|A.>(,0 n|! &X 4$4 3^| (:'0"Z(/Z" nV.|N|^| Fd 3$p:(0!(.<Px  xxXx]   "p !rX.pς! 2f.p$!,|   ! ! >|   !|s "ǎ %1J|s  ǎ %1ǎ %@1p(ǎ %1H6|  !|s :.pςp %0~|s <.pςp %08.pςp %@0bL.pςp %0 ! .p$!.p$!~|x'x. &@Ǟl  F 8 0Vp &@ 08'p   *|=d~\ǎXǞTǮPWh0AN(^P^,^g>`^0hhW@48~<pD &p.@  0() &p. &p- 0:(f()fpD &p-~  0()P &p-h &p-X. 0:(((~<ǎ8Ǟ4@@W@8~<p;zwp~<ǎ8@@W@8~<p ,   @   :0('p &@ 08'p  $ '~<ǎ8@@W`PTX\`d~hpС x Wx &x &xP^ 2> RlPʧ^"| | ^Pʆ8 "9Z^P^^X^ &x*^P"^n  ZfS  ^^(^l^,^>^0ϐ8ϐJΐ ΐ@ Q^Dz R ^^P^^ P^,lTݼF  $  ݼ  n`&n 2  !.l ' @ $ 9F ^^(^l^,^ +>^0 +Ǫǻ^Q^p(t &x(twp6 & &h $0(#w X, & $(00( &8 $(0 P  'x/x! ^^   @   @!" $  $P@s 8p &( 0 0z4p &8( 0 Ҝ0FɴP ^  'x/x- 00^ (4(  @^_:p &ԓt  0(!8p &ԓ>  :0(  & &@0 &8(  * %@$ l ΀ ΐ@b 3p.h!t:s > p %$f 0p.h!2s @ p %$ 0p.h!< p %@# 0p.h! Π ~ (n  Π  p %#j 0p.h!6  Π  Ѐ   Π p9 p %@" P &^ 2 Ҕ .02(2 Π  (y ( &.20( &x,^P$^ ݼH "  $  ݼ   &x &x~hǎdǞ`Ǯ\ǾXTPWP<@D~Hp΀ X s  LJ (0(84  0n(n<8  0:(2(2   Rx    R2f & LJ :6  0t(t<6$ 0:(8(8  b x  vx 8p    x/x$ '0( x  'x/x-  ~Dǎ@ Ǟ<HHW@nPK 8 &Qa1. Ƹ@@W 1@ 6Rx]   xx AWH8<~@p΀ >x )!x/x- *     Q`Nd>! &*xDDpD  V1 1 !xxx ! D D , D,74  zzz zz    ~@ǎ<Ǟ8HHW888W@8~<p΀ pd'x- (N(Fp""LPW" r  bzW  '  8   " І >s  p %   ȋ>s  p %   ~<ǎ8@@W fx   H@ 0   W0 !    /x/x% W 1 0 xx Wx@ΠD H~Lr|||| |0  2!/x/x% 20|0 2!/x/x! 20|0  2!/x, 20|0   2!? !x/x+ 20| |p||   *;( ( 'p""LW" ΀ p B p %    qȋ Ǟ|) 0 1 !xx !) J  &`~ .Hp .Pb &T .XF<2~|  ! xx ~|r  ! xx N~|&  ! xx XN~|  ! xx   &8Ѐp@ p %    qȋ@Ǟ|.) 0 1 !xx !)x   " <p|pzp|p .|0  2!? !x/x+ 20*|0  2!? !x/x+ 20jp|p 2||0:  2!? !x/x+ 20( |   Ǟ|~) 0 1 !xx !)x   4 ;6 Jp|pX,|0  2!? !x/x+ 20( |   Ǟ|) 0 1 !xx !)VǞ|B) 0 1 !xx !)zp Ǟ|) 0 1 !xx !)x   4 9 p|p~Ǟ|j) 0 1 !xx !)x   4 9" 6p|pbXǞ|) 0 1 !xx !) @  pԋnTx   f pA R|0:  2!? !x/x+ 20Pp.4* p|p:0 Ǟ|) 0 1 !xx !)̋fǞ|R) 0 1 !xx !)   n &8RH>@  nL~Ǟ|j) 0 1 !xx !)2 ~pf|~LǎHǞDǮ@WH~Dp p(00    /x, ~DHHWH@~Dp pB1(400    /x, s  /x/x! ~Dǎ@HHW8 ȧ~4px? 1 ln  ~488WH0( HHWH<@~Dp pR! $Px  ax0 xx5x= 0((p23MpW3W  R! W  DX  , ( "" F @s  s  R! ( ( )  R!   R! !  ( J(2)r(*xxxx  ).Pxxxx5x?x17((p23MW3  R!   R!    ! (    R!    !^  i  h'  "" '   ~Dǎ@Ǟ<HHWH<@~Dqp`x? Qx ? zs sjx xZxxxxF(  0((ֆ ~Dǎ@Ǟ<HHW 0x? 1s 1W@~8p<Ϫ<`W'' l%# D%! 0Qa1h&! =Rb1H&# 6Td1(&' 2Xh1<<~8@@W@8~<pp'x- ((p""MW"ts  pV <~,n ^R~<ǎ8@@Wx8~<p0.@$  @(A@ @@@ ΀  !p"@ ( e0~< ǎ8W@48~<pP DD> ǐD Ǚ   d~<ǎ8Ǟ4@@W0! H !HW  !(.(&p""NW"W@81 W0 )HЎ & )H& )P .8 )P c00W 2x @x6? 0:((1p23N8W3D@@Bx Fxx F`x FHx F0x Fx F 0 xx WX@DHL~Ppx  ((pO W   ҋ|xx xx  z 0W`x  $xx  z 8888T T*9vWTȧT^ 2 3x  TffT | 90h(  T *9T *9g XV x,8$ 8  z *  TT*9 T _  ^>W`x   "%x$ x Ƿ 9(0(  ^ 0z(  .WaH<  0&(  ڋB6D 0:+(  8(0(  t b ]J xr F9(08(  WaJ>D  0(  F8 0:+(  R8(0z(  .Wx   d:N 90(  x   [| p *9~PǎLǞHǮDǾ@XXWH@~Dr` )H )P^`exf?   8`Q `0 x     ^`e  xr x^ xJ p4 x  x  1T` A!  ` "!^`e x   F`Q`x     ^`e xr x^ xJ p4 x  x  1T`A! `"!^`ex   F`x0 d^`x? (< (7`(7`(7.`4$~Dǎ@HHW`8<@DHL~PpPN ^T Pu0^TdЋ*ǼD4 >ǻЎLd^TǼD4p1΀  x?   x   s Z x   F  L60k`&  x   x?  bs T V nXL^X `s P6  2!/x, 2; s  kx?  ns ` V n\ LR^\    /x, 0  2!/x, 20 t[ x   ` L`RLx   ,  U  ! z"!!  [ x      4nT @<   /x/x%    8   /x/x%     ǻx Ў?L~PǎLǞHǮDǾ@<8``W 0 1@$ pA $   @W @!"pQ(Lt W@DHLPT~X ..\ .( (p xB . p $   p(H (L$ Sp(L ':Q^p P .@^P^P &@^΀8ΐ (P .^^p p2  p $  ɶD  p $*     ' P^^ P ^$ ' ' ' .^ . p) 'x  ^  -08( Vx  d .@>D(r 䞋Tx   .@>D׎( J  ' ' p\ p\^  Q  $ ' 'D '. .^ . d) '    -0d(,J D  . >$(H  T . >$(  ' ' p\ p\^Q  (pL֐qy< Dp p &8(0(ȂTր &Z  ( 0 Z0 90Ԫ(r &88(0Ԃ(JȂTր &8  ( 0 0 90((y q̋p &<hp & &:  80Ӻ( & :0Ӓ(ZF &0 &p  80L(p( $ . . . . .$ (p(t  nPp(pLtprqB^pP @ր &@x 0:'D(  .@ &@0( .@ &@0 .8(޺ & &@0 &h8(ގp &@ 0:'ю(V & &@0 &h8b(*V .@ &@00( .@ &@0 .8(̓:p(l"  0(݌H^P>ր &@x 0:'Ђ(J . (l   0L(L  ZnPOh8 Qa1. p H H   'x/x!    &2-0τ(L .8*:0^(&p( (D (pl   0(pQ ` xz s x  s  p   !p  x  6 &8-0B( 64 &89-0(͞ p  x   &8-0ͺ(J ڮ fs  !    x  &`-0T( HD &ސ 9-0(̠ p Q^x  fp &8p   90̜p<˲   |T^s  >p &8p ݦ  0(((΀9p\q @^x  x   Dn x    -0r'( bXx D ܜ7 .@'(ʦ  x (^P.tր &p &@  09'ʮ(׮ր &@x 0:'z(z~ & .@0 &h9J(J &@ .@0$($ .@0 .!9(B^P8ր &@x  0:'ɺ(ֺ &p *0ɒ(֒ǎp(d X x6'}T  p(L  L  '~XǎTǞPǮLǾHD@WxD~HqL'2Ll'3l"~HǎDxxW`x@.x3``WH8<ΐ @~DrxV .~ X6 B0'0   @ Ԥ  + ((0^(^(0:(: \N &h( 9Ҭ0(0( @ .8'0ư(@ Ӥ & &h0~( r &'(0N(N  + 6 &0(Ŗ 2 .80(d ~Dǎ@Ǟ<Ǯ8HHWP<@DΐH ~Lq )<(<(2(Z( F!@=!4T((:Ъ0( (:Ђ0֋ ({H ${$  "(0X(X =0 &h(:0", &h( :Ϣ04 L~LǎHǞDǮ@Ǿ<PPW@8΀ 1~<rL0  ~#0n(n &h( 80>'0(~#0( .+0(`  .,0 (0 ϔ~<ǎ8@@WX<@DHLΐ P~Tr z H'0('0(& '0(Ћ  :^@ z֠ & .8x   !w!| Ғ Ҁ \ lw!|jp B 0   p 9(0( v*0V(V9'06( *,0 ( 8'0(z ދ9(0(J ̮9'0( ̂ ,0`(`8'0@( 4 &0( &0( .3;( ˼~TǎPǞLǮHǾD@<XXWhHLP~Tp b Ǚ   X \ X\>`Xd(\z   ` `dddxpǞA  @ w Ǟd 0s ( z~TǎPǞL ǮHhhW`@DHLPT~X  5 @ 5 5p s p h 5. d 5hd p  'x) ק d, 4   4  4 jP0 2!/x/x$ 20^u ^ !0 #0@ #!^ 1E 2$'x) 21^  ! ^   !$ qQ^W^ DZ^ ^ ^ ǀ:^WQ^pΐ:΀.P^^pQ^t \p `\ \d^`Pe^ H p R^p DZ  Q^Q$Vǻ^QQ^6 2L[^l ǰ    ^ln ^tP8 Ƨxl  FP^t *   (;oD o$ o  .02(2ԓɄ   0(*0( $ V .0(Ī*0(Ċ .0h(h+*0F(F9+0&( .0(8+0(h ̋DmLm:  Ƕ(9  ǐ(9rt|jx>( 0|zhl Flf &lF  .0t(tԓ   0H(H*0*(* f  .0(*0( .0(+*0(9+0h( \.0:(:8+0( ` . 0(n x0ؓГ > (40^tP& t  !pt&J^tP8 ĔpĈ bp~XǎTǞPǮLǾHD@W@8~<p΀ l*: 4 m n o W@x.Q(h äTx(h t$h P,~<ǎ8@@WHND8<~@pD!06(6(t 4(4(J((pPW+(@&(pPW5Ћ<?(?( "@ Ch 1! 1\ TDQE(0(i1"#pPWDQEf(0 ( iP1DQE &h0(i*1.1&DQE(0l(lh1DQE^x*e n&e H $(0()0(g10#*$pPWDQEv(00(0g`1DQE"@:0 &h#:(\ ( &h0(f1,1&DQE(0<(<fl1DQE.@*c~ >&cX  (0()0l(le1~@ǎ<Ǟ8HHWhNdD~Hp0LJ '7(7(0(( 4 dD  d , d <8 d5 ,8 d5 XLXL%JLbLX 9LPT (. >$ 0s 2!'x) 20 7d6dCd~HǎDhhWXNTDH~L&1T!"0F4^T*5!"0TԆv*qidTħ^T%kP^T* s ħT1!"0vTQ &xh +VTxp, p.Tb Tħ,ǎT_ ȧTЅNJ|΀ pГip  0(TЌ^ BTǀth ^|% 0("T !1V.TQ+  TT1!"0z^Txf ,TT`JTħB~T]H ^T%TQԅ"ug܋F~T\ ^T%!!pTQxur(~Tr &h0( l0| 0(| 0r(r0( 0HTt| 0(Tth.| 0(T^*^T%BT  0vz^T\.TL-D<04,/$ TT p((p"p""PW"+( 0&(#p""QW"D(404((#p""QW"TPTT VTPnTTP8T^T̊|  &h&q(T .q0T *TP٦TT̊T5T hTqnPQx2Qa1 0a18b( "dTqnPQp2Qa1 0a18a qT7T hTqnPQh2Qa1 0a18a8 2dTqnPQ`2Qa1 0a18` q.PNT~LǎH ǞDXXWXD~HX'>X~jlp^&# VXpVFpX![X{NTp t pt.n(n(6D(( "p""QW"m!o!rpd(" U^pUJpps t !ph!lp  l!ldT .dlfpDǎt" !ph l\ǎt!  ph lp  l!ȋ\pds z+n,f-^/V.N0F~t!0  *ph plps SdpSPpǎt phd.dlD4 6,.P Rp^p ^P(  RvpRbppt'>ǎp thl^p(b QpQp t #tpQp&f Qjppt'>ǎp thlf5 7,.v Pp`p ^P(& PpPpǎt phl 0pp.tphvl0.R Oǎtp0 *phl^pP ^P( OBpO.pǎp hlBp ^P(> NpNpǎp h>ZhxJ >N> h hlLMǎppZ ThlplXjXN lPP0l .mn ol^l@x:@.M blx,L (L `.l2^h`x  xx TL< p VJ  .(("p""RW"1( 0&(#p""SW"m!nh VJK @p U NK0 p U> .n(n(8:D((j"p""S0W"m!V o!JHl&H  xRhM0h ,mn oh^h@x:@.I hx8 ,I L`hx,IT (I, .h.n(n(6(D((R"p""T@W"m!>o!2lpt,.0(.0(Ƌpt,.0(.0j(jv.0B(BN.0(&.0(.0(ʋ.0(pt,.0p(p|.0F(FRpt,.0( .0(pt,.0(*.0(pt,.0\(\h.02(2>N$1_&.0(.0(ʋ.+0(.-0z(z..0R(R^./0*(*6.,0(.4.4.p@h>l# .>l@h>l#ދ^.>lċD@h>l#ʚ.>lʀ.n(n(8~D((h"p""UPW"m!TPo!HDps 4.d‹ d lEz^lx  f@Zom n lx "lP%X~HǎDWXDH~Lpss6XsY  tb A)>P̰8PǗ bǙ ( '҆ Tl Ts  !sT p!~ '2LJss   >|P.LJssf   >NPǎP  X P4f: >PDxP^s0'  >P(e >fPs&sPCPǎP ڧP !0s)' 1xx 10P~LǎHǞDXXW@0 0 $ z z @@WhHLPT~Xp @ 2   ǐ Q>z\4h d"(\d|d Nh) dȾ<ǰ  NhhFN)6( Nh"Nh+  `d\ p`df Nh)DǸN)`( NhL \ JBdB..\d2!s (C2'Nh\ @ d.\.d1!s (C> Nh \Nh)@~XǎTǞP ǮLǾHhhWXDH~LpPBPlT .ǞP  PTp` .T7s97I2~LǎHǞDXXWhDHLPTX~\quNm2  !:  :  :h (*0(+0( &h(fOГOxd 9  l29 n9 Np  Pe^`9(0(" 9'0f( Z*0:(:+0( &h(=08x( ?f7x( ?Hn`p   L">( 0t P  KdP~\ǎXǞTǮPǾLHDhhW 0 nP %' \%# <%! ?Qa1H7Rb103Td11Xh1 ^sRtFr:c.p" y  !2W 0 2d&R1W 0 ld`RP@s.xa 1W@8~<q  bT اp50~(~<ǎ8@@WHND8<΀ ~@q  7!x= 0(l(dp23V`W3s   R! >  !(W  8 xND :  ND  ND ) ND  |ND  `ND  Dm V! (  ! ~@ǎ<Ǟ8HHWpHLPTX\~`pݼN  : f  $   ||HRݼD  $ ΐ ݼ  (P^+( 2(*"p""VW"6 0{(7 0{(@ _  &j: ր1' .=8. vX ր1 U' -t '-Z  Vx  8  z v08 000ГZQ"  v  x   (  0 .(79,0yb(x V x6:l  .0y ( / Hu$ ..0x( .0x(+0xr(r .0xN(N y6.9.ְ &/x  j  & jǰ x  1#B !xx !# 1  @ *   0m(zǻA~r 0( y0zfsv62F %B0x  *( vF0wc`v lV `T .89#0jF(wF & .8*0j(w( &*#0i(v:ǗyZ tDs 8tZtYBt t &\  *":  )Z dl   $DQ   p ԬvlVZ XD *W %"֠ &8s LD xg^MNM>M. :  x  L  'x/x!  nBLL`6P}" xD &h c x*   /0|t0 '  0f\(s\ Ex 'twN   0f(sL'2 '&  0e(rȋ l^PsGJ΋s rݼjp V f N~ $    ݨt t 6 &v `vs xzs :xxMXs8 M$pMpM   !XsY ZxT s  p x8s ր"s ր 0c t _ tH x$tPs Qs  x8s ր"s ր ۀ\ t ^ t tt x    h dXH.taR(&%8# (J:x47 >(4 t ~`ǎ\ǞX ǮTǾPLHW8  ~4p  ps dRz@zLz>" .s ""s q~488Wh<@DHLP~Ts I( I(adlVܧX dX@ r  + qԧ`4 z  :0`<(m< q~^dP2 "  :0_(l,\ +/2.90_(_6 l9*0_x(_ ll'>(j0_ l6 .0_(l .0^(k .39^(^ kndJ&ǘ d  90^x(^ klX  (*x-9*0^*(] k'>(i0] j .0](j .39](]d j&Ǘ B  90]V(\ jJX  ')V,.90](\ i'>(h|0\ i .0\(i .39\z(\> in\+~TǎPǞLǮHǾD@<hhWh<@DHLP~Tr E(z m:Z m   :0[(h l> t  :0[8(h8  %'J`'@d'69+0Z(Z~ g &h>(fb0Zz gl &h90Z(Z gt( 9e0Z gD8>( e0Y g `)jR&)X9+0Y(Y^ f &h>(eB0YZ f9*0Yh(X f\((9d0X f( .0Y(f .0X(e .3(c0X e2X^   90W(W d((9ch0W d .0W(d(  &h>(_0S a9*0S(St ` &h>(_X0Sp `'(9_$0S< `l .0SH(`H .0S$(`$( <^0R _`"R9*0R(RX _ &h(9^>0RV _ .0Rb(_b   90R*(Q _ !~9*0Q(Q ^ &h>(]h0Q ^'(9]40QL ^| .0QX(^X( =\0P ^(\    90P(Pv ]d 89+0P(P> ] &h>(\"0P: ]j'(9[0P ]6 .0P(]>( [0O \T> .0O(\9+0O(O \( 9[ 0O$ \TX .0O&(\&9*0O(N [ X~PǎLǞHǮDǾ@<8hhW`<@DHLP~Ts 7( _ _B N  :0N([   89+0M(Md Zȋ  : "NX^ Ц  0Mj(L Z^LX^ \  90M(L Zd'(:X0L Y .0L(Yǘ j  90L~(L Yr9+0LB(K Y6'(:W0K Y .0K(X .39K(K~ X ~TǎPǞLǮHǾD@<``WX48<@DH~Ls \HT>Г6P,   :0J(W HDǨ   0J(J* WBǨ ͔  90JX(I WL9+0J*(I W &h>(U0I VǗ  90I(I> V( (TZ0Hr Uǘ V  90Hj(G U^'(x'>x'>x'N @'xx >x '砋>x':>x'6 @'xx >x 'R @'xx >x '>x'~LǎHǞDǮ@PPWxDHLPTX~\r|ɴ|  Sԧl S.p^p'>l^(.M`(O S` l!>8`B`Ŷ.2)>t8Vt@Q^isi@80V P D P 2 x, s  P^ >Vs s> PP  s Ð2Ǯ r   `x ?2x ~Vs s> OXOJ s 2Ǿ ò &   YsY  4(+J(L8Z x  .p Pfp;BюN"lǾl@.l V Pl:"+0>(K &hI(Kh^P@O *0>((= K>Oj  80=(=z Jދ\ Ol: N.p^p'>l^(.H(JTN l 9~\ǎXǞTǮPǾLHDWxDHLPTX~\r ú  Mڧp M.t^t'>p^(.2>(8G0I *>( G0H܋`B`.,)>l2Bl@YsY @Vs s> JlJ^ s ^|TJ @|,s  &  &(  b  Px ?,xnVs s> IHI: s 2Ǯ   YsYh\(*8D0F(*>( D0E Zx]    .t ` J t4L pǮp@,p  Ip4"*08F(EF &h(8C0E*>( C0Dl I,pJ I .t^t'>p^( 7.(8C0DZ*>( B0D,~\ǎXǞTǮPǾLHDWXHL~Pp.x  FZ{@W(.{80(.Wz~PǎLǞHXXWXDHL~PpF6WeQ$ &jPWǐǀ .WǗ  Ep FF ( .W:~PǎLǞHǮDXXW@8~<p84  058(B8r>8X  04(A2&  :04(AƆZ NxB0'043  4 Al~<ǎ8@@W x> &  x@ (  Dx4  @ W@ xZ@@WX?@DHLP~TpD< &h( ;>0?p D0P D . .+02(? .,02\(?\#*02<1T   1 ? d CTO l)01(1T >4 BA0 &h  :1^(0 >R)012(0 >&( <<0> b#(00/  0X = ~TǎPǞLǮHǾD@XXW@8 ~<q'00V/n  / =8~<ǎ8@@W?P@DHLP~Tr Vr H4 ΰ p v p ,X` Vΰ p F p +X0 &ΰ p  p -X.XbR.\&s#>X2cX2c8N6X " h!XbR.lh s#>X2cb xV0(0.J(- ;>X " p!XbR.t!s#>X2cb xV0(0-(-^ :X @" x!XbR.|p$s#>X2ch(0-^,v   , :@X " !XbR. s#>X2cV0(0,(,l 9X " !XbR.~!s#>X2cV0(0,l(+ 9`X @" !XbR."s#>X2ch#(0++   +z 8X " !XbR.#s#>X2c88( <   ԋ        vr  (    HD(0* )   * 7~B(0*X)p   ) 7:N6 (+0)(6&4X XaRs.X c|  *!(0)|(6|& (0)V(6VX XaR~TǎPǞLǮHǾD@WP8<~@q,x WxT  XxT WxT @ p pps p` ,RV nDxp pps p` +RV nH<p pps p` -RV nL~@ǎ<Ǟ8PPW8 ȧ~4px6@* 80X 800x  'x/x- ~488W0 0 !   T   8 "    W@8 ~(p1('x$'.( |pBZ4L 1$'0(lffdXxT jWxT T9'0 "     0Ƌ V9'0   "  0`d  9'02J     9Wx  &' xxp#  px4  !NT!0  !NT!D9'02 J   n8 |t`  )1ݘ8(0 p    rZ |t )18(0 p $    |tX )1ܐ8(0 p    jRXx  &( xxp#  NT喇R'18(0 p   ^ ‹8(0 p    hp*  * bxx( \$x 89'0    4 )9r8(0 jp   L4@$xNT ( PTx(`  $< Wx  &' xxp#  px4  !NT! ꀋ0  !NT! xD9'0   H Xx  $( xxp#  NTD8(06pN   ~PǎLǞHǮDXXWxNDH~Lq:x<@0Ǟ$  dx0Ǟ  ,Ǟ  Px  :xx.:'0(֋x  pP \@Pp.|79 /HPp.89 /Hpǎǂ 0:)"( @Pp.|492pē$  :0(ċW PJFǐ^  0t(t PPJǐ  0(Fǐ   :0(6QE~LǎHǞDW@8~<p!#0d|   F~<ǎ8@@W@8 ~<q'0  t ~<ǎ8@@WX~<PTPnTxVxVPx8VxT  P.TNX`Tx8PQxT P.TNXP.TNX촋TQ`xP  x   xxp#!Tx:>PqA  !!NX㾋z>PNTt  !!NX஋BPax.TQ %NX|TxPxLH .T@P.@ʋTaxPQxx   @@4 (  "TD  DTTQx   P%NXP.TNXTD<|x? x.l0z( zTQx  .PNX^jPTPQ`xlTx\x  6 &p4 <P.PTNXvnT 8^P, %NX삋TQ@.PNXZ^^Px  6 &pj rP.PTNX~<XXW8  ~4 Rx]    jx   8 pxq(x  n~488W8 Lx  ֋,x    88WP<@DH~Lrx? ΰ 9x  lx Wǥx  6 *&  lW`x  TxxFB x Wǥx  : .&   LW`x  4xx& l 8x  x LWx   vH  Xx LWx  8 ,   :W`x  z nǥ xR(z  ("R   ǧ ' '~LǎHǞDǮ@Ǿ<PPW 0x  ( x   1W8 x  "88W@8~<pn& x  V ~<ǎ8@@W@8~<p& x  V ~<ǎ8@@W    WH<@~Dp x- ((p""\XW"   ZT NHH΀ . NH$΀  xxD' 1xxq!xx' (aP/R 2!'x/x! 27xxT΀  Nh  Ј  ZQx   .Wx    Ǒ| Px  js V s  FW exm   ( NH΀ 'x/x!'(V( ,! #8 "Nh.  &΀ ~Dǎ@Ǟ<HHWP@DH~Ls&bpx  ,'0t(  Ћ^Ɔ,9'0>(  (:'0(  r~LǎHǞDǮ@PPWH@~Dq  ~Dǎ@HHWP@DH~Lr0<8  0P(  zB<l  0 (  h66  :0(  2x^ RxF0'0      ~LǎHǞDǮ@PPWP<@DH~LqH+.L /P: /P /X0( , /P0( 0 /X9*~(  0 /X8)D(   .3; (  Z~LǎHǞDǮ@Ǿ<PPWxTX\`dh~l &`qX^tT^t 0 &nt9,02(  ~8+0(  J(t  0 b(t  0 H ^P .P^p &ְ .8 x  **0b( (:*0:(  x  ,)0( d*:)0( :nt.p1(^p(^,^t^04,;Hnt 9,0V(  8+0&(  v x  2 &0( 0  ( 0 D x  2 &0|( ؋ ( 0  9,02(  8+0(  R x  2 &0(   ( 0  x  2 &0X( ﴋ ( 0 d9,0(  ^8+0(n  .~lǎhǞdǮ`Ǿ\XTxxWxTX\`dh~lP &`qB^tP^s֠ .P & .8-4x,9j^exm  :.0(  Bf.90(   *0(P  ܋$ 1(*^tns^(,,0=n4~lǎhǞdǮ`Ǿ\XTxxWhNPTX\`d~h &`P .Hq^P .P^ &ְ .8ʧ|xptl+:,9@>( 0  h@>( |0   ,0(  .0p(  &h>(0  ,0( l .0( B &h>(b0z  ,0(  .0\(  &h>(0  |.p&.1(X^(^,04,;>( T0l  .x+0^(  .04(  &h>(0  T".1(:^(^,04,;h@>( 08  ċ<>( 0  .2+0( F .0(  &h>(<0T  F$.1(^(^,04,;>>( 0  Jz@>( h0   <>( ,0D  .|z+06(  .0 ( h &h>(0  ,F(.1( ^(^,04,;::>( 0  P^.*9,0(  V8+0(f  &| vx    ( 0  <x  T^ ( 0 :>( 0  `D  09,(F  49,0(  ^PH 08+<(  ㌋68+0(  V x    ( 0 L lx  ^R^ ( 0 :>( 0  D F 09,(v  649,0߲(B  ^PH 08+l(  Ἃ68+06(  >( 0  P$P^>.l9,0ޠ(0  8+0p(   x     ( 0  x  ^R^ ( 0 p:>( P0h  D 09,N(  ߞ49,0(ܪ  j^PH4 08+(d  $68+0ܞ(.  >( 0,  ޸"r.tL9,0(ۤ  d8+0(t  4.~hǎdǞ`Ǯ\ǾXTPWpLP~T\`.d>h $dh ^dx  < ǎ\~`.d>hNp(tp hN dn8 noo   4Ǟ\ǎ`Nd>h ~( ! .,$贋Vz0ǎ\~`.d>hNp(&ǎ\`.d>hNp~(.~TǎPǞLppWPTX\`d~hqP^l Q^lP &`^xP^w .PP &^pP .8%:^|㬆V.p91(-^xnw.p>|^(,0n4^lP (.x(0 N1(-6)  0ؐ(  .08\(n   ڤ .39 (  p~hǎdǞ`Ǯ\ǾXTPWxPTX\`d~hqB  ‹֠ &`Q^tP .P^pP &^lְ .8+4ᖆ`.l9nt.p1(^p(^,^t.l^0 4;(*0N8+0(  R  ~hǎdǞ`Ǯ\ǾXTPxxWxHLPTX\~`qB !d֠ &`!P^p Q^pP .Pѧ^hP &^tְ .8+4,.t9^pP d.h1($)ēʧl.90Հ(    8+0H(    א &h>(0  V *  0( $  0Ԙ( ^pP> .39f(*  ֶ8( 90  ~(*0n8+0(  r  2.l~`ǎ\ǞXǮTǾPLHxxWxHLPTX\~`qBd &`P .P^tP &^p֠ .8*4b.p9Rd.t1(bhl).90Ҵ(  <   &h>(06  8*0B(    Ԋ ^  0( X ,  0( ( .39Ѣ(f  >( 00  Ӽ.lf(,0 ܜV)< X  0( T ( 08*(  P   .39Њ(N  .hۄ~`ǎ\ǞXǮTǾPLHxxWhHLPTX\~`qx    ְ &`P &^d x  B9)0ϰ(  8   d9)0f( 9+0B(    ъ<9)0(  Ύ  N &h(=r0Ί  (+0 -٬ x   j9)0V( в.900(  ͸  x>8*0(  z  :~`ǎ\ǞXǮTǾPLHhhWX<@DHLP~Tqx    ְ &` & x  B9*0((  ̰  p fd9*0( :9+0̺(  B  <9*0~(     x   Ҳd9)0*( Ά8-0(  ˎ  N<8)0(  R  ~TǎPǞLǮHǾD@<XXW`DHLPTX~\qx    ְ &` &Zx]  ,:*0( R Jd9*0( 9+0ʞ(  &  <9*0b(    ̪ x  @8)0(  ɢ  b Zd9)0( .8-0ɮ(  6  <8)0r(    ˺ x   ְ .8(+0Ԕ x  NT 08)(  |  < 2N 08-Ȝ(  $  T  0 (8)0H(    ʐ~\ǎXǞTǮPǾLHD``WhDHLPTX~\ְ &`qQ^dP .P^` .8-: x  @)0|(    ċ x  ,:)0.( Ɋ ͂d9)0( V9+0(  ^  <9)0ƚ(  "  8-0b(    Ȫ|  0( x nd.`1(T(+0 >)  0Ř( ^ 08-d(    Ǭ .39&(  v~\ǎXǞTǮPǾLHDhhW@@hvrp\W긋~pd캋XL@΋4.(\H %2=nH<@@WH<@~Dq x  0 wx  Dx  xr  x  xJ   x" x    !Rx]   txx  Xxx<xx xx) ,x  wZ  ~Dǎ@ Ǟ<HHW@8~<p{R :x  ( { ~<ǎ8@@W88^V 8WP<@DH~LrPx   @<ǥ  0N(  ê>ǡ p 0:*(  l u~LǎHǞDǮ@Ǿ<PPWP<@DH~LrP΀ x   uD &+0\(  ¸ &04(  '90(     V~LǎHǞDǮ@Ǿ<PPW@8~<pWPFx   6 tN t,~<ǎ8@@WxHLPTX\~`qP ^pǠP^lxP^k^kp Q^ks s^pN F 8^p5(%x$' .( | p &npp x  X>:*((  x     ,dZ x   U^ddö^d  x   .>9r(  9-0B(n       >P^t x  n (` xxqt ^tP^t> xx0jx    ǡ Ǫ Px  4 ,xx Ǫ x   ǡ x   Z ^t x   pxxZ^t B xxZ^t  xxZ^t ^tP8*xo   ^t\ ^tP^lP>exm   $^lxx ^tP^tnkct$ .8 o^t 9+0(^   .+0(  oN^t 9+0`(  ,00(     @, .8 n^t 9+0(Z   .+0(  .+0n(  n"^t 9+04(  ,0( `     .8 m^t9+0[ (6   &+0r(  &+0J(  l^t 9+0(  ` .,0( 8,0(     nkat" .8 l"^t9+0[ 8(   .+0( ` k^t 9+0(Z  ,0(     nkeV x  F^lP> ("    >9*(  J jx   .j,s  1 0 !0 x ! ,> j6x   .  >9+0(  Pp >>9*(n p  0pp B.80(n   ҋJ.80Lb        ~`ǎ\ǞXǮTǾPLHxxW@48~<pǀ'Px   xx Lj>h(~<ǎ8 Ǟ4@@WHND<~@ǀp &@ .0( XDǁq !p %( &@ 80( ~@ǎ<HHWHND<~@ǁq !p %ä &@ 90 ( |Dǀp &@ .0( D~@ǎ<HHWHND<~@ǀp &@ .0( Dǀp .H &@80L(   .H~@ǎ<HHWHND<~@ǀp .H &@90(d  $Dǀp &@ .0( ~@ǎ<HHWHND<~@ǀp &@ .0,( Dǀp .H &@80( P .H~@ǎ<HHWHND<~@ǀp .H &@90( Dǀp &@ .0P( ~@ǎ<HHWx  V W8N48^V 8W@N<4~8p΀: xx ~8ǎ4@@WHND8<~@p p x- ((p""\W"xxq NDLJ LJ x ND^NDLN'x/x!'(:(2p""\W"LJ LJLJLJ LJ~@ǎ<Ǟ8HHW@N<4 ~8qN<~8ǎ4@@WP@D~Hp % %  %nLp]W s O s N s O s M s N s~ O sb L sJ M s2 N s O0]` 2$`$ $(L~HǎDǞ@PPWDHLPTX~\>ܧ.",J>."",>.""N^%2x<?,N^%2x<?"N^%2x<?" nXnVx u ǁ~44x ?  ;(! 3/(! 3p]0WN>$|Ljd "BLj ", "x " !  !ǞǮ &8:'0(  T^|(Q N ǞǾ &i  :0(  ǞǾ &8'0V(   7x( ep^|R N ǞǾ &i&  :0(  "ǞǾ &8'0(&   7x( dp^|S N 6ǞǾ &hb  :0(  ^ǞǾ &8'0(b   "7x( d6p N!ǞǾ &g  :0N(  ǞǾ &8'0(   n N!ǞǾ &g  :0(  ǞǾ &8'0(   7x( bp N)2Ǿ &f^  :0(  ZǾ &8'0(^   7x( b2pM N)vǎǞ֠ &e  :0B( ǎǞ &8'0(  b N)ǎǞ֠ &e  :0( ǎǞ &8'0z(  ʋHD N)FǮǾ &dr  :0(  nǮǾ &8'0(r   27x( `F p)NǎǞ֠ &c  :0b( ǎǞ &8'02(  !0 #0 #!,@: $ .x .= '>(8!0 #0 #!+: $ .x .'8(Ő!0 #0 #!+>:ְ &ǞǮ9'0   <   ǞǮ(0t(  ǎǞ8'0H`    ~ǎ &h( =0 R!0 #0 #! .x,"| .x)2P  .x  ! .xZP^tFRNǮǾQ^t9(0(   FǎǮ')0( ^tPN!0 #0 #!("D .x^Pְ &~Ǟ9(0 $    J~ǎ*+0( !0 #0 #! .xۊְ .8ǞǮ9(0F^     ǎǞ*+0( X!0 #0 #! .x&: $ .x x  4ǞǮ*(=6(  ְ &ǞǮ9(=   ~   >ǎǞ*+0( !0 #0 #!%2T  .x  ! .x^P@B6֠ &  .x .x^֐ &Ǿ9(0(N    .xǎǾ )0h( l<ǎǞ8'0.(  ~!0 #0 #!$<" .x@׾&֠ & .x׌n֐ &Ǿ9(0J(     .x .xǎǾ!)0( @<ǎǞ8'0(:  !0 #0 #!"@<. .x   ! .xHL1@9  2$@? $x/x+ 21.>#ؐq ǁR֠ & ֠ .8 .xx  x Ɔ~Ǟ9(0(  l~Ǟ:*=(t  4~Ǟ8(0(<  Z  ǞǾNP  (0F(   ǎǞNP B .8  -0(  Dŋ`ǞǾ:(=(F     n ǎǞ8'0Z(    !0 #0 #!J ǞǮNP  (0(h   (Ip's  1 0 !0 x !'ǎǞNP  -0R(  !0 #0 #!JBǑN*) 0 1 !0? xx !)~xWx   U^xx^x DZ x     ֠ &ǞǾ:(=@(   ǎǞ8'0(  X!0 #0 #!pa(0Vx  F P:(0p$R .x@p(0Xx   `xxp%x/x!'p   ɬl .x^ (8x( O&$8x( O2. .x   ! .x.>#ƋLq ǁp(0Xx   `xxp%x/x!'p @  6n .x` *8x( M&8x( MP^t^pjF֠ &2 .x  .xD֠ .8 .xd NQ^pPx  xx ^ZǞǾ'0(  V   XǞǾ:'0(     XǞǾ9'02(B     f!0 #0 #!xXx   U^xx^x DZ x   ˈ$ NQ^t ֐ .8~ǎ.9="(  r~ǎ8)0(  r  2!0 #0 #!VP^|x  6(xxq| ^|Q^|x  AxxX^|@xxX^| xxX^|^|P8(x?   ^|[ ^|Pxxq| ^|Q^|:mxm    xx ^|P^| Z|$<?^| ְ .8~ǎ*0(t  4~ǎ8)0(<  ~ǎ ..0p(  ?$^| ~ǎ8)0.(  ~ >^|P ~ǎ ..0( <~ǎ ..0(  ~ǎ8)0(  !0 #0 #!>^| ְ .8~*0 (  \~Ǯ8)0(d  $=|^|P ~ǎ ..0( ~ǎ ..0V( ~ǎ8)0*(  z!0 #0 #!L B|".<^| ְ .8~ǎ*0("  ~ǎ8)0Z(  ~ǎ ..0( z ;^|P ~ǎ8)0(p  0!0 #0 #!TIJD~Ǟ8(=t(    ^tPNւ^pPNӸv" .x.$FN4^Nք n֐ &ǮǾ9(0t      .xΆ $֠ & .xx? )0(  `.+!0 #0 #! Px? lx b *  x   x  s   s    /x/x% x8.+:!0 #0 #! 8r 8h Ps  !    x  s     x ǎ)0,(  |$NǎǞ8'0   d  $ s 0$ N v V֠ &~Ǟ9(00H    n N  V֐ .8~ǎ9-0   6   H@6 .xb   ! .x4$&,NP^t ֠ & )HǞǾ9'0   *   x? (Z NǞǾ0*0:R      x .xNк  J )HNQ^t$֐ & .x$֐ .8 .xǾ9(0D(~T  ~   xx? (>ǎǾs )( &TǎǾ(x? )0~(  ~  zNǎǞ8'0~<}T   }  z^tPN!0 #0 #!&J8 .x    ! .x^ax ~x r x  ^x  J s  s  &&0 #0 #& F < 2$NͰP ^|Z8D1Np's  1 0 !0 x !' T^| VD0(s  1 0 !0 x !(  r*dN̊>ǞǮ(0{({   }ڋFǮǾ<  90{@zX   z   }~xfxZ NǞǮ0'0zpy  zP   }|>ZǞǮ`  80zd(  y   |֠ &NLǾ  0y(y   |J\Ǿ  90yx   y.   {ǎǞR  80yVxn   x  {&s  s  (ǞǮ(0x(x^   {-v*s  1 0 !0 x !*->s  !    x ~ǎ)0x((w  zx,*s  1 0 !0 x !*,s  !    x Ǿ)0w|(w   yǞǮ(0wF(v   y(BǞǮ9(0v(v   yLz@ǞǮ8'0v(vB   yǞǮ &9(0vr(v   xǎǞ &8'0v6(u  x .x!0 #0 #!," .x^xN>!wx? 9F p ~JFǞǎ~6J  0t(  wFDǮǞ~6 0:'t(  wx? 9F "p JFǞǎ~5R  0s(  vNDǮǞ~5 0:'s(  v x? 9D *p LHǞǎ~4\  0r(  uXFǮǞ~4 0:'r(  u~\ǎXǞTǮPǾLHDWW 0 20 0p )\x p )XW8ȓ !   88W8ȓ\ !   88W@~<pnP^6Qa1UdUn~<@@W@~<pnP^6Qa1U XP~<@@W8nP_6Qa1TnP^6Qa1Tx88W8nP_6Qa1T$nP_6Qa1S 88W8nP_6Qa1S88W8nP_ 6Qa1Sh88W8nP_(6Qa1S$88W8nP_86Qa1RnP_06Qa1R88W8nP_@6Qa1Rp 888W@~<pnP_H6Qa1RRt&~<@@WW8;88W` 'Pah6Qa1` 'Pa`6Qa1` 'PaX6Qa1` 'PaP6Qa1` 'PaH6Qa1` 'Pa@6Qa1` 'Pa86Qa1` (Pa06Qa1` ( Pa(6Qa1` (Pa 6Qa1` (Pa6Qa1` (Pa6Qa1` (%Pa6Qa1` (,Pa6Qa1` (3P`6Qa1` (P`6Qa1` (P`6Qa1` (:P`6Qa1` (AP`6Qa1` (HP`6Qa1` (OP`6Qa1` (VP`6Qa1` (]P`6Qa1` (dP`6Qa1` (P`6Qa1` (P`6Qa1` (P`6Qa1` (P`6Qa1` (P`6Qa1` (P`6Qa1` (rP`x6Qa1` (yP`p6Qa1` (P`h6Qa1` (P``6Qa1` (P`X6Qa1` (P`P6Qa1` (P`H6Qa1` (P`@6Qa1` (P`86Qa1` (P`06Qa1` (P`(6Qa1` (P` 6Qa1` (P`6Qa1` )P`6Qa1` )(P`6Qa1` )/P`6Qa1` )6P_6Qa1` )=P_6Qa1` ) P_6Qa1` )P_5Qa1 0a1` )P_5Qa1 0a1` )!P_5Qa1 0a1` .P_3Qa1` .P_3Qa1` .P_3Qa1` .P_3Qa1` /P_3Qa1` /P_3Qa1` /P_3Qa1` / P_3Qa1` /P_3Qa1` /P_3Qa1` /P_x3Qa1` /P_p3Qa1` / P_h3Qa1` /$P_`3Qa1` /(P_X3Qa1` /,P_P3Qa1W8  b< h"  d|88W8 ȧ~4p p ( r@ Hċ ~488WW8 ȧ~4pHp   /`~488WPDH~Lppx'x- (4(,p""apW"s  s   /h /hx\ /hnPb06 /hQa1G0  .NPXSH /hnPb(6 /hQa1F  .NPtRnPb 6Qa1F| +8 NP(@nPb6Qa1F( NPX /hnPb6 /hQa1E  .NP`Q /hnPb6 /hQa1Et"  .NP( NPtTnPb6Qa1E  +  NP4nPa6Qa1D@ /hnPa6 /hQa1Dt NP4W    )DW (88 * 8IDW DǕ~ '(   RL@x   H FBh)l)R)@,  NPދ )W exm   ZW xxF  .nPa6Qa1B(Pxxd x  >ΐ  =l  =6NP /h . . /h@ /l . . /l . .ΐ  <  <`NPV /h . . /hB /l . ." /l . .NP'x/x!'((p""aW" D> /` F * /`s  /p C /`l (TF (Tꆶ * /`0   8Ej /`+NP̋ N' )r )[)]n>@4aH 2ԖH?0~LǎHǞDPPWP@DH~Lpx /` /hx?  /l'x& !;((!p""b8W"p.tp$b x   < xx $x     9  9:   x   Ҩ xx Ґx   vxx ^  L X:, D& 6nPc6Qa1=< (B @  *,(&  g x  ,Wx s s  lx ? nY '6Qa14 X (,@(v  &x ? nY '6Qa14  (,(  x rLx 4nPch6Qa13lPx ? nY '6Qa13D  (B,(* Px? #"x x dx ? nY '6Qa12 d (,L(ꂋ  2Wx\ dx ? nY '6Qa12  (,( x ? nY '6Qa11x bNh@ 8 (n, (V x ? nY '6Qa10  (,(nPc`6Qa10V fx ? nY '6Qa10\ $ (Z, (B Ǘ:Ǘx   Ĭ,(Yx]    xxJ /`@Yx]   P xxB  .nPcX6Qa1/L x ? nY '6Qa1/x  ^x bBx h&Wx\ dj b (,J(ǗJǗ x   ,(*v /`@Yx]   R xxD  0nPcP6Qa1-R bx ? nY '6Qa1-Xx  ^x bBx h&Wx\ d  (,(Ǘ<Ǘx   <,V(䌆t /`@Yx]   P xxB  .nPcH6Qa1, x? ( x ? nY '6Qa1+Qsp . s p .BQsp . s p .Qsp . s p .Qsp . s p .x xx   (:x? -Z,L(,,(b`~LǎHǞDǮ@PPWH@~Dq$!7֓~Dǎ@HHW@8~<q,7~<ǎ8@@W@8~<qՀ.76T~<ǎ8@@WH48<@~D r!rπxX BΠ  .ΠL  @ '悸 x΀Lΐ.qq     (  @ 't  ~Dǎ@Ǟ<Ǯ8Ǿ4HHW@48~< 61#ϐr) ΀ y q60#@ p!q!y   # ~<ǎ8Ǟ4@@W@8~<p &fl&\c&Ro&Hm&>m&4 &, V 6  .:   @"  _%֋&.@_%D,%% %~<ǎ8@@WP?8<@DH~L 1#p€'j Bΰ **, &* p ΐ,ρ*Ѹ    %  %f*   qp΀,* v $* 욊~LǎHǞDǮ@Ǿ<8PPW8 ȧ~4pb$D~488W(<@DHLP~Tp.xP^j!۸:jP̓` <} P^̋* W ^̋ ̓5 l* N l # P^PЋ2  Q^QЋ n a40^ L"|.ȓȓ#~ǎp>Nt.T@Ǩ q$D4 Lj p.T! qpDZ.\>4$xǎ^^ċ ǀ^XpǮ Ǯ pTq,ǮZ t^p:^l!$  Px  ~xtxd Wex  :x  xx  XnPc6Qa1 ",( A 0H\jH@ 8\*ǁ Ar .4x  Ⱦx Qx]  x@ l  :^70rldnPc6Qa14   |,@R ` #~TǎPǞLǮHǾD@<WW@8~<~XTq~<ǎ8@@W8Mȧ0~4p6p!H:L0,Ƕɬ(6 '>t\nPd06Qa1nPd(6Qa1|㎓d . ' t>nPd0Qa1. >$Rǖ .:t>nPc?Qa1. >$⨓: .t0nPc6Qa1HZ x JBW$x\ J:ᴓ~4ǎ088W@nPd88Qa1. p @@W8R:8V 8WH8<~@pQ zD  Q  >Dls `Lj ΐPQB>P  &Q Lj~@ǎ<Ǟ8HHW@ 0  'x/x!  @@WX?<@DHL~Pp!x x \pRǷD2 "zx ǰȎÆTʎ TǷ΀ Πΐ   xtWaxm      1D  2$@ $x/x$ 21 1C 2$'x/x! 21  ! '" ! ~x      1E  2$@ $x/x$ 21 1C 2$'x/x! 21  ! '" ! x hT ސސT ޠޠޘޘdT ިި@T ޸d޸ްHްX<x,[e     ǰY~PǎLǞHǮDǾ@ <XXWP8<@D~HL Lǘp ǩ z(x  xx Qx]|tx  \     xހހވވx `\Lސ\ސLޠ<ޠtޘ$ޘ\XLިި8L޸޸ްȶް ǐ9~HǎDǞ@Ǯ<Ǿ8PPWH<~@p΀xހވސޘޠިް޸(8DBD "DD>DDD D"DbD~@ǎ<HHWzWH<~@qpD &I\D. R DD~@ǎ<HHW@8~<q36D   1B  2$@ $x/x$ 21!0 #!("! ǁZ7!s97 xx !~<ǎ8@@WH8<@~Dqx8Q*x  xxPx <ф2 *x    !4 0 xx !!5 xx !  dp ǠD p  ߀!0߀ ߀0   !4 0 xx !!1 xx !  ǁ7As97 B#'x/x- BAX,(We  ~Dǎ@Ǟ<Ǯ8HHW@8~<q('Lwp~<ǎ8@@W@8~<q('Pwp~<ǎ8@@W0 0!@ BRx0x  s  AW@~<pD(L8ppL((0pLȌ((T (T xH(#ހ$ހQވ$ވQސޠޘhޘި޸ް.ް(L$pL(P$pP~<@@WX?<@DHL~PpT$:T X0T`PeX8Qa1ޠ,T`PeH8Qa1ޠB@΀ Z  B   PT +0    pT~PǎLǞHǮDǾ@<XXW0!HDDD,,, ,,DH,W@~<p ާp~<@@WX?@DHLP~Tpΐ ΀8Π@@ !  (  !~*   Dz  p %4< ,0"(/ ΰ l)֚   D  p %3 ,0"D(/D ΰ (~TǎPǞLǮHǾD@XXW`8<@DHL~PpP(^X@  xpD^XǕ8΀  r fQx] @ 8Χ   @ Ǚ^Xd P x Pj ǐ@ Ǚ L   ^XD  =v=n\P @Pѓ4N` xǧ ʋ ǧ ǧ΀ ΐd,  8x  d .s  p %*s  p % ؋ 0*" xǧЋ,\ǧ ǪǪ^XǕ8p    ^\P  x z st T_0 /tߒ 2 / < ZP  Lj D Ǚ^\D. ^X@^X@\J~PǎLǞHǮDǾ@<8``WH8<~@p$(pDDX0DDpDD"  p D8DDDw j p ~@ǎ<Ǟ8HHW 0,P0x  x1W@48΀ ~<~XX  Ǟq~<ǎ8Ǟ4@@W@~<p-Zpp`nPep6Qa1XnPeh6Qa1,<yv 0  ~<@@W@~<pnPex6Qa1Ʀ~<@@WXDHLP~T x d:e` 2@`!`πZ JΠ  .ΠL  @ t p ސe (F  (! 8H (2r H!>H .ΠL  *  @ Ķ  Q~TǎPǞLǮHǾDXXW8 ȧ~4p V  .:  @"߾ _&.@_~488WH<@~DpΎLÞ&2p )\xp )X) pp )XR1p )X17p )\    )\p )X  p )X) p )X) ~Dǎ@Ǟ<HHWH<@~DpLn2p )\xp )X) pp )X"1p )X17p )\    )\p )X  p )X) p )X) ~Dǎ@Ǟ<HHW8 ȧ~4pLF~488W@~<p ZV  Q`@d0qx Dx4nPf(6Qa1( *! * x-/(h(`p""eW"nPf 6Qa1(nPf6Qa1nPf6Qa1nPf6Qa1nPf6Qa1XhnPe6Qa1(nPe6Qa1 ~<@@WH8<@~Dp"N :Zǧn    2''B~:  \  ԋ $'  \0p\|nrT'\\'R4'D,:,('  2': ~Dǎ@Ǟ<Ǯ8HHWH<@~Dp0   00 (O(>( (O (0 0hb(0 0@0ϐ  O6(~Dǎ@Ǟ<HHW@~<0nPf@6Qa1xnPf86Qa1L0(:  Nj(t0p(0 N*(0nPf06Qa10(  M(0p(0x M(@~<@@W8 ȧ~4pp+J~488WxDHLP~Tp Nΐd΀. bX.v0~XX00,X+ -Y0   eeqg.~TǎPǞLǮHǾDxxWx@~DpnhW%' \%# <%! ;Qa1P5Rb182Td1 0Xh1 &Hh.t4?t&pHh.t7>tnPfH6Qa1tHh.t8>t~Dǎ@xxWXD~HpLU  LLPT  (. >$p T'&'v ":*nPfP6Qa108~HǎDXXWP<~@pWp<   xtz   xbp Qx]  /Z(P  l0,  “4DI  HI`  L: G.DH!L8D 7  (Fb*c.~@ǎ<PPWH<~@px DH<,DD'D8DG ' DvDG"DTȓҋjb΋NL4d e~@ǎ<HHW`?8<@DH~LpFW `^   | x :LJ&Dp 8\F\0( ($*  pj(  2B  8RǸF( \* Lj͋PM" F PML {PM2 {* @2  ċ.  b ڋz\C( f \lDi& 0 8@F\C" \ z~LǎHǞDǮ@Ǿ<8``W80(Γ88WH<~@p΀DZ HWx6x  "xxDwpDf(TF: /p:DQe(Dǁ^De \x 0x x , D dDTD(DDD' /D /D @6~@ǎ<HHWH<@~DȓxX,P fp((Ǒ8     Ǚ(Ǒ8p΀  bQxPax >x  *xx(P:    Ǚ{pN(8ǐ8    茎ǐ ǙȆF:~Dǎ@Ǟ<HHW8 /4x( z  /x( z8 :̓88W8 ȧ~4p&wp~488WH8<@~Dp0#,w   w ~Dǎ@Ǟ<Ǯ8HHW  W`?DHLPT~Xr Ϡ:"0\܂\\\ ΀jǹǩ  2 0 * ! D  z Ǚ~XǎTǞPǮLǾH D``W@1  @0 & @0  Q WP<@D~HpLDLLLL LLL0 .{*LLbw@L0 .{LLw L~HǎDǞ@Ǯ<PPWXDHL~Pp qTXljF9   T(lLjǙTxh 'B   '†$ ǘ ǘǎT|XPl H6LjT~PǎLǞHǮDXXW WpHLPTX\~`pȧl h^lU^l LDЧ(l,,=v ^>>(,h(P 8NlDnh.1.(,9tjdd¨ (,.ً(,=  Ťwnd <$.((9Ŝ > (,8. ,0( 0( 80 z ,($>'(!8V.,8(: 0( 0 z ~`ǎ\ǞXǮTǾPLHppWXHLP~Tp sp(D8((DqDwpp}ߨ i~ߨpD|wp~@ǎ<Ǟ8HHW@<((@Dp(d(tˎ 2L /0 /඀ /0~<ǎ8Ǟ4@@W ! W@ ~<q* ~<@@WH8<@~Dpgv x ΀ J>: z " z ΀   s ΀@ǩ p<   Z Ǫ " ry* Hwpۋ@ s  $ 0 s  b  ΀ ΀@ ,$  ΀ ` s (ԅ R z B z .΀ &΀ м  Y~Dǎ@Ǟ<Ǯ8HHWWWW@48~<p>F :ϐf   (e p~<ǎ8Ǟ4@@W8 ȧ0~4pϞV0X8WsY ~4ǎ088W@48~<q "$pF ~<ǎ8Ǟ4@@W8 ȧ~4p p ( ( W ~48p8W8 ȧ~4p V$p V'$ 80!p""gXW"$ Vp~488W<@DHLP~Tp. .Ƿ . .dǻQ^h x\ ǀp0  2! !x/x$ 200  2! !x+ 20n Ǒ        P^Xz0  2! !x/x$ 20  0 2!'x/x- 20P ^X  P^Xΐ ΀@P^pǷ ^Π P    xX>x"[sY$    0  2! !x/x$ 20  @2 <(, , (,nX  ê  0s 2!'x/x- 20 b'(,0,P^|ʚQ^x  ZP|Pf   x ^pP؆ndJ@    7!0! (B !  !!!!Q^pP^x     ( ( Q 0  2! !x/x$ 20 0   2! !x+ 20j\\ $P !  !!!!^|P xp P &p4tppp \ א0p 6 s * X  'x) ^xP"[^\ \^\$[^` 8^`p 4 !0x"! 1xx 10h   @        ttp x x!  xx  ǻ^hPP^hǷ    ~TǎPǞLǮHǾD@<WX<@0 1Dΐ@H~LPR ΀ p sqT xPx    s0 Z 2 *  s 11 Z , "  s  Z  P.TE~LǎHǞDǮ@ Ǿ<XXW 1  0W  V W  R Wp<@DHLP~Tqp|l  С[n[ j 2X  p߱ $ pߡ $ (Uΐ \ xx  x! PP^hax *p(H$ Q^hhV P ^d   NQ ^`P ]^l   `lx Q^dd r @  !0 #0 #! 1#@ !@ xx !# A$0 = !0 x !$Q^\^\ A 4s)' 1xx 14n[  ыxWxx  Qx $p(H$B1C 2$/x/x$ 21('L؋('PwpM~TǎPǞLǮHǾD@<ppW8 & &XT &X &Xˮ 'X& 'X 'Xˀ '` '` '`R 'h 'h 'h$ 'p  'p 'p 'x n 'x 'x88W jx   ( x8Px  "xx  W8d \88W 0 4x(RxV? (? 1WH8<~@q ǘǙNH ~z /L / x /ǐD z  @$ plqG~488W@ 1~<p tBxM @(`( INqs  4R   p~<@@W0!@0N J`x  8x.Px  x  AW8 0 x   8R   0rx  0NPx  :xx*xxxxxx188W@0 0!~< qBpxM @((pBDhWDs   RVq pxR  $  np@q8 Np  6pq~<@@WH<@~DpZx? !Dx?  0' Ѫ' є~Dǎ@ Ǟ<HHWH<@~DpzZx?  Dx? !0' ' ~Dǎ@ Ǟ<HHWH<@~DpPx x x? 8x? 9>WxV? 9? 8jx? 8V(F'  0''~Dǎ@ Ǟ<HHW x&? 0((0/p""hW"9 : W@~8p 0x&? 9(9(68#((N/p""ihW"0!: :!. ?  :?0~8@@WP<@D΀ ~Hp s   p NZ OJ! N O$ O N ~HǎDǞ@Ǯ<PPWP@DH~LpNPVnNP\'  *Fǧ '8x,/x<?NP x x ~LǎH ǞDǮ@PPWH<~@p x? 1s   >Px? 1(s  " H(@D  *x? 7  (~@ǎ<HHWXDH~Lpx? zP!?Lb&TPx? 1<s  2T 0' F~LǎH ǞDXXWP@D~Hpx? Dx 4L!1l (x? Bx 2L 0' Lx? :x .' ,' ~HǎD Ǟ@PPWPD~Hpfx? L!1V0x? L 0*~HǎDPPWH<@~Dplx? Vx? :B'  b,' L~Dǎ@ Ǟ<HHWH<@~Dppx? :Zx? F'  Ȳ0†~Dǎ@ Ǟ<HHWP@D~Hp L 0lx? :| ~HǎDǞ@PPWPD~Hp<x? :$L ?چ~HǎDPPWP@D~Hpx? :B '**"L.?RL]~HǎD Ǟ@PPWH8<@~Dpx? : x? tXxV? 9? 8N'  8) "X~Dǎ@Ǟ< Ǯ8HHWH8<~@pPx x x? 9x? 8x? 9ll\(D Gt2G6 ~@ǎ< Ǟ8HHWH<@~DpjPx? 0Rx? 0>x x *~' ~Dǎ@ Ǟ<HHW`?DHLPT~Xpxx? ($"ꘋjZ| ^:_ֆ(^_  Z ^:_r(^_  鴋lj    Px? 8x x  x  ΐ ސ  v  :0f    0? #x/x+  悧       0? #x/x+ .   x :   /x/x%  Ч  s   s  (d Qs %0 1 !0 x !  !s  1 !0 x ! b Qs  2% 1 !0 x ! !s  1 !0 x !  JeN::   ? x/x+ 抋\"`2B*   ? x/x+ *   ? x/x+  /\ /*   ? x/x+ &   ? x/x+ ^*   ? x/x+ *h ~XǎTǞPǮLǾHD``W@~8 /p(d / * /pDp<p:p$x? < <p / /q~8@@W /W@~8p /, / / /p0<~T1t qnPk5Qa14> nPj5Qa1 q Pxxp :nPj5Qa18nPj5Qa1l!  s    /p nPj5Qa1nPj5Qa1* >0KnPj5Qa1   p  / nPj5Qa1nPj5Qa1  < >0JnPj5Qa10Іp6 nPj5Qa1nPj5Qa1(qy2pT},Iy qnPj5Qa1h ~TǎPǞLǮHǾD@<xxWH<~@Xqb\D$fDnPk 5Qa1nPk5Qa1nPk5Qa1TnPk5Qa1( H~@ǎ<HHW8 ȧ~4pLwp~488W@8~<p΀\N    Kwp~<ǎ8@@WPD~HpfX D( 0 '0BfX\ (> ߘߠ0$hPk8Qa1  ߠz Nߠ x:ߘ $ !ߘ $ !:ߘ $ !ߘ $ !B nPk5Qa1' / /nPk5Qa1\ xbnPk5Qa1$nPk5Qa1ꘋ\nPk5Qa1nPk5Qa1< D|nPkx5Qa1`D  H""XJ\tߘߠ $ ! ߘߠ0$hPkh8Qa1ߘߠ $ ! ߘߠ $ !ߘߠ $ !fߘߠ $ !Ll, ߘߠ0$ ߘߠ $ߠߠ 'Bߘ $ߠnPk`5Qa1Ѡ4nPkX5Qa1P0nPkP5Qa1 nPkH5Qa1L 6 zD0AnPk@5Qa1nPk85Qa1nPk05Qa18' /XnPk(5Qa1A~HǎDPPWXDHL~PpɞdX( 0 * x'0;@X6  x \ !> ߘߠ0$hPlx8Qa1  ߠz Vߠ΀ߘ $ !ߘ $ !ǧr TX .T ߘ z $ !ߘ z $ !Ǫߘߠ $ ! ߘߠ0$hPlh8Qa1ߘߠ $ ! ߘߠ $ !ߘߠ $ !fߘߠ $ !T, ߘߠ0$< ߘߠ $ߠߠ `'ߘ $ߠjnPl`5Qa14'nPlX5Qa1nPlP5Qa1nPlH5Qa1@nPl@5Qa1nPl85Qa1@(6p""mW"D / /DD /ЋD / /D /؎ /x8D /DD /D /؋@ /Ћ "xDDD /؋JD / /D / /؊D /D /~@ǎ<Ǟ8HHW@~<( /Іp / /w'x"#(|(tp""mW"f  / / /D  / / /$  / / / /Њopw'x"#(X(Pp""mW"'  2     /Њ~<@@W@8~<pF/6$X~\ ߠz ߘߠ $ ߘߠߘߠߘߠߘߠ ߠߠ  zҲߐҤxpnPm5Qa1 g<g&nPm5Qa1ш +hfnPm5Qa1H$x 6nPm5Qa1а0nPm5Qa1ЀnPm5Qa1Ь*֋\ nPm5Qa1`nPm5Qa1cnPm5Qa1Ϝ,)(hbZ,)e@)X6LJ-LjLJ-vLj~<ǎ8@@W @  x0d.Re & x >x   s#cA AW8 ȧ~4p0(p8  ,Dwp~488W@8~<p"`LJ+LjLJ+Lj(ǀ8v +Lj~<ǎ8@@W@8~<pRLJ+bLjLJ+JLj(p8+.wp~<ǎ8@@W8 ȧ~4p w*wp~488W8 ȧ~4p&&$(l~488W@~<pfXX\ 6nPnX5Qa1&:\^ߘߠ $ ߘߠ$`PnH8Qa1ߘߠ $ ߘߠߐ xߘߠ $ߘߠeߘߠߘߠ ߠߠ ߘߠ $ߘߠ(lߠߠ nnPn@5Qa1|Ѡ4nPn85Qa10nPn05Qa1ɸnPn(5Qa1Ѡ~#*#|#nPn 5Qa1ɔnPn5Qa1hnPn5Qa1(l[nPn5Qa1nPn5Qa1x# $f X~<@@W@~<p^dXPXF\fߘߠ $ ߘߠ$`Pn8Qa1ߘߠ $ ߘߠߐ xߘߠ $ߘߠeߘߠߘߠ ߠߠ ߘߠ $ߘߠ'(p"lߠߠ 힋nPn5Qa1ƬѠ`nPn5Qa1nPn5Qa1\nPn5Qa1żnPn5Qa1ŐnPn5Qa1nPnx5Qa1ŘnPnp5Qa1 (plWnPnh5Qa1,nPn`5Qa1Ġ~<@@W8 ȧ~4pX\p ߘQzwq'0$#\ !B !2 $ !ߘ $ !Bߘ $ !2ߘ'0$# ߘ $ߠ ~488W8 ȧ~4pdXPX B(h\ (p8!Nwp~488WP<@DH~Lp /Xհ\ ΐ/nPo 5Qa1 'χ$8  q7 {,"7  ,q7 ' N@ H>հ4\ "nPo5Qa1`nPo5Qa14&6  Xq6 nPo5Qa1nPo5Qa1.nPn5Qa1tnPn5Qa1(nPn5Qa1&5   q5 ц4nPn5Qa10nPn5Qa1dnPn5Qa18h.lnPn5Qa1 /Qēvh.nPn5Qa1 /Qt: / /հ~LǎHǞDǮ@Ǿ<PPWP<@~Dp΀n  LH Lp LHp ~Dǎ@ Ǟ<PPW8 ȧ0~4p h<0΀h lw   w~4ǎ088W@48~<ր /p>X,Lj>LjR ~<ǎ8 Ǟ4@@W@~<pȋ,_~<@@WXDHLP~Tr r:XT\jߘߠ $ ߘߠ$`Po8Qa1ߘߠ $ ߘߠߐ xߘߠ $ߘߠdߘߠߘߠ ߠߠ ߘߠ $ߘߠp!("lߠߠ ᆋnPo5Qa1Ѡ4nPox5Qa10nPop5Qa1nPoh5Qa1Ѡ~؋*|nPo`5Qa1nPoX5Qa1nPoP5Qa1p(lKnPoH5Qa1nPo@5Qa1wppΐ΀Π / /ȋp / ݠW !rW %0 NtW !HW %0 W fwpnPo85 /Qa1nPo04Qa1 0a1nPo(5Qa1 IP  / /~TǎPǞLǮHǾDXXW@8~<qt /nPp5Qa1nPp5Qa1nPo5Qa1tHDfZXPL\hߘߠ $ ߘߠ$`Po8Qa1ߘߠ $ ߘߠߐ xߘߠ $ߘߠdߘߠߘߠ ߠߠ `ߘߠ $ߘߠp!("lߠߠ nPo5Qa1Ѡ`nPo5Qa1|nPo5Qa1P\nPo5Qa1 nPo5Qa1nPo5Qa1(nPo5Qa1nPo5Qa1pp(lE.nPo5Qa1nPo5Qa1~<ǎ8@@WX?@DHLPΐ0~Tp,΀:nPph5Qa1nPp`5Qa1`nPpX5Qa1$nPpP5Qa1  rǰ * nPpH5Qa1nPp@5Qa1  nPp85Qa1.  nPp05Qa1 P e B 2 * " B V ǻnPp(5Qa1nPp 5Qa1`nPp5Qa1$nPp5Qa1 ~TǎPǞLǮHǾD@XXWP@DH~Lpǐ ΀:  s s PF :ǪnPpx5Qa1.  0nPpp5Qa1.  r, @, z@;  ǗǙwwp~LǎHǞDǮ@PPWX@DHL~Pp Tۊ* TxRH'(81(20,!p""pW"TT TӤT T pp8Ǫ  " T 4    TT (TT2Tp /TTp /ۧT~PǎLǞHǮDǾ@XXW`P~Tp.p\.X XdXhH @ X(,\0. 1 L< X(,\0. 0 ,p=@~TǎP``WhPTX~\qvnPp5Qa1nPp5Qa1 "p<  * :&nbPp5Qa1 nbPp5Qa1n^b5Qa1(,0. 9bnPp5Qa1nPp5Qa1~\ǎXǞTǮPhhWH<@~Dr\PE.p0q !1A(E.p0q !1AnPp5Qa1nPp5Qa1 :E>p p 1!AL@ pt .  8َ pt .  tnPp5Qa19nPp5Qa1\`p9H,xXX P6x &$;F!.t|||8l~Dǎ@Ǟ<HHWH<@΀ ~DrnPq85Qa1PnPq05Qa1$!p4WP*^V!  H>: ߘ z $ !xǙ vXL<&ߘߠ $L ߘߠ $ ߠz dž' 8#@ ߠz P B , x*ߘ z $ !&ߘ z $ !JnPr5Qa15@nPr5Qa1 s & 1nPrx5Qa1XnPrp5Qa1nPrh5Qa1nPr`5Qa1tnPrX5Qa1LӸL10h|^ V 0nPrP5Qa10   x6nPrH5Qa1p0nPr@5Qa1@nPr85Qa1ls \ nPr05Qa1nPr(5Qa10nPr 5Qa1XnPr5Qa1,,` .Ћ    x d.Xe dž dX\x n Pcl .P,*ߘ  z $ !$ߘ  z $ ! T.PcbQx] T  z@LLP:L .LZZx J  z \T .P .P Paj .P(ߘ  z $ !$ߘ  z $ ! PazЎ  .PN(ߘ  z $ !$ߘ  z $ !Ó,`x P :>nPr5Qa1 .dnPr5Qa1  P`P+nPr5Qa1t TXLD6nPq5Qa1L4nPq5Qa1x4 T.P_Qx] P !nPq5Qa1\ <22\x L !VnPq5Qa1 3֋ P^vjP)FnPq5Qa1 9n1` P^:zЎ P(nPq5Qa1 91؋Ó)$nPq5Qa1TnPq5Qa1Ć P\tnPq5Qa1( *, !4)|ܓ`\ R P\nPq5Qa1,nPq5Qa1 (nPq5Qa1nPq5Qa14,P&V DnPq5Qa1@nPq5Qa1 'nPq5Qa1 PZPnPqx5Qa18,P%ZB T.P[Qx] hnPqp5Qa1nPqh5Qa1PnPq`5Qa1P, !$X PY~6nPqX5Qa1H0nPqP5Qa1,LP#ҋ PYЎ 6nPqH5Qa10nPq@5Qa1l,P#&Ó# ~HǎDǞ@Ǯ<XXWxPTX\~`ps8ts P < 4  x d.Xe dž  ъXlh^ lVLǧ n$Pr5Qa1,l>$0@ 4)8Wl(  xzh pV2nfPr5Qa1pΠ@l( t.pVQx] (nfPr5Qa1Π ~x  tΠ( Π&$nfPr5Qa1 nfPr5Qa1N lUbjΠ2x&nfPr5Qa1 nfPr5Qa1$ΠnfPr5Qa1 lT~hΠ0x$nfPr5Qa1 nfPr5Qa1$ΠnfPr5Qa1$  ͎ f  xBw n$^f5Qa1l>$,04) ~`ǎ\ǞXǮTǾPxxW觎~p> @r  1Ar> @r 1AN6N 0r A1q~ǎWX@D~Hp.xp p ǗǗ H H H' 2'(^1(20R!p""sW">4Z G < :   V , x$E.x0tH !1A4( T0 Vx|NX'z*x| b  6x|NX'=DTwrdTҋH x4LJnPt@5Qa1. F x; PwTv(PTP ;rT;:r΀,ΐ:e$wJ2 Tv8 Trwp;ȋ 4\p=΀*n(x|<&v H Hp / HH0*$ Hp /^.$1xp q  2!/x/x% 25$ǎnPt85Qa1. ^&5$   2!/x/x% 25$ ǁnPt05Qa1. j; PtBz MPLTPV6PLfTިP.0ސPP ;rLsxMLL*T.L8LK†TL04LPJ1ƋLH;ݮw nPt(5Qa1. ʋhs ~Wz@zfr. ;8 nPt 5Qa1tnPt5Qa1\88 nPt5Qa1T xuHs87 ;| ր ǀW$x\ 6nPt5Qa1. 0nPt5Qa1. պ s<6 nPs5Qa1nPs5Qa1;nPs5Qa1TnPs5Qa1(nPs5Qa1nPs5Qa1nPs5Qa1nPs5Qa1xnPs5Qa1LnPs5Qa1 nPs5Qa1~nPs5Qa1~nPs5Qa1~nPs5Qa1~pnPs5Qa1~DnPs5Qa1~nPsx5Qa1}nPsp5Qa1} 0 H H 0 0nnPsh5Qa1}l;תnPs`5Qa1}8nPsX5Qa1} 0nPsP5Qa1|;nPsH5Qa1|nPs@5Qa1|tLJnPs85Qa1. nPs05Qa1|1 ;<;2ǁnPs(5Qa1. :; PkPV;ռLjL.;Ք~HǎDǞ@XXW@ 1A @@WԇJݸ 0ݸ ݸ W0 Г00W} ԇ W0 Г00WW8 7@ 88WX@DHL~Pp} pTi"T '(("p""tW"p bN @ϐt* ϐP ϐ, ϐ ϐ ϐv hϐ"R Dϐx.  ϐT  ϐ0NX WczfWdBz.^VNXP ϐ, ϐ ϐ  ϐ2v hϐR Dϐx.  ϐT  ϐ0 ϐ܋  ϐ܋Te,^VNX8^VNXN@2,$ @   "    ^VNXxϐϐzϐfϐ~w&wpTN1@ .wH I2JHΐd~PǎL ǞHǮDǾ@XXW@@ABC D E F GH IJKLMNOPQRSTUVW XY Z [ \ ]^_`abcdefgh i j k l mno & & & & & & & & & & & & * &x '(17T(27> 17$ 27  16 26ֶ 1H@16 &h .ߺ &ߦ .ߒ &~ .j . V &B . . .( &H  .0p@@WW@48~ ' &** ' .X* ' .`* ' .h) ' &)ܶ .pp %)ݶ &p %) %x .8) %| &@)z .@p %@)^ & /H~TǎPǞLǮHǾD@XXW W8 ȧ~4pچ p ~488WP 4 8 !<@(~D~( Z! "^ @ .^ޠ ,ް +ސ -LL0J{)HHHH1$tD (  ( - -  - - - - -8 -<@ -P@ -T` -X` -\ -x -|  -  - - - - - - - - - - - - - - - + + + + + +8 +< +@ +D@ +H@ +P@ +T` +X` +\ +` +d +x +| + +@ + +  +  + + +@ + + + + + +H + + + + + + +H + + + + +4 , ,@ ,H ,l ,$ ,  , , ,( ,, ,0 ,4 ,8 ,< ,@ ,D ,L@ ,P` ,X` ,\ ,` ,d ,p ,t ,x ,| , ,@ , ,  ,  , , ,@ , , , , , ,H , , , , , , ,H , , , , ,݋ߓH ~Dǎ@Ǟ<Ǯ8Ǿ4PPWԉWWjWzW1s3@P @ ' 1@0 @W7W'W0W2*@G@@C@5@A1WAG@@A80WAC@@A40W 1 0sp` W0!@@BBB02@ 4@ 420(00 0`0(00p0(00p p0@ 402 0 xx 02W觎~p7Axx ?wQ %^ހ (^ xqq΀$p ΀΀ `(" #^ ΀΀` ^΀a08 *1 p  04 ~ǎW@48~<p1#x xxx #xx Q  %q@ $G@Eΐ I@H΀舀0xx  /HTp  B!!s @  ! ! ΀@(  pp4   /HJZ "$@ !!  !C  B x/x( B$   #~<ǎ8Ǟ4@@W@48~<q'x xxx '8Xaxx   q  `0q @  5@ 4Eΐ I^@ΐˈ,xx  /Hl\ހ ( C01q ހ s!0$@ !ΐC8(  x   ΀4 /HV  Ǘހ  xx 0X@ J !0G4 x< 11 A0 xx AG7 1   17~<ǎ8Ǟ4@@W~!x/x!0 #0#0@>A~xAA0 s41x?x?x1 s~ xq@0as0 C7p 7x?x1 C@1q80A0`C1q8p 7 401@ 400100 0101hxx0 6@xx 0 C1 1x?x1 C@$0 xx0 !<       "0 1 xx 10~WPDH~LpAxx 2ǂ ΐ xx LJǒx xxx DŽxxJÇ΀×cÄ΀×cÄ΀wDcGHcBA@ppCqAހ H GCCqACBp GBND@0@*  "2 1 xx 120ÄcÄcDccRBxV @xxx @Bs@C @@!$ s@C @@BTxOxA0 C5x?x1p 71$$~LǎHǞDPPW~r`Y)' n%# F%! ;Qa1h&! 5Rb1H&# 2Td1(&' 0Xh1 4Q %^0 #0^ 0000 s87@ 487C0^s@`GpD G A $CaGaCΐ p`yw t@Tΐ `I G@EaCp s0`73 408 ( x|    r'!0 #'!2 . `#`qQ@ Ca  `   !0 xx ! ~ǎǞWX@D~Hrxx  xx 2xx gX(' l%# D%! ;Qa1h&! 5Rb1H&# 2Td1(&' 0Xh1x xx  gY)' n%# F%! ;Qa1h&! 5Rb1H&# 2Td1(&' 0Xh1`xx X Pxx Hxx8   Xxx gX(' n%# F%! ;Qa1h&! 5Rb1H&# 2Td1(&' 0Xh1gY)' l%# D%! ;Qa1t&! 5Rb1T&# 2Td14&' 0Xh1  xx Bxx  (gX(' n%# F%! ;Qa1h&! 5Rb1H&# 2Td1(&' 0Xh1Vxx B xx  (gY)' n%# F%! ;Qa1h&! 5Rb1H&# 2Td1(&' 0Xh1`xx Qxx  (6%6x/x! !x?x1 1L|L'b6(9x/x! !x?x1 1LF L',~HǎDǞ@XXWX@D~HqnLW'' \%# <%! ;Qa1X5Rb1@2Td1(&' 0Xh1>T#x!!V  1xxx 1 L(>T~HǎDǞ@XXW x/x!0 ##  !x/x!0 ##! x 1x!!x11#H $!    <x (  x/x!0 #1x?x1@ 4(# x  x/x!0 #1x?x1@ 4(# x  1(# x  1(# x X 1(# x 0 (! x W  0 #0 #0 #   Wp@DHLPTA~Xr0xx xx   pϞ\ Ϟhýìǹ§Ϟdiΰaް ǹް l^ 0hldh`^\d `ΐa  \]`` d\`h `Z`!ސ \p \lސ `p `lpl\ސ lP ^ 0 R0`B``.`\\!\\`  J4`!  \p \`p`\ \`7xxZ 0xxx 07 .  02    xx ~XǎTǞPǮLǾHD@ppWH<@~D rxx xx B  xx gY)' l%# D%! ;Qa1h&! 5Rb1H&# 2Td1(&' 0Xh1xx gX(' n%# F%! ;Qa1h&! 5Rb1H&# 2Td1(&' 0Xh1 xx 2xx $xx 2 xx $  XP'xxZ xxx    '>~Dǎ@Ǟ<HHWh<~@pxx (xx  n\W'' \%# <%! ;Qa1X5Rb1@2Td1(&' 0Xh1nPW'' ^%# >%! ;Qa1P5Rb182Td1 0Xh1d xx  ! xx !XQxx .d%  xx .X '.D\P︋nDW'' ^%# >%! ;Qa1X5Rb1@2Td1(&' 0Xh1d  d`. `\d  @ d, `\d  @ d`, `\d  @ d4,\d  ? d D\'F~@ǎ<hhW`@~Dpxx ?(nHW'' ^%# >%! ;Qa1P5Rb182Td1 0Xh1xx   ? !a\   \'1x/x! ! 1  xx 1>\xx  ? c!' TXT.HHTL^P5Xxx   2! !x/x! 2%x/x! !>\5! 1  xx 1TH'>Pd~Dǎ@``W  @~q 7 qΰ s ްcް sp   ! 4$$ x1@a4@C@1@ 41G(40010!r ~ǎǞǮ Ǿ WX@DHLn\P%T'~X \%# <%! ;Qa1P5Rb182Td1 0Xh1n[+' ^%# >%! ;Qa1X5Rb1@2Td1(&' 0Xh1 xx  xx PPlp qs   p( qs@ '0W^`pqs '. !  q$qs @'. ! '0\^`bdfhjln>\.d`!f aP/Sx.d>\6x^da%(&|(p.f>|C@ q4"t8q1l.n!00.n!21nρ?8p.p2p1@ ^ q"tvpvn d!,f$hjv0  .n`!p .rx`!t |v Z|J| |6xQ |x|x,:x!!xZ! 1xxx 1: ~    Zx|( (0   $   xx ~XǎTǞPǮLǾHD@WH<@~Drxx  xx 2xx gX(' l%# D%! ;Qa1h&! 5Rb1H&# 2Td1(&' 0Xh1v  xx gY)' n%# F%! ;Qa1h&! 5Rb1H&# 2Td1(&' 0Xh1 xx "xx Hxx Z   'xxZ xxx '(  xx    xx0   !!  '0 #0 #' ''"NJ   'xxZ xxx ''b~Dǎ@Ǟ<HHW@8~<qaX(' l%# D%! ;Qa1h&! 5Rb1H&# 2Td1(&' 0Xh1Px:    ~xx ?P@D $c c ~<ǎ8@@WP<~@qxx ?nDX(' ^%# >%! ;Qa1X5Rb1@2Td1(&' 0Xh1LQx:  DL  @gX(' l%# D%! ;Qa1h&! 5Rb1H&# 2Td1(&' 0Xh1THD H& ?    c.H ( BcD  H&|x.DޚD>gX(' l%# D%! ;Qa1t&! 5Rb1T&# 2Td14&' 0Xh1 ~@ǎ<PPWX?@DHLP~Tp    -- +qIiN n     i I|H |T qW A( Z(  P JqW0(9('q ΀  xxx q 0 W 0( 9( .>qq 0 RW 0( 9( e Efq - - +q(*qW 0( 9( ~( (  }  d( d }  d$* } * | `  <(    d( d $  d$* ~ * ~4    xxx ~TǎPǞLǮHǾD@XXW@~40Tx(0-1|`A0C10 0(20|lq@tA@ @(B@(*@d@pd01((J@z0:1(0301( '!~Wp<@DHLP ~T !0x/x! 0  xx 0>x pxx Jxx ?(4x|q~ *~ xx   !xx0 (! |ݬ"qx|6x|dq} }xx   !xx0 (! |"dqx|2x|z} }xx   !xx0 (! |܈xz|q<xx   ?(ߋP |ǎ ? xx D}xx  (L?q|~ P~ axx  (!x_x0 (! (x (! |X\n`dq|} P}axx  (!x_x0 (! (x (! |dhnlz|} P}axx  (!x_x0 (! (x (! |ptnx~q * d \r&~X~\~ `X~ XXd\h`lDdq(}d}h}ld} dphtlx@z(}p}t}xp} ޤώ|h^p^;Qa1h&! 5Rb1H&# 2Td1(&' 0Xh1Ďqώ|hP|>;Qa1h&! 5Rb1H&# 2Td1(&' 0Xh1(.|!>|1|#N.|!qq|0q  p ϧv  ϧ pppΐ.|!.xǎxx ?V.x|` !.xa(` .|!x 4x qьz]p'qzz  *P)(qp (D z  qp     (]z &qp    z  qp $ ~TǎPǞLǮHǾD@<Wp<@@~Dqxx ((8 ')H.Hh l (Lq0-0("P7q@0q0.0"Gq0>P93ΐ094 7(80ۆz(rq e (q -  62 01"!0#7qB0C0#! 7(80~Dǎ@Ǟ<ppWH@~Dr#;pW'܋''҄' PxR  X    *0'H~Dǎ@HHW80%p8WҐ v ~vZ bZ> F>" *" 88WP@~Dr#=TPpPWX:  $047#$5@|8HHHLHLHHl1!Ra0x!!` xx `  4!` a  ~DPPW0^ W^ W8 ȧ~4 @pJ\q~488W W08 @ (@ݼ/ Pt Qm Rp S TW@8~ @(Ќ8TԌݼԍ~HǎDǞ@Ǯ<Ǿ8 4PPWH48<@΀ ΐ@~D~`  jqZ~Dǎ@Ǟ<Ǯ8 Ǿ4HHW 0ptx|~hГ qprnP%' ^%# >%! 0Qa1H0Rb10?Td17Xh1. >$ ̸6 p p.   0    '   .  Ь (RaϓcX3Bְ p/*   'ٓHp >   ΂ .s gf~ F qώێj Pp~q b@{ Ȁ>   ʂ  i~ 4p@f p ̸GrKe .K!n^ %' ^%# >%! 0Qa1H0Rb10?Td17Xh1. >$nP%' ͸ \%# <%! 0Qa1H0Rb10?Td17Xh1. >$d h~ǎ|ǞxǮtǾpW@48~<r  hJv p ̸X p ! h ΐ "~0n   }~<ǎ8Ǟ4@@W8i^i88W8 ȧ~4p . @~488W  WH<~@pDJDDVǎDDLjwpD~@ǎ<HHW@8~<p -s   !x/ s  !x. s   !x- s   !x, s   'x) x   !x/x/x! x  !x/x/ x  !x/x. x  !x/x- x  !x/x, x    /x/x%     x  !x/x+ z  $$((,,0044<<@@DDHHLLPPTT8~<ǎ8@@W@8~<p     s   !x/ s  !x. s   !x- s   !x, s   'x) '( F( >p""W"    x   !x/x/x! x  !x/x/  r bRr> . N    x   !x/x/x!   x  !x/x/      x   !x/x/x!   x  !x/x/  ` . 2    x   !x/x/x!   x  !x/x/   x  !x/x.   x  !x/x-   x  !x/x,   x  !x/x+   x  !x/x*  !!""##$$$$x    /x/x% $'$x,/(L(Dp""W"&&.$$x   !x/x$ $(( F ^  :    x   !x/x/x! x  !x/x/ x  !x/x. x  !x/x-     X  2     hW%' l%# D%! ;Qa1h&! 5Rb1H&# 2Td1(&' 0Xh1Z  x   !x/x/x!    §    r    n:  :  ڧ  x   !x/x/x! x  !x/x/ x  !x/x. x  !x/x- x  !x/x, x    /x/x%   x  !x/x+   $$((,,004488<<@z@DDHHLLPPTTrf  B  &   !$~<ǎ8@@W~@ p 4210 sD@~W 0!~ǃ ^LD< Dq@@  wpLj ~ǎǞ Ǯ W@~<p'((8jo(("p""W" , h drT  w Bwpw@&wp~<@@WpHLPTX\~`riP^p^^^ΐ ^P    n^PN`^^^pP$^^h J Rn^U^e^pP$^^h  ^[Z  P^2 ^P Q^p^U^^P^pP~h^P  ΠP^|P ^x^x      ΐ&) x  P^ d X&   ,8(|\|a^xU^x^xP$ +Z ǻ ΐ&Π)ΰ'    ( ҋ2     Ӌ d P^ d >P ]^t  t+l*nV6.ls>1( 'L|"  |pn^W~`ǎ\ǞXǮTǾPLHWP<@DH~LpΠΐi΀|v+ b X NF 2    'ǻ~LǎHǞDǮ@Ǿ<PPWXDHL~Pp@ '7" ǐ@ D@厐v0 IT*T  NTD@ T Tjqz0.TB1 (@z q T ~PǎLǞHǮDXXWP@DH~Lp  )(0&(r#p""W"B(\0?(P#p""W"Ǩ   ϑ#&   ' wpm~LǎHǞDǮ@PPWH8<~@ p G!l DtHD@HǗր  "@    ~@ǎ<Ǟ8HHWP<@D~Hp΀))(&1(20|!p""W"B(f0?(Z#p""W" L^2Y     Ǚi~HǎDǞ@ Ǯ<PPW@ ~8p0p1s0<ݰ<p~8@@W8k88W`DHLPTX~\p$ \    8¶ 8L nLLL I @( @   @   @ @ @ @@ 0 )@(0    \h<  ާ H  䧨  ǘy   " ~\ǎXǞTǮPǾLHD``WXDHLP~TqΐΠ   ǻ    ǻ@    +ְ @  7 ( qpY~TǎPǞLǮHǾDXXW 0 "  W@ ~<pf2 fq~<@@W@48~<qbb bb~<ǎ8 Ǟ4@@WH<@~D ^ր >x,!> wpLj~Dǎ@ Ǟ<HHW8 ȧ~4p   ~488W@~8p((8ro((BpW.0" ~l  <d^<TD! "  $p wp4@<<<<<~8@@WP<@D~Hqo(((pW( (pHW y)(b ),F )"$~x ǐ $) RǙD @L,.L LLL~HǎDǞ@ Ǯ<PPWH~@p b@DDppDP`p\fPH8DQ7 %,D.~@HHW`@DH~Lp4  P.Tp ) X\Ӗ" !\ V z  膐 n PB\ ( !\* 8X& f ~LǎHǞD Ǯ@``W  W0!@:06 2&  AWH8 ~<q p|ph`Q$cLD8@Ѳ$Dў@D~<ǎ8HHWH8<~@p DD 4NHDNHP~DyʧDDD!  D DDDa & $ph ,D$pHD D       pp xا ~@ǎ<Ǟ8HHWP@D~Hpp $  '(("p""W" )) )|!n)\ )N|)<j)( )) ), ))ދ )Ƌ)ܓ)LP)֋ `)|xxnlbw@ )wp84V*&)6  ~HǎDǞ@PPWPH~Lp†L (Bp` 2D0@ (0. ("ԇ (  (p'("1(20!p""`W" L (pH$  wpp t (^VD 'HLJ ((7G ($0Ljwpp  Pz('4' 4 ($wp}~LǎHPPW8ȋ& @'0 @ @ @ F88WH~@ps$'$  `.D#tdnD~@HHW8 ȧ~4pZD~488W8@X$x88WPDH~Lp΀ ̓N!!! ' L<!0 8) @ ~LǎHǞDPPWPDH~Lp4ȄD0(9  @ ~LǎHǞDPPW@~<pL!!!   !  @ ~<@@WXHLP~Trp,'9( @ ~TǎPǞLǮHXXW8 ȧ~4px<s~488WH@~DpPs s rx'!r0H'">T ~Dǎ@HHW8 ȧ~4ps  B  @ >   ~488W@~<pFs:hPs     ~<@@WH@~Dp8Hsdf    n7!  0#@$s    ~Dǎ@HHW`@DHLPT~XP^\0I #"( + "  -^\Q^\ p1@ΐ. ~Hΐ0 Aj0ސ ̈ *ސ ̈:zA@ސ ̈* ސ ̈:zpޠIeΐ. TB 9Ȍ19#59'3( E e 0@ (@@0@ (@@ @+ @-1pI@GDD@>@B*  pI@GDD@0 p,=:yp6p?qq5yq ( K ?0@@A@ q5'@sA@  6! #;K;;#r\ 2  ~XǎTǞPǮLǾHD@``Wp  [BP@D~Hr :  .LpL8":GA5pp!`' pq90A@3 95pL1"P>5p(`pq91A 31906~HǎDǞ@PPWP48<@DH~LH! !  րqpN$   x((lx! ( 2  !(hր  p0qp((q$  sqp'( (&   ~ Jp p  P! ! xF p(P   ~LǎHǞDǮ@Ǿ<84PPW! !!  WP<@DH~Ly   s  Rq(+p#X((p(psp~LǎHǞDǮ@Ǿ<PPW0+K "AC1!WAC$AhAC%hAC&hACWQWPX%AC1QCGxBBSD"vt ('"AC8('p'"$AC4$X$AhAC!FhAC"     BG G!     g   ,Q"%(  D b j D p     ~@ǎ<HHWH<@~DpǐLJ D   p   p ' (. ( ,   ~Dǎ@Ǟ<HHW8 ȧ~4p  *        |'Q!R D D p %  ' p 7! ,~488W@8~<p  ( ppP XW ( pp( ^T*    p & ppP XW  W @  ~<ǎ8@@WP pR a!` !WH@~Dq' l~Dǎ@HHWH<@~Dr '$~Dǎ@Ǟ<HHWH<0@~Dr 0 (+R a(a( <r NwX   @   "    t  )r!  )a!"  p ~Dǎ@Ǟ<HHW@~<p.`W .`&0 2  &' V  ~<@@WX?@DHLP~Ts @#  aP/\ (  )  ' p 7! X (  <~TǎPǞLǮHǾD@XXWP<@DH~Lp   W |tlǧ" !,  40,'  W     )V  H`#@@WX@~D.x qώxTP.LΧH@HU(t~Dǎ@XXWP.p0>@DH".L @.M.p.@@.DPPW ! ^ 0(,01  !W[W![W[B[W2![W2![WC2!,[W2![`W[HW [W!00[WH .(N0n8@HPX` W`X .(N0n8Ɏ@ɮHPԩة>^觾[ [W [,W2![WWA0~: r:2rqrp?5p?:pprq3rp?:ppp:sp2~ǎW@8~p PPWp΀ΈΐΘΜǼ @P PP$PpRU P$%py}kg,P$(VP p:w]ѡ[q" ,(0(ְ(Fp@c(stdxX܋ ` d` P$([P  ,(0(\ְ(` d` (P$[PQ̡P! ! ,(0(ְ(` d` 'Π- 8ы0):@0CAMр ѡ(P$[P Q фP р}-!ш},(0(ְ(` d` / qфыh` d` / qСфы4` csd(u$+\-` d#h.l*x0Āelh%ox0XeEfgGn9ld`  d` @   "  !`d` }; -!10@@ V 8@  /  +!10"  /  !10 @ /00 0ѡ $@ZPECѡMѡ p } u ^d` } pq 5#"0ѡP n b V J@  6@ *d`   d`  @     0 9: @  z WC0_D0Ћ_D0d` - p&@ 4  a@ ' - pX Oo620x 0 "X     @ / &  g `h`  0!#иΨ0,@0ȧN(ΰ4ΰ80 - D  5  +  g ю 0ѡaP P .aP6 QaP PP ׶`p8gΨ 06P,QPU):RECAaFSRQaVrgaga,- +aea E`rvp #2#: @ / &  g `h`  0<#0,@0ȧN(ΰtΰ80` P,/Q)-0!-! B +!    ! E00@qA0- '1qA@Aq@ `  .'qF<Ad &$  A@> QP&#1qA@Aq@@p` #H  @ &   !  g `h` 0#Ψ0,@0ȧN(ΰJΰ8Ψ ,`  FF=11=CCAM 0AMAP,VA@ E@ p}@gd``  >    @Ψpάΰ/,(0(.ְ(zkg(P$(VPp: w q&,(0(ְ(@Ψpάΰ@ekd,$( DA4,(0(ΨdΨְ( ֠Ψ/,(0(ְ(Jkd(P$(VP@:0D A&,(0( ְ(ΨpTkg($( wq( ,(0( lְ(     / ֠Ψ/,(0( ְ(Jkd*P$(VP@<0D A&,(0( ְ(Ψ fpp\kg,$( wq,,(0( Lְ( ֠/,(0( ְ(Jkd*P$(VP@< D A&,(0( ְ(H{ p   $( @  @ , 2 ! . 00  +    p΀ؐΈذΐΘΜWhLPTX\`~dpЩ.   Id!0I!#"( p  % %Xh!! .  * Iߎ ޠ l h  [ h  Iΰl cf[^T!0I!#"( cs [(~(^ *>h^,"~(^ *;^,h    ~dǎ`Ǟ\ǮXǾTPLhhWP8<@DHL~P~P^^^ϞT^^x^:d2pW^Q^ΰ L +!R  ->^Q^\![RQ^ I^P v I0& I 7W(!^Q^.^Q^e E|t^Q^d$! I+ - B!s` T)Ʋ. 2 l.242# .242""7^P l$^PLh(^z ^Pb~PǎLǞHǮDǾ@<8W`<@DHLP~T~ XcsR[\RP^\*)b!!0#.0I#"( ^\P!+"  nX  c ~TǎPǞLǮHǾD@<``WH<@~Dp^qV 1 ]2 - qR Z -87#@]$*'B2 2#2q q1 ]2~Dǎ@Ǟ<HHWH@~Dp W & !   D 6ހ  @  Ӽ0(  ! p! !7 R   .   W    ~Dǎ@HHW 0(  WP@DH~Lr @D''!'& )7x)t ~LǎHǞDǮ@PPW2!6[WPHx~Lp(,j~LǎHPPWPHx~Lp(,"~LǎHPPW`?8<@DH~Lp.ޠϨϨ:T 2pϨ pp  :X ސ zp  C@:8 6p  : @$:@$ 1 P@$`^P5%cR:W^XP'86 0":B0C9"5 4r+!+ @$0:  ?05N?:@ 5p  5 @$0:  Ϩ( ( :Ϲ( 0 &009 4 @$05p (  5(TϨ &1Ϩ  &0   9( ~LǎHǞDǮ@Ǿ<8`Ϩ`W0 1 @4AW   ?  ?0 6    W6    WX<@DHLPҧ~TsRNW  ( ( D b \ pױ '(R (> )     ,   aP/\ +! (() )((  ' p 7! BW  D ,,-V < ~TǎPǞLǮHǾD@<XXW0@ A#1 ! 1W @(#)ccini.p 5.3 87/10/29 @(#)types.h 5.4 87/10/29 @(#)indep.h 5.7 87/11/18 @(#)cc.h 5.3 87/10/29 @(#)ridge.h 5.3 87/10/29 @(#)cclst.p 5.5 87/10/30 @(#)types.h 5.4 87/10/29 @(#)indep.h 5.7 87/11/18 @(#)cc.h 5.3 87/10/29 C - Copyright (c) 1987 Ridge Computers v3.1 @(#)ccdec.p 5.3 87/10/29 @(#)types.h 5.4 87/10/29 @(#)indep.h 5.7 87/11/18 @(#)cc.h 5.3 87/10/29 @(#)nindeptarg.h 5.2 87/06/30 ??? void double float char long int short unsigned ((((((((((6666((((((((((((((((((66(( (((((((6((( 6 (((666(((( 6 6 (((666(((6(((((((((((((6 p x 66 L T ( B( (6(((((66(((((((((((((((((((6(( *RETURN**INF void va_type @(#)ccscn.p 5.3 87/10/29 @(#)types.h 5.4 87/10/29 @(#)indep.h 5.7 87/11/18 @(#)cc.h 5.3 87/10/29 q0uq<uuuuqHrHuu(urrssDspuDupuuuu byte 0*IDENT *MODULE ,,,,,defined ident optimize undef define line ifndef ifdef endif else if include default case switch while do for else if continue break sizeof return goto static typedef register extern auto unsigned signed short long union struct enum comp extended double float char int asm __FILE__ __LINE__ ridge unix #line #endif #else #ident #ifndef #ifdef #if #include #undef #define entry globalvalue globaldef globalref default case switch while do for else if continue break va_stkarg argnum align regtyp sizeof return goto static typedef register extern auto unsigned signed short long union struct enum double float char int '#' '}' '{' ']' '[' ';' '~' '?' '||' '&&' '==' '<<' '>>' '++' '|=' '&=' '<<=' '>>=' '%=' '/=' '*=' '-=' '+=' '--' '->' '^' '%' '|' '&' '!' character-const'-' '+' '/' '*' '!=' '<=' '>=' '=' '<' '>' ')' '(' '.' ',' ':' long integer illegal-symbol end of line end-of-file string real-constant constant name @(#)ccsta.p 5.3 87/10/29 @(#)types.h 5.4 87/10/29 @(#)indep.h 5.7 87/11/18 @(#)cc.h 5.3 87/10/29 @(#)ccexp.p 5.3 87/10/29 @(#)types.h 5.4 87/10/29 @(#)indep.h 5.7 87/11/18 @(#)cc.h 5.3 87/10/29 @(#)nindeptarg.h 5.2 87/06/30 9:::8p::8:9::::::>>><B??<<@t@DXDXCCXCBCC C<CDBBCt@A?L?@DXDX?0??h @(#)ccpro.p 5.3 87/10/29 @(#)types.h 5.4 87/10/29 @(#)indep.h 5.7 87/11/18 @(#)cc.h 5.3 87/10/29 va_type **dummy** @(#)runtime.c 5.3 87/10/29 Out of memory wCompiler error .. cannot open output file %s/comp%d%dCompiler error .. cannot write output file %x  @(#)indepcod.p 5.3 87/10/29 @(#)types.h 5.4 87/10/29 @(#)indep.h 5.7 87/11/18 @(#)indepcg.h 5.3 87/10/29 @(#)indep.p 5.6 87/12/07 @(#)types.h 5.4 87/10/29 @(#)indep.h 5.7 87/11/18 @(#)indepcg.h 5.3 87/10/29 +INF -0.0 fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ,@\x   4H\pddx@PPP0$hhhh4tHh|||||||||||||||||4dd44dddddddddd|d||ppddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd̘̬̄И<<И<<<<<<Π΀<<<<@P`td>̈́,0|ϔL4dϬ0<<<<<<<<<<<H`0ֈ؈Px @(#)indeploop.p 5.3 87/10/29 @(#)types.h 5.4 87/10/29 @(#)indep.h 5.7 87/11/18 @(#)indepcg.h 5.3 87/10/29 Warning: dead code eliminated in routine at line @(#)indepopt.p 5.5 87/12/07 @(#)types.h 5.4 87/10/29 @(#)indep.h 5.7 87/11/18 @(#)nindeptarg.h 5.2 87/06/30 @(#)indepcg.h 5.3 87/10/29 (\T,,,,<<<<<<<<<<<<<<<<<<<<,,,<,(TpppT                 2222222222222222222222222222\\\\2\\2222222222\222222222222222222222222222\\\222\222pX>>>>>>>>>>>>>>>>>>>>>>>>>>>>dddd>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>dddd>>>>d>>>xll(((((((((((((((((@Lx((|x((,HHhXX                              @ @ @ @                                                                 @ @ @            @                         <                         p  T T T T T T T T T T T T T T T T T    pH88xL||||||||||||||||| @(#)indephost.p 5.3 87/10/29 @(#)types.h 5.4 87/10/29 @(#)indep.h 5.7 87/11/18 @(#)indephost.h 5.3 87/10/29 Write failed: file system full? Cannot create file: Write failed: file system full? /usr/include/ Cannot create file: Cannot write on standard output @(#)genutil.p 5.4 87/10/29 @(#)types.h 5.4 87/10/29 @(#)indep.h 5.7 87/11/18 @(#)indepcg.h 5.3 87/10/29 @(#)ext.h 5.3 87/10/29 @(#)nindeptarg.h 5.2 87/06/30 @(#)gen.h 5.3 87/10/29 @(#)ridge.h 5.3 87/10/29 @(#)debug.h 5.4 87/10/29 NNNNNOOOOOhUUUVUUUUUUVVVVUUUVUUUUUUUUUUUUUUVWUUUUUUUVUUUUUUUUUUUUUUUVUUUUUUUUUWUUUUUUUUUUUUUUUVVUVVVVVVVVWUUUUWUVVVWWWUUUWVVVVVVVVVWWWWWVVVVVVWWVVVWWWWVWWW\W\VVWWWVWWW4WWWWHWHWVVVVVVVVVVVVVVVVVVVWVVV}~T}~T~T}}}}~T~T~T}~T}~T~T~T~T~T~T~T~T~T~~~~~~T~T~T~T~T~T~T~T~T~T~T~T~T~T}~T}~T~~~~~T~T~T~T~T~T~~~~~~~~~~~~~~~T~~~H~~T}}~T}}}~}}}}}}}}}}@mcount @(#)gen.p 5.4 87/10/29 @(#)types.h 5.4 87/10/29 @(#)ext.h 5.3 87/10/29 @(#)indepcg.h 5.3 87/10/29 @(#)indep.h 5.7 87/11/18 @(#)nindeptarg.h 5.2 87/06/30 @(#)ridge.h 5.3 87/10/29 @(#)debug.h 5.4 87/10/29 @(#)gen.h 5.3 87/10/29 p TTT 0|||XpHpl <(L6<D,LdxPLLLLLpLLLLLL~~&&&&&&&&&&&|8 8L|@mcount @(#)eval.p 5.6 87/11/13 @(#)types.h 5.4 87/10/29 @(#)indep.h 5.7 87/11/18 @(#)indepcg.h 5.3 87/10/29 @(#)ext.h 5.3 87/10/29 @(#)nindeptarg.h 5.2 87/06/30 @(#)gen.h 5.3 87/10/29 @(#)ridge.h 5.3 87/10/29 @(#)debug.h 5.4 87/10/29   ؔ,  ܰܰؔ,جX`ٴڜۈېff~~TT~~~~~~~TT~~TT1.01.00.00.0||LLLLLLLL||TTTTTTTTTTTTTT:::::::44:::@4444@4<d<@@44<ddx<ddxhhhh        (     d d d | | | | | | | | | | | |#F#F | |!! | | | | | | | | | | | | |#F#F#F | | | | | | | | | | | | | | | | | | | | | |!#F | | | | | | | | |#F            #F#F#F  T#F#F#F#F#F#F#F #F @!#F#F( , T | | |#F!!!!!!!!!!!!!#F#F#F#F#F#F#Fd|#F#F l!#F#F D"@#@ h ,#F!#F!!!!!!!!!!#F|#F"P#" @(#)codegen.p 5.5 87/12/08 @(#)types.h 5.4 87/10/29 @(#)indep.h 5.7 87/11/18 @(#)indepcg.h 5.3 87/10/29 @(#)ext.h 5.3 87/10/29 @(#)nindeptarg.h 5.2 87/06/30 @(#)gen.h 5.3 87/10/29 @(#)ridge.h 5.3 87/10/29 @(#)debug.h 5.4 87/10/29 EDE8ELDDDE`E @@ @(#)fixups.p 5.6 87/11/16 @(#)types.h 5.4 87/10/29 @(#)ext.h 5.3 87/10/29 @(#)indep.h 5.7 87/11/18 @(#)nindeptarg.h 5.2 87/06/30 @(#)ridge.h 5.3 87/10/29 @(#)debug.h 5.4 87/10/29 @(#)gen.h 5.3 87/10/29 @(#)indepcg.h 5.3 87/10/29  dp|>LXĈĔfixup: internal error in fixmovstringیDDیhxۀpیۈ`|ܰget_bytes: bad count txDH<0 @(#)genout.p 5.4 87/10/29 @(#)types.h 5.4 87/10/29 @(#)indep.h 5.7 87/11/18 @(#)indepcg.h 5.3 87/10/29 @(#)ext.h 5.3 87/10/29 @(#)nindeptarg.h 5.2 87/06/30 @(#)ridge.h 5.3 87/10/29 @(#)debug.h 5.4 87/10/29 space globaldata dsect code csect word byte byte rd halfwo double align BR >= < GEQULSSUVC VS <= > LEQUGTRUCC CS <> = ALABELDLABELSTRCPYSTRMOVEBIGMOVEladdr load store loop call br se csl asr asl lsr lsl ret callr test fixr fixt ediv empy esub eadd float comp tbit sbit cbit and xor or not makedr makerd rem div mpy sub add neg move word word c20lab %Z-x%'L**- -8)l(-x--x-x-x)l-l,0,,,,,loutmachop: bad machop:,l r14, r15, ;vfp r14, r14, r15, ;vfp r14, r14, 00<A/0A1//p/.6.H.\.7707070707088888888A::889988881$8899888;05;41444=?l^$sx0>?w$p)~>w`=fpǚ<~:: ۚ9J+U>85d͍8}6wf95k&4Q?g3j.& ׺=sO8  @(#)floathook.c 5.3 87/10/29 @(#)ieee.h 5.3 87/10/29 l|0.5vVd0h @(#)indeplst.p 5.5 87/11/18 @(#)types.h 5.4 87/10/29 @(#)indep.h 5.7 87/11/18 @pphppppppp|pʐpp@p@pppppppppppȾp@ppppp$pppppp @(#)unroll.p 5.2 87/11/23 @(#)types.h 5.4 87/10/29 @(#)indep.h 5.7 87/11/18 @(#)nindeptarg.h 5.2 87/06/30 @(#)indepcg.h 5.3 87/10/29 XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX| Dؼ4````4Xېې<`t܈8݈ݜ$XXބި ,,,,,,,,,,,,,,,,,tPPlll  |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||@@@@@@@@@@@@@@@@@@  @@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@  @@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@      @@@|          ((xxxDDDDxxDDDDDxDDDDDDDDDHHDDDDDxPxppDDDDDDDZZZZmemreg minimum [integer] ? (@X(D\x$<\|(@Tp|x tHh|pl,@hdT`\XTPLHD@<840,(h$Dhx$  ,D|xtplhd`\XTPLHDh@<840,($8 T@h ,@Xl||xIllegal type for memberIllegal type for fieldNo name given in declarationIllegal size for fieldIllegal initial valueIllegal to initialize extern variableAggregate initializer illegal for automaticCannot take the address of this objectFunction illegal in structure or unionThe size of this variable is not definedArray size must be constantInitializer too largeStorage class illegal hereTwo storage classes specifiedIncompatible type-specifiersIncompatible type-specifiersConstant expectedIllegal TypeMust be a structureVariable expectedIllegal use of typedefIllegal variable or expressionThis object has no defined sizeOperand must be an lvalueREAL operand not allowed hereIndexing not allowedType mismatchStorage class illegal hereThis is not an lvalueIllegal operationThis is a binary fileillegal functionIllegal type for functionIllegal storage classIllegal storage classNo name given for declarationUnexpected end of fileIllegal symbolIllegal floating constantCharacter constant too longEnd of line found in character constantEnd of file found in commentIllegal characterEnd of line found in stringDuplicate case", line Cannot open file: expected: got: File name too long 1.8.1 Copyright (c)1985,1986 Green Hills Software, Inc.Too many -I optionsIllegal option: File name Too longVoid type argument illegalNot enough arguments givenMust have at least one stack argumentNot inside a loop or switchNot inside a loopCASE only allowed at outer level of switchCase expression not constantGlobalvalue must be int or unsignedLabel ExpectedLabel ExpectedGlobalvalue initializer must be constantascal declarations not allowed in functionsAsm statement illegal under object code optionCannot initialize a unionInternal compiler error#defines recursive or too complexRan out of string spaceInclude nested too deeplyEnd of file found in #ifPreprocessor expression must be constantUnmatched #endifToo many parameters for a macroIllegal preprocessor command#defines nested too deeplyWarning: switch only works with compound statementwarning: Cannot take the address of this objectwarning:illegal combination of pointer and integerwarning: old-fashioned initializationwarning: old-fashioned assignment operatorwarning: too many params in macro callWarning: asm statement is not portablewarning: negative or zero array sizeredeclaration of: Label not defined:illegal member use: Illegal redefinition of: Not a parameter name: Undefined symbol: Two declarations of: Undefined member: Void type forRedeclaration of: Duplicate field: warning: illegal member use: 1/4/88 17:07 @(#)exit.c 6.2 87/12/30 @(#)paslib.h 6.1 87/11/23 @(#)readint.c 6.1 87/11/23 @(#)paslib.h 6.1 87/11/23 %dInvalid integer @(#)readln.c 6.1 87/11/23 @(#)paslib.h 6.1 87/11/23 @(#)runtimeerr.c 6.1 87/11/23 @(#)paslib.h 6.1 87/11/23 @(#)io.c 6.1 87/11/23 @(#)paslib.h 6.1 87/11/23 @ `0`@ @(#)writechr.c 6.1 87/11/23 @(#)paslib.h 6.1 87/11/23 %*cFile not open Width or fracdig is not positive @(#)writeint.c 6.1 87/11/23 @(#)paslib.h 6.1 87/11/23 %*dFile not open Width or fracdig is not positive @(#)writeln.c 6.1 87/11/23 @(#)paslib.h 6.1 87/11/23 File not open @(#)writestr.c 6.1 87/11/23 @(#)paslib.h 6.1 87/11/23 File not open Width or fracdig is not positive %*.*s @(#)eoln.c 6.1 87/11/23 @(#)paslib.h 6.1 87/11/23 File not open Attempt to read beyond end of file @(#)gettext.c 6.2 87/12/30 @(#)paslib.h 6.1 87/11/23 File not open for reading Attempt to read past end of file Attempt to read past end of file Attempt to read past end of file @(#)setuptex.c 6.1 87/11/23 @(#)paslib.h 6.1 87/11/23 @(#)setupfil.c 6.1 87/11/23 @(#)paslib.h 6.1 87/11/23 @(#)read.c 6.1 87/11/23 @(#)paslib.h 6.1 87/11/23 File not open File not open for reading Attempt to read past end of file File is not an even number of records long @(#)atof.c 6.1 87/11/23 @(#)ctype.c 6.1 87/11/23 ((((( H @(#)ldexp.c 6.1 87/11/23 @(#)malloc.c 6.1 87/11/23 @(#)mon.c 6.1 87/11/23 PROFDIRmon.out @(#)perror.c 6.1 87/11/23 : Unknown error @(#)data.c 6.1 87/11/23  h h p ` h @(#)flsbuf.c 6.1 87/11/23 @(#)stdiom.h 6.1 87/11/23 @(#)fopen.c 6.1 87/11/23 @(#)fprintf.c 6.1 87/11/23 @(#)fread.c 6.1 87/11/23 @(#)stdiom.h 6.1 87/11/23 @(#)fseek.c 6.1 87/11/23 @(#)ftell.c 6.1 87/11/23 @(#)printf.c 6.1 87/11/23 @(#)scanf.c 6.1 87/11/23 @(#)sprintf.c 6.1 87/11/23 @(#)ungetc.c 6.1 87/11/23 p @(#)errlst.c 6.1 87/11/23  (<P`t 0DXl(DXt.Error 0Not ownerNo such file or directoryNo such processInterrupted system callI/O errorNo such device or addressArg list too longExec format errorBad file numberNo child processesNo more processesNot enough spacePermission deniedBad addressBlock device requiredDevice busyFile existsCross-device linkNo such deviceNot a directoryIs a directoryInvalid argumentFile table overflowToo many open filesNot a typewriterText file busyFile too largeNo space left on deviceIllegal seekRead-only file systemToo many linksBroken pipeArgument out of domainResult too largeNo message of desired typeIdentifier removedChannel number out of rangeLevel 2 not synchronizedLevel 3 haltedLevel 3 resetLink number out of rangeProtocol driver not attachedNo CSI structure availableLevel 2 haltedDeadlock condition if locked @(#)frexp.c 6.1 87/11/23 @(#)getenv.c 6.1 87/11/23 @(#)isatty.c 6.1 87/11/23 000000000000000000000123456789abcdef0123456789ABCDEF @(#)doscan.c 6.1 87/11/23 =4=*=*=*=L=L=L=L=L=L=L=<=L=L=L=L=L=4=L=L=D @(#)filbuf.c 6.1 87/11/23 @(#)findiop.c 6.1 87/11/23 @(#)dowrite.c 6.1 87/11/23 @(#)print.h 6.1 87/11/23 @(#)ecvt.c 6.1 87/11/23 Fn CAy7Aׄ@È@Y@$ @(#)memset.c 6.1 87/11/23 @(#)fwrite.c 6.1 87/11/23 @(#)stdiom.h 6.1 87/11/23 @(#)memchr.c 6.1 87/11/23 u!B\  P3hh .text P .data  3h @.bss=`=`h* 0  !2$0  f~Z[W@~<p@ @  ј"@ !  p 8W  !p PW ( !p hW$:(@  Гׂ6@  ̓l (@  ȓL @  p1 #*n$@  (@  @  p1 #ʋ$@  ֬ @  p1 #֊ @  p1 #d$B  ( ')  ԓRt@  ">$@   $@  ( @  p1 #ռ@  ժ~<@@W@~<p @  b  J|\ B  QZ@ ' N@ ' 2@ ' ʋL  P~<@@W8p W@  4lx@  0T`@  ,<H@  ($0@  $ @  88W@~<p *v8nPO@ d8 p"@  `r@ ' \ZP8D $ \, t0" $@  Xڋ(> 2&46 )* $!"p 8W@  TxQ @ % PXN@ !!!@  ˨"@   ~<@@WH@~Dp@(@  (Ѿ    @  ђ @ p1 #p@ ' X"@  >"@  ē@ !!! @  d" @ 1 q~Dǎ@HHW@408~<rΐ.N88 p!!!' 'Ǔ b00~<ǎ8Ǟ4@@W +- WWhHLP TX\~`{njxL]^d|ΐ  .d($ 9R. BH0BP$ ܓ$~`ǎ\ǞXǮTǾPLHhhW@(  8W@8~<q ]^p~<ǎ8@@W8 ȧ~4p @]`W'' n%# F%! 0Qa1l&! 0Rb1L&# ?Td1,&' 7Xh1 ~488WH@~Dp x \:F  ,."S  PI`~Dǎ@HHW8*! H!8 88W !WH~@pd   XHD ~@HHW W@\   `H(<@@WhDH~Lp f p ZDp>+ -p  l   |P 8p Y '>P   x.H(V  Gd fP t(tp\  Y.0 h 0 p  '(( ~LǎHǞDhhWX@DH~Lq *p     ċpp   Et   E X  TP  `pz   EZ W.P,    EҔ Ȟ Tt   D W:.T   W  V (7 ȓ *  ГD4  ؓD"~LǎHǞDǮ@XXWH8<~@pp@,pހ@(@0(D@D   ~@ǎ<Ǟ8HHWp !@@p !@(p !@,p p!@0@4W@<<@@W8 ȧ~4pvq}~488W@8~ u҆ptlސ@(PH@ .QX   ^TLp@(.&*  x qˋ ~PǎLǞHǮDǾ@<XXWH<~@pp@D@p@02p@,$p@,`p@,N`pހ@((D8D *q }~@ǎ<HHW@8~<pހ@( q }~<ǎ8@@WH0<~@rD^DpU@@*@@Dp@,Dp@0Dp@(@(Dpp@4dDDp@@.Dp@@Dp@,Dp@0Dp@(@(Dpp@4~@ǎ<HHWH8@<@~Ds p@@ p@( pp@Dt p@4p p@8 p@, p@0pb  p@@ p@( pp@Dt p@4 p@8 p@, p@0~Dǎ@Ǟ<Ǯ8HHWH0<~@rDDp@@Dp@(@(Dpp@4Dp@8DPDDp@@Dp@(@(Dpp@4Dp@8Dd~@ǎ<HHW8 R|20 h\  @$R0R "V88W@8~<p0> , Lp~<ǎ8@@W8 p@@p@(!88W8p@4888W@8~<ppJ^<,p@,&!$$  ~<ǎ8@@WH<@~DpAp@@Tp@DFp@8p4p@,p@0|~Dǎ@ Ǟ<HHW@0p53@,0V0p53@,C@C@ 8$Pp@@@@W@48~<pp@@|p@,np@, Pp@D6p@, p@0ꠧ~<ǎ8Ǟ4@@WX?@DHLP~Tqpא@,pװ@0pנ@,p@0    \X+6Fp@D8p@, ` p@0 H b\X,Fp@D8p@,  p@0 ~TǎPǞLǮHǾD@XXW WH8<~@pDFHސ@(4 $DF D~@ǎ<Ǟ8HHWP?8<@DH~Lsް@Ht`TLD<4& xhTLD<4^& Lx I~LǎHǞDǮ@Ǿ<8PPW10$ (WH8@<@~DsA@C^ l  p480$(p$t(x<|~Dǎ@Ǟ<Ǯ8HHWH<@~DpN*V.$~Dǎ@Ǟ<HHW  WH8<@~DrH$6(  V H  4$` >     $ 4     0v( P(" t 4~Dǎ@Ǟ<Ǯ8HHW@ ~8q<Z^@D4@0*"@8p~8@@W@0,p W.(   0-P@@W $ 8# (" ! W@~<pV  8,+- ~<@@W@~<pV  @,V-"p+V-D ~<@@WX<@DH~Lpp8 p7 pP p8  lpz 6  H+ZtV 7  P+6PTp Qp&PT~pt6 ppPTޚp $QpN^pTp q2 q  qpp~LǎHǞDǮ@Ǿ<XXWhDHLPTX~\Ǩ ǸqǑ  `: dt(.`d!($7$ ċH@<4($7$  F   )" )," ,  鶋   ~\ǎXǞTǮPǾLHDhhWXDH~L q(R  (p 8  . !p XWx P0 (7$H$#4 8'8$G$#4 VX PB:'V ' >8'' v$nTޢ"޸.T!! 6 Tj"ހ.T!! W$TG8$% 7 '$3p G '$8$J j7  '$3( H' !! !'8$$ ' $3 ' 8$# '  #3~ ' !'8$#J j' #3* J' 8$$ ('  $3  ~LǎHǞDXXW`DH~L q'R  $p 8 WP" ' ( z . !p W P۠0( 7$H$#4 '8$G$#4,'nb ʎX P&'V'Vn$fT~ڔ.T!!2 TJ`.T!!j$b\N$.\X* X\!X!b' !! !F'8$$ &' $3چ  ~LǎHǞD``W0 *28WH8<@~Dp6p ׂ*& h J 8H~Dǎ@Ǟ<Ǯ8HHWH8<@~Dp6p ˂*&  2 8H~Dǎ@Ǟ<Ǯ8HHWhHLPT~XpǰǗ   dג d J ֚D^d !3^(f&dp@հ H \֊5dݨH 6 `F"\.` 64&'B2~ ddxdQp@@fp@4Xp@8Jp@@< <,p!@Ddp@D!(83j$b V dհB :2ն.d  H3  H d:4P.d Ӟ H 'T ( 1~,8~XǎTǞPǮLǾHhhW@~<p   80P& %r ~<@@W@~8q *<Ӟ<p~8@@W?pLPTX\~`p8 |Ƿ$ǗLJ ǧ8D dӔ28 lzd.l 8 ,  p Wv  ZhH@dd.d.h"p@~ Hh dd H)dҾ d҂dQ   Ѭ ! t.p ! 4  dd.h ~ Hdшd.h ddH xx.!Hx<*0` 6(鈋D Ђ*0 (D$(ȋ H^d!3^(2dp@  H'ݎd&& @.d 'f (*1~,>  hd d.h | ldϐ\d.hL^d ;^(0 ' t L^d ;^(D0v '( d|d|.&d|| @Hǎ| Ǯ6 (4d@~dQp@4p@4 )p@,vp@,^ ȓNdpׁ@, dp@0 dp@44 4H8^Z+t"B, ݆*ǜ  Ph< 8'XdLd.h@p@@dD dp@@d$ *(0~,DP8PD$< ܞ*8 ܆8rp82 dt dɀH<d4*d.6 Hd˜v^dpU@4f )Z@,P dp@0 Tdp@44 4H@  *2':$:6. l.l)!H$ ʴdp@@dp@(dp@,dp@0dp@Ddp@8dpp@4jddp@@dp@(dp@,dp@0dp@Ddp@8dpp@4 'n  ɼ  @'@D'ּd,@dp@dd.d0! .' Гl .- ؓ>'&j hZ dȘFdȄ2Ț.d H 'ՠ'Րrd hhp@,ld^dpU@,T @8" 0dp@8  HD(ddrR^dpU@@B@,,$ dp@,Ų <6.lP .l(!H'2 '.' 'fv hƘ,dƆd.h :6.l .l(!H'ӄ  " ( 1~,T  (1~,8'* ( 1~,n' ( 1~,F' '@'Ҿ  H~`ǎ\ǞXǮTǾPLW8 ȧ~4pq}8(p@<0p@<~488W8 ~4qwp -!.!~488WP?8<@DH~LpɲHD, 8 F8 &Lj -!.!H $ ,_~LǎHǞDǮ@Ǿ<8PPWH<@~Dpd &* 8@ & BHz` t* Lj -!.!P $\ HLX BP8@ t Ǚ#zf@0@(@ !  0 펀 - ~Dǎ@Ǟ<HHW@ 2pW"pWWH8<@~D֐@Y $xǥy^ VNX@&Ѻ 8!w'pէǙ}~Dǎ@Ǟ<Ǯ8HHW~@p#<1C342*10"01 3$4!2"#q~W(p@ω2& D8D LjǙ~@ǎ<Ǟ8HHWH<@~D֐@p0ω  LjǙ~Dǎ@Ǟ<HHWH<@~Dր@pǘ | ) ̀d)hL$)$@ p JLjyx @@~Dǎ@Ǟ<HHWh<@DHLPЧ~T@8v`0b`p@<`$8 , $`p@<`bh !\ "  2 8$`p@<`@< \dN\p!!@<$8 (, '$  \p!!@< (, d`.d ` ' oT Ht >NL ^& Xp@ Xp@ϫz  8 ' ʦ $fb$Xp@  p@ $Ǫ9 j̓Xy~TǎPǞLǮHǾD@ <hhW8  ^ 0 .L * DpW 0*$0+R88W@48~<p x+0h>VN0'!(!xwp~<ǎ8 Ǟ4@@WH~DpA2p $H$q~DHHW@ BXP0x܆N ~!B +!QP0 -!PPPP@@WH@~Dpwπv (w~Dǎ@HHWP<@DH~Lp(Ϡp `@s hv  ϨϘ ~LǎHǞDǮ@Ǿ<PPW "9 D.$.pW: _ WH@~DPe"9 ; ,ր! ,px=`'u=`=`~Dǎ@HHW8 ȧ~4p* P l p$t(x<|~488WAZ ^WH@ ~Dr<p  rW 0( 9(v 0, 1 P=lfP>@P=W8 ȧ~4@ p 804. b' *! ' R$!%!, ' $!P!!!0  D ' 0 0$,N B64D !)!~488W $!P P $! ( !pW$  ^#! F$! .  W8 ~4pH'Pp .~  vpHW0 0p 0!p40 p 0+!~488WH@~DH|p$HH^qq0V 000~Dǎ@HHWPDH~LqvD* B`$8~(xf~LǎH ǞDPPW8@ w@ Гw@ ܓw@ w88W8 ȧ~4p ,p~488W`<@DH~LqB`$@ $BX+0+( ސ@ް@(    ! P0* 000088- 88888P   !\b P!< C!$ j D  Fd d!  l N o@ ж(((a@  0u~a 0dp8pP$Ht"@ h)tb $b  8ϞPI2V@ 42$01#舁 pBX (0 ~LǎHǞDǮ@Ǿ<W W@8~<pp4ڊx"~<ǎ8@@W8 ȧ~4p\ \ L <  , ~488WP@DH~L֐(p sq h! )(ϋ sq hf )(Ɇ  X~LǎHǞDǮ@PPW@8~<pp p .!LX_j~<ǎ8@@W8 ȧ~4p qqqp= Xp= *'p"p==p~488W@8~P  )@)8*98Lj~LǎHǞDǮ@W0Pϰ@D~HrT  $ ,   lLL[ >! >0LԎ 0L  ~HǎDǞ@0P0PWP@DH~Lr ǡp  p t*pPDp'!p ,pp&!pp&! ' (hX VpD p"!$p!!p!!DX ǥp X Xpp'!p pp&! pp&!Xǥp Xpp'!p |pp&! pp&!a p  p~LǎHǞDǮ@PPWH8<@~Dp8  p PpR!R ʧ p! pp(!pp  ) !(hp  >  *p ~Dǎ@Ǟ<Ǯ8HHWH8<@~Dq nLj@2 qwLj@h  y~Dǎ@Ǟ<Ǯ8HHWAP% %0b#$p"!"0#&5p"!"%P % Xepb&!"0#&5!"%P% (epb&!"0#&5!"% $_W`hDHLP@TX~\s`d`d +>`` ' , ( 'Z (  !!.``!Z%>``Z0`St``` 0`Sd`ST0`R0``R  0`R@)    !   !!*``$(,048 < ^`dT^`d~\ǎXǞTǮPǾLHD`h`hWH ~@1,A tV6s0#>DpD  D  ~@HHWH8<@~DpQϐ XQPPǧ  QP~Dǎ@Ǟ<Ǯ8HHWP?8<@DH~LpP  0! !,1732"0:#  ! O@H   4@"  { >~LǎHǞDǮ@ Ǿ<8PPW0`Ϡ<@DHL0P~Trp !؊r`(Ov[ `[N `  l `  &Ăgj`4Np[ p`[Nv` R` ~TǎPǞLǮH ǾD@<0`0`WXDHL~PpQpǡ <F(,X aV&4   >TT TTx@Y^F  Dz b N@ , !#! !!#!)  ~PǎLǞHǮDXXWH8<@~Dp,@d  Ǚ@: L<  0!$G!(1432"0:# !hKn8 ~Dǎ@Ǟ<Ǯ8HHW 02@ADC0130013@:4W@~p00431SE@EB1pGp zC qBC fC DA TC Cǃ @LjH@C Bǃ @LjH@31q ~ǎW0p"!"  p"!"$ #"$( p"!"  p"!"$# @($@)$ S %P&% %  p"!"$bS%P&% %  p"!"$6#"$  p"!5p2pW p $%  !W @~84$!pr #  A~ǎW@8~<qB ("!("!("!  B @ ( "! ( "! ( "!  B ("!("!("! 6G (G 6G V(GJ   $$((,,004488<<~<ǎ8@@W@48~<qW  , '! '!fq~<ǎ8Ǟ4@@W@8~<qt~<ǎ8@@W$ ! W$ ! W8 ) W0Pϰ<@DH~Lqp0~p-pP  ܡ pp  P!2301! ~LǎHǞDǮ@Ǿ<0P0PW0@8~<p@z * $(0<tD0@@CpC~<ǎ80@0@W@48~<q@ ݬ ) ݆ )  q $ (~<ǎ8 Ǟ4@@W@48~<q@  )  )  q $ (:~<ǎ8 Ǟ4@@WH<@~Dq@P < )  ) lj B  A' $ (V 4~Dǎ@ Ǟ<HHWH<@~Dq@d P ) * ) lj A$  @( $ (j 4~Dǎ@ Ǟ<HHW@48~<q@x d ) > )  q $ (~<ǎ8 Ǟ4@@W@48~<q@ټ ٨ ) ق )  q $ (~<ǎ8 Ǟ4@@W@48~<q@  )  )  q $ (4~<ǎ8 Ǟ4@@W@48~<q@H 4 )  )  q $ (v~<ǎ8 Ǟ4@@W@48~<q@׌ x ) R )  q $ (~<ǎ8 Ǟ4@@W8 @~4p * $(R8~488W@48~<q j"!ǗXpB@!$" &!$"$ @!$@Bq4 ,zËǾXpZۋ,!0,#0#<2n\p!!! 0 qzX.\p,21021IA@0q$:sY\<X2~TǎPǞLǮHǾDP^\ @<`^X`WH8<@~Dp&<)02$ @2430f822430&2430243p29CAC8,@243 0243 p29CAC0,#0)2:$ ~Dǎ@Ǟ< Ǯ8HHW ~!\X0 p  , (,p ( p  H  p   pp  ' p > p  , (,p ( p    p   pp ~Dǎ@Ǟ<HHW@1 ,  $  V *aP/R% (!1pWH8<@~Dq:62  , $ , Ǡ  (*!p"02#021p2 #"'ǎ,p( 02$  ~LǎHǞDǮ@Ǿ<PPW8 p02 4@,@0p0,0X88W (101 @4 (!0,0#WH@8<2@p2~D13p,7p7Ǔ2spr xΠ,z֠zw1儐 \>p#.p.p0#p"!sprqǂ1t$0p@ f~Dǎ@Ǟ<Ǯ8HHW ,   , ! 2 '2WxX\`dhl~pptx|ϷȧZZЋX^t^(^x^,^|^04.8><    2x|tx~pǎlǞhǮdǾ`\XWxX\`dhl~pptx|ϷȧZZЋX^t^(^x^,^|^04.8><   2x|t~~pǎlǞhǮdǾ`\XW@ ~<pB#0,0 0'0 00( <0   .x 2P'0,#%2 ,%qƋP ,!0,#5%""$$  >hC0C >t02hl>lC0C&Nx0C4@2l:>pC0C*N|0C 4@ 2p~<@@WH<@~DpppRp , p pAp40$1pp1 #ppp~Dǎ@Ǟ<HHWP<@DH~Lqppbp߰p  d+ !pppp~LǎHǞDǮ@Ǿ<PPWH8<@~Dq:62  ,   , Ǡ  (*!p"02#021p2 #"'ǎ, ,p( 02$r>b 0>p$> >` >>p L p>p q>  ( ^$0 $8! 01'q2! 'q/ !' :Gq21304!:'q.$@,/l $@>> >P>q9(9#0@@5601 0> >)~TǎPǞLǮHǾD@XXWH@~D++p$p pp+( $l"   $h!~Dǎ@HHW!1021!0W !  W!2! W!21!0W! W2!10B!0 W2!@4(ARQ!P4AQW!120WX?@DHLP~Tr8     *8<  ' p(7! ` ?  ~TǎPǞLǮHǾD@XXWH@~Dp W & !   D 6ހ$  @  )(  ! p!(!7  DR   .   W    ~Dǎ@HHW8 ȧ~4p$.q)(~488W@8~<pp ~W  < r  + h ~<ǎ8@@W8 ȧ~4p T g "Q%(   ~488WH<΀ ~@q R  Bb p('(! ,>     BG G!    g   ,Q"%(  D b j D p     ~@ǎ<HHWH<@~DpǐLJ D   p(  p(' (. (t   ~Dǎ@Ǟ<HHW8 ȧ~4p  *        |'Q!R D D p(%  ' p(7! ,~488W@8~<p  ( ppPW(( pp)(^*    p(& ppPȧW(W @  ~<ǎ8@@WP pR( a!` !WH@~Dq! l~Dǎ@HHWH<@~Dr '$~Dǎ@Ǟ<HHWH<0@~Dr 0 (+R a(a( <r NwX   @   "   " t  )r!  )a!"  p(~Dǎ@Ǟ<HHW@~<p.`W .`&0 2  &'>  ~<@@W@\.`P$.\(0 2 $ . $$  @@W@\.`.\$<@@W@.` >`#@@WX@~D.x qώxTP.L6H@HU(~Dǎ@XXWP.p0>@DH".L @.M.p.@x.DPPW[W![W[W2![W2![WC2!,[W2![W[h*W *[<**W2![W+W@8~ PPWA~"t0As3r21~Wp>>>>>Ǽ? @P PP?$PpRU(P?$%py}kg,P?$(VP p:w]ѡ[q" ,?(0?(ְ?(Fp?@c(stdxX܋ `? d`? P?$([P  ,?(0?( ְ?(`? d`? (P?$[PQ̡P! ! ,?(0?(ְ?(`? d`? 'Π- 8ы0):@0CAMр ѡ(P?$[P Q фP р}-!ш},?(0?(ְ?(`? d`? / q0фыh`? d`? / q0фы4?>?`? csd(u$+\-` d#h.l*x0Āelh%ox0XeEfgGn9ld`?  ?d`? @ ? ? "  !?`d`? }>; -!10>@@ V 8@  /  +!10>"  /  !10> @ /00 0ѡ $@ZPECѡMѡ p? }? u?? ^d`? } pq 5#"0ѡP n b V J@ ? 6@ *?d`? ? ? d`? ? @     0 9: @ ? ?z ?WC00_D00_D00d`? - ?p&@ 4??  a@ '? -?? pX Oo620>x 0 >>"X>  ??   @ / & ? g `h`? ? 0!#и>0?,@?0ȧN(>d>8?0 - >>D  5  + >> >>g ю 0ѡaP? P .aP6 QaP P?P? ׶`?p?8g> 06P?,QPU):RECAaFSRQaVrgaga?,- +aea E`>rvp??? #2#: @ / & ? g `h`? ? 0<#0?,@?0ȧN(>>8?0`? P?,/Q)-0!->! >B +>! >   >! >E00@qA0- '1qA@Aq@ `  .'qF<Ad &$ ? ?A@> QP&#1qA@Aq@?@p?`? #H ? @ & ?  ! ? g `h`? 0#>0?,@?0ȧN(>z>8> ?,`?  FF=11=CCAM 0AMAP?,VA@? E@? p?}@>g?d``??  >  ? ??? @>p>>//,?(0?( ְ?(zkg(P?$(VPp: w q&/,?(0?( ְ?(@>p>>@ekd,?$( >DA4>,?(0?(> >ְ?( ֠?>//,?(0?( ְ?(Jkd(P?$(VP@:0D A&/,?(0?( tְ?(>pTkg(?$( wq( ,?(0?( ְ?(     / ֠?>//,?(0?( ְ?(Jkd*P?$(VP@<0D A&/,?(0?( lְ?(> fp?p\kg,?$( >wq,>,?(0?( ְ?( ֠??//,?(0?( ְ?(Jkd*P?$(VP@< D A&/,?(0?( Xְ?(H{ p   ?$( @  @ , 2 ! . 00  +     p>ؐ>ذ>>>WhLPTX\`~dpЩ.   "9d!0"9!#"(    % %Xh!! . $  * "9ߎ ޠ l h  [ h  "9ΰl cf[^T!0"9!#"( cs [(~(^ *>h^,"~(^ *;^,h    ~dǎ`Ǟ\ǮXǾTPLhhWP8<@DHL~P~P^^^ϞT^^x^:d2p0@W^Q^ΰ Lܴ +!R  ->^Q^\![RQ^ "9^P v "90& "9 7W(!^Q^.^Q^e E|t^Q^d$! "9+ - B!s` T). 2 l.242# .242""7^P l$^PLh(^z ^P~PǎLǞHǮDǾ@<8W`<@DHLP~T~ XcsR[\RP^\*)bب!!0#.0"9#"( ^\P!+"  4nX  c ~TǎPǞLǮHǾD@<``WH<@~Dp^qV $1 ]2 - qR Z -87#@]$*'B2 2#q q1 ]2~Dǎ@Ǟ<HHW$ )(  WP@DH~Lr @D''!'ݎ )7 x) ~LǎHǞDǮ@PPW ! ^ 0(,01  !W2!6[0W`@DHLPT~XP^\0"9 #"( + "  -^\Q^\ p1@ΐ. ~Hΐ0 Aj0ސ ̈ *ސ ̈:zA@ސ ̈* ސ ̈:zpޠ"9eΐ. TB 9Ȍ19#59'3( E e 0@ (@@0@ (@@ @+ @-1p"9@GDD@>@B*  p"9@GDD@0 p1818,=:yp6p?qq5yq1(18 K ?0@@A@ q5'@sA@  6! #;K;;#\ 2  ~XǎTǞPǮLǾHD@``WPHx~Lp(,j~LǎHPPWPHx~Lp(,"~LǎHPPW`?8<@DH~Lp.ޠ??:T 2p? p???p  :X ސ1 ?p  C@:8 6p  : @$:@$ 1 P@$`^P5%cR:W^XP'86 0":B0C9"5 4r+!+ @$0:  ?05N?:@ 5p  5 @$0:  ?( ?( ?:?( 0 &009 4 @$05p (  5(T? &1?  &0   9( ~LǎHǞDǮ@Ǿ<8`?`WP@D~Hr :  .LЌpL8"+:GA5pp!`' pq90A@3 95pL1"+P>5p(`pq91A 31906~HǎDǞ@PPW0+K "AC1!WAC$AhAC%hAC&hACWQWPX%AC1QCGxBBSD"vt ('"AC8('p'"$AC4$X$AhAC!FhAC" )Ԩ     ,v   aP/\ +! (() )((  ' p(7! ΀BW  D ,,- ˤ ~TǎPǞLǮHǾD@<XXWA0~: r:2rqrp?5p?:pprq3rp?:ppp:sp2~ǎW0@ A#1 ! 1W @(#)io.c 5.5 87/10/29 @(#)peep.h 5.8 87/10/30 00000xxxxxxxx %shbd%s%sd%srdr%srdrdio.c%s%dr%d,io.cio.c P8>>=<<=<>= %s,l!%s; Opt_on: Opt_off: reg %d) %s, directindirect%s, %d uses , op1=, op2=%s: %c%d consecutive stores: beginning=%d, ending=%d @(#)op.c 5.11 87/11/22 @(#)peep.h 5.8 87/10/30 op.cop.cop.c+%d%d+%s%d%s%sop.c%s%s%dop.cop.cop.cop.cop.c%s+%sop.cop.c align op.cop.c--changed----changed--move((,($((op.cop.cop.cop.cop.c-----------L-D------op.c22<2<2<2<2<2<22221t2<22<2<2<2op.c9FxEEEFFFxFFDFFFGGFxFxGHFFxFGGF\F\GpEGCpEEEEEFxD\DD0@=@9GGGsubaddop.cop.cop.cop.cop.cop.c;+++++++++++++++++++++ Begin Basic Block ;--------------------- End Basic Block @(#)op2.c 5.7 87/10/29 @(#)peep.h 5.8 87/10/30 KKKKKKKKKKKKKKop2.cop2.cop2.cop2.cTTTTT @(#)parse.c 5.9 87/12/01 @(#)peep.h 5.8 87/10/30 Peephole optimizer internal error: line %d, file %s Opt_on: Opt_off: WWWWWWWWWWWlparse.c_d_d_<_~_T_~_t_t_t_t_$_~_~_~_T_T_~_~_~_~_~_~_~___`(`(`(`(`(`(`(__`(`(`(`__`(_parse.c %s: can't open file %s mode %s dsect data align 4 common SaveReg,32 csect code rw;Begin Block ;End Block CFPd:D:l:o:; maxiterations = %d bad value for debug flag: %d illegal option: %cparse.cDLT\dl@<840,($ t|  $,/4*  !$<%DL T+"\dlt"|8 ," ) ((($(,&4<D LT\"dlt| ##**'''' * H+xorsubsehsebretremornotnopnegmpylsrlsldivcslchkbrasraslandaddeofeobbrsecslasrasllsrlslretnopchkandxorornotremdivmpysubaddnegnonebytehalfworddblemovecbitsbittbitfixtfixrmakerdlcompfloatcompeaddesubempyedivmakedrtestcallrcallloopstoreloadladdrignorecsectdsectaligncallcallrcbitcsectdcompdfixrdfixtdfloatdlsldlsrdradddrcompdrdivdrmpydrnegdrsubdsecteaddedivempyesubfixrfixtfloatladdrlcomploadloadbloaddloadhloopmakedrmakerdmoveraddrcomprdivrmpyrnegrsubsbitstabdstabnstorestorebstoredstorehtbittestword @(#)malloc.c 5.2 87/10/29  @(#)scatter.c 5.2 87/10/29 @(#)peep.h 5.8 87/10/30 scatter.cscatter.cm4mDmDmDmDmDmDm4m4m4lmmDm<mDmDmDm4scatter.c @(#)unroll.c 5.4 87/10/29 @(#)peep.h 5.8 87/10/30 @(#)unroll.h 5.3 87/10/29 +: .n.out: SaveReg+SaveReg+internal error: unroll.c needs scr3 .out align ,@LXdp|an impossible branch @(#)re.c 5.12 87/12/01 @(#)peep.h 5.8 87/10/30 @(#)re.h 5.2 87/10/29 re.c%s%d,%d, %d,%d,DAG:---------- %d %s pred: succ: level: %d fpred: fsucc: flevel: %d last_dest_pred: %d DAG DONE:--------- %sNEWBB:-------- DONE NEWBB:-------- %sBegin--------------------------------- #%d %s:::: %d End--------------------------------- @(#)index.c 6.1 87/11/23 @(#)rindex.c 6.1 87/11/23 @(#)atoi.c 6.1 87/11/23 @(#)calloc.c 6.1 87/11/23 @(#)ctype.c 6.1 87/11/23 ((((( H @(#)getopt.c 6.1 87/11/23 --: illegal option -- : illegal option -- : option requires an argument -- : option requires an argument --  @(#)memset.c 6.1 87/11/23 @(#)mon.c 6.1 87/11/23 PROFDIRmon.out @(#)perror.c 6.1 87/11/23 : Unknown error @(#)data.c 6.1 87/11/23 ( @(#)fgets.c 6.1 87/11/23 @(#)stdiom.h 6.1 87/11/23 @(#)filbuf.c 6.1 87/11/23 @(#)flsbuf.c 6.1 87/11/23 @(#)stdiom.h 6.1 87/11/23 @(#)fopen.c 6.1 87/11/23 @(#)fprintf.c 6.1 87/11/23 @(#)printf.c 6.1 87/11/23 @(#)scanf.c 6.1 87/11/23 @(#)sprintf.c 6.1 87/11/23  @(#)errlst.c 6.1 87/11/23 +++,,(,@,L,h,|,,,,,,,-- -,-@-P-`-p-------.. .0.<.T.h....../ /,/H/X.Error 0Not ownerNo such file or directoryNo such processInterrupted system callI/O errorNo such device or addressArg list too longExec format errorBad file numberNo child processesNo more processesNot enough spacePermission deniedBad addressBlock device requiredDevice busyFile existsCross-device linkNo such deviceNot a directoryIs a directoryInvalid argumentFile table overflowToo many open filesNot a typewriterText file busyFile too largeNo space left on deviceIllegal seekRead-only file systemToo many linksBroken pipeArgument out of domainResult too largeNo message of desired typeIdentifier removedChannel number out of rangeLevel 2 not synchronizedLevel 3 haltedLevel 3 resetLink number out of rangeProtocol driver not attachedNo CSI structure availableLevel 2 haltedDeadlock condition if locked @(#)getenv.c 6.1 87/11/23 @(#)isatty.c 6.1 87/11/23 @(#)memccpy.c 6.1 87/11/23 000000000000000000000123456789abcdef0123456789ABCDEF @(#)doscan.c 6.1 87/11/23  ,,,,,,,,,,,,,,$ @(#)findiop.c 6.1 87/11/23 @(#)dowrite.c 6.1 87/11/23 @(#)print.h 6.1 87/11/23 @(#)ungetc.c 6.1 87/11/23 @(#)atof.c 6.1 87/11/23 @(#)ecvt.c 6.1 87/11/23 Fn CAy7Aׄ@È@Y@$ @(#)ldexp.c 6.1 87/11/23 @(#)fwrite.c 6.1 87/11/23 @(#)stdiom.h 6.1 87/11/23 @(#)frexp.c 6.1 87/11/23 @(#)memchr.c 6.1 87/11/23 ......cfiokdbmlnetnetinetoswbMakefileunix.ld...conf.clinesw.cMakefileconfig.h#ident " @(#)conf.c 6.1 87/11/24 " #include "config.h" #include #include #include #include #include #include #include #include extern nodev(), nulldev(); extern smdopen(), smdclose(), smdread(), smdwrite(), smdstrategy(), smdprint(); extern smdintr(), smdioctl(); extern smopen(), smclose(), smread() ; #if CIO_0 extern wbalopen(), wbalclose(), wbalread(), wbalwrite(), wbalioctl(); extern wbalintr(), wbalinit(); extern wblpopen(), wblpclose(), wblpread(), wblpwrite(), wblpioctl(); extern wblpintr(), wblpinit(); extern wbctopen(), wbctclose(), wbctread(), wbctwrite(), wbctstrategy(), wbctprint(); extern wbctintr(), wbctinit(), wbctioctl(); #endif #if MT_0 extern mtopen(), mtclose(), mtread(), mtwrite(), mtstrategy(), mtprint(); extern mtioctl() , mtintr(); #endif #if STCT_0 extern stctopen(), stctclose(), stctread(), stctwrite(), stctstrategy(); extern stctprint(), stctioctl() , stctintr(); #endif #if FDLP_0 extern fpalopen(), fpalclose(), fpalread(), fpalwrite(), fpalioctl(); extern fplpopen(), fplpclose(), fplpread(), fplpwrite(), fplpioctl(); extern fdlpintr(), fpalinit(); #endif extern mmread(), mmwrite(), mmioctl(); #if PRF_0 extern prfread(), prfwrite(),prfioctl(); #endif extern syopen(), syread(), sywrite(), syioctl(); #if ERRLOG_0 extern erropen(), errclose(), errread(); #endif #if SXT_0 extern sxtopen(), sxtclose(), sxtread(), sxtwrite(),sxtioctl(); #endif #if PTY_0 extern ptsopen(), ptsclose(), ptsread(), ptswrite(),ptsioctl(); extern ptcopen(), ptcclose(), ptcread(), ptcwrite(),ptcioctl(); #endif #if TCPIP_ETH extern wbetopen(), wbetattach(), wbetintr(), wbetctrl(); extern rnetopen(), rnetclose(), rnetread(), rnetwrite(), rnetioctl(); extern loattach(); #endif #if SAS_0 extern masopen(), masclose(), masread(), maswrite(), masioctl(); extern sasintr(), masintr(), sasinit(); #endif #if TEKDR_0 extern tekttyopen(), tekttyclose(), tekttyread(), tekttywrite(), tekttyioctl(); extern tekttyintr(), tekttyinit(); #endif #if DISP_0 extern dispopen(), dispclose(), dispread(), dispwrite(), dispioctl(); extern dispintr(), dispinit(); #endif struct bdevsw bdevsw[] = { /*0*/ smdopen, smdclose, smdstrategy, smdprint, 8*BSIZE , #if MT_0 /*1*/ mtopen, mtclose, mtstrategy, mtprint, BSIZE , #else #if STCT_0 /*1*/ stctopen, stctclose, stctstrategy, stctprint, BSIZE , #else nodev, nodev, nodev, nodev, #endif #endif #if CIO_0 /*2*/ wbctopen, wbctclose, wbctstrategy, wbctprint, BSIZE, #else nodev, nodev, nodev, nodev, #endif }; int bdevcnt = sizeof(bdevsw) / sizeof(struct bdevsw); struct cdevsw cdevsw[] = { #if CIO_0 /*0*/ wbalopen, wbalclose, wbalread, wbalwrite, wbalioctl, wbal_tty, 8, /*1*/ wbalopen, wbalclose, wbalread, wbalwrite, wbalioctl, wbal_tty, 8, #else /*0*/ fpalopen, fpalclose, fpalread, fpalwrite, fpalioctl, fdlp_tty, 4, /*1*/ fpalopen, fpalclose, fpalread, fpalwrite, fpalioctl, fdlp_tty, 4, #endif /*2*/ syopen, nulldev, syread, sywrite, syioctl, 0, 0, /*3*/ nulldev, nulldev, mmread, mmwrite, mmioctl, 0, 0, /*4*/ smdopen, smdclose, smdread, smdwrite, smdioctl, 0, 0, #if PRF_0 /*5*/ nulldev, nulldev, prfread, prfwrite, prfioctl, 0, 0, #else /*5*/ nodev, nodev, nodev, nodev, nodev, 0, 0, #endif #if ERRLOG_0 /*6*/ erropen, errclose, errread, nodev, nodev, 0, 0, #else /*6*/ nodev, nodev, nodev, nodev, nodev, 0, 0, #endif #if CIO_0 /*7*/ wbctopen, wbctclose, wbctread, wbctwrite, wbctioctl, 0, 0, #else /*7*/ nodev, nodev, nodev, nodev, nodev, 0, 0, #endif #if CIO_0 /*8*/ wblpopen, wblpclose, wblpread, wblpwrite, wblpioctl, 0, 0, #else /*8*/ fplpopen, fplpclose, nodev, fplpwrite, fplpioctl, 0, 0, #endif #if MT_0 /*9*/ mtopen, mtclose, mtread, mtwrite, mtioctl, 0, 0, #else #if STCT_0 /*9*/ stctopen, stctclose, stctread, stctwrite, stctioctl, 0, 0, #else /*9*/ nodev, nodev, nodev, nodev, nodev, 0, 0, #endif #endif #if SXT_0 /*10*/ sxtopen, sxtclose, sxtread, sxtwrite, sxtioctl, 0, 0, #else /*10*/ nodev, nodev, nodev, nodev, nodev, 0, 0, #endif #if SAS_0 /*11*/ masopen, masclose, masread, maswrite, masioctl, mas_tty, 8, #else /*11*/ nodev, nodev, nodev, nodev, nodev, 0, 0, #endif #if PTY_0 /*12*/ ptsopen, ptsclose, ptsread, ptswrite, ptsioctl, 0, 0, /*13*/ ptcopen, ptcclose, ptcread, ptcwrite, ptcioctl, 0, 0, #else nodev, nodev, nodev, nodev, nodev, 0, 0, nodev, nodev, nodev, nodev, nodev, 0, 0, #endif /*14*/ smopen, smclose, smread, nulldev, nulldev, 0, 0, #if TCPIP_ETH /*15*/ wbetopen, nulldev, nulldev, nulldev, nulldev, 0, 0, #else /*15*/ nodev, nodev, nodev, nodev, nodev, 0, 0, #endif /*16*/ nodev, nodev, nodev, nodev, nodev, 0, 0, /*17*/ nodev, nodev, nodev, nodev, nodev, 0, 0, /*18*/ nodev, nodev, nodev, nodev, nodev, 0, 0, /*19*/ nodev, nodev, nodev, nodev, nodev, 0, 0, /*20*/ nodev, nodev, nodev, nodev, nodev, 0, 0, /*21*/ nodev, nodev, nodev, nodev, nodev, 0, 0, /*22*/ nodev, nodev, nodev, nodev, nodev, 0, 0, /*23*/ nodev, nodev, nodev, nodev, nodev, 0, 0, /*24*/ nodev, nodev, nodev, nodev, nodev, 0, 0, #if TCPIP_ETH /*25*/ rnetopen, rnetclose, rnetread, rnetwrite, rnetioctl, 0, 0, #else /*25*/ nodev, nodev, nodev, nodev, nodev, 0, 0, #endif #if TEKDR_0 /*26*/ nodev, nodev, nodev, nodev, nodev, 0, 0, /*27*/ tekttyopen, tekttyclose, tekttyread, tekttywrite, tekttyioctl, 0, 0, #else /*26*/ nodev, nodev, nodev, nodev, nodev, 0, 0, /*27*/ nodev, nodev, nodev, nodev, nodev, 0, 0, #endif #if DISP_0 /*28*/ dispopen, dispclose, dispread, dispwrite, dispioctl, 0, 0, #else /*28*/ nodev, nodev, nodev, nodev, nodev, 0, 0, #endif }; int cdevcnt = sizeof(cdevsw) / sizeof(struct cdevsw); /* debug levels */ unsigned long dblev = DB1|DB2 ; /* configuration tables : confsw et conf_devs */ /* routine it type 0 (init iomachdep) */ iomd_intr() {} /* ciotype : periph type in cio */ unsigned char ciotype[] = { CIODEBUG, /* 0 debug */ CIODIAG, /* 1 diagnostic */ CIOLANCE, /* 2 lance */ CIOENET, /* 3 ethernet */ CIOTTY, /* 4 asynchronous lines */ CIOLP, /* 5 line printer */ CIOISBX, /* 6 isbx */ 0, /* 7 ruf */ CIOTAPE, /* 8 cartridge */ CIODISC, /* 9 disc */ CIOSCSI, /* a other scsi */ CIOSCSI, /* b other scsi */ CIOSCSI, /* c other scsi */ CIOSCSI, /* d other scsi */ CIOSCSI, /* e other scsi */ CIOSCSI, /* f other scsi */ }; struct confsw confsw[] = { /*0*/ iomd_intr, NULL , 0 , 0 , #if FDLP_0 /*1*/ fdlpintr, "FDLP" , FDLP_0 , 0 , #else /*1*/ 0, "FDLP" , FDLP_0 , 0 , #endif /*2*/ 0, "ANSI" , 0 , 0 , /*3*/ smdintr, "SMD", SMD_0 , 0 , #if DISP_0 /*4*/ dispintr, "KEYB" , DISP_0 , 0 , /*5*/ dispintr, "DISP" , DISP_0 , 0 , #else /*4*/ 0, "KEYB" , 0 , 0 , /*5*/ 0, "DISP" , 0 , 0 , #endif /*6*/ 0, "CIODEBUG" , CIO_0 , 0 , /*7*/ 0, "CIODIAG" , CIO_0 , 0 , #if TCPIP_ETH /*8*/ wbetintr, "CIOLANCE" , CIO_0 , 0 , /*9*/ wbetctrl, "CIOENET" , CIO_0 , 0 , #else /*8*/ 0, "CIOLANCE" , CIO_0 , 0 , /*9*/ 0, "CIOENET" , CIO_0 , 0 , #endif #if CIO_0 /*10*/ wbalintr, "CIOTTY" , CIO_0 , 0 , #else /*10*/ 0, "CIOTTY" , CIO_0 , 0 , #endif #if CIO_0 /*11*/ wblpintr, "CIOLP" , CIO_0 , 0 , #else /*11*/ 0, "CIOLP" , CIO_0 , 0 , #endif /*12*/ 0, "CIOISBX" , CIO_0 , 0 , #if CIO_0 /*13*/ wbctintr, "CIOTAPE" , CIO_0 , 0 , #else /*13*/ 0, "CIOTAPE" , CIO_0 , 0 , #endif /*14*/ 0, "CIODISC" , CIO_0 , 0 , /*15*/ 0, "CIOSCSI" , CIO_0 , 0 , /*16*/ 0, NULL , 0 , 0 , /*17*/ 0, NULL , 0 , 0 , /*18*/ 0, NULL , 0 , 0 , /*19*/ 0, NULL , 0 , 0 , /*20*/ 0, NULL , 0 , 0 , /*21*/ 0, NULL , 0 , 0 , /*22*/ 0, NULL , 0 , 0 , /*23*/ 0, NULL , 0 , 0 , /*24*/ 0, NULL , 0 , 0 , /*25*/ 0, NULL , 0 , 0 , /*26*/ 0, NULL , 0 , 0 , /*27*/ 0, NULL , 0 , 0 , /*28*/ 0, NULL , 0 , 0 , /*29*/ 0, NULL , 0 , 0 , /*30*/ 0, NULL , 0 , 0 , /*31*/ 0, NULL , 0 , 0 , #if MT_0 /*32*/ mtintr, "MT" , MT_0 , 0 , /*33*/ mtintr, "MTEXT" , 0 , 0 , /* counts as normal MT */ #else #if STCT_0 /*32*/ stctintr, "MT" , STCT_0 , 0 , /*33*/ stctintr, "MTEXT" , 0 , 0 , /* counts as normal MT */ #else /*32*/ 0, NULL , 0 , 0 , /*33*/ 0, NULL , 0 , 0 , #endif #endif /*34*/ 0, NULL , 0 , 0 , /*35*/ 0, NULL , 0 , 0 , /*36*/ 0, NULL , 0 , 0 , /*37*/ 0, NULL , 0 , 0 , /*38*/ 0, NULL , 0 , 0 , /*39*/ 0, NULL , 0 , 0 , /*40*/ 0, NULL , 0 , 0 , /*41*/ 0, NULL , 0 , 0 , /*42*/ 0, NULL , 0 , 0 , /*43*/ 0, NULL , 0 , 0 , /*44*/ 0, NULL , 0 , 0 , /*45*/ 0, NULL , 0 , 0 , /*46*/ 0, NULL , 0 , 0 , /*47*/ 0, NULL , 0 , 0 , /*48*/ 0, NULL , 0 , 0 , /*49*/ 0, NULL , 0 , 0 , #if TEKDR_0 /*50*/ tekttyintr, "DR11TEK" , TEKDR_0, 0, #else /*50*/ 0, NULL , 0 , 0 , #endif /*51*/ 0, NULL , 0 , 0 , /*52*/ 0, NULL , 0 , 0 , /*53*/ 0, NULL , 0 , 0 , /*54*/ 0, NULL , 0 , 0 , /*55*/ 0, NULL , 0 , 0 , /*56*/ 0, NULL , 0 , 0 , /*57*/ 0, NULL , 0 , 0 , /*58*/ 0, NULL , 0 , 0 , /*59*/ 0, NULL , 0 , 0 , /*60*/ 0, NULL , 0 , 0 , /*61*/ 0, NULL , 0 , 0 , /*62*/ 0, NULL , 0 , 0 , /*63*/ 0, NULL , 0 , 0 , /*64*/ 0, "ENET" , ENET_0 , 0 , /*65*/ 0, "CIO" , CIO_0 , 0 , /*66*/ 0, NULL , 0 , 0 , /*67*/ 0, NULL , 0 , 0 , /*68*/ 0, NULL , 0 , 0 , /*69*/ 0, NULL , 0 , 0 , /*70*/ 0, NULL , 0 , 0 , /*71*/ 0, NULL , 0 , 0 , /*72*/ 0, NULL , 0 , 0 , /*73*/ 0, NULL , 0 , 0 , /*74*/ 0, NULL , 0 , 0 , /*75*/ 0, NULL , 0 , 0 , /*76*/ 0, NULL , 0 , 0 , /*77*/ 0, NULL , 0 , 0 , /*78*/ 0, NULL , 0 , 0 , /*79*/ 0, NULL , 0 , 0 , /*80*/ 0, NULL , 0 , 0 , /*81*/ 0, NULL , 0 , 0 , /*82*/ 0, NULL , 0 , 0 , /*83*/ 0, NULL , 0 , 0 , /*84*/ 0, NULL , 0 , 0 , /*85*/ 0, NULL , 0 , 0 , /*86*/ 0, NULL , 0 , 0 , /*87*/ 0, NULL , 0 , 0 , /*88*/ 0, NULL , 0 , 0 , /*89*/ 0, NULL , 0 , 0 , /*90*/ 0, NULL , 0 , 0 , /*91*/ 0, NULL , 0 , 0 , /*92*/ 0, NULL , 0 , 0 , /*93*/ 0, NULL , 0 , 0 , /*94*/ 0, NULL , 0 , 0 , /*95*/ 0, NULL , 0 , 0 , /*96*/ 0, NULL , 0 , 0 , /*97*/ 0, NULL , 0 , 0 , /*98*/ 0, NULL , 0 , 0 , /*99*/ 0, NULL , 0 , 0 , /*100*/ 0, NULL , 0 , 0 , /*101*/ 0, NULL , 0 , 0 , /*102*/ 0, NULL , 0 , 0 , /*103*/ 0, NULL , 0 , 0 , /*104*/ 0, NULL , 0 , 0 , /*105*/ 0, NULL , 0 , 0 , /*106*/ 0, NULL , 0 , 0 , /*107*/ 0, NULL , 0 , 0 , /*108*/ 0, NULL , 0 , 0 , /*109*/ 0, NULL , 0 , 0 , /*110*/ 0, NULL , 0 , 0 , /*111*/ 0, NULL , 0 , 0 , /*112*/ 0, NULL , 0 , 0 , /*113*/ 0, NULL , 0 , 0 , /*114*/ 0, NULL , 0 , 0 , /*115*/ 0, NULL , 0 , 0 , /*116*/ 0, NULL , 0 , 0 , /*117*/ 0, NULL , 0 , 0 , /*118*/ 0, NULL , 0 , 0 , /*119*/ 0, NULL , 0 , 0 , /*120*/ 0, NULL , 0 , 0 , /*121*/ 0, NULL , 0 , 0 , /*122*/ 0, NULL , 0 , 0 , /*123*/ 0, NULL , 0 , 0 , /*124*/ 0, NULL , 0 , 0 , /*125*/ 0, NULL , 0 , 0 , /*126*/ 0, NULL , 0 , 0 , /*127*/ 0, NULL , 0 , 0 , #if SAS_0 /*128*/ sasintr, "SAS" , SAS_0, 0 , #else /*128*/ 0, "SAS" , SAS_0 , 0 , #endif /*129*/ 0, NULL , 0 , 0 , #if SAS_0 /*130*/ masintr, "SASAL" , SAS_0 , 0 , #else /*130*/ 0, "SASAL" , SAS_0 , 0 , #endif /*131*/ 0, NULL , 0 , 0 , /*132*/ 0, NULL , 0 , 0 , /*133*/ 0, NULL , 0 , 0 , /*134*/ 0, NULL , 0 , 0 , /*135*/ 0, NULL , 0 , 0 , /*136*/ 0, NULL , 0 , 0 , /*137*/ 0, NULL , 0 , 0 , /*138*/ 0, NULL , 0 , 0 , /*139*/ 0, NULL , 0 , 0 , /*140*/ 0, NULL , 0 , 0 , /*141*/ 0, NULL , 0 , 0 , /*142*/ 0, NULL , 0 , 0 , /*143*/ 0, NULL , 0 , 0 , /*144*/ 0, NULL , 0 , 0 , /*145*/ 0, NULL , 0 , 0 , /*146*/ 0, NULL , 0 , 0 , /*147*/ 0, NULL , 0 , 0 , /*148*/ 0, NULL , 0 , 0 , /*149*/ 0, NULL , 0 , 0 , /*150*/ 0, NULL , 0 , 0 , /*151*/ 0, NULL , 0 , 0 , /*152*/ 0, NULL , 0 , 0 , /*153*/ 0, NULL , 0 , 0 , /*154*/ 0, NULL , 0 , 0 , /*155*/ 0, NULL , 0 , 0 , /*156*/ 0, NULL , 0 , 0 , /*157*/ 0, NULL , 0 , 0 , /*158*/ 0, NULL , 0 , 0 , /*159*/ 0, NULL , 0 , 0 , /*160*/ 0, NULL , 0 , 0 , /*161*/ 0, NULL , 0 , 0 , /*162*/ 0, NULL , 0 , 0 , /*163*/ 0, NULL , 0 , 0 , }; int confcnt = sizeof(confsw) / sizeof(struct confsw); struct conf_devs conf_devs[256]; int (*dev_init[])() = { #if CIO_0 wbalinit , wblpinit , wbctinit , #else fpalinit , #endif #if TCPIP_ETH wbetattach , loattach, #endif #if SAS_0 sasinit, #endif #if TEKDR_0 tekttyinit, #endif #if DISP_0 dispinit, #endif 0 , }; short timezone = TIMEZONE ; short dstflag = DSTFLAG ; daddr_t swplo ; #include struct utsname utsname = { SYS, NODE, REL, VER, MACH, }; #ident " @(#)linesw.c 6.1 87/11/24 " #include "config.h" #include /* * Line Discipline Switch Table */ extern nulldev(); extern ttopen(), ttclose(), ttread(), ttwrite(), ttioctl(), ttin(), ttout(); extern tvopen(), tvclose(), tvioctl(), tvin() ; #if SXT_0 extern sxtin(), sxtout(), sxtrwrite(); #endif /* order: open close read write ioctl rxint txint modemint */ struct linesw linesw[] = { ttopen, ttclose, ttread, ttwrite, ttioctl, ttin, ttout, nulldev #if SXT_0 ,nulldev, nulldev, nulldev, sxtrwrite, nulldev, sxtin, sxtout, nulldev #endif tvopen, tvclose, ttread, ttwrite, tvioctl, tvin, ttout, nulldev }; /* number on entries in linesw */ int linecnt = sizeof(linesw) / sizeof(struct linesw); /* * Virtual Terminal Switch Table */ struct termsw termsw[] = { /*0*/ nulldev, nulldev, nulldev, /* tty */ }; /* number of entries in termsw */ int termcnt = 1; # " @(#)mk.field 6.1 87/11/24 " SYS = RX/V NODE = undef REL = 1.1 VER = standard MACH = ridge ROOT = INCRT = $(ROOT)/usr/include SOURCES = conf.c linesw.c OBJECTS = conf.o linesw.o # HEADERS is the set of local include files HEADERS = config.h CFLAGS = -O \ -DSYS=\"$(SYS)\" \ -DNODE=\"$(NODE)\" \ -DREL=\"$(REL)\" \ -DVER=\"$(VER)\" \ -DMACH=\"$(MACH)\" all: $(OBJECTS) conf.o:\ $(HEADERS)\ $(INCRT)/sys/types.h\ $(INCRT)/sys/param.h\ $(INCRT)/sys/sysmacros.h\ $(INCRT)/sys/space.h\ $(INCRT)/sys/conf.h\ $(INCRT)/sys/timeb.h\ $(INCRT)/sys/debug.h\ $(INCRT)/sys/iomachdep.h\ $(INCRT)/sys/utsname.h linesw.o:\ $(HEADERS)\ $(INCRT)/sys/conf.h install: clean: -rm -f $(OBJECTS) clobber: clean #ident " @(#)config.h 6.1 87/11/24 " /* */ /* Drivers Configuration */ /* BOARDS NUMBERS */ /* */ #define CIO_0 4 # if CIO_0 #define FDLP_0 0 # else #define FDLP_0 3 #endif #define SMD_0 4 #define MT_0 1 #define STCT_0 0 #define ENET_0 1 #define SAS_0 0 #define TEKDR_0 0 #define DISP_0 0 /* */ /* TCPIP configuration */ /* */ #define TCPIP_X25 0 /*N05*/ /* TCPIP +interface x25 */ #define TCPIP_ETH 1 /*N06*/ /* TCPIP +interface ethernet */ #define TCPIP_0 (TCPIP_ETH||TCPIP_X25) /* Sockets (INTERNET domain) */ #define SOCKET_0 (0||TCPIP_0) /* Sockets (UNIX domain) */ #define PTY_0 (0||TCPIP_0) /* pseudo-tty */ /* */ /* software drivers configuration */ /* */ #define ERRLOG_0 0 #define PRF_0 1 #define SXT_0 1 /* * Software Configuration information */ #define NBUF 0 /* Cache size in blocks */ #define NHBUF 256 /* Cache hash code table size, */ /* must be a power of 2 */ #define NINODE 2000 /* Inode table size */ #define FLCKREC 40 /* Number of file locking structures */ #define FLCKFIL 10 /* Number of inode to lock structures */ #define NFILE 2000 /* File table size */ #define NMOUNT 16 /* Mount table size */ #define SPTMAP 512 /* kernel virtual memory map size */ #define NPROC 1024 /* Process table size */ #define NCALL NPROC /* Max number of callouts */ #define REGIONS 5*NPROC/2 /* regions tables size : about 2.5*NPROC */ #define NCLIST 200 /* Number of char lists */ #define MAXUP 25 /* Max number of process per user */ #define NPBUF 16 /* Number of physical buffers */ #define GETPGSLO 40 /* scheduler low page limit */ #define GETPGSHI 80 /* Scheduler high page limit */ #define VHANDR 1 /* Vhand wakeup rate (s) */ #define VHANDL 999999 #define VHNDFRAC 32 /* Fraction of maximum physical memory */ #define AGERATE 5 /* Process age rate (s) */ #define PREPAGE 8 /* Prepage factor */ #define MAXSC 16 /* Max number of pages spawpped out */ #define MAXPMEM 0 /* Physical memory used in mesurment */ #define BDFLUSHR 10 /* Bdflush wakeup rate (s) */ #define NAUTOUP 60 /* Max delayed write buffer */ #define MESG 1 /* Message facility */ #define MSGMAP 100 /* Msg map entries */ #define MSGMAX 2048 /* Max message size */ #define MSGMNB 4096 /* Max number of bytes in queue */ #define MSGMNI 50 /* Number of message queue identifiers */ #define MSGSSZ 8 /* Msg segment size, should be word size multiple */ #define MSGTQL 40 /* Number of system message headers */ #define MSGSEG 1024 /* Number of msg segments, must be < 32768 */ #define SEMA 1 /* semaphore facility */ #define SEMMAP 10 /* Sem map entries */ #define SEMMNI 10 /* Number of semaphore identifiers */ #define SEMMNS 60 /* Number of semaphores in system */ #define SEMMNU 30 /* Number of undo struct in system */ #define SEMMSL 25 /* Max number of semaphores per id */ #define SEMOPM 10 /* Max number of operations per semop call */ #define SEMUME 10 /* Max number of undo entries per process */ #define SEMVMX 32767 /* Semaphore max value */ #define SEMAEM 16384 /* Adjust on exit max value */ #define SHMEM 1 /* shared memory facility */ #define SHMMAX (128*1024) /* Max shared memory segment size */ #define SHMMIN 1 /* Min shared memory segment size */ #define SHMMNI 100 /* Number of shared memory identifiers */ #define SHMSEG 6 /* Max attached shared memory segments per process */ #define SHMBRK 16 /* Gap in segments used between data & first shm seg */ #define SHMALL 512 /* Max shared memory system wide in clicks */ /* network configuration */ #define MBUFS_INITIAL 2 /* initial mbufs in CLBYTES */ #define MCLBUFS_INITIAL 16 /* initial clusters in CLBYTES */ #define NMBCLUSTERS 128 /* total of mbufs & clusters CLBYTES */ #define SXTCNT 16 /* max shell layers */ #define NPTY 128 /* Timezone informations */ #define TIMEZONE ZONE_PST #define DSTFLAG DST_USA ...LIB2.a! / 568272587 0 0 0 5462 `         1p1p1p1p55555555555555555555555555555555555555hhhhhhhhhhh| | | | | pppppppppppppppppppppppp~~            >2>2>2>2>2>2>2>2GGGGGGGGGGGGGGGGGGuuuuuuuuuuuuuuuuuuG>G>G>G>G>G>G>G>G>G>G>G>G>G>G>G>G>G>G>G>G>G>JJJJJJJJJJJJJJJJSaveReg_getc_putc_getcf_putcf_getcb_putcb_getcbp_putcbpSaveReg_dispopen_dispclose_dispread_dispwrite_dispioctl_dispintr_dispinitSaveReg_erropen_errclose_errreadSaveReg_fpalinit_fdlp_addr_fpal_cnt_fdlp_cons_fpalopen_fpalproc_fpalparam_fpalclose_fpalmodem_fpalread_fpalwrite_fpalioctl_fpaleint_fpalextst_fpalcint_fpalxint_fpalswrite_fpalrint_al_work_fpalsread_fpalbwrite_ncharbreak_fpalwbreak_BAUD_fdlp_getchar_fdlp_putchar_diag_cons_fdlp_breakchar_fpalclr_fpalscan_al_scan_fpalcont_CTCDV_SIO4X_fpalbread_fdlpintr_KEYBOARDSaveReg_fplpopen_fplpoutput_fplpclose_fplpread_fplpwrite_fplppoke_fplpstart_fplpintr_fplpioctl_fplpclrSaveReg_GetHWSwitches_HWSetDate_HWClockCommand_HWGetDateSaveReg_iomachdep_cfdebug_move_dcb_devinit_ctladdrSaveReg_sasinit_sasadr_masadr_masid_mas_cnt_tblmastrace_masscan_masscantime_mastr_mastbltr_masnametr_mastrace_mastrn_mascmd_masopen_masproc_masflag_masparam_maser_masern_mastbler_masptrer_masclose_mastox_masread_maswrite_masioctl_masoutbloc_masoutcar_masinbloc_masincar_cvbaud_masintr_masrblocint_masrint_masxint_masarret_masdecon_masinilgn_mascon_masinitab_mascout_masbreak_masPDP_masDP_masrev_TBLSZSaveReg_meload_medma_medmaptr_nomfic_nomdir_gethdr_metrace_readlong_dcb0adr_dcb0_readshort_mewait_writeshort_writelong_metimeout_metoid_meflag_merev_readstat_writecom_sasintr_readbyte_writebyteSaveReg_mmread_mmwrite_mmioctlSaveReg_mtopen_mtcommand_mtprint_mtwait_mtclose_mtdebug_mtstart_mtstrategy_k_tab_C_tab_c_tab_d_unit_mtintr_mtread_mtwrite_mtioctl_mt_cntSaveReg_partabSaveReg_prfread_prfstat_prfmax_prfsym_prfctr_prfwrite_prfioctl_prfintrSaveReg_ptsopen_no_t_proc_ptsclose_ptcwakeup_ptsread_ptswrite_ptsproc_tptsproc_ptcopen_ptcclose_ptcread_ptcwrite_tptcwrite_ptcioctl_ptsioctlSaveReg_rnetopen_rnetclose_rnetread_rnetwrite_mclfree_mbstat_rnetioctl_rawinput_rawbuffer_nmbclusters_mbfreeSaveReg_smdopen_smdcommand_smdprint_smdclose_smdstrategy_smdstart_smdbb_smd_write_smdintr_smd_strer_smdread_smdwrite_smdioctl_smdsyncSaveReg_smopen_smclose_smread_sm_rpt_sys_mess_smwrite_sm_wptSaveReg_stctopen_mtcommand_mt_err_stctprint_mtwait_mt_bsz_S_tab_stctclose_stctdebug_mtstart_stctstrategy_d_unit_stctintr_mtberr_stctread_stctwrite_stctioctlSaveReg_sxtopen_linkTable_sxtnullproc_sxtvtproc_sxtlinit_sxtclose_sxtfree_sxtioctl_sxtin_sxtalloc_sxtread_sxtwrite_sxtrwrite_sxtout_sxtbuf_sxtbusy_sxtinitSaveReg_syopen_sycheck_syread_sywrite_syioctlSaveReg_tekttyopen_tekttyproc_tekttyclose_tekttyread_tekttywrite_tekttyioctl_tekttystart_tekttyifstart_tekttyxint_tekttyrint_tekttyintr_tekttyinitSaveReg_ttopen_ttioctl_ttclose_ttread_ttwrite_ttxput_ttin_tttimeo_ttoutSaveReg_ttiocom_ttywait_ttyflush_ttinit_ttcchar_canon_ttnulq_canonb_maptab_ttrstrt_ttlowat_tthiwatSaveReg_tvioctl_tv_blk_tv_fdx_tvopen_tvclose_tvinSaveReg_wbalunit_wbalinit_wbal_cnt_wbal_addr_wb_reset_PROMVersion_PCAConfig_CODEVersion_WBCommand_intrpInterval_StartWB_wbalopen_ttchar_wbalproc_wbalparam_wbalclose_wbmodem_wbalread_wbalwrite_wbalioctl_WBCtest1_WBCtest0_WBWriteChar_wbresetbrk_cio_getchar_cio_putchar_diag_cons_cio_breakchar_wbalclr_WBSetStartStop_BAUD_WBGetStartStop_wbalintr_timeInterval_wbal_cons_KEYBOARDSaveReg_wbctinit_wbct_cnt_wbctptr_wbct_addr_wbctopen_wbctcommand_wbctprint_wbcttimout_ctdens_wbctclose_wbctstrategy_wbctstart_wbctrstrategy_wbctimex_wbctclr_wbctintr_wbcterr_wbctread_wbctphys_wbctwrite_wbctioctlSaveReg_wblpinit_wblp_addr_wblp_cnt_wblpopen_testOffline_wblpclose_wblpoutput_wblpstart_wblpread_wblpwrite_wblpintr_wblpioctl_wblpclr_PROMVersion_CodeVersionclist.o/ 568271864 98 100 100664 2615 ` u!#.textX7 .dataXX @.bssxx@48~<p1#!! #2!# !1#D!'  ' !^ P~<ǎ8Ǟ4@@W@8~<q 01P00b0000000 0 ~<ǎ8@@W8 ȧ~4Tpp"$~488W@8~<pp~<ǎ8@@W@8~<p*(! P~<ǎ8@@W@8~<p( x px' ~<ǎ8@@WX?@DHLP˧~Tq |W%:)\ p((&    ~TǎPǞLǮHǾD@XXWX?@DHLPʧ~Tq'H r '  '''' {q{Wր%( ($ (* )  C  ~TǎP ǞLǮHǾD@XXW @(#)clist.c 6.1 87/11/24 z |              .           " ( 2 4 : @ H | *    n p | ~    .textX7.dataX .bssxSaveReg _getc_spl6_wakeup_splx_putc_getcf_putcf_getcbh_putcb_getcbpL_bcopy_putcbp8_cfreelist disp.o/ 568271881 98 100 100664 4390 ` u!$ H.text{ .data d@.bss YpYhpYHp !p 0x#"!p #"p!W@~<ppDp!8 pp p~<@@WH8<@~Dpp߁( pxn$2  H :~Dǎ@Ǟ<Ǯ8HHWYWP~@pA D <  @f&D,Lpx xQ ( (YDtY.Hp! p Yp!2 #!~ $. >$p" 2'p%$ YY~@PPW@~<p p|  *pp8J  a ! fpp~<@@W@8~ Y&8z800W8WH@~D8zZTpxz@t(.Yxx~Dǎ@HHW @(#)err.c 6.1 87/11/24 $<F R Xb| .text.data .bss8SaveReg _erropen_u_suserx_errread_geterec_min_copyout"_logstart_errclose_freeslotfpal.o/ 568271919 98 100 100664 12943 ` u!$.+C.text .data4(A@.bss((@8~<p8 `t ~<ǎ8@@W@z spz8~<zpzYzXp@d§48 8: :>+ >< <@ @z 4FpW~<ǎ8@@W@z!s&#p"z8z X~ )0 # ! )0 # )0 # @  )0 # @ )0 # #  " (  ~Dǎ@Ǟ<Ǯ8HHWH<@~Dp p1  q p@` njpWހ pHހ p 0ހ p@ހ p`!  @ B#0 # B@ X  >~Dǎ@Ǟ<HHW@~?A< << PTX\(,04ptx| $(,048<@DHLPT.text.dataA.bss(SaveReg _confsw_ctladdr#_d_write._u8_ttinitBLt_lineswWpb tmw8_fdlp_al_copyin_copyout_ttiocomD_wakeup<_sysinfo_al_work_spl5_splx L_BAUD _d_read 0!, _fpalclr < _timeout_al_scanFl_CTCDV_SIO4XP_printfZ_sleep_spl0e0oy _fpalinit_fdlp_addr_fpal_cnt_fdlp_cons_fpalopen_fdlp_tty_fpalproc_fpalparam_fpalclose_fpalmodem_fpalread_fpalwrite_fpalioctl_fpaleint_fpalextst_fpalcint_fdlp_dcb_fpalxint_fpalswrite_fpalrint_fpalsread_fpalbwrite_ncharbreak_fpalwbreak_fdlp_getchar_fdlp_putchar_diag_cons_fdlp_breakchar_fpalscan_fpalcont_d_rwrite_fpalbread_fdlpintr_fplpintr_KEYBOARD fplp.o/ 568271934 98 100 100664 4898 ` u!$>!.text h T .data h h @.bss 0 08 s  00 @@ 40Y0 @ 40x0 # : ާ    B (   6 @ާ    B (    0@ # !j88Ws    WYW@s8΀ ~ @ L      j p ~           L N t     < H  Z f    : <       .text hT.data h.bss 0SaveReg _uT%0<:P_spl4E_sleep_spl0_fubyte_putc_getcO[_wakeupfp_printfz_copyout_copyin_fplpclr 8_fplpopen_fdlp_lpdt_fplpoutput_fplpclose_fplpread_fplpwrite_fplppoke_fdlp_lpbuf_fplpstart_fplpintr_fdlp_dcb_fdlp_addr_d_rwrite_fplpioctlhwdiag.o/ 568271940 98 100 100664 1163 ` u!$D.text .data@D@.bss 0 0    0       >:pW (      WX!2!BL!~Pr!!~(,.0#4 >T~PǎLXXWX L>T~PR!1Aqρ#~(4,~PǎLXXW@A~<s b~<@@W @(#)hwdiag.c 6.1 87/11/24 pxpj h  .text.data@.bssSaveReg ,<GU__GetHWSwitches_HWSetDate_timetoYMDHMS_HWClockCommand_HWGetDate_YMDHMStotime_HWSerCmd iomachdep.o/ 568271951 98 100 100664 3067 ` u!$O .texthN .datahh@.bsshhP@D~Hp`L`.LLPa 82  L@  4` L6 !ΐ '8ߊ(ȓ $ؓv  vV         B"  0 #! 1 0((( "@ rA ߀0C  B( !1 D ߀0C  B( #1 qApzp ~HǎDǞ@PPW@~8p!p(`8t<`\# !@! 1   1>\~ )( ng *b6~TǎPǞLǮHǾD@<hhWH@~Dp p  `ppP  8  pp0`2" 0`p(!  X@  `  pހ&  +q  (! p2 . b~Dǎ@HHWX?@DHLPz ~Tqzs13p3zΰ   X߁  ߑQ   8   ppߡP `)  `)p(!  X@ ޠz  +(Y@48 8:  :> + >H  p0J R 0*   2 Њ Ppp!  0X@0  `!2!p  ! ! ! !Y(\90c4 1q!? !p"q@ @spAAq? sps@ @pxx  p94S8 1q!? !p"q@ @spAAq sps@ @pxx  p<@  @@ @<  @  @Q("   &h  F@" @   P@  @@  Q @    &B FpW  ~TǎPǞLǮHǾD@XXWPz!s&#p#z@Dΐ   Xߡ  H~LqJQ   8   pp߁T `'  `'p(!  X@ ހ @  6!  . $  Y  @ @,  Fp W<  @  #'   6,   1 Њ Tpp!  0X@0  `!1!p  ! ! ! !<   Y`  "* 0& 0 0n @T~LǎHǞDǮ@PPWHz!s&#p#z8<@΀   Xߡ  ߑ~DQ   8   ppqX `)  `)p(!  X@ pFp W~Dǎ@Ǟ<Ǯ8HHWHz!s&#p#z8<@΀   Xߑ  ߡ~DRQ   8   ppq\ `*  `*p(!  X@ pr ` Fp  W    ~Dǎ@Ǟ<Ǯ8HHWh@DHLPz@T~Xrzs!#p#z   X  ߡQ   8   pp߱` `*  `*p(!  X@ ް(`!0  TD ,얆 YLTC  ,r Y(\8^^\<^\Z  T^` T!ppWq !   !  tq "   "  Pq $   $  ,q (   (  q       xN   1 Њ `pp!  0X@0  `!1!p  ! ! ! !P^d.^d ^d,:8^d0`,><^d` '9  0,:8^d0`,><^d`n\<& & n` n^8     ~XǎTǞPǮLǾHD@hhWX?@DHLP~Tp  Xΰ   ߑP  8  ppߠd `  `p  X@ ޠ  pW@! @(*'(*(@ @@ @Q   @Q XPFpW 2  @ @$@ @    &(   抋0  9N ?PY$   $   1 Њdpp X@ `1 p  t  0 @ "   2 Њ dpp!  0X@0  `!2!p  ! ! ! ! $    Ez G ㌋@ @@ (  @@@ p@   @ @  @  6  @  ~TǎPǞLǮHǾD@XXWX?@DHLP~Tp p  X߱  ߁@JP  8  ppߐh `  `p  X@ ސ hK<V  ~(     *   1 Њhpp  X@ `1p  <  YJ8  Π :01 4?3ӣ(0 :p8 0 :p< 4Π0 :Π :(>0B0 Π:.Π0:"0123 #4Π@ :0 4Π0 :0 0 :p8 #4Π :0 0 #4@ 404 #8 10F;8@ 4089490 ;8@ 40 0 0<*0<+0,& 1(  ` d r $6  d . $$$ $    (   ݠ ݘ  ~TǎPǞLǮHǾD@XXWp@DHLPT~Xp pώ .p\ ` !s0  x !\.``" " `\`ܬs .h^h QУ^h nh&?=`  /-` !V R p-q!!ΐ   X  ^h߁   @   ppߡl `(  `(p(!  X@ ޠB  ,(ϸ@d,ϸdddd[d^jڸ+nj&0   1 Њ lpp!  0X@0  `!1!p  ! ! ! !0nj `+!#;nj&`!p X^lH&  ,   nj   !B !"< v,D  !  C  l  . >l  . Pl J .  r $ڋl    Jl   6  @ F P   2 Њ lpp!  0X@0  `!2!p  ! ! ! ! $     $$l    ld! "  @ 0  @  @  " @ @4Q   l     ,! <  @ @Ԟ8   3 Њ lpp!  0X@0  `!3!p  ! ! ! ! lN R   h  X$     nh`(~XǎTǞPǮLǾHD@ppWH<@~Dp p ߀P  8  ppߐ `  `p  X@ ސ N   1 Њ pp!  0X@0  `!1!p  ! ! ! !$Q"%Q$ Q"%Q   ~Dǎ@Ǟ<HHW`@DHLPT΀ ~Xr  X߱  ߡj\p$ q  nQ   8   pp `*  `*p(!  X@ :' !`1@`      Lz <  4   3z      q  "   q   N   E|  4 J,  @   $0?Ƌ  @Q 0   @ 9 @Q @ ,  @ 8XQ  0 @ @ 4n        \~XǎTǞPǮLǾHD@``WX?<@DHL~Pp p X߰ ߠ,TPϚ  8  pp߀p ` `p X@ ހ  T0T )`! 0   )4   1 Њ ppp!  0X@0  `!1!p  ! ! ! !0,`!@  4   2 Њ ppp!  0X@0  `!2!p  ! ! ! !0,`! @  &J4< @0 @    3 Њ ppp!  0X@0  `!3!p  ! ! ! !@Q @ 8  @ 2X@Q :   @ 2jQ  @ @ @  - ~PǎLǞHǮDǾ@<XXWx<@DHLP~Tp p X߰ (XP@  8  ppߐt `  `p  X@ ސ\^w\nw^v    @ vX44Z\4X00^p>\0^hnjX4   1 Њ tpp!  0X@0  `!1!p  ! ! ! !0(`!@ nj X  nwnp `!&nv0` Q   8   ppߑt `-  `-p(!  X@ ސ^hY X\[8ϋ,^nc    2 Њ tpp!  0X@0  `!2!p  ! ! ! !\ .p0 # \c<^pQ^p<%! S>pnn  c  Π @  ,     ‹   զ    8 c  cc 8X!c2( Fp! W^pnhVUc `)!)((!(Fp! W^p\4X4%pnw cga$ nw&(&  (& p8W   3 Њ tpp!  0X@0  `!3!p  ! ! ! !0nv&nwp  nv @2  F    4 Њ tpp!  0X@0  `!4!p  ! ! ! ! nv   t \tnval^nv Dnv *nv @Xnn Nnvb nnnnFp! Wnnba`,!:`((!(Fp! Wnw`f   ~TǎPǞLǮHǾD@<xxWx<@DHLP~Tp p Xߐ (XPύ@  8  ppߠx `  `p  X@ ޠX^sXns^]    @vǸX:4   1 Њ xpp!  0X@0  `!1!p  ! ! ! !0+`!@ X X ^`]0^lY8^^^`ω,Z   n^P^t n^  Q^P ^h Q^P^dd   2 Њ xpp!  0X@0  `!2!p  ! ! ! !nlVanl^hP   ΰ @  (   ^dP        8    8X!4(  Fp! W^tQ^ttn`(((!(Fp! Wns cg$ @n]b4ns`*n^Fp! Wns`f(  $   2nsc>n] @0     3 Њ xpp!  0X@0  `!3!p  ! ! ! !nsc n]  @  ~TǎPǞLǮHǾD@<xxWH   X<ߐ  @~D߀P   8   ppp `(  `(p(   X@ p !\  @x < 4  < DzD@ @ ~Dǎ@Ǟ<HHW@    8~8  0T(**T(++ T(  T(pT(V        $~PǎLǞHǮDǾ@<XXWP8<@D~Hp p ߐP  8  pp߀ ` `p X@ ހ      1Њpp  X@ `1 p (ϩ@L    2Њpp  X@ `2 p    L*  DL*&L*      ~~HǎDǞ@Ǯ<Ǿ8PPWP8<@D~Hp p  ߀P  8  ppߐ `  `p  X@ ސ}    &   1 Њpp  X@ `1p      2 Њ pp!  0X@0  `!2!p  ! ! ! !(Ϩ@L{      3 Њpp  X@ `3p    L*  yCL*yL*y R    yb~HǎDǞ@Ǯ<Ǿ8PPW@  !q#p8! ! <8<x@@W @(#)mas.c 6.1 87/11/24 %cIdentification du MAS%d: $HlzFlX MAS: unit=%2x, chargement des tables impossible MASintr: unit=%2x, IT parasite MAS: unit=%2x, emission interrompue FBFDFFEt MAS: unit=%2x, rate de transfert, erreur de rythme, erreur de parite, erreur de stopMAS: unit=%2x, chute de PDP MAS: unit=%2x, perte de porteuse @@  OP CL RD WR IO PR PA IT ITx ITr ITR OUb OUc INb INc HIO BRK OUC INT INL CON DEC SCA CMD TOx CH1 CH2 ,t.t@ tB tF tH tL tN tT th t ttttttt$t`tft~tttt\tptt t tttt$t,t6t8t>tHt`tbtttttttttttttttt&t2t>t@tj tl tttttt t&t>t@tJtVtbthtptttttttttt!t t t"t6#tpt t'tttttt tttt$t,*t.*t4+t<+t>+tNtPtX+tZ+t+t+t+t+t+t+t+t+t+t+tt*t*t+t"t!t,t,t"-t$-tH-tJ-t,t,t-t-t-t-t!t t .t !t "/t $/t t t t t t t t t t t t t t &t ,t 4t 6t <t t t t t t .t "t 2t L!t V3t `/t b/t l t .t t t t t t &t ,t 4t :t @t H*t J*t P+t X+t Z+t jt lt t+t v+t +t +t +t +t +t +t +t +t +t +t t *t *t +t "tD.t^.t4t5t!ttt,t.t8 t>tVtXtbtntztttttttttttt!t"/t$/ttttt tttttttttt$t,t.t4txtzttt!t/t/tFtHtXtZt` tft~tttttttttttt(t*t8t:t@!tl9tx"t:t"ttt ttttttt tttt&*t(*t.+t6+t8+tHtJtR+tT+tz+t|+t+t+t+t+t+t+t+t+tt*t*t+t+t+t!t0;t6ttt>t@tF tNtfthtrt~ttttttttttt t"t*<t@t/t/t5t tx<t ttttt t,t2t:t@tFtN*tP*tV+t^+t`+tptrtz+t|+t+t+t+t+t+t+t+t+t+t+tt*t*t+t,tBtDt^tjtvt|tttt*t*t+t+t+ttt+t+t+t+t+t+t+t+t+t+t+t+t"t0*t2*t8+tv<t t<ttttt tttttttt t(t.t6t8t>ttttt<t t.t<tt$t&t@tLtXt^tftltrtz*t|*t+t+t+ttt+t+t+t+t+t+t+t+t+t+t+t+t t *t *t +t ."t Vt! t!t".t"2t"b.t"j<t" t" t#.Ct#VCt#t#t#t#t#t#t#t$t$t$t$"t$*t$0t$Bt$Pt$Vt$^t$`t$ft$t$t$t$t$Dt$<t%Et%Et%0t%JEt%^t%tt%vt%t%t%t%t%t%t%t%*t%*t%+t%+t%+t%t%t%+t%+t&+t& +t&(+t&*+t&4+t&6+t&@+t&B+t&L+t&N+t&Tt&`*t&b*t&h+t&l+t&n+t&5t&5t((5t(t(t(t(t(t(t(t(t)t)t)t)t)t)$*t)&*t),+t)4+t)6+t)Ft)Ht)P+t)R+t)x+t)z+t)+t)+t)+t)+t)+t)+t)+t)+t)t)*t)*t)+t)2t*5t*5t+d5t+nt+t+t+t+t+t+t+t+t+t+*t+*t++t++t++t+t+t,+t,+t,.+t,0+t,8+t,:+t,D+t,F+t,P+t,R+t,\+t,^+t,dt,p*t,r*t,x+t,~t,t,t,Dt,Dt-><t-t-t-t-t-t-t-t-t.t. t.*t.0t.8t.:t.@t.t.t.t.t.t.t.t.t.t.t.t.t/t/ t/t/t/t/&*t/(*t/.+t/6+t/8+t/Ht/Jt/R+t/T+t/z+t/|+t/+t/+t/+t/+t/+t/+t/+t/+t/t/*t/*t/+t/+t/+t/5t/+t/+t05t0~t0t0t0t0Dt0t0t0t0t1t1t1t1t1:t1@t1Ht1Jt1Pt1t1t1t1t4@<t4Pt4Pt4Pt4t4t4t4t4t4t4t4t4t5t5 t5t5t5&t5Dt5Jt5Rt5Tt5Zt5t5t5t5t5t5t6*t6@t6Bt6\t6ht6tt6zt6t6t6t6*t6*t6+t6+t6+t6t6t6+t6+t6+t6+t6+t6+t7+t7+t7 +t7+t7+t7+t7 t7,*t7.*t74+t78+t7:+t7bt7xt7zt7t7t7t7t7t7t7t7*t7*t7+t7+t7+t7t7t7+t7+t8"+t8$+t8,+t8.+t88+t8:+t8D+t8F+t8P+t8R+t8Xt8d*t8f*t8l+t8p+t8r+t85t8t9t9t9"t9.t9:t9@t9Ht9Nt9Tt9\*t9^*t9d+t9l+t9n+t9~t9t9+t9+t9+t9+t9+t9+t9+t9+t9+t9+t9+t9+t9t9*t9*t9+t;FPt;HPt;PPt;`t;bt;rt;tt;xt;zt;t;t;t;t;t;t;t;t;t;t;t<t<t+t>+t>2t>ft>~t>t>t>t>t>t>t>t>t>t>t>t?(t?*t?8t?:t?|Rt?~Rt?t?t?t?t?t?t?t?t?t?t?*t?*t?+t@+t@+t@t@t@ +t@"+t@H+t@J+t@R+t@T+t@^+t@`+t@j+t@l+t@v+t@x+t@~t@*t@*t@+t@tB /tB/tBd/tBf/tBStBtBtBtBtCtCtC(tC.tC6tC<tCBtCJ*tCL*tCR+tCZ+tC\+tCltCntCv+tCx+tC+tC+tC+tC+tC+tC+tC+tC+tC+tC+tCtC*tC*tC+tC+tC+tDBtDXtDZtDttDtDtDtDtDtDtD*tD*tD+tD+tD+tDtDtD+tD+tE+tE+tE +tE+tE+tE+tE$+tE&+tE0+tE2+tE8tED*tEF*tEL+tEvtEtEtEtEtEtEtEtEtEtEtEtEtFJ/tFL/tF|PtF~PtFPtF/tF/tGbPtGdPtGlPtG|tG~tGtGtGtGtGtGtGtGtGtGtGtGtH tHtHtHtH"tHftHhtHttHvtHtHtHtHtItItI tI&tI.tI4tI:tIB*tID*tIJ+tIR+tIT+tIdtIftIn+tIp+tI+tI+tI+tI+tI+tI+tI+tI+tI+tI+tItI*tI*tI+tI+tI+tJtJRtJRtJtJtJtJtJtJtJtJtJtJtK*tK*tK+tK+tK+tK"tK$tK,+tK.+tKT+tKV+tK^+tK`+tKj+tKl+tKv+tKx+tK+tK+tKtK*tK*tK+tL/tL/tM/tM/tM/tM/tNtNtNtN2tN>tNJtNPtNXtN^tNdtNl*tNn*tNt+tN|+tN~+tNtNtN+tN+tN+tN+tN+tN+tN+tN+tN+tN+tN+tN+tNtO*tO*tO +tOtOtOtOtOtOtOtOtOtOtOtOtPtP"tP*tP,tP2tPvtPxtPtPtPtPtPtQUtQ>3tQtQtQtQtQtQtQtQtQtQtRtRtRtRtRtRbtRdtRptRrtRxtRtRtStStS,tS.tS2tS4tS>tSZtS\tSftSrtS~tStStStStStStStTtTtTtTtT:tTLtTbtTdtT~tTtTtTtTtTtTtT*tT*tT+tT+tT+tTtTtT+tT+tU +tU+tU+tU+tU"+tU$+tU.+tU0+tU:+tU<+tUBtUP*tUR*tUX+tU\+tU^+tUtUtUtUtUtUtUtUtUtUtU*tU*tV+tV+tV +tVtVtV$+tV&+tVL+tVN+tVV+tVX+tVb+tVd+tVn+tVp+tVz+tV|+tVtV*tV*tV+tV+tV+tW/tW/tWStWStXtXLtXftXtXtXtXtYtYtYtY*tY,tY6tYBtYNtYTtY\tYztYtYtYtYtYtYtYtYtZtZtZ&tZ(tZBtZNtZZtZ`tZhtZntZttZ|*tZ~*tZ+tZ+tZ+tZtZtZ+tZ+tZ+tZ+tZ+tZ+tZ+tZ+tZ+tZ+tZ+t[+t[t[*t[*t[+t[ +t["+t[Tt[bt[xt[zt[t[t[t[t[t[t[t[*t[*t[+t[+t[+t[t[t[+t[+t\"+t\$+t\,+t\.+t\8+t\:+t\D+t\F+t\P+t\R+t\Xt\d*t\f*t\l+t\p+t\r+t\z+t\|+t\St\t\t\t\t\t\t\t\t]t]t]t] t]&t]jt]lt]xt]zt]t]t]t]t]t]t^t^ t^t^t^ *t^"*t^(+t^0+t^2+t^Bt^Dt^L+t^N+t^t+t^v+t^~+t^+t^+t^+t^+t^+t^+t^+t^t^*t^*t^+t^+t^+t_$t_nt_t_t_t_t_t_t_t_t_t_*t_*t_+t_+t_+t_t_t`+t`+t`.+t`0+t`8+t`:+t`D+t`F+t`P+t`R+t`\+t`^+t`dt`p*t`r*t`x+t`StaSta4taltatbtbtbtbtbtbtb&tbBtbDtbNtbZtbftbltbttbtbtbtbtbtbtbtbtbtc(StcDStc`tctctd:td<td@tdBtdLtdhtdjtdttdtdtdtdtdtdtdtdtdtetete te"teJSteftetetf\tf^tfdtf|tf~tftftftftftftftftftftg&tg(tg4tg6tgR tgthth&<th~thththththththththththtitititititiZti\tihtijtitititititititjtjtj tj*tj*tj+tj$+tj&+tj6tj8tj@+tjB+tjh+tjj+tjr+tjt+tj~+tj+tj+tj+tj+tj+tjtj*tj*tj+tkStktk:tkWtkWtkStkStltl2tlLtltltltltltltm tmtmtm$tmBtmHtmPtmRtmXtmtmtmtmtmtntntn tn,tn8tn>tnFtnLtnRtnZ*tn\*tnb+tnj+tnl+tn|tn~tn+tn+tn+tn+tn+tn+tn+tn+tn+tn+tn+tn+tntn*tn*tn+toto"to8to:toTto`toltortoztototo*to*to+to+to+tototo+to+to+to+to+to+to+to+tp+tp+tp+tp+tptp$*tp&*tp,+tp0+tp2+tp:+tp<+tpbStptptptptptptqtqtqtqtq"tq**tq,*tq2+tq:+tq<+tqLtqNtqV+tqX+tq~+tq+tq+tq+tq+tq+tq+tq+tq+tq+tqtq*tq*tq+tr Str$Str@trxtrts ts"ts(ts@tsBtsLtsXtsdtsjtsrtstststststststststttu\Dtuttutututututututututu*tu*tu+tu+tu+tvtvtv +tv+tv4+tv6+tv>+tv@+tvJ+tvL+tvV+tvX+tvb+tvd+tvjtvx*tvz*tv+tvtv.tv2tw"tw"twB<twrStwStwtwtwtx<txztx|txtxtxtxtxtxtxtxtxtxtxtyty ty tytyVtyXtydtyftyl tytytytytytytytytytyty*ty*tz+tz +tz+tztz tz(+tz*+tzP+tzR+tzZ+tz\+tzf+tzh+tzr+tzt+tz~+tz+tztz*tz*tz+tzEtztztztzt{ t{t{t{$t{*t{0t{8*t{:*t{@+t{H+t{J+t{Zt{\t{d+t{f+t{+t{+t{+t{+t{+t{+t{+t{+t{+t{+t{t{*t{*t{+t|t|t|Dt|Zt|vt|t|t|<t}:t}<t}Bt}Zt}\t}ft}rt}~t}t}t}t}t}t}t}t~t~t~t~t~ t~Dt~Zt~\t~vt~t~t~t~t~t~t~*t~*t~+t~+t~+t~t~t~+t~+t+t+t+t+t+t+t&+t(+t2+t4+t:tH*tJ*tP+tjEttttttttttt*t*t+t+t+ttt+t+tD+tF+tN+tP+tZ+t\+tf+th+tr+tt+tzt*t*t+tttt(<ttttttttttttttttRtTt`tbth ttttttttttt*t*t+t +t+tt t(+t*+tP+tR+tZ+t\+tf+th+tr+tt+t~+t+tt*t*t+tttttt ttt t&t.*t0*t6+t>+t@+tPtRtZ+t\+t+t+t+t+t+t+t+t+t+t+tt*t*t+tEtttt.t:tFtLtTtZt`th*tj*tp+tx+tz+ttt+t+t+t+t+t+t+t+t+t+t+t+tt*t*t+t8tTtnt<t t tCtptttxt|tttttttttttttt8t<t@tDtHtLtPt.text(.data(.bssSaveReg _sasinit_confsw_sasadr_masadr_masid_mas_cnt_ctladdr_printf_mas_tt2$ 1_masscan<_mastrISP^_mastrn_mas_tty_mascmd0D_timeout_masopen_spl5_spl0_u_ttinit_masproc_masflagHhhr_maser_masern|_ksct_kbase_sleep_linesw d_mastox-_sptfree_wakeup_masread\_copyin_copyout_ttiocom_splxRXad_cvbaud(_masintr"_spl7G8_masrint;_masxint4tf$T%xH_mascon} 0r_mascoutl;hT_sysinfo_masPDPOtEP_masDPQp_signal_masrev_BAUD_TBLSZ[_writeshort_readbyte_readlong_tblmastrace_writebyte_masscantime_mastbltr_masnametr_mastrace_masparam_sptalloc_mastbler_masptrer_masclose_untimeout_ttyflush_maswrite_masioctl_masoutbloc_masoutcar_masinbloc_masincar_writecom_readshort_masrblocint_masarret_masdecon_masinilgn_masinitab_masbreak_cfreelist_writelong me.o/ 568272112 98 100 100664 10504 ` u!$$1.text% .dataD@.bsshh`HLPTX\ ~`жP^@   ^@ ^@^<zpPq!'' q!'' q .!'q 00YY\\dZ:PVqq !dYP T0 ; ld.d0P#& Q >^^L^Ǯ|~Ǟ^H`ހ,4*<X'9(4  + 44884  .80 # ` ` >Pz.`$ -0 ;z(  +( ̓  +  p!z  (   + 4 2$ P^\`H%^\W, -0 ;~(\^,ȋ!z   ^\%P ^L|XTP`^D`pzj^XQXzqtzxPx֋^XzQz^XPz8 !0q2z'02zz !^Tz'zzzT tzxP2x^TzQzz^T^TPz4 !0q2z'02鎀z  -  @x ȓv>z 2^\zQ^\%P v^DP`  F  &     !z^H$%P   + : 8`Г ^PP ^<%  !^@\^@  (! -~`ǎ\ǞXǮTǾPLH``W ৾<@DH~Lpx , ^YώPt|жx XxY'H2!Cz1@C7z8'&zAΐB!zAz0ϧ0.*B!z@(I1'z!ӆ \  J~LǎHǞDǮ@Ǿ<  W`Hΐ L΀ ~P`p r( )0 8 (  z ( pzzȧ . RD !  !" ! p0 !  *`z(4TTTXjXQs&`5z(\`T$ $ \T\R" " \T\*~PǎLǞH``W8! 88WXH~Lt.x^tqсP  (f PPT.TbQ0 !$`% #6P  .T0 # `2t '0 8(z,Pz  .`$ '0 8z(Fz  $( z !*t ! 2 |< p  H 0 @  d& '0 8 D2~LǎHXXW@~8q ?  X<><~8@x@W@z 0? #0 #.X .<>X<v@@W@~8q ?  X<.X ?><~8@x@W@ !?  X<X .? .>X<@@WH~<q ?  `@>B^`D  %0 #1 1 #.`@.BFD@~<HxHW@XX ?  X<\>X<>X# !" 1   1^>X>X<8@@W@~<q X~<@@W8ȩPP PT88W@ 88 8! ! <8<x@@W @(#)me.c 6.1 87/11/24 meload: %s inexistant Chargement de %s sur SAS%d meload: %s ne contient pas du code 68000 MELOAD: textsize=%8x, datasize=%8x textstart=%8x, datastart=%8x, totalsize=%8x dcb0adr=%8x meload: typepdev=%2x%2x, etat=%4x meload: arret du co-processeur impossible meload: initialisation impossible meload: adresse de chargement inaccessible adrIM=%8x meload: typepdev=%2x%2x, textstart=%8x, adrue=%8x meload: erreur de lecture meload: erreur de lecture meload: mauvaise fin de chargement meload: mauvais lancement MEWAIT: type=%2x, pdev=%2x, finordre=%2x meload:(fin sur timeout) typepdev=%4x meload:(pas d'IT appel 2) typepdev=%4x, statbase=%8x meload: dcb0adr<>: old=%8x, new=%8x SASINTR: type=%2x, pdev=%2x, ioir=%8x, cr=%4x sasintr: type=%2x, pdev=%2x, apres IT etat=%4x sasintr: type=%2x, pdev=%2x, IT fantome ... /etc/emc/ "< @ B               @ B H T jn p v    $@n*TZjnpxz0:JNPXZh j ptvz|       &,P R         FJLPR "&(<@BFH`dfnpvx             6 < N ` d f j l  ! " # # #   # # % # # 0 > D J& V& ` b    # "# .# 0# 6# <) t+ v+ ~+ +          " , . 8 : F b d r x | ~      # # # # # )  <#>#J#T#V#b#l#n#z######)!!, -.-~.--..-N..text%.data.bsshSaveReg _meload_medma_confsw_nomfic_nomdirP_u_gethdrX_debug_metrace`_ctladdr_dcb0adr_dcb0 _mewait #L/8_readi_iput_confcnt_schar_namei_access: _timeout_metoid_spl5_meflag_merevd_sleep_spl0EO _wakeup_sasintr TYd_d_read_d_writeoy _medmaptr_readlong_readshort_writeshort_writelong_metimeout_readstat_writecom_conf_devs_untimeout_readbyte_writebytemem.o/ 568272124 98 100 100664 2964 ` u!$ .textLc .data ,@.bssH<@~Dx|0#sq q !@ xx !# 2 p| ql  t(N Y:Ȏ|Q q!? !p"0 q0 0sp1`6@ q@? sps0 6pY.| t( Y B||ttxxYxW~Dǎ@Ǟ<HHWH<@~Dx|0#sq q !@ xx !# 6 p| q t0(h YT|Q q!? !p"0 q0 0sp1`6@ q@? sps0 6p!" YHY2 t|0 ( Y||ttxxYxG~Dǎ@Ǟ<HHWP@@~DrB H(YhC4HLYH(ċ0C H.LY Y~Dǎ@PPW @(#)mem.c 6.1 87/11/24 $L&L0 L:L<L@ LB Ln Lp LLL L L LLL LL LLLLLLLXL`LbLnLpLx LLLLLLLLLLLLLLL LL L"L$L( L* LV LX LhLjL~ LLL L LLL LLLLLLL@LVL`LbLfLhLzLLLLLLLLLLLLLLLL L:LBLP LvL|LL.textc.data .bssSaveReg _mmread_u_min_mmpte_mmvad_copyout_flush_ksct_kbase_mmwrite_copyin_mmioctl_d_read_d_writemt.o/ 568272158 98 100 100664 10941 ` u!%&0.text< .data\%d@.bssP<@D s DH~LZ sp(p  ,f 4!n$ $  B@ !* zP L. ! QZ t J !p &    0 (,! t (!Y B@ (P 0 Ws Y~LǎHǞDǮ@Ǿ<PPWH<@sDsp(~Dp ? Y ((H"YY vH (!İY$(,!Y( (!xY ? ~Dǎ@Ǟ<HHW@ 0 # @@WP@DHz~Lz0):z('zsp <qx  @ XH,(    zs D߁ x q x ړ 8 @   ,,~LǎHǞDǮ@PPW`DHLPTX~\pÐz qp q D߰ (߀(7(H |  t (0!Q D  (! V @   ph (!\ 8!D 0 q!`!(  0 @  0 qp.X @    !p 0 q (QX Q ((,( 2((aR@&5$ ,((," 0ċ4( !!!' q)01 21  b  { q {  :0~\ǎXǞTǮPǾLHD``WhHLPTX\~`  z zz+s&p (q'8((|zsÓn* .PL$ (  * < !!! (x!z (!: !(  (  ( (8 ($!pW (Hڋ (!:v (! z ( j (F (Ѐ!  8t ( $ 8H!   ." $      ?(' J    fWxx  p((R@!($(% ((( ^,z hҋ8@  "8($7G #4 8,pױP "7' t.(+B  J `" ' 7 # `# ' 7$" #8Z8 `!  `d|d  ` P$   . `'.P$    <(  ~`ǎ\ǞXǮTǾPLHhhWhLPTX~\p. ! `lx Dߡׁ  lp!P`0 !. P $2`@ 1$( (q,'>GN(ĢN,Q j ! .`0 #^ ! .`@ (8   `   @ 0  `$(! v (! npW 8   `# d\$.d (   ddd d @ ( d6  (d  $ W @ / d0  &8'H$7 Ǹ0;$~t  $  ?  _ 88   .  4R!012%1,!0121(`4 8@t  (W @ / 0` @     (` ($$  0 (l  x.0@ #    & < z (DQ  _    8 (,|  Qj$  ?    .  (H (x  r` `! )p""P>` #H `# ' 7$" #$ `4 8 (0  $   D `" ' 7 #~`  $/ (``z$D   <(    ~\ǎXǞTǮPǾLhhW@x ((Y`17!s&#p##0(#0|"s9212 . . $. >$4@@W@x ((Y`17!s&#p##0(#0|"s9212 h. . $. >$@@W@ !n0!! ֧.2 . >@@WXDHLP~Tq0'>(: sD sp(߀  > mY6m,Bm mԋ4mmpW p(Hp($  p(  p(bp(V  ^* (8  2p(,  *ꪆY~TǎPǞLǮHǾDXXW @(#)mt.c 6.1 87/11/24 not ready statusoffline statuswrite protected%s on mt %d mtcommand(%x, %x, %x) mtstrategy:blkno %d,nxrec %d,b_blkno %d density switch not on BOTdensity not availablemt %d : error blkno(%d) > nxrec(%d) 2 d d d d d d d 2 d d d  d d d d d d d mtstart(blkno %d,nxrec %d,b_blkno %d) mtstart:b_active = %x end of tapemtstart:cmd(%x) mode(%x) addr(%x) bcnt(%x) tHHLspurious interruptmtintr:cmd(%x) mode(%x) ioir(%x) blkno(%d) nxrec(%d) unknown command4(mtioctl(%x, %x, %x ,%x) (8((8(((8(T<V<Z<\< < <4<X << <<8<b<d<<<<<<$<D<H<J<x<<<<<T<`<j<<<< <<<<<2<H<^<<<<<<<<B<|<<&<f<<<<<< <.<><H <J <n!<p!<x!<!<!<!<<< b< d< j< < < < < < < "< < < !< !< !< < < < .< l#< | < ~ < < < < < %< %< 6%< V&< %<<<<&<<<<<<<<<<><D<f<p<%<%<&<n<&<(<)< < <!<!<(!<:!<<!<D!<h<j<B)<<%<%<%<%<<<<<Z<\<n<<<<<+<<<< <"<&<(<b+<<-<< <<@<B<F<H<r<<<<<<<<<<<<<<<<<< <<<<< <<<<<<<< <$<(<.text.data.bssSaveReg _mtopen_mtcmd_ctladdr4_mtprint_mtwaitx_sleep_u_vmtbuf_mtclose_printf_mtdebug_mtbuf_spl6_spl0_mttab_mtstart _iowait_wakeup_k_tab_C_tabp_c_tab_iodone_clrbuf_lbolt_mtstat_splx_pcopyin_d_unitP_d_write_d_read_mtintrX_prcom_mtreadP_physio_mtwrite_timeout_mtioctl_mt_cnt%_mtcommand_mtstrategy_pcopyout partab.o/ 568272163 98 100 100664 460 ` u!%#,.text .data@.bss @(#)partab.c 6.1 87/11/24 .text.data.bssSaveReg _partab prof.o/ 568272171 98 100 100664 2096 ` u!%+.textDI .data $@.bss@Yb xp ! xp !@@W@x (Y@xP(YYY ! xQq $ (YpY@@W^  D$l:l* YW0pH @pBD(C@  B@pW @(#)prof.c 6.1 87/11/24 DD D( D* D. D0 D> DH DJ DR DV DX D\ D^ Dn DxDzD D D D D D D DDD D D DD DD D( D* D4 D: D< DD DH DJ Dh Dr Dt Dz D| D D DDDDD D D D DDDD D6 D8 D>D@DHDP DR D` Db DDDD.textI.data .bssSaveReg _prfread_prfstat_u_prfmax_min_prfsym _iomove_prfctr _prfintr,_prfwrite_prfioctlpty.o/ 568272195 98 100 100664 6567 ` u!%CT1.text d .data H @.bss @ ~<pYXp@2<  <;>: 84 L@  @@" @V@  FpW~<@@W8  X~4qFpW@~488WP@D XH~Lp ߀ χ,,ؓhJǨJx :  *!xY   F&4 FpWG ~LǎHǞDǮ@PPW8X44 Y!Fp%" W88W8 00X 0S@ 405@ 4080dv 88W@~<p$p W@! @& @ @@ !  (DQ %! FpW  vp@ @^@  @F@ 6@! @~ . z'4dW~<@@W80!#0X#,088W@8~<pYnXp4ȊYD4@ @ @ ~<ǎ8@@W@X~d@d` d d &(d d d d )d *d d d " d Zd \d f d h d d d d d "d d  d  d d d (-d .d /d 0d ,/d 40d H/d R0d bd d d d d d d d d d.text .data H .bss SaveReg _ptsopen_v_u_pt_tty_ttinit _sleep_linesw_ptsread4$_spl7_min_getcbp_iomove_splx_getc_wakeup._ptsproc8`_ttrstrt_timeout_ptcopenB_signalL_ptcread_passc_ttlowatV$`_cpass_putcbp_putck u _ttiocom_spl5_putcf_getcb_no_t_proc_ptsclose_ptcwakeup_pt_ioctl_ptswrite_tptsproc_ptcclose_ttyflush_ptcwrite_tptcwrite_ptcioctl_ptsioctl rawnet.o/ 568272207 98 100 100664 2762 ` u!%O".textXDF .dataXX`@.bssY WW@~< xP((Y|pVNpxPzw(uxPxt'Pz(z'z~<@@WX<@~D xP((YXpxF6 ր6s z ؎ȋhtJ.t!70x>#xx.HH`~Dǎ@Ǟ<XXW@@~<q@ rpY&~<@@W8ȶ88WW @(#)rawnet.c 6.1 87/11/24 rnetwrite: out of mbufs rnetwrite: out of bigbufs DD&D8DZD\DzD DD D DDDDDDDDDDDDDD&D:DzD|DDDDDDDDDDDDDDDD DDD"D* D4D:DLDNDZD^D`DpDrD~DDDDDDDDDD&D8DRD.textXF.dataX`.bssSaveReg _u4H_spl6_sleep_splx_copyout_m_freem#`_m_get_printf_spl7_mclfree._mbutl9_mbstat _copyinDP[i_wakeupsP~_mbfree_rnetopen_rnetclose_rnetread_rnetwrite_m_clalloc_mclrefcnt_wbetoutput_rnetioctl_localAddress_rawinput_rawbuffer_nmbclusters_rawaitingsmd.o/ 568272238 98 100 100664 9754 ` u!%n!T5.textP .dataPP@.bssX?@DsHLP(~T: sqprp D߀.Y ` ߠD Ðz  (p Yz 0z     &nY$Q!  `  pJÇpq D ΋vp  p 0 &|q ҋz pT, >0~TǎPǞLǮHǾD@XXWWP<@Dzzsz)s&Hp <~Lq @   !17 ;p27("'$a&q,0? #6p"q<@ 4@s>p243@T4q@? sps0 5p,f& @   ,,~LǎHǞDǮ@Ǿ<PPWH8<@~DpWzszs #p"!0zpT(@ D 0 ,, ր4äΐD߈ΐ)ߒ#CsB!$*'0C#3$!$p( ) q!) 44 x xx0h  0(00000C0# 0ѧr 7 xXPp  :,    D& ~Dǎ@Ǟ<Ǯ8HHW~p0G`  J #  a (ހ  ÓL!ހ NÁÓւpP(T~ǎǞWh@DH0LDPT~X ǰ  zs  #BpFdp 0߀ q xx0 px80Sx?x1 1p4xx@ q@ ACGr(< "$(; #F(^d,p! \p\^` q3 0q ! 0{ ` rqx@ A@ !- !q(-!0a#- a P^` Ϙ Q^\(zp"T!(2sp!bP/ZaP/[paP/[ã8;bP/S%*0`#((! @^`pQ^`r ((2Xrq %p((pqq@:(0^\P^`Q^`L^\PP^\x@  Ay(9^`q^d,p! n` ^d,.dp(0 |^V~XǎTǞPǮLǾHD@hhWH<@~Dppp. ȓq~Dǎ@Ǟ<HHWh@DHLPT~X`^b`a D߱{ ǧ VzspRQ  ^d$(.$ + zsp! p\ǎ\ p\,\(p(0  p\b@P\(p(0 p\,T\(p(0  s . 8$ԋd s  zp@$ "pW  Zp- !+ zsp!d <tlp\h\  p\|\ "\}-!"q$=1ppp\">\-!p1 # q a  a  ,)p(0 ^   0440  0 4R!d012%1,!d012 1  H, { p{ `0~XǎTǞPǮLǾHD@hhWH~DpssppT<2h~ $. >$~DHHWH~DpssppT0~ $. >$~~DHHW@ 0 #J@@WH<@  V~DYVYܓs!#sp q (   q p Y\'LY$& Yq  ~Dǎ@Ǟ<HHW`<@DHLP~TPԧ^XX ύ D߱ \tZRDT* @ *ד qDn\(^XDQ^X(3~TǎPǞLǮHǾD@<``W @(#)smd.c 6.1 87/11/24 no vtoc areabad block list too longinvalid partitionSMD d_write errorSMD disc errorSMD d_read errorSMD d_read errorSMD d_read errorSMD d_read errorSMD d_read errorSMD d_read errorSMD d_write error%s on disk %d (<L\l| Off Line Timeout Equipment Fault Write lock error Tranfer error Data overrun Sync. error header error CRC error in header Data check Seek failure Unknown drive type Unknown error Illegal param. in DCB orderPRVXf v         R  0^"> @ v x | ~    b  PRh  ! t#  $   % %  & #  $$   % %  &       <( H N$ j( v |$ (  $ (  $.)\($((4:$(#4:$@HL%N%X`&  ,-8 : R,-/  *1P R ^2  2  FHx z   44 .textP.dataP.bssSaveReg _smdopen_smdctab_ctladdr_u_smditab_smdutab(_sptfree2_smdbuf_spl6_sleep_spl0_ksct_kbase<8_iowait_wakeup_iodone_lbolt_smdstatI_splx_smdbb_bcopyS _d_write_panic^j_smdintr T_d_read_prcomy_smdread_physck_physio_printf_suser_copyin_smdsync _ioInProgress_sptalloc_smdcommand_smdprint_smdclose_smdstrategy_smdstart_smd_write_ftHeadwall_headwallLight_smd_strer_smdwrite_smdioctl_panicstrsmlog.o/ 568272248 98 100 100664 2362 ` u!%x.text K .data  X@.bssxx xY. Yx xWx xWH@~D>hp1 1q !#  xG(' pxh t'Yhh hxxttxhlx<@x xh h* xH x~Dǎ@HHW@8~BDNR T bntz  $ & 8 @JXj v     .text K.data X.bssxSaveReg _smopen_u_smclose\_smreadx_sm_rpth_copyout_bzero_printf_sleep_smwrite_sm_wptp_wakeup_min_sys_messstct.o/ 568272284 98 100 100664 11714 ` u!%),3.text8 .data880(T@.bsshhP<@D sH~L D p,p v(\ 4!n($($  B@   !Px Pz !TQZ|  !p: !D &   0 ((!  (!Y B@p PW  0 s   vnp 6 !І "p PW Y~LǎHǞDǮ@Ǿ<PPWH<@s Dp,~Dp Y 4 &(H"YY|P  (!ʰY(((!Y* (!xY ? ~Dǎ@Ǟ<HHW@ 0 #XR@@WXDHLPz~TȎzh+:zs('p <q܋  @ ,(  z 0 s8'(!(ޠB@'((!( ޠB@   D߁*  x q x ~ 8 @   ,,~TǎPǞLǮHǾDXXWXDHLP~Tpàz q Dߑp ,߀Ȏ(7(h :  X @   nP pQ(,(0((aR@Ȇ&5$ ,l((,"H 084( !!!7 ! q9#!   y q y  2~TǎPǞLǮHǾDXXWpHLPTX\~`  ^z zzsp ,qȎ'8(ؓ) ,Ȇ$   P <^hQe^l !!! (!| ((!6@    (  (8!  (H  (x (!: (!̐  (  (t 8! & 8p p   $ 8D! Q^h &" $ ڋ('    fWxx  p ((R@!( (%(((^,z ڋ 8@  "8($7 G#4 8,pס Ȇ"7 '.(*  z' '( bȆ' Dt `" ' X `# '7$" #48r8Ȇd `!  `dd   p$  ^hP JȆxT `'<F$   nl( ~`ǎ\ǞXǮTǾPLHppWh?HLPTX~\p. ! `Ȇ:L @ ` & Dߡ.` !p 12p ,q <Ȏ$'7GN( $ ab   fȆ`  ! .`0 #  8   `$ @ 8` ( ( `$(! V (! NpW 8   `# d$.d (   ddd d @ (d6  (d  $ d0  &8' H$7ǘ09$,   ,   $ 8h   .   84#121 :,#121$ (` 8@x  $F0b $   (`\ ( $  0 (\  h.0@ #  T (DQ  _ h  T ((0  Q (H (x`Ȇ&p.` '04 `! )p"">` #  `# '7$" # `ԋN 8    $   X  Ȇ $Z `" ' >`   (``zb&     (    ~\ǎXǞTǮPǾLHhhW@x p(Y^17!s&#p##0,#0|"s9212 |. . $. >$@@W@x p(Y^17!s&#p##0,#0|"s9212 . . $. >$D@@W@ !0!! ֧.2 . @@WH<~@q  ,DXW D (`# DfD8 /#R~@ǎ<HHWXDHLP~TrP(>(7 s Dp,ߠ  mYm,Bm0 mDmmp8W @  ΀(H ΀(   ΀(   ހ(ހ(    0 s.q (!l qp' (Ft   nq΀(( P 0 s2( ((" !qp. '҆Y  ~TǎPǞLǮHǾDXXW @(#)stct.c 6.1 87/11/24 %s on mt %d mtcommand(%x, %x, %x) stctstrategy:blkno %d,nxrec %d,b_blkno %d mt %d : error blkno(%d) > nxrec(%d) mtstart(blkno %d,nxrec %d,b_blkno %d) mtstart:b_active = %x mtstart:cmd(%x) mode(%x) addr(%x) bcnt(%x) d_write: bcnt(%x), addr(%x) d_write: mode(%x) d_write:cmd(%x) ttxioir=%x <%x> cmd(%x) mode(%x) blkno(%d) nxrec(%d) d_write: mode(%x) d_write: mode(%x), bcnt(%x), control(%x) d_write: addr(%x) , stctioctl(%x, %x, %x ,%x) ( 8DX(8(not ready statusoffline statuswrite protecteddensity switch not on BOTdensity not availableend of tapespurious interruptunknown commandPRVX  BhHlrt2.X &FV  6$:ft|  !!"V    & , L" ^ ` v! x! ! v | ~     #     * @ L v   % %    % *&    %& @BNPVpz(%0&&*\+h j r!t!  %%.%%8,l*.JLR`|~. 0LN!!&1,.24Z8<@DHx|.text8.data80.bsshSaveReg _stctcmd_ctladdr_mt_errx_mtwait_sleep_u_mt_bszp$_S_tab.\_printf9_stctbuf_spl6_spl0_stcttab_mtstart_iowait_wakeupD|_iodone_clrbuf_lboltR_splx_pcopyin_d_unit_d_write_d_read\@f_mtberr8p_prcom_logberrz_physio@_timeout_fmtberr_stctopen_mtcommand_stctprint_vstctbuf_stctclose_stctdebug_stctstrategy_stctstat_stctintr_logstray_pcopyout_stctread_stctwrite_stctioctlsxt.o/ 568272320 98 100 100664 10526 ` u!%%..textD .datad#\#@.bss)?X s ~ppqYTp0Y s p"Y(Y` ,   YZ X4N X4 Xn\,' \%# <%! 0Qa1H0Rb100Td1:Xh1p. >$. X'!X X'G!s1 1(#4   '   !'  X'!rPd % zz"*̎ DzD D@$ @`~ǎǞǮǾWP?8<@sDH ~Lp׀ s p& X(!r@ @FpWD@ @` ! !   ! ! dn(!Fxϸl48{D4 | *X(( s  p ! ~LǎHǞDǮ@Ǿ<8PPWx?DHLPT~Xq s p׀bpY TT pWbbpWt Lt Dp8WY pzqpY DPzq"z  <Pz ? z  s&zq0Xp" 0   Y Y~Yl  YNУ  xF(q!(  8s! !~(* s p sF OPd % zz"*̎ DzD D@$ @ HY0` YtY Z(XPx X(!"8'8!:':!<'PP'>('4W  X(!ڋnYX` Y: , X(!rj) XY` Y X<  <Y` Y^ X(!"<0 #!< X(!$Y  v vw"TY`   `     X(!);܋p X(!); x \(Y 8:>\ <\< @ <^R_S.`! '<0 #'<!" ':0 #': !0 # ':0 #':!$ *'80 #'8':2 #':'>4 #'>!( '>8 #'>!0 # '>0 #'>!0 # V'80 #'8':4 #':!0 # ':0 #':!0 # ':0 #':F':0 #':!0 # ':0 #':!0 # ':0 #':!0 # 2!'U&'T'80 #'8'<00 #'<D$'T 'U'80 & #'8':1 #':'<0 #'<'>3 #'>'80 #'8!0@ # 4!0 # '80 #'8'<0 #'<!0@ # ':0 #': : :'4W X(!);  d Y6~lFdl ~YXz zq AT);Wd ~l4Y X(!);(!4Wv X(!);T X(!); (Xz zq A);W~XǎTǞPǮLǾHDxxWH8<@ǎp~DpF"4O@ @ @~Dǎ@Ǟ<Ǯ8HHWP<@DHs ~LppqYp Y`  Y X'!D X'!$` !   (`     Fp W~LǎHǞDǮ@Ǿ<PPWP<@DHs  ~LppqYp Y'`  Y X'! X'!$` !   <  (`     Fp  W~LǎHǞDǮ@Ǿ<PPW8 0AAB 4@ @ $!0X#!Fp%" W88W8 pXWOp1 X!!14WOp!14WOp1#0X#1`2 #1 2!1 14WzOp!14WXOp1 X!!14W"Op !88W@ 0~<JOpp 1 q #X!V ~<@@WH48<@~DOpq  v!0 2q1 #0 X'!b$Y$7Qa1"(\'  !P$(0 H$(i$X$7Qa1FpWTi$X$7Qa1$((    $(0 H$(i$X$7Qa1 ! !     xP87' p! #' ' !' 7 ' # 7!(# '(' 0 2q1 #0 X'!FpW>i$X$7Qa1$(  $(0 H$(i$X$7Qa1       (~Dǎ@Ǟ<Ǯ8Ǿ4HHW@8~<Op 0X#px j'Fp%"W\g,X,7Qa1Fp!Wh,W,7Qa1,0~<ǎ8@@WW@8~< ~Tp>! 0  lq '~<ǎ8@@W@ q T<@@W @(#)sxt.c 6.1 87/11/24    ((LLX0  | 0LLL 2p2282222,sxt cannot allocate link buffers <D>DN Df DD D D D D DTDX DZ Dn Dp D DDDDDDDFDD D,D:DDD DDDD& D0 D2 D@DBDR D\ D^ DxD D DDDDDDDDD D D* DH DV DZ D\ DDD D D D D2 DNDf D DD DDDD(D> D\ DvDDD D D  D 8 D rD D D D &D JD h D v D 6D R D ` D D D D D D DDBDfDDD!DfDhDv D D DDD$D.D0DDD D D DD D^DhDjDDDDD,D>D@DvDxDDDDDDD2D4DDDvDxD DDDDl&Dn&D'DDDD &D"&D6'DDDDZDl&Dn&D'DD D"DRDTDDD(D(D)D(D(D(D(D )D")D<(D>(DN DV)Dd+Df+D+D+D,D(DD-DDDDDD DDDD D$D(D,D0D4D8D<D@DDDHDLDPDXD\D`DdDhDlDpDtDxD|DDDD.text.data#.bssSaveReg _sxtopen_u\'_bzero1_spl5_spl0;_linesw_sxtfree_splxEh_cdevswO_sxtin_linecnt]_bcopy_wakeup_sleep_copyout_ttiocom_copyin_ttinit_sxtread8g`q_sxtout_cfree_putcf_sxtbuf_sxtbusy _sxtinit_sxt_cnt|_printf_linkTable_sxtnullproc_sxtvtproc_ttyflush_sxtlinit_sxtclose_sxtioctl_HeadwallDiag_sxtalloc_sxtwrite_sxtrwrite_sptallocsys.o/ 568272330 98 100 100664 1140 ` u!%\.text< .data @.bss@~<q2&Pz zq !W~<@@W8ȓ$Pz zq W88W8ȓ$Pz zq  W88WPDH~LsN*Pz zq A(7W~LǎHǞDPPW̎Y2d zzYW @(#)sys.c 6.1 87/11/24 <" <8 <: <j <l < < < < < < < < < < <H <J <V <` <b <j <l < <.text.data .bssSaveReg _syopen_sycheckH_u_cdevsw_syreadX_sywrite_syioctltektty.o/ 568272357 98 100 100664 8410 ` u!%(.text .dataxt@.bss``@8~<YXp@$Y$Yt $  $! JB<  <;>: 8@  @4FpW~<ǎ8@@W@8 X~ @ R T dt v       F H L N `jl| ~       D F        & ( > F H T \d x    & 4 6 DFn z|  T V   B D L N z         | ~     "      .  0  <  R" r  t         " # #     L  N  Z          $ $ % % \ n  p  |        & F  R  T  b# d# r# t# # # $ $ % % # #       (  *  6  B  D  P  Z     &> @ N ` b           B L`n   ('Zf"  $(,08<@DHLPTX\.text.datax.bss`SaveReg _u_tek_tty_spl6_splx_ttinit_linesw',_ttywait4@M(_copyin_copyout_d_write_ttiocomZ_ttrstrt_timeoutg_ttlowat_wakeupv<L_d_read_tekbuf_ksct_kbase_ctladdr_tekttyopen_tek_state_tekttyproc_tekttyclose_tekttyread_tekttywrite_tekttyioctl_tekttystart_tekttyifstart_tekttyxint_tekttyrint_tekttyintr_tekttyinittt1.o/ 568272385 98 100 100664 8381 ` u!&/.text0 .data00`@.bssH~Dpd zz"*̎ DzD DD 0 @  @~DHHWH~Dp@&@$ @D 0D~DHHWP@DH~LϚ  x @( p x7! t( YttxxN Z L t2! t6 YxxxY@ !*4 W~LǎHǞDǮ@PPWH<@~Dp@ hD<p'!Rz'4W"@ @ @N<p'!ӓ2x ( x(t)YЋttxx)^Ht!tY( x! x xF'4W6~Dǎ@Ǟ<HHW`<@DHLP~Tp"Dzԋ`0W2W0 DÇ8@   Ǘ,(   ^ ^@ P^P^\ P^P^X|^\P ^XPJ AZ (Ǘ,d 0H ,,02 N  @'4W "P?<p'P!  (! 7P!.Dz 7Q!.Dzv `l7W!* :'4W<(" $(0@ # ( 'G!'G"7U! 7V#'G!'G'@R0 # \ % #'@7R!>(0 # 2 X   FR7S!.(0 # "((   7T!( 'G!'G" \ ($ '@0 #'@((  '4WH@ @'T(G"U@   PG(@Q   @t~TǎPǞLǮHǾD@<``W`@DHLPT~X|@ >  è:@ &|ċP^\@ $||P^\`|Fq @ >$>Zސ() yAZq ~azq qϘJp ? p`W    r    0 D@ 2      uD xp @ n  p\upJ r:0 \qpB @ p ڋ:  @ H  qp uy   p pr J @ >  Hs 8&$ ^\P ~XǎTǞPǮLǾHD@``WP@DH~Lp@ $@ :@χ$>t$$ 0HT@! @~>   . >@  :v 0H :X%%ޠ"l ǘx D4 l $'@0 # >Bޠ)(( @Q @ 0<p'! @| ~LǎHǞDǮ@PPW@@ @> U Tx@P  0G %0 #!@܋>!@0 #!@ r.U . @@W@~<pA D  " D n Dj,T" ,02'4W '4W$$ 0H$,$ 0Hx,>   nH aPQ  '!gW %' l%# D%! ;Qa1h&! 5Rb1H&# 2Td1(&' 0Xh1g P^;Qa1h&! 5Rb1H&# 2Td1(&' 0Xh1G~<@@W @(#)tt1.c 6.1 87/11/24 Flush(%x) ( T({)}!|^~'`\\,.F $ 46HZ\hv~xz,2<>FJLVlnz$.pr ,!.!6!P"R"j#n!p!x!~$Xn& &! (! 0! >  `! b! j! x#  ! ! !   h' j'  ! ! !  ! ! !  &( f! h! p! |       & " "  * * +""$"8B  ":f,h,&&&d+.6-@L"N"bt"v"..`dhlptx|.text0.data0`.bssSaveReg _ttopen_u_ttioctl|_ttclose_ttread_canon_getcb_min_copyout_putcf_getc_subyte_ttwriteD_tthiwat_spl5_sleep_spl0_getcf_copyin_ttxput_fubyte_ttin_signal_putc_sysinfo_cfree_putcb_printf_tttimeo_wakeup_partab_max_ttout <_ttrstrt_timeout_ttlowat_ttywait_ttnulq_ttyflush_cfreelist tty.o/ 568272408 98 100 100664 5558 ` u!&%.text I .data X |@ @.bssHHpDHL~Ppt 8zTTp WtTl*T ^ TYF^f%B (%(YNFpAD :WÇ>^8`:b<dg>P(F.f$'FFpAD :W&'>FpAD(:W8^:`<b>dFPfg(6^ & YVŽ'4W< RNp 0W'4W@'4W0'4W '4WY 2  Yd T(2Yb8:>T <T<@ <VRWSX< <: :  : :*8 8: :> >> > > > V8 8: : : : : :F: : : : : : 2UT8 8<0 <HTUV8 & 8: :< <> >8 8@ 4 8 8< <@ : : : :<TTURVSW<  > > > >   < @ $8  W:6    :  .:   :   :  :   :  @ :  T(X Y< DFpA):WY~PǎLǞHǮDppW@ !F!8!: !< !>P(f@@W@~<p> @ :@@ ! ғ~<@@W@8~<px  '4W@Q @  @x@Q  :@R > 4 & G'4W@Q   @~<ǎ8@@WH8<@~Dp G@  zX>:T2U H@  @  @ @G{>8g W'' n%# F%! ;Qa1h&! 5Rb1H&# 2Td1(&' 0Xh1gP\;Qa1h&! 5Rb1H&# 2Td1(&' 0Xh1G^ސV\ D'R('Sސ'T j'R'S 'T H>2 Ȇш \B\'U 'V"(GGސ `~Dǎ@Ǟ<Ǯ8HHW8 4W88W @(#)tty.c 6.1 87/11/24  p 0@P((<<PPPPP<<<<<<xx|`{}~ABCDEFGHIJKLMNOPQRSTUVWXYZX~     @Z \   f $ & >HR  8 t        L V Z \       H J Z p r z  |     !      $ ( 0 4 8 <.text I.data X .bssHSaveReg _ttiocom_u_ttywait$_copyin_linecnt_linesw_bcopy_copyout_ttinith_ttcchar _spl5_sleep_spl0_delay_putcf_getcb_wakeup_splx_canon X_tttimeo_ttnulq _canonb_maptab _getc_sysinfo_putc_ttrstrt _ttlowat @_tthiwat _ttyflushtv.o/ 568272420 98 100 100664 1300 ` u!&$.textH .dataHH(@.bssppPDH~Lp D! " D V Dp8> xސ` >> ސh P 8'4W(~LǎHǞDPPWH~Dpd zz"*̎ DzD DD 0@  @~DHHWH~Dp@&@$ @D 0ZD~DHHW8 > RbJR02256 0 0@(C@*0 0@(60,,88W @(#)tv.c 6.1 87/11/24 014B DF&p~       ":6.textH .dataH(.bsspSaveReg _tvioctl_ttioctl_tv_blk`_ttxput_tv_fdxh_spl5_spl0_tvopen_u_tvclose|_tvin_ttinwbal.o/ 568272480 98 100 100664 17919 ` u!&`?$C.text,0l .data,,,=t$@.bss//8 z~4qs~488Wh@DHLPT~XP^dP/^`  hnd`d @d &P   %s ! ,(  ,@  ,X  ,p'^` pΐ   X  0^\n\,@0 #} ,@ 4\0  ,B00  *(00  200./h )0 p16 1#00  800  00   ),NpD       @   0X +({n`^`Q^`^dT^d ~XǎTǞPǮLǾHD@hhWHP(n`4 rY<<  @  @  @@ @2 @"  @@  FpW ~Dǎ@Ǟ<HHW@8z~<~΀   XqFpW<  @ ~<ǎ8@@W8z   X!Fp%"W88W8z   X!Fp%" W88W`DHLPzTXz~\F TD2 0, YTC4  0,܆ Y  Xq8ӱ< (: P'8 ! 0 !$'< ! 0 !  X~\ǎXǞTǮPǾLHD``Wp@DHL   X P 0T~Xp<8p,W @  @T**(*(bL  -B      :-l   ! @ @ qpQ p e ^d@ @Q    @@ z$@ qpQ pe \^dnd p `\ \` .\`P^j>` -8xǎ`nd  pQ0 V^l Fp W  L@   ^l((N!p, ^l((' "   pZg&^jV^jnj @ nj`0nd p (0 # @  @b\@  @ qpQ p e ^d@( @b L   -TF    $    >-pp "    ċ!  @ @( @hb L   |-*      v   "-ЋT $    ! t@! @  N 0 = p! ! ! X-ē (    !  R  . ~XǎTǞPǮLǾHD@ppWP<~@p: pDpHD DH HDH DLDQ    DpL  fǎL p $~@ǎ<PPWP<@~Dp/Ў pz  Г pπHLH HL HLL @   pLQ    L pT~Dǎ@Ǟ<PPWH<~@ pD~D ppDD p  ~@ǎ<HHWH<@~Dސ/Ћ\y@D t  @ @(Xp! (! ~Dǎ@Ǟ<HHW`@DHLPT΀ Xߐ 0~Xp <  W^_W^^W^] 8  <0  (FT @04(&@  <  D <@   <   <   <0  (FT @04(&@  ` * 8      z" |Y8    J  "  j  Lr8  "  "H  *8    "' !6 (0 p1 1# 'n_&6 (0 p1 1#\ B'n^&6 (0 p1 1# 'n]&6 (0 p1 1# < ! p/0K.0 8  p! ! !| b !    !  " (- ~XǎTǞPǮLǾHD@``W@~<p7 2H'#"0@ # 4 0#  0#7 2\    !  .~<@@W8 B0 0CH243@@ 4040 0@40N0 0@4B0 0C 0. 88WH08 0<~@zr qp!7 pϑ ! DrD  < 2z ?  8 '(~@ǎ<Ǟ8HHW8  !q#'p"2 !p% 88W8 !" @  䌋    pl88WH<@~Dp p  Xߑ  0߁p 0 7 p! ! !.8ċ.     ~Dǎ@Ǟ<HHWP@Dΐ H  0~Lq>    0 9 p! ! ! .X⸋<       x !    0 9 p! ! !D.tt       !  t~LǎHǞDǮ@PPW@ ~8q qp1' p <>~8@@W8 z0 2q37p2C'0 2p5# $88Wx<@DH L P~T P/^Xp0߀W ^pp dds d @ @d  @  @d@  @@  @g  ߊ l pP ^|p0PX^xP^tP ^p ǎx~t@ b X  \X X\ .X\  !  `ޘ`      (!  (!  (!  (! Fh (! !(! p.W   @ (!  (! & ΋> @(!  @(! :l (!  (! & ~* (! l (! 2 N6 !   "   $  r (  b    <      !ܘ    x  d  P  <  (   .(!2@@ 428 !2 !0# !2(#2 #@ $ .( 0 #( !t *(! *"(! "p.W  ΰ   ΰ      p  z  ΰ  @       p  zZ     p  z / (4z+T/  X \X X\ .X\JX X\^p \ \^ç8 dnd (gXh4XnV!X( VnXhQ  @ @@Q l  @RFp!W4(onh @ @@ @h  @  @@ @d@  @@ @<  @  .@   ט@  @T@Q  D.Dz`DD@ @ǎh @ bT  ΐ  </І/8//І/P־ @ W8    ΐ @  ,    '4W  '4W    n       p  4*Fp!W (on:  " n  m,v h',;,m0008X '2,,Fp!WX.\k! 0 #Ԑ'02',!F',p!W^|Q^|^pQ ^p^Q^^tXQ^t^x0Q^x^|X~TǎPǞLǮHǾD@<W@(#)wbal.c 6.1 87/11/24CIO %d PROM Rev: %x CIO %d CODE Rev: %x CIO %d PCA Conf: %x CIO %d :Error - Board Firmware version must be %x or greater. WBCIO: error wbreset %x %x %d Z , z p |l ( WBCIO: error wbflush %d WBCIO: error wbflush %d CIOerwrit hd!=tl %x %x %x WBCIO: error wbsendxoff %d WBCIO: error wbsendxoff %d WBCIO: error wbsendxon %d WBCIO: error wbsendxon %d WBCIO: error wbsetbrk %d WBCIO: error wbparam %d %x WBCIO: error WBCtest0 %xWBCIO: error WBCtest1WBCIO: error wbresetbrk %d WBCIO: error wbmodem &d WBCIO: error wbmodem &d ""$"$$$"$$$$$$$"$$%$%(%@%%T%CIOerit case= %x CIOstit case= %x WBCIO: error wbintr &d O.S. messages -- OFF O.S. messages -- ON  2Kn,X `%K 0lh 0lj 0lr 0lv 0lx 0l0l0l0l0l0l0l0l0l0l0l0l0l0l0l0l0l0l 0l&0l*0l,0l80l>0lB0lD0lP0lV0lZ0l\0lp0lx0l0l0l0l0l@0l0l0l0l0l 0lh 0lj 0l 0l 0l0l0l0l0l0l0l,0lX0l0l!0l0l0l.0lF$0lH$0lT0l0l0l0l0l$0l$0l0l 0l*$0l,$0lj0ll0lv$0lx$0l0l0l*0l0l0l0l&+0l20lH0lJ0lN0lP0lT0lV0lb0ld0lp,0l0l0l@0lB0lT0l0l0l0l 0l 0l `0l v0l 0l 0l 0l 0l .0l L0l 0l 0l $0l $0l 00l \00l 00l 00l F 0l H 0l ~0l 0l 0l 0l 0l \0l r0l 0l 0l 0l,0l20lx0l0l0l0l0l@0lV0l20l0l0l0l60lb00l0l0l0l"0lh00l00l00l0l0l0l0l0l0l 0l 0lN0lP0ld0lf0l<0l0l0l*0l<0lD0lL0l@0l^0lf0l"0l(0lj 0ll 0l0l00l 0l 0lv00l00l0l0l0l0l80l>0l0l0l0lB0lJ0l 0l0lx0l0l 0l 0l0l0 0l2 0lJ00l0l0l0l0l0l 0l 0l0l x<0l 0l 0l 0l 0l 0l 0l 0l! 0l!0=0l!2=0l!<=0l!j0l!0l#j<0l$0l$ 0l$<0l$0l%0l%0l%0l&0l&0l&00l&V=0l&X=0l&`=0l&0l&=0l&=0l&=0l&0l'b$0l'd$0l'=0l'=0l'=0l(j<0l(>0l(?0l)0l) 0l)&0l),0l)40l)>0l)D0l*:$0l*<$0l*r=0l*t=0l*~=0l+(00l+@$0l+B$0l+r00l+$0l+$0l,0l,0l,0l,0l,0l,0l,0l,0l,0l,0l,0l.0l.0l.0l.0l.0l.0l.0l.0l.0l.0l.0l.0l.0l.0l.0l.0l.0l.0l.0l.0l.0l.0l.0l.0l.0l.text,.data,$.bss/SaveReg D_confsw&0 ;/_ctladdrE_d_readR]_printfj_wb_alt@/h_spl5_StartWB_sleep_splx_u_ttinit_ttchar/_bcopy_lineswx_wbmodemH_copyin_copyout_ttiocomL_d_write_timeout!./9_wbalclrhH_BAUD/Xh`_wakeup_sysinfo_signalr|/p/x/_wbalunit_HeadwallDiag_wbalinit_wbal_cnt_wbal_addr_wb_reset_PROMVersion_PCAConfig_CODEVersion_wbal_tty_WBCommand_intrpInterval_wbalopen_GetHWSwitches_wbalproc_wbalparam_wbalclose_wbalread_wbalwrite_wbalioctl_WBCtest1_WBCtest0_WBWriteChar_wbresetbrk_cio_getchar_cio_putchar_diag_cons_cio_breakchar_WBSetStartStop_WBGetStartStop_wbalintr_ttyflush_timeInterval_wbal_cons_KEYBOARD wbct.o/ 568272554 98 100 100664 24527 ` u!&Zd9.text6X> .data6X6X6U$p@.bss>>X8<@DHL~PްPހޠ^T  `z^T [p  8(  @ ,  ^T @PD<^T ?~PǎLǞHǮDǾ@<8XXWXDHLPzzsΠ~T  pp  @  @ zc3 0f ؎| z6x`J0>    t\T8 2 . VH @zc0 0z   $z z6\zs>     zc1 0 zc2 0 DN z6~  004  W  Y~TǎPǞLǮHǾDXXW8  !p%$88WP@DHzzs  p~Lp @ YW Dߠ & zc"!0аYP B  & 40zc!!0Yzc# 0fY    ~LǎHǞDǮ@PPWP?8<@DzHzs !  <~Lqf  @ D 2,( `  $X @  ,~LǎHǞDǮ@Ǿ<8PPW@48~<pzs   D߀  < ($$ ,8((0$$ , ((0," 0؋(0cccccBcB4    t  x q x  >~<ǎ8Ǟ4@@W@48~<pzs p 0($$ ,0 "$ , 0D߀ccT0 :'((0' '0!0 #!44$~ccƧ7 q94  ! #!   x q x j ~<ǎ8Ǟ4@@WH <D@~Dߐ  p z p߀  cc 6 c3 c! np6W cBZ cƀ L  c8z7"z7@z7d|$ z7\z7H$ z7ܓ($ z7$ zz8 fz8@ԋRz8`,6z8,z8,z8Гt,z8\z9 Hz9H4z9p  @ $ z9 @ $ Xz9 @ $ ,z9 @ $   r &~Dǎ@Ǟ<HHWh<@DHLP~T  øzzsP^c^c Q^cnc:4Z8pq^d  cc!B c3 c!!p:W cB cav x ck!j  cƚ  cF c!>p:XW"   ^d^d pX )2P^\  :^d^d pX _P^\X"   ^dd^dTX 6P^\^d 4^d$nc !!!"   N^d^d pX _P^\ ^d^d|P^\z ^dP^d@P @^\> ^d^dP @^\^d ^dnc !!!^d ^d^d^dpncP @ ^\!!!8^d 4^d"^d^dncP @ ^\!!! ^d ^d^d^dP'^\ ~^d ~^dl^dZ^dncE@p  p q ? pp q 0 0sp00p q p? sps0 0pxx p a^dncEBp  p q ? pp q 0 0sp00p q p? sps0 0pxx p  ^dP'^\ ^d ^d^d ^dncE@p  pq ? ppq 0 0sp00pq p? sps0 0pxx p a^dncEBp  pq ? ppq 0 0sp00pq p? sps0 0pxx p  :^d*P'^\ ^d ^d^d ^dncE@p  pq ? ppq 0 0sp00pq p? sps0 0pxx p a8^dncEBp  pq ? ppq 0 0sp00pq p? sps0 0pxx p  ^dtP'^\X^d T^dB^d2^d"P:^\^d ^d^d^dP:^\^d ^d^d ^d^dncE@p  pq ? ppq 0 0sp00pq p? sps0 0pxx p a^dncEBp  pq ? ppq 0 0sp00pq p? sps0 0pxx p  P'^\ (*0 V ,z:Ћ2a   ` ^d ^d P_^\~ (*0 (a   ` ^d ^dP_^\^d^d^dxx p @ a a ^dB  ,,nc !!!0(q `c& ^ds ^d^dp^d_WQ^\,,nc !!!(sqp^d l^d Z^dpF^dp2P_^\$   0gq  pq0$   pq  ^dxx  p @ a a ^dB ` PDp^XZ xx p Xnd aXnd ^XTq^X(nc !!! ,z:ᨋ ^d ^d ~P_^\2^d ^^dLP_^\^d q.^d  q$    q  ^dxx  p @ a^dB PDp^XZ xx p Xnd a^Xnd B^XTq^X(nc !!! cnc^\vn%^ ާ\ <^d @  ߸z:Гߤ&$   ߂`~TǎPǞLǮHǾD@<hhW@ 0 #;2@@W  !WX?<@DΠ   H DL~Pߑ    qcވ  T(4<  c( "cBcBs ftT 0 )4q!)4R.TR !s#0   c( r 4f$  ~4 .  =D44p0  t h0' (044@ '0'(p0   '0)4q!)4 4 =`0' 8$  4400@ '0)4q!)4 '0'(p0  n $ 44  ~(p  . &  c c!p;WT 0 )4q!)4.TR !s#0   c f 3Z$   ~3 . H =|6 O  @vn.! p)0  c B )4q!)40 =δ.& =΀` $ 044  ~(p  . T< )4q!)40 =Г̋.TR !s#0   c  $ 044  ~(p  . 4R! 012%1,! 0121, ̺  ̪ ^~PǎLǞHǮDǾ@<XXWH 0 1 @DA @p~D!t8΀cxq p s0 s1sxq111 !~Dǎ@HHWH~Dzp4Ԝz $. >$ˊ~DHHWH~DzpT48z $. >$&~DHHW|  x YP s  Y&|s  D 4WHzB#z0@s3~DЀsw0 7p sxY1p 7pc7Yn1pc"pc$00" YB!0c'#.0c!2&#p""=W"z$0,Y Y~Dǎ@HHW @(#)wbct.c 6.1 87/11/24 cartridge not loadeddensity switch not on BOTcartridge write protected T h |  $ T l 8end of read tape_mark timeout on ct %d end of skip block timeout on ct %d end of skip end of data timeout on ct %d end of write tape_mark timeout on ct %d end of rewind timeout on ct %d end of erase timeout on ct %d end of retention timeout on ct %d end of load timeout on ct %d end of unload timeout on ct %d end of test_ready timeout on ct %d end of inquiry timeout on ct %d end of mode-select timeout on ct %d end of mode-sense timeout on ct %d end of prevent_removal timeout on ct %d end of allow-removal timeout on ct %d end of request-sense timeout on ct %d end of read block timeout on ct %d end of write block timeout on ct %d end of write raw timeout on ct %d end of read raw timeout on ct %d \ p@Px0,@@@End of cartridge on ct %d End of cartridge on ct %d d_write failed on Start IO Order on ct %d %s on ct %d !( *,-P-T/& $#\#$'&($\$(((((""#"X,,*,,,,,,,t,*2222220 22x222220hEnd of cartridge on ct %d End of cartridge on ct %d End of cartridge on ct %d End of cartridge on ct %d File mark detected on ct %d End of cartridge on ct %d Illegal request on ct %d End of cartridge on ct %d Illegal request on ct %d End of cartridge on ct %d End of cartridge on ct %d End of cartridge on ct %d Illegal request on ct %d End of cartridge on ct %d Illegal request on ct %d End of cartridge on ct %d End of cartridge on ct %d End of cartridge on ct %d 6"6"6"6"6"6"6",>.>4 >6 >: >< >@ >B >H >L >N >R>T>X>Z>r>>> > > > >>>>>>~>>>>>H> > >>>>>>$>&>*>,>>>X >Z >>>>>>>>> !> > > >>>">">#>*">b$>d$>x >z > >>> > > B"> p"> > > "> $> $>  >  >  > $> \> > > > > > > > X> ^(> l> r(> > (> > (> > (> > (> > (> > (> (> .(> <> B(> X> ^(> p> v(> > (> > (> > (> > (> > (> > (> 4> :(> `> f(> ">">$>d>>>>B>V>>>>> > > >.>B>v>>>>>>>,>< >> >F >^>p>>> > > >>>>> > >$ >8>H>X>h>>>>>>>>>>)>)>*>*>>>0*>2*>Z>n>p>~>>>>)>)>*>*>>>*>*>>>>>P>b>v>x>>>>>)>)>*>*>>>*>*>>(>*>8>:>N>P>^)>`)>n*>p*>z>|>*>*>>>>>>,>.><>>>R>T>b)>d)>r*>t*>~>>*>*>>>>>>>>)>)>$*>&*>0>2>R*>T*>~>>>>>>>> >0>L>^>p>>>>>>>>)>)>*>*>>>*> *>2>F>H>V>X>l>n>|)>~)>*>*>>>*>*>>,>2(>n>>>>>,>^>>$>$> > > >>> >0>J$>L$>` >b >j >>>>>~>>>>, >. >6 >T>Z(>r>>>>>>P>h>>> > > > $> J> X> ^(> "> > (> > >!H >!J >!N >!P >!z->!.>!/>!>!>!>">%>%(>%>%(>&r>&x(>&>'(>'0>'>'(>'>'(>(0>(>((>)>)(>)0>*&>*0>*>*(>+V>+\(>+>+(>+0>,.>,4(>,0>.0>.*>.0(>.>.(>/0>0>00>0>0(>1H>1N(>1|>1(>10>20>26(>20>2$>2$>3 >3 >3 >3" >3$ >3, >3H2>3X">3 >3 >3>3>43>4x6>46>4>4>5>5 >5>5$ >5& >5B>5L>5N>5b >5d >5 >5 >5>5>5>6>60>6<>6>6>6>6>6>6>6>6>6>6>6>6>6>6>7>7>7>7 >7>:>: >:>:>:>:>: >:$>:(>:,>:0>:4>:8>:<>:@>:D>:H>:L>:P>:X>:\>:`>:d>:h>:l>:p>:t>:x>:|>:>:>:>:>:>;>;>;>;>; >;$>;(>;0>;4>;8>;<>;@>;D>;H>;L>;P>;T>;X>;\>;`>;d>;h>;l>;p>;t>;x>;>;>;>;>;>;>;>;>;>;>;>;>;>;>;>;>;>;>;>;>;>;>;>;>;>;>=>=>=>=>>>>>>>.text6X.data6Xp.bss>SaveReg _confsw_wbcttab_ctstat_wbctptr" -_ctladdr_d_write7\ATN _spl5Y_timeout_sleep_splx_ctdens>_u_wakeupep_spl6|X_iowait_iodone_clrbuf_lbolt  _printf_ksct_kbase_wbctclr ! _d_read_prcom_wbcterr3_logberr_fmtberr404_physio45x_wbctinit_wbctrbuf_wbct_cnt_wbct_addr_wbct_buf_wbctopen_wbctcommand_wbctprint_wbcttimout_wbctclose_wbctcombuf_wbctstrategy_wbctstart_wbctrstrategy_wbctimex_wbctintr_logstray_untimeout_wbctread_wbctphys_wbctwrite_wbctioctl wblp.o/ 568272584 98 100 100664 7739 ` u!&&.text .dataX@.bssPPH<@~DސpF  ` t ~Dǎ@Ǟ<HHWH<΀ ~@p YD@ Y( p DDD B  pD  &l4 ާ^@ާFާ  p Y0.D  @ ~@ǎ<HHWH<@΀ ~Dp@ Y` P T  $  ~Dǎ@Ǟ<HHWYWP@DH΀ ~Lpנr   x. x  H 8x(t')Y' !'ttxx.    ( v tt^Y, x! x (vx.    ~LǎHǞDǮ@PPW!~0-pW!\!4  V !J  4! Ћ!  V !J  4! H(!n!D !& 2! # !  ! ۋ   @ :@A2@ b܋Z  p@ !GpB $@ BdP/W %@ Ap r !F@A4@ !   @ 0@ V@A,1#FA@@ @ r@ Af@ PA@ @A A< 1$0C100 40100 101#~ǎWH<΀ ~@p p DDQ  ( p DrDQ  hR 6Q   ~@ǎ<HHWH8< ~@q        rdp DJDQ  *p  ap  p  p ~@ǎ<Ǟ8HHWX<@@ ~Dp l  l p(W'0 #.J' .L'.N' .P'J.R* YLJ*ІY,Jz M OQ S p TlT TN   2$ ާ @ާާ B V Y:      p v p \  Y$      p  p  Y~Dǎ@Ǟ<XXW 0@ !WH < ~@p q p D (( P  D  (D  D D  <D@  (D  D 8D (D  D ~@ǎ<HHW@(#)wblp.c 6.1 87/11/24LPxzLP: *** Error - LP Order = %x after interrupt. (Should be 0) LP: *** Error - Return status byte = %x after interrupt. LP: *** Error - StartDMA called while DMA in progressLP: *** Error - About to start DMA, but LP Order is not 0. Order = %x (dddd $ & * , 2 F n | ~       *fh   z |   Z \ ` b $&.24<Fv Z \ t 2  4  @  B  R l r ~        2  4  : \ t                 (  0  2  B  Z  \  l     "  2 >   0:\t| ~      " 0 8 : J j     $(,048<@DH.text.dataX.bssPSaveReg _confsw $_ctladdr_d_write._u_d_read8DQP\H_spl4h _sleep_splxs},_min_copyin_fubyte _printf_wakeup _copyout_wblpclr_wblpinit_wblp_lpdt_wblp_addr_wblp_cnt_wblpopen_wblp_lpbuf_testOffline_wblpclose_wblpoutput_wblpstart_wblpread_wblpwrite_wblpintr_wblpioctl_PROMVersion_CodeVersion ...LIBKDB.a! / 568272654 0 0 0 1666 ` uSaveReg_deblank_kdb_getline_blanc_newline_number_BASE_expr_instrucinfo_breakpoints_breaktable_findbreaktableentry_findbreak_addbreakpoint_kdb_dlg_deletebreakpoint_handleaddbreak_readtarget_singlestep_defmode_stepmode_handledeletebreak_numbreaksset_displaybreaktable_kdb_printf_strphs_strvrt_setbreakcmd_kdb_wrt_clearallbreaks_clearbreakcmd_break_pc_break_type_vdumpmem_v_count_v_offset_d_offset_d_count_dumpmem_modeflag_displaycmd_vdump_transaddr_doreg_dispinstr_codass_Subop_displayinstruction_displaycodecmd_displayregscmd_exitcmd_cons_diag_modifycmd_singlestepcmd_recon_majdcb_dcb_loadcmd_KDBdlg_dumpcmd_ci_KDBcmd_load_hlp_writeheader_strhdr_strknm_exception_restart_modestring_strstp_strbkp_kdb_init_KDBwrt_kdb_print_kdb_printn_casehs_loadb_loadh_loadd_laddr_store_storeb_storeh_stored_save_reg0_default_pcb_debug_pcb_user_pcb_user_default_kdb_default_kdbflag_i_kcall_i_align_i_instr_i_dbpe_cf_i_dbpe_ex_i_page_i_pviol_i_check_i_trap_i_int_i_sw0_i_pwf_i_pwon_i_timer1_i_timer2_i_res_kdb_go_pcb_access_call_debug_translate_txt_translate_kdb_flush_itest_start_loader_kdb_ccbkdbn.o/ 568272646 98 100 100664 31139 ` u!'n(r.text.L,U .data.. / \(@.bssKK0 ! #"@ $W@48~<p H(p qr*L bq*`~<ǎ8Ǟ4@@WP<@DH~Ls )   a(!   z(!    A(! P  F(! @P;  $' ɧtL  0(! 8  9(! ( ; 'Ч  ~LǎHǞDǮ@Ǿ<PPWX@DHL~Pq ) b )8\  F )j,Q !0+#: )>T.T !0-#> )>T .TV !0*#> )>Tv b.T !/!> )>T. .T ~PǎLǞHǮDǾ@XXW 0 @(A@2 S 2 W36 @(A@1    WH48<@~Dpޠzdp q^ΐ;zz&  0#z ~Dǎ@Ǟ<Ǯ8Ǿ4HHW, z   W@z"~00z0Sp73z30X573z3zr7F"5p734 B$ 0p734 010p0 7~WP8<@Dz~Hqz$   $LLLLLzzL L L LpLL L #~HǎDǞ@Ǯ<Ǿ8PPW8 ȧ~4p z* #L2   ~488WXDHL~Pq.z" T1"z ()8 Tz$ 0Tz( T Tz"  ZTz  !2Tz  TT~PǎLǞHǮDXXWH48<@~Dpzr:z" 0# J!pqǎ     ~Dǎ@Ǟ<Ǯ8Ǿ4HHW`?DHLPT~XpŽ V   [ \X\z, \ * ')z(7 \8( pǐ \z ( +7~XǎTǞPǮLǾHD``W`HLPT ~XqzwבסױӁzhz( \1`F.\!z0 \Q z$  (z(   z ( 0~XǎTǞPǮLǾH``WH<@~Dpz$z  `  & @,.r(.^.̓Jz:..:'z".ܓq 5~Dǎ@Ǟ<HHWP@~Hs>L΋fLQPL !0.Lzz( 0~HPPW0  z"z!  00WP@~@zs>D0 DpzwDz'H1, H*Dz'H2HQ zNz'L1`$Lz Hz DR~@PPW@8~<րpFs!s!  qh:0 2 h~<ǎ8@@Wh<@DHLЧP~T. .j)! )# ! 8!X !24y&qpϮX4 ((  ~(( ΀. q~TǎPǞLǮHǾD@<hhWPDH~Lrf '0PVH '0,. ~LǎHǞDPPWPDH~Lrf '0H '0 r~LǎHǞDPPWXDH~Lr '>P  \ '>T8 TPT~P P~LǎHǞDXXW@~<p/z ~<@@W`DHLPTX~\r p2  pנ2 ? ؋'7/<f N<'/HB*'/P/8 p/W‹4X/Xq |qh/d*n VT.p10< "q  /4!p((*뎄!0 # '02 0# 02!! /0nB !0 (20 !0~(20. !XZ~\ǎXǞTǮPǾLH D``WX<@D~Hp  NNTϮO>$' L 'TQ%.Nd ~HǎDǞ@Ǯ<XXWP@DH~Ls p (0 (0h r 8\ X~LǎHǞDǮ@PPWH<@~Dp(/p qpωX(/ q~Dǎ@Ǟ<HHW8B088WPT>DDJ~D!/D BDLL>H.DH0 DDPPW8ȓ` X! @X$ 88W@~8p `< 4<a <  ~8@@WH<@~@s q 0a0a  q D,>D D2q80 ހ@D<qDD `fDDD a!0a!ԓDP ~@ǎ<HHWXDH~Lr ; '>PP '>TֆsT; P .P0@p` Tp021 / V :"0#.P1#.T!PP.T`(/0.~LǎHǞDXXWp@DHLPT~Xp/ ; (>\F\Q ( ( (\n  (>`R `Q (#( (>d.\@p` ` pPRQ^h /5B x0// ` 2 R^d%0(# %W&1N(# ,.dp#1T2#3@ 41 2@p9C10FGâSЧ^l<ΰ?$(lQQ^lS^l ޓlP/X `lP/X6aP/Y%p(cP/Y'!'޶ >h- ,(I  ; ~XǎTǞPǮLǾHD@ppWXD~H: LNLTT(T .TL !0A(20 !0z(20 R !0Z(20 !a(,>T LqT f1@Z(A@@a(A@ F0 1@A(C@0 1@!4 "0 1z( !qpLrH>T7C>L431Q5@a(405@z(405@ 410 1qxTpT:.L1# q{| {p/W L 1x LT( RLT(&>LT(&`  *F8PRX&@PRPRXpހ0Vq,  > qr 0~(v^:0M C0N V prLT(7M RM VLT(M DLT(nLT(M AtM V qrLT(72FM2 TN1MM V qrLT(~(܋ ^Zp/WbLT(ZNrpLT(7f.LT(ҋLT(.PDH~Lq( :d0: :$p)X!B:%p)X!"d0d0$P:Plqqusp1<bp1:p: p)X!Bp: p)X!rp:!p"Xǁ'8~LǎHǞDPPW`HLP~Tq(s pp׀r!X.\ !@.\&"r!X"!X!@"!@ &"ꎁ\\*\z*X1ܞp :  :p11 N\ z08(4\s LXQ z ڋp :  :0: 0:N\ z0`(4\z\Xr~TǎPǞLǮH``W   !W8 ȧ~4p q~488W8 ȧ~4p q~488W8 ȧ~4p:~p:l~488W@8~<:q4p;"~<ǎ8@@W8ȧTT.X88WH<@~Dpq!0%#q)*!q 0! 9 d u o x6o x  )Z s$ǘ "!2 c D),~Dǎ@Ǟ<HHW`8<@DHL~P  ۋ ڋ ->p>TB,(!*   q1Ŋ}q0'T0Ѵqp~PǎLǞHǮDǾ@<8``W @(#)kdbn.c 6.1 87/11/24 %s %x temporary %x permanent %x perm %s pid = %d %2x%8x: R%d,T%8x, %s %8x: %2x%2x%2x%2x%2x%2x %3u %s %d R%2d: %8x SR%2d: %8x %8x : %2x = %%%$$$|$ #####&P&T&h&&&&&&&&&&&&&&pR2 : %2d Addr2 : %8x Mode : %s %s PC : %8x pid = %d %s %s Address : %8x pid = %d 0123456789ABCDEF;0;p;<,>x>>??@?|??@@P@d@|@@@@@@@@AA ;,;(AA$A0A<AHATA`AlAx?? LOAD , LOADB , LOADH , LOADD , LADDR , STORE , STOREB , STOREH , STORED , 1hAAAAAAAAAAABBB B,B8BD1hBPB\Bh1h1hBt1h1hB1h1h1hBBBBBBBBBBCC1hCC(C4C@CLCXCdCpC|CCCCCCC1h1h1h1hCCCDD DD$D01h1h1h1hD< 1hDHDTD`DlDxDDDDDDDDDDDE1hEE E,E8EDEP1h1hE\1hEh1h1h1h1h1hEtEEEEE1h1hE1hE1h1h1h1h1hE1hEE EFFFF(1hF4F@FLFXFd1hFp1hF|F FFFFF1hFFFFG1h11111h1h11111h1h1h1h1h1h11111h1h11111h1h1h1h1h1h11111h1h1x1x111h1h1h1h1111111h1h1x1x111h1h1h1h1111111h1h1x1x111h1h1h1h1111111h1h1x1x111h1h1h1h11G GG4G`GGGHHXHHHHHI I I4BCDEGHKMSTLIPI\IhItIIIIIIIIJJJ0JLJlJJJK K$K@K\KxK list of commands (all numbers in hexadecimal): ---------------------------------------------- b [address] - set breakpoint (Phys. Addr.), or list all breakpoints bv [address] - set breakpoint (Virt. Addr.), or list all breakpoints bt address - set TEMPORARY breakpoint (Phys. Addr.) btv address - set TEMPORARY breakpoint (Virt. Addr.) ca - clear all breakpoints cb [address] - clear breakpoint (physical addresses) cv [address] - clear breakpoint (virtual addresses) d address [count] - display data (physical addresses) dc address [count] - display code (physical addresses) dcv address [count] - display code (virtual addresses) dd dev unit part - dump memory on disk (dev, unit) , partition(part) dr - display registers dv address [count] - display data (virtual addresses) e - exit debugger g - go to the end of current function k - kill current process or go to Panic load - used to reboot from disk (dev, unit) m address - modify sequential data bytes s - single step t address [segno] - virtual to physical address translation Integer Overflow Integer Zero Divide Real Overflow Real Underflow Real Zero Divide Inexact Result Before Trap USER PRIVILEGEDKERNEL DEBUG ELOGR ELOGW TWRITEC TWRITED FLUSH TRAPEXIT ITEST REGN REGNB VERSION MAINT MOVE , NEG , ADD , SUB , MPY , DIV , REM , NOT , OR , XOR , AND , CBIT , SBIT , TBIT , CHK , NOP MOVEI , ADDI , SUBI , MPYI , NOTI , ANDI , CHKI , FIXT , FIXR , RNEG , RADD , RSUB , RMPY , RDIV , MAKERD , LCOMP , FLOAT , RCOMP , EADD , ESUB , EMPY , EDIV , DFIXT , DFIXR , DRNEG , DRADD , DRSUB , DRMPY , DRDIV , MAKEDR , DCOMP , DFLOAT , DRCOMP , TRAP SUS , LUS , RUM , LDREGS , TRANS , DIRT , MOVESR , MOVERS , MAINT , READ , WRITE , TEST > TEST < TEST = CALLR , TEST > TEST < TEST = RET , TEST <=TEST >=TEST !=KCALL TEST <=TEST >=TEST !=LSL , LSR , ASL , ASR , DLSL , DLSR , CSL , SEB , LSLI , LSRI , ASLI , ASRI , DLSLI , DLSRI , CSLI , SEH , BR > BR = CALL BR > BR < BR = LOOP , BR <=BR !=BR BR <=BR >=BR !=BR > BR = CALL BR > BR < BR = LOOP , BR <=BR !=BR BR <=BR >=BR != Debugger Call Invalid KCALL %d Data Alignement Error Address : %8x Illegal Instruction Opcode : %2x R1 : %2d Parity Error Code Fetch Address : %8x Parity Error Execute Address : %8x Page Fault Segment : %4x Address : %8x Kernel Violation Opcode : %2x R1 : %2d R2 : %2d Check Trap R1 : %2d R2 : %2d Invalid Trap # : %d External Interrupt Device # : %x Switch 0 Interrupt Powerfail Warning End Power Glitch Timer 1 Interrupt Timer 2 Interrupt Reserved Vector Exception Virtual PhysicalStep Break-Pointdump OK invalid partition no VTOC area invalid device invalid unit expected count expected address breakpoint table is full KDB> invalid text address invalid virtual address invalid text virtual address invalid command internal error, attempt to set afterpermbreak break twice internal error, can't find AFTERBRANCH breakpoint expected segment number pc break type %x is not an even address no breakpoint set at %x physical address = %x d_write error = %x IO error %x \ L, L, L,nL,L,L,L,L,fL,hL,L,L,L,L,L,L,L,L,|L,L,L,L,L,L,L,L,L,.L,>L,LL,dL,L,L,L,L,L,L,L,L,L,L,"L,$L,4L,L,L,L,L,L,L,L, L, L, L, :L, <L, bL, dL, rL, L, L, L, L, L, L, L, NL, L, L, L, L, L, L, L, L, L, L, !L, !L, !L, ^L, `L, nL, ~L, L, L, L, jL, ~L, L, L, L, L, L,L!L,N!L,h!L,j!L,r!L,L,L,!L,!L,!L,!L,!L,6*L,8*L,P*L,R*L,Z+L,\+L,|!L,~!L,!L,L,L,L,L,L,L,L, L,"L,0L,l-L,n-L,r.L,t.L,~/L,0L,0L,0L,0L,2L,3L,.L,.L,-L,-L,.L,H/L,J/L,PL,`/L,b/L,rL,0L,0L,4L,X L,l/L,n/L,v/L,3L,3L,/L,/L,0L,0L,20L,:3L,|3L,~3L,.L,.L,-L,-L,-L,3L,2L,L,8L,PL,tL,L,L,L,L,L,jL,L,L,ZL, L,L,`L,3L,3L,/L,/L,>0L,@0L,h0L,|3L,/L,/L,3L,4L,0L,0L,L,L,FL,*L,@L,@L,AL,BL,BL,CL,DL,L,FL,L,3L,IL,pKL,zKL,KL,KL,KL,KL,KL,KL,KL,KL,"AL,JLL,vFL,L,NL,NL,OL,OL,(L,dKL,L,FL,QL,0L, KL, SL, SL, KL, L, 4L,!LTL,!xSL,!zSL,!L,!L,"3L,#fL,#L,#L,#L,$ L,$L,$4XL,$6XL,$PYL,$RYL,$ZYL,$\YL,$hZL,$jZL,$L,$!L,$!L,$!L,$L,$L,&43L,&63L,&JL,&L,&L,'L,'L,'L,'>L,'RL,'nL,'L,'L,'L,'L,'L,(FCL,(HCL,(RBL,(ZCL,(lL,(|`L,(L,)L,)&L,)0L,)8L,):L,)FL,)x`L,)bL,)L,)L,)L,)L,)L,)L,)L,)L,)L,)L,*L,* L,*$*L,*,+L,*x3L,*~0L,*-L,*/L,*.L,**L,*L,*!L,*L,*L,* L,+( L,+\L,+nL,+L,+L,,8 L,, L,- L,- L,.& L,.FL,.N L,/L,/ L,/L,/L,/L,/L,/ L,/$L,/(L,/,L,/L,/L,/L,/L,/L,/L,/L,/L,/L,/L,/L,/L,/L,/L,/L,/L,/L,/L,/L,/L,/L,/L,/L,/L,0L,0L,0L,0 L,0L,0L,0L,0L,0L,0L,0L,0L,0L,0L,0L,0L,0L,0L,0L,0L,0L,0L,0L,0L,0L,0L,0L,1L,1L,1L,1 L,1L,1L,1L,1 L,1$L,1(L,1,L,10L,14L,18L,1<L,1@L,1DL,1HL,1LL,1PL,1TL,1XL,1\L,1`L,2L,2L,2L,2 L,2(L,20L,28L,2@L,2HL,2PL,2XL,2`L,2hL,2pL,2xL,2L,2L,2L,2L,2L,2L,2L,2L,2L,2L,2L,2L,2L,2L,2L,2L,3L,3L,3L,3L,3 L,3(L,30L,38L,3@L,3HL,3PL,3XL,3`L,3hL,3pL,3xL,3L,3L,3L,3L,3L,3L,3L,3L,3L,3L,3L,3L,3L,3L,3L,3L,4L,4L,4L,4L,4 L,4(L,40L,48L,4@L,4HL,4PL,4XL,4`L,4hL,4pL,4xL,4L,4L,4L,4L,4L,4L,4L,4L,4L,4L,4L,4L,4L,4L,4L,4L,5L,5L,5L,5L,5 L,5(L,50L,58L,5@L,5HL,5PL,5XL,5`L,5hL,5pL,5xL,5L,5L,5L,5L,5L,5L,5L,5L,5L,5L,5L,5L,5L,5L,5L,5L,6L,6L,6L,6L,6 L,6(L,60L,68L,6@L,6HL,6PL,6XL,6`L,6hL,6pL,6xL,6L,6L,6L,6L,6L,6L,6L,6L,6L,6L,6L,6L,6L,6L,6L,6L,7L,7L,7L,7L,7 L,7(L,70L,78L,7@L,7HL,7PL,7XL,7`L,7hL,7pL,7xL,7L,7L,7L,7L,7L,7L,7L,7L,7L,7L,7L,7L,7L,7L,7L,7L,8L,8L,8L,8L,8 L,8(L,80L,88L,8@L,8HL,8PL,8XL,8`L,8hL,8pL,8xL,8L,8L,8L,8L,8L,8L,8L,8L,8L,8L,8L,8L,8L,8L,8L,8L,9L,9L,9L,9L,9 L,9(L,90L,98L,9@L,9HL,9PL,9XL,9`L,9hL,9pL,9xL,9L,9L,9L,9L,9L,9L,9L,9L,9L,9L,9L,9L,9L,9L,9L,9L,:L,:L,:L,:L,: L,:(L,:0L,:8L,:@L,:HL,:PL,:XL,:`L,:hL,:pL,:xL,:L,:L,:L,:L,:L,:L,:L,:L,:L,:L,:L,:L,:L,:L,:L,:L,:L,:L,:L,:L,:L,:L,;L,;L,; L,;L,;L,;L,.text.U.data. .bssKSaveReg _deblank@_getchar_putchar_blanc*_newline+_number_BASE; _expr8+7FP[fH_kdb_dlg+L_curprocuP  t_defmode  +_strphs:_strvrt:_kdb_wrt+"1;G\_v_countQ[_d_count_dumpmem epz_vdumpd_doreg_codass2_Subop10_exitcmd_d_write_kdb_go_recon_d_read_majdcbT_dcb@_itest_loadcmd_bootdev_rootdev_KDBdlg: _dumpcmd._smdbb_ci!_KDBcmd:_load1x:_panicD_hlp0N&_strhdr:_strknm1[(,_restartf1 _kdbflag_strstp:_strbkp:r*t_KDBwrt;|, -H_casehs1h_loadb1_loadh1_loadd1_laddr1_store1_storeb1_storeh1_stored1_kdb_getline_instrucinfo_breakpoints_breaktable_txt_translate_findbreaktableentry_findbreak_addbreakpoint_deletebreakpoint_handleaddbreak_readtarget_singlestep_stepmode_pcb_access_handledeletebreak_numbreaksset_displaybreaktable_kdb_printf_setbreakcmd_clearallbreaks_clearbreakcmd_break_pc_break_type_vdumpmem_v_offset_d_offset_translate_modeflag_breakchar_displaycmd_transaddr_dispinstr_displayinstruction_displaycodecmd_displayregscmd_KEYBOARD_cons_diag_diag_cons_modifycmd_kdb_flush_singlestepcmd_start_loader__last_addr_xsyscall_xdbgcall_writeheader_exception_modestring_kdb_init_kdb_print_kdb_printn askdb.o/ 568272650 98 100 100664 7902 ` u!' 4(.text . .data,@.bssth \ P D 8 , pttlGh F@G.hDDLLGGXGG`GGhGGpGGxG GFG GhG p0t12X12L10 p! G/")G#JLt FXFF`F F1hF@FQpF`FqxFFFFFFhGAGhFBhFFLt W;W0DWLW LLW#>$PKDB>W   * 6 B N Z f r ~                T V f r x ~       $ , 4 :" <" D L V ` .text..data.bsshlp_kdbflagt_i_kcall_i_align_i_instr( 4_i_page@_i_pviolL_i_checkX_i_trapd_i_intp_i_sw0|_i_pwf_i_pwon+5_i_res_kdb_ccb_kdb_go?JKf_ccbWlblqt_itest||STKPARAM1STKPARAM2STKPARAM3STKPARAM4STKPARAM5PAGE_SHIFTPAGE_LENGTH_DPAGE_LENGTH_WPAGE_LENGTH_HPAGE_LENGTH_BKERNSTACKTIMER1_COUNTTIMER2_COUNTTIMER_PERIOD_exception_save_reg0_default_pcb_debug_pcb_user_pcb_user_default_kdb_default_stack_bottimer1_count_i_dbpe_cf_i_dbpe_ex_i_timer1_i_timer2_pcb_access_call_debug_translate_txt_translate_kdb_flush_start_loaderkdbccb.o/ 568272653 98 100 100664 5025 ` u!' .text .dataP@.bssPP  $(,048<@DHLPTX\`dhlptx|  $(,048<@DHLPTX\`dhlptx|  $(,048<@DHLPTX\`dhlptx|  $(,048<@DHLPTX\`dhlptx|      $(,048.text.dataP.bssP_kdb_ccb_i_kcall_i_align_i_instr_i_page_i_pviol_i_check_i_trap_i_int_i_sw0_i_pwf_i_pwon&0_i_resE_exceptions_i_dbpe_cf_i_dbpe_ex_i_timer1_i_timer2_data_area ...LIB0.a! / 568270704 0 0 0 1292 ` fPP:::::::::::::RPRPRPRPRPUUUUUYYYYYYYYYYY]]]]]]``ebebebebebebebebebebebebebebebebl\l\l\l\~~~~~SaveReg_mapa_xdbgcallalltrapsXsyscall_xsyscallsyscallXkcallXalignXillinstrXfparityXeparityXkerviolXcheckXtrapXinterruptXswtch0XpwroffXpwronXclockXcl100_tictac1XcalloutXrestrap_ret__debug_idle_kcall255_kcall254_call_rbug_rbsave_idle_addr_old_psXpage_start__last_addr_mcversion_bootdev_rootdev_pipedev_fdlp_dcb_proc0_uintstack_ftbits_ftPageTables_ftHeadwall_machineid_save_resume_setjmp_longjmp_flush_copyseg_copypage_clearseg_clearpage_dcb_write_fubyte_copy_start_copy_endbad_addr_subyte_fuword_fuiword_suword_suiword_copyin_copyout_udivudiv_uremurem_min_max_sizememory_headwallLight_addupc_spl1_spl4_spl5_spl6_spl7_splhi_spl0_splx_searchdir__HeadwallDiag_HWLoadEnable_R32LoadEnable_HWSerCmd_ml_elogr_ml_elogw_icode_szicodeispstackispstend_bzero_bcopy_d_read_d_write_d_rwrite_ccbmapa.o/ 568270660 98 100 100664 620 ` u!D .text\ .data <@.bss ( 0dq   #sp! j!!0? sp!s!0 # 6s   p ? p W @(#)mapa.c 6.1 87/11/24 \\L \N \ \ \.text.data .bssSaveReg _mapa_u_kbasetrap.o/ 568270666 98 100 100664 3702 ` u!J(=.text@ , .data@@@@.bss@G^QGUFP@GN8h(FrD FFDFFBP[G$F8F`0FsAB@P\A@PHAp@P4A\@P AH@P A4@P A @P A  @GSUڋA@P@PA@P|A@PhA@@@GHHCBPV@DCB@P A4G7GxF |pRUWU~jfb‹ҋ.fGN8G G1$XG"G3$`G7#( h# FrG$$hGGphDFFD F LG&FnFBB#4(P[GF8AhFD!pFbFsABGNAGE8G740 G$$hG&G7$p.Q!_LFrhDFFD !LFD@FnG FBPHP[LzHP*[HHPGD4tGDG$2tjPVLPGD(FrhDFFD@FnFB#4P6[LPGDBhFDBpFd8FFsL80AB@FCBP[P[DG@FPFBD FBWWUD! G/"FF> F.HF >(^0Ǿ8LBP` P$[P`ɀɠ WFW~.  L  ^  `  ~       , J  ^" r$ z' |' '   ' +  , 1 1 r0 /    2 2 3 3     , r5   8   @ .text@,.data@@.bssalltrapsXsyscallsyscall_syscall_uXkcallp_i_kcallXalign_i_align_i_instrXfparityXeparityXkerviol_i_pviolXcheck_i_checkXtrap_i_trap!0Xswtch0<_i_sw0XpwroffP_i_pwfXpwrond_i_pwonXclockxXcl100_ccb_tictac1HXcalloutXres_i_res_traptrap_ret__debugx,_clockintstack@_runrun_idlel_spl0`jXpaget_rbsaveP@_old_psLSTKPARAM1STKPARAM2STKPARAM3STKPARAM4STKPARAM5PAGE_SHIFTPAGE_LENGTH_DPAGE_LENGTH_WPAGE_LENGTH_HPAGE_LENGTH_BKERNSTACKTIMER1_COUNTTIMER2_COUNTTIMER_PERIOD_xdbgcall_xsyscall_call_debugXillinstrXXillinstrXXfparity_i_dbpe_cfXXeparity_i_dbpe_exXXkervioltbit_to_tcodeXinterrupt_ext_intrclock_ret_addupc_clkalladdupcidle_loop_kcall255_kcall254_call_rbug_idle_addrpaging.o/ 568270669 98 100 100664 1108 ` u!M\.text( .data((@.bss((@G7*G/! GSGN80h(Fr F hGhGGp $LD FFDGFFnG#GQFB#4. >$R H_BP [$G0t80B@P.!PP. >$P[    . v    .text(.data(.bss(_pfault_vfault_traptrap_retXpagebad_addrSTKPARAM1STKPARAM2STKPARAM3STKPARAM4STKPARAM5PAGE_SHIFTPAGE_LENGTH_DPAGE_LENGTH_WPAGE_LENGTH_HPAGE_LENGTH_BKERNSTACKTIMER1_COUNTTIMER2_COUNTTIMER_PERIOD_copy_start_copy_end_call_debugstart.o/ 568270672 98 100 100664 14041 ` u!P3P.text01 .data000 @.bss1P1P`qFFЋL@ؓҶ10L 1L`18pt xp14p1610@ FhD! tFFaFpAB XRP[6 D F FptF`pAB DF FptF`pABڋ111" 1$ 1* 10 161>1D1N1T1Z1`1l1p1r11111111111111(1.text0.data00 .bss1P_start_ccbsyscallispstend_clrmem101L_bootdev18_rootdev14_pipedev16_main_u0_proc0_u!0intstack0_ftbits1<1@1D1H1STKPARAM1STKPARAM2STKPARAM3STKPARAM4STKPARAM5PAGE_SHIFTPAGE_LENGTH_DPAGE_LENGTH_WPAGE_LENGTH_HPAGE_LENGTH_BKERNSTACKTIMER1_COUNTTIMER2_COUNTTIMER_PERIOD_sizememory__last_addr_mcversion_kdb_init_vadrspace_sys_sect_call_debug_fdlp_dcb_ftPageTables_ftHeadwall_machineidintstack0 cswitch.o/ 568270675 98 100 100664 866 ` u!S .textl .data@.bssP[D b GG(GG0G8FBP [D! bɂɢ (F`Fq0FFA8FFLB` W`ɀɠ WLWlN lP lbl.text.data.bss_save_resumeD_setjmp_longjmp_flushSTKPARAM1STKPARAM2STKPARAM3STKPARAM4STKPARAM5PAGE_SHIFTPAGE_LENGTH_DPAGE_LENGTH_WPAGE_LENGTH_HPAGE_LENGTH_BKERNSTACKTIMER1_COUNTTIMER2_COUNTTIMER_PERIOD_call_debug_ublk_sgtblcopy.o/ 568270678 98 100 100664 756 ` u!V .text` .data``@.bss``!rr, AB(Wr 0!WP[WB02.text`.data`.bss`_copyseg_kbase,,PSTKPARAM1STKPARAM2STKPARAM3STKPARAM4STKPARAM5PAGE_SHIFTPAGE_LENGTH_DPAGE_LENGTH_WPAGE_LENGTH_HPAGE_LENGTH_BKERNSTACKTIMER1_COUNTTIMER2_COUNTTIMER_PERIOD_copypage_clearseg_clearpageclearpage_dcb_writedcb_writeuserio.o/ 568270681 98 100 100664 1061 ` u!Y.text8 .data88@.bss88$W W# W # ܧW # LW0@BC0ABC(b@ AG@C@(A@:H@A(($0@A$$@A""  @A WW.text8.data8.bss8_fubyte*bad_addr*_subyte_fuword$_fuiword$_suword@_suiword`_copyin_copyout STKPARAM1STKPARAM2STKPARAM3STKPARAM4STKPARAM5PAGE_SHIFTPAGE_LENGTH_DPAGE_LENGTH_WPAGE_LENGTH_HPAGE_LENGTH_BKERNSTACKTIMER1_COUNTTIMER2_COUNTTIMER_PERIOD_copy_start_copy_endmove_loopdouble_doubleword_wordhalf_halfbyte_byteendmoveErrbad_addrErr math.o/ 568270684 98 100 100664 598 ` u!\ .text0 .data00@.bss00!/W!/W (! W (! W.text0.data0.bss0_udivudiv_urem urem _min_max$STKPARAM1STKPARAM2STKPARAM3STKPARAM4STKPARAM5PAGE_SHIFTPAGE_LENGTH_DPAGE_LENGTH_WPAGE_LENGTH_HPAGE_LENGTH_BKERNSTACKTIMER1_COUNTTIMER2_COUNTTIMER_PERIODmemscan.o/ 568270687 98 100 100664 1299 ` u!_ .textX .dataXX@.bssXX LnL 0 108 10Gǭ  ΀ΐ8 ΀ΐPUUUUI4TLtu`4v4ΐj`9CpLPUUUUdTLtW*&UTLtWd99dGۧ nɎɮ W^L WZ`l v .textX.dataX.bssX@_ftbitsNSTKPARAM1STKPARAM2STKPARAM3STKPARAM4STKPARAM5PAGE_SHIFTPAGE_LENGTH_DPAGE_LENGTH_WPAGE_LENGTH_HPAGE_LENGTH_BKERNSTACKTIMER1_COUNTTIMER2_COUNTTIMER_PERIODThirtyTwoMegMaxMemCardsMaxHWMemCardsPagesPer16MemCardPagesPer64MemCardPagesPer256MemCardPagesPer1MMemCardTestPatternVRTMemConfigMConfigRealAddrMConfigPgPerCardMConfigMaxCardsMConfigSizeStdMemConfigEndStdMemConfigsVRTMemConfigEndHwMemConfigsNumMemConfigsVRTInitTrapLocalSize_sizememory_machineid_ftPageTables_ftHeadwall_headwallLight misc.o/ 568270692 98 100 100664 1726 ` u!d.textX .dataXX@.bssXX. hn`.d\q q.uL < >hd HWP[G'# ^FqGF@_L!!,BP[G'# FqF_LBP[G'# FqGF@L!!B<n~. 0@. 1BPP0P`rÆx"Rb^"Ȏ@@n~ǎW@L 8  WWWLW! ` 201L<TA@0L<A@R^Pp!%pWLWLWZp       0 2 > H .textX .dataX.bssX_addupc_fuword_suword_spl1_spl4_tictac1Xcl100_spl5_spl6_spl7_splhi_spl0_splxP\LP"STKPARAM1STKPARAM2STKPARAM3STKPARAM4STKPARAM5PAGE_SHIFTPAGE_LENGTH_DPAGE_LENGTH_WPAGE_LENGTH_HPAGE_LENGTH_BKERNSTACKTIMER1_COUNTTIMER2_COUNTTIMER_PERIODaddupc_stk_call_debug_searchdir__HeadwallDiag_HWLoadEnable_R32LoadEnableBitsPerWord_HWSerCmd_ml_elogr_ml_elogwend.o/ 568270694 98 100 100664 4624 ` u!f4 .text( .data((@.bss  [/etc/init$.text(.data(.bss_u_icode_szicode$ispstack(ispstend(low.o/ 568270699 98 100 100664 2000 ` u!k< .text .data@.bss 0 W0 / @ކ@ # 0ATE#" 0@0W+K "01!W01$0h01%h01&h01WPWPX%@AQAGxBBSD"vdҋh('"@A('p'"$@A$X$@8hCA!FhCA" / 568272713 0 0 0 1122 ` R/(/(/(/(/(/(/(/(/(/(/(/(/(/(/(/(/(/(/(/(SaveReg_null_hash_null_netmatch_mbstat_nmbclusters_mbfree_mclfree_afswitchSaveReg_ifinit_ifnet_ifqmaxlen_if_slowtimo_if_attach_if_ifwithaddr_if_ifwithnet_if_ifonnetof_if_ifwithaf_if_down_ifunit_ifioctl_ifconf_ipintrq_rawintrq_rpintrqSaveReg_raw_attach_rawcb_raw_detach_raw_disconnect_raw_bind_ifnet_raw_connaddr_mbstat_nmbclusters_mbfree_mclfree_ipintrq_rawintrq_rpintrq_rthost_rtnet_rtstat_domainsSaveReg_raw_init_rawcb_rawintrq_raw_input_rawintr_raw_ctlinput_raw_usrreq_mbstat_nmbclusters_mbfree_mclfree_ipintrq_rpintrq_ifnet_rthost_rtnet_rtstatSaveReg_rtalloc_rthost_rtnet_wildcard_rtstat_rtfree_rttrash_rtredirect_rtinit_rtioctl_rtrequest_mbstat_nmbclusters_mbfree_mclfree_ipintrq_rawintrq_rpintrq_ifnetaf.o/ 568272661 98 100 100664 971 ` u!'<.text( .data((4@.bssWW @(#)af.c 6.1 87/11/24          @4D4H4L4P4T4X4\4`4d4h4l4p4t4x4|4444444.text(.data(.bssSaveReg  _mbstat _mbfree_mclfree+@5@O_null_hash_null_netmatch_nmbclusters_afswitch_inet_hash_inet_netmatch if.o/ 568272675 98 100 100664 3379 ` u!'# !.text! .data t@.bss8 ȧ~4p,LzWDDwtpۓ~488W t WH@~Dp\(H.6 6 z *. wtp~Dǎ@HHWH8<@~DÀ ( Bpנp( W wtp~Dǎ@Ǟ<Ǯ8HHW ! tW 1 tW8 z!  88W@~"i. tLY4 p  (i!. (i!֐  (i ‹ (iZhW%' l%# D%! ?Qa1`&! 7Rb1@&# 3Td1 &' 1Xh14 z  hW(%' l%# D%! ?Qa1l&! 7Rb1L&# 3Td1,&' 1Xh1 x l z4z(7T W  $T 7T*W~LǎHǞDǮ@PPWx<@DH ~Lpǡǹ`P..P!(( ! '1z"@0$# n`W!%' \%# <%! ?Qa1H7Rb103Td11Xh1P (n wt((p  ~LǎHǞDǮ@Ǿ<xxW @(#)if.c 6.1 87/11/24 2:jl  XZ^`0TVHJf &028.text!.data .bssSaveReg _ifinit_ifnetHh'_bcmp6(DN\_if_downi_timeout_ifunit_ifioctl_ifconf_suser_u_spl7_splx_bcopy_copyout_ipintrqu_rpintrq_ifqmaxlen_if_slowtimo_if_attach_if_ifwithaddr_if_ifwithnet_afswitch_if_ifonnetof_if_ifwithaf_pfctlinput_rawintrq raw_cb.o/ 568272684 98 100 100664 1898 ` u!',$#.textL .data ,@.bssH8<@~Dp<n$L(ސq~`,|pp|pē.~LǎHǞDǮ@Ǿ<PPWXDHLP~Ttְ. |  |6P+p !8z"# !z" (zDz  Dz   ZR  ;x 4 $*0X J $<Ǘw<  $+0 $z l~TǎPǞLǮHǾDXXW WP<@DH~Lzxz΀p ΀pW z  p ΀ ~p ΀pdDz ΀P :΀0Dz ΀  Dz ΀0 jb Z NȆ(Dz ΀(Dz ΀Dz 4  00 g4W %' l%# D%! ?Qa1`&! 7Rb1@&# 3Td1 &' 1Xh104 !  WDz" D  l΀b΀X) 6)   z~LǎHǞDǮ@Ǿ<PPW @(#)raw_usrreq.c 6.1 87/11/24 Tt $x$$$$,PLraw_usrreq  Z h            & ( . 6 >        Bj  :Bn0 !>"b"v|#  .textD.datax.bss(SaveReg _rawcbH0_m_get_m_freem_spl7_splx_rawintrp_bcmp_m_copy#1_m_free;LIhUam{_rtfree_rtalloc_sofree_bcopy_panic_mbstat _mbfree_mclfree_ipintrq_rpintrq_ifnet_rthost_rtnet_rtstat _raw_init_rawintrq_raw_input_sbappendaddr_sbwakeup_raw_ctlinput_raw_usrreq_raw_attach_raw_detach_raw_connaddr_soisconnected_raw_bind_raw_disconnect_soisdisconnected_socantsendmore_nmbclusters route.o/ 568272712 98 100 100664 4367 ` u!'H &.text  > .data  ( @.bss @ @p@DHLPT~X ,  ( rp! \WpQǞ\^hP^dQ^l'aP/Rndpǁ(q $z, z`l$  >$^hW (+((Lji$lǞ`P^lP^d(z* &z & z~XǎTǞPǮLǾHD@ppW8 ȧ~4p 8&z&&z.$z" ~488W`@D~HzznPY)' ^%# >%! ?Qa1\7Rb1D3Td1,&' 1Xh1 LL~Lp,p!Wpp$ "z$zgX(' n%# F%! ?Qa1`&! 7Rb1@&# 3Td1 &' 1Xh1z~HǎDǞ@``W@8~<p0r 0r  "TY ~<ǎ8@@Wh<@DHLPЧ~Tx (Pp!XW$z X'aP/Rpߡ\'aP/RpߡpQ^dz`)q r$z$ <H((^dW  u 0r !6 b 0r   Ӌ&z*$z $  rΆ XH 0  0  p`X%' l%# D%! ?Qa1l&! 7Rb1L&# 3Td1,&' 1Xh1 gX%' l%# D%! ?Qa1l&! 7Rb1L&# 3Td1,&' 1Xh1 $z $&(,` ~TǎPǞLǮHǾD@<hhWx8<@~Drpޠ0r p ޠ0r H0&nLY)' ^%# >%! ?Qa1P7Rb183Td1 &' 1Xh1n\X(' ^%# >%! ?Qa1P7Rb183Td1 &' 1Xh1 H~l~Dǎ@Ǟ<Ǯ8xxW @(#)route.c 6.1 87/11/24 rtfree` b t v   b d  t v                  8 : B R       V X \ ^       D F  P     ( * V X  r t  | ~      t v ~     h  .text >.data (.bss @SaveReg _rtalloc_rthost_bcmp_rtnet_rtstat _rtfree_panic_rttrash_m_freel$_rtinit_rtioctlx_suser_u2_spl7=_m_get_splx_bzero_mbstat L_mbfree_mclfree_ipintrqY_rpintrq_ifnetc_afswitch_wildcard_rtredirect_if_ifwithnet_rtrequest_if_ifwithaddr_nmbclusters_rawintrq ...LIBIN.a! / 568272953 0 0 0 5152 ` |dddddddddddddddddddd#######################2D2D2D2D2D2D2D2D888888888888888GGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGeeeeeeeeeeeeeeeeeeq@q@q@q@q@q@q@q@q@q@q@q@q@q@q@q@q@q@q@q@q@q@wRwRwRwRwRwRwRwRwRwRwRwRwRwRwRwRwRwRwRwRwRwRwRwRwRwRwRwRwRdddddddddddddddddddddddBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB֘֘֘֘֘֘֘֘֘֘֘֘֘֘֘֘֘֘֘֘֘֘֘֘֘֘֘֘֘֘XXXXXXXXXXXXXXXXXXXXXXSaveReg_loattach_loif_loioctl_looutput_ipintrq_mbstat_nmbclusters_mbfree_mclfree_rawintrq_rpintrq_ifnet_rthost_rtnet_rtstat_domains_ipstat_ipq_ip_idSaveReg_inet_hash_in_netof_inet_netmatch_if_makeaddr_in_lnaof_if_rtinit_mbstat_nmbclusters_mbfree_mclfree_domains_ipintrq_rawintrq_rpintrq_ifnet_rthost_rtnet_rtstatSaveReg_in_pcballoc_in_pcbbind_ifnet_zeroin_addr_in_pcblookup_in_pcbconnect_in_pcbdisconnect_in_pcbdetach_in_setsockaddr_in_setpeeraddr_in_pcbnotify_mbstat_nmbclusters_mbfree_mclfree_domains_ipintrq_rawintrq_rpintrq_rthost_rtnet_rtstatSaveReg_mbstat_nmbclusters_mbfree_mclfree_domains_inetdomain_inetswSaveReg_icmp_error_icmpstat_icmp_reflect_icmp_input_iptime_icmp_send_mbstat_nmbclusters_mbfree_mclfree_rthost_rtnet_rtstat_domainsSaveReg_ip_init_ip_protox_ipq_ip_id_ipqmaxlen_ipintrq_ifinet_ipintr_ipstat_ipcksum_ip_dooptions_ipaddr_ip_forward_ip_reass_ip_freef_ip_deq_ip_enq_ip_slowtimo_ip_drain_ip_stripoptions_ip_ctlinput_inetctlerrmap_ipprintfs_ipforwarding_mbstat_nmbclusters_mbfree_mclfree_rawintrq_rpintrq_ifnet_rthost_rtnet_rtstat_domainsSaveReg_ip_output_ip_id_ip_optcopy_mbstat_nmbclusters_mbfree_mclfree_ipintrq_rawintrq_rpintrq_ifnet_rthost_rtnet_rtstat_domains_ipstat_ipqSaveReg_rip_input_ripdst_ripproto_ripsrc_rip_output_mbstat_nmbclusters_mbfree_mclfree_ipintrq_rawintrq_rpintrq_ifnet_rthost_rtnet_rtstat_rawcb_domains_ipstat_ipq_ip_idSaveReg_tcp_trace_tcp_debx_tcp_debug_tcpstates_tanames_prurequests_tcptimers_mbstat_nmbclusters_mbfree_mclfree_rthost_rtnet_rtstat_ipintrq_rawintrq_rpintrq_ifnet_domains_ipstat_ipq_ip_id_tcp_iss_tcp_alpha_tcp_beta_tcb_tcpstat_tcpconsdebugSaveReg_tcp_input_tcpstat_tcpcksum_tcpprintfs_tcb_tcp_saveti_tcp_dooptions_tcp_iss_tcp_reass_tcp_alpha_tcp_beta_tcp_pulloutofband_mbstat_nmbclusters_mbfree_mclfree_ipintrq_rawintrq_rpintrq_ifnet_rthost_rtnet_rtstat_domains_ipstat_ipq_ip_id_tcp_debug_tcp_debxSaveReg_tcp_output_tcp_outflags_tcp_setpersist_mbfree_mbstat_tcp_initopt_tcp_beta_nmbclusters_mclfree_rthost_rtnet_rtstat_domains_ipstat_ipq_ip_id_tcp_iss_tcp_alpha_tcb_tcpstat_tcp_debug_tcp_debxSaveReg_tcp_init_tcp_iss_tcb_tcp_alpha_tcp_beta_tcp_template_tcp_respond_tcp_newtcpcb_tcp_drop_tcp_close_tcp_abort_tcp_drain_tcp_ctlinput_mbstat_nmbclusters_mbfree_mclfree_rthost_rtnet_rtstat_ipintrq_rawintrq_rpintrq_ifnet_domains_ipstat_ipq_ip_id_tcpstat_in_cksumSaveReg_tcp_fasttimo_tcb_tcp_slowtimo_tcp_iss_tcp_canceltimers_tcp_timers_tcpexprexmtbackoff_tcp_backoff_mbstat_nmbclusters_mbfree_mclfree_ipintrq_rawintrq_rpintrq_ifnet_rthost_rtnet_rtstat_domains_ipstat_ipq_ip_id_tcp_alpha_tcp_beta_tcpstat_tcpnodelackSaveReg_tcp_usrreq_tcp_attach_tcp_disconnect_tcp_iss_tcp_usrclosed_tcpsenderrors_tcp_sendspace_tcp_recvspace_tcb_mbstat_nmbclusters_mbfree_mclfree_ipintrq_rawintrq_rpintrq_ifnet_rthost_rtnet_rtstat_domains_ipstat_ipq_ip_id_tcp_alpha_tcp_beta_tcpstat_tcp_debug_tcp_debxSaveReg_arpattach_arpcom_arptimer_arpt_age_arptab_arptfree_arpwhohas_etherbroadcastaddr_arpresolve_arptnew_arpmyaddr_arpinput_mbstat_nmbclusters_mbfree_mclfree_ipintrq_rawintrq_rpintrq_ifnet_domainsSaveReg_udp_init_udb_udp_input_udpstat_udpcksum_udp_in_udp_abort_udp_ctlinput_udp_output_udp_usrreq_mbstat_nmbclusters_mbfree_mclfree_ipintrq_rawintrq_rpintrq_ifnet_rthost_rtnet_rtstat_domains_ipstat_ipq_ip_idif_loop.o/ 568272724 98 100 100664 2332 ` u!'T%.texth<! .datahhH@.bssH<@~DpχhY3Qa1A `T:Pf\~Dǎ@Ǟ<HHWP@DH~Lqhh 0 2&!!!  '|! q!r|!q!!4 )zld`` H~LǎHǞDǮ@PPWP<@DH~Lp (i " z @ gY%' n%# F%! ?Qa1`&! 7Rb1@&# 3Td1 &' 1Xh1χnX3Qa1 nX3Qa1Ћ Π ~LǎHǞD Ǯ@Ǿ<PPW @(#)if_loop.c 6.1 87/11/24 lolo%d: can't handle af%d <<$<*<4<><J<\ < < <<<<<< <<$<,<f<h<t<<<<<< <6 <<"<2 <D<.texth!.datahH.bssSaveReg _loifx_loioctl%0_spl7_ipintrq_m_freem_splx;_wakeup_printfEO_mbstat Y_mbfree_mclfreef_rpintrq_ifnet_rthost_rtnet_rtstat _domains_ipstat_ipq_ip_idp_loattach_if_makeaddr_looutput_if_attach_if_rtinit_wbetopen_in_netof_in_lnaof_nmbclusters_rawintrqin.o/ 568272733 98 100 100664 1525 ` u!']x.textT .data 4@.bss@8~<pnW3Qa10~<ǎ8@@W@8~<qnX3Qa1nW3Qa1~$, ( hY3Qa1 z'  ( '÷n$X3Qa1 (,>$ ~\ǎXǞTǮPǾLH``W`HLPT~Xp!zzt  ZXnX3Qa1  ϑ$n\W3Qa1 n\Y3Qa1ǷnX3Qa1è\$(,>$ *`0dgY3Qa1g X3Qa1~XǎTǞPǮLǾH``W8 z 88W8 ȧ~4p !$ '!'! ~488W@8~<!1#r !!!rhgX3Qa1~<ǎ8@@W@8~<!1#r !!!rgX 3Qa1~<ǎ8@@WP?8<@DH~Ltx6 + w"VwWx ,~LǎHǞDǮ@Ǿ<8PPW( ا ~D>L0ǾDLǞT  ^^VVV@~RGp@p" ApǮLzh Ap p2 A$p ǮDzàp q, At@  @ e~ǎǞǮ Ǿ(W @(#)in_pcb.c 6.1 87/11/24 *R t   6 bd@BZdr 8 H  .text0.data0 .bssPSaveReg _spl7_splx_ifnet'_u6CQ`jx_sofree_rtfree_m_freed_bzerod_mbstat _mbfree_mclfree_domains_ipintrq_rpintrq_rthost_rtnet_rtstat _in_pcballoc_m_getclr_in_pcbbind_if_ifwithaddr_zeroin_addr_in_pcblookup_in_pcbconnect_in_netof_if_ifonnetof_if_ifwithaf_in_pcbdisconnect_in_pcbdetach_in_setsockaddr_in_setpeeraddr_in_pcbnotify_nmbclusters_rawintrqin_proto.o/ 568272753 98 100 100664 1603 ` u!'q!.text .data(@.bss(( @(#)in_proto.c 6.1 87/11/24 8 internet$(,DT\`l .text.data(.bss(SaveReg _mbstat _mbfree_mclfree_domains _inetsw8_ip_init(5?KVdpz_nmbclusters_inetdomain_ip_output_ip_slowtimo_ip_drain_icmp_input_udp_input_udp_ctlinput_udp_usrreq_udp_init_tcp_input_tcp_ctlinput_tcp_usrreq_tcp_init_tcp_fasttimo_tcp_slowtimo_tcp_drain_rip_input_rip_output_raw_usrreq ip_icmp.o/ 568272765 98 100 100664 3717 ` u!'} P".text@lB .data@@ @.bssX?@DHLP~Txp z |,z"|,q (`8p! !!  ( xz(z,q (z r ~TǎPǞLǮHǾD@XXWXDHLP~T!ÐzxpTT!z:z"#!!*!!1#rò ' XX^ ( Jp!d!!d'0(200(20p""pW"4  xh' ' $)'x(/p""9() \\'"0,#2#0 WrPP^*\\6v $xp)(\\N`W3Qa1`W3Qa1̓`X 3Qa1`X3Qa1  0̓B,z*z``B ^~TǎPǞLǮHǾDXXW@~8pn_inetsw_iptimeIU`Pk_spl6_lbolt_splx_mbstat v_mbfree_mclfree_rthost_rtnet_rtstat _domains_icmp_error_icmpstat_icmp_reflect_icmp_input_in_cksum_ip_protox_rtredirect_raw_input_icmp_send_ip_output_nmbclusters_icmproto ip_input.o/ 568272787 98 100 100664 7740 ` u!'XG.text4 .data@.bss@~<p8 00,!pBz0Wz&zz  ,,p (P2PP ` ~<@@WH8<@~D |(z,(qxp!z!4f  z(qh,,  4zz(z"(  Lj>Xz%z!z t B!' j!( z' B`tW3Qa1p >'1 #,' 1# '1#' 1 # !'z9z"#' ''z"0 # !''z"p#'' 'z" 4pTxp    ,W~Dǎ@Ǟ<Ǯ8HHWP<@DH  ~L xp   zz V !!rޠ2qz   hY 3 Qa1hY3Qa1x"x zzw W\ %õzzz@ z  Hz+zz+ztg)ùWzz"zz0z+zz+z Fw  @)z"z'z"y x "z w z x    *.w w  ǘ i X3Qa1iX3Qa1((   z     f~LǎHǞDǮ@Ǿ<PPW@48~ 4\ 4^ 4 4 4 4 4 4 4 4444444444T4`4b4j4444444444 4 44\4^4f4444444444464x4z4 4 4 4 4, 4!444"4#44"4> 4&4&4:"4X#4h'4 4 4"4,#4<'4"444#4 4 4 #4 <4 >4 J4 L4 P4 R4 "4 >4 D4 *4 $+4 4 4 4 4 4 64 <4 v,4 -4 (/4 B/4 4 4 24 24 34 34 44 4 54 54 64 6444<44844!4 4:44;4F 4-4.text.data.bssSaveReg _ip_init_panic_inetsw_lbolt_ipq_ip_id(`_ipintrq3_ifinet_ipintr @_ipstat_ipcksumhJ_m_adjT l_ipaddrpbq$}T_m_freem_m_get_spl7_splx_ip_deq_ip_enq`_m_cat_m_free 0_iptime _bcopy t_tcb_udb_printf(_m_copy6_mbstat A_mbfree_mclfreeN_rpintrq_ifnet_rthost_rtnet_rtstat _domainsX_pffindproto_ip_protox_inetdomain_ipqmaxlen_if_ifwithaf_m_pullup_in_cksum_ip_dooptions_if_ifwithaddr_ip_forward_ip_reass_ip_freef_ip_slowtimo_ip_drain_in_netof_if_ifonnetof_icmp_error_ip_stripoptions_ip_ctlinput_inetctlerrmap_tcp_abort_in_pcbnotify_udp_abort_ipprintfs_ipforwarding_ip_output_nmbclusters_rawintrqip_output.o/ 568272800 98 100 100664 2822 ` u!'$.textH .dataHH @.bsshh<@DHLP~TP^t *p >t's2 !xx !'>   @ z @  'ώX>X^phW3Qa1  LnW3Qa1 PǑ,(((h$zV^pnW 3Qa1H  ^pnT3Qa1D z   ͋)zz" W)zz"<W t  9P.p Wz @  `YntzUV Q^|X @z P^x^tPR^lЎ nt|-aW'' l%# D%! 0Qa1t&! 9Rb1T&# 4Td14&' 1Xh1 ^lP .xxs.|nx&ntz$znx\zU^|^|z \ z x.|   r t d 9P.p W (^xn|V^xntznx  XD  8XP.&z؋&z&~TǎPǞLǮHǾD @<WX?@D0HLP ~TpxpF>   +{ q ~TǎPǞLǮH ǾD@XXW @(#)ip_output.c 6.1 87/11/24 N    * 4 P bhz*.textH.dataH .bsshSaveReg _m_free_ip_id_bzero_rtalloc'1_m_get;t_m_copy_m_freem_rtfree_bcopy_mbstat G_mbfree_mclfree_ipintrqT_rpintrq_ifnet_rthost_rtnet_rtstat _domains_ipstat_ipq^_ip_output_in_netof_if_ifonnetof_in_lnaof_in_cksum_ip_optcopy_nmbclusters_rawintrqraw_ip.o/ 568272809 98 100 100664 1494 ` u!' .text .dataHD@.bssH@~D(q `W3Qa1`W 3Qa1 0ؓ~Dǎ@HHWXDHLP~Tǹxwzp$p ΀h'  Dz&+z ΀P  h[3Qa1+00|n~TǎPǞLǮHǾDXXW @(#)raw_ip.c 6.1 87/11/24 *6Nlrx~  .text .dataH.bssSaveReg _ripdst_ripsrc$_m_get0_m_freem_mbstat ;_mbfree_mclfree_ipintrqH_rpintrq_ifnet_rthost_rtnet_rtstat _rawcbH_domains_ipstat_ipq_ip_idR_rip_input_ripproto_raw_input_rip_output_ip_output_nmbclusters_rawintrqtcp_debug.o/ 568272822 98 100 100664 4481 ` u!'&.textxD .dataxx /@.bss`LPTzXz~\r߰d  {pk8W'' n%# F%! 0Qa1`&! 0Rb1@&# 0Td1 &' <Xh1 8h䆀k X(' l%# D%! 0Qa1`&! 0Rb1@&# 9Td1 &' 4Xh1 (<4p"p! p`z…pW (Ǩ zz910 1 z91 012#x(&f!!"  >(!0 # ( ܓ(!! 0 ԓ(!$ 8 ̓(!( @ H(!0 # P zN pXQ  spPX,pzp `pND'B7HG(z"N(G,N,GThN04'87@~\ǎXǞTǮPǾL``W @(#)tcp_debug.c 6.1 87/11/24 *** %s>,URG,,RST,FIN,ACK,SYN<%x%s %x %s:???????? [%x..%x)@%x, urp=%x%s%s%s%s%s%s%s%s%s%sPUSH%s%s<%s> -> %s rcv_(nxt,wnd,up) (%x,%x,%x) snd_(una,nxt,max) (%x,%x,%x) snd_(wl1,wl2,wnd) (%x,%x,%x)  $0<HT\dp| ATTACHDETACHBINDLISTENCONNECTACCEPTDISCONNECTSHUTDOWNRCVDSENDABORTCONTROLSENSERCVOOBSENDOOBSOCKADDRPEERADDRCONNECT2FASTTIMOSLOWTIMOPROTORCVPROTOSENDCLOSEDLISTENSYN_SENTSYN_RCVDESTABLISHEDCLOSE_WAITFIN_WAIT_1CLOSINGLAST_ACKFIN_WAIT_2TIME_WAITREXMTPERSISTKEEP2MSLinputoutputuserresponddrop(*8D F JL\b       $nx      "(. 4DJP Vjpv |     0: LR   $(,048<@DHPTX\`dhlp.textxD.datax/.bssSaveReg >_iptime_bzero$ _printf_tanames`/<P_mbstat G_mbfree_mclfree_rthost_rtnet_rtstat _ipintrqT_rpintrq_ifnet_domains_ipstat_ipq_ip_id_tcp_iss^i_tcb8_tcpstatsx_tcp_trace_tcp_debx_tcp_debug_tcpstates_prurequests_tcptimers_nmbclusters_rawintrq_tcp_alpha_tcp_beta_tcpconsdebug tcp_input.o/ 568272853 98 100 100664 8984 ` u!'D.text\r .datal@.bsspHLPTX\~`Pp^^| x( |(z (!6 (~2*XzU^%n     $$N0nX 3Qa1x. xp nL0nX 3Qa1+h ^[^X  4  P j^*^(%%z" ^%zz"^*zz"0(#!z+z""&nX 3&Qa1øn$X3Qa1(,>$+Ў } p zW^^zU`^X(' ^%# >%! 0Qa1H0Rb109Td14Xh1zR . ^|Q^|mX3Qa1} XZ^P P^,$&z"zBBz Bzؔ ȋ    D PP ^^%kX 3Qa1nd]3Qa1 mX3Qa1 .m^d3Qa1 xp 0 ^m^d3Qa1p < @L<0T,(LDZP^|  $'<Q'T$  p(,'( ', LD! ('<" , p h WBzz%*zz B ! !4BzBD( X z"z  ! !ǷDa@ !X& !!(&  X zz|  z+z(& ( !(& ! !&B'DX z(z6z  | z+z ! !z*z  z8pXzNJpWpjpTpDp  z…p W(('TL((,'( ',  B4'(<'T vǸ(WZkz'\` *z)`` %'Q'0?@^p41Zz9530@N@:6` %'Q'0?@^h41Zz953@N 7`Z'T H` %   z   z < ' Z\2< ԋ<z^z'0(b^P$z ^z('0F'D7,(,^PP^ v   8( : z ( z"!(0|  `^P p4$z ^z('0N F|  6~`ǎ\ǞXǮTǾPLHW8  ~41qzwL@@DA 100,B4@BBBsp~488WH@ ~D1&1 pzzZGAA $!e!d (!d$z1#z(wz0p0~Dǎ@HHWP<@DH~L $ǰqRlj Lj  ZLjè z< z   z*z Lj 'z( X z%!.(!(z1z%#( (0 #PLj h&!X%!j bkLjRqx4z] y)D z z  )Dz!)D!'!'!w z  슋 $z'D! $^ F~LǎHǞDǮ@Ǿ<PPW @(#)tcp_input.c 6.1 87/11/24     $ $  $ z  (  @@@8tcp sum: src %x tcp off: src %x off %d tcp_pulloutofband\\ \ \ \ \\ \\.\4\8 \: \B \j\\\ \ \ \ \ \ \ \\@\x\\\\B\D\\\P\z\\\\\\\\\p\\\p\\\\\ \ \ (\ D\ t\ \ D \ F \ ~ \ \ !\ !\ ,"\ L"\ ~#\ \ $\ %\ $\ \ &&\ x(\ z(\ )\ *\ \%\.$\V\X\b+\j,\\\+\-\\"-\\-\l.\\\\+\)\.\p\\.\4/\\V\r0\1\)\0\1\40\R1\x)\2\#\)\\\\ \\\\\ \$\(\,\0\4\8\<\@\D\H\L\P\X\\\`\d\h\l\p\t\.textr.data.bssSaveReg  _tcpstat*4>_printf_m_get_bcopy_tcb8JX(do~_m_free_tcp_issT_m_adj_sbdrop /B_m_freemO^iu_soabort_panic_spl7_splx_mbstat _mbfree_mclfree_ipintrq_rpintrq_ifnet_rthost_rtnet_rtstat _domains_ipstat_ipq_ip_id>_tcp_input_ip_stripoptions_m_pullup_tcpcksum_in_cksum_tcpprintfs_in_pcblookup_tcp_saveti_sonewconn_tcp_dooptions_in_pcbconnect_tcp_template_in_pcbdisconnect_tcp_drop_soisconnected_tcp_reass_tcp_close_tcp_alpha_tcp_beta_sbwakeup_soisdisconnected_tcp_canceltimers_sohasoutofband_tcp_pulloutofband_tcpnodelack_socantrcvmore_tcp_trace_tcp_output_tcp_respond_sbappend_nmbclusters_rawintrq_tcp_debug_tcp_debxtcp_output.o/ 568272870 98 100 100664 3490 ` u!' ).textPD" .dataPPh@.bssxHLPTX\~`p$ǰWTЧ^d(RP^dP^hW,^p(Q^p'@k<z&( z'@np gz zQ^hzQ^l+<(z"!,  Q^ll0'( bzdp+<z"!'@p( ,'T  $&zz4+&7PDz"10daP/R #(@@0_tcp_output_tcp_outflags_tcp_setpersist_tcp_initopt_in_cksum_tcp_beta_tcp_trace_ip_output_nmbclusters_tcp_alpha_tcp_debug_tcp_debxtcp_subr.o/ 568272885 98 100 100664 3448 ` u!'1.text .data@@@.bss@@PPP?fff@W@~$@@W @(#)tcp_subr.c 6.1 87/11/24      * 6 Z  "B(.DL\    $(,048<.text.data@.bss@SaveReg _tcp_iss_tcb8#D_m_get18_m_freem>HStaku`8_spl7_splx_m_free_mbstat _mbfree_mclfree_rthost_rtnet_rtstat _ipintrq_rpintrq_ifnet_domains_ipstat_ipq_ip_id_tcpstat_tcp_init_tcp_alpha_tcp_beta_tcp_template_tcp_respond_in_cksum_ip_output_tcp_newtcpcb_m_getclr_tcp_drop_tcp_output_tcp_close_tcp_abort_soisdisconnected_in_pcbdetach_tcp_drain_tcp_ctlinput_inetctlerrmap_in_pcbnotify_nmbclusters_rawintrqin_cksum.o/ 568272890 98 100 100664 987 ` u!'.text .data@.bss8p"9p8,0,ap9,0,appbp9309,0,bdF9709,0,dhgf9,,hfgd9,db9,ba9p8,pPb9309h5,0,bdR9709h5,0,dh gf9h5,hE,hfgd9h5,db9h5,ba9,p0,(" b`pF  a a n@Ǟ<8HWin_cksum: out of data .text.data.bss_printf_in_cksumdoNextBufstartEvenoddLeftoversum2bytessum4bytessum1oddBytedoOddWordsum2oddBytessum4oddBytessumOddLoopcheckDone tcp_timer.o/ 568272904 98 100 100664 2638 ` u!($*.text .datah<@.bss@8~G 'D(1( XZnp~DHHW @(#)tcp_timer.c 6.1 87/11/24 ???33?ٙ@@@@AAB  b j l x    * d f np| "\  p.text.datah.bssSaveReg _spl7_tcb8_splx,_tcp_iss8JVak_mbstat _mbfree_mclfree_ipintrq_rpintrq_ifnet_rthost_rtnet_rtstat _domains_ipstat_ipq_ip_id_tcpstat_tcp_fasttimo_tcp_output_tcp_slowtimo_tcp_usrreq_tcp_canceltimers_tcp_timers_tcp_close_tcp_drop_tcpexprexmtbackoff_tcp_backoff_tcp_setpersist_tcp_respond_nmbclusters_rawintrq_tcp_alpha_tcp_beta_tcpnodelacktcp_usrreq.o/ 568272919 98 100 100664 4483 ` u!( =.textL5 .data @.bsshDHLPTXЧ~\ǘ^`z`y WzU^d P^d HDp8W:І &z z xp zpp І Ў   r l ZV  D62Z< @<0T,(Ћp `Y 3Qa1prЋfbX<RJІ"pXzz@ d  e(<>z"z ! <'(z<0hZH D: 4*$p p  p$zd('0` ~\ǎXǞTǮPǾLHDhhWH@~D pPl 6pR΀.~Dǎ@HHW@8~<p$ǀzp\z  zp0$4p ~<ǎ8@@W8 ȧ~4pz:6pW6p pz$~488W @(#)tcp_usrreq.c 6.1 87/11/24  4Lp8(tX tcp_usrreq<LZ Lv LL( L: LZ L~ LLLLLLLLLLLxLLLLLLLLLrLLLLLLLLL& LnLtL|!L"L"L#L$L%L LHLX&Lb'LzLL L(L8L<L@LDLHLLLPLTLXL\L`LdLhLlLpLtLxL|LLLLLLLLL.text5.data.bssSaveReg _spl7_splx\,7CR`r_tcp_iss_m_freem_panic%_tcb80=KY_sbflushl_mbstat ~_mbfree_mclfree_ipintrq_rpintrq_ifnet_rthost_rtnet_rtstat _domains_ipstat_ipq_ip_id_tcpstat>_tcp_usrreq_tcp_attach_tcp_disconnect_tcp_close_in_pcbbind_in_pcbconnect_tcp_template_in_pcbdisconnect_soisconnecting_tcp_output_socantsendmore_tcp_usrclosed_sbappend_tcpsenderrors_tcp_drop_in_setsockaddr_in_setpeeraddr_tcp_timers_tcp_trace_tcp_sendspace_tcp_recvspace_soreserve_in_pcballoc_tcp_newtcpcb_in_pcbdetach_soisdisconnecting_soisdisconnected_nmbclusters_rawintrq_tcp_alpha_tcp_beta_tcp_debug_tcp_debx if_ether.o/ 568272936 98 100 100664 3968 ` u!(( (.text ; .datax@.bssxx0 * 00WH@~D2 . r <jp< #( q_~Dǎ@HHW`<@DH~L *(z"|(qϮRpp&`  x&( $ $ P9P .PW~LǎHǞDǮ@Ǿ<``Wh?@DHLPnX3~TQa1pp&nj*8#:n\X3XQa1.X(& z @ x#c  s    ؓ(0az   z  q'8# rpp*p   \X &8 0,    8 ~TǎPǞLǮHǾD@hhW `Px3xQa1WpPTX\~` z,nY3Qa1 p $&$x& .P(' 7 G N(G N,G \N0`.0az   z  ߁(># L&@"  ( tx9P .tW. ,<&" |&$ x&$~ώf&f d9P .dW  >~`ǎ\ǞXǮTǾPW@8~<p   ~<ǎ8@@W@80~< az  zp' *G#($ 4 rq(gX3Qa1~<ǎ8@@W @(#)if_ether.c 6.1 87/11/24 duplicate IP address!! sent from ethernet address: %x %x %x %x %x %x   , . 8             R       ~       2 ` b       2 < D       F P     , T d t      6    .text;.datax.bssxSaveReg _arpcom\_timeout_arptabl#-,_m_get_bzero8p_bcopyL8X_loifb_spl7_arptnewT_splx_m_freeml0wd_bcmp_printf_mbstat _mbfree_mclfree_ipintrq_rpintrq_ifnet_domains_arpattach_arptimer_arpt_age_arptfree_arpwhohas_etherbroadcastaddr_arpresolve_in_lnaof_looutput_arpmyaddr_arpinput_nmbclusters_rawintrqudp_usrreq.o/ 568272952 98 100 100664 4868 ` u!(8 ;.text\A .data h@.bssPPPWXLP~T|(z,(qx%(^Wz,zz&RJ  ҋ(nW 3Qa1×n$W3Qa1(,>$)nBnW3Qa1D#.`W 3Qa1z $(0$~TǎPǞLXXW8 ~4qph~488W@  L'p0W2.*2 .$#>$@@WP@DH~Lxwzpp`' h Z3 Qa1hZ 3Qa1   &ڣV !z"0 #1z3 1 2 ~LǎHǞDǮ@PPWX@DHL~PpǰzΠ ΠޅpPW Π !  Π | lΠd ΠT h Z8Π0Π( Π .&LnT[3Qa1 Π   Π & k^T3Qa1d zrjH \: L*ΠΠ"  ~PǎLǞH ǮDǾ@XXW @(#)udp_usrreq.c 6.1 87/11/24  Tl|udp_usrreq\ \\\d \p \r \z \ \ \ \ \ \\\ \ \* \0\\\\\\\\(\2\J\X\\\\\\\\\b\p\\(\x\\\\"!\>"\d#\r$\%\&\\\'\&%\b\#\(\\)\*\\+\\0\4\8\<\@\D\H\L\P\T\X\\\`\d\h\l\p\t\x\|\\\\\\\\\\\.textA.data.bssSaveReg _udb8(_udpstat #_m_adj4>_m_freemHV`_udp_inlz|(_m_get'3BQ_sofreeaq_panic_mbstat _mbfree_mclfree_ipintrq_rpintrq_ifnet_rthost_rtnet_rtstat _domains_ipstat_ipq_ip_id_udp_init_udp_input_m_pullup_ip_stripoptions_udpcksum_in_cksum_in_pcblookup_in_lnaof_icmp_error_sbappendaddr_sbwakeup_udp_abort_in_pcbdisconnect_soisdisconnected_udp_ctlinput_inetctlerrmap_in_pcbnotify_udp_output_ip_output_udp_usrreq_in_pcballoc_soreserve_in_pcbdetach_in_pcbbind_in_pcbconnect_soisconnected_socantsendmore_in_setsockaddr_in_setpeeraddr_nmbclusters_rawintrq...LIB1.a! / 568937578 0 0 0 7938 ` eFFFF)$)$)$)$)$)$)$)$9999999999999999999XhXhXhXh[[[[bbbbbbbbbbbrrruuuuuuuuuuuuuu44444ǒǒǒǒǒǒǒǒǒǒǒTTTTTTTTTTTTTTTTTTT66666llllllllFFFF!D!D!D!D!D!D!D!D!D!D!D!D!D!D!D!D!DBBEEEJJJJJJJJR$R$R$R$R$R$R$R$R$R$^V^V^V^V^V^V^V^V^V^V^Vnnnnsvsvsvsvsvsvsvsv}0}0}0}0}0}0}0}0}0}0}0FFFFFFFFFFFFFFFFFFFFFFF****************       &&&.....................cccckkkkkkkkkkkkk$$$$$$$HHHHHHHHHHHHrrrrrrrrrrrrrrrrrXXXXLLLLLLLLLLLLL((((((((((((((((((((((((((((((((QxQxQxQxQxQxWWWppppxxxxxxXXXXXX4444@@nnnn<<<<<<<<<<<<<<<<<<<<<<<''''''''''''''''''''''''''OOOOOOOOOOOOOOOOOOOOOOOOOl\l\l\l\l\l\SaveReg_sysacct_acct_compressSaveReg_alloc_getfs_badblock_free_ialloc_ifree_updateSaveReg_bread_getblk_iowait_breada_incore_brelse_bwrite_bdwrite_bawrite_geteblk_iodone_clrbuf_bflush_binval_binit_sbuf_bufstart_bdflushSaveReg_setmask_sbittab_cbittabSaveReg_bldblklst_bldindr_freeblklstSaveReg_clock_switching_new_scheduler_slice_ticks_lbolt_lticks_time_vhandcnt_bdflushcnt_slice_sizeSaveReg_debug_setlevSaveReg_errinit_geteslot_freeslot_geterec_puterec_logstart_logtchg_logstray_blkacty_fmtberr_fmtraerr_logberr_logmemorySaveReg_exece_gethead_getxfile_get410_execregSaveReg_exit_pexit_wait_freeprocSaveReg_pfault_vfault_pageincache_killpageSaveReg_getf_closef_ffreelist_openi_access_owner_suser_ufalloc_falloc_finitSaveReg_findfid_fids_allocfid_frfid_freefid_flckinit_frlock_insflck_delflck_regflck_flckadj_blocked_getflck_convoff_setflck_deadflck_sleeplcks_cleanlocksSaveReg_newproc_procdup_makechild_uaccessSaveReg_vhand_getpgslim_ageprocess_ageregion_getpages_swapchunk_memfreeSaveReg_sbreak_uclear_growSaveReg_inoinit_ifreelist_hinode_iget_iread_iput_itrunc_iupdat_itrunc2_s5itrunc2_s5tloop_maknode_wdir_iflush_iinit_stat1SaveReg_ext_intrSaveReg_ipcaccess_ipcgetSaveReg_lock_textlock_datalock_proclock_punlock_tunlock_dunlockSaveReg_clkstart_clkset_sendsig_bcmp_setregs_clrmem_chksize_coredump_HeadwallDiagSaveReg_main_physmem_uservad_userpte_mmvad_mmpte_rootdir_maxmem_maxumem_maxuptsSaveReg_malloc_mfree_masktabSaveReg_iomove_pcopyin_pcopyout_schar_uchar_passc_cpassSaveReg_msgconv_msgctl_msgfree_msgfp_msgget_msginit_msg_msgrcv_msgsnd_msgsysSaveReg_nameiSaveReg_ptmemall_memreserve_freemem_ptfill_pall_premove_sptfill_pgtallocator_stfill_pfree_allocator_pbremove_pfind_pinsert_sptalloc_sptfree_meminit_firstfree_maxfree_ipflush_pmount_punmountSaveReg_startup_pgtalloc_pgtmap_ptmalloc_kpgtfree_pgtfree_pgtalloc_nptfree_getcpages_nptalloced_freepage_contmemallSaveReg_swap_physio_physckSaveReg_pipe_prele_openp_closep_plockSaveReg_printf_print_printc_pr_time_printn_pr_hour_pr_dst_panic_panicstr_prdev_prcom_assfail_provflSaveReg_useraccSaveReg_stop_procxmt_ptrace_ipc_dirtypage_ipcregSaveReg_readi_writeiSaveReg_reginit_reglock_regrele_allocreg_freereg_nullregion_attachreg_findpreg_chkattach_nullpregion_loadstbl_detachreg_dupreg_growreg_rptexpand_chkgrowth_loadreg_mapreg_findreg_chgprotSaveReg_sched_lockedreg_swapoutSaveReg_semaoe_semfup_semunp_semconv_semctl_semunrm_semexit_semget_seminit_semop_semundo_semsysSaveReg_shmattach_shmconv_shmctl_shmdt_shmexec_shmexit_shmfork_shmget_shmsysSaveReg_signal_psignal_issig_fsig_psig_coreSaveReg_sleep_hsque_wakeup_runq_runout_curpri_runrun_setrun_setrq_runin_curprocSaveReg_next_page_vadrspace_sys_sect_ksct_ksv_sz_kbase_ublk_ptbl_mktables_p0init_ublk_sgtbl_p0init_done_pfdat_startup_cinit_cfreelist_pfheadSaveReg_bmapSaveReg_swalloc_swapfind_swfree1_swpuse_swpinc_swapadd_swapdel_getswap_swaprem_unswapSaveReg_qswtch_swtch_lastprocSaveReg_exec_rexit_forkSaveReg_read_rdwr_write_sorwuio_open_copen_creat_close_seek_link_mknod_saccessSaveReg_fstat_stat_dup_truncate_ftruncate_fcntl_ioctl_stty_gtty_mgetdev_smount_sumount_swapfuncSaveReg_gtime_ftime_stime_setuid_setreuid_getuid_geteuid_getegid_setgid_setregid_getgid_getpid_setpgrp_sync_nice_unlink_chdir_chdirec_chroot_chmod_chown_ssig_kill_times_profil_alarm_pause_umask_utime_ulimit_rebootSaveReg_syscall_nosys_nullsys_nodev_nulldevSaveReg_sysent_nsysentSaveReg_traptoround_roundtotrap_sysmachdepSaveReg_xalloc_xumount_xuntext_xrele_swapclupSaveReg_timelap_timetoYMDHMS_YMDHMStotimeSaveReg_timeout_timeid_untimeout_timein_delaySaveReg_trap_addupc_clk_straySaveReg_utssysSaveReg_procfind_ufavail_uiomove_selwakeupSaveReg_domaininit_domains_pffasttimo_pfslowtimo_pffindtype_pffindproto_pfctlinputSaveReg_mbinit_m_clalloc_mclfree_mbstat_m_free_m_pgfree_m_expand_m_get_mbfree_m_more_m_getclr_m_freem_m_copy_m_cat_m_adj_m_pullup_nmbclustersSaveReg_domains_unixsw_unixdomainSaveReg_socreate_mbstat_sofree_sobind_solisten_sorflush_soclose_soabort_sodisconnect_soaccept_soconnect_soconnect2_sosend_mbfree_mclfree_soreceive_soshutdown_sosetopt_sogetopt_sohasoutofband_nmbclustersSaveReg_soisconnecting_soisconnected_soqremque_soqinsque_sbwakeup_soisdisconnecting_soisdisconnected_sonewconn_socantsendmore_socantrcvmore_sbwait_soreserve_sbreserve_sbrelease_sbflush_sbappend_sbappendaddr_sbdrop_mbstat_mclfree_mbfree_nmbclustersSaveReg_socket_bind_getsock_sockargs_listen_accept_connect_socketpair_sendto_sendit_socksend_sendmsg_recvfrom_recvit_sockrecv_recvmsg_shutdown_setsockopt_getsockopt_getsockname_getpeername_mbstat_nmbclusters_mbfree_mclfreeSaveReg_uipc_usrreq_unp_attach_unp_detach_unp_bind_unp_connect_unp_connect2_unp_disconnect_unp_usrclosed_unp_internalize_sun_noname_unp_drop_unp_sendspace_unp_recvspace_unp_externalize_unp_discard_unp_gc_unp_gcing_unp_defer_unp_mark_unp_scan_mbstat_nmbclusters_mbfree_mclfreeSaveReg_soo_rw_soo_ioctl_soo_stat_soo_close_socinitacct.o/ 568270741 98 100 100664 2466 ` u!.textY .data |@.bss@~L N Z ^ ` h p x z      B D X \^bdlprx|~ ,028>HLNT^fnx.textY.data .bssSaveReg _sysacct_u_suser_acctp_plock_iput_uchar_namei_access_prele_acct0_acctbuf_bcopy_lbolt_writei_compressalloc.o/ 568270756 98 100 100664 4162 ` u! x#.text Q .datax 4@.bss `P@DHzz~Lppz zz!p" ǡz(.z^zZY&$$ ȓ, $Wzz 2zȓ0z  2zؓY~LǎHǞDǮ@PPWH| z| | | | | | | | | | | | | &| (| d| f| | | %| %| | | | | &| | | | | | '| (| | "| 6'| @)| N| T| X%| Z%| h%| *| *| +| +| | | ,| ,| $-| :| <| H,| J,| \| ^| v| x| | | | | | | ||*|,|4|:|H|T|V|`|z|.text.datah.bssSaveReg _bread_sysinfo_getblkp_bdevsw_u_iowait _breada_incore_brelse_bwrite`_bdwrite8_lbolt_bawrite_wakeup_spl6_splx_v_hbuf_spl0_panic_syswait_sleep_geteblk_iodone _clrbuf _bzero_bflush _binval _binit _maxmem_debug_sbuf_ksct_kbase_pbuf#_bdflush ._bfreelist_sptalloc_bufstart_pfreelistbitmasks.o/ 568270780 98 100 100664 764 ` u!4 .text .data@.bss @(#)bitmasks.c 6.1 87/11/24 ???? @ @ @ @.text.data.bssSaveReg _setmask _sbittab_cbittab(blklist.o/ 568270790 98 100 100664 1771 ` u!h.text .datap@.bssXHLP~T\ !z   qp?@|\ \*p"! **p8$ǣAq4'!() P7p2($#4(:z"GN(F  q!() ~TǎPǞLǮHXXW`?HLPTX~\p Y rNj$   f.T(t!:8(*Bpq   ( ~\ǎXǞTǮPǾLH``Wx@DH~L \ ^t   Ph tz  * !!! !pL.t !0  !.tP^tP^ty*\?0@ \~LǎHǞDǮ@xxW @(#)blklist.c 6.1 87/11/24 ip->i_map == 0blklist.cindlvl >= 0blklist.cip->i_mapblklist.c,2< |     @ 4Hd.text.datap.bssSaveReg _assfail_bldindrP_bread_u_brelsep%_pgtfree/_bldblklst_pgtalloc_freeblklst_pbremove clock.o/ 568270801 98 100 100664 4006 ` u! ).textt .data8<@.bssH<@~Dp@` .    p2 !  Ć  ! z Pz"z5zRz%  !  z"  !  z"  !  ! p!pd!!j'X1z3104z10421 z30 "1 z3z04104,20W P( Іj`؄N ((@'72s( zzz 2*!  1#   (! p~  88q (('q0< <q$(q \\`` ddhh.  !p~Dǎ@Ǟ<HHW @(#)clock.c 6.1 87/11/24 t t2 t< t> tF tH tp tr t| t t t tttttttttttttttttttt tttt"t&t(t2t4t<tLtNtXt^t`tdtftntttttttttt ttt t`tdtftntrttt|tttttttttttttttttttttttttt,t.tjt t tttttttttttt t!t!t!t""t$"t*!t.t0t4"t6"t>#t@#tH$tL%tN%tV%t^"t`"tf%tj&tl&tt$tx'tz't't't't$t.text.data8.bssSaveReg _clock_ccb_callout_timein_prfstat_prfintr_u_syswait_sysinfo%0?_curpri_runrun_lbolt_lticks_time_freemem_minfo_swaptab_proc_psignal_vL_tune_vhand_wakeupV_bdflush_runinbn_panicstr_addupc_clk_idle_addr_switching_new_scheduler_slice_ticks_vhandcnt_bdflushcnt_slice_sizedebug.o/ 568270810 98 100 100664 767 ` u!.textT .data 4@.bss@~<p.` (` ~<@@W0 Г "lh00W @(#)debug.c 6.1 87/11/24 TT. TH Tn T|T~T T T TT.text .data .bssSaveReg _debug_dblev_print_setlevd_suser_u_call_rbug errlog.o/ 568270823 98 100 100664 3961 ` u! .text\b .data <@.bss@$"! @@WH8<@'q~Dqzj ` 2 pps 0q2'p~Dǎ@Ǟ<Ǯ8HHWH<@~Dpz q s!~Dǎ@Ǟ<HHW@8~<|$" VPqp(~<ǎ8@@W8 ȧ~4px  r p( Q" `~488W@8~<4p6P ! (< pp gP^0Qa1&! 0Rb1`&# :Td1@&' 4Xh1 ~<ǎ8@@W@~<p q~<@@W@~<p q !n~<@@W@48~<p((FǗ( ,P  W' zq z5@ 42z3@ 4z3pz z   p 0 z4 0 z8 (" $$ *7 ,ÃB"2A~<ǎ8Ǟ4@@W@8~<pǀ(p, V *7 ,ǃ@4A'~<ǎ8@@W@~<p! . z  ~<@@W@8~<q q~<ǎ8@@W @(#)errlog.c 6.1 87/11/24 \\&\,\.\6 \:\<\B\F\H\N\ \\\ \ \\\( \.\0\>\@\H \P \ \\\\\\\\\\\\\\\\\\\ \0\2\< \@\B\L\T\V\Z\\\b\d\n\p\v\| \\\\\\\ \\\\\\\\\\\\\ \"\&\(\2\4\:\>\@\J\Z \l\n\\\n\p\.textb.data .bssSaveReg _errinit_err_mfreed_splhi_malloc_splx_geterect_sleep_puterec_time_wakeup_utsname_logtchg8"|_blkacty_fmtberr,\_logberr6dA_geteslot_freeslot_logstart_logstray_fmtraerr_logmemory exec.o/ 568270842 98 100 100664 7104 ` u!0.text t .data T@.bss h@DHLPT~XXX\ vP^dph `\ Y8Ǿ`\>64 ^dQ^dd Y( Y YYdB\# ptYdxǾ`p-p"ϑ8nd :nd* "q !*(d *($    'q jq !*(z\p`!b\T`!F~XǎTǞPǮLǾHD@hhWH<@~Dp @(W   I YFжx|x Y YzHǀ$ p u\ (!0(>    z$ Xz L aR q1E Pz z  q!0q1z@ XzN8AzD@&AGAB@YF@@(A@z@ Y#VYDp~Dǎ@Ǟ<HHW`DHLPTX~\d}T z2z!(0|ǍpdqhpL,!!  !z'02n# "0# *0#J4 L0 # L0 L0 # L L0 # Lq (! kz  x$X r  ְ֠{ q @ ('2p v01z  0)(`,)(4  1q<  q!# 4(0H4& pq!(0܋~d  H   Z   \dZdd z  Y~\ǎXǞTǮPǾLHD``WXDHLP~T֐p ְ( 2J0 '(|֐(z"z)+"q,21(#*X 䶰tx|xZ q)"q,! 4(0pb~TǎPǞLǮHǾDXXW @(#)exec.c 6.1 87/11/24 , t. t6 tV tX  th  t|  t  t  t  t  t  t& t6  t: t<  tv tx  t t  t t t  t t  t t t t  t t( t, t.  tz t|  t t  t t  t t t t t4 tf  tv  t  t t t  t  t t  t t t  t t t  t  t t  t  t t  t  t(  t2 t4  t> tF  tJ tL  t\  tf  tn t  t t  t t  t t  t t  t  t  t t  t  t t  t t  t t  t t  t8 t: tf  tv tx t  t t t  t  t t  t t  t"  t4! tL tN  t\" td# tp tr  tz$ t% t  t t  t t  t"  t, t.  t:  tD tF  tR  tZ t\  tf th  t' t t  t t  t  t( t t  t) t* t t  t t  t t  t0+ t: t<  tD$ t\, tf th  tp$ t t  t t  t" t t  t$ t# t- t! t  t   t " t &# t 8# t < t >  t d  t |  t t  t t  t t  t  t  t t   t ( t , t .  t : t <  t F) t V* t ` t b  t r, t | t ~  t $ t t  t t  t  t t  t " t t  t $ t  t t   t  t   t   t   t   t $# t ,. t 4! t 8 t :  t F# t P t R  t n t p  t ~" t t  t $ t # t.text .data  .bss SaveReg _exece_sysinfo_gethead_u_iput_fuword_fubyte_psignal_suword_subyte_setregs_sptfree_uchar_namei_access_bmap_bread_bcopy_brelse_file_v_chksize_shmexec()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcde_punlock_reglock_growreg_regrele#_get410 _xalloc-7_freereg_mapreg_loadregB_readi_execreg$L_sptalloc_getxfile_detachreg_kpgtfree_allocreg_attachreg_findpregexit.o/ 568270852 98 100 100664 2655 ` u! .textI .data l@.bssH8<@~Dրd p8,q h zz0PP$zz zt ēb\ TxB4' ǘpq    p<$ 'zz"8< "' zz"f ' zz"  <q$(}8~Dǎ@Ǟ<Ǯ8HHW@~<0dC  0<0$(10 dVL Y~<@@W@ d P d zlzp  $ (,W@8~<pހ q@hZH:~<ǎ8@@W @(#)exit.c 6.1 87/11/24 "$>@fh    $&*,24^`jz blz"&(4np.textI.data .bssSaveReg _exit_u_signal_pexit\_semexit_shmexit_acct_reglock_proc_psignal_setrun_v_swtch_wait_fsig_sleep_closef_plock_iput#_detachreg_kpgtfree_freeproc fault.o/ 568270876 98 100 100664 6946 ` u! 8..text 4 .data T@.bssX@DHLq ~Pd 0 spP0? sps0 p15 ? pq аdbǐ T >*q @p!!"0@pxx    !z"!XxT%/% %/"  T(  T!0 !x/x! !Txx0 b (1Tg^T3Qa1H $! $!$ x   '  d~PǎLǞHǮDǾ@XXW`HLPTX\~`( dq  0 sp 0? sps0  Ls p ? p  P   P^pd~p p, ^d^pP'q!0@#=p"#"0@px%(!  (! pW   !0* d^pPxxx    "  +d *f !( +n.!'M c-1p6zDz"$#-pQ^l0=Ý!p&z3zp!!"plxxxhPq^dax B^xQ2.hax!!0 ! Ltnl(6,ndl$.xx! 4 Pj ! z,z-z" (0,^ Q^^xQh QzUQ^tP@z2xx   !! t ,1zt  xx    !8 #!Q%0 # %0 #!*" ! tP^Q^~^~zUz^~P^:xx   !! ^tQ^^zt^z  Ǹ^ z  ^a%\pn[Q^xx   pΠ(  Dn$ ^~ z^~z~tR^~z= countfault.cpage read errorvfault - bad dbd_typepfd->pf_use == 0fault.cpfd->pf_flags & P_DONEfault.c(4*4F 4H 4 4 444 4 44 444444D4F4N4t44444444$4(4*40 44 46 444 4 4 4 4`4b4f 4h 4p4x4z4 4 4444 4444(444B4F4H4Z 444444444444444$4(4*42444<444p4z4|44444444444444 4:4<4H 4`!4|444"444 4N4P4\ 4 4  4 V#4 p$4 ~%4 &4 '4 4 (4 )4 4 4 4 4 +4 *)4 ,4 4 4 "4 4 4 4  4 "4 ( 4 04 44 64 H 4 4 4 4 4 4 4 4 4 4 4 4 4 4 t-4 4 4 T4 V4 "4 4444 444.text .data .bssSaveReg _pfault_u_kbase_curpri_findreg_reglock_panic_minfo_pfdat_pfree_premove_swfree1_regrele_vfaulth# |_tune0_freemem_pfind_assfail_ptfill_swaptab_pinsert_swap_wakeup_breada_bread<_geteblk_clrbuf_prdev_brelseH _bcopy_bzero_sleepR_ptmemall_copypage_clearpage_pageincache_memreserve_call_debug_killpagefio.o/ 568270889 98 100 100664 3974 ` u! ) +.textTd .data@@.bss@p YWP?8<@DH~Lp Wz!(&z'zz" n z> 00JYp&øz  p!f R   `Bq ב8q   בtlp8z&!$z:# q(ؓx`\$!!!z"z:#L  (! z z  Wz z  W~LǎHǞDǮ@Ǿ<8PPW8 &z0@ @@ @  @`D q( t ̎ 0z#0 #00WDq   ( .z#0 #00W  Y88W@8~<p`zJYz  z YVZ FZ\s s   Y~<ǎ8@@W@~<jp V Z!Z"z8YY ~<@@WZH HYWp&! l @ YW@8~<q z004,Y>pzq ~<ǎ8@@Wp(W @(#)fio.c 6.1 87/11/24 closef:DTYPEfileNFILETT(Th T T TT T T TTTT T T( TbTdT|T~TTTTTTTTTTT T2T4TBTVTdTxTTTT TT&T(T>T@T^T`TpT|T TT!TT TTTT*T,TXT#T#T$TTT TTTTTTTTT&T4THTJT^TfTT T TTT(T)T)T)TT TTLTNTT TjTlTtTvT.textd.data@.bssSaveReg _getf_u_closef8_unp_gc_panic_plock_cdevsw_bdevsw_closep_iput_file_v_setjmp_mount_bflush_binval_prele_openi_cdevcnt_bdevcnt_openp_access_getfs_xrele_ownerx_uchar_namei_suser_ufallocD_falloc_provfl_syserr_finitL&_cleanlocks_soo_close_ffreelistflock.o/ 568270910 98 100 100664 6565 ` u! >.textW .datad0%@.bss z40z3zA4$@0 2CWv ! ! ! 2 #  !!!! "!Wzr    ! !   W@8~<pހRqp R*q~<ǎ8@@W~r !`Y)' n%# F%! ?Qa1`&! 7Rb1@&# 3Td1 &' 1Xh1d z p"p~ǎǞW8  ~4q  "p*p~488W 00620-20 %t20 B1C21C "!   "!   Wp@DHLPT~Xrz l Ǻd * z -hdpWR*zz"NJ "*zz"  rNJ *zz"NJ v*zz"n\Z*' ^%# >%! ?Qa1\7Rb1D3Td1,&' 1Xh1 *`1GC ! 10 \8 .@NJ l*zz"  n\Z*' ^%# >%! ?Qa1\7Rb1D3Td1,&' 1Xh1 *`1GC ! 10 \0 .8( NJ <*zz"   rV'z"z! NJ ԋ& "'WlD('!   (. ~XǎTǞPǮLǾHD@ppW0~ !#2@C !|0d3 B z34(0B40BC !H<0BC00B4$Rz52z510z32 z" udq 0zwz3V2TBA4B( zGRzz0 BA " ~WX@DHL~PqT08÷z h ' .THgZ*' l%# D%! ?Qa1`&! 7Rb1@&# 3Td1 &' 1Xh1  '!'+H~PǎLǞHǮDǾ@XXW`@DHLPT§~XpЧ\z z     p n( ,z ( R z  ԋ .\*\ (p  p-f  p.F  , t} (pp ~XǎTǞPǮLǾHD@``W0 z"! C$ : z""C D $  z" \  J 3# .3 3 #   W d0 z3z .   W@8~<p <&ǁ d" 1 z"# ,~<ǎ8@@W @(#)flock.c 6.1 87/11/24 (44dd f n p x | ~      *L N Z \ l      " TV` b j n p x $&   (*8df@   0 2      "8:  $(,048<@DHLPTX\`dhlptx|.textW.data%.bssSaveReg _findfid_fidsd_frfid_freefid|"_flox_frlock_insflck@_u_delflck_wakeup_regflckT_flckadj_blocked _getflck _convoffd_setflck L,6_sleepAlM_allocfid_flckinfo_flckinit_flinotab_deadflck_sleeplcks_cleanlocks fork.o/ 568270928 98 100 100664 4346 ` u! P %.text i .data  0@.bssPPP@DH ~LPPQu0PPPPP$p<, `Pz0^<pV$ 0<(2   Y@ ր$(<Z$>^4  << Y|pd  8PPX   02# B"z"!$4 @! z!z@,<p 1d|> H zl~LǎHǞDǮ@PPW`?HLPTX~\qx >LJ{z Z((j `| !J Y(8 z3 ("Z (( | !4 |  ~\ǎXǞTǮPǾLH``W?h@DHLP~TpX!q  '    < pq!? !p"q0 0csp1Q1q@? sps0 p  < p1 1q!? !p"q@ spAEqp? sps@ Epxx  +pq!0 x !! ! p*x/x! !xx0 iX3Qa1qqp X!q  ' q ? p q   sp   q 0? sps   pxx p xx p h +R q ? pq 0 0sp0`6q @? sps0 6pxx p   $ d~TǎPǞLǮHǾD@W@48~<phW3Qa1ݓ~<ǎ8Ǟ4@@W @(#)fork.c 6.1 87/11/24 no procs&2>HJN P ~           " $ ,.: < DFR \ ^       " & ( .8:H J Z\j `l~ 4HPh     .0@ B p r 8!    02@ B ##$.text i.data 0.bssPSaveReg _newproc_v_proc_u_syserr_panic_shmfork_save_pfree_procdup_pexit_setrq_runrun_reglock_dupreg_regrele$_sptfree/_freereg:_ksct_kbaseD_uaccess_userpte_flushN_lastproc_ublk_ptbl_makechild_detachreg_attachreg_sptalloc_copypagegetpages.o/ 568270948 98 100 100664 6302 ` u! d+.text  .data  $@.bss x x@~<X  ēpx` R$   !<q$(p zz z  z b Dz& :^w_H@~Dp  LJzzz b BB Vzqm~Dǎ@HHWP<@DH~Lpz  Wz@0zz?@@ppWz z+ "Çp'zz"()΀@((6ǀ "ǀX Π !1@C{~LǎHǞDǮ@Ǿ<PPWxDHLPTX~\pz H ` >z z  Q^` P^`z pz @t*^tez"z? @lpV^hVpR^dZnhzzƋ.d!"pqnhzz@Q   ( ';l 0p@Q4  ( ';( L x%(!  (! p 0Wxx    !$ )0 #0 #)A 2 2$/x/x) 29s #0 #1 1 #  l)  0 ! '; <^x zB, ,! '; t    xj`  B0 0! '; @ 4 s!" '; t7 '; zp& !4^tQ^t^dT^d^h@Q^h^tnleo ';B ~\ǎXǞTǮPǾLHDxxWhDHLPTX~\qz  ;0Q^`p >sdd  d ؓ^dQ t P^`dVzL  < pn z "R  !0@ndlas1" <.d 0d! :`~\ǎXǞTǮPǾLHDhhWP<@DH~Lz 8 P rz(zxx    q(  'z \ l zzN pq ! ((9~LǎHǞDǮ@Ǿ<PPW @(#)getpages.c 6.1 87/11/24 run vhand DANGER: vhand needs swap space p->p_flag & SLOCKgetpages.crp->r_flags & RG_LOCKgetpages.c$$rp->r_flags & RG_LOCKgetpages.cgetpagesgetpages - pbremoverp->r_flags & RG_LOCKgetpages.c WARNING: swap space running out, needed %d pages DANGER: out of swap space. Proc %d cmd %s Killed (out of swap) rp->r_flags & RG_LOCKgetpages.cpfd->pf_use > 0getpages.c  " & ( .06 >P X^bdnt|~     LNR T \^fhn xz 026 8 @BJLR \^f l4> !"LNX    #    $ ># J P r$ v x % % & ' '   ( (      )    "* $* ,* .* 8* P R Z ^ ` h 0 4 8 < @ D.text .data .bss xSaveReg _vhand_tune_maxmem_v_max_sleep_debug_printf_proc_freemem_ractive_reglock%0_regrele_assfail:_pfdat_swpinc_memfree P_swaptab_minfo_swfree1E_panic_swalloc_psignalO_uaccess_uservad_swap_pinsert_pheadZ_getpgslim_swapwant_ageprocess_ageregion_getpages_swapchunk_pbremove_ublk_ptblgrow.o/ 568270958 98 100 100664 1474 ` u! n`.text8 .data88@@.bssxxPDH~Ldph R1(! 7'z3z"#8q<q~XzXp 7X()0@2 &~LǎHǞDPPWH<@~Dp" q~Dǎ@Ǟ<HHWPDH~Ld pj'z"p,(Lf'z"q!  :(0~LǎHǞDPPW @(#)grow.c 6.1 87/11/24 rp->r_pgsz+change >= 0grow.c& < @BJL     &vx       .text8.data8@.bssxSaveReg _sbreak_u_reglock_regrele_assfail_growreg_uclear_subyte_grow`_findpregiget.o/ 568270986 98 100 100664 8481 ` u! \:.text .data$@.bss``PP P  !:   P `P  !WH<@zސ ~Dll   pq*7 )2'z"z8#w!p'0#4YH' 72'7 2 '72'72!r!'q\ fXWz z   zZ8!!(!' Ázq   (! ȓz   zz ~Dǎ@Ǟ<HHWH<@~Dpz qqz Y )$z0 0? p! $,@:11!1!1!A=(40  `2$Qq   !! $ ~Dǎ@Ǟ<HHW@~<pzz z2zB z|z\ `z F !l8 pPW  p z~<@@WX8<@DHL~Pz2zB Yz9 z qqz8 $^Y$^Tz  ? ^TpQ^Te^T^T^T ^T^Tu $  `$ $  ЋHГD,q!,q!,qѡ!(&q !q !q ѡ!(݋VЋH,q!,q!,qѡ!(  `2$Qq     $z^T4z^T8z @ ^T<z   z9 ~PǎLǞHǮDǾ@<8XXW888W8 88W@DHLPTX~\  z qq@q  (z !q\ øzZ ^        p*$2q$1} |xY z -pYz '$ x~^n^pVntnxn|cp>p.`CA@ ACqB$4ssT.l20 01q$q^up*$! q!.`'z !sϞώlϮ|(* 0z 'qq^up z :q`~\ǎXǞTǮPǾLHDWp@DHLPTz ~X p  \ < , "WgW^h~h Q^hh.\` dz> * `Ǻ$P$.\ ndp!+p Ǯ`Ǻ$qpQ[^l@l$z)0z^lqT^lndgV`:nh1(0$^dpz)Vz@ 8~XǎTǞPǮLǾHD@ppW@ ~< Jz z!p~<@@W8ȲxXPPtHf88Wz R0z3zB4<0z30*0@C0@C0 0`01W`8~\18>`<dH 풍 Y~Dǎ@hhW @(#)iget.c 6.1 87/11/24 inodeNINODEno imtiaddress > 2^24 iaddress > 2^24 s5ip != NULLiget.ciinit - cannot read root superblociinit - not a valid root file system   < > PRZ\fjl| ~       &*,4>6 8 DJ ^ <B !,"% : < b   "& ( * > T Z p r |' " H J )   * + ' ! h) )  *,:-DF/  < > d2f233*22 4$&06<DH2J2Xtz~3322235567:< `p9|.text.data.bss`SaveReg _inoinit_hinode_inode_v_iget_sysinfo_provfl_syserr_u_iread_sleep_mount_panic_bread_brelse_iput,_bdevsw_itruncp_ifree_time_iupdat,_prele_getfs_printf_bwrite_bdwrite_itrunc2_assfail_bmap_bzero_s5tloop _free_geteblk_bcopy_maknode _ialloc_wdirx_writei_iflush_iinitT_rootdev_pipedev_readi&2_clkset_stat1_copyout=_ifreelist_freeblklst_s5itrunc2_ftHeadwall_HWGetDate intr.o/ 568270992 98 100 100664 673 ` u!  .texth4 .datahh@@.bss8 c   "0  W88W @(#)intr.c 6.1 87/11/24 spurious interrupt : IOIR = %x "4$4*4,44 46 4B 4D 4R4X 4.texth .datah@.bssSaveReg _confsw_printf_ext_intr_conf_devs ipc.o/ 568271001 98 100 100664 1107 ` u! | .text .data @.bss00 Z x0Z1F1>0\ q 11 q     YW@~q@B$ ހ ( .8 !2Y ~Àސ `ǀ T  Y' !  Y.<  ǎ88 Y` YL.<   @ Z\~ǎǞW @(#)ipc.c 6.1 87/11/24 $&:<*L.text.data .bss0SaveReg _u_ipcget_ipcaccess lock.o/ 568271011 98 100 100664 2008 ` u! X.text2 .data8@.bss880 Гhp WPztzPz* F\DPz" Y00W8d *z! Pz P88W8d *z! Pz P88W8d\ X!z"1 #!d. *z! Pz P88W8dԎ *z! Pz P88Wd" Pz PW0 Pz 8 d0 Pz! PV000W @(#)lock.c 6.1 87/11/24 \< " 6< > \ ^        $ @ B Nn p |         " .N P \ t v            $(,0.text2.data8.bss8SaveReg _lock_suser_ut_punlock"_tunlock<_dunlock,_textlock_datalock_proclock_findpregmachdep.o/ 568271024 98 100 100664 3061 ` u! ( .textx\Q .dataxxX@.bss@WWX<@DHLP~Tրx8-p" s  p s   p p8td@tVtJt> ppx8(@~TǎPǞLǮHǾD@<XXW0#A1$   WH<@~Dpހސ@xq@H H.>~Dǎ@Ǟ<HHW@~< p p '!s"~<@@W0 YWH<@~DpdL z z   z$$ $PLbW%s#(" %s#( $||PPtxXFP XP.(zptpx$Q0zp ! tpx~Dǎ@Ǟ<HHW888W @(#)machdep.c 6.1 87/11/24 NO PAGE TABLE SUPPORT ON THIS MACHINE looping...\ \X \Z \r \\\\\ \ \T \V \Z \\ \b \d \h \j \\ \ \ \ \ \ \ \\\\\\\\,\0\2\J\l\n\~ \ \ \\ \ \\ \ \\. \< \@ \B \F \H \L \N \h \~ \\ \ \ \ \ \ \ \\ \ \ \ \ \\ \ \" \, \2\d\.textxQ.dataxX.bssSaveReg _ccb_clkset_time_sendsig,_u_grow_suword_bcmp _setregs@_closef_bcopy_clrmem_printf_bzero_edata_chksizeh_maxumem&_itrunc_writei0T>M_clkstart_ftPageTables_coredump_findpreg_HeadwallDiag__HeadwallDiag main.o/ 568271037 98 100 100664 4191 ` u! 4.textXL .dataXXh@.bssH~Dp  `q ? qlp   sp P%0? sps  p :q!? !p"q0 0sp1P5q@? sps0 5p# J Lp Wtlf`zPz! z*!z1 ,p( 3#.(!0xp( 2p 2"q,3q<CN(H@ ,d@hL8D~$!d!3 #! ! &%8@n~$!d!3 #! ! ($'8@2&%~DHHW @(#)main.c 6.1 87/11/24 etc/init growregvhandvhandbdflushbdflushschedschedLL L L" L& L( L. L2 L4 L:L>L@LRL\LdLLLLLLLLLLLL,L0L2L8L@LDLFLPLZLbLnLtLvL|LLLLLLL LLLLL!L!LL"L#L$L%L,L.L<&LDLFLT'L`Lf(Ln)Lx%LLL&L*L*LLL'L)L*L*L+L+L,LLLLLL $LLL -L"-L*-L.L0LDLLLNLV.L\L`LbLj.LvLz/L|/LL/L/L$LLL-L-L-LLLLLL.LLLL.LL0L0L L0L0LLL L(.L.L2L4L<.L@1LB1L.textX.dataXh.bssSaveReg _main_physmem_meminit_pall$_ksv_sz_kbase2_uservad_ksct_userpte_mmvad_mmpte_proc_curproc_u<_msginit_seminit_startup_rootdev_iget_rootdir_time_meload_devinit_newprocFP_growreg_panic_regrele_szicode_icode_copyout_maxmem_bcopy_vhand_bdflush_sched_maxumem_maxupts[_firstfree_allocator_pgtalloc_pgtallocator_sptalloc_init_tbl_allocreg_attachreg malloc.o/ 568271046 98 100 100664 1096 ` u! X .text .dataD@.bss V0SA(10F@4A@EA@$00WH@0~Dq( (b QR :  $QZpR&(>pq`~Dǎ@HHW @(#)malloc.c 6.1 87/11/24 DANGER: mfree map overflow %x lost %d items at %d  @ @ @ @LT Zd  .text.data.bssSaveReg _malloc_mfreex_printf_wakeup_masktabmove.o/ 568271058 98 100 100664 2430 ` u! .textD .data |@.bss@0~<qp XBt'ċt'YZ,t't'rtt||xx~<@@WP<@DH~L  pqxxq!0 #;s.p"#2P5!@? $s&p"#"s!0 #p!%0? pxx  p)0 #!'o~LǎHǞDǮ@Ǿ<PPWP<@DH~L  pqxxq!0 #;s.p"#2P5!@? $s&p"#"s!0 #p!%0? pxx  p)0 #! 'o~LǎHǞDǮ@Ǿ<PPW W8!& Y88W8t YDxx||ttx 88W8xȎ RtdY0xx||tt88W @(#)move.c 6.1 87/11/24 $&24> HJT `pr|  , .    f    ,.6:<DHJRVX.textD.data .bssSaveReg _iomove_u_copyin_copyout_bcopy_pcopyin_kbase_schar_uchar_fubyte_passc_subyte_cpass|_pcopyoutmsg.o/ 568271079 98 100 100664 7601 ` u! '.text  .data P<\@.bssH<@~DY  0߀0p  ! !"VY~Dǎ@Ǟ<HHWx<@~Dրh p  0ߑl  TZ'' x' (     ,   Z'' H 0Yd'HJ' !P0  d,NV 8 0:YY  ~Dǎ@Ǟ<xxW@0~<r S  gz(Pz&' z"!X8p~<@@WPh 0 0(^L ^, jL>  ($,    0lPPW@~<q p . Г!PP  1!~<@@WX<@DHLP~Tրh` l  0ߡ (0Yp  $Y4 $ Y  0ߡ 8  0 qR8 T0B0H L(q*AMpq!Æp(z(  Y" z$YFtX z!Yl'd  ( 'pb  #YD    Y ~TǎPǞLǮHǾD@<XXWX?<@DHL~P֠h p   0߁HfYD T$ Y TY  $Y4 $ Y  0߁~'(  Yx  2&lY  :,  0߁܋   YtRY f ,  0߁,^JT֐   YxRY j ,  0߁0bNXb tX  Y& ,‹' !'d $T  W  & l,ⶐ~PǎLǞHǮDǾ@<XXW0 h#(Y  hp W00W @(#)msg.c 6.1 87/11/24 Can't allocate message buffer. lP(4 6 D F J L Z \ l       " *TVl    2@V |        $J L lnz |             &: < HJR!!!     ,>B D P R `  6>F H PR^"bdr#   prv!x!!         2  P b f  h  t  v              &  D  P R l ~                  % 2 < > F J L T V ^ ` f  l z  ~               "   &  (  8 : @ d f r t #          & 4  h j         .text .data P.bssSaveReg _msgconv_u_msginfo_msgque_msglock_sleep_wakeup_msgctl_suser_msgfree_copyin_time_copyout_msgmap_mfree_msgfp_msgget_ipcget_msginit_msg_printf_msgh_maxmem_msgrcvl_sysinfo_iomove_curpri_msgsndP_malloc_msgsys d_ipcaccess_sptalloc nami.o/ 568271091 98 100 100664 3051 ` u! 8.text4k .data @.bssX<@DHLP~TppWY/D ր W/Y րzTY  p( qW/Y׋q !( W/@<Y2pq  Y(  @zY@VY | xЊ, . xv  ZV |xYYІ  nttV Y Yz (Y f)$q  0#,q'   : | ||xx!||  t&"`Øznf .XpB4zz)(LJz\q(z  `~TǎPǞLǮHǾD@<XXW @(#)nami.c 6.1 87/11/24 0424:4J 4\ 4^ 4h 4j 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4@ 4B 4J 4L 4h 4l 4n 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4" 46 4H 4R 4^ 4f4j 4l 4 4 44444 4 4 44 4 4 4 4 4 4 4 4 44, 40 42 4D 4F 4L 4N 4R 4T 4\ 4` 4b 4j 4x 4z 4 4 4 4 4 4 4 44444&4(464: 4< 4D 4\4.textk.data .bssSaveReg _namei_sysinfo_u_rootdir_iget_access_brelse_bmap_bread_mount_iput_plock_v_searchdir page.o/ 568271116 98 100 100664 8103 ` u!! 9.textD .dataL@.bssXHLP~Tpz T  .z(z'z" (:@~TǎPǞLǮHXXWH@~Dp ހx n , oz4H p  '  ~Dǎ@HHW`DHLPTV VX ~\ |   qpW {? q@  (9(D~\ǎXǞTǮPǾLHD``W`?HLPTX~\ ? qp ps 8Ws  x    ? @ s  p!!0? pq!6(r0  86t ~\ǎXǞTǮPǾLH``WP@DHǎx~Lp  Px *'1 !0 xx !',W'0 !0 xx !'!  tu~LǎHǞDǮ@PPWX?@DHLPç~T&z ސQ  xx    qz +zzdx"  y  q yq ! z(x |(0 ~TǎPǞLǮHǾD@XXWH<@~DqPx.x z" 0xlj @\ "(8 z"z   @@L@qsHހ Ht4@zDzrG(p@ Ct@B@ ~Dǎ@Ǟ<HHWX?@DHLP~TPx,xӐ z vxp ٓ\ ړ×zzNj     B(s0 !,zz) ' ! >!r * Pxx   x    ~TǎPǞLǮHǾD@XXW @s(    A 20 $ WP@DH~Lpp R*0L*9)0Tp ~LǎHǞDǮ@PPWH@0~Dqq 1 1N(>~Dǎ@HHW  @ <:00 000 100001:    !   !<W@48~<Ñzp*zz)  q~<ǎ8Ǟ4@@W8 ȧ~4pzp\~488W@48~< z0p")zz" `q (  q0'zz"  q~<ǎ8Ǟ4@@WH<@~DqPx.x0z3 @xlj`l 0\t 18H z3z      ppsxސ yXpzwzxLÀp t< $  rp~Dǎ@Ǟ<HHWH<@~Dq&z uqf ֐d0|q ^~Dǎ@Ǟ<HHW @(#)page.c 6.1 87/11/24 rp->r_flags & RG_LOCKpage.cpfd != phpage.cpfd->pf_flags&P_QUEUEpage.cpfd->pf_use == 0page.c(pt->pgi.pg_pte & (PG_V | PG_REF)) == 0page.c!rp || rp->r_flags & RG_LOCKpage.cpfd->pf_use > 0page.cip != NULLpage.cip->i_map != NULLpage.cip != NULLpage.cip->i_map != NULLpage.cpinsert dupno kernel virtual space size %d %d %d ip != NULLpage.cip->i_map != NULLpage.c!rp || rp->r_flags & RG_LOCKpage.c6D<DFDb Dd Dl D D D D DDDDD DD&D,D6DlDnDDDDD D D*D2D4DDDDD D8D:DDD DPDRDDDD D D.D0DDDJDTD D D DDDDDDDDDDDD(D*DDD DDD(D.D8DrDtDDDDD bD dD pD rD !D !D "D D #D $D 0#D %D !D !D &D (D )D D *D +D ,D  D  D " D & D ( D . D 2D 4D @ D B D J D L D T D V D ` D D D D D D D D D D D D D D D (D (D D D R)D T)D /D /D 1D 1D 2D 2D (D (D D D R)D T)D D D D D D D DD>D@DLDNDD D*D. D0 D> DP3DT4DV4D`5Db5Dl5Dn5Dt5Dz6D7D D D D8D.text.data.bssSaveReg _assfail_freemem_ptfill_pall_phead_premove P_pfdat_sptfill_ksct_kbase_min_stfill_pfree(_swfree13 |_pfindX_swaptab=_phash_pinsert_panicH _sptmap_malloc_printf_sptfree p_flush_mfree_meminit R_maxfree_maxmem_maxumem_maxupts_ipflush _pmount |_bflush] _inode_v_regrele_u_runout_wakeup_swtch_reglockg_ptmemall_memreserve_pgtallocator_allocator_pbremove_phashmask_sptalloc_firstfree_punmount pgtalloc.o/ 568271135 98 100 100664 6596 ` u!!h%.text  .data   @.bssHp@q  ?~DpDWpq '  ?pp t~Dǎ@HHW80 #88WP@DH~L 8 D [Q%8(( 1E)#y r'#82(50 v 0182C!@ABH $>$  ! [~LǎHǞDǮ@PPWX?@DHLP~T * p  pאր pXz ` ` `zzz z&       pp . lq peLj O s   P h ۓ p! p!p N pq   t nq q~ pq    p`      ~TǎPǞLǮHǾD@XXWX?@DHLP~T q  qq!p,q   *  qpq((qpqzld   4 > @ T ?   qp 'z"p`  ` ODp`z!z  @z!X   [  \      ! p ~TǎPǞLǮHǾD@XXW8 ȧ~4pp :d'!~488WH.D ! xx ! DD 1HHWH<@~D Pր TDp '!  r'(!  ߎ (( (  œ    ƓT' !  '!  J q( ~Dǎ@Ǟ<HHW @(#)pgtalloc.c 6.1 87/11/24 size >= 0pgtalloc.c(pt & POFFMASK) == 0pgtalloc.c(pf->pf_flags & (P_QUEUE | P_HASH)) == 0pgtalloc.c(pf->pf_flags & (P_QUEUE | P_HASH)) == 0pgtalloc.c(pf->pf_flags & (P_QUEUE | P_HASH)) == 0pgtalloc.cpf->pf_next == NULLpgtalloc.cpf->pf_prev == NULLpgtalloc.c(pf->pf_use & (setmask[nfree] << ndx)) == 0pgtalloc.cpf->pf_next != NULLpgtalloc.cpf->pf_prev != NULLpgtalloc.cpfd1 <= toppgtalloc.cpfd1 - pfd == npgspgtalloc.c~"D H J Xd j~      z 248:  (,.<@BNX Z np   (,.8@  >DN\blprz|",VXdjlv    x !!""##JPZnt~$!!!.text .data .bssSaveReg _pgtmap  ,_mfree_kbase_bzero7_pgtfreep_assfailA_setmask_ptfree_pfdat_nptfreeKV_minb@l_u_runout_wakeup_swtch_pfree_freemem_phead_physmem_premovex_startup_pgtalloc_ptmalloc_memreserve_allocator_kpgtfree_pgtalloc_getcpages_nptalloced_freepage_contmemallphysio.o/ 568271153 98 100 100664 4527 ` u!!1p.textpD .datappH@.bssX8<@DHL~PdpzTQx Ӂz & @ hq L 8 $ q   p (W@@*4 <4p! <&8 @8p! @xhR'p!'" p'  Q @ p Tz~PǎLǞHǮDǾ@<8XXWX<@DHLP~Txqt=*@ $F4Y,,00zVF( @ q , @ ֐d  ,8t$tq!0 #9s.p"#2P5!@? $s&p"#"s!0 #p!%0? p$ $q ? @p x |s(" Wj$$q!0 #9s.p"#2P5!@? $s&p"#"s!0 #p!%0? pxx||x @tq1q!ހ ljspǁPΰ? spsހ pΰ? p +*ǁ  ΀H!1΀@ 00qF Q @ p ȋ @   0x ,YY Yz~TǎPǞLǮHǾD@<XXW t0 #  x #  | # Y\ |p   Y8x |Q hxW @(#)physio.c 6.1 87/11/24 IO err in swapphysio: useracc failed ,D.D6 D8 DF DL Dd Df D| D~ D D D D D D D DDDDD D(D2D4D8D:DBDNDXDZD^D`DhDtDzD DDDD D D D D D D D D D&D0D4 D6 D@ DDDDDDDDDDDDDDD D D DD, D. D8 D: D@ DJ DN DP D` D DDDDDDDDDNDPDVD`DbD~D DDDDDDD DDDD8D:DDDFDLDRDVDXDDD D D D D D, D. D4 D:DVD\DvDDDDD D D DDDDDDD DDD0D<D>DBDDDPDRD^D.textp.datapH.bssSaveReg _swap_u_syswait_splhi_swaptab_sleep_spl0_bdevsw_sysinfo_spl6_panic_wakeup_splx_physiot_useracc_printf_kbase_min_runin_physck_pfreelist pipe.o/ 568271164 98 100 100664 1867 ` u!!<.textT .data 4@.bssH<@~Dz p r֐l2p !n.lplRT~Dǎ@Ǟ<HHWH<@~Dp$RzzRzRDRzY'Tz"zTzT8^"  @ThTz RDRz~Dǎ@Ǟ<HHWH<@~Dp:RzRRz$WVzz" TV:TzTTz$WVzz! RVRzZTzPϗH zL NPzB ~Dǎ@Ǟ<HHW@~<p z  Wzz ~<@@W8z! Qz  z%0 #!n88W @(#)pipe.c 6.1 87/11/24 TT, TB TP TX TZ Td Tt Tv T T T T T T T T TB ThTTT>T|TT*TT.text.data .bssSaveReg _pipe_pipedev_ialloc_falloc_iput_u_prele\_openp_wakeup_sleep_closep_free_plock_ffreelist prf.o/ 568271177 98 100 100664 3077 ` u!!I l .textD. .data $@.bss8ȧTT.X88WP@DH~L2przx %xx0 9qdquqoq xq6op xp   *Zsq$ǩ zp2cqDq *0~LǎHǞDǮ@PPW`8<@DHL~P  ۋ ڋ -p>TB,(!*   q1Ŋ}q0d'T<qp~PǎLǞHǮDǾ@<8``WXLP~TpzP"  Q!0<#1@<4@@AH:(:,*Ч0(9l\T~TǎPǞLXXW@8~<pp *p p ؎ @0zq   "zA A4t"z   W@@WPDH@~LqzW(()8~LǎHǞDPPWH~DpA2H$t|~DHHW@0!@@W @(#)prf.c 6.1 87/11/24 0123456789ABCDEF%d%d:%d%d:%d%d Double panic: %s panic: %s %s on dev %d,%d device error bn = %d er = %x,%x assertion failed: %s, file: %s, line: %d assertion errorWARNING: system table overflow: %s (%s) l Dn Dv Dx D DD D D D D D D D"D*D.D0D4 D6 D\ DDDDDDDDDD D$D&D,D<DHDNDxDzDDDDDD@DPD~D.text..data .bssSaveReg _printf_print4_printc_time_pr_time_printn_pr_hour_timelap_pr_dst_putchar_smwrite_panic_splhi_splx_update_smdsync_idle_prdev`_bdevcnt_bdevsw_prcom_assfail,_provflp_panicstr_call_rbug probe.o/ 568271190 98 100 100664 1200 ` u!!V .text< .data @.bssh8<@DH L(~P (ds* s  ( d  P^P ^XP^P^Tqq  ,sp! !!0? sps   rs  p!^X!0? p s^`^T^\d $^\P@6$^`P  q@  dpqq  ,sp!P%0? sps  p!%0? p s6 Q( q@Ʉe~PǎLǞHǮDǾ@<8hhW @(#)probe.c 6.1 87/11/24 H<J< < < < <t <~ < < <0 <.text .data .bssSaveReg _useracc_u_kbase_fubyte_subyteptrace.o/ 568271205 98 100 100664 4381 ` u!!ep!.text(D .data(( @.bss@8~<dp z  z   z$$րdzjpT (zz"<&   :<q$(d( ~<ǎ8@@W@8~<րhd  d pz"4$ zzz &<p$(Y z   Q lpP Y\~<ǎ8@@W@8~<d z ppyFBpHW $ pp  sp d|Dz8P zz   < pp(tb&*  pspp p0p q$ PP@d( ,  Xd Dd( ~<ǎ8@@W@~<pdr0'#q,2@@4@p2 @$p!rxx    !$ x  ~<@@W @(#)ptrace.c 6.1 87/11/24 0L|(\ DD$ D<DHDR DjDxD DDDDD D D D DDD"D$D2D<DlDnDzD|DDD D DDDDDDDD DD$D.D8DNDXDZDdDhDjDtDvD|DDDDDD DDDDDDDDDDDD&D0D2D:DBDLDNDjDlDrD|D~D DDDDDDDDDD D D(D*D2D@DBDFDHDRD\D^DhDjDrD|D~DDDDDDDDDDDDDDDD D D DDD$ D(D*D8DBDJDNDPDV DDDDDDD DHDLDPDTDXD\D`DdDhD.text(.data( .bssSaveReg _stop_u_proc_wakeup_swtch_procxmt_v_fsig_exit_ptrace\_ipc_sleep_setrun_fuiword_fuword_chgprot_suiwordx_suword_ipcregp_psignal_findreg_pfdat_premove_swfree1_findpreg_dirtypage rdwri.o/ 568271223 98 100 100664 4410 ` u!!w.text 4u .data @.bss`@DHLPT~Xpx~|Yfç  @,p0  (` <,&zz  qpx q$z   6z !? !z0 1s6q@ XqFpWz  q W@TTz ,z Vz! VLR>6 N|ZZRQ^\ Y BҐҀ( *Ұz!" , z z 0,$!f^\P~  | ! |    :   '   z$ YxT |NPPNWVz"z" VT^Y~XǎTǞPǮLǾHD@``Wh@DHLPT~Xp|YDç  @,   (` ֋&zzB  qpv q"z  2 4z !? !z0 1s6q@ XqFp Wz  q  WP^\Rz `x (, !$V!n\xQ^\\z Vz" V8T*" x (aRz"d YDP|R`RZRQ@^dZRQ^` Y ҐҀҰz  z VP@<   ' z z +$ Y ދLz   .    ^dP ^`P0|' \ d| *&  |  |z B YxgV|WVPz"z! VRY^\PPxY~XǎTǞPǮLǾHD@hhW @(#)rdwri.c 6.1 87/11/24 . 40 4< 4> 4L 4 4  4  46 48  4N 4P  4n 4p  4 4 4  4  4 4 4 4 4 4 4 4 4 4, 4. 4F 4N 4X 4Z 4h 4x 4 4 4 4 4& 48 4: 4B 4D 4` 4b 4 4 4 4  4  4 4 4  4  4 4  4 4  4> 4@  4h 4j 4 4 4 4  4  4 4 4 4 4 4 4 4* 4b 4f 4h 4x 4z 4~ 4 4 4 4 4 4 4 4 4 4$ 4, 4. 4B 4b 4p 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4, 42 46 48 4J 4^ 4.textu.data .bssSaveReg _readi_u_cdevsw_linesw_prele_sleep_plock_bmap_geteblk_clrbuf_breada_bread_iomove_brelse_curpri_wakeup_writei_psignal_getblk_bwrite_bawrite_bdwrite_HeadwallDiag_freeblklstregion.o/ 568271271 98 100 100664 13536 ` u!!/7.text"`& .data"`"`("@.bss%%  0   $ 0 $(W@~<p z( HWzz ~<@@W8z$ Qzz%8 #!88W80 @4$"" Yb@ 04@0 4  40 2z312(  88W`DHLPTX~\pz""  z ' B'z""!z"0 #!!z"! !z"!! WÇzzz @?"" ѓLppp‹'ǁ"" ֓=@11Wzz1zp('@р'zz' '  fgP\0Qa1h&! 0Rb1H&# 8Td1(&' 3Xh1 p p~\ǎXǞTǮPǾLHD``WXDHLP~Tz"" X  YXdpY6 z! ' z"^#gP^;Qa1h&! 5Rb1H&# 2Td1(&' 0Xh1Y`7 z3^3 d## F z (dzz~TǎPǞLǮHǾDXXWP<@DH~LzdǑ#0#< _|z#H#` `Z#l# c,Qq!0 7sp1AA ? %sp@a$@ $IyzDzwt>AA KA!@@t@Bp 4@p:d)zz" z  z z   2  2dphX %' n%# F%! ;Qa1t&! 5Rb1T&# 2Td14&' 0Xh1 qMhP\;Qa1h&! 5Rb1H&# 2Td1(&' 0Xh1~LǎHǞDǮ@Ǿ<PPWh<@DHLP~Tqz## |zt  *z    z2 "  Y       Ч P^`^\@\Pp$p  Yz @wÚn`zz@Zn`zzzpqzp @## TQ  " $ hW3Qa1asTxx    dQz## Ax^dznXW3Qa1XxhX8#$ MX$ ,    Ydh^X3Qa1t^\T^\^`@P^` zz?@  ~TǎPǞLǮHǾD@<hhW`@DHLPT~XҧçDZ$($4 z$@$X &-z!$d$  z$$  D^U zU^S^{zzwqP]W^~[zU^[zU]^Q @ppppQ^|ZpV^xZpR^trt+q@^nxV n|y' 8^tT^t^x@Q^x^|Q^|^? @. >-B^ Y. V^ Y~]W^[zU^[zU]^^e @pQpR^^pQ^pVpQ^lZpV^hZpR^dd+qǎp@^nhVnlnv @$$ P68 )6($!P^,2 1xx 12^Q$^^ȎJ~P^4xx  ^T^^Q^^pq`\Ȏ 01\! #! $ \&7  2./x/x- 27t(ۋ"r`Ȏ  !`   `0&' !xx !'t1 (6$~!P^,2 1xx 12^Q$^^Ȏ:P^&xx  ^Q^^pq^dT^d^h@Q^h^lQ^l^pQ^p^Q^^? @>- zz ^dz-z^ z^$ $~XǎTǞPǮLǾHD@WP?8<@DAH#~L0dpzwz  @ !@  rdSq pq  spx sp a ? @qppz@ dS? q p spx sp ? sppap p$   ( ߋJ& s  2q@ p~LǎHǞDǮ@Ǿ<8PPWH48<@~Dǰd pz"zwr8 q   +sp sp4 q   +sp sp"n( +Pq sp  ? sp a H&!s!0 # 2 @r  pp~Dǎ@Ǟ<Ǯ8Ǿ4HHWH?048<@~DpǑdB9)z3z"#@4C^Qq1p 7s>p20sp? sp? @p a XQq!0 #s.p" 2" ? sp$?@!pap < !q ' @B !@4@ɓhTz qQq!0 #s.p" 2" ? sp a )éÉzzH?΀@HpBBƋǢZ΀ q΀? pqް ְspǸ`q? spLjsް pLjxxΐ ǐpqޠ x   $΀ (W4(;~Dǎ@Ǟ<Ǯ8Ǿ40HHW`<@DHLP~TЧX.\Ǡ  úzz úzX ?@ ?\J ?pN? @*p(ًz ?@? @p()t! !? @*p(ˋt !? @*p(z @z!z `-!-? @?!zzJ ?@?* :? @!p"*z ?@? ^XP \ zz p ?@?p zpX >01? @!p"T*zBz\4 ?@Qpp ?@pZ ?@? @ ?pp ?%pt (^Xz5z @z z `:v&Z(( ~TǎPǞLǮHǾD@<``WXDHL@P~Tp!q,(0p qqz!zXtx|Z fz Wz @ z *x B( !$! ~TǎPǞLǮHǾDXXWxDHLPTX~\p   \ b rǧz   t]Q%q,^t(0 .tq)"q,!(0 tjq.tzq,z2z&#*()*.tq,R.t(q,,%0@#!?#.`+p&R+^pp&QR^l[pV^h[pR^d^tnhV ~ppp @% %8 VǞl@y @%D%` [.d!"p!P:z312D 421@ 4H M 4@ 4@P 4q$1^dT^d^h @R^h^l R^l^pR^pn`k!0 #0 #!z Zz @ z  ~\ǎXǞTǮPǾLHDxxW80! (P5(20A5(40 4(20 00( %pZ88W 0 z31 0 00"(W@ z z 2 z3^3 @@W @(#)region.c 6.1 87/11/24 regionsREGIONSrp->r_flags & RG_LOCKregion.ci <= limregion.cpt != 0region.crp->r_flags & RG_LOCKregion.cup->u_procp->p_flag&SLOADregion.crp != NULLregion.crp->r_flags & RG_LOCKregion.crp->r_list[0] != 0region.crp->r_flags & RG_LOCKregion.csize > 0 && size <= NPGPTregion.cpfd->pf_use != 0region.cswpuse(&map) != 0region.cdupregrp != NULLregion.crp->r_flags & RG_LOCKregion.cchange >= 0 || (-change <= rp->r_pgsz)region.crp->r_refcnt == 1region.csize > 0 && size <= NPGPTregion.cgrowreg - ptmemall failedgrowreg p1 - ptmemall failedj >= 0 && j < NPGPTregion.clim >= j && lim <= NPGPTregion.cfindreg - no match& &&&&& &" &( &, &. &4 &8 &: &D&F&N&P&X&Z&h&n &p &z &| & &&8&:&F&H&R&X&^&f& & & & & & & &&&$&|&&&&&&&$&8&^&&&&&& &(&*&4&&&&&&,&.&&&&&v&|&&&&&&&&&&d&f& & &&& v& |& & "& & H"& h& & & & `#& b#& z& & & $& & & & & %& & & & & & & & 6& <& F& V& \& f&:&&&&)&*&&+&^,&*)&r*&~&+&,&&&&&P"&T&V&&&"&&&&&(&*&&&(&*&&&-&&&R.&T.&b&d&&&&&P&"&/&&|"&/&&"&&6&8&v&|&&&1&&&&2&4&&&$&&&&&& & & $&!&!&!+&! &! &"F&"H&.text"`.data"`(.bss%SaveReg _reginit_rfree_ractive_region_v_reglock_sleep_regrele_wakeup4_provfl_u_freereg_assfail_iput_pfree_pgtfree$h%!/: G`QH_kbase_pregpp_dupreg @\_pfdat_swpuse_swpinc_growreg f q_min|_panic_flush_ksct_bcopy_loadreg_readi_uclear_mapregP_findreg!L_chgprot"_allocreg_nullregion_attachreg_findpreg_chkattach_nullpregion_loadstbl_detachreg_pgtalloc_rptexpand_chkgrowth_ptmemall_clearpage_bldblklstsched.o/ 568271284 98 100 100664 2029 ` u!!.text0 ' .data00P@.bssP<@DH~Lΐp,<q$($vl !2F! &"pv h T '0*&'<q$(u nj$  *!   0 z   WH<@~D) z"P`t Ɠ`lj`zL>!z z ) q~Dǎ@Ǟ<HHW @(#)sched.c 6.1 87/11/24 swapout(%d) p->p_flag & SLOCKsched.c& .  0  `  b  t  v  |  ~             t  v            |         .text0'.data0P.bssSaveReg _sched_spl6_proc_v_runout_sleep_spl0_freemem_tune_setrq(_swapout\_runin_debug_assfail_reglock_regrele_lockedreg_getpages sem.o/ 568271310 98 100 100664 9125 ` u!! '.text .dataXD @.bss觾 zzz ~ n$z z "YFd<p׀Rր6d<pY B090z3zJC "zz:!8z31  z!YZz(z"zzp(!rgW7Qa1x(㧐zzP $z "z! "Yzzzzp(!r`P7Qa1(zJ, ~ǎǞǮ ǾWPp 0 # ! !YWP@DH~L֠h >l$ pWZ))  ) ÉyDF.x)0s1#    BZ))  Y       :   Y n (YR pl8 " (Y pzl f (Y pl  t|XÉy"!Y Lxߋ< & (Y pl j )(Y ("Y)pq"d  * $  t|X jY . z"Y( ! dyb ֋ d" x!)(Y~LǎHǞDǮ@PPW@48~<d<pא P z Ézp (p#923z3(p#IB$z"p#!r  R(p#zbM   . d<p~<ǎ8Ǟ4@@WXL~Pրh0 .(^T ^,pT Y:Ynp&(Y$  sl~PǎLXXW@!p* 0 @@WX?@DHLP~T֠h   (Y t|X ~Y pNz  B b+!YFv*(^ $Y t|X Y png+Wpzz% (z  H&zT4Y"Y*;Ƌ@'Wz(z(|z  8'z"*;@'`.*;z   YP>( !(Y*;Vz   Yv>( !(DYb0v)(p vpd  ( l~TǎPǞLǮHǾD@XXW0 h"(Y  hpW00WP@DH~LppTz D'pz 'zv~LǎHǞDǮ@PPW   ѧ §~πz -!lz , ^y6pPQpe^_7Qa1Pq'zzzez:" ~ǎǞǮ Ǿ W @(#)sem.c 6.1 87/11/24 ^<HD\ @ 46P \ ^ b d r t ~         *,< R T ^  T V d l n  $ & D X^ ` v < > Tdfp|  $ > Pp        $ & Ll    48 : dv ~     ,HL N v        H J t                 P  R  ^ ` p r |            (  4 6 < > L  p r ~      " "             " "  $  &  D F T  b  j  p  z |          *  2  8  B D L P  R  d f       df %&. NPp %   ( \ ^ x      X b d .text.dataX .bssSaveReg _semaoe_seminfo_u_proc_semfup_semunp_semconv_sema_semctl _suser_semunrmT_wakeup_sem_semmap_mfree_semtmp_copyin_time_copyout_iomove_semexit_semget @_ipcget_malloc_seminit l_semu_semop _semundo_sleep_semsysX_sem_undo_ipcaccess shm.o/ 568271327 98 100 100664 4900 ` u!!$#.texth L .datahhX @.bssXHLP~Tph  |   V   dFdN&d8$ z(p     ' (4 j  V!q,(0 t l & 'p(C $   ' (4 ܋  ^!q,(0( YF  fYl d ~TǎPǞLǮHXXWP , 0 # ! !YWp<~@րhp pWZ''lLJ  ' !00,   zz NZ'' (D ,YDFL   (R   ," Y~ nz! H6z! Y~@ǎ<ppW@8~<hdq" z  |Y", ,( ,( $d ~<ǎ8@@WWWWXL~Pրh0 ,.(^T ^,p  TP((Y  Y'0 #'(' '$' '( ' d" '!z"0 #!T&(Y(   ,l~PǎLXXW0 h#(Y  hpW00W @(#)shm.c 6.1 87/11/24 shmat: prp~$,<  L" LD  Lj  L  L L L  L L L  L L  L L L4 L6 L> Lj Ll Lz L L L L  L L L L  L L L& LJ LL LZ Ld Lf Ln Lv L L L L L L L L L L L L L$ LL LN Lx L~ L L L L L L L  L L L$ L& L< LZ Lf L L L  L L L L  L" L. LD  LZ Lj L L L L L L  L L L L L L L  L* L, L6 L8 LB LD LT LV L^ L` L L L L L L L  L L L L L& L:! LJ L| L~ L L L L L L L L L L L L8 L@ LB LH LT L L L L L L L L L L.texth.datahX .bssSaveReg _u_shmconv_reglock_panic_shminfo$_growreg/_maxumem_regrele_time_shmem_shmctl<_suser_freereg_copyin_copyout_shmdt_shmexec_shmexit_shmfork_shmget_ipcget:_shmsysD_shmattach_ipcaccess_findpreg_attachreg_detachreg_allocregsig.o/ 568271341 98 100 100664 2792 ` u!!.text$2 .data|@.bssH<@~D6p<  z6<q$(~Dǎ@Ǟ<HHW8  0`( (( F88WH<@~Dրd(hpHp<. 'zz"<q$(ыp  rP t  P, p,   $`( ((%~Dǎ@Ǟ<HHWH<@~Dրd  (p`( (p,> rYtup !,)rD2.p(Wl p: .~Dǎ@Ǟ<HHW!! s W@8~<Z^ Yp.Y npp VV*  0YYV~<ǎ8@@W @(#)sig.c 6.1 87/11/24 core($*$N $P $ $ $ $ $ $$$>$H $J $X $Z $t $v $ $ $ $ $ $R $T $p $ $$$$$2 $4 $8 $: $L $R$X $\$^$p$z $| $$$$ $$ $ $($,$0$4$8$<$@$D$H$L$P$T$X$\$`$d$h$l$p$t$x$|$$$$$.text2.data.bssSaveReg _signal_proc_psignalx_v_setrun_issig_u_fsig_psig_stop_sendsig_core _exit_schar_namei_maknode_access_iput_freeproc_coredumpslp.o/ 568271356 98 100 100664 2542 ` u!!.textA .data0t@.bssH48<@~Dրds ? pq ,q44*(    (^(.:",4H ( & .    ؓ~Dǎ@Ǟ<Ǯ8Ǿ4HHW@48~<pds ? p!~1,7p11h3101,14201411001 01!41 ~<ǎ8Ǟ4@@W@8~<pnR44p.~<ǎ8@@W@8~<pB,s ? p4!''4!,p4p,N 2~<ǎ8@@W @(#)slp.c 6.1 87/11/24 proc on q (*: < B F H T \     ( 8 PRX    (FHN\    $ & ` npz .textA.data0.bssSaveReg _sleep_u_hsque_splhi_spl0_splx_issig_swtch_longjmp_wakeup_runq_runout_curpri_runrun_proc_setrun_setrq_printf_runin_curproc_panicstrstartup.o/ 568271376 98 100 100664 4932 ` u!"2.textpl .datappp@.bssWP<@DH ~Lqq (q `?@?@  p P@P:p21BސIC@$4 0#"q,@0 2!@ $x/x! 2#2 # < 4 # !() 0#"q,BHK.0 2!΀ (x/x! 2#6 # !($ ն.0 2!@ $x/x! 2#6 #  !  p ?0@<0@4Bs1Aސ 9x1 C4A 4A 420$* p @0#  pq 0,~LǎHǞDǮ@Ǿ<PPW ~d$h   !8 h!< !L(!t h!p@8LtPPp  < րpq1 1q!? !p"q@ @spAAqΐ? sps@ @pxx  (pq!0 x !(0! ! ր`X3Qa1` 7| 1q!? !p"q@ spAPEqp? sps@ Epxx  pqq ? p q,0 #s.p"&"%q 0? sps  p$gP3Qa1t~ǎǞW@~<  q  p pq   $r0<#0<s00 0p q sq  sq  d~<@@WHP^(P$ 0^, p, p,ēHHW  H 4!@W @(#)startup.c 6.1 87/11/24 %s release: %s version: %s on %s real mem = %d avail mem = %d l llB lD l` lp lt lv l l l l llllll` lb ll l l l l\ljlllrl~lllllllllllllllll*l,l2 l<!l>!lBlDlJ!lR!l"l"l#l#l l lllll l lllll8l:ln lp l l l$l$lll$l$l llll&l&lllllll l l$&l&&l4l6l> l@ lh'l~l(ll)l+l+l+l+ll+l+l+l+l,l l ll,l -l-ll,l6/l8/l@0lB0lR0lXlZlh0l.textp.datapp.bssSaveReg $_maxpmem_physmem_end%_ksct_etext_ksv_sz_sptmap_mfree/:L_freemem_kbase_ptfree_vZdo_reginit_p0init_proc_curproc_proc0_u_sched_uy_pregpp_pfdat_phash_startup_utsname_debug_maxmem_cinit4_cfree _pfhead_next_page_firstfree_vadrspace_sys_sect_allocator_startup_pgtalloc_pgtallocator_sptalloc_ublk_ptbl_mktables_ublk_sgtbl_p0init_done_phashmask_cfreelistsubr.o/ 568271391 98 100 100664 2472 ` u!"h.textX3 .dataXX @.bssxxh<@DHLPѧ~TP^X `f &zp B0z0 9@ 4 Ӑzq  Üz |s |s P`Y: Xn`^XQ^X |  |      xb0( P^X ^`\X `"X^``-N P^X  | 6<  Ls L^`Y^`Zup$Q^dPj    (s ( df^dp$Q zB  y"Xp$dHQ^d^`Z   ^ ^`   d^```d ^`ndV^`Y p$Q^dPl  t  (s ( d>^d p$Q zB    ^d Y Z$^\   `n\cq rpQ^dPx   |!(s# !(.dR Fn\^dp Q,    "Xn\pd~TǎPǞLǮHǾD@<hhW @(#)subr.c 6.1 87/11/24 4\ ^      "02>\^df0f  b   v    (.textX3.dataX .bssxSaveReg _bmap_u_mount_v_alloc_bdwrite_bwrite_bread_brelseswapalloc.o/ 568271412 98 100 100664 4220 ` u!"4 l$.text H .data ` @.bss H8<@~Dp z(    q(d ' "  p  *  X!!(0 #0 #2 2'/x/x) 2 p#BI 2$@ $ 28 ~Dǎ@Ǟ<Ǯ8HHWH@~Dx p  's @ P ~Dǎ@HHWx  ! sW8 1x  @s!$"@($  `>88WX?@DHz§LP~TqVzz*H @Wz$ sz  YY pYz  q   !WY f sq   ,'p ~TǎPǞLǮHǾD@XXWHz08!<@ސ~DyI@ 0GzDzJG B GzDA@@@@Yb YLpz  '! ,~Dǎ@Ǟ<Ǯ8HHW@~<pq!V~<@@Wh@DHLPЧTހ~Xz hz @z&z? @\dpV^`\pR^\Xn`zzuvpØn`zz@.\!"p0Qx-x!*q^\T^\^`@Q^`ndl[$0 $(~XǎTǞPǮLǾHD@hhWH@0~DqPNxx  f |!0<d!1$ xx (   ~Dǎ@HHW0!~@B8pp !j(@D8pp !(~ǎW @(#)swapalloc.c 6.1 87/11/24 *cntptr != 0swapalloc.cswpuse count overflow - %s ( * 8 :  F H  ` b                    F H                     @ T       ( *  . 0               ! " #    .text H.data `.bss SaveReg _swalloc_swaptabP"_swfree1_assfail_swpuse4_swpincp_printf_swapadd_u_bdevsw,_bzero_swapdel_getswap_swaprem_sptfree_region_reglock_unswapP_regrele_v_pfdat_premove6_swap@_nextswap_swapfind_swapclup_swapwant_sptalloc_ptmemallswtch.o/ 568271424 98 100 100664 1677 ` u!"@ .textd% .data D@.bss8d88WPDH~LDD@p.<p 1bdD@0 t@,GA@B(I@ 7)G4t@s04 7414 p nW3Qa1j~LǎHǞDPPW @(#)swtch.c 6.1 87/11/24 dd dL dN dTdVd\ db dl dn d|d~ddddddd ddddddd,d<d>dDdJdPdVd^dddd.text%.data .bssSaveReg _qswtch_u_setrq_swtch8_sysinfo_save_proc_pfree_spl6_runq_runrun_curpri_idle$_curproc0_spl0_resume=_lastproc_ublk_ptbl_switching_slice_size_slice_ticks sys1.o/ 568271437 98 100 100664 1208 ` u!"Md.text8 .data88 @.bssXX0 h00W8h p88W8TT Pdzlp,0z4D<8HP  Yp88W @(#)sys1.c 6.1 87/11/24  8:P l n z  (.text8 .data8 .bssXSaveReg _exec_u_exece_rexit4_exit_forkh_sysinfo_newproc_time_lboltsys2.o/ 568271455 98 100 100664 5739 ` u!"_+.text P .data P P @.bss p p8LLH88W8PP88WP<@DH~L֠h ppd  YNtxX z <LJø  @*z  | @  l x xlDlDxx|l|~LǎHǞDǮ@Ǿ<PPW`< ~@րxtqDHDLPX\T" .L|Y\ll~@ǎ<``W8h!H88W8h88WH8<@~DY p>Y   Zp  0  Y$ *p `  Y:  L  .  @YY \L   2*֠lؓ0Y Yp  !XY>p !zz~Dǎ@Ǟ<Ǯ8HHW8 ȧ~4phV 'p"024~488W@~P'zz"YY zz @ ~Dǎ@HHW@~ J         " $  L \  h t                           : <  @ B                V  l n            4  V n                         & * ,  @  Z \  f  n                F       #           <  Z% & & '                    ( ( , .  V    %           J | ~               $ *  0  .text P.data P .bss pSaveReg _read_sysinfo_rdwrh_write8_u_getf_sorwuio(_plock_readi_writei_prele_soo_rw_open_copen,_creat_uchar_namei_maknode_iput_access_falloc_itrunc_setjmp_closef_openi_close_seek_psignal_link_suser_time_iupdat_wdir_mknodt_saccess d_ffreelist sys3.o/ 568937565 98 100 100664 8046 ` u!L]h=.text0 .data00P@.bss@~! z"""'Y!~<@@W@8~<րhXpB:~<ǎ8@@W@48~<րhxW p?   @ ph&xp @ YHpl:pplp z ~<ǎ8Ǟ4@@W@8~<րhpV 8  ċY~<ǎ8@@W@8~<րhr d!"  YLq  &, Y~<ǎ8@@WX@~Dրhp pPW @Y ppzhlR @l,   H YBH Y$H  YH |YH \ YTH 8YH! YY~Dǎ@XXW0@DH~Lրh zq ppYT   c(Y, >.P)4YY   P> @ P   P .PưYY, @ P)Y`   Y:&zzz (8Jqpp#4W~LǎHǞDǮ@W0 h!Ч! t ! 00W0 h!Ч! t!00W8z ^!0 #0`#/ Y(!&z"z"q(0 #2 # & Y Y 88WP?8<@DH~L֠h B0Y *&zz  r j܊(zNYz*, $ Y   @Y2z "0p8$z, !z@ ! 07q(s0pxbz    !#z  q0 01WY T ǐ$|xt XY     ԣ   ~  Yz Wz z   Pz:( 0z(  h*z V  q0 00W   YY~LǎHǞDǮ@Ǿ<8PPWP<@DH~L@Y &zzp0 z* !z0 !,q( Y|zçzz &z YB$rfYz R DYLJz(  ǁ$Zz Y|xtX Y z  q    Wtz lzz+ z \ P ~LǎHǞDǮ@Ǿ<PPWX@~Dh~H Y (!  (!  2Ћ(  Y\l  `6YD$ $ ' ~Dǎ@XXW @(#)sys3.c 6.2 88/01/11 ZxmountNMOUNT   H  N d             < d n ~              > N V          ( * 4  T p |        , < J b n          < > H         <  B F H n t  ! !   8 : t  v    % %     $ & ,' B D d j n  p             B( D( ) )   * + +   ,    * 0- 4 6  . . . /    2+ 4+ F0 X \ ^ l t '   ( ( &) () 6 @ T2 p z    3     4 5 5  ( 2 8 @ L R6 Z b ~+ + 7 8 8 0     \: ^: d p z'         ; <  P T X \ ` d h l .text0.data0P.bssSaveReg _fstat_u_getf_stat1_stat_uchar_namei_iput_dup_ufalloc_closef_access_itrunc2t_plock_prele_fcntl_copyin_getflck_copyout_setflck_ioctl$_bzero#_cdevsw_stty_gtty4_mgetdevl_bdevcnt_smount_suser_mount_v_provfl_bdevsw_geteblk_readi_pipedev_iget_brelse_sumount _xumount_iflush_bflush_time_writei._binval8 _swaptab_swapdel_swapaddB_soo_stat_truncate_ftruncate_soo_ioctl_punmount_swapfuncsys4.o/ 568271510 98 100 100664 10398 ` u!""G.text0^ .data00@"d@.bsspplWP<~@րhD z"2p q2qDD '2(   2HJLD,@ Y~@ǎ<PPW8 ȧ~4ph.~488W8 ȧ~4hp`(YVp(^dpZ0`$dpZpdpp^~488W8 ȧ0~4րhxp p^^qZNLj ҀZ ^ Zdpp^Z~4ǎ088W^lZpWZlW\lW8 ȧ~4hp`(Y$`p\p`~488W8 ȧ0~4րhxp p``q\xPLj Ҁ\ ` \B`p p`\~4ǎ088W`l\pWPd zlzpWdh$ zz"   zlW0 Г`00W8 ȧ~4hpp (p&pdp(p'ppdplp~488W@8~< F xzzhpp  @D(zz"Yz  z zYt| |PPt xXY zz @ bZ~<ǎ8@@W8R88W8ȓ88W@8~<pt  @YJ@z 2fVJx :~<ǎ8@@W@8~<րhp Z. \'    ! z @ z    `X~<ǎ8@@W8 ȧ~4ph& F'!' ! Z !0 #!!z"0@ #!~488W@8~<hǀ (Yp,l p!,( "  !pPW8L LL LL LL L^L LL@ L(L LL LL LL LL LL L L LL L8L LL@ Ld` ( (PdÀ zp<.zd<q$(~<ǎ8@@WP?8<@DH~L֐h  Y6   Yljp< px֠d zYQ z  * zz"x (z!d`Z`<'4P^R('bRYB  t <q$(G Y~LǎHǞDǮ@Ǿ<8PPW@h  Yl@@Wh Whd 88 lW8'NhJz  JlWP@~Dրh&H(YHLp lZ'*&YfY$z F H.L<4~Dǎ@PPW@~ ̋<LΎLLld lld.0B(40 0A(40 00ll(lY~<@@W8ȓ88W @(#)sys4.c 6.1 87/11/24 , d D   0 2 8 <>F H ^    &(.T V p | ~                  6 8 < > H J T` b l r                   * 0 \ ^ l n r t ~                  $ & 2 > L N R T t  !        H$J$\%p r   & '$ , . : > @ F L T \ h n(r t ))    :$<$N%v -./))  1 " 8 : ')  1   *) T  V  v                     "  4  6  D  L  N  \  l  n  z                      "  ,  .  :  D F d  f  p  x  z             4 4     5 6 6 d  f    4 4 4 4    <  >  P  R  t  5 6 6       99" ( @ B L V ` j x z ~     =        @( 46>@H$J$\%l n  -  A)  ( * 4F J L R \ ^ fCt | ~    D  "FPTX\`dhl.text0^.data0@.bsspSaveReg _gtime_time_u_ftime _spl7_lticks_spl0_dstflag_copyout_stime_suser_logtchg_setuidH%_getuid_geteuid_getegid_setgid/L_getgid_getpid$_setpgrpL_sync_update_nice_unlink8_uchar_namei_iget_xrele_writei_iput_chdir_chdirec(_chroot_access_prele_plock_chmod_owner_chown_ssig D_proc_psignal_v_kill D_times _lbolt_profil@_alarmx_pause_sleep_umask_utime_copyin_iupdat_ulimit9_min_rebootCN_timezone_ftHeadwall_HWSetDate_setreuid_setregid_findpreg_call_rbugsyscall.o/ 568271526 98 100 100664 1592 ` u!"D.textH .dataHH @.bsshhP@DH~L֠HppHYǐ  p߀$7G4$H(lpاh@4Y Y WYN !'Y!zz 'l!'p!LJd(82s(  p(b  TĆ@'*2~LǎHǞDǮ@PPW8d88WWYWW @(#)syscall.c 6.1 87/11/24 "& ( ,.4< V X d f   (*2 2.textH.dataH .bsshSaveReg _syscall_u_sysinfo_nsysent_sysent_setjmp_spl0_runrun_curpri_qswtch_issig_psig_addupc_nosys_psignal_nullsys _nodev,_nulldev@sysent.o/ 568271537 98 100 100664 6129 ` u!"^.text .data@@.bss@@ @(#)sysent.c 6.1 87/11/24 $, 4 < D L T\dlt| !"#$ %&'$(,)4*<D+L,T\-dl.t/|0123456789:;<=> ?@A$B,C4D<EDFLT\dlt| $,4<DGLHTI\JdKlLtM|NOPQRSTUVWXYZ $,4<DLT\dlt| $,4<DLT\dlt| $Z,[4\.text.data@.bss@SaveReg _sysent _nosys_rexit_fork_read_write_open_close_wait_creat_link_unlink_exec_chdir_gtime_mknod_chmod_chown_sbreak_stat_seek_getpid_smount_sumount_setuid_getuid_stime_ptrace_alarm_fstat_pause_utime_stty_gtty_saccess_nice_sync_kill_setpgrp_dup_pipe_times_profil_lock_setgid_getgid_ssig_msgsys_sysacct_shmsys_semsys_ioctl_utssys_exece_umask_chroot_fcntl_ulimit_geteuid_getegid_ftime_setlev_reboot_socket_connect_bind"_listen_accept.8DQ_sendto_recvmsg_sendmsg[ht~_nsysent8_swapfunc_socksend_sockrecv_setsockopt_shutdown_socketpair_getpeername_recvfrom_getsockname_getsockopt_setreuid_setregid_sysmachdep_truncate_ftruncate sysmachdep.o/ 568271551 98 100 100664 1985 ` u!"|.textX<# .dataXXX @.bss    &<B  . "W.*pxWWPD~Hph>:pWL*LL LLLL 0  L2Y' 7P^D04LL$  Y Y*Y L$҆ Y~HǎDPPW @(#)sysmachdep.c 6.1 87/11/24 |@X< < << < < < < < <<<"<.<@ <B <b <d <t <~<<< <<<<< <<< < < <0<< <x<|<<<<<<<<<<<<.textX#.dataXX .bssSaveReg t_u_ftbits*5@LZ_suseriy_copyout_traptoround_roundtotrap_sysmachdep_mcversion_machineid_ftHeadwall_HWLoadEnable_R32LoadEnable_HWClockCommand_ml_elogr_ml_elogw text.o/ 568271568 98 100 100664 2678 ` u!"h.text\A .data8$@.bssXDHLP~Tְ ֠pzz0z @ j^Vz * !(1&  wCp   z  * !(1hz  80 ((hT(> 4,~TǎPǞLǮHǾDXXWP?8<@zʧDHZ~Lp|zfǗ' >zz*v   Vy `~LǎHǞDǮ@Ǿ<8PPW@48~< z  pXzBLJ  x ~<ǎ8Ǟ4@@W@48~ \@ \^ \x \ \ \ \\\ \ \ \ \\T\V\^ \n\x\z\\\\\\\\\\ \, \. \@ \R \n \ \ \ \ \ \ \( \* \8 \J \r \ \ \ \ \ \ \ \ \ \ \( \* \2 \4 \\.textA.data8.bssSaveReg _xalloc_u_ractive_reglock_regrele_sleep_freereg_mapreg_panic_chgprot_xumount_xuntexth_xrele$._attachreg_allocreg_detachreg_swapcluptime.o/ 568271580 98 100 100664 1874 ` u!"8 .text$ .data@.bssHP8<@D~Hz!<!LL pǀX 1'2ב\ס`|nz2*"LLL~HǎDǞ@Ǯ< Ǿ8PPW :"4 mn2"'W Q!Q Q 0< #  p'JF" 4#  m  n 4#  m  n!0F 4# m n$ mn n, (2$21  ,W8ȩPP.XT !.X0\ !` !d !h88W~pA7 0F syppm pn'18t700m 0npn700,4σ0@(t'1D00,!! < 8 < <~ǎǞ W @(#)time.c 6.1 87/11/24 W`/Lw/K:/JMFw/($*$V$v$$ $ $$$$$($0$R$Z$|$$$$$$$$.text.data.bssHSaveReg _timelap_dstflag *_timezone_timetoYMDHMS_YMDHMStotimetimeout.o/ 568271596 98 100 100664 2207 ` u!".textx<$ .dataxx8@.bssH48<@~Dpp p   , (ק  ~Dǎ@Ǟ<Ǯ8Ǿ4HHW@48~<pq iW'' l%# D%! ?Qa1`&! 7Rb1@&# 3Td1 &' 1Xh1 wa 3~<ǎ8Ǟ4@@WP48~< fހxJn@W'' ^%# >%! ?Qa1T7Rb1<3Td1$1Xh1 qhW'' n%# F%! ?Qa1`&! 7Rb1@&# 3Td1 &' 1Xh1( ]H.LWހx   &~<ǎ8Ǟ4PPWH@~Dp Pd'~ d~Dǎ@HHW @(#)timeout.c 6.1 87/11/24 timeout table overflow,<.<4 <8 <: <D<F<P<V < < < < <8<><@< <T<V<f<j<l<v<x<<< <<$<&<.<0<J<L<Z<b <.textx$.datax8.bssSaveReg _timeout_callout_spl7_v_panic_timeid_splx _splhi_timein@_delay_wakeup_u_sleep_untimeout trap.o/ 568271615 98 100 100664 6096 ` u!".textH .dataHH@.bss XHLP~Ts0 !p   44 !phWt d =X(ZRp : (ēdn P3Qa1. d z"$0 <* @HvT)f^V {s   pR @d0 z3Pd^( @d0 z3P^(̋ @d0 z3Pا^(~ @d0 z3P^(d,Zz d0@d z(Ph^,t dd0 z3P^(&d z"0yn d1!q!@<$#"!Fp< @d0 z3P ^(:p @d0 z3P P^(p @d0 z3P ^(pt @d0 z3P ħ^(p< @d0 z3P ^(Zp @d0 z3P 4^("p @d0 z3P l^(p{8tun @d0 z3P ^(w8@!f V"dD 4d( ~TǎPǞLǮHXXW@~<p ~<@@W @(#)trap.c 6.1 87/11/24 L t@$$L D|D%x regsave != 0trap.cPROT or TRANS fault: va=%x pte = %x no pte trapuser = pid = %d uarea = %x ps = %x pc = %x trap type %x Privilege Violation at Address %x for Process %d comm %s Invalid Kcall at Address %x for Process %d comm %s Illegal Instruction at Address %x for Process %d comm %s Data Alignement Error at Address %x for Process %d comm %s Accessed Address %x Illegal Trap %d at Address %x for Process %d comm %s Memory Parity Error at Address %x for Process %d comm %s pid %d killed due to page fault read error comm %s syscall Integer Overflow at Address %x for process %d comm %s Integer Zero Divide at Address %x for process %d comm %s Real Overflow at Address %x for process %d comm %s Real Underflow at Address %x for process %d comm %s Real Zero Divide at Address %x for process %d comm %s Inexact Result at Address %x for process %d comm %s Real Before Trap at Address %x for process %d comm %s Check Instruction Failed at Address %x for Process %d stray interrupt at %x . 4 > H  r                  0 6  : <  J P  X \ ^  d  l t  x z                              " $  , 6  @ B  J L  V X  ` j  t v  ~                                       $ &  4 8 :  @  N T  X Z  ~                                  " $  . 8  D F  N P  Z \  f p  | ~                                   & (  2 L N  V X  b d  l v                         $ * 2 h l p t x |                .textH.dataH.bss SaveReg _trap_assfail_u_debug_mapa_panic_curpri_runrun_qswtch_grow_addupc_psignal_issig_psig_stray_printf$_panicstr_addupc_clk_logstrayutssys.o/ 568271630 98 100 100664 1156 ` u!#D.text< .data @.bssX<~@phN  r0( - Y )x Y@$! z"0 #7΀ 8#| ǁ$z pDHJ&P&D Ȇ Y.@WY Y~@ǎ<XXW @(#)utssys.c 6.1 87/11/24 <<L <N <X <d<n < < < << < < <<(<: <F<X<Z<h<t<.text.data .bssSaveReg _utssys_u_utsname_copyout_suser_copyin_mount_bcopy_vbsdcompat.o/ 568271644 98 100 100664 1237 ` u!#T.text .data0|@.bss  z z"z1#$ < 0<#"( W 20$0@0WX<@DHLP~TsЋLJ( |  Bb ,Ћ, h* ,,  ~TǎPǞLǮHǾD@<XXW8&88W @(#)bsdcompat.c 6.1 87/11/24 selwakeup  * , 68T V  &J^.text.data0.bss SaveReg _proc_v_ufavailP_u_uiomove_copyout_copyin_bcopy_panic_procfind_selwakeup i_domain.o/ 568271657 98 100 100664 1621 ` u!#).text .data t@.bss8 ȧ0~4*xW,q (Ljۓh~4ǎ088W!104Pz50z520,1 (00W 1 X0!z"#  , (! WH8<@~Dր2x   W,p (Lj~Dǎ@Ǟ<Ǯ8HHWH@~Dր,x$W,q (Lj . ~Dǎ@HHWH@~Dր,x W,q (Lj . 2~Dǎ@HHW @(#)i_domain.c 6.1 87/11/24  $ & ,2 6 8 @ Jxz.text.data .bssSaveReg _domains(h4@LYd_timeoute_domaininit_unixdomain_inetdomain_pffasttimo_pfslowtimo_pffindtype_pffindproto_pfctlinput i_mbuf.o/ 568271683 98 100 100664 8077 ` u!#C<&.text D .data t|@.bss@l Tl q,dN "h4z@@WX?@DHLP~T2   p p  0** ” h4ppzzz vTp @  z zq~TǎPǞLǮHǾD@XXWW8x  88WP@DH~Lpq\ z0L z z   p p 87~LǎHǞDǮ@PPW@8~<qHp 'pf~<ǎ8@@WPDH~Lp. zX z z W (R s $zLJ|zp dh'8P~LǎHǞDPPWXHLP~T(8zp0)q\ z z z  Zp Pp0)~(0~TǎPǞLǮHXXWP@DH~Lp'ގpԓʋ zܓ z z W (R s $zLJ|zp '8x ~LǎHǞDǮ@PPWpHLPTX\~`.((9T@&& z̋2$ z LjzϾdd pQЧ^hn ;,RlqV z4v z z  pl$h(<'1{p z zX |(0! s!!!*(!'7#7z3#t; zLj.dPBd&.dX&d~`ǎ\ǞXǮTǾPLHppWH@~Dph'8‹wW |( (5z"z |( x'8j`(7'2'z"#8z3#<(zz"(a~Dǎ@HHWH@~Dq(7pL D@ DF DJDLDdDfDDD D DDDD D D DD6DJDLDZD`DbDnDvDxDDDDDDDDD>DDDVD\DDDDDDDDDDDDD DD D(DjDpDDDDDDDD( D* D4D6D>DBDDDLDNDVDXD`DhDpDrDDDDDDDDDD DD D(D6D:D<DTDZDbDdDpDvDxDDDDDDDDDD$D2D8DBDJD\DbDnDpDzD D DDDDDDDDDDDDDDDDD DDD(D8DBDHDDDDDDDDD*D,D6DTDZDfDnDpDDDDDDDDDD P D R D ZD \D dD !D D D D D 6D @D D D !D D D 2D <D 2D <D ND RD TD lD rD ~D D D D D D D D 4!D D D D DDDDDDDDDDDDDDDD D.text .data .bssSaveReg _mbinit_v_mbutl_mbmap_mfree_panic_malloc_sptfill_spl7_splx_mclfree_mbstat _m_free#_debug_m_gett_mbfree_m_more-P_bzero7_m_freem_m_copyp_bcopy_m_cat _m_adj B LY_sptalloc_m_clalloc_m_pgfree_m_expand_m_getclr_mclrefcnt_m_pullup_nmbclusters i_proto.o/ 568271694 98 100 100664 824 ` u!#N.text .dataT @.bss @(#)i_proto.c 6.1 87/11/24   unix8 Td T T T T TTTT.text.data .bssSaveReg _domains_unixsw *6@L_uipc_usrreq_raw_input_raw_ctlinput_raw_usrreq_raw_init_unixdomaini_socket.o/ 568271736 98 100 100664 12061 ` u!#x)X;.text(d .data((' @.bssXHLP~TpH.('>,:dpz| z P r!!rZ  (H 0W"z! b z~TǎPǞLǮHXXWPDH~Lp( A 8Wp p~LǎHǞDPPWXHLP~Tp`'8( A 0W  Dzww  " ~TǎPǞLǮHXXW@~<px'f6T D2z (< ~<@@WPDH~Lp'z6&Wznz Pz >Wzz  "Tz$( A 0Wzz!  ~LǎHǞDPPWH~Dp'J( A 0W~DHHWPDH~Lp'8zܓz! ( A 8Wp ~LǎHǞDPPWPDH~Lp'8RLz p( A 8Wp ~LǎHǞDPPWPDH~Lp'8Ɠ( A 8Wp ~LǎHǞDPPWPDH~Lp '8NHz p2z p( A 8Wp ~LǎHǞDPPW`PTX\`d~hpP^ȧ.(>,>08'vz   z*>z!\ &z0  z!.Q^P^ Pz" PPgPzz! P^^z  (dP ^bVQVj@zD zP^:^PP^z  ^P .>ȧ>(7 C>Wz pX^P ΐ<×>zz,z   zvnz  P^Pz! PWPzz" PP<΋nlW<%' \%# <%! 0Qa1\;Rb1D5Td1,&' 2Xh1 ,P\ zX z z   zP^D !)R 8ְ 6s z   ΰ p   `(;(!:T^؆P 4l(zz"lpz plÞnzzlPz! PWPzz" PP ~hǎdǞ`Ǯ\ǾXTPWLPTX\`~dp>tǧ S.(^,0h'9`  ! t4 d(J(0WFǝXzz( = Æ   8z" 88W8zz! 8v|$zVV|Nz |0z( z|z  |܋8z! 8W8zz" 88$|LJ0zz`t&$(zz"$(z (Pt.(z"$ Lj !&tLjaJXzz% (Ǟ ^  !tLj4$(zz"$(z (4 t0P^x÷XtazQ^P^pVRVP^l<ǝz  Xz z|(! =z((9f`|z X|^x^pP Lj$(zz"$(z (h z z z X (R s $ zǨ|zhD0<^pP ,z)z$z)z$^lP6gXz,z)zXXzz @ $ xt j z(^xP ̓n$(zz"$(z (X|^x06 zؓ z z X (R s $ zǨ|z l^xP z$( A 0W8z! 8W8zz" 882Q(a z| ~dǎ`Ǟ\ǮXǾTPLWPDH~Lǘ q(7fq H(I 0W~LǎHǞDPPWh@DH~Lx$ǘ (ދ z" Wzz! z! Wzz" jnPW'' ^%# >%! 0Qa1H;Rb105Td12Xh1 z*z  .\P~LǎHǞDǮ@hhWXHLP~TpP.('>,:B @8> zpWtzz fzPz (z ~TǎPǞLǮHXXWXHLP~Ts.()>,: dphW@ @ z  6 pz ~TǎPǞLǮHXXW@~<p':Zz BWZzz&Zz~<@@W @(#)i_socket.c 6.1 87/11/24 socreate(%x,%x,%d,%d) solisten(%x,%d) sofree(%x) sofree dqsoclose(%x) soclose: NOFDREFsoabort(%x) soaccept(%x,%x) soaccept: !NOFDREFsoconnect(%x,%x) soconnect2(%x,%x) sodisconnect(%x,%x) sosend(%x,%x,%x,%x,%x)sosendmget!%x,%dsoreceive(%x,%x,%x,%x,%x) receivereceive 2receive 2areceive 3?%x,%d(%d)mbfree twicereceive 4mbfree twicesoshutdown(%x,%d) sorflush(%x) ((((sosetopt(%x,%d,%d,%x) DDDDsogetopt(%x,%d,%d,%x) sohasoutofband(%x) .d@dD dF dR dT dt d d dddnddddddVdddddddddHdPdVddTdZdxddd ddd.d4ddddddd2d<dBdhddddddd dFd\d^df!dvdddd hd d d ""d ,#d 4d @d d d d $d $d ,d 2d < d > d H d L d N d X d b$d ~%d d d &d &d 'd &d &d (d (d )d )d )d d d d &d d Pd Zd p*d "d +d d d -d"*d,dJ+dpddddd&dZ"dd#dnddd.ddd,d:d@db.dz-ddddbd|*dddddd d d d" dF(dH(dR)dT)d\)d`)db)dj&dl&dt dv d~&d d$d$d d d$d ddddddd d d d (d"(d,)d.)d6)d:)d<)dD&dF&dN dP dX&d` dh$dj$d| d~ d$d dd"d./d:dddd$dDd`dj1d"d 2d(dJ3dL3dX4dbdddddd&ddd8d9d!ddddd d$d(d,d0d4d8d<d@dDdHdLdhdldpdtdxd|ddddddddddd.text(.data( .bssSaveReg _debug_v_mbstat '_u_sofree_sobindT_spl7_splx1;_panicFQ_m_free_soclose,_soabort[_sleepis~_sosend,_psignal_wakeup_sbwait_mbfree_m_more_mclfree_mbutl_uiomove_m_freem L_m_get_m_copyp_bzero_signal)_socreate_pffindproto_pffindtype_m_getclr_solisten_soqremque_sbrelease_sorflush_sodisconnect_soaccept_soconnect_soconnect2_m_clalloc_mclrefcnt_soreceive_unp_externalize_soshutdown_socantrcvmore_unp_discard_unp_scan_sosetopt_sogetopt_sohasoutofband_procfind_nmbclusters i_socket2.o/ 568271764 98 100 100664 6280 ` u!# ,.text a .data  |@.bss@~<p 'z* z$ T~<@@WH@~Dpǀ ('z@@ $f 8$<@l~LǎHǞDPPWH@~DqH(7"xp~Dǎ@HHW@~<p`'~<@@WPDHp)8~Ly pwz|LpQ |((|~|v(g5z"z |(Z(75z&#8z3#(zz"(zz"D(zz"z p xLj~LǎHǞDPPW`?HLPTX΀~\.(*>,< z{z|w zz 6p  |h\,' n%# F%! ?Qa1l&! 7Rb1L&# 3Td1,&' 1Xh1 z  !)z" !!| ~\ǎXǞTǮPǾLH``W@~<p'zȓWzzFzz  Г~<@@WXDHLP~Ty ):zL#0L$  ~HǎDǞ@Ǯ<PPWH<~@րhJ q(DpYY DYYpWz  zYdؓ:Y Y:T z VWYVD~@ǎ<HHW`DH~Lph  Y`'7XlYY 6'7\@YY  lP X r \lTX.\YY P(hTp !Pp !.\z1 \D.Xz1 X&~LǎHǞD``W`hHL@PT@DX\  H8``W`hHL@PT@DX\  H``W(~t.\>(;Y.llt p ~XǎTǞPǮLǾHxxWp~Hphl$YY ^TlXL\`LPdh' 7 !(T~~HppWhhPTHX\HL`d  (P0hhW ~Dph fYY (Y.p#H YY \H؆$. Y*'7 S4^(~DW?HLPTXç~\  ` d lhpxlYDl,' Y|p'xp p|^xt.`;^(Y|.plf| t|:^te.|z! z|^t(>|#$|$j| x|<^xe.|z! z|^x(>|#|$x  xt ,lt`~\ǎXǞTǮPǾLHW@~L#YYL$Yp ~HǎDǞ@PPWXHL~Pph T$nYYLjLY( A 9WYY`.TYz! zT)'>T#ڰYYT$Y ~PǎLǞHXXWXHL~PphގǀzY0YT$ YY( A 9WYY b.TYz! zT)'>T#얰YYT$rY b~PǎLǞHXXWXHLPp~Tlp R708)(' (붋z~TǎPǞLǮHXXW8ȓ|   zY88W @(#)i_syscl.c 6.1 87/11/24 return from bind(%d,%x,%d)=%x acceptsorry no struct file lib rights lib from sockargs:copyin from:%x to:%x len:%d $ R X\^xz    ,@BPV  (4Rnv"2 <>HPbnt(*\`bx!~"".`bp|    8:P$VZ\t%%tv(BHLN  H V       *   & 6 l n ~                  $   & l/ r   JZlr~1 8:f~3402`fjl~6 (44ln8(.24LT\8,02lrvx*<L4:.text.data.bss`SaveReg _socket_u_falloc_bind_getsock|_sobind_m_freem_debug_listent#_accept_copyin_useracc_spl7_splx_sleep_ufalloc-_panic_m_get8_copyout_connectB_setjmpMLY_sofree_sendto_senditep_sendmsg_sosendo `_recvit hy _recvmsg |$_m_freeX_getf_mbstat _mbfree_mclfree_socreate_ffreelist_sockargs_solisten_soqremque_soaccept_soconnect_socketpair_soconnect2_socksend_recvfrom_sockrecv_soreceive_shutdown_soshutdown_setsockopt_sosetopt_getsockopt_sogetopt_getsockname_m_getclr_getpeername_nmbclusters i_usrreq.o/ 568271827 98 100 100664 7434 ` u!#<.texttt .data@.bss`?HLPTX~\Ǹ z p8W  "x h(@F4)" ~  + z(9[)9#9z3#(; ΋z ^ p 76*((zz"z!BzB(*&($zz"z!>z>$<&ҋz Ȏx; +2Z B ,q'$&z"z&>$*$  vz , p4+8~($('*zz"z!BzB(*$'&zz"z!>z>$$&HX6F v4:$ `   ~\ǎXǞTǮPǾLH``W@~< p 0q~<@@W@~<p(  T  ! ~<@@W@8~<!z p !1#z !Hp0p0( XYY>pYY$x~<ǎ8@@WH<@~Dqz p'!z !4pYY  pn($ p\2zz3 pD z(z  p Lpxxp~Dǎ@Ǟ<HHWH<@~D"8z"z3# vyp(z"!V! "H  D ; ~Dǎ@Ǟ<HHW@8~(tF(tRtXttt t *t *t ,t t t !t -t -t /t "/t 4/t :0t <0t B1t `2t b2t l0t n0t 1t 1t 1t 23t Z2t \2t f1t h1t p0t r0t t t 6t 2t 2t /t t t 1t 1t 1t 7t8t<t@tDtHtLtPtTtXt\t`tdthtltptttxt|ttt.textt.data.bssSaveReg P)X_debug3\@N|_bcopy^n H_panic} X T_m_freem_iput_m_free_u_schar_namei_prele_maknode _m_copy% _ufavail6 _ufalloc_getf_unp_gc C_fileN_v_sbwaitY c m_closef_mbstat y_mbfree_mclfree_uipc_usrreq_unp_attach_unp_detach_unp_bind_unp_connect_unp_connect2_unp_disconnect_socantsendmore_unp_usrclosed_sbwakeup_unp_internalize_sun_noname_sbappendaddr_sbappend_unp_drop_unp_sendspace_unp_recvspace_soreserve_m_getclr_soisdisconnected_sonewconn_soisconnected_unp_externalize_unp_discard_unp_gcing_unp_defer_unp_mark_unp_scan_soshutdown_nmbclusterssys_socket.o/ 568271844 98 100 100664 1651 ` u!#X.text .data l@.bssH0~Dszz@ @ @30(Wzz ~DHHWH~DpA2 @f @ f}  | f~ 8 sދ @s ΐ @s z  z z  z $zZZzrz@ ^Zs  i:s  r .(! r$W~DHHW8 88W8 ȧ~4p~488W8 ȧ~4TNzpD>z6~488W @(#)sys_socket.c 6.1 87/11/24 < > H J ^`  H|.text.data .bssSaveReg _soo_rw_u_sosend_ifioctl_rtioctl8_bzero$`_soclose_socinit_mbinit_spl7_ifinit/_splx;_soreceive_soo_ioctl_soo_stat_soo_close_domaininit ...LIBWB.a! / 568273023 0 0 0 1486 ` ZSaveReg_SwapBits_wbetattach_wbetinit_wbetioctl_wbetoutput_wbetreset_GetWonderBoard_WBDriverInited_AllocDescRings_disableWBInterrupts_WB_Init_wbsetaddr_wbetread_tcpipOpen_WBLength_RecvDescCopy_IORAMAddr_RecvQHead_WBWrite_WBOffset_copyLANCEBufToMbuf_ipintrq_wbetopen_WB_Read_wbetintr_etherCBCopy_WBRead_LANCEError_packetXmitted_F_Cpt_Init_InitStartCmds_copyMbufToLANCEBuf_XmitQHead_XmitBufs_TempXmitQHead_XmitDescCopy_RemoveWBInterface_wbshutdown_SleepOK_WriteWBCommand_mclfree_mbstat_RecvBufs_GetXmitBuf_FlushLANCEInterruptQ_XmitQTail_ReadXmitDesc_Stats_WBWriteIOErr_bad_Write_CmdTimeout_D_Cpt_Cmd_TO_ErrCmd_wbetctrl_F_Cpt_Cmd_ReadRecvDesc_WriteRecvDesc_WriteXmitDesc_WBDevice_WBPresent_IOMapAddr_ReadRevCodes_RealRecvBufs_RealXmitBufs_diagCBCopy_ReadPhysicalAddr_localAddress_SetLogicalAddrFilter_CreateInitBlock_InitBlockCopy_WriteInitBlock_InitDescRings_TO_ErrInit_StartTimeout_D_Cpt_Init_TestRecvBufValid_FindRecvPktEnd_etherbroadcastaddr_nbpkterr_nmbclusters_mbfree_rawintrq_rpintrq_ifnet_rthost_rtnet_rtstat_domains_TO_ErrXmitwonder.o/ 568273022 98 100 100664 33938 ` u!(}u.text6=L .data667Tt@.bss<< q 0@ #q%0@ 4q3@~p GqApppqpwp~ǎ ǞWH8<@~DpF^F d<pTJ !   p h   ~p B   .$ Z~@ǎ<HHWpDHLPTXЧ~\z zP^n (!  (! ^ hnhY3Qa1<.h>b@^nz.0h ;gz&W1 ( z"0 # \X!0 # L%0(# @sz' !''!   !pׁωb& F)z7ΰwz !pׁb&  =8&fրp  p p yp  p p=(=( :h=,=,^nz) ~\ǎXǞTǮPǾLHDppW8 7~4 *zp  z~488W8D j7ȓ 88W8 `  @@WP@DH~Lpސ چ P q\? p0 0sp0`6@? sps0 pxx p  )7IǡϪǢϪD4$p =pސ ٮ P q\? p0 0sp0`6@? sps0 pxx p  )7IǡϪǢϪD4$p =~LǎHǞDǮ@PPW8 * 88WH8<@~Dp9& *r ێF =910021002"ً ސ ~Dǎ@Ǟ<Ǯ8HHW  W8 ȧ~4p J~488WH<@~Dπ(p  rᆐ9~ސ~Dǎ@ Ǟ<HHWH8<@~Dpޠ      q :ըޠ  b  n  q :0ހ~Dǎ@Ǟ<Ǯ8HHWH<@~DpA(Ԇz  pφp&:X=LH&=LJ&=LR&=LV!=LX!=Ld!=L(=L)=L*=L&=L&=L"&=L&!=L(!=L4!=LH+=LJ+=LN+=LP+=LT+=LV+=Lb=Lt,=L.=L&=L&=L&=L!=L!=L!=L=L/=L0=L$1=L0!=L2!=L>!=LH"=LL#=LN#=LV$=LX$=L`"=Lb"=Lf"=Lh"=Lt"=Lv"=L$=L$=L$=L$=L!=L!=L!=L=L=L!=L&=L 4=L 4=L $4=L &4=L 0#=L 2#=L 84=L :4=L D4=L F4=L J4=L L4=L R#=L T#=L Z4=L \4=L l4=L n4=L r#=L t#=L 4=L 4=L 4=L 4=L 4=L 4=L 4=L 4=L 4=L #=L #=L 4=L 4=L 4=L 4=L 4=L 4=L 4=L 4=L 4=L $4=L &4=L ,#=L .#=L 44=L 64=L @4=L B4=L F4=L H4=L N#=L P#=L V4=L X4=L b4=L d4=L h4=L j4=L =L =L 8=L 8=L 8=L .=L D=L F=L Z =L =L :=L =L =L (=L <=L <=L <=L <=L ==L ==L =L =L =L H<=L J<=L Z<=L h<=L n==L p==L ~=L =L =L >=L >=L #=L #=L ?=L ?=L ?=L ?=L ?=L ?=L ?=L ?=L ?=L #=L #=L ?=L ?=L?=L?=L?=L?=L.<=L0<=L8#=L:#=LH?=LJ?=LN?=LP?=LX?=LZ?=Ld?=Lf?=Lr?=Lv#=Lx#=L?=L?=L?=L?=L?=L?=L>=L>=L<=L=L=L,=L=L=L=L@=L@=LA=LB=LL=LP=LR=Lb =L=L4=L4=L4=L4=L4=L#=L#=L4=L4=LD=L=L=L=L=L$=L*=L0=L84=L:4=L@4=LD4=LF4=LL#=LN#=LT4=LV4=LdD=Lr=Lx=L=LF=L!=L!=L$ =L*G=L,G=L<H=L@G=LBG=LLI=LNI=LVJ=LXJ=L`J=LdK=LfK=LpK=LzG=L=L&=L&=L"=L#=L#=L$=L$=L"=L"=L"=L"=L"=L"=L$=L$=L$=L$=L&=L"&=L$&=L.!=L0!=L@&=LB&=Lh&=Lj&=Lt!=Lv!=L&=L&=L&=L&=L!=L!=L&=L&=L&=L&=L!=L!=L&=L&=L$=L$=L&=L&=LL=LL=L.=L2!=L4!=L<!=LN&=LP&=LX&=Lf!=Lh!=L&=L&=L"=L#=L#=L$=L$=L"=L"=L"=L"=L"=L"=L$=L$=L$=L$=L"=L#=L#=L$=L$=L"=L"=L"=L"=L"=L "=L.$=L0$=L@$=LL$=L`,=Ld&=Lf&=Lp!=Lr!=L&=L&=L!=L!=L"=L#=L#=L$=L$=L"=L"=L"=L"=L"=L"=L$=L$=L$=L$=L!=L!=L!=L"=L#=L#=L$=L$=L("=L*"=L."=L0"=L8"=L:"=LH$=LJ$=L\$=Lh$=Lv"=Lz#=L|#=L$=L$=L"=L"=L"=L"=L"=L"=L$=L$=L$=L$=L!=L!=L!=L!=L!=L!=L:<=L<<=LJ>=LX>=Ld>=L?=L?=L#=L#=L>=L>=L?=L?=L?=L?=L?=L?=L#=L#=L>=L>=L?=L?=L?=L?=L?=L ?=L>=L>=L.>=L<>=LX?=L>=L>=L==L==L=L?=L?=L?=L?=L#=L#=L>=L>=L?=L?=L?=L?=L ?=L ?=L#=L#=L >=L">=L*?=L,?=L0?=L2?=L>?=L@?=L|4=L~4=L4=L4=L#=L#=L4=L4=L4=L4=L4=L4=L4=L4=L4=L4=L4=L#=L#=L4=L4=LD=LD=L@O=LBO=LN<=LP<=Lx?=Lz?=L~?=L?=LQ=LQ=LQ=LQ=LQ=LQ=L Q=L Q=LQ=L>Q=L@Q=LHQ=L^Q=L`Q=LhQ=L~Q=LQ=LQ=LQ=LQ=LQ=L?=L?=L=L=LO=LO=LO=LQ=LQ=LQ=L*O=L8O=LDO=L\O=LhO=LvO=L?=L?=LQ=LQ=LQ=LQ=LQ=LQ=L=L=L.Q=L0Q=L8Q=LHQ=LJQ=LRQ=LR=L=L=L=L=L=LRT=Ln=L=L=L=L=L=L=L&=L,=L6=L<=LF=LL=Lz4=L|4=L#=L#=L4=L4=L4=L4=L4=L4=L4=L4=L4=L4=L4=L#=L#=L4=L4=LQ=LQ=LQ=L =LD=LD=L(W=L*W=LHX=LLW=LNW=LVW=L\4=L^4=LdY=Lh4=Lj4=Lp#=Lr#=LD=LD=LZ=L=LY=LY=L=L=L\=L\=L4=L4=L \=L #=L #=L 4=L 4=L "Y=L *4=L ,4=L 44=L 64=L BY=L VY=L h.=L =L =L =L \=L \=L \=L Y=L .=L =L 4=L 4=L!04=L!24=L!64=L!84=L!>=L!D=L!J4=L!L4=L!R4=L!Z#=L!\#=L!b4=L!d4=L!~4=L!4=L!4=L!#=L!#=L!4=L!4=L!Q=L!Q=L!Q=L!4=L!4=L!4=L!4=L!=L!=L!4=L!4=L!4=L!#=L!#=L!4=L!4=L"4=L" 4=L"4=L"4=L"=L"=L""4=L"$4=L"*4=L"2#=L"4#=L":4=L"<4=L"v#=L"x#=L""=L""=L# "=L# "=L##=L##=L#z#=L#|#=L#?=L#?=L$?=L$?=L$#=L$#=L$z`=L$a=L$`=L$a=L$a=L$a=L$R=L$b=L$b=L%a=L%a=L%#=L%c=L%4=L%fL=L%hL=L%le=L%ne=L%|f=L%g=L%g=L%h=L%h=L&>==L&@==L&Di=L&Fi=L&Tf=L&|g=L&~g=L&h=L&h=L'<#=L'>#=L'Jj=L'Lj=L'Pj=L'Rj=L'Zj=L'\j=L'j#=L'l#=L'tj=L'vj=L'zj=L'|j=L'j=L'j=L'D=L'=L'=L'4=L'4=L'4=L'4=L'#=L(#=L(&=L(*l=L(,l=L(o=L(o=L(o=L(o=L(o=L(o=L(o=L(o=L)o=L) o=L)o=L)F#=L)H#=L)To=L)Vo=L)~=L)=L)"=L)"=L)e=L)e=L)"=L*"=L*"=L*c=L*c=L*T=L*Z=L*l?=L*x?=L*i=L*i=L*?=L*?=L*?=L*c=L*c=L*=L*=L+$=L+O=L+>=L+<=L+\4=L+f4=L+n4=L+v4=L+| =L+4=L+4=L+4=L+4=L+#=L+#=L+4=L+4=L+=L+=L+=L+D=L+=L,=L,=L,r=L,&t=L,(t=L,2t=L,PX=L,Tt=L,Vt=L,Z8=L,\8=L,zZ=L,=L,r=L,r=L,=L,=L,4=L,4=L,4=L,4=L,4=L,#=L,#=L,4=L,4=L,D=L,=L,=L-0 =L-4=L-6=L-@8=L-B8=L-Vr=L-`8=L-r.=L-z=L-#=L-#=L-<=L-<=L-?=L-?=L-?=L-?=L-?=L-?=L->=L->=L-O=L-O=L-?=L-?=L-=L-=L.>=L. >=L.("=L.*"=L.D"=L.F"=L.bQ=L.dQ=L.lQ=L.p"=L.r"=L.Q=L.Q=L.Q=L."=L."=L.Q=L.Q=L.Q=L."=L."=L."=L.Q=L.Q=L.Q=L/$=L/$=L/0"=L/2"=L/"=L/"=L/=L/=L/"=L/"=L0#=L0#=L0j=L0j=L0j=L0j=L0j=L0 j=L0*j=L0,j=L0L=L0R=L0x=L0=L0=L0=L0=L0=L0=L0=L0=L0=L0=L0=L0=L0t=L08=L0\=L1W=L1 D=L1=L1&=L144=L164=L1<4=L1@4=L1B4=L1H#=L1J#=L1P4=L1R4=L1fD=L1z=L1=L1D=L1=L1=L2F"=L2J#=L2L#=L2P$=L2R$=L2^"=L2`"=L2d"=L2f"=L2n"=L2p"=L2~$=L2$=L2$=L2$=L2$=L2$=L2"=L2#=L2#=L2"=L2"=L2"=L2"=L2"=L2"=L2$=L2$=L2$=L3$=L3$$=L3&$=L30L=L32L=L36l=L38l=L3^$=L3`$=L3jL=L3lL=L3pw=L3rw=L3"=L3#=L3#=L3$=L3$=L3"=L3"=L3"=L3"=L3"=L3"=L3$=L3$=L3$=L3$=L4$=L4$=L4"=L4#=L4#=L4*"=L4,"=L40"=L42"=L4:"=L4<"=L4J$=L4L$=L4\$=L4h$=L4p"=L4r"=L4=L4=L4=L4=L4=L4"=L4#=L4#=L4$=L4$=L4"=L4"=L4"=L4"=L4"=L4"=L4$=L4$=L4$=L5$=L5 $=L5$=L5""=L5&#=L5(#=L56"=L58"=L5<"=L5>"=L5J"=L5L"=L5X$=L5Z$=L5l$=L5x$=L5$=L5$=L5L=L5L=L5=L5$=L5$=L5L=L5L=L5=L5$=L5$=L5L=L5L=L5=L5"=L5"=L5!=L5&=L6=L6.+=L60+=L66=L6RZ=L6Z =L6=L6y=L8H=L8L=L8P=L8T=L8=L8=L8=L8=L;h=L;l=L;p=L;t=L;x=L;|=L;=L;=L.text6.data6.bss<SaveReg _spl7'2 <G S8^$l_printfn_splx~%L_WB_Init/_bcopy<(3_WBWrite4>H_m_copy_m_adj_m_cat_ipintrq_m_freem\6 _wakeupfp{_WB_Read1 (_WBRead|(+@_loif$. A_SleepOKMd_m_get_mclfree]_mbutlh_mbstat s}-t#h_StatsH_d_read_d_write  _timeout_sleep"d"%#_ctladdr4>IT'8bp_ksct_kbasez'(()0) -#/.(A.Qe<_ipintro_mbfree|_rpintrq_ifnet_rthost_rtnet_rtstat _domains_ipintrqFull_SwapBits_wbetattach_arpmyaddr_wbetinit_wbetioctl_wbetoutput_wbetreset_GetWonderBoard_WBDriverInited_AllocDescRings_disableWBInterrupts_if_attach_if_rtinit_arpattach_arpwhohas_wbsetaddr_in_netof_in_lnaof_if_makeaddr_wbetread_tcpipOpen_WBLength_RecvDescCopy_IORAMAddr_RecvQHead_WBOffset_copyLANCEBufToMbuf_wbetopen_arpinput_rawbuffer_rawinput_wbetintr_etherCBCopy_LANCEError_packetXmitted_F_Cpt_Init_InitStartCmds_arpresolve_copyMbufToLANCEBuf_XmitQHead_XmitBufs_TempXmitQHead_XmitDescCopy_looutput_RemoveWBInterface_wbshutdown_WriteWBCommand_m_clalloc_mclrefcnt_RecvBufs_GetXmitBuf_FlushLANCEInterruptQ_XmitQTail_ReadXmitDesc_WBWriteIOErr_bad_Write_CmdTimeout_D_Cpt_Cmd_TO_ErrCmd_wbetctrl_F_Cpt_Cmd_ReadRecvDesc_WriteRecvDesc_WriteXmitDesc_WBDevice_WBPresent_IOMapAddr_ReadRevCodes_RealRecvBufs_sptalloc_RealXmitBufs_diagCBCopy_ReadPhysicalAddr_localAddress_SetLogicalAddrFilter_CreateInitBlock_InitBlockCopy_WriteInitBlock_InitDescRings_TO_ErrInit_StartTimeout_D_Cpt_Init_TestRecvBufValid_FindRecvPktEnd_etherbroadcastaddr_nbpkterr_nmbclusters_rawintrq_TO_ErrXmit# " @(#)mk.field 6.1 87/11/24 " # directories under this directory OS = os/ CF = cf/ IO = io/ ML = ml/ KDB = kdb/ NET = net/ WB = wb/ NETINET = netinet/ INCSYS = sys/ # Librarys produced MLLIB = $(ML)LIB0.a OSLIB = $(OS)LIB1.a IOLIB = $(IO)LIB2.a KDBLIB = $(KDB)LIBKDB.a NETLIB = $(NET)LIBN.a NETINETLIB = $(NETINET)LIBIN.a WBLIB = $(WB)LIBWB.a ULIBS = \ $(MLLIB) \ $(OSLIB) \ $(IOLIB) \ $(KDBLIB) \ $(NETLIB) \ $(NETINETLIB) \ $(WBLIB) # make two references to ULIBS in order to fully resolve inter-library refs UNIX = $(CF)conf.o $(CF)linesw.o \ $(ULIBS) $(ULIBS) all: -cd $(CF); $(MAKE) $(MAKE) unix unix: $(UNIX) unix.ld rm -f $@ start.o ar x $(ML)LIB0.a start.o /bin/ld -N -o $@ unix.ld -e _start start.o $(UNIX) chmod 544 unix rm -f start.o install: clean: rm -f start.o -cd $(CF); $(MAKE) clean clobber: rm -f unix start.o nmunix -cd $(CF); $(MAKE) clobber nmunix: unix nm -vx unix |pr -4 -w130 | tee nmunix | lp -tNM_UNIX /* " @(#)unix.ld 6.1 87/11/24 " */ MEMORY { valid : org = 0x80042000 , len = 0x8000000 } SECTIONS { .text : { } GROUP ALIGN(0x1000) : { .data : { } .bss : { } } } .........p!M> P) `H~  0.text   ` .data00H @.bss 1H 1H~`qFFЋL@8 `m*`L ```pt xp`p`=<`@ 2 FhD! CzFFaFpAB C^oBP[6 D F FptF`pABC DCF FptF`pABB8ȓ88W8ȓ88W0 Г00WWW@G^QGUFP@GN8h(FrD B2FFDFFBP[G$F8F`0FsAB@P\A?|@PHA?v@P4A?p@P A?h@P A?`@P A?d@P A?\ @GSUڋA?2@P@PA?,@P|A?$@PhA?@GCBPV@CB@P A>G7G0F |pRUWU~jfb‹ҋ.fGN8G G1$XG"G3$`G7#( h# FrG$$hGGphDFFD F LG&FnFBB#4%P[GF8AhFD!pFbFsABGNAGE8G740 @G$$hG&G7$p.Q!_LFrhDFFD !LFD@FnG FBPHP[LeHP*[PGD4tGG$2tjﴎP﵆VLPGD(FrhDFFD@FnFB#4$P6[LPGDBhFDBpFd8FFsL80AB@FCBP[P[G@FPFB FBWWUD! G/"FF> FnHF >(^0Ǿ8LB` P$[`ɀɠ WFW@G7*8G/! GS$# !_BP [$G0t80Br@P.!PP. >$"ZP[$W W# W # ܧW # LW0@BC0ABC(b@ AG@C@(A@:H@A(($0@A$$@A""  @A WW LnL `` 0 10`8 10`Gǭ  ΀ΐ8 ΀ΐPUUUUI4TLtu`4v4ΐj`9CpLPUUUUdTLtW*&UTLtWd99dGۧ nɎɮ W^L W. hn`.d\q q.uL << >hBd HWP[G'# 8FqGF@_L!!BP[G'# 8xFqF_LBP[G'# 8PFqGF@L!!fB<n~. 0@. 1BPP0P`rÆx"Rb^"Ȏ@@n~ǎW@L 8  WWWLW! ` 201L<TA@0L<A@R^Pp!%pWLWLW  [/etc/init$@8z~<$ $ zFp n!    q   uW88$$\~<ǎ8@@WH8<@~Dzpz$ $ zfQ`!    q   uW88$$ k!(zZz " "f!0 #!'0 #    ! 'q(0 #0#"uW88$$zދ~Dǎ@Ǟ<Ǯ8HHW@8~<$p$ǀ zq   uW<<$$  (8 * ,YY Y~<ǎ8@@W8$$  ︧4!0 #! !0Z88W8 k$(  88W8 ȧ~4p@  ~ kQ @   k kRQ   , . k kr ' p k* k kr 'p k  7  k k~488Wz 0 ~ pz20s  0 o o0@(A$@zDzrG@p G@ ~WH8z<  @ ~D  p z* s ߁ o(x(zz*   \QB @ $z$$z$Z4' !  '!(  k kГBwx9 k k* k @  k k"ȓp kp'  ' (  k kГQ    Vp x  (  ~Dǎ@Ǟ<Ǯ8HHW@8~F$z$ ,YY Y~<@@W8"   &!0 #!88W@~<p$' 0~<@@W@48z~<&p kzR  zzz(j  ' !  '!(  k kГ p k"  w 0 k[~<ǎ8Ǟ4@@W0 ހ o~4"@zDC@p G@!s܀~ǎWP<@DH~Ls$ s sHhޠ k k   s<q  |psp q  |Іphn ! q!? !p"q0 s$0p1P5q@? sps0 5pqz <qs(Yp kp o< <ps< k( o s(~LǎHǞDǮ@Ǿ<PPW@8~<րs2p kQ  p'4`  \' !  '!(  k kГ >xw  k{&DဋFH<@~Dp` ⴆ. ⨋    ⨄  2 !  Ć  ! ﴋz $P$$z"z5zRz%  #! # $z"  #! # $z"  $! $ ! p!#pd!!#j'X1z3104z10421 z30 "1 z3z04104,20W P( j`N ((@'72s( zzz 2$$*!  $1# $  (! p ~  88pq (('q0< <qs(q $D$D$H$H $L$L$P$P.t$ t(!,ަt4z\~Dǎ@Ǟ<HHW@~<p.` (` ~<@@W0 ГĎ " lh 00W@p`$"rr!SsHphsHpl@@WH8<@'q~DqrR P 2 pppps 0q2'p~Dǎ@Ǟ<Ǯ8HHWH<@~Dpz qV pps!rRr~Dǎ@Ǟ<HHW@8~<$pd" phpdnPphqphp`phpsH(sHph~<ǎ8@@W8 ȧ~4pxB plplrp` plpsH(sHplvpdQ" phpd~488W@8~<p`psHph6Pphph !phph phsH(sHphsH<plp瘎p gPh^0Qa1&! 0Rb1`&# :Td1@&' 4Xh1 ~<ǎ8@@W@~<p q~<@@W@~<p q  !n~<@@W@48~<p((FǗ( ,P  W' zq z5@ 42z3@ 4z3pz z    p 0 z4 0 z8 (" $$ *7 ,ÃB"2A~<ǎ8Ǟ4@@W@8~<pǀ(p, V *7 ,ǃ@4A'~<ǎ8@@W@~<p! . z  ~<@@W@8~<q q~<ǎ8@@WX@DHLq ~Pd 0 spP0? sps0 p15 ? pq аdǐ n$$*q @p!!"0@pxx    X!z"!XxT%/% %/"$$T(  T!0b !x/x! !Txx0  (1fxg^T3Qa1H $! $!$ jx   '  d~PǎLǞHǮDǾ@XXW`HLPTX\~`( dq  0 sp 0? sps0  Ls p ? p  P   $P$^pdp , Zd^pP'q!0@#=p"#"0@px%(!  (! p W$ $!0_F* d^pPxxx    "  +$$̋dt0 mf t0!( +n.$$t0!'M c-1p6zDz"$#-pQ^l0=Ý!p&z3zp!!"plxxxhPt0q^dax B^xQ2.hax!!0 ! Ltnl(6,ndl$.xx! cZt08T Pt0 ! z,z-z" (0`t^ Q^^xQ$$h QzUQ^tP@z2xx   !X! ct ,1tzt*  xx    X!8 #!Q%0 # %0 #!" ! tP^$$Q^~^~zUz^~P^:xx   !X! b^tQ^^zt^z  Ǹ^ z  ^a%\pn[Q^xx   pΠ(  Dn$ ^~ z^~z ړ§R^~z\ސ J 2d^pPd^nV^Z^%$.L n^V^P^^Q^x0] Q^Pn e%ˊ" ! xx    X!8 #!Q%0 # %0 #!t: d^pP4l  d^pP~`ǎ\ǞXǮTǾPLHWH<@ ~D^0pJz + ,`     Vz  WzT z X(  xx   ~Dǎ@Ǟ<HHWPD~HqnLW3Qa1 xx X* Q  %0 #!\ 1Zg^L3Qa1~HǎDPPW@p YWP?8<@DH~Lp Wz!(&z'zz"  z> 00 2Y(p(|w&øz ( p(!f R   `Bq בv48q   בuvP$p {8z&!$z:# qs(ؓtx`\"$!!!z"z:#L  s(! z ވz  Wz pvz  W#~LǎHǞDǮ@Ǿ<8PPW8 &z0@ @@ @  @`D yhq( t ̎ 0z#0 #00v0WDq   y`( .z#0 #00uW sf Y88W@8~<p`z'6Yz  z YVZ FZ\s s   Y~<ǎ8@@W@~<=Lp V Z!Z"z&$YY !2~<@@WZH HYWp&! l @ YW@8~<q z0(04y4$$Y>(pzq ~<ǎ8@@W {(sp {(W 0z40z3zA4$@0 2CW8v u! u u! u! 8 2 # 0  0!0!!! "!Wzruu  !0 ! 8 8 8W@8~<pހRquԀpuR@@*@@@quЀu~<ǎ8@@W~@ruuuu@ !`Y)' n%# F%! ?Qa1`&! 7Rb1@&# 3Td1 &' 1Xh1d z p"p~ǎǞW8  ~4q  uu@p@*@@p@~488W 00620-20 %t20 B1C21C "!   "!   Wp@DHLPT~Xrz l Ǻd * z -hdp(WR*zz"NJ "*zz"  rNJ *zz"NJ v*zz"n\Z*' ^%# >%! ?Qa1\7Rb1D3Td1,&' 1Xh1 *`1GC ! 10 \8 .@NJ l*zz"  n\Z*' ^%# >%! ?Qa1\7Rb1D3Td1,&' 1Xh1 *`1GC ! 10 \0 .8( VNJ <*zz"   V'z"z! NJ ԋ& 'WlD('!   (. ~XǎTǞPǮLǾHD@ppW0~ !#2@C !|0d3 B z34(0B40BC !H<0BC00B4$Rz52z510z32 z" udq 0zwz3V2TBA4B( zGRzz0 BA " ~WX@DHL~PqT08÷z h ' .THgZ*' l%# D%! ?Qa1`&! 7Rb1@&# 3Td1 &' 1Xh1  '!'+H~PǎLǞHǮDǾ@XXW`@DHLPT§~XpЧ\z z     p n( ,z ( R z  ԋ .\*\ (p  p-fH  p.F  D tH} (pp ~XǎTǞPǮLǾHD@``W0 z"! C$ : z""C D $  z" \  J 3# .3 3 #   W d0 z3z .P   W@8~<p <&ǁ d" 1 z"# ,~<ǎ8@@W@~<t`stt(,b΋p x` R$   `!t`<qs(p  zz z  z b `t`Dt`r& :s2w_H@~Dp$ ftLJzzz b `t`Bt`rB VrNqm~Dǎ@HHWP<@DH~Lpz0H evWz@0zz?@@ppWz z+ "Çp'zz"()΀@((6ǀ "ǀX Π !1@C{~LǎHǞDǮ@Ǿ<PPWxDHLPTX~\pzp >dHz z  Q^` P^`z pz @t*^tez"z? @lpV^hVpR^dZnhzzƋ.d!"pqnhzz@Q   ( ';l 0p@Q4  ( ';( L x%(!  (! pXWxx    X!$ )0 #0 #)A 2 2$/x/x) 29s #0 #1 1 # )  0 ! '; <^x zB$ $! '; t   E_j`  B$ $! '; @ 4 t,s!" '; t7 '; zp& `!t`4^tQ^t^dT^d^h@Q^h^tnleo ';B ~\ǎXǞTǮPǾLHDxxWhDHLPTX~\qz ;_Q^`p >sdd ܓZ.dZ^dQ tYP^`dVzL8  < hp' pz4"Y  !0Nhndlas1" <.d 0N&d! :`~\ǎXǞTǮPǾLHDhhWP<@DH~Lz`x ]z(zxx    Xq(  '<z ]^zzNP@ pPq ! $$9~LǎHǞDǮ@Ǿ<PPWPxPP  ! :   Px `P  s!WH<@zސ ~D$T$T   pq*7 )2'z"z8#w!p'0x#4ȓ[$$YH' 72'7 2 '72'72!r!'q\  ޣXWz z  ȋzZ"8!!(!' Ázq   s(! ГY(z   zz ~Dǎ@Ǟ<HHWH<@~Dpz qqzY )$z0 0? p! $,@:11!1!1!A=(40  `2$Qq   !v! $ ~Dǎ@Ǟ<HHW@~<pzz z2zB zz\ z F !lRpPxW pzRF~<@@WX8<@DHL~Pz2zB Yz9 z qqz ^Y$^Tz  ? ^TpQ^Te^T^T^T ^T^Tu $  `$ $  ЋHؓP,q!,q!,qѡ!(&q !q !q ѡ!(݋VЋHPh,q!,q!,qѡ!(  `2$Qq   v  $z^T4z^T8z @ ^T<z   z9 ~PǎLǞHǮDǾ@<8XXW888W8 88W@DHLPTX~\ Sz qq@q  (z !q\ øzZ ^        p*$2q$1} |xY z -|pY0z '$ xf^n^pVntnxn|cp>p.`CA@ ACqB$4ssT.l20 01q$q^up*$! q!.`'z !sϞώlϮ|(* 0z 'qq^up z .q`~\ǎXǞTǮPǾLHDWp@DHLPTz ~X p  \ < , "WgW^h~h Q^hh.\` dz `Ǻ$P$.\ ndp!+p@ Ǯ`Ǻ$qpQ[^l@l$z)0z^lqT^lndgV`:nh1(0$^dpz)Vz4 ~XǎTǞPǮLǾHD@ppW@ ~< Jz z! p~<@@W8ȲxXPPtTf88Wz  R0z3zB4<0z30*0@C0@C0 0`0s1W`8~\18>`<d*H ȍ Y~Dǎ@hhW8 c   "0 yp ypWD88WWWX<@DHLP~Tրx8-p"H s  p s   p p8tD@t6t*t ppx8(@~TǎPǞLǮHǾD@<XXW0#A1$   WH<@~Dpހސ@ɸq@H H.~Dǎ@Ǟ<HHW@~<` ȓBBp p* 1H '!s" ~<@@W0 YWH<@~Dpdt\ z t,z   sz$$ $PLbW%s#(" %s#( $|PPtxXLP XP.(zptpxL$Q0zp ! tpxL|~Dǎ@Ǟ<HHW888WH~D&ֶ-p  %`pq ? qlp   sp P%0? sps  p %Jq!? !p"q0 0sp1P5q@? sps0 5p   #   J Lpt8 Wt :0`zhz! `zB!z1 ,Op( 3S#.(!0[: AOXOp( 2R 2"q,3q<CN(ZO nDd@hL8D~$!d!3 #! 4! &<%8~@r6~$!d!3 #! D! (VL'B8޶@ҋ2T& \%o~DHHW V0SA(10F@4A@EA@$00WH@0~Dq( (b QR :  $QZpR&:(:v>pq~Dǎ@HHW@0~<qp XBt'\t'\YZ,t't'tt||xx~<@@WP<@DH~L  pqxxq!0 #;s.p"#2P5!@? $s&p"#"s!0 #p!%0? pxx  p)0 #!'o~LǎHǞDǮ@Ǿ<PPWP<@DH~L  pqxxq!0 #;s.p"#2P5!@? $s&p"#"s!0 #p!%0? pxx  p)0 #! 'o~LǎHǞDǮ@Ǿ<PPW W8!> Y88W8t YDxx||ttx 88W8xȎ Rt|Y0xx||tt88WH<@~DYt| 0߀0p 0  t|! !"Y~Dǎ@Ǟ<HHWx<@~Dրh p  0ߑ 0l  TZ''6 x't|(        Z'' H 0xYd'LHJ' !P0  d,Nv 8 0YY ~Dǎ@Ǟ<xxW@0~<r S  2gz(Ptz&' z"!(p~<@@WPh 0t|0(^L Ч^, jL>tx  ($, t|  0lPPW@~<ttq p >1Fttpt!P hP  t1!~<@@WX<@DHLP~Tրh$$` l  0ߡ 0 H0Yp ~ $Y4 $ Y  0ߡ 0 ~N8  0 qR8 T0B0H L(q*AMpq!Æp(z(  Y" z$YFtX tz!Yl'd  ( 'pb  #YD   | {8Y |~TǎPǞLǮHǾD@<XXWX?<@DHL~P֠h$$ p   0߁ 0hfttYD T$Y TY{|  $Y4 $ Y  0߁ 0{*'(  Yx  zyVlY  :,  0߁ 0z zj  Yz0xRY f ,  0߁ 0y؋^JT֐ tN  YyHy4wRY j ,  0߁ 0x܋bNXb ttX  Y& t,' !'d $T  W  & wl,wwz~PǎLǞHǮDǾ@<XXW0 h#(Y  hpW00WX<@DHLP~T$X$XWY/D ր؋ W/Y րzмY  p( qW/Y׋q !( W/@<Y2pq  Y(  @zY@Y | xЊ, . xv  @ZV@ |x~tYYІ  $\$\~. Y Yz Y tf)$q P 0#,q'   : | ||xx!||  Ԏ&"Øznf .Xp"B4zz)(LJz#\qs(z & `Ъ~TǎPǞLǮHǾD@<XXWXHLP~Tpz T(  .z(z'z" (:@~TǎPǞLǮHXXWH@~DpLހ@x n(($< o(zDX p'  '  X~Dǎ@HHW`DHLPTV VX ~\ |   qpW {? q@ pP (9(D~\ǎXǞTǮPǾLHD``W`?HLPTX~\ ? qp ps 8Ws  x    ? @ oZs  p!!0? pq!6(r0  86t ~\ǎXǞTǮPǾLH``WP@DHǎx~Lp  ` $*'1 !0 xx !',W'0 !0 xx !'!  tu~LǎHǞDǮ@PPWX?@DHLPç~T&z $ ސ@Q  xx    Xqz +#zzdx"  y  q yq ! z(x}D |(0 ~TǎPǞLǮHǾD@XXWH<@~DqPx.x z" 0xlj "\\ ">(8 z"z   @@`L@qsHހ Ht4@zDzrG(p@ Ct@B@ ~Dǎ@Ǟ<HHWX?@DHLP~TPx,xӐ z vxp ٓ!\( ړ ×zzNj     `B(s0 !,zz) ' !0!r * Pxx   x    ~TǎPǞLǮHǾD@XXW @s(    ` A 20 $ WP@DH~Lpp R`` *@\*9)0Tp ~LǎHǞDǮ@PPWH@0~Dqq 1 1gB``(~Dǎ@HHW  @@L@PX<:0@0 0P00P P100001X: @ P  P P!   !<W@48~<ÑzXp*zz)  q~<ǎ8Ǟ4@@W8 ȧ~4pz~\~488W@48~< z~Pp ")zz" `qs(  Xq0'zz"  q~<ǎ8Ǟ4@@WH<@~DqPx.x0z3 @xljp| 08\ 18H z3z     ` ppsxސ yXpzwzxLÀp t< $  rp~Dǎ@Ǟ<HHWH<@~Dq&z uqf &>֐d0b{tq %~Dǎ@Ǟ<HHWHp@q ?~DpDWpq'v ?pp bX~Dǎ@HHW80 #88WP@DH~L [FQ%8(( 1E)#y r'#82(50 v 0182C!@ABH $`>$  ! [~LǎHǞDǮ@PPWX?@DHLP~T * p  pאրtpXz ` ` `zzz z&     X  pp ` lq peLj hO s   ۓ6 p!  p!p N pq  X$P q q~ pq  X\ np`t htt ^ ~TǎPǞLǮHǾD@XXWX?@DHLP~T q  Xqq!p,q *t ]qpq((qpqzld  > ?t htqpt'z"p` < Op`z!z  8z!X H\ [Ph| \2      ! p ~TǎPǞLǮHǾD@XXW8 ȧ~4pp :d'![t~488WH.D ! xx ! DD 1~HHWH<@~D PրLXTDp '!  r'(!  ߎ (( ( œ  ƓT' !  '!   q(X ~Dǎ@Ǟ<HHWX8<@DHL~Pdp$z$f:TQx Ӂz & o @  o oW oq  oe 8 $ q   up (W@@*$ $$$p! $$&$ $($ p! $(e Ve :'p!'" p' d o  oQ @ p o  o oWxTd$z$~PǎLǞHǮDǾ@<8XXWX<@DHLP~Txqt=*@ $ TY$$$$$zV$cjF( o @  o oT oq  o, @ T֐d  ,8t$tq!0 #9s.p"#2P5!@? $s&p"#"s!0 #p!%0? p$ $q ? @p xUL |s(" WbS$$q!0 #9s.p"#2P5!@? $s&p"#"s!0 #p!%0? pxx||x TL@tq1q!ހ ljspǁPΰ? spsހ pΰ? p +*ǁ  ΀H!1΀@ 00qF o  oQ @ p o  o oSd @  SH`R 0x ,YY Y$z$~TǎPǞLǮHǾD@<XXW t0 #  x #  | # Y\ |p   Y8x |Q hxWH<@~D`z 6p dr֐lB2(p( !.lplRT~Dǎ@Ǟ<HHWH<@~Dp$RzzRzRQDRzY'Tz"zTzTP8^"  @TOTz RNRz~Dǎ@Ǟ<HHWH<@~Dp:RzRRz$WVzz" TVO:TzTTz$WVzz! RVORzZTzPϗH zH NPzB ~Dǎ@Ǟ<HHW@~<p z  MWzz ~<@@W8z! Qz  z%0 #!N88W8ȧTT.X88WP@DH~L2prz  x %xx0 9qdquqoq xq6op xp   *Zsq$ǩ zp2cqDq *0~LǎHǞDǮ@PPW`8<@DHL~P  ۋ ڋ -p>TB,(!*   q1Ŋ}q0d'TH<qp~PǎLǞHǮDǾ@<8``WXLP~Tp zP"n  Q!0<#1@<4@@ AH:(:,*`0(9lM~TǎPǞLXXW@8~<pWWp p*p p莀 ؎ RJQ@0zq   y`"zA A4t"z   uW@@WPDH@~LqzW()8~LǎHǞDPPWH~DpA2$|~DHHW@0!@@Wh8<@DH L(~P (ds* s  ( d  P^P ^XP^P^Tqq  ,sp! !!0? sps   rs  p!^X!0? p s^`^T^\d $^\P@6$^`P P Pq@  dpqq  ,sp!P%0? sps  p!%0? p s6 P:Q( q@Ʉe~PǎLǞHǮDǾ@<8hhW`@DHLPT~Xpx~|Yfç  @,p0  (` <,&zz  qvDpx q$z   6z !? !z0 1s6q@vH XqFpWz  q v8W@TTz ,z Vz! VRCf N|ZZRQ^\N< Y BҐҀ( *Ұz!" Zx\, z SJz Rz0,$!.^\P~  | ! |    :   '   Uz$ YxT |NPPNWVz"z" VTBY~XǎTǞPǮLǾHD@``Wh@DHLPT~Xp|YDç  @,   (` ֋&zzB  qvDpv q"z   4z !? !z0 1s6q@vH XqFpWz  q v,Y^\PPxY~XǎTǞPǮLǾHD@hhW48 $08 8$8s $$(W@~<p z( ;Wzz ~<@@W8z$ Qzz%8 #!<88W804 @4$d Yb@ 04@0 4  40 2z312(     88W`DHLPTX~\pz Z z ' B'z""!z"0 #!!z"! !z"!! bWÇzzz @? ѓppp‹'ǁ ֓=@11Wzz1zp('Z@р'z4z' '  fgP \0Qa1h&! 0Rb1H&# 8Td1(&' 3Xh14 4p p4~\ǎXǞTǮPǾLHD``WXDHLP~Tz   YXdpY6 z! ' z"^#gPH^;Qa1h&! 5Rb1H&# 2Td1(&' 0Xh1Y`7 z3^3 d,H F z (dzz~TǎPǞLǮHǾDXXWP<@DH~LzdǑXd _zp ` cQq!0 7sp1AA ? %sp@a$@ $IyzDzwt>AA KA!@@t@Bp 4@p:d)zz" z  z z   2  2dphX %' n%# F%! ;Qa1t&! 5Rb1T&# 2Td14&' 0Xh1 qtMhPH\;Qa1h&! 5Rb1H&# 2Td1(&' 0Xh1~LǎHǞDǮ@Ǿ<PPWh<@DHLP~Tqz zt  *z    zF "  Y       Ч P^`^\@\Pp$p  Yz @wÚn`zz@Zn`zzzpqzp @ TQ  " $ hW3Qa1asTxx    XdQz A^dznXW3Qa1XxhXCl$8 MXDC|,    Ydh^X3Qa1t^\T^\^`@P^` zz?@  ~TǎPǞLǮHǾD@<hhW`@DHLPT~XҧçDZP\ zh ^&-z! 8 z  D^U zU^S^{zzwqP]W^~[zU^[zU]^Q @ppppQ^|ZpV^xZpR^trt+q@^nxV n|y' 8^tT^t^x@Q^x^|Q^|^? @. >-B^ Y. V^ Y~]W^[zU^[zU]^^e @pQpR^^pQ^pVpQ^lZpV^hZpR^dd+qǎp@^nhVnlnv @ 6. )66!P^,2 1xx 12^Q$^^ȎJ~P^4xx  -0^T^^Q^^pq`\Ȏ 01\! #! $ \&7  2./x/x- 27t(ۋ"r`Ȏ  !`   `,0&' !xx !'t1 (6$!P^,2 1xx 12^Q$^^Ȏ:P^&xx  +^Q^^pq^dT^d^h@Q^h^lQ^l^pQ^p^Q^^? @>- zz ^dz-z^ z^$ $~XǎTǞPǮLǾHD@WP?8<@DAH#~L0dpzwz  @ !@  rdSq pq  spx sp a ? @qppz@ dS? q p spx sp ? sppap p$   ( ߋJ& s  2q@ p~LǎHǞDǮ@Ǿ<8PPWH48<@~Dǰd pz"zwr8 q   +sp sp4 q   +sp sp"ǂ( +Pq sp  ? sp a H&!s!0 # 2 @r  pp~Dǎ@Ǟ<Ǯ8Ǿ4HHWH?048<@~DpǑdB9)z3z"#@4C^Qq1p 7s>p20sp? sp? @p a XQq!0 #s.p" 2" ? sp$?@!pap < !q ' @B !@4@ɓ%Tz qQq!0 #s.p" 2" ? sp a )éÉzzH?΀@HpBBƋǢZ΀ q΀? pqް ְspǸ`q? spLjsް pLjxxΐ ǐpqޠ x   $΀ (W4(;~Dǎ@Ǟ<Ǯ8Ǿ40HHW`<@DHLP~TЧX.\Ǡ  úzz úzX ?@ ?\J ?p? @*p(ًz ?@? @p(ł)t! !? @*p(ˋBt !? @*p(z @z!z `-!-? @?!zzJ ?@?> :? @!p"#X*zv ?@? ^XP \ zz p ?@?p zpX >01? @!p""*zҧz\4 ?@Qpp ?@pZ ?@? @ ?pp ?%pt (^Xz5z @z z `:&(( ~TǎPǞLǮHǾD@<``WXDHL@P~Tp!q,(0p qqz!zXtx|Z z Wz @ z x B( !$! ~TǎPǞLǮHǾDXXWxDHLPTX~\p   \ " rǧz   t]Q%q,^t(0 .tq)"q,!(0 tjq.tzq,z2z&#*()*.tq,R.t(q,,%0@#!?#.`+p&R+^pp&QR^l[pV^h[pR^d^tnhV ~ppp @H` VԊǞl@y @l [Z.d!"p!P:z312D 421@ 4H M 4@ 4@P 4q$1^dT^d^h @R^h^l R^l^pR^pn`k!0 #0 #!z Zz @ z  ~\ǎXǞTǮPǾLHDxxW80! (P5(20A5(40 4(20 00( z88W 0 z31 0 00t"(W@ z z 2 z3^3 @@WP<@DH~L(8ΐp ,<qs($n' t!2! &'~p v h T '0*&'<qs(u' nj$  *!   0&d z   WH<@~D) z"Г: Ɠ|lj`zLn!z z )jۘۊq~Dǎ@Ǟ<HHW觾 zzz ~ ntz z "YFd <p׀"RրX6Xd <p"Y B090z3zJC "zz:!8z31  tz!YZz``(z"zzp(!rgW7Qa1x(㧐zzP tz "z! "Yzzzzp(!r`P7Qa1(zJ``,` ~ǎǞǮ ǾWPtpH 0 # ! !YWP@DH~L֠h >l$ p WZ))QĎ  ) ÉyDrx)0s1h#`t    BZ))P = ҆Y= = =        tY n (YR pl8 j" (Y pzl  (Y pl ҆ t|XÉy"!Y Lxߋ< n& (Y pl " )(Y t("Y)pq"0d  * $ V t|X= Y .=tz"Y( ! dyb=  d" x!)(Y~LǎHǞDǮ@PPW@48~<d <pא" P z Ézp (p#923z3(p#IB$z"p#!r t R(p#zM `  `.` X dX <p"~<ǎ8Ǟ4@@WXL~Pրh0t .(^T H^,pT tYh2Ynp&(Y$ t Hsl~PǎLXXW@thth!2X* X0tXXtX2X@@WX?@DHLP~T֠h   t(Y t|X= .Y p=Nz   b+!YFv*(^ $Y t|X= fY p=ng+Wpzz% t(z  H&zT4Y"Y*=;Ƌ@' 4Wz(z(|z  8'z"*=;@' .*=;z   YP>( !( Y*=;Vz   Y>>( !(Yb0v)(p= vpd  ( l~TǎPǞLǮHǾD@XXW0 h"(Y  hpHW00WP@DH~LppTz D'pz 'zv~LǎHǞDǮ@PPW   ѧ §~`πz -!lz , ^y6pPQpe^_7Qa1Pq'zzzez:``" ~ǎǞǮ Ǿ WH<@~D6p  z6<qs(~Dǎ@Ǟ<HHW8  0`( (( B88WH<@~Dրd(hpHp . 'zz"{X<qs(ыp  rP t  P, p,   $`( ((%~Dǎ@Ǟ<HHWH<@~Dրd  (p`( (p,> rYtup !,)pD2.pxWl pw v~Dǎ@Ǟ<HHW!! s W@8~<Z^ Y|0*p.Y nip V=Z*  q,Y_YV~<ǎ8@@WH48<@~Dրds ? pqh,B ,q44*(    (^(.",4 H (Ȇ & | .    ؓ~Dǎ@Ǟ<Ǯ8Ǿ4HHW@48~<p s ? p!h~1,7p11h3101,1420h14h11001 01﵋!41  ~<ǎ8Ǟ4@@W@8~<p hZ4h4ph ~<ǎ8@@W@8~<p fB,s ? ph4!''4!, ph4ph, N  ~<ǎ8@@WWP<@DH ~Luqq (q `?@?@ < p P 2@P:p21BސIC@$4 +`0#"q,@0 2!@ $x/x! 2#2 # < 4 # !() <0#"q,BHK.0 2!΀ (x/x! 2#6 # !($ ն.0 2!@ $x/x! 2#6 #  ! < p ?0@<0@4Bs1Aސ 9x1 C4A 4A 420$* p @0#``qPnhthxspq 0h,~LǎHǞDǮ@Ǿ<PPW ~ P QdS$h   !8 h!< !L(!t h!pޤ@8LtPPp  < hրpq1 1q!? !p"q@ @spAAqΐ? sps@ @pxx  (pq!0 x !(0! ! ր`lX3Qa1`p 7 3$ 1q!? !p"q@ spAPEqp? sps@ Epxx  pqq ? p q,0 #s.p"&"%q 0? sps  p$gP3Qa1t~ǎǞW@~<ts q  pspq   $r0<#0t<s00s0p q sq  Xsq  d`~<@@WHP^(P8 h0z^,x p,\b p,lLHHW 3p p Hp s̀!@tWh<@DHLPѧ~TP^X `f &zp "B0z0 9@ 4 Ӑ"zq s Üz |s |s P`Y: Xn`^XQ^X |  |      xb0( P^X ^`\X `"X^``-N P^X  | 6<  Ls L^`Y^`Zup$Q^dPj  P   (s ( dV^dp$Q zB  y"Xp$dHQ^d^`Z   ^ ^`   d^```d ^`ndV^`Y p$Q^dPl  N  (s ( dV^d p$Q zB    ^d Y zZ$^\   `n\cq rpQ^dPx M   !(s# !(.dj 6n\^dp Q    "Xn\pd~TǎPǞLǮHǾD@<hhWH8<@~Dp z(    q( ' " p  *  X!!(0 #0 #2 2'/x/x) 2 p#BI 2$@ $ 28 ~Dǎ@Ǟ<Ǯ8HHWH@~Dx p  's ~Dǎ@HHWx  ! sW8 1x  @s!$"@($ 88WX?@DHz§LP~TqVzz*H @Wz$ sz  YY pYz  q   !uWY f sq   ,'p ~TǎPǞLǮHǾD@XXWHz08!<@ސ~DyI@ 0GzDzJG B GzDA@@@@Yb YLpz  '! ,~Dǎ@Ǟ<Ǯ8HHW@~<pq!&~<@@Wh@DHLPЧTހ$~Xz hz @z&z? @\dpV^`\pR^\Xn`zzuvpØn`zz@.\!"p0Qx-x!*q^\T^\^`@Q^`ndl[$s $$(~XǎTǞPǮLǾHD@hhWH@0~DqPNxx X  |!0vd!1d xx X(   ~Dǎ@HHW0!~@B8pp !j(@D8pp !(~ǎW8d蘓88WPDH~L$,$,@p. <ph 1yVd@h0 t@,GA@B(I@ 7)G4t@s0 4h 7414 pжp nW3Qa1~LǎHǞDPPWP@DH~L֠$0pp$0Yǐ  p߀h$7G4$H(lpاh@Y Y WYN !'Y!zz ﵋'l!'p!LJd(82s( ﵆ (ߦ  Ć@'*:~LǎHǞDǮ@PPW8d88WWYWW    &<B  . "W.*pWWPD~Hph>:pW` L*`L`L` LLLL 0  L,2`Y' 7X^0@LL$ Y Y*Y L$똆 Y~HǎDPPWXDHLP~Tְ ֠p zz0z @ >nz * !(1  wCp   z  * !(1hz  80 ((@$( ~TǎPǞLǮHǾDXXWP?8<@zʧDHZ~Lp |z$fǗ' >zz*   y `~LǎHǞDǮ@Ǿ<8PPW@48~< z  p Xz,BLJ  x ~<ǎ8Ǟ4@@W@48~%! ?Qa1T7Rb1<3Td1$1Xh1 qhW'' n%# F%! ?Qa1`&! 7Rb1@&# 3Td1 &' 1Xh1( ]H.LWހ x   >~<ǎ8Ǟ4PPWH@~Dp PԘd'~ d~Dǎ@HHWXHLP~Ts0`p !p   44 !pWt d =Xx(jњp J8\*dn P3Qa1. Xd z" * @)vО {s   pR @d0 z3P^( @d0 z3P8^(܋ @d0 z3Pp^(~ @d0 z3P^(d,jz d0@d z(P^,*t dd0 z3P8^(&d z"t0yn>d1!q!@<$#"!﵎F< @d0 z3P^(Jp @d0 z3P^(p @d0 z3P$^(pt @d0 z3P\^(p< @d0 z3P^(jp @d0 z3P̧^(2p @d0 z3P^(p{8Ptun @d0 z3P<^(w8@!ڶ﵆ "dt﵆ d(ɬ ~TǎPǞLǮHXXW@~<p x~<@@WX<~@phN  r0(h -׸ Y q)p Yy@"$! z"0 #7΀ 8#| ǁ$z pDHJ&lP&\D ֆ Y.@sWY Y~@ǎ<XXWPD~Hրh p p (8LذYY L*lp(p(~HǎDPPWXL~Pph |'T԰YY T.T\YT '7(Y,Г~PǎLXXW@~L#ҮL$ҞL ~HǎDǞ@Ǯ<PPWH<~@րhJ q(DpYY D2YYWz  zYdؓY Y:Tz VWYVԨD~@ǎ<HHW`DH~Lph  ~Y`'7XYY 6'7\hYY lP X r \lTX.\YY P( hTp !Pp !.\z1 \.Xz1 X~LǎHǞD``W`hHL@PT@DX\  H8``W`hHL@PT@DX\  H``W(~t.\>(;LY.llt p ~XǎTǞPǮLǾHxxWp~Hphl$YY ^TlXL\`LPdh' 7 !(T~~HppWhhPTHX\HL`d  (P0hhW ~Dph ΰYY (Y.p#HʈYY \H؆$. wrY*'7 S4^(~DW?HLPTXç~\  ` d lhpxlYDl,' vrY|p'xp p|^xt.`;^(Y|.plf| t|:^te.|z! z|^t(>|#Ȣ|$Ȕj| x|<^xe.|z! z|^x(>|#6|$&x xt ߤt~\ǎXǞTǮPǾLHW@~L#ńYYL$`Yp ~HǎDǞ@PPWXHL~Pph T$ְYYLjY( A 9WYY`.TYz! zT)'>T#XYYT$4Y ~PǎLǞHXXWXHL~PphގǀzYYT$rYY( A 9WYY b.TYz! zT)'>T#YYT$Y ~PǎLǞHXXWXHLPp~Tlp R70()(' (.z~TǎPǞLǮHXXW8ȓԎ   zY88W`?HLPTX~\Ǹ z ppW  "x h(ظF4)" ~  + z(9J[)9#9z3#(; ΋z kV p  7׮*((zz"z!BzB(*&($zz"z!>z>$<&$*b$  vz di pl+8~($z('*zz"z!BzB(*$'&zz"z!>z>$$&Pi.F v4:$ h憠  V ~\ǎXǞTǮPǾLH``W@~< p& 0}Hq~<@@W@~<p  T  !J |~<@@W@8~<!z p !1#z !,;p0g(cXYY>vpYY$xb~<ǎ8@@WH<@~Dqz p'!z !*9pYY  pn($ p\2zz3 pD z(z>  p LpexaT$~Dǎ@Ǟ<HHWH<@~D"8z"z3# vyp(z"!V! "H  D ;} d~Dǎ@Ǟ<HHW@8~ qs(~<@@WH48<@~Dp\wpXWz.z$'Wwp|wp_r~Dǎ@Ǟ<Ǯ8Ǿ4HHW P  " p W8 z"!!88WH0~Dszz@ @X @,30(Wzz ~DHHWH~DpA2 @f @ f}  | f~ 8 sދ @s ΐ @s z  z z  z $zZZzrz@ ^Zs  i:s  rN .(! r$W~DHHW8 ~88W8 ȧ~4p~~488W8 ȧ~4mzp쌓jz&~488W@~6h ^dQ^dd Y( Y YYdB\# ptYdǾ`p-p"ϑ8nd nd* rq !*(d @*($    'q jq !*(*\ `!,\`!,~XǎTǞPǮLǾHD@hhWH<@~Dp @(W   I YFжx| Y Yzpǀ$ p u\ 4(!0(>    z$ Xz L aR q1E Pz z  q!0q1z@ XzN {8AzD@&AGAB@YF@@s(A@z@ Y#.Yp~Dǎ@Ǟ<HHW`DHLPTX~\%d}TT z2z!(0`TJ|YǍp.qhpL,!!  !z'02n# "0# *0#J4 L0 # L0 L0 # L L0 # Lq (! kz  x$X   ְ֠{ q S4 ('2VBpSv01z  0)(oWƋ`,)(n^W4  1q<  q!# 4(0]W<Q rpQ^q!(0]bQ~Qvd  H   Z   \dZd z  Y~\ǎXǞTǮPǾLHD``WXDHLP~T֐pP ְ( 2SQLJ0 '(lHU֐(z"z)+"q,21(#[UX 䶰tx|OFOxOhZ q)"q,! 4(0ZTxO~TǎPǞLǮHǾDXXWH8<@~Dրd p8,q h zz0PP$zz z ē{` xMSt' ǘp(q    p $ 'zz"8 P ċ"' zz" ' zz"  <qs(}~Dǎ@Ǟ<Ǯ8HHW@~<0dC   zD~1z3zt7l1!516LQ5p 708'  zl(p p>0<0s(10 dL Y~<@@W@ d P d zlzp  $ (,W@8~<pހ jq@9.8~<ǎ8@@WP@DH ~LP 1Qu0P 1PP 1sp <, ` 1z0^<pVss0< (2 $$ YP^4s < sԈ Y|pd  8P 1X   02# B"z"!$4 @! z!zl@, <ph 1d> 0 zl~LǎHǞDǮ@PPW`?HLPTX~\qx >LJ{z GJOZG((G L| !2 Y(8 z3 (JZ H G ((F LD| !4F F|  ~\ǎXǞTǮPǾLH``W?h@DHLP~TpX!q  ' l   < hpq!? !p"q0 0csp1Q1q@? sps0 p  < hp1 1q!? !p"q@ spAEqp? sps@ Epxx  +pq!0 x !! ! p*x/x! !xx0 BiX3Qa1qqp X!q  ' q ? p q   sp   q 0? sps   pxx p xx p h +R q ? pq 0 0sp0`6q @? sps0 6pxx p   $ d~TǎPǞLǮHǾD@W@48~<phW3Qa1ݓl~<ǎ8Ǟ4@@WPDH~LdcpBNh R1(! 7'z3z"#8q<qBbXz 75()0MB B ~LǎHǞDPPWH<@~Dp"4 q~Dǎ@Ǟ<HHWPDH~Ldb: p@'z"p,(A0f'z"q! A:(0L@@~LǎHǞDPPW Z x0Z1F1>0\ q 11 q     YW@~q@B$ ހ ( .8 !2Y ~Àސ `ǀ T  Y' !  Y.<  ǎ88 Y` YL.<   @ Z\~ǎǞW0 ГhhpWPztzPz* F\DPz" Y00W8d^| *z! Pz P88W8d^$ *z! Pz P88W8d] X!z"1 #!d] *z! Pz P88W8d]D *z! Pz P88Wd" Pz PW0 Pz 8 d0 Pz! PV000W@8~<dp\N z \  z  [ z$$րdzjp T (zz"<w"   :<qs(d(t ~<ǎ8@@W@8~<րhd  d p z"4$ zzz &<ps(YuЎ z  wtQܶlpP YжГu~<ǎ8@@W@8~<d z ppyFBpW܋$~܋p؅p  sp܋dXDz8P zz   X ~~pX΅p(tb&*~  }pspp @0p q$ܧPP@d(܆,  Xd nlГstDГsbd(p Гs0~<ǎ8@@W@~<pdVn0'#q,2@@4@p2 @$p!rxx    X!$  px @ ~<@@WXHLP~Tph  |   hV   4|FdU&dU¨& tz(p     ' (47 j  V!q,(0? 9D 3 & 'p(C 3   ' (46 3P  ^!q,(0>(8d 3YF  2Yl d ~TǎPǞLǮHXXWPt , 0 # ! !YWp<~@րhp p¸WZ''LJ  ' t!00,  1. z2lz 1ZNZ'' (D ,xYDFL   ("   ,w Y~\n0z! 0TH$6/z! 0Y~@ǎ<ppW@8~<hdq" z  |Y/*4",t ,(t ,( $d ~<ǎ8@@WWWWXL~Pրh0t ,.(^T ^,p  TtP(t(Y.  Y'0 #'(' '$' '( ' d" '!z"0 #!-ȋ&(Y( t  ,l~PǎLXXW0 h#(Y  hpW00W0 hL00W8h p88W8$<$<ᐅ Pdzlp,︶0z4D<8HP  Yp88W8$4$4H88W8$8$888WP<@DH~L֠h pd  YNtxX z <LJø  @*tz  F|! $@  X x xlDlD$`$`$dl$d~LǎHǞDǮ@Ǿ<PPW`< ~@րxtqDHDLPX\T" .LY\ll~@ǎ<``W8h!H88W8h88WH8<@~DY tJp>Y   p  0  Y *p `  Y:  L  .  @YY    :֠lؓc0Y Yp  !ċX$Y>p !zz((X~Dǎ@Ǟ<Ǯ8HHW8 ȧ~4ph 'p"02 ~488W@~P'zz"YjY zz @ p~Dǎ@HHW@~! z"""'ʰY!~<@@W@8~<րhpȞ~<ǎ8@@W@48~<րhxW p? >  @ Zph&xp @ YHpl:ppp z ~<ǎ8Ǟ4@@W@8~<րh֪pV 8  Y ~<ǎ8@@W@8~<րh d!"  YLq  & l Y~<ǎ8@@WX@~Dրh&p p@W @Y ppzhlR @l,   H dLYBHN Y$H d YH cYH  YTH cYH!< YY~Dǎ@XXW0@DH~Lրh zq ppYT   c(Y, >.P)bYY   P> @ PX   P .P2YY, @ P)bY`   Y:&zzz (8Jqppv@#4W~LǎHǞDǮ@W0 h!Ч! t ! 00W0 h!Ч! t!00W8 ^!0 #0`#/ Y(!&z"z"q(0 #2 y`# & Y Y 88WP?8<@DH~L֠h6 B0Y *&zz 4"  ދ܊(zYz* d Y F  @Y2z "0p"8$z, !z@ ! 07qs(s0`h z    !#z  q0 01uWY TjЧ ǐ$|xt X Y     ԣ   ~  Yz `Wz z   P`zċ 0z(  rh*z V  q0 00uW e  YY~LǎHǞDǮ@Ǿ<8PPWP<@DH~LY &zzp"0 z* !z0 !,qs( @Y|zçzz r&z YB$Yz z YLJz( V ǁ$Zz jY|xtX Y z  q    uW z jzz+ z jp c  ~LǎHǞDǮ@Ǿ<PPWX@~Dh~H Z\Y (!  (!  2Ћ( Z Yl  `YD$ c*$ ' a~^~Dǎ@XXWlWP<~@րh[D z"2p q[2qDD '2(   2HXJ`LD,X Y~@ǎ<PPW8 ȧ~4ph2.t`J~488W8 ȧ~4hp`(YVp(^dpZ0$dpZpdpp^~488W8 ȧ0~4րhxp p^^qZNLj ҀZ ^ Zގdpp^Z~4ǎ088W^lZpWZlW\lW8 ȧ~4hp`(Y$`p\p`~488W8 ȧ0~4րhxp p``q\PLj Ҁ\ ` \r`p p`\~4ǎ088W`l\pWPd zlzpWdh$ zz"   zlW0 Г00W8 ȧ~4hpp (pVpdp(p'ppdplp~488W@8~< F xzzpp  @t(zz"Yz  jz zYt| |PPt xXXY zz @ ~<ǎ8@@W8R88W8ȓ888W@8~<&pt  @YJ@. 2fx ~~<ǎ8@@W@8~<րhp Z. \'    ! z @ z    h<~<ǎ8@@W8 ȧ~4ph F'!' ! Z !0 #!!z"0@ #!~488W@8~<hǀ (Yp,l p!,( "  !pÐW8L LL LL LL L^L LL@ L(L LL LL LL LL LL L` L LL L8L LL@ Ld` ( (PdÀ zp .zd><qs(~<ǎ8@@WP?8<@DH~L֐h  Y6   Yljp p ֠d zYQ z  * zz"x (z!d`Z`<'4P^R('bRYB  < <qs(G Y~LǎHǞDǮ@Ǿ<8PPW@h KN YN︶lN&@@Wh Whd 88 lW8'?hJz  JlWP@~Dրh&H(J YHLp lZ'*&Y{Y$z F H.Lx~Dǎ@PPW@~ ̋<L{LLld" lld.0B(40 0A(40 00ll>hlY~<@@W8ȓ{ F(88Wz  z"z1#$ < s0<#" ( W 20$0@0WX<@DHLP~TsЋLJ( |  Bb ,GЋ,F h* ,=J,=6  ~TǎPǞLǮHǾD@<XXW8Г~88W8 ȧ0~4Ljx *xW,q (Ljۓh~4ǎ088W!104Pz50z520,1 (00W 1 X0!z"#  , (! WH8<@~Dր2x   W,p (Lj~Dǎ@Ǟ<Ǯ8HHWH@~Dր,x$W,q (Lj . a ~Dǎ@HHWH@~Dր,x W,q (Lj . `~Dǎ@HHW@t ~؎Tt q,tГsN "t4 @@WX?@DHLPt~T   p p  0j*E"t*L E|” hD4ppfzfdzzd ETp @ lzl`z`q~TǎPǞLǮHǾD@XXWW8x (X8X88WP@DH~LCxq\ zḤ bzbjzjx  p Cp P7W~LǎHǞDǮ@PPW@8~<q`Wp 'p5~<ǎ8@@WPDH~LpBJ zp zjzjW (R s $fzfLJx|bzpxb AĀ'8VP~LǎHǞDPPWXHLP~T(8hzhp0Ę)U@xq\ zİ( bzbjzjx ĸp @p0)~(U0~TǎPǞLǮHXXWP@DH~Lp'TގpTʋ?? z  zjzjW (R s $fzfLJx|bzpxb ?~'8Sx ?ZؓS~LǎHǞDǮ@PPWpHLPTX\~`.((9ST,S@&4 z̋2<z LjzϾddрjpQ^hn ;D(R=lxqV zL bzb z x pl=h(T'1R{p z zX |(0! s!!!*(!'7#7z3#0.; zLj.dhQBd&.dpQ&d~`ǎ\ǞXǮTǾPLHppWH@~Dpŀ'8P‹wW |( (5z"z |( Ő'8Pj`(7'2'z"#8z3#.(zz"Š(Pa~Dǎ@HHWH@~DqŰ(7OpL,:LspbzD z  r!!rZ  (H 0W"z! b z~TǎPǞLǮHXXWPDH~Lp6( A 8Wp 7~LǎHǞDPPWXHLP~Tp'8K66L( A 0W 6 Dzww  " 6T~TǎPǞLǮHXXW@~<p'J~6P @z (<< ~<@@WPDH~Lp'Iʓ4z6&Wznz Pz >Wzz  "T%z$( A 0Wz@z!  42~LǎHǞDPPWH~Dp('Hb( A 0W~DHHWPDH~Lp8'8H3zLfz! ( A 8Wp 3F~LǎHǞDPPWPDH~Lp`'8Gj2z p( A 8Wp 2~LǎHǞDPPWPDH~Lpx'8Fޓ1( A 8Wp 2B~LǎHǞDPPWPDH~LpȐ'8Ff1|z p2z p( A 8Wp 1~LǎHǞDPPW`PTX\`d~hpP^ȧ.(>,>0Ȩ'Ez   z*>z!\ &z0  z!.Q^P^ Pz" PP!gPzz! P^^/z  (dP ^04bVQV0@zD zP^/^PP^/Ƌz  ^P .>ȧ>(7 C>Wz /Bp/*X^P ΐ<×>zz,z   zvnz  P^.Pz! PWPzz" PP!,<..v.jnlW<%' \%# <%! 0Qa1\;Rb1D5Td1,&' 2Xh1 ,՘-(x\ zȓh bzblzlx t -"P^D !), ְ 6s fzf ,  ΰ p   (;@(!:RT^؆P 4l(zz"lpz plÞnzzlPz! PWPzz" PPH ~hǎdǞ`Ǯ\ǾXTPWLPTX\`~dp>tǧ S.(^,0'9?x  ! t d(J(0WFǝXzz( =ߠ Æ   8z" 88bW8zz! 8)|$zVV|)z |)؋z( z|)z  |)8z! 8W8zz" 88$|)<LJ0z`t&$(zz"$(z (Pt.(z" ЦLj !&tLjZaJXzz%( (Ǟ ^  !tLj4$(zz"$(z (ϸt0P^x÷XtazQ^P^pVRVP^l<ǝz  Xz z|'H(! =Fz( (9;~&|z X|^x^pP Lj$(zz"$(z (&Fh z,ΐ zjzjX (R s $ fzfǨx|bzxbh%0<^pP ,z)z$z)z$^lP6gXz,z)zXXzz @ $ xt j z(^xP <$(zz"$(z (X|^x0$j zH̶ zjzjX (R s $ fzfǨx|bzxb $^xP z$( A 0W8z! 8W8zz" 88P2Q(a zg|#p ~dǎ`Ǟ\ǮXǾTPLWPDH~Lǘ qX(77~q H(I 0W~LǎHǞDPPWh@DH~Lx$ǘ p(6 z" Wzz! !z! Wzz" nPW'' ^%# >%! 0Qa1H;Rb105Td12Xh1^ !z*z  .\jFiFP ~LǎHǞDǮ@hhWXHLP~Tp.('>,:5Z @8> zpɀWtzz fzPz (z ~TǎPǞLǮHXXWXHLP~Ts.()>,:4"dpW@ @ z  6 pz ~TǎPǞLǮHXXW@~<p0'3RZz BWZzz ܋&ZzH &~<@@W@~<ph'2z* z$ T~<@@WH@~Dpǀʀ'2j@@ʔ!$T^z, z" T8$<~Dǎ@HHW@~<pʨ'1z$ z 8 T<$ ~<@@W@~<p'1Bz. z 0 TN<$~<@@WPDH(~L0 zz"z " )qz" z!   TTZZ ( A 0W ؼ'//~LǎHǞDPPWPDH~Lp.('8/x"z z ~LǎHǞDPPWH@~Dq(7.!p  Np01z01 z ~Dǎ@HHW@~<p('.Fz  <~<@@W@~<p@'-z $l~<@@W@~<pX'-z$  D~<@@W@~<ph'-V0!z0 ,z Wzz$  8~<@@WPDH~Lpx.('9,<|>$f ː,~$<˘,\~LǎHǞDPPWH@~Dqˠ(7,xp~Dǎ@HHW@~<p˸'+~<@@WPDH)8~L+ry pwz|pQ |((|~|v(g5z"z |(Z(75z&#8z3# (zz"(zz"VD(zz"z p xLj~LǎHǞDPPW`?HLPTX΀~\.(*>,<)憐 z{Hz|w zz 6p  |h\,' n%# F%! ?Qa1l&! 7Rb1L&# 3Td1,&' 1Xh1 z  !)z" t!!| ~\ǎXǞTǮPǾLH``W@~<p'(z vWzzFzz  (:~<@@WXDHLP~Ty 8):'j:p̀W (      WX!2!BL!~Pr!!~(,.0#4). >T~PǎLXXWX L>T~PR!1Aqρ#~(4,)*~PǎLXXW@A~<s ~<@@WP@D~H$$p`L͘.LLPa 82  L@  4` LR !ΐ '8#>ߊ#(8(# $"ދv  yx4"V  yy  yx   yxD""  0yy#! yy1 yt0`"<(( "@ rA ߀yp0(C  B( !1 D ߀yp0(C  B( #1 qA`p`zp ```yp~HǎDǞ@PPW@~8p!p(@`pt<`<t<~8@@W8 ȧ~4p@Wt~488W 0~sB'&sA&/  2@@~W`HLPT觞X\ ~`ж Pyp^@   ^@ ^@^<zp 8q!'' tq!'' q .!'q 00 YY\\dZ:PVqq ! dYPͼ  lT0 ;  Ld.d0P#& Q  ^^L^Ǯ|~Ǟ^HHހ,*<@'9(4  +j 44884   .80 #  H  x@  >P z.H$ -0 ;z(ΐ  +( δȋ "  +  p " ! "z   ( 8   + 4  $ < P <^\H0%^\W, -0 ;~(D^, " ! "z   $   $ ^\ %P 0 ^L|XTPH^DHpzj^XQXzq tzxPxx^XzQz^XPz8  !0q2z'02zz !^Tz'zzzT  tzxPxϔ^TzQzz^T^TPz4  !0q2z'02鎀z (   ( -  @x ϰV>z 2^\zQ^\ %P 0 v^DPH 0   0 F $   $ & (   (  8   8   " ! "z^H $%P <   + : ԓH͸^PP T,^<%  !^@\^@ 8 (! -~`ǎ\ǞXǮTǾPLH``W ৾<@DH~Lpo~ , 0YώPt|жx XxY'H2!Cz1@C7z8'&zAΐB!zAz0ϧ0.*B!z@(I1'z!ӆ Rx  Rf~LǎHǞDǮ@Ǿ<  W`Hΐ L΀ ~PHp r( )0 8 (     z ( pzzȧ .  @@ !  !" ! D  D p D0 D !  *Hz(T TTXjXQs&H5z(D@T$ $ \T\R" " \T\*~PǎLǞH``W8 D!  D D88WXH~Lt.x^tqсP  ( PPT.T bQ0 !$H% #6ЀP   .T0 #     4H2t '0 8( 4z,ШjP z  .H$ '0 8z(ؓ& 4z  $ D(  D D& "z !*t ! 2 |< p D   DH D  D0 D @  D D  D Dx& '0 8$ @~LǎHXXW@~8q ?  X<><~8@x@W@z 0? #0 #.X .<>X<6@@W@~8q ?  X<X ?><~8@x@W@ !?  X<X .? .>X<D@@WH~<q ?  `@B^`D  %0 #1 1 #.`@.BFD@~<HxHW@XX ?  X<\>X<B>X# !" 1   1^>X>X<@@W@~<q X~<@@W8ȩPP PTt88W@ 88 8! ! <8<x@@WH<@~Dx2|0#sq q !@ xx !# 2 p| q  t( YȎ|Q q!? !p"0 q0 0sp1`6@ q@? sps0 6pY.| t( Y B||ttxxYxW~Dǎ@Ǟ<HHWH<@~DxJ|0#sq q !@ xx !# 6 p| q t0( Y0|Q q!? !p"0 q0 0sp1`6@ q@? sps0 6p!" YHY2 t|0 ( Y||ttxxYxG~Dǎ@Ǟ<HHWP@@~DrB H(HYhC4HLYH( ċ0C H.L따Y Y~Dǎ@PPWP<@D s DH~LZ sp(p֨  ,f 4!$ $  B@ !* zP шL. ! QZ ќt  !p &  Ѭ 0 (,! t (!Y B@ (Pب 0 Ws Y~LǎHǞDǮ@Ǿ<PPWH<@sDsp(~Dp֨ ? Y ((H"YY vH (!İY$(,!Y( (!xY ? ~Dǎ@Ǟ<HHW@ 0 #&@@WP@DHz~LHz):z('zsp <qҨ  @ ,(    zs D߁Ԉ x q x ړ 8 @  ` ,,~LǎHǞDǮ@PPW`DHLPTX~\pÐz qp q D߰Ԉ (߀֨H(7($ |   (0!Q DЀ0  (! V @   Ѐh (!\ 8!D 0 q!`!(  0Ѐ @  0 qp.X @   0 !p 0 q (QبX Q ((,( 2((aR@H&5HR$ ,Ћ((," 0︧4( !!!' q)0121   { q {  :~\ǎXǞTǮPǾLHD``WhHLPTX\~`  z zz+s&p (q֨H'8(ȓzsÓ* .H$ (  B <Ҩ !!! (x!z (!: !(  (  ( (8 ($!ppW (Hڋ (!:v (! z ( j (F (Ѐ!  8t (ظ $ 8H!   ." $      ?(' J    fWxx  p((R@!($(% ((( ^,z ҋ8@  "8($7G #4R 8︧,pױ H"7' .(+  J `" ' 7 #| `# ' 7$" #X8Z8 `! 4 `d|d  ` P$   . `'ݖP$    <Ҩ(  ~`ǎ\ǞXǮTǾPLHhhWhLPTX~\p. ! `x DߡԈׁԔ lp!`0 !.  $2`@ 1$(X (q֨H,'>GN(GlN,Q j ! .`0 # ! .`ۨ ۄ8   `   @ 0  `$(! v (! np@W 8   `# dڸ$.d (   ddd d @ ( d6  (d  $ W @ / d0  &8'H$7 Ǹ0;$NVt  $  ?  _ 88   .  4R!012%1,!0121(`4 8@t  (W @ / 0` @     (` ($$  0 (l  x.0@ #    & <Ҩ z (DQ  _    8 (,|  Qj$  ?    . ȋ (H (x  r` `! )p"">` #ְ `# ' 7$" #֌ `x4 8 (0  $   D `" ' 7 #`  $/ (``zӤ$D   <Ҩ(    ~\ǎXǞTǮPǾLhhW@x ((Y`17!s&#p##0(#0|"֨s9212 . . $. >$x@@W@x ((Y`17!s&#p##0(#0|"֨s9212 h. . $. >$x4@@W@ !*0!! ֧.2 . F@@WXDHLP~THq'>(:& sD sp(߀֨  > mY6m,Bm mԋ4mmpӸW p(Hp($  p(  p(bp(V  ^* (8  2p(,  *ꪆY~TǎPǞLǮHǾDXXW@Yb x Hp̴ !D x Hp̄ 2!C@@W@x (Y@xP(YYY2 !RxQq H C$ (Y HpY@@W^  D$l: Hl* YW0 Hp22H  H@pBD(C@  B@p22W@ ~<tYXp2^<  <;>: 84 L@  @@" @.@  FpxW~<@@W8  X~4qp|W@~488WP@D XH~Lp ߀ Xχ,,ؓդJǨȢx Ȓ  !?xY ը x F&4 FpWG ~LǎHǞDǮ@PPW8X4 Y!Fp%"W88W8 00X 0S@ 405@ 4080dv 88W@~<p$pԐW@! @& @ @@ !  (DQ %! FpW  vp@ @^@  @F@ 6@! @_X~ . '4dW~<@@W80!#0X#,ń88W@8~<tYnXpȊYD4@ @ @ ~<ǎ8@@W@X~P  x$$$ (@   R@Q   Y2z  : =ǧ x.  !:x' !'W (6'!'FpW & (xYS<p(!*@Q @  @X~LǎHǞDǮ@PPW8 X @P0  Y"0 #88Wp@DHLPT~Xp8 Q^P ^d Q^P^` P^P^\|ϗ,ǧ,Yld^`^l^\^h<@j  ^lPX@  " ^hP'4W'4W  x cD+hTjBG  ") ! 7!Fp!Wx~XǎTǞPǮLǾHD@ppWXDHLP X~Tp   tp!,6 t !А  ti@ @fn( (   SP$(& (;,~TǎPǞLǮHǾDXXWH@@~Dt΀Xx߇LtJ8  'R0@ # :0   (4dW82    @ (4dW~Dǎ@HHWH8<@~Dpχ$T Ύ (Zξ > Π  P~Dǎ@Ǟ<Ǯ8HHWY WW@~< xP((Y(pn 2pxPzw(uxP 2xt'P 2zz( 2z'z 2~<@@WX<@~D xP((Y\pؓl Nր6s fzf lhtJ.ht!70x>#Dxx.HHl~Dǎ@Ǟ<XXW@@~<q@ rpYR&~<@@W8ȶ 288WWX?@DsHLP(~T: sqprp D߀.Y ` ߠ(ێD( Ðz  Op Yz 0z     &nY$Q!  `  8JÇpq O H΋vp  Np 0 &|q O:z pT, `>0~TǎPǞLǮHǾD@XXWWP<@Dzzsz)s&Hp <~Lqhb @ \  (!17 ;p27("'$a&q,0? #6p"q<@ 4@s>p243@T4q@? sps0 5p,f @  | ,,~LǎHǞDǮ@Ǿ<PPWH8<@~DpWzszs #p"!0(zpT(@ D 0 ,̴ ր︧4äΐD߈(ΐ)ߒ(#CsB!$*'0C#3$!$p( ) q!) 44 x xx0h  0(00000C0# 0ѧr 7 xXPp  :︧,    D& b~Dǎ@Ǟ<Ǯ8HHW~p0G`  J #  a (ހ  ÓL!ހ NÁÓւpP(T~ǎǞWh@DH0LDPT~X ǰ  zs  #BpFdp 0߀( q xx0 px80Sx?x1 1p4xx@ q@ ACGr(<h "$(; #8(^d,p! \p\^` q3 0q ! 0{ ` rqx@ A@ !- !q(-!0a#- a P^` Ϙ Q^\(zp"T!(2sp!bP/ZaP/[paP/[ã8;bP/S%*0`#((! @^`pQ^`r ((2Xrq %p((pqq@:(0^\P^`Q^`L^\PP^\x@  Ay(9^`q^d,p! n` ^d,.dp(0 xc4 2 2` 2^~XǎTǞPǮLǾHD@hhWH<@~Dppp. Րbq~Dǎ@Ǟ<HHWh@DHLPT~X` 2 2` 2^`a D߱.{ ǧ VzspRQ р( ^d$(.$ + zsp! p\alǎ\ p\a>\(p(0  p\na\(p(0 p\8`\(p(0  s . 8$ad s  zpր@$ "pՠW  Zp- !+ zsp!d <htlp\0_\  p\D_\ "\}-!"q$=1ppp\">\-!p1 # q a  a  ,)p(0 X^ 2 2` 2^   0440  0 4R!d01<2%1<,!d0182 18  H︧, { p{ `0~XǎTǞPǮLǾHD@hhWH~DpssppTT2h~ $. >$PL~DHHWH~DpssppTT`0~ $. >$O~DHHW@ 0 #pX:@@WH<@  V~DYVYܓ8s!#sp q (    q =@ Y\'Y$& Yq  =n~Dǎ@Ǟ<HHW`<@DHLP~TPԧ^XX ύ D߱( (\tZRD* @ ד qDn\(^XDQ^X(3~TǎPǞLǮHǾD@<``W  2Y. Y 2  2W 2  2WH@~D>p1R 1q !#  xG(' px tR'JYRB xxttxRl 2<T. 2  2 *  2 x~Dǎ@HHW@8~$3 X'!X@ X'G!s1 1(#4   '   !'  X'!rPd % zz"*̎ DzD D@$ @l~ǎǞǮǾWP?8<@sDH ~Lp׀Z s pZ& X(!r@ @Fp|WD@ @` ! !   ! ! Hn(!Fxϸl48{D4 | *1X(( s  p !Z ~LǎHǞDǮ@Ǿ<8PPWx?DHLPT~Xq s p׀ZbpY TT p8WbbpXWt Lt DpxWY pzqvDpY DPzq"z  <Pz ? z  s&zq0vHXpx" 0  ؀؊ Y Y~Yl  YN/hУ  xF(q!(  8s! !~( s pZ sF OPd % zz"*̎ DzD D@$ @ HY0` YXY (XPx X(!"8'8!:':!<'PP'>('4W H X(!֋nYX` Y: ,p X(!r) Y` Y X<  <Y` Y^ X(!"<0 #!< X(!$Y  v vw"bY`   `     X(!);#|p X(!);#X x \(Y 8:>\ <\< @ <^R_S.`! '<0 #'<!" ':0 #': !0 # ':0 #':!$ *'80 #'8':2 #':'>4 #'>!( '>8 #'>!0 # '>0 #'>!0 # V'80 #'8':4 #':!0 # ':0 #':!0 # ':0 #':F':0 #':!0 # ':0 #':!0 # ':0 #':!0 # 2!'U&'T'80 #'8'<00 #'<D$'T 'U'80 & #'8':1 #':'<0 #'<'>3 #'>'80 #'8!0@ # 4!0 # '80 #'8'<0 #'<!0@ # ':0 #': : :'4W X(!); l  d Y6~lFdl YXz zq Av@T);Wd ~lBY X(!);(!4Wv X(!);`T X(!);< (Xz zq Av@);W~XǎTǞPǮLǾHDxxWH8<@ǎp~Dp&F"4O@ @ @~Dǎ@Ǟ<Ǯ8HHWP<@DHs ~LppZqYp Y`  Y X'!( X'!$` !   (`     6Fp W~LǎHǞDǮ@Ǿ<PPWP<@DHs  ~LppZqYp Y'`  Y X'! X'!$` !   b<  (`     Fp W~LǎHǞDǮ@Ǿ<PPW8 0ZAAB 4@ @ $!0X#!Fp%"W88W8 pؘWOpZ1 X!!14WOpZ!14WOpZ1#0X#1`2 #1 2!1 14WzOpZ!14WXOpZ1 X!!14W"OpZ !88W@ 0~<JOppZ 1 q #X!" ~<@@WH48<@~DOpqZ v!0 2q1 #0 X'!b$Y$7Qa1"(\'  !P$(0 3p H$(i$X$7Qa1FpWTi$X$7Qa1$((   L $(0 3p H$(i$X$7Qa1 ! !     P87' p! #' ' !' 7 ' # 7!(# '(' 0 2q1 #0 X'!FpW>i$X$7Qa1$(  $(0 3p H$(i$X$7Qa1       ~Dǎ@Ǟ<Ǯ8Ǿ4HHW@8~<OpZ 0X#px j'Fp%"W\g,X,7Qa1Fp!Wh,W,7Qa1,0~<ǎ8@@W[8[@W@8~<[8 ~[8Tp[@>! 0  [8l[@q th'~<ǎ8@@W@th q [8Г9@@W@~<q2&Pz zq !v0W~<@@W8ȓ$Pz zq v8W88W8ȓ$Pz zq v(0 # 2 X   FR7S!.(0 # "((   7T!( 'G!'G" \ ($ '@0 #'@((  '4WH@ @'T(G"U@   PG(@Q   @~~TǎPǞLǮHǾD@<``W`@DHLPT~X|@ >  è:@ &$|$||dP^\@ $$|$||&|P^\`|Fq @ $|$|ċ>Zސh() yAZq ~azq q ϘJp ? pHW    r    0 D@ 2   $|$|   uD xp @ n  p\upJ r:0$|$| qpB @ p ڋ:  @ H  qzp uy   p$|$| &pr J @ >  s ؋& ^\P ~XǎTǞPǮLǾHD@``WP@DH~Lp@ $@ :@yχ$>t$$ 3p0H@! @<~>   . >@  :v 3p0H :X%%ޠ" ǘx D l $'@0 # >Bޠ)t(( @Q @ 0<p'! @w ~LǎHǞDǮ@PPW@@ @> U Tx@P  0G %0 #!@vp>!@0 #!@ r.U . ~@@W@~<pA D  " D n Dj,Tpxt: ,t0t2'4W `'4Wx  $$ 3p0Hd$,$ 3p0H<,>   n aPQ  '!gW %' l%# D%! ;Qa1h&! 5Rb1H&# 2Td1(&' 0Xh1g P[`^;Qa1h&! 5Rb1H&# 2Td1(&' 0Xh1G~<@@WpDHL~Ppt 8zTTp٘WtTl*T ^ |YF^f%B (%(YNFpAD :WÇ>^8`:b<dg>P(rF.f$'FFpAD :W&'>FpAD(:W8^:`<b>dFPfg(r ^ { YVŽ'4W< RNpٸW'4W@'4W0'4W '4WY 2  Yd T(zYb8:>T <T<@ <VRWSX< <: :  : :*8 8: :> >> > > > V8 8: : : : : :F: : : : : : 2UT8 8<0 <HTUV8 & 8: :< <> >8 8@ 4 8 8< <@ : : : :<TTURVSW<  > > > >   < @ $8  W:6    :  .:   :   :  :   :  @ :  T(Xv Y< DFpA):WY~PǎLǞHǮDppW@ !F!8!: !< H!>P(lP@@W@~<px @ :@j@ ! ғxv~<@@W@8~<px |N| '4W@Q @  @j@Q  :@j { |4 wr{| Gw'4W@Q   @j.~<ǎ8@@WH8<@~Dpv G@  zv̋>:T2U H@  @  @ @gG{>8g W'' n%# F%! ;Qa1h&! 5Rb1H&# 2Td1(&' 0Xh1gP[`\;Qa1h&! 5Rb1H&# 2Td1(&' 0Xh1Gu*^u ސ[pV\ D'R[p('Sސ[p'T j'R'S 'T H>2PшP\B\'U 'V"\p(vHGG[p$xސ[p$x v~Dǎ@Ǟ<Ǯ8HHW8 4W88WPDH~Lp8 D! " D V Dp8> xސ $>> ސ  r'4Wr~LǎHǞDPPWH~Dpd zz"*̎ DzD DD 0@  @~DHHWH~Dp@&@$ @D 0ZD~DHHW8 > RbJR02256 0 0@(C@*0 0@(60,,88W8 z~4q>s~488Wh@DHLPT~X|\pP\x^dPh^`  e(nd`d \h d \g\P\ \ \ %s ! \ \  \ (t \ @\\  X':^` pΐ   Xx  0рx^\n\,@0 #} ,@ 4\0  ,B00  *(00  200.P )0 p16 1#00  800  00   )ۘpnX     _ n~@   0X +({n`^`Q^`^dT^d\p ~XǎTǞPǮLǾHD@hhWHP(` `4 rYlP<  @  @  @@ @2 @"  @]@  FpxW l6~Dǎ@Ǟ<HHW@8z~<~΀   Xqxp|W<  @ ~<ǎ8@@W8z   Xx!Fp%"W88W8z   Xx!Fp%"W88W`DHLPzTXz~\F TD2 0x,g< YTC4  0x,g Y  Xqxӱ x(:b P'8 ! 0 !$'< ! 0 !  X~\ǎXǞTǮPǾLHD``Wp@DHL x  X P 0T~Xpx<8p۸W @  @T**(*(hbL         : l   !YR h@ @ qpQ\x p e ^d@ @Q    @@ z$@ qpQ\x pe \^d^nd p `^\ \` .\`P^j>`  (ǎ`nd  pQ0 V^l Fp W  L@   ]^l((N!p, ]~^l((' "   p]2g&^jV^jnj @ nj`0nd p (0 #\Ћ @  @b\@  @ qpQ\x p e ^d@( @db L   <    $    >Xp "    ċ!UV d @ @( @c|b L   |tڋ      v   "ܐT $    !T: b@! @  bb 0 = p! ! ! Xܬ (    !Sr b4 R  . {~XǎTǞPǮLǾHD@ppWP<~@pŖ pDXpHXD DH HDH DLXDQ    DpXxL  fǎL p $~@ǎ<PPWP<@~Dp޸ pz  Гn pπHWLWH HL HLL @ Wr  pWXLQ    L pW,~Dǎ@Ǟ<PPWH<~@| pDV~D ppDVD p  ~@ǎ<HHWH<@~Dސx޸\y@D t  @ @(X\pp! (! ~Dǎ@Ǟ<HHW`@DHLPT΀ Xߐx 0~Xpx <  W^_W^^W^] 8  <0  (FT @04(&@  <  D <@   <   <   <0  (FT @04(&@  ` * [8      z" |Y8    J  "  j  Lr8  "  "H  *8    "' !6 (0 p1 1# 'n_&6 (0 p1 1#\ B'n^&6 (0 p1 1# 'n]&6 (0 p1 1# < ! pp0K.0 8  p! ! !| b !    !J  Y`" (n Y>~XǎTǞPǮLǾHD@``W@~<p7 2H'#"0@ # 4 0#  0#7 2\    !Ir  L~<@@W8 B0 0CH243@@ 4040 0@40N0 0@4B0 0C 088WH08 0<~@zr qp!\x7 pϑ ! DN>D  < 2z ?  8 'N~@ǎ<Ǟ8HHW8  !q#'p"2\x !p% 88W8 !" @  Md    pMD88WH<@~Dp p  Xߑx  0߁xp 0 7 p! ! ! t.     ~Dǎ@Ǟ<HHWP@Dΐ H  0~LqxTR    0 9 p! ! ! @h<       x !    0 9 p! ! !D\t       !D:  R~LǎHǞDǮ@PPW@ ~8q qp1\x' p <I>~8@@W8 z0 2q37p2C\x'0 2p5# $I88Wx<@DH L P~T Ph^Xpx0߀xW ^p\xp dHds d @ @d  @  @d@  @@  @g  C l p\xP ^|p0PxX^xPx^tP ^p ǎx~t@ b XG \GX X\ .X\$l$l  !  `Gd`      (!  (!  (!  (! Fh (! !(! pxW   @ (!  (! & ΋> @(!  @(! :l (!  (! & ~* (! l (! 2 N6 !   "   $  r (  b    <      !@ċ    x  d  P  <  (   (!2@@ 428 !2 !0# !2(#2 #@ $ .( 0 #( !? *(! *"(! "pݸW  ΰ   ΰ      p  z  ΰ  @       p  zZ     p  z ؋4z+Tﲋ XB \BX X\ .X\J$h$hX X\^p \ \^ç8 dB:d (g$p$pXhBXnV!X( VnXhQ  @ @@Q l  @RFp!W4(on$t$th @ @@ @h  @  @@ @d@  @@ @<  @  .@   ;@  @T@Q  D.Dz6D0@ @ǎh @ bT  ΐ  <޸ ޸޸8n @ W8    ΐ @  ,    '4W  '4W    n       p  4*Fp!W (on$t$t:  " n  m,v h',;,m0008X ='2,,Fp!WX.\k! 0 #=h'02',!F',p!W^|Q^|^pQ ^p^Q^^tXQ^t^x0Q^x^|X~TǎPǞLǮHǾD@<WX8<@DHL~P|ްЀ\P\ހ^ޠ^T  9@`z^T [p  8(  < ;  ^T @PD<^T\ ?~PǎLǞHǮDǾ@<8XXWXDHLPzzsΠ~T\  pp  @  @ zc3 0f ؎| z`J0>    t\TB8 2 . \3 Bzc0 0z   $z z\zs怡     zc1 0 zc2 0 DN z~  004  W  Y~TǎPǞLǮHǾDXXW8  !p%3@88WP@DHzzs  p~Lp @ YW Dߠ & zc"!0аYP B  & 40zc!!0Yzc# 0fY    ~LǎHǞDǮ@PPWP?8<@DzHzs !  <~Lq>j  @ / >,( `  $XH @  0,~LǎHǞDǮ@Ǿ<8PPW@48~<pzs   D߀  < ($$ ,Hp((0$$ ,HD((0,"Ht 0H(0cccccBcB︧4 $$ pW"   ^d-^d p-X )2P^\  :^d-^d p-tX _P^\X"   ^d-,^d-X 6P^\^d ,^d,nc !!!"   N^d,^d p,X _P^\ ^d,T^d,DP^\z ^d,^d,P @^\> ^d+^d+P @^\^d +^d+nc !!!^d +l^d+Z^d+H^d+8ncP @ ^\!!!8^d *^d*^d*^d*ncP @ ^\!!! ^d *^d*^d*r^d*bP'^\ ~^d *F^d*4^d*"^dncE@p  pq ? ppq 0 0sp00pq p? sps0 0pxx p a)p^dncEBp  pq ? ppq 0 0sp00pq p? sps0 0pxx p  (^d(P'^\ ^d (^d(z^d (h^dncE@p  pq ? ppq 0 0sp00pq p? sps0 0pxx p a'^dncEBp  pq ? ppq 0 0sp00pq p? sps0 0pxx p  '^d&P'^\ ^d &^d&^d &^dncE@p  pq ? ppq 0 0sp00pq p? sps0 0pxx p a&^dncEBp  pq ? ppq 0 0sp00pq p? sps0 0pxx p  %L^d% 8"TT  T p߁jfpW c  c3 c!!pW  c0.T   c( ,  c3XTT,T  ,p  c( ,J  c1,T(  c( Z,  c2,T  c( ,  c#TT0$   p  c( ,J  c$,T(  c( Z,  c%,T  c( ,  c),T  c( ,r  c*,TP  c( ,*  c",T  c( : O  @rj*' p!'  c"   )4q!)40 `n.& |Ћ: $ 044   c!,T  c(  F 4:$  䘓* ,  c',T`  c(  F 4:$  䴓¢ ,  c&,T  c(    ^ R$ 6~ .  Г,PF 4:$   ,40 s֔ ^T044.TR !s#0   c(  r 4f $ ~4 . ň  44  2 &(044p0R 4F(044p0 ( d$    ~(p  . p  ck ca!pWT044.TR !s#0   ck r 3f$  ~3 . Ø D44 O  @^V  ca ,440 `F.& |P $ 44  ~(p  . nT4440 嘓n.TR !s#0   ci  $ 044  ~(p  .  sL 8>T(4<  c( "cBcBs ftT 0 )4q!)4R.TR !s#0   c( r 4f$  ~4 . L 崓r44p0  t h0' (044@ '0'(p0   '0)4q!)4 4 Г0' 8$  4400@ '0)4q!)4 '0'(p0  n $ 44  ~(p  .   c c!p WT 0 )4q!)4.TR !s#0   c f 3Z$   ~3 .  ֋ O  @vn.! p)0  c B )4q!)40 T.& $ ` $ 044  ~(p  . tT< )4q!)40 @l.TR !s#0   c  $ 044  ~(p  . 4R! 01,2%1,,! 01(21(, .F   ^~PǎLǞHǮDǾ@<XXWH 0 1 @DA @p~D!t8΀cxq p s0 s1sxq111 !+D~Dǎ@HHWH~Dzp4Ԝz $. >$~~DHHWH~DzpT48z $. >$~DHHW|  x YP \s  Y&|s  D 4WHzB#z0@s3~DЀ\sw0 7p sxY1p 7pc7Yn1pc"pc$00" YB!0c'#.0c!2&#p""`W"z$0,Y Y~Dǎ@HHWH<@~D|ސxp^а^F  ` t^ ~Dǎ@Ǟ<HHWH<΀ ~@px YD@ Y( p^ D<DD B  p¨D  &l4 ާ^@ާFާ  p^ ~Y0.D  @ ~@ǎ<HHWH<@΀ ~Dpx@ Y`   T  l < ~Dǎ@Ǟ<HHWYWP@DH΀ ~Lpxנr    . x   Xxt')Y' !'ttxx .    ( ttY, x! x (vx ~.   2 ~LǎHǞDǮ@PPW!~x0-pW!\!4  V !J  4! Ћ!  V !J  4! H(!n!D !& 2! # !  ! ۋ   @ :@A2@ b܋Z  p@ !GpB $@ BdP/W %@ Ap r !F@A4@ !   @ 0@ V@A,1#FA@@ @ r@ Af@ PA@ @A A< 1$0C100 40100 101#~ǎWH<΀ ~@px p^ DDQ  渓 p^ DDQ   Q   ~@ǎ<HHWH8< ~@qx(        8p^ DDQ  prp^  alp^  Jp^ 0 p^ ~@ǎ<Ǟ8HHWX<@@ ~Dpx l  l pW'0 #.J' .L'.N' .P'J.R*Ɔ YLJ*Y,Jz M OQ S p^ TT TN   2$ ާ @ާާ B V Y:(      p^  p^   Y   J    p^ B p^ ( Y~Dǎ@Ǟ<XXW x0@ !WH < ~@p q p^ Dn (( P  D  (D  D D  <D@  (D  D 8D (D  D ~@ǎ<HHW@48~<p1#!! #2!# !1#D!'  ' p!pxpx* x~<ǎ8Ǟ4@@W@8~<q 0t1P0p0 b00p00000 0 ~<ǎ8@@W8 ȧ~4ppp"ptL~488W@8~<ppxpppx~<ǎ8@@W@8~<p:*(! x~<ǎ8@@W@8~<p( x px' ~<ǎ8@@WX?@DHLP˧~Tq |W%:) ppp((x    ~TǎPǞLǮHǾD@XXWX?@DHLPʧ~Tqt'H pr ' p '''' {q{Wրt%( (v (* )R  C  ~TǎP ǞLǮHǾD@XXW0 ! #"@ $W@48~<p H(p qr*L zq*`~<ǎ8Ǟ4@@WP<@DH~Ls )   a(!   z(!    A(! P  F(! @P@ $' ɧtL  0(! 8  9(! ( @'Ч  ~LǎHǞDǮ@Ǿ<PPWX@DHL~Pq ) b )8\  F )j,Q !0+#: )>T.T !0-#> )>T .TV !0*#> )>Tv b.T !/!> )>T. .T ~PǎLǞHǮDǾ@XXW 0 @(A@2 S 2 W36 @(A@1    WH48<@~Dpޠ_zdp q^ΐ;zz& + 0#z ~Dǎ@Ǟ<Ǯ8Ǿ4HHW, _z   W@z"~00z0Sp73_z30X573_z3zr7F"5p73_4 B$ 0p73_4 010p0 7~WP8<@Dz~Hqz$ *r  $LL_L_L_Lz_zL _L_ L_ Lp_L_L_ L_ #~HǎDǞ@Ǯ<Ǿ8PPW8 ȧ~4p_ _z*_( #L2 _ _ _~488WXDHL~Pq.z" T1"z ()8 T_z$ _0T_z( _T_ T_z" _ ZT_z  !2T_z  _T_T_~PǎLǞHǮDXXWH48<@~Dpzr:z"& 0# J!pqǎ     ~Dǎ@Ǟ<Ǯ8Ǿ4HHW`?DHLPT~XpbŽ &B   [ b\X\z, \ * ')z(7 \8(%~ pǐ \z ( +7~XǎTǞPǮLǾHD``W`HLPT ~Xq_zwב_ס_ױ_Ӂ_zbbhz( \1`F.\!_z0 _\Q _z$  (z(   z ( 0~XǎTǞPǮLǾH``WH<@~Dp_z$z  `  & @,ēr(ؓ^Jz.'z"q 5~Dǎ@Ǟ<HHWP@~Hs>L΋fLQPLb !0bb.Lzz( 0~HPPW0  _z"zbb! b 00WP@~@zs>D0b bDpb"zwDz'H1, bbH*Dz'H2HQ _zN_z'L1`$L_z _H_z _DR~@PPW@8~<րb(pb0Fb8s!s! b@ b@b@qh &0 2bH hb0b(b0~<ǎ8@@Wh<@DHLЧP~Tb8b8 j)! )# ! 8!X b@!܊4y&qpϮX4 ((  ~(( ΀. qb8b8~TǎPǞLǮHǾD@<hhWPDH~LbHrf '0b8PVH '0b@,. b@bH~LǎHǞDPPWPDH~LbHrf '0b0H '0b( b(bHr~LǎHǞDPPWXDH~Lr '>P  \ '>T8 TPTjP P~LǎHǞDXXW@~<p z ~<@@W`DHLPTX~\r p(  pנ, ? ؋'7\f N<'hB*'pX p(W‹4Xxq |qh*n VT.pP< "q  T!p((*뎄!0 # '02 0# 02!! PnB !0 (20 !0~(20. !pZ~\ǎXǞTǮPǾLH D``WX<@D~Hp  NNTϮO>$' L 'TQ%.Nd ~HǎDǞ@Ǯ<XXWP@DH~LbHs p (0b8 (0b@h b@r bH8b8\bH ԰b@~LǎHǞDǮ@PPWH<@~Dp( qpωX( q~Dǎ@Ǟ<HHW8bbbP޸l88WPT>DDJ~D!鰓D BDLL>H.DH0 DDtPPW8ȓ* X! @X$ bH88W@~8p `< 4<a <  ~8@@WH<@~@s bgqbd0abf0abe baqb` b\D,>D D2q80bxހbX@D<qDD `fDDD a!0a!ԓDP ~@ǎ<HHWXDH~Lr @'>P`P '>Tֆ`sT@P .P0@p` Tp021bX / V "0#.P1#.T!DP.T`(/0:~LǎHǞDXXWp@DHLPT~Xp/ @(>\F\Q ( ( (\n  (>`R `Q (#( (>d.\@p` ` pPRQ^hbX /5B x0// ` 2 R^d%0(# %W&1N(# ,.dp#1T2#3@ 41 2@`p9C10bXFGâSЧ^l<ΰ?$@lQQ^lS^l ޓ\lP/X `lP/X6aP/Y%p(cP/Y'!'N >h- ,`(I  @~XǎTǞPǮLǾHD@ppWXD~H LNLTT(T bH.TL !0A(20 !0z(20 R !0Z(20 !a(,>T LqT f1@Z(A@@a(A@ F0 1@A(C@0 1@!4 "0 1z( !qpLrH>T7C>L431Q5@a(405@z(405@ 410 1qxTpT.L1# q{ F {pW L 똂 LT( RLT(&>LT(&b`  *F8PhRX&|p@P|fRP RXpހVq,b  >bb qr 0~(v^:0M C0N V prLT(7M RM VLT(M DLT(nLT(M AtM V qrLT(72FM2 TN1MM V qrLT(~(܋bH ^ZpWbLT(ZNrpLT(7f.LT(ҋLT(.PDH~Lq  0d0@Dp)X!BEp)X!"d8dDPplqqusp <bp1(p,p)X!Bp-p)X!rp.!p"Xǁ'8~LǎHǞDPPW`HLP~T޸qbP޸(s pbpbJr!X.\ !@.\&"r!X"!X!@"!@ &"ꎁ\\*\z*X1ܞp   p1@N\ zX(4\s b LXQ _z ڋp   b0Ћ 0bN\ zꀧ(4\bzb \Xr~TǎPǞLǮH``WbHb@b(b8b0bbb_   !W8 ȧ~4p ,q~488W8 ȧ~4p q~488W8 ȧ~4p~pl~488W@8~<q4p("~<ǎ8@@W8ȧTT.X88WH<@~Dpq!0%#q)*!q 0! 9 d u o x6o x  )Z s$ǘ :!2 c D),~Dǎ@Ǟ<HHW`8<@DHL~P  ۋ ڋ -Vp>TB,(!*   q1Ŋ}q0'Tqp~PǎLǞHǮDǾ@<8``W       t h  \  P  D  8  ,       G  ȋ (F @G. DDLLGGXGG`GGhGGpGGxG G FG G G @ 0 12X12L10 ! G/")G#L  FXFF`F F1hF@FQpF`FqxFFFFFF GA G F B FF L  ȋ (W;W0DWLW LLW#>$PKDB>W8 ȧ~4pb,LzWD Dwtpۓ~488Wb t WH@~Dpb\(H.'r 6 z *.'J wtp~Dǎ@HHWH8<@~DÀ ( Bpנ pb( W wtp~Dǎ@Ǟ<Ǯ8HHWb ! tWb 1 tW8 z!  }n88W@~"i. tL$Y4 p  (i!. (i!֐  (i ‹ (iZhW%' l%# D%! ?Qa1`&! 7Rb1@&# 3Td1 &' 1Xh14 z  hW(%' l%# D%! ?Qa1l&! 7Rb1L&# 3Td1,&' 1Xh1 x l z4z($7T W z $T 7T*W~LǎHǞDǮ@PPWx<@DH ~Lpbǡǹ`P.P!(( ! '1z"@0$# n`W!%' \%# <%! ?Qa1H7Rb103Td11Xh1P ( wt((p  ~LǎHǞDǮ@Ǿ<xxWPbPbPb2bWP<@DH~L{Tp ~΋ܧ$'aX(' l%# D%! ?Qa1l&! 7Rb1L&# 3Td1,&' 1Xh1 kY)' n%# F%! ?Qa1l&! 7Rb1L&# 3Td1,&' 1Xh1 kZ3Qa1xb b!}>>|bĎpbbħp|bȶpbb.~LǎHǞDǮ@Ǿ<PPWXDHLP~Tְb. |b b |bbP+pb !8z"# !z" (zDz  Dz   ZR  ;}  4 $*0h {~ $Ǘwb< y $+0 $z {l~TǎPǞLǮHǾDXXW WP<@DH~Lzxz΀p ΀p 0W z  p ΀ ~p ΀p ƋdDz ΀P l:΀0Dz ΀   Dz ΀0   6 &Ȇ(Dz ΀pDz ΀Dz 4 D 00 zg4W %' l%# D%! ?Qa1`&! 7Rb1@&# 3Td1 &' 1Xh10 !  WDz" D J  ΋l΀b΀X) 6)  x`>  w~LǎHǞDǮ@Ǿ<PPWp@DHLPT~X ,  ( rp!  \WpQ Ǟ\^hPc8^dQ^l'aP/Rndpǁ(q $z, z`l$  >$^hW (+((Lji$lǞ`P^lPcX^d(cc~zc~* &z &c czc~XǎTǞPǮLǾHD@ppW8 ȧ~4p ]&z&&z.$z"cc r~488W`@D~H cxzcxnPY)' ^%# >%! ?Qa1\7Rb1D3Td1,&' 1Xh1 LL~Lp,p! cWpp$ "czzcz$zgX(' n%# F%! ?Qa1`&! 7Rb1@&# 3Td1 &' 1Xh1c|zc|~HǎDǞ@``W@8~<p0r 0r  "Y ~<ǎ8@@Wh<@DHLPЧ~Tx (Pp! XW$z X'aP/Rpߡc8\'aP/RpߡcXpQ ̧^d`)q r$z$ H((^dW  u 0r !6 b 0r   Ӌ&z*$z $cc  nΆ T m,  0  p`X%' l%# D%! ?Qa1l&! 7Rb1L&# 3Td1,&' 1Xh1 gX%' l%# D%! ?Qa1l&! 7Rb1L&# 3Td1,&' 1Xh1 $z $&(,` ~TǎPǞLǮHǾD@<hhWx8<@~Drpޠ0r p ޠ0r H0nLY)' ^%# >%! ?Qa1P7Rb183Td1 &' 1Xh1n\X(' ^%# >%! ?Qa1P7Rb183Td1 &' 1Xh1 H~l~Dǎ@Ǟ<Ǯ8xxWWWH8<@~Dpjr<n$L(ސbq8,<jD~Dǎ@Ǟ<Ǯ8HHW8 ȧ~4p !vX'!'! l ~488W8Dz" Dz j88WH@~Dpbv(<( (6 (w Dz D~Dǎ@HHW@~<p!! Dz D~<@@WH<@~Dpc pcccχchY3Qa1A `T:PV~Dǎ@Ǟ<HHWP@DH~Lqhh b0bb2&!!!i  '|! q!r|!q!!j4 )z xMi`` ~LǎHǞDǮ@PPWP<@DH~Lp (i " z @ PgY%' n%# F%! ?Qa1`&! 7Rb1@&# 3Td1 &' 1Xh1χnX3Qa1nX3Qa1T Π ~LǎHǞD Ǯ@Ǿ<PPW@8~<pnW3Qa10~<ǎ8@@W@8~<qnX3Qa1nW3Qa1~j z(z 0~LǎHǞDPPW8 ȧ~40P2Q 2 pq~488W@~ddXz%z!z ` eB!' je!( z' B` "W3Qa1 "ؓԲ d0>'1 #,' 1# '1#' 1 # d0!'z9z"#' ''z"0 # !''z"p#'' 'z" 4pTxp   d , WZ*~Dǎ@Ǟ<Ǯ8HHWP<@DH  ~L xp   zz V" !!rޠd0qz   hY 3 Qa1hY3Qa1x"x zzw W\ %õzzz@ z  ]z+zz+ztg)ùWzz"zz0z+zz+z ]PFw  X@)z"z'z"y x "z w z x    *[w w  [ǘ i X3Qa1iX3Qa1<(( T  z     V~LǎHǞDǮ@Ǿ<PPW@48~f81$H~Dǎ@HHWPDH~Lp #TnW 3Qa1n W3Qa17. "4 # X%(  BL OtWz @! z% @0 P  10 O(q @C48b1~1 b@4 J@4Z4@CN4 :@4 2@4*$ $#!~LǎHǞDPPW<@DHLP~TP^t *p K>t's2 !xx !'>   @ z @  dLdL'ώXX^phW3Qa1  LnW3Qa1D ǢPrǑ,(((h$zV^pnW 3Qa1  ^pnT3Qa1D z   ͋)zz" W)zz"<W t +H 9P.p Wz @  `YntzUV Q^|X @z P^x^tPR^lGЎ nt|-aW'' l%# D%! 0Qa1t&! 9Rb1T&# 4Td14&' 1Xh1 ^lP .xxs.|nx&ntz$znx\zU^|^|z \ z x.| KJ  Gr t )  9P.p W (^xn|V^xntznx IT IFXD  8XP.&zӈ&z&~TǎPǞLǮHǾD @<WX?@D0HLP ~TpxpF>   +| { q ~TǎPǞLǮH ǾD@XXWH@~D(q ` #TW3 #rQa1` #dW 3Qa1 #p #`0 #Pt~Dǎ@HHWXDHLP~TǹxwzpCp ΀h'  Dz&+z ΀P  h[3Qa1+00<Fb~TǎPǞLǮHǾDXXW`LPTzXz~\fprfp߰fxfpd fp, {pk8W'' n%# F%! 0Qa1`&! 0Rb1@&# 0Td1 &' <Xh1 8hxk X(' l%# D%! 0Qa1`&! 0Rb1@&# 9Td1 &' 4Xh1 (w4p"p! % #) #(p %` #(z…p #W (Ǩ zz910 1 z91 012 $#( #(p(& $(^!! #"  $ #(6 #(!0 #  $( #ܓ( #(!!  $0 #ԓ' #(!$  $8 #̓' #(!(  $@ $H' #(!0 #  $P #' # #'rN p $ #'PQ  sp %P $X'$pzp % $`' #&pND'B7HG(z"N(G,N,GT $hN0&4'87@ $&~\ǎXǞTǮPǾL``WpHLPTX\~`Pp^^| x( |(z (!6 (GV2*XzU^ (%n      @$$N '0nX 3Qa1 '%N. xp nL '0nX 3Qa1 '+$ ^[^X  F   $f+7Ў } p zW^^zU`(^X(' ^%# >%! 0Qa1H0Rb109Td14Xh1zR b ^|Q^|mX3Qa1} XZ^P P^,$&z"zBBz Bzؔ ȋ    D 9P ^^%kX 3Qa1nd]3Qa1 mX3Qa1 1r.m^d3Qa1: 9 0 3m^d3Qa1p < @L<0T,(LDZP^|  $'<Q'T$  p(,'( ', LD! ('<" ]h p h WBzz%*zz ?B ! !4BzBD( X z"z ?r ! !ǷDa@ !X& !!(&  X zz| > z+z(& ( !(& ! !&B'DX z(z6z  >\ z+z ! !z*z  zpXzNJp '8WpjpTjpDp  z…p 'XW(('TL((,'( ',  Z~4'(<'T vǸ(WZkz'\` *z)`` %'Q'0?@^p41Zz9530@N@:6` %'Q'0?@^h41Zz953@N 7`Z'T H` %   z   z < ' Z\2< W@<z^z'0((0b^P$z ^z('0('D7,( ^P0P^ v   8( H: z ( z"!(0 |  >`^P 0p4$z ^z('0( 2 |  >~`ǎ\ǞXǮTǾPLHW8  ~41qzwL@@DA 100,B4@BBBsp/~488WH@ ~D1&1 pzzZGAA $!e!d (!d$z1#dz(wz0p0 '~Dǎ@HHWP<@DH~L $ǰqRlj Lj  ZLjè z< z  4 z*z Lj 'z( X z%!.(!(z1z%#( (0 #4PLj oth&!X%!o /&kLjo6qxoz] y)D z z  )Dz!)D!n'!'!ow z  .N $W'D! $U . ~LǎHǞDǮ@Ǿ<PPWxHLPTX\~`p$ǰWTЧ^d(RP^dP^hW,^p(Q^p'@k<z&( z'@np gz zQ^hzQ (X^l+<(z"!,  Q^ll0'( bzdp+<z"!'@p( ,'T  $&zz4+&7PDz"10daP/R #(@@0 .ap p  D n a~Dǎ@Ǟ<Ǯ8Ǿ4HHWW@  L'p (W2.*2 " ^f.$#>$D@@W8p"9p8,0,ap9,0,appbp9309,0,bdF9709,0,dhgf9,,hfgd9,db9,ba9p8,pPb9309h5,0,bdR9709h5,0,dh gf9h5,hE,hfgd9h5,db9h5,ba9,p0,(" b`p (  a a n@Ǟ<8HW@8~<^pfpN@'  0Q%" $%0 #!!1 #!`wf^~<ǎ8@@W`?HLPTX~\^֐f ^dlj ǩpϸ [zBzz0$ .( 7 ,qtXXZzXz zZfs@ ]~\ǎXǞTǮPǾLH``W !WH~Dpp (Wppzz pr`   z   z<  )(@ zz`  z   z<  L z9 zp )'50  z   z<  (,Ћ~z f$z<XzЀ >G 'D(1(ҋ XZJp~DHHWhDHLPTXЧ~\ǘZ^`z[(`[ y WzU^d P^d HDp )PW:І &z z xp zpp  І  pЎ   L r T Z  6;:Z< @<0T,(Ћp `Y 3Qa1?pЋfrX<AZІPP"FpXzz@ d  e(<>z"z ! |<'(z<0@jH Ћ: @*Hp p  )zp$zd('0О`W\ ~\ǎXǞTǮPǾLHDhhWH@~D ) )p>Pf 6p΀ >~Dǎ@HHW@8~<p$ǀzp\z  zp08$Bh4p ~<ǎ8@@W8 ȧ~4pz:6p )Wp pz$8~488WPf8Pf<Pf8WXLP~T|(z,XX(qx%(¶Wz,z``z *RJ  .\\(nW 3Qa1×n$W3Qa1(,>$f8) BnW3Qa1#v` *W 3 *Qa1z $ *(0=$: ~~TǎPǞLXXW8 ~4q (5~488W@  L'p )W2.*2 " f8.$#>$ d@@WP@DH~Lxwzp pf`' h Z3 Qa1hZ 3Qa1    *&V !z"0 #1z3 1 2 *~LǎHǞDǮ@PPWX@DHL~PpǰzΠ Πޅp *W Πf8 !7  Π | @lΠd ΠT 8 18Π0Π( Π 25LnT[3Qa1 Π   Π & Xk^T3Qa1d r1H Ћ: @*ΠΠ *pz  ~PǎLǞH ǮDǾ@XXWH8<@~D  F!!rM My~Dǎ@Ǟ<Ǯ8HHW`?HLPTX~\Ǩxb  !z x (ù  Pù (+ Z  &Zz z zhn$Y3Qa1 (>$, ( hY3Qa1 z'  ( '÷hn$X3Qa1 (,>$ ~\ǎXǞTǮPǾLH``W`HLPT~Xp!zzt  ZXnX3Qa1  ϑ$n\W3Qa1 n\Y3Qa1ǷnX3Qa1è\$(,>$ *`0dgY3Qa1g X3Qa1~XǎTǞPǮLǾH``W8 z 88W8 ȧ~4p !.$ &H'!'!I" >~488W@8~<!1#r !!!r;gX3Qa1~<ǎ8@@W@8~<!1#r !!!r;gX 3Qa1~<ǎ8@@WP?8<@DH~LGXx6 + w"VwWx G~LǎHǞDǮ@Ǿ<8PPW( ا ~D>L0ǾDLǞT  ^^VVV@~RGp@p" ApǮLzh Ap p2 A$p ǮDzàp q, At@  @ e~ǎǞǮ Ǿ(W q 0@ #q%0@ 4q3@~p GqApppqpwp~ǎ ǞWH8<@~Dp 2Ez +ސ 20@iZ3Qa1 LT P.X z "   2#@0 т +pzDЋ#, +4phzDV.`, +Lp4zDh"} +dvzDF~Dǎ@Ǟ<Ǯ8HHW@8~

F^F d<pTJ !   p h   ~p B   .p$ Z-~@ǎ<HHWpDHLPTXЧ~\pz :\zP^n (!  (! ^ hnhY3Qa1 2.h>b4^nz:V0h: ;gz&W1 ( z"0 # \X!0 # L%0(# @sz' !''!   !Ћpׁ؋ωb&,n F)z +Lΰwz !Ћpׁb&+  2&+րXp `bbb bp `bbp Њyp `bbb bp `bbpX 2 2 Άh 2 2^nz7>c) ~\ǎXǞTǮPǾLHDppW8  +~4p *6Tzp  z6~488W8D jh +j p88W8 2$z  +в 2$"D h +ړpp88WP<@D~HpϞLLp |z pzp Rx p|4 ր6s fzf 4 y lp p P ! |(z  x  Wz5 #z%,  x  t  x  Wz5 p#z%p,  x  !p""p'7#(&&xxz(zxYzdp p lp p LL6x xhp pdxxp pzp pxxxx~HǎDǞ@Ǯ<PPWP<@DH~LqXXX0 b:zLj$dXp `ddZXp `bbp$qX !XXX bEXz% z (0X!#p23'#)!yz)z< pb bdXp `dd$Xp `bbp~LǎHǞDǮ@Ǿ<PPW8 b88W8h fh V88WH8<@~D ֠p *`bPf u D   \     $      @ .             bf   ,ϒt  @ Jfp Ђb ~Dǎ@Ǟ<Ǯ8HHW0  @    2 2     $$$00WH8<D~@ Fp z z#( 4 ( ,p ,8WDpppp ,LX ,HD~@ǎ<Ǟ8HHWH<@ ~D (p#( 6 ( .p ,xWHpppp ,(̮2 ,̚~Dǎ@Ǟ<HHW8  Z  " 8$ ,60 ,̓& , -88WH@~Dp p $XBpN,,&hz2b@ . @@@H  hz&pH~Dǎ@HHW8pȆ~PPdH4HH f88W@8~<p%"pz6P'*PӶHz%P~<ǎ8@@W@((  Z  -pp,,  -4Ȃp<L  -l6p@@W@8~< "pp'r'r(r~<ǎ8@@WP<@DHp~Lpސ  rᆠ ޠ~LǎHǞD Ǯ@Ǿ<PPW@8~< "pp`'r'r(r~<ǎ8@@WP<@DHp~Lpސ`  rᆠ ޠ~LǎHǞD Ǯ@Ǿ<PPW@XҶXX`<:<Q a!@! a!A!``ы>X ` h p@@WP@DH~Lppސp  P q\? p0 0sp0`6@? sps0 pxx p  )7IǡϪǢϪD4$p =pސ  P q\? p0 0sp0`6@? sps0 pxx p  )7IǡϪǢϪD4$p =~LǎHǞDǮ@PPW8 ptt* pvv88WH8<@~Dph -v *r ێF 2R10021002"ً ސ ~Dǎ@Ǟ<Ǯ8HHW  W8 ȧ~4p J~488WH<@~Dπ(p  rᆐ -Гސ~Dǎ@ Ǟ<HHWH8<@~Dpޠp  h    q  -bdޠf  `bch  n  q  . ^ހX~Dǎ@Ǟ<Ǯ8HHWH<@~DpA(:z  pφp& .Hpz V"hzp" .lRz "!. . 3 Ȃ z pp .\Bjphpp .\~Dǎ@Ǟ<HHW@8~<ppz:Q',Ӷ \z~<ǎ8@@W8p `bbX *b  /X֋XZ88W ԋP@ ! 00 44 88P <<W@48~<pVԊ  ހ Ԋ N ހ  /(|ԋy~<ǎ8Ǟ4@@W@~< prrXrq4qD( /x <(' `05#(' Rp /XW /̋B /0 / /ȓ / /|D( ȶP@h Tp 0 ,Dphpp 0@^hp 0`4p$lpp dp~<@@WX@DHL~PrTԂ֋fp pTPp pP !   p""p0RBJ 1!现< p""p0 1@BJ 1!现ڋfp p\TPp p ! ( 0 0 0 0jp pRTQp p pp&pp&pp"x~PǎLǞHǮDǾ@XXW@8~< 0 pb 0\LJ  &(|'  ' (|'!' !q~<ǎ8@@W ( 0dq   #sp! j!!0? sp!s!0 # 6s   p ? p WP[D Fb GG(GG0G8FBP [lD! Ffbɂɢ (F`Fq0FFA8FFLB` W`ɀɠ WLW!rr, AB(Wr 0!WP[WB!/W!/W (! W (! W 0 W0 / @ކ@ # 0ATE#" 0@0W+K "01!W01$0h01%h01&h01WPWPX%@AQAGxBBSD"vdҋh('"@A('p'"$@A$X$@8hCA!FhCA"# L&"  ( tx9P .tW. ,<&" |&h$X x&H$8ώf&  d9P .dW  :~`ǎ\ǞXǮTǾPW@8~<p   \~<ǎ8@@W@80~< az  zp' *G#($ 4 rq(gX3Qa1~<ǎ8@@W @(#)conf.c 6.1 87/11/24 @(#)config.h 6.1 87/11/24 Ѐ Ѐ #  < (PB?  xxx(,8A\ĀĀ^|wd2( < `@d( e0g̀i`w7:=x;ԀlЀ0dxdxx:؀Ȁ P:؀:؀3@5(7 e0g̀vw<w:؀:؀QR@S`:Ā:Ā:Ā:Ā:Ԁl | )`7:N(NO}hЀ:Ā:Ā:Ā:Ā:THU$UtVЀ`<Y(YԀZ@\d^zzԀz:؀:Ԁ:؀:؀:؀::Ā:Ā:Ā:Ā::Ā:Ā:Ā:Ā::Ā:Ā:Ā:Ā::Ā:Ā:Ā:Ā::Ā:Ā:Ā:Ā::Ā:Ā:Ā:Ā::Ā:Ā:Ā:Ā::Ā:Ā:Ā:Ā::Ā:Ā:Ā:Ā:a؀bbc0d:Ā:Ā:Ā:Ā::Ā:Ā:Ā:Ā::Ā:Ā:Ā:Ā:!q|؀Ȁ&F0F0 (0 ؀怀HRX/Vundef1.1standardridgeSASCIOMTSMDFDLPANSIKEYBDISPCIODEBUGCIODIAGCIOLANCECIOENETCIOTTYCIOLPCIOISBXCIOTAPECIODISCCIOSCSIMTEXTENETSASAL @(#)linesw.c 6.1 87/11/24 @(#)config.h 6.1 87/11/24 ܀D|<:؀:؀:؀:؀0:؀d:؀܀D(<::؀:؀:&&!"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""&f&d","@"T"h&"|""Ā"؀bb(b4# #TbX @(#)bio.c 6.1 87/11/24 devtabbflush: bad free list Cache: number of buffers %d binit @(#)clock.c 6.1 87/11/24  @(#)debug.c 6.1 87/11/24 @(#)errlog.c 6.1 87/11/24 @(#)fault.c 6.1 87/11/24 pfault before vfaultSMXMXL̀L̀MXtune.t_prep + 1 >= countfault.cpage read errorvfault - bad dbd_typepfd->pf_use == 0fault.cpfd->pf_flags & P_DONEfault.c @(#)fio.c 6.1 87/11/24 closef:DTYPEfileNFILE @(#)flock.c 6.1 87/11/24 bbc(cceeeeed4bԀbeeeeed4edeeeeeeeeeeeeeeeee @(#)getpages.c 6.1 87/11/24 run vhand DANGER: vhand needs swap space p->p_flag & SLOCKgetpages.crp->r_flags & RG_LOCKgetpages.crshst`t`srp->r_flags & RG_LOCKgetpages.cgetpagesgetpages - pbremoverp->r_flags & RG_LOCKgetpages.c WARNING: swap space running out, needed %d pages DANGER: out of swap space. Proc %d cmd %s Killed (out of swap) rp->r_flags & RG_LOCKgetpages.cpfd->pf_use > 0getpages.c @(#)iget.c 6.1 87/11/24 inodeNINODEno imtiaddress > 2^24 iaddress > 2^24 s5ip != NULLiget.ciinit - cannot read root superblociinit - not a valid root file system @(#)intr.c 6.1 87/11/24 spurious interrupt : IOIR = %x @(#)machdep.c 6.1 87/11/24 NO PAGE TABLE SUPPORT ON THIS MACHINE looping... @(#)main.c 6.1 87/11/24 etc/init growregvhandvhandbdflushbdflushschedsched @(#)malloc.c 6.1 87/11/24 DANGER: mfree map overflow %x lost %d items at %d  @ @ @ @ @(#)move.c 6.1 87/11/24 @(#)msg.c 6.1 87/11/24 Can't allocate message buffer. ԀȀT8 @(#)nami.c 6.1 87/11/24 @(#)page.c 6.1 87/11/24 rp->r_flags & RG_LOCKpage.cpfd != phpage.cpfd->pf_flags&P_QUEUEpage.cpfd->pf_use == 0page.c(pt->pgi.pg_pte & (PG_V | PG_REF)) == 0page.c!rp || rp->r_flags & RG_LOCKpage.cpfd->pf_use > 0page.cip != NULLpage.cip->i_map != NULLpage.cip != NULLpage.cip->i_map != NULLpage.cpinsert dupno kernel virtual space size %d %d %d ip != NULLpage.cip->i_map != NULLpage.c!rp || rp->r_flags & RG_LOCKpage.c @(#)pgtalloc.c 6.1 87/11/24 size >= 0pgtalloc.c(pt & POFFMASK) == 0pgtalloc.c(pf->pf_flags & (P_QUEUE | P_HASH)) == 0pgtalloc.c(pf->pf_flags & (P_QUEUE | P_HASH)) == 0pgtalloc.c(pf->pf_flags & (P_QUEUE | P_HASH)) == 0pgtalloc.cpf->pf_next == NULLpgtalloc.cpf->pf_prev == NULLpgtalloc.c(pf->pf_use & (setmask[nfree] << ndx)) == 0pgtalloc.cpf->pf_next != NULLpgtalloc.cpf->pf_prev != NULLpgtalloc.cpfd1 <= toppgtalloc.cpfd1 - pfd == npgspgtalloc.c~ @(#)physio.c 6.1 87/11/24 IO err in swapphysio: useracc failed @(#)pipe.c 6.1 87/11/24 @(#)prf.c 6.1 87/11/24 0123456789ABCDEF%d%d:%d%d:%d%d Double panic: %s panic: %s %s on dev %d,%d device error bn = %d er = %x,%x assertion failed: %s, file: %s, line: %d assertion errorWARNING: system table overflow: %s (%s) @(#)probe.c 6.1 87/11/24 @(#)rdwri.c 6.1 87/11/24 @(#)region.c 6.1 87/11/24 regionsREGIONSrp->r_flags & RG_LOCKregion.ci <= limregion.cpt != 0region.crp->r_flags & RG_LOCKregion.cup->u_procp->p_flag&SLOADregion.crp != NULLregion.crp->r_flags & RG_LOCKregion.crp->r_list[0] != 0region.crp->r_flags & RG_LOCKregion.csize > 0 && size <= NPGPTregion.cpfd->pf_use != 0region.cswpuse(&map) != 0region.cdupregrp != NULLregion.crp->r_flags & RG_LOCKregion.cchange >= 0 || (-change <= rp->r_pgsz)region.crp->r_refcnt == 1region.csize > 0 && size <= NPGPTregion.cgrowreg - ptmemall failedgrowreg p1 - ptmemall failedj >= 0 && j < NPGPTregion.clim >= j && lim <= NPGPTregion.cfindreg - no match @(#)sched.c 6.1 87/11/24 swapout(%d) p->p_flag & SLOCKsched.c @(#)sem.c 6.1 87/11/24     L   0    \T @(#)sig.c 6.1 87/11/24 ؀؀؀؀؀؀؀؀core @(#)slp.c 6.1 87/11/24 proc on q @(#)startup.c 6.1 87/11/24 %s release: %s version: %s on %s real mem = %d avail mem = %d @(#)subr.c 6.1 87/11/24 @(#)swapalloc.c 6.1 87/11/24 *cntptr != 0swapalloc.cswpuse count overflow - %s @(#)swtch.c 6.1 87/11/24 @(#)syscall.c 6.1 87/11/24 @(#)sysent.c 6.1 87/11/24 :lԐ `L@ |,РDl0L$\<:ۜ:Ӥ:p<ݘ<X؜L:wPL::PH@D $x@`:::::::::::::::::::::::::::::::R0Y]0V@RaLSS`Wtd\Y(]Zc::bD::8Ҥ;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::;œ @(#)sysmachdep.c 6.1 87/11/24 ;h;p;x;;;Ѐ;;<\< <8<< @(#)text.c 6.1 87/11/24 xalloc - bad magic @(#)time.c 6.1 87/11/24 W`/Lw/K:/JMFw/ @(#)timeout.c 6.1 87/11/24 timeout table overflow @(#)trap.c 6.1 87/11/24 ML\LĀLMDMDOtKMtL(OMMN$N\NǸOO<OM%x regsave != 0trap.cPROT or TRANS fault: va=%x pte = %x no pte trapuser = pid = %d uarea = %x ps = %x pc = %x trap type %x Privilege Violation at Address %x for Process %d comm %s Invalid Kcall at Address %x for Process %d comm %s Illegal Instruction at Address %x for Process %d comm %s Data Alignement Error at Address %x for Process %d comm %s Accessed Address %x Illegal Trap %d at Address %x for Process %d comm %s Memory Parity Error at Address %x for Process %d comm %s pid %d killed due to page fault read error comm %s syscall Integer Overflow at Address %x for process %d comm %s Integer Zero Divide at Address %x for process %d comm %s Real Overflow at Address %x for process %d comm %s Real Underflow at Address %x for process %d comm %s Real Zero Divide at Address %x for process %d comm %s Inexact Result at Address %x for process %d comm %s Real Before Trap at Address %x for process %d comm %s Check Instruction Failed at Address %x for Process %d stray interrupt at %x @(#)utssys.c 6.1 87/11/24 @(#)i_syscl.c 6.1 87/11/24 return from bind(%d,%x,%d)=%x acceptsorry no struct file lib rights lib from sockargs:copyin from:%x to:%x len:%d @(#)i_usrreq.c 6.1 87/11/24 gdgggggghDhli jjЀj؀jjjjgЀjjuipc_usrreq(%x,LISTEN) uipc_usrreq:accept(%x,%x,%s) uipc_usrreq:shutdown(%x,%x) uipc 1uipc_usrreq:rcvd(%x,%x) uipc 2uipc_usrreq:send/dgram(%x,%x) uipc 3uipc_usrreq:send/stream(%x,%x,%x) uipc 4piusrreqIPUTIPUTunp_connect2unp_disconnectunp_externalizeunp_gcunp_gcscan @(#)sys_socket.c 6.1 87/11/24 @(#)acct.c 6.1 87/11/24 @(#)alloc.c 6.1 87/11/24 bad free countno spacebad blockout of inodesbad countno fs @(#)bitmasks.c 6.1 87/11/24 ???? @ @ @ @ @(#)blklist.c 6.1 87/11/24 ip->i_map == 0blklist.cindlvl >= 0blklist.cip->i_mapblklist.c @(#)exec.c 6.1 87/11/24 @(#)exit.c 6.1 87/11/24 @(#)fork.c 6.1 87/11/24 no procs @(#)grow.c 6.1 87/11/24 rp->r_pgsz+change >= 0grow.c @(#)ipc.c 6.1 87/11/24 @(#)lock.c 6.1 87/11/24 ĀlL؀ @(#)ptrace.c 6.1 87/11/24 $@\8lĀ,  @(#)shm.c 6.1 87/11/24 shmat: prp\,d@t @(#)sys1.c 6.1 87/11/24 @(#)sys2.c 6.1 87/11/24 @(#)sys3.c 6.2 88/01/11 ÂЀ 8ĠmountNMOUNT @(#)sys4.c 6.1 87/11/24 لټ,dڜ @(#)bsdcompat.c 6.1 87/11/24 selwakeup @(#)i_domain.c 6.1 87/11/24 @(#)i_mbuf.c 6.1 87/11/24 mbinitm_expand() = 1 m_expand() = 0 mgetm_get(%s):%x m_getclr: mbfree twice-- m_free(%x):%x m_more(%d,%s): failed mgetm_morem_more(%d,%s):%x m_freem(%x): NULL mbfree twice MBFREE(%x,%x)m_copy(%x,%d,%d): empty m_copym_copym_copymget MBGET(%x,%d,%s) %x nospace(%x) m_cat(%x,%x): joined(%x,%x) new(%x) m_adj(%x,%d) %x m_pullup(%x,%d): mgetbad %x (08DPXdp|ƈƔƠƬƴƼMT_FREEMT_DATAMT_HEADERMT_SOCKETMT_PCBMT_RTABLEMT_HTABLEMT_ATABLEMT_SONAMEMT_ZOMBIEMT_SOOPTSMT_FTABLEMT_12MT_13MT_14MT_15 @(#)i_proto.c 6.1 87/11/24  fflXptpl0ǐtunix @(#)i_socket.c 6.1 87/11/24 socreate(%x,%x,%d,%d) solisten(%x,%d) sofree(%x) sofree dqsoclose(%x) soclose: NOFDREFsoabort(%x) soaccept(%x,%x) soaccept: !NOFDREFsoconnect(%x,%x) soconnect2(%x,%x) sodisconnect(%x,%x) sosend(%x,%x,%x,%x,%x)sosendmget!%x,%dsoreceive(%x,%x,%x,%x,%x) receivereceive 2receive 2areceive 3?%x,%d(%d)mbfree twicereceive 4mbfree twicesoshutdown(%x,%d) sorflush(%x)  p ܀ ܀ p ܀ ܀ ܀ p ܀ ܀ ܀ ܀ ܀ ܀ ܀ psosetopt(%x,%d,%d,%x)   Ȁ Ȁ  Ȁ Ȁ Ȁ  Ȁ Ȁ Ȁ Ȁ Ȁ Ȁ Ȁ sogetopt(%x,%d,%d,%x) sohasoutofband(%x) @(#)i_socket2.c 6.1 87/11/24 soisconnecting(%x) soisconnected(%x) soisconnectedsoisdisconnecting(%x) soisdisconnected(%x) %x sonewconn(%x):bad soinsque(%x,%x,%x) soremque(%x,%x) socantsendmore(%x) socantrecvmore(%x) sbwait(%x) sbwakeup(%x) soreserve(%x,%d,%d): ok bad sbreserve(%x,%d) sbrelease(%x) sbappend(%x,%x) sbappendaddr(%x,%x,%x,%x) sbappendaddrsbflush(%x) sbflushsbflush 2sbdrop(%x,%d) sbdropmbfree twice @(#)hwdiag.c 6.1 87/11/24 Ѐ؀Ѐ @(#)iomachdep.c 6.1 87/11/24 adr=%d , status=%x board address=%d type=%d UNDEFINED unknown type bypassed (can't dma beyond 16Mb) not configured overflow max board = %d %s number=%d d_write returned error on dcb move @(#)me.c 6.1 87/11/24 meload: %s inexistant Chargement de %s sur SAS%d meload: %s ne contient pas du code 68000 MELOAD: textsize=%8x, datasize=%8x textstart=%8x, datastart=%8x, totalsize=%8x dcb0adr=%8x meload: typepdev=%2x%2x, etat=%4x meload: arret du co-processeur impossible meload: initialisation impossible meload: adresse de chargement inaccessible adrIM=%8x meload: typepdev=%2x%2x, textstart=%8x, adrue=%8x meload: erreur de lecture meload: erreur de lecture meload: mauvaise fin de chargement meload: mauvais lancement MEWAIT: type=%2x, pdev=%2x, finordre=%2x meload:(fin sur timeout) typepdev=%4x meload:(pas d'IT appel 2) typepdev=%4x, statbase=%8x meload: dcb0adr<>: old=%8x, new=%8x SASINTR: type=%2x, pdev=%2x, ioir=%8x, cr=%4x sasintr: type=%2x, pdev=%2x, apres IT etat=%4x sasintr: type=%2x, pdev=%2x, IT fantome ... /etc/emc/ @(#)mem.c 6.1 87/11/24 @(#)mt.c 6.1 87/11/24 not ready statusoffline statuswrite protected%s on mt %d mtcommand(%x, %x, %x) mtstrategy:blkno %d,nxrec %d,b_blkno %d density switch not on BOTdensity not availablemt %d : error blkno(%d) > nxrec(%d) C C<C<C<C<C<C<C<C C<C<C<BC<C<C<C<C<C<C<Bmtstart(blkno %d,nxrec %d,b_blkno %d) mtstart:b_active = %x end of tapemtstart:cmd(%x) mode(%x) addr(%x) bcnt(%x) HLM M MxM$spurious interruptmtintr:cmd(%x) mode(%x) ioir(%x) blkno(%d) nxrec(%d) unknown commandQ QXPĀPQmtioctl(%x, %x, %x ,%x) (8((8(((8( @(#)prof.c 6.1 87/11/24 @(#)pty.c 6.1 87/11/24 WWĀX`WXtX̀XWԀX @(#)rawnet.c 6.1 87/11/24 rnetwrite: out of mbufs rnetwrite: out of bigbufs @(#)smd.c 6.1 87/11/24 no vtoc areabad block list too longinvalid partitionSMD d_write errorSMD disc errorsssssssssssssssSMD d_read errorSMD d_read errorSMD d_read errorSMD d_read errorSMD d_read errorSMD d_read errorSMD d_write error%s on disk %d ĀЀ܀$4D\hx׌ל Off Line Timeout Equipment Fault Write lock error Tranfer error Data overrun Sync. error header error CRC error in header Data check Seek failure Unknown drive type Unknown error Illegal param. in DCB order @(#)smlog.c 6.1 87/11/24 SYSTEM MESSAGE LOGGING OVERFLOW @(#)sxt.c 6.1 87/11/24 ȀLȀ`|(ʀlʀʀЀʀʀʀʀsxt cannot allocate link buffers @(#)sys.c 6.1 87/11/24 @(#)tt1.c 6.1 87/11/24 Flush(%x) (ЀT({)}!|^~'`\\ @(#)tty.c 6.1 87/11/24 ȀҀ <P`p((<<PPPPP<<<<<<xx|`{}~ABCDEFGHIJKLMNOPQRSTUVWXYZ @(#)tv.c 6.1 87/11/24 014B DF@(#)wbal.c 6.1 87/11/24CIO %d PROM Rev: %x CIO %d CODE Rev: %x CIO %d PCA Conf: %x CIO %d :Error - Board Firmware version must be %x or greater. WBCIO: error wbreset %x %x %d "€Ɣ؀ԀƐ4WBCIO: error wbflush %d WBCIO: error wbflush %d CIOerwrit hd!=tl %x %x %x WBCIO: error wbsendxoff %d WBCIO: error wbsendxoff %d WBCIO: error wbsendxon %d WBCIO: error wbsendxon %d WBCIO: error wbsetbrk %d WBCIO: error wbparam %d %x WBCIO: error WBCtest0 %xWBCIO: error WBCtest1WBCIO: error wbresetbrk %d WBCIO: error wbmodem &d WBCIO: error wbmodem &d $4hDhhhThhhhhhhd"<4Tߐߨ4߼CIOerit case= %x CIOstit case= %x WBCIO: error wbintr &d O.S. messages -- OFF O.S. messages -- ON  2Kn,X `%K @(#)wbct.c 6.1 87/11/24 cartridge not loadeddensity switch not on BOTcartridge write protected̀(Hh<(̀end of read tape_mark timeout on ct %d end of skip block timeout on ct %d end of skip end of data timeout on ct %d end of write tape_mark timeout on ct %d end of rewind timeout on ct %d end of erase timeout on ct %d end of retention timeout on ct %d end of load timeout on ct %d end of unload timeout on ct %d end of test_ready timeout on ct %d end of inquiry timeout on ct %d end of mode-select timeout on ct %d end of mode-sense timeout on ct %d end of prevent_removal timeout on ct %d end of allow-removal timeout on ct %d end of request-sense timeout on ct %d end of read block timeout on ct %d end of write block timeout on ct %d end of write raw timeout on ct %d end of read raw timeout on ct %d <xԀLȀ8hjjj`jjjjjjjjjjjEnd of cartridge on ct %d End of cartridge on ct %d d_write failed on Start IO Order on ct %d %s on ct %d X|`Ȁ̀\  d Ԁ D    Ԁ  D |ZZZZZZZx^^^^^^^^^^^End of cartridge on ct %d End of cartridge on ct %d End of cartridge on ct %d End of cartridge on ct %d File mark detected on ct %d End of cartridge on ct %d Illegal request on ct %d End of cartridge on ct %d Illegal request on ct %d End of cartridge on ct %d End of cartridge on ct %d End of cartridge on ct %d Illegal request on ct %d End of cartridge on ct %d Illegal request on ct %d End of cartridge on ct %d End of cartridge on ct %d End of cartridge on ct %d @(#)wblp.c 6.1 87/11/24$$t# %H"J"pLP: *** Error - LP Order = %x after interrupt. (Should be 0) LP: *** Error - Return status byte = %x after interrupt. LP: *** Error - StartDMA called while DMA in progressLP: *** Error - About to start DMA, but LP Order is not 0. Order = %x )),4,4,4,4*P*+ @(#)clist.c 6.1 87/11/24 @(#)partab.c 6.1 87/11/24  @(#)kdbn.c 6.1 87/11/24 %s %x temporary %x permanent %x perm %s pid = %d %2x%8x: R%dIIIII I8ILItII%8x, %s %8x: %2x%2x%2x%2x%2x%2x %3u %s %d R%2d: %8x SR%2d: %8x %8x : %2x = Y XȀX$XWWW,WWWV̀VYpYtYYYYYYYYYYYYYYYR2 : %2d Addr2 : %8x Mode : %s %s PC : %8x pid = %d %s %s Address : %8x pid = %d 0123456789ABCDEFPЀ p `؀LĀ$`؀ 0pЀ ,LH8DP\ht?? LOAD , LOADB , LOADH , LOADD , LADDR , STORE , STOREB , STOREH , STORED , (4@LXdp| $0<HT`lx ,8DP\ ht(4@LXdp|   $ 0 < H T ` l x               , < T     < x      , @ TBCDEGHKMSTL p |      Ѐ     0 8 P l   ܀  , D ` |   list of commands (all numbers in hexadecimal): ---------------------------------------------- b [address] - set breakpoint (Phys. Addr.), or list all breakpoints bv [address] - set breakpoint (Virt. Addr.), or list all breakpoints bt address - set TEMPORARY breakpoint (Phys. Addr.) btv address - set TEMPORARY breakpoint (Virt. Addr.) ca - clear all breakpoints cb [address] - clear breakpoint (physical addresses) cv [address] - clear breakpoint (virtual addresses) d address [count] - display data (physical addresses) dc address [count] - display code (physical addresses) dcv address [count] - display code (virtual addresses) dd dev unit part - dump memory on disk (dev, unit) , partition(part) dr - display registers dv address [count] - display data (virtual addresses) e - exit debugger g - go to the end of current function k - kill current process or go to Panic load - used to reboot from disk (dev, unit) m address - modify sequential data bytes s - single step t address [segno] - virtual to physical address translation Integer Overflow Integer Zero Divide Real Overflow Real Underflow Real Zero Divide Inexact Result Before Trap USER PRIVILEGEDKERNEL DEBUG ELOGR ELOGW TWRITEC TWRITED FLUSH TRAPEXIT ITEST REGN REGNB VERSION MAINT MOVE , NEG , ADD , SUB , MPY , DIV , REM , NOT , OR , XOR , AND , CBIT , SBIT , TBIT , CHK , NOP MOVEI , ADDI , SUBI , MPYI , NOTI , ANDI , CHKI , FIXT , FIXR , RNEG , RADD , RSUB , RMPY , RDIV , MAKERD , LCOMP , FLOAT , RCOMP , EADD , ESUB , EMPY , EDIV , DFIXT , DFIXR , DRNEG , DRADD , DRSUB , DRMPY , DRDIV , MAKEDR , DCOMP , DFLOAT , DRCOMP , TRAP SUS , LUS , RUM , LDREGS , TRANS , DIRT , MOVESR , MOVERS , MAINT , READ , WRITE , TEST > TEST < TEST = CALLR , TEST > TEST < TEST = RET , TEST <=TEST >=TEST !=KCALL TEST <=TEST >=TEST !=LSL , LSR , ASL , ASR , DLSL , DLSR , CSL , SEB , LSLI , LSRI , ASLI , ASRI , DLSLI , DLSRI , CSLI , SEH , BR > BR = CALL BR > BR < BR = LOOP , BR <=BR !=BR BR <=BR >=BR !=BR > BR = CALL BR > BR < BR = LOOP , BR <=BR !=BR BR <=BR >=BR != Debugger Call Invalid KCALL %d Data Alignement Error Address : %8x Illegal Instruction Opcode : %2x R1 : %2d Parity Error Code Fetch Address : %8x Parity Error Execute Address : %8x Page Fault Segment : %4x Address : %8x Kernel Violation Opcode : %2x R1 : %2d R2 : %2d Check Trap R1 : %2d R2 : %2d Invalid Trap # : %d External Interrupt Device # : %x Switch 0 Interrupt Powerfail Warning End Power Glitch Timer 1 Interrupt Timer 2 Interrupt Reserved Vector Exception Virtual PhysicalStep Break-Pointdump OK invalid partition no VTOC area invalid device invalid unit expected count expected address breakpoint table is full KDB> invalid text address invalid virtual address invalid text virtual address invalid command internal error, attempt to set afterpermbreak break twice internal error, can't find AFTERBRANCH breakpoint expected segment number pc break type %x is not an even address no breakpoint set at %x physical address = %x d_write error = %x IO error %x aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaȀaԀaaabbbb(b4b@bLbX @(#)if.c 6.1 87/11/24 2 @(#)raw_usrreq.c 6.1 87/11/24 pq0q|sqHsLqq؀sLqs$s@sLsLsLsTsxqtraw_usrreq @(#)route.c 6.1 87/11/24 rtfree @(#)af.c 6.1 87/11/24 }~}~((}~}~}~}~}~}~}~ @(#)raw_cb.c 6.1 87/11/24 @(#)if_loop.c 6.1 87/11/24 lolo%d: can't handle af%d @(#)in.c 6.1 87/11/24 @(#)in_proto.c 6.1 87/11/24  !Ѐ !(8hְ<(֐ \xЀȀXPppinternet @(#)ip_icmp.c 6.1 87/11/24 icmp_errorP44TP4444dxPLP @(#)ip_input.c 6.1 87/11/24 ip_initforward: src %x dst %x ttl %x 2 @(#)ip_output.c 6.1 87/11/24 @(#)raw_ip.c 6.1 87/11/24  @(#)tcp_debug.c 6.1 87/11/24 JJJ %s>,URG,,RST,FIN,ACK,SYN<%x%s %x %s:???????? [%x..%x)@%x, urp=%x%s%s%s%s%s%s%s%s%s%sPUSH%s%s<%s> -> %s rcv_(nxt,wnd,up) (%x,%x,%x) snd_(una,nxt,max) (%x,%x,%x) snd_(wl1,wl2,wnd) (%x,%x,%x) % % % % % % % % %Ȁ %Ѐ %؀ % % % % & & & &$ &0 &< &H &T &\ &d &p &| & & & & & & &̀ &Ԁ &܀ & & & & ' ' ATTACHDETACHBINDLISTENCONNECTACCEPTDISCONNECTSHUTDOWNRCVDSENDABORTCONTROLSENSERCVOOBSENDOOBSOCKADDRPEERADDRCONNECT2FASTTIMOSLOWTIMOPROTORCVPROTOSENDCLOSEDLISTENSYN_SENTSYN_RCVDESTABLISHEDCLOSE_WAITFIN_WAIT_1CLOSINGLAST_ACKFIN_WAIT_2TIME_WAITREXMTPERSISTKEEP2MSLinputoutputuserresponddrop @(#)tcp_input.c 6.1 87/11/24 vvvvvvvPx؀؀؀tcp sum: src %x tcp off: src %x off %d tcp_pulloutofband @(#)tcp_output.c 6.1 87/11/24 mgettcp_outputtcp_output REXMT @(#)tcp_subr.c 6.1 87/11/24 ʔʌʘʘʐʘʔʔin_cksum: out of data @(#)tcp_timer.c 6.1 87/11/24 Āϼ܀ζ???33?ٙ@@@@AAB @(#)tcp_usrreq.c 6.1 87/11/24 *|ѤѼҨҘ PdltȀ(8Ґ`Htcp_usrreq222HHT @(#)udp_usrreq.c 6.1 87/11/24 tlxxpxtt۔܀ @HlVx HTVV(88VVVVudp_usrreq @(#)in_pcb.c 6.1 87/11/24 @(#)wonder.c 6.1 87/11/24 @(#)wonder.h 6.1 87/11/24 @(#)lance.h 6.1 87/11/24 wbnetwork interface down network interface down network interface down ethernet initialized wbet%x: can't handle af%x resetting interface LANCE has been stopped removing interface LANCE has been stopped excessive retries on transmission, TDR value = %x  Reading from CIO: IOAddr = %x; error = <DLT Writing to CIO: IOAddr = %x; IOData = %x; error = IO time outIO data not validIO time out and IO data not validunknown error: %xbad command = %d, err = %x bad checksum in address PAL; command = %x, err = %x invalid error or command returned; cmd = %x, err = %x could not read physical address could not write initialization block could not write recv descriptor ring could not write xmit descriptor ring could not write LANCE registers could not write LANCE registers; err = %d error waiting for Init Done interrupt, err = %d could not write start command in CSR0; err = %d GetXmitBuf: ran out of xmit buffers All receive buffers used by one packet! FXhxself test error: LANCE register testlocal memory testshared memory testLANCE initialization testunknown self test error, error = %x cannot enable CIO ethernet command interrupts %d could not write CSR0; err = %d cannot enable CIO LANCE interrupts %d %x paquets veroles @(#)mapa.c 6.1 87/11/24 @(#)if_ether.c 6.1 87/11/24 duplicate IP address!! sent from ethernet address: %x %x %x %x %x %x .text 0.data00 .bss 1H.text!0x.data` ".bss 1H.text!.data8.bss 1H.text!@,.data@.bss 1H.text&(.data8.bss 1H.text(8.data8.bss 1H.text)HX.data8.bss 1H.text*X .data8.bss 1H.text,(.data8.bss 1H.text- .dataP.bss 1H.text- .datah.bss 1H.text;.datap8.bss 1H.text@X .data .bss 1H.textAb.data .bss 1H.textH .data.bss 1H.textVxd.data@.bss 1H.text]W.data%.bss 1H.textl .data.bss 1H.textxp.data.bss 1H.texth .datah@.bss 1H.textpxQ.dataX.bss 1H.textX.datah.bss 1H.text@.datah.bss 1H.textD.data@ .bss 1H.text .data`P.bss 1H.textk.data .bss 1H.text .data.bss 1H.text .data.bss 1H.textp.dataH.bss 1H.texth.data .bss 1H.text..data( .bss 1H.textը .dataH .bss 1H.text8u.datah .bss 1H.text"`.data(.bss 1H.text 0'.dataP.bss 1H.textP.dataX .bss 1H.text2.dataX.bss 1H.textA.data0.bss 1H.text p.datap.bss 1H.text(hX3.data .bss 1H.text- H.data`.bss 1H.text6%.data .bss 1H.text8H.data( .bss 1H.text:.dataH@.bss 1H.text:X#.dataX .bss 1H.text=8A.data8.bss 1H.textA.data.bss 1HH.textEx$.data8.bss 1.textJPH.data.bss 1.textP.data .bss 1.textR(.data.bss 1.textft.dataP.bss 1.textu.data  .bss 1.textwY.data@ .bss 1.textzQ.data`x.bss 1`.textx.data.bss 1.textx.datap.bss 1.text .data .bss 1.textI.data .bss 1.text i.data00.bss 1.text8.data`@.bss 2.text.data .bss 2.text2.data8.bss 2.text(.data .bss 2.text8h.dataˆX .bss 2.text8 .data .bss 2.text P.data .bss 2.text(0.data P.bss 2.textX0^.datap@.bss 2.text.datað0.bss 2.textx.data .bss 2.text` .data.bss 2.textH.data .bss 2.textH(.dataǘ .bss 2.text p a.dataH.bss 2.text`.data`@.bss 2.texthN.data̠.bss 2.text %.data͠.bss 2.text38c.dataP .bss 2.text7.datap.bss 2.textQI.dataP .bss 2.textT@ .datapH .bss 2.textaXF.dataԸ`.bss 2.texte(P.data.bss 2.textzx K.dataX.bss 2.text}.data#.bss 2.textp.data .bss 2.text0.data`.bss 2.text0 I.dataxX .bss 2.text H .data(.bss 2.texth,.data$.bss 2.textx6X.datap.bss 2.text.dataX.bss 2.text-X7.data .bss 2.text3 .data.bss 2.text3 .U.data .bss 2.texta..data .bss 2.textd@.data P.bss 2.textd@!.data  .bss 2.textl(D.data x.bss 2.texts >.data (.bss 2.text}(.data .bss 2.text~.data 0 .bss 2.texth!.data PH.bss 2.text .data  .bss 2.text.data (.bss 2.text@B.data !.bss 2.text.data ".bss 2.text H.data # .bss 2.texth .data #0H.bss 2.text xD.data #x/.bss 2.textr.data '.bss 2.textxP".data (h.bss 2.text.data (p@.bss 2.text.data (.bss 2.text.data (h.bss 2.textp5.data )0.bss 2.textֈA.data ).bss 2.textݘ0.data * .bss 2.text6.data *.bss 2.text.data 0 .bss 2.text@.data 0.bss 2.text `.data 0.bss 2.text0.data 0.bss 2.text.data 0.bss 2.text#`;.data 0x.bss 2_start _ccbsyscall!ispstend8)_clrmemX``_bootdev`_rootdev`_pipedev`']1!< 2Fd_main_uR@_proc0_uPintstack@_ftbits` \`j`v`SaveReg 3(_putchar!8 _getchar!X!x8!!_acctbuf 3H_acctp 3h_cfree 3p̀ k_pbuf k׀ o_hbuf o_file {_inode _proc _sptmap``_callout _mount"_errp`_sysinfo#_syswait$_syserr$_minfo$_vs_pregppt_region$_ractive_rfree_phead@_pfdatX_phash`_ptfreeh_tunet_swaptabt8  _inoinitxxx_cinit(,_binit8_errinitA_finit\_iinit ^|_socinitw_smdctab_smdutab(_smdbufh_smditab(_smdstat(_wbcttab*6@_ctstatJx_wb_alxTx_¨_mtbufҨ_mttabԈ_mtcmd֨_mtstat_vmtbufب_ctrbsy_sxt_cntth_msgmap_msgque_msglock 0_msgh h_msginfotp_semaH_sem_semmaphk"_semu2_semtmp=_seminfotuB_shmem_shminfot_mbutl_mbstat`p_mbfreex_mclfree_mbmaptu_flox_maxpmemu_pt_tty_bdevswu_smdopene0gi`̀w_mtopen7_mtclose:׀=x_mtprint;l0_cdevswv0&d0;_syopenx_nulldev:_syread_sywrite _syioctlP_mmread3@_mmwrite5(_mmioctl7 _smdreadvFw<Pw_prfreadQZR@dS`_nodev:nx | )`_mtreadN(_mtwriteN_mtioctlO_sxtopen}Àh_sxtread̀׀_ptsopenTHU$_ptsreadUtV`<_ptcopenY(Y_ptcreadZ@ \d^_smopenz_smclosez_smreadz'a1b<bFc0Qd_bdevcnty`_cdevcntyh_confswyp_smdintrq|\fpz&_mtintrF0_dblev _ciotype(_confcnt8@H̀׀X_dstflag`_swplo_utsnameh_lineswx_ttopen_ttclose_ttread_ttwriteD_ttioctl|_ttin_ttout<0_sxtin_sxtoutd_tvopen_tvclose_tvioctl(_tvin_linecnt_termsw_termcnt!alltraps#zXsyscall!!_syscall8Xkcall"_i_kcallaXalign",_i_aligna"@_i_instraXfparity"T aXeparity"haXkerviol"|_i_pviolaXcheck"_i_checkaXtrap"_i_trapb "Xswtch0"_i_sw0bXpwroff"_i_pwfb(Xpwron# _i_pwonb4Xclock# Xcl100#L_tictac1Xcallout#TXres#h_i_resbX_trapJXtrap_ret$__debug0+_clock;5_runrun_idle&_spl0+A&dK&fXpage&U&_rbsave`_old_ps_pfaultH_vfaultKk(w):bad_addr):_fubyte(_subyte( _fuword(4_fuiword(4_suword(P_suiword(p_copyin(_copyout(*_addupc*_spl1+0_spl4+0_spl5+|_spl6+|_spl7+|_splhi+|_splx++,x,,ǀ,р,ۀ,_icode,_szicode-ispstack8_bread-(_getblk2_iowait6 _breada-_incore2 _brelse0_bwrite/_bdwrite0X_lbolt_bawrite0_wakeup_panic_sleep_geteblk4_iodone6_clrbuf7_bzero_bflush7@_binval8<_maxmem_debug@`_sbuf_ksct_kbase_bdflush:_timeinH_prfstat_prfintrS_curpri_lticks_time_freemem_psignal*_vhandl4_runin@_printD_setlev@_suser[_mfreeLAd_mallocHVB_geterecBt_puterecC`C_logtchgE8jE|_blkacty _fmtberrEtG\_logberrH~Hd_findreg _reglockP( _pfree_premovep_swfree1/T_regreleLT,_pfindx_assfail<_ptfill_pinsert_swap_prdevpU_bcopy_getfV_closefVˀll_unp_gcq׀w`(_plockh_closepT_iput|_setjmp_prele_openiY _openpL_accessZ _getfsd_xrele@4_ownerZ_uchar_namei_ufalloc[_falloc\ _provflՀ_findfid]_fids0]d_frfid8_freefid]_frlock@_insflck_@_delflck`_regflckaT_flckadjb_blockedf_getflckg_convoffkd_setflckiLlH `_max_printfn#o.p8u`_swpinc00_memfreew(C_swalloc-Mh_uaccessd_uservadpXx_hinode_igetyc_iread{_itrunc_ifree_iupdat}_itrunc2o(_bmap(p_s5tloopx_free|d_maknodel_ialloc}_wdir_writei_iflushP_readi@z|_clkset_stat1_sendsig_grow(_bcmp|_setregs_edata 1H_chksize_maxumem_physmem_meminit_pallǀ_ksv_sz_userpte_mmvad_mmpte_curproc_msginit_seminit_startup'_rootdir_meload _devinit_newprocՀ߀(_growregt_sched(_maxupts_masktab_iomove_pcopyin_schar_passc_cpasst_msgconv_msgctl_msgfree_msgfp_msgget_ipcget_msg_msgrcvT_msgsnd8_msgsysL_sptfill_min_stfill_sptfree_flush_maxfree_ipflush_pmount_runout_swtch7 _pgtmap%_pgtfreeP_setmask_nptfree/¤:F Pp_physiol_useraccհ_physck_pipep_printc_pr_time _printnѤ_pr_hour_timelapA_pr_dst_smwrite|d_update _smdsyncyH_prcom_reginit_freereg\ hsH _dupreg_swpuse/_loadreg_uclear_mapreg_chgprot_setrqH_swapout|_semaoeX_semfupX_semunp`_semconv _semctl \_semunrm_semexit_semget_semopT_semundo_semsys_signal_setrun _issig_fsig_psig_stop_core(_exit_hsqueh_longjmp_runqhˀ!_end<_etext+`ր&_p0init$pp_pfhead_allocz6@_swapadd0_swapdel2D_getswap3_swaprem3L_unswap5_qswtch6_save@_resume_nsysent_sysenth_nosys:_nullsys:_rexit_fork_read_write_open_closel_wait_creat_link_unlinkԐ_exec_chdir _gtime`_mknodL_chmod@_chown _sbreak_stat_seek_getpid|_smount,_sumount_setuidР_getuid_stimeD_ptracel_alarm_fstat0_pause_utimeL_stty$_gtty\_saccess<_nice_sync_killۜ_setpgrpӤ_dup_times<_profilݘ_lock_setgid<_getgidX_ssig؜_sysacctw_shmsysP_ioctlL_utssysP"_exece_umask_chrootH_fcntl@_ulimitD_geteuid _getegid$_ftimex_reboot`_socketR0,Y6]0_connectV@_bindR@aL_listenS_acceptSL`VWtbdo\_sendtoY(_recvmsg]_sendmsgZycbD8Ҥ;œǀ:Ԁ;T_xalloc=@_xumount?<_xuntextADxD_timeoutE_timeid F_delayI_mapa_strayPd P_getsockf "e_sobind_m_freem\ , 6D_m_get A4 K V\_sofree_senditZ_sosendt_recvit^ b m y _m_free    f k8 k l@ ƀmD Ӏn od  p0  q@ + 78 E Op< Y h wx  x_m_copy   ph_ufavail t ̀ ׀_sbwait t s_soo_rwu u_ifioctlg_rtioctlxP w8_socloset_mbinith_ifinitdH _accty z !}_sbittab_cbittab_bldindr_gethead +_shmexec_punlock_get410_execreg_pexit$_shmexit_shmfork_procdup 5@ @ J T_tunlockL_dunlock,_procxmt_ipc ^_ipcreg@ i@_shmconv$_shmctlt_shmdt_shmget_rdwr@_sorwuio_copen_mgetdevǔ t_chdirecր _uiomove T_domains x   X Ā Ѐp ݀  p |_m_more8_m_cat|_m_adjx p_unixsw lX pt +p 7l0 A| L <_soabort V dP s   x   ,_sbflush8_sbdrop h_d_read#4_cfdebug͘ ˀ\ Հp_d_write#@_ctladdr (_medma  _nomfic _nomdir8_gethdr(_metraceH 1_dcb0adr _dcb0  /p_mewait*l / 1 ,_metoid @_meflag D_merev2 !2` +2_sasintr, 50$ ?0 J< _mtwaitOP_mtdebugH_mtstart@_k_tab0_C_tab_c_tab _d_unit_mt_cnt@_prfmax H_prfsym_prfctr2_ttinit Ua `X_getcbp1_getc-_ptsprocW, kW_ttrstrt uT_ttlowat \_putcbp2_putc._ttiocom8_putcf/_getcb00  R d e  g ŀl_smdbbk πq ڀր_sm_rpt R_sm_wpt Z \_sxtfreel_sxtbuf[8_sxtbusy[@_sxtinit$_sycheck_canon_tthiwat_getcf/h_ttxput_putcb0_tttimeo_partab _ttywait_ttnulq[`_ttccharH_canonb[p_maptabP_tv_blk_tv_fdx&p0\p:\xEhO\\\g\tԨP_StartWBh_ttcharް`̈́_wbmodemմĀЀ޸_wbalclrۀ|_BAUDpX `\_wbctptr\(^3@4_ctdensL4W`f_wbctclr`_wbcterrppz^^,"'_wblpclr,\^_deblank3(3`_blanc]_newline^0_number4_BASE@_expr5X̀7 ڀ7_d 8p8"9h_kdb_dlg^l1:C;pS<_=_defmodebkbuc>b@__strphs_strvrtA$_kdb_wrt^΀AހB4bb C|_v_countb( b0b8_d_countb@_dumpmemD@!d ,bH6E_vdumpFBG0_doregGMH$_codass(_SubopPXK lL|M_exitcmdMbP_kdb_goc\NdN_reconO_majdcbOt_dcbbX_itestd_loadcmdP_KDBdlgd,_dumpcmdR_ciT_KDBcmd_load_hlpʀY_strhdr(_strknm ׀[L_restartb@_kdbflag _strstp_strbkp_KDBwrt(_,`h_casehs_loadb_loadh_loadd_laddr_store_storeb_storeh_stored   (( 2 @ _i_pagea_i_intbMb@WbL_kdb_ccb _ifnetba lfyddeh ef _if_downfP_ifunitg_ifconfj_ipintrqbƀb_rpintrqb_rawcbb_rawintrnЀ~ ܀p_rtfreeup_rtallocs_rthostc8_rtnetcX_rtstatcxc_rttrashcvD_rtinit|t&x1}<~K(V_loifce_loioctlr|<_ipstatd_ipqd0_ip_iddL_inetsw (_ip_init8hɀְԀ<(֐\x'5XCPNpYeqdP{d_iptime "_ifinete_ipintr_ipcksum "t_ipaddr "€,΀\؀_ip_deq_ip_enqh| "_tcbf(_udbf83 #> #L_ripdst #PX #p_ripsrc #`b(mfpwfx % _tanames %` $ %P_tcp_iss_tcpstat %xȀ (Ҁ 'ހ(X $@6Ȝ@K(Vth${ ( (X< (h̀<ڀΔ )( )!d18= LP[k|{ ) )ݠ_udpstatX *_udp_in *ٰhɀӀ'ހ 4p ._WB_InitC#hN$Ydn 0yx_WBWritedŀ'_WB_Readπ_WBReadD܀%2=GXV`dwd_SleepOKh,p`<ʀ 0_Stats؀H@HP,,; JXT`_hj xpp lTȀpـx!-?O 1@c 0m_copyseg yL_udivudiv_uremurem#H_arpcom#_arptab*P_arptnew*_btext _bdata0_bbss 1H_sizememory__last_addr_mcversion_kdb_init_vadrspace_sys_sect_call_debug_fdlp_dcb_ftPageTables_ftHeadwall_machineid_cio_putchar_cio_getchar_breakchar_cio_breakchar_x25_attach_iomd_intr_bfreelist_pfreelist_phashmask_nextswap_swapwant_init_tbl_iomachdep_clkstart_flckinit_wbctcombuf_wbctrbuf_wbct_buf_wbal_tty_wblp_lpdt_wblp_lpbuf_sem_undo_shm_shmem_mclrefcnt_nmbclusters_flckinfo_flinotab_pt_ioctl_smdclose_smdstrategy_smdprint_mtstrategy_wbctopen_wbctclose_wbctstrategy_wbctprint_wbalopen_wbalclose_wbalread_wbalwrite_wbalioctl_smdwrite_smdioctl_prfwrite_prfioctl_wbctread_wbctwrite_wbctioctl_wblpopen_wblpclose_wblpread_wblpwrite_wblpioctl_sxtclose_sxtwrite_sxtioctl_ptsclose_ptswrite_ptsioctl_ptcclose_ptcwrite_ptcioctl_wbetopen_rnetopen_rnetclose_rnetread_rnetwrite_rnetioctl_wbetintr_wbetctrl_wbalintr_wblpintr_wbctintr_conf_devs_dev_init_wbalinit_wblpinit_wbctinit_wbetattach_loattach_timezone_sxtrwrite_xdbgcall_xsyscallXillinstr_i_dbpe_cf_i_dbpe_exXinterrupt_ext_intr_addupc_clk_kcall255_kcall254_call_rbug_idle_addr_copy_start_copy_end_headwallLight_searchdir__HeadwallDiag_HWLoadEnable_R32LoadEnable_HWSerCmd_ml_elogr_ml_elogw_sptalloc_bufstart_panicstr_switching_new_scheduler_slice_ticks_vhandcnt_bdflushcnt_slice_size_geteslot_freeslot_logstart_logstray_fmtraerr_logmemory_ptmemall_copypage_clearpage_pageincache_memreserve_killpage_cleanlocks_soo_close_ffreelist_allocfid_deadflck_sleeplcks_getpgslim_ageprocess_ageregion_getpages_swapchunk_pbremove_ublk_ptbl_ifreelist_freeblklst_s5itrunc2_HWGetDate_coredump_findpreg_HeadwallDiag_firstfree_allocator_pgtalloc_pgtallocator_allocreg_attachreg_pcopyout_ipcaccess_punmount_startup_pgtalloc_ptmalloc_kpgtfree_getcpages_nptalloced_freepage_contmemall_nullregion_chkattach_nullpregion_loadstbl_detachreg_rptexpand_chkgrowth_bldblklst_lockedreg_freeproc_next_page_mktables_ublk_sgtbl_p0init_done_cfreelist_swapfind_swapclup_lastproc_swapfunc_socksend_sockrecv_setsockopt_shutdown_socketpair_getpeername_recvfrom_getsockname_getsockopt_setreuid_setregid_sysmachdep_truncate_ftruncate_traptoround_roundtotrap_HWClockCommand_timetoYMDHMS_YMDHMStotime_untimeout_socreate_sockargs_solisten_soqremque_soaccept_soconnect_soconnect2_soreceive_soshutdown_sosetopt_sogetopt_m_getclr_uipc_usrreq_unp_attach_unp_detach_unp_bind_unp_connect_unp_connect2_unp_disconnect_socantsendmore_unp_usrclosed_sbwakeup_unp_internalize_sun_noname_sbappendaddr_sbappend_unp_drop_unp_sendspace_unp_recvspace_soreserve_soisdisconnected_sonewconn_soisconnected_unp_externalize_unp_discard_unp_gcing_unp_defer_unp_mark_unp_scan_soo_ioctl_soo_stat_domaininit_compress_badblock_getxfile_makechild_textlock_datalock_proclock_dirtypage_shmattach_HWSetDate_procfind_selwakeup_unixdomain_inetdomain_pffasttimo_pfslowtimo_pffindtype_pffindproto_pfctlinput_m_clalloc_m_pgfree_m_expand_m_pullup_raw_input_raw_ctlinput_raw_usrreq_raw_init_sbrelease_sorflush_sodisconnect_socantrcvmore_sohasoutofband_soisconnecting_soqinsque_soisdisconnecting_sbreserve_GetHWSwitches_move_dcb_dcb_write_medmaptr_readlong_readshort_writeshort_writelong_metimeout_readstat_writecom_readbyte_writebyte_mtcommand_no_t_proc_ptcwakeup_tptsproc_ttyflush_tptcwrite_wbetoutput_localAddress_rawinput_rawbuffer_smdcommand_smdstart_smd_write_smd_strer_sys_mess_linkTable_sxtnullproc_sxtvtproc_sxtlinit_sxtalloc_wbalunit_wbal_cnt_wbal_addr_wb_reset_PROMVersion_PCAConfig_CODEVersion_WBCommand_intrpInterval_wbalproc_wbalparam_WBCtest1_WBCtest0_WBWriteChar_wbresetbrk_diag_cons_WBSetStartStop_WBGetStartStop_timeInterval_wbal_cons_KEYBOARD_wbct_cnt_wbct_addr_wbctcommand_wbcttimout_wbctstart_wbctrstrategy_wbctimex_wbctphys_wblp_addr_wblp_cnt_testOffline_wblpoutput_wblpstart_CodeVersion_kdb_getline_instrucinfo_breakpoints_breaktable_txt_translate_findbreaktableentry_findbreak_addbreakpoint_deletebreakpoint_handleaddbreak_readtarget_singlestep_stepmode_pcb_access_handledeletebreak_numbreaksset_displaybreaktable_kdb_printf_setbreakcmd_clearallbreaks_clearbreakcmd_break_pc_break_type_vdumpmem_v_offset_d_offset_translate_modeflag_displaycmd_transaddr_dispinstr_displayinstruction_displaycodecmd_displayregscmd_cons_diag_modifycmd_kdb_flush_singlestepcmd_start_loader_writeheader_exception_modestring_kdb_print_kdb_printn_save_reg0_default_pcb_debug_pcb_user_pcb_user_default_kdb_default_i_timer1_i_timer2_ifqmaxlen_if_slowtimo_if_attach_if_ifwithaddr_if_ifwithnet_afswitch_if_ifonnetof_if_ifwithaf_rawintrq_raw_attach_raw_detach_raw_connaddr_raw_bind_raw_disconnect_wildcard_rtredirect_rtrequest_null_hash_null_netmatch_inet_hash_inet_netmatch_if_makeaddr_looutput_if_rtinit_in_netof_in_lnaof_ip_output_ip_slowtimo_ip_drain_icmp_input_udp_input_udp_ctlinput_udp_usrreq_udp_init_tcp_input_tcp_ctlinput_tcp_usrreq_tcp_init_tcp_fasttimo_tcp_slowtimo_tcp_drain_rip_input_rip_output_icmp_error_icmpstat_icmp_reflect_in_cksum_ip_protox_icmp_send_ipqmaxlen_ip_dooptions_ip_forward_ip_reass_ip_freef_ip_stripoptions_ip_ctlinput_inetctlerrmap_tcp_abort_in_pcbnotify_udp_abort_ipprintfs_ipforwarding_ip_optcopy_ripproto_tcp_trace_tcp_debx_tcp_debug_tcpstates_prurequests_tcptimers_tcp_alpha_tcp_beta_tcpconsdebug_tcpcksum_tcpprintfs_in_pcblookup_tcp_saveti_tcp_dooptions_in_pcbconnect_tcp_template_in_pcbdisconnect_tcp_drop_tcp_reass_tcp_close_tcp_canceltimers_tcp_pulloutofband_tcpnodelack_tcp_output_tcp_respond_tcp_outflags_tcp_setpersist_tcp_initopt_tcp_newtcpcb_in_pcbdetach_tcp_timers_tcpexprexmtbackoff_tcp_backoff_tcp_attach_tcp_disconnect_in_pcbbind_tcp_usrclosed_tcpsenderrors_in_setsockaddr_in_setpeeraddr_tcp_sendspace_tcp_recvspace_in_pcballoc_udpcksum_udp_output_zeroin_addr_SwapBits_arpmyaddr_wbetinit_wbetioctl_wbetreset_GetWonderBoard_WBDriverInited_AllocDescRings_disableWBInterrupts_arpattach_arpwhohas_wbsetaddr_wbetread_tcpipOpen_WBLength_RecvDescCopy_IORAMAddr_RecvQHead_WBOffset_copyLANCEBufToMbuf_arpinput_etherCBCopy_LANCEError_packetXmitted_F_Cpt_Init_InitStartCmds_arpresolve_copyMbufToLANCEBuf_XmitQHead_XmitBufs_TempXmitQHead_XmitDescCopy_RemoveWBInterface_wbshutdown_WriteWBCommand_RecvBufs_GetXmitBuf_FlushLANCEInterruptQ_XmitQTail_ReadXmitDesc_WBWriteIOErr_bad_Write_CmdTimeout_D_Cpt_Cmd_TO_ErrCmd_F_Cpt_Cmd_ReadRecvDesc_WriteRecvDesc_WriteXmitDesc_WBDevice_WBPresent_IOMapAddr_ReadRevCodes_RealRecvBufs_RealXmitBufs_diagCBCopy_ReadPhysicalAddr_SetLogicalAddrFilter_CreateInitBlock_InitBlockCopy_WriteInitBlock_InitDescRings_TO_ErrInit_StartTimeout_D_Cpt_Init_TestRecvBufValid_FindRecvPktEnd_etherbroadcastaddr_nbpkterr_TO_ErrXmit_clearseg_d_rwrite_arptimer_arpt_age_arptfree...1112131415161718191a1b1c1d1e1f102122232425262728292a2b2c2d2e2f203132333435363738393a3b3c3d3e3f304142434445464748494a4b4c4d4e4f40...1112131415161718191a1b1c1d1e1f102122232425262728292a2b2c2d2e2f203132333435363738393a3b3c3d3e3f304142434445464748494a4b4c4d4e4f40...1112131415161718191a1b1c1d1e1f102122232425262728292a2b2c2d2e2f203132333435363738393a3b3c3d3e3f304142434445464748494a4b4c4d4e4f40 @(#)conf.c 5.8 87/10/26 @(#)config.h 5.5 87/09/03 Ѐ Ѐ 3h d  < (PB? %z h-܀8A^ _Ȁ~(d2( < `@d( o8q؀stA CFЀE$<<˰8̄Ѐ˰8̄ЀX@Ԁ0@Ԁ@ԀP@\o8q؀؀h$@Ԁ@Ԁ[@[Ѐ\@@@@@<'( (*,4,- 6A CWXTYPЀ|d@@@@@^^_8`j@ccdfPhȀ <@Ԁ@,Ѐ@Ԁ@Ԁ@Ԁ@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@kll(m@n@@@@@@@@@@@@@@@!{܀48OO (0 p)H\XRX/Vundef1.1_betastandardridgeSASCIOMTSMDFDLPANSIKEYBDISPCIODEBUGCIODIAGCIOLANCECIOENETCIOTTYCIOLPCIOISBXCIOTAPECIODISCCIOSCSIMTEXTENETSASAL @(#)linesw.c 5.1 87/05/29 @(#)config.h 5.5 87/09/03 h$ȀԀx@Ԁ@Ԁ@Ԁ@Ԁ܀@Ԁt,@Ԁd$Ÿx@@Ԁ@Ԁ@&&!"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""&f&d","@"T"h&"|""Ā"؀p\phpt# #Tp @(#)bio.c 5.1 87/05/29 devtabbflush: bad free list Cache: number of buffers %d binit @(#)clock.c 5.3 87/10/16  @(#)debug.c 5.1 87/05/29 @(#)errlog.c 5.1 87/05/29 @(#)fault.c 5.1 87/05/29 pfault before vfaultTNNMxMxNtune.t_prep + 1 >= countfault.cpage read errorvfault - bad dbd_typepfd->pf_use == 0fault.cpfd->pf_flags & P_DONEfault.c @(#)fio.c 5.1 87/05/29 closef:DTYPEfileNFILE @(#)flock.c 5.1 87/05/29 ccdldDdVg:g:g:g:g:e|dd0g:g:g:g:g:e|ffg:g:g:g:g:g:g:fg:g:g:g:g:g:g:g8 @(#)getpages.c 5.1 87/05/29 run vhand DANGER: vhand needs swap space p->p_flag & SLOCKgetpages.crp->r_flags & RG_LOCKgetpages.cttuuuurp->r_flags & RG_LOCKgetpages.cgetpagesgetpages - pbremoverp->r_flags & RG_LOCKgetpages.c WARNING: swap space running out, needed %d pages DANGER: out of swap space. Proc %d cmd %s Killed (out of swap) rp->r_flags & RG_LOCKgetpages.cpfd->pf_use > 0getpages.c @(#)iget.c 5.2 87/08/07 inodeNINODEno imtiaddress > 2^24 iaddress > 2^24 s5ip != NULLiget.ciinit - cannot read root superblociinit - not a valid root file system @(#)intr.c 5.1 87/05/29 spurious interrupt : IOIR = %x @(#)machdep.c 5.1 87/05/29 NO PAGE TABLE SUPPORT ON THIS MACHINE looping... @(#)main.c 5.1 87/05/29 etc/init growregvhandvhandbdflushbdflushschedsched @(#)malloc.c 5.1 87/05/29 DANGER: mfree map overflow %x lost %d items at %d  @ @ @ @ @(#)move.c 5.1 87/05/29 @(#)msg.c 5.1 87/05/29 Can't allocate message buffer. 4$ @(#)nami.c 5.1 87/05/29 @(#)page.c 5.1 87/05/29 rp->r_flags & RG_LOCKpage.cpfd != phpage.cpfd->pf_flags&P_QUEUEpage.cpfd->pf_use == 0page.c(pt->pgi.pg_pte & (PG_V | PG_REF)) == 0page.c!rp || rp->r_flags & RG_LOCKpage.cpfd->pf_use > 0page.cip != NULLpage.cip->i_map != NULLpage.cip != NULLpage.cip->i_map != NULLpage.cpinsert dupno kernel virtual space size %d %d %d ip != NULLpage.cip->i_map != NULLpage.c!rp || rp->r_flags & RG_LOCKpage.c @(#)pgtalloc.c 5.1 87/05/29 size >= 0pgtalloc.c(pt & POFFMASK) == 0pgtalloc.c(pf->pf_flags & (P_QUEUE | P_HASH)) == 0pgtalloc.c(pf->pf_flags & (P_QUEUE | P_HASH)) == 0pgtalloc.c(pf->pf_flags & (P_QUEUE | P_HASH)) == 0pgtalloc.cpf->pf_next == NULLpgtalloc.cpf->pf_prev == NULLpgtalloc.c(pf->pf_use & (setmask[nfree] << ndx)) == 0pgtalloc.cpf->pf_next != NULLpgtalloc.cpf->pf_prev != NULLpgtalloc.cpfd1 <= toppgtalloc.cpfd1 - pfd == npgspgtalloc.c~ @(#)physio.c 5.1 87/05/29 IO err in swapphysio: useracc failed @(#)pipe.c 5.1 87/05/29 @(#)prf.c 5.1 87/05/29 0123456789ABCDEF%d%d:%d%d:%d%d Double panic: %s panic: %s %s on dev %d,%d device error bn = %d er = %x,%x assertion failed: %s, file: %s, line: %d assertion errorWARNING: system table overflow: %s (%s) @(#)probe.c 5.1 87/05/29 @(#)rdwri.c 5.1 87/05/29 @(#)region.c 5.2 87/11/11 regionsREGIONSrp->r_flags & RG_LOCKregion.ci <= limregion.cpt != 0region.crp->r_flags & RG_LOCKregion.cup->u_procp->p_flag&SLOADregion.crp != NULLregion.crp->r_flags & RG_LOCKregion.crp->r_list[0] != 0region.crp->r_flags & RG_LOCKregion.csize > 0 && size <= NPGPTregion.cpfd->pf_use != 0region.cswpuse(&map) != 0region.cdupregrp != NULLregion.crp->r_flags & RG_LOCKregion.cchange >= 0 || (-change <= rp->r_pgsz)region.crp->r_refcnt == 1region.csize > 0 && size <= NPGPTregion.cgrowreg - ptmemall failedgrowreg p1 - ptmemall failedj >= 0 && j < NPGPTregion.clim >= j && lim <= NPGPTregion.cfindreg - no match @(#)sched.c 5.1 87/05/29 swapout(%d) p->p_flag & SLOCKsched.c @(#)sem.c 5.1 87/05/29 ܀`84 @(#)sig.c 5.1 87/05/29 !:!:!:!:!:!:!X!:!:!:!X!X!X!X!X!X!X!:!:!:!:!:!:!:!:!:core @(#)slp.c 5.1 87/05/29 proc on q @(#)startup.c 5.2 87/06/07 %s release: %s version: %s on %s real mem = %d avail mem = %d @(#)subr.c 5.1 87/05/29 @(#)swapalloc.c 5.1 87/05/29 *cntptr != 0swapalloc.cswpuse count overflow - %s @(#)swtch.c 5.2 87/10/16 @(#)syscall.c 5.1 87/05/29 @(#)sysent.c 5.3 87/09/30 @T`$X\X(HPD|hٰ H@۸x@l@Ȱ0` p@~p@@V@0AD\@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@XP_cx\pYgYZg<]jb_lc`Di@@h@@lA@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@Aɘ< @(#)sysmachdep.c 5.2 87/09/30 AdAlAtA|AÀA܀ABXBB4BB @(#)text.c 5.1 87/05/29 xalloc - bad magic @(#)time.c 5.2 87/10/08 W`/Lw/K:/JMFw/ @(#)timeout.c 5.1 87/05/29 timeout table overflow @(#)trap.c 5.1 87/05/29 SĀRRRSlSlUR SRPUĀS,TTLTTTU,UdUT%x regsave != 0trap.cPROT or TRANS fault: va=%x pte = %x no pte trapuser = pid = %d uarea = %x ps = %x pc = %x trap type %x Privilege Violation at Address %x for Process %d comm %s Invalid Kcall at Address %x for Process %d comm %s Illegal Instruction at Address %x for Process %d comm %s Data Alignement Error at Address %x for Process %d comm %s Accessed Address %x Illegal Trap %d at Address %x for Process %d comm %s Memory Parity Error at Address %x for Process %d comm %s pid %d killed due to page fault read error comm %s syscall Integer Overflow at Address %x for process %d comm %s Integer Zero Divide at Address %x for process %d comm %s Real Overflow at Address %x for process %d comm %s Real Underflow at Address %x for process %d comm %s Real Zero Divide at Address %x for process %d comm %s Inexact Result at Address %x for process %d comm %s Real Before Trap at Address %x for process %d comm %s Check Instruction Failed at Address %x for Process %d stray interrupt at %x @(#)utssys.c 5.1 87/05/29 @(#)i_syscl.c 5.1 87/05/29 return from bind(%d,%x,%d)=%x acceptsorry no struct file lib rights lib from sockargs:copyin from:%x to:%x len:%d @(#)i_usrreq.c 5.1 87/05/29 mm܀mmnnLn@nnȀoqq,q4q<q@qDqHn,qPqLuipc_usrreq(%x,LISTEN) uipc_usrreq:accept(%x,%x,%s) uipc_usrreq:shutdown(%x,%x) uipc 1uipc_usrreq:rcvd(%x,%x) uipc 2uipc_usrreq:send/dgram(%x,%x) uipc 3uipc_usrreq:send/stream(%x,%x,%x) uipc 4piusrreqIPUTIPUTunp_connect2unp_disconnectunp_externalizeunp_gcunp_gcscan @(#)sys_socket.c 5.2 87/10/26 @(#)acct.c 5.1 87/05/29 @(#)alloc.c 5.1 87/05/29 bad free countno spacebad blockout of inodesbad countno fs @(#)bitmasks.c 5.1 87/05/29 ???? @ @ @ @ @(#)blklist.c 5.2 87/07/22 ip->i_map == 0blklist.cindlvl >= 0blklist.cip->i_mapblklist.c @(#)exec.c 5.1 87/05/29 @(#)exit.c 5.1 87/05/29 @(#)fork.c 5.1 87/05/29 no procs @(#)grow.c 5.1 87/05/29 rp->r_pgsz+change >= 0grow.c @(#)ipc.c 5.1 87/05/29 @(#)lock.c 5.1 87/05/29 ( @(#)ptrace.c 5.1 87/05/29 tĀ   @(#)shm.c 5.1 87/05/29 shmat: prp>lHh @(#)sys1.c 5.1 87/05/29 @(#)sys2.c 5.1 87/05/29 @(#)sys3.c 5.2 87/08/07 "p˄˘ˬ؀@̄mountNMOUNT @(#)sys4.c 5.1 87/05/29 `ᘀЀ@x @(#)bsdcompat.c 5.2 87/09/01 selwakeup @(#)i_domain.c 5.1 87/05/29 @(#)i_mbuf.c 5.1 87/05/29 mbinitm_expand() = 1 m_expand() = 0 mgetm_get(%s):%x m_getclr: mbfree twice-- m_free(%x):%x m_more(%d,%s): failed mgetm_morem_more(%d,%s):%x m_freem(%x): NULL mbfree twice MBFREE(%x,%x)m_copy(%x,%d,%d): empty m_copym_copym_copymget MBGET(%x,%d,%s) %x nospace(%x) m_cat(%x,%x): joined(%x,%x) new(%x) m_adj(%x,%d) %x m_pullup(%x,%d): mgetbad %x (4@LXdlt|MT_FREEMT_DATAMT_HEADERMT_SOCKETMT_PCBMT_RTABLEMT_HTABLEMT_ATABLEMT_SONAMEMT_ZOMBIEMT_SOOPTSMT_FTABLEMT_12MT_13MT_14MT_15 @(#)i_proto.c 5.1 87/05/29  mHmHz~~zH֨,unix @(#)i_socket.c 5.1 87/05/29 socreate(%x,%x,%d,%d) solisten(%x,%d) sofree(%x) sofree dqsoclose(%x) soclose: NOFDREFsoabort(%x) soaccept(%x,%x) soaccept: !NOFDREFsoconnect(%x,%x) soconnect2(%x,%x) sodisconnect(%x,%x) sosend(%x,%x,%x,%x,%x)sosendmget!%x,%dsoreceive(%x,%x,%x,%x,%x) receivereceive 2receive 2areceive 3?%x,%d(%d)mbfree twicereceive 4mbfree twicesoshutdown(%x,%d) sorflush(%x) DDDDsosetopt(%x,%d,%d,%x) ````sogetopt(%x,%d,%d,%x) sohasoutofband(%x) @(#)i_socket2.c 5.1 87/05/29 soisconnecting(%x) soisconnected(%x) soisconnectedsoisdisconnecting(%x) soisdisconnected(%x) %x sonewconn(%x):bad soinsque(%x,%x,%x) soremque(%x,%x) socantsendmore(%x) socantrecvmore(%x) sbwait(%x) sbwakeup(%x) soreserve(%x,%d,%d): ok bad sbreserve(%x,%d) sbrelease(%x) sbappend(%x,%x) sbappendaddr(%x,%x,%x,%x) sbappendaddrsbflush(%x) sbflushsbflush 2sbdrop(%x,%d) sbdropmbfree twice @(#)hwdiag.c 5.1 87/05/29 ##Ā#̀#Ԁ#܀### @(#)iomachdep.c 5.2 87/08/31 adr=%d , status=%x board address=%d type=%d UNDEFINED unknown type bypassed (can't dma beyond 16Mb) not configured overflow max board = %d %s number=%d d_write returned error on dcb move @(#)me.c 5.1 87/05/29 meload: %s inexistant Chargement de %s sur SAS%d meload: %s ne contient pas du code 68000 MELOAD: textsize=%8x, datasize=%8x textstart=%8x, datastart=%8x, totalsize=%8x dcb0adr=%8x meload: typepdev=%2x%2x, etat=%4x meload: arret du co-processeur impossible meload: initialisation impossible meload: adresse de chargement inaccessible adrIM=%8x meload: typepdev=%2x%2x, textstart=%8x, adrue=%8x meload: erreur de lecture meload: erreur de lecture meload: mauvaise fin de chargement meload: mauvais lancement MEWAIT: type=%2x, pdev=%2x, finordre=%2x meload:(fin sur timeout) typepdev=%4x meload:(pas d'IT appel 2) typepdev=%4x, statbase=%8x meload: dcb0adr<>: old=%8x, new=%8x SASINTR: type=%2x, pdev=%2x, ioir=%8x, cr=%4x sasintr: type=%2x, pdev=%2x, apres IT etat=%4x sasintr: type=%2x, pdev=%2x, IT fantome ... /etc/emc/ @(#)mem.c 5.1 87/05/29 @(#)mt.c 5.1 87/05/29 not ready statusoffline statuswrite protected%s on mt %d mtcommand(%x, %x, %x) mtstrategy:blkno %d,nxrec %d,b_blkno %d density switch not on BOTdensity not availablemt %d : error blkno(%d) > nxrec(%d) LzLLLLLLLLzLLLL^LLLLLLLL^mtstart(blkno %d,nxrec %d,b_blkno %d) mtstart:b_active = %x end of tapemtstart:cmd(%x) mode(%x) addr(%x) bcnt(%x) QЀVVW Vspurious interruptmtintr:cmd(%x) mode(%x) ioir(%x) blkno(%d) nxrec(%d) unknown commandZZZXZtZmtioctl(%x, %x, %x ,%x) (8((8(((8( @(#)prof.c 5.1 87/05/29 @(#)pty.c 5.4 87/09/21 aƀab4abHbb`abp @(#)rawnet.c 5.3 87/10/19 rnetwrite: out of mbufs rnetwrite: out of bigbufs @(#)smd.c 5.1 87/05/29 no vtoc areabad block list too longinvalid partitionSMD d_write errorSMD disc error}Ҁ}Ҁ}Ҁ}؀}؀}܀}܀}܀}܀}܀}܀}܀}}}SMD d_read errorSMD d_read errorSMD d_read errorSMD d_read errorSMD d_read errorSMD d_read errorSMD d_write error%s on disk %d `dp|搀椀洀ĀԀ,< Off Line Timeout Equipment Fault Write lock error Tranfer error Data overrun Sync. error header error CRC error in header Data check Seek failure Unknown drive type Unknown error Illegal param. in DCB order @(#)smlog.c 5.1 87/05/29 SYSTEM MESSAGE LOGGING OVERFLOW @(#)sxt.c 5.1 87/05/29  TTT$hh`<Ā  D܀v$vvH|vvvvsxt cannot allocate link buffers @(#)sys.c 5.1 87/05/29 @(#)tt1.c 5.1 87/05/29 Flush(%x) ؀P({)}!|^~'`\\ @(#)tty.c 5.1 87/05/29 ,2ĀԀ((<<PPPPP<<<<<<xx|`{}~ABCDEFGHIJKLMNOPQRSTUVWXYZ @(#)tv.c 5.1 87/05/29 014B DF@(#)wbal.c 5.2 87/09/21CIO %d PROM Rev: %x CIO %d CODE Rev: %x CIO %d PCA Conf: %x CIO %d :Error - Board Firmware version must be %x or greater. WBCIO: error wbreset %x %x %d Π|ϸԀĀΰ؀x WBCIO: error wbflush %d WBCIO: error wbflush %d CIOerwrit hd!=tl %x %x %x WBCIO: error wbsendxoff %d WBCIO: error wbsendxoff %d WBCIO: error wbsendxon %d WBCIO: error wbsendxon %d WBCIO: error wbsetbrk %d WBCIO: error wbparam %d %x WBCIO: error WBCtest0 %xWBCIO: error WBCtest1WBCIO: error wbresetbrk %d WBCIO: error wbmodem &d WBCIO: error wbmodem &d 鄀销Ȁ餀ȀȀȀ鴀ȀȀȀȀȀȀȀĀ낀뜀씀봀씀XCIOerit case= %x CIOstit case= %x WBCIO: error wbintr &d O.S. messages -- OFF O.S. messages -- ON  2Kn,X `%K @(#)wbct.c 5.6 87/10/15 cartridge not loadeddensity switch not on BOTcartridge write protected4T̀(tЀend of read tape_mark timeout on ct %d end of skip block timeout on ct %d end of skip end of data timeout on ct %d end of write tape_mark timeout on ct %d end of rewind timeout on ct %d end of erase timeout on ct %d end of retention timeout on ct %d end of load timeout on ct %d end of unload timeout on ct %d end of test_ready timeout on ct %d end of inquiry timeout on ct %d end of mode-select timeout on ct %d end of mode-sense timeout on ct %d end of prevent_removal timeout on ct %d end of allow-removal timeout on ct %d end of request-sense timeout on ct %d end of read block timeout on ct %d end of write block timeout on ct %d end of write raw timeout on ct %d end of read raw timeout on ct %d ,hĀ<؀ (  Xvvv Pvvvvvv vvvvv End of cartridge on ct %d End of cartridge on ct %d d_write failed on Start IO Order on ct %d %s on ct %d p t ܀ #l`,8` n n n n n n  n%&f&f&f&f&f#&f%&f&f&f&f&f#End of cartridge on ct %d End of cartridge on ct %d End of cartridge on ct %d End of cartridge on ct %d File mark detected on ct %d End of cartridge on ct %d Illegal request on ct %d End of cartridge on ct %d Illegal request on ct %d End of cartridge on ct %d End of cartridge on ct %d End of cartridge on ct %d Illegal request on ct %d End of cartridge on ct %d Illegal request on ct %d End of cartridge on ct %d End of cartridge on ct %d End of cartridge on ct %d )))))))@(#)wblp.c 5.6 87/11/111H10@2/^/LP: *** Error - LP Order = %x after interrupt. (Should be 0) LP: *** Error - Return status byte = %x after interrupt. LP: *** Error - StartDMA called while DMA in progressLP: *** Error - About to start DMA, but LP Order is not 0. Order = %x 77h999978\9 @(#)clist.c 5.1 87/05/29 @(#)partab.c 5.1 87/05/29  @(#)kdbn.c 5.1 87/05/29 %s %x temporary %x permanent %x perm %s pid = %d %2x%8x: R%dW$W(W,W0W4WLW`WWW%8x, %s %8x: %2x%2x%2x%2x%2x%2x %3u %s %d R%2d: %8x SR%2d: %8x %8x : %2x = g4ffLf@eeĀePe<e8e$ddgggggggggЀggggggggR2 : %2d Addr2 : %8x Mode : %s %s PC : %8x pid = %d %s %s Address : %8x pid = %d 0123456789ABCDEF Ѐ  P   0 p    X  ̀  D |    X   , < P ` p | ̀ Ȁ Ā Ѐ ܀ ?? LOAD , LOADB , LOADH , LOADD , LADDR , STORE , STOREB , STOREH , STORED ,  $ 0 < H T ` l x               , 8 D P \ h t               ( 4 @ L X d p |               $ 0 < H T ` l x                , 8 D P \ h t               ( 4 @ L X d p |   xxhhxxhh((88HHXX((88HHXX((88HHXX((88HHXX     0 \    ( H l     BCDEGHKMSTL      , @ P ` p     Ѐ    \   Ā    , list of commands (all numbers in hexadecimal): ---------------------------------------------- b [address] - set breakpoint (Phys. Addr.), or list all breakpoints bv [address] - set breakpoint (Virt. Addr.), or list all breakpoints bt address - set TEMPORARY breakpoint (Phys. Addr.) btv address - set TEMPORARY breakpoint (Virt. Addr.) ca - clear all breakpoints cb [address] - clear breakpoint (physical addresses) cv [address] - clear breakpoint (virtual addresses) d address [count] - display data (physical addresses) dc address [count] - display code (physical addresses) dcv address [count] - display code (virtual addresses) dd dev unit part - dump memory on disk (dev, unit) , partition(part) dr - display registers dv address [count] - display data (virtual addresses) e - exit debugger g - go to the end of current function k - kill current process or go to Panic load - used to reboot from disk (dev, unit) m address - modify sequential data bytes s - single step t address [segno] - virtual to physical address translation Integer Overflow Integer Zero Divide Real Overflow Real Underflow Real Zero Divide Inexact Result Before Trap USER PRIVILEGEDKERNEL DEBUG ELOGR ELOGW TWRITEC TWRITED FLUSH TRAPEXIT ITEST REGN REGNB VERSION MAINT MOVE , NEG , ADD , SUB , MPY , DIV , REM , NOT , OR , XOR , AND , CBIT , SBIT , TBIT , CHK , NOP MOVEI , ADDI , SUBI , MPYI , NOTI , ANDI , CHKI , FIXT , FIXR , RNEG , RADD , RSUB , RMPY , RDIV , MAKERD , LCOMP , FLOAT , RCOMP , EADD , ESUB , EMPY , EDIV , DFIXT , DFIXR , DRNEG , DRADD , DRSUB , DRMPY , DRDIV , MAKEDR , DCOMP , DFLOAT , DRCOMP , TRAP SUS , LUS , RUM , LDREGS , TRANS , DIRT , MOVESR , MOVERS , MAINT , READ , WRITE , TEST > TEST < TEST = CALLR , TEST > TEST < TEST = RET , TEST <=TEST >=TEST !=KCALL TEST <=TEST >=TEST !=LSL , LSR , ASL , ASR , DLSL , DLSR , CSL , SEB , LSLI , LSRI , ASLI , ASRI , DLSLI , DLSRI , CSLI , SEH , BR > BR = CALL BR > BR < BR = LOOP , BR <=BR !=BR BR <=BR >=BR !=BR > BR = CALL BR > BR < BR = LOOP , BR <=BR !=BR BR <=BR >=BR != Debugger Call Invalid KCALL %d Data Alignement Error Address : %8x Illegal Instruction Opcode : %2x R1 : %2d Parity Error Code Fetch Address : %8x Parity Error Execute Address : %8x Page Fault Segment : %4x Address : %8x Kernel Violation Opcode : %2x R1 : %2d R2 : %2d Check Trap R1 : %2d R2 : %2d Invalid Trap # : %d External Interrupt Device # : %x Switch 0 Interrupt Powerfail Warning End Power Glitch Timer 1 Interrupt Timer 2 Interrupt Reserved Vector Exception Virtual PhysicalStep Break-Pointdump OK invalid partition no VTOC area invalid device invalid unit expected count expected address breakpoint table is full KDB> invalid text address invalid virtual address invalid text virtual address invalid command internal error, attempt to set afterpermbreak break twice internal error, can't find AFTERBRANCH breakpoint expected segment number pc break type %x is not an even address no breakpoint set at %x physical address = %x d_write error = %x IO error %x ooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooppp p,p8pDpPp\phptppp @(#)if.c 5.1 87/05/29 2 @(#)raw_usrreq.c 5.1 87/05/29 lȀPȀ\ȀȀȀЀraw_usrreq @(#)route.c 5.1 87/05/29 rtfree @(#)af.c 5.1 87/05/29  @(#)raw_cb.c 5.2 87/09/01 @(#)if_loop.c 5.1 87/05/29 lolo%d: can't handle af%d @(#)in.c 5.1 87/05/29 @(#)in_proto.c 5.1 87/05/29  1P 0p 1L T@ lԨ؀h`(~internet @(#)ip_icmp.c 5.1 87/05/29 icmp_error@Ā,Ѐ @(#)ip_input.c 5.2 87/09/01 ip_initforward: src %x dst %x ttl %x 2 @(#)ip_output.c 5.1 87/05/29 @(#)raw_ip.c 5.1 87/05/29  @(#)tcp_debug.c 5.1 87/05/29 vvBv %s>,URG,,RST,FIN,ACK,SYN<%x%s %x %s:???????? [%x..%x)@%x, urp=%x%s%s%s%s%s%s%s%s%s%sPUSH%s%s<%s> -> %s rcv_(nxt,wnd,up) (%x,%x,%x) snd_(una,nxt,max) (%x,%x,%x) snd_(wl1,wl2,wnd) (%x,%x,%x) 5 5 5 5 5 5( 50 5< 5H 5P 5X 5` 5h 5p 5x 5 5 5 5 5 5 5Ȁ 5Ԁ 5܀ 5 5 5 6 6 6 6( 64 6@ 6L 6T 6\ 6d 6l 6t 6| 6 6ATTACHDETACHBINDLISTENCONNECTACCEPTDISCONNECTSHUTDOWNRCVDSENDABORTCONTROLSENSERCVOOBSENDOOBSOCKADDRPEERADDRCONNECT2FASTTIMOSLOWTIMOPROTORCVPROTOSENDCLOSEDLISTENSYN_SENTSYN_RCVDESTABLISHEDCLOSE_WAITFIN_WAIT_1CLOSINGLAST_ACKFIN_WAIT_2TIME_WAITREXMTPERSISTKEEP2MSLinputoutputuserresponddrop @(#)tcp_input.c 5.3 87/09/01 000Šր(H<**l4ll@dtcp sum: src %x tcp off: src %x off %d tcp_pulloutofband @(#)tcp_output.c 5.3 87/09/18 mgettcp_outputtcp_output REXMT @(#)tcp_subr.c 5.2 87/09/01 ڤڜڨڨڠڨڤڤin_cksum: out of data @(#)tcp_timer.c 5.2 87/07/28 Ԁ̀???33?ٙ@@@@AAB @(#)tcp_usrreq.c 5.1 87/05/29 >᐀ḀЀ⸀⨀ ,dx ㈀܀@P⠀x`tcp_usrreqFFF\\h @(#)udp_usrreq.c 5.1 87/05/29 錀鄀鐀鐀鈀鐀錀錀밀 T\쀀f쌀Xdff8HLffffudp_usrreq @(#)in_pcb.c 5.2 87/09/01 @(#)wonder.c 5.1 87/05/29 @(#)wonder.h 5.1 87/05/29 @(#)lance.h 5.1 87/05/29 wbnetwork interface down network interface down network interface down ethernet initialized wbet%x: can't handle af%x resetting interface LANCE has been stopped removing interface LANCE has been stopped excessive retries on transmission, TDR value = %x Ā̀Ԁ Reading from CIO: IOAddr = %x; error = lt| Writing to CIO: IOAddr = %x; IOData = %x; error = IO time outIO data not validIO time out and IO data not validunknown error: %xbad command = %d, err = %x bad checksum in address PAL; command = %x, err = %x invalid error or command returned; cmd = %x, err = %x could not read physical address could not write initialization block could not write recv descriptor ring could not write xmit descriptor ring could not write LANCE registers could not write LANCE registers; err = %d error waiting for Init Done interrupt, err = %d could not write start command in CSR0; err = %d GetXmitBuf: ran out of xmit buffers All receive buffers used by one packet! '6'H'x'X'x'x'x'hself test error: LANCE register testlocal memory testshared memory testLANCE initialization testunknown self test error, error = %x cannot enable CIO ethernet command interrupts %d could not write CSR0; err = %d cannot enable CIO LANCE interrupts %d %x paquets veroles @(#)mapa.c 5.1 87/05/29 @(#)if_ether.c 5.1 87/05/29 duplicate IP address!! sent from ethernet address: %x %x %x %x %x %x .text 0.data@0 .bss @.text!0x.datap ".bss @.text!.data8.bss @.text!@,.data@.bss @.text&(.data8.bss @.text(8.data8.bss @.text)HX.data8.bss @.text*X .data8.bss @.text,(.data8.bss @.text- .dataP.bss @.text- .data`.bss @.text<.datah8.bss @.text@ .data .bss @.textAb.data .bss @.textIP@.data.bss @.textWd.data8.bss @.text^HW.data%.bss @.textn  .data.bss @.textz.data.bss @.textp .dataX@.bss @.text`Q.dataX.bss @.textP.datah.bss @.text8.dataX.bss @.text D.data0 .bss @.text8 .dataPH.bss @.textk.data .bss @.text.data.bss @.text `.data.bss @.text8.dataH.bss @.text.data .bss @.text..data.bss @.textp .data( .bss @.textu.dataH .bss @.text#.datah(.bss @.text`0'.dataP.bss @.text .dataP .bss @.textx 2.data0.bss @.text"A.data(.bss @.text&.datap.bss @.text.p5.dataP .bss @.text3 `F.datap`.bss @.text<%.data .bss @.text>@.data .bss @.text@.data@.bss @.text@X#.dataPX .bss @.textC0A.dataŨ8.bss @.textG0.data.bss @H.textLx$.datap8.bss A.textPxH.dataƨ.bss A.textV.dataX .bss A.textXH.datax.bss A.textm@@t.data.bss A.text{.data .bss A.text~hY.data .bss A.texthQ.data(x.bss A`.textH.dataΠ.bss Ax.textH.dataHp.bss Ax.text .dataи .bss Ax.textI.data .bss Ax.text0i.data0.bss Ax.text@.data(@.bss A.text8 .datah.bss A.textX2.dataр8.bss A.text`@.dataѸ .bss A.text.dataHP .bss A.text 8 .dataҘ .bss A.textX p.dataҸ .bss A.textH.dataP.bss A.textx_.data(@.bss A.text.datah0.bss A.textx.dataӘ .bss A.textx.dataӸ.bss A.text.dataֈ .bss A.text.dataP .bss A.textH a.data.bss A.text#H.data@.bss A.text%N.dataX.bss A.text).dataX.bss A.text.data /(.bss A.text(.data /0.bss A.text.data / .bss A.textPX.data /H.bss A.text.data 0 .bss A.textx.data 08(.bss A.textxPB.data 1`.bss A.textP.data 2.bss A.textx.data 2 .bss A.text .data 2H.bss A.textPD.data 2/.bss A.textHr.data 6.bss A.text(x".data 7h.bss A.textԠ8.data 7@.bss A.text.data 80.bss A.text.data 8Hh.bss A.text 5.data 8.bss A.textA.data 9X.bss A.text(.data : .bss A.text7.data :8.bss A.text-.data @0 .bss B .text.P.data @P.bss B .text/0`.data @P.bss B .text/0.data @P.bss B .text/.data @P.bss B .text4p ;.data @Px.bss B _start _ccbsyscall!ispstend8)_clrmemLpp_bootdevp_rootdevp_pipedevp'k1&< B(FrF_main_uRP_proc0_u`intstackP_ftbitsp \pjpvp_putchar!8_getchar!X!x,!!_acctbuf B_acctp B_cfree B̀ {_pbuf {P׀ _hbuf _file _inode _proc (_sptmapp`_callout (_mount2(_err`_sysinfo3h_syswait4_syserr4_minfo48_v_pregpp_region4p_ractivep_rfree_phead_pfdat_phash_ptfree_tune_swaptab8 %_inoinitz h_cinit-_binit8_errinitA_finit^ _iinit __socinit~(_smdctab_smdutab_smdbuf_smditab_smdstat_wbcttab(*86(@_ctstatJ_wb_alT_(_mtbuf(_mttab_mtcmd(_mtstath_vmtbuf(_ctrbsy(_sxt_cnth_msgmap0_msgqueP_msglock_msgh_msginfop_sema_sem _semmap!k2(_semuB(_semtmpMh_seminfouR(_shmem(_shminfo_mbutlX`_mbstat_mbfree_mclfree_mbmap_floxh_maxpmem_pt_tty00_bdevsw_smdopeno8qst̀_mtopenA _mtcloseC׀F_mtprintE$<<_cdevsw0˰&80̄;_syopenX_nulldev@_syread_sywrite_syioctl0_mmreadP_mmioctl@\_smdreadFhP$_prfread[@Z[d\_nodev@n'x( (*,4,- 6_mtreadW_mtwriteXT_mtioctlYP_sxtopenÀ_sxtread|̀׀d_ptsopen^^_ptsread_8`j@_ptcopencc_ptcreadd fPh_smopen_smclose _smread<,'k1l<l(Fm@Qn_bdevcnt`_cdevcnth_confswp_smdintr{\fpz48_mtintrO0_dblev _ciotype(_confcnt8@p)H\̀X׀X_dstflag`_swplo0_utsnameh_lineswx_ttopen_ttcloseh_ttread_ttwrite$_ttioctl_ttin_ttoutx_sxtint_sxtout,_tvopen_tvclosed_tvioctl_tvinŸ_linecnt_termsw_termcnt!alltraps#zXsyscall!!_syscall>Xkcall"_i_kcalloXalign",_i_aligno"@_i_instroXfparity"T pXeparity"hpXkerviol"|_i_pviolp,Xcheck"_i_checkp8Xtrap"_i_trappD "Xswtch0"_i_sw0p\Xpwroff"_i_pwfphXpwron# _i_pwonptXclock# Xcl100#L_tictac1Xcallout#TXres#h_i_resp_trapPtrap_ret$__debug0+_clock<54_runrun5_idle&_spl0+A&dK&fXpage&U&_rbsave`_old_ps_pfaultIX_vfaultKk(w):bad_addr):_fubyte(_subyte( _fuword(4_fuiword(4_suword(P_suiword(p_copyin(_copyout(*_addupc*_spl1+0_spl4+0_spl5+|_spl6+|_spl7+|_splhi+|_splx++,x,,ǀ,р,ۀ,_icode,_szicode-ispstack8_bread-(_getblk2_iowait6X_breada-_incore2$_brelse1_bwrite/_bdwrite0h_lbolt8_bawrite0_wakeup$_panicנ_sleep"_geteblk5(_iodone6_clrbuf7L_bzero/_bflush7_binval8_maxmem@_debug@_sbufHP_ksctX_kbase`_bdflush; h_timeinND_prfstatp_prfintr]tx_curpri|_lticks~_time_freemem_psignal*_vhandn(4_runin@_print_setlevAD_suser\_mfreeLA_malloc@VB_geterecC_puterecC`DX_logtchgEjF_blkacty_fmtberrFdtG_logberrH~I_findreg8_reglockP/0_pfree_premove\_swfree150_regrele/\U0_pfindX_assfail_ptfill_pinsert_swap@_prdev0V_bcopy0*_getfW_closefWˀm_unp_gcxx׀}_plock_closep_iput~D_setjmp._prelex_openiZH_openp_access[L_getfs_xreleF4_owner\8_uchar_namei_ufalloc]_falloc]T_provflH_findfid^P_fids^_frfid_freefid_4_frlock_insflck`_delflcka_regflckb_flckadjcL_blockedg_getflckh_convoffl_setflckjm\ _max/_printfo#p.r8v_swpinc6_memfreexC_swalloc3M_uaccess_uservadX_hinode_igetzc_iread|_itrunc_ifree_iupdatL_itrunc2o_bmap. _s5tloopD_free_maknodeD_iallocl_wdir_writei_iflush,_readiz$l_clkset|_stat1d_sendsig_grow\_bcmpl_setregs_edata @_chksize_maxumem_physmem_meminit_ksv_sz _pall(ǀ0_userpte8_mmvad@_mmpteH_curprocP_msginit_seminit_startup-h_rootdirX_meload)_devinit(_newprocՀ߀@_growreg_schedh_maxupts`_masktab_iomove _pcopyin_schar_passcD_cpass_msgconv@_msgctl$_msgfree`@_msgfph_msgget4_ipcget_msgp_msgrcv_msgsnd_msgsys_sptfill\_min/_stfill\_sptfree|_flush/$_maxfreex_ipflush_pmount_runout|_swtch=  _pgtmap%_pgtfreed_setmask_nptfree/ż:F@PƐ_physioʸ_useraccx_physckX_pipe_printc֠_pr_time_printnT_pr_hour_timelapG_pr_dst_smwrite_update_smdsyncx_prcomب_reginit_freereg\hPs$_dupregD_swpuse58_loadreg_uclear_mapregPP_chgprot_setrq%$ _swapout _semaoe _semfup_semunp_semconv\_semctl_semunrm_semexitD_semget_semop_semundod_semsys_signal_setrun%_issigL_fsig!_psig p_stoph_core!_exit_hsque_longjmp/_runqˀ&_end_etext<ր,d_p0init)H _pfhead _allocp<F_swapadd6_swapdel8<_getswap9_swaprem9@_unswap; _qswtch<_save.P _resume._nsysentH_sysent0_nosys@_nullsys@_rexitT_fork_read`_write_open$_close_wait_creatX_link\_unlinkX_exec(_chdir_gtime_mknod_chmod_chown_sbreak_statH_seekP_getpidD_smount_sumount|_setuidh_getuidٰ_stime _ptrace_alarm_fstat_pause_utimeH_stty_gtty_saccess_nice_sync۸_killx_setpgrpl_dupȰ_times0_profil_lock`_setgid_getgid _ssigp_sysacct~p_shmsys_ioctl_utssysV"_exece_umask_chroot_fcntl_ulimit@_geteuid_getegid_ftime0_reboot\_socketXP,_6cx_connect\p_bindY@g_listenY_acceptZLg<V]bjob_sendto_l_recvmsgc_sendmsg`DyihlAɘ<ǀ@ԀAP$_xallocC8_xumountE<_xuntextGJK _timeoutL_timeid  M$_delayO_mapa-_strayV _getsockl "lD_sobind_m_freem| ,< 6_m_get A K$ V_sofree_sendit`_sosend_recvitd b  m y_m_free8   mH q r r ƀs Ӏu u  v  w + 7  E Ov Y h wT  P_m_copy  v_ufavail {T ̀  ׀ _sbwaitx { z\_soo_rw{ |_ifioctlv@_rtioctl }_soclose_mbinit_ifinitr _acct $ ! _sbittabH_cbittab_bldindr_gethead +_shmexecD_punlock_get410_execreg (_pexitD_shmexitP_shmfork\_procdup 5l @D J T_tunlock_dunlockx_procxmt$_ipc P ^_ipcreg i_shmconv_shmctl_shmdtH_shmgeth_rdwr_sorwuio_copen_mgetdev@ t#_chdirecP _uiomove T_domains ` 0 0X  l Ā Ѐ ݀   _m_moreX_m_cat_m_adj _unixsw֨ z ~ +~ 7z AX L_soabort8 V, d( s P  h _sbflush! _sbdrop! #P_d_read4D_cfdebugP ˀ(X Հ/_d_write4P_ctladdr),_medma h x_nomfic_nomdir_gethdr1_metrace :$_dcb0adr_dcb0 8l_mewait3X 8 : 5_metoid_meflag_merev; !;t +;_sasintr5 59( ?9 JET_mtwaitX_mtdebug_mtstartJ<_k_tab_C_tab_c_tab_d_unit_mt_cnt_prfmax_prfsym"(_prfctrB(_ttinit< Uk `b_getcbp>_getc;P_ptsproc` kal_ttrstrt u_ttlowatH f_putcbp?_putc< _ttiocom_putcf=L_getcb=  b0 n o( q ŀv_smdbbu π{( ڀ _sm_rpt b8_sm_wpt j8 X_sxtfreeHl_sxtbufj_sxtbusyj_sxtinit_sycheck_canon<_tthiwat_getcf<_ttxput_putcb>(_tttimeo_partab_ttywait_ttnulqj_ttcchar_canonbj_maptab_tv_blkh_tv_fdxp&80k:kEOl\l gl(t_StartWB|_ttchar00x_wbmodemĀ4Ѐ8_wbalclrۀ_BAUD@ @l,_wbctptrl0(n03@_ctdensL WHf_wbctclrt_wbcterr'p(pznPnp:/,5D_wblpclr9nx_deblank@A_blancl_newlineld_numberA_BASE _exprC̀DڀEdnrLFDF"GP_kdb_dlgl1HCI`SJ_K_defmodeqkqur*LqN(m4_strphs H_strvrt @O8_kdb_wrtl΀OހPHqqQ_v_countq qq_d_countq_dumpmemRP!rL,q6S_vdumpTBUD_doregUMV8_codass_SubopXYlZ|[_exitcmd[q_kdb_goq\rT\_recon]_majdcb]_dcbq_itestr\_loadcmd^_KDBdlg `rl_dumpcmd`(_cic_KDBcmd 0_load_hlpHʀh_strhdr _strknm׀ix_restartr_kdbflag *_strstp P_strbkp X_KDBwrt m`n_casehs_loadb(_loadh8_loaddH_laddrX_storeh_storebx_storeh_stored @ H ( *2 * @ *_i_pagep _i_intpPMpWp_kdb_ccb * _ifnetr a .ltyrss /Ht8td_if_downt_ifunitud_ifconfy(_ipintrqr(ƀr@_rpintrqrX_rawcbrp_rawintr|Ѐ܀T_rtfreeP_rtallocX_rthostr_rtnetr_rtstatrs_rttrashs_rtinit &41<KV_loifs e_loioctl r| _ipstats_ipqs_ip_ids_inetsw 0p _ip_initɀԀT@lԨ'5hC`NY(eqs{Ptx_iptimed 2H_ifinetux_ipintr_ipcksum 2PT_ipaddr 2X€΀$؀_ip_deql_ip_enqHl 2h_tcbu(_udbu3 2> 2L_ripdst 2X 2_ripsrc 2bXmuwu 4_tanames 4 4H 4_tcp_issx_tcpstat 4Ȁ 7Ҁ 7xހ4d$L6ؘ@ʌK$Vބh{ 8x0 7  7̀0ڀޤ 8 8!x1H= L[ k{ 9H 9P_udpstat :_udp_in :ɀӀ8ހpL._WB_Init&C4xN5Ydn @(y_WBWrite,|ŀ8_WB_Read(π _WBReadp܀H!6 2P=XGVdw|_SleepOK`$HHpʀh_Statsx؀|`,;JT_jxp08ȀTـ \(#!0-$?%O @c @ m8_copyseg/0y/\_udiv/udiv/_urem/urem/4X_arpcom@4H_arptabP;_arptnew;_btext _bdata@_bbss @_sizememory__last_addr_mcversion_kdb_init_vadrspace_sys_sect_call_debug_fdlp_dcb_ftPageTables_ftHeadwall_machineid_cio_putchar_cio_getchar_breakchar_cio_breakchar_x25_attach_iomd_intr_bfreelist_pfreelist_phashmask_nextswap_swapwant_init_tbl_iomachdep_clkstart_flckinit_wbctcombuf_wbctrbuf_wbct_buf_wbal_tty_wblp_lpdt_wblp_lpbuf_sem_undo_shm_shmem_mclrefcnt_nmbclusters_flckinfo_flinotab_pt_ioctl_smdclose_smdstrategy_smdprint_mtstrategy_wbctopen_wbctclose_wbctstrategy_wbctprint_wbalopen_wbalclose_wbalread_wbalwrite_wbalioctl_smdwrite_smdioctl_prfwrite_prfioctl_wbctread_wbctwrite_wbctioctl_wblpopen_wblpclose_wblpread_wblpwrite_wblpioctl_sxtclose_sxtwrite_sxtioctl_ptsclose_ptswrite_ptsioctl_ptcclose_ptcwrite_ptcioctl_wbetopen_rnetopen_rnetclose_rnetread_rnetwrite_rnetioctl_wbetintr_wbetctrl_wbalintr_wblpintr_wbctintr_conf_devs_dev_init_wbalinit_wblpinit_wbctinit_wbetattach_loattach_timezone_sxtrwrite_xdbgcall_xsyscallXillinstr_i_dbpe_cf_i_dbpe_exXinterrupt_ext_intr_addupc_clk_kcall255_kcall254_call_rbug_idle_addr_copy_start_copy_end_headwallLight_searchdir__HeadwallDiag_HWLoadEnable_R32LoadEnable_HWSerCmd_ml_elogr_ml_elogw_sptalloc_bufstart_panicstr_switching_new_scheduler_slice_ticks_vhandcnt_bdflushcnt_slice_size_geteslot_freeslot_logstart_logstray_fmtraerr_logmemory_ptmemall_copypage_clearpage_pageincache_memreserve_killpage_cleanlocks_soo_close_ffreelist_allocfid_deadflck_sleeplcks_getpgslim_ageprocess_ageregion_getpages_swapchunk_pbremove_ublk_ptbl_ifreelist_freeblklst_s5itrunc2_HWGetDate_coredump_findpreg_HeadwallDiag_firstfree_allocator_pgtalloc_pgtallocator_allocreg_attachreg_pcopyout_ipcaccess_punmount_startup_pgtalloc_ptmalloc_kpgtfree_getcpages_nptalloced_freepage_contmemall_nullregion_chkattach_nullpregion_loadstbl_detachreg_rptexpand_chkgrowth_bldblklst_lockedreg_freeproc_next_page_mktables_ublk_sgtbl_p0init_done_cfreelist_swapfind_swapclup_lastproc_swapfunc_socksend_sockrecv_setsockopt_shutdown_socketpair_getpeername_recvfrom_getsockname_getsockopt_setreuid_setregid_sysmachdep_truncate_ftruncate_traptoround_roundtotrap_HWClockCommand_timetoYMDHMS_YMDHMStotime_untimeout_socreate_sockargs_solisten_soqremque_soaccept_soconnect_soconnect2_soreceive_soshutdown_sosetopt_sogetopt_m_getclr_uipc_usrreq_unp_attach_unp_detach_unp_bind_unp_connect_unp_connect2_unp_disconnect_socantsendmore_unp_usrclosed_sbwakeup_unp_internalize_sun_noname_sbappendaddr_sbappend_unp_drop_unp_sendspace_unp_recvspace_soreserve_soisdisconnected_sonewconn_soisconnected_unp_externalize_unp_discard_unp_gcing_unp_defer_unp_mark_unp_scan_soo_ioctl_soo_stat_domaininit_compress_badblock_getxfile_makechild_textlock_datalock_proclock_dirtypage_shmattach_HWSetDate_procfind_selwakeup_unixdomain_inetdomain_pffasttimo_pfslowtimo_pffindtype_pffindproto_pfctlinput_m_clalloc_m_pgfree_m_expand_m_pullup_raw_input_raw_ctlinput_raw_usrreq_raw_init_sbrelease_sorflush_sodisconnect_socantrcvmore_sohasoutofband_soisconnecting_soqinsque_soisdisconnecting_sbreserve_GetHWSwitches_move_dcb_dcb_write_medmaptr_readlong_readshort_writeshort_writelong_metimeout_readstat_writecom_readbyte_writebyte_mtcommand_no_t_proc_ptcwakeup_tptsproc_ttyflush_tptcwrite_wbetoutput_localAddress_rawinput_rawbuffer_smdcommand_smdstart_smd_write_smd_strer_sys_mess_linkTable_sxtnullproc_sxtvtproc_sxtlinit_sxtalloc_wbalunit_wbal_cnt_wbal_addr_wb_reset_PROMVersion_PCAConfig_CODEVersion_WBCommand_intrpInterval_wbalproc_wbalparam_WBCtest1_WBCtest0_WBWriteChar_wbresetbrk_diag_cons_WBSetStartStop_WBGetStartStop_timeInterval_wbal_cons_KEYBOARD_wbct_cnt_wbct_addr_wbctcommand_wbcttimout_wbctstart_wbctrstrategy_wbctimex_wbctphys_wblp_addr_wblp_cnt_testOffline_wblpoutput_wblpstart_CodeVersion_kdb_getline_instrucinfo_breakpoints_breaktable_txt_translate_findbreaktableentry_findbreak_addbreakpoint_deletebreakpoint_handleaddbreak_readtarget_singlestep_stepmode_pcb_access_handledeletebreak_numbreaksset_displaybreaktable_kdb_printf_setbreakcmd_clearallbreaks_clearbreakcmd_break_pc_break_type_vdumpmem_v_offset_d_offset_translate_modeflag_displaycmd_transaddr_dispinstr_displayinstruction_displaycodecmd_displayregscmd_cons_diag_modifycmd_kdb_flush_singlestepcmd_start_loader_writeheader_exception_modestring_kdb_print_kdb_printn_save_reg0_default_pcb_debug_pcb_user_pcb_user_default_kdb_default_i_timer1_i_timer2_ifqmaxlen_if_slowtimo_if_attach_if_ifwithaddr_if_ifwithnet_afswitch_if_ifonnetof_if_ifwithaf_rawintrq_raw_attach_raw_detach_raw_connaddr_raw_bind_raw_disconnect_wildcard_rtredirect_rtrequest_null_hash_null_netmatch_inet_hash_inet_netmatch_if_makeaddr_looutput_if_rtinit_in_netof_in_lnaof_ip_output_ip_slowtimo_ip_drain_icmp_input_udp_input_udp_ctlinput_udp_usrreq_udp_init_tcp_input_tcp_ctlinput_tcp_usrreq_tcp_init_tcp_fasttimo_tcp_slowtimo_tcp_drain_rip_input_rip_output_icmp_error_icmpstat_icmp_reflect_in_cksum_ip_protox_icmp_send_ipqmaxlen_ip_dooptions_ip_forward_ip_reass_ip_freef_ip_stripoptions_ip_ctlinput_inetctlerrmap_tcp_abort_in_pcbnotify_udp_abort_ipprintfs_ipforwarding_ip_optcopy_ripproto_tcp_trace_tcp_debx_tcp_debug_tcpstates_prurequests_tcptimers_tcp_alpha_tcp_beta_tcpconsdebug_tcpcksum_tcpprintfs_in_pcblookup_tcp_saveti_tcp_dooptions_in_pcbconnect_tcp_template_in_pcbdisconnect_tcp_drop_tcp_reass_tcp_close_tcp_canceltimers_tcp_pulloutofband_tcpnodelack_tcp_output_tcp_respond_tcp_outflags_tcp_setpersist_tcp_initopt_tcp_newtcpcb_in_pcbdetach_tcp_timers_tcpexprexmtbackoff_tcp_backoff_tcp_attach_tcp_disconnect_in_pcbbind_tcp_usrclosed_tcpsenderrors_in_setsockaddr_in_setpeeraddr_tcp_sendspace_tcp_recvspace_in_pcballoc_udpcksum_udp_output_zeroin_addr_SwapBits_arpmyaddr_wbetinit_wbetioctl_wbetreset_GetWonderBoard_WBDriverInited_AllocDescRings_disableWBInterrupts_arpattach_arpwhohas_wbsetaddr_wbetread_tcpipOpen_WBLength_RecvDescCopy_IORAMAddr_RecvQHead_WBOffset_copyLANCEBufToMbuf_arpinput_etherCBCopy_LANCEError_packetXmitted_F_Cpt_Init_InitStartCmds_arpresolve_copyMbufToLANCEBuf_XmitQHead_XmitBufs_TempXmitQHead_XmitDescCopy_RemoveWBInterface_wbshutdown_WriteWBCommand_RecvBufs_GetXmitBuf_FlushLANCEInterruptQ_XmitQTail_ReadXmitDesc_WBWriteIOErr_bad_Write_CmdTimeout_D_Cpt_Cmd_TO_ErrCmd_F_Cpt_Cmd_ReadRecvDesc_WriteRecvDesc_WriteXmitDesc_WBDevice_WBPresent_IOMapAddr_ReadRevCodes_RealRecvBufs_RealXmitBufs_diagCBCopy_ReadPhysicalAddr_SetLogicalAddrFilter_CreateInitBlock_InitBlockCopy_WriteInitBlock_InitDescRings_TO_ErrInit_StartTimeout_D_Cpt_Init_TestRecvBufValid_FindRecvPktEnd_etherbroadcastaddr_nbpkterr_TO_ErrXmit_clearseg_d_rwrite_arptimer_arpt_age_arptfree...1112131415161718191a1b1c1d1e1f102122232425262728292a2b2c2d2e2f203132333435363738393a3b3c3d3e3f304142434445464748494a4b4c4d4e4f40/* " @(#)unix.ld 5.1 87/05/29 " */ MEMORY { valid : org = 0x80042000 , len = 0x8000000 } SECTIONS { .text : { } GROUP ALIGN(0x1000) : { .data : { } .bss : { } } } .........p!*x(~  @.text   .data@@@.bss @Ȁ @~`qFFЋL@8 `opL p`ppt xppppJp@B B( FhD! Q2FFaFpAB QqBP[6 D F FptF`pABP֋ DPF FptF`pABP8ȓ88W8ȓ88W0 Г00WWW@G^QGUFP@GN8h(FrD OFFDFFBP[G$F8F`0FsAB@P\AM4@PHAM.@P4AM(@P AM @P AM@P AM@P AM @GSUڋAL@P@PAL@P|AL@PhAL@GCBPV@CB@P ALG7G0F |pRUWU~jfb‹ҋ.fGN8G G1$XG"G3$`G7#( h# FrG$$hGGphDFFD F LG&FnFBB#4+P[GF8AhFD!pFbFsABGNAGE8G740 PG$$hG&G7$p.Q!_LFrhDFFD !LFD@FnG FBPHP[LgHP*[PGD4tGG$2tj4P5VLPGD(FrhDFFD@FnFB#4*P6[LPGDBhFDBpFd8FFsL80AB@FCBP[P[G@FPFB FBWWUD! G/"FF> FnHF >(^0Ǿ8LB` P$[`ɀɠ WFW@G7*8G/! GSJGN80h(Fr F hGhGGp $LD JbFFDGFFnG#GQFB#4. >$$& !_BP [$G0t80Br@P.!PP. >$(zP[$W W# W # ܧW # LW0@BC0ABC(b@ AG@C@(A@:H@A(($0@A$$@A""  @A WW LnL pp 0 10p8 10pGǭ  ΀ΐ8 ΀ΐPUUUUI4TLtu`4v4ΐj`9CpLPUUUUdTLtW*&UTLtWd99dGۧ nɎɮ W^L W. hn`.d\q q.uL << >hBd HWP[G'# F|FqGF@_L!!BP[G'# F0FqF_LBP[G'# FFqGF@L!!fB<n~. 0@. 1BPP0P`rÆx"Rb^"Ȏ@@n~ǎW@L 8  WWWLW! ` 201L<TA@0L<A@R^Pp!%pWLWLW  [/etc/init$@8z~<33zjp p    q   W8833~<ǎ8@@WH8<@~Dzpz33zf    q   W8833 {0(zjz (h 0   q0 0W8833zҋ~Dǎ@Ǟ<Ǯ8HHW@8~<p33LJ zq   W<<3  3R: , ,YY Y~<ǎ8@@W8 33 84 0X88W8 {0( 88W8 ȧ~4p@   {a @   { {a  , . {p { q {* { p  { q { 7  {0 {0~488Wz@1~  p΀0z  p '.( zz  "'~ǎWH8H8<@~Dph 4. (    ( p 2!Ć444 `44 zz&zX#z3x3x4 z3|3|4 z33 "p3hpd3hh7Vz4z42 z " zz44< xgP( lxbN((@'2s(|558~z8~~z ~z2~5548 4<*4<4< (p (88Za((a < <p(e 3 333 3 333.$(-4vX~Dǎ@Ǟ<Ǯ8HHW@~<p.` *` z~<@@W0 Г " lh 00W@```&!UHhHl@@WH8<@~D' pfT 2 p0pps#$qp8~Dǎ@Ǟ<Ǯ8HHWH<@~Dpz  ps!S~Dǎ@Ǟ<HHW@8~<rb$d dhXhph`hpH(Hhb~<ǎ8@@W8 ȧ~4pxl lp`lpH(Hlda dh~488W@8~<p`pHh4hhphhhH(HhHl<ppgPh^0Qa1&! 0Rb1`&# :Td1@&' 4Xh1 ~<ǎ8@@W@~<p  q~<@@W@~<pqh~<@@W@48~<p((PǗ( ,F   gG zq0@z z p z    @x  z  z (" $$ *7LJ B,B10'~<ǎ8Ǟ4@@W@8~<pLJ(p,0X *'G ,DŽD! 7~<ǎ8@@W@~<p ,z ~<@@W@8~<q q~~<ǎ8@@WX@DHL~Pdq 0  sp`` ? sp s p0? pp а|dFǐ T4T4Tq @p  @pxx  zhxd 4X4XT  T!0d  x/x! !Txx0  (1hg^T3Qa1J4\4\ mx    <d||~PǎLǞHǮDǾ@XXWPHLPTX\~`(  dq 0  sp ` ? sp s  s p` ? p ta   P4@P|4@^pdZp h* d^pP|q!0@=p0@#p" x$/(r(jp""W"4D4D !0a:* d^pP|F xxx        +&4L4L0 oj"0 ! ~ +†04L4L0 ! B.= c!pz3z -pQ^l4Ýpzz-p)p"l xx xhP0 p ^dkx |ǞxVH>hax^|  V^|X^|tnl(8,ndl$xx et00L O0  -zzz"  (0bn^ P^^xQ4H4HhP zUQ^tPFQz2nxx  !! et ,1wbzǮt^. xx     b0  Ҹ  t},P^4P4P P^^zUz^P^:xx   !! d^tQ^^Pz^^z  Ǹ^ z  ^` p\n[P^xx `p ΠY^<  0 Ln,N ^ z^z^T^R^zTݠ Z :d^pP|h^nV^Z^%$.0n^V^P^^P^x.]n V^Pn%&e  xx     b0  |ti8 d^pP|4d d^pP|~`ǎ\ǞXǮTǾPLHWP@DH~L `pPz ) *`b     Vΐz jgzR z ( ! xx !  ~LǎHǞDǮ@PPWPD~HqnLW3Qa1 xx     b0   1\Dg^L3Qa1~HǎDPPW@p YWP?8<@DH~Lpp *gz((zzz  H z> 00%Ypؓ"z&øz +pj T ! `!F q ב4: q  בx%0p :z('$z  p(ؓx`\0 2("zzH (z ݨz  Wz ޔyvz  W$.~LǎHǞDǮ@Ǿ<8PPW@0!~<&Czp @A  A `AHqh( ~̎ pz0 010WJq `(4z7 0@WuċY~<@@W@8~<pfz,Yz  z YVZ FZs\ s   Y~<ǎ8@@W@~<>Mp VZZ"z+YY !~<@@WZH HYWp &l$@YW@8~<q z4{44Y>pzq ~<ǎ8@@W 2 2 0p (W0@ z36zz$ " W 00t  0 0W zr      W@8~<pހhNqԀp ܋R ( q Ѐ~<ǎ8@@W ~pp gZ*' l%# D%! ?Qa1`&! 7Rb1@&# 3Td1 &' 1Xh1d z "  pypx~ǎǞǮ W8  ~4q  p&pp~488W@10 - %v  (2       Wp@DHLPT~Xrz lǺd  z-lhpWVzz NJ &zz  vNJ zzNJ zz n\Z*' ^%# >%! ?Qa1\7Rb1D3Td1,&' 1Xh1 :`# 2   \#>.BNJ tzz  n\Z*' ^%# >%! ?Qa1\7Rb1D3Td1,&' 1Xh1 :`# 2   \#2 .8(    NJ Dzz     > Vzz NJ ܋&      SlD(     (. ~XǎTǞPǮLǾHD@ppW@1~ B|d  z( BH<0$dzzz zD@u#dp z"V"zwT4( zdzz  D@~WX@DHL~PqT2:÷z d  .THgZ*' l%# D%! ?Qa1`&! 7Rb1@&# 3Td1 &' 1Xh1  +D~PǎLǞHǮDǾ@XXW`@DHLPT~X\pz z     p l ,z ( V ^z  Ћ .\*\ (p p-d  p.B    | t } (pp  ~XǎTǞPǮLǾHD@``W@1z8z z\ J!."   #W d0 z3z 0Ћ  ! W@8~<p >'(ǂd  z( .~<ǎ8@@W@~<@(*Гlܓe6p (|d V  <p(p zz z z bDu* Fuwp[H@~Dp hLJz zz bBtB ^upi~Dǎ@HHWP<@DH~Lpz 8 ggz@zz?@ppgz z6:0p GzzD@J@@@6"a  1$C@y~LǎHǞDǮ@Ǿ<PPWDHLPTX~\z`x =f zz  ! z 4 pz@| ^|ezz?@tpV^pVpR^lR^P^`YVP^dZnpzzƋl  pp npzz@^`^x^d^h` & ';~ B^hPDa6  ( ';8 \  x$/((p""HW"xx         0 0?x?x9 s   0 #  z   6 ! '; @`x zB4d4d ! '; t   G"b$j^xP   @4h4h ! '; @ 4,s" '; t# '; |^dP&4^|Q^|^lT^l^p@P^p^|nteK ';B ~\ǎXǞTǮPǾLHDWh@DHLPT~Xqz 9aQ^\p Js`ǧd(̓\V`\Fǎ`Vdv\P^\`V zL  ( < p- z$"[,d!0P^dTѧ^dn`mWs!   р-d.`0O`  8\~XǎTǞPǮLǾHD@hhWX?@DHLP~TzPh `  zz xx  p  '=Jzt _zzNЧ pp  4`4`9~TǎPǞLǮHǾD@XXWPP 0P3!38  : PQ !`WH<@z~Dސ 33  p!q( zzw'p4^44YH   pr\' Xgz z zZ 2(6( Áqzp ([<z   zz ~Dǎ@Ǟ<HHW@8~<pz qqzY8$z ?  p0'$<@ :!!1!1!1A ( `6$`q  $~<ǎ8@@W@~<pzz z2.zB zz\ z F !pTpP pzTJ~<@@WX8<@DHL~Pz6zB Yz9 z qqz8 hY$^Tz ?  ^TpP^Te^T^T^T ^T^Tu $ `$ $ ЋH ȓRqqqѡ ( &qqqѡ ( ݋VЋH ܓR`qqqѡ (  `6$`q  $z ^T4z ^T8z @ ^T<z  < z9 ~PǎLǞHǮDǾ@<8XXW888W8 88W@DHLPTX~\ }Uz pp@p  (z !֋p \  <øzZ ^          p*$q$}  | x Y z -pYt| '$ x^n^pVntxn|  c pp>`  q4ssT.l q$q^up$q`z !sώϞlϮ|( , 0z ' qq^up( z q`~\ǎXǞTǮPǾLHDWp@DHLPT~Xzl  p  \ < , "WgW^d~d Q^dndl.\hz " $$.\ dnhp!,p ,$χpp|ZTQ^`8(^`Pz *0z NtNhdHV`@22D&L%r@~DHHW@1~$``(Np,2(8(~WH@0~Dq#(( (j`Z@($`ZpR&x<(< >r(p~Dǎ@HHW@0~<qp XBt'<t'<YZ,t't'tt||xx~<@@WX?@DHLP~T  |pxxq!0 sp``2@? 4s6p2s0 p0? #p" x/x! !p,)0 # 'g~TǎPǞLǮHǾD@XXWX?@DHLP~T  |pxxq!0 sp``2@? 4s6p2s0 p0? #p" x/x! !p,)0 #  'g~TǎPǞLǮHǾD@XXW W8  Y88W8t ʍYDxx||ttx 88W8x Tt0Y2xx||tt88WH8<@~DY|ΐ 0߀PP0p | $,Y~Dǎ@Ǟ<Ǯ8HHWx<@~Dրhp P0ߐl  XZ" x'|        Zv H 0Yd4 HJ P   d,J F 4 0YY  ~Dǎ@Ǟ<xxW20/.-,+*)('&%$#"!      :`~TǎPǞLǮHXXWH@~Dހx x m)N $ n),z,@ o)     <~Dǎ@HHWhHLPTX\ӧ~` VV  lP^d|nd qpX0W` {? p@ ~( `(9(D~`ǎ\ǞXǮTǾPLHhhW`DHLPTX~\VЋ ? qp ps 80W`s  x   ?  @! } s   `p*0? #p"p !6(x2  8B0( 7t! ~\ǎXǞTǮPǾLHD``WP<@DHǎx~LpΠ Hp %*   x/x! .(W   xx   t y~LǎHǞDǮ@Ǿ<PPWX<@DHLP~TÆ(zx %ސ^Ћ$a  xx pz ($zzdx"  y  p  yp   z (x<     ~TǎPǞLǮHǾD@<XXWH<@~Dq`x.xAzD 0xlj #D\ #&HÈ zDz7 01 0  Rsp 8zz,  " ~Dǎ@Ǟ<HHWX?@DHLP~T `x,xӑz vxp Փ!\ ֓!×zzNj    Bs ,zz  p  `xx   x    ~TǎPǞLǮHǾD@XXW @s  0A1  WP@DH~Lpp Rp`,*(D*9)0 p ~LǎHǞDǮ@PPWH@0~Dqq 1 1tp`(~Dǎ@HHW@1@x@@` <8 ЧЧ С1! 1 8 ЧЧ С1! <W@48~<Ðրzp,zz px~<ǎ8Ǟ4@@W8 ȧ~4pz{\~488W@48~< z{p  zz w`(p2 zz px~<ǎ8Ǟ4@@WP@DH~L`x.xqzw 0xǚXd * \l +yÙ zwz8 01 0 @nsހ XzzL <  B ~LǎHǞDǮ@PPWH<@~Dq(z mpf 'N֐d0|||e ~|p &~Dǎ@Ǟ<HHWH@~Dpq ?pD(Wpq'׎ ?pp       !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRST`o`~Dǎ@HHW8 0`#88WP@DH~L Z*Ib(yq t71(|0,2"#( |J.2(8  (W~LǎHǞDǮ@PPWX<@DHLP~T 4 p  pאր(pz"z ` ` `zz z&    `p p  m tq piLj O s  ٓpppR``  a  8 q p` p  q Dp *p`   l  ~TǎPǞLǮHǾD@<XXWX?@DHLP~T` q p q p q '$ k4q p  q( q p  qzld  ; < ppzp` $ LPp` zz zX 0D XPd Y    p~TǎPǞLǮHǾD@XXW@8~<p`p :d|||^w~<ǎ8@@WH D   xx  DD 1*HHWP@DH~L hǁ  0VBp*p( ! ߎ (( (p|  “z`       x q( ~LǎHǞDǮ@PPWX8<@DHL~Ppd4 z4 bT`xӁz ( @   Y p b 8    q ߰^ p (W@@(333p3$333p3aċXaȓ p p%   aR   a@ p    YTa~4 z4 ~PǎLǞHǮDǾ@<8XXW`@DHLPT~XqPx^\t0x,@ $rؓY 33334 zVв4 ` F΀@$    W p .΀@ V֐d  ,8t$tq   sp``0? sps p ? p   $q ? @p xΠbv |s ( W^ U$$q   sp``0? sps p ? pxx||x   V`^\րtqAVq 0 sp`` ? sps p ? p ? 0(   $1A@ @@i F   a @ p    Uf @  UJ\ 0x ,YY Y4 z4 ~XǎTǞPǮLǾHD@``W0!t &x | Y`p | Y8 x|b ! !hxWH<@~Dpz :p r֐l4 p0lplRT~Dǎ@Ǟ<HHWH<@~Dp$RzzRRRFRzYTzzTTR:^$  DTPTz"RPRz~Dǎ@Ǟ<HHWH<@~Dp<RzRRz&gVzz VTQ<TzTTz&gVzz VRQRzXTzNχHz8 NPzB ~Dǎ@Ǟ<HHW@8~<p΀zz OZgzz ~<ǎ8@@W8 z bz z Pd88W8ȧT.XT88WP@DH~L2p~zx%x 9  x0rdpupop xp6op xp   *Zsp$ǩ zp2cpDp *0~LǎHǞDǮ@PPW`8<@DHL~P  ˋ ʋ -p.T=^0MV@B 0    @ q!Ŋ|q΀0 f T(<qp~PǎLǞHǮDǾ@<8``WXLP~Tpza pQ <0 @ !J(J,:@09^I2~TǎPǞLXXW@8~<pST6p hP*p ph hdȎ fNMH@z!~Dq 0`"zr qp#7^ z   W~DHHWPDH@~LqzW()8~LǎHǞDPPWH~DpA2$t~DHHW@0!l@@Wh8<@DHL~P.d ( 0d)s, s    ( d`.` P^P^XP^P^T  q p sp ` ? sps  t s p`X^T ? p r^\` *^\P<0  M, M2 q@d Ǯ` p  q p sp`` ? sps p ? p r8 Lja q@DŽ_~PǎLǞHǮDǾ@<8hhW`@DHLPT~Xpx|Yvç *@ *v@  ,(` D  4&zz qpDp~ q$z  4z ? z !s&q0HXpFpW z  q 8WHTTz 4zVz VRD. N|ZZRP^\PY FҐҀ .z" VГX, z OnЋz N 0-$!n^\P  | |   >       Qz YxV |NPPNgVz"z V|TDTY~XǎTǞPǮLǾHD@``Wh@DHLPT~Xp|Y\÷ +@ *$  (`  &zzB qpDp q&z  6z ? z !s&q0HXpFpW z  q .88W80A & Yf   B20zA(p  88W`DHLPTX~\pz  z Fzz zzgÇzzz@? Гx pppƋ ǀ Փ<:@00gz z 0z p(˦'V@'z0z   VgP\0Qa1h&! 0Rb1H&# 8Td1(&' 3Xh1 p p~\ǎXǞTǮPǾLHD``WXDHLP~Tz    YZdpY8 z ' z"^#RgPȋ^;Qa1h&! 5Rb1H&# 2Td1(&' 0Xh1Yb7 z3^3 6d ( E0 z d)zz"~TǎPǞLǮHǾDXXWP<@DH~Lzdǘ8D ]zPh ^  t aP`q 0 sp@` ? sp a y1 1zzwpT0ް x   $1@pp0D` p d)zz" z z"z     dpϘ hY)' l%# D%! ;Qa1t&! 5Rb1T&# 2Td14&' 0Xh1 qMhPȋ\;Qa1h&! 5Rb1H&# 2Td1(&' 0Xh1~LǎHǞDǮ@Ǿ<PPWp@DHLPT~Xqz z zt  *zPЎ    z     Y        P^l^d^`X``pъ&lp  R Y4nlz@ w Úndzz@Zndzzzppzp @  ϷVa   hW3Qa1`sVxx hPz ?f^hzn\[3Qa1\xd\D K \$E *   Yrh^\3Qa1t^lQ^l^`T^`^d@P^d nlzz?@ ~XǎTǞPǮLǾHD@ppWPDHLPTX~\ҧçǾǻ0< }zH` ~& zl  z z t^U zU^S^t {zzwpP]W^~[zU^[zU]^P@pp p pP^ZpR^ZpV^rǀ|@pp^nV nv( 7@^@P^^T^^Q^^?@.t <>t-j^ Y$.t ^ Yt~]W^[zU^[zU]^^E@pPpR ^^npP ^TpP^ZpR^|ZpV^xVVS^pVVP^l^t^P^h|ǀ~@pp^nxVnvnp @p ^hP> : )6t P^. xx ^Q$^^^pPJP^4xx  94^T^^Q^^y ppj^l`P  !`   0(`*8 xx $qpً(x^ldP  !d   d80p(( xx $1p '6 P^. xx ^Q$^^u^pP:P^&xx  7^Q^^up^x@P^x^|T^|^Q^^Q^^P^^?@>t-" zz ^dz-z^ z^$ $~\ǎXǞTǮPǾLHDWH48<A@~DǠd!zz" 0@ @ jPq pr spx spa ? @qp`pz@ Tj? q p spx sp` ? sppap p$ `  ( ߋLs ^ 2q@ `p~Dǎ@Ǟ<Ǯ8Ǿ4HHWH48<@~Dǰdqzzwp B kq   sp' sp> kq   sp' sp$`( `q  sp` ? sp0a! !H&s  2!4@pp`0 p~Dǎ@Ǟ<Ǯ8Ǿ4HHWP48<@DHA~Lrǔ d ézzp4pj`q 0 sp` ? sp  ?@p a1 1b`q 07 sp` ? sp ?@0a1 10T0@ x   1@p$p` 0p1Nlz dq 0 sp`I ? sp a1 1 zz?@p|` a? pa XspP`a? sps pxxΰ Dz`q x    1D$ ( S` 0( 1~LǎHǞDǮ@Ǿ<84PPWh@DHLPT~XЧ`.dǭd úzz úz`?@? @dN?p{? @*p(ً ?@? @QP^\zpϋ?&vt  @*p( ϋ?2t @*p(\pzz.\`  ?@?@z~J ?@? :? @!p".*zb?@?@ ^`P d zz ?@?@p zpXj N 00? @!p".*zzd8j ?@pp ?@pj ?@? @! ?@pp ?@pt (n`pzz` :J$(( ~XǎTǞPǮLǾHD@hhWXDHL@P~Tt!q,(0  q  q zzXtx|& ؂z gz@ z  @x @   ~TǎPǞLǮHǾDXXWxHLPTXǞ\~`p   z \ ^ǧ z  -q,(0 q-)"q,!(0찍 j q z&  q zz   q q   @?d p]P ^tpRP^p[pV^l[pR^h nl ~tpp @(@ L.Ǟp@y @Lh Qh p0 N z  @   P q4$^hT^h^l@P^l^pQ^p^tQ^tndk   z  Zz@ z   ~`ǎ\ǞXǮTǾPLHxxW8 A0 *b(( (2,( x88W0# z 6,& ( W@ z z 2 z3^3 @@WP<@DH~L# ΐp (0<p(&|||"2 ">p (r dR '! +*& *<p(y!Ȅ jf  (   0!,,  z ,WH<@~D) z"6 ē ljbz N2z z)ffVp~Dǎ@Ǟ<HHW? zz~z rzz"YJd (<pא2( P֐ 4  d (<p2(Yy9 @z3D zz x" zzA!z@ zYZ z  zzzp hX7Qa1(㧧zz gz z "Yz z z zp gW7Qa1x( zJ  ,    ~ǎǞǮ ǾW0`p   YWP<@DH~L֠h  Dl($pWZMĎ  ) Éy@x)0 s1!#(    FZL" Mh YMh Mj Mp        ,Y r (YVpl: R& (Y pzl  (Ypl  t|XÉy"!fY Lx݋: R& (Y pl  (Y ("Y p  q fJd  * $( > t|XMh Y  (Mhz"Y( ! yfMh"P2d x(Y~LǎHǞDǮ@Ǿ<PPWH8<@~Dd (<pא2( J z Ézp p1z3pzppLp zO   ,   ا d (<p2(~Dǎ@Ǟ<Ǯ8HHWXL~Pրh0 .(^T ȧ^,p TY!Yn p&(Y$  sl~PǎLXXW@!!!B( ؋,0!B(@@WX?@DHLP~T֠h z  (Y t|XMh Y pMhJz  ΆhYNv ( ^ $Y t|XMh .Y pMhrWpgzz*z L%z08Y"Y *Mh;ȋB Tgzz(~z 8'z" *Mh;: & *Mh;z  YH8( @Y *Mh;Tz  YZ8(Yf,v ( pMh$vpd  ( l~TǎPǞLǮHǾD@XXW0 h(Yhp W00WP@DH~LppZz Jp'z 'zv~LǎHǞDǮ@PPW   ~ pϗ    z p z  b:pWQpe^P7Qa1gzzz az:p" | wp ~ǎǞǮ Ǿ WH<@~D4p d z6w<(~Dǎ@Ǟ<HHW8  0(1`1 (( f88WH<@~Dրd(hpFp d, zz}<p(ыp  vT t  T0p,   $`( ((!~Dǎ@Ǟ<HHWH<@~Dրd  (p `( (p , D vYtup,)l~D2.pHWx px x~Dǎ@Ǟ<HHW0A! c0! W@8~<Z^ Yxp.Y jf(p R9( m  Y[YV~<ǎ8@@WH48<@~Dրd s? pqh ,p44(    (^(.",4.H$( &j :. *   ؓ ~Dǎ@Ǟ<Ǯ8Ǿ4HHW@48~<pPs? p0,|t,44 |(|55 24# w| ( ~<ǎ8Ǟ4@@W@8~<pNГ~44p~<ǎ8@@W@8~<pB,s? p44,t4p.|| (L"|55~<ǎ8@@WWX?@DHL P~Tq (q ?@?@@ p  P B(0PXXp0tp@xp10<q @@ p xx  <0 $1(q @JL* p xx  $1(F0* p xx  $1@ p  ?@0rp6sހ x    p1D  p @ 0#p`m~(¶0`pq ~N 2~TǎPǞLǮHǾD@XXW ~ (Pp` (d$h @ 8h<Lthp:@8LtPWpP (<pP  (q,2 ? 2p2(q,@ $@Xs.p"$B `B(q,ΐ? )s&p"$"s!@ $@`p!$#"x/x!0 #p,!q!0 #x! P! ! P` P3Qa1PX B q  ? p"q 0 sp0``6q @? sps0 pxx  p q ? pq  sp &q 4 sps  &pphP3Qa1qqH~ǎǞW@~< q  bppq  H@ 0 ($!sp , (<p 1v*xd p@ 50p0( G1'4pt@|"(4 440|pPtx nW3Qa1~Dǎ@HHWP@DH~Lpǧw33Y  H p߀0 4G!D4(lphؓLY Y WYNYzz55lpLJd(2s(|5 (  0Ć@'*F~LǎHǞDǮ@PPW8dT88WWYWW0  !&< B  . "0123W.*ppWWPD~Hph<8pŀWp L(pLpLp LLL L  L2pY' 7T\@0LLL$ YY*Y L$妆 Y~HǎDPPWXDHLP~T ֠pzz΀@.zz |z * !(1:  wp?p   z * !(1jz 80 ((H(ȓ ~TǎPǞLǮHǾDXXWP?8<@DHz~LZp|z4fǗ>zz   ypp `~LǎHǞDǮ@Ǿ<8PPW@48~< z  pXz<BLJ  xpp ~<ǎ8Ǟ4@@W@48~%! ?Qa1T7Rb1<3Td1$1Xh1 whW'' l%# D%! ?Qa1`&! 7Rb1@&# 3Td1 &' 1Xh1 ψc.HLWހ (x  ~<ǎ8Ǟ4PPWH@~Dpp Pld'~ dLۜ~Dǎ@HHWXHLP~Tsp(8 !Xp )4 2 !p""W"&r& 'd=!X@(p'`ﲋl$th|xdn P3Qa1.  Dd z"DŽ*ǐ ǜ* @ǨǴ) {s   pR @d0 z3Pħ^(x @d0 z3P^(D @d0 z3P8^(~ @d0 z3P^(d,tz d0@d z(Pȧ^,t dd0 z3P^(`&d z"<0:ynp dq0<|5F< @d0 z3Px^(p @d0 z3Pɰ^(zp @d0 z3P^(Bpt @d0 z3P$^( p< @d0 z3P\^(p @d0 z3Pʔ^(p @d0 z3P̧^(bp{8Qtun @d0 z3P^(w84@!Ԗ5 ΋"dȼ5 d(  ~TǎPǞLǮHXXW@~<p@}(~<@@WX<~@phJ  r,(h -ј Y q)P Yy0@2($bz ΀ x ǀ$z pDHJ&P&D к Y.1@[Y Y~@ǎ<XXWPD~Hրhp p (8LYY L*lpp~HǎDPPWXL~Pph |'T YYR.TxYT '7(Y,˘T~PǎLXXW@~L#̆L$v< ϰ~HǎDǞ@Ǯ<PPWH<~@րhr q(DYYDVYY Θgz  zYfؓFY Y<TLz VWYVvD~@ǎ<HHW`DH~Lph  {Yh'7XYY >'7\lYYlP  X  x \lX.\TYY  P(ԋlTp Pp !\z! \Xz! X~LǎHǞD``W`hHL@PT@DX\!  !H:``W`hHL@PT@DX\!  !H``W(~t.\>(;`Yllt p ~XǎTǞPǮLǾHxxWp~Hphl$ŬYY ^TlXL\`LPdh' 7 !(Tz~HppWhhPTHX\HL`d!  !(P0hhW ~Dph ĒYY (Y.p#HHYY XH؆  tY*'7 S4^(~DW?HLPTX~\Ó  ` d lhpxhY@l(' tY~pxp p|^xt.`;^(JY|plh| t||#h|$Zj| x||#|$x ؓxt tr~\ǎXǞTǮPǾLHW@~L#HYY L$ Yp ~HǎDǞ@PPWXHL~Pph T$YYLjY( A 9WYY fTiz zT)'>T#YY T$Y ~PǎLǞHXXWXHL~PphǀzYYT$*YY ( A 9WYYdTiz zT)'>T#YY T$Y ^~PǎLǞHXXWXHLP~Tplxp R70)(H' (p z~TǎPǞLǮHXXW8ȓ $ zY88W`?HLPTXA~\ǸI"z@ p8W  "x ḧ( F4)"  + z(̠9~k)9#9z3#(;B" z h  p 7(*zzzBzB($*&zz>z z$>$<&dh2z Ďt; +H. V@  , p  $&zz&>$*$  z ,g* p4+8~(R$*(zzzBzB(&*$zz>z z>$$&̋XfF 4:$ `fR   ~\ǎXǞTǮPǾLH``W@~<p  . p~<@@W@8~<p 0 ΀ n   ~~<ǎ8@@W@8!~<zp2"z"'7p.pd`Z ^YYDpYY$x_~<ǎ8@@WH<@~Dq'zp ''z"&5pYY pr($ p` zz pH z*z p Lpxb^ `~Dǎ@Ǟ<HHWH<@~D1( zzxyrzV H ' D'0 ;n ̀a~Dǎ@Ǟ<HHW@8~ B, B80 B4 BD B<8Բ B^ B` B̆z BH B BLJ | BtP xXYL_ Y R~~Dǎ@HHW0 1!$s    s1p WP@DHz~Lpz zzz!p" ǡ z(.z^zY& $$ ȓh gzz2zHU2z0  2:zXUhY~LǎHǞDǮ@PPWHzF 0zz zz!RB`p(l A(~Dǎ@HHWXHLP~T\hx !Nz     pr?@6\ (\p IJp8$$q4G( Tp$88Iz3(#4F  q( ~TǎPǞLǮHXXW`DHLPTX~\p ^Y *nj$  ЈД eLǮVRt:8(+6pp   (  p~\ǎXǞTǮPǾLHD``Wx<@DH~L \РЬ Kt Ph tz     pJt   tPt^.^Pt.y*\?0@5 \~LǎHǞDǮ@Ǿ<xxWh<@DHLP~T33X P^`^dph *|\X YR\>6d ^`Q^`p^dQ^d Y( Y YY r 6 dpX~YdN$\dpp Ϡ8dn` v^dn`V* Zq*(^dQ^d`ΐ *(    q `q*(X\!(‹X|\!(~TǎPǞLǮHǾD@<hhWH<@~D p @(g I  YHжx|xY YzXǀ$p u\  (> N   z XzL`Pq @`zz q @q z \zR0 :z( YB (z Y# Ylp~Dǎ@Ǟ<HHW`DHLPTX~\&d}NQ z.z!0(]`Q8|VǍp *qhp0,!LzBp@ "@ *@J4L L0L LL L4q!(iz  .\  ְ֠{ p P$ ('2S>pP v00z 0)(nTƋh,)(lT<   0q<   q!# 2(0ZT6N ppN>q!(0ZNpN^d L  Z  \dZd( z  Y~\ǎXǞTǮPǾLHD``WXDHLP~Tp֐M zְ( 2PN<F0 '(jdR|ְzzq10(#XRXضt䶐x|LrBKxLPZq q,! 4(0X8QtK~TǎPǞLǮHǾDXXWH8<@~Dրd p,8q X zz0``$zz z y xJPpǘp $ q ΐ $p d| zz4 d . zzh  zz  <p(j~Dǎ@Ǟ<Ǯ8HHW8d@ 0 dzDzzzh1Hb 4  zl(,p p<< (0dP Y88W @dPd zlzp $ (,W@8~<p nt@55x~<ǎ8@@WP@DH@~LP AxQu0P AxPP Ax0^p (< . ` Axz <p! X < ((4@"44 Y8ր( <ZB^8< (Ԉ Y~pd  8P AxX  2 0z!4@zzh@ , (<p 1ld>  zl5~LǎHǞDǮ@PPW`?HLPTX~\qx >LJ{z D&MZDl ((C I| ! Y(8 z3 (GZ DC ((Cr I<| !~4C C|  J~\ǎXǞTǮPǾLH``W?h@DHLP~TpX q$ 4  (<pPX q ? p q  sp ``& q 0? sps  p ( <p q!? !p"q0 sp16q@? sps0 6pxx  p q  x   p *x/x! !xx0 iX3Qa1qqp.Xq$ q ? p q   Xsp `  q 0? sps   `pxx p xx p h a q  ? p"q 0 0Xsp0P`5q @? sps0 5pxx  p   $ d~TǎPǞLǮHǾD@W@48~<p8`Y3Qa1tݓ~<ǎ8Ǟ4@@WPDH~Ldap?&h `(&8zzq<q?@Zz H` 72h()0K > >~LǎHǞDPPWH<@~Dp" q~Dǎ@Ǟ<HHWPDH~Ld`: p=zp( > jz )"q,  =<(0I==~LǎHǞDPPW0 !Z |ZF> q \ q     YW~sF@0" 8 1pY0@ b V  Y    Y< @B8 1p Yd@YN$<    Z\~ǎǞW0 ГphpѠWPz z~Pz,H`HPz " Y00W8d\` * z Pz P88W8d\ * z Pz P88W8d[ V z d[ , z Pz P88W8d[, * z Pz P88Wd" Pz PW0 Pz 8d Pz PZ000W@8~<dpZ2 z Z z  Yz$ $րdhzbp (z&J zz8u ҆8<p(d(r j~<ǎ8@@WH<@~Dրhd  d p (z"4$ zzz &<p(Yΐ PsD P ΐz P  \ X T u Pr T` \lp` Y P Pt~Dǎ@Ǟ<HHW@8~<d  Pz |p T TRNpW Xw \0 Xw \p Xp  sp \dVHz: zz   V X  \w.pVp( Xx Xf*. Xv X  \v Xpsp1p p q$݋ \ X``@d( \,  Xd  \l PqD Pqd(n L T Pq\~<ǎ8@@W@~<pdTB q1@@Bp#0@#4p"#pxx     x  ~<@@WXDHLP~Tph Z  8n   1TdS`&dSJ`#* ΰzp    ' (44\ j X!q,(0<"5 0   &p (? 00   ' (43 /  `!q,(0;*5  /YH    /jYl d ~TǎPǞLǮHǾDXXW0`, (  YWp<~@րhp ppWZ LJ  '  (,  - z.z -ދJZ $D ,p|YDFL   (Ά  ,p Y~$n,z ,܋H6,Vz ,Y~@ǎ<ppW@8~<hdp z |Y+1p ( ",,((,(($d ~<ǎ8@@WWWWXL~Pրh0 ,.(^T (^,:p  T`((Y+  Y '$ (d z *R$(Y(  ( ,l~PǎLXXW0 h(Yhp҈W00W0 h00W8h p݊88W8330 `dzlp,80z4D<8HP  Yp88W833H88W83388WP<@DH~L֠h ph  YR t xX z @LJø @.z  r|^ !>@   x xlDlD333l3~LǎHǞDǮ@Ǿ<PPW`< ~@qրxtDHDLPX\T" .LY\ll~@ǎ<``W8h!H88W8h88WH8<@~DY   >Dp@Y    Fp  0 Y *ٴp d Y>  P  . @YY R2   xD֠lؓl.Y Y p ZVY> pz z |~Dǎ@Ǟ<Ǯ8HHW8 ȧ~4ph p01~488W@~`zzYB Y zz@ ~Dǎ@HHW@~ z"'Y!B~<@@W@8~<րhҪp~<ǎ8@@W@48~<րhxg p?  @  p j&xp @ YHpl:ppxp z ~<ǎ8Ǟ4@@W@8~<րhZ`pV~ 8 ̋Y0~<ǎ8@@W@8~<րhJ d YLq &|(Y~<ǎ8@@WX@~Dրhp pW @Y ppzhlR @l,   H \YBH Y$H \ YH \LYH 0 YTH \YH! YY~Dǎ@XXW0@DH~Lրh  z*p ppY`' c!(Y8 @0P)[YY   P@ @ Pav   P .PYY. @ P)ZpYb*  Y:&zzz (8Jqpp@#4W~LǎHǞDǮ@W0 ht 00W0 ht00W8 ` `Y*&zzq ` YY 88WP?8<@DH~L֠h B,Y * &zz  @  ދ܊(zYz* d Y F @Y2z "0p2(z, 0z  07p(s0 ڋz    !#z  q0 01WY Tc\ ǐ$|xtX Y     ԣ   ~  Yz pgz z   `pzЋ 0z  rh*z V  q0 00W ]  YY~LǎHǞDǮ@Ǿ<8PPWP<@DH~L@Y  &zzp2(z* (z ,p( @Y|zçzz q&z YB$Yz  YLJz V ǀ$Zz bY|xtX Y z  q    Whz c$z z z c [ ~LǎHǞDǮ@Ǿ<PPWX@~Dh~H RY'(( ! 2"Ћ( Rp Y ĚӠl `YD$ an$ ' _Z~Dǎ@XXWlWX@D~H֐h΀2T6L~z2p pT8 pLL 2( 2PXR`TL,Pҍ Y~HǎDǞ@XXW8 ȧ~4ph.mpK~488W8 ȧ~4hp`(YVp(^dpZ0$pZdpdpp^~488W8 ȧ0~4րhxp p^^qZ PLj ҀZ^Zfdpp^Z~4ǎ088W^lZpWZlW\lW8 ȧ~4hp`(Y$`p\p`~488W8 ȧ0~4րhxp p``q\0 RLj Ҁ\`\`q p`\~4ǎ088W`l\pWd zlzpW dh$  zz    zlW0 Г00W8 ȧ~4hpp (pގpdq(p'ppdplp~488W@8~<ͦ Nxzzpp @zzYz  iz zYx||tPxXzY "zz@ ~~<ǎ8@@W8R88W8ȓ~88W@8~<ˬpt @YJ@| 2Fnx ^~<ǎ8@@W@8~<րh}p  Z. \    z@ z   fjz~<ǎ8@@W8 ȧ~4ph|: H Z z@ ~488W@8~< hǂ(Yp,lp,8(88 "01p23HW38@L LL LL LL L^L LL@ L(L LL LL LL LL LL Lp L LL L8L LL@ Ld!(` !(PdÀ zp d.zd;<p(~<ǎ8@@WX8<@DHL~P֐h  YF   Y(ǩp d p ְd zYTQZVP^T z ^TP  zzx  zdPZP<4`^a(QaYB :<p(C Y~PǎLǞHǮDǾ@<8XXW@h Cb YF$8lF:@@Wh Whd!88 lW@~ ̋<LuRLLldlld A0*( 0(2,l0lFlY~<@@W8ȓtt>488Wz0 ( zz $"<< ((W0 1!@WX<@DHLP~TsЋLJ (  |  Bb ,?Ћ,> j* ,Eڋ,E      ~TǎPǞLǮHǾD@<XXW8ӈF88W8 ȧ0~4 `@0 ` 0h 0X `,xW,p (Ljٓ z~4ǎ088W 1 `:!A "bzz , (W 1 Z `2! z , (WH8<@~Dր `2x   W,p (Lj~Dǎ@Ǟ<Ǯ8HHWH@~Dր `.x$W,p (Lj . _2~Dǎ@HHWH@~Dր `.x W,p (Lj . ^~Dǎ@HHW@ ZXT Xq,ГN "4ؓ@@WX?@DHLP~T   p p  0*=*L =lĔ h<0ppz怘zz <X p @ zzp~TǎPǞLǮHǾD@XXWW8t Q2Q88WP@DH~L;xpp\ zx zz  p ;rp ՠ7PN~LǎHǞDǮ@PPW@8~<qPp 'p>>~<ǎ8@@WPDH~Lp:6 z(B zzg (T Xs ```$zLJ|pz 98'8N~LǎHǞDPPWXHLP~T$8zp0ՠP)NJ8pp\ zhУ zz pp 8p0ՠx)~(M~TǎPǞLǮHXXWXDHLP~TpԔ'MJpԤM6ΐ77 zԬ zzg (PX s ```$zLJ|pz 7^Լ'8LBx 7:ԐL"~TǎPǞLǮHǾDXXWpHLPTX\~`(9(KK&B z݋2&z Ljzdd  ߰ pPՠ^hl ;ċP5lpV zᒣ zz pl5h( '1Jh|p z zh|(0 X! s,``((!7'2'z"8; zLjDŽ.d Id(.d(Id ~`ǎ\ǞXǮTǾPLHppWPDH~Lp8'8I"wΐ|g( &zz( H'8Hʋ^('7#7z32(z"7XzzX(Hpg~LǎHǞDPPWH@~Dqh(7H&pP >azzp!"z'z pŋbpL !zbzzpzzpz~Dǎ@HHWXDHLP~Tp|'9Gpl1րh zՐݠ  z zz  z 1Πphz zgzz'!81z+4zz zzz *pq "x(xE ՘'E~TǎPǞLǮHǾDXXWXHLP~Tpp'(:,E*p z z  npZ  (H 0W z ` z~TǎPǞLǮHXXWPDH~Lp.( A 8Wp .~LǎHǞDPPWXHLP~Tp׈'8C.( A 0W .d Dzww  " . ~TǎPǞLǮHXXW@~<pנ'B6 ׬Vz (< ~<@@WXHLP~Tp׸'B,z4:"gzxz \z Hgzz   (΀T#z$( A 0Wzȓ׺z  + ~TǎPǞLǮHXXWH~Dp'@( A 0W~DHHWPDH~Lp'8@B*zz ( A 8Wp *~LǎHǞDPPWPDH~Lp'8?*4zp ( A 8Wp *l~LǎHǞDPPWPDH~Lp0'8?)( A 8Wp )~LǎHǞDPPWPDH~LpH'8>),z p6zp ( A 8Wp )P~LǎHǞDPPWXLPTX\`~dpP^^^Ч(>,0`'=z   z >z (z  z!P^P^Q^P^^VP^"Pz(z PPgPzz! P^^^^'pz  &dP ^'`VPV'@zH zP^'`^PP^'B^Pz  .>Ч>(7 C>W^Pz &‹p^^ &T ΐ<×>zz0z  zv  nz  P^&6Pz! PgPzz" PP(<z%%nhW<%' \%# <%! 0Qa1T;Rb1<5Td1$2Xh1  ,   x܋$ր\ z؀Ь zz  $P^H $  ְ 8X+ s,`z` $ ΰ p   ؈(;8(!:ΧnT 6hzzlzhhÞjlzz lPz! PgPzz" PPH ~dǎ`Ǟ\ǮXǾTPLWLPTX\`~dp>pǧ (^p^,0ؐ'97~   pP (J(0W Jǝhzz( =:   ^ *"8z(z 88Vg8zz! 8!|$zVV|!hLz |!F*z( z|!z  | 8z! 8g8zz" 88$6| LJ0جBzrp&$zz$(z(Vp2(z"< شЋ Lj &p Lj&˂^PThzz& 0Ǟ㌧  !pLj4$zz$(z(x̓p0P^x÷XpzP^P^t^pRVP^l Lǝz  h  zz|(! =ۚz((93b|z (X|^x^tP Lj$$(zz"$(z (h zɨ zzh (T Xs ```$ zǨ|ⶀzh@0<^tP , zz$zz$^lP>Xz2XzzXXzz@ &  xpr z.^xP&ΐ $zz(z$(X|^x0 zǺ zzh (PX s ```$ zǨ|ⶀz X^xP z$( A 0W8z! 8g8zz" 884n`*  ze| ~dǎ`Ǟ\ǮXǾTPLWPDH~Lqǘ (7/Fq J(I 0W~LǎHǞDPPWh@DH~Lx$Ǩ ((."zz Fgzz  z gzz lnPW'' \%# <%! 0Qa1H;Rb105Td12Xh1  z,z  .\gfP ~LǎHǞDǮ@hhWXHLP~Tpx'(:,-)@ 6< z !!p""8W" tzz fzPz (z ~TǎPǞLǮHXXWXHLP~Ts)(:~,+( !d!p""ِW"@!  @ z  6 pz ~TǎPǞLǮHXXW@~<p'+Zz BgZzzx&Zzt~<@@W@~<p '*z z T ~<@@WH@~DpLJ8'*"@@L!$T z z T $<~Dǎ@HHW@~<p`')nz z8 T r<$ ~<@@W@~<px'(z z0 T <$~<@@WPDH~Lڔ((~ zz"z!" ( pz z   TTZZ ( A 0W ڐ''ڤ'~LǎHǞDPPWPDH~Lpڰ'8('8x"z z ~LǎHǞDPPWH@~Dp'8&1^ !!'# Pz z ~Dǎ@HHW@~<p'%z <~<@@W@~<p'%z $l~<@@W@~<p'%^z ~<@@W@~<p '%0 z0 Tz gzz ~<@@WPDH~Lp0'9($p<|>$f H$2$<P$~LǎHǞDPPWH@~DqX(7#xp~Dǎ@HHW@~<pp'#~~<@@WPDH~Lۀ)8#&y pwz|8p`|((|z|rHW&zz|(V(76z%#z4#<zz zz ҞF zz z p xLj~LǎHǞDPPW`?HLPTX~\΀ۘ*(<,! z{۴<z|w zz 6<p  |`\,' n%# F%! ?Qa1l&! 7Rb1L&# 3Td1,&' 1Xh1  zb )z" N| ~\ǎXǞTǮPǾLH``W@~<p'zؓhgzzJzz  &~<@@WX?@DHLP~Ty ΰ)::p8W (     WXL~P 0@p~(,0#4&T >T~PǎLXXWXL~P >TZ 0@p~(,#4&L~PǎLXXW@A~<s ~<@@WP@D~Hxp`L|P.L|dLaa 82  L@  4` L  !ΐ ܐ'8ߊܬ8(ܸ $ȓvxxVXyx   x"$0),y112y1 t01((( "@ rA 10 @pހ(#'0 11D0 @pހ(#'0 114q?pp1pzp pppp~HǎDǞ@PPW@~8p!p(P` B(0<`q< <~8@@W8 ȧ~4p@Wt~488W@~q0 0A.q$FO  1"~W`HLPTX\~` h жxPp^@  ^@ ^@^<dp q! tq!q.q  0YY\\dZ"PTqqYdPt @0 ;݌ .ddP*Qݨ x^^LP^HǠpǐހ,*<P'9(:  +4Z 44824 8    0 $`z.$ -0 ;z(Hn  +(lB  + ޘX!z  (   +  ޼$ P^\%R^\W, -0 ;~(^,(z!z x  ^\%P ^L|XTPɧ^Dpz j^XPXzpxtzxPx0:^XzPz^XPz 8x 01q z z z^Tzz zz Txtz xPxL~^Tz Pz z^T^TPz 8x 01q z 펀z  -  @Xh܋.z 2^\zP^\%P ~^DP  R  6     !z^H$%P -  , ߌp^PP L^<  ^@\^@8 (C~`ǎ\ǞXǮTǾPLH``W觮8<@~Dphx$ ( )> YώHt|жxX xY0GA1z×z 8 0G"z A1zz'0.0BA1z(!zӆ K8  K&~Dǎ@Ǟ<Ǯ8W`HΐL ~Pp q΀ ( )0 7 (ߨ J z  )p(zzȧ . \ !    ! ēp x p*` *z)ԓ FTTTXX`s(6z) V  \T\~  \T\V~PǎLǞH``W8 ēv88WXH~Lt.xtp0р1  (P  PPTT`P  (&5 8 P T   2t '0 8(z,` `z .$ '0 8z( z & ē츋 z" ,v 2 |< p ċH ċ0@ ċ ē& '0 8~LǎHXXW@~8qXX?  X<&><@@W@~8qXX?  X<jX ? >X<@@WH~<q``?  `@nB.`D  !0  !.`@..BFD@x~<HHW@XX?  X<\>X<.X  ! ^ !.X><v@@W@~<qXX X(~<@@W8ȩPP PT88W@ 88 8  <8<|@@WP@DH~LVVx|s p pH '0 #x/x! H" p| p8 @ t( YȆ|` q ? p q   Xsp P`%0 q 0? sps  %pY.| t(؆ YB||ttxxYxW~LǎHǞDǮ@PPWP@DH~LVVx|s p pH '0 #x/x! H& p| p@ t0@( Y|a q ? &p0 #q,0 #0Xs.p"#2P`5&@ $q,@? $s&p"#"s!0 #5p!% YFY. t|0 (谆 Y||ttxxYxE~LǎHǞDǮ@PPWP@@~DrB H(YjC4HLYH(‹0C .HLYY~Dǎ@PPWX?@DHLP~T s DZ sp(p(  ,f 4!~$ $ B@ !.|P 8P2 !؆ &`Z Lx& !v$  \. (,!"v (! YB@ (P( 0 Ws Y~TǎPǞLǮHǾD@XXWH<@~Dssp(p(g ? Y&(H"YYxJ(!İY$(,!Y( (!xY ? ~Dǎ@Ǟ<HHW@ 0 #p@@WXDHLPz~Tz*;Dΐ@zzsp <q(ҋ Σ,(     zs D߁` x p x T  < @  ݖ ,,~TǎPǞLǮHǾDXXW`DHLPTX~\p×z qp q D߰ (߀((7(ᘓ   ē (0!` @Ѐ  (!Z@  Ѐh (!L 8!4  0 q`  2Ѐ@  0 qp 4h@ @   ! p0 q (P(X `((( 0(`>&1 ,(,  0튋84( hh' q) tt { p {  :~\ǎXǞTǮPǾLHD``WhDHLPTX~\  z z zsp (p('8(xzsÓj`,⠓ B  P<(^d ll((x |( :, ( ( (8 ($ p"" W"(H ދ( :v( z( j( F(Ѐ 8 x (8   8L Q^d  .    $ ?( Z   hgxx p (aB($( (( `z ⸡,8@  "8($7G #4K<88 , pװ "7' ħ.(+  J `" ' 7 # `# ' 7$" #p 8 Z8 `! L `` `  f  T  ^dP . `'䦋P    < ( 爋~\ǎXǞTǮPǾLHDhhWhLPTX~\p. ! `؆ zDߠ   p`  . 㠋 $` $(   (p(,'>GN(GN, ` j ! .`0 # ! .`  8 ` 4@ 4  .`((~p""W"8  `# d$d (  ddd d@ ( d8 (d  g@  d  0&8'H$7 Ǹ0;$Gv  ? _  8   . V84` !| !|, !x !x(`<8@x ,g@  0^@   (`($$  0(p t @  '  $ <( z(D` _   8(,| `j ?    . (H (x  p`   `! )p"">` #ݬ `# ' 7$" #݈ `t48(0   D `" ' 7 #` $ (``zT؋D  < ( |  ~\ǎXǞTǮPǾLhhW@ x((Ydsp0(1(|s. $. >$r@@W@ x((Ybsp0(1(|s$. $. >$q@@W@0 ֧.2 . @@WXDHLP~Tq':(zB s sp(߀( < mY6'm *@m m ԋ4m m p""hW" p(Hp($  p(  p(bp(V  ^* (ꖆ8  2p(,  *^Y~TǎPǞLǮHǾDXXW@pYb xpӴ "(!< xpӄ B(!ȶl.p pYW觎~p"pB(B(P@0 p"(( 2B!pB(B(~ǎW@8 ~<YXp0@2_< <;>: 84 @ @@ @@ FpxW~<ǎ8@@W8 ȧ~4Xp0Fp|W@~488WP@DH ~LXp0 ߀0 χ,,ؓLǨnx ^  F(!8>xY  ڲD&4 FpWG ò~LǎHǞDǮ@PPW8X 04 hYFpW88W80A0X 00  d@88W@~<p'$ p8W@ @(@ @@0!  (D`FpW  vp@ @^@  @F@4@ @aH~ . n'4dW~<@@W8 0X688W@8~<YlXp04YD@4 @ @ 0~<ǎ8@@W@~<Xp0@Dz@ @[&4~<@@WP<@DH ~LX߀0 ߐ0@a  Y(  6č  x$$$(@  T@a  Y6z"2 6ޠǷ x  !2x  g(.FpW &(xY[<pH,@a@  @~LǎHǞDǮ@Ǿ<PPW80X 0@a 00@ Y0 88Wx@DHLPT~Xp1'8 P^P^l P^P^h P^P^dSVP^`S^P^\ϗ,ǧ,Ytlh^d^t^`^p4dD^pPh  Z@ " ^tP'4W'4W     x c^\PF΀+b֋h<G  "  'Fp!Wx}~XǎTǞPǮLǾHD@xxWXDHLP~T Xp0  0:tp0*4t А1 ti1@@f1n    U>P$(& (;,~TǎPǞLǮHǾDXXWPD@H~LX߀0 p0L$(8a @ : 0   (4dW6 2  @ (4dW~LǎHǞDPPWH8<@~Dpχ$H т NѲ 2 є  D2~Dǎ@Ǟ<Ǯ8HHWY伎 WW@~< x`((Y p与f Apx`zw(vx` Axt' Az下* Az'z A~<@@WX<@~D x`((Y hp䀓f6 Vր8X( s,`z` 䜓ehtJ.`t!70x>#<xx.HH~Dǎ@Ǟ<XXW@A r@Yb0&@@W8ȶ A&88WWX?@DHLP~Ts #(< srprpD߀.Y` ߠ D   Òz  Hp Yz  0z     &rY*`  `  ؓ:JÇpq H xp  Gp 0 &|q H(z pT.  `0~TǎPǞLǮHǾD@XXWWP?8<@zDH§~Lΐ@z szsp<pV XR     p($bql? p0 0Xsp0P`5 ? sps  %p,nR @   ,,~LǎHǞDǮ@Ǿ<8PPWH8<@~Dpgzszs13p20@$zpT'( F  0 , 84D߀ߐs 400d p1    q, 44 x xx0j  080Ǘ00#0)  004 @ѧs G xh`r  :8,  "  D4 L~Dǎ@Ǟ<Ǯ8HHW ~ljy `  1JèL!a@ A 0$A   J2ւp (b(g  ~ǎǞǮ Wh@DHLPT0~XD  ǰ  zs@ Cpdp@߀ +q xx p8*$pxxq qptxx q 2 ( < "$ (; #   ( ^d,p! \p\^`  q  3 0q   +0{`  qrx< A@  q! a - a P^` Ϙ Q^\zp T!(2sp!bP/QaP/[paP/[ã8;bP/S%*0`#(@^` p P^`r (2hqp p(ppp@:(0^\P^`P^`  L^\PP^\ x@  Ay ( 9 ^`q^d,p! n` ^d,.dp(0 \ A Ap A^~XǎTǞPǮLǾHD@hhWH<@~Dppp. x0\>p~Dǎ@Ǟ<HHWh@DHLPT~X` A Ap A^``D߰ { ǧ VzspRPЀ ^d(2  zs p p\B倓[ǎ\ p\唓Z\(p(  p\娓Z\(p( p\弓Zz\(p(  s $. >$[8d s  zp H   "p@W    ^ p  zspd < x pp\ГYV\  p \NY \     l}q- p p  p  \ -!0p1 #  qa a  ,)p(0 ZX A Ap A^     0440  084`d ! !,d !  !  H8, { p{ `4~XǎTǞPǮLǾHD@hhWH~Dpssp \pTNJ2R~ $. >$Iv~DHHWH~Dpssp \pTM0§~ $. >$H~DHHW@ 0 #Q@@WH<@~DA VYV@Y\ ssp q` (   ~q 6 Y\'Y&& Yq  62~Dǎ@Ǟ<HHW`8<@DHL~PP^XTЧ^TX^T D߰^\| ^ TFt*h@ fՓ` pDn\(^TT^T^XDP^X( ~PǎLǞHǮDǾ@<8``W0! AY00Y A  AW A  AWH@~DB p2b8 !1qx(px tb8'Yb8xxttxb8p A>瀓M A 稰 A程*  A x~Dǎ@HHW@8~$56 X'!Xp X'G!s1 1(#4      Xq8`d  zz,̎"DzD D@ @~ǎǞǮǾWP?8<@DH~Ls pj8 s pj8 Xq@ F@p|WD@ `@    nFx4Ϙl8y D4܂v3X (" s p !j8 ~LǎHǞDǮ@Ǿ<8PPWx?DHLPT~Xq s pj8bpY $'T T !p""W"b!b!p""W"t! t !p""W"Y zqDpY `zq$z R <`z ? z !s&zq0HXp x    ؀ ؊ Y̎ YY 2 Y0У  xFa   8s! !~(4 s pj8 sF Oda  (zz,̎"DzD D@ @ Yj(` YJ Y F$ XPxX!88::<<>>PP('4W  X(!Y(` Yn ^ Xq  @Y(`  Y X!< <Y(`  Y X!< < X(!JY2 v wv"Y `   `    X(!);$` X(!);$<x \(YN8:>\ <\<@ <^R_S.`< <: :" : :*8 8: :> >> > > > \8 8: : : : : :L: : : : : : 4UT8 8<0 <FTU8 & 8: :< <> >8 0@ 86 8 8< <0@ : : : :'4W X(!);!, d Y>~lFdl Y hz zq A@T);Wd ~lY X(!); \("4Wx X(!); V X(!);(hz zq A@);W~XǎTǞPǮLǾHDxxWH8<@ǎp~Dp'F"4O@ @ @~Dǎ@Ǟ<Ǯ8HHWP<@DH~Ls pj8pYp Y'`  YXX$`    f `   Fp W~LǎHǞDǮ@Ǿ<PPWP<@DH ~Ls pj8pYp Y7`  YXTX$`    :<  `   ZFp W~LǎHǞDǮ@Ǿ<PPW8@0j8 ! 4  $X!Fp%"W88W80p0W,Op!j8X""4WOp!j8""4WOp!j8X1`0    ""4WOp!j8""4W`Op!j8X""4W$Op!j888W@0@~<PO!pqj87 A a0 1$X!" ~<@@WH48<@~D Opqj8, z1 @! a@ AXa$Y$7Qa1(\  P$*0 B H$(i$X$7Qa1FpWTi$X$7Qa1$((    $*0 B H.$(i$X$7Qa1       V1 6 `   7   !((G 1 ! a@ AXFpW>i$X$7Qa1$( 0 |$*0 B H$(i$X$7Qa1       ~Dǎ@Ǟ<Ǯ8Ǿ4HHW@81~<Op!j8Xq0| nFp!W^g,X,7Qa1Fp!Wh,W,7Qa1,0~<ǎ8@@WjjW@8~<j ~jTpj>0 jljqh~<ǎ8@@W@h q jh2@@W@~<q2&`z zq !0W~<@@W8ȓ$`z zq 8W88W8ȓ$`z zq t)Yt tx x)Ht!tY(xx >x'4W~Dǎ@Ǟ<HHW`<@DHLP~Tp Dzwx0g2g0 lÇ8@    Ǘ, (    ^ ^@ P^P^\ P^P^X|)*^\P-) -^XPJ *)AZ   33( Ǘ,d B0HX3 3,(, 0 2R  @'4W"*?<pP  )P!0Dzu< Q!.Dzu nW!* H'4WP&*&@  GG"U! VGG@a \  @R!@0 2 f   T(TS!20 $   *T! GG$\ @ @ '4W J@ @T(G$U@   G*@a  @x~TǎPǞLǮHǾD@<``W`@DHLPT~X|@  >  è:@$33|RP^\D&3 3| |P^\|Fp"@ 33:>\ސ* y AZp razp pϘJp?  pW   r    FJ@ 4  33 p uTixp  @ n  p\upJ r:033 qpR@ p ڋ0    @ J  qp  uy  p33 pt L@ >  s & vw^\P ~XǎTǞPǮLǾHD@``WP@DH~Lp@a " @:s`χ$>>v& B0H@ @~>   . >@  :v B0HL <hޠ"ǘx D l (@0  '> |@ޠ   (P @a@ 2<pH @qN ~LǎHǞDǮ@PPW@ @ @> UT|@a 2G  @p>@ @n.U . Z@@W@8~<p0D0 "D1 nD1r,T  np6 , 0 2'4Ww'4Ww0  r$& B0H$,& B0H,>    pvt PP`  gW %' l%# D%! ;Qa1h&! 5Rb1H&# 2Td1(&' 0Xh1g Pj^;Qa1h&! 5Rb1H&# 2Td1(&' 0Xh1Gu8~<ǎ8@@WpDHL~Pp(t  6|T!T!p""W"t!>!TlnT ^ q\YFnfB((YFpAD :WÇ>^8`:b<d>gP(wFf(FFpAD :W(>FpAD(:W8^:`<b>dFfPg(wL^ p@ Y'4W|RNp8W'4W@'4W0'4W '4WY2  ԋY> T(o6Y8:>T <T<@ <VRWSǎX< <: :" : :*8 8: :> >> > > > \8 8: : : : : :L: : : : : : 4UT8 8<0 <JTUV8 & 8: :< <> >8 8@ 6 8 8< <@ : : : :<TTURVSW<  > > > >   < @ (8   g:8    :  0:   :   :  :    :  @ :  T(Xj Y: DFpA):WY~PǎLǞHǮDppW@F8:<>P(q<@@W@8~<p΀!l @ @:c@ ԓl~<ǎ8@@W@8~<p| }~  '4W@a @  @d@a  @:d}& } k|}b Gl '4W@a  @d~<ǎ8@@WH8<@~Dpk. G@  zk ><T4UJ@   @ @ @aGs>6g W'' l%# D%! ;Qa1h&! 5Rb1H&# 2Td1(&' 0Xh1gPj\;Qa1h&! 5Rb1H&# 2Td1(&' 0Xh1Givdilސj V\ DRj( SސjT nRS T L>4Іш\B\ U V"k( wGGj3ސj3 x~Dǎ@Ǟ<Ǯ8HHW8!4W88WPDH~Lp(D D! VD!p8>  xހh h>>  ހp 4 f'4Wf~LǎHǞDPPWH~Dp d  zz*̎ DzD DD 0@  @~DHHWH~Dp@&@ @D 0ZD~DHHW8 A> RRJb020 0 (* @(0,,88W8 z~4pˀs~488WpDHLPTX~\kPk^hP^d  bhnh`h llh l ll l  l l( s(  ll  ꐓ l( ꨓ h l   Pl(  ' 0 pΠ XЀ 0P^l^d^`n` @  @~l  40  ,00  *n00  2T00. *0 p16 1#&00  8 00  00"  * tΐb    bYv b@   ^l0PXѧ^l (mnd^dQ^d^hT^hk  ~\ǎXǞTǮPǾLHDppWH0P(dd 4Y`< @ @ @@ @2@ @ W:@ FpxW `l~Dǎ@Ǟ<HHW@8z~@ @  @W` Jnw     nw @ nw  X^T ΐ  nw !M W* @  @ V nw6 p! ! ! , ΐ  nw !M  Vbnw n . vJ~\ǎXǞTǮPǾLHDxxWP<~@pƆ pD]pH]D DH HDH DL]PDa    Dp]0L dǎL p $~@ǎ<PPWP8<@~Dp8 pz  ̓ pπ pϐH\f L\ZH HL LHL .L @ \  p[La    L p[~Dǎ@Ǟ<Ǯ8PPWH<~@ pD[j~D ppD[LD dp  ~@ǎ<HHWH<@~Dސ8\y @D t  @ @Xkp (~Dǎ@Ǟ<HHW`@DHLPT΀~X Xߐ 0p <  >W^_W^^W^]8  )<0  !&D T  @0 4(&@ <  D<@  <  <  )<0  !&D T  @0 4(&@  `  O<    z" i8    J       dt8     8H  ,8    "  6 (0 p1 1# n_6 (0 p1 1#p Fn^6 (0 p1 1#0 n]6 (0 p1 1#  <  pK.0 8  p! ! !d ΐ    !D(  Mj$ (H& MF~XǎTǞPǮLǾHD@``W@8~<p!7N@ 61 077 1 0 \΀7    !B  h~<ǎ8@@W8 1BN@ 6A @BB0PA @  B0숓288WH08 0<~@zr qpk7 pϐ  DRD  > 2z? 8 'R|~@ǎ<Ǟ8HHW8 qp1k' p 88W8 0 1" @  Q֋   pQ88WH<@~Dp p Xߐ 0߀p 0 7 p! ! !젓 .     >~Dǎ@Ǟ<HHWP@DΐH ~L 0pH:   0 9 p! ! !>       l !   0 9 p! ! !48v      ΀ !=  F~LǎHǞDǮ@PPW@ ~8q qp1k' p <NF>~8@@W8 z1 qpAk' p #M88W`@DHLP T ~X р  Xp 0߀ pk p hMPhsh @ @h @ @h@ @@  @k =  pkP p0^P X^P^P^P ^P^P^P^|P^xP^t xǎ~@ b| \Lx `K\ \` \`33$  !  dKd (   ((((Fh((!p""W" ! @!(( &!΋>@(@(:l(( & !~*(l( 2!N6         r   b      <         !9      x   d   P   <   (    `(0@  !  8(03 @ .   ! 8Ƌ| # (*(""p""8W"  ΰ   ΰ      p  z  ΰ  @       p  zZ     p  z t02z+ 툓   \Ft `F\ \` \`~33\ \`^ ` \^ç8 hFjh k33\lF,\^\( ^^\l`  @ @@a n @RFp!W2&sr33l @ @@ @l @ @@ @h@ @@ @<  @  .@  4@ @V@a  D,Dz/D n@ @ǎl@   V ΐ >888㴋*@g8  @ΐ  0   '4W '4W     p  68Fp!W &sr33<  " r  q, ~ǎ j,+,q0008\ A2,,Fp!W \`=  0 #Ad02,,Fp!W^Q^^t P^t^xP^x^|P^|^P^^P^^Q^^Pѧ^^XQ^^0Q^^X~XǎTǞPǮLǾHD@WX8<@DHL~Pހ((Ѐl,Pl0ސn0ް^T  5|` {^T,X p    8(   ?  ?  ^T @QD<^Tl, =~PǎLǞHǮDǾ@<8XXWXDHLPz~TzsΠ l,  pp  @ @ zc3 0v ؎| zhދdJ0>    t\T5< 2 . V, 5zc0 0  $z z֋\zs  zc1 0 zc2 0 D (P z~  004  g  Y~TǎPǞLǮHǾDXXW8  p+88WP@DHz~Lzs pp@ Yg Dߠ(( zc"!0ְYTD  & 40zc!!0Yzc# 0fY    ~LǎHǞDǮ@PPWX<@DHzLP§~T΀@z s  <p81Ћ ( 1У,( `  $ ^; @  ),~TǎPǞLǮHǾD@<XXW@48~<pzs D߀( <8 ($ ,;ԋ(0$ ,;(0, ; 0;r(0cccccBcB84  / x p x  /~<ǎ8Ǟ4@@W@48~<pzs0 0 p  ($ ,:\ $ ,:, D߀(ccT 8(0 0 449|ccƧ8' q)4  - x p x j .:~<ǎ8Ǟ4@@WH<0@ 0~D Dߐ(    p 'z" 7p߀ 0cc16c31c!n1p23W3cB1ZcƀL1 c18z"z0zT zȋzﬓԴ z̓Ԕ zt zzTfz0@RzP,,6zt,z,z,zȋzӴz8Ӡz`ӌ@  z`@  Xz4@  ,zГ@   6  &~Dǎ@Ǟ<HHWp@DHLPT~X  øzz sP^g^g P^gng:4Z8pp^h( cc!D c3 c! p""W"cB ca  xck cƚ c bcZ p""HW"  ^h1x^h p1dX )2P^` T^h1(^h p1X _P^`X  ^h0^h0X 6P^`^h 0^h0ng  h^h0<^h p0(X _P^` ^h/^h/P^`z ^h/^h/P @^`> ^h/|^h/jP @^`^h /N^h/>ng^h / ^h.^h.^h.ngP @^`T^h .^h.^h.z^h.jngP @^` ^h .2^h."^h.^h.P'^` ^h -^h-^h-^hngE@p $ p$q ? pp$q 0 0Xsp0`0p$q p? sps0 0`pxx p a-^hngEBp $ p$q ? pp$q 0 0Xsp0`0p$q p? sps0 0`pxx p  ,\^h,LP'^` ^h ,,^h,^h ,^hngE@p ( p(q ? pp(q 0 0Xsp0`0p(q p? sps0 0`pxx p a+V^hngEBp ( p(q ? pp(q 0 0Xsp0`0p(q p? sps0 0`pxx p  *^h*P'^` *^h *v^h*d^h *R^hngE@p ( p(q ? pp(q 0 0Xsp0`0p(q p? sps0 0`pxx p a)^hngEBp ( p(q ? pp(q 0 0Xsp0`0p(q p? sps0 0`pxx p  (^h(P'^`t^h (^h(^h(^h(P:^`"^h (l^h(Z^h(J^h(:P:^`^h (^h( ^h '^h'^hngE@p  pq ? ppq 0 0Xsp0`0pq p? sps0 0`pxx p a'8^hngEBp  pq ? ppq 0 0Xsp0`0pq p? sps0 0`pxx p  &P'^` (0p z,8N   ` ^h %^h %P_^`~ (0(   ` ^h %~^h%lP_^`^h%P^h%>^hxx p@ a%  a ^hB $ ,8 ,ngJ(x( `c& ^hs $l^h$Z^hp$H^h$8_WP^` ,8 ,ng (sp^h #^h #^hp#^hp#P_^`$  0 q P^lpq0$   p q P^l ,^hx/x! !p,@ a" a ^hB " PD^\^hpDRxx \nhp a"j  "X^\Tq^\nl(ng z,^h !^h !P_^`2^h !^h!P_^`^h q!^h !t q$    q P^l ,^hx/x! !p,@ a!^hB  PD^\^hpDRxx \nhp a    ^\Tq^\nl(ngc ng^`Vn^ %8b` <^h @   z&  "@~XǎTǞPǮLǾHD@ppW@ 1  v@@W  l, WX?<@DΠH L!~P  Dߐ(   pc1  <8 8"TT T p߀ZVpWc c3 c!p W c0,T c( , c3\TT,T ,v c( ,N c1,T, c( F, c2,T c( , c#TT0   t c( ,N c$,T, c( F, c%,T c( , c),T c( ,v c*,TT c( n,. c",T  c( &O @v n. p  c"   4q 4 0n . & h:  0 4 4  c!,T c(  F4:   , c',T` c(  zF4:  4: , c&,T c(   ^R "~ . v P,PF4:  pF , 4 0 sҔ ZT0 4 4T  !s#  c(  r4f  ~4 . < J 4 4 2&( 0 4 4p 0R4F( 0 4 4p0  d    ܧ~(p  . $' ck!ca p""pW"T0 4 4T  !s#  ck r3f  ~3 . P ē^ 4 4O @^ V ca  4 4 0~ . & L   4  4 ާ~(p  . &T4 4 4 0T  !s#  ci   0 4  4 ~(p  . H sL 8>T( 40 c( cBcBs bpT  0 4q 4NT  !s#  c( r4f  ~4 .  4 4 4p 0 th0 ( 0 4 4@' 0( !p))0 ' 04 q)44 PV0 8   4 4 0 0@' 04 q)4' 0( !p))0 n   4  4~(p  . N' c!c p""W"T  0 4q 4T  !s#  c f3Z   ~3 . t lO @v n. p0 c > 4q 4 0 . & ̋\  0 4  4 ~(p  . 8T< 4q 4 0T  !s#  c   0 4  4 ~(p  . P84`  ! !,  ! ! ,  ! & B~PǎLǞHǮDǾ@<XXW@ 0 1~< D@( p!t8cpq p s psxq !~<@@WH~Dzp4Ԅz $. >$~DHHWH~DzpT4 z $. >$n~DHHW | x YTs l, Y(|s 0 D(04WH@~DzpA#zs0 0l, Y cYvc"@c$@YF$c' 2c!*!p""W"z(0YY~Dǎ@HHWH<@~DpހnPnpF  `  pnp ~Dǎ@Ǟ<HHWH<~@΀ p YH@ Y* pnP DD D B  p (D  & l4 ާ^@ާFާ  pnP Y0.D  r@ ~@ǎ<HHWH<@~D΀ p @ Y^    4 ~Dǎ@Ǟ<HHWYWH8<@~D΀ pސ* @ *( l tttY*x (xvxgV.   ~Dǎ@Ǟ<Ǯ8HHW觎~q @ R0 R $p}>:p Wr H \ P 8   \ P 8  L*pD2 2& 1 ۋ 2 0 >6 ~ 2 0r p p `P/Qp u΀ 0 7p pD4 q  @   l.p\@  ,  x l T  B >2 2& 1 p~ǎWH<΀ ~@ p pnP DD`  8 pnP DD`  x a  ~@ǎ<HHWP<@D~Hސpj     npnP LxL`  `pnP  a2pnP  pnP  pnP ~HǎDǞ@Ǯ<PPW`@DHA~L p4l 0l1p238W3 R TV XZR* YRR*̆Y4Rz U WY [ pnP \\ \N   2$ ާ @ާާ B ^ YBހ^    pnP  pnP   Yހ   > pnP  pnP  Y~LǎHǞDǮ@``W0 @  1 8WH < ~@p q pnP D" '(( t( ,D  LD  8D` @  D D  <D@  (D  D 8D (D  D ~@ǎ<HHW@48~<p'  F      貋 ~<ǎ8Ǟ4@@W@8~<q'@  P2  d 0 '#' ~<ǎ8@@W8 ȧ~4 p p"  L~488W@8~<p  p   ~<ǎ8@@W@8~<p:LJ , r~<ǎ8@@W@8~<p x qx~<ǎ8@@WX<@DHLP~Tۋ p g<)( p *(  {  ~TǎPǞLǮHǾD@<XXWX<@DHLP~Tڋ p H p  { q{gր & ( ( )   C   ~TǎPǞLǮHǾD@<XXW@1~p  ~W@48~<p H(p qrl* Nq*~<ǎ8Ǟ4@@WX?@DHLP~Tsΰ0 ) a( z(  A(L F(< " 'ɧpH (6 9(&  'Ч' ~TǎPǞLǮHǾD@XXWX@DHL~Pq ) b )8X  F )Z,` +: )>TT -> )>T TV *> )>Tr bT /> )>T* T ~PǎLǞHǮDǾ@XXW 1@ (2 S B WC: (A   WP48<@DH~LpnVVzb \΀;z$,b !p ~LǎHǞDǮ@Ǿ<84PPW *nz  W觎~pAz!V"1V1~anz\nzzF0"n B$ n  ~ǎWP8<@D~Hqzz$ *  % LLnLnLnLznzLP nLnLnLpnLnLn Ln $ ~HǎDǞ@Ǯ<Ǿ8PPW8 ȧ~4p nnz. n)J   #0nnn~488WXDHL~Pq.z" T1"z ()8 Tnz$ n0Tnz( nTn Tnz" n ^Tnz  "84Tnz  nTnTn~PǎLǞHǮDXXWH48<@~DpzrzV6 '>  N pq ˎ   ~Dǎ@Ǟ<Ǯ8Ǿ4HHW`?DHLPT~XpqŽ &   [ q\X\z, \ * ')z(7\8(% pǐ \z ( +7~XǎTǞPǮLǾHD``W`HLPT ~XpnzwאnנnװnӀnznzqqpfz( \1"&F\nz n\anz  z(   z ( 0V~XǎTǞPǮLǾH``WH<@~Dpnz D'z" !`! " &!@,D(X~ljz H@N' @z"|2p 5~Dǎ@Ǟ<HHWP@~Hs>L΋fLanJq0qq.Lzz( 0~HPPW0 0 nz"zqq1  q 00WP@~@zs>D0q(qDpqzwDz'H1 qqHDz'H2Ha nzLnz'L1z~"Lnz nHnz nDr~@PPW@8~<րqpqFqs s q qqpd R !q qqq~<ǎ8@@Wh<@DHLP~Tqq !! R Xq  \ z*"!!q~X4  (~(ΐ. 6qqq  ~TǎPǞLǮHǾD@<hhWPDH~LrqȆf '0qvH '0qІP"qqȓ~LǎHǞDPPWPDH~LrqȆf '0qHʋH '0q$"qqȓr~LǎHǞDPPWXDH~Lr '>P *\ '>T톆8 TPTP P~LǎHǞDXXW@~<p&z ~<@@W`DHLPTX~\r p  pנ ? ؋'7 b<'b>'>,pW‹4Xދq |qh* jT.p\ "q"   ԓ p(      !)|4' (~( . q ~\ǎXǞTǮPǾLHD``WX<@D~Hp NNTnώO\>$'L T  .Nl ~HǎDǞ@Ǯ<XXWP@DH~Lsq p (0qF (0qh qr q8q\qȋ , q~LǎHǞDǮ@PPWH<@~Dy' tyX'  t~Dǎ@Ǟ<HHW8q@fqж888WPT0>Dp|D!0D @LDL>HDH  DDPPW8ȓ^X @Xq88W@~8p `< 4<a <  ~8@@WH<A~@s qqqaqaq qqq@ qD( DDqq@@q@D<DwDlDaqD.Da!'ܓD`  ~@ǎ<HHWXDH~Lr  '>PpP '>TvpsT P .P0@p`!Tp120q /܆ T  $P$TtP.T`(/0j~LǎHǞDXXWxDHLPTX~\p/ ö  (>`HZ``(( <`n $ (>d d`(( (>h.`@ p`!dpQRP^lq /5B / /`  ‹fnh(gN( @hpT1 pp  ΰ?qFGã'S^pP^t :$pPQ^pS^p mP/X `mP/X&bP/YpbP/Y&! .t>l 8^tPҧ^tpnt(=   ~\ǎXǞTǮPǾLHDxxWXD~H  LpTLT'݂Tp$qTL0 A( z( R Z( a(,T@L T f2Z(a( F A( ! " z( A!.LHTLba(z(  !T 0TL ! b p@W L LT' VLT'BLT'΋*qb  *H8P̧RX(r@PrRPXpHbt",q>qq  0(>j:|0MC0NV LT'8MRMVLT'MDLT'VLT'MAtMV LT'8FM2TN1MMV LT'(ȋq^ZppWbLT'FNLT'8J.LT'쾋LT'֓ȋ*PDH~Lq   h0  p)X!B p)X!" ddēP tppuspDbp1 p p)X!Bp p)X!rp !p"Xǁ'8~LǎHǞDPPW`HLP~Tq8q8۸s pqpr^rX\ @\&"rXX@@ &"掁\\(\z*X1Fp @ Hp1N\P zا(4t\ls r *HXanz p @  Hq0 P 0 XqN\P z(4\qz q\XJ~TǎPǞLǮH``Wqȶqqqqqq0q n1  W@8~<p΀ q~<ǎ8@@W8 ȧ~4p Fq~488W8 ȧ~4p ~p `l~488W@8~<q 4p "~<ǎ8@@W8ȧT.XT88WH<@~Dp 6'q%'09q  'q0#d u o x 6o x  )Zs $ǘ ) 2c jD ),~Dǎ@Ǟ<HHW`8<@DHL~P  ˋ ʋ -p.T=^0MV@B 0    @ q!Ŋ|q΀0 > T0qp~PǎLǞHǮDǾ@<8``W @ @ @ @ @ @ @t @h @ \ @ P @ D @ 8 @ , @ @ @ * * * * G * H F @@G. *DDLLGGXGG`GGhGGpGGxG G * FG G *G ) *0 *12X12L10 *! G/")G#L * HFXFF`F F1hF@FQpF`FqxFFFFFF *GA @G *F @B *FF @L * H W;W0DWLW LLW#>$PKDB>W8 ȧ~4pr 0L` zWD .Dwtpד~488W r t!WH@~Dpr \H. 6 z*.| wtp~Dǎ@HHWH8<@~DÉ ( Bpנ /Lpr ( W wtp~Dǎ@Ǟ<Ǯ8HHW r  tW0 r 1 "t W8  z  w88W@~"i!. |TY< p $)(i 0(iڐ! (i !Ƌ(i!ZhW%' l%# D%! ?Qa1`&! 7Rb1@&# 3Td1 &' 1Xh18 z  "hW(%' l%# D%! ?Qa1l&! 7Rb1L&# 3Td1,&' 1Xh1 | p z4z(R7T W  &T 7T*W~LǎHǞDǮ@PPWx<@DH ~Lpr Ǡǹ`P..P!( !z00n`W%' \%# <%! ?Qa1H7Rb103Td11Xh1P ( wt((p  ~LǎHǞDǮ@Ǿ<xxWPrpPrtPrp2rLWP<@DH~Lup yܧ$`X(' l%# D%! ?Qa1l&! 7Rb1L&# 3Td1,&' 1Xh1 kY)' n%# F%! ?Qa1l&! 7Rb1L&# 3Td1,&' 1Xh1 kZ3Qa1rHrLw~>|rDpr@rDq|rHprDrH.~LǎHǞDǮ@Ǿ<PPWXDHLP~Tְr@ . |r@ rD |rHrH&X prp z bzz Dz" * Dz"   \R  ;wd 4 $*0T u $Ǘwrp< sF $+0 $r uRd~TǎPǞLǮHǾDXXW  WP<@DAH~Lzxz΀p@ ΀p .W z  p ΀ &p ΀| pDz΀Z< PB΀8Dz΀" HDz ΀0    ̆,Dz΀Dz ΀Dz 4 @ 00 ~g4W %' l%# D%! ?Qa1`&! 7Rb1@&# 3Td1 &' 1Xh10 !  WDz D n | l΀b΀X) J 6) &  .V  q~LǎHǞDǮ@Ǿ<PPWp<@DHLP~T[^l ,nl (vlp! /H XWlpP /LǞX^hPr^`Q^d `P/Qn`pǀǮd^p z$z, zX   <$nl^hW(((Ljq$dǞ\P^dPrا^`(s rzr* &z &s szs~TǎPǞLǮHǾD@<ppW8 ȧ~4pp /(S&z&&z.$z"s sm~488W`@D~HΎrzrnPY)' ^%# >%! ?Qa1\7Rb1D3Td1,&' 1Xh1 LL~Lp,p! /LsWpp$ "6rzr$zgX(' l%# D%! ?Qa1`&! 7Rb1@&# 3Td1 &' 1Xh1rzr~HǎDǞ@``W@8~<p0r p0r p "\Y ~<ǎ8@@Wp@DHLPT~XP^lx (jp! /H\W$z"\ `P/Qpߠr` `P/QpߠrΰpP /L^h"d p r$z"+H(^hW +  u,0r F d0r !0S^l  &z*$z $ss  hʋچP^l  P^lg8P^l 0  p`X%' l%# D%! ?Qa1l&! 7Rb1L&# 3Td1,&' 1Xh1 gX%' l%# D%! ?Qa1l&! 7Rb1L&# 3Td1,&' 1Xh1 $z $&(,dl~XǎTǞPǮLǾHD@ppWx8<@~Drpޠ0r p ޠ0r H0nLY)' ^%# >%! ?Qa1P7Rb183Td1 &' 1Xh1n\X(' ^%# >%! ?Qa1P7Rb183Td1 &' 1Xh1 H~l~Dǎ@Ǟ<Ǯ8xxW!WWH8<@~Dpdv<r$|Pސrpp  $,sshzzz Z uxB  jux ( z@` 2\W3Qa1 2X6 ,  s> ,    "s zzz  zpz8p Vxp   tx , 0xWT~Dǎ@Ǟ<Ǯ8HHWP<@DH~L   xp   zz O pޠsf  pz   h Y 3Qa1hY3Qa1x&x )z"zzw g\ &özzz@ z  W zz  zz ΠpWùgzzzz 0zzzz W,Bw  QL zzz} x "z w z x ΐ   U~w w  Udǘ i X3Qa1iX3Qa1 F Nv  z     P~LǎHǞDǮ@Ǿ<PPWH8<@~Dx Π Ǘ  Py j M~Dǎ@Ǟ<Ǯ8HHW    ! W    W@8~ ( \ ,~TǎPǞLǮHǾD@<``WH<@~Dp!xpϐ p  () ( z" zz~Dǎ@Ǟ<HHWH@~Dpp p v 2h fp ρvw  ρ' 2h/6u1$J*' 2h?6u1$J ~Dǎ@HHWPDH~Lp 2TnW 3Qa1n W3Qa17. 2() 23 X( ; BE I$gz@ z& @0 Jt  1@ Hp3 @6`A~A bA JAZ4NA :A 2A*$ $#4!~LǎHǞDPPW<@DHLAP~TP^p p@ ER.ps" xx  @ @ z@ sṣώXX^lhW3Qa1  JnW3Qa1 Tǐ, (($zP^lnW 3Qa1  ^lnT3Qa1|F z    ݋zz gzz=<;:987654321 X gBzz*zz 9B ! !4 BzBD Fh z"z 8 ! !&ǷDXB !h& !(&  h zz   8$  h&zz  ( & ! !&BDh zz6z  7 zz ! !z,z" zPp2VzLHp 6Wpvp|plHp  <z ҅p 6W(hTh(,( (,  TZ4(DTǸ(gZ[z\`*z)``%'P' ?0^p4 Zz953 @N0:6`%'P' ?0^h4 Zz953@N7`ZT H`%   z   z<  ZlH p RL~LǎHǞDǮ@Ǿ<8PPWW@  L2'0p23 8W32.*2 2h Ju.$#>$<@@W8p"9p8,0,ap9,0,appbp9309,0,bdF9709,0,dhgf9,,hfgd9,db9,ba9p8,pPb9309h5,0,bdR9709h5,0,dh gf9h5,hE,hfgd9h5,db9h5,ba9,p0,(" b`p 80  a a n@Ǟ<8HW@8~Tz f$z:XzЀІ *z z xp zpzp  І   lЎ    HІx PІd  B4Zx<x@x<0T,(Ћp   kY 3 Qa18^pЋj\<:ІЋ&.pXzz@ d  e<>zz <(z<0:J ȋ: 4*@p p  9 p&zd('0ϴ`G ~\ǎXǞTǮPǾLHDhhWH@~Dp 9H 9P7 Nu4p΀ 6~Dǎ@HHW@8~<p$ǀzp\z zp.2$;4p 4~<ǎ8@@W8 ȧ~4pz:6p 90Wp pz $1~488WPuPuPuWXLP~T|(z,"؋px(gz ,zz :RJ  & .(nW 3Qa1×n$W3Qa1(,>$u) rBnW3Qa10#` : W 3 : Qa1z$ :(06$3` ~TǎPǞLXXW8 ~4q /$~488W@  L2'0p23 9xW32.*2 2h u.$#>$ T@@WP@DH~Lxwzppp ` h  Z3Qa1hZ 3Qa1      :&V  *2z z3 1 0 ~LǎHǞDǮ@PPWX@DHL~PpAǷzΠ@ Π҅p 9W Πu!0 Π x <hΠ` ΠP 0 *4Π,Π$ Π +.֋HnT[3Qa1 Π  Π & Tk^T3Qa1d n^+.H Ћ: <*ΠΠ 9겆  z ~PǎLǞHǮDǾ@XXWH8<@~D| Fp>  >^y~Dǎ@Ǟ<Ǯ8HHW`?HLPTX~\!Ǩxr    z t (ù  < Lù (Z  "jz z zn$Y3Qa1 (>$,   hY3Qa1 vΐ!!('÷n$X3Qa1 (,>$ ~~\ǎXǞTǮPǾLH``W`HLPT~Xp!z zt  ZXnX3Qa1$ 2P ϑ$n\W3Qa1 n\Y3Qa1ǷnX3Qa1è\$(,>$ *`0hgY3Qa1g X3Qa1~XǎTǞPǮLǾH``W8  z 88W8 ȧ~4p $ 9H 9 ~488W@8!~<bpp<gX3Qa1~<ǎ8@@W@8!~<bpp<gX 3Qa1~<ǎ8@@WP?8<@DH~L7x6  w"VwWx 8~LǎHǞDǮ@Ǿ<8PPW( ا ~Dp>L0 2'NDǾTL^@V^VVR" Lh  2 $ D , @  "'e~ǎǞǮ Ǿ(W  ~2 0q7B@ AqE qr pqqpppp  ~ǎǞǮ W@48~

b5^nz*4h ;Wzg !  z \ X L(@s z $PPPpׁX b&-f F)z ;lΰwz PPPpׁXb&,  B&,ր؋p  p p6 Pyp 2 p pضP B B Vh B B^nz's )* ~\ǎXǞTǮPǾLHDppW8 ȧ~4 ; & *&zp!f z'~488W8D """  ;8Ί88W8 Az  A ;PBD """  ;dd88WX@DHL~PTpϮT|zz >p|$ v֐ 8X) s,`z`  % lp p d|(n !' hz z(l !' hzp zp(!p""(8#)', zz  ozdp p p p 0TT jp pp ppvpp p~PǎLǞHǮDǾ@XXWP<@DH~LqP؈؋ؓ :zLj$ސزp |p pFp؋ؓ0 Mhz z (0!#p23X'#)"yzz< p p Hp p~LǎHǞDǮ@Ǿ<PPW8 ::8: 8 8888W8  ~88WP<@DH~Lp HְP  p<P`  D  \   xx &  ||  @ .        `   ;àb ppp @ H  pppf ppp   ~LǎHǞDǮ@Ǿ<PPW0  @    B B  $00WH8<~@D!pD z'(6(.p"" ;W"Fpppp ;` ;ȓL~@ǎ<Ǟ8HHWH<@~D !p (6(.p"" ;W"Hpppp < (2 <~Dǎ@Ǟ<HHW8 2\0 1 "18$ <@:2 \B """ppp >L~Dǎ@Ǟ<HHW@8~<p&z:H`,Ӷ(H|zP~<ǎ8@@W8Pp p*  >֋ؓ88W ԋ`@ !   ` W@48~<pԊ  ހBԊ T ހ " >ަԋu~<ǎ8Ǟ4@@W@~< p4qD( >H'<(`51(70R!p"" >W" ? B ? 0 ?4 ?H ?d ?|D( 0Hж p ?tD """p<pp ?^p ?4p$`pp \p~<@@WX@DHL~PTԂpbpp pT`p p  q0p @b0 p1A!6p@q0p @ @ p1A!6ppbpp pT`p p$ @ p @  @ @fpp pT`p pp&p&p"~PǎLǞHǮDǾ@XXWH<@~D @( ހr( @(pǘ $ |xy|  or~Dǎ@Ǟ<HHW ( dq  0 sp t`0? sp0s  >s p` ? p WP[D Cb GG(GG0G8FBP [ D! Cbɂɢ (F`Fq0FFA8FFLB` W`ɀɠ WLW!`rr, AB(Wr` 0!WP[WB!/W!/W (! W (! W 0 W0 / @ކ@ # 0ATE#" 0@0W+K "01!W01$0h01%h01&h01WPWPX%@AQAGxBBSD"vdҋh('"@A('p'"$@A$X$@8hCA!FhCA"H@To0qЀЀ`@̀@̀[8[Ȁ\@@@@@4'((*,,,-6$AC܀WXLYHȀt\@@@@@^^_0`j8bcdfHh4@̀@,H@̀@̀@̀@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@kl l m8n@@@@@@@@@@@@@@@!{XT3OO (0 h)@ԀRX/Vundef1.1_betastandardridgeSASCIOMTSMDFDLPANSIKEYBDISPCIODEBUGCIODIAGCIOLANCECIOENETCIOTTYCIOLPCIOISBXCIOTAPECIODISCCIOSCSIMTEXTENETSASAL @(#)linesw.c 5.1 87/05/29 @(#)config.h 5.5 87/09/03 `̀p@̀@̀@̀@̀Ԁ@̀l$@̀܀\Űp@@̀@̀@&&!"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""&f&d","@"T"h&"|""Ā"؀oԀoo# #Tp @(#)bio.c 5.1 87/05/29 devtabbflush: bad free list Cache: number of buffers %d binit @(#)clock.c 5.3 87/10/16  @(#)debug.c 5.1 87/05/29 @(#)errlog.c 5.1 87/05/29 @(#)fault.c 5.1 87/05/29 pfault before vfaultTNNMxMxNtune.t_prep + 1 >= countfault.cpage read errorvfault - bad dbd_typepfd->pf_use == 0fault.cpfd->pf_flags & P_DONEfault.c @(#)fio.c 5.1 87/05/29 closef:DTYPEfileNFILE @(#)flock.c 5.1 87/05/29 ccdldDdVg:g:g:g:g:e|dd0g:g:g:g:g:e|ffg:g:g:g:g:g:g:fg:g:g:g:g:g:g:g8 @(#)getpages.c 5.1 87/05/29 run vhand DANGER: vhand needs swap space p->p_flag & SLOCKgetpages.crp->r_flags & RG_LOCKgetpages.cttuuuurp->r_flags & RG_LOCKgetpages.cgetpagesgetpages - pbremoverp->r_flags & RG_LOCKgetpages.c WARNING: swap space running out, needed %d pages DANGER: out of swap space. Proc %d cmd %s Killed (out of swap) rp->r_flags & RG_LOCKgetpages.cpfd->pf_use > 0getpages.c @(#)iget.c 5.2 87/08/07 inodeNINODEno imtiaddress > 2^24 iaddress > 2^24 s5ip != NULLiget.ciinit - cannot read root superblociinit - not a valid root file system @(#)intr.c 5.1 87/05/29 spurious interrupt : IOIR = %x @(#)machdep.c 5.1 87/05/29 NO PAGE TABLE SUPPORT ON THIS MACHINE looping... @(#)main.c 5.1 87/05/29 etc/init growregvhandvhandbdflushbdflushschedsched @(#)malloc.c 5.1 87/05/29 DANGER: mfree map overflow %x lost %d items at %d  @ @ @ @ @(#)move.c 5.1 87/05/29 @(#)msg.c 5.1 87/05/29 Can't allocate message buffer. 4$ @(#)nami.c 5.1 87/05/29 @(#)page.c 5.1 87/05/29 rp->r_flags & RG_LOCKpage.cpfd != phpage.cpfd->pf_flags&P_QUEUEpage.cpfd->pf_use == 0page.c(pt->pgi.pg_pte & (PG_V | PG_REF)) == 0page.c!rp || rp->r_flags & RG_LOCKpage.cpfd->pf_use > 0page.cip != NULLpage.cip->i_map != NULLpage.cip != NULLpage.cip->i_map != NULLpage.cpinsert dupno kernel virtual space size %d %d %d ip != NULLpage.cip->i_map != NULLpage.c!rp || rp->r_flags & RG_LOCKpage.c @(#)pgtalloc.c 5.1 87/05/29 size >= 0pgtalloc.c(pt & POFFMASK) == 0pgtalloc.c(pf->pf_flags & (P_QUEUE | P_HASH)) == 0pgtalloc.c(pf->pf_flags & (P_QUEUE | P_HASH)) == 0pgtalloc.c(pf->pf_flags & (P_QUEUE | P_HASH)) == 0pgtalloc.cpf->pf_next == NULLpgtalloc.cpf->pf_prev == NULLpgtalloc.c(pf->pf_use & (setmask[nfree] << ndx)) == 0pgtalloc.cpf->pf_next != NULLpgtalloc.cpf->pf_prev != NULLpgtalloc.cpfd1 <= toppgtalloc.cpfd1 - pfd == npgspgtalloc.c~ @(#)physio.c 5.1 87/05/29 IO err in swapphysio: useracc failed @(#)pipe.c 5.1 87/05/29 @(#)prf.c 5.1 87/05/29 0123456789ABCDEF%d%d:%d%d:%d%d Double panic: %s panic: %s %s on dev %d,%d device error bn = %d er = %x,%x assertion failed: %s, file: %s, line: %d assertion errorWARNING: system table overflow: %s (%s) @(#)probe.c 5.1 87/05/29 @(#)rdwri.c 5.1 87/05/29 @(#)region.c 5.1 87/05/29 regionsREGIONSrp->r_flags & RG_LOCKregion.ci <= limregion.cpt != 0region.crp->r_flags & RG_LOCKregion.cup->u_procp->p_flag&SLOADregion.crp != NULLregion.crp->r_flags & RG_LOCKregion.crp->r_list[0] != 0region.crp->r_flags & RG_LOCKregion.csize > 0 && size <= NPGPTregion.cpfd->pf_use != 0region.cswpuse(&map) != 0region.cdupregrp != NULLregion.crp->r_flags & RG_LOCKregion.cchange >= 0 || (-change <= rp->r_pgsz)region.crp->r_refcnt == 1region.csize > 0 && size <= NPGPTregion.cgrowreg - ptmemall failedgrowreg p1 - ptmemall failedj >= 0 && j < NPGPTregion.clim >= j && lim <= NPGPTregion.cfindreg - no match @(#)sched.c 5.1 87/05/29 swapout(%d) p->p_flag & SLOCKsched.c @(#)sem.c 5.1 87/05/29 ԀX0|, @(#)sig.c 5.1 87/05/29 !2!2!2!2!2!2!P!2!2!2!P!P!P!P!P!P!P!2!2!2!2!2!2!2!2!2core @(#)slp.c 5.1 87/05/29 proc on q @(#)startup.c 5.2 87/06/07 %s release: %s version: %s on %s real mem = %d avail mem = %d @(#)subr.c 5.1 87/05/29 @(#)swapalloc.c 5.1 87/05/29 *cntptr != 0swapalloc.cswpuse count overflow - %s @(#)swtch.c 5.2 87/10/16 @(#)syscall.c 5.1 87/05/29 @(#)sysent.c 5.3 87/09/30 @LXPTP @H<t`٨@@۰p@d@Ȩ(Xh@~h@@Vո8(ADT@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@XH_cp\hXgYZg4]jb_dc`<i@@h@@dA@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@Aɐ4 @(#)sysmachdep.c 5.2 87/09/30 A\AdAlAtAAĀAԀABPBB,BB @(#)text.c 5.1 87/05/29 xalloc - bad magic @(#)time.c 5.2 87/10/08 W`/Lw/K:/JMFw/ @(#)timeout.c 5.1 87/05/29 timeout table overflow @(#)trap.c 5.1 87/05/29 SR|RRSdSdURSRHUS$T TDT|TTU$U\UT%x regsave != 0trap.cPROT or TRANS fault: va=%x pte = %x no pte trapuser = pid = %d uarea = %x ps = %x pc = %x trap type %x Privilege Violation at Address %x for Process %d comm %s Invalid Kcall at Address %x for Process %d comm %s Illegal Instruction at Address %x for Process %d comm %s Data Alignement Error at Address %x for Process %d comm %s Accessed Address %x Illegal Trap %d at Address %x for Process %d comm %s Memory Parity Error at Address %x for Process %d comm %s pid %d killed due to page fault read error comm %s syscall Integer Overflow at Address %x for process %d comm %s Integer Zero Divide at Address %x for process %d comm %s Real Overflow at Address %x for process %d comm %s Real Underflow at Address %x for process %d comm %s Real Zero Divide at Address %x for process %d comm %s Inexact Result at Address %x for process %d comm %s Real Before Trap at Address %x for process %d comm %s Check Instruction Failed at Address %x for Process %d stray interrupt at %x @(#)utssys.c 5.1 87/05/29 @(#)i_syscl.c 5.1 87/05/29 return from bind(%d,%x,%d)=%x acceptsorry no struct file lib rights lib from sockargs:copyin from:%x to:%x len:%d @(#)i_usrreq.c 5.1 87/05/29 mmԀmmnnDn8nnoxqq$q,q4q8q<q@n$qHqDuipc_usrreq(%x,LISTEN) uipc_usrreq:accept(%x,%x,%s) uipc_usrreq:shutdown(%x,%x) uipc 1uipc_usrreq:rcvd(%x,%x) uipc 2uipc_usrreq:send/dgram(%x,%x) uipc 3uipc_usrreq:send/stream(%x,%x,%x) uipc 4piusrreqIPUTIPUTunp_connect2unp_disconnectunp_externalizeunp_gcunp_gcscan @(#)sys_socket.c 5.2 87/10/26 @(#)acct.c 5.1 87/05/29 @(#)alloc.c 5.1 87/05/29 bad free countno spacebad blockout of inodesbad countno fs @(#)bitmasks.c 5.1 87/05/29 ???? @ @ @ @ @(#)blklist.c 5.2 87/07/22 ip->i_map == 0blklist.cindlvl >= 0blklist.cip->i_mapblklist.c @(#)exec.c 5.1 87/05/29 @(#)exit.c 5.1 87/05/29 @(#)fork.c 5.1 87/05/29 no procs @(#)grow.c 5.1 87/05/29 rp->r_pgsz+change >= 0grow.c @(#)ipc.c 5.1 87/05/29 @(#)lock.c 5.1 87/05/29    @(#)ptrace.c 5.1 87/05/29 l؀  @(#)shm.c 5.1 87/05/29 shmat: prp6d@` @(#)sys1.c 5.1 87/05/29 @(#)sys2.c 5.1 87/05/29 @(#)sys3.c 5.2 87/08/07 h|ːˤЀ8|mountNMOUNT @(#)sys4.c 5.1 87/05/29 X᐀Ȁ8p @(#)bsdcompat.c 5.2 87/09/01 selwakeup @(#)i_domain.c 5.1 87/05/29 @(#)i_mbuf.c 5.1 87/05/29 mbinitm_expand() = 1 m_expand() = 0 mgetm_get(%s):%x m_getclr: mbfree twice-- m_free(%x):%x m_more(%d,%s): failed mgetm_morem_more(%d,%s):%x m_freem(%x): NULL mbfree twice MBFREE(%x,%x)m_copy(%x,%d,%d): empty m_copym_copym_copymget MBGET(%x,%d,%s) %x nospace(%x) m_cat(%x,%x): joined(%x,%x) new(%x) m_adj(%x,%d) %x m_pullup(%x,%d): mgetbad %x (4@LXdlt|MT_FREEMT_DATAMT_HEADERMT_SOCKETMT_PCBMT_RTABLEMT_HTABLEMT_ATABLEMT_SONAMEMT_ZOMBIEMT_SOOPTSMT_FTABLEMT_12MT_13MT_14MT_15 @(#)i_proto.c 5.1 87/05/29  m@m@z0~T~tzH֨,unix @(#)i_socket.c 5.1 87/05/29 socreate(%x,%x,%d,%d) solisten(%x,%d) sofree(%x) sofree dqsoclose(%x) soclose: NOFDREFsoabort(%x) soaccept(%x,%x) soaccept: !NOFDREFsoconnect(%x,%x) soconnect2(%x,%x) sodisconnect(%x,%x) sosend(%x,%x,%x,%x,%x)sosendmget!%x,%dsoreceive(%x,%x,%x,%x,%x) receivereceive 2receive 2areceive 3?%x,%d(%d)mbfree twicereceive 4mbfree twicesoshutdown(%x,%d) sorflush(%x) <<<: old=%8x, new=%8x SASINTR: type=%2x, pdev=%2x, ioir=%8x, cr=%4x sasintr: type=%2x, pdev=%2x, apres IT etat=%4x sasintr: type=%2x, pdev=%2x, IT fantome ... /etc/emc/ @(#)mem.c 5.1 87/05/29 @(#)mt.c 5.1 87/05/29 not ready statusoffline statuswrite protected%s on mt %d mtcommand(%x, %x, %x) mtstrategy:blkno %d,nxrec %d,b_blkno %d density switch not on BOTdensity not availablemt %d : error blkno(%d) > nxrec(%d) LrLLLLLLLLrLLLLVLLLLLLLLVmtstart(blkno %d,nxrec %d,b_blkno %d) mtstart:b_active = %x end of tapemtstart:cmd(%x) mode(%x) addr(%x) bcnt(%x) QȀVVWVspurious interruptmtintr:cmd(%x) mode(%x) ioir(%x) blkno(%d) nxrec(%d) unknown commandZZZPZlZmtioctl(%x, %x, %x ,%x) (8((8(((8( @(#)prof.c 5.1 87/05/29 @(#)pty.c 5.4 87/09/21 aab,ab@bbXabh @(#)rawnet.c 5.3 87/10/19 rnetwrite: out of mbufs rnetwrite: out of bigbufs @(#)smd.c 5.1 87/05/29 no vtoc areabad block list too longinvalid partitionSMD d_write errorSMD disc error}ʀ}ʀ}ʀ}Ѐ}Ѐ}Ԁ}Ԁ}Ԁ}Ԁ}Ԁ}Ԁ}Ԁ}ڀ}ڀ}SMD d_read errorSMD d_read errorSMD d_read errorSMD d_read errorSMD d_read errorSMD d_read errorSMD d_write error%s on disk %d `dp|搀椀洀ĀԀ,< Off Line Timeout Equipment Fault Write lock error Tranfer error Data overrun Sync. error header error CRC error in header Data check Seek failure Unknown drive type Unknown error Illegal param. in DCB order @(#)smlog.c 5.1 87/05/29 SYSTEM MESSAGE LOGGING OVERFLOW @(#)sxt.c 5.1 87/05/29 LLL``X4<܀Ԁnnn@tnnnn|sxt cannot allocate link buffers @(#)sys.c 5.1 87/05/29 @(#)tt1.c 5.1 87/05/29 Flush(%x) ЀH({)}!|^~'`\\ @(#)tty.c 5.1 87/05/29 $*|̀((<<PPPPP<<<<<<xx|`{}~ABCDEFGHIJKLMNOPQRSTUVWXYZ @(#)tv.c 5.1 87/05/29 014B DF@(#)wbal.c 5.2 87/09/21CIO %d PROM Rev: %x CIO %d CODE Rev: %x CIO %d PCA Conf: %x CIO %d :Error - Board Firmware version must be %x or greater. WBCIO: error wbreset %x %x %d ΘtϰҸ̀ӼΨЀpWBCIO: error wbflush %d WBCIO: error wbflush %d CIOerwrit hd!=tl %x %x %x WBCIO: error wbsendxoff %d WBCIO: error wbsendxoff %d WBCIO: error wbsendxon %d WBCIO: error wbsendxon %d WBCIO: error wbsetbrk %d WBCIO: error wbparam %d %x WBCIO: error WBCtest0 %xWBCIO: error WBCtest1WBCIO: error wbresetbrk %d WBCIO: error wbmodem &d WBCIO: error wbmodem &d |錀需鬀鼀z딀쌀묀쌀PCIOerit case= %x CIOstit case= %x WBCIO: error wbintr &d O.S. messages -- OFF O.S. messages -- ON  2Kn,X `%K @(#)wbct.c 5.6 87/10/15 cartridge not loadeddensity switch not on BOTcartridge write protected ,LĀ؀ l Ȁend of read tape_mark timeout on ct %d end of skip block timeout on ct %d end of skip end of data timeout on ct %d end of write tape_mark timeout on ct %d end of rewind timeout on ct %d end of erase timeout on ct %d end of retention timeout on ct %d end of load timeout on ct %d end of unload timeout on ct %d end of test_ready timeout on ct %d end of inquiry timeout on ct %d end of mode-select timeout on ct %d end of mode-sense timeout on ct %d end of prevent_removal timeout on ct %d end of allow-removal timeout on ct %d end of request-sense timeout on ct %d end of read block timeout on ct %d end of write block timeout on ct %d end of write raw timeout on ct %d end of read raw timeout on ct %d $`4Ѐ    Pnnn؀ Hnnnnnn nnnnn End of cartridge on ct %d End of cartridge on ct %d d_write failed on Start IO Order on ct %d %s on ct %d h l Ԁ ؀#dxX$0X f f f f f f f%|&^&^&^&^&^#&^%&^&^&^&^&^#End of cartridge on ct %d End of cartridge on ct %d End of cartridge on ct %d End of cartridge on ct %d File mark detected on ct %d End of cartridge on ct %d Illegal request on ct %d End of cartridge on ct %d Illegal request on ct %d End of cartridge on ct %d End of cartridge on ct %d End of cartridge on ct %d Illegal request on ct %d End of cartridge on ct %d Illegal request on ct %d End of cartridge on ct %d End of cartridge on ct %d End of cartridge on ct %d )))))))@(#)wblp.c 5.4 87/09/2100/1܀..LP: *** Error - LP Order = %x after interrupt. (Should be 0) LP: *** Error - Return status byte = %x after interrupt. LP: *** Error - StartDMA called while DMA in progressLP: *** Error - About to start DMA, but LP Order is not 0. Order = %x 6n69999778X @(#)clist.c 5.1 87/05/29 @(#)partab.c 5.1 87/05/29  @(#)kdbn.c 5.1 87/05/29 %s %x temporary %x permanent %x perm %s pid = %d %2x%8x: R%dVVVVVVĀV؀WW4W8%8x, %s %8x: %2x%2x%2x%2x%2x%2x %3u %s %d R%2d: %8x SR%2d: %8x %8x : %2x = ffheĀee`e<dȀddddhd\ggg(g\g\g\g\g\gHg\g\g\g\g\g\g\g0R2 : %2d Addr2 : %8x Mode : %s %s PC : %8x pid = %d %s %s Address : %8x pid = %d 0123456789ABCDEF Ѐ  P   0 p    X  ̀  D |    X   , < P ` p | ̀ Ȁ Ā Ѐ ܀ ?? LOAD , LOADB , LOADH , LOADD , LADDR , STORE , STOREB , STOREH , STORED ,  $ 0 < H T ` l x               , 8 D P \ h t               ( 4 @ L X d p |               $ 0 < H T ` l x                , 8 D P \ h t               ( 4 @ L X d p |   xxhhxxhh((88HHXX((88HHXX((88HHXX((88HHXX     0 \    ( H l     BCDEGHKMSTL      , @ P ` p     Ѐ    \   Ā    , list of commands (all numbers in hexadecimal): ---------------------------------------------- b [address] - set breakpoint (Phys. Addr.), or list all breakpoints bv [address] - set breakpoint (Virt. Addr.), or list all breakpoints bt address - set TEMPORARY breakpoint (Phys. Addr.) btv address - set TEMPORARY breakpoint (Virt. Addr.) ca - clear all breakpoints cb [address] - clear breakpoint (physical addresses) cv [address] - clear breakpoint (virtual addresses) d address [count] - display data (physical addresses) dc address [count] - display code (physical addresses) dcv address [count] - display code (virtual addresses) dd dev unit part - dump memory on disk (dev, unit) , partition(part) dr - display registers dv address [count] - display data (virtual addresses) e - exit debugger g - go to the end of current function k - kill current process or go to Panic load - used to reboot from disk (dev, unit) m address - modify sequential data bytes s - single step t address [segno] - virtual to physical address translation Integer Overflow Integer Zero Divide Real Overflow Real Underflow Real Zero Divide Inexact Result Before Trap USER PRIVILEGEDKERNEL DEBUG ELOGR ELOGW TWRITEC TWRITED FLUSH TRAPEXIT ITEST REGN REGNB VERSION MAINT MOVE , NEG , ADD , SUB , MPY , DIV , REM , NOT , OR , XOR , AND , CBIT , SBIT , TBIT , CHK , NOP MOVEI , ADDI , SUBI , MPYI , NOTI , ANDI , CHKI , FIXT , FIXR , RNEG , RADD , RSUB , RMPY , RDIV , MAKERD , LCOMP , FLOAT , RCOMP , EADD , ESUB , EMPY , EDIV , DFIXT , DFIXR , DRNEG , DRADD , DRSUB , DRMPY , DRDIV , MAKEDR , DCOMP , DFLOAT , DRCOMP , TRAP SUS , LUS , RUM , LDREGS , TRANS , DIRT , MOVESR , MOVERS , MAINT , READ , WRITE , TEST > TEST < TEST = CALLR , TEST > TEST < TEST = RET , TEST <=TEST >=TEST !=KCALL TEST <=TEST >=TEST !=LSL , LSR , ASL , ASR , DLSL , DLSR , CSL , SEB , LSLI , LSRI , ASLI , ASRI , DLSLI , DLSRI , CSLI , SEH , BR > BR = CALL BR > BR < BR = LOOP , BR <=BR !=BR BR <=BR >=BR !=BR > BR = CALL BR > BR < BR = LOOP , BR <=BR !=BR BR <=BR >=BR != Debugger Call Invalid KCALL %d Data Alignement Error Address : %8x Illegal Instruction Opcode : %2x R1 : %2d Parity Error Code Fetch Address : %8x Parity Error Execute Address : %8x Page Fault Segment : %4x Address : %8x Kernel Violation Opcode : %2x R1 : %2d R2 : %2d Check Trap R1 : %2d R2 : %2d Invalid Trap # : %d External Interrupt Device # : %x Switch 0 Interrupt Powerfail Warning End Power Glitch Timer 1 Interrupt Timer 2 Interrupt Reserved Vector Exception Virtual PhysicalStep Break-Pointdump OK invalid partition no VTOC area invalid device invalid unit expected count expected address breakpoint table is full KDB> invalid text address invalid virtual address invalid text virtual address invalid command internal error, attempt to set afterpermbreak break twice internal error, can't find AFTERBRANCH breakpoint expected segment number pc break type %x is not an even address no breakpoint set at %x physical address = %x d_write error = %x IO error %x oXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXofotoooooooȀoԀooopp @(#)if.c 5.1 87/05/29 2 @(#)raw_usrreq.c 5.1 87/05/29 ~h0@Ȁ@Ԁ4@@@Hl`raw_usrreq @(#)route.c 5.1 87/05/29 rtfree @(#)af.c 5.1 87/05/29   ((       @(#)raw_cb.c 5.2 87/09/01 @(#)if_loop.c 5.1 87/05/29 lolo%d: can't handle af%d @(#)in.c 5.1 87/05/29 @(#)in_proto.c 5.1 87/05/29  1P 0p 1LH@글  ` P~tinternet @(#)ip_icmp.c 5.1 87/05/29 icmp_errordd~dd<ddH| @(#)ip_input.c 5.2 87/09/01 ip_initforward: src %x dst %x ttl %x 2 @(#)ip_output.c 5.1 87/05/29 @(#)raw_ip.c 5.1 87/05/29  @(#)tcp_debug.c 5.1 87/05/29 p %s>,URG,,RST,FIN,ACK,SYN<%x%s %x %s:???????? [%x..%x)@%x, urp=%x%s%s%s%s%s%s%s%s%s%sPUSH%s%s<%s> -> %s rcv_(nxt,wnd,up) (%x,%x,%x) snd_(una,nxt,max) (%x,%x,%x) snd_(wl1,wl2,wnd) (%x,%x,%x) 5 5 5 5 5 5( 50 5< 5H 5P 5X 5` 5h 5p 5x 5 5 5 5 5 5 5Ȁ 5Ԁ 5܀ 5 5 5 6 6 6 6( 64 6@ 6L 6T 6\ 6d 6l 6t 6| 6 6ATTACHDETACHBINDLISTENCONNECTACCEPTDISCONNECTSHUTDOWNRCVDSENDABORTCONTROLSENSERCVOOBSENDOOBSOCKADDRPEERADDRCONNECT2FASTTIMOSLOWTIMOPROTORCVPROTOSENDCLOSEDLISTENSYN_SENTSYN_RCVDESTABLISHEDCLOSE_WAITFIN_WAIT_1CLOSINGLAST_ACKFIN_WAIT_2TIME_WAITREXMTPERSISTKEEP2MSLinputoutputuserresponddrop @(#)tcp_input.c 5.3 87/09/01 lllllllNxĠĴƢƢƬƸtcp sum: src %x tcp off: src %x off %d tcp_pulloutofband @(#)tcp_output.c 5.3 87/09/18 mgettcp_outputtcp_output REXMT @(#)tcp_subr.c 5.2 87/09/01    in_cksum: out of data @(#)tcp_timer.c 5.2 87/07/28 LDd>???33?ٙ@@@@AAB @(#)tcp_usrreq.c 5.1 87/05/29 ඀0Hl0 p☀⤀܀T㸀Ȁtcp_usrreq往往往ԀԀ @(#)udp_usrreq.c 5.1 87/05/29 (h뀀됀똀̀Ԁހ씀Ѐ܀ހހ찀Āހހހudp_usrreq @(#)in_pcb.c 5.2 87/09/01 @(#)wonder.c 5.1 87/05/29 @(#)wonder.h 5.1 87/05/29 @(#)lance.h 5.1 87/05/29 wbnetwork interface down network interface down network interface down ethernet initialized wbet%x: can't handle af%x resetting interface LANCE has been stopped removing interface LANCE has been stopped excessive retries on transmission, TDR value = %x <DLT Reading from CIO: IOAddr = %x; error =  Writing to CIO: IOAddr = %x; IOData = %x; error = IO time outIO data not validIO time out and IO data not validunknown error: %xbad command = %d, err = %x bad checksum in address PAL; command = %x, err = %x invalid error or command returned; cmd = %x, err = %x could not read physical address could not write initialization block could not write recv descriptor ring could not write xmit descriptor ring could not write LANCE registers could not write LANCE registers; err = %d error waiting for Init Done interrupt, err = %d could not write start command in CSR0; err = %d GetXmitBuf: ran out of xmit buffers All receive buffers used by one packet! &&&&Ѐ&&&&self test error: LANCE register testlocal memory testshared memory testLANCE initialization testunknown self test error, error = %x cannot enable CIO ethernet command interrupts %d could not write CSR0; err = %d cannot enable CIO LANCE interrupts %d %x paquets veroles @(#)mapa.c 5.1 87/05/29 @(#)if_ether.c 5.1 87/05/29 duplicate IP address!! sent from ethernet address: %x %x %x %x %x %x .text 0.data@0 .bss @.text!0x.datap ".bss @.text!.data8.bss @.text!@,.data@.bss @.text&(.data8.bss @.text(8.data8.bss @.text)HX.data8.bss @.text*X .data8.bss @.text,(.data8.bss @.text- .dataP.bss @.text- .data`.bss @.text<.datah8.bss @.text@ .data .bss @.textAb.data .bss @.textIP@.data.bss @.textWd.data8.bss @.text^HW.data%.bss @.textn  .data.bss @.textz.data.bss @.textp .dataX@.bss @.text`Q.dataX.bss @.textP.datah.bss @.text8.dataX.bss @.text D.data0 .bss @.text8 .dataPH.bss @.textk.data .bss @.text.data.bss @.text `.data.bss @.text8.dataH.bss @.text.data .bss @.text..data.bss @.textp .data( .bss @.textu.dataH .bss @.text#.datah(.bss @.textX0'.dataP.bss @.text .dataP .bss @.textp 2.data0.bss @.text"A.data(.bss @.text&.datap.bss @.text.p5.dataP .bss @.text3 `F.datap`.bss @.text<%.data .bss @.text>@.data .bss @.text@.data@.bss @.text@X#.dataPX .bss @.textC(A.dataŨ8.bss @.textG0.data.bss @H.textKx$.datap8.bss A.textPpH.dataƨ.bss A.textV.dataX .bss A.textX@.datax.bss A.textm8@t.data.bss A.text{x.data .bss A.text~`Y.data .bss A.text`Q.data(x.bss A`.text@.dataΠ.bss Ax.text@.dataHp.bss Ax.text .dataи .bss Ax.textI.data .bss Ax.text0i.data0.bss Ax.text@.data(@.bss A.text0 .datah.bss A.textP2.dataр8.bss A.textX@.dataѸ .bss A.text.dataHP .bss A.text8 .dataҘ .bss A.textP p.dataҸ .bss A.textH.dataP.bss A.textx_.data(@.bss A.text.datah0.bss A.textp.dataӘ .bss A.textp.dataӸ.bss A.text.dataֈ .bss A.text.dataP .bss A.text@ a.data.bss A.text#@.data@.bss A.text%N.dataX.bss A.text).dataX.bss A.text.data /(.bss A.text(.data /0.bss A.text(.data / .bss A.textX.data /H.bss A.text .data 0 .bss A.text.data 08(.bss A.textPB.data 1`.bss A.text@P.data 2.bss A.textx.data 2 .bss A.text .data 2H.bss A.textD.data 2/.bss A.textXHr.data 6.bss A.text̠x".data 7h.bss A.text8.data 7@.bss A.textP.data 80.bss A.textH.data 8Hh.bss A.text 5.data 8.bss A.textA.data 9X.bss A.text (.data : .bss A.textH7.data :8.bss A.text-.data @0 .bss B .text-.data @P.bss B .text.`.data @P.bss B .text/0.data @P.bss B .text/8.data @P.bss B .text3 ;.data @Px.bss B _start _ccbsyscall!ispstend8)_clrmemLpp_bootdevp_rootdevp_pipedevp'k41&< B(Fq_main_uRP_proc0_u`intstackP_ftbitsp \pjpvp_putchar!8``_getchar!X``!x`$`!`!`_acctbuf B`_acctp B`_cfree B`̀ {`_pbuf {P`׀ `_hbuf `_file `_inode `_proc (`_sptmapp``_callout (`_mount2(`_err``_sysinfo3h`_syswait4`_syserr4`_minfo48`_v`_pregpp`_region4p`_ractivep`_rfree`_phead`_pfdat`_phash`_ptfree``_tune`_swaptab```8` %`_inoinitz `h`_cinit-`_binit8`_errinitA`_finit^ `_iinit` _`_socinit~ `_smdctab`_smdutab`_smdbuf`_smditab`_smdstat`_wbcttab(`*8`6(`@`_ctstat`J`_wb_al`T`_(`_mtbuf(`_mttab`_mtcmd(`_mtstath`_vmtbuf(`_ctrbsy(`_sxt_cnth`_msgmap0`_msgqueP`_msglock`_msgh`_msginfop`_sema`_sem `_semmap!`k2(`_semuB(`_semtmpMh`_seminfo`uR(`_shmem(`_shminfo`_mbutlX```_mbstat``_mbfree`_mclfree`_mbmap``_flox`h`_maxpmem`_pt_tty0`0`_bdevsw`_smdopeno0`q`sl`̀`_mtopenA`_mtcloseC`׀F`_mtprintE``4``4`_cdevsw0``˨`&0`0|`;`_syopenP`_nulldev@`_syread`_sywrite`_syioctl(`_mmreadH`_mmioctl@T`_smdread`F``P`_prfread[8`Z[`d\`_nodev@`n'`x(`(`*`,,`,`-`6$`_mtreadW`_mtwriteXL`_mtioctlYH`_sxtopen`À`_sxtreadt`̀`׀\`_ptsopen^`^`_ptsread_0```j8`_ptcopenb`c`_ptcreadd` fH`h`_smopen`_smclose`_smread4`,H`'k`1l `<l `Fm8`Qn`_bdevcnt``_cdevcnth`_confswp`_smdintr{`\X`fT`p`z3``_mtintrO`0`_dblev `_ciotype(`_confcnt8`@`h`)`@``̀`׀X`_dstflag``_swplo0`_utsnameh`_lineswx|_ttopen|_ttclose`|_ttread|_ttwrite|_ttioctl|_ttin|_ttoutp||_sxtinl|_sxtout$|_tvopen|_tvclose\|_tvioctl|_tvinŰ|_linecnt|_termsw|_termcnt|!alltraps#zXsyscall!!_syscall>Xkcall"_i_kcalloXXalign",_i_alignof"@_i_instrotXfparity"T oXeparity"hoXkerviol"|_i_pvioloXcheck"_i_checkoXtrap"_i_trapo "Xswtch0"_i_sw0oXpwroff"_i_pwfoXpwron# _i_pwonoXclock# Xcl100#L_tictac1Xcallout#TXres#h_i_resp_trapPxtrap_ret$__debug0+_clock<54_runrun5_idle&_spl0+A&dK&fXpage&U&_rbsave`_old_ps_pfaultIXH_vfaultKHk(Hw):Hbad_addr):H_fubyte(_subyte( _fuword(4_fuiword(4_suword(P_suiword(p_copyin(_copyout(*_addupc*_spl1+0_spl4+0_spl5+|_spl6+|_spl7+|_splhi+|_splx++,x,,ǀ,р,ۀ,_icode,{@_szicode-{@ispstack8{@_bread-(8_getblk28_iowait6X8_breada-8_incore2$8_brelse18_bwrite/8_bdwrite0h8_lbolt88_bawrite08_wakeup$8_panicנ8_sleep"8_geteblk5(8_iodone68_clrbuf7L8_bzero/L8_bflush78_binval88_maxmem@8_debug@88_sbufH8P8_ksctX8_kbase`8_bdflush; 8h_timeinN<_prfstatp_prfintr]lx_curpri|_lticks~_time_freemem_psignal*_vhandn(4_runin@_print{@_setlevAD{@_suser\{@_mfreeLA_malloc@VB_geterecC_puterecC`DX_logtchgEjF_blkacty_fmtberrFdtG_logberrH~I_findreg4_reglockP._pfree_premove\_swfree15(_regrele.U0_pfindX_assfail_ptfill_pinsert_swap@_prdev0V_bcopy/_getfW(_closefW(ˀm(_unp_gcxp(׀}((_plock(_closep(_iput~D(_setjmp.d(_prelex(_openiZH(_openp(_access[L(_getfs(_xreleF,(_owner\8(_uchar(_namei(_ufalloc](_falloc]T(_provflH(_findfid^P_fids^_frfid_freefid_4_frlock_insflck`_delflcka_regflckb_flckadjcL_blockedg_getflckh_convoffl_setflckjm\ _max/,_printfo#p.r8v_swpinc6_memfreexC_swalloc3M_uaccess_uservadX_hinode_igetzc_iread|_itrunc_ifree|_iupdatL_itrunc2o_bmap._s5tloopD_free_maknodeD_iallocd_wdir_writei_iflush,_readiz$d_clkset|_stat1d_sendsig~_growT~_bcmpl~_setregs~_edata @~_chksize~_maxumem~~~~_physmem_meminit_ksv_sz _pall(ǀ0_userpte8_mmvad@_mmpteH_curprocP_msginit_seminit_startup-`_rootdirX_meload)_devinit(_newprocՀ߀@_growreg_sched`_maxupts`_masktab|_iomove }_pcopyin}}_schar}_passcD}_cpass}_msgconv@(_msgctl$(_msgfree`(8(_msgfph(_msgget4(_ipcget(_msgp(_msgrcv(_msgsnd(_msgsys(_sptfill\ _min/  _stfill\ _sptfree| _flush. _maxfreex _ipflush _pmount  _runout| _swtch=  _pgtmap%_pgtfreed_setmask_nptfree/ż:F@PƐ_physioʸ_useraccx_physckX_pipe~@_printc֠_pr_time_printnT_pr_hour_timelapG_pr_dst_smwrite_update_smdsyncp_prcomب_reginit_freereg\hLs$_dupregD_swpuse58_loadreg_uclear_mapregLH_chgprot_setrq% _swapout _semaoe X_semfupX_semunpX_semconvTX_semctlX_semunrm X_semexit<X_semgetX_semopX_semundo\X_semsysX_signalx8_setrun%8_issigD8_fsig!x88_psig h8_stop`8_core!8_exit8_hsqueH_longjmp.|H_runqHˀ&_end_etext<ր,\_p0init)H _pfhead _allochX< F_swapadd6_swapdel84_getswap9|_swaprem98_unswap;_qswtch<}P_save-}P }P_resume. }P_nsysentH} _sysent0} _nosys@} _nullsys@} _rexitL`_fork`_readX`_write`_open`_close`_wait`_creatP`_linkT`_unlinkP`_exec `_chdir`_gtime`_mknod`_chmod`_chown`_sbreak`_stat@`_seekH`_getpid<`_smount`_sumountt`_setuid``_getuid٨`_stime`_ptrace`_alarm`_fstat`_pause`_utime@`_stty`_gtty`_saccess`_nice`_sync۰`_killp`_setpgrpd`_dupȨ`_times(`_profil`_lockX`_setgid`_getgid`_ssigh`_sysacct~h`_shmsys`_ioctl`_utssysV`"ո`_exece`_umask`_chroot`_fcntl`_ulimit8`_geteuid`_getegid`_ftime(`_rebootT`_socketXH`,_`6cp`_connect\h`_bindX`@g`_listenY`_acceptZ`Lg4`V]`bj`ob`_sendto_d`_recvmsgc`_sendmsg`<`yi`h``d`A`ɐ`4`ǀ@~ԀAH~$~_xallocC0_xumountE4_xuntextGJ~K~_timeoutLP_timeid P MP_delayOP_mapa-h_strayVh _getsockl "l<_sobind_m_freemt ,4 6_m_get A K V_sofree_sendit`_sosend_recvitd b  mx y_m_free0   m@ q q r ƀs Ӏu  u  v  w + 7 E Ov Y h wL  H_m_copy  v_ufavail {L ̀  ׀ _sbwaitp {  zT_soo_rw{~ |~_ifioctlu~_rtioctlD~ }~_soclose~_mbinitx~_ifinitr~ x~_acct} } !_sbittabHz_cbittabz_bldindr~_gethead  +_shmexec<_punlock_get410_execreg (_pexit<~_shmexitH~_shmforkT_procdup 5d @<} J} T}_tunlock}_dunlockp}_procxmt_ipc P ^_ipcreg ih_shmconvh_shmctlh_shmdt@h_shmget`h_rdwrX_sorwuio|X_copenX_mgetdev8 t#_chdirecH }_uiomove} L}_domains `~ 0~ 0X~ ~ d~ Ā ~ Ѐx~ ݀~ 8 8 8_m_moreP8_m_cat8_m_adj8 8_unixsw֨{( z0{( ~T{( +~t{( 7z{( AP L_soabort0 V$ d  s HH H `H H_sbflush!H_sbdrop!H #H|_d_read3_cfdebugP ˀ(P Հ._d_write3_ctladdr)$_medma h x_nomfic_nomdir_gethdr1_metrace :_dcb0adr_dcb0 8d_mewait3P 8 : 5_metoid_meflag_merev; !;l +;_sasintr5 59  ?9 JEL _mtwaitX _mtdebug _mtstartJ4 _k_tab _C_tab _c_tab _d_unit _mt_cnt _prfmax}_prfsym"(}_prfctrB(}_ttinit4 Uk `b_getcbp>_getc:_ptsproc` kad_ttrstrtü u_ttlowatH f_putcbp?_putc;_ttiocom_putcf<_getcb=0 hH b0H nH o H q ŀv_smdbbu π{  ڀ _sm_rpt} b8}_sm_wpt} j8 P_sxtfree@d_sxtbufj_sxtbusyj_sxtinit_sycheck{_canon4_tthiwat_getcf 2HL,_ripdst 2}X 2}_ripsrc 2}bxmuxwux 4x_tanames 4x 4Hx 4x_tcp_issxxxx_tcpstatx 4xȀ 7Ҁ 7xހȬ`$6@K؜VhD{ 8x̨d 7ӄ 7̀רڀ 8 8\`!`1`=`L`[`k`{ 9H` 9P`(`_udpstat :_udp_in :@ɀPӀ8 ހX(.8_WB_Init&(C3N5Ydhn @(y_WBWriteŀ8d_WB_Read(,π _WBRead܀DtH!h6 l2P=XGVddw_SleepOK# pʀ_Statsx؀Ll,\;dJT_j<xpȀـT(#D!0-$P?%O @c @ m8_copyseg.@y.@_udiv/udiv/_urem/urem/3@_arpcom@`4D`H`_arptabP`:`_arptnew;\`_btext _bdata@_bbss @_sizememory__last_addr_mcversion_kdb_init_vadrspace_sys_sect_call_debug_fdlp_dcb_ftPageTables_ftHeadwall_machineid_cio_putchar_cio_getchar_breakchar_cio_breakchar_x25_attach_iomd_intr_bfreelist_pfreelist_phashmask_nextswap_swapwant_init_tbl_iomachdep_clkstart_flckinit_wbctcombuf_wbctrbuf_wbct_buf_wbal_tty_wblp_lpdt_wblp_lpbuf_sem_undo_shm_shmem_mclrefcnt_nmbclusters_flckinfo_flinotab_pt_ioctl_smdclose_smdstrategy_smdprint_mtstrategy_wbctopen_wbctclose_wbctstrategy_wbctprint_wbalopen_wbalclose_wbalread_wbalwrite_wbalioctl_smdwrite_smdioctl_prfwrite_prfioctl_wbctread_wbctwrite_wbctioctl_wblpopen_wblpclose_wblpread_wblpwrite_wblpioctl_sxtclose_sxtwrite_sxtioctl_ptsclose_ptswrite_ptsioctl_ptcclose_ptcwrite_ptcioctl_wbetopen_rnetopen_rnetclose_rnetread_rnetwrite_rnetioctl_wbetintr_wbetctrl_wbalintr_wblpintr_wbctintr_conf_devs_dev_init_wbalinit_wblpinit_wbctinit_wbetattach_loattach_timezone_sxtrwrite_xdbgcall_xsyscallXillinstr_i_dbpe_cf_i_dbpe_exXinterrupt_ext_intr_addupc_clk_kcall255_kcall254_call_rbug_idle_addr_copy_start_copy_end_headwallLight_searchdir__HeadwallDiag_HWLoadEnable_R32LoadEnable_HWSerCmd_ml_elogr_ml_elogw_sptalloc_bufstart_panicstr_switching_new_scheduler_slice_ticks_vhandcnt_bdflushcnt_slice_size_geteslot_freeslot_logstart_logstray_fmtraerr_logmemory_ptmemall_copypage_clearpage_pageincache_memreserve_killpage_cleanlocks_soo_close_ffreelist_allocfid_deadflck_sleeplcks_getpgslim_ageprocess_ageregion_getpages_swapchunk_pbremove_ublk_ptbl_ifreelist_freeblklst_s5itrunc2_HWGetDate_coredump_findpreg_HeadwallDiag_firstfree_allocator_pgtalloc_pgtallocator_allocreg_attachreg_pcopyout_ipcaccess_punmount_startup_pgtalloc_ptmalloc_kpgtfree_getcpages_nptalloced_freepage_contmemall_nullregion_chkattach_nullpregion_loadstbl_detachreg_rptexpand_chkgrowth_bldblklst_lockedreg_freeproc_next_page_mktables_ublk_sgtbl_p0init_done_cfreelist_swapfind_swapclup_lastproc_swapfunc_socksend_sockrecv_setsockopt_shutdown_socketpair_getpeername_recvfrom_getsockname_getsockopt_setreuid_setregid_sysmachdep_truncate_ftruncate_traptoround_roundtotrap_HWClockCommand_timetoYMDHMS_YMDHMStotime_untimeout_socreate_sockargs_solisten_soqremque_soaccept_soconnect_soconnect2_soreceive_soshutdown_sosetopt_sogetopt_m_getclr_uipc_usrreq_unp_attach_unp_detach_unp_bind_unp_connect_unp_connect2_unp_disconnect_socantsendmore_unp_usrclosed_sbwakeup_unp_internalize_sun_noname_sbappendaddr_sbappend_unp_drop_unp_sendspace_unp_recvspace_soreserve_soisdisconnected_sonewconn_soisconnected_unp_externalize_unp_discard_unp_gcing_unp_defer_unp_mark_unp_scan_soo_ioctl_soo_stat_domaininit_compress_badblock_getxfile_makechild_textlock_datalock_proclock_dirtypage_shmattach_HWSetDate_procfind_selwakeup_unixdomain_inetdomain_pffasttimo_pfslowtimo_pffindtype_pffindproto_pfctlinput_m_clalloc_m_pgfree_m_expand_m_pullup_raw_input_raw_ctlinput_raw_usrreq_raw_init_sbrelease_sorflush_sodisconnect_socantrcvmore_sohasoutofband_soisconnecting_soqinsque_soisdisconnecting_sbreserve_GetHWSwitches_move_dcb_dcb_write_medmaptr_readlong_readshort_writeshort_writelong_metimeout_readstat_writecom_readbyte_writebyte_mtcommand_no_t_proc_ptcwakeup_tptsproc_ttyflush_tptcwrite_wbetoutput_localAddress_rawinput_rawbuffer_smdcommand_smdstart_smd_write_smd_strer_sys_mess_linkTable_sxtnullproc_sxtvtproc_sxtlinit_sxtalloc_wbalunit_wbal_cnt_wbal_addr_wb_reset_PROMVersion_PCAConfig_CODEVersion_WBCommand_intrpInterval_wbalproc_wbalparam_WBCtest1_WBCtest0_WBWriteChar_wbresetbrk_diag_cons_WBSetStartStop_WBGetStartStop_timeInterval_wbal_cons_KEYBOARD_wbct_cnt_wbct_addr_wbctcommand_wbcttimout_wbctstart_wbctrstrategy_wbctimex_wbctphys_wblp_addr_wblp_cnt_testOffline_wblpoutput_wblpstart_CodeVersion_kdb_getline_instrucinfo_breakpoints_breaktable_txt_translate_findbreaktableentry_findbreak_addbreakpoint_deletebreakpoint_handleaddbreak_readtarget_singlestep_stepmode_pcb_access_handledeletebreak_numbreaksset_displaybreaktable_kdb_printf_setbreakcmd_clearallbreaks_clearbreakcmd_break_pc_break_type_vdumpmem_v_offset_d_offset_translate_modeflag_displaycmd_transaddr_dispinstr_displayinstruction_displaycodecmd_displayregscmd_cons_diag_modifycmd_kdb_flush_singlestepcmd_start_loader_writeheader_exception_modestring_kdb_print_kdb_printn_save_reg0_default_pcb_debug_pcb_user_pcb_user_default_kdb_default_i_timer1_i_timer2_ifqmaxlen_if_slowtimo_if_attach_if_ifwithaddr_if_ifwithnet_afswitch_if_ifonnetof_if_ifwithaf_rawintrq_raw_attach_raw_detach_raw_connaddr_raw_bind_raw_disconnect_wildcard_rtredirect_rtrequest_null_hash_null_netmatch_inet_hash_inet_netmatch_if_makeaddr_looutput_if_rtinit_in_netof_in_lnaof_ip_output_ip_slowtimo_ip_drain_icmp_input_udp_input_udp_ctlinput_udp_usrreq_udp_init_tcp_input_tcp_ctlinput_tcp_usrreq_tcp_init_tcp_fasttimo_tcp_slowtimo_tcp_drain_rip_input_rip_output_icmp_error_icmpstat_icmp_reflect_in_cksum_ip_protox_icmp_send_ipqmaxlen_ip_dooptions_ip_forward_ip_reass_ip_freef_ip_stripoptions_ip_ctlinput_inetctlerrmap_tcp_abort_in_pcbnotify_udp_abort_ipprintfs_ipforwarding_ip_optcopy_ripproto_tcp_trace_tcp_debx_tcp_debug_tcpstates_prurequests_tcptimers_tcp_alpha_tcp_beta_tcpconsdebug_tcpcksum_tcpprintfs_in_pcblookup_tcp_saveti_tcp_dooptions_in_pcbconnect_tcp_template_in_pcbdisconnect_tcp_drop_tcp_reass_tcp_close_tcp_canceltimers_tcp_pulloutofband_tcpnodelack_tcp_output_tcp_respond_tcp_outflags_tcp_setpersist_tcp_initopt_tcp_newtcpcb_in_pcbdetach_tcp_timers_tcpexprexmtbackoff_tcp_backoff_tcp_attach_tcp_disconnect_in_pcbbind_tcp_usrclosed_tcpsenderrors_in_setsockaddr_in_setpeeraddr_tcp_sendspace_tcp_recvspace_in_pcballoc_udpcksum_udp_output_zeroin_addr_SwapBits_arpmyaddr_wbetinit_wbetioctl_wbetreset_GetWonderBoard_WBDriverInited_AllocDescRings_disableWBInterrupts_arpattach_arpwhohas_wbsetaddr_wbetread_tcpipOpen_WBLength_RecvDescCopy_IORAMAddr_RecvQHead_WBOffset_copyLANCEBufToMbuf_arpinput_etherCBCopy_LANCEError_packetXmitted_F_Cpt_Init_InitStartCmds_arpresolve_copyMbufToLANCEBuf_XmitQHead_XmitBufs_TempXmitQHead_XmitDescCopy_RemoveWBInterface_wbshutdown_WriteWBCommand_RecvBufs_GetXmitBuf_FlushLANCEInterruptQ_XmitQTail_ReadXmitDesc_WBWriteIOErr_bad_Write_CmdTimeout_D_Cpt_Cmd_TO_ErrCmd_F_Cpt_Cmd_ReadRecvDesc_WriteRecvDesc_WriteXmitDesc_WBDevice_WBPresent_IOMapAddr_ReadRevCodes_RealRecvBufs_RealXmitBufs_diagCBCopy_ReadPhysicalAddr_SetLogicalAddrFilter_CreateInitBlock_InitBlockCopy_WriteInitBlock_InitDescRings_TO_ErrInit_StartTimeout_D_Cpt_Init_TestRecvBufValid_FindRecvPktEnd_etherbroadcastaddr_nbpkterr_TO_ErrXmit_clearseg_d_rwrite_arptimer_arpt_age_arptfree...1112131415161718191a1b1c1d1e1f102122232425262728292a2b2c2d2e2f203132333435363738393a3b3c3d3e3f304142434445464748494a4b4c4d4e4f40 wbal->wb_state &= ~WB_SBRK; break; E 6 I 6 wbal->wb_state &= ~WB_SBRK; D 10 wakeup((caddr_t)&wbal->comm[wbal->head]); break; E 10 I 10 goto wakeup; E 10 E 6 case WB_RSBRK: D 6 wbal->wb_state &= ~WB_RSBRK; break; E 6 I 6 wbal->wb_state &= ~WB_RSBRK; break; E 6 D 6 case WB_XOFF: wbal->wb_state &= ~WB_XOFF; break; E 6 I 6 case WB_WFLUSH: wbal->wb_state &= ~WB_WFLUSH; D 10 wakeup((caddr_t)&wbal->comm[wbal->head]); break; E 10 I 10 goto wakeup; E 10 E 6 D 6 case WB_XON: wbal->wb_state &= ~WB_XON; break; E 6 I 6 case WB_RFLUSH: wbal->wb_state &= ~WB_RFLUSH; break; E 6 D 6 case WB_FLUSH: wbal->wb_state &= ~WB_FLUSH; break; E 6 I 6 case WB_MODON: wbal->wb_state &= ~WB_MODON; D 10 wakeup((caddr_t)&wbal->comm[wbal->head]); break; E 10 I 10 goto wakeup; E 10 case WB_MODOFF: wbal->wb_state &= ~WB_MODOFF; I 10 wakeup: E 10 wakeup((caddr_t)&wbal->comm[wbal->head]); break; E 6 D 6 case WB_MODEM: wbal->wb_state &= ~WB_BUSY; wakeup((caddr_t)&wbal->status); break; E 6 I 6 case WBI_XOFF: wbal->wb_state &= ~WBI_XOFF; break; E 6 I 6 case WBI_XON: wbal->wb_state &= ~WBI_XON; break; case WBI_RSBRK: wbal->wb_state &= ~WBI_RSBRK; break; case WBI_WFLUSH: wbal->wb_state &= ~WBI_WFLUSH; break; case WBI_RFLUSH: wbal->wb_state &= ~WBI_RFLUSH; break; case WBI_MODON: wbal->wb_state &= ~WBI_MODON; break; case WBI_MODOFF: wbal->wb_state &= ~WBI_MODOFF; break; E 6 default: D 6 printf("CIOerit case= %x\n", wbal->wb_state); E 6 I 6 printf("CIOerit case= %x\n", wbal->wb_state); E 6 } I 6 whead = wbal->head; D 10 wbal->comm[whead] |= LASTCOMMAND; E 10 I 10 wbal->comm[whead] |= WBEND; E 10 if (whead != wbal->tail) { whead++; if (whead == COMSIZE) whead = 0; wbal->head = whead; comm = wbal->comm[whead]; D 10 if (comm & 0x01) { E 10 I 10 if (comm & WBZERO) { E 10 wbal->wb_state &= ~WB_WAIT; wakeup((caddr_t)&wbal->comm[whead]); } else { switch (comm) { D 10 case WB_XOFF: E 10 I 10 case WBIXOFF: E 10 wbal->wb_state |= WBI_XOFF; D 10 er = WBCommand(unit, 0, WriteHighPri(CSTOP)|LASTCOMMAND); break; E 10 I 10 command = WriteHighPri(CSTOP)|LASTCOMMAND; goto startcom; E 10 D 10 case WB_XON: E 10 I 10 case WBIXON: E 10 wbal->wb_state |= WBI_XON; D 10 er = WBCommand(unit, 0, WriteHighPri(CSTART)|LASTCOMMAND); break; E 10 I 10 command = WriteHighPri(CSTART)|LASTCOMMAND; goto startcom; E 10 D 10 case WB_RSBRK: E 10 I 10 case WBIRSBRK: E 10 wbal->wb_state |= WBI_RSBRK; wbal->WR5 &= ~Bit4; D 10 er = WBCommand(unit, 0, WriteRegister5(wbal->WR5)|LASTCOMMAND); break; E 10 I 10 command = WriteRegister5(wbal->WR5)|LASTCOMMAND; goto startcom; E 10 D 10 case WB_WFLUSH: E 10 I 10 case WBIWFLUSH: E 10 wbal->wb_state |= WBI_WFLUSH; D 10 er = WBCommand (unit, 0, WBFlushOutput|LASTCOMMAND); break; E 10 I 10 command = WBFlushOutput|LASTCOMMAND; goto startcom; E 10 D 10 case WB_RFLUSH: E 10 I 10 case WBIRFLUSH: E 10 wbal->wb_state |= WBI_RFLUSH; break; D 10 case WB_MODON: E 10 I 10 case WBIMODON: E 10 wbal->wb_state |= WBI_MODON; wbal->WR5 |= Bit7; D 10 er = WBCommand(unit, 0, WriteRegister5(wbal->WR5 )|LASTCOMMAND); break; E 10 I 10 command = WriteRegister5(wbal->WR5 )|LASTCOMMAND; goto startcom; E 10 D 10 case WB_MODOFF: E 10 I 10 case WBIMODOFF: E 10 wbal->wb_state |= WBI_MODOFF; wbal->WR5 &= ~Bit7; D 10 er = WBCommand(unit, 0, WriteRegister5(wbal->WR5 )|LASTCOMMAND); break; E 10 I 10 command = WriteRegister5(wbal->WR5 )|LASTCOMMAND; goto startcom; E 10 default: printf("CIOstit case= %x\n", comm); D 10 } E 10 I 10 goto endcomm; } startcom: er = WBCommand(unit, 0, command); E 10 if (er != OK) { printf("WBCIO: error wbintr &d\n", er); D 10 return; E 10 I 10 goto endcomm; E 10 } StartWB(unit); I 10 endcomm: E 10 } } E 6 } } D 6 d_read((wbal_addr[dev]) | TCB(j)+ReceiveHead, &head); d_read((wbal_addr[dev]) | TCB(j)+ReceiveTail, &tail); E 6 I 6 /* get the head and tail pointers of the Receive buffer */ d_read(cntl | TCB(j)+ReceiveHead, &head); d_read(cntl | TCB(j)+ReceiveTail, &tail); E 6 D 10 head &= 0x0000ffff; tail &= 0x0000ffff; E 10 I 10 head &= 0xFFFF; tail &= 0xFFFF; E 10 D 6 if (tail != head) wbalrint(unit); } E 6 I 6 if (tail != head) { I 10 sysinfo.rcvint++; E 10 head = cntl | head; tail = cntl | tail; base = cntl | (RBuffersBase+(BufSize*j)); flg = tp->t_iflag; I 10 d_read(cntl | (TCB(j)+RR0), &rr0); if ((rr0&0xFF) != wbal->WR0) { wbal->WR0 = rr0; sysinfo.mdmint++; } E 10 while (head != tail) { /* This routine reads the Status/Char of the unit "unit". */ /* read from the Receive buffer */ d_read(head, &stat); D 10 /* move the head to point to the next entry, 2 bytes offset */ E 10 head += 2; if (head >= base + BufSize) head = base; if (stat & MODEM) { if (stat & BRK) { wbal->wb_state |= WB_BRK; } else { if (wbal->wb_state & WB_BRK) { /* break is clear. see if this is a transition */ wbal->wb_state &= ~WB_BRK; if (flg&IGNBRK) goto next; if (flg&BRKINT) { (*linesw[tp->t_line].l_input)(tp, L_BREAK); goto next; } if (flg&PARMRK) { lbuf[2] = 0xFF; lbuf[1] = 0; lcnt = 3; sysinfo.rawch += 2; } else c = 0; } } next: if (stat & CTS) tp->t_state |= TS_CTS_ON; else tp->t_state &= ~TS_CTS_ON; if (stat & DSR) tp->t_state |= TS_DSR_ON; else tp->t_state &= ~TS_DSR_ON; E 6 I 6 D 10 if (stat & CD) E 10 I 10 if (rr0 & CD) E 10 tp->t_state |= TS_CAR_ON; else /* carrier off */ tp->t_state &= ~TS_CAR_ON; if ((tp->t_cflag & CLOCAL) || (tp->t_state & TS_CAR_ON)) { if ((tp->t_state & CARR_ON) == 0) { wakeup(&tp->t_canq); tp->t_state |= CARR_ON; } } else { if (tp->t_state & CARR_ON) { if (tp->t_state&ISOPEN) { signal(tp->t_pgrp, SIGHUP); tp->t_pgrp =0; D 10 wbmodem(tp, OFF); E 10 I 10 wbmodem(unit, OFF); E 10 ttyflush(tp, (FREAD|FWRITE)); } tp->t_state &= ~CARR_ON; } } } else { E 6 I 6 D 10 sysinfo.rcvint++; E 10 c = stat & 0xFFFF; if (wbal->wb_state & WB_BRK) continue; if (!unit) { ctmp = c & 0x7F; if (ctmp == CNTLO) { if (diag_cons) printf("\nO.S. messages -- OFF\n"); diag_cons = ~diag_cons; if (diag_cons) printf("\nO.S. messages -- ON\n"); continue; } } if (!(tp->t_state&(ISOPEN|WOPEN))) continue; if (tp->t_iflag&IXON) { ctmp = c & 0x7F; if (tp->t_state&TTSTOP) { if (ctmp == CSTART || tp->t_iflag&IXANY) (*tp->t_proc)(tp, T_RESUME); } else { if (ctmp == CSTOP) (*tp->t_proc)(tp, T_SUSPEND); } if (ctmp == CSTART || ctmp == CSTOP) continue; } lcnt = 1; if (c&PERROR && !(flg&INPCK)) c &= ~PERROR; if (c&(FRERROR|PERROR|OVERRUN)) { if ((c&0xFF) == 0) { if (flg&IGNBRK) continue; if (flg&BRKINT) { (*linesw[tp->t_line].l_input)(tp, L_BREAK); continue; } } else { if (flg&IGNPAR) continue; } if (flg&PARMRK) { lbuf[2] = 0xFF; lbuf[1] = 0; lcnt = 3; sysinfo.rawch += 2; } else c = 0; } else { if (flg&ISTRIP) c &= 0x7F; else { c &= 0xFF; if (c == 0xFF && flg&PARMRK) { lbuf[1] = 0xFF; lcnt = 2; } } } /* stash character in r_buf */ ctmp = c & 0xFF; lbuf[0] = c; if (tp->t_rbuf.c_ptr == NULL) D 10 return; E 10 I 10 continue; E 10 while (lcnt) { *tp->t_rbuf.c_ptr++ = lbuf[--lcnt]; if (--tp->t_rbuf.c_count == 0) { I 10 d_write(cntl | TCB(j)+ReceiveHead, head&0xFFFF); E 10 tp->t_rbuf.c_ptr -= tp->t_rbuf.c_size; (*linesw[tp->t_line].l_input)(tp, L_BUF); } } } } I 10 d_write(cntl | TCB(j)+ReceiveHead, head&0xFFFF); E 10 tp->t_rbuf.c_ptr -= tp->t_rbuf.c_size - tp->t_rbuf.c_count; (*linesw[tp->t_line].l_input)(tp, L_BUF); D 10 d_write(cntl | TCB(j)+ReceiveHead, head&0xFFFF); E 10 } } E 6 } } E 1 h52614 s 00001/00001/00224 d D 4.4 87/05/14 16:01:13 build 8 7 c removed old SCCS strings and inserted #ident BB e s 00001/00001/00224 d D 4.3 87/04/16 16:50:36 dc 7 6 c dc - Add Bull updates from 03/05/87 e s 00003/00003/00222 d D 4.2 87/04/15 17:39:41 dc 6 5 c dc - changed #include "sys/..." to #include e s 00000/00000/00225 d D 4.1 87/02/20 13:26:53 build 5 4 c rolled rev to -r4 /dc e s 00000/00000/00225 d D 3.1 87/01/19 09:19:57 build 4 3 c rolled rev to -r3 /dc e s 00000/00000/00225 d D 2.1 87/01/19 09:19:57 build 3 2 c AUTO NULL DELTA e s 00001/00000/00224 d D 1.2 87/01/16 10:12:24 build 2 1 c add ident string /dc e s 00224/00000/00000 d D 1.1 87/01/09 16:44:55 build 1 0 c Placed under source control - dc e u U f b f n t T I 2 D 7 /* "%W% %E%" */ E 7 I 7 D 8 /* " %W% %E% " */ E 8 I 8 #ident " %W% %E% " E 8 E 7 E 2 I 1 D 6 #include "sys/param.h" #include "sys/types.h" #include "sys/tty.h" E 6 I 6 #include #include #include E 6 getc(p) register struct clist *p; { register struct cblock *bp; register int c, s; s = spl6() ; if (p->c_cc > 0) { p->c_cc--; bp = p->c_cf; c = bp->c_data[bp->c_first++]&0377; if (bp->c_first == bp->c_last) { if ((p->c_cf = bp->c_next) == NULL) p->c_cl = NULL; bp->c_next = cfreelist.c_next; cfreelist.c_next = bp; if (cfreelist.c_flag) { cfreelist.c_flag = 0; wakeup(&cfreelist); } } } else c = -1; splx(s) ; return(c); } putc(c, p) register struct clist *p; { register struct cblock *bp, *obp; register s; s = spl6() ; if ((bp = p->c_cl) == NULL || bp->c_last == cfreelist.c_size) { obp = bp; if ((bp = cfreelist.c_next) == NULL) { splx(s) ; return(-1); } cfreelist.c_next = bp->c_next; bp->c_next = NULL; bp->c_first = bp->c_last = 0; if (obp == NULL) p->c_cf = bp; else obp->c_next = bp; p->c_cl = bp; } bp->c_data[bp->c_last++] = c; p->c_cc++; splx(s) ; return(0); } struct cblock * getcf() { register struct cblock *bp; register int s; s = spl6() ; if ((bp = cfreelist.c_next) != NULL) { cfreelist.c_next = bp->c_next; bp->c_next = NULL; bp->c_first = 0; bp->c_last = cfreelist.c_size; } splx(s) ; return(bp); } putcf(bp) register struct cblock *bp; { register int s; s = spl6() ; bp->c_next = cfreelist.c_next; cfreelist.c_next = bp; if (cfreelist.c_flag) { cfreelist.c_flag = 0; wakeup(&cfreelist); } splx(s) ; } struct cblock * getcb(p) register struct clist *p; { register struct cblock *bp; register int s ; s = spl6() ; if ((bp = p->c_cf) != NULL) { p->c_cc -= bp->c_last - bp->c_first; if ((p->c_cf = bp->c_next) == NULL) p->c_cl = NULL; } splx(s) ; return(bp); } putcb(bp, p) register struct cblock *bp; register struct clist *p; { register struct cblock *obp; register int s ; s = spl6() ; if ((obp = p->c_cl) == NULL) p->c_cf = bp; else obp->c_next = bp; p->c_cl = bp; bp->c_next = NULL; p->c_cc += bp->c_last - bp->c_first; splx(s) ; return(0); } getcbp(p, cp, n) struct clist *p; register char *cp; register n; { register struct cblock *bp; register char *op; register on; register char *acp = cp; while (n) { if ((bp = p->c_cf) == NULL) break; op = &bp->c_data[bp->c_first]; on = bp->c_last - bp->c_first; if (n >= on) { bcopy(op, cp, on); cp += on; n -= on; if ((p->c_cf = bp->c_next) == NULL) p->c_cl = NULL; bp->c_next = cfreelist.c_next; cfreelist.c_next = bp; } else { bcopy(op, cp, n); bp->c_first += n; cp += n; n = 0; break; } } n = cp - acp; p->c_cc -= n; return(n); } putcbp(p, cp, n) struct clist *p; register char *cp; register n; { register struct cblock *bp, *obp; register char *op; register on; register char *acp = cp; while (n) { if ((bp = p->c_cl) == NULL || bp->c_last == cfreelist.c_size) { obp = bp; if ((bp = cfreelist.c_next) == NULL) break; cfreelist.c_next = bp->c_next; bp->c_next = NULL; bp->c_first = bp->c_last = 0; if (obp == NULL) p->c_cf = bp; else obp->c_next = bp; p->c_cl = bp; } op = &bp->c_data[bp->c_last]; on = cfreelist.c_size - bp->c_last; if (n >= on) { bcopy(cp, op, on); cp += on; bp->c_last += on; n -= on; } else { bcopy(cp, op, n); cp += n; bp->c_last += n; n = 0; break; } } n = cp - acp; p->c_cc += n; return(n); } E 1 h42475 s 00001/00001/00125 d D 4.4 87/05/14 16:01:24 build 11 8 c removed old SCCS strings and inserted #ident BB e s 00006/00006/00139 d R 4.5 87/04/27 18:22:46 dc 10 9 c dc - use smaller info block. e s 00019/00000/00126 d R 4.4 87/04/27 17:42:01 dc 9 8 c dc - Add support for load_enable, ucode version e s 00002/00002/00124 d D 4.3 87/04/16 16:56:16 dc 8 7 c dc - Add Bull updates from 03/05/87 e s 00011/00011/00115 d D 4.2 87/04/15 17:39:47 dc 7 6 c dc - changed #include "sys/..." to #include e s 00000/00000/00126 d D 4.1 87/02/20 13:26:56 build 6 5 c rolled rev to -r4 /dc e s 00015/00010/00111 d D 3.2 87/01/26 16:08:55 build 5 4 c add page table changes /dc e s 00000/00000/00121 d D 3.1 87/01/19 09:20:00 build 4 3 c rolled rev to -r3 /dc e s 00000/00000/00121 d D 2.1 87/01/19 09:20:00 build 3 2 c AUTO NULL DELTA e s 00001/00000/00120 d D 1.2 87/01/16 10:12:27 build 2 1 c add ident string /dc e s 00120/00000/00000 d D 1.1 87/01/09 16:45:08 build 1 0 c Placed under source control - dc e u U f b f n t T I 2 D 8 /* "%W% %E%" */ E 8 I 8 D 11 /* " %W% %E% " */ E 11 I 11 #ident " %W% %E% " E 11 E 8 E 2 I 1 /* * Memory special file * minor device 0 is physical memory * minor device 1 is kernel memory * minor device 2 is EOF/NULL D 5 */ E 5 I 5 D 8 */ E 8 I 8 */ E 8 E 5 D 7 #include "sys/param.h" #include "sys/types.h" #include "sys/sysmacros.h" #include "sys/dir.h" #include "sys/signal.h" #include "sys/user.h" #include "sys/errno.h" #include "sys/buf.h" #include "sys/systm.h" #include "sys/page.h" #include "sys/mem.h" E 7 I 7 #include #include #include #include #include #include #include #include #include #include #include E 7 I 5 E 5 extern pte_t *mmpte; extern char *mmvad; D 5 extern ushort sys_segno ; E 5 mmread(dev) { register unsigned n; register c; while(u.u_error==0 && u.u_count!=0) { n = min(u.u_count, ctob(1)); if (dev == 0) { c = (u.u_offset >> BPPSHIFT) & PG_PFNUM; mmpte->pgm.pg_pfn = c ; mmpte->pgi.pg_pte |= (PG_V | PG_KR) ; D 5 sys_vrt_insert(mmvad,*mmpte,sys_segno) ; E 5 c = u.u_offset & 0xfff; n = min(n, 4096-c); if (copyout(&mmvad[c], u.u_base, n)) u.u_error = ENXIO; D 5 sys_vrt_suppress(mmvad,*mmpte,sys_segno) ; E 5 flush() ; } else if (dev == 1) { D 5 if (!kvtopfn(u.u_offset)) E 5 I 5 register pte_t *pt ; pt = svtopte(u.u_offset | SYSVA) ; if (!(pt->pgi.pg_pte & PG_V)) E 5 u.u_error = ENXIO ; else D 5 if (copyout(u.u_offset,u.u_base,n)) E 5 I 5 if (copyout(u.u_offset | SYSVA,u.u_base,n)) E 5 u.u_error = ENXIO; } else return; u.u_offset += n; u.u_base += n; u.u_count -= n; } } mmwrite(dev) { register unsigned n; register c; while(u.u_error==0 && u.u_count!=0) { n = min(u.u_count, ctob(1)); if (dev == 0) { c = (u.u_offset >> BPPSHIFT) & PG_PFNUM; mmpte->pgm.pg_pfn = c ; mmpte->pgi.pg_pte |= (PG_V | PG_KW) ; D 5 sys_vrt_insert(mmvad,*mmpte,sys_segno) ; E 5 c = u.u_offset & 0xfff; n = min(n, 4096-c); if (copyin(u.u_base, &mmvad[c], n)) u.u_error = ENXIO; D 5 sys_vrt_suppress(mmvad,*mmpte,sys_segno) ; E 5 flush() ; } else if (dev == 1) { D 5 if (!kvtopfn(u.u_offset)) E 5 I 5 register pte_t *pt ; pt = (pte_t *)svtopte(u.u_offset | SYSVA) ; if (!(pt->pgi.pg_pte & PG_V)) E 5 u.u_error = ENXIO ; else D 5 if (copyin(u.u_base, u.u_offset, n)) E 5 I 5 if (!(pt->pgi.pg_pte & PG_KW)) u.u_error = ENXIO ; else if (copyin(u.u_base, u.u_offset | SYSVA, n)) E 5 u.u_error = ENXIO; } u.u_offset += n; u.u_base += n; u.u_count -= n; } } mmioctl(dev, cmd, arg, flag) register struct ctrio *arg ; { register struct ctrio ctr ; register state ; if (dev == 2) goto efault ; if ( copyin(arg, &ctr, sizeof(struct ctrio)) ) { efault: u.u_error = EFAULT ; return ; } if (cmd == MM_READ) { u.u_error = d_read(ctr.ctrad, &ctr.value) ; if ( copyout(&ctr, arg, sizeof(struct ctrio)) ) goto efault ; return ; } if (cmd == MM_WRITE) { u.u_error = d_write(ctr.ctrad, ctr.value) ; return ; } u.u_error = ENXIO ; } E 1 h44937 s 00001/00001/01107 d D 4.6 87/05/14 16:01:40 build 12 11 c removed old SCCS strings and inserted #ident BB e s 00002/00000/01106 d D 4.5 87/04/17 14:37:16 dc 11 10 c dc - DO NOT retension tape on open for write and new cartridge e s 00001/00001/01105 d D 4.4 87/04/16 17:04:33 dc 10 9 c dc - Add Bull updates from 03/05/87 e s 00004/00000/01102 d D 4.3 87/04/08 17:52:52 dc 9 8 c try 5 times to init a transport, then give up. e s 00059/00029/01043 d D 4.2 87/04/07 18:28:57 dc 8 7 c update to bull.030587 e s 00000/00000/01072 d D 4.1 87/02/20 13:27:00 build 7 6 c rolled rev to -r4 /dc e s 00000/00000/01072 d D 3.3 87/02/13 12:55:22 build 6 5 c add bull changes from Jan 23 /dc e s 00042/00017/01030 d D 3.2 87/01/26 16:16:34 build 5 4 c add page table changes /dc e s 00000/00000/01047 d D 3.1 87/01/19 09:20:04 build 4 3 c rolled rev to -r3 /dc e s 00000/00000/01047 d D 2.1 87/01/19 09:20:04 build 3 2 c AUTO NULL DELTA e s 00001/00000/01046 d D 1.2 87/01/16 10:12:32 build 2 1 c add ident string /dc e s 01046/00000/00000 d D 1.1 87/01/09 16:45:36 build 1 0 c Placed under source control - dc e u U f b f n t T I 2 D 10 /* "%W% %E%" */ E 10 I 10 D 12 /* " %W% %E% " */ E 12 I 12 #ident " %W% %E% " E 12 E 10 E 2 I 1 D 5 /* %Z% Bull-Sems SPIX %Q%/%M% %I% %E% */ E 5 /* * Cartridge Tape Device Driver for the WONDER BOARD * SCSI 1/4" streaming tape driver */ D 8 #include "sys/param.h" #include "sys/types.h" #include "sys/dir.h" #include "sys/signal.h" #include "sys/user.h" #include "sys/errno.h" #include "sys/file.h" #include "sys/termio.h" #include "sys/buf.h" #include "sys/iobuf.h" #include "sys/systm.h" #include "sys/conf.h" #include "sys/sysinfo.h" #include "sys/sysmacros.h" #include "sys/tty.h" #include "sys/fdlp.h" #include "sys/cio.h" #include "sys/ctio.h" #include "sys/page.h" #include "sys/iomachdep.h" E 8 I 8 #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include E 8 #define NWBCTCT 4 #define NWBCTUNIT 2 #define SSCOM 1 #define SIORB 2 #define SIOWB 3 #define SSFOR 4 #define SSREV 5 #define SIORR 6 #define SIOWR 7 #define OFATAL 0x80 #define B_INIT 0x01 /* for first init in oflag */ #define B_OPEN 0x02 /* for first open in oflag */ #define B_BOT 0x04 /* for load open in oflag */ #define B_FMK 0x10 /* for FM read ahead */ #define B_EOM 0x20 /* for EOM detection ahead */ #define INF 10000000 D 8 #define BUFSIZE 20*512 /* maximum buffer size */ E 8 I 8 #define BUFSIZE 128*512 /* maximum buffer size */ E 8 #define wbctct(x) ((x)>>6&(NWBCTCT-1)) #define wbctdriv(x) ((x)&(NWBCTUNIT-1)) #define wbctunit(x) (wbctct(x)<<1) + (wbctdriv(x)) #define ct_com(x) ((x)->b_cmd) int wbct_addr[4]; char wbct_cnt; extern struct buf wbctcombuf[]; extern struct iobuf wbcttab[]; extern struct wbctbuf wbct_buf[]; extern wbctprint(); I 5 D 8 extern wbcttimopen(); E 8 I 8 extern wbcttimout(); E 8 E 5 wbctinit() /* This routine is responsible for initializing the driver. initializes the driver's global variables. */ { char unit; char i, j; register struct iobuf *ctp; register struct wbctbuf *wbctbuf; I 8 int err; I 9 int trycount; E 9 E 8 wbct_cnt = confsw[CIO].c_cnt; for (i=0; ib_dev = (i<<6) | j; ctp->io_mecb = wbct_addr[i] | DCB(j); d_write(wbct_addr[i] | (DCB(j) + AuxMsg), IdentBit+CanReconnect); d_write(wbct_addr[i] | (DCB(j) + TargetID), ((CipherAddr + j)<<8) + (TapeUnitID + j)); I 9 trycount = 0; E 9 I 8 loop : I 9 if (++trycount > 5) continue; E 9 if (err = (wbctcommand(ctp->b_dev, CTIOTRY, 0, NULL))) { if (err == 2) { if ((( wbctbuf->Resvd2 & 0xF) == 6) && (wbctbuf->Resvd8 == 0x30)) goto loop; } else { spl5(); timeout(wbcttimout, unit, HZ); sleep((caddr_t)&wbctbuf->Resvd1, PZERO-1); spl0(); goto loop; } } E 8 if (wbctcommand(ctp->b_dev, CTIOINQ, 0, NULL)) continue; wbctbuf = &wbct_buf[unit]; if ((wbctbuf->PerDevType == PDTSeqtial) && (wbctbuf->ResvdD & RMB)) { ctp->oflag |= B_INIT; wbctbuf->msl0 = 0; wbctbuf->msl1 = 0; wbctbuf->msl2 = 0x10; /* Buffered Mode */ wbctbuf->msl3 = 9; /* Block Descriptor Length */ wbctbuf->msl4 = 0x05; /* Density Code */ wbctbuf->msl5 = 0; wbctbuf->msl6 = 0; wbctbuf->msl7 = 0; wbctbuf->msl8 = 0; wbctbuf->msl9 = 0; wbctbuf->mslA = 0; wbctbuf->mslB = 0; wbctbuf->mslC = 0x01; /* DEA AUI SEC */ wbctcommand(ctp->b_dev, CTIOMSL, 0, NULL); } } } } wbctopen(dev, flag) dev_t dev; { char unit; register struct iobuf *ctp; register struct wbctbuf *wbctbuf; I 5 int err, it; E 5 unit = wbctunit(dev); unit = (wbctct(dev)<<1); unit = unit + (wbctdriv(dev)); if (unit > (wbct_cnt * NWBCTUNIT)) { goto abort; } ctp = &wbcttab[unit]; if (!(ctp->oflag & B_INIT)) { goto abort; } if (ctp->oflag & B_OPEN) { goto abort; } I 8 ctp->oflag |= B_OPEN; E 8 wbctbuf = &wbct_buf[unit]; D 5 if (wbctcommand(dev, CTIOTRY, 0, NULL)) { if (((wbctbuf->Resvd2 & 0xF) == 2) && (wbctbuf->Resvd8 == 09)) { printf( " ct %d : cartridge not loaded\n", dev); goto abort; E 5 I 5 loop : if (err = (wbctcommand(dev, CTIOTRY, 0, NULL))) { if (err == 2) { if (((wbctbuf->Resvd2 & 0xF) == 2) && (wbctbuf->Resvd8 == 09)) { printf( " ct %d : cartridge not loaded\n", dev); D 8 goto abort; E 8 I 8 goto abort1; E 8 } else { if ((( wbctbuf->Resvd2 & 0xF) == 6) && (wbctbuf->Resvd8 == 0x30)) ctp->oflag |= B_BOT; ctp->eot = 0; goto loop; } E 5 } else { D 5 if ((( wbctbuf->Resvd2 & 0xF) == 6) && (wbctbuf->Resvd8 == 0x30)) ctp->oflag |= B_BOT; ctp->eot = 0; E 5 I 5 it = spl5(); D 8 timeout(wbcttimopen, unit, HZ); E 8 I 8 timeout(wbcttimout, unit, HZ); E 8 sleep((caddr_t)&wbctbuf->Resvd1, PZERO-1); splx(it); goto loop; E 5 } } if (wbctcommand(dev, CTIOMSN, 0, NULL)) { D 8 goto abort; E 8 I 8 goto abort1; E 8 } if (flag&FWRITE) { if (wbctbuf->msl2 & WP) { printf( " ct %d : cartridge write protected\n", dev); D 8 goto abort; E 8 I 8 goto abort1; E 8 } if (ctp->oflag & B_BOT) { I 11 /* E 11 if (wbctcommand(dev, CTIORTS, 0, NULL)) { D 8 goto abort; E 8 I 8 goto abort1; E 8 } I 11 */ E 11 } ctp->nxrec = 0; } else { ctp->nxrec = INF; } ctp->blkno = 0; ctp->oflag &= ~B_BOT; D 8 ctp->oflag |= B_OPEN; E 8 return; I 8 abort1: ctp->oflag &= ~B_OPEN; E 8 abort: u.u_error = ENXIO; return; } I 5 D 8 wbcttimopen(unit) E 8 I 8 wbcttimout(unit) E 8 char unit; { register struct wbctbuf *wbctbuf; wbctbuf = &wbct_buf[unit]; wakeup((caddr_t)&wbctbuf->Resvd1); return; } E 5 wbctclose(dev, flag) dev_t dev; { char unit; register struct iobuf *ctp; unit = wbctunit(dev); unit = (wbctct(dev)<<1); unit = unit + (wbctdriv(dev)); ctp = &wbcttab[unit]; if (!(ctp->oflag & B_OPEN)) { u.u_error = ENXIO; return; } if (flag & FWRITE) u.u_error = wbctcommand(dev, CTIOWTM, 1, NULL); if (dev&16) { if (flag&FREAD) { if (ctp->blkno <= ctp->nxrec) u.u_error = wbctcommand(dev, CTIORTM, 1, NULL); } } else u.u_error = wbctcommand(dev, CTIORWD, 0, NULL); ctp->oflag &= ~B_OPEN; } wbctcommand(dev, com, count, addr) register dev_t dev; { register struct buf *bp; char unit; unit = wbctunit(dev); unit = (wbctct(dev)<<1); unit = unit + (wbctdriv(dev)); bp = &wbctcombuf[unit]; spl6(); while(bp->b_flags&B_BUSY) { bp->b_flags |= B_WANTED; sleep(bp, PRIBIO); } spl0(); bp->b_dev = dev; bp->b_error = 0; bp->b_blkno = 0; ct_com(bp) = (com<<16) | com; bp->b_bcount = count; bp->b_un.b_addr = (caddr_t) addr; /* arglist address */ bp->b_flags = B_BUSY|B_READ; wbctstrategy(bp); iowait(bp); /* set u.u_error */ if (bp->b_flags&B_WANTED) wakeup(bp); bp->b_flags = 0; return(bp->b_error); } wbctstrategy(bp) register struct buf *bp; { register struct iobuf *ctp; register dev_t dev; char unit; dev = bp->b_dev; unit = wbctunit(dev); unit = (wbctct(dev)<<1); unit = unit + (wbctdriv(dev)); ctp = &wbcttab[unit]; /* only one is used ==> 0 */ if (bp != &wbctcombuf[unit]) { if (bp->b_bcount > BSIZE) { bp->b_flags |= B_ERROR; bp->b_error = ENXIO; iodone(bp); return; } if (bp->b_blkno > ctp->nxrec) { bp->b_flags |= B_ERROR; bp->b_error = ENXIO; iodone(bp); return; } if (bp->b_blkno == ctp->nxrec && bp->b_flags&B_READ) { clrbuf(bp); bp->b_resid = bp->b_bcount; iodone(bp); return; } if ((bp->b_flags&B_READ) == 0) { ctp->nxrec = bp->b_blkno + 1; ct_com(bp) = (CTIOWBK<<16) | CTIOWBK; } else { ct_com(bp) = (CTIORBK<<16) | CTIORBK; } bp->b_start = lbolt; } bp->av_forw = NULL; spl6(); if (ctp->b_actf == NULL) ctp->b_actf = bp; else ctp->b_actl->av_forw = bp; ctp->b_actl = bp; if (ctp->b_active == NULL) wbctstart(ctp); spl0(); } wbctrstrategy(bp) register struct buf *bp; { register struct iobuf *ctp; register dev_t dev; char unit; dev = bp->b_dev; unit = wbctunit(dev); unit = (wbctct(dev)<<1); unit = unit + (wbctdriv(dev)); ctp = &wbcttab[unit]; /* only one is used ==> 0 */ if (bp->b_bcount > BUFSIZE) { bp->b_flags |= B_ERROR; bp->b_error = ENXIO; iodone(bp); return; } if (ctp->oflag & OFATAL) { bp->b_flags |= B_ERROR; bp->b_error = ENXIO; iodone(bp); return; } bp->b_start = lbolt; if ((bp->b_flags&B_READ) == 0) { ct_com(bp) = (CTIOWBR<<16) | CTIOWBR; } else { if (ctp->oflag & B_FMK) { ctp->nxrec = bp->b_blkno; bp->b_resid = bp->b_bcount; ctp->oflag &= ~B_FMK; if (ctp->oflag & B_EOM) ctp->eot++; ctp->blkno++; iodone(bp); return; } else { if (ctp->oflag & B_EOM) { ctp->eot++; ctp->blkno++; iodone(bp); return; } } ct_com(bp) = (CTIORBR<<16) | CTIORBR; } bp->av_forw = NULL; spl6(); if (ctp->b_actf == NULL) ctp->b_actf = bp; else ctp->b_actl->av_forw = bp; ctp->b_actl = bp; if (ctp->b_active == NULL) wbctstart(ctp); spl0(); } wbctstart(ctp) register struct iobuf *ctp; { register struct buf *bp; register dev_t dev; char unit; daddr_t blkno; int timeout; int kcbUnit; int CbPage; int count; unsigned short offset; register pte_t *pt ; register uint pgpfn, x, npg ; loop: if ((bp = ctp->b_actf) == NULL) return; dev = bp->b_dev; unit = wbctunit(dev); unit = (wbctct(dev)<<1); unit = unit + (wbctdriv(dev)); blkno = ctp->blkno; kcbUnit = ctp->io_mecb; switch (ct_com(bp)&0xFFFF) { case CTIORTM: d_write(kcbUnit + CbOrder, ReadType); d_write(kcbUnit + Set1Cmd0, SpaceFile); d_write(kcbUnit + Set1Cmd4, bp->b_bcount << 8); I 8 d_write(kcbUnit + XCntLsb, 0); E 8 timeout = (Space_timeout * 30 * bp->b_bcount); break; case CTIOSBK: d_write(kcbUnit + CbOrder, ReadType); d_write(kcbUnit + Set1Cmd0, SpaceBlock); d_write(kcbUnit + Set1Cmd4, bp->b_bcount << 8); I 8 d_write(kcbUnit + XCntLsb, 0); E 8 timeout = (Space_timeout * bp->b_bcount); break; case CTIOEOD: d_write(kcbUnit + CbOrder, ReadType); d_write(kcbUnit + Set1Cmd0, SpaceMedia); d_write(kcbUnit + Set1Cmd4, 0); I 8 d_write(kcbUnit + XCntLsb, 0); E 8 timeout = (Space_timeout * 40 * bp->b_bcount); break; case CTIOWTM: d_write(kcbUnit + CbOrder, WriteType); d_write(kcbUnit + Set1Cmd0, WriteFmk); d_write(kcbUnit + Set1Cmd4, bp->b_bcount << 8); I 8 d_write(kcbUnit + XCntLsb, 0); E 8 timeout = (W_timeout * bp->b_bcount); break; case CTIORWD: d_write(kcbUnit + CbOrder, WriteType); d_write(kcbUnit + Set1Cmd0, Rewind); d_write(kcbUnit + Set1Cmd4, 0); I 8 d_write(kcbUnit + XCntLsb, 0); E 8 timeout = (Rewind_timeout); break; case CTIORAZ: d_write(kcbUnit + CbOrder, WriteType); d_write(kcbUnit + Set1Cmd0, Erase); d_write(kcbUnit + Set1Cmd4, 0); I 8 d_write(kcbUnit + XCntLsb, 0); E 8 timeout = (Erase_timeout); break; case CTIORTS: d_write(kcbUnit + CbOrder, WriteType); d_write(kcbUnit + Set1Cmd0, LoadUnload); d_write(kcbUnit + Set1Cmd4, 0x300); I 8 d_write(kcbUnit + XCntLsb, 0); E 8 timeout = (Erase_timeout); break; case CTIOLOD: d_write(kcbUnit + CbOrder, WriteType); d_write(kcbUnit + Set1Cmd0, LoadUnload); d_write(kcbUnit + Set1Cmd4, 0x100); I 8 d_write(kcbUnit + XCntLsb, 0); E 8 timeout = (Erase_timeout); break; case CTIOULD: d_write(kcbUnit + CbOrder, WriteType); d_write(kcbUnit + Set1Cmd0, LoadUnload); d_write(kcbUnit + Set1Cmd4, 0x000); I 8 d_write(kcbUnit + XCntLsb, 0); E 8 timeout = (Erase_timeout); break; case CTIOTRY: d_write(kcbUnit + CbOrder, ReadType); d_write(kcbUnit + Set1Cmd0, TestRdy); d_write(kcbUnit + Set1Cmd4, 0x000); I 8 d_write(kcbUnit + XCntLsb, 0); E 8 timeout = (Info_timeout); break; case CTIOINQ: /* This is done at initialization to make sure that we do have a tape out there. */ d_write(kcbUnit + CbOrder, ReadType); d_write(kcbUnit + Set1Cmd0, Inquiry); d_write(kcbUnit + Set1Cmd4, IQSIZE); D 5 d_write(kcbUnit + CbPage0, ((int)(&(wbct_buf[unit]).ResvdC))>>16); d_write(kcbUnit + CbPage0+2, ((int)(&(wbct_buf[unit]).ResvdC))&0xFFFF); E 5 I 5 d_write(kcbUnit + CbPage0, (svtophys(&wbct_buf[unit].ResvdC))>>16); d_write(kcbUnit + CbPage0+2, (svtophys(&(wbct_buf[unit]).ResvdC))&0xFFFF); E 5 d_write(kcbUnit + XCntLsb, IQSIZE>>8); timeout = (Info_timeout); break; case CTIOMSL: d_write(kcbUnit + CbOrder, WriteType); d_write(kcbUnit + Set1Cmd0, ModeSelect); d_write(kcbUnit + Set1Cmd4, MSSIZE); D 5 d_write(kcbUnit + CbPage0, ((int)(&(wbct_buf[unit]).msl0))>>16); d_write(kcbUnit + CbPage0+2, ((int)(&(wbct_buf[unit]).msl0))&0xFFFF); E 5 I 5 d_write(kcbUnit + CbPage0, (svtophys(&wbct_buf[unit].msl0))>>16); d_write(kcbUnit + CbPage0+2, (svtophys(&(wbct_buf[unit]).msl0))&0xFFFF); E 5 d_write(kcbUnit + XCntLsb, MSSIZE>>8); timeout = (Info_timeout); break; case CTIOMSN: d_write(kcbUnit + CbOrder, ReadType); d_write(kcbUnit + Set1Cmd0, ModeSense); d_write(kcbUnit + Set1Cmd4, MSSIZE); D 5 d_write(kcbUnit + CbPage0, ((int)(&(wbct_buf[unit]).msl0))>>16); d_write(kcbUnit + CbPage0+2, ((int)(&(wbct_buf[unit]).msl0))&0xFFFF); E 5 I 5 d_write(kcbUnit + CbPage0, (svtophys(&wbct_buf[unit].msl0))>>16); d_write(kcbUnit + CbPage0+2, (svtophys(&(wbct_buf[unit]).msl0))&0xFFFF); E 5 d_write(kcbUnit + XCntLsb, MSSIZE>>8); timeout = (Info_timeout); break; case CTIOPRR: /* control the removal of the tape cartridge. Allow will allow removal if true else removal is prevented. */ d_write(kcbUnit + CbOrder, WriteType); d_write(kcbUnit + Set1Cmd0, PrvAlwRemov); d_write(kcbUnit + Set1Cmd4, 0x001); I 8 d_write(kcbUnit + XCntLsb, 0); E 8 timeout = (I_timeout); break; case CTIOALR: d_write(kcbUnit + CbOrder, WriteType); d_write(kcbUnit + Set1Cmd0, PrvAlwRemov); d_write(kcbUnit + Set1Cmd4, 0x000); I 8 d_write(kcbUnit + XCntLsb, 0); E 8 timeout = (I_timeout); break; case CTIOSTS: /* Use the request sense command to get an extended status for the device. */ d_write(kcbUnit + CbOrder, ReadType); d_write(kcbUnit + Set1Cmd0, ReqSense); d_write(kcbUnit + Set1Cmd4, 0x0C00); d_write(kcbUnit + XCntLsb, 0x0C); D 5 d_write(kcbUnit + CbPage0, ((int)(&wbct_buf[unit]))>>16); d_write(kcbUnit + CbPage0+2, ((int)(&wbct_buf[unit]))&0xFFFF); E 5 I 5 d_write(kcbUnit + CbPage0, (svtophys(&wbct_buf[unit]))>>16); d_write(kcbUnit + CbPage0+2, (svtophys(&(wbct_buf[unit])))&0xFFFF); E 5 timeout = (Info_timeout); break; case CTIORVR: d_write(kcbUnit + CbOrder, ReadType); d_write(kcbUnit + Set1Cmd0, RecvrBufData); d_write(kcbUnit + Set1Cmd4, bp->b_bcount >> 1); d_write(kcbUnit + XCntLsb, bp->b_bcount); npg = btop(bp->b_bcount) ; pt = bp->b_pt ; CbPage = CbPage0; for (x=0; xpgm.pg_pfn << BPPSHIFT ; d_write(kcbUnit + CbPage, pgpfn>>16); d_write(kcbUnit + CbPage+2, pgpfn&0xFFFF); CbPage += 2; } timeout = (R_timeout); break; case CTIORBK: case CTIOWBK: if ((ctp->oflag & OFATAL) || bp->b_blkno > ctp->nxrec) goto abort; if (blkno == bp->b_blkno) { /* if (ctp->eot[unit] > 8) goto abort; if ((bp->b_flags&B_READ)==0 && ctp->eot && blkno > ctp->eot) { */ if ((bp->b_flags&B_READ)==0 && ctp->eot) { bp->b_error = ENOSPC; /* plus assez de place */ printf ("ct %d : end of cartridge bn=%d\n", dev, blkno); goto abort; } ct_com(bp) = (ct_com(bp)&0xFFFF) | ((ct_com(bp)&0xFFFF) << 16); if ( (bp->b_flags&B_READ) == 0 ) { d_write(kcbUnit + CbOrder, WriteType); d_write(kcbUnit + Set1Cmd0, WriteTape); d_write(kcbUnit + Set1Cmd4, BSIZE >> 1); d_write(kcbUnit + XCntLsb, BSIZE); pt = bp->b_pt ; pgpfn = pt->pgm.pg_pfn << BPPSHIFT ; d_write(kcbUnit + CbPage0, pgpfn>>16); d_write(kcbUnit + CbPage0+2, pgpfn&0xFFFF); timeout = (W_timeout); break; } else { d_write(kcbUnit + CbOrder, ReadType); d_write(kcbUnit + Set1Cmd0, ReadTape); d_write(kcbUnit + Set1Cmd4, BSIZE >> 1); d_write(kcbUnit + XCntLsb, BSIZE); pt = bp->b_pt ; pgpfn = pt->pgm.pg_pfn << BPPSHIFT ; d_write(kcbUnit + CbPage0, pgpfn>>16); d_write(kcbUnit + CbPage0+2, pgpfn&0xFFFF); timeout = (R_timeout); break; } } else { if (blkno < bp->b_blkno) { ct_com(bp) = CTIOSBK | ((ct_com(bp)&0xFFFF) << 16); count = bp->b_blkno - blkno; d_write(kcbUnit + CbOrder, ReadType); d_write(kcbUnit + Set1Cmd0, SpaceBlock); d_write(kcbUnit + Set1Cmd4, count << 8); I 8 d_write(kcbUnit + XCntLsb, 0); E 8 timeout = (Space_timeout * count); break; } else { ctp->b_active = SSREV; count = blkno - bp->b_blkno; break; } } /* if (ctp->eot[unit] > 8) goto abort; if ((bp->b_flags&B_READ)==0 && ctp->eot && blkno > ctp->eot) { */ case CTIOWBR: if (ctp->eot) { bp->b_error = ENOSPC; /* plus assez de place */ printf ("ct %d : end of cartridge bn=%d\n", dev, blkno); goto abort; } d_write(kcbUnit + CbOrder, WriteType); d_write(kcbUnit + Set1Cmd0, WriteTape); d_write(kcbUnit + Set1Cmd4, bp->b_bcount >> 1); d_write(kcbUnit + XCntLsb, bp->b_bcount); timeout = (W_timeout); goto init; case CTIORBR: d_write(kcbUnit + CbOrder, ReadType); d_write(kcbUnit + Set1Cmd0, ReadTape); d_write(kcbUnit + Set1Cmd4, bp->b_bcount >> 1); d_write(kcbUnit + XCntLsb, bp->b_bcount); timeout = (R_timeout); init : offset = poff(bp->b_un.b_addr); npg = btop(bp->b_bcount + offset) - 1 ; pt = bp->b_pt ; pgpfn = (pt->pgm.pg_pfn << BPPSHIFT) + offset ; d_write(kcbUnit + CbPage0, pgpfn>>16); d_write(kcbUnit + CbPage0+2, pgpfn&0xFFFF); CbPage = CbPage0 + 4; for (x=0; xpgm.pg_pfn << BPPSHIFT ; d_write(kcbUnit + CbPage, pgpfn>>16); d_write(kcbUnit + CbPage+2, pgpfn&0xFFFF); CbPage += 4; } break; } end : ctp->b_active = (ct_com(bp)>>21)&0x07; StartWB : /* Start the wonderboard. */ d_write(((kcbUnit + StartIO) | BHE) & ~A0, 0xFF); return; abort : bp->b_flags |= B_ERROR; ctp->b_actf = bp->av_forw; iodone(bp); goto loop; } wbctprint(dev,str) char *str; { dev = minor(dev); printf("%s on ct %d\n", str, dev); } wbctclr() { register char unit; for(unit = 0; unit < (wbct_cnt * NWBCTUNIT); unit++) { } } wbctintr(dev, ioir) char dev; int ioir; { register struct buf *bp; register struct iobuf *ctp; register struct wbctbuf *wbctbuf; char unit; int kcbUnit; int status; int state; unit = (ioir>>24)&1; unit = unit + (dev<<1); ctp = &wbcttab[unit]; if (ctp->b_active == -1) return; /* synchronous ioctl */ if (ctp->b_active == NULL || (bp = ctp->b_actf) == NULL) return; state2~}|{zyxwvutsrqponmlkjihgfedcor = EIO; break; } case CTIORTM: if ((ct_com(bp)&0xFFFF) == CTIORTM) { if (!status) { break; } ct_com(bp) = (ct_com(bp)&0xFFFF0000) | CTIOSTS; goto restart; } else { bp->b_error = EIO; break; } case CTIOSBK: if ((ct_com(bp)&0xFFFF) == CTIOSBK) { if (!status) { break; } ct_com(bp) = (ct_com(bp)&0xFFFF0000) | CTIOSTS; goto restart; } else { bp->b_error = EIO; break; } } ctp->blkno = 1; ctp->nxrec = 0; break; case SIORR: switch ((ct_com(bp)>>5)&0x07) { case SIORR: if (!status) { bp->b_resid = 0; ctp->blkno += (bp->b_bcount) >> 9; ctp->eot = 0; break; } ct_com(bp) = (ct_com(bp)&0xFFFF0000) | CTIOSTS; goto restart; case SSCOM: wbctbuf = &wbct_buf[unit]; bp->b_resid = (wbctbuf->Resvd6) << 9; if (bp->b_resid == bp->b_bcount) { if (wbctbuf->Resvd2 & FMK) ctp->nxrec = bp->b_blkno; if (wbctbuf->Resvd2 & EOM) ctp->eot++; else ctp->eot = 0; ctp->blkno++; } else { if (wbctbuf->Resvd2 & FMK) { ctp->nxrec = bp->b_blkno + (bp->b_bcount - bp->b_resid) <<9; ctp->oflag |= B_FMK; } if (wbctbuf->Resvd2 & EOM) { ctp->eot++; ctp->oflag |= B_EOM; } else { ctp->eot = 0; } ctp->blkno += (bp->b_bcount - bp->b_resid) >> 9; } break; } break; case SIOWR: switch ((ct_com(bp)>>5)&0x07) { case SIOWR: if (!status) { bp->b_resid = 0; ctp->blkno += (bp->b_bcount) >> 9; ctp->eot = 0; break; } ct_com(bp) = (ct_com(bp)&0xFFFF0000) | CTIOSTS; goto restart; case SSCOM: wbctbuf = &wbct_buf[unit]; if (((wbctbuf->Resvd2 & 0x0F) == 5) && (wbctbuf->Resvd8 == 0x33)) { bp->b_flags |= B_ERROR; ctp->blkno++; break; } if (wbctbuf->Resvd2 & EOM) ctp->eot++; else ctp->eot = 0; ctp->blkno++; break; } break; } ctp->b_actf = bp->av_forw; iodone(bp); restart: wbctstart(ctp); } wbctread(dev) dev_t dev; { if (wbctphys(dev)) physio(wbctrstrategy, NULL, dev, B_READ); } wbctwrite(dev) dev_t dev; { if (wbctphys(dev)) physio(wbctrstrategy, NULL, dev, B_WRITE); } wbctphys(dev) { register struct iobuf *ctp; char unit; daddr_t a; /* * check offset and count in BSIZE unit */ if (u.u_offset & BMASK || u.u_count & BMASK) { u.u_error = EFAULT; return(0); } unit = wbctunit(dev); unit = (wbctct(dev)<<1); unit = unit + (wbctdriv(dev)); if (unit > (wbct_cnt * NWBCTUNIT)) { u.u_error = ENXIO; return(0); } a = u.u_offset >> BSHIFT; ctp = &wbcttab[unit]; ctp->blkno = a; return(1); } wbctioctl(dev, cmd, arg, flag) dev_t dev; { char unit; int cmdflag; unit = wbctunit(dev); unit = (wbctct(dev)<<1); unit = unit + (wbctdriv(dev)); if (unit > (wbct_cnt * NWBCTUNIT)) { u.u_error = ENXIO; return; } /* * check command type */ if (CMDTYPE(cmd) != CTYPE) { u.u_error = EFAULT; return; } /* * check access write */ cmdflag = (cmd == CTIOWTM || cmd == CTIORAZ); if (cmdflag) if ((flag & FWRITE) == 0) { u.u_error = ENXIO; return; } switch (cmd) { case CTIORTM : /* read tape-mark */ case CTIOWTM : /* write tape-mark */ case CTIOSBK : /* skip record forward */ case CTIORWD : /* rewind */ case CTIORAZ : /* tape erase */ case CTIORTS : /* retension */ case CTIOEOD : /* skip end of data */ u.u_error = wbctcommand (dev, cmd, arg, NULL); break; default : u.u_error = ENXIO; } } E 1 h18897 s 00001/00001/00556 d D 4.4 87/05/14 16:01:55 build 8 7 c removed old SCCS strings and inserted #ident BB e s 00002/00003/00555 d D 4.3 87/04/16 17:04:51 dc 7 6 c dc - Add Bull updates from 03/05/87 e s 00012/00012/00546 d D 4.2 87/04/15 17:40:00 dc 6 5 c dc - changed #include "sys/..." to #include e s 00000/00000/00558 d D 4.1 87/02/20 13:27:05 build 5 4 c rolled rev to -r4 /dc e s 00000/00000/00558 d D 3.1 87/01/19 09:20:09 build 4 3 c rolled rev to -r3 /dc e s 00000/00000/00558 d D 2.1 87/01/19 09:20:09 build 3 2 c AUTO NULL DELTA e s 00001/00000/00557 d D 1.2 87/01/16 10:12:39 build 2 1 c add ident string /dc e s 00557/00000/00000 d D 1.1 87/01/09 16:45:38 build 1 0 c Placed under source control - dc e u U f b f n t T I 2 D 7 /* "%W% %E%" */ E 2 I 1 /* @(#) lp.c 5.1 1/15/86 09:37:31 */ E 7 I 7 D 8 /* " %W% %E% " */ E 8 I 8 #ident " %W% %E% " E 8 E 7 /* * Line Printer Driver for the WONDER BOARD */ D 6 #include "sys/param.h" #include "sys/types.h" #include "sys/conf.h" #include "sys/dir.h" #include "sys/signal.h" #include "sys/user.h" #include "sys/errno.h" #include "sys/tty.h" #include "sys/termio.h" #include "sys/lprio.h" #include "sys/cio.h" #include "sys/iomachdep.h" E 6 I 6 #include #include #include #include #include #include #include #include #include #include #include #include E 6 #define LPLOWAT 4*CLSIZE #define LPHIWAT 20*CLSIZE #define LPPRI (PZERO + 8) #define LPBUFSIZE 1024 #define MinCodeVersion 7 /* board firmware must be at least this new */ /* Codes returned by TestOffline */ #define PrinterOK 0 #define PrinterOffline 1 #define PrinterNotCnctd 2 extern struct wblp_lpdt wblp_lpdt[]; extern char wblp_lpbuf[]; char wblp_cnt; int wblp_addr[4]; int PROMVersion; int CodeVersion; wblpinit() { char unit; int type; register struct wblp_lpdt *lp; /* This routine is responsible for initializing the driver. initializes the driver's global variables. */ wblp_cnt = confsw[CIO].c_cnt; for (unit=0; unitlp_flags = LCXFLAG; lp->lp_ind = 0; lp->lp_col = 132; lp->lp_line = 66; lp->lp_tabs = 8; lp->lp_mlc = 0; lp->lp_ccc = 0; lp->lp_buf = &wblp_lpbuf[unit*LPBUFSIZE]; lp->lp_order = (LpTypeCent<<8) + LpWrite; } else { if (type == LpTypeDP) { /* initialize IOCTL structures */ lp->lp_flags = LDPFLAG; lp->lp_ind = 0; lp->lp_col = 132; lp->lp_line = 66; lp->lp_tabs = 8; lp->lp_mlc = 0; lp->lp_ccc = 0; lp->lp_buf = &wblp_lpbuf[unit*LPBUFSIZE]; lp->lp_order = (LpTypeDP<<8) + LpWrite; } } d_write(wblp_addr[unit] | LpCB + LpCmd2, (LpSMGo<<8) + LpSMGo); } } wblpopen(dev,mode) int dev; int mode; /* The open routine performs the following functions: 1. Checks that the device is not already in use, and read access not requested. 2. Initializes driver variables, IOCTL structures. 3. Validates major, minor device numbers, and assigns HW interface type. 4. Checks cable type, and device status (e.g. Online). */ { int type; register char unit; register struct wblp_lpdt *lp; unit = dev>>6&03; lp = &wblp_lpdt[unit]; if (!(lp->lp_flags & LONCE)) { /* device is not initialised */ u.u_error = EIO; return; } if (lp->lp_flags & LOPEN) { /* check if device already in use */ u.u_error = EIO; return; } if ((lp->lp_flags & LCENT)) { if (dev & DP) { u.u_error = EIO; return; } else { type == LpTypeCent; goto good; } } else { if (dev & CX) { u.u_error = EIO; return; } else { type == LpTypeDP; goto good; } } good : /* Try to determine if the printer is in a good state. */ if (testOffline(unit, type) == PrinterNotCnctd ) return; lp->lp_flags |= LOPEN; } wblpclose(dev) int dev; { /* The basic processing which must be done for a close is to wait for all data in the input/output buffers to be sent, then to send a form-feed. If the abort flag is set, the contents of the input buffer are discarded, and the board is told to abort the current operation. */ register char unit; register struct wblp_lpdt *lp; unit = dev>>6&03; lp = &wblp_lpdt[unit]; if (!(lp->lp_flags & LOPEN)) { /* device is already open */ u.u_error = EIO; return; } spl4(); if (lp->lp_count != 0){ wblpstart(unit); } while(lp->lp_count != 0) { lp->lp_flags |= LASLP; sleep(lp, PZERO-1); } spl0(); lp->lp_flags &= ~LOPEN; } wblpread() { u.u_error = EIO; return; } wblpwrite(dev) int dev; { register char unit; register int c; register struct wblp_lpdt *lp; unit = dev>>6&03; lp = &wblp_lpdt[unit]; while (u.u_count) { spl4(); D 7 while( lp->lp_count > LPBUFSIZE) { E 7 I 7 while( lp->lp_count > (LPBUFSIZE - 128)) { E 7 wblpstart(unit); lp->lp_flags |= LASLP; sleep(lp, PZERO-1); } spl0(); c = fubyte(u.u_base++); if (c < 0) { u.u_error = EFAULT; break; } u.u_count--; wblpoutput(unit, c); } } wblpoutput(unit, c) register unit, c; /* This routine moves data from the input buffer to the output buffer, doing the conversions indicated by the LPRIO structure. If, after converting a character, the output buffer pointer is greater than MaxOutputBuffer, *pOutputBufFull will be set true, indicating that the buffer is full, and DMA to the device should be started. */ { register struct wblp_lpdt *lp; register int flag; register unsigned char i, count; lp = &wblp_lpdt[unit]; flag = lp->lp_flags; switch(c) { case '\f': lp->lp_mlc = 0; *lp->lp_buf++ = '\f'; lp->lp_count++; goto nl3; case '\r': cr : *lp->lp_buf++ = '\r'; lp->lp_count++; if (!(flag & LCRCRNL)) goto nl3; lp->lp_mlc++; if (flag & LFLMLC) { if (lp->lp_mlc >= lp->lp_line ) { lp->lp_mlc = 0; if (!(flag & LFFAUTO)) goto cr1; else { *lp->lp_buf++ = '\f'; lp->lp_count++; if (!(flag & LFFFFCR)) goto nl3; goto nl2; } } } cr1 : *lp->lp_buf++ = '\n'; lp->lp_count++; goto nl3; case '\n': lp->lp_mlc++; if (flag & LFLMLC) { if (lp->lp_mlc >= lp->lp_line ) { lp->lp_mlc = 0; if (!(flag & LFFAUTO)) goto nl1; else { *lp->lp_buf++ = '\f'; lp->lp_count++; if (!(flag & LFFFFCR)) goto nl3; goto nl2; } } } nl1 : *lp->lp_buf++ = '\n'; lp->lp_count++; if (flag & LNLNLCR) { nl2 : *lp->lp_buf++ = '\r'; lp->lp_count++; nl3 : if (flag & LINDENT) { i = lp->lp_ind; lp->lp_ccc = lp->lp_ind; while (i) { *lp->lp_buf++ = ' '; lp->lp_count++; i--; } } else { lp->lp_ccc = 0; } } return; case '\b': if (flag & LINDENT) i = lp->lp_ind; else i = 0; if (lp->lp_ccc > lp->lp_ind) { if (lp->lp_ccc < lp->lp_col) { lp->lp_ccc--; if (flag & LBSPACE) { *lp->lp_buf--; lp->lp_count--; return; } goto def; } } return; case '\t': if (!(flag & LEXPTAB)) goto def; if (flag & LINDENT) i = lp->lp_ind; else i = 0; count = (lp->lp_ccc + lp->lp_tabs - i); count = count / lp->lp_tabs; count = (count * lp->lp_tabs) + i - lp->lp_ccc; while (count) { if (lp->lp_ccc < lp->lp_col) { *lp->lp_buf++ = ' '; lp->lp_count++; lp->lp_ccc++; count--; } else goto tt1; } return; tt1 : if (!(flag & LTRUNC)) goto cr; return; default: def : if (flag & LFLCCC) { if (lp->lp_ccc < lp->lp_col) { *lp->lp_buf++ = c; lp->lp_count++; lp->lp_ccc++; return; } *lp->lp_buf++ = '\r'; lp->lp_count++; if (flag & LTRUNC) return; if (!(flag & LCRCRNL)) goto def2; lp->lp_mlc++; if (flag & LFLMLC) { if (lp->lp_mlc >= lp->lp_line ) { lp->lp_mlc = 0; if (!(flag & LFFAUTO)) goto def1; else { *lp->lp_buf++ = '\f'; lp->lp_count++; if (!(flag & LFFFFCR)) goto def2; *lp->lp_buf++ = '\r'; lp->lp_count++; goto def2; } } } def1 : *lp->lp_buf++ = '\n'; lp->lp_count++; def2 : lp->lp_ccc = 0; if (flag & LINDENT) { i = lp->lp_ind; lp->lp_ccc = lp->lp_ind; while (i) { *lp->lp_buf++ = ' '; lp->lp_count++; i--; } } } *lp->lp_buf++ = c; lp->lp_count++; lp->lp_ccc++; } } wblpintr(dev, ioir) char dev; int ioir; /* 1. Checks for good values in the order, status bytes of the control block. 2. Resets the output buffer pointer. 3. If Input buffer has data, move it to output buffer. 4. If Output buffer is now full, start a new DMA transfer. 5. If Delayed Request was Write and Input buffer is empty, wakeup write request. 6. If Delayed Request was Close or IOCTL, and no interrupts pending (flush completed) wakeup Close/IOCTL. */ { register struct wblp_lpdt *lp; unsigned int Vread; lp = &wblp_lpdt[dev]; d_read(wblp_addr[dev] | LpCB + LpOrder, &Vread); if ((Vread&0xFF) != 0) { printf("LP: *** Error - LP Order = %x after interrupt. (Should be 0)\n", Vread&0xFF); } d_read(wblp_addr[dev] | LpCB + LpReturnStatus, &Vread); if ((Vread&0xFF) != 0) { printf("LP: *** Error - Return status byte = %x after interrupt.\n", Vread&0xFF); } lp->lp_count = 0; lp->lp_flags &= ~LWAIT; wakeup(lp->lp_flags); if (lp->lp_flags & LASLP) { lp->lp_flags &= ~LASLP; wakeup(lp); } } wblpstart(unit, count) int unit; int count; { unsigned int Vread; register struct wblp_lpdt *lp; lp = &wblp_lpdt[unit]; /* This routine sends the wonderboard's lineprinter control unit a command block which instructs it to print the contents of the output buffer. The board will respond with an interrupt when all of the data has been moved to buffers on the board. */ if ((lp->lp_flags & LWAIT)) { printf("LP: *** Error - StartDMA called while DMA in progress"); sleep(lp->lp_flags, PZERO-1); } d_read(wblp_addr[unit] | LpCB + LpOrder, &Vread); if ((Vread&0xFF) != 0) { printf("LP: *** Error - About to start DMA, but LP Order is not 0. Order = %x\n", Vread&0xFF); } /* This routine moves a block of data from ridge memory to shared memory on the wonderboard. It moves data a halfword at a time, so pIOData must point to a halfword alligned structure. IORAMAddr is assumed to contain the board address in the upper byte, and a 0 in the Map/~Mem bit. It is added to IOAddr to form a complete IO address. */ lp->lp_buf -= lp->lp_count; /* Move halfwords from high to low so orders get written last. */ d_write(wblp_addr[unit] | LpCB + LpRidgeAddrU, (unsigned int)(lp->lp_buf)>>16); d_write(wblp_addr[unit] | LpCB + LpRidgeAddrL, (unsigned int)(lp->lp_buf)&0xFFFF); d_write(wblp_addr[unit] | LpCB + LpByteCount, lp->lp_count); lp->lp_flags |= LWAIT; d_write(wblp_addr[unit] | LpCB + LpOrder, lp->lp_order); } wblpioctl(dev, cmd, arg, mode) int dev; int cmd; int arg; int mode; { register struct wblp_lpdt *lp; struct lprio lpr; /* printf("lpioctl called: dev = %x, cmd = %x, arg = %x, mode = %x\n", */ /* dev,cmd,arg,mode); */ lp = &wblp_lpdt[dev>>6&3]; switch(cmd) { case LPRGET: lpr.flag = lp->lp_flags&MGFLAG; lpr.ind = lp->lp_ind; lpr.col = lp->lp_col; lpr.line = lp->lp_line; lpr.tabs = lp->lp_tabs; if (copyout(&lpr, arg, sizeof lpr)) u.u_error = EFAULT; break; case LPRSET: if (copyin(arg, &lpr, sizeof lpr)) { u.u_error = EFAULT; break; } lp->lp_flags = lpr.flag|LONCE; lp->lp_ind = lpr.ind; lp->lp_col = lpr.col; lp->lp_line = lpr.line; lp->lp_tabs = lpr.tabs; break; case LPRSANE: if (dev & CX) { lp->lp_flags = LCXFLAG; lp->lp_ind = 0; lp->lp_col = 132; lp->lp_line = 66; lp->lp_tabs = 8; lp->lp_mlc = 0; lp->lp_ccc = 0; } else { lp->lp_flags = LDPFLAG; lp->lp_ind = 0; lp->lp_col = 132; lp->lp_line = 66; lp->lp_tabs = 8; lp->lp_mlc = 0; lp->lp_ccc = 0; } break; default: u.u_error = EINVAL; } } wblpclr() { register int i; register struct wblp_lpdt *lp; for (i = 0; i < 3; i++) { lp = &wblp_lpdt[i]; if (!(lp->lp_flags & LOPEN)) continue; } } testOffline(unit, LpDevType) /* This routine checks the current device status byte to see if the printer is connected, powered on, online, and has paper. If any of the above are false, TestOffline returns true. */ char unit; char LpDevType; { int PrinterStatus = PrinterOK; unsigned int status; d_read(wblp_addr[unit] | LpCB + LpDeviceStatus, &status); switch (LpDevType) { case LpTypeDP: if ((status & LpTypeMask) != LpTypeDP) PrinterStatus = PrinterNotCnctd; /* cable disconnected to CIO ? */ else if (!(status & LpDPIFaceConn)) PrinterStatus = PrinterNotCnctd; /* cable not connected to printer */ else if (!(status & LpTOFL) && !(status & LpBOFL)) PrinterStatus = PrinterNotCnctd; /* printer not powered on ? */ else if (status & LpDPOnlineL) PrinterStatus = PrinterOffline; /* printer is really just offline! (bit is low-true) */ break; case LpTypeCent: if ((status & LpTypeMask) != LpTypeCent) PrinterStatus = PrinterNotCnctd; /* cable disconnected ? */ else if (status & LpCFault) PrinterStatus = PrinterNotCnctd; /* other problems */ else if (!(status & LpNoPaperL)) PrinterStatus = PrinterOffline; /* out of paper */ else if (status & LpCSelectedL) PrinterStatus = PrinterOffline; /* deselected */ break; } return (PrinterStatus); } E 1 h31089 s 00001/00001/00182 d D 4.6 87/05/20 13:12:42 brian 10 9 c mbuf.h put back to standard search path BB e s 00001/00001/00182 d D 4.5 87/05/14 16:02:09 build 9 8 c removed old SCCS strings and inserted #ident BB e s 00001/00001/00182 d D 4.4 87/05/07 18:53:26 van 8 7 c van - move defsocket.h back to /usr/include/sys e s 00003/00003/00180 d D 4.3 87/04/29 16:04:32 van 7 6 c van - moved ucb networking includes to INCUCB e s 00013/00013/00170 d D 4.2 87/04/15 17:40:09 dc 6 5 c dc - changed #include "sys/..." to #include e s 00000/00000/00183 d D 4.1 87/02/20 13:27:08 build 5 4 c rolled rev to -r4 /dc e s 00000/00000/00183 d D 3.1 87/01/19 09:20:13 build 4 3 c rolled rev to -r3 /dc e s 00000/00000/00183 d D 2.1 87/01/19 09:20:13 build 3 2 c AUTO NULL DELTA e s 00001/00000/00182 d D 1.2 87/01/16 10:12:44 build 2 1 c add ident string /dc e s 00182/00000/00000 d D 1.1 87/01/09 17:20:09 build 1 0 c Placed under source control - dc e u U f b f n t T I 2 D 9 /* "%W% %E%" */ E 9 I 9 #ident " %W% %E% " E 9 E 2 I 1 /* * File rawnet.c * * Handle all raw Ethernet packet IO */ D 6 #include "sys/param.h" #include "sys/types.h" #include "sys/systm.h" #include "sys/conf.h" #include "sys/dir.h" #include "sys/signal.h" #include "sys/page.h" #include "sys/user.h" #include "sys/errno.h" #include "sys/defsocket.h" #include "sys/mbuf.h" #include "sys/socket.h" #include "sys/rnio.h" E 6 I 6 #include #include #include #include #include #include #include #include #include D 7 #include #include #include E 7 I 7 D 8 #include "sys/defsocket.h" E 8 I 8 #include E 8 D 10 #include "sys/mbuf.h" E 10 I 10 #include E 10 #include "sys/socket.h" E 7 #include E 6 /* * Local Constants */ #define PRIOR 20 #define MINSIZE 14 #define MAXSIZE 1514 /* * Local Data */ static int dopen=0; static int rawaiting=0; static struct mbuf *buffer; /* * Global data */ extern char localAddress[6]; /*****************************************************************/ rnetopen(dev, flag) { /* * Verify arguments - only one minor device */ if (dev != 0) { u.u_error = EIO; return; } /* * Only open once */ if (!dopen) dopen = 1; } /*****************************************************************/ rnetclose(dev, flag) { dopen = 0; } /*****************************************************************/ rnetread(dev) { /* * Return a waiting packet, or wait for one to come in. We get * here from a read request. */ int len, lbase; /* * Verify arguments - only one minor device, check byte count */ if ((dev != 0) || (u.u_count < MINSIZE) || (u.u_count > MAXSIZE)) { u.u_error = EIO; return; } /* * If we don't have a packet waiting, then wait */ if (!rawaiting) sleep(rnetread, PRIOR | PCATCH); /* * Check the lengths */ len = buffer->m_len; if (len > u.u_count) len = u.u_count; u.u_count -= len; /* * Get the local base address */ lbase = (int) buffer + (int) buffer->m_off; /* * Copyout the data in the mbuf and free it */ copyout(lbase, u.u_base, len); rawaiting = 0; m_freem(buffer); } /*****************************************************************/ rnetwrite(dev) { /* * Output a raw packet. We get here from a write request */ struct mbuf *m; struct mbuf *bigbuf=0; struct sockaddr dst; /* * Verify arguments - only one minor device, check length */ if ((dev != 0) || (u.u_count < MINSIZE) || (u.u_count > MAXSIZE)) { u.u_error = EIO; return; } /* * Get an mbuf and bigbuf */ m = m_get(M_WAIT, MT_DATA); if (m == 0) { printf("rnetwrite: out of mbufs\n"); return; } m->m_len = 0; MCLGET(bigbuf, 1); if (bigbuf == 0) { printf("rnetwrite: out of bigbufs\n"); return; } m->m_off = (int) bigbuf - (int) m; /* * Copy in the user packet header and data */ copyin(u.u_base, dst.sa_data, 14); copyin(u.u_base+14, mtod(m, char *), u.u_count-14); m->m_len = u.u_count - 14; u.u_count = 0; /* * Set up various destination info and queue for output */ dst.sa_family = AF_UNSPEC; wbetoutput(0 /* ifp not used */, m, &dst); } /*****************************************************************/ rnetioctl(dev, cmd, arg, flag) { /* * Check arguments */ if ((dev != 0) || (cmd != RNIOADDR)) { u.u_error = EIO; return; } /* * Copy it out and return */ copyout(localAddress, arg, 6); } /*****************************************************************/ rawinput(m) struct mbuff *m; { /* * We get here from the hardware interrupt service, so we just got a packet * save the mbuf pointer and wakeup any sleeping reads. */ buffer = m; rawaiting = 1; wakeup(rnetread); } /*****************************************************************/ rawbuffer() { /* * This just checks to see if (the one) buffer is free */ return(rawaiting); } E 1 h57067 s 00001/00001/00457 d D 4.14 87/05/20 13:42:06 brian 26 25 c mbuf.h put back on system search path BB e s 00004/00001/00454 d D 4.13 87/05/12 18:12:38 dc 25 24 c dc - Add ext tape support e s 00001/00000/00454 d D 4.12 87/05/08 15:18:27 dc 24 23 c dc - Convert CONST to #define e s 00002/00010/00452 d D 4.11 87/05/08 14:57:14 dc 23 22 c dc - Convert CONST to #define e s 00001/00001/00461 d D 4.10 87/05/07 18:53:18 van 22 21 c van - move defsocket.h back to /usr/include/sys e s 00001/00000/00461 d D 4.9 87/05/07 14:00:40 dc 21 20 c dc - Add headwall clock interactions e s 00001/00000/00460 d D 4.8 87/04/29 20:23:55 build 20 19 c van - added IFLAGS e s 00004/00004/00456 d D 4.7 87/04/29 16:04:34 van 19 18 c van - moved ucb networking includes to INCUCB e s 00002/00001/00458 d D 4.6 87/04/27 18:41:08 dc 18 17 c dc - add mem.h to dependencies for mem.c e s 00017/00001/00442 d D 4.5 87/04/27 13:46:58 dc 17 16 c dc - Add hwdiag.c, physmem.H e s 00002/00002/00441 d D 4.4 87/04/17 09:22:41 dc 16 15 c dc - Add Bull changes from 03/05/87 e s 00020/00005/00423 d D 4.3 87/04/16 16:49:30 dc 15 14 c dc - Add Bull updates from 03/05/87 e s 00001/00003/00427 d D 4.2 87/02/25 17:50:42 dc 14 13 c change CFLAGS to DFLAGS e s 00000/00000/00430 d D 4.1 87/02/20 15:03:48 build 13 12 c rolled rev to -r4 /dc e s 00000/00000/00430 d D 3.4 87/02/20 15:02:26 build 12 10 c rolled rev to -r4 /dc e s 00000/00000/00430 d R 4.1 87/02/20 15:01:38 build 11 10 c rolled rev to -r4 /dc e s 00026/00001/00404 d D 3.3 87/02/20 15:00:36 build 10 8 c add SOURCES to clobber rule e s 00000/00000/00405 d R 4.1 87/02/20 13:30:29 build 9 8 c rolled rev to -r4 /dc e s 00016/00000/00389 d D 3.2 87/02/13 12:50:22 build 8 7 c add tv (line discipline 2) e s 00000/00000/00389 d D 3.1 87/01/19 09:20:16 build 7 6 c rolled rev to -r3 /dc e s 00000/00000/00389 d D 2.1 87/01/19 09:20:16 build 6 5 c AUTO NULL DELTA e s 00001/00000/00388 d D 1.5 87/01/16 10:12:48 build 5 4 c add ident string /dc e s 00001/00001/00387 d D 1.4 87/01/14 17:49:24 build 4 3 c remove redundant -c from CFLAGS e s 00016/00000/00372 d D 1.3 87/01/09 17:23:35 build 3 2 c add rawnet.c /dc e s 00024/00057/00348 d D 1.2 87/01/09 17:12:21 build 2 1 c add sccs control /dc e s 00405/00000/00000 d D 1.1 87/01/09 16:44:54 build 1 0 c Placed under source control - dc e u U f b f n t T I 5 D 15 # "%W% %E%" E 15 I 15 # " %W% %E% " E 15 E 5 I 1 LIBNAME = LIB2.a INCRT = $(SPX)/usr/include I 20 IFLAGS = -I$(INCUCB) E 20 D 14 OPTIONS = OSDEBUG D 2 CFLAGS = -O -I$(INCRT) -D$(OPTIONS) -DBSD CC = cc -c E 2 I 2 D 4 CFLAGS = -c -O -I$(INCRT) -D$(OPTIONS) -DBSD E 4 I 4 CFLAGS = -O -I$(INCRT) -D$(OPTIONS) -DBSD E 4 E 2 FRC = E 14 I 14 DFLAGS = -DOSDEBUG -DBSD E 14 I 10 SOURCES = \ clist.c\ err.c\ fpal.c\ fplp.c\ I 17 hwdiag.c\ E 17 iomachdep.c\ mas.c\ me.c\ mem.c\ mt.c\ partab.c\ prof.c\ pty.c\ rawnet.c\ smd.c\ I 16 smlog.c\ E 16 sxt.c\ sys.c\ D 15 tty0.c\ E 15 I 15 tt1.c\ E 15 tty.c\ tv.c\ wbal.c\ wbct.c\ wblp.c E 10 FILES = \ $(LIBNAME)(clist.o)\ $(LIBNAME)(err.o)\ $(LIBNAME)(fpal.o)\ $(LIBNAME)(fplp.o)\ I 17 $(LIBNAME)(hwdiag.o)\ E 17 $(LIBNAME)(iomachdep.o)\ $(LIBNAME)(mas.o)\ $(LIBNAME)(me.o)\ $(LIBNAME)(mem.o)\ $(LIBNAME)(mt.o)\ $(LIBNAME)(partab.o)\ $(LIBNAME)(prof.o)\ $(LIBNAME)(pty.o)\ I 3 $(LIBNAME)(rawnet.o)\ E 3 $(LIBNAME)(smd.o)\ I 15 $(LIBNAME)(smlog.o)\ E 15 $(LIBNAME)(sxt.o)\ $(LIBNAME)(sys.o)\ D 15 $(LIBNAME)(tty0.o)\ E 15 I 15 $(LIBNAME)(tt1.o)\ E 15 $(LIBNAME)(tty.o)\ I 8 $(LIBNAME)(tv.o)\ E 8 $(LIBNAME)(wbal.o)\ $(LIBNAME)(wbct.o)\ $(LIBNAME)(wblp.o) I 17 D 23 HEADERS = physmem.H E 23 E 17 all: $(LIBNAME) .PRECIOUS: $(LIBNAME) $(LIBNAME): $(FILES) D 2 # ar rv $@ $? # -rm -f $? E 2 D 2 .c.o: .c.a: $(CC) $(CFLAGS) $< ar rv $@ $*.o rm -f $*.o E 2 clean: -rm -f *.o I 10 # clobber assumes that the SOURCES are represented in sccs format!!! E 10 clobber: clean D 10 -rm -f $(LIBNAME) E 10 I 10 D 17 -rm -f $(LIBNAME) $(SOURCES) E 17 I 17 D 23 -rm -f $(LIBNAME) $(SOURCES) $(HEADERS) E 23 I 23 -rm -f $(LIBNAME) $(SOURCES) E 23 E 17 E 10 $(LIBNAME)(clist.o):\ $(INCRT)/sys/param.h\ $(INCRT)/sys/types.h\ D 2 $(INCRT)/sys/tty.h\ $(FRC) E 2 I 2 $(INCRT)/sys/tty.h E 2 $(LIBNAME)(disk.o):\ $(INCRT)/sys/param.h\ $(INCRT)/sys/types.h\ $(INCRT)/sys/sysmacros.h\ $(INCRT)/sys/dir.h\ $(INCRT)/sys/signal.h\ $(INCRT)/sys/user.h\ $(INCRT)/sys/errno.h\ $(INCRT)/sys/buf.h\ $(INCRT)/sys/elog.h\ $(INCRT)/sys/iobuf.h\ D 2 $(INCRT)/sys/systm.h\ $(FRC) E 2 I 2 $(INCRT)/sys/systm.h E 2 $(LIBNAME)(err.o):\ $(INCRT)/sys/param.h\ $(INCRT)/sys/types.h\ $(INCRT)/sys/buf.h\ $(INCRT)/sys/dir.h\ $(INCRT)/sys/signal.h\ $(INCRT)/sys/user.h\ $(INCRT)/sys/errno.h\ $(INCRT)/sys/file.h\ $(INCRT)/sys/utsname.h\ $(INCRT)/sys/elog.h\ D 2 $(INCRT)/sys/erec.h\ $(FRC) E 2 I 2 $(INCRT)/sys/erec.h E 2 I 17 $(LIBNAME)(hwdiag.o):\ $(INCRT)/sys/types.h\ $(INCRT)/sys/page.h\ $(INCRT)/sys/termio.h\ I 24 $(INCRT)/sys/const.c.h\ E 24 I 21 $(INCRT)/sys/hwclock.h\ E 21 D 23 physmem.H E 23 I 23 $(INCRT)/sys/physmem.h E 23 E 17 $(LIBNAME)(iomachdep.o):\ $(INCRT)/sys/types.h\ $(INCRT)/sys/conf.h\ $(INCRT)/sys/tty.h\ $(INCRT)/sys/termio.h\ $(INCRT)/sys/fdlp.h\ D 2 $(INCRT)/sys/iomachdep.h\ $(FRC) E 2 I 2 D 25 $(INCRT)/sys/iomachdep.h E 25 I 25 $(INCRT)/sys/iomachdep.h\ $(INCRT)/sys/mt.h\ $(INCRT)/sys/param.h\ $(INCRT)/sys/sysmacros.h E 25 E 2 $(LIBNAME)(fpal.o):\ $(INCRT)/sys/param.h\ $(INCRT)/sys/types.h\ $(INCRT)/sys/dir.h\ $(INCRT)/sys/signal.h\ $(INCRT)/sys/user.h\ $(INCRT)/sys/errno.h\ $(INCRT)/sys/file.h\ $(INCRT)/sys/termio.h\ $(INCRT)/sys/buf.h\ $(INCRT)/sys/systm.h\ $(INCRT)/sys/conf.h\ $(INCRT)/sys/sysinfo.h\ $(INCRT)/sys/tty.h\ D 2 $(INCRT)/sys/fdlp.h\ $(FRC) E 2 I 2 $(INCRT)/sys/fdlp.h E 2 $(LIBNAME)(fplp.o):\ $(INCRT)/sys/param.h\ $(INCRT)/sys/types.h\ $(INCRT)/sys/dir.h\ $(INCRT)/sys/signal.h\ $(INCRT)/sys/user.h\ $(INCRT)/sys/errno.h\ $(INCRT)/sys/tty.h\ $(INCRT)/sys/termio.h\ $(INCRT)/sys/lprio.h\ D 2 $(INCRT)/sys/fdlp.h\ $(FRC) E 2 I 2 $(INCRT)/sys/fdlp.h E 2 $(LIBNAME)(mas.o):\ $(INCRT)/sys/param.h\ $(INCRT)/sys/types.h\ $(INCRT)/sys/dir.h\ $(INCRT)/sys/signal.h\ $(INCRT)/sys/user.h\ $(INCRT)/sys/errno.h\ $(INCRT)/sys/file.h\ $(INCRT)/sys/termio.h\ $(INCRT)/sys/buf.h\ $(INCRT)/sys/systm.h\ $(INCRT)/sys/conf.h\ $(INCRT)/sys/sysinfo.h\ $(INCRT)/sys/tty.h\ $(INCRT)/sys/iomachdep.h\ $(INCRT)/sys/me.h\ D 2 $(INCRT)/sys/mas.h\ $(FRC) E 2 I 2 $(INCRT)/sys/mas.h E 2 $(LIBNAME)(me.o):\ $(INCRT)/sys/param.h\ $(INCRT)/sys/types.h\ $(INCRT)/sys/dir.h\ $(INCRT)/sys/signal.h\ $(INCRT)/sys/user.h\ $(INCRT)/sys/errno.h\ $(INCRT)/sys/file.h\ $(INCRT)/sys/termio.h\ $(INCRT)/sys/buf.h\ $(INCRT)/sys/systm.h\ $(INCRT)/sys/conf.h\ $(INCRT)/sys/sysinfo.h\ $(INCRT)/sys/tty.h\ $(INCRT)/sys/iomachdep.h\ $(INCRT)/sys/inode.h\ $(INCRT)/sys/filehdr.h\ $(INCRT)/sys/aouthdr.h\ $(INCRT)/sys/scnhdr.h\ D 2 $(INCRT)/sys/me.h\ $(FRC) E 2 I 2 $(INCRT)/sys/me.h E 2 $(LIBNAME)(mt.o):\ $(INCRT)/sys/param.h\ $(INCRT)/sys/types.h\ $(INCRT)/sys/systm.h\ $(INCRT)/sys/sysmacros.h\ $(INCRT)/sys/utsname.h\ $(INCRT)/sys/page.h\ $(INCRT)/sys/buf.h\ $(INCRT)/sys/elog.h\ $(INCRT)/sys/erec.h\ $(INCRT)/sys/iobuf.h\ $(INCRT)/sys/conf.h\ $(INCRT)/sys/dir.h\ $(INCRT)/sys/signal.h\ $(INCRT)/sys/errno.h\ $(INCRT)/sys/user.h\ $(INCRT)/sys/mt.h\ $(INCRT)/sys/mtio.h\ $(INCRT)/sys/var.h\ D 2 $(INCRT)/sys/file.h\ $(FRC) E 2 I 2 $(INCRT)/sys/file.h E 2 $(LIBNAME)(mem.o):\ $(INCRT)/sys/param.h\ $(INCRT)/sys/types.h\ $(INCRT)/sys/sysmacros.h\ $(INCRT)/sys/dir.h\ $(INCRT)/sys/signal.h\ $(INCRT)/sys/user.h\ $(INCRT)/sys/errno.h\ $(INCRT)/sys/buf.h\ $(INCRT)/sys/systm.h\ D 2 $(INCRT)/sys/page.h\ $(FRC) E 2 I 2 D 18 $(INCRT)/sys/page.h E 18 I 18 $(INCRT)/sys/page.h\ $(INCRT)/sys/mem.h E 18 E 2 D 2 $(LIBNAME)(partab.o):\ $(FRC) E 2 I 2 $(LIBNAME)(partab.o): E 2 $(LIBNAME)(prof.o):\ $(INCRT)/sys/signal.h\ $(INCRT)/sys/errno.h\ $(INCRT)/sys/param.h\ $(INCRT)/sys/psl.h\ $(INCRT)/sys/types.h\ $(INCRT)/sys/dir.h\ $(INCRT)/sys/user.h\ D 2 $(INCRT)/sys/buf.h\ $(FRC) E 2 I 2 $(INCRT)/sys/buf.h E 2 $(LIBNAME)(pty.o):\ $(INCRT)/sys/signal.h\ $(INCRT)/sys/errno.h\ $(INCRT)/sys/param.h\ $(INCRT)/sys/types.h\ $(INCRT)/sys/dir.h\ $(INCRT)/sys/user.h\ $(INCRT)/sys/buf.h\ $(INCRT)/sys/sysmacros.h\ $(INCRT)/sys/file.h\ $(INCRT)/sys/tty.h\ $(INCRT)/sys/ttold.h\ $(INCRT)/sys/termio.h\ $(INCRT)/sys/conf.h\ $(INCRT)/sys/var.h\ $(INCRT)/sys/pty.h\ D 2 $(INCRT)/sys/bsdioctl.h\ $(FRC) E 2 I 2 D 19 $(INCRT)/sys/bsdioctl.h E 19 I 19 $(INCUCB)/sys/bsdioctl.h E 19 I 3 $(LIBNAME)(rawnet.o):\ $(INCRT)/sys/param.h\ $(INCRT)/sys/types.h\ $(INCRT)/sys/systm.h\ $(INCRT)/sys/conf.h\ $(INCRT)/sys/dir.h\ $(INCRT)/sys/signal.h\ $(INCRT)/sys/page.h\ $(INCRT)/sys/user.h\ $(INCRT)/sys/errno.h\ D 19 $(INCRT)/sys/defsocket.h\ $(INCRT)/sys/mbuf.h\ $(INCRT)/sys/socket.h\ E 19 I 19 D 22 $(INCUCB)/sys/defsocket.h\ E 22 I 22 $(INCRT)/sys/defsocket.h\ E 22 D 26 $(INCUCB)/sys/mbuf.h\ E 26 I 26 $(INCRT)/sys/mbuf.h\ E 26 $(INCUCB)/sys/socket.h\ E 19 $(INCRT)/sys/rnio.h E 3 E 2 $(LIBNAME)(smd.o):\ $(INCRT)/sys/param.h\ $(INCRT)/sys/types.h\ $(INCRT)/sys/sysmacros.h\ $(INCRT)/sys/dir.h\ $(INCRT)/sys/signal.h\ $(INCRT)/sys/user.h\ $(INCRT)/sys/errno.h\ $(INCRT)/sys/buf.h\ $(INCRT)/sys/elog.h\ $(INCRT)/sys/iobuf.h\ $(INCRT)/sys/systm.h\ $(INCRT)/sys/page.h\ $(INCRT)/sys/iomachdep.h\ $(INCRT)/sys/smd.h\ $(INCRT)/sys/filsys.h\ D 2 $(INCRT)/sys/vtoc.h\ $(FRC) E 2 I 2 $(INCRT)/sys/vtoc.h E 2 I 15 $(LIBNAME)(smlog.o):\ $(INCRT)/sys/param.h\ $(INCRT)/sys/types.h\ $(INCRT)/sys/buf.h\ $(INCRT)/sys/dir.h\ $(INCRT)/sys/signal.h\ $(INCRT)/sys/user.h\ $(INCRT)/sys/errno.h\ $(INCRT)/sys/file.h\ D 16 $(INCRT)/sys/sysmacros.h\ $(FRC) E 16 I 16 $(INCRT)/sys/sysmacros.h E 16 E 15 $(LIBNAME)(sxt.o):\ $(INCRT)/sys/param.h\ $(INCRT)/sys/types.h\ $(INCRT)/sys/sysmacros.h\ $(INCRT)/sys/seg.h\ $(INCRT)/sys/page.h\ $(INCRT)/sys/systm.h\ $(INCRT)/sys/file.h\ $(INCRT)/sys/conf.h\ $(INCRT)/sys/seg.h\ $(INCRT)/sys/region.h\ $(INCRT)/sys/proc.h\ $(INCRT)/sys/dir.h\ $(INCRT)/sys/tty.h\ $(INCRT)/sys/signal.h\ $(INCRT)/sys/user.h\ $(INCRT)/sys/errno.h\ $(INCRT)/sys/termio.h\ $(INCRT)/sys/ttold.h\ D 2 $(INCRT)/sys/sxt.h\ $(FRC) E 2 I 2 $(INCRT)/sys/sxt.h E 2 $(LIBNAME)(sys.o):\ $(INCRT)/sys/param.h\ $(INCRT)/sys/types.h\ $(INCRT)/sys/sysmacros.h\ $(INCRT)/sys/dir.h\ $(INCRT)/sys/signal.h\ $(INCRT)/sys/user.h\ $(INCRT)/sys/errno.h\ $(INCRT)/sys/conf.h\ D 2 $(INCRT)/sys/proc.h\ $(FRC) E 2 I 2 $(INCRT)/sys/proc.h E 2 D 15 $(LIBNAME)(tty0.o):\ E 15 I 15 $(LIBNAME)(tt1.o):\ E 15 $(INCRT)/sys/param.h\ $(INCRT)/sys/types.h\ $(INCRT)/sys/systm.h\ $(INCRT)/sys/conf.h\ $(INCRT)/sys/dir.h\ $(INCRT)/sys/signal.h\ $(INCRT)/sys/page.h\ $(INCRT)/sys/user.h\ $(INCRT)/sys/errno.h\ $(INCRT)/sys/proc.h\ $(INCRT)/sys/file.h\ $(INCRT)/sys/tty.h\ $(INCRT)/sys/termio.h\ $(INCRT)/sys/crtctl.h\ D 2 $(INCRT)/sys/sysinfo.h\ $(FRC) E 2 I 2 $(INCRT)/sys/sysinfo.h E 2 $(LIBNAME)(tt0.o):\ $(INCRT)/sys/param.h\ $(INCRT)/sys/types.h\ $(INCRT)/sys/systm.h\ $(INCRT)/sys/conf.h\ $(INCRT)/sys/dir.h\ $(INCRT)/sys/signal.h\ $(INCRT)/sys/page.h\ $(INCRT)/sys/user.h\ $(INCRT)/sys/errno.h\ $(INCRT)/sys/proc.h\ $(INCRT)/sys/file.h\ $(INCRT)/sys/tty.h\ $(INCRT)/sys/termio.h\ $(INCRT)/sys/crtctl.h\ D 2 $(INCRT)/sys/sysinfo.h\ $(FRC) E 2 I 2 $(INCRT)/sys/sysinfo.h E 2 $(LIBNAME)(tt1.o):\ $(INCRT)/sys/param.h\ $(INCRT)/sys/types.h\ $(INCRT)/sys/systm.h\ $(INCRT)/sys/conf.h\ $(INCRT)/sys/dir.h\ $(INCRT)/sys/signal.h\ $(INCRT)/sys/user.h\ $(INCRT)/sys/errno.h\ $(INCRT)/sys/proc.h\ $(INCRT)/sys/file.h\ $(INCRT)/sys/tty.h\ $(INCRT)/sys/termio.h\ D 2 $(INCRT)/sys/sysinfo.h\ $(FRC) E 2 I 2 $(INCRT)/sys/sysinfo.h E 2 $(LIBNAME)(tty.o):\ $(INCRT)/sys/param.h\ $(INCRT)/sys/types.h\ $(INCRT)/sys/systm.h\ $(INCRT)/sys/dir.h\ $(INCRT)/sys/signal.h\ $(INCRT)/sys/user.h\ $(INCRT)/sys/errno.h\ $(INCRT)/sys/tty.h\ $(INCRT)/sys/ttold.h\ $(INCRT)/sys/proc.h\ $(INCRT)/sys/file.h\ $(INCRT)/sys/conf.h\ I 8 $(INCRT)/sys/termio.h\ $(INCRT)/sys/sysinfo.h $(LIBNAME)(tv.o):\ $(INCRT)/sys/param.h\ $(INCRT)/sys/types.h\ $(INCRT)/sys/systm.h\ $(INCRT)/sys/conf.h\ $(INCRT)/sys/dir.h\ $(INCRT)/sys/signal.h\ $(INCRT)/sys/user.h\ $(INCRT)/sys/errno.h\ $(INCRT)/sys/proc.h\ $(INCRT)/sys/file.h\ $(INCRT)/sys/tty.h\ E 8 $(INCRT)/sys/termio.h\ D 2 $(INCRT)/sys/sysinfo.h\ $(FRC) E 2 I 2 $(INCRT)/sys/sysinfo.h E 2 $(LIBNAME)(wbal.o):\ $(INCRT)/sys/param.h\ $(INCRT)/sys/types.h\ $(INCRT)/sys/dir.h\ $(INCRT)/sys/signal.h\ $(INCRT)/sys/user.h\ $(INCRT)/sys/errno.h\ $(INCRT)/sys/file.h\ $(INCRT)/sys/tty.h\ $(INCRT)/sys/termio.h\ $(INCRT)/sys/buf.h\ $(INCRT)/sys/systm.h\ $(INCRT)/sys/conf.h\ $(INCRT)/sys/sysinfo.h\ $(INCRT)/sys/fdlp.h\ D 2 $(INCRT)/sys/cio.h\ $(FRC) E 2 I 2 $(INCRT)/sys/cio.h E 2 $(LIBNAME)(wbct.o):\ $(INCRT)/sys/param.h\ $(INCRT)/sys/types.h\ $(INCRT)/sys/dir.h\ $(INCRT)/sys/signal.h\ $(INCRT)/sys/user.h\ $(INCRT)/sys/errno.h\ $(INCRT)/sys/termio.h\ $(INCRT)/sys/iomachdep.h\ $(INCRT)/sys/iobuf.h\ $(INCRT)/sys/buf.h\ $(INCRT)/sys/systm.h\ $(INCRT)/sys/conf.h\ $(INCRT)/sys/sysinfo.h\ $(INCRT)/sys/sysmacros.h\ $(INCRT)/sys/cio.h\ $(INCRT)/sys/page.h\ D 2 $(INCRT)/sys/ctio.h\ $(FRC) E 2 I 2 $(INCRT)/sys/ctio.h E 2 $(LIBNAME)(wblp.o):\ $(INCRT)/sys/param.h\ $(INCRT)/sys/types.h\ I 15 $(INCRT)/sys/conf.h\ E 15 $(INCRT)/sys/dir.h\ $(INCRT)/sys/signal.h\ $(INCRT)/sys/user.h\ $(INCRT)/sys/errno.h\ $(INCRT)/sys/tty.h\ $(INCRT)/sys/termio.h\ $(INCRT)/sys/lprio.h\ D 2 $(INCRT)/sys/fdlp.h\ $(FRC) E 2 I 2 D 15 $(INCRT)/sys/fdlp.h E 15 I 15 $(INCRT)/sys/cio.h\ $(INCRT)/sys/iomachdep.h E 15 E 2 I 17 D 23 physmem.H: $(INCRT)/sys/const.c.h \ $(INCRT)/sys/physmem.h cat $(INCRT)/sys/const.c.h \ $(INCRT)/sys/physmem.h | \ $(CPP) -P $(IFLAGS) -I$(INC) \ > physmem.H E 23 E 17 E 1 h08479 s 00001/00001/00098 d D 4.3 87/05/14 16:02:20 build 7 6 c removed old SCCS strings and inserted #ident BB e s 00014/00014/00085 d D 4.2 87/04/15 17:40:16 dc 6 5 c dc - changed #include "sys/..." to #include e s 00000/00000/00099 d D 4.1 87/02/20 13:27:13 build 5 4 c rolled rev to -r4 /dc e s 00000/00000/00099 d D 3.1 87/02/13 12:48:41 build 4 3 c rolled rev to -r3 /dc e s 00000/00000/00099 d D 2.1 87/02/13 12:48:41 build 3 2 c AUTO NULL DELTA e s 00001/00000/00098 d D 1.2 87/02/13 12:48:32 build 2 1 c add ident string /dc e s 00098/00000/00000 d D 1.1 87/02/13 12:47:57 build 1 0 c Placed under source control - dc e u U f b f n t T I 2 D 7 /* "%W% %E%" */ E 7 I 7 #ident " %W% %E% " E 7 E 2 I 1 /* * Line discipline 2 * No Virtual Terminal Handling */ D 6 #include "sys/param.h" #include "sys/types.h" #include "sys/systm.h" #include "sys/conf.h" #include "sys/dir.h" #include "sys/signal.h" #include "sys/page.h" #include "sys/user.h" #include "sys/errno.h" #include "sys/proc.h" #include "sys/file.h" #include "sys/tty.h" #include "sys/termio.h" #include "sys/sysinfo.h" E 6 I 6 #include #include #include #include #include #include #include #include #include #include #include #include #include #include E 6 char tv_blk[] = "014B\r" ; char tv_fdx[] = "DF" ; tvioctl(tp, cmd, arg, mode) register struct tty *tp ; { int i ; ttioctl(tp, cmd, arg, mode) ; switch (cmd) { case LDOPEN : if ((tp->t_lflag & (ECHO|ICANON)) != ICANON) return ; K_OPEN: for (i=0; i<7; i++) ttxput(tp, tv_blk[i], 0) ; break ; case LDCHG : if ((tp->t_lflag & (ECHO|ICANON)) == ICANON) goto K_OPEN ; goto K_CLOS ; case LDCLOSE : K_CLOS: for (i=0; i<3; i++) ttxput(tp, tv_fdx[i], 0) ; break ; default : return ; } spl5() ; (*tp->t_proc)(tp, T_OUTPUT) ; spl0() ; } tvopen(tp) register struct tty *tp; { register struct proc *pp; pp = u.u_procp; if ((pp->p_pid == pp->p_pgrp) && (u.u_ttyp == NULL) && (tp->t_pgrp == 0)) { u.u_ttyp = &tp->t_pgrp; tp->t_pgrp = pp->p_pgrp; } tvioctl(tp, LDOPEN, 0, 0); tp->t_state &= ~WOPEN; tp->t_state |= ISOPEN; } tvclose(tp) register struct tty *tp; { if ((tp->t_state&ISOPEN) == 0) return; tp->t_state &= ~ISOPEN; tvioctl(tp, LDCLOSE, 0, 0); tp->t_pgrp = 0; } tvin(tp, code) register struct tty *tp ; { register ushort nchar ; if ((tp->t_lflag & (ECHO|ICANON)) == ICANON) { nchar = tp->t_rbuf.c_size - tp->t_rbuf.c_count - tp->t_col ; if ((nchar > 0) && (nchar <= CLSIZE)) { tp->t_rbuf.c_count += tp->t_col ; tp->t_rbuf.c_ptr += tp->t_col ; } } return(ttin(tp, code)) ; } E 1 /* "@(#)tty0.c 4.1 87/02/20" */ /* @(#) Bull-Sems SPIX /tty0.c 4.1 87/02/20 */ /* * Line discipline 0 * No Virtual Terminal Handling */ #include "sys/param.h" #include "sys/types.h" #include "sys/systm.h" #include "sys/conf.h" #include "sys/dir.h" #include "sys/signal.h" #include "sys/page.h" #include "sys/user.h" #include "sys/errno.h" #include "sys/proc.h" #include "sys/file.h" #include "sys/tty.h" #include "sys/termio.h" #include "sys/sysinfo.h" extern char partab[]; /* * routine called on first teletype open. * establishes a process group for distribution * of quits and interrupts from the tty. */ ttopen(tp) register struct tty *tp; { register struct proc *pp; pp = u.u_procp; if ((pp->p_pid == pp->p_pgrp) && (u.u_ttyp == NULL) && (tp->t_pgrp == 0)) { u.u_ttyp = &tp->t_pgrp; tp->t_pgrp = pp->p_pgrp; } ttioctl(tp, LDOPEN, 0, 0); tp->t_state &= ~WOPEN; tp->t_state |= ISOPEN; } ttclose(tp) register struct tty *tp; { if ((tp->t_state&ISOPEN) == 0) return; tp->t_state &= ~ISOPEN; ttioctl(tp, LDCLOSE, 0, 0); tp->t_pgrp = 0; } /* * Called from device's read routine after it has * calculated the tty-structure given as argument. */ ttread(tp) register struct tty *tp; { register struct clist *tq; tq = &tp->t_canq; if (tq->c_cc == 0) canon(tp); while (u.u_count!=0 && u.u_error==0) { if (u.u_count >= CLSIZE) { register n; register struct cblock *cp; if ((cp = getcb(tq)) == NULL) break; n = min(u.u_count, cp->c_last - cp->c_first); if (copyout(&cp->c_data[cp->c_first], u.u_base, n)) u.u_error = EFAULT; putcf(cp); u.u_base += n; u.u_count -= n; } else { register c; if ((c = getc(tq)) < 0) break; if (subyte(u.u_base++, c)) u.u_error = EFAULT; u.u_count--; } } if (tp->t_state&TBLOCK) if (tp->t_rawq.c_cct_proc)(tp, T_UNBLOCK); } /* * Called from device's write routine after it has * calculated the tty-structure given as argument. */ ttwrite(tp) register struct tty *tp; { if (!(tp->t_state&CARR_ON)) return; while (u.u_count) { if (tp->t_outq.c_cc > tthiwat[tp->t_cflag&CBAUD]) { spl5(); (*tp->t_proc)(tp, T_OUTPUT); while (tp->t_outq.c_cc > tthiwat[tp->t_cflag&CBAUD]) { tp->t_state |= OASLP; sleep((caddr_t)&tp->t_outq, TTOPRI); } spl0(); } if (u.u_count >= (CLSIZE/2)) { register n; register struct cblock *cp; if ((cp = getcf()) == NULL) break; n = min(u.u_count, cp->c_last); if (copyin(u.u_base, cp->c_data, n)) { u.u_error = EFAULT; putcf(cp); break; } u.u_base += n; u.u_count -= n; cp->c_last = n; ttxput(tp, cp, n); } else { register c; c = fubyte(u.u_base++); if (c<0) { u.u_error = EFAULT; break; } u.u_count--; ttxput(tp, c, 0); } } spl5(); (*tp->t_proc)(tp, T_OUTPUT); spl0(); } /* * Place a character on raw TTY input queue, putting in delimiters * and waking up top half as needed. * Also echo if required. */ ttin(tp, code) register struct tty *tp; { register c; register flg , s_flg ; register char *cp; uint nchar, nc; register struct cblock *cpp; if (code == L_BREAK) { signal(tp->t_pgrp, SIGINT) ; ttyflush(tp, (FREAD|FWRITE)) ; return ; } nchar = tp->t_rbuf.c_size - tp->t_rbuf.c_count; /* reinit rx control block */ tp->t_rbuf.c_count = tp->t_rbuf.c_size; if (nchar==0) return; flg = tp->t_iflag; /* KMC does all but IXOFF */ if (tp->t_state&EXTPROC) flg &= IXOFF; nc = nchar; cp = tp->t_rbuf.c_ptr; if (nc < cfreelist.c_size || (flg & (INLCR|IGNCR|ICRNL|IUCLC))) { /* must do per character processing */ for ( ; nc > 0 ; nc--, cp++) { c = *cp; if (c == '\n' && flg&INLCR) *cp = c = '\r'; else if (c == '\r') if (flg&IGNCR) continue; else if (flg&ICRNL) *cp = c = '\n'; if (flg&IUCLC && 'A' <= c && c <= 'Z') c += 'a' - 'A'; if (putc(c, &tp->t_rawq)) continue; sysinfo.rawch++; } cp = tp->t_rbuf.c_ptr; } else { /* may do block processing */ putcb(CMATCH((struct cblock *)cp), &tp->t_rawq); sysinfo.rawch += nc; /* allocate new rx buffer */ if((cpp = getcf()) == NULL) { tp->t_rbuf.c_ptr = NULL; return; } tp->t_rbuf.c_ptr = cpp->c_data; tp->t_rbuf.c_count = cfreelist.c_size; tp->t_rbuf.c_size = cfreelist.c_size; } if (tp->t_rawq.c_cc > TTXOHI) { if (flg&IXOFF && !(tp->t_state&TBLOCK)) (*tp->t_proc)(tp, T_BLOCK); if (tp->t_rawq.c_cc > TTYHOG) { printf("Flush(%x)\n", tp); ttyflush(tp, FREAD); return; } } s_flg = lobyte(tp->t_lflag); if (tp->t_outq.c_cc > (tthiwat[tp->t_cflag&CBAUD] + TTECHI)) s_flg &= ~(ECHO|ECHOK|ECHONL|ECHOE); if (s_flg) while (nchar--) { flg = s_flg ; c = *cp++; if (flg&ISIG) { if (c == tp->t_cc[VINTR]) { signal(tp->t_pgrp, SIGINT); if (!(flg&NOFLSH)) ttyflush(tp, (FREAD|FWRITE)); continue; } if (c == tp->t_cc[VQUIT]) { signal(tp->t_pgrp, SIGQUIT); if (!(flg&NOFLSH)) ttyflush(tp, (FREAD|FWRITE)); continue; } if (c == tp->t_cc[VSWTCH]) { if (!(flg&NOFLSH)) ttyflush(tp, FREAD); (*tp->t_proc)(tp, T_SWTCH); continue; } } if (flg&ICANON) { if (c == '\n') { if (flg&ECHONL) flg |= ECHO; tp->t_delct++; } else if (c == tp->t_cc[VEOL] || c == tp->t_cc[VEOL2]) tp->t_delct++; if (!(tp->t_state&CLESC)) { if (c == '\\') tp->t_state |= CLESC; if (c == tp->t_cc[VERASE] && flg&ECHOE) { if (flg&ECHO) ttxput(tp, '\b', 0); flg |= ECHO; ttxput(tp, ' ', 0); c = '\b'; } else if (c == tp->t_cc[VKILL] && flg&ECHOK) { if (flg&ECHO) ttxput(tp, c, 0); flg |= ECHO; c = '\n'; } else if (c == tp->t_cc[VEOF]) { flg &= ~ECHO; tp->t_delct++; } } else { if (c != '\\' || (flg&XCASE)) tp->t_state &= ~CLESC; } } if (flg&ECHO) { ttxput(tp, c, 0); (*tp->t_proc)(tp, T_OUTPUT); } } if (!(s_flg&ICANON)) { tp->t_state &= ~RTO; if (tp->t_rawq.c_cc >= tp->t_cc[VMIN]) tp->t_delct = 1; else if (tp->t_cc[VTIME]) { if (!(tp->t_state&TACT)) tttimeo(tp); } } if (tp->t_delct && (tp->t_state&IASLP)) { tp->t_state &= ~IASLP; wakeup((caddr_t)&tp->t_rawq); } } /* * Put character(s) on TTY output queue, adding delays, * expanding tabs, and handling the CR/NL bit. * It is called both from the base level for output, and from * interrupt level for echoing. */ /* ttxput(tp, ucp, ncode) register struct tty *tp; union { unsigned ch; struct cblock *ptr; } ucp; { */ ttxput(tp, xxcp, ncode) register struct tty *tp; unsigned xxcp; { union { unsigned ch; struct cblock *ptr; } ucp; register c; register flg; register unsigned char *cp; register char *colp; int ctype; int cs; struct cblock *scf; ucp.ch = xxcp; if (tp->t_state&EXTPROC) { if (tp->t_lflag&XCASE) flg = OPOST; else flg = 0; } else flg = tp->t_oflag; if (ncode == 0) { ncode++; if (!(flg&OPOST)) { sysinfo.outch++; putc(ucp.ch, &tp->t_outq); return; } cp = (unsigned char *)&ucp.ch+3; scf = NULL; } else { if (!(flg&OPOST)) { sysinfo.outch += ncode; putcb(ucp.ptr, &tp->t_outq); return; } cp = (unsigned char *)&ucp.ptr->c_data[ucp.ptr->c_first]; scf = ucp.ptr; } while (ncode--) { c = *cp++; if (c >= 0200) { /* spl5-0 */ if (c == QESC && !(tp->t_state&EXTPROC)) putc(QESC, &tp->t_outq); sysinfo.outch++; putc(c, &tp->t_outq); continue; } /* * Generate escapes for upper-case-only terminals. */ if (tp->t_lflag&XCASE) { colp = "({)}!|^~'`\\\\"; while(*colp++) if (c == *colp++) { ttxput(tp, '\\'|0200, 0); c = colp[-2]; break; } if ('A' <= c && c <= 'Z') ttxput(tp, '\\'|0200, 0); } if (flg&OLCUC && 'a' <= c && c <= 'z') c += 'A' - 'a'; cs = c; /* * Calculate delays. * The numbers here represent clock ticks * and are not necessarily optimal for all terminals. * The delays are indicated by characters above 0200. */ ctype = partab[c]; colp = &tp->t_col; c = 0; switch (ctype&077) { case 0: /* ordinary */ (*colp)++; case 1: /* non-printing */ break; case 2: /* backspace */ if (flg&BSDLY) c = 2; if (*colp) (*colp)--; break; case 3: /* line feed */ if (flg&ONLRET) goto cr; if (flg&ONLCR) { if ((!(tp->t_state&EXTPROC)) && !(flg&ONOCR && *colp==0)) { sysinfo.outch++; putc('\r', &tp->t_outq); } goto cr; } nl: if (flg&NLDLY) c = 5; break; case 4: /* tab */ c = 8 - ((*colp)&07); *colp += c; if (!(tp->t_state&EXTPROC)) { ctype = flg&TABDLY; if (ctype == TAB0) { c = 0; } else if (ctype == TAB1) { if (c < 5) c = 0; } else if (ctype == TAB2) { c = 2; } else if (ctype == TAB3) { sysinfo.outch += c; do putc(' ', &tp->t_outq); while (--c); continue; } } break; case 5: /* vertical tab */ if (flg&VTDLY) c = 0177; break; case 6: /* carriage return */ if (flg&OCRNL) { cs = '\n'; goto nl; } if (flg&ONOCR && *colp == 0) continue; cr: if (!(tp->t_state&EXTPROC)) { ctype = flg&CRDLY; if (ctype == CR1) { if (*colp) c = max((*colp>>4) + 3, 6); } else if (ctype == CR2) { c = 5; } else if (ctype == CR3) { c = 9; } } *colp = 0; break; case 7: /* form feed */ if (flg&FFDLY) c = 0177; break; } sysinfo.outch++; putc(cs, &tp->t_outq); if (c) { if ((c < 32) && flg&OFILL) { cs = (flg&OFDEL) ? 0177 : 0 ; putc(cs, &tp->t_outq); if (c > 3) putc(cs, &tp->t_outq); } else { putc(QESC, &tp->t_outq); putc(c|0200, &tp->t_outq); } } } if (scf != NULL) putcf(scf); } /* * Get next packet from output queue. * Called from xmit interrupt complete. */ ttout(tp) register struct tty *tp; { register struct ccblock *tbuf; register struct cblock *cp; register c; register char *cptr; register retval; extern ttrstrt(); if (tp->t_state&TTIOW && tp->t_outq.c_cc==0) { tp->t_state &= ~TTIOW; wakeup((caddr_t)&tp->t_oflag); } delay: tbuf = &tp->t_tbuf; if (hibyte(tp->t_lflag)) { if (tbuf->c_ptr) { putcf(CMATCH((struct cblock *)tbuf->c_ptr)); tbuf->c_ptr = NULL; } tp->t_state |= TIMEOUT; timeout(ttrstrt, tp, (hibyte(tp->t_lflag)&0177)+6); hibyte(tp->t_lflag) = 0; return(0); } retval = 0; if ((tp->t_state&EXTPROC) || (!(tp->t_oflag&OPOST))) { if (tbuf->c_ptr) putcf(CMATCH((struct cblock *)tbuf->c_ptr)); if ((tbuf->c_ptr = (char *)getcb(&tp->t_outq)) == NULL) return(0); tbuf->c_count = ((struct cblock *)tbuf->c_ptr)->c_last - ((struct cblock *)tbuf->c_ptr)->c_first; tbuf->c_size = tbuf->c_count; tbuf->c_ptr = &((struct cblock *)tbuf->c_ptr)->c_data [((struct cblock *)tbuf->c_ptr)->c_first]; retval = CPRES; } else { /* watch for timing */ if (tbuf->c_ptr == NULL) { if((cp = getcf()) == NULL) { tbuf->c_ptr = NULL; return(0); /* Add restart? */ } tbuf->c_ptr = cp->c_data; } tbuf->c_count = 0; cptr = tbuf->c_ptr; while ((c=getc(&tp->t_outq)) >= 0) { if (c == QESC) { if ((c = getc(&tp->t_outq)) < 0) break; if (c > 0200 && !(tp->t_state&EXTPROC)) { hibyte(tp->t_lflag) = c; if (!retval) goto delay ; break; } } retval = CPRES; *cptr++ = c; tbuf->c_count++; if (tbuf->c_count >= cfreelist.c_size) break; } tbuf->c_size = tbuf->c_count; } if (tp->t_state&OASLP && tp->t_outq.c_cc<=ttlowat[tp->t_cflag&CBAUD]) { tp->t_state &= ~OASLP; wakeup((caddr_t)&tp->t_outq); } return(retval); } tttimeo(tp) register struct tty *tp; { tp->t_state &= ~TACT; if (tp->t_lflag&ICANON || tp->t_cc[VTIME] == 0) return; if (tp->t_rawq.c_cc == 0 && tp->t_cc[VMIN]) return; if (tp->t_state&RTO) { tp->t_delct = 1; if (tp->t_state&IASLP) { tp->t_state &= ~IASLP; wakeup((caddr_t)&tp->t_rawq); } } else { tp->t_state |= RTO|TACT; timeout(tttimeo, tp, tp->t_cc[VTIME]*(HZ/10)); } } /* * I/O control interface */ ttioctl(tp, cmd, arg, mode) register struct tty *tp; { ushort chg; register struct cblock *cp; switch(cmd) { case LDOPEN: if (tp->t_rbuf.c_ptr == NULL) { /* allocate RX buffer */ while((cp = getcf()) == NULL) { cfreelist.c_flag = 1; sleep(&cfreelist, TTOPRI); } tp->t_rbuf.c_ptr = cp->c_data; tp->t_rbuf.c_count = cfreelist.c_size; tp->t_rbuf.c_size = cfreelist.c_size; (*tp->t_proc)(tp, T_INPUT); } break ; case LDCLOSE: spl5(); (*tp->t_proc)(tp, T_RESUME); spl0(); ttywait(tp); ttyflush(tp, FREAD); if (tp->t_tbuf.c_ptr) { putcf(CMATCH((struct cblock *)tp->t_tbuf.c_ptr)); tp->t_tbuf.c_ptr = NULL; } if (tp->t_rbuf.c_ptr) { putcf(CMATCH((struct cblock *)tp->t_rbuf.c_ptr)); tp->t_rbuf.c_ptr = NULL; } break ; case LDCHG: chg = tp->t_lflag^arg; if (!(chg&ICANON)) break; spl5(); if (tp->t_canq.c_cc) { if (tp->t_rawq.c_cc) { tp->t_canq.c_cc += tp->t_rawq.c_cc; tp->t_canq.c_cl->c_next = tp->t_rawq.c_cf; tp->t_canq.c_cl = tp->t_rawq.c_cl; } tp->t_rawq = tp->t_canq; tp->t_canq = ttnulq; } tp->t_delct = tp->t_rawq.c_cc; spl0(); default: break; } } /* "@(#)smd.c 4.1 87/02/20" */ /* * SMD Disk Driver */ #include "sys/param.h" #include "sys/types.h" #include "sys/sysmacros.h" #include "sys/dir.h" #include "sys/signal.h" #include "sys/user.h" #include "sys/errno.h" #include "sys/buf.h" #include "sys/elog.h" #include "sys/iobuf.h" #include "sys/systm.h" #include "sys/page.h" #include "sys/iomachdep.h" #include "sys/smd.h" extern struct iobuf smdctab[] ; /* un par controleur */ extern struct iobuf smdutab[] ; /* une par unite */ extern struct buf smdbuf[] ; /* un par unite i/o pour driver */ extern struct iotime smdstat[]; /* une par unite */ extern struct smd_tab smditab[] ; /* une par unite */ extern int ftHeadwall; /* non-zero on headwall only */ #define acts io_s1 #define qcnt io_s2 #define trksec av_back #define cylin b_resid #define wtime b_flags #define WOK 0 #define WABORT 1 #define WNED 2 #define WERR 30 #define UNIT(x) ((x >> 4) & 3) /* numero d'unite */ #define VDK(x) (x & 0x0F) /* numero de partition */ #define smdind(x) (UNIT(x) + (CTRL(x) * NSMDUNIT)) /* index fonction(ctrl, unit) */ #ifdef SMDEBUG #define DK_WRITE(a, b) if ( d_write(((uint)(&rp->a) << 8)+(b & 0xFF), 0) )\ call_debug() #define DK_READ(a, b) if ( d_read((uint)(&rp->a) << 8, &b) )\ call_debug() #else #define DK_WRITE(a, b) if ( d_write(((uint)(&rp->a) << 8)+(b & 0xFF), 0) )\ panic("SMD d_write error") #define DK_READ(a, b) if ( d_read((uint)(&rp->a) << 8, &b) )\ panic("SMD d_read error") #endif SMDEBUG #define PAGE 0x1000 #define BBZONE 2*PAGE /* zone memoire pour BB */ #define D_FULLDISK 7 /* partition 7 adresse tout le disque */ /* #define SMDEBUG int smdebug = 1 ; */ char *smd_strer[] = { "", "\nOff Line", "\nTimeout", "\nEquipment Fault", "\nWrite lock error", "\nTranfer error", "\nData overrun", "\nSync. error", "\nheader error", "\nCRC error in header", "\nData check", "\nSeek failure", "\nUnknown drive type", "\nUnknown error", "\nIllegal param. in DCB order" } ; static int ioInProgress ; #define STATIO (ioir & 0xFF00) /* status de l'ioir */ smdopen(dev, flag) { register struct iobuf *smdp, *dp ; register struct smd_tab *dtab; register struct vtoc *wtoc; register struct partition *part; register struct x_smd *arg; register unsigned ctrl, unit ; register err, L_max ; #ifdef SMDEBUG if (smdebug == 2) smdprint(dev, "smdopen") ; #endif SMDEBUG ctrl = CTRL(dev) ; if (ctrl >= NSMDMAX) goto enxio ; unit = UNIT(dev) + ctrl*NSMDUNIT ; smdp = &smdctab[ctrl] ; if ((smdp->b_flags&B_ONCE) == 0) { /* premier acces au controleur */ err = ctladdr(SMD, ctrl) ; /* acquisition de l'adresse du ctrl */ if (err == -1) { enxio: u.u_error = ENXIO ; return ; } smdp->io_addr = (physadr)(err << 16) ; } dtab = &smditab[unit] ; if (dtab->acces == 0) { /* unite non encore accedee */ dp = &smdutab[unit]; dp->b_dev = dev & 0xF0 ; err = dp->b_dev | D_FULLDISK ; dp->io_addr = (physadr)smdp ; /* pour smdstrategy */ dp->io_nreg = 0; wtoc = (struct vtoc *)sptalloc(btoc(BBZONE), PG_V|PG_KW, 0) ; if ( !wtoc ) { enomem: u.u_error = ENOMEM ; return ; } dtab->vtoc = wtoc ; NSECT = 1 ; /* doit etre != 0 pour smdstrategy */ NPIST = 1 ; /* doit etre != 0 pour smdstrategy */ part = &wtoc->v_part[D_FULLDISK] ; part->p_blockn = P0_MINSZ ; /* doit etre > blkno pour smdstrategy */ part->p_start = 0 ; arg = &dtab->xsmd[0] ; arg->adbuf = (uint)wtoc ; arg->count = PAGE ; if ( smdcommand(err, SMD_SIZE, AD_DISK) ) goto opercom ; /* traitement des BAD_BLOCS */ arg->count = BBZONE ; if ( smdcommand(err, SMD_READ, AD_VTOC) ) { /* lecture de 2 pages en piste zero */ opercom: u.u_error = EIO ; return ; } if ((smdp->b_flags&B_ONCE) == 0) { /* premier acces au controleur */ smdp->b_flags |= B_ONCE; /* smdtimer(ctrl); */ } dtab->acces = 1 ; if (wtoc->v_sanity != VTOC_SANE) { smdprint(dev, "no vtoc area") ; goto opercom ; } /* aurons nous besoin de plus de 2 PAGES pour la gestion des Bads-Blocs ???? L_max = sizeof(struct vtoc) + (wtoc->v_cyls) * sizeof(struct bb_ind) + (wtoc->v_nbbmax) * sizeof(struct bb_gb) ; if (L_max & 0xFFF) L_max &= ~0xFFF ; else L_max -= PAGE ; if (L_max) L_max -= PAGE ; if (L_max) { sptfree(wtoc, btoc(BBZONE), 0) ; arg->count = BBZONE + L_max ; wtoc = (struct vtoc *)sptalloc(btoc(arg->count), PG_V|PG_KW, 0) ; if ( !wtoc ) goto enomem ; dtab->vtoc = wtoc ; arg->adbuf = (uint)wtoc ; if ( smdcommand(err, SMD_READ, AD_VTOC) ) { sptfree(wtoc, btoc(arg->count), 0) ; goto opercom ; } } */ } wtoc = dtab->vtoc ; part = &wtoc->v_part[VDK(dev)] ; if (part->p_blockn == 0) { /* verification partition initialisee */ if (VDK(dev) != D_FULLDISK) { smdprint(dev, "invalid partition") ; } else { part->p_start = 0; part->p_blockn = P0_MINSZ; } } } smdclose(dev) { #ifdef SMDEBUG if (smdebug == 2) smdprint(dev, "smdclose") ; #endif SMDEBUG } smdcommand(dev, com, offset) register dev_t dev ; register unsigned offset ; /* numero de secteur disque */ { register struct buf *bp ; register struct smd_tab *dtab ; register struct x_smd *arg ; register unit ; #ifdef SMDEBUG if (smdebug == 2) printf("smdcommand:dev=%x com=%x offset=%x\n", dev, com, offset) ; #endif SMDEBUG unit = smdind(dev) ; bp = &smdbuf[unit] ; spl6() ; while (bp->b_flags & B_BUSY) { bp->b_flags |= B_WANTED ; sleep(bp, PRIBIO) ; } spl0() ; bp->b_flags = (com == SMD_READ) ? B_BUSY|B_READ : B_BUSY|B_WRITE ; bp->b_cmd = com ; dtab = (struct smd_tab *)&smditab[unit] ; arg = &dtab->xsmd[0] ; bp->b_bcount = arg->count ; bp->b_blkno = offset << 2 ; /* bp->b_blkno = offset * 4 ; */ bp->b_un.b_addr = (caddr_t)arg->adbuf ; bp->b_pt = svtopte(dtab->vtoc) ; bp->b_dev = dev ; bp->b_error = 0 ; smdstrategy(bp) ; iowait(bp) ; if (bp->b_flags & B_WANTED) wakeup(bp) ; if (bp->b_flags & B_ERROR) bp->b_error = EIO ; bp->b_flags = 0 ; return(bp->b_error) ; } smdstrategy(bp) register struct buf *bp; { register struct iobuf *smdp; register struct iobuf *dp; register struct iotime *ds; register struct smd_tab *dtab ; register struct vtoc *wtoc ; register struct partition *part ; register struct buf *ap, *cp ; register unit, s1, s2, blkno, x ; #ifdef SMDEBUG if (smdebug == 2) printf("smdstrategy : bp=%x\n", bp) ; #endif SMDEBUG unit = smdind(bp->b_dev) ; dtab = &smditab[unit] ; wtoc = dtab->vtoc ; part = &wtoc->v_part[VDK(bp->b_dev)] ; blkno = bp->b_blkno ; if (blkno<0 || blkno>=part->p_blockn) { if (blkno==part->p_blockn && bp->b_flags&B_READ) bp->b_resid = bp->b_bcount; else { bp->b_flags |= B_ERROR; bp->b_error = ENXIO; } iodone(bp); return; } bp->av_forw = NULL; bp->b_start = lbolt; dp = &smdutab[unit]; ds = &smdstat[unit]; blkno >>= 2 ; /* blkno /= 4;(blocs de 512 octets) */ bp->cylin = blkno/NSCTPST + part->p_start ; blkno = blkno % NSCTPST ; *((int *)(&bp->trksec)) = ((blkno/NSECT)<<8) + (blkno%NSECT); ds->io_cnt++; ds->io_bcnt += btoc(bp->b_bcount); x = spl6(); dp->qcnt++; if (dp->b_actf == NULL) { dp->b_actf = bp; dp->b_actl = bp; dp->acts = (int)bp; } else { if (((int)ds->io_cnt&07) == 0) dp->acts = (int)dp->b_actl; for (ap = (struct buf *)dp->acts; cp = ap->av_forw; ap = cp) { s1 = ap->cylin - bp->cylin ; if (s1 < 0) s1 = -s1; s2 = ap->cylin - cp->cylin ; if (s2 < 0) s2 = -s2; if (s1 < s2) break; } ap->av_forw = bp; if ((bp->av_forw = cp) == NULL) dp->b_actl = bp; } if (dp->b_active == 0) { dp->wtime = WOK ; smdp = (struct iobuf *)dp->io_addr ; if (dp->b_actf) { dp->io_start = lbolt ; dp->b_active++ ; dp->b_forw = NULL ; if (smdp->b_actf == NULL) smdp->b_actf = (struct buf *)dp; else (smdp->b_actl)->b_forw = (struct buf *)dp; smdp->b_actl = (struct buf *)dp; } if (smdp->b_active==0 && smdp->b_actf!=NULL) smdstart(smdp - &smdctab[0]); } splx(x); } smdbb(dtab) register struct smd_tab *dtab ; { register struct vtoc *wtoc ; register struct bb_ind *bbind ; register struct bb_gb *bbgb ; register char *ptr ; register uint addsk ; register ushort cyl ; int printing = 0; wtoc = dtab->vtoc ; addsk = dtab->nxtbb ; if (addsk == 0x11309) printing = 1; /* if (printing) */ printf ("smdbb (0x%x)\n",addsk); dtab->nxtbb = -1 >> 1; if (wtoc->v_sanity != VTOC_SANE) { if (printing) printf ("smdbb no vtoc 0x%x\n",wtoc->v_sanity); return(addsk) ; } ptr = (char *)wtoc + sizeof(struct vtoc) ; if ((uint)ptr & 3) ptr += (char *)2 ; bbind = (struct bb_ind *)ptr ; ptr = (char *)bbind + (wtoc->v_cyls)*sizeof(struct bb_ind) ; if ((uint)ptr & 3) ptr += (char *)2 ; bbgb = (struct bb_gb *)ptr ; cyl = addsk >> 16 ; bbind += cyl ; if (printing) printf ("smdbb searching, cyl=0x%x, bbind=0x%x\n",cyl,bbind); while (bbind->b_mapind == wtoc->v_nbbmax) { /* ce n'est pas un BB */ if (++cyl > wtoc->v_cyla) /* recherche du prochain BB */ { if (printing) printf ("smdbb no mapping cyl=0x%x\n",cyl); return(addsk) ; } bbind++ ; } if (printing) printf ("smdbb search done, cyl=0x%x, bbind=0x%x\n",cyl,bbind); bbgb += bbind->b_mapind ; while (bbgb->bb < addsk) bbgb++ ; if (bbgb->bb == addsk) { printf ("smdbb: mapping 0x%x to 0x%x\n", addsk, bbgb->gb); dtab->nxtbb = (bbgb + 1)->bb ; return(bbgb->gb) ; } if (printing) printf ("smdbb no map, nxtbb=0x%x\n",bbgb->bb); dtab->nxtbb = bbgb->bb ; return(addsk) ; } smdstart(ctrl) { register struct iobuf *smdp, *dp ; register struct buf *bp; register struct smd_tab *dtab; register struct mincb *mcb; register struct smdcb *rp; register struct it_tab *itab; register struct partition *part ; register pte_t *pt ; register uint pg_pfn , x, unit, npg , addsk, adblk , blkno ; uint y, count, good ; smdp = &smdctab[ctrl] ; loop: dp = (struct iobuf *)smdp->b_actf; if (dp == NULL) return; bp = dp->b_actf; if (bp == NULL) { smdp->b_actf = dp->b_forw; goto loop; } unit = UNIT(bp->b_dev) ; rp = (struct smdcb *)((unit<<6) + (uint)(smdp->io_addr)) ; unit += ctrl * NSMDUNIT ; dtab = &smditab[unit] ; smdp->b_active++; dtab->tabx = 0 ; /* index de debut de table */ mcb = &dtab->mcb ; /* blkacty |= 1 << major(bp->b_dev); */ npg = btop(bp->b_bcount) - 1 ; pt = bp->b_pt ; mcb->mem_addr = pt->pgm.pg_pfn << BPPSHIFT ; /* M.A.J. de l'adresse memoire */ for (x=0; xheader[x] = ptoedma(pt->pgm.pg_pfn) ; } if (bp == &smdbuf[unit]) { /* cas particulier d'une smdcommand */ if (bp->b_cmd == SMD_WTOC) { bp->b_cmd = SMD_WRITE ; bcopy(bp->b_un.b_addr, dtab->vtoc, bp->b_bcount) ; } dtab->gorder = bp->b_cmd ; if (bp->b_cmd == SMD_SIZE) goto DK1 ; if (npg > 0) smd_write( &rp->header[0], &dtab->header[0], npg << 1 ) ; count = (npg + 1) * PAGE ; /* M.A.J. du compte d'octets */ mcb->sector = (unsigned char)bp->trksec ; mcb->head = (unsigned char)((uint)bp->trksec >> 8) ; mcb->cyl_low = (unsigned char)bp->cylin ; mcb->cyl_high = (unsigned char)((uint)bp->cylin >> 8) ; goto DK0 ; } dtab->gorder = (bp->b_flags & B_READ) ^ SMD_WRITE ; adblk = (uint)(bp->cylin << 16) + (*((uint *)(&bp->trksec)) & 0xFFFF) ; dtab->nxtbb = adblk ; addsk = smdbb(dtab) ; if (addsk == adblk) good = 1; /* 1er bloc bon */ else good = 0; /* 1er bloc mauvais */ #ifdef SMDEBUG if (smdebug) if (addsk != adblk) printf("(%x) : %x -> %x\n", dtab, adblk, addsk) ; #endif SMDEBUG mcb->sector = (unsigned char)addsk ; /* positionnement de l'adresse disque */ mcb->head = (unsigned char)(addsk >> 8) ; mcb->cyl_low = (unsigned char)(addsk >> 16) ; mcb->cyl_high = (unsigned char)(addsk >> 24) ; count = PAGE ; if (npg == 0) goto DK0 ; itab = &dtab->itab[0] ; y = 1 ; part = &(dtab->vtoc)->v_part[VDK(bp->b_dev)] ; blkno = ((bp->b_blkno>>3) + npg) << 1 ; /* blkno = ((bp->b_blkno/8) + npg) * 2 */ addsk = blkno % NSCTPST ; addsk = ((addsk/NSECT) << 8) + (addsk % NSECT) ; addsk += (part->p_start + (blkno/NSCTPST)) << 16; /* derniere adresse disque du transfert */ if ((addsk < dtab->nxtbb) && good) { /* il n'y a pas de bad bloc */ count += npg * PAGE ; goto GB ; } for (x=0; x= NSECT) { adblk -= NSECT ; adblk += (1 << 8) ; if ((adblk & 0xFF00) >= (NPIST << 8)) { adblk -= (NPIST << 8) ; adblk += (1 << 16) ; } } if (good && (adblk < dtab->nxtbb)) { if ( y ) count += PAGE ; else itab->count += 1 ; } else { if ( y ) y = 0 ; else itab++ ; itab->indx = x ; itab->count = 1 ; if (adblk == dtab->nxtbb) { /* on est sur un BB */ dtab->nxtbb = adblk ; itab->addsk = smdbb(dtab) ; good = 0 ; #ifdef SMDEBUG if (smdebug) printf("(%x) : %x -> %x\n", dtab, adblk, itab->addsk) ; #endif SMDEBUG } else { /* ce bloc est bon; pas le precedent */ itab->addsk = adblk ; /* if (addsk < dtab->nxtbb) { itab->count += npg -x -1 ; break ; } */ good = 1 ; } } } (++itab)->count = 0; /* cloture la table */ GB: if (npg = btop(count) - 1) smd_write(&rp->header[0], &dtab->header[0], npg<<1) ; DK0: mcb->count = (ushort)count ; smd_write(&rp->ma_r.mem_addr, mcb, sizeof(struct mincb)) ; DK1: DK_WRITE(gorder, dtab->gorder) ; ioInProgress++ ; /* keep track of nbr of active IO ops */ if (ftHeadwall) headwallLight (ioInProgress != 0) ; } smd_write(unit, data, n) char *data ; uint unit, n ; { unit <<= 8 ; while (n--) { if ( d_write(unit | *data++, 0) ) #ifdef SMDEBUG call_debug() ; #else panic("SMD disc error"); #endif SMDEBUG unit += 0x100 ; } } smdintr(ctrl, ioir) int ioir; /* io interrupt word for smd */ { register struct iobuf *smdp, *dp ; register struct buf *bp; register struct smd_tab *dtab; register struct mincb *mcb; register struct it_tab *itab; register struct smdcb *rp; register struct partition *part; register x, unit ; unsigned int npg ; #ifdef SMDEBUG if (smdebug == 2) printf("smdintr : ctrl=%x ioir=%x\n", ctrl, ioir) ; #endif SMDEBUG ioInProgress-- ; /* keep track of nbr of active IO ops */ if (ftHeadwall) headwallLight (ioInProgress != 0) ; smdp = &smdctab[ctrl] ; if (smdp->b_active) { /* data transfer underway */ dp = (struct iobuf *)smdp->b_actf; bp = dp->b_actf; /* blkacty &= ~(1 << major(bp->b_dev)); */ unit = UNIT(bp->b_dev) + ctrl*NSMDUNIT ; dtab = &smditab[unit]; if (STATIO) { if (++dp->b_errcnt > 4) { bp->b_flags |= B_ERROR; rp = (struct smdcb *)((UNIT(bp->b_dev)<<6) + (uint)(smdp->io_addr)) ; DK_READ(da_r.adrdsk.cyl_high, npg) ; x = npg & 0xFF ; DK_READ(da_r.adrdsk.cyl_low, npg) ; x = (x << 8) + (npg & 0xFF) ; DK_READ(da_r.adrdsk.head, npg) ; x = (x << 8) + (npg & 0xFF) ; DK_READ(da_r.adrdsk.sector, npg) ; x = (x << 8) + (npg & 0xFF) ; /* DK_READ(ma_r.retries, npg) ; */ prcom(smdprint, bp, STATIO>>8, x); } else { x = (ioir >> 8) & 0xFF ; if (x == SMD_ILLG) x = SMD_DRVR ; if (x > SMD_DRVR) x = SMD_END ; smdprint(bp->b_dev, smd_strer[x]) ; bp->b_flags |= B_ERROR; switch(x) { case SMD_OK : case SMD_OFL : case SMD_TO : goto repris ; case SMD_FAULT: case SMD_WLE : break ; case SMD_TRER : case SMD_OVR : case SMD_SYNC : case SMD_HDR : case SMD_CRC : case SMD_DCK : case SMD_SEEK : repris: smdp->b_active = 0; case SMD_TYPE : case SMD_END : case SMD_DRVR : default : break ; } } /* part = &(dtab->vtoc)->v_part[VDK(bp->b_dev)] ; fmtberr(dp, part->p_start); */ } if (smdp->b_active) { itab = &dtab->itab[dtab->tabx] ; rp = (struct smdcb *)((UNIT(bp->b_dev)<<6) + (uint)(smdp->io_addr)) ; if (bp == &smdbuf[unit]) { if ( !(bp->b_flags & B_ERROR) ) if (dtab->gorder == SMD_SIZE) { DK_READ(da_r.adrdsk.sector, npg) ; NSECT = (npg + 1) & 0xFF ; DK_READ(da_r.adrdsk.head, npg) ; NPIST = (npg + 1) & 0xFF ; } } else if (itab->count) { dtab->tabx++ ; mcb = &dtab->mcb ; /* * Extract extended dma address, place * in first dma address area. */ x = edmatop(dtab->header[itab->indx]); mcb->mem_addr = x << BPPSHIFT ; /* M.A.J. de l'adresse memoire */ itab->indx++ ; mcb->count = (ushort)(itab->count << 12) ; /* M.A.J. du compte d'octets */ npg = itab->count - 1 ; if (npg) smd_write(&rp->header[0], &dtab->header[itab->indx], npg<<1) ; mcb->sector = (unsigned char)itab->addsk ; /* M.A.J. de l'adresse disque */ mcb->head = (unsigned char)(itab->addsk >> 8) ; mcb->cyl_low = itab->addsk >> 16 ; mcb->cyl_high = itab->addsk >> 24 ; smd_write( &rp->ma_r.mem_addr, mcb, sizeof(struct mincb) ) ; DK_WRITE(gorder, dtab->gorder) ; ioInProgress++ ; /* keep track of nbr of active IO ops */ if (ftHeadwall) headwallLight (ioInProgress != 0) ; itab->count = 0 ; /* cloture la table */ return ; } /* if (dp->io_erec) logberr(dp, bp->b_flags&B_ERROR); */ smdp->b_active = 0; dp->b_active = 0; dp->b_errcnt = 0; dp->b_actf = bp->av_forw; bp->b_resid = 0; dp->qcnt--; if (bp == (struct buf *)dp->acts) dp->acts = (int)dp->b_actf; smdstat[unit].io_resp += lbolt - bp->b_start; smdstat[unit].io_act += lbolt - dp->io_start; iodone(bp); } smdp->b_actf = dp->b_forw; if (dp->b_actf) { dp->wtime = WOK; if (dp->b_active == 0) dp->io_start = lbolt; dp->b_active++; dp->b_forw = NULL; if (smdp->b_actf == NULL) smdp->b_actf = (struct buf *)dp; else (smdp->b_actl)->b_forw = (struct buf *)dp; smdp->b_actl = (struct buf *)dp; } } if (smdp->b_actf) smdstart(ctrl); } smdread(dev) { register struct vtoc *wtoc ; register struct partition *part ; #ifdef SMDEBUG if (smdebug == 2) smdprint("smdread", dev) ; #endif SMDEBUG wtoc = ((struct smd_tab *)&smditab[smdind(dev)])->vtoc ; part = &wtoc->v_part[VDK(dev)] ; if (physck(part->p_blockn, B_READ)) physio(smdstrategy, 0, dev, B_READ); } smdwrite(dev) { register struct vtoc *wtoc ; register struct partition *part ; #ifdef SMDEBUG if (smdebug == 2) smdprint("smdwrite", dev) ; #endif SMDEBUG wtoc = ((struct smd_tab *)&smditab[smdind(dev)])->vtoc ; part = &wtoc->v_part[VDK(dev)] ; if (physck(part->p_blockn, B_WRITE)) physio(smdstrategy, 0, dev, B_WRITE); } smdprint(dev, str) char *str; { printf("%s on disk %d\n", str, minor(dev)) ; } smdioctl(dev, cmd, arg, flag) register uint cmd ; register struct x_smd *arg ; { register struct x_smd *par ; register uint buf ; if ((cmd & 0xFF00) != (uint)VIOC) { fault: u.u_error = EFAULT ; return ; } if ((dev & 0x0F) != D_FULLDISK) goto fault ; if (cmd != V_PWRITE) { nxio: u.u_error = ENXIO ; return ; } if ( !suser() ) return ; par = &(((struct smd_tab *)&smditab[smdind(dev)])->xsmd)[0] ; if ( copyin(arg, par, sizeof(struct x_smd)) ) goto fault ; if (par->count & 0xFFF) goto fault ; buf = sptalloc(btoc(par->count), PG_V|PG_KW, 0) ; if ( !buf ) { u.u_error = ENOMEM ; return ; } if ( copyin(par->adbuf, buf, par->count) ) { u.u_error = EFAULT ; goto free ; } par->adbuf = buf ; if ( smdcommand(dev, SMD_WTOC, AD_VTOC) ) u.u_error = ENXIO ; free: sptfree(buf, btoc(par->count), 0) ; } smdsync() { register struct iobuf *smdp, *dp ; register struct buf *bp ; register struct smd_tab *dtab ; register uint ctrl, unit ; for (ctrl=0; ctrlb_flags & B_ONCE) ) continue ; for (unit=ctrl*NSMDUNIT; unitacces == 0) continue ; if (dp = &smdutab[unit]) while (bp = dp->b_actf) { spl6() ; while (bp->b_flags & B_BUSY) { if (panicstr == 0) { bp->b_flags |= B_WANTED; sleep(bp, PRIBIO+1) ; } } spl0() ; } } } } /* * ATTENTION : les sous-programmes qui suivent ne sont pas utilises */ /* smdtimer(ctrl) { register struct iobuf *smdp; register struct iobuf *dp; register struct buf *bp; register unit; for (unit=ctrl*NSMDUNIT; unitwtime == WOK) continue; smdustart(unit); if (dp->wtime == WOK) continue; if (dp->wtime == WABORT) { if (dp->io_erec) logberr(dp, B_ERROR); while (bp = dp->b_actf) { bp->b_flags |= B_ERROR; dp->b_actf = bp->av_forw; iodone(bp); } dp->b_active = 0; dp->b_errcnt = 0; dp->qcnt = 0; } dp->wtime--; } smdp = &smdctab[ctrl] ; if (smdp->b_active==0 && smdp->b_actf!=NULL) smdstart(ctrl); timeout(smdtimer, ctrl, 15*HZ); } smdustart(unit) { register struct iobuf *smdp; register struct iobuf *dp; dp = &smdutab[unit]; dp->wtime = WOK; if (dp->b_ctf == NULL) return; if (dp->b_active == 0) dp->io_start = lbolt; dp->b_active++; dp->b_forw = NULL; smdp = (struct iobuf *)dp->io_addr ; if (smdp->b_actf == NULL) smdp->b_actf = (struct buf *)dp; else (smdp->b_actl)->b_forw = (struct buf *)dp; smdp->b_actl = (struct buf *)dp; } */ h40380 s 00001/00001/00115 d D 4.2 87/05/14 16:02:29 build 5 4 c removed old SCCS strings and inserted #ident BB e s 00000/00000/00116 d D 4.1 87/04/17 09:21:31 dc 4 3 c rolled rev to -r4 /dc e s 00000/00000/00116 d D 3.1 87/04/17 09:21:31 dc 3 2 c AUTO NULL DELTA e s 00000/00000/00116 d D 2.1 87/04/17 09:21:31 dc 2 1 c AUTO NULL DELTA e s 00116/00000/00000 d D 1.1 87/04/17 09:20:39 dc 1 0 c Placed under source control - dc e u U f b f n t T I 1 D 5 /* " %W% %E% " */ E 5 I 5 #ident " %W% %E% " E 5 #include #include #include #include #include #include #include #include #include static char sm_stat; #define SM_OPEN 1 #define SM_OVFL 2 #define SM_SIZE 2048 #define P_SM (PZERO + 1) char sys_mess[SM_SIZE]; int sm_rpt = 0; /* read pointer */ int sm_wpt = 0; /* write pointer */ smopen(dev,flg) { if(sm_stat & SM_OPEN) { u.u_error = EBUSY; return; } if((flg&FWRITE) || dev != 0) { u.u_error = ENXIO; return; } sm_stat |= SM_OPEN; } smclose(dev,flg) { sm_stat &= ~SM_OPEN; } smread(dev) { register base, length; char empty = 1; while (u.u_count) { length = 0; base = sm_rpt; while (base < SM_SIZE && sys_mess[base] && length < u.u_count) { base++; length++; } if (length) { if (copyout(&sys_mess[sm_rpt], u.u_base, length)) { u.u_error = EFAULT; return; } bzero(&sys_mess[sm_rpt], length); sm_rpt = (sm_rpt + length) % SM_SIZE; u.u_count -= length; u.u_base += length; empty = 0; } if (u.u_count) { if (sys_mess[sm_rpt]) continue; else if (sm_stat & SM_OVFL) { printf("\nSYSTEM MESSAGE LOGGING OVERFLOW\n"); sm_stat &= ~SM_OVFL; sm_rpt = (sm_rpt+1) % SM_SIZE; } else if (empty) sleep(&sm_stat, P_SM); else return; } } } smwrite(c) char c; { if (sm_wpt == sm_rpt) wakeup(&sm_stat); if (!sys_mess[sm_wpt]) { sys_mess[sm_wpt] = c; sm_wpt = (sm_wpt+1) % SM_SIZE; } else if (sm_stat & SM_OPEN) { sys_mess[(sm_wpt+SM_SIZE-1)%SM_SIZE] = 0; sm_stat |= SM_OVFL; } else { bzero(&sys_mess[sm_rpt], min(SM_SIZE/2, SM_SIZE-sm_rpt)); bzero(&sys_mess[0],SM_SIZE/2 - min(SM_SIZE/2, SM_SIZE-sm_rpt)); sm_rpt = (sm_rpt + SM_SIZE/2) % SM_SIZE; sys_mess[sm_wpt] = c; sm_wpt = (sm_wpt+1) % SM_SIZE; } } E 1 ! / 548578265 0 0 0 4524 ` H   n n n n n n n n n n n n n n n n n n n n n n n n n n n n n n n n n n n n nRRRRRRRRRReeeejjjjjvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvqlqlqlqlqlqlqlqlqlqlqlqlqlqlqlqlqlqlqlqlqlqlqljjjjjjjjjjjjj#d#d#d#d#d#d#d,,,,,,,,,,,,,,,,,UUUUUZZZZZZZZZ{{{{{{{{{{{{xxxxxxxxxxxxxxxxx_getc_putc_getcf_putcf_getcb_putcb_getcbp_putcbp_erropen_errclose_errread_fpalinit_fdlp_addr_fpal_cnt_fdlp_cons_fpalopen_fpalproc_fpalparam_fpalclose_fpalmodem_fpalread_fpalwrite_fpalioctl_fpaleint_fpalextst_fpalcint_fpalxint_fpalswrite_fpalrint_al_work_fpalsread_fpalbwrite_ncharbreak_fpalwbreak_BAUD_fdlp_getchar_fdlp_putchar_diag_cons_fdlp_breakchar_fpalclr_fpalscan_al_scan_fpalcont_CTCDV_SIO4X_fpalbread_fdlpintr_KEYBOARD_fplpopen_fplpoutput_fplpclose_fplpread_fplpwrite_fplppoke_fplpstart_fplpintr_fplpioctl_fplpclr_GetHWSwitches_HWSetDate_HWClockCommand_HWGetDate_iomachdep_cfdebug_move_dcb_devinit_ctladdr_sasinit_sasadr_masadr_mas_cnt_masid_tblmastrace_masscan_masscantime_mastr_mastbltr_masnametr_mastrace_mastrn_mascmd_masopen_masproc_masflag_masparam_maser_masern_mastbler_masptrer_masclose_mastox_masread_maswrite_masioctl_masoutbloc_masoutcar_masinbloc_masincar_cvbaud_masintr_masrblocint_masrint_masxint_masarret_masdecon_masinilgn_mascon_masinitab_mascout_masbreak_masPDP_masDP_masrev_TBLSZ_meload_medma_medmaptr_nomfic_nomdir_gethdr_metrace_readlong_dcb0adr_dcb0_readshort_mewait_writeshort_writelong_metimeout_metoid_meflag_merev_readstat_writecom_sasintr_readbyte_writebyte_mmread_mmwrite_mmioctl_mtopen_mtcommand_mtprint_mtwait_mtclose_mtdebug_mtstart_mtstrategy_k_tab_C_tab_c_tab_d_unit_mtintr_mtread_mtwrite_mtioctl_mt_cnt_partab_prfread_prfstat_prfmax_prfsym_prfctr_prfwrite_prfioctl_prfintr_ptsopen_no_t_proc_ptsclose_ptcwakeup_ptsread_ptswrite_ptsproc_ptcopen_ptcclose_ptcread_ptcwrite_ptcioctl_ptsioctl_rnetopen_rnetclose_rnetread_rnetwrite_mclfree_mbstat_rnetioctl_rawinput_rawbuffer_nmbclusters_mbfree_smdopen_smdcommand_smdprint_smdclose_smdstrategy_smdstart_smdbb_smd_write_smdintr_smd_strer_smdread_smdwrite_smdioctl_smdsync_smopen_smclose_smread_sm_rpt_sys_mess_smwrite_sm_wpt_sxtopen_linkTable_sxtnullproc_sxtvtproc_sxtlinit_sxtclose_sxtfree_sxtioctl_sxtin_sxtalloc_sxtread_sxtwrite_sxtrwrite_sxtout_sxtbuf_sxtbusy_sxtinit_syopen_sycheck_syread_sywrite_syioctl_ttopen_ttioctl_ttclose_ttread_ttwrite_ttxput_ttin_tttimeo_ttout_ttiocom_ttywait_ttyflush_ttinit_ttcchar_canon_ttnulq_canonb_maptab_ttrstrt_ttlowat_tthiwat_tvioctl_tv_blk_tv_fdx_tvopen_tvclose_tvin_wbalunit_wbalinit_wbal_cnt_wbal_addr_wb_reset_PROMVersion_CODEVersion_PCAConfig_WBCommand_intrpInterval_StartWB_wbalopen_ttchar_wbalproc_wbalparam_wbalclose_wbmodem_wbalread_wbalwrite_wbalioctl_WBCtest1_WBCtest0_WBWriteChar_wbresetbrk_cio_getchar_cio_putchar_diag_cons_cio_breakchar_wbalclr_WBSetStartStop_BAUD_WBGetStartStop_wbalintr_timeInterval_wbal_cons_KEYBOARD_wbctinit_wbct_cnt_wbct_addr_wbctcommand_wbcttimout_wbctopen_wbctclose_wbctstrategy_wbctstart_wbctrstrategy_wbctprint_wbctclr_wbctintr_wbctread_wbctphys_wbctwrite_wbctioctl_wblpinit_wblp_addr_wblp_cnt_PROMVersion_CodeVersion_wblpopen_testOffline_wblpclose_wblpstart_wblpread_wblpwrite_wblpoutput_wblpintr_wblpioctl_wblpclrclist.o/ 548577554 0 0 100664 2547 ` u h.text(7 .data(( @.bssHH@4~8p'  F  b T~8Ǟ4@@W@~8q '@ P2 d0 '#' ~8@@W8 ȧ~4`pp",~488W@~8pp~8@@W@~8pLJ , ^~8@@W@~8p0 x qx~8@@WX<@H~Pۋ p g<)zp*(B  {  ~PɞHɾ@<XXWX<@H~Pڋ pHp { q{gր& (J ( )(   C   ~PɞHɾ@<XXW @(#)clist.c 4.4 87/05/14 vx   "v    (,.4 < h  FHVXn.text(7.data( .bssH_getcn_spl6nn_wakeupn_splxn_putcn_getcfn_putcfn_getcbXn_putcbn_getcbp0n_bcopyn_putcbpn_cfreelist err.o/ 548577563 0 0 100664 1042 ` u .text .data@.bss((0 0!(zYB0Y((z(00W(WH~@(zVPpxz<t(*Yxx~@HHW @(#)err.c 4.4 87/05/14 (BNZ `j  .text.data.bss(_erropenl_ul_suserlll_errreadl_geterecl_minl_copyoutll"_logstart_errclose_freeslotfpal.o/ 548577620 0 0 100664 12795 ` u T+PB.text .dataD(DA@.bss88@~8p8 `(t ~8@@W@z~8spzzpzYzXp@d&ԧ48 8: :>+ >< <@ @z JFpW~8@@W@z~8spzzXpFpW< @z ~8@@W8zspzzX!Fp%"W88W8zspzzX!Fp%" W88WHz~@@sFCpBzzpTD.z,` YZTC0z,, Y&zG΀XH z v~@HHW@~Fp!W  &ON<  " N  M,  ߀j,+,M000402,,Fp!W    *~HɎ@ɮ8PPWH<~@p!Xΐ *`\pW@ @(*(*(@ @@   @a   @FpW @ @@ $'(0 9B@$    h@ @V@  @@a   @ԋ@  @@@ @|@a @ @T@  @&`@ @h  2(" ( 0 9 f~@Ǟ<HHW b<@ @ 0 0 ccs0p2pWH<~@p(8D,DD Dcq q}z $~@ǎ<HHWH<~@ P  Dp(`xDfD~@ǎ<HHWWH<~@ސ \y @D l `@ @|rXp (~@Ǟ<HHW  XWH<~@pހj:(,`(02,Fp1Wg Xqp (b . ~@Ǟ<HHWH8~@΀ zz XߠÚ< p   j V B8 @ 8     '0     @      !''>       @ ''   @     ' ~@ɞ8HHWH<~@p pA0 2 q p` plpWހ p Jހ p 0ހ p @ހ p ` @   2P  (6~@Ǟ<HHWH~@p p ! q0 0 p` plp`W@ pJ@ p 0@ p@@ p`!N  p4~@HHW@~@@BLNDF "JX Z l n      !2#4#<#LN## #*,LN\^###&&hj f h ) .* \* ) * *    / / T z  /    P R  & &    $ & \5666660 2 J L b d z | :; @T V n p     :;6j:~;  " $ : < R T h:|;    2 4 J L :;::NT;      2 4 P:;)=>@;$.4;;  $`dhl8<@D(,048<@DHLPTX\`d.text.dataA.bss8(_confsw(((_ctladdr(#((_d_write(.(_u(8(_ttinit(B(L|(_linesw(W`(b (m(w (h(_fdlp_al(_copyin(_copyout(_ttiocom($((((_wakeup($(_sysinfo(((_al_work(((_spl5(_splx( \((_BAUD( (_d_read( @(! (, (_fpalclr (< (_timeout(_al_scan(Fp(_CTCDV(_SIO4X(P(_printf(Z(_sleep(_spl0(e<(o(y0(_fpalinit_fdlp_addr_fpal_cnt_fdlp_cons_fpalopen_fdlp_tty_fpalproc_fpalparam_fpalclose_fpalmodem_fpalread_fpalwrite_fpalioctl_fpaleint_fpalextst_fpalcint_fdlp_dcb_fpalxint_fpalswrite_fpalrint_fpalsread_fpalbwrite_ncharbreak_fpalwbreak_fdlp_getchar_fdlp_putchar_diag_cons_fdlp_breakchar_fpalscan_fpalcont_d_rwrite_fpalbread_fdlpintr_fplpintr_KEYBOARD fplp.o/ 548577646 0 0 100664 4854 ` u n .text P .data @.bss H H8@s0 0   @ Y z 8 ާ B4@ާ B @   ^88Ws    WYWH<~@s΀ pސz( p  !RՓ@ tt(Y*x (xFxo ~@Ǟ<HHWP<@~Hpǧ  tpp W n `>  &  x t>  &  & N 4ΐ  \  (2* ԋ 'Gΰ  ΐ `P/Qΐ 0 8 )ΐ 0  \  ϋ @    @  lJ  2   x h,ΐ  <  &~Hɞ@Ǿ<PPWP@Π ~H ߀    ߐp  qߌp((  T   . a   *~Hɞ@PPW@~8p p ߀ p!((,R($( &!$ !8 40 ԓv f V    @~8@@WH0~@qBp`p     0  r   (0j~@HHWP@<~@sq8lF0 "l0 bl0   FHJLNF* YF*YFz  IKMO : ާ B6@ާ BY~@ǎ<PPW0  @  1 3W @(#)fplp.c 4.4 87/05/14 LP STATUS: UNKNOWN STATUS LP STATUS: OFFLINE LP STATUS: POWERED DOWN LP STATUS: ILLEGAL REQUEST d_write: x = %x, dev = %x, cmd = %x (*D .@vx   ,hj Jj~ n*,NP\$&rx TV| J V j v . N P      .text P.data .bss Huu_uuLu%u0<u:Pu_spl4uEu_sleepu_spl0u_fubyteu_putcu_getcuOu[u_wakeupufupu_printfuzuuu_copyoutu_copyinu_fplpclr Lu_fplpopen_fdlp_lpdt_fplpoutput_fplpclose_fplpread_fplpwrite_fplppoke_fdlp_lpbuf_fplpstart_fplpintr_fdlp_dcb_fdlp_addr_d_rwrite_fplpioctlhwdiag.o/ 548577656 0 0 100664 1159 ` u x$ .text .data@T@.bss0  0        >:pW (     WXL~P 0@p~(,0#4  >T~PǎLXXWXL~P >TZ 0@p~(,#4~PǎLXXW@A~<s R~<@@W @(#)hwdiag.c 4.7 87/05/14 t|tnz  .text.data@.bsslll,l<$lGlUl__GetHWSwitches_HWSetDate_timetoYMDHMS_HWClockCommand_HWGetDate_YMDHMStotime_HWSerCmd iomachdep.o/ 548577674 0 0 100664 2995 ` u h.text@M .data@@@.bss@@P@~H`p`Ln8.LdLaa 82  L@  !ΐ x'82ߊ( $ҋxԓX    ~$), 112  00((( "@ rA 0 @ހ#' 1D0 @ހ#' 14qwpzp ~HɎ@PPW@~8p!p(`<`q<<~8@@W8 ȧ~4pWt~488W@~q0 A.q$FO  1"~W @(#)iomachdep.c 4.5 87/05/14 adr=%d , status=%x board address=%d type=%d UNDEFINED unknown type bypassed (can't dma beyond 16Mb) not configured overflow max board = %d %s number=%d d_write returned error on dcb move "6DRZ    *0< > JP\ ^ f h t v ~     * , 02FZr t xz  ",@LR t.text@M.data@.bss@pP_debugpP_d_readpP_cfdebug8pP_printfpP_confcntpP_physmempP_confswpPpPpP_ciotypepP_bootdevpP_rootdevpP_pipedevpP$pP.pP_d_writepP_devinitpP9pP_ctladdrpPC_iomachdep_conf_devs_move_dcb_fdlp_dcb_dcb_write_dev_init mas.o/ 548577883 0 0 100664 64163 ` u YhX.text .data H@.bss88h8@H~PP ^cncpްP^dZ      x    `qq@6    T~dTT`q   0 # T  T\ X\X ! ! X pp q0 0  .ϒ@ς(  ϒς,X.X @ !0  !.X (#^d Pԧ^dnc `*~PɎHɮ@8hhWH~@΀ @XQpXp0a  :  0pp `0 8`1p X@  `X p&  ,p (l2 . f~@HHWX?@Hz~Pqzspzΰ X߀ ߐ0a  :  0ppߠ ` +  `!p  X@ ޠz  (YR@ʧ48 8: :>+ >     0x   f 0,0   2    (( pp  X@  `!2!p  Y8 0`4  &s,0 #2 ? 2&p2s,@ $@ $@s.p"$B B&s, ,? ,s&p"$"s!@ $@p!$#"Y4x/x!0 #p,  %s, #2 ? 2% 8p2s,@ $@ $@s.p"$B B%s, ,? ,s&p"$"s!@ $@p!$#"x/x!0 #p, < @ @@ @< @ @ `(     &  n  z F@ @ , @ @@   `@    &0  FpW  ~PɞHɾ@XXWP@z~Hspzΐ Xߠ p60a  :  0pp߀` )`!p X@ ހ @  4!  .   Y  @  @  Fp W~< @  #  20  1   (( pp  X@  `!1!p <   Y^  "0& 0 `0N  @4~Hɞ@PPWH8z~@spz΀ Xߠ ߐ0a  :  0ppp ` ( `!p X@ pFp W~@ɞ8HHWH8z~@spz΀ Xߐ ߠN0a  :  0ppp ` ( `!p X@ pj` Fp  W    ~@ɞ8HHWh@HzP~Xrzspz X ߠ0a  :  0pp߰ ` -  `!p  X@ ް(`!  TD ,좆 Y^TC  ,~ Y:\8^^\<^\Z (T^` T!p""W"q      q      ^q      :q      q        0  X0   1    (( pp  X@  `!1!p P^d2^d ^d:,8^d0`#>,<^d`# '90 0: 8^d `> <^d`  n\<& ( n` n^8     ~XɎPɮH@hhWX?@H~PpXΠ ߐ0a  :  0pp߰ ` *  `!p  X@ ް  pW@ @(*(*(@ @@  @a   @ϋ ` XPFpW 2  @ @0@ @     .        掋0  9 ?T i   ( 0   1    (( pp  X@  `!1!p   x    4 @ &0   2    (( pp  X@  `!2!p     F H ㈋@ @@   @@@r@ @ @   @  D  4  ~PɞHɾ@XXWX?@H~Pp p X߰ ߀@Z0a  :  0ppߐ ` ' `!p  X@ ސ të< b       00   1    (( pp  X@  `!1!p <  YP 0"   x p p J0 @ A&<@B@ A.0A" 1@@  O 0  @G p 1@   0@  0 J8@ :  8    * +<& ,( #0`# b p  $6  d . $$$       ݠ ݘ  ~PɞHɾ@XXWp<@H~P΀ .p pX\.\`s  !s0  x !.\X\  \X\ܲs d^d Q^dP^h nd`  ` hV Q ^d@0pqΠ X ߐ  :  0pp߰ ` *  `!p  X@ ްJ    4h (@` ,````\`^f nf40   1    (( pp  X@  `!1!p nf&`!nf&` p Y^l Hh$   .   nf& !B!" D v"4D!(! C! !l . Jl . `"l J   .  ~   $ދl       Vl  B     @  J0 R0   2    (( pp  X@  `!2!p       $  $l      l d   @   0    @  @           @ >2 `     l         .   <   @  @Ԝ>0   3    (( pp  X@  `!3!p 0   ^t0   4    (( ppħ  X@^t  `!4!p  nr  >0 nranrГnr nr@nj Rnrb nj njFp! Wnj^]\.+\    Fp! Wns`f ώ  ~PɎHɮ@8xxWx8@H΀~P  Xߠ P^t(T0au@  :  0ppȧ ^t` ( ^t`!p  X@ W^oWno^Y^t @ ǗT <0   1    (( ppȧ  X@^t  `!1!p )`!0 T |W ^\^tU0^hZ8^Z^\ Ϛ,\     NZdP^p d P^P^d P^P^`v"0   2    (( ppȧ  X@^t  `!2!p ^heanh^dP  @p p  *  ^`P t  V   8  Ћ 8| V 4 Fp! W^pQ^ppn\(   Fp! W  nocg^t @nYb8no`.nZ Fp! Wno`f,  ^t    ȒnocJnY@< ^t0   3    (( ppȧ  X@^t  `!3!p noc nY 4  ~PɎHɮ@8xxWH < ~@`0 Xߐ ߀0  :  0ppp`0 2`1p X@ p0  @z< 4  < DzP D @  @ (~@Ǟ<HHW@ ~8`0  p0  :  0pp߀`0 2`1p X@ ހ0 0  ~8@@W`8@H~Pp p XP ^\ ,T0aϽ  :  0ppߠ̧ ` '  `!p  X@ ޠ^\υ$[T^X@ nX<0   1    (( pp̧  X@  `!1!p .X`!0 <0   2    (( pp̧  X@  `!2!p (`!0  ` ^\    ǘ  [e(^X P^Xǝ4. !!(  ^\FpW  nX (yǝ<   T)T!|   T+  V     T+ T+ .  ~PɎHɮ@8``W`8@H~Pp p X0  ,T0aό  :  0ppߠЧ ` '  `!p  X@ ޠǘTϳ$ :0   1    (( ppЧ  X@  `!1!p )`!0 ǘT* 00   2    (( ppЧ  X@  `!2!p ٧4T4-ܧ 0a  :  0ppߠЧ ` '  `!p  X@ ޠ   T    X <0   3    (( ppЧ  X@  `!3!p +`!0     PX^_n_F( X    X    ,0   4    (( ppЧ  X@  `!4!p     U  n_&`     0T0)x  T(N T(  2   T(T( $  ~PɎHɮ@8``WP8@~Hp p X߰ ߐ (L0aω@  :  0ppߠԧ ` '  `!p  X@ ޠ    8L T TL : L(      @ L(L( "  ~HɎ@ɮ8PPWP<@~Hp p ߐ (L0aω@  :  0ppߠا ` '  `!p  X@ ޠ   L > L(  "       @  L(L(   ~HɎ@Ǯ<PPWX?<@H~Pp p΀ `0 ߐ  :  0ppߠܧ ` '  `!p  X@ ޠ < `  (    (Ϲ@T$  v ,ϹT !`  T+   T+    h~PɎHɮ@<XXWP<@~Hp p`0 X@   :  0ppߐ `0 7 `1p  X@ ސ ,Lς 0   1    (( pp 0X@ 0`111p    f  L  L(  vL(V  d<6@ 1s6 sΠ0 s0p( ( Π B40A1( <L L* L(  zL(ZL(@ Z  ~HɎ@Ǯ<PPW`<@H~Pp p΀ `0  ߠ  :  0pp߰ ` '  `!p  X@ ް     ,XϚ  0   1    (( pp  X@  `!1!p X  00   2    (( pp  X@  `!2!p  ܧ4X4-0X    \ )      (0   3    (( pp  X@  `!3!p          0X0, X l X)  P     X) X)   ~PɞHɾ@<``Wh<@H~P΀ p r#`0 ߠ  :  0pp߰ `0 8  `1p  X@ ް+ ,X:4 p` *C0A!1( C  @Pd\>d>\  <$0"1"&  "O0A1@  "Nd0A01   N\0A01B`  0   1    (( pp  X@  `!1!p   pl   $6 d .  $ $ $Y   ,     `X    < X *X- X,    pX, X,      `~PɞHɾ@<hhWX?<@H~Pp p`0 X߰ ߐ  :  0ppߠ ` '  `!p  X@ ޠ: Z  0   1    (( pp  X@  `!1!p  (ω@T 0   2    (( pp  X@  `!2!p    T(&&T((( @8  0T(**\T(++F T(  *T( T(       ~PɎHɮ@<XXWP8@~Hp p`0 ߐ  :  0pp߀ ` ' `!p X@ ހ    0  1   (( pp  X@  `!1!p  (ϩ@L:  0  2   (( pp  X@  `!2!p     L*  ~ L*~ L*~     ~v~HɎ@ɮ8PPWP8@~Hp p`0  ߀  :  0ppߐ ` ' `!p  X@ ސ}B  *0   1    (( pp  X@  `!1!p   0   2    (( pp  X@  `!2!p (Ϩ@Lz  0   3    (( pp  X@  `!3!p   L*  yj CL*yJ L*y0 J    x~HɎ@ɮ8PPW@  qp8  <8<x@@W @(#)mas.c 4.4 87/05/14 %cIdentification du MAS%d: <`j6\H(MAS: unit=%2x, chargement des tables impossible MASintr: unit=%2x, IT parasite MAS: unit=%2x, emission interrompue F|C"GPDlGPGPE MAS: unit=%2x, rate de transfert, erreur de rythme, erreur de parite, erreur de stopMAS: unit=%2x, chute de PDP MAS: unit=%2x, perte de porteuse @@  OP CL RD WR IO PR PA IT ITx ITr ITR OUb OUc INb INc HIO BRK OUC INT INL CON DEC SCA CMD TOx CH1 CH2  "46: < B F H `    Z`vXl   &,.4>XZjz".:<f h  *,6@PV^~    !""\~&))*&.*0*@BJ*L*r*t*|*~*******))*! ++ ,",L,N,++,,,,   - 0  H. J.              @ F N P V      - &! 41 d  n2 x. z.  -    , 8 D J R X `) b) h* p x* z*   * * * * * * * * * * * * ))* !d-~-34 .0@BHNhjt~$&, 6.8.(.68> ..8:JLRXrt~ ,.4 `8l!9! )) *(0*2*BDL*N*t*v*~********))*** 0:6 *,28TV`jz;0..4t;*08>F)H)N*V^*`*prz*|***********))*,DF`lx~))************** *&4)6)<*z;;$,.4vx;-;6BNT\bj)l)r*z************** ) ) * (! P!!" -"1"b-"j;" " #(B#PB#######$$ $$"$*$J$P$X$Z$`$$$$$C$;%D%D%(%BD%V%n%p%%%%%%%)%)%*%%*%*%%%*%*&*&*&$*&&*&0*&2*&<*&>*&H*&J*&P&\)&^)&d*&h*&j*&4&4($4(((((((())))))) ))&*).)6*)8*)H)J)R*)T*)z*)|*)*)*)*)*)*)*)*)*))))))*)1*4*4+f4+r+++++++++)+)+*++*+*,,,*,*,6*,8*,@*,B*,L*,N*,X*,Z*,d*,f*,l,x),z),*,,,,C,C-H;-------....<.B.J.L.R..........// ///&/,/4)/6)/<*/D/L*/N*/^/`/h*/j*/*/*/*/*/*/*/*/*/*/*//)/)/*/*/*040*0*0,400000C00011 11 1(1H1N1V1X1^11114T;4O4O4O444444455 55 5(5H5N5V5X5^555555606H6J6d6p6|6666)6)6*66*6*666*6*6*6*6*7*7 *7 *7*7*7"*7$*7*78)7:)7@*7D*7F*7n777777777)7)7*77*7*888 *8 *82*84*8<*8>*8H*8J*8T*8V*8`*8b*8h8t)8v)8|*8*8*84999949@9L9R9Z9`9h)9j)9p*9x9*9*999*9*9*9*9*9*9*9*9*9*9*9*9:): ):*;FO;HO;PO;`;b;r;t;;;;;;;;;;<<<R>>>>>>>>>>??? ?T?V?d?f?Q?Q?????@@@@@)@)@$*@,@4*@6*@F@H@P*@R*@|*@~*@*@*@*@*@*@*@*@*@@)@)@*@BL.BN.B.B.BRCC$C<C>CXCdCpCvC~CC)C)C*CC*C*CCC*C*C*C*C*C*D*D*D*D*D*D*D"D0)D2)D8*D<*D>*DDDDDDDDDE)E)E *EE*E*E,E.E6*E8*Eb*Ed*El*En*Ex*Ez*E*E*E*E*EE)E)E*EEEFFFF F4F:FNFTFZF`F.F.FOFOFOGD.GF.GOGOGOGGGGGHHH H*H:H@HHHhHnHvHxH~HHHHI4IBIZI\IvIIIIII)I)I*II*I*III*I*J *J *J*J*J *J"*J,*J.*J8*J:*J@JL)JN)JT*JX*JZ*JKQKQK K$K&K@KLKXK^KfKlKt)Kv)K|*KK*K*KKK*K*K*K*K*K*K*K*K*K*L*L*L L)L)L *MR.MT.M.M.N".N$.NNNNNNNNNO)O)O *OO*O*O.O0O8*O:*Od*Of*On*Op*Oz*O|*O*O*O*O*OO)O)O*P$P4P6PHPJPbPdPnPxPPPPPPPPQQQQQ$Q8Q>QTQ2RR4R6RNRPRZRdRtRzRRRRRRRRSS SS$S*SSSSSSSSSTTTT6T<TDTFTLTTTTTTTTUUU U&U.U4U<)U>)UD*ULUT*UV*UfUhUp*Ur*U*U*U*U*U*U*U*U*U*U*UU)U)U*U*U*VV0V2VLVXVdVjVrVxV)V)V*VV*V*VVV*V*V*V*V*V*V*V*V*W*W *W *WW )W")W(*W,*W.*X.X.XlRXRX X XYjYlY|Y~YYYYYYYYYZZ ZZZVZXZdZfZZZZZZZZZZZ)Z)[*[[*[*["[$[,*[.*[T*[V*[^*[`*[j*[l*[v*[x*[*[*[[)[)[*[*[*[[[\\\&\2\8\@\F\N)\P)\V*\^\f*\h*\x\z\*\*\*\*\*\*\*\*\*\*\*\*\\)\)\*\*\*]*]*]&R]0]J]L]V]`]p]v]~]]]]]]]^^^@^X^Z^t^|^^^^^)^)^*^^*^*^^^*^*_*_*_*_*_*_*_&*_(*_2*_4*_:_H)_J)_P*_T*_V*_``` `:`F`R`X```f`n)`p)`v*`~`*`*```*`*`*`*`*`*`*`*`*`*`*`*aa )a)a*aRaRa b b"bbbbbbbbbbbbcc$c,c.c4cvcxcccRcRc d2 dLdddddddee ee4e:eBeDeJeeeeeRe fB f\ffffffgggg"gBgHgPgRgXgggggh\ hvh;hhhiiiii&i0i@iFiNiniti|i~iiiiijj,j.jHjTj`jfjnjtj|)j~)j*jj*j*jjj*j*j*j*j*j*j*j*j*j*k*k*kk)k)k$*kpRk k kVkVlVRllRl l lm&m>m@mXmZmdmnm~mmmmmmmnnnnnVnnnpnnnnnnn)n)n*nn*n*nnn*n*o*o*o$*o&*o0*o2*o<*o>*oH*oJ*oPo\)o^)od*ooooooooooo)o)o*pp*p*p p"p**p,*pR*pT*p\*p^*ph*pj*pt*pv*p*p*pp)p)p*p*p*p*p*pRpq,qDqFq`qlqxq~qqq)q)q*qq*q*qqq*q*q*q*q*q*r*r*r*r*r*r *r&r4)r6)r<*r~RrRr r ssrsssssssssssttttJtLtXtZt~uCuuuv vv$v*v2v8v@)vB)vH*vPvX*vZ*vjvlvt*vv*v*v*v*v*v*v*v*v*v*v*vv)v)v*w>wT-wb1wl!wn!w;wRwRx x2 xLx;xxxxxyyyyy,y2y:yZy`yhyjypyyyyyyzzz z,z8z>zFzLzT)zV)z\*zdzl*zn*z~zz*z*z*z*z*z*z*z*z*z*z*z*zz)z)z*{D{*{B{D{^{j{v{|{{{){){*{{*{*{{{*{*{*{*{*{*|*|*|*|*|*|*|$|0)|2)|8*|` |v ||| | }}D;}}}}}}}}}}~~~~~~`~b~p~r~x~~~~~~~~) )* *"*24<*>*d*f*n*p*z*|*****))*D".4<BJ)L)R*Zb*d*tv~************))* @ Z; $*2RX`bh(4:BHP)R)X*`h*j*z|************))*68R^jpx~))***************$)&),*@DZrt))****** *(***4*6*@*B*L*N*T`)b)h*  ;D F rB.text.data.bss8_sasinit_confsw_sasadr_masadr_mas_cnt_masid_ctladdr_printf_mas_tt2$ 1_masscan<X_mastrIS^0_mastrn_mas_tty_mascmd0X_timeout_masopen_spl5_spl0_u_ttinit_masproc_masflaghdr_maser _masern(|_ksct_kbase_sleep_linesw _mastox-_sptfree_wakeup_masreadh_copyin_copyout_ttiocom_splxStY@bdd_cvbaudx_masintr"_spl7G_masrint;(_masxint4|f%x_mascon}l0sH_mascoutm;h_sysinfo_masPDPP EP_masDPR_signal_masrev(_BAUD_TBLSZ`[_writeshort_readbyte_readlong_tblmastrace_writebyte_masscantime_mastbltr_masnametr_mastrace_masparam_sptalloc_mastbler_masptrer_masclose_untimeout_ttyflush_maswrite_masioctl_masoutbloc_masoutcar_masinbloc_masincar_writecom_readshort_masrblocint_masarret_masdecon_masinilgn_masinitab_masbreak_cfreelist_writelong me.o/ 548577913 0 0 100664 10292 ` u x#0.text .data@.bss88`HPX~` жP^@  ^@ ^@^<dp  q! q!q.q  0YY\\dZPTqqYdާP @0 ; |.ddP*Q Lx^^LP^HǠpǐ0ހ,*<('9(  +4 4484 8   0 `f `z.0$ -0 ;z(x  +(  + fȓX!z  ( r  +  >$ ~P^\0%^\W, -0 ;~(,^,ԋz!z   ^\%P n^L|XTP0ɧ^D0pz j^XPXzptzxPx`^XzPz^XPz 8 01q z z z^Tzz zz Ttz xPBx|*^Tz Pz z^T^TPz 8 01q z 펀z  -  @<.z 2^\zP^\%P R^DP0  &       !z^H$%P -   Z0B^PP 2^<  ^@\^@ (C~`ɎXɮPH``W詞8~@p (  YώHt|жxX ^xY0GA1z×z 8 0G"z A1zz'0.0BA1z(!zӆ   ~@ɞ8W`Hΐ ~Pp q΀ 0( )0 7 (ؓ z  )p(zzȧ .  !    ! p x pF` *0z) TTTXX`s(06z),V  \T\r  \T\J~PɎH``W8 88WX~Ht.xtpр  (P PPTT`P  (0&5 hZP T   02t '0 8(z,`z .0$ '0 8z(z & ` z" ,v 2 |< p H 0@  & '0 8z~HXXW@~8qXX?  X<*><@@W@~8qXX?  X<nX ? >X<@@WH~<q``?  `@rB.`D  !0  !.`@.2BFD@x~<HHW@XX?  X<\>X<.X  ! ^ !.X><n@@W@~<qXX X,~<@@W8ȩPP PT88W@ 88 8  <8<|@@W @(#)me.c 4.4 87/05/14 meload: %s inexistant Chargement de %s sur SAS%d meload: %s ne contient pas du code 68000 MELOAD: textsize=%8x, datasize=%8x textstart=%8x, datastart=%8x, totalsize=%8x dcb0adr=%8x meload: typepdev=%2x%2x, etat=%4x meload: arret du co-processeur impossible meload: initialisation impossible meload: adresse de chargement inaccessible adrIM=%8x meload: typepdev=%2x%2x, textstart=%8x, adrue=%8x meload: erreur de lecture meload: erreur de lecture meload: mauvaise fin de chargement meload: mauvais lancement MEWAIT: type=%2x, pdev=%2x, finordre=%2x meload:(fin sur timeout) typepdev=%4x meload:(pas d'IT appel 2) typepdev=%4x, statbase=%8x meload: dcb0adr<>: old=%8x, new=%8x SASINTR: type=%2x, pdev=%2x, ioir=%8x, cr=%4x sasintr: type=%2x, pdev=%2x, apres IT etat=%4x sasintr: type=%2x, pdev=%2x, IT fantome ... /etc/emc/ "04 6 x z          2 4 : B \` b hz~    8h~.JPXZdln|~$.8:DLN\^bdn     @B    68Dtz,:<FNPbdt:<N2     $&pxz  ",68F H j l |~     j6B^ft .textc.data.bss_mmreadm_um_minm_mmptem_mmvadm_copyoutm_flushm_ksctm_kbasem_mmwritem_copyinm_mmioctlm_d_readm_d_writemmt.o/ 548577956 0 0 100664 10761 ` u &8/.text .data$@.bssppX?@H~P s pZ sp(p  ,f 4!z$ $ B@ !|P P !Ć &`Z dX !b$  ̓. (,!v (!YB@ (P 0 Ws Y~PɞHɾ@XXWH<~@ssp(pg ? Y&(H"YYxJ(!Y$(,!Y( (!tY ? ~@Ǟ<HHW@ 0 #@@WXDH~Pzhz*;ΐ@zzsp <q xf,(     zsp߁$ x p x Ɠ  < @   ,,~PɞHǾDXXW`DHP~Xp×z qp q p߰ (߀h(7(   4Ћ (0!` @P  (!Z@  0h (!p 8!X  0 q`  2@@  0 qp 4h@ @  P !Ȇ p0 q (PX `((( 0(`>h&1h< ,"(,  04( ' q)    { p {  .X~XɞPɾHD``WhDHP~X  z z zsp (ph'8(zsÓj`,h B  fP<^d ((x |( :, ( ( (8 ($ p""W"(H ދ( :v( z( j( F(Ѐ 8 x (   8L Q^d  .    $ ?( Z   hgxx p (aB($( (( `z (,8@  "8($7G #48 , pװh "7' 4.(+j  J `" ' 7 #< `# ' 7$" # 8 Z8 `!  ``Ԇ `  f  T  ^dP . `'NP    <  ~XɞPɾHDhhWhLP~Xp. ! ` vpߠ   p`  .  $` $( x  (ph,'>GN(GN,` j ! .`0 # ! .`x ` 8 ` 4@ 4  .`((~p""`W"8  `# d$d (  ddd d@ ( d8 (d  g@  d  0&8'H$7 Ǹ0;$v  ? _  8H   . 64` ! !, ! !(`<8@x ,g@  0^@   (`($$  0(p t @  '  $ < z(D` _   8(,| `j ?    . (H (x  p`   `! )p"">` #l `# ' 7$" #H `448(0   D `" ' 7 #` $ (``zē,D  <    ~XɞPǾLhhW@ x((Ydsp0(1|s. $. >$\@@W@ x((Ybsp0(1|sl. $. >$@@W@蒋0 ֧.2 . b@@WXDH~Pqh':( s sp(߀ < mY6'm *@m m ԋ4m m p""W" p(Hp($  p(  p(bp(V  ^* (8  2p(,  *†Y~PɞHǾDXXW @(#)mt.c 4.5 87/05/14 not ready statusoffline statuswrite protected%s on mt %d mtcommand(%x, %x, %x) mtstrategy:blkno %d,nxrec %d,b_blkno %d density switch not on BOTdensity not availablemt %d : error blkno(%d) > nxrec(%d)  4 4 4 4 4 4 4  4 4 4 4 4 4 4 4 4 4 mtstart(blkno %d,nxrec %d,b_blkno %d) mtstart:b_active = %x end of tapemtstart:cmd(%x) mode(%x) addr(%x) bcnt(%x) @$$|(spurious interruptmtintr:cmd(%x) mode(%x) ioir(%x) blkno(%d) nxrec(%d) unknown commandLmtioctl(%x, %x, %x ,%x) (8((8(((8(HJt$H  ( VX  * . 0 `   4@Jhjp (@P>vxF H P b d l x & ( . D J X j v | !     L    B" T V j t   $ $ $ .% $   b%tv .8l$$%:r%V'(      DF($$$`$. 0 B bdh j *     <*p,> d `dhlp.text.data.bssp_mtopen _mtcmd _ctladdr  _mtprint _mtwaitT _sleep _u _vmtbuf _mtclose _printf _mtdebugh _mtbuf _spl6 _spl0 _mttab _mtstart _iowait _wakeup  _k_tabP _C_tab0 _c_tab@ _iodone _clrbuf _lbolt _mtstat _splx _pcopyin _d_unit _d_write _d_read _mtintr,  _prcom _mtread$ _physio _mtwrite _timeout _mtioctl _mt_cnt` %_mtcommand_mtstrategy_pcopyout partab.o/ 548577960 0 0 100664 440 ` u ,.text .data@.bss @(#)partab.c 4.3 87/05/14 .text.data.bss_partab jPprof.o/ 548577968 0 0 100664 2116 ` u .textlI .data L@.bss@Yb xp ! xp !@@W@x (Y@x`(YYY $ xaq 2&(Y$4pY@@Wd  H$l>l. YW~p"pP@0 p( 2B!p~W @(#)prof.c 4.4 87/05/14  (*. 0 > H J R VX\ ^ n x z      (*4 : < D H J lx z      .N P X Z b l n      .textI.data .bss_prfreadm_prfstatm_um_prfmaxm_minm_prfsym m_iomovem_prfctr mmm_prfintr<m_prfwrite_prfioctlpty.o/ 548577988 0 0 100664 6382 ` u ,.text .data @  @.bss 8 8@ ~8pYXp@2< <;>: 84 b@ @@ @X@ FpW~8@@W8 ȧ~4XpZFpW@~488WP@ ~HXp ߀ χ,,ؓtLǨVx F  6(!&xY  D&4 FpWG ~Hɞ@PPWX?@H~P ߰Xpϗ,4 (Y  ċ$@@ @x)   x( FpWxY_Fp W~PɞHɾ@XXWH~@pAX1'$΀  Hp W@ @&@ @@0!  (D`FpW  vp@ @^@  @F@4@ @~ . ~@HHW888W@~8pYlXp4YD@4 @ @ ~8@@W@~<Xp@Dz@ @n4~<@@WP<@ ~HX߀@ Y p0  dXx$.@ Y,(@ ޠǷ xz  !jx  g(.FpW &(xY[<p,@a@  @~Hɞ@Ǿ<PPWP<@ ~HXp ߰@ Ylχ,,Z֐xǨ(   xY  H) "vhG  " '8 ,( 0!@ (Fp!Wx~Hɞ@Ǿ<PPW`?DHP~X Xp  ߀ \$|Y`+tp *Ht 0! ti!Tts! @f!n\  \  $\(\\$vd\  :($ )<(~XɎPɮHD``WP@D~HX߀ pa!@ 6 ,   ΋2 .  @ ~HǞDPPW8ȓ88W @(#)pty.c 4.5 87/05/14 ^,P8<$4 6 H      H J RTx < > \    4DHJ\dn p xz    &  4h  6 8 R j!  # #*> xz  $$&$V      J  ^ h& p        l n  v x (  T! ) !  4 6  > @ J+      $ ( , 0.text .data @ .bss 8_ptsopenw_vw_uw_pt_ttyw_ttinitw w_sleepw_lineswwwXw_ptsread0w$w_spl7w_minw_getcbpw_iomovew_splxw_getcw_wakeupw.|w_putcbpw_ptsprocw_ttrstrtw_timeoutw_ptcopenw8$w_signalwBw_ptcreadw_passcw_ttlowatwLxw_putcwV Dw_copyinw_copyoutw` w_ttiocomwj_no_t_proc_ptsclose_ptcwakeup_pt_ioctl_ptswrite_ptcclose_ttyflush_ptcwrite_ptcioctl_ptsioctlrawnet.o/ 548577999 0 0 100664 2578 ` u  .textB .data`@.bssXXYT TWTW@ x`((YPbX x`z"(&x`XxtPX @@WX<~@ x`((Y p rր8( s,z *4htJ.t!70x>#xx.HH~@Ǟ<XXW@A r@Y&d@@W8ȶXP~*88WPW @(#)rawnet.c 4.6 87/05/20 rnetwrite: out of mbufs rnetwrite: out of bigbufs &8VXv   &(FVbhx~  *.0BP .textB.data`.bssXo_uo4oHo_sleepo_copyouto_m_freemo#o_m_geto_printfo_spl7o_mclfreeo.o_mbutlo9o_mbstat o_splxo_copyinoDoPpo[oio_wakeuposo~o_mbfreeo_rnetopen_rnetclose_rnetread_rnetwrite_m_clalloc_mclrefcnt_wbetoutput_rnetioctl_localAddress_rawinput_rawbuffer_nmbclusters_rawaitingsmd.o/ 548578028 0 0 100664 9542 ` u 4.text .datal,@.bssX?@H~Ps(6 sqprpp߀.Y` ߠ p   Òz  >p Yz  0z     &fY*`  `  ‹JÇpq \ ~xp  .p 0 &|q z pT.   0~PɞHɾ@XXWWP?8@z~Hΐ@z szsp<p.      p($bsl ? p0 0 0sp0P5   ? sps  %p,b: @  " ,,~Hɞ@ɾ8PPWH8~@pgzszs13p20@$zpT'( F  0 ,P 4p߀ߐs 400d p1    q, 44 x xx0j  080Ǘ00#0)  004 @ѧs G xh`n  :,    s ~@ɞ8HHW~ljy `  1JèL!a@ A 0$A   J2ւp (b(g  ~ɞWh@HP~Xp  ǰ  zs@ C4p6dp@߀ +q xx p8*$pxxq qptxx q 2 ( < "$ (; #   ( ^d,p! \p\^`  q  3 0q   +0{`  qrx\ A@  q! a - a P^` Ϙ Q^\zp T!(2sp!bP/QaP/[paP/[ã8;bP/S%*0`#(@^` p P^`r (2hqp p(ppp@:(0^\P^`P^`  L^\PP^\ x@  Ay ( 9 ^`q^d,p! n` ^d,|.dp(0 8^~XɎPɮH@hhWH<~@ppp. DP2p~@Ǟ<HHWh@HP~X`^``p߰ { ǧ VzspRP ^d(2  zs p p\.ǎ\ p\\(p(  p\ȓ\(p( p\ܓ\(p(  s $. >$8d s  zp@<   "p`W    ^ p  zspd < x pp\p^\  p \:(\     l}q- p p  p  \ -!0p1 #  qa a  ,)p(0 :(^     0440  04`d ! !,d !  !r  H, { p{ `h~XɎPɮH@hhWH~Dpssp pT2~ $. >$r~DHHWH~Dpssp pT0*~ $. >$~DHHW@ 0 #0@@WH<~@A VYV@YD ssp q (   ~q  Y\'촆Y&&$ Yq  n~@Ǟ<HHW`8@H~PP^XTЧ^TX^T p߰^\| ^ TFċ*@ Փ p@n\(^TT^T^X@P^X( #~PɎHɮ@8``W @(#)smd.c 4.7 87/05/14 no vtoc areabad block list too longinvalid partitionSMD d_write errorSMD disc error"""((,,,,,,,222SMD d_read errorSMD d_read errorSMD d_read errorSMD d_read errorSMD d_read errorSMD d_read errorSMD d_write error%s on disk %d (8L\ Off Line Timeout Equipment Fault Write lock error Tranfer error Data overrun Sync. error header error CRC error in header Data check Seek failure Unknown drive type Unknown error Illegal param. in DCB order@BFHVf     < r L" $ ln|~P R   D46Jxz  FHv  2" > D# J R V$ X$ b j% "  #  $ ($ *$ 4 <% H J v x  '  # '  # 8' D J# n' z # ( fh'#'#"#$$%FH^`j~@ B \+,  +,JP.  0  1* 8 N1Z      >H3J3hz`dhlptx|@DHLPTX\`dhlptx.text.data.bss_smdopen_smdctab_ctladdr_u_smditab_smdutab(8_sptfree2_smdbuf_spl6_sleep_spl0_ksct_kbase< _iowait_wakeup_iodone_lbolt_smdstatI\_splx_smdbbh_bcopyS _d_write_panic^j_smdintr _d_read_prcomy@_smdread_physck_physio_printfh_suser_copyin_smdsync_ioInProgress_sptalloc_smdcommand_smdprint_smdclose_smdstrategy_smdstart_smd_write_ftHeadwall_headwallLight_smd_strer_smdwrite_smdioctl_panicstrsmlog.o/ 548578037 0 0 100664 2342 ` u .text K .data  X@.bssxx0!xY00Yx xWx xWH~@B hp2 !1qx(pxh t'Yhhhxxttxhpx>@x hxh* xD x~@HHW@~8p pphx`p vp`x,p xրhl Zh@  (hphqp~8@@W @(#)smlog.c 4.2 87/05/14 SYSTEM MESSAGE LOGGING OVERFLOW  :FPbn       $&.24>BDNR T bpv|" $ 6 >JZl x        .text K.data X.bssx_smopenm_um_smclose`m_smread|m_sm_rpthmm_copyoutm_bzerom_printfm_sleepm_smwritem_sm_wptpm_wakeupm_minm_sys_messsxt.o/ 548578069 0 0 100664 10490 ` u $-.text4 .data\#L#@.bss(?X~ s ppY^p0Y s p,Y(Y` .  Yȋ\   X'!4J  X'!4Ҋ Xn\,' \%# <%! 0Qa1H0Rb100Td1:Xh1p. >$2 X'!X X'G!s1 1(#4      Xq`d  zz,̎"DzD D@ @^~ɞɾWP?8@~Hs p s p Xq@ F@pWD@ `@    nFx4Ϙl8y D4*$X (" s p ! ~Hɞ@ɾ8PPWx?DHP~Xq s pbpY $'T T !p""W"b!b!p""W"t! t !p""(W"Y zqpY `zq$z  <`z ? z !s&zq0Xp P   Y̎ YY  YУ  xFa   8s! !~(,N s p sF Oda  (zz,̎"DzD D@ @ ԋYj(` YJ Y v$ XPxX!88::<<>>PP('4W  X(!Y(` Yn ^ Xq  pY(`  Y X!< <Y(`  Y X!< < X(!JY2 v wv"`Y `   `    X(!); X(!);x \(YN8:>\ <\<@ <^R_S.`< <: :" : :*8 8: :> >> > > > \8 8: : : : : :L: : : : : : 4UT8 8<0 <FTU8 & 8: :< <> >8 0@ 86 8 8< <0@ : : : :'4W X(!); d Y>~lFdl jY hz zq AT);Wd ~l Y X(!);("4Wx X(!);V X(!);(hz zq A);W~XɎPɮHDxxWH8~@ǎpp F4O@ @ @~@ɞ8HHWP<@~Hs ppYp Y'`  YXDX$`     `   Fp W~Hɞ@Ǿ<PPWP<@ ~Hs ppYp Y7`  YX(X$`    <  `   Fp  W~Hɞ@Ǿ<PPW8@0 ! 4  $X!Fp%" W88W80pHW,Op!X""4WOp!""4WOp!X1`0    ""4WOp!""4W`Op!X""4W$Op!88W@0@~<PO!pq7 A a0 1$X!X ~<@@WH48~@ Opq z1 @! a@ AXa$Y$7Qa1(\  P$*0 H~$(i$X$7Qa1FpWTi$X$7Qa1$((    $*0 H$(i$X$7Qa1       zV1 6 `   7   !((G 1 ! a@ AXFpW>i$X$7Qa1$(  |$*0 Hv$(i$X$7Qa1       $~@ɞ8Ǿ4HHW@~81Op!Xq0| nFp!W^g,X,7Qa1Fp!Wh,W,7Qa1,0~8@@WW@~8 zTp>0 lq~8@@W@ q \D@@W @(#)sxt.c 4.4 87/05/14 , , , @@dd8 p ddd |X$sxt cannot allocate link buffers 46F^x  RVXnp8:  tv ,46Tdf$4 8:.Ffr "B^  , f ~    6 V b F d r      Z~ bdr&(z|HRT$&`b,.>rt l%n%& %"%8& "bt%v%&NP''(''''((:'<'J R(`*b***+',  $(,048<@HLPTX\`dhlptx.text.data#.bss_sxtopen_uT'_bzero1_spl5_spl0;_linesw_sxtfree_splxED_cdevswO_sxtin_linecnt]_bcopy_wakeup_sleep_copyout_ttiocom_copyin_ttinit_sxtread<gPq|_sxtout_cfree_putcf_sxtbuf_sxtbusy _sxtinit_sxt_cnt|_printf_linkTable_sxtnullproc_sxtvtproc_ttyflush_sxtlinit_sxtclose_sxtioctl_HeadwallDiag_sxtalloc_sxtwrite_sxtrwrite_sptallocsys.o/ 548578078 0 0 100664 1104 ` u L .text, .data@.bss@~<q*&`z zq !W~<@@W8ȓ$`z zq W88W8ȓ$`z zq  W88WPD~HsJ*`z zq A(7W~HǞDPPW̎Y2d zzYW @(#)sys.c 4.4 87/05/14 "8 : jl    @BNXZbdx.text.data.bss_syopenk_sycheck@k_uk_cdevswk_syreadXk_sywritek_syioctlktt1.o/ 548578103 0 0 100664 8385 ` u 7..textP4 .dataPPX@.bssH~Dp d  zz*̎ DzD DD 04@  @~DHHWH~Dp@&@ @D 0D~DHHWP@~HϚ  x@( p x7! t( YttxxL b J t2! t> YxxxY@ *4 W~Hɞ@PPWH<~@p@  jD<pR΀@'4W@ @^<pՓ@x (*x( t)Yt tx x)jHt!tY(xx "xV'4WF~@Ǟ<HHW`<@H~Pp Dz0g2g0 lÇ8@    Ǘ,(    ^ ^@ P^P^\ P^P^X|)*^\P-) -^XPJ *)AZ   ( Ǘ,d 0H ,(,02R  @'4W"h* ?<pP  )P!0Dz Q!.Dz rW!* L'4WP&*&@  GG"U! VGG@a \  @R!@0 2 Z   H(TS!20 $  *T! GG$\ @ @ '4W J@ @T(G$U@   ZG*@a  @l~PɞHɾ@<``W`@HP~X|@  >  è:@$|΋P^\D& ||P^\|Fp"@ F,:>\ސ* y AZp ~azp pϘJp?  pxW   r    FJ@ 4    uTixp  @ n  p\upJ r:0 LqpR@ p ڋ0    @ J  qp  uy  p hpt L@ >  (s & w^\P ~XɎPɮH@``WP@~Hp@a " @:tχ$>>v& 0H@@ @~>   . >@  :v 0H <hޠ"Tǘx D l (@0  '> |@ޠ  ( @a@ 2<p @b ~Hɞ@PPW@ @ @> UT|@a 2G  @ȋ>@ @n.U . @@W@~8p0D0 "D1 nD1r,T  ,02'4W'4W$& 0H$,& 0H`,>    p, PP`  gW %' l%# D%! ;Qa1h&! 5Rb1H&# 2Td1(&' 0Xh1g P^;Qa1h&! 5Rb1H&# 2Td1(&' 0Xh1G~8@@W @(#)tt1.c 4.4 87/05/14 Flush(%x) 4 p({)}!|^~'`\\,.F   ,.@ RT`nvz|jl~ ",.6:<D\^jp~RT   4!6!N"R T \ b~#BZx%    &  4 V X  `  n"      f& h&         @'        * % ! !  ) )*:!<!R\ 8:R++%:%x*2BJ,T`!b!x!!--:x|.textP.dataPX.bss_ttopen_u_ttioctl_ttclose_ttread_canon_getcb_min_copyout_putcf_getc_subyte_ttwrite4_tthiwat_spl5_sleep_spl0_getcf_copyin_ttxput_fubyte_ttin_signal_putc_sysinfo_cfree_putcb_printf_tttimeo_wakeup_partab_max_ttout P_ttrstrt_timeout_ttlowat_ttywait_ttnulq_ttyflush_cfreelist tty.o/ 548578124 0 0 100664 5594 ` u L$.text 0 I .data 0 0P x @.bsspDH~Pp(t  6|T!T!p"" HW"t!>!TljT ^ XYFnfB((YFpAD :WÇ>^8`:b<d>gP(Ff(FFpAD :W(>FpAD(:W8^:`<b>dFfPg(6^ & Y'4W|RNp hW'4W@'4W0'4W '4WY2  ȋY: T(2Y8:>T <T<@ <VRWSǎX< <: :" : :*8 8: :> >> > > > \8 8: : : : : :L: : : : : : 4UT8 8<0 <JTUV8 & 8: :< <> >8 8@ 6 8 8< <@ : : : :<TTURVSW<  > > > >   < @ (8   g:8    :  0:   :   :  :    :  @ :  T(Xʆ Y: DFpA):WY~PɎHǮDppW@F8:<> P(*@@W@~8p΀! @ @:@ ԓ~8@@W@~8p| x '4W@a @  @>@a  @:   G'4W@a  @~8@@WH8~@pZ G@  z  ><T4UJ@   @ @ @Gs>6g W'' l%# D%! ;Qa1h&! 5Rb1H&# 2Td1(&' 0Xh1gP\;Qa1h&! 5Rb1H&# 2Td1(&' 0Xh1Gzdpސ V\ DR( SސT nRS T L>4ш\B\ U V"( hGGސ ~@ɞ8HHW8!4W88W @(#)tty.c 4.4 87/05/14  p 0@P((<<PPPPP<<<<<<xx|`{}~ABCDEFGHIJKLMNOPQRSTUVWXYZTz   < X Z    f 8Dd f ~ $>F    , 4 J z     , F           6 @            H L P T X \ ` h l p t.text 0I.data 0P .bss_ttiocomz(_uz(_ttywaitz(`z(_copyinz(_linecntz(_lineswz(_bcopyz(_copyoutz(_ttinitz(_ttcchar z(_spl5z(_sleepz(_spl0z(_delayz(_putcfz(_getcbz(_wakeupz(_splxz(_canon z(_tttimeoz(_ttnulq z(_canonbz(_maptabz(_getcz(_sysinfoz(_putcz(_ttrstrt z(_ttlowat xz(_tthiwat z(_ttyflushtv.o/ 548578134 0 0 100664 1272 ` u V.text@ .data@@(@.bsshhPD~Hp(D D! VD!p8>  xހX >>  ހ` T <'4W,~HǞDPPWH~Dp d  zz*̎ DzD DD 0@  @~DHHWH~Dp@&@ @D 0bD~DHHW8 A> RRJb020 0 (* @(0,,88W @(#)tv.c 4.3 87/05/14 014B DF"lz    22.text@ .data@(.bssh_tvioctll_ttioctll_tv_blkXl_ttxputl_tv_fdx`l_spl5l_spl0l_tvopenl_ul_tvclosetl_tvinl_ttinlwbal.o/ 548578189 0 0 100664 18027 ` u ?C.text,0 .data,,-$=$@.bss0p0p8 z~4s!#p#zq҆s~488WpDHP~XP^dP^lP0^h  `nl`l 8l l     ,  ,Г  ,  -'lnd^hΐ X 0^`n` @ }  @ 480  ,00  *00  200./ )0 p16 1#00  800  00   )-@2r΀$     @   0X (ynh^hQ^h^lT^l^dX^d ~XɞPɾHDppWH0XP(^@ 4fY,< @ @ @@ @2@ @ @ FpW~@Ǟ<HHW@z~8r΀ XpFpW<   @ ~8@@W8z  X!Fp%"W88W8z  X!Fp%" W88W`DHzP~XzF TD2 0, YTC4 0,܆ Y Xp8÷<  X(:N8    $<      `~XɞPɾHD``WxDHP~X! XP^w^w P^wnw0p*VRp-`W @  @Z *( * (`Jnw -V   nw(nw H- ΐ  nwƋ!  @  @   nwqpQp e ^h@  @a   @ @ z$ @NwdqpQ^hTW^wnwnhp `nwnhp d` `d `dP^nnw.`0-ȓjǎdnh nwnhp P0 V^pFp W   L@   ^p(^pJ p& ( ǎp"   pJ^nP^nnn@nn`0nwnhp (0 # @  @b\ @  @   nwqpQp e ^hċ  @  @h` Jnw  x-.   nw jnw  .֋h ΐ  nw ! z@ @  @T` Jnw  d.   nw  Vnw  .8‹T ΐ  nw !| f @  @ B nw6 p! ! ! D.T ΐ  nw ċ! nw @n . v~XɞPɾHDxxWP<~@p: pDpHD DH HDH DLDa    DpL dǎL p $~@ǎ<PPWP8~@p0` pz  ԓ pπ pϐH LH HL LHL .L @   prLa    L pF~@ɞ8PPWH<~@ pD~D ppDD tp  ~@ǎ<HHWH<~@ސ0`\y @D p  @ @Xp (~@Ǟ<HHW`@HP΀~X Xߐ 0p <  W^_W^^8  )<0  !&D T  @0 4(&@ <  D<@  <  <  )<0  !&D T  @0 4(&@  `  .     z" xi8    J     h  Lt8      H  ,8    "  6 (0 p1 1#  6 (0 p1 1#X Bn_6 (0 p1 1# n^6 (0 p1 1#  <  p0K.0 8  p! ! !v` ΐ   !  (.p“~XɎPɮH@``W@~8p!7N@ 61 077 1 0 \΀7    !  .~8@@W8 1BN@ 6A @BB0PA @  B0.88WH0 08~@zr qp7 pϐ  D|D  > 2z? 8 '0~@Ɏ8HHW8 qp1' p 88W8 0 1" @  䎋   pn88WH<~@p p Xߐ 0߀p 0 7 p! ! !.ȓȋ.     ~@Ǟ<HHWP@ΐ ~H 0pN   0 9 p! ! !.ȋ>       | !   0 9 p! ! !L/v      ΀ !  ~Hɞ@PPW@ ~8q qp1' p <">~8@@W8 z1 qpA' p #88W`<@ H ~P Q0^X߀0pW ^pp d0dsd @ @d @ @d@ @@  @g ߔ  pP^P RpS0^PX^P^P^P ^P^P^|P^xP^tP^p z~ǎ@ bx Xt \X X\ X\|  |!  `n` '   ((((Fh((!p""/ W" ! @!(( &!΋>@(@(:l(( & !~*(l( 2!N6         r   b      <         !p      x   d   P   <   (    /'0@  !  7'03 @ .   ! J~ # (*(""p""/`W"           p  z    @       p  zZ     p  z /4z,$/ڋ Xٺp \٨X X\ X\xX X\^ \ ]^ø8 dDd gXhX^X( ^^Xh`   @   `@ p   TFp!W2&onh @ @@ @h @ @@ @d@ @@ @<  @  .@  d@ @X@a  F.Dz(D @ @Ǟh  @ T  Π <0`/ȓ֤0`0`/ֆ(@h8   @Π  0   (4W (4W     p   68Fp!W &on<  " ¡n   m, ~Ǟ j,,,m0008X  Ԇ2,,Fp!W X\A  0 #802,,Fp!W^Q^^p P^p^tP^t^xP^x^|P^|^P^^Q^^P^^Q^^XQ^^0Q^^X~PɞHɾ@<W @(#)wbal.c 4.10 87/05/14 CIO %d PROM Rev: %x CIO %d CODE Rev: %x CIO %d PCA Conf: %x CIO %d :Error - Board Firmware version must be %x or greater. WBCIO: error wbreset %x %x %d L 8 d \ 4 WBCIO: error wbflush %d WBCIO: error wbflush %d CIOerwrit hd!=tl %x %x %x WBCIO: error wbsendxoff %d WBCIO: error wbsendxoff %d WBCIO: error wbsendxon %d WBCIO: error wbsendxon %d WBCIO: error wbsetbrk %d WBCIO: error wbparam %d %x WBCIO: error WBCtest0 %xWBCIO: error WBCtest1WBCIO: error wbresetbrk %d WBCIO: error wbmodem &d WBCIO: error wbmodem &d ""$(#$($($(#$($($($($($($(#$$$%%%P%h%%|%CIOerit case= %x CIOstit case= %x WBCIO: error wbintr &d O.S. messages -- OFF O.S. messages -- ON  2Kn,X `%K0l n v    $&*,:@FJLX^bdpvz|\*    (Bl D\#^#h$##*,6#8#vx##*&+2HJbdp,24Fr  J `     : X   # # 0 x0 0 0 d f     & , r    :@Nd26b0$t000 *  JL\^8&$8@F$6RZ ` b 0  t004:2:j  " $ @0~   n<     !"!4!Z=!\=!d=!"#<$.$4$<$%&&"&(&H&Z&=&=&=&&=&=&=&'#'#'='='=(<(>(?)N)X)^)d)l)v)|*#*#*=*=*=+|0+#+#+0+#+#-`-d-h-l-p-t-x-|---/ /$/(/,/0/4/8/</@/D/H/L/P/T/X/\/`/d/h/l/p/t/x/|/.text,.data,$.bss0pxxTx_confswx&x0x;0x_ctladdrxEx_d_readxRx_x_printfxjx_wb_alxt8x/x_spl5x_StartWBx_sleepx_splxxx_ux_ttinitxx_ttchar0Xx_bcopyxx x_lineswx_spl0xx_wbmodemxxTxx_copyinx_copyoutx_ttiocomxxxpxDx_d_writexx_timeoutxx!x.0`x9x_wbalclrtxHx_BAUD0xXxhXx_wakeupx_sysinfox_signalxrx|0x0x0hx_wbalunit_HeadwallDiag_wbalinit_wbal_cnt_wbal_addr_wb_reset_PROMVersion_CODEVersion_PCAConfig_wbal_tty_WBCommand_intrpInterval_wbalopen_GetHWSwitches_wbalproc_wbalparam_wbalclose_wbalread_wbalwrite_wbalioctl_WBCtest1_WBCtest0_WBWriteChar_wbresetbrk_cio_getchar_cio_putchar_diag_cons_cio_breakchar_WBSetStartStop_WBGetStartStop_wbalintr_ttyflush_timeInterval_wbal_cons_KEYBOARD wbct.o/ 548578240 0 0 100664 16402 ` u ;..text'X)|P .data'X'X'9<4@.bss((x@HP~XP^g^\P^`fng n``n\ΰ pߐP^tP p^pP^l^`^hng p  h 8hnt .h"np & p  *zc3 0 t$0 P 2 . tf`nzc0 0~l v f< < zc1 0^pP^p^tP^t^l P@^l ()^gQ^g^`T^`^\R^\ng~XɎPɮH@xxWX?@H~Pzzspzΰ zspΰ   (  pp< <n< < pߐzc3 0 T   z'xB  0< <=  2 .  ȋJzc2 0 n> z'~@<004< << <Y~PɞHɾ@XXW8  p88WPD~Hzpzspz zsp   p߀<Yzc"!0Y 6&40zc!!0RYzc# 06Y< <~HǞDPPWP?8@~Hzΐ@zspz zsp   <p^ D2,( `  $ P @  ,~Hɞ@ɾ8PPW@~8pzs #p!z zsp  ! p߀ < (" ,&(0$ ,(0,  0Ƌz(0cfcfcFcF4 ~ x p x L~8@@W@~8pzs #p!z zsp  ! p߀ (" ,2< $ ,4cc< T(0 0< << ==44< $==44֋NccƧ  x p x "~8@@W`<@H~P p 'H4X8z"zspzΐ zspΐ  ^\7 0cf16 Pc30c!0p23'W3cF0 &cƀ0 c08^\ ^\t^\ p`^\P)2^\ 6^\$^\ p^\_<^\ ^\^\^\6^\ ^\^\ pr^\b_^\ D^\2^\"^\T^\ ^\^\^\ʋ ^\ ^\^\^\ ^\ h^\V^\D^\4 v^\ ^\ ^\^\ ,^\ ^\^\^\ ^\ ^\^\n^\E@ p  p s  ? p p s 0 0 0sp00 p s Π Π? sps0 0pxx p a^\EB p  p s  ? p p s 0 0 0sp00 p s ΐ ΐ? sps0 0pxx p  ^\+ ^\ ^\^\ ^\E@ p  ps  ? p ps 0 0 0sp00 ps Π Π? sps0 0pxx p a^\EB p  ps  ? p ps 0 0 0sp00 ps ΐ ΐ? sps0 0pxx p  ^\΋ ^\ ^\^\ ^\E@ p  ps  ? p ps 0 0 0sp00 ps Π Π? sps0 0pxx p a^\EB p  ps  ? p ps 0 0 0sp00 ps ΐ ΐ? sps0 0pxx p  ^\&^\ ^\^\^\뚋^\ ^\r^\b^\R^\ >^\,^\ ^\ ^\E@ p  ps  ? p ps 0 0 0sp00 ps Π Π? sps0 0pxx p a:^\EB p  ps  ? p ps 0 0 0sp00 ps ΐ ΐ? sps0 0pxx p  h^\ R^\@^\ q,^\  ǧq P@^X^\@R xx p Xn\ a  ^XR^X ( < (0(*="z,($D   ` ^\ ^\ ^\^\ǧ^\xx p@ a^\B 焋^\ n^\\^\J^\8ǧ^\xx p@ a ^\B 6(tǗ( `c& ^\ ^\^\p^\_(= z,(0$B^\ ,^\ ^\ q^\ N^\ ^\^\ q^\ $   ǧ q *^\x/x! !p,@ aF^\B .PD^X^\DRxx Xn\p a  ^XT^X ( c^\ @  䐋&   n~PɞHɾ@<``W@ 1  (P"@@W0 3! (WP < @~Hcΐ p p߀D p .8"L^L L p(`Ws JL 044= c,  p   (0@ == =44p 0s֔ JL 044= c,  p 83, < <44:@ == =4402sN :>L(4 c, cFcFc c3c!~p(W c0,LR c, v,, c3@L L, c, , c1,L c, , c2,Lf c, ,@ c#,L c, B, c$,L c, , c%,L c, ,h c(,LF c, j,  c),L c, ", c",L c, , c!,Ln c, ,H c&,L& c, J,40"s@ N0L$ 04q4= c,  p  p 0P  (0@ == =44 (7 0(0<1p980 <@  ==< < =' 04 q)4sȔ NL$ 04q4= c,  p ,3  446@ == =44  Z~HɎ@Ǯ<PPWH~Dzp4z $. >$~DHHWH~DzpT4|z $. >$ڂ~DHHW | x Yxsp0 0sp0 0 1 (Y"|s  p4WH~@zpA#zspz0 0zsp0 0 1 (Y cYvc"@c$@YF$c' 2c!*!p""(W"z(0YY~@HHW @(#)wbct.c 4.6 87/05/14 ct %d : cartridge not loaded ct %d : cartridge write protected p \ @  (pHHdP< ct %d : end of cartridge bn=%d ct %d : end of cartridge bn=%d %s on ct %d p"#!! 4 | ","n! !T"n"n"n"n"n"nH'"'"'"'"'"'"'" "(6 8 N t v    b "D F   $2:~     "  ,<r t     H v   , F z < |            .  >  N  j  |            (  8  N  `  r          , < L \ p         ##$$  :$<$d x z     ##$$   $ $6 F ^ p        ##$$  ($*$R f h z |   ##$$  $$$ 4 H Z l       ##$$  $$< P R d f   ##$$  $$  6 H X h ~           " @ B V#X#f$h$v x $$       &#(#6$8$F H n$p$     @ R   ( : f ~       N ` r      $ 6 J \    . r ` b (0 2   " " $4 $6 $%+%+%%%%%&&&&$&&&6 &8 &&&&&''2'@''''''''''''''''((((`(d(h(l(p(t(x((((((((((((((((((((((((((.text'XP.data'X4.bss(_confsw_ctladdr_wbcttab#_d_write-@_spl5:_timeout_sleep_spl0F_printf_splx_u_wakeupP4[_spl6gP_iowait_iodone_clrbuf_lboltu _ksct_kbase_wbctclr$_d_read$%_physio%8&L_wbctinit_wbct_cnt_wbct_addr_wbct_buf_wbctcommand_wbcttimout_wbctopen_wbctclose_wbctcombuf_wbctstrategy_wbctstart_wbctrstrategy_wbctprint_wbctintr_wbctread_wbctphys_wbctwrite_wbctioctlwblp.o/ 548578262 0 0 100664 6439 ` u $.textg .datax X@.bssP<@~Hpޠހ8  `ħ  n LZL L LF ާ B JL@@ާ B  q ~HɎ@Ǯ<PPW@0~:pWr H \ P 8   \ P 8  L*pD2 2& 1 ۋ 2 0 >6 ~ 2 0B @ @ `P/Q@ E΀ 0 4@ @D4 A  @   l.@\@  ,  x l T  B >2 2& 1 @~WH<΀ ~@ p p DpD`  L p D.D`  8  a  ~@ǎ<HHWH<~@p  xn`p DFD`  "p  ap  p  p ~@ǎ<HHWP@<~@sq8lN0 "l0 bl0( F HJ LNF*؆ YF*YFz I KM O : ާ B 6@ާ B Y~@ǎ<PPW0 @  1 3WH < ~@p q p D^ '(( d(D  LD  8D` @  D LD  <D@  (D  D ~@ǎ<HHW @(#)wblp.c 4.4 87/05/14 LP:Error - Board Firmware version must be %x or greater. d\zLP: *** Error - LP Order = %x after interrupt. (Should be 0) LP: *** Error - Return status byte = %x after interrupt. LP: *** Error - StartDMA called while DMA in progressLP: *** Error - About to start DMA, but LP Order is not 0. Order = %x $&* , 0 2 8 J ^ ` ftv|`t v .N(X (*Z\t r t          > t v             0 8 :  J b d  t   *! 6 J" V  6 8  .textg.datax.bssw_confswwww%w0w_ctladdrw:w_d_readwGw_printfw_d_writewTw_uw^ lwkw_spl4wv \w_sleepw_spl0wTwhw_fubytewLw Pw_wakeupw w_copyoutw_copyinw_wblpclr 4w_wblpinit_wblp_lpdt_wblp_lpbuf_wblp_addr_wblp_cnt_PROMVersion_CodeVersion_wblpopen_testOffline_wblpclose_wblpstart_wblpread_wblpwrite_wblpoutput_wblpintr_wblpioctl h35166 s 00001/00001/00124 d D 4.7 87/05/14 16:02:41 build 10 9 c removed old SCCS strings and inserted #ident BB e s 00001/00000/00124 d D 4.6 87/05/08 15:17:22 dc 9 8 c dc - Convert CONST to #define e s 00006/00002/00118 d D 4.5 87/05/08 14:55:48 dc 8 7 c dc - Convert CONST to #define e s 00001/00001/00119 d D 4.4 87/05/07 15:36:25 dc 7 6 c dc - Pass ctime, not &ctime e s 00028/00000/00092 d D 4.3 87/05/07 14:27:21 dc 6 5 c dc - Add headwall clock interactions e s 00041/00000/00051 d D 4.2 87/05/07 14:00:00 dc 5 4 c dc - Add headwall clock interactions e s 00000/00000/00051 d D 4.1 87/04/27 15:13:13 build 4 3 c rolled rev to -r4 /dc e s 00000/00000/00051 d D 3.1 87/04/27 15:13:13 build 3 2 c AUTO NULL DELTA e s 00000/00000/00051 d D 2.1 87/04/27 15:13:13 build 2 1 c AUTO NULL DELTA e s 00051/00000/00000 d D 1.1 87/04/24 07:52:19 dc 1 0 c Placed under source control - dc e u U f b f n t T I 1 D 10 /* " %W% %E% " */ E 10 I 10 #ident " %W% %E% " E 10 I 8 /* * Interfaces for functions specific to the headwall processor. */ E 8 #include #include #include I 9 #include E 9 I 5 #include E 5 D 8 #include "physmem.H" E 8 I 8 #include E 8 /* Return the cflags bits which correspond to the switch settings on the headwall clock board for the diagnostic port. Caller must check for processor == headwall! */ int GetHWSwitches() { char hwbits; char *hwptr; int cflags; hwptr = (char *) (PMHWSwitch + SYSVA); hwbits = *hwptr; cflags = 0; if ( (hwbits & PMHWSw8bit)) cflags |= CS8; else cflags |= CS7; if ( (hwbits & PMHWSwOddPar)) cflags |= PARODD; if (!(hwbits & PMHWSwNoPar)) cflags |= PARENB; switch (hwbits&PMHWSwSpeed) { case PMHWSwSp9600: case PMHWSwSp9600a: cflags |= B9600; break; case PMHWSwSp300: cflags |= B300; break; case PMHWSwSp1200: case PMHWSwSp1200a: cflags |= B1200; break; case PMHWSwSp2400: cflags |= B2400; break; case PMHWSwSp4800: cflags |= B4800; break; case PMHWSwSp19200: cflags |= B19200; break; }; return(cflags); I 5 } /* * Set the clock board's notion of the date / time according * to the time_t passed to this routine. */ HWSetDate (c_time) time_t c_time; { char * y; char * mo; char * d; char * h; char * mi; char * s; int * dummy; y = (char *) (PMHWYM + SYSVA); mo = y + 1; d = y + 2; h = y + 3; mi = y + 4; s = y + 5; D 7 timetoYMDHMS(&c_time, y, mo, d, h, mi, s); E 7 I 7 timetoYMDHMS(c_time, y, mo, d, h, mi, s); E 7 HWClockCommand(HWClockSetDate, 0, 0, &dummy); } I 6 /* * Get the clock board's notion of the date / time , convert it * to unix time, and return this value. */ time_t HWGetDate () { char * y; char * mo; char * d; char * h; char * mi; char * s; int * dummy; HWClockCommand(HWClockGetDate, 0, 0, &dummy); y = (char *) (PMHWYM + SYSVA); mo = y + 1; d = y + 2; h = y + 3; mi = y + 4; s = y + 5; return(YMDHMStotime(y, mo, d, h, mi, s)); } E 6 HWClockCommand(cmdcode, cmdarg, bitlen, result) int cmdcode; int cmdarg; int bitlen; int * result; { cmdcode << bitlen; cmdcode |= cmdarg; D 8 bitlen += 4; E 8 I 8 bitlen += 4; /* include the command code in the total */ E 8 * result = HWSerCmd(cmdcode, bitlen); E 5 } E 1 ~.R..s.askdb.ss.kdbccb.ss.kdbn.cs.MakefileLIBKDB.ah50587 s 00013/00002/00307 d D 4.5 87/04/16 19:36:29 dc 10 9 c dc - Add Bull updates from 03/05/87 e s 00001/00001/00308 d D 4.4 87/04/15 17:40:24 dc 9 8 c dc - changed #include "sys/..." to #include e s 00021/00026/00288 d D 4.3 87/02/22 15:54:19 build 8 7 c switch to args in registers.. e s 00006/00006/00308 d D 4.2 87/02/22 15:39:44 build 7 6 c change r11 to LINK e s 00000/00000/00314 d D 4.1 87/02/20 13:27:16 build 6 5 c rolled rev to -r4 /dc e s 00007/00018/00307 d D 3.2 87/01/26 16:21:37 build 5 4 c add page table changes /dc e s 00000/00000/00325 d D 3.1 87/01/19 09:20:19 build 4 3 c rolled rev to -r3 /dc e s 00000/00000/00325 d D 2.1 87/01/19 09:20:19 build 3 2 c AUTO NULL DELTA e s 00001/00000/00324 d D 1.2 87/01/16 10:12:52 build 2 1 c add ident string /dc e s 00324/00000/00000 d D 1.1 87/01/09 16:51:30 build 1 0 c Placed under source control - dc e u U f b f n t T I 2 D 10 ; "%W% %E%" E 2 I 1 E 10 I 10 ; " %W% %E% " E 10 D 9 #include "sys/ass.h" E 9 I 9 #include E 9 external _exception global _save_reg0,_default_pcb,_debug_pcb,_user_pcb global _user_default,_kdb_default,_kdbflag dsect data align 8 _save_reg0: space 8 _default_pcb: space PCBSZ*4 _debug_pcb: space PCBSZ*4 _stack: space 4096 _stack_bot: _user_pcb: space 4 _user_default: space 4 _kdb_default: space 4 _kdbflag: space 4 timer1_count: word 0 csect code ; ; ; POINTS D'ENTREE DES EXCEPTIONS ; global _i_kcall, _i_align, _i_instr, _i_dbpe_cf, _i_dbpe_ex global _i_page, _i_pviol, _i_check, _i_trap, _i_int, _i_sw0 global _i_pwf, _i_pwon, _i_timer1, _i_timer2, _i_res ; ; align 4 _i_kcall: stored r0,_save_reg0,l movei r0,1 br _save,l _i_align: stored r0,_save_reg0,l movei r0,2 br _save,l _i_instr: stored r0,_save_reg0,l movei r0,3 br _save _i_dbpe_cf: stored r0,_save_reg0,l movei r0,4 br _save _i_dbpe_ex: stored r0,_save_reg0,l movei r0,5 br _save _i_page: stored r0,_save_reg0,l movei r0,6 br _save _i_pviol: stored r0,_save_reg0,l movei r0,7 br _save _i_check: stored r0,_save_reg0,l movei r0,8 br _save _i_trap: stored r0,_save_reg0,l movei r0,9 br _save _i_int: stored r0,_save_reg0,l movei r0,10 br _save _i_sw0: stored r0,_save_reg0,l movei r0,11 br _save _i_pwf: stored r0,_save_reg0,l movei r0,12 br _save _i_pwon: stored r0,_save_reg0,l movei r0,13 br _save _i_timer1: stored r0,_save_reg0,l movei r0,14 br _save _i_timer2: stored r0,_save_reg0,l movei r0,15 br _save _i_res: stored r0,_save_reg0,l laddr r0,15 br _save ; ; ; POINT DE TRAITEMENT COMMUN DES EXCEPTIONS ; ; ; ; align 4 _save: store r0,_kdb_default,l load r1,_kdbflag,l add r1,1 store r1,_kdbflag,l br r1 > 1,save99 store r0,_user_default,l move r0,sr14 store r0,_user_pcb,l laddr r0,_default_pcb,l ; Yes : default PCB br save10 save99: laddr r0,_debug_pcb,l save10: move sr14,r0 loadd r0,_save_reg0,l sus r0,r15 move r2,sr14 ; Get PCB Address load r0,_user_pcb,l br r0 = 1,save43 load r1,r0,TSEG store r1,r2,TSEG load r1,r0,TRAPSW store r1,r2,TRAPSW save43: move r0,sr0 ; Save All Kernel Registers move r1,sr1 stored r0,r2,SREG0 move r0,sr2 move r1,sr3 stored r0,r2,SREG2 move r0,sr4 move r1,sr5 stored r0,r2,SREG4 move r0,sr6 move r1,sr7 stored r0,r2,SREG6 move r0,sr8 move r1,sr9 stored r0,r2,SREG8 move r0,sr10 move r1,sr11 stored r0,r2,SREG10 laddr r0,_kdb_ccb,l move sr11,r0 move r0,sr12 move r1,sr13 stored r0,r2,SREG12 load r0,_user_pcb,l move r1,sr15 stored r0,r2,SREG14 ; ; ; FABRICATION DE LA PILE DE DEFAUT ; ; D 8 laddr r15,_stack_bot,l laddr r14,r15,-72 load r0,_kdb_default,l store r0,r14,PARAM1 ; set exception number load r0,_kdbflag,l E 8 I 8 laddr r14,_stack_bot-72,l ; Set tack pointer load r0,_kdb_default,l ; param1: exception number load r3,_kdbflag,l E 8 movei r1,3 D 8 br r0 > 1,setmode ; mode debug E 8 I 8 br r3 > 1,setmode ; mode debug E 8 sub r1,1 D 8 load r0,r2,SREG0 br r0 <> 1,setmode ; mode kernel E 8 I 8 load r3,r2,SREG0 br r3 <> 1,setmode ; mode kernel E 8 sub r1,1 D 8 load r0,r2,TRAPSW and r0,1 ; mode privilegie br r0 <> 0,setmode E 8 I 8 load r3,r2,TRAPSW and r3,1 ; mode privilegie br r3 <> 0,setmode E 8 sub r1,1 ; mode user setmode: D 8 store r1,r14,PARAM2 load r0,_kdb_default,l br r0 <> 1,nk_call move r1,sr15 loadb r0,r1,-1 store r0,r14,PARAM3 E 8 I 8 load r2,_kdb_default,l ; param3 br r2 <> 1,nk_call move r2,sr15 ; get pc (just past) kcall instruction loadb r2,r2,-1 ; param3: kcall number E 8 nk_call: D 8 br r0 <> 9,ntrap move r0,sr3 store r0,r14,PARAM3 E 8 I 8 br r2 <> 9,ntrap move r2,sr3 E 8 ntrap: D 7 call r11,_exception,l E 7 I 7 call LINK,_exception,l E 7 ; ; ; ON NE REVIENT JAMAIS ICI ; ; ; ; ; POINT DE SORTIE SUR GO ; ; global _kdb_go,_pcb_access,_call_debug _kdb_go: D 5 laddr r1,9,l flush E 5 I 5 movei r0,3 ; Throw out cache and tmt flush ; Implicitly uses r0 E 5 movei r0,0 store r0,_kdbflag,l laddr r2,_default_pcb,l kgb00: move sr14,r2 loadd r0,r2,SREG0 move sr0,r0 move sr1,r1 loadd r0,r2,SREG2 move sr2,r0 move sr3,r1 loadd r0,r2,SREG4 move sr4,r0 move sr5,r1 loadd r0,r2,SREG6 move sr6,r0 move sr7,r1 loadd r0,r2,SREG8 move sr8,r0 move sr9,r1 loadd r0,r2,SREG10 move sr10,r0 move sr11,r1 loadd r0,r2,SREG12 move sr12,r0 move sr13,r1 loadd r0,r2,SREG14 store r0,_user_pcb,l move r1,sr15 lus r0,r15 stored r0,_save_reg0,l move r0,sr0 br r0 <> 1,kret load r0,_user_pcb,l move sr14,r0 loadd r0,_save_reg0,l rum ; ; kret: load r0,_user_pcb,l move sr14,r0 laddr r1,_ccb,l move sr11,r1 loadd r0,_save_reg0,l trapexit ; ; ; ACCES AU PCB ; ; _pcb_access: load r0,_kdbflag,l br r0 > 1,pacc00 laddr r0,_default_pcb,l br pacc10 pacc00: laddr r0,_debug_pcb,l pacc10: D 7 ret r11,r11 E 7 I 7 ret LINK,LINK E 7 _call_debug: trap 1 D 7 ret r11,r11 E 7 I 7 ret LINK,LINK E 7 align 4 global _translate D 5 _translate: load r2,r14,PARAM2 load r3,r14,PARAM1 br r2 <> 0,tr000 move r2,sr9 tr000: trans r0,r2 ret r11,r11 align 4 E 5 global _txt_translate I 5 _translate: E 5 _txt_translate: D 8 load r3,r14,PARAM1 E 8 I 8 move r3,r0 ; Shuffle argument into place E 8 D 5 move r2,sr8 trans r0,r2 E 5 I 5 trans r0,r3 E 5 D 7 ret r11,r11 E 7 I 7 ret LINK,LINK E 7 I 5 E 5 global _kdb_flush align 4 _kdb_flush: D 5 laddr r1,9,l flush E 5 I 5 movei r0,3 ; Flush cache and tmt flush ; Implicitly uses r0 E 5 D 7 ret r11,r11 E 7 I 7 ret LINK,LINK E 7 global _itest align 4 _itest: D 8 load r2,r14,24 laddr r0,0CFH word 4C051000H E 8 I 8 move r2,r0 ; shuffle pointer to result laddr r0,UNMASK ; allow interrupts halfword I_MASK ; implicitly uses r0 E 8 itest r0 D 8 store r1,r2,0 E 8 I 8 ; return Int/Noint in R0 store r1,r2,0 ; save IOIR word (if any) I 10 ret LINK,LINK global _start_loader align 4 _start_loader: move LINK,r0 move r0,r1 move r1,r2 move r2,r3 load r3,r14,STKPARAM4 laddr r5,4b44423eH,l E 10 E 8 D 7 ret r11,r11 E 7 I 7 ret LINK,LINK E 7 E 1 h09888 s 00001/00001/00294 d D 4.2 87/04/16 17:21:54 dc 6 5 c dc - Add Bull updates from 03/05/87 e s 00000/00000/00295 d D 4.1 87/02/20 13:27:19 build 5 4 c rolled rev to -r4 /dc e s 00000/00000/00295 d D 3.1 87/01/19 09:20:22 build 4 3 c rolled rev to -r3 /dc e s 00000/00000/00295 d D 2.1 87/01/19 09:20:22 build 3 2 c AUTO NULL DELTA e s 00001/00000/00294 d D 1.2 87/01/16 10:12:57 build 2 1 c add ident string /dc e s 00294/00000/00000 d D 1.1 87/01/09 16:51:32 build 1 0 c Placed under source control - dc e u U f b f n t T I 2 D 6 ; "%W% %E%" E 6 I 6 ; " %W% %E% " E 6 E 2 I 1 ; ; SPS9 CCB ; global _kdb_ccb dsect data align 8 _kdb_ccb: _kcall0: word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall _exceptions: word _i_align ; alignement error word _i_instr ; invalid instruction word _i_dbpe_cf ; double bit parity error ; ; code fetch word _i_dbpe_ex ; double bit parity error ; ; execute word _i_page ; page fault word _i_pviol ; privilege violation word _i_check ; check instruction word _i_trap ; trap instruction word _i_int ; external interrupt word _i_sw0 ; switch 0 interrupt word _i_pwf ; power off word _i_pwon ; end power glitch word _i_timer1 ; timer 1 interrupt word _i_timer2 ; timer 2 interrupt word _i_res ; reserved vector _data_area: word 0 ; clock ticks while paused word 7fffffffH ; timer 1 count for no int. word 7fffffffH ; timer 2 count for no int. word 0 ; time of day (nanoseconds) word 0 ; time of day (nanoseconds) E 1 h18620 s 00001/00001/02167 d D 4.4 87/05/14 16:03:02 build 12 11 c removed old SCCS strings and inserted #ident BB e s 00148/00076/02020 d D 4.3 87/04/16 17:20:58 dc 11 10 c dc - Add Bull updates from 03/05/87 e s 00000/00004/02096 d D 4.2 87/02/23 18:37:13 build 10 9 c remove debug printouts e s 00000/00000/02100 d D 4.1 87/02/20 13:27:25 build 9 8 c rolled rev to -r4 /dc e s 00015/00029/02085 d D 3.3 87/02/13 13:00:13 build 8 7 c add bull changes from Jan 23 /dc e s 00031/00008/02083 d D 3.2 87/01/26 16:24:27 build 7 6 c add page table changes /dc e s 00000/00000/02091 d D 3.1 87/01/19 09:20:28 build 6 5 c rolled rev to -r3 /dc e s 00000/00000/02091 d D 2.1 87/01/19 09:20:28 build 5 4 c AUTO NULL DELTA e s 00001/00000/02090 d D 1.4 87/01/16 10:13:04 build 4 3 c add ident string /dc e s 00003/00004/02087 d D 1.3 87/01/14 16:43:46 build 3 2 c convert addr[012] references to mem_addr. Fix ext dma to use ptoedma macro. e s 00001/00001/02090 d D 1.2 87/01/14 15:30:17 build 2 1 c change smddcb initializer e s 02091/00000/00000 d D 1.1 87/01/09 16:51:35 build 1 0 c Placed under source control - dc e u U f b f n t T I 4 D 11 /* "%W% %E%" */ E 11 I 11 D 12 /* " %W% %E% " */ E 12 I 12 #ident " %W% %E% " E 12 E 11 E 4 I 1 /* A.A 04/02/86 */ /* debugger for UNIX Kernel */ #include #include I 8 #include E 8 #include typedef unsigned char unchar ; typedef struct { short filler[6]; short pid; } proc; typedef struct { short breakkind; short state; short type; short pid; unchar *offset; unchar instruc[4]; unchar *otheroffset; unchar *permoffset; } breaktableentry; extern uint _last_addr ; extern proc *curproc; extern int ccb[]; extern pcbt *pcb_access(); extern bootdev, rootdev ; extern KEYBOARD; extern diag_cons; int cons_diag; unchar *hlp[] = { " list of commands (all numbers in hexadecimal):\n", " ----------------------------------------------\n", "b [address] - set breakpoint (Phys. Addr.), or list all breakpoints\n", "bv [address] - set breakpoint (Virt. Addr.), or list all breakpoints\n", "bt address - set TEMPORARY breakpoint (Phys. Addr.)\n", "btv address - set TEMPORARY breakpoint (Virt. Addr.)\n", "ca - clear all breakpoints\n", "cb [address] - clear breakpoint (physical addresses)\n", "cv [address] - clear breakpoint (virtual addresses)\n", "d address [count] - display data (physical addresses)\n", "dc address [count] - display code (physical addresses)\n", "dcv address [count] - display code (virtual addresses)\n", "dd dev unit part - dump memory on disk (dev, unit) , partition(part)\n", "dr - display registers\n", "dv address [count] - display data (virtual addresses)\n", "e - exit debugger\n", "g - go to the end of current function\n", "k - kill current process or go to Panic\n", "load - used to reboot from disk (dev, unit)\n", "m address - modify sequential data bytes\n", "s - single step\n", "t address [segno] - virtual to physical address translation\n" }; unchar *strknm[] = { "Integer Overflow\n", "Integer Zero Divide\n", "Real Overflow\n", "Real Underflow\n", "Real Zero Divide\n", I 7 "Inexact Result\n", "Before Trap\n", E 7 }; D 8 struct smdcb dcb[] = { SMD_READ, 0, 0, 0, D 2 0, 0x0F, 0xC0, 0x00, E 2 I 2 D 7 0x000FC000, /* memory address (4 bytes) */ E 7 I 7 0, 0x0F, 0xC0, 0x00, E 7 E 2 0x20, 0x00, 0, 0, 0, 0, 0x02, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x0FD0, 0 } ; E 8 I 8 struct smdcb dcb[1] ; E 8 #define TRUE 1 #define FALSE 0 #define DEVFDLP 0x01000000 #define ECHO 0 #define BS 8 /*ascii backspace*/ #define BELL 7 #define NOECHO 0 #define BLKSIZE 0x1000 /* bloc size for KDB */ #define MAXBUFLEN 256 #define MAXCMDLEN 8 #define DEFAULTCOUNT 16 /* no. of chars displayed if no count */ #define DEFAULTCODECOUNT 1 #define MAXBREAKS 16 /*no. of breaks user can set*/ #define BREAKTABLESIZE 32 /*each perm break may create 2 afterperm breaks*/ #define VIRTUAL 1 #define PHYSICAL 2 D 11 #define LOADERBASE 0x0FC000 E 11 I 11 #define LOADERBASE 0x2FC000 E 11 #define LOADERBSS 0x100000 #define BREAKINSTR1 0x3B /*3B = trap instruction*/ #define BREAKINSTR2 0 /*00 = trap bit #0*/ #define MAXREGINSTRUC 0x7F #define MAXBRANCHINSTRUC 0x9F #define CALLOPCODE 0x93 #define CALLROPCODE 0x53 #define KCALLOPCODE 0x5B #define RETOPCODE 0x57 #define OPBYTE 0 /*used in instruc array*/ #define REGBYTE 1 /*used in instruc array*/ #define EROK 0 /*system call error codes*/ /*debugger errors*/ #define NOTEXT 1 /*found end of line*/ #define EXPECTEDDECIMAL 2 #define NOEXPR 3 /*found delimiter rather than expression*/ #define ILLEGALINSTRUCTION 4 /*error in displayinstr*/ #define NOTFOUND 5 /*error in findbreak*/ #define UNKNOWNCMD 6 #define HALFWORDSIZE 2 #define WORDSIZE 4 #define DUMMY 0 #define ORDINARY 0 #define ITSABRANCH 1 #define CALLRINSTRUC 2 #define RETINSTRUC 3 #define NOTABREAK 0 #define TEMPORARY 1 #define PERMANENT 2 #define SSTEP 4 #define AFTERBRANCH 8 #define AFTERPERMBREAK 16 #define BPSET 1 #define BPRESET 0 #define NOREG 1 #define R1ONLY 2 #define TWOREG 3 #define IMMED 4 #define R2ONLY 5 #define KCALL 6 #define BRANCH 7 #define BRIMED 8 #define CALL 9 #define MAINT 10 #define USMOD 0 #define PVMOD 1 #define KMOD 2 #define DBMOD 3 #define DM_ON 1 #define DC_ON 2 #define STEP_ON 4 #define DV_ON 8 #define DCV_ON 16 breaktableentry breaktable[BREAKTABLESIZE]; int numbreaksset ; int break_pc , break_type; unchar *modestring[] = { "USER ", "PRIVILEGED", "KERNEL ", "DEBUG " }; unchar *Subop[] = { "ELOGR ", "ELOGW ", "", "", "TWRITEC ", "TWRITED ", "FLUSH ", "TRAPEXIT ", "ITEST ", "REGN ", "REGNB ", "VERSION ", "MAINT " }; /*switch on subop on maint instruction*/ char casehs[]= "?? " ; char load[] = "LOAD , " ; char loadb[] = "LOADB , " ; char loadh[] = "LOADH , " ; char loadd[] = "LOADD , " ; char laddr[] = "LADDR , " ; char store[] = "STORE , " ; char storeb[] = "STOREB , " ; char storeh[] = "STOREH , " ; char stored[] = "STORED , " ; struct { unchar *code ; int reg ; } codass[] = { /*00*/ casehs, NOREG, /*01*/ "MOVE , ", TWOREG, /*02*/ "NEG , ", TWOREG, /*03*/ "ADD , ", TWOREG, /*04*/ "SUB , ", TWOREG, /*05*/ "MPY , ", TWOREG, /*06*/ "DIV , ", TWOREG, /*07*/ "REM , ", TWOREG, /*08*/ "NOT , ", TWOREG, /*09*/ "OR , ", TWOREG, /*0A*/ "XOR , ", TWOREG, /*0B*/ "AND , ", TWOREG, /*0C*/ "CBIT , ", TWOREG, /*0D*/ "SBIT , ", TWOREG, /*0E*/ "TBIT , ", TWOREG, /*0F*/ "CHK , ", TWOREG, /*10*/ "NOP ", NOREG, /*11*/ "MOVEI , ", IMMED, /*12*/ casehs, NOREG, /*13*/ "ADDI , ", IMMED, /*14*/ "SUBI , ", IMMED, /*15*/ "MPYI , ", IMMED, /*16*/ casehs, NOREG, /*17*/ casehs, NOREG, /*18*/ "NOTI , ", IMMED, /*19*/ casehs, NOREG, /*1A*/ casehs, NOREG, /*1B*/ "ANDI , ", IMMED, /*1C*/ casehs, NOREG, /*1D*/ casehs, NOREG, /*1E*/ casehs, NOREG, /*1F*/ "CHKI , ", IMMED, /*20*/ "FIXT , ", TWOREG, /*21*/ "FIXR , ", TWOREG, /*22*/ "RNEG , ", TWOREG, /*23*/ "RADD , ", TWOREG, /*24*/ "RSUB , ", TWOREG, /*25*/ "RMPY , ", TWOREG, /*26*/ "RDIV , ", TWOREG, /*27*/ "MAKERD , ", TWOREG, /*28*/ "LCOMP , ", TWOREG, /*29*/ "FLOAT , ", TWOREG, /*2A*/ "RCOMP , ", TWOREG, /*2B*/ casehs, NOREG, /*2C*/ "EADD , ", TWOREG, /*2D*/ "ESUB , ", TWOREG, /*2E*/ "EMPY , ", TWOREG, /*2F*/ "EDIV , ", TWOREG, /*30*/ "DFIXT , ", TWOREG, /*31*/ "DFIXR , ", TWOREG, /*32*/ "DRNEG , ", TWOREG, /*33*/ "DRADD , ", TWOREG, /*34*/ "DRSUB , ", TWOREG, /*35*/ "DRMPY , ", TWOREG, /*36*/ "DRDIV , ", TWOREG, /*37*/ "MAKEDR , ", TWOREG, /*38*/ "DCOMP , ", TWOREG, /*39*/ "DFLOAT , ", TWOREG, /*3A*/ "DRCOMP , ", TWOREG, /*3B*/ "TRAP ", R2ONLY, /*3C*/ casehs, NOREG, /*3D*/ casehs, NOREG, /*3E*/ casehs, NOREG, /*3F*/ casehs, NOREG, /*40*/ "SUS , ", TWOREG, /*41*/ "LUS , ", TWOREG, /*42*/ "RUM , ", NOREG, /*43*/ "LDREGS , ", TWOREG, /*44*/ "TRANS , ", TWOREG, /*45*/ "DIRT , ", TWOREG, /*46*/ "MOVESR , ", TWOREG, /*47*/ "MOVERS , ", TWOREG, /*48*/ casehs, NOREG, /*49*/ casehs, NOREG, /*4A*/ casehs, NOREG, /*4B*/ casehs, NOREG, /*4C*/ "MAINT , ", MAINT , /*4D*/ casehs, NOREG, /*4E*/ "READ , ", TWOREG, /*4F*/ "WRITE , ", TWOREG, /*50*/ "TEST > ", TWOREG, /*51*/ "TEST < ", TWOREG, /*52*/ "TEST = ", TWOREG, /*53*/ "CALLR , ", TWOREG, /*54*/ "TEST > ", IMMED, /*55*/ "TEST < ", IMMED, /*56*/ "TEST = ", IMMED, /*57*/ "RET , ", TWOREG, /*58*/ "TEST <=", TWOREG, /*59*/ "TEST >=", TWOREG, /*5A*/ "TEST !=", TWOREG, /*5B*/ "KCALL ", KCALL, /*5C*/ "TEST <=", IMMED, /*5D*/ "TEST >=", IMMED, /*5E*/ "TEST !=", IMMED, /*5F*/ casehs, NOREG, /*60*/ "LSL , ", TWOREG, /*61*/ "LSR , ", TWOREG, /*62*/ "ASL , ", TWOREG, /*63*/ "ASR , ", TWOREG, /*64*/ "DLSL , ", TWOREG, /*65*/ "DLSR , ", TWOREG, /*66*/ casehs, NOREG, /*67*/ casehs, NOREG, /*68*/ "CSL , ", TWOREG, /*69*/ casehs, NOREG, /*6A*/ "SEB , ", TWOREG, /*6B*/ casehs, NOREG, /*6C*/ casehs, NOREG, /*6D*/ casehs, NOREG, /*6E*/ casehs, NOREG, /*6F*/ casehs, NOREG, /*70*/ "LSLI , ", IMMED, /*71*/ "LSRI , ", IMMED, /*72*/ "ASLI , ", IMMED, /*73*/ "ASRI , ", IMMED, /*74*/ "DLSLI , ", IMMED, /*75*/ "DLSRI , ", IMMED, /*76*/ casehs, NOREG, /*77*/ casehs, NOREG, /*78*/ "CSLI , ", IMMED, /*79*/ casehs, NOREG, /*7A*/ "SEH , ", TWOREG, /*7B*/ casehs, NOREG, /*7C*/ casehs, NOREG, /*7D*/ casehs, NOREG, /*7E*/ casehs, NOREG, /*7F*/ casehs, NOREG, /*80*/ "BR > ", BRANCH, /*81*/ casehs, NOREG, /*82*/ "BR = ", BRANCH, /*83*/ "CALL ", CALL, /*84*/ "BR > ", BRIMED, /*85*/ "BR < ", BRIMED, /*86*/ "BR = ", BRIMED, /*87*/ "LOOP , ", BRIMED, /*88*/ "BR <=", BRANCH, /*89*/ casehs, NOREG, /*8A*/ "BR !=", BRANCH, /*8B*/ "BR ", NOREG, /*8C*/ "BR <=", BRIMED, /*8D*/ "BR >=", BRIMED, /*8E*/ "BR !=", BRIMED, /*8F*/ casehs, NOREG, /*90*/ "BR > ", BRANCH, /*91*/ casehs, NOREG, /*92*/ "BR = ", BRANCH, /*93*/ "CALL ", CALL, /*94*/ "BR > ", BRIMED, /*95*/ "BR < ", BRIMED, /*96*/ "BR = ", BRIMED, /*97*/ "LOOP , ", BRIMED, /*98*/ "BR <=", BRANCH, /*99*/ casehs, NOREG, /*9A*/ "BR !=", BRANCH, /*9B*/ "BR ", NOREG, /*9C*/ "BR <=", BRIMED, /*9D*/ "BR >=", BRIMED, /*9E*/ "BR !=", BRIMED, /*9F*/ casehs, NOREG, /*A0*/ storeb, R1ONLY, /*A1*/ storeb, TWOREG, /*A2*/ storeh, R1ONLY, /*A3*/ storeh, TWOREG, /*A4*/ casehs, NOREG, /*A5*/ casehs, NOREG, /*A6*/ store, R1ONLY, /*A7*/ store, TWOREG, /*A8*/ stored, R1ONLY, /*A9*/ stored, TWOREG, /*AA*/ casehs, NOREG, /*AB*/ casehs, NOREG, /*AC*/ casehs, NOREG, /*AD*/ casehs, NOREG, /*AE*/ casehs, NOREG, /*AF*/ casehs, NOREG, /*B0*/ storeb, R1ONLY, /*B1*/ storeb, TWOREG, /*B2*/ storeh, R1ONLY, /*B3*/ storeh, TWOREG, /*B4*/ casehs, NOREG, /*B5*/ casehs, NOREG, /*B6*/ store, R1ONLY, /*B7*/ store, TWOREG, /*B8*/ stored, R1ONLY, /*B9*/ stored, TWOREG, /*BA*/ casehs, NOREG, /*BB*/ casehs, NOREG, /*BC*/ casehs, NOREG, /*BD*/ casehs, NOREG, /*BE*/ casehs, NOREG, /*BF*/ casehs, NOREG, /*C0*/ loadb, R1ONLY, /*C1*/ loadb, TWOREG, /*C2*/ loadh, R1ONLY, /*C3*/ loadh, TWOREG, /*C4*/ casehs, NOREG, /*C5*/ casehs, NOREG, /*C6*/ load, R1ONLY, /*C7*/ load, TWOREG, /*C8*/ loadd, R1ONLY, /*C9*/ loadd, TWOREG, /*CA*/ casehs, NOREG, /*CB*/ casehs, NOREG, /*CC*/ casehs, NOREG, /*CD*/ casehs, NOREG, /*CE*/ laddr, R1ONLY, /*CF*/ laddr, TWOREG, /*D0*/ loadb, R1ONLY, /*D1*/ loadb, TWOREG, /*D2*/ loadh, R1ONLY, /*D3*/ loadh, TWOREG, /*D4*/ casehs, NOREG, /*D5*/ casehs, NOREG, /*D6*/ load, R1ONLY, /*D7*/ load, TWOREG, /*D8*/ loadd, R1ONLY, /*D9*/ loadd, TWOREG, /*DA*/ casehs, NOREG, /*DB*/ casehs, NOREG, /*DC*/ casehs, NOREG, /*DD*/ casehs, NOREG, /*DE*/ laddr, R1ONLY, /*DF*/ laddr, TWOREG, /*E0*/ loadb, R1ONLY, /*E1*/ loadb, TWOREG, /*E2*/ loadh, R1ONLY, /*E3*/ loadh, TWOREG, /*E4*/ casehs, NOREG, /*E5*/ casehs, NOREG, /*E6*/ load, R1ONLY, /*E7*/ load, TWOREG, /*E8*/ loadd, R1ONLY, /*E9*/ loadd, TWOREG, /*EA*/ casehs, NOREG, /*EB*/ casehs, NOREG, /*EC*/ casehs, NOREG, /*ED*/ casehs, NOREG, /*EE*/ laddr, R1ONLY, /*EF*/ laddr, TWOREG, /*F0*/ loadb, R1ONLY, /*F1*/ loadb, TWOREG, /*F2*/ loadh, R1ONLY, /*F3*/ loadh, TWOREG, /*F4*/ casehs, NOREG, /*F5*/ casehs, NOREG, /*F6*/ load, R1ONLY, /*F7*/ load, TWOREG, /*F8*/ loadd, R1ONLY, /*F9*/ loadd, TWOREG, /*FA*/ casehs, NOREG, /*FB*/ casehs, NOREG, /*FC*/ casehs, NOREG, /*FD*/ casehs, NOREG, /*FE*/ laddr, R1ONLY, /*FF*/ laddr, TWOREG, }; struct { unchar *str; unchar p1, p2, p3, p4 ; } strhdr[] = { "\nDebugger Call\n", 0, 0, 0, 0, "\nInvalid KCALL %d\n", 0, 0, 0, 0, "\nData Alignement Error Address : %8x\n", 3, 0, 0, 0, "\nIllegal Instruction Opcode : %2x R1 : %2d ", 1, 2, 0, 0, "\nParity Error Code Fetch Address : %8x\n", 3, 0, 0, 0, "\nParity Error Execute Address : %8x\n", 3, 0, 0, 0, "\nPage Fault Segment : %4x Address : %8x\n", 2, 3, 0, 0, "\nKernel Violation Opcode : %2x R1 : %2d R2 : %2d\n", 1, 2, 3, 0, "\nCheck Trap R1 : %2d R2 : %2d\n", 2, 3, 0, 0, "\nInvalid Trap # : %d\n", 0, 0, 0, 0, "\nExternal Interrupt Device # : %x\n", 0, 0, 0, 0, "\nSwitch 0 Interrupt\n", 0, 0, 0, 0, "\nPowerfail Warning\n", 0, 0, 0, 0, "\nEnd Power Glitch\n", 0, 0, 0, 0, "\nTimer 1 Interrupt\n", 0, 0, 0, 0, "\nTimer 2 Interrupt\n", 0, 0, 0, 0, "\nReserved Vector Exception\n", 0, 0, 0, 0 }; unchar KDBcmd[] = { 'B', 'C', 'D', 'E', 'G', 'H', 'K', 'M', 'S', 'T', 'L' }; unchar *strvrt = " Virtual " ; unchar *strphs = " Physical" ; unchar *strstp = "Step " ; unchar *strbkp = "Break-Point" ; unchar *KDBdlg[] = { "dump OK\n", "invalid partition\n", "no VTOC area\n", "invalid device\n", "invalid unit\n", "expected count\n", "expected address\n", "breakpoint table is full\n", "KDB> ", "invalid text address\n", "invalid virtual address\n", "invalid text virtual address\n", "invalid command\n", "internal error, attempt to set afterpermbreak break twice\n", "internal error, can't find AFTERBRANCH breakpoint\n", "expected segment number\n", " pc break type\n" }; #define DDOK 0 #define INVPRT 1 #define NOVTOC 2 #define INVDEV 3 #define INVUNT 4 #define INVCNT 5 #define INVADR 6 #define BKTFUL 7 #define PROMPT 8 #define INVTA 9 #define INVVA 10 #define INVTVA 11 #define INVCMD 12 #define INTER0 13 #define INTER1 14 #define EXPSGT 15 #define PCBKTP 16 unchar *KDBwrt[] = { "%x is not an even address\n", " no breakpoint set at %x\n", " physical address = %x \n", "d_write error = %x\n", "IO error %x\n" }; #define ODDADR 0 #define NOBRK 1 #define PHYSAD 2 #define WRITER 3 #define ERRIO 4 int stepmode , restart, v_count, d_count, modeflag, defmode; unchar *v_offset, *d_offset; int BASE = 16 ; /* numeric base used on input */ D 11 int cio_breakchar() { int stat ; register c ; E 11 D 11 d_read(0x100, &stat) ; c = stat & 0xFFFF ; d_read(0x102, &stat) ; if ((stat & 0xFFFF) != c) { c = getchar(NOECHO) ; if ((c & 0x7F) == 0x7F) return(TRUE) ; } return(FALSE) ; } int fdlp_breakchar() { return(FALSE) ; } E 11 int deblank(buff, index, max) unchar buff[]; int *index; int max ; { for (;(*index= 'a') && (ch <= 'z')) ch -= ' ' ; if ((ch >= 'A') && (ch <= 'F')) { if (BASE == 16) { gotanum = TRUE; *value = *value*BASE + ch - '7'; } else return(EXPECTEDDECIMAL); } else { if ((ch >= '0') && (ch <= '9')) { gotanum = TRUE; *value = *value*BASE + ch - '0'; } else break; } } if (!gotanum) return(NOEXPR); return(EROK); } int expr(buff, buffix, max, value) unchar buff[]; int *buffix, max, *value ; /*expr - expression handler on exit, buffix is +1 char after last char parsed. if last char is at end of line, buffix = max + 1 limitations: must be of the form: number [+|-|*|/ number]... can't handle parentheses don't detect arithmetic overflow */ { unchar ch ; int val ; int error ; *value = 0; deblank(buff, buffix, max); if (*buffix >= max) return (NOTEXT); if ((error = number(buff, buffix, max, value)) != EROK) return(error); /*now check for more terms*/ while (TRUE) { deblank(buff, buffix, max); if (*buffix >= max) break ; ch = buff[*buffix]; if (ch == '+') { *buffix += 1; error = number(buff, buffix, max, &val) ; if(error != EROK) break ; *value += val; continue ; } if (ch == '-') { *buffix += 1; error = number(buff, buffix, max, &val) ; if(error != EROK) break ; *value -= val; continue ; } if (ch == '*') { *buffix += 1; error = number(buff, buffix, max, &val) ; if(error != EROK) break ; *value *= val; continue ; } if (ch == '/') { *buffix += 1; error = number(buff, buffix, max, &val) ; if(error != EROK) break ; *value /= val; continue ; } break ; } return(error) ; } int instrucinfo(opcode, length) unchar opcode; int *length; { int instruckind; instruckind = ORDINARY; if (opcode <= MAXREGINSTRUC) { *length = 2; if (opcode == CALLROPCODE) instruckind = CALLRINSTRUC; else if (opcode == RETOPCODE) instruckind = RETINSTRUC; } else { if (opcode <= MAXBRANCHINSTRUC) instruckind = ITSABRANCH; if (opcode & 0x10) *length = 6; else *length = 4; } return (instruckind); } int breakpoints(flag) { /* When debug is entered, the breakpoints are removed from code, so displaying code won't show breakpoint. When debug is exited, the breakpoints are restored. */ register x, y ; int i; unchar *paddr; /* short pid; pid = curproc->pid; */ for (i=0; ipid) return(EROK); */ } return(NOTFOUND); } int addbreakpoint(offset, breakkind, otheroffset, permoffset, type) unchar *offset; int breakkind; unchar *otheroffset; unchar *permoffset; short type; { int bix ; unchar *paddr; /* find empty breaktable entry */ paddr = offset; if ((type == VIRTUAL) && ((paddr = (unchar *)txt_translate(offset)) == (unchar *)-1)) { kdb_dlg(INVTA) ; return(~EROK); } if (findbreaktableentry(&bix) == EROK) { breaktable[bix].offset = offset; breaktable[bix].otheroffset = (unchar *)0; breaktable[bix].permoffset = (unchar *)0; breaktable[bix].type = type; if (type == VIRTUAL) breaktable[bix].pid = curproc->pid; breaktable[bix].instruc[OPBYTE] = *paddr; breaktable[bix].instruc[REGBYTE] = *(paddr+1); breaktable[bix].breakkind = breakkind; breaktable[bix].state = BPRESET; if (breakkind & AFTERBRANCH) breaktable[bix].otheroffset = otheroffset; if (breakkind & AFTERPERMBREAK) breaktable[bix].permoffset = permoffset; } /*found breaktable entry*/ else kdb_dlg(BKTFUL) ; } int deletebreakpoint(i) int i; /* 1. removes trap instruction from code & replaces original opcode 2. removes entry from breaktable */ { unchar *paddr; paddr = breaktable[i].offset; if (breaktable[i].type == VIRTUAL) { /* if (breaktable[i].pid == curproc->pid) { */ paddr = (unchar *)txt_translate(breaktable[i].offset) ; if (paddr == (unchar *)-1) { kdb_dlg(INVTA) ; return ; } /* } else { D 11 printf ("KDB> incorrect pid\n"); E 11 I 11 kdb_printf ("KDB> incorrect pid\n"); E 11 return ; } */ } *paddr = breaktable[i].instruc[OPBYTE]; *(paddr+1) = breaktable[i].instruc[REGBYTE]; breaktable[i].breakkind = NOTABREAK; } int handleaddbreak(offset, kindtoset, otheroffset, permoffset, type) unchar *offset; int kindtoset; unchar *otheroffset; unchar *permoffset; short type; /*resolves details of breakpoints, combines temps, perms, etc at one table entry, making it handle multiple types*/ { int bix, err ; /*if there's no break set here, it's easy*/ if (findbreak(offset, &bix, type, TEMPORARY) != EROK) { addbreakpoint(offset, kindtoset, otheroffset, permoffset, type); return ; } if (kindtoset & SSTEP) breaktable[bix].breakkind |= SSTEP ; if (kindtoset & AFTERBRANCH) { breaktable[bix].breakkind |= AFTERBRANCH; breaktable[bix].otheroffset = otheroffset; } if (kindtoset & PERMANENT) breaktable[bix].breakkind |= PERMANENT; if (kindtoset & AFTERPERMBREAK) { if (breaktable[bix].breakkind & AFTERPERMBREAK) kdb_dlg(INTER0) ; else { breaktable[bix].breakkind |= AFTERPERMBREAK; breaktable[bix].permoffset = permoffset; } } breaktable[bix].state = BPRESET; } int readtarget(offset, length, type) unchar *offset; int length; short type; { int i, addr; unchar *paddr; addr = 0; offset += 2; for (i=0; iregs[*(paddr+1) & 0x0F]; if (instruckind == CALLRINSTRUC) target += (int)offset ; } else { /*single step at ordinary instruction*/ target = (int)offset + length ; /*pass offset in case breakkind is PERMANENT*/ } handleaddbreak(target, breakkind, Offset, offset, type) ; } int handledeletebreak(i) int i; /*handles deleting breakpoints for single stepping & PERMANENT ones*/ { int breakkind , bix ; unchar *offset , *otheroffset , *permoffset ; short type , pid ; breakkind = breaktable[i].breakkind; offset = breaktable[i].offset; otheroffset = breaktable[i].otheroffset; permoffset = breaktable[i].permoffset; type = breaktable[i].type; pid = breaktable[i].pid; if (breakkind & (TEMPORARY | PERMANENT)) numbreaksset--; deletebreakpoint(i); /*first see if this is one of two breakpoints inserted after a branch*/ if (breakkind & AFTERBRANCH) { if (findbreak(otheroffset, &bix, type, TEMPORARY) != EROK) kdb_dlg(INTER1) ; else { breaktable[bix].breakkind &= ~(AFTERBRANCH | AFTERPERMBREAK); if ((breaktable[bix].breakkind & ~(SSTEP)) == NOTABREAK) deletebreakpoint(bix); } } /*it's afterbranch*/ /*now see if this is a PERMANENT breakpoint*/ if (breakkind & PERMANENT) singlestep(offset, AFTERPERMBREAK, type); /*is this an after PERMANENT breakpoint break?*/ if (breakkind & AFTERPERMBREAK) addbreakpoint(permoffset, PERMANENT, DUMMY, DUMMY, type); /*otheroffset, permoffset*/ } int displaybreaktable() { /* dumps out break point table on screen */ int i , foundone ; foundone = FALSE; for (i=0; i < BREAKTABLESIZE; i++) { if (breaktable[i].breakkind != NOTABREAK) { if (!foundone) kdb_dlg(PCBKTP) ; foundone = TRUE; switch (breaktable[i].breakkind & (TEMPORARY | PERMANENT| AFTERPERMBREAK)) { case TEMPORARY : D 11 printf(" %x temporary ", breaktable[i].offset); E 11 I 11 kdb_printf(" %x temporary ", breaktable[i].offset); E 11 break ; case PERMANENT : D 11 printf(" %x permanent ", breaktable[i].offset); E 11 I 11 kdb_printf(" %x permanent ", breaktable[i].offset); E 11 break ; case AFTERPERMBREAK : D 11 printf(" %x perm ", breaktable[i].permoffset); E 11 I 11 kdb_printf(" %x perm ", breaktable[i].permoffset); E 11 break ; } if (breaktable[i].type == PHYSICAL) D 11 printf("%s\n", strphs); E 11 I 11 kdb_printf("%s\n", strphs); E 11 else D 11 printf("%s pid = %d\n", strvrt, breaktable[i].pid); E 11 I 11 kdb_printf("%s pid = %d\n", strvrt, breaktable[i].pid); E 11 } } } int setbreakcmd(buff, buffix, linelen, kindtoset, type) unchar *buff; int *buffix; int linelen; int kindtoset; short type; /*syntax: b [address] or bp [address] sets breakpoint at specified offset in code segment. if no offset specified, the breakpoint table is displayed. */ { unchar *offset; int err; if (expr(buff, buffix, linelen, &offset) != EROK) { /* get offset */ displaybreaktable(); return ; } if ((int)offset & 1) { kdb_wrt(ODDADR, offset) ; return ; } if (numbreaksset >= MAXBREAKS) { kdb_dlg(BKTFUL) ; return ; } numbreaksset++; handleaddbreak(offset, kindtoset, DUMMY /*otheroffset*/, DUMMY /*permoffset*/, type ); } clearallbreaks() { int i; for (i = 0;i < BREAKTABLESIZE;i++) if (breaktable[i].breakkind != NOTABREAK) if (breaktable[i].state == BPRESET) { breaktable[i].breakkind = NOTABREAK; numbreaksset--; } if (numbreaksset) displaybreaktable(); } int clearbreakcmd(buff, buffix, linelen, type) unchar *buff; int *buffix, linelen; short type; /* syntax: c[v] address */ { unchar *offset; int bix, otherbix, err; if (expr(buff, buffix, linelen, &offset) != EROK) { if (break_pc == -1) { kdb_dlg(INVADR) ; return ; } offset = (unchar *)break_pc; type = break_type; } if (findbreak(offset, &bix, type, TEMPORARY) == EROK) { numbreaksset--; deletebreakpoint(bix); } else { /* look for after perm break showing this address */ if (findbreak(offset, &bix, type, PERMANENT) == EROK) { if (breaktable[bix].breakkind & AFTERBRANCH) { if (findbreak(breaktable[bix].otheroffset, &otherbix, type, TEMPORARY) != EROK) kdb_dlg(INTER1) ; else breaktable[otherbix].breakkind &= ~(AFTERBRANCH | AFTERPERMBREAK); } breaktable[bix].breakkind &= ~(AFTERBRANCH | AFTERPERMBREAK); } else kdb_wrt(NOBRK, offset) ; } } int vdumpmem() { int paddr, vaddr, count ; count = v_count; vaddr = (int)v_offset; while ((count != 0) && ((paddr = translate(vaddr, 0)) != -1 )) { d_offset = (unchar *)paddr ; if (((vaddr + count) >> 12) != (vaddr >> 12)) d_count = ((vaddr + 0x1000) & 0xFFFFF000) - vaddr ; else d_count = count; count -= d_count; vaddr += d_count; dumpmem(); } if (count != 0) { modeflag = 0; kdb_dlg(INVVA) ; return ; } v_offset += v_count; } int dumpmem() { int bytesdumped, bytesinline, i, j, done, linedone; unchar data, linearray[16]; done = FALSE; bytesdumped = 0; do { D 11 printf("%8x: ", d_offset); /*write address*/ E 11 I 11 kdb_printf("%8x: ", d_offset); /*write address*/ E 11 linedone = FALSE; bytesinline = 0; do { /*write 16 chars in hex*/ data = *d_offset; D 11 printf("%2x", data); E 11 I 11 kdb_printf("%2x", data); E 11 j = 0 ; if (bytesinline & 1) /*space after 2 bytes*/ j++ ; if (!((bytesinline + 1) & 3)) /*double space after 4 bytes*/ j++ ; if ( j ) blanc(j) ; linearray[bytesinline++] = data; if ((bytesinline + bytesdumped) >= d_count) { linedone = TRUE; done = TRUE; } if (bytesinline == 16) /*put 16 bytes per line*/ linedone = TRUE; if ( breakchar() ) { newline(1) ; return ; } if (linedone) { /*dump ascii chars*/ i = bytesinline ; while(i < 16) { j = 2 ; if (i & 1) j++ ; if (!((i+1) & 3)) j++ ; blanc(j) ; i++ ; } blanc(4); for (i=0; i '~')) data = '.' ; /*if unprintable char, print period*/ putchar(data) ; } newline(1) ; } d_offset++; } while (!linedone); bytesdumped += bytesinline; } while (!done); } int displaycmd(buff, buffix, linelen) unchar *buff; int *buffix, linelen; /*syntax: d address [count] */ { int error; if (modeflag != DM_ON) { if (expr(buff, buffix, linelen, &d_offset) != EROK) { kdb_dlg(INVADR) ; return ; } error = expr(buff, buffix, linelen, &d_count); /*get count*/ if ((error != EROK) && (error != NOTEXT)) { kdb_dlg(INVCNT) ; return ; } if (error == NOTEXT) d_count = DEFAULTCOUNT; modeflag = DM_ON; } dumpmem(); } int vdump(buff, buffix, linelen) unchar *buff; int *buffix, linelen; /*syntax: d address [count] */ { int error; if (modeflag != DV_ON) { if (expr(buff, buffix, linelen, &v_offset) != EROK) { /* get offset */ kdb_dlg(INVADR) ; return ; } error = expr(buff, buffix, linelen, &v_count); /* get count */ if ((error != EROK) && (error != NOTEXT)) { kdb_dlg(INVCNT) ; return ; } if (error == NOTEXT) v_count = DEFAULTCOUNT; modeflag = DV_ON; } vdumpmem(); } int transaddr(buff, buffix, linelen) unchar *buff; int *buffix, linelen; /* syntax: t address [segno] */ { int vaddr, segno, error ; if (expr(buff, buffix, linelen, &vaddr) != EROK) { /* get offset */ invva: kdb_dlg(INVVA) ; return ; } error = expr(buff, buffix, linelen, &segno) ; /*get count*/ if ((error != EROK) && (error != NOTEXT)) { kdb_dlg(EXPSGT) ; return ; } if (error == NOTEXT) segno = 0 ; vaddr = translate(vaddr, segno) ; if (vaddr == -1) goto invva ; kdb_wrt(PHYSAD, vaddr) ; } /*----------------------------------------------*/ /* the next four pages are for displaying code */ /*----------------------------------------------*/ int doreg(regnum) int regnum; { D 11 printf("R%d", regnum); E 11 I 11 kdb_printf("R%d", regnum); E 11 if (regnum < 10) blanc(1) ; } int dispinstr(offset, len, instruc) unchar *offset, /*this is actually pc*/ instruc[6]; int len; { /*form: 1 2 3 4 5 6 123456789012345678901234567890123456789012345678901234567890 offset : hex mnemonc rxx ryy, offset 'ascii ' 8 4-12 8 2 8 2-6 123456789012 12345678 123456 */ int i, opcode, retcode, reg, disp; unchar data , *name , *regdelim; i = instruc[OPBYTE] ; name = codass[i].code ; regdelim = name + 8 ; *regdelim++ = '\0' ; reg = codass[i].reg ; if (*name != '?') retcode = len ; else retcode = 2 ; D 11 printf("%8x: %2x%2x", offset, instruc[0], instruc[1]) ; E 11 I 11 kdb_printf("%8x: %2x%2x", offset, instruc[0], instruc[1]) ; E 11 if (len == HALFWORDSIZE) blanc(9) ; else { D 11 printf("%2x%2x", instruc[2], instruc[3]) ; E 11 I 11 kdb_printf("%2x%2x", instruc[2], instruc[3]) ; E 11 if (len == WORDSIZE) blanc(5) ; else D 11 printf("%2x%2x ", instruc[4], instruc[5]) ; E 11 I 11 kdb_printf("%2x%2x ", instruc[4], instruc[5]) ; E 11 } /*write out instruction mnemonic*/ if (reg != MAINT) /*maintenance later*/ D 11 printf("%s ", name); E 11 I 11 kdb_printf("%s ", name); E 11 switch (reg) { case NOREG: goto b8 ; case R1ONLY: goto b5 ;; case TWOREG: goto b1 ; case IMMED: goto b0 ; case R2ONLY: blanc(5) ; /*skip "r12!="*/ doreg(instruc[1] & 15); break; case KCALL: D 11 printf("%3u ", instruc[1]); /*skip "r12<"*/ E 11 I 11 kdb_printf("%3u ", instruc[1]); /*skip "r12<"*/ E 11 break; case BRANCH: b1: doreg(instruc[1] >> 4); D 11 printf(regdelim); E 11 I 11 kdb_printf(regdelim); E 11 doreg(instruc[1] & 15); break; case BRIMED: b0: doreg(instruc[1] >> 4); i = (instruc[1] & 15); D 11 printf("%s %d", regdelim, i); E 11 I 11 kdb_printf("%s %d", regdelim, i); E 11 if (i < 10) blanc(1) ; break; case CALL: goto b5 ; case MAINT: i = (instruc[1] & 15) ; /*look at r2 field*/ if (i > 12) i = 12 ; D 11 printf(Subop[i]) ; E 11 I 11 kdb_printf(Subop[i]) ; E 11 if (i < 6) goto b5 ; if (i < 9) goto b8 ; if (i > 10) goto b8 ; b5: doreg(instruc[1] >> 4); blanc(5); /*skip "!=r12"*/ break; b8: blanc(8); /*skip "r11!=r12"*/ break; } /*case on regtype*/ if (len == HALFWORDSIZE) blanc(10); /*skip ", displacement"*/ else { /*4-byte or 6-byte instruction that has displacement*/ D 11 printf(", "); E 11 I 11 kdb_printf(", "); E 11 /*get displacement from 2 or 4 bytes of instruction*/ disp = 0; for (i=0; i < (len-2); i++) disp = (disp << 8) + instruc[i+2]; if ((len == 4) && (disp & 0x8000)) disp |= 0xFFFF0000; opcode = instruc[0]; if ((opcode >= 0x80) && (opcode <= 0x9F) || (opcode >= 0xE0)) { /*it"s pc-relative*/ if (disp & 1) /*get rid of low-order bit*/ disp--; disp += (int)offset ; /*write pc-rel displacement*/ } D 11 printf("%8x", disp); /*write absolute displacement*/ E 11 I 11 kdb_printf("%8x", disp); /*write absolute displacement*/ E 11 } /*writing displacement*/ /*now dump ascii chars*/ blanc(4) ; for (i = 0; i '~')) data = '.' ; putchar(data); } newline(1) ; return(retcode) ; } int displayinstruction(offset, mode) unchar **offset; int mode; /*reads code, displays, advances offset*/ { unchar opcode, instruc[6], *paddr; int len, i; if (mode <= PVMOD) { paddr = (unchar *)txt_translate(*offset) ; if (paddr == (unchar *)-1) goto verr; } else paddr = *offset; instruc[0] = *paddr; instrucinfo(instruc[OPBYTE], &len); /*get instruction length*/ for (i = 1 ; i < len ; i++) { /*read the rest of the instruction*/ if (mode <= PVMOD) { paddr = (unchar *)txt_translate(*offset + i) ; if (paddr == (unchar *)-1) goto verr; } else paddr = *offset + i ; instruc[i] = *paddr; } *offset += dispinstr(*offset, len, instruc) ; return(EROK); verr: kdb_dlg(INVTA) ; return(~EROK); } int displaycodecmd(buff, buffix, linelen, mode) unchar *buff; int *buffix, linelen, mode; { /*syntax: dc address [count] */ int i ; if ((modeflag & (DC_ON|DCV_ON)) == 0) { if (expr(buff, buffix, linelen, &d_offset) != EROK) { /* get offset */ kdb_dlg(INVADR) ; return ; } i = expr(buff, buffix, linelen, &d_count); /*get count*/ if ((i != EROK) && (i != NOTEXT)) { kdb_dlg(INVCNT) ; return ; } if (i == NOTEXT) d_count = DEFAULTCODECOUNT; modeflag = (mode < KMOD) ? DCV_ON : DC_ON ; } disp: for (i=1; i<=d_count; i++) { if (displayinstruction(&d_offset, mode) != EROK) { modeflag = 0; break ; } if ( breakchar() ) break ; } } int displayregscmd() { int i; pcbt *ppcb; ppcb = pcb_access(); for (i=0; i<=15; i++) { D 11 printf(" R%2d: %8x", i, ppcb->regs[i]); E 11 I 11 kdb_printf(" R%2d: %8x", i, ppcb->regs[i]); E 11 if ((i & 3) == 3) newline(1) ; } newline(2) ; for (i=0; i<=15; i++) { D 11 printf(" SR%2d: %8x", i, ppcb->sregs[i]); E 11 I 11 kdb_printf(" SR%2d: %8x", i, ppcb->sregs[i]); E 11 if ((i & 3) == 3) newline(1) ; } newline(1) ; } int exitcmd() { break_pc = -1; breakpoints(BPSET); if (KEYBOARD) d_write(DEVFDLP, 0xC3000000); diag_cons = cons_diag; kdb_go(); } int modifycmd(buff, buffix, linelen) unchar *buff; int *buffix, linelen; { /*syntax: m address repeat displays byte at address in data segment. reads a new value. if cr, value remains unchanged. if non-hex char, we're done. until done; */ unchar *offset, inbuff[MAXBUFLEN]; int value, len, err, inbuffix ; if (expr(buff, buffix, linelen, &offset) != EROK) { /* get offset */ kdb_dlg(INVADR) ; return ; } while(TRUE) { /*display offset & char, modify it*/ D 11 printf(" %8x : %2x = ", offset, *offset); E 11 I 11 kdb_printf(" %8x : %2x = ", offset, *offset); E 11 len = kdb_getline(inbuff); if (len) { inbuffix = 0; err = expr(inbuff, &inbuffix, len, &value) ; if (err == EROK) *offset = value & 0xFF ; else if (err != NOTEXT) break ; } /*read a char ok*/ offset++; } I 11 kdb_flush(); E 11 } int singlestepcmd(buff, buffix, linelen) unchar *buff; int *buffix, linelen; /*syntax: s step to next code location. */ { pcbt *ppcb; unchar *pc; ppcb = pcb_access(); pc = (ppcb->sregs[0] == 1) ? ppcb->pc : (unchar *)ppcb->sregs[0]; modeflag = STEP_ON; singlestep(pc, SSTEP); } recon(dev) uint dev ; { uint y ; if (d_read(dev << 24, &y) & 3) return(~EROK) ; if ((y >> 24) != dev) return(~EROK) ; if (y & 0x00C00000) return(~EROK) ; return(EROK) ; } majdcb(addsk, count, addr, dev) uint addsk, count, addr, dev ; { unchar *p ; uint y ; register unsigned error ; D 8 dcb[0].sector = (unchar)addsk ; dcb[0].head = (unchar)(addsk >> 8) ; dcb[0].cyl_low = (unchar)(addsk >> 16) ; dcb[0].cyl_high = (unchar)(addsk >> 24) ; E 8 I 8 D 11 dcb[0].da_r.dsk_addr = (uint)addsk ; E 11 I 11 dcb[0].da_r.adrdsk.sector = (unchar)addsk ; dcb[0].da_r.adrdsk.head = (unchar)(addsk >> 8) ; dcb[0].da_r.adrdsk.cyl_low = (unchar)(addsk >> 16) ; dcb[0].da_r.adrdsk.cyl_high = (unchar)(addsk >> 24) ; E 11 E 8 dcb[0].count1 = (unchar)count ; dcb[0].count0 = (unchar)(count >> 8) ; D 3 dcb[0].addr2 = (unchar)addr ; dcb[0].addr1 = (unchar)(addr >> 8) ; dcb[0].addr0 = (unchar)(addr >> 16) ; E 3 I 3 D 8 dcb[0].mem_addr = (unchar)addr ; E 8 I 8 dcb[0].ma_r.mem_addr = (uint)addr ; E 8 E 3 count -= BLKSIZE ; y = 0 ; while(count) { addr += BLKSIZE ; D 3 dcb[0].header[y++] = (ushort)(addr >> 8) ; E 3 I 3 D 8 dcb[0].header[y] = ptoedma(addr>>12); y++; E 8 I 8 dcb[0].header[y++] = (ushort)(addr >> 8) ; E 8 E 3 count -= BLKSIZE ; } p = (unchar *)dcb ; y = sizeof(struct smdcb) ; while ( y ) { dev -= 0x100 ; y-- ; if (error = d_write(dev + p[y], 0)) { kdb_wrt(WRITER, error) ; return(~EROK) ; } } while(TRUE) { while ( itest(&y) ) ; if ((y >> 24) == (dev >> 24)) break ; } kdb_flush(); if (y & 0xFF00) { kdb_wrt(ERRIO, y) ; return(~EROK) ; } return(EROK) ; } D 7 loadcmd() E 7 I 7 loadcmd(buff, buffix, linelen) unchar *buff ; int *buffix ; int linelen ; E 7 { /* syntax : LOAD */ struct smdcb *q ; int disk_dev, disk_unit, disk_part, dev, y ; unchar *p ; int *p2 ; D 7 disk_dev = bootdev ; disk_unit = (rootdev >> 4) & 3 ; E 7 I 7 BASE = 10 ; if (number(buff, buffix, linelen, &disk_dev) != EROK) { disk_dev = bootdev ; goto lddu ; } if (number(buff, buffix, linelen, &disk_unit) != EROK) lddu: disk_unit = (rootdev >> 4) & 3 ; BASE = 16 ; E 7 if (recon(disk_dev) != EROK) return(EROK) ; y = sizeof(struct smdcb) ; dev = (disk_dev << 24) + ((disk_unit * y) << 8) + (y * 0x100) ; dcb[0].gorder = SMD_READ ; if (majdcb(2, 0x2000, LOADERBASE, dev) != EROK) return(EROK) ; D 11 p = (unchar *)LOADERBASE ; while(*p != CALLOPCODE) { instrucinfo(*p, &y) ; p += y ; } for (y=0; y<3; y++) { *p++ = 0x10 ; /* NOP */ *p++ = 0x00 ; } E 11 p2 = (int *)0 ; *p2++ = *(int *)KDBdlg[PROMPT] ; /* "KDB>" = magic */ *p2++ = disk_dev ; *p2 = disk_unit ; kdb_flush() ; D 11 start_loader(LOADERBASE) ; E 11 I 11 start_loader(LOADERBASE,disk_dev<<24,disk_unit,0,0) ; E 11 } D 11 start_loader(func) int (*func)() ; { (*func)() ; } E 11 dumpcmd(buff, buffix, linelen) unchar *buff ; int *buffix ; int linelen ; { /* syntax : DD address unit partition */ register unsigned nsctpst, nsect, start ; unchar *p ; uint i, j, y, save, dev, disk_dev, disk_unit, disk_part ; register struct vtoc *v ; register struct partition *part ; register struct smd_tab *dtab = (struct smd_tab *)LOADERBASE ; BASE = 10 ; i = INVDEV ; if (number(buff, buffix, linelen, &disk_dev) != EROK) goto prtf ; if ((disk_dev <= 0) || (disk_dev > 31)) goto prtf ; if (recon(disk_dev) != EROK) goto prtf ; if (number(buff, buffix, linelen, &disk_unit) != EROK) goto prtf ; if ((disk_unit < 0) || (disk_unit > 3)) goto prtf ; i = INVPRT ; if (number(buff, buffix, linelen, &disk_part) != EROK) goto prtf ; y = sizeof(struct smdcb) ; dev = (disk_dev << 24) + ((disk_unit * y) << 8) + (y * 0x100) ; dcb[0].gorder = SMD_READ ; if (majdcb(6, 0x2000, LOADERBASE, dev) != EROK) goto retour ; v = (struct vtoc *)LOADERBASE ; if (v->v_sanity != VTOC_SANE) { i = NOVTOC ; goto prtf ; } I 8 if ((disk_part<0)||(disk_part==P_BOOT)||(disk_part==P_FULLDISK)||(disk_part>=v->v_nparts)) goto prtf ; E 8 part = &v->v_part[disk_part] ; D 8 if ((disk_part < 0) || (disk_part >= v->v_nparts)) E 8 I 8 if ((part->p_flag & (V_UNMNT|V_RONLY)) != V_UNMNT) E 8 goto prtf ; D 8 if ((part->p_blockn == 0) || (part->p_flag & (V_UNMNT|V_RONLY))) E 8 I 8 if ((part->p_blockn * BSIZE) < (long)_last_addr) E 8 goto prtf ; dcb[0].gorder = SMD_WRITE ; nsect = v->v_sectors ; nsctpst = v->v_heads * nsect ; start = part->p_start ; dtab->vtoc = v ; y = 0 ; i = 0 ; j = 3 ; p = (unchar *)0 ; while(p < (unchar *)_last_addr) { if (i-- == 0) { i = 63 ; putchar('$') ; if (j-- == 0) { j = 3 ; blanc(1) ; } if (breakchar()) break ; } dtab->nxtbb = ((y/nsctpst) + start) << 16 ; save = y % nsctpst ; dtab->nxtbb += (uint)((save/nsect) << 8) + (uint)(save % nsect); if (majdcb(smdbb(dtab), BLKSIZE, p, dev) != EROK) goto retour ; p += BLKSIZE ; y += 2 ; } i = DDOK ; newline(1) ; prtf: kdb_dlg(i) ; retour: BASE = 16 ; return(EROK) ; } int ci() /*command interpreter - read lines & call command procedures*/ { extern int xsyscall, xdbgcall, panic; int linelen, buffix, cmdlen, i, j, addr ; unchar cmd[MAXCMDLEN], buff[MAXBUFLEN], ch ; pcbt *ppcb; while (TRUE) { D 11 printf(KDBdlg[PROMPT]); E 11 I 11 kdb_printf(KDBdlg[PROMPT]); E 11 linelen = kdb_getline(buff); /*read command line*/ buffix = 0; deblank(buff, &buffix, linelen); if (buffix < linelen) { /*something on line other than blanks or cr*/ modeflag = 0; ch = buff[buffix] ; if ((ch < 'A') || (ch > 'z')) goto errcmd ; if ((ch > 'Z') && (ch < 'a')) goto errcmd ; /*command starts with a letter, now look for end, last alpha*/ cmdlen = 0; while (TRUE) { if ((buffix + cmdlen) > linelen) break ; ch = buff[buffix + cmdlen] ; if ((ch > 'Z') && (ch < 'a')) break ; if ((ch < 'A') && (ch != '!')) break ; if (ch > 'z') break ; cmdlen++ ; } /*now have a command starting with a letter, & address of last alpha*/ /*put in cmd buffer, upshifting as we go*/ for (i=0; i= 'a') && (cmd[i] <= 'z')) cmd[i] -= ' ' ; } else cmd[i] = ' '; } buffix += cmdlen; /*now execute commands. buffix is set to 1 char past of command*/ for (i=0; isregs[0] = (int)&xsyscall; ppcb->regs[0] = 1; ppcb->regs[1] = 0xFF ; break ; case PVMOD : ppcb->pc = &panic; ppcb->sregs[15] = (int)&panic; break ; case KMOD : ppcb->sregs[0] = (int)&xdbgcall; default: break ; } exitcmd(); break ; case 5 : /* 'H' */ for (i=0; iregs[11]; if (numbreaksset < MAXBREAKS) { numbreaksset++; if (defmode == USMOD) i = VIRTUAL ; else i = PHYSICAL ; handleaddbreak(addr, TEMPORARY, DUMMY, DUMMY, i); exitcmd(); } else kdb_dlg(BKTFUL) ; break ; case 3 : /* 'E' */ exitcmd(); break ; case 2 : /* 'D' */ if (cmd[1] == 'C') { /*display code*/ if (cmd[2] == 'V') i = USMOD ; else i = KMOD ; displaycodecmd(buff, &buffix, linelen, i); break ; } if (cmd[1] == 'R') { /*display registers*/ displayregscmd(); break ; } if (cmd[1] == 'V') { vdump(buff, &buffix, linelen); break ; } if (cmd[1] == 'D') { dumpcmd(buff, &buffix, linelen) ; break ; } displaycmd(buff, &buffix, linelen); break ; case 1 : /* 'C' */ if (cmd[1] == 'A') { clearallbreaks(); break ; } if (cmd[1] == 'V') i = VIRTUAL ; else i = PHYSICAL ; clearbreakcmd(buff, &buffix, linelen, i); break ; case 0 : /* 'B' */ j = PERMANENT ; if (cmd[1] == 'T') { /*TEMPORARY break*/ j = TEMPORARY ; cmd[1] = cmd[2] ; } if (cmd[1] == 'V') /*VIRTUAL break*/ i = VIRTUAL ; else i = PHYSICAL ; setbreakcmd(buff, &buffix, linelen, j , i); break ; } } else switch (modeflag) { case 0 : break ; case DM_ON : displaycmd(buff, &buffix, linelen); break ; case DC_ON : i = KMOD ; goto mdcmd ; case DCV_ON : i = USMOD ; mdcmd: displaycodecmd(buff, &buffix, linelen, i); break ; case DV_ON : vdump(buff, &buffix, linelen); break ; default : sscmd: singlestepcmd(buff, &buffix, linelen); exitcmd(); break ; } } } /*commands until eof*/ int writeheader(except, knum) int except; int knum; { pcbt *ppcb; ppcb = pcb_access(); except &= 0x1F ; if (except == 1) { D 11 printf(strhdr[1].str, knum) ; E 11 I 11 kdb_printf(strhdr[1].str, knum) ; E 11 return ; } if (except == 3) { D 11 printf(strhdr[3].str, E 11 I 11 kdb_printf(strhdr[3].str, E 11 ppcb->sregs[strhdr[3].p1], ppcb->sregs[strhdr[3].p2] ) ; if (ppcb->sregs[3] <= 15) D 11 printf("R2 : %2d\n", ppcb->sregs[3]); E 11 I 11 kdb_printf("R2 : %2d\n", ppcb->sregs[3]); E 11 else D 11 printf("Addr2 : %8x\n", ppcb->sregs[3]); E 11 I 11 kdb_printf("Addr2 : %8x\n", ppcb->sregs[3]); E 11 return ; } if (except == 9) { D 7 if (knum < 16) E 7 I 7 D 8 if (knum < 16) { E 8 I 8 if (knum < 16) { E 8 E 7 D 11 printf(strhdr[9].str, knum) ; E 11 I 11 kdb_printf(strhdr[9].str, knum) ; E 11 D 7 else if (knum > 20) E 7 return ; D 7 printf(strknm[knum - 16]) ; E 7 I 7 D 8 } if (knum > 0x25) return ; knum -= 0x16; if (knum > 3) { knum -= 7; if (knum > 4) knum -= 3; E 8 } I 8 if (knum > 25) return ; knum -= 16; if (knum > 5) knum -= 3; E 8 D 11 printf(strknm[knum]) ; E 11 I 11 kdb_printf(strknm[knum]) ; E 11 E 7 return ; } D 11 printf(strhdr[except].str, E 11 I 11 kdb_printf(strhdr[except].str, E 11 ppcb->sregs[strhdr[except].p1], ppcb->sregs[strhdr[except].p2], ppcb->sregs[strhdr[except].p3] ) ; } int exception(except, mode, knum) int except, mode, knum; { extern int kdbflag; int i ; unchar *pc, *str, *str2 ; pcbt *ppcb; short type; cons_diag = diag_cons; diag_cons = 0xFFFFFFFF; breakpoints(BPRESET); if (mode != DBMOD) defmode = mode; type = PHYSICAL; if (mode == USMOD) type = VIRTUAL; restart = 1; ppcb = pcb_access(); if (mode >= KMOD) pc = (unchar *)ppcb->sregs[0]; else pc = ppcb->pc; if ((except == 9) && (knum == 1)) { except = 0; if (mode >= KMOD) ppcb->sregs[0] += 2; else ppcb->pc += 2; } if ((except != 9) || ((except == 9) && (knum != 0))) { writeheader(except, knum) ; if (except == 1) pc -= 2; goto prexc ; } if (findbreak(pc, &i, type, TEMPORARY) != EROK) { writeheader(except, knum) ; prexc: if (mode == USMOD) str = strvrt ; else str = strphs ; D 11 printf ("Mode : %s %s PC : %8x pid = %d\n", E 11 I 11 kdb_printf ("Mode : %s %s PC : %8x pid = %d\n", E 11 modestring[mode], str, pc, curproc->pid); displayregscmd(); displayinstruction(&pc, mode); if ((mode != DBMOD) && (except)) restart = 0; kdbflag = 1; ci(); return ; } if ((breaktable[i].breakkind & ~(AFTERPERMBREAK | AFTERBRANCH)) == 0) { /*don't go into ci if breakpoint is one set after a PERMANENT break*/ handledeletebreak(i); exitcmd(); return ; } if (mode == USMOD) str = strvrt ; else str = strphs ; if (stepmode) str2 = strstp ; else str2 = strbkp ; stepmode = FALSE; D 11 printf ("%s %s Address : %8x pid = %d\n", E 11 I 11 kdb_printf ("%s %s Address : %8x pid = %d\n", E 11 str2, str, pc, curproc->pid); break_pc = (int)pc; break_type = type; displayregscmd(); displayinstruction(&pc, mode); handledeletebreak(i); ci(); } kdb_init() { int i; modeflag = 0; d_count = 0; v_count = 0; d_offset = (unchar *)0; v_offset = (unchar *)0; break_pc = -1; stepmode = FALSE; numbreaksset = 0; for (i=0; i < BREAKTABLESIZE; i++) breaktable[i].breakkind = NOTABREAK; } blanc(i) { while (i--) putchar(' ') ; } newline(i) { while (i--) putchar('\n') ; } kdb_dlg(i) uint i ; { D 11 printf(KDBdlg[PROMPT]) ; printf(KDBdlg[i]) ; E 11 I 11 kdb_printf(KDBdlg[PROMPT]) ; kdb_printf(KDBdlg[i]) ; E 11 } kdb_wrt(i, v) uint i, v ; { D 11 printf(KDBdlg[PROMPT]) ; printf(KDBwrt[i], v) ; E 11 I 11 kdb_printf(KDBdlg[PROMPT]) ; kdb_printf(KDBwrt[i], v) ; } /* * Scaled down version of C Library kdb_printf. * Only %s %u %d (==%u) %o %x %D are recognized. * Used to print diagnostic information * directly on console tty. * Since it is not interrupt driven, * all system activities are pretty much suspended. * Printf should not be used for chit-chat. */ kdb_printf(fmt, x1) { kdb_print(fmt, &x1) ; } kdb_print(fmt, adx) register char *fmt; register unsigned int *adx; { register c; char *s; int count; loop: count = 0; while((c = *fmt++) != '%') { if(c == '\0') return; putchar(c); } c = *fmt++; while (c >= '0' && c <= '9') { count = count * 10 + c - '0'; c = *fmt++; } if(c == 'd' || c == 'u' || c == 'o' || c == 'x') kdb_printn((long)*adx, c=='o'? 8: (c=='x'? 16:10),count); else if(c == 's') { s = (char *)*adx; while(c = *s++) putchar(c); } else if (c == 'c') { putchar((char)*adx); } else if (c == 'D') { kdb_printn(*(long *)adx, 10,count); adx += (sizeof(long) / sizeof(int)) - 1; } adx++; goto loop; } kdb_printn(n, b, count) long n; register b; int count; { register i, nd, c; int flag; int plmax; int t; char d[12]; c = 1; flag = ((n < 0) && (n != 0x80000000)); if (flag) n = (-n); if (b==8) plmax = 11; else if (b==10) plmax = 10; else if (b==16) plmax = 8; if (flag && b==10) { flag = 0; putchar('-'); } for (i=0;i= b) { nd -= b; c = 1; } else c = 0; } d[i] = nd; n = n/b; if ((n==0) && (flag==0)) break; } if (i==plmax) i--; t = i; while (++t < count) putchar('0'); for (;i>=0;i--) { putchar("0123456789ABCDEF"[d[i]]); } E 11 } E 1 h42674 s 00002/00002/00026 d D 4.3 87/04/16 17:11:23 dc 10 9 c dc - Add Bull updates from 03/05/87 e s 00001/00004/00027 d D 4.2 87/02/25 17:53:56 dc 9 8 c remove CFLAGS , and ASFLAGS. Map INCRT to INC e s 00000/00000/00031 d D 4.1 87/02/20 13:30:36 build 8 7 c rolled rev to -r4 /dc e s 00000/00000/00031 d D 3.1 87/01/19 09:20:35 build 7 6 c rolled rev to -r3 /dc e s 00000/00000/00031 d D 2.1 87/01/19 09:20:35 build 6 5 c AUTO NULL DELTA e s 00001/00000/00030 d D 1.5 87/01/16 10:13:15 build 5 4 c add ident string /dc e s 00001/00001/00029 d D 1.4 87/01/14 17:50:14 build 4 3 c remove redundant -c from CFLAGS e s 00008/00000/00022 d D 1.3 87/01/14 15:09:53 build 3 2 c add dependencies for kdbn and askdb e s 00001/00020/00021 d D 1.2 87/01/09 17:00:01 build 2 1 c add sccs control /dc e s 00041/00000/00000 d D 1.1 87/01/09 16:51:29 build 1 0 c Placed under source control - dc e u U f b f n t T I 5 D 10 # "%W% %E%" E 5 I 1 ############################################################### E 10 I 10 # " %W% %E% " E 10 LIBNAME = LIBKDB.a D 9 INCRT = $(SPX)/usr/include D 2 CFLAGS = -O -I$(INCRT) E 2 I 2 D 4 CFLAGS = -c -O -I$(INCRT) E 4 I 4 CFLAGS = -O -I$(INCRT) E 4 E 2 ASFLAGS = -I$(INCRT) D 2 CC = cc -c AS = as E 2 FRC = E 9 I 9 INCRT = $(INC) E 9 CFILES = $(LIBNAME)(kdbn.o) SFILES = $(LIBNAME)(askdb.o) $(LIBNAME)(kdbccb.o) all: $(LIBNAME) .PRECIOUS: $(LIBNAME) $(LIBNAME): $(CFILES) $(SFILES) D 2 # ar rv $@ $? # -rm -f $? E 2 I 3 $(LIBNAME)(kdbn.o):\ $(INCRT)/sys/pcb.h\ $(INCRT)/sys/types.h\ I 10 $(INCRT)/sys/param.h\ E 10 $(INCRT)/sys/smd.h $(LIBNAME)(askdb.o):\ $(INCRT)/sys/ass.h E 3 D 2 .c.a: $(CC) $(CFLAGS) $< ar rv $@ $*.o rm -f $*.o .s.a: $(AS) $(ASFLAGS) $< ar rv $@ $*.o rm -f $*.o .s.o: $(AS) $< E 2 clean: -rm -f *.o clobber: clean -rm -f $(LIBNAME) D 2 FRC: E 2 E 1 28 Tz$ 0Tz( T Tz"  ^Tz  !L4Tz  TT~PɎHǮDXXWH48~@pzrzV6 *  N pq ˎ   ~@ɞ8Ǿ4HHW`?DHP~XpŽ ~   [ \&X\z, \ * ')z(70\8( pǐ \z ( +7~XɎPɮHD``W`HP ~XpzwאנװӀzzfz( \1jfF\z \az  4z(   z ( 0~XɎPɮH``WH<~@pz 'z" !`! " &!@,-ē֋(-ؓ‹-z9-'9z"-vp 5~@Ǟ<HHWP@~Hs>LB֋fLaJ`0.Lzz( 0~HPPW0 0 z"z1   00WP@~@zs>D20xDpzwDz'H1D HBDz'H2Ha zLz'L1҆΋"Lz Hz D~@PPW@~8րpFs s  p`r ! ދ~8@@Wh<@H~P. . !!  X   z*"!!Hq4~X4  (~(ΐ. q.  ~PɞHɾ@<hhWPD~Hrf '0H '0tċ"~HǞDPPWPD~Hrf '0FH '0І "~HǞDPPWXD~Hr '>P\ \ '>T:8 TPTP P~HǞDXXW@~<p. z ~<@@W`DHP~Xr p1(  pנ1, ? ؋'7.\ <'.hڋ'.pʆ.Xp.(W‹4X‹.xjq Pqt.* T.p0P腦 "q  .T p(      !).P(4' (~( . q ~XɞPɾHD``WX<@~Hp ~NNT2ώO\>$'2L T  .N ^~HɎ@Ǯ<XXWP@~Hs p (0 (0΋h r 8l ~Hɞ@PPWH<~@y'. tyX'.p t~@Ǟ<HHW8v88WPT0>D0|D!.D @LDL>HDH  DD,PPW8ȓ X @X688W@~8p `< 4<a <  ~8@@WH<A~@s q aa  q@ D( DDq @@@D<DwDFlDaqDT.Da!'ܓ0D`  ~@ǎ<HHWXD~Hr :@ '>PP '>TゆsT:@P .P0@p`!Tp120 / T: $P$TP.T`(/0~HǞDXXWxDHP~Xp/ ö:@ (>`dZ``(( <` $ (>d d`(( (>h.`@ p`!dpQRP^l /5V / /`  ‹fnh(gN( @hpT1 p  ΰ?FGã'S^pP^t :$pPQ^pS^p ̓ߺmP/X `mP/X&bP/YpbP/Y&!j .t>l 8^tPҧ^tnt(= l :@~XɞPɾHDxxWXD~H: LpTLT'޲Tp$TL0 A( z( R Z( a(,T@L T f2Z(a( F A( ! " z( A!.LHTLba(z(  !T 9TL !0 p.W L0 LT' VLT'vBLT'*b  *H8PRX(@PRPX$p/:t",>  0(J:0MC0NV LT'8΋MRMVLT'NMDLT'nLT'vMAptMV LT'8鮋FM2TN1MMV LT'(X^Zp.WbLT'춋NLT'8.LT'&LT'*PD~Hq 90֋h09@9Dp)X!B9Ep)X!" d/8d/DnP9pPppusp0  bp19(p9,p)X!Bp9-p)X!rp9.!p"Xǁ'8~HǞDPPW`H~PqȆs pp<rX\ @\&"rXX@@ &"\\(\z*X1>p 9 9p10@N\ z/X(4\s XXaz ☓p 9  909Ћ 09N\ z/(4\z \X~PɞH``W0 1  W@~8p΀ q~8@@W8 ȧ~4p ՞q~488W8 ȧ~4p:vp9d~488W@~8q:0p:(~8@@W8ȧT.XT88WH<~@p Ԛ'q%'09q  'q0#d u o x 6o x  )Zs $ǘ ) 2c ΋D )(~@Ǟ<HHW`8@H~P  ˋ ʋ -p.T=^0MV@B 0    @ q!Ŋ|q΀0 Ҳ T/҈qp~PɎHɮ@8``W @(#)kdbn.c 4.4 87/05/14 %s %x temporary %x permanent %x perm %s pid = %d %2x%8x: R%dx|%8x, %s %8x: %2x%2x%2x%2x%2x%2x %3u %s %d R%2d: %8x SR%2d: %8x %8x : %2x = %<$$T$H###X#D#@#,""%%%%%%%%%%%%%%%%%R2 : %2d Addr2 : %8x Mode : %s %s PC : %8x pid = %d %s %s Address : %8x pid = %d 0123456789ABCDEF:P::; ;p;;< <`<<==L===>$>`>>? ?0?p????????@@@ @,:L:H@8@D@P@\@h@t@@@?? LOAD , LOADB , LOADH , LOADD , LADDR , STORE , STOREB , STOREH , STORED , 0@@@@@@@@AAAA(A4A@ALAXAd0ApA|A00A00A000AAAAAAABB BB$B00B<BHBTB`BlBxBBBBBBBBBB0000BCCC C,C8CDCP0000C\ 0ChCtCCCCCCCCCCCDDDD(0D4D@DLDXDdDp00D|0D00000DDDDDD00D0D00000D0EE EE$E0E<EH0ETE`ElExE0E0EE EEEEE0EEFFF 0001100001100000000110000110000000000000000000000000000000000000000000000000000000000000000000000F,F<FTFFFGG<GxGGGHHH,H@HTBCDEGHKMSTLHpH|HHHHHHHHIII0I8IPIlIIIJJ,JDJ`J|JJ list of commands (all numbers in hexadecimal): ---------------------------------------------- b [address] - set breakpoint (Phys. Addr.), or list all breakpoints bv [address] - set breakpoint (Virt. Addr.), or list all breakpoints bt address - set TEMPORARY breakpoint (Phys. Addr.) btv address - set TEMPORARY breakpoint (Virt. Addr.) ca - clear all breakpoints cb [address] - clear breakpoint (physical addresses) cv [address] - clear breakpoint (virtual addresses) d address [count] - display data (physical addresses) dc address [count] - display code (physical addresses) dcv address [count] - display code (virtual addresses) dd dev unit part - dump memory on disk (dev, unit) , partition(part) dr - display registers dv address [count] - display data (virtual addresses) e - exit debugger g - go to the end of current function k - kill current process or go to Panic load - used to reboot from disk (dev, unit) m address - modify sequential data bytes s - single step t address [segno] - virtual to physical address translation Integer Overflow Integer Zero Divide Real Overflow Real Underflow Real Zero Divide Inexact Result Before Trap USER PRIVILEGEDKERNEL DEBUG ELOGR ELOGW TWRITEC TWRITED FLUSH TRAPEXIT ITEST REGN REGNB VERSION MAINT MOVE , NEG , ADD , SUB , MPY , DIV , REM , NOT , OR , XOR , AND , CBIT , SBIT , TBIT , CHK , NOP MOVEI , ADDI , SUBI , MPYI , NOTI , ANDI , CHKI , FIXT , FIXR , RNEG , RADD , RSUB , RMPY , RDIV , MAKERD , LCOMP , FLOAT , RCOMP , EADD , ESUB , EMPY , EDIV , DFIXT , DFIXR , DRNEG , DRADD , DRSUB , DRMPY , DRDIV , MAKEDR , DCOMP , DFLOAT , DRCOMP , TRAP SUS , LUS , RUM , LDREGS , TRANS , DIRT , MOVESR , MOVERS , MAINT , READ , WRITE , TEST > TEST < TEST = CALLR , TEST > TEST < TEST = RET , TEST <=TEST >=TEST !=KCALL TEST <=TEST >=TEST !=LSL , LSR , ASL , ASR , DLSL , DLSR , CSL , SEB , LSLI , LSRI , ASLI , ASRI , DLSLI , DLSRI , CSLI , SEH , BR > BR = CALL BR > BR < BR = LOOP , BR <=BR !=BR BR <=BR >=BR !=BR > BR = CALL BR > BR < BR = LOOP , BR <=BR !=BR BR <=BR >=BR != Debugger Call Invalid KCALL %d Data Alignement Error Address : %8x Illegal Instruction Opcode : %2x R1 : %2d Parity Error Code Fetch Address : %8x Parity Error Execute Address : %8x Page Fault Segment : %4x Address : %8x Kernel Violation Opcode : %2x R1 : %2d R2 : %2d Check Trap R1 : %2d R2 : %2d Invalid Trap # : %d External Interrupt Device # : %x Switch 0 Interrupt Powerfail Warning End Power Glitch Timer 1 Interrupt Timer 2 Interrupt Reserved Vector Exception Virtual PhysicalStep Break-Pointdump OK invalid partition no VTOC area invalid device invalid unit expected count expected address breakpoint table is full KDB> invalid text address invalid virtual address invalid text virtual address invalid command internal error, attempt to set afterpermbreak break twice internal error, can't find AFTERBRANCH breakpoint expected segment number pc break type %x is not an even address no breakpoint set at %x physical address = %x d_write error = %x IO error %x d  nJLd&4Nl    & ( R T b r   p r   &               6 8 F V X   : N b x ~    4 6 > ~     ))))&*(*H J R 4,6,:-<-F.f/r/v/x/12--,,-...."d/f/3 $.&...z2|2..///22 2.-0-R,T,~,21h"FVr&r( h2j2~..///2..23/ /Vf)??@AA B&CnE2VHJJJJJJJ:JHJJJz@KE.HMJMlNnNJE(PrDJRRJ $  H3 S R R !.!h2""""#X#Z#W#W#X#X#X#X#Y#Y## # $ $ $ %2%2%&&&8&N&T&f&&&&'''&'<'B'B'A'B''_'(\(f(p(x(z((_(a(()))))").)6)>)@)L)d))l*)2)/),).)-)))) ))*( *d ****+h , ,4 , -P -r-z .(.,.0.4.8.<.@.D.H.L................//// ///// /$/(/,/0//////////////0000 00000 0$0(0,0004080@0D0H0L0P0T0X0\0`0d0h0l0p0t0x0|01(10181@1H1P1X1`1h1p1x111111111111111122222 2(20282@2H2P2X2`2h2p2x222222222222222233333 3(30383@3H3P3X3`3h3p3x333333333333333344444 4(40484@4H4P4X4`4h4p4x444444444444444455555 5(50585@5H5P5X5`5h5p5x555555555555555566666 6(60686@6H6P6X6`6h6p6x666666666666666677777 7(70787@7H7P7X7`7h7p7x777777777777777788888 8(80888@8H8P8X8`8h8p8x888888888888888899999 9(90989@9H9P9X9`9h9p9x999999999999999999:::: ::::: :(:,:0:4:8.text-W.data- .bssJ_deblankL_getchar_putchar_blanc* _newline*L_number_BASE:@_expr(l+7F4[f8_kdb_dlg*_curprocu8  T_defmode  +_strphs9_strvrt9 _kdb_wrt*t"1;G(_v_countQ[_d_count_dumpmemepzd_vdump_doregX_codass1(_Subop0P`PD_exitcmd_d_write_kdb_go<_recon8_d_read_majdcb_dcb@_itest_loadcmd_bootdev_rootdev_KDBdlg9 _dumpcmdH._smdbb_ci!_KDBcmd9_load0:_panicD_hlp/N&_strhdr9(_strknm0 ['x_restartf0@_kdbflag_strstp9_strbkp9r)_KDBwrt:(|+@,t_casehs0_loadb0_loadh0_loadd0_laddr0_store0_storeb0_storeh1_stored1_kdb_getline_instrucinfo_breakpoints_breaktable_txt_translate_findbreaktableentry_findbreak_addbreakpoint_deletebreakpoint_handleaddbreak_readtarget_singlestep_stepmode_pcb_access_handledeletebreak_numbreaksset_displaybreaktable_kdb_printf_setbreakcmd_clearallbreaks_clearbreakcmd_break_pc_break_type_vdumpmem_v_offset_d_offset_translate_modeflag_breakchar_displaycmd_transaddr_dispinstr_displayinstruction_displaycodecmd_displayregscmd_KEYBOARD_cons_diag_diag_cons_modifycmd_kdb_flush_singlestepcmd_start_loader__last_addr_xsyscall_xdbgcall_writeheader_exception_modestring_kdb_init_kdb_print_kdb_printn askdb.o/ 548578323 0 0 100664 7902 ` u 4(.text . .data,@.bssth \ P D 8 , pttlGh F@G.hDDLLGGXGG`GGhGGpGGxG GFG GhG p0t12X12L10 p! G/")G#JLt FXFF`F F1hF@FQpF`FqxFFFFFFhGAGhFBhFFLt W;W0DWLW LLW#>$PKDB>W*6BNZfr~ TVfrx~$,4:"<"DLV`.text..data.bsstttthtltpt_kdbflagtt_i_kcallt_i_alignt_i_instrt(t 4t_i_page@t_i_pviolLt_i_checkXt_i_trapdt_i_intpt_i_sw0|t_i_pwft_i_pwont+t5t_i_rest_kdb_ccbt_kdb_got?JtKft_ccbtWltbltqtt_itest|t|tSTKPARAM1STKPARAM2STKPARAM3STKPARAM4STKPARAM5PAGE_SHIFTPAGE_LENGTH_DPAGE_LENGTH_WPAGE_LENGTH_HPAGE_LENGTH_BKERNSTACKTIMER1_COUNTTIMER2_COUNTTIMER_PERIOD_exception_save_reg0_default_pcb_debug_pcb_user_pcb_user_default_kdb_default_stack_bottimer1_count_i_dbpe_cf_i_dbpe_ex_i_timer1_i_timer2_pcb_access_call_debug_translate_txt_translate_kdb_flush_start_loaderkdbccb.o/ 548578326 0 0 100664 5025 ` u .text .dataP@.bssPP  $(,048<@DHLPTX\`dhlptx|  $(,048<@DHLPTX\`dhlptx|  $(,048<@DHLPTX\`dhlptx|  $(,048<@DHLPTX\`dhlptx|      $(,048.text.dataP.bssP_kdb_ccbl_i_kcalll_i_alignl_i_instrlll_i_pagel_i_pvioll_i_checkl_i_trapl_i_intl_i_sw0l_i_pwfl_i_pwonl&l0l_i_reslE_exceptions_i_dbpe_cf_i_dbpe_ex_i_timer1_i_timer2_data_area .R..s.paging.ss.trap.ss.low.ss.math.ss.end.ss.copy.ss.cswitch.ss.userio.ss.memscan.ss.misc.ss.ccb.ss.start.ss.Makefiles.ccopy.cs.mapa.cLIB0.ah18600 s 00003/00003/00177 d D 4.8 87/04/16 17:41:51 dc 15 14 c dc - Add Bull updates from 03/05/87 e s 00003/00003/00177 d D 4.7 87/04/15 17:40:42 dc 14 13 c dc - changed #include "sys/..." to #include e s 00001/00001/00179 d D 4.6 87/03/06 14:44:18 dc 13 12 c fix traps wd setting during stacked kernel trap e s 00008/00001/00172 d D 4.5 87/02/24 17:30:55 build 12 11 c fix argument passing near [pv]fault / trap /dc e s 00086/00082/00087 d D 4.4 87/02/23 14:20:29 build 11 10 c add comments /dc e s 00018/00012/00151 d D 4.3 87/02/20 17:07:04 build 10 9 c pass args in r0-r3 e s 00006/00007/00157 d D 4.2 87/02/20 15:42:39 build 9 8 c change r11 to LINK /dc e s 00000/00000/00164 d D 4.1 87/02/20 13:27:34 build 8 7 c rolled rev to -r4 /dc e s 00002/00002/00162 d D 3.4 87/01/28 17:10:58 build 7 6 c fix previous delta e s 00002/00002/00162 d D 3.3 87/01/28 16:27:49 build 6 5 c remove int ovf, div 0 from trap settings e s 00083/00044/00081 d D 3.2 87/01/27 09:49:12 build 5 4 c add page table changes /dc e s 00000/00000/00125 d D 3.1 87/01/19 09:20:37 build 4 3 c rolled rev to -r3 /dc e s 00000/00000/00125 d D 2.1 87/01/19 09:20:37 build 3 2 c AUTO NULL DELTA e s 00001/00000/00124 d D 1.2 87/01/16 10:13:17 build 2 1 c add ident string /dc e s 00124/00000/00000 d D 1.1 87/01/09 15:56:10 build 1 0 c Placed under source control - dc e u U f b f n t T I 2 D 15 ; "%W% %E%" E 15 I 15 ; " %W% %E% " E 15 E 2 I 1 D 14 #include "sys/ass.h" #include "sys/psl.h" #include "sys/trap.h" E 14 I 14 #include #include #include E 14 D 5 external _pfault, _vfault, sysc_ret externd _old_ps,_sys_vrt,_sys_segno E 5 I 5 external _pfault, _vfault D 11 externd _old_ps E 11 I 11 external _trap, trap_ret E 11 E 5 global Xpage I 5 D 11 XXpage: move r0,sr5 trapexit E 5 E 11 I 11 ; Page fault handler. Control is passed here by vectoring through the CCB ; when a page fault occurrs. ; Don't try setting breakpoints in here, since the breakpoint will disturb ; the special regs. ; Input: ; sr1 -1 for translation fault, -2 for protection fault. ; sr3 faulting virtual address ; sr4 previous context (pcb) physical addr (old SR14) ; sr6 current context (pcb) virtual addr (TRANS of SR14) ; sr7 psl (interrupt level, interrupt stack, 'mode') ; sr14 current context (PCB) physical addr ; sr15 pc E 11 Xpage: D 11 ; move sr5,r0 ; move r0,sr0 D 5 ; br r0=1,XXpage ; move r0,sr5 ; trapexit XXpage: ; move r0,sr5 sus r0,r5 E 5 I 5 ; br r0<>1,XXpage E 11 I 11 sus r0,r15 ; save all users registers move r3,sr7 ; get the current psl E 11 E 5 I 5 D 11 ; move r0,sr5 sus r0,r15 E 5 move r3,sr7 E 11 D 15 #ifdef OSDEBUG E 15 I 15 #ifdef KDB E 15 D 5 br r3 = 0,xpa00! call r11,_call_debug,l ; must not occur in supervisor mode E 5 I 5 D 11 move r0,r3 and r0,PS_SV br r0 = 0,xpa00 E 11 I 11 move r0,r3 ; copy psl and r0,PS_SV ; extract priv mode bit br r0 = 0,xpa00 ; proceed if fault was in user mode E 11 D 11 move r0,r3 E 11 I 11 move r0,r3 ; copy psl again E 11 and r0,PS_ITS ; Prevents Page Faults under interrupt level D 11 br r0 <> 0,xpa10 E 11 I 11 br r0 <> 0,xpa10 ; error if running on interrupt stack E 11 D 11 laddr r0,_copy_start,l ; addresses of the system routines E 11 I 11 laddr r0,_copy_start,l ; addresses of the system routines E 11 laddr r1,_copy_end,l ; moving bytes to or from user space D 11 move r2,sr15 ; Page Fault PC br r2 > r1,xpa10 br r2 >= r0,xpa00 E 11 I 11 move r2,sr15 ; Get PC of Page Fault br r2 > r1,xpa10 ; error if PC is beyond end br r2 >= r0,xpa00 ! ; OK if PC is at least start E 11 I 11 ; Get here if we have a page fault in priv mode, but not from the copy routines E 11 xpa10: D 11 move r5,sr3 D 9 call r11,_call_debug,l E 9 I 9 call LINK,_call_debug,l E 11 I 11 move r5,sr3 ; move faulting address call LINK,_call_debug,l ; stop for a moment E 11 E 9 E 5 xpa00: #endif I 5 E 5 D 11 move r4,sr14 E 11 I 11 move r4,sr14 ; Get current physical pcb. E 11 D 9 store r11,r4,REG11 D 5 store r14,r4,REG14 ; saves stack pointers E 5 I 5 stored r14,r4,REG14 ; saves stack pointers E 9 I 9 stored r14,r4,REG14 ; saves stack pointers (and return pc) E 9 E 5 D 11 I 5 br r3 <> 0,xpa08 E 11 I 11 br r3 <> 0,xpa08 ; if any bits on in psl, just push frame ; E 11 E 5 ; switch from user stack to supervisor stack ; D 11 laddr r14,KERNSTACK-PCBSZ,l D 5 movei r3,PS_SV move sr7,r3 ; sets SV bit in PSL laddr r3,_sys_vrt,l move sr12,r3 ; sets system vrt base ... move r3,r14 loadh r2,_sys_segno,l ; system data segment number trans r1,r2 E 5 I 5 movei r2,PS_SV E 11 I 11 laddr r14,KERNSTACK-PCBSZ,l ; setup stack frame movei r2,PS_SV ; get new psl mode bits E 11 move sr7,r2 ; sets SV bit in PSL D 6 laddr r2,0f801H ; - trapsword : enable all traps E 6 I 6 D 7 laddr r2,0c0000001,l ; - trapsword : enable all traps E 7 I 7 laddr r2,0c0000001H,l ; - trapsword : enable all traps E 7 E 6 D 11 move sr10,r2 br xpa09 E 11 I 11 move sr10,r2 ; install traps word br xpa09 ; rejoin the flow ; here if the page fault ocurred in system mode. ; Since we already have a system stack, just push the page fault ; PCB on the stack. E 11 xpa08: D 11 laddr r14,r14,-PCBSZ move r0,sr4 store r0,r4,SREG4 move r0,sr6 move r1,sr7 stored r0,r4,SREG6 E 11 I 11 laddr r14,r14,-PCBSZ ; phase the kernel virtual stack move r0,sr4 ; get previous PCB phys addr store r0,r4,SREG4 ; save in stacked PCB move r0,sr6 ; get pcb virtual address move r1,sr7 ; get psl (again, its still in r3, no?) stored r0,r4,SREG6 ; save pcb virt addr and psl E 11 D 6 laddr r2,0f801H ; - trapsword : enable all traps E 6 I 6 D 7 laddr r2,0c0000001,l ; - trapsword : enable all traps E 7 I 7 laddr r2,0c0000001H,l ; - trapsword : enable all traps E 7 E 6 D 13 store r2,r1,TRAPSW ; and sets privileged mode E 13 I 13 store r2,r4,TRAPSW ; and sets privileged mode E 13 I 11 ; Now, setup to save E 11 xpa09: D 11 trans r1,r14 E 5 E 11 I 11 trans r1,r14 ; get phys addr of pcb E 11 D 15 #ifdef MLDEBUG E 15 I 15 #ifdef KDB E 15 D 11 br r1 >= 0,xpa24 D 9 call r11,_call_debug,l E 9 I 9 call LINK,_call_debug,l E 11 I 11 br r1 >= 0,xpa24 ; make sure this works! call LINK,_call_debug,l ; death if it does not work E 11 E 9 xpa24: #endif D 11 move sr14,r1 move sr4,r4 I 5 E 11 I 11 move sr14,r1 ; set new pcb pointer move sr4,r4 ; save previous phys pcb addr E 11 ; D 11 ; ; system pcb initialisations E 11 I 11 ; system pcb initialisations E 11 ; D 11 E 5 move r4,sr6 E 11 I 11 move r4,sr6 ; get pcb virtual address E 11 move sr6,r14 ; new pcb logical address D 11 E 11 D 5 ; system pcb initialisation: ; and sets privileged mode, movei r5,DATA_FAULT move r2,sr2 move r3,sr9 br r2 = r3,xpa124 movei r5,TEXT_FAULT xpa124: E 5 move r2,sr3 ; virtual address D 5 move r3,sr1 ; fault type : E 5 I 5 move r5,sr1 ; fault type : E 5 ; ; -1 : translation fault ; ; -2 : protection fault D 11 laddr r0,xpa200 D 5 store r0,r1,PC lus r0,r0 movei r0,0 ; old PS = 0 E 5 I 5 ; store r0,r1,PC ; lus r0,r0 move sr15,r0 ;** E 5 rum E 11 I 11 laddr r0,xpa200 ; get system virtual address move sr15,r0 ; set system pc rum ; .. drop through to: E 11 xpa200: D 10 laddr r14,r14,-72 ; link D 5 E 5 store r2,r14,PARAM1 ; virtual address D 5 store r5,r14,PARAM2 store r0,r14,PARAM3 E 5 I 5 store r3,r14,PARAM3 ; old PS E 5 store r4,r14,PARAM4 ; old pcb address if going to "trap" D 5 not r3,r3 store r3,r14,PARAM5 br r3 = 1,xpa10 ; sr1 = -2 : protection fault E 5 I 5 not r5,r5 store r5,r14,PARAM2 br r5 = 1,xpa11 ; sr1 = -2 : protection fault E 10 I 10 ; Setup call to _[vp]fault ; param1 (r0) <== r2 virtual address ; param2 (r1) <== r5 prot/valid ; param3 (r2) <== r3 old ps ; param4 (r3) <== r4 old pcb laddr r14,r14,-72 ; phase the stack move r0,r2 ; param1 virtual address not r1,r5 ; param2 prot/valid fault move r2,r3 ; param3 old ps move r3,r4 ; param4 old pcb pointer I 12 ; The following stores are to save data across the call th [pv]fault. ; The [pv]fault routines take 1 arg: the faulted virtual address. ; If the [pv]fault routines modify the stacked copy of the virtual address, ; then it is possible that later use by _trap will fail. E 12 store r0,r14,STKPARAM1 ; save for use after return store r1,r14,STKPARAM2 ; save for use after return store r2,r14,STKPARAM3 ; save for use after return store r3,r14,STKPARAM4 ; save for use after return br r1 = 1,xpa11 ; if sr1 was -2 : protection fault E 10 E 5 D 9 call r11,_vfault,l E 9 I 9 D 11 call LINK,_vfault,l E 11 I 11 call LINK,_vfault,l ; handle the absent fault E 11 E 9 br xpa15 D 5 xpa10: E 5 I 5 xpa11: E 5 D 9 call r11,_pfault,l E 9 I 9 D 11 call LINK,_pfault,l E 11 I 11 call LINK,_pfault,l ; handle the protection fault E 11 E 9 xpa15: D 11 ; BACK FROM PFAULT or VFAULT E 11 I 11 ; BACK FROM PFAULT or VFAULT (still in system virtual mode) E 11 ; ; R0 = 0 : user error ; R0 < 0 : page read error ; R0 > 0 : page fault resolved by kernel D 5 br r0 > 0,xpa30 E 5 I 5 D 11 br r0 > 0,xpa30! E 5 br r0 < 0,xpa20 E 11 I 11 br r0 > 0,xpa30! ; restart user if page fault resolved br r0 < 0,xpa20 ; Page read error: go deliver bad news E 11 ; user error I 11 laddr r5,xpa02 ; drop into kernel mode to check mode... kcall 255 ; ... at time of fault. br xpa06 ; Fault was in user mode: Go handle this E 11 I 5 D 11 laddr r5,xpa02 kcall 255 br xpa06 E 11 I 11 ; here in kernel mode to see if previous pcb was a system virtual pcb E 11 xpa02: move r0,sr4 ; retreives old pcb load r3,r0,PSL ; retreives old PS D 11 and r3,PS_SV br r3 <> 0,xpa04 E 11 I 11 and r3,PS_SV ; were we in system virtual mode ? br r3 <> 0,xpa04 ; go if we were in system virtual mode. E 11 rum ; user mode memory fault: go to trap D 11 xpa04: E 11 I 11 ; here in kernel mode ... E 11 ; memory fault in system mode : can happen only when accessing user space in ; the copyin, copyout, fubyte, ... routines. In that case returns an error ; to these routines D 11 laddr r1,bad_addr,l E 11 I 11 xpa04: I 12 nop ; trigger analyzer E 12 laddr r1,bad_addr,l ; point to new pc E 11 store r1,r0,PC ; to force return in error routine D 11 br trap_ret,l E 11 I 11 br trap_ret,l ; exit the trap. E 11 I 11 ; Here in system virtual mode if the unresolvable page fault happened in ; user mode. E 11 xpa06: E 5 D 11 laddr r5,SEGFLT D 5 load r2,r14,PARAM5 ; fault type E 5 I 5 D 10 load r2,r14,PARAM2 ; fault type E 10 I 10 load r2,r14,STKPARAM2 ; fault type E 10 E 5 br r2 = 1,xpa25 laddr r5,PROTFLT br xpa25 E 11 I 11 laddr r5,SEGFLT ; Assume segmentation violation load r2,r14,STKPARAM2 ; Get fault type (was arg to vfault) br r2 = 1,xpa25 ; go if SR3 was -2 laddr r5,PROTFLT ; set code to protection violation br xpa25 ; rejoin the error code E 11 I 11 ; Here if the page fault was unresolvable because of read error. E 11 xpa20: D 11 laddr r5,PGRDFLT E 11 I 11 laddr r5,PGRDFLT ; get fault type ; Common code for segmentation and protection violations and page read errors E 11 xpa25: D 10 load r2,r14,PARAM1 store r2,r14,PARAM2 store r5,r14,PARAM1 E 10 I 10 move r0,r5 ; arg 1 to trap: fault type code D 12 load r1,r14,STKPARAM1 ; arg 2 to trap: prot/valid code E 12 I 12 load r1,r14,STKPARAM1 ; arg 2 to trap: faulted virtual addr load r2,r14,STKPARAM3 ; arg 3 to trap: PSL load r3,r14,STKPARAM4 ; arg 4 to trap: register save (PCB) E 12 E 10 D 9 call r11,_trap,l E 9 I 9 D 11 call LINK,_trap,l E 9 xpa30: E 11 I 11 call LINK,_trap,l ; kill or signal the process E 11 ; ; normal return ; D 5 laddr r5,sysc_ret,l E 5 I 5 D 11 laddr r5,trap_ret,l E 5 kcall 255 E 11 I 11 xpa30: laddr r5,trap_ret,l ; place to start in kernel mode kcall 255 ; go run the user ; hopefully, never come back! E 11 E 1 h54265 s 00001/00001/00809 d D 4.13 87/04/30 12:22:57 dc 20 19 c dc - Include BEFORE trap e s 00038/00028/00772 d D 4.12 87/04/28 18:55:15 dc 19 18 c dc - Make trap code converter user lookup table. e s 00001/00001/00799 d D 4.11 87/04/27 13:43:34 dc 18 17 c osdebug ..> kdb e s 00066/00018/00734 d D 4.10 87/04/16 18:13:11 dc 17 16 c dc - Add Bull updates from 03/05/87 e s 00003/00003/00749 d D 4.9 87/04/15 17:41:00 dc 16 15 c dc - changed #include "sys/..." to #include e s 00001/00001/00751 d D 4.8 87/03/12 19:43:58 dc 15 14 c change debug to 0 e s 00004/00005/00748 d D 4.7 87/02/25 11:07:48 build 14 13 c fix comments in trap code adjustment. e s 00228/00349/00525 d D 4.6 87/02/23 16:21:05 build 13 12 c add comments /dc e s 00007/00007/00867 d D 4.5 87/02/23 07:41:30 build 12 11 c convert to uppercase sigframe definitions e s 00023/00011/00851 d D 4.4 87/02/23 07:24:28 build 11 10 c document, and revert to old kcall 254 handler /dc e s 00019/00013/00843 d D 4.3 87/02/20 17:20:55 build 10 9 c pass args in r0-r3 e s 00020/00026/00836 d D 4.2 87/02/20 15:47:11 build 9 8 c change r11 to LINK /dc e s 00000/00000/00862 d D 4.1 87/02/20 13:27:39 build 8 7 c rolled rev to -r4 /dc e s 00003/00003/00859 d D 3.3 87/01/28 16:19:11 build 7 6 c change trap word settings to exclude int ovf, div 0, etc e s 00094/00121/00768 d D 3.2 87/01/27 09:52:23 build 6 5 c add page table changes /dc e s 00000/00000/00889 d D 3.1 87/01/19 09:20:40 build 5 4 c rolled rev to -r3 /dc e s 00000/00000/00889 d D 2.1 87/01/19 09:20:40 build 4 3 c AUTO NULL DELTA e s 00001/00000/00888 d D 1.3 87/01/16 10:13:21 build 3 2 c add ident string /dc e s 00001/00001/00887 d D 1.2 87/01/13 15:47:15 build 2 1 c change debug flag to 0 e s 00888/00000/00000 d D 1.1 87/01/09 15:55:49 build 1 0 c Placed under source control - dc e u U f b f n t T I 3 D 17 ; "%W% %E%" E 17 I 17 ; " %W% %E% " E 17 E 3 I 1 D 16 #include "sys/psl.h" #include "sys/ass.h" #include "sys/trap.h" E 16 I 16 #include #include #include E 16 csect code I 17 #ifdef KDB E 17 align 4 global _xdbgcall _xdbgcall: sus r0,r15 D 6 move r0,sr14 br r0<>1,xd00 move r0,sr5 move sr14,r0 xd00: E 6 I 6 D 13 move r5,sr14 br r5 <> 1,xdb00 move r5,sr5 move sr14,r5 E 13 I 13 move r5,sr14 ; get current phys pcb br r5 <> 1,xdb00 ; continue if there is a pcb move r5,sr5 ; idle: get idle pcb move sr14,r5 ; set that up... E 13 xdb00: E 6 D 13 laddr r5,KDEBUG E 13 I 13 laddr r5,KDEBUG ; trap type E 13 br alltraps I 17 #endif KDB E 17 align 4 global Xsyscall,_xsyscall,syscall _xsyscall: Xsyscall: ; APPELS SYSTEME D 6 sus r0,r6 E 6 I 6 sus r0,r6 ; save all possible input arguments E 6 syscall: D 6 move r4,sr14 store r11,r4,REG11 store r14,r4,REG14 ; saves stack pointers laddr r14,KERNSTACK-PCBSZ,l ; SV stack bottom logical address movei r2,PS_SV E 6 I 6 move r4,sr14 ; get current phys pcb D 9 store r11,r4,REG11 ; save return address store r14,r4,REG14 ; saves user stack pointer E 9 I 9 stored r14,r4,REG14 ; saves user stack ptr and return addr E 9 laddr r14,KERNSTACK-PCBSZ,l ; system pcb virt addr (end u area) movei r2,PS_SV ; new PSL bits (int enable, system mode) E 6 move sr7,r2 ; sets SV bit in psl D 6 laddr r3,_sys_vrt,l move sr12,r3 ; sets system vrt base move r3,r14 loadh r2,_sys_segno,l ; system data segment number trans r1,r2 ; r1 = syst. pcb physical adress E 6 I 6 trans r1,r14 ; r1 = syst. pcb physical adress E 6 D 17 #ifdef MLDEBUG E 17 I 17 #ifdef KDB E 17 D 13 E 13 D 6 br r1 >= 0,asc26 ! call r11,_call_debug,l E 6 I 6 br r1 >= 0,asc26 ! ; Hope that trans works! D 9 call r11,_call_debug,l ; ... error if it fails E 9 I 9 call LINK,_call_debug,l ; ... error if it fails E 9 E 6 asc26: D 13 E 13 #endif D 6 move sr14,r1 E 6 I 6 move sr14,r1 ; Set system pcb pointer E 6 move sr4,r4 ; sr4 = old pcb physical address ; D 13 ; ; system pcb initialisations E 13 I 13 ; system pcb initialisations E 13 ; D 6 laddr r0,asct70 store r0,r1,PC lus r0,r0 rum E 6 I 6 D 7 laddr r0,0F801H ; Set traps word: priv mode, traps on E 7 I 7 laddr r0,0c0000001H,l ; - trapsword : enable all traps E 7 move sr10,r0 ; set traps word laddr r0,asct70 ; where to go in kernel virtual move sr15,r0 ; set new pc rum ; enter kernel virtual E 6 D 13 E 13 I 13 ; here in system virtual mode E 13 asct70: D 6 laddr r14,r14,-72 ; link E 6 I 6 laddr r14,r14,-72 ; Allocate some locals... D 9 call r11,_syscall,l ; call C E 9 I 9 call LINK,_syscall,l ; call C E 9 E 6 D 13 D 6 call r11,_syscall,l E 6 ; BACK FROM "syscall" E 13 D 6 laddr r5,sysc_ret kcall 255 E 6 I 6 laddr r5,sysc_ret ; kernel mode address D 13 kcall 255 ; enter ridge kernel mode E 6 E 13 I 13 kcall 255 ; enter kernel mode E 13 sysc_ret: D 6 move r4,sr14 E 6 D 13 move r2,sr4 ; retreives user pcb E 13 I 13 move r2,sr4 ; get back user pcb physical addr E 13 D 6 move sr14,r2 movei r3,0 load r4,r2,SREG12 ; vrt base and size move sr12,r4 load r11,r2,REG11 load r14,r2,REG14 ; stack pointers laddr r0,_u,l move sr6,r0 move sr7,r3 lus r0,r5 E 6 I 6 move sr14,r2 ; set user pcb D 9 load r11,r2,REG11 ; Get user return address load r14,r2,REG14 ; Get stack pointer E 9 I 9 loadd r14,r2,REG14 ; Get stack pointer and return addr E 9 laddr r0,_u,l ; Point to virt addr of current pcb move sr6,r0 ; Set current pcb virt addr movei r3,0 ; new PSL (int enable, user mode) move sr7,r3 ; Set psl D 13 lus r0,r5 ; Get back all regs not saved by 'c' E 13 I 13 lus r0,r6 ; Get back all regs not saved by 'c' E 13 E 6 rum ; return to user mode D 13 E 13 align 4 global Xkcall D 13 Xkcall: E 13 ; INVALID KCALL D 13 sus r0,r15 laddr r5,KCALLFLT E 13 I 13 Xkcall: sus r0,r15 ; save all user regs laddr r5,KCALLFLT ; set trap type E 13 br alltraps D 13 E 13 D 17 #ifdef OSDEBUG E 17 I 17 #ifdef KDB E 17 XXkcall: XXunused: lus r0,r5 br _i_kcall,l #endif align 4 global Xalign D 13 E 13 Xalign: D 13 ; DATA ALIGNEMENT ERROR sus r0,r15 laddr r5,ALIGNFLT E 13 I 13 ; DATA ALIGNMENT ERROR sus r0,r15 ; save all regs laddr r5,ALIGNFLT ; set trap type E 13 br alltraps D 17 #ifdef OSDEBUG E 17 I 17 #ifdef KDB E 17 XXalign: lus r0,r5 br _i_align,l #endif D 13 E 13 align 4 global Xillinstr D 13 E 13 Xillinstr: D 13 E 13 ; ILLEGAL INSTRUCTION D 13 sus r0,r15 laddr r5,ILLINSTRFLT E 13 I 13 sus r0,r15 ; save all regs laddr r5,ILLINSTRFLT ; set trap type E 13 br alltraps D 17 #ifdef OSDEBUG E 17 I 17 #ifdef KDB E 17 XXillinstr: lus r0,r5 br _i_instr,l #endif D 13 E 13 align 4 global Xfparity D 13 E 13 Xfparity: D 13 E 13 ; DOUBLE BIT PARITY ERROR (code fetch) D 13 sus r0,r15 laddr r5,PARITYFFLT E 13 I 13 sus r0,r15 ; save all regs laddr r5,PARITYFFLT ; set trap type E 13 br alltraps D 17 #ifdef OSDEBUG E 17 I 17 #ifdef KDB E 17 XXfparity: lus r0,r5 br _i_dbpe_cf,l #endif D 13 E 13 align 4 global Xeparity D 13 E 13 Xeparity: D 13 E 13 ; DOUBLE BIT PARITY ERROR (execute) D 13 sus r0,r15 laddr r5,PARITYEFLT E 13 I 13 sus r0,r15 ; save all regs laddr r5,PARITYEFLT ; set trap type E 13 br alltraps D 17 #ifdef OSDEBUG E 17 I 17 #ifdef KDB E 17 XXeparity: lus r0,r5 br _i_dbpe_ex,l #endif D 13 E 13 align 4 global Xkerviol D 13 E 13 Xkerviol: D 13 E 13 ; KERNEL VIOLATION D 13 sus r0,r15 laddr r5,KVIOLFLT E 13 I 13 sus r0,r15 ; save all regs laddr r5,KVIOLFLT ; set trap type E 13 br alltraps D 17 #ifdef OSDEBUG E 17 I 17 #ifdef KDB E 17 XXkerviol: lus r0,r5 br _i_pviol,l #endif D 13 E 13 align 4 global Xcheck D 13 E 13 Xcheck: D 13 E 13 ; CHECK INSTRUCTION TRAP D 13 sus r0,r15 laddr r5,CHKFLT E 13 I 13 sus r0,r15 ; save all regs laddr r5,CHKFLT ; set trap type E 13 br alltraps D 17 #ifdef OSDEBUG E 17 I 17 #ifdef KDB E 17 XXcheck: lus r0,r5 br _i_check,l #endif I 19 ; This table converts trap bit numbers to trap codes ; Index with trap bit delivered by microcode. tbit_to_tcode: byte BPTFLT ; trap 0: breakpoint byte TRAPFLT ; trap 1: trace / breakpoint byte TRAPFLT ; trap 2: trace / breakpoint byte TRAPFLT ; trap 3: trace / breakpoint byte TRAPFLT ; trap 4: trace / breakpoint byte TRAPFLT ; trap 5: trace / breakpoint byte TRAPFLT ; trap 6: trace / breakpoint byte TRAPFLT ; trap 7: trace / breakpoint byte TRAPFLT ; trap 8: trace / breakpoint byte TRAPFLT ; trap 9: trace / breakpoint byte TRAPFLT ; trap 10: trace / breakpoint byte TRAPFLT ; trap 11: trace / breakpoint byte TRAPFLT ; trap 12: trace / breakpoint byte TRAPFLT ; trap 13: trace / breakpoint byte TRAPFLT ; trap 14: trace / breakpoint byte TRAPFLT ; trap 15: trace / breakpoint byte IOVFLFLT ; trap 16: integer overflow byte IZERODIVFLT ; trap 17: integer zero divide byte ROVFLFLT ; trap 18: real overflow byte RUDFLFLT ; trap 19: real underflow byte RZERODIVFLT ; trap 20: real zero divide byte ILLINSTRFLT ; trap 21: not possible ==> illegal instruction byte ILLINSTRFLT ; trap 22: not possible ==> illegal instruction byte INEXRES ; trap 23: inexact result (on R32) byte INEXRES ; trap 24: inexact result (on R3200) D 20 byte ILLINSTRFLT ; trap 25: not possible ==> illegal instruction E 20 I 20 byte BEFORE ; trap 25: invalid or non-supported op E 20 byte ILLINSTRFLT ; trap 26: not possible ==> illegal instruction byte ILLINSTRFLT ; trap 27: not possible ==> illegal instruction byte ILLINSTRFLT ; trap 28: not possible ==> illegal instruction byte ILLINSTRFLT ; trap 29: not possible ==> illegal instruction byte ILLINSTRFLT ; trap 30: not possible ==> illegal instruction byte ILLINSTRFLT ; trap 31: not possible ==> illegal instruction E 19 D 13 E 13 align 4 global Xtrap D 13 E 13 Xtrap: D 13 E 13 ; TRAPSWORD TRAP D 13 sus r0,r15 E 13 I 13 sus r0,r15 ; save all regs E 13 D 19 move r5,sr3 ; no de trap br r5 = 0,Xtrap1 ; trap 0 : breakpoint D 13 sub r5,15 br r5 > 0,Xtrap0 laddr r5,TRAPFLT E 13 I 13 sub r5,15 ; remove 15 (highest TRAP trap number) br r5 > 0,Xtrap0 ; go if trap # is 1-15 laddr r5,TRAPFLT ; trap # was less than 16==> trap instruction E 13 br alltraps Xtrap0: D 13 sub r5,6 E 13 I 13 D 14 sub r5,6 ; now, get trap # -23. (-17 Hex) E 14 I 14 sub r5,6 ; now, get trap # -21. (-15 Hex) E 14 E 13 br r5 <= 4,Xtrap10 ; 1 = Integer Overflow (16H) ; ; 2 = Integer Divide by Zero (17H) ; ; 3 = Real Overflow (18H) ; ; 4 = Real Underflow (19H) D 13 sub r5,6 E 13 I 13 D 14 sub r5,6 ; now, get trap # -29. (-1D Hex) E 14 I 14 sub r5,6 ; now, get trap # -27. (-1B Hex) E 14 E 13 br r5 = 5,Xtrap10 ; 5 = Real Divide by Zero (20H) I 14 ; now, get trap # -30. (-1E Hex) E 14 sub r5,3 ; 6 = Inexact Result (24H) ; ; 7 = Before Trap (25H) I 13 D 14 ; r5 now was trap # -31. (-1F Hex) E 14 I 14 ; r5 now was trap # -30. (-1E Hex) E 14 ; get here with r5 = squeezed down trap number E 13 Xtrap10: D 13 laddr r5,r5,TRAPFLT E 13 I 13 laddr r5,r5,TRAPFLT ; Adjust for base of trap codes E 13 br alltraps I 13 ; Here if we get a trap 0, which is a breakpoint E 13 Xtrap1: D 13 laddr r5,BPTFLT E 13 I 13 laddr r5,BPTFLT ; set trap code E 19 I 19 move r5,sr3 ; get trap number from microcode loadb r5,r5,tbit_to_tcode ; map to trap code E 19 E 13 br alltraps D 17 #ifdef OSDEBUG E 17 I 17 #ifdef KDB E 17 XXtrap: lus r0,r5 br _i_trap,l I 6 #endif E 6 D 13 I 6 E 13 E 6 align 4 global Xinterrupt D 13 E 13 Xinterrupt: D 13 E 13 ; EXTERNAL INTERRUPT D 13 sus r0,r5 laddr r5,EXTERNINT E 13 I 13 sus r0,r6 ; save all temps used by kernel 'c' laddr r5,EXTERNINT ; get interrupt code E 13 br allints D 13 E 13 align 4 global Xswtch0 D 13 E 13 Xswtch0: D 13 E 13 ; SWITCH 0 INTERRUPT D 13 E 13 sus r0,r15 D 13 laddr r5,SWTCH0INT E 13 I 13 laddr r5,SWTCH0INT ; set trap code E 13 br alltraps D 17 #ifdef OSDEBUG E 17 I 17 #ifdef KDB E 17 XXswtch0: lus r0,r5 br _i_sw0,l #endif D 13 E 13 align 4 global Xpwroff D 13 E 13 Xpwroff: D 13 E 13 ; POWER FAIL WARNING D 13 E 13 sus r0,r15 D 13 laddr r5,PWROFF E 13 I 13 laddr r5,PWROFF ; set trap code E 13 br alltraps D 17 #ifdef OSDEBUG E 17 I 17 #ifdef KDB E 17 XXpwroff: lus r0,r5 br _i_pwf,l #endif D 13 E 13 align 4 global Xpwron D 13 E 13 Xpwron: D 13 E 13 ; END POWER GLITCH D 13 E 13 sus r0,r15 D 13 laddr r5,PWRON E 13 I 13 laddr r5,PWRON ; set trap code E 13 br alltraps D 17 #ifdef OSDEBUG E 17 I 17 #ifdef KDB E 17 XXpwron: lus r0,r5 br _i_pwon,l #endif D 13 E 13 align 4 global Xclock,Xcl100 D 13 E 13 Xclock: D 13 E 13 ; TIMER 1 INTERRUPT D 13 sus r0,r5 load r1,_ccb+TIMER1_COUNT,l laddr r1,r1,TIMER_PERIOD ; 20 ms store r1,_ccb+TIMER1_COUNT,l move r0,sr7 and r0,PS_IPL br r0 < HORL_LVL,Xcl100 ; interrupt under mask load r0,_tictac1,l E 13 I 13 sus r0,r6 ; save all temps used by kernel 'c' load r1,_ccb+TIMER1_COUNT,l ; get existing timer laddr r1,r1,TIMER_PERIOD ; reload timer, even if we're late store r1,_ccb+TIMER1_COUNT,l ; set new (possibly shorter) timer move r0,sr7 ; get current PSL and r0,PS_IPL ; see if we're interruptible br r0 < HORL_LVL,Xcl100 ; go if we are ; interrupt under mask, defer the clock tick load r0,_tictac1,l ; note that it happened once more E 13 add r0,1 store r0,_tictac1,l D 13 ldregs r0,r1 rum E 13 I 13 ldregs r0,r1 ; restore only what's been changed rum ; back to whatever was going on E 13 Xcl100: D 13 laddr r5,TIMER1INT E 13 I 13 laddr r5,TIMER1INT ; set interrupt code E 13 br allints D 13 E 13 align 4 global Xcallout D 13 E 13 Xcallout: D 13 E 13 ; TIMER 2 INTERRUPT D 13 E 13 sus r0,r1 D 13 laddr r0,7fffffffH,l E 13 I 13 laddr r0,7fffffffH,l ; shut off timer2 E 13 store r0,_ccb+TIMER2_COUNT,l ; long time ldregs r0,r1 rum D 13 E 13 align 4 global Xres D 13 E 13 Xres: D 13 E 13 ; RESERVED EXCEPTION VECTOR D 13 E 13 sus r0,r15 D 13 laddr r5,RESFLT E 13 I 13 laddr r5,RESFLT ; get trap code E 13 br alltraps D 17 #ifdef OSDEBUG E 17 I 17 #ifdef KDB E 17 XXres: lus r0,r5 br _i_res,l #endif D 13 E 13 external _trap,_syscall D 6 externd _sys_vrt,_sys_segno global sysc_ret E 6 I 6 global trap_ret E 6 global alltraps D 13 E 13 alltraps: D 13 E 13 ; EXCEPTIONS COMMON CODE D 13 move r3,sr7 E 13 I 13 ; Input ; All registers saved in current context PCB ; r5 trap code move r3,sr7 ; get current PSL E 13 D 18 #ifdef OSDEBUG E 18 I 18 #ifdef KDB E 18 D 13 move r0,sr0 br r0 <> 1,allt870 ; trap in kernel mode load r0,__debug,l movei r1,1 E 13 I 13 move r0,sr0 ; get 1 (if user) or kernel pc br r0 <> 1,allt870 ; trap in kernel mode, die load r0,__debug,l ; get debug setting movei r1,1 ; replace 1 in sr0 E 13 move sr0,r1 D 13 br r0 <> 0,allt870 move r0,r3 andi r0,8 br r0 = 0,allt880 E 13 I 13 br r0 <> 0,allt870 ; die if debug is on move r0,r3 ; get copy of psl andi r0,PS_SV ; extract system mode bit br r0 = 0,allt880 ; ok if not in system mode E 13 allt870: ; ; rappel de kdb I 13 ; trap in kernel mode, or user mode with debug enabled, or virtual mode ; without debug but in system mode. E 13 ; D 13 lsli r5,2 laddr r5,r5,allt875 ret r5,r5 E 13 I 13 lsli r5,2 ; turn trap code into index laddr r5,r5,allt875 ; aim at dispatch table ret r5,r5 ; go there E 13 allt875: br XXunused br XXkcall br XXalign br XXillinstr br XXfparity br XXeparity br XXunused br XXunused br XXunused br XXkerviol br XXcheck br XXtrap br XXtrap br XXtrap br XXtrap br XXtrap br XXtrap br XXtrap br XXtrap br XXtrap br XXtrap br XXunused br XXswtch0 br XXpwroff br XXpwron br XXunused br XXunused br XXres allt880: #endif D 13 move r4,sr14 E 13 I 13 move r4,sr14 ; get current PCB context pointer E 13 I 6 D 9 store r11,r4,REG11 ; saves return address stored r14,r4,REG14 ; saves stack pointers E 9 I 9 stored r14,r4,REG14 ; saves stack ptr and return address E 9 D 13 E 13 E 6 move r2,sr0 ; saves special registers values move r3,sr1 ; set according to the exception type: stored r2,r4,SREG0 ; SR0 , SR1 move r2,sr2 move r3,sr3 stored r2,r4,SREG2 ; SR2 , SR3 move r3,sr7 ; picks up psl D 13 move r2,r3 E 13 I 13 move r2,r3 ; copy psl E 13 and r2,PS_SV ; already in SV mode ? D 13 br r2 <> 0,all10 E 13 I 13 br r2 <> 0,all10 ; go if trap is in SV mode E 13 ; ; if no : switch from user stack ; ; to supervisor stack D 6 laddr r14,KERNSTACK,l ; SV stack bottom logical address E 6 I 6 laddr r14,KERNSTACK-PCBSZ,l ; SV stack bottom logical address E 6 D 13 movei r0,PS_SV move r2,r3 or r2,r0 E 13 I 13 movei r0,PS_SV ; set SV mode move r2,r3 ; copy existing PSL or r2,r0 ; add SV E 13 move sr7,r2 ; sets SV bit in psl D 6 laddr r0,_sys_vrt,l move sr12,r0 ; sets system vrt base br all12 E 6 I 6 D 13 br all13 E 13 I 13 br all13 ; rejoin system mode trap E 13 E 6 I 13 ; here if trap happens in SV mode E 13 all10: D 13 move r2,sr4 E 13 I 13 move r2,sr4 ; get previous context physical PCB E 13 store r2,r4,SREG4 ; saves old pcb physical address D 13 move r0,sr6 E 13 I 13 move r0,sr6 ; get current PCB virtual addr E 13 move r1,sr7 ; picks up psl stored r0,r4,SREG6 ; saves pcb logical address D 13 all12: E 13 D 6 laddr r2,r14,-PCBSZ ; reserves syst. pcb on supervisor stack move r14,r2 loadh r1,_sys_segno,l ; system data segment number trans r0,r1 ; r1 = syst. pcb physical adress E 6 I 6 laddr r14,r14,-PCBSZ ; reserves syst. pcb on supervisor stack I 13 ; here after trap in either user or SV mode has stacked context. E 13 all13: trans r0,r14 ; r1 = syst. pcb physical adress E 6 D 13 E 13 #ifdef MLDEBUG D 13 br r0 >= 0,all26 D 9 call r11,_call_debug,l E 9 I 9 call LINK,_call_debug,l E 13 I 13 br r0 >= 0,all26 ! ; insist on this operation call LINK,_call_debug,l ; death if it does not E 13 E 9 all26: D 13 E 13 #endif D 13 move sr14,r0 E 13 I 13 move sr14,r0 ; set new PCB phys addr E 13 move sr4,r4 ; sr4 = old pcb physical address ; D 13 ; ; system pcb initialisations E 13 I 13 ; system pcb initialisations E 13 ; D 13 E 13 D 6 br r3 = 0,all27 ! storeh r1,r0,DSEG ; - system data segment number storeh r1,r0,TSEG ; - system code segment number laddr r2,0f801H ; - trapsword : enable all traps E 6 I 6 D 7 laddr r2,0F801H ; - trapsword : enable all traps E 7 I 7 laddr r2,0c0000001H,l ; - trapsword : enable all traps E 7 D 13 move sr10,r2 E 6 store r2,r0,TRAPSW ; and sets privileged mode D 6 all27: E 6 move r2,sr6 move sr6,r14 ; syst. pcb logical address E 13 I 13 move sr10,r2 ; set new traps word store r2,r0,TRAPSW ; save in PCB (its not saved by SUS) move r2,sr6 ; get previous PCB virtual address move sr6,r14 ; set new syst. pcb logical address E 13 D 6 allt99: laddr r1,allt70,l store r1,r0,PC lus r0,r0 E 6 I 6 D 13 laddr r1,allt70 ; store r1,r0,PC ; lus r0,r0 move sr15,r1 ;** E 6 rum E 13 I 13 laddr r1,allt70 ; system virtual address of handler move sr15,r1 ; set system virtual pc rum ; ...drop through to: E 13 allt70: laddr r14,r14,-72 ; link D 13 E 13 D 10 store r5,r14,PARAM1 ; exception type movei r1,0 store r1,r14,PARAM2 ; code : only used for page faults store r3,r14,PARAM3 ; old psl store r2,r14,PARAM4 ; register save area E 10 I 10 move r0,r5 ; exception type movei r1,0 ; code : only used for page faults D 13 move r4,r2 ; save rsave pointer a moment E 13 I 13 move r4,r2 ; shuffle old PCB virtual address E 13 move r2,r3 ; pass old psl as param3 move r3,r4 ; pass register save area as param4 D 13 E 13 E 10 D 9 call r11,_trap,l E 9 I 9 call LINK,_trap,l E 9 D 13 E 13 endtrap: D 13 E 13 ; BACK FROM "trap" I 13 laddr r5,trap_ret ; setup to enter kernel mode kcall 255 ; go finish the trap sequence E 13 D 13 laddr r5,trap_ret kcall 255 E 13 align 4 global trap_ret D 13 E 13 trap_ret: D 13 E 13 ; RETURNS TO USER MODE D 13 move r4,sr14 D 6 move r2,sr4 ; retreives user pcb move sr14,r2 load r3,r2,PSL move r0,r3 and r0,PS_SV br r0 <> 0,tr001 load r4,r2,SREG12 ; vrt base and size move sr12,r4 tr001: load r11,r2,REG11 load r14,r2,REG14 ; stack pointers load r4,r2,SREG4 E 6 I 6 move r1,sr4 ; retreives user pcb move sr14,r1 E 13 I 13 ; (Entered from endtrap and from paging code) ; unwinds one stacked PCB context ; Input D 14 ; sr14 phys addr of trap pcb which will be removed E 14 ; sr4 phys addr of previous pcb which will be restored ; Restores ; sr14 from sr4 : previous phys PCB ; r0-6,r14,r15 ; from previous (ie: sr4) PCB ; sr4 from previous (ie: sr4) PCB : previous PCB phys addr ; sr6 from previous (ie: sr4) PCB : PCB virt addr ; sr7 from previous (ie: sr4) PCB : PSL ; D 14 move r4,sr14 ; get current physical pcb addr E 14 move r1,sr4 ; get previous context PCB phys addr move sr14,r1 ; set previous PCB E 13 D 9 load r11,r1,REG11 loadd r14,r1,REG14 ; stack pointers E 9 I 9 loadd r14,r1,REG14 ; stack pointers and return address E 9 D 13 load r4,r1,SREG4 E 6 move sr4,r4 ; pcb logical address D 6 load r4,r2,SREG6 move sr6,r4 ; pcb logical address E 6 I 6 loadd r2,r1,SREG6 E 13 I 13 load r4,r1,SREG4 ; get previous' previous PCB move sr4,r4 ; leave this as previous PCB loadd r2,r1,SREG6 ; get current pcb virtual addr + PSL E 13 move sr6,r2 ; pcb logical address E 6 D 13 move sr7,r3 lus r0,r5 E 13 I 13 move sr7,r3 ; set psl lus r0,r6 ; restore all temps used by kernel 'c' E 13 rum ; return to user mode D 6 E 6 external _ext_intr,_clock allints: D 13 I 6 E 13 E 6 ; INTERRUPTS COMMON CODE D 13 move r4,sr14 br r4 <> 1,alli63 move r4,sr5 E 13 I 13 ; Input: ; temp registers (as imposed by kernel 'c' conventions) saved in PCB ; (Currently, this is R0-R6) move r4,sr14 ; get PCB phys addr br r4 <> 1,alli63 ; go if there is a PCB move r4,sr5 ; get idle loop PCB. E 13 alli63: D 9 store r11,r4,REG11 D 6 store r14,r4,REG14 ; saves stack pointers E 6 I 6 stored r14,r4,REG14 ; saves stack pointers E 9 I 9 stored r14,r4,REG14 ; saves stack pointers and return addr E 9 E 6 move r3,sr7 ; picks up psl and r3,PS_ITS ; already on interrupt stack ? D 13 br r3 <> 0,alli10 E 13 I 13 br r3 <> 0,alli10 ; go if on interrupt stack E 13 ; ; if no : switch to interrupt stack D 13 E 13 D 6 laddr r14,intstack,l ; INT stack bottom logical address laddr r0,_sys_vrt,l move sr12,r0 ; sets system vrt base E 6 I 6 laddr r14,intstack,l ; INT stack bottom logical address E 6 alli10: D 13 move r2,sr4 store r2,r4,SREG4 move r2,sr6 E 13 I 13 move r2,sr4 ; get previous phys PCB phys addr store r2,r4,SREG4 ; save in current PCB move r2,sr6 ; get current PCB virtual addr E 13 move r3,sr7 ; picks up psl D 13 stored r2,r4,SREG6 E 13 I 13 stored r2,r4,SREG6 ; save SV PCB and PSL in current PCB E 13 D 6 alli12: movei r2,PS_ITS+PS_SV+1 ; bit SV + level 1 E 6 I 6 movei r2,PS_SV+PS_ITS+2 ; bit SV + level 2 E 6 D 13 laddr r1,EXTERNINT D 6 br r5 = r1, alli35 addi r2,1 ; " + level 2 E 6 I 6 br r5 <> r1, alli35 subi r2,1 ; " + level 2 E 13 I 13 laddr r1,EXTERNINT ; see if we're running an external int br r5 <> r1, alli35 ; go if not subi r2,1 ; run external interrupt at level 1 E 13 E 6 alli35: D 13 laddr r0,MASK E 13 I 13 laddr r0,MASK ; disable interrupts E 13 halfword I_MASK ; external interrupt disable D 13 E 13 move sr7,r2 ; sets SV bit and level in psl laddr r14,r14,-PCBSZ ; reserves intr. pcb on supervisor stack D 6 loadh r2,_sys_segno,l ; system data segment number move sr14,r14 E 6 I 6 D 13 trans r1,r14 move sr14,r1 E 13 I 13 trans r1,r14 ; get phys addr of this pcb move sr14,r1 ; set PCB addr E 13 E 6 move sr4,r4 ; sr4 = old pcb physical address ; D 13 ; ; system pcb initialisations E 13 I 13 D 17 ; system pcb initialisations E 17 I 17 ; ; system pcb initialisations E 17 E 13 ; D 6 br r3=0,alli99 storeh r2,r14,DSEG ; - system data segment number storeh r2,r14,TSEG ; - system code segment number E 6 D 7 laddr r2,0F801H ; - trapsword : enable all traps E 7 I 7 laddr r2,0c0000001H,l ; - trapsword : enable all traps E 7 D 6 store r2,r14,TRAPSW ; and sets privileged mode E 6 I 6 store r2,r1,TRAPSW ; and sets privileged mode D 13 move sr10,r2 E 13 I 13 move sr10,r2 ; set traps word E 13 E 6 I 13 ; .. also entered from splx with deferred timer interrupt. E 13 alli99: load r4,r4,PC ; Interrupt pc D 13 move sr6,r14 move r2,sr0 D 6 laddr r0,alli70,l store r0,r14,PC lus r0,r0 E 6 I 6 laddr r0,alli70 ; store r0,r14,PC ; lus r0,r0 move sr15,r0 ;** E 6 rum E 13 I 13 move sr6,r14 ; set current PCB virt addr move r2,sr0 ; get I/O Interrupt Read Word laddr r0,alli70 ; where to go in system virtual move sr15,r0 ; set pc rum ; fall thru (in SV mode) to: E 13 alli70: D 13 E 13 laddr r14,r14,-72 ; link D 13 laddr r0,TIMER1INT br r5 <> r0,alli75 E 13 I 13 laddr r0,TIMER1INT ; see if we're running a timer int br r5 <> r0,alli75 ; go if not E 13 ; ; timer interrupt ; D 10 store r4,r14,PARAM1 ; interrupt pc store r3,r14,PARAM2 ; interrupt ps E 10 I 10 move r0,r4 ; interrupt pc move r1,r3 ; interrupt ps E 10 D 9 call r11,_clock,l ; clock(pc,ps) E 9 I 9 call LINK,_clock,l ; clock(pc,ps) E 9 D 13 E 13 ; BACK FROM "interrupt" D 13 laddr r14,r14,72 laddr r5,clock_ret E 13 I 13 laddr r14,r14,72 ; unwind stack laddr r5,clock_ret ; drop into kernel mode E 13 kcall 255 D 13 E 13 alli75: ; ; external interrupt ; D 13 E 13 D 6 movei r0,0 flush E 6 D 10 store r2,r14,PARAM1 ; IOIR only if external interrupt E 10 I 6 movei r0,1 ; flush cache flush E 6 D 9 call r11,_ext_intr,l ; intr (ioir) E 9 I 9 D 10 call LINK,_ext_intr,l ; intr (ioir) E 10 I 10 move r0,r2 ; IOIR only if external interrupt call LINK,_ext_intr,l ; intr (ioir) E 10 E 9 D 13 E 13 ; BACK FROM "interrupt" D 13 laddr r14,r14,72 laddr r5,int_ret E 13 I 13 laddr r14,r14,72 ; unwind stack laddr r5,int_ret ; drop into kernel mode E 13 kcall 255 align 4 D 13 E 13 clock_ret: D 13 E 13 ; RETURNS TO USER MODE D 13 load r0,_tictac1,l br r0 = 0,int_ret sub r0,1 E 13 I 13 load r0,_tictac1,l ; see if more timer ticks were deferred br r0 = 0,int_ret ; if none, then just finish interrupt sub r0,1 ; one less to do... E 13 store r0,_tictac1,l D 13 laddr r5,TIMER1INT E 13 I 13 laddr r5,TIMER1INT ; setup a timer interrupt E 13 move r4,sr4 ; retreives old pcb D 13 load r3,r4,PSL move r1,sr14 br alli99 E 13 I 13 load r3,r4,PSL ; get previous PCB's PSL move r1,sr14 ; get current PCB phys addr br alli99 ; re-do the timer interrupt E 13 int_ret: D 13 E 13 ; RETURNS TO PREVIOUS MODE D 13 movei r0,1 store r0,idleflag,l E 13 I 13 ; Here after external interrupt of timer interrupt movei r0,1 ; Set idle flag store r0,idleflag,l ; save this new value E 13 move r2,sr4 ; retreives user pcb D 13 load r3,r2,PSL move r1,r3 and r1,PS_SV br r1 <> 0,alli30 loadb r1,_addupc_clk,l ; addupc ? br r1 <> 0,alladdupc loadb r1,_runrun,l ; reschedule? br r1 = 0,alli30 E 13 I 13 load r3,r2,PSL ; get previous context PSL move r1,r3 ; copy it and r1,PS_SV ; extract sys virtual bit br r1 <> 0,alli30 ; go if we were interrupted from SV mode loadb r1,_addupc_clk,l ; Time to profile? br r1 <> 0,alladdupc ; go if it is time loadb r1,_runrun,l ; Time to reschedule? br r1 = 0,alli30 ; go if it is not time to reschedule E 13 ; reschedule : D 13 laddr r0,UNMASK E 13 I 13 laddr r0,UNMASK ; allow interrupts E 13 halfword I_MASK D 13 laddr r5,RESCHED move r4,sr4 E 13 I 13 laddr r5,RESCHED ; trap type move r4,sr4 ; get previous PCB E 13 ; ******************* ; ; switch from interrupt stack ; ; to supervisor stack I 13 ; Enter here from the addupc code, too. ; Input ; R5 RESCHED / ADDUPC code ; R4 previous phys PCB E 13 allrsc: D 6 laddr r14,KERNSTACK,l ; SV stack bottom logical address E 6 movei r2,PS_SV move sr7,r2 ; sets SV bit in psl D 6 laddr r2,r14,-PCBSZ ; reserves syst. pcb on supervisor stack move r14,r2 loadh r1,_sys_segno,l ; system data segment number trans r0,r1 ; r1 = syst. pcb physical adress E 6 I 6 laddr r14,KERNSTACK-PCBSZ,l ; SV stack bottom logical address trans r0,r14 ; r1 = syst. pcb physical adress E 6 D 13 E 13 #ifdef MLDEBUG D 13 E 13 br r0 >= 0,ars26 D 9 call r11,_call_debug,l E 9 I 9 call LINK,_call_debug,l E 9 ars26: D 13 E 13 #endif D 13 E 13 D 6 move sr14,r0 E 6 I 6 move sr14,r0 ; set system pcb pointer E 6 move sr4,r4 ; sr4 = old pcb physical address ; D 13 ; ; system pcb initialisations E 13 I 13 ; system pcb initialisations E 13 ; D 6 laddr r4,_u,l E 6 I 6 laddr r4,_u,l ; virtual addr of u aread E 6 move sr6,r14 ; syst. pcb logical address D 6 laddr r1,arst70,l store r1,r0,PC lus r0,r0 E 6 I 6 D 13 laddr r1,arst70 ; entry point in kernel E 13 I 13 laddr r1,arst70 ; entry point in system virtual code E 13 move sr15,r1 ; set pc E 6 D 13 rum E 13 I 13 rum ; fall through (in sys Virt mode) to: E 13 arst70: laddr r14,r14,-72 ; link D 13 E 13 D 10 store r5,r14,PARAM1 ; exception type store r3,r14,PARAM3 ; old psl store r4,r14,PARAM4 ; regsave E 10 I 10 move r0,r5 ; exception type ; ???? where is param2 ???? move r2,r3 ; old psl move r3,r4 ; regsave ; ... old code follows: note: there is *no* param2 here!! Why not?? ; store r5,r14,PARAM1 ; exception type ; store r3,r14,PARAM3 ; old psl ; store r4,r14,PARAM4 ; regsave D 13 E 13 E 10 D 9 call r11,_trap,l E 9 I 9 call LINK,_trap,l E 9 D 13 E 13 ; BACK FROM "trap" D 13 laddr r5,sysc_ret E 13 I 13 laddr r5,sysc_ret ; kernel entry point E 13 kcall 255 ; **************************** ; ; END RESCHED ; ; **************************** ; addupc : alladdupc: D 13 laddr r0,UNMASK E 13 I 13 laddr r0,UNMASK ; enable interrupts E 13 halfword I_MASK D 13 laddr r5,ADDUPC move r4,sr4 E 13 I 13 laddr r5,ADDUPC ; trap type move r4,sr4 ; get previous physical PCB addr E 13 br allrsc ; go to trap routine I 13 ; Here during interrupt return, when it is not time to reschedule or profile ; r2 previous context phys PCB ; r3 psl E 13 alli30: D 6 move r1,r3 and r1,PS_SV br r1 <> 0,alli330 load r4,r2,SREG12 ; vrt base and size move sr12,r4 alli330: E 6 D 9 load r11,r2,REG11 E 9 D 13 load r4,r2,SREG4 move sr4,r4 load r4,r2,SREG6 move sr6,r4 E 13 I 13 load r4,r2,SREG4 ; get previous' previous phys pcb move sr4,r4 ; set previous PCB phys addr load r4,r2,SREG6 ; get previous PCB virt addr move sr6,r4 ; set that up E 13 D 6 load r14,r2,REG14 ; stack pointers E 6 I 6 D 9 loadd r14,r2,REG14 ; stack pointers E 9 I 9 loadd r14,r2,REG14 ; stack pointers and return address E 9 E 6 D 13 move sr14,r2 E 13 I 13 move sr14,r2 ; switch to previous context E 13 move sr7,r3 ; restores psl D 6 and r3,PS_IPL br r3 <> 0,alli50 E 6 I 6 D 13 move r1,r3 and r1,PS_IPL br r1 <> 0,alli50 E 13 I 13 move r1,r3 ; copy it and r1,PS_IPL ; see if we were at any interrupt level br r1 <> 0,alli50 ; go if we were laddr r0,UNMASK ; previous psl was without ints halfword I_MASK ; allow interrupts and r3,PS_SV ; see if we were in system virt mode br r3<>0,alli50 ; go if we were lus r0,r6 ; restore all temps used by kernel 'c' rum ; back to previous user context E 13 E 6 D 13 laddr r0,UNMASK halfword I_MASK I 6 and r3,PS_SV br r3<>0,alli50 lus r0,r5 rum E 6 E 13 I 13 ; previous context was in system virtual mode: do a quicker exit E 13 alli50: D 6 lus r0,r5 E 6 I 6 D 13 load r0,r2,PC ;** move sr15,r0 ;** ldregs r0,r5 E 6 rum E 13 I 13 load r0,r2,PC ; fetch previous PC move sr15,r0 ; set PC ldregs r0,r6 ; restore all temps used by kernel 'c' rum ; back to previous kernel context E 13 D 13 E 13 align 4 global _idle D 13 E 13 _idle: D 9 store r11,r14,0 call r11,_spl0,l E 9 I 9 D 13 store LINK,r14,0 call LINK,_spl0,l E 9 laddr r5,waitloc2,l kcall 255 E 13 I 13 store LINK,r14,0 ; save return addr on stack call LINK,_spl0,l ; allow interrupts laddr r5,waitloc2,l ; drop into kernel kcall 255 ; ... drop through if we come back E 13 idle_loop: laddr r5,waitloc2,l kcall 255 waitloc2: D 13 load r0,idleflag,l br r0 <> 0,busy laddr r1,idle_loop,l move r0,sr14 store r1,r0,PC move sr5,r0 movei r0,1 move sr14,r0 rum E 13 I 13 load r0,idleflag,l ; test idle flag br r0 <> 0,busy ; go if idle laddr r1,idle_loop,l ; restart system virtual move r0,sr14 ; get current PCB store r1,r0,PC ; save restart addr move sr5,r0 ; save idle pcb movei r0,1 ; set idle pcb addr move sr14,r0 ; setup for taking machine idle rum ; idle.... ; Here if there is work to do... E 13 busy: D 13 movei r0,0 E 13 I 13 movei r0,0 ; clear the idle flag E 13 store r0,idleflag,l D 13 laddr r1,idle_ret,l move sr15,r1 rum E 13 I 13 laddr r1,idle_ret,l ; setup the return from idl move sr15,r1 ; set system virtual pc rum ; .. drop thru (in sys virtual) to: E 13 idle_ret: D 9 load r11,r14,0 ret r11,r11 E 9 I 9 D 13 load LINK,r14,0 E 13 I 13 load LINK,r14,0 ; restore reg E 13 ret LINK,LINK E 9 I 6 E 6 global _kcall255 D 13 E 13 _kcall255: I 13 ; kcall255 is a way for a process to drop into kernel mode at the address ; specified in r5. It should check for system mode in the PSL, and trap if ; some user process tries to do this! E 13 ret r5,r5 global _kcall254 external Xpage D 13 E 13 _kcall254: D 13 E 13 D 11 ; this kcall permit to be in kernel mode allowing sigcode routine in the libc ;to be executed in kernel mode with user stack page in memory. E 11 I 11 ; KCALL 254 -- return from signal handler ; This kcall atomically restores PC, r0-r6, r11, and r14 from the ; stack pointer given in r14. It is used to return from the ; execution of a signal handler. The frame which r14 points to ; must not cross a page boundary; this is arranged by ; the sendsig routine. If the stack page is not in memory, then ; a page fault is simulated. Note that the restoration of r11 ; is only vestigially related to the subroutine linkage pointer ; conventions of older c programs. Any linkage convention may ; be used, provided it preserves r7-r10,r12-r15. Note that this ; requirement includes r14, the stack frame pointer, which must ; point to the same frame which was delivered to the sigcode routine ; in the user's libc. E 11 D 13 E 13 move r1,r14 ;get virtual address of the stack pointer D 6 move r0,sr9 ;get seg # of user data segment trans r2,r0 ;translate stack virt addr into phys addr E 6 I 6 trans r2,r1 ;translate stack virt addr into phys addr E 6 br r2>=0,ret254 ;return if page is in memory move r2,sr15 ;simulate page fault exception subi r2,2 ; pc - 2 --> pc (sr15) to redo the kernel call move sr15,r2 ; D 6 move r2,sr9 ; put data seg # in sr2 move sr2,r2 ; put data seg # in sr2 E 6 move sr3,r14 ; put offset (stack pointer) in sr3 noti r2,0 ; put -1 (normal fault) in sr1 move sr1,r2 ; br Xpage ; branch to page fault exception ret254: ; r2 = user stack physical addr D 11 move r14,r2 ;put stack phys addr in r14 load r0,r14,72 ;get user PC before the signal from the stack move sr15,r0 ;put PC into sr15 D 9 load r0,r14,28 ;restore registers r0..r6,r11 from the stack E 9 I 9 load r0,r14,28 ;restore registers r0..r6 from the stack E 9 loadd r1,r14,32 loadd r3,r14,40 loadd r5,r14,48 D 10 load r11,r14,56 E 10 D 9 load r14,r14,76 ;restore initial stack pointer E 9 I 9 loadd r14,r14,76 ;restore initial stack pointer and return addr E 9 rum ;return to the user E 11 I 11 move r14,r2 ;put stack phys addr in r14 D 12 load r0,r14,sigframe_pc ;get user PC before the signal from the stack E 12 I 12 load r0,r14,SIGFRAME_PC ;get user PC before the signal from the stack E 12 move sr15,r0 ;put PC into sr15 D 12 load r0,r14,sigframe_r0 ;restore registers r0..r6,r11 from the stack loadd r1,r14,sigframe_r1 ;restore r1,r2 loadd r3,r14,sigframe_r3 ;restore r2,r3 loadd r5,r14,sigframe_r5 ;restore rr5,r6 load r11,r14,sigframe_r11 ;restore r11 load r14,r14,sigframe_r14 ;restore initial stack pointer E 12 I 12 load r0,r14,SIGFRAME_R0 ;restore registers r0..r6,r11 from the stack loadd r1,r14,SIGFRAME_R1 ;restore r1,r2 loadd r3,r14,SIGFRAME_R3 ;restore r2,r3 loadd r5,r14,SIGFRAME_R5 ;restore rr5,r6 load r11,r14,SIGFRAME_R11 ;restore r11 load r14,r14,SIGFRAME_R14 ;restore initial stack pointer E 12 rum ;return to the user E 11 D 17 dsect data global _idle_addr,_tictac1,_old_ps E 17 I 17 global _call_rbug align 4 E 17 I 17 _call_rbug: move r1,r0 ; save rbug entry point laddr r0,_rbsave,l stored r6,r0,0 stored r8,r0,8 stored r10,r0,16 stored r12,r0,24 stored r14,r0,32 laddr r5,rb001 move r8,0 ; ..?? what is r8 used for?? kcall 255 E 17 I 6 I 17 ; comes back here on a "e" command to rbug laddr r0,_rbsave,l loadd r6,r0,0 loadd r8,r0,8 loadd r10,r0,16 loadd r12,r0,24 loadd r14,r0,32 ret LINK,LINK rb001: move r0,r1 ; move rbug entry point into position movei r1,1 move sr0,r1 ; to reset sr0 which is not done by kcall ret r0,r0 dsect data global _idle_addr,_tictac1,_old_ps,_rbsave E 17 E 6 _idle_addr: word idle_loop idleflag: word 0 _tictac1: word 0 _old_ps: word 0 I 17 align 8 _rbsave: word 0 word 0 word 0 word 0 word 0 word 0 word 0 word 0 word 0 word 0 #ifdef KDB E 17 global __debug D 2 __debug word 1 E 2 I 2 D 6 __debug word 0 E 6 I 6 D 15 __debug word 1 E 15 I 15 D 17 __debug word 0 E 17 I 17 __debug word 0 #endif E 17 E 15 E 6 E 2 csect code E 1 h14987 s 00001/00001/00147 d D 4.4 87/04/15 17:41:15 dc 9 8 c dc - changed #include "sys/..." to #include e s 00024/00013/00124 d D 4.3 87/02/20 16:18:18 build 8 7 c pass args in r0-r3 e s 00006/00006/00131 d D 4.2 87/02/20 15:38:15 build 7 6 c change r11 to LINK /dc e s 00000/00000/00137 d D 4.1 87/02/20 13:27:43 build 6 5 c rolled rev to -r4 /dc e s 00000/00032/00137 d D 3.2 87/01/27 09:46:40 build 5 4 c add page table changes /dc e s 00000/00000/00169 d D 3.1 87/01/19 09:20:43 build 4 3 c rolled rev to -r3 /dc e s 00000/00000/00169 d D 2.1 87/01/19 09:20:43 build 3 2 c AUTO NULL DELTA e s 00001/00000/00168 d D 1.2 87/01/16 10:13:26 build 2 1 c add ident string /dc e s 00168/00000/00000 d D 1.1 87/01/09 15:59:13 build 1 0 c Placed under source control - dc e u U f b f n t T I 2 ; "%W% %E%" E 2 I 1 D 9 #include "sys/ass.h" E 9 I 9 #include E 9 ; These are routines needed by the system for ; manipulating system virtual space ; reading and writing to io devices ; ; 1) _bzero(src,count) ; 2) _bcopy(src,dest,count) D 5 ; 3) zeropage(offset,pg_pfn,count) E 5 ; 4) d_read(dev,&data) ; 5) d_write(dev,data) ; 6) d_rwrite(dev,data) csect code global _bzero global _bcopy D 5 global _zeropage E 5 global _d_read global _d_write global _d_rwrite I 8 ; Enter here with destination pointer in r0 E 8 _clrpage: D 8 load r0,r14,PARAM1 ; get destination pointer E 8 movei r2,0 ; this page will be filled with zero's movei r3,0 ; this page will be filled with zero's laddr r1,-4096 ; get size of page for counter cl1: stored r2,r0 ; store double word at destination pointer addi r0,8 ; inc destination pointer by size of double loop r1,8,cl1 ; loop to cl1 while counter is less than 0 D 7 ret r11,r11 E 7 I 7 ret LINK,LINK E 7 align 4 _bzero: I 8 ; Input ; r0 address to start clearing ; r1 length to clear E 8 ; D 8 load r0,r14,PARAM1 ; get starting address of block to clear load r1,r14,PARAM2 ; get number of bytes to clear E 8 movei r3,0 move r2,r0 and r2,15 br r2 <> 0,zero2 laddr r4,4096 br r1 = r4,_clrpage zero2: br r1 = 0,out1 ; if count is 0 - just return move r2,r0 andi r2,3 br r2 = 0,zero3 storeb r3,r0,0 addi r0,1 subi r1,1 br zero2 zero3: move r4,r1 move r5,4 rem r4,r5 ; This leaves us with the odd count after wards movei r2,3 not r2,r2 and r1,r2 neg r1,r1 ; make count negative for use in a loop instr zero4: store r3,r0,0 ; clear byte at the address of r0 addi r0,4 ; incr address pointer loop r1,4,zero4 ; incr counter and loop until counter is 0 br r4 = 0,out1 move r1,r4 zero5: storeb r3,r0,0 ; clear byte at the address of r0 addi r0,1 ; incr address pointer loop r1,1,zero5 ; incr counter and loop until counter is 0 out1: D 7 ret r11,r11 E 7 I 7 ret LINK,LINK E 7 align 4 _bcopy: D 8 load r0,r14,PARAM1 ; get source address load r1,r14,PARAM2 ; get destination address load r2,r14,PARAM3 ; get count E 8 I 8 ; Input ; r0 source address ; r1 destination address ; r2 count E 8 loop2: br r2 = 0,out2 ; if count is 0 - just return move r3,r0 andi r3,3 br r3 = 0,loop3 ; br because the source addr is word boundary loadb r3,r0,0 storeb r3,r1,0 addi r0,1 addi r1,1 subi r2,1 br loop2 loop3: move r3,r1 andi r3,3 neg r2,r2 br r3 = 0,loop6 ; br because dest addr is word boundary loop5: loadb r3,r0,0 storeb r3,r1,0 addi r0,1 addi r1,1 loop r2,1,loop5 br out2 loop6: load r3,r0,0 store r3,r1,0 addi r0,4 addi r1,4 loop r2,4,loop6 out2: D 7 ret r11,r11 E 7 I 7 ret LINK,LINK E 7 D 5 align 4 _zeropage: ; load r1,r14,PARAM1 ; get 1st argument - page frame number lsli r1,PAGE_SHIFT load r2,r14,PARAM2 ; get 2nd argument - offset into page add r1,r2 load r3,r14,PARAM3 ; get 3th argument - count ; ; go to kernel mode ; laddr r5,zeropage kcall 255 ; ret r11,r11 zeropage: ; ; ; loop zeroing page ; neg r3,r3 ; negate the count to use loop instruction movei r0,0 zeropage1: storeb r0,r1 add r1,1 loop r3,1,zeropage1 ; rum ; returm to privilege user mode E 5 align 4 _d_read: D 8 load r2,r14,PARAM1 ; Get 1st argument - device load r3,r14,PARAM2 ; Get 2nd argument - int pointer E 8 I 8 ; Input ; r0 1st argument - I/O address ; r1 2nd argument - int pointer move r2,r0 ; move I/O address pointer move r3,r1 ; move I/O data pointer E 8 read r0,r2 ; Physical device read store r1,r3,0 ; store returned data D 7 ret r11,r11 E 7 I 7 ret LINK,LINK E 7 align 4 _d_write: D 8 load r2,r14,PARAM1 ; Get 1st argument - device load r0,r14,PARAM2 ; Get 2nd argument - data to be sent to device E 8 I 8 ; Input ; r0 1st argument - I/O address ; r1 2nd argument - data to be sent to device move r2,r0 ; move I/O address over move r0,r1 ; move I/O data to proper place E 8 write r0,r2 ; Physical device write D 7 ret r11,r11 E 7 I 7 ret LINK,LINK E 7 align 4 _d_rwrite: D 8 load r2,r14,PARAM1 ; Get 1st argument - device E 8 I 8 ; Input ; r0 I/O address ; r1 pointer to data to be written move r2,r0 ; move arg to register not destroyed by read move r3,r1 ; save data to be written E 8 loop7: read r0,r2 ; Physical device read br r0<>0,error ; Quit on errors andi r1,2 ; Extract just the bit br r1<>0,loop7 ; Wait for fdlp ready for next command D 8 load r0,r14,PARAM2 ; Get 2nd argument - data to be sent to device write r0,r2 ; Physical device write E 8 I 8 write r3,r2 ; Physical device write E 8 error: D 7 ret r11,r11 ; R0 return to caller E 7 I 7 ret LINK,LINK ; R0 return to caller E 7 E 1 h06423 s 00001/00001/00056 d D 4.5 87/04/16 17:37:10 dc 9 8 c dc - Add Bull updates from 03/05/87 e s 00001/00001/00056 d D 4.4 87/04/15 17:41:21 dc 8 7 c dc - changed #include "sys/..." to #include e s 00006/00010/00051 d D 4.3 87/02/20 16:22:13 build 7 6 c pass args in r0-r3 e s 00004/00004/00057 d D 4.2 87/02/20 15:39:25 build 6 5 c change r11 to LINK /dc e s 00000/00000/00061 d D 4.1 87/02/20 13:27:46 build 5 4 c rolled rev to -r4 /dc e s 00000/00000/00061 d D 3.1 87/01/19 09:20:46 build 4 3 c rolled rev to -r3 /dc e s 00000/00000/00061 d D 2.1 87/01/19 09:20:46 build 3 2 c AUTO NULL DELTA e s 00001/00000/00060 d D 1.2 87/01/16 10:13:29 build 2 1 c add ident string /dc e s 00060/00000/00000 d D 1.1 87/01/09 15:59:14 build 1 0 c Placed under source control - dc e u U f b f n t T I 2 D 9 ; "%W% %E%" E 9 I 9 ; " %W% %E% " E 9 E 2 I 1 D 8 #include "sys/ass.h" E 8 I 8 #include E 8 ; unsigned int divide: ; i = udiv((int)dvdnd, (int)divis) ; ; unsigned int remainder: ; j = urem((int)dvdnd, (int)divis) ; ; also include C library like interface, main line case only! csect code align 4 global _udiv global udiv global _urem global urem _udiv: udiv: D 7 movei r0,0 load r1,r14,PARAM1 load r2,r14,PARAM2 E 7 I 7 move r2,r1 ; shuffle divisor move r1,r0 ; shuffle dividend movei r0,0 ; clear high part of dividend E 7 ediv r0,r2 D 6 ret r11,r11 E 6 I 6 ret LINK,LINK E 6 align 4 _urem: urem: D 7 movei r0,0 load r1,r14,PARAM1 load r2,r14,PARAM2 E 7 I 7 move r2,r1 ; shuffle divisor move r1,r0 ; shuffle dividend movei r0,0 ; clear high part of dividend E 7 ediv r0,r2 move r0,r2 D 6 ret r11,r11 E 6 I 6 ret LINK,LINK E 6 align 4 global _min global _max _min: D 7 load r0,r14,PARAM1 load r1,r14,PARAM2 E 7 move r2,r0 lcomp r2,r1 br r2 <= 0,mret move r0,r1 mret: D 6 ret r11,r11 E 6 I 6 ret LINK,LINK E 6 align 4 _max: D 7 load r0,r14,PARAM1 load r1,r14,PARAM2 E 7 move r2,r0 lcomp r2,r1 br r2 >= 0,mret2 move r0,r1 mret2: D 6 ret r11,r11 E 6 I 6 ret LINK,LINK E 6 E 1 h16618 s 00000/00000/00036 d D 4.1 87/02/20 13:27:49 build 6 5 c rolled rev to -r4 /dc e s 00001/00001/00035 d D 3.2 87/01/27 09:45:39 build 5 4 c add page table changes /dc e s 00000/00000/00036 d D 3.1 87/01/19 09:20:48 build 4 3 c rolled rev to -r3 /dc e s 00000/00000/00036 d D 2.1 87/01/19 09:20:48 build 3 2 c AUTO NULL DELTA e s 00001/00000/00035 d D 1.2 87/01/16 10:13:32 build 2 1 c add ident string /dc e s 00035/00000/00000 d D 1.1 87/01/09 15:59:12 build 1 0 c Placed under source control - dc e u U f b f n t T I 2 ; "%W% %E%" E 2 I 1 ; define user area virtual address global _u D 5 _u equ 7fff000H E 5 I 5 _u equ 0fffc0000H E 5 exec equ 11 csect code ; Bootstrap program executed in user mode ; to bring up the system. global _icode global _szicode align 4 _icode: ic0: laddr r1,ic2 ; address of name of file to exec laddr r2,ic1 ; address of argv environment movei r0,exec ; system call range kcall 0 ic00: br ic00 ; if we get here loop forever ic2: byte '/etc/init\0' align 4 ic1: word ic2-ic0 word 0 ic9: _szicode: word ic9-_icode dsect data align 4 global ispstack,ispstend ispstack: space 4096 ispstend: space 128 E 1 h52798 s 00001/00001/00075 d D 4.5 87/04/16 17:31:46 dc 11 10 c dc - Add Bull updates from 03/05/87 e s 00001/00001/00075 d D 4.4 87/04/15 17:41:28 dc 10 9 c dc - changed #include "sys/..." to #include e s 00004/00009/00072 d D 4.3 87/02/20 15:52:49 build 9 8 c pass args in r0-r3 e s 00003/00003/00078 d D 4.2 87/02/20 15:36:42 build 8 7 c change r11 to LINK /dc e s 00000/00000/00081 d D 4.1 87/02/20 13:27:51 build 7 6 c rolled rev to -r4 /dc e s 00022/00000/00059 d D 3.3 87/02/16 10:48:57 build 6 5 c replace dcb_write e s 00021/00175/00038 d D 3.2 87/01/27 09:43:58 build 5 4 c add page table changes /dc e s 00000/00000/00213 d D 3.1 87/01/19 09:20:50 build 4 3 c rolled rev to -r3 /dc e s 00000/00000/00213 d D 2.1 87/01/19 09:20:50 build 3 2 c AUTO NULL DELTA e s 00001/00000/00212 d D 1.2 87/01/16 10:13:35 build 2 1 c add ident string /dc e s 00212/00000/00000 d D 1.1 87/01/09 15:59:09 build 1 0 c Placed under source control - dc e u U f b f n t T I 2 D 11 ; "%W% %E%" E 11 I 11 ; " %W% %E% " E 11 E 2 I 1 D 10 #include "sys/ass.h" E 10 I 10 #include E 10 csect code align 4 global _copyseg, _copypage _copyseg: _copypage: I 9 move r2,r1 ; shuffle incoming arg (dest page) move r1,r0 ; shuffle incoming arg (source page) E 9 I 5 load r0,_kbase,l E 5 D 9 load r1,r14,PARAM1 E 9 asl r1,PAGE_SHIFT I 5 add r1,r0 E 5 D 9 load r2,r14,PARAM2 E 9 asl r2,PAGE_SHIFT I 5 add r2,r0 E 5 D 5 laddr r5,copypage kcall 255 E 5 I 5 copypage: E 5 D 5 ret r11,r11 E 5 I 5 laddr r0,PAGE_LENGTH_D neg r0,r0 E 5 I 5 loop2: loadd r4,r1,0 stored r4,r2,0 add r1,8 add r2,8 loop r0,1,loop2 E 5 I 5 D 8 ret r11,r11 E 8 I 8 ret LINK,LINK E 8 E 5 align 4 global _clearseg, _clearpage _clearseg: _clearpage: D 9 load r1,r14,PARAM1 E 9 I 9 move r1,r0 ; shuffle incomping page number E 9 asl r1,PAGE_SHIFT I 5 load r0,_kbase,l add r1,r0 E 5 D 5 laddr r5,clearpage kcall 255 ret r11,r11 align 4 E 5 clearpage: D 5 laddr r0,r1,PAGE_LENGTH_B E 5 I 5 laddr r0,PAGE_LENGTH_D neg r0,r0 E 5 movei r2,0 D 5 move r3,r2 E 5 I 5 movei r3,0 E 5 loop1: stored r2,r1,0 add r1,8 D 5 br r1 < r0,loop1 ! E 5 I 5 loop r0,1,loop1 E 5 D 5 rum copypage: laddr r0,r1,PAGE_LENGTH_B loop2: loadd r4,r1,0 stored r4,r2,0 add r1,8 add r2,8 br r1 < r0,loop2 ! rum align 4 global _move_in,_move_out _move_out: ; move_out ( src, dest, length ) ; caddr_t src; ; paddr_t dest; ; int length; load r1,r14,PARAM1 load r2,r14,PARAM2 load r3,r14,PARAM3 laddr r5,copy_out kcall 255 E 5 D 8 ret r11,r11 E 8 I 8 ret LINK,LINK E 8 I 6 align 4 global _dcb_write ; sometimes, FDLP's default DCB is in the system text segment, ; so we must enter kernel mode to write in it ... _dcb_write: ; dcb_write (value,dest) ; ; int value; ; ; paddr_t dest; D 9 load r1,r14,PARAM1 load r2,r14,PARAM2 E 9 laddr r5,dcb_write kcall 255 D 8 ret r11,r11 E 8 I 8 ret LINK,LINK E 8 dcb_write: D 9 store r1,r2,0 E 9 I 9 store r0,r1,0 E 9 rum E 6 D 5 _move_in: load r1,r14,PARAM1 load r2,r14,PARAM2 load r3,r14,PARAM3 laddr r5,copy_in kcall 255 ret r11,r11 align 4 copy_in: move r4,sr9 move r5,r2 trans r2,r4 #ifdef MLDEBUG br r2>= 0,inok call r11,_call_debug,l inok: #endif br move_loop align 4 copy_out: move r4,sr9 move r5,r1 trans r1,r4 #ifdef MLDEBUG br r2>= 0,outok call r11,_call_debug,l outok: #endif move_loop: br r3 < 8,even_odd move r4,r1 move r5,r2 and r4,7 br r4 = 0,srcdouble and r4,3 br r4 = 0,srcword and r4,1 br r4 = 0,srchalf br even_odd srcdouble: and r5,7 br r5 = 0,double_double srcword: and r5,3 br r5 = 0,word_word srchalf: and r5,1 br r5 = 0,half_half br even_odd double_double: loadd r4,r1,0 stored r4,r2,0 add r1,8 add r2,8 sub r3,8 br r3 >= 8,double_double ! br r3 = 0,endmove word_word: br r3 < 4,endword load r4,r1,0 store r4,r2,0 add r1,4 add r2,4 sub r3,4 br word_word endword: br r3 = 0,endmove half_half: br r3 < 2,even_odd loadh r4,r1,0 storeh r4,r2,0 add r1,2 add r2,2 sub r3,2 br half_half even_odd: br r3 = 0,endmove add r3,r1 byte_byte: loadb r0,r1,0 storeb r0,r2,0 add r1,1 add r2,1 br r3 <> r1,byte_byte ! endmove: rum align 4 global _dcb_write ; sometimes, FDLP's default DCB is in the system text segment, ; so we must enter kernel mode to write in it ... _dcb_write: ; dcb_write (value,dest) ; ; int value; ; ; paddr_t dest; load r1,r14,PARAM1 load r2,r14,PARAM2 laddr r5,dcb_write kcall 255 ret r11,r11 dcb_write: store r1,r2,0 rum E 5 E 1 h22076 s 00003/00003/00128 d D 4.6 87/04/16 17:34:36 dc 11 10 c dc - Add Bull updates from 03/05/87 e s 00001/00001/00130 d D 4.5 87/04/15 17:41:33 dc 10 9 c dc - changed #include "sys/..." to #include e s 00000/00002/00131 d D 4.4 87/02/22 16:27:05 build 9 8 c remove param1 reference e s 00024/00019/00109 d D 4.3 87/02/20 16:07:20 build 8 7 c pass args in r0-r3 e s 00007/00007/00121 d D 4.2 87/02/20 15:37:29 build 7 6 c change r11 to LINK /dc e s 00000/00000/00128 d D 4.1 87/02/20 13:27:55 build 6 5 c rolled rev to -r4 /dc e s 00041/00073/00087 d D 3.2 87/01/27 09:45:11 build 5 4 c add page table changes /dc e s 00000/00000/00160 d D 3.1 87/01/19 09:20:52 build 4 3 c rolled rev to -r3 /dc e s 00000/00000/00160 d D 2.1 87/01/19 09:20:52 build 3 2 c AUTO NULL DELTA e s 00001/00000/00159 d D 1.2 87/01/16 10:13:38 build 2 1 c add ident string /dc e s 00159/00000/00000 d D 1.1 87/01/09 15:59:10 build 1 0 c Placed under source control - dc e u U f b f n t T I 2 D 11 ; "%W% %E%" E 11 I 11 ; " %W% %E% " E 11 E 2 I 1 D 10 #include "sys/ass.h" E 10 I 10 #include E 10 align 4 global _save I 8 ; This routine saves all registers which must be preserved across ; a subroutine call in the kernel. Special regs for this ; process are stored too. ; Input ; kernel virtual address of save area E 8 _save: laddr r5,save00 D 8 load r1,r14,PARAM1 ; save area logical address E 8 kcall 255 ; executes the following in kernel mode D 8 E 8 save00: D 5 move r0,sr9 ; system data segment number trans r2,r0 E 5 I 5 D 8 trans r2,r1 E 8 I 8 trans r2,r0 ; translate the incoming arg E 8 E 5 D 5 #ifdef MLDEBUG E 5 I 5 D 11 #ifdef OSDEBUG E 11 I 11 #ifdef KDB E 11 E 5 br r2 >= 0,save10 D 7 call r11,_call_debug,l E 7 I 7 call LINK,_call_debug,l E 7 save10: #endif D 5 stored r6,r2,0 stored r8,r2,8 stored r10,r2,16 stored r12,r2,24 stored r14,r2,32 E 5 I 5 stored r6,r2,SAVR6 stored r8,r2,SAVR8 stored r10,r2,SAVR10 stored r12,r2,SAVR12 stored r14,r2,SAVR14 E 5 move r0,sr6 ; pcb logical address move r1,sr7 ; psl D 5 stored r0,r2,40 E 5 I 5 stored r0,r2,SAVSR6 E 5 move r0,sr14 ; pcb physical address D 5 move r1,sr4 stored r0,r2,48 E 5 I 5 move r1,sr4 ; old pcb physical address stored r0,r2,SAVSR14 move r0,sr8 ; user section table physical address store r0,r2,SAVSR8 E 5 D 8 movei r0,0 D 7 move sr15,r11 E 7 I 7 move sr15,LINK E 8 I 8 movei r0,0 ; return 0 to caller move sr15,LINK ; put kernel virtual pc of caller in ; sr15, which becomes pc after rum E 8 E 7 rum ; returns from save align 4 global _resume D 5 externd _u_vrt E 5 _resume: laddr r5,res00 D 5 load r1,r14,PARAM1 ; p->p_addr : u struct pte's address E 5 I 5 D 8 load r1,r14,PARAM1 ; p->p_addr : u struct pgt's address E 5 load r8,r14,PARAM2 ; save area logical address E 8 I 8 move r8,r1 ; save area logical address move r1,r0 ; p->p_addr : u struct pgt's address E 8 kcall 255 ; executes the following in kernel mode res00: D 5 laddr r0,_u_vrt,l E 5 ; ; first we are mapping the "u struct" of the new process D 5 ; in the system vrt E 5 ; D 5 laddr r5,7fffH #if USIZE > 1 movei r2,USIZE neg r2,r2 res10: #endif load r3,r0,0 ; first vrt entry address load r4,r1,0 ; first pte entry lsr r4,6 and r4,r5 ; keeps physical page number storeh r4,r3,8 #if USIZE > 1 add r0,4 add r1,4 loop r2,1,res10 #endif E 5 I 5 laddr r0,_ublk_sgtbl+(NSGTPSC-1)*4,l ; last segment table entry store r1,r0 E 5 ; ; now we can start resuming the process ; ; first : translation of save area logical address ; D 5 move r0,sr9 ; system data segment number E 5 move r1,r8 D 5 trans r2,r0 E 5 I 5 trans r2,r1 E 5 D 5 #ifdef MLDEBUG E 5 I 5 D 11 #ifdef OSDEBUG E 11 I 11 #ifdef KDB E 11 E 5 br r2 >= 0,res20 ! D 7 call r11,_call_debug,l E 7 I 7 call LINK,_call_debug,l E 7 res20: #endif D 5 loadd r6,r2,0 loadd r8,r2,8 loadd r10,r2,16 loadd r12,r2,24 loadd r14,r2,32 loadd r0,r2,40 E 5 I 5 loadd r6,r2,SAVR6 loadd r8,r2,SAVR8 loadd r10,r2,SAVR10 loadd r12,r2,SAVR12 loadd r14,r2,SAVR14 loadd r0,r2,SAVSR6 E 5 move sr6,r0 move sr7,r1 D 5 loadd r0,r2,48 E 5 I 5 loadd r0,r2,SAVSR14 E 5 move sr14,r0 move sr4,r1 I 5 load r0,r2,SAVSR8 move sr8,r0 E 5 D 7 move sr15,r11 E 7 I 7 D 8 move sr15,LINK E 8 I 8 move sr15,LINK ; returns to original caller of save E 8 E 7 D 5 movei r0,1 movei r1,9 E 5 I 5 movei r0,2 ; Flush TMT only E 5 flush I 5 D 8 movei r0,1 ; return value from resume E 8 I 8 movei r0,1 ; return value from save E 8 E 5 rum align 4 global _setjmp _setjmp: D 9 load r0,r14,PARAM1 ; save area E 9 D 5 stored r6,r0,0 stored r8,r0,8 stored r10,r0,16 stored r12,r0,24 stored r14,r0,32 E 5 I 5 stored r6,r0,SAVR6 stored r8,r0,SAVR8 stored r10,r0,SAVR10 stored r12,r0,SAVR12 stored r14,r0,SAVR14 E 5 movei r0,0 D 7 ret r11,r11 E 7 I 7 ret LINK,LINK E 7 align 4 global _longjmp I 8 ; Input ; r0 save area ; r1 return code E 8 _longjmp: D 8 load r1,r14,PARAM1 ; save area load r0,r14,PARAM2 ; return code D 5 loadd r6,r1,0 loadd r8,r1,8 loadd r10,r1,16 loadd r12,r1,24 loadd r14,r1,32 E 5 I 5 loadd r6,r1,SAVR6 loadd r8,r1,SAVR8 loadd r10,r1,SAVR10 loadd r12,r1,SAVR12 loadd r14,r1,SAVR14 E 5 br r0 <> 0,long00 add r0,1 E 8 I 8 loadd r6,r0,SAVR6 loadd r8,r0,SAVR8 loadd r10,r0,SAVR10 loadd r12,r0,SAVR12 loadd r14,r0,SAVR14 br r1 <> 0,long00 add r1,1 E 8 long00: I 8 move r0,r1 ; return code to caller E 8 D 7 ret r11,r11 E 7 I 7 ret LINK,LINK E 7 global _flush align 4 I 5 ; Flush the TMT only ; Called from sptfree when system mappings change E 5 _flush: D 5 movei r1,9 E 5 I 5 movei r0,2 ; flush TMT only E 5 flush D 7 ret r11,r11 E 7 I 7 ret LINK,LINK E 7 D 5 global _kvtopfn align 4 _kvtopfn: load r2,r14,PARAM1 laddr r5,kvtopfn01 kcall 255 ret r11,r11 kvtopfn01: loadh r1,_sys_segno,l movei r0,1 trans r3,r1 br r3 >= 0,ok ! movei r0,0 ok: rum E 5 E 1 h50753 s 00001/00001/00189 d D 4.7 87/04/15 17:41:41 dc 12 11 c dc - changed #include "sys/..." to #include e s 00009/00000/00181 d D 4.6 87/02/27 08:42:55 build 11 10 c do alignment checking in [fu][i]word /dc e s 00002/00000/00179 d D 4.5 87/02/24 15:28:50 build 10 9 c fix nops e s 00006/00000/00173 d D 4.4 87/02/24 14:47:28 build 9 8 c add error loops e s 00012/00020/00161 d D 4.3 87/02/20 17:24:19 build 8 7 c pass args in r0-r3 e s 00007/00007/00174 d D 4.2 87/02/20 15:47:42 build 7 6 c change r11 to LINK /dc e s 00000/00000/00181 d D 4.1 87/02/20 13:27:58 build 6 5 c rolled rev to -r4 /dc e s 00157/00036/00024 d D 3.2 87/01/27 09:53:39 build 5 4 c add page table changes /dc e s 00000/00000/00060 d D 3.1 87/01/19 09:20:54 build 4 3 c rolled rev to -r3 /dc e s 00000/00000/00060 d D 2.1 87/01/19 09:20:54 build 3 2 c AUTO NULL DELTA e s 00001/00000/00059 d D 1.2 87/01/16 10:13:41 build 2 1 c add ident string /dc e s 00059/00000/00000 d D 1.1 87/01/09 15:59:18 build 1 0 c Placed under source control - dc e u U f b f n t T I 2 ; "%W% %E%" E 2 I 1 D 12 #include "sys/ass.h" E 12 I 12 #include E 12 align 4 D 5 global _asfubyte E 5 I 5 global _fubyte,_copy_start,_copy_end E 5 D 5 _asfubyte: laddr r5,fub000,l kcall 255 E 5 I 5 _copy_start: _fubyte: D 8 load r0,r14,PARAM1 E 8 laddr r1,USRSTACK,l br r0 > r1,bad_addr loadb r0,r0,0 E 5 D 7 ret r11,r11 E 7 I 7 ret LINK,LINK E 7 D 5 fub000: E 5 D 5 loadb r0,r0,0 rum E 5 D 5 E 5 align 4 D 5 global _assubyte E 5 I 5 global _subyte E 5 D 5 _assubyte: laddr r5,sub000,l load r1,r15,PARAM2 kcall 255 E 5 I 5 _subyte: D 8 load r0,r14,PARAM1 laddr r1,USRSTACK,l br r0 > r1,bad_addr load r1,r14,PARAM2 E 8 I 8 laddr r2,USRSTACK,l br r0 > r2,bad_addr E 8 storeb r1,r0,0 movei r0,0 E 5 D 7 ret r11,r11 E 7 I 7 ret LINK,LINK E 7 D 5 sub000: E 5 D 5 storeb r1,r0,0 movei r0,0 rum E 5 D 5 E 5 align 4 D 5 global _asfuword,_asfuiword E 5 I 5 global _fuword,_fuiword E 5 D 5 _asfuword: _asfuiword: laddr r5,fuw000,l kcall 255 E 5 I 5 _fuword: _fuiword: D 8 load r0,r14,PARAM1 E 8 laddr r1,USRSTACK,l br r0 > r1,bad_addr I 11 move r2,3 ; get mask for illegal address and r2,r0 ; extract these bits from address br r2 <> 0,bad_addr ; error if not word aligned E 11 load r0,r0,0 E 5 D 7 ret r11,r11 E 7 I 7 ret LINK,LINK E 7 D 5 fuw000: E 5 D 5 load r0,r0,0 rum E 5 I 5 align 8 global _suword,_suiword E 5 D 5 align 4 global _assuword,_assuiword _assuword: _assuiword: laddr r5,suw000,l load r1,r15,PARAM2 kcall 255 E 5 I 5 _suword: D 8 load r0,r14,PARAM1 laddr r1,USRSTACK,l br r0 > r1,bad_addr load r1,r14,PARAM2 E 8 I 8 laddr r2,USRSTACK,l br r0 > r2,bad_addr I 11 move r2,3 ; get mask for illegal address and r2,r0 ; extract these bits from address br r2 <> 0,bad_addr ; error if not word aligned E 11 E 8 store r1,r0,0 movei r0,0 E 5 D 7 ret r11,r11 E 7 I 7 ret LINK,LINK E 7 D 5 suw000: E 5 I 5 align 8 _suiword: D 8 load r0,r14,PARAM1 laddr r1,USRSTACK,l br r0 > r1,bad_addr load r1,r14,PARAM2 E 8 I 8 laddr r2,USRSTACK,l br r0 > r2,bad_addr I 11 move r2,3 ; get mask for illegal address and r2,r0 ; extract these bits from address br r2 <> 0,bad_addr ; error if not word aligned E 11 E 8 E 5 store r1,r0,0 I 5 movei r0,1 ; Throw out cache flush ; implicitly uses r0 movei r0,0 ; return null (ie NOT -1) D 7 ret r11,r11 E 7 I 7 ret LINK,LINK E 7 align 4 global _copyin,_copyout,bad_addr ; copy form user to kernel space ; _copyin: ; copyin ( src, dest, length ) ; caddr_t src; ; paddr_t dest; ; int length; D 8 load r1,r14,PARAM1 load r2,r14,PARAM2 load r3,r14,PARAM3 E 8 I 8 move r3,r2 ; shuffle args over move r2,r1 ; shuffle args over move r1,r0 ; shuffle args over E 8 laddr r0,USRSTACK,l br r1 > r0,bad_addr move r4,r1 add r4,r3 br r4 > r0,bad_addr br move_loop ; copy form kernel to user space ; _copyout: ; copyout ( src, dest, length ) ; caddr_t src; ; paddr_t dest; ; int length; D 8 load r1,r14,PARAM1 load r2,r14,PARAM2 load r3,r14,PARAM3 E 8 I 8 move r3,r2 ; shuffle args over move r2,r1 ; shuffle args over move r1,r0 ; shuffle args over E 8 laddr r0,USRSTACK,l br r2 > r0,bad_addr move r4,r2 add r4,r3 br r4 > r0,bad_addr move_loop: br r3 < 8,even_odd move r4,r1 move r5,r2 and r4,7 br r4 = 0,srcdouble and r4,3 br r4 = 0,srcword and r4,1 br r4 = 0,srchalf br even_odd srcdouble: and r5,7 br r5 = 0,double_double srcword: and r5,3 br r5 = 0,word_word srchalf: and r5,1 br r5 = 0,half_half br even_odd double_double: loadd r4,r1,0 stored r4,r2,0 add r1,8 add r2,8 sub r3,8 br r3 >= 8,double_double ! br r3 = 0,endmove word_word: br r3 < 4,endword load r4,r1,0 store r4,r2,0 add r1,4 add r2,4 sub r3,4 br word_word endword: br r3 = 0,endmove half_half: br r3 < 2,even_odd loadh r4,r1,0 storeh r4,r2,0 add r1,2 add r2,2 sub r3,2 br half_half even_odd: br r3 = 0,endmove add r3,r1 byte_byte: loadb r0,r1,0 storeb r0,r2,0 add r1,1 add r2,1 br r3 <> r1,byte_byte ! endmove: E 5 movei r0,0 D 5 rum E 5 I 5 D 7 ret r11,r11 E 7 I 7 ret LINK,LINK E 7 I 9 endmoveErr: I 10 nop ; trigger analyzer E 10 br endmoveErr ; error catcher E 9 _copy_end: bad_addr: laddr r0,-1 D 7 ret r11,r11 E 7 I 7 ret LINK,LINK I 9 bad_addrErr: I 10 nop ; trigger analyzer E 10 br bad_addrErr ; error catcher E 9 E 7 E 5 E 1 h20286 s 00001/00001/00186 d D 4.5 87/04/16 17:37:39 dc 10 9 c dc - Add Bull updates from 03/05/87 e s 00003/00003/00184 d D 4.4 87/04/15 17:41:51 dc 9 8 c dc - changed #include "sys/..." to #include e s 00000/00001/00187 d D 4.3 87/02/20 16:23:51 build 8 7 c pass args in r0-r3 e s 00003/00003/00185 d D 4.2 87/02/20 15:40:30 build 7 6 c change r11 to LINK /dc e s 00000/00000/00188 d D 4.1 87/02/20 13:28:02 build 6 5 c rolled rev to -r4 /dc e s 00000/00000/00188 d D 3.1 87/01/19 09:20:57 build 5 4 c rolled rev to -r3 /dc e s 00000/00000/00188 d D 2.1 87/01/19 09:20:57 build 4 3 c AUTO NULL DELTA e s 00001/00000/00187 d D 1.3 87/01/16 10:13:45 build 3 2 c add ident string /dc e s 00001/00001/00186 d D 1.2 87/01/12 12:29:25 build 2 1 c change as9 to as e s 00187/00000/00000 d D 1.1 87/01/12 11:30:47 build 1 0 c Placed under source control - dc e u U f b f n t T I 3 D 10 ; "%W% %E%" E 10 I 10 ; " %W% %E% " E 10 E 3 I 1 D 9 #include "sys/ass.h" D 2 #include "sys/const.as9.h" E 2 I 2 #include "sys/const.as.h" E 2 #include "sys/maint.h" E 9 I 9 #include #include #include E 9 WSize equ 4 ; bytes per word PageSP2 equ 12 ; byte per page shifter ErOK equ 0 ; success OneMeg equ 1024*1024 ; One megabyte (2^20) EightMeg equ 8*OneMeg ; 8 megabytes ThirtyTwoMeg equ 32*OneMeg ; 32 megabytes MaxMemCards equ 8 ; 8 slots max MaxHWMemCards equ 128/4 ; Number of 4M cards in a full 128M headwall PagesPer16MemCard equ 64 ; 256K on a mem array board (16k RAMs) PagesPer64MemCard equ 256 ; 1024K on a mem array board (64k RAMs) PagesPer256MemCard equ 1024 ; 4Mb on a mem array board (256k RAMs) PagesPer1MMemCard equ 4096 ; 16Mb on a mem array board (1Mbit RAMs) TestPattern equ 055555555H ; .. to see if a memory board is present CCBEDBE equ 040CH ;K flag Offset ALIGN 4 ; Make sure table starts on word boundary VRTMemConfig: ; This is a table of 2-word entries. Each has a real address ; and a pages-per-card entry. If the real address wraps around ; to physical 0, then the controller is configured for the corresponding ; pages-per-card. MConfigRealAddr equ 0*WSize ; Offset for real address word MConfigPgPerCard equ 1*WSize ; Offset for pages-per-card word MConfigMaxCards equ 2*WSize ; Offset for pages-per-card word MConfigSize equ 3*WSize ; Size of each entry WORD EightMeg WORD PagesPer64MemCard ; 64k RAMs WORD MaxMemCards ; Max # of cards WORD ThirtyTwoMeg WORD PagesPer256MemCard ; 256k RAMs ( only for NEW VRT ) WORD MaxMemCards ; Max # of cards WORD 128*OneMeg WORD PagesPer1MMemCard ; 1M RAMs ( only for NEW VRT ) WORD MaxMemCards ; Max # of cards StdMemConfigEnd: StdMemConfigs equ (StdMemConfigEnd-VRTMemConfig) ; Std cpu options WORD 16*OneMeg ; Wrap point at 16 Mb WORD PagesPer256MemCard ; 4Mb per board WORD MaxMemCards/2 ; Max # of boards (4) WORD 128*OneMeg WORD PagesPer256MemCard ; 4Mb per board WORD MaxHWMemCards ; Max # of boards VRTMemConfigEnd: HwMemConfigs equ (VRTMemConfigEnd-StdMemConfigEnd); Headwall options NumMemConfigs equ (VRTMemConfigEnd-VRTMemConfig) ; Total options ; this routine is used to catch ecc errors during the memory size scan VRTInitTrap: MOVEI R13,ErOK+1 ; Bump error counter TRAPEXIT ; back to init routine LocalSize equ 8*WSize ; Size of local area global _sizememory _sizememory: LADDR R14,R14,-LocalSize ; Phase the stack STORED R6,R14,0*WSize ; Save regs STORED R8,R14,2*WSize ; Save regs STORED R10,R14,4*WSize ; Save regs STORED R12,R14,6*WSize ; Save regs D 7 ; Call on R11 E 7 I 7 ; Call on LINK E 7 ; Returns number of pages of physical memory as its value. ; The CCB pointer must be set up before calling this routine. ; This routine temporarily replaces the Execute Double Bit Error trap ; in order to trap references to non-existent memory (on headwall). ; Caller must set SR13 to 0 so that the microcode is in 'pte' mode, ; and the flush will take input from R0. ; ; See if a new (4M) memory controller is installed. ; Use Maint MACHINEID opcode to examine the feature test bit. ; If the machineid doesn't work then assume old memory controller, and ; use the 'old' 16K / 64K ram scanner MOVEI R1,0 ; get all zeros ; MACHINEID R0 ; Get the version BLOCK 1,04CH ; MAINT ... BLOCK 1,00AH ; ... R0,10 (MACHINEID) STORE R0,_machineid,L ; Save machine id for later STORE R1,_ftbits,L ; Save feature test bits for later LADDR R3,FTPageTables ; extract page table bit AND R3,R1 ; extract page table bit STORE R3,_ftPageTables,L; save in global memory cell ;... extract 'last' feature test bit into R3 MOVEI R3,FTHeadwall ; extract headwall bit AND R3,R1 ; extract headwall bit STORE R3,_ftHeadwall,L; save in global memory cell MOVE R13,SR11 ; Get RBUG CPU control block pointer LOAD R10,R13,CCBEDBE ; Get existing trap vector LADDRP R12,VRTInitTrap ; Get addr of our trap handler STORE R12,R13,CCBEDBE ; Plug into ccb for a moment ; Find out what size memory system this controller is set up to handle. ; We do this by determining the first known real address boundary which ; wraps around to physical address 0. The boundaries are : ; 8M, 32M, and 128M. The 32M boundary is only applicable to the extended ; mem controller. LADDR R8,-HwMemConfigs ; Get loop counter Headwall only LADDR R9,-HwMemConfigs ; Start at first slot in headwall table BR R3=FTHeadwall,VRTI00 ; For headwall, use headwall table LADDR R8,-StdMemConfigs ; Get loop counter for std cpu LADDR R9,-NumMemConfigs ; Start at first slot in std cpu table VRTI00: LADDR R5,TestPattern,L; Get some bits VRTI01: LOADP R4,R9,VRTMemConfigEnd+MConfigRealAddr ; Get boundary address MOVEI R13,ErOK ; Clear trap notation register LOAD R3,R4 ; Get existing data from boundary addr. STORE R5,R4 ; Plug in the test pattern at boundary addr MOVEI R0,3 ; Flush tmt and cache FLUSH ; Throw out any cached data LOAD R7,R4 ; Get it back BR R7<>R5,VRTI03 ; if Not the same, try next boundary LOAD R6,0 ; boundary addressable, get present absolute 0 STORE R3,R4 ; Replace our divot in boundary BR R13<>ErOK,VRTI03; Try next wrap point if any trap occurred BR R7=R6,VRTI05 ; If Same as present addr 0, wrap on this config VRTI03: STORE R3,R4 ; Replace our divot in boundary ADDI R9,MConfigSize ; Step to next table slot LOOP R8,MConfigSize,VRTI01 ; Try next boundary LADDR R9,-NumMemConfigs ; No luck, use small mem VRTI05: LOADP R8,R9,VRTMemConfigEnd+MConfigMaxCards ; Get Max possible mem cards NEG R8,R8 ; Make this a loop counter LOADP R9,R9,VRTMemConfigEnd+MConfigPgPerCard ; Get pages/card ; Find the highest contiguous memory card installed ; R8 -(max number of mem cards) ; R9 Pages per card MOVE R3,R9 ; R3 Counts # pages found VRTI10: MOVE R4,R3 ; Copy page number LSLI R4,PageSP2 ; Make real address LADDR R5,TestPattern,L; Get some bits MOVEI R13,ErOK ; Clear trap notation register LOAD R6,R4 ; Get existing data STORE R5,R4 ; Plug in the test pattern MOVEI R0,3 ; Flush tmt and cache FLUSH ; Throw out any cached data LOAD R7,R4 ; Get it back BR R5<>R7,VRTI20 ; Not the same? no mem BR R13<>ErOK,VRTI20; Any traps means no memory here NOT R5,R5 ; Make sure by flipping the bits STORE R5,R4 ; Plug NOT of TestPattern in MOVEI R0,3 ; Flush tmt and cache FLUSH ; Throw out any cached data LOAD R7,R4 ; Get it back BR R5<>R7,VRTI20 ; No match, no mem BR R13<>ErOK,VRTI20; Any traps means no memory here STORE R6,R4 ; Replace our divot ADD R3,R9 ; Account for this page LOOP R8,1,VRTI10 ; Try the next card SUB R3,R9 ; Undo the last one VRTI20: STORE R6,R4 ; Replace our divot MOVE R13,SR11 ; Get RBUG CPU control block pointer STORE R10,R13,CCBEDBE ; Replace trap vector MOVE R0,R3 ; return number of pages as routine value LOADD R6,R14,0*WSize ; Restore regs LOADD R8,R14,2*WSize ; Restore regs LOADD R10,R14,4*WSize ; Restore regs LOADD R12,R14,6*WSize ; Restore regs LADDR R14,R14, LocalSize ; Phase the stack D 7 RET R11,R11 ; All done E 7 I 7 RET LINK,LINK ; All done E 7 ; Headwall light manipulation code ; Called only on headwall processor ; One input arg: non-zero if light is to be turned on, zero if light is ; to be turned off. global _headwallLight _headwallLight: D 8 load r0,r14,PARAM1 ; get the argument E 8 test r0<>0 ; get 1 if non-zero mpyi r0,HWClockDataOut; get bit to turn on byte MAINTOP byte RR(0,CREG) ; turn on (or off) the light D 7 ret r11,r11 ; done E 7 I 7 ret LINK,LINK ; done E 7 E 1 h61736 s 00055/00000/00333 d D 4.11 87/05/07 13:42:06 dc 19 17 c dc - Add headwall clock interactions e s 00055/00000/00333 d R 4.11 87/05/07 13:39:30 dc 18 17 c dc - Add headwall clock interactions e s 00001/00001/00332 d D 4.10 87/05/06 13:32:29 dc 17 16 c dc - Change Headwall LoadEnable e s 00028/00003/00305 d D 4.9 87/04/27 17:36:00 dc 16 15 c dc - Add support for load_enable, ucode version e s 00006/00003/00302 d D 4.8 87/04/23 19:50:47 dc 15 13 c dc - __HeadwallDiag accepts SYSVA e s 00001/00001/00304 d R 4.8 87/04/23 16:09:30 dc 14 13 c dc - Add SYSVA to PMHWB... reference e s 00027/00000/00278 d D 4.7 87/04/22 15:45:01 dc 13 12 c dc - Add headwall diagnostic functions e s 00004/00004/00274 d D 4.6 87/04/16 17:39:41 dc 12 11 c dc - Add Bull updates from 03/05/87 e s 00003/00003/00275 d D 4.5 87/04/15 17:42:00 dc 11 10 c dc - changed #include "sys/..." to #include e s 00004/00006/00274 d D 4.4 87/03/25 21:25:21 dc 10 9 c fix arg passing in addupc: fuword / suword e s 00027/00021/00253 d D 4.3 87/02/20 16:41:58 build 9 8 c pass args in r0-r3 e s 00014/00014/00260 d D 4.2 87/02/20 15:41:22 build 8 7 c change r11 to LINK /dc e s 00000/00000/00274 d D 4.1 87/02/20 13:28:05 build 7 6 c rolled rev to -r4 /dc e s 00003/00003/00271 d D 3.3 87/02/13 13:27:56 build 6 5 c add bull changes from Jan 23 /dc e s 00003/00003/00271 d D 3.2 87/01/27 09:47:57 build 5 4 c add page table changes /dc e s 00000/00000/00274 d D 3.1 87/01/19 09:20:59 build 4 3 c rolled rev to -r3 /dc e s 00000/00000/00274 d D 2.1 87/01/19 09:20:59 build 3 2 c AUTO NULL DELTA e s 00001/00000/00273 d D 1.2 87/01/16 10:13:48 build 2 1 c add ident string /dc e s 00273/00000/00000 d D 1.1 87/01/09 15:59:15 build 1 0 c Placed under source control - dc e u U f b f n t T I 2 D 12 ; "%W% %E%" E 12 I 12 ; " %W% %E% " E 12 E 2 I 1 D 11 #include "sys/psl.h" #include "sys/ass.h" #include "sys/trap.h" E 11 I 11 #include #include #include I 13 #include #include #include E 13 E 11 global _addupc align 4 ; addupc ( pc , &u.u_prof , ?? ) _addupc: I 9 addupc_stk equ 72 ; size of local stack frame E 9 D 8 store r11,r14,0 E 8 I 8 store LINK,r14,0 E 8 D 9 store r15,r14,8 move r15,r14 laddr r14,r14,-72 load r0,r15,PARAM3 E 9 I 9 store r0,r14,STKPARAM1 ; push args back on stack for simplicty store r1,r14,STKPARAM2 ; push args back on stack for simplicty store r2,r14,STKPARAM3 ; push args back on stack for simplicty laddr r14,r14,-addupc_stk ; phase stack in case we call others load r0,r14,addupc_stk+STKPARAM3 E 9 br r0 = 0,addret ; useful only if trace D 9 load r0,r15,PARAM1 ; pc load r2,r15,PARAM2 ; &u.u_prof E 9 I 9 load r0,r14,addupc_stk+STKPARAM1 ; pc load r2,r14,addupc_stk+STKPARAM2 ; &u.u_prof E 9 load r1,r2,8 ; u.u_prof.pr_off sub r0,r1 ; corrected pc = pc -u_prof.pr_off br r0 < 0,addret lsr r0,1 ; logical right shift load r1,r2,12 ; u.u_prof.pr_scale lsr r1,1 ; ditto for scale empy r0,r1 dlsr r0,14 br r0 <> 0,addret add r1,1 laddr r0,0fffcH ; word alignement and r1,r0 load r0,r2,4 ; u.u_prof.pr_size br r1 >= r0,addret load r0,r2,0 ; u.u_prof.pr_base D 10 add r1,r0 D 9 store r1,r14,PARAM1 E 9 I 9 store r1,r14,STKPARAM1 E 9 store r1,r14,4 ; save the address E 10 I 10 add r0,r1 store r0,r14,4 ; save the address E 10 D 8 call r11,_fuword,l E 8 I 8 call LINK,_fuword,l E 8 br r0 < 0,adderr D 9 load r3,r15,PARAM3 E 9 I 9 load r3,r14,addupc_stk+STKPARAM3 E 9 add r0,r3 adderr: D 10 load r1,r14,4 ; restore the saved address D 9 store r1,r14,PARAM1 store r0,r14,PARAM2 E 9 I 9 store r1,r14,STKPARAM1 store r0,r14,STKPARAM2 E 10 I 10 move r1,r0 ; shuffle new count to arg2 load r0,r14,4 ; restore the saved address E 10 E 9 D 8 call r11,_suword,l E 8 I 8 call LINK,_suword,l E 8 br r0 = 0,addret movei r0,0 D 9 load r1,r15,PARAM2 E 9 I 9 load r1,r14,addupc_stk+STKPARAM2 E 9 store r0,r1,0 store r0,r1,12 ; u.u_prof.pr_scale = 0 addret: D 8 load r11,r15,0 E 8 I 8 D 9 load LINK,r15,0 E 8 move r14,r15 load r15,r15,8 E 9 I 9 laddr r14,r14,addupc_stk load LINK,r14,0 E 9 D 8 ret r11,r11 E 8 I 8 ret LINK,LINK E 8 align 4 global _spl1,_spl4 _spl1: _spl4: laddr r5,spl1 kcall 255 spl1: move r2,sr7 move r1,r2 and r2,PS_IPL and r1,PS_ITS+PS_SV D 5 #ifdef MLDEBUG E 5 I 5 D 6 #ifdef OSDEBUG E 6 I 6 D 12 #ifdef MLDEBUG E 12 I 12 #ifdef KDB E 12 E 6 E 5 br r1 <> 0,spl100 D 8 call r11,_call_debug,l E 8 I 8 call LINK,_call_debug,l E 8 spl100: #endif add r1,LVL1 move sr7,r1 ; level 1 in PS move r1,sr14 D 8 move sr15,r11 store r11,r1,PC E 8 I 8 move sr15,LINK store LINK,r1,PC E 8 ; MASK laddr r0,MASK halfword I_MASK br r2 <= 1,spl110 ; if we raise level, no problem spl120: ; if we decreased level, we must see if no timer interrupt is pending load r0,_tictac1,l br r0 = 0,spl110 sub r0,1 store r0,_tictac1,l ; timer interrupt while on higher level store r2,r1,REG0 br Xcl100 spl110: move r0,r2 rum align 4 global _spl5,_spl6,_spl7,_splhi _spl5: _spl6: _spl7: _splhi: laddr r5,splhi kcall 255 splhi: move r2,sr7 move r1,r2 and r2,PS_IPL and r1,PS_ITS+PS_SV D 5 #ifdef MLDEBUG E 5 I 5 D 6 #ifdef OSDEBUG E 6 I 6 D 12 #ifdef MLDEBUG E 12 I 12 #ifdef KDB E 12 E 6 E 5 br r1 <> 0,splh00 D 8 call r11,_call_debug,l E 8 I 8 call LINK,_call_debug,l E 8 splh00: #endif add r1,LVL2 move sr7,r1 ; level 2 in PS D 8 move sr15,r11 E 8 I 8 move sr15,LINK E 8 ; MASK laddr r0,MASK halfword I_MASK move r0,r2 rum align 4 global _spl0 _spl0: laddr r5,spl0 kcall 255 spl0: move r2,sr7 move r1,r2 and r2,PS_IPL and r1,PS_ITS+PS_SV D 5 #ifdef MLDEBUG E 5 I 5 D 6 #ifdef OSDEBUG E 6 I 6 D 12 #ifdef MLDEBUG E 12 I 12 #ifdef KDB E 12 E 6 E 5 br r1 <> 0,spl000 D 8 call r11,_call_debug,l E 8 I 8 call LINK,_call_debug,l E 8 spl000: #endif move sr7,r1 ; level 0 in PS move r1,sr14 D 8 move sr15,r11 store r11,r1,PC E 8 I 8 move sr15,LINK store LINK,r1,PC E 8 ; UNMASK laddr r0,UNMASK halfword I_MASK br r2 <= 1,spl010 ; if we were under the timer level, ; ; no problem spl020: load r0,_tictac1,l br r0 = 0,spl010 sub r0,1 store r0,_tictac1,l ; timer interrupt while on higher level store r2,r1,REG0 br Xcl100 spl010: move r0,r2 rum align 4 global _splx _splx: D 9 load r0,r14,PARAM1 E 9 I 9 ; Input ; r0 level at which to resume E 9 br r0 = 0,_spl0 br r0 = 1,_spl1 br _splhi ; searchdir(buf, n, target) - search a directory for target ; returns offset of match, or empty slot, or -1 I 9 ; Input ; r0 pointer to directory buffer ; r1 size of the directory in bytes ; r2 target name E 9 global _searchdir _searchdir: store r6,r14,0 store r7,r14,4 store r8,r14,8 D 9 load r0,r14,PARAM1 ; pointer to directory load r1,r14,PARAM2 ; directory length in bytes E 9 I 9 store r0,r14,STKPARAM1 ; stash pointer to directory store r2,r14,STKPARAM3 ; stash pointer to target E 9 laddr r3,16 ; sizeof(struct direct) movei r4,0 ; pointer to empty slot s_top: D 9 load r2,r14,PARAM3 ; pointer to target E 9 I 9 load r2,r14,STKPARAM3 ; pointer to target E 9 br r1 < r3,sdone ; count less than 16? loadh r5,r0,0 ; directory entry empty? br r5 = 0,sempty ; jump if true movei r5,0 laddr r6,r0,2 ; pointer to file name in directory s_loop: loadh r7,r2,0 loadh r8,r6,0 br r7 <> r8,scont add r2,2 add r5,2 add r6,2 br r5 < 14, s_loop smatch: D 9 load r1,r14,PARAM1 E 9 I 9 load r1,r14,STKPARAM1 E 9 br ssuc scont: add r0,r3 ; increment directory pointer sub r1,r3 ; decrement size br s_top sempty: ; ; do we need an empty slot? br r4 <> 0,scont ; jump if no move r4,r0 ; save current offset br scont ; and goto to next entry sdone: D 9 load r1,r14,PARAM1 E 9 I 9 load r1,r14,STKPARAM1 E 9 move r0,r4 ; save failure return br r0 <> 0,ssuc ; empty slot found? movei r1,1 ssuc: sub r0,r1 load r6,r14,0 load r7,r14,4 load r8,r14,8 D 8 ret r11,r11 E 8 I 8 ret LINK,LINK I 13 align 4 D 15 global _HeadwallDiag E 15 I 15 global __HeadwallDiag E 15 ; Returns 1 if headwall processor AND diag mode, 0 otherwise I 15 ; Called with 1 arg : SYSVA (since we can't include in assembly ; code) E 15 D 15 _HeadwallDiag: E 15 I 15 __HeadwallDiag: MOVE R4,R0 ; Save SYSVA E 15 MOVEI R1,0 ; get all zeros D 16 ; MACHINEID R0 ; Get the version BLOCK 1,04CH ; MAINT ... BLOCK 1,00AH ; ... R0,10 (MACHINEID) E 16 I 16 BYTE MAINTOP ; MAINT ... BYTE RR(0,MACHINEID) ; ... R0,10 (MACHINEID) E 16 MOVEI R3,FTHeadwall ; extract headwall bit AND R1,R3 ; mask off just that one BR R1=0,NotHW ; quit if not a headwall D 15 LOADB R0,PMHWBootAux,L; Get diagnostic byte E 15 I 15 LOADB R0,R4,PMHWBootAux,L; Get diagnostic byte E 15 LADDR R1,PMHWBDiag ; Get diag bit mask AND R0,R1 ; Extract just this bit BR R0=0,NotHW ; if bit is off, return false MOVE R0,1 ; return true for hw AND diag mode RET LINK,LINK NotHW: MOVE r0,0 ; return false for most cases RET LINK,LINK E 13 E 8 I 16 ; _HWLoadEnable ; (Headwall ONLY) Returns the current state of ; load enable (as placed by the clock board in phys mem). ; The caller must ensure that this runs only on a headwall ; Input - ; R0 SYSVA ; Output - ; R0 1 if load is enabled, 0 if load is disabled global _HWLoadEnable _HWLoadEnable: D 17 LOADB R0,R0,PMHWBootAux,L; Get diagnostic byte E 17 I 17 LOADB R0,R0,PMHWBoot,L; Get diagnostic byte E 17 ANDI R0,PMHWBFast ; Extract fast boot bit, return that RET LINK,LINK ; _R32LoadEnable ; (R32, usually) Returns the current state of ; load enable (as discovered by a ELOGR instruction) ; Output - ; R0 1 if load is enabled, 0 if load is disabled global _R32LoadEnable _R32LoadEnable: BYTE MAINTOP ; MAINT ... BYTE RR(0,ELOGR) ; ... R0,00 (ELOGR) ANDI R0,1 ; Extract load enable bit, return that RET LINK,LINK I 19 ; ; HWSerCmd ; This routine does an n bit transaction with the headwall clock ; board. The caller must ensure that the kernel is really running on ; a headwall processor before calling this routine. ; It is assume that the clock board protocol is idle before entering ; this routine. ; Bit number 32-n is the first to go out, and bit 31 is the last one out. ; Input ; R0 bits to go out (right justified in the register) ; R1 Number of bits in the transaction ; LINK return address ; Output ; R2 bits returned by the clock board BitsPerWord equ 32 global _HWSerCmd _HWSerCmd: NEG R1,R1 ; Loop counter for number of bits to do LADDR R2,R1,BitsPerWord ; get number of bits to shift BR R2<=0,HWSC10 ; Skip if full word is going out LSL R0,R2 ; Move the bits to the left of the word HWSC10: MOVEI R2,0 ; Clear incoming bits HWSC20: MOVEI R3,HWClockDataOut ; Assume there is a bit going out BR R0<0,HWSC30 ; go if this is true MOVEI R3,0 ; sign bit is off, turn off data bit HWSC30: ADDI R3,HWClockReq ; Turn on the request bit HWSC40: ; CREG R3 ; Turn on the req bit, and the data bit BLOCK 1,MAINTOP ; MAINT ... BLOCK 1,RR(3,CREG) ; ... R3,CREG MOVE R5,R4 ; Copy ack bits ANDI R4,HWClockAck ; Wait for the clock board to pick it up BR R4=0,HWSC40 ; Wait for clock to raise ack MOVEI R3,0 ; Turn off the request bit HWSC50: ; CREG R3 ; Turn it off BLOCK 1,MAINTOP ; MAINT ... BLOCK 1,RR(3,CREG) ; ... R3,CREG ANDI R4,HWClockAck ; Wait for the clock board to pick it up BR R4<>0,HWSC50 ; Wait for clock to drop ack ANDI R5,HWClockDataIn; Extract just the clock's bit TEST R5<>0 ; Get a one if clock gave data LSLI R2,1 ; move previous bits over ADD R2,R5 ; Include this clock bit LSLI R0,1 ; Shift the next bit in LOOP R1,1,HWSC20 ; Do 'em all MOVE R0,R2 ; Return the assembled bits from the clock board RET LINK,LINK ; Back to the caller E 19 E 16 E 1 h15310 s 00015/00005/00290 d D 4.5 87/04/16 17:28:54 dc 10 9 c dc - Add Bull updates from 03/05/87 e s 00000/00001/00295 d D 4.4 87/03/12 18:31:01 dc 9 8 c remove extra Xkcall e s 00001/00001/00295 d D 4.3 87/03/12 18:13:53 dc 8 7 c ... illinstr e s 00263/00262/00033 d D 4.2 87/03/12 18:06:47 dc 7 6 c hook up to kernel trap handlers e s 00000/00000/00295 d D 4.1 87/02/20 13:28:10 build 6 5 c rolled rev to -r4 /dc e s 00266/00267/00029 d D 3.2 87/01/27 09:41:59 build 5 4 c add page table changes /dc e s 00000/00000/00296 d D 3.1 87/01/19 09:21:02 build 4 3 c rolled rev to -r3 /dc e s 00000/00000/00296 d D 2.1 87/01/19 09:21:02 build 3 2 c AUTO NULL DELTA e s 00001/00000/00295 d D 1.2 87/01/16 10:13:52 build 2 1 c add ident string /dc e s 00295/00000/00000 d D 1.1 87/01/09 15:59:08 build 1 0 c Placed under source control - dc e u U f b f n t T I 2 D 10 ; "%W% %E%" E 10 I 10 ; " %W% %E% " E 10 E 2 I 1 ; ; SPS9 CCB ; global _ccb dsect data align 8 _ccb: _kcall0: word Xsyscall ; system calls D 5 ; word tsyscall ; system calls (t for temporary) word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall E 5 I 5 D 7 word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall word _i_kcall ; invalid kcall E 7 I 7 word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall word Xkcall ; invalid kcall D 9 word Xkcall ; invalid kcall E 9 E 7 E 5 word _kcall254 ; system reserved word _kcall255 ; system reserved _exceptions: D 5 word Xalign 2 * ) ( ' & % $ # " !                           h14551 s 00001/00000/00207 d D 4.10 87/04/27 17:45:50 dc 19 18 c dc - Add support for load_enable, ucode version e s 00010/00001/00197 d D 4.9 87/04/27 17:36:08 dc 18 17 c dc - Add support for load_enable, ucode version e s 00018/00004/00180 d D 4.8 87/04/16 17:54:51 dc 17 16 c dc - Add Bull updates from 03/05/87 e s 00002/00002/00182 d D 4.7 87/04/15 17:42:12 dc 16 15 c dc - changed #include "sys/..." to #include e s 00003/00003/00181 d D 4.6 87/04/07 08:31:05 dc 15 14 c save incoming arguments e s 00009/00010/00175 d D 4.5 87/03/20 10:54:38 build 14 13 c add comments e s 00002/00002/00183 d D 4.4 87/03/12 18:22:28 dc 13 12 c remove calls to kdb e s 00004/00007/00181 d D 4.3 87/02/20 17:10:50 build 12 11 c pass args in r0-r3 e s 00011/00011/00177 d D 4.2 87/02/20 15:43:15 build 11 10 c change r11 to LINK /dc e s 00000/00000/00188 d D 4.1 87/02/20 13:28:15 build 10 9 c rolled rev to -r4 /dc e s 00004/00001/00184 d D 3.3 87/02/16 10:40:45 build 9 8 c replace fdlp_dcb e s 00024/00038/00161 d D 3.2 87/01/27 09:50:23 build 8 7 c add page table changes /dc e s 00000/00000/00199 d D 3.1 87/01/19 09:21:05 build 7 6 c rolled rev to -r3 /dc e s 00000/00000/00199 d D 2.1 87/01/19 09:21:05 build 6 5 c AUTO NULL DELTA e s 00001/00000/00198 d D 1.5 87/01/16 10:13:56 build 5 4 c add ident string /dc e s 00001/00001/00197 d D 1.4 87/01/13 15:53:40 build 4 3 c comment out debugger call just before main e s 00006/00001/00192 d D 1.3 87/01/12 12:25:33 build 3 2 c add ftHeadwall and ftPageTables e s 00011/00001/00182 d D 1.2 87/01/12 11:27:59 build 2 1 c update for better memory scanner e s 00183/00000/00000 d D 1.1 87/01/09 15:59:16 build 1 0 c Placed under source control - dc e u U f b f n t T I 5 D 17 ; "%W% %E%" E 17 I 17 ; " %W% %E% " E 17 E 5 I 1 D 16 #include "sys/ass.h" #include "sys/psl.h" E 16 I 16 #include #include I 18 #include #include E 18 E 16 ; csect code D 8 global _start,_start1,tsyscall E 8 I 8 D 18 global _start,tsyscall E 18 I 18 global _start E 18 E 8 align 4 ; _start: I 15 move r6,r0 ; bootdev move r7,r1 ; unit move r8,r2 ; partition number E 15 D 8 ; laddr r14,1fff00H,L ; temporary stack high up in memory ; laddr r14,r14,-72 ; laddr r0,_start,L ; store r0,r14,24 ; call r11,_auto_move,l; move the image from ???? to 0 _start1: E 8 laddr r0,_ccb,L move sr11,r0 ; set up initial ccb block I 8 movei r0,0 move sr13,r0 ; go to new addresssing mode E 8 ; ***************************************************************** ; ; Awful patch because of microcode version 262 bug in kcall ; ; br strt0123 ; ; syscall (kcall 0) ; tsyscall: D 8 flush E 8 I 8 movei r0,3 ; throw out cache and tmt flush ; ... old bugs E 8 sus r0,r6 D 17 br syscall E 17 I 17 br syscall,l E 17 strt0123: ; ; End of patch ; ; ****************************************************************** D 12 load r6,r14,PARAM1 ; bootdev load r7,r14,PARAM2 ; unit load r8,r14,PARAM3 ; partition number E 12 I 12 D 15 move r6,r0 ; bootdev move r7,r1 ; unit move r8,r2 ; partition number E 15 E 12 laddr r14,ispstend,L ; temporary stack start2: ; I 2 ; calculate size of memory ; D 11 call r11,_sizememory,L ; find out how much memory is here E 11 I 11 call LINK,_sizememory,L ; find out how much memory is here E 11 ; E 2 ; calculate size of memory and clear all memory above edata ; D 2 call r11,_size_clrmem,L E 2 I 2 D 12 store r0,r14,PARAM1 ; pass number of pages to clear routine E 12 D 11 call r11,_clrmem,L E 11 I 11 call LINK,_clrmem,L E 11 E 2 ; D 14 store r0,__last_addr,l E 14 I 14 store r0,__last_addr,l ; save memsize E 14 ; I 18 ; ... for convenience, get the microcode version number, and save in memory BYTE MAINTOP BYTE RR(0,MCODEVERSION) ; get the u-code version number into r0 STORE R0,_mcversion,L ; save in memory ; E 18 ; setup system disc device parameters ; store r6,_bootdev,l lsli r7,4 or r7,r8 storeh r7,_rootdev,l storeh r7,_pipedev,l ; D 8 call r11,_init_ccb,L ; initialize the ccb ; call r11,_call_debug,l E 8 I 8 D 11 call r11,_kdb_init,L ; initialize the kernel debugger E 11 I 11 D 17 call LINK,_kdb_init,L ; initialize the kernel debugger E 17 I 17 #ifdef KDB call LINK,_kdb_init,L ; initialize the kernel debuger #endif E 17 E 11 E 8 ; ; init system pt entries, memory maps, proc 0 ; I 8 ; D 11 call r11,_call_debug,l E 11 I 11 D 13 call LINK,_call_debug,l E 13 I 13 ; call LINK,_call_debug,l E 13 E 11 E 8 D 14 load r0,__last_addr,l D 12 store r0,r14,PARAM1 ; r0 contains the last address laddr r0,start3,L store r0,r14,PARAM2 ; startpc of proc 0 E 12 I 12 laddr r1,start3,L E 12 D 11 call r11,_vadrspace,L E 11 I 11 call LINK,_vadrspace,L E 14 I 14 load r0,__last_addr,l ; arg 0 - size of memory laddr r1,start3,L ; arg 1 - p0 start address call LINK,_vadrspace,L ; setup system maps and proc 0 E 14 E 11 ; D 8 ; Compute physical address of system vrt and system pcb for proc 0 E 8 I 8 ; Compute physical address of system section and system pcb for proc 0 E 8 ; D 8 laddr r0,_sys_vrt,l move sr12,r0 laddr r0,VRTMASK move sr13,r0 E 8 I 8 D 14 laddr r0,_sys_sect,l laddr r1,07fffffffH,l E 14 I 14 laddr r0,_sys_sect,l ; point to sys virt addr of section table laddr r1,07fffffffH,l ; turn off sys virtual bit E 14 and r1,r0 D 14 strt004: E 14 move sr9,r1 ; physical address of system section E 8 D 14 laddr r1,KERNSTACK-PCBSZ,l D 8 loadh r0,_sys_segno,l trans r2,r0 E 8 I 8 trans r2,r1 E 8 br r2 >= 0, strt010 E 14 I 14 laddr r1,KERNSTACK-PCBSZ,l ; point to sys virt addr of pcb trans r2,r1 ; translate to phys addr (using sys pte) br r2 >= 0, strt010; go if this works E 14 strt005: I 17 #ifdef KDB E 17 D 11 call r11,_call_debug,l E 11 I 11 call LINK,_call_debug,l I 17 #endif E 17 E 11 br strt005 I 8 E 8 strt010: move sr14,r2 ; physical address of system pcb for proc 0 move sr6,r1 ; logical address of system pcb for proc 0 laddr r0,PS_SV ; proc 0 on kernel mode move sr7,r0 lus r0,r15 ; switch to proc 0 in user privilege mode rum ; on kernal stack ; start3: ; ; startup, fork of etc/init ; main returns start address for new process. ; D 4 call r11,_call_debug,l E 4 I 4 D 8 ; call r11,_call_debug,l E 8 I 8 D 11 call r11,_call_debug,l E 8 E 4 call r11,_main,L E 11 I 11 D 13 call LINK,_call_debug,l E 13 I 13 D 17 ; call LINK,_call_debug,l E 17 I 17 #ifdef KDB br start033 ; patch to 'NOP' to enable debug call LINK,_call_debug,l start033: #endif E 17 E 13 call LINK,_main,L E 11 ; ; proc 0 and his children (/etc/init,vhand ...) ; return to be continued as described below. ; r0 contains the start address (sched ,zero for etc/init,vhand) ; switch to kernel mode by Kcall 255 with r5 on start4 ; compute the physical address of user pcb, store that value into sr14 ; load user saved registers and return to user mode by rum. ; laddr r5,start4,l kcall 255 ; switch to kernel mode ; start4: br r0 <> 0,start5 laddr r2,_u,l D 8 loadh r1,_sys_segno,L trans r0,r1 E 8 I 8 trans r0,r2 E 8 br r0 < 0,start41 move sr14,r0 ; physical address of etc/init pcb move r2,r0 D 8 laddr r0,_user_vrt,l move sr12,r0 ; address of user vrt laddr r0,VRTMASK move sr13,r0 E 8 movei r0,0 D 8 move sr7,r0 ; privileged user mode E 8 I 8 move sr7,r0 ; user mode E 8 store r0,r2,PSL laddr r0,_u,l move sr6,r0 store r0,r2,SREG6 D 8 move r0,sr12 move r1,sr13 stored r0,r2,SREG12 E 8 lus r0,r15 rum start41: I 17 #ifdef KDB E 17 D 11 call r11,_call_debug,L ; should not return from etc/init E 11 I 11 call LINK,_call_debug,L ; should not return from etc/init I 17 #endif E 17 E 11 br start41 ; ; continue execution of proc 0 or vhand in user privilege mode ; start5: laddr r2,_u,l D 8 loadh r1,_sys_segno,L trans r0,r1 E 8 I 8 trans r0,r2 E 8 br r0 >= 0,start6 start51: I 17 #ifdef KDB E 17 D 11 call r11,_call_debug,L E 11 I 11 call LINK,_call_debug,L I 17 #endif E 17 E 11 br start51 start6: move sr14,r0 ; physical address of user pcb move r2,r0 laddr r0,PS_SV D 8 move sr7,r0 ; user mode E 8 I 8 move sr7,r0 ; privileged user mode E 8 store r0,r2,PSL laddr r0,_u,l move sr6,r0 store r0,r2,SREG6 D 8 move r0,sr12 move r1,sr13 stored r0,r2,SREG12 E 8 lus r0,r15 rum start61: I 17 #ifdef KDB E 17 D 11 call r11,_call_debug,L ; should not return from proc 0 or vhand E 11 I 11 call LINK,_call_debug,L ; should not return from proc 0 or vhand I 17 #endif E 17 E 11 br start61 D 8 global _fdlp_dcb,__last_addr,_proc0_u E 8 I 8 D 9 global __last_addr,_proc0_u E 9 I 9 global _fdlp_dcb,__last_addr,_proc0_u E 9 E 8 global _rootdev,_pipedev,_bootdev global intstack I 2 D 3 global _ftbits, _machineid E 3 I 3 global _ftbits, _ftPageTables, _ftHeadwall global _machineid I 19 global _mcversion E 19 E 3 E 2 dsect data align 8 intstack0: space 4096 intstack: I 9 align 4096 _fdlp_dcb: space 4096 E 9 D 8 align 4096 _fdlp_dcb: space 4096 E 8 _proc0_u: space USIZE*4096 __last_addr: word 0 _rootdev: halfword 0 _pipedev: halfword 0 _bootdev: I 2 word 0 _ftbits: I 3 word 0 _ftPageTables: word 0 _ftHeadwall: E 3 word 0 _machineid: I 18 word 0 _mcversion: E 18 E 2 word 0 E 1 h33148 s 00003/00001/00085 d D 4.6 87/04/27 17:43:18 dc 15 14 c dc - Add support for load_enable, ucode version e s 00004/00001/00082 d D 4.5 87/04/22 16:01:53 dc 14 13 c dc - Add headwall diagnostic functions e s 00005/00006/00078 d D 4.4 87/04/16 17:27:17 dc 13 12 c dc - Add Bull updates from 03/05/87 e s 00003/00004/00081 d D 4.3 87/02/25 17:55:44 dc 12 11 c change CFLAGS to DFLAGS; ASFLAGS to ASFLAGS2 Map INCRT to INC e s 00001/00001/00084 d D 4.2 87/02/24 17:31:52 build 11 10 c add OSDEBUG to OPTIONS e s 00000/00000/00085 d D 4.1 87/02/20 13:30:43 build 10 9 c rolled rev to -r4 /dc e s 00001/00001/00084 d D 3.3 87/02/13 13:29:33 build 9 8 c add bull changes from Jan 23 /dc e s 00002/00002/00083 d D 3.2 87/01/27 09:58:39 build 8 7 c add page table changes /dc e s 00000/00000/00085 d D 3.1 87/01/19 09:21:07 build 7 6 c rolled rev to -r3 /dc e s 00000/00000/00085 d D 2.1 87/01/19 09:21:07 build 6 5 c AUTO NULL DELTA e s 00001/00000/00084 d D 1.5 87/01/16 10:13:59 build 5 4 c add ident string /dc e s 00001/00001/00083 d D 1.4 87/01/12 12:29:46 build 4 3 c change as9 to as e s 00007/00001/00077 d D 1.3 87/01/12 11:37:35 build 3 2 c add memscan to procedure e s 00011/00046/00067 d D 1.2 87/01/09 16:18:47 build 2 1 c Add sccs stuff to make rules. /dc e s 00113/00000/00000 d D 1.1 87/01/09 15:47:11 build 1 0 c Placed under source control - dc e u U f b f n t T I 5 D 13 # "%W% %E%" E 13 I 13 # " %W% %E% " E 13 E 5 I 1 LIBNAME = LIB0.a D 12 INCRT = $(SPX)/usr/include D 9 OPTIONS = -DOSDEBUG E 9 I 9 D 11 OPTIONS = -DMLDEBUG E 11 I 11 OPTIONS = -DMLDEBUG -DOSDEBUG E 11 E 9 CFLAGS = -O -I$(INCRT) $(OPTIONS) D 2 CC = cc -c AS = as -I$(INCRT) $(OPTIONS) FRC = E 2 I 2 ASFLAGS = -I$(INCRT) $(OPTIONS) E 12 I 12 INCRT = $(INC) D 13 DFLAGS = -DMLDEBUG -DOSDEBUG E 13 I 13 DFLAGS = -Dmldebug -Dosdebug -DKDB E 13 ASFLAGS2= $(DFLAGS) E 12 E 2 D 8 CFILES = $(LIBNAME)(ccopy.o) E 8 I 8 CFILES = $(LIBNAME)(mapa.o) E 8 SFILES = $(LIBNAME)(trap.o) $(LIBNAME)(paging.o)\ $(LIBNAME)(start.o) $(LIBNAME)(cswitch.o)\ D 13 $(LIBNAME)(userio.o) $(LIBNAME)(copy.o)\ $(LIBNAME)(math.o) $(LIBNAME)(misc.o)\ D 3 $(LIBNAME)(end.o) $(LIBNAME)(low.o) $(LIBNAME)(ccb.o) E 3 I 3 $(LIBNAME)(end.o) $(LIBNAME)(low.o) $(LIBNAME)(ccb.o)\ $(LIBNAME)(memscan.o) E 13 I 13 $(LIBNAME)(copy.o) $(LIBNAME)(userio.o)\ $(LIBNAME)(math.o) $(LIBNAME)(memscan.o) $(LIBNAME)(misc.o)\ $(LIBNAME)(end.o) $(LIBNAME)(low.o) $(LIBNAME)(ccb.o) E 13 E 3 all: $(LIBNAME) .PRECIOUS: $(LIBNAME) $(LIBNAME): $(CFILES) $(SFILES) D 2 # ar rv $@ $? # -rm -f $? E 2 D 2 .c.a: $(CC) $(CFLAGS) $< ar rv $@ $*.o rm -f $*.o .s.a: $(AS) $< ar rv $@ $*.o rm -f $*.o .s.o: $(AS) $< E 2 clean: -rm -f *.o clobber: clean -rm -f $(LIBNAME) D 8 $(LIBNAME)(ccopy.o):\ E 8 I 8 $(LIBNAME)(mapa.o):\ E 8 $(INCRT)/sys/param.h\ $(INCRT)/sys/types.h\ $(INCRT)/sys/systm.h\ $(INCRT)/sys/dir.h\ $(INCRT)/sys/signal.h\ $(INCRT)/sys/user.h\ $(INCRT)/sys/errno.h\ $(INCRT)/sys/page.h\ $(INCRT)/sys/region.h\ $(INCRT)/sys/proc.h\ $(INCRT)/sys/reg.h\ $(INCRT)/sys/trap.h\ $(INCRT)/sys/seg.h\ $(INCRT)/sys/sysinfo.h\ $(INCRT)/sys/sysmacros.h\ D 2 $(INCRT)/sys/debug.h\ $(FRC) E 2 I 2 $(INCRT)/sys/debug.h E 2 $(LIBNAME)(trap.o):\ $(INCRT)/sys/ass.h\ $(INCRT)/sys/psl.h\ D 2 $(INCRT)/sys/trap.h\ $(FRC) $(AS) trap.s ar rv LIB0.a trap.o rm -f trap.o E 2 I 2 $(INCRT)/sys/trap.h E 2 $(LIBNAME)(paging.o):\ $(INCRT)/sys/ass.h\ $(INCRT)/sys/psl.h\ D 2 $(INCRT)/sys/trap.h\ $(FRC) E 2 I 2 $(INCRT)/sys/trap.h E 2 $(LIBNAME)(start.o):\ $(INCRT)/sys/ass.h\ D 2 $(INCRT)/sys/psl.h\ $(FRC) E 2 I 2 D 15 $(INCRT)/sys/psl.h E 15 I 15 $(INCRT)/sys/psl.h\ $(INCRT)/sys/const.as.h\ $(INCRT)/sys/maint.h E 15 E 2 $(LIBNAME)(cswitch.o):\ D 2 $(INCRT)/sys/ass.h\ $(FRC) E 2 I 2 $(INCRT)/sys/ass.h E 2 $(LIBNAME)(userio.o):\ D 2 $(INCRT)/sys/ass.h\ $(FRC) E 2 I 2 $(INCRT)/sys/ass.h E 2 $(LIBNAME)(copy.o):\ D 2 $(INCRT)/sys/ass.h\ $(FRC) E 2 I 2 $(INCRT)/sys/ass.h E 2 $(LIBNAME)(math.o):\ D 2 $(INCRT)/sys/ass.h\ $(FRC) E 2 I 2 $(INCRT)/sys/ass.h E 2 $(LIBNAME)(misc.o):\ $(INCRT)/sys/ass.h\ $(INCRT)/sys/psl.h\ D 2 $(INCRT)/sys/trap.h\ $(FRC) $(AS) misc.s ar rv LIB0.a misc.o rm -f misc.o E 2 I 2 D 14 $(INCRT)/sys/trap.h E 14 I 14 $(INCRT)/sys/trap.h\ $(INCRT)/sys/const.as.h\ $(INCRT)/sys/maint.h\ $(INCRT)/sys/physmem.h E 14 E 2 $(LIBNAME)(low.o):\ D 2 $(INCRT)/sys/ass.h\ $(FRC) FRC: E 2 I 2 $(INCRT)/sys/ass.h I 3 $(LIBNAME)(memscan.o):\ $(INCRT)/sys/ass.h\ D 4 $(INCRT)/sys/const.as9.h\ E 4 I 4 $(INCRT)/sys/const.as.h\ E 4 $(INCRT)/sys/maint.h E 3 E 2 E 1 h49838 s 00001/00001/00232 d D 4.4 87/05/14 16:03:20 build 8 7 c removed old SCCS strings and inserted #ident BB e s 00009/00004/00224 d D 4.3 87/04/16 17:30:03 dc 7 6 c dc - Add Bull updates from 03/05/87 e s 00017/00017/00211 d D 4.2 87/04/15 17:42:22 dc 6 5 c dc - changed #include "sys/..." to #include e s 00000/00000/00228 d D 4.1 87/02/20 13:28:21 build 5 4 c rolled rev to -r4 /dc e s 00000/00000/00228 d D 3.1 87/01/19 09:21:10 build 4 3 c rolled rev to -r3 /dc e s 00000/00000/00228 d D 2.1 87/01/19 09:21:10 build 3 2 c AUTO NULL DELTA e s 00001/00000/00227 d D 1.2 87/01/16 10:14:02 build 2 1 c add ident string /dc e s 00227/00000/00000 d D 1.1 87/01/09 15:53:16 build 1 0 c Placed under source control - dc e u U f b f n t T I 2 D 7 /* "%W% %E%" */ E 7 I 7 D 8 /* " %W% %E% " */ E 8 I 8 #ident " %W% %E% " E 8 E 7 E 2 I 1 D 6 #include "sys/param.h" #include "sys/types.h" #include "sys/systm.h" #include "sys/dir.h" #include "sys/signal.h" #include "sys/user.h" #include "sys/errno.h" #include "sys/page.h" #include "sys/region.h" #include "sys/proc.h" #include "sys/reg.h" #include "sys/trap.h" #include "sys/seg.h" #include "sys/sysinfo.h" #include "sys/sysmacros.h" #include "sys/debug.h" #include "sys/vrt.h" E 6 I 6 #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include E 6 #define READ 0 #define WRITE 1 #define ADDRMASK 0xf8000000 paddr_t probe ( mode, address, fault_type ) int mode; /* read ou write */ char *address; /* buffer base address */ { pte_t *p; vrte_t *vrt_e; register i; if ((i = (uint)address >> BPPSHIFT) >= MAXUMEM) return(0); p = *(pte_t **)(u.u_procp->p_sgt +(i >> L0WIDTH)); if (!p) return(0); p += (i & L0MASK); if (!p->pgi.pg_pte) return(0); if (mode == WRITE) { if (!p->pgm.pg_w) if (!p->pgm.pg_cw) return(0); else if (!pfault(address,fault_type)) return(0); } if (!p->pgm.pg_v) if (!vfault(address,fault_type)) return(0); if (mode == WRITE) if (vrt_e = vrt_find ( p , u.u_procp->p_dsegno )) { vrt_e->pg_d = VRT_M; p->pgi.pg_pte |= PG_M ; } else if (vrt_e = vrt_find ( p , u.u_procp->p_txtsegno )) { vrt_e->pg_d = VRT_M; p->pgi.pg_pte |= PG_M ; } else panic ("probe: no VRT"); return (ptob(p->pgm.pg_pfn) + poff(address)); } int copyin ( src , dest , length ) caddr_t src; caddr_t dest; int length; { paddr_t u_paddr; int u_length; while (length) { if (!( u_paddr = probe (READ,src,DATA_FAULT))) return(-1); u_length = 4096 - poff (src); if (length < u_length) u_length = length; D 7 move_in(u_paddr, dest, u_length); E 7 I 7 move_in(u_paddr,dest,u_length); E 7 src += u_length; dest += u_length ; length -= u_length; } return(0); } int copyout ( src , dest , length ) caddr_t src; caddr_t dest; int length; { paddr_t u_paddr; int u_length; while (length) { if (!( u_paddr = probe (WRITE,dest,DATA_FAULT))) return(-1); u_length = 4096 - poff (dest); if (length < u_length) u_length = length; D 7 move_out(src, u_paddr, u_length); E 7 I 7 move_out(src, u_paddr , u_length); E 7 dest += u_length; src += u_length ; length -= u_length; } return(0); } D 7 unsigned char fubyte ( address ) E 7 I 7 int fubyte ( address ) E 7 caddr_t address; { paddr_t u_paddr; unsigned char retval ; if (!( u_paddr = probe ( READ , address ,DATA_FAULT))) return(-1); asfubyte(); } int subyte ( address , value ) caddr_t address; char value; { paddr_t u_paddr; if (!( u_paddr = probe ( WRITE , address ,DATA_FAULT))) return(-1); assubyte(); I 7 return(0); E 7 } int fuword ( address ) caddr_t address; { paddr_t u_paddr; I 7 register retval ; E 7 if ( (int)address & 3 ) return(-1); if (!( u_paddr = probe ( READ , address ,DATA_FAULT))) return(-1); asfuword(); } int fuiword ( address ) caddr_t address; { paddr_t u_paddr; I 7 register retval ; E 7 if ( (int)address & 3 ) return(-1); if (!( u_paddr = probe ( READ , address ,TEXT_FAULT))) return(-1); asfuiword(); } int suword ( address , value ) caddr_t address; int value; { paddr_t u_paddr; if ( (int)address & 3 ) return(-1); if (!( u_paddr = probe ( WRITE , address ,DATA_FAULT))) return(-1); assuword(); I 7 return(0); E 7 } int suiword ( address , value ) caddr_t address; int value ; { paddr_t u_paddr; if ( (int)address & 3 ) return(-1); if (!( u_paddr = probe ( WRITE , address ,TEXT_FAULT))) return(-1); assuiword(); I 7 return(0); E 7 } pte_t *mapa(addr) caddr_t addr; { pte_t *pte; register i; if ((i = (uint)addr >> BPPSHIFT) >= MAXUMEM) return(0); pte = *(pte_t **)(u.u_procp->p_sgt +(i >> L0WIDTH)); if (!pte) return(0); pte += (i & L0MASK); if (!pte->pgi.pg_pte) return(0); return(pte); } E 1 h13313 s 00001/00001/00041 d D 4.3 87/05/14 16:03:30 build 6 5 c removed old SCCS strings and inserted #ident BB e s 00016/00016/00026 d D 4.2 87/04/15 17:42:29 dc 5 4 c dc - changed #include "sys/..." to #include e s 00000/00000/00042 d D 4.1 87/02/20 13:28:25 build 4 3 c rolled rev to -r4 /dc e s 00001/00001/00041 d D 3.3 87/01/29 15:42:22 build 3 2 c change svtop to btotp e s 00001/00000/00041 d D 3.2 87/01/27 11:13:45 build 2 1 c add ident string e s 00041/00000/00000 d D 3.1 87/01/27 11:10:51 build 1 0 c Placed under source control - dc e u U f b f n t T I 2 D 6 /* "%W% %E%" */ E 6 I 6 #ident " %W% %E% " E 6 E 2 I 1 D 5 #include "sys/param.h" #include "sys/types.h" #include "sys/systm.h" #include "sys/dir.h" #include "sys/signal.h" #include "sys/user.h" #include "sys/errno.h" #include "sys/page.h" #include "sys/region.h" #include "sys/proc.h" #include "sys/reg.h" #include "sys/trap.h" #include "sys/seg.h" #include "sys/sysinfo.h" #include "sys/sysmacros.h" #include "sys/debug.h" E 5 I 5 #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include E 5 pte_t *mapa(address) caddr_t address; { pte_t *pte ; register sgte_t *st ; register scte_t *sct; register i; if ((uint)address > USRSTACK) return(0) ; D 3 i = svtop(address) ; E 3 I 3 i = btotp(address) ; E 3 sct = u.u_procp->p_sct + ((i & L2MASK) >> (L1WIDTH+L0WIDTH)); if (!sct->sgt_paddr) return(0) ; st = (sgte_t *)ptol(sct->sgt_paddr) + ((i & L1MASK) >> L0WIDTH) ; if (!st->pt_paddr) return(0) ; pte = (pte_t *)ptol(sttop(st->pt_paddr)) + (i & L0MASK); if (!pte->pgi.pg_pte) return(0); return(pte); } E 1 ! / 548575541 0 0 0 1252 ` c(~R$R$R$R$R$UUUUUXXXXXXXXXXX]]]]]]``ehehehehehehehehehehehehehehllll~j~j~j~j~j_mapa_xdbgcallalltrapsXsyscall_xsyscallsyscallXkcallXalignXillinstrXfparityXeparityXkerviolXcheckXtrapXinterruptXswtch0XpwroffXpwronXclockXcl100_tictac1XcalloutXrestrap_ret__debug_idle_kcall255_kcall254_call_rbug_rbsave_idle_addr_old_psXpage_start__last_addr_mcversion_bootdev_rootdev_pipedev_fdlp_dcb_proc0_uintstack_ftbits_ftPageTables_ftHeadwall_machineid_save_resume_setjmp_longjmp_flush_copyseg_copypage_clearseg_clearpage_dcb_write_fubyte_copy_start_copy_endbad_addr_subyte_fuword_fuiword_suword_suiword_copyin_copyout_udivudiv_uremurem_min_max_sizememory_headwallLight_addupc_spl1_spl4_spl5_spl6_spl7_splhi_spl0_splx_searchdir__HeadwallDiag_HWLoadEnable_R32LoadEnable_HWSerCmd_icode_szicodeispstackispstend_bzero_bcopy_d_read_d_write_d_rwrite_ccbmapa.o/ 548575480 0 0 100664 616 ` u  .textl .data L@.bss ( dq  0 sp t0? sp0s  >s p ? p W @(#)mapa.c 4.3 87/05/14 PR.text.data .bss_mapaj_uj_kbasejtrap.o/ 548575489 0 0 100664 3702 ` u (=.text@ , .data@@@@.bss@G^QGUFP@GN8h(FrD FFDFFBP[G$F8F`0FsAB@P\A@PHAp@P4A\@P AH@P A4@P A @P A  @GSUڋA@P@PA@P|A@PhA@@@GHHCBPV@DCB@P A4G7GxF |pRUWU~jfb‹ҋ.fGN8G G1$XG"G3$`G7#( h# FrG$$hGGphDFFD F LG&FnFBB#4(P[GF8AhFD!pFbFsABGNAGE8G740 G$$hG&G7$p.Q!_LFrhDFFD !LFD@FnG FBPHP[LzHP*[HHPGD4tGDG$2tjPVLPGD(FrhDFFD@FnFB#4P6[LPGDBhFDBpFd8FFsL80AB@FCBP[P[DG@FPFBD FBWWUD! G/"FF> F.HF >(^0Ǿ8LBP` P$[P`ɀɠ WFW~. L ^ ` ~,J ^"r$z'|'''+,11r0/2233  ,r58@.text@,.data@@.bssyalltrapsyXsyscallyysyscallyy_syscally_uyXkcallpy_i_kcallyXaligny_i_alignyy_i_instryXfparityyyXeparityyyXkervioly_i_pviolyXchecky_i_checkyXtrapy_i_trapy!0yXswtch0<y_i_sw0yXpwroffPy_i_pwfyXpwrondy_i_pwonyXclockxyXcl100y_ccby_tictac1HyXcalloutyXresy_i_resy_trapytrap_rety__debugxy,y_clockyintstacky@y_runruny_idlely_spl0y`yjyXpageyty_rbsavePy@y_old_psLySTKPARAM1STKPARAM2STKPARAM3STKPARAM4STKPARAM5PAGE_SHIFTPAGE_LENGTH_DPAGE_LENGTH_WPAGE_LENGTH_HPAGE_LENGTH_BKERNSTACKTIMER1_COUNTTIMER2_COUNTTIMER_PERIOD_xdbgcall_xsyscall_call_debugXillinstrXXillinstrXXfparity_i_dbpe_cfXXeparity_i_dbpe_exXXkervioltbit_to_tcodeXinterrupt_ext_intrclock_ret_addupc_clkalladdupcidle_loop_kcall255_kcall254_call_rbug_idle_addrpaging.o/ 548575493 0 0 100664 1108 ` u \.text( .data((@.bss((@G7*G/! GSGN80h(Fr F hGhGGp $LD FFDGFFnG#GQFB#4. >$R H_BP [$G0t80B@P.!PP. >$P[    . v    .text(.data(.bss(_pfaultrH_vfaultrH_traprHtrap_retrHXpagerHrHrHrHbad_addrrHSTKPARAM1STKPARAM2STKPARAM3STKPARAM4STKPARAM5PAGE_SHIFTPAGE_LENGTH_DPAGE_LENGTH_WPAGE_LENGTH_HPAGE_LENGTH_BKERNSTACKTIMER1_COUNTTIMER2_COUNTTIMER_PERIOD_copy_start_copy_end_call_debugstart.o/ 548575498 0 0 100664 14041 ` u 3P.text01 .data000 @.bss1P1P`qFFЋL@ؓҶ10L 1L`18pt xp14p1610@ FhD! tFFaFpAB XRP[6 D F FptF`pAB DF FptF`pABڋ" $ * 0 6>DNTZ`lpr(.text0.data00 .bss1P_starts_ccbssyscallsispstendss_clrmems10s1Ls_bootdev18s_rootdev14s_pipedev16sssss_mains_us0s_proc0_u!0sintstack0s_ftbits1<s1@s1Ds1Hs1STKPARAM1STKPARAM2STKPARAM3STKPARAM4STKPARAM5PAGE_SHIFTPAGE_LENGTH_DPAGE_LENGTH_WPAGE_LENGTH_HPAGE_LENGTH_BKERNSTACKTIMER1_COUNTTIMER2_COUNTTIMER_PERIOD_sizememory__last_addr_mcversion_kdb_init_vadrspace_sys_sect_call_debug_fdlp_dcb_ftPageTables_ftHeadwall_machineidintstack0 cswitch.o/ 548575502 0 0 100664 866 ` u  .textl .data@.bssP[D b GG(GG0G8FBP [D! bɂɢ (F`Fq0FFA8FFLB` W`ɀɠ WLWN P b.text.data.bss_saveq@q@_resumeDq@q@_setjmpq@_longjmpq@_flushq@STKPARAM1STKPARAM2STKPARAM3STKPARAM4STKPARAM5PAGE_SHIFTPAGE_LENGTH_DPAGE_LENGTH_WPAGE_LENGTH_HPAGE_LENGTH_BKERNSTACKTIMER1_COUNTTIMER2_COUNTTIMER_PERIOD_call_debug_ublk_sgtblcopy.o/ 548575508 0 0 100664 756 ` u  .text` .data``@.bss``!rr, AB(Wr 0!WP[WB02.text`.data`.bss`_copysegq@q@_kbaseq@,q@,q@Pq@STKPARAM1STKPARAM2STKPARAM3STKPARAM4STKPARAM5PAGE_SHIFTPAGE_LENGTH_DPAGE_LENGTH_WPAGE_LENGTH_HPAGE_LENGTH_BKERNSTACKTIMER1_COUNTTIMER2_COUNTTIMER_PERIOD_copypage_clearseg_clearpageclearpage_dcb_writedcb_writeuserio.o/ 548575512 0 0 100664 1111 ` u .text` .data``@.bss``HW 8W$# W # W # LW2!AC@2! BC@8zARG@C@A@`WPSP$QP8JAB(880J4AB$4002AB"201!1WW.text`.data`.bss`_fubyter`r`Nr`bad_addrNr`_subyter`_fuword$r`_fuiword$r`_suword@r`_suiword`r`_copyinr`_copyoutr`STKPARAM1STKPARAM2STKPARAM3STKPARAM4STKPARAM5PAGE_SHIFTPAGE_LENGTH_DPAGE_LENGTH_WPAGE_LENGTH_HPAGE_LENGTH_BKERNSTACKTIMER1_COUNTTIMER2_COUNTTIMER_PERIOD_copy_start_copy_endmove_loopsrcdoubledouble_doubleword_wordhalf_halfbyte_byteendmoveErrbad_addrErr math.o/ 548575516 0 0 100664 598 ` u  .text0 .data00@.bss00!/W!/W (! W (! W.text0.data0.bss0_udivpudivp_urem purem p_minp_max$pSTKPARAM1STKPARAM2STKPARAM3STKPARAM4STKPARAM5PAGE_SHIFTPAGE_LENGTH_DPAGE_LENGTH_WPAGE_LENGTH_HPAGE_LENGTH_BKERNSTACKTIMER1_COUNTTIMER2_COUNTTIMER_PERIODmemscan.o/ 548575521 0 0 100664 1299 ` u ! .textX .dataXX@.bssXX LnL 0 108 10Gǭ  ΀ΐ8 ΀ΐPUUUUI4TLtu`4v4ΐj`9CpLPUUUUdTLtW*&UTLtWd99dGۧ nɎɮ W^L WZ`l v .textX.dataX.bssX@ss_ftbitssssNsSTKPARAM1STKPARAM2STKPARAM3STKPARAM4STKPARAM5PAGE_SHIFTPAGE_LENGTH_DPAGE_LENGTH_WPAGE_LENGTH_HPAGE_LENGTH_BKERNSTACKTIMER1_COUNTTIMER2_COUNTTIMER_PERIODThirtyTwoMegMaxMemCardsMaxHWMemCardsPagesPer16MemCardPagesPer64MemCardPagesPer256MemCardPagesPer1MMemCardTestPatternVRTMemConfigMConfigRealAddrMConfigPgPerCardMConfigMaxCardsMConfigSizeStdMemConfigEndStdMemConfigsVRTMemConfigEndHwMemConfigsNumMemConfigsVRTInitTrapLocalSize_sizememory_machineid_ftPageTables_ftHeadwall_headwallLight misc.o/ 548575527 0 0 100664 1658 ` u 'x.textP .dataPP@.bssPP. hn`.d\q q.uL < >hd HWP[G'# ^FqGF@_L!!,BP[G'# FqF_LBP[G'# FqGF@L!!B<n~. 0@. 1BPP0P`rÆx"Rb^"Ȏ@@n~ǎW@L 8  WWWLW! ` 201L<TA@0L<A@R^Pp!%pWZp      0 2 > H .textP .dataP.bssP_addupctp_fuwordtp_suwordtp_spl1tp_spl4tptp_tictac1tpXcl100tp_spl5tp_spl6tp_spl7tp_splhitp_spl0tp_splxPtp\tptptptptpSTKPARAM1STKPARAM2STKPARAM3STKPARAM4STKPARAM5PAGE_SHIFTPAGE_LENGTH_DPAGE_LENGTH_WPAGE_LENGTH_HPAGE_LENGTH_BKERNSTACKTIMER1_COUNTTIMER2_COUNTTIMER_PERIODaddupc_stk_call_debug_searchdir__HeadwallDiag_HWLoadEnable_R32LoadEnableBitsPerWord_HWSerCmdend.o/ 548575530 0 0 100664 4624 ` u *4 .text( .data((@.bss  [/etc/init$.text(.data(.bss_uk@_icodek@_szicode$k@ispstack(k@ispstend(k@low.o/ 548575534 0 0 100664 764 ` u .l .text .data@.bss 0 W0 / @ކ@ # 0ATE#" 0@0W L03001!13"001!01$W 1NW OW 1N O2W.text.data.bss_bzeror_bcopyhr_d_readr_d_writerrSTKPARAM1STKPARAM2STKPARAM3STKPARAM4STKPARAM5PAGE_SHIFTPAGE_LENGTH_DPAGE_LENGTH_WPAGE_LENGTH_HPAGE_LENGTH_BKERNSTACKTIMER1_COUNTTIMER2_COUNTTIMER_PERIOD_d_rwriteccb.o/ 548575540 0 0 100664 5084 ` u 4.text .dataP@.bssPP  $(,048<@DHLPTX\`dhlptx|  $(,048<@DHLPTX\`dhlptx|  $(,048<@DHLPTX\`dhlptx|  $(,048<@DHLPTX\`dhlptx|       $(,048.text.dataP.bssP_ccblHXsyscalllHXkcalllHlHlHXalignlH$lHXfparitylHXeparitylHXpagelHXkerviollHXchecklHXtraplH.lH_i_sw0lH_i_pwflH_i_pwonlHXclocklHXcalloutlH_i_reslHD_kcall254_kcall255_exceptionsXillinstrXinterrupt_data_area.R..s.alloc.cs.bio.cs.bitmasks.cs.i_mbuf.cs.blklist.cs.bsdcompat.cs.clock.cs.debug.cs.errlog.cs.exec.cs.exit.cs.fault.cs.fio.cs.flock.cs.fork.cs.getpages.cs.grow.cs.i_domain.cs.i_socket2.cs.i_proto.cs.i_socket.cs.i_syscl.cs.i_usrreq.cs.iget.cs.intr.cs.ipc.cs.lock.cs.machdep.cs.main.cs.malloc.cs.move.cs.msg.cs.nami.cs.page.cs.pgtalloc.cs.physio.cs.pipe.cs.prf.cs.probe.cs.ptrace.cs.sys4.cs.rdwri.cs.region.cs.sched.cs.Makefiles.sem.cs.shm.cs.sig.cs.slp.cs.startup.cs.subr.cs.swapalloc.cs.swtch.cs.sys1.cs.sys2.cs.sys3.cs.sys_socket.cs.syscall.cs.sysent.cs.text.cs.timeout.cs.trap.cs.utssys.cs.vrt.cs.acct.cs.time.cs.sysridge.cLIB1.ah10335 s 00001/00001/00328 d D 4.4 87/05/14 16:03:40 build 8 7 c removed old SCCS strings and inserted #ident BB e s 00003/00003/00326 d D 4.3 87/04/16 18:15:55 dc 7 6 c dc - Add Bull updates from 03/05/87 e s 00017/00017/00312 d D 4.2 87/04/15 17:42:37 dc 6 5 c dc - changed #include "sys/..." to #include e s 00000/00000/00329 d D 4.1 87/02/20 13:28:28 build 5 4 c rolled rev to -r4 /dc e s 00000/00000/00329 d D 3.1 87/01/19 09:21:13 build 4 3 c rolled rev to -r3 /dc e s 00000/00000/00329 d D 2.1 87/01/19 09:21:13 build 3 2 c AUTO NULL DELTA e s 00001/00000/00328 d D 1.2 87/01/16 10:14:06 build 2 1 c add ident string /dc e s 00328/00000/00000 d D 1.1 87/01/09 16:34:12 build 1 0 c Placed under source control - dc e u U f b f n t T I 2 D 7 /* "%W% %E%" */ E 7 I 7 D 8 /* " %W% %E% " */ E 8 I 8 #ident " %W% %E% " E 8 E 7 E 2 I 1 D 6 #include "sys/param.h" #include "sys/types.h" #include "sys/sysmacros.h" #include "sys/systm.h" #include "sys/mount.h" #include "sys/filsys.h" #include "sys/fblk.h" #include "sys/page.h" #include "sys/buf.h" #include "sys/inode.h" #include "sys/file.h" #include "sys/ino.h" #include "sys/dir.h" #include "sys/signal.h" #include "sys/user.h" #include "sys/errno.h" #include "sys/var.h" E 6 I 6 #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include E 6 typedef struct fblk *FBLKP; /* * alloc will obtain the next available free disk block from the free list * of the specified device. * The super block has up to NICFREE remembered free blocks; * the last of these is read to obtain NICFREE more . . . * * no space on dev x/y -- when the free list is exhausted. */ struct buf * alloc(dev) dev_t dev; { daddr_t bno; register struct filsys *fp; register struct buf *bp; fp = getfs(dev); while(fp->s_flock) sleep((caddr_t)&fp->s_flock, PINOD); do { if (fp->s_nfree <= 0) goto nospace; bno = fp->s_free[--fp->s_nfree]; if (bno == 0) goto nospace; } while (badblock(fp, bno, dev)); if (fp->s_nfree <= 0) { fp->s_flock++; bp = bread(dev, bno); if (u.u_error == 0) { fp->s_nfree = ((FBLKP)(bp->b_un.b_addr))->df_nfree; bcopy((caddr_t)((FBLKP)(bp->b_un.b_addr))->df_free, (caddr_t)fp->s_free, sizeof(fp->s_free)); } brelse(bp); fp->s_flock = 0; wakeup((caddr_t)&fp->s_flock); } if (fp->s_nfree <= 0 || fp->s_nfree > NICFREE) { D 7 prdev("Bad free count", dev); E 7 I 7 prdev("bad free count", dev); E 7 goto nospace; } bp = getblk(dev, bno); clrbuf(bp); if (fp->s_tfree) fp->s_tfree--; fp->s_fmod = 1; return(bp); nospace: fp->s_nfree = 0; fp->s_tfree = 0; delay(5*HZ); prdev("no space", dev); u.u_error = ENOSPC; return(NULL); } /* * place the specified disk block back on the free list of the * specified device. */ free(dev, bno) dev_t dev; daddr_t bno; { register struct filsys *fp; register struct buf *bp; fp = getfs(dev); fp->s_fmod = 1; while(fp->s_flock) sleep((caddr_t)&fp->s_flock, PINOD); if (badblock(fp, bno, dev)) return; if (fp->s_nfree <= 0) { fp->s_nfree = 1; fp->s_free[0] = 0; } if (fp->s_nfree >= NICFREE) { fp->s_flock++; bp = getblk(dev, bno); ((FBLKP)(bp->b_un.b_addr))->df_nfree = fp->s_nfree; bcopy((caddr_t)fp->s_free, (caddr_t)((FBLKP)(bp->b_un.b_addr))->df_free, sizeof(fp->s_free)); fp->s_nfree = 0; bwrite(bp); fp->s_flock = 0; wakeup((caddr_t)&fp->s_flock); } fp->s_free[fp->s_nfree++] = bno; fp->s_tfree++; fp->s_fmod = 1; } /* * Check that a block number is in the range between the I list * and the size of the device. * This is used mainly to check that a * garbage file system has not been mounted. * * bad block on dev x/y -- not in range */ badblock(fp, bn, dev) register struct filsys *fp; daddr_t bn; dev_t dev; { if (bn < fp->s_isize || bn >= fp->s_fsize) { prdev("bad block", dev); return(1); } return(0); } /* * Allocate an unused I node on the specified device. * Used with file creation. * The algorithm keeps up to NICINOD spare I nodes in the * super block. When this runs out, a linear search through the * I list is instituted to pick up NICINOD more. */ struct inode * ialloc(dev, mode, nlink) dev_t dev; { register struct filsys *fp; register struct inode *ip; register i; register struct buf *bp; struct dinode *dp; ino_t ino; daddr_t adr; fp = getfs(dev); loop: while(fp->s_ilock) sleep((caddr_t)&fp->s_ilock, PINOD); if (fp->s_ninode > 0 && (ino = fp->s_inode[--fp->s_ninode])) { ip = iget(dev, ino); if (ip == NULL) return(NULL); if (ip->i_mode == 0) { /* found inode: update now to avoid races */ ip->i_mode = mode; ip->i_nlink = nlink; ip->i_flag |= IACC|IUPD|ICHG|ISYN; ip->i_uid = u.u_uid; ip->i_gid = u.u_gid; ip->i_size = 0; for (i=0; ii_addr[i] = 0; if (fp->s_tinode) fp->s_tinode--; fp->s_fmod = 1; iupdat(ip, &time, &time); return(ip); } /* * Inode was allocated after all. * Look some more. */ iupdat(ip, &time, &time); iput(ip); goto loop; } fp->s_ilock++; fp->s_ninode = NICINOD; ino = FsINOS(dev, fp->s_inode[0]); for(adr = FsITOD(dev, ino); adr < fp->s_isize; adr++) { bp = bread(dev, adr); if (u.u_error) { brelse(bp); ino += FsINOPB(dev); continue; } dp = bp->b_un.b_dino; for(i=0; is_ninode <= 0) break; if (dp->di_mode == 0) fp->s_inode[--fp->s_ninode] = ino; } brelse(bp); if (fp->s_ninode <= 0) break; } fp->s_ilock = 0; wakeup((caddr_t)&fp->s_ilock); if (fp->s_ninode > 0) { fp->s_inode[fp->s_ninode-1] = 0; fp->s_inode[0] = 0; } if (fp->s_ninode != NICINOD) { fp->s_ninode = NICINOD; goto loop; } fp->s_ninode = 0; D 7 prdev("Out of inodes", dev); E 7 I 7 prdev("out of inodes", dev); E 7 u.u_error = ENOSPC; fp->s_tinode = 0; return(NULL); } /* * Free the specified I node on the specified device. * The algorithm stores up to NICINOD I nodes in the super * block and throws away any more. */ ifree(dev, ino) dev_t dev; ino_t ino; { register struct filsys *fp; fp = getfs(dev); fp->s_tinode++; if (fp->s_ilock) return; fp->s_fmod = 1; if (fp->s_ninode >= NICINOD) { if (ino < fp->s_inode[0]) fp->s_inode[0] = ino; return; } fp->s_inode[fp->s_ninode++] = ino; } /* * getfs maps a device number into a pointer to the incore super block. * The algorithm is a linear search through the mount table. * A consistency check of the in core free-block and i-node counts. * * bad count on dev x/y -- the count * check failed. At this point, all * the counts are zeroed which will * almost certainly lead to "no space" * diagnostic * panic: no fs -- the device is not mounted. * this "cannot happen" */ struct filsys * getfs(dev) dev_t dev; { register struct mount *mp; register struct filsys *fp; for(mp = &mount[0]; mp < (struct mount *)v.ve_mount; mp++) if (mp->m_flags == MINUSE && mp->m_dev == dev) { fp = mp->m_bufp->b_un.b_filsys; if (fp->s_nfree > NICFREE || fp->s_ninode > NICINOD) { prdev("bad count", dev); fp->s_nfree = 0; fp->s_ninode = 0; } return(fp); } panic("no fs"); return(NULL); } /* * update is the internal name of 'sync'. It goes through the disk * queues to initiate sandbagged IO; goes through the I nodes to write * modified nodes; and it goes through the mount table to initiate modified * super blocks. */ update() { register struct inode *ip; register struct mount *mp; struct filsys *fp; static struct inode uinode; if (uinode.i_flag) return; uinode.i_flag++; uinode.i_mode = IFBLK; for(mp = &mount[0]; mp < (struct mount *)v.ve_mount; mp++) if (mp->m_flags == MINUSE) { fp = mp->m_bufp->b_un.b_filsys; if (fp->s_fmod==0 || fp->s_ilock!=0 || fp->s_flock!=0 || fp->s_ronly!=0) continue; fp->s_fmod = 0; fp->s_time = time; uinode.i_rdev = mp->m_dev; u.u_error = 0; u.u_offset = SUPERBOFF; u.u_count = sizeof(struct filsys); u.u_base = (caddr_t)fp; u.u_segflg = 1; u.u_fmode = FWRITE|FSYNC; writei(&uinode); } for(ip = &inode[0]; ip < (struct inode *)v.ve_inode; ip++) if ((ip->i_flag&ILOCK)==0 && ip->i_count!=0 && (ip->i_flag&(IACC|IUPD|ICHG))) { ip->i_flag |= ILOCK; ip->i_count++; iupdat(ip, &time, &time); iput(ip); } bflush(NODEV); uinode.i_flag = 0; } E 1 h21469 s 00001/00001/00506 d D 4.4 87/05/14 16:03:52 build 9 8 c removed old SCCS strings and inserted #ident BB e s 00008/00007/00499 d D 4.3 87/04/16 18:16:39 dc 8 7 c dc - Add Bull updates from 03/05/87 e s 00018/00018/00488 d D 4.2 87/04/15 17:42:47 dc 7 6 c dc - changed #include "sys/..." to #include e s 00000/00000/00506 d D 4.1 87/02/20 13:28:34 build 6 5 c rolled rev to -r4 /dc e s 00001/00001/00505 d D 3.2 87/01/26 13:12:55 build 5 4 c add page table changes /dc e s 00000/00000/00506 d D 3.1 87/01/19 09:21:16 build 4 3 c rolled rev to -r3 /dc e s 00000/00000/00506 d D 2.1 87/01/19 09:21:16 build 3 2 c AUTO NULL DELTA e s 00001/00000/00505 d D 1.2 87/01/16 10:14:12 build 2 1 c add ident string /dc e s 00505/00000/00000 d D 1.1 87/01/09 16:34:13 build 1 0 c Placed under source control - dc e u U f b f n t T I 2 D 8 /* "%W% %E%" */ E 8 I 8 D 9 /* " %W% %E% " */ E 9 I 9 #ident " %W% %E% " E 9 E 8 E 2 I 1 D 7 #include "sys/param.h" #include "sys/types.h" #include "sys/sysmacros.h" #include "sys/systm.h" #include "sys/sysinfo.h" #include "sys/dir.h" #include "sys/signal.h" #include "sys/user.h" #include "sys/errno.h" #include "sys/page.h" #include "sys/region.h" #include "sys/buf.h" #include "sys/smd.h" #include "sys/iobuf.h" #include "sys/conf.h" #include "sys/proc.h" #include "sys/seg.h" #include "sys/var.h" E 7 I 7 #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include I 8 #include E 8 E 7 D 8 E 8 struct buf *sbuf; /* start of buffer headers */ char *bufstart; /* start of buffers */ /* * The following several routines allocate and free * buffers with various side effects. In general the * arguments to an allocate routine are a device and * a block number, and the value is a pointer to * to the buffer header; the buffer is marked "busy" * so that no one else can touch it. If the block was * already in core, no I/O need be done; if it is * already busy, the process waits until it becomes free. * The following routines allocate a buffer: * getblk * bread * breada * Eventually the buffer must be released, possibly with the * side effect of writing it out, by using one of * bwrite * bdwrite * bawrite * brelse */ /* * Unlink a buffer from the available list and mark it busy. * (internal interface) */ #define notavail(bp) \ {\ register s;\ \ s = spl6();\ bp->av_back->av_forw = bp->av_forw;\ bp->av_forw->av_back = bp->av_back;\ bp->b_flags |= B_BUSY;\ bfreelist.b_bcount--;\ splx(s);\ } /* * Read in (if necessary) the block and return a buffer pointer. */ struct buf * bread(dev, blkno) dev_t dev; daddr_t blkno; { register struct buf *bp; sysinfo.lread++; bp = getblk(dev, blkno); if (bp->b_flags&B_DONE) return(bp); bp->b_flags |= B_READ; bp->b_bcount = FsBSIZE(dev); (*bdevsw[bmajor(dev)].d_strategy)(bp); u.u_ior++; sysinfo.bread++; iowait(bp); return(bp); } /* * Read in the block, like bread, but also start I/O on the * read-ahead block (which is not allocated to the caller) */ struct buf * breada(dev, blkno, rablkno) dev_t dev; daddr_t blkno, rablkno; { register struct buf *bp, *rabp; bp = NULL; if (!incore(dev, blkno)) { sysinfo.lread++; bp = getblk(dev, blkno); if ((bp->b_flags&B_DONE) == 0) { bp->b_flags |= B_READ; bp->b_bcount = FsBSIZE(dev); (*bdevsw[bmajor(dev)].d_strategy)(bp); u.u_ior++; sysinfo.bread++; } } if (rablkno && bfreelist.b_bcount>1 && !incore(dev, rablkno)) { rabp = getblk(dev, rablkno); if (rabp->b_flags & B_DONE) brelse(rabp); else { rabp->b_flags |= B_READ|B_ASYNC; rabp->b_bcount = FsBSIZE(dev); (*bdevsw[bmajor(dev)].d_strategy)(rabp); u.u_ior++; sysinfo.bread++; } } if (bp == NULL) return(bread(dev, blkno)); iowait(bp); return(bp); } /* * Write the buffer, waiting for completion. * Then release the buffer. */ bwrite(bp) register struct buf *bp; { register flag; sysinfo.lwrite++; flag = bp->b_flags; bp->b_flags &= ~(B_READ | B_DONE | B_ERROR | B_DELWRI); (*bdevsw[bmajor(bp->b_dev)].d_strategy)(bp); u.u_iow++; sysinfo.bwrite++; D 8 if ((flag&B_ASYNC) == 0) { E 8 I 8 if (!(flag&B_ASYNC)) { E 8 iowait(bp); brelse(bp); D 8 } else if (flag & B_DELWRI) bp->b_flags |= B_AGE; E 8 I 8 } E 8 else I 8 if (!(flag & B_DELWRI)) E 8 geterror(bp); } /* * Release the buffer, marking it so that if it is grabbed * for another purpose it will be written out before being * given up (e.g. when writing a partial block where it is * assumed that another write for the same block will soon follow). * This can't be done for magtape, since writes must be done * in the same order as requested. */ bdwrite(bp) register struct buf *bp; { sysinfo.lwrite++; if (!(bp->b_flags & B_DELWRI)) bp->b_start = lbolt ; bp->b_flags |= B_DELWRI | B_DONE; bp->b_resid = 0; brelse(bp); } /* * Release the buffer, start I/O on it, but don't wait for completion. */ bawrite(bp) register struct buf *bp; { if (bfreelist.b_bcount>4) bp->b_flags |= B_ASYNC; bwrite(bp); } /* * release the buffer, with no I/O implied. */ brelse(bp) register struct buf *bp; { register struct buf **backp; register s; if (bp->b_flags&B_WANTED) wakeup((caddr_t)bp); if (bfreelist.b_flags&B_WANTED) { bfreelist.b_flags &= ~B_WANTED; wakeup((caddr_t)&bfreelist); } if (bp->b_flags&B_ERROR) { bp->b_flags |= B_STALE|B_AGE; bp->b_flags &= ~(B_ERROR|B_DELWRI); bp->b_error = 0; } /* Put buffer on freelist, at the beginning if B_AGE, otherwise at the end. */ s = spl6(); if (bp->b_flags & B_AGE) { backp = &bfreelist.av_forw; (*backp)->av_back = bp; bp->av_forw = *backp; *backp = bp; bp->av_back = &bfreelist; } else { backp = &bfreelist.av_back; (*backp)->av_forw = bp; bp->av_back = *backp; *backp = bp; bp->av_forw = &bfreelist; } bp->b_flags &= ~(B_WANTED|B_BUSY|B_ASYNC|B_AGE); bfreelist.b_bcount++; splx(s); } /* * See if the block is associated with some buffer * (mainly to avoid getting hung up on a wait in breada) */ incore(dev, blkno) register dev_t dev; daddr_t blkno; { register struct buf *bp; register struct buf *dp; blkno = FsLTOP(dev, blkno); dp = bhash(dev, blkno); for (bp=dp->b_forw; bp != dp; bp = bp->b_forw) if (bp->b_blkno==blkno && bp->b_dev==dev && (bp->b_flags&B_STALE)==0) return(1); return(0); } /* * Assign a buffer for the given block. If the appropriate * block is already associated, return it; otherwise search * for the oldest non-busy buffer and reassign it. */ struct buf * getblk(dev, blkno) register dev_t dev; daddr_t blkno; { register struct buf *bp; register struct buf *dp; blkno = FsLTOP(dev, blkno); loop: spl0(); dp = bhash(dev, blkno); if (dp == NULL) panic("devtab"); for (bp=dp->b_forw; bp != dp; bp = bp->b_forw) { if (bp->b_blkno!=blkno || bp->b_dev!=dev || bp->b_flags&B_STALE) continue; spl6(); if (bp->b_flags&B_BUSY) { bp->b_flags |= B_WANTED; syswait.iowait++; sleep((caddr_t)bp, PRIBIO+1); syswait.iowait--; goto loop; } spl0(); notavail(bp); return(bp); } spl6(); if (bfreelist.av_forw == &bfreelist) { bfreelist.b_flags |= B_WANTED; sleep((caddr_t)&bfreelist, PRIBIO+1); goto loop; } spl0(); bp = bfreelist.av_forw; notavail(bp); if (bp->b_flags & B_DELWRI) { bp->b_flags |= B_ASYNC; bwrite(bp); goto loop; } bp->b_flags = B_BUSY; bp->b_back->b_forw = bp->b_forw; bp->b_forw->b_back = bp->b_back; bp->b_forw = dp->b_forw; bp->b_back = dp; dp->b_forw->b_back = bp; dp->b_forw = bp; bp->b_dev = dev; bp->b_blkno = blkno; bp->b_bcount = FsBSIZE(dev); return(bp); } /* * get an empty block, * not assigned to any particular device */ struct buf * geteblk() { register struct buf *bp; register struct buf *dp; loop: spl6(); while (bfreelist.av_forw == &bfreelist) { bfreelist.b_flags |= B_WANTED; sleep((caddr_t)&bfreelist, PRIBIO+1); } spl0(); dp = &bfreelist; bp = bfreelist.av_forw; notavail(bp); if (bp->b_flags & B_DELWRI) { bp->b_flags |= B_ASYNC; bwrite(bp); goto loop; } bp->b_flags = B_BUSY|B_AGE; bp->b_back->b_forw = bp->b_forw; bp->b_forw->b_back = bp->b_back; bp->b_forw = dp->b_forw; bp->b_back = dp; dp->b_forw->b_back = bp; dp->b_forw = bp; bp->b_dev = (dev_t)NODEV; bp->b_bcount = SBUFSIZE; return(bp); } /* * Wait for I/O completion on the buffer; return errors * to the user. */ iowait(bp) register struct buf *bp; { syswait.iowait++; spl6(); while ((bp->b_flags&B_DONE)==0) sleep((caddr_t)bp, PRIBIO); spl0(); syswait.iowait--; geterror(bp); } /* * Mark I/O complete on a buffer, release it if I/O is asynchronous, * and wake up anyone waiting for it. */ iodone(bp) register struct buf *bp; { bp->b_flags |= B_DONE; if (bp->b_flags&B_ASYNC) brelse(bp); else { bp->b_flags &= ~B_WANTED; wakeup((caddr_t)bp); } } /* * Zero the core associated with a buffer. */ clrbuf(bp) struct buf *bp; { bzero(bp->b_un.b_words, bp->b_bcount); bp->b_resid = 0; } /* * make sure all write-behind blocks * on dev (or NODEV for all) * are flushed out. * (from umount and update) */ bflush(dev) dev_t dev; { register struct buf *bp; extern struct buf smblist; spl6(); for (bp = bfreelist.av_forw; bp != &bfreelist;) { if (bp->b_flags&B_DELWRI && (dev == NODEV||dev==bp->b_dev)) { bp->b_flags |= B_ASYNC; notavail(bp); bwrite(bp); spl6(); bp = bfreelist.av_forw; } else { if (bp->av_forw) bp = bp->av_forw; else panic("bflush: bad free list\n"); } } spl0(); } /* * Invalidate blocks for a dev after last close. */ binval(dev) { register struct buf *dp; register struct buf *bp; register i; for (i=0; ib_forw; bp != dp; bp = bp->b_forw) if (bp->b_dev == dev) bp->b_flags |= B_STALE|B_AGE; } } /* * Initialize the buffer I/O system by freeing * all buffers and setting all device hash buffer lists to empty. */ binit() { register struct buf *bp; register struct buf *dp; register unsigned i; register char *buffers; int bufsiz, hdsiz; if (v.v_buf == 0) D 8 v.v_buf = maxmem < 1024 ? 256 : 512 ; printf("\nCache: number of buffers %d\n",v.v_buf) ; E 8 I 8 v.v_buf = maxmem <= 2048 ? 256 : 512 ; debug(DB1,"\nCache: number of buffers %d\n",v.v_buf) ; E 8 dp = &bfreelist; dp->b_forw = dp->b_back = dp->av_forw = dp->av_back = dp; hdsiz = btoc(sizeof(struct buf) * v.v_buf); bp = (struct buf *)sptalloc(hdsiz, PG_V | PG_KW, 0); sbuf = bp; bufsiz = btoc(SBUFSIZE * v.v_buf); buffers = (char *)sptalloc(bufsiz, PG_V | PG_KW, 0); bufstart = buffers; if (bp == NULL || buffers == NULL) panic("binit"); maxmem -= (bufsiz + hdsiz); for (i=0; ib_dev = NODEV; bp->b_un.b_addr = buffers; D 5 bp->b_pt = (pte_t *)&sbrpte[svtop(buffers)] ; E 5 I 5 bp->b_pt = (pte_t *)svtopte(buffers) ; E 5 bp->b_back = dp; bp->b_forw = dp->b_forw; dp->b_forw->b_back = bp; dp->b_forw = bp; bp->b_flags = B_BUSY; bp->b_bcount = 0; brelse(bp); } pfreelist.av_forw = bp = pbuf; for (; bp < &pbuf[v.v_pbuf-1]; bp++) bp->av_forw = bp+1; bp->av_forw = NULL; for (i=0; i < v.v_hbuf; i++) hbuf[i].b_forw = hbuf[i].b_back = (struct buf *)&hbuf[i]; } /* * Flush delayed writes after time delay */ bdflush() { register struct buf *bp ; register autoup ; autoup = v.v_autoup*HZ ; loop: spl6() ; for (bp = bfreelist.av_forw ; bp != &bfreelist ; bp = bp->av_forw) if (bp->b_flags & B_DELWRI && ((lbolt-bp->b_start) >= autoup)) { bp->b_flags |= B_ASYNC ; notavail(bp) ; bwrite(bp) ; spl0() ; goto loop ; } spl0() ; sleep(bdflush, PRIBIO) ; goto loop ; } E 1 h60568 s 00001/00001/00105 d D 4.3 87/05/14 16:04:03 build 7 6 c removed old SCCS strings and inserted #ident BB e s 00001/00002/00105 d D 4.2 87/04/16 18:16:58 dc 6 5 c dc - Add Bull updates from 03/05/87 e s 00000/00000/00107 d D 4.1 87/02/20 13:28:37 build 5 4 c rolled rev to -r4 /dc e s 00000/00000/00107 d D 3.1 87/01/19 09:21:19 build 4 3 c rolled rev to -r3 /dc e s 00000/00000/00107 d D 2.1 87/01/19 09:21:19 build 3 2 c AUTO NULL DELTA e s 00001/00000/00106 d D 1.2 87/01/16 10:14:17 build 2 1 c add ident string /dc e s 00106/00000/00000 d D 1.1 87/01/09 16:34:14 build 1 0 c Placed under source control - dc e u U f b f n t T I 2 D 6 /* "%W% %E%" */ E 2 I 1 /* @(#)bitmasks.c 1.1 */ E 6 I 6 D 7 /* " %W% %E% " */ E 7 I 7 #ident " %W% %E% " E 7 E 6 int setmask[33] = { /* set the first N bits */ 0x0, 0x1, 0x3, 0x7, 0xf, 0x1f, 0x3f, 0x7f, 0xff, 0x1ff, 0x3ff, 0x7ff, 0xfff, 0x1fff, 0x3fff, 0x7fff, 0xffff, 0x1ffff, 0x3ffff, 0x7ffff, 0xfffff, 0x1fffff, 0x3fffff, 0x7fffff, 0xffffff, 0x1ffffff, 0x3ffffff, 0x7ffffff, 0xfffffff, 0x1fffffff, 0x3fffffff, 0x7fffffff, 0xffffffff, }; int sbittab[] = { /* set bit N mask table */ 0x1, 0x2, 0x4, 0x8, 0x10, 0x20, 0x40, 0x80, 0x100, 0x200, 0x400, 0x800, 0x1000, 0x2000, 0x4000, 0x8000, 0x10000, 0x20000, 0x40000, 0x80000, 0x100000, 0x200000, 0x400000, 0x800000, 0x1000000, 0x2000000, 0x4000000, 0x8000000, 0x10000000, 0x20000000, 0x40000000, 0x80000000, }; int cbittab[] = { /* clear bit N mask table */ 0xfffffffe, 0xfffffffd, 0xfffffffb, 0xfffffff7, 0xffffffef, 0xffffffdf, 0xffffffbf, 0xffffff7f, 0xfffffeff, 0xfffffdff, 0xfffffbff, 0xfffff7ff, 0xffffefff, 0xffffdfff, 0xffffbfff, 0xffff7fff, 0xfffeffff, 0xfffdffff, 0xfffbffff, 0xfff7ffff, 0xffefffff, 0xffdfffff, 0xffbfffff, 0xff7fffff, 0xfeffffff, 0xfdffffff, 0xfbffffff, 0xf7ffffff, 0xefffffff, 0xdfffffff, 0xbfffffff, 0x7fffffff, }; E 1 h41748 s 00001/00001/00363 d D 4.7 87/05/20 13:15:56 brian 13 12 c mbuf.h put back on system search path BB e s 00001/00001/00363 d D 4.6 87/05/14 16:04:15 build 12 11 c removed old SCCS strings and inserted #ident BB e s 00001/00001/00363 d D 4.5 87/05/07 18:58:29 van 11 10 c van - move defsocket.h back to /usr/include/sys e s 00002/00002/00362 d D 4.4 87/04/29 16:25:43 van 10 9 c van - moved ucb networking includes to INCUCB e s 00001/00003/00363 d D 4.3 87/04/16 18:38:27 dc 9 8 c dc - Add Bull updates from 03/05/87 e s 00008/00008/00358 d D 4.2 87/04/15 17:43:00 dc 8 7 c dc - changed #include "sys/..." to #include e s 00000/00000/00366 d D 4.1 87/02/20 13:28:40 build 7 6 c rolled rev to -r4 /dc e s 00001/00001/00365 d D 3.3 87/01/30 11:05:35 build 6 5 c use mbx in call to sptfill in m_clalloc e s 00001/00015/00365 d D 3.2 87/01/26 13:25:37 build 5 4 c add page table changes /dc e s 00000/00000/00380 d D 3.1 87/01/19 09:21:21 build 4 3 c rolled rev to -r3 /dc e s 00000/00000/00380 d D 2.1 87/01/19 09:21:21 build 3 2 c AUTO NULL DELTA e s 00001/00000/00379 d D 1.2 87/01/16 10:14:20 build 2 1 c add ident string /dc e s 00379/00000/00000 d D 1.1 87/01/09 16:34:37 build 1 0 c Placed under source control - dc e u U f b f n t T I 2 D 9 /* "%W% %E%" */ E 2 I 1 /* %Z% Bull-Sems SPIX %Q%/%M% %I% %E% */ E 9 I 9 D 12 /* " %W% %E% " */ E 12 I 12 #ident " %W% %E% " E 12 E 9 #ifdef SOCKET D 8 #include "sys/param.h" #include "sys/types.h" #include "sys/defsocket.h" #include "sys/mbuf.h" #include "sys/var.h" #include "sys/debug.h" #include "sys/page.h" #include "sys/map.h" E 8 I 8 #include #include D 10 #include #include E 10 I 10 D 11 #include "sys/defsocket.h" E 11 I 11 #include E 11 D 13 #include "sys/mbuf.h" E 13 I 13 #include E 13 E 10 #include #include #include #include E 8 extern struct map mbmap[] ; /* mbuf and cluster allocation map */ D 5 extern ushort sys_segno ; E 5 static char *types[] = { "MT_FREE", "MT_DATA", "MT_HEADER", "MT_SOCKET", "MT_PCB", "MT_RTABLE", "MT_HTABLE", "MT_ATABLE", "MT_SONAME", "MT_ZOMBIE", "MT_SOOPTS", "MT_FTABLE", "MT_12", "MT_13", "MT_14", "MT_15" }; mbinit() { if ((mbutl = (struct mbuf *)sptalloc(v.v_nmbcl, 0, -1)) == 0) goto bad ; mfree(mbmap, v.v_nmbcl, svtop(mbutl)) ; if (m_clalloc(v.v_mbuf, MPG_MBUFS) == 0) goto bad; if (m_clalloc(v.v_mclbuf, MPG_CLUSTERS) == 0) goto bad; return; bad: panic("mbinit"); } caddr_t m_clalloc(ncl, how) register int ncl; int how; { int npg, mbx; register struct mbuf *m; register int i; int s; npg = ncl * MBCLSIZE ; if ((mbx = malloc(mbmap, npg)) == 0) return(0) ; m = (struct mbuf *)ptosv(mbx) ; D 5 if (sptmemall(&sbrpte[mbx], npg)) E 5 I 5 D 6 if (sptfill(m, npg,0,0)) E 6 I 6 if (sptfill(mbx, npg,0,0)) E 6 E 5 { s = splimp() ; mfree(mbmap, npg, mbx) ; splx(s) ; return(0) ; D 5 } else { /* * Setup vrt entries */ for (i = 0 ; i < npg ; i++) { ((int *)sbrpte)[mbx+i] |= (PG_V | PG_KW) ; sys_vrt_insert(ptosv(mbx+i), ((pte_t *)sbrpte)[mbx+i].pgi.pg_pte,sys_segno) ; bzero(ptosv(mbx+i),NBPP) ; } E 5 } switch (how) { case MPG_CLUSTERS: s = splimp(); for (i = 0; i < ncl; i++) { m->m_off = 0; m->m_next = mclfree; mclfree = m; m += CLBYTES / sizeof (*m); mbstat.m_clfree++; } mbstat.m_clusters += ncl; splx(s); break; case MPG_MBUFS: for (i = ncl * CLBYTES / sizeof (*m); i > 0; i--) { m->m_off = 0; m->m_type = MT_DATA; mbstat.m_mtypes[MT_DATA]++; mbstat.m_mbufs++; (void) m_free(m); m++; } break; } return ((caddr_t)m); } m_pgfree(addr, n) caddr_t addr; int n; { } /* Allocate more room for mbufs */ m_expand() { if (m_clalloc(1, MPG_MBUFS) == 0) goto steal; debug(DBmbuf,"m_expand() = 1\n"); return (1); steal: /* should ask protocols to free code */ debug(DBmbuf,"m_expand() = 0\n"); return (0); } /* NEED SOME WAY TO RELEASE SPACE */ /* * Space allocation routines. * These are also available as macros * for critical paths. */ /* get an mbuf */ struct mbuf * m_get(canwait, type) int canwait, type; { register struct mbuf *m; MBGET(m, canwait, type); debug(DBmbuf,"m_get(%s):%x\n",types[type],m); return (m); } /* get an mbuf and zero it */ struct mbuf * m_getclr(canwait, type) int canwait, type; { register struct mbuf *m; debug(DBmbuf,"m_getclr: "); m = m_get(canwait, type); if (m == 0){ return (0);} bzero(mtod(m, caddr_t), MLEN); return (m); } /* free an mbuf; returns next mbuf in chain or 0 */ struct mbuf * m_free(m) struct mbuf *m; { register struct mbuf *n; MBFREE(m, n); debug(DBmbuf,"-- m_free(%x):%x\n",m,n); return (n); } /* Allocate space, return a new mbuf */ struct mbuf * m_more(canwait, type) int canwait, type; { register struct mbuf *m; if (!m_expand()) { mbstat.m_drops++; debug(DBmbuf,"m_more(%d,%s): failed\n",canwait,types[type]); return (NULL); } #define m_more(x,y) (panic("m_more"), (struct mbuf *)0) MBGET(m, canwait, type); #undef m_more debug(DBmbuf,"m_more(%d,%s):%x\n",canwait,types[type],m); return (m); } /* free a chain of mbufs */ m_freem(m) register struct mbuf *m; { register struct mbuf *n; register int s; debug(DBmbuf,"m_freem(%x):",m); if (m == NULL) { debug(DBmbuf," NULL\n"); return; } s = splimp(); do { MBFREE(m, n); debug(DBmbuf," MBFREE(%x,%x)",m,n); } while (m = n); splx(s); debug(DBmbuf,"\n"); } /* * Mbuffer utility routines. */ struct mbuf * m_copy(m, off, len) register struct mbuf *m; int off; register int len; { register struct mbuf *n, **np; struct mbuf *top, *p; int type; debug(DBmbuf,"m_copy(%x,%d,%d):",m,off,len); if (len == 0){ debug(DBmbuf," empty\n"); return (0); } if (off < 0 || len < 0) panic("m_copy"); type = m->m_type; while (off > 0) { if (m == 0) panic("m_copy"); if (off < m->m_len) break; off -= m->m_len; m = m->m_next; } np = ⊤ top = 0; while (len > 0) { if (m == 0) { if (len != M_COPYALL) panic("m_copy"); break; } MBGET(n, M_WAIT, type); debug(DBmbuf," MBGET(%x,%d,%s)",n,M_WAIT,types[type]); *np = n; if (n == 0) goto nospace; n->m_len = MIN(len, m->m_len - off); if (m->m_off > MMAXOFF) { p = mtod(m, struct mbuf *); n->m_off = ((int)p - (int)n) + off; mclrefcnt[mtocl(p)]++; } else bcopy(mtod(m, caddr_t)+off, mtod(n, caddr_t), (unsigned)n->m_len); if (len != M_COPYALL) len -= n->m_len; off = 0; m = m->m_next; np = &n->m_next; } debug(DBmbuf," %x\n",top); return (top); nospace: debug(DBmbuf," nospace(%x)\n",top); m_freem(top); return (0); } m_cat(m, n) register struct mbuf *m, *n; { debug(DBmbuf,"m_cat(%x,%x): ",m,n); while (m->m_next) m = m->m_next; while (n) { if (m->m_off >= MMAXOFF || m->m_off + m->m_len + n->m_len > MMAXOFF) { /* just join the two chains */ m->m_next = n; debug(DBmbuf,"joined(%x,%x)\n",m,n); return; } /* splat the data from one into the other */ bcopy(mtod(n, caddr_t), mtod(m, caddr_t) + m->m_len, (u_int)n->m_len); m->m_len += n->m_len; n = m_free(n); debug(DBmbuf,"new(%x) ",n); } } /* strip off |len| bytes from mbuf; len>0: from front; len<0: from back */ m_adj(mp, len) struct mbuf *mp; register int len; { register struct mbuf *m, *n; debug(DBmbuf,"m_adj(%x,%d)\n",mp,len); if ((m = mp) == NULL) return; if (len >= 0) { while (m != NULL && len > 0) { if (m->m_len <= len) { len -= m->m_len; m->m_len = 0; m = m->m_next; } else { m->m_len -= len; m->m_off += len; break; } } } else { /* a 2 pass algorithm might be better */ len = -len; while (len > 0 && m->m_len != 0) { while (m != NULL && m->m_len != 0) { n = m; m = m->m_next; } if (n->m_len <= len) { len -= n->m_len; n->m_len = 0; m = mp; } else { n->m_len -= len; break; } } } } struct mbuf * m_pullup(m0, len) struct mbuf *m0; int len; { register struct mbuf *m, *n; int count; debug(DBmbuf,"m_pullup(%x,%d): ",m0,len); n = m0; if (len > MLEN) goto bad; MBGET(m, M_DONTWAIT, n->m_type); if (m == 0) goto bad; m->m_len = 0; do { count = MIN(MLEN - m->m_len, len); if (count > n->m_len) count = n->m_len; bcopy(mtod(n, caddr_t), mtod(m, caddr_t)+m->m_len, (unsigned)count); len -= count; m->m_len += count; n->m_off += count; n->m_len -= count; if (n->m_len) break; n = m_free(n); } while (n); if (len) { (void) m_free(m); goto bad; } m->m_next = n; debug(DBmbuf,"%x\n",m); return (m); bad: debug(DBmbuf,"bad %x\n",n); m_freem(n); return (0); } #endif /* SOCKET */ E 1 h00844 s 00001/00001/00180 d D 4.4 87/05/14 16:04:26 build 8 7 c removed old SCCS strings and inserted #ident BB e s 00036/00029/00145 d D 4.3 87/04/16 18:18:52 dc 7 6 c dc - Add Bull updates from 03/05/87 e s 00011/00011/00163 d D 4.2 87/04/15 17:43:06 dc 6 5 c dc - changed #include "sys/..." to #include e s 00000/00000/00174 d D 4.1 87/02/20 13:28:43 build 5 4 c rolled rev to -r4 /dc e s 00000/00000/00174 d D 3.1 87/01/19 09:21:24 build 4 3 c rolled rev to -r3 /dc e s 00000/00000/00174 d D 2.1 87/01/19 09:21:24 build 3 2 c AUTO NULL DELTA e s 00001/00000/00173 d D 1.2 87/01/16 10:14:24 build 2 1 c add ident string /dc e s 00173/00000/00000 d D 1.1 87/01/09 16:34:15 build 1 0 c Placed under source control - dc e u U f b f n t T I 2 D 7 /* "%W% %E%" */ E 7 I 7 D 8 /* " %W% %E% " */ E 8 I 8 #ident " %W% %E% " E 8 E 7 E 2 I 1 D 6 #include "sys/types.h" #include "sys/param.h" #include "sys/dir.h" #include "sys/signal.h" #include "sys/inode.h" #include "sys/user.h" #include "sys/buf.h" #include "sys/page.h" #include "sys/region.h" #include "sys/sysmacros.h" #include "sys/debug.h" E 6 I 6 #include #include #include #include #include #include #include #include #include #include #include E 6 D 7 /* Build the list of block numbers for a file. This is used * for mapped files. */ E 7 I 7 /* * Build the list of block numbers for a file. This is used * for mapped files. */ E 7 bldblklst(ip) register struct inode *ip; { register int i; register int lim; register int *lp ; register int *eptr ; register int nblks ; register int bsize ; register int blkspp ; extern daddr_t *bldindr(); ASSERT(ip->i_map == 0); D 7 /* Get number of blocks to be mapped * and allocate a block list */ E 7 I 7 /* * Get number of blocks to be mapped * and allocate a block list */ E 7 bsize = FsBSIZE(ip->i_dev) ; nblks = (ip->i_size + bsize - 1)/bsize ; blkspp = NBPP/bsize ; i = ((nblks + blkspp -1) / blkspp) * blkspp ; ip->i_map = (daddr_t *)sptalloc(btop(i), PG_V | PG_KW, 0); if (ip->i_map == NULL) return(-1) ; bzero(ip->i_map,i) ; lp = ip->i_map; eptr = &lp[nblks]; D 7 /* Get the block numbers from the direct blocks first. */ E 7 I 7 /* * Get the block numbers from the direct blocks first. */ E 7 if(nblks < 10) lim = nblks; else lim = 10; for(i = 0 ; i < lim ; i++) *lp++ = ip->i_addr[i]; if(lp >= eptr) return(0); D 7 /* Now do the indirect blocks */ E 7 I 7 /* * Now do the indirect blocks */ E 7 while(lp < eptr) { lp = bldindr(lp, eptr, ip->i_dev, ip->i_addr[i], i - 10); if(lp == (daddr_t *)-1) return(-1); i++; } return(0); } daddr_t * bldindr(lp, eptr, edev, blknbr, indlvl) register daddr_t *lp; register daddr_t *eptr; register int edev; daddr_t blknbr; int indlvl; { register struct buf *bp; register daddr_t *bnptr; int cnt; struct buf *bread(); bp = bread(edev, blknbr); if(u.u_error) { brelse(bp); return((daddr_t *) -1); } bnptr = bp->b_un.b_daddr; cnt = FsNINDIR(edev); ASSERT(indlvl >= 0); while(cnt-- && lp < eptr) { if(indlvl == 0) { *lp++ = *bnptr++; } else { lp = bldindr(lp, eptr, edev, *bnptr++, indlvl-1); if(lp == (daddr_t *)-1) { brelse(bp); return((daddr_t *) -1); } } } brelse(bp); return(lp); } D 7 /* Free the block list attached to an inode. */ E 7 I 7 /* * Free the block list attached to an inode. */ E 7 freeblklst(ip) register struct inode *ip; { struct dbd dbd; reg_t reg; register nblks,blkspp,i ; register int bsize ; ASSERT(ip->i_map); reg.r_iptr = ip; dbd.dbd_type = DBD_FILE; bsize = FsBSIZE(ip->i_dev) ; nblks = (ip->i_size + bsize -1) / bsize ; blkspp = NBPP / bsize ; nblks = ((nblks + blkspp -1) / blkspp) * blkspp ; D 7 /* Walk through block list removing cached pages * associated with the inode */ E 7 I 7 /* * Walk through block list removing cached pages * associated with the inode */ E 7 for (i = 0 ; i < nblks ; i += blkspp) { /* D 7 * Note the following grossness. When we * inserted these pages, we used either * the first or the second block number * to hash on depending on whether the * page was private or shared. Now we * don't know wich it is so we must do * the page. Note that the page wich * contains both text and data could * be in the table twice so we must do * both pbremove's even if the first * one succeeds. E 7 I 7 * Note the following grossness. When we * inserted these pages, we used either * the first or the second block number * to hash on depending on whether the * page was private or shared. Now we * don't know wich it is so we must do * the page. Note that the page wich * contains both text and data could * be in the table twice so we must do * both pbremove's even if the first * one succeeds. E 7 */ dbd.dbd_blkno = i ; reg.r_type = RT_PRIVATE ; pbremove(®, &dbd); reg.r_type = RT_STEXT ; pbremove(®, &dbd); } D 7 /* Free up block list */ E 7 I 7 /* * Free up block list */ E 7 sptfree(ip->i_map, btop(nblks), 1); ip->i_map = NULL; } E 1 h17951 s 00001/00001/00150 d D 4.6 87/05/14 16:04:37 build 11 10 c removed old SCCS strings and inserted #ident BB e s 00001/00001/00150 d D 4.5 87/05/07 18:59:10 van 10 9 c van - move defsocket.h back to /usr/include/sys e s 00001/00001/00150 d D 4.4 87/04/29 16:26:08 van 9 8 c van - moved ucb networking includes to INCUCB e s 00001/00002/00150 d D 4.3 87/04/16 18:19:05 dc 8 7 c dc - Add Bull updates from 03/05/87 e s 00011/00011/00141 d D 4.2 87/04/15 17:43:15 dc 7 6 c dc - changed #include "sys/..." to #include e s 00000/00000/00152 d D 4.1 87/02/20 13:28:47 build 6 5 c rolled rev to -r4 /dc e s 00000/00001/00152 d D 3.2 87/02/13 13:41:50 build 5 4 c add bull changes from Jan 23 /dc e s 00000/00000/00153 d D 3.1 87/01/19 09:21:26 build 4 3 c rolled rev to -r3 /dc e s 00000/00000/00153 d D 2.1 87/01/19 09:21:26 build 3 2 c AUTO NULL DELTA e s 00001/00000/00152 d D 1.2 87/01/16 10:14:27 build 2 1 c add ident string /dc e s 00152/00000/00000 d D 1.1 87/01/09 16:34:16 build 1 0 c Placed under source control - dc e u U f b f n t T I 2 D 8 /* "%W% %E%" */ E 2 I 1 D 5 /* %Z% Bull-Sems SPIX %Q%/%M% %I% %E% */ E 5 E 8 I 8 D 11 /* " %W% %E% " */ E 11 I 11 #ident " %W% %E% " E 11 E 8 #ifdef SOCKET /* * Procedures diverses pour compatibilite systemV / BSD * * - uiomove * - ufavail compte le nombre de file-descriptor libres */ D 7 #include "sys/param.h" #include "sys/types.h" #include "sys/dir.h" #include "sys/signal.h" #include "sys/user.h" #include "sys/errno.h" #include "sys/page.h" #include "sys/proc.h" #include "sys/var.h" #include "sys/uio.h" #include "sys/defsocket.h" E 7 I 7 #include #include #include #include #include #include #include #include #include #include D 9 #include E 9 I 9 D 10 #include "sys/defsocket.h" E 10 I 10 #include E 10 E 9 E 7 /* * procfind * Trouver une structure proc a partir du pid */ struct proc * procfind(pid) register short pid; { register struct proc *p; for (p = &proc[0]; p < &proc[v.v_proc]; p++) { if (p -> p_pid == pid) { return (p); } } return ((struct proc *) 0); } /* * ufavail */ ufavail() { register int i, avail = 0; for (i = 0; i < NOFILE; i++) if (u.u_ofile[i] == NULL) avail++; return (avail); } /* * uiomove */ uiomove(cp, n, rw, uio) register caddr_t cp; register int n; enum uio_rw rw; register struct uio *uio; { register struct iovec *iov; u_int cnt; int error = 0; while (n > 0 && uio->uio_resid) { iov = uio->uio_iov; cnt = iov->iov_len; if (cnt == 0) { uio->uio_iov++; uio->uio_iovcnt--; continue; } if (cnt > n) cnt = n; switch (uio->uio_segflg) { case 0: case 2: if (rw == UIO_READ) { error = copyout(cp, iov->iov_base, cnt); } else { error = copyin(iov->iov_base, cp, cnt); } if (error) { return (error); } break; case 1: if (rw == UIO_READ){ bcopy((caddr_t)cp, iov->iov_base, cnt); } else { bcopy(iov->iov_base, (caddr_t)cp, cnt); } break; } iov->iov_base += cnt; iov->iov_len -= cnt; uio->uio_resid -= cnt; uio->uio_offset += cnt; cp += cnt; n -= cnt; } return (error); } /* * pas implemente */ selwakeup(p,coll) register struct proc *p; int coll; { panic("selwakeup"); } /* * insque - remque */ struct que { struct que *next; struct que *prev; }; void insque(new, pred) struct que *new, *pred; { int s = spl7(); new->next = pred->next; new->prev = pred; (pred->next)->prev = new; pred->next = new; splx(s); } struct que *remque(entry) struct que *entry; { int s = spl7(); (entry->prev)->next = entry->next; (entry->next)->prev = entry->prev; splx(s); return(entry); } #endif /* SOCKET */ E 1 h60963 s 00001/00001/00237 d D 4.4 87/05/14 16:04:47 build 8 7 c removed old SCCS strings and inserted #ident BB e s 00001/00001/00237 d D 4.3 87/04/16 18:19:18 dc 7 6 c dc - Add Bull updates from 03/05/87 e s 00019/00019/00219 d D 4.2 87/04/15 17:43:24 dc 6 5 c dc - changed #include "sys/..." to #include e s 00000/00000/00238 d D 4.1 87/02/20 13:28:50 build 5 4 c rolled rev to -r4 /dc e s 00000/00000/00238 d D 3.1 87/01/19 09:21:29 build 4 3 c rolled rev to -r3 /dc e s 00000/00000/00238 d D 2.1 87/01/19 09:21:29 build 3 2 c AUTO NULL DELTA e s 00001/00000/00237 d D 1.2 87/01/16 10:14:30 build 2 1 c add ident string /dc e s 00237/00000/00000 d D 1.1 87/01/09 16:34:17 build 1 0 c Placed under source control - dc e u U f b f n t T I 2 D 7 /* "%W% %E%" */ E 7 I 7 D 8 /* " %W% %E% " */ E 8 I 8 #ident " %W% %E% " E 8 E 7 E 2 I 1 D 6 #include "sys/types.h" #include "sys/psl.h" #include "sys/param.h" #include "sys/systm.h" #include "sys/sysinfo.h" #include "sys/callo.h" #include "sys/dir.h" #include "sys/signal.h" #include "sys/user.h" #include "sys/page.h" #include "sys/clock.h" #include "sys/region.h" #include "sys/proc.h" #include "sys/text.h" #include "sys/var.h" #include "sys/tuneable.h" #include "sys/sysmacros.h" #include "sys/map.h" #include "sys/swap.h" E 6 I 6 #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include E 6 /* * clock is called straight from * the real time clock interrupt. * * Functions: * reprime clock * implement callouts * maintain user/system times * maintain date * profile * alarm clock signals * jab the scheduler */ #define PRF_ON 01 extern prfstat; extern vhand(); extern bdflush() ; time_t time, lbolt; int switching; int vhandcnt; /* counter for t_vhandr */ int bdflushcnt; /* counter for t_bdflushr */ extern char runin; extern char addupc_clk ; short lticks; clock(pc, ps) caddr_t pc; { register struct proc *pp; register preg_t *prp; register reg_t *rp; register a; register swpt_t *st; static rqlen, sqlen; extern caddr_t idle_addr; extern int freemem; /* * if panic stop clock */ if (panicstr) { ccb.timer1_count = LONGTIME; return; } /* * profiling */ #ifdef PCS pcsintr(pc, ps); #endif /* * if any callout active, update first non-zero time */ if (callout[0].c_func != NULL) { register struct callo *cp; cp = &callout[0]; while(cp->c_time<=0 && cp->c_func!=NULL) cp++; cp->c_time--; } if (callout[0].c_time <= 0) timein(); if (prfstat & PRF_ON) prfintr(pc, ps); if (USERMODE(ps)) { a = CPU_USER; u.u_utime++; if (u.u_prof.pr_scale) addupc_clk++ ; } else { if (pc == idle_addr) /* clock interrupt while idle */ { if (syswait.iowait+syswait.swap+syswait.physio) { a = CPU_WAIT; if (syswait.iowait) sysinfo.wait[W_IO]++; if (syswait.swap) sysinfo.wait[W_SWAP]++; if (syswait.physio) sysinfo.wait[W_PIO]++; } else a = CPU_IDLE; } else { a = CPU_KERNAL; u.u_stime++; } } sysinfo.cpu[a]++; pp = u.u_procp; if (pp->p_stat==SRUN) { /* Update memory usage for the currently * running process. */ for(prp = pp->p_region ; rp = prp->p_reg ; prp++) { if(rp->r_type == RT_PRIVATE) { u.u_mem += rp->r_nvalid; } else { if (rp->r_refcnt == 0) continue; u.u_mem += rp->r_nvalid/rp->r_refcnt; } } } if (!switching && pp->p_cpu < 80) pp->p_cpu++; lbolt++; /* time in ticks */ if (--lticks <= 0) { if (critical(ps)) return; lticks += HZ; ++time; runrun++; minfo.freemem = freemem; minfo.freeswap = 0; for(st = swaptab; st < &swaptab[MSFILES]; st++) { if(st->st_ucnt == NULL) continue; minfo.freeswap += st->st_nfpgs; } rqlen = 0; sqlen = 0; for(pp = &proc[0]; pp < (struct proc *)v.ve_proc; pp++) if (pp->p_stat) { if (pp->p_time != SCHMAX) pp->p_time++; if (pp->p_clktim) if (--pp->p_clktim == 0) psignal(pp, SIGALRM); pp->p_cpu >>= 1; if (pp->p_pri >= (PUSER-NZERO)) { pp->p_pri = (pp->p_cpu>>1) + PUSER + pp->p_nice - NZERO; } if (pp->p_stat == SRUN) if (pp->p_flag & SLOAD) rqlen++; else sqlen++; } if (rqlen) { sysinfo.runque += rqlen; sysinfo.runocc++; } if (sqlen) { sysinfo.swpque += sqlen; sysinfo.swpocc++; } /* * Wake up paging process every t_vhandr * if memory is running low */ if (--vhandcnt <= 0) { vhandcnt = tune.t_vhandr; if(freemem < tune.t_vhandl) wakeup((caddr_t)vhand); } /* * Wake up bdflush to write out DELWRI * buffers which have been around to long. */ if (--bdflushcnt <= 0) { bdflushcnt = tune.t_bdflushr ; wakeup((caddr_t)bdflush) ; } /* * Wakeup sched if * memory is tight or someone is not loaded (runin set) */ if (runin) { runin = 0; wakeup(&runin); } } } E 1 h40052 s 00001/00001/00052 d D 4.4 87/05/14 16:04:57 build 9 8 c removed old SCCS strings and inserted #ident BB e s 00005/00001/00048 d D 4.3 87/04/16 18:20:20 dc 8 7 c dc - Add Bull updates from 03/05/87 e s 00021/00021/00028 d D 4.2 87/04/15 17:43:31 dc 7 6 c dc - changed #include "sys/..." to #include e s 00000/00000/00049 d D 4.1 87/02/20 13:28:54 build 6 5 c rolled rev to -r4 /dc e s 00037/00003/00012 d D 3.2 87/01/26 13:15:21 build 5 4 c add page table changes /dc e s 00000/00000/00015 d D 3.1 87/01/19 09:21:31 build 4 3 c rolled rev to -r3 /dc e s 00000/00000/00015 d D 2.1 87/01/19 09:21:31 build 3 2 c AUTO NULL DELTA e s 00001/00000/00014 d D 1.2 87/01/16 10:14:33 build 2 1 c add ident string /dc e s 00014/00000/00000 d D 1.1 87/01/09 16:34:19 build 1 0 c Placed under source control - dc e u U f b f n t T I 2 D 8 /* "%W% %E%" */ E 8 I 8 D 9 /* " %W% %E% " */ E 9 I 9 #ident " %W% %E% " E 9 E 8 E 2 I 1 D 5 #include "sys/param.h" E 5 D 7 #include "sys/types.h" I 5 #include "sys/param.h" #include "sys/sysmacros.h" #include "sys/systm.h" #include "sys/map.h" #include "sys/dir.h" #include "sys/signal.h" #include "sys/user.h" #include "sys/errno.h" #include "sys/file.h" #include "sys/page.h" #include "sys/region.h" #include "sys/buf.h" #include "sys/inode.h" #include "sys/acct.h" #include "sys/sysinfo.h" #include "sys/seg.h" #include "sys/reg.h" #include "sys/var.h" #include "sys/proc.h" E 5 #include "sys/debug.h" E 7 I 7 #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include E 7 extern unsigned long dblev; debug(lev, s, x) uint lev; { D 5 if (lev & dblev) { E 5 I 5 if (lev & dblev) { E 5 print(s, &x); D 5 } E 5 I 5 if (lev & FATAL) I 8 #ifdef KDB E 8 call_debug() ; I 8 #else call_rbug(RBUG) ; #endif E 8 } } setlev() { register struct a { int level ; } *uap ; if (!suser()) return ; u.u_rval1 = dblev ; uap = (struct a *)u.u_ap ; dblev = uap->level ; E 5 } E 1 h55416 s 00001/00001/00283 d D 4.4 87/05/14 16:05:08 build 8 7 c removed old SCCS strings and inserted #ident BB e s 00001/00001/00283 d D 4.3 87/04/16 18:20:33 dc 7 6 c dc - Add Bull updates from 03/05/87 e s 00014/00014/00270 d D 4.2 87/04/15 17:43:40 dc 6 5 c dc - changed #include "sys/..." to #include e s 00000/00000/00284 d D 4.1 87/02/20 13:28:56 build 5 4 c rolled rev to -r4 /dc e s 00000/00000/00284 d D 3.1 87/01/19 09:21:34 build 4 3 c rolled rev to -r3 /dc e s 00000/00000/00284 d D 2.1 87/01/19 09:21:34 build 3 2 c AUTO NULL DELTA e s 00001/00000/00283 d D 1.2 87/01/16 10:14:35 build 2 1 c add ident string /dc e s 00283/00000/00000 d D 1.1 87/01/09 16:34:20 build 1 0 c Placed under source control - dc e u U f b f n t T I 2 D 7 /* "%W% %E%" */ E 7 I 7 D 8 /* " %W% %E% " */ E 8 I 8 #ident " %W% %E% " E 8 E 7 E 2 I 1 D 6 #include "sys/param.h" #include "sys/types.h" #include "sys/sysmacros.h" #include "sys/systm.h" #include "sys/page.h" #include "sys/buf.h" #include "sys/conf.h" #include "sys/map.h" #include "sys/utsname.h" #include "sys/elog.h" #include "sys/erec.h" #include "sys/err.h" #include "sys/iobuf.h" #include "sys/var.h" E 6 I 6 #include #include #include #include #include #include #include #include #include #include #include #include #include #include E 6 int blkacty; errinit() { if (err.e_nslot) { mapinit(err.e_map, (err.e_nslot+3)/2); mfree(err.e_map, err.e_nslot, 1); } err.e_org = err.e_ptrs; err.e_nxt = err.e_ptrs; } struct errhdr * geteslot(size) { register ns, *p; register struct errhdr *ep; int n, sps; ns = (size+sizeof(struct errhdr)+sizeof(struct errslot)-1) /sizeof(struct errslot); sps = splhi(); n = malloc(err.e_map, ns); splx(sps); if (n == 0) return(NULL); ep = (struct errhdr *)(&err.e_slot[--n]); ns *= sizeof(struct errslot)/sizeof(int); p = (int *)ep; do { *p++ = 0; } while(--ns); ep->e_len = size + sizeof(struct errhdr); return(++ep); } freeslot(ep) register struct errhdr *ep; { register ns, sps; ns = (ep->e_len+sizeof(struct errslot)-1)/sizeof(struct errslot); sps = splhi(); mfree(err.e_map, ns, (((struct errslot *)ep)-err.e_slot)+1); splx(sps); } struct errhdr * geterec() { register sps; register struct errhdr *ep; sps = splhi(); while(*err.e_org == NULL) { err.e_flag |= E_SLP; sleep(&err.e_org, PZERO+1); } ep = *err.e_org; *err.e_org++ = NULL; if (err.e_org >= &err.e_ptrs[err.e_nslot]) err.e_org = err.e_ptrs; splx(sps); return(ep); } puterec(ep, type) register struct errhdr *ep; { register sps; (--ep)->e_type = type; ep->e_time = time; sps = splhi(); *err.e_nxt++ = ep; if (err.e_nxt >= &err.e_ptrs[err.e_nslot]) err.e_nxt = err.e_ptrs; splx(sps); if (err.e_flag&E_SLP) { err.e_flag &= ~E_SLP; wakeup(&err.e_org); } } logstart() { register sps; register struct estart *ep; sps = splhi(); for(err.e_org = &err.e_ptrs[err.e_nslot-1]; err.e_org >= err.e_ptrs; err.e_org--) if (*err.e_org != NULL) { freeslot(*err.e_org); *err.e_org = NULL; } err.e_org = err.e_ptrs; err.e_nxt = err.e_ptrs; ep = (struct estart *)geteslot(sizeof(struct estart)); splx(sps); if (ep == NULL) return; ep->e_name = utsname; puterec(ep, E_GOTS); } logtchg(nt) time_t nt; { register struct etimchg *ep; if ((ep = (struct etimchg *)geteslot(sizeof(struct etimchg))) != NULL) { ep->e_ntime = nt; puterec(ep, E_TCHG); } } logstray(addr) physadr addr; { register struct estray *ep; if ((ep = (struct estray *)geteslot(sizeof(struct estray))) != NULL) { ep->e_saddr = addr; ep->e_sbacty = blkacty; puterec(ep, E_STRAY); } } fmtberr(dp, cyl) register struct iobuf *dp; { register struct eblock *ep; register struct buf *bp; register n; register short *p; struct br { struct eblock eb; short cregs[1]; }; struct iostat *iosp; register short *rp; if (dp->io_erec != NULL) { dp->io_erec->e_rtry++; return; } iosp = dp->io_stp; if (dp->io_addr == NULL || (ep = (struct eblock *)geteslot(sizeof(struct eblock)+ (dp->io_nreg*sizeof(short)))) == NULL) { iosp->io_unlog++; return; } n = major(dp->b_dev); bp = dp->b_actf; ep->e_dev = makedev(n, (bp==NULL)?minor(dp->b_dev):minor(bp->b_dev)); ep->e_regloc = dp->io_addr; ep->e_bacty = blkacty; ep->e_stats.io_ops = iosp->io_ops; ep->e_stats.io_misc = iosp->io_misc; ep->e_stats.io_unlog = iosp->io_unlog; if (bp != NULL) { ep->e_bflags = (bp->b_flags&B_READ) ? E_READ : E_WRITE; if (bp->b_flags & B_PHYS) ep->e_bflags |= E_PHYS; if (bp->b_flags & B_MAP) ep->e_bflags |= E_MAP; ep->e_bnum = bp->b_blkno; ep->e_bytes = bp->b_bcount; ep->e_memadd = paddr(bp); } else ep->e_bflags = E_NOIO; ep->e_cyloff = cyl; ep->e_nreg = dp->io_nreg; p = (short *)(&((struct br *)ep)->cregs[0]); n = dp->io_nreg; rp = (short *)dp->io_addr; while(--n >= 0) *p++ = *rp++; dp->io_erec = ep; } fmtraerr(dp) register struct iobuf *dp; { register struct eblock *ep; register n, *p; register long *rp; struct br { struct eblock eb; long cregs[1]; }; struct iostat *iosp; iosp = dp->io_stp; if ( (ep = (struct eblock *)geteslot(sizeof(struct eblock)+ (dp->io_nreg*sizeof(long)))) == NULL) { iosp->io_unlog++; return; } ep->e_dev = dp->b_dev; ep->e_stats.io_ops = iosp->io_ops; ep->e_stats.io_misc = iosp->io_misc; ep->e_stats.io_unlog = iosp->io_unlog; ep->e_nreg = dp->io_nreg; #ifdef DEBUG printf("ep->e_dev = %x(hex)\n",ep->e_dev); printf("ep->e_stats.io_ops = %x(hex)\n",ep->e_stats.io_ops); printf("ep->e_stats.io_misc = %x(hex)\n",ep->e_stats.io_misc); printf("ep->e_stats.io_unlog = %x(hex)\n",ep->e_stats.io_unlog); printf("ep->e_nreg = %x(hex)\n",ep->e_nreg); #endif p = (long *)(&((struct br *)ep)->cregs[0]); /* now copy the contents of struct mlg into the error record */ n = dp->io_nreg; rp = (long *)dp->io_addr; #ifdef DEBUG while(--n >= 0) { *p = *rp++; printf("mlgreg = %x(hex)\n",*p); p++; } #else while(--n >= 0) *p++ = *rp++; #endif dp->io_erec = ep; } logberr(dp, erf) register struct iobuf *dp; { register struct eblock *ep; if ((ep = dp->io_erec) == NULL) return; if (erf) ep->e_bflags |= E_ERROR; puterec(ep, E_BLK); dp->io_erec = NULL; } logmemory(er, ad) { register struct ememory *ep; if ((ep = (struct ememory *)geteslot(sizeof(struct ememory)))!=NULL) { ep->e_sbier = er; ep->e_memcad = ad; puterec(ep, E_PRTY); } } E 1 h58513 s 00001/00001/00596 d D 4.5 87/05/14 16:05:19 build 11 10 c removed old SCCS strings and inserted #ident BB e s 00050/00000/00547 d D 4.4 87/04/30 18:48:02 dc 10 9 c dc - Change default trap settings e s 00034/00013/00513 d D 4.3 87/04/16 18:22:14 dc 9 8 c dc - Add Bull updates from 03/05/87 e s 00024/00024/00502 d D 4.2 87/04/15 17:43:49 dc 8 7 c dc - changed #include "sys/..." to #include e s 00000/00000/00526 d D 4.1 87/02/20 13:29:00 build 7 6 c rolled rev to -r4 /dc e s 00034/00039/00492 d D 3.3 87/02/13 13:50:51 build 6 5 c add bull changes from Jan 23 /dc e s 00054/00035/00477 d D 3.2 87/01/26 13:16:34 build 5 4 c add page table changes /dc e s 00000/00000/00512 d D 3.1 87/01/19 09:21:37 build 4 3 c rolled rev to -r3 /dc e s 00000/00000/00512 d D 2.1 87/01/19 09:21:37 build 3 2 c AUTO NULL DELTA e s 00001/00000/00511 d D 1.2 87/01/16 10:14:40 build 2 1 c add ident string /dc e s 00511/00000/00000 d D 1.1 87/01/09 16:34:22 build 1 0 c Placed under source control - dc e u U f b f n t T I 2 D 9 /* "%W% %E%" */ E 9 I 9 D 11 /* " %W% %E% " */ E 11 I 11 #ident " %W% %E% " E 11 E 9 E 2 I 1 D 8 #include "sys/types.h" #include "sys/param.h" #include "sys/sysmacros.h" #include "sys/systm.h" #include "sys/map.h" #include "sys/dir.h" #include "sys/signal.h" #include "sys/user.h" #include "sys/errno.h" #include "sys/file.h" #include "sys/page.h" #include "sys/region.h" #include "sys/buf.h" #include "sys/inode.h" #include "sys/acct.h" #include "sys/sysinfo.h" #include "sys/seg.h" #include "sys/reg.h" #include "sys/var.h" #include "sys/proc.h" E 8 I 8 #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include E 8 D 8 #include "sys/filehdr.h" #include "sys/scnhdr.h" #include "sys/aouthdr.h" E 8 I 8 #include #include #include E 8 D 8 #include "sys/debug.h" E 8 I 8 #include E 8 #define NPARGS btop(NCARGS) reg_t execreg; /* * exec system call, with and without environments. */ struct execa { char *fname; char **argp; char **envp; }; exece() { register unsigned nc; register char *cp; register struct execa *uap; register char *psap; int na, ne, ucp, ap, c; char *args; int saveargs; unsigned bno; struct inode *ip; extern struct inode *gethead(); sysinfo.sysexec++; if ((ip = gethead()) == NULL) return; na = nc = ne = 0; uap = (struct execa *)u.u_ap; /* collect arglist */ if ((saveargs = sptalloc(NPARGS, PG_V|PG_KW, 0)) == NULL) { iput(ip); u.u_error = ENOMEM; return; } args = (char *) saveargs; if (uap->argp) for (;;) { ap = NULL; if (uap->argp) { ap = fuword((caddr_t)uap->argp); uap->argp++; } if (ap==NULL && uap->envp) { uap->argp = NULL; if ((ap = fuword((caddr_t)uap->envp)) == NULL) break; uap->envp++; ne++; } if (ap==NULL) break; na++; if (ap == -1) u.u_error = EFAULT; do { if (nc >= NCARGS-1) u.u_error = E2BIG; if ((c = fubyte((caddr_t)ap++)) < 0) u.u_error = EFAULT; if (u.u_error) goto bad; nc++; *args++ = c; } while (c>0); } nc = (nc + NBPW-1) & ~(NBPW-1); getxfile(ip, nc + sizeof(char *)*na); if (u.u_error) { psignal(u.u_procp, SIGKILL); goto bad; } /* copy back arglist */ args = (char *) saveargs; psap = u.u_psargs; ucp = USRSTACK - nc - NBPW; ap = ucp - na*NBPW - 3*NBPW; u.u_ar0[SP] = ap; suword((caddr_t)ap, na-ne); nc = 0; for (;;) { ap += NBPW; if (na==ne) { suword((caddr_t)ap, 0); while (psap < &u.u_psargs[PSARGSZ]) *psap++ = 0; ap += NBPW; } if (--na < 0) break; suword((caddr_t)ap, ucp); do { subyte((caddr_t)ucp++, (c = *args++)); if (psap < &u.u_psargs[PSARGSZ]) *psap++ = (c&0377) ? c : ' '; nc++; } while (c&0377); } while (psap < &u.u_psargs[PSARGSZ]) *psap++ = 0; setregs(); iput(ip); sptfree(saveargs, NPARGS, 1); return; bad: iput(ip); sptfree(saveargs, NPARGS, 1); } struct inode * gethead() { register struct inode *ip; register unsigned ds, ts; struct ehd{ struct filehdr ef; struct aouthdr af; struct scnhdr sf[4]; }*ep; struct buf *bp; daddr_t bn; if ((ip = namei(uchar, 0)) == NULL) return(NULL); if (access(ip, IEXEC) || (ip->i_mode & IFMT) != IFREG || (ip->i_mode & (IEXEC|(IEXEC>>3)|(IEXEC>>6))) == 0) { u.u_error = EACCES; goto bad; } /* * read in first few bytes of file for segment sizes * filehdr.f_magic = SPS9WRMAGIC or SPS9ROMAGIC * WRMAGIC is plain executable * ROMAGIC is read only text (RO) * SPS9WRMAGIC is a common object file plain executable * aouthdr.magic is WRMAGIC * SPS9ROMAGIC is a common object file read only text * aouthdr.magic is ROMAGIC or PGMAGIC if page-aligned * set ux_tstart to start of text portion */ /* * Read file header assuming new post-5.0 format */ u.u_count = sizeof(*ep); u.u_offset = 0; bp = 0; bn = bmap(ip, B_READ); if (u.u_error) goto bad; if (bn < 0) { u.u_error = ENOEXEC; goto bad; } bp = bread(u.u_pbdev, (daddr_t)bn); ep = (struct ehd *)bp->b_un.b_addr; /* * Setup pointers to virtual address space */ if ((ep->ef.f_magic == SPS9WRMAGIC) || (ep->ef.f_magic == SPS9ROMAGIC)) { bcopy(&ep->af, &u.u_exdata, sizeof(struct ufhd)); u.u_exdata.ux_datorg = u.u_exdata.ux_unused; u.u_exdata.ux_txtorg = u.u_exdata.ux_entloc; u.u_exdata.ux_entloc = u.u_exdata.ux_ssize; u.u_exdata.ux_tstart = sizeof(struct filehdr) + ep->ef.f_opthdr + (ep->ef.f_nscns * sizeof(struct scnhdr)); } else { /* * Old pre 5.0 format */ bcopy(&ep->ef, &u.u_exdata, sizeof(struct ufhd)); u.u_exdata.ux_txtorg = 0; u.u_exdata.ux_datorg = (u.u_exdata.ux_tsize + NBPP - 1) &~ (NBPP - 1); u.u_exdata.ux_tstart = sizeof(u.u_exdata); } brelse(bp); ip->i_flag |= IACC ; u.u_segflg = 0; /* * WRMAGIC: A vestige from the past */ if (u.u_exdata.ux_mag == WRMAGIC) { ds = btop((long)u.u_exdata.ux_tsize + (long)u.u_exdata.ux_dsize + (long)u.u_exdata.ux_bsize); ts = 0; u.u_exdata.ux_dsize += u.u_exdata.ux_tsize; u.u_exdata.ux_tsize = 0; u.u_exdata.ux_datorg = u.u_exdata.ux_txtorg; } else if (u.u_exdata.ux_mag == ROMAGIC || u.u_exdata.ux_mag == PGMAGIC) { ts = btop(u.u_exdata.ux_tsize); ds = btop(u.u_exdata.ux_dsize+u.u_exdata.ux_bsize); if ((ip->i_flag&ITEXT) == 0 && ip->i_count != 1) { register struct file *fp; for (fp = file; fp < (struct file *)v.ve_file; fp++) if (fp->f_count && fp->f_inode == ip && (fp->f_flag&FWRITE)) { u.u_error = ETXTBSY; goto bad; } } ip->i_flag |= ITEXT; } else { u.u_error = ENOEXEC; goto bad; } chksize(ts, ds, SSIZE + btop(NCARGS - 1)); bad: if (u.u_error) { iput(ip); ip = NULL; } return(ip); } /* * Read in and set up memory for executed file. */ getxfile(ip, nargc) register struct inode *ip; { D 5 register size, npgs, t, base; E 5 I 5 D 6 register size, npgs, t, base; E 6 I 6 register size, npgs, t, base; E 6 E 5 register reg_t *rp; register preg_t *prp; D 5 struct proc *p; dbd_t *dbd; int rgva; int offset; int (**fptr)(); pte_t *pt; int *ptr; E 5 I 5 D 6 struct proc *p; dbd_t *dbd; int rgva; int offset; int (**fptr)(); pte_t *pt; int *ptr; E 6 I 6 struct proc *p; dbd_t *dbd; int rgva; int offset; int (**fptr)(); pte_t *pt; int *ptr; E 6 register scte_t *sct ; register int i ; I 10 int inexbits; E 10 E 5 shmexec(); punlock(); u.u_prof.pr_scale = 0; p = u.u_procp; D 5 /* Free the processes current regions. Note that * detachreg compacts the region list in the proc * table. */ E 5 I 5 D 6 /* * Free the processes current regions. Note that * detachreg compacts the region list in the proc * table. */ E 6 I 6 /* Free the processes current regions. Note that * detachreg compacts the region list in the proc * table. */ E 6 E 5 prp = p->p_region; while(rp = prp->p_reg) { reglock(rp); if (prp->p_type == PT_STACK) { growreg(&u, prp, -(rp->r_pgsz), 0, DBD_DZERO); regrele(rp); prp++; } else detachreg(&u, prp); } I 5 /* * Free segment tables */ E 5 I 5 sct = p->p_sct ; for (i = 0 ; i < NBSECT - 1 ; i++) { if (sct->sgt_paddr) kpgtfree(sct->sgt_paddr, NPTPSC) ; sct->sgt_paddr = 0 ; sct++ ; } E 5 /* * the process can no longer deal for itself */ D 9 for (ptr = &u.u_signal[0]; ptr < &u.u_signal[NSIG]; ptr++) E 9 I 9 u.u_pcb.traps_word = USR_DEFAULT_TRPSW ; I 10 #if USR_DEFAULT_TRPSW & TRPSW_REALINEX /* * If FPE includes inexact, move to position * to match cpu type. Save the bit in case signal is ignored. */ if ( ! ftHeadwall) { u.u_pcb.traps_word &= ~TRPSW_REALINEX; u.u_pcb.traps_word |= TRPSW_REALINEXEFP; inexbits = TRPSW_REALINEXEFP; } else inexbits = TRPSW_REALINEX; #endif USR_DEFAULT_TRPSW & TRPSW_REALINEX E 10 for (i = 0, ptr = &u.u_signal[0]; ptr < &u.u_signal[NSIG]; ptr++, i++) E 9 if ((*ptr & 1) == 0) I 10 /* signals being caught are forced back to default*/ E 10 *ptr = 0; I 9 else I 10 /* * Signals being ignored are left that way, but * if such a signal involves one of the DEFAULT_TRPSW * bits, then shut off the trap bit too. */ E 10 switch(i+1) { I 10 #if USR_DEFAULT_TRPSW & TRPSW_INTOVER case SIGINTOVER: u.u_pcb.traps_word &= ~TRPSW_INTOVER ; #endif USR_DEFAULT_TRPSW & TRPSW_INTOVER #if USR_DEFAULT_TRPSW & TRPSW_INTDIVZERO E 10 case SIGINTDIVZERO: u.u_pcb.traps_word &= ~TRPSW_INTDIVZERO ; break ; I 10 #endif USR_DEFAULT_TRPSW & TRPSW_INTDIVZERO #if USR_DEFAULT_TRPSW & TRPSW_REALOVER E 10 case SIGREALOVER: u.u_pcb.traps_word &= ~TRPSW_REALOVER ; break ; I 10 #endif USR_DEFAULT_TRPSW & TRPSW_REALOVER #if USR_DEFAULT_TRPSW & TRPSW_REALUNDER E 10 case SIGREALUNDER: u.u_pcb.traps_word &= ~TRPSW_REALUNDER ; break ; I 10 #endif USR_DEFAULT_TRPSW & TRPSW_REALUNDER #if USR_DEFAULT_TRPSW & TRPSW_REALDIVZERO E 10 case SIGREALDIVZERO: u.u_pcb.traps_word &= ~TRPSW_REALDIVZERO ; break ; I 10 #endif USR_DEFAULT_TRPSW & TRPSW_REALDIVZERO #if USR_DEFAULT_TRPSW & TRPSW_REALINEX case SIGREALINEX: u.u_pcb.traps_word &= ~inexbits; break ; #endif USR_DEFAULT_TRPSW & TRPSW_REALINEX #if USR_DEFAULT_TRPSW & TRPSW_REALBEFORE case SIGREALBEFORE: u.u_pcb.traps_word &= ~TRPSW_REALBEFORE ; break ; #endif USR_DEFAULT_TRPSW & TRPSW_REALBEFORE E 10 } E 9 /* D 5 * if ROMAGIC, load it like a WRMAGIC */ E 5 I 5 D 6 * If ROMAGIC, load it like a WRMAGIC */ E 6 I 6 * if ROMAGIC, load it like a WRMAGIC */ E 6 E 5 if (u.u_exdata.ux_mag == ROMAGIC) if (get410(ip) < 0) goto out; else goto stack; D 5 /* Load text region */ E 5 I 5 D 6 /* * Load text region */ E 6 I 6 D 9 /* Load text region */ E 9 I 9 /* * Load text region */ E 9 E 6 E 5 if (xalloc(ip) == -1) goto out; D 5 /* Allocate the data region. */ E 5 I 5 D 6 /* * Allocate the data region. */ E 6 I 6 D 9 /* Allocate the data region. */ E 9 I 9 /* * Allocate the data region. */ E 9 E 6 E 5 base = u.u_exdata.ux_datorg; u.u_datorg = u.u_exdata.ux_datorg; size = u.u_exdata.ux_dsize; rgva = base & ~SOFFMASK; if((rp = allocreg(ip, RT_PRIVATE)) == NULL) goto out; D 5 /* Attach the data region to this process. */ E 5 I 5 D 6 /* * Attach the data region to this process. */ E 6 I 6 D 9 /* Attach the data region to this process. */ E 9 I 9 /* * Attach the data region to this process. */ E 9 E 6 E 5 if((prp = attachreg(rp, &u, rgva, PT_DATA, PG_V | PG_UW)) == NULL) { freereg(rp); goto out; } /* * Load data region D 5 */ E 5 I 5 D 6 */ E 6 I 6 D 9 */ E 9 I 9 */ E 9 E 6 E 5 if (size) { offset = u.u_exdata.ux_tstart + u.u_exdata.ux_tsize; if(u.u_exdata.ux_mag == PGMAGIC) { if(mapreg(prp, base, ip, offset, size) < 0) { detachreg(&u, prp); goto out; } } else { if(loadreg(prp, base, ip, offset, size) < 0) { detachreg(&u, prp); goto out; } } } /* * Allocate bss as demand zero D 5 */ E 5 I 5 D 6 */ E 6 I 6 D 9 */ E 9 I 9 */ E 9 E 6 E 5 npgs = btop(soff(base) + size + u.u_exdata.ux_bsize) - btop(soff(base) + size); if (npgs) { if(growreg(&u, prp, npgs, 0, DBD_DZERO) < 0) { detachreg(&u, prp); goto out; } } regrele(rp); D 5 /* Grow the stack. */ E 5 I 5 D 6 /* * Grow the stack. */ E 6 I 6 D 9 /* Grow the stack. */ E 9 I 9 /* * Grow the stack. */ E 9 E 6 E 5 stack: prp = findpreg(p, PT_STACK); reglock(prp->p_reg); npgs = SSIZE + btop(nargc); if(growreg(&u, prp, npgs, 0, DBD_DZERO) < 0) { regrele(prp->p_reg); goto out; } regrele(prp->p_reg); /* D 5 * set SUID/SGID protections, if no tracing */ E 5 I 5 D 6 * Set SUID/SGID protections, if no tracing */ E 6 I 6 * set SUID/SGID protections, if no tracing D 9 */ E 9 I 9 */ E 9 E 6 E 5 if ((u.u_procp->p_flag&STRC)==0) { if (ip->i_mode&ISUID) u.u_uid = ip->i_uid; if (ip->i_mode&ISGID) u.u_gid = ip->i_gid; u.u_procp->p_suid = u.u_uid; } else psignal(u.u_procp, SIGTRAP); return; out: ip->i_flag &= ~ITEXT; u.u_error = ENOEXEC; } /* D 5 * load ROMAGIC text and data into a single region */ E 5 I 5 D 6 * Load ROMAGIC text and data into a single region */ E 6 I 6 * load ROMAGIC text and data into a single region */ E 6 E 5 get410(ip) struct inode *ip; { int size, org, base, change, count, npgs; preg_t *prp; reg_t *rp; /* D 5 * load the text */ E 5 I 5 D 6 * Load the text */ E 6 I 6 * load the text */ E 6 E 5 size = u.u_exdata.ux_tsize; if ((rp = allocreg(ip, RT_PRIVATE)) == NULL) return(-1); org = u.u_exdata.ux_txtorg; D 5 u.u_procp->p_txtsegno = u.u_procp->p_dsegno ; E 5 if ((prp = attachreg(rp, &u, 0, PT_DATA, SEG_RW)) == NULL) { freereg(rp); return(-1); } if (loadreg(prp, org, ip, u.u_exdata.ux_tstart, size) < 0) { detachreg(&u, prp); return(-1); } /* D 5 * load data */ E 5 I 5 D 6 * Load data */ E 6 I 6 * load data */ E 6 E 5 base = u.u_exdata.ux_datorg; u.u_datorg = u.u_exdata.ux_datorg; size = u.u_exdata.ux_dsize; if (size) { int tmp; change = btop(base + size) -(rp->r_pgsz + rp->r_pgoff) ; if (growreg(&u, prp, change, change, DBD_DZERO) <0) { detachreg(&u, prp); return(-1); } u.u_segflg = 0; u.u_base = (caddr_t)base; u.u_count = size; u.u_offset = u.u_exdata.ux_tstart + u.u_exdata.ux_tsize; regrele(rp); readi(ip); reglock(rp); if (u.u_count) { regrele(rp); return(-1); } } /* D 5 * allocate bss as demand zero */ E 5 I 5 D 6 * Allocate bss as demand zero */ E 6 I 6 * allocate bss as demand zero */ E 6 E 5 npgs = btop(size + u.u_exdata.ux_bsize) - btop(size); if (npgs) if (growreg(&u, prp, npgs, 0, DBD_DZERO) < 0) { detachreg(&u, prp); return(-1); } regrele(rp); return(0); } E 1 h41621 s 00001/00001/00181 d D 4.5 87/05/14 16:05:32 build 11 10 c removed old SCCS strings and inserted #ident BB e s 00001/00000/00181 d D 4.4 87/04/16 19:55:06 dc 10 9 c dc - Add Bull updates from 03/05/87 e s 00016/00013/00165 d D 4.3 87/04/16 18:23:50 dc 9 8 c dc - Add Bull updates from 03/05/87 e s 00013/00013/00165 d D 4.2 87/04/15 17:44:03 dc 8 7 c dc - changed #include "sys/..." to #include e s 00000/00000/00178 d D 4.1 87/02/20 13:29:03 build 7 6 c rolled rev to -r4 /dc e s 00006/00006/00172 d D 3.3 87/02/13 13:53:46 build 6 5 c add bull changes from Jan 23 /dc e s 00017/00007/00161 d D 3.2 87/01/26 13:17:59 build 5 4 c add page table changes /dc e s 00000/00000/00168 d D 3.1 87/01/19 09:21:40 build 4 3 c rolled rev to -r3 /dc e s 00000/00000/00168 d D 2.1 87/01/19 09:21:40 build 3 2 c AUTO NULL DELTA e s 00001/00000/00167 d D 1.2 87/01/16 10:14:44 build 2 1 c add ident string /dc e s 00167/00000/00000 d D 1.1 87/01/09 16:34:24 build 1 0 c Placed under source control - dc e u U f b f n t T I 2 D 9 /* "%W% %E%" */ E 9 I 9 D 11 /* " %W% %E% " */ E 11 I 11 #ident " %W% %E% " E 11 E 9 E 2 I 1 D 8 #include "sys/types.h" #include "sys/param.h" #include "sys/sysmacros.h" #include "sys/systm.h" #include "sys/dir.h" #include "sys/signal.h" #include "sys/user.h" #include "sys/errno.h" #include "sys/var.h" #include "sys/page.h" #include "sys/region.h" #include "sys/proc.h" #include "sys/debug.h" E 8 I 8 #include #include #include #include #include #include #include #include #include #include #include #include #include E 8 /* * Release resources. * Enter zombie state. * Wake up parent and init processes, * and dispose of children. D 5 */ E 5 I 5 D 6 */ E 6 I 6 */ E 6 E 5 exit(rv) { register int i; register struct proc *p, *q; register int (**fptr)(); register preg_t *prp; register reg_t *rp; I 5 register scte_t *sct ; E 5 p = u.u_procp; p->p_flag &= ~(STRC); p->p_clktim = 0; for (i=0; ip_pid == p->p_pgrp) && (u.u_ttyp != NULL) && (*u.u_ttyp == p->p_pgrp)) { *u.u_ttyp = 0; signal(p->p_pgrp, SIGHUP); } p->p_pgrp = 0; D 9 for (i=0; ip_region; while(rp = prp->p_reg) { reglock(rp); detachreg(&u, prp); } I 5 sct = p->p_sct ; for (i = 0 ; i < NBSECT ; i++) { if (sct->sgt_paddr) kpgtfree(sct->sgt_paddr,NPTPSC) ; sct->sgt_paddr = 0 ; sct++ ; } E 5 p->p_stat = SZOMB; ((struct xproc *)p)->xp_xstat = rv; ((struct xproc *)p)->xp_utime = u.u_cutime + u.u_utime; ((struct xproc *)p)->xp_stime = u.u_cstime + u.u_stime; for (q = &proc[1]; q < (struct proc *)v.ve_proc; q++) { if (p->p_pid == q->p_ppid) { q->p_ppid = 1; if (q->p_stat == SZOMB) psignal(&proc[1], SIGCLD); if (q->p_stat == SSTOP) setrun(q); } else if (p->p_ppid == q->p_pid) psignal(q, SIGCLD); if (p->p_pid == q->p_pgrp) q->p_pgrp = 0; } swtch(); /* no deposit, no return */ } /* * Wait system call. * Search for a terminated (zombie) child, * finally lay it to rest, and collect its status. * Look also for stopped (traced) children, * and pass back status from them. D 5 */ E 5 I 5 D 6 */ E 6 I 6 */ E 6 E 5 wait() { register f; register struct proc *p; loop: f = 0; for (p = &proc[1]; p < (struct proc *)v.ve_proc; p++) if (p->p_ppid == u.u_procp->p_pid) { f++; if (p->p_stat == SZOMB) { freeproc(p, 1); return; } if (p->p_stat == SSTOP) { if ((p->p_flag&SWTED) == 0) { p->p_flag |= SWTED; u.u_rval1 = p->p_pid; u.u_rval2 = (fsig(p->p_sig)<<8) | 0177; return; } continue; } } if (f) { sleep((caddr_t)u.u_procp, PWAIT); goto loop; } u.u_error = ECHILD; } /* * Remove zombie children from the process table. D 5 */ E 5 I 5 D 6 */ E 6 I 6 */ E 6 E 5 freeproc(p, flag) register struct proc *p; { if (flag) { register n; n = u.u_procp->p_cpu + p->p_cpu; if (n > 80) n = 80; u.u_procp->p_cpu = n; u.u_rval1 = p->p_pid; u.u_rval2 = ((struct xproc *)p)->xp_xstat; } u.u_cutime += ((struct xproc *)p)->xp_utime; u.u_cstime += ((struct xproc *)p)->xp_stime; p->p_stat = NULL; p->p_pid = 0; p->p_ppid = 0; p->p_sig = 0L; p->p_flag = 0; p->p_wchan = 0; D 5 p->p_txtsegno = 0 ; E 5 } I 9 pexit() { register int i; for (i=0; i e s 00000/00000/00644 d D 4.1 87/02/20 13:29:07 build 7 6 c rolled rev to -r4 /dc e s 00002/00002/00642 d D 3.3 87/01/29 15:44:55 build 6 5 c change svtop to btotp e s 00125/00168/00519 d D 3.2 87/01/26 13:19:42 build 5 4 c add page table changes /dc e s 00000/00000/00687 d D 3.1 87/01/19 09:21:43 build 4 3 c rolled rev to -r3 /dc e s 00000/00000/00687 d D 2.1 87/01/19 09:21:43 build 3 2 c AUTO NULL DELTA e s 00001/00000/00686 d D 1.2 87/01/16 10:14:48 build 2 1 c add ident string /dc e s 00686/00000/00000 d D 1.1 87/01/09 16:34:25 build 1 0 c Placed under source control - dc e u U f b f n t T I 2 D 9 /* "%W% %E%" */ E 9 I 9 D 10 /* " %W% %E% " */ E 10 I 10 #ident " %W% %E% " E 10 E 9 E 2 I 1 D 8 #include "sys/types.h" #include "sys/param.h" #include "sys/seg.h" #include "sys/sysmacros.h" #include "sys/systm.h" #include "sys/dir.h" #include "sys/signal.h" #include "sys/user.h" #include "sys/errno.h" #include "sys/inode.h" #include "sys/var.h" #include "sys/page.h" #include "sys/region.h" #include "sys/buf.h" #include "sys/utsname.h" #include "sys/sysinfo.h" #include "sys/pfdat.h" #include "sys/proc.h" #include "sys/map.h" #include "sys/swap.h" #include "sys/tuneable.h" #include "sys/debug.h" D 5 #include "sys/vrt.h" E 5 #include "sys/trap.h" E 8 I 8 #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include E 8 extern int freemem ; #if PFLOGON == 1 #define PFLGSZ 256 struct pfdlog { char type ; /* 3=memfree ; 2=vfault ; 1=allocate ; 0=pfree */ char pfuse ; short pfnum ; unsigned int process ; unsigned int retva ; struct region *regp ; } pfdlog[] ; extern int pflgndx ; #endif /* * Protection fault handler * vaddr -> virtual address of fault */ D 5 pfault(vaddr,fault_type) E 5 I 5 pfault(vaddr) E 5 { register pte_t *pt ; I 5 register sgte_t *st ; register scte_t *sct ; E 5 register pfd_t *pfd ; register reg_t *rp ; register dbd_t *dbd ; D 5 register vrte_t *vrt_e ; ushort segno ; E 5 preg_t *prp ; pte_t pttmp ; int tmp ; int oldpri ; I 5 int i ; E 5 D 5 /* Check that the fault is due to a copy on write page */ E 5 I 5 D 9 /* * Check that the fault is due to a copy on write page */ E 9 I 9 /* Check that the fault is due to a copy on write page */ E 9 E 5 D 5 pt = upte(u.u_procp,svtop(vaddr)) ; E 5 I 5 D 6 i = svtop(vaddr) ; E 6 I 6 i = btotp(vaddr) ; E 6 sct = u.u_procp->p_sct + ((i & L2MASK) >> (L1WIDTH+L0WIDTH)) ; st = (sgte_t *)ptol(sct->sgt_paddr) + ((i & L1MASK) >> L0WIDTH) ; pt = (pte_t *)ptol(sttop(st->pt_paddr)) + (i & L0MASK) ; E 5 D 5 if (!pt->pgm.pg_cw) E 5 I 5 if (!st->pt_w) E 5 return(0) ; oldpri = curpri ; /* Save priority for later restoral */ /* Get a pointer to the region which the faulting * virtual address is in. */ prp = findreg(u.u_procp, vaddr) ; rp = prp->p_reg ; reglock(rp) ; D 5 segno = u.u_procp->p_dsegno ; E 5 /* D 5 * pfault is called from Xpfault in that case the page is valid * from useracces,copyin,copyout,fuword,suword,... * in that case we must be sure that the page is valid * if not valid call vfault E 5 I 5 * Pfault is called from Xpfault in that case the page is valid E 5 */ if (!(pt->pgi.pg_pte & PG_V)) D 5 { regrele(rp) ; if ((tmp = vfault(vaddr,fault_type)) <= 0) return(tmp) ; reglock(rp) ; } E 5 I 5 panic("pfault before vfault") ; E 5 D 5 /* Find the vrt entry for this page */ vrt_e = vrt_find(pt,segno) ; #ifdef OSDEBUG if (!vrt_e) { printf("pfault - cannot find vrt entry\n") ; call_debug() ; } #endif E 5 minfo.pfault++ ; D 5 /* Find dbd as mapped by region */ E 5 I 5 D 9 /* * Find dbd as mapped by region */ E 9 I 9 /* Find dbd as mapped by region */ E 9 E 5 tmp = btotp(vaddr - (int)prp->p_regva) ; dbd = (dbd_t *)&(rp->r_list[tmp/NPGPT][tmp%NPGPT]) + NPGPT ; pfd = pfdat + pt->pgm.pg_pfn ; D 5 /* Copy on write * If use is > 1, or page is associated with a file, copy it */ E 5 I 5 D 9 /* * Copy on write * If use is > 1, or page is associated with a file, copy it */ E 9 I 9 /* Copy on write * If use is > 1, or page is associated with a file, copy it */ E 9 E 5 if(pfd->pf_use > 1 || dbd->dbd_type == DBD_FILE || dbd->dbd_type == DBD_LAST) { minfo.cw++ ; pttmp.pgi.pg_pte = 0 ; D 5 tmp = pt->pgm.pg_lock ; pt->pgm.pg_lock = 1 ; ptmemall(rp, &pttmp, 1, 1) ; pt->pgm.pg_lock = tmp ; E 5 I 5 tmp = pt->pgi.pg_pte & PG_LOCK ; pt->pgi.pg_pte |= PG_LOCK ; ptmemall(rp, &pttmp, 1, 0) ; pt->pgi.pg_pte |= tmp ; E 5 copypage(pt->pgm.pg_pfn, pttmp.pgm.pg_pfn) ; pfree(rp, pt, dbd, 1) ; *pt = pttmp ; } else { D 5 /* Break the disk association of the page */ E 5 I 5 D 9 /* * Break the disk association of the page */ E 9 I 9 /* Break the disk association of the page */ E 9 E 5 minfo.steal++ ; if (pfd->pf_flags & P_HASH) premove(pfd) ; if (dbd->dbd_type == DBD_SWAP) swfree1(dbd) ; dbd->dbd_type = DBD_NONE ; } D 5 /* Make page table entry writeable and * clear translation buffer */ E 5 I 5 /* * Mark page writeable */ E 5 D 5 pt->pgm.pg_cw = 0 ; if (rp->r_type != RT_STEXT) { pt->pgm.pg_prot = PTE_UW ; vrt_e->pg_w = VRT_UW ; } E 5 I 5 pt->pgi.pg_pte |= (PG_M | PG_W | PG_V) ; E 5 D 5 pt->pgi.pg_pte |= (PG_V | PG_M) ; vrt_e->pg_pfn = pt->pgm.pg_pfn ; vrt_e->pg_v = VRT_V ; vrt_e->pg_d = VRT_M ; E 5 regrele(rp) ; u.u_procp->p_pri = curpri = oldpri ; return(1) ; } /* * Translation fault handler * vaddr -> virtual address D 5 */ vfault(vaddr,fault_type) E 5 I 5 D 9 */ E 9 I 9 */ E 9 vfault(vaddr) E 5 { register reg_t *rp ; register pte_t *pt ; D 5 register vrte_t *vrt_e ; register ushort segno ; E 5 preg_t *prp ; register dbd_t *dbd ; int tmp ; int oldpri ; D 5 pte_t **st ; E 5 I 5 register sgte_t *st ; register scte_t *sct ; int i ; E 5 if ((uint)vaddr >= USRSTACK) return(0) ; I 5 D 6 i = svtop(vaddr) ; E 6 I 6 i = btotp(vaddr) ; E 6 sct = u.u_procp->p_sct + ((i & L2MASK) >> (L1WIDTH+L0WIDTH)) ; if (!sct->sgt_paddr) return(0) ; st = (sgte_t *)ptol(sct->sgt_paddr) + ((i & L1MASK) >> L0WIDTH) ; if (!st->pt_paddr) return(0) ; pt = (pte_t *)ptol(sttop(st->pt_paddr)) + (i & L0MASK) ; E 5 /* D 5 * Check for a data virtuel addres less * than the virtuel address of the data region. * This is a specific problem of SPS9 E 5 I 5 D 9 * Check for an unassigned page. This is a real error. E 9 I 9 * Check for a data virtuel addres less * than the virtuel address of the data region. * This is a specific problem of SPS9 E 9 E 5 */ D 5 if (fault_type == DATA_FAULT) { prp = findpreg(u.u_procp,PT_DATA) ; if (vaddr < (int)prp->p_regva) return(0) ; else segno = u.u_procp->p_dsegno ; } else segno = u.u_procp->p_txtsegno ; st = uste(u.u_procp,svtop(vaddr)) ; if (!*st) return(0) ; else pt = upte(u.u_procp,svtop(vaddr)) ; /* Check for an unassigned page. This is a real error. */ E 5 if (pt->pgi.pg_pte == 0) return(0) ; D 9 /* * Check for reference bit fault. See getpages.c */ E 9 I 9 /* Check for an unassigned page. This is a real error. */ E 9 D 5 if (pt->pgi.pg_pte & PG_NDREF) E 5 I 5 if (pt->pgi.pg_pte & PG_REF) E 5 { pt->pgi.pg_pte |= PG_V ; D 5 pt->pgi.pg_pte &= ~PG_NDREF ; valid_vrtentrys(pt) ; if (!vrt_find(pt,segno)) vrt_insert(vaddr,pt,segno) ; E 5 return(1) ; } minfo.vfault++ ; oldpri = curpri ; /* Save CPU priority for later restoral */ D 5 /* Lock the region containing the page that faulted. */ E 5 I 5 D 9 /* * Lock the region containing the page that faulted. */ E 9 I 9 /* Lock the region containing the page that faulted. */ E 9 E 5 prp = findreg(u.u_procp, vaddr) ; rp = prp->p_reg ; reglock(rp) ; D 5 /* Check that the page has not been read in by * another process while we were waiting for * it on the reglock above. */ E 5 I 5 D 9 /* * Check that the page has not been read in by * another process while we were waiting for * it on the reglock above. */ E 9 I 9 /* Check that the page has not been read in by * another process while we were waiting for * it on the reglock above. */ E 9 E 5 if (pt->pgi.pg_pte & PG_V) { D 5 valid_vrtentrys(pt) ; if (!vrt_find(pt,segno)) vrt_insert(vaddr,pt,segno) ; E 5 regrele(rp) ; curpri = u.u_procp->p_pri = oldpri ; return(1) ; } D 5 /* Find pte and dbd as mapped by region */ E 5 I 5 D 9 /* * Find pte and dbd as mapped by region */ E 9 I 9 /* Find pte and dbd as mapped by region */ E 9 E 5 tmp = btotp(vaddr - (int)prp->p_regva) ; pt = &rp->r_list[tmp/NPGPT][tmp%NPGPT] ; dbd = (dbd_t *)pt + NPGPT ; D 5 /* See what state the page is in. */ E 5 I 5 D 9 /* * See what state the page is in. */ E 9 I 9 /* See what state the page is in. */ E 9 E 5 switch (dbd->dbd_type) { case DBD_DFILL: case DBD_DZERO: D 5 /* Demand zero or demand fill page. */ E 5 I 5 D 9 /* * Demand zero or demand fill page. */ E 9 I 9 /* Demand zero or demand fill page. */ E 9 E 5 minfo.demand++ ; if (ptmemall(rp, pt, 1, 0)) { regrele(rp) ; curpri = u.u_procp->p_pri = oldpri ; return(1) ; } if (dbd->dbd_type == DBD_DZERO) clearpage(pt->pgm.pg_pfn) ; dbd->dbd_type = DBD_NONE ; pt->pgi.pg_pte |= PG_V ; D 5 valid_vrtentrys(pt) ; if (!vrt_find(pt,segno)) vrt_insert(vaddr,pt,segno) ; E 5 break ; case DBD_SWAP: case DBD_FILE: case DBD_LAST: { register pte_t *ptep ; register dbd_t *dbdp ; register i ; register count ; struct pfdat *pfd ; pte_t *endreg ; int type ; int swpi ; int maxprepage ; int curblk ; int nextblk ; /* If the page we want is in memory already, take it */ if (pageincache(rp, pt, dbd)) { minfo.cache++ ; D 5 valid_vrtentrys(pt) ; if (!vrt_find(pt,segno)) vrt_insert(vaddr,pt,segno) ; E 5 break ; } D 5 /* Otherwise, get page(s) from disk. First reserve memory * for the ptfill below. We must do this now to prevent * pinsert dups. */ E 5 I 5 D 9 /* * Otherwise, get page(s) from disk. First reserve memory * for the ptfill below. We must do this now to prevent * pinsert dups. */ E 9 I 9 /* Otherwise, get page(s) from disk. First reserve memory * for the ptfill below. We must do this now to prevent * pinsert dups. */ E 9 E 5 if (memreserve(rp, tune.t_prep + 1)) { D 5 /* We went to sleep waiting for memory. * Check if the page we're after got loaded in * the mean time. If so, give back the memory * and return */ E 5 I 5 D 9 /* * We went to sleep waiting for memory. * Check if the page we're after got loaded in * the mean time. If so, give back the memory * and return */ E 9 I 9 /* We went to sleep waiting for memory. * Check if the page we're after got loaded in * the mean time. If so, give back the memory * and return */ E 9 E 5 if (pt->pgi.pg_pte & PG_V) { D 5 if (!vrt_find(pt,segno)) call_debug() ; E 5 freemem += tune.t_prep + 1 ; break ; } if (pageincache(rp, pt, dbd)) { minfo.cache++ ; freemem += tune.t_prep + 1 ; D 5 valid_vrtentrys(pt) ; if (!vrt_find(pt,segno)) vrt_insert(vaddr,pt,segno) ; E 5 break ; } } D 5 /* Scan ptes and dbds looking for a run of * contiguous pages to load from disk */ E 5 I 5 D 9 /* * Scan ptes and dbds looking for a run of * contiguous pages to load from disk */ E 9 I 9 /* Scan ptes and dbds looking for a run of * contiguous pages to load from disk */ E 9 E 5 tmp = btots(vaddr - (int)prp->p_regva) ; if (stopg(tmp+1) < rp->r_pgoff + rp->r_pgsz) endreg = &rp->r_list[tmp][NPGPT] ; else { i = rp->r_pgoff + rp->r_pgsz - stopg(tmp) ; endreg = &rp->r_list[tmp][i] ; } type = dbd->dbd_type ; swpi = dbd->dbd_swpi ; maxprepage = tune.t_prep ; count = 1 ; ptep = pt + 1 ; dbdp = dbd + 1 ; D 5 if (dbd->dbd_blkno == DBD_SWAP) E 5 I 5 if (dbd->dbd_type == DBD_SWAP) E 5 curblk = dbd->dbd_blkno ; while ( (ptep < endreg) && !(ptep->pgi.pg_pte & PG_V) && (count < maxprepage) && (dbdp->dbd_type == type) && !(pfind(rp, dbdp)) ) { if (type == DBD_SWAP) { if ( (dbdp->dbd_swpi != swpi) || (dbdp->dbd_blkno != curblk+NDPP) ) break ; curblk += NDPP ; } count++ ; ptep++ ; dbdp++ ; } D 5 /* Give back excess memory we're holding and fill * in page tables with real pages. */ E 5 I 5 D 9 /* * Give back excess memory we're holding and fill * in page tables with real pages. */ E 9 I 9 /* Give back excess memory we're holding and fill * in page tables with real pages. */ E 9 E 5 ASSERT(tune.t_prep + 1 >= count) ; freemem += (tune.t_prep + 1 - count) ; rp->r_nvalid += count ; D 5 ptfill(pt, count, rp->r_type, 0) ; E 5 I 5 ptfill(pt, count, rp->r_type, 0, 0) ; E 5 /* D 5 * We now have a series of ptes with page frames * assigned, whose rightful contents are not in the * page cache. Pinsert the page frames, and read from * disk. */ E 5 I 5 D 9 * We now have a series of ptes with page frames * assigned, whose rightful contents are not in the * page cache. Pinsert the page frames, and read from * disk. */ E 9 I 9 * We now have a series of ptes with page frames * assigned, whose rightful contents are not in the * page cache. Pinsert the page frames, and read from * disk. */ E 9 E 5 vaddr &= ~(NBPP-1) ; if (type == DBD_SWAP) { int swapdel ; minfo.swap++ ; swapdel = swaptab[swpi].st_flags & ST_INDEL ; if (swapdel == 0) { ptep = pt ; dbdp = dbd ; for (i=0 ; ipgm.pg_pfn]) ; ptep++ ; dbdp++ ; } } swap(dbd, pt, count, B_READ) ; ptep = pt ; dbdp = dbd ; for (i=0 ; idbd_type = DBD_NONE ; } D 5 /* Mark the I/O done, and awaken anyone * waiting for pfdats */ E 5 I 5 D 9 /* * Mark the I/O done, and awaken anyone * waiting for pfdats */ E 9 I 9 /* Mark the I/O done, and awaken anyone * waiting for pfdats */ E 9 E 5 pfd = &pfdat[ptep->pgm.pg_pfn] ; pfd->pf_flags |= P_DONE ; if (pfd->pf_flags & P_WANT) { pfd->pf_flags &= ~P_WANT ; wakeup(pfd) ; } ptep->pgi.pg_pte |= PG_V ; ptep->pgi.pg_pte &= ~PG_M ; D 5 valid_vrtentrys(ptep) ; if (!vrt_find(ptep,segno)) vrt_insert(vaddr,ptep,segno) ; E 5 ptep++ ; dbdp++ ; D 5 vaddr += NBPP ; E 5 } } else { /* DBD_FILE */ dev_t edev ; struct dbd *tmpdbd, *enddbd ; struct buf *bp = NULL ; register int *bnptr ; register int bsize,offset,size ; int on,n,i ; register struct inode *ip ; I 5 caddr_t vaddr ; E 5 /* D 5 * Must read from a file. * Get the pfdat for the newly allocated * pages and insert them in the hash table. */ E 5 I 5 D 9 * Must read from a file. * Get the pfdat for the newly allocated * pages and insert them in the hash table. */ E 9 I 9 * Must read from a file. * Get the pfdat for the newly allocated * pages and insert them in the hash table. */ E 9 E 5 minfo.file++ ; edev = rp->r_iptr->i_dev ; ip = rp->r_iptr ; ptep = pt ; dbdp = dbd ; for (i=0 ; ipgm.pg_pfn]) ; ptep++ ; dbdp++ ; } D 5 /* Read the pages from the file */ E 5 I 5 D 9 /* * Read the pages from the file */ E 9 I 9 /* Read the pages from the file */ E 9 E 5 ptep = pt ; dbdp = dbd ; while (count > 0) { offset = dbdp->dbd_blkno * FsBSIZE(ip->i_dev) ; bsize = FsBSIZE(ip->i_dev) ; i = offset / bsize ; bnptr = &ip->i_map[i] ; on = offset - (i * bsize) ; I 5 vaddr = ptol(ptob(ptep->pgm.pg_pfn)) ; E 5 size = NBPP ; while (size > 0) { if (*bnptr == -1) break ; if (*bnptr) { if ((size > bsize) && *(bnptr +1)) bp = breada(edev, *bnptr, *(bnptr+1)) ; else bp = bread(edev, *bnptr) ; } else { call_debug() ; bp = geteblk() ; clrbuf(bp) ; } bnptr++ ; if (bp->b_flags & B_ERROR) { prdev("page read error", edev) ; brelse(bp) ; killpage(rp, ptep) ; regrele(rp) ; curpri = u.u_procp->p_pri = oldpri ; return(-1) ; } n = bsize - on ; if (n > size) n = size ; D 5 move_out(bp->b_un.b_addr + on , ptob(ptep->pgm.pg_pfn) + poff(vaddr),n) ; E 5 I 5 bcopy(bp->b_un.b_addr + on ,vaddr, n) ; E 5 brelse(bp) ; size -= n ; offset += n ; vaddr += n ; on = 0 ; } I 5 vaddr -= NBPP ; E 5 if (dbdp->dbd_type == DBD_LAST) { i = poff(rp->r_filesz) ; if(i > 0) D 5 zeropage(ptep->pgm.pg_pfn, i, NBPP-i) ; E 5 I 5 bzero(vaddr + i, NBPP-i) ; E 5 } ptep->pgi.pg_pte |= PG_V ; ptep->pgi.pg_pte &= ~PG_M ; D 5 valid_vrtentrys(ptep); if (!vrt_find(ptep,segno)) vrt_insert(vaddr-NBPP,ptep,segno) ; E 5 D 5 /* wakeup anyone waiting for the * page frame */ E 5 I 5 D 9 /* * Wakeup anyone waiting for the * page frame. */ E 9 I 9 /* wakeup anyone waiting for the * page frame */ E 9 E 5 pfd = &pfdat[ptep->pgm.pg_pfn] ; pfd->pf_flags |= P_DONE ; if (pfd->pf_flags & P_WANT) { pfd->pf_flags &= ~P_WANT ; wakeup(pfd) ; } ptep++ ; dbdp++ ; count-- ; } } break ; } case DBD_NONE: regrele(rp) ; curpri = u.u_procp->p_pri = oldpri ; return(0) ; default: panic("vfault - bad dbd_type") ; } regrele(rp) ; curpri = u.u_procp->p_pri = oldpri ; return(1) ; } /* * Check if the page described by dbd is in memory. * If it is, latch onto it. Return values: * 0 - page no where in sight. * 1 - got page */ pageincache(rp, pt, dbd) register reg_t *rp ; register pte_t *pt ; register dbd_t *dbd ; { register pfd_t *pfd ; D 5 /* Look in page cache */ E 5 I 5 D 9 /* * Look in page cache */ E 9 I 9 /* Look in page cache */ E 9 E 5 if (pfd = pfind(rp, dbd)) { D 5 /* We found it. If the page is on the freelist, * remove it. If freemem is zero, someone already * has reserved the page, and we cannot use it. */ E 5 I 5 D 9 /* * We found it. If the page is on the freelist, * remove it. If freemem is zero, someone already * has reserved the page, and we cannot use it. */ E 9 I 9 /* We found it. If the page is on the freelist, * remove it. If freemem is zero, someone already * has reserved the page, and we cannot use it. */ E 9 E 5 if (pfd->pf_flags & P_QUEUE) { ASSERT(pfd->pf_use == 0) ; ASSERT(pfd->pf_flags & P_DONE) ; if(freemem <= 0) { premove(pfd) ; return(0) ; } freemem-- ; pfd->pf_use = 1 ; pfd->pf_flags &= ~P_QUEUE ; pfd->pf_prev->pf_next = pfd->pf_next ; pfd->pf_next->pf_prev = pfd->pf_prev ; pfd->pf_next = NULL ; pfd->pf_prev = NULL ; } else { D 5 /* Wait for the i/o to complete. If bad is set, * after waking, return failure. */ E 5 I 5 D 9 /* * Wait for the i/o to complete. If bad is set, * after waking, return failure. */ E 9 I 9 /* Wait for the i/o to complete. If bad is set, * after waking, return failure. */ E 9 E 5 pfd->pf_use++ ; while ((pfd->pf_flags & P_DONE) == 0) { pfd->pf_flags |= P_WANT ; sleep(pfd, PMEM) ; } if (pfd->pf_flags & P_BAD) { pfd->pf_use-- ; return(0) ; } } rp->r_nvalid++ ; pt->pgm.pg_pfn = pfd - pfdat ; D 5 if (rp->r_type == RT_STEXT) pt->pgm.pg_prot = PTE_UR ; E 5 pt->pgi.pg_pte |= PG_V ; pt->pgi.pg_pte &= ~PG_M ; return(1) ; } return(0) ; } /* * Clean up after a read error during vfault processing. * This code frees the previously allocated page, and marks * the pfdat as bad. It leaves the pte, and dbd in their original * state. It assumes the pte is presently invalid. D 5 */ E 5 I 5 D 9 */ E 9 I 9 */ E 9 E 5 killpage(rp, pt) reg_t *rp ; register pte_t *pt ; { register pte_t save_pte ; register pfd_t *pfd ; save_pte = *pt ; pt->pgi.pg_pte |= PG_V ; pfd = &pfdat[pt->pgm.pg_pfn] ; pfd->pf_flags |= P_BAD|P_DONE ; if (pfd->pf_flags & P_WANT) { pfd->pf_flags &= ~P_WANT ; wakeup((caddr_t)pfd) ; } pfree(rp, pt, NULL, 1) ; *pt = save_pte ; } E 1 2 \ [ Z Y X W V U T S R Q P O N M L K J I H G F E D C B A @ ? > = < ; : 9 8 7 6 5 4 3 2 1 0 / . - , +and * validate before actual IO. */ openi(ip, flag) register struct inode *ip; { dev_t dev; register unsigned int maj; dev = (dev_t)ip->i_rdev; switch(ip->i_mode&IFMT) { case IFCHR: maj = major(dev); if (maj >= cdevcnt) goto bad; if (u.u_ttyp == NULL) u.u_ttyd = dev; (*cdevsw[maj].d_open)(minor(dev), flag); break; case IFBLK: maj = bmajor(dev); if (maj >= bdevcnt) goto bad; (*bdevsw[maj].d_open)(minor(dev), flag); break; case IFIFO: openp(ip, flag); break; } return; bad: u.u_error = ENXIO; } /* * Check mode permission on inode pointer. * Mode is READ, WRITE or EXEC. * In the case of WRITE, the read-only status of the file * system is checked. Also in WRITE, prototype text * segments cannot be written. * The mode is shifted to select the owner/group/other fields. * The super user is granted all permissions. */ access(ip, mode) register struct inode *ip; { register m; m = mode; if (m == IWRITE) { if (getfs(ip->i_dev)->s_ronly) { u.u_error = EROFS; return(1); } if (ip->i_flag&ITEXT) xrele(ip); if (ip->i_flag & ITEXT) { u.u_error = ETXTBSY; return(1); } } if (u.u_uid == 0) return(0); if (u.u_uid != ip->i_uid) { m >>= 3; if (u.u_gid != ip->i_gid) m >>= 3; } if ((ip->i_mode&m) != 0) return(0); u.u_error = EACCES; return(1); } /* * Look up a pathname and test if the resultant inode is owned by the * current user. If not, try for super-user. * If permission is granted, return inode pointer. */ struct inode * owner() { register struct inode *ip; ip = namei(uchar, 0); if (ip == NULL) return(NULL); if (u.u_uid == ip->i_uid || suser()) if (getfs(ip->i_dev)->s_ronly) u.u_error = EROFS; if (!u.u_error) return(ip); iput(ip); return(NULL); } /* * Test if the current user is the super user. */ suser() { if (u.u_uid == 0) { u.u_acflag |= ASU; return(1); } u.u_error = EPERM; return(0); } /* * Allocate a user file descriptor. */ ufalloc(i) register i; { for(; if_next; u.u_ofile[i] = fp; fp->f_count++; fp->f_inode = ip; fp->f_flag = flag; fp->f_offset = 0; #ifdef SOCKET fp->f_msgcount = 0; fp->f_type = DTYPE_INODE; #endif /* SOCKET */ return(fp); } struct file *ffreelist; finit() { register struct file *fp; for (ffreelist = fp = &file[0]; fp < &file[v.v_file-1]; fp++) fp->f_next = fp+1; } E 1 h38375 s 00001/00001/00644 d D 4.4 87/05/14 16:06:09 build 8 7 c removed old SCCS strings and inserted #ident BB e s 00005/00005/00640 d D 4.3 87/04/16 18:28:49 dc 7 6 c dc - Add Bull updates from 03/05/87 e s 00011/00011/00634 d D 4.2 87/04/15 17:44:45 dc 6 5 c dc - changed #include "sys/..." to #include e s 00000/00000/00645 d D 4.1 87/02/20 13:29:15 build 5 4 c rolled rev to -r4 /dc e s 00000/00000/00645 d D 3.1 87/01/19 09:21:50 build 4 3 c rolled rev to -r3 /dc e s 00000/00000/00645 d D 2.1 87/01/19 09:21:50 build 3 2 c AUTO NULL DELTA e s 00001/00000/00644 d D 1.2 87/01/16 10:14:58 build 2 1 c add ident string /dc e s 00644/00000/00000 d D 1.1 87/01/09 16:34:29 build 1 0 c Placed under source control - dc e u U f b f n t T I 2 D 7 /* "%W% %E%" */ E 7 I 7 D 8 /* " %W% %E% " */ E 8 I 8 #ident " %W% %E% " E 8 E 7 E 2 I 1 D 6 #include "sys/types.h" #include "sys/param.h" #include "sys/errno.h" #include "sys/file.h" #include "sys/inode.h" #include "sys/dir.h" #include "sys/signal.h" #include "sys/page.h" #include "sys/proc.h" #include "sys/user.h" #include "sys/flock.h" E 6 I 6 #include #include #include #include #include #include #include #include #include #include #include E 6 /* region types */ #define S_BEFORE 010 #define S_START 020 #define S_MIDDLE 030 #define S_END 040 #define S_AFTER 050 #define E_BEFORE 001 #define E_START 002 #define E_MIDDLE 003 #define E_END 004 #define E_AFTER 005 #define SLEEP(ptr, pri) sleep(ptr, pri) #define WAKEUP(ptr) if (ptr->stat.wakeflg) { \ wakeup(ptr); \ ptr->stat.wakeflg = 0 ; \ } #define l_end l_len #define MAXEND 017777777777 extern struct flckinfo flckinfo; /* configuration and acct info */ struct filock *frlock; /* pointer to record lock free list */ struct flino *frfid; /* file id free list */ struct flino *fids; /* file id head list */ struct flino sleeplcks; /* head of chain of sleeping locks */ /* find file id */ struct flino * findfid(fp) struct file *fp; { register struct flino *flip; register i; register dev_t d; register ino_t n; d = fp->f_inode->i_dev; n = fp->f_inode->i_number; flip = fids; while (flip != NULL) { if (flip->fl_dev == d && flip->fl_number == n) { flip->fl_refcnt++; break; } flip = flip->next; } return (flip); } struct flino * allocfid(fp) struct file *fp; { struct flino *flip; flip = frfid; if (flip != NULL) { ++flckinfo.filcnt; ++flckinfo.filtot; /* remove from free list */ frfid = flip->next; if (frfid != NULL) frfid->prev = NULL; /* insert into allocated file identifier list */ if (fids != NULL) fids->prev = flip; flip->next = fids; fids = flip; /* set up file identifier info */ ++flip->fl_refcnt; flip->fl_dev = fp->f_inode->i_dev; flip->fl_number = fp->f_inode->i_number; } return (flip); } freefid(flip) struct flino *flip; { if (--flip->fl_refcnt <= 0 && flip->fl_flck == NULL) { --flckinfo.filcnt; if (flip->prev != NULL) flip->prev->next = flip->next; else fids = flip->next; if (flip->next != NULL) flip->next->prev = flip->prev; flip->fl_dev = 0; flip->fl_number = 0; flip->fl_refcnt = 0; if (frfid != NULL) frfid->prev = flip; flip->next = frfid; flip->prev = NULL; frfid = flip; } } /* build file lock free list */ flckinit() { register i; for (i=0; iprev = &flox[i]); } } flckinfo.reccnt = 0; } /* insert lock after given lock using locking data */ struct filock * insflck(flip, lckdat, fl) struct flino *flip; struct filock *fl; struct flock *lckdat; { register struct filock *new; struct filock *f; new = frlock; if (new != NULL) { ++flckinfo.reccnt; ++flckinfo.rectot; frlock = new->next; if (frlock != NULL) frlock->prev = NULL; new->set = *lckdat; new->set.l_pid = u.u_procp->p_pid; new->stat.wakeflg = 0; if (fl == NULL) { new->next = flip->fl_flck; if (flip->fl_flck != NULL) flip->fl_flck->prev = new; flip->fl_flck = new; } else { new->next = fl->next; if (fl->next != NULL) fl->next->prev = new; fl->next = new; } new->prev = fl; } return (new); } /* delete lock */ delflck(flip, fl) struct flino *flip; struct filock *fl; { if (fl->prev != NULL) fl->prev->next = fl->next; else flip->fl_flck = fl->next; if (fl->next != NULL) fl->next->prev = fl->prev; WAKEUP(fl); --flckinfo.reccnt; if (frlock == NULL) { fl->next = fl->prev = NULL; frlock = fl; } else { fl->next = frlock; fl->prev = NULL; frlock = (frlock->prev = fl); } } /* regflck sets the type of span of this (un)lock relative to the specified * already existing locked section. * There are five regions: * * S_BEFORE S_START S_MIDDLE S_END S_AFTER * 010 020 030 040 050 * E_BEFORE E_START E_MIDDLE E_END E_AFTER * 01 02 03 04 05 * |-------------------------------| * * relative to the already locked section. The type is two octal digits, * the 8's digit is the start type and the 1's digit is the end type. */ int regflck(ld, flp) struct flock *ld; struct filock *flp; { register int regntype; if (ld->l_start > flp->set.l_start) { if (ld->l_start > flp->set.l_end) return(S_AFTER|E_AFTER); else if (ld->l_start == flp->set.l_end) return(S_END|E_AFTER); else regntype = S_MIDDLE; } else if (ld->l_start == flp->set.l_start) regntype = S_START; else regntype = S_BEFORE; if (ld->l_end > flp->set.l_start) { if (ld->l_end > flp->set.l_end) regntype |= E_AFTER; else if (ld->l_end == flp->set.l_end) regntype |= E_END; else regntype |= E_MIDDLE; } else if (ld->l_end == flp->set.l_start) regntype |= E_START; else regntype |= E_BEFORE; return (regntype); } /* Adjust file lock from region specified by 'ld' starting at lock 'insrtp' */ flckadj(flip, insrtp, ld) struct flino *flip; struct filock *insrtp; struct flock *ld; { struct flock td; /* lock data for severed lock */ struct filock *flp, *nflp, *tdi, *tdp; int insrtflg, rv = 0; int regtyp; insrtflg = (ld->l_type != F_UNLCK) ? 1 : 0; nflp = (insrtp == NULL) ? flip->fl_flck : insrtp; while (flp = nflp) { nflp = flp->next; if (flp->set.l_pid == u.u_procp->p_pid) { regtyp = regflck(ld, flp); /* release already locked region if necessary */ switch (regtyp) { case S_BEFORE|E_BEFORE: nflp = NULL; break; case S_BEFORE|E_START: if (ld->l_type == flp->set.l_type) { ld->l_end = flp->set.l_end; if (insrtp == flp) insrtp = flp->prev; delflck(flip, flp); } nflp = NULL; break; case S_START|E_END: /* don't bother if this is in the middle of * an already similarly set section. */ if (ld->l_type == flp->set.l_type) return(rv); case S_START|E_AFTER: insrtp = flp->prev; delflck(flip, flp); break; case S_BEFORE|E_END: if (ld->l_type == flp->set.l_type) nflp = NULL; case S_BEFORE|E_AFTER: if (insrtp == flp) insrtp = flp->prev; delflck(flip, flp); break; case S_BEFORE|E_MIDDLE: if (ld->l_type == flp->set.l_type) ld->l_end = flp->set.l_end; else { /* setup piece after end of (un)lock */ td = flp->set; td.l_start = ld->l_end; tdp = tdi = flp; do { if (tdp->set.l_start < ld->l_start) tdi = tdp; else break; } while (tdp = tdp->next); if (insflck(flip, &td, tdi) == NULL) D 7 return(ENOSPC); E 7 I 7 return(ENOLCK); E 7 } if (insrtp == flp) insrtp = flp->prev; delflck(flip, flp); nflp = NULL; break; case S_START|E_MIDDLE: case S_MIDDLE|E_MIDDLE: /* don't bother if this is in the middle of * an already similarly set section. */ if (ld->l_type == flp->set.l_type) return(rv); /* setup piece after end of (un)lock */ td = flp->set; td.l_start = ld->l_end; tdp = tdi = flp; do { if (tdp->set.l_start < ld->l_start) tdi = tdp; else break; } while (tdp = tdp->next); if (insflck(flip, &td, tdi) == NULL) D 7 return(ENOSPC); E 7 I 7 return(ENOLCK); E 7 if (regtyp == (S_MIDDLE|E_MIDDLE)) { /* setup piece before (un)lock */ flp->set.l_end = ld->l_start; WAKEUP(flp); insrtp = flp; } else { insrtp = flp->prev; delflck(flip, flp); } nflp = NULL; break; case S_MIDDLE|E_END: /* don't bother if this is in the middle of * an already similarly set section. */ if (ld->l_type == flp->set.l_type) return(rv); flp->set.l_end = ld->l_start; WAKEUP(flp); insrtp = flp; break; case S_MIDDLE|E_AFTER: case S_END|E_AFTER: if (ld->l_type == flp->set.l_type) { ld->l_start = flp->set.l_start; insrtp = flp->prev; delflck(flip, flp); } else { flp->set.l_end = ld->l_start; WAKEUP(flp); insrtp = flp; } break; case S_AFTER|E_AFTER: insrtp = flp; break; } } else { if (flp->set.l_start > ld->l_end) nflp = NULL; } } if (insrtflg) { if (flp = insrtp) { do { if (flp->set.l_start < ld->l_start) insrtp = flp; else break; } while (flp = flp->next); } if (insflck(flip, ld, insrtp) == NULL) D 7 rv = ENOSPC; E 7 I 7 rv = ENOLCK; E 7 } return (rv); } /* blocked checks whether a new lock (lckdat) would be * blocked by a previously set lock owned by another process. * When blocked is called, 'flp' should point * to the record from which the search should begin. * Insrt is set to point to the lock before which the new lock * is to be placed. */ struct filock * blocked(flp, lckdat, insrt) struct filock *flp; struct flock *lckdat; struct filock **insrt; { struct filock *f; *insrt = NULL; for (f = flp; f != NULL; f = f->next) { if (f->set.l_start < lckdat->l_start) *insrt = f; else break; if (f->set.l_pid == u.u_procp->p_pid) { if (lckdat->l_start <= f->set.l_end && lckdat->l_end >= f->set.l_start) { *insrt = f; break; } } else if (lckdat->l_start < f->set.l_end && lckdat->l_end > f->set.l_start && (f->set.l_type == F_WRLCK || (f->set.l_type == F_RDLCK && lckdat->l_type == F_WRLCK))) return(f); } for ( ; f != NULL; f = f->next) { if (lckdat->l_start < f->set.l_end && lckdat->l_end > f->set.l_start && f->set.l_pid != u.u_procp->p_pid && (f->set.l_type == F_WRLCK || (f->set.l_type == F_RDLCK && lckdat->l_type == F_WRLCK))) return(f); if (f->set.l_start > lckdat->l_end) break; } return(NULL); } /* locate overlapping file locks */ getflck(fp, lckdat) struct file *fp; struct flock *lckdat; { register struct flino *flip; struct filock *found, *insrt = NULL; register int retval = 0; int inwhence; /* whence of request */ /* get file identifier and file lock list pointer if there is one */ flip = findfid(fp); if (flip == NULL) { lckdat->l_type = F_UNLCK; return (0); } /* convert start to be relative to beginning of file */ inwhence = lckdat->l_whence; if (retval=convoff(fp, lckdat, 0)) return (retval); if (lckdat->l_len == 0) lckdat->l_end = MAXEND; else lckdat->l_end += lckdat->l_start; /* find overlapping lock */ found = blocked(flip->fl_flck, lckdat, &insrt); if (found != NULL) *lckdat = found->set; else lckdat->l_type = F_UNLCK; freefid(flip); /* restore length */ if (lckdat->l_end == MAXEND) lckdat->l_len = 0; else lckdat->l_len -= lckdat->l_start; retval = convoff(fp, lckdat, inwhence); return (retval); } /* clear and set file locks */ setflck(fp, lckdat, slpflg) struct file *fp; struct flock *lckdat; int slpflg; { register struct flino *flip; register struct filock *found, *sf; struct filock *insrt = NULL; register int retval = 0; int contflg = 0; /* check access permissions */ if ((lckdat->l_type == F_RDLCK && (fp->f_flag&FREAD) == 0) || (lckdat->l_type == F_WRLCK && (fp->f_flag&FWRITE) == 0)) return (EBADF); /* convert start to be relative to beginning of file */ if (retval=convoff(fp, lckdat, 0)) return (retval); if (lckdat->l_len == 0) lckdat->l_end = MAXEND; else lckdat->l_end += lckdat->l_start; /* get or create a file/inode record lock header */ flip = findfid(fp); if (flip == NULL) { if (lckdat->l_type == F_UNLCK) return (0); if ((flip=allocfid(fp)) == NULL) return (EMFILE); } do { contflg = 0; switch (lckdat->l_type) { case F_RDLCK: case F_WRLCK: if ((found=blocked(flip->fl_flck, lckdat, &insrt)) == NULL) retval = flckadj(flip, insrt, lckdat); else if (slpflg) { /* do deadlock detection here */ if (deadflck(found)) retval = EDEADLK; else if ((sf=insflck(&sleeplcks, lckdat, NULL)) == NULL) D 7 retval = ENOSPC; E 7 I 7 retval = ENOLCK; E 7 else { found->stat.wakeflg++; sf->stat.blkpid = found->set.l_pid; if (SLEEP(found, PCATCH|(PZERO+1))) retval = EINTR; else contflg = 1; sf->stat.blkpid = 0; delflck(&sleeplcks, sf); } } else retval = EACCES; break; case F_UNLCK: /* removing a file record lock */ retval = flckadj(flip, flip->fl_flck, lckdat); break; default: retval = EINVAL; /* invalid lock type */ break; } } while (contflg); freefid(flip); return(retval); } /* convoff - converts the given data (start, whence) to the * given whence. */ int convoff(fp, lckdat, whence) struct file *fp; struct flock *lckdat; int whence; { if (lckdat->l_whence == 1) lckdat->l_start += fp->f_offset; else if (lckdat->l_whence == 2) lckdat->l_start += fp->f_inode->i_size; else if (lckdat->l_whence != 0) return (EINVAL); if (lckdat->l_start < 0) return (EINVAL); if (whence == 1) lckdat->l_start -= fp->f_offset; else if (whence == 2) lckdat->l_start -= fp->f_inode->i_size; else if (whence != 0) return (EINVAL); lckdat->l_whence = whence; return (0); } /* deadflck does the deadlock detection for the given record */ int deadflck(flp) struct filock *flp; { register struct filock *blck, *sf; int blckpid; blck = flp; /* current blocking lock pointer */ blckpid = blck->set.l_pid; do { if (blckpid == u.u_procp->p_pid) return(1); /* if the blocking process is sleeping on a locked region, * change the blocked lock to this one. */ for (sf = sleeplcks.fl_flck; sf != NULL; sf = sf->next) { if (blckpid == sf->set.l_pid) { blckpid = sf->stat.blkpid; break; } } blck = sf; } while (blck != NULL); return(0); } /* Clean up record locks left around by process (called in closef) */ cleanlocks(fp) struct file *fp; { register struct filock *flp, *nflp; register struct flino *flip; flip = findfid(fp); if (flip == NULL) return; for (flp=flip->fl_flck; flp!=NULL; flp=nflp) { nflp = flp->next; if (flp->set.l_pid == u.u_procp->p_pid) delflck(flip, flp); } freefid(flip); return; } E 1 h23042 s 00001/00001/00348 d D 4.4 87/05/14 16:06:22 build 9 8 c removed old SCCS strings and inserted #ident BB e s 00008/00006/00341 d D 4.3 87/04/16 18:30:13 dc 8 7 c dc - Add Bull updates from 03/05/87 e s 00021/00021/00326 d D 4.2 87/04/15 17:44:59 dc 7 6 c dc - changed #include "sys/..." to #include e s 00000/00000/00347 d D 4.1 87/02/20 13:29:19 build 6 5 c rolled rev to -r4 /dc e s 00033/00094/00314 d D 3.2 87/01/26 13:21:41 build 5 4 c add page table changes /dc e s 00000/00000/00408 d D 3.1 87/01/19 09:21:53 build 4 3 c rolled rev to -r3 /dc e s 00000/00000/00408 d D 2.1 87/01/19 09:21:53 build 3 2 c AUTO NULL DELTA e s 00001/00000/00407 d D 1.2 87/01/16 10:15:03 build 2 1 c add ident string /dc e s 00407/00000/00000 d D 1.1 87/01/09 16:34:31 build 1 0 c Placed under source control - dc e u U f b f n t T I 2 D 8 /* "%W% %E%" */ E 8 I 8 D 9 /* " %W% %E% " */ E 9 I 9 #ident " %W% %E% " E 9 E 8 E 2 I 1 D 7 #include "sys/types.h" #include "sys/param.h" #include "sys/sysmacros.h" #include "sys/dir.h" #include "sys/signal.h" #include "sys/user.h" #include "sys/systm.h" #include "sys/sysinfo.h" #include "sys/map.h" #include "sys/seg.h" #include "sys/file.h" #include "sys/inode.h" #include "sys/page.h" #include "sys/region.h" #include "sys/buf.h" #include "sys/var.h" #include "sys/errno.h" #include "sys/text.h" #include "sys/proc.h" #include "sys/reg.h" D 5 #include "sys/vrt.h" E 5 #include "sys/debug.h" E 7 I 7 #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include E 7 D 5 extern ushort sys_segno ; E 5 extern pte_t *userpte ; extern struct user *uservad ; D 5 extern vrte_t *uacc_vrt[] ; E 5 extern struct proc *lastproc; D 5 extern ushort m_datasegnum ; ushort m_segnum ; #define MAXSEGNUM 0x7fff E 5 int shmfork(); struct user *makechild(); /* * Create a new process-- the internal version of * sys fork. * It returns 1 in the new process, 0 in the old. D 5 */ E 5 I 5 */ E 5 newproc(i) { register struct proc *cp, *pp, *pend; register n, a; register int (**fptr)(); extern int (*forkfunc[])(); static mpid; /* * First, just locate a slot for a process * and copy the useful info from this process into it. * The panic "cannot happen" because fork has already * checked for the existence of a slot. D 5 */ E 5 I 5 */ E 5 retry: mpid++; if (mpid >= MAXPID) { mpid = 0; goto retry; } pp = &proc[0]; cp = NULL; n = (struct proc *)v.ve_proc - pp; a = 0; do { if (pp->p_stat == NULL) { if (cp == NULL) cp = pp; continue; } if (pp->p_pid == mpid) goto retry; if (pp->p_uid == u.u_ruid) a++; pend = pp; } while(pp++, --n); if (cp == NULL) { if ((struct proc *)v.ve_proc >= &proc[v.v_proc]) { if (i) { syserr.procovf++; u.u_error = EAGAIN; return(-1); } else panic("no procs"); } cp = (struct proc *)v.ve_proc; } if (cp > pend) pend = cp; pend++; v.ve_proc = (char *)pend; if (u.u_uid && u.u_ruid) { if (cp == &proc[v.v_proc-1] || a > v.v_maxup) { u.u_error = EAGAIN; return(-1); } } /* * make proc entry for new proc * set flags to include SLOCK so that the scheduler * does not clear the SLOAD. We will be attaching regions * soon, and attachreg increments the region's incore count. */ pp = u.u_procp; cp->p_uid = pp->p_uid; cp->p_suid = pp->p_suid; cp->p_pgrp = pp->p_pgrp; cp->p_nice = pp->p_nice; cp->p_size = 0; cp->p_stat = SIDL; cp->p_clktim = 0; cp->p_flag = SLOAD | SLOCK; cp->p_pid = mpid; cp->p_ppid = pp->p_pid; cp->p_time = 0; cp->p_cpu = 0; cp->p_pri = PUSER + pp->p_nice - NZERO; cp->p_frate = 0; /* * make duplicate entries * where needed */ for(n=0; nf_count++; u.u_cdir->i_count++; if (u.u_rdir) u.u_rdir->i_count++; shmfork(cp, pp); /* * Partially simulate the environment * of the new process so that when it is actually * created (by copying) it will look right. */ /* * When the resume is executed for the new process, * here's where it will resume. */ if (save(u.u_rsav)) { struct proc *p; struct pregion *prp; p = lastproc; switch(p->p_stat) { case SZOMB: D 5 sptfree(p->p_sgt,1,1) ; /* free the physical space of user structure */ pfree(NULL,p->p_addr,NULL,USIZE) ; E 5 I 5 /* * Free the physical space of user structure */ pfree(NULL,ublkptbl(p),NULL,USIZE) ; E 5 break; } return(1); } /* * There is not enough memory for the * page tables for the * new process, this cannot happen here!! D 5 */ E 5 I 5 D 8 */ E 8 I 8 */ E 8 E 5 if (procdup(cp, pp) < 0) I 5 { D 8 cp->p_stat = NULL; E 8 I 8 pexit() ; cp->p_stat = NULL ; cp->p_ppid = 0 ; E 8 E 5 return(-1); I 5 } E 5 pp->p_stat = SRUN; cp->p_flag &= ~SLOCK; cp->p_stat = SRUN; setrq(cp); /* parent returns pid of child */ u.u_rval1 = cp->p_pid; /* have parent give up processor after * its priority is recalculated so that * the child runs first (its already on * the run queue at sufficiently good * priority to accomplish this). This * allows the dominant path of the child * immediately execing to break the multiple * use of copy on write pages with no disk home. * The parent will get to steal them back * rather than uselessly copying them. */ runrun = 1; return(0); } /* * create a duplicate copy of a process */ procdup(cp, pp) struct proc *cp, *pp; { register preg_t *p_prp; register preg_t *c_prp; register int i; register pte_t *ppt, *cpt; struct user *useg; D 5 E 5 /* * Allocate a u area for the child, and set up memory management */ D 5 E 5 if ((useg = makechild(pp, cp)) == NULL) return(-1); /* Duplicate all the regions of the process. */ D 5 E 5 p_prp = pp->p_region; c_prp = cp->p_region; for( ; p_prp->p_reg ; p_prp++, c_prp++) { register int prot; register reg_t *rp; prot = (p_prp->p_flags & PF_RDONLY ? SEG_RO : SEG_RW); reglock(p_prp->p_reg); rp = dupreg(p_prp->p_reg, SEG_CW); if(rp == NULL) { regrele(p_prp->p_reg); if(c_prp > cp->p_region) while((--c_prp)->p_reg) { reglock(c_prp->p_reg); detachreg(useg, c_prp); } sptfree(useg, USIZE, 1); D 5 sptfree(cp->p_sgt,1,1) ; E 5 u.u_error = ENOMEM; return(-1); } if(attachreg(rp,useg,p_prp->p_regva,p_prp->p_type, prot) == NULL) { freereg(rp); regrele(p_prp->p_reg); if(c_prp > cp->p_region) while((--c_prp)->p_reg) { reglock(c_prp->p_reg); detachreg(useg, c_prp); } sptfree(useg, USIZE, 1); D 5 sptfree(cp->p_sgt,1,1) ; E 5 return(-1); } regrele(p_prp->p_reg); regrele(rp); } /* * free the virtual space for the u structure */ sptfree(useg, USIZE, 0); return(0); } /* * build a u area and address space for the child */ struct user *makechild(pp, cp) register struct proc *pp, *cp; { D 5 register pte_t *ppt, *cpt; E 5 I 5 register pte_t *publkptbl,*cublkptbl, *cpt; E 5 register int i; struct user *useg; label_t tsav; register pg_pfn ; /* * capture save area for child before entering memory * allocation routines, which may sleep, thus bashing * the current save area contents */ for (i=0; ip_sgt = (pte_t *)sptalloc(1,PG_V | PG_KW,0)) == 0) return(NULL) ; bzero(cp->p_sgt,NBPP) ; /* * Allocate for U block */ E 5 I 5 * Allocate for U block */ E 5 if ((useg = (struct user *)sptalloc(USIZE, PG_V|PG_KW, 0)) == 0) D 5 { sptfree(cp->p_sgt, 1, 1); E 5 return(NULL); D 5 } E 5 /* * copy the u area D 5 */ E 5 I 5 D 8 */ E 8 I 8 */ E 8 E 5 D 5 ppt = pp->p_addr ; cpt = (pte_t *)(&sbrpte[svtop(useg)]); for (i = 0 ; i < USIZE ; i++, ++ppt, ++cpt) E 5 I 5 publkptbl = (pte_t *)ublkptbl(pp) ; cpt = svtopte(useg); cublkptbl = (pte_t *)ublkptbl(cp) ; cp->p_addr.pt_paddr = ptost(svtophys(cublkptbl)) ; cp->p_addr.pt_w = SGT_KW ; for (i = 0 ; i < USIZE ; i++, ++publkptbl, ++cpt, ++cublkptbl) E 5 { D 5 copypage(ppt->pgm.pg_pfn, cpt->pgm.pg_pfn); cpt->pgm.pg_prot = PTE_KW; cpt->pgm.pg_v = PT_VAL; cp->p_addr[i] = *cpt ; E 5 I 5 copypage(publkptbl->pgm.pg_pfn, cpt->pgm.pg_pfn); *cublkptbl = *cpt ; E 5 } /* D 5 * adjust process context, update base and length registers */ E 5 I 5 D 8 * Adjust process context, update base and length registers */ E 8 I 8 * adjust process context, update base and length registers */ E 8 E 5 for (i=0; iu_rsav[i] = tsav[i]; D 5 pg_pfn = cp->p_addr[USIZE-1].pgm.pg_pfn + 1 ; useg->u_rsav[RSAV_SR14] = ptob(pg_pfn) - sizeof(pcbt) ; pg_pfn = cp->p_addr[0].pgm.pg_pfn ; E 5 I 5 cpt = (pte_t *)svtopte(useg) ; pg_pfn = cpt->pgm.pg_pfn ; E 5 useg->u_rsav[RSAV_SR4] = ptob(pg_pfn) ; I 5 cpt += (USIZE - 1) ; pg_pfn = cpt->pgm.pg_pfn + 1 ; useg->u_rsav[RSAV_SR14] = ptob(pg_pfn) - sizeof(pcbt) ; useg->u_rsav[RSAV_SR8] = svtophys(cp->p_sct) ; E 5 useg->u_ssize = 0; useg->u_procp = cp; D 5 /* Give the child the same text segment number and */ /* a new data segment number */ useg->u_pcb.data_seg = cp->p_dsegno ; if (pp->p_txtsegno == pp->p_dsegno) { cp->p_txtsegno = cp->p_dsegno ; useg->u_pcb.text_seg = cp->p_dsegno ; } else cp->p_txtsegno = pp->p_txtsegno ; E 5 return(useg); } D 5 uaccess(spte) E 5 I 5 uaccess(st) E 5 D 5 register pte_t *spte ; E 5 I 5 register pte_t *st ; E 5 { register i ; D 5 register vrte_t *vrt_e ; E 5 for (i = 0 ; i < btoc(sizeof u) ; i++) { D 5 userpte[i] = *spte ; vrt_e = uacc_vrt[i] ; vrt_e->pg_pfn = spte++->pgm.pg_pfn ; E 5 I 5 userpte[i] = *st ; E 5 } flush() ; D 5 } /* * Allocate a new segment number (code segment) * segment number could be m_segnum++ * scan process table to see if there no one using that segment number */ ushort alloc_segnum() { register n,found ; register struct proc *p ; register reg_t *rp ; for (;;) { if (++m_segnum >= MAXSEGNUM) m_segnum = m_datasegnum ; /* * See if that segment number is in the active region list. */ for (rp = ractive.r_forw ; rp != &ractive ; rp = rp->r_forw) if (rp->r_txtsegno == m_segnum) break ; if (rp == &ractive) break ; } return(m_segnum) ; E 5 } E 1 h40365 s 00001/00001/00682 d D 4.4 87/05/14 16:06:35 build 9 8 c removed old SCCS strings and inserted #ident BB e s 00059/00069/00624 d D 4.3 87/04/16 18:37:20 dc 8 7 c dc - Add Bull updates from 03/05/87 e s 00019/00019/00674 d D 4.2 87/04/15 17:45:10 dc 7 6 c dc - changed #include "sys/..." to #include e s 00000/00000/00693 d D 4.1 87/02/20 13:29:24 build 6 5 c rolled rev to -r4 /dc e s 00127/00124/00566 d D 3.2 87/01/26 13:23:53 build 5 4 c add page table changes /dc e s 00000/00000/00690 d D 3.1 87/01/19 09:21:56 build 4 3 c rolled rev to -r3 /dc e s 00000/00000/00690 d D 2.1 87/01/19 09:21:56 build 3 2 c AUTO NULL DELTA e s 00001/00000/00689 d D 1.2 87/01/16 10:15:08 build 2 1 c add ident string /dc e s 00689/00000/00000 d D 1.1 87/01/09 16:34:33 build 1 0 c Placed under source control - dc e u U f b f n t T I 2 D 8 /* "%W% %E%" */ E 8 I 8 D 9 /* " %W% %E% " */ E 9 I 9 #ident " %W% %E% " E 9 E 8 E 2 I 1 D 7 #include "sys/types.h" #include "sys/tuneable.h" #include "sys/param.h" #include "sys/sysmacros.h" #include "sys/systm.h" #include "sys/dir.h" #include "sys/signal.h" #include "sys/user.h" #include "sys/inode.h" #include "sys/buf.h" #include "sys/var.h" #include "sys/sysinfo.h" #include "sys/page.h" #include "sys/pfdat.h" #include "sys/region.h" #include "sys/proc.h" #include "sys/map.h" #include "sys/swap.h" #include "sys/debug.h" E 7 I 7 #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include E 7 /* D 5 * v r nr meaning E 5 I 5 * v r meaning E 5 * ----------------------- D 5 * 1 1 0 a valid page; certainly in the process working set E 5 I 5 * 1 1 a valid page; certainly in the process working set E 5 * D 5 * 1 0 0 page is in the working set, but has been set * unreferenced in order to detect a reference. * The page frame in the pte is still owned by the process. E 5 I 5 * 1 0 page is in the working set, but has been set * unreferenced in order to detect a reference. * The page frame in the pte is still owned by the process. E 5 * D 5 * 0 0 1 page is not in the working set. The page frame in * the pte is still owned by the process, but it * is a candidate for reclaimation by getpages(). E 5 I 5 * 0 1 page is not in the working set. The page frame in * the pte is still owned by the process, but it * is a candidate for reclaimation by getpages(). E 5 * D 5 * 0 0 0 the page is truly invalid. Full vfault processing * is required for this pte. E 5 I 5 * 0 0 the page is truly invalid. Full vfault processing * is required for this pte. E 5 */ D 5 /* Data structures for swap/page out * These data elements are currently shared by * vhand and sched. */ E 5 I 5 /* * Data structures for swap/page out * These data elements are currently shared by * vhand and sched. */ E 5 extern int freemem ; extern int swapwant ; int getpgslim ; /* Current limit for getpages. It is */ /* either tune.t_gpgslo or tune.gpgshi. */ D 8 /* Vhand. Wakes up periodically to update * process working sets. */ E 8 I 8 /* * Vhand. Wakes up periodically to update * process working sets. */ E 8 vhand() { register struct proc *p; register reg_t *rp; register int cputime; extern struct user *uservad; /* We wakeup every tune.t_vhandr seconds if * freemem is less than tune.t_vhandl D 8 */ E 8 I 8 */ E 8 getpgslim = tune.t_gpgslo ; tune.t_vhandl = max(maxmem/v.v_vhndfrac, tune.t_gpgshi) ; loop: sleep((caddr_t)vhand, PSWP); I 5 debug(DB3,"run vhand\n") ; E 5 D 5 /* * Free unused page tables */ pgtsvfree() ; if (freemem >= getpgslim) { getpgslim = tune.t_gpgslo ; goto loop ; } E 5 if (swapwant) { D 8 printf("Danger: vhand need swap pages\n") ; E 8 I 8 printf("DANGER: vhand needs swap space\n") ; E 8 goto loop ; } /* * Scan all processes */ for (p = &proc[0]; p < (struct proc *)v.ve_proc; p++) { D 8 /* Ignore uninteresting parties */ E 8 I 8 /* * Ignore uninteresting parties */ E 8 if (p->p_stat==SZOMB || p->p_stat==SIDL) continue; if ((p->p_flag&(SSYS|SLOCK|SLOAD))!=SLOAD) continue; /* Found somebody. Map its ublock, and check * accumulated CPU time since the last time * it was aged. If the age criteria is exceeded, * do some work on it */ /* D 5 * uaccess(p->p_addr); E 5 I 5 * uaccess(ublkptbl(p)); E 5 * * cputime = (uservad->u_utime + uservad->u_stime) / HZ; * * if (cputime > (uservad->u_agetime + tune.t_age)) * { * uservad->u_agetime = cputime; * p->p_flag |= SLOCK; * ageprocess(p); * p->p_flag &= ~SLOCK; * } */ p->p_flag |= SLOCK; ageprocess(p); p->p_flag &= ~SLOCK; /* * If we have gotten enough pages, then * don't steal any more. */ if (freemem >= getpgslim || swapwant) { getpgslim = tune.t_gpgslo ; break ; } } /* Scan shared regions. If the region is unused * or it has been marked for aging, do it. */ for(rp = ractive.r_forw; rp != &ractive; rp = rp->r_forw) { I 5 D 8 /* E 5 if(rp->r_incore == 0 || rp->r_flags & RG_AGE) I 5 */ E 8 if(rp->r_refcnt == 0 || rp->r_flags & RG_AGE) E 5 { rp->r_flags &= ~RG_AGE; if(rp->r_flags & RG_LOCK) continue; /* * If memory is not tight, then don't steal any * pages. Once we start to steal pages, then * steal enough to get up to the high water mark. * This is to avoid getting into repeated tight * memory situations. */ if (freemem > getpgslim || swapwant) { getpgslim = tune.t_gpgslo ; break ; } else { getpgslim = tune.t_gpgshi ; reglock(rp); ageregion(rp); getpages(rp, 0, 0); regrele(rp); } } } goto loop; } /* Age pages of a process. Ages pages of private regions * and marks shared regions for aging (RG_AGE) by vhand. */ ageprocess(p) register struct proc *p; { register preg_t *prp; register reg_t *rp; ASSERT(p->p_flag & SLOCK); /* * Scan process regions. */ for (prp = p->p_region; rp = prp->p_reg; prp++) { /* * Ignore locked regions */ if (rp->r_flags & RG_LOCK) continue; /* * If the region is shared, mark it now, * and age it later. This is to avoid * aging the same region more than once * per cycle. Otherwise, do it to it. */ if(rp->r_type != RT_PRIVATE) rp->r_flags |= RG_AGE; else { /* * Clear valid bit and steal * unused pages */ /* * If memory is not tight, then don't steal any * pages. Once we start to steal pages, then * steal enough to get up to the high water mark. * This is to avoid getting into repeated tight * memory situations. */ if (freemem > getpgslim || swapwant) { getpgslim = tune.t_gpgslo ; break ; } else { getpgslim = tune.t_gpgshi ; reglock(rp); ageregion(rp); getpages(rp, 0, 0); regrele(rp); } } } } /* Clear valid bit on the pages of a region. */ ageregion(rp) register reg_t *rp; { register pte_t *pt; register int j; register int pglim; register int i; register int seglim; ASSERT(rp->r_flags & RG_LOCK); /* Look at all of the segments of the region. */ i = ptots(rp->r_pgoff); seglim = ptos(rp->r_pgoff + rp->r_pgsz); for ( ; i < seglim ; i++) { /* Look at all of the pages of the segment. */ if (rp->r_pgoff > stopg(i)) j = rp->r_pgoff - stopg(i); else j = 0; pt = rp->r_list[i] + j; pglim = rp->r_pgoff + rp->r_pgsz - stopg(i); if (pglim > NPGPT) pglim = NPGPT; for ( ; j < pglim ; j++, pt++) { /* D 5 * If the page is locked, don't go near it. */ E 5 I 5 D 8 * If the page is locked, don't go near it. */ E 8 I 8 * If the page is locked, don't go near it. */ E 8 E 5 if (pt->pgi.pg_pte & PG_LOCK) continue; D 5 /* Otherwise, clear reference bits */ E 5 I 5 D 8 /* * Otherwise, clear reference bits */ E 8 I 8 /* Otherwise, clear reference bits */ E 8 E 5 #ifdef TWOPASS if (pt->pgi.pg_pte & PG_V) D 5 if (pagereferenced(pt) unrefpage(pt) ; E 5 I 5 if (pt->pgi.pg_pte & PG_REF) pt->pgi.pg_pte &= ~PG_REF ; E 5 else { pt->pgi.pg_pte &= ~PG_V ; D 5 pt->pgi.pg_pte |= PG_NDREF ; invalid_vrtentrys(pt) ; E 5 I 5 pt->pgi.pg_pte |= PG_REF ; E 5 } #else if (pt->pgi.pg_pte & PG_V) { D 5 unrefpage(pt) ; E 5 pt->pgi.pg_pte &= ~PG_V ; D 5 pt->pgi.pg_pte |= PG_NDREF ; invalid_vrtentrys(pt) ; E 5 I 5 pt->pgi.pg_pte |= PG_REF ; E 5 } #endif } } } /* Swap out pages from region rp which is locked by * our caller. If hard is set, take all valid pages, * othersize take only unreferenced pages */ getpages(rp, hard, swapproc) register reg_t *rp; { register pte_t *pt; register pte_t *pt1; register dbd_t *dbd; register int j; register int pglim; register int i; register int seglim; int migrate; ASSERT(rp->r_flags & RG_LOCK); if (rp->r_type == RT_STEXT && rp->r_flags & RG_NOFREE) migrate = 1; else migrate = 0; /* If the region is marked "don't swap", then don't * steal any pages from it. */ if (rp->r_flags & RG_NOSWAP) D 8 return; E 8 I 8 return(1) ; E 8 D 5 /* Look through all of the segments of the region. */ E 5 I 5 D 8 /* * Look through all of the segments of the region. */ E 8 I 8 /* Look through all of the segments of the region. */ E 8 E 5 pt = pt1 = NULL; i = ptots(rp->r_pgoff); seglim = ptos(rp->r_pgoff + rp->r_pgsz); for ( ; i < seglim ; i++) { D 5 /* Look through segment's page table for valid * pages to dump. */ E 5 I 5 D 8 /* * Look through segment's page table for valid * pages to dump. */ E 8 I 8 /* Look through segment's page table for valid * pages to dump. */ E 8 E 5 if (rp->r_pgoff > stopg(i)) j = rp->r_pgoff - stopg(i); else j = 0; pt = rp->r_list[i] + j; pglim = rp->r_pgoff + rp->r_pgsz - stopg(i); if (pglim > NPGPT) pglim = NPGPT; pt1 = NULL; for ( ; j < pglim ; j++, pt++) { D 5 /* If page is locked or not valid, ignore it */ E 5 I 5 /* * If page is locked or not valid, ignore it */ E 5 D 5 if ((pt->pgi.pg_pte & (PG_V | PG_NDREF)) == 0 E 5 I 5 if ((pt->pgi.pg_pte & (PG_V | PG_REF)) == 0 E 5 || pt->pgi.pg_pte & PG_LOCK) { if (!swapchunk(rp, pt1, pt, swapproc)) return(0) ; pt1 = NULL; continue; } D 5 /* We have a page, see if we want to steal it */ E 5 I 5 /* * We have a page, see if we want to steal it D 8 */ E 8 I 8 */ E 8 E 5 if (!hard) { D 5 /* Don't steal it, if the page has * been referenced recently */ E 5 I 5 /* * Don't steal it, if the page has * been referenced recently D 8 */ E 8 I 8 */ E 8 E 5 if (pt->pgi.pg_pte & PG_V) D 5 if (pagereferenced(pt)) E 5 I 5 if (pt->pgi.pg_pte & PG_REF) E 5 { if (!swapchunk(rp, pt1, pt, swapproc)) return(0) ; pt1 = NULL; continue; } } /* D 5 * The page will be made truly invalid. * Clear valid bit, so the code in * Xvalflt doesn't pick up on a page that's on * its way out */ pt->pgi.pg_pte &= ~(PG_V | PG_NDREF) ; invalid_vrtentrys(pt) ; E 5 I 5 * The page will be made truly invalid. * Clear valid bit, so the code in * Xvalflt doesn't pick up on a page that's on * its way out */ pt->pgi.pg_pte &= ~(PG_V | PG_REF) ; E 5 /* D 5 * See if this page must be written to swap. */ E 5 I 5 * See if this page must be written to swap. D 8 */ E 8 I 8 */ E 8 E 5 dbd = (dbd_t *)pt + NPGPT; switch (dbd->dbd_type) { case DBD_NONE: { register pfd_t *pfd; D 5 /* This may be a copy-on-write * page which has been written * to swap by another process * which shares the page. If * so, just use the same swap * block. In the rare case * that the swap use count * overflows, we allocate * another swap page. This is * only possible if a process * does 255 forks without the * children exec'ing. */ E 5 I 5 /* * This may be a copy-on-write * page which has been written * to swap by another process * which shares the page. If * so, just use the same swap * block. In the rare case * that the swap use count * overflows, we allocate * another swap page. This is * only possible if a process * does 255 forks without the * children exec'ing. */ E 5 pfd = &pfdat[pt->pgm.pg_pfn]; if (pfd->pf_flags & P_HASH) { dbd->dbd_type = DBD_SWAP; dbd->dbd_swpi = pfd->pf_swpi; dbd->dbd_blkno = pfd->pf_blkno; if (!swpinc(dbd, "getpages")) { dbd->dbd_type = DBD_NONE; break; } memfree(rp, pt, 1); if (!swapchunk(rp, pt1, pt, swapproc)) return(0) ; pt1 = NULL; continue; } break; } case DBD_SWAP: D 5 /* See if this page has been * modified since it was read * in from swap. If not, then * just use the copy already on * the swap file unless we are * trying to delete the swap file. * If we are, then release the * current swap copy and write * the page out to another * swap file. */ E 5 I 5 /* * See if this page has been * modified since it was read * in from swap. If not, then * just use the copy already on * the swap file unless we are * trying to delete the swap file. * If we are, then release the * current swap copy and write * the page out to another * swap file. */ E 5 D 5 if (!pagedirty(pt) && E 5 I 5 if (!(pt->pgi.pg_pte & PG_M) && E 5 (swaptab[dbd->dbd_swpi].st_flags & ST_INDEL) == 0) { minfo.unmodsw++; memfree(rp, pt, 1); if (!swapchunk(rp, pt1, pt, swapproc)) return(0) ; pt1 = 0; continue; } D 5 /* The page has been modified. * Release the current swap * block and add it to the list * of pages to be swapped out * later. */ E 5 I 5 D 8 /* * The page has been modified. * Release the current swap * block and add it to the list * of pages to be swapped out * later. */ E 8 I 8 /* The page has been modified. * Release the current swap * block and add it to the list * of pages to be swapped out * later. */ E 8 E 5 D 5 pt->pgi.pg_pte |= PG_M ; E 5 if (swfree1(dbd) == 0) if (!pbremove(rp, dbd)) panic("getpages - pbremove"); break; I 5 E 5 case DBD_FILE: case DBD_LAST: D 5 /* See if the page has been * modified. If it has, then * we cannot use the copy on * the file and must assign * swap for it. */ E 5 I 5 D 8 /* * See if the page has been * modified. If it has, then * we cannot use the copy on * the file and must assign * swap for it. */ E 8 I 8 /* See if the page has been * modified. If it has, then * we cannot use the copy on * the file and must assign * swap for it. */ E 8 E 5 D 5 if (migrate || pagedirty(pt)) E 5 I 5 if (migrate || pt->pgi.pg_pte & PG_M) E 5 { D 5 if (!migrate) pt->pgi.pg_pte |= PG_M ; E 5 dbd->dbd_type = DBD_NONE; break; } D 5 /* Page has not been modified. * Just point to the copy on * the file. */ E 5 I 5 D 8 /* * Page has not been modified. * Just point to the copy on * the file. */ E 8 I 8 /* Page has not been modified. * Just point to the copy on * the file. */ E 8 E 5 minfo.unmodfl++; memfree(rp, pt, 1); if (!swapchunk(rp, pt1, pt, swapproc)) return(0) ; pt1 = NULL; continue; } if (pt1 == NULL) pt1 = pt; else if ((pt - pt1) >= tune.t_maxsc) { if (!swapchunk(rp, pt1, pt, swapproc)) return(0) ; pt1 = pt; } } D 5 /* If there are any pages in this segment to be * written out, then write them now. */ E 5 I 5 /* * If there are any pages in this segment to be * written out, then write them now. D 8 */ E 8 I 8 */ E 8 E 5 if (!swapchunk(rp, pt1, pt, swapproc)) return(0) ; pt1 = NULL; /* * If we have gotten enough pages, then * don't steal any more */ if (!hard && (freemem >= getpgslim)) { getpgslim = tune.t_gpgslo ; break ; } } /* D 5 * Ran off bottom. Write out anything which remains. */ E 5 I 5 D 8 * Ran off bottom. Write out anything which remains. */ E 8 I 8 * Ran off bottom. Write out anything which remains. */ E 8 E 5 if (!swapchunk(rp, pt1, pt, swapproc)) return(0) ; return(1) ; } D 5 /* Swap out a contiguous chunk of user pages. */ E 5 I 5 D 8 /* * Swap out a contiguous chunk of user pages. */ E 8 I 8 /* Swap out a contiguous chunk of user pages. */ E 8 E 5 swapchunk(rp, pt1, pt2, swapproc) reg_t *rp; /* Ptr to region being swapped. */ pte_t *pt1; /* Ptr to 1st pte to swap out. */ register pte_t *pt2; /* Ptr to one past last pte to swap out. */ struct proc *swapproc ; { int npages,retval,i ; dbd_t *dbd; pte_t *pt ; ASSERT(rp->r_flags & RG_LOCK); retval = 1 ; if (pt1 == NULL) return(retval); npages = pt2 - pt1; dbd = (dbd_t *)pt1 + NPGPT; pt = pt1 ; if (swalloc(dbd,npages) < 0) { /* * We could not get a contiguous chunk of * swap space of then required size so do * the swaps one page at a time. Hope * this doesn't happen very often. Note * that we get a "low on swap" printout * on the console if this happens. */ D 8 printf("\nSwap space running out.") ; printf(" Needed %d pages.\n",npages) ; E 8 I 8 printf("\nWARNING: swap space running out,") ; printf(" needed %d pages\n",npages) ; E 8 for (i = 0 ; i < npages ; i++) { /* * Allocate one page of swap and quit * if none is available. */ if (npages == 1 || swalloc(dbd,1) < 0) { D 8 printf("\nDanger: Out of swap space.\n") ; E 8 I 8 printf("\nDANGER: out of swap space.\n") ; E 8 retval = 0 ; npages = i ; if (swapproc && swapproc->p_ppid > 1) { psignal(swapproc, SIGKILL) ; D 5 uaccess(swapproc->p_addr) ; E 5 I 5 uaccess(ublkptbl(swapproc)) ; E 5 printf("\nProc %d cmd %s Killed (out of swap)\n",swapproc->p_pid, uservad->u_comm) ; } break ; } swap(dbd,pt,1,B_WRITE) ; dbd++ ; pt++ ; } for ( ; i < (pt2 - pt1) ; i++) { pt->pgi.pg_pte |= PG_V ; D 5 valid_vrtentrys(pt) ; E 5 pt++ ; } } else swap(dbd,pt1,npages,B_WRITE) ; if (npages) memfree(rp,pt1,npages); return(retval) ; } D 8 /* Free memory pages. */ E 8 I 8 /* * Free memory pages. */ E 8 memfree(rp, pt, size) register reg_t *rp; register pte_t *pt; register int size; { register struct pfdat *pfd; register dbd_t *dbd; extern int freemem; ASSERT(rp->r_flags & RG_LOCK); dbd = (dbd_t *)pt + NPGPT; rp->r_nvalid -= size; for (; --size >= 0; pt++, dbd++) { pfd = &pfdat[pt->pgm.pg_pfn]; D 5 /* See if the page is on not on the * hash list. If so, insert it there now. */ E 5 I 5 D 8 /* * See if the page is on not on the * hash list. If so, insert it there now. */ E 8 I 8 /* See if the page is on not on the * hash list. If so, insert it there now. */ E 8 E 5 if (!(pfd->pf_flags & P_HASH)) { pfd->pf_flags |= P_DONE; pinsert(rp, dbd, pfd); } D 5 /* free unused pages. */ E 5 I 5 D 8 /* * Free unused pages. */ E 8 I 8 /* free unused pages. */ E 8 E 5 ASSERT(pfd->pf_use > 0); if (--pfd->pf_use == 0) { D 5 /* Put pages at end of queue since they * represent disk blocks and we hope they * will be used again soon. */ E 5 I 5 D 8 /* * Put pages at end of queue since they * represent disk blocks and we hope they * will be used again soon. */ E 8 I 8 /* Put pages at end of queue since they * represent disk blocks and we hope they * will be used again soon. */ E 8 E 5 pfd->pf_prev = phead.pf_prev; pfd->pf_next = &phead; phead.pf_prev = pfd; pfd->pf_prev->pf_next = pfd; pfd->pf_flags |= P_QUEUE; freemem++; minfo.freedpgs++; } } } E 1 h12340 s 00001/00001/00118 d D 4.4 87/05/14 16:06:48 build 9 8 c removed old SCCS strings and inserted #ident BB e s 00003/00003/00116 d D 4.3 87/04/16 18:37:36 dc 8 7 c dc - Add Bull updates from 03/05/87 e s 00017/00017/00102 d D 4.2 87/04/15 17:45:19 dc 7 6 c dc - changed #include "sys/..." to #include e s 00000/00000/00119 d D 4.1 87/02/20 13:29:28 build 6 5 c rolled rev to -r4 /dc e s 00001/00021/00118 d D 3.2 87/01/26 13:24:49 build 5 4 c add page table changes /dc e s 00000/00000/00139 d D 3.1 87/01/19 09:22:00 build 4 3 c rolled rev to -r3 /dc e s 00000/00000/00139 d D 2.1 87/01/19 09:22:00 build 3 2 c AUTO NULL DELTA e s 00001/00000/00138 d D 1.2 87/01/16 10:15:12 build 2 1 c add ident string /dc e s 00138/00000/00000 d D 1.1 87/01/09 16:34:35 build 1 0 c Placed under source control - dc e u U f b f n t T I 2 D 8 /* "%W% %E%" */ E 8 I 8 D 9 /* " %W% %E% " */ E 9 I 9 #ident " %W% %E% " E 9 E 8 E 2 I 1 D 7 #include "sys/types.h" #include "sys/tuneable.h" #include "sys/bitmasks.h" #include "sys/param.h" #include "sys/sysmacros.h" #include "sys/systm.h" #include "sys/dir.h" #include "sys/signal.h" #include "sys/user.h" #include "sys/errno.h" #include "sys/var.h" #include "sys/page.h" #include "sys/pfdat.h" #include "sys/seg.h" #include "sys/region.h" #include "sys/proc.h" #include "sys/debug.h" E 7 I 7 #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include E 7 /* * brk and sbrk system calls */ sbreak() { struct a { int nva; }; register preg_t *prp; register reg_t *rp; register int nva; register int change; register int n; /* Find the processes data region. */ prp = findpreg(u.u_procp, PT_DATA); if(prp == NULL) return; rp = prp->p_reg; reglock(rp); nva = ((struct a *)u.u_ap)->nva; if (nva < u.u_datorg) { nva = u.u_datorg; } if ((change = btop((int)nva) - btotp(prp->p_regva) - (rp->r_pgsz + rp->r_pgoff) ) == 0) { regrele(rp); return; } ASSERT(rp->r_pgsz+change >= 0); if(growreg(&u, prp, change, 0, DBD_DZERO) < 0){ regrele(rp); return; } regrele(rp); } uclear(uva, count) register caddr_t uva; register count; { register i; for (i=0; ip_reg ; reglock(rp) ; va = (uint)(prp->p_regva + ptob(rp->r_pgsz)) ; if (sp < va) { regrele(rp) ; return(0) ; } else regrele(rp) ; /* * Find the processes stack region. */ E 5 prp = findpreg(u.u_procp, PT_STACK); if(prp == NULL) return(0); rp = prp->p_reg; reglock(rp); if (sp >= (uint)USRSTACK - ptob(rp->r_pgsz)) { regrele(rp); return(0); } si = btop((uint)USRSTACK - sp) - rp->r_pgsz + SINCR; if (si <= 0) { regrele(rp); return(0); } if(growreg(&u, prp, si, 0, DBD_DZERO) < 0) { regrele(rp); return(0); } regrele(rp); return(1); } E 1 h26784 s 00001/00001/00119 d D 4.6 87/05/14 16:06:58 build 11 10 c removed old SCCS strings and inserted #ident BB e s 00001/00001/00119 d D 4.5 87/05/07 18:58:24 van 10 9 c van - move defsocket.h back to /usr/include/sys e s 00003/00003/00117 d D 4.4 87/04/29 16:25:41 van 9 8 c van - moved ucb networking includes to INCUCB e s 00001/00002/00119 d D 4.3 87/04/16 18:38:01 dc 8 7 c dc - Add Bull updates from 03/05/87 e s 00005/00005/00116 d D 4.2 87/04/15 17:45:24 dc 7 6 c dc - changed #include "sys/..." to #include e s 00000/00000/00121 d D 4.1 87/02/20 13:29:31 build 6 5 c rolled rev to -r4 /dc e s 00000/00001/00121 d D 3.2 87/02/13 13:58:09 build 5 4 c add bull changes from Jan 23 /dc e s 00000/00000/00122 d D 3.1 87/01/19 09:22:02 build 4 3 c rolled rev to -r3 /dc e s 00000/00000/00122 d D 2.1 87/01/19 09:22:02 build 3 2 c AUTO NULL DELTA e s 00001/00000/00121 d D 1.2 87/01/16 10:15:15 build 2 1 c add ident string /dc e s 00121/00000/00000 d D 1.1 87/01/09 16:34:36 build 1 0 c Placed under source control - dc e u U f b f n t T I 2 D 8 /* "%W% %E%" */ E 2 I 1 D 5 /* %Z% Bull-Sems SPIX %Q%/%M% %I% %E% */ E 5 E 8 I 8 D 11 /* " %W% %E% " */ E 11 I 11 #ident " %W% %E% " E 11 E 8 #ifdef SOCKET D 7 #include "sys/param.h" #include "sys/defsocket.h" #include "sys/types.h" #include "sys/domain.h" #include "sys/protosw.h" E 7 I 7 #include D 9 #include E 9 I 9 D 10 #include "sys/defsocket.h" E 10 I 10 #include E 10 E 9 #include D 9 #include #include E 9 I 9 #include "sys/domain.h" #include "sys/protosw.h" E 9 E 7 #define ADDDOMAIN(x) { \ extern struct domain x/**/domain; \ x/**/domain.dom_next = domains; \ domains = &x/**/domain; \ } domaininit() { register struct domain *dp; register struct protosw *pr; ADDDOMAIN(unix); #ifdef INET ADDDOMAIN(inet); #endif #ifdef PUP ADDDOMAIN(pup); #endif #ifdef OSI ADDOMAIN(osi); #endif #ifdef DODIMP /* #include "../conf/imp.h" */ #if NIMP > 0 ADDDOMAIN(imp); #endif #endif for (dp = domains; dp; dp = dp->dom_next) for (pr = dp->dom_protosw; pr < dp->dom_protoswNPROTOSW; pr++) if (pr->pr_init) (*pr->pr_init)(); pffasttimo(); pfslowtimo(); } struct protosw * pffindtype(family, type) int family, type; { register struct domain *dp; register struct protosw *pr; for (dp = domains; dp; dp = dp->dom_next) if (dp->dom_family == family) goto found; return (0); found: for (pr = dp->dom_protosw; pr < dp->dom_protoswNPROTOSW; pr++) if (pr->pr_type && pr->pr_type == type) return (pr); return (0); } struct protosw * pffindproto(family, protocol) int family, protocol; { register struct domain *dp; register struct protosw *pr; if (family == 0) return (0); for (dp = domains; dp; dp = dp->dom_next) if (dp->dom_family == family) goto found; return (0); found: for (pr = dp->dom_protosw; pr < dp->dom_protoswNPROTOSW; pr++) if (pr->pr_protocol == protocol) return (pr); return (0); } pfctlinput(cmd, arg) int cmd; caddr_t arg; { register struct domain *dp; register struct protosw *pr; for (dp = domains; dp; dp = dp->dom_next) for (pr = dp->dom_protosw; pr < dp->dom_protoswNPROTOSW; pr++) if (pr->pr_ctlinput) (*pr->pr_ctlinput)(cmd, arg); } pfslowtimo() { register struct domain *dp; register struct protosw *pr; for (dp = domains; dp; dp = dp->dom_next) for (pr = dp->dom_protosw; pr < dp->dom_protoswNPROTOSW; pr++) if (pr->pr_slowtimo) (*pr->pr_slowtimo)(); timeout(pfslowtimo, (caddr_t)0, HZ/2); } pffasttimo() { register struct domain *dp; register struct protosw *pr; for (dp = domains; dp; dp = dp->dom_next) for (pr = dp->dom_protosw; pr < dp->dom_protoswNPROTOSW; pr++) if (pr->pr_fasttimo) (*pr->pr_fasttimo)(); timeout(pffasttimo, (caddr_t)0, HZ/5); } #endif /* SOCKET */ E 1 h09816 s 00001/00001/00484 d D 4.7 87/05/20 13:22:50 brian 12 11 c mbuf.h put back on system search path BB e s 00001/00001/00484 d D 4.6 87/05/14 16:07:10 build 11 10 c removed old SCCS strings and inserted #ident BB e s 00001/00001/00484 d D 4.5 87/05/07 18:58:48 van 10 9 c van - move defsocket.h back to /usr/include/sys e s 00005/00005/00480 d D 4.4 87/04/29 16:25:54 van 9 8 c van - moved ucb networking includes to INCUCB e s 00001/00002/00484 d D 4.3 87/04/16 18:40:00 dc 8 7 c dc - Add Bull updates from 03/05/87 e s 00014/00014/00472 d D 4.2 87/04/15 17:45:33 dc 7 6 c dc - changed #include "sys/..." to #include e s 00000/00000/00486 d D 4.1 87/02/20 13:29:36 build 6 5 c rolled rev to -r4 /dc e s 00000/00001/00486 d D 3.2 87/02/13 14:00:24 build 5 4 c add bull changes from Jan 23 /dc e s 00000/00000/00487 d D 3.1 87/01/19 09:22:05 build 4 3 c rolled rev to -r3 /dc e s 00000/00000/00487 d D 2.1 87/01/19 09:22:05 build 3 2 c AUTO NULL DELTA e s 00001/00000/00486 d D 1.2 87/01/16 10:15:19 build 2 1 c add ident string /dc e s 00486/00000/00000 d D 1.1 87/01/09 16:34:42 build 1 0 c Placed under source control - dc e u U f b f n t T I 2 D 8 /* "%W% %E%" */ E 2 I 1 D 5 /* %Z% Bull-Sems SPIX %Q%/%M% %I% %E% */ E 5 E 8 I 8 D 11 /* " %W% %E% " */ E 11 I 11 #ident " %W% %E% " E 11 E 8 #ifdef SOCKET D 7 #include "sys/param.h" #include "sys/types.h" #include "sys/page.h" #include "sys/defsocket.h" #include "sys/dir.h" #include "sys/errno.h" #include "sys/mbuf.h" #include "sys/signal.h" #include "sys/proc.h" #include "sys/protosw.h" #include "sys/socket.h" #include "sys/socketvar.h" #include "sys/user.h" #include "sys/debug.h" E 7 I 7 #include #include #include D 9 #include E 9 I 9 D 10 #include "sys/defsocket.h" E 10 I 10 #include E 10 E 9 #include #include D 9 #include E 9 I 9 D 12 #include "sys/mbuf.h" E 12 I 12 #include E 12 E 9 #include #include D 9 #include #include #include E 9 I 9 #include "sys/protosw.h" #include "sys/socket.h" #include "sys/socketvar.h" E 9 #include #include E 7 /* * Primitive routines for operating on sockets and socket buffers */ /* * Procedures to manipulate state flags of socket * and do appropriate wakeups. Normal sequence from the * active (originating) side is that soisconnecting() is * called during processing of connect() call, * resulting in an eventual call to soisconnected() if/when the * connection is established. When the connection is torn down * soisdisconnecting() is called during processing of disconnect() call, * and soisdisconnected() is called when the connection to the peer * is totally severed. The semantics of these routines are such that * connectionless protocols can call soisconnected() and soisdisconnected() * only, bypassing the in-progress calls when setting up a ``connection'' * takes no time. * * From the passive side, a socket is created with * two queues of sockets: so_q0 for connections in progress * and so_q for connections already made and awaiting user acceptance. * As a protocol is preparing incoming connections, it creates a socket * structure queued on so_q0 by calling sonewconn(). When the connection * is established, soisconnected() is called, and transfers the * socket structure to so_q, making it available to accept(). * * If a socket is closed with sockets on either * so_q0 or so_q, these sockets are dropped. * * If higher level protocols are implemented in * the kernel, the wakeups done here will sometimes * cause software-interrupt process scheduling. */ soisconnecting(so) register struct socket *so; { debug(DBsocket,"soisconnecting(%x)\n",so); so->so_state &= ~(SS_ISCONNECTED|SS_ISDISCONNECTING); so->so_state |= SS_ISCONNECTING; wakeup((caddr_t)&so->so_timeo); } soisconnected(so) register struct socket *so; { register struct socket *head = so->so_head; debug(DBsocket,"soisconnected(%x)\n",so); if (head) { if (soqremque(so, 0) == 0) panic("soisconnected"); soqinsque(head, so, 1); sorwakeup(head); wakeup((caddr_t)&head->so_timeo); } so->so_state &= ~(SS_ISCONNECTING|SS_ISDISCONNECTING); so->so_state |= SS_ISCONNECTED; wakeup((caddr_t)&so->so_timeo); sorwakeup(so); sowwakeup(so); } soisdisconnecting(so) register struct socket *so; { debug(DBsocket,"soisdisconnecting(%x)\n",so); so->so_state &= ~SS_ISCONNECTING; so->so_state |= (SS_ISDISCONNECTING|SS_CANTRCVMORE|SS_CANTSENDMORE); wakeup((caddr_t)&so->so_timeo); sowwakeup(so); sorwakeup(so); } soisdisconnected(so) register struct socket *so; { debug(DBsocket,"soisdisconnected(%x)\n",so); so->so_state &= ~(SS_ISCONNECTING|SS_ISCONNECTED|SS_ISDISCONNECTING); so->so_state |= (SS_CANTRCVMORE|SS_CANTSENDMORE); wakeup((caddr_t)&so->so_timeo); sowwakeup(so); sorwakeup(so); } /* * When an attempt at a new connection is noted on a socket * which accepts connections, sonewconn is called. If the * connection is possible (subject to space constraints, etc.) * then we allocate a new structure, propoerly linked into the * data structure of the original socket, and return this. */ struct socket * sonewconn(head) register struct socket *head; { register struct socket *so; register struct mbuf *m; debug(DBsocket,"sonewconn(%x):",head); if (head->so_qlen + head->so_q0len > 3 * head->so_qlimit / 2) goto bad; m = m_getclr(M_DONTWAIT, MT_SOCKET); if (m == NULL) goto bad; so = mtod(m, struct socket *); so->so_type = head->so_type; so->so_options = head->so_options &~ SO_ACCEPTCONN; so->so_linger = head->so_linger; so->so_state = head->so_state | SS_NOFDREF; so->so_proto = head->so_proto; so->so_timeo = head->so_timeo; so->so_pgrp = head->so_pgrp; soqinsque(head, so, 0); if ((*so->so_proto->pr_usrreq)(so, PRU_ATTACH, (struct mbuf *)0, (struct mbuf *)0, (struct mbuf *)0)) { (void) soqremque(so, 0); (void) m_free(m); goto bad; } debug(DBsocket,"%x\n",so); return (so); bad: debug(DBsocket,"bad\n"); return ((struct socket *)0); } soqinsque(head, so, q) register struct socket *head, *so; int q; { debug(DBsocket,"soinsque(%x,%x,%x)\n",head,so,q); so->so_head = head; if (q == 0) { head->so_q0len++; so->so_q0 = head->so_q0; head->so_q0 = so; } else { head->so_qlen++; so->so_q = head->so_q; head->so_q = so; } } soqremque(so, q) register struct socket *so; int q; { register struct socket *head, *prev, *next; debug(DBsocket,"soremque(%x,%x)\n",so,q); head = so->so_head; prev = head; for (;;) { next = q ? prev->so_q : prev->so_q0; if (next == so) break; if (next == head) return (0); prev = next; } if (q == 0) { prev->so_q0 = next->so_q0; head->so_q0len--; } else { prev->so_q = next->so_q; head->so_qlen--; } next->so_q0 = next->so_q = 0; next->so_head = 0; return (1); } /* * Socantsendmore indicates that no more data will be sent on the * socket; it would normally be applied to a socket when the user * informs the system that no more data is to be sent, by the protocol * code (in case PRU_SHUTDOWN). Socantrcvmore indicates that no more data * will be received, and will normally be applied to the socket by a * protocol when it detects that the peer will send no more data. * Data queued for reading in the socket may yet be read. */ socantsendmore(so) struct socket *so; { debug(DBsocket,"socantsendmore(%x)\n",so); so->so_state |= SS_CANTSENDMORE; sowwakeup(so); } socantrcvmore(so) struct socket *so; { debug(DBsocket,"socantrecvmore(%x)\n",so); so->so_state |= SS_CANTRCVMORE; sorwakeup(so); } /* * Socket select/wakeup routines. */ /* * Wait for data to arrive at/drain from a socket buffer. */ sbwait(sb) struct sockbuf *sb; { debug(DBsocket,"sbwait(%x)\n",sb); sb->sb_flags |= SB_WAIT; sleep((caddr_t)&sb->sb_cc, PZERO+1); } /* * Wakeup processes waiting on a socket buffer. */ sbwakeup(sb) register struct sockbuf *sb; { debug(DBsocket,"sbwakeup(%x)\n",sb); if (sb->sb_sel) { selwakeup(sb->sb_sel, sb->sb_flags & SB_COLL); sb->sb_sel = 0; sb->sb_flags &= ~SB_COLL; } if (sb->sb_flags & SB_WAIT) { sb->sb_flags &= ~SB_WAIT; wakeup((caddr_t)&sb->sb_cc); } } /* * Socket buffer (struct sockbuf) utility routines. * * Each socket contains two socket buffers: one for sending data and * one for receiving data. Each buffer contains a queue of mbufs, * information about the number of mbufs and amount of data in the * queue, and other fields allowing select() statements and notification * on data availability to be implemented. * * Before using a new socket structure it is first necessary to reserve * buffer space to the socket, by calling sbreserve. This commits * some of the available buffer space in the system buffer pool for the * socket. The space should be released by calling sbrelease when the * socket is destroyed. * * The routine sbappend() is normally called to append new mbufs * to a socket buffer, after checking that adequate space is available * comparing the function spspace() with the amount of data to be added. * Data is normally removed from a socket buffer in a protocol by * first calling m_copy on the socket buffer mbuf chain and sending this * to a peer, and then removing the data from the socket buffer with * sbdrop when the data is acknowledged by the peer (or immediately * in the case of unreliable protocols.) * * Protocols which do not require connections place both source address * and data information in socket buffer queues. The source addresses * are stored in single mbufs after each data item, and are easily found * as the data items are all marked with end of record markers. The * sbappendaddr() routine stores a datum and associated address in * a socket buffer. Note that, unlike sbappend(), this routine checks * for the caller that there will be enough space to store the data. * It fails if there is not enough space, or if it cannot find * a mbuf to store the address in. * * The higher-level routines sosend and soreceive (in socket.c) * also add data to, and remove data from socket buffers repectively. */ soreserve(so, sndcc, rcvcc) register struct socket *so; int sndcc, rcvcc; { debug(DBsocket,"soreserve(%x,%d,%d):",so,sndcc,rcvcc); if (sbreserve(&so->so_snd, sndcc) == 0) goto bad; if (sbreserve(&so->so_rcv, rcvcc) == 0) goto bad2; debug(DBsocket," ok\n"); return (0); bad2: sbrelease(&so->so_snd); bad: debug(DBsocket," bad\n"); return (ENOBUFS); } /* * Allot mbufs to a sockbuf. */ sbreserve(sb, cc) struct sockbuf *sb; { debug(DBmbuf,"sbreserve(%x,%d)\n",sb,cc); /* someday maybe this routine will fail... */ sb->sb_hiwat = cc; /* * 2 implies names can be no more than 1 mbuf each */ sb->sb_mbmax = cc<<1; return (1); } /* * Free mbufs held by a socket, and reserved mbuf space. */ sbrelease(sb) struct sockbuf *sb; { debug(DBmbuf,"sbrelease(%x)\n",sb); sbflush(sb); sb->sb_hiwat = sb->sb_mbmax = 0; } /* * Routines to add (at the end) and remove (from the beginning) * data from a mbuf queue. */ /* * Append mbuf queue m to sockbuf sb. */ sbappend(sb, m) register struct mbuf *m; register struct sockbuf *sb; { register struct mbuf *n; debug(DBmbuf,"sbappend(%x,%x)\n",sb,m); n = sb->sb_mb; if (n) while (n->m_next) n = n->m_next; while (m) { if (m->m_len == 0 && (int)m->m_act == 0) { m = m_free(m); continue; } if (n && n->m_off <= MMAXOFF && m->m_off <= MMAXOFF && (int)n->m_act == 0 && (int)m->m_act == 0 && (n->m_off + n->m_len + m->m_len) <= MMAXOFF) { bcopy(mtod(m, caddr_t), mtod(n, caddr_t) + n->m_len, (unsigned)m->m_len); n->m_len += m->m_len; sb->sb_cc += m->m_len; m = m_free(m); continue; } sballoc(sb, m); if (n == 0) sb->sb_mb = m; else n->m_next = m; n = m; m = m->m_next; n->m_next = 0; } } /* * Append data and address. * Return 0 if no space in sockbuf or if * can't get mbuf to stuff address in. */ sbappendaddr(sb, asa, m0, rights0) struct sockbuf *sb; struct sockaddr *asa; struct mbuf *m0, *rights0; { register struct mbuf *m; register int len = sizeof (struct sockaddr); register struct mbuf *rights; debug(DBmbuf,"sbappendaddr(%x,%x,%x,%x)\n",sb,asa,m0,rights0); if (rights0) len += rights0->m_len; m = m0; if (m == 0) panic("sbappendaddr"); for (;;) { len += m->m_len; if (m->m_next == 0) { m->m_act = (struct mbuf *)1; break; } m = m->m_next; } if (len > sbspace(sb)) return (0); m = m_get(M_DONTWAIT, MT_SONAME); if (m == NULL) return (0); m->m_len = sizeof (struct sockaddr); m->m_act = (struct mbuf *)1; *mtod(m, struct sockaddr *) = *asa; if (rights0 == 0 || rights0->m_len == 0) { rights = m_get(M_DONTWAIT, MT_SONAME); if (rights) rights->m_len = 0; } else rights = m_copy(rights0, 0, rights0->m_len); if (rights == 0) { m_freem(m); return (0); } rights->m_act = (struct mbuf *)1; m->m_next = rights; rights->m_next = m0; sbappend(sb, m); return (1); } /* * Free all mbufs on a sockbuf mbuf chain. * Check that resource allocations return to 0. */ sbflush(sb) register struct sockbuf *sb; { debug(DBmbuf,"sbflush(%x)\n",sb); if (sb->sb_flags & SB_LOCK) panic("sbflush"); if (sb->sb_cc) sbdrop(sb, sb->sb_cc); if (sb->sb_cc || sb->sb_mbcnt || sb->sb_mb) panic("sbflush 2"); } /* * Drop data from (the front of) a sockbuf chain. */ sbdrop(sb, len) register struct sockbuf *sb; register int len; { register struct mbuf *m = sb->sb_mb, *mn; debug(DBmbuf,"sbdrop(%x,%d)\n",sb,len); while (len > 0) { if (m == 0) panic("sbdrop"); if (m->m_len > len) { m->m_len -= len; m->m_off += len; sb->sb_cc -= len; break; } len -= m->m_len; sbfree(sb, m); MBFREE(m, mn); m = mn; } sb->sb_mb = m; } #endif /* SOCKET */ E 1 h25042 s 00001/00001/00037 d D 4.6 87/05/14 16:07:22 build 11 10 c removed old SCCS strings and inserted #ident BB e s 00001/00001/00037 d D 4.5 87/05/07 18:58:34 van 10 9 c van - move defsocket.h back to /usr/include/sys e s 00004/00004/00034 d D 4.4 87/04/29 16:25:46 van 9 8 c van - moved ucb networking includes to INCUCB e s 00001/00002/00037 d D 4.3 87/04/16 18:38:39 dc 8 7 c dc - Add Bull updates from 03/05/87 e s 00005/00005/00034 d D 4.2 87/04/15 17:45:41 dc 7 6 c dc - changed #include "sys/..." to #include e s 00000/00000/00039 d D 4.1 87/02/20 13:29:39 build 6 5 c rolled rev to -r4 /dc e s 00000/00001/00039 d D 3.2 87/02/13 13:59:29 build 5 4 c add bull changes from Jan 23 /dc e s 00000/00000/00040 d D 3.1 87/01/19 09:22:07 build 4 3 c rolled rev to -r3 /dc e s 00000/00000/00040 d D 2.1 87/01/19 09:22:07 build 3 2 c AUTO NULL DELTA e s 00001/00000/00039 d D 1.2 87/01/16 10:15:23 build 2 1 c add ident string /dc e s 00039/00000/00000 d D 1.1 87/01/09 16:34:39 build 1 0 c Placed under source control - dc e u U f b f n t T I 2 D 8 /* "%W% %E%" */ E 2 I 1 D 5 /* %Z% Bull-Sems SPIX %Q%/%M% %I% %E% */ E 5 E 8 I 8 D 11 /* " %W% %E% " */ E 11 I 11 #ident " %W% %E% " E 11 E 8 #ifdef SOCKET D 7 #include "sys/defsocket.h" #include "sys/types.h" #include "sys/domain.h" #include "sys/protosw.h" #include "sys/socket.h" E 7 I 7 D 9 #include E 9 I 9 D 10 #include "sys/defsocket.h" E 10 I 10 #include E 10 E 9 #include D 9 #include #include #include E 9 I 9 #include "sys/domain.h" #include "sys/protosw.h" #include "sys/socket.h" E 9 E 7 /* * Definitions of protocols supported in the UNIX domain. */ int uipc_usrreq(); int raw_init(),raw_usrreq(),raw_input(),raw_ctlinput(); struct protosw unixsw[] = { { SOCK_STREAM, PF_UNIX, 0, PR_CONNREQUIRED|PR_WANTRCVD, 0, 0, 0, 0, uipc_usrreq, 0, 0, 0, 0, }, { SOCK_DGRAM, PF_UNIX, 0, PR_ATOMIC|PR_ADDR|PR_RIGHTS, 0, 0, 0, 0, uipc_usrreq, 0, 0, 0, 0, }, { 0, 0, 0, 0, raw_input, 0, raw_ctlinput, 0, raw_usrreq, raw_init, 0, 0, 0, } }; struct domain unixdomain = { AF_UNIX, "unix", unixsw, &unixsw[sizeof(unixsw)/sizeof(unixsw[0])] }; #endif /* SOCKET */ E 1 h59567 s 00001/00001/00730 d D 4.7 87/05/20 13:23:10 brian 12 11 c mbuf.h put back on system search path BB e s 00001/00001/00730 d D 4.6 87/05/14 16:07:34 build 11 10 c removed old SCCS strings and inserted #ident BB e s 00001/00001/00730 d D 4.5 87/05/07 18:58:39 van 10 9 c van - move defsocket.h back to /usr/include/sys e s 00006/00006/00725 d D 4.4 87/04/29 16:25:48 van 9 8 c van - moved ucb networking includes to INCUCB e s 00001/00002/00730 d D 4.3 87/04/16 18:38:58 dc 8 7 c dc - Add Bull updates from 03/05/87 e s 00016/00016/00716 d D 4.2 87/04/15 17:45:52 dc 7 6 c dc - changed #include "sys/..." to #include e s 00000/00000/00732 d D 4.1 87/02/20 13:29:42 build 6 5 c rolled rev to -r4 /dc e s 00000/00001/00732 d D 3.2 87/02/13 13:59:54 build 5 4 c add bull changes from Jan 23 /dc e s 00000/00000/00733 d D 3.1 87/01/19 09:22:11 build 4 3 c rolled rev to -r3 /dc e s 00000/00000/00733 d D 2.1 87/01/19 09:22:11 build 3 2 c AUTO NULL DELTA e s 00001/00000/00732 d D 1.2 87/01/16 10:15:27 build 2 1 c add ident string /dc e s 00732/00000/00000 d D 1.1 87/01/09 16:34:40 build 1 0 c Placed under source control - dc e u U f b f n t T I 2 D 8 /* "%W% %E%" */ E 2 I 1 D 5 /* %Z% Bull-Sems SPIX %Q%/%M% %I% %E% */ E 5 E 8 I 8 D 11 /* " %W% %E% " */ E 11 I 11 #ident " %W% %E% " E 11 E 8 #ifdef SOCKET /* * - supprime le comptage des messages emis/recus dans * u.u_ru.ru_msg??? qui n'existe pas en spix/sysV (a revoir) */ D 7 #include "sys/param.h" #include "sys/types.h" #include "sys/defsocket.h" #include "sys/dir.h" #include "sys/errno.h" #include "sys/file.h" #include "sys/mbuf.h" #include "sys/protosw.h" #include "sys/signal.h" #include "sys/socket.h" #include "sys/socketvar.h" #include "sys/uio.h" #include "sys/un.h" #include "sys/user.h" #include "sys/var.h" #include "sys/debug.h" E 7 I 7 #include #include D 9 #include E 9 I 9 D 10 #include "sys/defsocket.h" E 10 I 10 #include E 10 E 9 #include #include #include D 9 #include #include E 9 I 9 D 12 #include "sys/mbuf.h" E 12 I 12 #include E 12 #include "sys/protosw.h" E 9 #include D 9 #include #include E 9 I 9 #include "sys/socket.h" #include "sys/socketvar.h" E 9 #include D 9 #include E 9 I 9 #include "sys/un.h" E 9 #include #include #include E 7 /* * Socket operation routines. * These routines are called by the routines in * sys_socket.c or from a system process, and * implement the semantics of socket operations by * switching out to the protocol specific routines. */ socreate(dom, aso, type, proto) struct socket **aso; register int type; int proto; { register struct protosw *prp; register struct socket *so; register struct mbuf *m; register int error; debug(DBsocket,"socreate(%x,%x,%d,%d)\n",dom,aso,type,proto); if (mbstat.m_mbfree < NMBMIN) /* if mbfree < 10% can't create */ return(ENOBUFS); if (proto) prp = pffindproto(dom, proto); else prp = pffindtype(dom, type); if (prp == 0) return (EPROTONOSUPPORT); if (prp->pr_type != type) return (EPROTOTYPE); m = m_getclr(M_WAIT, MT_SOCKET); if (m == 0) return (ENOBUFS); so = mtod(m, struct socket *); so->so_options = 0; so->so_state = 0; so->so_type = type; if (u.u_uid == 0) so->so_state = SS_PRIV; so->so_proto = prp; error = (*prp->pr_usrreq)(so, PRU_ATTACH, (struct mbuf *)0, (struct mbuf *)0, (struct mbuf *)0); if (error) { so->so_state |= SS_NOFDREF; sofree(so); return (error); } *aso = so; return (0); } sobind(so, nam) struct socket *so; struct mbuf *nam; { int s = splnet(); int error; error = (*so->so_proto->pr_usrreq)(so, PRU_BIND, (struct mbuf *)0, nam, (struct mbuf *)0); splx(s); return (error); } solisten(so, backlog) register struct socket *so; int backlog; { int s, error; debug(DBsocket,"solisten(%x,%d)\n",so,backlog); s = splnet(); error = (*so->so_proto->pr_usrreq)(so, PRU_LISTEN, (struct mbuf *)0, (struct mbuf *)0, (struct mbuf *)0); if (error) { splx(s); return (error); } if (so->so_q == 0) { so->so_q = so; so->so_q0 = so; so->so_options |= SO_ACCEPTCONN; } if (backlog < 0) backlog = 0; so->so_qlimit = MIN(backlog, SOMAXCONN); splx(s); return (0); } sofree(so) register struct socket *so; { debug(DBsocket,"sofree(%x)\n",so); if (so->so_head) { if (!soqremque(so, 0) && !soqremque(so, 1)) panic("sofree dq"); so->so_head = 0; } if (so->so_pcb || (so->so_state & SS_NOFDREF) == 0) return; sbrelease(&so->so_snd); sorflush(so); (void) m_free(dtom(so)); } /* * Close a socket on last file table reference removal. * Initiate disconnect if connected. * Free socket when disconnect complete. */ soclose(so) register struct socket *so; { int s, error; debug(DBsocket,"soclose(%x)\n",so); s = splnet(); /* conservative */ error = 0; if (so->so_options & SO_ACCEPTCONN) { while (so->so_q0 != so) (void) soabort(so->so_q0); while (so->so_q != so) (void) soabort(so->so_q); } if (so->so_pcb == 0) goto discard; if (so->so_state & SS_ISCONNECTED) { if ((so->so_state & SS_ISDISCONNECTING) == 0) { error = sodisconnect(so, (struct mbuf *)0); if (error) goto drop; } if (so->so_options & SO_LINGER) { if ((so->so_state & SS_ISDISCONNECTING) && (so->so_state & SS_NBIO)) goto drop; while (so->so_state & SS_ISCONNECTED) sleep((caddr_t)&so->so_timeo, PZERO+1); } } drop: if (so->so_pcb) { int error2 = (*so->so_proto->pr_usrreq)(so, PRU_DETACH, (struct mbuf *)0, (struct mbuf *)0, (struct mbuf *)0); if (error == 0) error = error2; } discard: if (so->so_state & SS_NOFDREF) panic("soclose: NOFDREF"); so->so_state |= SS_NOFDREF; sofree(so); splx(s); return (error); } /* * Must be called at splnet... */ soabort(so) struct socket *so; { debug(DBsocket,"soabort(%x)\n",so); return ( (*so->so_proto->pr_usrreq)(so, PRU_ABORT, (struct mbuf *)0, (struct mbuf *)0, (struct mbuf *)0)); } soaccept(so, nam) register struct socket *so; struct mbuf *nam; { int s, error; debug(DBsocket,"soaccept(%x,%x)\n",so,nam); s = splnet(); if ((so->so_state & SS_NOFDREF) == 0) panic("soaccept: !NOFDREF"); so->so_state &= ~SS_NOFDREF; error = (*so->so_proto->pr_usrreq)(so, PRU_ACCEPT, (struct mbuf *)0, nam, (struct mbuf *)0); splx(s); return (error); } soconnect(so, nam) register struct socket *so; struct mbuf *nam; { int s, error; debug(DBsocket,"soconnect(%x,%x)\n",so,nam); s = splnet(); if (so->so_state & (SS_ISCONNECTED|SS_ISCONNECTING)) { error = EISCONN; goto bad; } error = (*so->so_proto->pr_usrreq)(so, PRU_CONNECT, (struct mbuf *)0, nam, (struct mbuf *)0); bad: splx(s); return (error); } soconnect2(so1, so2) register struct socket *so1; struct socket *so2; { int s, error; debug(DBsocket,"soconnect2(%x,%x)\n",so1,so2); s = splnet(); error = (*so1->so_proto->pr_usrreq)(so1, PRU_CONNECT2, (struct mbuf *)0, (struct mbuf *)so2, (struct mbuf *)0); splx(s); return (error); } sodisconnect(so, nam) register struct socket *so; struct mbuf *nam; { int s, error; debug(DBsocket,"sodisconnect(%x,%x)\n",so,nam); s = splnet(); if ((so->so_state & SS_ISCONNECTED) == 0) { error = ENOTCONN; goto bad; } if (so->so_state & SS_ISDISCONNECTING) { error = EALREADY; goto bad; } error = (*so->so_proto->pr_usrreq)(so, PRU_DISCONNECT, (struct mbuf *)0, nam, (struct mbuf *)0); bad: splx(s); return (error); } /* * Send on a socket. * If send must go all at once and message is larger than * send buffering, then hard error. * Lock against other senders. * If must go all at once and not enough room now, then * inform user that this would block and do nothing. */ sosend(so, nam, uio, flags, rights) register struct socket *so; struct mbuf *nam; register struct uio *uio; int flags; struct mbuf *rights; { struct mbuf *top = 0; register struct mbuf *m, **mp = ⊤ register int space; int len, error = 0, s, dontroute; struct sockbuf sendtempbuf; debug(DBmbuf,"sosend(%x,%x,%x,%x,%x)",so,nam,uio,flags,rights); if (sosendallatonce(so) && uio->uio_resid > so->so_snd.sb_hiwat) return (EMSGSIZE); dontroute = (flags & MSG_DONTROUTE) && (so->so_options & SO_DONTROUTE) == 0 && (so->so_proto->pr_flags & PR_ATOMIC); restart: sblock(&so->so_snd); #define snderr(errno) { error = errno; splx(s); goto release; } /*** u.u_ru.ru_msgsnd++; NOP pour spix/sysV ***/ again: s = splnet(); if (so->so_state & SS_CANTSENDMORE) { psignal(u.u_procp, SIGPIPE); snderr(EPIPE); } if (so->so_error) { error = so->so_error; so->so_error = 0; splx(s); goto release; } if ((so->so_state & SS_ISCONNECTED) == 0) { if (so->so_proto->pr_flags & PR_CONNREQUIRED) snderr(ENOTCONN); if (nam == 0) snderr(EDESTADDRREQ); } if (top) { if (dontroute) so->so_options |= SO_DONTROUTE; error = (*so->so_proto->pr_usrreq)(so, (flags & MSG_OOB) ? PRU_SENDOOB : PRU_SEND, top, (caddr_t)nam, rights); if (dontroute) so->so_options &= ~SO_DONTROUTE; top = 0; if (error) { splx(s); goto release; } mp = ⊤ } if (uio->uio_resid == 0) { splx(s); goto release; } if (flags & MSG_OOB) space = 1024; else { space = sbspace(&so->so_snd); if (space <= 0 || sosendallatonce(so) && space < uio->uio_resid) { if (so->so_state & SS_NBIO) snderr(EWOULDBLOCK); sbunlock(&so->so_snd); sbwait(&so->so_snd); splx(s); goto restart; } } splx(s); /* * Temporary kludge-- don't want to update so_snd in this loop * (will be done when sent), but need to recalculate * space on each iteration. For now, copy so_snd into a tmp. */ sendtempbuf = so->so_snd; while (uio->uio_resid > 0 && space > 0) { register struct iovec *iov = uio->uio_iov; if (iov->iov_len == 0) { uio->uio_iov++; uio->uio_iovcnt--; if (uio->uio_iovcnt < 0) panic("sosend"); continue; } MBGET(m, M_WAIT, MT_DATA); if (m == NULL) { error = ENOBUFS; /* SIGPIPE? */ goto release; } if (iov->iov_len >= CLBYTES && space >= CLBYTES) { register struct mbuf *p; MCLGET(p, 1); if (p == 0) goto nopages; m->m_off = (int)p - (int)m; len = CLBYTES; } else { nopages: len = MIN(MLEN, iov->iov_len); } debug(DBmbuf,"!%x,%d",m,len); error = uiomove(mtod(m, caddr_t), len, UIO_WRITE, uio); m->m_len = len; *mp = m; if (error) goto release; mp = &m->m_next; if (flags & MSG_OOB) space -= len; else { sballoc(&sendtempbuf, m); space = sbspace(&sendtempbuf); } } goto again; release: sbunlock(&so->so_snd); if (top) m_freem(top); return (error); } soreceive(so, aname, uio, flags, rightsp) register struct socket *so; struct mbuf **aname; register struct uio *uio; int flags; struct mbuf **rightsp; { register struct mbuf *m, *n; register int len, error = 0, s, eor, tomark; struct protosw *pr = so->so_proto; int moff; debug(DBmbuf,"soreceive(%x,%x,%x,%x,%x)\n",so,aname,uio,flags,rightsp); if (rightsp) *rightsp = 0; if (aname) *aname = 0; if (flags & MSG_OOB) { m = m_get(M_WAIT, MT_DATA); if (m == 0) return (ENOBUFS); error = (*pr->pr_usrreq)(so, PRU_RCVOOB, m, (struct mbuf *)0, (struct mbuf *)0); if (error) goto bad; do { len = uio->uio_resid; if (len > m->m_len) len = m->m_len; error = uiomove(mtod(m, caddr_t), (int)len, UIO_READ, uio); m = m_free(m); } while (uio->uio_resid && error == 0 && m); bad: if (m) m_freem(m); return (error); } restart: sblock(&so->so_rcv); s = splnet(); #define rcverr(errno) { error = errno; splx(s); goto release; } if (so->so_rcv.sb_cc == 0) { if (so->so_error) { error = so->so_error; so->so_error = 0; splx(s); goto release; } if (so->so_state & SS_CANTRCVMORE) { splx(s); goto release; } if ((so->so_state & SS_ISCONNECTED) == 0 && (so->so_proto->pr_flags & PR_CONNREQUIRED)) rcverr(ENOTCONN); if (so->so_state & SS_NBIO) rcverr(EWOULDBLOCK); sbunlock(&so->so_rcv); sbwait(&so->so_rcv); splx(s); goto restart; } /*** u.u_ru.ru_msgrcv++; NOP pour spix/sysV ***/ m = so->so_rcv.sb_mb; if (m == 0) panic("receive"); if (pr->pr_flags & PR_ADDR) { if ((flags & MSG_PEEK) == 0) { so->so_rcv.sb_cc -= m->m_len; so->so_rcv.sb_mbcnt -= MSIZE; } if (aname) { if (flags & MSG_PEEK) { *aname = m_copy(m, 0, m->m_len); if (*aname == NULL) panic("receive 2"); } else *aname = m; m = m->m_next; (*aname)->m_next = 0; } else if (flags & MSG_PEEK) m = m->m_next; else m = m_free(m); if (m == 0) panic("receive 2a"); if (rightsp) { if (m->m_len) *rightsp = m_copy(m, 0, m->m_len); else { *rightsp = m_get(M_DONTWAIT, MT_SONAME); if (*rightsp) (*rightsp)->m_len = 0; } } if (flags & MSG_PEEK) m = m->m_next; else { so->so_rcv.sb_cc -= m->m_len; so->so_rcv.sb_mbcnt -= MSIZE; m = m_free(m); } if (m == 0) panic("receive 3"); if ((flags & MSG_PEEK) == 0) so->so_rcv.sb_mb = m; } eor = 0; moff = 0; tomark = so->so_oobmark; do { if (uio->uio_resid <= 0) break; len = uio->uio_resid; so->so_state &= ~SS_RCVATMARK; if (tomark && len > tomark) len = tomark; if (moff+len > m->m_len - moff) len = m->m_len - moff; splx(s); error = uiomove(mtod(m, caddr_t) + moff, (int)len, UIO_READ, uio); debug(DBmbuf,"?%x,%d(%d)",m,len,m->m_len); s = splnet(); if (len == m->m_len) { eor = (int)m->m_act; if (flags & MSG_PEEK) m = m->m_next; else { sbfree(&so->so_rcv, m); MBFREE(m, n); m = n; so->so_rcv.sb_mb = m; } moff = 0; } else { if (flags & MSG_PEEK) moff += len; else { m->m_off += len; m->m_len -= len; so->so_rcv.sb_cc -= len; } } if ((flags & MSG_PEEK) == 0 && so->so_oobmark) { so->so_oobmark -= len; if (so->so_oobmark == 0) { so->so_state |= SS_RCVATMARK; break; } } if (tomark) { tomark -= len; if (tomark == 0) break; } } while (m && error == 0 && !eor); if (flags & MSG_PEEK) goto release; if ((so->so_proto->pr_flags & PR_ATOMIC) && eor == 0) do { if (m == 0) panic("receive 4"); sbfree(&so->so_rcv, m); eor = (int)m->m_act; so->so_rcv.sb_mb = m->m_next; MBFREE(m, n); m = n; } while (eor == 0); if ((so->so_proto->pr_flags & PR_WANTRCVD) && so->so_pcb) (*so->so_proto->pr_usrreq)(so, PRU_RCVD, (struct mbuf *)0, (struct mbuf *)0, (struct mbuf *)0); release: sbunlock(&so->so_rcv); if (error == 0 && rightsp && *rightsp && so->so_proto->pr_family == AF_UNIX) error = unp_externalize(*rightsp); splx(s); return (error); } soshutdown(so, how) register struct socket *so; register int how; { register struct protosw *pr = so->so_proto; debug(DBsocket,"soshutdown(%x,%d)\n",so,how); how++; if (how & FREAD) sorflush(so); if (how & FWRITE) return ((*pr->pr_usrreq)(so, PRU_SHUTDOWN, (struct mbuf *)0, (struct mbuf *)0, (struct mbuf *)0)); return (0); } sorflush(so) register struct socket *so; { register struct sockbuf *sb = &so->so_rcv; register struct protosw *pr = so->so_proto; register int s; struct sockbuf asb; debug(DBsocket,"sorflush(%x)\n",so); sblock(sb); s = splimp(); socantrcvmore(so); sbunlock(sb); asb = *sb; bzero((caddr_t)sb, sizeof (*sb)); splx(s); if (pr->pr_family == AF_UNIX && (pr->pr_flags & PR_RIGHTS)) unp_scan(asb.sb_mb, unp_discard); sbrelease(&asb); } sosetopt(so, level, optname, m) register struct socket *so; int level, optname; register struct mbuf *m; { debug(DBsocket,"sosetopt(%x,%d,%d,%x)\n",so,level,optname,m); if (level != SOL_SOCKET) return (EINVAL); /* XXX */ switch (optname) { case SO_DEBUG: case SO_KEEPALIVE: case SO_DONTROUTE: case SO_USELOOPBACK: case SO_REUSEADDR: so->so_options |= optname; break; case SO_LINGER: if (m == NULL || m->m_len != sizeof (int)) return (EINVAL); so->so_options |= SO_LINGER; so->so_linger = *mtod(m, int *); break; case SO_DONTLINGER: so->so_options &= ~SO_LINGER; so->so_linger = 0; break; default: return (EINVAL); } return (0); } sogetopt(so, level, optname, m) register struct socket *so; int level, optname; register struct mbuf *m; { debug(DBsocket,"sogetopt(%x,%d,%d,%x)\n",so,level,optname,m); if (level != SOL_SOCKET) return (EINVAL); /* XXX */ switch (optname) { case SO_USELOOPBACK: case SO_DONTROUTE: case SO_DEBUG: case SO_KEEPALIVE: case SO_LINGER: case SO_REUSEADDR: if ((so->so_options & optname) == 0) return (ENOPROTOOPT); if (optname == SO_LINGER && m != NULL) { *mtod(m, int *) = so->so_linger; m->m_len = sizeof (so->so_linger); } break; default: return (EINVAL); } return (0); } sohasoutofband(so) register struct socket *so; { extern struct proc *procfind(); struct proc *p; debug(DBsocket,"sohasoutofband(%x)\n",so); if (so->so_pgrp == 0) return; if (so->so_pgrp > 0) GSIGNAL(so->so_pgrp, SIGURG); else { p = procfind(-so->so_pgrp); if (p) psignal(p, SIGURG); } } #endif /* SOCKET */ E 1 h60032 s 00001/00001/00788 d D 4.7 87/05/20 13:23:28 brian 12 11 c mbuf.h put back on system search path BB e s 00001/00001/00788 d D 4.6 87/05/14 16:07:49 build 11 10 c removed old SCCS strings and inserted #ident BB e s 00001/00001/00788 d D 4.5 87/05/07 18:58:54 van 10 9 c van - move defsocket.h back to /usr/include/sys e s 00005/00005/00784 d D 4.4 87/04/29 16:25:58 van 9 8 c van - moved ucb networking includes to INCUCB e s 00001/00002/00788 d D 4.3 87/04/16 18:39:47 dc 8 7 c dc - Add Bull updates from 03/05/87 e s 00017/00017/00773 d D 4.2 87/04/15 17:46:07 dc 7 6 c dc - changed #include "sys/..." to #include e s 00000/00000/00790 d D 4.1 87/02/20 13:29:47 build 6 5 c rolled rev to -r4 /dc e s 00000/00001/00790 d D 3.2 87/02/13 14:00:48 build 5 4 c add bull changes from Jan 23 /dc e s 00000/00000/00791 d D 3.1 87/01/19 09:22:15 build 4 3 c rolled rev to -r3 /dc e s 00000/00000/00791 d D 2.1 87/01/19 09:22:15 build 3 2 c AUTO NULL DELTA e s 00001/00000/00790 d D 1.2 87/01/16 10:15:33 build 2 1 c add ident string /dc e s 00790/00000/00000 d D 1.1 87/01/09 16:34:43 build 1 0 c Placed under source control - dc e u U f b f n t T I 2 D 8 /* "%W% %E%" */ E 2 I 1 D 5 /* %Z% Bull-Sems SPIX %Q%/%M% %I% %E% */ E 5 E 8 I 8 D 11 /* " %W% %E% " */ E 11 I 11 #ident " %W% %E% " E 11 E 8 #ifdef SOCKET D 7 #include "sys/param.h" #include "sys/types.h" #include "sys/defsocket.h" #include "sys/buf.h" #include "sys/dir.h" #include "sys/errno.h" #include "sys/file.h" #include "sys/inode.h" #include "sys/mbuf.h" #include "sys/protosw.h" #include "sys/socket.h" #include "sys/socketvar.h" #include "sys/systm.h" #include "sys/uio.h" #include "sys/signal.h" #include "sys/user.h" #include "sys/debug.h" E 7 I 7 #include #include D 9 #include E 9 I 9 D 10 #include "sys/defsocket.h" E 10 I 10 #include E 10 E 9 #include #include #include #include #include D 9 #include #include #include #include E 9 I 9 D 12 #include "sys/mbuf.h" E 12 I 12 #include E 12 #include "sys/protosw.h" #include "sys/socket.h" #include "sys/socketvar.h" E 9 #include #include #include #include #include E 7 /* * System call interface to the socket abstraction. */ struct file *getsock(); socket() { register struct a { int domain; int type; int protocol; } *uap = (struct a *)u.u_ap; struct socket *so; register struct file *fp; if ((fp = FALLOC()) == NULL) return; fp->f_flag = FREAD|FWRITE; fp->f_type = DTYPE_SOCKET; u.u_error = socreate(uap->domain, &so, uap->type, uap->protocol); if (u.u_error) goto bad; fp->f_data = so; return; bad: u.u_ofile[u.u_rval1] = 0; fp->f_count = 0; fp->f_next = ffreelist; ffreelist = fp; } bind() { register struct a { int s; caddr_t name; int namelen; } *uap = (struct a *)u.u_ap; register struct file *fp; struct mbuf *nam; fp = getsock(uap->s); if (fp == 0) return; u.u_error = sockargs(&nam, uap->name, uap->namelen); if (u.u_error) return; u.u_error = sobind((struct socket *)fp->f_data, nam); m_freem(nam); debug(DBsocket,"return from bind(%d,%x,%d)=%x\n", uap->s,uap->name,uap->namelen,u.u_error); } listen() { register struct a { int s; int backlog; } *uap = (struct a *)u.u_ap; register struct file *fp; fp = getsock(uap->s); if (fp == 0) return; u.u_error = solisten((struct socket *)fp->f_data, uap->backlog); } accept() { register struct a { int s; caddr_t name; int *anamelen; } *uap = (struct a *)u.u_ap; register struct file *fp; struct mbuf *nam; int namelen; int s; register struct socket *so; if (uap->name == 0) goto noname; u.u_error = copyin((caddr_t)uap->anamelen, (caddr_t)&namelen, sizeof (namelen)); if (u.u_error) return; if (useracc((caddr_t)uap->name, (u_int)namelen, B_WRITE) == 0) { u.u_error = EFAULT; return; } noname: fp = getsock(uap->s); if (fp == 0) return; s = splnet(); so = (struct socket *)fp->f_data; if ((so->so_options & SO_ACCEPTCONN) == 0) { u.u_error = EINVAL; splx(s); return; } if ((so->so_state & SS_NBIO) && so->so_qlen == 0) { u.u_error = EWOULDBLOCK; splx(s); return; } while (so->so_qlen == 0 && so->so_error == 0) { if (so->so_state & SS_CANTRCVMORE) { so->so_error = ECONNABORTED; break; } sleep((caddr_t)&so->so_timeo, PZERO+1); } if (so->so_error) { u.u_error = so->so_error; splx(s); return; } if (ufalloc(0) < 0) { splx(s); return; } fp = FALLOC(); if (fp == 0) { u.u_ofile[u.u_rval1] = 0; splx(s); return; } { struct socket *aso = so->so_q; if (soqremque(aso, 1) == 0) panic("accept"); so = aso; } fp->f_type = DTYPE_SOCKET; fp->f_flag = FREAD|FWRITE; fp->f_data = so; nam = m_get(M_WAIT, MT_SONAME); (void) soaccept(so, nam); if (uap->name) { if (namelen > nam->m_len) namelen = nam->m_len; /* SHOULD COPY OUT A CHAIN HERE */ (void) copyout(mtod(nam, caddr_t), (caddr_t)uap->name, (u_int)namelen); (void) copyout((caddr_t)&namelen, (caddr_t)uap->anamelen, sizeof (*uap->anamelen)); } m_freem(nam); splx(s); } connect() { register struct a { int s; caddr_t name; int namelen; } *uap = (struct a *)u.u_ap; register struct file *fp; register struct socket *so; struct mbuf *nam; int s; fp = getsock(uap->s); if (fp == 0) return; so = (struct socket *)fp->f_data; u.u_error = sockargs(&nam, uap->name, uap->namelen); if (u.u_error) return; u.u_error = soconnect(so, nam); if (u.u_error) goto bad; s = splnet(); if ((so->so_state & SS_NBIO) && (so->so_state & SS_ISCONNECTING)) { u.u_error = EINPROGRESS; goto bad2; } if (setjmp(u.u_qsav)) { /* en smx :SETJMP(&u.u_qsave) SOC */ if (u.u_error == 0) u.u_error = EINTR; goto bad2; } while ((so->so_state & SS_ISCONNECTING) && so->so_error == 0) sleep((caddr_t)&so->so_timeo, PZERO+1); u.u_error = so->so_error; so->so_error = 0; bad2: splx(s); bad: m_freem(nam); } socketpair() { register struct a { int domain; int type; int protocol; int *rsv; } *uap = (struct a *)u.u_ap; register struct file *fp1, *fp2; struct socket *so1, *so2; int sv[2]; if (useracc((caddr_t)uap->rsv, 2 * sizeof (int), B_WRITE) == 0) { u.u_error = EFAULT; return; } u.u_error = socreate(uap->domain, &so1, uap->type, uap->protocol); if (u.u_error) return; u.u_error = socreate(uap->domain, &so2, uap->type, uap->protocol); if (u.u_error) goto free; fp1 = FALLOC(); if (fp1 == NULL) goto free2; sv[0] = u.u_rval1; fp1->f_flag = FREAD|FWRITE; fp1->f_type = DTYPE_SOCKET; fp1->f_data = so1; fp2 = FALLOC(); if (fp2 == NULL) goto free3; fp2->f_flag = FREAD|FWRITE; fp2->f_type = DTYPE_SOCKET; fp2->f_data = so2; sv[1] = u.u_rval1; u.u_error = soconnect2(so1, so2); if (u.u_error) goto free4; (void) copyout((caddr_t)sv, (caddr_t)uap->rsv, 2 * sizeof (int)); return; free4: fp2->f_count = 0; u.u_ofile[sv[1]] = 0; free3: fp1->f_count = 0; u.u_ofile[sv[0]] = 0; free2: so2->so_state |= SS_NOFDREF; sofree(so2); free: so1->so_state |= SS_NOFDREF; sofree(so1); } sendto() { register struct a { int s; caddr_t buf; int len; int flags; caddr_t to; int tolen; } *uap = (struct a *)u.u_ap; struct msghdr msg; struct iovec aiov; msg.msg_name = uap->to; msg.msg_namelen = uap->tolen; msg.msg_iov = &aiov; msg.msg_iovlen = 1; aiov.iov_base = uap->buf; aiov.iov_len = uap->len; msg.msg_accrights = 0; msg.msg_accrightslen = 0; sendit(uap->s, &msg, uap->flags & ~MSG_KERNEL); } socksend() { register struct a { int s; caddr_t buf; int len; int flags; } *uap = (struct a *)u.u_ap; struct msghdr msg; struct iovec aiov; msg.msg_name = 0; msg.msg_namelen = 0; msg.msg_iov = &aiov; msg.msg_iovlen = 1; aiov.iov_base = uap->buf; aiov.iov_len = uap->len; msg.msg_accrights = 0; msg.msg_accrightslen = 0; sendit(uap->s, &msg, uap->flags & ~MSG_KERNEL); } sendmsg() { register struct a { int s; caddr_t msg; int flags; } *uap = (struct a *)u.u_ap; struct msghdr msg; struct iovec aiov[MSG_MAXIOVLEN]; u.u_error = copyin(uap->msg, (caddr_t)&msg, sizeof (msg)); if (u.u_error) return; if ((u_int)msg.msg_iovlen >= sizeof (aiov) / sizeof (aiov[0])) { u.u_error = EMSGSIZE; return; } u.u_error = copyin((caddr_t)msg.msg_iov, (caddr_t)aiov, (unsigned)(msg.msg_iovlen * sizeof (aiov[0]))); if (u.u_error) return; msg.msg_iov = aiov; sendit(uap->s, &msg, uap->flags & ~MSG_KERNEL); } sendit(s, mp, flags) int s; register struct msghdr *mp; int flags; { register struct file *fp; struct uio auio; register struct iovec *iov; register int i; struct mbuf *to, *rights; int len; fp = getsock(s); if (fp == 0) { debug(DBsocket,"sorry no struct file\n"); return; } auio.uio_iov = mp->msg_iov; auio.uio_iovcnt = mp->msg_iovlen; auio.uio_segflg = flags & MSG_KERNEL ? 1 : 0; /* type de seg SMRPC */ auio.uio_offset = 0; auio.uio_resid = 0; iov = mp->msg_iov; for (i = 0; i < mp->msg_iovlen; i++) { if (iov->iov_len < 0) { u.u_error = EINVAL; return; } if (iov->iov_len == 0) continue; if (auio.uio_segflg == 0 && /* si seg USER... SMRPC*/ useracc(iov->iov_base, (u_int)iov->iov_len, B_READ) == 0) { u.u_error = EFAULT; return; } auio.uio_resid += iov->iov_len; iov++; } if (mp->msg_name) { u.u_error = sockargs(&to, mp->msg_name, mp->msg_namelen); if (u.u_error) return; } else to = 0; if (mp->msg_accrights) { u.u_error = sockargs(&rights, mp->msg_accrights, mp->msg_accrightslen); if (u.u_error) goto bad; } else rights = 0; len = auio.uio_resid; u.u_error = sosend((struct socket *)fp->f_data, to, &auio, flags, rights); u.u_rval1 = len - auio.uio_resid; if (rights) m_freem(rights); bad: if (to) m_freem(to); } recvfrom() { register struct a { int s; caddr_t buf; int len; int flags; caddr_t from; int *fromlenaddr; } *uap = (struct a *)u.u_ap; struct msghdr msg; struct iovec aiov; int len; u.u_error = copyin((caddr_t)uap->fromlenaddr, (caddr_t)&len, sizeof (len)); if (u.u_error) return; msg.msg_name = uap->from; msg.msg_namelen = len; msg.msg_iov = &aiov; msg.msg_iovlen = 1; aiov.iov_base = uap->buf; aiov.iov_len = uap->len; msg.msg_accrights = 0; msg.msg_accrightslen = 0; recvit(uap->s, &msg, uap->flags & ~MSG_KERNEL, (caddr_t)uap->fromlenaddr, (caddr_t)0); } sockrecv() { register struct a { int s; caddr_t buf; int len; int flags; } *uap = (struct a *)u.u_ap; struct msghdr msg; struct iovec aiov; msg.msg_name = 0; msg.msg_namelen = 0; msg.msg_iov = &aiov; msg.msg_iovlen = 1; aiov.iov_base = uap->buf; aiov.iov_len = uap->len; msg.msg_accrights = 0; msg.msg_accrightslen = 0; recvit(uap->s, &msg, uap->flags & ~MSG_KERNEL, (caddr_t)0, (caddr_t)0); } recvmsg() { register struct a { int s; struct msghdr *msg; int flags; } *uap = (struct a *)u.u_ap; struct msghdr msg; struct iovec aiov[MSG_MAXIOVLEN]; u.u_error = copyin((caddr_t)uap->msg, (caddr_t)&msg, sizeof (msg)); if (u.u_error) return; if ((u_int)msg.msg_iovlen >= sizeof (aiov) / sizeof (aiov[0])) { u.u_error = EMSGSIZE; return; } u.u_error = copyin((caddr_t)msg.msg_iov, (caddr_t)aiov, (unsigned)(msg.msg_iovlen * sizeof (aiov[0]))); if (u.u_error) return; msg.msg_iov = aiov; if (msg.msg_accrights) if (useracc((caddr_t)msg.msg_accrights, (unsigned)msg.msg_accrightslen, B_WRITE) == 0) { u.u_error = EFAULT; return; } recvit(uap->s, &msg, uap->flags & ~MSG_KERNEL, (caddr_t)&uap->msg->msg_namelen, (caddr_t)&uap->msg->msg_accrightslen); } recvit(s, mp, flags, namelenp, rightslenp) int s; register struct msghdr *mp; int flags; caddr_t namelenp, rightslenp; { register struct file *fp; struct uio auio; register struct iovec *iov; register int i; struct mbuf *from, *rights; int len; fp = getsock(s); if (fp == 0) return; auio.uio_iov = mp->msg_iov; auio.uio_iovcnt = mp->msg_iovlen; auio.uio_segflg = flags & MSG_KERNEL ? 1 : 0; /* org. seg SMRPC*/ auio.uio_offset = 0; auio.uio_resid = 0; iov = mp->msg_iov; for (i = 0; i < mp->msg_iovlen; i++) { if (iov->iov_len < 0) { u.u_error = EINVAL; return; } if (iov->iov_len == 0) continue; if (auio.uio_segflg == 0 && /* si seg USER SMRPC*/ useracc(iov->iov_base, (u_int)iov->iov_len, B_WRITE) == 0) { u.u_error = EFAULT; return; } auio.uio_resid += iov->iov_len; iov++; } len = auio.uio_resid; u.u_error = soreceive((struct socket *)fp->f_data, &from, &auio, flags, &rights); u.u_rval1 = len - auio.uio_resid; if (mp->msg_name) { len = mp->msg_namelen; if (len <= 0 || from == 0) len = 0; else { if (len > from->m_len) len = from->m_len; (void) copyout((caddr_t)mtod(from, caddr_t), (caddr_t)mp->msg_name, (unsigned)len); } (void) copyout((caddr_t)&len, namelenp, sizeof (int)); } if (mp->msg_accrights) { len = mp->msg_accrightslen; if (len <= 0 || rights == 0) len = 0; else { if (len > rights->m_len) len = rights->m_len; (void) copyout((caddr_t)mtod(rights, caddr_t), (caddr_t)mp->msg_accrights, (unsigned)len); } (void) copyout((caddr_t)&len, rightslenp, sizeof (int)); } if (rights) { debug(DBsocket,"lib rights\n"); m_freem(rights); } if (from) { debug(DBsocket,"lib from\n"); m_freem(from); } } shutdown() { struct a { int s; int how; } *uap = (struct a *)u.u_ap; struct file *fp; fp = getsock(uap->s); if (fp == 0) return; u.u_error = soshutdown((struct socket *)fp->f_data, uap->how); } setsockopt() { struct a { int s; int level; int name; caddr_t val; int valsize; } *uap = (struct a *)u.u_ap; struct file *fp; struct mbuf *m = NULL; fp = getsock(uap->s); if (fp == 0) return; if (uap->valsize > MLEN) { u.u_error = EINVAL; return; } if (uap->val) { m = m_get(M_WAIT, MT_SOOPTS); if (m == NULL) { u.u_error = ENOBUFS; return; } u.u_error = copyin(uap->val, mtod(m, caddr_t), (u_int)uap->valsize); if (u.u_error) goto bad; m->m_len = uap->valsize; } u.u_error = sosetopt((struct socket *)fp->f_data, uap->level, uap->name, m); bad: if (m != NULL) (void) m_free(m); } getsockopt() { struct a { int s; int level; int name; caddr_t val; int *avalsize; } *uap = (struct a *)u.u_ap; struct file *fp; struct mbuf *m = NULL; int valsize; fp = getsock(uap->s); if (fp == 0) return; if (uap->val) { u.u_error = copyin((caddr_t)uap->avalsize, (caddr_t)&valsize, sizeof (valsize)); if (u.u_error) return; m = m_get(M_WAIT, MT_SOOPTS); if (m == NULL) { u.u_error = ENOBUFS; return; } } u.u_error = sogetopt((struct socket *)fp->f_data, uap->level, uap->name, m); if (u.u_error) goto bad; if (uap->val) { if (valsize > m->m_len) valsize = m->m_len; u.u_error = copyout(mtod(m, caddr_t), uap->val, (u_int)valsize); if (u.u_error) goto bad; u.u_error = copyout((caddr_t)&valsize, (caddr_t)uap->avalsize, sizeof (valsize)); } bad: if (m != NULL) (void) m_free(m); } /* * Get socket name. */ getsockname() { register struct a { int fdes; caddr_t asa; int *alen; } *uap = (struct a *)u.u_ap; register struct file *fp; register struct socket *so; struct mbuf *m; int len; fp = getsock(uap->fdes); if (fp == 0) return; u.u_error = copyin((caddr_t)uap->alen, (caddr_t)&len, sizeof (len)); if (u.u_error) return; so = (struct socket *)fp->f_data; m = m_getclr(M_WAIT, MT_SONAME); if (m == NULL) { u.u_error = ENOBUFS; return; } u.u_error = (*so->so_proto->pr_usrreq)(so, PRU_SOCKADDR, 0, m, 0); if (u.u_error) goto bad; if (len > m->m_len) len = m->m_len; u.u_error = copyout(mtod(m, caddr_t), (caddr_t)uap->asa, (u_int)len); if (u.u_error) goto bad; u.u_error = copyout((caddr_t)&len, (caddr_t)uap->alen, sizeof (len)); bad: m_freem(m); } /* * Get name of peer for connected socket. */ getpeername() { register struct a { int fdes; caddr_t asa; int *alen; } *uap = (struct a *)u.u_ap; register struct file *fp; register struct socket *so; struct mbuf *m; int len; fp = getsock(uap->fdes); if (fp == 0) return; so = (struct socket *)fp->f_data; if ((so->so_state & SS_ISCONNECTED) == 0) { u.u_error = ENOTCONN; return; } m = m_getclr(M_WAIT, MT_SONAME); if (m == NULL) { u.u_error = ENOBUFS; return; } u.u_error = copyin((caddr_t)uap->alen, (caddr_t)&len, sizeof (len)); if (u.u_error) return; u.u_error = (*so->so_proto->pr_usrreq)(so, PRU_PEERADDR, 0, m, 0); if (u.u_error) goto bad; if (len > m->m_len) len = m->m_len; u.u_error = copyout(mtod(m, caddr_t), (caddr_t)uap->asa, (u_int)len); if (u.u_error) goto bad; u.u_error = copyout((caddr_t)&len, (caddr_t)uap->alen, sizeof (len)); bad: m_freem(m); } sockargs(aname, name, namelen) struct mbuf **aname; caddr_t name; int namelen; { register struct mbuf *m; int error; if (namelen > MLEN) return (EINVAL); m = m_get(M_WAIT, MT_SONAME); if (m == NULL) return (ENOBUFS); m->m_len = namelen; debug(DBsocket,"sockargs:copyin from:%x to:%x len:%d\n", name, mtod(m, caddr_t), (u_int)namelen); error = copyin(name, mtod(m, caddr_t), (u_int)namelen); if (error) (void) m_free(m); else *aname = m; return (error); } struct file * getsock(fdes) int fdes; { register struct file *fp; fp = getf(fdes); if (fp == NULL) return (0); if (fp->f_type != DTYPE_SOCKET) { u.u_error = ENOTSOCK; return (0); } return (fp); } #endif /* SOCKET */ E 1 h30884 s 00001/00001/00604 d D 4.7 87/05/20 13:24:07 brian 12 11 c mbuf.h put back on system search path BB e s 00001/00001/00604 d D 4.6 87/05/14 16:08:02 build 11 10 c removed old SCCS strings and inserted #ident BB e s 00001/00001/00604 d D 4.5 87/05/07 18:59:03 van 10 9 c van - move defsocket.h back to /usr/include/sys e s 00007/00007/00598 d D 4.4 87/04/29 16:26:04 van 9 8 c van - moved ucb networking includes to INCUCB e s 00001/00002/00604 d D 4.3 87/04/16 18:40:37 dc 8 7 c dc - Add Bull updates from 03/05/87 e s 00018/00018/00588 d D 4.2 87/04/15 17:46:22 dc 7 6 c dc - changed #include "sys/..." to #include e s 00000/00000/00606 d D 4.1 87/02/20 13:29:52 build 6 5 c rolled rev to -r4 /dc e s 00000/00001/00606 d D 3.2 87/02/13 14:01:19 build 5 4 c add bull changes from Jan 23 /dc e s 00000/00000/00607 d D 3.1 87/01/19 09:22:19 build 4 3 c rolled rev to -r3 /dc e s 00000/00000/00607 d D 2.1 87/01/19 09:22:19 build 3 2 c AUTO NULL DELTA e s 00001/00000/00606 d D 1.2 87/01/16 10:15:40 build 2 1 c add ident string /dc e s 00606/00000/00000 d D 1.1 87/01/09 16:34:45 build 1 0 c Placed under source control - dc e u U f b f n t T I 2 D 8 /* "%W% %E%" */ E 2 I 1 D 5 /* %Z% Bull-Sems SPIX %Q%/%M% %I% %E% */ E 5 E 8 I 8 D 11 /* " %W% %E% " */ E 11 I 11 #ident " %W% %E% " E 11 E 8 #ifdef SOCKET D 7 #include "sys/param.h" #include "sys/types.h" #include "sys/defsocket.h" #include "sys/dir.h" #include "sys/errno.h" #include "sys/inode.h" #include "sys/file.h" #include "sys/mbuf.h" #include "sys/debug.h" E 7 I 7 #include #include D 9 #include E 9 I 9 D 10 #include "sys/defsocket.h" E 10 I 10 #include E 10 E 9 #include #include #include #include D 9 #include E 9 I 9 D 12 #include "sys/mbuf.h" E 12 I 12 #include E 12 E 9 #include E 7 #ifdef DEBUG #define PRUREQUESTS #endif D 7 #include "sys/protosw.h" #include "sys/socket.h" #include "sys/socketvar.h" #include "sys/systm.h" #include "sys/un.h" #include "sys/unpcb.h" #include "sys/signal.h" #include "sys/user.h" #include "sys/var.h" E 7 I 7 D 9 #include #include #include E 9 I 9 #include "sys/protosw.h" #include "sys/socket.h" #include "sys/socketvar.h" E 9 #include D 9 #include #include E 9 I 9 #include "sys/un.h" #include "sys/unpcb.h" E 9 #include #include #include E 7 /* * Unix communications domain. * * TODO: * SEQPACKET, RDM * rethink name space problems * need a proper out-of-band */ struct sockaddr sun_noname = { AF_UNIX }; uipc_usrreq(so, req, m, nam, rights) struct socket *so; int req; struct mbuf *m, *nam, *rights; { struct unpcb *unp = sotounpcb(so); register struct socket *so2; int error = 0; if (req != PRU_SEND && rights && rights->m_len) { error = EOPNOTSUPP; goto release; } if (unp == 0 && req != PRU_ATTACH) { error = EINVAL; goto release; } switch (req) { case PRU_ATTACH: if (unp) { error = EISCONN; break; } error = unp_attach(so); break; case PRU_DETACH: unp_detach(unp); break; case PRU_BIND: error = unp_bind(unp, nam); break; case PRU_LISTEN: debug(DBafunix,"uipc_usrreq(%x,LISTEN)\n",so); if (unp->unp_inode == 0) { error = EINVAL; } break; case PRU_CONNECT: error = unp_connect(so, nam); break; case PRU_CONNECT2: error = unp_connect2(so, (struct mbuf *)0, (struct socket *)nam); break; case PRU_DISCONNECT: unp_disconnect(unp); break; case PRU_ACCEPT: nam->m_len = unp->unp_remaddr->m_len; debug(DBafunix,"uipc_usrreq:accept(%x,%x,%s)\n", unp->unp_remaddr,nam,nam->m_len); bcopy(mtod(unp->unp_remaddr, caddr_t), mtod(nam, caddr_t), (unsigned)nam->m_len); break; case PRU_SHUTDOWN: debug(DBafunix,"uipc_usrreq:shutdown(%x,%x)\n",so, unp); socantsendmore(so); unp_usrclosed(unp); break; case PRU_RCVD: switch (so->so_type) { case SOCK_DGRAM: panic("uipc 1"); /*NOTREACHED*/ case SOCK_STREAM: #define rcv (&so->so_rcv) #define snd (&so2->so_snd) if (unp->unp_conn == 0) break; so2 = unp->unp_conn->unp_socket; debug(DBafunix,"uipc_usrreq:rcvd(%x,%x)\n", unp->unp_conn,so2); /* * Transfer resources back to send port * and wakeup any waiting to write. */ snd->sb_mbmax += rcv->sb_mbmax - rcv->sb_mbcnt; rcv->sb_mbmax = rcv->sb_mbcnt; snd->sb_hiwat += rcv->sb_hiwat - rcv->sb_cc; rcv->sb_hiwat = rcv->sb_cc; sbwakeup(snd); #undef snd #undef rcv break; default: panic("uipc 2"); } break; case PRU_SEND: switch (so->so_type) { case SOCK_DGRAM: debug(DBafunix,"uipc_usrreq:send/dgram(%x,%x)\n", unp,unp->unp_conn); if (nam) { if (unp->unp_conn) { error = EISCONN; break; } error = unp_connect(so, nam); if (error) break; } else { if (unp->unp_conn == 0) { error = ENOTCONN; break; } } so2 = unp->unp_conn->unp_socket; /* BEGIN XXX */ if (rights) { error = unp_internalize(rights); if (error) break; } if (sbspace(&so2->so_rcv) > 0) { /* * There's no record of source socket's * name, so send null name for the moment. */ (void) sbappendaddr(&so2->so_rcv, &sun_noname, m, rights); sbwakeup(&so2->so_rcv); m = 0; } /* END XXX */ if (nam) unp_disconnect(unp); break; case SOCK_STREAM: #define rcv (&so2->so_rcv) #define snd (&so->so_snd) if (rights && rights->m_len) { error = EOPNOTSUPP; break; } if (unp->unp_conn == 0) panic("uipc 3"); so2 = unp->unp_conn->unp_socket; debug(DBafunix,"uipc_usrreq:send/stream(%x,%x,%x)\n", unp,so,so2); /* * Send to paired receive port, and then * give it enough resources to hold what it already has. * Wake up readers. */ sbappend(rcv, m); snd->sb_mbmax -= rcv->sb_mbcnt - rcv->sb_mbmax; rcv->sb_mbmax = rcv->sb_mbcnt; snd->sb_hiwat -= rcv->sb_cc - rcv->sb_hiwat; rcv->sb_hiwat = rcv->sb_cc; sbwakeup(rcv); #undef snd #undef rcv break; default: panic("uipc 4"); } m = 0; break; case PRU_ABORT: unp_drop(unp, ECONNABORTED); break; /* SOME AS YET UNIMPLEMENTED HOOKS */ case PRU_CONTROL: return (EOPNOTSUPP); case PRU_SENSE: error = EOPNOTSUPP; break; /* END UNIMPLEMENTED HOOKS */ case PRU_RCVOOB: break; case PRU_SENDOOB: break; case PRU_SOCKADDR: break; case PRU_PEERADDR: break; case PRU_SLOWTIMO: break; default: panic("piusrreq"); } release: if (m) m_freem(m); return (error); } /* SHOULD BE PIPSIZ and 0 */ int unp_sendspace = 1024*2; int unp_recvspace = 1024*2; unp_attach(so) struct socket *so; { register struct mbuf *m; register struct unpcb *unp; int error; error = soreserve(so, unp_sendspace, unp_recvspace); if (error) return (error); m = m_getclr(M_DONTWAIT, MT_PCB); if (m == NULL) return (ENOBUFS); unp = mtod(m, struct unpcb *); so->so_pcb = (caddr_t)unp; unp->unp_socket = so; return (0); } unp_detach(unp) register struct unpcb *unp; { if (unp->unp_inode) { IRELE(unp->unp_inode); unp->unp_inode = 0; } if (unp->unp_conn) unp_disconnect(unp); while (unp->unp_refs) unp_drop(unp->unp_refs, ECONNRESET); soisdisconnected(unp->unp_socket); unp->unp_socket->so_pcb = 0; m_freem(unp->unp_remaddr); (void) m_free(dtom(unp)); } unp_bind(unp, nam) struct unpcb *unp; struct mbuf *nam; { struct sockaddr_un *soun = mtod(nam, struct sockaddr_un *); register struct inode *ip; extern schar(); int error; u.u_dirp = soun->sun_path; if (nam->m_len == MLEN) return (EINVAL); *(mtod(nam, caddr_t) + nam->m_len) = 0; /* SHOULD BE ABLE TO ADOPT EXISTING AND wakeup() ALA FIFO's */ ip = NAMEI(schar, CREATE, 1); if (ip) { IPUT(ip); return (EADDRINUSE); } if (error = u.u_error) { u.u_error = 0; /* XXX */ return (error); } ip = maknode(IFSOCK | 0777); if (ip == NULL) { error = u.u_error; /* XXX */ u.u_error = 0; /* XXX */ return (error); } ip->i_socket = unp->unp_socket; unp->unp_inode = ip; IUNLOCK(ip); /* but keep reference */ return (0); } unp_connect(so, nam) struct socket *so; struct mbuf *nam; { register struct sockaddr_un *soun = mtod(nam, struct sockaddr_un *); register struct inode *ip; int error; register struct socket *so2; u.u_dirp = soun->sun_path; if (nam->m_len + (nam->m_off - MMINOFF) == MLEN) return (EMSGSIZE); *(mtod(nam, caddr_t) + nam->m_len) = 0; ip = NAMEI(schar, LOOKUP, 1); if (ip == 0) { error = u.u_error; u.u_error = 0; return (error); /* XXX */ } if ((ip->i_mode&IFMT) != IFSOCK) { error = ENOTSOCK; goto bad; } so2 = ip->i_socket; if (so2 == 0) { error = ECONNREFUSED; goto bad; } if (so->so_type != so2->so_type) { error = EPROTOTYPE; goto bad; } if (so->so_proto->pr_flags & PR_CONNREQUIRED && ((so2->so_options&SO_ACCEPTCONN) == 0 || (so2 = sonewconn(so2)) == 0)) { error = ECONNREFUSED; goto bad; } error = unp_connect2(so, nam, so2); bad: IPUT(ip); return (error); } unp_connect2(so, sonam, so2) register struct socket *so; struct mbuf *sonam; register struct socket *so2; { register struct unpcb *unp = sotounpcb(so); register struct unpcb *unp2; if (so2->so_type != so->so_type) return (EPROTOTYPE); unp2 = sotounpcb(so2); unp->unp_conn = unp2; switch (so->so_type) { case SOCK_DGRAM: unp->unp_nextref = unp2->unp_refs; unp2->unp_refs = unp; break; case SOCK_STREAM: unp2->unp_conn = unp; if (sonam) unp2->unp_remaddr = m_copy(sonam, 0, (int)M_COPYALL); soisconnected(so2); soisconnected(so); break; default: panic("unp_connect2"); } return (0); } unp_disconnect(unp) struct unpcb *unp; { register struct unpcb *unp2 = unp->unp_conn; if (unp2 == 0) return; unp->unp_conn = 0; switch (unp->unp_socket->so_type) { case SOCK_DGRAM: if (unp2->unp_refs == unp) unp2->unp_refs = unp->unp_nextref; else { unp2 = unp2->unp_refs; for (;;) { if (unp2 == 0) panic("unp_disconnect"); if (unp2->unp_nextref == unp) break; unp2 = unp2->unp_nextref; } unp2->unp_nextref = unp->unp_nextref; } unp->unp_nextref = 0; break; case SOCK_STREAM: soisdisconnected(unp->unp_socket); unp2->unp_conn = 0; soisdisconnected(unp2->unp_socket); break; } } unp_usrclosed(unp) struct unpcb *unp; { } unp_drop(unp, errno) struct unpcb *unp; int errno; { unp->unp_socket->so_error = errno; unp_disconnect(unp); } unp_externalize(rights) struct mbuf *rights; { int newfds = rights->m_len / sizeof (int); register int i; register struct file **rp = mtod(rights, struct file **); register struct file *fp; int f; if (newfds > ufavail()) { for (i = 0; i < newfds; i++) { fp = *rp; unp_discard(fp); *rp++ = 0; } return (EMSGSIZE); } for (i = 0; i < newfds; i++) { f = ufalloc(0); /* ufalloc identique sysV */ if (f < 0) panic("unp_externalize"); fp = *rp; u.u_ofile[f] = fp; fp->f_msgcount--; *(int *)rp++ = f; } return (0); } unp_internalize(rights) struct mbuf *rights; { register struct file **rp; int oldfds = rights->m_len / sizeof (int); register int i; register struct file *fp; rp = mtod(rights, struct file **); for (i = 0; i < oldfds; i++) if (getf(*(int *)rp++) == 0) return (EBADF); rp = mtod(rights, struct file **); for (i = 0; i < oldfds; i++) { fp = getf(*(int *)rp); *rp++ = fp; fp->f_count++; fp->f_msgcount++; } return (0); } int unp_defer, unp_gcing; int unp_mark(); unp_gc() { register struct file *fp; register struct socket *so; if (unp_gcing) return; unp_gcing = 1; restart: unp_defer = 0; for (fp = file; fp < (struct file *)v.ve_file; fp++) fp->f_flag &= ~(FMARK|FDEFER); do { for (fp = file; fp < (struct file *)v.ve_file; fp++) { if (fp->f_count == 0) continue; if (fp->f_flag & FDEFER) { fp->f_flag &= ~FDEFER; unp_defer--; } else { if (fp->f_flag & FMARK) continue; if (fp->f_count == fp->f_msgcount) continue; fp->f_flag |= FMARK; } if (fp->f_type != DTYPE_SOCKET) continue; so = (struct socket *)fp->f_data; if (so->so_proto->pr_family != AF_UNIX || (so->so_proto->pr_flags&PR_ADDR) == 0) continue; if (so->so_rcv.sb_flags & SB_LOCK) { sbwait(&so->so_rcv); goto restart; } unp_scan(so->so_rcv.sb_mb, unp_mark); } } while (unp_defer); for (fp = file; fp < (struct file *)v.ve_file; fp++) { if (fp->f_count == 0) continue; if (fp->f_count == fp->f_msgcount && (fp->f_flag&FMARK)==0) { if (fp->f_type != DTYPE_SOCKET) panic("unp_gc"); (void) soshutdown((struct socket *)fp->f_data, 0); } } unp_gcing = 0; } unp_scan(m, op) register struct mbuf *m; int (*op)(); { register struct file **rp; register int i; int qfds; while (m) { m = m->m_next; if (m == 0) goto bad; if (m->m_len) { qfds = m->m_len / sizeof (struct file *); rp = mtod(m, struct file **); for (i = 0; i < qfds; i++) (*op)(*rp++); } do { m = m->m_next; if (m == 0) goto bad; } while (m->m_act == 0); m = m->m_next; } return; bad: panic("unp_gcscan"); } unp_mark(fp) struct file *fp; { if (fp->f_flag & FMARK) return; unp_defer++; fp->f_flag |= (FMARK|FDEFER); } unp_discard(fp) struct file *fp; { fp->f_msgcount--; closef(fp); } #endif /* SOCKET */ E 1 h15133 s 00001/00001/00534 d D 4.5 87/05/14 16:08:15 build 10 9 c removed old SCCS strings and inserted #ident BB e s 00003/00001/00532 d D 4.4 87/05/07 14:35:33 dc 9 7 c dc - Add headwall clock interactions e s 00001/00001/00532 d R 4.4 87/05/07 14:32:04 dc 8 7 c dc - Add headwall clock interactions e s 00003/00002/00530 d D 4.3 87/04/16 18:40:54 dc 7 6 c dc - Add Bull updates from 03/05/87 e s 00018/00018/00514 d D 4.2 87/04/15 17:46:35 dc 6 5 c dc - changed #include "sys/..." to #include e s 00000/00000/00532 d D 4.1 87/02/20 13:29:55 build 5 4 c rolled rev to -r4 /dc e s 00000/00000/00532 d D 3.1 87/01/19 09:22:23 build 4 3 c rolled rev to -r3 /dc e s 00000/00000/00532 d D 2.1 87/01/19 09:22:23 build 3 2 c AUTO NULL DELTA e s 00001/00000/00531 d D 1.2 87/01/16 10:15:46 build 2 1 c add ident string /dc e s 00531/00000/00000 d D 1.1 87/01/09 16:34:47 build 1 0 c Placed under source control - dc e u U f b f n t T I 2 D 7 /* "%W% %E%" */ E 7 I 7 D 10 /* " %W% %E% " */ E 10 I 10 #ident " %W% %E% " E 10 E 7 E 2 I 1 D 6 #include "sys/types.h" #include "sys/sysmacros.h" #include "sys/param.h" #include "sys/systm.h" #include "sys/sysinfo.h" #include "sys/mount.h" #include "sys/dir.h" #include "sys/errno.h" #include "sys/signal.h" #include "sys/user.h" #include "sys/inode.h" #include "sys/file.h" #include "sys/ino.h" #include "sys/filsys.h" #include "sys/buf.h" #include "sys/var.h" #include "sys/stat.h" #include "sys/conf.h" E 6 I 6 #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include E 6 /* * inode hashing */ #define NHINO 128 #define ihash(X) (&hinode[(int) (X) & (NHINO-1)]) struct hinode { struct inode *i_forw; struct inode *i_back; } hinode[NHINO]; struct ifreelist { int pad[2]; /* must match struct inode ! */ struct inode *av_forw; struct inode *av_back; } ifreelist; /* * initialize inodes */ inoinit() { register struct inode *ip; register int i; ifreelist.av_forw = ifreelist.av_back = (struct inode *) &ifreelist; for(i = 0; i < NHINO; i++) hinode[i].i_forw=hinode[i].i_back=(struct inode *) &hinode[i]; for(i = 0, ip = inode; i < v.v_inode; i++, ip++) { ip->i_forw = ip->i_back = ip; (ifreelist.av_forw)->av_back = ip; ip->av_forw = ifreelist.av_forw; ifreelist.av_forw = ip; ip->av_back = (struct inode *) &ifreelist; } } /* * Look up an inode by device,inumber. * If it is in core (in the inode structure), honor the locking protocol. * If it is not in core, read it in from the specified device. * If the inode is mounted on, perform the indicated indirection. * In all cases, a pointer to a locked inode structure is returned. * * printf warning: inode table overflow -- if the inode structure is full * panic: no imt -- if the mounted filesystem is not in the mount table. * "cannot happen" */ struct inode * iget(dev, ino) dev_t dev; ino_t ino; { register struct inode *ip; register struct hinode *hip; struct inode *iread(); sysinfo.iget++; loop: hip = ihash(ino); for(ip = hip->i_forw; ip != (struct inode *) hip; ip = ip->i_forw) if(ino == ip->i_number && dev == ip->i_dev) goto found; if((ip = ifreelist.av_forw) == (struct inode *) &ifreelist) { D 7 printf("inode table overflow\n"); E 7 I 7 provfl("inode", "NINODE"); E 7 syserr.inodeovf++; u.u_error = ENFILE; return(NULL); } ip->av_back->av_forw = ip->av_forw; /* remove from free list */ ip->av_forw->av_back = ip->av_back; ip->i_back->i_forw = ip->i_forw; /* remove from old hash list */ ip->i_forw->i_back = ip->i_back; hip->i_forw->i_back = ip; /* insert into new hash list */ ip->i_forw = hip->i_forw; hip->i_forw = ip; ip->i_back = (struct inode *) hip; /* * if a block number list was allocated for this file * (because it is a 413), then free the space now since * we are going to reuse this table slot for a different * inode. see the code in mapreg. */ if (ip->i_map) freeblklst(ip); ip->i_dev = dev; ip->i_number = ino; ip->i_flag = ILOCK; ip->i_count = 1; ip->i_lastr = 0; return(iread(ip)); found: if((ip->i_flag&ILOCK) != 0) { ip->i_flag |= IWANT; sleep((caddr_t)ip, PINOD); goto loop; } if((ip->i_flag&IMOUNT) != 0) { register struct mount *mp; for(mp = &mount[0]; mp < (struct mount *)v.ve_mount; mp++) I 7 if(mp->m_flags == MINUSE) E 7 if(mp->m_inodp == ip) { dev = mp->m_dev; ino = ROOTINO; if(ip = mp->m_mount) goto found; else goto loop; } panic("no imt"); } if(ip->i_count == 0) { /* remove from freelist */ ip->av_back->av_forw = ip->av_forw; ip->av_forw->av_back = ip->av_back; } ip->i_count++; ip->i_flag |= ILOCK; return(ip); } struct inode * iread(ip) register struct inode *ip; { register char *p1, *p2; register struct dinode *dp; struct buf *bp; unsigned i; bp = bread(ip->i_dev, FsITOD(ip->i_dev, ip->i_number)); if (u.u_error) { brelse(bp); iput(ip); return(NULL); } dp = bp->b_un.b_dino; dp += FsITOO(ip->i_dev, ip->i_number); ip->i_mode = dp->di_mode; ip->i_nlink = dp->di_nlink; ip->i_uid = dp->di_uid; ip->i_gid = dp->di_gid; ip->i_size = dp->di_size; p1 = (char *)ip->i_addr; p2 = (char *)dp->di_addr; for(i=0; ii_mode&IFMT) == IFBLK) if (bdevsw[bmajor(ip->i_rdev)].d_bsize != BSIZE) ip->i_rdev |= Fs2BLK; /* to be read in 4k unit */ brelse(bp); return(ip); } /* * Decrement reference count of an inode structure. * On the last reference, write the inode out and if necessary, * truncate and deallocate the file. */ iput(ip) register struct inode *ip; { if(ip->i_count == 1) { ip->i_flag |= ILOCK; if(ip->i_nlink <= 0) { itrunc(ip); ip->i_mode = 0; ip->i_flag |= IUPD|ICHG; ifree(ip->i_dev, ip->i_number); } /* * if a block number list was allocated for this file * then free the space now if the file * has been modified. see mapreg */ if ((ip->i_flag & IUPD) && ip->i_map) freeblklst(ip); if(ip->i_flag&(IACC|IUPD|ICHG)) iupdat(ip, &time, &time); prele(ip); ip->i_flag = 0; ip->i_count = 0; ifreelist.av_back->av_forw = ip; ip->av_forw = (struct inode *) &ifreelist; ip->av_back = ifreelist.av_back; ifreelist.av_back = ip; return; } ip->i_count--; prele(ip); } /* * Update the inode with the current time. */ iupdat(ip, ta, tm) register struct inode *ip; time_t *ta, *tm; { register struct buf *bp; struct dinode *dp; register char *p1; char *p2; unsigned i; if(getfs(ip->i_dev)->s_ronly) { if(ip->i_flag&(IUPD|ICHG)) u.u_error = EROFS; ip->i_flag &= ~(IACC|IUPD|ICHG|ISYN); return; } bp = bread(ip->i_dev, FsITOD(ip->i_dev, ip->i_number)); if (bp->b_flags & B_ERROR) { brelse(bp); return; } dp = bp->b_un.b_dino; dp += FsITOO(ip->i_dev, ip->i_number); dp->di_mode = ip->i_mode; dp->di_nlink = ip->i_nlink; dp->di_uid = ip->i_uid; dp->di_gid = ip->i_gid; dp->di_size = ip->i_size; p1 = (char *)dp->di_addr; p2 = (char *)ip->i_addr; if ((ip->i_mode&IFMT) == IFBLK) ip->i_rdev &= ~Fs2BLK; /* don't change disk inode */ if ((ip->i_mode&IFMT)==IFIFO) { for (i=0; i 2^24\n"); *p1++ = *p2++; *p1++ = *p2++; *p1++ = *p2++; } for (; i 2^24\n"); *p1++ = *p2++; *p1++ = *p2++; *p1++ = *p2++; } if ((ip->i_mode&IFMT) == IFBLK) if (bdevsw[bmajor(ip->i_rdev)].d_bsize != BSIZE) ip->i_rdev |= Fs2BLK; /* to be read in 4k unit */ if(ip->i_flag&IACC) dp->di_atime = *ta; if(ip->i_flag&IUPD) dp->di_mtime = *tm; if(ip->i_flag&ICHG) dp->di_ctime = time; if(ip->i_flag&ISYN) bwrite(bp); else bdwrite(bp); ip->i_flag &= ~(IACC|IUPD|ICHG|ISYN); } /* * Free all the disk blocks associated with the specified inode structure. * The blocks of the file are removed in reverse order. This FILO * algorithm will tend to maintain * a contiguous free list much longer than FIFO. */ itrunc(ip) register struct inode *ip; { register i; dev_t dev; daddr_t bn; i = ip->i_mode & IFMT; if (i!=IFREG && i!=IFDIR) return; dev = ip->i_dev; for(i=NADDR-1; i>=0; i--) { bn = ip->i_addr[i]; if(bn == (daddr_t)0) continue; ip->i_addr[i] = (daddr_t)0; switch(i) { default: free(dev, bn); break; case NADDR-3: tloop(dev, bn, 0, 0); break; case NADDR-2: tloop(dev, bn, 1, 0); break; case NADDR-1: tloop(dev, bn, 1, 1); } } if (ip->i_map) freeblklst(ip); ip->i_size = 0; ip->i_flag |= IUPD|ICHG; } tloop(dev, bn, f1, f2) dev_t dev; daddr_t bn; { register i; register struct buf *bp; register daddr_t *bap; daddr_t nb; bp = NULL; for(i=FsNINDIR(dev)-1; i>=0; i--) { if(bp == NULL) { bp = bread(dev, bn); if (bp->b_flags & B_ERROR) { brelse(bp); return; } bap = bp->b_un.b_daddr; } nb = bap[i]; if(nb == (daddr_t)0) continue; if(f1) { brelse(bp); bp = NULL; tloop(dev, nb, f2, 0); } else free(dev, nb); } if(bp != NULL) brelse(bp); free(dev, bn); } /* * Make a new file. */ struct inode * maknode(mode) register mode; { register struct inode *ip; if((mode&IFMT) == 0) mode |= IFREG; mode &= ~u.u_cmask; ip = ialloc(u.u_pdir->i_dev, mode, 1); if(ip == NULL) { iput(u.u_pdir); return(NULL); } wdir(ip); return(ip); } /* * Write a directory entry with parameters left as side effects * to a call to namei. */ wdir(ip) struct inode *ip; { u.u_dent.d_ino = ip->i_number; u.u_count = sizeof(struct direct); u.u_segflg = 1; u.u_base = (caddr_t)&u.u_dent; u.u_fmode = FWRITE; writei(u.u_pdir); iput(u.u_pdir); } /* * Search inodes for those on dev * Purge any cached inodes. * Returns -1 if an active inode is * found, otherwise 0 */ iflush(dev) register dev_t dev; { register struct inode *ip; register i; for (i = 0, ip = inode; i < v.v_inode; i++, ip++) { if (ip->i_dev == dev) { if(ip->i_count == 0) { /* remove from hash list */ ip->i_back->i_forw = ip->i_forw; ip->i_forw->i_back = ip->i_back; ip->i_forw = ip->i_back = ip; } else return(-1); } } return(0); } I 9 extern int ftHeadwall; E 9 /* * iinit is called once (from main) very early in initialization. * It reads the root's super block and initializes the current date * from the last modified date. * * panic: iinit -- cannot read the super block. * Usually because of an IO error. */ iinit() { register struct buf *cp; register struct filsys *fp; struct inode iinode; (*bdevsw[bmajor(rootdev)].d_open)(minor(rootdev), 1); (*bdevsw[bmajor(pipedev)].d_open)(minor(pipedev), 1); cp = geteblk(); fp = cp->b_un.b_filsys; iinode.i_mode = IFBLK; if (bdevsw[bmajor(rootdev)].d_bsize != BSIZE) iinode.i_rdev = rootdev | Fs2BLK; u.u_offset = SUPERBOFF; u.u_count = sizeof(struct filsys); u.u_base = (caddr_t)fp; u.u_segflg = 1; readi(&iinode); if (u.u_error) panic("iinit - cannot read root superbloc"); mount[0].m_bufp = cp; mount[0].m_flags = MINUSE; mount[0].m_dev = brdev(rootdev); /* if (fp->s_magic != FsMAGIC) fp->s_type = Fs1b; assume old file system if (fp->s_type == Fs8b) */ if ((fp->s_magic != FsMAGIC) && (fp->s_type != Fs8b)) panic("iinit - not a valid root file system"); mount[0].m_dev |= Fs2BLK; rootdev = mount[0].m_dev; if (brdev(pipedev) == brdev(rootdev)) pipedev = rootdev; fp->s_flock = 0; fp->s_ilock = 0; fp->s_ronly = 0; fp->s_ninode = 0; fp->s_inode[0] = 0; D 9 clkset(fp->s_time); E 9 I 9 clkset(ftHeadwall ? HWGetDate() : fp->s_time); E 9 } /* * The basic routine for fstat and stat: * get the inode and pass appropriate parts back. */ stat1(ip, ub) register struct inode *ip; struct stat *ub; { register struct dinode *dp; register struct buf *bp; struct stat ds; if(ip->i_flag&(IACC|IUPD|ICHG)) iupdat(ip, &time, &time); /* * first copy from inode table */ ds.st_dev = brdev(ip->i_dev); ds.st_ino = ip->i_number; ds.st_mode = ip->i_mode; ds.st_nlink = ip->i_nlink; ds.st_uid = ip->i_uid; ds.st_gid = ip->i_gid; ds.st_rdev = (dev_t)ip->i_rdev; if ((ip->i_mode&IFMT) == IFBLK) if (bdevsw[bmajor(ip->i_rdev)].d_bsize != BSIZE) ds.st_rdev &= ~Fs2BLK; /* keep disk inode value */ ds.st_size = ip->i_size; /* * next the dates in the disk */ bp = bread(ip->i_dev, FsITOD(ip->i_dev, ip->i_number)); dp = bp->b_un.b_dino; dp += FsITOO(ip->i_dev, ip->i_number); ds.st_atime = dp->di_atime; ds.st_mtime = dp->di_mtime; ds.st_ctime = dp->di_ctime; brelse(bp); if (copyout((caddr_t)&ds, (caddr_t)ub, sizeof(ds)) < 0) u.u_error = EFAULT; } E 1 h22400 s 00001/00001/00017 d D 4.4 87/05/14 16:08:25 build 8 7 c removed old SCCS strings and inserted #ident BB e s 00002/00002/00016 d D 4.3 87/04/16 18:41:12 dc 7 6 c dc - Add Bull updates from 03/05/87 e s 00002/00002/00016 d D 4.2 87/04/15 17:46:44 dc 6 5 c dc - changed #include "sys/..." to #include e s 00000/00000/00018 d D 4.1 87/02/20 13:29:59 build 5 4 c rolled rev to -r4 /dc e s 00000/00000/00018 d D 3.1 87/01/19 09:22:27 build 4 3 c rolled rev to -r3 /dc e s 00000/00000/00018 d D 2.1 87/01/19 09:22:27 build 3 2 c AUTO NULL DELTA e s 00001/00000/00017 d D 1.2 87/01/16 10:15:52 build 2 1 c add ident string /dc e s 00017/00000/00000 d D 1.1 87/01/09 16:34:48 build 1 0 c Placed under source control - dc e u U f b f n t T I 2 D 7 /* "%W% %E%" */ E 7 I 7 D 8 /* " %W% %E% " */ E 8 I 8 #ident " %W% %E% " E 8 E 7 E 2 I 1 D 6 #include "sys/conf.h" #include "sys/iomachdep.h" E 6 I 6 #include #include E 6 ext_intr(ioir) register ioir ; { int y, type, pdev; y = devadr(ioir); type = conf_devs[y].conf_type; pdev = conf_devs[y].conf_pdev; if (confsw[type].c_intr) (*confsw[type].c_intr)(pdev,ioir); else D 7 printf("spurious interrupt : device = %x\n",ioir); E 7 I 7 printf("spurious interrupt : IOIR = %x\n",ioir); E 7 } E 1 h06172 s 00001/00001/00129 d D 4.4 87/05/14 16:08:35 build 9 8 c removed old SCCS strings and inserted #ident BB e s 00004/00001/00126 d D 4.3 87/04/16 18:41:31 dc 8 7 c dc - Add Bull updates from 03/05/87 e s 00011/00011/00116 d D 4.2 87/04/15 17:46:50 dc 7 6 c dc - changed #include "sys/..." to #include e s 00000/00000/00127 d D 4.1 87/02/20 13:30:02 build 6 5 c rolled rev to -r4 /dc e s 00000/00004/00127 d D 3.2 87/01/26 13:27:34 build 5 4 c add page table changes /dc e s 00000/00000/00131 d D 3.1 87/01/19 09:22:29 build 4 3 c rolled rev to -r3 /dc e s 00000/00000/00131 d D 2.1 87/01/19 09:22:29 build 3 2 c AUTO NULL DELTA e s 00001/00000/00130 d D 1.2 87/01/16 10:15:56 build 2 1 c add ident string /dc e s 00130/00000/00000 d D 1.1 87/01/09 16:34:49 build 1 0 c Placed under source control - dc e u U f b f n t T I 2 D 8 /* "%W% %E%" */ E 8 I 8 D 9 /* " %W% %E% " */ E 9 I 9 #ident " %W% %E% " E 9 E 8 E 2 I 1 D 5 /* @(#)ipc.c 6.2 */ E 5 D 7 #include "sys/errno.h" #include "sys/types.h" #include "sys/param.h" #include "sys/seg.h" #include "sys/signal.h" #include "sys/page.h" #include "sys/region.h" #include "sys/proc.h" #include "sys/dir.h" D 5 #ifdef u3b #include "sys/istk.h" #endif E 5 #include "sys/user.h" #include "sys/ipc.h" E 7 I 7 #include #include #include #include #include #include #include #include #include I 8 #ifdef u3b #include #endif E 8 #include #include E 7 /* ** Common IPC routines. */ /* ** Check message, semaphore, or shared memory access permissions. ** ** This routine verifies the requested access permission for the current ** process. Super-user is always given permission. Otherwise, the ** appropriate bits are checked corresponding to owner, group, or ** everyone. Zero is returned on success. On failure, u.u_error is ** set to EACCES and one is returned. ** The arguments must be set up as follows: ** p - Pointer to permission structure to verify ** mode - Desired access permissions */ ipcaccess(p, mode) register struct ipc_perm *p; register ushort mode; { if(u.u_uid == 0) return(0); if(u.u_uid != p->uid && u.u_uid != p->cuid) { mode >>= 3; if(u.u_gid != p->gid && u.u_gid != p->cgid) mode >>= 3; } if(mode & p->mode) return(0); u.u_error = EACCES; return(1); } /* ** Get message, semaphore, or shared memory structure. ** ** This routine searches for a matching key based on the given flags ** and returns a pointer to the appropriate entry. A structure is ** allocated if the key doesn't exist and the flags call for it. ** The arguments must be set up as follows: ** key - Key to be used ** flag - Creation flags and access modes ** base - Base address of appropriate facility structure array ** cnt - # of entries in facility structure array ** size - sizeof(facility structure) ** status - Pointer to status word: set on successful completion ** only: 0 => existing entry found ** 1 => new entry created ** Ipcget returns NULL with u.u_error set to an appropriate value if ** it fails, or a pointer to the initialized entry if it succeeds. */ struct ipc_perm * ipcget(key, flag, base, cnt, size, status) register struct ipc_perm *base; int cnt, flag, size, *status; key_t key; { register struct ipc_perm *a; /* ptr to available entry */ register int i; /* loop control */ if(key == IPC_PRIVATE) { for(i = 0;i++ < cnt; base = (struct ipc_perm *)(((char *)base) + size)) { if(base->mode & IPC_ALLOC) continue; goto init; } u.u_error = ENOSPC; return(NULL); } else { for(i = 0, a = NULL;i++ < cnt; base = (struct ipc_perm *)(((char *)base) + size)) { if(base->mode & IPC_ALLOC) { if(base->key == key) { if((flag & (IPC_CREAT | IPC_EXCL)) == (IPC_CREAT | IPC_EXCL)) { u.u_error = EEXIST; return(NULL); } if((flag & 0777) & ~base->mode) { u.u_error = EACCES; return(NULL); } *status = 0; return(base); } continue; } if(a == NULL) a = base; } if(!(flag & IPC_CREAT)) { u.u_error = ENOENT; return(NULL); } if(a == NULL) { u.u_error = ENOSPC; return(NULL); } base = a; } init: *status = 1; base->mode = IPC_ALLOC | (flag & 0777); base->key = key; base->cuid = base->uid = u.u_uid; base->cgid = base->gid = u.u_gid; return(base); } E 1 h64594 s 00001/00001/00129 d D 4.3 87/05/14 16:08:44 build 7 6 c removed old SCCS strings and inserted #ident BB e s 00001/00002/00129 d D 4.2 87/04/16 18:41:41 dc 6 5 c dc - Add Bull updates from 03/05/87 e s 00000/00000/00131 d D 4.1 87/02/20 13:30:05 build 5 4 c rolled rev to -r4 /dc e s 00000/00000/00131 d D 3.1 87/01/19 09:22:32 build 4 3 c rolled rev to -r3 /dc e s 00000/00000/00131 d D 2.1 87/01/19 09:22:32 build 3 2 c AUTO NULL DELTA e s 00001/00000/00130 d D 1.2 87/01/16 10:16:00 build 2 1 c add ident string /dc e s 00130/00000/00000 d D 1.1 87/01/09 16:34:51 build 1 0 c Placed under source control - dc e u U f b f n t T I 2 D 6 /* "%W% %E%" */ E 2 I 1 /* @(#)lock.c 6.3 */ E 6 I 6 D 7 /* " %W% %E% " */ E 7 I 7 #ident " %W% %E% " E 7 E 6 #include #include #include #include #include #include #include #include #include #include lock() { struct a { long oper; }; if (!suser()) return; switch(((struct a *)u.u_ap)->oper) { case TXTLOCK: if ((u.u_lock&(PROCLOCK|TXTLOCK)) || textlock() == 0) goto bad; break; case PROCLOCK: if ((u.u_lock&(PROCLOCK|TXTLOCK|DATLOCK)) || datalock() == 0 || proclock() == 0 ) goto bad; (void) textlock(); break; case DATLOCK: if ((u.u_lock&(PROCLOCK|DATLOCK)) || datalock() == 0) goto bad; break; case UNLOCK: if (punlock() == 0) goto bad; break; default: bad: u.u_error = EINVAL; } } textlock() { register preg_t *prp; register reg_t *rp; prp = findpreg(u.u_procp, PT_TEXT); if(prp == NULL) return(0); rp = prp->p_reg; rp->r_flags |= RG_NOSWAP; u.u_lock |= TXTLOCK; return(1); } tunlock() { register preg_t *prp; register reg_t *rp; prp = findpreg(u.u_procp, PT_TEXT); if(prp == NULL) return(0); rp = prp->p_reg; rp->r_flags &= ~RG_NOSWAP; u.u_lock &= ~TXTLOCK; return(1); } datalock() { register preg_t *prp; register reg_t *rp; prp = findpreg(u.u_procp, PT_DATA); if(prp == NULL) return(0); rp = prp->p_reg; rp->r_flags |= RG_NOSWAP; prp = findpreg(u.u_procp, PT_STACK); if(prp == NULL) return(0); rp = prp->p_reg; rp->r_flags |= RG_NOSWAP; u.u_lock |= DATLOCK; return(1); } dunlock() { register preg_t *prp; register reg_t *rp; prp = findpreg(u.u_procp, PT_DATA); if(prp == NULL) return(0); rp = prp->p_reg; rp->r_flags &= ~RG_NOSWAP; u.u_lock &= ~DATLOCK; return(1); } proclock() { u.u_procp->p_flag |= SSYS; u.u_lock |= PROCLOCK; return(1); } punlock() { if ((u.u_lock&(PROCLOCK|TXTLOCK|DATLOCK)) == 0) return(0); u.u_procp->p_flag &= ~SSYS; u.u_lock &= ~PROCLOCK; tunlock(); dunlock(); return(1); } E 1 h17158 s 00001/00001/00251 d D 4.7 87/05/14 16:08:55 build 15 14 c removed old SCCS strings and inserted #ident BB e s 00009/00011/00243 d D 4.6 87/05/08 08:23:27 dc 14 11 c dc - Clear low memory e s 00009/00011/00243 d R 4.6 87/05/08 07:00:02 dc 13 11 c dc - clear low memory e s 00009/00011/00243 d R 4.6 87/05/07 17:42:07 dc 12 11 c dc - bzero pages 0-3b. bzero edata to end of mem e s 00011/00000/00243 d D 4.5 87/04/23 19:52:00 dc 11 10 c dc -- Add HeadwallDiag, which passes SYSVA to _HeadwallDiag (ml/misc) e s 00019/00021/00224 d D 4.4 87/04/16 18:43:57 dc 10 9 c dc - Add Bull updates from 03/05/87 e s 00021/00021/00224 d D 4.3 87/04/15 17:47:01 dc 9 8 c dc - changed #include "sys/..." to #include e s 00000/00002/00245 d D 4.2 87/03/15 19:53:01 dc 8 7 c remove memory size printout e s 00000/00000/00247 d D 4.1 87/02/20 13:30:08 build 7 6 c rolled rev to -r4 /dc e s 00029/00080/00218 d D 3.2 87/01/26 13:29:36 build 6 5 c add page table changes /dc e s 00000/00000/00298 d D 3.1 87/01/19 09:22:35 build 5 4 c rolled rev to -r3 /dc e s 00000/00000/00298 d D 2.1 87/01/19 09:22:35 build 4 3 c AUTO NULL DELTA e s 00001/00000/00297 d D 1.3 87/01/16 10:16:04 build 3 2 c add ident string /dc e s 00006/00027/00291 d D 1.2 87/01/12 11:49:24 build 2 1 c change to new memory scanner e s 00318/00000/00000 d D 1.1 87/01/09 16:34:52 build 1 0 c Placed under source control - dc e u U f b f n t T I 3 D 10 /* "%W% %E%" */ E 10 I 10 D 15 /* " %W% %E% " */ E 15 I 15 #ident " %W% %E% " E 15 E 10 E 3 I 1 D 9 #include "sys/param.h" #include "sys/types.h" #include "sys/sysmacros.h" #include "sys/systm.h" #include "sys/dir.h" #include "sys/signal.h" #include "sys/user.h" #include "sys/errno.h" #include "sys/page.h" #include "sys/region.h" #include "sys/proc.h" #include "sys/seg.h" #include "sys/map.h" #include "sys/reg.h" #include "sys/psl.h" #include "sys/utsname.h" #include "sys/clock.h" #include "sys/ipc.h" #include "sys/shm.h" #include "sys/acct.h" #include "sys/file.h" E 9 I 9 #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include E 9 extern int maxumem; extern int end,edata ; I 6 extern int ftPageTables; E 6 /* * Start clock */ clkstart() { ccb.timer1_count = TIMER_PERIOD ; } clkset(oldtime) time_t oldtime; { time = oldtime; } /* * Send an interrupt to process */ sendsig(hdlr, signo, arg) { register *usp, *regs ; int xx = 20; int p1, p2; regs = u.u_ar0; usp = (int *)regs[SP]; p1 = (int)usp; p2 = (int)usp; grow((unsigned)(usp-xx)) ; /* simulate an interrupt on the user's stack */ p1 >>= 12; p2 -= (xx*4); p2 >>= 12; if (p1 != p2) { p1 <<= 12; usp = (int *)p1; } suword((int)--usp, regs[SP]); suword((int)--usp, regs[PC]); /* with two parameters */ suword((int)--usp, hdlr); suword((int)--usp, signo); usp -= (xx - 4); regs[SP] = (int)usp; regs[PC] =(int)u.u_sigcode; } #ifdef SOCKET /* * bcmp : bytes string compare */ bcmp(s1, s2, len) register char *s1, *s2; register int len; { while (len--) if (*s1++ != *s2++) return (1); return (0); } #endif /* SOCKET */ /* * Clear registers on exec D 6 */ E 6 I 6 D 10 */ E 10 I 10 */ E 10 E 6 setregs() { register int *rp; register i; u.u_ar0[PC] = u.u_exdata.ux_entloc; D 6 u.u_pcb.text_seg = u.u_procp->p_txtsegno ; E 6 for (i=0; i> BPPSHIFT ; lastaddr = (int *)ptob(physmem) ; E 2 I 2 D 8 printf ("numpages = %x\n",numpages); E 8 I 6 if (! (ftPageTables)) { printf ("NO PAGE TABLE SUPPORT ON THIS MACHINE\n"); printf ("looping..."); while (1) ; /* loop forever */ } E 6 lastaddr = (int *)ptob(numpages) ; E 2 D 14 /* clear memory above edata */ D 6 p = (int *)&edata ; E 6 I 6 p = (int *)((int)&edata - SYSVA) ; E 6 x = ((int)p + 0xfffff) & ~0xfffff ; E 14 I 14 /* * Clear FIRSTFREE_PAGES of memory */ bzero(0,ptob(FIRSTFREE_PAGES)) ; E 14 D 14 /* clear memory up to a 1MB boundary */ while (p < (int *)x) *p++ = 0 ; E 14 I 14 /* * Clear memory above edata */ p = (char *)((int)&edata - SYSVA) ; bzero(p, lastaddr - p) ; E 14 D 14 /* now clear the rest of memory a bank of 1MB at a time */ while (p < lastaddr) for (x = 0 ; x < 0x40000 ; x++) *p++ = 0 ; E 14 return(lastaddr) ; } D 6 /* * Initialisation of ccb by the kernel debugger in DEBUG mode * nothing to do if not DEBUG mode */ init_ccb() { #ifdef OSDEBUG kdb_init() ; #endif } /* * Move unix from 0x40000 where the boot has load it to zero */ extern int start() ; extern int start1() ; auto_move(src) register src; { register nb_page,x ; register dest,entry,entry1 ; nb_page = btop(&edata) ; dest = 0 ; for (x = 0 ; x < nb_page ; x++) { copy_page(src,dest) ; src += NBPP ; dest += NBPP ; } entry = (int)start1 ; entry1 = (int)start ; entry -= entry1 ; start_unix(entry) ; } copy_page(src,dest) register int *src,*dest ; { register x ; for (x = 0 ; x < NBPP/sizeof(int) ; x++) *dest++ = *src++ ; } start_unix(func) int (*func)() ; { (*func)() ; } E 6 chksize(text, data, stack) { register n; n = text + data + stack; if (n > maxumem) { u.u_error = ENOMEM; return(-1); } return(0); } /* * dump out the core of a process D 6 */ E 6 I 6 D 10 */ E 10 I 10 */ E 10 E 6 coredump(ip, n) register struct inode *ip; { register preg_t *t_prp, *d_prp, *s_prp; register reg_t *rp; register struct proc *pp; D 6 /* Put the region sizes into the u-block for the * dump. */ E 6 I 6 D 10 /* * Put the region sizes into the u-block for the * dump. */ E 10 I 10 /* Put the region sizes into the u-block for the * dump. */ E 10 E 6 pp = u.u_procp; if(t_prp = findpreg(pp, PT_TEXT)) u.u_tsize = t_prp->p_reg->r_pgsz; else u.u_tsize = 0; if(d_prp = findpreg(pp, PT_DATA)) u.u_dsize = d_prp->p_reg->r_pgsz; else u.u_dsize = 0; if(s_prp = findpreg(pp, PT_STACK)) u.u_ssize = s_prp->p_reg->r_pgsz; else u.u_ssize = 0; D 6 /* Check the sizes against the current ulimit and * don't write a file bigger than ulimit. Try to * write the stack if the data + stack is too big. * If that fails, at least they've got the registers. */ E 6 I 6 D 10 /* * Check the sizes against the current ulimit and * don't write a file bigger than ulimit. Try to * write the stack if the data + stack is too big. * If that fails, at least they've got the registers. */ E 10 I 10 /* Check the sizes against the current ulimit and * don't write a file bigger than ulimit. Try to * write the stack if the data + stack is too big. * If that fails, at least they've got the registers. */ E 10 E 6 if (USIZE + u.u_dsize + u.u_ssize > dtop(u.u_limit)) { u.u_dsize = 0; if (USIZE + u.u_ssize > dtop(u.u_limit)) u.u_ssize = 0; } /* D 6 * Write the u-block to the dump file. */ E 6 I 6 D 10 * Write the u-block to the dump file. */ E 10 I 10 * Write the u-block to the dump file. */ E 10 E 6 itrunc(ip); u.u_offset = 0; u.u_base = (caddr_t)&u; u.u_count = ptob(USIZE); u.u_segflg = 1; u.u_fmode = FWRITE; writei(ip); /* D 6 * Write the data to the dump file. */ E 6 I 6 D 10 * Write the data to the dump file. */ E 10 I 10 * Write the data to the dump file. */ E 10 E 6 u.u_segflg = 0; if (u.u_dsize) { rp = d_prp->p_reg; u.u_base = (caddr_t)(d_prp->p_regva + ptob(rp->r_pgoff)); u.u_count = ptob(u.u_dsize); writei(ip); } /* D 6 * Write out the stack: */ E 6 I 6 D 10 * Write out the stack: */ E 10 I 10 * Write out the stack: */ E 10 E 6 if (u.u_ssize) { rp = s_prp->p_reg; u.u_base = (caddr_t)(USRSTACK - ptob(rp->r_pgsz)); u.u_count = ptob(u.u_ssize); writei(ip); } } I 11 /* * HeadwallDiag - returns 1 iff on a headwall processor, and in * diagnostic mode. */ int HeadwallDiag() { return (_HeadwallDiag(SYSVA)); } E 11 E 1 h59027 s 00001/00001/00211 d D 4.4 87/05/14 16:09:06 build 10 9 c removed old SCCS strings and inserted #ident BB e s 00012/00012/00200 d D 4.3 87/04/16 18:45:52 dc 9 8 c dc - Add Bull updates from 03/05/87 e s 00020/00020/00192 d D 4.2 87/04/15 17:47:09 dc 8 7 c dc - changed #include "sys/..." to #include e s 00000/00000/00212 d D 4.1 87/02/20 13:30:11 build 7 6 c rolled rev to -r4 /dc e s 00001/00001/00211 d D 3.3 87/01/28 16:20:20 build 6 5 c change traps word to exclude int ovf, div 0, etc e s 00048/00023/00164 d D 3.2 87/01/26 13:31:39 build 5 4 c add page table changes /dc e s 00000/00000/00187 d D 3.1 87/01/19 09:22:38 build 4 3 c rolled rev to -r3 /dc e s 00000/00000/00187 d D 2.1 87/01/19 09:22:38 build 3 2 c AUTO NULL DELTA e s 00001/00000/00186 d D 1.2 87/01/16 10:16:09 build 2 1 c add ident string /dc e s 00186/00000/00000 d D 1.1 87/01/09 16:34:53 build 1 0 c Placed under source control - dc e u U f b f n t T I 2 D 9 /* "%W% %E%" */ E 9 I 9 D 10 /* " %W% %E% " */ E 10 I 10 #ident " %W% %E% " E 10 E 9 E 2 I 1 D 8 #include "sys/types.h" #include "sys/param.h" #include "sys/sysmacros.h" #include "sys/systm.h" #include "sys/dir.h" #include "sys/signal.h" #include "sys/user.h" #include "sys/filsys.h" #include "sys/mount.h" #include "sys/page.h" #include "sys/inode.h" #include "sys/region.h" #include "sys/proc.h" #include "sys/conf.h" #include "sys/buf.h" #include "sys/var.h" #include "sys/ipc.h" #include "sys/seg.h" #include "sys/reg.h" #include "sys/debug.h" E 8 I 8 #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include E 8 struct inode *rootdir ; int maxmem, physmem ; int maxumem, maxupts ; D 5 extern ushort sys_segno ; E 5 I 5 struct user *uservad ; pte_t *userpte ; E 5 I 5 caddr_t mmvad ; pte_t *mmpte ; extern int firstfree, physmem ; extern int pall() ; extern int pgtalloc() ; extern int (*allocator)() ; extern int (*pgtallocator)() ; extern int ksv_sz ; E 5 extern sched() ; /* * Initialization code. * Called from cold start routine as soon as a stack and segmentation * have been established. * Proc 0 has been partially setup to accomplish above. * * Functions: * machine dependent device initialization * set process 0 proc[0].p_ and u.u_ values * call all initialization routines * fork - process 0 to schedule * - process 1 execute bootstrap * - process 2 execute pageout (vhand) * * proc 0 returns to caller (start) sched address and loops forever * proc 1 returns to caller (start) its start address * proc 2 returns to caller (start) its start address D 5 */ E 5 I 5 D 9 */ E 9 I 9 */ E 9 E 5 main() { register int (**initptr)() ; extern int (*init_tbl[])() ; extern icode[], szicode ; register int i ; register struct proc *p ; D 5 startup() ; E 5 I 5 /* * Initialize system page table map */ E 5 I 5 meminit(firstfree, physmem) ; allocator = pall ; pgtallocator = pgtalloc ; kbase = (caddr_t)(ptob(ksv_sz) + SYSVA) ; E 5 /* I 5 * Virtual address space for accessing ublok */ uservad = (struct user *)sptalloc(btop(sizeof u), 0, -1) ; userpte = svtopte(uservad) ; /* * Virtual address space for memory driver */ mmvad = (caddr_t)sptalloc(1, 0, -1) ; mmpte = svtopte(mmvad) ; /* E 5 * set up system process D 5 */ E 5 I 5 D 9 */ E 9 I 9 */ E 9 E 5 curproc = &proc[0] ; proc[0].p_stat = SRUN ; proc[0].p_flag |= SLOAD|SSYS ; proc[0].p_nice = NZERO ; u.u_cmask = CMASK ; u.u_limit = CDLIMIT ; u.u_rdir = NULL ; /* D 5 * initialize system tables and resources */ E 5 I 5 D 9 * Initialize system tables and resources */ E 9 I 9 * initialize system tables and resources */ E 9 E 5 for (initptr= &init_tbl[0] ; *initptr ; initptr++) (**initptr)() ; msginit() ; seminit() ; I 5 startup() ; E 5 /* D 5 * get root inode for proc 0 and others */ E 5 I 5 D 9 * Get root inode for proc 0 and others */ E 9 I 9 * get root inode for proc 0 and others */ E 9 E 5 rootdir = iget(rootdev, ROOTINO) ; rootdir->i_flag &= ~ILOCK ; u.u_cdir = iget(rootdev, ROOTINO) ; u.u_cdir->i_flag &= ~ILOCK ; u.u_start = time ; /* * Load exchange modules * and call drivers init */ meload() ; devinit() ; /* * create initial processes * start scheduling task D 5 */ E 5 I 5 D 9 */ E 9 I 9 */ E 9 E 5 if (newproc(0)) { register preg_t *prp ; register reg_t *rp ; /* * Attach a stack region for etc/init D 5 */ E 5 I 5 D 9 */ E 9 I 9 */ E 9 E 5 rp = allocreg(NULL,RT_PRIVATE) ; prp = attachreg(rp,&u,USRSTACK,PT_STACK,SEG_RW) ; if (growreg(&u,prp,SSIZE,0,DBD_DZERO) < 0) panic("etc/init growreg") ; regrele(rp) ; rp = allocreg(NULL, RT_PRIVATE) ; prp = attachreg(rp, &u, 0, PT_DATA, SEG_RW) ; growreg(&u, prp, btop(szicode), btop(szicode), DBD_DZERO) ; regrele(rp) ; copyout((caddr_t)icode, (caddr_t)0, szicode) ; p = u.u_procp ; D 5 p->p_txtsegno = p->p_dsegno ; u.u_pcb.text_seg = p->p_txtsegno ; u.u_pcb.data_seg = p->p_dsegno ; E 5 u.u_pcb.pc = 0 ; D 5 u.u_pcb.traps_word = 0xc0007880 ; /* user mode */ E 5 I 5 D 6 u.u_pcb.traps_word = 0xc0007800 ; /* user mode */ E 6 I 6 D 9 u.u_pcb.traps_word = 0xc0000000 ; /* user mode */ E 9 I 9 u.u_pcb.traps_word = USR_DEFAULT_TRPSW ; /* user mode */ E 9 E 6 E 5 u.u_pcb.regs[SP] = USRSTACK ; return(0) ; } if (newproc(0)) { extern vhand() ; maxmem -= (u.u_ssize + 1) ; p = u.u_procp ; p->p_flag |= SLOAD|SSYS ; p->p_pid = 0 ; D 5 p->p_txtsegno = sys_segno ; p->p_dsegno = sys_segno ; E 5 bcopy("vhand",u.u_psargs,6) ; bcopy("vhand",u.u_comm,5) ; /* D 5 * Init vhand user pcb E 5 I 5 * Allocate a user stack for vhand * init his user pcb E 5 */ D 9 u.u_pcb.regs[SP] = KERNSTACK - 72 ; E 9 I 9 u.u_pcb.regs[SP] = KERNSTACK - 72; E 9 u.u_pcb.pc = (char *)vhand ; D 5 u.u_pcb.text_seg = sys_segno ; u.u_pcb.data_seg = sys_segno ; E 5 return((int)vhand) ; } if (newproc(0)) { extern bdflush() ; maxmem -= (u.u_ssize + 1) ; p = u.u_procp ; p->p_flag |= SLOAD|SSYS ; p->p_pid = 0 ; D 5 p->p_txtsegno = sys_segno ; p->p_dsegno = sys_segno ; E 5 bcopy("bdflush",u.u_psargs,8) ; bcopy("bdflush",u.u_comm,7) ; /* * Allocate a user stack for bdflush * init his user pcb */ D 9 u.u_pcb.regs[SP] = KERNSTACK - 72 ; E 9 I 9 u.u_pcb.regs[SP] = KERNSTACK - 72; E 9 u.u_pcb.pc = (char *)bdflush ; D 5 u.u_pcb.text_seg = sys_segno ; u.u_pcb.data_seg = sys_segno ; E 5 return((int)bdflush) ; } bcopy("sched",u.u_psargs,6) ; bcopy("sched",u.u_comm,5) ; return((int)sched) ; } E 1 h39077 s 00001/00001/00129 d D 4.4 87/05/14 16:09:16 build 8 7 c removed old SCCS strings and inserted #ident BB e s 00001/00002/00129 d D 4.3 87/04/16 18:46:13 dc 7 6 c dc - Add Bull updates from 03/05/87 e s 00006/00006/00125 d D 4.2 87/04/15 17:47:16 dc 6 5 c dc - changed #include "sys/..." to #include e s 00000/00000/00131 d D 4.1 87/02/20 13:30:14 build 5 4 c rolled rev to -r4 /dc e s 00000/00000/00131 d D 3.1 87/01/19 09:22:40 build 4 3 c rolled rev to -r3 /dc e s 00000/00000/00131 d D 2.1 87/01/19 09:22:40 build 3 2 c AUTO NULL DELTA e s 00001/00000/00130 d D 1.2 87/01/16 10:16:14 build 2 1 c add ident string /dc e s 00130/00000/00000 d D 1.1 87/01/09 16:34:54 build 1 0 c Placed under source control - dc e u U f b f n t T I 2 D 7 /* "%W% %E%" */ E 2 I 1 /* @(#)malloc.c 6.3 */ E 7 I 7 D 8 /* " %W% %E% " */ E 8 I 8 #ident " %W% %E% " E 8 E 7 D 6 #include "sys/param.h" #include "sys/types.h" #include "sys/systm.h" #include "sys/map.h" #include "sys/page.h" #include "sys/mem.h" E 6 I 6 #include #include #include #include #include #include E 6 /* Masktab was formerly in mem.h; * It was moved to prevent multiple def'n errors. * (Previously only malloc.c #included mem.h) */ int masktab[] = { 0x1, 0x2, 0x4, 0x8, 0x10, 0x20, 0x40, 0x80, 0x100, 0x200, 0x400, 0x800, 0x1000, 0x2000, 0x4000, 0x8000, 0x10000, 0x20000, 0x40000, 0x80000, 0x100000, 0x200000, 0x400000, 0x800000, 0x1000000, 0x2000000, 0x4000000, 0x8000000, 0x10000000, 0x20000000, 0x40000000, 0x80000000, }; /* * Allocate 'size' units from the given map. * Return the base of the allocated space. * In a map, the addresses are increasing and the * list is terminated by a 0 size. * The swap map unit is 512 bytes. * Algorithm is first-fit. */ unsigned int malloc(mp, size) struct map *mp; { register unsigned int a; register struct map *bp; for (bp = mapstart(mp); bp->m_size; bp++) { if (bp->m_size >= size) { a = bp->m_addr; bp->m_addr += size; if ((bp->m_size -= size) == 0) { do { bp++; (bp-1)->m_addr = bp->m_addr; } while ((bp-1)->m_size = bp->m_size); mapsize(mp)++; } return(a); } } return(0); } /* * Free the previously allocated space aa * of size units into the specified map. * Sort aa into map and combine on * one or both ends if possible. */ mfree(mp, size, a) struct map *mp; register unsigned int a; { register struct map *bp; register unsigned int t; bp = mapstart(mp); for (; bp->m_addr<=a && bp->m_size!=0; bp++); if (bp>mapstart(mp) && (bp-1)->m_addr+(bp-1)->m_size == a) { (bp-1)->m_size += size; if (a+size == bp->m_addr) { (bp-1)->m_size += bp->m_size; while (bp->m_size) { bp++; (bp-1)->m_addr = bp->m_addr; (bp-1)->m_size = bp->m_size; } mapsize(mp)++; } } else { if (a+size == bp->m_addr && bp->m_size) { bp->m_addr -= size; bp->m_size += size; } else if (size) { if (mapsize(mp) == 0) { printf("\nDANGER: mfree map overflow %x\n", mp); printf(" lost %d items at %d\n", size, a); return; } do { t = bp->m_addr; bp->m_addr = a; a = t; t = bp->m_size; bp->m_size = size; bp++; } while (size = t); mapsize(mp)--; } } if (mapwant(mp)) { mapwant(mp) = 0; wakeup((caddr_t)mp); } } E 1 2  ~ } | { z y x w v u t s r q p o n m l k j i h g f e d c b a ` _ ^ ]unt) { u_count = NBPP - poff(uvaddr) ; if (count < u_count) u_count = count ; D 5 pt = upte(p,svtop(uvaddr)) ; move_out(kvaddr,ptob(pt->pgm.pg_pfn) + poff(uvaddr),u_count) ; E 5 I 5 D 6 i = svtop(uvaddr) ; E 6 I 6 i = btotp(uvaddr) ; E 6 sct = p->p_sct + ((i & L2MASK) >> (L1WIDTH+L0WIDTH)) ; st = (sgte_t *)ptol(sct->sgt_paddr) + ((i & L1MASK) >> L0WIDTH) ; pt = (pte_t *)ptol(sttop(st->pt_paddr)) + (i & L0MASK) ; pcopyvad = ptol(ptob(pt->pgm.pg_pfn)) ; bcopy(kvaddr,pcopyvad + poff(uvaddr),u_count) ; E 5 uvaddr += u_count ; kvaddr += u_count ; count -= u_count ; } } /* * Return the next character from the * kernel string pointed at by dirp. D 5 */ E 5 I 5 D 8 */ E 8 I 8 */ E 8 E 5 schar() { return(*u.u_dirp++ & 0377); } /* * Return the next character from the * user string pointed at by dirp. D 5 */ E 5 I 5 D 8 */ E 8 I 8 */ E 8 E 5 uchar() { register c; c = fubyte(u.u_dirp++); if(c == -1) u.u_error = EFAULT; return(c); } /* * Pass back c to the user at his location u_base; * update u_base, u_count, and u_offset. Return -1 * on the last character of the user's read. * u_base is in the user data space. D 5 */ E 5 I 5 D 8 */ E 8 I 8 */ E 8 E 5 passc(c) register c; { if (subyte(u.u_base, c) < 0) { u.u_error = EFAULT; return(-1); } u.u_count--; u.u_offset++; u.u_base++; return(u.u_count == 0 ? -1: 0); } /* * Pick up and return the next character from the user's * write call at location u_base; * update u_base, u_count, and u_offset. Return -1 * when u_count is exhausted. * u_base is in the user data space. D 5 */ E 5 I 5 D 8 */ E 8 I 8 */ E 8 E 5 cpass() { register c; if (u.u_count == 0) return(-1); if ((c = fubyte(u.u_base)) < 0) { u.u_error = EFAULT; return(-1); } u.u_count--; u.u_offset++; u.u_base++; return(c); } E 1 h09997 s 00001/00001/00539 d D 4.4 87/05/14 16:09:37 build 8 7 c removed old SCCS strings and inserted #ident BB e s 00234/00170/00306 d D 4.3 87/04/16 18:47:28 dc 7 6 c dc - Add Bull updates from 03/05/87 e s 00016/00016/00460 d D 4.2 87/04/15 17:47:34 dc 6 5 c dc - changed #include "sys/..." to #include e s 00000/00000/00476 d D 4.1 87/02/20 13:30:21 build 5 4 c rolled rev to -r4 /dc e s 00000/00000/00476 d D 3.1 87/01/19 09:22:46 build 4 3 c rolled rev to -r3 /dc e s 00000/00000/00476 d D 2.1 87/01/19 09:22:46 build 3 2 c AUTO NULL DELTA e s 00001/00000/00475 d D 1.2 87/01/16 10:16:21 build 2 1 c add ident string /dc e s 00475/00000/00000 d D 1.1 87/01/09 16:34:56 build 1 0 c Placed under source control - dc e u U f b f n t T I 2 D 7 /* "%W% %E%" */ E 2 I 1 /* ** Inter-Process Communication Message Facility. */ E 7 I 7 D 8 /* " %W% %E% " */ E 8 I 8 #ident " %W% %E% " E 8 #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include E 7 D 6 #include "sys/types.h" #include "sys/param.h" #include "sys/dir.h" #include "sys/signal.h" #include "sys/user.h" #include "sys/seg.h" #include "sys/page.h" #include "sys/region.h" #include "sys/proc.h" #include "sys/buf.h" #include "sys/errno.h" #include "sys/map.h" #include "sys/ipc.h" #include "sys/msg.h" #include "sys/systm.h" #include "sys/sysmacros.h" E 6 I 6 D 7 #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include E 6 E 7 extern struct map msgmap[]; /* msg allocation map */ extern struct msqid_ds msgque[]; /* msg queue headers */ extern struct msg msgh[]; /* message headers */ extern struct msginfo msginfo; /* message parameters */ D 7 struct msg *msgfp; /* ptr to head of free header list */ E 7 I 7 extern char msglock[]; struct msg *msgfp; /* ptr to head of free header list */ E 7 paddr_t msg; /* base address of message buffer */ extern time_t time; /* system idea of date */ struct msqid_ds *ipcget(), *msgconv(); /* Convert bytes to msg segments. */ #define btoq(X) ((X + msginfo.msgssz - 1) / msginfo.msgssz) /* Choose appropriate message copy routine. */ #define MOVE iomove /* D 7 ** msgconv - Convert a user supplied message queue id into a ptr to a ** msqid_ds structure. E 7 I 7 * msgconv - Convert a user supplied message queue id into a ptr to a * msqid_ds structure. E 7 */ struct msqid_ds * msgconv(id) register int id; { register struct msqid_ds *qp; /* ptr to associated q slot */ I 7 register char *lockp; /* ptr to lock. */ E 7 I 7 if (id < 0) { u.u_error = EINVAL; return(NULL); } E 7 qp = &msgque[id % msginfo.msgmni]; D 7 if((qp->msg_perm.mode & IPC_ALLOC) == 0 || id / msginfo.msgmni != qp->msg_perm.seq) { E 7 I 7 lockp = MSGLOCK(qp); while (*lockp) sleep(lockp, PMSG); *lockp = 1; if ((qp->msg_perm.mode & IPC_ALLOC) == 0 || id / msginfo.msgmni != qp->msg_perm.seq) { *lockp = 0; wakeup(lockp); E 7 u.u_error = EINVAL; return(NULL); } return(qp); } /* D 7 ** msgctl - Msgctl system call. E 7 I 7 * msgctl - Msgctl system call. E 7 */ msgctl() { register struct a { int msgid, cmd; struct msqid_ds *buf; } *uap = (struct a *)u.u_ap; struct msqid_ds ds; /* queue work area */ register struct msqid_ds *qp; /* ptr to associated q */ I 7 register char *lockp; E 7 D 7 if((qp = msgconv(uap->msgid)) == NULL) E 7 I 7 if ((qp = msgconv(uap->msgid)) == NULL) E 7 return; I 7 lockp = MSGLOCK(qp); E 7 u.u_rval1 = 0; D 7 switch(uap->cmd) { E 7 I 7 switch (uap->cmd) { E 7 case IPC_RMID: D 7 if(u.u_uid != qp->msg_perm.uid && u.u_uid != qp->msg_perm.cuid E 7 I 7 if (u.u_uid != qp->msg_perm.uid && u.u_uid != qp->msg_perm.cuid E 7 && !suser()) D 7 return; while(qp->msg_first) E 7 I 7 break; while (qp->msg_first) E 7 msgfree(qp, NULL, qp->msg_first); qp->msg_cbytes = 0; D 7 if(uap->msgid + msginfo.msgmni < 0) E 7 I 7 if (uap->msgid + msginfo.msgmni < 0) E 7 qp->msg_perm.seq = 0; else qp->msg_perm.seq++; D 7 if(qp->msg_perm.mode & MSG_RWAIT) E 7 I 7 if (qp->msg_perm.mode & MSG_RWAIT) E 7 wakeup(&qp->msg_qnum); D 7 if(qp->msg_perm.mode & MSG_WWAIT) E 7 I 7 if (qp->msg_perm.mode & MSG_WWAIT) E 7 wakeup(qp); qp->msg_perm.mode = 0; D 7 return; E 7 I 7 break; E 7 case IPC_SET: D 7 if(u.u_uid != qp->msg_perm.uid && u.u_uid != qp->msg_perm.cuid E 7 I 7 if (u.u_uid != qp->msg_perm.uid && u.u_uid != qp->msg_perm.cuid E 7 && !suser()) D 7 return; if(copyin(uap->buf, &ds, sizeof(ds))) { E 7 I 7 break; if (copyin(uap->buf, &ds, sizeof(ds))) { E 7 u.u_error = EFAULT; D 7 return; E 7 I 7 break; E 7 } D 7 if(ds.msg_qbytes > qp->msg_qbytes && !suser()) return; E 7 I 7 if (ds.msg_qbytes > qp->msg_qbytes && !suser()) break; E 7 qp->msg_perm.uid = ds.msg_perm.uid; qp->msg_perm.gid = ds.msg_perm.gid; qp->msg_perm.mode = (qp->msg_perm.mode & ~0777) | (ds.msg_perm.mode & 0777); qp->msg_qbytes = ds.msg_qbytes; qp->msg_ctime = time; D 7 return; E 7 I 7 break; E 7 case IPC_STAT: D 7 if(ipcaccess(&qp->msg_perm, MSG_R)) return; if(copyout(qp, uap->buf, sizeof(*qp))) { E 7 I 7 if (ipcaccess(&qp->msg_perm, MSG_R)) break; if (copyout(qp, uap->buf, sizeof(*qp))) { E 7 u.u_error = EFAULT; D 7 return; E 7 I 7 break; E 7 } D 7 return; E 7 I 7 break; E 7 default: u.u_error = EINVAL; D 7 return; E 7 I 7 break; E 7 } I 7 *lockp = 0; wakeup(lockp); E 7 } /* D 7 ** msgfree - Free up space and message header, relink pointers on q, ** and wakeup anyone waiting for resources. E 7 I 7 * msgfree - Free up space and message header, relink pointers on q, * and wakeup anyone waiting for resources. E 7 */ msgfree(qp, pmp, mp) register struct msqid_ds *qp; /* ptr to q of mesg being freed */ register struct msg *mp, /* ptr to msg being freed */ *pmp; /* ptr to mp's predecessor */ { /* Unlink message from the q. */ D 7 if(pmp == NULL) E 7 I 7 if (pmp == NULL) E 7 qp->msg_first = mp->msg_next; else pmp->msg_next = mp->msg_next; D 7 if(mp->msg_next == NULL) E 7 I 7 if (mp->msg_next == NULL) E 7 qp->msg_last = pmp; qp->msg_qnum--; D 7 if (qp->msg_perm.mode & MSG_WWAIT) { E 7 I 7 if (qp->msg_perm.mode & MSG_WWAIT) { E 7 qp->msg_perm.mode &= ~MSG_WWAIT; wakeup(qp); } /* Free up message text. */ D 7 if(mp->msg_ts) E 7 I 7 if (mp->msg_ts) E 7 mfree(msgmap, btoq(mp->msg_ts), mp->msg_spot + 1); /* Free up header */ mp->msg_next = msgfp; D 7 if(msgfp == NULL) E 7 I 7 if (msgfp == NULL) E 7 wakeup(&msgfp); msgfp = mp; } /* D 7 ** msgget - Msgget system call. E 7 I 7 * msgget - Msgget system call. E 7 */ msgget() { register struct a { key_t key; int msgflg; } *uap = (struct a *)u.u_ap; register struct msqid_ds *qp; /* ptr to associated q */ int s; /* ipcget status return */ D 7 if((qp = ipcget(uap->key, uap->msgflg, msgque, msginfo.msgmni, sizeof(*qp), &s)) E 7 I 7 if ((qp = ipcget(uap->key, uap->msgflg, msgque, msginfo.msgmni, sizeof(*qp), &s)) E 7 == NULL) return; D 7 if(s) { E 7 I 7 if (s) { E 7 /* This is a new queue. Finish initialization. */ qp->msg_first = qp->msg_last = NULL; qp->msg_qnum = 0; qp->msg_qbytes = msginfo.msgmnb; qp->msg_lspid = qp->msg_lrpid = 0; qp->msg_stime = qp->msg_rtime = 0; qp->msg_ctime = time; } u.u_rval1 = qp->msg_perm.seq * msginfo.msgmni + (qp - msgque); } /* D 7 ** msginit - Called by main(main.c) to initialize message queues. E 7 I 7 * msginit - Called by main(main.c) to initialize message queues. E 7 */ msginit() { register int i; /* loop control */ register struct msg *mp; /* ptr to msg begin linked */ D 7 register int bs; /* message buffer size */ E 7 I 7 register int bs ; /* message buffer size */ E 7 D 7 /* Allocate physical memory for message buffer. */ if((msg = (paddr_t)sptalloc(bs=btoc(msginfo.msgseg * msginfo.msgssz), PG_V | PG_KW, 0)) == NULL) { printf("Can't allocate message buffer.\n"); msginfo.msgseg = 0; E 7 I 7 if ((msg = (paddr_t)sptalloc(bs=btoc(msginfo.msgseg * msginfo.msgssz), PG_V | PG_KW, 0)) == NULL) { printf("Can't allocate message buffer.\n") ; msginfo.msgseg = 0 ; E 7 } mapinit(msgmap, msginfo.msgmap); mfree(msgmap, msginfo.msgseg, 1); D 7 for(i = 0, mp = msgfp = msgh;++i < msginfo.msgtql;mp++) E 7 I 7 for (i = 0, mp = msgfp = msgh;++i < msginfo.msgtql;mp++) E 7 mp->msg_next = mp + 1; D 7 maxmem -= bs; E 7 I 7 maxmem -= bs ; E 7 } /* D 7 ** msgrcv - Msgrcv system call. E 7 I 7 * msgrcv - Msgrcv system call. E 7 */ msgrcv() { register struct a { int msqid; struct msgbuf *msgp; int msgsz; long msgtyp; int msgflg; } *uap = (struct a *)u.u_ap; register struct msg *mp, /* ptr to msg on q */ *pmp, /* ptr to mp's predecessor */ *smp, /* ptr to best msg on q */ *spmp; /* ptr to smp's predecessor */ register struct msqid_ds *qp; /* ptr to associated q */ I 7 register char *lockp; struct msqid_ds *qp1; E 7 int sz; /* transfer byte count */ D 7 if((qp = msgconv(uap->msqid)) == NULL) E 7 I 7 sysinfo.msg++; /* bump message send/rcv count */ if ((qp = msgconv(uap->msqid)) == NULL) E 7 return; D 7 if(ipcaccess(&qp->msg_perm, MSG_R)) return; if(uap->msgsz < 0) { E 7 I 7 lockp = MSGLOCK(qp); if (ipcaccess(&qp->msg_perm, MSG_R)) goto msgrcv_out; if (uap->msgsz < 0) { E 7 u.u_error = EINVAL; D 7 return; E 7 I 7 goto msgrcv_out; E 7 } smp = spmp = NULL; I 7 *lockp = 0; wakeup(lockp); E 7 findmsg: I 7 if ((qp1 = msgconv(uap->msqid)) == NULL) { u.u_error = EIDRM; return; } if (qp1 != qp) { u.u_error = EIDRM; lockp = MSGLOCK(qp1); *lockp = 0; wakeup(lockp); return; } E 7 pmp = NULL; mp = qp->msg_first; D 7 if(uap->msgtyp == 0) E 7 I 7 if (uap->msgtyp == 0) E 7 smp = mp; else D 7 for(;mp;pmp = mp, mp = mp->msg_next) { if(uap->msgtyp > 0) { if(uap->msgtyp != mp->msg_type) E 7 I 7 for (;mp;pmp = mp, mp = mp->msg_next) { if (uap->msgtyp > 0) { if (uap->msgtyp != mp->msg_type) E 7 continue; smp = mp; spmp = pmp; break; } D 7 if(mp->msg_type <= -uap->msgtyp) { if(smp && smp->msg_type <= mp->msg_type) E 7 I 7 if (mp->msg_type <= -uap->msgtyp) { if (smp && smp->msg_type <= mp->msg_type) E 7 continue; smp = mp; spmp = pmp; } } D 7 if(smp) { if(uap->msgsz < smp->msg_ts) if(!(uap->msgflg & MSG_NOERROR)) { E 7 I 7 if (smp) { if (uap->msgsz < smp->msg_ts) if (!(uap->msgflg & MSG_NOERROR)) { E 7 u.u_error = E2BIG; D 7 return; } else E 7 I 7 goto msgrcv_out; } else E 7 sz = uap->msgsz; else sz = smp->msg_ts; D 7 copyout(&smp->msg_type, uap->msgp, sizeof(smp->msg_type)); if(u.u_error) return; if(sz) { E 7 I 7 if (copyout(&smp->msg_type, uap->msgp, sizeof(smp->msg_type))) { u.u_error = EFAULT; goto msgrcv_out; } if (sz) { E 7 u.u_base = (caddr_t)uap->msgp + sizeof(smp->msg_type); u.u_segflg = 0; MOVE(msg + msginfo.msgssz * smp->msg_spot, sz, B_READ); D 7 if(u.u_error) return; E 7 I 7 if (u.u_error) goto msgrcv_out; E 7 } u.u_rval1 = sz; qp->msg_cbytes -= smp->msg_ts; qp->msg_lrpid = u.u_procp->p_pid; qp->msg_rtime = time; curpri = PMSG; msgfree(qp, spmp, smp); D 7 return; E 7 I 7 goto msgrcv_out; E 7 } D 7 if(uap->msgflg & IPC_NOWAIT) { E 7 I 7 if (uap->msgflg & IPC_NOWAIT) { E 7 u.u_error = ENOMSG; D 7 return; E 7 I 7 goto msgrcv_out; E 7 } qp->msg_perm.mode |= MSG_RWAIT; D 7 if(sleep(&qp->msg_qnum, PMSG | PCATCH)) { E 7 I 7 *lockp = 0; wakeup(lockp); if (sleep(&qp->msg_qnum, PMSG | PCATCH)) { E 7 u.u_error = EINTR; return; } D 7 if(msgconv(uap->msqid) == NULL) { u.u_error = EIDRM; return; } E 7 goto findmsg; I 7 msgrcv_out: *lockp = 0; wakeup(lockp); E 7 } /* ** msgsnd - Msgsnd system call. */ msgsnd() { register struct a { int msqid; struct msgbuf *msgp; int msgsz; int msgflg; } *uap = (struct a *)u.u_ap; register struct msqid_ds *qp; /* ptr to associated q */ register struct msg *mp; /* ptr to allocated msg hdr */ register int cnt, /* byte count */ spot; /* msg pool allocation spot */ I 7 register char *lockp; struct msqid_ds *qp1; E 7 long type; /* msg type */ D 7 if((qp = msgconv(uap->msqid)) == NULL) E 7 I 7 sysinfo.msg++; /* bump message send/rcv count */ if ((qp = msgconv(uap->msqid)) == NULL) E 7 return; D 7 if(ipcaccess(&qp->msg_perm, MSG_W)) return; if((cnt = uap->msgsz) < 0 || cnt > msginfo.msgmax) { E 7 I 7 lockp = MSGLOCK(qp); if (ipcaccess(&qp->msg_perm, MSG_W)) goto msgsnd_out; if ((cnt = uap->msgsz) < 0 || cnt > msginfo.msgmax) { E 7 u.u_error = EINVAL; D 7 return; E 7 I 7 goto msgsnd_out; E 7 } D 7 copyin(uap->msgp, &type, sizeof(type)); if(u.u_error) return; if(type < 1) { E 7 I 7 if (copyin(uap->msgp, &type, sizeof(type))) { u.u_error = EFAULT; goto msgsnd_out; } if (type < 1) { E 7 u.u_error = EINVAL; D 7 return; E 7 I 7 goto msgsnd_out; E 7 } I 7 *lockp = 0; wakeup(lockp); E 7 getres: /* Be sure that q has not been removed. */ D 7 if(msgconv(uap->msqid) == NULL) { E 7 I 7 if ((qp1 = msgconv(uap->msqid)) == NULL) { E 7 u.u_error = EIDRM; return; } I 7 if (qp1 != qp) { u.u_error = EIDRM; lockp = MSGLOCK(qp1); *lockp = 0; wakeup(lockp); return; } E 7 /* Allocate space on q, message header, & buffer space. */ D 7 if(cnt + qp->msg_cbytes > qp->msg_qbytes) { if(uap->msgflg & IPC_NOWAIT) { E 7 I 7 if (cnt + qp->msg_cbytes > qp->msg_qbytes) { if (uap->msgflg & IPC_NOWAIT) { E 7 u.u_error = EAGAIN; D 7 return; E 7 I 7 goto msgsnd_out; E 7 } qp->msg_perm.mode |= MSG_WWAIT; D 7 if(sleep(qp, PMSG | PCATCH)) { E 7 I 7 *lockp = 0; wakeup(lockp); if (sleep(qp, PMSG | PCATCH)) { E 7 u.u_error = EINTR; I 7 if ((qp1 = msgconv(uap->msqid)) == NULL) return; if (qp1 != qp) { lockp = MSGLOCK(qp1); *lockp = 0; wakeup(lockp); return; } E 7 qp->msg_perm.mode &= ~MSG_WWAIT; wakeup(qp); D 7 return; E 7 I 7 goto msgsnd_out; E 7 } goto getres; } D 7 if(msgfp == NULL) { if(uap->msgflg & IPC_NOWAIT) { E 7 I 7 if (msgfp == NULL) { if (uap->msgflg & IPC_NOWAIT) { E 7 u.u_error = EAGAIN; D 7 return; E 7 I 7 goto msgsnd_out; E 7 } D 7 if(sleep(&msgfp, PMSG | PCATCH)) { E 7 I 7 *lockp = 0; wakeup(lockp); if (sleep(&msgfp, PMSG | PCATCH)) { E 7 u.u_error = EINTR; D 7 return; E 7 I 7 if ((qp1 = msgconv(uap->msqid)) == NULL) return; if (qp1 != qp) { lockp = MSGLOCK(qp1); *lockp = 0; wakeup(lockp); return; } goto msgsnd_out; E 7 } goto getres; } D 7 if(cnt && (spot = malloc(msgmap, btoq(cnt))) == NULL) { if(uap->msgflg & IPC_NOWAIT) { E 7 I 7 mp = msgfp; msgfp = mp->msg_next; if (cnt && (spot = malloc(msgmap, btoq(cnt))) == NULL) { if (uap->msgflg & IPC_NOWAIT) { E 7 u.u_error = EAGAIN; D 7 return; E 7 I 7 goto msgsnd_out1; E 7 } mapwant(msgmap)++; D 7 if(sleep(msgmap, PMSG | PCATCH)) { E 7 I 7 mp->msg_next = msgfp; if (msgfp == NULL) wakeup(&msgfp); msgfp = mp; *lockp = 0; wakeup(lockp); if (sleep(msgmap, PMSG | PCATCH)) { E 7 u.u_error = EINTR; D 7 return; E 7 I 7 if ((qp1 = msgconv(uap->msqid)) == NULL) { return; } if (qp1 != qp) { lockp = MSGLOCK(qp1); *lockp = 0; wakeup(lockp); return; } goto msgsnd_out; E 7 } goto getres; } /* Everything is available, copy in text and put msg on q. */ D 7 if(cnt) { E 7 I 7 if (cnt) { E 7 u.u_base = (caddr_t)uap->msgp + sizeof(type); u.u_segflg = 0; MOVE(msg + msginfo.msgssz * --spot, cnt, B_WRITE); D 7 if(u.u_error) { E 7 I 7 if (u.u_error) { E 7 mfree(msgmap, btoq(cnt), spot + 1); D 7 return; E 7 I 7 goto msgsnd_out1; E 7 } } qp->msg_qnum++; qp->msg_cbytes += cnt; qp->msg_lspid = u.u_procp->p_pid; qp->msg_stime = time; D 7 mp = msgfp; msgfp = mp->msg_next; E 7 mp->msg_next = NULL; mp->msg_type = type; mp->msg_ts = cnt; mp->msg_spot = cnt ? spot : -1; D 7 if(qp->msg_last == NULL) E 7 I 7 if (qp->msg_last == NULL) E 7 qp->msg_first = qp->msg_last = mp; D 7 else { E 7 I 7 else { E 7 qp->msg_last->msg_next = mp; qp->msg_last = mp; } D 7 if(qp->msg_perm.mode & MSG_RWAIT) { E 7 I 7 if (qp->msg_perm.mode & MSG_RWAIT) { E 7 qp->msg_perm.mode &= ~MSG_RWAIT; curpri = PMSG; wakeup(&qp->msg_qnum); } u.u_rval1 = 0; I 7 goto msgsnd_out; msgsnd_out1: mp->msg_next = msgfp; if (msgfp == NULL) wakeup(&msgfp); msgfp = mp; msgsnd_out: *lockp = 0; wakeup(lockp); return; E 7 } /* D 7 ** msgsys - System entry point for msgctl, msgget, msgrcv, and msgsnd ** system calls. E 7 I 7 * msgsys - System entry point for msgctl, msgget, msgrcv, and msgsnd * system calls. E 7 */ msgsys() { int msgctl(), msgget(), msgrcv(), msgsnd(); static int (*calls[])() = { msgget, msgctl, msgrcv, msgsnd }; register struct a { unsigned id; /* function code id */ int *ap; /* arg pointer for recvmsg */ } *uap = (struct a *)u.u_ap; D 7 if(uap->id > 3) { E 7 I 7 if (uap->id > 3) { E 7 u.u_error = EINVAL; return; } u.u_ap = &u.u_arg[1]; (*calls[uap->id])(); } E 1 h28311 s 00001/00001/00223 d D 4.3 87/05/14 16:09:49 build 7 6 c removed old SCCS strings and inserted #ident BB e s 00001/00002/00223 d D 4.2 87/04/16 18:47:48 dc 6 5 c dc - Add Bull updates from 03/05/87 e s 00000/00000/00225 d D 4.1 87/02/20 13:30:25 build 5 4 c rolled rev to -r4 /dc e s 00000/00000/00225 d D 3.1 87/01/19 09:22:49 build 4 3 c rolled rev to -r3 /dc e s 00000/00000/00225 d D 2.1 87/01/19 09:22:49 build 3 2 c AUTO NULL DELTA e s 00001/00000/00224 d D 1.2 87/01/16 10:16:26 build 2 1 c add ident string /dc e s 00224/00000/00000 d D 1.1 87/01/09 16:34:58 build 1 0 c Placed under source control - dc e u U f b f n t T I 2 D 6 /* "%W% %E%" */ E 2 I 1 /* @(#)nami.c 6.4 */ E 6 I 6 D 7 /* " %W% %E% " */ E 7 I 7 #ident " %W% %E% " E 7 E 6 #include #include #include #include #include #include #include #include #include #include #include #include /* * Convert a pathname into a pointer to * an inode. Note that the inode is locked. * * func = function called to get next char of name * &uchar if name is in user space * &schar if name is in system space * flag = 0 if name is sought * 1 if name is to be created * 2 if name is to be deleted */ struct inode * namei(func, flag) register (*func)(); { register struct inode *dp; register c; register char *cp; register struct buf *bp; daddr_t bn; dev_t d; off_t eo, off; /* * If name starts with '/' start from * root; otherwise start from current dir. */ sysinfo.namei++; c = (*func)(); if (c == '\0') { u.u_error = ENOENT; return(NULL); } if (c == '/') { if ((dp = u.u_rdir) == NULL) dp = rootdir; while(c == '/') c = (*func)(); if(c == '\0' && flag != 0) { u.u_error = ENOENT; return(NULL); } } else dp = u.u_cdir; iget(dp->i_dev, dp->i_number); cloop: /* * Here dp contains pointer * to last component matched. */ if(u.u_error) goto out; if(c == '\0') return(dp); /* * If there is another component, * gather up name into users' dir buffer. */ cp = &u.u_dent.d_name[0]; while(c != '/' && c != '\0' && u.u_error == 0) { if(cp < &u.u_dent.d_name[DIRSIZ]) *cp++ = c; c = (*func)(); } while(cp < &u.u_dent.d_name[DIRSIZ]) *cp++ = '\0'; while(c == '/') c = (*func)(); if ((flag == 1) && (c == '\0') && (u.u_error == 0)) { cp = &u.u_dent.d_name[0]; while (cp < &u.u_dent.d_name[DIRSIZ]) if (*cp++ & 0200) u.u_error = EFAULT; } seloop: /* * dp must be a directory and * must have X permission. */ if ((dp->i_mode&IFMT) != IFDIR || dp->i_nlink==0) u.u_error = ENOTDIR; else access(dp, IEXEC); if (u.u_error) goto out; /* * set up to search a directory */ u.u_offset = 0; u.u_count = dp->i_size; u.u_pbsize = 0; bp = NULL; eo = 0; if (dp == u.u_rdir) if (u.u_dent.d_name[0] == '.') if (u.u_dent.d_name[1] == '.') if (u.u_dent.d_name[2] == '\0') goto cloop; eloop: /* * If at the end of the directory, * the search failed. Report what * is appropriate as per flag. */ if (u.u_count == 0) { if(bp != NULL) brelse(bp); if(flag==1 && c=='\0') { if(access(dp, IWRITE)) goto out; u.u_pdir = dp; if (eo) u.u_offset = eo; u.u_count = sizeof(struct direct); bmap(dp, B_WRITE); if (u.u_error) goto out; return(NULL); } u.u_error = ENOENT; goto out; } /* * Read the next directory block */ if(bp != NULL) brelse(bp); sysinfo.dirblk++; bn = bmap(dp, B_READ); if (u.u_error) goto out; if (bn < 0) { u.u_error = EIO; goto out; } bp = bread(dp->i_dev, bn, 0); if (u.u_error) { brelse(bp); goto out; } /* * Search directory block. searchdir() returns * offset of matching entry, or empty entry, or -1. */ cp = bp->b_un.b_addr + u.u_pboff; switch(off = searchdir(cp, u.u_pbsize, u.u_dent.d_name)) { default: cp += off; if((u.u_dent.d_ino = ((struct direct *)cp)->d_ino) != 0) break; if(eo == 0) eo = u.u_offset + off; case -1: u.u_offset += u.u_pbsize; u.u_count -= u.u_pbsize; goto eloop; } /* * Here a component matched in a directory. * If there is more pathname, go back to * cloop, otherwise return. */ u.u_offset += off + sizeof(struct direct); if(bp != NULL) brelse(bp); if(flag==2 && c=='\0') { if(access(dp, IWRITE)) goto out; return(dp); } d = dp->i_dev; if(u.u_dent.d_ino == ROOTINO) if(dp->i_number == ROOTINO) if(u.u_dent.d_name[1] == '.') { register struct mount *mp; for(mp = &mount[1]; mp < (struct mount *)v.ve_mount; mp++) if(mp->m_flags == MINUSE) if(mp->m_dev == d) { iput(dp); dp = mp->m_inodp; dp->i_count++; plock(dp); goto seloop; } } iput(dp); dp = iget(d, u.u_dent.d_ino); if(dp == NULL) return(NULL); goto cloop; out: iput(dp); return(NULL); } E 1 h48435 s 00001/00001/00908 d D 4.5 87/05/14 16:10:03 build 10 9 c removed old SCCS strings and inserted #ident BB e s 00025/00003/00884 d D 4.4 87/05/07 17:34:40 dc 9 8 c dc - meminit: add 0--3b to pfdat. e s 00013/00014/00874 d D 4.3 87/04/16 18:51:38 dc 8 7 c dc - Add Bull updates from 03/05/87 e s 00019/00019/00869 d D 4.2 87/04/15 17:47:50 dc 7 6 c dc - changed #include "sys/..." to #include e s 00000/00000/00888 d D 4.1 87/02/20 13:30:32 build 6 5 c rolled rev to -r4 /dc e s 00156/00112/00732 d D 3.2 87/01/26 13:34:06 build 5 4 c add page table changes /dc e s 00000/00000/00844 d D 3.1 87/01/19 09:22:53 build 4 3 c rolled rev to -r3 /dc e s 00000/00000/00844 d D 2.1 87/01/19 09:22:53 build 3 2 c AUTO NULL DELTA e s 00001/00000/00843 d D 1.2 87/01/16 10:16:30 build 2 1 c add ident string /dc e s 00843/00000/00000 d D 1.1 87/01/09 16:35:00 build 1 0 c Placed under source control - dc e u U f b f n t T I 2 D 8 /* "%W% %E%" */ E 8 I 8 D 10 /* " %W% %E% " */ E 10 I 10 #ident " %W% %E% " E 10 E 8 E 2 I 1 D 7 #include "sys/types.h" #include "sys/param.h" #include "sys/sysmacros.h" #include "sys/systm.h" #include "sys/dir.h" #include "sys/signal.h" #include "sys/user.h" #include "sys/inode.h" #include "sys/var.h" #include "sys/mount.h" #include "sys/page.h" #include "sys/region.h" #include "sys/buf.h" #include "sys/map.h" #include "sys/pfdat.h" #include "sys/proc.h" #include "sys/swap.h" #include "sys/sysinfo.h" #include "sys/debug.h" E 7 I 7 #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include E 7 D 5 int firstfree, maxfree, freemem; ushort sys_segno = 1 ; E 5 I 5 int firstfree, maxfree, freemem; E 5 I 5 int (*allocator)() ; int (*pgtallocator)() ; E 5 extern int maxupts; #if SPTLOGON == 1 #define SPTLGSZ 128 struct sptlog { int type; /* 0=sptalloc; 1=sptfree */ unsigned int begva, endva; unsigned int retva; } sptlog[SPTLGSZ]; int sptlgndx = 0; #endif #if PFLOGON == 1 #define PFLGSZ 256 struct pfdlog { char type; /* 3=memfree; 2=vfault; 1=allocate; 0=pfree */ char pfuse; short pfnum; unsigned int process; unsigned int retva; struct region *regp; } pfdlog[PFLGSZ]; int pflgndx = 0; #endif #if PHASHLOGON == 1 #define PHASHLGSZ 256 struct phashlog { int type:4, /* 3=pbremove; 2=premove; 1=pinsert; 0=pfind */ pfnum:28; struct dbd dbd; short dev; short blkno; unsigned int process; } phashlog[PHASHLGSZ]; int phashndx = 0; #endif /* * Allocate pages and fill in page table * rp -> region pages are being added to. * pt -> address of page table * size -> # of pages needed * validate -> Mark pages valid if set. * returns: * 0 Memory allocated as requested. * 1 Had to unlock region and go to sleep before * memory was obtained. After awakening, the * first page was valid so no page was allocated. */ ptmemall(rp, pt, size, validate) reg_t *rp; pte_t *pt; int validate; { ASSERT(rp->r_flags & RG_LOCK); memreserve(rp, size); D 5 if (pt->pgi.pg_pte & PG_V) E 5 I 5 if (pt->pgi.pg_pte & (PG_V | PG_REF)) E 5 { freemem += size; return(1); } rp->r_nvalid += size; D 5 ptfill(pt, size, rp->r_type, validate); E 5 I 5 ptfill(pt, size, rp->r_type, validate, 0) ; E 5 return(0); } I 5 /* * Allocate 1 page of physical memory. * returns pfn */ E 5 I 5 unsigned pall() { int frame ; register struct pfdat *pfd ; register struct pfdat *ph ; ph = &phead ; pfd = ph->pf_next ; ASSERT(pfd != ph) ; ASSERT(pfd->pf_flags&P_QUEUE) ; ASSERT(pfd->pf_use == 0) ; /* Delink page from free queue and set up pfd */ ph->pf_next = pfd->pf_next ; pfd->pf_next->pf_prev = pfd->pf_prev ; if (pfd->pf_flags&P_HASH) premove(pfd) ; pfd->pf_use = 1 ; pfd->pf_flags = 0 ; # if PFLOGON == 1 pfdlog[pflgndx].type = 1; pfdlog[pflgndx].process = (int)curproc; pfdlog[pflgndx].pfnum = pfd-pfdat; pfdlog[pflgndx].pfuse = pfd->pf_use; pfdlog[pflgndx].retva = (&frame)[5]; pfdlog[pflgndx].regp = NULL; pflgndx++; if (pflgndx >= PFLGSZ) pflgndx = 0; # endif return(pfd - pfdat) ; } E 5 /* D 5 * Allocate pages and fill in page table for system virtual space * pt -> address of page table * size -> # of pages needed * returns: * 0 Memory allocated as requested. * 1 Failure */ E 5 I 5 * Fill in descriptors at all levels, starting at * level2 = section level * vaddr -> virtual page address * size -> # of pages to free or allocate * base free ACTION * * 0 0 allocate physical pages and map them * >0 0 map physical space starting at address base * <0 0 reserve virtual space * * 0 1 free pages and invalidate virtual addresses * !0 1 invalidate virtual addresses */ E 5 D 5 sptmemall(pt, size) pte_t *pt; int size; E 5 I 5 sptfill(vaddr, size, base, free) register unsigned vaddr, size ; register int base ; E 5 { D 5 memreserve(NULL, size); if (pt->pgm.pg_v) E 5 I 5 register scte_t *sct ; register sgte_t *st; register unsigned nsize, nvaddr ; if ((!free) & (base == 0)) memreserve(NULL, size) ; while (size) E 5 { D 5 freemem += size; return(1); E 5 I 5 sct = ksct + ((vaddr & L2MASK) >> (L1WIDTH+L0WIDTH)) ; if (!sct->sgt_paddr) sct->sgt_paddr = kvtopfn((*pgtallocator)(NPTPSC)) ; nvaddr = vaddr & (L1MASK | L0MASK) ; nsize = min(size, NPGPSC - nvaddr) ; stfill(ptol(sct->sgt_paddr), nvaddr, nsize, base, free) ; size -= nsize ; vaddr += nsize ; if (base > 0) base += nsize ; E 5 } D 5 ptfill(pt, size, RT_PRIVATE, 1); return(0); E 5 I 5 return(0) ; E 5 } I 5 /* * fill in descriptors at all levels, starting at * level1 = segment level. */ E 5 I 5 stfill(st, vaddr, size, base, free) register unsigned vaddr ; register int size, base ; register sgte_t *st ; { register pte_t *pt ; register sgte_t *l1d ; register unsigned nsize, nvaddr ; register i ; while (size) { l1d = (sgte_t *)st + ((vaddr & L1MASK) >> L0WIDTH) ; if (!l1d->pt_paddr) { l1d->pt_paddr = ptost(kvtopfn((*pgtallocator)(1))) ; l1d->pt_w = SGT_KW ; } nvaddr = vaddr & L0MASK ; nsize = min(size, NPGPT - nvaddr) ; pt = (pte_t *)ptol(sttop(l1d->pt_paddr)) + (vaddr & L0MASK) ; if (!free) { if (base >=0) ptfill(pt, nsize, RT_PRIVATE, PG_V | PG_KW, base) ; } else { if (!base) pfree(NULL, pt, NULL, nsize) ; for (i = nsize ; i-- ; pt++) pt->pgi.pg_pte = 0 ; } size -= nsize ; vaddr += nsize ; if (base > 0) base += nsize ; } } E 5 /* * Fill in ptes D 5 */ ptfill(pt, size, type, validate) register pte_t *pt; register int size; register int type; register int validate; E 5 I 5 */ ptfill(pt, size, type, validate, base) register pte_t *pt; register int size; register int type; register int validate; register int base ; E 5 { int frame; register struct pfdat *pfd; register struct pfdat *ph; ph = &phead; D 5 if (validate) validate = PG_V ; E 5 for (; --size >= 0; pt++) { D 5 ASSERT((pt->pgi.pg_pte & PG_V) == 0); pfd = ph->pf_next; ASSERT(pfd != ph); ASSERT(pfd->pf_flags&P_QUEUE); ASSERT(pfd->pf_use == 0); E 5 I 5 ASSERT((pt->pgi.pg_pte & (PG_V | PG_REF)) == 0); E 5 D 5 /* Delink page from free queue and set up pfd */ ph->pf_next = pfd->pf_next; pfd->pf_next->pf_prev = pfd->pf_prev; if (pfd->pf_flags&P_HASH) premove(pfd); pfd->pf_use = 1; pfd->pf_flags = 0; # if PFLOGON == 1 pfdlog[pflgndx].type = 1; pfdlog[pflgndx].process = (int)curproc; pfdlog[pflgndx].pfnum = pfd-pfdat; pfdlog[pflgndx].pfuse = pfd->pf_use; pfdlog[pflgndx].retva = (&frame)[5]; pfdlog[pflgndx].regp = NULL; pflgndx++; if (pflgndx >= PFLGSZ) pflgndx = 0; # endif E 5 /* * Insert in page table D 5 */ E 5 I 5 D 8 */ E 8 I 8 */ E 8 E 5 D 5 pt->pgm.pg_pfn = pfd - pfdat; pt->pgi.pg_pte |= PG_E ; pt->pgi.pg_pte &= ~PG_M ; if (pt->pgm.pg_cw || type == RT_STEXT) pt->pgm.pg_prot = PTE_UR; E 5 I 5 if (base) pt->pgm.pg_pfn = base++ ; E 5 else D 5 pt->pgm.pg_prot = PTE_UW; E 5 I 5 pt->pgm.pg_pfn = (*allocator)() ; E 5 D 5 pt->pgi.pg_pte |= validate; E 5 I 5 pt->pgi.pg_pte &= ~PG_M ; pt->pgi.pg_pte |= validate ; E 5 } } /* * Shred page table and update accounting for swapped * and resident pages * rp -> ptr to the region structure. * pt -> ptr to the first pte to free. * dbd -> ptr to disk block descriptor. * size -> nbr of pages to free. D 5 */ E 5 I 5 D 8 */ E 8 I 8 */ E 8 E 5 pfree(rp, pt, dbd, size) register reg_t *rp; register pte_t *pt; register dbd_t *dbd; register int size; { int frame; register struct pfdat *pfd; register struct pfdat *ph; ASSERT(!rp || rp->r_flags & RG_LOCK); ph = &phead; for (; --size >= 0; pt++) { D 5 if (pt->pgi.pg_pte & (PG_V | PG_NDREF)) E 5 I 5 if (pt->pgi.pg_pte & (PG_V | PG_REF)) E 5 { pfd = &pfdat[pt->pgm.pg_pfn]; # if PFLOGON == 1 pfdlog[pflgndx].type = 0; pfdlog[pflgndx].process = (int)curproc; pfdlog[pflgndx].pfnum = pfd-pfdat; pfdlog[pflgndx].pfuse = pfd->pf_use-1; pfdlog[pflgndx].retva = (&frame)[5]; pfdlog[pflgndx].regp = rp; pflgndx++; if (pflgndx >= PFLGSZ) pflgndx = 0; # endif /* Free pages that aren't being used by anyone else */ ASSERT(pfd->pf_use > 0); if (--pfd->pf_use == 0) { D 5 /* Pages that are associated with disk go to E 5 I 5 D 8 /* * Pages that are associated with disk go to E 8 I 8 /* Pages that are associated with disk go to E 8 E 5 * end of queue in hopes that they will be * reused. All others go to head of queue so * they will be reused quickly. D 5 */ E 5 I 5 D 8 */ E 8 I 8 */ E 8 E 5 if (dbd == NULL || dbd->dbd_type == DBD_NONE) { /* * put at head D 5 */ E 5 I 5 D 8 */ E 8 I 8 */ E 8 E 5 pfd->pf_next = ph->pf_next; pfd->pf_prev = ph; ph->pf_next = pfd; pfd->pf_next->pf_prev = pfd; } else { /* D 5 * put at tail */ E 5 I 5 D 8 * Put at tail */ E 8 I 8 * put at tail */ E 8 E 5 pfd->pf_prev = ph->pf_prev; pfd->pf_next = ph; ph->pf_prev = pfd; pfd->pf_prev->pf_next = pfd; } pfd->pf_flags |= P_QUEUE; freemem++; } if (rp) rp->r_nvalid--; } if (dbd && dbd->dbd_type == DBD_SWAP) if (swfree1(dbd) == 0) pbremove(rp, dbd); /* * Change to zero pte's. D 5 */ E 5 I 5 D 8 */ E 8 I 8 */ E 8 E 5 pt->pgi.pg_pte = 0; if(dbd) dbd++->dbd_type = DBD_NONE; } } /* * Find page by looking on hash chain * dbd -> Ptr to disk block descriptor being sought. * returns: * 0 -> can't find it * pfd -> ptr to pfdat entry D 5 */ E 5 I 5 D 8 */ E 8 I 8 */ E 8 E 5 struct pfdat * pfind(rp, dbd) register struct region *rp; register dbd_t *dbd; { register dev_t dev; register daddr_t blkno; register pfd_t *pfd; register ino_t inumber ; /* Hash on block and look for match. */ if (dbd->dbd_type == DBD_SWAP) { dev = swaptab[dbd->dbd_swpi].st_dev; blkno = dbd->dbd_blkno; inumber = 0 ; } else { register struct inode *ip; /* * For pages on a file (rather than swap), * we use the first of 1 or 4 block numbers * as the value to hash. */ ip = rp->r_iptr; ASSERT(ip != NULL); ASSERT(ip->i_map != NULL); dev = ip->i_dev; inumber = ip->i_number ; /* * The following kludge is because of the * overlapping text and data block in a 413 * object file. We hash shared pages on the * first of the 1 or 4 blocks wich make up * the page an private pages on the first * block. This means that the block which * has the end of the text and the beginning * of the data will be in the hash twice, * once as text and once as data. This is * necessary since the two cannot be shared. */ if (rp->r_type == RT_PRIVATE) blkno = dbd->dbd_blkno + 1 ; else blkno = dbd->dbd_blkno ; } pfd = phash[blkno&phashmask].pf_hchain; for( ; pfd != NULL ; pfd = pfd->pf_hchain) { if((pfd->pf_blkno == blkno) && (pfd->pf_dev == dev) && (pfd->pf_inumber == inumber)) { # if PHASHLOGON == 1 phashlog[phashndx].type = 0; phashlog[phashndx].pfnum = pfd-pfdat; phashlog[phashndx].dbd = *dbd; phashlog[phashndx].dev = dev; phashlog[phashndx].blkno = blkno; phashlog[phashndx].process = (int)curproc; phashndx++; if (phashndx >= PHASHLGSZ) phashndx = 0; # endif if (pfd->pf_flags & P_BAD) continue; return(pfd); } } return(NULL); } /* * Insert page on hash chain * dbd -> ptr to disk block descriptor. * pfd -> ptr to pfdat entry. * returns: * none */ pinsert(rp, dbd, pfd) register struct region *rp; register dbd_t *dbd; register pfd_t *pfd; { register dev_t dev; register daddr_t blkno; register ino_t inumber ; if (dbd->dbd_type == DBD_SWAP) { dev = swaptab[dbd->dbd_swpi].st_dev; blkno = dbd->dbd_blkno; inumber = 0 ; } else { register struct inode *ip; /* * For pages on a file (rather than swap), * we use the first of 1 or 4 block numbers * as the value to hash. */ ip = rp->r_iptr; ASSERT(ip != NULL); ASSERT(ip->i_map != NULL); dev = ip->i_dev; inumber = ip->i_number ; /* * The following kludge is because of the * overlapping text and data block in a 413 * object file. We hash shared pages on the * first of the 1 or 4 blocks wich make up * the page an private pages on the first * block. This means that the block which * has the end of the text and the beginning * of the data will be in the hash twice, * once as text and once as data. This is * necessary since the two cannot be shared. */ if (rp->r_type == RT_PRIVATE) blkno = dbd->dbd_blkno + 1 ; else blkno = dbd->dbd_blkno ; } /* * insert newcomers at tail of bucket */ { register struct pfdat *pfd1, *p; for(p = &phash[blkno&phashmask] ; pfd1 = p->pf_hchain ; p = pfd1) { if((pfd1->pf_blkno == blkno) && (pfd1->pf_dev == dev) && (pfd1->pf_inumber == inumber)) panic("pinsert dup"); } p->pf_hchain = pfd; pfd->pf_hchain = pfd1; } # if PHASHLOGON == 1 phashlog[phashndx].type = 1; phashlog[phashndx].pfnum = pfd-pfdat; phashlog[phashndx].dbd = *dbd; phashlog[phashndx].dev = dev; phashlog[phashndx].blkno = blkno; phashlog[phashndx].process = (int)curproc; phashndx++; if (phashndx >= PHASHLGSZ) phashndx = 0; # endif /* Set up the pfdat. */ pfd->pf_dev = dev; pfd->pf_inumber = inumber ; if (dbd->dbd_type == DBD_SWAP) pfd->pf_swpi = dbd->dbd_swpi; pfd->pf_blkno = blkno; pfd->pf_flags |= P_HASH; } /* * remove page from hash chain * pfd -> page frame pointer * returns: * 0 Entry not found. * 1 Entry found and removed. */ premove(pfd) register struct pfdat *pfd; { register struct pfdat *pfd1, *p; int rval; rval = 0; for (p = &phash[pfd->pf_blkno&phashmask]; pfd1 = p->pf_hchain; p = pfd1) { if (pfd1 == pfd) { p->pf_hchain = pfd->pf_hchain; rval = 1; break; } } # if PHASHLOGON == 1 phashlog[phashndx].type = 2; phashlog[phashndx].pfnum = pfd-pfdat; phashlog[phashndx].dbd.dbd_blkno = rval; /* no dbd available */ phashlog[phashndx].dev = pfd->pf_dev; phashlog[phashndx].blkno = pfd->pf_blkno; phashlog[phashndx].process = (int)curproc; phashndx++; if (phashndx >= PHASHLGSZ) phashndx = 0; # endif /* * Disassociate page from disk and * remove from hash table */ pfd->pf_blkno = BLKNULL; pfd->pf_hchain = NULL; pfd->pf_flags &= ~P_HASH; pfd->pf_dev = 0; pfd->pf_inumber = 0 ; return(rval); } /* * Allocate system virtual address space and * allocate pages (usually for user page table). */ sptalloc(size, mode, base) register int size, mode, base; { int frame; register i, sp; if (size == 0) return(NULL) ; /* * Allocate system virtual address space D 5 */ E 5 I 5 D 8 */ E 8 I 8 */ E 8 E 5 if ((sp = malloc(sptmap, size)) == 0) { #ifdef OSDEBUG D 8 printf ("No kernel virtual space\n"); E 8 I 8 printf ("no kernel virtual space\n"); E 8 printf ("size %d %d %d\n",size, mode, base); #endif return(NULL); } /* * Allocate and fill in pages D 5 */ if (base == 0) sptmemall(&sbrpte[sp], size); E 5 I 5 D 8 */ E 8 I 8 */ E 8 sptfill(sp, size, base, 0) ; E 5 D 5 /* * Setup page table entries */ for (i = 0; i < size; i++) { ((pte_t *)sbrpte)[sp+i].pgm.pg_prot = 0; if (base > 0) { ((pte_t *)sbrpte)[sp + i].pgm.pg_pfn = base++; ((int *)sbrpte)[sp + i] |= mode; /* insert in system vrt */ sys_vrt_insert(ptosv(sp+i), ((pte_t *)sbrpte)[sp+i].pgi.pg_pte,sys_segno) ; } else if (base == 0) { ((int *)sbrpte)[sp + i] |= mode; /* insert in system vrt */ sys_vrt_insert(ptosv(sp+i), ((pte_t *)sbrpte)[sp+i].pgi.pg_pte,sys_segno) ; } else ((int *)sbrpte)[sp + i] |= mode; } E 5 # if SPTLOGON == 1 sptlog[sptlgndx].type = 0; sptlog[sptlgndx].begva = ptosv(sp); sptlog[sptlgndx].endva = ptosv(sp+size) -1; sptlog[sptlgndx].retva = (&frame)[5]; sptlgndx++; if (sptlgndx >= SPTLGSZ) sptlgndx = 0; # endif return(ptosv(sp)); } sptfree(vaddr, size, flag) register int size; { int frame; D 5 register i, sp; E 5 I 5 register sp; E 5 sp = svtop(vaddr); # if SPTLOGON == 1 sptlog[sptlgndx].type = 1; sptlog[sptlgndx].begva = vaddr; sptlog[sptlgndx].endva = ptosv(sp+size) -1; sptlog[sptlgndx].retva = (&frame)[5]; sptlgndx++; if (sptlgndx >= SPTLGSZ) sptlgndx = 0; # endif D 5 for (i = 0; i < size; i++) sys_vrt_suppress(ptosv(sp+i),((pte_t *)sbrpte)[sp+i].pgi.pg_pte,sys_segno) ; E 5 if (flag) D 5 pfree(NULL, &sbrpte[sp], NULL, size); for (i = 0; i < size; i++) { ( (int *) sbrpte)[sp + i] = 0; } E 5 I 5 sptfill(sp, size, 0, 1); else sptfill(sp, size, -1, 1) ; E 5 flush() ; mfree(sptmap, size, sp); } /* * Initialize memory map * first -> first free page # * last -> last free page # * returns: * none */ meminit(first, last) register int first; { register struct pfdat *pfd; register int i; firstfree = first; maxfree = last; freemem = (last - first); maxmem = freemem; maxumem = MAXUMEM; maxupts = maxumem / NPGPT; I 9 E 9 /* * Setup queue of pfdat structures. * One for each page of available memory. D 9 */ pfd = &pfdat[first]; E 9 I 9 */ E 9 phead.pf_next = &phead; phead.pf_prev = &phead; I 9 E 9 /* D 9 * Add pages to queue, high memory at end of queue E 9 I 9 * Add FIRSTFREE_PAGES pages to queue, high memory at end of queue E 9 * Pages added to queue FIFO D 5 */ E 5 I 5 */ I 9 pfd = &pfdat[0]; for (i = FIRSTFREE_PAGES ; --i >= 0 ; pfd++) { pfd->pf_next = &phead; pfd->pf_prev = phead.pf_prev; phead.pf_prev->pf_next = pfd; phead.pf_prev = pfd; pfd->pf_flags = P_QUEUE; pfd->pf_use = 0; } /* * Add pages to queue, high memory at end of queue * Pages added to queue FIFO */ pfd = &pfdat[first]; E 9 E 5 for (i = freemem; --i >= 0; pfd++) { pfd->pf_next = &phead; pfd->pf_prev = phead.pf_prev; phead.pf_prev->pf_next = pfd; phead.pf_prev = pfd; pfd->pf_flags = P_QUEUE; pfd->pf_use = 0; } I 9 freemem += FIRSTFREE_PAGES ; E 9 } /* * Flush pages associated with an inode * ip -> pointer to inode table * returns: * none */ ipflush(ip) register struct inode *ip; { register int i; register pfd_t *pfd; register dev_t edev; /* Remove pages which are on the same device as * the requested inode. */ edev = ip->i_dev; for (i = firstfree,pfd = pfdat + i; i < maxfree; i++, pfd++) if((pfd->pf_dev == edev) && (pfd->pf_flags & P_HASH)) premove(pfd); } /* * Flush pages for mounted inode */ pmount(ip) register struct inode *ip; { bflush(ip->i_dev); ipflush(ip); } /* * flush all pages associated with a mount device * mp -> mount table entry * returns: * none */ punmount(mp) register struct mount *mp; { register int i; register struct pfdat *pfd; register struct inode *ip; bflush(mp->m_dev); for (ip = &inode[0]; ip < (struct inode *)v.ve_inode; ip++) { if (ip->i_dev == mp->m_dev) ipflush(ip); } for (i = firstfree,pfd = pfdat + i; i < maxfree; i++, pfd++) { if (mp->m_dev == pfd->pf_dev) if (pfd->pf_flags & P_HASH) premove(pfd); } } /* * Find page by looking on hash chain * dbd Ptr to disk block descriptor for block to remove. * returns: * 0 -> can't find it * i -> page frame # (index into pfdat) */ pbremove(rp, dbd) register struct region *rp; register dbd_t *dbd; { register struct pfdat *pfd; register struct pfdat *p; register daddr_t blkno; register dev_t dev; register ino_t inumber ; /* * Hash on block and look for match */ if (dbd->dbd_type == DBD_SWAP) { dev = swaptab[dbd->dbd_swpi].st_dev; blkno = dbd->dbd_blkno; inumber = 0 ; } else { register struct inode *ip; /* * For pages on a file (rather than swap), * we use the first of 1 or 4 block numbers * as the value to hash. */ ip = rp->r_iptr; ASSERT(ip != NULL); ASSERT(ip->i_map != NULL); dev = ip->i_dev; inumber = ip->i_number ; /* * The following kludge is because of the * overlapping text and data block in a 413 * object file. We hash shared pages on the * first of the 1 or 4 blocks wich make up * the page an private pages on the first * block. This means that the block which * has the end of the text and the beginning * of the data will be in the hash twice, * once as text and once as data. This is * necessary since the two cannot be shared. */ if (rp->r_type == RT_PRIVATE) blkno = dbd->dbd_blkno + 1 ; else blkno = dbd->dbd_blkno ; } for (p = &phash[blkno&phashmask]; pfd = p->pf_hchain; p = pfd) { if ((pfd->pf_blkno == blkno) && (pfd->pf_dev== dev) && (pfd->pf_inumber == inumber)) { # if PHASHLOGON == 1 phashlog[phashndx].type = 3; phashlog[phashndx].pfnum = pfd-pfdat; phashlog[phashndx].dbd = *dbd; phashlog[phashndx].dev = dev; phashlog[phashndx].blkno = blkno; phashlog[phashndx].process = (int)curproc; phashndx++; if (phashndx >= PHASHLGSZ) phashndx = 0; # endif p->pf_hchain = pfd->pf_hchain; pfd->pf_blkno = BLKNULL; pfd->pf_hchain = NULL; pfd->pf_flags &= ~P_HASH; pfd->pf_dev = 0; pfd->pf_inumber = 0 ; return(1); } } return(0); } /* * Reserve size memory pages. Returns with freemem * decremented by size. Return values: * 0 - Memory available immediately * 1 - Had to sleep to get memory */ memreserve(rp, size) register reg_t *rp; { register struct proc *p; extern char runout; ASSERT(!rp || rp->r_flags & RG_LOCK); if (freemem >= size) { freemem -= size; return(0); } if (rp != NULL) regrele(rp); p = u.u_procp; while (freemem < size) { if (runout) { runout = 0; wakeup((caddr_t)&runout); } p->p_stat = SXBRK; swtch(); } freemem -= size; if (rp != NULL) reglock(rp); return(1); } E 1 h07603 s 00001/00001/00472 d D 4.4 87/05/14 16:10:16 build 9 8 c removed old SCCS strings and inserted #ident BB e s 00001/00001/00472 d D 4.3 87/04/16 18:52:10 dc 8 7 c dc - Add Bull updates from 03/05/87 e s 00022/00022/00451 d D 4.2 87/04/15 17:48:03 dc 7 6 c dc - changed #include "sys/..." to #include e s 00000/00000/00473 d D 4.1 87/02/20 13:30:40 build 6 5 c rolled rev to -r4 /dc e s 00396/00039/00077 d D 3.2 87/01/26 13:35:43 build 5 4 c add page table changes /dc e s 00000/00000/00116 d D 3.1 87/01/19 09:22:57 build 4 3 c rolled rev to -r3 /dc e s 00000/00000/00116 d D 2.1 87/01/19 09:22:57 build 3 2 c AUTO NULL DELTA e s 00001/00000/00115 d D 1.2 87/01/16 10:16:36 build 2 1 c add ident string /dc e s 00115/00000/00000 d D 1.1 87/01/09 16:35:01 build 1 0 c Placed under source control - dc e u U f b f n t T I 2 D 8 /* "%W% %E%" */ E 8 I 8 D 9 /* " %W% %E% " */ E 9 I 9 #ident " %W% %E% " E 9 E 8 E 2 I 1 D 7 #include "sys/types.h" I 5 #include "sys/bitmasks.h" E 5 #include "sys/param.h" #include "sys/sysmacros.h" I 5 #include "sys/dir.h" #include "sys/signal.h" #include "sys/user.h" E 5 #include "sys/systm.h" D 5 #include "sys/page.h" E 5 I 5 #include "sys/sysinfo.h" E 5 #include "sys/map.h" I 5 #include "sys/seg.h" #include "sys/file.h" #include "sys/inode.h" #include "sys/page.h" #include "sys/region.h" #include "sys/buf.h" #include "sys/var.h" #include "sys/errno.h" #include "sys/proc.h" #include "sys/reg.h" #include "sys/pfdat.h" E 5 #include "sys/debug.h" E 7 I 7 #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include E 7 D 5 #define PGTMAPSIZE 512 E 5 I 5 #define PGTMAPSIZE 128 E 5 struct map pgtmap[PGTMAPSIZE] = {mapdata(PGTMAPSIZE)} ; I 5 int nptalloced ; int nptfree ; extern int (*allocator)() ; extern int freemem ; int getcpages() ; E 5 /* | Allocate sz page tables | | Description: | ----------- | first time we call ptmalloc routine | if ptmalloc return a null address then we call sptalloc to allocate | a new page in the system virtual space, put that page into the pgtmap | and recall of ptmalloc witch must not return a null addres. I 5 | | This page tables allocator is used until pfdat be initialised E 5 */ D 5 pgtalloc(npgtbls) E 5 I 5 startup_pgtalloc(npgtbls) E 5 { D 5 register unsigned int pgt_e ; register int nbytes ; E 5 I 5 register unsigned int pfn ; register int nbytes, npages ; E 5 nbytes = npgtbls << PTSZSHFT ; D 5 if ((pgt_e = (uint)ptmalloc(pgtmap,nbytes,NPGPT-1)) == 0) E 5 I 5 npages = btop(nbytes) ; if ((pfn = (uint)ptmalloc(pgtmap,nbytes,NPGPT-1)) == 0) E 5 { D 5 if((pgt_e = (uint)sptalloc(1,PG_V | PG_KW,0)) == 0) return(0) ; else { mfree(pgtmap,NBPP,pgt_e) ; pgt_e = (uint)ptmalloc(pgtmap,nbytes,NPGPT-1) ; } E 5 I 5 memreserve(NULL,1) ; pfn = ptob((*allocator)()) ; mfree(pgtmap,NBPP,pfn) ; pfn = (uint)ptmalloc(pgtmap,nbytes,NPGPT-1) ; E 5 } D 5 bzero(pgt_e,nbytes) ; return(pgt_e) ; E 5 I 5 bzero(ptol(pfn),nbytes) ; return((uint)ptol(pfn)) ; E 5 } D 5 /* | Description: | ----------- | call for mfree to free npgtbls page tables */ pgtfree(pgt_e, npgtbls) E 5 I 5 kpgtfree(pgt_e, npgtbls) E 5 register unsigned int pgt_e ; { D 5 mfree(pgtmap,npgtbls << PTSZSHFT,pgt_e) ; E 5 I 5 pgtfree(ptol(pgt_e), npgtbls) ; E 5 } D 5 /* | try to free system virtual space */ pgtsvfree() { register pgt_e ; /* try to free system virtual space */ while ((pgt_e = ptmalloc(pgtmap, NBPP, NBPP-1)) != 0) sptfree(pgt_e,1,1) ; } E 5 /* Allocate 'size' units from the given map, * returning the base of an area which starts on a "mask" boundary. * That is, which has all of the bits in "mask" off in the starting * address. Mask is assummed to be (2**N - 1). * Algorithm is first-fit. D 5 */ E 5 I 5 */ E 5 ptmalloc(mp, size, mask) struct map *mp; { register int a, b; register int gap, tail; register struct map *bp; ASSERT(size >= 0); for (bp = mapstart(mp); bp->m_size; bp++) { if (bp->m_size >= size) { a = bp->m_addr; b = (a+mask) & ~mask; gap = b - a; if (bp->m_size < (gap + size)) continue; if (gap != 0) { tail = bp->m_size - size - gap; bp->m_size = gap; if (tail) mfree(mp, tail, bp->m_addr+gap+size); } else { bp->m_addr += size; if ((bp->m_size -= size) == 0) { do { bp++; (bp-1)->m_addr = bp->m_addr; } while ((bp-1)->m_size = bp->m_size); mapsize(mp)++; } } return(b); } } return(0); I 5 } /* * pgtalloc(npgtbls) */ pgtalloc(npgtbls) { register int nbytes; register int pt; register pfd_t *pf; register int physaddr; register int i; register int j; if (npgtbls == 0) return(NULL); nbytes = npgtbls << PTSZSHFT; /* * If we are trying to allocate less than a full * page of page tables, then check the list of * pages which currently are being used for page * tables. */ if (npgtbls < NPTPP) { /* * Get mask with low npgtbls bits on. */ i = setmask[npgtbls]; for (pf = ptfree.pf_next ; pf != &ptfree ; pf = pf->pf_next) { /* * Try all positions of the mask to * find npgtbls contiguous page tables * in a page. */ for (j = 0 ; j <= NPTPP - npgtbls ; j++) { if ((pf->pf_use & (i << j)) == (i << j)) { /* * We have found the page * tables. Turn off their bits. * If no page tables are left in * the page, then remove page * from the page table list. */ pf->pf_use &= ~(i << j); if (pf->pf_use == 0) { pf->pf_prev->pf_next = pf->pf_next; pf->pf_next->pf_prev = pf->pf_prev; pf->pf_next = 0; pf->pf_prev = 0; } /* * Get address of page tables we * have allocated. Update the * free page table count and * clear the page tables. */ physaddr = ctob(pf - pfdat); pt = (int)ptol(physaddr); pt += j << PTSZSHFT; nptfree -= npgtbls; bzero((caddr_t)pt, nbytes); return(pt); } } } } /* * We could not allocate the required number of * contiguous page tables from a single page * of page tables on the free list. * Allocate some more kernel virtual address * space and physical memory for page tables. * Allocate an integral number of pages * to use for page tables. */ i = pttopgs(npgtbls); pt = getcpages(i); ASSERT((pt & POFFMASK) == 0); nptalloced += i << NPTPPSHFT; nptfree += i << NPTPPSHFT; /* * Clear the free page table bit masks for all * of the pages which we have just allocated. */ for (j = 0 ; j < i ; j++) { pf = &pfdat[btotp(kvtopfn(pt + ctob(j)))]; ASSERT((pf->pf_flags & (P_QUEUE | P_HASH)) == 0); pf->pf_use = 0; } /* * Add any unused page tables at the end of the * last page to the free list. */ j = npgtbls % NPTPP; if (j > 0) { pf = &pfdat[btotp(kvtopfn(pt + ctob(i-1)))]; ASSERT((pf->pf_flags & (P_QUEUE | P_HASH)) == 0); pf->pf_use = setmask[NPTPP - j] << j; pf->pf_next = ptfree.pf_next; pf->pf_prev = &ptfree; ptfree.pf_next->pf_prev = pf; ptfree.pf_next = pf; } /* * Update the count of the number of free page tables * and zero out the page tables we have just allocated. */ nptfree -= npgtbls; bzero((caddr_t)pt, nbytes); return(pt); } /* * Free previously allocated page tables */ pgtfree(pt, npgtbls) register int pt; register int npgtbls; { register int nfree; register int ndx; register pfd_t *pf; int pfn; if (npgtbls == 0) return; /* * Free the page tables and update the count of * free page tables. */ while (npgtbls > 0) { /* * Get a pointer to the pfdat for the page in which * we are freeing page tables. Compute the index * into the page of the first page table being freed. */ pfn = btotp(kvtopfn(pt)); pf = &pfdat[pfn] ; ndx = (pt - ctob(btoct(pt))) >> PTSZSHFT; ASSERT((pf->pf_flags & (P_QUEUE | P_HASH)) == 0); /* * Compute the number of page tables in this page * which we are freeing. */ nfree = min(npgtbls, NPTPP); if (((ctob(btoc(pt + 1)) - pt) >> PTSZSHFT) < nfree) nfree = (ctob(btoc(pt)) - pt) >> PTSZSHFT; /* * If the current page has no free page tables * and we are not going to free the entire * page, then put the pfdat on the free page * table list. */ if (pf->pf_use == 0 && nfree < NPTPP) { ASSERT(pf->pf_next == NULL); ASSERT(pf->pf_prev == NULL); pf->pf_next = ptfree.pf_next; pf->pf_prev = &ptfree; ptfree.pf_next->pf_prev = pf; ptfree.pf_next = pf; } /* * Set the appropriate bits in the pfdat. If * we free the entire page, then return it to * the system free space list and update the * physical to system virtual address map to * show that the page is no longer being used * for page tables. */ ASSERT((pf->pf_use & (setmask[nfree] << ndx)) == 0); pf->pf_use |= setmask[nfree] << ndx; if (pf->pf_use == setmask[NPTPP]) { /* * Remove pfdat from page table allocation * list and reset use count. */ if (nfree != NPTPP) { ASSERT(pf->pf_next != NULL); ASSERT(pf->pf_prev != NULL); pf->pf_prev->pf_next = pf->pf_next; pf->pf_next->pf_prev = pf->pf_prev; } pf->pf_use = 1; /* * Free the pages * Update the count of allocated * and free pages. */ freepage(pfn); nptalloced -= NPTPP; nptfree -= NPTPP - nfree; } else nptfree += nfree; npgtbls -= nfree; pt += nfree << PTSZSHFT; } } /* * getcpages(npgs) - gets physically continguous pages, * the kernel virtual address of the pages allocated. * is returned. * npgs = number of pages to be allocated. */ getcpages(npgs) { register int pfn; do { pfn = contmemall(npgs); if (pfn != NULL) return((int)ptol(ctob(pfn))); u.u_procp->p_stat = SXBRK; if (runout) { runout = 0; wakeup(&runout); } swtch(); } while (1); } /* * freepage(pfn) */ freepage(pfn) { pte_t base; base.pgm.pg_pfn = pfn; base.pgi.pg_pte |= PG_V ; pfree(NULL,&base,NULL,1); } /* * contmemall(npgs) * * allocate phycally contiguous pages */ contmemall(npgs) { register struct pfdat *pfd, *pfd1, *top; register struct pfdat *ph ; register int numpages; /* * Need contiguous memory */ if (freemem < npgs) return(NULL); ph = &phead ; pfd = ph->pf_next; top = &pfdat[physmem]; for (; pfd < top; pfd++) { if (pfd->pf_flags & P_QUEUE) { for (pfd1 = pfd + 1, numpages = npgs ; pfd1 <= top && --numpages > 0 ; pfd1++) if (!(pfd1->pf_flags & P_QUEUE)) break; if (numpages == 0) break; pfd = pfd1; } } if (pfd >= top) return(NULL); ASSERT(pfd1 <= top); ASSERT(pfd1 - pfd == npgs); /* * Take pages *pfd .. *(--pfd1) */ for (; --pfd1 >= pfd;) { (pfd1->pf_prev)->pf_next = pfd1->pf_next; (pfd1->pf_next)->pf_prev = pfd1->pf_prev; pfd1->pf_next = NULL; pfd1->pf_prev = NULL; if (pfd1->pf_flags&P_HASH) premove(pfd1); pfd1->pf_blkno = BLKNULL; pfd1->pf_use = 1; pfd1->pf_flags = 0; } freemem -= npgs; return(pfd - pfdat); E 5 } E 1 h42834 s 00001/00001/00296 d D 4.4 87/05/14 16:10:28 build 10 9 c removed old SCCS strings and inserted #ident BB e s 00008/00010/00289 d D 4.3 87/04/16 18:53:29 dc 9 8 c dc - Add Bull updates from 03/05/87 e s 00019/00019/00280 d D 4.2 87/04/15 17:48:12 dc 8 7 c dc - changed #include "sys/..." to #include e s 00000/00000/00299 d D 4.1 87/02/20 13:30:46 build 7 6 c rolled rev to -r4 /dc e s 00004/00004/00295 d D 3.3 87/01/29 15:46:07 build 6 5 c change svtop to btotp e s 00034/00023/00265 d D 3.2 87/01/26 13:37:55 build 5 4 c add page table changes /dc e s 00000/00000/00288 d D 3.1 87/01/19 09:23:00 build 4 3 c rolled rev to -r3 /dc e s 00000/00000/00288 d D 2.1 87/01/19 09:23:00 build 3 2 c AUTO NULL DELTA e s 00001/00000/00287 d D 1.2 87/01/16 10:16:39 build 2 1 c add ident string /dc e s 00287/00000/00000 d D 1.1 87/01/09 16:35:03 build 1 0 c Placed under source control - dc e u U f b f n t T I 2 D 9 /* "%W% %E%" */ E 9 I 9 D 10 /* " %W% %E% " */ E 10 I 10 #ident " %W% %E% " E 10 E 9 E 2 I 1 D 8 #include "sys/types.h" #include "sys/param.h" #include "sys/sysmacros.h" #include "sys/systm.h" #include "sys/sysinfo.h" #include "sys/dir.h" #include "sys/map.h" #include "sys/signal.h" #include "sys/user.h" #include "sys/errno.h" #include "sys/buf.h" #include "sys/conf.h" #include "sys/var.h" #include "sys/inode.h" #include "sys/page.h" #include "sys/seg.h" #include "sys/region.h" #include "sys/proc.h" #include "sys/swap.h" E 8 I 8 #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include E 8 D 5 #include "sys/vrt.h" E 5 /* * Pick up the device's error number and pass it to the user; * if there is an error but the number is 0 set a generalized * code. Actually the latter is always true because devices * don't yet return specific errors. D 5 */ E 5 I 5 D 9 */ E 9 I 9 */ E 9 E 5 D 5 /* Max. number of pages to swap per I/O */ E 5 I 5 D 9 /* * Max. number of pages to swap per I/O */ E 9 I 9 /* Max. number of pages to swap per I/O */ E 9 E 5 #define NPAGE MAXBLK /* * swap I/O D 5 */ E 5 I 5 D 9 */ E 9 I 9 */ E 9 E 5 swap(dbd, ptbl, npage, rdflg) dbd_t *dbd; D 5 register spte_t *ptbl; E 5 I 5 register pte_t *ptbl; E 5 { register struct buf *bp; register int blkno; register int c; register dev_t dev; int ospl; struct proc *p; p = u.u_procp; syswait.swap++; ospl = splhi(); dev = swaptab[dbd->dbd_swpi].st_dev; blkno = dbd->dbd_blkno; while ((bp = pfreelist.av_forw) == NULL) { pfreelist.b_flags |= B_WANTED; sleep((caddr_t)&pfreelist, PRIBIO+1); } pfreelist.av_forw = bp->av_forw; spl0(); bp->b_proc = p; bp->b_flags = B_BUSY | B_PHYS | B_PT | rdflg; bp->b_dev = dev; bp->b_pt = ptbl; p->p_flag |= SLOCK; while (npage > 0) { bp->b_bcount = ptob((c = npage>NPAGE ? NPAGE : npage)); bp->b_blkno = blkno; (*bdevsw[bmajor(dev)].d_strategy)(bp); u.u_iosw++; if (rdflg) { sysinfo.swapin++; D 9 sysinfo.bswapin += c; E 9 I 9 sysinfo.bswapin += ptod(c) ; E 9 } else { sysinfo.swapout++; D 9 sysinfo.bswapout += c; E 9 I 9 sysinfo.bswapout += ptod(c) ; E 9 } spl6(); while((bp->b_flags&B_DONE)==0) sleep((caddr_t)bp, PSWP); spl0(); if (bp->b_flags & B_ERROR) panic("IO err in swap"); bp->b_pt += c; bp->b_flags &= ~B_DONE; npage -= c; blkno += ptod(c); } p->p_flag &= ~SLOCK; splhi(); bp->av_forw = pfreelist.av_forw; pfreelist.av_forw = bp; if (pfreelist.b_flags&B_WANTED) { pfreelist.b_flags &= ~B_WANTED; wakeup((caddr_t)&pfreelist); } splx(ospl); syswait.swap--; } /* * Raw I/O. The arguments are * The strategy routine for the device * A buffer, which is usually NULL, or special buffer * header owned exclusively by the device for this purpose * The device number * Read/write flag D 5 */ E 5 I 5 D 9 */ E 9 I 9 */ E 9 E 5 physio(strat, bp, dev, rw) register struct buf *bp; int (*strat)(); { register int c,gap ; int ocount; int hpf; D 5 register vrte_t *vrt_e ; E 5 I 5 register struct proc *p ; register sgte_t *st ; register scte_t *sct ; register int i ; E 5 ocount = u.u_count; /* if (u.u_count == 0 || u.u_count > ptob(MAXBLK)) { printf("physio: u_count invalid (%x)\n", u.u_count); u.u_error = EFAULT; return; } */ if (useracc(u.u_base, (int) u.u_count, rw | B_PHYS) == NULL) { printf("physio: useracc failed\n"); u.u_error = EFAULT; return; } if (rw) sysinfo.phread++; else sysinfo.phwrite++; syswait.physio++; hpf = (bp == NULL); spl6(); if (hpf) { while ((bp = pfreelist.av_forw) == NULL) { pfreelist.b_flags |= B_WANTED; sleep((caddr_t)&pfreelist, PRIBIO+1); } pfreelist.av_forw = bp->av_forw; } else while (bp->b_flags&B_BUSY) { bp->b_flags |= B_WANTED; sleep((caddr_t)bp, PRIBIO+1); } I 5 p = u.u_procp ; E 5 bp->b_flags = B_BUSY | B_PHYS | B_PT | rw; bp->b_error = 0; D 5 bp->b_proc = u.u_procp; E 5 I 5 bp->b_proc = p; E 5 bp->b_un.b_addr = u.u_base; bp->b_dev = dev; D 5 bp->b_pt=upte(u.u_procp,svtop(u.u_base)); E 5 I 5 D 6 i = svtop(u.u_base) ; E 6 I 6 i = btotp(u.u_base) ; E 6 sct = p->p_sct + ((i & L2MASK) >> (L1WIDTH+L0WIDTH)) ; st = (sgte_t *)ptol(sct->sgt_paddr) + ((i & L1MASK) >> L0WIDTH) ; bp->b_pt= (pte_t *)ptol(sttop(st->pt_paddr)) + (i & L0MASK) ; E 5 D 5 u.u_procp->p_flag |= SLOCK; E 5 I 5 p->p_flag |= SLOCK; E 5 while ((int)u.u_count > 0 && (bp->b_flags & B_ERROR) ==0) { D 6 gap = NPGPT - (svtop(bp->b_un.b_addr) & L0MASK) ; E 6 I 6 gap = NPGPT - (btotp(bp->b_un.b_addr) & L0MASK) ; E 6 bp->b_bcount = c = min(gap > MAXBLK ? MAXBLK*NBPP : gap*NBPP ,u.u_count) ; bp->b_blkno = u.u_offset >> BSHIFT; bp->b_flags &= ~B_DONE; (*strat)(bp); for (;;) { spl6(); if (bp->b_flags&B_DONE) break; sleep((caddr_t)bp, PRIBIO); } /* spl0(); */ bp->b_un.b_addr += c; D 5 bp->b_pt = upte(u.u_procp,svtop(bp->b_un.b_addr)) ; E 5 I 5 D 6 i = svtop(bp->b_un.b_addr) ; E 6 I 6 i = btotp(bp->b_un.b_addr) ; E 6 sct = p->p_sct + ((i & L2MASK) >> (L1WIDTH+L0WIDTH)) ; st = (sgte_t *)ptol(sct->sgt_paddr) + ((i & L1MASK) >> L0WIDTH) ; bp->b_pt = (pte_t *)ptol(sttop(st->pt_paddr)) + (i & L0MASK) ; E 5 u.u_count -= c; u.u_offset += c; } D 5 u.u_procp->p_flag &= ~SLOCK; E 5 I 5 p->p_flag &= ~SLOCK; E 5 if (runin) { runin = 0; wakeup(&runin); } /* * unlock pages, and force modify if B_read D 5 */ E 5 I 5 D 9 */ E 9 I 9 */ E 9 E 5 { register int np,i ; D 5 register pte_t *pt,**st ; E 5 I 5 register pte_t *pt ; register sgte_t *st ; register scte_t *sct ; E 5 register paddr_t vaddr ; np = btop(ocount) ; vaddr = (paddr_t)u.u_base ; D 5 st = uste(u.u_procp,svtop(vaddr)) ; E 5 while (np) { D 5 i = svtop(vaddr) & L0MASK ; pt = *st + i ; E 5 I 5 D 6 i = svtop(vaddr) ; E 6 I 6 i = btotp(vaddr) ; E 6 sct = p->p_sct + ((i & L2MASK) >> (L1WIDTH+L0WIDTH)) ; st = (sgte_t *)ptol(sct->sgt_paddr) + ((i & L1MASK) >> L0WIDTH) ; pt = (pte_t *)ptol(sttop(st->pt_paddr)) + (i & L0MASK) ; i &= L0MASK ; E 5 for ( ; i < NPGPT && np ; i++ , np--) { D 5 pt->pgm.pg_lock=0; E 5 I 5 pt->pgi.pg_pte &= ~PG_LOCK ; E 5 if (rw == B_READ) D 5 { vrt_e = vrt_find(pt,u.u_procp->p_dsegno) ; vrt_e->pg_d = VRT_M ; } E 5 I 5 pt->pgi.pg_pte |= PG_M ; E 5 vaddr += NBPP ; pt++ ; } D 5 st++ ; E 5 } } if (hpf) { bp->av_forw = pfreelist.av_forw; pfreelist.av_forw = bp; if (pfreelist.b_flags&B_WANTED) { pfreelist.b_flags &= ~B_WANTED; wakeup((caddr_t)&pfreelist); } } else if (bp->b_flags&B_WANTED) wakeup((caddr_t)bp); spl0(); bp->b_flags &= ~(B_BUSY|B_WANTED|B_PHYS|B_PT); u.u_count = bp->b_resid; geterror(bp); syswait.physio--; } physck(nblocks, rw) daddr_t nblocks; { register unsigned over; register off_t upper, limit; struct a { int fdes; char *cbuf; unsigned count; } *uap; if (((paddr_t)u.u_base & (4096-1)) || (u.u_count & (4096-1)) || (u.u_offset & (4096-1))) { u.u_error = EFAULT ; return(0) ; } limit = nblocks << BSHIFT; if (u.u_offset >= limit) { if (u.u_offset > limit || rw == B_WRITE) u.u_error = ENXIO; return(0); } upper = u.u_offset + u.u_count; if (upper > limit) { over = upper - limit; u.u_count -= over; uap = (struct a *)u.u_ap; uap->count -= over; } return(1); } E 1 h06260 s 00001/00001/00154 d D 4.4 87/05/14 16:10:39 build 8 7 c removed old SCCS strings and inserted #ident BB e s 00001/00002/00154 d D 4.3 87/04/16 18:54:02 dc 7 6 c dc - Add Bull updates from 03/05/87 e s 00009/00009/00147 d D 4.2 87/04/15 17:48:20 dc 6 5 c dc - changed #include "sys/..." to #include e s 00000/00000/00156 d D 4.1 87/02/20 13:30:49 build 5 4 c rolled rev to -r4 /dc e s 00000/00000/00156 d D 3.1 87/01/19 09:23:02 build 4 3 c rolled rev to -r3 /dc e s 00000/00000/00156 d D 2.1 87/01/19 09:23:02 build 3 2 c AUTO NULL DELTA e s 00001/00000/00155 d D 1.2 87/01/16 10:16:42 build 2 1 c add ident string /dc e s 00155/00000/00000 d D 1.1 87/01/09 16:35:04 build 1 0 c Placed under source control - dc e u U f b f n t T I 2 D 7 /* "%W% %E%" */ E 2 I 1 /* @(#)pipe.c 6.1 */ E 7 I 7 D 8 /* " %W% %E% " */ E 8 I 8 #ident " %W% %E% " E 8 E 7 D 6 #include "sys/param.h" #include "sys/types.h" #include "sys/systm.h" #include "sys/dir.h" #include "sys/signal.h" #include "sys/user.h" #include "sys/errno.h" #include "sys/inode.h" #include "sys/file.h" E 6 I 6 #include #include #include #include #include #include #include #include #include E 6 /* * The sys-pipe entry. * Allocate an inode on the root device. * Allocate 2 file structures. * Put it all together with flags. */ pipe() { register struct inode *ip; register struct file *rf, *wf; int r; ip = ialloc(pipedev, IFIFO, 0); if(ip == NULL) return; rf = falloc(ip, FREAD); if(rf == NULL) { iput(ip); return; } r = u.u_rval1; wf = falloc(ip, FWRITE); if(wf == NULL) { rf->f_count = 0; rf->f_next = ffreelist; ffreelist = rf; u.u_ofile[r] = NULL; iput(ip); return; } u.u_rval2 = u.u_rval1; u.u_rval1 = r; ip->i_count = 2; ip->i_frcnt = 1; ip->i_fwcnt = 1; prele(ip); } /* * Open a pipe * Check read and write counts, delay as necessary */ openp(ip, mode) register struct inode *ip; register mode; { if (mode&FREAD) { if (ip->i_frcnt++ == 0) wakeup((caddr_t)&ip->i_frcnt); } if (mode&FWRITE) { if (mode&FNDELAY && ip->i_frcnt == 0) { u.u_error = ENXIO; return; } if (ip->i_fwcnt++ == 0) wakeup((caddr_t)&ip->i_fwcnt); } if (mode&FREAD) { while (ip->i_fwcnt == 0) { if (mode&FNDELAY || ip->i_size) return; sleep(&ip->i_fwcnt, PPIPE); } } if (mode&FWRITE) { while (ip->i_frcnt == 0) sleep(&ip->i_frcnt, PPIPE); } } /* * Close a pipe * Update counts and cleanup */ closep(ip, mode) register struct inode *ip; register mode; { register i; daddr_t bn; if (mode&FREAD) { if ((--ip->i_frcnt == 0) && (ip->i_fflag&IFIW)) { ip->i_fflag &= ~IFIW; wakeup((caddr_t)&ip->i_fwcnt); } } if (mode&FWRITE) { if ((--ip->i_fwcnt == 0) && (ip->i_fflag&IFIR)) { ip->i_fflag &= ~IFIR; wakeup((caddr_t)&ip->i_frcnt); } } if ((ip->i_frcnt == 0) && (ip->i_fwcnt == 0)) { for (i=NFADDR-1; i>=0; i--) { bn = ip->i_faddr[i]; if (bn == (daddr_t)0) continue; ip->i_faddr[i] = (daddr_t)0; free(ip->i_dev, bn); } ip->i_size = 0; ip->i_frptr = 0; ip->i_fwptr = 0; ip->i_flag |= IUPD|ICHG; } } /* * Lock a pipe. * If its already locked, * set the WANT bit and sleep. */ plock(ip) register struct inode *ip; { while(ip->i_flag&ILOCK) { ip->i_flag |= IWANT; sleep((caddr_t)ip, PINOD); } ip->i_flag |= ILOCK; } /* * Unlock a pipe. * If WANT bit is on, * wakeup. * This routine is also used * to unlock inodes in general. */ prele(ip) register struct inode *ip; { ip->i_flag &= ~ILOCK; if(ip->i_flag&IWANT) { ip->i_flag &= ~IWANT; wakeup((caddr_t)ip); } } E 1 h50264 s 00001/00001/00226 d D 4.5 87/05/14 16:10:53 build 9 8 c removed old SCCS strings and inserted #ident BB e s 00061/00013/00166 d D 4.4 87/04/16 18:56:58 dc 8 7 c dc - Add Bull updates from 03/05/87 e s 00007/00007/00172 d D 4.3 87/04/15 17:48:27 dc 7 6 c dc - changed #include "sys/..." to #include e s 00000/00001/00179 d D 4.2 87/02/22 16:57:17 build 6 5 c make print bump arglist by 1 int for each arg. e s 00000/00000/00180 d D 4.1 87/02/20 13:30:52 build 5 4 c rolled rev to -r4 /dc e s 00000/00000/00180 d D 3.1 87/01/19 09:23:05 build 4 3 c rolled rev to -r3 /dc e s 00000/00000/00180 d D 2.1 87/01/19 09:23:05 build 3 2 c AUTO NULL DELTA e s 00001/00000/00179 d D 1.2 87/01/16 10:16:46 build 2 1 c add ident string /dc e s 00179/00000/00000 d D 1.1 87/01/09 16:35:05 build 1 0 c Placed under source control - dc e u U f b f n t T I 2 D 8 /* "%W% %E%" */ E 8 I 8 D 9 /* " %W% %E% " */ E 9 I 9 #ident " %W% %E% " E 9 E 8 E 2 I 1 D 7 #include "sys/param.h" #include "sys/types.h" #include "sys/sysmacros.h" #include "sys/systm.h" #include "sys/page.h" #include "sys/buf.h" #include "sys/conf.h" E 7 I 7 #include #include #include #include #include #include #include I 8 #include E 8 E 7 /* * In case console is off, * panicstr contains argument to last call to panic. */ char *panicstr; I 8 char pr_time ; /* if set, print time in front of message */ extern time_t time ; E 8 /* * Scaled down version of C Library printf. * Only %s %u %d (==%u) %o %x %D are recognized. * Used to print diagnostic information * directly on console tty. * Since it is not interrupt driven, * all system activities are pretty much suspended. * Printf should not be used for chit-chat. */ printf(fmt, x1) { print(fmt, &x1) ; } print(fmt, adx) register char *fmt; register unsigned int *adx; { register c; char *s; int count; loop: count = 0; while((c = *fmt++) != '%') { if(c == '\0') return; D 8 putchar(c); E 8 I 8 printc(c); if (c == '\n' && time) pr_time++ ; E 8 } c = *fmt++; while (c >= '0' && c <= '9') { count = count * 10 + c - '0'; c = *fmt++; } if(c == 'd' || c == 'u' || c == 'o' || c == 'x') printn((long)*adx, c=='o'? 8: (c=='x'? 16:10),count); else if(c == 's') { s = (char *)*adx; while(c = *s++) D 8 putchar(c); E 8 I 8 printc(c); E 8 } else if (c == 'c') { D 8 putchar((char)*adx); E 8 I 8 printc((char)*adx); E 8 } else if (c == 'D') { printn(*(long *)adx, 10,count); adx += (sizeof(long) / sizeof(int)) - 1; } adx++; D 6 adx++; E 6 goto loop; } printn(n, b, count) long n; register b; int count; { register i, nd, c; int flag; int plmax; int t; char d[12]; c = 1; flag = ((n < 0) && (n != 0x80000000)); if (flag) n = (-n); if (b==8) plmax = 11; else if (b==10) plmax = 10; else if (b==16) plmax = 8; if (flag && b==10) { flag = 0; D 8 putchar('-'); E 8 I 8 printc('-'); E 8 } for (i=0;i= b) { nd -= b; c = 1; } else c = 0; } d[i] = nd; n = n/b; if ((n==0) && (flag==0)) break; } if (i==plmax) i--; t = i; while (++t < count) D 8 putchar('0'); E 8 I 8 printc('0'); E 8 for (;i>=0;i--) { D 8 putchar("0123456789ABCDEF"[d[i]]); E 8 I 8 printc("0123456789ABCDEF"[d[i]]); E 8 } } I 8 long pr_hour, pr_dst ; printc(c) register c ; { if (pr_time && c != '\n') { register h, m, s ; if (time/3600 != pr_hour) { pr_hour = time/3600 ; pr_dst = timelap(time) ; } h = (time + pr_dst) % 86400 ; s = h % 60 ; h /= 60 ; m = h % 60 ; h /= 60 ; pr_time = 0 ; printf("%d%d:%d%d:%d%d ", h/10, h%10, m/10, m%10, s/10, s%10) ; } putchar(c) ; smwrite(c) ; } E 8 /* * Panic is called on unresolvable fatal errors. * It syncs, prints "panic: mesg" and then loops. */ panic(s) char *s; { I 8 int i; i=splhi(); /* gets interrupt level */ splx(i); /* resets level */ E 8 if (s && panicstr) printf("Double panic: %s\n", s); else { if (s) panicstr = s; D 8 update(); E 8 I 8 if (i==0) update(); E 8 printf("panic: %s\n", panicstr); } I 8 if (i==0) smdsync() ; call_rbug(RBUG) ; E 8 for(;;) idle(); } /* * prdev prints a warning message. * dev is a block special device argument. */ prdev(str, dev) char *str; dev_t dev; { register maj; maj = bmajor(dev); if (maj >= bdevcnt) { D 8 printf("%s on bad dev %d(8)\n", str, dev); E 8 I 8 printf("%s on dev %d,%d\n", str, maj, minor(dev)); E 8 return; } (*bdevsw[maj].d_print)(minor(dev), str); } /* * prcom prints a diagnostic from a device driver. * prt is device dependent print routine. */ prcom(prt, bp, er1, er2) int (*prt)(); register struct buf *bp; { D 8 (*prt)(bp->b_dev, "\nDevice error"); printf("bn = %D er = %x,%x\n", bp->b_blkno, er1, er2); E 8 I 8 (*prt)(bp->b_dev, "device error"); printf(" bn = %d er = %x,%x\n", bp->b_blkno, er1, er2); E 8 } assfail(a, f, l) char *a, *f; { printf("assertion failed: %s, file: %s, line: %d\n", a, f, l); D 8 #ifdef OSDEBUG E 8 I 8 #ifdef KDB E 8 call_debug() ; #else panic("assertion error"); D 8 #endif E 8 I 8 } /* * provfl prints a configurable table overflow */ provfl(s1, s2) char *s1, *s2 ; { printf("WARNING: system table overflow: %s (%s)\n", s1, s2) ; E 8 } E 1 h16561 s 00001/00001/00117 d D 4.4 87/05/14 16:11:03 build 10 9 c removed old SCCS strings and inserted #ident BB e s 00010/00010/00108 d D 4.3 87/04/16 18:59:35 dc 9 8 c dc - Add Bull updates from 03/05/87 e s 00018/00018/00100 d D 4.2 87/04/15 17:48:34 dc 8 7 c dc - changed #include "sys/..." to #include e s 00000/00000/00118 d D 4.1 87/02/20 13:30:55 build 7 6 c rolled rev to -r4 /dc e s 00002/00002/00116 d D 3.3 87/01/29 15:46:41 build 6 5 c change svtop to btotp e s 00037/00028/00081 d D 3.2 87/01/26 15:37:32 build 5 4 c add page table changes /dc e s 00000/00000/00109 d D 3.1 87/01/19 09:23:07 build 4 3 c rolled rev to -r3 /dc e s 00000/00000/00109 d D 2.1 87/01/19 09:23:07 build 3 2 c AUTO NULL DELTA e s 00001/00000/00108 d D 1.2 87/01/16 10:16:49 build 2 1 c add ident string /dc e s 00108/00000/00000 d D 1.1 87/01/09 16:35:06 build 1 0 c Placed under source control - dc e u U f b f n t T I 2 D 9 /* "%W% %E%" */ E 9 I 9 D 10 /* " %W% %E% " */ E 10 I 10 #ident " %W% %E% " E 10 E 9 E 2 I 1 D 8 #include "sys/types.h" #include "sys/param.h" #include "sys/sysmacros.h" #include "sys/dir.h" #include "sys/signal.h" #include "sys/user.h" #include "sys/page.h" #include "sys/region.h" #include "sys/proc.h" #include "sys/text.h" #include "sys/systm.h" #include "sys/sysinfo.h" #include "sys/file.h" #include "sys/inode.h" #include "sys/buf.h" #include "sys/var.h" #include "sys/ipc.h" #include "sys/errno.h" E 8 I 8 #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include E 8 useracc(vaddr, length, code) register caddr_t vaddr; register int length; { D 5 register int i; E 5 I 5 register int i,j; E 5 register pte_t *pt ; D 5 register pte_t **st,**save_st ; E 5 I 5 register sgte_t *st ; register scte_t *sct ; E 5 register int olen,lengthp ; D 5 register ushort segno ; E 5 caddr_t vaddr_lim ; I 5 register struct proc *p ; E 5 if ((uint)vaddr >= USRSTACK) return(0) ; D 5 segno = u.u_procp->p_dsegno ; E 5 I 5 p = u.u_procp ; E 5 lengthp = ((length-1+(int)vaddr) >> BPPSHIFT)-(((int)vaddr) >> BPPSHIFT) +1; vaddr_lim = vaddr + length ; if ((uint)vaddr_lim >= USRSTACK) return(0) ; D 5 save_st = st = uste(u.u_procp,svtop(vaddr)) ; E 5 olen = length = lengthp ; while (length > 0) { D 5 if (!*st) E 5 I 5 D 6 i = svtop(vaddr) ; E 6 I 6 i = btotp(vaddr) ; E 6 sct = p->p_sct + ((i & L2MASK) >> (L1WIDTH+L0WIDTH)) ; if (!sct->sgt_paddr) E 5 return(0) ; D 5 i = svtop(vaddr) & L0MASK ; pt = *st + i ; E 5 I 5 st = (sgte_t *)ptol(sct->sgt_paddr) + ((i & L1MASK) >> L0WIDTH) ; if (!st->pt_paddr) return(0) ; pt = (pte_t *)ptol(sttop(st->pt_paddr)) + (i & L0MASK) ; i &= L0MASK ; E 5 for ( ; i < NPGPT && length > 0 ; i++,length--) { if (!pt->pgi.pg_pte) return(0) ; D 9 if (code&B_READ == 0) E 9 I 9 if (code&B_READ) E 9 { /* D 5 * write memory */ if (pt->pgm.pg_prot != PTE_UW) E 5 I 5 D 9 * Write memory */ E 9 I 9 * write memory */ E 9 if (!(pt->pgi.pg_pte & PG_W)) E 5 { D 5 if (pt->pgm.pg_cw) E 5 I 5 if (st->pt_w) E 5 { /* D 5 * if physio, then break CW; E 5 I 5 D 9 * If physio, then break CW; E 9 I 9 * if physio, then break CW; E 9 E 5 * simulate a page fault D 5 */ E 5 I 5 D 9 */ E 9 I 9 */ E 9 E 5 if (code&B_PHYS) D 5 pfault(vaddr) ; } else E 5 I 5 { j = fubyte(vaddr) ; subyte(vaddr,j) ; } } else E 5 return(0); } } vaddr += NBPP ; pt++ ; } D 5 st++ ; E 5 } /* D 5 * lock pages for physio */ E 5 I 5 D 9 * Lock pages for physio */ E 9 I 9 * lock pages for physio */ E 9 E 5 if (code&B_PHYS) { length = olen ; vaddr -= length*NBPP ; D 5 st = save_st ; E 5 while (length > 0) { D 5 i = svtop(vaddr) & L0MASK ; pt = (pte_t *)(*st + i) ; E 5 I 5 D 6 i = svtop(vaddr) ; E 6 I 6 i = btotp(vaddr) ; E 6 sct = p->p_sct + ((i & L2MASK) >> (L1WIDTH+L0WIDTH)) ; st = (sgte_t *)ptol(sct->sgt_paddr) + ((i & L1MASK) >> L0WIDTH) ; pt = (pte_t *)ptol(sttop(st->pt_paddr)) + (i & L0MASK) ; i &= L0MASK ; E 5 for ( ; i < NPGPT && length > 0 ; i++ , length--) { /* D 5 * simulate a page fault E 5 I 5 D 9 * simulate a page fault E 9 I 9 * simulate a page fault E 9 E 5 */ D 5 while (!pt->pgm.pg_v) vfault(vaddr,DATA_FAULT) ; E 5 I 5 while (!(pt->pgi.pg_pte & PG_V)) j = fubyte(vaddr) ; E 5 /* D 5 * and lock in working set E 5 I 5 D 9 * and lock in working set E 9 I 9 * and lock in working set E 9 E 5 */ D 5 pt->pgm.pg_lock = PT_LOCK; E 5 I 5 pt->pgi.pg_pte |= PG_LOCK; E 5 vaddr += NBPP; pt++ ; } D 5 st ++ ; E 5 } } return(1); } E 1 h09996 s 00001/00001/00281 d D 4.4 87/05/14 16:11:16 build 9 8 c removed old SCCS strings and inserted #ident BB e s 00007/00010/00275 d D 4.3 87/04/16 19:00:05 dc 8 7 c dc - Add Bull updates from 03/05/87 e s 00019/00019/00266 d D 4.2 87/04/15 17:48:42 dc 7 6 c dc - changed #include "sys/..." to #include e s 00000/00000/00285 d D 4.1 87/02/20 13:30:58 build 6 5 c rolled rev to -r4 /dc e s 00002/00000/00283 d D 3.2 87/02/13 14:09:17 build 5 4 c add bull changes from Jan 23 /dc e s 00000/00000/00283 d D 3.1 87/01/19 09:23:10 build 4 3 c rolled rev to -r3 /dc e s 00000/00000/00283 d D 2.1 87/01/19 09:23:10 build 3 2 c AUTO NULL DELTA e s 00001/00000/00282 d D 1.2 87/01/16 10:16:52 build 2 1 c add ident string /dc e s 00282/00000/00000 d D 1.1 87/01/09 16:35:07 build 1 0 c Placed under source control - dc e u U f b f n t T I 2 D 8 /* "%W% %E%" */ E 8 I 8 D 9 /* " %W% %E% " */ E 9 I 9 #ident " %W% %E% " E 9 E 8 E 2 I 1 D 7 #include "sys/param.h" #include "sys/types.h" #include "sys/sysmacros.h" #include "sys/systm.h" #include "sys/dir.h" #include "sys/signal.h" #include "sys/user.h" #include "sys/errno.h" #include "sys/page.h" #include "sys/region.h" #include "sys/proc.h" #include "sys/inode.h" #include "sys/file.h" #include "sys/reg.h" #include "sys/text.h" #include "sys/seg.h" #include "sys/var.h" #include "sys/psl.h" #include "sys/pfdat.h" E 7 I 7 #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include E 7 /* * Priority for tracing */ #define IPCPRI PZERO /* * Tracing variables. * Used to pass trace command from * parent to child being traced. * This data base cannot be * shared and is locked * per user. */ struct { int ip_lock; int ip_req; int *ip_addr; int ip_data; } ipc; /* * Enter the tracing STOP state. * In this state, the parent is * informed and the process is able to * receive commands from the parent. */ stop() { register struct proc *pp; register struct proc *cp; register preg_t *prp; /* Put the region sizes into the u-block for the * parent to look at if he wishes. */ pp = u.u_procp; if (prp = findpreg(pp, PT_TEXT)) u.u_tsize = prp->p_reg->r_pgsz; else u.u_tsize = 0; if (prp = findpreg(pp, PT_DATA)) u.u_dsize = prp->p_reg->r_pgsz; else u.u_dsize = 0; if (prp = findpreg(pp, PT_STACK)) u.u_ssize = prp->p_reg->r_pgsz; else u.u_ssize = 0; loop: cp = u.u_procp; if (cp->p_ppid != 1) for (pp = &proc[0]; pp < (struct proc *)v.ve_proc; pp++) if (pp->p_pid == cp->p_ppid) { wakeup((caddr_t)pp); cp->p_stat = SSTOP; swtch(); if ((cp->p_flag&STRC)==0 || procxmt()) return; goto loop; } exit(fsig(u.u_procp->p_sig)); } /* * sys-trace system call. */ ptrace() { register struct proc *p; register struct a { int req; int pid; int *addr; int data; } *uap; uap = (struct a *)u.u_ap; D 8 if (uap->req <= 0) E 8 I 8 if (uap->req == 0) E 8 { u.u_procp->p_flag |= STRC; return; } for (p=proc; p < (struct proc *)v.ve_proc; p++) if (p->p_stat==SSTOP && p->p_pid==uap->pid && p->p_ppid==u.u_procp->p_pid) goto found; u.u_error = ESRCH; return; found: while (ipc.ip_lock) sleep((caddr_t)&ipc, IPCPRI); ipc.ip_lock = p->p_pid; ipc.ip_data = uap->data; ipc.ip_addr = uap->addr; ipc.ip_req = uap->req; p->p_flag &= ~SWTED; setrun(p); while (ipc.ip_req > 0) sleep((caddr_t)&ipc, IPCPRI); u.u_rval1 = ipc.ip_data; I 5 u.u_rval2 = 0 ; /* to distinguish a valid return of -1 from an error using the value of R1 */ E 5 if (ipc.ip_req < 0) u.u_error = EIO; ipc.ip_lock = 0; wakeup((caddr_t)&ipc); } int ipcreg[] = {R0, R1, R2, R3, R4, R5, R6, R7, R8, R9, R10, R11, R12, R13, R14, R15, PC}; /* * Code that the child process * executes to implement the command * of the parent process in tracing. */ procxmt() { register int i; register *p; if (ipc.ip_lock != u.u_procp->p_pid) return(0); i = ipc.ip_req; ipc.ip_req = 0; switch (i) { /* read user I */ case 1: ipc.ip_data = fuiword((caddr_t)ipc.ip_addr); break; /* read user D */ case 2: ipc.ip_data = fuword((caddr_t)ipc.ip_addr); break; /* read u */ case 3: i = (int)ipc.ip_addr; if (i<0 || i >= ptob(USIZE)) goto error; ipc.ip_data = ((physadr)&u)->r[i>>2]; break; /* write user I */ /* Must set up to allow writing */ case 4: { register preg_t *prp; prp = findpreg(u.u_procp, PT_TEXT); if (prp && (prp->p_flags & PF_RDONLY)) { if (prp->p_reg->r_refcnt != 1 || prp->p_reg->r_flags & RG_NOFREE) goto error; chgprot(prp, SEG_RW); } else prp = NULL; i = suiword((caddr_t)ipc.ip_addr, ipc.ip_data); if (prp) chgprot(prp, SEG_RO); if (i >= 0) { /* * The write worked. Break the disk association * of the page since it has been modified. * Note: the word can straddle two pages. */ dirtypage((caddr_t)ipc.ip_addr); dirtypage(((caddr_t)ipc.ip_addr)+NBPW-1); } else goto error; break; } /* write user D */ case 5: if (suword((caddr_t)ipc.ip_addr, 0) < 0) goto error; suword((caddr_t)ipc.ip_addr, ipc.ip_data); break; /* write u */ case 6: i = (int)ipc.ip_addr; p = (int *)&((physadr)&u)->r[i>>2]; D 8 for (i=0; i<16; i++) E 8 I 8 for (i=0; i < sizeof ipcreg / sizeof ipcreg[0] ; i++) E 8 if (p == &u.u_ar0[ipcreg[i]]) goto ok; D 8 if (p == &u.u_ar0[PS]) { ipc.ip_data |= 0x3c00000; /* modes == user */ ipc.ip_data &= ~0x3c20ff00; /* IS, FPD, ... */ goto ok; } E 8 goto error; ok: *p = ipc.ip_data; break; /* set signal and continue */ /* one version causes a trace-trap */ case 9: /* u.u_ar0[PS] |= PS_T; */ goto error; case 7: if ((int)ipc.ip_addr != 1) u.u_ar0[PC] = (int)ipc.ip_addr; u.u_procp->p_sig = 0L; if (ipc.ip_data) D 8 psignal(u.u_procp, ipc.ip_data); E 8 I 8 if (ipc.ip_data < 1 || ipc.ip_data >= NSIG) goto error ; else psignal(u.u_procp, ipc.ip_data); E 8 wakeup((caddr_t)&ipc); return(1); /* force exit */ case 8: wakeup((caddr_t)&ipc); exit(fsig(u.u_procp->p_sig)); default: error: ipc.ip_req = -1; } wakeup((caddr_t)&ipc); return(0); } /* * Break the disk association of a page based on the * virtual address for the current running process. * Note: code assumes address is legit. */ dirtypage(vaddr) register caddr_t vaddr; { register tmp; register pfd_t *pfd; register dbd_t *dbd; register preg_t *prp; register pte_t *pt; prp = findreg(u.u_procp, vaddr); tmp = btotp(vaddr - prp->p_regva); pt = &prp->p_reg->r_list[tmp/NPGPT][tmp%NPGPT]; dbd = (dbd_t *)pt + NPGPT; pfd = &pfdat[pt->pgm.pg_pfn]; if (pfd->pf_flags & P_HASH) premove(pfd); if (dbd->dbd_type == DBD_SWAP) swfree1(dbd); dbd->dbd_type = DBD_NONE; } E 1 h62562 s 00001/00001/00792 d D 4.6 87/05/14 16:14:37 build 13 12 c removed old SCCS strings and inserted #ident BB e s 00004/00000/00789 d D 4.5 87/05/07 14:03:33 dc 12 11 c dc - Add headwall clock interactions e s 00065/00002/00724 d D 4.4 87/04/30 18:48:06 dc 11 10 c dc - Change default trap settings e s 00056/00007/00670 d D 4.3 87/04/16 19:24:37 dc 10 9 c dc - Add Bull updates from 03/05/87 e s 00015/00015/00662 d D 4.2 87/04/15 17:48:55 dc 9 8 c dc - changed #include "sys/..." to #include e s 00000/00000/00677 d D 4.1 87/02/20 13:31:01 build 8 7 c rolled rev to -r4 /dc e s 00001/00001/00676 d D 3.2 87/02/13 14:21:34 build 7 6 c add bull changes from Jan 23 /dc e s 00000/00000/00677 d D 3.1 87/01/19 09:23:13 build 6 5 c rolled rev to -r3 /dc e s 00000/00000/00677 d D 2.1 87/01/19 09:23:13 build 5 4 c AUTO NULL DELTA e s 00001/00000/00676 d D 1.2 87/01/16 10:16:56 build 4 1 c add ident string /dc e s 00001/00002/00674 d R 1.2 87/01/13 13:03:27 build 3 1 c return 'nice' value in u_rval1 e s 00001/00002/00674 d R 1.2 87/01/11 12:32:16 build 2 1 c change nice to return value in u_rval1 /dc e s 00676/00000/00000 d D 1.1 87/01/09 16:35:34 build 1 0 c Placed under source control - dc e u U f b f n t T I 4 D 10 /* "%W% %E%" */ E 10 I 10 D 13 /* " %W% %E% " */ E 13 I 13 #ident " %W% %E% " E 13 E 10 E 4 I 1 D 9 #include "sys/param.h" #include "sys/types.h" #include "sys/sysmacros.h" #include "sys/systm.h" #include "sys/dir.h" #include "sys/signal.h" #include "sys/user.h" #include "sys/errno.h" #include "sys/inode.h" #include "sys/file.h" #include "sys/page.h" #include "sys/region.h" #include "sys/proc.h" #include "sys/timeb.h" #include "sys/var.h" E 9 I 9 #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include I 10 #include E 10 E 9 /* * Everything in this file is a routine implementing a system call. */ gtime() { u.u_rtime = time; } /* * BSD4.1 time entry-- return TOD with milliseconds, timezone, DST flag. */ extern short lticks ; ftime() { extern short timezone, dstflag ; register struct a { struct timeb *tp ; } *uap ; struct timeb t ; register ushort ms ; uap = (struct a *)u.u_ap ; spl7() ; t.time = time ; ms = HZ-lticks ; spl0() ; while (ms >= HZ) { ms -= HZ ; t.time++ ; } t.millitm = (1000*ms)/HZ ; t.timezone = timezone ; t.dstflag = dstflag ; if (copyout((caddr_t)&t ,(caddr_t)uap->tp, sizeof(t)) < 0) u.u_error = EFAULT ; } stime() { I 12 extern int ftHeadwall; extern HWSetDate(); E 12 register unsigned i; register struct a { time_t time; } *uap; uap = (struct a *)u.u_ap; if (suser()) { logtchg(uap->time); time = uap->time; I 12 if (ftHeadwall) HWSetDate(time); E 12 } } setuid() { register unsigned uid; register struct a { int uid; } *uap; uap = (struct a *)u.u_ap; uid = uap->uid; if (uid >= MAXUID) { u.u_error = EINVAL; return; } if (uid && (uid == u.u_ruid || uid == u.u_procp->p_suid)) u.u_uid = uid; else if (suser()) { u.u_uid = uid; u.u_procp->p_uid = uid; u.u_procp->p_suid = uid; u.u_ruid = uid; } } #ifdef SOCKET setreuid() { struct a { int ruid; int euid; } *uap; register int ruid, euid; uap = (struct a *)u.u_ap; ruid = uap->ruid; if (ruid == -1) ruid = u.u_ruid; if (u.u_ruid != ruid && u.u_uid != ruid && !suser()) return; euid = uap->euid; if (euid == -1) euid = u.u_uid; if (u.u_ruid != euid && u.u_uid != euid && !suser()) return; /* * Everything's okay, do it. */ u.u_procp->p_uid = ruid; u.u_ruid = ruid; u.u_uid = euid; } #endif SOCKET getuid() { u.u_rval1 = u.u_ruid; u.u_rval2 = u.u_uid; } geteuid() { u.u_rval1 = u.u_uid ; } getegid() { u.u_rval1 = u.u_gid ; } setgid() { register unsigned gid; register struct a { int gid; } *uap; uap = (struct a *)u.u_ap; gid = uap->gid; if (gid >= MAXUID) { u.u_error = EINVAL; return; } if (u.u_rgid == gid || suser()) { u.u_gid = gid; u.u_rgid = gid; } } #ifdef SOCKET setregid() { register struct a { int rgid; int egid; } *uap; register int rgid, egid; uap = (struct a *)u.u_ap; rgid = uap->rgid; if (rgid == -1) rgid = u.u_rgid; if (u.u_rgid != rgid && u.u_gid != rgid && !suser()) return; egid = uap->egid; if (egid == -1) egid = u.u_gid; if (u.u_rgid != egid && u.u_gid != egid && !suser()) return; if (u.u_rgid != rgid) u.u_rgid = rgid; u.u_gid = egid; } #endif SOCKET getgid() { u.u_rval1 = u.u_rgid; u.u_rval2 = u.u_gid; } getpid() { u.u_rval1 = u.u_procp->p_pid; u.u_rval2 = u.u_procp->p_ppid; } setpgrp() { register struct proc *p = u.u_procp; register struct a { int flag; } *uap; uap = (struct a *)u.u_ap; if (uap->flag) { if (p->p_pgrp != p->p_pid) u.u_ttyp = NULL; p->p_pgrp = p->p_pid; } u.u_rval1 = p->p_pgrp; } sync() { update(); } nice() { register n; register struct a { int niceness; } *uap; uap = (struct a *)u.u_ap; n = uap->niceness; if ((n < 0 || n > 2*NZERO) && !suser()) n = 0; n += u.u_procp->p_nice; if (n >= 2*NZERO) n = 2*NZERO -1; if (n < 0) n = 0; u.u_procp->p_nice = n; u.u_rval1 = 0; u.u_rval2 = n - NZERO; } /* * Unlink system call. * Hard to avoid races here, especially * in unlinking directories. */ unlink() { register struct inode *ip, *pp; struct a { char *fname; }; pp = namei(uchar, 2); if (pp == NULL) return; /* * Check for unlink(".") * to avoid hanging on the iget */ if (pp->i_number == u.u_dent.d_ino) { ip = pp; ip->i_count++; } else ip = iget(pp->i_dev, u.u_dent.d_ino); if (ip == NULL) goto out1; if ((ip->i_mode&IFMT) == IFDIR && !suser()) goto out; /* * Don't unlink a mounted file. */ if (ip->i_dev != pp->i_dev) { u.u_error = EBUSY; goto out; } if (ip->i_flag&ITEXT) xrele(ip); /* try once to free text */ if (ip->i_flag&ITEXT && ip->i_nlink == 1) { u.u_error = ETXTBSY; goto out; } u.u_offset -= sizeof(struct direct); u.u_base = (caddr_t)&u.u_dent; u.u_count = sizeof(struct direct); u.u_dent.d_ino = 0; u.u_segflg = 1; u.u_fmode = FWRITE|FSYNC; writei(pp); if (u.u_error) goto out; ip->i_nlink--; ip->i_flag |= ICHG; out: iput(ip); out1: iput(pp); } chdir() { chdirec(&u.u_cdir); } chroot() { if (!suser()) return; chdirec(&u.u_rdir); } chdirec(ipp) register struct inode **ipp; { register struct inode *ip; struct a { char *fname; }; ip = namei(uchar, 0); if (ip == NULL) return; if ((ip->i_mode&IFMT) != IFDIR) { u.u_error = ENOTDIR; goto bad; } if (access(ip, IEXEC)) goto bad; prele(ip); if (*ipp) { plock(*ipp); iput(*ipp); } *ipp = ip; return; bad: iput(ip); } chmod() { register struct inode *ip; register struct a { char *fname; int fmode; } *uap; uap = (struct a *)u.u_ap; if ((ip = owner()) == NULL) return; ip->i_mode &= ~07777; if (u.u_uid) { uap->fmode &= ~ISVTX; if (u.u_gid != ip->i_gid) uap->fmode &= ~ISGID; } ip->i_mode |= uap->fmode&07777; ip->i_flag |= ICHG; if (ip->i_flag&ITEXT && (ip->i_mode&ISVTX)==0) xrele(ip); iput(ip); } chown() { register struct inode *ip; register struct a { char *fname; int uid; int gid; } *uap; uap = (struct a *)u.u_ap; if ((ip = owner()) == NULL) return; ip->i_uid = uap->uid; ip->i_gid = uap->gid; if (u.u_uid != 0) ip->i_mode &= ~(ISUID|ISGID); ip->i_flag |= ICHG; iput(ip); } ssig() { I 11 extern int ftHeadwall; E 11 register a; register struct proc *p; struct a { int signo; int fun; int sigcode; } *uap; I 11 int inexbit; E 11 uap = (struct a *)u.u_ap; a = uap->signo; D 10 if (a <= 0 || a > NSIG || a == SIGKILL) E 10 I 10 if ((unsigned) --a >= NSIG - 1 || a == SIGKILL - 1) E 10 { u.u_error = EINVAL; return; } D 10 u.u_rval1 = u.u_signal[a-1]; u.u_signal[a-1] = uap->fun; E 10 I 10 u.u_rval1 = u.u_signal[a]; u.u_signal[a] = uap->fun; E 10 D 7 u.u_sigcode = uap->sigcode; E 7 I 7 u.u_sigcode = (caddr_t)uap->sigcode; E 7 D 10 u.u_procp->p_sig &= ~(1L<<(a-1)); if (a == SIGCLD) E 10 I 10 switch(a+1) E 10 { I 10 case SIGFPE: I 11 #if TRPSW_FPE & TRPSW_INTOVER u.u_signal[SIGINTOVER-1] = uap->fun ; #endif TRPSW_FPE & TRPSW_INTOVER #if TRPSW_FPE & TRPSW_INTDIVZERO u.u_signal[SIGINTDIVZERO-1] = uap->fun ; #endif TRPSW_FPE & TRPSW_INTDIVZERO #if TRPSW_FPE & TRPSW_REALOVER E 11 u.u_signal[SIGREALOVER-1] = uap->fun ; I 11 #endif TRPSW_FPE & TRPSW_REALOVER #if TRPSW_FPE & TRPSW_REALUNDER E 11 u.u_signal[SIGREALUNDER-1] = uap->fun ; I 11 #endif TRPSW_FPE & TRPSW_REALUNDER #if TRPSW_FPE & TRPSW_REALDIVZERO E 11 u.u_signal[SIGREALDIVZERO-1] = uap->fun ; I 11 #endif TRPSW_FPE & TRPSW_REALDIVZERO #if TRPSW_FPE & TRPSW_REALINEX u.u_signal[SIGREALINEX-1] = uap->fun ; #endif TRPSW_FPE & TRPSW_REALINEX #if TRPSW_FPE & TRPSW_REALBEFORE u.u_signal[SIGREALBEFORE-1] = uap->fun ; #endif TRPSW_FPE & TRPSW_REALBEFORE inexbit = TRPSW_FPE; #if TRPSW_FPE & TRPSW_REALINEX /* * If FPE includes inexact, move to position * to match cpu type. */ if ( ! ftHeadwall) { inexbit &= ~TRPSW_REALINEX; inexbit |= TRPSW_REALINEXEFP; } #endif TRPSW_FPE & TRPSW_REALINEX E 11 if (uap->fun == (int)SIG_IGN) D 11 u.u_pcb.traps_word &= ~TRPSW_STD_EXC ; E 11 I 11 u.u_pcb.traps_word &= ~inexbit ; E 11 else D 11 u.u_pcb.traps_word |= TRPSW_STD_EXC ; E 11 I 11 u.u_pcb.traps_word |= inexbit ; E 11 break; I 11 case SIGINTOVER: if (uap->fun == (int)SIG_IGN) u.u_pcb.traps_word &= ~TRPSW_INTOVER ; else u.u_pcb.traps_word |= TRPSW_INTOVER ; break ; E 11 case SIGINTDIVZERO: if (uap->fun == (int)SIG_IGN) u.u_pcb.traps_word &= ~TRPSW_INTDIVZERO ; else u.u_pcb.traps_word |= TRPSW_INTDIVZERO ; break ; case SIGREALOVER: if (uap->fun == (int)SIG_IGN) u.u_pcb.traps_word &= ~TRPSW_REALOVER ; else u.u_pcb.traps_word |= TRPSW_REALOVER ; break ; case SIGREALUNDER: if (uap->fun == (int)SIG_IGN) u.u_pcb.traps_word &= ~TRPSW_REALUNDER ; else u.u_pcb.traps_word |= TRPSW_REALUNDER ; break ; case SIGREALDIVZERO: if (uap->fun == (int)SIG_IGN) u.u_pcb.traps_word &= ~TRPSW_REALDIVZERO ; else u.u_pcb.traps_word |= TRPSW_REALDIVZERO ; I 11 break ; case SIGREALINEX: /* * Get the correct enable bit, according to processor * type. */ if (ftHeadwall) inexbit = TRPSW_REALINEX; else inexbit = TRPSW_REALINEXEFP; if (uap->fun == (int)SIG_IGN) u.u_pcb.traps_word &= ~inexbit ; else u.u_pcb.traps_word |= inexbit ; break ; case SIGREALBEFORE: if (uap->fun == (int)SIG_IGN) u.u_pcb.traps_word &= ~TRPSW_REALBEFORE ; else u.u_pcb.traps_word |= TRPSW_REALBEFORE ; E 11 break ; } u.u_procp->p_sig &= ~(1L<p_pid; for (p = &proc[1]; p < (struct proc *)v.ve_proc; p++) { if (a == p->p_ppid && p->p_stat == SZOMB) psignal(u.u_procp, SIGCLD); } } } kill() { register struct proc *p, *q; register arg; register struct a { int pid; int signo; } *uap; int f; uap = (struct a *)u.u_ap; if (uap->signo < 0 || uap->signo > NSIG) { u.u_error = EINVAL; return; } /* Prevent proc 1 (init) from being SIGKILLed */ if (uap->signo == SIGKILL && uap->pid == 1) { u.u_error = EINVAL; return; } f = 0; arg = uap->pid; if (arg > 0) p = &proc[1]; else p = &proc[2]; q = u.u_procp; if (arg == 0 && q->p_pgrp == 0) { u.u_error = ESRCH; return; } for(; p < (struct proc *)v.ve_proc; p++) { if (p->p_stat == NULL) continue; if (arg > 0 && p->p_pid != arg) continue; if (arg == 0 && p->p_pgrp != q->p_pgrp) continue; if (arg < -1 && p->p_pgrp != -arg) continue; if (! (u.u_uid == 0 || u.u_uid == p->p_uid || u.u_ruid == p->p_uid || u.u_uid == p->p_suid || u.u_ruid == p->p_suid )) if (arg > 0) { u.u_error = EPERM; return; } else continue; f++; if (uap->signo) psignal(p, uap->signo); if (arg > 0) break; } if (f == 0) u.u_error = ESRCH; } times() { register struct a { time_t (*times)[4]; } *uap; uap = (struct a *)u.u_ap; if (copyout((caddr_t)&u.u_utime, (caddr_t)uap->times, sizeof(*uap->times))) u.u_error = EFAULT; spl7(); u.u_rtime = lbolt; spl0(); } profil() { register struct a { short *bufbase; unsigned bufsize; unsigned pcoffset; unsigned pcscale; } *uap; uap = (struct a *)u.u_ap; u.u_prof.pr_base = uap->bufbase; u.u_prof.pr_size = uap->bufsize; u.u_prof.pr_off = uap->pcoffset; u.u_prof.pr_scale = uap->pcscale; } /* * alarm clock signal */ alarm() { register struct proc *p; register c; register struct a { int deltat; } *uap; uap = (struct a *)u.u_ap; p = u.u_procp; c = p->p_clktim; p->p_clktim = uap->deltat; u.u_rval1 = c; } /* * indefinite wait. * no one should wakeup(&u) */ pause() { for(;;) sleep((caddr_t)&u, PSLEP); } /* * mode mask for creation of files */ umask() { register struct a { int mask; } *uap; register t; uap = (struct a *)u.u_ap; t = u.u_cmask; u.u_cmask = uap->mask & 0777; u.u_rval1 = t; } /* * Set IUPD and IACC times on file. */ utime() { register struct a { char *fname; time_t *tptr; } *uap; register struct inode *ip; time_t tv[2]; uap = (struct a *)u.u_ap; if (uap->tptr != NULL) { if (copyin((caddr_t)uap->tptr, (caddr_t)tv, sizeof(tv))) { u.u_error = EFAULT; return; } } else { tv[0] = time; tv[1] = time; } ip = namei(uchar, 0); if (ip == NULL) return; if (u.u_uid != ip->i_uid && u.u_uid != 0) { if (uap->tptr != NULL) u.u_error = EPERM; else access(ip, IWRITE); } if (!u.u_error) { ip->i_flag |= IACC|IUPD|ICHG; iupdat(ip, &tv[0], &tv[1]); } iput(ip); } ulimit() { register n; register struct a { int cmd; long arg; } *uap; uap = (struct a *)u.u_ap; switch(uap->cmd) { case 2: if (uap->arg > u.u_limit && !suser()) return; u.u_limit = uap->arg; case 1: u.u_roff = u.u_limit; break; case 3: { register preg_t *prp, *dprp, *prp2; /* Find the data region */ dprp = findpreg(u.u_procp, PT_DATA); if(dprp == NULL) u.u_roff = 0; else { /* Now find the region with a virtual * address greater than the data region * but lower than any other region */ prp2 = NULL; for(prp = u.u_procp->p_region;prp->p_reg;prp++) { if(prp->p_regva <= dprp->p_regva) continue; if(prp2==NULL || prp->p_regva < prp2->p_regva) prp2 = prp; } u.u_roff = USRSTACK ; if (prp2 != NULL) u.u_roff = min( (off_t)prp2->p_regva, u.u_roff); } break; } default: u.u_error = EINVAL; } } reboot() { if (suser()) D 10 call_debug() ; E 10 I 10 { /* * It is not a good idea to sync the discs, since * such operation would prevent fsck from rebooting * after patching the raw disc. smdsync() ; */ call_rbug(REBOOT) ; } E 10 } E 1 h54009 s 00001/00001/00241 d D 4.4 87/05/14 16:14:49 build 8 7 c removed old SCCS strings and inserted #ident BB e s 00001/00002/00241 d D 4.3 87/04/16 19:00:18 dc 7 6 c dc - Add Bull updates from 03/05/87 e s 00013/00013/00230 d D 4.2 87/04/15 17:49:03 dc 6 5 c dc - changed #include "sys/..." to #include e s 00000/00000/00243 d D 4.1 87/02/20 13:31:05 build 5 4 c rolled rev to -r4 /dc e s 00000/00000/00243 d D 3.1 87/01/19 09:23:18 build 4 3 c rolled rev to -r3 /dc e s 00000/00000/00243 d D 2.1 87/01/19 09:23:18 build 3 2 c AUTO NULL DELTA e s 00001/00000/00242 d D 1.2 87/01/16 10:17:01 build 2 1 c add ident string /dc e s 00242/00000/00000 d D 1.1 87/01/09 16:35:08 build 1 0 c Placed under source control - dc e u U f b f n t T I 2 D 7 /* "%W% %E%" */ E 2 I 1 /* @(#)rdwri.c 6.4 */ E 7 I 7 D 8 /* " %W% %E% " */ E 8 I 8 #ident " %W% %E% " E 8 E 7 D 6 #include "sys/param.h" #include "sys/types.h" #include "sys/sysmacros.h" #include "sys/inode.h" #include "sys/dir.h" #include "sys/signal.h" #include "sys/user.h" #include "sys/errno.h" E 6 I 6 #include #include #include #include #include #include #include #include E 6 #include D 6 #include "sys/buf.h" #include "sys/conf.h" #include "sys/file.h" #include "sys/systm.h" #include "sys/tty.h" E 6 I 6 #include #include #include #include #include E 6 /* * Read the file corresponding to * the inode pointed at by the argument. * The actual read arguments are found * in the variables: * u_base core address for destination * u_offset byte offset in file * u_count number of bytes to read * u_segflg read to kernel/user/user I */ readi(ip) register struct inode *ip; { struct buf *bp; dev_t dev; daddr_t bn; register unsigned on, n; register type; register struct tty *tp; if (u.u_count == 0) return; if (u.u_offset < 0) { u.u_error = EINVAL; return; } type = ip->i_mode&IFMT; switch(type) { case IFCHR: dev = (dev_t)ip->i_rdev; ip->i_flag |= IACC; if (tp = cdevsw[major(dev)].d_ttys) { tp += ttyix(dev); (*linesw[tp->t_line].l_read)(tp); } else (*cdevsw[major(dev)].d_read)(minor(dev)); break; case IFIFO: while (ip->i_size == 0) { if (ip->i_fwcnt == 0) return; if (u.u_fmode&FNDELAY) return; ip->i_fflag |= IFIR; prele(ip); sleep((caddr_t)&ip->i_frcnt, PPIPE); plock(ip); } u.u_offset = (unsigned short)ip->i_frptr; case IFBLK: case IFREG: case IFDIR: do { bn = bmap(ip, B_READ); if (u.u_error) break; on = u.u_pboff; if ((n = u.u_pbsize) == 0) break; dev = u.u_pbdev; if ((long)bn<0) { if (type != IFREG) break; bp = geteblk(); clrbuf(bp); } else if (u.u_rablock) bp = breada(dev, bn, u.u_rablock); else bp = bread(dev, bn); if (bp->b_resid) { n = 0; } if (n!=0) iomove(bp->b_un.b_addr+on, n, B_READ); if (type == IFIFO) { ip->i_size -= n; if (u.u_offset >= PIPSIZ) u.u_offset = 0; if ((on+n) == FsBSIZE(dev) && ip->i_size < (PIPSIZ-FsBSIZE(dev))) bp->b_flags &= ~B_DELWRI; } brelse(bp); ip->i_flag |= IACC; } while (u.u_error==0 && u.u_count!=0 && n!=0); if (type == IFIFO) { if (ip->i_size) ip->i_frptr = u.u_offset; else ip->i_frptr = ip->i_fwptr = 0; if (ip->i_fflag&IFIW) { ip->i_fflag &= ~IFIW; curpri = PPIPE; wakeup((caddr_t)&ip->i_fwcnt); } } break; default: u.u_error = ENODEV; } } /* * Write the file corresponding to * the inode pointed at by the argument. * The actual write arguments are found * in the variables: * u_base core address for source * u_offset byte offset in file * u_count number of bytes to write * u_segflg write to kernel/user/user I */ writei(ip) register struct inode *ip; { struct buf *bp; dev_t dev; daddr_t bn; register unsigned n, on; register type; unsigned int usave; register struct tty *tp; if (u.u_offset < 0) { u.u_error = EINVAL; return; } type = ip->i_mode&IFMT; switch (type) { case IFCHR: dev = (dev_t)ip->i_rdev; ip->i_flag |= IUPD|ICHG; if (tp = cdevsw[major(dev)].d_ttys) { tp += ttyix(dev); (*linesw[tp->t_line].l_write)(tp); } else (*cdevsw[major(dev)].d_write)(minor(dev)); break; case IFIFO: floop: usave = 0; while ((u.u_count+ip->i_size) > PIPSIZ) { if (ip->i_frcnt == 0) break; if ((u.u_count > PIPSIZ) && (ip->i_size < PIPSIZ)) { usave = u.u_count; u.u_count = PIPSIZ - ip->i_size; usave -= u.u_count; break; } if (u.u_fmode&FNDELAY) return; ip->i_fflag |= IFIW; prele(ip); sleep((caddr_t)&ip->i_fwcnt, PPIPE); plock(ip); } if (ip->i_frcnt == 0) { u.u_error = EPIPE; psignal(u.u_procp, SIGPIPE); break; } u.u_offset = (unsigned short)ip->i_fwptr; case IFBLK: case IFREG: case IFDIR: while (u.u_error==0 && u.u_count!=0) { bn = bmap(ip, B_WRITE); if (u.u_error) break; on = u.u_pboff; n = u.u_pbsize; dev = u.u_pbdev; if (n == FsBSIZE(dev)) bp = getblk(dev, bn); else if (type==IFIFO && on==0 && ip->i_size < (PIPSIZ-FsBSIZE(dev))) bp = getblk(dev, bn); else bp = bread(dev, bn); iomove(bp->b_un.b_addr+on, n, B_WRITE); if (u.u_error) brelse(bp); else if (u.u_fmode&FSYNC) bwrite(bp); else if (type == IFBLK) { /* IFBLK not delayed for tapes */ bp->b_flags |= B_AGE; bawrite(bp); } else bdwrite(bp); if (type == IFREG || type == IFDIR) { if (u.u_offset > ip->i_size) { if (ip->i_map) freeblklst(ip); ip->i_size = u.u_offset; } } else if (type == IFIFO) { ip->i_size += n; if (u.u_offset == PIPSIZ) u.u_offset = 0; } ip->i_flag |= IUPD|ICHG; } if (type == IFIFO) { ip->i_fwptr = u.u_offset; if (ip->i_fflag&IFIR) { ip->i_fflag &= ~IFIR; curpri = PPIPE; wakeup((caddr_t)&ip->i_frcnt); } if (u.u_error==0 && usave!=0) { u.u_count = usave; goto floop; } } break; default: u.u_error = ENODEV; } } E 1 h36399 s 00001/00001/01465 d D 4.5 87/05/14 16:15:05 build 11 10 c removed old SCCS strings and inserted #ident BB e s 00160/00155/01306 d D 4.4 87/04/16 19:11:32 dc 10 9 c dc - Add Bull updates from 03/05/87 e s 00018/00018/01443 d D 4.3 87/04/15 17:49:14 dc 9 8 c dc - changed #include "sys/..." to #include e s 00002/00026/01459 d D 4.2 87/03/12 15:40:18 dc 8 7 c Fix chgprot to actually reload the entire seg and page tables e s 00000/00000/01485 d D 4.1 87/02/20 13:31:09 build 7 6 c rolled rev to -r4 /dc e s 00010/00010/01475 d D 3.3 87/01/29 15:50:12 build 6 5 c change svtop to btotp e s 00362/00333/01123 d D 3.2 87/01/26 15:40:01 build 5 4 c add page table changes /dc e s 00000/00000/01456 d D 3.1 87/01/19 09:23:22 build 4 3 c rolled rev to -r3 /dc e s 00000/00000/01456 d D 2.1 87/01/19 09:23:22 build 3 2 c AUTO NULL DELTA e s 00001/00000/01455 d D 1.2 87/01/16 10:17:07 build 2 1 c add ident string /dc e s 01455/00000/00000 d D 1.1 87/01/09 16:35:10 build 1 0 c Placed under source control - dc e u U f b f n t T I 2 D 10 /* "%W% %E%" */ E 10 I 10 D 11 /* " %W% %E% " */ E 11 I 11 #ident " %W% %E% " E 11 E 10 E 2 I 1 D 9 #include "sys/types.h" #include "sys/param.h" #include "sys/systm.h" #include "sys/sysmacros.h" #include "sys/page.h" #include "sys/seg.h" #include "sys/pfdat.h" #include "sys/signal.h" #include "sys/dir.h" #include "sys/user.h" #include "sys/errno.h" #include "sys/inode.h" #include "sys/var.h" #include "sys/buf.h" #include "sys/debug.h" #include "sys/region.h" #include "sys/proc.h" #include "sys/map.h" E 9 I 9 #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include E 9 D 5 #include "sys/vrt.h" E 5 reg_t nullregion; preg_t nullpregion; D 5 extern int sbittab[]; E 5 extern int maxupts; void reginit() { register reg_t *rp; rfree.r_forw = &rfree; rfree.r_back = &rfree; ractive.r_forw = &ractive; ractive.r_back = &ractive; for (rp = region; rp < ®ion[v.v_region]; rp++) { rp->r_back = rfree.r_back; rp->r_forw = &rfree; rfree.r_back->r_forw = rp; rfree.r_back = rp; } } #if LOCKLOGON == 1 #define LOCKLGSZ 64 struct locklog { uint lock; uint process; uint region; uint retva; } locklog[LOCKLGSZ]; int lockndx=0; #endif extern int p0init_done; reglock(rp) register reg_t *rp; { int frame; # if LOCKLOGON == 1 if (p0init_done) { locklog[lockndx].lock = 1; locklog[lockndx].process = (int)u.u_procp; locklog[lockndx].region = (int)rp; locklog[lockndx].retva = (&frame)[5]; lockndx++; if (lockndx >= LOCKLGSZ) lockndx = 0; } # endif while (rp->r_flags & RG_LOCK) { rp->r_flags |= RG_WANTED; sleep((caddr_t)rp, PZERO); } rp->r_flags |= RG_LOCK; } regrele(rp) register reg_t *rp; { int frame; # if LOCKLOGON == 1 if (p0init_done) { locklog[lockndx].lock = 0; locklog[lockndx].process = (uint)u.u_procp; locklog[lockndx].region = (uint)rp; locklog[lockndx].retva = (&frame)[5]; lockndx++; if (lockndx >= LOCKLGSZ) lockndx = 0; } # endif rp->r_flags &= ~RG_LOCK; if (rp->r_flags & RG_WANTED) { rp->r_flags &= ~RG_WANTED; wakeup((caddr_t)rp); } } /* * Allocate a new region. * Returns a locked region pointer or NULL on failure * The region is linked into the active list. D 5 */ E 5 I 5 D 10 */ E 10 I 10 */ E 10 E 5 reg_t * allocreg(ip, type) register struct inode *ip; { register reg_t *rp; if ((rp = rfree.r_forw) == &rfree) { D 10 printf("Region table overflow\n"); E 10 I 10 provfl("regions", "REGIONS"); E 10 u.u_error = ENOMEM; return(NULL); } /* * Remove from free list D 5 */ E 5 I 5 */ E 5 rp->r_back->r_forw = rp->r_forw; rp->r_forw->r_back = rp->r_back; D 5 /* Initialize region fields and bump inode reference * count. */ E 5 I 5 /* D 10 * Initialize region fields and bump inode reference * count. E 10 I 10 * Initialize region fields and bump inode reference count. E 10 */ E 5 I 5 D 10 /* E 5 rp->r_incore = 0; I 5 */ E 10 E 5 rp->r_type = type; rp->r_iptr = ip; rp->r_flags = RG_LOCK; if(ip != NULL) ip->i_count++; if(type != RT_PRIVATE) { /* * Link onto active list D 5 */ E 5 I 5 D 10 */ E 10 I 10 */ E 10 E 5 rp->r_forw = ractive.r_forw; rp->r_back = &ractive; ractive.r_forw->r_back = rp; ractive.r_forw = rp; } return(rp); } /* * Free an unused region table entry. D 5 */ E 5 I 5 D 10 */ E 10 I 10 */ E 10 E 5 void freereg(rp) register reg_t *rp; /* pointer to a locked region */ { register struct inode *ip; register int i; register int lim; register int size; register pte_t *pt; register int tsize; ASSERT(rp->r_flags & RG_LOCK); D 5 /* If the region is still in use, then don't free it. */ E 5 I 5 /* * If the region is still in use, then don't free it. */ E 5 if(rp->r_refcnt != 0) return; /* * Decrement use count on associated inode D 5 */ E 5 I 5 D 10 */ E 10 I 10 */ E 10 E 5 if (ip = rp->r_iptr) { if (rp->r_type == RT_STEXT) ip->i_flag &= ~ITEXT; if (ip->i_flag&ILOCK) ip->i_count--; else iput(ip); } D 5 /* Free the memory pages and the page tables and * disk use maps. These latter are always allocated * together in pairs in a contiguous 256 word piece * of kernel virtual address space. Note that the * pfree for the first page table is special because * pages may not have been allocated from the beginning * of the segment. The last page table is also special * since it may not have been fully allocated. */ E 5 I 5 D 10 /* * Free the memory pages and the page tables and * disk use maps. These latter are always allocated * together in pairs in a contiguous 256 word piece * of kernel virtual address space. Note that the * pfree for the first page table is special because * pages may not have been allocated from the beginning * of the segment. The last page table is also special * since it may not have been fully allocated. */ E 10 I 10 /* Free the memory pages and the page tables and * disk use maps. These latter are always allocated * together in pairs in a contiguous 256 word piece * of kernel virtual address space. Note that the * pfree for the first page table is special because * pages may not have been allocated from the beginning * of the segment. The last page table is also special * since it may not have been fully allocated. */ E 10 E 5 tsize = rp->r_pgoff + rp->r_pgsz; i = ptots(rp->r_pgoff); lim = ptos(tsize); ASSERT(i <= lim); for( ; i < lim ; i++) { pt = rp->r_list[i]; ASSERT(pt != 0); size = tsize - stopg(i); if(size > NPGPT) size = NPGPT; if(rp->r_pgoff > stopg(i)) { size -= rp->r_pgoff - stopg(i); pt += rp->r_pgoff - stopg(i); } pfree(rp, pt, pt + NPGPT, size); D 5 pgtfree(rp->r_list[i],3); E 5 I 5 pgtfree(rp->r_list[i],2); E 5 } D 5 /* Free the list. */ E 5 I 5 /* * Free the list. */ E 5 pgtfree(rp->r_list, rp->r_listsz); if(rp->r_type != RT_PRIVATE) { /* * Remove from active list */ rp->r_back->r_forw = rp->r_forw; rp->r_forw->r_back = rp->r_back; } regrele(rp); *rp = nullregion; /* * Link into free list D 5 */ E 5 I 5 D 10 */ E 10 I 10 */ E 10 E 5 rp->r_forw = rfree.r_forw; rp->r_back = &rfree; rfree.r_forw->r_back = rp; rfree.r_forw = rp; } /* * Attach a region to a process' address space D 5 */ E 5 I 5 D 10 */ E 10 I 10 */ E 10 E 5 preg_t * attachreg(rp, up, vaddr, type, prot) register reg_t *rp; /* pointer to region to be attached */ struct user *up; /* pointer to U-block of process (needed by fork) */ caddr_t vaddr; /* virtual address to attach at */ int type; /* Type to make the pregion. */ int prot; /* permissions for segment table entries. */ { register preg_t *prp; register int *st, ste, i; ASSERT(rp->r_flags & RG_LOCK); D 5 /* Check attach address. * It must be segment aligned. */ E 5 I 5 /* * Check attach address. * It must be segment aligned. */ E 5 if((int)vaddr & SOFFMASK) { u.u_error = EINVAL; return(NULL); } D 5 /* Allocate a pregion. We should always find a * free pregion because of the way the system * is configured. */ E 5 I 5 D 10 /* * Allocate a pregion. We should always find a * free pregion because of the way the system * is configured. */ E 10 I 10 /* Allocate a pregion. We should always find a * free pregion because of the way the system * is configured. */ E 10 E 5 prp = findpreg(up->u_procp, PT_UNUSED); if (prp == NULL) { u.u_error = EMFILE; return(NULL); } D 5 /* init pregion */ E 5 I 5 D 10 /* * Init pregion */ E 10 I 10 /* init pregion */ E 10 E 5 prp->p_reg = rp; prp->p_regva = vaddr; prp->p_type = type; if(prot == SEG_RO) prp->p_flags |= PF_RDONLY; D 5 /* Check that region does not go beyond end of virtual * address space. */ E 5 I 5 D 10 /* * Check that region does not go beyond end of virtual * address space. */ E 10 I 10 /* Check that region does not go beyond end of virtual * address space. */ E 10 E 5 D 5 if (chkattach(up, prp)) E 5 I 5 if (chkattach(up, prp, prp->p_type != PT_STACK)) E 5 { D 5 /* Region beyond end of address space. E 5 I 5 D 10 /* * Region beyond end of address space. E 10 I 10 /* Region beyond end of address space. E 10 E 5 * Undo what has been done so far D 5 */ E 5 I 5 D 10 */ E 10 I 10 */ E 10 E 5 *prp = nullpregion; u.u_error = EINVAL; return(NULL); } D 5 /* Load the segment table. */ E 5 I 5 /* * Load the segment table. */ E 5 D 10 loadstbl(up, prp, 0,prp->p_type != PT_STACK); E 10 I 10 loadstbl(up, prp, 0 ,prp->p_type != PT_STACK); E 10 ASSERT(up->u_procp->p_flag&SLOAD); I 5 D 10 /* E 5 ++rp->r_incore; I 5 */ E 10 E 5 ++rp->r_refcnt; up->u_procp->p_size += rp->r_pgsz; return(prp); } /* * Detach a region from the current process' address space D 5 */ E 5 I 5 D 10 */ E 10 I 10 */ E 10 E 5 void detachreg(up, prp) struct user *up; register preg_t *prp; { register reg_t *rp; register int i,j; D 5 register pte_t *pt,**st; E 5 I 5 register pte_t *pt; register sgte_t *st; register scte_t *sct ; E 5 struct proc *pp; register caddr_t vaddr ; D 5 register ushort segno ; E 5 pp = up->u_procp; rp = prp->p_reg; ASSERT(rp != NULL); ASSERT(rp->r_flags & RG_LOCK); if (rp->r_list == NULL) goto nullreg; ASSERT(rp->r_list[0] != 0); /* * Invalidate segment table entries pointing at the region D 5 */ E 5 I 5 */ E 5 D 5 st = uste(pp,svtop(prp->p_regva)) ; E 5 I 5 D 6 j = svtop(prp->p_regva) ; E 6 I 6 j = btotp(prp->p_regva) ; E 6 sct = pp->p_sct + ((j & L2MASK) >> (L1WIDTH+L0WIDTH)) ; st = (sgte_t *)ptol(sct->sgt_paddr) + ((j & L1MASK) >> L0WIDTH) ; E 5 vaddr = prp->p_regva ; D 5 segno = prp->p_type == PT_TEXT ? pp->p_txtsegno : pp->p_dsegno ; for (i = rp->r_pgsz + rp->r_pgoff; i > 0; i -= NPGPT) E 5 I 5 j = snum(vaddr) ; for (i = rp->r_pgsz + rp->r_pgoff; i > 0 ; ) E 5 { D 5 if ((rp->r_type != RT_STEXT) || ((rp->r_refcnt == 1) && !(rp->r_flags & RG_NOFREE))) E 5 I 5 for ( ; (j < NSGTPSC && i > 0) ; j++, i -= NPGPT) E 5 { D 5 pt = *st ; for (j=0 ; j < NPGPT ; j++,pt++) { vrt_suppress(vaddr,pt,segno) ; vaddr += NBPP ; } E 5 I 5 st->pt_paddr = 0; st->pt_w = 0 ; st++ ; E 5 } D 5 *st++ = 0; E 5 I 5 j = 0 ; sct++ ; st = (sgte_t *)ptol(sct->sgt_paddr) ; E 5 } D 5 /* Decrement process size by size of region. */ E 5 I 5 D 10 /* * Decrement process size by size of region. */ E 10 I 10 /* Decrement process size by size of region. */ E 10 E 5 up->u_procp->p_size -= rp->r_pgsz; /* * Decrement use count and free region if zero * and RG_NOFREE is not set, otherwise unlock. D 5 */ E 5 I 5 D 10 */ E 10 I 10 */ E 10 E 5 nullreg: I 5 D 10 /* E 5 --rp->r_incore; I 5 */ E 10 E 5 if (--rp->r_refcnt == 0 && !(rp->r_flags & RG_NOFREE)) freereg(rp); else regrele(rp); D 5 /* Clear the proc region we just detached. */ E 5 I 5 D 10 /* * Clear the proc region we just detached. */ E 10 I 10 /* Clear the proc region we just detached. */ E 10 E 5 for (i = prp - up->u_procp->p_region; i < pregpp-1; i++, prp++) *prp = *(prp+1); *prp = nullpregion; } /* * Duplicate a region * rp: region to be dup'd D 5 */ E 5 I 5 D 10 */ E 10 I 10 */ E 10 E 5 reg_t * dupreg(rp, type) register reg_t *rp; int type; { register int i; register int j; register int size; register pte_t *ppte; register pte_t *cpte; register pte_t **plp; register pte_t **clp; register reg_t *rp2; D 5 register vrte_t *vrt_e ; ushort segno ; E 5 int protection; ASSERT(rp->r_flags & RG_LOCK); D 5 /* If region is shared, there is no work to do. E 5 I 5 /* * If region is shared, there is no work to do. E 5 * Just return the passed region. The region reference * counts are incremented by attachreg D 5 */ E 5 I 5 D 10 */ E 10 I 10 */ E 10 E 5 if((rp->r_type != RT_PRIVATE) && (type == SEG_CW)) return(rp); /* * Need to copy the region. * Allocate a region descriptor D 5 */ E 5 I 5 D 10 */ E 10 I 10 */ E 10 E 5 if ((rp2 = allocreg(rp->r_iptr, rp->r_type)) == NULL) return(NULL); D 5 /* Allocate a list for the new region. */ E 5 I 5 /* * Allocate a list for the new region. D 10 */ E 10 I 10 */ E 10 E 5 rp2->r_listsz = rp->r_listsz; D 5 rp2->r_list = (pte_t **)pgtalloc(rp2->r_listsz); if(rp2->r_list == NULL) { freereg(rp2); return(NULL); } E 5 I 5 D 10 rp2->r_list = (pte_t **)pgtalloc(rp2->r_listsz) ; E 10 I 10 rp2->r_list = (pte_t **)pgtalloc(rp2->r_listsz); if(rp2->r_list == NULL) { rp2->r_listsz = 0 ; freereg(rp2); u.u_error = ENOMEM ; return(NULL); } E 10 E 5 I 10 E 10 D 5 E 5 /* * Copy pertinent data to new region D 5 */ E 5 I 5 D 10 */ E 10 I 10 */ E 10 E 5 rp2->r_pgsz = rp->r_pgsz; rp2->r_pgoff = rp->r_pgoff; rp2->r_nvalid = rp->r_nvalid; rp2->r_filesz = rp->r_filesz; D 5 /* Scan the parents page table list and fix up each page table. E 5 I 5 /* * Scan the parents page table list and fix up each page table. E 5 * Allocate a page table and map table for the child and * copy it from the parent. D 5 */ E 5 I 5 D 10 */ E 10 I 10 */ E 10 E 5 D 5 if (type != SEG_CW) protection = (type == SEG_RO) ? PTE_UR : PTE_UW; E 5 for(i = 0 ; i < ptos(rp->r_pgoff + rp->r_pgsz) ; i++) { plp = &rp->r_list[i]; clp = &rp2->r_list[i]; D 5 /* Allocate a page table and map table for the child. */ E 5 I 5 /* D 10 * Allocate a page table the child. */ E 10 I 10 * Allocate a page table and map table for the child. */ E 10 E 5 D 5 if((cpte = (pte_t *)pgtalloc(3)) == 0) { E 5 I 5 D 10 cpte = (pte_t *)pgtalloc(2) ; E 10 I 10 if((cpte = (pte_t *)pgtalloc(2)) == 0) { E 10 E 5 I 10 /* * We could not allocate a page table and map. * Set the size to the number of page tables * we have actually allocated and then free * the region. */ rp2->r_pgsz = stopg(i); freereg(rp2); u.u_error = ENOMEM ; return(NULL); } E 10 D 5 /* We could not allocate a page table and map. * Set the size to the number of page tables * we have actually allocated and then free * the region. */ rp2->r_pgsz = stopg(i); freereg(rp2); return(NULL); } /* If we are before the offset, then there are no E 5 I 5 /* * If we are before the offset, then there are no E 5 * pages to duplicate. Otherwise, compute the number * of pages. The first page table may be special * because of the offset and the last because the * size may not be an integral number of segments. D 5 */ E 5 I 5 D 10 */ E 10 I 10 */ E 10 E 5 *clp = cpte; if(i < ptots(rp->r_pgoff)) continue; ppte = *plp; D 5 /* Get the total number of unmapped pages remaining. E 5 I 5 /* * Get the total number of unmapped pages remaining. E 5 * This is the total size of the region minus the * number of segments for which we have allocated * page tables already. D 5 */ E 5 I 5 D 10 */ E 10 I 10 */ E 10 E 5 size = rp->r_pgoff + rp->r_pgsz - stopg(i); D 5 /* If this size is greater than a segment, then E 5 I 5 /* * If this size is greater than a segment, then E 5 * we will only process a segment. D 5 */ E 5 I 5 D 10 */ E 10 I 10 */ E 10 E 5 if(size > NPGPT) size = NPGPT; D 5 /* Check for the first segment after the offset. E 5 I 5 /* * Check for the first segment after the offset. E 5 * This is not a full segment in general. D 5 */ E 5 I 5 D 10 */ E 10 I 10 */ E 10 E 5 if(rp->r_pgoff > stopg(i)) { size -= rp->r_pgoff - stopg(i); ppte += rp->r_pgoff - stopg(i); cpte += rp->r_pgoff - stopg(i); } ASSERT(size > 0 && size <= NPGPT); D 5 /* Check each parents page and then copy it to E 5 I 5 /* * Check each parents page and then copy it to E 5 * the childs pte. Also check the map table * entries. D 5 */ E 5 I 5 D 10 */ E 10 I 10 */ E 10 E 5 for(j = 0 ; j < size ; j++, ppte++, cpte++) { dbd_t map; /* * if the pte in invalid,but the page * still belongs to this region, set the * valid bit. speeds up the tests for valid * pages which follow */ D 5 if (!ppte->pgm.pg_v) if (ppte->pgi.pg_pte & PG_NDREF) { E 5 I 5 if (!(ppte->pgi.pg_pte & PG_V)) if (ppte->pgi.pg_pte & PG_REF) E 5 ppte->pgi.pg_pte |= PG_V ; D 5 ppte->pgi.pg_pte &= ~PG_NDREF ; valid_vrtentrys(ppte) ; } E 5 D 5 /* Change writeable pages to copy-on write. */ E 5 I 5 /* * Set copy-on write bit. */ E 5 D 5 if (type == SEG_CW) { if(ppte->pgm.pg_prot == PTE_UW) { ppte->pgm.pg_prot = PTE_UR; ppte->pgm.pg_cw = 1; vrt_chgprot(ppte,SEG_RO) ; } *cpte = *ppte; } else { *cpte = *ppte; cpte->pgm.pg_prot = protection; } E 5 I 5 ppte->pgm.pg_prot = PTE_UR; E 5 I 5 *cpte = *ppte; E 5 /* if the page is in core, increment * the use count on the pfdat */ if (ppte->pgm.pg_v) { struct pfdat *pfd; pfd = pfdat + ppte->pgm.pg_pfn; ASSERT(pfd->pf_use != 0); pfd->pf_use++; } D 5 /* Increment the swap use count for pages which E 5 I 5 /* D 10 *Increment the swap use count for pages which E 10 I 10 * Increment the swap use count for pages which E 10 E 5 * are on swap. D 5 */ E 5 I 5 D 10 */ E 10 I 10 */ E 10 E 5 map = *(dbd_t *)(ppte + NPGPT); if (map.dbd_type == DBD_SWAP) { ASSERT(swpuse(&map) != 0); if(!swpinc(&map, "dupreg")) { D 5 /* swap use count overflowed. E 5 I 5 /* * Swap use count overflowed. E 5 * Free the region and return * an error. D 5 */ E 5 I 5 D 10 */ E 10 I 10 */ E 10 E 5 ((dbd_t *)(cpte + NPGPT))->dbd_type = DBD_NONE; freereg(rp2); u.u_error = ENOMEM; return(NULL); } } *(dbd_t *)(cpte + NPGPT) = map; } } return(rp2); } /* * Change the size of a region * change == 0 -> no-op * change < 0 -> shrink * change > 0 -> expand * For expansion, you get (fill) real pages (change-fill) demand zero pages * For shrink, the caller must flush the ATB * Returns 0 on no-op, -1 on failure, and 1 on success. */ growreg(up, prp, change, fill, type) struct user *up; register preg_t *prp; { register pte_t *pt,*pt1 ; register int i; register int j; register reg_t *rp; register int size; register int osize; int lotohi; int start, end; int k ; struct dbd *dbd; D 5 register caddr_t vaddr ; register ushort segno ; E 5 rp = prp->p_reg; ASSERT(rp != NULL); ASSERT(rp->r_flags & RG_LOCK); ASSERT(change >= 0 || (-change <= rp->r_pgsz)); ASSERT(rp->r_refcnt == 1); if (change == 0) return(0); lotohi = prp->p_type != PT_STACK ; osize = rp->r_pgoff + rp->r_pgsz; D 5 segno = prp->p_type == PT_TEXT ? up->u_procp->p_txtsegno : up->u_procp->p_dsegno ; E 5 if (change < 0) { D 5 /* The region is being shrunk. Compute the new * size and free up the unneeded space. */ E 5 I 5 D 10 /* * The region is being shrunk. Compute the new * size and free up the unneeded space. */ E 10 I 10 /* The region is being shrunk. Compute the new * size and free up the unneeded space. */ E 10 E 5 if (lotohi) { start = osize + change; end = osize; } else { start = rp->r_pgoff; end = rp->r_pgoff - change; } D 5 i = ptots(start); E 5 I 5 D 10 i = ptots(start) ; E 10 I 10 i = ptots(start); E 10 E 5 for( ; i < ptos(end) ; i++) { D 5 /* Free up the allocated pages for * this segment. */ E 5 I 5 D 10 /* * Free up the allocated pages for * this segment. */ E 10 I 10 /* Free up the allocated pages for * this segment. */ E 10 E 5 D 5 vaddr = prp->p_regva + stopg(i) * NBPP ; E 5 pt = rp->r_list[i]; size = end - stopg(i); if(size > NPGPT) size = NPGPT; if(start > stopg(i)) { size -= start - stopg(i); pt += start - stopg(i); D 5 vaddr += (start - stopg(i)) * NBPP ; E 5 } D 5 /* free vrt entrys associated with this segment */ pt1 = pt ; for (j=0 ; j < size ; j++,pt1++) { vrt_suppress(vaddr,pt1,segno) ; vaddr += NBPP ; } E 5 pfree(rp, pt, pt + NPGPT, size); } D 5 /* Free up the page tables which we no * longer need. */ E 5 I 5 D 10 /* * Free up the page tables which we no * longer need. */ E 10 I 10 /* Free up the page tables which we no * longer need. */ E 10 E 5 rptexpand(prp, change, lotohi); } else { D 5 /* We are expanding the region. Make sure that * the new size is legal and then allocate new * page tables if necessary. */ E 5 I 5 D 10 /* * We are expanding the region. Make sure that * the new size is legal and then allocate new * page tables if necessary. */ E 10 I 10 /* We are expanding the region. Make sure that * the new size is legal and then allocate new * page tables if necessary. */ E 10 E 5 if (chkgrowth(up, prp, change, lotohi)) { up->u_error = ENOMEM; return(-1); } if (rptexpand(prp,change,lotohi)) { up->u_error = ENOMEM; return(-1); } D 5 /* Initialize the new page tables and allocate * pages if required. */ E 5 I 5 D 10 /* * Initialize the new page tables and allocate * pages if required. */ E 10 I 10 /* Initialize the new page tables and allocate * pages if required. */ E 10 E 5 if (lotohi) { start = osize; end = osize + change; } else { start = rp->r_pgoff; end = rp->r_pgoff + change; } i = ptots(start); for( ; i < ptos(end) ; i++) { pt = rp->r_list[i]; size = end - stopg(i); if(size > NPGPT) size = NPGPT; if(start > stopg(i)) { size -= start - stopg(i); pt += start - stopg(i); } ASSERT(size > 0 && size <= NPGPT); if (lotohi) { if(fill) { register int fillsz; fillsz = min(fill, size); D 5 if(ptmemall(rp, pt, fillsz, 1)) E 5 I 5 if(ptmemall(rp, pt, fillsz, PG_V | PG_W)) E 5 panic("growreg - ptmemall failed"); dbd = (dbd_t *)(pt + NPGPT); for (k=0; kdbd_type = type; if (type == DBD_DZERO) { pte_t *tmp; tmp = pt; for (k=0; kpgm.pg_pfn); tmp++; } } fill -= fillsz; size -= fillsz; pt += fillsz; } if(size) { register proto; pte_t pte; pte.pgi.pg_pte = 0; D 5 pte.pgm.pg_prot = (type==DBD_NONE)? 0 : PTE_UW; E 5 I 5 pte.pgm.pg_m = (type==DBD_NONE)? 0 : 1 ; E 5 D 5 if (type != DBD_NONE) pte.pgi.pg_pte |= PG_E ; proto = pte.pgi.pg_pte; E 5 I 5 pte.pgi.pg_pte |= PG_W ; proto = pte.pgi.pg_pte ; E 5 while (--size >= 0) { pt->pgi.pg_pte = proto; ((dbd_t *)(pt+NPGPT))->dbd_type = D 5 type; pt++; E 5 I 5 D 10 type ; pt++ ; E 10 I 10 type; pt++; E 10 E 5 } } } else { int demsize; if (fill < change) { register proto; pte_t pte; pte.pgi.pg_pte = 0; D 5 pte.pgm.pg_prot = (type==DBD_NONE)? 0 : PTE_UW; E 5 I 5 pte.pgm.pg_m = (type==DBD_NONE)? 0 : 1 ; E 5 D 5 proto = pte.pgi.pg_pte; E 5 I 5 pte.pgi.pg_pte |= PG_W ; proto = pte.pgi.pg_pte ; E 5 D 5 demsize = min(size, change-fill); fill += demsize; size -= demsize; E 5 I 5 D 10 demsize = min(size, change-fill) ; fill += demsize ; size -= demsize ; E 10 I 10 demsize = min(size, change-fill); fill += demsize; size -= demsize; E 10 E 5 while (demsize-- > 0) { D 5 pt->pgi.pg_pte = proto; E 5 I 5 D 10 pt->pgi.pg_pte = proto ; E 10 I 10 pt->pgi.pg_pte = proto; E 10 E 5 ((dbd_t *)(pt+NPGPT))->dbd_type = D 5 type; pt++; E 5 I 5 D 10 type ; pt++ ; E 10 I 10 type; pt++; E 10 E 5 } } if (size) { D 5 if (ptmemall(rp, pt, size, 1)) panic("growreg p1 - ptmemall failed"); dbd = (dbd_t *)(pt + NPGPT); E 5 I 5 if (ptmemall(rp, pt, size, PG_V | PG_W)) panic("growreg p1 - ptmemall failed") ; dbd = (dbd_t *)(pt + NPGPT) ; E 5 for (k=0; kdbd_type = type; E 5 I 5 D 10 dbd->dbd_type = type ; E 10 I 10 dbd->dbd_type = type; E 10 E 5 if (type == DBD_DZERO) { D 5 pte_t *tmp; E 5 I 5 D 10 pte_t *tmp ; E 10 I 10 pte_t *tmp; E 10 E 5 D 5 tmp = pt; E 5 I 5 D 10 tmp = pt ; E 10 I 10 tmp = pt; E 10 E 5 for (k=0; kpgm.pg_pfn); tmp++; E 5 I 5 D 10 clearpage(tmp->pgm.pg_pfn) ; tmp++ ; E 10 I 10 clearpage(tmp->pgm.pg_pfn); tmp++; E 10 E 5 } } D 5 pt += size; E 5 I 5 D 10 pt += size ; E 10 I 10 pt += size; E 10 E 5 } } } } loadstbl(up, prp, change, lotohi); rp->r_pgsz += change; up->u_procp->p_size += change; if (prp->p_type == PT_STACK) up->u_ssize += change; return(1); } /* * Check that grow of a pregion is legal D 5 */ E 5 I 5 D 10 */ E 10 I 10 */ E 10 E 5 chkgrowth(up, prp, change, lotohi) register struct user *up; register preg_t *prp; register int change; { register reg_t *rp; D 5 register int size, n, tos; register pte_t **st ; E 5 I 5 register int size, n, tos,j ; register sgte_t *st ; register scte_t *sct,*sctlim ; E 5 struct proc *pp; pp = up->u_procp; rp = prp->p_reg; size = rp->r_pgoff + rp->r_pgsz; if (lotohi) { n = ((size%NPGPT) == 0) ? 0 : NPGPT - (size % NPGPT); if (change <= n) return(0); change -= n; D 5 st = uste(pp,svtop(prp->p_regva))+ptos(size); E 5 I 5 D 6 j = svtop(prp->p_regva) + size ; E 6 I 6 j = btotp(prp->p_regva) + size ; E 6 sct = pp->p_sct + ((j & L2MASK) >> (L1WIDTH+L0WIDTH)) ; /* st = (sgte_t *)ptol(sct->sgt_paddr) + ((j & L1MASK) >> L0WIDTH) ;*/ j += change ; sctlim = pp->p_sct + ((j & L2MASK) >> (L1WIDTH+L0WIDTH)) ; j = snum(prp->p_regva) + ptos(size) ; st = (sgte_t *)ptol(sct->sgt_paddr) + j ; E 5 } else { D 5 /* Set n to the number of pages left in the * last segment of the region */ E 5 I 5 D 10 /* * Set n to the number of pages left in the * last segment of the region */ E 10 I 10 /* Set n to the number of pages left in the * last segment of the region */ E 10 E 5 n = rp->r_pgoff; if(n == NPGPT) n = 0; /* D 5 * If change <= n the growth is legal, otherwise * check the segment table for conflicts */ E 5 I 5 D 10 * If change <= n the growth is legal, otherwise * check the segment table for conflicts */ E 10 I 10 * If change <= n the growth is legal, otherwise * check the segment table for conflicts */ E 10 E 5 if(change <= n) return(0); change -= n; /* D 5 * for stack growths, the change must be an integral * number of segments */ E 5 I 5 D 10 * For stack growths, the change must be an integral * number of segments */ E 10 I 10 * for stack growths, the change must be an integral * number of segments */ E 10 E 5 change = (change + NPGPT - 1) & ~(NPGPT - 1); D 5 st = uste(pp,svtop(prp->p_regva-ptob(change))); E 5 I 5 D 6 j = svtop(prp->p_regva) ; E 6 I 6 j = btotp(prp->p_regva) ; E 6 sctlim = pp->p_sct + ((j & L2MASK) >> (L1WIDTH+L0WIDTH)) ; j -= change ; sct = pp->p_sct + ((j & L2MASK) >> (L1WIDTH+L0WIDTH)) ; st = (sgte_t *)ptol(sct->sgt_paddr) + ((j & L1MASK) >> L0WIDTH) ; j = snum(prp->p_regva - ptob(change)) ; E 5 } D 5 for(; change > 0; change -= NPGPT) if(*st++) return(-1); E 5 I 5 for ( ; sct <= sctlim ; sct++) if (!sct->sgt_paddr) sct->sgt_paddr = kvtopfn(pgtalloc(NPTPSC)) ; for( ; change > 0 ; ) { for ( ; (j < NSGTPSC && change > 0) ; j++, change -= NPGPT) if (st->pt_paddr) return(-1); sct++ ; st = (sgte_t *)ptol(sct->sgt_paddr) ; j = 0 ; } E 5 return(0); } /* * Check that attach of a pregion is legal */ D 5 chkattach(up, prp) E 5 I 5 chkattach(up, prp, lotohi) E 5 register struct user *up; register preg_t *prp; { register reg_t *rp; D 5 register int size; register pte_t **st ; E 5 I 5 register int size,j ; register sgte_t *st ; register scte_t *sct,*sctlim ; E 5 struct proc *pp; pp = up->u_procp; rp = prp->p_reg; size = rp->r_pgoff + rp->r_pgsz; D 5 st = uste(pp,svtop(prp->p_regva)); for(; size > 0; size -= NPGPT) if(*st++) return(-1); E 5 I 5 if (lotohi) { /* * Text, data, shm regions. * Expand segment tables */ D 6 j = svtop(prp->p_regva) ; E 6 I 6 j = btotp(prp->p_regva) ; E 6 sct = pp->p_sct + ((j & L2MASK) >> (L1WIDTH+L0WIDTH)) ; j += size ; sctlim = pp->p_sct + ((j & L2MASK) >> (L1WIDTH+L0WIDTH)) ; } else { /* * Stack region. * Expand segment tables */ D 6 j = svtop(prp->p_regva) ; E 6 I 6 j = btotp(prp->p_regva) ; E 6 sctlim = pp->p_sct + ((j & L2MASK) >> (L1WIDTH+L0WIDTH)) ; j += size ; sct = pp->p_sct + ((j & L2MASK) >> (L1WIDTH+L0WIDTH)) ; } for ( ; sct <= sctlim ; sct++ ) if (!sct->sgt_paddr) sct->sgt_paddr = kvtopfn(pgtalloc(NPTPSC)) ; D 6 j = svtop(prp->p_regva) ; E 6 I 6 j = btotp(prp->p_regva) ; E 6 sct = pp->p_sct + (j >> (L1WIDTH+L0WIDTH)) ; st = (sgte_t *)ptol(sct->sgt_paddr) + ((j & L1MASK) >> L0WIDTH) ; j = snum(prp->p_regva) ; for ( ; size > 0 ; ) { for ( ; (j < NSGTPSC && size > 0) ; j++, st++, size -= NPGPT) if (st->pt_paddr) return(-1); sct++ ; st = (sgte_t *)ptol(sct->sgt_paddr) ; j = 0 ; } E 5 return(0); } loadstbl(up, prp, change, lotohi) struct user *up; preg_t *prp; register int change; { register reg_t *rp; D 5 register pte_t **st; E 5 I 5 register sgte_t *st; E 5 register struct proc *p; D 5 register int size,i; register caddr_t vaddr; E 5 I 5 register int size,i,j ; E 5 register pte_t *pt ; D 5 register ushort segno ; E 5 I 5 register scte_t *sct ; E 5 rp = prp->p_reg; p = up->u_procp; size = rp->r_pgoff + rp->r_pgsz; D 5 segno = prp->p_type == PT_TEXT ? p->p_txtsegno : p->p_dsegno ; E 5 if (change < 0) { D 5 register pte_t **stlim; E 5 change = -change; if (lotohi) { D 5 st = uste(p,svtop(prp->p_regva))+ptos(size - change); stlim = uste(p,svtop(prp->p_regva))+ptos(size); E 5 I 5 D 6 j = svtop(prp->p_regva) ; E 6 I 6 j = btotp(prp->p_regva) ; E 6 sct = p->p_sct + ((j & L2MASK) >> (L1WIDTH+L0WIDTH)) ; st = (sgte_t *)ptol(sct->sgt_paddr) + ((j & L1MASK) >> L0WIDTH) ; st += ptos(size - change) ; j = snum(prp->p_regva) ; E 5 } else { D 5 st = uste(p,svtop(prp->p_regva)-change); stlim = uste(p,svtop(prp->p_regva)); E 5 I 5 D 6 j = svtop(prp->p_regva)-change ; E 6 I 6 j = btotp(prp->p_regva)-change ; E 6 sct = p->p_sct + ((j & L2MASK) >> (L1WIDTH+L0WIDTH)) ; st = (sgte_t *)ptol(sct->sgt_paddr) + ((j & L1MASK) >> L0WIDTH) ; j = snum(prp->p_regva) - ptos(change) ; E 5 } D 5 for( ; st < stlim ; st++) *st = 0; E 5 I 5 for ( ; change > 0 ; ) { for ( ; (j < NSGTPSC && change > 0) ; j++, change -= NPGPT, st++) { st->pt_paddr = 0 ; st->pt_w = 0 ; } sct++ ; st = (sgte_t *)ptol(sct->sgt_paddr) ; j = 0 ; } flush() ; E 5 } else { D 5 register pte_t **lp; register pte_t **lplim; E 5 I 5 register pte_t **lp; register pte_t **lplim; register int protection ; E 5 D 5 st = uste(p,svtop(prp->p_regva)) ; E 5 I 5 protection = (prp->p_flags & PF_RDONLY) ? SGT_UR : SGT_UW ; D 6 j = svtop(prp->p_regva) ; E 6 I 6 j = btotp(prp->p_regva) ; E 6 sct = p->p_sct + ((j & L2MASK) >> (L1WIDTH+L0WIDTH)) ; st = (sgte_t *)ptol(sct->sgt_paddr) + ((j & L1MASK) >> L0WIDTH) ; j = snum(prp->p_regva) ; E 5 lp = rp->r_list; lplim = &lp[ptos(rp->r_pgoff + rp->r_pgsz + change)]; D 5 vaddr = prp->p_regva ; for( ; lp < lplim ; lp++,st++) E 5 I 5 for ( ; lp < lplim ; ) E 5 { D 5 *st = *lp ; pt = *st ; if (!pt) call_debug() ; for (i=0 ; i < NPGPT ; i++,pt++) E 5 I 5 for ( j ; (j < NSGTPSC && lp < lplim) ; j++, lp++, st++) E 5 { D 5 if ((pt->pgi.pg_pte & PG_V) && !vrt_find(pt,segno)) vrt_insert(vaddr,pt,segno) ; vaddr += NBPP ; E 5 I 5 st->pt_paddr = ptost(svtophys(*lp)) ; st->pt_w = protection ; E 5 } I 5 sct++ ; st = (sgte_t *)ptol(sct->sgt_paddr) ; j = 0 ; E 5 } } return(1); } /* * Expand user page tables for a region */ rptexpand(prp, change, lotohi) register preg_t *prp; { register reg_t *rp; D 5 register pte_t **lp; E 5 I 5 D 10 register pte_t **lp; E 10 I 10 register pte_t **lp; E 10 E 5 register int osize; register int nsize; D 5 register pte_t **lp1, **lp2; E 5 I 5 D 10 register pte_t **lp1, **lp2; E 10 I 10 register pte_t **lp1, **lp2; E 10 E 5 register int i; /* Calculate the new size in pages. */ rp = prp->p_reg; if (lotohi) osize = rp->r_pgoff + rp->r_pgsz; else osize = rp->r_pgsz; nsize = osize + change; /* If we are shrinking the region, then free up * the page tables and map tables. Use a smaller * list if possible. */ if(ptos(nsize) < ptos(osize)) { if (lotohi) { lp = &rp->r_list[ptos(nsize)]; for( ; lp < &rp->r_list[ptos(osize)] ; lp++) { D 5 pgtfree(*lp,3); E 5 I 5 pgtfree(*lp,2); E 5 *lp = 0; } } else { int diff; diff = ptos(osize) - ptos(nsize); lp1 = rp->r_list; lp2 = &rp->r_list[diff]; while (lp2 < &rp->r_list[ptos(osize)]) { D 5 pgtfree(*lp1,3); E 5 I 5 pgtfree(*lp1,2); E 5 *lp1++ = *lp2; *lp2++ = 0; } while ((*lp1 != 0) && (lp1 < &rp->r_list[ptos(osize)])) { D 5 pgtfree(*lp1,3); E 5 I 5 pgtfree(*lp1,2); E 5 *lp1++ = 0; } rp->r_pgoff -= stopg(diff); prp->p_regva += stob(diff); } if(ptos(ptos(nsize)) < rp->r_listsz) { if(nsize > 0) { D 5 lp2 = (pte_t **)pgtalloc(ptos(ptos(nsize))); if(lp2 == 0) return(0); E 5 I 5 D 10 lp2 = (pte_t **)pgtalloc(ptos(ptos(nsize))) ; E 10 I 10 lp2 = (pte_t **)pgtalloc(ptos(ptos(nsize))); if(lp2 == 0) return(0); E 10 E 5 bcopy(rp->r_list, lp2, ptos(nsize)*NBPW); } else I 10 { E 10 D 5 { E 5 lp2 = 0; I 10 } E 10 D 5 } E 5 pgtfree(rp->r_list, rp->r_listsz); rp->r_list = lp2; rp->r_listsz = ptos(ptos(nsize)); } } /* If the region shrunk or didn't grow by enough to * require any more page tables, then we are done. */ if(change <= 0) { if (!lotohi) rp->r_pgoff -= change; return(0); } /* If the region grew into the next segment, then we * must allocate one or more new page and map tables. * See if we have enough space in the list for the * new segments. If not, allocate a new list and * copy over the old data. */ i = ptos(ptos(nsize)); if(i > rp->r_listsz) { D 5 if((lp2 = (pte_t **)pgtalloc(i)) == 0) { return(-1); } E 5 I 5 D 10 lp2 = (pte_t **)pgtalloc(i) ; E 10 I 10 if((lp2 = (pte_t **)pgtalloc(i)) == 0) { return(-1); } E 10 E 5 if(rp->r_list) { bcopy(rp->r_list, lp2, ptos(osize)*NBPW); pgtfree(rp->r_list, rp->r_listsz); } rp->r_list = lp2; rp->r_listsz = i; } /* * Allocate a new set of page tables and disk maps. */ if (lotohi) { lp1 = lp = &rp->r_list[ptos(osize)]; lp2 = &rp->r_list[ptos(nsize)]; } else { int diff; diff = ptos(nsize) - ptos(osize); lp1 = &rp->r_list[ptos(osize)]; lp2 = &rp->r_list[ptos(nsize)]; while (lp1 > rp->r_list) *(--lp2) = *(--lp1); lp = lp1; rp->r_pgoff += (stopg(diff) - change); prp->p_regva -= stob(diff); } for( ; lp < lp2 ; lp++) D 5 { *lp = (pte_t *)pgtalloc(3); if(*lp == 0) { while(--lp >= lp1) pgtfree(*lp,3); return(-1); } } E 5 I 5 D 10 *lp = (pte_t *)pgtalloc(2) ; E 10 I 10 { *lp = (pte_t *)pgtalloc(2); if(*lp == 0) { while(--lp >= lp1) pgtfree(*lp,2); return(-1); } } E 10 E 5 return(0); } loadreg(prp, vaddr, ip, off, count) register preg_t *prp; caddr_t vaddr; register struct inode *ip; { register reg_t *rp; register int change; /* Grow the region to the proper size to load the file. */ rp = prp->p_reg; change = vaddr - prp->p_regva; if(growreg(&u, prp, btop(change + count), 0, DBD_DFILL) < 0) { return(-1); } rp->r_pgoff = btotp(change); rp->r_pgsz -= btotp(change); D 5 /* Set up to do the I/O. */ E 5 I 5 D 10 /* * Set up to do the I/O. */ E 10 I 10 /* Set up to do the I/O. */ E 10 E 5 u.u_segflg = 0; u.u_base = vaddr; u.u_count = count; u.u_offset = off; D 5 /* We must unlock the region here because we are going * to fault in the pages as we read them. No one else * will try to use the region before we finish because * the RG_DONE flag is not set yet. */ E 5 I 5 D 10 /* * We must unlock the region here because we are going * to fault in the pages as we read them. No one else * will try to use the region before we finish because * the RG_DONE flag is not set yet. */ E 10 I 10 /* We must unlock the region here because we are going * to fault in the pages as we read them. No one else * will try to use the region before we finish because * the RG_DONE flag is not set yet. */ E 10 E 5 regrele(rp); readi(ip); reglock(rp); rp->r_flags |= RG_DONE; if(rp->r_flags & RG_WAITING) { rp->r_flags &= ~RG_WAITING; wakeup(&rp->r_flags); } if(u.u_count) return(-1); D 5 /* Clear the last (unused) part of the last page. */ E 5 I 5 D 10 /* * Clear the last (unused) part of the last page. */ E 10 I 10 /* Clear the last (unused) part of the last page. */ E 10 E 5 vaddr += count; count = ptob(1) - poff(vaddr); if(count > 0 && count < ptob(1)) if(uclear(vaddr, count) < 0) return(-1); return(0); } mapreg(prp, vaddr, ip, off, count) preg_t *prp; caddr_t vaddr; struct inode *ip; int off; register int count; { register int i; register int j; register int blkspp,size ; register reg_t *rp; int edev; int gap; int seglim; register dbd_t *dbd; D 5 register vrte_t *vrt_e ; ushort segno ; E 5 /* Make sure that we are not trying to map * beyond the end the file. This can * happen for a bad a.out where the header * lies and say the file is bigger than * it actually is. */ if (off + count > ip->i_size) return(-1) ; /* If the block number list is not built, * then build it now. */ if(ip->i_map == 0) if (bldblklst(ip) != 0) return(-1) ; /* Get region pointer and effective device number. */ rp = prp->p_reg; edev = ip->i_dev; /* Compute the number of file system blocks in a page. * This depends on the file system block size. */ blkspp = NBPP / FsBSIZE(edev) ; /* Allocate invalid pages for the gap at the start of * the region and demand-fill pages for the actual * text. */ gap = vaddr - prp->p_regva; if(growreg(&u, prp, btotp(gap), 0, DBD_NONE) < 0) return(-1); if(growreg(&u, prp, btop(count+gap) - btotp(gap), 0, DBD_DFILL) < 0) return(-1); rp->r_pgoff = btotp(gap); size = rp->r_pgsz ; rp->r_pgsz -= btotp(gap) ; rp->r_filesz = count + off; gap = btotp(gap); /* Gap in pages. */ off = btotp(off) * blkspp ; /* File offset in blocks. */ i = ptots(gap); seglim = ptos(size); for( ; i < seglim ; i++) { register int lim; register pte_t *pt; if(gap > stopg(i)) j = gap - stopg(i); else j = 0; ASSERT(j >= 0 && j < NPGPT); lim = size - stopg(i); if(lim > NPGPT) lim = NPGPT; ASSERT(lim >= j && lim <= NPGPT); pt = (pte_t *)rp->r_list[i] + j; dbd = (dbd_t *)pt + NPGPT; for( ; j < lim ; j++, pt++, dbd++) { D 5 /* If these are private pages, then make * them copy-on-write since they will * be put in the hash table. */ E 5 I 5 D 10 /* * If these are private pages, then make * them copy-on-write since they will * be put in the hash table. */ E 10 I 10 /* If these are private pages, then make * them copy-on-write since they will * be put in the hash table. */ E 10 E 5 if(rp->r_type == RT_PRIVATE) D 5 { E 5 pt->pgm.pg_prot = PTE_UR; D 5 pt->pgm.pg_cw = 1; segno = u.u_procp->p_dsegno ; if (vrt_e = vrt_find(pt,segno)) vrt_e->pg_w = VRT_UR ; } E 5 dbd->dbd_blkno = off ; dbd->dbd_type = DBD_FILE; off += blkspp ; } } D 5 /* Mark the last page for special handling */ E 5 I 5 D 10 /* * Mark the last page for special handling */ E 10 I 10 /* Mark the last page for special handling */ E 10 E 5 dbd[-1].dbd_type = DBD_LAST; rp->r_flags |= RG_DONE; if (rp->r_flags & RG_WAITING) { rp->r_flags &= ~RG_WAITING ; wakeup(&rp->r_flags) ; } return(0); } D 5 /* Find the region corresponding to a virtual address. */ E 5 I 5 D 10 /* * Find the region corresponding to a virtual address. */ E 10 I 10 /* Find the region corresponding to a virtual address. */ E 10 E 5 preg_t *findreg(p, vaddr) register struct proc *p; register caddr_t vaddr; { register preg_t *prp; register preg_t *oprp; oprp = p->p_region; for(prp = &p->p_region[1] ; prp->p_reg ; prp++) if(vaddr >= prp->p_regva && (prp->p_regva > oprp->p_regva || vaddr < oprp->p_regva)) oprp = prp; if(vaddr >= oprp->p_regva) return(oprp); panic("findreg - no match"); /*NOTREACHED*/ } D 5 /* Find the pregion of a particular type. */ E 5 I 5 D 10 /* * Find the pregion of a particular type. */ E 10 I 10 /* Find the pregion of a particular type. */ E 10 E 5 preg_t * findpreg(pp, type) register struct proc *pp; register int type; { register preg_t *prp; for(prp = pp->p_region ; prp->p_reg ; prp++) { if(prp->p_type == type) return(prp); } /* We stopped on an unused region. If this is what * was called for, then return it unless it is the * last region for the process. We leave the last * region unused as a marker. D 5 */ E 5 I 5 D 10 */ E 10 I 10 */ E 10 E 5 if((type == PT_UNUSED) && (prp < &pp->p_region[pregpp - 1])) return(prp); return(NULL); } /* D 5 * Change protection of ptes for a region */ E 5 I 5 D 10 * Change protection of a pregion */ E 10 I 10 * Change protection of ptes for a region */ E 10 E 5 void chgprot(prp, prot) register preg_t *prp; { D 8 register reg_t *rp; D 5 register pte_t *pt; register int i; register int j; register int seglim; register int pglim; E 5 I 5 register sgte_t *st; register scte_t *sct ; register int i,size; register int protection ; E 5 E 8 if(prot == SEG_RO) prp->p_flags |= PF_RDONLY; else prp->p_flags &= ~PF_RDONLY; I 5 D 8 protection = prot == SEG_RO ? SGT_UR : SGT_UW ; E 5 rp = prp->p_reg; E 8 D 5 /* Look at all of the segments of the region. */ E 5 I 5 D 8 /* * Look at all of the segments of the region. */ E 5 D 5 i = ptots(rp->r_pgoff); seglim = ptos(rp->r_pgoff + rp->r_pgsz); for( ; i < seglim ; i++) E 5 I 5 size = ptots(rp->r_pgoff + rp->r_pgsz) - ptots(rp->r_pgoff) ; D 6 i = svtop(prp->p_regva) ; E 6 I 6 i = btotp(prp->p_regva) ; E 6 sct = u.u_procp->p_sct + ((i & L2MASK) >> (L1WIDTH+L0WIDTH)) ; st = (sgte_t *)ptol(sct->sgt_paddr) ; st += ptots(rp->r_pgoff) ; i = snum(prp->p_regva) + ptots(rp->r_pgoff) ; for ( ; size > 0 ; ) E 5 { D 5 /* Look at all of the pages of the segment. */ if(rp->r_pgoff > stopg(i)) j = rp->r_pgoff - stopg(i); else j = 0; pt = rp->r_list[i] + j; pglim = rp->r_pgoff + rp->r_pgsz - stopg(i); if(pglim > NPGPT) pglim = NPGPT; ASSERT(j >= 0 && j <= NPGPT); ASSERT(pglim >= j && pglim <= NPGPT); for( ; j < pglim ; j++, pt++) { /* set protection */ pt->pgm.pg_prot = prot == SEG_RO ? PTE_UR : PTE_UW; vrt_chgprot(pt,prot) ; } E 5 I 5 for ( ; i < NSGTPSC ; i++, size--, st++) st->pt_w = protection ; sct++ ; st = (sgte_t *)ptol(sct->sgt_paddr) ; i = 0 ; E 5 } E 8 I 8 loadstbl(&u, prp, 0,prp->p_type != PT_STACK); E 8 } E 1 h59555 s 00001/00001/00222 d D 4.5 87/05/14 16:15:19 build 10 9 c removed old SCCS strings and inserted #ident BB e s 00007/00025/00216 d D 4.4 87/04/16 19:12:51 dc 9 8 c dc - Add Bull updates from 03/05/87 e s 00017/00017/00224 d D 4.3 87/04/15 17:49:31 dc 8 7 c dc - changed #include "sys/..." to #include e s 00002/00002/00239 d D 4.2 87/03/21 07:14:42 build 7 6 c force signed compares on p_time e s 00000/00000/00241 d D 4.1 87/02/20 13:31:16 build 6 5 c rolled rev to -r4 /dc e s 00009/00000/00232 d D 3.2 87/01/26 15:40:44 build 5 4 c add page table changes /dc e s 00000/00000/00232 d D 3.1 87/01/19 09:23:27 build 4 3 c rolled rev to -r3 /dc e s 00000/00000/00232 d D 2.1 87/01/19 09:23:27 build 3 2 c AUTO NULL DELTA e s 00001/00000/00231 d D 1.2 87/01/16 10:17:14 build 2 1 c add ident string /dc e s 00231/00000/00000 d D 1.1 87/01/09 16:35:14 build 1 0 c Placed under source control - dc e u U f b f n t T I 2 D 9 /* "%W% %E%" */ E 9 I 9 D 10 /* " %W% %E% " */ E 10 I 10 #ident " %W% %E% " E 10 E 9 E 2 I 1 D 8 #include "sys/param.h" #include "sys/types.h" #include "sys/sysmacros.h" #include "sys/dir.h" #include "sys/signal.h" #include "sys/page.h" #include "sys/proc.h" #include "sys/systm.h" #include "sys/sysinfo.h" #include "sys/map.h" #include "sys/file.h" #include "sys/inode.h" #include "sys/buf.h" #include "sys/var.h" #include "sys/tuneable.h" #include "sys/region.h" #include "sys/debug.h" E 8 I 8 #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include E 8 extern char runin, runout; extern int freemem; /* * Memory scheduler */ sched() { register struct proc *rp, *p; register outage, inage; int maxbad; int tmp; loop: /* * Otherwise, find user to reactivate * Of users ready, select one out longest */ spl6(); outage = -20000; for (rp = &proc[0]; rp < (struct proc *)v.ve_proc; rp++) { if ((rp->p_stat==SXBRK || (rp->p_stat==SRUN && (rp->p_flag&SLOAD) == 0)) && D 7 rp->p_time > outage) E 7 I 7 (int)rp->p_time > outage) E 7 { p = rp; D 7 outage = rp->p_time; E 7 I 7 outage = (int)rp->p_time; E 7 } } /* * If there is no one there, wait. */ if (outage == -20000) { runout++; sleep((caddr_t)&runout, PSWP); goto loop; } spl0(); /* * See if there is memory for that process; * if so, let it go and then delay in order to * let things settle */ if(freemem >= tune.t_gpgshi) { struct pregion *prp; if(p->p_stat == SXBRK) { p->p_stat = SRUN; setrq(p); } I 5 /* E 5 if ((p->p_flag & SLOAD) == 0) if ((prp = findpreg(p, PT_TEXT)) != NULL) { reglock(prp->p_reg); prp->p_reg->r_incore++; regrele(prp->p_reg); } I 5 */ E 5 p->p_flag |= SLOAD; p->p_time = 0; goto delay; } /* * none found. * look around for memory. * Select the largest of those sleeping * at bad priority; if none, select the oldest. */ p = NULL; maxbad = 0; inage = 0; spl6(); for (rp = &proc[0]; rp < (struct proc *)v.ve_proc; rp++) { if (rp->p_stat==SZOMB) continue; if ((rp->p_flag&(SSYS|SLOCK|SLOAD))!=SLOAD) continue; if (lockedreg(rp)) continue; if (rp->p_stat==SSLEEP || rp->p_stat==SSTOP) { tmp = rp->p_pri - PZERO + rp->p_time; if (maxbad < tmp) { p = rp; maxbad = tmp; } } else if (maxbad<=0 && (rp->p_stat==SRUN || rp->p_stat==SXBRK)) { tmp = rp->p_time + rp->p_nice - NZERO; if (tmp > inage) { p = rp; inage = tmp; } } } spl0(); /* * Swap out and deactivate process if * sleeping at bad priority, or if it has spent at least * 2 seconds in memory and the other process has spent * at least 2 seconds out. * Otherwise wait a bit and try again. */ if (maxbad > 0 || (outage>=2 && inage>=2)) { struct pregion *prp; p->p_flag |= SLOCK; I 5 D 9 /* E 5 if ((prp = findpreg(p, PT_TEXT)) != NULL) { ASSERT(prp->p_reg->r_incore > 0); reglock(prp->p_reg); prp->p_reg->r_incore--; regrele(prp->p_reg); } I 5 */ E 9 E 5 p->p_flag &= ~SLOAD; if (!swapout(p)) { I 5 D 9 /* E 5 if (prp) { reglock(prp->p_reg) ; prp->p_reg->r_incore++ ; regrele(prp->p_reg) ; } I 5 */ E 9 E 5 p->p_flag |= SLOAD ; p->p_flag &= ~SLOCK ; p->p_time = 0 ; goto delay ; } p->p_time = 0; p->p_flag &= ~SLOCK; goto loop; } /* * Delay for 1 second and look again later */ delay: spl6(); runin++; sleep((caddr_t)&runin, PSWP); goto loop; } /* Check if process p has a region locked. Return * 1 is it does, 0 otherwise. Don't deactivate somebody * with a locked region since it can lead to a deadlock */ lockedreg(p) register struct proc *p; { register preg_t *prp; register reg_t *rp; /* Walk through process regions, check for lock flags */ D 9 for(prp = p->p_region; rp = prp->p_reg; prp++) E 9 I 9 for (prp = p->p_region; rp = prp->p_reg; prp++) E 9 if(rp->r_flags & RG_LOCK) return(1); return(0); } D 9 /* Swap out process p */ E 9 I 9 /* * Swap out process p */ E 9 swapout(p) register struct proc *p; { register preg_t *prp; register reg_t *rp; int flg; I 9 debug(DB3,"swapout(%d)\n",p->p_pid) ; E 9 ASSERT(p->p_flag & SLOCK); /* Walk through process regions * Private regions or shared regions that are being used * exclusively by this process get paged out en masse. * Other shared regions are just pruned. */ D 9 for(prp = p->p_region; rp = prp->p_reg; prp++) E 9 I 9 for (prp = p->p_region; rp = prp->p_reg; prp++) E 9 { if(rp->r_flags & RG_LOCK) continue; reglock(rp); I 5 D 9 /* E 5 flg = (rp->r_type == RT_PRIVATE || rp->r_incore == 0); I 5 */ E 9 flg = (rp->r_type == RT_PRIVATE || rp->r_refcnt == 1); E 5 /* if (flg == 0) only take unreferenced pages */ /* if (flg == 1) take all valid pages */ if (!getpages(rp, flg, p)) { regrele(rp) ; return(0) ; } regrele(rp); } return(1) ; } E 1 h29177 s 00005/00005/01139 d D 4.11 87/05/20 13:42:58 brian 20 19 c mbuf.h put back on system search path BB e s 00002/00001/01142 d D 4.10 87/05/11 08:41:10 dc 19 18 c dc - update depends for sysridge e s 00009/00009/01134 d D 4.9 87/05/07 18:58:13 van 18 17 c van - move defsocket.h back to /usr/include/sys e s 00001/00000/01142 d D 4.8 87/04/29 20:24:21 build 17 16 c van - added IFLAGS e s 00039/00039/01103 d D 4.7 87/04/29 16:25:31 van 16 15 c van - moved ucb networking includes to INCUCB e s 00012/00000/01130 d D 4.6 87/04/29 15:00:59 dc 15 14 c dc - Add sysridge.c e s 00005/00000/01125 d D 4.5 87/04/17 09:34:46 dc 14 13 c dc - Add Bull changes from 03/05/87 e s 00002/00001/01123 d D 4.4 87/04/16 19:33:35 dc 13 12 c dc - Add Bull updates from 03/05/87 e s 00001/00000/01123 d D 4.3 87/04/16 19:32:34 dc 12 11 c dc - Add Bull updates from 03/05/87 e s 00002/00003/01121 d D 4.2 87/02/25 17:58:14 dc 11 10 c change CFLAGS to DFLAGS Map INC to INCRT e s 00000/00000/01124 d D 4.1 87/02/20 13:31:21 build 10 9 c rolled rev to -r4 /dc e s 00004/00001/01120 d D 3.3 87/01/28 18:33:16 build 9 8 c update dependencies for i_mbuf e s 00037/00024/01084 d D 3.2 87/01/26 15:56:55 build 8 7 c Remove vrt.h from dependencies for faul, physio, region, startup c Re-compute dependencies for debug and pgtalloc /dc e s 00000/00000/01108 d D 3.1 87/01/19 09:23:31 build 7 6 c rolled rev to -r3 /dc e s 00000/00000/01108 d D 2.1 87/01/19 09:23:31 build 6 5 c AUTO NULL DELTA e s 00001/00000/01107 d D 1.5 87/01/16 10:17:19 build 5 4 c add ident string /dc e s 00001/00001/01106 d D 1.4 87/01/09 19:23:45 build 4 3 c remove -c from CFLAGS e s 00003/00003/01104 d D 1.3 87/01/09 19:03:14 build 3 2 c clean up some tabs e s 00073/00143/01034 d D 1.2 87/01/09 17:13:01 build 2 1 c add sccs control e s 01177/00000/00000 d D 1.1 87/01/09 16:34:09 build 1 0 c Placed under source control - dc e u U f b f n t T I 5 # "%W% %E%" E 5 I 1 LIBNAME = LIB1.a D 11 INCRT = $(SPX)/usr/include D 2 CFLAGS = -O -I$(INCRT) $(OPTIONS) CC = cc -c E 2 I 2 D 4 CFLAGS = -c -O -I$(INCRT) $(OPTIONS) E 4 I 4 CFLAGS = -O -I$(INCRT) $(OPTIONS) E 4 E 2 OPTIONS = -DOSDEBUG -DSOCKET E 11 I 11 INCRT = $(INC) I 17 IFLAGS = -I$(INCUCB) E 17 DFLAGS = -DOSDEBUG -DSOCKET E 11 D 2 FRC = E 2 FILES = \ $(LIBNAME)(acct.o)\ $(LIBNAME)(alloc.o)\ $(LIBNAME)(bio.o)\ $(LIBNAME)(bitmasks.o)\ $(LIBNAME)(blklist.o)\ $(LIBNAME)(clock.o)\ $(LIBNAME)(debug.o)\ $(LIBNAME)(errlog.o)\ $(LIBNAME)(exec.o)\ $(LIBNAME)(exit.o)\ $(LIBNAME)(fault.o)\ $(LIBNAME)(fio.o)\ $(LIBNAME)(flock.o)\ $(LIBNAME)(fork.o)\ $(LIBNAME)(getpages.o)\ $(LIBNAME)(grow.o)\ $(LIBNAME)(iget.o)\ $(LIBNAME)(intr.o)\ $(LIBNAME)(ipc.o)\ $(LIBNAME)(lock.o)\ $(LIBNAME)(machdep.o)\ $(LIBNAME)(main.o)\ $(LIBNAME)(malloc.o)\ $(LIBNAME)(move.o)\ $(LIBNAME)(msg.o)\ $(LIBNAME)(nami.o)\ $(LIBNAME)(page.o)\ $(LIBNAME)(pgtalloc.o)\ $(LIBNAME)(physio.o)\ $(LIBNAME)(pipe.o)\ $(LIBNAME)(prf.o)\ $(LIBNAME)(probe.o)\ $(LIBNAME)(ptrace.o)\ $(LIBNAME)(rdwri.o)\ $(LIBNAME)(region.o)\ $(LIBNAME)(sched.o)\ $(LIBNAME)(sem.o)\ $(LIBNAME)(shm.o)\ $(LIBNAME)(sig.o)\ $(LIBNAME)(slp.o)\ $(LIBNAME)(startup.o)\ $(LIBNAME)(subr.o)\ $(LIBNAME)(swapalloc.o)\ $(LIBNAME)(swtch.o)\ $(LIBNAME)(sys1.o)\ $(LIBNAME)(sys2.o)\ $(LIBNAME)(sys3.o)\ $(LIBNAME)(sys4.o)\ $(LIBNAME)(syscall.o)\ $(LIBNAME)(sysent.o)\ I 15 $(LIBNAME)(sysridge.o)\ E 15 $(LIBNAME)(text.o)\ I 14 $(LIBNAME)(time.o)\ E 14 $(LIBNAME)(timeout.o)\ $(LIBNAME)(trap.o)\ $(LIBNAME)(utssys.o)\ D 8 $(LIBNAME)(vrt.o)\ E 8 $(LIBNAME)(bsdcompat.o)\ $(LIBNAME)(i_domain.o)\ $(LIBNAME)(i_mbuf.o)\ $(LIBNAME)(i_proto.o)\ $(LIBNAME)(i_socket.o)\ $(LIBNAME)(i_socket2.o)\ $(LIBNAME)(i_syscl.o)\ $(LIBNAME)(i_usrreq.o)\ $(LIBNAME)(sys_socket.o) all: $(LIBNAME) .PRECIOUS: $(LIBNAME) $(LIBNAME): $(FILES) D 2 # ar rv $@ $? # -rm -f $? E 2 D 2 .c.a: $(CC) $(CFLAGS) $< ar rv $@ $*.o rm -f $*.o E 2 clean: -rm -f *.o clobber: clean -rm -f $(LI2 param.h\ $(INCRT)/sys/psl.h\ $(INCRT)/sys/seg.h\ $(INCRT)/sys/sysmacros.h\ $(INCRT)/sys/systm.h\ $(INCRT)/sys/dir.h\ $(INCRT)/sys/signal.h\ $(INCRT)/sys/user.h\ $(INCRT)/sys/errno.h\ $(INCRT)/sys/inode.h\ $(INCRT)/sys/var.h\ $(INCRT)/sys/page.h\ $(INCRT)/sys/region.h\ $(INCRT)/sys/buf.h\ $(INCRT)/sys/utsname.h\ $(INCRT)/sys/sysinfo.h\ $(INCRT)/sys/pfdat.h\ $(INCRT)/sys/proc.h\ $(INCRT)/sys/map.h\ $(INCRT)/sys/swap.h\ D 8 $(INCRT)/sys/vrt.h\ E 8 D 2 $(INCRT)/sys/debug.h\ $(FRC) E 2 I 2 $(INCRT)/sys/debug.h E 2 $(LIBNAME)(fio.o):\ $(INCRT)/sys/param.h\ $(INCRT)/sys/types.h\ $(INCRT)/sys/sysmacros.h\ $(INCRT)/sys/systm.h\ $(INCRT)/sys/dir.h\ $(INCRT)/sys/signal.h\ $(INCRT)/sys/user.h\ $(INCRT)/sys/errno.h\ $(INCRT)/sys/filsys.h\ $(INCRT)/sys/file.h\ $(INCRT)/sys/conf.h\ $(INCRT)/sys/inode.h\ $(INCRT)/sys/mount.h\ $(INCRT)/sys/var.h\ $(INCRT)/sys/acct.h\ D 2 $(INCRT)/sys/sysinfo.h\ $(FRC) E 2 I 2 $(INCRT)/sys/sysinfo.h E 2 $(LIBNAME)(flock.o):\ $(INCRT)/sys/types.h\ $(INCRT)/sys/param.h\ $(INCRT)/sys/errno.h\ $(INCRT)/sys/file.h\ $(INCRT)/sys/dir.h\ $(INCRT)/sys/signal.h\ $(INCRT)/sys/proc.h\ $(INCRT)/sys/user.h\ D 2 $(INCRT)/sys/flock.h\ $(FRC) E 2 I 2 $(INCRT)/sys/flock.h E 2 $(LIBNAME)(fork.o):\ $(INCRT)/sys/types.h\ $(INCRT)/sys/param.h\ $(INCRT)/sys/sysmacros.h\ $(INCRT)/sys/dir.h\ $(INCRT)/sys/signal.h\ $(INCRT)/sys/user.h\ $(INCRT)/sys/systm.h\ $(INCRT)/sys/sysinfo.h\ $(INCRT)/sys/map.h\ $(INCRT)/sys/seg.h\ $(INCRT)/sys/reg.h\ $(INCRT)/sys/file.h\ $(INCRT)/sys/inode.h\ $(INCRT)/sys/page.h\ $(INCRT)/sys/region.h\ $(INCRT)/sys/buf.h\ $(INCRT)/sys/var.h\ $(INCRT)/sys/errno.h\ $(INCRT)/sys/text.h\ $(INCRT)/sys/proc.h\ D 2 $(INCRT)/sys/debug.h\ $(FRC) E 2 I 2 $(INCRT)/sys/debug.h E 2 $(LIBNAME)(getpages.o):\ $(INCRT)/sys/types.h\ $(INCRT)/sys/tuneable.h\ $(INCRT)/sys/param.h\ $(INCRT)/sys/sysmacros.h\ $(INCRT)/sys/systm.h\ $(INCRT)/sys/dir.h\ $(INCRT)/sys/signal.h\ $(INCRT)/sys/user.h\ $(INCRT)/sys/inode.h\ $(INCRT)/sys/buf.h\ $(INCRT)/sys/var.h\ $(INCRT)/sys/sysinfo.h\ $(INCRT)/sys/page.h\ $(INCRT)/sys/pfdat.h\ $(INCRT)/sys/region.h\ $(INCRT)/sys/proc.h\ $(INCRT)/sys/map.h\ $(INCRT)/sys/swap.h\ D 2 $(INCRT)/sys/debug.h\ $(FRC) E 2 I 2 $(INCRT)/sys/debug.h E 2 $(LIBNAME)(grow.o):\ $(INCRT)/sys/types.h\ $(INCRT)/sys/tuneable.h\ $(INCRT)/sys/bitmasks.h\ $(INCRT)/sys/param.h\ $(INCRT)/sys/sysmacros.h\ $(INCRT)/sys/systm.h\ $(INCRT)/sys/dir.h\ $(INCRT)/sys/signal.h\ $(INCRT)/sys/user.h\ $(INCRT)/sys/errno.h\ $(INCRT)/sys/var.h\ $(INCRT)/sys/page.h\ $(INCRT)/sys/pfdat.h\ $(INCRT)/sys/seg.h\ $(INCRT)/sys/region.h\ $(INCRT)/sys/proc.h\ D 2 $(INCRT)/sys/debug.h\ $(FRC) E 2 I 2 $(INCRT)/sys/debug.h E 2 $(LIBNAME)(iget.o):\ $(INCRT)/sys/param.h\ $(INCRT)/sys/types.h\ $(INCRT)/sys/sysmacros.h\ $(INCRT)/sys/systm.h\ $(INCRT)/sys/sysinfo.h\ $(INCRT)/sys/mount.h\ $(INCRT)/sys/dir.h\ $(INCRT)/sys/signal.h\ $(INCRT)/sys/user.h\ $(INCRT)/sys/errno.h\ $(INCRT)/sys/inode.h\ $(INCRT)/sys/file.h\ $(INCRT)/sys/ino.h\ $(INCRT)/sys/filsys.h\ $(INCRT)/sys/page.h\ $(INCRT)/sys/buf.h\ $(INCRT)/sys/var.h\ $(INCRT)/sys/stat.h\ D 2 $(INCRT)/sys/conf.h\ $(FRC) E 2 I 2 $(INCRT)/sys/conf.h E 2 $(LIBNAME)(intr.o):\ $(INCRT)/sys/conf.h\ D 2 $(INCRT)/sys/iomachdep.h\ $(FRC) E 2 I 2 $(INCRT)/sys/iomachdep.h E 2 $(LIBNAME)(ipc.o):\ $(INCRT)/sys/errno.h\ $(INCRT)/sys/types.h\ $(INCRT)/sys/param.h\ $(INCRT)/sys/seg.h\ $(INCRT)/sys/signal.h\ $(INCRT)/sys/page.h\ $(INCRT)/sys/region.h\ $(INCRT)/sys/proc.h\ $(INCRT)/sys/dir.h\ $(INCRT)/sys/user.h\ D 2 $(INCRT)/sys/ipc.h\ $(FRC) E 2 I 2 $(INCRT)/sys/ipc.h E 2 $(LIBNAME)(lock.o):\ $(INCRT)/sys/types.h\ $(INCRT)/sys/param.h\ $(INCRT)/sys/dir.h\ $(INCRT)/sys/signal.h\ $(INCRT)/sys/user.h\ $(INCRT)/sys/errno.h\ $(INCRT)/sys/lock.h\ $(INCRT)/sys/page.h\ $(INCRT)/sys/region.h\ D 2 $(INCRT)/sys/proc.h\ $(FRC) E 2 I 2 $(INCRT)/sys/proc.h E 2 $(LIBNAME)(machdep.o):\ $(INCRT)/sys/param.h\ $(INCRT)/sys/types.h\ $(INCRT)/sys/sysmacros.h\ $(INCRT)/sys/systm.h\ $(INCRT)/sys/dir.h\ $(INCRT)/sys/signal.h\ $(INCRT)/sys/user.h\ $(INCRT)/sys/errno.h\ $(INCRT)/sys/page.h\ $(INCRT)/sys/region.h\ $(INCRT)/sys/proc.h\ $(INCRT)/sys/seg.h\ $(INCRT)/sys/map.h\ $(INCRT)/sys/reg.h\ $(INCRT)/sys/psl.h\ $(INCRT)/sys/utsname.h\ $(INCRT)/sys/clock.h\ $(INCRT)/sys/ipc.h\ $(INCRT)/sys/shm.h\ $(INCRT)/sys/acct.h\ D 2 $(INCRT)/sys/file.h\ $(FRC) E 2 I 2 $(INCRT)/sys/file.h E 2 $(LIBNAME)(main.o):\ $(INCRT)/sys/types.h\ $(INCRT)/sys/param.h\ $(INCRT)/sys/sysmacros.h\ $(INCRT)/sys/systm.h\ $(INCRT)/sys/dir.h\ $(INCRT)/sys/signal.h\ $(INCRT)/sys/user.h\ $(INCRT)/sys/filsys.h\ $(INCRT)/sys/mount.h\ $(INCRT)/sys/page.h\ $(INCRT)/sys/inode.h\ $(INCRT)/sys/region.h\ $(INCRT)/sys/proc.h\ $(INCRT)/sys/conf.h\ $(INCRT)/sys/buf.h\ $(INCRT)/sys/var.h\ $(INCRT)/sys/ipc.h\ $(INCRT)/sys/seg.h\ $(INCRT)/sys/reg.h\ D 2 $(INCRT)/sys/debug.h\ $(FRC) E 2 I 2 $(INCRT)/sys/debug.h E 2 $(LIBNAME)(malloc.o):\ $(INCRT)/sys/param.h\ $(INCRT)/sys/types.h\ $(INCRT)/sys/systm.h\ $(INCRT)/sys/map.h\ $(INCRT)/sys/page.h\ D 2 $(INCRT)/sys/mem.h\ $(FRC) E 2 I 2 $(INCRT)/sys/mem.h E 2 $(LIBNAME)(move.o):\ $(INCRT)/sys/param.h\ $(INCRT)/sys/types.h\ $(INCRT)/sys/sysmacros.h\ $(INCRT)/sys/systm.h\ $(INCRT)/sys/map.h\ $(INCRT)/sys/dir.h\ $(INCRT)/sys/signal.h\ $(INCRT)/sys/user.h\ $(INCRT)/sys/errno.h\ $(INCRT)/sys/page.h\ $(INCRT)/sys/region.h\ $(INCRT)/sys/proc.h\ D 2 $(INCRT)/sys/buf.h\ $(FRC) E 2 I 2 $(INCRT)/sys/buf.h E 2 $(LIBNAME)(msg.o):\ $(INCRT)/sys/types.h\ $(INCRT)/sys/param.h\ $(INCRT)/sys/dir.h\ $(INCRT)/sys/signal.h\ $(INCRT)/sys/user.h\ $(INCRT)/sys/seg.h\ $(INCRT)/sys/page.h\ $(INCRT)/sys/region.h\ $(INCRT)/sys/proc.h\ $(INCRT)/sys/buf.h\ $(INCRT)/sys/errno.h\ $(INCRT)/sys/map.h\ $(INCRT)/sys/ipc.h\ $(INCRT)/sys/msg.h\ $(INCRT)/sys/systm.h\ D 2 $(INCRT)/sys/sysmacros.h\ $(FRC) E 2 I 2 $(INCRT)/sys/sysmacros.h E 2 $(LIBNAME)(nami.o):\ $(INCRT)/sys/param.h\ $(INCRT)/sys/types.h\ $(INCRT)/sys/systm.h\ $(INCRT)/sys/sysinfo.h\ $(INCRT)/sys/inode.h\ $(INCRT)/sys/mount.h\ $(INCRT)/sys/dir.h\ $(INCRT)/sys/signal.h\ $(INCRT)/sys/user.h\ $(INCRT)/sys/errno.h\ $(INCRT)/sys/page.h\ $(INCRT)/sys/buf.h\ D 2 $(INCRT)/sys/var.h\ $(FRC) E 2 I 2 $(INCRT)/sys/var.h E 2 $(LIBNAME)(page.o):\ $(INCRT)/sys/types.h\ $(INCRT)/sys/param.h\ $(INCRT)/sys/sysmacros.h\ $(INCRT)/sys/systm.h\ $(INCRT)/sys/dir.h\ $(INCRT)/sys/signal.h\ $(INCRT)/sys/user.h\ $(INCRT)/sys/inode.h\ $(INCRT)/sys/var.h\ $(INCRT)/sys/mount.h\ $(INCRT)/sys/page.h\ $(INCRT)/sys/region.h\ $(INCRT)/sys/buf.h\ $(INCRT)/sys/map.h\ $(INCRT)/sys/pfdat.h\ $(INCRT)/sys/proc.h\ $(INCRT)/sys/swap.h\ D 2 $(INCRT)/sys/debug.h\ $(FRC) E 2 I 2 $(INCRT)/sys/debug.h E 2 $(LIBNAME)(pgtalloc.o):\ $(INCRT)/sys/types.h\ I 8 $(INCRT)/sys/bitmasks.h\ E 8 $(INCRT)/sys/param.h\ $(INCRT)/sys/sysmacros.h\ I 8 $(INCRT)/sys/dir.h\ $(INCRT)/sys/signal.h\ $(INCRT)/sys/user.h\ E 8 $(INCRT)/sys/systm.h\ D 8 $(INCRT)/sys/page.h\ E 8 I 8 $(INCRT)/sys/sysinfo.h\ E 8 $(INCRT)/sys/map.h\ I 8 $(INCRT)/sys/seg.h\ $(INCRT)/sys/file.h\ $(INCRT)/sys/inode.h\ $(INCRT)/sys/page.h\ $(INCRT)/sys/region.h\ $(INCRT)/sys/buf.h\ $(INCRT)/sys/var.h\ $(INCRT)/sys/errno.h\ $(INCRT)/sys/proc.h\ $(INCRT)/sys/reg.h\ $(INCRT)/sys/pfdat.h\ E 8 D 2 $(INCRT)/sys/debug.h\ $(FRC) E 2 I 2 $(INCRT)/sys/debug.h E 2 $(LIBNAME)(physio.o):\ $(INCRT)/sys/types.h\ $(INCRT)/sys/param.h\ $(INCRT)/sys/sysmacros.h\ $(INCRT)/sys/systm.h\ $(INCRT)/sys/sysinfo.h\ $(INCRT)/sys/dir.h\ $(INCRT)/sys/map.h\ $(INCRT)/sys/signal.h\ $(INCRT)/sys/user.h\ $(INCRT)/sys/errno.h\ $(INCRT)/sys/buf.h\ $(INCRT)/sys/conf.h\ $(INCRT)/sys/var.h\ $(INCRT)/sys/inode.h\ $(INCRT)/sys/page.h\ $(INCRT)/sys/seg.h\ $(INCRT)/sys/region.h\ $(INCRT)/sys/proc.h\ D 8 $(INCRT)/sys/swap.h\ D 2 $(INCRT)/sys/vrt.h\ $(FRC) E 2 I 2 $(INCRT)/sys/vrt.h E 8 I 8 $(INCRT)/sys/swap.h E 8 E 2 $(LIBNAME)(pipe.o):\ $(INCRT)/sys/param.h\ $(INCRT)/sys/types.h\ $(INCRT)/sys/systm.h\ $(INCRT)/sys/dir.h\ $(INCRT)/sys/signal.h\ $(INCRT)/sys/user.h\ $(INCRT)/sys/errno.h\ $(INCRT)/sys/inode.h\ D 2 $(INCRT)/sys/file.h\ $(FRC) E 2 I 2 $(INCRT)/sys/file.h E 2 $(LIBNAME)(prf.o):\ $(INCRT)/sys/param.h\ $(INCRT)/sys/types.h\ $(INCRT)/sys/sysmacros.h\ $(INCRT)/sys/systm.h\ $(INCRT)/sys/page.h\ $(INCRT)/sys/buf.h\ D 2 $(INCRT)/sys/conf.h\ $(FRC) E 2 I 2 D 13 $(INCRT)/sys/conf.h E 13 I 13 $(INCRT)/sys/conf.h\ $(INCRT)/sys/debug.h E 13 E 2 $(LIBNAME)(probe.o):\ $(INCRT)/sys/types.h\ $(INCRT)/sys/param.h\ $(INCRT)/sys/sysmacros.h\ $(INCRT)/sys/dir.h\ $(INCRT)/sys/signal.h\ $(INCRT)/sys/user.h\ $(INCRT)/sys/page.h\ $(INCRT)/sys/region.h\ $(INCRT)/sys/proc.h\ $(INCRT)/sys/text.h\ $(INCRT)/sys/systm.h\ $(INCRT)/sys/sysinfo.h\ $(INCRT)/sys/file.h\ $(INCRT)/sys/inode.h\ $(INCRT)/sys/buf.h\ $(INCRT)/sys/var.h\ $(INCRT)/sys/ipc.h\ D 2 $(INCRT)/sys/errno.h\ $(FRC) E 2 I 2 $(INCRT)/sys/errno.h E 2 $(LIBNAME)(ptrace.o):\ $(INCRT)/sys/param.h\ $(INCRT)/sys/types.h\ $(INCRT)/sys/sysmacros.h\ $(INCRT)/sys/systm.h\ $(INCRT)/sys/dir.h\ $(INCRT)/sys/signal.h\ $(INCRT)/sys/user.h\ $(INCRT)/sys/errno.h\ $(INCRT)/sys/page.h\ $(INCRT)/sys/region.h\ $(INCRT)/sys/proc.h\ $(INCRT)/sys/inode.h\ $(INCRT)/sys/file.h\ $(INCRT)/sys/reg.h\ $(INCRT)/sys/text.h\ $(INCRT)/sys/seg.h\ $(INCRT)/sys/var.h\ D 2 $(INCRT)/sys/psl.h\ $(FRC) E 2 I 2 $(INCRT)/sys/psl.h E 2 $(LIBNAME)(rdwri.o):\ $(INCRT)/sys/param.h\ $(INCRT)/sys/types.h\ $(INCRT)/sys/sysmacros.h\ $(INCRT)/sys/inode.h\ $(INCRT)/sys/dir.h\ $(INCRT)/sys/signal.h\ $(INCRT)/sys/user.h\ $(INCRT)/sys/errno.h\ $(INCRT)/sys/page.h\ $(INCRT)/sys/buf.h\ $(INCRT)/sys/conf.h\ $(INCRT)/sys/file.h\ $(INCRT)/sys/systm.h\ D 2 $(INCRT)/sys/tty.h\ $(FRC) E 2 I 2 $(INCRT)/sys/tty.h E 2 $(LIBNAME)(region.o):\ $(INCRT)/sys/types.h\ $(INCRT)/sys/param.h\ $(INCRT)/sys/systm.h\ $(INCRT)/sys/sysmacros.h\ $(INCRT)/sys/page.h\ $(INCRT)/sys/seg.h\ $(INCRT)/sys/pfdat.h\ $(INCRT)/sys/signal.h\ $(INCRT)/sys/dir.h\ $(INCRT)/sys/user.h\ $(INCRT)/sys/errno.h\ $(INCRT)/sys/inode.h\ $(INCRT)/sys/var.h\ $(INCRT)/sys/buf.h\ $(INCRT)/sys/debug.h\ $(INCRT)/sys/region.h\ $(INCRT)/sys/proc.h\ D 8 $(INCRT)/sys/map.h\ D 2 $(INCRT)/sys/vrt.h\ $(FRC) E 2 I 2 $(INCRT)/sys/vrt.h E 8 I 8 $(INCRT)/sys/map.h E 8 E 2 $(LIBNAME)(sched.o):\ $(INCRT)/sys/types.h\ $(INCRT)/sys/param.h\ $(INCRT)/sys/sysmacros.h\ $(INCRT)/sys/dir.h\ $(INCRT)/sys/signal.h\ $(INCRT)/sys/user.h\ $(INCRT)/sys/proc.h\ $(INCRT)/sys/text.h\ $(INCRT)/sys/systm.h\ $(INCRT)/sys/sysinfo.h\ $(INCRT)/sys/file.h\ $(INCRT)/sys/inode.h\ $(INCRT)/sys/buf.h\ $(INCRT)/sys/var.h\ $(INCRT)/sys/ipc.h\ D 2 $(INCRT)/sys/errno.h\ $(FRC) E 2 I 2 $(INCRT)/sys/errno.h E 2 $(LIBNAME)(sem.o):\ $(INCRT)/sys/types.h\ $(INCRT)/sys/param.h\ $(INCRT)/sys/dir.h\ $(INCRT)/sys/map.h\ $(INCRT)/sys/errno.h\ $(INCRT)/sys/signal.h\ $(INCRT)/sys/ipc.h\ $(INCRT)/sys/sem.h\ $(INCRT)/sys/user.h\ $(INCRT)/sys/seg.h\ $(INCRT)/sys/page.h\ $(INCRT)/sys/region.h\ $(INCRT)/sys/proc.h\ D 2 $(INCRT)/sys/buf.h\ $(FRC) E 2 I 2 $(INCRT)/sys/buf.h E 2 $(LIBNAME)(shm.o):\ $(INCRT)/sys/types.h\ $(INCRT)/sys/param.h\ $(INCRT)/sys/dir.h\ $(INCRT)/sys/errno.h\ $(INCRT)/sys/signal.h\ $(INCRT)/sys/user.h\ $(INCRT)/sys/ipc.h\ $(INCRT)/sys/shm.h\ $(INCRT)/sys/seg.h\ $(INCRT)/sys/page.h\ $(INCRT)/sys/region.h\ $(INCRT)/sys/proc.h\ $(INCRT)/sys/systm.h\ D 2 $(INCRT)/sys/sysmacros.h\ $(FRC) E 2 I 2 $(INCRT)/sys/sysmacros.h E 2 $(LIBNAME)(sig.o):\ $(INCRT)/sys/types.h\ $(INCRT)/sys/param.h\ $(INCRT)/sys/sysmacros.h\ $(INCRT)/sys/systm.h\ $(INCRT)/sys/dir.h\ $(INCRT)/sys/signal.h\ $(INCRT)/sys/user.h\ $(INCRT)/sys/errno.h\ $(INCRT)/sys/page.h\ $(INCRT)/sys/region.h\ $(INCRT)/sys/proc.h\ $(INCRT)/sys/inode.h\ $(INCRT)/sys/file.h\ $(INCRT)/sys/text.h\ $(INCRT)/sys/var.h\ D 2 $(INCRT)/sys/ipc.h\ $(FRC) E 2 I 2 $(INCRT)/sys/ipc.h E 2 $(LIBNAME)(slp.o):\ $(INCRT)/sys/types.h\ $(INCRT)/sys/param.h\ $(INCRT)/sys/sysmacros.h\ $(INCRT)/sys/dir.h\ $(INCRT)/sys/signal.h\ $(INCRT)/sys/user.h\ $(INCRT)/sys/page.h\ $(INCRT)/sys/region.h\ $(INCRT)/sys/proc.h\ $(INCRT)/sys/text.h\ $(INCRT)/sys/systm.h\ $(INCRT)/sys/sysinfo.h\ $(INCRT)/sys/file.h\ $(INCRT)/sys/inode.h\ $(INCRT)/sys/buf.h\ $(INCRT)/sys/var.h\ $(INCRT)/sys/ipc.h\ D 2 $(INCRT)/sys/errno.h\ $(FRC) E 2 I 2 $(INCRT)/sys/errno.h E 2 $(LIBNAME)(startup.o):\ $(INCRT)/sys/param.h\ $(INCRT)/sys/types.h\ $(INCRT)/sys/sysmacros.h\ $(INCRT)/sys/systm.h\ $(INCRT)/sys/dir.h\ $(INCRT)/sys/signal.h\ $(INCRT)/sys/user.h\ $(INCRT)/sys/errno.h\ $(INCRT)/sys/page.h\ $(INCRT)/sys/region.h\ $(INCRT)/sys/proc.h\ $(INCRT)/sys/seg.h\ $(INCRT)/sys/map.h\ $(INCRT)/sys/reg.h\ $(INCRT)/sys/psl.h\ $(INCRT)/sys/utsname.h\ $(INCRT)/sys/clock.h\ $(INCRT)/sys/ipc.h\ $(INCRT)/sys/shm.h\ $(INCRT)/sys/acct.h\ $(INCRT)/sys/tty.h\ $(INCRT)/sys/var.h\ $(INCRT)/sys/pfdat.h\ $(INCRT)/sys/buf.h\ D 8 $(INCRT)/sys/vrt.h\ E 8 D 2 $(INCRT)/sys/debug.h\ $(FRC) E 2 I 2 $(INCRT)/sys/debug.h E 2 $(LIBNAME)(subr.o):\ $(INCRT)/sys/param.h\ $(INCRT)/sys/types.h\ $(INCRT)/sys/sysmacros.h\ $(INCRT)/sys/systm.h\ $(INCRT)/sys/inode.h\ $(INCRT)/sys/dir.h\ $(INCRT)/sys/signal.h\ $(INCRT)/sys/user.h\ $(INCRT)/sys/errno.h\ $(INCRT)/sys/page.h\ $(INCRT)/sys/buf.h\ $(INCRT)/sys/mount.h\ D 2 $(INCRT)/sys/var.h\ $(FRC) E 2 I 2 $(INCRT)/sys/var.h E 2 $(LIBNAME)(swapalloc.o):\ $(INCRT)/sys/types.h\ $(INCRT)/sys/param.h\ $(INCRT)/sys/map.h\ $(INCRT)/sys/sysmacros.h\ $(INCRT)/sys/systm.h\ $(INCRT)/sys/sysinfo.h\ $(INCRT)/sys/dir.h\ $(INCRT)/sys/signal.h\ $(INCRT)/sys/user.h\ $(INCRT)/sys/errno.h\ $(INCRT)/sys/conf.h\ $(INCRT)/sys/var.h\ $(INCRT)/sys/inode.h\ $(INCRT)/sys/page.h\ $(INCRT)/sys/region.h\ $(INCRT)/sys/proc.h\ $(INCRT)/sys/swap.h\ D 2 $(INCRT)/sys/debug.h\ $(FRC) E 2 I 2 $(INCRT)/sys/debug.h E 2 $(LIBNAME)(swtch.o):\ $(INCRT)/sys/param.h\ $(INCRT)/sys/types.h\ $(INCRT)/sys/sysmacros.h\ $(INCRT)/sys/systm.h\ $(INCRT)/sys/map.h\ $(INCRT)/sys/dir.h\ $(INCRT)/sys/signal.h\ $(INCRT)/sys/user.h\ $(INCRT)/sys/errno.h\ $(INCRT)/sys/page.h\ $(INCRT)/sys/region.h\ $(INCRT)/sys/proc.h\ D 2 $(INCRT)/sys/sysinfo.h\ $(FRC) E 2 I 2 $(INCRT)/sys/sysinfo.h E 2 $(LIBNAME)(sys1.o):\ $(INCRT)/sys/param.h\ $(INCRT)/sys/types.h\ $(INCRT)/sys/sysmacros.h\ $(INCRT)/sys/systm.h\ $(INCRT)/sys/map.h\ $(INCRT)/sys/dir.h\ $(INCRT)/sys/signal.h\ $(INCRT)/sys/user.h\ $(INCRT)/sys/errno.h\ $(INCRT)/sys/page.h\ $(INCRT)/sys/region.h\ $(INCRT)/sys/proc.h\ $(INCRT)/sys/buf.h\ $(INCRT)/sys/reg.h\ $(INCRT)/sys/file.h\ $(INCRT)/sys/inode.h\ $(INCRT)/sys/seg.h\ $(INCRT)/sys/acct.h\ $(INCRT)/sys/sysinfo.h\ $(INCRT)/sys/var.h\ $(INCRT)/sys/ipc.h\ D 2 $(INCRT)/sys/shm.h\ $(FRC) E 2 I 2 $(INCRT)/sys/shm.h E 2 $(LIBNAME)(sys2.o):\ $(INCRT)/sys/param.h\ $(INCRT)/sys/types.h\ $(INCRT)/sys/systm.h\ $(INCRT)/sys/dir.h\ $(INCRT)/sys/signal.h\ $(INCRT)/sys/user.h\ $(INCRT)/sys/errno.h\ $(INCRT)/sys/file.h\ $(INCRT)/sys/inode.h\ $(INCRT)/sys/sysinfo.h\ D 2 $(INCRT)/sys/uio.h\ $(FRC) E 2 I 2 $(INCRT)/sys/uio.h E 2 $(LIBNAME)(sys3.o):\ $(INCRT)/sys/param.h\ $(INCRT)/sys/types.h\ $(INCRT)/sys/sysmacros.h\ $(INCRT)/sys/systm.h\ $(INCRT)/sys/mount.h\ $(INCRT)/sys/ino.h\ $(INCRT)/sys/page.h\ $(INCRT)/sys/buf.h\ $(INCRT)/sys/filsys.h\ $(INCRT)/sys/dir.h\ $(INCRT)/sys/signal.h\ $(INCRT)/sys/user.h\ $(INCRT)/sys/errno.h\ $(INCRT)/sys/inode.h\ $(INCRT)/sys/file.h\ $(INCRT)/sys/flock.h\ $(INCRT)/sys/conf.h\ $(INCRT)/sys/stat.h\ $(INCRT)/sys/ttold.h\ $(INCRT)/sys/var.h\ D 2 $(INCRT)/sys/bsdioctl.h\ $(FRC) E 2 I 2 D 16 $(INCRT)/sys/bsdioctl.h E 16 I 16 $(INCUCB)/sys/bsdioctl.h E 16 E 2 $(LIBNAME)(sys4.o):\ $(INCRT)/sys/param.h\ $(INCRT)/sys/types.h\ $(INCRT)/sys/sysmacros.h\ $(INCRT)/sys/systm.h\ $(INCRT)/sys/dir.h\ $(INCRT)/sys/signal.h\ $(INCRT)/sys/user.h\ $(INCRT)/sys/errno.h\ $(INCRT)/sys/inode.h\ $(INCRT)/sys/file.h\ $(INCRT)/sys/page.h\ $(INCRT)/sys/region.h\ $(INCRT)/sys/proc.h\ $(INCRT)/sys/var.h\ I 12 $(INCRT)/sys/debug.h\ E 12 D 2 $(INCRT)/sys/clock.h\ $(FRC) E 2 I 2 $(INCRT)/sys/clock.h E 2 $(LIBNAME)(syscall.o):\ $(INCRT)/sys/param.h\ $(INCRT)/sys/types.h\ $(INCRT)/sys/sysmacros.h\ $(INCRT)/sys/systm.h\ $(INCRT)/sys/map.h\ $(INCRT)/sys/dir.h\ $(INCRT)/sys/signal.h\ $(INCRT)/sys/user.h\ $(INCRT)/sys/reg.h\ $(INCRT)/sys/page.h\ $(INCRT)/sys/region.h\ $(INCRT)/sys/sysinfo.h\ $(INCRT)/sys/psl.h\ $(INCRT)/sys/errno.h\ D 2 $(INCRT)/sys/proc.h\ $(FRC) E 2 I 2 $(INCRT)/sys/proc.h E 2 $(LIBNAME)(sysent.o):\ $(INCRT)/sys/param.h\ $(INCRT)/sys/types.h\ D 2 $(INCRT)/sys/systm.h\ $(FRC) E 2 I 2 $(INCRT)/sys/systm.h I 15 $(LIBNAME)(sysridge.o):\ $(INCRT)/sys/param.h\ $(INCRT)/sys/types.h\ $(INCRT)/sys/sysmacros.h\ $(INCRT)/sys/dir.h\ $(INCRT)/sys/signal.h\ $(INCRT)/sys/user.h\ $(INCRT)/sys/errno.h\ $(INCRT)/sys/page.h\ D 19 $(INCRT)/sys/sysridge.h E 19 I 19 $(INCRT)/sys/sysridge.h\ $(INCRT)/sys/ieeefp.h E 19 E 15 E 2 $(LIBNAME)(text.o):\ $(INCRT)/sys/types.h\ $(INCRT)/sys/param.h\ $(INCRT)/sys/sysmacros.h\ $(INCRT)/sys/systm.h\ $(INCRT)/sys/dir.h\ $(INCRT)/sys/signal.h\ $(INCRT)/sys/user.h\ $(INCRT)/sys/errno.h\ $(INCRT)/sys/inode.h\ $(INCRT)/sys/buf.h\ $(INCRT)/sys/var.h\ $(INCRT)/sys/sysinfo.h\ $(INCRT)/sys/seg.h\ $(INCRT)/sys/page.h\ $(INCRT)/sys/pfdat.h\ $(INCRT)/sys/region.h\ $(INCRT)/sys/proc.h\ $(INCRT)/sys/aouthdr.h\ D 2 $(INCRT)/sys/debug.h\ $(FRC) E 2 I 2 $(INCRT)/sys/debug.h I 14 $(LIBNAME)(time.o):\ $(INCRT)/sys/types.h\ $(INCRT)/sys/timeb.h E 14 E 2 $(LIBNAME)(timeout.o):\ $(INCRT)/sys/param.h\ $(INCRT)/sys/types.h\ $(INCRT)/sys/systm.h\ $(INCRT)/sys/sysinfo.h\ $(INCRT)/sys/callo.h\ $(INCRT)/sys/dir.h\ $(INCRT)/sys/signal.h\ $(INCRT)/sys/user.h\ $(INCRT)/sys/page.h\ $(INCRT)/sys/region.h\ $(INCRT)/sys/proc.h\ $(INCRT)/sys/text.h\ $(INCRT)/sys/psl.h\ D 2 $(INCRT)/sys/var.h\ $(FRC) E 2 I 2 $(INCRT)/sys/var.h E 2 $(LIBNAME)(trap.o):\ $(INCRT)/sys/param.h\ $(INCRT)/sys/types.h\ $(INCRT)/sys/systm.h\ $(INCRT)/sys/dir.h\ $(INCRT)/sys/signal.h\ $(INCRT)/sys/user.h\ $(INCRT)/sys/errno.h\ $(INCRT)/sys/page.h\ $(INCRT)/sys/region.h\ $(INCRT)/sys/proc.h\ $(INCRT)/sys/reg.h\ $(INCRT)/sys/psl.h\ $(INCRT)/sys/trap.h\ $(INCRT)/sys/seg.h\ $(INCRT)/sys/sysinfo.h\ $(INCRT)/sys/sysmacros.h\ D 2 $(INCRT)/sys/debug.h\ $(FRC) E 2 I 2 $(INCRT)/sys/debug.h E 2 $(LIBNAME)(utssys.o):\ $(INCRT)/sys/param.h\ $(INCRT)/sys/types.h\ $(INCRT)/sys/sysmacros.h\ $(INCRT)/sys/page.h\ $(INCRT)/sys/buf.h\ $(INCRT)/sys/filsys.h\ $(INCRT)/sys/mount.h\ $(INCRT)/sys/dir.h\ $(INCRT)/sys/signal.h\ $(INCRT)/sys/user.h\ $(INCRT)/sys/errno.h\ $(INCRT)/sys/var.h\ D 2 $(INCRT)/sys/utsname.h\ $(FRC) E 2 I 2 $(INCRT)/sys/utsname.h E 2 D 8 $(LIBNAME)(vrt.o):\ $(INCRT)/sys/types.h\ $(INCRT)/sys/param.h\ $(INCRT)/sys/sysmacros.h\ $(INCRT)/sys/systm.h\ $(INCRT)/sys/dir.h\ $(INCRT)/sys/signal.h\ $(INCRT)/sys/user.h\ $(INCRT)/sys/inode.h\ $(INCRT)/sys/var.h\ $(INCRT)/sys/mount.h\ $(INCRT)/sys/page.h\ $(INCRT)/sys/debug.h\ D 2 $(INCRT)/sys/vrt.h\ $(FRC) E 2 I 2 $(INCRT)/sys/vrt.h E 8 E 2 $(LIBNAME)(bsdcompat.o):\ $(INCRT)/sys/param.h\ $(INCRT)/sys/types.h\ D 16 $(INCRT)/sys/defsocket.h\ E 16 I 16 D 18 $(INCUCB)/sys/defsocket.h\ E 18 I 18 $(INCRT)/sys/defsocket.h\ E 18 E 16 $(INCRT)/sys/dir.h\ $(INCRT)/sys/errno.h\ $(INCRT)/sys/proc.h\ $(INCRT)/sys/uio.h\ $(INCRT)/sys/user.h\ D 2 $(INCRT)/sys/var.h\ $(FRC) E 2 I 2 $(INCRT)/sys/var.h E 2 $(LIBNAME)(i_domain.o):\ $(INCRT)/sys/param.h\ D 16 $(INCRT)/sys/defsocket.h\ E 16 I 16 D 18 $(INCUCB)/sys/defsocket.h\ E 18 I 18 $(INCRT)/sys/defsocket.h\ E 18 E 16 $(INCRT)/sys/types.h\ D 16 $(INCRT)/sys/domain.h\ D 2 $(INCRT)/sys/protosw.h\ $(FRC) E 2 I 2 $(INCRT)/sys/protosw.h E 16 I 16 $(INCUCB)/sys/domain.h\ $(INCUCB)/sys/protosw.h E 16 E 2 $(LIBNAME)(i_mbuf.o):\ $(INCRT)/sys/param.h\ $(INCRT)/sys/types.h\ D 16 $(INCRT)/sys/defsocket.h\ $(INCRT)/sys/mbuf.h\ E 16 I 16 D 18 $(INCUCB)/sys/defsocket.h\ E 18 I 18 $(INCRT)/sys/defsocket.h\ E 18 D 20 $(INCUCB)/sys/mbuf.h\ E 20 I 20 $(INCRT)/sys/mbuf.h\ E 20 E 16 D 2 $(INCRT)/sys/var.h\ $(FRC) E 2 I 2 D 9 $(INCRT)/sys/var.h E 9 I 9 $(INCRT)/sys/var.h\ $(INCRT)/sys/debug.h\ $(INCRT)/sys/page.h\ $(INCRT)/sys/map.h E 9 D 3 E 3 I 3 E 3 E 2 $(LIBNAME)(i_proto.o):\ D 16 $(INCRT)/sys/defsocket.h\ E 16 I 16 D 18 $(INCUCB)/sys/defsocket.h\ E 18 I 18 $(INCRT)/sys/defsocket.h\ E 18 E 16 $(INCRT)/sys/types.h\ D 16 $(INCRT)/sys/domain.h\ $(INCRT)/sys/protosw.h\ D 2 $(INCRT)/sys/socket.h\ $(FRC) E 2 I 2 $(INCRT)/sys/socket.h E 16 I 16 $(INCUCB)/sys/domain.h\ $(INCUCB)/sys/protosw.h\ $(INCUCB)/sys/socket.h E 16 D 3 E 3 I 3 E 3 E 2 $(LIBNAME)(i_socket.o):\ $(INCRT)/sys/param.h\ $(INCRT)/sys/types.h\ D 16 $(INCRT)/sys/defsocket.h\ E 16 I 16 D 18 $(INCUCB)/sys/defsocket.h\ E 18 I 18 $(INCRT)/sys/defsocket.h\ E 18 E 16 $(INCRT)/sys/dir.h\ $(INCRT)/sys/errno.h\ $(INCRT)/sys/file.h\ D 16 $(INCRT)/sys/mbuf.h\ $(INCRT)/sys/protosw.h\ E 16 I 16 D 20 $(INCUCB)/sys/mbuf.h\ E 20 I 20 $(INCRT)/sys/mbuf.h\ E 20 $(INCUCB)/sys/protosw.h\ E 16 $(INCRT)/sys/signal.h\ D 16 $(INCRT)/sys/socket.h\ $(INCRT)/sys/socketvar.h\ E 16 I 16 $(INCUCB)/sys/socket.h\ $(INCUCB)/sys/socketvar.h\ E 16 $(INCRT)/sys/uio.h\ D 16 $(INCRT)/sys/un.h\ E 16 I 16 $(INCUCB)/sys/un.h\ E 16 $(INCRT)/sys/user.h\ D 2 $(INCRT)/sys/var.h\ $(FRC) E 2 I 2 $(INCRT)/sys/var.h D 3 E 3 I 3 E 3 E 2 $(LIBNAME)(i_socket2.o):\ $(INCRT)/sys/param.h\ $(INCRT)/sys/types.h\ D 16 $(INCRT)/sys/defsocket.h\ E 16 I 16 D 18 $(INCUCB)/sys/defsocket.h\ E 18 I 18 $(INCRT)/sys/defsocket.h\ E 18 E 16 $(INCRT)/sys/dir.h\ $(INCRT)/sys/errno.h\ D 16 $(INCRT)/sys/mbuf.h\ E 16 I 16 D 20 $(INCUCB)/sys/mbuf.h\ E 20 I 20 $(INCRT)/sys/mbuf.h\ E 20 E 16 $(INCRT)/sys/proc.h\ D 16 $(INCRT)/sys/protosw.h\ $(INCRT)/sys/socket.h\ $(INCRT)/sys/socketvar.h\ E 16 I 16 $(INCUCB)/sys/protosw.h\ $(INCUCB)/sys/socket.h\ $(INCUCB)/sys/socketvar.h\ E 16 D 2 $(INCRT)/sys/user.h\ $(FRC) E 2 I 2 $(INCRT)/sys/user.h E 2 $(LIBNAME)(i_syscl.o):\ $(INCRT)/sys/param.h\ $(INCRT)/sys/types.h\ D 16 $(INCRT)/sys/defsocket.h\ E 16 I 16 D 18 $(INCUCB)/sys/defsocket.h\ E 18 I 18 $(INCRT)/sys/defsocket.h\ E 18 E 16 $(INCRT)/sys/buf.h\ $(INCRT)/sys/dir.h\ $(INCRT)/sys/errno.h\ $(INCRT)/sys/file.h\ $(INCRT)/sys/inode.h\ D 16 $(INCRT)/sys/mbuf.h\ $(INCRT)/sys/protosw.h\ $(INCRT)/sys/socket.h\ $(INCRT)/sys/socketvar.h\ E 16 I 16 D 20 $(INCUCB)/sys/mbuf.h\ E 20 I 20 $(INCRT)/sys/mbuf.h\ E 20 $(INCUCB)/sys/protosw.h\ $(INCUCB)/sys/socket.h\ $(INCUCB)/sys/socketvar.h\ E 16 $(INCRT)/sys/systm.h\ $(INCRT)/sys/uio.h\ D 2 $(INCRT)/sys/user.h\ $(FRC) E 2 I 2 $(INCRT)/sys/user.h E 2 $(LIBNAME)(i_usrreq.o):\ $(INCRT)/sys/param.h\ $(INCRT)/sys/types.h\ D 16 $(INCRT)/sys/defsocket.h\ E 16 I 16 D 18 $(INCUCB)/sys/defsocket.h\ E 18 I 18 $(INCRT)/sys/defsocket.h\ E 18 E 16 $(INCRT)/sys/dir.h\ $(INCRT)/sys/errno.h\ $(INCRT)/sys/inode.h\ $(INCRT)/sys/file.h\ D 16 $(INCRT)/sys/mbuf.h\ $(INCRT)/sys/protosw.h\ $(INCRT)/sys/socket.h\ $(INCRT)/sys/socketvar.h\ E 16 I 16 D 20 $(INCUCB)/sys/mbuf.h\ E 20 I 20 $(INCRT)/sys/mbuf.h\ E 20 $(INCUCB)/sys/protosw.h\ $(INCUCB)/sys/socket.h\ $(INCUCB)/sys/socketvar.h\ E 16 $(INCRT)/sys/systm.h\ D 16 $(INCRT)/sys/un.h\ $(INCRT)/sys/unpcb.h\ E 16 I 16 $(INCUCB)/sys/un.h\ $(INCUCB)/sys/unpcb.h\ E 16 $(INCRT)/sys/user.h\ D 2 $(INCRT)/sys/var.h\ $(FRC) E 2 I 2 $(INCRT)/sys/var.h E 2 $(LIBNAME)(sys_socket.o):\ $(INCRT)/sys/param.h\ $(INCRT)/sys/types.h\ D 16 $(INCRT)/sys/defsocket.h\ $(INCRT)/sys/bsdioctl.h\ E 16 I 16 D 18 $(INCUCB)/sys/defsocket.h\ E 18 I 18 $(INCRT)/sys/defsocket.h\ E 18 $(INCUCB)/sys/bsdioctl.h\ E 16 $(INCRT)/sys/dir.h\ $(INCRT)/sys/signal.h\ $(INCRT)/sys/user.h\ $(INCRT)/sys/file.h\ D 16 $(INCRT)/sys/protosw.h\ $(INCRT)/sys/socket.h\ $(INCRT)/sys/socketvar.h\ E 16 I 16 $(INCUCB)/sys/protosw.h\ $(INCUCB)/sys/socket.h\ $(INCUCB)/sys/socketvar.h\ E 16 $(INCRT)/sys/stat.h\ D 2 $(INCRT)/sys/uio.h\ $(FRC) E 2 I 2 $(INCRT)/sys/uio.h E 2 D 2 FRC: print: pr -f Makefile *.c|lp -t"OS SPS9" E 2 E 1 h43334 s 00001/00001/00763 d D 4.4 87/05/14 16:15:32 build 8 7 c removed old SCCS strings and inserted #ident BB e s 00001/00001/00763 d D 4.3 87/04/16 19:13:07 dc 7 6 c dc - Add Bull updates from 03/05/87 e s 00014/00014/00750 d D 4.2 87/04/15 17:49:42 dc 6 5 c dc - changed #include "sys/..." to #include e s 00000/00000/00764 d D 4.1 87/02/20 13:31:27 build 5 4 c rolled rev to -r4 /dc e s 00000/00000/00764 d D 3.1 87/01/19 09:23:36 build 4 3 c rolled rev to -r3 /dc e s 00000/00000/00764 d D 2.1 87/01/19 09:23:36 build 3 2 c AUTO NULL DELTA e s 00001/00000/00763 d D 1.2 87/01/16 10:17:27 build 2 1 c add ident string /dc e s 00763/00000/00000 d D 1.1 87/01/09 16:35:15 build 1 0 c Placed under source control - dc e u U f b f n t T I 2 D 7 /* "%W% %E%" */ E 7 I 7 D 8 /* " %W% %E% " */ E 8 I 8 #ident " %W% %E% " E 8 E 7 E 2 I 1 /* ** Inter-Process Communication Semaphore Facility. */ D 6 #include "sys/types.h" #include "sys/param.h" #include "sys/dir.h" #include "sys/map.h" #include "sys/errno.h" #include "sys/signal.h" #include "sys/ipc.h" #include "sys/sem.h" #include "sys/user.h" #include "sys/seg.h" #include "sys/page.h" #include "sys/region.h" #include "sys/proc.h" #include "sys/buf.h" E 6 I 6 #include #include #include #include #include #include #include #include #include #include #include #include #include #include E 6 #define MOVE iomove extern struct semid_ds sema[]; /* semaphore data structures */ extern struct sem sem[]; /* semaphores */ extern struct map semmap[]; /* sem allocation map */ extern struct sem_undo *sem_undo[]; /* undo table pointers */ extern struct sem_undo semu[]; /* operation adjust on exit table */ extern struct seminfo seminfo; /* param information structure */ extern union { short semvals[1]; /* set semaphore values */ struct semid_ds ds; /* set permission values */ struct sembuf semops[1]; /* operation holding area */ } semtmp; struct sem_undo *semunp; /* ptr to head of undo chain */ struct sem_undo *semfup; /* ptr to head of free undo chain */ extern time_t time; /* system idea of date */ struct semid_ds *ipcget(), *semconv(); /* ** semaoe - Create or update adjust on exit entry. */ semaoe(val, id, num) short val, /* operation value to be adjusted on exit */ num; /* semaphore # */ int id; /* semid */ { register struct undo *uup, /* ptr to entry to update */ *uup2; /* ptr to move entry */ register struct sem_undo *up, /* ptr to process undo struct */ *up2; /* ptr to undo list */ register int i, /* loop control */ found; /* matching entry found flag */ if(val == 0) return(0); if(val > seminfo.semaem || val < -seminfo.semaem) { u.u_error = ERANGE; return(1); } if((up = sem_undo[u.u_procp - proc]) == NULL) if (up = semfup) { semfup = up->un_np; up->un_np = NULL; sem_undo[u.u_procp - proc] = up; } else { u.u_error = ENOSPC; return(1); } for(uup = up->un_ent, found = i = 0;i < up->un_cnt;i++) { if(uup->un_id < id || (uup->un_id == id && uup->un_num < num)) { uup++; continue; } if(uup->un_id == id && uup->un_num == num) found = 1; break; } if(!found) { if(up->un_cnt >= seminfo.semume) { u.u_error = EINVAL; return(1); } if(up->un_cnt == 0) { up->un_np = semunp; semunp = up; } uup2 = &up->un_ent[up->un_cnt++]; while(uup2-- > uup) *(uup2 + 1) = *uup2; uup->un_id = id; uup->un_num = num; uup->un_aoe = -val; return(0); } uup->un_aoe -= val; if(uup->un_aoe > seminfo.semaem || uup->un_aoe < -seminfo.semaem) { u.u_error = ERANGE; uup->un_aoe += val; return(1); } if(uup->un_aoe == 0) { uup2 = &up->un_ent[--(up->un_cnt)]; while(uup++ < uup2) *(uup - 1) = *uup; if(up->un_cnt == 0) { /* Remove process from undo list. */ if(semunp == up) semunp = up->un_np; else for(up2 = semunp;up2 != NULL;up2 = up2->un_np) if(up2->un_np == up) { up2->un_np = up->un_np; break; } up->un_np = NULL; } } return(0); } /* ** semconv - Convert user supplied semid into a ptr to the associated ** semaphore header. */ struct semid_ds * semconv(s) register int s; /* semid */ { register struct semid_ds *sp; /* ptr to associated header */ sp = &sema[s % seminfo.semmni]; if((sp->sem_perm.mode & IPC_ALLOC) == 0 || s / seminfo.semmni != sp->sem_perm.seq) { u.u_error = EINVAL; return(NULL); } return(sp); } /* ** semctl - Semctl system call. */ semctl() { register struct a { int semid; uint semnum; int cmd; int arg; } *uap = (struct a *)u.u_ap; register struct semid_ds *sp; /* ptr to semaphore header */ register struct sem *p; /* ptr to semaphore */ register int i; /* loop control */ if((sp = semconv(uap->semid)) == NULL) return; u.u_rval1 = 0; switch(uap->cmd) { /* Remove semaphore set. */ case IPC_RMID: if(u.u_uid != sp->sem_perm.uid && u.u_uid != sp->sem_perm.cuid && !suser()) return; semunrm(uap->semid, 0, sp->sem_nsems); for(i = sp->sem_nsems, p = sp->sem_base;i--;p++) { p->semval = p->sempid = 0; if(p->semncnt) { wakeup(&p->semncnt); p->semncnt = 0; } if(p->semzcnt) { wakeup(&p->semzcnt); p->semzcnt = 0; } } mfree(semmap, sp->sem_nsems, (sp->sem_base - sem) + 1); if(uap->semid + seminfo.semmni < 0) sp->sem_perm.seq = 0; else sp->sem_perm.seq++; sp->sem_perm.mode = 0; return; /* Set ownership and permissions. */ case IPC_SET: if(u.u_uid != sp->sem_perm.uid && u.u_uid != sp->sem_perm.cuid && !suser()) return; if(copyin(uap->arg, &semtmp.ds, sizeof(semtmp.ds))) { u.u_error = EFAULT; return; } sp->sem_perm.uid = semtmp.ds.sem_perm.uid; sp->sem_perm.gid = semtmp.ds.sem_perm.gid; sp->sem_perm.mode = semtmp.ds.sem_perm.mode & 0777 | IPC_ALLOC; sp->sem_ctime = time; return; /* Get semaphore data structure. */ case IPC_STAT: if(ipcaccess(&sp->sem_perm, SEM_R)) return; if(copyout(sp, uap->arg, sizeof(*sp))) { u.u_error = EFAULT; return; } return; /* Get # of processes sleeping for greater semval. */ case GETNCNT: if(ipcaccess(&sp->sem_perm, SEM_R)) return; if(uap->semnum >= sp->sem_nsems) { u.u_error = EINVAL; return; } u.u_rval1 = (sp->sem_base + uap->semnum)->semncnt; return; /* Get pid of last process to operate on semaphore. */ case GETPID: if(ipcaccess(&sp->sem_perm, SEM_R)) return; if(uap->semnum >= sp->sem_nsems) { u.u_error = EINVAL; return; } u.u_rval1 = (sp->sem_base + uap->semnum)->sempid; return; /* Get semval of one semaphore. */ case GETVAL: if(ipcaccess(&sp->sem_perm, SEM_R)) return; if(uap->semnum >= sp->sem_nsems) { u.u_error = EINVAL; return; } u.u_rval1 = (sp->sem_base + uap->semnum)->semval; return; /* Get all semvals in set. */ case GETALL: if(ipcaccess(&sp->sem_perm, SEM_R)) return; u.u_base = (caddr_t)uap->arg; u.u_offset = 0; u.u_segflg = 0; for(i = sp->sem_nsems, p = sp->sem_base;i--;p++) { MOVE((paddr_t)&p->semval, sizeof(p->semval), B_READ); if(u.u_error) return; } return; /* Get # of processes sleeping for semval to become zero. */ case GETZCNT: if(ipcaccess(&sp->sem_perm, SEM_R)) return; if(uap->semnum >= sp->sem_nsems) { u.u_error = EINVAL; return; } u.u_rval1 = (sp->sem_base + uap->semnum)->semzcnt; return; /* Set semval of one semaphore. */ case SETVAL: if(ipcaccess(&sp->sem_perm, SEM_A)) return; if(uap->semnum >= sp->sem_nsems) { u.u_error = EINVAL; return; } if((unsigned)uap->arg > seminfo.semvmx) { u.u_error = ERANGE; return; } if((p = sp->sem_base + uap->semnum)->semval = uap->arg) { if(p->semncnt) { p->semncnt = 0; wakeup(&p->semncnt); } } else if(p->semzcnt) { p->semzcnt = 0; wakeup(&p->semzcnt); } p->sempid = u.u_procp->p_pid; semunrm(uap->semid, uap->semnum, uap->semnum); return; /* Set semvals of all semaphores in set. */ case SETALL: if(ipcaccess(&sp->sem_perm, SEM_A)) return; u.u_base = (caddr_t)uap->arg; u.u_offset = 0; u.u_segflg = 0; MOVE((paddr_t)semtmp.semvals, sizeof(semtmp.semvals[0]) * sp->sem_nsems, B_WRITE); if(u.u_error) return; for(i = 0;i < sp->sem_nsems;) if(semtmp.semvals[i++] > seminfo.semvmx) { u.u_error = ERANGE; return; } semunrm(uap->semid, 0, sp->sem_nsems); for(i = 0, p = sp->sem_base;i < sp->sem_nsems; (p++)->sempid = u.u_procp->p_pid) { if(p->semval = semtmp.semvals[i++]) { if(p->semncnt) { p->semncnt = 0; wakeup(&p->semncnt); } } else if(p->semzcnt) { p->semzcnt = 0; wakeup(&p->semzcnt); } } return; default: u.u_error = EINVAL; return; } } /* ** semexit - Called by exit(sys1.c) to clean up on process exit. */ semexit() { register struct sem_undo *up, /* process undo struct ptr */ *p; /* undo struct ptr */ register struct semid_ds *sp; /* semid being undone ptr */ register int i; /* loop control */ register long v; /* adjusted value */ register struct sem *semp; /* semaphore ptr */ if((up = sem_undo[u.u_procp - proc]) == NULL) return; if(up->un_cnt == 0) goto cleanup; for(i = up->un_cnt;i--;) { if((sp = semconv(up->un_ent[i].un_id)) == NULL) continue; v = (long)(semp = sp->sem_base + up->un_ent[i].un_num)->semval + up->un_ent[i].un_aoe; if(v < 0 || v > seminfo.semvmx) continue; semp->semval = v; if(v == 0 && semp->semzcnt) { semp->semzcnt = 0; wakeup(&semp->semzcnt); } if(up->un_ent[i].un_aoe > 0 && semp->semncnt) { semp->semncnt = 0; wakeup(&semp->semncnt); } } up->un_cnt = 0; if(semunp == up) semunp = up->un_np; else for(p = semunp;p != NULL;p = p->un_np) if(p->un_np == up) { p->un_np = up->un_np; break; } cleanup: up->un_np = semfup; semfup = up; sem_undo[u.u_procp - proc] = NULL; } /* ** semget - Semget system call. */ semget() { register struct a { key_t key; int nsems; int semflg; } *uap = (struct a *)u.u_ap; register struct semid_ds *sp; /* semaphore header ptr */ register int i; /* temp */ int s; /* ipcget status return */ if((sp = ipcget(uap->key, uap->semflg, sema, seminfo.semmni, sizeof(*sp), &s)) == NULL) return; if(s) { /* This is a new semaphore set. Finish initialization. */ if(uap->nsems <= 0 || uap->nsems > seminfo.semmsl) { u.u_error = EINVAL; sp->sem_perm.mode = 0; return; } if((i = malloc(semmap, uap->nsems)) == NULL) { u.u_error = ENOSPC; sp->sem_perm.mode = 0; return; } sp->sem_base = sem + (i - 1); sp->sem_nsems = uap->nsems; sp->sem_ctime = time; } else if(uap->nsems && sp->sem_nsems < uap->nsems) { u.u_error = EINVAL; return; } u.u_rval1 = sp->sem_perm.seq * seminfo.semmni + (sp - sema); } /* ** seminit - Called by main(main.c) to initialize the semaphore map. */ seminit() { register i; mapinit(semmap, seminfo.semmap); mfree(semmap, seminfo.semmns, 1); semfup = semu; for (i = 0; i < seminfo.semmnu - 1; i++) { semfup->un_np = (struct sem_undo *)((uint)semfup+seminfo.semusz); semfup = semfup->un_np; } semfup->un_np = NULL; semfup = semu; } /* ** semop - Semop system call. */ semop() { register struct a { int semid; struct sembuf *sops; uint nsops; } *uap = (struct a *)u.u_ap; register struct sembuf *op; /* ptr to operation */ register int i; /* loop control */ register struct semid_ds *sp; /* ptr to associated header */ register struct sem *semp; /* ptr to semaphore */ int again; if((sp = semconv(uap->semid)) == NULL) return; if(uap->nsops > seminfo.semopm) { u.u_error = E2BIG; return; } u.u_base = (caddr_t)uap->sops; u.u_offset = 0; u.u_segflg = 0; MOVE((paddr_t)semtmp.semops, uap->nsops * sizeof(*op), B_WRITE); if(u.u_error) return; /* Verify that sem #s are in range and permissions are granted. */ for(i = 0, op = semtmp.semops;i++ < uap->nsops;op++) { if(ipcaccess(&sp->sem_perm, op->sem_op ? SEM_A : SEM_R)) return; if(op->sem_num >= sp->sem_nsems) { u.u_error = EFBIG; return; } } again = 0; check: /* Loop waiting for the operations to be satisified atomically. */ /* Actually, do the operations and undo them if a wait is needed or an error is detected. */ if (again) { /* Verify that the semaphores haven't been removed. */ if(semconv(uap->semid) == NULL) { u.u_error = EIDRM; return; } /* copy in user operation list after sleep */ u.u_base = (caddr_t)uap->sops; u.u_offset = 0; u.u_segflg = 0; MOVE((paddr_t)semtmp.semops, uap->nsops * sizeof(*op), B_WRITE); if(u.u_error) return; } again = 1; for(i = 0, op = semtmp.semops;i < uap->nsops;i++, op++) { semp = sp->sem_base + op->sem_num; if(op->sem_op > 0) { if(op->sem_op + (long)semp->semval > seminfo.semvmx || (op->sem_flg & SEM_UNDO && semaoe(op->sem_op, uap->semid, op->sem_num))) { if(u.u_error == 0) u.u_error = ERANGE; if(i) semundo(semtmp.semops, i, uap->semid, sp); return; } semp->semval += op->sem_op; if(semp->semncnt) { semp->semncnt = 0; wakeup(&semp->semncnt); } continue; } if(op->sem_op < 0) { if(semp->semval >= -op->sem_op) { if(op->sem_flg & SEM_UNDO && semaoe(op->sem_op, uap->semid, op->sem_num)) { if(i) semundo(semtmp.semops, i, uap->semid, sp); return; } semp->semval += op->sem_op; if(semp->semval == 0 && semp->semzcnt) { semp->semzcnt = 0; wakeup(&semp->semzcnt); } continue; } if(i) semundo(semtmp.semops, i, uap->semid, sp); if(op->sem_flg & IPC_NOWAIT) { u.u_error = EAGAIN; return; } semp->semncnt++; if(sleep(&semp->semncnt, PCATCH | PSEMN)) { if((semp->semncnt)-- <= 1) { semp->semncnt = 0; wakeup(&semp->semncnt); } u.u_error = EINTR; return; } goto check; } if(semp->semval) { if(i) semundo(semtmp.semops, i, uap->semid, sp); if(op->sem_flg & IPC_NOWAIT) { u.u_error = EAGAIN; return; } semp->semzcnt++; if(sleep(&semp->semzcnt, PCATCH | PSEMZ)) { if((semp->semzcnt)-- <= 1) { semp->semzcnt = 0; wakeup(&semp->semzcnt); } u.u_error = EINTR; return; } goto check; } } /* All operations succeeded. Update sempid for accessed semaphores. */ for(i = 0, op = semtmp.semops;i++ < uap->nsops; (sp->sem_base + (op++)->sem_num)->sempid = u.u_procp->p_pid); sp->sem_otime = time; u.u_rval1 = 0; } /* ** semsys - System entry point for semctl, semget, and semop system calls. */ semsys() { int semctl(), semget(), semop(); static int (*calls[])() = {semctl, semget, semop}; register struct a { uint id; /* function code id */ } *uap = (struct a *)u.u_ap; if(uap->id > 2) { u.u_error = EINVAL; return; } u.u_ap = &u.u_arg[1]; (*calls[uap->id])(); } /* ** semundo - Undo work done up to finding an operation that can't be done. */ semundo(op, n, id, sp) register struct sembuf *op; /* first operation that was done ptr */ register int n, /* # of operations that were done */ id; /* semaphore id */ register struct semid_ds *sp; /* semaphore data structure ptr */ { register struct sem *semp; /* semaphore ptr */ for(op += n - 1;n--;op--) { if(op->sem_op == 0) continue; semp = sp->sem_base + op->sem_num; semp->semval -= op->sem_op; if(op->sem_flg & SEM_UNDO) semaoe(-op->sem_op, id, op->sem_num); } } /* ** semunrm - Undo entry remover. ** ** This routine is called to clear all undo entries for a set of semaphores ** that are being removed from the system or are being reset by SETVAL or ** SETVALS commands to semctl. */ semunrm(id, low, high) int id; /* semid */ ushort low, /* lowest semaphore being changed */ high; /* highest semaphore being changed */ { register struct sem_undo *pp, /* ptr to predecessor to p */ *p; /* ptr to current entry */ register struct undo *up; /* ptr to undo entry */ register int i, /* loop control */ j; /* loop control */ pp = NULL; p = semunp; while(p != NULL) { /* Search through current structure for matching entries. */ for(up = p->un_ent, i = 0;i < p->un_cnt;) { if(id < up->un_id) break; if(id > up->un_id || low > up->un_num) { up++; i++; continue; } if(high < up->un_num) break; for(j = i;++j < p->un_cnt; p->un_ent[j - 1] = p->un_ent[j]); p->un_cnt--; } /* Reset pointers for next round. */ if(p->un_cnt == 0) /* Remove from linked list. */ if(pp == NULL) { semunp = p->un_np; p->un_np = NULL; p = semunp; } else { pp->un_np = p->un_np; p->un_np = NULL; p = pp->un_np; } else { pp = p; p = p->un_np; } } } E 1 h04768 s 00001/00001/00373 d D 4.4 87/05/14 16:15:44 build 9 8 c removed old SCCS strings and inserted #ident BB e s 00005/00005/00369 d D 4.3 87/04/16 19:14:15 dc 8 7 c dc - Add Bull updates from 03/05/87 e s 00014/00014/00360 d D 4.2 87/04/15 17:49:49 dc 7 6 c dc - changed #include "sys/..." to #include e s 00000/00000/00374 d D 4.1 87/02/20 13:31:32 build 6 5 c rolled rev to -r4 /dc e s 00008/00064/00366 d D 3.2 87/01/26 15:41:32 build 5 4 c add page table changes /dc e s 00000/00000/00430 d D 3.1 87/01/19 09:23:40 build 4 3 c rolled rev to -r3 /dc e s 00000/00000/00430 d D 2.1 87/01/19 09:23:40 build 3 2 c AUTO NULL DELTA e s 00001/00000/00429 d D 1.2 87/01/16 10:17:33 build 2 1 c add ident string /dc e s 00429/00000/00000 d D 1.1 87/01/09 16:35:17 build 1 0 c Placed under source control - dc e u U f b f n t T I 2 D 8 /* "%W% %E%" */ E 8 I 8 D 9 /* " %W% %E% " */ E 9 I 9 #ident " %W% %E% " E 9 E 8 E 2 I 1 D 7 #include "sys/types.h" #include "sys/param.h" #include "sys/dir.h" #include "sys/errno.h" #include "sys/signal.h" #include "sys/user.h" #include "sys/ipc.h" #include "sys/shm.h" #include "sys/seg.h" #include "sys/page.h" #include "sys/region.h" #include "sys/proc.h" #include "sys/systm.h" #include "sys/sysmacros.h" E 7 I 7 #include #include #include #include #include #include #include #include #include #include #include #include #include #include E 7 #define SHMEND (maxumem*NBPP) #define SHMINC (stob(1)) extern struct shmid_ds shmem[]; /* shared memory headers */ extern struct shminfo shminfo; /* shared memory info structure */ extern time_t time; /* system idea of date */ extern pte_t *mshmget(); struct shmid_ds *ipcget(), *shmconv(); /* D 8 * Shmat (attach shared segment) system call. E 8 I 8 * Shmattach (attach shared segment) system call. E 8 */ D 8 shmat() E 8 I 8 shmattach() E 8 { register struct a { int shmid; uint addr; int flag; } *uap = (struct a *)u.u_ap; register struct shmid_ds *sp; register struct region *rp; register struct pregion *prp; if((sp = shmconv(uap->shmid)) == NULL) return; if(ipcaccess(&sp->shm_perm, SHM_R)) return; if((uap->flag & SHM_RDONLY) == 0) if(ipcaccess(&sp->shm_perm, SHM_W)) return; if(uap->flag & SHM_RND) uap->addr = uap->addr & ~(SHMLBA - 1); D 5 rp = sp->shm_reg_rw; E 5 I 5 rp = sp->shm_reg; E 5 reglock(rp); D 5 if (uap->flag & SHM_RDONLY) { if (sp->shm_reg_ro == NULL) { sp->shm_reg_ro = dupreg(rp, SEG_RO); if (sp->shm_reg_ro == NULL) { u.u_error = ENOMEM; regrele(rp); return; } if (rp->r_flags & RG_NOFREE) sp->shm_reg_ro->r_flags |= RG_NOFREE; regrele(sp->shm_reg_ro); } regrele(rp); rp = sp->shm_reg_ro; reglock(rp); } E 5 if(uap->addr == 0) { struct pregion *tprp; uint va; if ((tprp = findpreg(u.u_procp, PT_DATA)) == NULL) if ((tprp = findpreg(u.u_procp, PT_TEXT)) == NULL) panic("shmat: prp"); va = (uint)(tprp->p_regva + (tprp->p_reg->r_pgsz + shminfo.shmbrk)*NBPP ); va = (va + NBPS - 1) & ~(NBPS - 1); for(uap->addr = va; uap->addr <= SHMEND; uap->addr += SHMINC) { if((prp = attachreg(rp, &u, uap->addr, PT_SHMEM, uap->flag & SHM_RDONLY? SEG_RO : SEG_RW)) == NULL) continue; if(sp->shm_perm.mode & SHM_INIT) { if((growreg(&u, prp, btop(sp->shm_segsz), 0, DBD_DZERO)) < 0) { detachreg(&u, prp); /* * detachreg unlock the region * we must lock the region */ reglock(rp) ; prp = NULL; continue; } D 5 if (uap->flag & SHM_RDONLY) { chgprot(prp, SEG_RO); } E 5 sp->shm_perm.mode &= ~SHM_INIT; } break; } if(prp == NULL) { regrele(rp); return; } } else { if((prp = attachreg(rp, &u, uap->addr, PT_SHMEM, uap->flag & SHM_RDONLY? SEG_RO : SEG_RW)) == NULL) { regrele(rp); return; } if(sp->shm_perm.mode & SHM_INIT) { if((growreg(&u, prp, btop(sp->shm_segsz), 0, DBD_DZERO)) < 0) { detachreg(&u, prp); regrele(rp); u.u_error = EINVAL; return; } D 5 if (uap->flag & SHM_RDONLY) { chgprot(prp, SEG_RO); } E 5 sp->shm_perm.mode &= ~SHM_INIT; } } regrele(rp); u.u_error = 0; u.u_rval1 = (int) prp->p_regva; sp->shm_atime = time; sp->shm_lpid = u.u_procp->p_pid; } /* * Convert user supplied shmid into a ptr to the associated * shared memory header. */ struct shmid_ds * shmconv(s) register int s; /* shmid */ { register struct shmid_ds *sp; /* ptr to associated header */ sp = &shmem[s % shminfo.shmmni]; if(!(sp->shm_perm.mode & IPC_ALLOC) || s / shminfo.shmmni != sp->shm_perm.seq) { u.u_error = EINVAL; return(NULL); } return(sp); } /* * Shmctl system call. */ shmctl() { register struct a { int shmid, cmd; struct shmid_ds *arg; } *uap = (struct a *)u.u_ap; register struct shmid_ds *sp; /* shared memory header ptr */ register struct region *rp; /* shmem region */ struct shmid_ds ds; /* hold area for IPC_SET */ if((sp = shmconv(uap->shmid)) == NULL) return; switch(uap->cmd) { /* Remove shared memory identifier. */ case IPC_RMID: if(u.u_uid != sp->shm_perm.uid && u.u_uid != sp->shm_perm.cuid && !suser()) return; D 5 rp = sp->shm_reg_rw; sp->shm_reg_rw = NULL; E 5 I 5 rp = sp->shm_reg; sp->shm_reg = NULL; E 5 sp->shm_perm.mode = 0; sp->shm_segsz = 0; if(((int)(++(sp->shm_perm.seq) * shminfo.shmmni + (sp - shmem))) < 0) sp->shm_perm.seq = 0; reglock(rp); if(rp->r_refcnt == 0) freereg(rp); else { rp->r_flags &= ~RG_NOFREE; regrele(rp); } D 5 if (sp->shm_reg_ro != NULL) { rp = sp->shm_reg_ro; sp->shm_reg_ro = NULL; reglock(rp); if(rp->r_refcnt == 0) freereg(rp); else { rp->r_flags &= ~RG_NOFREE; regrele(rp); } } E 5 break; /* Set ownership and permissions. */ case IPC_SET: if(u.u_uid != sp->shm_perm.uid && u.u_uid != sp->shm_perm.cuid && !suser()) return; if(copyin(uap->arg, &ds, sizeof(ds))) { u.u_error = EFAULT; return; } sp->shm_perm.uid = ds.shm_perm.uid; sp->shm_perm.gid = ds.shm_perm.gid; sp->shm_perm.mode = (ds.shm_perm.mode & 0777) | (sp->shm_perm.mode & ~0777); sp->shm_ctime = time; break; /* Get shared memory data structure. */ case IPC_STAT: if(ipcaccess(&sp->shm_perm, SHM_R)) return; /* The following is needed because ** a user can look at it. In ** particular, the regression tests ** require it. */ D 5 sp->shm_nattch = sp->shm_reg_rw->r_refcnt; if (sp->shm_reg_ro != NULL) sp->shm_nattch += sp->shm_reg_ro->r_refcnt; E 5 I 5 sp->shm_nattch = sp->shm_reg->r_refcnt; E 5 sp->shm_cnattch = sp->shm_nattch; if(copyout(sp, uap->arg, sizeof(*sp))) u.u_error = EFAULT; break; /* Lock segment in memory */ case SHM_LOCK: if(!suser()) return; D 5 rp = sp->shm_reg_rw; E 5 I 5 rp = sp->shm_reg; E 5 reglock(rp); rp->r_flags |= RG_NOSWAP; regrele(rp); D 5 if (sp->shm_reg_ro != NULL) { rp = sp->shm_reg_ro; reglock(rp); rp->r_flags |= RG_NOSWAP; regrele(rp); } E 5 break; /* Unlock segment */ case SHM_UNLOCK: if(!suser()) return; D 5 rp = sp->shm_reg_rw; E 5 I 5 rp = sp->shm_reg; E 5 reglock(rp); rp->r_flags &= ~RG_NOSWAP; regrele(rp); D 5 if (sp->shm_reg_ro != NULL) { rp = sp->shm_reg_ro; reglock(rp); rp->r_flags &= ~RG_NOSWAP; regrele(rp); } E 5 break; default: u.u_error = EINVAL; } } /* * Detach shared memory segment */ shmdt() { register struct a { caddr_t addr; } *uap = (struct a *)u.u_ap; register struct pregion *prp; register struct region *rp; register struct shmid_ds *sp; /* * Find matching shmem address in process region list */ for(prp = u.u_procp->p_region; prp->p_reg; prp++) if(prp->p_type == PT_SHMEM && prp->p_regva == uap->addr) break; if(prp->p_reg == NULL) { u.u_error = EINVAL; return; } /* * Detach region from process * We must remember rp here since detach clobbers p_reg */ rp = prp->p_reg; reglock(rp); detachreg(&u, prp); /* * Find shmem region in system wide table. Update detach time * and pid, and free if appropriate */ for(sp = shmem; sp < &shmem[shminfo.shmmni]; sp++) D 5 if((sp->shm_reg_rw == rp) || (sp->shm_reg_ro == rp)) E 5 I 5 if(sp->shm_reg == rp) E 5 break; if(sp >= &shmem[shminfo.shmmni]) return; /* shmem has been removed already */ sp->shm_dtime = time; sp->shm_lpid = u.u_procp->p_pid; } /* * Exec, exit, and fork subroutines not needed any longer * There function is implemented gratis by normal region handling */ shmexec() { } shmexit() { } shmfork() { } /* * Shmget (create new shmem) system call. */ shmget() { register struct a { key_t key; uint size, shmflg; } *uap = (struct a *)u.u_ap; register struct shmid_ds *sp; /* shared memory header ptr */ register struct region *rp; /* shared memory region ptr */ int s; /* ipcget status */ if((sp = ipcget(uap->key, uap->shmflg, shmem, shminfo.shmmni, sizeof(*sp), &s)) == NULL) return; if(s) { /* * This is a new shared memory segment. * Allocate a region and init shmem table */ if(uap->size < shminfo.shmmin || uap->size > shminfo.shmmax) { u.u_error = EINVAL; sp->shm_perm.mode = 0; return; } if((rp = allocreg(NULL, RT_SHMEM)) == NULL) { u.u_error = ENOMEM; sp->shm_perm.mode = 0; return; } sp->shm_perm.mode |= SHM_INIT; /* grow on first attach */ sp->shm_segsz = uap->size; D 5 sp->shm_reg_rw = rp; E 5 I 5 sp->shm_reg = rp; E 5 sp->shm_atime = sp->shm_dtime = 0; sp->shm_ctime = time; sp->shm_lpid = 0; sp->shm_cpid = u.u_procp->p_pid; rp->r_flags |= RG_NOFREE; regrele(rp); } else { /* * Found an existing segment. Check size */ if(uap->size && uap->size > sp->shm_segsz) { u.u_error = EINVAL; return; } } u.u_rval1 = sp->shm_perm.seq * shminfo.shmmni + (sp - shmem); } /* * System entry point for shmat, shmctl, shmdt, and shmget system calls. */ shmsys() { register struct a { uint id; } *uap = (struct a *)u.u_ap; D 8 int shmat(), E 8 I 8 int shmattach(), E 8 shmctl(), shmdt(), shmget(); D 8 static int (*calls[])() = {shmat, shmctl, shmdt, shmget}; E 8 I 8 static int (*calls[])() = {shmattach, shmctl, shmdt, shmget}; E 8 if(uap->id > 3) { u.u_error = EINVAL; return; } u.u_ap = &u.u_arg[1]; (*calls[uap->id])(); } E 1 h21257 s 00001/00001/00214 d D 4.5 87/05/14 16:15:56 build 9 8 c removed old SCCS strings and inserted #ident BB e s 00004/00000/00211 d D 4.4 87/04/30 18:48:05 dc 8 7 c dc - Change default trap settings e s 00007/00003/00204 d D 4.3 87/04/16 19:14:46 dc 7 6 c dc - Add Bull updates from 03/05/87 e s 00016/00016/00191 d D 4.2 87/04/15 17:49:56 dc 6 5 c dc - changed #include "sys/..." to #include e s 00000/00000/00207 d D 4.1 87/02/20 13:31:35 build 5 4 c rolled rev to -r4 /dc e s 00000/00000/00207 d D 3.1 87/01/19 09:23:43 build 4 3 c rolled rev to -r3 /dc e s 00000/00000/00207 d D 2.1 87/01/19 09:23:43 build 3 2 c AUTO NULL DELTA e s 00001/00000/00206 d D 1.2 87/01/16 10:17:37 build 2 1 c add ident string /dc e s 00206/00000/00000 d D 1.1 87/01/09 16:35:19 build 1 0 c Placed under source control - dc e u U f b f n t T I 2 D 7 /* "%W% %E%" */ E 7 I 7 D 9 /* " %W% %E% " */ E 9 I 9 #ident " %W% %E% " E 9 E 7 E 2 I 1 D 6 #include "sys/types.h" #include "sys/param.h" #include "sys/sysmacros.h" #include "sys/systm.h" #include "sys/dir.h" #include "sys/signal.h" #include "sys/user.h" #include "sys/errno.h" #include "sys/page.h" #include "sys/region.h" #include "sys/proc.h" #include "sys/inode.h" #include "sys/file.h" #include "sys/text.h" #include "sys/var.h" #include "sys/ipc.h" E 6 I 6 #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include E 6 /* * Send the specified signal to * all processes with 'pgrp' as * process group. * Called by tty.c for quits and * interrupts. */ signal(pgrp, sig) register pgrp; { register struct proc *p; if (pgrp == 0) return; for(p = &proc[1]; p < (struct proc *)v.ve_proc; p++) if (p->p_pgrp == pgrp) psignal(p, sig); } /* * Send the specified signal to * the specified process. */ psignal(p, sig) register struct proc *p; register sig; { sig--; if (sig < 0 || sig >= NSIG) return; p->p_sig |= 1L<p_stat == SSLEEP && p->p_pri > PZERO) setrun(p); } /* * Returns true if the current * process has a signal to process. * This is asked at least once * each time a process enters the * system. * A signal does not do anything * directly to a process; it sets * a flag that asks the process to * do something to itself. */ issig() { register n; register struct proc *p, *q; p = u.u_procp; while(p->p_sig) { n = fsig(p->p_sig); if (n == SIGCLD) { if (u.u_signal[SIGCLD-1]&01) { for (q = &proc[1]; q < (struct proc *)v.ve_proc; q++) if (p->p_pid == q->p_ppid && q->p_stat == SZOMB) freeproc(q, 0); } else if (u.u_signal[SIGCLD-1]) return(n); } else if (n == SIGPWR) { if (u.u_signal[SIGPWR-1] && (u.u_signal[SIGPWR-1]&1)==0) return(n); } else if ((u.u_signal[n-1]&1) == 0 || (p->p_flag&STRC)) return(n); p->p_sig &= ~(1L<<(n-1)); } return(0); } /* * Perform the action specified by * the current signal. * The usual sequence is: * if (issig()) * psig(); */ psig(arg) { register n, p; register struct proc *rp; rp = u.u_procp; if (rp->p_flag&STRC) stop(); n = fsig(rp->p_sig); if (n==0) return; rp->p_sig &= ~(1L<<(n-1)); if ((p=u.u_signal[n-1]) != 0) { if (p & 1) return; u.u_error = 0; if (n != SIGILL && n != SIGTRAP) u.u_signal[n-1] = 0; sendsig(p, n, arg); return; } chk: switch(n) { case SIGQUIT: case SIGILL: case SIGTRAP: case SIGABRT: case SIGFPE: case SIGBUS: case SIGSEGV: case SIGSYS: I 7 case SIGBOUNDS: case SIGURG: I 8 case SIGINTOVER: E 8 case SIGINTDIVZERO: case SIGREALOVER: case SIGREALUNDER: case SIGREALDIVZERO: I 8 case SIGREALINEX: case SIGREALINV: case SIGREALBEFORE: E 8 E 7 if (core(n)) n += 0200; exit(n); return; } exit(n); } /* * find the signal in bit-position * representation in p_sig. */ fsig(n) register int n; { register i; for(i = 1; i <= NSIG; i++) { if (n & 1L) return(i); n >>= 1; } return(0); } /* * Create a core image on the file "core" * * It writes USIZE block of the * user.h area followed by the entire * data+stack segments. */ core(n) { register struct inode *ip; extern schar(); if (u.u_uid != u.u_ruid) return(0); u.u_error = 0; u.u_dirp = "core"; ip = namei(schar, 1); if (ip == NULL) { if (u.u_error) return(0); ip = maknode(0666); if (ip==NULL) return(0); } if (!access(ip, IWRITE) && (ip->i_mode&IFMT) == IFREG) D 7 { E 7 coredump(ip, n); D 7 } E 7 else u.u_error = EACCES; iput(ip); return(u.u_error == 0); } E 1 h55220 s 00001/00001/00220 d D 4.4 87/05/14 16:16:06 build 8 7 c removed old SCCS strings and inserted #ident BB e s 00009/00002/00212 d D 4.3 87/04/16 19:15:12 dc 7 6 c dc - Add Bull updates from 03/05/87 e s 00018/00018/00196 d D 4.2 87/04/15 17:50:04 dc 6 5 c dc - changed #include "sys/..." to #include e s 00000/00000/00214 d D 4.1 87/02/20 13:31:38 build 5 4 c rolled rev to -r4 /dc e s 00000/00000/00214 d D 3.1 87/01/19 09:23:45 build 4 3 c rolled rev to -r3 /dc e s 00000/00000/00214 d D 2.1 87/01/19 09:23:45 build 3 2 c AUTO NULL DELTA e s 00001/00000/00213 d D 1.2 87/01/16 10:17:40 build 2 1 c add ident string /dc e s 00213/00000/00000 d D 1.1 87/01/09 16:35:21 build 1 0 c Placed under source control - dc e u U f b f n t T I 2 D 7 /* "%W% %E%" */ E 7 I 7 D 8 /* " %W% %E% " */ E 8 I 8 #ident " %W% %E% " E 8 E 7 E 2 I 1 D 6 #include "sys/types.h" #include "sys/param.h" #include "sys/sysmacros.h" #include "sys/dir.h" #include "sys/signal.h" #include "sys/user.h" #include "sys/page.h" #include "sys/region.h" #include "sys/proc.h" #include "sys/text.h" #include "sys/systm.h" #include "sys/sysinfo.h" #include "sys/file.h" #include "sys/inode.h" #include "sys/buf.h" #include "sys/var.h" #include "sys/ipc.h" #include "sys/errno.h" E 6 I 6 #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include E 6 /* * sleep-wakeup hashing: each entry in hsque[] points to a linked list * of sleeping processes. NHSQUE must be a power of 2. Sqhash(x) * is used to index into hsque[] based on the sleep channel */ #define NHSQUE 64 /* must be power of 2 */ #define sqhash(X) (&hsque[((int)X >> 3) & (NHSQUE-1)]) struct proc *hsque[NHSQUE]; char runout, runin, runrun, curpri; struct proc *curproc, *runq; /* * Give up the processor till a wakeup occurs * on chan, at which time the process * enters the scheduling queue at priority pri. * The most important effect of pri is that when * pri<=PZERO a signal cannot disturb the sleep; * if pri>PZERO signals will be processed. * Callers of this routine must be prepared for * premature return, and check that the reason for * sleeping has gone away. */ #define TZERO 10 sleep(chan, disp) caddr_t chan; { register struct proc *rp = u.u_procp; register struct proc **q = sqhash(chan); register s; s = splhi(); if (panicstr) { spl0(); splx(s); return(0); } rp->p_stat = SSLEEP; rp->p_wchan = chan; D 7 rp->p_link = *q; E 7 I 7 /* * Add process rp to the end of the sleep queue */ while (*q) q = &(*q)->p_link ; rp->p_link = 0; E 7 *q = rp; if (rp->p_time > TZERO) rp->p_time = TZERO; if ((rp->p_pri = (disp&PMASK)) > PZERO) { if (rp->p_sig && issig()) { rp->p_wchan = 0; rp->p_stat = SRUN; *q = rp->p_link; spl0(); goto psig; } spl0(); swtch(); if (rp->p_sig && issig()) goto psig; } else { spl0(); swtch(); } splx(s); return(0); /* * If priority was low (>PZERO) and there has been a signal, * if PCATCH is set, return 1, else * execute non-local goto to the qsav location. */ psig: splx(s); if (disp&PCATCH) return(1); longjmp(u.u_qsav); /* NOTREACHED */ } /* * Wake up all processes sleeping on chan. */ wakeup(chan) register caddr_t chan; { register struct proc *p; register struct proc **q; register runsched = 0; register s; s = splhi(); for (q = sqhash(chan); p = *q; ) { if (p->p_wchan==chan && p->p_stat==SSLEEP) { p->p_stat = SRUN; p->p_wchan = 0; /* * take off sleep queue, put on run queue */ *q = p->p_link; p->p_link = runq; runq = p; if (!(p->p_flag&SLOAD)) { p->p_time = 0; /* * defer setrun to avoid breaking link chain */ if (runout) runsched = 1; } else if (p->p_pri < curpri) runrun++; } else q = &p->p_link; } if (runsched) { runout = 0; setrun(&proc[0]); } splx(s); } setrq(p) register struct proc *p; { register struct proc *q; register s; s = splhi(); for(q=runq; q!=NULL; q=q->p_link) if (q == p) { printf("proc on q\n"); goto out; } p->p_link = runq; runq = p; out: splx(s); } /* * Set the process running; * arrange for it to be swapped in if necessary. */ setrun(p) register struct proc *p; { register struct proc **q; register s; s = splhi(); if (p->p_stat == SSLEEP) { /* take off sleep queue */ for (q = sqhash(p->p_wchan); *q != p; q = &(*q)->p_link); *q = p->p_link; p->p_wchan = 0; } else if (p->p_stat == SRUN) { /* already on run queue - just return */ splx(s); return; } /* put on run queue */ p->p_stat = SRUN; p->p_link = runq; runq = p; if (!(p->p_flag&SLOAD)) { p->p_time = 0; if (runout) { runout = 0; setrun(&proc[0]); } } else if (p->p_pri < curpri) runrun++; splx(s); } E 1 h53172 s 00001/00001/00367 d D 4.5 87/05/14 16:16:19 build 13 12 c removed old SCCS strings and inserted #ident BB e s 00002/00000/00366 d D 4.4 87/05/08 07:36:52 dc 12 9 c dc - Allow write to pages 0 to 3c (inclusive) e s 00002/00000/00366 d R 4.4 87/05/08 07:04:45 dc 11 9 c dc - Allow write to 3c e s 00006/00002/00364 d R 4.4 87/05/07 17:13:05 dc 10 9 c dc - Don't map pages 0-3b in sys space; allow write to 3c (hw clock) e s 00012/00012/00354 d D 4.3 87/04/16 19:20:13 dc 9 8 c dc - Add Bull updates from 03/05/87 e s 00025/00025/00341 d D 4.2 87/04/15 17:50:13 dc 8 7 c dc - changed #include "sys/..." to #include e s 00000/00000/00366 d D 4.1 87/02/20 13:31:42 build 7 6 c rolled rev to -r4 /dc e s 00002/00002/00364 d D 3.3 87/01/28 16:21:46 build 6 5 c change traps word to exclude int ovf, div 0, etc e s 00164/00139/00202 d D 3.2 87/01/26 15:43:28 build 5 4 c add page table changes /dc e s 00000/00000/00341 d D 3.1 87/01/19 09:23:48 build 4 3 c rolled rev to -r3 /dc e s 00000/00000/00341 d D 2.1 87/01/19 09:23:48 build 3 2 c AUTO NULL DELTA e s 00001/00000/00340 d D 1.2 87/01/16 10:17:44 build 2 1 c add ident string /dc e s 00340/00000/00000 d D 1.1 87/01/09 16:35:22 build 1 0 c Placed under source control - dc e u U f b f n t T I 2 D 9 /* "%W% %E%" */ E 9 I 9 D 13 /* " %W% %E% " */ E 13 I 13 #ident " %W% %E% " E 13 E 9 E 2 I 1 D 8 #include "sys/param.h" #include "sys/types.h" #include "sys/sysmacros.h" #include "sys/systm.h" #include "sys/dir.h" #include "sys/signal.h" #include "sys/user.h" #include "sys/errno.h" #include "sys/page.h" #include "sys/region.h" #include "sys/proc.h" #include "sys/seg.h" #include "sys/map.h" #include "sys/reg.h" #include "sys/psl.h" #include "sys/utsname.h" #include "sys/clock.h" #include "sys/ipc.h" #include "sys/shm.h" #include "sys/acct.h" #include "sys/tty.h" #include "sys/var.h" #include "sys/pfdat.h" #include "sys/buf.h" D 5 #include "sys/vrt.h" E 5 #include "sys/debug.h" E 8 I 8 #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include E 8 D 5 ushort m_datasegnum ; extern ushort m_segnum ; E 5 struct pfdat *pfhead, *pfdat; D 5 int *sbrpte; pte_t *mmpte; caddr_t mmvad; pte_t *userpte; struct user *uservad; vrte_t *uacc_vrt[USIZE] ; E 5 extern struct user proc0_u ; extern int maxpmem; /* Configured physical memory limit */ I 5 extern int (*allocator)() ; /* Page allocator used in sptalloc */ extern int (*pgtallocator)() ; /* Page tables allocator used in sptfill */ extern int startup_pgtalloc() ; extern int freemem,firstfree ; E 5 extern int etext; extern int end; extern sched() ; D 5 extern vrte_t *sys_vrthead ; extern ushort sys_segno ; E 5 I 5 /* * Ptes for user blocks, usage is * ublk_ptbl[(p - &proc[0]) + i] * to access pte for page i of user block */ E 5 D 5 vrte_t *u_vrt[USIZE] ; E 5 I 5 pte_t *ublk_ptbl ; sgtbl_t ublk_sgtbl ; E 5 I 5 caddr_t kbase ; scte_t *ksct ; sctbl_t sys_sect ; int ksv_sz ; E 5 /* I 5 * next_page() is the page allocator used until pfdat initialized. * It is at least used in ptfill and startup_pgtalloc to get page descriptors */ next_page() { return(firstfree++) ; } /* E 5 * Initially, running in physical memory without memory map and D 5 * using interrupt stack. E 5 I 5 * using an intermidate stack. E 5 * * Allocate system virtual address space and setup virtual windows. * D 5 * Dedicate memory for boot time tables and thread rest on free list. E 5 * * Create address space for proc 0. After vadrspace returns, we switch * to the hardware process context of proc 0. D 5 */ E 5 I 5 */ E 5 vadrspace(lastaddr, startpc) { register i; D 5 register pte_t *sbr; int nspte, ubase,nb_vrtentrys; register paddr_t vaddr ; E 5 I 5 register pte_t *sptbl ; register sgte_t *sgtbl ; register scte_t *sctbl ; int nspte, nsgte, nscte, ubase ; int firstsect ; E 5 if (maxpmem && maxpmem < btop(lastaddr)) physmem = maxpmem; else physmem = btop(lastaddr); /* D 5 * Number of pages needed for system vrt table to map E 5 I 5 * Number of pages needed for system page tables to map E 5 * entire physical memory into system space. D 5 */ nb_vrtentrys = (physmem+NPGVRT-1)/NPGVRT ; sys_vrthead = (vrte_t *)&end ; sys_vrt_init(physmem) ; E 5 I 5 */ nspte = (physmem+NPGPT-1)/NPGPT; nspte = (nspte + NPTPP -1)/NPTPP ; E 5 /* D 5 * Number of pages needed for system page table to map E 5 I 5 * Number of pages needed for system segment tables to map E 5 * entire physical memory into system space. D 5 */ nspte = (physmem+NPGPT-1)/NPGPT; nspte = (nspte + NPTPP -1)/NPTPP ; sbr = (pte_t *)((int)sys_vrthead + ptob(nb_vrtentrys)) ; sbrpte = (int *) sbr; E 5 I 5 */ nsgte = (nspte + NPTPP - 1) / NPTPP ; E 5 /* I 5 * Number of sections needed to map * entire physical memory into system space. */ nscte = (physmem + NPGPSC - 1) / (NPGPSC) ; sgtbl = (sgte_t *)&end ; sptbl = (pte_t *)((int)sgtbl + ptob(nsgte)) ; ksct = (scte_t *)&sys_sect ; ksct->sgt_paddr = (int)sgtbl - SYSVA ; sctbl = ksct + NBSECT - (nscte + 1) ; for ( i = 0 ; i < nscte ; i++, sctbl++) { sctbl->sgt_paddr = (int)sgtbl - SYSVA ; sgtbl += NSGTPSC ; } /* E 5 * Setup text system page table entries (RO) * Setup system data and bss and page table itself (RW) D 5 */ E 5 I 5 D 9 */ E 9 I 9 */ E 9 E 5 D 5 for (i = 0; i < btop((int)(&etext) - SYSVA); i++) E 5 I 5 for (i = 0 ; i < btop((int)(&etext) - SYSVA) ; i++) E 5 { D 5 sbr->pgm.pg_pfn = i ; sbr->pgi.pg_pte |= (PG_V | PG_KR) ; sbr++ ; E 5 I 5 sptbl->pgm.pg_pfn = i ; sptbl->pgi.pg_pte |= (PG_V | PG_KR) ; I 12 if (i <= FIRSTFREE_PAGES) sptbl->pgi.pg_pte |= (PG_KW) ; E 12 sptbl++ ; E 5 } D 5 for ( ; i < (btop((int)(&end) - SYSVA) + nspte + nb_vrtentrys); i++) E 5 I 5 for ( ; i < (btop((int)(&end) - SYSVA) + nspte + nsgte); i++) E 5 { D 5 sbr->pgm.pg_pfn = i ; sbr->pgi.pg_pte |= (PG_V | PG_KW) ; sbr++ ; E 5 I 5 sptbl->pgm.pg_pfn = i ; sptbl->pgi.pg_pte |= (PG_V | PG_KW) ; sptbl++ ; E 5 } D 5 /* * Map text system pages into system vrt */ vaddr = SYSVA ; sbr = (pte_t *)sbrpte ; for (i = 0; i < btop((int)(&etext) - SYSVA); i++) E 5 I 5 firstfree = i ; for ( ; i < physmem ; i++) E 5 { D 5 sys_vrt_insert(vaddr,sbr->pgi.pg_pte,sys_segno) ; sbr++ ; vaddr += NBPP ; E 5 I 5 sptbl->pgm.pg_pfn = i ; sptbl->pgi.pg_pte |= (PG_V | PG_KW) ; sptbl++ ; E 5 } D 5 /* * Map data system pages into system vrt */ for ( ; i < (btop((int)(&end) - SYSVA) + nspte + nb_vrtentrys); i++) E 5 I 5 sgtbl = (sgte_t *)&end ; sptbl = (pte_t *)((int)sgtbl + ptob(nsgte)) ; nspte = (physmem+NPGPT-1)/NPGPT; for (i = 0 ; i < nspte ; i ++ , sgtbl++) E 5 { D 5 sys_vrt_insert(vaddr,sbr->pgi.pg_pte,sys_segno) ; sbr++ ; vaddr += NBPP ; E 5 I 5 sgtbl->pt_paddr = ptost((int)sptbl - SYSVA) ; sgtbl->pt_w = SGT_KW ; sptbl += NPGPT ; E 5 } I 5 E 5 /* I 5 * Physical memory is mapped contiguously at virtual address kbase. */ ksv_sz = (NBSECT - (nscte + 1)) << (L1WIDTH + L0WIDTH) ; firstsect = 1 << (L1WIDTH + L0WIDTH) ; /* E 5 * Initialize system page table map */ D 5 mfree(sptmap, physmem - i, i) ; E 5 I 5 mfree(sptmap, ksv_sz - firstsect, firstsect) ; E 5 /* D 5 * Allocate physical memory for dynamic tables */ E 5 I 5 * Phys map non initialized, use a anthor allocator * for sptalloc */ E 5 D 5 ubase = i; ubase = mktables(ubase); E 5 I 5 allocator = next_page ; pgtallocator = startup_pgtalloc ; freemem = 1024 ; /* necessary for memreserve */ kbase = (caddr_t)SYSVA ; E 5 /* D 5 * Initialize queue of free pages */ meminit(ubase, physmem); E 5 I 5 * No page tables available yet. */ E 5 I 5 ptfree.pf_next = &ptfree ; ptfree.pf_prev = &ptfree ; E 5 /* D 5 * Virtual address space for acessing ublock */ uservad = (struct user *)sptalloc(btop(sizeof u), PG_V | PG_KW, -1); userpte = (pte_t *)svtopte(uservad); for (i = 0 ; i < btop(sizeof u) ; i++) { uacc_vrt[i] = (vrte_t *)sys_vrt_insert(uservad+ctob(i), userpte[i],sys_segno) ; } E 5 I 5 * Allocate user block page tables */ E 5 I 5 ublk_ptbl = (pte_t *)sptalloc(btop(v.v_proc * USIZE * sizeof(pte_t)), PG_V | PG_KW, 0) ; E 5 /* D 5 * Virtual address space for memory driver */ mmvad = (caddr_t)sptalloc(1, 0, -1); mmpte = (pte_t *)svtopte(mmvad); E 5 I 5 * Allocate physical memory for dynamic tables */ E 5 I 5 mktables(); E 5 reginit(); p0init(startpc); } /* * Create the physical address space for proc 0. Most proc 0 parameters * are initialized in main(), but some must be initialized now. * main() is entered on the kernel stack and enough of proc 0 must be * set up to have a kernel stack D 5 */ E 5 I 5 D 9 */ E 9 I 9 */ E 9 E 5 #ifdef LOCKLOGON int p0init_done = 0; /* for region lock logging */ #endif p0init(startpc) { register struct user *useg; D 5 pte_t *upt; E 5 I 5 pte_t *p0ptbl,*curprocptbl ; E 5 int i; D 5 paddr_t vaddr ; E 5 register pcbt *p0s_pcb ; /* * Hand craft U block for the Scheduler D 5 */ E 5 I 5 D 9 */ E 9 I 9 */ E 9 E 5 curproc = &proc[0]; curproc->p_flag = SLOAD|SSYS; D 5 curproc->p_txtsegno = sys_segno ; curproc->p_dsegno = sys_segno ; E 5 useg = &proc0_u ; useg->u_procp = &proc[0]; useg->u_ssize = 0; D 5 curproc->p_sgt = (pte_t **)sptalloc(1, PG_V | PG_KW , 0); E 5 /* * Handcraft process context for scheduler * * init the system pcb for proc 0 * this system pcb is at location useg+(USIZE << BPPSHIFT)-sizeof(pcbt) D 5 */ E 5 I 5 D 9 */ E 9 I 9 */ E 9 E 5 p0s_pcb = (pcbt *)((uint)useg + (USIZE << BPPSHIFT) - sizeof(pcbt)) ; p0s_pcb->pc = (char *)startpc ; p0s_pcb->regs[SP] = KERNSTACK - sizeof(pcbt) - 72 ; p0s_pcb->regs[R15] = KERNSTACK - sizeof(pcbt) ; D 5 p0s_pcb->text_seg = sys_segno ; p0s_pcb->data_seg = sys_segno ; p0s_pcb->traps_word = 0xfffff801 ; /* privilege user mode and trap */ E 5 I 5 D 6 p0s_pcb->traps_word = 0xffff7801 ; /* privilege user mode and trap */ E 6 I 6 D 9 p0s_pcb->traps_word = 0xc0000001 ; /* privilege user mode and trap */ E 9 I 9 p0s_pcb->traps_word = SYS_DEFAULT_TRPSW ; /* privilege user mode and trap */ E 9 E 6 E 5 p0s_pcb->sregs[SR7] = PS_SV ; p0s_pcb->sregs[SR6] = KERNSTACK - sizeof(pcbt) ; D 5 /* allocate user stack for proc 0 */ /* init its user pcb */ E 5 I 5 /* * Init sched user pcb */ E 5 useg->u_pcb.pc = sched; useg->u_pcb.regs[SP] = KERNSTACK - 72 ; D 5 useg->u_pcb.text_seg = sys_segno ; useg->u_pcb.data_seg = sys_segno ; useg->u_pcb.traps_word = 0xfffff801 ; E 5 I 5 D 6 useg->u_pcb.traps_word = 0xffff7801 ; E 6 I 6 D 9 useg->u_pcb.traps_word = 0xc0000001 ; E 9 I 9 useg->u_pcb.traps_word = SYS_DEFAULT_TRPSW ; /* privilege user mode and trap */ E 9 E 6 E 5 useg->u_pcb.sregs[SR7] = PS_SV ; useg->u_pcb.sregs[SR6] = (int)&u ; D 5 upt = (pte_t *)&sbrpte[svtop(useg)]; vaddr = (paddr_t)&u ; for (i=0; ip_addr[i] = *upt ; u_vrt[i] = (vrte_t *)sys_vrt_insert(vaddr,*upt,sys_segno) ; vaddr += NBPP ; upt++ ; } E 5 I 5 curprocptbl = (pte_t *)ublkptbl(curproc) ; curproc->p_addr.pt_paddr = ptost(svtophys(curprocptbl)) ; curproc->p_addr.pt_w = SGT_KW ; ublk_sgtbl.segment[NSGTPSC-1] = curproc->p_addr ; sys_sect.section[NBSECT - 1].sgt_paddr = (int)&ublk_sgtbl - SYSVA ; E 5 I 5 curprocptbl = (pte_t *)svtophys(curprocptbl) ; p0ptbl = svtopte(useg) ; for (i = 0 ; i < USIZE ; i++, p0ptbl++, curprocptbl++) *curprocptbl = *p0ptbl ; E 5 /* * Now we can access the u structure */ # ifdef LOCKLOGON p0init_done = 1; # endif } /* * Create system space to hold page allocation and * buffer mapping structures and hash tables. D 5 */ mktables(physpage) register int physpage; E 5 I 5 D 9 */ E 9 I 9 */ E 9 mktables() E 5 { register int ffguess; register int pagedpages, m; register preg_t *prp; extern int pregpp; register int i; I 5 register sctbl_t *pscte ; E 5 /* I 5 * Allocate space for the pregion tables for each process * and link them to the process table entries. * The maximum number of regions allowed for is process is * 3 for text, data, and stack plus the maximum number * of shared memory regions allowed. */ i = btop(pregpp * sizeof(preg_t) * v.v_proc); prp = (preg_t *)sptalloc(i, PG_V|PG_KW, 0); i = btop(sizeof(sctbl_t) * v.v_proc) ; pscte = (sctbl_t *)sptalloc(i, PG_V | PG_KW, 0) ; for(i = 0 ; i < v.v_proc ; i++, prp += pregpp, pscte++) { proc[i].p_region = prp; proc[i].p_sct = pscte ; } /* E 5 * Sizing of data structures to match physical memory * Underestimate D 5 */ ffguess = btop((int)(&end)); pagedpages = (physmem - ffguess); E 5 I 5 D 9 */ E 9 I 9 */ E 9 pagedpages = physmem ; E 5 /* * Numerical convergence to round to a power of 2 D 5 */ E 5 I 5 D 9 */ E 9 I 9 */ E 9 E 5 m = pagedpages; while (m & (m - 1)) m = (m | (m - 1)) + 1; phashmask = (m>>3) - 1; /* * Allocate system space for page structures D 5 */ i = btop(pagedpages*sizeof(*pfdat)); pfdat = ((struct pfdat *)sptalloc(i, PG_V | PG_KW, physpage)) - ffguess; physpage += i; E 5 I 5 */ i = btop(pagedpages*sizeof(*pfdat)) ; pfdat = ((struct pfdat *)sptalloc(i, PG_V | PG_KW, 0)) ; E 5 /* * Hash table to find buffers D 5 */ E 5 I 5 */ E 5 i = btop((m>>3) * sizeof(*phash)); D 5 phash = ((struct pfdat *)sptalloc(i, PG_V | PG_KW, physpage)); physpage += i; E 5 I 5 phash = ((struct pfdat *)sptalloc(i, PG_V | PG_KW, 0)); E 5 D 5 /* * Allocate space for the pregion tables for each process * and link them to the process table entries. * The maximum number of regions allowed for is process is * 3 for text, data, and stack plus the maximum number * of shared memory regions allowed. */ i = btop(pregpp * sizeof(preg_t) * v.v_proc); prp = (preg_t *)sptalloc(i, PG_V|PG_KW, physpage); physpage += i; m_datasegnum = 1 ; for(i = 0 ; i < v.v_proc ; i++, prp += pregpp) { proc[i].p_region = prp; proc[i].p_dsegno = m_datasegnum++ ; } m_segnum = m_datasegnum ; return(physpage); E 5 } /* * Machine-dependent startup code D 5 */ E 5 I 5 D 9 */ E 9 I 9 */ E 9 E 5 startup() { D 5 printf("\nUNIX/%s: %s.%s\n", utsname.release, utsname.sysname, utsname.version); printf("real mem = %d\n", physmem*ctob(1) ); printf("avail mem = %d\n", maxmem*ctob(1)); E 5 I 5 debug(DB1,"\n%s release: %s version: %s on %s\n\n", utsname.sysname, utsname.release, utsname.version, utsname.machine); debug(DB1,"real mem = %d K ", physmem*ctob(1)); debug(DB1,"avail mem = %d K\n", maxmem*ctob(1)); E 5 } /* * Initialize clist by freeing all character blocks. D 5 */ E 5 I 5 D 9 */ E 9 I 9 */ E 9 E 5 struct chead cfreelist; cinit() { register n; register struct cblock *cp; for(n = 0, cp = &cfree[0]; n < v.v_clist; n++, cp++) { cp->c_next = cfreelist.c_next; cfreelist.c_next = cp; } cfreelist.c_size = CLSIZE; } E 1 h09549 s 00001/00001/00186 d D 4.4 87/05/14 16:16:30 build 8 7 c removed old SCCS strings and inserted #ident BB e s 00001/00001/00186 d D 4.3 87/04/16 19:20:27 dc 7 6 c dc - Add Bull updates from 03/05/87 e s 00013/00013/00174 d D 4.2 87/04/15 17:50:25 dc 6 5 c dc - changed #include "sys/..." to #include e s 00000/00000/00187 d D 4.1 87/02/20 13:31:46 build 5 4 c rolled rev to -r4 /dc e s 00000/00000/00187 d D 3.1 87/01/19 09:23:51 build 4 3 c rolled rev to -r3 /dc e s 00000/00000/00187 d D 2.1 87/01/19 09:23:51 build 3 2 c AUTO NULL DELTA e s 00001/00000/00186 d D 1.2 87/01/16 10:17:47 build 2 1 c add ident string /dc e s 00186/00000/00000 d D 1.1 87/01/09 16:35:24 build 1 0 c Placed under source control - dc e u U f b f n t T I 2 D 7 /* "%W% %E%" */ E 7 I 7 D 8 /* " %W% %E% " */ E 8 I 8 #ident " %W% %E% " E 8 E 7 E 2 I 1 D 6 #include "sys/param.h" #include "sys/types.h" #include "sys/sysmacros.h" #include "sys/systm.h" #include "sys/inode.h" #include "sys/dir.h" #include "sys/signal.h" #include "sys/user.h" #include "sys/errno.h" #include "sys/page.h" #include "sys/buf.h" #include "sys/mount.h" #include "sys/var.h" E 6 I 6 #include #include #include #include #include #include #include #include #include #include #include #include #include E 6 /* * Bmap defines the structure of file system storage * by returning the physical block number on a device given the * inode and the logical block number in a file. * When convenient, it also leaves the physical * block number of the next block of the file in u.u_rablock * for use in read-ahead. */ daddr_t bmap(ip, readflg) register struct inode *ip; { register i; register dev; daddr_t bn; daddr_t nb, *bap; int raflag; u.u_rablock = 0; raflag = 0; { register sz, rem, type; type = ip->i_mode&IFMT; if (type == IFBLK) { dev = (dev_t)ip->i_rdev; for (i=0; ii_dev; u.u_pbdev = dev; bn = FsBNO(dev, u.u_offset); if (bn < 0) { u.u_error = EFBIG; return((daddr_t)-1); } if ((ip->i_lastr + 1) == bn) raflag++; u.u_pboff = FsBOFF(dev, u.u_offset); sz = FsBSIZE(dev) - u.u_pboff; if (u.u_count < sz) { sz = u.u_count; raflag = 0; } else ip->i_lastr = bn; u.u_pbsize = sz; if (type == IFBLK) { if (raflag) u.u_rablock = bn + 1; return(bn); } if (readflg) { if (type == IFIFO) { raflag = 0; rem = ip->i_size; } else rem = ip->i_size - u.u_offset; if (rem < 0) rem = 0; if (rem < sz) sz = rem; if ((u.u_pbsize = sz) == 0) return((daddr_t)-1); } else { if (bn >= FsPTOL(dev, u.u_limit)) { u.u_error = EFBIG; return((daddr_t)-1); } } } { register struct buf *bp; register j, sh; /* * blocks 0..NADDR-4 are direct blocks */ if (bn < NADDR-3) { i = bn; nb = ip->i_addr[i]; if (nb == 0) { if (readflg || (bp = alloc(dev))==NULL) return((daddr_t)-1); nb = FsPTOL(dev, bp->b_blkno); bdwrite(bp); ip->i_addr[i] = nb; ip->i_flag |= IUPD|ICHG; } if ((i < NADDR-4) && raflag) u.u_rablock = ip->i_addr[i+1]; return(nb); } /* * addresses NADDR-3, NADDR-2, and NADDR-1 * have single, double, triple indirect blocks. * the first step is to determine * how many levels of indirection. */ sh = 0; nb = 1; bn -= NADDR-3; for(j=3; j>0; j--) { sh += FsNSHIFT(dev); nb <<= FsNSHIFT(dev); if (bn < nb) break; bn -= nb; } if (j == 0) { u.u_error = EFBIG; return((daddr_t)-1); } /* * fetch the address from the inode */ nb = ip->i_addr[NADDR-j]; if (nb == 0) { if (readflg || (bp = alloc(dev))==NULL) return((daddr_t)-1); nb = FsPTOL(dev, bp->b_blkno); bwrite(bp); ip->i_addr[NADDR-j] = nb; ip->i_flag |= IUPD|ICHG; } /* * fetch through the indirect blocks */ for(; j<=3; j++) { bp = bread(dev, nb); if (u.u_error) { brelse(bp); return((daddr_t)-1); } bap = bp->b_un.b_daddr; sh -= FsNSHIFT(dev); i = (bn>>sh) & FsNMASK(dev); nb = bap[i]; if (nb == 0) { register struct buf *nbp; if (readflg || (nbp = alloc(dev))==NULL) { brelse(bp); return((daddr_t)-1); } nb = FsPTOL(dev, nbp->b_blkno); if (j < 3) bwrite(nbp); else bdwrite(nbp); bap[i] = nb; bdwrite(bp); } else brelse(bp); } /* * calculate read-ahead. */ if ((i < FsNINDIR(dev)-1) && raflag) u.u_rablock = bap[i+1]; return(nb); } } E 1 h45229 s 00001/00001/00520 d D 4.4 87/05/14 16:16:42 build 9 8 c removed old SCCS strings and inserted #ident BB e s 00004/00002/00517 d D 4.3 87/04/16 19:20:50 dc 8 7 c dc - Add Bull updates from 03/05/87 e s 00020/00020/00499 d D 4.2 87/04/15 17:50:32 dc 7 6 c dc - changed #include "sys/..." to #include e s 00000/00000/00519 d D 4.1 87/02/20 13:31:50 build 6 5 c rolled rev to -r4 /dc e s 00000/00001/00519 d D 3.2 87/01/26 15:44:27 build 5 4 c add page table changes /dc e s 00000/00000/00520 d D 3.1 87/01/19 09:23:54 build 4 3 c rolled rev to -r3 /dc e s 00000/00000/00520 d D 2.1 87/01/19 09:23:54 build 3 2 c AUTO NULL DELTA e s 00001/00000/00519 d D 1.2 87/01/16 10:17:51 build 2 1 c add ident string /dc e s 00519/00000/00000 d D 1.1 87/01/09 16:35:25 build 1 0 c Placed under source control - dc e u U f b f n t T I 2 D 8 /* "%W% %E%" */ E 8 I 8 D 9 /* " %W% %E% " */ E 9 I 9 #ident " %W% %E% " E 9 E 8 E 2 I 1 D 7 #include "sys/types.h" #include "sys/param.h" #include "sys/sysmacros.h" #include "sys/sysinfo.h" #include "sys/dir.h" #include "sys/signal.h" #include "sys/user.h" #include "sys/errno.h" #include "sys/conf.h" #include "sys/var.h" #include "sys/inode.h" #include "sys/buf.h" #include "sys/pfdat.h" #include "sys/page.h" #include "sys/seg.h" #include "sys/region.h" #include "sys/proc.h" #include "sys/swap.h" #include "sys/systm.h" E 7 I 7 #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include E 7 D 7 #include "sys/debug.h" E 7 I 7 #include E 7 extern int swapwant; /* Set if somebody's looking for swap */ /* Allocate swap file space. */ swalloc(dbd, size) register dbd_t *dbd; /* Ptr to dbd's to set up. */ register int size; /* Number of pages of swap needed. */ { register int smi; register use_t *cntptr; register int i; register int swappg; swappg = 0; /* Search all of the swap files, starting with the one * following the one which we allocated on last, looking * for a file with enough space to satisfy the current * request. */ for(;;) { smi = nextswap; /* There can be holes in the swap file table * (swaptab) due to deletions. */ do { /* If the current swaptab entry is not * in use or is in the process of being * deleted, go on to the next one. */ if((swaptab[smi].st_ucnt == NULL) || (swaptab[smi].st_flags & ST_INDEL)) continue; if(swappg = swapfind(&swaptab[smi], size)) break; } while((smi = (smi + 1) % MSFILES) != nextswap); /* If we got the swap space, then go set up the * disk block descriptors. */ if(swappg) break; /* Try to free up some swap space by removing * unused sticky text regions. If this * suceeds, try to allocate again. */ if(swapclup()) continue; swapwant++; return(-1) ; } /* Page numbers in the map begin at 1 since swapfind * returns 0 for an error. Fix this now. Then * set up for main dbd processing loop. */ swappg -= 1; cntptr = &swaptab[smi].st_ucnt[swappg]; swappg = swaptab[smi].st_swplo + (swappg << DPPSHFT); swaptab[smi].st_nfpgs -= size; nextswap = (smi + 1) % MSFILES; /* Initialize the swap use counts for each page * and set up the disk block descriptors (dbd's). */ for(i = 0 ; i < size ; i++, cntptr++, dbd++) { *cntptr = 1; dbd->dbd_type = DBD_SWAP; dbd->dbd_swpi = smi; dbd->dbd_blkno = swappg + (i << DPPSHFT); } return(swappg); } /* Free one page of swap and return the resulting use count. */ swfree1(dbd) register dbd_t *dbd; /* Ptr to disk block descriptor for */ /* block to be removed. */ { register use_t *cntptr; register int pgnbr; register swpt_t *st; register retval; st = &swaptab[dbd->dbd_swpi]; pgnbr = (dbd->dbd_blkno - st->st_swplo) >> DPPSHFT; cntptr = &st->st_ucnt[pgnbr]; pgnbr += 1; ASSERT(*cntptr != 0); /* Decrement the use count for this page. If it goes * to zero, then free the page. */ retval = (*cntptr -= 1); if(retval == 0) { st->st_nfpgs += 1; swapwant = 0; } return(retval); } /* Find the use count for a block of swap. */ swpuse(dbd) register dbd_t *dbd; { register swpt_t *st; register int pg; st = &swaptab[dbd->dbd_swpi]; pg = (dbd->dbd_blkno - st->st_swplo) >> DPPSHFT; return(st->st_ucnt[pg]); } /* Increment the use count for a block of swap. */ swpinc(dbd, nm) register dbd_t *dbd; char *nm; { register swpt_t *st; register int pg; st = &swaptab[dbd->dbd_swpi]; pg = (dbd->dbd_blkno - st->st_swplo) >> DPPSHFT; if(st->st_ucnt[pg] >= MAXSUSE) { D 8 printf("%s - swpuse count overflow\n", nm); E 8 I 8 printf("swpuse count overflow - %s\n", nm); E 8 return(0); } st->st_ucnt[pg]++; return(1); } /* Add a new swap file. */ swapadd(dev, lowblk, nblks) dev_t dev; /* The device code. */ int lowblk; /* First block on device to use.*/ int nblks; /* Nbr of blocks to use. */ { register int smi; register swpt_t *st; register int i; /* Find a free entry in the swap file table. * Check to see if the new entry duplicates an * existing entry. If so, this is an error unless * the existing entry is being deleted. In this * case, just clear the INDEL flag and the swap * file will be used again. */ smi = -1; for(i = 0 ; i < MSFILES ; i++) { st = &swaptab[i]; if(st->st_ucnt == NULL) { if(smi == -1) smi = i; } else if(st->st_dev == dev && st->st_swplo == lowblk) { if((st->st_flags & ST_INDEL) && (st->st_npgs == (nblks >> DPPSHFT))) { st->st_flags &= ~ST_INDEL; return(smi); } u.u_error = EEXIST; return(-1); } } /* If no free entry is available, give an error * return. */ if(smi < 0) { u.u_error = ENOSPC; return(-1); } st = &swaptab[smi]; /* Open the swap file. */ u.u_error = 0; (*bdevsw[bmajor(dev)].d_open)(minor(dev), 1); if(u.u_error) return(-1); /* Initialize the new entry. */ st->st_dev = dev; st->st_swplo = lowblk; st->st_npgs = nblks >> DPPSHFT; st->st_nfpgs = st->st_npgs; /* Allocate space for the use count array. One counter * for each page of swap. */ i = btop(st->st_npgs * sizeof(use_t)); st->st_ucnt = (use_t *)sptalloc(i, PG_V | PG_KW, 0); I 8 if (st->st_ucnt == NULL) return(-1) ; E 8 bzero(st->st_ucnt,ptob(i)) ; st->st_last = st->st_ucnt; /* *Clearing the flags allows swalloc to find it */ st->st_flags = 0; swapwant = 0; return(smi); } /* Delete a swap file. */ swapdel(dev, lowblk) register dev_t dev; /* Device to delete. */ register int lowblk; /* Low block number of area to delete. */ { register swpt_t *st; register int smi; register int i; register int ok; /* Find the swap file table entry for the file to * be deleted. Also, make sure that we don't * delete the last swap file. */ ok = 0; smi = -1; for(i = 0 ; i < MSFILES ; i++) { st = &swaptab[i]; if(st->st_ucnt == NULL) continue; if(st->st_dev == dev && st->st_swplo == lowblk) smi = i; else if((st->st_flags & ST_INDEL) == 0) ok++; }; /* If the file was not found, then give an error * return. */ if(smi < 0) { u.u_error = EINVAL; return(-1); } /* If we are trying to delete the last swap file, * then give an error return. */ if(!ok) { u.u_error = ENOMEM; return(-1); } st = &swaptab[smi]; /* Set the delete flag. Clean up its pages. * The file will be removed by swfree1 when * all of the pages are freed. */ st->st_flags |= ST_INDEL; if(st->st_nfpgs < st->st_npgs) getswap(smi); if(st->st_nfpgs == st->st_npgs) swaprem(st); return(smi); } /* Remove a swap file from swaptab. */ swaprem(st) swpt_t *st; { register int i; /* Release the space used by the use count array. */ i = btop(st->st_npgs * sizeof(use_t)); sptfree(st->st_ucnt, i, 1); /* Mark the swaptab entry as unused. */ st->st_ucnt = NULL; } /* Try to free up swap space on the swap device being deleted. * Look at every region for pages which are swapped to the * device we want to delete. Read in these pages and delete * the swap. */ getswap(smi) int smi; { register reg_t *rp; register pte_t *pt; register dbd_t *dbd; register int pglim; register int j; register int i; register int seglim; for (rp = region; rp < ®ion[v.v_region]; rp++) { /* Skip the region, if its unused */ if (rp->r_type == RT_UNUSED) continue; reglock(rp); /* Loop through all the segments of the region. */ i = ptots(rp->r_pgoff); seglim = ptos(rp->r_pgoff + rp->r_pgsz); for( ; i < seglim ; i++) { /* Look at all of the pages of the segment. */ if(rp->r_pgoff > stopg(i)) j = rp->r_pgoff - stopg(i); else j = 0; pglim = rp->r_pgoff + rp->r_pgsz - stopg(i); if(pglim > NPGPT) pglim = NPGPT; pt = rp->r_list[i] + j; dbd = (dbd_t *) pt + NPGPT; for( ; j < pglim ; j++, pt++, dbd++) { if(dbd->dbd_type == DBD_SWAP && dbd->dbd_swpi == smi) unswap(rp, pt, dbd) ; } } regrele(rp); } } /* Free up the swap block being used by the indicated page. * The region is locked when we are called. * This code roughly parallels vfault(). */ unswap(rp, pt, dbd) register reg_t *rp; register pte_t *pt; register dbd_t *dbd; { register pfd_t *pfd; /* If a copy of the page is in core, then just * release the copy on swap. */ if (pt->pgi.pg_pte & PG_V) { pfd = &pfdat[pt->pgm.pg_pfn]; if (pfd->pf_flags & P_HASH) premove(pfd); swfree1(dbd); dbd->dbd_type = DBD_NONE; return; } if (ptmemall(rp, pt, 1, 0)) return; /* Read in the page from swap and then free up the swap. */ swap(dbd,pt,1,B_READ); swfree1(dbd); dbd->dbd_type = DBD_NONE; pfd = &pfdat[pt->pgm.pg_pfn]; pfd->pf_flags |= P_DONE; pt->pgi.pg_pte |= PG_V ; pt->pgi.pg_pte &= ~PG_M ; D 5 valid_vrtentrys(pt) ; E 5 } /* Search swap use counters looking for size contiguous free pages. * Returns the page number found + 1 on sucess, 0 on failure. */ swapfind(st, size) register swpt_t *st; register int size; { register use_t *p, *e; register int i; use_t *b; e = &st->st_ucnt[st->st_npgs - size]; for(p = st->st_last; p <= e; p++) { if(*p == 0) { b = p; p++; for(i = 1; i < size; i++, p++) if(*p != 0) goto Cont; st->st_last = p; return((b - st->st_ucnt) + 1); } Cont:; } e = st->st_last - size; for(p = st->st_ucnt; p <= e; p++) { if(*p == 0) { b = p; p++; for(i = 1; i < size; i++, p++) if(*p != 0) goto Cont2; st->st_last = p; return((b - st->st_ucnt) + 1); } Cont2:; } return(0); } E 1 h48137 s 00001/00001/00110 d D 4.4 87/05/14 16:16:53 build 9 8 c removed old SCCS strings and inserted #ident BB e s 00002/00002/00109 d D 4.3 87/04/16 19:21:56 dc 8 7 c dc - Add Bull updates from 03/05/87 e s 00013/00013/00098 d D 4.2 87/04/15 17:50:44 dc 7 6 c dc - changed #include "sys/..." to #include e s 00000/00000/00111 d D 4.1 87/02/20 13:31:53 build 6 5 c rolled rev to -r4 /dc e s 00005/00004/00106 d D 3.2 87/01/26 15:45:19 build 5 4 c add page table changes /dc e s 00000/00000/00110 d D 3.1 87/01/19 09:23:57 build 4 3 c rolled rev to -r3 /dc e s 00000/00000/00110 d D 2.1 87/01/19 09:23:57 build 3 2 c AUTO NULL DELTA e s 00001/00000/00109 d D 1.2 87/01/16 10:17:56 build 2 1 c add ident string /dc e s 00109/00000/00000 d D 1.1 87/01/09 16:35:27 build 1 0 c Placed under source control - dc e u U f b f n t T I 2 D 8 /* "%W% %E%" */ E 8 I 8 D 9 /* " %W% %E% " */ E 9 I 9 #ident " %W% %E% " E 9 E 8 E 2 I 1 D 7 #include "sys/param.h" #include "sys/types.h" #include "sys/sysmacros.h" #include "sys/systm.h" #include "sys/map.h" #include "sys/dir.h" #include "sys/signal.h" #include "sys/user.h" #include "sys/errno.h" #include "sys/page.h" #include "sys/region.h" #include "sys/proc.h" #include "sys/sysinfo.h" E 7 I 7 #include #include #include #include #include #include #include #include #include #include #include #include #include E 7 struct proc *lastproc; extern int switching; /* * put the current process on * the Q of running processes and * call the scheduler. D 5 */ E 5 I 5 D 8 */ E 8 I 8 */ E 8 E 5 qswtch() { setrq(u.u_procp); swtch(); } /* * This routine is called to reschedule the CPU. * if the calling process is not in RUN state, * arrangements for it to restart must have * been made elsewhere, usually by calling via sleep. * There is a race here. A process may become * ready after it has been examined. * In this case, idle() will be called and * will return in at most 1HZ time. * i.e. its not worth putting an spl() in. */ swtch() { register n; register struct proc *p, *q, *pp, *pq; preg_t *prp; extern struct user *uservad; sysinfo.pswitch++; if (save(u.u_rsav)) { p = lastproc; switch(p->p_stat) { case SZOMB: D 5 sptfree(p->p_sgt, 1, 1); /* free the physical space of user structure */ pfree(NULL,p->p_addr,NULL,USIZE) ; E 5 I 5 /* * Free the physical space of user structure */ pfree(NULL,ublkptbl(p),NULL,USIZE) ; E 5 break; } return; } switching = 1; lastproc = u.u_procp; loop: spl6(); runrun = 0; pp = NULL; q = NULL; n = 128; /* * Search for highest-priority runnable process */ if (p = runq) do { if ((p->p_flag&SLOAD) && p->p_pri <= n) { pp = p; pq = q; n = p->p_pri; } q = p; } while (p = p->p_link); /* * If no process is runnable, idle. */ p = pp; if (p == NULL) { curpri = PIDLE; idle(); goto loop; } q = pq; if (q == NULL) runq = p->p_link; else q->p_link = p->p_link; curpri = n; curproc = p; spl0(); /* * The rsav contents are interpreted in the new address space */ switching = 0; p->p_flag &= ~SSWAP; resume(p->p_addr, u.u_rsav); } E 1 h30999 s 00001/00001/00094 d D 4.4 87/05/14 16:17:03 build 8 7 c removed old SCCS strings and inserted #ident BB e s 00002/00001/00093 d D 4.3 87/04/16 19:22:15 dc 7 6 c dc - Add Bull updates from 03/05/87 e s 00022/00022/00072 d D 4.2 87/04/15 17:50:50 dc 6 5 c dc - changed #include "sys/..." to #include e s 00000/00000/00094 d D 4.1 87/02/20 13:31:55 build 5 4 c rolled rev to -r4 /dc e s 00000/00000/00094 d D 3.1 87/01/19 09:23:59 build 4 3 c rolled rev to -r3 /dc e s 00000/00000/00094 d D 2.1 87/01/19 09:23:59 build 3 2 c AUTO NULL DELTA e s 00001/00000/00093 d D 1.2 87/01/16 10:17:59 build 2 1 c add ident string /dc e s 00093/00000/00000 d D 1.1 87/01/09 16:35:28 build 1 0 c Placed under source control - dc e u U f b f n t T I 2 D 7 /* "%W% %E%" */ E 7 I 7 D 8 /* " %W% %E% " */ E 8 I 8 #ident " %W% %E% " E 8 E 7 E 2 I 1 D 6 #include "sys/param.h" #include "sys/types.h" #include "sys/sysmacros.h" #include "sys/systm.h" #include "sys/map.h" #include "sys/dir.h" #include "sys/signal.h" #include "sys/user.h" #include "sys/errno.h" #include "sys/page.h" #include "sys/region.h" #include "sys/proc.h" #include "sys/buf.h" #include "sys/reg.h" #include "sys/file.h" #include "sys/inode.h" #include "sys/seg.h" #include "sys/acct.h" #include "sys/sysinfo.h" #include "sys/var.h" #include "sys/ipc.h" #include "sys/shm.h" E 6 I 6 #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include E 6 /* * exec system call, with and without environments. */ struct execa { char *fname; char **argp; char **envp; }; exec() { ((struct execa *)u.u_ap)->envp = NULL; exece(); } /* * exit system call: * pass back caller's arg */ rexit() { register struct a { int rval; } *uap; uap = (struct a *)u.u_ap; exit((uap->rval & 0377) << 8); } /* * fork system call. */ fork() { register a; sysinfo.sysfork++; /* * Disallow if * No processes at all; * not su and too many procs owned; or * not su and would take last slot; or * not su and no space on swap. * Part of check done in newproc(). */ switch( newproc(1) ) { case 1: /* child -- successful newproc */ u.u_rval1 = u.u_procp->p_ppid; u.u_rval2 = 1; /* child */ u.u_start = time; u.u_ticks = lbolt; u.u_mem = u.u_procp->p_size; u.u_ior = u.u_iow = u.u_ioch = 0; u.u_cstime = 0; u.u_stime = 0; u.u_cutime = 0; u.u_utime = 0; u.u_acflag = AFORK; I 7 u.u_lock = 0 ; E 7 return; case 0: /* parent -- successful newproc */ /* u.u_rval1 = pid-of-child; */ break; default: /* unsuccessful newproc */ u.u_error = EAGAIN; break; } out: u.u_rval2 = 0; /* parent */ } E 1 h15626 s 00001/00001/00469 d D 4.4 87/05/14 16:17:14 build 8 7 c removed old SCCS strings and inserted #ident BB e s 00006/00001/00464 d D 4.3 87/04/16 19:22:29 dc 7 6 c dc - Add Bull updates from 03/05/87 e s 00011/00011/00454 d D 4.2 87/04/15 17:50:56 dc 6 5 c dc - changed #include "sys/..." to #include e s 00000/00000/00465 d D 4.1 87/02/20 13:31:59 build 5 4 c rolled rev to -r4 /dc e s 00000/00000/00465 d D 3.1 87/01/19 09:24:04 build 4 3 c rolled rev to -r3 /dc e s 00000/00000/00465 d D 2.1 87/01/19 09:24:04 build 3 2 c AUTO NULL DELTA e s 00001/00000/00464 d D 1.2 87/01/16 10:18:03 build 2 1 c add ident string /dc e s 00464/00000/00000 d D 1.1 87/01/09 16:35:29 build 1 0 c Placed under source control - dc e u U f b f n t T I 2 D 7 /* "%W% %E%" */ E 7 I 7 D 8 /* " %W% %E% " */ E 8 I 8 #ident " %W% %E% " E 8 E 7 E 2 I 1 D 6 #include "sys/param.h" #include "sys/types.h" #include "sys/systm.h" #include "sys/dir.h" #include "sys/signal.h" #include "sys/user.h" #include "sys/errno.h" #include "sys/file.h" #include "sys/inode.h" #include "sys/sysinfo.h" E 6 I 6 #include #include #include #include #include #include #include #include #include #include E 6 #ifdef SOCKET D 6 #include "sys/uio.h" E 6 I 6 #include E 6 #endif /* SOCKET */ /* * read system call */ read() { sysinfo.sysread++; rdwr(FREAD); } /* * write system call */ write() { sysinfo.syswrite++; rdwr(FWRITE); } /* * common code for read and write calls: * check permissions, set base, count, and offset, * and switch out to readi or writei code. * ifdef SOCKET * ... or sorwuio() for sockets iop's * endif SOCKET */ rdwr(mode) register mode; { register struct file *fp; register struct inode *ip; register struct a { int fdes; char *cbuf; unsigned count; } *uap; int type; uap = (struct a *)u.u_ap; fp = getf(uap->fdes); if (fp == NULL) return; if ((fp->f_flag&mode) == 0) { u.u_error = EBADF; return; } u.u_base = (caddr_t)uap->cbuf; u.u_count = uap->count; u.u_segflg = 0; u.u_fmode = fp->f_flag; #ifdef SOCKET if (fp->f_type == DTYPE_SOCKET) { sorwuio(mode,fp); return; } #endif /* SOCKET */ ip = fp->f_inode; type = ip->i_mode&IFMT; if (type==IFREG || type==IFDIR) { plock(ip); if ((u.u_fmode&FAPPEND) && (mode == FWRITE)) fp->f_offset = ip->i_size; } else if (type == IFIFO) { plock(ip); fp->f_offset = 0; } u.u_offset = fp->f_offset; if (mode == FREAD) readi(ip); else writei(ip); if (type==IFREG || type==IFDIR || type==IFIFO) prele(ip); fp->f_offset += uap->count-u.u_count; u.u_rval1 = uap->count-u.u_count; u.u_ioch += (unsigned)u.u_rval1; if (mode == FREAD) sysinfo.readch += (unsigned)u.u_rval1; else sysinfo.writech += (unsigned)u.u_rval1; } #ifdef SOCKET /* * sorwuio() prepare les arguments necessaire a l'appel des routines * "generiques" read/write applicables aux sockets. */ sorwuio(mode,fp) int mode; /* type op. FREAD|FWRITE */ register struct file *fp; /* pointeur sur la structure file */ { unsigned int count = u.u_count; struct uio auio; /* les struct. uio et iovec ... */ struct iovec aiov; /* ...utilisees par les routines socket */ aiov.iov_base = u.u_base; /* adr. buffer e/s selon "segflg" */ aiov.iov_len = count; /* long. " */ auio.uio_iov = &aiov; /* ptr sur le vecteur des frag. */ auio.uio_iovcnt = 1; /* nb de frag. (tjs 1!!) */ auio.uio_segflg = 0; /* buffer dans le segment "data" */ auio.uio_resid = count; /* nb. d'octets non transferes */ auio.uio_offset = fp->f_offset ; /* normalement 0 pour les SOCK */ u.u_error = soo_rw(fp,mode == FWRITE ? UIO_WRITE : UIO_READ,&auio); u.u_rval1 = count - auio.uio_resid ; /* nb. d'octets transferes */ fp->f_offset += u.u_rval1; /* no-op pour les sockets ?*/ } #endif /* SOCKET */ /* * open system call */ open() { register struct a { char *fname; int mode; int crtmode; } *uap; uap = (struct a *)u.u_ap; copen(uap->mode-FOPEN, uap->crtmode); } /* * creat system call */ creat() { register struct a { char *fname; int fmode; } *uap; uap = (struct a *)u.u_ap; copen(FWRITE|FCREAT|FTRUNC, uap->fmode); } /* * common code for open and creat. * Check permissions, allocate an open file structure, * and call the device open routine if any. * ifdef SOCKET * No open on a socket inode. * endif SOCKET */ copen(mode, arg) register mode; { register struct inode *ip; register struct file *fp; int i; if ((mode&(FREAD|FWRITE)) == 0) { u.u_error = EINVAL; return; } if (mode&FCREAT) { ip = namei(uchar, 1); if (ip == NULL) { if (u.u_error) return; ip = maknode(arg&07777&(~ISVTX)); if (ip == NULL) return; mode &= ~FTRUNC; } else { if (mode&FEXCL) { u.u_error = EEXIST; iput(ip); return; } mode &= ~FCREAT; } } else { ip = namei(uchar, 0); if (ip == NULL) return; } #ifdef SOCKET if ( (ip->i_mode&IFMT) == IFSOCK) { u.u_error = EOPNOTSUPP; return; } #endif /* SOCKET */ if (!(mode&FCREAT)) { if (mode&FREAD) access(ip, IREAD); if (mode&(FWRITE|FTRUNC)) { access(ip, IWRITE); if ((ip->i_mode&IFMT) == IFDIR) u.u_error = EISDIR; } } if (u.u_error || (fp = falloc(ip, mode&FMASK)) == NULL) { iput(ip); return; } if (mode&FTRUNC) itrunc(ip); prele(ip); i = u.u_rval1; if (setjmp(u.u_qsav)) { /* catch half-opens */ if (u.u_error == 0) u.u_error = EINTR; u.u_ofile[i] = NULL; closef(fp); } else { openi(ip, mode); if (u.u_error == 0) return; u.u_ofile[i] = NULL; if ((--fp->f_count) <= 0) { fp->f_next = ffreelist; ffreelist = fp; } iput(ip); } } /* * close system call */ close() { register struct file *fp; register struct a { int fdes; } *uap; uap = (struct a *)u.u_ap; fp = getf(uap->fdes); if (fp == NULL) return; u.u_ofile[uap->fdes] = NULL; closef(fp); } /* * seek system call * ifdef SOCKET * no seek on a socket inode * endif SOCKET */ seek() { register struct file *fp; register struct inode *ip; register struct a { int fdes; off_t off; int sbase; } *uap; uap = (struct a *)u.u_ap; fp = getf(uap->fdes); if (fp == NULL) return; #ifdef SOCKET if (fp->f_type == DTYPE_SOCKET) { u.u_error = EINVAL; return; } #endif /* SOCKET */ ip = fp->f_inode; if ((ip->i_mode&IFMT)==IFIFO) { u.u_error = ESPIPE; return; } if (uap->sbase == 1) uap->off += fp->f_offset; else if (uap->sbase == 2) uap->off += fp->f_inode->i_size; else if (uap->sbase != 0) { u.u_error = EINVAL; psignal(u.u_procp, SIGSYS); return; } if (uap->off < 0) { u.u_error = EINVAL; return; } fp->f_offset = uap->off; u.u_roff = uap->off; } /* * link system call */ link() { register struct inode *ip, *xp; register struct a { char *target; char *linkname; } *uap; uap = (struct a *)u.u_ap; ip = namei(uchar, 0); if (ip == NULL) return; if (ip->i_nlink >= MAXLINK) { u.u_error = EMLINK; goto outn; } if ((ip->i_mode&IFMT)==IFDIR && !suser()) goto outn; /* * Unlock to avoid possibly hanging the namei. * Sadly, this means races. (Suppose someone * deletes the file in the meantime?) * Nor can it be locked again later * because then there will be deadly * embraces. * Update inode first for robustness. */ ip->i_nlink++; ip->i_flag |= ICHG|ISYN; iupdat(ip, &time, &time); prele(ip); u.u_dirp = (caddr_t)uap->linkname; xp = namei(uchar, 1); if (xp != NULL) { iput(xp); u.u_error = EEXIST; goto out; } if (u.u_error) goto out; if (u.u_pdir->i_dev != ip->i_dev) { iput(u.u_pdir); u.u_error = EXDEV; goto out; } wdir(ip); out: plock(ip); if (u.u_error) { ip->i_nlink--; ip->i_flag |= ICHG; } outn: iput(ip); return; } /* * mknod system call */ mknod() { register struct inode *ip; register struct a { char *fname; int fmode; int dev; } *uap; uap = (struct a *)u.u_ap; if ((uap->fmode&IFMT) != IFIFO && !suser()) return; ip = namei(uchar, 1); if (ip != NULL) { iput(ip); u.u_error = EEXIST; return; } if (u.u_error) return; ip = maknode(uap->fmode); if (ip == NULL) return; switch(ip->i_mode&IFMT) { case IFCHR: case IFBLK: ip->i_rdev = (dev_t)uap->dev; ip->i_flag |= ICHG; } iput(ip); } /* * access system call */ saccess() { register svuid, svgid; register struct inode *ip; register struct a { char *fname; int fmode; } *uap; uap = (struct a *)u.u_ap; I 7 if (uap->fmode & ~((IREAD|IWRITE|IEXEC)>>6)) { u.u_error = EINVAL ; return ; } E 7 svuid = u.u_uid; svgid = u.u_gid; u.u_uid = u.u_ruid; u.u_gid = u.u_rgid; ip = namei(uchar, 0); if (ip != NULL) { if (uap->fmode&(IREAD>>6)) access(ip, IREAD); if (uap->fmode&(IWRITE>>6)) access(ip, IWRITE); if (uap->fmode&(IEXEC>>6)) access(ip, IEXEC); iput(ip); } u.u_uid = svuid; u.u_gid = svgid; } E 1 h23835 s 00001/00001/00602 d D 4.5 87/05/14 16:17:26 build 9 8 c removed old SCCS strings and inserted #ident BB e s 00001/00001/00602 d D 4.4 87/04/29 16:26:10 van 8 7 c van - moved ucb networking includes to INCUCB e s 00018/00002/00585 d D 4.3 87/04/16 19:22:44 dc 7 6 c dc - Add Bull updates from 03/05/87 e s 00022/00022/00565 d D 4.2 87/04/15 17:51:04 dc 6 5 c dc - changed #include "sys/..." to #include e s 00000/00000/00587 d D 4.1 87/02/20 13:32:04 build 5 4 c rolled rev to -r4 /dc e s 00000/00000/00587 d D 3.1 87/01/19 09:24:07 build 4 3 c rolled rev to -r3 /dc e s 00000/00000/00587 d D 2.1 87/01/19 09:24:07 build 3 2 c AUTO NULL DELTA e s 00001/00000/00586 d D 1.2 87/01/16 10:18:07 build 2 1 c add ident string /dc e s 00586/00000/00000 d D 1.1 87/01/09 16:35:32 build 1 0 c Placed under source control - dc e u U f b f n t T I 2 D 7 /* "%W% %E%" */ E 7 I 7 D 9 /* " %W% %E% " */ E 9 I 9 #ident " %W% %E% " E 9 E 7 E 2 I 1 D 6 #include "sys/param.h" #include "sys/types.h" #include "sys/sysmacros.h" #include "sys/systm.h" #include "sys/mount.h" #include "sys/ino.h" #include "sys/page.h" #include "sys/buf.h" #include "sys/filsys.h" #include "sys/dir.h" #include "sys/signal.h" #include "sys/user.h" #include "sys/errno.h" #include "sys/inode.h" #include "sys/file.h" #include "sys/flock.h" #include "sys/conf.h" #include "sys/stat.h" #include "sys/ttold.h" #include "sys/var.h" #include "sys/swap.h" E 6 I 6 #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include E 6 #ifdef SOCKET D 6 #include "sys/bsdioctl.h" E 6 I 6 D 8 #include E 8 I 8 #include "sys/bsdioctl.h" E 8 E 6 #endif /* SOCKET */ /* * the fstat system call. */ fstat() { register struct file *fp; register struct a { int fdes; struct stat *sb; } *uap; uap = (struct a *)u.u_ap; fp = getf(uap->fdes); if(fp == NULL) return; #ifdef SOCKET if(fp->f_type == DTYPE_SOCKET) { u.u_error = soo_stat(fp->f_data,uap->sb); return; } #endif /* SOCKET */ stat1(fp->f_inode, uap->sb); } /* * the stat system call. */ stat() { register struct inode *ip; register struct a { char *fname; struct stat *sb; } *uap; uap = (struct a *)u.u_ap; ip = namei(uchar, 0); if(ip == NULL) return; stat1(ip, uap->sb); iput(ip); } /* * the dup system call ; implements dup2 and dup. */ dup() { register struct file *fp; register i,m ; register struct a { int fdes; int fdes2 ; } *uap; uap = (struct a *)u.u_ap; m = uap->fdes & ~077 ; uap->fdes &= 077 ; fp = getf(uap->fdes); if(fp == NULL) return; if ((m & 0100) == 0) { if ((i = ufalloc(0)) < 0) return; } else { i = uap->fdes2 ; if (i < 0 || i>= NOFILE) { u.u_error = EBADF ; return ; } u.u_rval1 = i ; } if (i != uap->fdes) { if (u.u_ofile[i] != NULL) closef(u.u_ofile[i]) ; u.u_ofile[i] = fp; fp->f_count++; } } /* * the file control system call. */ fcntl() { register struct file *fp; register struct a { int fdes; int cmd; int arg; } *uap; struct flock bf; register i; uap = (struct a *)u.u_ap; fp = getf(uap->fdes); if (fp == NULL) return; switch(uap->cmd) { case 0: i = uap->arg; D 7 if (i < 0 || i > NOFILE) E 7 I 7 if (i < 0 || i >= NOFILE) E 7 { u.u_error = EINVAL; return; } if ((i = ufalloc(i)) < 0) return; u.u_ofile[i] = fp; fp->f_count++; break; case 1: u.u_rval1 = u.u_pofile[uap->fdes]; break; case 2: u.u_pofile[uap->fdes] = uap->arg; break; case 3: u.u_rval1 = fp->f_flag+FOPEN; break; case 4: fp->f_flag &= (FREAD|FWRITE); fp->f_flag |= (uap->arg-FOPEN) & ~(FREAD|FWRITE); break; case 5: /* get record lock */ if (copyin(uap->arg, &bf, sizeof bf)) u.u_error = EFAULT; else if ((i=getflck(fp, &bf)) != 0) u.u_error = i; else if (copyout(&bf, uap->arg, sizeof bf)) u.u_error = EFAULT; break; case 6: /* set record lock and return if blocked */ if (copyin(uap->arg, &bf, sizeof bf)) u.u_error = EFAULT; else if ((i=setflck(fp, &bf, 0)) != 0) u.u_error = i; break; case 7: /* set record lock and wait if blocked */ if (copyin(uap->arg, &bf, sizeof bf)) u.u_error = EFAULT; else if ((i=setflck(fp, &bf, 1)) != 0) u.u_error = i; break; default: u.u_error = EINVAL; } } /* * character special i/o control */ ioctl() { register struct file *fp; register struct inode *ip; register struct a { int fdes; int cmd; int arg; } *uap; register dev_t dev; uap = (struct a *)u.u_ap; if ((fp = getf(uap->fdes)) == NULL) return; #ifdef SOCKET if (fp->f_type == DTYPE_SOCKET) { register com; register unsigned size; char data[IOCPARM_MASK+1]; com = uap->cmd; if ((com&~0xffff) == 0) { /* com = mapioctl(com); ... en format 4.2bsd */ com = 0 ; if (com == 0) { u.u_error = EINVAL; return; } } /* /* * Interpret high order word to find * amount of data to be copied to/from the * user's address space. */ size = (com &~ (IOC_INOUT|IOC_VOID)) >> 16; if (size > sizeof (data)) { u.u_error = EFAULT; return; } if (com&IOC_IN) { if (size) { u.u_error = copyin(uap->arg, (caddr_t)data, (unsigned)size); if (u.u_error) return; } else data[0] = (char)uap->arg; } else if ((com&IOC_OUT) && size) /* * Zero the buffer on the stack so the user * always gets back something deterministic. */ bzero((caddr_t)data, size); else if (com&IOC_VOID) data[0] = (char)uap->arg; u.u_error = soo_ioctl(fp, com, data); /* Copy any data to user, size was * already set and checked above. */ if (u.u_error == 0 && (com&IOC_OUT) && size) u.u_error = copyout(data, uap->arg, (unsigned)size); return; } #endif /* SOCKET */ ip = fp->f_inode; if ((ip->i_mode&IFMT) != IFCHR) { u.u_error = ENOTTY; return; } dev = (dev_t)ip->i_rdev; (*cdevsw[major(dev)].d_ioctl)(minor(dev),uap->cmd,uap->arg,fp->f_flag); } /* * old stty and gtty */ stty() { register struct a { int fdes; int arg; int narg; } *uap; uap = (struct a *)u.u_ap; uap->narg = uap->arg; uap->arg = TIOCSETP; ioctl(); } gtty() { register struct a { int fdes; int arg; int narg; } *uap; uap = (struct a *)u.u_ap; uap->narg = uap->arg; uap->arg = TIOCGETP; ioctl(); } /* * Common code for mount and umount. * Checks block special argument and returns inode pointer. */ struct inode * mgetdev() { register dev_t dev; register struct inode *ip; ip = namei(uchar, 0); if (ip == NULL) return(ip); if ((ip->i_mode&IFMT) != IFBLK) u.u_error = ENOTBLK; else { dev = (dev_t)ip->i_rdev; if (bmajor(dev) >= bdevcnt) u.u_error = ENXIO; } if (u.u_error) { iput(ip); ip = NULL; } return(ip); } /* * the mount system call. */ smount() { dev_t dev; register struct inode *ip; register struct mount *mp; struct mount *smp; register struct filsys *fp; struct inode *bip; register struct a { char *fspec; char *freg; int ronly; } *uap; uap = (struct a *)u.u_ap; if(!suser()) return; bip = mgetdev(); if (u.u_error) return; dev = (dev_t)bip->i_rdev; u.u_dirp = (caddr_t)uap->freg; prele(bip); ip = namei(uchar, 0); if(ip == NULL) { plock(bip); iput(bip); return; } if(ip == bip){ ip->i_count--; iput(ip); u.u_error = ENOTDIR; return; } I 7 if (ip->i_count != 1) { iput(ip); plock(bip); iput(bip); u.u_error = EBUSY; return; } E 7 plock(bip); if ((ip->i_mode&IFMT) != IFDIR) { u.u_error = ENOTDIR; goto out; } if (ip->i_count != 1) goto out; if (ip->i_number == ROOTINO) goto out; smp = NULL; for(mp = &mount[0]; mp < (struct mount *)v.ve_mount; mp++) { if(mp->m_flags != MFREE) { if (brdev(dev) == brdev(mp->m_dev)) goto out; } else if(smp == NULL) smp = mp; } mp = smp; if(mp == NULL) I 7 { provfl("mount", "NMOUNT") ; E 7 goto out; I 7 } E 7 mp->m_flags = MINTER; mp->m_dev = brdev(dev); (*bdevsw[bmajor(dev)].d_open)(minor(dev), uap->ronly ? FREAD : FREAD|FWRITE); if(u.u_error) goto out1; mp->m_bufp = geteblk(); fp = mp->m_bufp->b_un.b_filsys; u.u_offset = SUPERBOFF; u.u_count = sizeof(struct filsys); u.u_base = (caddr_t)fp; u.u_segflg = 1; readi(bip); if (u.u_error) goto out2; fp->s_fmod = 0; fp->s_ilock = 0; fp->s_flock = 0; fp->s_ninode = 0; fp->s_inode[0] = 0; fp->s_ronly = uap->ronly & 1; if ((fp->s_magic != FsMAGIC) && (fp->s_type != Fs8b)) { u.u_error = EINVAL; goto out2; } /* if (fp->s_type == Fs2b) { binval(mp->m_dev); mp->m_dev |= Fs2BLK; } */ mp->m_dev |= Fs2BLK; if(brdev(pipedev) == brdev(mp->m_dev)) pipedev = mp->m_dev; if (mp->m_mount = iget(mp->m_dev, ROOTINO)) prele(mp->m_mount); else goto out2; mp->m_inodp = ip; mp->m_flags = MINUSE; ip->i_flag |= IMOUNT; iput(bip); prele(ip); return; out2: (*bdevsw[bmajor(dev)].d_close)(minor(dev), !uap->ronly); brelse(mp->m_bufp); out1: mp->m_flags = MFREE; out: if (bip != NULL) iput(bip); if (u.u_error == 0) u.u_error = EBUSY; iput(ip); } /* * the umount system call. */ sumount() { dev_t dev, odev; register struct inode *ip, *bip; register struct mount *mp; register struct filsys *fp; if(!suser()) return; bip = mgetdev(); if (u.u_error) return; dev = (dev_t)bip->i_rdev; for(mp = &mount[0]; mp < (struct mount *)v.ve_mount; mp++) if(mp->m_flags == MINUSE && brdev(dev) == brdev(mp->m_dev)) goto found; iput(bip); u.u_error = EINVAL; return; found: odev = dev; dev = mp->m_dev; xumount(dev); /* remove unused sticky files from text table */ I 7 if (ip = mp->m_mount) if (ip->i_count != 1) { iput(bip); u.u_error = EBUSY; return; } E 7 if (mp->m_mount) { plock(mp->m_mount); iput(mp->m_mount); mp->m_mount = NULL; u.u_error = 0; } if (iflush(dev) < 0) { iput(bip); u.u_error = EBUSY; return; } /* at this point there should be no active files * on the file system, the super block should not be locked. * Break the connections. */ mp->m_flags = MINTER; ip = mp->m_inodp; ip->i_flag &= ~IMOUNT; plock(ip); iput(ip); fp = mp->m_bufp->b_un.b_filsys; if (!fp->s_ronly) { bflush(dev); fp->s_time = time; u.u_error = 0; u.u_offset = SUPERBOFF; u.u_count = sizeof(struct filsys); u.u_base = (caddr_t)fp; u.u_segflg = 1; u.u_fmode = FWRITE|FSYNC; writei(bip); u.u_error = 0; } iput(bip); (*bdevsw[bmajor(dev)].d_close)(minor(dev), 0); punmount(mp); binval(dev); if (dev != odev) binval(odev); brelse(mp->m_bufp); mp->m_bufp = NULL; mp->m_flags = MFREE; } /* * manipulate swap files. */ swapfunc() { register int i; register struct inode *ip; swpi_t swpi ; register swpi_t *uap = &swpi ; if (copyin((swpi_t *)(*u.u_ap),uap,sizeof(swpi_t)) < 0) { u.u_error = EFAULT ; return ; } switch(uap->si_cmd) { case SI_LIST: i = sizeof(swpt_t) * MSFILES; if(copyout(swaptab, uap->si_buf, i) < 0) u.u_error = EFAULT; break; case SI_ADD: case SI_DEL: if(!suser()) { break; } u.u_dirp = uap->si_buf; ip = namei(uchar, 0); if(ip == NULL) { break; } if((ip->i_mode & IFMT) != IFBLK) { iput(ip) ; u.u_error = ENOTBLK; break; } if(uap->si_cmd == SI_DEL) { swapdel(brdev(ip->i_rdev), uap->si_swplo); } else { swapadd(brdev(ip->i_rdev),uap->si_swplo,uap->si_nblks); } iput(ip); break; } } E 1 h45543 s 00001/00001/00134 d D 4.6 87/05/14 16:17:40 build 11 10 c removed old SCCS strings and inserted #ident BB e s 00001/00001/00134 d D 4.5 87/05/07 18:59:12 van 10 9 c van - move defsocket.h back to /usr/include/sys e s 00005/00005/00130 d D 4.4 87/04/29 16:26:15 van 9 8 c van - moved ucb networking includes to INCUCB e s 00001/00002/00134 d D 4.3 87/04/16 19:25:00 dc 8 7 c dc - Add Bull updates from 03/05/87 e s 00013/00013/00123 d D 4.2 87/04/15 17:51:12 dc 7 6 c dc - changed #include "sys/..." to #include e s 00000/00000/00136 d D 4.1 87/02/20 13:32:09 build 6 5 c rolled rev to -r4 /dc e s 00000/00001/00136 d D 3.2 87/02/13 14:22:22 build 5 4 c add bull changes from Jan 23 /dc e s 00000/00000/00137 d D 3.1 87/01/19 09:24:11 build 4 3 c rolled rev to -r3 /dc e s 00000/00000/00137 d D 2.1 87/01/19 09:24:11 build 3 2 c AUTO NULL DELTA e s 00001/00000/00136 d D 1.2 87/01/16 10:18:12 build 2 1 c add ident string /dc e s 00136/00000/00000 d D 1.1 87/01/09 16:35:35 build 1 0 c Placed under source control - dc e u U f b f n t T I 2 D 8 /* "%W% %E%" */ E 2 I 1 D 5 /* %Z% Bull-Sems SPIX %Q%/%M% %I% %E% */ E 5 E 8 I 8 D 11 /* " %W% %E% " */ E 11 I 11 #ident " %W% %E% " E 11 E 8 #ifdef SOCKET D 7 #include "sys/param.h" #include "sys/types.h" #include "sys/defsocket.h" #include "sys/bsdioctl.h" #include "sys/dir.h" #include "sys/signal.h" #include "sys/user.h" #include "sys/file.h" #include "sys/protosw.h" #include "sys/socket.h" #include "sys/socketvar.h" #include "sys/stat.h" #include "sys/uio.h" E 7 I 7 #include #include D 9 #include #include E 9 I 9 D 10 #include "sys/defsocket.h" E 10 I 10 #include E 10 #include "sys/bsdioctl.h" E 9 #include #include #include #include D 9 #include #include #include E 9 I 9 #include "sys/protosw.h" #include "sys/socket.h" #include "sys/socketvar.h" E 9 #include #include E 7 soo_rw(fp, rw, uio) struct file *fp; enum uio_rw rw; struct uio *uio; { register struct socket *so = (struct socket *)fp->f_data; register error; int soreceive(), sosend(); if (u.u_fmode & FNDELAY) so->so_state |= SS_NBIO; error = (*(rw == UIO_READ ? soreceive : sosend))((struct socket *)fp->f_data, 0, uio, 0, 0); if (u.u_fmode & FNDELAY) so->so_state &= ~SS_NBIO; return (error); } soo_ioctl(fp, cmd, data) struct file *fp; int cmd; register caddr_t data; { register struct socket *so = (struct socket *)fp->f_data; switch (cmd) { case FIONBIO: if (*(int *)data) so->so_state |= SS_NBIO; else so->so_state &= ~SS_NBIO; return (0); case FIOASYNC: if (*(int *)data) so->so_state |= SS_ASYNC; else so->so_state &= ~SS_ASYNC; return (0); case FIONREAD: *(int *)data = so->so_rcv.sb_cc; return (0); case SIOCSPGRP: so->so_pgrp = *(int *)data; return (0); case SIOCGPGRP: *(int *)data = so->so_pgrp; return (0); case SIOCATMARK: *(int *)data = (so->so_state&SS_RCVATMARK) != 0; return (0); } /* * Interface/routing/protocol specific ioctls: * interface and routing ioctls should have a * different entry since a socket's unnecessary */ #define cmdbyte(x) (((x) >> 8) & 0xff) if (cmdbyte(cmd) == 'i') return (ifioctl(cmd, data)); if (cmdbyte(cmd) == 'r') return (rtioctl(cmd, data)); return ((*so->so_proto->pr_usrreq)(so, PRU_CONTROL, (struct mbuf *)cmd, (struct mbuf *)data, (struct mbuf *)0)); } soo_stat(so, ub) register struct socket *so; register struct stat *ub; { bzero((caddr_t)ub, sizeof (*ub)); return (0); } soo_close(fp) struct file *fp; { int error = 0; if (fp->f_data) error = soclose((struct socket *)fp->f_data); fp->f_data = 0; return (error); } /* Initialize ipc/SOCKET * */ socinit() { register short s; mbinit (); /* initialize mbufs */ #ifdef INET loattach (); s = spl7(); /* block incoming packets until protocols are initialized */ ifinit(); #endif /* INET */ domaininit(); #ifdef INET splx (s); #endif /*INET*/ } #endif /* SOCKET */ E 1 h52086 s 00001/00001/00114 d D 4.4 87/05/14 16:17:49 build 10 9 c removed old SCCS strings and inserted #ident BB e s 00001/00001/00114 d D 4.3 87/04/16 19:25:17 dc 9 8 c dc - Add Bull updates from 03/05/87 e s 00015/00015/00100 d D 4.2 87/04/15 17:51:16 dc 8 7 c dc - changed #include "sys/..." to #include e s 00000/00000/00115 d D 4.1 87/02/20 13:32:12 build 7 6 c rolled rev to -r4 /dc e s 00000/00001/00115 d D 3.3 87/02/13 14:23:06 build 6 5 c add bull changes from Jan 23 /dc e s 00002/00001/00114 d D 3.2 87/01/26 15:45:59 build 5 4 c add page table changes /dc e s 00000/00000/00115 d D 3.1 87/01/19 09:24:13 build 4 3 c rolled rev to -r3 /dc e s 00000/00000/00115 d D 2.1 87/01/19 09:24:13 build 3 2 c AUTO NULL DELTA e s 00001/00000/00114 d D 1.2 87/01/16 10:18:15 build 2 1 c add ident string /dc e s 00114/00000/00000 d D 1.1 87/01/09 16:35:37 build 1 0 c Placed under source control - dc e u U f b f n t T I 2 D 9 /* "%W% %E%" */ E 9 I 9 D 10 /* " %W% %E% " */ E 10 I 10 #ident " %W% %E% " E 10 E 9 E 2 I 1 D 8 #include "sys/param.h" #include "sys/types.h" #include "sys/sysmacros.h" #include "sys/systm.h" #include "sys/map.h" #include "sys/dir.h" #include "sys/signal.h" #include "sys/user.h" #include "sys/reg.h" #include "sys/page.h" #include "sys/region.h" #include "sys/sysinfo.h" #include "sys/psl.h" #include "sys/errno.h" #include "sys/proc.h" E 8 I 8 #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include E 8 /* * Called from the trap handler when a processor trap occurs. */ extern nsysent ; syscall() { int code; register struct user *up; register struct proc *pp; register i; register struct sysent *callp; time_t syst; up = &u; syst = up->u_stime; up->u_ar0 = (int *) up ; sysinfo.syscall++; up->u_error = 0; code = up->u_ar0[R0]; D 5 i = up->u_ar0[R0]&0377; /* entry point number */ E 5 I 5 D 6 /* i = up->u_ar0[R0]&0377; /* entry point number */ E 6 i = code&0377; /* entry point number */ E 5 if (i >= nsysent) i = 0; callp = &sysent[i]; for(i=0; isy_nrarg; i++) { up->u_arg[i] = up->u_ar0[R1 + i]; } up->u_dirp = (caddr_t)up->u_arg[0]; up->u_rval1 = 0; up->u_rval2 = up->u_ar0[R1]; up->u_ap = up->u_arg; if (setjmp(up->u_qsav)) { spl0(); if (up->u_error==0) up->u_error = EINTR; } else (*callp->sy_call)(); if (up->u_error) { up->u_ar0[R0] = -1 ; up->u_ar0[R1] = up->u_error; if (++up->u_errcnt > 16) { up->u_errcnt = 0; runrun++; } } else { up->u_ar0[R0] = up->u_rval1; up->u_ar0[R1] = up->u_rval2; } pp = up->u_procp; resetpri(pp, i); if (runrun != 0) qswtch(); if (pp->p_sig && issig()) psig(code); if (up->u_prof.pr_scale) addupc((caddr_t)up->u_ar0[PC], &up->u_prof, (int)(up->u_stime-syst)); } nosys() { psignal(u.u_procp, SIGSYS); } /* * Ignored system call */ nullsys() { } /* * Routine which sets a user error; placed in * illegal entries in the bdevsw and cdevsw tables. */ nodev() { u.u_error = ENODEV; } /* * Null routine; placed in insignificant entries * in the bdevsw and cdevsw tables. */ nulldev() { } E 1 h61718 s 00001/00001/00230 d D 4.7 87/05/14 16:18:01 build 11 10 c removed old SCCS strings and inserted #ident BB e s 00001/00001/00230 d D 4.6 87/05/08 16:17:13 dc 10 9 c dc - extend sysridge to 5 args e s 00001/00000/00230 d D 4.5 87/04/29 15:17:22 dc 9 8 c dc -... finish up sysridge e s 00001/00000/00229 d D 4.4 87/04/29 15:13:44 dc 8 7 c dc - Add sysent (4 args) kcall 123. e s 00005/00003/00224 d D 4.3 87/04/16 19:25:34 dc 7 6 c dc - Add Bull updates from 03/05/87 e s 00003/00003/00224 d D 4.2 87/04/15 17:51:23 dc 6 5 c dc - changed #include "sys/..." to #include e s 00000/00000/00227 d D 4.1 87/02/20 13:32:15 build 5 4 c rolled rev to -r4 /dc e s 00000/00000/00227 d D 3.1 87/01/19 09:24:16 build 4 3 c rolled rev to -r3 /dc e s 00000/00000/00227 d D 2.1 87/01/19 09:24:16 build 3 2 c AUTO NULL DELTA e s 00001/00000/00226 d D 1.2 87/01/16 10:18:18 build 2 1 c add ident string /dc e s 00226/00000/00000 d D 1.1 87/01/09 16:35:38 build 1 0 c Placed under source control - dc e u U f b f n t T I 2 D 7 /* "%W% %E%" */ E 7 I 7 D 11 /* " %W% %E% " */ E 11 I 11 #ident " %W% %E% " E 11 E 7 E 2 I 1 D 6 #include "sys/param.h" #include "sys/types.h" #include "sys/systm.h" E 6 I 6 #include #include #include E 6 /* * This table is the switch used to transfer * to the appropriate routine for processing a system call. * Each row contains the number of arguments expected * and a pointer to the routine. */ int alarm(); int chdir(); int chmod(); int chown(); int chroot(); int close(); int creat(); int dup(); int exec(); int exece(); int fcntl(); int fork(); int fstat(); int getgid(); int getpid(); int getuid(); int gtime(); int gtty(); int ioctl(); int kill(); int link(); int lock(); int mknod(); int msgsys(); int nice(); int nosys(); int nullsys(); int open(); int pause(); int pipe(); int profil(); int ptrace(); int read(); I 7 int reboot(); E 7 int rexit(); int saccess(); int sbreak(); int seek(); int semsys(); int setgid(); I 7 int setlev(); E 7 int setpgrp(); int setuid(); int shmsys(); int smount(); int ssig(); int stat(); int stime(); int stty(); int sumount(); int sync(); int sysacct(); int times(); int ulimit(); int umask(); int unlink(); int utime(); int utssys(); int swapfunc(); int wait(); int write(); int geteuid(); int getegid(); int ftime(); #ifdef SOCKET int accept(); int bind(); int connect(); int getpeername(); int getsockname(); int getsockopt(); int listen(); int recvfrom(); int recvmsg(); int setsockopt(); int sendmsg(); int sendto(); int shutdown(); int socket(); int socketpair(); int sockrecv(); int socksend(); int setreuid(); int setregid(); #endif /* SOCKET */ I 9 int sysridge(); E 9 struct sysent sysent[] = { 0, 0, nosys, /* 0 = indir */ 1, 1, rexit, /* 1 = exit */ 0, 0, fork, /* 2 = fork */ 3, 3, read, /* 3 = read */ 3, 3, write, /* 4 = write */ 3, 3, open, /* 5 = open */ 1, 1, close, /* 6 = close */ 0, 0, wait, /* 7 = wait */ 2, 2, creat, /* 8 = creat */ 2, 2, link, /* 9 = link */ 1, 1, unlink, /* 10 = unlink */ 2, 2, exec, /* 11 = exec */ 1, 1, chdir, /* 12 = chdir */ 0, 0, gtime, /* 13 = time */ 3, 3, mknod, /* 14 = mknod */ 2, 2, chmod, /* 15 = chmod */ 3, 3, chown, /* 16 = chown; now 3 args */ 1, 1, sbreak, /* 17 = break */ 2, 2, stat, /* 18 = stat */ 3, 3, seek, /* 19 = seek */ 0, 0, getpid, /* 20 = getpid */ 3, 3, smount, /* 21 = mount */ 1, 1, sumount, /* 22 = umount */ 1, 1, setuid, /* 23 = setuid */ 0, 0, getuid, /* 24 = getuid */ 1, 1, stime, /* 25 = stime */ 4, 4, ptrace, /* 26 = ptrace */ 1, 1, alarm, /* 27 = alarm */ 2, 2, fstat, /* 28 = fstat */ 0, 0, pause, /* 29 = pause */ 2, 2, utime, /* 30 = utime */ 2, 2, stty, /* 31 = stty */ 2, 2, gtty, /* 32 = gtty */ 2, 2, saccess, /* 33 = access */ 1, 1, nice, /* 34 = nice */ 0, 0, nosys, /* 35 = sleep; inoperative */ 0, 0, sync, /* 36 = sync */ 2, 2, kill, /* 37 = kill */ 0, 0, nosys, /* 38 = x */ 1, 1, setpgrp, /* 39 = setpgrp */ 0, 0, nosys, /* 40 = tell - obsolete */ 2, 2, dup, /* 41 = dup and dup2 */ 0, 0, pipe, /* 42 = pipe */ 1, 1, times, /* 43 = times */ 4, 4, profil, /* 44 = prof */ 1, 1, lock, /* 45 = proc lock */ 1, 1, setgid, /* 46 = setgid */ 0, 0, getgid, /* 47 = getgid */ 3, 3, ssig, /* 48 = sig */ 6, 6, msgsys, /* 49 = IPC Messages */ 0, 0, nosys, /* 50 = reserved for local use */ 1, 1, sysacct, /* 51 = turn acct off/on */ 4, 4, shmsys, /* 52 = IPC Shared Memory */ 5, 5, semsys, /* 53 = IPC Semaphores */ 3, 3, ioctl, /* 54 = ioctl */ 0, 0, nosys, /* 55 = x */ 0, 0, nosys, /* 56 = x */ 3, 3, utssys, /* 57 = utssys */ 1, 1, swapfunc, /* 58 = swap functions */ 3, 3, exece, /* 59 = exece */ 1, 1, umask, /* 60 = umask */ 1, 1, chroot, /* 61 = chroot */ 3, 3, fcntl, /* 62 = fcntl */ 2, 2, ulimit, /* 63 = ulimit */ 0, 0, geteuid, /* 64 = geteuid */ 0, 0, getegid, /* 65 = getegid */ 1, 1, ftime, /* 66 = ftime */ D 7 0, 0, nosys, /* 67 = */ 0, 0, nosys, /* 68 = */ E 7 I 7 1, 1, setlev, /* 67 = setlev */ 0, 0, reboot, /* 68 = reboot */ E 7 #ifdef SOCKET 0, 0, nosys, /* 69 -99 reserved SEMS */ 0, 0, nosys, /* 70 = */ 0, 0, nosys, /* 71 = */ 0, 0, nosys, /* 72 = */ 0, 0, nosys, /* 73 = */ 0, 0, nosys, /* 74 = */ 0, 0, nosys, /* 75 = */ 0, 0, nosys, /* 76 = */ 0, 0, nosys, /* 77 = */ 0, 0, nosys, /* 78 = */ 0, 0, nosys, /* 79 = */ 0, 0, nosys, /* 80 = */ 0, 0, nosys, /* 81 = */ 0, 0, nosys, /* 82 = */ 0, 0, nosys, /* 83 = */ 0, 0, nosys, /* 84 = */ 0, 0, nosys, /* 85 = */ 0, 0, nosys, /* 86 = */ 0, 0, nosys, /* 87 = */ 0, 0, nosys, /* 88 = */ 0, 0, nosys, /* 89 = */ 0, 0, nosys, /* 90 = */ 0, 0, nosys, /* 91 = */ 0, 0, nosys, /* 92 = */ 0, 0, nosys, /* 93 = */ 0, 0, nosys, /* 94 = */ 0, 0, nosys, /* 95 = */ 0, 0, nosys, /* 96 = */ 0, 0, nosys, /* 97 = */ 0, 0, nosys, /* 98 = */ 0, 0, nosys, /* 99 = */ 3, 3, socket, /* 100 = socket */ 4, 4, socksend, /* 101 = socksend */ 4, 4, sockrecv, /* 102 = sockrecv */ 3, 3, connect, /* 103 = connect */ 3, 3, bind, /* 104 = bind */ 5, 5, setsockopt, /* 105 = setsockopt */ 2, 2, listen, /* 106 = listen */ 3, 3, accept, /* 107 = accept */ 2, 2, shutdown, /* 108 = shutdown */ 5, 5, socketpair, /* 109 = socketpair */ 3, 3, getpeername, /* 110 = getpeername */ 6, 6, recvfrom, /* 111 = recvfrom */ 6, 6, sendto, /* 112 = sendto */ 3, 3, recvmsg, /* 113 = recvmsg */ 3, 3, sendmsg, /* 114 = sendmsg */ 3, 3, getsockname, /* 115 = getsockname */ 0, 0, nosys, /* 116 = */ 0, 0, nosys, /* 117 = */ 5, 5, getsockopt, /* 118 = getsockopt */ 0, 0, nosys, /* 119 = */ 0, 0, nosys, /* 120 = */ 2, 2, setreuid, /* 121 = setreuid */ 2, 2, setregid /* 122 = setregid */ #endif /* SOCKET */ I 8 D 10 4, 4, sysridge, /* 123 = sysridge */ E 10 I 10 5, 5, sysridge, /* 123 = sysridge */ E 10 E 8 }; int nsysent = sizeof(sysent) / sizeof(sysent[0]) ; E 1 h37533 s 00001/00001/00244 d D 4.4 87/05/14 16:18:12 build 9 8 c removed old SCCS strings and inserted #ident BB e s 00008/00010/00237 d D 4.3 87/04/16 19:26:39 dc 8 7 c dc - Add Bull updates from 03/05/87 e s 00019/00019/00228 d D 4.2 87/04/15 17:51:28 dc 7 6 c dc - changed #include "sys/..." to #include e s 00000/00000/00247 d D 4.1 87/02/20 13:32:20 build 6 5 c rolled rev to -r4 /dc e s 00027/00035/00220 d D 3.2 87/01/26 15:46:49 build 5 4 c add page table changes /dc e s 00000/00000/00255 d D 3.1 87/01/19 09:24:19 build 4 3 c rolled rev to -r3 /dc e s 00000/00000/00255 d D 2.1 87/01/19 09:24:19 build 3 2 c AUTO NULL DELTA e s 00001/00000/00254 d D 1.2 87/01/16 10:18:21 build 2 1 c add ident string /dc e s 00254/00000/00000 d D 1.1 87/01/09 16:35:40 build 1 0 c Placed under source control - dc e u U f b f n t T I 2 D 8 /* "%W% %E%" */ E 8 I 8 D 9 /* " %W% %E% " */ E 9 I 9 #ident " %W% %E% " E 9 E 8 E 2 I 1 D 7 #include "sys/types.h" #include "sys/param.h" #include "sys/sysmacros.h" #include "sys/systm.h" #include "sys/dir.h" #include "sys/signal.h" #include "sys/user.h" #include "sys/errno.h" #include "sys/inode.h" #include "sys/buf.h" #include "sys/var.h" #include "sys/sysinfo.h" #include "sys/seg.h" #include "sys/page.h" #include "sys/pfdat.h" #include "sys/region.h" #include "sys/proc.h" #include "sys/debug.h" #include "sys/aouthdr.h" E 7 I 7 #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include E 7 /* * Allocate text region for a process D 8 */ E 8 I 8 */ E 8 xalloc(ip) register struct inode *ip; { register reg_t *rp; register preg_t *prp; register int size; register caddr_t org; D 5 if((size = u.u_exdata.ux_tsize) == 0) { u.u_procp->p_txtsegno = u.u_procp->p_dsegno ; return(0); } E 5 I 5 if ((size = u.u_exdata.ux_tsize) == 0) return(0) ; /* * Search the region table for the text we are * looking for. */ E 5 D 5 /* Search the region table for the text we are * looking for. */ E 5 loop: I 5 D 8 org = (caddr_t)u.u_exdata.ux_txtorg ; E 8 I 8 org = (caddr_t)u.u_exdata.ux_txtorg; E 8 E 5 for(rp = ractive.r_forw ; rp != &ractive ; rp = rp->r_forw) { if(rp->r_iptr == ip && rp->r_type == RT_STEXT) { reglock(rp); if(rp->r_iptr != ip || rp->r_type != RT_STEXT) { regrele(rp); goto loop; } while(!(rp->r_flags & RG_DONE)) { rp->r_flags |= RG_WAITING; regrele(rp); sleep(&rp->r_flags, PZERO); reglock(rp); } D 5 /* we found a shared text region */ /* take the text segment number attached to it */ E 5 I 5 /* * We found a shared text region */ E 5 D 5 u.u_procp->p_txtsegno = rp->r_txtsegno ; u.u_pcb.text_seg = rp->r_txtsegno ; prp = attachreg(rp, &u, 0, PT_TEXT, SEG_RO); E 5 I 5 prp = attachreg(rp, &u, (uint)org & ~SOFFMASK, PT_TEXT, SEG_RO); E 5 regrele(rp); if(prp == NULL) return(-1); return((int)prp); } } D 5 /* Text not currently being executed. Must allocate * a new region for it. */ E 5 I 5 /* * Text not currently being executed. Must allocate * a new region for it. */ E 5 if((rp = allocreg(ip, RT_STEXT)) == NULL) return(-1); if(ip->i_mode & ISVTX) rp->r_flags |= RG_NOFREE; D 5 org = (caddr_t)u.u_exdata.ux_txtorg; E 5 D 5 /* Attach a new segment number to that shared text region */ rp->r_txtsegno = alloc_segnum() ; E 5 I 5 /* * Attach the region to our process. */ E 5 D 5 /* Attach the region to our process. */ u.u_procp->p_txtsegno = rp->r_txtsegno ; u.u_pcb.text_seg = rp->r_txtsegno ; if((prp = attachreg(rp, &u, 0, PT_TEXT, SEG_RO)) == NULL) E 5 I 5 if((prp = attachreg(rp, &u, (uint)org & ~SOFFMASK, PT_TEXT, SEG_RO)) == NULL) E 5 { freereg(rp); return(-1); } D 8 /* Load the region or map it for demand load. */ E 8 I 8 /* * Load the region or map it for demand load. */ E 8 if(u.u_exdata.ux_mag == PGMAGIC) { D 8 /* ASSERT(u.u_exdata.ux_tstart == 0); */ E 8 if(mapreg(prp, org, ip, u.u_exdata.ux_tstart, size) < 0) { detachreg(&u, prp); return(-1); } } else panic("xalloc - bad magic"); chgprot(prp, SEG_RO); regrele(rp); return(0); } /* D 8 * free the swap image of all unused saved-text text segments E 8 I 8 * Free the swap image of all unused saved-text text segments E 8 * which are from device dev (used by umount system call). D 5 */ E 5 I 5 */ E 5 xumount(dev) register dev_t dev; { register struct inode *ip; register reg_t *rp; register reg_t *nrp; register count; while(1) { count = 0; for(rp = ractive.r_forw ; rp != &ractive ; rp = nrp) { reglock(rp); if(rp->r_type == RT_UNUSED) { regrele(rp); break; } nrp = rp->r_forw; if ((ip = rp->r_iptr) == NULL) { regrele(rp); continue; } if (dev != NODEV && dev != ip->i_dev) { regrele(rp); continue; } if (xuntext(rp)) count++; else regrele(rp); } if(rp == &ractive) return(count); } } /* D 5 * remove a shared text segment from the region table, if possible. */ E 5 I 5 * Remove a shared text segment from the region table, if possible. */ E 5 xrele(ip) register struct inode *ip; { register reg_t *rp; register reg_t *nrp; if ((ip->i_flag&ITEXT) == 0) return; while(1) { for(rp = ractive.r_forw ; rp != &ractive ; rp = nrp) { reglock(rp); if(rp->r_type == RT_UNUSED) { regrele(rp); break; } nrp = rp->r_forw; if (ip == rp->r_iptr) { if(!xuntext(rp)) regrele(rp); } else { regrele(rp); } } if(rp == &ractive) return; } } D 5 /* Try to removed unused regions in order to free up swap * space. */ E 5 I 5 /* * Try to removed unused regions in order to free up swap * space. */ E 5 swapclup() { register reg_t *rp; register reg_t *nrp; register int rval; while(1) { rval = 0; for(rp = ractive.r_forw ; rp != &ractive ; rp = nrp) { reglock(rp); if(rp->r_type == RT_UNUSED) { regrele(rp); break; } nrp = rp->r_forw; if(!xuntext(rp)) regrele(rp); else rval = 1; } if(rp == &ractive) return(rval); } } /* D 8 * remove text image from the region table. E 8 I 8 * Remove text image from the region table. E 8 * the use count must be zero. D 5 */ E 5 I 5 */ E 5 xuntext(rp) register reg_t *rp; { if (rp->r_refcnt != 0) return(0); freereg(rp); return(1); } E 1 h00924 s 00001/00001/00129 d D 4.4 87/05/14 16:18:22 build 8 7 c removed old SCCS strings and inserted #ident BB e s 00002/00002/00128 d D 4.3 87/04/16 19:26:58 dc 7 6 c dc - Add Bull updates from 03/05/87 e s 00014/00014/00116 d D 4.2 87/04/15 17:51:33 dc 6 5 c dc - changed #include "sys/..." to #include e s 00000/00000/00130 d D 4.1 87/02/20 13:32:23 build 5 4 c rolled rev to -r4 /dc e s 00000/00000/00130 d D 3.1 87/01/19 09:24:22 build 4 3 c rolled rev to -r3 /dc e s 00000/00000/00130 d D 2.1 87/01/19 09:24:22 build 3 2 c AUTO NULL DELTA e s 00001/00000/00129 d D 1.2 87/01/16 10:18:25 build 2 1 c add ident string /dc e s 00129/00000/00000 d D 1.1 87/01/09 16:35:42 build 1 0 c Placed under source control - dc e u U f b f n t T I 2 D 7 /* "%W% %E%" */ E 7 I 7 D 8 /* " %W% %E% " */ E 8 I 8 #ident " %W% %E% " E 8 E 7 E 2 I 1 D 6 #include "sys/param.h" #include "sys/types.h" #include "sys/systm.h" #include "sys/sysinfo.h" #include "sys/callo.h" #include "sys/dir.h" #include "sys/signal.h" #include "sys/user.h" #include "sys/page.h" #include "sys/region.h" #include "sys/proc.h" #include "sys/text.h" #include "sys/psl.h" #include "sys/var.h" E 6 I 6 #include #include #include #include #include #include #include #include #include #include #include #include #include #include E 6 /* * timeout is called to arrange that fun(arg) is called in tim/HZ seconds. * An entry is sorted into the callout structure. * The time in each structure entry is the number of HZ's more * than the previous entry. In this way, decrementing the * first entry has the effect of updating all entries. * * The panic is there because there is nothing * intelligent to be done if an entry won't fit. */ int timeid ; timeout(fun, arg, tim) int (*fun)() ; caddr_t arg ; { register struct callo *p1, *p2 ; register int t ; register int id ; int s ; t = tim ; p1 = &callout[0] ; s = spl7() ; if (callout[v.v_call-2].c_func) D 7 panic("Timeout table overflow") ; E 7 I 7 panic("timeout table overflow") ; E 7 while(p1->c_func != 0 && p1->c_time <= t) { t -= p1->c_time ; p1++ ; } p1->c_time -= t ; p2 = p1 ; while(p2->c_func != 0) p2++ ; while(p2 >= p1) { (p2+1)->c_time = p2->c_time ; (p2+1)->c_func = p2->c_func ; (p2+1)->c_arg = p2->c_arg ; (p2+1)->c_id = p2->c_id ; p2-- ; } p1->c_time = t ; p1->c_func = fun ; p1->c_arg = arg ; p1->c_id = id = ++timeid ; splx(s) ; return(id) ; } untimeout(id) register id ; { register struct callo *p1, *p2 ; register s ; s = splhi() ; for (p1 = callout ; p1->c_func != NULL ; p1++) if (p1->c_id == id) { p2 = p1 + 1 ; p2->c_time += p1->c_time ; do *p1++ = *p2++ ; while (p1->c_func != NULL) ; break ; } splx(s) ; } timein() { register struct callo *p1, *p2 ; register s ; struct callo svcall ; if (callout[0].c_func == NULL) return ; s = splhi() ; if (callout[0].c_time <= 0) { p1 = p2 = &callout[0] ; while(p1->c_func != 0 && p1->c_time <= 0) { svcall = *p1 ; /* move up entries first so untimeout won't find us */ do *p2 = *++p1 ; while (p2++->c_func != NULL) ; (*svcall.c_func)(svcall.c_arg) ; p1 = p2 = &callout[0] ; } } splx(s) ; } #define PDELAY (PZERO-1) delay(ticks) { int s ; extern wakeup() ; if (ticks<=0) return ; s = splhi() ; timeout(wakeup, (caddr_t)u.u_procp+1, ticks) ; sleep((caddr_t)u.u_procp+1, PDELAY) ; splx(s) ; } E 1 h01454 s 00001/00001/00194 d D 4.8 87/05/14 16:18:32 build 13 12 c removed old SCCS strings and inserted #ident BB e s 00007/00007/00188 d D 4.7 87/05/01 10:30:46 dc 12 11 c dc - Switch math traps to DB4. e s 00001/00001/00194 d D 4.6 87/04/30 18:48:10 dc 11 10 c dc - Change default trap settings e s 00002/00002/00193 d D 4.5 87/04/16 19:28:35 dc 10 9 c dc - Add Bull updates from 03/05/87 e s 00017/00017/00178 d D 4.4 87/04/15 17:51:39 dc 9 8 c dc - changed #include "sys/..." to #include e s 00001/00001/00194 d D 4.3 87/02/24 17:37:32 build 8 7 c fix typo in previous delta e s 00001/00000/00194 d D 4.2 87/02/24 17:34:18 build 7 6 c add assertion about regsave area e s 00000/00000/00194 d D 4.1 87/02/20 13:32:26 build 6 5 c rolled rev to -r4 /dc e s 00027/00026/00167 d D 3.2 87/01/26 15:47:58 build 5 4 c add page table changes /dc e s 00000/00000/00193 d D 3.1 87/01/19 09:24:24 build 4 3 c rolled rev to -r3 /dc e s 00000/00000/00193 d D 2.1 87/01/19 09:24:24 build 3 2 c AUTO NULL DELTA e s 00001/00000/00192 d D 1.2 87/01/16 10:18:28 build 2 1 c add ident string /dc e s 00192/00000/00000 d D 1.1 87/01/09 16:35:43 build 1 0 c Placed under source control - dc e u U f b f n t T I 2 D 10 /* "%W% %E%" */ E 10 I 10 D 13 /* " %W% %E% " */ E 13 I 13 #ident " %W% %E% " E 13 E 10 E 2 I 1 D 9 #include "sys/param.h" #include "sys/types.h" #include "sys/systm.h" #include "sys/dir.h" #include "sys/signal.h" #include "sys/user.h" #include "sys/errno.h" #include "sys/page.h" #include "sys/region.h" #include "sys/proc.h" #include "sys/reg.h" #include "sys/psl.h" #include "sys/trap.h" #include "sys/seg.h" #include "sys/sysinfo.h" #include "sys/sysmacros.h" E 9 I 9 #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include E 9 D 9 #include "sys/debug.h" E 9 I 9 #include E 9 #define USER 040 /* user-mode flag added to type */ char addupc_clk ; /* time to user profile */ /* * Called from the trap handler when a processor trap occurs. */ trap(type,code,ps,regsave) { register i; time_t syst; I 7 D 8 ASSERT(regsave != ); E 8 I 8 ASSERT(regsave != 0) ; E 8 E 7 syst = u.u_stime; u.u_ar0 = (char *)regsave; if (USERMODE(ps)) type |= USER; switch (type) { /* * Trap not expected. D 10 * Usually a kernel mode bus error. E 10 I 10 * Usually kernel exceptions. E 10 */ case PROTFLT: case SEGFLT: #ifdef OSDEBUG D 5 printf("PROT or TRANS fault: va=%x\n\t", code); E 5 I 5 debug(DB1,"PROT or TRANS fault: va=%x\n\t", code); E 5 if (i = (int)mapa(code)) D 5 printf("pte = %x\n", *(int *)i); E 5 I 5 debug(DB1,"pte = %x\n", *(int *)i); E 5 else D 5 printf("no pte\n"); printf("\n"); E 5 I 5 debug(DB1,"no pte\n"); debug(DB1,"\n"); E 5 #endif default: panicstr = "trap"; /* fake it for printfs */ D 5 printf("user = "); printf("%x ", u.u_procp->p_addr); printf("pid = %d\t", u.u_procp->p_pid); printf("uarea = %x\n", &u); printf("ps = %x\n", ps); printf("pc = %x\n", u.u_ar0[PC]); printf("trap type %x\n", type); E 5 I 5 debug(DB1,"user = "); debug(DB1,"%x ", u.u_procp->p_addr); debug(DB1,"pid = %d\t", u.u_procp->p_pid); debug(DB1,"uarea = %x\n", &u); debug(DB1,"ps = %x\n", ps); debug(DB1,"pc = %x\n", u.u_ar0[PC]); debug(DB1,"trap type %x\n", type); E 5 panic(NULL); case PROTFLT + USER: /* protection fault */ { pte_t *pt; pt = (pte_t *)mapa(code); if (pt == NULL) i = SIGSEGV; else i = (pt->pgm.pg_v) ? SIGBUS : SIGSEGV; } goto growstack; case KVIOLFLT + USER: /* privileged instruction fault */ D 5 printf("\nPrivilege Violation at Address %x for Process %d comm %s\n",u.u_ar0[PC],u.u_procp->p_pid,u.u_comm); E 5 I 5 debug(DB2,"\nPrivilege Violation at Address %x for Process %d comm %s\n",u.u_ar0[PC],u.u_procp->p_pid,u.u_comm); E 5 goto sigill; case KCALLFLT + USER: /* invalid kcall fault */ D 5 printf("\nInvalid Kcall at Address %x for Process %d comm %s\n",u.u_ar0[PC],u.u_procp->p_pid,u.u_comm); E 5 I 5 debug(DB2,"\nInvalid Kcall at Address %x for Process %d comm %s\n",u.u_ar0[PC],u.u_procp->p_pid,u.u_comm); E 5 goto sigill; case ILLINSTRFLT + USER : /* illegal instruction */ D 5 printf("\nIllegal Instruction at Address %x for Process %d comm %s\n",u.u_ar0[PC],u.u_procp->p_pid,u.u_comm); E 5 I 5 debug(DB2,"\nIllegal Instruction at Address %x for Process %d comm %s\n",u.u_ar0[PC],u.u_procp->p_pid,u.u_comm); E 5 goto sigill; case ALIGNFLT + USER : /* data alignement error */ D 5 printf("\nData Alignement Error at Address %x for Process %d comm %s\n Accessed Address %x\n",u.u_ar0[PC],u.u_procp->p_pid,u.u_comm,u.u_pcb.sregs[SR3]); E 5 I 5 debug(DB2,"\nData Alignement Error at Address %x for Process %d comm %s\n Accessed Address %x\n",u.u_ar0[PC],u.u_procp->p_pid,u.u_comm,u.u_pcb.sregs[SR3]); E 5 i = SIGBUS ; break ; case TRAPFLT + USER : /* trap instruction */ D 5 printf("\nIllegal Trap %d at Address %x for Process %d comm %s\n",u.u_pcb.sregs[SR3],u.u_ar0[PC],u.u_procp->p_pid,u.u_comm); E 5 I 5 debug(DB2,"\nIllegal Trap %d at Address %x for Process %d comm %s\n",u.u_pcb.sregs[SR3],u.u_ar0[PC],u.u_procp->p_pid,u.u_comm); E 5 sigill: i = SIGILL; break; case PARITYEFLT+USER: case PARITYFFLT+USER: D 5 printf("Memory Parity Error at Address %x for Process %d comm %s\n",u.u_pcb.sregs[SR3],u.u_procp->p_pid,u.u_comm); E 5 I 5 debug(DB2,"Memory Parity Error at Address %x for Process %d comm %s\n",u.u_pcb.sregs[SR3],u.u_procp->p_pid,u.u_comm); E 5 goto sigkill; case PGRDFLT + USER: /* read error during page fault */ D 5 printf("pid %d killed due to page fault read error comm %s\n", u.u_procp->p_pid,u.u_comm); E 5 I 5 debug(DB2,"pid %d killed due to page fault read error comm %s\n", u.u_procp->p_pid,u.u_comm); E 5 sigkill: i = SIGKILL; break; case SYSCALL + USER: /* sys call */ panic("syscall"); calcpri: { register struct proc *pp; pp = u.u_procp; pp->p_pri = (pp->p_cpu>>1) + PUSER + pp->p_nice - NZERO; curpri = pp->p_pri; if (runrun == 0) goto out; } case RESCHED + USER: /* Allow process switch */ qswtch(); goto out; case IOVFLFLT + USER: D 5 printf("\nInteger Overflow at Address %x for process %d comm %s\n",u.u_ar0[PC],u.u_procp->p_pid,u.u_comm); E 5 I 5 D 12 debug(DB2,"\nInteger Overflow at Address %x for process %d comm %s\n",u.u_ar0[PC],u.u_procp->p_pid,u.u_comm); E 12 I 12 debug(DB4,"\nInteger Overflow at Address %x for process %d comm %s\n",u.u_ar0[PC],u.u_procp->p_pid,u.u_comm); E 12 E 5 i = SIGINTOVER ; break ; case IZERODIVFLT + USER: D 5 printf("\nInteger Zero Divide at Address %x for process %d comm %s\n",u.u_ar0[PC],u.u_procp->p_pid,u.u_comm); E 5 I 5 D 12 debug(DB2,"\nInteger Zero Divide at Address %x for process %d comm %s\n",u.u_ar0[PC],u.u_procp->p_pid,u.u_comm); E 12 I 12 debug(DB4,"\nInteger Zero Divide at Address %x for process %d comm %s\n",u.u_ar0[PC],u.u_procp->p_pid,u.u_comm); E 12 E 5 i = SIGINTDIVZERO ; break ; case ROVFLFLT + USER: D 5 printf("\nReal Overflow at Address %x for process %d comm %s\n",u.u_ar0[PC],u.u_procp->p_pid,u.u_comm); E 5 I 5 D 12 debug(DB2,"\nReal Overflow at Address %x for process %d comm %s\n",u.u_ar0[PC],u.u_procp->p_pid,u.u_comm); E 12 I 12 debug(DB4,"\nReal Overflow at Address %x for process %d comm %s\n",u.u_ar0[PC],u.u_procp->p_pid,u.u_comm); E 12 E 5 i = SIGREALOVER ; break ; case RUDFLFLT + USER: D 5 printf("\nReal Underflow at Address %x for process %d comm %s\n",u.u_ar0[PC],u.u_procp->p_pid,u.u_comm); E 5 I 5 D 12 debug(DB2,"\nReal Underflow at Address %x for process %d comm %s\n",u.u_ar0[PC],u.u_procp->p_pid,u.u_comm); E 12 I 12 debug(DB4,"\nReal Underflow at Address %x for process %d comm %s\n",u.u_ar0[PC],u.u_procp->p_pid,u.u_comm); E 12 E 5 i = SIGREALUNDER ; break ; case RZERODIVFLT + USER: D 5 printf("\nReal Zero Divide at Address %x for process %d comm %s\n",u.u_ar0[PC],u.u_procp->p_pid,u.u_comm); E 5 I 5 D 12 debug(DB2,"\nReal Zero Divide at Address %x for process %d comm %s\n",u.u_ar0[PC],u.u_procp->p_pid,u.u_comm); E 12 I 12 debug(DB4,"\nReal Zero Divide at Address %x for process %d comm %s\n",u.u_ar0[PC],u.u_procp->p_pid,u.u_comm); E 12 E 5 i = SIGREALDIVZERO ; break; case INEXRES + USER: D 5 printf("\nInexact Result at Address %x for process %d comm %s\n",u.u_ar0[PC],u.u_procp->p_pid,u.u_comm); E 5 I 5 D 12 debug(DB2,"\nInexact Result at Address %x for process %d comm %s\n",u.u_ar0[PC],u.u_procp->p_pid,u.u_comm); E 12 I 12 debug(DB4,"\nInexact Result at Address %x for process %d comm %s\n",u.u_ar0[PC],u.u_procp->p_pid,u.u_comm); E 12 E 5 i = SIGREALINEX ; break; case BEFORE + USER: D 5 printf("\nReal Before Trap at Address %x for process %d comm %s\n",u.u_ar0[PC],u.u_procp->p_pid,u.u_comm); E 5 I 5 D 12 debug(DB2,"\nReal Before Trap at Address %x for process %d comm %s\n",u.u_ar0[PC],u.u_procp->p_pid,u.u_comm); E 12 I 12 debug(DB4,"\nReal Before Trap at Address %x for process %d comm %s\n",u.u_ar0[PC],u.u_procp->p_pid,u.u_comm); E 12 E 5 D 11 i = SIGREALINV ; E 11 I 11 i = SIGREALBEFORE ; E 11 break; I 5 E 5 /* * If the user SP is below the stack segment, * grow the stack automatically. */ case SEGFLT + USER: /* segmentation exception */ i = SIGSEGV; growstack: if (grow(u.u_ar0[SP])) goto calcpri; break; case BPTFLT + USER: /* bpt instruction fault */ i = SIGTRAP; break; case CHKFLT + USER: /* xfc instruction fault */ D 5 printf("\nCheck Instruction Failed at Address %x for Process %d\n",u.u_ar0[PC],u.u_procp->p_pid,u.u_comm); E 5 I 5 debug(DB2,"\nCheck Instruction Failed at Address %x for Process %d\n",u.u_ar0[PC],u.u_procp->p_pid,u.u_comm); E 5 i = SIGBOUNDS; break; case ADDUPC + USER: /* user level profiling */ addupc_clk = 0 ; addupc((caddr_t) u.u_ar0[PC] , &u.u_prof, 1); if (runrun) qswtch() ; goto out ; } psignal(u.u_procp, i); if (runrun != 0) qswtch() ; out: if (u.u_procp->p_sig && issig()) psig(code); } stray(addr) { logstray(addr); printf("stray interrupt at %x\n", addr); } E 1 h64449 s 00001/00001/00078 d D 4.4 87/05/14 16:18:43 build 8 7 c removed old SCCS strings and inserted #ident BB e s 00001/00001/00078 d D 4.3 87/04/16 19:28:48 dc 7 6 c dc - Add Bull updates from 03/05/87 e s 00013/00013/00066 d D 4.2 87/04/15 17:51:46 dc 6 5 c dc - changed #include "sys/..." to #include e s 00000/00000/00079 d D 4.1 87/02/20 13:32:29 build 5 4 c rolled rev to -r4 /dc e s 00000/00000/00079 d D 3.1 87/01/19 09:24:27 build 4 3 c rolled rev to -r3 /dc e s 00000/00000/00079 d D 2.1 87/01/19 09:24:27 build 3 2 c AUTO NULL DELTA e s 00001/00000/00078 d D 1.2 87/01/16 10:18:31 build 2 1 c add ident string /dc e s 00078/00000/00000 d D 1.1 87/01/09 16:35:44 build 1 0 c Placed under source control - dc e u U f b f n t T I 2 D 7 /* "%W% %E%" */ E 7 I 7 D 8 /* " %W% %E% " */ E 8 I 8 #ident " %W% %E% " E 8 E 7 E 2 I 1 D 6 #include "sys/param.h" #include "sys/types.h" #include "sys/sysmacros.h" #include "sys/page.h" #include "sys/buf.h" #include "sys/filsys.h" #include "sys/mount.h" #include "sys/dir.h" #include "sys/signal.h" #include "sys/user.h" #include "sys/errno.h" #include "sys/var.h" #include "sys/utsname.h" E 6 I 6 #include #include #include #include #include #include #include #include #include #include #include #include #include E 6 utssys() { register i; register struct a { char *cbuf; int mv; int type; } *uap; struct { daddr_t f_tfree; ino_t f_tinode; char f_fname[6]; char f_fpack[6]; } ust; uap = (struct a *)u.u_ap; switch(uap->type) { case 0: /* uname */ if (copyout(&utsname,uap->cbuf,sizeof(struct utsname))) u.u_error = EFAULT; return; case 255: /* snodename */ if (!suser()) return ; if (copyin(uap->cbuf, utsname.nodename , sizeof utsname.nodename)) u.u_error = EFAULT ; utsname.nodename[sizeof utsname.nodename -1] = '\0' ; return ; /* case 1 was umask */ case 2: /* ustat */ for(i=0; im_flags==MINUSE && brdev(mp->m_dev)==brdev(uap->mv)) { register struct filsys *fp; fp = mp->m_bufp->b_un.b_filsys; ust.f_tfree = FsLTOP(mp->m_dev, fp->s_tfree); ust.f_tinode = fp->s_tinode; bcopy(fp->s_fname, ust.f_fname, sizeof(ust.f_fname)); bcopy(fp->s_fpack, ust.f_fpack, sizeof(ust.f_fpack)); if (copyout(&ust, uap->cbuf, 18)) u.u_error = EFAULT; return; } } u.u_error = EINVAL; return; default: u.u_error = EFAULT; } } E 1 h45334 s 00001/00001/00539 d D 4.3 87/05/14 16:18:54 build 7 6 c removed old SCCS strings and inserted #ident BB e s 00015/00015/00525 d D 4.2 87/04/15 17:51:54 dc 6 5 c dc - changed #include "sys/..." to #include e s 00000/00000/00540 d D 4.1 87/02/20 13:32:32 build 5 4 c rolled rev to -r4 /dc e s 00000/00000/00540 d D 3.1 87/01/19 09:24:30 build 4 3 c rolled rev to -r3 /dc e s 00000/00000/00540 d D 2.1 87/01/19 09:24:30 build 3 2 c AUTO NULL DELTA e s 00001/00000/00539 d D 1.2 87/01/16 10:18:34 build 2 1 c add ident string /dc e s 00539/00000/00000 d D 1.1 87/01/09 16:35:45 build 1 0 c Placed under source control - dc e u U f b f n t T I 2 D 7 /* "%W% %E%" */ E 7 I 7 #ident " %W% %E% " E 7 E 2 I 1 D 6 #include "sys/types.h" #include "sys/param.h" #include "sys/sysmacros.h" #include "sys/systm.h" #include "sys/dir.h" #include "sys/signal.h" #include "sys/user.h" #include "sys/inode.h" #include "sys/var.h" #include "sys/mount.h" #include "sys/page.h" #include "sys/sysinfo.h" #include "sys/seg.h" #include "sys/vrt.h" #include "sys/debug.h" E 6 I 6 #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include E 6 vrte_t nullvrt ; vrte_t *vrthead,*sys_vrthead ; /* user vrt tables */ vrte_t *vuser_vrt[VRTSIZE] ; paddr_t user_vrt[VRTSIZE] ; /* system vrt tables */ vrte_t *vsys_vrt[VRTSIZE] ; paddr_t sys_vrt[VRTSIZE] ; vrt_insert(vaddr , pt , segno) register vaddr ; register pte_t *pt ; register ushort segno ; { register vrte_t *vrt_e ; #ifdef OSDEBUG if (vrt_e = vrt_find(pt,segno)) { printf("vrt_insert page allready mapped for that process\n") ; call_debug() ; } #endif if (vrt_e = (vrte_t *)vrt_alloc()) { /* found a vrt entry */ vrt_e->segno = segno ; vrt_e->vpn = vaddr >> 16 ; vrt_e->pg_tag = vaddr >> 21 ; vrt_e->pg_v = VRT_V ; if (pt->pgi.pg_pte & PG_V) vrt_e->pg_pfn = pt->pgm.pg_pfn ; else vrt_e->segno |= 0x8000 ; vrt_e->pg_w = pt->pgm.pg_w == PTE_UW ? VRT_UW : VRT_UR ; vrt_add(vrt_e,vaddr,pt) ; return(0) ; } /* vrt_alloc failed */ #ifdef OSDEBUG call_debug() ; #else panic("vrt_insert - vrt_alloc failed") ; #endif } vrt_suppress(vaddr , pt , segno) register vaddr ; register pte_t *pt ; register ushort segno ; { register vrte_t *vrt_e ; if (vrt_e = vrt_find(pt,segno)) { /* found the vrt entry */ vrt_delete(vrt_e,vaddr,pt) ; *vrt_e = nullvrt ; vrt_free(vrt_e) ; return(0) ; } /* #ifdef OSDEBUG call_debug() ; #else panic("vrt_suppress - vrt_find failed") ; #endif */ } vrte_t *vrt_find(pt , segno) register pte_t *pt ; register ushort segno ; { ushort pg_pfn ; register vrte_t *vrt_e ; register rvrte_t *rvrt_e ; rvrt_e = (rvrte_t *)(pt + 2*NPGPT) ; for (vrt_e = rvrt_e->vrt_e ; vrt_e && ((vrt_e->segno & 0x7fff) != segno) ; ) vrt_e = vrt_e->next ; return(vrt_e) ; } vrt_add(vrt_e , vaddr , pt) register vrte_t *vrt_e ; register vaddr ; register pte_t *pt ; { register ushort hash ; register pg_pfn ; register rvrte_t *rvrt_e ; vaddr >>= BPPSHIFT ; hash = vrt_hash(vaddr,(vrt_e->segno & 0x7fff)) ; vrt_e->link = user_vrt[hash] ; pg_pfn = ((pte_t *)sbrpte)[svtop(vrt_e)].pgm.pg_pfn ; user_vrt[hash] = (pg_pfn << BPPSHIFT) + poff(vrt_e) ; vrt_e->vlink = vuser_vrt[hash] ; vuser_vrt[hash] = vrt_e ; /* update the reverse vrt table */ rvrt_e = (rvrte_t *)(pt + 2*NPGPT) ; vrt_e->next = rvrt_e->vrt_e ; rvrt_e->vrt_e = vrt_e ; } vrt_delete(vrt_e , vaddr , pt) register vrte_t *vrt_e ; register vaddr ; register pte_t *pt ; { register ushort hash ; register vrte_t *vrt_p ; register rvrte_t *rvrt_e ; vaddr >>= BPPSHIFT ; hash = vrt_hash(vaddr,(vrt_e->segno & 0x7fff)) ; vrt_p = vuser_vrt[hash] ; if (vrt_e == vrt_p) { vuser_vrt[hash] = vrt_e->vlink ; user_vrt[hash] = vrt_e->link ; } else2 te_t *pt ; { register vrte_t *vrt_e ; register rvrte_t *rvrt_e ; rvrt_e = (rvrte_t *)(pt + 2*NPGPT) ; for (vrt_e = rvrt_e->vrt_e ; vrt_e ; ) { vrt_e->pg_r = 0 ; vrt_e = vrt_e->next ; } } vrte_t *sys_vrt_insert(vaddr , pt , segno) register vaddr ; register pte_t pt ; register ushort segno ; { register vrte_t *vrt_e,*vrt_p ; register ushort hash ; register pg_pfn ; register vpn ; if (!(vrt_e = sys_vrthead)) #ifdef OSDEBUG call_debug() ; #else panic("sys_vrt_insert failed") ; #endif else { #ifdef OSDEBUG hash = vrt_hash((vaddr >> BPPSHIFT),segno) ; vpn = vaddr >> 16 ; vrt_p = vsys_vrt[hash] ; for ( ; vrt_p ; vrt_p = vrt_p->vlink) if ((vrt_p->vpn == vpn) && (vrt_p->pg_pfn == pt.pgm.pg_pfn)) break ; if (vrt_p) call_debug() ; #endif sys_vrthead = sys_vrthead->next ; vrt_e->next = (vrte_t *)0 ; hash = vrt_hash((vaddr >> BPPSHIFT),segno) ; vrt_e->link = sys_vrt[hash] ; vrt_e->vlink = vsys_vrt[hash] ; vrt_e->segno = segno ; vrt_e->vpn = vaddr >> 16 ; vrt_e->pg_pfn = pt.pgm.pg_pfn ; vrt_e->pg_tag = vaddr >> 21 ; vrt_e->pg_v = (pt.pgi.pg_pte & PG_V) ? VRT_V : 0 ; vrt_e->pg_w = pt.pgm.pg_w == PTE_KW ? VRT_KW : VRT_KR ; pg_pfn = ((pte_t *)sbrpte)[svtop(vrt_e)].pgm.pg_pfn ; sys_vrt[hash] = (pg_pfn << BPPSHIFT) + poff(vrt_e) ; vsys_vrt[hash] = vrt_e ; return(vrt_e) ; } } sys_vrt_suppress(vaddr , pt , segno) register vaddr ; register pte_t pt ; register ushort segno ; { register vrte_t *vrt_e,*vrt_p ; register ushort hash ; hash = vrt_hash((vaddr >> BPPSHIFT),segno) ; if (!(vrt_e = vsys_vrt[hash])) #ifdef OSDEBUG call_debug() ; #else panic("sys_vrt_suppress failed") ; #endif else { vrt_p = vrt_e ; for ( ; vrt_e && vrt_e->pg_pfn != pt.pgm.pg_pfn ; ) { vrt_p = vrt_e ; vrt_e = vrt_e->vlink ; } if (!vrt_e) #ifdef OSDEBUG call_debug() ; #else panic("sys_vrt_suppress failed") ; #endif else { if (vrt_p == vrt_e) { vsys_vrt[hash] = vrt_e->vlink ; sys_vrt[hash] = vrt_e->link ; } else { vrt_p->vlink = vrt_e->vlink ; vrt_p->link = vrt_e->link ; } /* add this vrt entry to the free list */ *vrt_e = nullvrt ; vrt_e->next = sys_vrthead ; sys_vrthead = vrt_e ; } } } sys_vrt_init(nb_entry) { register vrte_t *vrt_e,*vrt_p ; vrt_e = vrt_p = sys_vrthead ; vrt_e++ ; for ( ; --nb_entry > 0 ;) { vrt_p->next = vrt_e ; vrt_p = vrt_e ; vrt_e++ ; } vrt_p->next = (vrte_t *)0 ; } E 1 h38794 s 00001/00001/00118 d D 4.4 87/05/14 16:19:05 build 8 7 c removed old SCCS strings and inserted #ident BB e s 00001/00001/00118 d D 4.3 87/04/16 18:15:27 dc 7 6 c dc - Add Bull updates from 03/05/87 e s 00010/00010/00109 d D 4.2 87/04/15 17:52:00 dc 6 5 c dc - changed #include "sys/..." to #include e s 00000/00000/00119 d D 4.1 87/02/20 13:32:36 build 5 4 c rolled rev to -r4 /dc e s 00000/00000/00119 d D 3.1 87/01/19 09:24:33 build 4 3 c rolled rev to -r3 /dc e s 00000/00000/00119 d D 2.1 87/01/19 09:24:33 build 3 2 c AUTO NULL DELTA e s 00001/00000/00118 d D 1.2 87/01/16 10:18:39 build 2 1 c add ident string /dc e s 00118/00000/00000 d D 1.1 87/01/09 16:34:11 build 1 0 c Placed under source control - dc e u U f b f n t T I 2 D 7 /* "%W% %E%" */ E 7 I 7 D 8 /* " %W% %E% " */ E 8 I 8 #ident " %W% %E% " E 8 E 7 E 2 I 1 D 6 #include "sys/param.h" #include "sys/types.h" #include "sys/systm.h" #include "sys/acct.h" #include "sys/dir.h" #include "sys/signal.h" #include "sys/user.h" #include "sys/errno.h" #include "sys/inode.h" #include "sys/file.h" E 6 I 6 #include #include #include #include #include #include #include #include #include #include E 6 /* * Perform process accounting functions. */ sysacct() { register struct inode *ip; register struct a { char *fname; } *uap; static aclock; uap = (struct a *)u.u_ap; if (aclock || !suser()) return; aclock++; switch ((int)uap->fname) { case NULL: if (acctp) { plock(acctp); iput(acctp); acctp = NULL; } break; default: if (acctp) { u.u_error = EBUSY; break; } ip = namei(uchar, 0); if (ip == NULL) break; if ((ip->i_mode & IFMT) != IFREG) u.u_error = EACCES; else access(ip, IWRITE); if (u.u_error) { iput(ip); break; } acctp = ip; prele(ip); } aclock--; } /* * On exit, write a record on the accounting file. */ acct(st) { register struct inode *ip; off_t siz; if ((ip=acctp) == NULL) return; plock(ip); bcopy(u.u_comm,acctbuf.ac_comm,sizeof(acctbuf.ac_comm)); acctbuf.ac_btime = u.u_start; acctbuf.ac_utime = compress(u.u_utime); acctbuf.ac_stime = compress(u.u_stime); acctbuf.ac_etime = compress(lbolt - u.u_ticks); acctbuf.ac_mem = compress(u.u_mem); acctbuf.ac_io = compress(u.u_ioch); acctbuf.ac_rw = compress(u.u_ior+u.u_iow); acctbuf.ac_uid = u.u_ruid; acctbuf.ac_gid = u.u_rgid; acctbuf.ac_tty = u.u_ttyp ? u.u_ttyd : NODEV; acctbuf.ac_stat = st; acctbuf.ac_flag = u.u_acflag; siz = ip->i_size; u.u_offset = siz; u.u_base = (caddr_t)&acctbuf; u.u_count = sizeof(acctbuf); u.u_segflg = 1; u.u_error = 0; u.u_limit = (daddr_t)5000; u.u_fmode = FWRITE; writei(ip); if (u.u_error) ip->i_size = siz; prele(ip); } /* * Produce a pseudo-floating point representation * with 3 bits base-8 exponent, 13 bits fraction. */ compress(t) register time_t t; { register exp = 0, round = 0; while (t >= 8192) { exp++; round = t&04; t >>= 3; } if (round) { t++; if (t >= 8192) { t >>= 3; exp++; } } return((exp<<13) + t); } E 1 h60776 s 00001/00001/00278 d D 4.4 87/05/14 16:19:16 build 7 6 c removed old SCCS strings and inserted #ident BB e s 00071/00000/00208 d D 4.3 87/05/07 13:04:29 dc 6 5 c dc - Add headwall conversion routines e s 00024/00002/00184 d D 4.2 87/05/07 12:00:18 dc 5 4 c dc - expand tm struct to include secs and mins and days, months e s 00000/00000/00186 d D 4.1 87/04/17 09:32:37 dc 4 3 c rolled rev to -r4 /dc e s 00000/00000/00186 d D 3.1 87/04/17 09:32:37 dc 3 2 c AUTO NULL DELTA e s 00000/00000/00186 d D 2.1 87/04/17 09:32:37 dc 2 1 c AUTO NULL DELTA e s 00186/00000/00000 d D 1.1 87/04/17 09:32:03 dc 1 0 c Placed under source control - dc e u U f b f n t T I 1 D 7 /* " %W% %E% " */ E 7 I 7 #ident " %W% %E% " E 7 #include #include /* this code is part of ctime(3) in libc library */ struct tm { /* see ctime(3) */ I 5 int tm_sec; int tm_min; E 5 int tm_hour; I 5 int tm_mday; int tm_mon; E 5 int tm_year; int tm_wday; int tm_yday; }; #define dysize(A) (((A)%4)? 365: 366) I 5 static int dmsize[12]={31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}; E 5 /* * The following tables are used to determine DST change days */ struct dstab { int dayyr; int daylb; int dayle; }; /* * USA */ static struct dstab usdaytab[] = { 1974, 5, 333, /* 1974: Jan 6 - last Sun. in Nov */ 1975, 58, 303, /* 1975: Last Sun. in Feb - last Sun in Oct */ 0, 119, 303, /* all other years: end Apr - end Oct */ }; /* * Australia */ static struct dstab ausdaytab[] = { 1970, 400, 0, /* 1970: no daylight saving at all */ 1971, 303, 0, /* 1971: daylight saving from Oct 31 */ 1972, 303, 58, /* 1972: Jan 1 -> Feb 27 & Oct 31 -> dec 31 */ 0, 303, 65, /* others: -> Mar 7, Oct 31 -> */ }; /* * The European tables * WE: Great Britain, Ireland, Portugal * ME: Belgium, Luxembourg, Netherlands, Denmark, Norway, * Austria, Poland, Czechoslovakia, Sweden, Switzerland, * DDR, DBR, France, Spain, Hungary, Italy, Jugoslavia * Eastern European dst is unknown, we'll make it ME until someone speaks up. * EE: Bulgaria, Finland, Greece, Rumania, Turkey, Western Russia */ static struct dstab wedaytab[] = { 0, 89, 303, /* 1983: end March - end Oct */ }; static struct dstab medaytab[] = { 0, 89, 272, /* 1983: end March - end Sep */ }; static struct dayrules { int dst_type; /* number obtained from system */ int dst_hrs; /* hours to add when dst on */ struct dstab * dst_rules; /* one of the above */ enum {STH,NTH} dst_hemi; /* southern, northern hemisphere */ } dayrules [] = { DST_USA, 1, usdaytab, NTH, DST_AUST, 1, ausdaytab, STH, DST_WET, 1, wedaytab, NTH, DST_MET, 1, medaytab, NTH, DST_EET, 1, medaytab, NTH, -1, }; /* * timelap() returns difference between system time and local time in seconds. * used in printf() */ timelap(gmt_time) time_t gmt_time; { register int dayno, daylbegin, daylend; register struct tm *ct; struct tm *gmtime(); long copyt; extern short timezone, dstflag; register struct dayrules *dr; register struct dstab *ds; int year; copyt = gmt_time - timezone*60; ct = gmtime(©t); dayno = ct->tm_yday; for (dr = dayrules; dr->dst_type >= 0; dr++) if (dr->dst_type == dstflag) break; if (dr->dst_type >= 0) { year = ct->tm_year + 1900; for (ds = dr->dst_rules; ds->dayyr; ds++) if (ds->dayyr == year) break; daylbegin= ds->daylb; /* first Sun after dst starts */ daylend = ds->dayle; /* first Sunday after DST ends */ daylbegin= sunday(ct, daylbegin); daylend = sunday(ct, daylend); switch (dr->dst_hemi) { case NTH: if (!( (dayno>daylbegin || (dayno==daylbegin && ct->tm_hour>=2)) && (daynotm_hour<1)) )) return(-(timezone*60)); break; case STH: if (!( (dayno>daylbegin || (dayno==daylbegin && ct->tm_hour>=2)) || (daynotm_hour<2)) )) return(-(timezone*60)); break; default: return(-(timezone*60)); } } return(60*(60-timezone)); } /* * The argument is a 0-origin day number. * The value is the day number of the last * Sunday on or before the day. */ static int sunday(t, d) register struct tm *t; register int d; { if(d >= 58) d += dysize(t->tm_year) - 365; return(d - (d - t->tm_yday + t->tm_wday + 700) % 7); } struct tm * gmtime(tim) long *tim; { register int d0, d1; long hms, day; static struct tm xtime; /* * break initial number into days */ hms = *tim % 86400L; day = *tim / 86400L; if(hms < 0) { hms += 86400L; day -= 1; } /* D 5 * generate hours E 5 I 5 * generate hours:minutes:seconds E 5 */ D 5 d1 = xtime.tm_hour = hms / 3600; E 5 I 5 xtime.tm_sec = hms % 60; d1 = hms / 60; xtime.tm_min = d1 % 60; d1 /= 60; xtime.tm_hour = d1; E 5 /* * day is the day number. * generate day of the week. * The addend is 4 mod 7 (1/1/1970 was Thursday) */ xtime.tm_wday = (day + 7340036L) % 7; /* * year number */ if(day >= 0) for(d1=70; day >= dysize(d1); d1++) day -= dysize(d1); else for(d1=70; day < 0; d1--) day += dysize(d1-1); xtime.tm_year = d1; xtime.tm_yday = d0 = day; I 5 /* * generate month */ if(dysize(d1) == 366) dmsize[1] = 29; for(d1=0; d0 >= dmsize[d1]; d1++) d0 -= dmsize[d1]; dmsize[1] = 28; xtime.tm_mday = d0+1; xtime.tm_mon = d1; E 5 return(&xtime); } I 6 /* * This routine converts a time stamp into bytes which * describe year, month, day, hour, minute, and second. * Same as ctime, but month will be 1..12 instead of 0..11. * Used on Headwall processor for setting date on clock board. */ timetoYMDHMS(c_time,y,mo,d,h,mi,s) time_t c_time; char * y; char * mo; char * d; char * h; char * mi; char * s; { register struct tm *ct; ct = gmtime(&c_time); *y = (char) ct->tm_year; *mo = (char) ct->tm_mon + 1; /* adjust to 1..12 base */ *d = (char) ct->tm_mday; *h = (char) ct->tm_hour; *mi = (char) ct->tm_min; *s = (char) ct->tm_sec; } /* * Routine to convert year, month, day, hour, minute, second * to a (GMT) time stamp. Used on a Headwall to convert the date/ * time from the clock board to a unix timestamp. */ time_t YMDHMStotime(y,mo,d,h,mi,s) char * y; char * mo; char * d; char * h; char * mi; char * s; { time_t c_time; int act; int cur; c_time = 0; act = (int) *y; for(cur=70; cur < act; cur++) c_time += dysize(cur); /* add days for each preceeding year */ if(dysize(act) == 366) /* if we're in a leap year, adj Feb */ dmsize[1] = 29; act = (int) *mo - 1; /* Get month, adjust to 0..11 base */ for(cur= 0; cur < act; cur++) c_time += dmsize[cur]; /* add days of each preceeding month */ dmsize[1] = 28; /* 'unadjust' Feb */ c_time += ((int) *d) - 1; /* include days, adj to 0..n */ c_time *= 24; /* make room for hours */ c_time += (int) *h; /* include hours */ c_time *= 60; /* make room for minutes */ c_time += (int) *mi; /* include minutes */ c_time *= 60; /* make room for seconds */ c_time += (int) *s; /* include seconds */ return(c_time); } E 6 E 1 h38694 s 00001/00001/00127 d D 4.6 87/05/14 16:19:28 build 9 8 c removed old SCCS strings and inserted #ident BB e s 00003/00009/00125 d D 4.5 87/05/11 10:26:33 dc 8 7 c dc - fix copyin confusion in setting round modes e s 00028/00019/00106 d D 4.4 87/05/11 08:39:52 dc 7 6 c dc - Use ieeefp.h Add HWClock command function. e s 00060/00000/00065 d D 4.3 87/05/08 17:23:07 dc 6 5 c dc - Add rounding mode manipulation e s 00004/00000/00061 d D 4.2 87/04/29 15:55:51 dc 5 4 c ... e s 00000/00000/00061 d D 4.1 87/04/29 14:58:32 dc 4 3 c rolled rev to -r4 /dc e s 00000/00000/00061 d D 3.1 87/04/29 14:58:32 dc 3 2 c AUTO NULL DELTA e s 00000/00000/00061 d D 2.1 87/04/29 14:58:32 dc 2 1 c AUTO NULL DELTA e s 00061/00000/00000 d D 1.1 87/04/29 14:58:19 dc 1 0 c Placed under source control - dc e u U f b f n t T I 1 D 9 /* " %W% %E% " */ E 9 I 9 #ident " %W% %E% " E 9 /* * sysridge * * System call support for functions particular to the ridge * processors. */ #include #include #include #include #include #include #include #include #include I 7 #include E 7 extern int ftbits; extern int ftHeadwall; extern int mcversion; extern int machineid; I 6 /* * Convert the rounding mode field of a traps word to an ieee code. */ D 7 int E 7 I 7 fp_rnd E 7 traptoround(tw) int tw; { D 7 int ic; E 7 I 7 fp_rnd ic; E 7 D 7 ic = 0; E 7 I 7 ic = FP_RN; E 7 switch (tw & TRPSW_RNDMASK) { D 7 case TRPSW_RNDNEAREST : ic = 0 ; break; case TRPSW_RNDPLUSINF : ic = 1 ; break; case TRPSW_RNDMINUSINF : ic = 2 ; break; case TRPSW_RNDTOZERO : ic = 3 ; break; E 7 I 7 case TRPSW_RNDNEAREST : ic = FP_RN ; break; case TRPSW_RNDPLUSINF : ic = FP_RP ; break; case TRPSW_RNDMINUSINF : ic = FP_RM ; break; case TRPSW_RNDTOZERO : ic = FP_RZ ; break; E 7 } return(ic); } /* * Convert an ieee code to the rounding mode field of a traps word. */ int roundtotrap(ic) D 7 int ic; E 7 I 7 fp_rnd ic; E 7 { int tb; tb = TRPSW_RNDNEAREST; switch (ic) { D 7 case 0 : tb = TRPSW_RNDNEAREST; break; case 1 : tb = TRPSW_RNDPLUSINF; break; case 2 : tb = TRPSW_RNDMINUSINF; break; case 3 : tb = TRPSW_RNDTOZERO; break; E 7 I 7 case FP_RN : tb = TRPSW_RNDNEAREST; break; case FP_RP : tb = TRPSW_RNDPLUSINF; break; case FP_RM : tb = TRPSW_RNDMINUSINF; break; case FP_RZ : tb = TRPSW_RNDTOZERO; break; E 7 } return(tb); } E 6 sysridge() { register struct a { int cmd; D 7 int arg1, arg2, arg3; E 7 I 7 int arg1, arg2, arg3, arg4; E 7 } *uap = (struct a *) u.u_ap; D 7 int errcode = 0; /* hold error, if any */ E 7 int oneout = 0; /* true if one arg returning */ int retval; /* .. holds one returning arg */ I 6 int inarg; /* .. holds one incoming arg */ E 6 switch (uap->cmd) { case SRG_HWFEATURES: retval = ftbits; I 5 oneout = 1; E 5 break; case SRG_MCVERSION: retval = mcversion; I 5 oneout = 1; E 5 break; case SRG_MACHINEID: retval = machineid; I 5 oneout = 1; E 5 break; case SRG_LOADENABLE: retval = ftHeadwall ? HWLoadEnable(SYSVA) : R32LoadEnable(); I 5 oneout = 1; E 5 break; I 6 case SRG_FPROUND: retval = traptoround(u.u_pcb.traps_word); oneout = 1; break; case SRS_FPROUND: D 8 if (copyin((caddr_t)uap->arg1, (caddr_t)&inarg, sizeof(inarg))) { u.u_error = EFAULT; } else { inarg = roundtotrap(inarg); u.u_pcb.traps_word &= ~TRPSW_RNDMASK; u.u_pcb.traps_word |= inarg; } E 8 I 8 inarg = roundtotrap(uap->arg1); u.u_pcb.traps_word &= ~TRPSW_RNDMASK; u.u_pcb.traps_word |= inarg; E 8 break; I 7 case SRF_HWCLOCK: if (suser()) if (! ftHeadwall) u.u_error = EINVAL; else HWClockCommand( uap->arg1, uap->arg2, uap->arg3, uap->arg4); break; E 7 default: D 7 errcode = EINVAL; E 7 I 7 u.u_error = EINVAL; E 7 E 6 } /* standard return for one int going back out to user */ D 7 if (oneout && (errcode == 0)) E 7 I 7 if (oneout && (! u.u_error)) E 7 if ( copyout(&retval, uap->arg1, sizeof(retval)) ) D 7 errcode = EFAULT ; u.u_error = errcode ; E 7 I 7 u.u_error = EFAULT ; E 7 } E 1 ! / 548577533 0 0 0 7082 `  %%%%%%%6*6*6*6*6*6*6*6*6*6*6*6*6*6*6*6*6*6*TTTWWW_______mmppppppppppppp,,,,,TTTTьььььььььььььььььь,,,,,,,699>8>8>8>8>8>8>8F@F@F@F@F@F@F@F@F@RFRFRFRFRFRFRFRFRFRFbbbgvgvgvgvgvgvgvqqqqqqqqqqJJJJJJJJJJJ66666pppppp!(!(!(!(!(!(!(!(!(!(!(!(!(!(!(!(!(!(!(!(VVV^^^^^^^^^^^^`````````````````VVVVVVVVVVVVVVVV666fffFFFFFFFFFFFF?b?b?b?b?bEEWWW^^^^^i6i6i6i6rrrrr{8{8{8 88888888888888888ÖÖÖlllllllllllllllllllllllll6>6>6>6>6>6>6>6>6>6>6>6>6>6>6>6>6>6>6>6>6>6>6>6>S(S(S(S(S(_sysacct_acct_compress_alloc_getfs_badblock_free_ialloc_ifree_update_bread_getblk_iowait_breada_incore_brelse_bwrite_bdwrite_bawrite_geteblk_iodone_clrbuf_bflush_binval_binit_sbuf_bufstart_bdflush_setmask_sbittab_cbittab_bldblklst_bldindr_freeblklst_clock_switching_lbolt_lticks_time_vhandcnt_bdflushcnt_debug_setlev_errinit_geteslot_freeslot_geterec_puterec_logstart_logtchg_logstray_blkacty_fmtberr_fmtraerr_logberr_logmemory_exece_gethead_getxfile_get410_execreg_exit_pexit_wait_freeproc_pfault_vfault_pageincache_killpage_getf_closef_ffreelist_openi_access_owner_suser_ufalloc_falloc_finit_findfid_fids_allocfid_frfid_freefid_flckinit_frlock_insflck_delflck_regflck_flckadj_blocked_getflck_convoff_setflck_deadflck_sleeplcks_cleanlocks_newproc_procdup_makechild_uaccess_vhand_getpgslim_ageprocess_ageregion_getpages_swapchunk_memfree_sbreak_uclear_grow_inoinit_ifreelist_hinode_iget_iread_iput_itrunc_iupdat_tloop_maknode_wdir_iflush_iinit_stat1_ext_intr_ipcaccess_ipcget_lock_textlock_datalock_proclock_punlock_tunlock_dunlock_clkstart_clkset_sendsig_bcmp_setregs_clrmem_chksize_coredump_HeadwallDiag_main_physmem_uservad_userpte_mmvad_mmpte_rootdir_maxmem_maxumem_maxupts_malloc_mfree_masktab_iomove_pcopyin_pcopyout_schar_uchar_passc_cpass_msgconv_msgctl_msgfree_msgfp_msgget_msginit_msg_msgrcv_msgsnd_msgsys_namei_ptmemall_memreserve_freemem_ptfill_pall_premove_sptfill_pgtallocator_stfill_pfree_allocator_pbremove_pfind_pinsert_sptalloc_sptfree_meminit_firstfree_maxfree_ipflush_pmount_punmount_startup_pgtalloc_pgtmap_ptmalloc_kpgtfree_pgtfree_pgtalloc_nptfree_getcpages_nptalloced_freepage_contmemall_swap_physio_physck_pipe_prele_openp_closep_plock_printf_print_printc_pr_time_printn_pr_hour_pr_dst_panic_panicstr_prdev_prcom_assfail_provfl_useracc_stop_procxmt_ptrace_ipc_dirtypage_ipcreg_readi_writei_reginit_reglock_regrele_allocreg_freereg_nullregion_attachreg_findpreg_chkattach_nullpregion_loadstbl_detachreg_dupreg_growreg_rptexpand_chkgrowth_loadreg_mapreg_findreg_chgprot_sched_lockedreg_swapout_semaoe_semfup_semunp_semconv_semctl_semunrm_semexit_semget_seminit_semop_semundo_semsys_shmattach_shmconv_shmctl_shmdt_shmexec_shmexit_shmfork_shmget_shmsys_signal_psignal_issig_fsig_psig_core_sleep_hsque_wakeup_runq_runout_curpri_runrun_setrun_setrq_runin_curproc_next_page_vadrspace_sys_sect_ksct_ksv_sz_kbase_ublk_ptbl_mktables_p0init_ublk_sgtbl_p0init_done_pfdat_startup_cinit_cfreelist_pfhead_bmap_swalloc_swapfind_swfree1_swpuse_swpinc_swapadd_swapdel_getswap_swaprem_unswap_qswtch_swtch_lastproc_exec_rexit_fork_read_rdwr_write_sorwuio_open_copen_creat_close_seek_link_mknod_saccess_fstat_stat_dup_fcntl_ioctl_stty_gtty_mgetdev_smount_sumount_swapfunc_gtime_ftime_stime_setuid_setreuid_getuid_geteuid_getegid_setgid_setregid_getgid_getpid_setpgrp_sync_nice_unlink_chdir_chdirec_chroot_chmod_chown_ssig_kill_times_profil_alarm_pause_umask_utime_ulimit_reboot_syscall_nosys_nullsys_nodev_nulldev_sysent_nsysent_traptoround_roundtotrap_sysridge_xalloc_xumount_xuntext_xrele_swapclup_timelap_gmtime_timetoYMDHMS_YMDHMStotime_timeout_timeid_untimeout_timein_delay_trap_addupc_clk_stray_utssys_procfind_ufavail_uiomove_selwakeup_insque_remque_domaininit_domains_pffasttimo_pfslowtimo_pffindtype_pffindproto_pfctlinput_mbinit_m_clalloc_mclfree_mbstat_m_free_m_pgfree_m_expand_m_get_mbfree_m_more_m_getclr_m_freem_m_copy_m_cat_m_adj_m_pullup_nmbclusters_domains_unixsw_unixdomain_socreate_mbstat_sofree_sobind_solisten_sorflush_soclose_soabort_sodisconnect_soaccept_soconnect_soconnect2_sosend_mbfree_mclfree_soreceive_soshutdown_sosetopt_sogetopt_sohasoutofband_nmbclusters_soisconnecting_soisconnected_soqremque_soqinsque_sbwakeup_soisdisconnecting_soisdisconnected_sonewconn_socantsendmore_socantrcvmore_sbwait_soreserve_sbreserve_sbrelease_sbflush_sbappend_sbappendaddr_sbdrop_mbstat_mclfree_mbfree_nmbclusters_socket_bind_getsock_sockargs_listen_accept_connect_socketpair_sendto_sendit_socksend_sendmsg_recvfrom_recvit_sockrecv_recvmsg_shutdown_setsockopt_getsockopt_getsockname_getpeername_mbstat_nmbclusters_mbfree_mclfree_uipc_usrreq_unp_attach_unp_detach_unp_bind_unp_connect_unp_connect2_unp_disconnect_unp_usrclosed_unp_internalize_sun_noname_unp_drop_unp_sendspace_unp_recvspace_unp_externalize_unp_discard_unp_gc_unp_gcing_unp_defer_unp_mark_unp_scan_mbstat_nmbclusters_mbfree_mclfree_soo_rw_soo_ioctl_soo_stat_soo_close_socinitacct.o/ 548575610 0 0 100664 2454 ` u z.textY .data @.bss@~L N X \ ^ d l t v     : < P TVZ\dhjptv $(*06@DFLX`hrz.textY.data .bss_sysacctm_um_suserm_acctpm_plockm_iputm_ucharm_nameim_accessm_prelem_acct,m_acctbufm_bcopymm_lboltm_writeim_compressalloc.o/ 548575637 0 0 100664 4142 ` u x".text Q .datax 4@.bss `P@~Hzhpz zzz!p" ǡ z(z^z\Y& $$ ȓ. &gzz2zȓ2z  2zؓY~Hɞ@PPWHzF 0zz zz!`p (x 0~@HHW @(#)alloc.c 4.4 87/05/14 bad free countno spacebad blockout of inodesbad countno fs0    &T\bl 4 BR b        . d  >R^fhn          ^`hpz|!.textQ.datax.bss `_alloct_getfst_sleeptt_breadt_ut_bcopyt_brelset_wakeupt_prdevt_getblkt_clrbuft_delayt_freet_bwritet_ialloct_igett_timet_iupdatt_iputt_ifreet_vt_mountt_panict_update0t_writeit_inodet_bflusht_badblockbio.o/ 548575679 0 0 100664 7754 ` u ..textt .data`@.bss@~8z$$zFp p    q   W88T~8@@WH8~@zpz$$znf    q   W88 (zZz h 0   q0 0W88z~@ɞ8HHW@~8p((LJ zq   W<<    .: , ,YY Y~8@@W8 (( 4 0X88W8 ( 88W8 ȧ~4p@  a @  a  , . p  q*p q 7   8~488Wz@1~  p΀0zH  p'.( zz  "'~WH8z~@  p dz H ߁ @(#)bio.c 4.4 87/05/14 devtabbflush: bad free list Cache: number of buffers %d binit | ~   L N V X ` dfnxz     bdl         24<PR DZ\dfvx(48:DNT~"*   "&(.XZbj     * : > @ J `  d f  r    4 8 : x             " $ \ ^   $ $     %     & '   & *( 8 > B$ D$ T$ ) ) * *   + + $, : < J+ L+ Z \ v x        &(08FTV`z.text.data`.bss_breadv8_sysinfov8_getblklv8_bdevswv8_uv8_iowaitv8_breadav8_incorev8v8_brelsev8_bwriteTv8_bdwrite(v8_lboltv8_bawritev8_wakeupv8_spl6v8_splxv8_vv8_hbufv8_spl0v8_panicv8_syswaitv8_sleepv8_geteblkv8_iodone v8_clrbuf v8_bzerov8_bflush v8_binval v8_binit xv8_maxmemv8_debugv8v8_sbufv8v8_ksctv8_kbasev8_pbufv8#v8_bdflush v8._bfreelist_sptalloc_bufstart_pfreelistbitmasks.o/ 548575684 0 0 100664 744 ` u 4 .text .data@.bss @(#)bitmasks.c 4.3 87/05/14 ???? @ @ @ @.text.data.bss_setmask j_sbittabj_cbittab(jblklist.o/ 548575700 0 0 100664 1799 ` u .text .datap$@.bssXH~P\ !z     prq v\ \V(\p IJp8$$q4G( Tp$88Iz3(#4>  q( ~PɞHXXW`DHP~Xp ~Y jnj$   f"ǮVRt:8(+Bpp   (  ~XɞPɾHD``Wx<@~H \ Vt Ph tz     pJt   tPt^^Pty*\q! \~Hɞ@Ǿ<xxW @(#)blklist.c 4.4 87/05/14 ip->i_map == 0blklist.cindlvl >= 0blklist.cip->i_mapblklist.c$*4     2 R FZt.text.datap.bssn_assfailnn_bzeron_bldindr`n_breadn_un_brelsen|n%n_sptfreen/_bldblklst_sptalloc_freeblklst_pbremove clock.o/ 548575720 0 0 100664 3638 ` u $.textP .dataPP @.bssppH8~@p@  .    r2!Ć`zz&zX#zzz "ppdh7Vz4z42 z " zz44< gP( zzz2 * (p88a((a < <p$(e \ \`` d dhh. ~@ɞ8HHW @(#)clock.c 4.4 87/05/14 .8 : B D l n x | ~       (,.:<DT V ` hjn p x        $(*@BPTV^bdlprx~ dfvx !!! ""!  #"#.#2#4#: .textP.dataP .bssp_clockqXqX_ccbqX_calloutqX_timeinqX_prfstatqX_prfintrqX_uqXqXqX_syswaitqX_sysinfoqX%qX_lboltqX_lticksqX_timeqX_runrunqX_freememqX_minfoqX_swaptabqX_procqX_psignalqX_vqX0qX_tuneqX_vhandqX_wakeupqX:qX_bdflushqX_runinqXF_panicstr_addupc_clk_idle_addr_switching_vhandcnt_bdflushcntdebug.o/ 548575735 0 0 100664 747 ` u  .textT .data 4@.bss@~<p.` *` ~<@@W0 Г "lh00W @(#)debug.c 4.4 87/05/14 .H n |~  .text .data .bss_debugk@_dblevk@_printk@k@_setlevdk@_suserk@_uk@_call_rbug errlog.o/ 548575761 0 0 100664 3901 ` u  .text4b .data @.bss@``&! @@WH8~@' pzj ` 2 p0ps#$qp8~@ɞ8HHWH<~@pz  s!~@Ǟ<HHW@~8r$ dpp(~8@@W8 ȧ~4px   p p( a l~488W@~8pBp4p( <(ppgP^0Qa1&! 0Rb1`&# :Td1@&' 4Xh1 ~8@@W@~<p4 q~<@@W@~<pqp~<@@W@4~8p((PǗ( ,r   gG zq0@z z p z    @x  z  z (" $$ *7LJ B,B10'~8Ǟ4@@W@~8pLJ(p,0X *'G ,DŽD! 7~8@@W@~<p ,z ~<@@W@~8q q~8@@W @(#)errlog.c 4.4 87/05/14 *02:>@FJLR    &(68@H x   * .0<DFJLRT^`fn rt $&,028L \^RT.textb.data .bss_errinitp_errp_mfreephp_splhip_mallocp_splxpp_geterechp_sleepp_puterecp_timep_wakeuppp_utsnamep_logtchg$p"hp_blkactyp_fmtberrp,Dp_logberrp6@pA_geteslot_freeslot_logstart_logstray_fmtraerr_logmemory exec.o/ 548575797 0 0 100664 7044 ` u 5/.text L .data ,@.bss h<@H~PXXX P^`^dph \X YR\d>6< ^`Q^`p^dQ^d Y( Y YY r 6 dpXjYdr$\dpp Ϡ8dn` 2^dn`V* q*(^dQ^d`ΐ *(    q `q*(jX`\!RXD\!6~PɞHɾ@<hhWH<~@p @Ύ(g I  YHжx||Y YzLǀ$p u\  (>    z XzL`Pq @`zz q @q z \zR0 :z( YB (z Y#VYDp~@Ǟ<HHW`DHP~Xd}N z.z!0(|Ǎp zqhp0,!LzBp@ "@ *@J4L L0L LL L4q!(iz v .\  ְ֠{ p P ('2*p v00z 0)(΋h,)(<   0q<   q!# 2(0R>2 (pq!(0d L  Z  \dZdl z  Y~XɞPɾHD``WXDH~Pp֐ zְ( 2F0 '(ְzzq10(#H4Xضt䶐x|xZq q,! 4(0~PɞHǾDXXW @(#)exec.c 4.5 87/05/14 "*P R ^ r z     ( 8 < > | ~         *@D F     4d r |                 $ . 0 :> @ H X b j                      46:<j        $ : < J!R"\ ^ f#$        & 0 2 > H J T V &     '  ()       ** , 4#L+V X `#    !  #",    ! " ," 0 2  Z  t  x z  ~      '      *( :) D F  V+ ` b  j# t v  z |    !  #       " -      &" 0 2  N P  ^! h j  r# ".text .data  .bss _execev_sysinfov_getheadv_uvv_iputv_fuwordv_fubytevv_psignalv_suwordv_subytev_setregsv_sptfreev_ucharv_nameiv_accessv_bmapv_breadv_bcopyv_brelsev_vv_filev_chksizev_shmexecv_punlockv_reglockv_growregv_regrelevv#v_get410 v_xallocv-v7v_freeregv_mapregv_loadregvBv_readiv_execreg$vL_sptalloc_getxfile_detachreg_kpgtfree_allocreg_attachreg_findpregexit.o/ 548575815 0 0 100664 2603 ` u G.textlI .data L@.bssH8~@րd p,8q X zz0``$zz z| jd \xJ<ǘp  q ΐ $p<| zz4<  zzp  zz  <p$(B~@ɞ8HHW8d@ 0 hax^|  V^|X^|tnl(8,ndl$xx Xt O^  -zzz"  (0^ P^^xQhPzUQ^tPFQz2nxx  !! t ,1zǮt^r xx     b0    t},P^ P^^zUz^P^:xx   !! ^tQ^^Pz^^z  Ǹ^ z  ^` p\n[P^xx p ΠY^<  0 Ln,N ^ zt^zZLF<^T^R^z| > d^pPh^nV^Z^%$.n^V^P^^P^x.]n V^Pn%&e4  xx     b0  ti8 d^pP4 d^pP~`ɎXɮPHWP@~H 0pPz ) *     Vΐz RgzR z ( ! xx !  ~Hɞ@PPWPD~HqnLW3Qa1 xx     b0  : 1,g^L3Qa1~HǎDPPW @(#)fault.c 4.4 87/05/14 pfault before vfault @  tune.t_prep + 1 >= countfault.cpage read errorvfault - bad dbd_typepfd->pf_use == 0fault.cpfd->pf_flags & P_DONEfault.c >@      B D L r   "&(. 2 4 L N R T \ dfp ~     $268L r       ".z   NP\t !  $ fht 4 6 " # $ % &  ' (    *  d* n( +   .! D H J ^  j p  x | ~        & * , 8 D F N ,     ! @DHLPT.text.data.bss_pfaultv_uv_kbasev_curpriv_findregv_reglockv_panicv_minfov_pfdatvvv_pfreev_premovev_swfree1v_regrelev_vfault\vv# v_tunev0v_freememv_pfindv_assfailv_ptfillv_swaptabv_pinsertv_swapv_wakeupv_breadav_breadv<v_geteblkv_clrbufv_prdevv_brelsevH Dv_bcopyv_bzerov_sleepvR_ptmemall_copypage_clearpage_pageincache_memreserve_call_debug_killpagefio.o/ 548575879 0 0 100664 3954 ` u *.textTd .data8@.bss@p YWP?8@~Hpp *gz((zzz t z> 00NYp&øz +pj T ! `!F q ב: q  בtl0p:z('$z  p(ؓ x`\0 "zzH (z z  Wz z  W~Hɞ@ɾ8PPW@0!~<&Czp @A  A `AHq( ~̎ pz0 01WJq (4z7 0@WY~<@@W@~8pfz<Yz  z YVZ FZs\ s   Y~8@@W@~<Zp VZZ"z(YY ~<@@WZH HYWp &l$@YW@~8q z4 Y>pzq ~8@@W 2 2 0p(W @(#)fio.c 4.4 87/05/14 closef:DTYPEfileNFILE,`        $ `b~ FZh| *,DFdfz  "02DFl""# "*,6DXZnv  '((( TV` vx.textd.data8.bss_getft(_ut(_closef<t(t(_unp_gct(t(t(_panict(_plockt(_cdevswt(_bdevswt(_closept(_iputt(_vt(_filet(_setjmpt(_mountt(_bflusht(_binvalt(_prelet(_openit(_cdevcntt(_bdevcntt(_openpt(_accesst(_getfst(_xrelet(_ownert(_uchart(_nameit(_suser t(_ufallocTt(_falloct(_provflt(_syserrt(_finitTt(&_cleanlocks_soo_close_ffreelistflock.o/ 548575917 0 0 100664 6449 ` u .textxW .dataxx%@.bss000@ z36zz$ " W 00t    0 0W zr        W@~8pހRqp R ( q ~8@@W~pp gZ*' l%# D%! ?Qa1`&! 7Rb1@&# 3Td1 &' 1Xh1d z "  pypx~ɞW8  ~4q  6p&pp~488W@10 - %v  (2       Wp@HP~Xrz lǺd  z-lhpWVzz NJ &zz  vNJ zzNJ zz n\Z*' ^%# >%! ?Qa1\7Rb1D3Td1,&' 1Xh1 :`# 2   \#Z.BNJ zz  n\Z*' ^%# >%! ?Qa1\7Rb1D3Td1,&' 1Xh1 :`# 2   \#N .8(    NJ Pzz      Vzz NJ &   F   SlD(     (. ~XɎPɮH@ppW@1~ B|d  z( BH<0$dzzz zD@u#dp z"V"zwT4( zdzz  D@~WX@H~PqTj:÷z D  .TPgZ*' l%# D%! ?Qa1`&! 7Rb1@&# 3Td1 &' 1Xh1  <+$~PɎHɮ@XXW`@HP~X\pz z     p l d,z (  ^z  Ћ .\F\ (p p-d  p.B    x t ܋} ((pp  ~XɎPɮH@``W@1z8z z\ J!."   #W d0 z3z 0  ! W@~8p >'(ǂd  z0( ~8@@W @(#)flock.c 4.4 87/05/14 v|@||f h p r z ~      .P R ^ ` p        " NPX Z b f h p z   "<>pl     P R   <>  $(.textxW.datax%.bss0_findfid_fidsd_frfid_freefid"_flox_frlock_insflck<_u_delflck_wakeup_regflck<_flckadj_blocked X_getflck |_convoff_setflck ,6_sleepAM_allocfid_flckinfo_flckinit_flinotab_deadflck_sleeplcks_cleanlocks fork.o/ 548575957 0 0 100664 4342 ` u $.text0i .data000@.bss``P@@~HP`Qu0P`PP`$0^p< . ``z <p! X$ <(4@"   YP ր$( <Z$B^8 << Y~pd  8P`X  2 0z!4@zz@,<p 1dxx> D zl~Hɞ@PPW`?HP~Xql >LJ{z Z ((z p| !Z Y(8 z3 (2Z $ (( | !4 |  ~XɞPɾH``W?h@H~PpX q$ D <pP s  ? p s    sp `& s 0 0? sps  p <p s  !? !p"s0 0 sp16s@ @? sps0 6pxx  p q  x   p *x/x! !xx0 iX3Qa1qqp.Xq$ s  ? p s     sp   s 0 0? sps   pxx p xx p h +b s  ? ps 0 0 0sp0P5s @ @? sps0 5pxx p   $ d~PɞHɾ@W@4~8p`Y3Qa1tݓ~8Ǟ4@@W @(#)fork.c 4.4 87/05/14 no procs*6@BFHL N z    "$,.< > FHT`b  & *,2 <>L N ^`nP\n$8@X  &(Z \ pr4 RTbd""#.text0i.data00.bss`_newprocq_vq_uq_procq_syserrq_panicq_shmforkq_saveqqq_pfreeq_procdupq_pexitq_setrqq_runrunq|q_reglockq_dupregq_regreleq$q_sptfreeq/q_freeregq:q_ksctq_kbaseqDq_uaccessq_userpteq_flushqN_lastproc_ublk_ptbl_makechild_detachreg_attachreg_sptalloc_copypagegetpages.o/ 548575991 0 0 100664 6282 ` u *.text  .data  $@.bss x x@~<X  ēp|d V  <p$(p zz z z bDr" .Vw[H~@p  LJz zz bB> Jrpi~@HHWP<@~Hpz  gz@zz?@ppgz z6:0p GzzD@J@@@6"a  1$C@y~Hɞ@Ǿ<PPWDHP~Xz H ` = zz  ! z 4 pz@| ^|ezz?@tpV^pVpR^lR^P^`YVP^dZnpzzƋl  pp npzz@^`^x^d^h` & ';r B^hPDa6  ( ';, \  x$/((p"" 0W"xx         0 0?x?x9 s   0 #   l   6 ! '; @`xzB,, !n '; t    xȋj^xP   @00 ! '; @ 4s" '; t# '; |^dP&4^|Q^|^lT^l^p@P^p^|nteK ';6 ~XɞPɾHDWh@HP~Xqz  9&Q^\p Js`ǧd ` ؓǎ`Vdv P^\`V zL   < ph z "L,d!06^dTѧ^dn`mWs!   р-d.`0`  ,\~XɎPɮH@hhWX?@H~Pz 8 P p  zz xx  p  'z \ l zzN pp  ((9~PɞHɾ@XXW @(#)getpages.c 4.4 87/05/14 run vhand DANGER: vhand needs swap space p->p_flag & SLOCKgetpages.crp->r_flags & RG_LOCKgetpages.cDDrp->r_flags & RG_LOCKgetpages.cgetpagesgetpages - pbremoverp->r_flags & RG_LOCKgetpages.c WARNING: swap space running out, needed %d pages DANGER: out of swap space. Proc %d cmd %s Killed (out of swap) rp->r_flags & RG_LOCKgetpages.cpfd->pf_use > 0getpages.c " & ( .06 >P X^ bdnt|~    TVZ\dfnpv8:>@HJRTZdfltRX( 4:!lnv & "   " ( D" P V x# | ~ $ $ % & &   ' '      (    *) ,) 4) 6) @) X Z b f h p 0 4 8 < @ D.text .data .bss x_vhandy_tuneyy_maxmemy_vy_maxy_sleepy_debugyy_printfy_procyy_freememy_ractivey_reglocky%y0y_regreley_assfaily:y_pfdaty_swpincy_memfree Xy_swaptaby_minfoy_swfree1yEy_panicy_swallocy_psignalyOy_uaccessy_uservady_swapy_pinserty_pheadyZ_getpgslim_swapwant_ageprocess_ageregion_getpages_swapchunk_pbremove_ublk_ptblgrow.o/ 548576008 0 0 100664 1438 ` u P.text( .data((@@.bsshhPD~Hdph `(&8zzq<qZz H` 7X()0@2 &~HǞDPPWH<~@p" q~@Ǟ<HHWPD~Hd pzzp( \jz )"q,  .<(0~HǞDPPW @(#)grow.c 4.4 87/05/14 rp->r_pgsz+change >= 0grow.c"8 <>FH     fhp      .text(.data(@.bssh_sbreakl_ull_reglockl_regrelel_assfaill_growregl_uclearl_subytel_growTl_findpregiget.o/ 548576047 0 0 100664 7138 ` u /3.text4 .data@.bssPP  0P3!38 : PQ !`WH<~@zސ ll  p!q( zzw'p4 YH   pr\' fXgz z  zZ 6( Áqzp ((z   zz ~@Ǟ<HHW@~8pz qqzY8$z ?  p0'$<@ :!!1!1!1A ( `6$`q  $~8@@W@~<pzz z2zB zz\ nz F !pD pP  p z~<@@WX8@H~Pz6zB Yz9 z qqzD .hY$^Tz ?  ^TpP^Te^T^T^T ^T^Tu $ `$ $ ЋH 0Pqqqѡ ( &qqqѡ ( ݋VЋH Dqqqѡ (  `6$`q  $z ^T4z ^T8z @ ^T<z   z9 ~PɎHɮ@8XXWP@~Hy pp@péz|ωTdz " & 0z &0z  0n z !0^z !1Nqp \   zB  ~Hɞ@PPWhDHP~Xzp  ϠpR^P^`|p,zPp:nǷ$  P^dP8^`P$dpz-0Tdzp z~XɞPɾHDhhW@ ~<  Jz z!fpn~<@@W8xXPt88Wz@0 Rzz<z*"" 1` W`~8`z zq   !W`z zq   !Wp$`X`zq z d|xptX@~YXh z ~ |$z `z z   `ԣ~8Wh~@pzF !z HJLNPR&zT `8$q Tz T Xz qqz0 $z ?  p 4\8`<d>H . Y~@hhW @(#)iget.c 4.5 87/05/14 inodeNINODEno imtiaddress > 2^24 iaddress > 2^24 iinit - cannot read root superblociinit - not a valid root file system  < > PRZ\fjl| ~    & *,4>  DJvJn06 ,!" $    " , 6" ~    %            ' $ & H J   * *   + +   , (* ** B D b l r z -       * *         * + + * * &+ @. B. L/ Z0  n2.text.data.bss_inoinity y _hinodey _inodey _vy _igety _sysinfoy _provfly _syserry _uy y _iready _sleepy _mounty _panicy _bready _brelsey _iputy _bdevswy _itruncdy _ifreey _timey _iupdat$y _preley _getfsy _printfy _bwritey _bdwritey _freey _tloop Xy _maknode \y _iallocy _wdir y _writeiy _iflush Dy _iinit y _rootdevy _pipedevy _geteblky _readiy y 'y _clksety _stat1 ty _copyouty 2_ifreelist_freeblklst_ftHeadwall_HWGetDateintr.o/ 548576055 0 0 100664 661 ` u 7 .textp< .datapp@@.bss8 c1 1@0 @W88W @(#)intr.c 4.4 87/05/14 spurious interrupt : IOIR = %x &(02:<HJZb .textp .datap@.bssjj_confswj_printfj_ext_intr_conf_devs ipc.o/ 548576072 0 0 100664 1087 ` u G| .text .data@.bss000 !Z |ZF> q \ q     YW~sF@0" 8 1pY0@ b V  Y    Y< @B8 1p Yd@YN$<    Z\~ǞW @(#)ipc.c 4.4 87/05/14 $&LN0V.text.data.bss0l_ul_ipcgetl_ipcaccess lock.o/ 548576089 0 0 100664 1996 ` u Y`.text2 .data8$@.bss@@0 Гhp(WPz z~Pz,H`HPz " Y00W8d * z Pz P88W8d * z Pz P88W8dT V z d* , z Pz P88W8dЎ * z Pz P88Wd" Pz PW0 Pz 8d Pz PZ000W @(#)lock.c 4.3 87/05/14 `< "6<>`b  ,LNV vx  (*2 RT`xz(,048.text2.data8.bss@_lockm_suserm_ummmxm_punlockm"m_tunlockDm_dunlock m,_textlock_datalock_proclock_findpregmachdep.o/ 548576114 0 0 100664 3017 ` u q .text`DQ .data``X@.bss@WWX<@H~Pրx8p+! s  p s   p p8tp@tbtVtJ ppx8(@~PɞHɾ@<XXW@1A1 !WH<~@pސ@t@H H.T~@Ǟ<HHW@~<  p p' s"~<@@W0 YWH<~@pdh z 8z    z$$ P$`Lgs($ s( $|PtxX^` X`0zptpx$`0zptpx~@Ǟ<HHW888W @(#)machdep.c 4.7 87/05/14 NO PAGE TABLE SUPPORT ON THIS MACHINE looping... L N f      < > B D J L P R t       2XZf         $ & * , 0 2 N d lt x z              L.text`Q.data`X.bssn_ccbn_clksetn_timen_sendsig,n_un_grown_suwordn_bcmpn_setregs,n_closefn_bcopyn_clrmemnn_printfn_bzeron_edatan_chksizePn_maxumemn|n&n_itruncn_writein0<n>nM_clkstart_ftPageTables_coredump_findpreg_HeadwallDiag__HeadwallDiag main.o/ 548576137 0 0 100664 4195 ` u 3.textpd .datapph@.bssH~Dp Ps  ? s\p     sp `&0 0? sps  p &Ps  ? s\p     sp `&0 0? sps  &p J Lp WtHB<z,z! zz! ,Ԇp( 3#.(!0~vlp( 2R 2"q,3q<CN(*"  d@hL8Bچ$ d  &%~8@R~$ d  ('8@2&%~DHHW @(#)main.c 4.4 87/05/14 etc/init growregvhandvhandbdflushbdflushschedsched" & ( , . 4 8 : BR^f PTV\dhjt~   !&".#<$JLZ%bdr&~'($%))&())**+(#02:,<,@BJ,bfhp-vz|-....#,,,--/ /&*/,/6:<D-JNPX-\0^0.textp.dataph.bss_mainoo_physmemo_meminito_ksv_szo_pallooo$o_kbaseo2o_uservado_kscto_userpteo_mmvado_mmpteo_proco_curproco_uo<o_msginito_seminito_startupo_rootdevo_igeto_rootdiro_timeo_meloado_devinito_newprocoFoPo_growrego_panico_regreleo_szicodeo_icodeo_copyouto_maxmemo_bcopyo_vhando_bdflusho_schedo_maxumemo_maxuptso[_firstfree_allocator_pgtalloc_pgtallocator_sptalloc_init_tbl_allocreg_attachreg malloc.o/ 548576150 0 0 100664 1108 ` u x .text< .datad@.bss@1~$``(Np,2(8(~WH0~@q#(( (j`Z@($`ZpR&(~>r(p@~@HHW @(#)malloc.c 4.4 87/05/14 DANGER: mfree map overflow %x lost %d items at %d  @ @ @ @ltz .text.data.bss_mallocl_mfreel_printfl_wakeupl_masktab0lmove.o/ 548576172 0 0 100664 2410 ` u .textD .data |@.bss@0~<qp XBt'ċt'YZ,t't'rtt||xx~<@@WX?@H~P  |pxxq!0 sp`2@? 4s6p2s0 p0? #p" x/x! !p,)0 # '|g~PɞHɾ@XXWX?@H~P  |pxxq!0 sp`2@? 4s6p2s0 p0? #p" x/x! !p,)0 #  'g~PɞHɾ@XXW W8 . Y88W8t YDxx||ttx 88W8x TthY2xx||tt88W @(#)move.c 4.4 87/05/14 $&24>HJT `pr|  ( *    f (*268@DFNRT.textD.data .bss_iomovem_um_copyinm_copyoutm_bcopym_pcopyinm_kbasemm_scharm_ucharm_fubytem_passcm_subytem_cpassxm_pcopyoutmsg.o/ 548576211 0 0 100664 7549 ` u l&.text l .data H$<@.bss H8~@Y ΐ 0߀0p   $XY~@ɞ8HHWx<~@րhp 0ߐl  XZ x'      2   Z H 0ԆYd HJ P   d,JZ 4 0>YY  ~@Ǟ<xxW@0~<r c   Wz(az%' z"!`@p~<@@WPh 0 0(^L ^, pLB  ($,  0 0lPPW@~<q p 2 !0P%E P B,L1~<@@WX?@H~Pրhp~ 0ߠ < FY.p   $Y)8$Y0ߠ  ) 0 rZ @T@H@ ,r.` pr2" pz(  Y( z$Y JtX z!Y l  d  ( 'hf #YF      Y  ~PɞHɾ@XXWX?<@H~P֠h p0߀d p YL T$&Y*TY  $Y'8$Y0߀(   Y| J>hY 0 @',0߀ ڋ   YRY ~ ',0߀B`NL֐     Y RY  ',0߀FdRP f tX  Y( ,؋ d $ T      g & "l* ~PɎHɮ@<XXW0 h(Yhp W00W @(#)msg.c 4.4 87/05/14 Can't allocate message buffer. l@$02D F J L Z \ j      "LNd  .:R r    DFhjvx~    (8:FHP        ( * 0> @ N  08@BJLX!\^n"   XZ^ ` h        . @ B  H V X  f         (  4 6 R f  j l v             $  $ & . 2 4 < > F H N  T b  f h r  ~          !     " $ * P R ^ ` "            P R h p r x     .text .data H.bss _msgconvw(_uw(_msginfow(_msgquew(_msglockw(_sleepw(_wakeupw(_msgctlw(_suserw(_msgfreew(_copyinw(_timew(w(_copyoutw(_msgmapw(_mfreew(_msgfpw(_msggetw(_ipcgetw(_msginitw(w(_msgw(_printfw(_msghw(_maxmemw(_msgrcvlw(_sysinfow(_iomovew(_curpriw(_msgsnd@w(_mallocw(_msgsys Hw(_ipcaccess_sptalloc nami.o/ 548576232 0 0 100664 3047 ` u H.textDk .data $@.bss`<@Hѩ~PppWY:/D րp/ WY րz`Y  p( qW/Y׋q(p/ WB>Y4pq  Y(VZVP^X @zY@RY | xP^\,. xz  ؎^Z,\ P|xYY  bttJYYz Y v$p  4r B^\PP|R^\||xx||  `*^XP"HØzrj.\ pD4zz(LJzʋ@p(z  8~PɞHɾ@<``W @(#)nami.c 4.3 87/05/14 $&.>PR\ ^  46>@^bd  * > N^hr vx   "8<>TV`bfhptv~   8RVX` x.textk.data .bss_nameiph_sysinfoph_uph_rootdirph_igetph_accessph_brelseph_bmapph_breadphph_vph_mountph_iputph_plockph_searchdir page.o/ 548576274 0 0 100664 7955 ` u L8.textX .dataXX@.bssPPXH~Ppzx TH .'zzz" (: ~PɞHXXWH~@ހx x m nz o    ~@HHWhHPX~` VV  P^d|nd qpW {? p@  (9(8~`ɎXɮPHhhW`DHP~XVЋ ? qp ps 8Ws  x   ?  @! s   p*0? #p"p !6(l2  8&0( 7t! ~XɞPɾHD``WP<@~HǎxpΠ  *   x/x! .W   xx   t y~Hɞ@Ǿ<PPWX<@H~PÆ(z8 6ސ^Ћ$a  xx pz@P (zzdx"  y  p  yp   z (x8 L    ~PɞHɾ@<XXWH<~@q`x.xAzD 0xljXd t\l VHÈ zDz7 01 0  Rsp 8zz,  " ~@Ǟ<HHWX?@H~P `x,xӑz vxp Փ$\ ֓×zzNj    Bs ,zz  vp  `xx   x    ~PɞHɾ@XXW @s  0A1  WP@~Hpp \D*ȓ0*9")0p ~Hɞ@PPWH~@s p p 14 1 '~@HHW@1@@  <8  1! 1 8  1! <W@4~8Ðրzp,zz p~8Ǟ4@@W8 ȧ~4pzd~488W@4~8 zp zz w` (p2 zz p~8Ǟ4@@WP@~H`x.xqzw 0xǚ *x \  +ZyÙ zwz8 01 0 @nsހ XzzL <  B ~Hɞ@PPWH<~@q(z(H m:pf ֐d0 p ~@Ǟ<HHW @(#)page.c 4.5 87/05/14 rp->r_flags & RG_LOCKpage.cpfd != phpage.cpfd->pf_flags&P_QUEUEpage.cpfd->pf_use == 0page.c(pt->pgi.pg_pte & (PG_V | PG_REF)) == 0page.c!rp || rp->r_flags & RG_LOCKpage.cpfd->pf_use > 0page.cip != NULLpage.cip->i_map != NULLpage.cip != NULLpage.cip->i_map != NULLpage.cpinsert dupno kernel virtual space size %d %d %d ip != NULLpage.cip->i_map != NULLpage.c!rp || rp->r_flags & RG_LOCKpage.c06@^ ` h  &^` (*  ",   XZ~68FH   . 0  !  "  " l$ p r  |% ' (  ) * +               @ B F H  T V  ^ `  h j  t    ' '   ( ( B. ~. 0 0 1 1 ' '   ( ( T V z            23344 4445"6& ( 4 @7.textX.dataX.bssP| _assfail| | _freemem| _ptfill| _pall| _phead| _premove | _pfdat| _sptfill| _ksct| | _kbase| _min| _stfilll| _pfree| (| _swfree1| 3 $| _pfind(| _swaptab| =| _phash| _pinsertt| _panic| H | _sptmap| _malloc| _printf| _sptfree (| _flush| _mfree| _meminit | R| _maxfree| _maxmem| _maxumem| _maxupts| _ipflush | _pmount ,| _bflush| ] d| _inode| _v| _regrele| _u| _runout| _wakeup| _swtch| _reglock| g_ptmemall_memreserve_pgtallocator_allocator_pbremove_phashmask_sptalloc_firstfree_punmount pgtalloc.o/ 548576310 0 0 100664 6552 ` u 6P$.text  .data  @.bssH~@pq  ?pDWpq '  ?lp x~@HHW8 0#88WP@~H  , Z*Ib(yq t71(|0,2"#( J.2(8  (W~Hɞ@PPWX<@H~P 4 p  pאր (pz"z ` ` `zz z&    p p  D tq piLj O s  8 P ٓpppR`  a  \ q p p  q   "p`       ~PɞHɾ@<XXWX?@H~P q p q p q  '4 (q p  q( q p  qzld    ; ( < <   pp zp`  H t L`p` zz @zX   X  Y    p~PɞHɾ@XXW@~8pp :d ~8@@WH D   xx  DD 1HHWP@~H hǁ  0VBp*p( ! ߎ (( (    “`     j  x q( ~Hɞ@PPW @(#)pgtalloc.c 4.4 87/05/14 size >= 0pgtalloc.c(pt & POFFMASK) == 0pgtalloc.c(pf->pf_flags & (P_QUEUE | P_HASH)) == 0pgtalloc.c(pf->pf_flags & (P_QUEUE | P_HASH)) == 0pgtalloc.c(pf->pf_flags & (P_QUEUE | P_HASH)) == 0pgtalloc.cpf->pf_next == NULLpgtalloc.cpf->pf_prev == NULLpgtalloc.c(pf->pf_use & (setmask[nfree] << ndx)) == 0pgtalloc.cpf->pf_next != NULLpgtalloc.cpf->pf_prev != NULLpgtalloc.cpfd1 <= toppgtalloc.cpfd1 - pfd == npgspgtalloc.c~"@ D F T` fz |    f  "   $(*6@ B Z\pv   (2   "(2@FPTV^`hjt:<HNPZdfn  Pz | !!""&,6LR\#   .text .data .bssu_pgtmap uu u,u_mfreeu_kbaseu_bzerou7u_pgtfree\u_assfailuAu_setmasku_ptfreeu_pfdatu_nptfreeuKuVu_minubulhu_uu_runoutu_wakeupu_swtchu_pfreeu_freememu_pheadu_physmemu_premoveux_startup_pgtalloc_ptmalloc_memreserve_allocator_kpgtfree_pgtalloc_getcpages_nptalloced_freepage_contmemallphysio.o/ 548576338 0 0 100664 4571 ` u R.textl .dataH$@.bssX8@H~Ppdz§T`xӁz (@ pp T 8    q ߰^ p (W@@(44 @ P r DFPZ\z   @BNRTZbd  $ & 6 H L N Tpv ,>@T`bfhxz.text.dataH.bss_swapq_uq_syswaitq_splhiq_swaptabqq_sleepq_spl0q_bdevswq_sysinfoq_spl6q_panicq_wakeupq_splxq_physiohq_useraccq_printfq_kbaseq_minq_runinq_physckq_pfreelist pipe.o/ 548576357 0 0 100664 1839 ` u e.textL .data ,@.bssH<~@z p r֐l4 pt0lplRT~@Ǟ<HHWH<~@p$RzzRRFRzYTzzTT:^$  DTlTz"RDRz~@Ǟ<HHWH<~@p<RzRRz&gVzz VT<TzTTz&gVzz VRRzXTzNχHzP NPzB ~@Ǟ<HHW@~8p΀zz gzz ~8@@W8 z bz z p88W @(#)pipe.c 4.4 87/05/14 (> L T V ` n p ~      : `8z$.text.data .bss_pipen@_pipedevn@_iallocn@_fallocn@_iputn@_un@n@_preleXn@_openpn@_wakeupn@_sleepn@_closepn@_freen@_plockn@_ffreelist prf.o/ 548576380 0 0 100664 3009 ` u | <.textp. .datapp@.bss8ȧT.XT88WP@~H2p^zx%x 9  x0rdpupop xp6op xp   *Zsp$ǩ zp2cpvDp *(~Hɞ@PPW`8@H~P  ˋ ʋ -p.T=^0MV@B 0    @ q!Ŋ|q΀0 Z T0qp~PɎHɮ@8``WXL~Ppza Q <0 @ !J(J,:09zr~PǞLXXW@~8pB:p &*p p ē ޓ؋H@z!~Dq 0"zr q#7 z   W~DHHWPD@~HqzW()8 ~HǞDPPWH~DpA2$D~DHHW@0!X@@W @(#)prf.c 4.5 87/05/14 0123456789ABCDEF%d%d:%d%d:%d%d Double panic: %s panic: %s %s on dev %d,%d device error bn = %d er = %x,%x assertion failed: %s, file: %s, line: %d assertion errorWARNING: system table overflow: %s (%s) d f n p x            V r$*XZl,Z.textp..datap.bss_printfr_print4r_printcr_timer_pr_timer_printnr_pr_hourr_timelapr_pr_dstr_putcharr_smwriter_panicr_splhir_splxrr_updater_smdsyncrr_idler_prdev<r_bdevcntr_bdevswr_prcomr_assfailr_provflLr_panicstr_call_rbug probe.o/ 548576402 0 0 100664 1172 ` u  .text4 .data @.bssh8@H~P.d ( 0d)s, s    ( d`.` P^P^XP^P^T  q p sp  ? sps  t s pX^T ? p r^\` *^\P<0   q@d Ǯ` p  q p sp` ? sps p ? p r8 a q@DŽ_~PɎHɮ@8hhW @(#)probe.c 4.4 87/05/14 <>  j t , .text .data .bss_useraccl_ul_kbasel_fubytel_subytelptrace.o/ 548576432 0 0 100664 4385 ` u  .text(D .data(( @.bss@~8dp z  z  z$ $րdhzbpz&J zz82& Ɔ8<p$(d( ~8@@WH<~@րhd  d pz"4$ zzz &<p$(Yΐ ΐz  ‹` lp` Yn~@Ǟ<HHW@~8d z |pRNpHW 0 pp  sp dHz: zz   H *pp(tb*. psp1p pp q$݋ ``@d( ,  Xd Dd( ~8@@W@~<pd~ q1@@Bp#0@#4p"#pxx     x  ~<@@W @(#)ptrace.c 4.4 87/05/14 8lP  8DNft~     ",XZfh      *@HJRVXbdjr  &.8:PR\^dlnv&46:<FPR^`htv   "0:BFHN z|HLPTX\`dh.text(.data( .bss_stopr_urr_procr_wakeupr_swtchr_procxmtr_vr_fsigr_exitr_ptraceHr_ipcr_sleepr_setrunr_fuiwordr_fuwordr_chgprotr_suiwordrlr_suwordr_ipcregpr_psignalr_findregr_pfdatr_premover_swfree1r_findpreg_dirtypage rdwri.o/ 548576464 0 0 100664 4382 ` u .text ,u .data @.bss`@HP~Xpx|Yvç *@ *v@  ,(` D  4&zz qpp~ q$z   4z ? z !s&q0XpFpW z  q WHTTz 4zVz VPRB: N|ZZRP^\Y FҐҀ .z" Г, z Ћz  0-$!j^\P  | |   >       z YxV |NPPNgVz"z VT\Y~XɎPɮH@``Wh@HP~Xp|Y\÷ +@ *$  (`  &zzB qpp q&z @ 6z ? z !s&q0XpFp W z  q  W(P^\Rz `x(, $Vn\xP^\\zVz V@T2* x(aRz"d YNP|R`R[RP@^d[RP^` Y ҐҀz  z XTD@   z z ,$ Y ܋Nz   ,     ^dP ^`P0| \ `| *&  | |zB Yx[V|gVzP"z VRY^\PPxY~XɎPɮH@hhW @(#)rdwri.c 4.4 87/05/14 "$02@ .0H J jl   (*BJTVdt&8:BD`b   68`b    "Z`bprvx|~&02Hft.8<>Pb.textu.data .bss_readit_ut_cdevswtt_lineswt_prelet_sleept_plockt_bmapt_geteblkt_clrbuft_breadat_breadt_iomovet_brelset_curprit_wakeupt_writeit_psignalt_getblkt_bwritet_bawritet_bdwritett_HeadwallDiag_freeblklstregion.o/ 548576564 0 0 100664 13620 ` u 40`6.text"&| .data""(#T@.bss%%  .    "$0$(W@~8pzz Hgzz ~8@@W8 z bzz 88W80A &"" Yf   B20zA(  88W`DHP~Xpz"#  z Fzz zzgÇzzz@?##( ГH pppƋ ǀ#4#< Փ :@00gz z 0z p('@'zz   bgP\0Qa1h&! 0Rb1H&# 8Td1(&' 3Xh1 p p~XɞPɾHD``WXDH~Pz#H#`  f  YZdRpY8 z ' z"^#gP^;Qa1h&! 5Rb1H&# 2Td1(&' 0Xh1Yb7 z3^3 d#l# E z d)zz"~PɞHǾDXXWP<@~Hzdǘ## ]z## ^t  ## aD`q 0 sp@ ? sp a y1 1zzwpT0ް x   $1@pp0D p d)zz" z z"z   6  *dpϘ hY)' l%# D%! ;Qa1t&! 5Rb1T&# 2Td14&' 0Xh1 qMhP\;Qa1h&! 5Rb1H&# 2Td1(&' 0Xh1~Hɞ@Ǿ<PPWp@HP~Xqz#$  zt  *zЎ    z:     Y        P^l^d^`X``p&lp   Y4nlz@ w Úndzz@Zndzzzppzp @$$8 ϷVa   hW3Qa1`sVxx hPz$D$X ?n^hzn\[3Qa1\xd\0$d$x K\$*   Yrh^\3Qa1t^lQ^l^`T^`^d@P^d nlzz?@ ~XɎPɮH@ppWPDHP~XҧçǾǻ$$ }z$$ ~& z$$  z%%  t^U zU^S^t {zzwpP]W^~[zU^[zU]^P@pp p pP^ZpR^ZpV^rǀ|@pp^nV nv( 7^@P^^T^^Q^^?@.t >t-^^ Y$.t ʆ^ Yt~]W^[zU^[zU]^^E@pPpR ^^npP ^TpP^ZpR^|ZpV^xVVS^pVVP^l^t^P^h|ǀ~@pp^nxVnvnp @p% %< 0^hP>  )6 %H P^. xx ^Q$^^^pPJP^4xx  ^T^^Q^^y ppj^l`P  !`   0(`*8 xx $qpً(x^ldP  !d   d0p(( xx $1p '6b%dP P^. xx ^Q$^^u^pP:P^&xx  ^Q^^up^x@P^x^|T^|^Q^^Q^^P^^?@>t- zz ^dz-z^ z^$ $~XɞPɾHDWH48A~@Ǡd!zz" 0@ @ jPq pr spx spa ? @qppz@ Tj? q p spx sp ? sppap p$   ( ߋLs ^ 2q@ p~@ɞ8Ǿ4HHWH48~@ǰdqzzwp B kq   sp' sp> kq   sp' sp$:( `q  sp ? sp0a! !H&s  2!4@pp0 p~@ɞ8Ǿ4HHWP48@A~Hrǔ d ézzp4pj`q 0 sp ? sp  ?@p a1 1b`q 07 sp ? sp ?@0a1 10T0@ x   1@p$p 0p~z dq 0 spI ? sp a1 1 zz?@p|` cΰ ? pc  spPc ? sps pxxΰ Dz`q x    1D$ ( A 0( ~Hɞ@ɾ84PPWh@HP~XЧ`.dǭd úzz úz`?@? @dN?p{? @*p(ً ?@? @QP^\zpϋ?&rt  @*p( ϋ?.t @*p(\pzz.\`  ?@?@z~J ?@? :? @!p"v*z^?@?@ ^`P d zz ?@?@p zpX N 00? @!p"*z㲧zd8j ?@pp ?@pj ?@? @! ?@pp ?@pt (n`pzz` :$(( ~XɎPɮH@hhWXDH@~Pt!q,(0  q  q zzXtx| fz gz@ z x @  ` ~PɞHǾDXXWxHPXǞ~`p   z \ ^ǧ z  -q,(0R q-)"q,!(0 j q z&  q zz   q q   @?d p]P ^tpRP^p[pV^l[pR^h nl ~tpp @%% L߲Ǟp@y @%% Q߂h p0 N z  @   P q4$^hT^h^l@P^l^pQ^p^tQ^tndk   z  Zz@ z   ތ~`ɎXɮPHxxW8 A0 *b(( (2,( %ؓ88W0# z 6,& ( W@ z z 2 z3^3 @@W @(#)region.c 4.5 87/05/14 regionsREGIONSrp->r_flags & RG_LOCKregion.ci <= limregion.cpt != 0region.crp->r_flags & RG_LOCKregion.cup->u_procp->p_flag&SLOADregion.crp != NULLregion.crp->r_flags & RG_LOCKregion.crp->r_list[0] != 0region.crp->r_flags & RG_LOCKregion.csize > 0 && size <= NPGPTregion.cpfd->pf_use != 0region.cswpuse(&map) != 0region.cdupregrp != NULLregion.crp->r_flags & RG_LOCKregion.cchange >= 0 || (-change <= rp->r_pgsz)region.crp->r_refcnt == 1region.csize > 0 && size <= NPGPTregion.cgrowreg - ptmemall failedgrowreg p1 - ptmemall failedj >= 0 && j < NPGPTregion.clim >= j && lim <= NPGPTregion.cfindreg - no match  "(,.2 4 :DFNPXZdl n x z   DFLNX^dl&(<b"$,.8 "Z`j~hj p v  !  @! `    j" l"    #     $ "      " 8 > H X ^ h>() *~+R()*+@B!!dffh,:<--bd,`!. !>.P,!H$0bfh13\^ @ F P p v !v!"*"B"D"".text".data"(.bss%_reginit_rfree_ractive_region_v_reglock_sleep_regrele_wakeup8_provfl_u_freereg_assfail_iput_pfree_pgtfree$`%"/ : GQ4_kbase_pregpp_dupreg D\_pfdat_swpuse_swpinc_growreg fq_min|_panic_flush_ksct_bcopy_loadreg_readi_uclear_mapreg_findreg!_chgprot"p_allocreg_nullregion_attachreg_findpreg_chkattach_nullpregion_loadstbl_detachreg_pgtalloc_rptexpand_chkgrowth_ptmemall_clearpage_bldblklstsched.o/ 548576589 0 0 100664 1993 ` u M.text ' .data  P@.bssppP<@~H $ΐp0<p(&xl2F "pr dR '! +*& *<p$(y jf  (   0  z ,WH<~@) z"@Pd ējljbz NFz z)$p~@Ǟ<HHW @(#)sched.c 4.5 87/05/14 swapout(%d) p->p_flag & SLOCKsched.c"$, . r t |      pr~  pv.text '.data P.bssp_schedo_spl6o_vo_proco_runouto_sleepo_spl0o_freememo_tuneo_setrqo o_swapoutTo_runino_debugo_assfailo_reglockoo_regreleo_lockedreg_getpages sem.o/ 548576636 0 0 100664 9025 ` u | 0&.textpL .datappP @.bss?詾zz~z r$zz"YJd<pא P֐ 4  d<pYy9 @z3D zz x" zzA!z@ zYZ z zzzp hX7Qa1(㧧zz g$z z "Yz z z zp gW7Qa1x( zJ  ,    ~ɞɾW0`p   YWP<@~H֠h  Dl($pWZ  ) Éy@T>x)0s1#    FZ"  Y       J   .Y r (YVpl: †& (Y pzl r (Ypl & t|XÉy"!Y Lx݋: †& (Y pl v (Y  ("Y p  q d  * (  t|X zY  (z"Y( ! Dyf"d x(Y~Hɞ@Ǿ<PPWH8~@d<pא J z Ézp p1z3pzpp Lp zzO   ,    d<p~@ɞ8HHWXL~Pրh0 .(^T ^,p TYVYnp&(Y$  sl~PǎLXXW@! ,0! @@WX?@H~P֠h   (Y t|X Y pJz  bhYNv ( ^ Ύ$Y t|X Y prWpgzz *z L%zt8Y"Y *;B gzz(~z 8'z" *;.x& *;z  YH"8(Y *;Hz  Y8(dYf,v ( p$vpd  ( l~PɞHɾ@XXW0 h(YhpW00WP@~HppZz Jp'z 'zv~Hɞ@PPW ~ pϗ    z p z  b:pWQpe^P7Qa1gzzz az:p" | wp ~Ɏɮ W @(#)sem.c 4.4 87/05/14 N,88L $ ,.HTVZ \ l n x z    &(8N P Z P R ` h j 4HNPf,.DTV`ltv~0@`~@`|$(*Tfnt~<@Bj     6 8 ^            4 6 B D T V `                " 0 X Z d h j n p x |! ~!          ! !    $ & 4 B J P Z \ d h j z |         ( , . @ B p r      LN$ 24Xt$ 8:PXZ`lN P  * , .textp.datapP .bss_semaoe}X_seminfo}X_u}X_proc}X}X_semfup}X_semunp}X_semconv}X_sema}X_semctl}X_suser}X_semunrm$}X_wakeup}X_sem}X_semmap}X_mfree}X_semtmp}X_copyin}X_time}X}X_copyout}X_iomove}X_semexit}X_semget $}X_ipcget}X_malloc}X_seminit P}X_semu}X_semop }X_semundo}X_sleep}X_semsys0}X_sem_undo_ipcaccess shm.o/ 548576664 0 0 100664 4872 ` u ".texth D .datahhP @.bssXDH~Pph †  n   jTdT&d>* ΰzp    ' (4 j X!q,(0"n f   &p (?    ' (4 Ћ  `!q,(0* ~YH    VYl d ~PɞHǾDXXW0`,   YWp<~@րhp pWZ\ LJ  '  ,   zz ҋJZ $D ,YDFL   (>  , Y~nz ЋH6z Y~@ǎ<ppW@~8hdp z |Y  ",,(,($d ~8@@WWWWXL~Pրh0 ,.(^T ^,p  T`((Y  Y '$ (d z N$(Y(   ,l~PǎLXXW0 h(YhpW00W @(#)shm.c 4.4 87/05/14 shmat: prp8<L@ b      <>Fpr "2XZhrt|   4\^   08:Pnz  2>T jz  ( * 46@ B LN\^fh      *> L  $&<DFLX.texth.datahP .bsssh_ush_shmconvshsh_reglockshsh_panicsh_shminfosh$sh_growregsh/sh_maxumemsh_regrelesh_timesh_shmemsh_shmctlLsh_susersh_freeregsh_copyinsh_copyoutsh_shmdtsh_shmexecsh_shmexitsh_shmforksh_shmgetsh_ipcgetsh:sh_shmsysshD_shmattach_ipcaccess_findpreg_attachreg_detachreg_allocregsig.o/ 548576687 0 0 100664 2756 ` u .text2 .datal@.bssH<~@4p< z2w<$(~@Ǟ<HHW8  0(1`1 (( N88WH<~@րd(hpFp<, zz<p$(ыp  vT t  T0p,   $`( ((!~@Ǟ<HHWH<~@րd  (p `( (p , D vYtup,)vD2.pWt p> 2~@Ǟ<HHW0A! c0! W@~8Z^ Yp.Y jpp RV( 2  YYV~8@@W @(#)sig.c 4.5 87/05/14 core$&H J      2< > L N h j     H J h  2 4 8 : L RX \^pz |     $(,048<@DHLPTX\`dhlptx|.text2.data.bss_signalp8_procp8_psignalpp8_vp8_setrunp8_issigp8_up8_fsigp8p8_psigp8_stopp8_sendsigp8_core$p8_exitp8_scharp8_nameip8_maknode2 $ # " !                           p"s 0 0 sp0`6s @ @? sps0 pxx  p s ? ps   sp &s 0 4 sps  &pphP3Qa1qq~ǞW@~<  q  p pq  @ 0$!s X h l n      b d     ^dflpr~"( * 24z!|!""  <>rt##  ## %%  &(>%@%PRZ \ &'(********+  "(+,,.,8>+V.X.`/b/r/xz/.text.datax.bsspp$p_maxpmemp_physmemp_endp%p_ksctp_etextp_ksv_szp_sptmapp_mfreep_vp/p:pLp_freememp_kbasep_ptfreepZpdpop_reginitp_p0init p_procp_curprocp_proc0_up_schedp_upypp_pregpppp_pfdatp_phashp_startupp_utsnamep_debugp_maxmemp_cinitTp_cfreep p_pfheadp_next_page_firstfree_vadrspace_sys_sect_allocator_startup_pgtalloc_pgtallocator_sptalloc_ublk_ptbl_mktables_ublk_sgtbl_p0init_done_phashmask_cfreelistsubr.o/ 548576774 0 0 100664 2476 ` u .textX5 .dataXX @.bssxxh<@Hѩ~PP^\< 0`0f &zp B0z @ Ӑzq  Üz |s |s P`YPXn`^\Q^\ | |   ! x( xP^\ ^`\X` 0"\^`` N0P^\  |!!  D@ Ls L^`Y^`Zup$Q^dPj    (s( db^dp$Q zB  y$\p $dPQ^d^`Z  ^^`   *'d^```d ^`ndV^`Y p $P^dPp  j  (s( d2^d p $P zB    ^]^P^Xd Y $   `cq rp P^dPv^XP x  h!(s# !(.d> 2^dp P      \pd~PɞHɾ@<hhW @(#)subr.c 4.4 87/05/14 (PR ,.:XZbdpr "4j  j   "$0    6.textX5.dataX .bssx_bmapqX_uqX_mountqX_vqX_allocqX_bdwriteqX_bwriteqX_breadqX_brelseqXswapalloc.o/ 548576810 0 0 100664 4136 ` u * ,#.text F .data` @.bss X XP<@~Hp z *  q *`xA 0  p XC xx  xx p ް  !1 ~Hɞ@Ǿ<PPWH ~@"xq !s#!  ( ~@HHW "x1 !s#W@0A~<3x! r 01s3( 8,~<@@WX?@Hz~P rVzzH @gz" sz  Y Y pYz  q   !WY f sq   ,'p ~PɞHɾ@XXWH8z~@@ 0s 0zz zA!0Y`@ YJpz  z "~@ɞ8HHW@~<p'q!h~<@@Wh@HPЧ~Xހz hz@zz?@\dpV^`\pR^\Xn`zzuvpØn`zz@.\!p2 `x x*|q^\T^\^`@P^`ndlW$0$(~XɎPɮH@hhWH0~@qaTxx    !0\f!1D xx     ~@HHW@1~pD8! !2j(pD8! !2(~W @(#)swapalloc.c 4.4 87/05/14 *cntptr != 0swapalloc.cswpuse count overflow - %s $&46BD`b     NP*,*L`  "`bz !".textF.data`.bss X_swallocss_swaptabs,ss"s_swfree1s_assfails_swpuse8s_swpinc|s_printfs_swapadd s_us_bdevsws,s_bzeros_swapdels_getswaps_swapremxs_sptfrees_regions_reglocks_unswap,s_regreles_vs_pfdats_premoves6s_swaps@_nextswap_swapfind_swapclup_swapwant_sptalloc_ptmemallswtch.o/ 548576830 0 0 100664 1524 ` u >.textD" .data $@.bss8d88WH~@DD>p,<p 1ndPp@ 0p0( G1'4pt@(4 440p nW3Qa1~~@HHW @(#)swtch.c 4.4 87/05/14 D F N RTZ b d p r   $6<BJ|~.text".data .bss_qswtchm _um _setrqm _swtch8m _sysinfom _savem m _procm m _pfreem m _spl6m _runqm _runrunm _curprim _idlem _curprocm _spl0m _resumem $_lastproc_ublk_ptbl_switchingsys1.o/ 548576851 0 0 100664 1188 ` u Sd.text8 .data88 @.bssXX0 h00W8h p88W8TT `dzlp,0z4D<8HP  Yp88W @(#)sys1.c 4.4 87/05/14 <>P p r z   (.text8 .data8 .bssX_execk_uk_execek_rexit4k_exitk_forkhk_sysinfok_newprock_timek_lboltksys2.o/ 548576882 0 0 100664 5695 ` u r*.text 8 .data 8 8 @.bss X X8LLH88W8PP88WP<@~H֠h xph  YR t xX z 8LJø @.z  | @  p x xlDlDxx|l|~Hɞ@Ǿ<PPW`< ~@qրxtDHDLPX\T" .LY\ll~@ǎ<``W8h!H88W8h88WH8~@Y   p@Y    jp  0 Y2 * p d Y>  P  . @YY fV   <4֠lؓ".Y Y p VY> pz z ~@ɞ8HHW8 ȧ~4phj p01F~488W@~`zz YY zz@ ~@HHW@~ z"'Y!~<@@W@~8րh\pF>~8@@W@4~8րhxg p?  @ p j&xp @ YHpl:ppxp z ~8Ǟ4@@WX~@րh*p p W @Y ppzhlR @l,   H @YBH" Y$H  YH YH  YTH YH!t YY~@XXW0@~Hրh"  z*p ppY`' c!(Y8 @0P)YY   P@ @ PR   P .P(YY. @ P)Yb*  Y:&zzz (8Jqpp#4W~Hɞ@W0 ht 00W0 ht00W8 ` `Y*&zzq  YYz 88WP?8@~H֠hB B8Y * &zz    ֋܊(zYz*  Y r @Y2z "0pz, 0z  07p(s0  ΋z    !#z  q0 01WY Tp ǐ$|xtX >Y     ԣ   ~  Yz gz z   `z 0z  jbh*z V  q0 00W (  YY~Hɞ@ɾ8PPWP<@~HY  &zzpz* (z ,p( LY|zçzz .&z YB$Yz  YLJz  ǀ$Zz vY|xtX 0Y z  q    Wz z z z   ~Hɞ@Ǿ<PPWX~@h~H ~Y'(( ! 2"Ћ( & Y l `YD$ $ ' zr~@XXW @(#)sys3.c 4.5 87/05/14 L`t`mountNMOUNT H Nd    0Xbrt 6PRXj~*8JVn|@hptv>ln  $ Lhjvz| !   $",HRjr"z"##$$(.4%v&x&'(  ,) .) N) \* n!  ! & & +      B  X Z p# r# $ $   -   "  ( 0. > H l" t / 0 0       1   & & 2 3 &3 2+ l n   5 5        D L l6 7         .text .data P.bss _fstaty_uy_getfyy_stat1y_staty_uchary_nameiy_iputy_dupy_ufallocy_closefy_fcntly_copyiny_getflcky_copyouty_setflcky_ioctly_bzeroyy_cdevswy_sttyy_gttyy_mgetdevy_bdevcnty_smounty_susery_preley_plocky_mounty_vy_provfly_bdevswy_geteblky_readiy_pipedevy_igety_brelsey_sumount ,y_xumounty_iflushy_bflushy_timey_writeiyy_binvaly# `y_swaptaby_swapdely_swapaddy-_soo_stat_soo_ioctl_punmount_swapfunc sys4.o/ 548576974 0 0 100664 10374 ` u "F.text _ .data  @"`@.bss``lWX@~H֐h΀2Lz2p p pLL 2( 2PRTL,8 Y~HɎ@XXW8 ȧ~4ph.~488W8 ȧ~4hp`(YVp(^dpZ0X$pZdpdpp^~488W8 ȩ~0րhxp p^^qZ PLj ҀZ^Zdpp^Z~088W^lZpWZlW\lW8 ȧ~4hp`(Y$`p\p`~488W8 ȩ~0րhxp p``q\| RLj Ҁ\`\F`q p`\~088W`l\pWd zlzpW dh$  zz    zlW0 Гh00W8 ȧ~4hpp (p.pdq(p'ppdplp~488W@~8 Nxzztpp @PzzYz   z zYx||tPxXY "zz@ f^~8@@W8R88W8ȓ88W@~8pt @YJ@ 2rbVx F~8@@W@~8րhp  Z. \    z@ z   rj~8@@W8 ȧ~4ph: H Z z@ ~488W@~8 hǂ(Yp,lp,8(88 "01p23@W38@L LL LL LL L^L LL@ L(L LL LL LL LL LL L L LL L8L LL@ Ld!(` !(PdÀ zp<.zd<p$(~8@@WX8@H~P֐h  YF   Y(ǩp< pxְd zYTQZVP^T z ^TP  zzx  zdPZP<4`^a(QaYB ~<p$(C Y~PɎHɮ@8XXW@h  Yl@@Wh Whd!88 lW@~ ̋<LLLldlld A0*( 0(2,l0l<lY~<@@W8ȓ88W @(#)sys4.c 4.6 87/05/14  T 4 | 02< @BJ L b   $&.06\^x  ":<@BLNXdfpv  *0XZhjnpz| *6DFJLl  <#>#P$df%&$&268>FNV`h'ln((.#0#B$j|,-.((0 $&&(0 ( < > ^ l n v              $ & 4 < > L \ ^ j t v                   * 4 6 V X ` h j r           3 3   4 5 5 H J d  3 3 3 3    0 2 D F h 4 5 5        88 ,.8BLVdfjl~< ?$&.08#:#L$\^z,@( 268>HJRB`hjCE@DHLPTX\.text _.data @.bss`_gtime}_time}_u}_ftime }_spl7}_lticks}_spl0}}_dstflag}_copyout}_stime}_suser}_logtchg}}}_setuidP}%}_getuid}_geteuid}_getegid}_setgid}/L}_getgid}_getpid}_setpgrpD}_sync}_update}_nice}_unlink0}_uchar}_namei}_iget}_xrele}_writei}_iput}_chdir}_chdirec }_chroot}_access}_prele}_plock}_chmod}_owner}_chown}_ssig 0}_proc}_psignal}_v}_kill 0}_times }_lbolt}_profil,}_alarmd}_pause}_sleep}_umask}_utime}_copyin}_iupdat}_ulimit}9}_min}_reboot}C}N_timezone_ftHeadwall_HWSetDate_setreuid_setregid_findpreg_call_rbugsyscall.o/ 548576995 0 0 100664 1512 ` u .text0 .data00 @.bssPPP@~HpǧwHHY   p߀ 4G!D4(lphؓL@Y Y WYNYzzlpLJd(2s( |(n  `Ć@'*>~Hɞ@PPW8d 88WWYWW @(#)syscall.c 4.4 87/05/14 &(0J L Z \     & vz | .text0.data0 .bssP_syscallm _um _sysinfom _nsysentm _sysentm _setjmpm _spl0m _runrunm _curprim _qswtchm _issigm _psigm _addupcm _nosysm _psignalm _nullsys m _nodevm _nulldev,m sysent.o/ 548577014 0 0 100664 4626 ` u d[.text .data|@.bss @(#)sysent.c 4.7 87/05/14 |$,4 < D L T \dlt| !"# $%&$',(4)<D*L+T\,dl-t.|/0123456789:;<= >?@$A,B4C<DDELT\dlt| $,4<DFLGTH\IdJlKtL|MNOPQRSTUVWXY.text.data|.bss_sysent r0_nosysr0_rexitr0_forkr0_readr0_writer0_openr0_closer0_waitr0_creatr0_linkr0_unlinkr0_execr0_chdirr0_gtimer0_mknodr0_chmodr0_chownr0_sbreakr0_statr0_seekr0_getpidr0_smountr0_sumountr0_setuidr0_getuidr0_stimer0_ptracer0_alarmr0_fstatr0_pauser0_utimer0_sttyr0_gttyr0_saccessr0_nicer0_syncr0_killr0_setpgrpr0_dupr0_piper0_timesr0_profilr0_lockr0_setgidr0_getgidr0_ssigr0_msgsysr0_sysacctr0_shmsysr0_semsysr0_ioctlr0_utssysr0r0_execer0_umaskr0_chrootr0_fcntlr0_ulimitr0_geteuidr0_getegidr0_ftimer0_setlevr0_rebootr0_socketr0r0r0_connectr0_bindr0"r0_listenr0_acceptr0.r08r0Dr0Qr0_sendtor0_recvmsgr0_sendmsgr0[r0hr0tr0~r0r0_nsysentr0_swapfunc_socksend_sockrecv_setsockopt_shutdown_socketpair_getpeername_recvfrom_getsockname_getsockopt_setreuid_setregid_sysridgesysridge.o/ 548577034 0 0 100664 1719 ` u .text .dataP@ @.bssXX0  !&< B  . "0123W.*p(WWPD~Hphp8WLLL LLLr L  LN2Y' 7LY*Y L$ Y~HǎDPPW @(#)sysridge.c 4.6 87/05/14 D\       &2D F h j x        (,048<@DHLP.text.dataP .bssXn(xn(n(_un(_ftbitsn((n(3n(>n(Jn(Xn(_susern(gn(_copyoutn(w_traptoround_roundtotrap_sysridge_mcversion_machineid_ftHeadwall_HWLoadEnable_R32LoadEnable_HWClockCommand text.o/ 548577063 0 0 100664 2610 ` u '8.texth,A .datahh8@.bssXDH~P ֠pzz΀@.zz pd\z * !(1*  w?p   z * !(1jz 80 ((hT(> 4,~PɞHǾDXXWP?8@z~HZp|zċfǗ>zz   jy `~Hɞ@ɾ8PPW@4~8 z  pXz܋BLJ  x ~8Ǟ4@@W@4~8pHFz44LJZx  ~8Ǟ4@@W8 z 88W @(#)text.c 4.4 87/05/14 xalloc - bad magic 0268V p       RT\ lxz , > Z x   & N \ bdln   X.texthA.datah8.bss_xallocp_up_ractivep_reglockp_regrelep_sleepppp_freeregp_mapregpp_panicp_chgprotp_xumountp_xuntext8p_xrelep$p._attachreg_allocreg_detachreg_swapcluptime.o/ 548577085 0 0 100664 2341 ` u = .textL .data ,@.bss P8@~Hz <LLǀp\zw  lǡDZ   Bt $ z< hP4 ($ z< 0z< z < <!~HɎ@ɮ8PPW0!:&m n W `Q0@0 1A<  p؅@N0m F"  n@!  n6 F21" mn@!1@ 4@܆ mnn 0! W8ȩP.XP TX2\` dh88W~qB$ΐF"m n mnnϠ<8<<~ɞW @(#)time.c 4.4 87/05/14 M:/w///:/AY/YDPPBP R ,.DFXZ &:"(."2Pdt.text.data .bss _timelapphph_gmtimeph_dstflagph<phph]_timezone_timetoYMDHMS_YMDHMStotime_usdaytab_ausdaytab_wedaytab_medaytab_dayrules timeout.o/ 548577108 0 0 100664 2147 ` u T.textP$ .dataPP8@.bssH48~@pp pw ' " 2.   0(ӧ  ~@ɞ8Ǿ4HHW@4~8pq`X(' l%# D%! ?Qa1`&! 7Rb1@&# 3Td1 &' 1Xh1 ψaw 5 ~8Ǟ4@@WP4~8 |`ހxDn@W'' ^%# >%! ?Qa1T7Rb1<3Td1$1Xh1 whW'' l%# D%! ?Qa1`&! 7Rb1@&# 3Td1 &' 1Xh1 ψc.HLWހx  D~8Ǟ4PPWH~@pp P d'~ d~@HHW @(#)timeout.c 4.4 87/05/14 timeout table overflow$&,0 2 <>HN    (.0 <>NTV^` "$2: .textP$.dataP8.bss_timeoutpP_calloutpP_spl7pP_vpP_panicpP_timeidpP_splxpPpP_splhipP_timein,pP_delaypP_wakeuppP_upP_sleeppP_untimeout trap.o/ 548577141 0 0 100664 6060 ` u u.text8 t .data88@.bss XH~Psp !p )4 2 !p""XW"&r& 'd=!X(bZp'B0" dn P3Qa1. d z" ,* @8~D)nf^ {s   pR @d0 z3PT^( @d0 z3P^(ԋ @d0 z3Pȧ^(~ @d0 z3P^(d,bz d0@d z(PX^,"t dd0 z3P^(&d z"0yn dq0<Fx< @d0 z3P ^(Bp @d0 z3P @^( p @d0 z3P |^(pt @d0 z3P ^(p< @d0 z3P ^(bp @d0 z3P $^(*p @d0 z3P \^(p{8tun @d0 z3P ^(w8@!n ^"dL <d(( ~PɞHXXW@~<p ~<@@W @(#)trap.c 4.8 87/05/14 Dl8D<t<%x regsave != 0trap.cPROT or TRANS fault: va=%x pte = %x no pte trapuser = pid = %d uarea = %x ps = %x pc = %x trap type %x Privilege Violation at Address %x for Process %d comm %s Invalid Kcall at Address %x for Process %d comm %s Illegal Instruction at Address %x for Process %d comm %s Data Alignement Error at Address %x for Process %d comm %s Accessed Address %x Illegal Trap %d at Address %x for Process %d comm %s Memory Parity Error at Address %x for Process %d comm %s pid %d killed due to page fault read error comm %s syscall Integer Overflow at Address %x for process %d comm %s Integer Zero Divide at Address %x for process %d comm %s Real Overflow at Address %x for process %d comm %s Real Underflow at Address %x for process %d comm %s Real Zero Divide at Address %x for process %d comm %s Inexact Result at Address %x for process %d comm %s Real Before Trap at Address %x for process %d comm %s Check Instruction Failed at Address %x for Process %d stray interrupt at %x &,6Bl       (. 24BH PTV\ dl pr~     $. 8:BDNPXb lnvx   ,028 FL PRv z|  &0 <>FHRT^h tv~    *DFNPZ\dn xz"X\`dhlptx|.text8.data8.bss _trapsh_assfailsh_ush_debugsh_mapashsh_panicsh_curprish_runrunsh_qswtchsh_growshsh_addupcsh_psignalsh_issigsh_psigsh_strayshsh_printfsh$_panicstr_addupc_clk_logstrayutssys.o/ 548577162 0 0 100664 1128 ` u <.text4 .data @.bssX<~@phJ  r,( - Y  )x Y0@$bz ΀ x ǀ$z pDHJ&P&D ̆ Y.1@[Y Y~@ǎ<XXW @(#)utssys.c 4.4 87/05/14 LNX dn    $ 6 BTVdp.text.data .bss_utssysl_ul_utsnamel_copyoutl_suserl_copyinl_mountl_bcopyl_vlbsdcompat.o/ 548577188 0 0 100664 1481 ` u  .textx4 .dataxx0@.bssz0  zz $"< <(W0 1!@WX<@H~PsЋLJ (  |  Bb ,Ћ, j* ,ċ,      ~PɞHɾ@<XXW8>88W@~8qx~8@@W8 ȧ~4p ~488W @(#)bsdcompat.c 4.6 87/05/14 selwakeup  ,.8:T V   >R<^.textx.datax0.bssm_procm_vm_ufavailPm_um_uiomovem_copyoutm_copyinm_bcopymm_panicm_insquem_spl7m_splxm_remque,m_procfind_selwakeup i_domain.o/ 548577207 0 0 100664 1585 ` u .text .data d@.bss8 ȩ~0,xW,p (Ljٓf~088W 1:!A "bzz , (W 1 Z2! z , (WH8~@ր2x   W,p (Lj~@ɞ8HHWH~@ր.x$W,p (Lj . ~@HHWH~@ր.x W,p (Lj . <~@HHW @(#)i_domain.c 4.6 87/05/14  "(. 2 4 :Dln.text.data .bssn_domainsnnn(`n4n@nLnYpn_timeoutne_domaininit_unixdomain_inetdomain_pffasttimo_pfslowtimo_pffindtype_pffindproto_pfctlinput i_mbuf.o/ 548577249 0 0 100664 7969 ` u %.text  .data $@.bss``@l \0ls! !dL h4 r@@WX?@H~P6  p p  0** Ĕ h0ppzzz tX p @ z zp~PɞHɾ@XXWW8   ȓ88WP@~H|pp\ z ؓX z z   p p x 7~Hɞ@PPW@~8q p 'p~~8@@WPD~HpN z6 z z g (T s $zLJ|pz '8l~HǞDPPWXH~PL8zp0x()pp\ z@У z z  Hp xp0xP)~(X~PɞHXXWXDH~Ppl'p|ΐ z z z g (P s $zLJ|pz '8 x h~PɞHǾDXXWpHPX~`(9(&ēf z݋2̓Jz Ljzdd  ߰  pPx^hl ;ԓPܧlpV zܓ zz (pldh('1D|p z zh|(0 ! s,((!7'2'z"; zLjDŽ.dd(.dfd&~`ɎXɮPHppWPD~Hp'8wΐ|g( &zz(  '8^('7#7z32(z"zz0(\g~HǞDPPWH~@q@(7pP >azzp!"z'z pŋbpL !zbzzpzzpz~@HHWXDH~PpT'9pl րh zh  z z z   zD 󂎀Πphz zgzz'!81z+$zz zzz pq l"P(x p'\~PɞHǾDXXW @(#)i_mbuf.c 4.7 87/05/20 mbinitm_expand() = 1 m_expand() = 0 mgetm_get(%s):%x m_getclr: mbfree twice-- m_free(%x):%x m_more(%d,%s): failed mgetm_morem_more(%d,%s):%x m_freem(%x): NULL mbfree twice MBFREE(%x,%x)m_copy(%x,%d,%d): empty m_copym_copym_copymget MBGET(%x,%d,%s) %x nospace(%x) m_cat(%x,%x): joined(%x,%x) new(%x) m_adj(%x,%d) %x m_pullup(%x,%d): mgetbad %x  $0<DLTMT_FREEMT_DATAMT_HEADERMT_SOCKETMT_PCBMT_RTABLEMT_HTABLEMT_ATABLEMT_SONAMEMT_ZOMBIEMT_SOOPTSMT_FTABLEMT_12MT_13MT_14MT_15$ 026 8 F H P TVln     <LN\bdpxz:@RX  RX   "&(02:<DLTVhjpz,2 :<HNPZdz ,2 @BLl n z|`n|   &.0FL TV`v      $ L  x ~     > L x              & ( 2 @ B L V   F R b jx|.text .data .bss`_mbinit|8_v|8|8_mbutl|8_mbmap|8_mfree|8|8_panic|8_malloc|8_sptfill|8_spl7|8_splx|8_mclfree|8_mbstat |8_m_free|8 |8#|8_debug|8_m_getp|8_mbfree|8_m_more|8-<|8_bzero|87|8_m_freem|8_m_copy<|8_bcopy|8_m_cat |8_m_adj |8B |8L|8Y_sptalloc_m_clalloc_m_pgfree_m_expand_m_getclr_mclrefcnt_m_pullup_nmbclusters i_proto.o/ 548577265 0 0 100664 804 ` u .text .dataT @.bss @(#)i_proto.c 4.6 87/05/14   unix8d    .text.data .bss_domainsk(_unixsw k(k(k(k(*k(6k(@k(L_uipc_usrreq_raw_input_raw_ctlinput_raw_usrreq_raw_init_unixdomaini_socket.o/ 548577342 0 0 100664 12001 ` u >)0:.text< .data' @.bssXH~Pp '(:,dp z z X npZ  (H 0W z @ z~PɞHXXWPD~Hp( A 8Wp ~HǞDPPWXH~Pp8'8B<( A 0W  Dzww  " ~PɞHXXW@~<pP'6 p\^z (<4 ~<@@WXH~Pph'z42gzxz \z Hgzz   (΀Tz$( A 0Wzxz   ~PɞHXXWH~Dp'n( A 0W~DHHWPD~Hp'8zz ( A 8Wp ~HǞDPPWPD~Hp'8|zp ( A 8Wp @~HǞDPPWPD~Hp'8( A 8Wp ~HǞDPPWPD~Hp'8z p6zp ( A 8Wp 4~HǞDPPWXLPX~`pP^^^Ч(>,0'z   z >z (z  z!P^P^Q^P^^VP^"Pz(z PP gPzz! P^^^^z  &dP ^`VPV@zH zP^T^PP^6^Pz  .>Ч>(7 C>W^Pz p^^ T ΐ<×>zz0z  zv  nz  P^*Pz! PgPzz" PP<nhW<%' \%# <%! 0Qa1T;Rb1<5Td1$2Xh1  ,   ( ր\ z0  zz   P^H r Xְ 8+ s,z  ΰ p   8(;(!:nT 6hzzlzhhÞjlzz lPz! PgPzz" PP ~`ɞXɾPLWLPX~`p>pǧ (^p^,0@'9   pd (J(0W Jǝhzz( =    *"8z(z 88g8zz! 8|$zVV|tLz |R*z( z|"z  |8z! 8g8zz" 88$|LJ0\zrp&$zz$(z(Vp2(z"D d, Lj &p Ljp^PThzz& 0Ǟ  !pLj4$zz$(z(D|0p0P^x÷XpzP^P^t^pRVP^l Lǝz  h  zz|(! =z((9vp|z (X|^x^tP Lj$$(zz"$(z (h z z z h (T s $ zǨ|zhL0<^tP , zz$zz$^lP>Xz2XzzXXzz@ &  xpr z.^xP&ΐf$zz(z$(X|^x0. z z z h (P s $ zǨ|z d^xP z$( A 0W8z! 8g8zz" 884n`*  z| ~`ɞXɾPLWPD~Hqǘ (7jq F(I 0W~HǞDPPWh@~Hx$Ǩ ("zz gzz z gzz pnPW'' \%# <%! 0Qa1H;Rb105Td12Xh1 z,z  .\P~Hɞ@hhWXH~Pp('(:,V)@ 6< z !!p""W" tzz fzPz (z ~PɞHXXWXH~Ps)(:~,.( !d!p""@W"@!  @ z  6 pz ~PɞHXXW@~<p'fZz BgZzz@&Zz,~<@@W @(#)i_socket.c 4.7 87/05/20 socreate(%x,%x,%d,%d) solisten(%x,%d) sofree(%x) sofree dqsoclose(%x) soclose: NOFDREFsoabort(%x) soaccept(%x,%x) soaccept: !NOFDREFsoconnect(%x,%x) soconnect2(%x,%x) sodisconnect(%x,%x) sosend(%x,%x,%x,%x,%x)sosendmget!%x,%dsoreceive(%x,%x,%x,%x,%x) receivereceive 2receive 2areceive 3?%x,%d(%d)mbfree twicereceive 4mbfree twicesoshutdown(%x,%d) sorflush(%x) sosetopt(%x,%d,%d,%x)  \\ \\\ \\\\\\\ sogetopt(%x,%d,%d,%x) sohasoutofband(%x) &8<>J L l ~   Vz2hp &28V <v4nx~@H*B D L \| L h  ! "  (    # #      " $  0  8  B# ^$ h  % % & % % ' ' ( (  (  %  0 : P) ! * f p , ) *Hf6!@"J^d-$H-b,Rl)   >'@'J(L(T(X(Z(b%d%l n v%~ ##  #    &'('4(6(>(B(D(L%N%V X `%h p#r#  # !:.F<Zd0!1 D2F2R3\78   $@DHLPTX\`dhlptx|.text.data .bss_debug_v_mbstat '_u_sofreeT_sobind@_spl7_splx1;_panicFQ_m_free_soclose_soabortx[T_sleepis\~_sosend_psignal_wakeup_sbwait_mbfree_m_more_mclfree_mbutl_uiomove_m_freem $_m_get_m_copyp_bzero|_signal)_socreate_pffindproto_pffindtype_m_getclr_solisten_soqremque_sbrelease_sorflush_sodisconnect_soaccept_soconnect_soconnect2_m_clalloc_mclrefcnt_soreceive_unp_externalize_soshutdown_socantrcvmore_unp_discard_unp_scan_sosetopt_sogetopt_sohasoutofband_procfind_nmbclusters i_socket2.o/ 548577388 0 0 100664 6172 ` u l+.text <a .data  $@.bss@~<p 'z z T~<@@WH~@pLJ '~@, ^!$T>z z T$n<d~@HHW@~<p 'z z8 T<$~<@@W@~<p 'Zz z0 T2<$~~<@@WPD~H ,( zz"z!"  pz z   TTZZ ( A 0W  (' <~HǞDPPWPD~Hp H'8(x"z z ~HǞDPPWH~@p `'8&1^ !!'# Pz z ~@HHW@~<p x'vz <~<@@W@~<p '&z $l~<@@W@~<p 'z ~<@@W@~<p '0 z0 hz gzz 2~<@@WPD~Hp '9(<x>$b  $<| ~HǞDPPWH~@q (7Jxp~@HHW@~<p'r~<@@WPD~H)8y pwz||p`|((|z|rHW&zz|(V(76z%#z4#zz zz F zz z p xLj~HǞDPPW`?HP~X΀0*(<,> z{L z|w zz 6p  |`\,' n%# F%! ?Qa1l&! 7Rb1L&# 3Td1,&' 1Xh1  z )z" | ~XɞPɾH``W@~<p`'rzpXgzzJzz  x~<@@WX?@H~Py ΰ):ʋ.text .data@.bss00PD~Hրhp p (8LYY L*lpp~HǎDPPWXL~Pphz |'TYYR.TYT'7(Y,~PǎLXXW@~L#$L$  ~HɎ@Ǯ<PPWH<~@րh q(DHYYDYY dgz  zYfؓ*Y Y<Tz VWYVD~@ǎ<HHW`D~Hph  Yh'7X\YY >'7\0YYlP  X  x \lX.\TYY  P(zlTp Pp !\z! \,Xz! X~HǞD``W`hHL@PT@DX\!  !H:``W`hHL@PT@DX\!  !H``W(~t.\>(;Yllt p ~XɎPɮHxxWp~Hphl$|YY ^TlXL\`LPdh' 7 !(Tz~HppWhhPTHX\HL`d!  !(P0hhW ~Dph bYY (Y.p#HYY XH؆  Y*'7 S4^(~DW?HP~XÓ  ` d lhpxhY@l(' Y~pxp p|^xt.`;^(Y|plh| t||#.|$ j| x||#|$x xt vtj~XɞPɾHW@~L#&YY L$Yp ~HɎ@PPWXH~Pph T$YYLjpY( A 9WYY fTiz zT)'>T#YY T$Y ~PɎHXXWXH~PphҎǀzYTYT$.YY ( A 9WYYdTiz zT)'>T#YY T$Y ~~PɎHXXWXH~Ppl0p R70)(' ( z~PɞHXXW8ȓ $ zY88W @(#)i_syscl.c 4.7 87/05/20 return from bind(%d,%x,%d)=%x acceptsorry no struct file lib rights lib from sockargs:copyin from:%x to:%x len:%d $R X\^xz   ,@BPV (4Rnv*:DFRZnz02fjl !&4@pr  $HJ`#hln$$ <V\`b & R ^       )  & 6 F t v                   (    `. f v  @Pbht0"$Nfv23@FJL^n5 3HJpvz|708@pr7LTXZt|"3V9x.text.data.bss0_socket~_u~_falloc~~~_bind~_getsockL~~_sobind~_m_freem~_debug~_listent~#~_accept~_copyin~_useracc~_spl7~_splx~_sleep~_ufalloc~-~_panic~_m_get~8~_copyout~_connect ~B~_setjmp~M`~Y~_sofree~_sendto~_sendit~e~_sendmsg~_sosend~o h~_recvit l~y ~_recvmsg ~~~~~~_m_free~~~8~~`~_getf~_mbstat ~~_mbfree~_mclfree~_socreate_ffreelist_sockargs_solisten_soqremque_soaccept_soconnect_socketpair_soconnect2_socksend_recvfrom_sockrecv_soreceive_shutdown_soshutdown_setsockopt_sosetopt_getsockopt_sogetopt_getsockname_m_getclr_getpeername_nmbclusters i_usrreq.o/ 548577494 0 0 100664 7342 ` u ;.text ,t .data \@.bss`?HP~XAǸI"z@ p W  x h@(H Ft4)" n + z(X9k)9#9z3#x(; z f  p 7>(*zzzBzB($*&zz>z z$>$<&֋z Ďt;+. V@  , pv  $&zz&>$*$  fz  p+8~($*(zzzBzB(&*$zz>z z>$$&P>F ^4:$    ~XɞPɾH``W@~<p  . p~<@@W@~8p@ ΀ J  ~8@@W@~8!zp2"z"^p.(F>6^YYDpYY$x~8@@WH<~@q'zp ''z"JpYY pr($ p` zz pH z*z p Hp0~@Ǟ<HHWH<~@1( zzxyrzV H ' D'0 ; Ћ8~@Ǟ<HHW@~8xp z Zr  4w pH: w$~8@@WW8 V88WH8 ~@zpx0tPD6X$ pzt~@ɞ8HHWH8~@ z p   Rq p4tzzq~@ɞ8HHW@~< p p(pz g` " :P zzvP  zZ' zz 88z$ "0`p(pZz Fzz4P & zhzp(~<@@WH48~@p\wpXgz,zWwp|wpp~@ɞ8Ǿ4HHW P  "p W8zD88W @(#)i_usrreq.c 4.7 87/05/20 tT|4uipc_usrreq(%x,LISTEN) uipc_usrreq:accept(%x,%x,%s) uipc_usrreq:shutdown(%x,%x) uipc 1uipc_usrreq:rcvd(%x,%x) uipc 2uipc_usrreq:send/dgram(%x,%x) uipc 3uipc_usrreq:send/stream(%x,%x,%x) uipc 4piusrreqIPUTIPUTunp_connect2unp_disconnectunp_externalizeunp_gcunp_gcscann  ( LZd l &,V^ .4FT ` LRXn&\ !!"#   $   ,#h !!"   B%lrz#&*'2'>D  ) +    `, , . . . / / 0 $1 &1 0/ 2/ j0 l0 t0 2 1 1 (0 *0 2/ 4/ v | 5 1 1 . : @ |0 ~0 0 6      $(,048<.text t.data .bss~<~~)@~_debug~3H~@~Nd~_bcopy~^~n (~_panic~}~ (~~~~ 4~_m_freem~~~~~_iput~~_m_free~_u~_schar~_namei~_prele~_maknode~ ~_m_copy~~% `~_ufavail~6 ~_ufalloc~_getf~_unp_gc ~C~_file~N~_v~_sbwait~Y d~c ~m~_closef~_mbstat ~y~_mbfree~_mclfree~_uipc_usrreq_unp_attach_unp_detach_unp_bind_unp_connect_unp_connect2_unp_disconnect_socantsendmore_unp_usrclosed_sbwakeup_unp_internalize_sun_noname_sbappendaddr_sbappend_unp_drop_unp_sendspace_unp_recvspace_soreserve_m_getclr_soisdisconnected_sonewconn_soisconnected_unp_externalize_unp_discard_unp_gcing_unp_defer_unp_mark_unp_scan_soshutdown_nmbclusterssys_socket.o/ 548577524 0 0 100664 1689 ` u t.text .data |@.bssH0A~Dszz @@ @30(W zz ~DHHWHA2~D t@fp@f}p |f~p 8spދ@sΐp @s pz z z z $zZZzrz@ ^Zs i:s r( q$W~DHHW8 88W8 ȧ~4p~~488W8 ȧ~4LF@zp60z(~488W @(#)sys_socket.c 4.6 87/05/14 @BL N bd  P.text.data .bss_soo_rwn(_un(n(_sosendn(n(_ifioctln(_rtioctln(@n(_bzeron($hn(_soclosen(_socinitn(_mbinitn(/n(_spl7n(_ifinitn(9n(_splxn(E_soreceive_soo_ioctl_soo_stat_soo_close_loattach_domaininit .R..s.aouthdr.hs.acct.hs.bitmasks.hs.bsdioctl.hs.buf.hs.callo.hs.cio.hs.clock.hs.conf.hs.crtctl.hs.ctio.hs.defsocket.hs.dir.hs.domain.hs.elog.hs.erec.hs.err.hs.errno.hs.fblk.hs.fdlp.hs.file.hs.filehdr.hs.flock.hs.init.hs.ino.hs.inode.hs.iobuf.hs.ass.hs.iomachdep.hs.ipc.hs.lock.hs.lprio.hs.map.hs.mas.hs.me.hs.mount.hs.msg.hs.mt.hs.mtio.hs.opt.hs.page.hs.param.hs.pcb.hs.pfdat.hs.proc.hs.protosw.h s.filsys.h s.psl.h s.pty.h s.reg.h s.region.hs.scnhdr.hs.sem.hs.shm.hs.signal.hs.smd.hs.socket.hs.socketvar.hs.space.hs.stat.hs.swap.hs.seg.hs.sxt.hs.sysinfo.hs.mbuf.hs.sysmacros.hs.systm.hs.termio.hs.text.h s.timeb.h!s.trace.h"s.trap.h#s.ttold.h$s.tty.h%s.tuneable.h&s.types.h's.uio.h(s.un.h)s.unpcb.h*s.user.h+s.utsname.h,s.var.h-s.version.h.s.mem.h/s.vrt.h0s.vtoc.h1s.times.h2s.debug.h3s.Makefile4s.rnio.h5s.const.as.h6s.maint.h7s.physmem.h8s.hwclock.h9s.sysridge.h:s.const.c.h;s.ieeefp.hh01873 s 00001/00001/00038 d D 4.4 87/05/17 17:51:48 build 8 7 c changed #idents back again. -mkm e s 00001/00001/00038 d D 4.3 87/05/14 16:19:38 build 7 6 c removed old SCCS strings and inserted #ident BB e s 00017/00002/00022 d D 4.2 87/04/16 15:04:43 dc 6 5 c dc - Add Bull updates from 03/05/87 e s 00000/00000/00024 d D 4.1 87/02/20 13:32:39 build 5 4 c rolled rev to -r4 /dc e s 00000/00000/00024 d D 3.1 87/01/19 09:24:35 build 4 3 c rolled rev to -r3 /dc e s 00000/00000/00024 d D 2.1 87/01/19 09:24:35 build 3 2 c AUTO NULL DELTA e s 00001/00000/00023 d D 1.2 87/01/16 10:18:42 build 2 1 c add ident string /dc e s 00023/00000/00000 d D 1.1 87/01/09 15:41:11 build 1 0 c Placed under source control - dc e u U f b f n t T I 2 D 6 /* "%W% %E%" */ E 2 I 1 E 6 I 6 D 7 /* " %W% %E% " */ E 7 I 7 D 8 #ident " %W% %E% " E 8 I 8 /* " %W% %E% " */ E 8 E 7 E 6 typedef struct aouthdr { short magic; /* see magic.h */ short vstamp; /* version stamp */ long tsize; /* text size in bytes, padded to FW bdry */ long dsize; /* initialized data " " */ long bsize; /* uninitialized data " " */ #if u3b long dum1; long dum2; /* pad to entry point */ #endif long entry; /* entry pt. */ long text_start; /* base of text used for this file */ long data_start; /* base of data used for this file */ I 6 #if sm90 long stsize; /* size of stack */ short need; /* needed Hardware flags */ short dummy; /* reserved */ #endif E 6 } AOUTHDR; /* | Definition of magic numbers */ #define WRMAGIC 0407 /* not shared text */ #define ROMAGIC 0410 /* readonly shared text */ #define PGMAGIC 0413 /* readonly shared text page aligned */ I 6 /* * Bits for need hardware - need : */ #if sm90 #define N_M68000 0x0008 /* 68000 ,68010 ,or 68020 microprocesseur*/ #define N_M68020 0x0001 /* 68020 microprocesseur*/ #define N_M68881 0x0002 /* 68881 microprocesseur*/ #define N_HACKALU 0x0004 /* Hackers floating alu*/ #endif E 6 E 1 h62575 s 00001/00001/00030 d D 4.4 87/05/17 17:51:50 build 8 7 c changed #idents back again. -mkm e s 00001/00001/00030 d D 4.3 87/05/14 16:19:48 build 7 6 c removed old SCCS strings and inserted #ident BB e s 00001/00001/00030 d D 4.2 87/04/16 15:03:50 dc 6 5 c dc - Add Bull updates from 03/05/87 e s 00000/00000/00031 d D 4.1 87/02/20 13:32:42 build 5 4 c rolled rev to -r4 /dc e s 00000/00000/00031 d D 3.1 87/01/19 09:24:37 build 4 3 c rolled rev to -r3 /dc e s 00000/00000/00031 d D 2.1 87/01/19 09:24:37 build 3 2 c AUTO NULL DELTA e s 00001/00000/00030 d D 1.2 87/01/16 10:18:44 build 2 1 c add ident string /dc e s 00030/00000/00000 d D 1.1 87/01/09 15:41:10 build 1 0 c Placed under source control - dc e u U f b f n t T I 2 D 6 /* "%W% %E%" */ E 6 I 6 D 7 /* " %W% %E% " */ E 7 I 7 D 8 #ident " %W% %E% " E 8 I 8 /* " %W% %E% " */ E 8 E 7 E 6 E 2 I 1 /* * Accounting structures */ typedef ushort comp_t; /* "floating point" */ /* 13-bit fraction, 3-bit exponent */ struct acct { char ac_flag; /* Accounting flag */ char ac_stat; /* Exit status */ ushort ac_uid; /* Accounting user ID */ ushort ac_gid; /* Accounting group ID */ dev_t ac_tty; /* control typewriter */ time_t ac_btime; /* Beginning time */ comp_t ac_utime; /* acctng user time in clock ticks */ comp_t ac_stime; /* acctng system time in clock ticks */ comp_t ac_etime; /* acctng elapsed time in clock ticks */ comp_t ac_mem; /* memory usage */ comp_t ac_io; /* chars transferred */ comp_t ac_rw; /* blocks read or written */ char ac_comm[8]; /* command name */ }; extern struct acct acctbuf; extern struct inode *acctp; /* inode of accounting file */ #define AFORK 01 /* has executed fork, but no exec */ #define ASU 02 /* used super-user privileges */ #define ACCTF 0300 /* record type: 00 = acct */ E 1 h21197 s 00001/00001/00017 d D 4.4 87/05/17 17:51:51 build 9 8 c changed #idents back again. -mkm e s 00001/00001/00017 d D 4.3 87/05/14 16:19:58 build 8 7 c removed old SCCS strings and inserted #ident BB e s 00001/00001/00017 d D 4.2 87/04/16 15:06:07 dc 7 6 c dc - Add Bull updates from 03/05/87 e s 00000/00000/00018 d D 4.1 87/02/20 13:32:44 build 6 5 c rolled rev to -r4 /dc e s 00000/00001/00018 d D 3.2 87/01/26 11:08:44 build 5 4 c remove redundant ident line e s 00000/00000/00019 d D 3.1 87/01/19 09:24:39 build 4 3 c rolled rev to -r3 /dc e s 00000/00000/00019 d D 2.1 87/01/19 09:24:39 build 3 2 c AUTO NULL DELTA e s 00001/00000/00018 d D 1.2 87/01/16 10:18:47 build 2 1 c add ident string /dc e s 00018/00000/00000 d D 1.1 87/01/09 15:41:14 build 1 0 c Placed under source control - dc e u U f b f n t T I 2 D 7 /* "%W% %E%" */ E 7 I 7 D 8 /* " %W% %E% " */ E 8 I 8 D 9 #ident " %W% %E% " E 9 I 9 /* " %W% %E% " */ E 9 E 8 E 7 E 2 I 1 D 5 /* @(#)bitmasks.h 1.1 */ E 5 /* setmask[i] has the low order i bits set. For example, * setmask[5] == 0x1F. */ extern int setmask[33]; /* sbittab[i] has bit number i set. For example, * sbittab[5] == 0x20. */ extern int sbittab[]; /* cbittab[i] has all bits on except bit i which is off. For example, * cbittab[5] == 0xFFFFFFDF. */ extern int cbittab[]; E 1 h09686 s 00001/00001/00079 d D 4.6 87/05/17 17:51:52 build 10 9 c changed #idents back again. -mkm e s 00001/00001/00079 d D 4.5 87/05/14 16:20:10 build 9 8 c removed old SCCS strings and inserted #ident BB e s 00001/00000/00079 d D 4.4 87/04/24 07:44:14 dc 8 7 c dc - fix comments e s 00006/00011/00073 d D 4.3 87/04/22 18:24:09 build 7 6 c translated French comments. (ksm) e s 00001/00003/00083 d D 4.2 87/04/16 15:06:34 dc 6 5 c dc - Add Bull updates from 03/05/87 e s 00000/00000/00086 d D 4.1 87/02/20 13:32:47 build 5 4 c rolled rev to -r4 /dc e s 00000/00000/00086 d D 3.1 87/01/19 09:24:41 build 4 3 c rolled rev to -r3 /dc e s 00000/00000/00086 d D 2.1 87/01/19 09:24:41 build 3 2 c AUTO NULL DELTA e s 00001/00000/00085 d D 1.2 87/01/16 10:18:49 build 2 1 c add ident string /dc e s 00085/00000/00000 d D 1.1 87/01/09 15:41:15 build 1 0 c Placed under source control - dc e u U f b f n t T I 2 D 6 /* "%W% %E%" */ E 2 I 1 /* %Z% Bull-Sems SPIX %Q%/%M% %I% %E% */ E 6 I 6 D 9 /* " %W% %E% " */ E 9 I 9 D 10 #ident " %W% %E% " E 10 I 10 /* " %W% %E% " */ E 10 E 9 E 6 /* D 7 * d'apres 4.2bsd: ioctl.h E 7 I 7 * Ioctl definitions (4.2bsd format) E 7 * D 7 * l'ipc socket utilise d'une part des fonctions ioctl specialisees (SIOC) * d'autre part il interprete certaines des fonctions ioctl applicables * aux fichiers (FIO) ; ces fonctions sont,pour la plupart,propres a * 4.2bsd , et ne sont pas implementees dans cette version. E 7 I 7 * Used with IPC sockets; the SIOC functions, along with certain of * the file ioctl commands are interpreted by sockets. E 7 * I 7 * Most of these functions are specific to 4.2BSD and are * not supplied with RX/V. E 7 */ D 7 /* * Ioctl definitions (format 4.2bsd) */ E 7 #ifndef _IO I 8 /* E 8 D 7 /* format des codes ioctl dans 4.2bsd: * Ioctl's have the command encoded in the lower word, E 7 I 7 * These ioctl's have the command encoded in the lower word, E 7 * and the size of any in or out parameters in the upper * word. The high 2 bits of the upper word are used * to encode the in/out status of the parameter; for now * we restrict parameters to at most 128 bytes. */ #define IOCPARM_MASK 0x7f /* parameters must be < 128 bytes */ #define IOC_VOID 0x20000000 /* no parameters */ #define IOC_OUT 0x40000000 /* copy out parameters */ #define IOC_IN 0x80000000 /* copy in parameters */ #define IOC_INOUT (IOC_IN|IOC_OUT) #define _IO(x,y) (IOC_VOID|('x'<<8)|y) #define _IOR(x,y,t) (IOC_OUT|((sizeof(t)&IOCPARM_MASK)<<16)|('x'<<8)|y) #define _IOW(x,y,t) (IOC_IN|((sizeof(t)&IOCPARM_MASK)<<16)|('x'<<8)|y) /* this should be _IORW, but stdio got there first */ #define _IOWR(x,y,t) (IOC_INOUT|((sizeof(t)&IOCPARM_MASK)<<16)|('x'<<8)|y) #endif /* * file ioctl commands */ #define FIONREAD _IOR(f, 127, int) /* get # bytes to read */ #define FIONBIO _IOW(f, 126, int) /* set/clear non-blocking i/o */ #define FIOASYNC _IOW(f, 125, int) /* set/clear async i/o */ #define FIOSETOWN _IOW(f, 124, int) /* set owner */ #define FIOGETOWN _IOR(f, 123, int) /* get owner */ /* * socket ioctl i/o controls */ #define SIOCSHIWAT _IOW(s, 0, int) /* set high watermark */ #define SIOCGHIWAT _IOR(s, 1, int) /* get high watermark */ #define SIOCSLOWAT _IOW(s, 2, int) /* set low watermark */ #define SIOCGLOWAT _IOR(s, 3, int) /* get low watermark */ #define SIOCATMARK _IOR(s, 7, int) /* at oob mark? */ #define SIOCSPGRP _IOW(s, 8, int) /* set process group */ #define SIOCGPGRP _IOR(s, 9, int) /* get process group */ #define SIOCADDRT _IOW(r, 10, struct rtentry) /* add route */ #define SIOCDELRT _IOW(r, 11, struct rtentry) /* delete route */ #define SIOCSIFADDR _IOW(i, 12, struct ifreq) /* set ifnet address */ #define SIOCGIFADDR _IOWR(i,13, struct ifreq) /* get ifnet address */ #define SIOCSIFDSTADDR _IOW(i, 14, struct ifreq) /* set p-p address */ #define SIOCGIFDSTADDR _IOWR(i,15, struct ifreq) /* get p-p address */ #define SIOCSIFFLAGS _IOW(i, 16, struct ifreq) /* set ifnet flags */ #define SIOCGIFFLAGS _IOWR(i,17, struct ifreq) /* get ifnet flags */ #define SIOCGIFCONF _IOWR(i,20, struct ifconf) /* get ifnet list */ /* driver pty */ #define TIOCREMOTE (('t'<<8)|105) #define TIOCPKT (('t'<<8)|112) #define TIOCGETMSG (('t'<<8)|107) #define TIOCPUTMSG (('t'<<8)|108) #define TIOCSREMOTE (('t'<<8)|115) #define TIOCPKT_DATA 0x00 /* data packet */ #define TIOCPKT_FLUSHREAD 0x01 /* flush packet */ #define TIOCPKT_FLUSHWRITE 0x02 /* flush packet */ #define TIOCPKT_STOP 0x04 /* stop output */ #define TIOCPKT_START 0x08 /* start output */ #define TIOCPKT_NOSTOP 0x10 /* no more ^S, ^Q */ #define TIOCPKT_DOSTOP 0x20 /* now do ^S ^Q */ E 1 h30736 s 00001/00001/00092 d D 4.4 87/05/17 17:51:54 build 8 7 c changed #idents back again. -mkm e s 00001/00001/00092 d D 4.3 87/05/14 16:20:20 build 7 6 c removed old SCCS strings and inserted #ident BB e s 00001/00002/00092 d D 4.2 87/04/16 15:06:52 dc 6 5 c dc - Add Bull updates from 03/05/87 e s 00000/00000/00094 d D 4.1 87/02/20 13:32:50 build 5 4 c rolled rev to -r4 /dc e s 00000/00000/00094 d D 3.1 87/01/19 09:24:44 build 4 3 c rolled rev to -r3 /dc e s 00000/00000/00094 d D 2.1 87/01/19 09:24:44 build 3 2 c AUTO NULL DELTA e s 00001/00000/00093 d D 1.2 87/01/16 10:18:52 build 2 1 c add ident string /dc e s 00093/00000/00000 d D 1.1 87/01/09 15:41:16 build 1 0 c Placed under source control - dc e u U f b f n t T I 2 D 6 /* "%W% %E%" */ E 2 I 1 /* @(#)buf.h 6.2 */ E 6 I 6 D 7 /* " %W% %E% " */ E 7 I 7 D 8 #ident " %W% %E% " E 8 I 8 /* " %W% %E% " */ E 8 E 7 E 6 /* * Each buffer in the pool is usually doubly linked into 2 lists: * the device with which it is currently associated (always) * and also on a list of blocks available for allocation * for other use (usually). * A buffer is on the available list, and is liable * to be reassigned to another disk block, if and only * if it is not marked BUSY. When a buffer is busy, the * available-list pointers can be used for other purposes. * Most drivers use the forward ptr as a link in their I/O active queue. * A buffer header contains all the information required to perform I/O. * Most of the routines which manipulate these things are in bio.c. */ struct buf { int b_flags; /* see defines below */ struct buf *b_forw; /* headed by d_tab of conf.c */ struct buf *b_back; /* " */ struct buf *av_forw; /* position on free list, */ struct buf *av_back; /* if not BUSY*/ dev_t b_dev; /* major+minor device name */ int b_cmd; /* ... */ union pte *b_pt; /* page table pointer */ unsigned b_bcount; /* transfer count */ union { caddr_t b_addr; /* low order core address */ int *b_words; /* words for clearing */ struct filsys *b_filsys; /* superblocks */ struct dinode *b_dino; /* ilist */ daddr_t *b_daddr; /* indirect block */ } b_un; #define paddr(X) (paddr_t)(X->b_un.b_addr) daddr_t b_blkno; /* block # on device */ char b_error; /* returned after I/O */ unsigned int b_resid; /* words not transferred after error */ time_t b_start; /* request start time */ struct proc *b_proc; /* process doing physical or swap I/O */ }; extern struct buf bfreelist; /* head of available list */ extern struct buf pbuf[]; /* Physio header pool */ struct pfree { int b_flags; struct buf *av_forw; }; extern struct pfree pfreelist; /* head of physio pool */ /* * These flags are kept in b_flags. */ #define B_WRITE 0 /* non-read pseudo-flag */ #define B_READ 01 /* read when I/O occurs */ #define B_DONE 02 /* transaction finished */ #define B_ERROR 04 /* transaction aborted */ #define B_BUSY 010 /* not on av_forw/back list */ #define B_PHYS 020 /* Physical IO potentially using UNIBUS map */ #define B_MAP 040 /* This block has the UNIBUS map allocated */ #define B_WANTED 0100 /* issue wakeup when BUSY goes off */ #define B_AGE 0200 /* delayed write for correct aging */ #define B_ASYNC 0400 /* don't wait for I/O completion */ #define B_DELWRI 01000 /* don't write till block leaves available list */ #define B_OPEN 02000 /* open routine called */ #define B_STALE 04000 #define B_PT 0x010000 /* mark page (pfdat) done when I/O completes (physical I/O) */ /* * Fast access to buffers in cache by hashing. */ #define bhash(d,b) ((struct buf *)&hbuf[((int)d+(int)b)&v.v_hmask]) struct hbuf { int b_flags; struct buf *b_forw; struct buf *b_back; }; extern struct hbuf hbuf[]; #define geterror(bp) \ {\ if (bp->b_flags&B_ERROR)\ if ((u.u_error = bp->b_error)==0)\ u.u_error = EIO;\ } E 1 h22395 s 00001/00001/00016 d D 4.4 87/05/17 17:51:55 build 8 7 c changed #idents back again. -mkm e s 00001/00001/00016 d D 4.3 87/05/14 16:20:31 build 7 6 c removed old SCCS strings and inserted #ident BB e s 00001/00002/00016 d D 4.2 87/04/16 15:07:10 dc 6 5 c dc - Add Bull updates from 03/05/87 e s 00000/00000/00018 d D 4.1 87/02/20 13:32:52 build 5 4 c rolled rev to -r4 /dc e s 00000/00000/00018 d D 3.1 87/01/19 09:24:46 build 4 3 c rolled rev to -r3 /dc e s 00000/00000/00018 d D 2.1 87/01/19 09:24:46 build 3 2 c AUTO NULL DELTA e s 00001/00000/00017 d D 1.2 87/01/16 10:18:55 build 2 1 c add ident string /dc e s 00017/00000/00000 d D 1.1 87/01/09 15:41:17 build 1 0 c Placed under source control - dc e u U f b f n t T I 2 D 6 /* "%W% %E%" */ E 2 I 1 /* @(#)callo.h 6.1 */ E 6 I 6 D 7 /* " %W% %E% " */ E 7 I 7 D 8 #ident " %W% %E% " E 8 I 8 /* " %W% %E% " */ E 8 E 7 E 6 /* * The callout structure is for a routine arranging * to be called by the clock interrupt * (clock.c) with a specified argument, * in a specified amount of time. * Used, for example, to time tab delays on typewriters. */ struct callo { int c_time; /* incremental time */ int c_id ; /* timeout id */ caddr_t c_arg; /* argument to routine */ int (*c_func)(); /* routine */ }; extern struct callo callout[]; E 1 h29536 s 00001/00001/00496 d D 4.5 87/05/17 17:51:56 build 10 9 c changed #idents back again. -mkm e s 00001/00001/00496 d D 4.4 87/05/14 16:20:43 build 9 8 c removed old SCCS strings and inserted #ident BB e s 00022/00003/00475 d D 4.3 87/04/17 08:40:35 dc 8 7 c dc - Add Bull (sccs) changes from 03/05/87 e s 00011/00007/00467 d D 4.2 87/04/16 15:07:43 dc 7 6 c dc - Add Bull updates from 03/05/87 e s 00000/00000/00474 d D 4.1 87/02/20 13:32:56 build 6 5 c rolled rev to -r4 /dc e s 00031/00013/00443 d D 3.2 87/02/13 11:08:26 build 5 4 c include bull changes from Jan 23 /dc e s 00000/00000/00456 d D 3.1 87/01/19 09:24:48 build 4 3 c rolled rev to -r3 /dc e s 00000/00000/00456 d D 2.1 87/01/19 09:24:48 build 3 2 c AUTO NULL DELTA e s 00001/00000/00455 d D 1.2 87/01/16 10:18:59 build 2 1 c add ident string /dc e s 00455/00000/00000 d D 1.1 87/01/09 15:41:19 build 1 0 c Placed under source control - dc e u U f b f n t T I 2 D 7 /* "%W% %E%" */ E 2 I 1 /* "@(#)cio.h 4.2 3/25/86" */ E 7 I 7 D 9 /* " %W% %E% " */ E 9 I 9 D 10 #ident " %W% %E% " E 10 I 10 /* " %W% %E% " */ E 10 E 9 E 7 /* cio (previously called wonderboard) values */ /* some basic constants! */ #define Bit0 1 #define Bit1 2 #define Bit2 4 #define Bit3 8 #define Bit4 16 #define Bit5 32 #define Bit6 64 #define Bit7 128 #define ON 1 #define OFF 0 /* error values returned by the routines accessing the WB's shared memory */ #define OK 0 #define EMPTY 1 #define FULL 2 #define BBUSY 3 #define INVALIDUNIT 4 #define INVALIDNUM 5 #define INVALIDCMD 6 I 5 #define KO 7 E 5 /* TCB's related constants */ #define NumUnits 8 #define RBuffersBase 0x2000 #define TBuffersBase 0x3000 #define BufSize 0x200 #define TCBBase 0x100 #define TCBSize 0x20 #define MaxCmdNum 12 /* Terminal Control Blocks base */ #define TCB(unit) (TCBBase+(TCBSize*unit)) /* Macros to access the field in the TCBs. They are IO addresses. */ /* A0 and BHE control which byte in the Halfword has to be accessed*/ /* during "writes" to the shared memory. "Reads" transmit the whole*/ /* 16 bits (halfword). */ /* The routines using these addresses have to make sure to use */ /* the right combination of BHE and A0. */ /* BHE - A0 */ /* 0 0 write the whole 16 bits */ /* 1 0 write the lower byte only */ /* 0 1 write the upper byte only */ /* 1 1 write neither byte */ #define A0 1 #define BHE 0x00400000 /* some (8086) displacement values in TCBs */ #define ReceiveHead 0 #define ReceiveTail 2 #define TransmitHead 4 #define TransmitTail 6 #define RR0 8 #define RR0i 9 #define RidgeStopByte 13 #define StartChar 14 #define StopChar 15 #define BufferOverflow 16 #define CommandPointer 17 #define Command 18 /* Valid commands to the tty controller. Consult the wonderboard */ /* manual for the commands format and meaning */ #define LASTCOMMAND 0x0080 #define WriteRegister0(data) 0x0000|((data&0x00ff)<<8) #define WriteRegister1(data) 0x0002|((data&0x00ff)<<8) #define WriteRegister2(data) 0x0004|((data&0x00ff)<<8) #define WriteRegister3(data) 0x0006|((data&0x00ff)<<8) #define WriteRegister4(data) 0x0008|((data&0x00ff)<<8) #define WriteRegister5(data) 0x000a|((data&0x00ff)<<8) #define WriteRegister6(data) 0x000c|((data & 0x00ff)<<8) #define WriteRegister7(data) 0x000e|((data & 0x00ff)<<8) #define ReadRegister0 0x0010 #define ReadRegister1 0x0012 #define ReadRegister2 0x0014 #define SetBaudRate(data) 0x0016|((data&0x00ff)<<8) #define ClearFlow 0x0018 #define SetIxon 0x001a #define SetIxonIxany 0x001c #define SetIxonIxoff 0x001e #define SetIxonIxoffIxany 0x0020 #define SetIxoff 0x0022 #define SetRTSMode 0x0024 #define Reserved19 0x0026 #define WriteHighPri(data) 0x0028|((data & 0x00ff)<<8) #define ClearStopByte 0x002a #define ClearIOControl 0x002c #define WBFlushOutput 0x002e #define WBFlushInput 0x0030 #define WBFlushInpOut 0x0032 #define SetInterruptMode 0x0034 #define SetTimerInterrupt(data) 0x0036|((data&0x00ff)<<8) #define EnableTTYInterrupts 0x0038 #define MaxValidCmd 0x0038 /* equal to bottom 7 bits of last cmd */ I 5 D 8 #define WriteParam 0x0001 /* Logical value for wbalparam */ E 8 E 5 /* masks for IO interrupt word status */ #define MODEM 0x8000 #define BRK Bit7 #define CTS Bit5 #define DSR Bit4 #define CD Bit3 #define FE 0x4000 #define OE 0x2000 #define PE 0x1000 #define AE 0x7000 /* masks for specific t_state word status */ #define TS_HUPCLS 0x00000001 /* waiting for Carrier to drop */ #define TS_XCLUDE 0x00000020 /* Exclusive access on the device */ #define TS_TTSTOP 0x00000040 /* Used for start-stop protocol */ #define TS_WSLEEP 0x00000080 /* A client is stopped on a write */ #define TS_ISLEEP 0x00000100 /* A client is stopped on a ioctl */ #define TS_IQUOT 0x00000200 /* Escaping special characters when ECHOI*/ #define TS_QUOT 0x00000400 /* Escaping special characters */ #define TS_CANON 0x00002000 /* caononb has complete line */ #define TS_ECHO 0x00004000 /*a read call was suspended while echoing*/ #define TS_TYPEN 0x00008000 /* Rewriting current unread line*/ I 7 E 7 #define TS_DTR_ON 0x00010000 /* hardware representation of DTR status */ D 7 #define TS_BRK_ON 0x00040000 /* hardware representation of BRK status */ #define TS_CTS_ON 0x00080000 /* hardware representation of CTS status */ E 7 I 7 #define TS_CAR_ON 0x00080000 /* hardware representation of DCD status */ E 7 #define TS_DSR_ON 0x00100000 /* hardware representation of DSR status */ D 7 #define TS_CAR_ON 0x00200000 /* hardware representation of DCD status */ E 7 I 7 #define TS_CTS_ON 0x00200000 /* hardware representation of CTS status */ #define TS_BRK_ON 0x00800000 /* hardware representation of BRK status */ E 7 #define TS_OLDEXPAND 0x01000000 /* TS_OLD* remember flags during ioctl */ #define TS_OLDINT 0x02000000 #define TS_OLDRAW 0x04000000 #define TS_OLDCBREAK 0x08000000 #define TS_RESET 0x20000000 /* device reset on going */ #define TS_INIT 0x80000000 /* device initialized */ I 7 /* Masks for IOCTL status chages */ #define IMASQ (IXOFF|IXANY|IXON|INPCK) #define CMASQ (PARODD|PARENB|CREAD|CSTOPB|CSIZE|CBAUD) E 7 /* wb_state bits */ D 5 #define WB_FLAGS 0x000000ff /* any of the following bit values */ #define WB_SBRK 0x00000001 /* DTR off to ack loss of carrier */ #define WB_RSBRK 0x00000002 /* send break condition asserted */ #define WB_BUSY 0x00000004 /* write registers are being changed */ #define WB_FLUSH 0x00000008 /* flushing wb input and output buffers*/ #define WB_SBRKTIME 0x00000010 /* send break timeout started */ #define WB_XON 0x00000020 /* send XON immediately */ #define WB_XOFF 0x00000040 /* send XOFF immediately */ E 5 I 5 #define WB_FLAGS 0x0FFFFFFF /* any of the following bit values */ #define WB_BUSY 0x00000001 /* write registers are being changed */ #define WB_XOFF 0x00000002 /* send XOFF immediately */ #define WB_XON 0x00000004 /* send XON immediately */ #define WB_SBRK 0x00000008 /* send break condition asserted */ #define WB_RSBRK 0x00000010 /* end break condition asserted */ #define WB_WFLUSH 0x00000020 /* flushing wb output buffers */ #define WB_RFLUSH 0x00000040 /* flushing wb input buffers */ #define WB_MODON 0x00000100 /* connect modem on */ #define WB_MODOFF 0x00000200 /* connect modem off */ E 5 D 8 #define WB_DTR 0x00000080 /* changing DTR state */ E 8 D 5 #define WB_OFULL 0x00000100 /* wb output buffer is full */ #define WB_STOP 0x00000200 /* wb output stopped "a la TCXONC" */ #define WB_MODEM 0x00000400 /* connect or disconnect */ #define WB_RESET 0x00000800 /* reset of the unit */ E 5 I 5 #define WBI_XOFF 0x00020000 /* send XOFF immediately */ #define WBI_XON 0x00040000 /* send XON immediately */ #define WBI_RSBRK 0x00100000 /* send break condition asserted */ #define WBI_WFLUSH 0x00200000 /* flushing wb output buffers */ #define WBI_RFLUSH 0x00400000 /* flushing wb input buffers */ #define WBI_MODON 0x01000000 /* connect modem on */ #define WBI_MODOFF 0x02000000 /* connect modem off */ E 5 I 5 #define WB_WAIT 0x10000000 /* waiting for ressource level 0 */ #define WB_STOP 0x20000000 /* wb output stopped "a la TCXONC" */ #define WB_BRK 0x40000000 /* break status of the unit */ #define WB_RESET 0x80000000 /* reset of the unit */ I 8 #define WBBUSY 0x81 /* write registers are being changed */ #define WBXOFF 0x82 /* send XOFF immediately */ #define WBXON 0x83 /* send XON immediately */ #define WBSBRK 0x84 /* send break condition asserted */ #define WBRSBRK 0x85 /* end break condition asserted */ #define WBWFLUSH 0x86 /* flushing wb output buffers */ #define WBRFLUSH 0x87 /* flushing wb input buffers */ #define WBMODON 0x89 /* connect modem on */ #define WBMODOFF 0x8A /* connect modem off */ #define WBZERO 0x80 /* flag for ressource level 0 */ #define WBEND 0x40 /* last command executed */ #define WBIXOFF 0x02 /* send XOFF immediately */ #define WBIXON 0x03 /* send XON immediately */ #define WBISBRK 0x04 /* send break condition asserted */ #define WBIRSBRK 0x05 /* end break condition asserted */ #define WBIWFLUSH 0x06 /* flushing wb output buffers */ #define WBIRFLUSH 0x07 /* flushing wb input buffers */ #define WBIMODON 0x09 /* connect modem on */ #define WBIMODOFF 0x0A /* connect modem off */ E 8 E 5 /* Line Printer Control Block */ #define LpCB 0x080 /* Line printer control block */ /* Offsets of elements of Line Printer CB */ #define LpOrder 0x000 /* Order to perform LP operation */ /* LP orders */ #define LpWrite 0x02 /* write a block from ridge to printer */ #define LpWait 0x04 /* interrupt when transfer complete */ #define LpWriteLocal 0x06 /* write a block from shared memory (for diags.) */ #define LpType 0x001 /* printer type (must match type from cable) */ /* LP types */ #define LpTypeVers 0xC /* Versatec interface */ #define LpTypeDP 0x8 /* Data products interface */ #define LpTypeCent 0x4 /* Centronics interace */ #define LpTypeNone 0x0 /* No interface connected */ #define LpByteCount 0x002 /* Number of bytes to send (up to 1 page) */ #define LpRidgeAddrU 0x004 /* Upper 16 bits of Ridge buffer address */ #define LpRidgeAddrL 0x006 /* Lower 16 bits of Ridge buffer address */ #define LpCmd2 0x008 /* Sets control lines during transfer */ #define LpCmd1 0x009 /* Sets control lines just before transfer */ /* control line bit definitions */ #define LpReset 0x80 #define LpClear 0x40 /* Versatec only */ #define LpFormFeed 0x20 /* Versatec only */ #define LpEOT 0x10 /* Versatec only */ #define LpLineTerm 0x08 /* Versatec only */ #define LpPlot 0x04 /* Versatec only */ #define LpPrintPlot 0x02 /* Versatec only */ #define LpSMGo 0x01 /* A zero here clears LP state machine */ #define LpReturnStatus 0x00A /* Response to commands */ /* ReturnStatus bit definitions */ #define LpOK 0x00 #define LpBadType 0x02 /* LpType does not match sensed device type */ #define LpAbortAck 0x04 /* Acknowledgement to abort command */ #define LpAbortStatus 0x00B /* Reserved */ #define LpDeviceStatus 0x00C /* Status of interface lines */ /* status line bits Data Prod. Centronics Versatec */ #define LpTOFL 0x80 /* -Top of Form FALSE follows +RFFED */ #define LpBOFL 0x40 /* -Bottom Form +Fault follows +REOTR */ #define LpCFault 0x40 /* -Bottom Form +Fault follows +REOTR */ #define LpDPOnlineL 0x20 /* -online -Selected +online */ #define LpCSelectedL 0x20 /* -online -Selected +online */ #define LpVOnline 0x20 /* -online -Selected +online */ #define LpNoPaperL 0x10 /* +IFace Conn. -No Paper -No Paper */ #define LpDPIFaceConn 0x10 /* +IFace Conn. -No Paper -No Paper */ #define LpTypeMask 0x0C /* 1 0 0 1 1 1 */ /* Debugger Control Block */ #define DebugCB 0x0C0 #define DB_BootReq 0 /* C0 is a the magic location uCode writes to boot */ #define DB_BdFailures 2 /* Selftest routines report failures here */ /* Test request/failure flag bits used in BdFailures, and RequestWord */ #define D_LRegFailed 0x0001 /* Lance register test failed */ #define D_LMemFailed 0x0002 /* Local memory test failed */ #define D_SMemFailed 0x0004 /* Shared memory test failed */ #define D_lanceinitfail 0x0008 /* lance initialization and internal loopback */ #define D_DMActfailed 0x0010 /* DMA counter test */ #define D_Timerfailed 0x0020 /* 8254 timer test */ #define D_DMAfailed 0x0040 /* DMA test */ #define D_Siofailed 0x0080 /* Sio test */ #define D_scsiintfail 0x0100 /* scsi internal loopbk */ #define D_scsiprifail 0x0200 /* scsi priority check */ #define D_DMArdgfail 0x0400 /* ridge DMA test */ #define D_SioLoopbkfail 0x0800 /* sio loopback test */ #define D_lpextfail 0x1000 /* lp external loopback */ #define DB_PROMVersion 4 /* Version number of EPROMs */ #define DB_RAMVersion 6 /* Version number of running code */ #define DB_PCAConfig 7 /* PCA configuration switch */ #define D_NoSelfTestEnbl 0x01 #define D_LoopBackCnctr 0x02 #define D_TestForever 0x04 #define D_PCVersMask 0x30 #define D_NoLanceLoaded 0x40 #define D_CompleteLoad 0x80 #define DB_Halt 8 /* Writing nonzero word here traps to debugger */ #define DB_Command 10 /* Commands to debug interface */ /* debug command codes */ #define DEnableIntCmd 1 /* Enable interrupts from debug command unit */ #define DDisableIntCmd 2 /* Disable interrupts from debug command unit */ #define DEnableBIntCmd 3 /* Enable interrupts from breakpoints */ #define DDisableBIntCmd 4 /* Disable interrupts from breakpoints */ #define DMoveToRAMCmd 5 /* Copy a block of data from DiagBuf to local RAM */ #define DMoveFromRAMCmd 6 /* Copy a block of data from local RAM to DiagBuf */ #define DExecuteCmd 7 /* Go directly to a location in code */ #define DResumeCmd 8 /* Resume execution, and wait for BP */ #define DReadIOWordCmd 9 /* Perform an IO read word into shared memory */ #define DReadIOByteCmd 10 /* Perform an IO read byte into shared memory */ #define DWriteIOWordCmd 11 /* Perform an IO write word from shared memory */ #define DWriteIOByteCmd 12 /* Perform an IO write byte from shared memory */ #define DCallCmd 13 /* Call a procedure, and interrupt */ #define DReadRegsCmd 14 /* Move saved registers from stack to DiagBuf */ #define DWriteRegsCmd 15 /* Move reg. values from DiagBuf to stack */ #define DMoveToBuf 16 #define DMoveFromBuf 17 #define DWriteForever 18 #define DReadForever 19 #define DLastCommand 19 #define DB_Error 11 #define DB_ErOK 0 #define DB_BadCmdErr 1 /* Unknown command */ #define DB_BadIntErr 2 /* Unexpected interrupt type */ #define DB_BreakMode 12 /* Types of Breakpoint interrupts */ #define DB_noBreak 0 /* nop */ #define DB_BPBreak 1 /* Breakpoint was encountered */ #define DB_SSBreak 2 /* Single step trap */ #define DB_UnexpectedInt 3 /* Bad 8086 interrupt vector */ #define DB_HaltInt 4 /* Board was requested to enter Debug interface */ #define DB_Count 14 /* Count for transfer commands */ #define DB_Addr 16 /* Address for transfer commands */ #define DB_Segment 18 /* Segment to be used in transfers */ #define DB_IORdData 20 /* Data returned from IORead commands */ #define DB_IOWriteData 22 /* Data to be used in IO write commands */ #define DB_IOWriteData2 24 #define DB_IPReg 26 /* Instruction pointer for Exec, Call */ #define DB_CSReg 28 /* Code Segment for Exec, Call */ #define DB_CurrentTest 30 /* diagnostics put test # here */ #define DB_InitDone 32 /* code writes here when init complete */ #define DebugCBEnd 0x0FF /* common structures for the scsi 1/4 inch tapedriver */ /* Group 0 commands */ #define TestRdy 0x0000 /* All Devices */ #define Rewind 0x0100 /* Seqential Access */ #define ReqSense 0x0300 /* All Devices */ #define RdBlkLimits 0x0500 /* Seqential Access */ #define ReadTape 0x0801 /* Direct Access, Sequential */ #define WriteTape 0x0A01 /* Direct Access, Sequential */ #define WriteFmk 0x1000 /* Seqential Access */ #define SpaceFile 0x1101 /* Seqential Access */ #define SpaceBlock 0x1100 /* Seqential Access */ #define SpaceMedia 0x1103 /* Seqential Access */ #define Inquiry 0x1200 /* All Devices */ #define Verify 0x1301 /* Seqential Access */ #define RecvrBufData 0x1401 /* Seqential Access */ #define ModeSelect 0x1500 /* Seqential Access */ #define Reserve 0x1600 /* Direct Access, Sequential */ #define Release 0x1700 /* Direct Access, Sequential */ #define Copy 0x1800 /* All Devices */ #define Erase 0x1901 /* Seqential Access */ #define ModeSense 0x1A00 /* Seqential Access */ #define LoadUnload 0x1B00 /* Seqential Access */ #define PrvAlwRemov 0x1E00 /* Seqential Access */ #define TapeUnitID 8 #define CipherAddr 6 /* interrupt unit # for tape device */ #define ReadType 0x0000 #define WriteType 0x0100 #define DCBBase 0x1000 #define DCBSize 0x80 /* Tape Control Blocks base */ #define DCB(unit) (DCBBase+(DCBSize*unit)) /* ** Identify message format */ #define IdentBit 0x80 /* This bit must be on in identify message */ #define CanReconnect 0x40 /* This should be on to indicate we can reconnect */ #define CbOrder 0x0C /* Status byte returned by device */ #define StartIO 0x0D #define AuxMsg 0x0E #define IdentifyMsg 0x0F #define TargetID 0x10 #define RidgeDevNum 0x11 #define XCntMsb 0x12 /* Transfer Count (upper) */ #define XCntLsb 0x14 /* Transfer Count (lower) */ #define Set1Cmd0 0x16 /* First word of Command Set 1 */ #define Set1Cmd4 0x1A /* Last word of Command Set 1 */ #define ScsiStatus1 0x22 /* Status byte returned by device */ #define ScsiStatus2 0x30 #define ScsiStatus3 0x3E #define StatBusy 0x08 /* target unable to accept command */ #define CbPage0 0x40 /* First Page of Buffer Adress */ #define ErIOTimeOut 1001 #define ErIODataNotValid 1002 #define ErIOTmOAndDNV 1003 #define ErUnknownError 1004 /* ** Begining of shared memory block0 + ** index to start IO byte */ #define seconds 1000 #define R_timeout 90*seconds #define W_timeout 90*seconds #define Space_timeout 90*seconds #define Rewind_timeout 100*seconds #define Erase_timeout 200*seconds #define Info_timeout 10*seconds #define I_timeout 15*seconds /* Terminal augmented tty structure for specific SPS9 informations */ I 5 D 7 #define COMSIZE 11 E 7 I 7 #define COMSIZE 22 E 7 E 5 struct wbal { unsigned char vtrm[SZTRM]; D 5 ushort wb_state; E 5 I 5 unsigned int wb_state; E 5 char status; char startc; char stopc; char WR0; char WR1; char WR3; char WR4; char WR5; I 5 char head; char tail; D 7 ushort comm[COMSIZE]; E 7 I 7 unsigned char comm[COMSIZE]; E 7 E 5 }; /* Line Printer Type Devices I/O Control */ struct wblp_lpdt { char *lp_buf; unsigned short lp_count; unsigned short lp_order; int lp_flags; unsigned char lp_ind; unsigned char lp_line; unsigned char lp_col; unsigned char lp_tabs; unsigned char lp_ccc; unsigned char lp_mlc; }; /* Cartridge Tape Type Devices I/O Control */ struct wbctbuf { char Resvd0; /* */ char Resvd1; /* */ char Resvd2; /* */ char Resvd3; /* */ char Resvd4; /* */ char Resvd5; /* */ char Resvd6; /* */ char Resvd7; /* */ char Resvd8; /* */ char Resvd9; /* */ char ResvdA; /* */ char ResvdB; /* */ char ResvdC; /* */ char ResvdD; /* */ char ResvdE; /* */ char ResvdF; /* */ char msl0; /* */ char msl1; /* */ char msl2; /* */ char msl3; /* */ char msl4; /* */ char msl5; /* */ char msl6; /* */ char msl7; /* */ char msl8; /* */ char msl9; /* */ char mslA; /* */ char mslB; /* */ char mslC; /* */ char mslD; /* */ char mslE; /* */ char mslF; /* */ }; /* Definitions for the PerDevType field */ #define PerDevType ResvdC #define PDTDirect 0x00 #define PDTSeqtial 0x01 #define PDTPrinter 0x02 #define PTDProcessor 0x03 #define PDTReadOnly 0x05 /* Definitions for ResvdX in Inquiry Command */ #define RMB 0x80 /* bit mask for removable medium */ #define TQAL 0x7F /* bits mask for device type qualifier */ #define IQSIZE 0x0400 /* size of Inquiry Data + last byte command */ /* Definitions for msl0 in ModeSense Command */ #define MDTY 0x01 /* bits mask for media type */ #define WP 0x80 /* bit mask for write protect */ #define BUFM 0x10 /* bit mask for Buffered Mode */ #define SPD 0x03 /* bits mask for speed */ #define DSTY 0x07 /* bits mask for density code */ #define NBLK 0xFF /* bits mask for number of bloks */ #define MSSIZE 0x0D00 /* size of ModeSense Data + last byte command */ /* Definitions for the Extended Status field */ #define VADD 0x80 /* byte 0 of extended status */ #define FMK 0x80 /* byte 2 of extended status */ #define EOM 0x40 /* byte 2 of extended status */ #define ILI 0x20 /* byte 2 of extended status */ E 1 h63553 s 00001/00001/00005 d D 4.4 87/05/17 17:51:59 build 8 7 c changed #idents back again. -mkm e s 00001/00001/00005 d D 4.3 87/05/14 16:20:56 build 7 6 c removed old SCCS strings and inserted #ident BB e s 00001/00001/00005 d D 4.2 87/04/16 15:07:58 dc 6 5 c dc - Add Bull updates from 03/05/87 e s 00000/00000/00006 d D 4.1 87/02/20 13:33:00 build 5 4 c rolled rev to -r4 /dc e s 00000/00000/00006 d D 3.1 87/01/19 09:24:52 build 4 3 c rolled rev to -r3 /dc e s 00000/00000/00006 d D 2.1 87/01/19 09:24:52 build 3 2 c AUTO NULL DELTA e s 00001/00000/00005 d D 1.2 87/01/16 10:19:04 build 2 1 c add ident string /dc e s 00005/00000/00000 d D 1.1 87/01/09 15:41:22 build 1 0 c Placed under source control - dc e u U f b f n t T I 2 D 6 /* "%W% %E%" */ E 6 I 6 D 7 /* " %W% %E% " */ E 7 I 7 D 8 #ident " %W% %E% " E 8 I 8 /* " %W% %E% " */ E 8 E 7 E 6 E 2 I 1 #define LONGTIME 0x7fffffff #define SECHR (60*60) /* seconds/hr */ #define SECDAY (24*SECHR) /* seconds/day */ #define SECYR (365*SECDAY) /* seconds/common year */ E 1 h31918 s 00001/00001/00093 d D 4.5 87/05/17 17:52:00 build 9 8 c changed #idents back again. -mkm e s 00001/00001/00093 d D 4.4 87/05/14 16:21:05 build 8 7 c removed old SCCS strings and inserted #ident BB e s 00009/00002/00085 d D 4.3 87/04/27 11:55:54 dc 7 6 c change ttyix to allow diag nostic console e s 00001/00001/00086 d D 4.2 87/04/16 15:09:02 dc 6 5 c dc - Add Bull updates from 03/05/87 e s 00000/00000/00087 d D 4.1 87/02/20 13:33:02 build 5 4 c rolled rev to -r4 /dc e s 00000/00000/00087 d D 3.1 87/01/19 09:24:54 build 4 3 c rolled rev to -r3 /dc e s 00000/00000/00087 d D 2.1 87/01/19 09:24:54 build 3 2 c AUTO NULL DELTA e s 00001/00000/00086 d D 1.2 87/01/16 10:19:06 build 2 1 c add ident string /dc e s 00086/00000/00000 d D 1.1 87/01/09 15:41:22 build 1 0 c Placed under source control - dc e u U f b f n t T I 2 D 6 /* "%W% %E%" */ E 6 I 6 D 8 /* " %W% %E% " */ E 8 I 8 D 9 #ident " %W% %E% " E 9 I 9 /* " %W% %E% " */ E 9 E 8 E 6 E 2 I 1 /* * Declaration of block device switch. Each entry (row) is * the only link between the main unix code and the driver. * The initialization of the device switches is in the file conf.c. */ struct bdevsw { int (*d_open)(); int (*d_close)(); int (*d_strategy)(); int (*d_print)(); int d_bsize; /* block size */ }; extern struct bdevsw bdevsw[]; /* * Character device switch. */ struct cdevsw { int (*d_open)(); int (*d_close)(); int (*d_read)(); int (*d_write)(); int (*d_ioctl)(); struct tty *d_ttys; int d_cmal; /* controller max asynchronous lines */ }; extern struct cdevsw cdevsw[]; extern int bdevcnt; extern int cdevcnt; /* * Line discipline switch. */ struct linesw { int (*l_open)(); int (*l_close)(); int (*l_read)(); int (*l_write)(); int (*l_ioctl)(); int (*l_input)(); int (*l_output)(); int (*l_mdmint)(); }; extern struct linesw linesw[]; extern int linecnt; /* * Terminal switch */ struct termsw { int (*t_input)(); int (*t_output)(); int (*t_ioctl)(); }; extern struct termsw termsw[]; extern int termcnt; /* Declaration of configuration switch */ /* The table is initialized in conf.c */ /* The indice in the table is the board type. */ struct confsw { int (*c_intr)(); /* interruption routine */ char *c_name; /* controller name */ unsigned char c_max; /* max number of controllers */ unsigned char c_cnt; /* number of present controllers */ }; extern struct confsw confsw[]; /* The table conf_devs describes the hardware */ /* configuration */ /* of the machine. */ /* The table is initialized by iomachdep */ /* The indice is the board address */ struct conf_devs { unsigned char conf_type; /* board type */ unsigned char conf_pdev; /* pseudo device */ }; extern struct conf_devs conf_devs[]; D 7 #define ttyix(x) (((minor(x)>>6) * cdevsw[major(x)].d_cmal) + \ (minor(x)&0x3f)) E 7 I 7 /* * Reserved major device number assignments */ #define MAJCONS 1 #define ttyix(x) (major(x)==MAJCONS && minor(x)==0 && HeadwallDiag()) ? \ 3 : \ (((minor(x)>>6) * cdevsw[major(x)].d_cmal) + \ (minor(x)&0x3f)) E 7 E 1 h05865 s 00001/00001/00056 d D 4.4 87/05/17 17:52:02 build 8 7 c changed #idents back again. -mkm e s 00001/00001/00056 d D 4.3 87/05/14 16:21:16 build 7 6 c removed old SCCS strings and inserted #ident BB e s 00001/00001/00056 d D 4.2 87/04/16 15:09:22 dc 6 5 c dc - Add Bull updates from 03/05/87 e s 00000/00000/00057 d D 4.1 87/02/20 13:33:04 build 5 4 c rolled rev to -r4 /dc e s 00000/00000/00057 d D 3.1 87/01/19 09:24:56 build 4 3 c rolled rev to -r3 /dc e s 00000/00000/00057 d D 2.1 87/01/19 09:24:56 build 3 2 c AUTO NULL DELTA e s 00001/00000/00056 d D 1.2 87/01/16 10:19:09 build 2 1 c add ident string /dc e s 00056/00000/00000 d D 1.1 87/01/09 15:41:23 build 1 0 c Placed under source control - dc e u U f b f n t T I 2 D 6 /* "%W% %E%" */ E 6 I 6 D 7 /* " %W% %E% " */ E 7 I 7 D 8 #ident " %W% %E% " E 8 I 8 /* " %W% %E% " */ E 8 E 7 E 6 E 2 I 1 /* Define the cursor control codes */ #define ESC 033 /* Escape for command */ /* Commands */ #define CUP 0101 /* Cursor up */ #define CDN 0102 /* Cursor down */ #define CRI 0103 /* Cursor right */ #define CLE 0104 /* Cursor left */ #define NL 0134 /* Terminal newline function */ #define HOME 0105 /* Cursor home */ #define VHOME 0106 /* cursor home to variable portion */ #define LCA 0107 /* Load cursor, followed by (x,y) in (col,row) */ #define CRTN 0133 /* Return cursor to beginning of line */ #define STB 0110 /* Start blink */ #define SPB 0111 /* Stop blink */ #define CS 0112 /* Clear Screen */ #define CM 0135 /* Clear Memory */ #define EEOL 0113 /* Erase to end of line */ #define EEOP 0114 /* Erase to end of page */ #define DC 0115 /* Delete character */ #define DL 0116 /* Delete line */ #define IC 0117 /* Insert character */ #define IL 0120 /* Insert line */ #define KBL 0121 /* keyboard lock */ #define KBU 0122 /* keyboard unlock */ #define ATAB 0123 /* Set column of tabs */ #define STAB 0124 /* Set single tab */ #define CTAB 0125 /* Clear Tabs */ #define USCRL 0126 /* Scroll up one line */ #define DSCRL 0127 /* Scroll down one line */ #define ASEG 0130 /* Advance segment */ #define BPRT 0131 /* Begin protect */ #define EPRT 0132 /* End protect */ #define SVSCN 0136 /* Define variable portion of screen (OS only) */ #define UVSCN 0137 /* Scroll Up variable portion of screen */ #define DVSCN 0140 /* Scroll Down variable portion of screen */ #define SVID 0141 /* Set Video Attributes */ #define CVID 0142 /* Clear Video Attributes */ #define DVID 0143 /* Define Video Attributes */ /* Video Attribute Definitions */ #define VID_NORM 000 /* normal */ #define VID_UL 001 /* underline */ #define VID_BLNK 002 /* blink */ #define VID_REV 004 /* reverse video */ #define VID_DIM 010 /* dim intensity */ #define VID_BOLD 020 /* bright intensity */ #define VID_OFF 040 /* blank out field */ #define BRK 000 /* transmit break */ #define HIQ 001 /* Put remainder of write on high priority queue. */ E 1 h24828 s 00001/00001/00030 d D 4.4 87/05/17 17:52:03 build 8 7 c changed #idents back again. -mkm e s 00001/00001/00030 d D 4.3 87/05/14 16:21:26 build 7 6 c removed old SCCS strings and inserted #ident BB e s 00001/00001/00030 d D 4.2 87/04/16 15:09:33 dc 6 5 c dc - Add Bull updates from 03/05/87 e s 00000/00000/00031 d D 4.1 87/02/20 13:33:07 build 5 4 c rolled rev to -r4 /dc e s 00000/00000/00031 d D 3.1 87/01/19 09:24:58 build 4 3 c rolled rev to -r3 /dc e s 00000/00000/00031 d D 2.1 87/01/19 09:24:58 build 3 2 c AUTO NULL DELTA e s 00001/00000/00030 d D 1.2 87/01/16 10:19:12 build 2 1 c add ident string /dc e s 00030/00000/00000 d D 1.1 87/01/09 15:41:25 build 1 0 c Placed under source control - dc e u U f b f n t T I 2 D 6 /* "%W% %E%" */ E 6 I 6 D 7 /* " %W% %E% " */ E 7 I 7 D 8 #ident " %W% %E% " E 8 I 8 /* " %W% %E% " */ E 8 E 7 E 6 E 2 I 1 /* * ioctl commands */ #define CMDTYPE(x) ((x)&0xff00) /* command type */ #define CTYPE ('c'<<8) /* cartridge tape command */ #define CTIORTM (CTYPE|0x21) /* tape mark read */ #define CTIOWTM (CTYPE|0x22) /* tape mark write */ #define CTIORWD (CTYPE|0x23) /* rewind tape */ #define CTIORAZ (CTYPE|0x24) /* erase tape */ #define CTIORTS (CTYPE|0x25) /* retension tape */ #define CTIOSBK (CTYPE|0x26) /* data block skip */ #define CTIOEOD (CTYPE|0x27) /* skip to end of data */ #define CTIOLOD (CTYPE|0x28) /* load of tape */ #define CTIOULD (CTYPE|0x29) /* unload of tape */ #define CTIOPRR (CTYPE|0x2A) /* removal control of tape */ #define CTIOALR (CTYPE|0x2B) /* removal control of tape */ #define CTIOSTS (CTYPE|0x2C) /* get extented status */ #define CTIORVR (CTYPE|0x2D) /* recover buffer data */ #define CTIOINQ (CTYPE|0x30) /* inquiry command */ #define CTIOMSL (CTYPE|0x31) /* mode select command */ #define CTIOMSN (CTYPE|0x32) /* mode sense command */ #define CTIOTRY (CTYPE|0x33) /* test ready command */ #define CTIOINIT (CTYPE|0x38) /* init type drive command */ #define CTIONOP (CTYPE|0x39) /* no operation command */ #define CTIORBK (CTYPE|0x46) /* data block read mode bloc */ #define CTIOWBK (CTYPE|0x66) /* data block write mode bloc */ #define CTIORBR (CTYPE|0xC6) /* data block read mode raw */ #define CTIOWBR (CTYPE|0xE6) /* data block write mode raw */ E 1 h20781 s 00001/00001/00093 d D 4.4 87/05/17 17:52:04 build 8 7 c changed #idents back again. -mkm e s 00001/00001/00093 d D 4.3 87/05/14 16:21:35 build 7 6 c removed old SCCS strings and inserted #ident BB e s 00001/00004/00093 d D 4.2 87/04/16 15:10:14 dc 6 5 c dc - Add Bull updates from 03/05/87 e s 00000/00000/00097 d D 4.1 87/02/20 13:33:10 build 5 4 c rolled rev to -r4 /dc e s 00000/00000/00097 d D 3.1 87/01/19 09:25:00 build 4 3 c rolled rev to -r3 /dc e s 00000/00000/00097 d D 2.1 87/01/19 09:25:00 build 3 2 c AUTO NULL DELTA e s 00001/00000/00096 d D 1.2 87/01/16 10:19:15 build 2 1 c add ident string /dc e s 00096/00000/00000 d D 1.1 87/01/09 15:41:27 build 1 0 c Placed under source control - dc e u U f b f n t T I 2 D 6 /* "%W% %E%" */ E 2 I 1 /* %Z% Bull-Sems SPIX %Q%/%M% %I% %E% */ E 6 I 6 D 7 /* " %W% %E% " */ E 7 I 7 D 8 #ident " %W% %E% " E 8 I 8 /* " %W% %E% " */ E 8 E 7 E 6 /************************************************/ /* specific sockets */ /************************************************/ #define KERNEL 1 #define INET 1 #define GSIGNAL signal #define IRELE(ip) iput(ip) #define IPUT(ip) \ {if ((ip)->i_flag & ILOCK == 0) panic ("IPUT"); \ prele(ip); \ iput(ip);} #define IUNLOCK(ip) prele(ip) #define NAMEI(x,y,z) namei ((x), (y)) /* Different number of arguments */ #define LOOKUP 0 /* perform name lookup only */ #define CREATE 1 /* setup for file creation */ #define DELETE 2 /* setup for file deletion */ #define FALLOC() falloc((struct inode *)0 ,0) /* falloc initialize */ /* f_flag et f_inode */ /* SOCKET debug masks */ #define DBsocket DB7 #define DBafunix DB7 #define DBmbuf DB8 #define DBif DB9 /* IT sockets */ #define splimp() spl7() #define splnet() spl7() /************************************************/ /* param.h */ /************************************************/ /* ipc and 4.2 bsd compatibility. * A Cluster seems to be the same size as a Click (1 click = 1 cluster) * Be careful how you define things in param.h. */ #define MBCLSIZE 1 #define MBCLSIZELOG2 0 #define NBPG 4096 /* bytes/page */ #define PGOFSET (NBPG-1)/* byte offset into page */ #define PGSHIFT 12 /* LOG2(NBPG) */ #define CLBYTES (MBCLSIZE*NBPG) #define CLOFSET (MBCLSIZE*NBPG-1) /* for clusters, like PGOFSET */ #define claligned(x) ((((int)(x))&CLOFSET)==0) #define CLOFF CLOFSET #define CLSHIFT (PGSHIFT+MBCLSIZELOG2) #define clbase(i) (i) #define clrnd(i) (i) /* * bit map related macros */ #define setbit(a,i) ((a)[(i)/NBBY] |= 1<<((i)%NBBY)) #define clrbit(a,i) ((a)[(i)/NBBY] &= ~(1<<((i)%NBBY))) #define isset(a,i) ((a)[(i)/NBBY] & (1<<((i)%NBBY))) #define isclr(a,i) (((a)[(i)/NBBY] & (1<<((i)%NBBY))) == 0) /* * Macros for fast min/max. */ #define MIN(a,b) (((a)<(b))?(a):(b)) #define MAX(a,b) (((a)>(b))?(a):(b)) /* * Macros for counting and rounding. */ #define howmany(x, y) (((x)+((y)-1))/(y)) #define roundup(x, y) ((((x)+((y)-1))/(y))*(y)) #ifdef INET /* include software interrupt code */ #define NETWORK #endif /************************************************/ /* types.h */ /************************************************/ typedef unsigned char u_char; typedef unsigned short u_short; typedef unsigned int u_int; typedef unsigned long u_long; E 1 h60147 s 00001/00001/00008 d D 4.4 87/05/17 17:52:06 build 8 7 c changed #idents back again. -mkm e s 00001/00001/00008 d D 4.3 87/05/14 16:21:45 build 7 6 c removed old SCCS strings and inserted #ident BB e s 00001/00002/00008 d D 4.2 87/04/16 15:10:28 dc 6 5 c dc - Add Bull updates from 03/05/87 e s 00000/00000/00010 d D 4.1 87/02/20 13:33:12 build 5 4 c rolled rev to -r4 /dc e s 00000/00000/00010 d D 3.1 87/01/19 09:25:02 build 4 3 c rolled rev to -r3 /dc e s 00000/00000/00010 d D 2.1 87/01/19 09:25:02 build 3 2 c AUTO NULL DELTA e s 00001/00000/00009 d D 1.2 87/01/16 10:19:18 build 2 1 c add ident string /dc e s 00009/00000/00000 d D 1.1 87/01/09 15:41:29 build 1 0 c Placed under source control - dc e u U f b f n t T I 2 D 6 /* "%W% %E%" */ E 2 I 1 /* @(#)dir.h 6.1 */ E 6 I 6 D 7 /* " %W% %E% " */ E 7 I 7 D 8 #ident " %W% %E% " E 8 I 8 /* " %W% %E% " */ E 8 E 7 E 6 #ifndef DIRSIZ #define DIRSIZ 14 #endif struct direct { ino_t d_ino; char d_name[DIRSIZ]; }; E 1 h11270 s 00001/00001/00012 d D 4.5 87/05/17 17:52:07 build 9 8 c changed #idents back again. -mkm e s 00001/00001/00012 d D 4.4 87/05/14 16:21:52 build 8 7 c removed old SCCS strings and inserted #ident BB e s 00000/00000/00013 d D 4.3 87/04/22 18:26:04 build 7 6 c null delta e s 00001/00002/00012 d D 4.2 87/04/16 15:10:43 dc 6 5 c dc - Add Bull updates from 03/05/87 e s 00000/00000/00014 d D 4.1 87/02/20 13:33:15 build 5 4 c rolled rev to -r4 /dc e s 00000/00000/00014 d D 3.1 87/01/19 09:25:04 build 4 3 c rolled rev to -r3 /dc e s 00000/00000/00014 d D 2.1 87/01/19 09:25:04 build 3 2 c AUTO NULL DELTA e s 00001/00000/00013 d D 1.2 87/01/16 10:19:20 build 2 1 c add ident string /dc e s 00013/00000/00000 d D 1.1 87/01/09 15:41:31 build 1 0 c Placed under source control - dc e u U f b f n t T I 2 D 6 /* "%W% %E%" */ E 2 I 1 /* %Z% Bull-Sems SPIX %Q%/%M% %I% %E% */ E 6 I 6 D 8 /* " %W% %E% " */ E 8 I 8 D 9 #ident " %W% %E% " E 9 I 9 /* " %W% %E% " */ E 9 E 8 E 6 /* * Structure per communications domain. */ struct domain { int dom_family; /* AF_xxx */ char *dom_name; struct protosw *dom_protosw, *dom_protoswNPROTOSW; struct domain *dom_next; }; struct domain *domains; E 1 h54270 s 00001/00001/00033 d D 4.4 87/05/17 17:52:08 build 8 7 c changed #idents back again. -mkm e s 00001/00001/00033 d D 4.3 87/05/14 16:22:02 build 7 6 c removed old SCCS strings and inserted #ident BB e s 00001/00001/00033 d D 4.2 87/04/16 15:10:54 dc 6 5 c dc - Add Bull updates from 03/05/87 e s 00000/00000/00034 d D 4.1 87/02/20 13:33:17 build 5 4 c rolled rev to -r4 /dc e s 00000/00000/00034 d D 3.1 87/01/19 09:25:06 build 4 3 c rolled rev to -r3 /dc e s 00000/00000/00034 d D 2.1 87/01/19 09:25:06 build 3 2 c AUTO NULL DELTA e s 00001/00000/00033 d D 1.2 87/01/16 10:19:23 build 2 1 c add ident string /dc e s 00033/00000/00000 d D 1.1 87/01/09 15:41:32 build 1 0 c Placed under source control - dc e u U f b f n t T I 2 D 6 /* "%W% %E%" */ E 6 I 6 D 7 /* " %W% %E% " */ E 7 I 7 D 8 #ident " %W% %E% " E 8 I 8 /* " %W% %E% " */ E 8 E 7 E 6 E 2 I 1 /* * "True" major device numbers. These correspond * to standard positions in the configuration * table, but are used for error logging * purposes only. */ #define SMD0 0 #define MT0 1 /* * IO statistics are kept for each physical unit of each * block device (within the driver). Primary purpose is * to establish a guesstimate of error rates during * error logging. */ struct iostat { long io_ops; /* number of read/writes */ long io_misc; /* number of "other" operations */ ushort io_unlog; /* number of unlogged errors */ }; /* * structure for system accounting */ struct iotime { struct iostat ios; long io_bcnt; /* total blocks transferred */ time_t io_act; /* total controller active time */ time_t io_resp; /* total block response time */ }; #define io_cnt ios.io_ops E 1 2 V U T S R Q P O N M L K J I H G F E D C B A @ ? > = < ; : 9 8 7 6 5 4 3 2 1 0 / . - , + * ) ( ' & %h32398 s 00001/00001/00023 d D 4.4 87/05/17 17:52:10 build 8 7 c changed #idents back again. -mkm e s 00001/00001/00023 d D 4.3 87/05/14 16:22:22 build 7 6 c removed old SCCS strings and inserted #ident BB e s 00001/00002/00023 d D 4.2 87/04/16 15:11:19 dc 6 5 c dc - Add Bull updates from 03/05/87 e s 00000/00000/00025 d D 4.1 87/02/20 13:33:22 build 5 4 c rolled rev to -r4 /dc e s 00000/00000/00025 d D 3.1 87/01/19 09:25:10 build 4 3 c rolled rev to -r3 /dc e s 00000/00000/00025 d D 2.1 87/01/19 09:25:10 build 3 2 c AUTO NULL DELTA e s 00001/00000/00024 d D 1.2 87/01/16 10:19:29 build 2 1 c add ident string /dc e s 00024/00000/00000 d D 1.1 87/01/09 15:41:34 build 1 0 c Placed under source control - dc e u U f b f n t T I 2 D 6 /* "%W% %E%" */ E 2 I 1 /* @(#)err.h 6.1 */ E 6 I 6 D 7 /* " %W% %E% " */ E 7 I 7 D 8 #ident " %W% %E% " E 8 I 8 /* " %W% %E% " */ E 8 E 7 E 6 /* * structure of the err buffer area */ #define NESLOT 20 #define E_LOG 01 #define E_SLP 02 struct err { int e_nslot; /* number of errslots */ int e_flag; /* state flags */ struct errhdr **e_org; /* origin of buffer pool */ struct errhdr **e_nxt; /* next slot to allocate */ struct errslot { int slot[8]; } e_slot[NESLOT]; /* storage area */ struct map e_map[(NESLOT+3)/2]; /* free space in map */ struct errhdr *e_ptrs[NESLOT]; /* pointer to logged errors */ }; extern struct err err; struct errhdr *geteslot(); struct errhdr *geterec(); E 1 h26612 s 00001/00001/00090 d D 4.4 87/05/17 17:52:11 build 8 7 c changed #idents back again. -mkm e s 00001/00001/00090 d D 4.3 87/05/14 16:22:33 build 7 6 c removed old SCCS strings and inserted #ident BB e s 00002/00002/00089 d D 4.2 87/04/16 15:11:33 dc 6 5 c dc - Add Bull updates from 03/05/87 e s 00000/00000/00091 d D 4.1 87/02/20 13:33:25 build 5 4 c rolled rev to -r4 /dc e s 00000/00000/00091 d D 3.1 87/01/19 09:25:13 build 4 3 c rolled rev to -r3 /dc e s 00000/00000/00091 d D 2.1 87/01/19 09:25:13 build 3 2 c AUTO NULL DELTA e s 00001/00000/00090 d D 1.2 87/01/16 10:19:32 build 2 1 c add ident string /dc e s 00090/00000/00000 d D 1.1 87/01/09 15:41:36 build 1 0 c Placed under source control - dc e u U f b f n t T I 2 D 6 /* "%W% %E%" */ E 2 I 1 /* @(#)errno.h 6.2 */ E 6 I 6 D 7 /* " %W% %E% " */ E 7 I 7 D 8 #ident " %W% %E% " E 8 I 8 /* " %W% %E% " */ E 8 E 7 E 6 /* * Error codes */ #define EPERM 1 /* Not super-user */ #define ENOENT 2 /* No such file or directory */ #define ESRCH 3 /* No such process */ #define EINTR 4 /* interrupted system call */ #define EIO 5 /* I/O error */ #define ENXIO 6 /* No such device or address */ #define E2BIG 7 /* Arg list too long */ #define ENOEXEC 8 /* Exec format error */ #define EBADF 9 /* Bad file number */ #define ECHILD 10 /* No children */ #define EAGAIN 11 /* No more processes */ #define ENOMEM 12 /* Not enough core */ #define EACCES 13 /* Permission denied */ #define EFAULT 14 /* Bad address */ #define ENOTBLK 15 /* Block device required */ #define EBUSY 16 /* Mount device busy */ #define EEXIST 17 /* File exists */ #define EXDEV 18 /* Cross-device link */ #define ENODEV 19 /* No such device */ #define ENOTDIR 20 /* Not a directory */ #define EISDIR 21 /* Is a directory */ #define EINVAL 22 /* Invalid argument */ #define ENFILE 23 /* File table overflow */ #define EMFILE 24 /* Too many open files */ #define ENOTTY 25 /* Not a typewriter */ #define ETXTBSY 26 /* Text file busy */ #define EFBIG 27 /* File too large */ #define ENOSPC 28 /* No space left on device */ #define ESPIPE 29 /* Illegal seek */ #define EROFS 30 /* Read only file system */ #define EMLINK 31 /* Too many links */ #define EPIPE 32 /* Broken pipe */ #define EDOM 33 /* Math arg out of domain of func */ #define ERANGE 34 /* Math result not representable */ #define ENOMSG 35 /* No message of desired type */ #define EIDRM 36 /* Identifier removed */ #define ECHRNG 37 /* Channel number out of range */ #define EL2NSYNC 38 /* Level 2 not synchronized */ #define EL3HLT 39 /* Level 3 halted */ #define EL3RST 40 /* Level 3 reset */ #define ELNRNG 41 /* Link number out of range */ #define EUNATCH 42 /* Protocol driver not attached */ #define ENOCSI 43 /* No CSI structure available */ #define EL2HLT 44 /* Level 2 halted */ #define EDEADLK 45 /* Record locking deadlock */ I 6 #define ENOLCK 46 /* No more file locking headers availabe*/ E 6 /* #ifdef SOCKET */ #define EWOULDBLOCK 135 /* Operation would block */ #define EINPROGRESS 136 /* Operation now in progress */ #define EALREADY 137 /* Operation already in progress */ #define ENOTSOCK 138 /* Socket operation on non-socket */ #define EDESTADDRREQ 139 /* Destination address required */ #define EMSGSIZE 140 /* Message too long */ #define EPROTOTYPE 141 /* Protocol wrong type for socket */ #define ENOPROTOOPT 142 /* Protocol not available */ #define EPROTONOSUPPORT 143 /* Protocol not supported */ #define ESOCKTNOSUPPORT 144 /* Socket type not supported */ #define EOPNOTSUPP 145 /* Operation not supported on socket */ #define EPFNOSUPPORT 146 /* Protocol family not supported */ #define EAFNOSUPPORT 147 /* Addr. family not supported by proto family */ #define EADDRINUSE 148 /* Address already in use */ #define EADDRNOTAVAIL 149 /* Can't assign requested address */ #define ENETDOWN 150 /* Network is down */ #define ENETUNREACH 151 /* Network is unreachable */ #define ENETRESET 152 /* Network dropped connection on reset*/ #define ECONNABORTED 153 /* Software caused connection abort */ #define ECONNRESET 154 /* Connection reset by peer */ #define ENOBUFS 155 /* No buffer space available */ #define EISCONN 156 /* Socket is already connected */ #define ENOTCONN 157 /* Socket is not connected */ #define ESHUTDOWN 158 /* Can't send after socket shutdown */ #define ETOOMANYREFS 159 /* Too many references: can't splice */ #define ETIMEDOUT 160 /* Connection timed out */ #define ECONNREFUSED 161 /* Connection refused */ #define ELOOP 162 /* Too many levels of symbolic links */ #define ENAMETOOLONG 163 /* File name too long */ #define EHOSTDOWN 164 /* Host is down */ #define EHOSTUNREACH 165 /* No route to host */ #define ENOTEMPTY 166 /* Directory not empty */ #define EPROCLIM 167 /* Too many processes */ #define EUSERS 168 /* Too many users */ #define EDQUOT 169 /* Disc quota exceeded */ /* #endif SOCKET */ E 1 h57622 s 00001/00001/00005 d D 4.4 87/05/17 17:52:13 build 8 7 c changed #idents back again. -mkm e s 00001/00001/00005 d D 4.3 87/05/14 16:22:41 build 7 6 c removed old SCCS strings and inserted #ident BB e s 00001/00002/00005 d D 4.2 87/04/16 15:11:44 dc 6 5 c dc - Add Bull updates from 03/05/87 e s 00000/00000/00007 d D 4.1 87/02/20 13:33:27 build 5 4 c rolled rev to -r4 /dc e s 00000/00000/00007 d D 3.1 87/01/19 09:25:15 build 4 3 c rolled rev to -r3 /dc e s 00000/00000/00007 d D 2.1 87/01/19 09:25:15 build 3 2 c AUTO NULL DELTA e s 00001/00000/00006 d D 1.2 87/01/16 10:19:35 build 2 1 c add ident string /dc e s 00006/00000/00000 d D 1.1 87/01/09 15:41:37 build 1 0 c Placed under source control - dc e u U f b f n t T I 2 D 6 /* "%W% %E%" */ E 2 I 1 /* @(#)fblk.h 6.1 */ E 6 I 6 D 7 /* " %W% %E% " */ E 7 I 7 D 8 #ident " %W% %E% " E 8 I 8 /* " %W% %E% " */ E 8 E 7 E 6 struct fblk { int df_nfree; daddr_t df_free[NICFREE]; }; E 1 h53925 s 00001/00001/00193 d D 4.4 87/05/17 17:52:14 build 8 7 c changed #idents back again. -mkm e s 00001/00001/00193 d D 4.3 87/05/14 16:22:48 build 7 6 c removed old SCCS strings and inserted #ident BB e s 00001/00002/00193 d D 4.2 87/04/16 15:11:57 dc 6 5 c dc - Add Bull updates from 03/05/87 e s 00000/00000/00195 d D 4.1 87/02/20 13:33:30 build 5 4 c rolled rev to -r4 /dc e s 00000/00000/00195 d D 3.1 87/01/19 09:25:17 build 4 3 c rolled rev to -r3 /dc e s 00000/00000/00195 d D 2.1 87/01/19 09:25:17 build 3 2 c AUTO NULL DELTA e s 00001/00000/00194 d D 1.2 87/01/16 10:19:38 build 2 1 c add ident string /dc e s 00194/00000/00000 d D 1.1 87/01/09 15:41:38 build 1 0 c Placed under source control - dc e u U f b f n t T I 2 D 6 /* "%W% %E%" */ E 2 I 1 /* @(#) fdlp.h 2.1 3/19/85 11:48:25 */ E 6 I 6 D 7 /* " %W% %E% " */ E 7 I 7 D 8 #ident " %W% %E% " E 8 I 8 /* " %W% %E% " */ E 8 E 7 E 6 /* TTY COMMANDS TO START I/O */ #define TTY0_B_WRITE 0x80000000 #define TTY1_B_WRITE 0x81000000 #define TTY2_B_WRITE 0x82000000 #define TTY3_B_WRITE 0x83000000 #define TTY0_B_READ 0x88000000 #define TTY1_B_READ 0x89000000 #define TTY2_B_READ 0x8A000000 #define TTY3_B_READ 0x8B000000 #define TTY0_CNTRL 0x8C000000 #define TTY1_CNTRL 0x8D000000 #define TTY2_CNTRL 0x8E000000 #define TTY3_CNTRL 0x8F000000 #define TTY0_S_READ 0x98000000 #define TTY1_S_READ 0x99000000 #define TTY2_S_READ 0x9A000000 #define TTY3_S_READ 0x9B000000 #define TTY0_EXTST 0xC8000000 #define TTY1_EXTST 0xC9000000 #define TTY2_EXTST 0xCA000000 #define TTY3_EXTST 0xCB000000 #define LPCMD 0x84000000 /* FDLP UNIT NUMBER ON INTERRUPT */ #define TTYW0 0x0 #define TTYW1 0x1 #define TTYW2 0x2 #define TTYW3 0x3 #define LCXDP 0x4 #define LVERS 0x5 #define FLOPL 0x6 #define FLOPR 0x7 #define TTYR0 0x8 #define TTYR1 0x9 #define TTYR2 0xA #define TTYR3 0xB #define TTYC0 0xC #define TTYC1 0xD #define TTYC2 0xE #define TTYC3 0xF /* Terminal port write device control block */ struct dcbttyw { char gorder; char sorder; char gstat; char sstat; char retries; unsigned addr:24; ushort count; ushort xcount; }; /* Terminal port control device control block */ struct dcbttyc { char gorder; char param1; char param2; char param3; }; /* Terminal port read device control block */ struct dcbttyr { char gorder; char sorder; char gstat; char sstat; char retries; unsigned addr:24; ushort count; ushort xcount; int fill; }; /* Line printer device control block */ struct dcblp { char gorder; char sorder; char gstat; char sstat; char retries; unsigned addr:24; ushort count; ushort xcount; int fill[5]; }; /* FDLP structure control blocs */ struct fdlp_dcb { struct dcbttyw dcbttyw0; struct dcbttyc dcbttyc0; struct dcbttyr dcbttyr0; struct dcbttyw dcbttyw1; struct dcbttyc dcbttyc1; struct dcbttyr dcbttyr1; struct dcbttyw dcbttyw2; struct dcbttyc dcbttyc2; struct dcbttyr dcbttyr2; struct dcbttyw dcbttyw3; struct dcbttyc dcbttyc3; struct dcbttyr dcbttyr3; struct dcblp dcblp; struct dcblp dcbvs; int fill[8]; int fill1[7]; struct fdlp_dcb *address; }; /* Specific values for the FDLP Board */ #define GTERM 0 #define STERM 1 #define GBAUD 2 #define SBAUD 3 #define GSIO 4 #define SSIO 5 /* These defines are for the TERM-TYPE byte in control order 0 and 1 */ #define TTIXON 128 #define TTIXOFF 64 #define TTSTATE 16 #define TTNOPE 8 /* These defines are for the PAR-SIO chips in control order 4 and 5 */ #define UNCH4 16+32 #define PENABLE 1 #define OPAR 2 #define ONESB 4 #define TWOSB 8+4 #define X1CLK 0 #define X16CLK 64 #define X32CLK 128 #define X64CLK 128+64 #define UNCH3 32+16+8+4+2 #define RCVENB 1 #define RBITS6 128 #define RBITS7 64 #define UNCH5 128+16+8+4+2+1 #define RTS 2 #define TRXENB 8 #define WBITS6 64 #define WBITS7 32 #define DTR 128 #define BRK 128 #define CTS 32 #define DCD 8 /* Terminal augmented tty structure for specific SPS9 informations */ struct al { unsigned char vtrm[SZTRM]; ushort state; char status; char termtype; char baudrate; char parm1; char parm2; char parm3; }; /* Line Printer Type Devices I/O Control */ struct fdlp_lpdt { struct clist l_outq; int lp_flags; unsigned char lp_ind; unsigned char lp_line; unsigned char lp_col; unsigned char lp_tabs; unsigned char lp_ccc; unsigned char lp_mlc; }; E 1 h27062 s 00001/00001/00055 d D 4.4 87/05/17 17:52:15 build 8 7 c changed #idents back again. -mkm e s 00001/00001/00055 d D 4.3 87/05/14 16:22:59 build 7 6 c removed old SCCS strings and inserted #ident BB e s 00001/00002/00055 d D 4.2 87/04/16 15:12:08 dc 6 5 c dc - Add Bull updates from 03/05/87 e s 00000/00000/00057 d D 4.1 87/02/20 13:33:32 build 5 4 c rolled rev to -r4 /dc e s 00000/00000/00057 d D 3.1 87/01/19 09:25:19 build 4 3 c rolled rev to -r3 /dc e s 00000/00000/00057 d D 2.1 87/01/19 09:25:19 build 3 2 c AUTO NULL DELTA e s 00001/00000/00056 d D 1.2 87/01/16 10:19:41 build 2 1 c add ident string /dc e s 00056/00000/00000 d D 1.1 87/01/09 15:41:39 build 1 0 c Placed under source control - dc e u U f b f n t T I 2 D 6 /* "%W% %E%" */ E 2 I 1 /* @(#)file.h 6.1 */ E 6 I 6 D 7 /* " %W% %E% " */ E 7 I 7 D 8 #ident " %W% %E% " E 8 I 8 /* " %W% %E% " */ E 8 E 7 E 6 /* * One file structure is allocated for each open/creat/pipe call. * Main use is to hold the read/write pointer associated with * each open file. */ struct file { char f_flag; cnt_t f_count; /* reference count */ union { struct inode *f_uinode; /* pointer to inode structure */ struct file *f_unext; /* next entry in freelist */ /* #ifdef SOCKET */ struct socket *f_usocket; /* pointer to socket */ /* #endif SOCKET */ } f_up; union { off_t f_off; /* read/write character pointer */ } f_un; /* #ifdef SOCKET */ short f_type; /* descriptor socket or inode */ short f_msgcount; /* ref. from message queue (uipc) */ /* #endif SOCKET */ }; #define f_inode f_up.f_uinode #define f_next f_up.f_unext /* #ifdef SOCKET */ #define f_data f_up.f_usocket /* #endif SOCKET */ #define f_offset f_un.f_off extern struct file file[]; /* The file table itself */ extern struct file *ffreelist; /* Head of freelist pool */ /* flags */ #define FOPEN (-1) #define FREAD 00001 #define FWRITE 00002 #define FNDELAY 00004 #define FAPPEND 00010 #define FSYNC 00020 #define FMASK 00377 /* #ifdef SOCKET */ #define FMARK 00120 /* mark during unp_gc() */ #define FDEFER 00140 /* defer to next gc() */ #define DTYPE_INODE 1 #define DTYPE_SOCKET 2 /* #endif SOCKET */ /* open only modes */ #define FCREAT 00400 #define FTRUNC 01000 #define FEXCL 02000 E 1 h03122 s 00001/00001/00108 d D 4.4 87/05/17 17:52:17 build 8 7 c changed #idents back again. -mkm e s 00001/00001/00108 d D 4.3 87/05/14 16:23:10 build 7 6 c removed old SCCS strings and inserted #ident BB e s 00003/00005/00106 d D 4.2 87/04/16 15:12:56 dc 6 5 c dc - Add Bull updates from 03/05/87 e s 00000/00000/00111 d D 4.1 87/02/20 13:33:34 build 5 4 c rolled rev to -r4 /dc e s 00000/00000/00111 d D 3.1 87/01/19 09:25:21 build 4 3 c rolled rev to -r3 /dc e s 00000/00000/00111 d D 2.1 87/01/19 09:25:21 build 3 2 c AUTO NULL DELTA e s 00001/00000/00110 d D 1.2 87/01/16 10:19:44 build 2 1 c add ident string /dc e s 00110/00000/00000 d D 1.1 87/01/09 15:41:41 build 1 0 c Placed under source control - dc e u U f b f n t T I 2 D 6 /* "%W% %E%" */ E 2 I 1 /* < %W% %E% > */ E 6 I 6 D 7 /* " %W% %E% " */ E 7 I 7 D 8 #ident " %W% %E% " E 8 I 8 /* " %W% %E% " */ E 8 E 7 E 6 struct filehdr { unsigned short f_magic; /* magic number */ unsigned short f_nscns; /* number of sections */ long f_timdat; /* time & date stamp */ long f_symptr; /* file pointer to symtab */ long f_nsyms; /* number of symtab entries */ unsigned short f_opthdr; /* sizeof(optional hdr) */ unsigned short f_flags; /* flags */ }; /* * Bits for f_flags: * * F_RELFLG relocation info stripped from file * F_EXEC file is executable (i.e. no unresolved * externel references) * F_LNNO line nunbers stripped from file * F_LSYMS local symbols stripped from file * F_MINMAL this is a minimal object file (".m") output of fextract * F_UPDATE this is a fully bound update file, output of ogen * F_SWABD this file has had its bytes swabbed (in names) * F_AR16WR this file has the byte ordering of an AR16WR (e.g. 11/70) machine * (it was created there, or was produced by conv) * F_AR32WR this file has the byte ordering of an AR32WR machine(e.g. vax) * F_AR32W this file has the byte ordering of an AR32W machine (e.g. 3b,maxi) * F_PATCH file contains "patch" list in optional header * F_NODF (minimal file only) no decision functions for * replaced functions */ #define F_RELFLG 0000001 #define F_EXEC 0000002 #define F_LNNO 0000004 #define F_LSYMS 0000010 #define F_MINMAL 0000020 #define F_UPDATE 0000040 #define F_SWABD 0000100 #define F_AR16WR 0000200 #define F_AR32WR 0000400 #define F_AR32W 0001000 #define F_PATCH 0002000 #define F_NODF 0002000 /* * Magic Numbers */ /* Basic-16 */ #define B16MAGIC 0502 #define BTVMAGIC 0503 /* x86 */ #define X86MAGIC 0510 #define XTVMAGIC 0511 /* n3b */ /* * NOTE: For New 3B, the old values of magic numbers * will be in the optional header in the structure * "aouthdr" (identical to old 3B aouthdr). */ #define N3BMAGIC 0550 #define NTVMAGIC 0551 /* XL */ #define XLMAGIC 0540 /* MAC-32 3b-5 */ #define FBOMAGIC 0560 #define RBOMAGIC 0562 #define MTVMAGIC 0561 /* VAX 11/780 and VAX 11/750 */ /* writeable text segments */ #define VAXWRMAGIC 0570 /* readonly sharable text segments */ #define VAXROMAGIC 0575 /* Motorola 68000 */ #define MC68MAGIC 0520 #define MC68TVMAGIC 0521 #define M68MAGIC 0210 #define M68TVMAGIC 0211 /* IBM 370 */ #define U370WRMAGIC 0530 /* writeble text segments */ #define U370ROMAGIC 0535 /* readonly sharable text segments */ /* SPS 9 */ #define SPS9WRMAGIC 0560 /* writeable text segment */ #define SPS9ROMAGIC 0565 /* read only sharable text segment */ /* SM90 */ D 6 #define SMWRMAGIC 0521 /* writeable text segment */ #define SMROMAGIC 0520 /* read only sharable text segment */ E 6 I 6 #define SMWRMAGIC 0520 /* writeable text segment */ #define SMROMAGIC 0521 /* read only sharable text segment */ E 6 #define FILHDR struct filehdr #define FILHSZ sizeof(FILHDR) E 1 h57761 s 00001/00001/00055 d D 4.4 87/05/17 17:52:18 build 8 7 c changed #idents back again. -mkm e s 00001/00001/00055 d D 4.3 87/05/14 16:23:22 build 7 6 c removed old SCCS strings and inserted #ident BB e s 00001/00002/00055 d D 4.2 87/04/16 15:13:21 dc 6 5 c dc - Add Bull updates from 03/05/87 e s 00000/00000/00057 d D 4.1 87/02/20 13:33:37 build 5 4 c rolled rev to -r4 /dc e s 00000/00000/00057 d D 3.1 87/01/19 09:25:24 build 4 3 c rolled rev to -r3 /dc e s 00000/00000/00057 d D 2.1 87/01/19 09:25:24 build 3 2 c AUTO NULL DELTA e s 00001/00000/00056 d D 1.2 87/01/16 10:19:47 build 2 1 c add ident string /dc e s 00056/00000/00000 d D 1.1 87/01/09 15:41:44 build 1 0 c Placed under source control - dc e u U f b f n t T I 2 D 6 /* "%W% %E%" */ E 2 I 1 /* @(#)flock.h 1.4 */ E 6 I 6 D 7 /* " %W% %E% " */ E 7 I 7 D 8 #ident " %W% %E% " E 8 I 8 /* " %W% %E% " */ E 8 E 7 E 6 /* file segment locking set data type - information passed to system by user */ /* it is also found in fcntl.h */ #ifndef F_RDLCK struct flock { short l_type; short l_whence; long l_start; long l_len; /* len = 0 means until end of file */ int l_pid; }; #endif /* file segment locking types */ #define F_RDLCK 01 /* Read lock */ #define F_WRLCK 02 /* Write lock */ #define F_UNLCK 03 /* Remove lock(s) */ /* file locking structure (connected to file table entry) */ struct filock { struct flock set; /* contains type, start, and length */ union { int wakeflg; /* for locks sleeping on this one */ int blkpid; /* pid of blocking lock * (for sleeping locks only) */ } stat; struct filock *prev; struct filock *next; }; /* table to associate files with chain of locks */ struct flino { dev_t fl_dev; ino_t fl_number; int fl_refcnt; /* # of procs currently referencing this flino */ struct filock *fl_flck; /* pointer to chain of locks for this file */ struct flino *prev; struct flino *next; }; /* file and record locking configuration structure */ /* record and file use totals may overflow */ struct flckinfo { long recs; /* number of records configured on system */ long fils; /* number of file headers configured on system */ long reccnt; /* number of records currently in use */ long filcnt; /* number of file headers currently in use */ long rectot; /* number of records used since system boot */ long filtot; /* number of file headers used since system boot */ }; extern struct flckinfo flckinfo; extern struct filock flox[]; extern struct flino flinotab[]; E 1 h25649 s 00001/00001/00026 d D 4.4 87/05/17 17:52:19 build 8 7 c changed #idents back again. -mkm e s 00001/00001/00026 d D 4.3 87/05/14 16:23:32 build 7 6 c removed old SCCS strings and inserted #ident BB e s 00001/00002/00026 d D 4.2 87/04/16 15:13:31 dc 6 5 c dc - Add Bull updates from 03/05/87 e s 00000/00000/00028 d D 4.1 87/02/20 13:33:39 build 5 4 c rolled rev to -r4 /dc e s 00000/00000/00028 d D 3.1 87/01/19 09:25:26 build 4 3 c rolled rev to -r3 /dc e s 00000/00000/00028 d D 2.1 87/01/19 09:25:26 build 3 2 c AUTO NULL DELTA e s 00001/00000/00027 d D 1.2 87/01/16 10:19:50 build 2 1 c add ident string /dc e s 00027/00000/00000 d D 1.1 87/01/09 15:41:45 build 1 0 c Placed under source control - dc e u U f b f n t T I 2 D 6 /* "%W% %E%" */ E 2 I 1 /* @(#)init.h 6.4 */ E 6 I 6 D 7 /* " %W% %E% " */ E 7 I 7 D 8 #ident " %W% %E% " E 8 I 8 /* " %W% %E% " */ E 8 E 7 E 6 extern int clkstart(),cinit(),binit(),errinit(),iinit(),inoinit(); extern int finit(); extern int flckinit(); extern int iomachdep(); #ifdef SOCKET_0 extern int socinit(); #endif /* SOCKET */ /* Array containing the addresses of the various initializing */ /* routines executed by "main" at boot time. */ int (*init_tbl[])() = { iomachdep, inoinit, clkstart, cinit, binit, errinit, finit, iinit, flckinit, #ifdef SOCKET_0 socinit, #endif /* SOCKET */ 0 }; E 1 h31322 s 00001/00001/00018 d D 4.4 87/05/17 17:52:20 build 8 7 c changed #idents back again. -mkm e s 00001/00001/00018 d D 4.3 87/05/14 16:23:42 build 7 6 c removed old SCCS strings and inserted #ident BB e s 00001/00002/00018 d D 4.2 87/04/16 15:13:51 dc 6 5 c dc - Add Bull updates from 03/05/87 e s 00000/00000/00020 d D 4.1 87/02/20 13:33:42 build 5 4 c rolled rev to -r4 /dc e s 00000/00000/00020 d D 3.1 87/01/19 09:25:28 build 4 3 c rolled rev to -r3 /dc e s 00000/00000/00020 d D 2.1 87/01/19 09:25:28 build 3 2 c AUTO NULL DELTA e s 00001/00000/00019 d D 1.2 87/01/16 10:19:52 build 2 1 c add ident string /dc e s 00019/00000/00000 d D 1.1 87/01/09 15:41:46 build 1 0 c Placed under source control - dc e u U f b f n t T I 2 D 6 /* "%W% %E%" */ E 2 I 1 /* @(#)ino.h 6.1 */ E 6 I 6 D 7 /* " %W% %E% " */ E 7 I 7 D 8 #ident " %W% %E% " E 8 I 8 /* " %W% %E% " */ E 8 E 7 E 6 /* Inode structure as it appears on a disk block. */ struct dinode { ushort di_mode; /* mode and type of file */ short di_nlink; /* number of links to file */ ushort di_uid; /* owner's user id */ ushort di_gid; /* owner's group id */ off_t di_size; /* number of bytes in file */ char di_addr[40]; /* disk block addresses */ time_t di_atime; /* time last accessed */ time_t di_mtime; /* time last modified */ time_t di_ctime; /* time created */ }; /* * the 40 address bytes: * 39 used; 13 addresses * of 3 bytes each. */ E 1 h16885 s 00001/00001/00093 d D 4.4 87/05/17 17:52:21 build 8 7 c changed #idents back again. -mkm e s 00001/00001/00093 d D 4.3 87/05/14 16:23:52 build 7 6 c removed old SCCS strings and inserted #ident BB e s 00001/00002/00093 d D 4.2 87/04/16 15:14:04 dc 6 5 c dc - Add Bull updates from 03/05/87 e s 00000/00000/00095 d D 4.1 87/02/20 13:33:44 build 5 4 c rolled rev to -r4 /dc e s 00000/00000/00095 d D 3.1 87/01/19 09:25:30 build 4 3 c rolled rev to -r3 /dc e s 00000/00000/00095 d D 2.1 87/01/19 09:25:30 build 3 2 c AUTO NULL DELTA e s 00001/00000/00094 d D 1.2 87/01/16 10:19:55 build 2 1 c add ident string /dc e s 00094/00000/00000 d D 1.1 87/01/09 15:41:47 build 1 0 c Placed under source control - dc e u U f b f n t T I 2 D 6 /* "%W% %E%" */ E 2 I 1 /* @(#)inode.h 6.3 */ E 6 I 6 D 7 /* " %W% %E% " */ E 7 I 7 D 8 #ident " %W% %E% " E 8 I 8 /* " %W% %E% " */ E 8 E 7 E 6 /* * The I node is the focus of all * file activity in unix. There is a unique * inode allocated for each active file, * each current directory, each mounted-on * file, text file, and the root. An inode is 'named' * by its dev/inumber pair. (iget/iget.c) * Data, from mode on, is read in * from permanent inode on volume. */ #define NADDR 13 #define NSADDR (NADDR*sizeof(daddr_t)/sizeof(short)) struct inode { struct inode *i_forw; /* inode hash chain */ struct inode *i_back; /* '' */ struct inode *av_forw; /* freelist chain */ struct inode *av_back; /* '' */ short i_flag; cnt_t i_count; /* reference count */ dev_t i_dev; /* device where inode resides */ ino_t i_number; /* i number, 1-to-1 with device address */ ushort i_mode; short i_nlink; /* directory entries */ ushort i_uid; /* owner */ ushort i_gid; /* group of owner */ off_t i_size; /* size of file */ struct { union { daddr_t i_a[NADDR]; /* if normal file/directory */ short i_f[NSADDR]; /* if fifio's */ /* #ifdef SOCKET */ struct socket *i_s; /*if socket "pathname" */ /* #endif SOCKET */ } i_p; daddr_t i_l; /* last logical block read (for read-ahead) */ }i_blks; long *i_map; /* Ptr to the block number map for the file */ }; extern struct inode inode[]; /* The inode table itself */ /* flags */ #define ILOCK 01 /* inode is locked */ #define IUPD 02 /* file has been modified */ #define IACC 04 /* inode access time to be updated */ #define IMOUNT 010 /* inode is mounted on */ #define IWANT 020 /* some process waiting on lock */ #define ITEXT 040 /* inode is pure text prototype */ #define ICHG 0100 /* inode has been changed */ #define ISYN 0200 /* do synchronous write for iupdate */ /* modes */ #define IFMT 0170000 /* type of file */ #define IFDIR 0040000 /* directory */ #define IFCHR 0020000 /* character special */ #define IFBLK 0060000 /* block special */ #define IFREG 0100000 /* regular */ #define IFMPC 0030000 /* multiplexed char special */ #define IFMPB 0070000 /* multiplexed block special */ #define IFIFO 0010000 /* fifo special */ /* #ifdef SOCKET */ #define IFSOCK 0140000 /* socket special */ /* #endif SOCKET */ #define ISUID 04000 /* set user id on execution */ #define ISGID 02000 /* set group id on execution */ #define ISVTX 01000 /* save swapped text even after use */ #define IREAD 0400 /* read, write, execute permissions */ #define IWRITE 0200 #define IEXEC 0100 #define i_addr i_blks.i_p.i_a #define i_lastr i_blks.i_l #define i_rdev i_blks.i_p.i_a[0] /* #ifdef SOCKET */ #define i_socket i_blks.i_p.i_s /* #endif SOCKET */ #define i_faddr i_blks.i_p.i_a #define NFADDR 10 #define PIPSIZ NFADDR*BSIZE*8 #define i_frptr i_blks.i_p.i_f[NSADDR-5] #define i_fwptr i_blks.i_p.i_f[NSADDR-4] #define i_frcnt i_blks.i_p.i_f[NSADDR-3] #define i_fwcnt i_blks.i_p.i_f[NSADDR-2] #define i_fflag i_blks.i_p.i_f[NSADDR-1] #define IFIR 01 #define IFIW 02 E 1 h24880 s 00001/00001/00062 d D 4.5 87/05/17 17:52:23 build 9 8 c changed #idents back again. -mkm e s 00001/00001/00062 d D 4.4 87/05/14 16:24:02 build 8 7 c removed old SCCS strings and inserted #ident BB e s 00001/00001/00062 d D 4.3 87/04/22 18:32:39 build 7 6 c translated French comments. (ksm) e s 00001/00002/00062 d D 4.2 87/04/16 15:14:14 dc 6 5 c dc - Add Bull updates from 03/05/87 e s 00000/00000/00064 d D 4.1 87/02/20 13:33:48 build 5 4 c rolled rev to -r4 /dc e s 00000/00000/00064 d D 3.1 87/01/19 09:25:32 build 4 3 c rolled rev to -r3 /dc e s 00000/00000/00064 d D 2.1 87/01/19 09:25:32 build 3 2 c AUTO NULL DELTA e s 00001/00000/00063 d D 1.2 87/01/16 10:19:58 build 2 1 c add ident string /dc e s 00063/00000/00000 d D 1.1 87/01/09 15:41:48 build 1 0 c Placed under source control - dc e u U f b f n t T I 2 D 6 /* "%W% %E%" */ E 2 I 1 /* @(#)iobuf.h 6.1 */ E 6 I 6 D 8 /* " %W% %E% " */ E 8 I 8 D 9 #ident " %W% %E% " E 9 I 9 /* " %W% %E% " */ E 9 E 8 E 6 /* * Each block device has a iobuf, which contains private state stuff * and 2 list heads: the b_forw/b_back list, which is doubly linked * and has all the buffers currently associated with that major * device; and the d_actf/d_actl list, which is private to the * device but in fact is always used for the head and tail * of the I/O queue for the device. * Various routines in bio.c look at b_forw/b_back * (notice they are the same as in the buf structure) * but the rest is private to each device driver. */ struct iobuf { int b_flags; /* see buf.h */ struct buf *b_forw; /* first buffer for this dev */ struct buf *b_back; /* last buffer for this dev */ struct buf *b_actf; /* head of I/O queue */ struct buf *b_actl; /* tail of I/O queue */ dev_t b_dev; /* major+minor device name */ char b_active; /* busy flag */ char b_errcnt; /* error count (for recovery) */ struct eblock *io_erec; /* error record */ int io_nreg; /* number of registers to log on errors */ physadr io_addr; /* csr address */ D 7 struct tape_cmd *tpcmd ; /* info pour BM */ E 7 I 7 struct tape_cmd *tpcmd ; /* info for BM */ E 7 struct iostat *io_stp; /* unit I/O statistics */ time_t io_start; int io_s1; /* space for drivers ... */ int io_s2; /* ... to leave things */ int io_s3; char io_cs4; /* ... to leave things */ char io_cs5; /* ... to leave things */ }; #define tabinit(dv,stat) { \ 0, \ 0, \ 0, \ 0, \ 0, \ makedev(dv, 0), \ 0, \ 0, \ 0, \ 0, \ 0, \ 0, \ stat, \ 0, \ 0 \ } #define NDEVREG (sizeof(struct device)/sizeof(int)) #define nxrec io_s1 /* block number of file mark on tape */ #define blkno io_s2 /* current block number on tape */ #define io_mecb io_s3 /* addr of cb block on cartridge tape */ #define oflag io_cs4 /* open close flag for sequential acces */ #define eot io_cs5 /* eot detection flag on sequential acces */ #define io_ctcom devinfo.iocom.comm #define B_ONCE 01 /* flag for once only driver operations */ #define B_TIME 04 /* for timeout use */ E 1 h27852 s 00001/00001/00180 d D 4.10 87/05/17 17:52:24 build 17 16 c changed #idents back again. -mkm e s 00001/00001/00180 d D 4.9 87/05/14 16:24:16 build 16 15 c removed old SCCS strings and inserted #ident BB e s 00001/00001/00180 d D 4.8 87/04/16 15:05:27 dc 15 14 c dc - Add Bull updates from 03/05/87 e s 00002/00002/00179 d D 4.7 87/02/23 18:09:06 mth 14 13 c SIGFRAME_RES7 --> SIGFRAME_R15 e s 00015/00000/00166 d D 4.6 87/02/23 11:00:30 build 13 12 c add table description of signal stack frame. e s 00035/00004/00131 d D 4.5 87/02/23 07:38:55 build 12 11 c add signal frame definitions /dc e s 00001/00001/00134 d D 4.4 87/02/22 09:25:18 build 11 10 c fix commnet e s 00011/00005/00124 d D 4.3 87/02/20 15:55:41 build 10 9 c pass args in r0-r3 e s 00003/00000/00126 d D 4.2 87/02/20 15:30:52 build 9 8 c add LINK register definition for call/return e s 00000/00000/00126 d D 4.1 87/02/20 13:33:51 build 8 7 c rolled rev to -r4 /dc e s 00002/00002/00124 d D 3.4 87/02/03 14:23:24 build 7 6 c add semicolons to comments in previous delta e s 00023/00009/00103 d D 3.3 87/02/03 14:10:38 build 6 5 c Eliminate headwall conditional. Mask/Unmask BOTH chain 1 and 2 e s 00016/00005/00096 d D 3.2 87/01/26 11:11:11 build 5 4 c add pte changes e s 00000/00000/00101 d D 3.1 87/01/19 09:25:34 build 4 3 c rolled rev to -r3 /dc e s 00000/00000/00101 d D 2.1 87/01/19 09:25:34 build 3 2 c AUTO NULL DELTA e s 00001/00000/00100 d D 1.2 87/01/16 10:20:01 build 2 1 c add ident string /dc e s 00100/00000/00000 d D 1.1 87/01/09 15:41:13 build 1 0 c Placed under source control - dc e u U f b f n t T I 2 D 15 /* "%W% %E%" */ E 15 I 15 D 16 /* " %W% %E% " */ E 16 I 16 D 17 #ident " %W% %E% " E 17 I 17 /* " %W% %E% " */ E 17 E 16 E 15 E 2 I 1 ; ; MASQUAGE / DEMASQUAGE D'INTERRUPTIONS I 6 ; INTERRUPT MASK / UNMASK FUNCTIONS E 6 ; I 6 ; Maintenance operation 5 : TWRITED. ; Takes tmt address in Rx, contents in Rx+1 ; For masking / unmasking, we don't really write into the tmt, ; hence, R1+1 is unused. The tmt address specifies *all* ; interesting parameters. ; This macro implies that the Rx,Rx+1 pair is R0,R1, since its ; third nibble (Rx field) is 0. ; The fourth nibble (5) selects TWRITED. E 6 I_MASK equ 4c05H D 6 #ifdef HEADWALL MASK equ 0cfH UNMASK equ 0dfH #else MASK equ 0dfH UNMASK equ 0cfH #endif E 6 I 6 ; Format of the tmt address word (in Rx) ; bits 30,31=11 ==> Don't write anything into tmt ; bits 28,29=11 ==> change mask ; bits 24,25=01 ==> set mask #1 (turn off interrupts on chain 1) ; bits 24,25=00 ==> clear mask #1 (allow interrupts on chain 1) ; bits 26,27=01 ==> set mask #2 (turn off interrupts on chain 2) ; bits 26,27=00 ==> clear mask #2 (allow interrupts on chain 2) D 7 MASK equ 05fH Shut off chain 1 and 2 UNMASK equ 00fH Allow chain 1 and 2 E 7 I 7 MASK equ 05fH ; Shut off chain 1 and 2 UNMASK equ 00fH ; Allow chain 1 and 2 E 7 E 6 I 6 E 6 ; FORMAT DE LA PILE D'APPEL I 6 ; Argument stack layout I 10 ; Args 1,2,3,4 are passed in registers r0,r1,r2,r3. ; (unless they are doubleword arguments) ; Param5 is passed on the stack ; Space is always allocated for the arguments by the caller, ; in case the arguments must be saved, or a lower level routine ; must be called. E 10 E 6 D 10 PARAM1 equ 24 PARAM2 equ 32 PARAM3 equ 40 PARAM4 equ 48 PARAM5 equ 56 E 10 I 10 STKPARAM1 equ 24 D 12 STKPARAM2 equ 32 STKPARAM3 equ 40 STKPARAM4 equ 48 STKPARAM5 equ 56 E 12 I 12 STKPARAM2 equ 28 STKPARAM3 equ 32 STKPARAM4 equ 36 STKPARAM5 equ 40 E 12 E 10 ; VALEURS RELATIVES A LA TAILLE DE LA PAGE MEMOIRE I 6 ; Items which depend upon this size of a page E 6 PAGE_SHIFT equ 12 PAGE_LENGTH_D equ 512 PAGE_LENGTH_W equ 1024 PAGE_LENGTH_H equ 2048 PAGE_LENGTH_B equ 4096 I 5 NSGTPSC equ 256 E 5 D 5 VRTMASK equ 512-1 KERNSTACK equ 08000000H E 5 I 5 KERNSTACK equ 0fffc1000H USRSTACK equ 07ffc0000H E 5 D 5 DATA_FAULT equ 0 TEXT_FAULT equ 1 E 5 ; STRUCTURE PCB REG0: equ 0 REG1: equ REG0+4 REG2: equ REG1+4 REG3: equ REG2+4 REG4: equ REG3+4 REG5: equ REG4+4 REG6: equ REG5+4 REG7: equ REG6+4 REG8: equ REG7+4 REG9: equ REG8+4 REG10: equ REG9+4 REG11: equ REG10+4 REG12: equ REG11+4 REG13: equ REG12+4 REG14: equ REG13+4 REG15: equ REG14+4 PC: equ REG15+4 TSEG: equ PC+4 DSEG: equ TSEG+2 RES: equ DSEG+2 TRAPSW: equ RES+4 CLOCK: equ TRAPSW+4 RES2 equ CLOCK+4 SREG0: equ RES2+4 SREG1: equ SREG0+4 SREG2: equ SREG1+4 SREG3: equ SREG2+4 SREG4: equ SREG3+4 SREG5: equ SREG4+4 SREG6: equ SREG5+4 SREG7: equ SREG6+4 PSL: equ SREG7 SREG8: equ SREG7+4 SREG9: equ SREG8+4 SREG10: equ SREG9+4 SREG11: equ SREG10+4 SREG12: equ SREG11+4 SREG13: equ SREG12+4 SREG14: equ SREG13+4 SREG15: equ SREG14+4 PCBSZ equ SREG15+4 USIZE equ 1 READ equ 0 WRITE equ 1 ; u struct offsets U_PCB equ 0 D 6 ; pcb struct offsets E 6 I 6 ; CPU control block offsets E 6 SYSKCALL equ 03fcH TIMER1_COUNT equ 0440H TIMER2_COUNT equ 0444H D 6 TIMER_PERIOD equ 20 ; timer period in ms E 6 I 6 TIMER_PERIOD equ 20 ; timer period in ms (see also HZ) E 6 I 5 ; save area structure #define SAVR6 0 #define SAVR8 8 #define SAVR10 16 #define SAVR12 24 #define SAVR14 32 #define SAVSR6 40 #define SAVSR14 48 #define SAVSR8 56 I 9 D 11 # CALL / RETURN linkage register E 11 I 11 ; CALL / RETURN linkage register E 11 #define LINK R15 I 12 ; Format of a signal stack frame ; The first 6 words are the normal 'c' argument header, and are reserved. I 13 ; !--------------!--------------!--------------!--------------! ; R14==>!00: !04: !08: !12: ! ; !--------------!--------------!--------------!--------------! ; !16: !20: !24: [sig num]!28:*@ R0 ! ; !--------------!--------------!--------------!--------------! ; !32:*@ R1 !36:*@ R2 !40:*@ R3 !44:*@ R4 ! ; !--------------!--------------!--------------!--------------! D 14 ; !48:*@ R5 !52:*@ R6 !56:*@ R11 !60: rsvd7 ! E 14 I 14 ; !48:*@ R5 !52:*@ R6 !56:*@ R11 !60: r15 ! E 14 ; !--------------!--------------!--------------!--------------! ; !64: ~ signum !68: ~ handler!72:* ~ PC !76:* ~ R14 ! ; !--------------!--------------!--------------!--------------! ; Notes: ; * ==> restored by signal exit service (kcall 254) ; @ ==> saved by user's sigcode routine ; ~ ==> saved by kernel sendsig routine E 13 #define SIGFRAME_RES1 0 #define SIGFRAME_RES2 4 #define SIGFRAME_RES3 8 #define SIGFRAME_RES4 12 #define SIGFRAME_RES5 16 #define SIGFRAME_RES6 20 ; SIGARG is the place where the argument to the signal handler is placed #define SIGFRAME_SIGARG 24 ; Then, there is the register save area. ;- By convention, the user's sigcode routine saves R0-R6,R11 in the frame. ;- The signal number, handler, pc, and previous stack are placed ; in the frame by the kernel (sendsig). ;- The kernel exit-signal routine (kcall 254) ; restores R0-R6, R11, R14, and PC from this frame. #define SIGFRAME_R0 28 #define SIGFRAME_R1 32 #define SIGFRAME_R2 36 #define SIGFRAME_R3 40 #define SIGFRAME_R4 44 #define SIGFRAME_R5 48 #define SIGFRAME_R6 52 #define SIGFRAME_R11 56 D 14 #define SIGFRAME_RES7 60 E 14 I 14 #define SIGFRAME_R15 60 E 14 #define SIGFRAME_SIGN 64 #define SIGFRAME_HNDLR 68 #define SIGFRAME_PC 72 #define SIGFRAME_R14 76 #define SIGFRAME_SIZE 80 E 12 E 9 E 5 E 1 h09026 s 00001/00001/00063 d D 4.5 87/05/17 17:52:26 build 9 8 c changed #idents back again. -mkm e s 00001/00001/00063 d D 4.4 87/05/14 16:24:29 build 8 7 c removed old SCCS strings and inserted #ident BB e s 00001/00000/00063 d D 4.3 87/05/12 13:30:50 dc 7 6 c dc - Add extended tape support e s 00001/00001/00062 d D 4.2 87/04/16 15:14:27 dc 6 5 c dc - Add Bull updates from 03/05/87 e s 00000/00000/00063 d D 4.1 87/02/20 13:33:53 build 5 4 c rolled rev to -r4 /dc e s 00000/00000/00063 d D 3.1 87/01/19 09:25:36 build 4 3 c rolled rev to -r3 /dc e s 00000/00000/00063 d D 2.1 87/01/19 09:25:36 build 3 2 c AUTO NULL DELTA e s 00001/00000/00062 d D 1.2 87/01/16 10:20:04 build 2 1 c add ident string /dc e s 00062/00000/00000 d D 1.1 87/01/09 15:41:50 build 1 0 c Placed under source control - dc e u U f b f n t T I 2 D 6 /* "%W% %E%" */ E 6 I 6 D 8 /* " %W% %E% " */ E 8 I 8 D 9 #ident " %W% %E% " E 9 I 9 /* " %W% %E% " */ E 9 E 8 E 6 E 2 I 1 /* */ /* DEFINITIONS SPS9 : */ /* constants, configuration structures, macros */ /* */ /* Constants : board types */ #define FDLP 1 /* FDLP board */ #define ANSI 2 /* ANSI disc (unused) */ #define SMD 3 /* SMD disc */ #define KEYB 4 /* Ridge monochrome display */ #define DISP 5 /* Ridge monochrome display */ #define CIODEBUG 6 /* CIO board debugger */ #define CIODIAG 7 /* CIO board diagnostic */ #define CIOLANCE 8 /* CIO board Lance */ #define CIOENET 9 /* CIO board Enet */ #define CIOTTY 10 /* CIO board terminal */ #define CIOLP 11 /* CIO board line printer */ #define CIOISBX 12 /* CIO board isbx bus (unused) */ #define CIOTAPE 13 /* CIO board cartridge tape */ #define CIODISC 14 /* CIO board scsi disc */ #define CIOSCSI 15 /* CIO board scsi others (unused*/ #define MT 32 /* magnetic tape */ I 7 #define MTEXT 33 /* extended magnetic tape */ E 7 #define DR11M 48 /* DR11 */ #define DR11MKEYB 49 /* */ #define DR11UBNET 50 /* DR11 Ethernet */ #define DR11RASTER 51 /* */ #define DR11RASTKEYB 52 /* */ #define ENET 64 /* CIO ENET board */ #define CIO 65 /* CIO board */ #define SASBASE 128 /* SAS UE base */ #define SASSL 129 /* SAS synchronous line */ #define SASAL 130 /* SAS asynchronous line */ #define INSTRBASE 144 /* INSTR UE base */ #define INSTRGPIB 145 /* INSTR GPIB */ #define INSTRDR11 146 /* INSTR DR11 */ #define INSTRVME 147 /* INSTR VME */ #define MOGRAPHBASE 160 /* monochrome graphic base */ #define MOGRAPHIC 161 /* monochrome graphic application*/ #define COGRAPHBASE 162 /* color graphic base */ #define COGRAPHIC 163 /* color graphic application */ #define UNDEFUE 223 /* undefined type address UE unused */ /* shift for extraction od device address, used for d_read,d_write,it */ #define DEVADSHFT 24 /* devadr = physical device address ( IOIR) */ #define devadr(x) ((x >> DEVADSHFT) & 0xff) /* ioadr = IO address word for read(physical device adress) */ #define ioadr(x) (x << DEVADSHFT) /* pseudodev = controller number( minor(dev)) */ #define CTRL(x) ((x >> 6) & 3) E 1 h46985 s 00001/00001/00025 d D 4.4 87/05/17 17:52:27 build 8 7 c changed #idents back again. -mkm e s 00001/00001/00025 d D 4.3 87/05/14 16:24:41 build 7 6 c removed old SCCS strings and inserted #ident BB e s 00001/00001/00025 d D 4.2 87/04/16 15:14:48 dc 6 5 c dc - Add Bull updates from 03/05/87 e s 00000/00000/00026 d D 4.1 87/02/20 13:33:56 build 5 4 c rolled rev to -r4 /dc e s 00000/00000/00026 d D 3.1 87/01/19 09:25:39 build 4 3 c rolled rev to -r3 /dc e s 00000/00000/00026 d D 2.1 87/01/19 09:25:39 build 3 2 c AUTO NULL DELTA e s 00001/00000/00025 d D 1.2 87/01/16 10:20:06 build 2 1 c add ident string /dc e s 00025/00000/00000 d D 1.1 87/01/09 15:41:52 build 1 0 c Placed under source control - dc e u U f b f n t T I 2 D 6 /* "%W% %E%" */ E 6 I 6 D 7 /* " %W% %E% " */ E 7 I 7 D 8 #ident " %W% %E% " E 8 I 8 /* " %W% %E% " */ E 8 E 7 E 6 E 2 I 1 /* Common IPC Access Structure */ struct ipc_perm { ushort uid; /* owner's user id */ ushort gid; /* owner's group id */ ushort cuid; /* creator's user id */ ushort cgid; /* creator's group id */ ushort mode; /* access modes */ ushort seq; /* slot usage sequence number */ key_t key; /* key */ }; /* Common IPC Definitions. */ /* Mode bits. */ #define IPC_ALLOC 0100000 /* entry currently allocated */ #define IPC_CREAT 0001000 /* create entry if key doesn't exist */ #define IPC_EXCL 0002000 /* fail if key exists */ #define IPC_NOWAIT 0004000 /* error if request must wait */ /* Keys. */ #define IPC_PRIVATE (key_t)0 /* private key */ /* Control Commands. */ #define IPC_RMID 0 /* remove identifier */ #define IPC_SET 1 /* set options */ #define IPC_STAT 2 /* get options */ E 1 h61455 s 00001/00001/00007 d D 4.4 87/05/17 17:52:28 build 8 7 c changed #idents back again. -mkm e s 00001/00001/00007 d D 4.3 87/05/14 16:24:50 build 7 6 c removed old SCCS strings and inserted #ident BB e s 00001/00002/00007 d D 4.2 87/04/16 15:15:01 dc 6 5 c dc - Add Bull updates from 03/05/87 e s 00000/00000/00009 d D 4.1 87/02/20 13:33:58 build 5 4 c rolled rev to -r4 /dc e s 00000/00000/00009 d D 3.1 87/01/19 09:25:41 build 4 3 c rolled rev to -r3 /dc e s 00000/00000/00009 d D 2.1 87/01/19 09:25:41 build 3 2 c AUTO NULL DELTA e s 00001/00000/00008 d D 1.2 87/01/16 10:20:09 build 2 1 c add ident string /dc e s 00008/00000/00000 d D 1.1 87/01/09 15:41:54 build 1 0 c Placed under source control - dc e u U f b f n t T I 2 D 6 /* "%W% %E%" */ E 2 I 1 /* @(#)lock.h 6.1 */ E 6 I 6 D 7 /* " %W% %E% " */ E 7 I 7 D 8 #ident " %W% %E% " E 8 I 8 /* " %W% %E% " */ E 8 E 7 E 6 /* * flags for locking procs and texts */ #define UNLOCK 0 #define PROCLOCK 1 #define TXTLOCK 2 #define DATLOCK 4 E 1 h44975 s 00001/00001/00045 d D 4.4 87/05/17 17:52:29 build 8 7 c changed #idents back again. -mkm e s 00001/00001/00045 d D 4.3 87/05/14 16:25:03 build 7 6 c removed old SCCS strings and inserted #ident BB e s 00001/00002/00045 d D 4.2 87/04/16 15:15:14 dc 6 5 c dc - Add Bull updates from 03/05/87 e s 00000/00000/00047 d D 4.1 87/02/20 13:34:00 build 5 4 c rolled rev to -r4 /dc e s 00000/00000/00047 d D 3.1 87/01/19 09:25:43 build 4 3 c rolled rev to -r3 /dc e s 00000/00000/00047 d D 2.1 87/01/19 09:25:43 build 3 2 c AUTO NULL DELTA e s 00001/00000/00046 d D 1.2 87/01/16 10:20:12 build 2 1 c add ident string /dc e s 00046/00000/00000 d D 1.1 87/01/09 15:41:55 build 1 0 c Placed under source control - dc e u U f b f n t T I 2 D 6 /* "%W% %E%" */ E 2 I 1 /* @(#)lprio.h 1.1 */ E 6 I 6 D 7 /* " %W% %E% " */ E 7 I 7 D 8 #ident " %W% %E% " E 8 I 8 /* " %W% %E% " */ E 8 E 7 E 6 /* * Line Printer Type Devices I/O Control */ struct lprio { short flag; short ind; short col; short line; short tabs; }; #define LCRCRNL 0x0001 #define LNLNLCR 0x0002 #define LEXPTAB 0x0004 #define LINDENT 0x0008 #define LFFAUTO 0x0010 #define LBSPACE 0x0020 #define LTRUNC 0x0040 #define LFFFFCR 0x0080 #define LFLMLC 0x0100 #define LFLCCC 0x0200 #define LCENT 0x2000 #define LDATP 0x4000 #define LVERS 0x8000 #define LASLP 0x10000 #define LWAIT 0x20000 #define LOPEN 0x40000000 #define LONCE 0x80000000 #define LCXFLAG 0x800020DE #define LDPFLAG 0x800040DE #define CX 0x0010 #define DP 0x0020 #define MGFLAG 0xE3FF #define MSFLAG 0x03FF /* ioctl commands */ #define LPR ('l'<<8) #define LPRGET (LPR|01) #define LPRSET (LPR|02) #define LPRGETV (LPR|05) #define LPRSETV (LPR|06) #define LPRSANE (LPR|07) E 1 h09602 s 00001/00001/00012 d D 4.4 87/05/17 17:52:30 build 8 7 c changed #idents back again. -mkm e s 00001/00001/00012 d D 4.3 87/05/14 16:25:13 build 7 6 c removed old SCCS strings and inserted #ident BB e s 00001/00002/00012 d D 4.2 87/04/16 15:15:57 dc 6 5 c dc - Add Bull updates from 03/05/87 e s 00000/00000/00014 d D 4.1 87/02/20 13:34:03 build 5 4 c rolled rev to -r4 /dc e s 00000/00000/00014 d D 3.1 87/01/19 09:25:45 build 4 3 c rolled rev to -r3 /dc e s 00000/00000/00014 d D 2.1 87/01/19 09:25:45 build 3 2 c AUTO NULL DELTA e s 00001/00000/00013 d D 1.2 87/01/16 10:20:14 build 2 1 c add ident string /dc e s 00013/00000/00000 d D 1.1 87/01/09 15:41:57 build 1 0 c Placed under source control - dc e u U f b f n t T I 2 D 6 /* "%W% %E%" */ E 2 I 1 /* @(#)map.h 6.4 */ E 6 I 6 D 7 /* " %W% %E% " */ E 7 I 7 D 8 #ident " %W% %E% " E 8 I 8 /* " %W% %E% " */ E 8 E 7 E 6 typedef struct map { unsigned int m_size; unsigned int m_addr; } map_t; extern struct map sptmap[]; #define mapstart(X) &X[1] #define mapwant(X) X[0].m_addr #define mapsize(X) X[0].m_size #define mapdata(X) {(X)-2, 0} , {0, 0} #define mapinit(X, Y) X[0].m_size = (Y)-2 E 1 h18980 s 00121/00138/00221 d D 4.6 87/05/18 12:07:52 build 11 10 c Comments translated into English BB e s 00001/00001/00358 d D 4.5 87/05/17 17:52:31 build 10 9 c changed #idents back again. -mkm e s 00001/00001/00358 d D 4.4 87/05/14 16:25:24 build 9 8 c removed old SCCS strings and inserted #ident BB e s 00000/00000/00359 d D 4.3 87/04/22 18:40:07 build 8 7 c null delta e s 00024/00025/00335 d D 4.2 87/04/16 15:16:21 dc 7 6 c dc - Add Bull updates from 03/05/87 e s 00000/00000/00360 d D 4.1 87/02/20 13:34:06 build 6 5 c rolled rev to -r4 /dc e s 00239/00071/00121 d D 3.2 87/02/13 11:13:23 build 5 4 c add bull changes from Jan 23 /dc e s 00000/00000/00192 d D 3.1 87/01/19 09:25:48 build 4 3 c rolled rev to -r3 /dc e s 00000/00000/00192 d D 2.1 87/01/19 09:25:48 build 3 2 c AUTO NULL DELTA e s 00001/00000/00191 d D 1.2 87/01/16 10:20:17 build 2 1 c add ident string /dc e s 00191/00000/00000 d D 1.1 87/01/09 15:41:59 build 1 0 c Placed under source control - dc e u U f b f n t T I 2 D 7 /* "%W% %E%" */ E 2 I 1 /* @(#)mas.h 1.0 08/19/86 16:00:00 */ E 7 I 7 D 9 /* " %W% %E% " */ E 9 I 9 D 10 #ident " %W% %E% " E 10 I 10 /* " %W% %E% " */ E 10 E 9 E 7 I 5 D 7 #define NSASCT 4 /* nombre de coupleurs */ E 7 I 7 D 11 #define NSASCT 4 /* nombre maximum de coupleurs */ E 7 #define NMASUNIT 8 /* nombre de lignes par coupleur */ E 11 I 11 #define NSASCT 4 /* maximum number of couplers */ #define NMASUNIT 8 /* number of lines per coupler */ E 11 D 11 E 5 /* structure du mot Command lors d'un IOWrite UEbase com */ /* ------- ------------------ */ E 11 I 11 /* structure of Command word during an IOWrite UEbase command */ /* ------- ---------------------- */ E 11 typedef union { uint val; struct { D 11 unsigned : 8; /* utilise par le MSY */ unsigned irq5 :16; /* raz des 16 IT du MAS */ unsigned : 5; /* non utilise */ E 11 I 11 unsigned : 8; /* used by the MSY */ unsigned irq5 :16; /* raz of the 16 IT on the MAS */ unsigned : 5; /* not used */ E 11 unsigned appel2 : 1; /* raz IT appel2 */ D 11 unsigned masqit : 1; /* raz Masque IT */ unsigned itrev : 1; /* IT reveil */ E 11 I 11 unsigned masqit : 1; /* raz Mask IT */ unsigned itrev : 1; /* IT awake */ E 11 } bits; } mascom; I 5 D 11 E 5 /* structure du mot Status lors d'un IORead UEbase status */ /* ------ -------------------- */ E 11 I 11 /* structure of Status word during an IORead UEbase status */ /* ------ -------------------- */ E 11 typedef union { uint val; struct { D 11 unsigned type : 8; /* Type du device */ unsigned irq5 :16; /* etat des 16 bascules IT */ unsigned nu : 4; /* non utilise */ unsigned appel2 : 1; /* attente IT appel 2 */ E 11 I 11 unsigned type : 8; /* Type of device */ unsigned irq5 :16; /* state of the 16 interrupt flags */ unsigned nu : 4; /* not used */ unsigned appel2 : 1; /* wait interrupt call 2 */ E 11 unsigned test : 1; /* 1 = autotest OK, 0 = KO */ D 11 unsigned itrev : 1; /* etat IT reveil */ unsigned masqit : 1; /* etat Masque IT */ E 11 I 11 unsigned itrev : 1; /* state IT awake */ unsigned masqit : 1; /* interrupt mask */ E 11 } bits; } masstat; I 5 D 11 E 5 /* structure du mot IO Intr lors d'un IOIR */ /* ------- ---- */ E 11 I 11 /* structure of IO Intr word during an IOIR */ /* ------- ---- */ E 11 typedef union { uint val; struct { D 11 unsigned dev : 8; /* numero du Device */ unsigned irq5 :16; /* etat des 16 bascules IT */ unsigned nu : 4; /* non utilise */ unsigned appel2 : 1; /* etat IT appel2 */ E 11 I 11 unsigned dev : 8; /* number of devices */ unsigned irq5 :16; /* state of the 16 interrupt flags */ unsigned nu : 4; /* not used */ unsigned appel2 : 1; /* state of IT appel2 */ E 11 unsigned test : 1; /* 1 = autotest OK, 0 = KO */ D 11 unsigned itrev : 1; /* etat IT reveil */ unsigned masqit : 1; /* etat Masque IT */ E 11 I 11 unsigned itrev : 1; /* state IT awake */ unsigned masqit : 1; /* interrupt mask */ E 11 } bits; } masioir; I 5 D 11 E 5 /* structure d'un DCB en ME */ E 11 I 11 /* structure of a DCB in ME */ E 11 typedef struct { D 5 char getat; /* etat general */ char setat; /* etat secondaire */ char gordre; /* ordre general */ char sordre; /* ordre secondaire */ caddr_t atrans; /* adr UC de transfert */ long co; /* compte d'octets a transferer */ long cot; /* compte d'octets transferes */ adr_me atamp; /* adr ME du tampon */ long ltamp; /* longueur du tampon */ char gcr; /* compte rendu general */ char scr; /* compte rendu secondaire */ char fill1[6]; ushort tempo; /* temporisation */ char fill2[4]; ushort parm1, parm2; char startch; char stopch; char fill3[4]; long p1; /* pir ou pie */ long p2; /* per ou pee */ char fill4[8]; } masdcb; E 5 I 5 D 11 unsigned char getat, /* etat general */ /* 00 */ setat; /* etat secondaire */ /* 01 */ unsigned char gordre, /* ordre general */ /* 02 */ sordre; /* ordre secondaire */ /* 03 */ caddr_t atrans; /* adr UC de transfert */ /* 04 */ long co, /* compte d'octets a transferer */ /* 08 */ cot; /* compte d'octets transferes */ /* 0C */ adr_me atamp; /* adr ME du tampon */ /* 10 */ long ltamp; /* longueur du tampon */ /* 14 */ unsigned char gcr, /* compte rendu general */ /* 18 */ scr; /* compte rendu secondaire */ /* 19 */ E 11 I 11 unsigned char getat, /* general state */ /* 00 */ setat; /* secondary state */ /* 01 */ unsigned char gordre, /* general order */ /* 02 */ sordre; /* secondary order */ /* 03 */ caddr_t atrans; /* addr UC of transfer */ /* 04 */ long co, /* number of octet's to transfer */ /* 08 */ cot; /* number of octet's transfered */ /* 0C */ adr_me atamp; /* addr ME of plug */ /* 10 */ long ltamp; /* length of plug */ /* 14 */ unsigned char gcr, /* count received general */ /* 18 */ scr; /* count received secondary */ /* 19 */ E 11 char fill1[6]; /* 1A */ ushort tempo; /* temporisation */ /* 20 */ char fill2[4]; /* 22 */ D 11 ushort parm1, /* parametres de inilgn */ /* 26 */ E 11 I 11 ushort parm1, /* line parameters */ /* 26 */ E 11 parm2; /* 28 */ D 11 char startch, /* caractere XON */ /* 2A */ stopch; /* caractere XOFF */ /* 2B */ E 11 I 11 char startch, /* character XON */ /* 2A */ stopch; /* character XOFF */ /* 2B */ E 11 char fill3[4]; /* 2C */ D 11 long p1, /* pir ou pie */ /* 30 */ p2; /* per ou pee */ /* 34 */ E 11 I 11 long p1, /* pir or pie */ /* 30 */ p2; /* per or pee */ /* 34 */ E 11 char fill4[8]; /* 38 */ } masdcb; /* 40 */ E 5 #define DCBSIZE 64 D 11 /* offsets des champs de la structure dcb */ E 11 I 11 /* offset of fields in the DCB structure */ E 11 #define GETAT 0 #define SETAT 1 #define GORDRE 2 #define SORDRE 3 #define ATRANS 4 #define CO 8 #define COT 12 #define ATAMP 16 #define LTAMP 20 #define GCR 24 #define SCR 25 #define TEMPO 32 #define PARM1 38 #define PARM2 40 #define STARTCH 42 #define STOPCH 43 #define P1 48 #define P2 52 I 5 D 11 /* taille des buffers DMA */ E 11 I 11 /* depth of DMA buffers */ E 11 #define MASDMASZ 0x0800 /* 4Ko */ D 11 E 5 /* structure complementaire a tty */ E 11 I 11 /* complementary structure for tty */ E 11 struct tt2 { D 5 unsigned char vtrm[SZTRM]; adr_me dcbradr; /* adr en ME du DCB reception */ adr_me dcbxadr; /* adr en ME du DCB emission */ masdcb dcbr; /* structure du DCB reception */ masdcb dcbx; /* structure du DCB emission */ unsigned char flag; /* flags de controle */ unsigned char state; /* etats internes */ unsigned char finordre; /* types de fin d'ordre */ }; E 5 I 5 unsigned char vtrm[SZTRM]; /* 00 */ D 11 uint flag; /* flags de controle */ /* 0c */ uint cmddcb; /* commandes executees par mascmd */ /* 10 */ D 7 uint statedcb; /* etats des DCBs */ /* 14 */ ushort finordre; /* types de fin d'ordre */ /* 18 */ ushort itlevel; /* niveau d'IT */ /* 1a */ ushort state; /* etats internes */ /* 1c */ ushort delaicon; /* delai sur lancement connexion */ /* 1d */ E 7 I 7 uint statdcb; /* etats des DCBs */ /* 14 */ uint state; /* etats internes */ /* 18 */ ushort itlevel; /* niveau d'IT */ /* 1c */ ushort delaicon; /* delai sur lancement connexion */ /* 1e */ E 7 int tofinemi; /* id. de timeout sur fin d'emission *//* 20 */ int todcbx; /* id. de timeout sur DCBX */ /* 24 */ adr_me dcbradr; /* adr en ME du DCB reception */ /* 28 */ adr_me dcbxadr; /* adr en ME du DCB emission */ /* 2c */ char *dmar; /* buffer DMA en reception */ /* 30 */ char *dmax; /* buffer DMA en sortie */ /* 34 */ char *physdmar; /* adresse physique de dmar */ /* 38 */ char *physdmax; /* adresse physique de dmax */ /* 3c */ masdcb dcbr; /* structure du DCB reception */ /* 40 */ masdcb dcbx; /* structure du DCB emission */ /* 80 */ E 11 I 11 uint flag; /* control flags */ /* 0c */ uint cmddcb; /* command to execute by mascmd */ /* 10 */ uint statdcb; /* state of the DCBs */ /* 14 */ uint state; /* internal state */ /* 18 */ ushort itlevel; /* IT level */ /* 1c */ ushort delaicon; /* delay before issueing connection */ /* 1e */ int tofinemi; /* id. of timeout after final transmission *//* 20 */ int todcbx; /* id. of timeout for DCBX */ /* 24 */ adr_me dcbradr; /* addr in ME of DCB receiver */ /* 28 */ adr_me dcbxadr; /* addr in ME of DCB transmitter */ /* 2c */ char *dmar; /* DMA receive buffer */ /* 30 */ char *dmax; /* DMA transmit buffer */ /* 34 */ char *physdmar; /* physical address of dmar */ /* 38 */ char *physdmax; /* physical address of dmax */ /* 3c */ masdcb dcbr; /* DCB receiver structure */ /* 40 */ masdcb dcbx; /* DCB transmit structure */ /* 80 */ E 11 }; /* c0 */ E 5 I 5 D 11 /* Flags supplementaires */ #define XONHARD 0x01 /* XON gere par le coupleur */ #define BRKHARD 0x02 /* envoi d'un vrai break */ #define RECBLOC 0x04 /* reception en mode bloc */ #define EMIBLOC 0x08 /* emission en mode bloc */ #define RECTRAN 0x10 /* reception transcodee */ #define RECECHO 0x20 /* reception avec echo */ #define RECACT 0x40 /* reception avec action sur car. speciaux */ E 11 I 11 /* Supplimentary flags */ #define XONHARD 0x01 /* XON managed by the coupler */ #define BRKHARD 0x02 /* sending a real break */ #define RECBLOC 0x04 /* receive in block mode */ #define EMIBLOC 0x08 /* transmit in block mode */ #define RECTRAN 0x10 /* receive transcodee */ #define RECECHO 0x20 /* receive with echo */ #define RECACT 0x40 /* receive with action */ E 11 #define EMITRAN 0x80 /* transmission transcodee */ D 11 #define EMIOUTQ 0x100 /* emission de toute l'outq */ #define NOMODEM 0x200 /* pas de gestion des signaux modems */ E 11 I 11 #define EMIOUTQ 0x100 /* transmit all of OUTQ */ #define NOMODEM 0x200 /* no questions about signal modems */ E 11 D 7 /* Flags de commande (cmd) et d'utilisation des dcbs (statedcb) */ E 7 I 7 D 11 /* Flags de commande (cmddcb) et d'utilisation des dcbs (statdcb) */ E 7 #define HIO 0x0001 /* arret du DCBR ou DCBX (par <<1) */ #define HIOR 0x0001 /* arret du DCBR */ #define HIOX 0x0002 /* arret du DCBX */ E 11 I 11 /* Command flags (cmddcb) and utilisation of the DCB's (statdcb) */ #define HIO 0x0001 /* stop on DCBR or DCBX (with <<1) */ #define HIOR 0x0001 /* stop on DCBR */ #define HIOX 0x0002 /* stop on DCBX */ E 11 D 11 #define DCBR 0x0f10 /* DCB reception: DECON, INILGN, CON, REC */ #define REC 0x0010 /* reception */ #define DECON 0x0100 /* deconnexion */ #define INILGN 0x0200 /* initialisation ligne */ #define CON 0x0400 /* connexion */ E 11 I 11 #define DCBR 0x0f10 /* DCB receive: DECON, INILGN, CON, REC */ #define REC 0x0010 /* receive */ #define DECON 0x0100 /* disconnect */ #define INILGN 0x0200 /* initialise line */ #define CON 0x0400 /* connection */ E 11 D 11 #define DCBX 0xf020 /* DCB emission: INITAB, EMI */ #define EMI 0x0020 /* emission */ #define INITAB 0x1000 /* initialisation tables */ E 11 I 11 #define DCBX 0xf020 /* DCB transmit: INITAB, EMI */ #define EMI 0x0020 /* transmit */ #define INITAB 0x1000 /* initialise tables */ E 11 I 7 E 7 D 11 /* Etats internes (state) */ #define CONNECT 0x01 /* ligne connectee */ #define WCONNECT 0x02 /* attente de connexion */ #define READ 0x04 /* lecture en cours */ #define WRITE 0x08 /* ecriture demandee */ #define TTBREAK 0x10 /* envoi de break demande */ #define CLOSE 0x20 /* close demande */ #define TABLES 0x40 /* tables chargees */ #define FSPLEIN 0x80 /* fifo de sortie plein */ E 11 I 11 /* internal states */ #define CONNECT 0x01 /* line connect */ #define WCONNECT 0x02 /* wait for connection */ #define READ 0x04 /* read in progress */ #define WRITE 0x08 /* write requested */ #define TTBREAK 0x10 /* sending a break */ #define CLOSE 0x20 /* close request */ #define TABLES 0x40 /* load tables */ #define FSPLEIN 0x80 /* transmit FIFO full */ E 11 D 11 /* Niveaux d'IT (itlevel) */ #define LEVEL0 0x01 /* niveau 0 */ #define DEVICE 0x02 /* niveau d'IT device */ #define CLOCK 0x04 /* niveau d'IT horloge */ E 11 I 11 /* IT level */ #define LEVEL0 0x01 /* level 0 */ #define DEVICE 0x02 /* IT device level */ #define CLOCK 0x04 /* IT clock level */ E 11 D 7 /* Fin d'ordre */ /* inutilises sauf INITAB */ #define FOCON 0x01 #define FODECON 0x02 #define FOINILGN 0x04 #define FOINITAB 0x08 #define FOHIO 0x10 #define FOHIOR 0x10 #define FOHIOX 0x20 E 7 E 5 D 11 /* GETAT */ E 11 I 11 /* General state */ E 11 #define GELIB 0x00 #define GEEXEC 0xC0 #define GECOURS 0xA0 #define GETERM 0x90 D 5 #define GEARRET 0xA8 E 5 I 5 #define GEARRET 0x08 E 5 D 5 /* mode de transfert sur S-ORDRE reception/emission */ #define SORTRAN 0x10 #define SORECHO 0x20 #define SORACT 0x40 #define SOXTRAN 0x10 E 5 I 5 D 11 /* SETAT */ E 11 I 11 /* Secondary state */ E 11 #define SEITAP2 0x80 #define SEARRET 0x01 E 5 I 5 E 5 D 11 /* Ordres gordre et sordre */ E 11 I 11 /* General and secondary instructions */ E 11 #define OR_INILGN 0x0200 D 5 #define OR_INITAB 0x0300 #define OR_CONNEX 0x8300 E 5 I 5 #define OR_INITAB 0x0301 #define OR_CON 0x8300 E 5 #define OR_DECON 0x4300 D 5 #define OR_RECBLO 0x0002 E 5 I 5 #define OR_RECBLOC 0x0002 E 5 #define OR_RECCAR 0x0000 D 5 #define OR_EMIBLO 0x0101 E 5 I 5 #define OR_EMIBLOC 0x0101 E 5 #define OR_EMICAR 0x0100 I 5 #define OR_EMIBRK 0x0180 E 5 I 5 D 11 /* mode de transfert sur S-ORDRE reception/emission */ #define SORTRAN 0x10 /* reception transcodee */ #define SORECHO 0x20 /* reception avec echo */ #define SORACT 0x40 /* reception avec action */ E 11 I 11 /* mode of transfer for S-ORDER transmit/receive */ #define SORTRAN 0x10 /* receieve transcodee */ #define SORECHO 0x20 /* receieve with echo */ #define SORACT 0x40 /* receieve with action */ E 11 #define SOXTRAN 0x10 /* transmission transcodee */ D 7 E 7 D 11 /* table a charger sur S-ORDRE initab */ E 11 I 11 /* load tables for S-ORDER initab */ E 11 #define TBLACT 0x0 #define TBLECHO 0x1 #define TBLRTRAN 0x2 #define TBLXTRAN 0x3 D 11 #define TBLALL 0x4 /* les 4 tables */ #define TBLSHFT 4 /* decalage gauche sur S-Ordre */ E 11 I 11 #define TBLALL 0x4 /* the 4 tables */ #define TBLSHFT 4 /* shift left for S-Order */ E 11 I 7 E 7 D 11 /* Taille des tables a charger */ E 11 I 11 /* Size of the load tables */ E 11 #define TBLACTSZ 0x0200 /* 512 */ #define TBLECHOSZ 0x0040 /* 64 */ #define TBLTRANSZ 0x0100 /* 256 */ #define TBLALLSZ 0x0440 /* 1088 */ D 11 /* mots d'action */ E 11 I 11 /* action instructions */ E 11 #define ACTARO 0x0001 #define ACTRZ 0x0002 #define ACTAR 0x0008 #define ACTANK 0x0010 #define ACTANB 0x0020 #define ACTIT 0x0040 #define ACTMEM 0x0080 #define ACTSE 0x1000 #define ACTATE 0x7 #define ACTATESHFT 8 #define ACTNCE 0x7 #define ACTNCESHFT 13 D 11 /* Commandes supplementaires Ioctl */ E 11 I 11 /* Supplimentary commands Ioctl */ E 11 #define TCXONHARD (TIOC|16) #define TCBRKHARD (TIOC|17) #define TCRECBLOC (TIOC|18) #define TCEMIBLOC (TIOC|19) #define TCNOMODEM (TIOC|20) /* Time Out Hard (* 100ms) */ D 11 #define TO_1s 10 /* time out de 1 seconde */ #define TO_1mn 60*TO_1s /* time out de 1 minute */ E 11 I 11 #define TO_1s 10 /* time out of 1 second */ #define TO_1mn 60*TO_1s /* time out of 1 minute */ E 11 #define TO_INILGN 5 #define TO_INITAB 5 D 11 #define TO_CON 10 /* temps d'attente de PDP: 1s */ E 11 I 11 #define TO_CON 10 /* time to wait for PDP: 1s */ E 11 #define TO_DECON 20 #define TO_ARRET 5 D 11 /* Time Out Soft (en s) */ #define TOSCAN HZ /* cycle d'appel de masscan */ #define TOCLOSE HZ*5 /* attente de fin d'emission */ #define TOPARAM HZ*2 /* attente de liberation du DCBX */ #define TOINITAB HZ*2 /* attente de liberation du DCBX */ E 11 I 11 /* Time Out Soft (in s) */ #define TOSCAN HZ /* masscan scan cycle */ #define TOCLOSE HZ*5 /* wait after final transmission */ #define TOPARAM HZ*2 /* wait to free the DCBX */ #define TOINITAB HZ*2 /* wait to free the DCBX */ E 11 I 7 D 11 E 7 E 5 /* Comptes rendus GCR */ E 11 I 11 /* Counts GCR */ E 11 #define GFOK 0x00 #define GINC 0xff #define GNOP 0x01 #define GHALT 0x07 #define GTO 0x02 #define GERT 0x06 #define GDEF 0x03 #define GIT 0x80 #define GPRO 0x04 #define GPAR 0x05 #define GINI 0x08 D 11 /* Comptes rendus SCR */ E 11 I 11 /* Counts SCR */ E 11 #define SKA 0x04 #define SKB 0x02 #define SCO 0x01 #define SIN 0x08 #define SNC 0x04 #define SNI 0x02 #define SUC 0x01 #define SKS 0x80 #define STS 0x40 #define STP 0x20 #define STR 0x10 #define SRT 0x01 #define SPO 0x80 #define SPD 0x40 #define SAN 0x20 D 5 /* Flags supplementaires */ #define XONHARD 0x01 /* modifiable par Ioctl */ #define RECBLOC 0x02 /* modifiable par Ioctl */ #define EMIBLOC 0x04 /* modifiable par Ioctl */ #define RECTRAN 0x10 #define RECECHO 0x20 #define RECACT 0x40 #define EMITRAN 0x80 E 5 D 5 /* Etats internes (state) */ #define AS_CONNEX 0x01 #define AS_BREAK 0x02 #define AS_WCBL 0x04 E 5 I 5 D 11 #define MASTR 0x1000 /* 4K traces soit 64Ko = 0x10000 Octets */ #define MASER 0x80 /* 128 erreurs soit 4Ko = 0x1000 Octets */ E 11 I 11 #define MASTR 0x1000 /* 4K traces ie 64Ko = 0x10000 Octets */ #define MASER 0x80 /* 128 errors ie 4Ko = 0x1000 Octets */ E 11 E 5 D 5 /* Fin d'ordre */ #define FININILGN 0x01 #define FININITAB 0x02 #define FINCONNEX 0x04 #define FINDECON 0x08 E 5 I 5 #define TROPEN 0 #define TRCLOSE 1 #define TRREAD 2 #define TRWRITE 3 #define TRIOCTL 4 #define TRPROC 5 #define TRPARAM 6 #define TRINTR 7 #define TRXINT 8 #define TRRINT 9 #define TRRBINT 10 #define TROUTB 11 #define TROUTC 12 #define TRINB 13 #define TRINC 14 #define TRARRET 15 #define TRBREAK 16 #define TRCOUT 17 #define TRINIT 18 #define TRINIL 19 #define TRCON 20 #define TRDECON 21 #define TRSCAN 22 #define TRCMD 23 #define TRTOX 24 #define TRPDP 25 #define TRDP 26 E 5 D 5 /* Time Out (* 100ms) */ #define TO_INILGN 5 #define TO_INITAB 5 #define TO_CONNEX 10 #define TO_DECON 5 E 5 I 5 /* MASTBLTR (0x10) ======== D 7 name cmd stdcb unit er st pass E 7 I 7 name cmddcb stdcb unit er st pass E 7 ---------- ------ ------ -- -- -- -- 00 11 22 33 44 55 66 77 88 99 aa bb cc dd ee ff E 5 D 5 /* Commandes supplementaires Ioctl */ #define TCXONHARD (TIOC|16) #define TCXONSOFT (TIOC|17) #define TCRECBLOC (TIOC|18) #define TCRECCAR (TIOC|19) #define TCEMIBLOC (TIOC|20) #define TCEMICAR (TIOC|21) E 5 I 5 MASTBLER (0x20) ======== D 7 name cmd unit st masptr state mastr ------ ---- -- -- -------- -------- ---- E 7 I 7 name state unit st masptr mastr ------ -------- -- -- -------- ---- E 7 00010203 04050607 08090a0b 0c0d0e0f 10111213 14151617 18191a1b 1c1d1e1f D 7 ---- -- stdcb er E 7 I 7 -- er E 7 */ E 5 E 1 h65231 s 00048/00048/00119 d D 4.6 87/05/18 12:03:27 build 11 10 c Comments translated into English BB e s 00001/00001/00166 d D 4.5 87/05/17 17:52:34 build 10 9 c changed #idents back again. -mkm e s 00001/00001/00166 d D 4.4 87/05/14 16:25:35 build 9 8 c removed old SCCS strings and inserted #ident BB e s 00001/00000/00166 d D 4.3 87/04/17 08:23:15 dc 8 7 c dc - Add Bull (sccs) changes from 03/05/87 e s 00001/00002/00165 d D 4.2 87/04/16 15:16:49 dc 7 6 c dc - Add Bull updates from 03/05/87 e s 00000/00000/00167 d D 4.1 87/02/20 13:34:09 build 6 5 c rolled rev to -r4 /dc e s 00009/00001/00158 d D 3.2 87/02/13 11:14:59 build 5 4 c add bull changes from Jan 23 /dc e s 00000/00000/00159 d D 3.1 87/01/19 09:25:50 build 4 3 c rolled rev to -r3 /dc e s 00000/00000/00159 d D 2.1 87/01/19 09:25:50 build 3 2 c AUTO NULL DELTA e s 00001/00000/00158 d D 1.2 87/01/16 10:20:20 build 2 1 c add ident string /dc e s 00158/00000/00000 d D 1.1 87/01/09 15:42:03 build 1 0 c Placed under source control - dc e u U f b f n t T I 2 D 7 /* "%W% %E%" */ E 2 I 1 /* @(#)me.h 1.0 08/04/86 14:00:00 */ E 7 I 7 D 9 /* " %W% %E% " */ E 9 I 9 D 10 #ident " %W% %E% " E 10 I 10 /* " %W% %E% " */ E 10 E 9 E 7 D 11 /* structure du mot Address lors de IOWrite com & IORead stat */ /* ------- ----------- ----------- */ E 11 I 11 /* structure of the Address word during an IOWrite com and IORead stat */ /* ------- --------------------------- */ E 11 typedef union { uint val; struct { D 11 unsigned dev : 8; /* numero du Device */ unsigned adr0 :24; /* Adr 0 en ME */ E 11 I 11 unsigned dev : 8; /* number of Devuice */ unsigned adr0 :24; /* Adr 0 from ME */ E 11 } bits; } adr_base; D 11 /* structure du mot Command lors d'un IOWrite UEbase com */ /* ------- ------------------ */ E 11 I 11 /* structure of command word in a IOWrite UEbase com */ /* ------- ------------------ */ E 11 typedef union { uint val; struct { D 11 unsigned appli :24; /* commande aplli. */ unsigned : 5; /* non utilise */ E 11 I 11 unsigned appli :24; /* command aplli. */ unsigned : 5; /* not used */ E 11 unsigned appel2 : 1; /* raz IT appel2 */ D 11 unsigned masqit : 1; /* raz Masque IT */ unsigned itrev : 1; /* IT reveil */ E 11 I 11 unsigned masqit : 1; /* raz Mask IT */ unsigned itrev : 1; /* IT awake */ E 11 } bits; } com_base; D 11 /* structure du mot Status lors d'un IORead UEbase status */ /* ------ -------------------- */ E 11 I 11 /* structure of Status word during an IORead UEbase status */ /* ------ -------------------- */ E 11 typedef union { uint val; struct { D 11 unsigned type : 8; /* Type du device */ unsigned appli :16; /* etat de l'appli */ unsigned nu : 4; /* non utilise */ unsigned appel2 : 1; /* attente IT appel 2 */ E 11 I 11 unsigned type : 8; /* Type of device */ unsigned appli :16; /* state of the appli */ unsigned nu : 4; /* not used */ unsigned appel2 : 1; /* wait IT appel 2 */ E 11 unsigned test : 1; /* 1 = autotest OK, 0 = KO */ D 11 unsigned itrev : 1; /* etat IT reveil */ unsigned masqit : 1; /* etat Masque IT */ E 11 I 11 unsigned itrev : 1; /* state IT wait */ unsigned masqit : 1; /* state mask IT */ E 11 } bits; } stat_base; D 11 /* structure du mot IO Intr lors d'un IOIR */ /* ------- ---- */ E 11 I 11 /* structure of IO Intr word during an IOIR */ /* ------- ---- */ E 11 typedef union { uint val; struct { D 11 unsigned dev : 8; /* numero du Device */ unsigned appli :16; /* etat de l'appli */ unsigned nu : 4; /* non utilise */ unsigned appel2 : 1; /* etat IT appel2 */ E 11 I 11 unsigned dev : 8; /* number of Device */ unsigned appli :16; /* state of the appli */ unsigned nu : 4; /* not used */ unsigned appel2 : 1; /* state IT appel2 */ E 11 unsigned test : 1; /* 1 = autotest OK, 0 = KO */ D 11 unsigned itrev : 1; /* etat IT reveil */ unsigned masqit : 1; /* etat Masque IT */ E 11 I 11 unsigned itrev : 1; /* state IT wait */ unsigned masqit : 1; /* state mask IT */ E 11 } bits; } ioir_base; D 11 /* structure du mot Address lors d'un IO Read/Write en ME */ /* ------- ------------- */ E 11 I 11 /* structure of Address word during an IO Read/Write from ME */ /* ------- ------------- */ E 11 typedef union { uint val; struct { D 11 unsigned dev : 8; /* numero du Device */ E 11 I 11 unsigned dev : 8; /* number of Device */ E 11 unsigned mode : 2; /* 2 = adr short, 3 = adr byte */ D 11 unsigned bits0 : 3; /* doivent etre a 0 */ unsigned adr :19; /* adresse (espace de 512K) */ E 11 I 11 unsigned bits0 : 3; /* must be 0 */ unsigned adr :19; /* address (space of 512K) */ E 11 } bits; } adr_me; D 11 /* structure du mot Data lors d'un IORead en ME */ /* ---- ------ */ E 11 I 11 /* structure of the Data word during an IORead from ME */ /* ---- ------ */ E 11 typedef union { uint val; struct { D 11 unsigned err : 1; /* erreur */ unsigned ns :15; /* non significatifs */ E 11 I 11 unsigned err : 1; /* error */ unsigned ns :15; /* not significant */ E 11 unsigned :16; } bits; struct { unsigned :16; D 11 unsigned data :16; /* data sur 16 bits */ E 11 I 11 unsigned data :16; /* data 16 bits */ E 11 } shorts; struct { unsigned :16; D 11 unsigned left : 8; /* partie haute sur 8 bits */ unsigned right : 8; /* partie basse sur 8 bits */ E 11 I 11 unsigned left : 8; /* top part 8 bits */ unsigned right : 8; /* base part 8 bits */ E 11 } bytes; } data_me; D 11 /* structure d'un mot long vu comme shorts ou bytes */ /* ---- ------ ----- */ E 11 I 11 /* structure of a long word viewed as shorts or bytes */ /* ---- ------ ----- */ E 11 typedef union { uint val; struct { unsigned left :16; unsigned right :16; } shorts; struct { unsigned :16; unsigned left : 8; unsigned right : 8; } bytes; } int_uc; D 11 /* structure d'un mot Short vu comme bytes */ /* ----- ----- */ E 11 I 11 /* structure of a short word viewed as bytes */ /* ----- ----- */ E 11 typedef union { ushort val; struct { unsigned left : 8; unsigned right : 8; } bytes; } short_uc; typedef unsigned char byte; D 11 /* structure du DCB0 */ E 11 I 11 /* structure of DCB0 */ E 11 typedef struct { short etat; short ordre; caddr_t adruc; long co; long cot; long adrue; short gcrscr; long tailim; long adrim; } dcb_me; D 11 /* offsets des champs de la structure dcb_me */ E 11 I 11 /* field offsets in the dcb_me structure */ E 11 #define ETAT 0 #define ORDRE 2 #define ADRUC 4 #define CO 8 #define COT 12 #define ADRUE 16 #define GCRSCR 24 #define TAILIM 32 #define ADRIM 36 D 11 /* ETAT */ E 11 I 11 /* STATE */ E 11 #define ET_EXEC 0xC000 #define ET_TERM 0x9000 I 5 #define ET_ARRET 0x0001 E 5 D 11 /* ORDRE */ E 11 I 11 /* ORDER */ E 11 #define OR_IDENT 0x0202 #define OR_REQADR 0x0300 #define OR_CHARG 0x0401 #define OR_LANCE 0x0500 I 5 #define OR_MEINIT 0x0700 E 5 I 5 /* CR */ #define CR_ARRET 0x0700 E 5 D 11 /* Fin d'ordre */ E 11 I 11 /* Final orders */ E 11 I 8 #define FINTO 0x01 E 8 D 5 #define FINREQADR 0x80 E 5 I 5 #define FINARRET 0x08 #define FINMEINIT 0x10 #define FINREQADR 0x20 E 5 #define FINCHARG 0x40 I 5 #define FINLANCE 0x80 E 5 D 11 /* modes d'adressage dans adr_me */ E 11 I 11 /* addressing modes within adr_me */ E 11 #define MESHORT 2 #define MEBYTE 3 #define MAXMEMME 0x80000 #define PAGESZ 4096 E 1 h19258 s 00001/00001/00018 d D 4.4 87/05/17 17:52:35 build 8 7 c changed #idents back again. -mkm e s 00001/00001/00018 d D 4.3 87/05/14 16:25:45 build 7 6 c removed old SCCS strings and inserted #ident BB e s 00001/00002/00018 d D 4.2 87/04/16 15:17:18 dc 6 5 c dc - Add Bull updates from 03/05/87 e s 00000/00000/00020 d D 4.1 87/02/20 13:34:13 build 5 4 c rolled rev to -r4 /dc e s 00000/00000/00020 d D 3.1 87/01/19 09:25:53 build 4 3 c rolled rev to -r3 /dc e s 00000/00000/00020 d D 2.1 87/01/19 09:25:53 build 3 2 c AUTO NULL DELTA e s 00001/00000/00019 d D 1.2 87/01/16 10:20:23 build 2 1 c add ident string /dc e s 00019/00000/00000 d D 1.1 87/01/09 15:42:06 build 1 0 c Placed under source control - dc e u U f b f n t T I 2 D 6 /* "%W% %E%" */ E 2 I 1 /* @(#)mount.h 6.1 */ E 6 I 6 D 7 /* " %W% %E% " */ E 7 I 7 D 8 #ident " %W% %E% " E 8 I 8 /* " %W% %E% " */ E 8 E 7 E 6 /* * Mount structure. * One allocated on every mount. */ struct mount { int m_flags; /* status */ dev_t m_dev; /* device mounted */ struct inode *m_inodp; /* pointer to mounted on inode */ struct buf *m_bufp; /* buffer for super block */ struct inode *m_mount; /* pointer to mount root inode */ }; #define MFREE 0 #define MINUSE 1 #define MINTER 2 extern struct mount mount[]; E 1 h07109 s 00001/00001/00101 d D 4.4 87/05/17 17:52:36 build 8 7 c changed #idents back again. -mkm e s 00001/00001/00101 d D 4.3 87/05/14 16:25:55 build 7 6 c removed old SCCS strings and inserted #ident BB e s 00017/00002/00085 d D 4.2 87/04/16 15:17:41 dc 6 5 c dc - Add Bull updates from 03/05/87 e s 00000/00000/00087 d D 4.1 87/02/20 13:34:15 build 5 4 c rolled rev to -r4 /dc e s 00000/00000/00087 d D 3.1 87/01/19 09:25:55 build 4 3 c rolled rev to -r3 /dc e s 00000/00000/00087 d D 2.1 87/01/19 09:25:55 build 3 2 c AUTO NULL DELTA e s 00001/00000/00086 d D 1.2 87/01/16 10:20:26 build 2 1 c add ident string /dc e s 00086/00000/00000 d D 1.1 87/01/09 15:42:07 build 1 0 c Placed under source control - dc e u U f b f n t T I 2 D 6 /* "%W% %E%" */ E 2 I 1 /* @(#)msg.h 6.1 */ E 6 I 6 D 7 /* " %W% %E% " */ E 7 I 7 D 8 #ident " %W% %E% " E 8 I 8 /* " %W% %E% " */ E 8 E 7 E 6 /* ** IPC Message Facility. */ /* ** Implementation Constants. */ #define PMSG (PZERO + 2) /* message facility sleep priority */ /* ** Permission Definitions. */ #define MSG_R 0400 /* read permission */ #define MSG_W 0200 /* write permission */ /* ** ipc_perm Mode Definitions. */ #define MSG_RWAIT 01000 /* a reader is waiting for a message */ #define MSG_WWAIT 02000 /* a writer is waiting to send */ /* ** Message Operation Flags. */ #define MSG_NOERROR 010000 /* no error if big message */ /* ** Structure Definitions. */ /* ** There is one msg queue id data structure for each q in the system. */ struct msqid_ds { struct ipc_perm msg_perm; /* operation permission struct */ struct msg *msg_first; /* ptr to first message on q */ struct msg *msg_last; /* ptr to last message on q */ ushort msg_cbytes; /* current # bytes on q */ ushort msg_qnum; /* # of messages on q */ ushort msg_qbytes; /* max # of bytes on q */ ushort msg_lspid; /* pid of last msgsnd */ ushort msg_lrpid; /* pid of last msgrcv */ time_t msg_stime; /* last msgsnd time */ time_t msg_rtime; /* last msgrcv time */ time_t msg_ctime; /* last change time */ }; /* ** There is one msg structure for each message that may be in the system. */ struct msg { struct msg *msg_next; /* ptr to next message on q */ long msg_type; /* message type */ short msg_ts; /* message text size */ short msg_spot; /* message text map address */ }; /* ** User message buffer template for msgsnd and msgrecv system calls. */ struct msgbuf { long mtype; /* message type */ char mtext[1]; /* message text */ }; /* ** Message information structure. */ struct msginfo { int msgmap, /* # of entries in msg map */ msgmax, /* max message size */ msgmnb, /* max # bytes on queue */ msgmni, /* # of message queue identifiers */ msgssz, /* msg segment size (should be word size multiple) */ msgtql; /* # of system message headers */ ushort msgseg; /* # of msg segments (MUST BE < 32768) */ }; I 6 /* We have to be able to lock a message queue since we can ** sleep during message processing due to a page fault in ** copyin/copyout or iomove. We cannot add anything to the ** msqid_ds structure since this is used in user programs ** and any change would break object file compatibility. ** Therefore, we allocate a parallel array, msglock, which ** is used to lock a message queue. The array is defined ** in the msg master file. The following macro takes a ** pointer to a message queue and returns a pointer to the ** lock entry. The argument must be a pointer to a msgqid ** structure. **/ #define MSGLOCK(X) &msglock[X - msgque] E 6 E 1 h58623 s 00001/00001/00154 d D 4.6 87/05/17 17:52:38 build 12 11 c changed #idents back again. -mkm e s 00001/00001/00154 d D 4.5 87/05/14 16:26:05 build 11 10 c removed old SCCS strings and inserted #ident BB e s 00006/00001/00149 d D 4.4 87/05/12 13:53:56 dc 10 8 c dc - Add extended tape support e s 00003/00001/00149 d R 4.4 87/05/12 13:34:41 dc 9 8 c dc - Add extended tape support e s 00045/00043/00105 d D 4.3 87/04/22 19:09:06 build 8 7 c translated French comments. (ksm) e s 00001/00001/00147 d D 4.2 87/04/16 15:18:15 dc 7 6 c dc - Add Bull updates from 03/05/87 e s 00000/00000/00148 d D 4.1 87/02/20 13:34:18 build 6 5 c rolled rev to -r4 /dc e s 00016/00018/00132 d D 3.2 87/02/13 11:21:26 build 5 4 c add bull changes from Jan 23 /dc e s 00000/00000/00150 d D 3.1 87/01/19 09:25:58 build 4 3 c rolled rev to -r3 /dc e s 00000/00000/00150 d D 2.1 87/01/19 09:25:58 build 3 2 c AUTO NULL DELTA e s 00001/00000/00149 d D 1.2 87/01/16 10:20:29 build 2 1 c add ident string /dc e s 00149/00000/00000 d D 1.1 87/01/09 15:42:09 build 1 0 c Placed under source control - dc e u U f b f n t T I 2 D 7 /* "%W% %E%" */ E 7 I 7 D 11 /* " %W% %E% " */ E 11 I 11 D 12 #ident " %W% %E% " E 12 I 12 /* " %W% %E% " */ E 12 E 11 E 7 E 2 I 1 /* * mt driver definitions */ /* minor structure : */ /* */ D 8 /* bit 7-6 : numero de controleur */ /* bit 5-4 : densite : */ E 8 I 8 /* bit 7-6 : controller number */ /* bit 5-4 : density : */ E 8 /* 00 800 bpi l */ /* 01 1600 bpi m */ /* 10 3200 bpi i */ /* 11 6250 bpi h */ /* */ D 8 /* bit 3 : 1 no rewind au close n */ /* 0 rewind au close */ E 8 I 8 /* bit 3 : 1 no rewind on close n */ /* 0 rewind on close */ E 8 /* */ /* bit 2-1-0 : unit */ /* */ D 8 /* exemples : E 8 I 8 /* examples : E 8 I 5 ccddruuu E 5 /dev/rmt/0m 00010000 --> 0x10 16 0mn 00011000 --> 0x18 24 1m 00010001 --> 0x11 17 1mn 00011001 --> 0x19 25 */ D 5 #define MONOBUF 1 /* driver monobuffer */ /* EQU commandes */ E 5 /* */ I 5 D 8 /* commandes */ E 8 I 8 /* commands */ E 8 /* */ E 5 D 5 /* commandes e/s sur bande (tape_cmd.cmd) */ E 5 #define GO_CMD 0 /* GO */ #define RWD 1 /* Rewind */ #define RWDOFL 2 /* Rewind + Unload */ D 5 E 5 #define E_CMD 3 /* Erase Command */ #define A_CMD 4 /* Again Command */ #define NO_CMD -1 /* not a Command */ #define STATUS 0 #define MODE 1 #define ADDR 2 #define BCNT 3 D 5 #define LOW_SPEED 0 #define HIGH_SPEED 4 E 5 D 8 #define M_BCNT 0x000FFFFF /* masque pour C.O. */ #define M_ADDR 0x003FFFFF /* masque pour DMA */ #define M_DEV 0xFF000000 /* masque pour device */ #define M_STAT 0x000FFFFF /* masque pour status */ E 8 I 8 #define M_BCNT 0x000FFFFF /* mask for C.O. */ D 10 #define M_ADDR 0x003FFFFF /* mask for DMA */ E 10 I 10 #define M_BCNTEXT 0x00FFFFFF /* mask for C.O. (ext tape: 24 bits)*/ #define M_ADDR 0x00FFFFFF /* mask for DMA */ #define M_ADDREXT 0x07FFFFFF /* mask for DMA (ext tape: 27 bits)*/ E 10 #define M_DEV 0xFF000000 /* mask for device */ #define M_STAT 0x000FFFFF /* mask for status */ E 8 /* BIT FIELDS FOR THE STATUS REGISTER */ #define DBSY 0x00001 /* data busy */ D 8 #define FBSY 0x00002 /* formateur busy */ E 8 I 8 #define FBSY 0x00002 /* formatter busy */ E 8 #define T_READY 0x00004 #define ONLINE 0x00008 /* tape on line */ D 8 #define PROTECTED 0x00010 /* bande protegee */ E 8 I 8 #define PROTECTED 0x00010 /* write protected */ E 8 #define BOTAPE 0x00020 /* bottom of tape */ D 8 #define EOTAPE 0x00040 /* end of tape rencontre */ E 8 I 8 #define EOTAPE 0x00040 /* end of tape found */ E 8 #define TAPE_REWIND 0x00080 D 5 #define TAPE_HIGH_SPEED 0x00100 E 5 I 5 #define T_HSPD 0x00100 /* tape high speed */ E 5 #define P3 0x00200 #define P4 0x00400 #define T_IDENT 0x00800 #define CER 0x01000 #define HER 0x02000 /* hardware error */ D 8 #define FMK 0x04000 /* detection de TM */ #define T_CIP 0x08000 /* commande in progress */ #define T_OUR 0x10000 /* over|under run */ #define DMAE 0x20000 /* DMA erreur */ E 8 I 8 #define FMK 0x04000 /* file mark detected */ #define T_CIP 0x08000 /* command in progress */ #define T_OUR 0x10000 /* over/under run */ #define DMAE 0x20000 /* DMA error */ E 8 #define TPE 0x40000 /* tape parity error */ #define BCO 0x80000 /* byte count overflow */ D 8 #define G_ERROR (TPE|T_CIP|DMAE|T_OUR|HER) /* erreur grave */ #define T_ERROR (EOT|FMK|BCO) /* erreur de transfert */ E 8 I 8 #define G_ERROR (TPE|T_CIP|DMAE|T_OUR|HER) /* hard error */ #define T_ERROR (EOT|FMK|BCO) /* transfer error */ E 8 /* BIT FIELDS FOR THE MODE REGISTER */ #define D_READ 0x0000 #define D_SPEED 0x0004 #define D_FMK 0x0008 #define D_EDIT 0x0010 #define D_ERASE 0x0020 D 8 #define D_WRITE 0x0040 /* mode write */ #define D_REV 0x0080 /* mode reverse */ #define D_TAD0 0x0100 /* adresse transport 0 */ #define D_TAD1 0x0200 /* adresse transport 1 */ #define D_FAD 0x0400 /* adresse du formateur */ #define D_FMTE 0x0800 /* mode formateur enable */ #define D_DMAE 0x1000 /* mode dma enable */ #define D_INTE 0x2000 /* mode interrupt enable */ E 8 I 8 #define D_WRITE 0x0040 /* write */ #define D_REV 0x0080 /* reverse */ #define D_TAD0 0x0100 /* address of transport 0 */ #define D_TAD1 0x0200 /* address of transport 1 */ #define D_FAD 0x0400 /* address of formatter */ #define D_FMTE 0x0800 /* formatter enable */ #define D_DMAE 0x1000 /* dma enable */ #define D_INTE 0x2000 /* interrupt enable */ E 8 #define D_UNIT (D_FAD | D_TAD1 | D_TAD0) D 8 /* commandes concernant le mode (tape_cmd.mode) */ E 8 I 8 /* Tape mode commands (tape_cmd.mode) */ E 8 #define SRFOR (D_INTE | D_FMTE | D_ERASE | D_SPEED) /* Skip Record Forward */ #define SRREV (D_INTE | D_FMTE | D_ERASE | D_SPEED | D_REV) /* Skip Record Reverse */ #define SFFOR (D_INTE | D_FMTE | D_ERASE | D_SPEED | D_FMK) /* Skip File Forward */ #define SFREV (D_INTE | D_FMTE | D_ERASE | D_SPEED | D_FMK | D_REV) /* Skip File Reverse */ #define WTM (D_INTE | D_FMTE | D_WRITE | D_FMK) /* Write a Tape Mark */ #define RBLK (D_INTE | D_FMTE | D_DMAE ) /* Read a block */ #define WBLK (D_INTE | D_FMTE | D_DMAE | D_WRITE) /* Write a block */ #define WERASE (D_INTE | D_FMTE | D_ERASE | D_WRITE) /* Erase a block */ D 5 #define D0800 0 /* densite non geree */ #define D1600 (D_INTE | D_FMTE | D_FMK | D_EDIT | D_ERASE) /* 1600 BPI */ #define D3200 (D_INTE | D_FMTE | D_FMK | D_EDIT | D_ERASE | D_REV) /* 3200 BPI */ #define D6250 0 /* densite non geree */ E 5 I 5 #define WSERAS (D_INTE | D_FMTE | D_FMK | D_EDIT | D_ERASE | D_WRITE) /* write security erase */ E 5 D 8 #define ORWD (D_INTE | D_FMTE) /* mode pour RWD + IT */ D 5 #define ORWDOFL (D_INTE | D_FMTE | D_REV) /* pour RWDOFL (D_REV logique) */ E 5 I 5 #define ORWDOFL (D_INTE | D_FMTE | D_SPEED) /* pour RWDOFL (D_SPEED logique)*/ E 8 I 8 #define ORWD (D_INTE | D_FMTE) /* mode for RWD + IT */ #define ORWDOFL (D_INTE | D_FMTE | D_SPEED) /* for RWDOFL (D_SPEED logic)*/ E 8 E 5 I 5 D 8 #define D0 0 /* densite non geree */ E 8 I 8 #define D0 0 /* density not selected */ E 8 #define D1 (D_INTE | D_FMTE | D_FMK | D_EDIT | D_ERASE) /* 1600 BPI */ #define D2 (D_INTE | D_FMTE | D_FMK | D_EDIT | D_ERASE | D_REV) /* 3200 BPI */ #define D3 (D_INTE | D_FMTE | D_WRITE | D_REV) /* 6250 BPI */ D 8 #define C_STAT (D_INTE | D_FMTE | D_EDIT | D_ERASE) /* Get STATus pour CYPHER */ #define K_STAT (D_INTE | D_FMTE | D_EDIT | D_WRITE | D_REV) /* Get STATus pour KEYSTONE */ E 8 I 8 #define C_STAT (D_INTE | D_FMTE | D_EDIT | D_ERASE) /* Get STATus for CYPHER */ #define K_STAT (D_INTE | D_FMTE | D_EDIT | D_WRITE | D_REV) /* Get STATus for KEYSTONE */ E 8 #define RDXTST (D_INTE | D_FMTE | D_EDIT) #define R_STAT (D_INTE | D_FMTE | D_DMAE | D_REV) #define G_STAT (D_FMTE) E 5 struct tape_cmd { int cmd; int mode; int addr; int bcnt; D 8 uint stat; /* status de l'unite associee */ daddr_t blkno; /* no bloc courant = posit sur la bande */ daddr_t nxrec; /* no bloc EOF (TM ou dernier bloc ecrit+1)*/ D 5 #if MONOBUF==0 uint index; #endif E 5 unsigned char openf; /* indic. open et compteur de reprises */ unsigned char dens; /* indicateur densite bande */ unsigned char eot; /* compteur d'eot */ unsigned char adctl; /* adresse du controleur gerant l'unite */ E 8 I 8 uint stat; /* status */ daddr_t blkno; /* current block number on tape */ daddr_t nxrec; /* number of blocks since last file mark (last block written + 1) */ unsigned char openf; /* open indicator and reset counter */ unsigned char dens; /* tape density */ unsigned char eot; /* end of tape indicator */ unsigned char adctl; /* controller address */ I 10 /* masks for address and byte count fields */ int maddr; /* M_ADDR or M_ADDREXT, depending on ctrl type*/ int mbcnt; /* M_BCNT or M_BCNTEXT, depending on ctrl type*/ E 10 E 8 }; D 8 /* structure du tcmd->cmd */ E 8 I 8 /* structure of tcmd->cmd */ E 8 #define TO_RWD 0x01 #define TO_RWDOFL 0x02 #define TO_GO 0x04 #define TO_BCNT 0x08 #define TO_ADDR 0x10 #define TO_MODE 0x20 D 8 #define NMTUNIT 8 /* nombre d'unites par controleur */ #define NMTMAX 4 /* nombre maxi. de controleurs par conf */ E 8 I 8 #define NMTUNIT 8 /* number of units/controller */ #define NMTMAX 4 /* maximum number of controllers */ E 8 #define mtdens(x) (((x)&(0x30))>>4) #define MTUNIT(x) (x & 7) #define CMDTYPE(x) (x & 0xFF00) #define NOREWIND 0x08 E 1 h61526 s 00001/00001/00017 d D 4.6 87/05/17 17:52:40 build 10 9 c changed #idents back again. -mkm e s 00001/00001/00017 d D 4.5 87/05/14 16:26:16 build 9 8 c removed old SCCS strings and inserted #ident BB e s 00003/00003/00015 d D 4.4 87/04/22 19:23:24 build 8 7 c translated French comments. (ksm) e s 00000/00001/00018 d D 4.3 87/04/17 08:36:12 dc 7 6 c dc - Add Bull (sccs) changes from 03/05/87 e s 00002/00001/00017 d D 4.2 87/04/16 15:18:26 dc 6 5 c dc - Add Bull updates from 03/05/87 e s 00000/00000/00018 d D 4.1 87/02/20 13:34:21 build 5 4 c rolled rev to -r4 /dc e s 00000/00000/00018 d D 3.1 87/01/19 09:26:00 build 4 3 c rolled rev to -r3 /dc e s 00000/00000/00018 d D 2.1 87/01/19 09:26:00 build 3 2 c AUTO NULL DELTA e s 00001/00000/00017 d D 1.2 87/01/16 10:20:32 build 2 1 c add ident string /dc e s 00017/00000/00000 d D 1.1 87/01/09 15:42:10 build 1 0 c Placed under source control - dc e u U f b f n t T I 2 D 6 /* "%W% %E%" */ E 6 I 6 D 9 /* " %W% %E% " */ E 9 I 9 D 10 #ident " %W% %E% " E 10 I 10 /* " %W% %E% " */ E 10 E 9 E 6 E 2 I 1 /* * mt driver definitions */ D 8 /* commandes pour mtioctl */ E 8 I 8 /* mag tape ioctl commands */ E 8 #define MTYPE ('m'<<8) #define MTIOWEOF (MTYPE|0x11) /* write tape mark */ #define MTIOFSF (MTYPE|0x01) /* forward skip file */ #define MTIOBSF (MTYPE|0x81) /* backward skip file */ #define MTIOFSR (MTYPE|0x03) /* forward skip record */ #define MTIOBSR (MTYPE|0x83) /* backward skip record */ #define MTIOREW (MTYPE|0x84) /* rewind tape to bot */ #define MTIOOFFL (MTYPE|0x85) /* rewind tape + offline */ D 8 #define MTIOEDT (MTYPE|0x08) /* counters edition */ I 6 D 7 #define MTIOINIT (MTYPE|0x87) /* driver type initialisation */ E 7 E 6 #define MTNOP (MTYPE|0x06) /* status derouleur */ E 8 I 8 #define MTIOEDT (MTYPE|0x08) /* counters edition (??) */ #define MTNOP (MTYPE|0x06) /* no op, read status only */ E 8 E 1 h11442 s 00001/00001/00075 d D 4.4 87/05/17 17:52:41 build 8 7 c changed #idents back again. -mkm e s 00001/00001/00075 d D 4.3 87/05/14 16:26:26 build 7 6 c removed old SCCS strings and inserted #ident BB e s 00003/00004/00073 d D 4.2 87/04/16 15:18:58 dc 6 5 c dc - Add Bull updates from 03/05/87 e s 00000/00000/00077 d D 4.1 87/02/20 13:34:23 build 5 4 c rolled rev to -r4 /dc e s 00000/00000/00077 d D 3.1 87/01/19 09:26:02 build 4 3 c rolled rev to -r3 /dc e s 00000/00000/00077 d D 2.1 87/01/19 09:26:02 build 3 2 c AUTO NULL DELTA e s 00001/00000/00076 d D 1.2 87/01/16 10:20:34 build 2 1 c add ident string /dc e s 00076/00000/00000 d D 1.1 87/01/09 15:42:11 build 1 0 c Placed under source control - dc e u U f b f n t T I 2 D 6 /* "%W% %E%" */ E 2 I 1 /* @(#)opt.h 6.1 */ E 6 I 6 D 7 /* " %W% %E% " */ E 7 I 7 D 8 #ident " %W% %E% " E 8 I 8 /* " %W% %E% " */ E 8 E 7 E 6 #if MESG==0 msgsys(){nosys();} msginit(){return(0);} #endif #if SEMA==0 semsys(){nosys();} seminit(){} semexit(){} #endif #if SHMEM==0 shmsys(){nosys();} shmexec(){} shmexit(){} shmfork(){} shmreset(){} #endif #if SOCKET_0==0 socinit(){} socket(){nosys();} socksend(){nosys();} sockrecv(){nosys();} connect(){nosys();} bind(){nosys();} setsockopt(){nosys();} listen(){nosys();} accept(){nosys();} shutdown(){nosys();} socketpair(){nosys();} getpeername(){nosys();} recvfrom(){nosys();} sendto(){nosys();} recvmsg(){nosys();} sendmsg(){nosys();} getsockname(){nosys();} getsockopt(){nosys();} #else #if TCPIP_0==0 ifioctl(){} rtioctl(){} raw_input(){} raw_ctlinput(){} raw_usrreq(){} raw_init(){} #endif TCPIP_0 #endif SOCKET_0 putchar(c) { #if CIO_0 D 6 cio_putchar(c); E 6 I 6 cio_putchar(c); E 6 #else D 6 fdlp_putchar(c); E 6 I 6 fdlp_putchar(c); E 6 #endif } getchar(flag) { #if CIO_0 return(cio_getchar(flag)); #else return(fdlp_getchar(flag)); #endif } breakchar() { #if CIO_0 return(cio_breakchar()); #else return(fdlp_breakchar()); #endif } E 1 h46093 s 00001/00001/00223 d D 4.5 87/05/17 17:52:42 build 12 11 c changed #idents back again. -mkm e s 00001/00001/00223 d D 4.4 87/05/14 16:26:36 build 11 10 c removed old SCCS strings and inserted #ident BB e s 00003/00000/00221 d D 4.3 87/05/07 17:03:42 dc 10 9 c dc - Add comments re: clock board, physmem hookups e s 00009/00001/00212 d D 4.2 87/04/16 15:21:30 dc 9 8 c dc - Add Bull updates from 03/05/87 e s 00000/00000/00213 d D 4.1 87/02/20 13:34:26 build 8 7 c rolled rev to -r4 /dc e s 00001/00001/00212 d D 3.3 87/01/29 15:51:54 build 7 5 c change PG_PFNUM to be a 15 bit mask e s 00001/00001/00212 d R 3.3 87/01/28 18:00:33 build 6 5 c make PG_PFNUM be a 15 bit mask so svto[pc] work. e s 00139/00056/00074 d D 3.2 87/01/26 11:16:03 build 5 4 c make page table changes e s 00000/00000/00130 d D 3.1 87/01/19 09:26:04 build 4 3 c rolled rev to -r3 /dc e s 00000/00000/00130 d D 2.1 87/01/19 09:26:04 build 3 2 c AUTO NULL DELTA e s 00001/00000/00129 d D 1.2 87/01/16 10:20:37 build 2 1 c add ident string /dc e s 00129/00000/00000 d D 1.1 87/01/09 15:42:12 build 1 0 c Placed under source control - dc e u U f b f n t T I 2 D 9 /* "%W% %E%" */ E 9 I 9 D 11 /* " %W% %E% " */ E 11 I 11 D 12 #ident " %W% %E% " E 12 I 12 /* " %W% %E% " */ E 12 E 11 E 9 E 2 I 1 /* * SPS9 page table entry */ D 5 /* fault type */ #define DATA_FAULT 0 #define TEXT_FAULT 1 E 5 /* level masks for a page address */ D 5 #define L0MASK 0x1f #define L1MASK 0x7fe0 E 5 I 5 #define L0MASK 0x3f #define L1MASK 0x3fc0 #define L2MASK 0x7c000 E 5 /* level widths */ D 5 #define L0WIDTH 5 #define L1WIDTH 10 E 5 I 5 #define L0WIDTH 6 #define L1WIDTH 8 #define L2WIDTH 5 E 5 D 5 #define PG_PFNUM 0xfffff #define PG_M 0x1 #define PG_V 0x2 #define PG_W 0x4 #define PG_LOCK 0x8 #define PG_NDREF 0x10 #define PG_COPYW 0x20 #define PG_E 0x80000000 #define PG_KW 0x4 #define PG_KR 0 #define PG_UR 0 #define PG_UW 0x4 E 5 /* Definition of a virtual address. */ struct vaddress { D 5 unsigned v_mbz:5, /* must be zero */ v_sn:10, /* Virtual segment number */ v_vpn:5, /* Virtual page number */ v_byte:12; /* Byte within the page */ E 5 I 5 unsigned v_space : 1, /* user or kernel space */ v_sc : 5, /* Virtual section number */ v_sn : 8, /* Virtual segment number */ v_vpn : 6, /* Virtual page number */ v_byte : 12; /* Byte within the page */ E 5 }; /* Definition of a physical address. */ struct paddress { unsigned p_mbz:5, /* Must be zero */ p_pfn:15, /* Page frame number */ p_byte:12; /* Byte within the page */ }; typedef union pte { /* * ------------------------------------------------------------------- D 5 * |E| Unused | Real Page |C|R|L|W|V|M| E 5 I 5 * | Unused | Real Page |C|L|R|D|V|W| E 5 * ------------------------------------------------------------------- D 5 * 1 10 15 1 1 1 1 1 1 E 5 I 5 * 11 15 1 1 1 1 1 1 E 5 */ struct { D 5 unsigned int pg_exist : 1, /* on if this pte is valid */ pg_unus : 10, /* ten bits unused */ pg_pfn : 15, /* real page number */ pg_cw : 1, /* copy on write */ pg_r : 1, /* needed reference */ pg_l : 1, /* page locked for IO */ pg_w : 1, /* write allowed */ pg_v : 1, /* valid page */ pg_d : 1; /* page modified */ E 5 I 5 unsigned int : 1, /* unused bits */ pg_pfn : 15, /* real page number */ : 11, /* unused bit */ pg_r : 1, /* needed reference */ pg_l : 1, /* page locked for IO */ pg_w : 1, /* write allowed */ pg_v : 1, /* valid page */ pg_d : 1; /* page modified */ E 5 } pgm; /* * For fast mask operations when needed * (a single mask operation beats setting * several individual fields to constant values). */ struct { int pg_pte; } pgi; } pte_t; I 5 /* * Definition of segment table entry */ typedef struct sgte { unsigned int pt_paddr : 31, /* page table physical addr */ pt_w : 1 ; /* segment protection */ } sgte_t ; #define ptost(x) ((x) >> 1) #define sttop(x) ((x) << 1) /* * Definition of section table entry */ typedef struct scte { paddr_t sgt_paddr ; /* segment table physical address */ } scte_t ; E 5 #define pg_prot pg_w /* read or read & write */ #define pg_m pg_d /* modify bit */ D 5 #define pg_ndref pg_nr /* needed reference bit */ E 5 #define pg_lock pg_l /* lock bit */ D 5 typedef union pte spte_t; E 5 I 5 D 7 #define PG_PFNUM 0xfffff E 7 I 7 #define PG_PFNUM 0x7fff E 7 #define PG_M 0x1 #define PG_V 0x2 #define PG_W 0x4 #define PG_LOCK 0x8 #define PG_REF 0x10 E 5 I 5 #define PG_KW 0x4 #define PG_KR 0 #define PG_UR 0 #define PG_UW 0x4 E 5 #define PTE_KR 0 #define PTE_KW 1 #define PTE_UR 0 #define PTE_UW 1 D 5 #define PT_VAL 1 /* page valid */ #define PT_LOCK 1 /* page locked */ #define PT_COPYW 1 /* copy on write */ #define PT_MOD 1 /* modify bit */ #define PT_NDREF 1 /* needed reference bit */ #define PT_WRITE 1 /* page writeable */ E 5 I 5 #define SGT_KR 0 #define SGT_UR 0 #define SGT_KW 1 #define SGT_UW 1 E 5 D 5 #define NPGPT 32 /* Nbr of pages per page table (seg) */ #define NPTPP 32 /* Nbr of page tables per page */ E 5 I 5 #define NPGPT 64 /* Nbr of pages per page table (seg) */ #define NPTPP 16 /* Nbr of page tables per page */ #define NPTPPSHFT 4 /* Shift of NPTPP */ E 5 D 5 #define PTSIZE 128 /* page table size in bytes */ #define PTSZSHFT 7 /* page table size shift count */ E 5 I 5 #define NSGTPP 4 /* Nbr of segment tables per page */ #define NPTPSC 4 /* Nbr of page tables per section */ #define NSGTPSC 256 /* Nbr of segment entrys per section */ E 5 D 5 extern int *sbrpte ; E 5 I 5 #define NPGPSC NPGPT*NSGTPSC /* Nbr of pages per section */ E 5 I 5 #define PTSIZE 256 /* page table size in bytes */ #define PTSZSHFT 8 /* page table size shift count */ #define SGTSIZE 1024 /* segment table size in bytes */ #define SGTSZSHFT 10 /* segment table size shift count */ #define NBSECT 32 /* Nbr of section per process */ E 5 /* I 5 * Page Table */ typedef union ptbl { pte_t page[NPGPT] ; } ptbl_t ; /* * Segment Table */ typedef union sgtbl { sgte_t segment[NSGTPSC] ; } sgtbl_t ; /* * Section Table */ typedef union sctbl { scte_t section[NBSECT] ; } sctbl_t ; extern caddr_t kbase ; extern scte_t *ksct ; /* E 5 | System virtual address */ D 5 #define SYSVA 0x0 E 5 I 5 #define SYSVA 0x80000000 E 5 /* D 5 | get user segment and page descriptor address knowing virtual page address E 5 I 5 * Page tables (64 entries == 256 bytes) to pages. I 9 * * Memory configuration at boot time * * from 0 to 3c000 unused * from 3c000 to 3e000 interface with the clock board and dcb for fdlp & priam * from 3e000 to 42000 code and data of RBUG * from 42000 to .... SPIX code and data space I 10 * ... FIRSTFREE_PAGES is used in os/startup.c to allow writes to the * page which is used for clock board interface, and hence MUST agree * with the equivalent of btotp(PHMWC....), from sys/physmem.h. E 10 E 9 E 5 */ I 9 #define FIRSTFREE_PAGES 0x3c E 9 D 5 #define uste(p , a) ((pte_t **)(p->p_sgt + ((((int)a) & L1MASK ) >> L0WIDTH))) #define upte(p , a) ((pte_t *)(*uste(p,a) + (((int)a) & L0MASK))) E 5 I 5 #define pttopgs(X) ((X + NPTPP -1) >> NPTPPSHFT) E 5 I 5 /* * Physical address to virtual. * Used to access page tables in virtual space : ptol(x->zz_paddr) * physical memory is mapped contiguously at address kbase. */ #define ptol(x) ((x) + kbase) #define ltop(x) ((paddr_t)ptob(svtopte((int)(x))->pgm.pg_pfn)) #define kvtopfn(x) ((int)x - (int)kbase) /* * get kernel section segment and page descriptor address knowing virtual page address */ #define sscte(a) (ksct + ((((int)a) & L2MASK) >> (L1WIDTH+L0WIDTH))) #define sste(a) ((sgte_t *)ptol(sscte(a)->sgt_paddr)\ + ((((int)a) & L1MASK) >> L0WIDTH)) #define spte(a) ((pte_t *)ptol(sttop(sste(a)->pt_paddr)) + (((int)a) & L0MASK)) /* | get user section segment and page descriptor address knowing virtual page address */ #define uscte(p , a) (p->p_sct + ((((int)a) & L2MASK) >> (L1WIDTH+L0WIDTH))) #define uste(p , a) ((sgte_t)ptol(uscte(p,a)->sgt_paddr) \ + ((((int)a) & L1MASK) >> L0WIDTH)) #define upte(p , a) ((pte_t *)ptol(sttop(uste(p,a)->pt_paddr)) \ + (((int)a) & L0MASK)) E 5 #define svtoc(X) (((int)(X) >> 12) & PG_PFNUM) #define ctosv(X) (((int)(X) << 12) + SYSVA) #define svtop(X) (((int)(X) >> 12) & PG_PFNUM) #define ptosv(X) (((int)(X) << 12) + SYSVA) #define ctopv(X) ((int)(X) << 12) D 5 #define svtopte(X) (sbrpte + svtoc(X)) E 5 I 5 #define svtopte(X) (spte(svtop((int)X))) E 5 /* * system virtual address to physical address */ D 5 #define svtophys(a) (((pte_t *)sbrpte)[svtop(a)].pgm.pg_pfn << BPPSHIFT) E 5 I 5 #define svtophys(a) (ltop(a) + poff(a)) /* * pte of user block area */ extern pte_t *ublk_ptbl ; #define ublkptbl(p) (ublk_ptbl + (uint)(p - &proc[0])) E 5 E 1 h57494 s 00001/00001/00176 d D 4.4 87/05/17 17:52:44 build 9 8 c changed #idents back again. -mkm e s 00001/00001/00176 d D 4.3 87/05/14 16:26:49 build 8 7 c removed old SCCS strings and inserted #ident BB e s 00002/00002/00175 d D 4.2 87/04/16 15:22:12 dc 7 6 c dc - Add Bull updates from 03/05/87 e s 00000/00000/00177 d D 4.1 87/02/20 13:34:29 build 6 5 c rolled rev to -r4 /dc e s 00010/00011/00167 d D 3.2 87/01/26 11:21:46 build 5 4 c add page table changes e s 00000/00000/00178 d D 3.1 87/01/19 09:26:07 build 4 3 c rolled rev to -r3 /dc e s 00000/00000/00178 d D 2.1 87/01/19 09:26:07 build 3 2 c AUTO NULL DELTA e s 00001/00000/00177 d D 1.2 87/01/16 10:20:41 build 2 1 c add ident string /dc e s 00177/00000/00000 d D 1.1 87/01/09 15:42:14 build 1 0 c Placed under source control - dc e u U f b f n t T I 2 D 7 /* "%W% %E%" */ E 7 I 7 D 8 /* " %W% %E% " */ E 8 I 8 D 9 #ident " %W% %E% " E 9 I 9 /* " %W% %E% " */ E 9 E 8 E 7 E 2 I 1 /* * fundamental variables * don't change too often D 5 */ E 5 I 5 D 7 */ E 7 I 7 */ E 7 E 5 #define NOFILE 64 /* max open files per process */ #define MAXPID 30000 /* max process id */ #define MAXUID 60000 /* max user id */ #define MAXLINK 1000 /* max links */ #define PAGE_VERSION 1 /* mv */ D 5 #define MAXMEM (4096) /* max core in 4096-byte clicks */ E 5 I 5 #define MAXMEM (8*4096) /* max core in 4096-byte clicks */ E 5 #define MAXBLK 16 /* max logical blocks possible for phys IO */ #define SWAPSIZE 128 /* granularity of partial swaps (in clicks) */ #define SSIZE 1 /* initial stack size (*4096 bytes) */ #define SINCR 1 /* increment of stack (*4096 bytes) */ #define USIZE 1 /* size of user block (*4096 bytes) */ D 5 #define USRSTACK 0x7fe0000 /* Start of user stack */ /* Start of kernel stack */ #define KERNSTACK 0x8000000 E 5 I 5 #define USRSTACK 0x7ffc0000 /* Start of user stack */ E 5 /* Start of user block */ D 5 #define USRBLK (KERNSTACK - (USIZE << BPPSHIFT)) E 5 I 5 #define USRBLK 0xfffc0000 /* Start of kernel stack */ #define KERNSTACK (USRBLK + (USIZE << BPPSHIFT)) E 5 #define CANBSIZ 256 /* max size of typewriter line */ #define HZ 50 /* Ticks/second of the clock */ #define TIMER_PERIOD 20 /* timer period in ms 1000/HZ */ #define NCARGS 5120 /* # characters in exec arglist */ #define SCHMAX 127 /* * priorities * should not be altered too much */ #define PMASK 0177 #define PCATCH 0400 #define PSWP 0 #define PMEM 0 #define PINOD 10 #define PRIBIO 20 #define PZERO 25 #define NZERO 20 #define PPIPE 26 #define PWAIT 30 #define PSLEP 39 #define PUSER 60 #define PIDLE 127 /* * fundamental constants of the implementation-- * cannot be changed easily */ #define NBPW sizeof(int) /* number of bytes in an integer */ D 5 #define NCPS 32 /* Number of clicks per segment */ #define NBPS 0x20000 /* Number of bytes per segment */ E 5 I 5 #define NCPS 64 /* Number of clicks per segment */ #define NBPS 0x40000 /* Number of bytes per segment */ E 5 #define NBPC 4096 /* Number of bytes per click */ #define NBPP 4096 /* Number of bytes per page */ D 5 #define NCPR 1024 /* NUmber of clics per rlist */ E 5 /* PB #define NCPD 1 */ /* Number of clicks per disk block */ #define NDPP 8 /* number of disk blocks per page */ #define DPPSHFT 3 /* LOG2(NDPP) if exact */ #define BPCSHIFT 12 /* LOG2(NBPC) if exact */ #define BPPSHIFT 12 /* LOG2(NBPP) if exact */ D 5 #define SOFFMASK 0x1FFFF /* mask for offset into segment */ E 5 I 5 #define SOFFMASK 0x3FFFF /* mask for offset into segment */ E 5 #define POFFMASK 0xFFF /* Mask for offset into page. */ #define NULL 0 D 5 #define MAXUMEM (32*1024) /* max pages per proc */ E 5 I 5 #define MAXUMEM (32*256*64) /* max pages per proc */ E 5 #define CMASK 0 /* default mask for file creation */ #define CDLIMIT (1L<<21) /* default max write address */ #define NODEV (dev_t)(-1) #define ROOTINO ((ino_t)2) /* i number of all roots */ #define SUPERB ((daddr_t)1) /* physical block number of the super block */ #define SUPERBOFF 512 /* byte offset of the super block */ #define DIRSIZ 14 /* max characters per directory */ #define NICINOD 100 /* number of superblock inodes */ #define NICFREE 50 /* number of superblock free blocks */ #ifndef FsTYPE #define FsTYPE 3 #endif #if FsTYPE==1 /* Original 512 byte file system */ #define BSIZE 512 /* size of file system block (bytes) */ #define SBUFSIZE BSIZE /* system buffer size */ #define BSHIFT 9 /* LOG2(BSIZE) */ #define NINDIR (BSIZE/sizeof(daddr_t)) #define BMASK 0777 /* BSIZE-1 */ #define INOPB 8 /* inodes per block */ #define INOSHIFT 3 /* LOG2(INOPB) if exact */ #define NMASK 0177 /* NINDIR-1 */ #define NSHIFT 7 /* LOG2(NINDIR) */ #define FsBSIZE(dev) BSIZE #define FsBSHIFT(dev) BSHIFT #define FsNINDIR(dev) NINDIR #define FsBMASK(dev) BMASK #define FsINOPB(dev) INOPB #define FsLTOP(dev, b) b #define FsPTOL(dev, b) b #define FsNMASK(dev) NMASK #define FsNSHIFT(dev) NSHIFT #define FsITOD(dev, x) itod(x) #define FsITOO(dev, x) itoo(x) #endif #if FsTYPE==2 /* New 4096 byte file system */ #define BSIZE 4096 /* size of file system block (bytes) */ #define SBUFSIZE BSIZE /* system buffer size */ #define BSHIFT 12 /* LOG2(BSIZE) */ #define NINDIR (BSIZE/sizeof(daddr_t)) #define BMASK 07777 /* BSIZE-1 */ #define INOPB 64 /* inodes per block */ #define INOSHIFT 6 /* LOG2(INOPB) if exact */ #define NMASK 01777 /* NINDIR-1 */ #define NSHIFT 10 /* LOG2(NINDIR) */ #define FsBSIZE(dev) BSIZE #define FsBSHIFT(dev) BSHIFT #define FsNINDIR(dev) NINDIR #define FsBMASK(dev) BMASK #define FsINOPB(dev) INOPB #define FsLTOP(dev, b) (b<<3) #define FsPTOL(dev, b) (b>>3) #define FsNMASK(dev) NMASK #define FsNSHIFT(dev) NSHIFT #define FsITOD(dev, x) itod(x) #define FsITOO(dev, x) itoo(x) #endif #if FsTYPE==3 /* Dual system */ #define BSIZE 512 /* size of file system block (bytes) */ #define SBUFSIZE (BSIZE*8) /* system buffer size */ #define BSHIFT 9 /* LOG2(BSIZE) */ #define NINDIR (BSIZE/sizeof(daddr_t)) #define BMASK 0777 /* BSIZE-1 */ #define INOPB 8 /* inodes per block */ #define INOSHIFT 3 /* LOG2(INOPB) if exact */ #define NMASK 0177 /* NINDIR-1 */ #define NSHIFT 7 /* LOG2(NINDIR) */ #define Fs2BLK 0x2000 #define FsLRG(dev) (dev&Fs2BLK) #define FsBSIZE(dev) (FsLRG(dev) ? (BSIZE*8) : BSIZE) #define FsBSHIFT(dev) (FsLRG(dev) ? 12 : 9) #define FsNINDIR(dev) (FsLRG(dev) ? 1024 : 128) #define FsBMASK(dev) (FsLRG(dev) ? 07777 : 0777) #define FsBOFF(dev, x) (FsLRG(dev) ? ((x)&07777) : ((x)&0777)) #define FsBNO(dev, x) (FsLRG(dev) ? ((x)>>12) : ((x)>>9)) #define FsINOPB(dev) (FsLRG(dev) ? 64 : 8) #define FsLTOP(dev, b) (FsLRG(dev) ? b<<3 : b) #define FsPTOL(dev, b) (FsLRG(dev) ? b>>3 : b) #define FsNMASK(dev) (FsLRG(dev) ? 01777 : 0177) #define FsNSHIFT(dev) (FsLRG(dev) ? 10 : 7) #define FsITOD(dev, x) (daddr_t)(FsLRG(dev) ? \ ((unsigned)x+(2*64-1))>>6 : ((unsigned)x+(2*8-1))>>3) #define FsITOO(dev, x) (daddr_t)(FsLRG(dev) ? \ ((unsigned)x+(2*64-1))&077 : ((unsigned)x+(2*8-1))&07) #define FsINOS(dev, x) (FsLRG(dev) ? \ ((x&~077)+1) : ((x&~07)+1)) #endif #define SMODE (PS_SV) /* privilege usermode bits */ #define USERMODE(ps) (!(ps & SMODE)) #define BASEPRI(ps) ((ps & PS_IPL) != 0) #define lobyte(X) (((unsigned char *)&X)[1]) #define hibyte(X) (((unsigned char *)&X)[0]) #define loword(X) (((ushort *)&X)[1]) #define hiword(X) (((ushort *)&X)[0]) E 1 h46840 s 00001/00001/00056 d D 4.8 87/05/17 17:52:46 build 13 12 c changed #idents back again. -mkm e s 00001/00001/00056 d D 4.7 87/05/14 16:26:59 build 12 11 c removed old SCCS strings and inserted #ident BB e s 00005/00000/00052 d D 4.6 87/05/08 16:46:50 dc 11 10 c dc - Add rounding mode fields to traps word e s 00000/00001/00052 d D 4.5 87/05/06 09:20:55 dc 10 9 c dc - remove realinex from trpsw_fpe e s 00029/00011/00024 d D 4.4 87/04/30 18:26:02 dc 9 7 c dc - Update default trap enables. e s 00030/00011/00024 d R 4.4 87/04/30 18:24:21 dc 8 7 c q e s 00003/00002/00032 d D 4.3 87/04/30 12:18:03 dc 7 6 c dc - REALINV --> REALBEFORE, change REALINEX, add REALINEXEFP e s 00012/00001/00022 d D 4.2 87/04/16 15:22:43 dc 6 5 c dc - Add Bull updates from 03/05/87 e s 00000/00000/00023 d D 4.1 87/02/20 13:34:32 build 5 4 c rolled rev to -r4 /dc e s 00000/00000/00023 d D 3.1 87/01/19 09:26:09 build 4 3 c rolled rev to -r3 /dc e s 00000/00000/00023 d D 2.1 87/01/19 09:26:09 build 3 2 c AUTO NULL DELTA e s 00001/00000/00022 d D 1.2 87/01/16 10:20:44 build 2 1 c add ident string /dc e s 00022/00000/00000 d D 1.1 87/01/09 15:42:15 build 1 0 c Placed under source control - dc e u U f b f n t T I 2 D 6 /* "%W% %E%" */ E 6 I 6 D 12 /* " %W% %E% " */ E 12 I 12 D 13 #ident " %W% %E% " E 13 I 13 /* " %W% %E% " */ E 13 E 12 E 6 E 2 I 1 /* | SPS9 process control block */ typedef struct pcb { /* Do not touch from HERE */ int regs[16]; char *pc; /* program counter */ short text_seg; short data_seg; int reserved; int traps_word; int clock; /* to HERE */ int res2; int sregs[16]; } pcbt; #define PSL sregs[7]; I 6 D 9 #define USR_DEFAULT_TRPSW 0x80007800 #define SYS_DEFAULT_TRPSW 0xc0000001 E 9 I 9 #define TRPSW_INTOVER 0x8000 /* bit 16 : Integer Overflow */ #define TRPSW_INTDIVZERO 0x4000 /* bit 17 : Integer Div by Zero */ #define TRPSW_REALOVER 0x2000 /* bit 18 : Real Overflow */ #define TRPSW_REALUNDER 0x1000 /* bit 19 : Real Underflow */ #define TRPSW_REALDIVZERO 0x0800 /* bit 20 : Real Div by Zero */ I 11 #define TRPSW_RNDMASK 0x0600 /* bit 21-22 : Rounding mode mask */ #define TRPSW_RNDNEAREST 0x0000 /* : Round to nearest */ #define TRPSW_RNDPLUSINF 0x0200 /* : Round up (plus infinity) */ #define TRPSW_RNDMINUSINF 0x0400 /* : Round down (neg infinity) */ #define TRPSW_RNDTOZERO 0x0600 /* : Round to zero */ E 11 #define TRPSW_REALINEX 0x0100 /* bit 23 : Real Inexact result */ #define TRPSW_REALINEXEFP 0x0080 /* bit 24 : for EFP, Inexact result*/ #define TRPSW_REALBEFORE 0x0040 /* bit 25 : invalid / unsupported op */ E 9 D 9 #define TRPSW_STD_EXC 0x3800 #define TRPSW_INTOVER 0x8000 #define TRPSW_INTDIVZERO 0x4000 #define TRPSW_REALOVER 0x2000 #define TRPSW_REALUNDER 0x1000 #define TRPSW_REALDIVZERO 0x800 D 7 #define TRPSW_REALINEX 0x80 #define TRPSW_REALINV 0x40 E 7 I 7 #define TRPSW_REALINEX 0x100 #define TRPSW_REALINEXEFP 0x80 /* for EFP, enable is bit 24 */ #define TRPSW_REALBEFORE 0x40 E 9 I 9 /* The following defines the default enables for floating point execptions */ #define TRPSW_STD_EXC ( \ TRPSW_REALOVER | \ TRPSW_REALDIVZERO \ ) /* The following defines the bits which compose SIGFPE */ #define TRPSW_FPE ( \ TRPSW_REALOVER | \ TRPSW_REALUNDER | \ TRPSW_REALDIVZERO | \ D 10 TRPSW_REALINEX | \ E 10 TRPSW_REALBEFORE \ ) /* * By default, the traps word is: trap 0 (ptrace), * default floating point, int div 0. */ #define USR_DEFAULT_TRPSW (0x80000000 | TRPSW_STD_EXC | TRPSW_INTDIVZERO) #define SYS_DEFAULT_TRPSW 0xc0000001 E 9 E 7 E 6 E 1 h60072 s 00001/00001/00032 d D 4.4 87/05/17 17:52:47 build 8 7 c changed #idents back again. -mkm e s 00001/00001/00032 d D 4.3 87/05/14 16:27:10 build 7 6 c removed old SCCS strings and inserted #ident BB e s 00001/00003/00032 d D 4.2 87/04/16 15:23:02 dc 6 5 c dc - Add Bull updates from 03/05/87 e s 00000/00000/00035 d D 4.1 87/02/20 13:34:35 build 5 4 c rolled rev to -r4 /dc e s 00000/00000/00035 d D 3.1 87/01/19 09:26:11 build 4 3 c rolled rev to -r3 /dc e s 00000/00000/00035 d D 2.1 87/01/19 09:26:11 build 3 2 c AUTO NULL DELTA e s 00001/00000/00034 d D 1.2 87/01/16 10:20:46 build 2 1 c add ident string /dc e s 00034/00000/00000 d D 1.1 87/01/09 15:42:16 build 1 0 c Placed under source control - dc e u U f b f n t T I 2 D 6 /* "%W% %E%" */ E 2 I 1 /* @(#)pfdat.h 1.1 */ E 6 I 6 D 7 /* " %W% %E% " */ E 7 I 7 D 8 #ident " %W% %E% " E 8 I 8 /* " %W% %E% " */ E 8 E 7 E 6 typedef struct pfdat { unsigned pf_blkno : 24, /* Disk block nummber. */ pf_flags : 8; /* page flags */ cnt_t pf_use; /* share use count */ dev_t pf_dev; /* Disk device code. */ ino_t pf_inumber; /* inode number of */ /* matching file */ char pf_swpi; /* Index into swaptab. */ struct pfdat *pf_next; /* Next free pfdat. */ struct pfdat *pf_prev; /* Previous free pfdat. */ struct pfdat *pf_hchain; /* Hash chain link. */ } pfd_t; #define P_QUEUE 0x01 /* Page on free queue */ #define P_BAD 0x02 /* Bad page (ECC error, etc.) */ #define P_HASH 0x04 /* Page on hash queue */ #define P_DONE 0x08 /* IO done on page */ #define P_WANT 0x10 /* page needed */ extern struct pfdat phead; extern struct pfdat pbad; extern struct pfdat *pfdat; extern struct pfdat *phash; extern struct pfdat ptfree; extern int phashmask; extern struct pfdat *pfind(); #define BLKNULL 0 /* pf_blkno null value */ E 1 h04380 s 00001/00001/00086 d D 4.4 87/05/17 17:52:48 build 9 8 c changed #idents back again. -mkm e s 00001/00001/00086 d D 4.3 87/05/14 16:27:21 build 8 7 c removed old SCCS strings and inserted #ident BB e s 00001/00001/00086 d D 4.2 87/04/16 15:23:21 dc 7 6 c dc - Add Bull updates from 03/05/87 e s 00000/00000/00087 d D 4.1 87/02/20 13:34:38 build 6 5 c rolled rev to -r4 /dc e s 00002/00004/00085 d D 3.2 87/01/26 11:24:02 build 5 4 c add page table changes e s 00000/00000/00089 d D 3.1 87/01/19 09:26:13 build 4 3 c rolled rev to -r3 /dc e s 00000/00000/00089 d D 2.1 87/01/19 09:26:13 build 3 2 c AUTO NULL DELTA e s 00001/00000/00088 d D 1.2 87/01/16 10:20:49 build 2 1 c add ident string /dc e s 00088/00000/00000 d D 1.1 87/01/09 15:42:17 build 1 0 c Placed under source control - dc e u U f b f n t T I 2 D 7 /* "%W% %E%" */ E 7 I 7 D 8 /* " %W% %E% " */ E 8 I 8 D 9 #ident " %W% %E% " E 9 I 9 /* " %W% %E% " */ E 9 E 8 E 7 E 2 I 1 /* * One structure allocated per active process. It contains all data needed * about the process while the process may be swapped out. * Other per process data (user.h) is swapped with the process. */ struct proc { char p_stat; char p_flag; char p_pri; /* priority, negative is high */ char p_time; /* resident time for scheduling */ char p_cpu; /* cpu usage for scheduling */ char p_nice; /* nice for cpu usage */ ushort p_uid; /* real user id */ ushort p_suid; /* set (effective) user id */ short p_pgrp; /* name of process group leader */ short p_pid; /* unique process id */ short p_ppid; /* process id of parent */ D 5 pte_t p_addr[USIZE]; /* pte of user structure */ pte_t *p_sgt; /* pointer to segment table */ E 5 I 5 sgte_t p_addr; /* page table phys.addr of user structure */ scte_t *p_sct; /* pointer to section table */ E 5 struct pregion *p_region; /* pointer to process regions */ short p_size; /* size of swappable image (clicks) */ ushort p_mpgneed; /* number of memory pages needed */ short p_swaddr; /* disk address when swapped */ short p_swsize; /* number of clicks already swapped */ short p_tsize; /* size of text (used by exec/swapin) */ short p_ssize; /* size of stack (used by exec/swapin) */ long p_sig; /* signals pending to this process */ caddr_t p_wchan; /* process awaiting a event */ ushort p_nvfault; /* number of page valid faults */ char p_frate; /* page fault rate */ struct proc *p_link; /* linked list of running processes */ int p_clktim; /* time to alarm clock signal */ D 5 ushort p_txtsegno; /* text segment number */ ushort p_dsegno; /* data segment number */ E 5 }; extern struct proc proc[]; /* the proc table itself */ /* stat codes */ #define SSLEEP 1 /* awaiting an event */ #define SWAIT 2 /* (abandoned state) */ #define SRUN 3 /* running */ #define SIDL 4 /* intermediate state in process creation */ #define SZOMB 5 /* intermediate state in process termination */ #define SSTOP 6 /* process being traced */ #define SXBRK 7 /* process being xswapped */ #define SXSTK 8 /* process being xswapped */ #define SXTXT 9 /* process being xswapped */ /* flag codes */ #define SLOAD 01 /* in core */ #define SSYS 02 /* scheduling process */ #define SLOCK 04 /* process cannot be swapped */ #define SSWAP 010 /* process is being swapped out */ #define STRC 020 /* process is being traced */ #define SWTED 040 /* another tracing flag */ #define STEXT 0100 /* text pointer valid */ #define SSPART 0200 /* process is partially swapped out */ /* * parallel proc structure * to replace part with times * to be passed to parent process * in ZOMBIE state. */ #ifndef NPROC struct xproc { char xp_stat; char xp_flag; char xp_pri; /* priority, negative is high */ char xp_time; /* resident time for scheduling */ char xp_cpu; /* cpu usage for scheduling */ char xp_nice; /* nice for cpu usage */ ushort xp_uid; /* real user id */ ushort xp_suid; /* set (effective) user id */ short xp_pgrp; /* name of process group leader */ short xp_pid; /* unique process id */ short xp_ppid; /* process id of parent */ pte_t xp_addr[USIZE]; pte_t **xp_sgt; struct pregion *xp_region; short xp_size; short xp_xstat; /* Exit status for wait */ time_t xp_utime; /* user time, this proc */ time_t xp_stime; /* system time, this proc */ }; #endif E 1 h16574 s 00001/00001/00150 d D 4.4 87/05/17 17:52:49 build 8 7 c changed #idents back again. -mkm e s 00001/00001/00150 d D 4.3 87/05/14 16:27:33 build 7 6 c removed old SCCS strings and inserted #ident BB e s 00001/00002/00150 d D 4.2 87/04/16 15:23:35 dc 6 5 c dc - Add Bull updates from 03/05/87 e s 00000/00000/00152 d D 4.1 87/02/20 13:34:40 build 5 4 c rolled rev to -r4 /dc e s 00000/00000/00152 d D 3.1 87/01/19 09:26:15 build 4 3 c rolled rev to -r3 /dc e s 00000/00000/00152 d D 2.1 87/01/19 09:26:15 build 3 2 c AUTO NULL DELTA e s 00001/00000/00151 d D 1.2 87/01/16 10:20:53 build 2 1 c add ident string /dc e s 00151/00000/00000 d D 1.1 87/01/09 15:42:18 build 1 0 c Placed under source control - dc e u U f b f n t T I 2 D 6 /* "%W% %E%" */ E 2 I 1 /* %Z% Bull-Sems SPIX %Q%/%M% %I% %E% */ E 6 I 6 D 7 /* " %W% %E% " */ E 7 I 7 D 8 #ident " %W% %E% " E 8 I 8 /* " %W% %E% " */ E 8 E 7 E 6 /* * Protocol switch table. * * Each protocol has a handle initializing one of these structures, * which is used for protocol-protocol and system-protocol communication. * * A protocol is called through the pr_init entry before any other. * Thereafter it is called every 200ms through the pr_fasttimo entry and * every 500ms through the pr_slowtimo for timer based actions. * The system will call the pr_drain entry if it is low on space and * this should throw away any non-critical data. * * Protocols pass data between themselves as chains of mbufs using * the pr_input and pr_output hooks. Pr_input passes data up (towards * UNIX) and pr_output passes it down (towards the imps); control * information passes up and down on pr_ctlinput and pr_ctloutput. * The protocol is responsible for the space occupied by any the * arguments to these entries and must dispose it. * * The userreq routine interfaces protocols to the system and is * described below. */ struct protosw { short pr_type; /* socket type used for */ short pr_family; /* protocol family */ short pr_protocol; /* protocol number */ short pr_flags; /* see below */ /* protocol-protocol hooks */ int (*pr_input)(); /* input to protocol (from below) */ int (*pr_output)(); /* output to protocol (from above) */ int (*pr_ctlinput)(); /* control input (from below) */ int (*pr_ctloutput)(); /* control output (from above) */ /* user-protocol hook */ int (*pr_usrreq)(); /* user request: see list below */ /* utility hooks */ int (*pr_init)(); /* initialization hook */ int (*pr_fasttimo)(); /* fast timeout (200ms) */ int (*pr_slowtimo)(); /* slow timeout (500ms) */ int (*pr_drain)(); /* flush any excess space possible */ }; #define PR_SLOWHZ 2 /* 2 slow timeouts per second */ #define PR_FASTHZ 5 /* 5 fast timeouts per second */ /* * Values for pr_flags */ #define PR_ATOMIC 0x01 /* exchange atomic messages only */ #define PR_ADDR 0x02 /* addresses given with messages */ /* in the current implementation, PR_ADDR needs PR_ATOMIC to work */ #define PR_CONNREQUIRED 0x04 /* connection required by protocol */ #define PR_WANTRCVD 0x08 /* want PRU_RCVD calls */ #define PR_RIGHTS 0x10 /* passes capabilities */ /* * The arguments to usrreq are: * (*protosw[].pr_usrreq)(up, req, m, nam, opt); * where up is a (struct socket *), req is one of these requests, * m is a optional mbuf chain containing a message, * nam is an optional mbuf chain containing an address, * and opt is a pointer to a socketopt structure or nil. * The protocol is responsible for disposal of the mbuf chain m, * the caller is responsible for any space held by nam and opt. * A non-zero return from usrreq gives an * UNIX error number which should be passed to higher level software. */ #define PRU_ATTACH 0 /* attach protocol to up */ #define PRU_DETACH 1 /* detach protocol from up */ #define PRU_BIND 2 /* bind socket to address */ #define PRU_LISTEN 3 /* listen for connection */ #define PRU_CONNECT 4 /* establish connection to peer */ #define PRU_ACCEPT 5 /* accept connection from peer */ #define PRU_DISCONNECT 6 /* disconnect from peer */ #define PRU_SHUTDOWN 7 /* won't send any more data */ #define PRU_RCVD 8 /* have taken data; more room now */ #define PRU_SEND 9 /* send this data */ #define PRU_ABORT 10 /* abort (fast DISCONNECT, DETATCH) */ #define PRU_CONTROL 11 /* control operations on protocol */ #define PRU_SENSE 12 /* return status into m */ #define PRU_RCVOOB 13 /* retrieve out of band data */ #define PRU_SENDOOB 14 /* send out of band data */ #define PRU_SOCKADDR 15 /* fetch socket's address */ #define PRU_PEERADDR 16 /* fetch peer's address */ #define PRU_CONNECT2 17 /* connect two sockets */ /* begin for protocols internal use */ #define PRU_FASTTIMO 18 /* 200ms timeout */ #define PRU_SLOWTIMO 19 /* 500ms timeout */ #define PRU_PROTORCV 20 /* receive from below */ #define PRU_PROTOSEND 21 /* send to below */ #define PRU_NREQ 21 #ifdef PRUREQUESTS char *prurequests[] = { "ATTACH", "DETACH", "BIND", "LISTEN", "CONNECT", "ACCEPT", "DISCONNECT", "SHUTDOWN", "RCVD", "SEND", "ABORT", "CONTROL", "SENSE", "RCVOOB", "SENDOOB", "SOCKADDR", "PEERADDR", "CONNECT2", "FASTTIMO", "SLOWTIMO", "PROTORCV", "PROTOSEND", }; #endif /* * The arguments to the ctlinput routine are * (*protosw[].pr_ctlinput)(cmd, arg); * where cmd is one of the commands below, and arg is * an optional argument (caddr_t). * * N.B. The IMP code, in particular, pressumes the values * of some of the commands; change with extreme care. * TODO: * spread out codes so new ICMP codes can be * accomodated more easily */ #define PRC_IFDOWN 0 /* interface transition */ #define PRC_ROUTEDEAD 1 /* select new route if possible */ #define PRC_QUENCH 4 /* some said to slow down */ #define PRC_MSGSIZE 5 /* message size forced drop */ #define PRC_HOSTDEAD 6 /* normally from IMP */ #define PRC_HOSTUNREACH 7 /* ditto */ #define PRC_UNREACH_NET 8 /* no route to network */ #define PRC_UNREACH_HOST 9 /* no route to host */ #define PRC_UNREACH_PROTOCOL 10 /* dst says bad protocol */ #define PRC_UNREACH_PORT 11 /* bad port # */ #define PRC_UNREACH_NEEDFRAG 12 /* IP_DF caused drop */ #define PRC_UNREACH_SRCFAIL 13 /* source route failed */ #define PRC_RED_NET 14 /* net routing redirect */ #define PRC_RED_HOST 15 /* host routing redirect */ #define PRC_RED_TOSNET 16 /* redirect for type of service & net */ #define PRC_RED_TOSHOST 17 /* redirect for tos & host */ #define PRC_TIMXCEED_INTRANS 18 /* packet lifetime expired in transit */ #define PRC_TIMXCEED_REASS 19 /* lifetime expired on reass q */ #define PRC_PARAMPROB 20 /* header incorrect */ #define PRC_NCMDS 21 #ifdef PRCREQUESTS char *prcrequests[] = { "IFDOWN", "ROUTEDEAD", "#2", "#3", "QUENCH", "MSGSIZE", "HOSTDEAD", "HOSTUNREACH", "NET-UNREACH", "HOST-UNREACH", "PROTO-UNREACH", "PORT-UNREACH", "FRAG-UNREACH", "SRCFAIL-UNREACH", "NET-REDIRECT", "HOST-REDIRECT", "TOSNET-REDIRECT", "TOSHOST-REDIRECT", "TX-INTRANS", "TX-REASS", "PARAMPROB" }; #endif extern struct protosw *pffindproto(), *pffindtype(); E 1 h15270 s 00001/00001/00032 d D 4.4 87/05/17 17:52:51 build 8 7 c changed #idents back again. -mkm e s 00001/00001/00032 d D 4.3 87/05/14 16:27:44 build 7 6 c removed old SCCS strings and inserted #ident BB e s 00001/00002/00032 d D 4.2 87/04/16 15:13:10 dc 6 5 c dc - Add Bull updates from 03/05/87 e s 00000/00000/00034 d D 4.1 87/02/20 13:34:43 build 5 4 c rolled rev to -r4 /dc e s 00000/00000/00034 d D 3.1 87/01/19 09:26:18 build 4 3 c rolled rev to -r3 /dc e s 00000/00000/00034 d D 2.1 87/01/19 09:26:18 build 3 2 c AUTO NULL DELTA e s 00001/00000/00033 d D 1.2 87/01/16 10:20:56 build 2 1 c add ident string /dc e s 00033/00000/00000 d D 1.1 87/01/09 15:41:42 build 1 0 c Placed under source control - dc e u U f b f n t T I 2 D 6 /* "%W% %E%" */ E 2 I 1 /* @(#)filsys.h 6.1 */ E 6 I 6 D 7 /* " %W% %E% " */ E 7 I 7 D 8 #ident " %W% %E% " E 8 I 8 /* " %W% %E% " */ E 8 E 7 E 6 /* * Structure of the super-block */ struct filsys { ushort s_isize; /* size in blocks of i-list */ daddr_t s_fsize; /* size in blocks of entire volume */ short s_nfree; /* number of addresses in s_free */ daddr_t s_free[NICFREE]; /* free block list */ short s_ninode; /* number of i-nodes in s_inode */ ino_t s_inode[NICINOD]; /* free i-node list */ char s_flock; /* lock during free list manipulation */ char s_ilock; /* lock during i-list manipulation */ char s_fmod; /* super block modified flag */ char s_ronly; /* mounted read-only flag */ time_t s_time; /* last super block update */ short s_dinfo[4]; /* device information */ daddr_t s_tfree; /* total free blocks*/ ino_t s_tinode; /* total free inodes */ char s_fname[6]; /* file system name */ char s_fpack[6]; /* file system pack name */ long s_fill[13]; /* ADJUST to make sizeof filsys be 512 */ long s_magic; /* magic number to indicate new file system */ long s_type; /* type of new file system */ }; #define FsMAGIC 0xfd187e20 /* s_magic number */ #define Fs1b 1 /* 512 byte block */ #define Fs2b 2 /* 1024 byte block */ #define Fs8b 8 /* 4096 byte block */ E 1 h08115 s 00001/00001/00012 d D 4.4 87/05/17 17:52:52 build 9 8 c changed #idents back again. -mkm e s 00001/00001/00012 d D 4.3 87/05/14 16:27:54 build 8 7 c removed old SCCS strings and inserted #ident BB e s 00001/00001/00012 d D 4.2 87/04/16 15:23:44 dc 7 6 c dc - Add Bull updates from 03/05/87 e s 00000/00000/00013 d D 4.1 87/02/20 13:34:45 build 6 5 c rolled rev to -r4 /dc e s 00000/00001/00013 d D 3.2 87/01/26 11:24:58 build 5 4 c remove redundant ident field e s 00000/00000/00014 d D 3.1 87/01/19 09:26:20 build 4 3 c rolled rev to -r3 /dc e s 00000/00000/00014 d D 2.1 87/01/19 09:26:20 build 3 2 c AUTO NULL DELTA e s 00001/00000/00013 d D 1.2 87/01/16 10:20:58 build 2 1 c add ident string /dc e s 00013/00000/00000 d D 1.1 87/01/09 15:42:20 build 1 0 c Placed under source control - dc e u U f b f n t T I 2 D 7 /* "%W% %E%" */ E 7 I 7 D 8 /* " %W% %E% " */ E 8 I 8 D 9 #ident " %W% %E% " E 9 I 9 /* " %W% %E% " */ E 9 E 8 E 7 E 2 I 1 D 5 /* @(#)psl.h 6.1 */ E 5 /* * processor status */ #define PS_ITS 4 /* using interrupt stack */ #define PS_SV 8 /* kernel mode */ #define PS_IPL 3 /* interrupt bits */ #define LVL1 1 #define LVL2 2 #define HORL_LVL 2 E 1 h19471 s 00001/00001/00012 d D 4.5 87/05/17 17:52:53 build 9 8 c changed #idents back again. -mkm e s 00001/00001/00012 d D 4.4 87/05/14 16:28:03 build 8 7 c removed old SCCS strings and inserted #ident BB e s 00001/00001/00012 d D 4.3 87/04/22 19:26:25 build 7 6 c translated French comments. (ksm) e s 00001/00001/00012 d D 4.2 87/04/16 15:23:57 dc 6 5 c dc - Add Bull updates from 03/05/87 e s 00000/00000/00013 d D 4.1 87/02/20 13:34:48 build 5 4 c rolled rev to -r4 /dc e s 00000/00000/00013 d D 3.1 87/01/19 09:26:22 build 4 3 c rolled rev to -r3 /dc e s 00000/00000/00013 d D 2.1 87/01/19 09:26:22 build 3 2 c AUTO NULL DELTA e s 00001/00000/00012 d D 1.2 87/01/16 10:21:01 build 2 1 c add ident string /dc e s 00012/00000/00000 d D 1.1 87/01/09 15:42:21 build 1 0 c Placed under source control - dc e u U f b f n t T I 2 D 6 /* "%W% %E%" */ E 6 I 6 D 8 /* " %W% %E% " */ E 8 I 8 D 9 #ident " %W% %E% " E 9 I 9 /* " %W% %E% " */ E 9 E 8 E 6 E 2 I 1 struct pt_ioctl { int pt_flags; int pt_gensym; D 7 #ifdef SELECT /* mettre || 1 le jour ou select sera implemente */ E 7 I 7 #ifdef SELECT /* set to 1 if and when select() gets implemented */ E 7 struct proc *pt_selr, *pt_selw; #endif int pt_send; }; extern struct tty pt_tty[]; extern struct pt_ioctl pt_ioctl[]; E 1 2  ~ } | { z y x w v u t s r q p o n m l k j i h g f e d c b a ` _ ^ ] \ [ Z Y X Wh08727 s 00001/00001/00147 d D 4.4 87/05/17 17:52:56 build 9 8 c changed #idents back again. -mkm e s 00001/00001/00147 d D 4.3 87/05/14 16:28:25 build 8 7 c removed old SCCS strings and inserted #ident BB e s 00003/00003/00145 d D 4.2 87/04/16 15:33:28 dc 7 6 c dc - Add Bull updates from 03/05/87 e s 00000/00000/00148 d D 4.1 87/02/20 13:34:53 build 6 5 c rolled rev to -r4 /dc e s 00002/00003/00146 d D 3.2 87/01/26 12:48:11 build 5 4 c make page table changes e s 00000/00000/00149 d D 3.1 87/01/19 09:26:26 build 4 3 c rolled rev to -r3 /dc e s 00000/00000/00149 d D 2.1 87/01/19 09:26:26 build 3 2 c AUTO NULL DELTA e s 00001/00000/00148 d D 1.2 87/01/16 10:21:06 build 2 1 c add ident string /dc e s 00148/00000/00000 d D 1.1 87/01/09 15:42:23 build 1 0 c Placed under source control - dc e u U f b f n t T I 2 D 7 /* "%W% %E%" */ E 7 I 7 D 8 /* " %W% %E% " */ E 8 I 8 D 9 #ident " %W% %E% " E 9 I 9 /* " %W% %E% " */ E 9 E 8 E 7 E 2 I 1 /* * Per region descriptor. One is allocated for * every active region in the system. Beware if you add * data elements here: Dupreg may need to copy them. D 5 */ E 5 I 5 D 7 */ E 7 I 7 */ E 7 E 5 typedef struct region { short r_flags; D 5 short r_listsz; /* Number of pages allocated to r_list. */ E 5 I 5 D 7 short r_listsz; /* Number of page tables allocated to r_list. */ E 7 I 7 short r_listsz; /* Number of pages allocated to r_list. */ E 7 E 5 short r_pgsz; /* size in pages */ short r_pgoff; /* offset into region in pages */ short r_nvalid; /* number of valid pages in region */ short r_refcnt; /* number of users pointing at region */ short r_incore; /* number of users pointing at region */ short r_type; /* type of region */ D 5 ushort r_txtsegno ; /* text segment number */ E 5 pte_t **r_list; /* Pointer to a list of pointers to */ /* page tables and dbd's. */ int r_filesz; /* size in bytes of section of file */ /* from which this region is loaded. */ struct inode *r_iptr; /* pointer to inode where blocks are */ struct region *r_forw; /* forward link */ struct region *r_back; /* backward link */ } reg_t; /* * Region flags */ #define RG_NOSWAP 0x0001 /* region cannot be swapped */ #define RG_DEMAND 0x0002 /* region is demand fill from a file */ #define RG_LOCK 0x0004 /* Region is locked. */ #define RG_WANTED 0x0008 /* Do wakeup on rp after clearing */ /* RG_LOCK. */ #define RG_NOFREE 0x0010 /* Don't free region on last detach */ #define RG_DONE 0x0020 /* Region is loaded. */ #define RG_WAITING 0x0040 /* Do wakeup on &rp->r_flags when */ /* RG_DONE is set. */ #define RG_AGE 0x0080 /* Age region if set. Temp flag used */ /* only by vhand */ /* * Region types */ #define RT_UNUSED 0 /* Region not being used. */ #define RT_PRIVATE 1 /* Private (non-shared) region. */ #define RT_STEXT 2 /* Shared text region */ #define RT_SHMEM 3 /* Shared memory region */ /* Each process has a number of pregions which describe the * regions which are attached to the process. */ typedef struct pregion { struct region *p_reg; /* Pointer to the region. */ caddr_t p_regva; /* User virtual address of */ /* region. */ short p_flags; /* Flags. */ short p_type; /* Type. */ } preg_t; /* Pregion flags. */ #define PF_RDONLY 0x0001 /* Read-only attach. */ /* Pregion types. */ #define PT_UNUSED 0x00 /* Unused region. */ #define PT_TEXT 0x01 /* Text region. */ #define PT_DATA 0x02 /* Data region. */ #define PT_STACK 0x03 /* Stack region. */ #define PT_SHMEM 0x04 /* Shared memory region. */ extern preg_t nullpregion; /* A null preg_t. */ extern int pregpp; /* Number of pregions per */ /* process including null one. */ extern reg_t region[]; /* Global array of regions */ extern reg_t ractive; /* List of active regions */ extern reg_t rfree; /* List of free regions */ extern reg_t nullregion; /* A null region. */ reg_t *allocreg(); /* region allocator */ void freereg(); /* region free routine */ preg_t *attachreg(); /* Attach region to process. */ void detachreg(); /* Detach region from process. */ reg_t *dupreg(); /* Duplicate region (fork). */ int growreg(); /* Grow region. */ int loadreg(); /* Load region from file. */ int mapreg(); /* Map region to 413 file. */ preg_t *findreg(); /* Find region from virtual address. */ preg_t *findpreg(); /* Find pregion of given type. */ void chgprot(); /* Change protection for region. */ void reginit(); /* Initialize the region table. */ /* The page table entries are followed by a list of disk block * descriptors which give the location on disk where a * copy of the corresponding page is found. */ typedef struct dbd { uint dbd_type : 4; /* The values for this field are given */ /* below. */ uint dbd_swpi : 4; /* The index into swaptab for the */ /* device this page is on if dbd_type */ /* is DBD_SWAP. */ /* The swpi field is used with DBD_FILE */ /* entries to record even more info */ uint dbd_blkno : 24; /* The block number or i_map index. */ } dbd_t; #define dbd_adjunct dbd_swpi #define DBD_NONE 0 /* There is no copy of this page on */ /* disk. */ #define DBD_SWAP 1 /* A copy of this page is on block nbr */ /* dbd_blkno of the swap file */ /* swptbl[dbd_swpi]. */ #define DBD_DZERO 3 /* This is a demand zero page. No */ /* space is allocated now. When a */ /* fault occurs, allocate a page and */ /* initialize it to all zeros. */ #define DBD_DFILL 4 /* This is a demand fill page. No */ /* space is allocated now. When a */ /* fault occurs, allocate a page and */ /* do not initialize it at all. It */ /* will be initialized by reading in */ /* data from disk. */ #define DBD_FILE 5 /* This page matches a block on the */ /* file system */ /* * ADJUNCT FIELDS * These are intended to be or'd into the adjunct field for * file mapped pages */ #define DBD_FP 0x1 /* marks the first page from a file */ /* system block */ /* DBD_FP set => page matches first */ /* half of a 1024 byte block */ /* DBD_FP clear => second half */ #define DBD_LAST 0x2 /* marks the last page of a file mapped */ /* region */ #define DBD_FIRST 0x4 /* marks the first page of a file */ /* mapped region */ E 1 h18407 s 00001/00001/00072 d D 4.4 87/05/17 17:52:57 build 9 8 c changed #idents back again. -mkm e s 00001/00001/00072 d D 4.3 87/05/14 16:28:36 build 8 7 c removed old SCCS strings and inserted #ident BB e s 00001/00004/00072 d D 4.2 87/04/16 15:34:34 dc 7 5 c dc - Add Bull updates from 03/05/87 e s 00001/00004/00072 d R 4.2 87/04/16 15:33:53 dc 6 5 c dc - Add Bull updates from 03/05/87 e s 00000/00000/00076 d D 4.1 87/02/20 13:34:56 build 5 4 c rolled rev to -r4 /dc e s 00000/00000/00076 d D 3.1 87/01/19 09:26:28 build 4 3 c rolled rev to -r3 /dc e s 00000/00000/00076 d D 2.1 87/01/19 09:26:28 build 3 2 c AUTO NULL DELTA e s 00001/00000/00075 d D 1.2 87/01/16 10:21:10 build 2 1 c add ident string /dc e s 00075/00000/00000 d D 1.1 87/01/09 15:42:24 build 1 0 c Placed under source control - dc e u U f b f n t T I 2 D 7 /* "%W% %E%" */ E 2 I 1 /* @(#)scnhdr.h 2.2 12/15/82 */ E 7 I 7 D 8 /* " %W% %E% " */ E 8 I 8 D 9 #ident " %W% %E% " E 9 I 9 /* " %W% %E% " */ E 9 E 8 E 7 struct scnhdr { char s_name[8]; /* section name */ long s_paddr; /* physical address */ long s_vaddr; /* virtual address */ long s_size; /* section size */ long s_scnptr; /* file ptr to raw data for section */ long s_relptr; /* file ptr to relocation */ long s_lnnoptr; /* file ptr to line numbers */ unsigned short s_nreloc; /* number of relocation entries */ unsigned short s_nlnno; /* number of line number entries */ long s_flags; /* flags */ }; #define SCNHDR struct scnhdr #define SCNHSZ sizeof(SCNHDR) /* * Define constants for names of "special" sections */ #define _TEXT ".text" #define _DATA ".data" #define _BSS ".bss" #define _TV ".tv" /* * The low 4 bits of s_flags is used as a section "type" */ #define STYP_REG 0x00 /* "regular" section: allocated, relocated, loaded */ #define STYP_DSECT 0x01 /* "dummy" section: not allocated, relocated, not loaded */ #define STYP_NOLOAD 0x02 /* "noload" section: allocated, relocated, not loaded */ #define STYP_GROUP 0x04 /* "grouped" section: formed of input sections */ #define STYP_PAD 0x08 /* "padding" section: not allocated, not relocated, loaded */ #define STYP_COPY 0x10 /* "copy" section: for decision function used by field update; not allocated, not relocated, loaded; reloc & lineno entries processed normally */ #define STYP_TEXT 0x20 /* section contains text only */ #define STYP_DATA 0x40 /* section contains data only */ #define STYP_BSS 0x80 /* section contains bss only */ /* * In a minimal file or an update file, a new function * (as compared with a replaced function) is indicated by S_NEWFCN */ #define S_NEWFCN 0x10 /* * In 3b Update Files (output of ogen), sections which appear in SHARED * segments of the Pfile will have the S_SHRSEG flag set by ogen, to inform * dufr that updating 1 copy of the proc. will update all process invocations. */ #define S_SHRSEG 0x20 E 1 h54817 s 00001/00001/00104 d D 4.4 87/05/17 17:52:58 build 8 7 c changed #idents back again. -mkm e s 00001/00001/00104 d D 4.3 87/05/14 16:28:46 build 7 6 c removed old SCCS strings and inserted #ident BB e s 00001/00002/00104 d D 4.2 87/04/16 15:35:02 dc 6 5 c dc - Add Bull updates from 03/05/87 e s 00000/00000/00106 d D 4.1 87/02/20 13:34:58 build 5 4 c rolled rev to -r4 /dc e s 00000/00000/00106 d D 3.1 87/01/19 09:26:30 build 4 3 c rolled rev to -r3 /dc e s 00000/00000/00106 d D 2.1 87/01/19 09:26:30 build 3 2 c AUTO NULL DELTA e s 00001/00000/00105 d D 1.2 87/01/16 10:21:12 build 2 1 c add ident string /dc e s 00105/00000/00000 d D 1.1 87/01/09 15:42:27 build 1 0 c Placed under source control - dc e u U f b f n t T I 2 D 6 /* "%W% %E%" */ E 2 I 1 /* @(#)sem.h 6.1 */ E 6 I 6 D 7 /* " %W% %E% " */ E 7 I 7 D 8 #ident " %W% %E% " E 8 I 8 /* " %W% %E% " */ E 8 E 7 E 6 /* ** IPC Semaphore Facility. */ /* ** Implementation Constants. */ #define PSEMN (PZERO + 3) /* sleep priority waiting for greater value */ #define PSEMZ (PZERO + 2) /* sleep priority waiting for zero */ /* ** Permission Definitions. */ #define SEM_A 0200 /* alter permission */ #define SEM_R 0400 /* read permission */ /* ** Semaphore Operation Flags. */ #define SEM_UNDO 010000 /* set up adjust on exit entry */ /* ** Semctl Command Definitions. */ #define GETNCNT 3 /* get semncnt */ #define GETPID 4 /* get sempid */ #define GETVAL 5 /* get semval */ #define GETALL 6 /* get all semval's */ #define GETZCNT 7 /* get semzcnt */ #define SETVAL 8 /* set semval */ #define SETALL 9 /* set all semval's */ /* ** Structure Definitions. */ /* ** There is one semaphore id data structure for each set of semaphores ** in the system. */ struct semid_ds { struct ipc_perm sem_perm; /* operation permission struct */ struct sem *sem_base; /* ptr to first semaphore in set */ ushort sem_nsems; /* # of semaphores in set */ time_t sem_otime; /* last semop time */ time_t sem_ctime; /* last change time */ }; /* ** There is one semaphore structure for each semaphore in the system. */ struct sem { ushort semval; /* semaphore text map address */ short sempid; /* pid of last operation */ ushort semncnt; /* # awaiting semval > cval */ ushort semzcnt; /* # awaiting semval = 0 */ }; /* ** There is one undo structure per process in the system. */ struct sem_undo { struct sem_undo *un_np; /* ptr to next active undo structure */ short un_cnt; /* # of active entries */ struct undo { short un_aoe; /* adjust on exit values */ short un_num; /* semaphore # */ int un_id; /* semid */ } un_ent[1]; /* undo entries (one minimum) */ }; /* ** semaphore information structure */ struct seminfo { int semmap, /* # of entries in semaphore map */ semmni, /* # of semaphore identifiers */ semmns, /* # of semaphores in system */ semmnu, /* # of undo structures in system */ semmsl, /* max # of semaphores per id */ semopm, /* max # of operations per semop call */ semume, /* max # of undo entries per process */ semusz, /* size in bytes of undo structure */ semvmx, /* semaphore maximum value */ semaem; /* adjust on exit max value */ }; /* ** User semaphore template for semop system calls. */ struct sembuf { ushort sem_num; /* semaphore # */ short sem_op; /* semaphore operation */ short sem_flg; /* operation flags */ }; E 1 h21183 s 00001/00001/00069 d D 4.4 87/05/17 17:53:00 build 10 9 c changed #idents back again. -mkm e s 00001/00001/00069 d D 4.3 87/05/14 16:28:56 build 9 8 c removed old SCCS strings and inserted #ident BB e s 00001/00003/00069 d D 4.2 87/04/16 15:35:31 dc 8 7 c dc - Add Bull updates from 03/05/87 e s 00000/00000/00072 d D 4.1 87/02/20 13:35:01 build 7 6 c rolled rev to -r4 /dc e s 00001/00003/00071 d D 3.3 87/01/27 10:36:58 build 6 5 c add page table changes /dc e s 00000/00000/00074 d D 3.2 87/01/26 12:49:18 build 5 4 c make page table changes e s 00000/00000/00074 d D 3.1 87/01/19 09:26:33 build 4 3 c rolled rev to -r3 /dc e s 00000/00000/00074 d D 2.1 87/01/19 09:26:33 build 3 2 c AUTO NULL DELTA e s 00001/00000/00073 d D 1.2 87/01/16 10:21:15 build 2 1 c add ident string /dc e s 00073/00000/00000 d D 1.1 87/01/09 15:42:28 build 1 0 c Placed under source control - dc e u U f b f n t T I 2 D 8 /* "%W% %E%" */ E 2 I 1 /* @(#)shm.h 6.4 */ E 8 I 8 D 9 /* " %W% %E% " */ E 9 I 9 D 10 #ident " %W% %E% " E 10 I 10 /* " %W% %E% " */ E 10 E 9 E 8 /* ** IPC Shared Memory Facility. */ /* ** Implementation Constants. */ #define SHMLBA stob(1) /* segment low boundary address multiple */ /* (SHMLBA must be a power of 2) */ /* ** Permission Definitions. */ #define SHM_R 0400 /* read permission */ #define SHM_W 0200 /* write permission */ /* ** ipc_perm Mode Definitions. */ #define SHM_INIT 01000 /* grow segment on next attach */ #define SHM_DEST 02000 /* destroy segment when # attached = 0 */ /* ** Message Operation Flags. */ #define SHM_RDONLY 010000 /* attach read-only (else read-write) */ #define SHM_RND 020000 /* round attach address to SHMLBA */ /* ** Structure Definitions. */ /* ** There is a shared mem id data structure for each segment in the system. */ struct shmid_ds { struct ipc_perm shm_perm; /* operation permission struct */ int shm_segsz; /* size of segment in bytes */ D 6 struct region *shm_reg_rw; /* ptr to region structure */ E 6 I 6 struct region *shm_reg; /* ptr to region structure */ E 6 /* for read/write attaches */ D 6 struct region *shm_reg_ro; /* ptr to region structure */ /* for read only attaches */ E 6 ushort shm_lpid; /* pid of last shmop */ ushort shm_cpid; /* pid of creator */ ushort shm_nattch; /* no longer used! */ ushort shm_cnattch; /* no longer used! */ time_t shm_atime; /* last shmat time */ time_t shm_dtime; /* last shmdt time */ time_t shm_ctime; /* last change time */ }; struct shminfo { int shmmax, /* max shared memory segment size */ shmmin, /* min shared memory segment size */ shmmni, /* # of shared memory identifiers */ shmseg, /* max attached shared memory segments per process */ shmbrk, /* gap (in clicks) used between data and shared memory */ shmall; /* max total shared memory system wide (in clicks) */ }; /* * Shared memory control operations */ #define SHM_LOCK 3 /* Lock segment in core */ #define SHM_UNLOCK 4 /* Unlock segment */ E 1 h57865 s 00001/00001/00040 d D 4.5 87/05/17 17:53:01 build 9 8 c changed #idents back again. -mkm e s 00001/00001/00040 d D 4.4 87/05/14 16:29:08 build 8 7 c removed old SCCS strings and inserted #ident BB e s 00003/00002/00038 d D 4.3 87/04/30 11:55:58 dc 7 6 c dc - Add sigrealbefore, increase NSIG75 e s 00001/00001/00039 d D 4.2 87/04/16 15:35:49 dc 6 5 c dc - Add Bull updates from 03/05/87 e s 00000/00000/00040 d D 4.1 87/02/20 13:35:04 build 5 4 c rolled rev to -r4 /dc e s 00000/00000/00040 d D 3.1 87/01/19 09:26:35 build 4 3 c rolled rev to -r3 /dc e s 00000/00000/00040 d D 2.1 87/01/19 09:26:35 build 3 2 c AUTO NULL DELTA e s 00001/00000/00039 d D 1.2 87/01/16 10:21:18 build 2 1 c add ident string /dc e s 00039/00000/00000 d D 1.1 87/01/09 15:42:29 build 1 0 c Placed under source control - dc e u U f b f n t T I 2 D 6 /* "%W% %E%" */ E 6 I 6 D 8 /* " %W% %E% " */ E 8 I 8 D 9 #ident " %W% %E% " E 9 I 9 /* " %W% %E% " */ E 9 E 8 E 6 E 2 I 1 #define SIGHUP 1 /* hangup */ #define SIGINT 2 /* interrupt (rubout) */ #define SIGQUIT 3 /* quit (ASCII FS) */ #define SIGILL 4 /* illegal instruction (not reset when caught)*/ #define SIGTRAP 5 /* trace trap (not reset when caught) */ #define SIGABRT 6 /* process abort */ #define SIGBOUNDS 7 /* EMT instruction */ #define SIGFPE 8 /* floating point exception */ #define SIGKILL 9 /* kill (cannot be caught or ignored) */ #define SIGBUS 10 /* bus error */ #define SIGSEGV 11 /* segmentation violation */ #define SIGSYS 12 /* bad argument to system call */ #define SIGPIPE 13 /* write on a pipe with no one to read it */ #define SIGALRM 14 /* alarm clock */ #define SIGTERM 15 /* software termination signal from kill */ #define SIGUSR1 16 /* user defined signal 1 */ #define SIGUSR2 17 /* user defined signal 2 */ #define SIGCLD 18 /* death of a child */ #define SIGPWR 19 /* power-fail restart */ #define SIGURG 20 /* urgent condition on IO channel */ #define SIGINTOVER 21 /* integer overflow */ #define SIGINTDIVZERO 22 /* integer zero divide */ #define SIGREALOVER 23 /* floating point overflow */ #define SIGREALUNDER 24 /* floating point underflow */ #define SIGREALDIVZERO 25 /* floating point zero divide */ #define SIGREALINEX 26 /* floating point inexact result */ D 7 #define SIGREALINV 27 /* floating point invalid operation */ E 7 I 7 #define SIGREALINV 27 /* floating point IEEE invalid operation */ #define SIGREALBEFORE 28 /* floating point IEEE inv op, OR op not supported by ridge */ E 7 D 7 #define NSIG 28 E 7 I 7 #define NSIG 29 E 7 #define SIG_DFL (int (*)())0 #if lint #define SIG_IGN (int (*)())0 #else #define SIG_IGN (int (*)())1 #endif #define SIGIOT SIGABRT #define SIGEMT SIGILL E 1 h31444 s 00001/00001/00150 d D 4.6 87/05/17 17:53:03 build 15 14 c changed #idents back again. -mkm e s 00001/00001/00150 d D 4.5 87/05/14 16:29:20 build 14 13 c removed old SCCS strings and inserted #ident BB e s 00001/00000/00150 d D 4.4 87/05/05 15:07:23 dc 13 12 c dc - Add SMDMAXPGS e s 00018/00018/00132 d D 4.3 87/04/22 19:36:15 build 12 11 c translated French comments. (ksm) e s 00001/00001/00149 d D 4.2 87/04/16 15:36:12 dc 11 10 c dc - Add Bull updates from 03/05/87 e s 00000/00000/00150 d D 4.1 87/02/20 13:35:07 build 10 9 c rolled rev to -r4 /dc e s 00005/00000/00145 d D 3.3 87/02/13 11:46:16 build 9 8 c add bull changes from Jan 23 /dc e s 00046/00028/00099 d D 3.2 87/02/13 11:32:43 build 8 7 c add bull changes from Jan 23 /dc e s 00000/00000/00127 d D 3.1 87/01/19 09:26:37 build 7 6 c rolled rev to -r3 /dc e s 00000/00000/00127 d D 2.1 87/01/19 09:26:37 build 6 5 c AUTO NULL DELTA e s 00001/00000/00126 d D 1.4 87/01/16 10:21:21 build 5 4 c add ident string /dc e s 00006/00004/00120 d D 1.3 87/01/14 15:21:09 build 4 3 c make memaddr / retry NOT be a union e s 00021/00004/00103 d D 1.2 87/01/12 12:11:07 build 3 1 c add >16Mb addressability macros e s 00017/00000/00107 d R 1.2 87/01/12 12:04:17 build 2 1 c add macros for >16Mb addressability e s 00107/00000/00000 d D 1.1 87/01/09 15:42:30 build 1 0 c Placed under source control - dc e u U f b f n t T I 5 D 11 /* "%W% %E%" */ E 11 I 11 D 14 /* " %W% %E% " */ E 14 I 14 D 15 #ident " %W% %E% " E 15 I 15 /* " %W% %E% " */ E 15 E 14 E 11 E 5 I 1 /* * smd driver definitions */ /* minor structure : */ /* */ D 12 /* bits 7-6 : numero de controleur */ /* 5-4 : numero d'unite */ /* 3-2-1-0 : numero de partition */ E 12 I 12 /* bits 7-6 : controller number */ /* 5-4 : unit number */ /* 3-2-1-0 : partition number */ E 12 /* */ #include #define PAGE 0x1000 #define NSMDUNIT 4 I 13 #define SMDMAXPGS 16 /* largest transfer: 16 pages (64Kb) */ E 13 #define AD_DISK 0 #define AD_VTOC 6 D 12 #define P0_MINSZ 48 /* acces. si dsk non "formate" */ E 12 I 12 #define P0_MINSZ 48 /* acces. if disk not formatted */ E 12 D 12 #define NSECT dtab->nsect /* nbre de secteurs par piste */ #define NPIST dtab->npist /* nbre de pistes par cylindre */ E 12 I 12 #define NSECT dtab->nsect /* number sectors/track */ #define NPIST dtab->npist /* number tracks/cylinder */ E 12 #define NSCTPST (NSECT * NPIST) /* * gorder */ #define SMD_READ 0 #define SMD_WRITE 1 #define SMD_SIZE 5 #define SMD_WTOC 0x80 /* * gstat */ #define SMD_OK 0x00 #define SMD_OFL 0x01 /* Off Line */ #define SMD_TO 0x02 /* Timeout */ #define SMD_FAULT 0x03 /* Equipment Fault */ #define SMD_WLE 0x04 /* Write lock error */ #define SMD_TRER 0x05 /* tranfer error */ #define SMD_OVR 0x06 /* Data Overrun */ D 12 #define SMD_SYNC 0x07 /* c'ant find sync byte */ #define SMD_HDR 0x08 /* c'ant find header */ E 12 I 12 #define SMD_SYNC 0x07 /* can't find sync byte */ #define SMD_HDR 0x08 /* can't find header */ E 12 #define SMD_CRC 0x09 /* CRC error in header */ #define SMD_DCK 0x0A /* Data check */ #define SMD_SEEK 0x0B /* Seek Failure */ #define SMD_TYPE 0x0C /* Unknown Drive Type */ I 8 D 12 #define SMD_END 0x0D /* derniere erreur connue */ E 12 I 12 #define SMD_END 0x0D /* last error found */ E 12 E 8 #define SMD_ILLG 0xFF /* Illegal param. in DCB order */ D 8 #define SMD_DRVR 0x0D /* la meme que la precedente */ #define SMD_END 0x0E /* fin de la table smd_strer */ E 8 I 8 D 12 #define SMD_DRVR 0x0E /* la meme que la precedente */ E 12 I 12 #define SMD_DRVR 0x0E /* ditto */ E 12 E 8 struct smdcb { unsigned char gorder; unsigned char sorder; unsigned char gstat; unsigned char sstat; I 9 /* next word is : output (command start) 32 bit memory address input (command done) 8 bit: retry count, 24 unused bits */ E 9 D 3 unsigned char retries; unsigned char addr0, /* adresse memoire */ addr1, addr2; E 3 I 3 D 4 union { unsigned mem_addr; /* real memory address */ unsigned char retries; } ma_r; /* memory address / retries */ E 4 I 4 D 8 /* next word is : output (command start) 32 bit memory address input (command done) 8 bit: retry count, 24 unused bits */ unsigned mem_addr; /* real memory address */ E 8 I 8 union { uint mem_addr ; /* real memory address */ unsigned char retries; } ma_r ; E 8 E 4 E 3 unsigned char count0, count1; ushort xcount; D 8 unsigned char head; /* adresse disque */ unsigned char cyl_high; unsigned char cyl_low; unsigned char sector; E 8 I 8 union { D 12 uint dsk_addr ; /* adresse disque */ E 12 I 12 uint dsk_addr ; /* disk address */ E 12 struct adrdsk { unsigned char head; unsigned char cyl_high; unsigned char cyl_low; unsigned char sector; } adrdsk ; } da_r ; E 8 unsigned char label[12]; unsigned char padd1[4]; /* Not used - just for alignment */ ushort header[15]; /* for scatter reads and writes */ unsigned char padd2[2] ; /* Not used - just for alignment */ }; I 3 D 8 /* * Each of the 'header' entries contain an encoded representation of * the physical memory address to be used for DMA. * DMA address which must begin on a page boundary: * |0 7|8 15|16 23|24 31| * | 0 0 0 0 e e e e | x x x x x x x x | x x x x 0 0 0 0 | 0 0 0 0 0 0 0 0 | * * Representation in a header entry (ushort) * |0 7|8 15| * | x x x x x x x x | x x x x e e e e | */ E 8 D 8 /* ptoedma convert page frame number to extended dma entry */ #define ptoedma(p) ((ushort)(((p)<<4)+((p)>>12))) E 8 I 8 struct mincb { uint mem_addr ; E 8 D 8 /* edmatop convert extended dma entry to page frame number */ #define edmatop(e) ((uint)(((e)>>4)+(((e)&0xF)<<12))) E 8 I 8 ushort count ; ushort xcount ; E 8 E 3 I 8 unsigned char head ; unsigned char cyl_high; unsigned char cyl_low; unsigned char sector ; }; E 8 struct P0 { D 12 uint magic ; /* valide le formattage */ ushort nb_cyl ; /* nombre de cylindres du disque */ ushort nbb ; /* nombre de bads-blocs */ ushort nbbmax ; /* nombre max de bads-blocs */ ushort nbbzrsv ; /* nb. de bb de zone de reserve */ E 12 I 12 uint magic ; ushort nb_cyl ; /* Number of cylinders */ ushort nbb ; /* number of bad blocks */ ushort nbbmax ; /* max # of bad blocks */ ushort nbbzrsv ; /* number of bad blocks in reserve zone */ E 12 char padd1[4]; /* Not used - just for alignment */ }; struct it_tab { ushort indx ; ushort count ; uint addsk ; }; struct smd_tab { ushort header[15] ; ushort tabx ; struct it_tab itab[16] ; uint nxtbb ; I 8 struct mincb mcb ; E 8 unsigned char gorder ; D 8 unsigned char nsect, npist ; E 8 I 8 unsigned char nsect, npist ; E 8 unsigned char acces ; D 12 struct vtoc *vtoc ; /* ptr sur la zone allouee a VTOC*/ E 12 I 12 struct vtoc *vtoc ; E 12 struct x_smd xsmd[1] ; }; D 12 #define NSMDMAX 4 /* nbre maxi. de controleurs SMD */ E 12 I 12 #define NSMDMAX 4 /* max # of SMD controllers */ E 12 I 8 /* * Each of the 'header' entries contain an encoded representation of * the physical memory address to be used for DMA. * DMA address which must begin on a page boundary: * |0 7|8 15|16 23|24 31| * | 0 0 0 0 e e e e | x x x x x x x x | x x x x 0 0 0 0 | 0 0 0 0 0 0 0 0 | * * Representation in a header entry (ushort) * |0 7|8 15| * | x x x x x x x x | x x x x e e e e | */ /* ptoedma convert page frame number to extended dma entry */ #define ptoedma(p) ((ushort)(((p)<<4)+((p)>>12))) /* edmatop convert extended dma entry to page frame number */ #define edmatop(e) ((uint)(((e)>>4)+(((e)&0xF)<<12))) E 8 E 1 h29465 s 00001/00001/00109 d D 4.4 87/05/17 17:53:04 build 8 7 c changed #idents back again. -mkm e s 00001/00001/00109 d D 4.3 87/05/14 16:29:30 build 7 6 c removed old SCCS strings and inserted #ident BB e s 00001/00002/00109 d D 4.2 87/04/16 15:36:25 dc 6 5 c dc - Add Bull updates from 03/05/87 e s 00000/00000/00111 d D 4.1 87/02/20 13:35:10 build 5 4 c rolled rev to -r4 /dc e s 00000/00000/00111 d D 3.1 87/01/19 09:26:39 build 4 3 c rolled rev to -r3 /dc e s 00000/00000/00111 d D 2.1 87/01/19 09:26:39 build 3 2 c AUTO NULL DELTA e s 00001/00000/00110 d D 1.2 87/01/16 10:21:25 build 2 1 c add ident string /dc e s 00110/00000/00000 d D 1.1 87/01/09 15:42:31 build 1 0 c Placed under source control - dc e u U f b f n t T I 2 D 6 /* "%W% %E%" */ E 2 I 1 /* %Z% Bull-Sems SPIX %Q%/%M% %I% %E% */ E 6 I 6 D 7 /* " %W% %E% " */ E 7 I 7 D 8 #ident " %W% %E% " E 8 I 8 /* " %W% %E% " */ E 8 E 7 E 6 /* * Definitions related to sockets: types, address families, options. */ /* * Types */ #define SOCK_STREAM 1 /* stream socket */ #define SOCK_DGRAM 2 /* datagram socket */ #define SOCK_RAW 3 /* raw-protocol interface */ #define SOCK_RDM 4 /* reliably-delivered message */ #define SOCK_SEQPACKET 5 /* sequenced packet stream */ /* * Option flags per-socket. */ #define SO_DEBUG 0x01 /* turn on debugging info recording */ #define SO_ACCEPTCONN 0x02 /* socket has had listen() */ #define SO_REUSEADDR 0x04 /* allow local address reuse */ #define SO_KEEPALIVE 0x08 /* keep connections alive */ #define SO_DONTROUTE 0x10 /* just use interface addresses */ /* 0x20 was SO_NEWFDONCONN */ #define SO_USELOOPBACK 0x40 /* bypass hardware when possible */ #define SO_LINGER 0x80 /* linger on close if data present */ #define SO_DONTLINGER (~SO_LINGER) /* ~SO_LINGER */ /* * Address families. */ #define AF_UNSPEC 0 /* unspecified */ #define AF_UNIX 1 /* local to host (pipes, portals) */ #define AF_INET 2 /* internetwork: UDP, TCP, etc. */ #define AF_IMPLINK 3 /* arpanet imp addresses */ #define AF_PUP 4 /* pup protocols: e.g. BSP */ #define AF_CHAOS 5 /* mit CHAOS protocols */ #define AF_NS 6 /* XEROX NS protocols */ #define AF_NBS 7 /* nbs protocols */ #define AF_ECMA 8 /* european computer manufacturers */ #define AF_DATAKIT 9 /* datakit protocols */ #define AF_CCITT 10 /* CCITT protocols, X.25 etc */ #define AF_SNA 11 /* IBM SNA */ #define AF_MAX 13 /* * Structure used by kernel to store most * addresses. */ struct sockaddr { u_short sa_family; /* address family */ char sa_data[14]; /* up to 14 bytes of direct address */ }; /* * Structure used by kernel to pass protocol * information in raw sockets. */ struct sockproto { u_short sp_family; /* address family */ u_short sp_protocol; /* protocol */ }; /* * Protocol families, same as address families for now. */ #define PF_UNSPEC AF_UNSPEC #define PF_UNIX AF_UNIX #define PF_INET AF_INET #define PF_IMPLINK AF_IMPLINK #define PF_PUP AF_PUP #define PF_CHAOS AF_CHAOS #define PF_NS AF_NS #define PF_NBS AF_NBS #define PF_ECMA AF_ECMA #define PF_DATAKIT AF_DATAKIT #define PF_CCITT AF_CCITT #define PF_SNA AF_SNA #define PF_MAX 13 /* * Level number for (get/set)sockopt() to apply to socket itself. */ #define SOL_SOCKET 0xffff /* options for socket level */ /* * Maximum queue length specifiable by listen. */ #define SOMAXCONN 5 /* * Message header for recvmsg and sendmsg calls. */ struct msghdr { caddr_t msg_name; /* optional address */ int msg_namelen; /* size of address */ struct iovec *msg_iov; /* scatter/gather array */ int msg_iovlen; /* # elements in msg_iov */ caddr_t msg_accrights; /* access rights sent/received */ int msg_accrightslen; }; #define MSG_OOB 0x1 /* process out-of-band data */ #define MSG_PEEK 0x2 /* peek at incoming message */ #define MSG_DONTROUTE 0x4 /* send without using routing tables */ #define MSG_KERNEL 0x8 /* message in kernel space SMRPC */ #define MSG_MAXIOVLEN 16 E 1 h38553 s 00001/00001/00140 d D 4.4 87/05/17 17:53:06 build 8 7 c changed #idents back again. -mkm e s 00001/00001/00140 d D 4.3 87/05/14 16:29:42 build 7 6 c removed old SCCS strings and inserted #ident BB e s 00001/00002/00140 d D 4.2 87/04/16 15:36:43 dc 6 5 c dc - Add Bull updates from 03/05/87 e s 00000/00000/00142 d D 4.1 87/02/20 13:35:13 build 5 4 c rolled rev to -r4 /dc e s 00000/00000/00142 d D 3.1 87/01/19 09:26:42 build 4 3 c rolled rev to -r3 /dc e s 00000/00000/00142 d D 2.1 87/01/19 09:26:42 build 3 2 c AUTO NULL DELTA e s 00001/00000/00141 d D 1.2 87/01/16 10:21:28 build 2 1 c add ident string /dc e s 00141/00000/00000 d D 1.1 87/01/09 15:42:32 build 1 0 c Placed under source control - dc e u U f b f n t T I 2 D 6 /* "%W% %E%" */ E 2 I 1 /* %Z% Bull-Sems SPIX %Q%/%M% %I% %E% */ E 6 I 6 D 7 /* " %W% %E% " */ E 7 I 7 D 8 #ident " %W% %E% " E 8 I 8 /* " %W% %E% " */ E 8 E 7 E 6 /* * Kernel structure per socket. * Contains send and receive buffer queues, * handle on protocol and pointer to protocol * private data and error information. */ struct socket { short so_type; /* generic type, see socket.h */ short so_options; /* from socket call, see socket.h */ short so_linger; /* time to linger while closing */ short so_state; /* internal state flags SS_*, below */ caddr_t so_pcb; /* protocol control block */ struct protosw *so_proto; /* protocol handle */ /* * Variables for connection queueing. * Socket where accepts occur is so_head in all subsidiary sockets. * If so_head is 0, socket is not related to an accept. * For head socket so_q0 queues partially completed connections, * while so_q is a queue of connections ready to be accepted. * If a connection is aborted and it has so_head set, then * it has to be pulled out of either so_q0 or so_q. * We allow connections to queue up based on current queue lengths * and limit on number of queued connections for this socket. */ struct socket *so_head; /* back pointer to accept socket */ struct socket *so_q0; /* queue of partial connections */ short so_q0len; /* partials on so_q0 */ struct socket *so_q; /* queue of incoming connections */ short so_qlen; /* number of connections on so_q */ short so_qlimit; /* max number queued connections */ /* * Variables for socket buffering. */ struct sockbuf { short sb_cc; /* actual chars in buffer */ short sb_hiwat; /* max actual char count */ short sb_mbcnt; /* chars of mbufs used */ short sb_mbmax; /* max chars of mbufs to use */ short sb_lowat; /* low water mark (not used yet) */ short sb_timeo; /* timeout (not used yet) */ struct mbuf *sb_mb; /* the mbuf chain */ struct proc *sb_sel; /* process selecting read/write */ short sb_flags; /* flags, see below */ } so_rcv, so_snd; #define SB_LOCK 0x01 /* lock on data queue (so_rcv only) */ #define SB_WANT 0x02 /* someone is waiting to lock */ #define SB_WAIT 0x04 /* someone is waiting for data/space */ #define SB_SEL 0x08 /* buffer is selected */ #define SB_COLL 0x10 /* collision selecting */ short so_timeo; /* connection timeout */ u_short so_error; /* error affecting connection */ short so_oobmark; /* chars to oob mark */ short so_pgrp; /* pgrp for signals */ }; /* * Socket state bits. */ #define SS_NOFDREF 0x001 /* no file table ref any more */ #define SS_ISCONNECTED 0x002 /* socket connected to a peer */ #define SS_ISCONNECTING 0x004 /* in process of connecting to peer */ #define SS_ISDISCONNECTING 0x008 /* in process of disconnecting */ #define SS_CANTSENDMORE 0x010 /* can't send more data to peer */ #define SS_CANTRCVMORE 0x020 /* can't receive more data from peer */ #define SS_RCVATMARK 0x040 /* at mark on input */ #define SS_PRIV 0x080 /* privileged for broadcast, raw... */ #define SS_NBIO 0x100 /* non-blocking ops */ #define SS_ASYNC 0x200 /* async i/o notify */ /* * Macros for sockets and socket buffering. */ /* how much space is there in a socket buffer (so->so_snd or so->so_rcv) */ #define sbspace(sb) \ ((sb)->sb_hiwat-(sb)->sb_cc) /* (MIN((sb)->sb_hiwat-(sb)->sb_cc, ((sb)->sb_mbmax-(sb)->sb_mbcnt))) */ /* do we have to send all at once on a socket? */ #define sosendallatonce(so) \ (((so)->so_state & SS_NBIO) || ((so)->so_proto->pr_flags & PR_ATOMIC)) /* can we read something from so? */ #define soreadable(so) \ ((so)->so_rcv.sb_cc || ((so)->so_state & SS_CANTRCVMORE) || (so)->so_qlen) /* can we write something to so? */ #define sowriteable(so) \ (sbspace(&(so)->so_snd) > 0 && \ (((so)->so_state&SS_ISCONNECTED) || \ ((so)->so_proto->pr_flags&PR_CONNREQUIRED)==0) || \ ((so)->so_state & SS_CANTSENDMORE)) /* adjust counters in sb reflecting allocation of m */ #define sballoc(sb, m) { \ (sb)->sb_cc += (m)->m_len; \ (sb)->sb_mbcnt += MSIZE; \ } /* if ((m)->m_off > MMAXOFF) \ (sb)->sb_mbcnt += CLBYTES; \ */ /* adjust counters in sb reflecting freeing of m */ #define sbfree(sb, m) { \ (sb)->sb_cc -= (m)->m_len; \ (sb)->sb_mbcnt -= MSIZE; \ } /* if ((m)->m_off > MMAXOFF) \ (sb)->sb_mbcnt -= CLBYTES; \ */ /* set lock on sockbuf sb */ #define sblock(sb) { \ while ((sb)->sb_flags & SB_LOCK) { \ (sb)->sb_flags |= SB_WANT; \ sleep((caddr_t)&(sb)->sb_flags, PZERO+1); \ } \ (sb)->sb_flags |= SB_LOCK; \ } /* release lock on sockbuf sb */ #define sbunlock(sb) { \ (sb)->sb_flags &= ~SB_LOCK; \ if ((sb)->sb_flags & SB_WANT) { \ (sb)->sb_flags &= ~SB_WANT; \ wakeup((caddr_t)&(sb)->sb_flags); \ } \ } #define sorwakeup(so) sbwakeup(&(so)->so_rcv) #define sowwakeup(so) sbwakeup(&(so)->so_snd) struct socket *sonewconn(); E 1 h61337 s 00001/00001/00305 d D 4.9 87/05/20 13:24:32 brian 13 12 c mbuf.h put back on system search path BB e s 00001/00001/00305 d D 4.8 87/05/17 17:53:07 build 12 11 c changed #idents back again. -mkm e s 00001/00001/00305 d D 4.7 87/05/14 16:29:54 build 11 10 c removed old SCCS strings and inserted #ident BB e s 00001/00001/00305 d D 4.6 87/05/07 18:47:06 van 10 9 c van - move defsocket.h back to /usr/include/sys e s 00002/00002/00304 d D 4.5 87/04/29 16:07:02 van 9 8 c van - moved ucb networking includes to INCUCB e s 00001/00001/00305 d D 4.4 87/04/22 18:16:29 dc 8 7 c change wb_tty to wbal_tty e s 00004/00004/00302 d D 4.3 87/04/16 15:37:29 dc 7 6 c dc - Add Bull updates from 03/05/87 e s 00035/00035/00271 d D 4.2 87/04/15 17:53:41 dc 6 5 c dc - changed #include "sys/..." to #include e s 00000/00000/00306 d D 4.1 87/02/20 13:35:16 build 5 4 c rolled rev to -r4 /dc e s 00000/00000/00306 d D 3.1 87/01/19 09:26:44 build 4 3 c rolled rev to -r3 /dc e s 00000/00000/00306 d D 2.1 87/01/19 09:26:44 build 3 2 c AUTO NULL DELTA e s 00001/00000/00305 d D 1.2 87/01/16 10:21:32 build 2 1 c add ident string /dc e s 00305/00000/00000 d D 1.1 87/01/09 15:42:34 build 1 0 c Placed under source control - dc e u U f b f n t T I 2 D 7 /* "%W% %E%" */ E 2 I 1 /* @(#)space.h 6.13 */ E 7 I 7 D 11 /* " %W% %E% " */ E 11 I 11 D 12 #ident " %W% %E% " E 12 I 12 /* " %W% %E% " */ E 12 E 11 E 7 #define KERNEL D 6 #include "sys/acct.h" E 6 I 6 #include E 6 struct acct acctbuf; struct inode *acctp; D 6 #include "sys/tty.h" E 6 I 6 #include E 6 struct cblock cfree[NCLIST]; D 6 #include "sys/buf.h" E 6 I 6 #include E 6 struct buf bfreelist; /* head of the free list of buffers */ struct pfree pfreelist; /* Head of physio header pool */ struct buf pbuf[NPBUF]; /* Physical io header pool */ struct hbuf hbuf[NHBUF]; /* buffer hash table */ D 6 #include "sys/file.h" E 6 I 6 #include E 6 struct file file[NFILE]; /* file table */ D 6 #include "sys/inode.h" E 6 I 6 #include E 6 struct inode inode[NINODE]; /* inode table */ D 6 #include "sys/page.h" #include "sys/proc.h" E 6 I 6 #include #include E 6 struct proc proc[NPROC]; /* process table */ D 6 #include "sys/map.h" E 6 I 6 #include E 6 struct map sptmap[SPTMAP] = {mapdata(SPTMAP)}; D 6 #include "sys/callo.h" E 6 I 6 #include E 6 struct callo callout[NCALL]; D 6 #include "sys/mount.h" E 6 I 6 #include E 6 struct mount mount[NMOUNT]; D 6 #include "sys/elog.h" #include "sys/err.h" E 6 I 6 #include #include E 6 struct err err = { NESLOT, }; D 6 #include "sys/sysinfo.h" E 6 I 6 #include E 6 struct sysinfo sysinfo; struct syswait syswait; struct syserr syserr; D 6 #include "sys/opt.h" E 6 I 6 #include E 6 D 6 #include "sys/var.h" E 6 I 6 #include E 6 struct var v = { NBUF, NCALL, NINODE, (char *)(&inode[NINODE]), NFILE, (char *)(&file[NFILE]), NMOUNT, (char *)(&mount[NMOUNT]), NPROC, (char *)(&proc[1]), 0, (char *)0, REGIONS, NCLIST, 0, MAXUP, 0, NHBUF, NHBUF-1, NPBUF, 0, SPTMAP, VHNDFRAC, MAXPMEM, NAUTOUP, MBUFS_INITIAL, MCLBUFS_INITIAL, NMBCLUSTERS, NPTY }; D 6 #include "sys/region.h" E 6 I 6 #include E 6 reg_t region[REGIONS]; reg_t ractive; reg_t rfree; D 6 #include "sys/pfdat.h" E 6 I 6 #include E 6 struct pfdat phead; /* Head of free page list. */ struct pfdat *pfdat; /* Page frame database. */ struct pfdat *phash; /* Page hash access to pfdat. */ struct pfdat ptfree; /* Head of page table free list. */ int phashmask; /* Page hash mask. */ D 6 #include "sys/tuneable.h" E 6 I 6 #include E 6 tune_t tune = { GETPGSLO, /* t_gpgslo - get pages low limit. */ GETPGSHI, /* t_gpgshi - get pages high limit. */ AGERATE, /* t_age */ VHANDR, /* t_handr - vhand wakeup rate. */ VHANDL, /* t_vhandl - vhand steal limit. */ MAXSC, /* t_maxsc - max contiguous swap cnt. */ PREPAGE, /* t_prep - max swap/file pre page factor */ BDFLUSHR, /* t_bdflushr - bdflush wakeup rate. */ }; D 6 #include "sys/swap.h" E 6 I 6 #include E 6 swpt_t swaptab[MSFILES]; int nextswap; int swapwant; D 6 #include "sys/init.h" E 6 I 6 #include E 6 D 6 #include "sys/smd.h" E 6 I 6 #include E 6 D 6 #include "sys/iobuf.h" E 6 I 6 #include E 6 struct iobuf smdctab[SMD_0]; struct iobuf smdutab[SMD_0*NSMDUNIT]; struct buf smdbuf[SMD_0*NSMDUNIT]; struct smd_tab smditab[SMD_0*NSMDUNIT]; struct iotime smdstat[SMD_0*NSMDUNIT]; #if PRF_0==0 prfintr() {} int prfstat; #endif #if CIO_0 D 6 #include "sys/termio.h" #include "sys/cio.h" E 6 I 6 #include #include E 6 struct iobuf wbcttab[CIO_0*2]; struct buf wbctcombuf[CIO_0*2]; struct wbctbuf wbct_buf[CIO_0*2]; D 8 struct tty wb_tty[CIO_0*8]; E 8 I 8 struct tty wbal_tty[CIO_0*8]; E 8 struct wbal wb_al[CIO_0*8]; struct wblp_lpdt wblp_lpdt[CIO_0] ; char wblp_lpbuf[1024*CIO_0] ; #else D 6 #include "sys/termio.h" #include "sys/fdlp.h" E 6 I 6 #include #include E 6 struct tty fdlp_tty[FDLP_0*4]; struct al fdlp_al[FDLP_0*4]; struct fdlp_lpdt fdlp_lpdt[FDLP_0]; char fdlp_lpbuf[256*FDLP_0]; #endif #if SAS_0 D 6 #include "sys/me.h" #include "sys/mas.h" E 6 I 6 #include #include E 6 struct tty mas_tty[SAS_0*8]; struct tt2 mas_tt2[SAS_0*8]; #endif /* struct iobuf gdtab[SMD_0]; struct iobuf gdutab[SMD_0*8]; int gdindex[SMD_0*8]; short gdtype[SMD_0*8]; struct iotime gdstat[SMD_0*8]; */ #if MT_0 D 6 #include "sys/mt.h" E 6 I 6 #include E 6 struct buf mtbuf[MT_0*NMTUNIT]; struct iobuf mttab[MT_0*NMTUNIT]; struct tape_cmd mtcmd[MT_0*NMTUNIT]; struct iotime mtstat[MT_0*NMTUNIT]; char vmtbuf[10240*MT_0]; int ctrbsy[MT_0]; #endif #if SXT_0 int sxt_cnt = SXTCNT ; #endif #if MESG==1 D 6 #include "sys/ipc.h" #include "sys/msg.h" E 6 I 6 #include #include E 6 struct map msgmap[MSGMAP]; struct msqid_ds msgque[MSGMNI]; I 7 char msglock[MSGMNI] ; E 7 struct msg msgh[MSGTQL]; struct msginfo msginfo = { MSGMAP, MSGMAX, MSGMNB, MSGMNI, MSGSSZ, MSGTQL, MSGSEG }; #endif #if SEMA==1 # ifndef IPC_ALLOC D 7 # include "sys/ipc.h" E 7 I 7 #include E 7 # endif D 6 #include "sys/sem.h" E 6 I 6 #include E 6 struct semid_ds sema[SEMMNI]; struct sem sem[SEMMNS]; struct map semmap[SEMMAP]; struct sem_undo *sem_undo[NPROC]; #define SEMUSZ (sizeof(struct sem_undo)+sizeof(struct undo)*SEMUME) int semu[((SEMUSZ*SEMMNU)+NBPW-1)/NBPW]; union { short semvals[SEMMSL]; struct semid_ds ds; struct sembuf semops[SEMOPM]; } semtmp; struct seminfo seminfo = { SEMMAP, SEMMNI, SEMMNS, SEMMNU, SEMMSL, SEMOPM, SEMUME, SEMUSZ, SEMVMX, SEMAEM }; #endif #if SHMEM==1 # ifndef IPC_ALLOC D 7 # include "sys/ipc.h" E 7 I 7 #include E 7 # endif D 6 #include "sys/shm.h" E 6 I 6 #include E 6 struct shmid_ds *shm_shmem[NPROC*SHMSEG]; struct shmid_ds shmem[SHMMNI]; /* struct shmpt_ds shm_pte[NPROC*SHMSEG]; */ struct shminfo shminfo = { SHMMAX, SHMMIN, SHMMNI, SHMSEG, SHMBRK, SHMALL }; #endif #if SOCKET_0==1 D 6 #include "sys/defsocket.h" #include "sys/mbuf.h" E 6 I 6 D 9 #include #include E 9 I 9 D 10 #include "sys/defsocket.h" E 10 I 10 #include E 10 D 13 #include "sys/mbuf.h" E 13 I 13 #include E 13 E 9 E 6 struct map mbmap[NMBCLUSTERS/4] = {mapdata(NMBCLUSTERS/4)} ; char mclrefcnt[NMBCLUSTERS]; struct mbuf *mbutl ; #else mbinit() {} domaininit() {} ifinit() {} loattach() {} soo_close() {} soo_ioctl() {} soo_rw() {} soo_stat() {} unp_gc() {} #endif #if TCPIP_ETH==0 ec_attach() {} #endif TCPIP_ETH #if TCPIP_X25==0 x25_attach() {} #endif TCPIP_X25 struct minfo minfo; /* Each process has 3 pregions (text, data, and stack) plus * enough for the maximum number of shared memory segments. * We also need one extra null pregion to indicate the end * of the list. */ int pregpp = 3 + SHMSEG + 1; /* file and record locking */ #include struct flckinfo flckinfo = { FLCKREC, FLCKFIL, 0, 0, 0, 0 } ; struct filock flox[FLCKREC]; /* lock structures */ struct flino flinotab[FLCKFIL]; /* inode to lock assoc. structures */ int maxpmem = MAXPMEM; /* Max physical memory to use. Used for */ /* system performance measurement purposes */ #if PTY_0 #include struct tty pt_tty[NPTY]; struct pt_ioctl pt_ioctl[NPTY]; #endif E 1 h51125 s 00001/00001/00068 d D 4.4 87/05/17 17:53:09 build 8 7 c changed #idents back again. -mkm e s 00001/00001/00068 d D 4.3 87/05/14 16:30:05 build 7 6 c removed old SCCS strings and inserted #ident BB e s 00001/00003/00068 d D 4.2 87/04/16 15:37:50 dc 6 5 c dc - Add Bull updates from 03/05/87 e s 00000/00000/00071 d D 4.1 87/02/20 13:35:19 build 5 4 c rolled rev to -r4 /dc e s 00000/00000/00071 d D 3.1 87/01/19 09:26:47 build 4 3 c rolled rev to -r3 /dc e s 00000/00000/00071 d D 2.1 87/01/19 09:26:47 build 3 2 c AUTO NULL DELTA e s 00001/00000/00070 d D 1.2 87/01/16 10:21:35 build 2 1 c add ident string /dc e s 00070/00000/00000 d D 1.1 87/01/09 15:42:35 build 1 0 c Placed under source control - dc e u U f b f n t T I 2 D 6 /* "%W% %E%" */ E 2 I 1 /* %Z% Bull-Sems SPIX %Q%/%M% %I% %E% */ E 6 I 6 D 7 /* " %W% %E% " */ E 7 I 7 D 8 #ident " %W% %E% " E 8 I 8 /* " %W% %E% " */ E 8 E 7 E 6 /* * Structure of the result of stat */ struct stat { dev_t st_dev; /* device with directory */ /* entry for file */ ino_t st_ino; /* inode number */ ushort st_mode; /* type of file (see below) */ short st_nlink; /* number of links to file */ ushort st_uid; /* user id of file owner */ ushort st_gid; /* group id of file */ dev_t st_rdev; /* device if file is character */ /* special or block */ off_t st_size; /* file size in bytes */ time_t st_atime; /* time of last access */ time_t st_mtime; /* time of last data modification */ time_t st_ctime; /* time of last status change */ /* times measured in seconds since */ /* 00:00:00 GMT, Jan. 1, 1970 */ }; #define S_IFMT 0170000 /* type of file */ #define S_IFDIR 0040000 /* directory */ #define S_IFCHR 0020000 /* character special */ #define S_IFBLK 0060000 /* block special */ #define S_IFREG 0100000 /* regular */ #define S_IFIFO 0010000 /* fifo */ /* #ifdef SOCKET */ #define S_IFSOCK 0140000 /* socket */ /* #endif SOCKET */ #define S_ISUID 04000 /* set user id on execution */ #define S_ISGID 02000 /* set group id on execution */ #define S_ISVTX 01000 /* save swapped text even after use */ #define S_IREAD 00400 /* read permission, owner */ #define S_IWRITE 00200 /* write permission, owner */ #define S_IEXEC 00100 /* execute/search permission, owner */ /* macro to test for block special file */ #define S_ISBLK(mode) (((mode) & S_IFMT) == S_IFBLK) /* macro to test for character special file */ #define S_ISCHR(mode) (((mode) & S_IFMT) == S_IFCHR) /* macro to test for directory file */ #define S_ISDIR(mode) (((mode) & S_IFMT) == S_IFDIR) /* macro to test for FIFO special file */ #define S_ISFIFO(mode) (((mode) & S_IFMT) == S_IFIFO) /* macro to test for regular file */ #define S_ISREG(mode) (((mode) & S_IFMT) == S_IFREG) #define S_ENFMT /* record locking enforcement flag */ #define S_IRWXU 00700 /* read, write, execute : owner */ #define S_IRUSR 00400 /* read permission : owner */ #define S_IWUSR 00200 /* write permission : owner */ #define S_IXUSR 00100 /* execute permission : owner */ #define S_IRWXG 00070 /* read, write, execute : group */ #define S_IRGRP 00040 /* read permission : group */ #define S_IWGRP 00020 /* write permission : group */ #define S_IXGRP 00010 /* execute permission : group */ #define S_IRWXO 00007 /* read, write, execute : other */ #define S_IROTH 00004 /* read permission : other */ #define S_IWOTH 00002 /* write permission : other */ #define S_IXOTH 00001 /* execute permission : other */ E 1 h26607 s 00001/00001/00068 d D 4.4 87/05/17 17:53:11 build 8 7 c changed #idents back again. -mkm e s 00001/00001/00068 d D 4.3 87/05/14 16:30:16 build 7 6 c removed old SCCS strings and inserted #ident BB e s 00001/00002/00068 d D 4.2 87/04/16 15:38:08 dc 6 5 c dc - Add Bull updates from 03/05/87 e s 00000/00000/00070 d D 4.1 87/02/20 13:35:21 build 5 4 c rolled rev to -r4 /dc e s 00000/00000/00070 d D 3.1 87/01/19 09:26:49 build 4 3 c rolled rev to -r3 /dc e s 00000/00000/00070 d D 2.1 87/01/19 09:26:49 build 3 2 c AUTO NULL DELTA e s 00001/00000/00069 d D 1.2 87/01/16 10:21:38 build 2 1 c add ident string /dc e s 00069/00000/00000 d D 1.1 87/01/09 15:42:37 build 1 0 c Placed under source control - dc e u U f b f n t T I 2 D 6 /* "%W% %E%" */ E 2 I 1 /* @(#)swap.h 1.1 */ E 6 I 6 D 7 /* " %W% %E% " */ E 7 I 7 D 8 #ident " %W% %E% " E 8 I 8 /* " %W% %E% " */ E 8 E 7 E 6 /* The following structure contains the data describing a * swap file. */ typedef struct swaptab { dev_t st_dev; /* The swap device. */ short st_flags; /* Flags defined below. */ use_t *st_ucnt; /* Ptr to use count array for */ /* pages on swap. */ use_t *st_last; int st_swplo; /* First block number on device */ /* to be used for swapping. */ int st_npgs; /* Number of pages of swap */ /* space on device. */ int st_nfpgs; /* Nbr of free pages on device. */ } swpt_t; #define ST_INDEL 0x01 /* This file is in the process */ /* of being deleted. Don't */ /* allocate from it. */ extern swpt_t swaptab[]; /* The table of swap files. */ extern int nextswap;; /* Index into swptab to the */ /* next file to allocate from. */ extern int swapwant; /* Set non-zero if someone is */ /* waiting for swap space. */ #define MSFILES 16 /* The maximum number of swap */ /* files which can be allocated.*/ /* It is limited by the size of */ /* the dbd_swpi field in the */ /* dbd_t structure. */ /* The following struct is used by the sys3b system call. * If the first argument to the sys3b system call is 3, * then the call pertains to the swap file. In this case, * the second argument is a pointer to a structure of the * following format which contains the parameters for the * operation to be performed. */ typedef struct swapint { char si_cmd; /* One of the command codes */ /* listed below. */ char *si_buf; /* For an SI_LIST function, this*/ /* is a pointer to a buffer of */ /* sizeof(swpt_t)*MSFILES bytes.*/ /* For the other cases, it is a */ /* pointer to a pathname of a */ /* swap file. */ int si_swplo; /* The first block number of the*/ /* swap file. Used only for */ /* SI_ADD and SI_DEL. */ int si_nblks; /* The size of the swap file in */ /* blocks. Used only for an */ /* SI_ADD request. */ } swpi_t; /* The following are the possible values for si_cmd. */ #define SI_LIST 0 /* List the currently active */ /* swap files. */ #define SI_ADD 1 /* Add a new swap file. */ #define SI_DEL 2 /* Delete one of the currently */ /* active swap files. */ E 1 h64786 s 00001/00001/00011 d D 4.4 87/05/17 17:53:12 build 8 7 c changed #idents back again. -mkm e s 00001/00001/00011 d D 4.3 87/05/14 16:30:27 build 7 6 c removed old SCCS strings and inserted #ident BB e s 00001/00001/00011 d D 4.2 87/04/16 15:34:49 dc 6 5 c dc - Add Bull updates from 03/05/87 e s 00000/00000/00012 d D 4.1 87/02/20 13:35:24 build 5 4 c rolled rev to -r4 /dc e s 00000/00000/00012 d D 3.1 87/01/19 09:26:51 build 4 3 c rolled rev to -r3 /dc e s 00000/00000/00012 d D 2.1 87/01/19 09:26:51 build 3 2 c AUTO NULL DELTA e s 00001/00000/00011 d D 1.2 87/01/16 10:21:41 build 2 1 c add ident string /dc e s 00011/00000/00000 d D 1.1 87/01/09 15:42:26 build 1 0 c Placed under source control - dc e u U f b f n t T I 2 D 6 /* "%W% %E%" */ E 6 I 6 D 7 /* " %W% %E% " */ E 7 I 7 D 8 #ident " %W% %E% " E 8 I 8 /* " %W% %E% " */ E 8 E 7 E 6 E 2 I 1 /* * Memory management addresses and bits */ #define RO PG_UR /* access abilities */ #define RW PG_UW #define SEG_RO 1 #define SEG_WO 2 #define SEG_RW 3 #define SEG_CW 4 E 1 h04298 s 00001/00001/00074 d D 4.4 87/05/17 17:53:13 build 8 7 c changed #idents back again. -mkm e s 00001/00001/00074 d D 4.3 87/05/14 16:30:37 build 7 6 c removed old SCCS strings and inserted #ident BB e s 00001/00002/00074 d D 4.2 87/04/16 15:38:21 dc 6 5 c dc - Add Bull updates from 03/05/87 e s 00000/00000/00076 d D 4.1 87/02/20 13:35:26 build 5 4 c rolled rev to -r4 /dc e s 00000/00000/00076 d D 3.1 87/01/19 09:26:53 build 4 3 c rolled rev to -r3 /dc e s 00000/00000/00076 d D 2.1 87/01/19 09:26:53 build 3 2 c AUTO NULL DELTA e s 00001/00000/00075 d D 1.2 87/01/16 10:21:44 build 2 1 c add ident string /dc e s 00075/00000/00000 d D 1.1 87/01/09 15:42:38 build 1 0 c Placed under source control - dc e u U f b f n t T I 2 D 6 /* "%W% %E%" */ E 2 I 1 /* <@(#)sxt.h 6.2> */ E 6 I 6 D 7 /* " %W% %E% " */ E 7 I 7 D 8 #ident " %W% %E% " E 8 I 8 /* " %W% %E% " */ E 8 E 7 E 6 /* ** Multiplexed channels driver header */ #define SXTRACE 0 /* 1 to include tracing */ #define MAXLINKS 32 #define CHAN(dev) (dev&CHANMASK) #define LINK(dev) ((dev>>CHANBITS)&(0xff>>CHANBITS)) #if (MAXPCHAN*MAXLINKS) > 256 ERROR -- product cannot be greater than minor(dev) #endif struct Channel { struct tty tty; /* Virtual tty for this channel */ }; typedef struct Channel *Ch_p; struct Link { struct tty * line; /* Real tty for this link */ char controllingtty; /* the current top dog */ char old; /* Old line discipline for line */ char nchans; /* Number of channels allowed */ unsigned char chanmask; /* Allowable channel bits */ char open; /* Channel open bits */ char xopen; /* Exclusive open bits */ char wpending; /* pending writes/channel */ char iblocked; /* channels blocked for input */ char oblocked; /* channels blocked for output*/ char lwchan; /* Last channel written bit */ char wrcnt; /* Number of writes on last channel written */ dev_t dev; /* major and minor device # */ struct Channel chans[1]; /* Array of channels for this link */ }; typedef struct Link * Link_p; /* ** Ioctl args */ #define SXTIOCLINK ('b'<<8) #define SXTIOCTRACE (SXTIOCLINK|1) #define SXTIOCNOTRACE (SXTIOCLINK|2) #define SXTIOCSWTCH (SXTIOCLINK|3) #define SXTIOCWF (SXTIOCLINK|4) #define SXTIOCBLK (SXTIOCLINK|5) #define SXTIOCUBLK (SXTIOCLINK|6) #define SXTIOCSTAT (SXTIOCLINK|7) /* the following structure is used for the SXTIOCSTAT ioctl call */ struct sxtblock { char input; /* channels blocked on input */ char output; /* channels blocked on output */ }; #define t_link t_dstat /* Use dstat in real tty for linknumber */ #define MAXPCHAN 8 /* Maximum channel number */ #define CHANBITS 3 /* Bits for channel number */ #define CHANMASK 07 /* 2**CHANBITS - 1 */ #define SXTHOG 2 /* Channel consecutive write limit */ E 1 h52859 s 00001/00001/00088 d D 4.4 87/05/17 17:53:14 build 8 7 c changed #idents back again. -mkm e s 00001/00001/00088 d D 4.3 87/05/14 16:30:48 build 7 6 c removed old SCCS strings and inserted #ident BB e s 00001/00002/00088 d D 4.2 87/04/16 15:38:38 dc 6 5 c dc - Add Bull updates from 03/05/87 e s 00000/00000/00090 d D 4.1 87/02/20 13:35:29 build 5 4 c rolled rev to -r4 /dc e s 00000/00000/00090 d D 3.1 87/01/19 09:26:55 build 4 3 c rolled rev to -r3 /dc e s 00000/00000/00090 d D 2.1 87/01/19 09:26:55 build 3 2 c AUTO NULL DELTA e s 00001/00000/00089 d D 1.2 87/01/16 10:21:47 build 2 1 c add ident string /dc e s 00089/00000/00000 d D 1.1 87/01/09 15:42:41 build 1 0 c Placed under source control - dc e u U f b f n t T I 2 D 6 /* "%W% %E%" */ E 2 I 1 /* @(#)sysinfo.h 6.2 */ E 6 I 6 D 7 /* " %W% %E% " */ E 7 I 7 D 8 #ident " %W% %E% " E 8 I 8 /* " %W% %E% " */ E 8 E 7 E 6 struct sysinfo { time_t cpu[4]; #define CPU_IDLE 0 #define CPU_USER 1 #define CPU_KERNAL 2 #define CPU_WAIT 3 time_t wait[3]; #define W_IO 0 #define W_SWAP 1 #define W_PIO 2 long bread; long bwrite; long lread; long lwrite; long phread; long phwrite; long swapin; long swapout; long bswapin; long bswapout; long pswitch; long syscall; long sysread; long syswrite; long sysfork; long sysexec; long runque; long runocc; long swpque; long swpocc; long iget; long namei; long dirblk; long readch; long writech; long rcvint; long xmtint; long mdmint; long rawch; long canch; long outch; long msg; long sema; }; extern struct sysinfo sysinfo; struct syswait { short iowait; short swap; short physio; }; extern struct syswait syswait; struct syserr { long inodeovf; long fileovf; long textovf; long procovf; long sbi[5]; #define SBI_SILOC 0 #define SBI_CRDRDS 1 #define SBI_ALERT 2 #define SBI_FAULT 3 #define SBI_TIMEO 4 }; extern struct syserr syserr; struct minfo { long freemem; /* freemem in page */ long freeswap; /* free swap space */ long vfault; /* translation fault */ long demand; /* demand zero and demand fill pages */ long swap; /* pages on swap */ long cache; /* pages in cache */ long file; /* pages on file */ long pfault; /* protection fault */ long cw; /* copy on write */ long steal; /* steal the page */ long freedpgs; /* pages are freed */ long unmodsw; /* getpages finds unmodified pages on swap */ long unmodfl; /* getpages finds unmodified pages in file */ }; extern struct minfo minfo; E 1 h50531 s 00002/00000/00123 d D 4.5 87/05/20 22:52:34 van 9 8 c van - If there is not a free cluster, allocate more e s 00001/00001/00122 d D 4.4 87/05/17 17:53:15 build 8 7 c changed #idents back again. -mkm e s 00001/00001/00122 d D 4.3 87/05/14 16:30:58 build 7 6 c removed old SCCS strings and inserted #ident BB e s 00001/00002/00122 d D 4.2 87/04/16 15:16:37 dc 6 5 c dc - Add Bull updates from 03/05/87 e s 00000/00000/00124 d D 4.1 87/02/20 13:35:31 build 5 4 c rolled rev to -r4 /dc e s 00000/00000/00124 d D 3.1 87/01/19 09:26:57 build 4 3 c rolled rev to -r3 /dc e s 00000/00000/00124 d D 2.1 87/01/19 09:26:57 build 3 2 c AUTO NULL DELTA e s 00001/00000/00123 d D 1.2 87/01/16 10:21:50 build 2 1 c add ident string /dc e s 00123/00000/00000 d D 1.1 87/01/09 15:42:01 build 1 0 c Placed under source control - dc e u U f b f n t T I 2 D 6 /* "%W% %E%" */ E 2 I 1 /* %Z% Bull-Sems SPIX %Q%/%M% %I% %E% */ E 6 I 6 D 7 /* " %W% %E% " */ E 7 I 7 D 8 #ident " %W% %E% " E 8 I 8 /* " %W% %E% " */ E 8 E 7 E 6 /* * A "cluster" is the data part of a big mbuf. A Cluster seems to be the * same size as a Click. * CLBYTES (size of a Cluster) is a power of 2; MSIZE is a smaller power of 2 * Clusters come at a higher address in memory than Mbufs (contrary to * what the documentation says). * 'mbutl' is the low address of clusters; it must be aligned on a CLBYTES * boundary. Clusters must be allocated adjacent in (virtual) memory; * same for mbufs. */ /* * Constants related to memory allocator. */ #define MSIZE 128 /* sizeof(struct mbuf)(P of 2 */ #define MMINOFF 12 /* mbuf header length */ #define MTAIL 4 #define MMAXOFF (MSIZE-MTAIL) /* offset where data ends */ #define MLEN (MSIZE-MMINOFF-MTAIL) /* mbuf data length */ #define NMBPCL (CLBYTES/MSIZE) /* # mbufs per cluster */ #define NMBMIN ((v.v_mbuf*NMBPCL)/10) /* minimum for socket */ /* * Macros for type conversion */ /* network cluster number to virtual address, and back */ #define cltom(x) ((struct mbuf *)((int)mbutl + ((x) << CLSHIFT))) #define mtocl(x) (((int)x - (int)mbutl) >> CLSHIFT) /* mbutl is base address of clusters */ /* address in mbuf to mbuf head */ #define dtom(x) ((struct mbuf *)((int)x & ~(MSIZE-1))) /* mbuf head, to typed data */ #define mtod(x,t) ((t)((int)(x) + (x)->m_off)) struct mbuf { struct mbuf *m_next; /* next buffer in chain */ u_long m_off; /* offset of data */ short m_len; /* amount of data in this mbuf */ short m_type; /* mbuf type (0 == free) */ u_char m_dat[MLEN]; /* data storage */ struct mbuf *m_act; /* link in higher-level mbuf list */ }; /* mbuf types */ #define MT_FREE 0 /* should be on free list */ #define MT_DATA 1 /* dynamic (data) allocation */ #define MT_HEADER 2 /* packet header */ #define MT_SOCKET 3 /* socket structure */ #define MT_PCB 4 /* protocol control block */ #define MT_RTABLE 5 /* routing tables */ #define MT_HTABLE 6 /* IMP host tables */ #define MT_ATABLE 7 /* address resolution tables */ #define MT_SONAME 8 /* socket name */ #define MT_ZOMBIE 9 /* zombie proc status */ #define MT_SOOPTS 10 /* socket options */ #define MT_FTABLE 11 /* fragment reassembly header */ /* flags to m_get */ #define M_DONTWAIT 0 #define M_WAIT 1 /* flags to m_pgalloc */ #define MPG_MBUFS 0 /* put new mbufs on free list */ #define MPG_CLUSTERS 1 /* put new clusters on free list */ #define MPG_SPACE 2 /* don't free; caller wants space */ /* length to m_copy to copy all */ #define M_COPYALL 1000000000 #define MBGET(m, i, t) \ { int ms = splimp(); \ if ((m)=mbfree) \ { if ((m)->m_type != MT_FREE) panic("mget"); (m)->m_type = t; \ mbstat.m_mbfree--; mbstat.m_mtypes[t]++; \ mbfree = (m)->m_next; (m)->m_next = 0; \ (m)->m_off = MMINOFF; } \ else \ (m) = m_more(i, t); \ splx(ms); } #define MCLGET(m, i) \ { int ms = splimp(); \ I 9 if (mclfree == 0) \ (void)m_clalloc(1, MPG_CLUSTERS, M_DONTWAIT); \ E 9 if ((m)=mclfree) \ {++mclrefcnt[mtocl(m)];mbstat.m_clfree--;mclfree = (m)->m_next;} \ splx(ms); } #define MBFREE(m, n) \ { int ms = splimp(); \ if ((m)->m_type == MT_FREE) panic("mbfree twice"); \ mbstat.m_mtypes[(m)->m_type]--; (m)->m_type = MT_FREE; \ if ((m)->m_off > MSIZE) { \ (n) = (struct mbuf *)(mtod(m, int)&~CLOFSET); \ if (--mclrefcnt[mtocl(n)] == 0) \ { (n)->m_next = mclfree;mclfree = (n);mbstat.m_clfree++;} \ } \ (n) = (m)->m_next; (m)->m_next = mbfree; \ (m)->m_off = 0; (m)->m_act = 0; mbfree = (m); mbstat.m_mbfree++; \ splx(ms); } /* * Mbuf statistics. */ struct mbstat { short m_mbufs; /* mbufs obtained from page pool */ short m_mbfree; /* mbufs on our free list */ short m_clusters; /* clusters obtained from page pool */ short m_clfree; /* free clusters */ short m_drops; /* times failed to find space */ short m_mtypes[256]; /* type specific mbuf allocations */ }; extern struct mbuf *mbutl; extern char mclrefcnt[]; struct mbstat mbstat; int nmbclusters; struct mbuf *mbfree, *mclfree; struct mbuf *m_get(),*m_getclr(),*m_free(),*m_more(),*m_copy(),*m_pullup(); caddr_t m_clalloc(); E 1 h32390 s 00001/00001/00098 d D 4.4 87/05/17 17:53:17 build 9 8 c changed #idents back again. -mkm e s 00001/00001/00098 d D 4.3 87/05/14 16:31:09 build 8 7 c removed old SCCS strings and inserted #ident BB e s 00003/00001/00096 d D 4.2 87/04/16 15:39:06 dc 7 6 c dc - Add Bull updates from 03/05/87 e s 00000/00000/00097 d D 4.1 87/02/20 13:35:34 build 6 5 c rolled rev to -r4 /dc e s 00006/00006/00091 d D 3.2 87/01/26 12:51:27 build 5 4 c add page table changes e s 00000/00000/00097 d D 3.1 87/01/19 09:27:00 build 4 3 c rolled rev to -r3 /dc e s 00000/00000/00097 d D 2.1 87/01/19 09:27:00 build 3 2 c AUTO NULL DELTA e s 00001/00000/00096 d D 1.2 87/01/16 10:21:53 build 2 1 c add ident string /dc e s 00096/00000/00000 d D 1.1 87/01/09 15:42:42 build 1 0 c Placed under source control - dc e u U f b f n t T I 2 D 7 /* "%W% %E%" */ E 7 I 7 D 8 /* " %W% %E% " */ E 8 I 8 D 9 #ident " %W% %E% " E 9 I 9 /* " %W% %E% " */ E 9 E 8 E 7 E 2 I 1 /* * Some macros for units conversion */ /* Core clicks to segments and vice versa */ #define ctos(x) ((x+(NCPS-1))/NCPS) #define stoc(x) ((x)*NCPS) #define ptos(X) ((X+(NCPS-1))/NCPS) /* pages to segments */ #define ptots(X) ((X)/NCPS) /* pages to truncated segments */ #define stopg(x) ((x)*NCPS) /* segments to pages */ D 5 #define stob(x) ((x) << 17) /* segments to bytes */ #define btos(x) ((x+(NBPS-1)) >> 17) /* bytes to segments */ #define btots(x) ((x) >> 17) /* bytes to truncated segments */ #define ptor(X) ((X+(NCPR-1))/NCPR) /* pages to rlist entrys */ E 5 I 5 #define stob(x) ((x) << 18) /* segments to bytes */ #define btos(x) ((x+(NBPS-1)) >> 18) /* bytes to segments */ #define btots(x) ((x) >> 18) /* bytes to truncated segments */ E 5 /* Core clicks to disk blocks */ #define ctod(x) (x << DPPSHFT) #define dtop(X) (((X) + (NDPP-1)) >> DPPSHFT) #define ptod(X) ((X) << DPPSHFT) /* clicks to bytes */ #ifdef BPCSHIFT #define ctob(x) ((x)<>BPCSHIFT) I 5 #define btoct(x) ((unsigned)(x)>>BPCSHIFT) E 5 #define btop(x) (((unsigned)(x)+(NBPP-1))>>BPPSHIFT) #define btotp(x) ((unsigned)(x)>>BPPSHIFT) #else #define btoc(x) (((unsigned)(x)+(NBPC-1))/NBPC) #define btoct(x) ((unsigned)(x)/NBPC) #endif /* inumber to disk address */ #ifdef INOSHIFT #define itod(x) (daddr_t)(((unsigned)x+(2*INOPB-1))>>INOSHIFT) #else #define itod(x) (daddr_t)(((unsigned)x+(2*INOPB-1))/INOPB) #endif /* inumber to disk offset */ #ifdef INOSHIFT #define itoo(x) (int)(((unsigned)x+(2*INOPB-1))&(INOPB-1)) #else #define itoo(x) (int)(((unsigned)x+(2*INOPB-1))%INOPB) #endif /* major part of a device */ #define major(x) (int)((unsigned)x>>8) #define bmajor(x) (int)(((unsigned)x>>8)&037) #define brdev(x) (x&0x1fff) /* minor part of a device */ #define minor(x) (int)(x&0377) /* make a device number */ #define makedev(x,y) (dev_t)(((x)<<8) | (y)) #define critical(ps) ((ps & PS_IPL) != 0) #define decay(a,b,c) a=((int)((a)*((c)-1)+(b)))/(c); #define poff(X) ((uint)(X) & POFFMASK) /* page offset */ #define soff(X) ((uint)(X) & SOFFMASK) /* segment offset */ D 5 #define snum(X) (((uint)(X)>>17) & 0x3ff) /* segment number */ #define pnum(X) (((uint)(X)>>12) & 0x1f) /* page number */ E 5 I 5 #define snum(X) (((uint)(X)>>18) & 0xff) /* segment number */ #define pnum(X) (((uint)(X)>>12) & 0x3f) /* page number */ E 5 /* * Check page bounds */ #define pfdrnge(pfd, s) if ((pfd-pfdat) < firstfree || (pfd-pfdat) >= maxfree){ \ printf("bad range %d %d %d\n", pfd - pfdat, firstfree, maxfree);\ panic(s);} /* * Calculate user priority (Performance) */ #define PMAX 127 #define calcppri(p) { \ register int a; \ \ a = ((p->p_cpu + p->p_frate)>>1) + \ p->p_nice + (PUSER-NZERO); \ if (a > PMAX) a = PMAX; \ p->p_pri = a; \ curpri = p->p_pri; \ } #define resetpri(p, o) calcppri(p) I 7 #define killed(p) (p->p_sig & (1L << (SIGKILL - 1))) E 7 /* * Increment page use count */ #define MAXMUSE 32000 /* Maximum share count on a page */ #define pfdinc(pfd, s) if (pfd->pf_use++ == MAXMUSE) \ panic(s) E 1 h06979 s 00001/00001/00075 d D 4.4 87/05/17 17:53:18 build 8 7 c changed #idents back again. -mkm e s 00001/00001/00075 d D 4.3 87/05/14 16:31:21 build 7 6 c removed old SCCS strings and inserted #ident BB e s 00001/00001/00075 d D 4.2 87/04/16 15:39:35 dc 6 5 c dc - Add Bull updates from 03/05/87 e s 00000/00000/00076 d D 4.1 87/02/20 13:35:37 build 5 4 c rolled rev to -r4 /dc e s 00000/00000/00076 d D 3.1 87/01/19 09:27:02 build 4 3 c rolled rev to -r3 /dc e s 00000/00000/00076 d D 2.1 87/01/19 09:27:02 build 3 2 c AUTO NULL DELTA e s 00001/00000/00075 d D 1.2 87/01/16 10:21:56 build 2 1 c add ident string /dc e s 00075/00000/00000 d D 1.1 87/01/09 15:42:43 build 1 0 c Placed under source control - dc e u U f b f n t T I 2 D 6 /* "%W% %E%" */ E 6 I 6 D 7 /* " %W% %E% " */ E 7 I 7 D 8 #ident " %W% %E% " E 8 I 8 /* " %W% %E% " */ E 8 E 7 E 6 E 2 I 1 /* * Random set of variables used by more than one routine. */ extern struct inode *rootdir; /* pointer to inode of root directory */ extern time_t lbolt; /* time in HZ since last boot */ extern time_t time; /* time in sec from 1970 */ extern char runin; /* scheduling flag */ extern char runout; /* scheduling flag */ extern char runrun; /* scheduling flag */ extern char curpri; /* current priority */ extern struct proc *curproc; /* current proc */ extern struct proc *runq; /* head of linked list of running processes */ extern maxmem; /* max available memory */ extern maxumem; /* max user proc virt mem */ extern physmem; /* physical memory on this CPU */ extern dev_t rootdev; /* device of the root */ extern dev_t pipedev; /* pipe device */ extern char *panicstr; /* panic string pointer */ extern blkacty; /* active block devices */ dev_t getmdev(); daddr_t bmap(); struct inode *ialloc(); struct inode *iget(); struct inode *owner(); struct inode *maknode(); struct inode *namei(); struct buf *alloc(); struct buf *getblk(); struct buf *geteblk(); struct buf *bread(); struct buf *breada(); struct filsys *getfs(); struct file *getf(); struct file *falloc(); int uchar(); /* * Structure of the system-entry table */ extern struct sysent { char sy_narg; /* total number of arguments */ char sy_nrarg; /* number of args in registers */ int (*sy_call)(); /* handler */ } sysent[]; /* * structure of SPS9 ccb */ extern struct ccb_t { int kcall[256]; int align_err; int ill_instr; int parity_error[2]; int page_fault; int kernel_viol; int chk_trap; int trapsw; int ext_int; int swtch0; int pwrfail; int pwrup; int timer1_int; int timer2_int; int reserved; int idle_ticks; int timer1_count; int timer2_count; double time_of_day; } ccb ; E 1 h42741 s 00001/00001/00220 d D 4.5 87/05/17 17:53:20 build 9 8 c changed #idents back again. -mkm e s 00001/00001/00220 d D 4.4 87/05/14 16:31:31 build 8 7 c removed old SCCS strings and inserted #ident BB e s 00018/00018/00203 d D 4.3 87/04/22 19:48:20 build 7 6 c translated French comments. (ksm) e s 00001/00003/00220 d D 4.2 87/04/16 15:40:00 dc 6 5 c dc - Add Bull updates from 03/05/87 e s 00000/00000/00223 d D 4.1 87/02/20 13:35:40 build 5 4 c rolled rev to -r4 /dc e s 00000/00000/00223 d D 3.1 87/01/19 09:27:04 build 4 3 c rolled rev to -r3 /dc e s 00000/00000/00223 d D 2.1 87/01/19 09:27:04 build 3 2 c AUTO NULL DELTA e s 00001/00000/00222 d D 1.2 87/01/16 10:21:59 build 2 1 c add ident string /dc e s 00222/00000/00000 d D 1.1 87/01/09 15:42:45 build 1 0 c Placed under source control - dc e u U f b f n t T I 2 D 6 /* "%W% %E%" */ E 2 I 1 /* %Z% Bull-Sems SPIX %Q%/%M% %I% %E% */ E 6 I 6 D 8 /* " %W% %E% " */ E 8 I 8 D 9 #ident " %W% %E% " E 9 I 9 /* " %W% %E% " */ E 9 E 8 E 6 #define NCC 8 #define SZTRM 12 /* control characters */ #define VINTR 0 #define VQUIT 1 #define VERASE 2 #define VKILL 3 #define VEOF 4 #define VEOL 5 #define VEOL2 6 #define VSWTCH 7 #define VMIN 4 #define VTIME 5 #define CNUL 0x00 #define CDEL 0xFF /* default control chars */ #define CESC '\\' /* ESCAPE */ #define CINTR 0x7F /* DEL */ #define CQUIT 0x1C /* FS : ^\ */ #define CERASE 0x08 /* BS : ^H */ #define CKILL 0x15 /* NAK: ^U */ #define CEOF 0x04 /* EOT: ^D */ #define CSTART 0x11 /* Start output: ^Q */ #define CSTOP 0x13 /* Stop output: ^S */ #define CSWTCH 032 /* cntl z */ #define CNSWTCH 0 /* input modes */ #define IGNBRK 0000001 /* ignore BREAK on input */ #define BRKINT 0000002 /* signal INTR on BREAK */ #define IGNPAR 0000004 /* ignore parity errors */ #define PARMRK 0000010 /* mark parity errors */ #define INPCK 0000020 /* input parity checking */ D 7 #define ISTRIP 0000040 /* caracteres & 0x7F en entree */ E 7 I 7 #define ISTRIP 0000040 /* strip parity bits on input chars */ E 7 #define INLCR 0000100 /* NL => CR on input */ #define IGNCR 0000200 /* ignore CR on input */ #define ICRNL 0000400 /* CR => NL on input */ #define IUCLC 0001000 /* Upper-Case => Lower-Case on input */ #define IXON 0002000 /* START|STOP output control */ #define IXANY 0004000 /* ANY character restart outpout */ #define IXOFF 0010000 /* START|STOP si input VIDE|PLEIN */ #define ECHOH 0020000 /* echo hard */ /* output modes */ #define OPOST 0000001 /* Post-Process Output */ #define OLCUC 0000002 /* Lower-Case => Upper-Case on output */ #define ONLCR 0000004 /* NL => CR-NL on output */ #define OCRNL 0000010 /* CR => NL on output */ #define ONOCR 0000020 /* do not output CRs at column zero */ #define ONLRET 0000040 /* NL performs the CR function */ #define OFILL 0000100 /* use fill characters for delays */ #define OFDEL 0000200 /* fill characters are DELs (NULs) */ D 7 #define NLDLY 0000400 /* delai pour New Line */ E 7 I 7 #define NLDLY 0000400 /* delay for New Line */ E 7 #define NL0 0 #define NL1 0000400 D 7 #define CRDLY 0003000 /* delai pour Carriage Return */ E 7 I 7 #define CRDLY 0003000 /* delay for Carriage Return */ E 7 #define CR0 0 #define CR1 0001000 #define CR2 0002000 #define CR3 0003000 D 7 #define TABDLY 0014000 /* delai pour TABulations */ E 7 I 7 #define TABDLY 0014000 /* delay for TABs */ E 7 #define TAB0 0 #define TAB1 0004000 #define TAB2 0010000 #define TAB3 0014000 D 7 #define BSDLY 0020000 /* delai pour Back-Space */ E 7 I 7 #define BSDLY 0020000 /* delay for Back-Space */ E 7 #define BS0 0 #define BS1 0020000 D 7 #define VTDLY 0040000 /* delai pour Vertical Tabulation */ E 7 I 7 #define VTDLY 0040000 /* delay for Vertical Tabulation */ E 7 #define VT0 0 #define VT1 0040000 D 7 #define FFDLY 0100000 /* delai pour Form-Feed */ E 7 I 7 #define FFDLY 0100000 /* delay for Form-Feed */ E 7 #define FF0 0 #define FF1 0100000 D 7 #define ALLDLY 0177400 /* tous les delais */ E 7 I 7 #define ALLDLY 0177400 /* mask for all delays */ E 7 /* control modes */ #define B0 0 D 7 #define B50 0000001 /* vitesse : 50 bauds */ E 7 I 7 #define B50 0000001 E 7 #define B75 0000002 #define B110 0000003 #define B134 0000004 #define B150 0000005 #define B200 0000006 #define B300 0000007 #define B600 0000010 #define B1200 0000011 #define B1800 0000012 #define B2400 0000013 #define B4800 0000014 #define B9600 0000015 #define B19200 0000016 #define B125000 0000017 #define CBAUD 0000017 #define ICBAUD 0000017 /* input SPEED */ #define OCBAUD 0170000 /* output SPEED */ D 7 #define CSIZE 0000060 /* taille des caracteres 5|6|7|8 bits */ E 7 I 7 #define CSIZE 0000060 /* bits/character */ E 7 #define CS5 0 #define CS6 0000020 #define CS7 0000040 #define CS8 0000060 D 7 #define CSTOPB 0000100 /* 2 bits d'arret */ E 7 I 7 #define CSTOPB 0000100 /* 2 stop bits */ E 7 #define CREAD 0000200 /* enable the receiver */ #define PARENB 0000400 /* enable parity generation & detection */ D 7 #define PARODD 0001000 /* select odd parity (paire) */ E 7 I 7 #define PARODD 0001000 /* select odd parity */ E 7 #define HUPCL 0002000 /* hang up on last close */ D 7 #define CLOCAL 0004000 /* ligne sans MODEM */ E 7 I 7 #define CLOCAL 0004000 /* no modem control */ E 7 #define LOBLK 0010000 #define SSPEED 0000015 /* default speed: 9600 baud */ #define OSPD(X) ((X&CBAUD)<<12) /* ospeed */ #define ISPD(X) (X&CBAUD) /* ispeed */ #define RAZSPD (~(OCBAUD | ICBAUD)) /* 0x0FF0 */ /* line discipline 0 modes */ D 7 #define ISIG 0000001 /* controle automatique du flot */ #define ICANON 0000002 /* transmission immediate du caractere */ #define XCASE 0000004 /* terminal en majuscules */ #define LCASE 0000004 /* terminal en majuscules */ E 7 I 7 #define ISIG 0000001 /* automatic flow control */ #define ICANON 0000002 /* transmit character immediately */ #define XCASE 0000004 /* upper-case only terminal */ #define LCASE 0000004 /* lower case OK */ E 7 #define ECHO 0000010 /* echo soft */ #define ECHOE 0000020 /* ERASE = {'\b',' ','\b'} */ #define ECHOK 0000040 /* KILL => {'\n'} */ #define ECHONL 0000100 /* echo NL */ #define NOFLSH 0000200 /* flush after INTR or QUIT */ /* * Ioctl control packet */ struct termio { unsigned short c_iflag; /* input modes */ unsigned short c_oflag; /* output modes */ unsigned short c_cflag; /* control modes */ unsigned short c_lflag; /* line discipline modes*/ char c_line; /* line discipline */ unsigned char c_cc[NCC]; /* control chars */ }; #define IOCTYPE 0xFF00 #define TIOC ('T'<<8) #define TCGETA (TIOC|1) #define TCSETA (TIOC|2) #define TCSETAW (TIOC|3) #define TCSETAF (TIOC|4) #define TCSBRK (TIOC|5) #define TCXONC (TIOC|6) #define TCFLSH (TIOC|7) #define TCHIO (TIOC|'A') #define TCGETH (TIOC|'B') #define TCGTERM (TIOC|'C') #define TCSTERM (TIOC|'D') #define TCGDSR (TIOC|'E') #define TCSDSR (TIOC|'F') #define TCNDSR (TIOC|'G') #define TCSHDX (TIOC|'H') #define TCSFDX (TIOC|'I') #define TCDSET (TIOC|32) #define LDIOC ('D'<<8) #define LDOPEN (LDIOC|0) #define LDCLOSE (LDIOC|1) #define LDCHG (LDIOC|2) #define LDGETT (LDIOC|8) #define LDSETT (LDIOC|9) /* * Terminal types */ #define TERM_NONE 0 /* tty */ #define TERM_TEC 1 /* TEC Scope */ #define TERM_V61 2 /* DEC VT61 */ #define TERM_V10 3 /* DEC VT100 */ #define TERM_TEX 4 /* Tektronix 4023 */ #define TERM_D40 5 /* TTY Mod 40/1 */ D 7 #define TERM_H45 6 /* Hewlitt-Packard 45 */ E 7 I 7 #define TERM_H45 6 /* Hewlett-Packard 45 */ E 7 #define TERM_D42 7 /* TTY Mod 40/2B */ /* * Terminal flags */ #define TM_NONE 0000 /* use default flags */ #define TM_SNL 0001 /* special newline flag */ #define TM_ANL 0002 /* auto newline on column 80 */ #define TM_LCF 0004 /* last col of last row special */ #define TM_CECHO 0010 /* echo terminal cursor control */ #define TM_CINVIS 0020 /* do not send esc seq to user */ #define TM_SET 0200 /* must be on to set/res flags */ /* * structure of ioctl arg for LDGETT and LDSETT */ struct termcb { char st_flgs; /* term flags */ char st_termt; /* term type */ char st_crow; /* gtty only - current row */ char st_ccol; /* gtty only - current col */ char st_vrow; /* variable row */ char st_lrow; /* last row */ }; /* * structure of ioctl arg for TCGTERM and TCSTERM */ struct varterm { char name[SZTRM]; }; E 1 h48633 s 00001/00001/00023 d D 4.4 87/05/17 17:53:22 build 8 7 c changed #idents back again. -mkm e s 00001/00001/00023 d D 4.3 87/05/14 16:31:44 build 7 6 c removed old SCCS strings and inserted #ident BB e s 00001/00002/00023 d D 4.2 87/04/16 15:40:18 dc 6 5 c dc - Add Bull updates from 03/05/87 e s 00000/00000/00025 d D 4.1 87/02/20 13:35:43 build 5 4 c rolled rev to -r4 /dc e s 00000/00000/00025 d D 3.1 87/01/19 09:27:07 build 4 3 c rolled rev to -r3 /dc e s 00000/00000/00025 d D 2.1 87/01/19 09:27:07 build 3 2 c AUTO NULL DELTA e s 00001/00000/00024 d D 1.2 87/01/16 10:22:02 build 2 1 c add ident string /dc e s 00024/00000/00000 d D 1.1 87/01/09 15:42:46 build 1 0 c Placed under source control - dc e u U f b f n t T I 2 D 6 /* "%W% %E%" */ E 2 I 1 /* @(#)text.h 1.2 */ E 6 I 6 D 7 /* " %W% %E% " */ E 7 I 7 D 8 #ident " %W% %E% " E 8 I 8 /* " %W% %E% " */ E 8 E 7 E 6 /* * Text structure. * One allocated per pure procedure on swap device. * Manipulated by text.c */ struct text { short x_daddr; /* disk address of segment (relative to swplo) */ short x_size; /* size (clicks) */ struct proc *x_caddr; /* ptr to linked proc, if loaded */ struct inode *x_iptr; /* inode of prototype */ char x_count; /* reference count */ char x_ccount; /* number of loaded references */ char x_flag; /* traced, written flags */ }; extern struct text text[]; #define XTRC 01 /* Text may be written, exclusive use */ #define XWRIT 02 /* Text written into, must swap out */ #define XLOAD 04 /* Currently being read from file */ #define XLOCK 010 /* Being swapped in or out */ #define XWANT 020 /* Wanted for swapping */ E 1 h07608 s 00001/00001/00036 d D 4.4 87/05/17 17:53:23 build 8 7 c changed #idents back again. -mkm e s 00001/00001/00036 d D 4.3 87/05/14 16:31:54 build 7 6 c removed old SCCS strings and inserted #ident BB e s 00001/00003/00036 d D 4.2 87/04/16 15:40:29 dc 6 5 c dc - Add Bull updates from 03/05/87 e s 00000/00000/00039 d D 4.1 87/02/20 13:35:45 build 5 4 c rolled rev to -r4 /dc e s 00000/00000/00039 d D 3.1 87/01/19 09:27:09 build 4 3 c rolled rev to -r3 /dc e s 00000/00000/00039 d D 2.1 87/01/19 09:27:09 build 3 2 c AUTO NULL DELTA e s 00001/00000/00038 d D 1.2 87/01/16 10:22:05 build 2 1 c add ident string /dc e s 00038/00000/00000 d D 1.1 87/01/09 15:42:48 build 1 0 c Placed under source control - dc e u U f b f n t T I 2 D 6 /* "%W% %E%" */ E 2 I 1 /* %Z% Bull-Sems SPIX %Q%/%M% %I% %E% */ E 6 I 6 D 7 /* " %W% %E% " */ E 7 I 7 D 8 #ident " %W% %E% " E 8 I 8 /* " %W% %E% " */ E 8 E 7 E 6 /* * Structure returned by ftime system call */ struct timeb { time_t time; unsigned short millitm; short timezone; short dstflag; }; /* * Timezones : time lag west of Greenwich in minutes * Note that the UNIX sign convention differs from usual standards * where time lag east of Greenwich is positive. * Most information from BSD4.2 */ #define ZONE_PST 8*60 /* USA : Pacific */ #define ZONE_MST 7*60 /* USA : Mountain */ #define ZONE_CST 6*60 /* USA : Central */ #define ZONE_EST 5*60 /* USA : Eastern */ #define ZONE_AST 4*60 /* USA : Atlantic */ #define ZONE_WET 0*60 /* Western Europe (e.g. GB)*/ #define ZONE_MET -1*60 /* Middle Europe (e.g. France) */ #define ZONE_EET -2*60 /* Eastern Europe */ #define ZONE_WAT -8*60 /* Western Australia */ #define ZONE_CAT -10*60+30 /* Central Australia */ #define ZONE_EAT -10*60 /* Eastern Australia */ /* * Daylight Saving Time zones */ #define DST_NONE 0 /* none */ #define DST_USA 1 /* USA */ #define DST_AUST 2 /* Australia */ #define DST_WET 3 /* Western Europe */ #define DST_MET 4 /* Middle Europe */ #define DST_EET 5 /* Eastern Europe */ E 1 h65248 s 00001/00001/00011 d D 4.4 87/05/17 17:53:24 build 8 7 c changed #idents back again. -mkm e s 00001/00001/00011 d D 4.3 87/05/14 16:32:03 build 7 6 c removed old SCCS strings and inserted #ident BB e s 00001/00001/00011 d D 4.2 87/04/16 15:40:56 dc 6 5 c dc - Add Bull updates from 03/05/87 e s 00000/00000/00012 d D 4.1 87/02/20 13:35:48 build 5 4 c rolled rev to -r4 /dc e s 00000/00000/00012 d D 3.1 87/01/19 09:27:11 build 4 3 c rolled rev to -r3 /dc e s 00000/00000/00012 d D 2.1 87/01/19 09:27:11 build 3 2 c AUTO NULL DELTA e s 00001/00000/00011 d D 1.2 87/01/16 10:22:08 build 2 1 c add ident string /dc e s 00011/00000/00000 d D 1.1 87/01/09 15:42:50 build 1 0 c Placed under source control - dc e u U f b f n t T I 2 D 6 /* "%W% %E%" */ E 6 I 6 D 7 /* " %W% %E% " */ E 7 I 7 D 8 #ident " %W% %E% " E 8 I 8 /* " %W% %E% " */ E 8 E 7 E 6 E 2 I 1 /* * Per trace structure */ struct trace { struct clist tr_outq; short tr_state; short tr_chbits; short tr_rcnt; unsigned char tr_chno; char tr_ct; }; E 1 h40443 s 00001/00001/00034 d D 4.5 87/05/17 17:53:25 build 9 8 c changed #idents back again. -mkm e s 00001/00001/00034 d D 4.4 87/05/14 16:32:13 build 8 7 c removed old SCCS strings and inserted #ident BB e s 00001/00001/00034 d D 4.3 87/04/22 19:49:27 build 7 6 c fixed French spellings in comments. (ksm) e s 00001/00001/00034 d D 4.2 87/04/16 15:41:09 dc 6 5 c dc - Add Bull updates from 03/05/87 e s 00000/00000/00035 d D 4.1 87/02/20 13:35:50 build 5 4 c rolled rev to -r4 /dc e s 00000/00000/00035 d D 3.1 87/01/19 09:27:13 build 4 3 c rolled rev to -r3 /dc e s 00000/00000/00035 d D 2.1 87/01/19 09:27:13 build 3 2 c AUTO NULL DELTA e s 00001/00000/00034 d D 1.2 87/01/16 10:22:10 build 2 1 c add ident string /dc e s 00034/00000/00000 d D 1.1 87/01/09 15:42:51 build 1 0 c Placed under source control - dc e u U f b f n t T I 2 D 6 /* "%W% %E%" */ E 6 I 6 D 8 /* " %W% %E% " */ E 8 I 8 D 9 #ident " %W% %E% " E 9 I 9 /* " %W% %E% " */ E 9 E 8 E 6 E 2 I 1 /* * Trap type values */ #define SYSCALL 0 /* system call */ #define KCALLFLT 1 /* invalid kcall */ D 7 #define ALIGNFLT 2 /* data alignement error */ E 7 I 7 #define ALIGNFLT 2 /* data alignment error */ E 7 #define ILLINSTRFLT 3 /* illegal instruction */ #define PARITYFFLT 4 /* double bit parity error (code fetch) */ #define PARITYEFLT 5 /* double bit parity error (execute) */ #define SEGFLT 6 /* segmentation exception */ #define PROTFLT 7 /* protection violation fault */ #define PGRDFLT 8 /* page read error on page fault */ #define KVIOLFLT 9 /* kernel violation */ #define CHKFLT 10 /* check instruction trap */ #define TRAPFLT 11 /* trap instruction */ #define IOVFLFLT 12 /* integer overflow */ #define IZERODIVFLT 13 /* integer zero divide */ #define ROVFLFLT 14 /* real overflow */ #define RUDFLFLT 15 /* real underflow */ #define RZERODIVFLT 16 /* real zero divide */ #define INEXRES 17 /* inexact result */ #define BEFORE 18 /* before trap */ #define BPTFLT 19 /* trap 0 : breakpoint */ #define RESCHED 20 /* reschedule trap */ #define EXTERNINT 21 /* external interrupt */ #define SWTCH0INT 22 /* switch 0 interrupt */ #define PWROFF 23 /* power fail warning */ #define PWRON 24 /* end power glitch */ #define TIMER1INT 25 /* timer 1 interrupt */ #define TIMER2INT 26 /* timer 2 interrupt */ #define RESFLT 27 /* reserved exception vector */ #define KDEBUG 28 /* return from KDB after fatal system error */ #define ADDUPC 29 /* user profiling */ E 1 h27726 s 00001/00001/00031 d D 4.4 87/05/17 17:53:26 build 8 7 c changed #idents back again. -mkm e s 00001/00001/00031 d D 4.3 87/05/14 16:32:24 build 7 6 c removed old SCCS strings and inserted #ident BB e s 00001/00002/00031 d D 4.2 87/04/16 15:41:27 dc 6 5 c dc - Add Bull updates from 03/05/87 e s 00000/00000/00033 d D 4.1 87/02/20 13:35:53 build 5 4 c rolled rev to -r4 /dc e s 00000/00000/00033 d D 3.1 87/01/19 09:27:15 build 4 3 c rolled rev to -r3 /dc e s 00000/00000/00033 d D 2.1 87/01/19 09:27:15 build 3 2 c AUTO NULL DELTA e s 00001/00000/00032 d D 1.2 87/01/16 10:22:13 build 2 1 c add ident string /dc e s 00032/00000/00000 d D 1.1 87/01/09 15:42:52 build 1 0 c Placed under source control - dc e u U f b f n t T I 2 D 6 /* "%W% %E%" */ E 2 I 1 /* @(#)ttold.h 6.1 */ E 6 I 6 D 7 /* " %W% %E% " */ E 7 I 7 D 8 #ident " %W% %E% " E 8 I 8 /* " %W% %E% " */ E 8 E 7 E 6 struct sgttyb { char sg_ispeed; char sg_ospeed; char sg_erase; char sg_kill; int sg_flags; }; /* modes */ #define O_HUPCL 01 #define O_XTABS 02 #define O_LCASE 04 #define O_ECHO 010 #define O_CRMOD 020 #define O_RAW 040 #define O_ODDP 0100 #define O_EVENP 0200 #define O_NLDELAY 001400 #define O_NL1 000400 #define O_NL2 001000 #define O_TBDELAY 002000 #define O_NOAL 004000 #define O_CRDELAY 030000 #define O_CR1 010000 #define O_CR2 020000 #define O_VTDELAY 040000 #define O_BSDELAY 0100000 #define tIOC ('t'<<8) #define TIOCGETP (tIOC|8) #define TIOCSETP (tIOC|9) E 1 h62235 s 00001/00001/00163 d D 4.4 87/05/17 17:53:27 build 8 7 c changed #idents back again. -mkm e s 00001/00001/00163 d D 4.3 87/05/14 16:32:34 build 7 6 c removed old SCCS strings and inserted #ident BB e s 00001/00002/00163 d D 4.2 87/04/16 15:41:39 dc 6 5 c dc - Add Bull updates from 03/05/87 e s 00000/00000/00165 d D 4.1 87/02/20 13:35:55 build 5 4 c rolled rev to -r4 /dc e s 00000/00000/00165 d D 3.1 87/01/19 09:27:17 build 4 3 c rolled rev to -r3 /dc e s 00000/00000/00165 d D 2.1 87/01/19 09:27:17 build 3 2 c AUTO NULL DELTA e s 00001/00000/00164 d D 1.2 87/01/16 10:22:16 build 2 1 c add ident string /dc e s 00164/00000/00000 d D 1.1 87/01/09 15:42:54 build 1 0 c Placed under source control - dc e u U f b f n t T I 2 D 6 /* "%W% %E%" */ E 2 I 1 /* @(#)tty.h 6.2 */ E 6 I 6 D 7 /* " %W% %E% " */ E 7 I 7 D 8 #ident " %W% %E% " E 8 I 8 /* " %W% %E% " */ E 8 E 7 E 6 /* * A clist structure is the head of a linked list queue of characters. * The routines getc* and putc* manipulate these structures. */ struct clist { int c_cc; /* character count */ struct cblock *c_cf; /* pointer to first */ struct cblock *c_cl; /* pointer to last */ }; /* Macro to find clist structure given pointer into it */ #define CMATCH(pointer) (char *)(cfree + (pointer - cfree)) /* Character control block for interrupt level control */ struct ccblock { caddr_t c_ptr; /* buffer address */ ushort c_count; /* character count */ ushort c_size; /* buffer size */ }; /* * A tty structure is needed for each UNIX character device that * is used for normal terminal IO. */ #define NCC 8 struct tty { struct clist t_rawq; /* raw input queue */ struct clist t_canq; /* canonical queue */ struct clist t_outq; /* output queue */ struct ccblock t_tbuf; /* tx control block */ struct ccblock t_rbuf; /* rx control block */ int (* t_proc)(); /* routine for device functions */ ushort t_iflag; /* input modes */ ushort t_oflag; /* output modes */ ushort t_cflag; /* control modes */ ushort t_lflag; /* line discipline modes */ int t_state; /* internal state */ short t_pgrp; /* process group name */ char t_line; /* line discipline */ char t_delct; /* delimiter count */ char t_term; /* terminal type */ char t_tmflag; /* terminal flags */ char t_col; /* current column */ char t_row; /* current row */ char t_vrow; /* variable row */ char t_lrow; /* last physical row */ char t_hqcnt; /* no. high queue packets on t_outq */ char t_dstat; /* used by terminal handlers and line disciplines */ unsigned char t_cc[NCC]; /* settable control chars */ }; /* * The structure of a clist block */ #define CLSIZE 64 struct cblock { struct cblock *c_next; char c_first; char c_last; short padd ; char c_data[CLSIZE]; }; extern struct cblock cfree[]; extern struct cblock * getcb(); extern struct cblock * getcf(); extern struct clist ttnulq; struct chead { struct cblock *c_next; int c_size; int c_flag; }; extern struct chead cfreelist; struct inter { int cnt; }; #define QESC 0200 /* queue escape */ #define HQEND 01 /* high queue end */ #define TTIPRI 28 #define TTOPRI 29 /* limits */ extern int ttlowat[], tthiwat[]; #define TTYHOG 256 #define TTXOLO 132 #define TTXOHI 180 #define TTECHI 80 /* Hardware bits */ #define DONE 0200 #define IENABLE 0100 #define OVERRUN 040000 #define FRERROR 020000 #define PERROR 010000 /* Internal state */ #define TIMEOUT 01 /* Delay timeout in progress */ #define WOPEN 02 /* Waiting for open to complete */ #define ISOPEN 04 /* Device is open */ #define TBLOCK 010 #define CARR_ON 020 /* Software copy of carrier-present */ #define BUSY 040 /* Output in progress */ #define OASLP 0100 /* Wakeup when output done */ #define IASLP 0200 /* Wakeup when input done */ #define TTSTOP 0400 /* Output stopped by ctl-s */ #define EXTPROC 01000 /* External processing */ #define TACT 02000 #define CLESC 04000 /* Last char escape */ #define RTO 010000 /* Raw Timeout */ #define TTIOW 020000 #define TTXON 040000 #define TTXOFF 0100000 /* l_output status */ #define CPRES 0100000 /* device commands */ #define T_OUTPUT 0 #define T_TIME 1 #define T_SUSPEND 2 #define T_RESUME 3 #define T_BLOCK 4 #define T_UNBLOCK 5 #define T_RFLUSH 6 #define T_WFLUSH 7 #define T_BREAK 8 #define T_INPUT 9 #define T_OUTNEXT 10 #define T_PARM 11 #define T_SWTCH 12 #define T_RFLUSE 13 #define T_WFLUSE 14 /* * Terminal flags (set in t_tmflgs). */ #define SNL 1 /* non-standard new-line needed */ #define ANL 2 /* automatic new-line */ #define LCF 4 /* Special treatment of last col, row */ #define TERM_CTLECHO 010 /* Echo terminal control characters */ #define TERM_INVIS 020 /* do not send escape sequences to user */ #define QLOCKB 040 /* high queue locked for base level */ #define QLOCKI 0100 /* high queue locked for interrupts */ #define TERM_BIT 0200 /* Bit reserved for terminal drivers. */ /* Usually used to indicate that an esc*/ /* character has arrived and that the */ /* next character is special. */ /* This bit is the same as the TM_SET */ /* bit which may never be set by a user*/ /* * device report */ #define L_BUF 0 #define L_BREAK 3 E 1 h46404 s 00001/00001/00019 d D 4.4 87/05/17 17:53:29 build 8 7 c changed #idents back again. -mkm e s 00001/00001/00019 d D 4.3 87/05/14 16:32:46 build 7 6 c removed old SCCS strings and inserted #ident BB e s 00001/00001/00019 d D 4.2 87/04/16 15:42:00 dc 6 5 c dc - Add Bull updates from 03/05/87 e s 00000/00000/00020 d D 4.1 87/02/20 13:35:58 build 5 4 c rolled rev to -r4 /dc e s 00000/00000/00020 d D 3.1 87/01/19 09:27:19 build 4 3 c rolled rev to -r3 /dc e s 00000/00000/00020 d D 2.1 87/01/19 09:27:19 build 3 2 c AUTO NULL DELTA e s 00001/00000/00019 d D 1.2 87/01/16 10:22:19 build 2 1 c add ident string /dc e s 00019/00000/00000 d D 1.1 87/01/09 15:42:55 build 1 0 c Placed under source control - dc e u U f b f n t T I 2 D 6 /* "%W% %E%" */ E 6 I 6 D 7 /* " %W% %E% " */ E 7 I 7 D 8 #ident " %W% %E% " E 8 I 8 /* " %W% %E% " */ E 8 E 7 E 6 E 2 I 1 typedef struct tune { int t_gpgslo; /* If freemem < t_getpgslow, then start */ /* to steal pages from processes. */ int t_gpgshi; /* Once we start to steal pages, don't */ /* stop until freemem > t_getpgshi. */ int t_age; /* Steal pages every t_age cpu seconds */ int t_vhandr; /* Run vhand once every t_vhandr seconds*/ /* if freemem < t_vhandl. */ int t_vhandl; /* Run vhand once every t_vhandr seconds*/ /* if freemem < t_vhandl. */ int t_maxsc; /* The maximum number of contiguous */ /* pages which will be swapped out in a */ /* single operation. */ int t_prep; /* Max. number of pre-loaded pages */ int t_bdflushr; /* The rate at which bdflush is run in */ /* seconds. */ } tune_t; extern tune_t tune; E 1 h38831 s 00001/00001/00022 d D 4.4 87/05/17 17:53:30 build 9 8 c changed #idents back again. -mkm e s 00001/00001/00022 d D 4.3 87/05/14 16:32:56 build 8 7 c removed old SCCS strings and inserted #ident BB e s 00001/00001/00022 d D 4.2 87/04/16 15:42:18 dc 7 6 c dc - Add Bull updates from 03/05/87 e s 00000/00000/00023 d D 4.1 87/02/20 13:36:00 build 6 5 c rolled rev to -r4 /dc e s 00001/00001/00022 d D 3.2 87/01/26 12:55:03 build 5 4 c add page table changes /dc e s 00000/00000/00023 d D 3.1 87/01/19 09:27:21 build 4 3 c rolled rev to -r3 /dc e s 00000/00000/00023 d D 2.1 87/01/19 09:27:21 build 3 2 c AUTO NULL DELTA e s 00001/00000/00022 d D 1.2 87/01/16 10:22:21 build 2 1 c add ident string /dc e s 00022/00000/00000 d D 1.1 87/01/09 15:42:56 build 1 0 c Placed under source control - dc e u U f b f n t T I 2 D 7 /* "%W% %E%" */ E 7 I 7 D 8 /* " %W% %E% " */ E 8 I 8 D 9 #ident " %W% %E% " E 9 I 9 /* " %W% %E% " */ E 9 E 8 E 7 E 2 I 1 typedef struct { int r[1]; } * physadr; typedef unsigned short iord_t; typedef char swck_t; typedef unsigned char use_t; #define MAXSUSE 255 /* maximum share count on swap */ D 5 #define LABEL_TSZ 14 E 5 I 5 #define LABEL_TSZ 16 E 5 typedef long daddr_t; typedef char * caddr_t; typedef unsigned int uint; typedef unsigned short ushort; typedef ushort ino_t; typedef short cnt_t; typedef long time_t; typedef int label_t[LABEL_TSZ]; typedef short dev_t; typedef long off_t; typedef long paddr_t; typedef long key_t; typedef ushort pgadr_t; E 1 h05069 s 00001/00001/00021 d D 4.5 87/05/17 17:53:31 build 9 8 c changed #idents back again. -mkm e s 00001/00001/00021 d D 4.4 87/05/14 16:33:06 build 8 7 c removed old SCCS strings and inserted #ident BB e s 00013/00024/00009 d D 4.3 87/04/22 20:05:28 build 7 6 c excised French comments. (ksm) e s 00001/00002/00032 d D 4.2 87/04/16 15:42:32 dc 6 5 c dc - Add Bull updates from 03/05/87 e s 00000/00000/00034 d D 4.1 87/02/20 13:36:03 build 5 4 c rolled rev to -r4 /dc e s 00000/00000/00034 d D 3.1 87/01/19 09:27:23 build 4 3 c rolled rev to -r3 /dc e s 00000/00000/00034 d D 2.1 87/01/19 09:27:23 build 3 2 c AUTO NULL DELTA e s 00001/00000/00033 d D 1.2 87/01/16 10:22:24 build 2 1 c add ident string /dc e s 00033/00000/00000 d D 1.1 87/01/09 15:42:58 build 1 0 c Placed under source control - dc e u U f b f n t T I 2 D 6 /* "%W% %E%" */ E 2 I 1 /* %Z% Bull-Sems SPIX %Q%/%M% %I% %E% */ E 6 I 6 D 8 /* " %W% %E% " */ E 8 I 8 D 9 #ident " %W% %E% " E 9 I 9 /* " %W% %E% " */ E 9 E 8 E 6 /* D 7 * Notes: * La structure uio a ete introduite dans 4.2bsd pour permettre * l'implementation des "vectored i/o" (readv/writev) ; ces nouvelles * primitives autorisent la fragmentation du buffer d'e/s en plusieurs * morceaux disperses dans le segment "data" du processus. L'acces a * ces fragments s'effectue par l'intermediaire d'un vecteur "iovec" * lui-meme reference au travers de la structure "uio" associee * a l'operation d 'e/s courante. * * Comme la quasi-totalite du code d'origine 4.2bsd , le code socket * reference la zone d'e/s du processus utilisateur via la structure * "uio" ;cette structure est implementee dans SPIX,UNIQUEMENT,pour * faciliter le transplantation du code socket. * voir aussi :sorwuio() E 7 I 7 * From 4.2bsd; included for transplantation of socket code only. E 7 * I 7 * Structures for "vectored I/O" * E 7 */ D 7 struct iovec { /* struct du vecteur descripteur des frag. */ caddr_t iov_base; /* adresse du frag. */ int iov_len; /* long. du frag. */ E 7 I 7 struct iovec { caddr_t iov_base; int iov_len; E 7 }; D 7 struct uio { /* descripteur des parametres de l'e/s */ struct iovec *uio_iov; /* pointeur sur le iovec associe */ int uio_iovcnt; /* nombre de frag. (TJS 1! pour l'instant) */ int uio_offset; /* copie de file.f_offset (adr. disque) */ int uio_segflg; /* copie de user.u_segflag (seg user/kernel) */ int uio_resid; /* nb. d'octets non transferes en fin d'e/s */ E 7 I 7 struct uio { struct iovec *uio_iov; int uio_iovcnt; int uio_offset; int uio_segflg; int uio_resid; E 7 }; D 7 enum uio_rw { UIO_READ, UIO_WRITE }; /* type d'operations */ E 7 I 7 enum uio_rw { UIO_READ, UIO_WRITE }; E 7 E 1 h01174 s 00001/00001/00010 d D 4.4 87/05/17 17:53:32 build 8 7 c changed #idents back again. -mkm e s 00001/00001/00010 d D 4.3 87/05/14 16:33:16 build 7 6 c removed old SCCS strings and inserted #ident BB e s 00001/00002/00010 d D 4.2 87/04/16 15:42:45 dc 6 5 c dc - Add Bull updates from 03/05/87 e s 00000/00000/00012 d D 4.1 87/02/20 13:36:05 build 5 4 c rolled rev to -r4 /dc e s 00000/00000/00012 d D 3.1 87/01/19 09:27:25 build 4 3 c rolled rev to -r3 /dc e s 00000/00000/00012 d D 2.1 87/01/19 09:27:25 build 3 2 c AUTO NULL DELTA e s 00001/00000/00011 d D 1.2 87/01/16 10:22:26 build 2 1 c add ident string /dc e s 00011/00000/00000 d D 1.1 87/01/09 15:42:59 build 1 0 c Placed under source control - dc e u U f b f n t T I 2 D 6 /* "%W% %E%" */ E 2 I 1 /* %Z% Bull-Sems SPIX %Q%/%M% %I% %E% */ E 6 I 6 D 7 /* " %W% %E% " */ E 7 I 7 D 8 #ident " %W% %E% " E 8 I 8 /* " %W% %E% " */ E 8 E 7 E 6 /* * Definitions for UNIX IPC domain. */ struct sockaddr_un { short sun_family; /* AF_UNIX */ char sun_path[109]; /* path name (gag) */ }; int unp_discard(); E 1 h38972 s 00001/00001/00032 d D 4.4 87/05/17 17:53:33 build 8 7 c changed #idents back again. -mkm e s 00001/00001/00032 d D 4.3 87/05/14 16:33:28 build 7 6 c removed old SCCS strings and inserted #ident BB e s 00001/00002/00032 d D 4.2 87/04/16 15:42:59 dc 6 5 c dc - Add Bull updates from 03/05/87 e s 00000/00000/00034 d D 4.1 87/02/20 13:36:07 build 5 4 c rolled rev to -r4 /dc e s 00000/00000/00034 d D 3.1 87/01/19 09:27:27 build 4 3 c rolled rev to -r3 /dc e s 00000/00000/00034 d D 2.1 87/01/19 09:27:27 build 3 2 c AUTO NULL DELTA e s 00001/00000/00033 d D 1.2 87/01/16 10:22:29 build 2 1 c add ident string /dc e s 00033/00000/00000 d D 1.1 87/01/09 15:43:00 build 1 0 c Placed under source control - dc e u U f b f n t T I 2 D 6 /* "%W% %E%" */ E 2 I 1 /* %Z% Bull-Sems SPIX %Q%/%M% %I% %E% */ E 6 I 6 D 7 /* " %W% %E% " */ E 7 I 7 D 8 #ident " %W% %E% " E 8 I 8 /* " %W% %E% " */ E 8 E 7 E 6 /* * Protocol control block for an active * instance of a UNIX internal protocol. * * A socket may be associated with an inode in the * file system. If so, the unp_inode pointer holds * a reference count to this inode, which should be irele'd * when the socket goes away. * * A socket may be connected to another socket, in which * case the control block of the socket to which it is connected * is given by unp_conn. * * A socket may be referenced by a number of sockets (e.g. several * sockets may be connected to a datagram socket.) These sockets * are in a linked list starting with unp_refs, linked through * unp_nextref and null-terminated. Note that a socket may be referenced * by a number of other sockets and may also reference a socket (not * necessarily one which is referencing it). This generates * the need for unp_refs and unp_nextref to be separate fields. */ struct unpcb { struct socket *unp_socket; /* pointer back to socket */ struct inode *unp_inode; /* if associated with file */ struct unpcb *unp_conn; /* control block of connected socket */ struct unpcb *unp_refs; /* referencing socket linked list */ struct unpcb *unp_nextref; /* link in unp_refs list */ struct mbuf *unp_remaddr; /* address of connected socket */ }; #define sotounpcb(so) ((struct unpcb *)((so)->so_pcb)) E 1 h21909 s 00001/00001/00126 d D 4.5 87/05/17 17:53:34 build 9 8 c changed #idents back again. -mkm e s 00001/00001/00126 d D 4.4 87/05/14 16:33:39 build 8 7 c removed old SCCS strings and inserted #ident BB e s 00001/00001/00126 d D 4.3 87/04/16 15:43:16 dc 7 6 c dc - Add Bull updates from 03/05/87 e s 00001/00001/00126 d D 4.2 87/04/15 17:54:19 dc 6 5 c dc - changed #include "sys/..." to #include e s 00000/00000/00127 d D 4.1 87/02/20 13:36:10 build 5 4 c rolled rev to -r4 /dc e s 00000/00000/00127 d D 3.1 87/01/19 09:27:30 build 4 3 c rolled rev to -r3 /dc e s 00000/00000/00127 d D 2.1 87/01/19 09:27:30 build 3 2 c AUTO NULL DELTA e s 00001/00000/00126 d D 1.2 87/01/16 10:22:32 build 2 1 c add ident string /dc e s 00126/00000/00000 d D 1.1 87/01/09 15:43:01 build 1 0 c Placed under source control - dc e u U f b f n t T I 2 D 7 /* "%W% %E%" */ E 7 I 7 D 8 /* " %W% %E% " */ E 8 I 8 D 9 #ident " %W% %E% " E 9 I 9 /* " %W% %E% " */ E 9 E 8 E 7 E 2 I 1 D 6 #include "sys/pcb.h" E 6 I 6 #include E 6 /* * The user structure. * One allocated per process. * Contains all per process data that doesn't need to be referenced * while the process is swapped. * The user block is USIZE*click bytes long; resides at virtual kernel * loc 0x7ffe000 on SPS9 * contains the system stack per user; is cross referenced * with the proc structure for the same process. */ #define PSARGSZ 40 struct user { struct pcb u_pcb; /* user pcb, save area when switching */ label_t u_rsav; /* save info when exchanging stacks */ label_t u_qsav; /* label variable for quits and interrupts */ label_t u_ssav; /* label variable for swapping */ char u_segflg; /* IO flag: 0:user D; 1:system; 2:user I */ unsigned char u_error; /* return error code */ ushort u_uid; /* effective user id */ ushort u_gid; /* effective group id */ ushort u_ruid; /* real user id */ ushort u_rgid; /* real group id */ struct proc *u_procp; /* pointer to proc structure */ int *u_ap; /* pointer to arglist */ union { /* syscall return values */ struct { int r_val1; int r_val2; }r_reg; off_t r_off; time_t r_time; } u_r; caddr_t u_base; /* base address for IO */ unsigned u_count; /* bytes remaining for IO */ off_t u_offset; /* offset in file for IO */ short u_fmode; /* file mode for IO */ ushort u_pbsize; /* bytes in block for IO */ ushort u_pboff; /* offset in block for IO */ dev_t u_pbdev; /* real device for IO */ daddr_t u_rablock; /* read ahead block addr */ short u_errcnt; /* syscall error count */ struct inode *u_cdir; /* current directory of process */ struct inode *u_rdir; /* root directory of process */ caddr_t u_dirp; /* pathname pointer */ struct direct u_dent; /* current directory entry */ struct inode *u_pdir; /* inode of parent directory of dirp */ struct file *u_ofile[NOFILE]; /* pointers to file structures of open files */ char u_pofile[NOFILE]; /* per-process flags of open files */ int u_arg[10]; /* arguments to current system call */ unsigned u_tsize; /* text size (clicks) */ unsigned u_datorg; /* start virtual address for data */ unsigned u_dsize; /* data size (clicks) */ unsigned u_ssize; /* stack size (clicks) */ caddr_t u_sigcode ; /* common code address for signals */ int u_signal[NSIG]; /* disposition of signals */ time_t u_utime; /* this process user time */ time_t u_stime; /* this process system time */ time_t u_cutime; /* sum of childs' utimes */ time_t u_cstime; /* sum of childs' stimes */ time_t u_agetime; /* last time process regions */ /* were aged: utime + stime */ int *u_ar0; /* address of users saved R0 */ struct { /* profile arguments */ short *pr_base; /* buffer base */ unsigned pr_size; /* buffer size */ unsigned pr_off; /* pc offset */ unsigned pr_scale; /* pc scaling */ } u_prof; char u_intflg; /* catch intr from sys */ char u_sep; /* flag for I and D separation */ short *u_ttyp; /* pointer to pgrp in "tty" struct */ dev_t u_ttyd; /* controlling tty dev */ struct ufhd { /* header of executable file */ short ux_mag; /* magic number */ short ux_stamp; /* stamp */ unsigned ux_tsize; /* text size */ unsigned ux_dsize; /* data size */ unsigned ux_bsize; /* bss size */ unsigned ux_ssize; /* symbol table size */ unsigned ux_entloc; /* entry location */ unsigned ux_unused; unsigned ux_relflg; } u_exdata; #define ux_txtorg ux_unused #define ux_datorg ux_relflg #define ux_tstart ux_ssize char u_comm[DIRSIZ]; /* command name for accounting */ char u_psargs[PSARGSZ]; /* command and args printed by ps */ time_t u_start; time_t u_ticks; long u_mem; long u_ior; long u_iow; long u_iosw; long u_ioch; char u_acflag; short u_cmask; /* mask for file creation */ daddr_t u_limit; /* maximum write address */ short u_lock; /* process/text locking flags */ int u_stack[1]; /* kernel stack per user * extends from u + USIZE*64 * backward not to reach here */ }; extern struct user u; #define u_rval1 u_r.r_reg.r_val1 #define u_rval2 u_r.r_reg.r_val2 #define u_roff u_r.r_off #define u_rtime u_r.r_time /* ioflag values: Read/Write, User/Kernel, Ins/Data */ #define U_WUD 0 #define U_RUD 1 #define U_WKD 2 #define U_RKD 3 #define U_WUI 4 #define U_RUI 5 #define EXCLOSE 01 E 1 h64012 s 00001/00001/00008 d D 4.4 87/05/17 17:53:36 build 8 7 c changed #idents back again. -mkm e s 00001/00001/00008 d D 4.3 87/05/14 16:33:49 build 7 6 c removed old SCCS strings and inserted #ident BB e s 00001/00001/00008 d D 4.2 87/04/16 15:43:30 dc 6 5 c dc - Add Bull updates from 03/05/87 e s 00000/00000/00009 d D 4.1 87/02/20 13:36:13 build 5 4 c rolled rev to -r4 /dc e s 00000/00000/00009 d D 3.1 87/01/19 09:27:32 build 4 3 c rolled rev to -r3 /dc e s 00000/00000/00009 d D 2.1 87/01/19 09:27:32 build 3 2 c AUTO NULL DELTA e s 00001/00000/00008 d D 1.2 87/01/16 10:22:35 build 2 1 c add ident string /dc e s 00008/00000/00000 d D 1.1 87/01/09 15:43:02 build 1 0 c Placed under source control - dc e u U f b f n t T I 2 D 6 /* "%W% %E%" */ E 6 I 6 D 7 /* " %W% %E% " */ E 7 I 7 D 8 #ident " %W% %E% " E 8 I 8 /* " %W% %E% " */ E 8 E 7 E 6 E 2 I 1 struct utsname { char sysname[9]; char nodename[9]; char release[9]; char version[9]; char machine[9]; }; extern struct utsname utsname; E 1 h63467 s 00001/00001/00042 d D 4.4 87/05/17 17:53:37 build 8 7 c changed #idents back again. -mkm e s 00001/00001/00042 d D 4.3 87/05/14 16:33:59 build 7 6 c removed old SCCS strings and inserted #ident BB e s 00001/00001/00042 d D 4.2 87/04/16 15:43:40 dc 6 5 c dc - Add Bull updates from 03/05/87 e s 00000/00000/00043 d D 4.1 87/02/20 13:36:15 build 5 4 c rolled rev to -r4 /dc e s 00000/00000/00043 d D 3.1 87/01/19 09:27:34 build 4 3 c rolled rev to -r3 /dc e s 00000/00000/00043 d D 2.1 87/01/19 09:27:34 build 3 2 c AUTO NULL DELTA e s 00001/00000/00042 d D 1.2 87/01/16 10:22:37 build 2 1 c add ident string /dc e s 00042/00000/00000 d D 1.1 87/01/09 15:43:03 build 1 0 c Placed under source control - dc e u U f b f n t T I 2 D 6 /* "%W% %E%" */ E 6 I 6 D 7 /* " %W% %E% " */ E 7 I 7 D 8 #ident " %W% %E% " E 8 I 8 /* " %W% %E% " */ E 8 E 7 E 6 E 2 I 1 struct var { int v_buf; int v_call; int v_inode; char * ve_inode; int v_file; char * ve_file; int v_mount; char * ve_mount; int v_proc; char * ve_proc; int v_text; char * ve_text; int v_region; int v_clist; int v_sabuf; int v_maxup; int v_smap; int v_hbuf; int v_hmask; int v_pbuf; int v_swapmap; int v_nsptmap; /* Size of system virtual space allocation map. */ int v_vhndfrac; /* fraction of maxmem to set a limit for running vhand. see getpages and clock */ int v_maxpmem; /* The maximum physical memory to use. If v_maxpmem == 0, then use all available physical memory. Otherwise, value is amount of mem to use (specified in pages). */ int v_autoup; /* The age a delayed-write buffer must */ /* be in seconds before bdflush will */ /* write it out. */ /* #ifdef SOCKET */ int v_mbuf; int v_mclbuf; int v_nmbcl; /* #endif SOCKET */ int v_npty; }; extern struct var v; E 1 h01356 s 00001/00001/00000 d D 4.5 87/05/17 17:53:38 build 9 8 c changed #idents back again. -mkm e s 00001/00002/00000 d D 4.4 87/05/14 16:34:14 build 8 7 c removed old SCCS strings and inserted #ident BB e s 00001/00001/00001 d D 4.3 87/04/16 15:44:18 dc 7 6 c dc - Add Bull updates from 03/05/87 e s 00001/00001/00001 d D 4.2 87/04/06 18:37:33 build 6 5 c changed to reflect ridge-ness. -mkm e s 00000/00000/00002 d D 4.1 87/02/20 13:36:18 build 5 4 c rolled rev to -r4 /dc e s 00000/00000/00002 d D 3.1 87/01/19 09:27:36 build 4 3 c rolled rev to -r3 /dc e s 00000/00000/00002 d D 2.1 87/01/19 09:27:36 build 3 2 c AUTO NULL DELTA e s 00001/00000/00001 d D 1.2 87/01/16 10:22:40 build 2 1 c add ident string /dc e s 00001/00000/00000 d D 1.1 87/01/09 15:43:04 build 1 0 c Placed under source control - dc e u U f b f n t T I 2 D 7 /* "%W% %E%" */ E 7 I 7 D 8 /* " %W% %E% " */ E 7 E 2 I 1 D 6 static char sscid[] = "@(#) SPIX920.0 Bull Sems" ; E 6 I 6 static char sscid[] = "@(#) RX/V 0.0 Ridge Computers" ; E 8 I 8 D 9 #ident " %W% %E% " E 9 I 9 /* " %W% %E% " */ E 9 E 8 E 6 E 1 h54157 s 00001/00001/00015 d D 4.5 87/05/17 17:53:39 build 14 13 c changed #idents back again. -mkm e s 00001/00001/00015 d D 4.4 87/05/14 16:34:27 build 13 12 c removed old SCCS strings and inserted #ident BB e s 00008/00004/00008 d D 4.3 87/04/29 14:17:57 dc 12 6 c dc - Add (..) on or-ed ioctl codes. e s 00010/00002/00010 d R 4.3 87/04/29 13:56:38 dc 11 6 c dc - add (..) on or-ed ioctl consturctions. e s 00003/00003/00035 d R 4.6 87/04/27 18:38:42 dc 10 9 c dc - Add ( .. ) on ioctl code definitions e s 00005/00006/00033 d R 4.5 87/04/27 18:21:42 dc 9 8 c e s 00013/00006/00026 d R 4.4 87/04/27 18:18:47 dc 8 7 c dc - make a smaller hardware info block for kernel usage. e s 00022/00002/00010 d R 4.3 87/04/27 16:24:01 dc 7 6 c dc - Add ioctl / strucuture for hardware features. e s 00001/00002/00011 d D 4.2 87/04/16 15:17:04 dc 6 5 c dc - Add Bull updates from 03/05/87 e s 00000/00000/00013 d D 4.1 87/02/20 13:36:20 build 5 4 c rolled rev to -r4 /dc e s 00000/00000/00013 d D 3.1 87/01/19 09:27:38 build 4 3 c rolled rev to -r3 /dc e s 00000/00000/00013 d D 2.1 87/01/19 09:27:38 build 3 2 c AUTO NULL DELTA e s 00001/00000/00012 d D 1.2 87/01/16 10:22:42 build 2 1 c add ident string /dc e s 00012/00000/00000 d D 1.1 87/01/09 15:42:05 build 1 0 c Placed under source control - dc e u U f b f n t T I 2 D 6 /* "%W% %E%" */ E 2 I 1 /* @(#)mem.h 6.2 */ E 6 I 6 D 13 /* " %W% %E% " */ E 13 I 13 D 14 #ident " %W% %E% " E 14 I 14 /* " %W% %E% " */ E 14 E 13 E 6 /* * */ #define MM_IO ('C'<<8) D 12 #define MM_READ MM_IO | 0 #define MM_WRITE MM_IO | 1 E 12 I 12 #define MM_READ (MM_IO | 0) #define MM_WRITE (MM_IO | 1) /* * Structure passed into / returned from MM_READ / MM_WRITE ioctl */ E 12 struct ctrio { D 12 uint ctrad ; uint value ; E 12 I 12 uint ctrad ; /* IO address for READ / WRITE opcode */ uint value ; /* data read / value to be written */ E 12 }; E 1 h30953 s 00001/00001/00054 d D 4.4 87/05/17 17:53:41 build 8 7 c changed #idents back again. -mkm e s 00001/00001/00054 d D 4.3 87/05/14 16:34:38 build 7 6 c removed old SCCS strings and inserted #ident BB e s 00001/00001/00054 d D 4.2 87/04/16 15:45:05 dc 6 5 c dc - Add Bull updates from 03/05/87 e s 00000/00000/00055 d D 4.1 87/02/20 13:36:22 build 5 4 c rolled rev to -r4 /dc e s 00000/00000/00055 d D 3.1 87/01/19 09:27:40 build 4 3 c rolled rev to -r3 /dc e s 00000/00000/00055 d D 2.1 87/01/19 09:27:40 build 3 2 c AUTO NULL DELTA e s 00001/00000/00054 d D 1.2 87/01/16 10:22:45 build 2 1 c add ident string /dc e s 00054/00000/00000 d D 1.1 87/01/09 15:43:05 build 1 0 c Placed under source control - dc e u U f b f n t T I 2 D 6 /* "%W% %E%" */ E 6 I 6 D 7 /* " %W% %E% " */ E 7 I 7 D 8 #ident " %W% %E% " E 8 I 8 /* " %W% %E% " */ E 8 E 7 E 6 E 2 I 1 /* | SPS9 virtual memory support with then extended Memory controller */ #define VRTSIZE 512 #define VRTMASK VRTSIZE-1 #define VRT_UW 1 #define VRT_KW 1 #define VRT_UR 0 #define VRT_KR 0 #define VRT_M 1 #define VRT_V 1 typedef struct vrt { ushort segno; /* Segment number */ ushort vpn; /* Virtual page number */ paddr_t link; /* Real absolute address of the next hash */ /* chain entry with the same hash code */ unsigned pg_unus : 1, /* Unused bit */ pg_pfn : 15, /* Real page number */ pg_tag : 11, /* High order bits of virtual address */ pg_r : 1, /* Referenced bit */ pg_l : 1, /* Fixed bit */ pg_w : 1, /* Writeable bit */ pg_v : 1, /* Valid bit */ pg_d : 1; /* Dirty bit */ struct vrt *vlink ; /* Virtual address of the next hash */ /* chain entry with the same hash code */ struct vrt *next; /* Address of the next chain entry */ /* with the same real page number */ } vrte_t; /* | definition of the reverse vrt entry | it contains a pointer to a vrt entry | associated with a pte */ typedef struct { vrte_t *vrt_e ; } rvrte_t ; /* | Hash function used in order to find the vrt entry for the given segmnent | segno an virtual page in that segment vpn */ #define vrt_hash(vpn,segno) (segno+vpn) & VRTMASK /* Number of vrt entry into a page */ #define NPGVRT (NBPP/sizeof(vrte_t)) vrte_t *vrt_find() ; vrte_t *vrt_alloc() ; E 1 h54030 s 00001/00001/00100 d D 4.5 87/05/18 21:43:43 build 10 9 c added support for adding bad blocks. -gas e s 00001/00001/00100 d D 4.4 87/05/17 17:53:42 build 9 8 c changed #idents back again. -mkm e s 00001/00001/00100 d D 4.3 87/05/14 16:34:49 build 8 7 c removed old SCCS strings and inserted #ident BB e s 00001/00001/00100 d D 4.2 87/04/16 15:44:43 dc 7 6 c dc - Add Bull updates from 03/05/87 e s 00000/00000/00101 d D 4.1 87/02/20 13:36:25 build 6 5 c rolled rev to -r4 /dc e s 00021/00003/00080 d D 3.2 87/02/13 11:49:27 build 5 4 c add bull changes from Jan 23 /dc e s 00000/00000/00083 d D 3.1 87/01/19 09:27:42 build 4 3 c rolled rev to -r3 /dc e s 00000/00000/00083 d D 2.1 87/01/19 09:27:42 build 3 2 c AUTO NULL DELTA e s 00001/00000/00082 d D 1.2 87/01/16 10:22:48 build 2 1 c add ident string /dc e s 00082/00000/00000 d D 1.1 87/01/09 15:43:06 build 1 0 c Placed under source control - dc e u U f b f n t T I 2 D 7 /* "%W% %E%" */ E 7 I 7 D 8 /* " %W% %E% " */ E 8 I 8 D 9 #ident " %W% %E% " E 9 I 9 /* " %W% %E% " */ E 9 E 8 E 7 E 2 I 1 /* */ /* Volume Table Of Contents Description */ /* ------------------------------------- */ /* */ /* 1- Formatting identification */ /* 2- Disc characteristics */ /* 3- Partitionning table */ /* 4- Header of Bad blocks table */ /* */ /* The VTOC and the bad blocks table are located in */ /* the sectors 6 to 9 on a SMD disk drive */ /* */ #define V_NUMPAR 16 /* number of partitions */ #define VTOC_SANE 0x600DDEEE /* indicates a sane VTOC */ /* Partition identification tags*/ #define V_BOOT 0x01 /* Boot partition */ #define V_ROOT 0x02 /* Root filesystem */ #define V_SWAP 0x03 /* Swap partition */ #define V_USR 0x04 /* Usr filesystem */ #define V_FULLDISK 0x05 /* full disk */ /* Partition permission flags */ #define V_UNMNT 0x01 /* unmountable partition */ #define V_RONLY 0x10 /* Read only */ I 5 /* partition standard numbers */ #define P_BOOT 7 /* Boot partition */ #define P_ROOT 0 /* Root filesystem */ #define P_SWAP 1 /* Swap partition */ #define P_USR 2 /* Usr filesystem */ #define P_FULLDISK 6 /* full disk */ /* minimum sizes of boot partition and root partition */ #define BOOTMIN 48 #define ROOTMIN 32768 /* VTOC physical address(4096 blocks) */ #define VTOC_ADR 3 E 5 /* driver ioctl() commands */ #define VIOC ('V'<<8) #define V_PWRITE (VIOC|1) /* Physical Write */ struct x_smd { uint adbuf ; uint count ; }; /* Partition structure */ struct partition { char p_tag; /* id tag of partition */ char p_flag; /* permission flags */ ushort p_start; /* start cylinder no of partition */ daddr_t p_blockn; /* number of blocks in partition */ }; /* VTOC structure */ struct vtoc { uint v_sanity; /* to verify vtoc sanity */ D 5 char v_formid[64]; /* formatting identification */ E 5 I 5 char v_serial[16]; /* serial number of drive */ uint v_vsize; /* vol size(pages nb) ROS compatibility */ char v_hskew; /* head skew ROS compatibility */ char v_tskew; /* track skew ROS compatibility */ char v_formid[32]; /* formatting identification */ D 10 char fill0[10]; /* reserved */ E 10 I 10 char v_model[10]; /* model name of drive */ E 10 E 5 char v_driveid; /* identifies the device type */ char fill1; /* reserved */ char v_sectors; /* number sectors per track */ char v_heads; /* number heads per cylinder */ ushort v_bytes; /* number of bytes per sector */ ushort v_cyls; /* number of cylinders */ ushort v_cyla; /* number of accessible cylinders */ ushort v_nparts; /* number of partitions */ time_t v_pmtime; /* partitionning modification time */ struct partition v_part[V_NUMPAR]; /* partition table */ ushort v_nbb; /* number of bad blocks */ ushort v_nbbmax; /* number of max bad blocks */ D 5 uint v_serial; /* serial number of drive */ short fill2[2]; /* reserved */ E 5 I 5 short fill2[4]; /* reserved */ E 5 }; /* */ /* Bad Blocks table description */ /* */ /* 1- bbindex : indexing the bad block map */ /* size = v_cyls * (2 bytes) */ /* index in bbindex = cyl number */ /* */ /* 2- bbmap : bad block address -> good block address */ /* size = v_nbbmax * (8 bytes) */ /* */ struct bb_ind { ushort b_mapind; }; struct bb_gb { uint bb; /* bad block address */ uint gb; /* good block address */ }; E 1 h04621 s 00001/00001/00009 d D 4.4 87/05/17 17:53:43 build 8 7 c changed #idents back again. -mkm e s 00001/00001/00009 d D 4.3 87/05/14 16:34:59 build 7 6 c removed old SCCS strings and inserted #ident BB e s 00001/00001/00009 d D 4.2 87/04/16 15:40:45 dc 6 5 c dc - Add Bull updates from 03/05/87 e s 00000/00000/00010 d D 4.1 87/02/20 13:36:28 build 5 4 c rolled rev to -r4 /dc e s 00000/00000/00010 d D 3.1 87/01/19 09:27:44 build 4 3 c rolled rev to -r3 /dc e s 00000/00000/00010 d D 2.1 87/01/19 09:27:44 build 3 2 c AUTO NULL DELTA e s 00001/00000/00009 d D 1.2 87/01/16 10:22:50 build 2 1 c add ident string /dc e s 00009/00000/00000 d D 1.1 87/01/09 15:42:49 build 1 0 c Placed under source control - dc e u U f b f n t T I 2 D 6 /* "%W% %E%" */ E 6 I 6 D 7 /* " %W% %E% " */ E 7 I 7 D 8 #ident " %W% %E% " E 8 I 8 /* " %W% %E% " */ E 8 E 7 E 6 E 2 I 1 /* * Structure returned by times() */ struct tms { time_t tms_utime; /* user time */ time_t tms_stime; /* system time */ time_t tms_cutime; /* user time, children */ time_t tms_cstime; /* system time, children */ }; E 1 2 h05013 s 00000/00000/00294 d D 4.10 87/05/20 13:43:48 brian 21 20 c mbuf.h put back on system search path BB e s 00002/00002/00292 d D 4.9 87/05/20 11:52:22 build 20 19 c put mbuf.h back into /usr/include/sys. -mkm e s 00000/00000/00294 d D 4.8 87/05/17 17:53:46 build 19 18 c changed #idents back again. -mkm e s 00003/00000/00291 d D 4.7 87/05/11 08:15:03 dc 18 17 c dc - Add ieeefp.h e s 00002/00002/00289 d D 4.6 87/05/07 18:47:01 van 17 16 c van - move defsocket.h back to /usr/include/sys e s 00018/00018/00273 d D 4.5 87/04/29 15:45:24 van 16 15 c van - move networking includes to INCUCB e s 00003/00000/00288 d D 4.4 87/04/29 14:02:13 dc 15 14 c dc - Add sysridge.h e s 00003/00000/00285 d D 4.3 87/04/24 07:30:03 dc 14 13 c dc - add const.c.h e s 00007/00001/00278 d D 4.2 87/04/22 14:36:45 dc 13 11 c dc - add hwclock and physmem e s 00003/00000/00279 d R 4.2 87/04/16 15:49:49 dc 12 11 c add limits.h e s 00000/00000/00279 d D 4.1 87/02/20 13:36:34 build 11 10 c rolled rev to -r4 /dc e s 00001/00004/00278 d D 3.2 87/01/26 11:06:36 build 10 9 c remove vrt.h for pte version e s 00000/00000/00282 d D 3.1 87/01/19 09:27:49 build 9 8 c rolled rev to -r3 /dc e s 00000/00000/00282 d D 2.1 87/01/19 09:27:49 build 8 7 c AUTO NULL DELTA e s 00001/00000/00281 d D 1.7 87/01/16 10:22:57 build 7 6 c add ident string /dc e s 00002/00002/00279 d D 1.6 87/01/12 12:28:39 build 6 5 c change const.as9.h to const.as.h e s 00006/00000/00275 d D 1.5 87/01/12 11:41:06 build 5 4 c add const.as9.h and maint.h e s 00002/00000/00273 d D 1.4 87/01/11 11:27:26 build 4 3 c add clobber entry e s 00003/00000/00270 d D 1.3 87/01/09 17:19:32 build 3 2 c add rnio.h e s 00176/00176/00094 d D 1.2 87/01/09 15:39:57 build 2 1 c change procedure so sccs file goes directly to $(SPX)/usr/include /dc e s 00270/00000/00000 d D 1.1 87/01/09 15:05:15 build 1 0 c Placed under source control - dc e u U f b f n t T I 7 # "%W% %E%" E 7 I 1 FILES = $(SPX)/usr/include/sys/acct.h \ $(SPX)/usr/include/sys/ass.h \ $(SPX)/usr/include/sys/aouthdr.h \ $(SPX)/usr/include/sys/bitmasks.h \ D 16 $(SPX)/usr/include/sys/bsdioctl.h \ E 16 I 16 $(INCUCB)/sys/bsdioctl.h \ E 16 $(SPX)/usr/include/sys/buf.h \ $(SPX)/usr/include/sys/callo.h \ $(SPX)/usr/include/sys/cio.h \ $(SPX)/usr/include/sys/clock.h \ $(SPX)/usr/include/sys/conf.h \ I 5 D 6 $(SPX)/usr/include/sys/const.as9.h \ E 6 I 6 $(SPX)/usr/include/sys/const.as.h \ I 14 $(SPX)/usr/include/sys/const.c.h \ E 14 E 6 E 5 $(SPX)/usr/include/sys/crtctl.h \ $(SPX)/usr/include/sys/ctio.h \ $(SPX)/usr/include/sys/debug.h \ D 16 $(SPX)/usr/include/sys/defsocket.h \ E 16 I 16 D 17 $(INCUCB)/sys/defsocket.h \ E 17 I 17 $(SPX)/usr/include/sys/defsocket.h \ E 17 E 16 $(SPX)/usr/include/sys/dir.h \ D 16 $(SPX)/usr/include/sys/domain.h \ E 16 I 16 $(INCUCB)/sys/domain.h \ E 16 $(SPX)/usr/include/sys/elog.h \ $(SPX)/usr/include/sys/erec.h \ $(SPX)/usr/include/sys/err.h \ $(SPX)/usr/include/sys/errno.h \ $(SPX)/usr/include/sys/fblk.h \ $(SPX)/usr/include/sys/fdlp.h \ $(SPX)/usr/include/sys/file.h \ $(SPX)/usr/include/sys/filehdr.h \ $(SPX)/usr/include/sys/filsys.h \ $(SPX)/usr/include/sys/flock.h \ I 13 $(SPX)/usr/include/sys/hwclock.h \ I 18 $(SPX)/usr/include/sys/ieeefp.h \ E 18 E 13 $(SPX)/usr/include/sys/init.h \ $(SPX)/usr/include/sys/ino.h \ $(SPX)/usr/include/sys/inode.h \ $(SPX)/usr/include/sys/iobuf.h \ $(SPX)/usr/include/sys/iomachdep.h \ $(SPX)/usr/include/sys/ipc.h \ $(SPX)/usr/include/sys/lock.h \ $(SPX)/usr/include/sys/lprio.h \ I 5 $(SPX)/usr/include/sys/maint.h \ E 5 $(SPX)/usr/include/sys/map.h \ $(SPX)/usr/include/sys/mas.h \ D 16 $(SPX)/usr/include/sys/mbuf.h \ E 16 I 16 D 20 $(INCUCB)/sys/mbuf.h \ E 20 I 20 $(SPX)/usr/include/sys/mbuf.h \ E 20 E 16 $(SPX)/usr/include/sys/me.h \ $(SPX)/usr/include/sys/mem.h \ $(SPX)/usr/include/sys/mount.h \ $(SPX)/usr/include/sys/msg.h \ $(SPX)/usr/include/sys/mt.h \ $(SPX)/usr/include/sys/mtio.h \ $(SPX)/usr/include/sys/opt.h \ $(SPX)/usr/include/sys/page.h \ $(SPX)/usr/include/sys/param.h \ D 13 $(SPX)/usr/include/sys/pfdat.h \ E 13 $(SPX)/usr/include/sys/pcb.h \ I 13 $(SPX)/usr/include/sys/pfdat.h \ $(SPX)/usr/include/sys/physmem.h \ E 13 $(SPX)/usr/include/sys/proc.h \ D 16 $(SPX)/usr/include/sys/protosw.h \ E 16 I 16 $(INCUCB)/sys/protosw.h \ E 16 $(SPX)/usr/include/sys/psl.h \ $(SPX)/usr/include/sys/pty.h \ $(SPX)/usr/include/sys/reg.h \ $(SPX)/usr/include/sys/region.h \ I 3 $(SPX)/usr/include/sys/rnio.h \ E 3 $(SPX)/usr/include/sys/scnhdr.h \ $(SPX)/usr/include/sys/seg.h \ $(SPX)/usr/include/sys/sem.h \ $(SPX)/usr/include/sys/shm.h \ $(SPX)/usr/include/sys/signal.h \ $(SPX)/usr/include/sys/smd.h \ D 16 $(SPX)/usr/include/sys/socket.h \ $(SPX)/usr/include/sys/socketvar.h \ E 16 I 16 $(INCUCB)/sys/socket.h \ $(INCUCB)/sys/socketvar.h \ E 16 $(SPX)/usr/include/sys/space.h \ $(SPX)/usr/include/sys/stat.h \ $(SPX)/usr/include/sys/swap.h \ $(SPX)/usr/include/sys/sxt.h \ $(SPX)/usr/include/sys/sysinfo.h \ $(SPX)/usr/include/sys/sysmacros.h \ I 15 $(SPX)/usr/include/sys/sysridge.h \ E 15 $(SPX)/usr/include/sys/systm.h \ $(SPX)/usr/include/sys/termio.h \ $(SPX)/usr/include/sys/text.h \ $(SPX)/usr/include/sys/timeb.h \ $(SPX)/usr/include/sys/times.h \ $(SPX)/usr/include/sys/trace.h \ $(SPX)/usr/include/sys/trap.h \ $(SPX)/usr/include/sys/ttold.h \ $(SPX)/usr/include/sys/tty.h \ $(SPX)/usr/include/sys/tuneable.h \ $(SPX)/usr/include/sys/types.h \ $(SPX)/usr/include/sys/uio.h \ D 16 $(SPX)/usr/include/sys/un.h \ $(SPX)/usr/include/sys/unpcb.h \ E 16 I 16 $(INCUCB)/sys/un.h \ $(INCUCB)/sys/unpcb.h \ E 16 $(SPX)/usr/include/sys/user.h \ $(SPX)/usr/include/sys/utsname.h \ $(SPX)/usr/include/sys/var.h \ $(SPX)/usr/include/sys/version.h \ D 10 $(SPX)/usr/include/sys/vtoc.h\ $(SPX)/usr/include/sys/vrt.h E 10 I 10 $(SPX)/usr/include/sys/vtoc.h E 10 all: $(FILES) clean: -cd $(SPX)/usr/include/sys; rm -f *.h I 4 clobber: clean E 4 D 2 $(SPX)/usr/include/sys/acct.h: acct.h rm -f $@ ; ln $? $@ $(SPX)/usr/include/sys/ass.h: ass.h rm -f $@ ; ln $? $@ $(SPX)/usr/include/sys/aouthdr.h: aouthdr.h rm -f $@ ; ln $? $@ $(SPX)/usr/include/sys/bitmasks.h: bitmasks.h rm -f $@ ; ln $? $@ $(SPX)/usr/include/sys/bsdioctl.h: bsdioctl.h rm -f $@ ; ln $? $@ $(SPX)/usr/include/sys/buf.h: buf.h rm -f $@ ; ln $? $@ $(SPX)/usr/include/sys/callo.h: callo.h rm -f $@ ; ln $? $@ $(SPX)/usr/include/sys/cio.h: cio.h rm -f $@ ; ln $? $@ $(SPX)/usr/include/sys/clock.h: clock.h rm -f $@ ; ln $? $@ $(SPX)/usr/include/sys/conf.h: conf.h rm -f $@ ; ln $? $@ $(SPX)/usr/include/sys/crtctl.h: crtctl.h rm -f $@ ; ln $? $@ $(SPX)/usr/include/sys/ctio.h: ctio.h rm -f $@ ; ln $? $@ $(SPX)/usr/include/sys/debug.h: debug.h rm -f $@ ; ln $? $@ $(SPX)/usr/include/sys/defsocket.h: defsocket.h rm -f $@ ; ln $? $@ $(SPX)/usr/include/sys/dir.h: dir.h rm -f $@ ; ln $? $@ $(SPX)/usr/include/sys/domain.h: domain.h rm -f $@ ; ln $? $@ $(SPX)/usr/include/sys/elog.h: elog.h rm -f $@ ; ln $? $@ $(SPX)/usr/include/sys/erec.h: erec.h rm -f $@ ; ln $? $@ $(SPX)/usr/include/sys/err.h: err.h rm -f $@ ; ln $? $@ $(SPX)/usr/include/sys/errno.h: errno.h rm -f $@ ; ln $? $@ $(SPX)/usr/include/sys/fblk.h: fblk.h rm -f $@ ; ln $? $@ $(SPX)/usr/include/sys/fdlp.h: fdlp.h rm -f $@ ; ln $? $@ $(SPX)/usr/include/sys/file.h: file.h rm -f $@ ; ln $? $@ $(SPX)/usr/include/sys/filehdr.h: filehdr.h rm -f $@ ; ln $? $@ $(SPX)/usr/include/sys/filsys.h: filsys.h rm -f $@ ; ln $? $@ $(SPX)/usr/include/sys/flock.h: flock.h rm -f $@ ; ln $? $@ $(SPX)/usr/include/sys/init.h: init.h rm -f $@ ; ln $? $@ $(SPX)/usr/include/sys/ino.h: ino.h rm -f $@ ; ln $? $@ $(SPX)/usr/include/sys/inode.h: inode.h rm -f $@ ; ln $? $@ $(SPX)/usr/include/sys/iobuf.h: iobuf.h rm -f $@ ; ln $? $@ $(SPX)/usr/include/sys/iomachdep.h: iomachdep.h rm -f $@ ; ln $? $@ $(SPX)/usr/include/sys/ipc.h: ipc.h rm -f $@ ; ln $? $@ $(SPX)/usr/include/sys/lock.h: lock.h rm -f $@ ; ln $? $@ $(SPX)/usr/include/sys/lprio.h: lprio.h rm -f $@ ; ln $? $@ $(SPX)/usr/include/sys/map.h: map.h rm -f $@ ; ln $? $@ $(SPX)/usr/include/sys/mas.h: mas.h rm -f $@ ; ln $? $@ $(SPX)/usr/include/sys/mbuf.h: mbuf.h rm -f $@ ; ln $? $@ $(SPX)/usr/include/sys/me.h: me.h rm -f $@ ; ln $? $@ $(SPX)/usr/include/sys/mem.h: mem.h rm -f $@ ; ln $? $@ $(SPX)/usr/include/sys/mount.h: mount.h rm -f $@ ; ln $? $@ $(SPX)/usr/include/sys/msg.h: msg.h rm -f $@ ; ln $? $@ $(SPX)/usr/include/sys/mt.h: mt.h rm -f $@ ; ln $? $@ $(SPX)/usr/include/sys/mtio.h: mtio.h rm -f $@ ; ln $? $@ $(SPX)/usr/include/sys/opt.h: opt.h rm -f $@ ; ln $? $@ $(SPX)/usr/include/sys/page.h: page.h rm -f $@ ; ln $? $@ $(SPX)/usr/include/sys/param.h: param.h rm -f $@ ; ln $? $@ $(SPX)/usr/include/sys/pfdat.h: pfdat.h rm -f $@ ; ln $? $@ $(SPX)/usr/include/sys/pcb.h: pcb.h rm -f $@ ; ln $? $@ $(SPX)/usr/include/sys/proc.h: proc.h rm -f $@ ; ln $? $@ $(SPX)/usr/include/sys/protosw.h: protosw.h rm -f $@ ; ln $? $@ $(SPX)/usr/include/sys/psl.h: psl.h rm -f $@ ; ln $? $@ $(SPX)/usr/include/sys/pty.h: pty.h rm -f $@ ; ln $? $@ $(SPX)/usr/include/sys/reg.h: reg.h rm -f $@ ; ln $? $@ $(SPX)/usr/include/sys/region.h: region.h rm -f $@ ; ln $? $@ $(SPX)/usr/include/sys/scnhdr.h: scnhdr.h rm -f $@ ; ln $? $@ $(SPX)/usr/include/sys/seg.h: seg.h rm -f $@ ; ln $? $@ $(SPX)/usr/include/sys/sem.h: sem.h rm -f $@ ; ln $? $@ $(SPX)/usr/include/sys/shm.h: shm.h rm -f $@ ; ln $? $@ $(SPX)/usr/include/sys/signal.h: signal.h rm -f $@ ; ln $? $@ $(SPX)/usr/include/sys/smd.h: smd.h rm -f $@ ; ln $? $@ $(SPX)/usr/include/sys/space.h: space.h rm -f $@ ; ln $? $@ $(SPX)/usr/include/sys/socket.h: socket.h rm -f $@ ; ln $? $@ $(SPX)/usr/include/sys/socketvar.h: socketvar.h rm -f $@ ; ln $? $@ $(SPX)/usr/include/sys/stat.h: stat.h rm -f $@ ; ln $? $@ $(SPX)/usr/include/sys/swap.h: swap.h rm -f $@ ; ln $? $@ $(SPX)/usr/include/sys/sxt.h: sxt.h rm -f $@ ; ln $? $@ $(SPX)/usr/include/sys/sysinfo.h: sysinfo.h rm -f $@ ; ln $? $@ $(SPX)/usr/include/sys/sysmacros.h: sysmacros.h rm -f $@ ; ln $? $@ $(SPX)/usr/include/sys/systm.h: systm.h rm -f $@ ; ln $? $@ $(SPX)/usr/include/sys/termio.h: termio.h rm -f $@ ; ln $? $@ $(SPX)/usr/include/sys/text.h: text.h rm -f $@ ; ln $? $@ $(SPX)/usr/include/sys/timeb.h: timeb.h rm -f $@ ; ln $? $@ $(SPX)/usr/include/sys/times.h: times.h rm -f $@ ; ln $? $@ $(SPX)/usr/include/sys/trace.h: trace.h rm -f $@ ; ln $? $@ $(SPX)/usr/include/sys/trap.h: trap.h rm -f $@ ; ln $? $@ $(SPX)/usr/include/sys/ttold.h: ttold.h rm -f $@ ; ln $? $@ $(SPX)/usr/include/sys/tty.h: tty.h rm -f $@ ; ln $? $@ $(SPX)/usr/include/sys/tuneable.h: tuneable.h rm -f $@ ; ln $? $@ $(SPX)/usr/include/sys/types.h: types.h rm -f $@ ; ln $? $@ $(SPX)/usr/include/sys/uio.h: uio.h rm -f $@ ; ln $? $@ $(SPX)/usr/include/sys/un.h: un.h rm -f $@ ; ln $? $@ $(SPX)/usr/include/sys/unpcb.h: unpcb.h rm -f $@ ; ln $? $@ $(SPX)/usr/include/sys/user.h: user.h rm -f $@ ; ln $? $@ $(SPX)/usr/include/sys/utsname.h: utsname.h rm -f $@ ; ln $? $@ $(SPX)/usr/include/sys/var.h: var.h rm -f $@ ; ln $? $@ $(SPX)/usr/include/sys/version.h: version.h rm -f $@ ; ln $? $@ $(SPX)/usr/include/sys/vtoc.h: vtoc.h rm -f $@ ; ln $? $@ $(SPX)/usr/include/sys/vrt.h: vrt.h rm -f $@ ; ln $? $@ E 2 I 2 $(SPX)/usr/include/sys/acct.h: s.acct.h rm -f $@ ; $(GET) $(GFLAGS) -p $? > $@ $(SPX)/usr/include/sys/ass.h: s.ass.h rm -f $@ ; $(GET) $(GFLAGS) -p $? > $@ $(SPX)/usr/include/sys/aouthdr.h: s.aouthdr.h rm -f $@ ; $(GET) $(GFLAGS) -p $? > $@ $(SPX)/usr/include/sys/bitmasks.h: s.bitmasks.h rm -f $@ ; $(GET) $(GFLAGS) -p $? > $@ D 16 $(SPX)/usr/include/sys/bsdioctl.h: s.bsdioctl.h E 16 I 16 $(INCUCB)/sys/bsdioctl.h: s.bsdioctl.h E 16 rm -f $@ ; $(GET) $(GFLAGS) -p $? > $@ $(SPX)/usr/include/sys/buf.h: s.buf.h rm -f $@ ; $(GET) $(GFLAGS) -p $? > $@ $(SPX)/usr/include/sys/callo.h: s.callo.h rm -f $@ ; $(GET) $(GFLAGS) -p $? > $@ $(SPX)/usr/include/sys/cio.h: s.cio.h rm -f $@ ; $(GET) $(GFLAGS) -p $? > $@ $(SPX)/usr/include/sys/clock.h: s.clock.h rm -f $@ ; $(GET) $(GFLAGS) -p $? > $@ I 5 D 6 $(SPX)/usr/include/sys/const.as9.h: s.const.as9.h E 6 I 6 $(SPX)/usr/include/sys/const.as.h: s.const.as.h I 14 rm -f $@ ; $(GET) $(GFLAGS) -p $? > $@ $(SPX)/usr/include/sys/const.c.h: s.const.c.h E 14 E 6 rm -f $@ ; $(GET) $(GFLAGS) -p $? > $@ E 5 $(SPX)/usr/include/sys/conf.h: s.conf.h rm -f $@ ; $(GET) $(GFLAGS) -p $? > $@ $(SPX)/usr/include/sys/crtctl.h: s.crtctl.h rm -f $@ ; $(GET) $(GFLAGS) -p $? > $@ $(SPX)/usr/include/sys/ctio.h: s.ctio.h rm -f $@ ; $(GET) $(GFLAGS) -p $? > $@ $(SPX)/usr/include/sys/debug.h: s.debug.h rm -f $@ ; $(GET) $(GFLAGS) -p $? > $@ D 16 $(SPX)/usr/include/sys/defsocket.h: s.defsocket.h E 16 I 16 D 17 $(INCUCB)/sys/defsocket.h: s.defsocket.h E 17 I 17 $(SPX)/usr/include/sys/defsocket.h: s.defsocket.h E 17 E 16 rm -f $@ ; $(GET) $(GFLAGS) -p $? > $@ $(SPX)/usr/include/sys/dir.h: s.dir.h rm -f $@ ; $(GET) $(GFLAGS) -p $? > $@ D 16 $(SPX)/usr/include/sys/domain.h: s.domain.h E 16 I 16 $(INCUCB)/sys/domain.h: s.domain.h E 16 rm -f $@ ; $(GET) $(GFLAGS) -p $? > $@ $(SPX)/usr/include/sys/elog.h: s.elog.h rm -f $@ ; $(GET) $(GFLAGS) -p $? > $@ $(SPX)/usr/include/sys/erec.h: s.erec.h rm -f $@ ; $(GET) $(GFLAGS) -p $? > $@ $(SPX)/usr/include/sys/err.h: s.err.h rm -f $@ ; $(GET) $(GFLAGS) -p $? > $@ $(SPX)/usr/include/sys/errno.h: s.errno.h rm -f $@ ; $(GET) $(GFLAGS) -p $? > $@ $(SPX)/usr/include/sys/fblk.h: s.fblk.h rm -f $@ ; $(GET) $(GFLAGS) -p $? > $@ $(SPX)/usr/include/sys/fdlp.h: s.fdlp.h rm -f $@ ; $(GET) $(GFLAGS) -p $? > $@ $(SPX)/usr/include/sys/file.h: s.file.h rm -f $@ ; $(GET) $(GFLAGS) -p $? > $@ $(SPX)/usr/include/sys/filehdr.h: s.filehdr.h rm -f $@ ; $(GET) $(GFLAGS) -p $? > $@ $(SPX)/usr/include/sys/filsys.h: s.filsys.h rm -f $@ ; $(GET) $(GFLAGS) -p $? > $@ $(SPX)/usr/include/sys/flock.h: s.flock.h rm -f $@ ; $(GET) $(GFLAGS) -p $? > $@ I 13 $(SPX)/usr/include/sys/hwclock.h: s.hwclock.h I 18 rm -f $@ ; $(GET) $(GFLAGS) -p $? > $@ $(SPX)/usr/include/sys/ieeefp.h: s.ieeefp.h E 18 rm -f $@ ; $(GET) $(GFLAGS) -p $? > $@ E 13 $(SPX)/usr/include/sys/init.h: s.init.h rm -f $@ ; $(GET) $(GFLAGS) -p $? > $@ $(SPX)/usr/include/sys/ino.h: s.ino.h rm -f $@ ; $(GET) $(GFLAGS) -p $? > $@ $(SPX)/usr/include/sys/inode.h: s.inode.h rm -f $@ ; $(GET) $(GFLAGS) -p $? > $@ $(SPX)/usr/include/sys/iobuf.h: s.iobuf.h rm -f $@ ; $(GET) $(GFLAGS) -p $? > $@ $(SPX)/usr/include/sys/iomachdep.h: s.iomachdep.h rm -f $@ ; $(GET) $(GFLAGS) -p $? > $@ $(SPX)/usr/include/sys/ipc.h: s.ipc.h rm -f $@ ; $(GET) $(GFLAGS) -p $? > $@ $(SPX)/usr/include/sys/lock.h: s.lock.h rm -f $@ ; $(GET) $(GFLAGS) -p $? > $@ $(SPX)/usr/include/sys/lprio.h: s.lprio.h I 5 rm -f $@ ; $(GET) $(GFLAGS) -p $? > $@ $(SPX)/usr/include/sys/maint.h: s.maint.h E 5 rm -f $@ ; $(GET) $(GFLAGS) -p $? > $@ $(SPX)/usr/include/sys/map.h: s.map.h rm -f $@ ; $(GET) $(GFLAGS) -p $? > $@ $(SPX)/usr/include/sys/mas.h: s.mas.h rm -f $@ ; $(GET) $(GFLAGS) -p $? > $@ D 16 $(SPX)/usr/include/sys/mbuf.h: s.mbuf.h E 16 I 16 D 20 $(INCUCB)/sys/mbuf.h: s.mbuf.h E 20 I 20 $(SPX)/usr/include/sys/mbuf.h: s.mbuf.h E 20 E 16 rm -f $@ ; $(GET) $(GFLAGS) -p $? > $@ $(SPX)/usr/include/sys/me.h: s.me.h rm -f $@ ; $(GET) $(GFLAGS) -p $? > $@ $(SPX)/usr/include/sys/mem.h: s.mem.h rm -f $@ ; $(GET) $(GFLAGS) -p $? > $@ $(SPX)/usr/include/sys/mount.h: s.mount.h rm -f $@ ; $(GET) $(GFLAGS) -p $? > $@ $(SPX)/usr/include/sys/msg.h: s.msg.h rm -f $@ ; $(GET) $(GFLAGS) -p $? > $@ $(SPX)/usr/include/sys/mt.h: s.mt.h rm -f $@ ; $(GET) $(GFLAGS) -p $? > $@ $(SPX)/usr/include/sys/mtio.h: s.mtio.h rm -f $@ ; $(GET) $(GFLAGS) -p $? > $@ $(SPX)/usr/include/sys/opt.h: s.opt.h rm -f $@ ; $(GET) $(GFLAGS) -p $? > $@ $(SPX)/usr/include/sys/page.h: s.page.h rm -f $@ ; $(GET) $(GFLAGS) -p $? > $@ $(SPX)/usr/include/sys/param.h: s.param.h rm -f $@ ; $(GET) $(GFLAGS) -p $? > $@ $(SPX)/usr/include/sys/pfdat.h: s.pfdat.h I 13 rm -f $@ ; $(GET) $(GFLAGS) -p $? > $@ $(SPX)/usr/include/sys/physmem.h: s.physmem.h E 13 rm -f $@ ; $(GET) $(GFLAGS) -p $? > $@ $(SPX)/usr/include/sys/pcb.h: s.pcb.h rm -f $@ ; $(GET) $(GFLAGS) -p $? > $@ $(SPX)/usr/include/sys/proc.h: s.proc.h rm -f $@ ; $(GET) $(GFLAGS) -p $? > $@ D 16 $(SPX)/usr/include/sys/protosw.h: s.protosw.h E 16 I 16 $(INCUCB)/sys/protosw.h: s.protosw.h E 16 rm -f $@ ; $(GET) $(GFLAGS) -p $? > $@ $(SPX)/usr/include/sys/psl.h: s.psl.h rm -f $@ ; $(GET) $(GFLAGS) -p $? > $@ $(SPX)/usr/include/sys/pty.h: s.pty.h rm -f $@ ; $(GET) $(GFLAGS) -p $? > $@ $(SPX)/usr/include/sys/reg.h: s.reg.h rm -f $@ ; $(GET) $(GFLAGS) -p $? > $@ $(SPX)/usr/include/sys/region.h: s.region.h I 3 rm -f $@ ; $(GET) $(GFLAGS) -p $? > $@ $(SPX)/usr/include/sys/rnio.h: s.rnio.h E 3 rm -f $@ ; $(GET) $(GFLAGS) -p $? > $@ $(SPX)/usr/include/sys/scnhdr.h: s.scnhdr.h rm -f $@ ; $(GET) $(GFLAGS) -p $? > $@ $(SPX)/usr/include/sys/seg.h: s.seg.h rm -f $@ ; $(GET) $(GFLAGS) -p $? > $@ $(SPX)/usr/include/sys/sem.h: s.sem.h rm -f $@ ; $(GET) $(GFLAGS) -p $? > $@ $(SPX)/usr/include/sys/shm.h: s.shm.h rm -f $@ ; $(GET) $(GFLAGS) -p $? > $@ $(SPX)/usr/include/sys/signal.h: s.signal.h rm -f $@ ; $(GET) $(GFLAGS) -p $? > $@ $(SPX)/usr/include/sys/smd.h: s.smd.h rm -f $@ ; $(GET) $(GFLAGS) -p $? > $@ $(SPX)/usr/include/sys/space.h: s.space.h rm -f $@ ; $(GET) $(GFLAGS) -p $? > $@ D 16 $(SPX)/usr/include/sys/socket.h: s.socket.h E 16 I 16 $(INCUCB)/sys/socket.h: s.socket.h E 16 rm -f $@ ; $(GET) $(GFLAGS) -p $? > $@ D 16 $(SPX)/usr/include/sys/socketvar.h: s.socketvar.h E 16 I 16 $(INCUCB)/sys/socketvar.h: s.socketvar.h E 16 rm -f $@ ; $(GET) $(GFLAGS) -p $? > $@ $(SPX)/usr/include/sys/stat.h: s.stat.h rm -f $@ ; $(GET) $(GFLAGS) -p $? > $@ $(SPX)/usr/include/sys/swap.h: s.swap.h rm -f $@ ; $(GET) $(GFLAGS) -p $? > $@ $(SPX)/usr/include/sys/sxt.h: s.sxt.h rm -f $@ ; $(GET) $(GFLAGS) -p $? > $@ $(SPX)/usr/include/sys/sysinfo.h: s.sysinfo.h rm -f $@ ; $(GET) $(GFLAGS) -p $? > $@ $(SPX)/usr/include/sys/sysmacros.h: s.sysmacros.h I 15 rm -f $@ ; $(GET) $(GFLAGS) -p $? > $@ $(SPX)/usr/include/sys/sysridge.h: s.sysridge.h E 15 rm -f $@ ; $(GET) $(GFLAGS) -p $? > $@ $(SPX)/usr/include/sys/systm.h: s.systm.h rm -f $@ ; $(GET) $(GFLAGS) -p $? > $@ $(SPX)/usr/include/sys/termio.h: s.termio.h rm -f $@ ; $(GET) $(GFLAGS) -p $? > $@ $(SPX)/usr/include/sys/text.h: s.text.h rm -f $@ ; $(GET) $(GFLAGS) -p $? > $@ $(SPX)/usr/include/sys/timeb.h: s.timeb.h rm -f $@ ; $(GET) $(GFLAGS) -p $? > $@ $(SPX)/usr/include/sys/times.h: s.times.h rm -f $@ ; $(GET) $(GFLAGS) -p $? > $@ $(SPX)/usr/include/sys/trace.h: s.trace.h rm -f $@ ; $(GET) $(GFLAGS) -p $? > $@ $(SPX)/usr/include/sys/trap.h: s.trap.h rm -f $@ ; $(GET) $(GFLAGS) -p $? > $@ $(SPX)/usr/include/sys/ttold.h: s.ttold.h rm -f $@ ; $(GET) $(GFLAGS) -p $? > $@ $(SPX)/usr/include/sys/tty.h: s.tty.h rm -f $@ ; $(GET) $(GFLAGS) -p $? > $@ $(SPX)/usr/include/sys/tuneable.h: s.tuneable.h rm -f $@ ; $(GET) $(GFLAGS) -p $? > $@ $(SPX)/usr/include/sys/types.h: s.types.h rm -f $@ ; $(GET) $(GFLAGS) -p $? > $@ $(SPX)/usr/include/sys/uio.h: s.uio.h rm -f $@ ; $(GET) $(GFLAGS) -p $? > $@ D 16 $(SPX)/usr/include/sys/un.h: s.un.h E 16 I 16 $(INCUCB)/sys/un.h: s.un.h E 16 rm -f $@ ; $(GET) $(GFLAGS) -p $? > $@ D 16 $(SPX)/usr/include/sys/unpcb.h: s.unpcb.h E 16 I 16 $(INCUCB)/sys/unpcb.h: s.unpcb.h E 16 rm -f $@ ; $(GET) $(GFLAGS) -p $? > $@ $(SPX)/usr/include/sys/user.h: s.user.h rm -f $@ ; $(GET) $(GFLAGS) -p $? > $@ $(SPX)/usr/include/sys/utsname.h: s.utsname.h rm -f $@ ; $(GET) $(GFLAGS) -p $? > $@ $(SPX)/usr/include/sys/var.h: s.var.h rm -f $@ ; $(GET) $(GFLAGS) -p $? > $@ $(SPX)/usr/include/sys/version.h: s.version.h rm -f $@ ; $(GET) $(GFLAGS) -p $? > $@ $(SPX)/usr/include/sys/vtoc.h: s.vtoc.h D 10 rm -f $@ ; $(GET) $(GFLAGS) -p $? > $@ $(SPX)/usr/include/sys/vrt.h: s.vrt.h E 10 rm -f $@ ; $(GET) $(GFLAGS) -p $? > $@ E 2 E 1 h55500 s 00001/00001/00007 d D 4.3 87/05/17 17:53:48 build 7 6 c changed #idents back again. -mkm e s 00001/00001/00007 d D 4.2 87/05/14 16:35:20 build 6 5 c removed old SCCS strings and inserted #ident BB e s 00000/00000/00008 d D 4.1 87/02/20 13:36:37 build 5 4 c rolled rev to -r4 /dc e s 00000/00000/00008 d D 3.1 87/01/19 09:27:51 build 4 3 c rolled rev to -r3 /dc e s 00000/00000/00008 d D 2.1 87/01/19 09:27:51 build 3 2 c AUTO NULL DELTA e s 00001/00000/00007 d D 1.2 87/01/16 10:23:01 build 2 1 c add ident string /dc e s 00007/00000/00000 d D 1.1 87/01/09 17:18:26 build 1 0 c Placed under source control - dc e u U f b f n t T I 2 D 6 /* "%W% %E%" */ E 6 I 6 D 7 #ident " %W% %E% " E 7 I 7 /* " %W% %E% " */ E 7 E 6 E 2 I 1 /* * File rnio.h * Raw Network ioctl codes */ #define RNTYPE ('r'<<8) #define RNIOADDR (RNTYPE | 1) /* Return IP and Ethernet addresses */ E 1 h01500 s 00001/00001/00002 d D 4.6 87/05/17 17:53:49 build 10 9 c changed #idents back again. -mkm e s 00001/00001/00002 d D 4.5 87/05/14 16:35:31 build 9 8 c removed old SCCS strings and inserted #ident BB e s 00000/00001/00003 d D 4.4 87/05/08 14:44:12 dc 8 7 c dc - Convert CONST to #define e s 00000/00001/00004 d D 4.3 87/04/24 07:28:05 dc 7 6 c e s 00000/00000/00005 d D 4.2 87/04/16 15:47:26 dc 6 5 c dc - Add Bull updates from 03/05/87 e s 00000/00000/00005 d D 4.1 87/02/20 13:36:39 build 5 4 c rolled rev to -r4 /dc e s 00000/00000/00005 d D 3.1 87/01/19 09:27:53 build 4 3 c rolled rev to -r3 /dc e s 00000/00000/00005 d D 2.1 87/01/19 09:27:53 build 3 2 c AUTO NULL DELTA e s 00001/00000/00004 d D 1.2 87/01/16 10:23:03 build 2 1 c add ident string /dc e s 00004/00000/00000 d D 1.1 87/01/12 11:39:33 build 1 0 c Placed under source control - dc e u U f b f n t T I 2 D 9 /* "%W% %E%" */ E 9 I 9 D 10 #ident " %W% %E% " E 10 I 10 /* " %W% %E% " */ E 10 E 9 E 2 I 1 D 7 /* "@(#)const.rasm.h 5.1 6/9/86" */ E 7 D 8 #define CONSTANT(name,val) name equ val E 8 #define HEX(val) 0/**/val/**/H E 1 h04617 s 00001/00001/00030 d D 4.8 87/05/17 17:53:50 build 12 11 c changed #idents back again. -mkm e s 00001/00001/00030 d D 4.7 87/05/14 16:35:41 build 11 10 c removed old SCCS strings and inserted #ident BB e s 00005/00000/00026 d D 4.6 87/05/08 15:06:31 dc 10 9 c dc - add usage suggestion e s 00015/00015/00011 d D 4.5 87/05/08 14:24:37 dc 9 8 c dc - Convert from CONSTANT to #define e s 00001/00000/00025 d D 4.4 87/04/27 17:27:49 dc 8 7 c dc - Add ELOGR e s 00001/00000/00024 d D 4.3 87/04/27 17:08:22 dc 7 6 c dc - Add MCODEVERSION e s 00001/00002/00023 d D 4.2 87/04/16 15:15:28 dc 6 5 c dc - Add Bull updates from 03/05/87 e s 00000/00000/00025 d D 4.1 87/02/20 13:36:42 build 5 4 c rolled rev to -r4 /dc e s 00000/00000/00025 d D 3.1 87/01/19 09:27:56 build 4 3 c rolled rev to -r3 /dc e s 00000/00000/00025 d D 2.1 87/01/19 09:27:56 build 3 2 c AUTO NULL DELTA e s 00001/00000/00024 d D 1.2 87/01/16 10:23:06 build 2 1 c add ident string /dc e s 00024/00000/00000 d D 1.1 87/01/12 11:39:23 build 1 0 c Placed under source control - dc e u U f b f n t T I 2 D 6 /* "%W% %E%" */ E 2 I 1 /* "@(#)maint.h 5.1 6/9/86" */ E 6 I 6 D 11 /* " %W% %E% " */ E 11 I 11 D 12 #ident " %W% %E% " E 12 I 12 /* " %W% %E% " */ E 12 E 11 I 10 /* * usage: * #include * #include */ E 10 E 6 /* Maint opcode definitions for assemblers without this knowledge */ D 9 CONSTANT(MAINTOP,HEX(4C)) I 8 CONSTANT(ELOGR,00) E 8 CONSTANT(MACHINEID,10) I 7 CONSTANT(MCODEVERSION,11) E 7 CONSTANT(CREG,12) E 9 I 9 #define MAINTOP HEX(4C) #define ELOGR 00 #define MACHINEID 10 #define MCODEVERSION 11 #define CREG 12 E 9 #define RR(r1,r2) r1*16+r2 /* definitions for CREG maint opcode on headwall only */ /* Req and DataOut are in R1 */ D 9 CONSTANT(HWClockReq,1) CONSTANT(HWClockDataOut,2) E 9 I 9 #define HWClockReq 1 #define HWClockDataOut 2 E 9 /* Ack and DataIn are in R1+1 */ D 9 CONSTANT(HWClockAck,1) CONSTANT(HWClockDataIn,2) E 9 I 9 #define HWClockAck 1 #define HWClockDataIn 2 E 9 /* definitions for headwall bits returned in ELOGR */ D 9 CONSTANT(HWPowerFail,HEX(100)) E 9 I 9 #define HWPowerFail HEX(100) E 9 /* Bits returned by MACHINEID in R1+1 */ D 9 CONSTANT(FTCopyOnWrite, HEX(1)) /* Memory controller does copy-on-write */ CONSTANT(FTWaterFall, HEX(2)) /* Enhanced Floating Point (Waterfall) processor */ CONSTANT(FTExtMemory, HEX(4)) /* Memory controller maps more than 8M==>new VRT */ CONSTANT(FTHeadwall, HEX(8)) /* Headwall processor */ CONSTANT(FTPageTables, HEX(10)) /* processor supports page table vm */ E 9 I 9 #define FTCopyOnWrite HEX(1) /* Memory controller does copy-on-write */ #define FTWaterFall HEX(2) /* Enhanced Floating Point (Waterfall) processor */ #define FTExtMemory HEX(4) /* Memory controller maps more than 8M==>new VRT */ #define FTHeadwall HEX(8) /* Headwall processor */ #define FTPageTables HEX(10) /* processor supports page table vm */ E 9 E 1 h33198 s 00001/00001/00048 d D 4.5 87/05/17 17:53:51 build 8 7 c changed #idents back again. -mkm e s 00001/00001/00048 d D 4.4 87/05/14 16:35:52 build 7 6 c removed old SCCS strings and inserted #ident BB e s 00005/00000/00044 d D 4.3 87/05/08 15:05:16 dc 6 5 c dc - add usage suggestion e s 00036/00036/00008 d D 4.2 87/05/08 14:48:12 dc 5 4 c dc - Convert CONST to #define e s 00000/00000/00044 d D 4.1 87/04/22 14:34:22 dc 4 3 c rolled rev to -r4 /dc e s 00000/00000/00044 d D 3.1 87/04/22 14:34:22 dc 3 2 c AUTO NULL DELTA e s 00000/00000/00044 d D 2.1 87/04/22 14:34:22 dc 2 1 c AUTO NULL DELTA e s 00044/00000/00000 d D 1.1 87/04/22 14:33:27 dc 1 0 c Placed under source control - dc e u U f b f n t T I 1 D 7 /* " %W% %E% " */ E 7 I 7 D 8 #ident " %W% %E% " E 8 I 8 /* " %W% %E% " */ E 8 E 7 I 6 /* * usage: * #include * #include */ E 6 D 5 CONSTANT(PMFDLPCmd, HEX(3C000)) /*FDLP default command blocks */ CONSTANT(PMHDCmd, HEX(3C100)) /*HD (ANSI) default command blocks */ CONSTANT(PMHWBoot, HEX(3C300)) /*headwall:time / boot info(12 bytes) */ CONSTANT(PMHWSwitch, HEX(3C301)) /*headwall:dip switch settings */ CONSTANT(PMHWYM, HEX(3C302)) /*headwall:year and month (halfword) */ CONSTANT(PMHWDHMS, HEX(3C304)) /*headwall:Day, hour, min, sec */ CONSTANT(PMHWBootAux, HEX(3C308)) /*headwall:Aux boot info */ CONSTANT(PMRBUGStack, HEX(3CC00)) /*RBUG stack */ CONSTANT(PMRBUGBits, HEX(3D800)) /*RBUG dispdriver bit map line buffer */ CONSTANT(PMRBUGCode1, HEX(3E000)) /*RBUG code */ CONSTANT(PMRBUGCode2, HEX(3F000)) /*RBUG code */ CONSTANT(PMRBUGCode3, HEX(40000)) /*RBUG code */ E 5 I 5 #define PMFDLPCmd HEX(3C000) /*FDLP default command blocks */ #define PMHDCmd HEX(3C100) /*HD (ANSI) default command blocks */ #define PMHWBoot HEX(3C300) /*headwall:time / boot info(12 bytes) */ #define PMHWSwitch HEX(3C301) /*headwall:dip switch settings */ #define PMHWYM HEX(3C302) /*headwall:year and month (halfword) */ #define PMHWDHMS HEX(3C304) /*headwall:Day, hour, min, sec */ #define PMHWBootAux HEX(3C308) /*headwall:Aux boot info */ #define PMRBUGStack HEX(3CC00) /*RBUG stack */ #define PMRBUGBits HEX(3D800) /*RBUG dispdriver bit map line buffer */ #define PMRBUGCode1 HEX(3E000) /*RBUG code */ #define PMRBUGCode2 HEX(3F000) /*RBUG code */ #define PMRBUGCode3 HEX(40000) /*RBUG code */ E 5 /* codes for headwall boot reason byte and aux boot byte */ D 5 CONSTANT(PMHWBPowerOn, HEX(1)) /* power on boot */ CONSTANT(PMHWBSwitchS, HEX(2)) /* front panel slow boot */ CONSTANT(PMHWBSwitchF, HEX(3)) /* front panel fast boot */ CONSTANT(PMHWBBO0, HEX(4)) /* clock command BO [0] */ CONSTANT(PMHWBBO1, HEX(5)) /* clock command BO 1 */ CONSTANT(PMHWBRE0, HEX(6)) /* clock command RE [0] */ CONSTANT(PMHWBRE1, HEX(7)) /* clock command RE 1 */ CONSTANT(PMHWBReq0, HEX(8)) /* serial (cpu request) command slow */ CONSTANT(PMHWBReq1, HEX(9)) /* serial (cpu request) command fast */ E 5 I 5 #define PMHWBPowerOn HEX(1) /* power on boot */ #define PMHWBSwitchS HEX(2) /* front panel slow boot */ #define PMHWBSwitchF HEX(3) /* front panel fast boot */ #define PMHWBBO0 HEX(4) /* clock command BO [0] */ #define PMHWBBO1 HEX(5) /* clock command BO 1 */ #define PMHWBRE0 HEX(6) /* clock command RE [0] */ #define PMHWBRE1 HEX(7) /* clock command RE 1 */ #define PMHWBReq0 HEX(8) /* serial (cpu request) command slow */ #define PMHWBReq1 HEX(9) /* serial (cpu request) command fast */ E 5 /* bits in headwall boot reason byte */ /* low bit of boot reason byte is fast / slow indicator */ D 5 CONSTANT(PMHWBFast, HEX(1)) /* fast boot bit */ E 5 I 5 #define PMHWBFast HEX(1) /* fast boot bit */ E 5 /* high bit of boot reason byte is diagnostic mode indicator */ D 5 CONSTANT(PMHWBDiag, HEX(80)) /* Diagnostic mode enabled */ E 5 I 5 #define PMHWBDiag HEX(80) /* Diagnostic mode enabled */ E 5 /* bits in the headwall switch byte */ D 5 CONSTANT(PMHWSwBDMask, HEX(C0)) /* Mask for boot device */ CONSTANT(PMHWSw8bit, HEX(20)) /* 8 bits/char (0==>7bits/char) */ CONSTANT(PMHWSwOddPar, HEX(10)) /* Odd parity (0==>even parity) */ CONSTANT(PMHWSwNoPar, HEX(08)) /* parity disabled (0==>enabled) */ CONSTANT(PMHWSwSpeed, HEX(07)) /* speed code */ CONSTANT(PMHWSwSp9600, HEX(00)) /* 9600 */ CONSTANT(PMHWSwSp300, HEX(01)) /* 300 */ CONSTANT(PMHWSwSp1200, HEX(02)) /* 1200 */ CONSTANT(PMHWSwSp2400, HEX(03)) /* 2400 */ CONSTANT(PMHWSwSp4800, HEX(04)) /* 4800 */ CONSTANT(PMHWSwSp9600a, HEX(05)) /* 9600 */ CONSTANT(PMHWSwSp19200, HEX(06)) /* 19200 */ CONSTANT(PMHWSwSp1200a, HEX(07)) /* 1200 */ E 5 I 5 #define PMHWSwBDMask HEX(C0) /* Mask for boot device */ #define PMHWSw8bit HEX(20) /* 8 bits/char (0==>7bits/char) */ #define PMHWSwOddPar HEX(10) /* Odd parity (0==>even parity) */ #define PMHWSwNoPar HEX(08) /* parity disabled (0==>enabled) */ #define PMHWSwSpeed HEX(07) /* speed code */ #define PMHWSwSp9600 HEX(00) /* 9600 */ #define PMHWSwSp300 HEX(01) /* 300 */ #define PMHWSwSp1200 HEX(02) /* 1200 */ #define PMHWSwSp2400 HEX(03) /* 2400 */ #define PMHWSwSp4800 HEX(04) /* 4800 */ #define PMHWSwSp9600a HEX(05) /* 9600 */ #define PMHWSwSp19200 HEX(06) /* 19200 */ #define PMHWSwSp1200a HEX(07) /* 1200 */ E 5 E 1 h35644 s 00001/00001/00015 d D 4.5 87/05/17 17:53:53 build 8 7 c changed #idents back again. -mkm e s 00001/00001/00015 d D 4.4 87/05/14 16:36:02 build 7 6 c removed old SCCS strings and inserted #ident BB e s 00005/00000/00011 d D 4.3 87/05/08 15:06:11 dc 6 5 c dc - add usage suggestion e s 00009/00009/00002 d D 4.2 87/05/07 13:54:04 dc 5 4 c dc - Switch to #define e s 00000/00000/00011 d D 4.1 87/04/22 14:34:17 dc 4 3 c rolled rev to -r4 /dc e s 00000/00000/00011 d D 3.1 87/04/22 14:34:17 dc 3 2 c AUTO NULL DELTA e s 00000/00000/00011 d D 2.1 87/04/22 14:34:17 dc 2 1 c AUTO NULL DELTA e s 00011/00000/00000 d D 1.1 87/04/22 14:33:24 dc 1 0 c Placed under source control - dc e u U f b f n t T I 1 D 7 /* " %W% %E% " */ E 7 I 7 D 8 #ident " %W% %E% " E 8 I 8 /* " %W% %E% " */ E 8 E 7 I 6 /* * usage: * #include * #include */ E 6 /* CONSTANTants for headwall clock board transaction codes */ D 5 CONSTANT(HWClockReadByte, HEX(0)) CONSTANT(HWClockWriteByte, HEX(1)) CONSTANT(HWClockGetDate, HEX(2)) CONSTANT(HWClockSetDate, HEX(3)) CONSTANT(HWClockBootSlow, HEX(4)) CONSTANT(HWClockBootFast, HEX(5)) CONSTANT(HWClockGetTable, HEX(6)) CONSTANT(HWClockSetTable, HEX(7)) CONSTANT(HWClockDeath, HEX(8)) E 5 I 5 #define HWClockReadByte 0 #define HWClockWriteByte 1 #define HWClockGetDate 2 #define HWClockSetDate 3 #define HWClockBootSlow 4 #define HWClockBootFast 5 #define HWClockGetTable 6 #define HWClockSetTable 7 #define HWClockDeath 8 E 5 E 1 h16441 s 00001/00001/00033 d D 4.4 87/05/17 17:53:54 build 7 6 c changed #idents back again. -mkm e s 00001/00001/00033 d D 4.3 87/05/14 16:36:13 build 6 5 c removed old SCCS strings and inserted #ident BB e s 00019/00001/00015 d D 4.2 87/05/08 16:31:35 dc 5 4 c dc - Add Headwall clock function and rounding mode definitions e s 00000/00000/00016 d D 4.1 87/04/29 14:24:33 dc 4 3 c rolled rev to -r4 /dc e s 00000/00000/00016 d D 3.1 87/04/29 14:24:33 dc 3 2 c AUTO NULL DELTA e s 00000/00000/00016 d D 2.1 87/04/29 14:24:33 dc 2 1 c AUTO NULL DELTA e s 00016/00000/00000 d D 1.1 87/04/29 14:24:20 dc 1 0 c Placed under source control - dc e u U f b f n t T I 1 D 6 /* " %W% %E% " */ E 6 I 6 D 7 #ident " %W% %E% " E 7 I 7 /* " %W% %E% " */ E 7 E 6 /* * Arguments to the sysridge system call. * First argument is always a code describing which action is * desired. Further arguments vary according to the requested D 5 * function. E 5 I 5 * function. The prefix for all codes herein is 'SR', followed * by 'G' (for Get), 'S' (for Set), or 'F' (for Function), followed * by '_'. The remainder should be as descriptive as possible. E 5 */ /* * The following functions accept a pointer to an int as their second arg. * The desired quantity is returned to user space at that address. */ #define SRG_HWFEATURES 0 /* Get hardware feature test bits */ #define SRG_MCVERSION 1 /* Get microcode version number */ #define SRG_MACHINEID 2 /* Get machine id */ #define SRG_LOADENABLE 3 /* Get state of load enable switch/flag */ I 5 /* * Headwall clock function access. * arg1 = SRF_HWCLOCK * arg2 = cmd (see ) * arg3 = out arg (see ) * arg4 = length (see ) * arg5 = * in arg (see ) */ #define SRF_HWCLOCK 4 /* Do headwall clock sub-command */ /* * Floating point rounding mode manipulation */ #define SRG_FPROUND 5 /* Get current rounding modes (arg2 is * int) */ #define SRS_FPROUND 6 /* Set current rounding modes (arg2 is int) */ E 5 E 1 h43064 s 00001/00001/00001 d D 1.4 87/05/17 17:53:55 build 4 3 c changed #idents back again. -mkm e s 00001/00001/00001 d D 1.3 87/05/14 16:36:23 build 3 2 c removed old SCCS strings and inserted #ident BB e s 00000/00002/00002 d D 1.2 87/05/08 14:44:51 dc 2 1 c dc - Convert CONST to #define e s 00004/00000/00000 d D 1.1 87/04/24 07:29:14 dc 1 0 c Placed under source control - dc e u U f b f n t T I 1 D 3 /* "%W% %E%" */ E 3 I 3 D 4 #ident " %W% %E% " E 4 I 4 /* " %W% %E% " */ E 4 E 3 D 2 /* unfortunately, this definition of 'constant' requires TWO passes thru cpp */ #define CONSTANT(name,val) #define name val E 2 #define HEX(val) 0x/**/val E 1 h56995 s 00001/00001/00010 d D 4.4 87/05/17 17:53:56 build 7 6 c changed #idents back again. -mkm e s 00001/00001/00010 d D 4.3 87/05/14 16:36:32 build 6 5 c removed old SCCS strings and inserted #ident BB e s 00002/00002/00009 d D 4.2 87/05/11 08:37:51 dc 5 4 c e s 00000/00000/00011 d D 4.1 87/05/11 08:14:06 dc 4 3 c rolled rev to -r4 /dc e s 00000/00000/00011 d D 3.1 87/05/11 08:14:06 dc 3 2 c AUTO NULL DELTA e s 00000/00000/00011 d D 2.1 87/05/11 08:14:06 dc 2 1 c AUTO NULL DELTA e s 00011/00000/00000 d D 1.1 87/05/11 08:13:55 dc 1 0 c Placed under source control - dc e u U f b f n t T I 1 D 6 /* " %W% %E% " */ E 6 I 6 D 7 #ident " %W% %E% " E 7 I 7 /* " %W% %E% " */ E 7 E 6 /* * 'type' and enumeration of ieee floating point rounding modes */ D 5 typedef fp_rnd int; E 5 I 5 typedef int fp_rnd; E 5 #define FP_RN 0 #define FP_RP 1 #define FP_RM 2 D 5 #define FP_Rz 3 E 5 I 5 #define FP_RZ 3 E 5 E 1 <.R..=s.if.c>s.raw_cb.c?s.raw_usrreq.c@s.route.cAs.af.cBs.MakefileCLIBN.ah50503 s 00001/00006/00313 d D 4.7 87/05/14 16:36:59 build 11 10 c removed old SCCS strings and inserted #ident BB e s 00001/00001/00318 d D 4.6 87/05/07 19:02:23 van 10 9 c van - move defsocket.h back to /usr/include/sys e s 00002/00002/00317 d D 4.5 87/04/30 18:51:03 van 9 8 c van - moved net and netinet includes e s 00004/00004/00315 d D 4.4 87/04/29 16:39:11 van 8 7 c van - moved ucb networking includes to INCUCB e s 00011/00011/00308 d D 4.3 87/04/15 17:54:44 dc 7 6 c dc - changed #include "sys/..." to #include e s 00001/00001/00318 d D 4.2 87/04/08 19:45:42 van 6 5 c van - Don't trash the interface name in ioctl as a side effect c of ifunit. It breaks ifconfig. e s 00000/00000/00319 d D 4.1 87/02/20 13:36:44 build 5 4 c rolled rev to -r4 /dc e s 00000/00000/00319 d D 3.1 87/01/19 09:27:59 build 4 3 c rolled rev to -r3 /dc e s 00000/00000/00319 d D 2.1 87/01/19 09:27:59 build 3 2 c AUTO NULL DELTA e s 00001/00000/00318 d D 1.2 87/01/16 10:23:09 build 2 1 c add ident string /dc e s 00318/00000/00000 d D 1.1 87/01/09 17:48:19 build 1 0 c Placed under source control - dc e u U f b f n t T I 2 D 11 /* "%W% %E%" */ E 2 I 1 static char sccsid[] = "@(#)Fri Apr 25 09:52:34 EET 1986~ BULL-SEMS V21 net/if" ; /* @(#) Gipsi SPIX+SOCKET net/if.c 1.1 85/05/02 * 4.2bsd if.c 6.2 83/09/27 * renomme hz --> HZ */ E 11 I 11 #ident " %W% %E% " E 11 D 7 #include "sys/defsocket.h" /* SOC sysV */ #include "sys/param.h" #include "sys/types.h" /* SOC sysV */ #include "sys/signal.h" /* SOC sysV */ #include "sys/errno.h" /* SOC sysV */ #include "sys/systm.h" #include "sys/socket.h" #include "sys/protosw.h" #include "sys/dir.h" #include "sys/user.h" #include "sys/bsdioctl.h" E 7 I 7 D 8 #include /* SOC sysV */ E 8 I 8 D 10 #include "sys/defsocket.h" /* SOC sysV */ E 10 I 10 #include /* SOC sysV */ E 10 E 8 #include #include /* SOC sysV */ #include /* SOC sysV */ #include /* SOC sysV */ #include D 8 #include #include E 8 I 8 #include "sys/socket.h" #include "sys/protosw.h" E 8 #include #include D 8 #include E 8 I 8 #include "sys/bsdioctl.h" E 8 E 7 D 9 #include "if.h" #include "af.h" E 9 I 9 #include "net/if.h" #include "net/af.h" E 9 #ifdef IF_GIP extern struct il_softc il_softc[]; #endif int ifqmaxlen = IFQ_MAXLEN; /* * Network interface utility routines. * * Routines with if_ifwith* names take sockaddr *'s as * parameters. Other routines take value parameters, * e.g. if_ifwithnet takes the network number. */ ifinit() { register struct ifnet *ifp; for (ifp = ifnet; ifp; ifp = ifp->if_next) if (ifp->if_init) { (*ifp->if_init)(ifp->if_unit); if (ifp->if_snd.ifq_maxlen == 0) ifp->if_snd.ifq_maxlen = ifqmaxlen; } if_slowtimo(); } #ifdef notdefvax /* * Call each interface on a Unibus reset. */ ifubareset(uban) int uban; { register struct ifnet *ifp; for (ifp = ifnet; ifp; ifp = ifp->if_next) if (ifp->if_reset) (*ifp->if_reset)(ifp->if_unit, uban); } #endif /* * Attach an interface to the * list of "active" interfaces. */ if_attach(ifp) struct ifnet *ifp; { register struct ifnet **p = &ifnet; while (*p) p = &((*p)->if_next); *p = ifp; } /* * Locate an interface based on a complete address. */ /*ARGSUSED*/ struct ifnet * if_ifwithaddr(addr) struct sockaddr *addr; { register struct ifnet *ifp; #define equal(a1, a2) \ (bcmp((caddr_t)((a1)->sa_data), (caddr_t)((a2)->sa_data), 14) == 0) for (ifp = ifnet; ifp; ifp = ifp->if_next) { if (ifp->if_addr.sa_family != addr->sa_family) continue; if (equal(&ifp->if_addr, addr)) break; if ((ifp->if_flags & IFF_BROADCAST) && equal(&ifp->if_broadaddr, addr)) break; } return (ifp); } /* * Find an interface on a specific network. If many, choice * is first found. */ struct ifnet * if_ifwithnet(addr) register struct sockaddr *addr; { register struct ifnet *ifp; register u_int af = addr->sa_family; register int (*netmatch)(); if (af >= AF_MAX) return (0); netmatch = afswitch[af].af_netmatch; for (ifp = ifnet; ifp; ifp = ifp->if_next) { if (af != ifp->if_addr.sa_family) continue; if ((*netmatch)(addr, &ifp->if_addr)) break; } return (ifp); } /* * As above, but parameter is network number. */ struct ifnet * if_ifonnetof(net) register int net; { register struct ifnet *ifp; for (ifp = ifnet; ifp; ifp = ifp->if_next) if (ifp->if_net == net) break; return (ifp); } /* * Find an interface using a specific address family */ struct ifnet * if_ifwithaf(af) register int af; { register struct ifnet *ifp; for (ifp = ifnet; ifp; ifp = ifp->if_next) if (ifp->if_addr.sa_family == af) break; return (ifp); } /* * Mark an interface down and notify protocols of * the transition. * NOTE: must be called at splnet or eqivalent. */ if_down(ifp) register struct ifnet *ifp; { ifp->if_flags &= ~IFF_UP; pfctlinput(PRC_IFDOWN, (caddr_t)&ifp->if_addr); } /* * Handle interface watchdog timer routines. Called * from softclock, we decrement timers (if set) and * call the appropriate interface routine on expiration. */ if_slowtimo() { register struct ifnet *ifp; for (ifp = ifnet; ifp; ifp = ifp->if_next) { if (ifp->if_timer == 0 || --ifp->if_timer) continue; if (ifp->if_watchdog) (*ifp->if_watchdog)(ifp->if_unit); } timeout(if_slowtimo, (caddr_t)0, HZ / IFNET_SLOWHZ); } /* * Map interface name to * interface structure pointer. */ struct ifnet * ifunit(name) register char *name; { register char *cp; register struct ifnet *ifp; int unit; for (cp = name; cp < name + IFNAMSIZ && *cp; cp++) if (*cp >= '0' && *cp <= '9') break; if (*cp == '\0' || cp == name + IFNAMSIZ) return ((struct ifnet *)0); D 6 unit = *cp - '0', *cp = 0; E 6 I 6 unit = *cp - '0'; E 6 for (ifp = ifnet; ifp; ifp = ifp->if_next) { if (bcmp(ifp->if_name, name, (unsigned)(cp - name))) continue; if (unit == ifp->if_unit) break; } return (ifp); } /* * Interface ioctls. */ ifioctl(cmd, data) int cmd; caddr_t data; { register struct ifnet *ifp; register struct ifreq *ifr; switch (cmd) { case SIOCGIFCONF: return (ifconf(cmd, data)); case SIOCSIFADDR: case SIOCSIFFLAGS: case SIOCSIFDSTADDR: if (!suser()) return (u.u_error); break; } ifr = (struct ifreq *)data; ifp = ifunit(ifr->ifr_name); if (ifp == 0) return (ENXIO); switch (cmd) { case SIOCGIFADDR: ifr->ifr_addr = ifp->if_addr; #ifdef IF_GIP #define LONET 127 /* SMX */ if(ifp->if_net != LONET) /* SMX */ ilcopyethaddr(ifp->if_unit,ifr->etheraddr); else bzero(ifr->etheraddr, 6); #endif break; case SIOCGIFDSTADDR: if ((ifp->if_flags & IFF_POINTOPOINT) == 0) return (EINVAL); ifr->ifr_dstaddr = ifp->if_dstaddr; break; case SIOCGIFFLAGS: ifr->ifr_flags = ifp->if_flags; break; case SIOCSIFFLAGS: if (ifp->if_flags & IFF_UP && (ifr->ifr_flags & IFF_UP) == 0) { int s = splimp(); if_down(ifp); /* * SEMS: * Modif pour invalider l'interface sur "ifconfig down". * Appel de la routine ioctl pour deselecter l'interface * et liberer les ressources liees a l'interface Ethernet. * Envoi d'un UCB de deselection. */ (*ifp->if_ioctl)(ifp, PRC_IFDOWN, 0); splx(s); } ifp->if_flags = ifr->ifr_flags; break; default: if (ifp->if_ioctl == 0) return (EOPNOTSUPP); return ((*ifp->if_ioctl)(ifp, cmd, data)); } return (0); } /* * Return interface configuration * of system. List may be used * in later ioctl's (above) to get * other information. */ /*ARGSUSED*/ ifconf(cmd, data) int cmd; caddr_t data; { register struct ifconf *ifc = (struct ifconf *)data; register struct ifnet *ifp = ifnet; register char *cp, *ep; struct ifreq ifr, *ifrp; int space = ifc->ifc_len, error = 0; ifrp = ifc->ifc_req; ep = ifr.ifr_name + sizeof (ifr.ifr_name) - 2; for (; space > sizeof (ifr) && ifp; ifp = ifp->if_next) { bcopy(ifp->if_name, ifr.ifr_name, sizeof (ifr.ifr_name) - 2); for (cp = ifr.ifr_name; cp < ep && *cp; cp++) ; *cp++ = '0' + ifp->if_unit; *cp = '\0'; ifr.ifr_addr = ifp->if_addr; error = copyout((caddr_t)&ifr, (caddr_t)ifrp, sizeof (ifr)); if (error) break; space -= sizeof (ifr), ifrp++; } ifc->ifc_len -= space; return (error); } E 1 h05225 s 00001/00001/00161 d D 4.7 87/05/20 13:24:51 brian 11 10 c mbuf.h put back on system search path BB e s 00001/00005/00161 d D 4.6 87/05/14 16:37:17 build 10 9 c removed old SCCS strings and inserted #ident BB e s 00001/00001/00165 d D 4.5 87/05/07 19:02:28 van 9 8 c van - move defsocket.h back to /usr/include/sys e s 00004/00004/00162 d D 4.4 87/04/30 18:51:05 van 8 7 c van - moved net and netinet includes e s 00004/00004/00162 d D 4.3 87/04/29 16:39:13 van 7 6 c van - moved ucb networking includes to INCUCB e s 00008/00008/00158 d D 4.2 87/04/15 17:54:53 dc 6 5 c dc - changed #include "sys/..." to #include e s 00000/00000/00166 d D 4.1 87/02/20 13:36:50 build 5 4 c rolled rev to -r4 /dc e s 00000/00000/00166 d D 3.1 87/01/19 09:28:04 build 4 3 c rolled rev to -r3 /dc e s 00000/00000/00166 d D 2.1 87/01/19 09:28:04 build 3 2 c AUTO NULL DELTA e s 00001/00000/00165 d D 1.2 87/01/16 10:23:16 build 2 1 c add ident string /dc e s 00165/00000/00000 d D 1.1 87/01/09 17:48:20 build 1 0 c Placed under source control - dc e u U f b f n t T I 2 D 10 /* "%W% %E%" */ E 2 I 1 static char sccsid[] = "@(#)Fri Apr 25 09:52:44 EET 1986~ BULL-SEMS V21 net/raw_cb" ; /* @(#) Gipsi SPIX+SOCKET net/raw_cb.c 1.1 85/05/02 * 4.2bsd raw_cb.c 6.1 83/07/29 */ E 10 I 10 #ident " %W% %E% " E 10 D 6 #include "sys/defsocket.h" /* SOC sysV */ #include "sys/param.h" #include "sys/types.h" /* SOC sysv */ #include "sys/systm.h" #include "sys/mbuf.h" #include "sys/socket.h" #include "sys/socketvar.h" #include "sys/errno.h" E 6 I 6 D 7 #include /* SOC sysV */ E 7 I 7 D 9 #include "sys/defsocket.h" /* SOC sysV */ E 9 I 9 #include /* SOC sysV */ E 9 E 7 #include #include /* SOC sysv */ #include D 7 #include #include #include E 7 I 7 D 11 #include "sys/mbuf.h" E 11 I 11 #include E 11 #include "sys/socket.h" #include "sys/socketvar.h" E 7 #include E 6 D 8 #include "if.h" #include "route.h" #include "raw_cb.h" E 8 I 8 #include "net/if.h" #include "net/route.h" #include "net/raw_cb.h" E 8 #ifdef INET D 8 #include "../netinet/in.h" E 8 I 8 #include "netinet/in.h" E 8 #endif #ifdef PUP #include "../netpup/pup.h" #endif #ifdef notdefvax #include "../vax/mtpr.h" #endif /* * Routines to manage the raw protocol control blocks. * * TODO: * hash lookups by protocol family/protocol + address family * take care of unique address problems per AF? * redo address binding to allow wildcards */ /* * Allocate a control block and a nominal amount * of buffer space for the socket. */ raw_attach(so) register struct socket *so; { struct mbuf *m; register struct rawcb *rp; m = m_getclr(M_DONTWAIT, MT_PCB); if (m == 0) return (ENOBUFS); if (sbreserve(&so->so_snd, RAWSNDQ) == 0) goto bad; if (sbreserve(&so->so_rcv, RAWRCVQ) == 0) goto bad2; rp = mtod(m, struct rawcb *); rp->rcb_socket = so; insque(rp, &rawcb); so->so_pcb = (caddr_t)rp; rp->rcb_pcb = 0; return (0); bad2: sbrelease(&so->so_snd); bad: (void) m_free(m); return (ENOBUFS); } /* * Detach the raw connection block and discard * socket resources. */ raw_detach(rp) register struct rawcb *rp; { struct socket *so = rp->rcb_socket; so->so_pcb = 0; sofree(so); remque(rp); m_freem(dtom(rp)); } /* * Disconnect and possibly release resources. */ raw_disconnect(rp) struct rawcb *rp; { rp->rcb_flags &= ~RAW_FADDR; if (rp->rcb_socket->so_state & SS_NOFDREF) raw_detach(rp); } raw_bind(so, nam) register struct socket *so; struct mbuf *nam; { struct sockaddr *addr = mtod(nam, struct sockaddr *); register struct rawcb *rp; if (ifnet == 0) return (EADDRNOTAVAIL); /* BEGIN DUBIOUS */ /* * Should we verify address not already in use? * Some say yes, others no. */ switch (addr->sa_family) { #ifdef INET case AF_IMPLINK: case AF_INET: { if (((struct sockaddr_in *)addr)->sin_addr.s_addr && if_ifwithaddr(addr) == 0) return (EADDRNOTAVAIL); break; } #endif #ifdef PUP /* * Curious, we convert PUP address format to internet * to allow us to verify we're asking for an Ethernet * interface. This is wrong, but things are heavily * oriented towards the internet addressing scheme, and * converting internet to PUP would be very expensive. */ case AF_PUP: { struct sockaddr_pup *spup = (struct sockaddr_pup *)addr; struct sockaddr_in inpup; bzero((caddr_t)&inpup, (unsigned)sizeof(inpup)); inpup.sin_family = AF_INET; inpup.sin_addr = if_makeaddr(spup->spup_net, spup->spup_host); if (inpup.sin_addr.s_addr && if_ifwithaddr((struct sockaddr *)&inpup) == 0) return (EADDRNOTAVAIL); break; } #endif default: return (EAFNOSUPPORT); } /* END DUBIOUS */ rp = sotorawcb(so); bcopy((caddr_t)addr, (caddr_t)&rp->rcb_laddr, sizeof (*addr)); rp->rcb_flags |= RAW_LADDR; return (0); } /* * Associate a peer's address with a * raw connection block. */ raw_connaddr(rp, nam) struct rawcb *rp; struct mbuf *nam; { struct sockaddr *addr = mtod(nam, struct sockaddr *); bcopy((caddr_t)addr, (caddr_t)&rp->rcb_faddr, sizeof(*addr)); rp->rcb_flags |= RAW_FADDR; } E 1 h12618 s 00001/00001/00338 d D 4.7 87/05/20 13:25:11 brian 11 10 c mbuf.h put back on system search path BB e s 00002/00003/00337 d D 4.6 87/05/14 16:37:42 build 10 9 c removed old SCCS strings and inserted #ident BB e s 00001/00001/00339 d D 4.5 87/05/07 19:02:31 van 9 8 c van - move defsocket.h back to /usr/include/sys e s 00004/00004/00336 d D 4.4 87/04/30 18:51:06 van 8 7 c van - moved net and netinet includes e s 00005/00005/00335 d D 4.3 87/04/29 16:39:15 van 7 6 c van - moved ucb networking includes to INCUCB e s 00008/00008/00332 d D 4.2 87/04/15 17:55:02 dc 6 5 c dc - changed #include "sys/..." to #include e s 00000/00000/00340 d D 4.1 87/02/20 13:36:58 build 5 4 c rolled rev to -r4 /dc e s 00000/00000/00340 d D 3.1 87/01/19 09:28:11 build 4 3 c rolled rev to -r3 /dc e s 00000/00000/00340 d D 2.1 87/01/19 09:28:11 build 3 2 c AUTO NULL DELTA e s 00001/00000/00339 d D 1.2 87/01/16 10:23:25 build 2 1 c add ident string /dc e s 00339/00000/00000 d D 1.1 87/01/09 17:48:21 build 1 0 c Placed under source control - dc e u U f b f n t T I 2 D 10 /* "%W% %E%" */ E 2 I 1 static char sccsid[] = "@(#)Fri Apr 25 09:52:53 EET 1986~ BULL-SEMS V21 net/raw_usrreq" ; /* @(#) Gipsi SPIX+SOCKET net/raw_usrreq.c 1.1 85/05/02 E 10 I 10 #ident " %W% %E% " /* Gipsi SPIX+SOCKET net/raw_usrreq.c 1.1 85/05/02 E 10 * 4.2bsd raw_usrreq.c 6.1 83/07/29 * *MODIFIE: Conditionnement par INET des appels a rtalloc rtfree. * Necessaire pour SMRPC ou l'on a supprime le routage. */ D 6 #include "sys/defsocket.h" /* SOC sysV */ #include "sys/param.h" #include "sys/types.h" /* SOC sysV */ #include "sys/mbuf.h" #include "sys/protosw.h" #include "sys/socket.h" #include "sys/socketvar.h" #include "sys/errno.h" E 6 I 6 D 7 #include /* SOC sysV */ E 7 I 7 D 9 #include "sys/defsocket.h" /* SOC sysV */ E 9 I 9 #include /* SOC sysV */ E 9 E 7 #include #include /* SOC sysV */ D 7 #include #include #include #include E 7 I 7 D 11 #include "sys/mbuf.h" E 11 I 11 #include E 11 #include "sys/protosw.h" #include "sys/socket.h" #include "sys/socketvar.h" E 7 #include E 6 D 8 #include "if.h" #include "route.h" #include "netisr.h" #include "raw_cb.h" E 8 I 8 #include "net/if.h" #include "net/route.h" #include "net/netisr.h" #include "net/raw_cb.h" E 8 #ifdef notdefvax #include "../vax/mtpr.h" #endif #define NETISR_RAW 0 /* jm */ /* * Initialize raw connection block q. */ raw_init() { rawcb.rcb_next = rawcb.rcb_prev = &rawcb; rawintrq.ifq_maxlen = IFQ_MAXLEN; } /* * Raw protocol interface. */ raw_input(m0, proto, src, dst) struct mbuf *m0; struct sockproto *proto; struct sockaddr *src, *dst; { register struct mbuf *m; struct raw_header *rh; int s; /* * Rip off an mbuf for a generic header. */ m = m_get(M_DONTWAIT, MT_HEADER); if (m == 0) { m_freem(m0); return; } m->m_next = m0; m->m_len = sizeof(struct raw_header); rh = mtod(m, struct raw_header *); rh->raw_dst = *dst; rh->raw_src = *src; rh->raw_proto = *proto; /* * Header now contains enough info to decide * which socket to place packet in (if any). * Queue it up for the raw protocol process * running at software interrupt level. */ s = splimp(); if (IF_QFULL(&rawintrq)) m_freem(m); else IF_ENQUEUE(&rawintrq, m); splx(s); #ifdef INET rawintr(); /* jm */ /* schednetisr(NETISR_RAW); */ #endif } /* * Raw protocol input routine. Process packets entered * into the queue at interrupt time. Find the socket * associated with the packet(s) and move them over. If * nothing exists for this packet, drop it. */ rawintr() { int s; struct mbuf *m; register struct rawcb *rp; register struct protosw *lproto; register struct raw_header *rh; struct socket *last; next: s = splimp(); IF_DEQUEUE(&rawintrq, m); splx(s); if (m == 0) return; rh = mtod(m, struct raw_header *); last = 0; for (rp = rawcb.rcb_next; rp != &rawcb; rp = rp->rcb_next) { lproto = rp->rcb_socket->so_proto; if (lproto->pr_family != rh->raw_proto.sp_family) continue; if (lproto->pr_protocol && lproto->pr_protocol != rh->raw_proto.sp_protocol) continue; /* * We assume the lower level routines have * placed the address in a canonical format * suitable for a structure comparison. */ #define equal(a1, a2) \ (bcmp((caddr_t)&(a1), (caddr_t)&(a2), sizeof (struct sockaddr)) == 0) if ((rp->rcb_flags & RAW_LADDR) && !equal(rp->rcb_laddr, rh->raw_dst)) continue; if ((rp->rcb_flags & RAW_FADDR) && !equal(rp->rcb_faddr, rh->raw_src)) continue; if (last) { struct mbuf *n; if ((n = m_copy(m->m_next, 0, (int)M_COPYALL)) == 0) goto nospace; if (sbappendaddr(&last->so_rcv, &rh->raw_src, n, (struct mbuf *)0) == 0) { /* should notify about lost packet */ m_freem(n); goto nospace; } sorwakeup(last); } nospace: last = rp->rcb_socket; } if (last) { m = m_free(m); /* header */ if (sbappendaddr(&last->so_rcv, &rh->raw_src, m, (struct mbuf *)0) == 0) goto drop; sorwakeup(last); goto next; } drop: m_freem(m); goto next; } /*ARGSUSED*/ raw_ctlinput(cmd, arg) int cmd; caddr_t arg; { if (cmd < 0 || cmd > PRC_NCMDS) return; /* INCOMPLETE */ } /*ARGSUSED*/ raw_usrreq(so, req, m, nam, rights) struct socket *so; int req; struct mbuf *m, *nam, *rights; { register struct rawcb *rp = sotorawcb(so); register int error = 0; if (rights && rights->m_len) { error = EOPNOTSUPP; goto release; } if (rp == 0 && req != PRU_ATTACH) { error = EINVAL; goto release; } switch (req) { /* * Allocate a raw control block and fill in the * necessary info to allow packets to be routed to * the appropriate raw interface routine. */ case PRU_ATTACH: if ((so->so_state & SS_PRIV) == 0) { error = EACCES; break; } if (rp) { error = EINVAL; break; } error = raw_attach(so); break; /* * Destroy state just before socket deallocation. * Flush data or not depending on the options. */ case PRU_DETACH: if (rp == 0) { error = ENOTCONN; break; } raw_detach(rp); break; /* * If a socket isn't bound to a single address, * the raw input routine will hand it anything * within that protocol family (assuming there's * nothing else around it should go to). */ case PRU_CONNECT: if (rp->rcb_flags & RAW_FADDR) { error = EISCONN; break; } raw_connaddr(rp, nam); soisconnected(so); break; case PRU_CONNECT2: error = EOPNOTSUPP; goto release; case PRU_BIND: if (rp->rcb_flags & RAW_LADDR) { error = EINVAL; /* XXX */ break; } error = raw_bind(so, nam); break; case PRU_DISCONNECT: if ((rp->rcb_flags & RAW_FADDR) == 0) { error = ENOTCONN; break; } #ifdef INET if (rp->rcb_route.ro_rt) rtfree(rp->rcb_route.ro_rt); #endif raw_disconnect(rp); soisdisconnected(so); break; /* * Mark the connection as being incapable of further input. */ case PRU_SHUTDOWN: socantsendmore(so); break; /* * Ship a packet out. The appropriate raw output * routine handles any massaging necessary. */ case PRU_SEND: if (nam) { if (rp->rcb_flags & RAW_FADDR) { error = EISCONN; break; } raw_connaddr(rp, nam); } else if ((rp->rcb_flags & RAW_FADDR) == 0) { error = ENOTCONN; break; } /* * Check for routing. If new foreign address, or * no route presently in use, try to allocate new * route. On failure, just hand packet to output * routine anyway in case it can handle it. */ #ifdef INET /* modif pour supprimer le routage pour la version SMRPC */ if ((rp->rcb_flags & RAW_DONTROUTE) == 0) if (!equal(rp->rcb_faddr, rp->rcb_route.ro_dst) || rp->rcb_route.ro_rt == 0) { if (rp->rcb_route.ro_rt) rtfree(rp->rcb_route.ro_rt); rp->rcb_route.ro_dst = rp->rcb_faddr; rtalloc(&rp->rcb_route); } #endif error = (*so->so_proto->pr_output)(m, so); m = NULL; if (nam) rp->rcb_flags &= ~RAW_FADDR; break; case PRU_ABORT: raw_disconnect(rp); sofree(so); soisdisconnected(so); break; case PRU_CONTROL: m = NULL; error = EOPNOTSUPP; break; /* * Not supported. */ case PRU_ACCEPT: case PRU_RCVD: case PRU_SENSE: case PRU_RCVOOB: case PRU_SENDOOB: error = EOPNOTSUPP; break; case PRU_SOCKADDR: bcopy((caddr_t)&rp->rcb_laddr, mtod(nam, caddr_t), sizeof (struct sockaddr)); nam->m_len = sizeof (struct sockaddr); break; case PRU_PEERADDR: bcopy((caddr_t)&rp->rcb_faddr, mtod(nam, caddr_t), sizeof (struct sockaddr)); nam->m_len = sizeof (struct sockaddr); break; default: panic("raw_usrreq"); } release: if (m != NULL) m_freem(m); return (error); } E 1 h22384 s 00001/00001/00310 d D 4.7 87/05/20 13:25:28 brian 11 10 c mbuf.h put back on system search path BB e s 00002/00003/00309 d D 4.6 87/05/14 16:37:59 build 10 9 c removed old SCCS strings and inserted #ident BB e s 00001/00001/00311 d D 4.5 87/05/07 19:02:34 van 9 8 c van - move defsocket.h back to /usr/include/sys e s 00003/00003/00309 d D 4.4 87/04/30 18:51:08 van 8 7 c van - moved net and netinet includes e s 00005/00005/00307 d D 4.3 87/04/29 16:39:17 van 7 6 c van - moved ucb networking includes to INCUCB e s 00012/00012/00300 d D 4.2 87/04/15 17:55:11 dc 6 5 c dc - changed #include "sys/..." to #include e s 00000/00000/00312 d D 4.1 87/02/20 13:37:04 build 5 4 c rolled rev to -r4 /dc e s 00000/00000/00312 d D 3.1 87/01/19 09:28:15 build 4 3 c rolled rev to -r3 /dc e s 00000/00000/00312 d D 2.1 87/01/19 09:28:15 build 3 2 c AUTO NULL DELTA e s 00001/00000/00311 d D 1.2 87/01/16 10:23:32 build 2 1 c add ident string /dc e s 00311/00000/00000 d D 1.1 87/01/09 17:48:23 build 1 0 c Placed under source control - dc e u U f b f n t T I 2 D 10 /* "%W% %E%" */ E 2 I 1 static char sccsid[] = "@(#)Fri Apr 25 09:53:22 EET 1986~ BULL-SEMS V21 net/route" ; /* @(#) Gipsi SPIX+SOCKET net/route.c 1.1 85/05/02 E 10 I 10 #ident " %W% %E% " /* Gipsi SPIX+SOCKET net/route.c 1.1 85/05/02 E 10 * 4.2bsd route.c 6.2 83/10/20 *FAIRE: * A TESTER ou a remplacer par nop-route.c !!!! */ #ifdef SOCKET D 6 #include "sys/defsocket.h" /* SOC sysV */ #include "sys/param.h" #include "sys/types.h" /* SOC sysV */ #include "sys/signal.h" /* SOC sysV */ #include "sys/systm.h" #include "sys/mbuf.h" #include "sys/protosw.h" #include "sys/socket.h" #include "sys/dir.h" #include "sys/user.h" #include "sys/bsdioctl.h" #include "sys/errno.h" E 6 I 6 D 7 #include /* SOC sysV */ E 7 I 7 D 9 #include "sys/defsocket.h" /* SOC sysV */ E 9 I 9 #include /* SOC sysV */ E 9 E 7 #include #include /* SOC sysV */ #include /* SOC sysV */ #include D 7 #include #include #include E 7 I 7 D 11 #include "sys/mbuf.h" E 11 I 11 #include E 11 #include "sys/protosw.h" #include "sys/socket.h" E 7 #include #include D 7 #include E 7 I 7 #include "sys/bsdioctl.h" E 7 #include E 6 D 8 #include "if.h" #include "af.h" #include "route.h" E 8 I 8 #include "net/if.h" #include "net/af.h" #include "net/route.h" E 8 int rttrash; /* routes not in table but not freed */ struct sockaddr wildcard; /* zero valued cookie for wildcard searches */ /* * Packet routing routines. */ rtalloc(ro) register struct route *ro; { register struct rtentry *rt; register struct mbuf *m; register u_long hash; struct sockaddr *dst = &ro->ro_dst; int (*match)(), doinghost; struct afhash h; u_int af = dst->sa_family; struct rtentry *rtmin; struct mbuf **table; if (ro->ro_rt && ro->ro_rt->rt_ifp) /* XXX */ return; if (af >= AF_MAX) return; (*afswitch[af].af_hash)(dst, &h); rtmin = 0; match = afswitch[af].af_netmatch; hash = h.afh_hosthash, table = rthost, doinghost = 1; again: for (m = table[hash % RTHASHSIZ]; m; m = m->m_next) { rt = mtod(m, struct rtentry *); if (rt->rt_hash != hash) continue; if ((rt->rt_flags & RTF_UP) == 0 || (rt->rt_ifp->if_flags & IFF_UP) == 0) continue; if (doinghost) { if (bcmp((caddr_t)&rt->rt_dst, (caddr_t)dst, sizeof (*dst))) continue; } else { if (rt->rt_dst.sa_family != af || !(*match)(&rt->rt_dst, dst)) continue; } if (rtmin == 0 || rt->rt_use < rtmin->rt_use) rtmin = rt; } if (rtmin == 0 && doinghost) { doinghost = 0; hash = h.afh_nethash, table = rtnet; goto again; } /* * Check for wildcard gateway, by convention network 0. */ if (rtmin == 0 && dst != &wildcard) { dst = &wildcard, hash = 0; goto again; } ro->ro_rt = rtmin; if (rtmin == 0) { rtstat.rts_unreach++; return; } rtmin->rt_refcnt++; if (dst == &wildcard) rtstat.rts_wildcard++; } rtfree(rt) register struct rtentry *rt; { if (rt == 0) panic("rtfree"); rt->rt_refcnt--; if (rt->rt_refcnt == 0 && (rt->rt_flags&RTF_UP) == 0) { rttrash--; (void) m_free(dtom(rt)); } } /* * Force a routing table entry to the specified * destination to go through the given gateway. * Normally called as a result of a routing redirect * message from the network layer. * * N.B.: must be called at splnet or higher * * Should notify all parties with a reference to * the route that it's changed (so, for instance, * current round trip time estimates could be flushed), * but we have no back pointers at the moment. */ rtredirect(dst, gateway) struct sockaddr *dst, *gateway; { struct route ro; register struct rtentry *rt; /* verify the gateway is directly reachable */ if (if_ifwithnet(gateway) == 0) { rtstat.rts_badredirect++; return; } ro.ro_dst = *dst; ro.ro_rt = 0; rtalloc(&ro); rt = ro.ro_rt; /* * Create a new entry if we just got back a wildcard entry * or the the lookup failed. This is necessary for hosts * which use routing redirects generated by smart gateways * to dynamically build the routing tables. */ if (rt && (*afswitch[dst->sa_family].af_netmatch)(&wildcard, &rt->rt_dst)) { rtfree(rt); rt = 0; } if (rt == 0) { rtinit(dst, gateway, RTF_GATEWAY); rtstat.rts_dynamic++; return; } /* * Don't listen to the redirect if it's * for a route to an interface. */ if (rt->rt_flags & RTF_GATEWAY) { /* * Smash the current notion of the gateway to * this destination. This is probably not right, * as it's conceivable a flurry of redirects could * cause the gateway value to fluctuate wildly during * dynamic routing reconfiguration. */ rt->rt_gateway = *gateway; rtfree(rt); rtstat.rts_newgateway++; return; } } /* * Routing table ioctl interface. */ rtioctl(cmd, data) int cmd; caddr_t data; { if (cmd != SIOCADDRT && cmd != SIOCDELRT) return (EINVAL); if (!suser()) return (u.u_error); return (rtrequest(cmd, (struct rtentry *)data)); } /* * Carry out a request to change the routing table. Called by * interfaces at boot time to make their ``local routes'' known, * for ioctl's, and as the result of routing redirects. */ rtrequest(req, entry) int req; register struct rtentry *entry; { register struct mbuf *m, **mprev; register struct rtentry *rt; struct afhash h; int s, error = 0, (*match)(); u_int af; u_long hash; struct ifnet *ifp; af = entry->rt_dst.sa_family; if (af >= AF_MAX) return (EAFNOSUPPORT); (*afswitch[af].af_hash)(&entry->rt_dst, &h); if (entry->rt_flags & RTF_HOST) { hash = h.afh_hosthash; mprev = &rthost[hash % RTHASHSIZ]; } else { hash = h.afh_nethash; mprev = &rtnet[hash % RTHASHSIZ]; } match = afswitch[af].af_netmatch; s = spl7(); for (; m = *mprev; mprev = &m->m_next) { rt = mtod(m, struct rtentry *); if (rt->rt_hash != hash) continue; if (entry->rt_flags & RTF_HOST) { #define equal(a1, a2) \ (bcmp((caddr_t)(a1), (caddr_t)(a2), sizeof (struct sockaddr)) == 0) if (!equal(&rt->rt_dst, &entry->rt_dst)) continue; } else { if (rt->rt_dst.sa_family != entry->rt_dst.sa_family || (*match)(&rt->rt_dst, &entry->rt_dst) == 0) continue; } if (equal(&rt->rt_gateway, &entry->rt_gateway)) break; } switch (req) { case SIOCDELRT: if (m == 0) { error = ESRCH; goto bad; } *mprev = m->m_next; if (rt->rt_refcnt > 0) { rt->rt_flags &= ~RTF_UP; rttrash++; m->m_next = 0; } else (void) m_free(m); break; case SIOCADDRT: if (m) { error = EEXIST; goto bad; } ifp = if_ifwithaddr(&entry->rt_gateway); if (ifp == 0) { ifp = if_ifwithnet(&entry->rt_gateway); if (ifp == 0) { error = ENETUNREACH; goto bad; } } m = m_get(M_DONTWAIT, MT_RTABLE); if (m == 0) { error = ENOBUFS; goto bad; } *mprev = m; m->m_off = MMINOFF; m->m_len = sizeof (struct rtentry); rt = mtod(m, struct rtentry *); rt->rt_hash = hash; rt->rt_dst = entry->rt_dst; rt->rt_gateway = entry->rt_gateway; rt->rt_flags = RTF_UP | (entry->rt_flags & (RTF_HOST|RTF_GATEWAY)); rt->rt_refcnt = 0; rt->rt_use = 0; rt->rt_ifp = ifp; break; } bad: splx(s); return (error); } /* * Set up a routing table entry, normally * for an interface. */ rtinit(dst, gateway, flags) struct sockaddr *dst, *gateway; int flags; { struct rtentry route; int cmd; if (flags == -1) { cmd = (int)SIOCDELRT; flags = 0; } else { cmd = (int)SIOCADDRT; } bzero((caddr_t)&route, sizeof (route)); route.rt_dst = *dst; route.rt_gateway = *gateway; route.rt_flags = flags; (void) rtrequest(cmd, &route); } #endif /* SOCKET */ E 1 h05319 s 00001/00001/00057 d D 4.7 87/05/20 13:25:45 brian 11 10 c mbuf.h put back on system search path BB e s 00002/00003/00056 d D 4.6 87/05/14 16:38:18 build 10 9 c removed old SCCS strings and inserted #ident BB e s 00001/00001/00058 d D 4.5 87/05/07 19:02:20 van 9 8 c van - move defsocket.h back to /usr/include/sys e s 00001/00001/00058 d D 4.4 87/04/30 18:51:02 van 8 7 c van - moved net and netinet includes e s 00005/00005/00054 d D 4.3 87/04/29 16:39:19 van 7 6 c van - moved ucb networking includes to INCUCB e s 00007/00007/00052 d D 4.2 87/04/15 17:55:19 dc 6 5 c dc - changed #include "sys/..." to #include e s 00000/00000/00059 d D 4.1 87/02/20 13:37:12 build 5 4 c rolled rev to -r4 /dc e s 00000/00000/00059 d D 3.1 87/01/19 09:28:23 build 4 3 c rolled rev to -r3 /dc e s 00000/00000/00059 d D 2.1 87/01/19 09:28:23 build 3 2 c AUTO NULL DELTA e s 00001/00000/00058 d D 1.2 87/01/16 10:23:41 build 2 1 c add ident string /dc e s 00058/00000/00000 d D 1.1 87/01/09 17:48:18 build 1 0 c Placed under source control - dc e u U f b f n t T I 2 D 10 /* "%W% %E%" */ E 2 I 1 static char sccsid[] = "@(#)Fri Apr 25 09:52:24 EET 1986~ BULL-SEMS V21 net/af" ; /* @(#) Gipsi SPIX+SOCKET net/af.c 1.1 85/05/02 E 10 I 10 #ident " %W% %E% " /* Gipsi SPIX+SOCKET net/af.c 1.1 85/05/02 E 10 * d'apres 4.2bsd af.c 6.1 83/07/29 */ D 6 #include "sys/defsocket.h" /* SOC sysV */ #include "sys/param.h" #include "sys/types.h" /* SOC sysV */ #include "sys/mbuf.h" #include "sys/protosw.h" #include "sys/socket.h" #include "sys/socketvar.h" E 6 I 6 D 7 #include /* SOC sysV */ E 7 I 7 D 9 #include "sys/defsocket.h" /* SOC sysV */ E 9 I 9 #include /* SOC sysV */ E 9 E 7 #include #include /* SOC sysV */ D 7 #include #include #include #include E 7 I 7 D 11 #include "sys/mbuf.h" E 11 I 11 #include E 11 #include "sys/protosw.h" #include "sys/socket.h" #include "sys/socketvar.h" E 7 E 6 D 8 #include "af.h" E 8 I 8 #include "net/af.h" E 8 /* * Address family support routines */ int null_hash(), null_netmatch(); #define AFNULL \ { null_hash, null_netmatch } #ifdef INET extern int inet_hash(), inet_netmatch(); #define AFINET \ { inet_hash, inet_netmatch } #else #define AFINET AFNULL #endif #ifdef PUP extern int pup_hash(), pup_netmatch(); #define AFPUP \ { pup_hash, pup_netmatch } #else #define AFPUP AFNULL #endif struct afswitch afswitch[AF_MAX] = { AFNULL, AFNULL, AFINET, AFINET, AFPUP, AFNULL, AFNULL, AFNULL, AFNULL, AFNULL, AFNULL }; /*ARGSUSED*/ null_hash(addr, hp) struct sockaddr *addr; struct afhash *hp; { hp->afh_nethash = hp->afh_hosthash = 0; } /*ARGSUSED*/ null_netmatch(a1, a2) struct sockaddr *a1, *a2; { return (0); } E 1 h20509 s 00004/00004/00104 d D 4.12 87/05/20 13:56:09 brian 20 19 c Correction to last change BB e s 00004/00004/00104 d D 4.11 87/05/20 13:44:28 brian 19 18 c mbuf.h put back on system search path BB e s 00005/00005/00103 d D 4.10 87/05/07 19:02:14 van 18 17 c van - move defsocket.h back to /usr/include/sys e s 00001/00004/00107 d D 4.9 87/04/30 18:54:36 van 17 16 c van - remove references to local includes e s 00014/00014/00097 d D 4.8 87/04/30 18:51:00 van 16 15 c van - moved net and netinet includes e s 00023/00023/00088 d D 4.7 87/04/29 20:34:36 build 15 14 c van - sys added to INCUCB files e s 00001/00000/00110 d D 4.6 87/04/29 20:24:50 build 14 13 c van - added IFLAGS e s 00023/00023/00087 d D 4.5 87/04/29 16:39:10 van 13 12 c van - moved ucb networking includes to INCUCB e s 00002/00000/00108 d D 4.4 87/03/26 22:18:43 dc 12 11 c add all: entry e s 00001/00001/00107 d D 4.3 87/02/22 16:11:09 build 11 10 c change OPTION to DFLAGS /dc e s 00000/00003/00108 d D 4.2 87/02/22 09:37:45 build 10 9 c remove CC and CFLAGS definitions e s 00000/00000/00111 d D 4.1 87/02/20 13:37:09 build 9 8 c rolled rev to -r4 /dc e s 00000/00000/00111 d D 3.1 87/01/19 09:28:20 build 8 7 c rolled rev to -r3 /dc e s 00000/00000/00111 d D 2.1 87/01/19 09:28:20 build 7 6 c AUTO NULL DELTA e s 00001/00000/00110 d D 1.6 87/01/16 10:23:38 build 6 5 c add ident string /dc e s 00002/00000/00108 d D 1.5 87/01/13 11:19:48 build 5 4 c use rc instead of cc (suspect bugs in cc) e s 00004/00001/00104 d D 1.4 87/01/11 11:38:28 build 4 3 c add local .h files to clobber list e s 00004/00001/00101 d D 1.3 87/01/11 11:29:15 build 3 2 c add clobber entry e s 00052/00060/00050 d D 1.2 87/01/09 17:53:31 build 2 1 c add sccs control e s 00110/00000/00000 d D 1.1 87/01/09 17:48:28 build 1 0 c Placed under source control - dc e u U f b f n t T I 6 # "%W% %E%" E 6 I 1 # Gpsi SPIX+SOCKET @(#)net/Makefile 1.1 85/05/05 # pas d'options RT # ajout option SOCKET # VERSION= 10 I 14 IFLAGS= -I$(INCUCB) E 14 D 11 OPTION= -DSOCKET -DINET -Ddebug E 11 I 11 DFLAGS= -DSOCKET -DINET -Ddebug E 11 D 10 CFLAGS = -O -I$(SPX)/usr/include $(OPTION) I 5 # use 'newer' rc instead of cc compiler CC = rc E 10 E 5 # DEBUG is a flag for kernel debugging # OPTION is for options like MULTI, FS1k ... D 2 LIB= LIBN.a H = $(SPX)/usr/include/sys/ E 2 I 2 LIB = LIBN.a H = $(SPX)/usr/include/sys E 2 I 4 D 17 # headers which live here, but have 'real' copies in the SCCS files. HEADERS = af.h if.h netisr.h raw_cb.h route.h E 17 E 4 OBJECTS= $(LIB)(af.o)\ $(LIB)(if.o)\ $(LIB)(raw_cb.o)\ $(LIB)(raw_usrreq.o)\ $(LIB)(route.o) I 12 all: $(LIB) E 12 $(LIB): $(OBJECTS) D 2 .c.a: rc -c $(CFLAGS) $< ar r $(LIB) $*.o rm -f $*.o E 2 clean: D 3 rm -f *.o $(LIB) core E 3 I 3 D 4 rm -f *.o core E 4 I 4 D 17 rm -f *.o core $(HEADERS) E 17 I 17 rm -f *.o core E 17 E 4 clobber: clean rm -f $(LIB) E 3 D 2 print: pr -n *.c *.h *ake* |lp -tNET E 2 $(LIB)(af.o):\ D 2 $Hdefsocket.h\ $Htypes.h\ $Herrno.h\ $Hsignal.h\ $Hparam.h\ $Hmbuf.h\ $Hprotosw.h\ $Hsocket.h\ $Hsocketvar.h\ E 2 I 2 D 13 $H/defsocket.h\ E 13 I 13 D 15 $(INCUCB)/defsocket.h\ E 15 I 15 D 18 $(INCUCB)/sys/defsocket.h\ E 18 I 18 $H/defsocket.h\ E 18 E 15 E 13 $H/types.h\ $H/errno.h\ $H/signal.h\ $H/param.h\ D 13 $H/mbuf.h\ $H/protosw.h\ $H/socket.h\ $H/socketvar.h\ E 13 I 13 D 15 $(INCUCB)/mbuf.h\ $(INCUCB)/protosw.h\ $(INCUCB)/socket.h\ $(INCUCB)/socketvar.h\ E 15 I 15 D 19 $(INCUCB)/sys/mbuf.h\ E 19 I 19 D 20 $(INCRT)/sys/mbuf.h\ E 20 I 20 $H/mbuf.h\ E 20 E 19 $(INCUCB)/sys/protosw.h\ $(INCUCB)/sys/socket.h\ $(INCUCB)/sys/socketvar.h\ E 15 E 13 E 2 D 16 af.h E 16 I 16 $(INCUCB)/net/af.h E 16 $(LIB)(if.o):\ D 2 $Hdefsocket.h\ $Htypes.h\ $Herrno.h\ $Hsignal.h\ $Hparam.h\ $Hsystm.h\ $Hsocket.h\ $Hprotosw.h\ $Hdir.h\ $Huser.h\ $Hbsdioctl.h\ E 2 I 2 D 13 $H/defsocket.h\ E 13 I 13 D 15 $(INCUCB)/defsocket.h\ E 15 I 15 D 18 $(INCUCB)/sys/defsocket.h\ E 18 I 18 $H/defsocket.h\ E 18 E 15 E 13 $H/types.h\ $H/errno.h\ $H/signal.h\ $H/param.h\ $H/systm.h\ D 13 $H/socket.h\ $H/protosw.h\ E 13 I 13 D 15 $(INCUCB)/socket.h\ $(INCUCB)/protosw.h\ E 15 I 15 $(INCUCB)/sys/socket.h\ $(INCUCB)/sys/protosw.h\ E 15 E 13 $H/dir.h\ $H/user.h\ D 13 $H/bsdioctl.h\ E 13 I 13 D 15 $(INCUCB)/bsdioctl.h\ E 15 I 15 $(INCUCB)/sys/bsdioctl.h\ E 15 E 13 E 2 D 16 if.h\ af.h E 16 I 16 $(INCUCB)/net/if.h\ $(INCUCB)/net/af.h E 16 $(LIB)(raw_cb.o):\ D 2 $Hdefsocket.h\ $Htypes.h\ $Herrno.h\ $Hsignal.h\ $Hparam.h\ $Hsystm.h\ $Hmbuf.h\ $Hsocket.h\ $Hsocketvar.h\ E 2 I 2 D 13 $H/defsocket.h\ E 13 I 13 D 15 $(INCUCB)/defsocket.h\ E 15 I 15 D 18 $(INCUCB)/sys/defsocket.h\ E 18 I 18 $H/defsocket.h\ E 18 E 15 E 13 $H/types.h\ $H/errno.h\ $H/signal.h\ $H/param.h\ $H/systm.h\ D 13 $H/mbuf.h\ $H/socket.h\ $H/socketvar.h\ E 13 I 13 D 15 $(INCUCB)/mbuf.h\ $(INCUCB)/socket.h\ $(INCUCB)/socketvar.h\ E 15 I 15 D 19 $(INCUCB)/sys/mbuf.h\ E 19 I 19 D 20 $(INCRT)/sys/mbuf.h\ E 20 I 20 $H/mbuf.h\ E 20 E 19 $(INCUCB)/sys/socket.h\ $(INCUCB)/sys/socketvar.h\ E 15 E 13 E 2 D 16 if.h\ route.h\ raw_cb.h\ ../netinet/in.h E 16 I 16 $(INCUCB)/net/if.h\ $(INCUCB)/net/route.h\ $(INCUCB)/net/raw_cb.h\ $(INCUCB)/netinet/in.h E 16 # pup.h utilise dans raw_cb.c si PUP defini # ../netpup/pup.h\ --> apres netinet/in.h $(LIB)(raw_usrreq.o):\ D 2 $Hdefsocket.h\ $Htypes.h\ $Herrno.h\ $Hsignal.h\ $Hparam.h\ $Hmbuf.h\ $Hprotosw.h\ $Hsocket.h\ $Hsocketvar.h\ E 2 I 2 D 13 $H/defsocket.h\ E 13 I 13 D 15 $(INCUCB)/defsocket.h\ E 15 I 15 D 18 $(INCUCB)/sys/defsocket.h\ E 18 I 18 $H/defsocket.h\ E 18 E 15 E 13 $H/types.h\ $H/errno.h\ $H/signal.h\ $H/param.h\ D 13 $H/mbuf.h\ $H/protosw.h\ $H/socket.h\ $H/socketvar.h\ E 13 I 13 D 15 $(INCUCB)/mbuf.h\ $(INCUCB)/protosw.h\ $(INCUCB)/socket.h\ $(INCUCB)/socketvar.h\ E 15 I 15 D 19 $(INCUCB)/sys/mbuf.h\ E 19 I 19 D 20 $(INCRT)/sys/mbuf.h\ E 20 I 20 $H/mbuf.h\ E 20 E 19 $(INCUCB)/sys/protosw.h\ $(INCUCB)/sys/socket.h\ $(INCUCB)/sys/socketvar.h\ E 15 E 13 E 2 D 16 if.h\ route.h\ netisr.h\ raw_cb.h E 16 I 16 $(INCUCB)/net/if.h\ $(INCUCB)/net/route.h\ $(INCUCB)/net/netisr.h\ $(INCUCB)/net/raw_cb.h E 16 $(LIB)(route.o):\ D 2 $Hparam.h\ $Hdefsocket.h\ $Htypes.h\ $Herrno.h\ $Hsignal.h\ $Hsystm.h\ $Hmbuf.h\ $Hprotosw.h\ $Hsocket.h\ $Hdir.h\ $Huser.h\ $Hbsdioctl.h\ E 2 I 2 $H/param.h\ D 13 $H/defsocket.h\ E 13 I 13 D 15 $(INCUCB)/defsocket.h\ E 15 I 15 D 18 $(INCUCB)/sys/defsocket.h\ E 18 I 18 $H/defsocket.h\ E 18 E 15 E 13 $H/types.h\ $H/errno.h\ $H/signal.h\ $H/systm.h\ D 13 $H/mbuf.h\ $H/protosw.h\ $H/socket.h\ E 13 I 13 D 15 $(INCUCB)/mbuf.h\ $(INCUCB)/protosw.h\ $(INCUCB)/socket.h\ E 15 I 15 D 19 $(INCUCB)/sys/mbuf.h\ E 19 I 19 D 20 $(INCRT)/sys/mbuf.h\ E 20 I 20 $H/mbuf.h\ E 20 E 19 $(INCUCB)/sys/protosw.h\ $(INCUCB)/sys/socket.h\ E 15 E 13 $H/dir.h\ $H/user.h\ D 13 $H/bsdioctl.h\ E 13 I 13 D 15 $(INCUCB)/bsdioctl.h\ E 15 I 15 $(INCUCB)/sys/bsdioctl.h\ E 15 E 13 E 2 D 16 if.h\ af.h\ route.h E 16 I 16 $(INCUCB)/net/if.h\ $(INCUCB)/net/af.h\ $(INCUCB)/net/route.h E 16 E 1 ! / 548578381 0 0 0 1062 ` Mjjjjjjj^^^^^^^^^^^^^^^^-------------------_null_hash_null_netmatch_mbstat_nmbclusters_mbfree_mclfree_afswitch_ifinit_ifnet_ifqmaxlen_if_slowtimo_if_attach_if_ifwithaddr_if_ifwithnet_if_ifonnetof_if_ifwithaf_if_down_ifunit_ifioctl_ifconf_ipintrq_rawintrq_rpintrq_raw_attach_rawcb_raw_detach_raw_disconnect_raw_bind_ifnet_raw_connaddr_mbstat_nmbclusters_mbfree_mclfree_ipintrq_rawintrq_rpintrq_rthost_rtnet_rtstat_domains_raw_init_rawcb_rawintrq_raw_input_rawintr_raw_ctlinput_raw_usrreq_mbstat_nmbclusters_mbfree_mclfree_ipintrq_rpintrq_ifnet_rthost_rtnet_rtstat_rtalloc_rthost_rtnet_wildcard_rtstat_rtfree_rttrash_rtredirect_rtinit_rtioctl_rtrequest_mbstat_nmbclusters_mbfree_mclfree_ipintrq_rawintrq_rpintrq_ifnetaf.o/ 548578333 0 0 100664 951 ` u <.text( .data((4@.bss!WW @(#)af.c 4.7 87/05/20          @DHLP TX \`dhlptx|.text(.data(.bssk k_mbstat kk_mbfreek_mclfreek+@k5k@kO_null_hash_null_netmatch_nmbclusters_afswitch_inet_hash_inet_netmatch if.o/ 548578346 0 0 100664 3319 ` u * .textl! .data L@.bss8 ȧ~4p0L` zWDاDwtpד~488W  t!WH~@p\H.6 6 z*. wtp~@HHWH8~@É ( Bpנp( W wtp~@ɞ8HHW  tW0 1 "t W8  z  88W@~"i!. tTY< p $)(i 0(iڐ! (i !Ƌ(i!ZhW%' l%# D%! ?Qa1`&! 7Rb1@&# 3Td1 &' 1Xh18 z  "hW(%' l%# D%! ?Qa1l&! 7Rb1L&# 3Td1,&' 1Xh1 | p z4z(7T W  &T 7T*W~Hɞ@PPWx<@ ~HpǠǹ`P.N.P!( !z00n`W%' \%# <%! ?Qa1H7Rb103Td11Xh1P ( wt((p  ~Hɞ@Ǿ<xxW @(#)if.c 4.7 87/05/14 2>np  LNRT@B8:V  "t.text!.data .bss_ifinitvP_ifnetvPvP4vPlvP'vP_bcmpvP6$vPDvPNvP\vP_if_downvPivP_timeoutvP_ifunitvP_ifioctlvP_ifconfpvP_suservP_uvP_spl7vP_splxvP_bcopyvP_copyoutvP_ipintrqvPuvP_rpintrqvP_ifqmaxlen_if_slowtimo_if_attach_if_ifwithaddr_if_ifwithnet_afswitch_if_ifonnetof_if_ifwithaf_pfctlinput_rawintrq raw_cb.o/ 548578354 0 0 100664 1758 ` u 2".text@ .data@@ @.bss``@~8px<R$0p, -.textD .datax$ @.bssPPP2 WP<@~Hp ܧ$`X(' l%# D%! ?Qa1l&! 7Rb1L&# 3Td1,&' 1Xh1 kY)' n%# F%! ?Qa1l&! 7Rb1L&# 3Td1,&' 1Xh1 kZ3Qa1, >|pq|p̓&~Hɞ@Ǿ<PPWXDH~Pְ . |  |NX p z bzz Dz"  Dz"   \R  ; 4 $*0h Z $LǗw< . $+0 $r d~PɞHǾDXXW  WP<@A~Hzxz΀p@ ΀pW z  p ΀ p ΀|pDz΀Z ԋB΀8Dz΀" Dz ΀0 zr j ^̆,Dz΀4Dz ΀Dz 4  00 g4W %' l%# D%! ?Qa1`&! 7Rb1@&# 3Td1 &' 1Xh10@ !  WDz D  l΀b΀X)  6)    ~Hɞ@Ǿ<PPW @(#)raw_usrreq.c 4.7 87/05/20 @hh  D8raw_usrreq "R `     &.6 v z| ,Xz  &.^$ 2!V!jp"| .textD.datax.bssv8_rawcbHv8v80v8_m_getv8_m_freemv8_spl7v8_splxv8_rawintr`v8_bcmpv8_m_copyv8#v81v8_m_freev8;4v8ITv8Uv8av8mv8{v8v8_rtfreev8v8v8v8_rtallocv8_sofreev8_bcopyv8_panicv8_mbstat v8v8_mbfreev8_mclfreev8_ipintrqv8_rpintrqv8_ifnetv8_rthostv8_rtnetv8_rtstat v8_raw_init_rawintrq_raw_input_sbappendaddr_sbwakeup_raw_ctlinput_raw_usrreq_raw_attach_raw_detach_raw_connaddr_soisconnected_raw_bind_raw_disconnect_soisdisconnected_socantsendmore_nmbclusters route.o/ 548578380 0 0 100664 4299 ` u L %.text > .data ( t@.bss  p<@H~P[^l ,nl (vlp! XWlpPǞX^hP^`Q^d `P/Qn`pǀǮd^p z$z, zX  <$nl^hW(((Ljq$dǞ\P^dP^`( z* &z & z~PɞHɾ@<ppW8 ȧ~4pp &z&&z.$z" ~488W`@~HznPY)' ^%# >%! ?Qa1\7Rb1D3Td1,&' 1Xh1 LL~Lp,p!Wpp$ "z$zgX(' l%# D%! ?Qa1`&! 7Rb1@&# 3Td1 &' 1Xh1z~HɎ@``W@~8p0r p0r p "xY~8@@Wp@HP~XP^lx (jp!\W$z"\ `P/Qpߠ` `P/QpߠΰpP^hd p r$z"+dH(^hW +"  u,0r F d0r !0S^l  &z*$z $  چP^lx hP^lLP^l 0  p`X%' l%# D%! ?Qa1l&! 7Rb1L&# 3Td1,&' 1Xh1 gX%' l%# D%! ?Qa1l&! 7Rb1L&# 3Td1,&' 1Xh1 $z $&(,dl~XɎPɮH@ppWx8~@rpޠ0r p ޠ0r H0NnLY)' ^%# >%! ?Qa1P7Rb183Td1 &' 1Xh1n\X(' ^%# >%! ?Qa1P7Rb183Td1 &' 1Xh1 H~l~@ɞ8xxW @(#)route.c 4.7 87/05/20 rtfreeZ\pr~ ^ ` p r         (*:Bt| ~  >@D F p r | , . 8 (*F H TV`  PRZlP.text >.data (.bss _rtallocww_rthostw_bcmpw_rtnetww_rtstat w_rtfreew_panicw_rttrashw_m_freew\w$w_rtinit|w_rtioctl\w_suserw_uw2w_spl7w=w_m_getw_splxw_bzerow_mbstat wLw_mbfreew_mclfreew_ipintrqwYw_rpintrqw_ifnetwc_afswitch_wildcard_rtredirect_if_ifwithnet_rtrequest_if_ifwithaddr_nmbclusters_rawintrq D.R..Etcp_output.vanFs.if_loop.cGs.in.cHs.in_pcb.cIs.in_proto.cJs.ip_icmp.cKs.ip_input.cLs.in_cksum.sMs.ip_output.cNs.raw_ip.cOs.tcp_debug.cPs.tcp_input.cQs.if_ether.cRs.tcp_output.cSs.tcp_subr.cTs.tcp_timer.cUs.tcp_usrreq.cVs.udp_usrreq.cWs.MakefileXtcp_input.vanYip_input.vanZLIBIN.a[s.in_cksum.sau#ident " %W% %E% " /* tcp_output.c 6.1 83/07/29 */ #include /* SOC systeme V */ #include /* SOC systeme V */ #include #include #include "sys/mbuf.h" #include "sys/socket.h" #include "sys/socketvar.h" #include /* SOC systeme V */ #include "net/route.h" #include "netinet/in.h" #include "netinet/in_pcb.h" #include "netinet/in_systm.h" #include "netinet/ip.h" #include "netinet/ip_var.h" #include "netinet/tcp.h" #define TCPOUTFLAGS #include "netinet/tcp_fsm.h" #include "netinet/tcp_seq.h" #include "netinet/tcp_timer.h" #include "netinet/tcp_var.h" #include "netinet/tcpip.h" #include "netinet/tcp_debug.h" /* * Initial options. */ u_char tcp_initopt[4] = { TCPOPT_MAXSEG, 4, 0x0, 0x0, }; /* * Tcp output routine: figure out what should be sent and send it. */ tcp_output(tp) register struct tcpcb *tp; { register struct socket *so = tp->t_inpcb->inp_socket; register int len; struct mbuf *m0; int off, flags, win, error; register struct mbuf *m; register struct tcpiphdr *ti; u_char *opt; unsigned optlen = 0; int idle, sendalot; /* * Determine length of data that should be transmitted, * and flags that will be used. * If there is some data or critical controls (SYN, RST) * to send, then transmit; otherwise, investigate further. */ idle = (tp->snd_max == tp->snd_una); again: sendalot = 0; off = tp->snd_nxt - tp->snd_una; len = MIN(so->so_snd.sb_cc, tp->snd_wnd+tp->t_force) - off; if (len < 0) return (0); /* ??? */ /* past FIN */ if (len > tp->t_maxseg) { len = tp->t_maxseg; sendalot = 1; } flags = tcp_outflags[tp->t_state]; if (SEQ_LT(tp->snd_nxt + len, tp->snd_una + so->so_snd.sb_cc)) flags &= ~TH_FIN; if (flags & (TH_SYN|TH_RST|TH_FIN)) goto send; if (SEQ_GT(tp->snd_up, tp->snd_una)) goto send; /* * Sender silly window avoidance. If can send all data, * a maximum segment, at least 1/4 of window do it, * or are forced, do it; otherwise don't bother. */ if (len) { if (len == tp->t_maxseg) goto send; if (idle && (len + off >= so->so_snd.sb_cc)) goto send; if (len * 4 >= tp->snd_wnd) /* a lot */ goto send; if (tp->t_force) goto send; } /* * Send if we owe peer an ACK. */ if (tp->t_flags&TF_ACKNOW) goto send; /* * Calculate available window in i, and also amount * of window known to peer (as advertised window less * next expected input.) If this is 35% or more of the * maximum possible window, then want to send a segment to peer. */ win = sbspace(&so->so_rcv); if (win < 0) { win = 0; } if (win > 0 && ((100*(win-(tp->rcv_adv-tp->rcv_nxt))/so->so_rcv.sb_hiwat) >= 35)) goto send; /* * TCP window updates are not reliable, rather a polling protocol * using ``persist'' packets is used to insure receipt of window * updates. The three ``states'' for the output side are: * idle not doing retransmits or persists * persisting to move a zero window * (re)transmitting and thereby not persisting * * tp->t_timer[TCPT_PERSIST] * is set when we are in persist state. * tp->t_force * is set when we are called to send a persist packet. * tp->t_timer[TCPT_REXMT] * is set when we are retransmitting * The output side is idle when both timers are zero. * * If send window is closed, there is data to transmit, and no * retransmit or persist is pending, then go to persist state, * arranging to force out a byte to get more current window information * if nothing happens soon. */ if (tp->snd_wnd == 0 && so->so_snd.sb_cc && tp->t_timer[TCPT_REXMT] == 0 && tp->t_timer[TCPT_PERSIST] == 0) { tp->t_rxtshift = 0; tcp_setpersist(tp); } /* * No reason to send a segment, just return. */ return (0); send: /* * Grab a header mbuf, attaching a copy of data to * be transmitted, and initialize the header from * the template for sends on this connection. */ MBGET(m, M_DONTWAIT, MT_HEADER); /* jm */ if (m == NULL) return (ENOBUFS); m->m_off = MMAXOFF - sizeof (struct tcpiphdr); m->m_len = sizeof (struct tcpiphdr); if (len) { m->m_next = m_copy(so->so_snd.sb_mb, off, len); if (m->m_next == 0) len = 0; } ti = mtod(m, struct tcpiphdr *); if (tp->t_template == 0) panic("tcp_output"); bcopy((caddr_t)tp->t_template, (caddr_t)ti, sizeof (struct tcpiphdr)); /* * Fill in fields, remembering maximum advertised * window for use in delaying messages about window sizes. */ ti->ti_seq = tp->snd_nxt; ti->ti_ack = tp->rcv_nxt; ti->ti_seq = htonl(ti->ti_seq); ti->ti_ack = htonl(ti->ti_ack); /* * Before ESTABLISHED, force sending of initial options * unless TCP set to not do any options. */ if (tp->t_state < TCPS_ESTABLISHED) { if (tp->t_flags&TF_NOOPT) goto noopt; opt = tcp_initopt; optlen = sizeof (tcp_initopt); *(u_short *)(opt + 2) = MIN(so->so_rcv.sb_hiwat / 2, 512); *(u_short *)(opt + 2) = htons(*(u_short *)(opt + 2)); } else { if (tp->t_tcpopt == 0) goto noopt; opt = mtod(tp->t_tcpopt, u_char *); optlen = tp->t_tcpopt->m_len; } if (opt) { m0 = m->m_next; m->m_next = m_get(M_DONTWAIT, MT_DATA); if (m->m_next == 0) { (void) m_free(m); m_freem(m0); return (ENOBUFS); } m->m_next->m_next = m0; m0 = m->m_next; m0->m_len = optlen; bcopy((caddr_t)opt, mtod(m0, caddr_t), optlen); opt = (u_char *)(mtod(m0, caddr_t) + optlen); while (m0->m_len & 0x3) { *opt++ = TCPOPT_EOL; m0->m_len++; } optlen = m0->m_len; ti->ti_off = (sizeof (struct tcphdr) + optlen) >> 2; } noopt: ti->ti_flags = flags; win = sbspace(&so->so_rcv); if (win < so->so_rcv.sb_hiwat / 4) /* avoid silly window */ win = 0; if (win > 0) ti->ti_win = htons((u_short)win); if (SEQ_GT(tp->snd_up, tp->snd_nxt)) { ti->ti_urp = tp->snd_up - tp->snd_nxt; ti->ti_urp = htons(ti->ti_urp); ti->ti_flags |= TH_URG; } else /* * If no urgent pointer to send, then we pull * the urgent pointer to the left edge of the send window * so that it doesn't drift into the send window on sequence * number wraparound. */ tp->snd_up = tp->snd_una; /* drag it along */ /* * If anything to send and we can send it all, set PUSH. * (This will keep happy those implementations which only * give data to the user when a buffer fills or a PUSH comes in.) */ if (len && off+len == so->so_snd.sb_cc) ti->ti_flags |= TH_PUSH; /* * Put TCP length in extended header, and then * checksum extended header and data. */ if (len + optlen) { ti->ti_len = sizeof (struct tcphdr) + optlen + len; ti->ti_len = htons((u_short)ti->ti_len); } ti->ti_sum = in_cksum(m, sizeof (struct tcpiphdr) + (int)optlen + len); /* * In transmit state, time the transmission and arrange for * the retransmit. In persist state, reset persist time for * next persist. */ if (tp->t_force == 0) { /* * Advance snd_nxt over sequence space of this segment. */ if (flags & (TH_SYN|TH_FIN)) tp->snd_nxt++; tp->snd_nxt += len; if (SEQ_GT(tp->snd_nxt, tp->snd_max)) tp->snd_max = tp->snd_nxt; /* * Time this transmission if not a retransmission and * not currently timing anything. */ if (SEQ_GT(tp->snd_nxt, tp->snd_max) && tp->t_rtt == 0) { tp->t_rtt = 1; /* jm tout * 10 */ tp->t_rtseq = tp->snd_nxt - len; } /* * Set retransmit timer if not currently set. * Initial value for retransmit timer to tcp_beta*tp->t_srtt. * Initialize shift counter which is used for exponential * backoff of retransmit time. */ if (tp->t_timer[TCPT_REXMT] == 0 && tp->snd_nxt != tp->snd_una) { TCPT_RANGESET(tp->t_timer[TCPT_REXMT], tcp_beta * tp->t_srtt, TCPTV_MIN, TCPTV_MAX); tp->t_rtt = 0; tp->t_rxtshift = 0; } tp->t_timer[TCPT_PERSIST] = 0; } else { if (SEQ_GT(tp->snd_una+1, tp->snd_max)) tp->snd_max = tp->snd_una+1; } /* * Trace. */ if (so->so_options & SO_DEBUG) tcp_trace(TA_OUTPUT, tp->t_state, tp, ti, 0); /* * Fill in IP length and desired time to live and * send to IP level. */ ((struct ip *)ti)->ip_len = sizeof (struct tcpiphdr) + optlen + len; ((struct ip *)ti)->ip_ttl = TCP_TTL; if (so->so_options & SO_DONTROUTE) error = ip_output(m, tp->t_ipopt, (struct route *)0, IP_ROUTETOIF); else error = ip_output(m, tp->t_ipopt, &tp->t_inpcb->inp_route, 0); if (error) return (error); /* * Data sent (as far as we can tell). * If this advertises a larger window than any other segment, * then remember the size of the advertised window. * Drop send for purpose of ACK requirements. */ if (win > 0 && SEQ_GT(tp->rcv_nxt+win, tp->rcv_adv)) tp->rcv_adv = tp->rcv_nxt + win; #ifdef ROSSE tp->rcv_adv = tp->rcv_nxt + win; #endif /* ROSSE */ tp->t_flags &= ~(TF_ACKNOW|TF_DELACK); if (sendalot && tp->t_force == 0) goto again; return (0); } tcp_setpersist(tp) register struct tcpcb *tp; { if (tp->t_timer[TCPT_REXMT]) panic("tcp_output REXMT"); /* * Start/restart persistance timer. */ TCPT_RANGESET(tp->t_timer[TCPT_PERSIST], ((int)(tcp_beta * tp->t_srtt)) << tp->t_rxtshift, TCPTV_PERSMIN, TCPTV_MAX); tp->t_rxtshift++; if (tp->t_rxtshift >= TCP_MAXRXTSHIFT) tp->t_rxtshift = 0; } h26120 s 00001/00001/00128 d D 4.7 87/05/20 13:26:01 brian 12 11 c mbuf.h put back on system search path BB e s 00001/00002/00128 d D 4.6 87/05/14 16:38:30 build 11 10 c removed old SCCS strings and inserted #ident BB e s 00001/00001/00129 d D 4.5 87/05/07 19:14:54 van 10 9 c van - move defsocket.h back to /usr/include/sys e s 00007/00007/00123 d D 4.4 87/04/30 19:24:23 van 9 8 c van - moved net and netinet includes e s 00004/00004/00126 d D 4.3 87/04/29 20:02:59 van 8 7 c van - moved ucb networking includes to INCUCB e s 00008/00008/00122 d D 4.2 87/04/15 17:55:26 dc 7 6 c dc - changed #include "sys/..." to #include e s 00000/00000/00130 d D 4.1 87/02/20 13:37:17 build 6 5 c rolled rev to -r4 /dc e s 00000/00000/00130 d D 3.1 87/01/19 09:28:29 build 5 4 c rolled rev to -r3 /dc e s 00000/00000/00130 d D 2.1 87/01/19 09:28:29 build 4 2 c AUTO NULL DELTA e s 00007/00001/00129 d R 1.3 87/01/16 11:19:29 build 3 2 c Add interim changes from bull - van e s 00001/00000/00129 d D 1.2 87/01/16 10:23:46 build 2 1 c add ident string /dc e s 00129/00000/00000 d D 1.1 87/01/09 18:12:28 build 1 0 c Placed under source control - dc e u U f b f n t T I 2 D 11 /* "%W% %E%" */ E 2 I 1 static char sccsid[] = "@(#)Wed Apr 23 15:06:15 EET 1986~ BULL-SEMS V21 netinet/if_loop" ; E 11 I 11 #ident " %W% %E% " E 11 /* if_loop.c 6.1 83/07/29 modifiee par gipsy 85/11/14 */ /* * Loopback interface driver for protocol testing and timing. * Modifiee pour prendre en compte l'absence de software interrupt. * La commutation de contexte est forcee artifciellement par l' * activation de la routine timeout. Attention, l'execution de * plusieurs loopback peut faire un debordement de la table * associee aux timeout. */ D 7 #include "sys/defsocket.h" /* SOC systeme V */ #include "sys/types.h" /* SOC systeme V */ #include "sys/param.h" #include "sys/systm.h" #include "sys/mbuf.h" #include "sys/socket.h" #include "sys/errno.h" /* SOC systeme V */ #include "sys/bsdioctl.h" E 7 I 7 D 8 #include /* SOC systeme V */ E 8 I 8 D 10 #include "sys/defsocket.h" /* SOC systeme V */ E 10 I 10 #include /* SOC systeme V */ E 10 E 8 #include /* SOC systeme V */ #include #include D 8 #include #include E 8 I 8 D 12 #include "sys/mbuf.h" E 12 I 12 #include E 12 #include "sys/socket.h" E 8 #include /* SOC systeme V */ D 8 #include E 8 I 8 #include "sys/bsdioctl.h" E 8 E 7 D 9 #include "../net/if.h" #include "../net/netisr.h" #include "../net/route.h" E 9 I 9 #include "net/if.h" #include "net/netisr.h" #include "net/route.h" E 9 D 9 #include "in.h" #include "in_systm.h" #include "ip.h" #include "ip_var.h" E 9 I 9 #include "netinet/in.h" #include "netinet/in_systm.h" #include "netinet/ip.h" #include "netinet/ip_var.h" E 9 #ifdef vax #include "../vax/mtpr.h" #endif #define LONET 127 #define LOHOST 1 /* can't be 0, that's broadcast */ #define LOMTU (1024+512) struct ifnet loif; int looutput(), loioctl(); int wbetopen(); loattach() { register struct ifnet *ifp = &loif; register struct sockaddr_in *sin; ifp->if_name = "lo"; ifp->if_mtu = LOMTU; ifp->if_net = LONET; ifp->if_host[0] = LOHOST; sin = (struct sockaddr_in *)&ifp->if_addr; sin->sin_family = AF_INET; sin->sin_addr = if_makeaddr(LONET, LOHOST); ifp->if_flags = IFF_UP | IFF_RUNNING; ifp->if_ioctl = loioctl; ifp->if_output = looutput; if_attach(ifp); if_rtinit(ifp, RTF_UP); } looutput(ifp, m0, dst) struct ifnet *ifp; struct mbuf *m0; struct sockaddr *dst; { int s = splimp(); register struct ifqueue *ifq; ifp->if_opackets++; switch (dst->sa_family) { #ifdef INET case AF_INET: ifq = &ipintrq; if (IF_QFULL(ifq)) { IF_DROP(ifq); m_freem(m0); splx(s); return (ENOBUFS); } IF_ENQUEUE(ifq, m0); wakeup(wbetopen); break; #endif default: splx(s); printf("lo%d: can't handle af%d\n", ifp->if_unit, dst->sa_family); m_freem(m0); return (EAFNOSUPPORT); } ifp->if_ipackets++; splx(s); return (0); } /* * Process an ioctl request. */ loioctl(ifp, cmd, data) register struct ifnet *ifp; int cmd; caddr_t data; { struct ifreq *ifr = (struct ifreq *)data; struct sockaddr_in *sin; int s = splimp(), error = 0; switch (cmd) { case SIOCSIFADDR: if (ifp->if_flags & IFF_RUNNING) if_rtinit(ifp, -1); /* delete previous route */ ifp->if_addr = ifr->ifr_addr; sin = (struct sockaddr_in *)&ifp->if_addr; ifp->if_net = in_netof(sin->sin_addr); ifp->if_host[0] = in_lnaof(sin->sin_addr); if_rtinit(ifp, RTF_UP); break; default: error = EINVAL; } splx(s); return (error); } E 1 h30915 s 00001/00001/00102 d D 4.7 87/05/20 13:26:19 brian 11 10 c mbuf.h put back on system search path BB e s 00001/00002/00102 d D 4.6 87/05/14 16:38:42 build 10 9 c removed old SCCS strings and inserted #ident BB e s 00001/00001/00103 d D 4.5 87/05/07 19:14:57 van 9 8 c van - move defsocket.h back to /usr/include/sys e s 00005/00005/00099 d D 4.4 87/04/30 19:24:24 van 8 7 c van - moved net and netinet includes e s 00004/00004/00100 d D 4.3 87/04/29 20:03:02 van 7 6 c van - moved ucb networking includes to INCUCB e s 00006/00006/00098 d D 4.2 87/04/15 17:55:35 dc 6 5 c dc - changed #include "sys/..." to #include e s 00000/00000/00104 d D 4.1 87/02/20 13:37:22 build 5 4 c rolled rev to -r4 /dc e s 00000/00000/00104 d D 3.1 87/01/19 09:28:33 build 4 3 c rolled rev to -r3 /dc e s 00000/00000/00104 d D 2.1 87/01/19 09:28:33 build 3 2 c AUTO NULL DELTA e s 00001/00000/00103 d D 1.2 87/01/16 10:23:52 build 2 1 c add ident string /dc e s 00103/00000/00000 d D 1.1 87/01/09 18:12:29 build 1 0 c Placed under source control - dc e u U f b f n t T I 2 D 10 /* "%W% %E%" */ E 2 I 1 static char sccsid[] = "@(#)Wed Apr 23 15:06:27 EET 1986~ BULL-SEMS V21 netinet/in" ; E 10 I 10 #ident " %W% %E% " E 10 /* in.c 6.1 83/07/29 */ D 6 #include "sys/defsocket.h" /* SOC systeme V */ #include "sys/types.h" /* SOC systeme V */ #include "sys/param.h" #include "sys/mbuf.h" #include "sys/socket.h" #include "sys/socketvar.h" E 6 I 6 D 7 #include /* SOC systeme V */ E 7 I 7 D 9 #include "sys/defsocket.h" /* SOC systeme V */ E 9 I 9 #include /* SOC systeme V */ E 9 E 7 #include /* SOC systeme V */ #include D 7 #include #include #include E 7 I 7 D 11 #include "sys/mbuf.h" E 11 I 11 #include E 11 #include "sys/socket.h" #include "sys/socketvar.h" E 7 E 6 D 8 #include "in.h" #include "in_systm.h" #include "../net/if.h" #include "../net/route.h" #include "../net/af.h" E 8 I 8 #include "netinet/in.h" #include "netinet/in_systm.h" #include "net/if.h" #include "net/route.h" #include "net/af.h" E 8 #ifdef INET inet_hash(sin, hp) register struct sockaddr_in *sin; struct afhash *hp; { hp->afh_nethash = in_netof(sin->sin_addr); hp->afh_hosthash = ntohl(sin->sin_addr.s_addr); } inet_netmatch(sin1, sin2) struct sockaddr_in *sin1, *sin2; { return (in_netof(sin1->sin_addr) == in_netof(sin2->sin_addr)); } /* * Formulate an Internet address from network + host. Used in * building addresses stored in the ifnet structure. */ struct in_addr if_makeaddr(net, host) int net, host; { u_long addr; if (net < 128) addr = (net << IN_CLASSA_NSHIFT) | host; else if (net < 65536) addr = (net << IN_CLASSB_NSHIFT) | host; else addr = (net << IN_CLASSC_NSHIFT) | host; addr = htonl(addr); return (*(struct in_addr *)&addr); } /* * Return the network number from an internet address. */ in_netof(in) struct in_addr in; { register u_long i = ntohl(in.s_addr); if (IN_CLASSA(i)) return (((i)&IN_CLASSA_NET) >> IN_CLASSA_NSHIFT); else if (IN_CLASSB(i)) return (((i)&IN_CLASSB_NET) >> IN_CLASSB_NSHIFT); else return (((i)&IN_CLASSC_NET) >> IN_CLASSC_NSHIFT); } /* * Return the host portion of an internet address. */ in_lnaof(in) struct in_addr in; { register u_long i = ntohl(in.s_addr); if (IN_CLASSA(i)) return ((i)&IN_CLASSA_HOST); else if (IN_CLASSB(i)) return ((i)&IN_CLASSB_HOST); else return ((i)&IN_CLASSC_HOST); } /* * Initialize an interface's routing * table entry according to the network. * INTERNET SPECIFIC. */ if_rtinit(ifp, flags) register struct ifnet *ifp; int flags; { struct sockaddr_in sin; if (ifp->if_flags & IFF_ROUTE) return; bzero((caddr_t)&sin, sizeof (sin)); sin.sin_family = AF_INET; sin.sin_addr = if_makeaddr(ifp->if_net, INADDR_ANY); rtinit((struct sockaddr *)&sin, &ifp->if_addr, flags); } #endif E 1 h65395 s 00001/00001/00272 d D 4.7 87/05/20 13:26:42 brian 11 10 c mbuf.h put back on system search path BB e s 00001/00002/00272 d D 4.6 87/05/14 16:38:55 build 10 9 c removed old SCCS strings and inserted #ident BB e s 00001/00001/00273 d D 4.5 87/05/07 19:15:01 van 9 8 c van - move defsocket.h back to /usr/include/sys e s 00005/00005/00269 d D 4.4 87/04/30 19:24:26 van 8 7 c van - moved net and netinet includes e s 00004/00004/00270 d D 4.3 87/04/29 20:03:03 van 7 6 c van - moved ucb networking includes to INCUCB e s 00011/00011/00263 d D 4.2 87/04/15 17:55:44 dc 6 5 c dc - changed #include "sys/..." to #include e s 00000/00000/00274 d D 4.1 87/02/20 13:37:28 build 5 4 c rolled rev to -r4 /dc e s 00000/00000/00274 d D 3.1 87/01/19 09:28:37 build 4 3 c rolled rev to -r3 /dc e s 00000/00000/00274 d D 2.1 87/01/19 09:28:37 build 3 2 c AUTO NULL DELTA e s 00001/00000/00273 d D 1.2 87/01/16 10:23:58 build 2 1 c add ident string /dc e s 00273/00000/00000 d D 1.1 87/01/09 18:12:30 build 1 0 c Placed under source control - dc e u U f b f n t T I 2 D 10 /* "%W% %E%" */ E 2 I 1 static char sccsid[] = "@(#)Wed Apr 23 15:06:35 EET 1986~ BULL-SEMS V21 netinet/in_pcb" ; E 10 I 10 #ident " %W% %E% " E 10 /* in_pcb.c 6.1 83/07/29 */ D 6 #include "sys/defsocket.h" /* SOC systeme V */ #include "sys/types.h" /* SOC systeme V */ #include "sys/signal.h" /* SOC systeme V */ #include "sys/param.h" #include "sys/systm.h" #include "sys/dir.h" #include "sys/user.h" #include "sys/mbuf.h" #include "sys/socket.h" #include "sys/socketvar.h" #include "sys/errno.h" /* SOC systeme V */ E 6 I 6 D 7 #include /* SOC systeme V */ E 7 I 7 D 9 #include "sys/defsocket.h" /* SOC systeme V */ E 9 I 9 #include /* SOC systeme V */ E 9 E 7 #include /* SOC systeme V */ #include /* SOC systeme V */ #include #include #include #include D 7 #include #include #include E 7 I 7 D 11 #include "sys/mbuf.h" E 11 I 11 #include E 11 #include "sys/socket.h" #include "sys/socketvar.h" E 7 #include /* SOC systeme V */ E 6 D 8 #include "in.h" #include "in_systm.h" #include "../net/if.h" #include "../net/route.h" #include "in_pcb.h" E 8 I 8 #include "netinet/in.h" #include "netinet/in_systm.h" #include "net/if.h" #include "net/route.h" #include "netinet/in_pcb.h" E 8 struct in_addr zeroin_addr; in_pcballoc(so, head) struct socket *so; struct inpcb *head; { struct mbuf *m; register struct inpcb *inp; m = m_getclr(M_DONTWAIT, MT_PCB); if (m == NULL) return (ENOBUFS); inp = mtod(m, struct inpcb *); inp->inp_head = head; inp->inp_socket = so; insque(inp, head); so->so_pcb = (caddr_t)inp; return (0); } in_pcbbind(inp, nam) register struct inpcb *inp; struct mbuf *nam; { register struct socket *so = inp->inp_socket; register struct inpcb *head = inp->inp_head; register struct sockaddr_in *sin; u_short lport = 0; if (ifnet == 0) return (EADDRNOTAVAIL); if (inp->inp_lport || inp->inp_laddr.s_addr != INADDR_ANY) return (EINVAL); if (nam == 0) goto noname; sin = mtod(nam, struct sockaddr_in *); if (nam->m_len != sizeof (*sin)) return (EINVAL); if (sin->sin_addr.s_addr != INADDR_ANY) { int tport = sin->sin_port; sin->sin_port = 0; /* yech... */ if (if_ifwithaddr((struct sockaddr *)sin) == 0) return (EADDRNOTAVAIL); sin->sin_port = tport; } lport = sin->sin_port; if (lport) { u_short aport = htons(lport); int wild = 0; /* GROSS */ if (aport < IPPORT_RESERVED && u.u_uid != 0) return (EACCES); /* even GROSSER, but this is the Internet */ if ((so->so_options & SO_REUSEADDR) == 0 && ((so->so_proto->pr_flags & PR_CONNREQUIRED) == 0 || (so->so_options & SO_ACCEPTCONN) == 0)) wild = INPLOOKUP_WILDCARD; if (in_pcblookup(head, zeroin_addr, 0, sin->sin_addr, lport, wild)) return (EADDRINUSE); } inp->inp_laddr = sin->sin_addr; noname: if (lport == 0) do { if (head->inp_lport++ < IPPORT_RESERVED) head->inp_lport = IPPORT_RESERVED; lport = htons(head->inp_lport); } while (in_pcblookup(head, zeroin_addr, 0, inp->inp_laddr, lport, 0)); inp->inp_lport = lport; return (0); } /* * Connect from a socket to a specified address. * Both address and port must be specified in argument sin. * If don't have a local address for this socket yet, * then pick one. */ in_pcbconnect(inp, nam) struct inpcb *inp; struct mbuf *nam; { struct ifnet *ifp; struct sockaddr_in *ifaddr; register struct sockaddr_in *sin = mtod(nam, struct sockaddr_in *); if (nam->m_len != sizeof (*sin)) return (EINVAL); if (sin->sin_family != AF_INET) return (EAFNOSUPPORT); if (sin->sin_addr.s_addr == INADDR_ANY || sin->sin_port == 0) return (EADDRNOTAVAIL); if (inp->inp_laddr.s_addr == INADDR_ANY) { ifp = if_ifonnetof(in_netof(sin->sin_addr)); if (ifp == 0) { /* * We should select the interface based on * the route to be used, but for udp this would * result in two calls to rtalloc for each packet * sent; hardly worthwhile... */ ifp = if_ifwithaf(AF_INET); if (ifp == 0) return (EADDRNOTAVAIL); } ifaddr = (struct sockaddr_in *)&ifp->if_addr; } if (in_pcblookup(inp->inp_head, sin->sin_addr, sin->sin_port, inp->inp_laddr.s_addr ? inp->inp_laddr : ifaddr->sin_addr, inp->inp_lport, 0)) return (EADDRINUSE); if (inp->inp_laddr.s_addr == INADDR_ANY) { if (inp->inp_lport == 0) in_pcbbind(inp, (struct mbuf *)0); inp->inp_laddr = ifaddr->sin_addr; } inp->inp_faddr = sin->sin_addr; inp->inp_fport = sin->sin_port; return (0); } in_pcbdisconnect(inp) struct inpcb *inp; { inp->inp_faddr.s_addr = INADDR_ANY; inp->inp_fport = 0; if (inp->inp_socket->so_state & SS_NOFDREF) in_pcbdetach(inp); } in_pcbdetach(inp) struct inpcb *inp; { struct socket *so = inp->inp_socket; so->so_pcb = 0; sofree(so); if (inp->inp_route.ro_rt) rtfree(inp->inp_route.ro_rt); remque(inp); (void) m_free(dtom(inp)); } in_setsockaddr(inp, nam) register struct inpcb *inp; struct mbuf *nam; { register struct sockaddr_in *sin = mtod(nam, struct sockaddr_in *); nam->m_len = sizeof (*sin); sin = mtod(nam, struct sockaddr_in *); bzero((caddr_t)sin, sizeof (*sin)); sin->sin_family = AF_INET; sin->sin_port = inp->inp_lport; sin->sin_addr = inp->inp_laddr; } in_setpeeraddr(inp, nam) register struct inpcb *inp; struct mbuf *nam; { register struct sockaddr_in *sin = mtod(nam, struct sockaddr_in *); nam->m_len = sizeof (*sin); sin = mtod(nam, struct sockaddr_in *); bzero((caddr_t)sin, sizeof (*sin)); sin->sin_family = AF_INET; sin->sin_port = inp->inp_fport; sin->sin_addr = inp->inp_faddr; } /* * Pass an error to all internet connections * associated with address sin. Call the * protocol specific routine to clean up the * mess afterwards. */ in_pcbnotify(head, dst, errno, abort) struct inpcb *head; register struct in_addr *dst; int errno, (*abort)(); { register struct inpcb *inp, *oinp; int s = splimp(); for (inp = head->inp_next; inp != head;) { if (inp->inp_faddr.s_addr != dst->s_addr) { next: inp = inp->inp_next; continue; } if (inp->inp_socket == 0) goto next; inp->inp_socket->so_error = errno; oinp = inp; inp = inp->inp_next; (*abort)(oinp); } splx(s); } struct inpcb * in_pcblookup(head, faddr, fport, laddr, lport, flags) struct inpcb *head; struct in_addr faddr, laddr; u_short fport, lport; int flags; { register struct inpcb *inp, *match = 0; int matchwild = 3, wildcard; for (inp = head->inp_next; inp != head; inp = inp->inp_next) { if (inp->inp_lport != lport) continue; wildcard = 0; if (inp->inp_laddr.s_addr != INADDR_ANY) { if (laddr.s_addr == INADDR_ANY) wildcard++; else if (inp->inp_laddr.s_addr != laddr.s_addr) continue; } else { if (laddr.s_addr != INADDR_ANY) wildcard++; } if (inp->inp_faddr.s_addr != INADDR_ANY) { if (faddr.s_addr == INADDR_ANY) wildcard++; else if (inp->inp_faddr.s_addr != faddr.s_addr || inp->inp_fport != fport) continue; } else { if (faddr.s_addr != INADDR_ANY) wildcard++; } if (wildcard && (flags & INPLOOKUP_WILDCARD) == 0) continue; if (wildcard < matchwild) { match = inp; matchwild = wildcard; if (matchwild == 0) break; } } return (match); } E 1 h07492 s 00001/00001/00093 d D 4.7 87/05/20 13:26:58 brian 11 10 c mbuf.h put back on system search path BB e s 00001/00002/00093 d D 4.6 87/05/14 16:39:07 build 10 9 c removed old SCCS strings and inserted #ident BB e s 00001/00001/00094 d D 4.5 87/05/07 19:15:07 van 9 8 c van - move defsocket.h back to /usr/include/sys e s 00004/00004/00091 d D 4.4 87/04/30 19:24:27 van 8 7 c van - moved net and netinet includes e s 00003/00003/00092 d D 4.3 87/04/29 20:03:06 van 7 6 c van - moved ucb networking includes to INCUCB e s 00005/00005/00090 d D 4.2 87/04/15 17:55:53 dc 6 5 c dc - changed #include "sys/..." to #include e s 00000/00000/00095 d D 4.1 87/02/20 13:37:37 build 5 4 c rolled rev to -r4 /dc e s 00000/00000/00095 d D 3.1 87/01/19 09:28:45 build 4 3 c rolled rev to -r3 /dc e s 00000/00000/00095 d D 2.1 87/01/19 09:28:45 build 3 2 c AUTO NULL DELTA e s 00001/00000/00094 d D 1.2 87/01/16 10:24:08 build 2 1 c add ident string /dc e s 00094/00000/00000 d D 1.1 87/01/09 18:12:31 build 1 0 c Placed under source control - dc e u U f b f n t T I 2 D 10 /* "%W% %E%" */ E 2 I 1 static char sccsid[] = "@(#)Wed Apr 23 15:07:08 EET 1986~ BULL-SEMS V21 netinet/in_proto" ; E 10 I 10 #ident " %W% %E% " E 10 /* in_proto.c 6.1 83/07/29 */ D 6 #include "sys/defsocket.h" #include "sys/types.h" E 6 I 6 D 7 #include E 7 I 7 D 9 #include "sys/defsocket.h" E 9 I 9 #include E 9 E 7 #include E 6 D 6 #include "sys/param.h" #include "sys/socket.h" #include "sys/mbuf.h" E 6 I 6 #include D 7 #include #include E 7 I 7 #include "sys/socket.h" D 11 #include "sys/mbuf.h" E 11 I 11 #include E 11 E 7 E 6 D 8 #include "in.h" #include "in_systm.h" E 8 I 8 #include "netinet/in.h" #include "netinet/in_systm.h" E 8 /* * TCP/IP protocol family: IP, ICMP, UDP, TCP. */ int ip_output(); int ip_init(),ip_slowtimo(),ip_drain(); int icmp_input(); int udp_input(),udp_ctlinput(); int udp_usrreq(); int udp_init(); int tcp_input(),tcp_ctlinput(); int tcp_usrreq(); int tcp_init(),tcp_fasttimo(),tcp_slowtimo(),tcp_drain(); int rip_input(),rip_output(); extern int raw_usrreq(); /* * IMP protocol family: raw interface. * Using the raw interface entry to get the timer routine * in is a kludge. */ D 8 #include "imp.h" E 8 I 8 #include "netinet/imp.h" E 8 #if NIMP > 0 int rimp_output(), hostslowtimo(); #endif /* * Network disk protocol: runs on top of IP */ D 8 #include "nd.h" E 8 I 8 #include "netinet/nd.h" E 8 #if NND > 0 int nd_input(), nd_slowtimo(), nd_init(); #endif struct protosw inetsw[] = { { 0, PF_INET, 0, 0, 0, ip_output, 0, 0, 0, ip_init, 0, ip_slowtimo, ip_drain, }, { 0, PF_INET, IPPROTO_ICMP, 0, icmp_input, 0, 0, 0, 0, 0, 0, 0, 0, }, { SOCK_DGRAM, PF_INET, IPPROTO_UDP, PR_ATOMIC|PR_ADDR, udp_input, 0, udp_ctlinput, 0, udp_usrreq, udp_init, 0, 0, 0, }, { SOCK_STREAM, PF_INET, IPPROTO_TCP, PR_CONNREQUIRED|PR_WANTRCVD, tcp_input, 0, tcp_ctlinput, 0, tcp_usrreq, tcp_init, tcp_fasttimo, tcp_slowtimo, tcp_drain, }, { SOCK_RAW, PF_INET, IPPROTO_RAW, PR_ATOMIC|PR_ADDR, rip_input, rip_output, 0, 0, raw_usrreq, 0, 0, 0, 0, }, #if NND > 0 { 0, PF_INET, IPPROTO_ND, 0, nd_input, 0, 0, 0, 0, nd_init, 0, nd_slowtimo, 0, }, #endif }; struct domain inetdomain = { AF_INET, "internet", inetsw, &inetsw[sizeof(inetsw)/sizeof(inetsw[0])] }; #if NIMP > 0 struct protosw impsw[] = { { SOCK_RAW, PF_IMPLINK, 0, PR_ATOMIC|PR_ADDR, 0, rimp_output, 0, 0, raw_usrreq, 0, 0, hostslowtimo, 0, }, }; struct domain impdomain = { AF_IMPLINK, "imp", impsw, &impsw[sizeof (impsw)/sizeof(impsw[0])] }; #endif E 1 h16444 s 00001/00001/00310 d D 4.7 87/05/20 13:27:18 brian 11 10 c mbuf.h put back on system search path BB e s 00002/00003/00309 d D 4.6 87/05/14 16:39:24 build 10 9 c removed old SCCS strings and inserted #ident BB e s 00001/00001/00311 d D 4.5 87/05/07 19:15:11 van 9 8 c van - move defsocket.h back to /usr/include/sys e s 00006/00006/00306 d D 4.4 87/04/30 19:24:29 van 8 7 c van - moved net and netinet includes e s 00003/00003/00309 d D 4.3 87/04/29 20:03:08 van 7 6 c van - moved ucb networking includes to INCUCB e s 00006/00006/00306 d D 4.2 87/04/15 17:56:00 dc 6 5 c dc - changed #include "sys/..." to #include e s 00000/00000/00312 d D 4.1 87/02/20 13:37:42 build 5 4 c rolled rev to -r4 /dc e s 00000/00000/00312 d D 3.1 87/01/19 09:28:49 build 4 3 c rolled rev to -r3 /dc e s 00000/00000/00312 d D 2.1 87/01/19 09:28:49 build 3 2 c AUTO NULL DELTA e s 00001/00000/00311 d D 1.2 87/01/16 10:24:14 build 2 1 c add ident string /dc e s 00311/00000/00000 d D 1.1 87/01/09 18:12:32 build 1 0 c Placed under source control - dc e u U f b f n t T I 2 D 10 /* "%W% %E%" */ E 2 I 1 static char sccsid[] = "@(#)Wed Apr 23 15:07:19 EET 1986~ BULL-SEMS V21 netinet/ip_icmp" ; /* @(#) Gipsi SPIX+SOCKET netinet/ip_icmp.c 1.1 85/08/06 E 10 I 10 #ident " %W% %E% " /* Gipsi SPIX+SOCKET netinet/ip_icmp.c 1.1 85/08/06 E 10 * 4.2BSD ip_icmp.c 6.2 83/09/19 */ D 6 #include "sys/defsocket.h" #include "sys/types.h" E 6 I 6 D 7 #include E 7 I 7 D 9 #include "sys/defsocket.h" E 9 I 9 #include E 9 E 7 #include E 6 D 6 #include "sys/param.h" #include "sys/systm.h" #include "sys/mbuf.h" #include "sys/socket.h" E 6 I 6 #include #include D 7 #include #include E 7 I 7 D 11 #include "sys/mbuf.h" E 11 I 11 #include E 11 #include "sys/socket.h" E 7 E 6 D 8 #include "../net/route.h" E 8 I 8 #include "net/route.h" E 8 D 8 #include "in.h" #include "in_systm.h" #include "ip.h" #include "ip_icmp.h" #include "icmp_var.h" E 8 I 8 #include "netinet/in.h" #include "netinet/in_systm.h" #include "netinet/ip.h" #include "netinet/ip_icmp.h" #include "netinet/icmp_var.h" E 8 #ifdef ICMPPRINTFS /* * ICMP routines: error generation, receive packet processing, and * routines to turnaround packets back to the originator, and * host table maintenance routines. */ int icmpprintfs = 0; #endif /* * Generate an error packet of type error * in response to bad packet ip. */ icmp_error(oip, type, code) struct ip *oip; int type, code; { register unsigned oiplen = oip->ip_hl << 2; register struct icmp *icp; struct mbuf *m; struct ip *nip; #ifdef ICMPPRINTFS if (icmpprintfs) printf("icmp_error(%x, %d, %d)\n", oip, type, code); #endif icmpstat.icps_error++; /* * Make sure that the old IP packet had 8 bytes of data to return; * if not, don't bother. Also don't EVER error if the old * packet protocol was ICMP. */ if (oip->ip_len < 8) { icmpstat.icps_oldshort++; goto free; } if (oip->ip_p == IPPROTO_ICMP) { icmpstat.icps_oldicmp++; goto free; } /* * First, formulate icmp message */ m = m_get(M_DONTWAIT, MT_HEADER); if (m == NULL) goto free; m->m_len = oiplen + 8 + ICMP_MINLEN; m->m_off = MMAXOFF - m->m_len; icp = mtod(m, struct icmp *); if ((u_int)type > ICMP_IREQREPLY) panic("icmp_error"); icmpstat.icps_outhist[type]++; icp->icmp_type = type; icp->icmp_void = 0; if (type == ICMP_PARAMPROB) { icp->icmp_pptr = code; code = 0; } icp->icmp_code = code; bcopy((caddr_t)oip, (caddr_t)&icp->icmp_ip, oiplen + 8); nip = &icp->icmp_ip; nip->ip_len += oiplen; nip->ip_len = htons((u_short)nip->ip_len); /* * Now, copy old ip header in front of icmp * message. This allows us to reuse any source * routing info present. */ m->m_off -= oiplen; nip = mtod(m, struct ip *); bcopy((caddr_t)oip, (caddr_t)nip, oiplen); nip->ip_len = m->m_len + oiplen; nip->ip_p = IPPROTO_ICMP; /* icmp_send adds ip header to m_off and m_len, so we deduct here */ m->m_off += oiplen; icmp_reflect(nip); free: m_freem(dtom(oip)); } static struct sockproto icmproto = { AF_INET, IPPROTO_ICMP }; static struct sockaddr_in icmpsrc = { AF_INET }; static struct sockaddr_in icmpdst = { AF_INET }; /* * Process a received ICMP message. */ icmp_input(m) struct mbuf *m; { register struct icmp *icp; register struct ip *ip = mtod(m, struct ip *); int icmplen = ip->ip_len, hlen = ip->ip_hl << 2; int (*ctlfunc)(), code, i; extern u_char ip_protox[]; /* * Locate icmp structure in mbuf, and check * that not corrupted and of at least minimum length. */ #ifdef ICMPPRINTFS if (icmpprintfs) printf("icmp_input from %x, len %d\n", ip->ip_src, icmplen); #endif if (icmplen < ICMP_MINLEN) { icmpstat.icps_tooshort++; goto free; } m->m_len -= hlen; m->m_off += hlen; /* need routine to make sure header is in this mbuf here */ icp = mtod(m, struct icmp *); i = icp->icmp_cksum; icp->icmp_cksum = 0; if (i != in_cksum(m, icmplen)) { icmpstat.icps_checksum++; goto free; } #ifdef ICMPPRINTFS /* * Message type specific processing. */ if (icmpprintfs) printf("icmp_input, type %d code %d\n", icp->icmp_type, icp->icmp_code); #endif if (icp->icmp_type > ICMP_IREQREPLY) goto free; icmpstat.icps_inhist[icp->icmp_type]++; code = icp->icmp_code; switch (icp->icmp_type) { case ICMP_UNREACH: if (code > 5) goto badcode; code += PRC_UNREACH_NET; goto deliver; case ICMP_TIMXCEED: if (code > 1) goto badcode; code += PRC_TIMXCEED_INTRANS; goto deliver; case ICMP_PARAMPROB: if (code) goto badcode; code = PRC_PARAMPROB; goto deliver; case ICMP_SOURCEQUENCH: if (code) goto badcode; code = PRC_QUENCH; deliver: /* * Problem with datagram; advise higher level routines. */ icp->icmp_ip.ip_len = ntohs((u_short)icp->icmp_ip.ip_len); if (icmplen < ICMP_ADVLENMIN || icmplen < ICMP_ADVLEN(icp)) { icmpstat.icps_badlen++; goto free; } #ifdef ICMPPRINTFS if (icmpprintfs) printf("deliver to protocol %d\n", icp->icmp_ip.ip_p); #endif if (ctlfunc = inetsw[ip_protox[icp->icmp_ip.ip_p]].pr_ctlinput) (*ctlfunc)(code, (caddr_t)icp); goto free; badcode: icmpstat.icps_badcode++; goto free; case ICMP_ECHO: icp->icmp_type = ICMP_ECHOREPLY; goto reflect; case ICMP_TSTAMP: if (icmplen < ICMP_TSLEN) { icmpstat.icps_badlen++; goto free; } icp->icmp_type = ICMP_TSTAMPREPLY; icp->icmp_rtime = iptime(); icp->icmp_ttime = icp->icmp_rtime; /* bogus, do later! */ goto reflect; case ICMP_IREQ: #ifdef notdef /* fill in source address zero fields! */ goto reflect; #else goto free; /* not yet implemented: ignore */ #endif case ICMP_REDIRECT: case ICMP_ECHOREPLY: case ICMP_TSTAMPREPLY: case ICMP_IREQREPLY: if (icmplen < ICMP_ADVLENMIN || icmplen < ICMP_ADVLEN(icp)) { icmpstat.icps_badlen++; goto free; } /* * Short circuit routing redirects to force * immediate change in the kernel's routing * tables. The message is also handed to anyone * listening on a raw socket (e.g. the routing * daemon for use in updating it's tables). */ if (icp->icmp_type == ICMP_REDIRECT) { icmpsrc.sin_addr = icp->icmp_ip.ip_dst; icmpdst.sin_addr = icp->icmp_gwaddr; rtredirect((struct sockaddr *)&icmpsrc, (struct sockaddr *)&icmpdst); } icmpsrc.sin_addr = ip->ip_src; icmpdst.sin_addr = ip->ip_dst; raw_input(dtom(icp), &icmproto, (struct sockaddr *)&icmpsrc, (struct sockaddr *)&icmpdst); return; default: goto free; } reflect: ip->ip_len += hlen; /* since ip_input deducts this */ icmpstat.icps_reflect++; icmp_reflect(ip); return; free: m_freem(dtom(ip)); } /* * Reflect the ip packet back to the source * TODO: rearrange ip source routing options. */ icmp_reflect(ip) struct ip *ip; { struct in_addr t; t = ip->ip_dst; ip->ip_dst = ip->ip_src; ip->ip_src = t; icmp_send(ip); } /* * Send an icmp packet back to the ip level, * after supplying a checksum. */ icmp_send(ip) struct ip *ip; { register int hlen; register struct icmp *icp; register struct mbuf *m; m = dtom(ip); hlen = ip->ip_hl << 2; icp = mtod(m, struct icmp *); icp->icmp_cksum = 0; icp->icmp_cksum = in_cksum(m, ip->ip_len - hlen); m->m_off -= hlen; m->m_len += hlen; #ifdef ICMPPRINTFS if (icmpprintfs) printf("icmp_send dst %x src %x\n", ip->ip_dst, ip->ip_src); #endif (void) ip_output(m, (struct mbuf *)0, (struct route *)0, 0); } n_time iptime() { int s = spl6(); u_long t; t = ((lbolt/HZ) % (24*60*60)) * 1000 + (lbolt/HZ) / 1000; /* modif SV */ splx(s); return (htonl(t)); } E 1 h13781 s 00001/00001/00688 d D 4.7 87/05/20 13:27:37 brian 11 10 c mbuf.h put back on system search path BB e s 00002/00003/00687 d D 4.6 87/05/14 16:39:40 build 10 9 c removed old SCCS strings and inserted #ident BB e s 00001/00001/00689 d D 4.5 87/05/07 19:15:15 van 9 8 c van - move defsocket.h back to /usr/include/sys e s 00010/00010/00680 d D 4.4 87/04/30 19:24:31 van 8 7 c van - moved net and netinet includes e s 00003/00003/00687 d D 4.3 87/04/29 20:03:11 van 7 6 c van - moved ucb networking includes to INCUCB e s 00007/00007/00683 d D 4.2 87/04/15 17:56:12 dc 6 5 c dc - changed #include "sys/..." to #include e s 00000/00000/00690 d D 4.1 87/02/20 13:37:55 build 5 4 c rolled rev to -r4 /dc e s 00000/00000/00690 d D 3.1 87/01/19 09:28:56 build 4 3 c rolled rev to -r3 /dc e s 00000/00000/00690 d D 2.1 87/01/19 09:28:56 build 3 2 c AUTO NULL DELTA e s 00001/00000/00689 d D 1.2 87/01/16 10:24:26 build 2 1 c add ident string /dc e s 00689/00000/00000 d D 1.1 87/01/09 18:12:33 build 1 0 c Placed under source control - dc e u U f b f n t T I 2 D 10 /* "%W% %E%" */ E 2 I 1 static char sccsid[] = "@(#)Wed Apr 23 15:07:32 EET 1986~ BULL-SEMS V21 netinet/ip_input" ; /* @(#) Gipsi SPIX+SOCKET netinet/ip_input.c 1.1 85/08/06 E 10 I 10 #ident " %W% %E% " /* Gipsi SPIX+SOCKET netinet/ip_input.c 1.1 85/08/06 E 10 * d'apres 4.2bsd netinet/ip_input.c 6.1 83/08/16 * * - pour le temps on utilise la variable time de SV (ligne 55) * */ D 6 #include "sys/defsocket.h" /* SOC systeme V */ #include "sys/types.h" /* SOC systeme V */ #include "sys/param.h" #include "sys/systm.h" #include "sys/mbuf.h" #include "sys/socket.h" #include "sys/errno.h" E 6 I 6 D 7 #include /* SOC systeme V */ E 7 I 7 D 9 #include "sys/defsocket.h" /* SOC systeme V */ E 9 I 9 #include /* SOC systeme V */ E 9 E 7 #include /* SOC systeme V */ #include #include D 7 #include #include E 7 I 7 D 11 #include "sys/mbuf.h" E 11 I 11 #include E 11 #include "sys/socket.h" E 7 #include E 6 D 8 #include "../net/if.h" #include "../net/route.h" E 8 I 8 #include "net/if.h" #include "net/route.h" E 8 D 8 #include "in.h" #include "in_pcb.h" #include "in_systm.h" #include "ip.h" #include "ip_var.h" #include "ip_icmp.h" #include "tcp.h" E 8 I 8 #include "netinet/in.h" #include "netinet/in_pcb.h" #include "netinet/in_systm.h" #include "netinet/ip.h" #include "netinet/ip_var.h" #include "netinet/ip_icmp.h" #include "netinet/tcp.h" E 8 u_char ip_protox[IPPROTO_MAX]; int ipqmaxlen = IFQ_MAXLEN; struct ifnet *ifinet; /* first inet interface */ /* * IP initialization: fill in IP protocol switch table. * All protocols not implemented in kernel go to raw IP protocol handler. */ ip_init() { register struct protosw *pr; register int i; pr = pffindproto(PF_INET, IPPROTO_RAW); if (pr == 0) panic("ip_init"); for (i = 0; i < IPPROTO_MAX; i++) ip_protox[i] = pr - inetsw; for (pr = inetdomain.dom_protosw; pr <= inetdomain.dom_protoswNPROTOSW; pr++) if (pr->pr_family == PF_INET && pr->pr_protocol && pr->pr_protocol != IPPROTO_RAW) ip_protox[pr->pr_protocol] = pr - inetsw; ipq.next = ipq.prev = &ipq; ip_id = lbolt/HZ & 0xffff; /* modifie pour SV - attention c'est le temps en secondes depuis le dernier boot */ ipintrq.ifq_maxlen = ipqmaxlen; ifinet = if_ifwithaf(AF_INET); } int ipcksum = 1; /* SMX was u_char */ struct ip *ip_reass(); struct sockaddr_in ipaddr = { AF_INET }; /* * Ip input routine. Checksum and byte swap header. If fragmented * try to reassamble. If complete and fragment queue exists, discard. * Process options. Pass to next level. */ ipintr(m) struct mbuf *m; { register struct ip *ip; struct mbuf *m0; register int i; register struct ipq *fp; int hlen, s; next: /* * Get next datagram off input queue and get IP header * in first mbuf. */ #ifdef notdef s = splimp(); IF_DEQUEUE(&ipintrq, m); splx(s); #endif if (m == 0) return; if ((m->m_off > MMAXOFF || m->m_len < sizeof (struct ip)) && (m = m_pullup(m, sizeof (struct ip))) == 0) { ipstat.ips_toosmall++; return; /* goto next; */ } ip = mtod(m, struct ip *); if ((hlen = ip->ip_hl << 2) > m->m_len) { if ((m = m_pullup(m, hlen)) == 0) { ipstat.ips_badhlen++; return; /* goto next; */ } ip = mtod(m, struct ip *); } if (ipcksum) if (ip->ip_sum = in_cksum(m, hlen)) { ipstat.ips_badsum++; goto bad; } /* * Convert fields to host representation. */ ip->ip_len = ntohs((u_short)ip->ip_len); if (ip->ip_len < hlen) { ipstat.ips_badlen++; goto bad; } ip->ip_id = ntohs(ip->ip_id); ip->ip_off = ntohs((u_short)ip->ip_off); /* * Check that the amount of data in the buffers * is as at least much as the IP header would have us expect. * Trim mbufs if longer than we expect. * Drop packet if shorter than we expect. */ i = -ip->ip_len; m0 = m; for (;;) { i += m->m_len; if (m->m_next == 0) break; m = m->m_next; } if (i != 0) { if (i < 0) { ipstat.ips_tooshort++; goto bad; } if (i <= m->m_len) m->m_len -= i; else m_adj(m0, -i); } m = m0; /* * Process options and, if not destined for us, * ship it on. ip_dooptions returns 1 when an * error was detected (causing an icmp message * to be sent). */ if (hlen > sizeof (struct ip) && ip_dooptions(ip)) return; /* goto next; */ /* * Fast check on the first internet * interface in the list. */ if (ifinet) { struct sockaddr_in *sin; sin = (struct sockaddr_in *)&ifinet->if_addr; if (sin->sin_addr.s_addr == ip->ip_dst.s_addr) goto ours; sin = (struct sockaddr_in *)&ifinet->if_broadaddr; if ((ifinet->if_flags & IFF_BROADCAST) && sin->sin_addr.s_addr == ip->ip_dst.s_addr) goto ours; } /* BEGIN GROT */ D 8 #include "nd.h" E 8 I 8 #include "netinet/nd.h" E 8 #if NND > 0 /* * Diskless machines don't initially know * their address, so take packets from them * if we're acting as a network disk server. */ if (in_netof(ip->ip_dst) == INADDR_ANY && (in_netof(ip->ip_src) == INADDR_ANY && in_lnaof(ip->ip_src) != INADDR_ANY)) goto ours; #endif /* END GROT */ ipaddr.sin_addr = ip->ip_dst; if (if_ifwithaddr((struct sockaddr *)&ipaddr) == 0) { ip_forward(ip); return; /* goto next; */ } ours: /* * Look for queue of fragments * of this datagram. */ for (fp = ipq.next; fp != &ipq; fp = fp->next) if (ip->ip_id == fp->ipq_id && ip->ip_src.s_addr == fp->ipq_src.s_addr && ip->ip_dst.s_addr == fp->ipq_dst.s_addr && ip->ip_p == fp->ipq_p) goto found; fp = 0; found: /* * Adjust ip_len to not reflect header, * set ip_mff if more fragments are expected, * convert offset of this to bytes. */ ip->ip_len -= hlen; ((struct ipasfrag *)ip)->ipf_mff = 0; if (ip->ip_off & IP_MF) ((struct ipasfrag *)ip)->ipf_mff = 1; ip->ip_off <<= 3; /* * If datagram marked as having more fragments * or if this is not the first fragment, * attempt reassembly; if it succeeds, proceed. */ if (((struct ipasfrag *)ip)->ipf_mff || ip->ip_off) { ip = ip_reass((struct ipasfrag *)ip, fp); if (ip == 0) return; /* goto next; */ hlen = ip->ip_hl << 2; m = dtom(ip); } else if (fp) ip_freef(fp); /* * Switch out to protocol's input routine. */ (*inetsw[ip_protox[ip->ip_p]].pr_input)(m); return; /* goto next; */ bad: m_freem(m); return; /* goto next; */ } /* * Take incoming datagram fragment and try to * reassemble it into whole datagram. If a chain for * reassembly of this datagram already exists, then it * is given as fp; otherwise have to make a chain. */ struct ip * ip_reass(ip, fp) register struct ipasfrag *ip; register struct ipq *fp; { register struct mbuf *m = dtom(ip); register struct ipasfrag *q; struct mbuf *t; int hlen = ip->ip_hl << 2; int i, next; /* * Presence of header sizes in mbufs * would confuse code below. */ m->m_off += hlen; m->m_len -= hlen; /* * If first fragment to arrive, create a rea2 break; if (opt == IPOPT_NOP) optlen = 1; else optlen = cp[1]; switch (opt) { default: break; /* * Source routing with record. * Find interface with current destination address. * If none on this machine then drop if strictly routed, * or do nothing if loosely routed. * Record interface address and bring up next address * component. If strictly routed make sure next * address on directly accessible net. */ case IPOPT_LSRR: case IPOPT_SSRR: if (cp[2] < 4 || cp[2] > optlen - (sizeof (long) - 1)) break; sin = (struct in_addr *)(cp + cp[2]); ipaddr.sin_addr = *sin; ifp = if_ifwithaddr((struct sockaddr *)&ipaddr); type = ICMP_UNREACH, code = ICMP_UNREACH_SRCFAIL; if (ifp == 0) { if (opt == IPOPT_SSRR) goto bad; break; } t = ip->ip_dst; ip->ip_dst = *sin; *sin = t; cp[2] += 4; if (cp[2] > optlen - (sizeof (long) - 1)) break; ip->ip_dst = sin[1]; if (opt == IPOPT_SSRR && if_ifonnetof(in_netof(ip->ip_dst)) == 0) goto bad; break; case IPOPT_TS: code = cp - (u_char *)ip; type = ICMP_PARAMPROB; ipt = (struct ip_timestamp *)cp; if (ipt->ipt_len < 5) goto bad; if (ipt->ipt_ptr > ipt->ipt_len - sizeof (long)) { if (++ipt->ipt_oflw == 0) goto bad; break; } sin = (struct in_addr *)(cp+cp[2]); switch (ipt->ipt_flg) { case IPOPT_TS_TSONLY: break; case IPOPT_TS_TSANDADDR: if (ipt->ipt_ptr + 8 > ipt->ipt_len) goto bad; if (ifinet == 0) goto bad; /* ??? */ *sin++ = ((struct sockaddr_in *)&ifinet->if_addr)->sin_addr; break; case IPOPT_TS_PRESPEC: ipaddr.sin_addr = *sin; if (if_ifwithaddr((struct sockaddr *)&ipaddr) == 0) continue; if (ipt->ipt_ptr + 8 > ipt->ipt_len) goto bad; ipt->ipt_ptr += 4; break; default: goto bad; } *(n_time *)sin = iptime(); ipt->ipt_ptr += 4; } } return (0); bad: icmp_error(ip, type, code); return (1); } /* * Strip out IP options, at higher * level protocol in the kernel. * Second argument is buffer to which options * will be moved, and return value is their length. */ ip_stripoptions(ip, mopt) struct ip *ip; struct mbuf *mopt; { register int i; register struct mbuf *m; int olen; olen = (ip->ip_hl<<2) - sizeof (struct ip); m = dtom(ip); ip++; if (mopt) { mopt->m_len = olen; mopt->m_off = MMINOFF; bcopy((caddr_t)ip, mtod(m, caddr_t), (unsigned)olen); } i = m->m_len - (sizeof (struct ip) + olen); bcopy((caddr_t)ip+olen, (caddr_t)ip, (unsigned)i); m->m_len -= olen; } u_char inetctlerrmap[PRC_NCMDS] = { ECONNABORTED, ECONNABORTED, 0, 0, 0, 0, EHOSTDOWN, EHOSTUNREACH, ENETUNREACH, EHOSTUNREACH, ECONNREFUSED, ECONNREFUSED, EMSGSIZE, 0, 0, 0, 0, 0, 0, 0 }; ip_ctlinput(cmd, arg) int cmd; caddr_t arg; { struct in_addr *in; int tcp_abort(), udp_abort(); extern struct inpcb tcb, udb; if (cmd < 0 || cmd > PRC_NCMDS) return; if (inetctlerrmap[cmd] == 0) return; /* XXX */ if (cmd == PRC_IFDOWN) in = &((struct sockaddr_in *)arg)->sin_addr; else if (cmd == PRC_HOSTDEAD || cmd == PRC_HOSTUNREACH) in = (struct in_addr *)arg; else in = &((struct icmp *)arg)->icmp_ip.ip_dst; /* THIS IS VERY QUESTIONABLE, SHOULD HIT ALL PROTOCOLS */ in_pcbnotify(&tcb, in, (int)inetctlerrmap[cmd], tcp_abort); in_pcbnotify(&udb, in, (int)inetctlerrmap[cmd], udp_abort); } int ipprintfs = 0; int ipforwarding = 1; /* * Forward a packet. If some error occurs return the sender * and icmp packet. Note we can't always generate a meaningful * icmp message because icmp doesn't have a large enough repetoire * of codes and types. */ ip_forward(ip) register struct ip *ip; { register int error, type, code; struct mbuf *mopt, *mcopy; if (ipprintfs) printf("forward: src %x dst %x ttl %x\n", ip->ip_src, ip->ip_dst, ip->ip_ttl); if (ipforwarding == 0) { /* can't tell difference between net and host */ type = ICMP_UNREACH, code = ICMP_UNREACH_NET; goto sendicmp; } if (ip->ip_ttl < IPTTLDEC) { type = ICMP_TIMXCEED, code = ICMP_TIMXCEED_INTRANS; goto sendicmp; } ip->ip_ttl -= IPTTLDEC; mopt = m_get(M_DONTWAIT, MT_DATA); if (mopt == NULL) { m_freem(dtom(ip)); return; } /* * Save at most 64 bytes of the packet in case * we need to generate an ICMP message to the src. */ mcopy = m_copy(dtom(ip), 0, MIN(ip->ip_len, 64)); ip_stripoptions(ip, mopt); error = ip_output(dtom(ip), mopt, (struct route *)0, IP_FORWARDING); if (error == 0) { if (mcopy) m_freem(mcopy); return; } if (mcopy == NULL) return; ip = mtod(mcopy, struct ip *); type = ICMP_UNREACH, code = 0; /* need ``undefined'' */ switch (error) { case ENETUNREACH: case ENETDOWN: code = ICMP_UNREACH_NET; break; case EMSGSIZE: code = ICMP_UNREACH_NEEDFRAG; break; case EPERM: code = ICMP_UNREACH_PORT; break; case ENOBUFS: type = ICMP_SOURCEQUENCH; break; case EHOSTDOWN: case EHOSTUNREACH: code = ICMP_UNREACH_HOST; break; } sendicmp: icmp_error(ip, type, code); } E 1 h48684 s 00000/00000/00390 d R 4.5 87/05/20 13:28:06 brian 9 8 c mbuf.h put back on system search path BB e s 00002/00002/00388 d D 4.4 87/03/06 14:10:24 dc 8 7 c fix mbuf offset fetching (at nextBuf) e s 00004/00004/00386 d D 4.3 87/03/06 13:54:15 dc 7 6 c fix stored r8,r14,-16 e s 00329/00366/00061 d D 4.2 87/02/24 15:20:21 build 6 5 c van - add support for passing arguments in registers e s 00000/00000/00427 d D 4.1 87/02/20 13:37:33 build 5 4 c rolled rev to -r4 /dc e s 00000/00000/00427 d D 3.1 87/01/19 09:28:42 build 4 3 c rolled rev to -r3 /dc e s 00000/00000/00427 d D 2.1 87/01/19 09:28:42 build 3 2 c AUTO NULL DELTA e s 00001/00000/00426 d D 1.2 87/01/16 10:24:04 build 2 1 c add ident string /dc e s 00426/00000/00000 d D 1.1 87/01/09 18:12:46 build 1 0 c Placed under source control - dc e u U f b f n t T I 2 ; "%W% %E%" I 6 ; "@(#)in_cksum.c 3.1 6/19/85" ; in_cksum.c 6.1 84/09/13 E 6 E 2 I 1 csect code D 6 align 2 E 6 I 6 align 4 E 6 global _in_cksum I 6 ; Checksum routine for Internet Protocol family headers (Ridge Version). ; ; This routine is very heavily used in the network code and ; should be modified for each CPU to be as fast as possible. ; It performs the 16 bit summation of the data stream taken ; 16 bits at a time. If there are an odd number of bytes, ; then the last byte is padded with zeroes to be a 16 bit ; quantity. TRUE equ 1 FALSE equ 0 SFSize equ 72 ;in_cksum(m, len) ; ;ENTRY: ; m r0 ; len r1 ;EXIT: ; sum r0 ;INTERNAL: ; r0 scratch (m on entry) ; len r1 local ; m r2 local ; r3 scratch; data to be checksummed ; r4 scratch; data to be checksummed ; r5 scratch; shift count ; mlen r6 local ; oddbyte r7 local ; sum r8 local ; w r9 local E 6 _in_cksum: D 6 ;line 31 store r11,r14,0 E 6 I 6 store LINK,r14,0 #ifndef ARGSINREGS E 6 store r15,r14,8 move r15,r14 D 6 laddr r14,r14,-72 store r8,r15,-12 E 6 I 6 #endif laddr r14,r14,-SFSize #ifdef ARGSINREGS D 7 stored r8,r14,SFSize-12; save registers E 7 I 7 stored r8,r14,SFSize-16; save registers E 7 stored r6,r14,SFSize-8 move r2,r0 #else D 7 stored r8,r15,-12 ; save registers E 7 I 7 stored r8,r15,-16 ; save registers E 7 E 6 stored r6,r15,-8 load r2,r15,24 D 6 load r6,r15,32 ;line 37 store r9,r15,-16 ;line 38 store r10,r15,-20 ;line 39 TRUE equ 1 ;line 40 FALSE equ 0 ;line 42 move r8,0 ;line 43 loadh r1,r2,8 seh r1,r1 ;line 44 move r7,0 ;line 46 L37: ;line 47 load r0,r2,4 add r0,r2 move r3,r0 ;line 53 br r6>=r1,L35 ;line 54 move r1,r6 E 6 I 6 load r1,r15,32 #endif move r8,0 ; sum = 0 loadh r6,r2,8 ; mlen = m->m_len; seh r6,r6 move r7,FALSE ; oddbyte = FALSE; nextBuf: ; for (;;) { D 8 load r9,r0,4 ; w = mtod(m, char *); add r9,r2 E 8 I 8 load r9,r2,4 ; w = mtod(m, char *); add r9,r2 ; get address of data in mbuf E 8 ; ; Calculate how much of the data in the current mbuf will be ; included in the checksum. Update the length remaining based ; on this. ; br r1>=r6,L35 ; if (len < mlen) move r6,r1 ; mlen = len; E 6 L35: D 6 ;line 55 sub r6,r1 ;line 68 br r1<1,L29 move r0,r3 E 6 I 6 sub r1,r6 ; len -= mlen; ; ; If the data in an mbuf starts on an odd byte boundary, we ; will process the first byte separately, and then process ; the rest of the buffer. If this is the first buffer, or ; the last abuffer terminated on a halfword boundary, this ; character must be added into the high byte of the checksum. ; We then act as if the previous buffer terminated on an oddbyte ; boundary for processing the rest of the buffer. If the last ; buffer terminated on an oddbyte boundary, the first byte of ; the current buffer is added into the low byte of the checksum, ; and the buffer is treated as a non-oddbyte continuation buffer. ; br r6<1,startEven ; if (mlen >= 1 && ((int)w & 0x1)) { move r0,r9 E 6 and r0,1 D 6 br r0=0,L29 ;line 70 br r7<>0,L32 ;line 71 laddr r0,0 ;line 72 loadb r9,r3 ;line 73 lsl r9,8 ;line 74 eadd r8,r9 ;line 75 laddr r9,0 ;line 76 eadd r8,r9 ;line 77 add r3,1 ;line 78 sub r1,1 ;line 79 laddr r7,TRUE ;line 80 br L30 E 6 I 6 br r0=0,startEven /* printf("ns: cksum: mbuf starts on odd byte\n"); */ br r7<>0,L32 ; if (!oddbyte) { laddr r0,0 ; clear carry/overflow for eadd loadb r3,r9 ; get the oddbyte lsl r3,8 ; shift it to the hi byte eadd r8,r3 ; add it into the checksum laddr r3,0 ; add in any carry generated eadd r8,r3 ; but not overflow add r9,1 ; update w (the pointer to the data) sub r6,1 ; update mlen laddr r7,TRUE ; set oddbyte br L30 ; } else { E 6 L32: D 6 ;line 81 laddr r0,0 ;line 82 loadb r9,r3 ;line 83 eadd r8,r9 ;line 84 laddr r9,0 ;line 85 eadd r8,r9 ;line 86 add r3,1 ;line 87 sub r1,1 ;line 88 laddr r7,FALSE ;line 89 L30: ;line 90 L29: ;line 110 br r7<>0,L28 ;line 111 br r1<2,L18 move r0,r3 E 6 I 6 laddr r0,0 ; clear carry/overflow for eadd loadb r3,r9 ; get the oddbyte eadd r8,r3 ; add it into the checksum laddr r3,0 ; add in any carry generated eadd r8,r3 ; but not overflow add r9,1 ; update w (the pointer to the data) sub r6,1 ; update mlen laddr r7,FALSE ; clear oddbyte L30: ; } startEven: ; } ; ; There are two major cases to consider. If data is continued ; from the current mbuf to another, then the current mbuf may ; terminate on a halfword boundary or on a byte boundary. The ; following assembler code processes the first case. The code ; to handle the second case is almost identical, except that it ; does shifts of the data to get the right byte allignment. The ; code could be combined, using a shift value of zero for the ; case which does not need to be shifted. For speed purpose in ; the standard case (which is that mbufs which are continued are ; halfword alligned), I have chosen not to combine the code. ; ; WARNING: ; ; If the following assembly code is modified, check the else ; part of the loop to see if it needs modification also. ; br r7<>0,L28 ; if (!oddbyte) { br r6<2,L18 ; if (mlen >= 2 && ((int)w & 0x3)) { /* process a leading halfword */ move r0,r9 E 6 and r0,3 br r0=0,L18 D 6 ;line 112 laddr r0,0 ;line 113 loadh r9,r3 ;line 114 eadd r8,r9 ;line 115 laddr r9,0 ;line 116 eadd r8,r9 ;line 117 add r3,2 ;line 118 sub r1,2 ;line 119 L18: ;line 120 br r1<4,L15 move r0,r3 E 6 I 6 laddr r0,0 ; clear carry/overflow for eadd loadh r3,r9 ; get the halfword eadd r8,r3 ; add it into the checksum laddr r3,0 ; add in any carry generated eadd r8,r3 ; but not overflow add r9,2 ; update w (the pointer to the data) sub r6,2 ; update mlen L18: ; } br r6<4,L15 ; if (mlen >= 4 && ((int)w & 0x7)) { /* process a leading word */ move r0,r9 E 6 and r0,7 br r0=0,L15 D 6 ;line 121 laddr r0,0 ;line 122 load r9,r3 ;line 123 eadd r8,r9 ;line 124 laddr r9,0 ;line 125 eadd r8,r9 ;line 126 add r3,4 ;line 127 sub r1,4 ;line 128 L15: ;line 135 laddr r0,0 ;line 136 br r1 < 8,sum4bytes ;line 137 sub r1,7 ;line 138 neg r1,r1 ;line 139 sumLoop: ;line 140 loadd r9,r3 ;line 141 eadd r8,r9 ;line 142 eadd r8,r10 ;line 143 add r3,8 ;line 144 loop r1,8,sumLoop ;line 145 neg r1,r1 ;line 146 add r1,7 ;line 150 E 6 I 6 laddr r0,0 ; clear carry/overflow for eadd load r3,r9 ; get the word eadd r8,r3 ; add it into the checksum laddr r3,0 ; add in any carry generated eadd r8,r3 ; but not overflow add r9,4 ; update w (the pointer to the data) sub r6,4 ; update mlen L15: ; } ; ; Do as much of the checksum as possible, 8 bytes at ; a time. Note that mlen is adjusted for the loop to ; optimally get the correct number of 8 byte chunks. ; It is restored before getting smaller chunks. ; laddr r0,0 ; clear carry/overflow for eadd br r6 < 8,sum4bytes ; branch if no 8 byte chunks left sub r6,7 ; adjust mlen as loop counter neg r6,r6 sumLoop: ; process the next 8 byte chunk loadd r3,r9 ; get the double word eadd r8,r3 ; add the 1st word into the checksum eadd r8,r4 ; add the 2nd into the checksum add r9,8 ; update w (the pointer to the data) loop r6,8,sumLoop ; update mlen & go do next 8 bytes neg r6,r6 ; readjust mlen add r6,7 ; ; Do the next 4 bytes of the checksum if possible. ; E 6 sum4bytes: D 6 ;line 151 br r1 < 4,sum2bytes ;line 152 load r9,r3 ;line 153 eadd r8,r9 ;line 154 add r3,4 ;line 155 sub r1,4 ;line 159 E 6 I 6 br r6 < 4,sum2bytes ; branch if no 4 byte chunk left load r3,r9 ; get the word eadd r8,r3 ; add it into the checksum add r9,4 ; update w (the pointer to the data) sub r6,4 ; update mlen ; ; Do the next 2 bytes of the checksum if possible. ; E 6 sum2bytes: D 6 ;line 160 br r1 < 2,sum1byte ;line 161 loadh r9,r3 ;line 162 eadd r8,r9 ;line 163 add r3,2 ;line 164 sub r1,2 ;line 172 E 6 I 6 br r6 < 2,sum1byte ; branch if no halfword left loadh r3,r9 ; get the halfword eadd r8,r3 ; add it into the checksum add r9,2 ; update w (the pointer to the data) sub r6,2 ; update mlen ; ; Do the remaining odd byte of the checksum if any. ; Note that it is added into the high byte. In case ; the data is continued into another mbuf, set the ; oddbyte flag to be true, so that the data from the ; next mbuf will be alligned correctly. ; E 6 sum1byte: D 6 ;line 173 br r1 <> 1,sumCarry ;line 174 loadb r9,r3 ;line 175 lsl r9,8 ;line 176 eadd r8,r9 ;line 177 laddr r7,TRUE ;line 178 E 6 I 6 br r6 <> 1,sumCarry ; branch if no odd byte loadb r3,r9 ; get the odd byte lsl r3,8 ; left justify it within a halfword eadd r8,r3 ; add it to the checksum laddr r7,TRUE ; set oddbyte E 6 sumCarry: D 6 ;line 179 laddr r9,0 ;line 180 eadd r8,r9 ;line 181 br L14 E 6 I 6 laddr r3,0 ; add in the last carry but not eadd r8,r3 ; overflow (so can't just add r0) br L14 ; } else { ; ; This code handles the case where the previous mbuf ; terminated on an odd byte. This means the bytes ; from the current mbuf must be swapped before being ; added into the checksum. Note that the order of ; the halfwords is not important, only the allignment ; of the bytes within the halfword. For this reason ; we can use the circular shift left instruction to ; get the correct byte allignment, and then add as ; usual. ; E 6 L28: D 6 ;line 193 br r1<2,L25 move r0,r3 E 6 I 6 br r6<2,L25 ; if (mlen >= 2 && ((int)w & 0x3)) { /* process a leading halfword */ move r0,r9 E 6 and r0,3 br r0=0,L25 D 6 ;line 194 laddr r0,0 ;line 195 loadh r9,r3 ;line 196 laddr r4,8 ;line 197 csl r9,r4 ;line 198 eadd r8,r9 ;line 199 laddr r9,0 ;line 200 eadd r8,r9 ;line 201 add r3,2 ;line 202 sub r1,2 ;line 203 L25: ;line 204 br r1<4,L22 move r0,r3 E 6 I 6 laddr r0,0 ; clear carry/overflow for eadd loadh r3,r9 ; get the halfword laddr r5,8 ; swap the hi & lo bytes csl r3,r5 eadd r8,r3 ; add it into the checksum laddr r3,0 ; add in any carry generated eadd r8,r3 ; but not overflow add r9,2 ; update w (the pointer to the data) sub r6,2 ; update mlen L25: ; } br r6<4,L22 ; if (mlen >= 4 && ((int)w & 0x7)) { /* process a leading word */ move r0,r9 E 6 and r0,7 br r0=0,L22 D 6 ;line 205 laddr r0,0 ;line 206 load r9,r3 ;line 207 laddr r4,8 ;line 208 csl r9,r4 ;line 209 eadd r8,r9 ;line 210 laddr r9,0 ;line 211 eadd r8,r9 ;line 212 add r3,4 ;line 213 sub r1,4 ;line 214 L22: ;line 221 laddr r0,0 ;line 222 laddr r4,8 ;line 223 br r1 < 8,sum4oddBytes ;line 224 sub r1,7 ;line 225 neg r1,r1 ;line 226 sumOddLoop: ;line 227 loadd r9,r3 ;line 228 csl r9,r4 ;line 229 eadd r8,r9 ;line 230 csl r10,r4 ;line 231 eadd r8,r10 ;line 232 add r3,8 ;line 233 loop r1,8,sumOddLoop ;line 234 neg r1,r1 ;line 235 add r1,7 ;line 239 E 6 I 6 laddr r0,0 ; clear carry/overflow for eadd load r3,r9 ; get the word laddr r5,8 ; swap the hi & lo bytes csl r3,r5 eadd r8,r3 ; add it into the checksum laddr r3,0 ; add in any carry generated eadd r8,r3 ; but not overflow add r9,4 ; update w (the pointer to the data) sub r6,4 ; update mlen L22: ; } ; ; Do as much of the checksum as possible, 8 bytes at ; a time. Note that mlen is adjusted for the loop to ; optimally get the correct number of 8 byte chunks. ; It is restored before getting smaller chunks. ; laddr r0,0 ; clear carry/overflow for eadd laddr r5,8 ; use later to swap hi & lo bytes br r6 < 8,sum4oddBytes ; branch if no 8 byte chunks left sub r6,7 ; adjust mlen as loop counter neg r6,r6 sumOddLoop: ; process the next 8 byte chunk loadd r3,r9 ; get the double word csl r3,r5 ; swap hi & lo bytes eadd r8,r3 ; add the 1st word into the checksum csl r4,r5 ; swap hi & lo bytes eadd r8,r4 ; add the 2nd into the checksum add r9,8 ; update w (the pointer to the data) loop r6,8,sumOddLoop ; update mlen & go do next 8 bytes neg r6,r6 ; readjust mlen add r6,7 ; ; Do the next 4 bytes of the checksum if possible. ; E 6 sum4oddBytes: D 6 ;line 240 br r1 < 4,sum2oddBytes ;line 241 load r9,r3 ;line 242 csl r9,r4 ;line 243 eadd r8,r9 ;line 244 add r3,4 ;line 245 sub r1,4 ;line 249 E 6 I 6 br r6 < 4,sum2oddBytes ; branch if no 4 byte chunk left load r3,r9 ; get the word csl r3,r5 ; swap hi & lo bytes eadd r8,r3 ; add it into the checksum add r9,4 ; update w (the pointer to the data) sub r6,4 ; update mlen ; ; Do the next 2 bytes of the checksum if possible. ; E 6 sum2oddBytes: D 6 ;line 250 br r1 < 2,sum1oddByte ;line 251 loadh r9,r3 ;line 252 csl r9,r4 ;line 253 eadd r8,r9 ;line 254 add r3,2 ;line 255 sub r1,2 ;line 266 E 6 I 6 br r6 < 2,sum1oddByte ; branch if no halfword left loadh r3,r9 ; get the halfword csl r3,r5 ; swap hi & lo bytes eadd r8,r3 ; add it into the checksum add r9,2 ; update w (the pointer to the data) sub r6,2 ; update mlen ; ; Do the remaining odd byte of the checksum if any. ; Note that while it is normally added into the high ; byte, since we are operating in byte swap mode ; it will be added into the low byte instead. In ; case the data is continued into the next mbuf, we ; will clear the oddbyte flag if there's an odd byte ; in this mbuf, so that the next mbuf will be ; processed in non-byte swap mode. ; E 6 sum1oddByte: D 6 ;line 267 br r1 <> 1,sumOddCarry ;line 268 loadb r9,r3 ;line 269 eadd r8,r9 ;line 270 laddr r7,FALSE ;line 271 E 6 I 6 br r6 <> 1,sumOddCarry ; branch if no odd byte loadb r3,r9 ; get the odd byte eadd r8,r3 ; add it to the checksum laddr r7,FALSE ; clear oddbyte flag E 6 sumOddCarry: D 6 ;line 272 laddr r9,0 ;line 273 eadd r8,r9 ;line 274 L14: ;line 279 br r6<>0,L13 ;line 280 br L2 E 6 I 6 laddr r3,0 ; add in the last carry but not eadd r8,r3 ; overflow (so can't just add r0) L14: ; } ; ; If we are done with the byte count specified, then ; just exit the for loop. ; br r1<>0,L13 ; if (len == 0) br L2 ; break; ; ; If we need to include more data in the checksum, then ; we need to get another mbuf, if any are available. ; E 6 L13: D 6 ;line 285 L12: ;line 286 load r2,r2 ;line 287 br r2<>0,L11 ;line 288 laddr r0,L41,l E 6 I 6 L12: ; for (;;) { load r2,r2 ; m = m->m_next; br r2<>0,L11 ; if (m == 0) { laddr r0,L41,l ; printf("ns: cksum: out of data\n"); #ifndef ARGSINREGS E 6 store r0,r14,24 D 6 call r11,_printf,l ;line 289 br L2 L11: ;line 291 loadh r1,r2,8 seh r1,r1 move r0,r1 br r0=0,L10 ;line 292 br L7 L10: ;line 293 br L12 L7: ;line 294 br L37 E 6 I 6 #endif call LINK,_printf,l br L2 ; goto done; L11: ; } loadh r6,r2,8 ; if (mlen = m->m_len) seh r6,r6 move r0,r6 br r0=0,L12 ; break; ; } br nextBuf ; } E 6 L2: D 6 ;line 301 move r1,r8 E 6 I 6 ; ; Add in the ones complement carry which has been accumulating ; in the high order half word. Then add the carry from that ; addition. ; done: move r1,r8 ; sum = (sum & 0xffff) + (sum >> 16); /* add 16 bit carry out */ E 6 laddr r0,65535,l and r1,r0 D 6 move r0,r8 E 6 laddr r2,16 D 6 lsr r0,r2 add r0,r1 move r8,r0 ;line 302 move r1,r8 laddr r0,65535,l E 6 I 6 lsr r8,r2 add r8,r1 move r1,r8 ; sum = (sum & 0xffff) + (sum >> 16); /* add resultant carry out*/ E 6 and r1,r0 D 6 move r0,r8 laddr r2,16 lsr r0,r2 add r0,r1 move r8,r0 ;line 303 load r9,r15,-16 ;line 304 load r10,r15,-20 ;line 305 not r1,r8 laddr r0,65535,l and r1,r0 move r0,r1 loadd r6,r15,-8 load r8,r15,-12 load r11,r15,0 E 6 I 6 lsr r8,r2 add r8,r1 not r1,r8 ; return(~sum & 0xffff); and r0,r1 #ifdef ARGSINREGS loadd r6,r14,SFSize-8 ; restore registers D 7 loadd r8,r14,SFSize-12 E 7 I 7 loadd r8,r14,SFSize-16 E 7 laddr r14,r14,SFSize #else loadd r6,r15,-8 ; restore registers D 7 loadd r8,r15,-12 E 7 I 7 loadd r8,r15,-16 E 7 E 6 move r14,r15 load r15,r15,8 D 6 ret r11,r11 E 6 I 6 #endif load LINK,r14,0 ret LINK,LINK E 6 dsect data align 8 D 6 ;_w r3 local ;_sum r8 local ;_mlen r1 local ;_oddbyte r7 local E 6 ;L40 L41 static dsect data align 8 dsect data align 8 L41: L40: byte 110,115,58,32,99,107,115,117,109,58 byte 32,111,117,116,32,111,102,32,100,97 byte 116,97,10,0 D 6 csect code align 2 ;_m r2 local ;_len r6 local E 6 csect code dsect data align 8 common _mbstat,522 common _nmbclusters,4 common _mbfree,4 common _mclfree,4 dsect data align 8 csect code E 1 h52712 s 00001/00001/00225 d D 4.7 87/05/20 13:28:26 brian 11 10 c mbuf.h put back on system search path BB e s 00001/00002/00225 d D 4.6 87/05/14 16:39:54 build 10 9 c removed old SCCS strings and inserted #ident BB e s 00001/00001/00226 d D 4.5 87/05/07 19:15:23 van 9 8 c van - move defsocket.h back to /usr/include/sys e s 00006/00006/00221 d D 4.4 87/04/30 19:24:34 van 8 7 c van - moved net and netinet includes e s 00004/00004/00223 d D 4.3 87/04/29 20:03:16 van 7 6 c van - moved ucb networking includes to INCUCB e s 00007/00007/00220 d D 4.2 87/04/15 17:56:24 dc 6 5 c dc - changed #include "sys/..." to #include e s 00000/00000/00227 d D 4.1 87/02/20 13:38:05 build 5 4 c rolled rev to -r4 /dc e s 00000/00000/00227 d D 3.1 87/01/19 09:29:02 build 4 3 c rolled rev to -r3 /dc e s 00000/00000/00227 d D 2.1 87/01/19 09:29:02 build 3 2 c AUTO NULL DELTA e s 00001/00000/00226 d D 1.2 87/01/16 10:24:34 build 2 1 c add ident string /dc e s 00226/00000/00000 d D 1.1 87/01/09 18:12:34 build 1 0 c Placed under source control - dc e u U f b f n t T I 2 D 10 /* "%W% %E%" */ E 2 I 1 static char sccsid[] = "@(#)Wed Apr 23 15:07:53 EET 1986~ BULL-SEMS V21 netinet/ip_output" ; E 10 I 10 #ident " %W% %E% " E 10 /* ip_output.c 6.2 83/10/22 */ D 6 #include "sys/defsocket.h" /* SOC systeme V */ #include "sys/types.h" /* SOC systeme V */ #include "sys/param.h" #include "sys/mbuf.h" #include "sys/errno.h" /* SOC systeme V */ #include "sys/socket.h" #include "sys/socketvar.h" E 6 I 6 D 7 #include /* SOC systeme V */ E 7 I 7 D 9 #include "sys/defsocket.h" /* SOC systeme V */ E 9 I 9 #include /* SOC systeme V */ E 9 E 7 #include /* SOC systeme V */ #include D 7 #include E 7 I 7 D 11 #include "sys/mbuf.h" E 11 I 11 #include E 11 E 7 #include /* SOC systeme V */ D 7 #include #include E 7 I 7 #include "sys/socket.h" #include "sys/socketvar.h" E 7 E 6 D 8 #include "../net/if.h" #include "../net/route.h" E 8 I 8 #include "net/if.h" #include "net/route.h" E 8 D 8 #include "in.h" #include "in_systm.h" #include "ip.h" #include "ip_var.h" E 8 I 8 #include "netinet/in.h" #include "netinet/in_systm.h" #include "netinet/ip.h" #include "netinet/ip_var.h" E 8 #ifdef vax #include "../vax/mtpr.h" #endif ip_output(m, opt, ro, flags) struct mbuf *m; struct mbuf *opt; struct route *ro; int flags; { register struct ip *ip = mtod(m, struct ip *); register struct ifnet *ifp; int len, hlen = sizeof (struct ip), off, error = 0; struct route iproute; struct sockaddr *dst; if (opt) /* XXX */ (void) m_free(opt); /* XXX */ /* * Fill in IP header. */ ip->ip_hl = hlen >> 2; if ((flags & IP_FORWARDING) == 0) { ip->ip_v = IPVERSION; ip->ip_off &= IP_DF; ip->ip_id = htons(ip_id++); } /* * Route packet. */ if (ro == 0) { ro = &iproute; bzero((caddr_t)ro, sizeof (*ro)); } dst = &ro->ro_dst; if (ro->ro_rt == 0) { ro->ro_dst.sa_family = AF_INET; ((struct sockaddr_in *)&ro->ro_dst)->sin_addr = ip->ip_dst; /* * If routing to interface only, * short circuit routing lookup. */ if (flags & IP_ROUTETOIF) { ifp = if_ifonnetof(in_netof(ip->ip_dst)); if (ifp == 0) { error = ENETUNREACH; goto bad; } goto gotif; } rtalloc(ro); } if (ro->ro_rt == 0 || (ifp = ro->ro_rt->rt_ifp) == 0) { error = ENETUNREACH; goto bad; } ro->ro_rt->rt_use++; if (ro->ro_rt->rt_flags & (RTF_GATEWAY|RTF_HOST)) dst = &ro->ro_rt->rt_gateway; gotif: #ifndef notdef /* * If source address not specified yet, use address * of outgoing interface. */ if (in_lnaof(ip->ip_src) == INADDR_ANY) ip->ip_src.s_addr = ((struct sockaddr_in *)&ifp->if_addr)->sin_addr.s_addr; #endif /* * Look for broadcast address and * and verify user is allowed to send * such a packet. */ if (in_lnaof(((struct sockaddr_in *)dst)->sin_addr) == INADDR_ANY) { if ((ifp->if_flags & IFF_BROADCAST) == 0) { error = EADDRNOTAVAIL; goto bad; } if ((flags & IP_ALLOWBROADCAST) == 0) { error = EACCES; goto bad; } /* don't allow broadcast messages to be fragmented */ if (ip->ip_len > ifp->if_mtu) { error = EMSGSIZE; goto bad; } } /* * If small enough for interface, can just send directly. */ if (ip->ip_len <= ifp->if_mtu) { ip->ip_len = htons((u_short)ip->ip_len); ip->ip_off = htons((u_short)ip->ip_off); ip->ip_sum = 0; ip->ip_sum = in_cksum(m, hlen); error = (*ifp->if_output)(ifp, m, dst); goto done; } /* * Too large for interface; fragment if possible. * Must be able to put at least 8 bytes per fragment. */ if (ip->ip_off & IP_DF) { error = EMSGSIZE; goto bad; } len = (ifp->if_mtu - hlen) &~ 7; if (len < 8) { error = EMSGSIZE; goto bad; } /* * Discard IP header from logical mbuf for m_copy's sake. * Loop through length of segment, make a copy of each * part and output. */ m->m_len -= sizeof (struct ip); m->m_off += sizeof (struct ip); for (off = 0; off < ip->ip_len-hlen; off += len) { struct mbuf *mh = m_get(M_DONTWAIT, MT_HEADER); struct ip *mhip; if (mh == 0) { error = ENOBUFS; goto bad; } mh->m_off = MMAXOFF - hlen; mhip = mtod(mh, struct ip *); *mhip = *ip; if (hlen > sizeof (struct ip)) { int olen = ip_optcopy(ip, mhip, off); mh->m_len = sizeof (struct ip) + olen; } else mh->m_len = sizeof (struct ip); mhip->ip_off = off >> 3; if (off + len >= ip->ip_len-hlen) len = mhip->ip_len = ip->ip_len - hlen - off; else { mhip->ip_len = len; mhip->ip_off |= IP_MF; } mhip->ip_len += sizeof (struct ip); mhip->ip_len = htons((u_short)mhip->ip_len); mh->m_next = m_copy(m, off, len); if (mh->m_next == 0) { (void) m_free(mh); error = ENOBUFS; /* ??? */ goto bad; } mhip->ip_off = htons((u_short)mhip->ip_off); mhip->ip_sum = 0; mhip->ip_sum = in_cksum(mh, hlen); if (error = (*ifp->if_output)(ifp, mh, dst)) break; } m_freem(m); goto done; bad: m_freem(m); done: if (ro == &iproute && (flags & IP_ROUTETOIF) == 0 && ro->ro_rt) RTFREE(ro->ro_rt); return (error); } /* * Copy options from ip to jp. * If off is 0 all options are copied * otherwise copy selectively. */ ip_optcopy(ip, jp, off) struct ip *ip, *jp; int off; { register u_char *cp, *dp; int opt, optlen, cnt; cp = (u_char *)(ip + 1); dp = (u_char *)(jp + 1); cnt = (ip->ip_hl << 2) - sizeof (struct ip); for (; cnt > 0; cnt -= optlen, cp += optlen) { opt = cp[0]; if (opt == IPOPT_EOL) break; if (opt == IPOPT_NOP) optlen = 1; else optlen = cp[1]; if (optlen > cnt) /* XXX */ optlen = cnt; /* XXX */ if (off == 0 || IPOPT_COPIED(opt)) { bcopy((caddr_t)cp, (caddr_t)dp, (unsigned)optlen); dp += optlen; } } for (optlen = dp - (u_char *)(jp+1); optlen & 0x3; optlen++) *dp++ = IPOPT_EOL; return (optlen); } E 1 h36276 s 00001/00001/00096 d D 4.7 87/05/20 13:28:43 brian 11 10 c mbuf.h put back on system search path BB e s 00001/00002/00096 d D 4.6 87/05/14 16:40:10 build 10 9 c removed old SCCS strings and inserted #ident BB e s 00001/00001/00097 d D 4.5 87/05/07 19:15:29 van 9 8 c van - move defsocket.h back to /usr/include/sys e s 00007/00007/00091 d D 4.4 87/04/30 19:24:35 van 8 7 c van - moved net and netinet includes e s 00004/00004/00094 d D 4.3 87/04/29 20:03:19 van 7 6 c van - moved ucb networking includes to INCUCB e s 00007/00007/00091 d D 4.2 87/04/15 17:56:31 dc 6 5 c dc - changed #include "sys/..." to #include e s 00000/00000/00098 d D 4.1 87/02/20 13:38:10 build 5 4 c rolled rev to -r4 /dc e s 00000/00000/00098 d D 3.1 87/01/19 09:29:04 build 4 3 c rolled rev to -r3 /dc e s 00000/00000/00098 d D 2.1 87/01/19 09:29:04 build 3 2 c AUTO NULL DELTA e s 00001/00000/00097 d D 1.2 87/01/16 10:24:37 build 2 1 c add ident string /dc e s 00097/00000/00000 d D 1.1 87/01/09 18:12:35 build 1 0 c Placed under source control - dc e u U f b f n t T I 2 D 10 /* "%W% %E%" */ E 2 I 1 static char sccsid[] = "@(#)Wed Apr 23 15:08:04 EET 1986~ BULL-SEMS V21 netinet/raw_ip" ; E 10 I 10 #ident " %W% %E% " E 10 /* raw_ip.c 6.1 83/07/29 */ D 6 #include "sys/defsocket.h" #include "sys/types.h" E 6 I 6 D 7 #include E 7 I 7 D 9 #include "sys/defsocket.h" E 9 I 9 #include E 9 E 7 #include E 6 D 6 #include "sys/param.h" #include "sys/mbuf.h" #include "sys/socket.h" #include "sys/socketvar.h" #include "sys/errno.h" E 6 I 6 #include D 7 #include #include #include E 7 I 7 D 11 #include "sys/mbuf.h" E 11 I 11 #include E 11 #include "sys/socket.h" #include "sys/socketvar.h" E 7 #include E 6 D 8 #include "../net/if.h" #include "../net/route.h" #include "../net/raw_cb.h" E 8 I 8 #include "net/if.h" #include "net/route.h" #include "net/raw_cb.h" E 8 D 8 #include "in.h" #include "in_systm.h" #include "ip.h" #include "ip_var.h" E 8 I 8 #include "netinet/in.h" #include "netinet/in_systm.h" #include "netinet/ip.h" #include "netinet/ip_var.h" E 8 /* * Raw interface to IP protocol. */ struct sockaddr_in ripdst = { AF_INET }; struct sockaddr_in ripsrc = { AF_INET }; struct sockproto ripproto = { PF_INET }; /* * Setup generic address and protocol structures * for raw_input routine, then pass them along with * mbuf chain. */ rip_input(m) struct mbuf *m; { register struct ip *ip = mtod(m, struct ip *); ripproto.sp_protocol = ip->ip_p; ripdst.sin_addr = ip->ip_dst; ripsrc.sin_addr = ip->ip_src; raw_input(m, &ripproto, (struct sockaddr *)&ripsrc, (struct sockaddr *)&ripdst); } /* * Generate IP header and pass packet to ip_output. * Tack on options user may have setup with control call. */ rip_output(m0, so) struct mbuf *m0; struct socket *so; { register struct mbuf *m; register struct ip *ip; int len = 0, error; struct rawcb *rp = sotorawcb(so); struct sockaddr_in *sin; /* * Calculate data length and get an mbuf * for IP header. */ for (m = m0; m; m = m->m_next) len += m->m_len; m = m_get(M_DONTWAIT, MT_HEADER); if (m == 0) { error = ENOBUFS; goto bad; } /* * Fill in IP header as needed. */ m->m_off = MMAXOFF - sizeof(struct ip); m->m_len = sizeof(struct ip); m->m_next = m0; ip = mtod(m, struct ip *); ip->ip_p = so->so_proto->pr_protocol; ip->ip_len = sizeof(struct ip) + len; if (rp->rcb_flags & RAW_LADDR) { sin = (struct sockaddr_in *)&rp->rcb_laddr; if (sin->sin_family != AF_INET) { error = EAFNOSUPPORT; goto bad; } ip->ip_src.s_addr = sin->sin_addr.s_addr; } else ip->ip_src.s_addr = 0; ip->ip_dst = ((struct sockaddr_in *)&rp->rcb_faddr)->sin_addr; ip->ip_ttl = MAXTTL; return (ip_output(m, (struct mbuf *)0, &rp->rcb_route, IP_ROUTETOIF|IP_ALLOWBROADCAST)); bad: m_freem(m); return (error); } E 1 h20349 s 00001/00001/00123 d D 4.7 87/05/20 13:28:58 brian 11 10 c mbuf.h put back on system search path BB e s 00001/00002/00123 d D 4.6 87/05/14 16:40:22 build 10 9 c removed old SCCS strings and inserted #ident BB e s 00001/00001/00124 d D 4.5 87/05/07 19:15:32 van 9 8 c van - move defsocket.h back to /usr/include/sys e s 00014/00014/00111 d D 4.4 87/04/30 19:24:37 van 8 7 c van - moved net and netinet includes e s 00004/00004/00121 d D 4.3 87/04/29 20:03:21 van 7 6 c van - moved ucb networking includes to INCUCB e s 00008/00008/00117 d D 4.2 87/04/15 17:56:39 dc 6 5 c dc - changed #include "sys/..." to #include e s 00000/00000/00125 d D 4.1 87/02/20 13:38:19 build 5 4 c rolled rev to -r4 /dc e s 00000/00000/00125 d D 3.1 87/01/19 09:29:11 build 4 3 c rolled rev to -r3 /dc e s 00000/00000/00125 d D 2.1 87/01/19 09:29:11 build 3 2 c AUTO NULL DELTA e s 00001/00000/00124 d D 1.2 87/01/16 10:24:45 build 2 1 c add ident string /dc e s 00124/00000/00000 d D 1.1 87/01/09 18:12:36 build 1 0 c Placed under source control - dc e u U f b f n t T I 2 D 10 /* "%W% %E%" */ E 2 I 1 static char sccsid[] = "@(#)Wed Apr 23 15:08:25 EET 1986~ BULL-SEMS V21 netinet/tcp_debug" ; E 10 I 10 #ident " %W% %E% " E 10 /* tcp_debug.c 6.1 83/07/29 */ D 6 #include "sys/defsocket.h" #include "sys/types.h" E 6 I 6 D 7 #include E 7 I 7 D 9 #include "sys/defsocket.h" E 9 I 9 #include E 9 E 7 #include E 6 D 6 #include "sys/param.h" #include "sys/systm.h" #include "sys/mbuf.h" #include "sys/socket.h" #include "sys/socketvar.h" E 6 I 6 #include #include D 7 #include #include #include E 7 I 7 D 11 #include "sys/mbuf.h" E 11 I 11 #include E 11 #include "sys/socket.h" #include "sys/socketvar.h" E 7 E 6 #define PRUREQUESTS D 6 #include "sys/errno.h" E 6 I 6 #include E 6 D 8 #include "../net/route.h" #include "../net/if.h" E 8 I 8 #include "net/route.h" #include "net/if.h" E 8 D 8 #include "in.h" #include "in_pcb.h" #include "in_systm.h" #include "ip.h" #include "ip_var.h" #include "tcp.h" E 8 I 8 #include "netinet/in.h" #include "netinet/in_pcb.h" #include "netinet/in_systm.h" #include "netinet/ip.h" #include "netinet/ip_var.h" #include "netinet/tcp.h" E 8 #define TCPSTATES D 8 #include "tcp_fsm.h" #include "tcp_seq.h" E 8 I 8 #include "netinet/tcp_fsm.h" #include "netinet/tcp_seq.h" E 8 #define TCPTIMERS D 8 #include "tcp_timer.h" #include "tcp_var.h" #include "tcpip.h" E 8 I 8 #include "netinet/tcp_timer.h" #include "netinet/tcp_var.h" #include "netinet/tcpip.h" E 8 #define TANAMES D 8 #include "tcp_debug.h" E 8 I 8 #include "netinet/tcp_debug.h" E 8 int tcpconsdebug = 0; /* * Tcp debug routines */ tcp_trace(act, ostate, tp, ti, req) short act, ostate; struct tcpcb *tp; struct tcpiphdr *ti; int req; { tcp_seq seq, ack; int len, flags; struct tcp_debug *td = &tcp_debug[tcp_debx++]; if (tcp_debx == TCP_NDEBUG) tcp_debx = 0; td->td_time = iptime(); td->td_act = act; td->td_ostate = ostate; td->td_tcb = (caddr_t)tp; if (tp) td->td_cb = *tp; else bzero((caddr_t)&td->td_cb, sizeof (*tp)); if (ti) td->td_ti = *ti; else bzero((caddr_t)&td->td_ti, sizeof (*ti)); td->td_req = req; /* * attention trace forcee a 1 a supprimer plus tard */ /* if (tcpconsdebug == 0) return; */ if (tp) printf("%x %s:", tp, tcpstates[ostate]); else printf("???????? "); printf("%s ", tanames[act]); switch (act) { case TA_INPUT: case TA_OUTPUT: case TA_DROP: if (ti == 0) break; seq = ti->ti_seq; ack = ti->ti_ack; len = ti->ti_len; if (act == TA_OUTPUT) { seq = ntohl(seq); ack = ntohl(ack); len = ntohs((u_short)len); } if (act == TA_OUTPUT) len -= sizeof (struct tcphdr); if (len) printf("[%x..%x)", seq, seq+len); else printf("%x", seq); printf("@%x, urp=%x", ack, ti->ti_urp); flags = ti->ti_flags; if (flags) { #ifndef lint char *cp = "<"; #define pf(f) { if (ti->ti_flags&TH_/**/f) { printf("%s%s", cp, "f"); cp = ","; } } pf(SYN); pf(ACK); pf(FIN); pf(RST); pf(PUSH); pf(URG); #endif printf(">"); } break; case TA_USER: printf("%s", prurequests[req&0xff]); if ((req & 0xff) == PRU_SLOWTIMO) printf("<%s>", tcptimers[req>>8]); break; } if (tp) printf(" -> %s", tcpstates[tp->t_state]); /* print out internal state of tp !?! */ printf("\n"); if (tp == 0) return; printf("\trcv_(nxt,wnd,up) (%x,%x,%x) snd_(una,nxt,max) (%x,%x,%x)\n", tp->rcv_nxt, tp->rcv_wnd, tp->rcv_up, tp->snd_una, tp->snd_nxt, tp->snd_max); printf("\tsnd_(wl1,wl2,wnd) (%x,%x,%x)\n", tp->snd_wl1, tp->snd_wl2, tp->snd_wnd); } E 1 h42723 s 00001/00001/00935 d D 4.7 87/05/20 13:29:16 brian 11 10 c mbuf.h put back on system search path BB e s 00001/00002/00935 d D 4.6 87/05/14 16:40:38 build 10 9 c removed old SCCS strings and inserted #ident BB e s 00001/00001/00936 d D 4.5 87/05/07 19:15:37 van 9 8 c van - move defsocket.h back to /usr/include/sys e s 00014/00014/00923 d D 4.4 87/04/30 19:24:38 van 8 7 c van - moved net and netinet includes e s 00004/00004/00933 d D 4.3 87/04/29 20:03:23 van 7 6 c van - moved ucb networking includes to INCUCB e s 00008/00008/00929 d D 4.2 87/04/15 17:56:52 dc 6 5 c dc - changed #include "sys/..." to #include e s 00000/00000/00937 d D 4.1 87/02/20 13:38:28 build 5 4 c rolled rev to -r4 /dc e s 00000/00000/00937 d D 3.1 87/01/19 09:29:16 build 4 3 c rolled rev to -r3 /dc e s 00000/00000/00937 d D 2.1 87/01/19 09:29:16 build 3 2 c AUTO NULL DELTA e s 00001/00000/00936 d D 1.2 87/01/16 10:24:52 build 2 1 c add ident string /dc e s 00936/00000/00000 d D 1.1 87/01/09 18:12:37 build 1 0 c Placed under source control - dc e u U f b f n t T I 2 D 10 /* "%W% %E%" */ E 2 I 1 static char sccsid[] = "@(#)Wed Apr 23 15:08:40 EET 1986~ BULL-SEMS V21 netinet/tcp_input" ; E 10 I 10 #ident " %W% %E% " E 10 /* tcp_input.c 6.1 83/07/29 */ D 6 #include "sys/defsocket.h" /* SOC systeme V */ #include "sys/types.h" /* SOC systeme V */ #include "sys/param.h" #include "sys/systm.h" #include "sys/mbuf.h" #include "sys/socket.h" #include "sys/socketvar.h" #include "sys/errno.h" /* SOC systeme V */ E 6 I 6 D 7 #include /* SOC systeme V */ E 7 I 7 D 9 #include "sys/defsocket.h" /* SOC systeme V */ E 9 I 9 #include /* SOC systeme V */ E 9 E 7 #include /* SOC systeme V */ #include #include D 7 #include #include #include E 7 I 7 D 11 #include "sys/mbuf.h" E 11 I 11 #include E 11 #include "sys/socket.h" #include "sys/socketvar.h" E 7 #include /* SOC systeme V */ E 6 D 8 #include "../net/if.h" #include "../net/route.h" E 8 I 8 #include "net/if.h" #include "net/route.h" E 8 D 8 #include "in.h" #include "in_pcb.h" #include "in_systm.h" #include "ip.h" #include "ip_var.h" #include "tcp.h" #include "tcp_fsm.h" #include "tcp_seq.h" #include "tcp_timer.h" #include "tcp_var.h" #include "tcpip.h" #include "tcp_debug.h" E 8 I 8 #include "netinet/in.h" #include "netinet/in_pcb.h" #include "netinet/in_systm.h" #include "netinet/ip.h" #include "netinet/ip_var.h" #include "netinet/tcp.h" #include "netinet/tcp_fsm.h" #include "netinet/tcp_seq.h" #include "netinet/tcp_timer.h" #include "netinet/tcp_var.h" #include "netinet/tcpip.h" #include "netinet/tcp_debug.h" E 8 int tcpprintfs = 0; int tcpcksum = 1; struct tcpiphdr tcp_saveti; extern tcpnodelack; struct tcpcb *tcp_newtcpcb(); /* * TCP input routine, follows pages 65-76 of the * protocol specification dated September, 1981 very closely. */ tcp_input(m0) struct mbuf *m0; { register struct tcpiphdr *ti; struct inpcb *inp; register struct mbuf *m; struct mbuf *om = 0; int len, tlen, off; register struct tcpcb *tp = 0; register int tiflags; struct socket *so; int todrop, acked; short ostate; struct in_addr laddr; int dropsocket = 0; /* * Get IP and TCP header together in first mbuf. * Note: IP leaves IP header in first mbuf. */ m = m0; ti = mtod(m, struct tcpiphdr *); if (((struct ip *)ti)->ip_hl > (sizeof (struct ip) >> 2)) ip_stripoptions((struct ip *)ti, (struct mbuf *)0); if (m->m_off > MMAXOFF || m->m_len < sizeof (struct tcpiphdr)) { if ((m = m_pullup(m, sizeof (struct tcpiphdr))) == 0) { tcpstat.tcps_hdrops++; return; } ti = mtod(m, struct tcpiphdr *); } /* * Checksum extended TCP header and data. */ tlen = ((struct ip *)ti)->ip_len; len = sizeof (struct ip) + tlen; if (tcpcksum) { ti->ti_next = ti->ti_prev = 0; ti->ti_x1 = 0; ti->ti_len = (u_short)tlen; ti->ti_len = htons((u_short)ti->ti_len); if (ti->ti_sum = in_cksum(m, len)) { if (tcpprintfs) printf("tcp sum: src %x\n", ti->ti_src); tcpstat.tcps_badsum++; goto drop; } } /* * Check that TCP offset makes sense, * pull out TCP options and adjust length. */ off = ti->ti_off << 2; if (off < sizeof (struct tcphdr) || off > tlen) { if (tcpprintfs) printf("tcp off: src %x off %d\n", ti->ti_src, off); tcpstat.tcps_badoff++; goto drop; } tlen -= off; ti->ti_len = tlen; if (off > sizeof (struct tcphdr)) { if ((m = m_pullup(m, sizeof (struct ip) + off)) == 0) { tcpstat.tcps_hdrops++; return; } ti = mtod(m, struct tcpiphdr *); om = m_get(M_DONTWAIT, MT_DATA); if (om == 0) goto drop; om->m_len = off - sizeof (struct tcphdr); { caddr_t op = mtod(m, caddr_t) + sizeof (struct tcpiphdr); bcopy(op, mtod(om, caddr_t), (unsigned)om->m_len); m->m_len -= om->m_len; bcopy(op+om->m_len, op, (unsigned)(m->m_len-sizeof (struct tcpiphdr))); } } tiflags = ti->ti_flags; /* * Drop TCP and IP headers. */ off += sizeof (struct ip); m->m_off += off; m->m_len -= off; /* * Convert TCP protocol specific fields to host format. */ ti->ti_seq = ntohl(ti->ti_seq); ti->ti_ack = ntohl(ti->ti_ack); ti->ti_win = ntohs(ti->ti_win); ti->ti_urp = ntohs(ti->ti_urp); /* * Locate pcb for segment. */ inp = in_pcblookup (&tcb, ti->ti_src, ti->ti_sport, ti->ti_dst, ti->ti_dport, INPLOOKUP_WILDCARD); /* * If the state is CLOSED (i.e., TCB does not exist) then * all data in the incoming segment is discarded. */ if (inp == 0) goto dropwithreset; tp = intotcpcb(inp); if (tp == 0) goto dropwithreset; so = inp->inp_socket; if (so->so_options & SO_DEBUG) { ostate = tp->t_state; tcp_saveti = *ti; } if (so->so_options & SO_ACCEPTCONN) { so = sonewconn(so); if (so == 0) goto drop; /* * This is ugly, but .... * * Mark socket as temporary until we're * committed to keeping it. The code at * ``drop'' and ``dropwithreset'' check the * flag dropsocket to see if the temporary * socket created here should be discarded. * We mark the socket as discardable until * we're committed to it below in TCPS_LISTEN. */ dropsocket++; inp = (struct inpcb *)so->so_pcb; inp->inp_laddr = ti->ti_dst; inp->inp_lport = ti->ti_dport; tp = intotcpcb(inp); tp->t_state = TCPS_LISTEN; } /* * Segment received on connection. * Reset idle time and keep-alive timer. */ tp->t_idle = 0; tp->t_timer[TCPT_KEEP] = TCPTV_KEEP; /* * Process options. */ if (om) { tcp_dooptions(tp, om); om = 0; } /* * Calculate amount of space in receive window, * and then do TCP input processing. */ tp->rcv_wnd = sbspace(&so->so_rcv); if (tp->rcv_wnd < 0) tp->rcv_wnd = 0; switch (tp->t_state) { /* * If the state is LISTEN then ignore segment if it contains an RST. * If the segment contains an ACK then it is bad and send a RST. * If it does not contain a SYN then it is not interesting; drop it. * Otherwise initialize tp->rcv_nxt, and tp->irs, select an initial * tp->iss, and send a segment: * * Also initialize tp->snd_nxt to tp->iss+1 and tp->snd_una to tp->iss. * Fill in remote peer address fields if not previously specified. * Enter SYN_RECEIVED state, and process any other fields of this * segment in this state. */ case TCPS_LISTEN: { struct mbuf *am; register struct sockaddr_in *sin; if (tiflags & TH_RST) goto drop; if (tiflags & TH_ACK) goto dropwithreset; if ((tiflags & TH_SYN) == 0) goto drop; am = m_get(M_DONTWAIT, MT_SONAME); if (am == NULL) goto drop; am->m_len = sizeof (struct sockaddr_in); sin = mtod(am, struct sockaddr_in *); sin->sin_family = AF_INET; sin->sin_addr = ti->ti_src; sin->sin_port = ti->ti_sport; laddr = inp->inp_laddr; if (inp->inp_laddr.s_addr == INADDR_ANY) inp->inp_laddr = ti->ti_dst; if (in_pcbconnect(inp, am)) { inp->inp_laddr = laddr; (void) m_free(am); goto drop; } (void) m_free(am); tp->t_template = tcp_template(tp); if (tp->t_template == 0) { in_pcbdisconnect(inp); inp->inp_laddr = laddr; tp = 0; goto drop; } tp->iss = tcp_iss; tcp_iss += TCP_ISSINCR/2; tp->irs = ti->ti_seq; tcp_sendseqinit(tp); tcp_rcvseqinit(tp); tp->t_state = TCPS_SYN_RECEIVED; tp->t_timer[TCPT_KEEP] = TCPTV_KEEP; dropsocket = 0; /* committed to socket */ goto trimthenstep6; } /* * If the state is SYN_SENT: * if seg contains an ACK, but not for our SYN, drop the input. * if seg contains a RST, then drop the connection. * if seg does not contain SYN, then drop it. * Otherwise this is an acceptable SYN segment * initialize tp->rcv_nxt and tp->irs * if seg contains ack then advance tp->snd_una * if SYN has been acked change to ESTABLISHED else SYN_RCVD state * arrange for segment to be acked (eventually) * continue processing rest of data/controls, beginning with URG */ case TCPS_SYN_SENT: if ((tiflags & TH_ACK) && /* this should be SEQ_LT; is SEQ_LEQ for BBN vax TCP only */ (SEQ_LT(ti->ti_ack, tp->iss) || SEQ_GT(ti->ti_ack, tp->snd_max))) goto dropwithreset; if (tiflags & TH_RST) { if (tiflags & TH_ACK) tp = tcp_drop(tp, ECONNREFUSED); goto drop; } if ((tiflags & TH_SYN) == 0) goto drop; tp->snd_una = ti->ti_ack; if (SEQ_LT(tp->snd_nxt, tp->snd_una)) tp->snd_nxt = tp->snd_una; tp->t_timer[TCPT_REXMT] = 0; tp->irs = ti->ti_seq; tcp_rcvseqinit(tp); tp->t_flags |= TF_ACKNOW; if (SEQ_GT(tp->snd_una, tp->iss)) { soisconnected(so); tp->t_state = TCPS_ESTABLISHED; (void) tcp_reass(tp, (struct tcpiphdr *)0); } else tp->t_state = TCPS_SYN_RECEIVED; goto trimthenstep6; trimthenstep6: /* * Advance ti->ti_seq to correspond to first data byte. * If data, trim to stay within window, * dropping FIN if necessary. */ ti->ti_seq++; if (ti->ti_len > tp->rcv_wnd) { todrop = ti->ti_len - tp->rcv_wnd; m_adj(m, -todrop); ti->ti_len = tp->rcv_wnd; ti->ti_flags &= ~TH_FIN; } tp->snd_wl1 = ti->ti_seq - 1; goto step6; } /* * States other than LISTEN or SYN_SENT. * First check that at least some bytes of segment are within * receive window. */ if (tp->rcv_wnd == 0) { /* * If window is closed can only take segments at * window edge, and have to drop data and PUSH from * incoming segments. */ if (tp->rcv_nxt != ti->ti_seq) goto dropafterack; if (ti->ti_len > 0) { m_adj(m, ti->ti_len); ti->ti_len = 0; ti->ti_flags &= ~(TH_PUSH|TH_FIN); } } else { /* * If segment begins before rcv_nxt, drop leading * data (and SYN); if nothing left, just ack. */ todrop = tp->rcv_nxt - ti->ti_seq; if (todrop > 0) { if (tiflags & TH_SYN) { tiflags &= ~TH_SYN; ti->ti_flags &= ~TH_SYN; ti->ti_seq++; if (ti->ti_urp > 1) ti->ti_urp--; else tiflags &= ~TH_URG; todrop--; } if (todrop > ti->ti_len || todrop == ti->ti_len && (tiflags&TH_FIN) == 0) goto dropafterack; m_adj(m, todrop); ti->ti_seq += todrop; ti->ti_len -= todrop; if (ti->ti_urp > todrop) ti->ti_urp -= todrop; else { tiflags &= ~TH_URG; ti->ti_flags &= ~TH_URG; ti->ti_urp = 0; } } /* * If segment ends after window, drop trailing data * (and PUSH and FIN); if nothing left, just ACK. */ todrop = (ti->ti_seq+ti->ti_len) - (tp->rcv_nxt+tp->rcv_wnd); if (todrop > 0) { if (todrop >= ti->ti_len) goto dropafterack; m_adj(m, -todrop); ti->ti_len -= todrop; ti->ti_flags &= ~(TH_PUSH|TH_FIN); } } /* * If data is received on a connection after the * user processes are gone, then RST the other end. */ if ((so->so_state & SS_NOFDREF) && tp->t_state > TCPS_CLOSE_WAIT && ti->ti_len) { tp = tcp_close(tp); goto dropwithreset; } /* * If the RST bit is set examine the state: * SYN_RECEIVED STATE: * If passive open, return to LISTEN state. * If active open, inform user that connection was refused. * ESTABLISHED, FIN_WAIT_1, FIN_WAIT2, CLOSE_WAIT STATES: * Inform user that connection was reset, and close tcb. * CLOSING, LAST_ACK, TIME_WAIT STATES * Close the tcb. */ if (tiflags&TH_RST) switch (tp->t_state) { case TCPS_SYN_RECEIVED: tp = tcp_drop(tp, ECONNREFUSED); goto drop; case TCPS_ESTABLISHED: case TCPS_FIN_WAIT_1: case TCPS_FIN_WAIT_2: case TCPS_CLOSE_WAIT: tp = tcp_drop(tp, ECONNRESET); goto drop; case TCPS_CLOSING: case TCPS_LAST_ACK: case TCPS_TIME_WAIT: tp = tcp_close(tp); goto drop; } /* * If a SYN is in the window, then this is an * error and we send an RST and drop the connection. */ if (tiflags & TH_SYN) { tp = tcp_drop(tp, ECONNRESET); goto dropwithreset; } /* * If the ACK bit is off we drop the segment and return. */ if ((tiflags & TH_ACK) == 0) goto drop; /* * Ack processing. */ switch (tp->t_state) { /* * In SYN_RECEIVED state if the ack ACKs our SYN then enter * ESTABLISHED state and continue processing, othewise * send an RST. */ case TCPS_SYN_RECEIVED: if (SEQ_GT(tp->snd_una, ti->ti_ack) || SEQ_GT(ti->ti_ack, tp->snd_max)) goto dropwithreset; tp->snd_una++; /* SYN acked */ if (SEQ_LT(tp->snd_nxt, tp->snd_una)) tp->snd_nxt = tp->snd_una; tp->t_timer[TCPT_REXMT] = 0; soisconnected(so); tp->t_state = TCPS_ESTABLISHED; (void) tcp_reass(tp, (struct tcpiphdr *)0); tp->snd_wl1 = ti->ti_seq - 1; /* fall into ... */ /* * In ESTABLISHED state: drop duplicate ACKs; ACK out of range * ACKs. If the ack is in the range * tp->snd_una < ti->ti_ack <= tp->snd_max * then advance tp->snd_una to ti->ti_ack and drop * data from the retransmission queue. If this ACK reflects * more up to date window information we update our window information. */ case TCPS_ESTABLISHED: case TCPS_FIN_WAIT_1: case TCPS_FIN_WAIT_2: case TCPS_CLOSE_WAIT: case TCPS_CLOSING: case TCPS_LAST_ACK: case TCPS_TIME_WAIT: #define ourfinisacked (acked > 0) if (SEQ_LEQ(ti->ti_ack, tp->snd_una)) break; if (SEQ_GT(ti->ti_ack, tp->snd_max)) goto dropafterack; acked = ti->ti_ack - tp->snd_una; /* * If transmit timer is running and timed sequence * number was acked, update smoothed round trip time. */ if (tp->t_rtt && SEQ_GT(ti->ti_ack, tp->t_rtseq)) { if (tp->t_srtt == 0) tp->t_srtt = tp->t_rtt; else tp->t_srtt = MIN(tcp_alpha * tp->t_srtt + (10 - tcp_alpha) * tp->t_rtt,TCPTV_MAX);/*jm float */ /* jc MIN est une bidouille pour eviter les debordements */ tp->t_rtt = 0; } if (ti->ti_ack == tp->snd_max) tp->t_timer[TCPT_REXMT] = 0; else { TCPT_RANGESET(tp->t_timer[TCPT_REXMT], tcp_beta * tp->t_srtt, TCPTV_MIN, TCPTV_MAX); tp->t_rtt = 1; /* jm tout mul * 10 */ tp->t_rxtshift = 0; } if (acked > so->so_snd.sb_cc) { sbdrop(&so->so_snd, so->so_snd.sb_cc); tp->snd_wnd -= so->so_snd.sb_cc; } else { sbdrop(&so->so_snd, acked); tp->snd_wnd -= acked; acked = 0; } if ((so->so_snd.sb_flags & SB_WAIT) || so->so_snd.sb_sel) sowwakeup(so); tp->snd_una = ti->ti_ack; if (SEQ_LT(tp->snd_nxt, tp->snd_una)) tp->snd_nxt = tp->snd_una; switch (tp->t_state) { /* * In FIN_WAIT_1 STATE in addition to the processing * for the ESTABLISHED state if our FIN is now acknowledged * then enter FIN_WAIT_2. */ case TCPS_FIN_WAIT_1: if (ourfinisacked) { /* * If we can't receive any more * data, then closing user can proceed. */ if (so->so_state & SS_CANTRCVMORE) soisdisconnected(so); tp->t_state = TCPS_FIN_WAIT_2; } break; /* * In CLOSING STATE in addition to the processing for * the ESTABLISHED state if the ACK acknowledges our FIN * then enter the TIME-WAIT state, otherwise ignore * the segment. */ case TCPS_CLOSING: if (ourfinisacked) { tp->t_state = TCPS_TIME_WAIT; tcp_canceltimers(tp); tp->t_timer[TCPT_2MSL] = TCPTV_MSL; /* SMX */ soisdisconnected(so); /* etait 2*TCPTV_MSL*/ } break; /* * The only thing that can arrive in LAST_ACK state * is an acknowledgment of our FIN. If our FIN is now * acknowledged, delete the TCB, enter the closed state * and return. */ case TCPS_LAST_ACK: if (ourfinisacked) tp = tcp_close(tp); goto drop; /* * In TIME_WAIT state the only thing that should arrive * is a retransmission of the remote FIN. Acknowledge * it and restart the finack timer. */ case TCPS_TIME_WAIT: tp->t_timer[TCPT_2MSL] = TCPTV_MSL; goto dropafterack; /* SMX etait 2*TCPTV_MSL */ } #undef ourfinisacked } step6: /* * Update window information. */ if (SEQ_LT(tp->snd_wl1, ti->ti_seq) || tp->snd_wl1 == ti->ti_seq && (SEQ_LT(tp->snd_wl2, ti->ti_ack) || tp->snd_wl2 == ti->ti_ack && ti->ti_win > tp->snd_wnd)) { tp->snd_wnd = ti->ti_win; tp->snd_wl1 = ti->ti_seq; tp->snd_wl2 = ti->ti_ack; if (tp->snd_wnd != 0) tp->t_timer[TCPT_PERSIST] = 0; } /* * Process segments with URG. */ if ((tiflags & TH_URG) && ti->ti_urp && TCPS_HAVERCVDFIN(tp->t_state) == 0) { /* * This is a kludge, but if we receive accept * random urgent pointers, we'll crash in * soreceive. It's hard to imagine someone * actually wanting to send this much urgent data. */ if (ti->ti_urp > tp->t_maxseg) { /* XXX */ ti->ti_urp = 0; /* XXX */ tiflags &= ~TH_URG; /* XXX */ ti->ti_flags &= ~TH_URG; /* XXX */ goto badurp; /* XXX */ } /* * If this segment advances the known urgent pointer, * then mark the data stream. This should not happen * in CLOSE_WAIT, CLOSING, LAST_ACK or TIME_WAIT STATES since * a FIN has been received from the remote side. * In these states we ignore the URG. */ if (SEQ_GT(ti->ti_seq+ti->ti_urp, tp->rcv_up)) { tp->rcv_up = ti->ti_seq + ti->ti_urp; so->so_oobmark = so->so_rcv.sb_cc + (tp->rcv_up - tp->rcv_nxt) - 1; if (so->so_oobmark == 0) so->so_state |= SS_RCVATMARK; sohasoutofband(so); tp->t_oobflags &= ~TCPOOB_HAVEDATA; } /* * Remove out of band data so doesn't get presented to user. * This can happen independent of advancing the URG pointer, * but if two URG's are pending at once, some out-of-band * data may creep in... ick. */ if (ti->ti_urp <= ti->ti_len) tcp_pulloutofband(so, ti); } badurp: /* XXX */ /* * Process the segment text, merging it into the TCP sequencing queue, * and arranging for acknowledgment of receipt if necessary. * This process logically involves adjusting tp->rcv_wnd as data * is presented to the user (this happens in tcp_usrreq.c, * case PRU_RCVD). If a FIN has already been received on this * connection then we just ignore the text. */ if ((ti->ti_len || (tiflags&TH_FIN)) && TCPS_HAVERCVDFIN(tp->t_state) == 0) { tiflags = tcp_reass(tp, ti); if (tcpnodelack == 0) tp->t_flags |= TF_DELACK; else tp->t_flags |= TF_ACKNOW; } else { m_freem(m); tiflags &= ~TH_FIN; } /* * If FIN is received ACK the FIN and let the user know * that the connection is closing. */ if (tiflags & TH_FIN) { if (TCPS_HAVERCVDFIN(tp->t_state) == 0) { socantrcvmore(so); tp->t_flags |= TF_ACKNOW; tp->rcv_nxt++; } switch (tp->t_state) { /* * In SYN_RECEIVED and ESTABLISHED STATES * enter the CLOSE_WAIT state. */ case TCPS_SYN_RECEIVED: case TCPS_ESTABLISHED: tp->t_state = TCPS_CLOSE_WAIT; break; /* * If still in FIN_WAIT_1 STATE FIN has not been acked so * enter the CLOSING state. */ case TCPS_FIN_WAIT_1: tp->t_state = TCPS_CLOSING; break; /* * In FIN_WAIT_2 state enter the TIME_WAIT state, * starting the time-wait timer, turning off the other * standard timers. */ case TCPS_FIN_WAIT_2: tp->t_state = TCPS_TIME_WAIT; tcp_canceltimers(tp); tp->t_timer[TCPT_2MSL] = TCPTV_MSL; soisdisconnected(so); /* etait 2*TCPTV_MSL SMX */ break; /* * In TIME_WAIT state restart the 2 MSL time_wait timer. */ case TCPS_TIME_WAIT: tp->t_timer[TCPT_2MSL] = TCPTV_MSL; break; /* SMX etait 2*TCPTV_MSL */ } } if (so->so_options & SO_DEBUG) tcp_trace(TA_INPUT, ostate, tp, &tcp_saveti, 0); /* * Return any desired output. */ (void) tcp_output(tp); return; dropafterack: /* * Generate an ACK dropping incoming segment if it occupies * sequence space, where the ACK reflects our state. */ if ((tiflags&TH_RST) || tlen == 0 && (tiflags&(TH_SYN|TH_FIN)) == 0) goto drop; if (tp->t_inpcb->inp_socket->so_options & SO_DEBUG) tcp_trace(TA_RESPOND, ostate, tp, &tcp_saveti, 0); tcp_respond(tp, ti, tp->rcv_nxt, tp->snd_nxt, TH_ACK); return; dropwithreset: if (om) { (void) m_free(om); om = 0; } /* * Generate a RST, dropping incoming segment. * Make ACK acceptable to originator of segment. */ if (tiflags & TH_RST) goto drop; if (tiflags & TH_ACK) tcp_respond(tp, ti, (tcp_seq)0, ti->ti_ack, TH_RST); else { if (tiflags & TH_SYN) ti->ti_len++; tcp_respond(tp, ti, ti->ti_seq+ti->ti_len, (tcp_seq)0, TH_RST|TH_ACK); } /* destroy temporarily created socket */ if (dropsocket) (void) soabort(so); return; drop: if (om) (void) m_free(om); /* * Drop space held by incoming segment and return. */ if (tp && (tp->t_inpcb->inp_socket->so_options & SO_DEBUG)) tcp_trace(TA_DROP, ostate, tp, &tcp_saveti, 0); m_freem(m); /* destroy temporarily created socket */ if (dropsocket) (void) soabort(so); return; } tcp_dooptions(tp, om) struct tcpcb *tp; struct mbuf *om; { register u_char *cp; int opt, optlen, cnt; cp = mtod(om, u_char *); cnt = om->m_len; for (; cnt > 0; cnt -= optlen, cp += optlen) { opt = cp[0]; if (opt == TCPOPT_EOL) break; if (opt == TCPOPT_NOP) optlen = 1; else { optlen = cp[1]; if (optlen <= 0) break; } switch (opt) { default: break; case TCPOPT_MAXSEG: if (optlen != 4) continue; tp->t_maxseg = *(u_short *)(cp + 2); tp->t_maxseg = ntohs((u_short)tp->t_maxseg); break; } } (void) m_free(om); } /* * Pull out of band byte out of a segment so * it doesn't appear in the user's data queue. * It is still reflected in the segment length for * sequencing purposes. */ tcp_pulloutofband(so, ti) struct socket *so; struct tcpiphdr *ti; { register struct mbuf *m; int cnt = ti->ti_urp - 1; m = dtom(ti); while (cnt >= 0) { if (m->m_len > cnt) { char *cp = mtod(m, caddr_t) + cnt; struct tcpcb *tp = sototcpcb(so); tp->t_iobc = *cp; tp->t_oobflags |= TCPOOB_HAVEDATA; bcopy(cp+1, cp, (unsigned)(m->m_len - cnt - 1)); m->m_len--; return; } cnt -= m->m_len; m = m->m_next; if (m == 0) break; } panic("tcp_pulloutofband"); } /* * Insert segment ti into reassembly queue of tcp with * control block tp. Return TH_FIN if reassembly now includes * a segment with FIN. */ tcp_reass(tp, ti) register struct tcpcb *tp; register struct tcpiphdr *ti; { register struct tcpiphdr *q; struct socket *so = tp->t_inpcb->inp_socket; struct mbuf *m; int flags; /* * Call with ti==0 after become established to * force pre-ESTABLISHED data up to user socket. */ if (ti == 0) goto present; /* * Find a segment which begins after this one does. */ for (q = tp->seg_next; q != (struct tcpiphdr *)tp; q = (struct tcpiphdr *)q->ti_next) if (SEQ_GT(q->ti_seq, ti->ti_seq)) break; /* * If there is a preceding segment, it may provide some of * our data already. If so, drop the data from the incoming * segment. If it provides all of our data, drop us. */ if ((struct tcpiphdr *)q->ti_prev != (struct tcpiphdr *)tp) { register int i; q = (struct tcpiphdr *)q->ti_prev; /* conversion to int (in i) handles seq wraparound */ i = q->ti_seq + q->ti_len - ti->ti_seq; if (i > 0) { if (i >= ti->ti_len) goto drop; m_adj(dtom(ti), i); ti->ti_len -= i; ti->ti_seq += i; } q = (struct tcpiphdr *)(q->ti_next); } /* * While we overlap succeeding segments trim them or, * if they are completely covered, dequeue them. */ while (q != (struct tcpiphdr *)tp) { register int i = (ti->ti_seq + ti->ti_len) - q->ti_seq; if (i <= 0) break; if (i < q->ti_len) { q->ti_seq += i; q->ti_len -= i; m_adj(dtom(q), i); break; } q = (struct tcpiphdr *)q->ti_next; m = dtom(q->ti_prev); remque(q->ti_prev); m_freem(m); } /* * Stick new segment in its place. */ insque(ti, q->ti_prev); present: /* * Present data to user, advancing rcv_nxt through * completed sequence space. */ if (TCPS_HAVERCVDSYN(tp->t_state) == 0) return (0); ti = tp->seg_next; if (ti == (struct tcpiphdr *)tp || ti->ti_seq != tp->rcv_nxt) return (0); if (tp->t_state == TCPS_SYN_RECEIVED && ti->ti_len) return (0); do { tp->rcv_nxt += ti->ti_len; flags = ti->ti_flags & TH_FIN; remque(ti); m = dtom(ti); ti = (struct tcpiphdr *)ti->ti_next; if (so->so_state & SS_CANTRCVMORE) m_freem(m); else sbappend(&so->so_rcv, m); } while (ti != (struct tcpiphdr *)tp && ti->ti_seq == tp->rcv_nxt); sorwakeup(so); return (flags); drop: m_freem(dtom(ti)); return (0); } E 1 h28796 s 00001/00001/00768 d D 4.7 87/05/20 13:29:44 brian 11 10 c mbuf.h put back on system search path BB e s 00001/00002/00768 d D 4.6 87/05/14 16:40:59 build 10 9 c removed old SCCS strings and inserted #ident BB e s 00001/00001/00769 d D 4.5 87/05/07 19:14:43 van 9 8 c van - move defsocket.h back to /usr/include/sys e s 00003/00003/00767 d D 4.4 87/04/30 19:24:19 van 8 7 c van - moved net and netinet includes e s 00003/00003/00767 d D 4.3 87/04/29 20:02:53 van 7 6 c van - moved ucb networking includes to INCUCB e s 00009/00009/00761 d D 4.2 87/04/15 17:57:56 dc 6 5 c dc - changed #include "sys/..." to #include e s 00000/00000/00770 d D 4.1 87/02/20 13:39:17 build 5 4 c rolled rev to -r4 /dc e s 00000/00000/00770 d D 3.1 87/01/19 09:29:59 build 4 3 c rolled rev to -r3 /dc e s 00000/00000/00770 d D 2.1 87/01/19 09:29:59 build 3 2 c AUTO NULL DELTA e s 00001/00000/00769 d D 1.2 87/01/16 10:25:38 build 2 1 c add ident string /dc e s 00769/00000/00000 d D 1.1 87/01/09 18:12:26 build 1 0 c Placed under source control - dc e u U f b f n t T I 2 D 10 /* "%W% %E%" */ E 2 I 1 static char sccsid[] = "@(#)Wed Apr 23 15:10:24 EET 1986~ BULL-SEMS V21 netinet/if_ether" ; E 10 I 10 #ident " %W% %E% " E 10 /*********************************************/ /* */ /* PROTOCOLE DE RESOLUTION D'ADRESSES */ /* INTERNET - ETHERNET */ /* */ /*********************************************/ /* * * * ARP est un protocole permettant d'effectuer un mapping dynamique * entre adresses INTERNET et adresses ETHERNET 10 Mb/s. * * ARP utilise un cache de mapping d'adresse INTERNET ETHERNET. * lorsqu'une interface demande un mapping pour une adresse qui * n'existe pas dans le cache, ARP met le message en file d'attente et * emet un message de BROADCAST sur le reseau associe. Si une reponse * positive est fournie, le nouveau mapping est introduit dans le cache * et le message en attente est transmis. * * Lorsque le cache adresse est plein et qu'un nouveau mapping doit y * etre introduit, l'entree qui n'a pas ete utilisee depuis le temps * le plus long est supprimee du cache et remplacee par la nouvelle * entree. * * le module de resolution d'adresse est composee des fonctions suivantes : * * - arpattach() : qui permet d'attacher un interface ethernet a * une liste d'interfaces utilisee par la fonction * arptimer. * * - arptimer() : met a jour les compteurs de duree dans le cache * * - arpwhohas() : qui emet un paquet de broadcast vers le reseau * demandant qui possede l'adresse associee a * l'interface. * * - arpresolve() : qui resout l'adresse internet en adresse ethernet * et envoie un message de broadcast si l'entree * n'est pas dans le cache. * * - arpmyaddr() : non implemente * * - arpinput() : qui est appele par la routine ec_send lorsque le * type de paquet est ETHERPUP-ARP. * * - arptfree() : qui libere une entree dans le cache. * * - arptnew() : qui entre une nouvelle entree dans le cache. * ********************************************************************** ********************************************************************** */ D 6 #include "sys/defsocket.h" #include "sys/types.h" #include "sys/param.h" #include "sys/systm.h" #include "sys/mbuf.h" #include "sys/socket.h" #include "sys/times.h" #include "sys/utsname.h" #include "sys/errno.h" E 6 I 6 D 7 #include E 7 I 7 D 9 #include "sys/defsocket.h" E 9 I 9 #include E 9 E 7 #include #include #include D 7 #include #include E 7 I 7 D 11 #include "sys/mbuf.h" E 11 I 11 #include E 11 #include "sys/socket.h" E 7 #include #include #include E 6 D 8 #include "../net/if.h" #include "in.h" #include "if_ether.h" E 8 I 8 #include "net/if.h" #include "netinet/in.h" #include "netinet/if_ether.h" E 8 /* * Internet to ethernet address resolution table. * Cache adresse */ struct arptab { struct in_addr at_iaddr; /* internet address */ u_char at_enaddr[6]; /* ethernet address */ struct mbuf *at_hold; /* last packet until resolved/timeout */ u_char at_timer; /* minutes since last reference */ u_char at_flags; /* flags */ }; /* at_flags field values (valeur initiale = 0) */ #define ATF_INUSE 1 /* entry in use */ #define ATF_COM 2 /* completed entry (enaddr valid) */ /* * definition de la taille du cache */ #define ARPTAB_BSIZ 5 /* bucket size */ #define ARPTAB_NB 19 /* number of buckets */ #define ARPTAB_SIZE (ARPTAB_BSIZ * ARPTAB_NB) struct arptab arptab[ARPTAB_SIZE]; /* * fonction de hashing-code permettant l'acces a une entree au cache ARPTAB */ #define ARPTAB_HASH(a) \ ((short)(((((u_long)a) >> 16) ^ (a)) & 0x7fff) % ARPTAB_NB) /* * routine de recherche d'une entree dans le cache adresse correspondant * a une adresse donnee. Si l'adresse est trouvee dans le cache, la rou * tine rend l'adresse de l'entree, sinon elle rend la valeur 0. */ #define ARPTAB_LOOK(at,addr) { \ register n; \ at = &arptab[ARPTAB_HASH(addr) * ARPTAB_BSIZ]; \ for (n = 0 ; n < ARPTAB_BSIZ ; n++,at++) \ if (at->at_iaddr.s_addr == addr) \ break; \ if (n >= ARPTAB_BSIZ) \ at = 0; } struct arpcom *arpcom; /* chain of active ether interfaces */ int arpt_age; /* aging timer */ /* timer values */ #define ARPT_AGE (60*1) /* aging timer, 1 min. */ #define ARPT_KILLC 20 /* kill completed entry in 20 mins. */ #define ARPT_KILLI 3 /* kill incomplete entry in 3 minutes */ u_char etherbroadcastaddr[6] = { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff }; extern struct ifnet loif; /* * Local addresses in the range oldmap to infinity are * mapped according to the old mapping scheme. That is, * mapping of Internet to Ethernet addresses is performed * by taking the high three bytes of the network interface's * address and the low three bytes of the local address part. * This only allows boards from the same manufacturer to * communicate unless the on-board address is overridden * (not possible in many manufacture's hardware). * * NB: setting oldmap to zero completely disables ARP * (i.e. identical to setting IFF_NOARP with an ioctl). */ /* on enleve "oldmap" , voir ci-dessous. * int oldmap = 1024; */ /*************************************************************************/ /* */ /* nom : ARPATTACH */ /* */ /* fonction : attachement d'un interface ethernet a la liste 'arpcom' */ /* sera utilise par ARPTIMER. il existe une structure arpcom */ /* par interface. */ /* */ /* parametres d'entree : */ /* ac : adresse de la structure arpcom a attacher */ /* */ /* parametres de sortie : */ /* */ /* procedures appelantes : ec_init */ /* */ /* procedures appelees : arptimer */ /* */ /*************************************************************************/ arpattach(ac) register struct arpcom *ac; { register struct arpcom *acp; for (acp = arpcom; acp != (struct arpcom *)0; acp = acp->ac_ac) if (acp == ac) /* if already on list */ return; ac->ac_ac = arpcom; arpcom = ac; if (arpcom->ac_ac == 0) /* very first time */ arptimer(); } /********************************************************************/ /* */ /* nom : ARPTIMER */ /* */ /* fonction : met a jour les entrees du cache (time-out) une fois */ /* toutes les minutes */ /* */ /* parametres d'appel : */ /* */ /* parametres de sortie : */ /* */ /* procedures appelantes : arpattach */ /* */ /* procedures appelees : arpwhohas, arptfree */ /* */ /********************************************************************/ arptimer() { register struct arptab *at; register i; /* * armement du timer */ timeout(arptimer, (caddr_t)0, HZ); /* * optionnel (non etudie) */ #ifdef notdef if (++arpt_sanity > ARPT_SANITY) { register struct arpcom *ac; /* * Randomize sanity timer based on my host address. * Ask who has my own address; if someone else replies, * then they are impersonating me. */ arpt_sanity = arpcom->ac_enaddr[5] & 0x3f; for (ac = arpcom; ac != (struct arpcom *)-1; ac = ac->ac_ac) arpwhohas(ac, &((struct sockaddr_in *) &ac->ac_if.if_addr)->sin_addr); } #endif /* le timer arpt-age est incremente a chaque appel de arptimer. toutes * les minutes, il est remis a zero. Toutes les entrees du cache sont * parcourues pour mettre a jour le timer d'occupation. * si une entree est complete, elle est liberee si elle n'est pas referencee * pendant un temps ARPT_KILLC. * si une entree est incomplete, elle est liberer si elle n'est pas referencee * pendant un temps ARPT_KILLI. */ if (++arpt_age > ARPT_AGE) { arpt_age = 0; at = &arptab[0]; for (i = 0; i < ARPTAB_SIZE; i++, at++) { if (at->at_flags == 0) continue; if (++at->at_timer < ((at->at_flags&ATF_COM) ? ARPT_KILLC : ARPT_KILLI)) continue; /* timer has expired, clear entry */ arptfree(at); } } } /*************************************************************************/ /* */ /* nom : ARPWHOHAS */ /* */ /* fonction : construction du paquet de broadcast a emettre sur le */ /* reseau pour effectuer le mapping internet-ethernet */ /* */ /* parametres d'entree : */ /* ac : structure arpcom associee a l'interface */ /* */ /* addr : adresse internet du correspondant */ /* */ /* parametres de sortie : */ /* */ /* procedures appelantes : arptimer,arpresolve */ /* */ /* procedures appelees : ec_output */ /* */ /*************************************************************************/ arpwhohas(ac, addr) register struct arpcom *ac; struct in_addr *addr; { register struct mbuf *m; register struct ether_header *eh; register struct ether_arp *ea; struct sockaddr sa; /* * un mbuf est alloue pour construire le paquet de broadcast * ce paquet comporte une entete ETHER_ARP et un header ETHERNET. * Ce paquet est emis via la fonction ec_output qui en analysant * le type de paquet effectuera le traitement adequat. */ if ((m = m_get(M_DONTWAIT, MT_DATA)) == NULL) return; m->m_len = sizeof *ea + sizeof *eh; m->m_off = MMAXOFF - m->m_len; /* les data sont mis en fin de mbuf */ ea = mtod(m, struct ether_arp *); eh = (struct ether_header *)sa.sa_data; bzero((caddr_t)ea, sizeof (*ea)); bcopy((caddr_t)etherbroadcastaddr, (caddr_t)eh->ether_dhost, sizeof (etherbroadcastaddr)); eh->ether_type = ETHERPUP_ARPTYPE; /* if_output will swap */ ea->arp_hrd = htons(ARPHRD_ETHER); ea->arp_pro = htons(ETHERPUP_IPTYPE); ea->arp_hln = sizeof ea->arp_sha; /* hardware address length */ ea->arp_pln = sizeof ea->arp_spa; /* protocol address length */ ea->arp_op = htons(ARPOP_REQUEST); bcopy((caddr_t)ac->ac_enaddr, (caddr_t)ea->arp_sha, sizeof (ea->arp_sha)); bcopy((caddr_t)&((struct sockaddr_in *)&ac->ac_if.if_addr)->sin_addr, (caddr_t)ea->arp_spa, sizeof (ea->arp_spa)); bcopy((caddr_t)addr, (caddr_t)ea->arp_tpa, sizeof (ea->arp_tpa)); sa.sa_family = AF_UNSPEC; (void) (*ac->ac_if.if_output)(&ac->ac_if, m, &sa); } /************************************************************************/ /* */ /* nom : ARPRESOLVE */ /* */ /* fonction : resolution du mapping adresse internet-ethernet */ /* si l'assocation est realisee, retourne 1 */ /* sinon emet un paquet de broadcast sur le reseau */ /* */ /* parametres d'entree : */ /* ac : structure arpcom associee a l'interface */ /* */ /* m : adresse mbuf contenant le paquet */ /* */ /* destip : adresse internet du destinataire */ /* */ /* parametres de sortie : */ /* desten : adresse ethernet de l'interface */ /* */ /* procedures appelantes : ec_output */ /* */ /* procedures appelees : arptnew,arpwhohas,looutput */ /* */ /************************************************************************/ arpresolve(ac, m, destip, desten) register struct arpcom *ac; struct mbuf *m; register struct in_addr *destip; register u_char *desten; { register struct arptab *at; register struct ifnet *ifp; struct sockaddr_in sin; int s, lna; /* si le mapping internet-ethernet est resolu, l'adresse ethernet (desten) * est initialisee et la valeur 1 est rendue. * sinon deux cas se presentent : * -soit l'adresse internet n'est pas dans le cache : une entree est allouee * -soit l'adresse internet est dans le cache : * dans ces deux cas , un paquet de broadcast est emis et le paquet a emet- * tre est mis en attente. */ lna = in_lnaof(*destip); /* partie hote de l'adresse internet */ /* * si broadcast adress , on rend l'adresse materielle de l'adresse materielle * de broadcast (retour = 1) */ if (lna == INADDR_ANY) { /* broacast address */ bcopy((caddr_t)etherbroadcastaddr, (caddr_t)desten, sizeof (etherbroadcastaddr)); return (1); } ifp = &ac->ac_if; /* * si on est le destinataire, on utilise le loopback driver */ if (destip->s_addr == ((struct sockaddr_in *)&ifp->if_addr)-> sin_addr.s_addr) { sin.sin_family = AF_INET; sin.sin_addr = *destip; return (looutput(&loif, m, (struct sockaddr *)&sin)); } /* * si option interface = IFF_NOARP, l'adresse ethernet doit etre initialisee * dans arpcom */ /* ce test pose un probleme a cause de la valeur de "oldmap", * en cas d'adressage Internet de classe B ou C * On enleve ce qui concerne "oldmap". * if ((ifp->if_flags & IFF_NOARP) || lna >= oldmap) { */ if ((ifp->if_flags & IFF_NOARP)) { bcopy((caddr_t)ac->ac_enaddr, (caddr_t)desten, 3); desten[3] = (lna >> 16) & 0x7f; desten[4] = (lna >> 8) & 0xff; desten[5] = lna & 0xff; return (1); } /* * la recherche dans le cache se fait sous niveau d'it. */ s = splimp(); /* * recherche entree dans le cache */ ARPTAB_LOOK(at, destip->s_addr); if (at == 0) { /* not found */ at = arptnew(destip); at->at_hold = m; arpwhohas(ac, destip); splx(s); return (0); } at->at_timer = 0; /* restart the timer */ if (at->at_flags & ATF_COM) { /* entry IS complete */ bcopy((caddr_t)at->at_enaddr, (caddr_t)desten, 6); splx(s); return (1); } /* * il y a une entree dans le cache correspondant a l'adresse internet. * s'il y a un paquet en attente, il est perdu et le nouveau paquet a * emettre est chaine a sa place */ if (at->at_hold) m_freem(at->at_hold); at->at_hold = m; arpwhohas(ac, destip); /* ask again */ splx(s); return (0); } /********************************************************************/ /* */ /* nom : ARPMYADDR */ /* */ /* fonction : NON IMPLEMENTEE */ /* */ /********************************************************************/ struct in_addr arpmyaddr(ac) register struct arpcom *ac; { static struct in_addr addr; #ifdef lint ac = ac; #endif addr.s_addr = 0; return (addr); } /**************************************************************************/ /* */ /* nom : ARPINPUT */ /* */ /* fonction : arpinput est appele par la routine ec_send du module d'ac- */ /* ces Ethernet lorsqu'elle recoit un paquet de type */ /* ETHERPUP-ARP. */ /* arpinput controle la validite du paquet recu */ /* - s'il s'agit d'une requete et que l'adresse locale */ /* correspond on envoie un paquet de reponse */ /* - si le cache contient une entree correspondante, elle */ /* est completee. */ /* */ /* parametres d,entree : */ /* ac : structure arpcom partagee avec le module */ /* d'acces. */ /* */ /* m : chaine mbuf comportant le paquet */ /* */ /* parametres de sortie : */ /* */ /* procedures appelantes : ec_send */ /* */ /* procedures appelees : ec_output,arptnew */ /* */ /**************************************************************************/ arpinput(ac, m) register struct arpcom *ac; struct mbuf *m; { register struct ether_arp *ea; struct ether_header *eh; register struct arptab *at = 0; /* same as "merge" flag */ struct sockaddr_in sin; struct sockaddr sa; struct mbuf *mhold; struct in_addr isaddr,itaddr,myaddr; #ifdef SPS9 #define affectation(x,y) bcopy((caddr_t)ea->y, (caddr_t)&x.s_addr, \ sizeof (ea->y)); #endif /* SPS9 */ #ifdef SPS7 #define affectation(x,y) x.s_addr = ((struct in_addr *)ea->y)->s_addr; #endif /* SPS7 */ /* * controle validite du paquet recu (longueur) */ if (m->m_len < sizeof *ea) goto out; /* * initialisation de l'adresse de l'interface */ myaddr = ((struct sockaddr_in *)&ac->ac_if.if_addr)->sin_addr; ea = mtod(m, struct ether_arp *); /* * controle du type de paquet recu (ETHERPUP_IPTYPE) */ if (ntohs(ea->arp_pro) != ETHERPUP_IPTYPE) goto out; /* * adresse protocole emetteur */ affectation(isaddr, arp_spa); /* cadrage pour SPS9 */ /* isaddr.s_addr = ((struct in_addr *)ea->arp_spa)->s_addr; */ /* * adresse protocole destinataire */ affectation(itaddr, arp_tpa); /* cadrage pour SPS9 */ /* itaddr.s_addr = ((struct in_addr *)ea->arp_tpa)->s_addr; */ /* * si on est le protocole emetteur, on ignore le paquet */ if (!bcmp((caddr_t)ea->arp_sha, (caddr_t)ac->ac_enaddr, sizeof (ac->ac_enaddr))) goto out; /* it's from me, ignore it. */ /* * si adresse protocole emetteur = adresse interface */ if (isaddr.s_addr == myaddr.s_addr) { printf("duplicate IP address!! sent from ethernet address: "); printf("%x %x %x %x %x %x\n", ea->arp_sha[0], ea->arp_sha[1], ea->arp_sha[2], ea->arp_sha[3], ea->arp_sha[4], ea->arp_sha[5]); /* * si paquet de type requete, il faut repondre */ if (ntohs(ea->arp_op) == ARPOP_REQUEST) goto reply; goto out; } /* * recherche dans le cache de l'entree correspondant a l'adresse internet */ ARPTAB_LOOK(at, isaddr.s_addr); if (at) { /* * mise a jour entree dans le cache et emission du paquet en attente */ bcopy((caddr_t)ea->arp_sha, (caddr_t)at->at_enaddr, sizeof (ea->arp_sha)); at->at_flags |= ATF_COM; if (at->at_hold) { mhold = at->at_hold; at->at_hold = 0; sin.sin_family = AF_INET; sin.sin_addr = isaddr; (*ac->ac_if.if_output)(&ac->ac_if, mhold, (struct sockaddr *)&sin); } } /* * si on est pas destinataire, on sort */ if (itaddr.s_addr != myaddr.s_addr) goto out; /* if I am not the target */ /* * pas d'entree correspondant a l'adresse : on en alloue une et * on l'initialise */ if (at == 0) { /* ensure we have a table entry */ at = arptnew(&isaddr); bcopy((caddr_t)ea->arp_sha, (caddr_t)at->at_enaddr, sizeof (ea->arp_sha)); at->at_flags |= ATF_COM; } if (ntohs(ea->arp_op) != ARPOP_REQUEST) goto out; /* * construction du paquet de reponse */ reply: bcopy((caddr_t)ea->arp_sha, (caddr_t)ea->arp_tha, sizeof (ea->arp_sha)); bcopy((caddr_t)ea->arp_spa, (caddr_t)ea->arp_tpa, sizeof (ea->arp_spa)); bcopy((caddr_t)ac->ac_enaddr, (caddr_t)ea->arp_sha, sizeof (ea->arp_sha)); bcopy((caddr_t)&myaddr, (caddr_t)ea->arp_spa, sizeof (ea->arp_spa)); ea->arp_op = htons(ARPOP_REPLY); eh = (struct ether_header *)sa.sa_data; bcopy((caddr_t)ea->arp_tha, (caddr_t)eh->ether_dhost, sizeof (eh->ether_dhost)); eh->ether_type = ETHERPUP_ARPTYPE; sa.sa_family = AF_UNSPEC; (*ac->ac_if.if_output)(&ac->ac_if, m, &sa); return; out: /* * liberation du paquet a emettre */ m_freem(m); return; } /***********************************************************************/ /* */ /* nom : ARPTFREE */ /* */ /* fonction : liberation d'une entree dans le cache mapping adresses */ /* si un paquet est en attente, on libere la chaine mbuf */ /* correspondante. Tous les champs de l'entree sont mis a */ /* zero. */ /* */ /* parametres d'entree : */ /* at : adresse de l'entree concernee */ /* */ /* parametres de sortie : */ /* */ /* procedures appelantes : arptimer, arptnew */ /* */ /* procedures appelees : */ /* */ /***********************************************************************/ arptfree(at) register struct arptab *at; { /* * la mise a jour de l'entree se fait sous masque */ int s = splimp(); /* * si un paquet est en attente , il y a liberation de la chaine de mbufs * le constituant. */ if (at->at_hold) m_freem(at->at_hold); at->at_hold = 0; at->at_timer = at->at_flags = 0; at->at_iaddr.s_addr = 0; /* * demasquage */ splx(s); } /***********************************************************************/ /* */ /* nom : ARPTNEW */ /* */ /* fonction : insertion d'une nouvelle adresse dans le cache. si */ /* celui-ci est plein,l'entree la plus ancienne est sup- */ /* primee. */ /* */ /* parametres d'entree : */ /* addr : adresse Internet */ /* */ /* parametres de sortie : */ /* */ /* procedures appelantes : arpinput, arpresolve */ /* */ /* procedures appelees : arptfree */ /* */ /***********************************************************************/ struct arptab * arptnew(addr) struct in_addr *addr; { register n; int oldest = 0; register struct arptab *at, *ato; /* * parcours de la table cache a la recherche d'une entree libre (flags = 0) */ ato = at = &arptab[ARPTAB_HASH(addr->s_addr) * ARPTAB_BSIZ]; for (n = 0 ; n < ARPTAB_BSIZ ; n++,at++) { if (at->at_flags == 0) goto out; /* found an empty entry */ /* * si entree occupee, comparaison de son timer avec la valeur la plus * elevee rencontree auparavant. Mise a jour eventuelle de cette valeur * maximale. */ if (at->at_timer > oldest) { oldest = at->at_timer; ato = at; } } /* * si aucune entree libre, on libere la plus anciennement utilisee */ at = ato; arptfree(at); out: /* * initialisation de l'entree allouee */ at->at_iaddr = *addr; at->at_flags = ATF_INUSE; return (at); } E 1 h54004 s 00001/00001/00342 d D 4.8 87/05/20 13:30:03 brian 12 11 c mbuf.h put back on system search path BB e s 00001/00002/00342 d D 4.7 87/05/14 16:41:16 build 11 10 c removed old SCCS strings and inserted #ident BB e s 00001/00001/00343 d D 4.6 87/05/07 19:15:49 van 10 9 c van - move defsocket.h back to /usr/include/sys e s 00013/00013/00331 d D 4.5 87/04/30 19:24:42 van 9 8 c van - moved net and netinet includes e s 00004/00004/00340 d D 4.4 87/04/29 20:03:30 van 8 7 c van - moved ucb networking includes to INCUCB e s 00008/00008/00336 d D 4.3 87/04/15 17:57:07 dc 7 6 c dc - changed #include "sys/..." to #include e s 00006/00003/00338 d D 4.2 87/04/08 11:24:27 van 6 5 c van - Borrow algorithm from 4.3 (RFC 896) for congestion control c so we don't transmit lots of short packets back-to-back. Fixes c 30 sec delay problem. e s 00000/00000/00341 d D 4.1 87/02/20 13:38:41 build 5 4 c rolled rev to -r4 /dc e s 00000/00000/00341 d D 3.1 87/01/19 09:29:24 build 4 3 c rolled rev to -r3 /dc e s 00000/00000/00341 d D 2.1 87/01/19 09:29:24 build 3 2 c AUTO NULL DELTA e s 00001/00000/00340 d D 1.2 87/01/16 10:25:03 build 2 1 c add ident string /dc e s 00340/00000/00000 d D 1.1 87/01/09 18:12:39 build 1 0 c Placed under source control - dc e u U f b f n t T I 2 D 11 /* "%W% %E%" */ E 2 I 1 static char sccsid[] = "@(#)Wed Apr 23 15:09:07 EET 1986~ BULL-SEMS V21 netinet/tcp_output" ; E 11 I 11 #ident " %W% %E% " E 11 /* tcp_output.c 6.1 83/07/29 */ D 7 #include "sys/defsocket.h" /* SOC systeme V */ #include "sys/types.h" /* SOC systeme V */ #include "sys/param.h" #include "sys/systm.h" #include "sys/mbuf.h" #include "sys/socket.h" #include "sys/socketvar.h" #include "sys/errno.h" /* SOC systeme V */ E 7 I 7 D 8 #include /* SOC systeme V */ E 8 I 8 D 10 #include "sys/defsocket.h" /* SOC systeme V */ E 10 I 10 #include /* SOC systeme V */ E 10 E 8 #include /* SOC systeme V */ #include #include D 8 #include #include #include E 8 I 8 D 12 #include "sys/mbuf.h" E 12 I 12 #include E 12 #include "sys/socket.h" #include "sys/socketvar.h" E 8 #include /* SOC systeme V */ E 7 D 9 #include "../net/route.h" E 9 I 9 #include "net/route.h" E 9 D 9 #include "in.h" #include "in_pcb.h" #include "in_systm.h" #include "ip.h" #include "ip_var.h" #include "tcp.h" E 9 I 9 #include "netinet/in.h" #include "netinet/in_pcb.h" #include "netinet/in_systm.h" #include "netinet/ip.h" #include "netinet/ip_var.h" #include "netinet/tcp.h" E 9 #define TCPOUTFLAGS D 9 #include "tcp_fsm.h" #include "tcp_seq.h" #include "tcp_timer.h" #include "tcp_var.h" #include "tcpip.h" #include "tcp_debug.h" E 9 I 9 #include "netinet/tcp_fsm.h" #include "netinet/tcp_seq.h" #include "netinet/tcp_timer.h" #include "netinet/tcp_var.h" #include "netinet/tcpip.h" #include "netinet/tcp_debug.h" E 9 /* * Initial options. */ u_char tcp_initopt[4] = { TCPOPT_MAXSEG, 4, 0x0, 0x0, }; /* * Tcp output routine: figure out what should be sent and send it. */ tcp_output(tp) register struct tcpcb *tp; { register struct socket *so = tp->t_inpcb->inp_socket; register int len; struct mbuf *m0; int off, flags, win, error; register struct mbuf *m; register struct tcpiphdr *ti; u_char *opt; unsigned optlen = 0; D 6 int sendalot; E 6 I 6 int idle, sendalot; E 6 /* * Determine length of data that should be transmitted, * and flags that will be used. * If there is some data or critical controls (SYN, RST) * to send, then transmit; otherwise, investigate further. */ I 6 idle = (tp->snd_max == tp->snd_una); E 6 again: sendalot = 0; off = tp->snd_nxt - tp->snd_una; len = MIN(so->so_snd.sb_cc, tp->snd_wnd+tp->t_force) - off; if (len < 0) return (0); /* ??? */ /* past FIN */ if (len > tp->t_maxseg) { len = tp->t_maxseg; sendalot = 1; } flags = tcp_outflags[tp->t_state]; D 6 if (tp->snd_nxt + len < tp->snd_una + so->so_snd.sb_cc) E 6 I 6 if (SEQ_LT(tp->snd_nxt + len, tp->snd_una + so->so_snd.sb_cc)) E 6 flags &= ~TH_FIN; if (flags & (TH_SYN|TH_RST|TH_FIN)) goto send; if (SEQ_GT(tp->snd_up, tp->snd_una)) goto send; /* * Sender silly window avoidance. If can send all data, * a maximum segment, at least 1/4 of window do it, * or are forced, do it; otherwise don't bother. */ if (len) { D 6 if (len == tp->t_maxseg || off+len >= so->so_snd.sb_cc) E 6 I 6 if (len == tp->t_maxseg) goto send; if (idle && (len + off >= so->so_snd.sb_cc)) E 6 goto send; if (len * 4 >= tp->snd_wnd) /* a lot */ goto send; if (tp->t_force) goto send; } /* * Send if we owe peer an ACK. */ if (tp->t_flags&TF_ACKNOW) goto send; /* * Calculate available window in i, and also amount * of window known to peer (as advertised window less * next expected input.) If this is 35% or more of the * maximum possible window, then want to send a segment to peer. */ win = sbspace(&so->so_rcv); if (win < 0) { win = 0; } if (win > 0 && ((100*(win-(tp->rcv_adv-tp->rcv_nxt))/so->so_rcv.sb_hiwat) >= 35)) goto send; /* * TCP window updates are not reliable, rather a polling protocol * using ``persist'' packets is used to insure receipt of window * updates. The three ``states'' for the output side are: * idle not doing retransmits or persists * persisting to move a zero window * (re)transmitting and thereby not persisting * * tp->t_timer[TCPT_PERSIST] * is set when we are in persist state. * tp->t_force * is set when we are called to send a persist packet. * tp->t_timer[TCPT_REXMT] * is set when we are retransmitting * The output side is idle when both timers are zero. * * If send window is closed, there is data to transmit, and no * retransmit or persist is pending, then go to persist state, * arranging to force out a byte to get more current window information * if nothing happens soon. */ if (tp->snd_wnd == 0 && so->so_snd.sb_cc && tp->t_timer[TCPT_REXMT] == 0 && tp->t_timer[TCPT_PERSIST] == 0) { tp->t_rxtshift = 0; tcp_setpersist(tp); } /* * No reason to send a segment, just return. */ return (0); send: /* * Grab a header mbuf, attaching a copy of data to * be transmitted, and initialize the header from * the template for sends on this connection. */ MBGET(m, M_DONTWAIT, MT_HEADER); /* jm */ if (m == NULL) return (ENOBUFS); m->m_off = MMAXOFF - sizeof (struct tcpiphdr); m->m_len = sizeof (struct tcpiphdr); if (len) { m->m_next = m_copy(so->so_snd.sb_mb, off, len); if (m->m_next == 0) len = 0; } ti = mtod(m, struct tcpiphdr *); if (tp->t_template == 0) panic("tcp_output"); bcopy((caddr_t)tp->t_template, (caddr_t)ti, sizeof (struct tcpiphdr)); /* * Fill in fields, remembering maximum advertised * window for use in delaying messages about window sizes. */ ti->ti_seq = tp->snd_nxt; ti->ti_ack = tp->rcv_nxt; ti->ti_seq = htonl(ti->ti_seq); ti->ti_ack = htonl(ti->ti_ack); /* * Before ESTABLISHED, force sending of initial options * unless TCP set to not do any options. */ if (tp->t_state < TCPS_ESTABLISHED) { if (tp->t_flags&TF_NOOPT) goto noopt; opt = tcp_initopt; optlen = sizeof (tcp_initopt); *(u_short *)(opt + 2) = MIN(so->so_rcv.sb_hiwat / 2, 1024); *(u_short *)(opt + 2) = htons(*(u_short *)(opt + 2)); } else { if (tp->t_tcpopt == 0) goto noopt; opt = mtod(tp->t_tcpopt, u_char *); optlen = tp->t_tcpopt->m_len; } if (opt) { m0 = m->m_next; m->m_next = m_get(M_DONTWAIT, MT_DATA); if (m->m_next == 0) { (void) m_free(m); m_freem(m0); return (ENOBUFS); } m->m_next->m_next = m0; m0 = m->m_next; m0->m_len = optlen; bcopy((caddr_t)opt, mtod(m0, caddr_t), optlen); opt = (u_char *)(mtod(m0, caddr_t) + optlen); while (m0->m_len & 0x3) { *opt++ = TCPOPT_EOL; m0->m_len++; } optlen = m0->m_len; ti->ti_off = (sizeof (struct tcphdr) + optlen) >> 2; } noopt: ti->ti_flags = flags; win = sbspace(&so->so_rcv); if (win < so->so_rcv.sb_hiwat / 4) /* avoid silly window */ win = 0; if (win > 0) ti->ti_win = htons((u_short)win); if (SEQ_GT(tp->snd_up, tp->snd_nxt)) { ti->ti_urp = tp->snd_up - tp->snd_nxt; ti->ti_urp = htons(ti->ti_urp); ti->ti_flags |= TH_URG; } else /* * If no urgent pointer to send, then we pull * the urgent pointer to the left edge of the send window * so that it doesn't drift into the send window on sequence * number wraparound. */ tp->snd_up = tp->snd_una; /* drag it along */ /* * If anything to send and we can send it all, set PUSH. * (This will keep happy those implementations which only * give data to the user when a buffer fills or a PUSH comes in.) */ if (len && off+len == so->so_snd.sb_cc) ti->ti_flags |= TH_PUSH; /* * Put TCP length in extended header, and then * checksum extended header and data. */ if (len + optlen) { ti->ti_len = sizeof (struct tcphdr) + optlen + len; ti->ti_len = htons((u_short)ti->ti_len); } ti->ti_sum = in_cksum(m, sizeof (struct tcpiphdr) + (int)optlen + len); /* * In transmit state, time the transmission and arrange for * the retransmit. In persist state, reset persist time for * next persist. */ if (tp->t_force == 0) { /* * Advance snd_nxt over sequence space of this segment. */ if (flags & (TH_SYN|TH_FIN)) tp->snd_nxt++; tp->snd_nxt += len; if (SEQ_GT(tp->snd_nxt, tp->snd_max)) tp->snd_max = tp->snd_nxt; /* * Time this transmission if not a retransmission and * not currently timing anything. */ if (SEQ_GT(tp->snd_nxt, tp->snd_max) && tp->t_rtt == 0) { tp->t_rtt = 1; /* jm tout * 10 */ tp->t_rtseq = tp->snd_nxt - len; } /* * Set retransmit timer if not currently set. * Initial value for retransmit timer to tcp_beta*tp->t_srtt. * Initialize shift counter which is used for exponential * backoff of retransmit time. */ if (tp->t_timer[TCPT_REXMT] == 0 && tp->snd_nxt != tp->snd_una) { TCPT_RANGESET(tp->t_timer[TCPT_REXMT], tcp_beta * tp->t_srtt, TCPTV_MIN, TCPTV_MAX); tp->t_rtt = 0; tp->t_rxtshift = 0; } tp->t_timer[TCPT_PERSIST] = 0; } else { if (SEQ_GT(tp->snd_una+1, tp->snd_max)) tp->snd_max = tp->snd_una+1; } /* * Trace. */ if (so->so_options & SO_DEBUG) tcp_trace(TA_OUTPUT, tp->t_state, tp, ti, 0); /* * Fill in IP length and desired time to live and * send to IP level. */ ((struct ip *)ti)->ip_len = sizeof (struct tcpiphdr) + optlen + len; ((struct ip *)ti)->ip_ttl = TCP_TTL; if (so->so_options & SO_DONTROUTE) error = ip_output(m, tp->t_ipopt, (struct route *)0, IP_ROUTETOIF); else error = ip_output(m, tp->t_ipopt, &tp->t_inpcb->inp_route, 0); if (error) return (error); /* * Data sent (as far as we can tell). * If this advertises a larger window than any other segment, * then remember the size of the advertised window. * Drop send for purpose of ACK requirements. */ if (win > 0 && SEQ_GT(tp->rcv_nxt+win, tp->rcv_adv)) tp->rcv_adv = tp->rcv_nxt + win; #ifdef ROSSE tp->rcv_adv = tp->rcv_nxt + win; #endif /* ROSSE */ tp->t_flags &= ~(TF_ACKNOW|TF_DELACK); if (sendalot && tp->t_force == 0) goto again; return (0); } tcp_setpersist(tp) register struct tcpcb *tp; { if (tp->t_timer[TCPT_REXMT]) panic("tcp_output REXMT"); /* * Start/restart persistance timer. */ TCPT_RANGESET(tp->t_timer[TCPT_PERSIST], ((int)(tcp_beta * tp->t_srtt)) << tp->t_rxtshift, TCPTV_PERSMIN, TCPTV_MAX); tp->t_rxtshift++; if (tp->t_rxtshift >= TCP_MAXRXTSHIFT) tp->t_rxtshift = 0; } E 1 h64729 s 00001/00001/00275 d D 4.7 87/05/20 13:30:22 brian 11 10 c mbuf.h put back on system search path BB e s 00001/00002/00275 d D 4.6 87/05/14 16:41:29 build 10 9 c removed old SCCS strings and inserted #ident BB e s 00001/00001/00276 d D 4.5 87/05/07 19:15:54 van 9 8 c van - move defsocket.h back to /usr/include/sys e s 00014/00014/00263 d D 4.4 87/04/30 19:24:44 van 8 7 c van - moved net and netinet includes e s 00004/00004/00273 d D 4.3 87/04/29 20:03:32 van 7 6 c van - moved ucb networking includes to INCUCB e s 00008/00008/00269 d D 4.2 87/04/15 17:57:18 dc 6 5 c dc - changed #include "sys/..." to #include e s 00000/00000/00277 d D 4.1 87/02/20 13:38:45 build 5 4 c rolled rev to -r4 /dc e s 00000/00000/00277 d D 3.1 87/01/19 09:29:29 build 4 3 c rolled rev to -r3 /dc e s 00000/00000/00277 d D 2.1 87/01/19 09:29:29 build 3 2 c AUTO NULL DELTA e s 00001/00000/00276 d D 1.2 87/01/16 10:25:07 build 2 1 c add ident string /dc e s 00276/00000/00000 d D 1.1 87/01/09 18:12:40 build 1 0 c Placed under source control - dc e u U f b f n t T I 2 D 10 /* "%W% %E%" */ E 2 I 1 static char sccsid[] = "@(#)Wed Apr 23 15:09:33 EET 1986~ BULL-SEMS V21 netinet/tcp_subr" ; E 10 I 10 #ident " %W% %E% " E 10 /* tcp_subr.c 6.1 83/07/29 */ D 6 #include "sys/defsocket.h" #include "sys/types.h" E 6 I 6 D 7 #include E 7 I 7 D 9 #include "sys/defsocket.h" E 9 I 9 #include E 9 E 7 #include E 6 D 6 #include "sys/param.h" #include "sys/systm.h" #include "sys/mbuf.h" #include "sys/socket.h" #include "sys/socketvar.h" #include "sys/errno.h" E 6 I 6 #include #include D 7 #include #include #include E 7 I 7 D 11 #include "sys/mbuf.h" E 11 I 11 #include E 11 #include "sys/socket.h" #include "sys/socketvar.h" E 7 #include E 6 D 8 #include "../net/route.h" #include "../net/if.h" E 8 I 8 #include "net/route.h" #include "net/if.h" E 8 D 8 #include "in.h" #include "in_pcb.h" #include "in_systm.h" #include "ip.h" #include "ip_var.h" #include "ip_icmp.h" #include "tcp.h" #include "tcp_fsm.h" #include "tcp_seq.h" #include "tcp_timer.h" #include "tcp_var.h" #include "tcpip.h" E 8 I 8 #include "netinet/in.h" #include "netinet/in_pcb.h" #include "netinet/in_systm.h" #include "netinet/ip.h" #include "netinet/ip_var.h" #include "netinet/ip_icmp.h" #include "netinet/tcp.h" #include "netinet/tcp_fsm.h" #include "netinet/tcp_seq.h" #include "netinet/tcp_timer.h" #include "netinet/tcp_var.h" #include "netinet/tcpip.h" E 8 /* * Tcp initialization */ tcp_init() { tcp_iss = 1; /* wrong */ tcb.inp_next = tcb.inp_prev = &tcb; tcp_alpha = TCP_ALPHA; tcp_beta = TCP_BETA; } /* * Create template to be used to send tcp packets on a connection. * Call after host entry created, allocates an mbuf and fills * in a skeletal tcp/ip header, minimizing the amount of work * necessary when the connection is used. */ struct tcpiphdr * tcp_template(tp) struct tcpcb *tp; { register struct inpcb *inp = tp->t_inpcb; register struct mbuf *m; register struct tcpiphdr *n; m = m_get(M_WAIT, MT_HEADER); if (m == NULL) return (0); m->m_off = MMAXOFF - sizeof (struct tcpiphdr); m->m_len = sizeof (struct tcpiphdr); n = mtod(m, struct tcpiphdr *); n->ti_next = n->ti_prev = 0; n->ti_x1 = 0; n->ti_pr = IPPROTO_TCP; n->ti_len = htons(sizeof (struct tcpiphdr) - sizeof (struct ip)); n->ti_src = inp->inp_laddr; n->ti_dst = inp->inp_faddr; n->ti_sport = inp->inp_lport; n->ti_dport = inp->inp_fport; n->ti_seq = 0; n->ti_ack = 0; n->ti_x2 = 0; n->ti_off = 5; n->ti_flags = 0; n->ti_win = 0; n->ti_sum = 0; n->ti_urp = 0; return (n); } /* * Send a single message to the TCP at address specified by * the given TCP/IP header. If flags==0, then we make a copy * of the tcpiphdr at ti and send directly to the addressed host. * This is used to force keep alive messages out using the TCP * template for a connection tp->t_template. If flags are given * then we send a message back to the TCP which originated the * segment ti, and discard the mbuf containing it and any other * attached mbufs. * * In any case the ack and sequence number of the transmitted * segment are as specified by the parameters. */ tcp_respond(tp, ti, ack, seq, flags) struct tcpcb *tp; register struct tcpiphdr *ti; tcp_seq ack, seq; int flags; { struct mbuf *m; int win = 0, tlen; struct route *ro = 0; if (tp) { win = sbspace(&tp->t_inpcb->inp_socket->so_rcv); if (win < 0) { win = 0; } ro = &tp->t_inpcb->inp_route; } if (flags == 0) { m = m_get(M_DONTWAIT, MT_HEADER); if (m == NULL) return; m->m_len = sizeof (struct tcpiphdr) + 1; *mtod(m, struct tcpiphdr *) = *ti; ti = mtod(m, struct tcpiphdr *); flags = TH_ACK; tlen = 1; } else { m = dtom(ti); m_freem(m->m_next); m->m_next = 0; m->m_off = (int)ti - (int)m; m->m_len = sizeof (struct tcpiphdr); #define xchg(a,b,type) { type t; t=a; a=b; b=t; } xchg(ti->ti_dst.s_addr, ti->ti_src.s_addr, u_long); xchg(ti->ti_dport, ti->ti_sport, u_short); #undef xchg tlen = 0; } ti->ti_next = ti->ti_prev = 0; ti->ti_x1 = 0; ti->ti_len = htons((u_short)(sizeof (struct tcphdr) + tlen)); ti->ti_seq = htonl(seq); ti->ti_ack = htonl(ack); ti->ti_x2 = 0; ti->ti_off = sizeof (struct tcphdr) >> 2; ti->ti_flags = flags; ti->ti_win = htons((u_short)win); ti->ti_urp = 0; ti->ti_sum = in_cksum(m, sizeof (struct tcpiphdr) + tlen); ((struct ip *)ti)->ip_len = sizeof (struct tcpiphdr) + tlen; ((struct ip *)ti)->ip_ttl = TCP_TTL; (void) ip_output(m, (struct mbuf *)0, ro, 0); } /* * Create a new TCP control block, making an * empty reassembly queue and hooking it to the argument * protocol control block. */ struct tcpcb * tcp_newtcpcb(inp) struct inpcb *inp; { struct mbuf *m = m_getclr(M_DONTWAIT, MT_PCB); register struct tcpcb *tp; if (m == NULL) return ((struct tcpcb *)0); tp = mtod(m, struct tcpcb *); tp->seg_next = tp->seg_prev = (struct tcpiphdr *)tp; /* * If the default maximum IP packet size is 576 bytes * and a standard IP header is 20 bytes, with a TCP * header of 20 bytes plus the options necessary to * upgrade it to something higher, then initialize the * maximum segment size to 576 - (20 + 20 + 8 + slop). */ tp->t_maxseg = 512; /* satisfy the rest of the world */ tp->t_flags = 0; /* sends options! */ tp->t_inpcb = inp; inp->inp_ppcb = (caddr_t)tp; return (tp); } /* * Drop a TCP connection, reporting * the specified error. If connection is synchronized, * then send a RST to peer. */ struct tcpcb * tcp_drop(tp, errno) register struct tcpcb *tp; int errno; { struct socket *so = tp->t_inpcb->inp_socket; if (TCPS_HAVERCVDSYN(tp->t_state)) { tp->t_state = TCPS_CLOSED; (void) tcp_output(tp); } so->so_error = errno; return (tcp_close(tp)); } tcp_abort(inp) struct inpcb *inp; { (void) tcp_close((struct tcpcb *)inp->inp_ppcb); } /* * Close a TCP control block: * discard all space held by the tcp * discard internet protocol block * wake up any sleepers */ struct tcpcb * tcp_close(tp) register struct tcpcb *tp; { register struct tcpiphdr *t; struct inpcb *inp = tp->t_inpcb; struct socket *so = inp->inp_socket; register struct mbuf *m; u_short protection; t = tp->seg_next; while (t != (struct tcpiphdr *)tp) { t = (struct tcpiphdr *)t->ti_next; m = dtom(t->ti_prev); remque(t->ti_prev); m_freem(m); } if (tp->t_template) (void) m_free(dtom(tp->t_template)); if (tp->t_tcpopt) (void) m_free(dtom(tp->t_tcpopt)); if (tp->t_ipopt) (void) m_free(dtom(tp->t_ipopt)); (void) m_free(dtom(tp)); protection = spl7(); inp->inp_ppcb = 0; soisdisconnected(so); in_pcbdetach(inp); splx(protection); return ((struct tcpcb *)0); } tcp_drain() { } tcp_ctlinput(cmd, arg) int cmd; caddr_t arg; { struct in_addr *sin; extern u_char inetctlerrmap[]; if (cmd < 0 || cmd > PRC_NCMDS) return; switch (cmd) { case PRC_ROUTEDEAD: break; case PRC_QUENCH: break; /* these are handled by ip */ case PRC_IFDOWN: case PRC_HOSTDEAD: case PRC_HOSTUNREACH: break; default: sin = &((struct icmp *)arg)->icmp_ip.ip_dst; in_pcbnotify(&tcb, sin, (int)inetctlerrmap[cmd], tcp_abort); } } E 1 h51319 s 00001/00001/00207 d D 4.7 87/05/20 13:30:37 brian 11 10 c mbuf.h put back on system search path BB e s 00001/00002/00207 d D 4.6 87/05/14 16:41:44 build 10 9 c removed old SCCS strings and inserted #ident BB e s 00001/00001/00208 d D 4.5 87/05/07 19:16:00 van 9 8 c van - move defsocket.h back to /usr/include/sys e s 00013/00013/00196 d D 4.4 87/04/30 19:24:46 van 8 7 c van - moved net and netinet includes e s 00004/00004/00205 d D 4.3 87/04/29 20:03:36 van 7 6 c van - moved ucb networking includes to INCUCB e s 00008/00008/00201 d D 4.2 87/04/15 17:57:28 dc 6 5 c dc - changed #include "sys/..." to #include e s 00000/00000/00209 d D 4.1 87/02/20 13:38:51 build 5 4 c rolled rev to -r4 /dc e s 00000/00000/00209 d D 3.1 87/01/19 09:29:35 build 4 3 c rolled rev to -r3 /dc e s 00000/00000/00209 d D 2.1 87/01/19 09:29:35 build 3 2 c AUTO NULL DELTA e s 00001/00000/00208 d D 1.2 87/01/16 10:25:14 build 2 1 c add ident string /dc e s 00208/00000/00000 d D 1.1 87/01/09 18:12:41 build 1 0 c Placed under source control - dc e u U f b f n t T I 2 D 10 /* "%W% %E%" */ E 2 I 1 static char sccsid[] = "@(#)Wed Apr 23 15:09:50 EET 1986~ BULL-SEMS V21 netinet/tcp_timer" ; E 10 I 10 #ident " %W% %E% " E 10 /* tcp_timer.c 6.1 83/07/29 */ D 6 #include "sys/defsocket.h" /* SOC systeme V */ #include "sys/types.h" /* SOC systeme V */ #include "sys/param.h" #include "sys/systm.h" #include "sys/mbuf.h" #include "sys/socket.h" #include "sys/socketvar.h" #include "sys/errno.h" /* SOC systeme V */ E 6 I 6 D 7 #include /* SOC systeme V */ E 7 I 7 D 9 #include "sys/defsocket.h" /* SOC systeme V */ E 9 I 9 #include /* SOC systeme V */ E 9 E 7 #include /* SOC systeme V */ #include #include D 7 #include #include #include E 7 I 7 D 11 #include "sys/mbuf.h" E 11 I 11 #include E 11 #include "sys/socket.h" #include "sys/socketvar.h" E 7 #include /* SOC systeme V */ E 6 D 8 #include "../net/if.h" #include "../net/route.h" E 8 I 8 #include "net/if.h" #include "net/route.h" E 8 D 8 #include "in.h" #include "in_pcb.h" #include "in_systm.h" #include "ip.h" #include "ip_var.h" #include "tcp.h" #include "tcp_fsm.h" #include "tcp_seq.h" #include "tcp_timer.h" #include "tcp_var.h" #include "tcpip.h" E 8 I 8 #include "netinet/in.h" #include "netinet/in_pcb.h" #include "netinet/in_systm.h" #include "netinet/ip.h" #include "netinet/ip_var.h" #include "netinet/tcp.h" #include "netinet/tcp_fsm.h" #include "netinet/tcp_seq.h" #include "netinet/tcp_timer.h" #include "netinet/tcp_var.h" #include "netinet/tcpip.h" E 8 int tcpnodelack = 0; /* * Fast timeout routine for processing delayed acks */ tcp_fasttimo() { register struct inpcb *inp; register struct tcpcb *tp; int s = splnet(); inp = tcb.inp_next; if (inp) for (; inp != &tcb; inp = inp->inp_next) if ((tp = (struct tcpcb *)inp->inp_ppcb) && (tp->t_flags & TF_DELACK)) { tp->t_flags &= ~TF_DELACK; tp->t_flags |= TF_ACKNOW; (void) tcp_output(tp); } splx(s); } /* * Tcp protocol timeout routine called every 500 ms. * Updates the timers in all active tcb's and * causes finite state machine actions if timers expire. */ tcp_slowtimo() { register struct inpcb *ip, *ipnxt; register struct tcpcb *tp; int s = splnet(); register int i; /* * Search through tcb's and update active timers. */ ip = tcb.inp_next; if (ip == 0) { splx(s); return; } while (ip != &tcb) { tp = intotcpcb(ip); if (tp == 0) continue; ipnxt = ip->inp_next; for (i = 0; i < TCPT_NTIMERS; i++) { if (tp->t_timer[i] && --tp->t_timer[i] == 0) { (void) tcp_usrreq(tp->t_inpcb->inp_socket, PRU_SLOWTIMO, (struct mbuf *)0, (struct mbuf *)i, (struct mbuf *)0); if (ipnxt->inp_prev != ip) goto tpgone; } } tp->t_idle++; if (tp->t_rtt) tp->t_rtt += 1; /* jm _rtt++ */ tpgone: ip = ipnxt; } tcp_iss += TCP_ISSINCR/PR_SLOWHZ; /* increment iss */ splx(s); } /* * Cancel all timers for TCP tp. */ tcp_canceltimers(tp) struct tcpcb *tp; { register int i; for (i = 0; i < TCPT_NTIMERS; i++) tp->t_timer[i] = 0; } #ifdef FLOAT float tcp_backoff[TCP_MAXRXTSHIFT] = { 1.0, 1.2, 1.4, 1.7, 2.0, 3.0, 5.0, 8.0, 16.0, 32.0 }; #else int tcp_backoff[TCP_MAXRXTSHIFT] = { 10, 12, 14, 17, 20, 30, 50, 80, 160, 320 }; #endif int tcpexprexmtbackoff = 0; /* * TCP timer processing. */ struct tcpcb * tcp_timers(tp, timer) register struct tcpcb *tp; int timer; { switch (timer) { /* * 2 MSL timeout in shutdown went off. Delete connection * control block. */ case TCPT_2MSL: tp = tcp_close(tp); break; /* * Retransmission timer went off. Message has not * been acked within retransmit interval. Back off * to a longer retransmit interval and retransmit all * unacknowledged messages in the window. */ case TCPT_REXMT: tp->t_rxtshift++; if (tp->t_rxtshift > TCP_MAXRXTSHIFT) { tp = tcp_drop(tp, ETIMEDOUT); break; } TCPT_RANGESET(tp->t_timer[TCPT_REXMT], (int)tp->t_srtt, TCPTV_MIN, TCPTV_MAX); if (tcpexprexmtbackoff) { TCPT_RANGESET(tp->t_timer[TCPT_REXMT], tp->t_timer[TCPT_REXMT] << tp->t_rxtshift, TCPTV_MIN, TCPTV_MAX); } else { TCPT_RANGESET(tp->t_timer[TCPT_REXMT], tp->t_timer[TCPT_REXMT] * tcp_backoff[tp->t_rxtshift - 1], TCPTV_MIN, TCPTV_MAX); } tp->snd_nxt = tp->snd_una; /* this only transmits one segment! */ (void) tcp_output(tp); break; /* * Persistance timer into zero window. * Force a byte to be output, if possible. */ case TCPT_PERSIST: tcp_setpersist(tp); tp->t_force = 1; (void) tcp_output(tp); tp->t_force = 0; break; /* * Keep-alive timer went off; send something * or drop connection if idle for too long. */ case TCPT_KEEP: if (tp->t_state < TCPS_ESTABLISHED) goto dropit; if (tp->t_inpcb->inp_socket->so_options & SO_KEEPALIVE) { if (tp->t_idle >= TCPTV_MAXIDLE) goto dropit; /* * Saying tp->rcv_nxt-1 lies about what * we have received, and by the protocol spec * requires the correspondent TCP to respond. * Saying tp->snd_una-1 causes the transmitted * byte to lie outside the receive window; this * is important because we don't necessarily * have a byte in the window to send (consider * a one-way stream!) */ #ifdef ROSSE tcp_respond(tp, tp->t_template, tp->rcv_nxt, tp->snd_una-1, 0); #else tcp_respond(tp, tp->t_template, tp->rcv_nxt-1, tp->snd_una-1, 0); #endif /* ROSSE */ } else tp->t_idle = 0; tp->t_timer[TCPT_KEEP] = TCPTV_KEEP; break; dropit: tp = tcp_drop(tp, ETIMEDOUT); break; } return (tp); } E 1 h04814 s 00001/00001/00396 d D 4.7 87/05/20 13:30:53 brian 11 10 c mbuf.h put back on system search path BB e s 00001/00002/00396 d D 4.6 87/05/14 16:41:58 build 10 9 c removed old SCCS strings and inserted #ident BB e s 00001/00001/00397 d D 4.5 87/05/07 19:16:02 van 9 8 c van - move defsocket.h back to /usr/include/sys e s 00014/00014/00384 d D 4.4 87/04/30 19:24:48 van 8 7 c van - moved net and netinet includes e s 00004/00004/00394 d D 4.3 87/04/29 20:03:39 van 7 6 c van - moved ucb networking includes to INCUCB e s 00008/00008/00390 d D 4.2 87/04/15 17:57:35 dc 6 5 c dc - changed #include "sys/..." to #include e s 00000/00000/00398 d D 4.1 87/02/20 13:38:54 build 5 4 c rolled rev to -r4 /dc e s 00000/00000/00398 d D 3.1 87/01/19 09:29:39 build 4 3 c rolled rev to -r3 /dc e s 00000/00000/00398 d D 2.1 87/01/19 09:29:39 build 3 2 c AUTO NULL DELTA e s 00001/00000/00397 d D 1.2 87/01/16 10:25:18 build 2 1 c add ident string /dc e s 00397/00000/00000 d D 1.1 87/01/09 18:12:42 build 1 0 c Placed under source control - dc e u U f b f n t T I 2 D 10 /* "%W% %E%" */ E 2 I 1 static char sccsid[] = "@(#)Wed Apr 23 15:10:02 EET 1986~ BULL-SEMS V21 netinet/tcp_usrreq" ; E 10 I 10 #ident " %W% %E% " E 10 /* tcp_usrreq.c 6.1 83/07/29 */ D 6 #include "sys/defsocket.h" /* SOC systeme V */ #include "sys/types.h" /* SOC systeme V */ #include "sys/param.h" #include "sys/systm.h" #include "sys/mbuf.h" #include "sys/socket.h" #include "sys/socketvar.h" #include "sys/errno.h" /* SOC systeme V */ E 6 I 6 D 7 #include /* SOC systeme V */ E 7 I 7 D 9 #include "sys/defsocket.h" /* SOC systeme V */ E 9 I 9 #include /* SOC systeme V */ E 9 E 7 #include /* SOC systeme V */ #include #include D 7 #include #include #include E 7 I 7 D 11 #include "sys/mbuf.h" E 11 I 11 #include E 11 #include "sys/socket.h" #include "sys/socketvar.h" E 7 #include /* SOC systeme V */ E 6 D 8 #include "../net/if.h" #include "../net/route.h" E 8 I 8 #include "net/if.h" #include "net/route.h" E 8 D 8 #include "in.h" #include "in_pcb.h" #include "in_systm.h" #include "ip.h" #include "ip_var.h" #include "tcp.h" #include "tcp_fsm.h" #include "tcp_seq.h" #include "tcp_timer.h" #include "tcp_var.h" #include "tcpip.h" #include "tcp_debug.h" E 8 I 8 #include "netinet/in.h" #include "netinet/in_pcb.h" #include "netinet/in_systm.h" #include "netinet/ip.h" #include "netinet/ip_var.h" #include "netinet/tcp.h" #include "netinet/tcp_fsm.h" #include "netinet/tcp_seq.h" #include "netinet/tcp_timer.h" #include "netinet/tcp_var.h" #include "netinet/tcpip.h" #include "netinet/tcp_debug.h" E 8 /* * TCP protocol interface to socket abstraction. */ extern char *tcpstates[]; struct tcpcb *tcp_newtcpcb(); int tcpsenderrors; /* * Process a TCP user request for TCP tb. If this is a send request * then m is the mbuf chain of send data. If this is a timer expiration * (called from the software clock routine), then timertype tells which timer. */ /*ARGSUSED*/ tcp_usrreq(so, req, m, nam, rights) struct socket *so; int req; struct mbuf *m, *nam, *rights; { register struct inpcb *inp = sotoinpcb(so); register struct tcpcb *tp; int s = splnet(); int error = 0; int ostate; if (rights && rights->m_len) { splx(s); return (EINVAL); } /* * When a TCP is attached to a socket, then there will be * a (struct inpcb) pointed at by the socket, and this * structure will point at a subsidary (struct tcpcb). */ if (inp == 0 && req != PRU_ATTACH) { splx(s); return (EINVAL); /* XXX */ } if (inp) { tp = intotcpcb(inp); /* WHAT IF TP IS 0? */ #ifdef KPROF tcp_acounts[tp->t_state][req]++; #endif ostate = tp->t_state; } else ostate = 0; switch (req) { /* * TCP attaches to socket via PRU_ATTACH, reserving space, * and an internet control block. */ case PRU_ATTACH: if (inp) { error = EISCONN; break; } error = tcp_attach(so); if (error) break; if ((so->so_options & SO_LINGER) && so->so_linger == 0) so->so_linger = TCP_LINGERTIME; tp = sototcpcb(so); break; /* * PRU_DETACH detaches the TCP protocol from the socket. * If the protocol state is non-embryonic, then can't * do this directly: have to initiate a PRU_DISCONNECT, * which may finish later; embryonic TCB's can just * be discarded here. */ case PRU_DETACH: if (tp->t_state > TCPS_LISTEN) tp = tcp_disconnect(tp); else tp = tcp_close(tp); break; /* * Give the socket an address. */ case PRU_BIND: error = in_pcbbind(inp, nam); if (error) break; break; /* * Prepare to accept connections. */ case PRU_LISTEN: if (inp->inp_lport == 0) error = in_pcbbind(inp, (struct mbuf *)0); if (error == 0) tp->t_state = TCPS_LISTEN; break; /* * Initiate connection to peer. * Create a template for use in transmissions on this connection. * Enter SYN_SENT state, and mark socket as connecting. * Start keep-alive timer, and seed output sequence space. * Send initial segment on connection. */ case PRU_CONNECT: if (inp->inp_lport == 0) { error = in_pcbbind(inp, (struct mbuf *)0); if (error) break; } error = in_pcbconnect(inp, nam); if (error) break; tp->t_template = tcp_template(tp); if (tp->t_template == 0) { in_pcbdisconnect(inp); error = ENOBUFS; break; } soisconnecting(so); tp->t_state = TCPS_SYN_SENT; tp->t_timer[TCPT_KEEP] = TCPTV_KEEP; tp->iss = tcp_iss; tcp_iss += TCP_ISSINCR/2; tcp_sendseqinit(tp); error = tcp_output(tp); break; /* * Create a TCP connection between two sockets. */ case PRU_CONNECT2: error = EOPNOTSUPP; break; /* * Initiate disconnect from peer. * If connection never passed embryonic stage, just drop; * else if don't need to let data drain, then can just drop anyways, * else have to begin TCP shutdown process: mark socket disconnecting, * drain unread data, state switch to reflect user close, and * send segment (e.g. FIN) to peer. Socket will be really disconnected * when peer sends FIN and acks ours. * * SHOULD IMPLEMENT LATER PRU_CONNECT VIA REALLOC TCPCB. */ case PRU_DISCONNECT: tp = tcp_disconnect(tp); break; /* * Accept a connection. Essentially all the work is * done at higher levels; just return the address * of the peer, storing through addr. */ case PRU_ACCEPT: { struct sockaddr_in *sin = mtod(nam, struct sockaddr_in *); nam->m_len = sizeof (struct sockaddr_in); sin->sin_family = AF_INET; sin->sin_port = inp->inp_fport; sin->sin_addr = inp->inp_faddr; break; } /* * Mark the connection as being incapable of further output. */ case PRU_SHUTDOWN: socantsendmore(so); tp = tcp_usrclosed(tp); if (tp) error = tcp_output(tp); break; /* * After a receive, possibly send window update to peer. */ case PRU_RCVD: (void) tcp_output(tp); break; /* * Do a send by putting data in output queue and updating urgent * marker if URG set. Possibly send more data. */ case PRU_SEND: sbappend(&so->so_snd, m); #ifdef notdef if (tp->t_flags & TF_PUSH) tp->snd_end = tp->snd_una + so->so_snd.sb_cc; #endif error = tcp_output(tp); if (error) { /* XXX fix to use other path */ if (error == ENOBUFS) /* XXX */ error = 0; /* XXX */ tcpsenderrors++; } break; /* * Abort the TCP. */ case PRU_ABORT: tp = tcp_drop(tp, ECONNABORTED); break; /* SOME AS YET UNIMPLEMENTED HOOKS */ case PRU_CONTROL: error = EOPNOTSUPP; break; case PRU_SENSE: error = EOPNOTSUPP; break; /* END UNIMPLEMENTED HOOKS */ case PRU_RCVOOB: if (so->so_oobmark == 0 && (so->so_state & SS_RCVATMARK) == 0) { error = EINVAL; break; } if ((tp->t_oobflags & TCPOOB_HAVEDATA) == 0) { error = EWOULDBLOCK; break; } m->m_len = 1; *mtod(m, caddr_t) = tp->t_iobc; break; case PRU_SENDOOB: if (sbspace(&so->so_snd) < -512) { m_freem(m); error = ENOBUFS; break; } tp->snd_up = tp->snd_una + so->so_snd.sb_cc + 1; sbappend(&so->so_snd, m); tp->t_force = 1; error = tcp_output(tp); tp->t_force = 0; break; case PRU_SOCKADDR: in_setsockaddr(inp, nam); break; case PRU_PEERADDR: in_setpeeraddr(inp, nam); break; /* * TCP slow timer went off; going through this * routine for tracing's sake. */ case PRU_SLOWTIMO: tp = tcp_timers(tp, (int)nam); req |= (int)nam << 8; /* for debug's sake */ break; default: panic("tcp_usrreq"); } if (tp && (so->so_options & SO_DEBUG)) tcp_trace(TA_USER, ostate, tp, (struct tcpiphdr *)0, req); splx(s); return (error); } int tcp_sendspace = 1024*4; int tcp_recvspace = 1024*4; /* * Attach TCP protocol to socket, allocating * internet protocol control block, tcp control block, * bufer space, and entering LISTEN state if to accept connections. */ tcp_attach(so) struct socket *so; { register struct tcpcb *tp; struct inpcb *inp; int error; error = soreserve(so, tcp_sendspace, tcp_recvspace); if (error) goto bad; error = in_pcballoc(so, &tcb); if (error) goto bad; inp = sotoinpcb(so); tp = tcp_newtcpcb(inp); if (tp == 0) { error = ENOBUFS; goto bad2; } tp->t_state = TCPS_CLOSED; return (0); bad2: in_pcbdetach(inp); bad: return (error); } /* * Initiate (or continue) disconnect. * If embryonic state, just send reset (once). * If in ``let data drain'' option and linger null, just drop. * Otherwise (hard), mark socket disconnecting and drop * current input data; switch states based on user close, and * send segment to peer (with FIN). */ struct tcpcb * tcp_disconnect(tp) register struct tcpcb *tp; { struct socket *so = tp->t_inpcb->inp_socket; if (tp->t_state < TCPS_ESTABLISHED) tp = tcp_close(tp); else if ((so->so_options & SO_LINGER) && so->so_linger == 0) tp = tcp_drop(tp, 0); else { soisdisconnecting(so); sbflush(&so->so_rcv); tp = tcp_usrclosed(tp); if (tp) (void) tcp_output(tp); } return (tp); } /* * User issued close, and wish to trail through shutdown states: * if never received SYN, just forget it. If got a SYN from peer, * but haven't sent FIN, then go to FIN_WAIT_1 state to send peer a FIN. * If already got a FIN from peer, then almost done; go to LAST_ACK * state. In all other cases, have already sent FIN to peer (e.g. * after PRU_SHUTDOWN), and just have to play tedious game waiting * for peer to send FIN or not respond to keep-alives, etc. * We can let the user exit from the close as soon as the FIN is acked. */ struct tcpcb * tcp_usrclosed(tp) register struct tcpcb *tp; { switch (tp->t_state) { case TCPS_CLOSED: case TCPS_LISTEN: case TCPS_SYN_SENT: tp->t_state = TCPS_CLOSED; tp = tcp_close(tp); break; case TCPS_SYN_RECEIVED: case TCPS_ESTABLISHED: tp->t_state = TCPS_FIN_WAIT_1; break; case TCPS_CLOSE_WAIT: tp->t_state = TCPS_LAST_ACK; break; } if (tp && tp->t_state >= TCPS_FIN_WAIT_2) soisdisconnected(tp->t_inpcb->inp_socket); return (tp); } E 1 h56218 s 00001/00001/00379 d D 4.7 87/05/20 13:31:12 brian 11 10 c mbuf.h put back on system search path BB e s 00001/00002/00379 d D 4.6 87/05/14 16:42:13 build 10 9 c removed old SCCS strings and inserted #ident BB e s 00001/00001/00380 d D 4.5 87/05/07 19:16:08 van 9 8 c van - move defsocket.h back to /usr/include/sys e s 00010/00010/00371 d D 4.4 87/04/30 19:24:50 van 8 7 c van - moved net and netinet includes e s 00004/00004/00377 d D 4.3 87/04/29 20:03:42 van 7 6 c van - moved ucb networking includes to INCUCB e s 00010/00010/00371 d D 4.2 87/04/15 17:57:42 dc 6 5 c dc - changed #include "sys/..." to #include e s 00000/00000/00381 d D 4.1 87/02/20 13:39:01 build 5 4 c rolled rev to -r4 /dc e s 00000/00000/00381 d D 3.1 87/01/19 09:29:45 build 4 3 c rolled rev to -r3 /dc e s 00000/00000/00381 d D 2.1 87/01/19 09:29:45 build 3 2 c AUTO NULL DELTA e s 00001/00000/00380 d D 1.2 87/01/16 10:25:25 build 2 1 c add ident string /dc e s 00380/00000/00000 d D 1.1 87/01/09 18:12:43 build 1 0 c Placed under source control - dc e u U f b f n t T I 2 D 10 /* "%W% %E%" */ E 2 I 1 static char sccsid[] = "@(#)Wed Apr 23 15:11:04 EET 1986~ BULL-SEMS V21 netinet/udp_usrreq" ; E 10 I 10 #ident " %W% %E% " E 10 /* udp_usrreq.c 6.1 11/11/85 * SMX * + modif buglist 4.2 */ D 6 #include "sys/defsocket.h" #include "sys/param.h" #include "sys/types.h" #include "sys/signal.h" #include "sys/dir.h" #include "sys/user.h" #include "sys/mbuf.h" #include "sys/socket.h" #include "sys/socketvar.h" #include "sys/errno.h" E 6 I 6 D 7 #include E 7 I 7 D 9 #include "sys/defsocket.h" E 9 I 9 #include E 9 E 7 #include #include #include #include #include D 7 #include #include #include E 7 I 7 D 11 #include "sys/mbuf.h" E 11 I 11 #include E 11 #include "sys/socket.h" #include "sys/socketvar.h" E 7 #include E 6 D 8 #include "../net/if.h" #include "../net/route.h" E 8 I 8 #include "net/if.h" #include "net/route.h" E 8 D 8 #include "in.h" #include "in_pcb.h" #include "in_systm.h" #include "ip.h" #include "ip_var.h" #include "ip_icmp.h" #include "udp.h" #include "udp_var.h" E 8 I 8 #include "netinet/in.h" #include "netinet/in_pcb.h" #include "netinet/in_systm.h" #include "netinet/ip.h" #include "netinet/ip_var.h" #include "netinet/ip_icmp.h" #include "netinet/udp.h" #include "netinet/udp_var.h" E 8 /* * UDP protocol implementation. * Per RFC 768, August, 1980. */ udp_init() { udb.inp_next = udb.inp_prev = &udb; } int udpcksum = 0; /* SMX bug 4.2 ancien udpcksum = 0 */ struct sockaddr_in udp_in = { AF_INET }; udp_input(m0) struct mbuf *m0; { register struct udpiphdr *ui; register struct inpcb *inp; register struct mbuf *m; int len; /* * Get IP and UDP header together in first mbuf. */ m = m0; if ((m->m_off > MMAXOFF || m->m_len < sizeof (struct udpiphdr)) && (m = m_pullup(m, sizeof (struct udpiphdr))) == 0) { udpstat.udps_hdrops++; return; } ui = mtod(m, struct udpiphdr *); if (((struct ip *)ui)->ip_hl > (sizeof (struct ip) >> 2)) ip_stripoptions((struct ip *)ui, (struct mbuf *)0); /* * Make mbuf data length reflect UDP length. * If not enough data to reflect UDP length, drop. */ len = ntohs((u_short)ui->ui_ulen); if (((struct ip *)ui)->ip_len != len) { if (len > ((struct ip *)ui)->ip_len) { udpstat.udps_badlen++; goto bad; } m_adj(m, ((struct ip *)ui)->ip_len - len); /* (struct ip *)ui->ip_len = len; */ } /* * Checksum extended UDP header and data. */ /***** if (udpcksum) { ui->ui_next = ui->ui_prev = 0; ui->ui_x1 = 0; ui->ui_len = htons((u_short)len); if (ui->ui_sum = in_cksum(m, len + sizeof (struct ip))) { udpstat.udps_badsum++; m_freem(m); return; } } ***** ancien code */ if (udpcksum && ui->ui_sum) { /* SMX modif bug 4.2 */ ui->ui_next = ui->ui_prev = 0; ui->ui_x1 = 0; ui->ui_len = htons((u_short)len); if (in_cksum(m, len + sizeof (struct ip))) { udpstat.udps_badsum++; m_freem(m); return; } } /* fin modif */ /* * Locate pcb for datagram. */ inp = in_pcblookup(&udb, ui->ui_src, ui->ui_sport, ui->ui_dst, ui->ui_dport, INPLOOKUP_WILDCARD); if (inp == 0) { /* don't send ICMP response for broadcast packet */ if (in_lnaof(ui->ui_dst) == INADDR_ANY) goto bad; icmp_error((struct ip *)ui, ICMP_UNREACH, ICMP_UNREACH_PORT); return; } /* * Construct sockaddr format source address. * Stuff source address and datagram in user buffer. */ udp_in.sin_port = ui->ui_sport; udp_in.sin_addr = ui->ui_src; m->m_len -= sizeof (struct udpiphdr); m->m_off += sizeof (struct udpiphdr); if (sbappendaddr(&inp->inp_socket->so_rcv, (struct sockaddr *)&udp_in, m, (struct mbuf *)0) == 0) goto bad; sorwakeup(inp->inp_socket); return; bad: m_freem(m); } udp_abort(inp) struct inpcb *inp; { struct socket *so = inp->inp_socket; in_pcbdisconnect(inp); soisdisconnected(so); } udp_ctlinput(cmd, arg) int cmd; caddr_t arg; { struct in_addr *sin; extern u_char inetctlerrmap[]; if (cmd < 0 || cmd > PRC_NCMDS) return; switch (cmd) { case PRC_ROUTEDEAD: break; case PRC_QUENCH: break; /* these are handled by ip */ case PRC_IFDOWN: case PRC_HOSTDEAD: case PRC_HOSTUNREACH: break; default: sin = &((struct icmp *)arg)->icmp_ip.ip_dst; in_pcbnotify(&udb, sin, (int)inetctlerrmap[cmd], udp_abort); } } udp_output(inp, m0) struct inpcb *inp; struct mbuf *m0; { register struct mbuf *m; register struct udpiphdr *ui; register struct socket *so; register int len = 0; int flags; /* * Calculate data length and get a mbuf * for UDP and IP headers. */ for (m = m0; m; m = m->m_next) len += m->m_len; m = m_get(M_DONTWAIT, MT_HEADER); if (m == 0) { m_freem(m0); return (ENOBUFS); } /* * Fill in mbuf with extended UDP header * and addresses and length put into network format. */ m->m_off = MMAXOFF - sizeof (struct udpiphdr); m->m_len = sizeof (struct udpiphdr); m->m_next = m0; ui = mtod(m, struct udpiphdr *); ui->ui_next = ui->ui_prev = 0; ui->ui_x1 = 0; ui->ui_pr = IPPROTO_UDP; ui->ui_len = len + sizeof (struct udphdr); ui->ui_src = inp->inp_laddr; ui->ui_dst = inp->inp_faddr; ui->ui_sport = inp->inp_lport; ui->ui_dport = inp->inp_fport; /**** ui->ui_ulen = htons((u_short)ui->ui_len); ancien code */ ui->ui_len = htons((u_short)ui->ui_len); /* SMX modif bug 4.2 */ ui->ui_ulen = ui->ui_len; /* idem */ /* * Stuff checksum and output datagram. */ ui->ui_sum = 0; /**** ui->ui_sum = in_cksum(m, sizeof (struct udpiphdr) + len);ancien code*/ if (udpcksum) { /* SMX mdif bug 4.2 */ if (!(ui->ui_sum = in_cksum(m, sizeof(struct udpiphdr))) + len) ui->ui_sum = -1; } /* fin modif */ ((struct ip *)ui)->ip_len = sizeof (struct udpiphdr) + len; ((struct ip *)ui)->ip_ttl = MAXTTL; so = inp->inp_socket; flags = (so->so_options & SO_DONTROUTE) | (so->so_state & SS_PRIV); return (ip_output(m, (struct mbuf *)0, (struct route *)0, flags)); } /*ARGSUSED*/ udp_usrreq(so, req, m, nam, rights) struct socket *so; int req; struct mbuf *m, *nam, *rights; { struct inpcb *inp = sotoinpcb(so); int error = 0; if (rights && rights->m_len) { error = EINVAL; goto release; } if (inp == NULL && req != PRU_ATTACH) { error = EINVAL; goto release; } switch (req) { case PRU_ATTACH: if (inp != NULL) { error = EINVAL; break; } error = in_pcballoc(so, &udb); if (error) { break; } error = soreserve(so, 2048, 2048); if (error) { break; } break; case PRU_DETACH: if (inp == NULL) { error = ENOTCONN; break; } in_pcbdetach(inp); break; case PRU_BIND: error = in_pcbbind(inp, nam); break; case PRU_LISTEN: error = EOPNOTSUPP; break; case PRU_CONNECT: if (inp->inp_faddr.s_addr != INADDR_ANY) { error = EISCONN; break; } error = in_pcbconnect(inp, nam); if (error == 0) soisconnected(so); break; case PRU_CONNECT2: error = EOPNOTSUPP; break; case PRU_ACCEPT: error = EOPNOTSUPP; break; case PRU_DISCONNECT: if (inp->inp_faddr.s_addr == INADDR_ANY) { error = ENOTCONN; break; } in_pcbdisconnect(inp); soisdisconnected(so); break; case PRU_SHUTDOWN: socantsendmore(so); break; case PRU_SEND: { struct in_addr laddr; if (nam) { laddr = inp->inp_laddr; if (inp->inp_faddr.s_addr != INADDR_ANY) { error = EISCONN; break; } error = in_pcbconnect(inp, nam); if (error) break; } else { if (inp->inp_faddr.s_addr == INADDR_ANY) { error = ENOTCONN; break; } } error = udp_output(inp, m); m = NULL; if (nam) { in_pcbdisconnect(inp); inp->inp_laddr = laddr; } } break; case PRU_ABORT: in_pcbdetach(inp); sofree(so); soisdisconnected(so); break; case PRU_SOCKADDR: in_setsockaddr(inp, nam); break; case PRU_PEERADDR: in_setpeeraddr(inp, nam); break; case PRU_CONTROL: m = NULL; error = EOPNOTSUPP; break; case PRU_SENSE: m = NULL; /* fall thru... */ case PRU_RCVD: case PRU_RCVOOB: case PRU_SENDOOB: case PRU_FASTTIMO: case PRU_SLOWTIMO: case PRU_PROTORCV: case PRU_PROTOSEND: error = EOPNOTSUPP; break; default: panic("udp_usrreq"); } release: if (m != NULL) m_freem(m); return (error); } E 1 h27290 s 00008/00008/00202 d D 4.12 87/05/20 17:06:47 build 18 17 c van - move mbuf.h again e s 00008/00008/00202 d D 4.11 87/05/20 13:48:18 brian 17 16 c mbuf.h put back on system search path BB e s 00008/00008/00202 d D 4.10 87/05/07 19:14:37 van 16 15 c van - move defsocket.h back to /usr/include/sys e s 00079/00057/00131 d D 4.9 87/04/30 19:24:17 van 15 14 c van - moved net and netinet includes e s 00038/00038/00150 d D 4.8 87/04/29 20:35:48 build 14 13 c van - sys added to INCUCB files e s 00001/00000/00187 d D 4.7 87/04/29 20:25:14 build 13 12 c van - added IFLAGS e s 00038/00036/00149 d D 4.6 87/04/29 20:02:48 van 12 11 c van - moved ucb networking includes to INCUCB e s 00002/00000/00183 d D 4.5 87/03/26 22:19:03 dc 11 10 c add all: entry e s 00002/00001/00181 d D 4.4 87/02/24 15:29:43 build 10 9 c van - added ASFLAGS2 for in_cksum.s with parameters in regs e s 00001/00001/00181 d D 4.3 87/02/22 16:10:12 build 9 8 c change OPTIONS to DFLAGS /dc e s 00000/00003/00182 d D 4.2 87/02/22 09:38:15 build 8 7 c remove CC and CFLAGS definitions e s 00000/00000/00185 d D 4.1 87/02/20 13:39:24 build 7 6 c rolled rev to -r4 /dc e s 00000/00000/00185 d D 3.1 87/01/19 09:30:06 build 6 5 c rolled rev to -r3 /dc e s 00000/00000/00185 d D 2.1 87/01/19 09:30:06 build 5 4 c AUTO NULL DELTA e s 00001/00000/00184 d D 1.4 87/01/16 10:25:47 build 4 3 c add ident string /dc e s 00003/00001/00181 d D 1.3 87/01/13 11:06:38 build 3 2 c use rc instead of cc (suspect bugs in cc) e s 00106/00140/00076 d D 1.2 87/01/09 18:39:56 build 2 1 c add sccs control e s 00216/00000/00000 d D 1.1 87/01/09 17:53:49 build 1 0 c Placed under source control - dc e u U f b f n t T I 4 # "%W% %E%" E 4 I 1 # Bull-Sems SPIX+SOCKET+TCPIP @(#)netinet/Makefile # pas d'option RT # option SOCKET VERSION= 10 I 13 IFLAGS= -I$(INCUCB) E 13 D 9 OPTION= -DSOCKET -DINET -Ddebug -DSPS9 -DROSSE E 9 I 9 DFLAGS= -DSOCKET -DINET -Ddebug -DSPS9 -DROSSE I 10 ASFLAGS2 = -DARGSINREGS -DLINK=r15 E 10 E 9 D 2 CFLAGS= -O -I$(SPX)/usr/include $(OPTION) E 2 I 2 D 3 CFLAGS = -c -O -I$(SPX)/usr/include $(OPTION) E 3 I 3 D 8 CFLAGS = -O -I$(SPX)/usr/include $(OPTION) # switch to 'newer' compiler. CC = rc E 8 E 3 E 2 # OPTION is for CC options # SOCKET is a flag for sockets mechanism # INET is a flag for Internet Domain D 15 # # ATTENTION compilation in_cksum.c faite en deux passages et # manuellement # E 15 LIB = LIBIN.a H = $(SPX)/usr/include/sys/ I 2 D 15 LOCALH =\ icmp_var.h\ if_ether.h\ imp.h\ in.h\ in_pcb.h\ in_systm.h\ ip.h\ ip_icmp.h\ ip_var.h\ nd.h\ tcp.h\ tcp_debug.h\ tcp_fsm.h\ tcp_seq.h\ tcp_timer.h\ tcp_var.h\ tcpip.h\ udp.h\ udp_var.h E 15 E 2 OBJECTS=$(LIB)(if_loop.o)\ $(LIB)(in.o)\ $(LIB)(in_pcb.o)\ $(LIB)(in_proto.o)\ $(LIB)(ip_icmp.o)\ $(LIB)(ip_input.o)\ $(LIB)(ip_output.o)\ $(LIB)(raw_ip.o)\ $(LIB)(tcp_debug.o)\ $(LIB)(tcp_input.o)\ $(LIB)(tcp_output.o)\ $(LIB)(tcp_subr.o)\ $(LIB)(in_cksum.o)\ $(LIB)(tcp_timer.o)\ $(LIB)(tcp_usrreq.o)\ $(LIB)(if_ether.o)\ $(LIB)(udp_usrreq.o) I 11 all: $(LIB) E 11 D 2 .s.a: rc -c $(CFLAGS) $< ar r $(LIB) $*.o rm -f $*.o .c.a: rc -c $(CFLAGS) $< ar r $(LIB) $*.o rm -f $*.o E 2 $(LIB): $(OBJECTS) D 2 print: pr -n *.c *.h *ake* |lp -tNETINET E 2 clean: D 2 rm -f *.o $(LIB) core E 2 I 2 rm -f *.o E 2 I 2 clobber: clean D 15 rm -f $(LIB) core $(LOCALH) E 15 I 15 rm -f $(LIB) core E 15 E 2 $(LIB)(tcp_debug.o) $(LIB)(tcp_input.o) $(LIB)(tcp_output.o): \ D 2 in.h\ in_pcb.h\ in_systm.h\ ip.h\ ip_var.h\ tcp.h\ tcp_fsm.h\ tcp_seq.h\ tcp_timer.h\ tcp_var.h\ tcpip.h\ tcp_debug.h\ E 2 I 2 D 15 $(LOCALH)\ E 2 ../net/route.h\ ../net/if.h\ E 15 I 15 $(INCUCB)/net/route.h\ $(INCUCB)/net/if.h\ E 15 D 2 $Htypes.h\ $Hdefsocket.h\ $Hparam.h\ $Hsystm.h\ $Hmbuf.h\ $Hsocket.h\ $Hsocketvar.h\ $Hprotosw.h\ $Herrno.h E 2 I 2 $(H)/types.h\ D 12 $(H)/defsocket.h\ E 12 I 12 D 14 $(INCUCB)/defsocket.h\ E 14 I 14 D 16 $(INCUCB)/sys/defsocket.h\ E 16 I 16 $(H)/defsocket.h\ E 16 E 14 E 12 $(H)/param.h\ $(H)/systm.h\ D 12 $(H)/mbuf.h\ $(H)/socket.h\ $(H)/socketvar.h\ $(H)/protosw.h\ E 12 I 12 D 14 $(INCUCB)/mbuf.h\ $(INCUCB)/socket.h\ $(INCUCB)/socketvar.h\ $(INCUCB)/protosw.h\ E 14 I 14 D 17 $(INCUCB)/sys/mbuf.h\ E 17 I 17 D 18 $(H)/sys/mbuf.h\ E 18 I 18 $(H)/mbuf.h\ E 18 E 17 $(INCUCB)/sys/socket.h\ $(INCUCB)/sys/socketvar.h\ $(INCUCB)/sys/protosw.h\ E 14 E 12 D 15 $(H)/errno.h E 15 I 15 $(H)/errno.h\ $(INCUCB)/netinet/in.h\ $(INCUCB)/netinet/in_pcb.h\ $(INCUCB)/netinet/in_systm.h\ $(INCUCB)/netinet/ip.h\ $(INCUCB)/netinet/ip_var.h\ $(INCUCB)/netinet/tcp.h\ $(INCUCB)/netinet/tcp_fsm.h\ $(INCUCB)/netinet/tcp_seq.h\ $(INCUCB)/netinet/tcp_timer.h\ $(INCUCB)/netinet/tcp_var.h\ $(INCUCB)/netinet/tcpip.h\ $(INCUCB)/netinet/tcp_debug.h E 15 E 2 $(LIB)( tcp_subr.o) $(LIB)(tcp_timer.o) $(LIB)(tcp_usrreq.o): \ D 2 in.h\ in_pcb.h\ in_systm.h\ ip.h\ ip_var.h\ tcp.h\ tcp_fsm.h\ tcp_seq.h\ tcp_timer.h\ tcp_var.h\ tcpip.h\ tcp_debug.h\ E 2 I 2 D 15 $(LOCALH)\ E 2 ../net/route.h\ ../net/if.h\ E 15 I 15 $(INCUCB)/net/route.h\ $(INCUCB)/net/if.h\ E 15 D 2 $Htypes.h\ $Hdefsocket.h\ $Hparam.h\ $Hsystm.h\ $Hmbuf.h\ $Hsocket.h\ $Hsocketvar.h\ $Hprotosw.h\ $Herrno.h E 2 I 2 $(H)/types.h\ D 12 $(H)/defsocket.h\ E 12 I 12 D 14 $(INCUCB)/defsocket.h\ E 14 I 14 D 16 $(INCUCB)/sys/defsocket.h\ E 16 I 16 $(H)/defsocket.h\ E 16 E 14 E 12 $(H)/param.h\ $(H)/systm.h\ D 12 $(H)/mbuf.h\ $(H)/socket.h\ $(H)/socketvar.h\ $(H)/protosw.h\ E 12 I 12 D 14 $(INCUCB)/mbuf.h\ $(INCUCB)/socket.h\ $(INCUCB)/socketvar.h\ $(INCUCB)/protosw.h\ E 14 I 14 D 17 $(INCUCB)/sys/mbuf.h\ E 17 I 17 D 18 $(H)/sys/mbuf.h\ E 18 I 18 $(H)/mbuf.h\ E 18 E 17 $(INCUCB)/sys/socket.h\ $(INCUCB)/sys/socketvar.h\ $(INCUCB)/sys/protosw.h\ E 14 E 12 D 15 $(H)/errno.h E 15 I 15 $(H)/errno.h\ $(INCUCB)/netinet/in.h\ $(INCUCB)/netinet/in_pcb.h\ $(INCUCB)/netinet/in_systm.h\ $(INCUCB)/netinet/ip.h\ $(INCUCB)/netinet/ip_var.h\ $(INCUCB)/netinet/ip_icmp.h\ $(INCUCB)/netinet/tcp.h\ $(INCUCB)/netinet/tcp_fsm.h\ $(INCUCB)/netinet/tcp_seq.h\ $(INCUCB)/netinet/tcp_timer.h\ $(INCUCB)/netinet/tcp_var.h\ $(INCUCB)/netinet/tcpip.h\ $(INCUCB)/netinet/tcp_debug.h E 15 E 2 $(LIB)(ip_icmp.o) $(LIB)(ip_input.o) $(LIB)(ip_output.o) $(LIB)(raw_ip.o): \ D 2 in.h\ in_pcb.h\ in_systm.h\ ip.h\ ip_var.h\ tcp.h\ E 2 I 2 D 15 $(LOCALH)\ E 2 ../net/route.h\ ../net/if.h\ ../net/raw_cb.h\ E 15 I 15 $(INCUCB)/net/route.h\ $(INCUCB)/net/if.h\ $(INCUCB)/net/raw_cb.h\ E 15 D 2 $Hdefsocket.h\ $Htypes.h\ $Hparam.h\ $Hsystm.h\ $Hmbuf.h\ $Hsocket.h\ $Hprotosw.h\ $Herrno.h\ $Hdomain.h\ $Hutsname.h\ $Htimes.h E 2 I 2 D 12 $(H)/defsocket.h\ E 12 I 12 D 14 $(INCUCB)/defsocket.h\ E 14 I 14 D 16 $(INCUCB)/sys/defsocket.h\ E 16 I 16 $(H)/defsocket.h\ E 16 E 14 E 12 $(H)/types.h\ $(H)/param.h\ $(H)/systm.h\ D 12 $(H)/mbuf.h\ $(H)/socket.h\ $(H)/protosw.h\ E 12 I 12 D 14 $(INCUCB)/mbuf.h\ $(INCUCB)/socket.h\ $(INCUCB)/socketvar.h\ $(INCUCB)/protosw.h\ E 14 I 14 D 17 $(INCUCB)/sys/mbuf.h\ E 17 I 17 D 18 $(H)/sys/mbuf.h\ E 18 I 18 $(H)/mbuf.h\ E 18 E 17 $(INCUCB)/sys/socket.h\ $(INCUCB)/sys/socketvar.h\ $(INCUCB)/sys/protosw.h\ E 14 E 12 $(H)/errno.h\ D 12 $(H)/domain.h\ E 12 I 12 D 14 $(INCUCB)/domain.h\ E 14 I 14 $(INCUCB)/sys/domain.h\ E 14 E 12 $(H)/utsname.h\ D 15 $(H)/times.h E 15 I 15 $(H)/times.h \ $(INCUCB)/netinet/in.h \ $(INCUCB)/netinet/in_systm.h \ $(INCUCB)/netinet/ip.h \ $(INCUCB)/netinet/ip_icmp.h \ $(INCUCB)/netinet/icmp_var.h \ $(INCUCB)/netinet/in_pcb.h \ $(INCUCB)/netinet/ip_var.h \ $(INCUCB)/netinet/tcp.h \ $(INCUCB)/netinet/nd.h E 15 E 2 D 10 $(LIB)(in.o) $(LIB)(in_pcb.o) $(LIB)(in_cksum.o) : \ E 10 I 10 $(LIB)(in.o) $(LIB)(in_pcb.o) : \ E 10 D 2 $Hdefsocket.h\ $Htypes.h\ $Hparam.h\ $Hsystm.h\ $Hdir.h\ $Huser.h\ $Hmbuf.h\ $Hprotosw.h\ $Hsocket.h\ $Hsocketvar.h\ in.h\ in_systm.h\ in_pcb.h\ E 2 I 2 D 12 $(H)/defsocket.h\ E 12 I 12 D 14 $(INCUCB)/defsocket.h\ E 14 I 14 D 16 $(INCUCB)/sys/defsocket.h\ E 16 I 16 $(H)/defsocket.h\ E 16 E 14 E 12 $(H)/types.h\ $(H)/param.h\ $(H)/systm.h\ $(H)/dir.h\ $(H)/user.h\ D 12 $(H)/mbuf.h\ $(H)/protosw.h\ $(H)/socket.h\ $(H)/socketvar.h\ E 12 I 12 D 14 $(INCUCB)/mbuf.h\ $(INCUCB)/protosw.h\ $(INCUCB)/socket.h\ $(INCUCB)/socketvar.h\ E 14 I 14 D 17 $(INCUCB)/sys/mbuf.h\ E 17 I 17 D 18 $(H)/sys/mbuf.h\ E 18 I 18 $(H)/mbuf.h\ E 18 E 17 $(INCUCB)/sys/protosw.h\ $(INCUCB)/sys/socket.h\ $(INCUCB)/sys/socketvar.h\ E 14 E 12 D 15 $(LOCALH)\ E 2 ../net/if.h\ ../net/route.h\ ../net/af.h E 15 I 15 $(INCUCB)/net/if.h\ $(INCUCB)/net/route.h\ $(INCUCB)/net/af.h \ $(INCUCB)/netinet/in.h \ $(INCUCB)/netinet/in_systm.h \ $(INCUCB)/netinet/in_pcb.h E 15 $(LIB)(if_loop.o) : \ D 2 $Htypes.h\ $Hdefsocket.h\ $Hparam.h\ $Hsystm.h\ $Hmbuf.h\ $Hsocket.h\ $Herrno.h\ $Hbsdioctl.h\ E 2 I 2 $(H)/types.h\ D 12 $(H)/defsocket.h\ E 12 I 12 D 14 $(INCUCB)/defsocket.h\ E 14 I 14 D 16 $(INCUCB)/sys/defsocket.h\ E 16 I 16 $(H)/defsocket.h\ E 16 E 14 E 12 $(H)/param.h\ $(H)/systm.h\ D 12 $(H)/mbuf.h\ $(H)/socket.h\ E 12 I 12 D 14 $(INCUCB)/mbuf.h\ $(INCUCB)/socket.h\ E 14 I 14 D 17 $(INCUCB)/sys/mbuf.h\ E 17 I 17 D 18 $(H)/sys/mbuf.h\ E 18 I 18 $(H)/mbuf.h\ E 18 E 17 $(INCUCB)/sys/socket.h\ E 14 E 12 $(H)/errno.h\ D 12 $(H)/bsdioctl.h\ E 12 I 12 D 14 $(INCUCB)/bsdioctl.h\ E 14 I 14 $(INCUCB)/sys/bsdioctl.h\ E 14 E 12 E 2 D 15 ../net/if.h\ ../net/netisr.h\ ../net/route.h\ D 2 in.h\ in_systm.h\ ip.h\ ip_var.h E 2 I 2 $(LOCALH) E 15 I 15 $(INCUCB)/net/if.h\ $(INCUCB)/net/netisr.h\ $(INCUCB)/net/route.h \ $(INCUCB)/netinet/in.h \ $(INCUCB)/netinet/in_systm.h \ $(INCUCB)/netinet/ip.h \ $(INCUCB)/netinet/ip_var.h E 15 E 2 $(LIB)(if_ether.o): \ D 2 $Hparam.h \ $Hsystm.h \ $Hmbuf.h \ $Hsocket.h \ $Herrno.h \ E 2 I 2 $(H)/param.h \ $(H)/systm.h \ D 12 $(H)/mbuf.h \ $(H)/socket.h \ E 12 I 12 D 14 $(INCUCB)/mbuf.h \ $(INCUCB)/socket.h \ E 14 I 14 D 17 $(INCUCB)/sys/mbuf.h \ E 17 I 17 D 18 $(H)/sys/mbuf.h \ E 18 I 18 $(H)/mbuf.h \ E 18 E 17 $(INCUCB)/sys/socket.h \ E 14 E 12 $(H)/errno.h \ E 2 D 15 ../net/if.h \ E 15 I 15 $(INCUCB)/net/if.h \ $(INCUCB)/netinet/in.h \ $(INCUCB)/netinet/if_ether.h \ E 15 D 2 $Hdefsocket.h \ $Htypes.h \ in.h \ if_ether.h E 2 I 2 D 12 $(H)/defsocket.h \ E 12 I 12 D 14 $(INCUCB)/defsocket.h \ E 14 I 14 D 16 $(INCUCB)/sys/defsocket.h \ E 16 I 16 $(H)/defsocket.h \ E 16 E 14 E 12 D 15 $(H)/types.h \ $(LOCALH) E 15 I 15 $(H)/types.h E 15 E 2 D 2 E 2 $(LIB)(udp_usrreq.o): \ D 2 $Hparam.h \ $Hdir.h \ $Huser.h \ $Hmbuf.h \ $Hprotosw.h \ $Hsocket.h \ $Hsocketvar.h \ $Herrno.h \ E 2 I 2 $(H)/param.h \ $(H)/dir.h \ $(H)/user.h \ D 12 $(H)/mbuf.h \ $(H)/protosw.h \ $(H)/socket.h \ $(H)/socketvar.h \ E 12 I 12 D 14 $(INCUCB)/defsocket.h \ $(INCUCB)/mbuf.h \ $(INCUCB)/protosw.h \ $(INCUCB)/socket.h \ $(INCUCB)/socketvar.h \ E 14 I 14 D 16 $(INCUCB)/sys/defsocket.h \ E 16 I 16 $(H)/defsocket.h \ E 16 D 17 $(INCUCB)/sys/mbuf.h \ E 17 I 17 D 18 $(H)/sys/mbuf.h \ E 18 I 18 $(H)/mbuf.h \ E 18 E 17 $(INCUCB)/sys/protosw.h \ $(INCUCB)/sys/socket.h \ $(INCUCB)/sys/socketvar.h \ E 14 E 12 $(H)/errno.h \ E 2 D 15 ../net/if.h \ ../net/route.h \ D 2 in.h \ in_pcb.h \ in_systm.h \ ip.h \ ip_var.h \ ip_icmp.h \ udp.h \ udp_var.h E 2 I 2 $(LOCALH) E 15 I 15 $(INCUCB)/net/if.h \ $(INCUCB)/net/route.h \ $(INCUCB)/netinet/in.h \ $(INCUCB)/netinet/in_pcb.h \ $(INCUCB)/netinet/in_systm.h \ $(INCUCB)/netinet/ip.h \ $(INCUCB)/netinet/ip_var.h \ $(INCUCB)/netinet/ip_icmp.h \ $(INCUCB)/netinet/udp.h \ $(INCUCB)/netinet/udp_var.h E 15 E 2 $(LIB)(in_proto.o): \ D 2 $Hdefsocket.h\ $Htypes.h\ $Hparam.h\ $Hsystm.h\ $Hdir.h\ $Huser.h\ $Hmbuf.h\ $Hprotosw.h\ $Hsocket.h\ $Hsocketvar.h\ in.h\ in_systm.h\ in_pcb.h\ E 2 I 2 D 12 $(H)/defsocket.h\ E 12 I 12 D 14 $(INCUCB)/defsocket.h\ E 14 I 14 D 16 $(INCUCB)/sys/defsocket.h\ E 16 I 16 $(H)/defsocket.h\ E 16 E 14 E 12 $(H)/types.h\ $(H)/param.h\ $(H)/systm.h\ $(H)/dir.h\ $(H)/user.h\ D 12 $(H)/mbuf.h\ $(H)/protosw.h\ $(H)/socket.h\ $(H)/socketvar.h\ E 12 I 12 D 14 $(INCUCB)/mbuf.h\ $(INCUCB)/protosw.h\ $(INCUCB)/socket.h\ $(INCUCB)/socketvar.h\ E 14 I 14 D 17 $(INCUCB)/sys/mbuf.h\ E 17 I 17 D 18 $(H)/sys/mbuf.h\ E 18 I 18 $(H)/mbuf.h\ E 18 E 17 $(INCUCB)/sys/protosw.h\ $(INCUCB)/sys/socket.h\ $(INCUCB)/sys/socketvar.h\ E 14 E 12 D 15 $(LOCALH)\ E 2 ../net/if.h\ ../net/route.h\ D 2 ../net/af.h\ nd.h\ imp.h E 2 I 2 ../net/af.h E 15 I 15 $(INCUCB)/net/if.h\ $(INCUCB)/net/route.h\ $(INCUCB)/net/af.h \ $(INCUCB)/netinet/in.h \ $(INCUCB)/netinet/in_systm.h \ $(INCUCB)/netinet/imp.h \ $(INCUCB)/netinet/nd.h E 15 E 2 E 1 #ident " @(#)tcp_input.c 4.6 87/05/14 " /* tcp_input.c 6.1 83/07/29 */ #include /* SOC systeme V */ #include /* SOC systeme V */ #include #include #include "sys/mbuf.h" #include "sys/socket.h" #include "sys/socketvar.h" #include /* SOC systeme V */ #include "net/if.h" #include "net/route.h" #include "netinet/in.h" #include "netinet/in_pcb.h" #include "netinet/in_systm.h" #include "netinet/ip.h" #include "netinet/ip_var.h" #include "netinet/tcp.h" #include "netinet/tcp_fsm.h" #include "netinet/tcp_seq.h" #include "netinet/tcp_timer.h" #include "netinet/tcp_var.h" #include "netinet/tcpip.h" #include "netinet/tcp_debug.h" int tcpprintfs = 1; int tcpcksum = 1; struct tcpiphdr tcp_saveti; extern tcpnodelack; /* WARNING: This macro must be invoked with the parameter "string" in parentheses */ #define DEBUG #ifdef DEBUG extern int debug2(); extern int trace; #define TraceAll 0xFFFF #define TracePrint(flag,string) if (trace & flag) debug2 string #else #define TracePrint(flag,string) /* nop */ #endif /* DEBUG */ struct tcpcb *tcp_newtcpcb(); /* * TCP input routine, follows pages 65-76 of the * protocol specification dated September, 1981 very closely. */ tcp_input(m0) struct mbuf *m0; { register struct tcpiphdr *ti; struct inpcb *inp; register struct mbuf *m; struct mbuf *om = 0; int len, tlen, off; register struct tcpcb *tp = 0; register int tiflags; struct socket *so; int todrop, acked; short ostate; struct in_addr laddr; int dropsocket = 0; /* * Get IP and TCP header together in first mbuf. * Note: IP leaves IP header in first mbuf. */ m = m0; ti = mtod(m, struct tcpiphdr *); TracePrint(TraceAll, ("tcp_input: ti = %x, ti_seq = %x, ti_len = %x\n", ti, ti->ti_seq, ti->ti_len)); if (((struct ip *)ti)->ip_hl > (sizeof (struct ip) >> 2)) ip_stripoptions((struct ip *)ti, (struct mbuf *)0); if (m->m_off > MMAXOFF || m->m_len < sizeof (struct tcpiphdr)) { if ((m = m_pullup(m, sizeof (struct tcpiphdr))) == 0) { tcpstat.tcps_hdrops++; return; } ti = mtod(m, struct tcpiphdr *); } TracePrint(TraceAll, ("after pullup: ti = %x, ti_seq = %x, ti_len = %x\n", ti, ti->ti_seq, ti->ti_len)); /* * Checksum extended TCP header and data. */ tlen = ((struct ip *)ti)->ip_len; len = sizeof (struct ip) + tlen; if (tcpcksum) { ti->ti_next = ti->ti_prev = 0; ti->ti_x1 = 0; ti->ti_len = (u_short)tlen; ti->ti_len = htons((u_short)ti->ti_len); if (ti->ti_sum = in_cksum(m, len)) { if (tcpprintfs) printf("tcp sum: src %x\n", ti->ti_src); tcpstat.tcps_badsum++; goto drop; } } /* * Check that TCP offset makes sense, * pull out TCP options and adjust length. */ off = ti->ti_off << 2; if (off < sizeof (struct tcphdr) || off > tlen) { if (tcpprintfs) printf("tcp off: src %x off %d\n", ti->ti_src, off); tcpstat.tcps_badoff++; goto drop; } tlen -= off; ti->ti_len = tlen; if (off > sizeof (struct tcphdr)) { if ((m = m_pullup(m, sizeof (struct ip) + off)) == 0) { tcpstat.tcps_hdrops++; return; } ti = mtod(m, struct tcpiphdr *); om = m_get(M_DONTWAIT, MT_DATA); if (om == 0) goto drop; om->m_len = off - sizeof (struct tcphdr); { caddr_t op = mtod(m, caddr_t) + sizeof (struct tcpiphdr); bcopy(op, mtod(om, caddr_t), (unsigned)om->m_len); m->m_len -= om->m_len; bcopy(op+om->m_len, op, (unsigned)(m->m_len-sizeof (struct tcpiphdr))); } } tiflags = ti->ti_flags; /* * Drop TCP and IP headers. */ off += sizeof (struct ip); m->m_off += off; m->m_len -= off; /* * Convert TCP protocol specific fields to host format. */ ti->ti_seq = ntohl(ti->ti_seq); ti->ti_ack = ntohl(ti->ti_ack); ti->ti_win = ntohs(ti->ti_win); ti->ti_urp = ntohs(ti->ti_urp); /* * Locate pcb for segment. */ inp = in_pcblookup (&tcb, ti->ti_src, ti->ti_sport, ti->ti_dst, ti->ti_dport, INPLOOKUP_WILDCARD); /* * If the state is CLOSED (i.e., TCB does not exist) then * all data in the incoming segment is discarded. */ if (inp == 0) goto dropwithreset; tp = intotcpcb(inp); if (tp == 0) goto dropwithreset; so = inp->inp_socket; if (so->so_options & SO_DEBUG) { ostate = tp->t_state; tcp_saveti = *ti; } if (so->so_options & SO_ACCEPTCONN) { so = sonewconn(so); if (so == 0) goto drop; /* * This is ugly, but .... * * Mark socket as temporary until we're * committed to keeping it. The code at * ``drop'' and ``dropwithreset'' check the * flag dropsocket to see if the temporary * socket created here should be discarded. * We mark the socket as discardable until * we're committed to it below in TCPS_LISTEN. */ dropsocket++; inp = (struct inpcb *)so->so_pcb; inp->inp_laddr = ti->ti_dst; inp->inp_lport = ti->ti_dport; tp = intotcpcb(inp); tp->t_state = TCPS_LISTEN; } /* * Segment received on connection. * Reset idle time and keep-alive timer. */ tp->t_idle = 0; tp->t_timer[TCPT_KEEP] = TCPTV_KEEP; /* * Process options. */ if (om) { tcp_dooptions(tp, om); om = 0; } /* * Calculate amount of space in receive window, * and then do TCP input processing. */ tp->rcv_wnd = sbspace(&so->so_rcv); if (tp->rcv_wnd < 0) tp->rcv_wnd = 0; switch (tp->t_state) { /* * If the state is LISTEN then ignore segment if it contains an RST. * If the segment contains an ACK then it is bad and send a RST. * If it does not contain a SYN then it is not interesting; drop it. * Otherwise initialize tp->rcv_nxt, and tp->irs, select an initial * tp->iss, and send a segment: * * Also initialize tp->snd_nxt to tp->iss+1 and tp->snd_una to tp->iss. * Fill in remote peer address fields if not previously specified. * Enter SYN_RECEIVED state, and process any other fields of this * segment in this state. */ case TCPS_LISTEN: { struct mbuf *am; register struct sockaddr_in *sin; if (tiflags & TH_RST) goto drop; if (tiflags & TH_ACK) goto dropwithreset; if ((tiflags & TH_SYN) == 0) goto drop; am = m_get(M_DONTWAIT, MT_SONAME); if (am == NULL) goto drop; am->m_len = sizeof (struct sockaddr_in); sin = mtod(am, struct sockaddr_in *); sin->sin_family = AF_INET; sin->sin_addr = ti->ti_src; sin->sin_port = ti->ti_sport; laddr = inp->inp_laddr; if (inp->inp_laddr.s_addr == INADDR_ANY) inp->inp_laddr = ti->ti_dst; if (in_pcbconnect(inp, am)) { inp->inp_laddr = laddr; (void) m_free(am); goto drop; } (void) m_free(am); tp->t_template = tcp_template(tp); if (tp->t_template == 0) { in_pcbdisconnect(inp); inp->inp_laddr = laddr; tp = 0; goto drop; } tp->iss = tcp_iss; tcp_iss += TCP_ISSINCR/2; tp->irs = ti->ti_seq; tcp_sendseqinit(tp); tcp_rcvseqinit(tp); tp->t_state = TCPS_SYN_RECEIVED; tp->t_timer[TCPT_KEEP] = TCPTV_KEEP; dropsocket = 0; /* committed to socket */ goto trimthenstep6; } /* * If the state is SYN_SENT: * if seg contains an ACK, but not for our SYN, drop the input. * if seg contains a RST, then drop the connection. * if seg does not contain SYN, then drop it. * Otherwise this is an acceptable SYN segment * initialize tp->rcv_nxt and tp->irs * if seg contains ack then advance tp->snd_una * if SYN has been acked change to ESTABLISHED else SYN_RCVD state * arrange for segment to be acked (eventually) * continue processing rest of data/controls, beginning with URG */ case TCPS_SYN_SENT: if ((tiflags & TH_ACK) && /* this should be SEQ_LT; is SEQ_LEQ for BBN vax TCP only */ (SEQ_LT(ti->ti_ack, tp->iss) || SEQ_GT(ti->ti_ack, tp->snd_max))) goto dropwithreset; if (tiflags & TH_RST) { if (tiflags & TH_ACK) tp = tcp_drop(tp, ECONNREFUSED); goto drop; } if ((tiflags & TH_SYN) == 0) goto drop; tp->snd_una = ti->ti_ack; if (SEQ_LT(tp->snd_nxt, tp->snd_una)) tp->snd_nxt = tp->snd_una; tp->t_timer[TCPT_REXMT] = 0; tp->irs = ti->ti_seq; tcp_rcvseqinit(tp); tp->t_flags |= TF_ACKNOW; if (SEQ_GT(tp->snd_una, tp->iss)) { soisconnected(so); tp->t_state = TCPS_ESTABLISHED; (void) tcp_reass(tp, (struct tcpiphdr *)0); } else tp->t_state = TCPS_SYN_RECEIVED; goto trimthenstep6; trimthenstep6: /* * Advance ti->ti_seq to correspond to first data byte. * If data, trim to stay within window, * dropping FIN if necessary. */ ti->ti_seq++; if (ti->ti_len > tp->rcv_wnd) { todrop = ti->ti_len - tp->rcv_wnd; m_adj(m, -todrop); ti->ti_len = tp->rcv_wnd; ti->ti_flags &= ~TH_FIN; } tp->snd_wl1 = ti->ti_seq - 1; goto step6; } /* * States other than LISTEN or SYN_SENT. * First check that at least some bytes of segment are within * receive window. */ if (tp->rcv_wnd == 0) { /* * If window is closed can only take segments at * window edge, and have to drop data and PUSH from * incoming segments. */ if (tp->rcv_nxt != ti->ti_seq) goto dropafterack; if (ti->ti_len > 0) { m_adj(m, ti->ti_len); ti->ti_len = 0; ti->ti_flags &= ~(TH_PUSH|TH_FIN); } } else { /* * If segment begins before rcv_nxt, drop leading * data (and SYN); if nothing left, just ack. */ todrop = tp->rcv_nxt - ti->ti_seq; if (todrop > 0) { if (tiflags & TH_SYN) { tiflags &= ~TH_SYN; ti->ti_flags &= ~TH_SYN; ti->ti_seq++; if (ti->ti_urp > 1) ti->ti_urp--; else tiflags &= ~TH_URG; todrop--; } if (todrop > ti->ti_len || todrop == ti->ti_len && (tiflags&TH_FIN) == 0) goto dropafterack; m_adj(m, todrop); ti->ti_seq += todrop; ti->ti_len -= todrop; if (ti->ti_urp > todrop) ti->ti_urp -= todrop; else { tiflags &= ~TH_URG; ti->ti_flags &= ~TH_URG; ti->ti_urp = 0; } } /* * If segment ends after window, drop trailing data * (and PUSH and FIN); if nothing left, just ACK. */ todrop = (ti->ti_seq+ti->ti_len) - (tp->rcv_nxt+tp->rcv_wnd); if (todrop > 0) { if (todrop >= ti->ti_len) goto dropafterack; m_adj(m, -todrop); ti->ti_len -= todrop; ti->ti_flags &= ~(TH_PUSH|TH_FIN); } } /* * If data is received on a connection after the * user processes are gone, then RST the other end. */ if ((so->so_state & SS_NOFDREF) && tp->t_state > TCPS_CLOSE_WAIT && ti->ti_len) { tp = tcp_close(tp); goto dropwithreset; } /* * If the RST bit is set examine the state: * SYN_RECEIVED STATE: * If passive open, return to LISTEN state. * If active open, inform user that connection was refused. * ESTABLISHED, FIN_WAIT_1, FIN_WAIT2, CLOSE_WAIT STATES: * Inform user that connection was reset, and close tcb. * CLOSING, LAST_ACK, TIME_WAIT STATES * Close the tcb. */ if (tiflags&TH_RST) switch (tp->t_state) { case TCPS_SYN_RECEIVED: tp = tcp_drop(tp, ECONNREFUSED); goto drop; case TCPS_ESTABLISHED: case TCPS_FIN_WAIT_1: case TCPS_FIN_WAIT_2: case TCPS_CLOSE_WAIT: tp = tcp_drop(tp, ECONNRESET); goto drop; case TCPS_CLOSING: case TCPS_LAST_ACK: case TCPS_TIME_WAIT: tp = tcp_close(tp); goto drop; } /* * If a SYN is in the window, then this is an * error and we send an RST and drop the connection. */ if (tiflags & TH_SYN) { tp = tcp_drop(tp, ECONNRESET); goto dropwithreset; } /* * If the ACK bit is off we drop the segment and return. */ if ((tiflags & TH_ACK) == 0) goto drop; /* * Ack processing. */ switch (tp->t_state) { /* * In SYN_RECEIVED state if the ack ACKs our SYN then enter * ESTABLISHED state and continue processing, othewise * send an RST. */ case TCPS_SYN_RECEIVED: if (SEQ_GT(tp->snd_una, ti->ti_ack) || SEQ_GT(ti->ti_ack, tp->snd_max)) goto dropwithreset; tp->snd_una++; /* SYN acked */ if (SEQ_LT(tp->snd_nxt, tp->snd_una)) tp->snd_nxt = tp->snd_una; tp->t_timer[TCPT_REXMT] = 0; soisconnected(so); tp->t_state = TCPS_ESTABLISHED; (void) tcp_reass(tp, (struct tcpiphdr *)0); tp->snd_wl1 = ti->ti_seq - 1; /* fall into ... */ /* * In ESTABLISHED state: drop duplicate ACKs; ACK out of range * ACKs. If the ack is in the range * tp->snd_una < ti->ti_ack <= tp->snd_max * then advance tp->snd_una to ti->ti_ack and drop * data from the retransmission queue. If this ACK reflects * more up to date window information we update our window information. */ case TCPS_ESTABLISHED: case TCPS_FIN_WAIT_1: case TCPS_FIN_WAIT_2: case TCPS_CLOSE_WAIT: case TCPS_CLOSING: case TCPS_LAST_ACK: case TCPS_TIME_WAIT: #define ourfinisacked (acked > 0) if (SEQ_LEQ(ti->ti_ack, tp->snd_una)) break; if (SEQ_GT(ti->ti_ack, tp->snd_max)) goto dropafterack; acked = ti->ti_ack - tp->snd_una; /* * If transmit timer is running and timed sequence * number was acked, update smoothed round trip time. */ if (tp->t_rtt && SEQ_GT(ti->ti_ack, tp->t_rtseq)) { if (tp->t_srtt == 0) tp->t_srtt = tp->t_rtt; else tp->t_srtt = MIN(tcp_alpha * tp->t_srtt + (10 - tcp_alpha) * tp->t_rtt,TCPTV_MAX);/*jm float */ /* jc MIN est une bidouille pour eviter les debordements */ tp->t_rtt = 0; } if (ti->ti_ack == tp->snd_max) tp->t_timer[TCPT_REXMT] = 0; else { TCPT_RANGESET(tp->t_timer[TCPT_REXMT], tcp_beta * tp->t_srtt, TCPTV_MIN, TCPTV_MAX); tp->t_rtt = 1; /* jm tout mul * 10 */ tp->t_rxtshift = 0; } if (acked > so->so_snd.sb_cc) { sbdrop(&so->so_snd, so->so_snd.sb_cc); tp->snd_wnd -= so->so_snd.sb_cc; } else { sbdrop(&so->so_snd, acked); tp->snd_wnd -= acked; acked = 0; } if ((so->so_snd.sb_flags & SB_WAIT) || so->so_snd.sb_sel) sowwakeup(so); tp->snd_una = ti->ti_ack; if (SEQ_LT(tp->snd_nxt, tp->snd_una)) tp->snd_nxt = tp->snd_una; switch (tp->t_state) { /* * In FIN_WAIT_1 STATE in addition to the processing * for the ESTABLISHED state if our FIN is now acknowledged * then enter FIN_WAIT_2. */ case TCPS_FIN_WAIT_1: if (ourfinisacked) { /* * If we can't receive any more * data, then closing user can proceed. */ if (so->so_state & SS_CANTRCVMORE) soisdisconnected(so); tp->t_state = TCPS_FIN_WAIT_2; } break; /* * In CLOSING STATE in addition to the processing for * the ESTABLISHED state if the ACK acknowledges our FIN * then enter the TIME-WAIT state, otherwise ignore * the segment. */ case TCPS_CLOSING: if (ourfinisacked) { tp->t_state = TCPS_TIME_WAIT; tcp_canceltimers(tp); tp->t_timer[TCPT_2MSL] = TCPTV_MSL; /* SMX */ soisdisconnected(so); /* etait 2*TCPTV_MSL*/ } break; /* * The only thing that can arrive in LAST_ACK state * is an acknowledgment of our FIN. If our FIN is now * acknowledged, delete the TCB, enter the closed state * and return. */ case TCPS_LAST_ACK: if (ourfinisacked) tp = tcp_close(tp); goto drop; /* * In TIME_WAIT state the only thing that should arrive * is a retransmission of the remote FIN. Acknowledge * it and restart the finack timer. */ case TCPS_TIME_WAIT: tp->t_timer[TCPT_2MSL] = TCPTV_MSL; goto dropafterack; /* SMX etait 2*TCPTV_MSL */ } #undef ourfinisacked } step6: /* * Update window information. */ if (SEQ_LT(tp->snd_wl1, ti->ti_seq) || tp->snd_wl1 == ti->ti_seq && (SEQ_LT(tp->snd_wl2, ti->ti_ack) || tp->snd_wl2 == ti->ti_ack && ti->ti_win > tp->snd_wnd)) { tp->snd_wnd = ti->ti_win; tp->snd_wl1 = ti->ti_seq; tp->snd_wl2 = ti->ti_ack; if (tp->snd_wnd != 0) tp->t_timer[TCPT_PERSIST] = 0; } /* * Process segments with URG. */ if ((tiflags & TH_URG) && ti->ti_urp && TCPS_HAVERCVDFIN(tp->t_state) == 0) { /* * This is a kludge, but if we receive accept * random urgent pointers, we'll crash in * soreceive. It's hard to imagine someone * actually wanting to send this much urgent data. */ if (ti->ti_urp > tp->t_maxseg) { /* XXX */ ti->ti_urp = 0; /* XXX */ tiflags &= ~TH_URG; /* XXX */ ti->ti_flags &= ~TH_URG; /* XXX */ goto badurp; /* XXX */ } /* * If this segment advances the known urgent pointer, * then mark the data stream. This should not happen * in CLOSE_WAIT, CLOSING, LAST_ACK or TIME_WAIT STATES since * a FIN has been received from the remote side. * In these states we ignore the URG. */ if (SEQ_GT(ti->ti_seq+ti->ti_urp, tp->rcv_up)) { tp->rcv_up = ti->ti_seq + ti->ti_urp; so->so_oobmark = so->so_rcv.sb_cc + (tp->rcv_up - tp->rcv_nxt) - 1; if (so->so_oobmark == 0) so->so_state |= SS_RCVATMARK; sohasoutofband(so); tp->t_oobflags &= ~TCPOOB_HAVEDATA; } /* * Remove out of band data so doesn't get presented to user. * This can happen independent of advancing the URG pointer, * but if two URG's are pending at once, some out-of-band * data may creep in... ick. */ if (ti->ti_urp <= ti->ti_len) tcp_pulloutofband(so, ti); } badurp: /* XXX */ /* * Process the segment text, merging it into the TCP sequencing queue, * and arranging for acknowledgment of receipt if necessary. * This process logically involves adjusting tp->rcv_wnd as data * is presented to the user (this happens in tcp_usrreq.c, * case PRU_RCVD). If a FIN has already been received on this * connection then we just ignore the text. */ if ((ti->ti_len || (tiflags&TH_FIN)) && TCPS_HAVERCVDFIN(tp->t_state) == 0) { tiflags = tcp_reass(tp, ti); if (tcpnodelack == 0) tp->t_flags |= TF_DELACK; else tp->t_flags |= TF_ACKNOW; } else { m_freem(m); tiflags &= ~TH_FIN; } /* * If FIN is received ACK the FIN and let the user know * that the connection is closing. */ if (tiflags & TH_FIN) { if (TCPS_HAVERCVDFIN(tp->t_state) == 0) { socantrcvmore(so); tp->t_flags |= TF_ACKNOW; tp->rcv_nxt++; } switch (tp->t_state) { /* * In SYN_RECEIVED and ESTABLISHED STATES * enter the CLOSE_WAIT state. */ case TCPS_SYN_RECEIVED: case TCPS_ESTABLISHED: tp->t_state = TCPS_CLOSE_WAIT; break; /* * If still in FIN_WAIT_1 STATE FIN has not been acked so * enter the CLOSING state. */ case TCPS_FIN_WAIT_1: tp->t_state = TCPS_CLOSING; break; /* * In FIN_WAIT_2 state enter the TIME_WAIT state, * starting the time-wait timer, turning off the other * standard timers. */ case TCPS_FIN_WAIT_2: tp->t_state = TCPS_TIME_WAIT; tcp_canceltimers(tp); tp->t_timer[TCPT_2MSL] = TCPTV_MSL; soisdisconnected(so); /* etait 2*TCPTV_MSL SMX */ break; /* * In TIME_WAIT state restart the 2 MSL time_wait timer. */ case TCPS_TIME_WAIT: tp->t_timer[TCPT_2MSL] = TCPTV_MSL; break; /* SMX etait 2*TCPTV_MSL */ } } if (so->so_options & SO_DEBUG) tcp_trace(TA_INPUT, ostate, tp, &tcp_saveti, 0); /* * Return any desired output. */ (void) tcp_output(tp); return; dropafterack: /* * Generate an ACK dropping incoming segment if it occupies * sequence space, where the ACK reflects our state. */ if ((tiflags&TH_RST) || tlen == 0 && (tiflags&(TH_SYN|TH_FIN)) == 0) goto drop; if (tp->t_inpcb->inp_socket->so_options & SO_DEBUG) tcp_trace(TA_RESPOND, ostate, tp, &tcp_saveti, 0); tcp_respond(tp, ti, tp->rcv_nxt, tp->snd_nxt, TH_ACK); return; dropwithreset: if (om) { (void) m_free(om); om = 0; } /* * Generate a RST, dropping incoming segment. * Make ACK acceptable to originator of segment. */ if (tiflags & TH_RST) goto drop; if (tiflags & TH_ACK) tcp_respond(tp, ti, (tcp_seq)0, ti->ti_ack, TH_RST); else { if (tiflags & TH_SYN) ti->ti_len++; tcp_respond(tp, ti, ti->ti_seq+ti->ti_len, (tcp_seq)0, TH_RST|TH_ACK); } /* destroy temporarily created socket */ if (dropsocket) (void) soabort(so); return; drop: if (om) (void) m_free(om); /* * Drop space held by incoming segment and return. */ if (tp && (tp->t_inpcb->inp_socket->so_options & SO_DEBUG)) tcp_trace(TA_DROP, ostate, tp, &tcp_saveti, 0); m_freem(m); /* destroy temporarily created socket */ if (dropsocket) (void) soabort(so); return; } tcp_dooptions(tp, om) struct tcpcb *tp; struct mbuf *om; { register u_char *cp; int opt, optlen, cnt; cp = mtod(om, u_char *); cnt = om->m_len; for (; cnt > 0; cnt -= optlen, cp += optlen) { opt = cp[0]; if (opt == TCPOPT_EOL) break; if (opt == TCPOPT_NOP) optlen = 1; else { optlen = cp[1]; 2                          #ident " @(#)ip_input.c 4.6 87/05/14 " /* Gipsi SPIX+SOCKET netinet/ip_input.c 1.1 85/08/06 * d'apres 4.2bsd netinet/ip_input.c 6.1 83/08/16 * * - pour le temps on utilise la variable time de SV (ligne 55) * */ #include /* SOC systeme V */ #include /* SOC systeme V */ #include #include #include "sys/mbuf.h" #include "sys/socket.h" #include #include "net/if.h" #include "net/route.h" #include "netinet/in.h" #include "netinet/in_pcb.h" #include "netinet/in_systm.h" #include "netinet/ip.h" #include "netinet/ip_var.h" #include "netinet/ip_icmp.h" #include "netinet/tcp.h" u_char ip_protox[IPPROTO_MAX]; int ipqmaxlen = IFQ_MAXLEN; struct ifnet *ifinet; /* first inet interface */ /* * IP initialization: fill in IP protocol switch table. * All protocols not implemented in kernel go to raw IP protocol handler. */ ip_init() { register struct protosw *pr; register int i; pr = pffindproto(PF_INET, IPPROTO_RAW); if (pr == 0) panic("ip_init"); for (i = 0; i < IPPROTO_MAX; i++) ip_protox[i] = pr - inetsw; for (pr = inetdomain.dom_protosw; pr <= inetdomain.dom_protoswNPROTOSW; pr++) if (pr->pr_family == PF_INET && pr->pr_protocol && pr->pr_protocol != IPPROTO_RAW) ip_protox[pr->pr_protocol] = pr - inetsw; ipq.next = ipq.prev = &ipq; ip_id = lbolt/HZ & 0xffff; /* modifie pour SV - attention c'est le temps en secondes depuis le dernier boot */ ipintrq.ifq_maxlen = ipqmaxlen; ifinet = if_ifwithaf(AF_INET); } int ipcksum = 1; /* SMX was u_char */ struct ip *ip_reass(); struct sockaddr_in ipaddr = { AF_INET }; /* * Ip input routine. Checksum and byte swap header. If fragmented * try to reassamble. If complete and fragment queue exists, discard. * Process options. Pass to next level. */ ipintr(m) struct mbuf *m; { register struct ip *ip; struct mbuf *m0; register int i; register struct ipq *fp; int hlen, s; next: /* * Get next datagram off input queue and get IP header * in first mbuf. */ #ifdef notdef s = splimp(); IF_DEQUEUE(&ipintrq, m); splx(s); #endif if (m == 0) return; if ((m->m_off > MMAXOFF || m->m_len < sizeof (struct ip)) && (m = m_pullup(m, sizeof (struct ip))) == 0) { ipstat.ips_toosmall++; return; /* goto next; */ } ip = mtod(m, struct ip *); if ((hlen = ip->ip_hl << 2) > m->m_len) { if ((m = m_pullup(m, hlen)) == 0) { ipstat.ips_badhlen++; return; /* goto next; */ } ip = mtod(m, struct ip *); } if (ipcksum) if (ip->ip_sum = in_cksum(m, hlen)) { ipstat.ips_badsum++; goto bad; } /* * Convert fields to host representation. */ ip->ip_len = ntohs((u_short)ip->ip_len); if (ip->ip_len < hlen) { ipstat.ips_badlen++; goto bad; } ip->ip_id = ntohs(ip->ip_id); ip->ip_off = ntohs((u_short)ip->ip_off); /* * Check that the amount of data in the buffers * is as at least much as the IP header would have us expect. * Trim mbufs if longer than we expect. * Drop packet if shorter than we expect. */ i = -ip->ip_len; m0 = m; for (;;) { i += m->m_len; if (m->m_next == 0) break; m = m->m_next; } if (i != 0) { if (i < 0) { ipstat.ips_tooshort++; goto bad; } if (i <= m->m_len) m->m_len -= i; else m_adj(m0, -i); } m = m0; /* * Process options and, if not destined for us, * ship it on. ip_dooptions returns 1 when an * error was detected (causing an icmp message * to be sent). */ if (hlen > sizeof (struct ip) && ip_dooptions(ip)) return; /* goto next; */ /* * Fast check on the first internet * interface in the list. */ if (ifinet) { struct sockaddr_in *sin; sin = (struct sockaddr_in *)&ifinet->if_addr; if (sin->sin_addr.s_addr == ip->ip_dst.s_addr) goto ours; sin = (struct sockaddr_in *)&ifinet->if_broadaddr; if ((ifinet->if_flags & IFF_BROADCAST) && sin->sin_addr.s_addr == ip->ip_dst.s_addr) goto ours; } /* BEGIN GROT */ #include "netinet/nd.h" #if NND > 0 /* * Diskless machines don't initially know * their address, so take packets from them * if we're acting as a network disk server. */ if (in_netof(ip->ip_dst) == INADDR_ANY && (in_netof(ip->ip_src) == INADDR_ANY && in_lnaof(ip->ip_src) != INADDR_ANY)) goto ours; #endif /* END GROT */ ipaddr.sin_addr = ip->ip_dst; if (if_ifwithaddr((struct sockaddr *)&ipaddr) == 0) { ip_forward(ip); return; /* goto next; */ } ours: /* * Look for queue of fragments * of this datagram. */ for (fp = ipq.next; fp != &ipq; fp = fp->next) if (ip->ip_id == fp->ipq_id && ip->ip_src.s_addr == fp->ipq_src.s_addr && ip->ip_dst.s_addr == fp->ipq_dst.s_addr && ip->ip_p == fp->ipq_p) goto found; fp = 0; found: /* * Adjust ip_len to not reflect header, * set ip_mff if more fragments are expected, * convert offset of this to bytes. */ ip->ip_len -= hlen; ((struct ipasfrag *)ip)->ipf_mff = 0; if (ip->ip_off & IP_MF) ((struct ipasfrag *)ip)->ipf_mff = 1; ip->ip_off <<= 3; /* * If datagram marked as having more fragments * or if this is not the first fragment, * attempt reassembly; if it succeeds, proceed. */ if (((struct ipasfrag *)ip)->ipf_mff || ip->ip_off) { ip = ip_reass((struct ipasfrag *)ip, fp); if (ip == 0) return; /* goto next; */ hlen = ip->ip_hl << 2; m = dtom(ip); } else if (fp) ip_freef(fp); /* * Switch out to protocol's input routine. */ (*inetsw[ip_protox[ip->ip_p]].pr_input)(m); return; /* goto next; */ bad: m_freem(m); return; /* goto next; */ } /* * Take incoming datagram fragment and try to * reassemble it into whole datagram. If a chain for * reassembly of this datagram already exists, then it * is given as fp; otherwise have to make a chain. */ struct ip * ip_reass(ip, fp) register struct ipasfrag *ip; register struct ipq *fp; { register struct mbuf *m = dtom(ip); register struct ipasfrag *q; struct mbuf *t; int hlen = ip->ip_hl << 2; int i, next; /* * Presence of header sizes in mbufs * would confuse code below. */ m->m_off += hlen; m->m_len -= hlen; /* * If first fragment to arrive, create a reassembly queue. */ if (fp == 0) { if ((t = m_get(M_WAIT, MT_FTABLE)) == NULL) goto dropfrag; fp = mtod(t, struct ipq *); insque(fp, &ipq); fp->ipq_ttl = IPFRAGTTL; fp->ipq_p = ip->ip_p; fp->ipq_id = ip->ip_id; fp->ipq_next = fp->ipq_prev = (struct ipasfrag *)fp; fp->ipq_src = ((struct ip *)ip)->ip_src; fp->ipq_dst = ((struct ip *)ip)->ip_dst; q = (struct ipasfrag *)fp; goto insert; } /* * Find a segment which begins after this one does. */ for (q = fp->ipq_next; q != (struct ipasfrag *)fp; q = q->ipf_next) if (q->ip_off > ip->ip_off) break; /* * If there is a preceding segment, it may provide some of * our data already. If so, drop the data from the incoming * segment. If it provides all of our data, drop us. */ if (q->ipf_prev != (struct ipasfrag *)fp) { i = q->ipf_prev->ip_off + q->ipf_prev->ip_len - ip->ip_off; if (i > 0) { if (i >= ip->ip_len) goto dropfrag; m_adj(dtom(ip), i); ip->ip_off += i; ip->ip_len -= i; } } /* * While we overlap succeeding segments trim them or, * if they are completely covered, dequeue them. */ while (q != (struct ipasfrag *)fp && ip->ip_off + ip->ip_len > q->ip_off) { i = (ip->ip_off + ip->ip_len) - q->ip_off; if (i < q->ip_len) { q->ip_len -= i; q->ip_off += i; m_adj(dtom(q), i); break; } q = q->ipf_next; m_freem(dtom(q->ipf_prev)); ip_deq(q->ipf_prev); } insert: /* * Stick new segment in its place; * check for complete reassembly. */ ip_enq(ip, q->ipf_prev); next = 0; for (q = fp->ipq_next; q != (struct ipasfrag *)fp; q = q->ipf_next) { if (q->ip_off != next) return (0); next += q->ip_len; } if (q->ipf_prev->ipf_mff) return (0); /* * Reassembly is complete; concatenate fragments. */ q = fp->ipq_next; m = dtom(q); t = m->m_next; m->m_next = 0; m_cat(m, t); q = q->ipf_next; while (q != (struct ipasfrag *)fp) { t = dtom(q); q = q->ipf_next; m_cat(m, t); } /* * Create header for new ip packet by * modifying header of first packet; * dequeue and discard fragment reassembly header. * Make header visible. */ ip = fp->ipq_next; ip->ip_len = next; ((struct ip *)ip)->ip_src = fp->ipq_src; ((struct ip *)ip)->ip_dst = fp->ipq_dst; remque(fp); (void) m_free(dtom(fp)); m = dtom(ip); m->m_len += sizeof (struct ipasfrag); m->m_off -= sizeof (struct ipasfrag); return ((struct ip *)ip); dropfrag: m_freem(m); return (0); } /* * Free a fragment reassembly header and all * associated datagrams. */ ip_freef(fp) struct ipq *fp; { register struct ipasfrag *q, *p; for (q = fp->ipq_next; q != (struct ipasfrag *)fp; q = p) { p = q->ipf_next; ip_deq(q); m_freem(dtom(q)); } remque(fp); (void) m_free(dtom(fp)); } /* * Put an ip fragment on a reassembly chain. * Like insque, but pointers in middle of structure. */ ip_enq(p, prev) register struct ipasfrag *p, *prev; { p->ipf_prev = prev; p->ipf_next = prev->ipf_next; prev->ipf_next->ipf_prev = p; prev->ipf_next = p; } /* * To ip_enq as remque is to insque. */ ip_deq(p) register struct ipasfrag *p; { p->ipf_prev->ipf_next = p->ipf_next; p->ipf_next->ipf_prev = p->ipf_prev; } /* * IP timer processing; * if a timer expires on a reassembly * queue, discard it. */ ip_slowtimo() { register struct ipq *fp; int s = splnet(); fp = ipq.next; if (fp == 0) { splx(s); return; } while (fp != &ipq) { --fp->ipq_ttl; fp = fp->next; if (fp->prev->ipq_ttl == 0) ip_freef(fp->prev); } splx(s); } /* * Drain off all datagram fragments. */ ip_drain() { while (ipq.next != &ipq) ip_freef(ipq.next); } /* * Do option processing on a datagram, * possibly discarding it if bad options * are encountered. */ ip_dooptions(ip) struct ip *ip; { register u_char *cp; int opt, optlen, cnt, code, type; struct in_addr *sin; register struct ip_timestamp *ipt; register struct ifnet *ifp; struct in_addr t; cp = (u_char *)(ip + 1); cnt = (ip->ip_hl << 2) - sizeof (struct ip); for (; cnt > 0; cnt -= optlen, cp += optlen) { opt = cp[0]; if (opt == IPOPT_EOL) break; if (opt == IPOPT_NOP) optlen = 1; else optlen = cp[1]; switch (opt) { default: break; /* * Source routing with record. * Find interface with current destination address. * If none on this machine then drop if strictly routed, * or do nothing if loosely routed. * Record interface address and bring up next address * component. If strictly routed make sure next * address on directly accessible net. */ case IPOPT_LSRR: case IPOPT_SSRR: if (cp[2] < 4 || cp[2] > optlen - (sizeof (long) - 1)) break; sin = (struct in_addr *)(cp + cp[2]); ipaddr.sin_addr = *sin; ifp = if_ifwithaddr((struct sockaddr *)&ipaddr); type = ICMP_UNREACH, code = ICMP_UNREACH_SRCFAIL; if (ifp == 0) { if (opt == IPOPT_SSRR) goto bad; break; } t = ip->ip_dst; ip->ip_dst = *sin; *sin = t; cp[2] += 4; if (cp[2] > optlen - (sizeof (long) - 1)) break; ip->ip_dst = sin[1]; if (opt == IPOPT_SSRR && if_ifonnetof(in_netof(ip->ip_dst)) == 0) goto bad; break; case IPOPT_TS: code = cp - (u_char *)ip; type = ICMP_PARAMPROB; ipt = (struct ip_timestamp *)cp; if (ipt->ipt_len < 5) goto bad; if (ipt->ipt_ptr > ipt->ipt_len - sizeof (long)) { if (++ipt->ipt_oflw == 0) goto bad; break; } sin = (struct in_addr *)(cp+cp[2]); switch (ipt->ipt_flg) { case IPOPT_TS_TSONLY: break; case IPOPT_TS_TSANDADDR: if (ipt->ipt_ptr + 8 > ipt->ipt_len) goto bad; if (ifinet == 0) goto bad; /* ??? */ *sin++ = ((struct sockaddr_in *)&ifinet->if_addr)->sin_addr; break; case IPOPT_TS_PRESPEC: ipaddr.sin_addr = *sin; if (if_ifwithaddr((struct sockaddr *)&ipaddr) == 0) continue; if (ipt->ipt_ptr + 8 > ipt->ipt_len) goto bad; ipt->ipt_ptr += 4; break; default: goto bad; } *(n_time *)sin = iptime(); ipt->ipt_ptr += 4; } } return (0); bad: icmp_error(ip, type, code); return (1); } /* * Strip out IP options, at higher * level protocol in the kernel. * Second argument is buffer to which options * will be moved, and return value is their length. */ ip_stripoptions(ip, mopt) struct ip *ip; struct mbuf *mopt; { register int i; register struct mbuf *m; int olen; olen = (ip->ip_hl<<2) - sizeof (struct ip); m = dtom(ip); ip++; if (mopt) { mopt->m_len = olen; mopt->m_off = MMINOFF; bcopy((caddr_t)ip, mtod(m, caddr_t), (unsigned)olen); } i = m->m_len - (sizeof (struct ip) + olen); bcopy((caddr_t)ip+olen, (caddr_t)ip, (unsigned)i); m->m_len -= olen; } u_char inetctlerrmap[PRC_NCMDS] = { ECONNABORTED, ECONNABORTED, 0, 0, 0, 0, EHOSTDOWN, EHOSTUNREACH, ENETUNREACH, EHOSTUNREACH, ECONNREFUSED, ECONNREFUSED, EMSGSIZE, 0, 0, 0, 0, 0, 0, 0 }; ip_ctlinput(cmd, arg) int cmd; caddr_t arg; { struct in_addr *in; int tcp_abort(), udp_abort(); extern struct inpcb tcb, udb; if (cmd < 0 || cmd > PRC_NCMDS) return; if (inetctlerrmap[cmd] == 0) return; /* XXX */ if (cmd == PRC_IFDOWN) in = &((struct sockaddr_in *)arg)->sin_addr; else if (cmd == PRC_HOSTDEAD || cmd == PRC_HOSTUNREACH) in = (struct in_addr *)arg; else in = &((struct icmp *)arg)->icmp_ip.ip_dst; /* THIS IS VERY QUESTIONABLE, SHOULD HIT ALL PROTOCOLS */ in_pcbnotify(&tcb, in, (int)inetctlerrmap[cmd], tcp_abort); in_pcbnotify(&udb, in, (int)inetctlerrmap[cmd], udp_abort); } int ipprintfs = 0; int ipforwarding = 1; /* * Forward a packet. If some error occurs return the sender * and icmp packet. Note we can't always generate a meaningful * icmp message because icmp doesn't have a large enough repetoire * of codes and types. */ ip_forward(ip) register struct ip *ip; { register int error, type, code; struct mbuf *mopt, *mcopy; if (ipprintfs) printf("forward: src %x dst %x ttl %x\n", ip->ip_src, ip->ip_dst, ip->ip_ttl); if (ipforwarding == 0) { /* can't tell difference between net and host */ type = ICMP_UNREACH, code = ICMP_UNREACH_NET; goto sendicmp; } if (ip->ip_ttl < IPTTLDEC) { type = ICMP_TIMXCEED, code = ICMP_TIMXCEED_INTRANS; goto sendicmp; } ip->ip_ttl -= IPTTLDEC; mopt = m_get(M_DONTWAIT, MT_DATA); if (mopt == NULL) { m_freem(dtom(ip)); return; } /* * Save at most 64 bytes of the packet in case * we need to generate an ICMP message to the src. */ mcopy = m_copy(dtom(ip), 0, MIN(ip->ip_len, 64)); ip_stripoptions(ip, mopt); error = ip_output(dtom(ip), mopt, (struct route *)0, IP_FORWARDING); if (error == 0) { if (mcopy) m_freem(mcopy); return; } if (mcopy == NULL) return; ip = mtod(mcopy, struct ip *); type = ICMP_UNREACH, code = 0; /* need ``undefined'' */ switch (error) { case ENETUNREACH: case ENETDOWN: code = ICMP_UNREACH_NET; break; case EMSGSIZE: code = ICMP_UNREACH_NEEDFRAG; break; case EPERM: code = ICMP_UNREACH_PORT; break; case ENOBUFS: type = ICMP_SOURCEQUENCH; break; case EHOSTDOWN: case EHOSTUNREACH: code = ICMP_UNREACH_HOST; break; } sendicmp: icmp_error(ip, type, code); } ! / 548578604 0 0 0 5014 ` p""""""""""""""""""""""0R0R0R0R0R0R0R66666666666666ELELELELELELELELELELELELELELELELELELELELELELELELELELELELELELELELELELELcccccccccccccccccnJnJnJnJnJnJnJnJnJnJnJnJnJnJnJnJnJnJnJnJnJt8t8t8t8t8t8t8t8t8t8t8t8t8t8t8t8t8t8t8t8t8t8t8t8t8t8t8t8xxxxxxxxxxxxxxxxxxxxxxxxxxxxxVVVVVVVVVVVVVVVVVVVVVVVVVVVhhhhhhhhhhhhhhhhhhhhh_loattach_loif_loioctl_looutput_ipintrq_mbstat_nmbclusters_mbfree_mclfree_rawintrq_rpintrq_ifnet_rthost_rtnet_rtstat_domains_ipstat_ipq_ip_id_inet_hash_in_netof_inet_netmatch_if_makeaddr_in_lnaof_if_rtinit_mbstat_nmbclusters_mbfree_mclfree_domains_ipintrq_rawintrq_rpintrq_ifnet_rthost_rtnet_rtstat_in_pcballoc_in_pcbbind_ifnet_zeroin_addr_in_pcblookup_in_pcbconnect_in_pcbdisconnect_in_pcbdetach_in_setsockaddr_in_setpeeraddr_in_pcbnotify_mbstat_nmbclusters_mbfree_mclfree_domains_ipintrq_rawintrq_rpintrq_rthost_rtnet_rtstat_mbstat_nmbclusters_mbfree_mclfree_domains_inetdomain_inetsw_icmp_error_icmpstat_icmp_reflect_icmp_input_iptime_icmp_send_mbstat_nmbclusters_mbfree_mclfree_rthost_rtnet_rtstat_domains_ip_init_ip_protox_ipq_ip_id_ipqmaxlen_ipintrq_ifinet_ipintr_ipstat_ipcksum_ip_dooptions_ipaddr_ip_forward_ip_reass_ip_freef_ip_deq_ip_enq_ip_slowtimo_ip_drain_ip_stripoptions_ip_ctlinput_inetctlerrmap_ipprintfs_ipforwarding_mbstat_nmbclusters_mbfree_mclfree_rawintrq_rpintrq_ifnet_rthost_rtnet_rtstat_domains_ip_output_ip_id_ip_optcopy_mbstat_nmbclusters_mbfree_mclfree_ipintrq_rawintrq_rpintrq_ifnet_rthost_rtnet_rtstat_domains_ipstat_ipq_rip_input_ripdst_ripproto_ripsrc_rip_output_mbstat_nmbclusters_mbfree_mclfree_ipintrq_rawintrq_rpintrq_ifnet_rthost_rtnet_rtstat_rawcb_domains_ipstat_ipq_ip_id_tcp_trace_tcp_debx_tcp_debug_tcpstates_tanames_prurequests_tcptimers_mbstat_nmbclusters_mbfree_mclfree_rthost_rtnet_rtstat_ipintrq_rawintrq_rpintrq_ifnet_domains_ipstat_ipq_ip_id_tcp_iss_tcp_alpha_tcp_beta_tcb_tcpstat_tcpconsdebug_tcp_input_tcpstat_tcpcksum_tcpprintfs_tcb_tcp_saveti_tcp_dooptions_tcp_iss_tcp_reass_tcp_alpha_tcp_beta_tcp_pulloutofband_mbstat_nmbclusters_mbfree_mclfree_ipintrq_rawintrq_rpintrq_ifnet_rthost_rtnet_rtstat_domains_ipstat_ipq_ip_id_tcp_debug_tcp_debx_tcp_output_tcp_outflags_tcp_setpersist_mbfree_mbstat_tcp_initopt_tcp_beta_nmbclusters_mclfree_rthost_rtnet_rtstat_domains_ipstat_ipq_ip_id_tcp_iss_tcp_alpha_tcb_tcpstat_tcp_debug_tcp_debx_tcp_init_tcp_iss_tcb_tcp_alpha_tcp_beta_tcp_template_tcp_respond_tcp_newtcpcb_tcp_drop_tcp_close_tcp_abort_tcp_drain_tcp_ctlinput_mbstat_nmbclusters_mbfree_mclfree_rthost_rtnet_rtstat_ipintrq_rawintrq_rpintrq_ifnet_domains_ipstat_ipq_ip_id_tcpstat_in_cksum_mbstat_nmbclusters_mbfree_mclfree_tcp_fasttimo_tcb_tcp_slowtimo_tcp_iss_tcp_canceltimers_tcp_timers_tcpexprexmtbackoff_tcp_backoff_mbstat_nmbclusters_mbfree_mclfree_ipintrq_rawintrq_rpintrq_ifnet_rthost_rtnet_rtstat_domains_ipstat_ipq_ip_id_tcp_alpha_tcp_beta_tcpstat_tcpnodelack_tcp_usrreq_tcp_attach_tcp_disconnect_tcp_iss_tcp_usrclosed_tcpsenderrors_tcp_sendspace_tcp_recvspace_tcb_mbstat_nmbclusters_mbfree_mclfree_ipintrq_rawintrq_rpintrq_ifnet_rthost_rtnet_rtstat_domains_ipstat_ipq_ip_id_tcp_alpha_tcp_beta_tcpstat_tcp_debug_tcp_debx_arpattach_arpcom_arptimer_arpt_age_arptab_arptfree_arpwhohas_etherbroadcastaddr_arpresolve_arptnew_arpmyaddr_arpinput_mbstat_nmbclusters_mbfree_mclfree_ipintrq_rawintrq_rpintrq_ifnet_domains_udp_init_udb_udp_input_udpstat_udpcksum_udp_in_udp_abort_udp_ctlinput_udp_output_udp_usrreq_mbstat_nmbclusters_mbfree_mclfree_ipintrq_rawintrq_rpintrq_ifnet_rthost_rtnet_rtstat_domains_ipstat_ipq_ip_idif_loop.o/ 548578392 0 0 100664 2172 ` u X<$.text0 .data00H@.bssxx@~8pPhP3Qa1A DT2Pvl~8@@WP@~Hq:hh |  & |rp|r4 )zX`` l~Hɞ@PPWP<@~Hp*(i " z @ gY%' l%# D%! ?Qa1`&! 7Rb1@&# 3Td1 &' 1Xh1nX3Qa1@nX3Qa1 Π  ~Hɞ@Ǿ<PPW @(#)if_loop.c 4.7 87/05/20 lolo%d: can't handle af%d "P   BDP\lrz   .text0.data0H.bssxo_loifxoo_loioctloo%o0o_spl7o_ipintrqo_m_freemo_splxo;o_wakeupo_printfoEoOo_mbstat oYo_mbfreeo_mclfreeofo_rpintrqo_ifneto_rthosto_rtneto_rtstat o_domainso_ipstato_ipqo_ip_idop_loattach_if_makeaddr_looutput_if_attach_if_rtinit_wbetopen_in_netof_in_lnaof_nmbclusters_rawintrqin.o/ 548578399 0 0 100664 1521 ` u _.textd .data D@.bss@~8pnW3Qa10~8@@W@~8qnX3Qa1nW3Qa1R~8@@W 1~p` ,` p g^3Qa1~W   a!:  a! qW   0   WX<~@p z RHHfnLY3Qa1H(b~@Ǟ<XXW @(#)in.c 4.7 87/05/20 b  .text.data .bssmhm`m(m5m?0m_bzerom_rtinitm_mbstat mJm_mbfreem_mclfreem_domainsm_ipintrqmWm_rpintrqm_ifnetm_rthostm_rtnetm_rtstat ma_inet_hash_in_netof_inet_netmatch_if_makeaddr_in_lnaof_if_rtinit_nmbclusters_rawintrq in_pcb.o/ 548578413 0 0 100664 3414 ` u m $*.textp .datapp @.bssH<~@ &py~@Ǟ<HHW`?HP~X!Ǩx    z t (ù   Lù (Z  "jz z zn$Y3Qa1 (>$,  hY3Qa1 vΐ!!('÷n$X3Qa1 (,>$ ~XɞPɾH``W`HP~Xp!z zt  ZXnX3Qa1  ϑ$n\W3Qa1 n\Y3Qa1ǷnX3Qa1è\$(,>$ *`0gY3Qa1g X3Qa1~XɎPɮH``W8  z 88W8 ȧ~4pZ$ JB 2~488W@~8!bppgX3Qa1~8@@W@~8!bpptgX 3Qa1~8@@WP?8@~Hx6  w"VwWx ~Hɞ@ɾ8PPW( ا~Dp>L0 2'NDǾTL^@V^VVR" Lh  2 $ D , @  "'e~ɞɾ(W @(#)in_pcb.c 4.7 87/05/20 "L  & ( ^ `   :.textp.datap .bsstt_insquetpt_ifnett't_ut6tC\tQtt`tjtxtLtt_sofreet_rtfreet_remquet_m_freett_bzerot`tt_spl7t_splxt_mbstat tt_mbfreet_mclfreet_domainst_ipintrqtt_rpintrqt_rthostt_rtnett_rtstat t_in_pcballoc_m_getclr_in_pcbbind_if_ifwithaddr_zeroin_addr_in_pcblookup_in_pcbconnect_in_netof_if_ifonnetof_if_ifwithaf_in_pcbdisconnect_in_pcbdetach_in_setsockaddr_in_setpeeraddr_in_pcbnotify_nmbclusters_rawintrqin_proto.o/ 548578418 0 0 100664 1583 ` u r .text .data(@.bss(( @(#)in_proto.c 4.7 87/05/20 8 internet$(,D T\`l.text.data(.bss(_mbstat ll_mbfreel_mclfreel_domainsl l_inetsw8ll_ip_initl(l5l?lKlVldlplzllllllllll_nmbclusters_inetdomain_ip_output_ip_slowtimo_ip_drain_icmp_input_udp_input_udp_ctlinput_udp_usrreq_udp_init_tcp_input_tcp_ctlinput_tcp_usrreq_tcp_init_tcp_fasttimo_tcp_slowtimo_tcp_drain_rip_input_rip_output_raw_usrreq ip_icmp.o/ 548578429 0 0 100664 3665 ` u } 0!.text LB .data   d@.bssX?@H~P xp z  z|  p (@D p   (  xzz   p ( z  ^ ~PɞHɾ@XXWXDH ~PÐzxpTTzz pð XXf( Rp!d!!d'7((p23PW3% (<! ( ~  j$  $ xp( \\0,0 WnPPZ& \\2b $ xp( \\N`W3Qa1`W3Qa1`X 3Qa1`X3Qa1  0B,zz``: v~PɞHǾDXXW@~8pnFh"@BJ8>DJfhp rPTX\`dhlptx|.text B.data .bssq@q@_m_getq@_panicq@_bcopyq@q@_m_freemq@(q@4q@>q@_inetswq@_iptimeq@Iq@Uq@`0q@kq@_spl6q@_lboltq@_splxq@_mbstat q@vq@_mbfreeq@_mclfreeq@_rthostq@_rtnetq@_rtstat q@_domainsq@_icmp_error_icmpstat_icmp_reflect_icmp_input_in_cksum_ip_protox_rtredirect_raw_input_icmp_send_ip_output_nmbclusters_icmproto ip_input.o/ 548578450 0 0 100664 7572 ` u H.text .data @.bss@~<p0 ,1!pDz2gz&zz  ,,p (P2P ȶ ~<@@WH8~@ |(z(pxpz2l  pІ,4  <zzz Lj>hzzz |V B  j ( z@`W3Qa1ؓ l  > ,    " zzz  zpz8p Vxp  v  ,W~@ɞ8HHWP<@~H   xp   zz f D   h Y 3Qa1hY3Qa1x&x )z"zzw g\ &özzz@ z  t zz  zz ΠpWùgzzzz 0zzzz Bw   zzz} x "z w z x ΐ   Zw w  @ǘ i X3Qa1iX3Qa1   z     ~Hɞ@Ǿ<PPWH8~@x Π Ǘ n VyH 8~@ɞ8HHW    ! W    W@~8ppD,w l~8@@W8ȋ88W`<@H~P  xpxpq  'D* ^! !h(( `Z3Qa1ؓFSŧ^\pH4nXY3Qa1iZ3Qa1j^X3Qa1(iZ3Qa1pDnY3Qa1t j zd\^\x(X(27s  2!/x$ 27 '/(( ! "X(   `Q3Qa1d`Z3Qa1ؓF F( > ( \ ,~PɞHɾ@<``WH<~@p!xpϐ p  ()d( z" Jzz~@Ǟ<HHWH~@pp p v fp ρvw  ρ'1$'1$~@HHWPD~HpTnW 3Qa1n W3Qa17. 3 X( ; B gz@ z& @0   1j@ Xp3 @6`A~A bA JAZ4NA :A 2A*$ $#4!~HǞDPPW @(#)ip_input.c 4.7 87/05/20 ip_initforward: src %x dst %x ttl %x 2(.4 6 < > \ ^        T^`h TV^, . p r     ,   !$$% &T%&>(B D R)  )          + , ` b p r    - &. 0 0  6 :3 <3 @4 B4 P5 V Z6 \6 `7 b7 p5   9 0 Fv;<d..text.data.bss_ip_init~x~x_panic~x~x_inetsw~x~x_lbolt~x_ipq~x_ip_id~x(~x_ipintrq~x3~x_ifinet~x_ipintr~x@~x_ipstat~x_ipcksum~xJ~x_m_adj~xT~x_ipaddr~xb~xq ~x}L~xx~x_m_freem~x_m_get~x_insque~x_ip_deq ~x_ip_enq~x_m_cat~x_remque~x_m_free~x0~x_spl7~x_splx~x~x~x~x_iptime~x~x P~x_bcopy~x ~x~x~x_tcb~x~x~x_udb~x~x_printf~x(~x_m_copy~x6~x_mbstat ~xA~x_mbfree~x_mclfree~xN~x_rpintrq~x_ifnet~x_rthost~x_rtnet~x_rtstat ~x_domains~xX_pffindproto_ip_protox_inetdomain_ipqmaxlen_if_ifwithaf_m_pullup_in_cksum_ip_dooptions_if_ifwithaddr_ip_forward_ip_reass_ip_freef_ip_slowtimo_ip_drain_in_netof_if_ifonnetof_icmp_error_ip_stripoptions_ip_ctlinput_inetctlerrmap_tcp_abort_in_pcbnotify_udp_abort_ipprintfs_ipforwarding_ip_output_nmbclusters_rawintrqip_output.o/ 548578462 0 0 100664 2802 ` u #.textH .dataHH @.bsshh<@H~PAP^p p@ .ps" xx  @ @ z@ ώXFX^lhW3Qa1  JnW3Qa1 Tǐ, (($zP^lnW 3Qa1L  ^lnT3Qa1F z    ݋zz gzz,URG,,RST,FIN,ACK,SYN<%x%s %x %s:???????? [%x..%x)@%x, urp=%x%s%s%s%s%s%s%s%s%s%sPUSH%s%s<%s> -> %s rcv_(nxt,wnd,up) (%x,%x,%x) snd_(una,nxt,max) (%x,%x,%x) snd_(wl1,wl2,wnd) (%x,%x,%x)  ,8DP\dlx ATTACHDETACHBINDLISTENCONNECTACCEPTDISCONNECTSHUTDOWNRCVDSENDABORTCONTROLSENSERCVOOBSENDOOBSOCKADDRPEERADDRCONNECT2FASTTIMOSLOWTIMOPROTORCVPROTOSENDCLOSEDLISTENSYN_SENTSYN_RCVDESTABLISHEDCLOSE_WAITFIN_WAIT_1CLOSINGLAST_ACKFIN_WAIT_2TIME_WAITREXMTPERSISTKEEP2MSLinputoutputuserresponddrop$&0:<@BRX      dn z      (06 <NV\ bx       @J \b   $(,048<@DHLPX\`dhlptx.textD.data/.bss xxxx>xx_iptimexx_bzeroxx$(xx_printfxx_tanameshxx/xx<Xxx_mbstat xxGxx_mbfreexx_mclfreexx_rthostxx_rtnetxx_rtstat xx_ipintrqxxTxx_rpintrqxx_ifnetxx_domainsxx_ipstatxx_ipqxx_ip_idxx_tcp_issxx^xxixx_tcb8xx_tcpstatxxsxx_tcp_trace_tcp_debx_tcp_debug_tcpstates_prurequests_tcptimers_nmbclusters_rawintrq_tcp_alpha_tcp_beta_tcpconsdebug tcp_input.o/ 548578512 0 0 100664 8808 ` u tC.textm .data @.bssppLPX~`P^|p^lx( |( z(2 (V XzU^xh%nx      $$N`0nX 3Qa1R xp nxL`0nX 3Qa1,+x ^x[^xX  D P| ^|  ^|(%%z" ^|zz ^|*zz"0(#!   zz ""&nX 3&Qa1øn$X3Qa1(,>$+ Ў } p zW^r^rzU`^rX(' \%# <%! 0Qa1H0Rb109Td14Xh1zT < ^lQ^lmX3Qa1} XZ^|P P^|$ &zzBBz Bz     Z  TPt ^t^tkX 3 Qa1nh]3 Qa1  mX3Qa1t .m^h3Qa1t t|t 0 bm^h3Qa1p <@L<0T,(LDZP^l  *<aT &  p  ,( (, LD (<"  d X gBzz*zz B ! !4BzBD h z"z ~ ! !&ǷDXB !h& !(&  h zz  p   h&zz  ( & ! !&BDh zz6z  ` zz ! !z,z" zpVzLHpWp\pHp8p  z pW(hT4(,( (,  b4(TTǸ(gZ[zj\\`z`D`gZQ0z& Xz&X`ZT V`  z   zX   z Zl`_printf_m_get_bcopy_tcb8JX(do~_m_free_tcp_issX_m_adj_sbdrop /B_m_freemO^iu_soabort_panic_remque_insque_mbstat _mbfree_mclfree_ipintrq_rpintrq_ifnet_rthost_rtnet_rtstat _domains_ipstat_ipq_ip_id>_tcp_input_ip_stripoptions_m_pullup_tcpcksum_in_cksum_tcpprintfs_in_pcblookup_tcp_saveti_sonewconn_tcp_dooptions_in_pcbconnect_tcp_template_in_pcbdisconnect_tcp_drop_soisconnected_tcp_reass_tcp_close_tcp_alpha_tcp_beta_sbwakeup_soisdisconnected_tcp_canceltimers_sohasoutofband_tcp_pulloutofband_tcpnodelack_socantrcvmore_tcp_trace_tcp_output_tcp_respond_sbappend_nmbclusters_rawintrq_tcp_debug_tcp_debxtcp_output.o/ 548578528 0 0 100664 3502 ` u (.textpd" .datapph@.bssxHPX~`p$ǰT(RQ^P^dP^hW,^p(P^p@k<z( z@np gz zQ^hzP^l <(z,  P^ll0( Nz ^dPp< zp@($&zz4+&7PDz"10daP/R #(@@2ss_tcp_output_tcp_outflags_tcp_setpersist_tcp_initopt_in_cksum_tcp_beta_tcp_trace_ip_output_nmbclusters_tcp_alpha_tcp_debug_tcp_debxtcp_subr.o/ 548578542 0 0 100664 3380 ` u \1.text .data@T@.bssPPP W@~8ǀ$ T(p g  X3Qa1gX 3Qa1   P  !"$&~8@@W`DHP@~XqІ@(d$$ñ&zz$$l)  `W'' l%# D%! 0Qa1l&! 0Rb1L&# 9Td1,&' 4Xh1  pR   (         P  ! "&( $ ( -0~XɞPɾHD``W@~<p 2q$ ~<@@W@4~8p$ǐzVJ~8Ǟ4@@W8 88WP?8@~HǸ$xΠ$w p h  J 2   p p    ~Hɞ@ɾ8PPWW@  L2'0p23W32.*2 .$#>$H@@W @(#)tcp_subr.c 4.7 87/05/20   ( 2 V  z @|, .text.data@.bssq_tcp_issq_tcb8qqq#@q_m_getq1<q_m_freemq>qHqShqaqkquqTq,q_remqueq_m_freeq_spl7qqq_splxqPq\qqq_mbstat qq_mbfreeq_mclfreeq_rthostq_rtnetq_rtstat q_ipintrqqq_rpintrqq_ifnetq_domainsq_ipstatq_ipqq_ip_idq_tcpstatq_tcp_init_tcp_alpha_tcp_beta_tcp_template_tcp_respond_in_cksum_ip_output_tcp_newtcpcb_m_getclr_tcp_drop_tcp_output_tcp_close_tcp_abort_soisdisconnected_in_pcbdetach_tcp_drain_tcp_ctlinput_inetctlerrmap_in_pcbnotify_nmbclusters_rawintrqin_cksum.o/ 548578546 0 0 100664 1074 ` u  .text .data@.bss((8n@ bzfpǒaaaF >p"9p8,0,ap9,0,appb  9,0,bd  9,0,dhgf9,,hfgd9,db9,ba9p8,p0,b& 9Ph5,0,bd& 9Ph5,0,dPhgf9h5,hE,hfgd9h5,db9h5,ba9,p0,," <bzfB  a a n@Ɏ8HWns: cksum: out of data .text.data.bss(m_printfm_mbstat mim_mbfreem_mclfreemv_in_cksumstartEvensum4bytessum2bytessum4oddBytessumOddLoopsum2oddBytessum1oddBytesumOddCarry_nmbclusterstcp_timer.o/ 548578558 0 0 100664 2634 ` u 4).text .datahL@.bss((@~8ppPB  2b$  w~8@@W`?HP~X\֠ Hǚ Ǻy gz@zz.$!( 8  ,r XiZzz X z Z q@ ~XɞPɾH``W  !$WH~DppW(pzz pb  z   zX   z  P zz`  z   zX   z Zzp zz  z   zX   z (,z f$z:XzЀІ *z z xp zpp І  Ў   Іx xІdf  TBBZ<@<0T,(Ћp   kY 3 Qa1pzЋjj\<ZRІ&"pXzz@ d  e<>zz <(z<0n`J H: 8*(p p hp&zd('0` ~XɞPɾHDhhWH~@p  N4pj΀F~@HHW@~8p$ǀzp\z zp.$0p ~8@@W8 ȧ~4pz:6pxWZp pz $"~488W @(#)tcp_usrreq.c 4.7 87/05/20 ,Dh,lPtcp_usrreq0Rn 2 R v  pj$\bh z!|!"#$ *8%B&Z ' $(,048<@DHLPTX\`dx|.text5.data.bssu`_spl7u`_splxu`Lu`u`,u`7u`Cu`Ru``u`ru`_tcp_issu`u`u`xu`u`u`u`_m_freemu`u`u`u`_panicu`u`u`u`%u`_tcb8u`0u`=u`Ku`Yu`_sbflushu`lu`_mbstat u`~u`_mbfreeu`_mclfreeu`_ipintrqu`u`_rpintrqu`_ifnetu`_rthostu`_rtnetu`_rtstat u`_domainsu`_ipstatu`_ipqu`_ip_idu`u`u`_tcpstatu`>u`u`_tcp_usrreq_tcp_attach_tcp_disconnect_tcp_close_in_pcbbind_in_pcbconnect_tcp_template_in_pcbdisconnect_soisconnecting_tcp_output_socantsendmore_tcp_usrclosed_sbappend_tcpsenderrors_tcp_drop_in_setsockaddr_in_setpeeraddr_tcp_timers_tcp_trace_tcp_sendspace_tcp_recvspace_soreserve_in_pcballoc_tcp_newtcpcb_in_pcbdetach_soisdisconnecting_soisdisconnected_nmbclusters_rawintrq_tcp_alpha_tcp_beta_tcp_debug_tcp_debx if_ether.o/ 548578588 0 0 100664 3900 ` u  '.text; .datax\@.bssHH0 * 00WH~@2 . v<hp< #( p_~@HHW`<@~H*z|pR@&r  x&: $* $P9P .PW~Hɞ@Ǿ<``Wh?@H~PnX3Qa1p@&v* :n\X3XQa1.XP2 z B x#*c  s    h az  z &qppp*p   |\"&V N. 6  L ~PɞHɾ@hhW~pgPH3HQa1~WpPX~` z4nY3Qa1 p $F$6x&& P' 7 G N(G N,G ,N0h` az  z &߁L&\  ( tx9P .tW ,0& &$ x&$f& d9P .dW V~`ɎXɮPW@~8p"  ~8@@W@~8@ az  zp7 *(A7!p%s4gX3Qa1~8@@W @(#)if_ether.c 4.7 87/05/20 duplicate IP address!! sent from ethernet address: %x %x %x %x %x %x ,.8     BVblD F "&0t v 8HXhf h .text;.datax.bssHr`_arpcomr`\r`_timeoutr`r`_arptablr`#r`-$r`_m_getr`_bzeror`8@r`_bcopyr`Lr`Xr`_loifr`br`_spl7r`_arptnew,r`_splxr`_m_freemr`lr`wLr`_bcmpr`_printfr`_mbstat r`r`_mbfreer`_mclfreer`_ipintrqr`r`_rpintrqr`_ifnetr`_domainsr`_arpattach_arptimer_arpt_age_arptfree_arpwhohas_etherbroadcastaddr_arpresolve_in_lnaof_looutput_arpmyaddr_arpinput_nmbclusters_rawintrqudp_usrreq.o/ 548578603 0 0 100664 4800 ` u + :.text,A .datal 8@.bssPPPWXL~P|(z,px(bgz ,zz*RJ  ֋(nW 3Qa1×n$W3Qa1(,>$)rBnW3Qa1H#2`W 3Qa1z$(0$~PǞLXXW8 ~4qxp~488W@  L2'0p23W32.*2 .$#>$@@WP@~Hxwzpp` h  Z3Qa1hZ 3Qa1     &V  *2z z3 1 0 ~Hɞ@PPWX@H~PpAǷzΠ@ Π҅p W Π! Π ‹x hΠ` ΠP  ~4Π,Π$ Π RJ>HnT[3Qa1 Π  Π & k^T3Qa1d H : t*ΠΠxJ  > ~PɎHɮ@XXW @(#)udp_usrreq.c 4.7 87/05/20 0HX`\xudp_usrreq ` l n v       $ ,$.FT R`h !@"N#v$%&$:`"h'p~()*  $(,048<@DHLPTX\`dhlpt.textA.data.bssu_udb8u(uu_udpstat u#u_m_adju4u>u_m_freemuHuVu`u_udp_inuluzutuuuuuu u_m_getuuuuuu'u3uBuQu_sofreeuauqu_panicu_mbstat uu_mbfreeu_mclfreeu_ipintrquu_rpintrqu_ifnetu_rthostu_rtnetu_rtstat u_domainsu_ipstatu_ipqu_ip_idu_udp_init_udp_input_m_pullup_ip_stripoptions_udpcksum_in_cksum_in_pcblookup_in_lnaof_icmp_error_sbappendaddr_sbwakeup_udp_abort_in_pcbdisconnect_soisdisconnected_udp_ctlinput_inetctlerrmap_in_pcbnotify_udp_output_ip_output_udp_usrreq_in_pcballoc_soreserve_in_pcbdetach_in_pcbbind_in_pcbconnect_soisconnected_socantsendmore_in_setsockaddr_in_setpeeraddr_nmbclusters_rawintrqh46410 s 00000/00000/00307 d D 4.2 87/05/20 13:31:31 brian 5 4 c mbuf.h put back on system search path BB e s 00000/00000/00307 d D 4.1 87/02/20 13:39:12 build 4 3 c rolled rev to -r4 /dc e s 00000/00000/00307 d D 3.1 87/01/19 09:29:54 build 3 2 c rolled rev to -r3 /dc e s 00000/00000/00307 d D 2.1 87/01/19 09:29:54 build 2 1 c AUTO NULL DELTA e s 00307/00000/00000 d D 1.1 87/01/09 18:12:44 build 1 0 c Placed under source control - dc e u U f b f n t T I 1 /* "@(#)in_cksum.c 3.1 6/19/85" */ /* in_cksum.c 6.1 84/09/13 */ typedef char * caddr_t; typedef unsigned int Boolean; #define FALSE 0 #include #include #include #include "in.h" #include "in_systm.h" /* * Checksum routine for Internet Protocol family headers (Ridge Version). * * This routine is very heavily used in the network code and * should be modified for each CPU to be as fast as possible. * It performs the 16 bit summation of the data stream taken * 16 bits at a time. If there are an odd number of bytes, * then the last byte is padded with zeroes to be a 16 bit * quantity. */ #define lobyte(x) (*((char *)x)) #define hibyte(x) ((unsigned)(*((char *)x) << 8)) in_cksum(m, len) register struct mbuf *m; /* Assume r2 on Ridge */ register len; /* Assume r6 on Ridge */ { register char *w; /* Assume r3 on Ridge */ register u_long sum; /* Assume r8 on Ridge */ register mlen; /* Assume r1 on Ridge */ register Boolean oddbyte; /* Assume r7 on Ridge */ asm (" store r9,r15,-16"); /* sauvegarde r9 */ asm (" store r10,r15,-20"); /* sauvegarde r10 */ asm ("TRUE equ 1"); asm ("FALSE equ 0"); sum = 0; mlen = m->m_len; oddbyte = FALSE; for (;;) { w = mtod(m, char *); /* * Calculate how much of the data in the current mbuf will be * included in the checksum. Update the length remaining based * on this. */ if (len < mlen) mlen = len; len -= mlen; /* * If the data in an mbuf starts on an odd byte boundary, we * will process the first byte separately, and then process * the rest of the buffer. If this is the first buffer, or * the last abuffer terminated on a halfword boundary, this * character must be added into the high byte of the checksum. * We then act as if the previous buffer terminated on an oddbyte * boundary for processing the rest of the buffer. If the last * buffer terminated on an oddbyte boundary, the first byte of * the current buffer is added into the low byte of the checksum, * and the buffer is treated as a non-oddbyte continuation buffer. */ if (mlen >= 1 && ((int)w & 0x1)) { /* printf("ns: cksum: mbuf starts on odd byte\n"); */ if (!oddbyte) { asm (" laddr r0,0"); /* clear carry/overflow for eadd */ asm (" loadb r9,r3"); /* get the oddbyte */ asm (" lsl r9,8"); /* shift it to the hi byte */ asm (" eadd r8,r9"); /* add it into the checksum */ asm (" laddr r9,0"); /* add in any carry generated */ asm (" eadd r8,r9"); /* but not overflow */ asm (" add r3,1"); /* update w (the pointer to the data) */ asm (" sub r1,1"); /* update mlen */ asm (" laddr r7,TRUE"); /* set oddbyte */ } else { asm (" laddr r0,0"); /* clear carry/overflow for eadd */ asm (" loadb r9,r3"); /* get the oddbyte */ asm (" eadd r8,r9"); /* add it into the checksum */ asm (" laddr r9,0"); /* add in any carry generated */ asm (" eadd r8,r9"); /* but not overflow */ asm (" add r3,1"); /* update w (the pointer to the data) */ asm (" sub r1,1"); /* update mlen */ asm (" laddr r7,FALSE"); /* clear oddbyte */ } } /* * There are two major cases to consider. If data is continued * from the current mbuf to another, then the current mbuf may * terminate on a halfword boundary or on a byte boundary. The * following assembler code processes the first case. The code * to handle the second case is almost identical, except that it * does shifts of the data to get the right byte allignment. The * code could be combined, using a shift value of zero for the * case which does not need to be shifted. For speed purpose in * the standard case (which is that mbufs which are continued are * halfword alligned), I have chosen not to combine the code. */ /* * WARNING: * * If the following assembly code is modified, check the else * part of the loop to see if it needs modification also. */ if (!oddbyte) { if (mlen >= 2 && ((int)w & 0x3)) { /* process a leading halfword */ asm (" laddr r0,0"); /* clear carry/overflow for eadd */ asm (" loadh r9,r3"); /* get the halfword */ asm (" eadd r8,r9"); /* add it into the checksum */ asm (" laddr r9,0"); /* add in any carry generated */ asm (" eadd r8,r9"); /* but not overflow */ asm (" add r3,2"); /* update w (the pointer to the data) */ asm (" sub r1,2"); /* update mlen */ } if (mlen >= 4 && ((int)w & 0x7)) { /* process a leading word */ asm (" laddr r0,0"); /* clear carry/overflow for eadd */ asm (" load r9,r3"); /* get the word */ asm (" eadd r8,r9"); /* add it into the checksum */ asm (" laddr r9,0"); /* add in any carry generated */ asm (" eadd r8,r9"); /* but not overflow */ asm (" add r3,4"); /* update w (the pointer to the data) */ asm (" sub r1,4"); /* update mlen */ } /* * Do as much of the checksum as possible, 8 bytes at * a time. Note that mlen is adjusted for the loop to * optimally get the correct number of 8 byte chunks. * It is restored before getting smaller chunks. */ asm (" laddr r0,0"); /* clear carry/overflow for eadd */ asm (" br r1 < 8,sum4bytes"); /* branch if no 8 byte chunks left */ asm (" sub r1,7"); /* adjust mlen as loop counter */ asm (" neg r1,r1"); asm ("sumLoop:"); /* process the next 8 byte chunk */ asm (" loadd r9,r3"); /* get the double word */ asm (" eadd r8,r9"); /* add the 1st word into the checksum */ asm (" eadd r8,r10"); /* add the 2nd into the checksum */ asm (" add r3,8"); /* update w (the pointer to the data) */ asm (" loop r1,8,sumLoop"); /* update mlen & go do next 8 bytes */ asm (" neg r1,r1"); /* readjust mlen */ asm (" add r1,7"); /* * Do the next 4 bytes of the checksum if possible. */ asm ("sum4bytes:"); asm (" br r1 < 4,sum2bytes"); /* branch if no 4 byte chunk left */ asm (" load r9,r3"); /* get the word */ asm (" eadd r8,r9"); /* add it into the checksum */ asm (" add r3,4"); /* update w (the pointer to the data) */ asm (" sub r1,4"); /* update mlen */ /* * Do the next 2 bytes of the checksum if possible. */ asm ("sum2bytes:"); asm (" br r1 < 2,sum1byte"); /* branch if no halfword left */ asm (" loadh r9,r3"); /* get the halfword */ asm (" eadd r8,r9"); /* add it into the checksum */ asm (" add r3,2"); /* update w (the pointer to the data) */ asm (" sub r1,2"); /* update mlen */ /* * Do the remaining odd byte of the checksum if any. * Note that it is added into the high byte. In case * the data is continued into another mbuf, set the * oddbyte flag to be true, so that the data from the * next mbuf will be alligned correctly. */ asm ("sum1byte:"); asm (" br r1 <> 1,sumCarry"); /* branch if no odd byte */ asm (" loadb r9,r3"); /* get the odd byte */ asm (" lsl r9,8"); /* left justify it within a halfword */ asm (" eadd r8,r9"); /* add it to the checksum */ asm (" laddr r7,TRUE"); /* set oddbyte */ asm ("sumCarry:"); asm (" laddr r9,0"); /* add in the last carry but not */ asm (" eadd r8,r9"); /* overflow (so can't just add r0) */ } else { /* * This code handles the case where the previous mbuf * terminated on an odd byte. This means the bytes * from the current mbuf must be swapped before being * added into the checksum. Note that the order of * the halfwords is not important, only the allignment * of the bytes within the halfword. For this reason * we can use the circular shift left instruction to * get the correct byte allignment, and then add as * usual. */ if (mlen >= 2 && ((int)w & 0x3)) { /* process a leading halfword */ asm (" laddr r0,0"); /* clear carry/overflow for eadd */ asm (" loadh r9,r3"); /* get the halfword */ asm (" laddr r4,8"); /* swap the hi & lo bytes */ asm (" csl r9,r4"); asm (" eadd r8,r9"); /* add it into the checksum */ asm (" laddr r9,0"); /* add in any carry generated */ asm (" eadd r8,r9"); /* but not overflow */ asm (" add r3,2"); /* update w (the pointer to the data) */ asm (" sub r1,2"); /* update mlen */ } if (mlen >= 4 && ((int)w & 0x7)) { /* process a leading word */ asm (" laddr r0,0"); /* clear carry/overflow for eadd */ asm (" load r9,r3"); /* get the word */ asm (" laddr r4,8"); /* swap the hi & lo bytes */ asm (" csl r9,r4"); asm (" eadd r8,r9"); /* add it into the checksum */ asm (" laddr r9,0"); /* add in any carry generated */ asm (" eadd r8,r9"); /* but not overflow */ asm (" add r3,4"); /* update w (the pointer to the data) */ asm (" sub r1,4"); /* update mlen */ } /* * Do as much of the checksum as possible, 8 bytes at * a time. Note that mlen is adjusted for the loop to * optimally get the correct number of 8 byte chunks. * It is restored before getting smaller chunks. */ asm (" laddr r0,0"); /* clear carry/overflow for eadd */ asm (" laddr r4,8"); /* use later to swap hi & lo bytes */ asm (" br r1 < 8,sum4oddBytes"); /* branch if no 8 byte chunks left */ asm (" sub r1,7"); /* adjust mlen as loop counter */ asm (" neg r1,r1"); asm ("sumOddLoop:"); /* process the next 8 byte chunk */ asm (" loadd r9,r3"); /* get the double word */ asm (" csl r9,r4"); /* swap hi & lo bytes */ asm (" eadd r8,r9"); /* add the 1st word into the checksum */ asm (" csl r10,r4"); /* swap hi & lo bytes */ asm (" eadd r8,r10"); /* add the 2nd into the checksum */ asm (" add r3,8"); /* update w (the pointer to the data) */ asm (" loop r1,8,sumOddLoop"); /* update mlen & go do next 8 bytes */ asm (" neg r1,r1"); /* readjust mlen */ asm (" add r1,7"); /* * Do the next 4 bytes of the checksum if possible. */ asm ("sum4oddBytes:"); asm (" br r1 < 4,sum2oddBytes"); /* branch if no 4 byte chunk left */ asm (" load r9,r3"); /* get the word */ asm (" csl r9,r4"); /* swap hi & lo bytes */ asm (" eadd r8,r9"); /* add it into the checksum */ asm (" add r3,4"); /* update w (the pointer to the data) */ asm (" sub r1,4"); /* update mlen */ /* * Do the next 2 bytes of the checksum if possible. */ asm ("sum2oddBytes:"); asm (" br r1 < 2,sum1oddByte"); /* branch if no halfword left */ asm (" loadh r9,r3"); /* get the halfword */ asm (" csl r9,r4"); /* swap hi & lo bytes */ asm (" eadd r8,r9"); /* add it into the checksum */ asm (" add r3,2"); /* update w (the pointer to the data) */ asm (" sub r1,2"); /* update mlen */ /* * Do the remaining odd byte of the checksum if any. * Note that while it is normally added into the high * byte, since we are operating in byte swap mode * it will be added into the low byte instead. In * case the data is continued into the next mbuf, we * will clear the oddbyte flag if there's an odd byte * in this mbuf, so that the next mbuf will be * processed in non-byte swap mode. */ asm ("sum1oddByte:"); asm (" br r1 <> 1,sumOddCarry"); /* branch if no odd byte */ asm (" loadb r9,r3"); /* get the odd byte */ asm (" eadd r8,r9"); /* add it to the checksum */ asm (" laddr r7,FALSE"); /* clear oddbyte flag */ asm ("sumOddCarry:"); asm (" laddr r9,0"); /* add in the last carry but not */ asm (" eadd r8,r9"); /* overflow (so can't just add r0) */ } /* * If we are done with the byte count specified, then * just exit the for loop. */ if (len == 0) break; /* * If we need to include more data in the checksum, then * we need to get another mbuf, if any are available. */ for (;;) { m = m->m_next; if (m == 0) { printf("ns: cksum: out of data\n"); goto done; } if (mlen = m->m_len) break; } } /* * Add in the ones complement carry which has been accumulating * in the high order half word. Then add the carry from that * addition. */ done: sum = (sum & 0xffff) + (sum >> 16); /* add 16 bit carry out */ sum = (sum & 0xffff) + (sum >> 16); /* add resultant carry out*/ asm (" load r9,r15,-16"); /* restitution r9 */ asm (" load r10,r15,-20"); /* restitution r10 */ return(~sum & 0xffff); } E 1 \.R..]s.trace.h^s.wonder.h_s.Makefile`s.wonder.cas.lance.hbwonder.hclance.hdtrace.hewonder.bakfwonder.newgwonder.vanhMakefile.vanimbuf.vanjLIBWB.ah26304 s 00001/00001/00024 d D 4.4 87/05/14 16:42:24 build 8 7 c removed old SCCS strings and inserted #ident BB e s 00006/00005/00019 d D 4.3 87/03/25 17:10:43 van 7 6 c van - add TraceBadType e s 00020/00020/00004 d D 4.2 87/03/18 11:14:51 van 6 5 c van - change default values for trace and xebug e s 00000/00000/00024 d D 4.1 87/02/20 13:39:27 build 5 4 c rolled rev to -r4 /dc e s 00000/00000/00024 d D 3.1 87/01/19 09:30:09 build 4 3 c rolled rev to -r3 /dc e s 00000/00000/00024 d D 2.1 87/01/19 09:30:09 build 3 2 c AUTO NULL DELTA e s 00001/00000/00023 d D 1.2 87/01/16 10:25:50 build 2 1 c add ident string /dc e s 00023/00000/00000 d D 1.1 87/01/09 17:32:43 build 1 0 c Placed under source control - dc e u U f b f n t T I 2 D 8 /* "%W% %E%" */ E 8 I 8 #ident " %W% %E% " E 8 E 2 I 1 #ifdef DEBUG D 6 int trace = 0xffff; int xebug = 0xffff; E 6 I 6 D 7 int trace = 0x0000; E 7 I 7 int trace = 0x8000; E 7 int xebug = 0x0001; E 6 #endif /* DEBUG */ D 6 #define DebugAll 255 #define DebugErrorMsgs 1 #define DebugWBCommands 2 #define DebugWBProcs 4 #define DebugWBInterrupts 8 #define DebugWBStats 16 #define DebugWBInit 32 #define DebugWBTimer 64 #define DebugWBIO 128 #define TraceAll 255 #define TraceProcs 1 #define TraceNet 2 #define TraceLog 4 #define TraceLogDone 8 #define TraceMsgs 16 #define TraceWBTimer 32 #define TraceErrors 64 #define TraceFrames 128 E 6 I 6 #define DebugAll 0xffff #define DebugErrorMsgs 0x0001 #define DebugWBCommands 0x0002 #define DebugWBProcs 0x0004 #define DebugWBInterrupts 0x0008 #define DebugWBStats 0x0010 #define DebugWBInit 0x0020 #define DebugWBTimer 0x0040 #define DebugWBIO 0x0080 #define TraceAll 0xffff #define TraceProcs 0x0001 D 7 #define TraceNet 0x0002 E 7 I 7 #define TraceWBTimer 0x0002 E 7 #define TraceLog 0x0004 #define TraceLogDone 0x0008 #define TraceMsgs 0x0010 D 7 #define TraceWBTimer 0x0020 #define TraceFrames 0x0040 #define TraceErrors 0x0080 E 7 I 7 #define TraceNet 0x0020 #define TraceBadType 0x0040 #define TraceFrames 0x1000 #define TraceErrors 0x8000 E 7 E 6 E 1 h11875 s 00001/00001/00071 d D 4.3 87/05/14 16:44:19 build 7 6 c removed old SCCS strings and inserted #ident BB e s 00001/00001/00071 d D 4.2 87/05/14 16:42:35 build 6 5 c removed old SCCS strings and inserted #ident BB e s 00000/00000/00072 d D 4.1 87/02/20 13:39:30 build 5 4 c rolled rev to -r4 /dc e s 00000/00000/00072 d D 3.1 87/01/19 09:30:11 build 4 3 c rolled rev to -r3 /dc e s 00000/00000/00072 d D 2.1 87/01/19 09:30:11 build 3 2 c AUTO NULL DELTA e s 00001/00000/00071 d D 1.2 87/01/16 10:25:53 build 2 1 c add ident string /dc e s 00071/00000/00000 d D 1.1 87/01/09 17:32:44 build 1 0 c Placed under source control - dc e u U f b f n t T I 2 D 6 /* "%W% %E%" */ E 6 I 6 #ident " %W% %E% " E 6 E 2 I 1 D 7 /* "@(#)wonder.h 4.2 2/28/86" */ E 7 I 7 /* " wonder.h 4.2 2/28/86" */ E 7 /* wonder.h */ /* Ridge WonderBoard Driver include file */ /************************************/ /* Ridge generic driver definitions */ /************************************/ #define dirty TRUE #define HalfWordMask 0XFFFF #define LoByteMask 0XFF #define HalfWordShiftCnt 16 #define ByteShiftCount 8 /* system call error codes */ #define ERBadResponse 598 #define Erbaddevice 1000 /* there's one of these in errors.h */ #define ErIOTimeOut 1001 #define ErIODataNotValid 1002 #define ErIOTmOAndDNV 1003 #define ErUnknownError 1004 /****************************************/ /* Ridge WonderBoard Driver definitions */ /****************************************/ #define AddrHiMask 0X007FFF8000 #define AddrLoMask 0X7FFF #define WonderRidgeFlag 0X00008000 /* 0 = wonderboard shared memory; 1= ridge memory */ #define MemMapFlag 0X00800000 /* 0 = shared memory; 1 = mapping RAM */ #define BHE 0X00400000 /* Byte or 8086 HalfWord Enable */ /* Shared memory with the 8086 on Wonder Board */ #define etherCB 0 #define etherCBSize 40 #define etherInitBlock (etherCB + etherCBSize) #define etherInitSize 24 #define SCSICtrlBlock 0X0040 #define LinePtrCtrlBlk 0X0080 #define DiagCtrlBlk 0X00C0 #define TTYCtrlBlock 0X0100 #define DiagBuffer 0X0200 #define IntQEntrySize 2 /* holds 1 copy of CSR0 which is 2 bytes */ #define InterruptQSize 256 /* interrupt Q size in bytes (not entries) */ #define LANCEQBegin 0X0300 /* Q holds CSR0's read on LANCE interrupts */ #define LANCEQEnd (LANCEQBegin + InterruptQSize - IntQEntrySize) #define NumRingDescs 128 #define RingDescSize 8 #define RingSize (RingDescSize * NumRingDescs) #define etherXmitRing 0X0400 #define etherRecvRing (etherXmitRing + RingSize) #define SCSICtrlBlkQ 0X1000 #define LPBuffer 0X1800 #define TTYXmitBufs 0X2000 /* ?????? verify this */ #define TTYRecvBufs 0X3000 /************************/ /* TYPE DEFINITIONS */ /************************/ typedef int VirtualAddress; typedef int realAddress; typedef int PageAddr; typedef int IOAddressWord; typedef int IODataWord; typedef int DeviceNumber; E 1 h22569 s 00001/00001/00043 d D 4.10 87/05/20 13:49:10 brian 21 20 c mbuf.h put back on system search path BB e s 00001/00001/00043 d D 4.9 87/05/07 19:17:19 van 20 19 c van - move defsocket.h back to /usr/include/sys e s 00006/00007/00038 d D 4.8 87/04/30 18:46:45 van 19 18 c van - moved net and netinet includes e s 00001/00000/00044 d D 4.7 87/04/29 20:25:37 build 18 17 c van - added IFLAGS e s 00004/00004/00040 d D 4.6 87/04/29 16:42:13 van 17 16 c van - moved ucb networking includes to INCUCB e s 00006/00000/00038 d D 4.5 87/03/26 22:22:24 dc 16 15 c add all: entry e s 00009/00009/00029 d D 4.4 87/03/18 11:45:49 build 15 14 c van - system includes are in sys e s 00012/00012/00026 d D 4.3 87/03/18 11:27:17 van 14 13 c van - deleted extraneous defines, etc. e s 00001/00002/00037 d D 4.2 87/02/22 16:12:25 build 13 11 c change OPTION to DFLAGS /dc e s 00000/00003/00036 d R 4.2 87/02/22 09:38:44 build 12 11 c remove CC and CFLAGS definitions e s 00000/00000/00039 d D 4.1 87/02/20 13:39:35 build 11 10 c rolled rev to -r4 /dc e s 00005/00002/00034 d D 3.3 87/01/27 16:18:09 build 10 9 c fix up depends for wonder.o e s 00001/00000/00035 d D 3.2 87/01/27 10:54:23 build 9 8 c add types.h to dependencies for wonder.o e s 00000/00000/00035 d D 3.1 87/01/19 09:30:13 build 8 7 c rolled rev to -r3 /dc e s 00000/00000/00035 d D 2.1 87/01/19 09:30:13 build 7 6 c AUTO NULL DELTA e s 00001/00000/00034 d D 1.6 87/01/16 10:25:56 build 6 5 c add ident string /dc e s 00002/00000/00032 d D 1.5 87/01/13 11:18:12 build 5 4 c use rc instead of cc (suspect bugs in cc) e s 00004/00001/00028 d D 1.4 87/01/11 11:40:40 build 4 3 c add headers to clean entry e s 00003/00000/00026 d D 1.3 87/01/11 11:30:20 build 3 2 c add clobber entry e s 00003/00014/00023 d D 1.2 87/01/09 17:46:27 build 2 1 c add sccs control e s 00037/00000/00000 d D 1.1 87/01/09 17:33:51 build 1 0 c Placed under source control - dc e u U f b f n t T I 6 # "%W% %E%" E 6 I 1 # D 2 # makefile de la wonderboard et de l'interface E 2 I 2 D 19 # makefile for wonderboard and network server E 19 I 19 # makefile for cio enet driver E 19 E 2 # D 14 INCRT = $(SPX)/usr/include/sys D 2 CFLAG = -O -I$(INCRT) DFLAG = -DKERNEL -DREVC -Drevb -Ddebug -DINET -DSPS9 CC = rc E 2 I 2 D 13 CFLAGS = -O -I$(INCRT) -DKERNEL -DREVC -Drevb -Ddebug -DINET -DSPS9 E 13 I 13 DFLAGS = -O -I$(INCRT) -DKERNEL -DREVC -Drevb -Ddebug -DINET -DSPS9 E 13 E 2 LIB = LIBWB.a E 14 I 14 INCRT = $(SPX)/usr/include/sys I 18 IFLAGS = -I$(INCUCB) E 18 DFLAGS = -DKERNEL -Ddebug -DINET -DSPS9 LIB = LIBWB.a E 14 I 5 D 19 # use 'newer' compiler E 19 D 13 CC = rc E 13 E 5 I 4 # local headers which really live in the SCCS files HEADERS = wonder.h lance.h trace.h I 16 OBJECTS= $(LIB)(wonder.o) all: $(LIB) $(LIB): $(OBJECTS) E 16 E 4 $(LIB)(wonder.o):\ wonder.h\ lance.h\ trace.h\ D 19 ../net/if.h\ ../net/route.h\ ../netinet/in.h\ ../netinet/ip.h\ ../netinet/if_ether.h\ E 19 I 19 $(INCUCB)/net/if.h\ $(INCUCB)/net/route.h\ $(INCUCB)/netinet/in.h\ $(INCUCB)/netinet/ip.h\ $(INCUCB)/netinet/if_ether.h\ E 19 I 10 D 14 $(INCRT)/types.h\ E 10 $(INCRT)/defsocket.h\ $(INCRT)/mbuf.h\ $(INCRT)/socket.h\ I 9 D 10 $(INCRT)/types.h\ E 10 I 10 $(INCRT)/iomachdep.h\ $(INCRT)/bsdioctl.h\ E 10 E 9 $(INCRT)/page.h\ D 2 wonder.c $(CC) $(CFLAG) $(DFLAG) -c wonder.c ar r $(LIB) wonder.o rm -f wonder.o E 2 I 2 D 10 s.wonder.c E 10 I 10 $(INCRT)/param.h\ $(INCRT)/sysmacros.h E 14 I 14 D 15 $(INC)/types.h\ $(INC)/defsocket.h\ $(INC)/mbuf.h\ $(INC)/socket.h\ $(INC)/iomachdep.h\ $(INC)/bsdioctl.h\ $(INC)/page.h\ $(INC)/param.h\ $(INC)/sysmacros.h E 15 I 15 $(INC)/sys/types.h\ D 17 $(INC)/sys/defsocket.h\ $(INC)/sys/mbuf.h\ $(INC)/sys/socket.h\ E 17 I 17 D 20 $(INCUCB)/sys/defsocket.h\ E 20 I 20 $(INC)/sys/defsocket.h\ E 20 D 21 $(INCUCB)/sys/mbuf.h\ E 21 I 21 $(INC)/sys/mbuf.h\ E 21 $(INCUCB)/sys/socket.h\ E 17 $(INC)/sys/iomachdep.h\ D 17 $(INC)/sys/bsdioctl.h\ E 17 I 17 $(INCUCB)/sys/bsdioctl.h\ E 17 $(INC)/sys/page.h\ $(INC)/sys/param.h\ $(INC)/sys/sysmacros.h E 15 E 14 E 10 E 2 D 2 wbopen: $(CC) $(CFLAG) $(DFLAG) -c wbopen.c listing: lpr wonder.c E 2 clean: I 3 D 4 rm -f *.o core E 4 I 4 rm -f *.o core $(HEADERS) E 4 clobber: clean E 3 rm -f LIBWB.a E 1 h08763 s 00001/00001/02861 d D 4.8 87/05/20 13:32:00 brian 19 18 c mbuf.h put back on system search path BB e s 00001/00001/02861 d D 4.7 87/05/14 16:43:05 build 18 17 c removed old SCCS strings and inserted #ident BB e s 00001/00001/02861 d D 4.6 87/05/07 19:17:23 van 17 16 c van - move defsocket.h back to /usr/include/sys e s 00005/00005/02857 d D 4.5 87/04/30 18:46:48 van 16 15 c van - moved net and netinet includes e s 00004/00004/02858 d D 4.4 87/04/29 16:42:14 van 15 14 c van - moved ucb networking includes to INCUCB e s 00067/00034/02795 d D 4.3 87/03/25 17:05:44 van 14 13 c van - Fixed "invalid error or command" error; added debug stuff; c misc changes e s 00226/00519/02603 d D 4.2 87/03/18 11:20:21 van 13 12 c van - fix "resetting interface" hang; misc changes e s 00000/00000/03122 d D 4.1 87/02/20 13:39:48 build 12 11 c rolled rev to -r4 /dc e s 00001/00000/03121 d D 3.6 87/01/27 16:14:48 build 11 10 c add sysmacros.h to get ptob and poff for svtophys conversions e s 00001/00001/03120 d D 3.5 87/01/27 11:01:23 build 10 9 c move types.h above all the other includes e s 00000/00001/03121 d D 3.4 87/01/27 10:58:25 build 9 8 c remove caddr_t typedef e s 00001/00001/03121 d D 3.3 87/01/27 10:53:38 build 8 7 c Add types.h as an include before page.h e s 00004/00000/03118 d D 3.2 87/01/26 17:35:54 build 7 6 c Restore error message on command/status errors; they are not c supposed to be happening (van) e s 00000/00000/03118 d D 3.1 87/01/19 09:30:21 build 6 5 c rolled rev to -r3 /dc e s 00000/00000/03118 d D 2.1 87/01/19 09:30:21 build 5 4 c AUTO NULL DELTA e s 00001/00000/03117 d D 1.4 87/01/16 10:26:04 build 4 3 c add ident string /dc e s 00002/00002/03115 d D 1.3 87/01/13 12:12:20 build 3 2 c Change "invalid error" message to only print if tracing is turned on e s 00015/00002/03102 d D 1.2 87/01/09 17:33:18 build 2 1 c add raw network support /miked e s 03104/00000/00000 d D 1.1 87/01/09 17:32:45 build 1 0 c Placed under source control - dc e u U f b f n t T I 4 D 18 /* "%W% %E%" */ E 18 I 18 #ident " %W% %E% " E 18 E 4 I 1 D 8 /* "@(#)wonder.c 4.7 2/28/86" */ E 8 /* wonder.c */ /* * Ridge Ethernet Driver - Wonderboard interface */ D 13 #define PageSize 4096 E 13 I 13 #include D 15 #include #include #include E 15 I 15 D 17 #include "sys/defsocket.h" E 17 I 17 #include E 17 D 19 #include "sys/mbuf.h" E 19 I 19 #include E 19 #include "sys/socket.h" E 15 #include D 15 #include E 15 I 15 #include "sys/bsdioctl.h" E 15 #include #include #include #include #define PageSize NBPP E 13 #define MBIGSIZE PageSize typedef unsigned long n_long; D 9 typedef char * caddr_t; E 9 D 13 #define EINVAL 22 #define EAFNOSUPPORT 147 I 10 #include E 10 #include #include #include #include #include I 8 D 10 #include E 10 E 8 #include #include I 11 #include E 13 E 11 D 16 #include "../net/if.h" #include "../net/route.h" #include "../netinet/in.h" #include "../netinet/ip.h" #include "../netinet/if_ether.h" E 16 I 16 #include "net/if.h" #include "net/route.h" #include "netinet/in.h" #include "netinet/ip.h" #include "netinet/if_ether.h" E 16 #ifdef DEBUG #include "trace.h" #endif #include "wonder.h" #include "lance.h" typedef unsigned int Error; typedef unsigned int Boolean; typedef unsigned short Halfword; #define ErOK 0 #define FALSE 0 #define TRUE 1 #ifdef DEBUG /* variables pour debug */ D 14 #define TAILLE_DEBUG 0x4000 E 14 I 14 #define TAILLE_DEBUG 0x10000 E 14 #define LG_LIGNE 0x40 #define NB_LIGNES TAILLE_DEBUG/LG_LIGNE u_short Anneau[256]; char texte[TAILLE_DEBUG]; unsigned short ligne_courante = 0; unsigned short init_debug = 0; char ascii[0x10] = {'0','1','2','3','4','5','6','7','8', '9','a','b','c','d','e','f'}; #endif /* DEBUG */ unsigned short nbpkterr = 0; D 13 Boolean tcpipopen = TRUE; E 13 I 13 Boolean tcpipOpen = FALSE; E 13 /* Global routines defined in this module */ int wbetattach(); int wbetinit(); int wbetioctl(); int wbetoutput(); int wbetopen(); int wbetreset(); /* External data structures */ extern struct ifnet loif; D 13 u_char ethbroadcastaddr[6] = {0xff,0xff,0xff,0xff,0xff,0xff}; E 13 I 13 extern u_char etherbroadcastaddr[6]; E 13 extern struct in_addr arpmyaddr(); /* External routines referenced (non-integer functions) */ extern struct mbuf *m_get(); extern struct mbuf *m_freem(); extern struct mbuf *m_getbig(); extern struct mbuf *m_copy(); extern Error d_read(); extern Error d_write(); /* Local routines (non-integer functions) requiring forward references */ Error bad_Write(); Error AllocDescRings(); struct mbuf *copyLANCEBufToMbuf(); FrameType *sptalloc(); Error copyMbufToLANCEBuf(); Error GetXmitBuf(); Error GetWonderBoard(); Error LANCEError(); Error packetXmitted(); Error ReadRevCodes(); Error WB_Init(); Error WBRead(); Error WBWrite(); Error InitStartCmds(); Error WriteWBCommand(); /* fonction de timeout */ int XmitTimeout(); int CmdTimeout(); int StartTimeout(); int BufTimeout(); /*************************************/ /* VAR beginning of global variables */ /*************************************/ /* * Ethernet software structure for the interface. * * Each interface is referenced by a network interface structure, * es.ac_if, which the routing code uses to locate the interface. * This structure contains the output queue for the interface, its address, ... */ static struct arpcom es; /* common Ethernet structures */ NodeAddressType localAddress; Boolean SleepOK; /* TRUE pour synchroniser les requetes au controleur */ /* FALSE quand on est sous IT */ Boolean WBPresent; /* TRUE if wonderboard is present */ Boolean WBDriverInited; /* TRUE if ethernet is present & driver init'd OK */ static Boolean ipintrqFull; /* TRUE if we can't give a buffer to ip */ D 14 Boolean InitPending; /* Init command issued, waiting for Init Done interrupt */ E 14 D 13 #ifdef REVB Boolean XmitPending; /* TRUE if a transmit packet is queued for transmission */ NodeAddressType lastDestinationAddr; #endif /* REVB */ E 13 /* pointers to buffers */ FrameType *RecvBufs[RecvNumBufs]; /* points to buffers we will put read data into */ FrameType *XmitBufs[XmitNumBufs]; /* where to find data to write */ realAddress RealRecvBufs[RecvNumBufs]; /* real address of RecvBufs */ realAddress RealXmitBufs[XmitNumBufs]; /* real address of XmitBufs */ int RecvQHead; /* index into RecvBufs for next buf to read */ /* XmitQ is full when buffer at XmitQHead belongs */ /* to LANCE and TempXmitQHead = XmitQTail */ int XmitQHead; /* index into XmitBufs for last buffer filled */ /* next packet will start at next buffer */ int XmitQTail; /* index into XmitBufs of first buffer of next packet */ /* for LANCE to free */ int TempXmitQHead; /* used in filling buffers for a single packet */ /* error statistics */ /* WARNING: As a global variable, we assume this structure is initially zero */ struct { int StatsMoreRetries; /* xmit stats */ int StatsOneRetry; int StatsDeferred; int StatsXmitBuf; int StatsUnderflow; int StatsLateCollision; int StatsLostCarrier; int StatsRetryError; int StatsBabble; /* general stats */ int StatsCollision; int StatsMissedPkt; int StatsMemoryError; int StatsFlushedLANCEInt; int StatsIntQOverflow; int StatsFramingErr; /* receive stats */ int StatsOverflow; int StatsCRCError; int StatsRecvBuf; } Stats; InitBlockStruct InitBlockCopy; etherCBStruct etherCBCopy; diagCBStruct diagCBCopy; RecvMsgDesc RecvDescCopy; XmitMsgDesc XmitDescCopy; /* erreurs retournees par les differents timeouts */ Error TO_ErrXmit; Error TO_ErrInit; Error TO_ErrCmd; #define PRIOR 20 /* etat d'activation des differents entrees sorties */ D 13 #ifdef REVB unsigned int D_Cpt_Xmit; /* nombre ES lancees */ unsigned int F_Cpt_Xmit; /* nombre ES recues */ #endif /* REVB */ E 13 unsigned int D_Cpt_Init; /* nombre init demande */ unsigned int F_Cpt_Init; /* nombre init recu */ unsigned int D_Cpt_Cmd; /* nombre commandes envoyees */ unsigned int F_Cpt_Cmd; /* nombre commandes recues */ D 13 Boolean Etat_Lance; /* etat lance */ E 13 int WBDevice; /* I/O address of WonderBoard */ int WBLength; int WBOffset; int IOMapAddr; int IORAMAddr; /*******************************/ /* MACROS */ /*******************************/ /* WARNING: This macro must be invoked with the parameter "string" in parentheses */ #ifdef DEBUG #define DebugPrint(flag,string) if (xebug & flag) debug2 string #else #define DebugPrint(flag,string) /* nop */ #endif /* DEBUG */ /* WARNING: This macro must be invoked with the parameter "string" in parentheses */ #ifdef DEBUG #define TracePrint(flag,string) if (trace & flag) debug2 string #else #define TracePrint(flag,string) /* nop */ #endif /* DEBUG */ #ifdef DEBUG #define doWBWriteRegsCmd \ WriteWBCommand(EWriteRegsCmd); \ DebugPrint(DebugWBCommands,("WriteRegsCmd\n")) #define doWBWriteReg0Cmd \ WriteWBCommand(EWriteReg0Cmd); \ DebugPrint(DebugWBCommands,("WriteReg0Cmd\n")) #define doWBReadAddrCmd \ WriteWBCommand(EReadAddrCmd); \ DebugPrint(DebugWBCommands,("ReadAddrCmd\n")) #define doWBDmdXmitCmd \ WriteWBCommand(EDemandXmitCmd); \ DebugPrint(DebugWBCommands,("DemandXmitCmd\n")) #define doWBEnLANCECmd \ WriteWBCommand(EEnLANCECmd); \ DebugPrint(DebugWBCommands,("EnableLANCECmd\n")) #define doWBDisLANCECmd \ WriteWBCommand(EDisLANCECmd); \ DebugPrint(DebugWBCommands,("DisableLANCECmd\n")) #define doWBEnEtherCmd \ WriteWBCommand(EEnEtherCmd); \ DebugPrint(DebugWBCommands,("EnableEtherCmd\n")) #define doWBDisEtherCmd \ WriteWBCommand(EDisEtherCmd); \ DebugPrint(DebugWBCommands,("DisableEtherCmd\n")) #else #define doWBWriteRegsCmd WriteWBCommand(EWriteRegsCmd) #define doWBWriteReg0Cmd WriteWBCommand(EWriteReg0Cmd) #define doWBReadAddrCmd WriteWBCommand(EReadAddrCmd) #define doWBDmdXmitCmd WriteWBCommand(EDemandXmitCmd) #define doWBEnLANCECmd WriteWBCommand(EEnLANCECmd) #define doWBDisLANCECmd WriteWBCommand(EDisLANCECmd) #define doWBEnEtherCmd WriteWBCommand(EEnEtherCmd) #define doWBDisEtherCmd WriteWBCommand(EDisEtherCmd) #endif /* DEBUG */ #define OffsetFunc(structure,element) \ (((u_char *) &structure.element) - ((u_char *) &structure)) /* WARNING: The caller is expected to verify IOData is a u_char */ #define WBWriteHi(IOAddr,IOData) \ WBWrite(IOAddr + 1, IOData << ByteShiftCount) #define WBWriteLo(IOAddr,IOData) \ WBWrite(IOAddr + BHE - 1, IOData & LoByteMask) #define ReadXmitFlags(BufNum) \ (void) WBRead(IORAMAddr + etherXmitRing + (BufNum * RingDescSize) + \ OffsetFunc(XmitDescCopy, EXmitHalfWord[1]), \ &(XmitDescCopy.EXmitHalfWord[1])) #define WriteRecvFlags(BufNum) \ (void) WBWriteHi(IORAMAddr + etherRecvRing + (BufNum * RingDescSize) + \ OffsetFunc(RecvDescCopy, ERecvMsgStruct.ERecvFlags), \ RecvDescCopy.ERecvMsgStruct.ERecvFlags) #define WriteXmitFlags(BufNum) \ (void) WBWriteHi(IORAMAddr + etherXmitRing + (BufNum * RingDescSize) + \ OffsetFunc(XmitDescCopy, EXmitMsgStruct.EXmitFlags), \ XmitDescCopy.EXmitMsgStruct.EXmitFlags) #define WriteXmitByteCnt(BufNum) \ (void) WBWrite(IORAMAddr + etherXmitRing + (BufNum * RingDescSize) + \ OffsetFunc(XmitDescCopy, EXmitMsgStruct.EXmitBuffByteCnt), \ XmitDescCopy.EXmitMsgStruct.EXmitBuffByteCnt) #define ReadIntQHead \ (void) WBRead(IORAMAddr + etherCB + OffsetFunc(etherCBCopy, EIntHead), \ &(etherCBCopy.EIntHead)) #define ReadIntQTail \ (void) WBRead(IORAMAddr + etherCB + OffsetFunc(etherCBCopy, EIntTail), \ &(etherCBCopy.EIntTail)) #define IncrIntQHead \ (etherCBCopy.EIntHead = (etherCBCopy.EIntHead == LANCEQEnd ? \ LANCEQBegin : etherCBCopy.EIntHead + IntQEntrySize)) #define WriteIntQHead \ (void) WBWrite(IORAMAddr + etherCB + OffsetFunc(etherCBCopy, EIntHead), \ etherCBCopy.EIntHead) #define IncrRecvQPtr(QPtr) \ QPtr = (QPtr < RecvNumBufs - 1 ? ++QPtr : 0) #define IncrXmitQPtr(QPtr) \ QPtr = (QPtr < XmitNumBufs - 1 ? ++QPtr : 0) #define ReleaseRecvBuf(BufNum) \ { \ /* RecvDescCopy.ERecvMsgStruct.ERecvMsgByteCnt = 0; */ \ RecvDescCopy.ERecvMsgStruct.ERecvFlags = DefaultRecvFlags; \ WriteRecvFlags(BufNum); \ } int SwapBits(statusByte) register unsigned statusByte; { return (((statusByte & 0x01) << 7) + ((statusByte & 0x02) << 5) + ((statusByte & 0x04) << 3) + ((statusByte & 0x08) << 1) + ((statusByte & 0x10) >> 1) + ((statusByte & 0x20) >> 3) + ((statusByte & 0x40) >> 5) + ((statusByte & 0x80) >> 7)); } /* end SwapBits */ /* * Make the interface available if it exists, by filling in the network * interface record and initializing the hardware. The system will initialize * the interface when it is ready to accept packets. */ wbetattach() { register struct ifnet *ifp = &es.ac_if; struct sockaddr_in *sin; Error err; short protection; /* protection d'une sequence */ I 14 #ifdef DEBUG /* go into kdb to allow changing of trace flags */ printf("trace (@%x) = %x; xebug (@%x) = %x\n", &trace, trace, &xebug, xebug); call_debug(); #endif DEBUG E 14 protection=spl7(); TracePrint((TraceNet | TraceProcs), ("wbetattach\n")); ifp->if_unit = 0; ifp->if_name = "wb"; D 13 ifp->if_mtu = ETHERMTU; /* ethernet max transission unit */ E 13 I 13 ifp->if_mtu = ETHERMTU; /* ethernet max transmission unit */ E 13 sin = (struct sockaddr_in *)&es.ac_if.if_addr; sin->sin_family = AF_INET; /* get my arpanet address, NOT implemented */ sin->sin_addr = arpmyaddr((struct arpcom *) 0); ifp->if_init = wbetinit; ifp->if_ioctl = wbetioctl; ifp->if_output = wbetoutput; ifp->if_reset = wbetreset; ifp->if_flags |= (IFF_NOTRAILERS + IFF_BROADCAST); /* Initialize WB stuff */ ipintrqFull = FALSE; D 13 #ifdef REVB XmitPending = FALSE; #endif /* REVB */ E 13 /* direct WonderBoard interrupts to us */ err = GetWonderBoard(); if (err != ErOK) { if (err != ErNoWonderBoard) printf("network interface down\n"); WBDriverInited = FALSE; splx(protection); return; } /* * Allocate buffers from the heap, fix the buffers in memory, and * translate virual addresses of buffers to real addresses. */ err = AllocDescRings(); if (err != ErOK) { printf("network interface down\n"); WBDriverInited = FALSE; disableWBInterrupts(); D 13 Etat_Lance = FALSE; E 13 splx(protection); return; } /* * Write the real memory addresses of the transmit and receive buffers to the * descriptor rings in shared memory. Tell the LANCE to initialize */ err = WB_Init(); if (err != ErOK) { printf("network interface down\n"); WBDriverInited = FALSE; disableWBInterrupts(); D 13 Etat_Lance = FALSE; E 13 splx(protection); return; } /* Add interface to ifnet */ if_attach(ifp); printf("ethernet initialized\n"); splx(protection); } /* end wbetattach */ /* * Initialize the interface */ wbetinit() { register struct ifnet *ifp = &es.ac_if; register struct sockaddr_in *sin; short protection; /* protection d'une sequence */ D 13 protection = spl7(); E 13 I 13 protection = spl7(); E 13 TracePrint((TraceNet | TraceProcs), ("wbetinit\n")); sin = (struct sockaddr_in *)&ifp->if_addr; /* If the address is still unknown then return */ if (sin->sin_addr.s_addr == 0) { D 13 splx(protection); return; } E 13 I 13 splx(protection); return; } E 13 /* set interface to ready only if ethernet is present */ if (!WBDriverInited) { es.ac_if.if_flags &= ~(IFF_UP|IFF_RUNNING); D 13 splx(protection); E 13 I 13 splx(protection); E 13 return; } D 13 E 13 I 13 E 13 if ((es.ac_if.if_flags & IFF_RUNNING) == 0) es.ac_if.if_flags |= IFF_UP|IFF_RUNNING; /* add interface to routing tables */ if_rtinit(&es.ac_if, RTF_UP); /* attach interface to address resolution protocol */ arpattach(&es); arpwhohas(&es, &sin->sin_addr); splx(protection); } /* end wbetinit */ /* * Process an ioctl request. */ wbetioctl(ifp, cmd, data) register struct ifnet *ifp; int cmd; caddr_t data; { register struct ifreq *ifr = (struct ifreq *)data; Error err = ErOK; short protection; /* protection d'une sequence */ D 13 protection = spl7(); E 13 TracePrint(TraceProcs, ("wbetioctl\n")); if (!WBDriverInited) return(Erbaddevice); I 13 protection = spl7(); E 13 switch (cmd) { case SIOCSIFADDR: if (ifp->if_flags & IFF_RUNNING) if_rtinit(ifp, -1); /* delete previous route */ wbsetaddr(ifp, (struct sockaddr_in *)&ifr->ifr_addr); wbetinit(); break; case SIOCGIFADDR: bcopy((caddr_t)&ifp->if_addr, (caddr_t)&ifr->ifr_addr, sizeof(struct sockaddr)); break; default: err = EINVAL; } splx(protection); return (err); } /* end wbetioctl */ wbsetaddr(ifp, sin) register struct ifnet *ifp; register struct sockaddr_in *sin; { ifp->if_addr = *(struct sockaddr *)sin; ifp->if_net = in_netof(sin->sin_addr); ifp->if_host[0] = in_lnaof(sin->sin_addr); sin = (struct sockaddr_in *)&ifp->if_broadaddr; sin->sin_family = AF_INET; sin->sin_addr = if_makeaddr(ifp->if_net, INADDR_ANY); ifp->if_flags |= IFF_BROADCAST; } /* end wbsetaddr */ /* * Receive data is probably available. Due to the way receive interrupts are * processed, we may have an interrupt for data we've already processed, so * there may not always be data available when we expect it. */ Error wbetread() { Halfword Etype; struct mbuf *m; register struct ifqueue *inq; NodeAddressType Dest; NodeAddressType Source; Error err = ErOK; if (!WBDriverInited) { err = Erbaddevice; return(err); } while ((!ipintrqFull) && (err = WB_Read(&Source, &Dest, &Etype)) != ErNoData) { if (err != ErOK) { TracePrint(TraceAll, ("error in read = %x\n", err)); es.ac_if.if_ierrors++; wbetreset(); return(err); } D 13 if (tcpipopen) E 13 I 13 /* * If the tcpip device is not open, discard the packet since * there is nobody listening. */ if (!tcpipOpen) E 13 { D 13 /* il faut liberer la trame */ E 13 while (WBLength > 0) { WBLength -= BufferSize; ReleaseRecvBuf(RecvQHead); IncrRecvQPtr(RecvQHead); } WBLength = 0; return(ErOK); } es.ac_if.if_ipackets++; /* check for trailer protocol, & make sure it's valid */ if (Etype >= ETHERPUP_TRAIL && Etype < ETHERPUP_TRAIL + ETHERPUP_NTRAILER) { int trailerOffset; int trailerLength; struct mbuf *mtemp; trailerOffset = ((int)Etype - ETHERPUP_TRAIL) * 512; if (trailerOffset > ETHERMTU) { #ifdef DEBUG if (trace & TraceAll) { TracePrint(TraceAll, ("ns: wbetread, dropping packet: trailer error: EType = %x\n", Etype)); dumpWBFrame(RecvBufs[RecvQHead], "Reading", MIN(RecvDescCopy.ERecvMsgStruct.ERecvMsgByteCnt, BufferSize)); } #endif /* DEBUG */ es.ac_if.if_ierrors++; return(err); } /* Discard the ethernet header and copy the data into mbufs. */ WBOffset += sizeof(struct ether_header); WBLength -= (sizeof(struct ether_header) + EtherFCSSize); m = copyLANCEBufToMbuf(); if (m == 0) { goto nomorembuf; } /* Copy the trailer into new mbufs, then get the packet */ /* type and length of the trailer from the new copy. */ mtemp = m_copy(m, trailerOffset, M_COPYALL); Etype = *(mtod(mtemp,Halfword *)); mtemp->m_off += sizeof(Etype); mtemp->m_len -= sizeof(Etype); trailerLength = *(mtod(mtemp,Halfword *)); mtemp->m_off += sizeof(Halfword); mtemp->m_len -= sizeof(Halfword); /* Delete the trailer from the end of the mbufs and */ /* concatenate the new mbuf with the trailer with the */ /* older mbufs with the data. */ m_adj(m, -trailerLength); m_cat(mtemp,m); m = mtemp; goto doippacket; } switch (Etype) { case ETHERPUP_IPTYPE: /* Discard the ethernet header and copy the data into mbufs. */ WBOffset += sizeof(struct ether_header); WBLength -= (sizeof(struct ether_header) + EtherFCSSize); m = copyLANCEBufToMbuf(); if (m == 0) { goto nomorembuf; } doippacket: /* queue IP type packets for IP to process later */ DebugPrint(DebugWBProcs, ("wbetread: IP packet read, mbuf = %x\n", m)); inq = &ipintrq; if (IF_QFULL(inq)) { TracePrint(TraceAll, ("ipintrq full\n")); ipintrqFull = TRUE; IF_DROP(inq); m_freem(m); } else { D 13 TracePrint(TraceAll, ("mise en queue TCP_IP\n")); E 13 IF_ENQUEUE(inq,m); wakeup(wbetopen); } break; case ETHERPUP_ARPTYPE: /* ARP packets are handled by that protocol */ /* Put the data into mbufs. Strip the ether header */ WBOffset += sizeof(struct ether_header); WBLength -= (sizeof(struct ether_header) + EtherFCSSize); m = copyLANCEBufToMbuf(); if (m == 0) { goto nomorembuf; } DebugPrint(DebugWBProcs, ("wbetread: ARP packet read, mbuf = %x\n", m)); D 13 TracePrint(TraceAll, ("traitement ARP\n")); E 13 arpinput(&es, m); break; default: D 2 E 2 I 2 D 13 /* * If there is a place for this unknown (raw) packet, save it */ E 13 I 13 /* * If there is a place for this unknown (raw) packet, * save it */ E 13 if (!rawbuffer()) D 13 { E 13 I 13 { E 13 m = copyLANCEBufToMbuf(); if (m == 0) D 13 { E 13 I 13 { E 13 goto nomorembuf; D 13 } rawinput(m); E 13 } I 13 rawinput(m); } E 13 else D 13 { E 2 /* delete packet */ TracePrint(TraceAll, ("wbetread: illegal packet Etype = %x\n" , Etype)); E 13 I 13 { /* delete packet */ D 14 TracePrint(TraceAll, ("wbetread: illegal packet Etype = %x\n", E 14 I 14 TracePrint(TraceBadType, ("wbetread: illegal packet Etype = %x\n", E 14 Etype)); E 13 #ifdef DEBUG D 13 if (trace & TraceAll) dumpWBFrame(RecvBufs[RecvQHead], "Reading", MIN(RecvDescCopy.ERecvMsgStruct.ERecvMsgByteCnt, BufferSize)); E 13 I 13 D 14 if (trace & TraceAll) E 14 I 14 if (trace & TraceBadType) E 14 dumpWBFrame(RecvBufs[RecvQHead], "Reading", MIN(RecvDescCopy.ERecvMsgStruct.ERecvMsgByteCnt, BufferSize)); E 13 #endif /* DEBUG */ D 13 while (WBLength > 0) { WBLength -= BufferSize; ReleaseRecvBuf(RecvQHead); IncrRecvQPtr(RecvQHead); E 13 I 13 while (WBLength > 0) { WBLength -= BufferSize; ReleaseRecvBuf(RecvQHead); IncrRecvQPtr(RecvQHead); } WBLength = 0; E 13 } D 13 WBLength = 0; I 2 } E 13 E 2 break; D 2 E 2 } } I 13 E 13 nomorembuf: ipintrqFull = FALSE; WBLength = 0; WBOffset = 0; return(ErOK); } /* end wbetread */ /* D 13 * Interrupt from LANCE . E 13 I 13 * Interrupt from LANCE. E 13 */ wbetintr(dev,IOIR) D 13 int dev; /* pour normaliser l'interface */ int IOIR; E 13 I 13 int dev; /* pour normaliser l'interface */ int IOIR; E 13 { u_short status; u_short completeStatus = 0; Error err; D 13 ReadIntQHead; ReadIntQTail; E 13 I 13 TracePrint(TraceProcs, ("wbetintr: IOIR = %x\n", IOIR)); ReadIntQHead; ReadIntQTail; E 13 D 13 while (etherCBCopy.EIntHead != etherCBCopy.EIntTail) { (void) WBRead(IORAMAddr + etherCBCopy.EIntHead, &status); completeStatus |= status; E 13 I 13 while (etherCBCopy.EIntHead != etherCBCopy.EIntTail) { (void) WBRead(IORAMAddr + etherCBCopy.EIntHead, &status); completeStatus |= status; E 13 #ifdef DEBUG D 13 if ((status & CSR0_InterruptBits) == 0) { /* * Wonderboard says the LANCE interrupted, but the status * from the LANCE contradicts this. */ DebugPrint((DebugWBInterrupts | DebugWBStats), ("wbetintr: receive unknown interrupt, CSR0 = %x\n", status)); } #endif /* DEBUG */ if (status & CSR0_ErrorFlag) { DebugPrint((DebugWBInterrupts | DebugErrorMsgs | DebugWBStats), ("wbetintr: LANCE Error on Interrupt, CSR0 = %x\n", status)); err = LANCEError(status); if (err != ErOK) { IncrIntQHead; WriteIntQHead; return(err); } } IncrIntQHead; WriteIntQHead; ReadIntQTail; } if (completeStatus & CSR0_RecvInterrupt) E 13 I 13 if ((status & CSR0_InterruptBits) == 0) E 13 { D 13 DebugPrint(DebugWBInterrupts, ("wbetintr: LANCE Receive Interrupt, CSR0 = %x\n", status)); err = wbetread(); if (err != ErOK) return(err); E 13 I 13 /* * Wonderboard says the LANCE interrupted, but the status * from the LANCE contradicts this. */ DebugPrint((DebugWBInterrupts | DebugWBStats), ("wbetintr: receive unknown interrupt, CSR0 = %x\n", status)); E 13 } D 13 if (completeStatus & CSR0_XmitInterrupt) E 13 I 13 #endif /* DEBUG */ if (status & CSR0_ErrorFlag) E 13 { D 13 DebugPrint(DebugWBInterrupts, ("wbetintr: LANCE Xmit Interrupt, CSR0 = %x\n", status)); err = packetXmitted(); E 13 I 13 DebugPrint((DebugWBInterrupts | DebugErrorMsgs | DebugWBStats), ("wbetintr: LANCE Error on Interrupt, CSR0 = %x\n", status)); err = LANCEError(status); E 13 if (err != ErOK) I 13 { IncrIntQHead; WriteIntQHead; E 13 return(err); D 13 #ifdef REVB if (Etat_Lance) { F_Cpt_Xmit++; } #endif /* REVB */ E 13 I 13 } E 13 } I 13 IncrIntQHead; WriteIntQHead; ReadIntQTail; } if (completeStatus & CSR0_RecvInterrupt) { DebugPrint(DebugWBInterrupts, ("wbetintr: LANCE Receive Interrupt, CSR0 = %x\n", status)); err = wbetread(); if (err != ErOK) return(err); } if (completeStatus & CSR0_XmitInterrupt) { DebugPrint(DebugWBInterrupts, ("wbetintr: LANCE Xmit Interrupt, CSR0 = %x\n", status)); err = packetXmitted(); if (err != ErOK) return(err); } E 13 D 13 if (completeStatus & CSR0_InitDone) E 13 I 13 if (completeStatus & CSR0_InitDone) { if (WBDriverInited) E 13 { D 13 if (Etat_Lance) { DebugPrint((DebugWBInterrupts | DebugWBInit), E 13 I 13 DebugPrint((DebugWBInterrupts | DebugWBInit), E 13 ("wbetintr: LANCE Init Done Interrupt, CSR0 = %x\n", status)); D 13 InitPending = FALSE; F_Cpt_Init++; wakeup(InitStartCmds); } E 13 I 13 D 14 InitPending = FALSE; E 14 F_Cpt_Init++; I 14 DebugPrint(DebugWBTimer, ("Init wakeup (wbintr); D_Cpt_Init = %x, F_Cpt_Init = %x\n", D_Cpt_Init, F_Cpt_Init)); E 14 wakeup(InitStartCmds); E 13 } D 13 return(ErOK); E 13 I 13 } return(ErOK); E 13 } /* end wbetintr */ D 13 #ifdef REVB XmitTimeout(indice) int indice; { short protection; /* protection d'une sequence */ protection = spl7(); if (Etat_Lance) if (F_Cpt_Xmit == indice) { /* timeout; transmit attempt failed; reinitialize LANCE */ DebugPrint(DebugAll, ("wbetintr: timeout waiting for packet to be transmitted\n")); XmitPending = FALSE; wbetreset(); TO_ErrXmit = (ErXmitErrorRevB); } splx(protection); } /* end XmitTimeout */ #endif /* REVB */ E 13 /* * Encapsulate a packet for output on the local net. Create the ethernet * header as necessary for the packet type specified in the destination D 14 * structure. If the packet is addresses to us (either specifically or E 14 I 14 * structure. If the packet is addressed to us (either specifically or E 14 * through a broadcast), then loop it back on the loopback device. */ wbetoutput(ifp, m0, dst) struct ifnet *ifp; struct mbuf *m0; struct sockaddr *dst; { int type = 0; Error err = ErOK; u_char edst[6]; struct in_addr idst; register struct mbuf *m = m0; register struct ether_header *ec; register int off; struct mbuf *mcopy = (struct mbuf *)0; int tempQPtr; int offset; D 13 short protection; /* protection d'une sequence */ E 13 I 13 short protection; /* protection d'une sequence */ E 13 TracePrint(TraceProcs, ("wbetoutput\n")); if (!WBDriverInited) return(Erbaddevice); protection = spl7(); switch (dst->sa_family) { #ifdef INET case AF_INET: idst = ((struct sockaddr_in *)dst)->sin_addr; if (!arpresolve(&es, m, &idst, edst)) I 13 { splx(protection); E 13 return(ErOK); /* if not yet resolved */ I 13 } E 13 if (in_lnaof(idst) == INADDR_ANY) mcopy = m_copy(m, 0, (int)M_COPYALL); off = ntohs((u_short)mtod(m, struct ip *)->ip_len) - m->m_len; /* need per host negociation */ if ((ifp->if_flags & IFF_NOTRAILERS) == 0) if (off > 0 && (off & 0x1ff) == 0 && m->m_off >= MMINOFF + 2 * sizeof(u_short)) { type = ETHERPUP_TRAIL + (off>>9); m->m_off -= 2 * sizeof(u_short); m->m_len += 2 * sizeof(u_short); *mtod(m, u_short *) = ntohs((u_short)ETHERPUP_IPTYPE); *(mtod(m, u_short *) + 1) = ntohs((u_short)m->m_len); goto gottrailertype; } type = ETHERPUP_IPTYPE; goto gottype; #endif /* INET */ case AF_IMPLINK: /* * Copy the data as well as the ether header from the mbuf chain * to the LANCE transmit buffers. This uses an offset of zero. * The copy may fail if there are no free LANCE transmit buffers * within a reasonable length of time. */ err = copyMbufToLANCEBuf(m, 0); if (err != ErOK) goto bad; /* * Update the head of the xmit queue to be the first buffer of the * newly formed packet */ IncrXmitQPtr(XmitQHead); ec = (struct ether_header *) (XmitBufs[XmitQHead]); goto gotheader; case AF_UNSPEC: ec = (struct ether_header *)dst->sa_data; bcopy((caddr_t)ec->ether_dhost, (caddr_t)edst, sizeof(edst)); type = ec->ether_type; goto gottype; default: printf("wbet%x: can't handle af%x\n", ifp->if_unit, dst->sa_family); err = EAFNOSUPPORT; goto bad; } gottrailertype: /* * Packet to be sent as trailer: move first packet * (control information) to end of chain. */ while (m->m_next) m = m->m_next; m->m_next = m0; m = m0->m_next; m0->m_next = 0; m0 = m; gottype: /* * Copy the data from the mbuf chain to the LANCE transmit buffers. * The copy may fail if there are no free LANCE transmit buffers within * a reasonable length of time. Add the local net header. */ offset = sizeof(struct ether_header); /* copy the data to the output buffers */ err = copyMbufToLANCEBuf(m, offset); if (err != ErOK) goto bad; /* * Update the head of the xmit queue to be the first buffer of the * newly formed packet */ IncrXmitQPtr(XmitQHead); /* prepare to add ether header (destination addr, source addr & type field) */ ec = (struct ether_header *) (XmitBufs[XmitQHead]); /* copy the destination address to the output buffer */ bcopy((caddr_t)edst, (caddr_t)ec->ether_dhost, sizeof(edst)); /* copy the type field to the output buffer */ ec->ether_type = htons((u_short)type); gotheader: /* * copy the source address to the output buffer. Note that for * packet filter packets, the destination address and type fields * have already been filled in, so we only need copy the source * address field. */ bcopy((caddr_t)es.ac_enaddr, (caddr_t)ec->ether_shost, sizeof(es.ac_enaddr)); D 13 #ifdef REVB /* Remember to whom we sent the last packet */ bcopy((caddr_t)(XmitBufs[XmitQHead]), (caddr_t) &lastDestinationAddr, sizeof(lastDestinationAddr)); E 13 /* D 13 * Do not release the next transmit packet to the LANCE if it still has * the previous packet. */ while (XmitPending) { timeout(wakeup,wbetoutput,1); sleep(wbetoutput,PRIOR); } /* * No transmit packets are outstanding, so it's okay to queue one for the * LANCE. Set a watchdog timer to make sure the transmit completes. */ if (TO_ErrXmit != ErOK) { splx(protection); return(TO_ErrXmit); } XmitPending = TRUE; TO_ErrXmit = ErOK; timeout(XmitTimeout,D_Cpt_Xmit++,TimeoutXmit); #endif /* REVB */ /* E 13 * Set the XmitOwn bits in buffers of the current packet, starting with * the last buffer in the packet. This gives the buffers to the LANCE. * Doing the first buffer in the packet last makes sure that the LANCE * has all of the buffers for the packet before it tries to transmit, * since it only looks ahead one buffer. Update the XmitQueue * pointers and issue a demand transmit command to the LANCE. */ tempQPtr = TempXmitQHead; while (tempQPtr != XmitQHead) { ReadXmitFlags(tempQPtr); XmitDescCopy.EXmitMsgStruct.EXmitFlags |= XmitOwn; WriteXmitFlags(tempQPtr); tempQPtr = (tempQPtr == 0 ? XmitNumBufs - 1 : --tempQPtr); } ReadXmitFlags(tempQPtr); XmitDescCopy.EXmitMsgStruct.EXmitFlags |= XmitOwn; WriteXmitFlags(tempQPtr); #ifdef DEBUG if (trace & TraceFrames) { dumpWBFrame(XmitBufs[XmitQHead], "Writing", (-(XmitDescCopy.EXmitMsgStruct.EXmitBuffByteCnt)) & 0XFFFF); } #endif /* DEBUG */ XmitQHead = TempXmitQHead; D 14 SleepOK = FALSE; D 13 TracePrint(TraceAll, ("lancement d'une sortie \n")); E 13 (void) doWBDmdXmitCmd; E 14 DebugPrint(DebugWBProcs, ("wbetoutput: output queued\n")); es.ac_if.if_opackets++; m0 = m; bad: m_freem(m0); if (err != ErOK) { TracePrint(TraceAll,("error in write = %d\n", err)); wbetreset(); I 13 es.ac_if.if_oerrors++; E 13 } splx(protection); return(mcopy ? looutput(&loif, mcopy, dst) : err); } /* end wbetoutput */ /* * Reset interface. */ wbetreset() { Error err; short protection; /* protection d'une sequence */ TracePrint(TraceProcs, ("wbetreset\n")); printf("resetting interface\n"); if (!WBDriverInited) return; protection=spl7(); /* Reinitialize the LANCE */ D 13 #ifdef REVB XmitPending = FALSE; #endif /* REVB */ E 13 err = WB_Init(); if (err != ErOK) RemoveWBInterface(); splx(protection); return; } /* end wbetreset */ /* * Shutdown all ethernet operations on the wonderboard. This is called from panic(). */ wbshutdown() { TracePrint((TraceNet | TraceProcs), ("wbshutdown\n")); /* Stop the LANCE */ etherCBCopy.EWriteData.EReg0 = CSR0_InterruptEnable + CSR0_StopCmd; (void) WBWrite(IORAMAddr + etherCB + OffsetFunc(etherCBCopy, EWriteData.EReg0), etherCBCopy.EWriteData.EReg0); SleepOK = FALSE; (void) doWBWriteReg0Cmd; printf("LANCE has been stopped\n"); disableWBInterrupts(); D 13 Etat_Lance = FALSE; E 13 I 13 WBDriverInited = FALSE; E 13 return; } /* end wbshutdown */ /* * Remove access to the interface by setting the IFF_DOWN flag. * Called when irrecoverable errors are detected. Do not try to * reinitialize the interface. Some form of operator invervention * is required. We stop the LANCE so it will no longer interract on * the network, and then disable interrupts from the ethernet portions * of the board, to improve system performance and simplify the * driver. */ RemoveWBInterface() { struct ifnet *ifp = &es.ac_if; es.ac_if.if_flags &= ~(IFF_UP|IFF_RUNNING); D 13 WBDriverInited = FALSE; E 13 printf("removing interface\n"); /* Stop the LANCE */ etherCBCopy.EWriteData.EReg0 = CSR0_InterruptEnable + CSR0_StopCmd; (void) WBWrite(IORAMAddr + etherCB + OffsetFunc(etherCBCopy, EWriteData.EReg0), etherCBCopy.EWriteData.EReg0); SleepOK = FALSE; (void) doWBWriteReg0Cmd; printf("LANCE has been stopped\n"); disableWBInterrupts(); D 13 Etat_Lance = FALSE; E 13 I 13 WBDriverInited = FALSE; E 13 } /* end RemoveWBInterface */ /* * Copy the number of bytes specified in WBLength from LANCE receive buffers * (offset by WBOffset) to mbufs. Assumes that that number of bytes exist * in LANCE receive buffers, and that the caller has verified the ownership * of the buffers and validity of the data. */ struct mbuf * copyLANCEBufToMbuf() { struct mbuf *m = 0; struct mbuf *front = 0; /* points to beginning of mbuf */ /* chain to be returned */ struct mbuf **lastPtr = &front; /* used in linking previous buffer */ /* to current buffer; contains addr */ /* of previous buff's m_next field */ int lengthCopied; int minimum; while (WBLength > 0 ) { /* * Get another mbuf if there is no current mbuf or the current mbuf * or bigbuf is full. Restore the offset in the current mbuf to the * beginning of the data. Initially set the new mbuf to be empty. */ if ((m == 0) || (m->m_off == MMAXOFF) || (m->m_len == MBIGSIZE)) { if (m != 0) m->m_off -= m->m_len; m = m_get(M_WAIT, MT_DATA); if (m == 0) goto nobuf; m->m_len = 0; /* * If the length to copy is larger than will fit into one mbuf, then * allocate a big buffer and set the mbuf to reference it. */ if (WBLength > MLEN) { struct mbuf *big = 0; MCLGET(big,1); if (big == 0) goto nobuf; m->m_off = (int) big - (int) m; } /* * Add the mbuf to the list. Note that on the first pass, this updates * front due to the way lastPtr is initialized. */ *lastPtr = m; lastPtr = &m->m_next; } /* get the next LANCE receive buffer if the current one is empty */ if (WBOffset == BufferSize) { ReleaseRecvBuf(RecvQHead); IncrRecvQPtr(RecvQHead); WBOffset = 0; } if (m->m_off > MMAXOFF) lengthCopied = MIN(MBIGSIZE - m->m_len, MIN(WBLength, (BufferSize - WBOffset))); else lengthCopied = MIN(MLEN - m->m_len, MIN(WBLength, (BufferSize - WBOffset))); /* copy the data (from, to, length) */ bcopy((u_char *) RecvBufs[RecvQHead] + WBOffset, mtod(m, caddr_t), lengthCopied); /* update the lengths */ WBLength -= lengthCopied; m->m_len += lengthCopied; WBOffset += lengthCopied; m->m_off += lengthCopied; } /* while */ /* Restore the offset into the mbuf to the beginning of the data */ m->m_off -= m->m_len; I 13 /* * If the ethernet FCS overflows into the next buffer, then release * the current buffer, and then fall through to release the next * buffer (with the FCS). */ if ((WBOffset + EtherFCSSize) > BufferSize) { ReleaseRecvBuf(RecvQHead); IncrRecvQPtr(RecvQHead); } E 13 /* * The last receive buffer in the packet was exhausted, so release * it and update the Q head. */ ReleaseRecvBuf(RecvQHead); IncrRecvQPtr(RecvQHead); /* return the mbuf chain */ return(front); I 13 E 13 nobuf: D 13 /* liberation chaine des mbufs */ E 13 I 13 /* release the chain of mbufs */ E 13 m_freem(front); D 13 /* liberation du bout de buffer restant */ E 13 I 13 /* release the receive buffers for the packet */ E 13 minimum = MIN(WBLength , BufferSize - WBOffset); if (minimum == WBLength) { ReleaseRecvBuf(RecvQHead); IncrRecvQPtr(RecvQHead); } else { WBLength -= minimum; ReleaseRecvBuf(RecvQHead); IncrRecvQPtr(RecvQHead); while (WBLength > 0) { ReleaseRecvBuf(RecvQHead); IncrRecvQPtr(RecvQHead); WBLength -= BufferSize; } } WBLength = 0; return ((struct mbuf *) NULL); } /* end copyLANCEBufToMbuf */ /* * Copy data from mbuf(s) to LANCE transmit buffer(s). Assumes that the mbuf * total length is within the maximum frame size for ethernet. Also, assumes * that the offset specified by the caller is less than BufferSize (ie, is * within the first LANCE transmit buffer). The head of the transmit queue * is not updated, nor are the buffers given to the LANCE, so the caller can * fill in the header. The caller is expected to update these. */ Error copyMbufToLANCEBuf(m, offset          ! " # $) struct mbuf *m; int offset; { int length; int totalLength; int mbufOffset = 0; /* offset in addition to m->m_off */ Error err; D 13 #if defined(REVB) | defined(CHAIN) int bufsize; /* capacity of current buffer */ #endif /* REVB | CHAIN */ E 13 TempXmitQHead = XmitQHead; IncrXmitQPtr(TempXmitQHead); err = GetXmitBuf(); if (err != ErOK) return(err); D 13 #if defined(REVB) | defined(CHAIN) /* * Small buffers start on BufferSize boundaries, each small buffer being * followed by a large buffer. A small buffer, large buffer pair is * exactly BufferSize. */ if ((XmitDescCopy.EXmitMsgStruct.EXmitBuffAddrLo & (BufferSize - 1)) == 0) bufsize = SmallBufSize; else bufsize = BufferSize - SmallBufSize; #endif /* REVB | CHAIN */ E 13 totalLength = offset; XmitDescCopy.EXmitMsgStruct.EXmitFlags = DefaultXmitFlags | StartXmitPacket; while (m != 0) { /* get the next mbuf if the current one is empty */ if (m->m_len == 0) { m = m->m_next; mbufOffset = 0; continue; } /* go to the next LANCE xmit buffer if the current one is full */ D 13 #if defined(REVB) | defined(CHAIN) while (offset >= bufsize) { XmitDescCopy.EXmitMsgStruct.EXmitBuffByteCnt = (u_short)(-bufsize); WriteXmitByteCnt(TempXmitQHead); WriteXmitFlags(TempXmitQHead); offset -= bufsize; IncrXmitQPtr(TempXmitQHead); err = GetXmitBuf(); if (err != ErOK) return(err); /* * Small buffers start on BufferSize boundaries, each small buffer being * followed by a large buffer. A small buffer, large buffer pair is * exactly BufferSize. */ if ((XmitDescCopy.EXmitMsgStruct.EXmitBuffAddrLo & (BufferSize - 1)) == 0) bufsize = SmallBufSize; else bufsize = BufferSize - SmallBufSize; XmitDescCopy.EXmitMsgStruct.EXmitFlags = DefaultXmitFlags; } #else E 13 while (offset >= BufferSize) { XmitDescCopy.EXmitMsgStruct.EXmitBuffByteCnt = DefaultByteCnt; WriteXmitByteCnt(TempXmitQHead); WriteXmitFlags(TempXmitQHead); offset -= BufferSize; IncrXmitQPtr(TempXmitQHead); err = GetXmitBuf(); if (err != ErOK) return(err); XmitDescCopy.EXmitMsgStruct.EXmitFlags = DefaultXmitFlags; } D 13 #endif /* REVB | CHAIN */ E 13 /* copy from mbuf to LANCE buffer */ D 13 #if defined(REVB) | defined(CHAIN) length = MIN(m->m_len, bufsize - offset); #else E 13 length = MIN(m->m_len, BufferSize - offset); D 13 #endif /* REVB | CHAIN */ E 13 bcopy(mtod(m, caddr_t) + mbufOffset, ((u_char *) XmitBufs[TempXmitQHead]) + offset, length); /* update lengths and offsets */ offset += length; totalLength += length; m->m_len -= length; mbufOffset += length; } /* while */ /* * If the total data length of the packet is less than the minimum frame * size, we must pad it out to meet the ethernet spec. The receiver * is expected to use the byte count from a higher level protocol in * order to discard the padding. Note that we know that a packet of * minimum size fits in one buffer since transmit buffers have a * minimum size of 100 bytes, and the minimum packet is 46 bytes of * data + 14 bytes of ethernet header, or 60 bytes (not including the * CRC which we do not include in the buffer). */ if (totalLength < (MinFrameData + sizeof(struct ether_header))) { offset = (MinFrameData + sizeof(struct ether_header)); D 13 #if defined(REVB) | defined(CHAIN) while (offset > bufsize) { XmitDescCopy.EXmitMsgStruct.EXmitBuffByteCnt = (u_short)(-bufsize); WriteXmitByteCnt(TempXmitQHead); WriteXmitFlags(TempXmitQHead); offset -= bufsize; IncrXmitQPtr(TempXmitQHead); err = GetXmitBuf(); if (err != ErOK) return(err); /* * Small buffers start on BufferSize boundaries, each small buffer being * followed by a large buffer. A small buffer, large buffer pair is * exactly BufferSize. */ if ((XmitDescCopy.EXmitMsgStruct.EXmitBuffAddrLo & (BufferSize - 1)) == 0) bufsize = SmallBufSize; else bufsize = BufferSize - SmallBufSize; XmitDescCopy.EXmitMsgStruct.EXmitFlags = DefaultXmitFlags; } #endif /* REVB | CHAIN */ E 13 } XmitDescCopy.EXmitMsgStruct.EXmitFlags |= EndXmitPacket; XmitDescCopy.EXmitMsgStruct.EXmitBuffByteCnt = -offset; WriteXmitByteCnt(TempXmitQHead); WriteXmitFlags(TempXmitQHead); return(ErOK); } /* end copyMbufToLANCEBuf */ #ifdef DEBUG /* * Print the ethernet header, length of frame and read/write. * Also print the beginning of the data area */ dumpWBFrame(frame, mode, length) FrameType *frame; char mode[]; int length; { #define BytesPerLine 16 int i; int j; int newline; int printLen; char *rawframe = (char *) frame; D 13 printf("%s frame. Length: %x\n", mode, length); printf(" EthernetHeader:\n"); printLen = MIN(length, sizeof(struct ether_header)); for (i = 0; i < printLen; i += BytesPerLine) { newline = MIN(printLen, i + BytesPerLine); for (j = i; j < newline; j++) printf("%x ",rawframe[j]); printf("\n"); } E 13 I 13 printf("%s frame. Length: %x\n", mode, length); printf(" EthernetHeader:\n"); printLen = MIN(length, sizeof(struct ether_header)); for (i = 0; i < printLen; i += BytesPerLine) { newline = MIN(printLen, i + BytesPerLine); for (j = i; j < newline; j++) printf("%x ",rawframe[j]); printf("\n"); } E 13 D 13 i = printLen; printLen = MIN(length, 100); printf (" Data:\n"); for (; i < printLen; i += BytesPerLine) { newline = MIN(printLen, i + BytesPerLine); for (j = i; j < newline; j++) printf("%x ", frame->FileData[j]); printf("\n"); } E 13 I 13 i = printLen; printLen = MIN(length, 100); printf (" Data:\n"); for (; i < printLen; i += BytesPerLine) { newline = MIN(printLen, i + BytesPerLine); for (j = i; j < newline; j++) printf("%x ", frame->FileData[j]); printf("\n"); } E 13 } /* end dumpWBFrame */ #endif /* DEBUG */ /* D 13 * in the interrupt queue in shared RAM as well. Keep track of how many * interrupts are discarded. Note that the entries in shared RAM are a more * accurate measure of this than the interrupt messages on the ridge. E 13 I 13 * Flush all entries from the interrupt queue in shared RAM. E 13 */ FlushLANCEInterruptQ() { ReadIntQTail; D 13 while (etherCBCopy.EIntHead != etherCBCopy.EIntTail) E 13 I 13 if (etherCBCopy.EIntHead != etherCBCopy.EIntTail) E 13 { D 13 IncrIntQHead; Stats.StatsFlushedLANCEInt++; DebugPrint(DebugWBInterrupts, ("WBStats: flushed interrupt: LANCEInterruptQ\n")); E 13 I 13 etherCBCopy.EIntHead = etherCBCopy.EIntTail; DebugPrint(DebugWBInterrupts, ("WBStats: flushed interrupt(s): LANCEInterruptQ\n")); E 13 } WriteIntQHead; } /* end FlushLANCEInterruptQ */ /* * Disable all interrupts from the wonderboard. This is done only during * attempted error recovery from serious errors, so ignore any errors which * occur */ disableWBInterrupts() { SleepOK = FALSE; (void) doWBDisLANCECmd; SleepOK = FALSE; (void) doWBDisEtherCmd; FlushLANCEInterruptQ; return; } /* end disableWBInterrupts */ /* * We got a packet transmitted interrupt. Release any buffers from complete * packets which have been transmitted. An error is returned only if we needed * to reset the LANCE or shut down the LANCE. */ Error packetXmitted() { int QPtr; u_short xmit1; /* accumulate flags from all buffers in packet */ u_short xmit2; /* accumulate flags2 from all buffers in packet */ int endQPtr; QPtr = XmitQTail; ReadXmitDesc(QPtr); xmit1 = xmit2 = 0; endQPtr = XmitQHead; IncrXmitQPtr(endQPtr); while ((QPtr != endQPtr) && ((XmitDescCopy.EXmitMsgStruct.EXmitFlags & XmitOwn) == RidgeOwned)) { /* The transmit queue is not empty, and the LANCE has released a buffer */ D 13 #ifdef REVB if (((XmitDescCopy.EXmitMsgStruct.EXmitFlags & (StartXmitPacket + XmitError)) == (StartXmitPacket + XmitError)) && ((XmitDescCopy.EXmitMsgStruct.EXmitFlags2 & (LostCarrier + RetryError)) != 0)) { TracePrint(TraceAll, ("Rev B xmit error (flags = %X, flags2 = %X)\n", XmitDescCopy.EXmitMsgStruct.EXmitFlags, XmitDescCopy.EXmitMsgStruct.EXmitFlags2)); wbetreset(); return(ErXmitErrorRevB); } #endif /* REVB */ E 13 xmit1 |= XmitDescCopy.EXmitMsgStruct.EXmitFlags; xmit2 |= XmitDescCopy.EXmitMsgStruct.EXmitFlags2; /* * Update error statistics and XmitQTail only when we reach the end of packet * or when an irrecoverable error occurs which causes the LANCE to shut down * the transmitter. In the latter case, the LANCE will not complete processing * of the buffer chain until it has been restarted, so we must process the * error as we encounter it. No harm is done by treating this as an end of * packet condition. */ if ((XmitDescCopy.EXmitMsgStruct.EXmitFlags & EndXmitPacket) || (XmitDescCopy.EXmitMsgStruct.EXmitFlags2 & (RetryError | Underflow))) { /* * Keep track of any errors which occurred. Note that the errors * may be indicated in any of the transmit buffers of the chain. * However, they may only be included in the error statistics * when we reach an end of packet, otherwise they'd be counted twice. */ if (xmit1 & XmitStatsMask) { if (xmit1 & MoreRetries) { Stats.StatsMoreRetries++; DebugPrint(DebugWBStats, ("WBStats: xmit more retries\n")); } /* * The LANCE has a bug where the one retry flag gets set erroneously * when a late collision error occurs. Do not count that error. */ if ((xmit1 & OneRetry) && !(xmit2 & LateCollision)) { Stats.StatsOneRetry++; DebugPrint(DebugWBStats, ("WBStats: xmit one retry\n")); } if (xmit1 & Deferred) { Stats.StatsDeferred++; DebugPrint(DebugWBStats, ("WBStats: xmit deferred\n")); } if (xmit1 & XmitError) { if (xmit2 & XmitBufferError) { Stats.StatsXmitBuf++; DebugPrint(DebugWBStats, ("WBStats: xmit buffer error\n")); } if (xmit2 & LateCollision) { Stats.StatsLateCollision++; DebugPrint(DebugWBStats, ("WBStats: xmit late collision\n")); } if (xmit2 & LostCarrier) { Stats.StatsLostCarrier++; DebugPrint(DebugWBStats, ("WBStats: xmit lost carrier\n")); } if (xmit2 & RetryError) { /* * LANCE turned off transmitter. Restart the LANCE, * releasing the transmit buffer, so the same error * will not be processed again erroneously. */ Stats.StatsRetryError++; D 14 printf("excessive retries on transmission, TDR value = %d\n", E 14 I 14 printf("excessive retries on transmission, TDR value = %x\n", E 14 XmitDescCopy.EXmitMsgStruct.EXmitFlags2 & TDRMask); wbetreset(); XmitQTail = QPtr; IncrXmitQPtr(XmitQTail); return(ErLANCERetryError); } if (xmit2 & Underflow) { /* * LANCE turned off transmitter. Restart the LANCE, * releasing the transmit buffer, so the same error * will not be processed again erroneously. */ Stats.StatsUnderflow++; TracePrint(TraceAll, ("transmitter underflow\n")); wbetreset(); XmitQTail = QPtr; IncrXmitQPtr(XmitQTail); return(ErXmitUnderflow); } } } D 13 #ifdef REVB TO_ErrXmit = ErOK; XmitPending = FALSE; #endif /* REVB */ E 13 XmitQTail = QPtr; IncrXmitQPtr(XmitQTail); xmit1 = xmit2 = 0; } IncrXmitQPtr(QPtr); ReadXmitDesc(QPtr); } /* while */ return(ErOK); } /* end packetXmitted */ /* * The LANCE reported an error condition. The wonderboard microcode has * cleared the error for us, so we need only keep track of the error for * network statistics, and institute any necessary error recovery. An error * is returned if we had to reset or shut down the LANCE. */ Error LANCEError(CSR0) unsigned CSR0; { if (CSR0 & CSR0_Babble) { Stats.StatsBabble++; DebugPrint(DebugWBStats, ("WBStats: CSR0 babble\n")); } if (CSR0 & CSR0_CollisionError) { Stats.StatsCollision++; DebugPrint(DebugWBStats, ("WBStats: CSR0 collision\n")); I 13 es.ac_if.if_collisions++; E 13 } if (CSR0 & CSR0_MissedPacket) { Stats.StatsMissedPkt++; DebugPrint(DebugWBStats, ("WBStats: CSR0 missed packet\n")); D 13 #ifdef REVB TracePrint(TraceAll, ("Rev B: missed packet\n")); wbetreset(); return(ErXmitErrorRevB); #endif /* REVB */ E 13 } if (CSR0 & CSR0_MemoryError) { /* LANCE turned off xmitter & receiver; catastrophic error */ Stats.StatsMemoryError++; DebugPrint(DebugWBStats, ("WBStats: memory error; CSR0 = %x\n", CSR0)); TracePrint(TraceAll,("memory error; LANCE restarted\n")); wbetreset(); return(ErLANCEMemErr); } return(ErOK); } /* end LANCEError */ /*************************************/ /* WonderBoard interface routines */ /*************************************/ /* * Read from the wonderboard. We will always read into a halfword data * area since the high order half word is normally not relevant. Callers * who need the entire word read should call d_read, and do any necessary * error processing themselves. */ Error WBRead(IOAddr, IOData) u_short *IOData; unsigned IOAddr; { register Error err; int iodata; /* * Do an d_read, masking the result to just the low order halfword. * Check the status which comes back on the read */ err = d_read(IOAddr,&iodata); *IOData = (short)(iodata & 0xffff); #ifdef DEBUG D 14 DebugPrint(DebugWBIO, ("Reading: IOAddr = %x; IOData = %x; err = %d\n", E 14 I 14 DebugPrint(DebugWBIO, ("Reading: IOAddr = %x; IOData = %x; err = %x\n", E 14 IOAddr, *IOData, err)); #endif /* DEBUG */ switch(err) { case 0: return(ErOK); case 1: err = ErIODataNotValid; break; case 2: err = ErIOTimeOut; break; case 3: err = ErIOTmOAndDNV; break; default: err = ErUnknownError; break; } printf("Reading from CIO: IOAddr = %x; error = ", IOAddr); WBWriteIOErr(err); printf("\n"); return(err); } /* end WBRead */ /* * Write to the wonderboard. Usually, the caller will write only a halfword, * as writes to the shared RAM require the high order halfword to be zero. * Writes to the mapping RAM use the entire word, so this routine supports * word writes. */ Error WBWrite(IOAddr, IOData) unsigned IOData; unsigned IOAddr; { D 13 register Error err; /* Assume r11 on ridge */ E 13 I 13 register Error err; E 13 /* Do an IOWrite, checking the status which comes back */ err = d_write(IOAddr, IOData); D 14 #ifdef DEBUG if ((xebug & DebugWBIO) && (trace & TraceLog)) DebugPrint(DebugWBIO, ("Writing: IOAddr = %x; IOData = %x; err = %d\n", IOAddr, IOData, err)); #endif /* DEBUG */ E 14 I 14 DebugPrint(DebugWBIO, ("Writing: IOAddr = %x; IOData = %x; err = %x\n", IOAddr, IOData, err)); E 14 switch(err) { case 0: return(ErOK); case 1: err = ErIODataNotValid; break; case 2: err = ErIOTimeOut; break; case 3: err = ErIOTmOAndDNV; break; default: err = ErUnknownError; break; } printf("Writing to CIO: IOAddr = %x; IOData = %x; error = ", IOAddr, IOData); WBWriteIOErr(err); printf("\n"); return(err); } /* end WBWrite */ /* * Write some text describing the I/O error. */ WBWriteIOErr(err) int err; { switch(err) { case ErIOTimeOut: printf("IO time out"); break; case ErIODataNotValid: printf("IO data not valid"); break; case ErIOTmOAndDNV: printf("IO time out and IO data not valid"); break; D 14 default: printf("unknown error: %d", err); E 14 I 14 default: printf("unknown error: %x", err); E 14 } } /* end WBWriteIOErr */ /* * Write a command to the wonderboard, waiting for the response to * indicate command completion and the availability of any data read */ Error WriteWBCommand(command) u_char command; { Error err; short protection; /* * Make sure the last command completed, and that there were no errors since * then (eg, interrupt queue overflow). */ /* WARNING: This code reads both EError & ECommand, which must both be zero */ err = WBRead(IORAMAddr + etherCB + OffsetFunc(etherCBCopy, EError), ðerCBCopy.EError); if (err != ErOK) return(err); if ((etherCBCopy.EError != 0) || (etherCBCopy.ECommand != 0)) { /* * We can still issue the command on a wonderboard interrupt queue * overflow error, but other errors require error recovery. */ if (etherCBCopy.EError == EIntOvflErr) { TracePrint(TraceAll, ("Interrupt Q overflow; command = %x, err = %x\n", etherCBCopy.ECommand, etherCBCopy.EError)); etherCBCopy.EError = 0; (void) WBWriteHi(IORAMAddr + etherCB + OffsetFunc(etherCBCopy, EError), etherCBCopy.EError); Stats.StatsIntQOverflow++; } else return(bad_Write()); } protection = spl7(); D 13 D_Cpt_Cmd += 1; if (SleepOK) E 13 I 13 if (SleepOK) I 14 { DebugPrint(DebugWBTimer, ("Command timer set; D_Cpt_Cmd = %x, F_Cpt_Cmd = %x\n", D_Cpt_Cmd, F_Cpt_Cmd)); E 14 E 13 timeout(CmdTimeout,D_Cpt_Cmd,TimeoutWriteWB); I 14 } E 14 D 13 TO_ErrCmd = ErOK; (void) WBWriteLo(IORAMAddr+etherCB+OffsetFunc(etherCBCopy,ECommand), command); if (SleepOK) E 13 I 13 D_Cpt_Cmd += 1; TO_ErrCmd = ErOK; (void) WBWriteLo(IORAMAddr+etherCB+OffsetFunc(etherCBCopy,ECommand), command); if (SleepOK) I 14 { DebugPrint(DebugWBTimer, ("sleeping..WriteWBCmd; D_Cpt_Cmd = %x, F_Cpt_Cmd = %x\n", D_Cpt_Cmd, F_Cpt_Cmd)); E 14 E 13 sleep(WriteWBCommand,PRIOR); I 14 } E 14 splx(protection); D 13 return(TO_ErrCmd); E 13 I 13 return(TO_ErrCmd); E 13 } /* end WriteWBCommand */ /* interruption venant du controleur Ethernet */ wbetctrl(dev,IOIR) D 13 int dev; /* pour normaliser l'interface */ int IOIR; E 13 I 13 int dev; /* pour normaliser l'interface */ int IOIR; E 13 { D 13 /* process interrupt */ /* * WARNING: This code reads both EError & ECommand, * which must both be zero */ if (Etat_Lance) { F_Cpt_Cmd++; TO_ErrCmd = WBRead(IORAMAddr+etherCB+OffsetFunc(etherCBCopy, EError), ðerCBCopy.EError); if (TO_ErrCmd == ErOK) if ((etherCBCopy.ECommand == 0) && (etherCBCopy.EError == 0)) { /* command completed without error */ TO_ErrCmd = ErOK; } else TO_ErrCmd = bad_Write(); wakeup(WriteWBCommand); } E 13 I 13 /* process interrupt */ /* * WARNING: This code reads both EError & ECommand, * which must both be zero */ if (WBDriverInited) { F_Cpt_Cmd++; TO_ErrCmd = WBRead(IORAMAddr+etherCB+OffsetFunc(etherCBCopy, EError), ðerCBCopy.EError); if (TO_ErrCmd == ErOK) if ((etherCBCopy.ECommand == 0) && (etherCBCopy.EError == 0)) { /* command completed without error */ TO_ErrCmd = ErOK; } else TO_ErrCmd = bad_Write(); I 14 DebugPrint(DebugWBTimer, ("Cmd wakeup (wbctrl); D_Cpt_Cmd = %x, F_Cpt_Cmd = %x\n", D_Cpt_Cmd, F_Cpt_Cmd)); E 14 wakeup(WriteWBCommand); } E 13 } /* wbetctrl */ CmdTimeout(indice) D 13 int indice; E 13 I 13 int indice; E 13 { D 13 short protection; /* protection de la sequence */ E 13 I 13 short protection; /* protection de la sequence */ E 13 D 13 /* timeout sur une commande au controleur ethernet */ E 13 I 13 /* timeout sur une commande au controleur ethernet */ E 13 D 13 protection = spl7(); if (Etat_Lance) if (indice == F_Cpt_Cmd) { F_Cpt_Cmd++; TO_ErrCmd = ErTimeout; wakeup(WriteWBCommand); } splx(protection); E 13 I 13 protection = spl7(); I 14 DebugPrint(DebugWBTimer, ("Command timeout; D_Cpt_Cmd = %x, F_Cpt_Cmd = %x\n", D_Cpt_Cmd, F_Cpt_Cmd)); E 14 if (WBDriverInited) if (indice == F_Cpt_Cmd) { F_Cpt_Cmd++; TO_ErrCmd = ErTimeout; I 14 DebugPrint(DebugWBTimer, ("Cmd wakeup (timeout); D_Cpt_Cmd = %x, F_Cpt_Cmd = %x\n", D_Cpt_Cmd, F_Cpt_Cmd)); E 14 wakeup(WriteWBCommand); } splx(protection); E 13 } /* CmdTimeout */ Error bad_Write() { /* error on command */ switch (etherCBCopy.EError) { case EBadCmdErr: D 14 printf("bad command = %d, err = %d\n", E 14 I 14 printf("bad command = %d, err = %x\n", E 14 etherCBCopy.ECommand, etherCBCopy.EError); etherCBCopy.EError = 0; (void) WBWriteHi(IORAMAddr + etherCB + OffsetFunc(etherCBCopy, EError), etherCBCopy.EError); return(EBadCmdErr + ErEtherCtrl); case EIntOvflErr: TracePrint(TraceAll, ("Interrupt Q overflow; command = %x, err = %x\n", etherCBCopy.ECommand, etherCBCopy.EError)); etherCBCopy.EError = 0; (void) WBWriteHi(IORAMAddr + etherCB + OffsetFunc(etherCBCopy, EError), etherCBCopy.EError); Stats.StatsIntQOverflow++; return(ErOK); case ECheckSumErr: D 14 printf("bad checksum in address PAL; command = %d, err = %d\n", E 14 I 14 printf("bad checksum in address PAL; command = %x, err = %x\n", E 14 etherCBCopy.ECommand, etherCBCopy.EError); etherCBCopy.EError = 0; (void) WBWriteHi(IORAMAddr + etherCB + OffsetFunc(etherCBCopy, EError), etherCBCopy.EError); return(ECheckSumErr + ErEtherCtrl); default: I 7 /* E 7 D 3 printf("invalid error or command returned; cmd = %d, err = %d\n", etherCBCopy.ECommand, etherCBCopy.EError); E 3 I 3 D 14 TracePrint(TraceAll,("invalid error or command returned; cmd = %d, err = %d\n", E 14 I 14 TracePrint(TraceAll,("invalid error or command returned; cmd = %x, err = %x\n", E 14 etherCBCopy.ECommand, etherCBCopy.EError)); I 7 */ D 14 printf("invalid error or command returned; cmd = %d, err = %d\n", E 14 I 14 printf("invalid error or command returned; cmd = %x, err = %x\n", E 14 etherCBCopy.ECommand, etherCBCopy.EError); E 7 E 3 etherCBCopy.EError = 0; (void) WBWriteHi(IORAMAddr + etherCB + OffsetFunc(etherCBCopy, EError), etherCBCopy.EError); return(EInvalidError + ErEtherCtrl); } /* switch */ } /* end bad_Write */ #ifdef DEBUG /* * Dump the descriptors elements */ DumpDesc() { int iloc; u_short *IOAddr, *RidgeAddr; RidgeAddr = (u_short *) &Anneau[0]; IOAddr = (u_short *) (IORAMAddr + etherRecvRing); for (iloc=0; iloc<128; iloc++) (void) WBRead(IOAddr++,RidgeAddr++); IOAddr = (u_short *) (IORAMAddr + etherXmitRing); for (iloc=0; iloc<128; iloc++) (void) WBRead(IOAddr++,RidgeAddr++); } #endif /* DEBUG */ /* * Read the specified receive descriptor element */ ReadRecvDesc(BufNum) int BufNum; { register u_short *IOAddr; register u_short *RidgeAddr; IOAddr = (u_short *) (IORAMAddr + etherRecvRing + (BufNum * RingDescSize)); RidgeAddr = RecvDescCopy.ERecvHalfWord; (void) WBRead(IOAddr++, RidgeAddr++); (void) WBRead(IOAddr++, RidgeAddr++); (void) WBRead(IOAddr++, RidgeAddr++); (void) WBRead(IOAddr, RidgeAddr); return; } /* end ReadRecvDesc */ /* * Write the specified receive descriptor element. Assumes the caller * has verified proper ownership of the buffer */ Error WriteRecvDesc(BufNum) int BufNum; { int i; Error err = ErOK; for (i = 0; i < RingDescSize/2; i++) { err |= WBWrite(IORAMAddr + etherRecvRing + (BufNum * RingDescSize) + (i * 2), RecvDescCopy.ERecvHalfWord[i]); } if (err != ErOK) err = ErWriteError; return(err); } /* end WriteRecvDesc */ /* * Read the specified transmit descriptor element */ ReadXmitDesc(BufNum) int BufNum; { register u_short *IOAddr; register u_short *RidgeAddr; IOAddr = (u_short *) (IORAMAddr + etherXmitRing + (BufNum * RingDescSize)); RidgeAddr = XmitDescCopy.EXmitHalfWord; (void) WBRead(IOAddr++, RidgeAddr++); (void) WBRead(IOAddr++, RidgeAddr++); (void) WBRead(IOAddr++, RidgeAddr++); (void) WBRead(IOAddr, RidgeAddr); return; } /* end ReadXmitDesc */ /* * Write the specified transmit descriptor element. Assumes the caller * has verified proper ownership of the buffer */ Error WriteXmitDesc(BufNum) int BufNum; { int i; Error err = ErOK; for (i = 0; i < RingDescSize/2; i++) { err |= WBWrite(IORAMAddr + etherXmitRing + (BufNum * RingDescSize) + (i * 2), XmitDescCopy.EXmitHalfWord[i]); } if (err != ErOK) err = ErWriteError; return(err); } /* end WriteXmitDesc */ /* * Verify that the device specified on the command line is indeed D 13 * a wonderboard device and attempt to acquire the LANCE device * and 8086 Ethernet command channel device, attaching these devices * to their interrupt queues. E 13 I 13 * a wonderboard device. E 13 */ Error GetWonderBoard() { #define DeviceNumShiftCnt 24 #define BoardTypeShiftCnt 24 #define WonderBoardType 0X40 #define AltWonderBoardType 0X41 unsigned Reply; Error err; if ((WBDevice = ctladdr(CIODEBUG,0))== -1) WBDevice = ctladdr(CIODEBUG,4); /* type ctrl ethernet */ /* Verify that the board is a wonderboard */ if ((d_read((WBDevice << DeviceNumShiftCnt), &Reply) == ErOK) && (((Reply >> BoardTypeShiftCnt) == WonderBoardType) || ((Reply >> BoardTypeShiftCnt) == AltWonderBoardType))) { TracePrint(TraceNet, ("WonderBoard ethernet present, device # = %x\n", WBDevice)); WBPresent = TRUE; } else { TracePrint(TraceNet, ("hardware at address %x is not a CIO board\n", WBDevice)); WBPresent = FALSE; return(ErNoWonderBoard); } IORAMAddr = WBDevice << DeviceNumShiftCnt; IOMapAddr = IORAMAddr + MemMapFlag; /* * Read the revision codes for the board. If they are incompatible with * the current revision of software, an error will be returned. */ err = ReadRevCodes(); if (err != ErOK) return(err); WBDriverInited = TRUE; D 13 Etat_Lance = TRUE; E 13 return(err); } /* end GetWonderBoard */ /* * Allocate the transmit and receive buffers, fix them in memory, and * translate their addresses to real addresses for use by wonderboard. * Any errors are returned to the caller for error processing. * * WARNING: * * This code assumes that an integral number of buffers fit exactly in * one page. Buffers do not span pages, so pages need not be contiguous. */ Error AllocDescRings() { int i,j; /* * Allocate the receive buffers; fix each page in memory, * translate its virtual address to its real address, and * save the virtual and real addresses for each buffer in the * page. */ for (i = 0; i < RecvNumBufs; i += BufsPerPage) { RecvBufs[i] = sptalloc(1 , PG_V | PG_KR , 0); RealRecvBufs[i] = svtophys(RecvBufs[i]); for (j=1; j = < ; : 9 8 7 6 5 4 3 2 1 0 / . - , + * ) ( ' & % $ # " ! nitBlock */ /* * Write our copy of the initialization control block to the shared memory * on the wonderboard */ Error WriteInitBlock() { #define maxIndex sizeof(InitBlockStruct) int i; unsigned IOAddr; unsigned IOData; Error err = ErOK; IOAddr = IORAMAddr + etherInitBlock; DebugPrint(DebugWBInit, ("Writing Init Block\n")); for (i = 0; i < maxIndex; i += IOSize, IOAddr += IOSize) { IOData = *((u_short *) (((char *)(&InitBlockCopy)) + i)); err |= WBWrite(IOAddr, IOData); } if (err != ErOK) { printf("could not write initialization block\n"); err = ErWriteError; } return(err); } /* end WriteInitBlock */ /* * Write out the transmit and receive descriptor rings into shared memory * for use by wonderboard */ Error InitDescRings() { int i; int BufferNum = 0; Error err = ErOK; /* * Initialize each recv buffer descriptor in the local copy, writing * each one to the wonderboard and initializing its mapping RAM entry. * These buffers are given to the LANCE, so we can not write in these * descriptors until data is received into the buffers and the LANCE * returns the buffers and their descriptors to us. */ RecvDescCopy.ERecvMsgStruct.ERecvFlags = DefaultRecvFlags; RecvDescCopy.ERecvMsgStruct.ERecvBuffByteCnt = DefaultByteCnt; RecvDescCopy.ERecvMsgStruct.ERecvMsgByteCnt = 0; DebugPrint(DebugWBInit, ("Writing Recv Desc Ring\n")); for (i = 0; i < RecvNumBufs; i++) { RecvDescCopy.ERecvMsgStruct.ERecvBuffAddrLo = ((RealRecvBufs[i]) & AddrLoMask) + WonderRidgeFlag; RecvDescCopy.ERecvMsgStruct.ERecvBuffAddrHi = SwapBits(BufferNum); err |= WBWrite(IOMapAddr + BufferNum, (RealRecvBufs[i]) & AddrHiMask); err |= WriteRecvDesc(BufferNum); BufferNum++; } if (err != ErOK) { printf("could not write recv descriptor ring\n"); return(ErWriteError); } /* * Initialize each xmit buffer descriptor in the local copy, writing * each one to the wonderboard and initializing its mapping RAM entry. * These buffers are kept by the driver until we are ready to transmit. */ XmitDescCopy.EXmitMsgStruct.EXmitFlags = DefaultXmitFlags; XmitDescCopy.EXmitMsgStruct.EXmitBuffByteCnt = DefaultByteCnt; XmitDescCopy.EXmitMsgStruct.EXmitFlags2 = DefaultXmitFlags2; DebugPrint(DebugWBInit, ("Writing Xmit Desc Ring\n")); for (i = 0; i < XmitNumBufs; i++) { XmitDescCopy.EXmitMsgStruct.EXmitBuffAddrLo = ((RealXmitBufs[i]) & AddrLoMask) + WonderRidgeFlag; XmitDescCopy.EXmitMsgStruct.EXmitBuffAddrHi = SwapBits(BufferNum); err |= WBWrite(IOMapAddr + BufferNum, (RealXmitBufs[i]) & AddrHiMask); err |= WriteXmitDesc(BufferNum - RecvNumBufs); BufferNum++; } if (err != ErOK) { printf("could not write xmit descriptor ring\n"); err = ErWriteError; } /* initialize local queue pointers to indicate the queues are empty */ RecvQHead = 0; XmitQTail = 0; XmitQHead = TempXmitQHead = XmitNumBufs - 1; return(err); } /* end InitDescRings */ /* * Initialize the copies of the CSRs, and write them to shared RAM. Issue * init and start commands */ Error InitStartCmds() { int i; Error err = ErOK; short protection; /* D 14 * Remember we are issuing an init command, so we can wait afterwards for * the Init Done interrupt. Write out the CSRs, issuing the init command. E 14 I 14 * Write out the CSRs, issuing the init command. E 14 */ D 14 InitPending = TRUE; E 14 etherCBCopy.EWriteData.EReg0 = InitCSR0; etherCBCopy.EWriteData.EReg1 = etherInitBlock & CSR1Mask; etherCBCopy.EWriteData.EReg2 = (etherInitBlock >> HalfWordShiftCnt) & CSR2Mask; etherCBCopy.EWriteData.EReg3 = DefaultCSR3; DebugPrint(DebugWBInit, ("Writing CSRs\n")); protection = spl7(); for (i = 0; i < sizeof(regStruct); i += IOSize) { err |= WBWrite(IORAMAddr + etherCB + OffsetFunc(etherCBCopy, EWriteData.EReg0) + i, *((u_short *) (((char *) (ðerCBCopy.EWriteData.EReg0)) + i))); } if (err != ErOK) { printf("could not write LANCE registers\n"); err = ErWriteError; splx(protection); return(err); } SleepOK = TRUE; err = doWBWriteRegsCmd; if (err != ErOK) { printf("could not write LANCE registers; err = %d\n", err); splx(protection); return(err); } /* * Wait for the Init Done interrupt. */ D 14 TO_ErrInit = 0; timeout(StartTimeout,D_Cpt_Init++,TimeoutInit); if (D_Cpt_Init != F_Cpt_Init) /* sinon IT deja arrivee */ sleep(InitStartCmds,PRIOR); E 14 I 14 TO_ErrInit = 0; DebugPrint(DebugWBTimer, ("Init timer set; D_Cpt_Init = %x, F_Cpt_Init = %x\n", D_Cpt_Init, F_Cpt_Init)); timeout(StartTimeout,D_Cpt_Init++,TimeoutInit); if (D_Cpt_Init != F_Cpt_Init) /* sinon IT deja arrivee */ { DebugPrint(DebugWBTimer, ("sleeping..InitStartCmds; D_Cpt_Init = %x, F_Cpt_Init = %x\n", D_Cpt_Init, F_Cpt_Init)); sleep(InitStartCmds,PRIOR); } E 14 splx(protection); err = TO_ErrInit; if (err != ErOK) { printf("error waiting for Init Done interrupt, err = %d\n", err); return(err); } /* * Issue the start command. */ etherCBCopy.EWriteData.EReg0 = StartCSR0; DebugPrint(DebugWBInit, ("Issuing Start command in CSR0\n")); err = WBWrite(IORAMAddr + etherCB + OffsetFunc(etherCBCopy, EWriteData.EReg0), D 14 (ðerCBCopy.EWriteData.EReg0)); E 14 I 14 (etherCBCopy.EWriteData.EReg0)); E 14 if (err == ErOK) { SleepOK = TRUE; err = doWBWriteReg0Cmd; } if (err != ErOK) { printf("could not write start command in CSR0; err = %d\n", err); } return(err); } /* end InitStartCmds */ /* timeout sur initstartcommande */ StartTimeout(indice) int indice; { D 13 short protection; /* protection de la sequence */ E 13 I 13 short protection; /* protection de la sequence */ E 13 D 13 protection = spl7(); if (Etat_Lance) if (indice == F_Cpt_Init) { TO_ErrInit = ErTimeout; F_Cpt_Init++; wakeup(InitStartCmds); } splx(protection); E 13 I 13 protection = spl7(); I 14 DebugPrint(DebugWBTimer, ("Init timeout; D_Cpt_Init = %x, F_Cpt_Init = %x\n", D_Cpt_Init, F_Cpt_Init)); E 14 if (WBDriverInited) if (indice == F_Cpt_Init) { TO_ErrInit = ErTimeout; F_Cpt_Init++; I 14 DebugPrint(DebugWBTimer, ("Init wakeup (timeout); D_Cpt_Init = %x, F_Cpt_Init = %x\n", D_Cpt_Init, F_Cpt_Init)); E 14 wakeup(InitStartCmds); } splx(protection); E 13 } /* end StartTimeout */ /* * Get ownership of the current buffer (the buffer which is the temporary head * of the transmit queue). Wait for it if the transmit queue is full. Return * status indicating whether we were able to get the buffer in a reasonable * amount of time. */ Error GetXmitBuf() { short protection; ReadXmitFlags(XmitQHead); if ((TempXmitQHead == XmitQTail) && ((XmitDescCopy.EXmitMsgStruct.EXmitFlags & XmitOwn) != RidgeOwned)) { /* transmit queue is full */ D 13 return(ErBufWaitTimeOut); E 13 I 13 printf("GetXmitBuf: ran out of xmit buffers\n"); E 13 I 13 return(ErBufWaitTimeOut); E 13 } ReadXmitDesc(TempXmitQHead); return(ErOK); } /* end GetXmitBuf */ /* * Test the validity of the current receive buffer (the buffer whose * descriptor is in our RAM copy). Return any unusual conditions. */ Error TestRecvBufValid(QPtr) int *QPtr; { #ifdef DEBUG if ((RecvDescCopy.ERecvMsgStruct.ERecvBuffAddrHi) != SwapBits(*QPtr)) { printf("Mapping RAM index (%x) for recv buffer # %x trashed\n", RecvDescCopy.ERecvMsgStruct.ERecvBuffAddrHi, SwapBits(*QPtr)); return(ErBadMappingRAM); } #endif /* DEBUG */ if ((RecvDescCopy.ERecvMsgStruct.ERecvFlags & RecvOwn) != RidgeOwned) return(ErNoData); if (RecvDescCopy.ERecvMsgStruct.ERecvFlags & RecvError) { D 14 DebugPrint(DebugWBStats, ("WBStats: error status on receive, flags = %X\n", E 14 I 14 DebugPrint(DebugWBStats, ("WBStats: error status on receive, flags = %x\n", E 14 RecvDescCopy.ERecvMsgStruct.ERecvFlags)); D 13 #ifdef REVC E 13 /* * Framing Error and CRC Error are valid only in the last buffer of * a packet. Overflow is only valid before the last buffer of a * packet. All other fields are assumed to only be set in the last * buffer of a packet, otherwise an error could be counted more * than once: once or more before the complete packet is received, * and once after. */ if ((RecvDescCopy.ERecvMsgStruct.ERecvFlags & (FramingError | EndRecvPacket)) == (FramingError | EndRecvPacket)) { Stats.StatsFramingErr++; DebugPrint(DebugWBStats, ("WBStats: recv framing error\n")); } D 13 #ifndef REVB E 13 if ((RecvDescCopy.ERecvMsgStruct.ERecvFlags & (Overflow | EndRecvPacket)) == Overflow) { Stats.StatsOverflow++; DebugPrint(DebugWBStats, ("WBStats: recv overflow\n")); } D 13 #endif /* REVB */ E 13 if ((RecvDescCopy.ERecvMsgStruct.ERecvFlags & (CRCError | EndRecvPacket)) == (CRCError | EndRecvPacket)) { Stats.StatsCRCError++; DebugPrint(DebugWBStats, ("WBStats: recv CRC error\n")); } /* * Receive buffer error occurs when the LANCE needed to chain to the * next receive buffer, but was unable to do so because it did not own * the buffer. This implies an end of packet condition, although it * is not explicitly set. Set the end of packet for the caller. */ if (RecvDescCopy.ERecvMsgStruct.ERecvFlags & RecvBufferError) { RecvDescCopy.ERecvMsgStruct.ERecvFlags |= EndRecvPacket; Stats.StatsRecvBuf++; DebugPrint(DebugWBStats, ("WBStats: recv buffer error\n")); } D 13 #ifdef REVB if (RecvDescCopy.ERecvMsgStruct.ERecvFlags & Overflow) { Stats.StatsOverflow++; TracePrint(TraceAll, ("WBStats: recv overflow\n")); TracePrint(TraceAll, ("Rev B: overflow error\n")); wbetreset(); return(ErNoData); } #endif /* REVB */ E 13 return(ErRecvError); D 13 #else /* * Assume that these fields will only be set in the last buffer of a * packet, otherwise an error could be counted more than once: once * or more before the complete packet is received, and once after. */ if (RecvDescCopy.ERecvMsgStruct.ERecvFlags & FramingError) { Stats.StatsFramingErr++; DebugPrint(DebugWBStats, ("WBStats: recv framing error\n")); } #ifndef REVB if (RecvDescCopy.ERecvMsgStruct.ERecvFlags & Overflow) { Stats.StatsOverflow++; DebugPrint(DebugWBStats, ("WBStats: recv overflow\n")); } #endif /* REVB */ if (RecvDescCopy.ERecvMsgStruct.ERecvFlags & CRCError) { Stats.StatsCRCError++; DebugPrint(DebugWBStats, ("WBStats: recv CRC error\n")); } /* * Receive buffer error occurs when the LANCE needed to chain to the * next receive buffer, but was unable to do so because it did not own * the buffer. This implies an end of packet condition, although it * is not explicitly set. Set the end of packet for the caller. */ if (RecvDescCopy.ERecvMsgStruct.ERecvFlags & RecvBufferError) { RecvDescCopy.ERecvMsgStruct.ERecvFlags |= EndRecvPacket; Stats.StatsRecvBuf++; DebugPrint(DebugWBStats, ("WBStats: recv buffer error\n")); } #ifdef REVB if (RecvDescCopy.ERecvMsgStruct.ERecvFlags & Overflow) { Stats.StatsOverflow++; TracePrint(TraceAll, ("WBStats: recv overflow\n")); TracePrint(TraceAll, ("Rev B: overflow error\n")); wbetreset(); return(ErNoData); } #endif /* REVB */ return(ErRecvError); #endif /* REVC */ E 13 } return(ErOK); } /* end TestRecvBufValid */ /* * Find the buffer which is the end of the current packet. Verify that it, * the buffer which is the start of packet, and all buffers in between are * error-free and owned by us rather than the LANCE. Note that the first * error encountered is usually the error which will be returned, even if * we continue perusing the queue for the end of packet. The queue pointer * is updated to point to the end of the packet, if any. */ Error FindRecvPktEnd(QPtr) int *QPtr; { Error err; Error newerr; int count = 0; *QPtr = RecvQHead; ReadRecvDesc(*QPtr); /* check validity of first buffer in packet */ err = TestRecvBufValid(QPtr); if (err == ErNoData) return(err); if ((RecvDescCopy.ERecvMsgStruct.ERecvFlags & StartRecvPacket) == 0) { TracePrint(TraceAll, ("No start packet on receive\n")); if (!err) err = ErBadRecvFlags; } /* * check validity of remaining buffers in packet, while finding the * last buffer in the packet */ while ((RecvDescCopy.ERecvMsgStruct.ERecvFlags & EndRecvPacket) == 0) { IncrRecvQPtr((*QPtr)); ReadRecvDesc(*QPtr); newerr = TestRecvBufValid(QPtr); if (!err) err = newerr; if (newerr == ErNoData) return(ErNoData); if (RecvDescCopy.ERecvMsgStruct.ERecvFlags & StartRecvPacket) { TracePrint(TraceAll, ("Encountered another start of packet before end of packet\n")); if (!err) err = ErBadRecvFlags; } /* * We assume that we will eventually encounter either an end of packet or * a buffer belonging to the LANCE. This is not necessarily so, e.g., * receiving data from a babbling node exhausts all of the receive buffers, * sets receive buffer error, but does not set end of packet. (We have a * special hack for this in TestRecvBufValid, but there could be other cases * which invalidate our assumption.) So, make sure we don't loop forever * reading receive buffer descriptors. Instead, reset to clear the error * and indicate there is no more data currently. This relies on the higher * level protocols to recover the data we've thrown away. */ count++; if (count >= RecvNumBufs) { printf("All receive buffers used by one packet!\n"); wbetreset(); return(ErNoData); } } /* while */ return(err); } /* end FindRecvPktEnd */ /* * Initialize the wonderboard */ Error WB_Init() { register Error err; /* Check if self test passed on the board */ WBRead(IORAMAddr + DiagCtrlBlk + OffsetFunc(diagCBCopy, DB_BdFailures), &(diagCBCopy.DB_BdFailures)); if (diagCBCopy.DB_BdFailures != ErOK) { err = (unsigned) (diagCBCopy.DB_BdFailures) + ErSelfTest; if ((err < ErUnknownSelfTestErr) #ifdef DEBUG D 13 || (trace & TraceErrors) #endif /* DEBUG */ ) E 13 I 13 || (trace & TraceErrors) #endif DEBUG ) E 13 { printf("self test error: "); switch (err) { case ErLANCERegs: printf("LANCE register test"); break; case ErLocalMemory: printf("local memory test"); break; case ErSharedMemory: printf("shared memory test"); break; case ErLANCEInit: printf("LANCE initialization test"); break; default: printf("unknown self test error"); } D 14 printf(", error = %d\n", err); E 14 I 14 printf(", error = %x\n", err); E 14 if (err < ErUnknownSelfTestErr) return(err); } } D 13 #ifdef REVB F_Cpt_Xmit = 0; /* initialisation des compteurs des */ D_Cpt_Xmit = 0; #endif /* REVB */ E 13 D_Cpt_Init = 0; F_Cpt_Init = 0; F_Cpt_Cmd = 0; D_Cpt_Cmd = 0; /* enable interrupts for the ethernet controller */ SleepOK = TRUE; err = doWBEnEtherCmd; if (err != ErOK) { printf("cannot enable CIO ethernet command interrupts %d\n", err); return(err); } /* * Reinitialize the LANCE. Issue a stop command to the LANCE to get it * into a known state. Note that CSR1 is corrupted when the stop command * is issued. Since we subsequently reinitialize it, this should not * present a problem. */ etherCBCopy.EWriteData.EReg0 = CSR0_InterruptEnable + CSR0_StopCmd; err = WBWrite(IORAMAddr + etherCB + OffsetFunc(etherCBCopy, EWriteData.EReg0), etherCBCopy.EWriteData.EReg0); if (err == ErOK) { SleepOK = TRUE; err = doWBWriteReg0Cmd; } if (err != ErOK) { printf("could not write CSR0; err = %d\n", err); return(err); } /* Enable interrupts for the LANCE */ SleepOK = TRUE; err = doWBEnLANCECmd; if (err != ErOK) { printf("cannot enable CIO LANCE interrupts %d\n", err); return(err); } err = CreateInitBlock(); if (err == ErOK) { err = WriteInitBlock(); if (err == ErOK) { err = InitDescRings(); if (err == ErOK) err = InitStartCmds(); } } return(err); } /* end WB_Init */ /* * Read receive data from Wonderboard. If any buffer in the packet has an * error, discard the packet and return the error. If a complete packet is * not available, return status indicating that no data is available. */ WB_Read(sourceAddr, destAddr, protocolID) NodeAddressType *sourceAddr; NodeAddressType *destAddr; Halfword *protocolID; { int i; int LastPktPtr; Error err; D 13 #if defined(REVB) | defined(REVC) E 13 Boolean acceptPacket; D 13 #endif /* REVB | REVC */ E 13 tryAgain: err = FindRecvPktEnd(&LastPktPtr); /* * Discard all buffers in the packet if any of them had any type of error. * If the error was recoverable, try to get the next packet. Otherwise, * return the error. */ if (err != ErOK) { if (err != ErNoData) { while (RecvQHead != LastPktPtr) { ReleaseRecvBuf(RecvQHead); IncrRecvQPtr(RecvQHead); } ReleaseRecvBuf(RecvQHead); IncrRecvQPtr(RecvQHead); } if (err == ErRecvError) goto tryAgain; return(err); } D 13 #if defined(REVB) | defined(REVC) E 13 /* * Verify that the packet is for us. Due to bugs in the Rev B LANCE parts, * we end up receiving packets which we shouldn't. Accept packets with * our physical address. Also accept broadcast packets, so long as the * last packet we transmitted was not a broadcast. * * The Rev C LANCE parts will only receive packets which are for us, but * they will occasionally insert one byte in front of the packet, thus we * must verify the address is valid. */ acceptPacket = TRUE; /* check if address is our physical address */ for (i = 0; i < AddressLen; i++) { if (*(((u_char *) RecvBufs[RecvQHead]) + i) != localAddress.a[i]) { acceptPacket = FALSE; break; } } if (!acceptPacket) { /* address did not match our physical address; check if it's a broadcast */ acceptPacket = TRUE; for (i = 0; i < AddressLen; i++) { D 13 if (*(((u_char *) RecvBufs[RecvQHead]) + i) != ethbroadcastaddr[i]) E 13 I 13 if (*(((u_char *) RecvBufs[RecvQHead]) + i) != etherbroadcastaddr[i]) E 13 { acceptPacket = FALSE; break; } } D 13 #ifdef REVB if (acceptPacket) { /* address is a broadcast; verify it's not one we just sent */ for (i = 0; i < AddressLen; i++) { if (lastDestinationAddr.a[i] != ethbroadcastaddr[i]) { acceptPacket = FALSE; break; } } acceptPacket = !acceptPacket; } #endif /* REVB */ E 13 } if (!acceptPacket) { /* discard the packet, since it's not for us */ TracePrint(TraceAll, ("WB_Read: received extraneous packet\n")); #ifdef DEBUG if (trace & TraceAll) dumpWBFrame(RecvBufs[RecvQHead], "Reading", MIN(RecvDescCopy.ERecvMsgStruct.ERecvMsgByteCnt, BufferSize)); #endif /* DEBUG */ while (RecvQHead != LastPktPtr) { ReleaseRecvBuf(RecvQHead); IncrRecvQPtr(RecvQHead); } ReleaseRecvBuf(RecvQHead); IncrRecvQPtr(RecvQHead); goto tryAgain; } D 13 #endif /* REVB | REVC */ /* read destination address, source address, and protocol ID (from,to,length) */ bcopy(((u_char *) RecvBufs[RecvQHead]), (u_char *) destAddr, sizeof(*destAddr)); bcopy(((u_char *) RecvBufs[RecvQHead] + sizeof(*destAddr)), (u_char *) sourceAddr, sizeof(*sourceAddr)); bcopy(((u_char *) RecvBufs[RecvQHead] + sizeof(*destAddr) + sizeof(*sourceAddr)), (u_char *) protocolID, sizeof(*protocolID)); WBLength = (int) RecvDescCopy.ERecvMsgStruct.ERecvMsgByteCnt; E 13 D 13 #if defined(REVB) | defined(REVC) if ((WBLength - (sizeof(struct ether_header) + EtherFCSSize)) < 0) E 13 I 13 /* Discard packets which are too short to be legal */ if ((((int) RecvDescCopy.ERecvMsgStruct.ERecvMsgByteCnt) - (sizeof(struct ether_header) + EtherFCSSize)) < 0) E 13 { D 13 /* discard the packet, since it's too short */ E 13 #ifdef DEBUG TracePrint(TraceAll, ("WB_Read: received too short packet\n")); DumpDesc(); if (trace & TraceAll) dumpWBFrame(RecvBufs[RecvQHead], "Reading", MIN(RecvDescCopy.ERecvMsgStruct.ERecvMsgByteCnt, BufferSize)); #endif /* DEBUG */ nbpkterr++; printf("%x paquets veroles\n",nbpkterr); while (RecvQHead != LastPktPtr) { ReleaseRecvBuf(RecvQHead); IncrRecvQPtr(RecvQHead); } ReleaseRecvBuf(RecvQHead); IncrRecvQPtr(RecvQHead); goto tryAgain; } D 13 #endif /* REVB | REVC */ E 13 I 13 /* read destination address, source address, and protocol ID (from,to,length) */ bcopy(((u_char *) RecvBufs[RecvQHead]), (u_char *) destAddr, sizeof(*destAddr)); bcopy(((u_char *) RecvBufs[RecvQHead] + sizeof(*destAddr)), (u_char *) sourceAddr, sizeof(*sourceAddr)); bcopy(((u_char *) RecvBufs[RecvQHead] + sizeof(*destAddr) + sizeof(*sourceAddr)), (u_char *) protocolID, sizeof(*protocolID)); WBLength = (int) RecvDescCopy.ERecvMsgStruct.ERecvMsgByteCnt; E 13 WBOffset = 0; #ifdef DEBUG if (trace & TraceFrames) dumpWBFrame(RecvBufs[RecvQHead], "Reading", MIN(WBLength, BufferSize)); #endif /* DEBUG */ return(ErOK); } /* end WB_Read */ /* fonction permettant de faire un traitement des trames recues en mode user */ /* a partir d'une interruption */ wbetopen() { struct ifqueue *ifq; u_short protection; struct mbuf *m; D 13 if (!tcpipopen) E 13 I 13 if (tcpipOpen) E 13 return; D 13 tcpipopen = FALSE; E 13 I 13 tcpipOpen = TRUE; E 13 ifq = &ipintrq; while (1) { sleep(wbetopen,PRIOR); do { protection = spl7(); IF_DEQUEUE(ifq,m); splx(protection); ipintr(m); } while (m); } } #ifdef DEBUG /*-----------------------------------*/ /* DEBUG2 */ /*-----------------------------------*/ debug2 (ptchaine,v0,v1,v2,v3,v4) char *ptchaine ; unsigned long v0 ; unsigned long v1 ; unsigned long v2 ; unsigned long v3 ; unsigned long v4 ; { register short i ; unsigned long a[8] ; unsigned long var[5] ; unsigned short car_courant; unsigned long *ptvar ; short s ; s = spl7(); var[0] = v0; var[1] = v1; var[2] = v2; var[3] = v3; var[4] = v4; ptvar = &var[0]; car_courant = ligne_courante * LG_LIGNE; if (init_debug == 0) { init_debug++; printf("adresse zone de trace du communicateur = %x\n",&texte[0]); } while (*ptchaine != '\0') { if (*ptchaine != '%') texte[car_courant++] = *(ptchaine++); else { ptchaine = ptchaine + 2; a[7] = *ptvar++ ; a[6] = a[7] >> 4 ; a[5] = a[6] >> 4 ; a[4] = a[5] >> 4 ; a[3] = a[4] >> 4 ; a[2] = a[3] >> 4 ; a[1] = a[2] >> 4 ; a[0] = a[1] >> 4 ; for (i=0;(i != 7) && (a[i] == 0);i++); for (;(i <= 7);texte[car_courant++] = ascii[a[i++] & 0xf] ); } } ligne_courante++; if (ligne_courante >= NB_LIGNES) ligne_courante = 0; car_courant = ligne_courante * LG_LIGNE; for (i=0;i < 16 ; texte[car_courant+(i++)] = '!'); for ( ;i < LG_LIGNE ; texte[car_courant+(i++)] = ' '); splx(s); return ; } #endif E 1 h37489 s 00002/00002/00306 d D 4.2 87/05/14 16:44:39 build 6 5 c removed old SCCS strings and inserted #ident BB e s 00000/00000/00308 d D 4.1 87/02/20 13:39:59 build 5 4 c rolled rev to -r4 /dc e s 00000/00000/00308 d D 3.1 87/01/19 09:30:32 build 4 3 c rolled rev to -r3 /dc e s 00000/00000/00308 d D 2.1 87/01/19 09:30:32 build 3 2 c AUTO NULL DELTA e s 00001/00000/00307 d D 1.2 87/01/16 10:26:19 build 2 1 c add ident string /dc e s 00307/00000/00000 d D 1.1 87/01/09 17:32:42 build 1 0 c Placed under source control - dc e u U f b f n t T I 2 D 6 /* "%W% %E%" */ E 2 I 1 /* "@(#)lance.h 4.2 2/28/86" */ E 6 I 6 #ident " %W% %E% " /* " lance.h 4.2 2/28/86" */ E 6 /* lance.h */ /**************************************************************/ /* Ridge WonderBoard ethernet controller & LANCE include file */ /**************************************************************/ #define StartQPage 0 #define EndQPage 7 #define IOSize 2 /* number of bytes to read/write */ /* Arbitrary timer values */ /* ?????? calculate max backoff for TimeoutXmitBuf */ #define TimeoutWriteWB 1000 /* write to WB must complete in 1000 ms */ #define TimeoutXmitBuf 5000 /* xmit buffer must be freed in 5000 ms */ #define TimeoutInit 1000 /* init command must complete in 1000 ms */ #ifdef REVB #define TimeoutXmit 500 /* xmit must complete in 500 ms */ #endif /* REVB */ /* constants for frame data types */ #define AddressLen 6 /* Ethernet address length */ #define LogicalAddrLen 8 /* # of bytes for multicast table in LANCE */ #define MaxFrameData 1500 /* frame MUST be <= 1500 */ #define MinFrameData 46 /* frame MUST be >= 46 (excluding enet hdr & CRC) */ /* Note that minimum receive buffer size is */ /* 64 bytes and minimum transmit buffer */ /* size is 100 bytes if data chaining is done */ /* buffer information */ #define BufferSize 1024 /* must be power of 2 so an integral # of */ /* bufs fit on a page (for Fix & Trans) */ #if defined(REVB) | defined(CHAIN) #define SmallBufSize 56 /* code assumes ethernet hdr (14 bytes) */ /* fits in 1 small buffer */ #endif /* REVB | CHAIN */ #define BufsPerPage (PageSize/BufferSize) #define LANCERecvNumBufs 5 /* 2**5 = 32 bufs = 8 pages * 4 bufs/page */ #define RecvNumBufs 8 * BufsPerPage /* assumed to be an integral # of pages */ #if defined(REVB) | defined(CHAIN) /* Note that BufsPerPage does not include */ /* SmallBufs, so it must be multiplied by 2 */ #define LANCEXmitNumBufs 6 /* 2**6 = 64 bufs = 8 pages * (2 * 4) bufs/page */ #define XmitNumBufs 8 * 2 * BufsPerPage /* assumed to be integral # of pgs */ #else #define LANCEXmitNumBufs 5 /* 2**5 = 32 bufs = 8 pages * 4 bufs/page */ #define XmitNumBufs 8 * BufsPerPage /* assumed to be an integral # of pages */ #endif /* REVB | CHAIN */ /* Ethernet command codes */ #define EBootCmd 1 /* Boot Ridge (not implemented) */ #define EWriteRegsCmd 2 /* Write LANCE regs CSR0 - CSR3 */ #define EWriteReg0Cmd 3 /* Write LANCE reg CSR0 */ #define EReadRegsCmd 4 /* Read LANCE regs CSR0 - CSR3 */ #define EReadReg0Cmd 5 /* Read LANCE reg CSR0 */ #define EReadAddrCmd 6 /* Read Node Physical Address */ #define EDemandXmitCmd 7 /* Set LANCE demand transmit bit */ #define EEnLANCECmd 8 /* Enable LANCE interrupts */ #define EDisLANCECmd 9 /* Disable LANCE interrupts */ #define EEnEtherCmd 10 /* Enable ethernet controller interrupts */ #define EDisEtherCmd 11 /* Disable ethernet controller interrupts */ /* #define EReadRevCodeCmd 12 */ /* Read revision codes for PROM, PC board, code */ /* Error codes from Ethernet controller */ #define EInvalidError 0 /* used when EError = 0 and ECommand <> 0 */ #define EBadCmdErr 1 #define EIntOvflErr 2 #define ECheckSumErr 3 /* Error codes from Diagnostic control block */ #define DLANCERegsErr 0X0001 #define DLocalMemErr 0X0002 #define DSharedMemErr 0X0004 #define DLANCEInitErr 0X0008 /* local error codes */ /* 66xxx = wonderboard ethernet */ /* 660xx = board level / misc errors */ #define ErNoWonderBoard 66001 #define ErInvalidInterrupt 66002 #define ErTimeout 66003 #define ErNoData 66004 #define ErBadMappingRAM 66005 #define ErBufWaitTimeOut 66006 /* 661xx = diagnostic channel errors */ #define ErSelfTest 66100 #define ErLANCERegs 66101 #define ErLocalMemory 66102 #define ErSharedMemory 66104 #define ErLANCEInit 66108 #define ErUnknownSelfTestErr 66116 /* 662xx = command/control channel errors */ #define ErEtherCtrl 66200 /* #define ErInvalidError 66200 */ /* #define ErBadCmdErr 66201 */ /* #define ErIntOvflErr 66202 */ /* #define ErCheckSumErr 66203 */ #define ErReadError 66210 #define ErWriteError 66211 /* 663xx = LANCE errors */ #define ErLANCE 66300 #define ErLANCEMemErr 66301 #define ErRecvError 66302 #define ErLANCEOwnsRecvBuf 66303 #define ErBadRecvFlags 66304 #define ErLANCERetryError 66305 #define ErXmitUnderflow 66306 #ifdef REVB #define ErXmitErrorRevB 66307 #endif /* REVB */ /* Bit positions in CSR0 register */ #define CSR0_ErrorFlag 0X8000 /* OR of Babble, Collision, MissedPacket & Memory Errors */ #define CSR0_Babble 0X4000 #define CSR0_CollisionError 0X2000 #define CSR0_MissedPacket 0X1000 #define CSR0_MemoryError 0X0800 #define CSR0_RecvInterrupt 0X0400 #define CSR0_XmitInterrupt 0X0200 #define CSR0_InitDone 0X0100 #define CSR0_InterruptFlag 0X0080 /* OR of Recv & Xmit Interrupts, Babble, MissedPacket & */ /* Memory Errors */ #define CSR0_InterruptEnable 0X0040 #define CSR0_ReceiverOn 0X0020 #define CSR0_XmitterOn 0X0010 #define CSR0_DemandXmit 0X0008 #define CSR0_StopCmd 0X0004 #define CSR0_StartCmd 0X0002 #define CSR0_InitCmd 0X0001 #define InitCSR0 (CSR0_InterruptEnable + CSR0_InitCmd) #define StartCSR0 (CSR0_InterruptEnable + CSR0_StartCmd) #define CSR0_InterruptBits (CSR0_ErrorFlag + CSR0_Babble + \ CSR0_CollisionError +CSR0_MissedPacket + \ CSR0_MemoryError + CSR0_RecvInterrupt + \ CSR0_XmitInterrupt + CSR0_InitDone) /* Masks to select valid bits in registers */ #define CSR1Mask 0XFFFE #define CSR2Mask 0X00FF /* Bit positions in CSR3 register */ #define CSR3_ByteSwap 0X0004 #define CSR3_ALEControl 0X0002 #define CSR3_ByteControl 0X0001 #define DefaultCSR3 (CSR3_ByteSwap + CSR3_ALEControl) /* Bit positions in Mode register */ #define Promiscuous 0X8000 #define IntLoopback 0X0040 #define DisableRetry 0X0020 #define ForceCollision 0X0010 #define DisableXmitCRC 0X0008 #define Loopback 0X0004 #define DisableXmitter 0X0002 #define DisableReceiver 0X0001 #define DefaultModeReg 0 /* Bit positions in flags byte of receive message descriptor (ERecvFlags) */ #define RecvOwn 0X80 /* 0 = host, 1 = LANCE */ #define RecvError 0X40 /* OR of next 4 flags (error flags) */ #define FramingError 0X20 #define Overflow 0X10 #define CRCError 0X08 #define RecvBufferError 0X04 #define StartRecvPacket 0X02 #define EndRecvPacket 0X01 #define DefaultRecvFlags RecvOwn #define RidgeOwned 0 /* Bit positions in flags byte of transmit message descriptor (EXmitFlags) */ #define XmitOwn 0X80 /* 0 = host, 1 = LANCE */ #define XmitError 0X40 /* OR of 4 error flags in EXmitFlags2 */ #define ReservedXmit 0X20 /* LANCE will write 0 */ #define MoreRetries 0X10 #define OneRetry 0X08 #define Deferred 0X04 #define StartXmitPacket 0X02 #define EndXmitPacket 0X01 #define DefaultXmitFlags 0 /* not start nor end of packet */ #define XmitStatsMask (XmitError + MoreRetries + OneRetry + Deferred) /* Bit positions in second flags byte of transmit message descriptor (EXmitFlags2) */ #define XmitBufferError 0X8000 /* causes Underflow & XmitError in EXmitFlags */ #define Underflow 0X4000 #define ReservedXmit2 0X2000 #define LateCollision 0X1000 #define LostCarrier 0X0800 #define RetryError 0X0400 #define DefaultXmitFlags2 0 /* clear any and all errors for this buffer */ #define TDRMask 0X03FF /* Time Domain Reflectometry value valid on retry error */ /************************/ /* TYPE DEFINITIONS */ /************************/ /* ?????? Check byte allignment of compiled code vs real structures */ typedef struct { u_char a[AddressLen]; } NodeAddressType; typedef struct { u_char a[LogicalAddrLen]; } NodeAddrFilter; typedef struct { u_short DB_BootReq; u_short DB_BdFailures; /* self test status stored here */ u_short DB_PROMVersion; u_char DB_PCA_Config; u_char DB_RAMVersion; u_char DReserved[22]; } diagCBStruct; typedef struct { u_short EMode; NodeAddressType EPhysicalAddr; NodeAddrFilter ELogicalAddrFilter; u_short ERecvDescRingLo; /* bits 15-00 of address */ u_char ERecvRingLength; /* bits 7,6,5; bits 4-0 are reserved */ u_char ERecvDescRingHi; /* bits 23-16 of address */ u_short EXmitDescRingLo; /* bits 15-00 of address */ u_char EXmitRingLength; /* bits 7,6,5; bits 4-0 are reserved */ u_char EXmitDescRingHi; /* bits 23-16 of address */ } InitBlockStruct; #define LengthShiftCount 5 typedef union { struct { u_short ERecvBuffAddrLo; /* bits 15-00 of address */ u_char ERecvFlags; u_char ERecvBuffAddrHi; /* bits 23-16 of address */ u_short ERecvBuffByteCnt; u_short ERecvMsgByteCnt; } ERecvMsgStruct; u_short ERecvHalfWord[4]; } RecvMsgDesc; typedef union { struct { u_short EXmitBuffAddrLo; /* bits 15-00 of address */ u_char EXmitFlags; u_char EXmitBuffAddrHi; /* bits 23-16 of address */ u_short EXmitBuffByteCnt; /* two's complement of byte count */ u_short EXmitFlags2; } EXmitMsgStruct; u_short EXmitHalfWord[4]; } XmitMsgDesc; #define DefaultByteCnt ((u_short)(-BufferSize)) /* 2's complement of buffer size */ typedef struct { u_short EReg0; /* CSR0 */ u_short EReg1; /* CSR1 */ u_short EReg2; /* CSR2 */ u_short EReg3; /* CSR3 */ } regStruct; /* * WARNING: the code assumes EError and ECommand are contiguous bytes in * the order specified. Do not redefine them */ typedef struct { u_char EError; /* WB stores error */ u_char ECommand; /* Ridge writes command */ regStruct EWriteData; /* Ridge stores data for CSR0 - CSR3 */ regStruct EReadData; /* WB reads CSR0 - CSR3 */ NodeAddressType EPAddress; /* WB returns ethernet address */ u_short EIntHead; /* Ridge reads from head of interrupt Q */ u_short EIntTail; /* WB writes at tail of interrupt Q */ char EReserved[12]; /* reserved for future use */ } etherCBStruct; #define MulticastBit 0X0001 /* bit 00 of the physical addr (47-00) */ #define MulticastByte 5 /* in the last byte of 6 byte address */ /* This defines a frame. */ typedef struct { char FileData[MaxFrameData]; } FrameType; #define EtherFCSSize 4 E 1 #ident " @(#)wonder.h 4.3 87/05/14 " /* " wonder.h 4.2 2/28/86" */ /* wonder.h */ /* Ridge WonderBoard Driver include file */ /************************************/ /* Ridge generic driver definitions */ /************************************/ #define dirty TRUE #define HalfWordMask 0XFFFF #define LoByteMask 0XFF #define HalfWordShiftCnt 16 #define ByteShiftCount 8 /* system call error codes */ #define ERBadResponse 598 #define Erbaddevice 1000 /* there's one of these in errors.h */ #define ErIOTimeOut 1001 #define ErIODataNotValid 1002 #define ErIOTmOAndDNV 1003 #define ErUnknownError 1004 /****************************************/ /* Ridge WonderBoard Driver definitions */ /****************************************/ #define AddrHiMask 0X007FFF8000 #define AddrLoMask 0X7FFF #define WonderRidgeFlag 0X00008000 /* 0 = wonderboard shared memory; 1= ridge memory */ #define MemMapFlag 0X00800000 /* 0 = shared memory; 1 = mapping RAM */ #define BHE 0X00400000 /* Byte or 8086 HalfWord Enable */ /* Shared memory with the 8086 on Wonder Board */ #define etherCB 0 #define etherCBSize 40 #define etherInitBlock (etherCB + etherCBSize) #define etherInitSize 24 #define SCSICtrlBlock 0X0040 #define LinePtrCtrlBlk 0X0080 #define DiagCtrlBlk 0X00C0 #define TTYCtrlBlock 0X0100 #define DiagBuffer 0X0200 #define IntQEntrySize 2 /* holds 1 copy of CSR0 which is 2 bytes */ #define InterruptQSize 256 /* interrupt Q size in bytes (not entries) */ #define LANCEQBegin 0X0300 /* Q holds CSR0's read on LANCE interrupts */ #define LANCEQEnd (LANCEQBegin + InterruptQSize - IntQEntrySize) #define NumRingDescs 128 #define RingDescSize 8 #define RingSize (RingDescSize * NumRingDescs) #define etherXmitRing 0X0400 #define etherRecvRing (etherXmitRing + RingSize) #define SCSICtrlBlkQ 0X1000 #define LPBuffer 0X1800 #define TTYXmitBufs 0X2000 /* ?????? verify this */ #define TTYRecvBufs 0X3000 /************************/ /* TYPE DEFINITIONS */ /************************/ typedef int VirtualAddress; typedef int realAddress; typedef int PageAddr; typedef int IOAddressWord; typedef int IODataWord; typedef int DeviceNumber; #ident " @(#)lance.h 4.2 87/05/14 " /* " lance.h 4.2 2/28/86" */ /* lance.h */ /**************************************************************/ /* Ridge WonderBoard ethernet controller & LANCE include file */ /**************************************************************/ #define StartQPage 0 #define EndQPage 7 #define IOSize 2 /* number of bytes to read/write */ /* Arbitrary timer values */ /* ?????? calculate max backoff for TimeoutXmitBuf */ #define TimeoutWriteWB 1000 /* write to WB must complete in 1000 ms */ #define TimeoutXmitBuf 5000 /* xmit buffer must be freed in 5000 ms */ #define TimeoutInit 1000 /* init command must complete in 1000 ms */ #ifdef REVB #define TimeoutXmit 500 /* xmit must complete in 500 ms */ #endif /* REVB */ /* constants for frame data types */ #define AddressLen 6 /* Ethernet address length */ #define LogicalAddrLen 8 /* # of bytes for multicast table in LANCE */ #define MaxFrameData 1500 /* frame MUST be <= 1500 */ #define MinFrameData 46 /* frame MUST be >= 46 (excluding enet hdr & CRC) */ /* Note that minimum receive buffer size is */ /* 64 bytes and minimum transmit buffer */ /* size is 100 bytes if data chaining is done */ /* buffer information */ #define BufferSize 1024 /* must be power of 2 so an integral # of */ /* bufs fit on a page (for Fix & Trans) */ #if defined(REVB) | defined(CHAIN) #define SmallBufSize 56 /* code assumes ethernet hdr (14 bytes) */ /* fits in 1 small buffer */ #endif /* REVB | CHAIN */ #define BufsPerPage (PageSize/BufferSize) #define LANCERecvNumBufs 5 /* 2**5 = 32 bufs = 8 pages * 4 bufs/page */ #define RecvNumBufs 8 * BufsPerPage /* assumed to be an integral # of pages */ #if defined(REVB) | defined(CHAIN) /* Note that BufsPerPage does not include */ /* SmallBufs, so it must be multiplied by 2 */ #define LANCEXmitNumBufs 6 /* 2**6 = 64 bufs = 8 pages * (2 * 4) bufs/page */ #define XmitNumBufs 8 * 2 * BufsPerPage /* assumed to be integral # of pgs */ #else #define LANCEXmitNumBufs 5 /* 2**5 = 32 bufs = 8 pages * 4 bufs/page */ #define XmitNumBufs 8 * BufsPerPage /* assumed to be an integral # of pages */ #endif /* REVB | CHAIN */ /* Ethernet command codes */ #define EBootCmd 1 /* Boot Ridge (not implemented) */ #define EWriteRegsCmd 2 /* Write LANCE regs CSR0 - CSR3 */ #define EWriteReg0Cmd 3 /* Write LANCE reg CSR0 */ #define EReadRegsCmd 4 /* Read LANCE regs CSR0 - CSR3 */ #define EReadReg0Cmd 5 /* Read LANCE reg CSR0 */ #define EReadAddrCmd 6 /* Read Node Physical Address */ #define EDemandXmitCmd 7 /* Set LANCE demand transmit bit */ #define EEnLANCECmd 8 /* Enable LANCE interrupts */ #define EDisLANCECmd 9 /* Disable LANCE interrupts */ #define EEnEtherCmd 10 /* Enable ethernet controller interrupts */ #define EDisEtherCmd 11 /* Disable ethernet controller interrupts */ /* #define EReadRevCodeCmd 12 */ /* Read revision codes for PROM, PC board, code */ /* Error codes from Ethernet controller */ #define EInvalidError 0 /* used when EError = 0 and ECommand <> 0 */ #define EBadCmdErr 1 #define EIntOvflErr 2 #define ECheckSumErr 3 /* Error codes from Diagnostic control block */ #define DLANCERegsErr 0X0001 #define DLocalMemErr 0X0002 #define DSharedMemErr 0X0004 #define DLANCEInitErr 0X0008 /* local error codes */ /* 66xxx = wonderboard ethernet */ /* 660xx = board level / misc errors */ #define ErNoWonderBoard 66001 #define ErInvalidInterrupt 66002 #define ErTimeout 66003 #define ErNoData 66004 #define ErBadMappingRAM 66005 #define ErBufWaitTimeOut 66006 /* 661xx = diagnostic channel errors */ #define ErSelfTest 66100 #define ErLANCERegs 66101 #define ErLocalMemory 66102 #define ErSharedMemory 66104 #define ErLANCEInit 66108 #define ErUnknownSelfTestErr 66116 /* 662xx = command/control channel errors */ #define ErEtherCtrl 66200 /* #define ErInvalidError 66200 */ /* #define ErBadCmdErr 66201 */ /* #define ErIntOvflErr 66202 */ /* #define ErCheckSumErr 66203 */ #define ErReadError 66210 #define ErWriteError 66211 /* 663xx = LANCE errors */ #define ErLANCE 66300 #define ErLANCEMemErr 66301 #define ErRecvError 66302 #define ErLANCEOwnsRecvBuf 66303 #define ErBadRecvFlags 66304 #define ErLANCERetryError 66305 #define ErXmitUnderflow 66306 #ifdef REVB #define ErXmitErrorRevB 66307 #endif /* REVB */ /* Bit positions in CSR0 register */ #define CSR0_ErrorFlag 0X8000 /* OR of Babble, Collision, MissedPacket & Memory Errors */ #define CSR0_Babble 0X4000 #define CSR0_CollisionError 0X2000 #define CSR0_MissedPacket 0X1000 #define CSR0_MemoryError 0X0800 #define CSR0_RecvInterrupt 0X0400 #define CSR0_XmitInterrupt 0X0200 #define CSR0_InitDone 0X0100 #define CSR0_InterruptFlag 0X0080 /* OR of Recv & Xmit Interrupts, Babble, MissedPacket & */ /* Memory Errors */ #define CSR0_InterruptEnable 0X0040 #define CSR0_ReceiverOn 0X0020 #define CSR0_XmitterOn 0X0010 #define CSR0_DemandXmit 0X0008 #define CSR0_StopCmd 0X0004 #define CSR0_StartCmd 0X0002 #define CSR0_InitCmd 0X0001 #define InitCSR0 (CSR0_InterruptEnable + CSR0_InitCmd) #define StartCSR0 (CSR0_InterruptEnable + CSR0_StartCmd) #define CSR0_InterruptBits (CSR0_ErrorFlag + CSR0_Babble + \ CSR0_CollisionError +CSR0_MissedPacket + \ CSR0_MemoryError + CSR0_RecvInterrupt + \ CSR0_XmitInterrupt + CSR0_InitDone) /* Masks to select valid bits in registers */ #define CSR1Mask 0XFFFE #define CSR2Mask 0X00FF /* Bit positions in CSR3 register */ #define CSR3_ByteSwap 0X0004 #define CSR3_ALEControl 0X0002 #define CSR3_ByteControl 0X0001 #define DefaultCSR3 (CSR3_ByteSwap + CSR3_ALEControl) /* Bit positions in Mode register */ #define Promiscuous 0X8000 #define IntLoopback 0X0040 #define DisableRetry 0X0020 #define ForceCollision 0X0010 #define DisableXmitCRC 0X0008 #define Loopback 0X0004 #define DisableXmitter 0X0002 #define DisableReceiver 0X0001 #define DefaultModeReg 0 /* Bit positions in flags byte of receive message descriptor (ERecvFlags) */ #define RecvOwn 0X80 /* 0 = host, 1 = LANCE */ #define RecvError 0X40 /* OR of next 4 flags (error flags) */ #define FramingError 0X20 #define Overflow 0X10 #define CRCError 0X08 #define RecvBufferError 0X04 #define StartRecvPacket 0X02 #define EndRecvPacket 0X01 #define DefaultRecvFlags RecvOwn #define RidgeOwned 0 /* Bit positions in flags byte of transmit message descriptor (EXmitFlags) */ #define XmitOwn 0X80 /* 0 = host, 1 = LANCE */ #define XmitError 0X40 /* OR of 4 error flags in EXmitFlags2 */ #define ReservedXmit 0X20 /* LANCE will write 0 */ #define MoreRetries 0X10 #define OneRetry 0X08 #define Deferred 0X04 #define StartXmitPacket 0X02 #define EndXmitPacket 0X01 #define DefaultXmitFlags 0 /* not start nor end of packet */ #define XmitStatsMask (XmitError + MoreRetries + OneRetry + Deferred) /* Bit positions in second flags byte of transmit message descriptor (EXmitFlags2) */ #define XmitBufferError 0X8000 /* causes Underflow & XmitError in EXmitFlags */ #define Underflow 0X4000 #define ReservedXmit2 0X2000 #define LateCollision 0X1000 #define LostCarrier 0X0800 #define RetryError 0X0400 #define DefaultXmitFlags2 0 /* clear any and all errors for this buffer */ #define TDRMask 0X03FF /* Time Domain Reflectometry value valid on retry error */ /************************/ /* TYPE DEFINITIONS */ /************************/ /* ?????? Check byte allignment of compiled code vs real structures */ typedef struct { u_char a[AddressLen]; } NodeAddressType; typedef struct { u_char a[LogicalAddrLen]; } NodeAddrFilter; typedef struct { u_short DB_BootReq; u_short DB_BdFailures; /* self test status stored here */ u_short DB_PROMVersion; u_char DB_PCA_Config; u_char DB_RAMVersion; u_char DReserved[22]; } diagCBStruct; typedef struct { u_short EMode; NodeAddressType EPhysicalAddr; NodeAddrFilter ELogicalAddrFilter; u_short ERecvDescRingLo; /* bits 15-00 of address */ u_char ERecvRingLength; /* bits 7,6,5; bits 4-0 are reserved */ u_char ERecvDescRingHi; /* bits 23-16 of address */ u_short EXmitDescRingLo; /* bits 15-00 of address */ u_char EXmitRingLength; /* bits 7,6,5; bits 4-0 are reserved */ u_char EXmitDescRingHi; /* bits 23-16 of address */ } InitBlockStruct; #define LengthShiftCount 5 typedef union { struct { u_short ERecvBuffAddrLo; /* bits 15-00 of address */ u_char ERecvFlags; u_char ERecvBuffAddrHi; /* bits 23-16 of address */ u_short ERecvBuffByteCnt; u_short ERecvMsgByteCnt; } ERecvMsgStruct; u_short ERecvHalfWord[4]; } RecvMsgDesc; typedef union { struct { u_short EXmitBuffAddrLo; /* bits 15-00 of address */ u_char EXmitFlags; u_char EXmitBuffAddrHi; /* bits 23-16 of address */ u_short EXmitBuffByteCnt; /* two's complement of byte count */ u_short EXmitFlags2; } EXmitMsgStruct; u_short EXmitHalfWord[4]; } XmitMsgDesc; #define DefaultByteCnt ((u_short)(-BufferSize)) /* 2's complement of buffer size */ typedef struct { u_short EReg0; /* CSR0 */ u_short EReg1; /* CSR1 */ u_short EReg2; /* CSR2 */ u_short EReg3; /* CSR3 */ } regStruct; /* * WARNING: the code assumes EError and ECommand are contiguous bytes in * the order specified. Do not redefine them */ typedef struct { u_char EError; /* WB stores error */ u_char ECommand; /* Ridge writes command */ regStruct EWriteData; /* Ridge stores data for CSR0 - CSR3 */ regStruct EReadData; /* WB reads CSR0 - CSR3 */ NodeAddressType EPAddress; /* WB returns ethernet address */ u_short EIntHead; /* Ridge reads from head of interrupt Q */ u_short EIntTail; /* WB writes at tail of interrupt Q */ char EReserved[12]; /* reserved for future use */ } etherCBStruct; #define MulticastBit 0X0001 /* bit 00 of the physical addr (47-00) */ #define MulticastByte 5 /* in the last byte of 6 byte address */ /* This defines a frame. */ typedef struct { char FileData[MaxFrameData]; } FrameType; #define EtherFCSSize 4 #ident " @(#)trace.h 4.4 87/05/14 " #ifdef DEBUG int trace = 0x8000; int xebug = 0x0001; #endif /* DEBUG */ #define DebugAll 0xffff #define DebugErrorMsgs 0x0001 #define DebugWBCommands 0x0002 #define DebugWBProcs 0x0004 #define DebugWBInterrupts 0x0008 #define DebugWBStats 0x0010 #define DebugWBInit 0x0020 #define DebugWBTimer 0x0040 #define DebugWBIO 0x0080 #define TraceAll 0xffff #define TraceProcs 0x0001 #define TraceWBTimer 0x0002 #define TraceLog 0x0004 #define TraceLogDone 0x0008 #define TraceMsgs 0x0010 #define TraceNet 0x0020 #define TraceBadType 0x0040 #define TraceFrames 0x1000 #define TraceErrors 0x8000 /* "%W% %E%" */ /* wonder.c */ /* * Ridge Ethernet Driver - Wonderboard interface */ #include #include #include #include #include #include #include #include #include #include #define PageSize NBPP #define MBIGSIZE PageSize typedef unsigned long n_long; #include "../net/if.h" #include "../net/route.h" #include "../netinet/in.h" #include "../netinet/ip.h" #include "../netinet/if_ether.h" #ifdef DEBUG #include "trace.h" #endif #include "wonder.h" #include "lance.h" typedef unsigned int Error; typedef unsigned int Boolean; typedef unsigned short Halfword; #define ErOK 0 #define FALSE 0 #define TRUE 1 #ifdef DEBUG /* variables pour debug */ #define TAILLE_DEBUG 0x10000 #define LG_LIGNE 0x40 #define NB_LIGNES TAILLE_DEBUG/LG_LIGNE u_short Anneau[256]; char texte[TAILLE_DEBUG]; unsigned short ligne_courante = 0; unsigned short init_debug = 0; char ascii[0x10] = {'0','1','2','3','4','5','6','7','8', '9','a','b','c','d','e','f'}; #endif /* DEBUG */ unsigned short nbpkterr = 0; Boolean tcpipOpen = FALSE; /* Global routines defined in this module */ int wbetattach(); int wbetinit(); int wbetioctl(); int wbetoutput(); int wbetopen(); int wbetreset(); /* External data structures */ extern struct ifnet loif; extern u_char etherbroadcastaddr[6]; extern struct in_addr arpmyaddr(); /* External routines referenced (non-integer functions) */ extern struct mbuf *m_get(); extern struct mbuf *m_freem(); extern struct mbuf *m_getbig(); extern struct mbuf *m_copy(); extern Error d_read(); extern Error d_write(); /* Local routines (non-integer functions) requiring forward references */ Error bad_Write(); Error AllocDescRings(); struct mbuf *copyLANCEBufToMbuf(); FrameType *sptalloc(); Error copyMbufToLANCEBuf(); Error GetXmitBuf(); Error GetWonderBoard(); Error LANCEError(); Error packetXmitted(); Error ReadRevCodes(); Error WB_Init(); Error WBRead(); Error WBWrite(); Error InitStartCmds(); Error WriteWBCommand(); /* fonction de timeout */ int XmitTimeout(); int CmdTimeout(); int StartTimeout(); int BufTimeout(); /*************************************/ /* VAR beginning of global variables */ /*************************************/ /* * Ethernet software structure for the interface. * * Each interface is referenced by a network interface structure, * es.ac_if, which the routing code uses to locate the interface. * This structure contains the output queue for the interface, its address, ... */ static struct arpcom es; /* common Ethernet structures */ NodeAddressType localAddress; Boolean SleepOK; /* TRUE pour synchroniser les requetes au controleur */ /* FALSE quand on est sous IT */ Boolean WBPresent; /* TRUE if wonderboard is present */ Boolean WBDriverInited; /* TRUE if ethernet is present & driver init'd OK */ static Boolean ipintrqFull; /* TRUE if we can't give a buffer to ip */ /* pointers to buffers */ FrameType *RecvBufs[RecvNumBufs]; /* points to buffers we will put read data into */ FrameType *XmitBufs[XmitNumBufs]; /* where to find data to write */ realAddress RealRecvBufs[RecvNumBufs]; /* real address of RecvBufs */ realAddress RealXmitBufs[XmitNumBufs]; /* real address of XmitBufs */ int RecvQHead; /* index into RecvBufs for next buf to read */ /* XmitQ is full when buffer at XmitQHead belongs */ /* to LANCE and TempXmitQHead = XmitQTail */ int XmitQHead; /* index into XmitBufs for last buffer filled */ /* next packet will start at next buffer */ int XmitQTail; /* index into XmitBufs of first buffer of next packet */ /* for LANCE to free */ int TempXmitQHead; /* used in filling buffers for a single packet */ /* error statistics */ /* WARNING: As a global variable, we assume this structure is initially zero */ struct { int StatsMoreRetries; /* xmit stats */ int StatsOneRetry; int StatsDeferred; int StatsXmitBuf; int StatsUnderflow; int StatsLateCollision; int StatsLostCarrier; int StatsRetryError; int StatsBabble; /* general stats */ int StatsCollision; int StatsMissedPkt; int StatsMemoryError; int StatsFlushedLANCEInt; int StatsIntQOverflow; int StatsFramingErr; /* receive stats */ int StatsOverflow; int StatsCRCError; int StatsRecvBuf; } Stats; InitBlockStruct InitBlockCopy; etherCBStruct etherCBCopy; diagCBStruct diagCBCopy; RecvMsgDesc RecvDescCopy; XmitMsgDesc XmitDescCopy; /* erreurs retournees par les differents timeouts */ Error TO_ErrXmit; Error TO_ErrInit; Error TO_ErrCmd; #define PRIOR 20 /* etat d'activation des differents entrees sorties */ unsigned int D_Cpt_Init; /* nombre init demande */ unsigned int F_Cpt_Init; /* nombre init recu */ unsigned int D_Cpt_Cmd; /* nombre commandes envoyees */ unsigned int F_Cpt_Cmd; /* nombre commandes recues */ int WBDevice; /* I/O address of WonderBoard */ int WBLength; int WBOffset; int IOMapAddr; int IORAMAddr; /*******************************/ /* MACROS */ /*******************************/ /* WARNING: This macro must be invoked with the parameter "string" in parentheses */ #ifdef DEBUG #define DebugPrint(flag,string) if (xebug & flag) debug2 string #else #define DebugPrint(flag,string) /* nop */ #endif /* DEBUG */ /* WARNING: This macro must be invoked with the parameter "string" in parentheses */ #ifdef DEBUG #define TracePrint(flag,string) if (trace & flag) debug2 string #else #define TracePrint(flag,string) /* nop */ #endif /* DEBUG */ #ifdef DEBUG #define doWBWriteRegsCmd \ WriteWBCommand(EWriteRegsCmd); \ DebugPrint(DebugWBCommands,("WriteRegsCmd\n")) #define doWBWriteReg0Cmd \ WriteWBCommand(EWriteReg0Cmd); \ DebugPrint(DebugWBCommands,("WriteReg0Cmd\n")) #define doWBReadAddrCmd \ WriteWBCommand(EReadAddrCmd); \ DebugPrint(DebugWBCommands,("ReadAddrCmd\n")) #define doWBDmdXmitCmd \ WriteWBCommand(EDemandXmitCmd); \ DebugPrint(DebugWBCommands,("DemandXmitCmd\n")) #define doWBEnLANCECmd \ WriteWBCommand(EEnLANCECmd); \ DebugPrint(DebugWBCommands,("EnableLANCECmd\n")) #define doWBDisLANCECmd \ WriteWBCommand(EDisLANCECmd); \ DebugPrint(DebugWBCommands,("DisableLANCECmd\n")) #define doWBEnEtherCmd \ WriteWBCommand(EEnEtherCmd); \ DebugPrint(DebugWBCommands,("EnableEtherCmd\n")) #define doWBDisEtherCmd \ WriteWBCommand(EDisEtherCmd); \ DebugPrint(DebugWBCommands,("DisableEtherCmd\n")) #else #define doWBWriteRegsCmd WriteWBCommand(EWriteRegsCmd) #define doWBWriteReg0Cmd WriteWBCommand(EWriteReg0Cmd) #define doWBReadAddrCmd WriteWBCommand(EReadAddrCmd) #define doWBDmdXmitCmd WriteWBCommand(EDemandXmitCmd) #define doWBEnLANCECmd WriteWBCommand(EEnLANCECmd) #define doWBDisLANCECmd WriteWBCommand(EDisLANCECmd) #define doWBEnEtherCmd WriteWBCommand(EEnEtherCmd) #define doWBDisEtherCmd WriteWBCommand(EDisEtherCmd) #endif /* DEBUG */ #define OffsetFunc(structure,element) \ (((u_char *) &structure.element) - ((u_char *) &structure)) /* WARNING: The caller is expected to verify IOData is a u_char */ #define WBWriteHi(IOAddr,IOData) \ WBWrite(IOAddr + 1, IOData << ByteShiftCount) #define WBWriteLo(IOAddr,IOData) \ WBWrite(IOAddr + BHE - 1, IOData & LoByteMask) #define ReadXmitFlags(BufNum) \ (void) WBRead(IORAMAddr + etherXmitRing + (BufNum * RingDescSize) + \ OffsetFunc(XmitDescCopy, EXmitHalfWord[1]), \ &(XmitDescCopy.EXmitHalfWord[1])) #define WriteRecvFlags(BufNum) \ (void) WBWriteHi(IORAMAddr + etherRecvRing + (BufNum * RingDescSize) + \ OffsetFunc(RecvDescCopy, ERecvMsgStruct.ERecvFlags), \ RecvDescCopy.ERecvMsgStruct.ERecvFlags) #define WriteXmitFlags(BufNum) \ (void) WBWriteHi(IORAMAddr + etherXmitRing + (BufNum * RingDescSize) + \ OffsetFunc(XmitDescCopy, EXmitMsgStruct.EXmitFlags), \ XmitDescCopy.EXmitMsgStruct.EXmitFlags) #define WriteXmitByteCnt(BufNum) \ (void) WBWrite(IORAMAddr + etherXmitRing + (BufNum * RingDescSize) + \ OffsetFunc(XmitDescCopy, EXmitMsgStruct.EXmitBuffByteCnt), \ XmitDescCopy.EXmitMsgStruct.EXmitBuffByteCnt) #define ReadIntQHead \ (void) WBRead(IORAMAddr + etherCB + OffsetFunc(etherCBCopy, EIntHead), \ &(etherCBCopy.EIntHead)) #define ReadIntQTail \ (void) WBRead(IORAMAddr + etherCB + OffsetFunc(etherCBCopy, EIntTail), \ &(etherCBCopy.EIntTail)) #define IncrIntQHead \ (etherCBCopy.EIntHead = (etherCBCopy.EIntHead == LANCEQEnd ? \ LANCEQBegin : etherCBCopy.EIntHead + IntQEntrySize)) #define WriteIntQHead \ (void) WBWrite(IORAMAddr + etherCB + OffsetFunc(etherCBCopy, EIntHead), \ etherCBCopy.EIntHead) #define IncrRecvQPtr(QPtr) \ QPtr = (QPtr < RecvNumBufs - 1 ? ++QPtr : 0) #define IncrXmitQPtr(QPtr) \ QPtr = (QPtr < XmitNumBufs - 1 ? ++QPtr : 0) #define ReleaseRecvBuf(BufNum) \ { \ /* RecvDescCopy.ERecvMsgStruct.ERecvMsgByteCnt = 0; */ \ RecvDescCopy.ERecvMsgStruct.ERecvFlags = DefaultRecvFlags; \ WriteRecvFlags(BufNum); \ } int SwapBits(statusByte) register unsigned statusByte; { return (((statusByte & 0x01) << 7) + ((statusByte & 0x02) << 5) + ((statusByte & 0x04) << 3) + ((statusByte & 0x08) << 1) + ((statusByte & 0x10) >> 1) + ((statusByte & 0x20) >> 3) + ((statusByte & 0x40) >> 5) + ((statusByte & 0x80) >> 7)); } /* end SwapBits */ /* * Make the interface available if it exists, by filling in the network * interface record and initializing the hardware. The system will initialize * the interface when it is ready to accept packets. */ wbetattach() { register struct ifnet *ifp = &es.ac_if; struct sockaddr_in *sin; Error err; short protection; /* protection d'une sequence */ #ifdef DEBUG /* go into kdb to allow changing of trace flags */ printf("trace (@%x) = %x; xebug (@%x) = %x\n", &trace, trace, &xebug, xebug); call_debug(); #endif DEBUG protection=spl7(); TracePrint((TraceNet | TraceProcs), ("wbetattach\n")); ifp->if_unit = 0; ifp->if_name = "wb"; ifp->if_mtu = ETHERMTU; /* ethernet max transmission unit */ sin = (struct sockaddr_in *)&es.ac_if.if_addr; sin->sin_family = AF_INET; /* get my arpanet address, NOT implemented */ sin->sin_addr = arpmyaddr((struct arpcom *) 0); ifp->if_init = wbetinit; ifp->if_ioctl = wbetioctl; ifp->if_output = wbetoutput; ifp->if_reset = wbetreset; ifp->if_flags |= (IFF_NOTRAILERS + IFF_BROADCAST); /* Initialize WB stuff */ ipintrqFull = FALSE; /* direct WonderBoard interrupts to us */ err = GetWonderBoard(); if (err != ErOK) { if (err != ErNoWonderBoard) printf("network interface down\n"); WBDriverInited = FALSE; splx(protection); return; } /* * Allocate buffers from the heap, fix the buffers in memory, and * translate virual addresses of buffers to real addresses. */ err = AllocDescRings(); if (err != ErOK) { printf("network interface down\n"); WBDriverInited = FALSE; disableWBInterrupts(); splx(protection); return; } /* * Write the real memory addresses of the transmit and receive buffers to the * descriptor rings in shared memory. Tell the LANCE to initialize */ err = WB_Init(); if (err != ErOK) { printf("network interface down\n"); WBDriverInited = FALSE; disableWBInterrupts(); splx(protection); return; } /* Add interface to ifnet */ if_attach(ifp); printf("ethernet initialized\n"); splx(protection); } /* end wbetattach */ /* * Initialize the interface */ wbetinit() { register struct ifnet *ifp = &es.ac_if; register struct sockaddr_in *sin; short protection; /* protection d'une sequence */ protection = spl7(); TracePrint((TraceNet | TraceProcs), ("wbetinit\n")); sin = (struct sockaddr_in *)&ifp->if_addr; /* If the address is still unknown then return */ if (sin->sin_addr.s_addr == 0) { splx(protection); return; } /* set interface to ready only if ethernet is present */ if (!WBDriverInited) { es.ac_if.if_flags &= ~(IFF_UP|IFF_RUNNING); splx(protection); return; } if ((es.ac_if.if_flags & IFF_RUNNING) == 0) es.ac_if.if_flags |= IFF_UP|IFF_RUNNING; /* add interface to routing tables */ if_rtinit(&es.ac_if, RTF_UP); /* attach interface to address resolution protocol */ arpattach(&es); arpwhohas(&es, &sin->sin_addr); splx(protection); } /* end wbetinit */ /* * Process an ioctl request. */ wbetioctl(ifp, cmd, data) register struct ifnet *ifp; int cmd; caddr_t data; { register struct ifreq *ifr = (struct ifreq *)data; Error err = ErOK; short protection; /* protection d'une sequence */ TracePrint(TraceProcs, ("wbetioctl\n")); if (!WBDriverInited) return(Erbaddevice); protection = spl7(); switch (cmd) { case SIOCSIFADDR: if (ifp->if_flags & IFF_RUNNING) if_rtinit(ifp, -1); /* delete previous route */ wbsetaddr(ifp, (struct sockaddr_in *)&ifr->ifr_addr); wbetinit(); break; case SIOCGIFADDR: bcopy((caddr_t)&ifp->if_addr, (caddr_t)&ifr->ifr_addr, sizeof(struct sockaddr)); break; default: err = EINVAL; } splx(protection); return (err); } /* end wbetioctl */ wbsetaddr(ifp, sin) register struct ifnet *ifp; register struct sockaddr_in *sin; { ifp->if_addr = *(struct sockaddr *)sin; ifp->if_net = in_netof(sin->sin_addr); ifp->if_host[0] = in_lnaof(sin->sin_addr); sin = (struct sockaddr_in *)&ifp->if_broadaddr; sin->sin_family = AF_INET; sin->sin_addr = if_makeaddr(ifp->if_net, INADDR_ANY); ifp->if_flags |= IFF_BROADCAST; } /* end wbsetaddr */ /* * Receive data is probably available. Due to the way receive interrupts are * processed, we may have an interrupt for data we've already processed, so * there may not always be data available when we expect it. */ Error wbetread() { Halfword Etype; struct mbuf *m; register struct ifqueue *inq; NodeAddressType Dest; NodeAddressType Source; Error err = ErOK; if (!WBDriverInited) { err = Erbaddevice; return(err); } while ((!ipintrqFull) && (err = WB_Read(&Source, &Dest, &Etype)) != ErNoData) { if (err != ErOK) { TracePrint(TraceAll, ("error in read = %x\n", err)); es.ac_if.if_ierrors++; wbetreset(); return(err); } /* * If the tcpip device is not open, discard the packet since * there is nobody listening. */ if (!tcpipOpen) { while (WBLength > 0) { WBLength -= BufferSize; ReleaseRecvBuf(RecvQHead); IncrRecvQPtr(RecvQHead); } WBLength = 0; return(ErOK); } es.ac_if.if_ipackets++; /* check for trailer protocol, & make sure it's valid */ if (Etype >= ETHERPUP_TRAIL && Etype < ETHERPUP_TRAIL + ETHERPUP_NTRAILER) { int trailerOffset; int trailerLength; struct mbuf *mtemp; trailerOffset = ((int)Etype - ETHERPUP_TRAIL) * 512; if (trailerOffset > ETHERMTU) { #ifdef DEBUG if (trace & TraceAll) { TracePrint(TraceAll, ("ns: wbetread, dropping packet: trailer error: EType = %x\n", Etype)); dumpWBFrame(RecvBufs[RecvQHead], "Reading", MIN(RecvDescCopy.ERecvMsgStruct.ERecvMsgByteCnt, BufferSize)); } #endif /* DEBUG */ es.ac_if.if_ierrors++; return(err); } /* Discard the ethernet header and copy the data into mbufs. */ WBOffset += sizeof(struct ether_header); WBLength -= (sizeof(struct ether_header) + EtherFCSSize); m = copyLANCEBufToMbuf(); if (m == 0) { goto nomorembuf; } /* Copy the trailer into new mbufs, then get the packet */ /* type and length of the trailer from the new copy. */ mtemp = m_copy(m, trailerOffset, M_COPYALL); Etype = *(mtod(mtemp,Halfword *)); mtemp->m_off += sizeof(Etype); mtemp->m_len -= sizeof(Etype); trailerLength = *(mtod(mtemp,Halfword *)); mtemp->m_off += sizeof(Halfword); mtemp->m_len -= sizeof(Halfword); /* Delete the trailer from the end of the mbufs and */ /* concatenate the new mbuf with the trailer with the */ /* older mbufs with the data. */ m_adj(m, -trailerLength); m_cat(mtemp,m); m = mtemp; goto doippacket; } switch (Etype) { case ETHERPUP_IPTYPE: /* Discard the ethernet header and copy the data into mbufs. */ WBOffset += sizeof(struct ether_header); WBLength -= (sizeof(struct ether_header) + EtherFCSSize); m = copyLANCEBufToMbuf(); if (m == 0) { goto nomorembuf; } doippacket: /* queue IP type packets for IP to process later */ DebugPrint(DebugWBProcs, ("wbetread: IP packet read, mbuf = %x\n", m)); inq = &ipintrq; if (IF_QFULL(inq)) { TracePrint(TraceAll, ("ipintrq full\n")); ipintrqFull = TRUE; IF_DROP(inq); m_freem(m); } else { IF_ENQUEUE(inq,m); wakeup(wbetopen); } break; case ETHERPUP_ARPTYPE: /* ARP packets are handled by that protocol */ /* Put the data into mbufs. Strip the ether header */ WBOffset += sizeof(struct ether_header); WBLength -= (sizeof(struct ether_header) + EtherFCSSize); m = copyLANCEBufToMbuf(); if (m == 0) { goto nomorembuf; } DebugPrint(DebugWBProcs, ("wbetread: ARP packet read, mbuf = %x\n", m)); arpinput(&es, m); break; default: /* * If there is a place for this unknown (raw) packet, * save it */ if (!rawbuffer()) { m = copyLANCEBufToMbuf(); if (m == 0) { goto nomorembuf; } rawinput(m); } else { /* delete packet */ TracePrint(TraceBadType, ("wbetread: illegal packet Etype = %x\n", Etype)); #ifdef DEBUG if (trace & TraceBadType) dumpWBFrame(RecvBufs[RecvQHead], "Reading", MIN(RecvDescCopy.ERecvMsgStruct.ERecvMsgByteCnt, BufferSize)); #endif /* DEBUG */ while (WBLength > 0) { WBLength -= BufferSize; ReleaseRecvBuf(RecvQHead); IncrRecvQPtr(RecvQHead); } WBLength = 0; } break; } } nomorembuf: ipintrqFull = FALSE; WBLength = 0; WBOffset = 0; return(ErOK); } /* end wbetread */ /* * Interrupt from LANCE. */ wbetintr(dev,IOIR) int dev; /* pour normaliser l'interface */ int IOIR; { u_short status; u_short completeStatus = 0; Error err; TracePrint(TraceProcs, ("wbetintr: IOIR = %x\n", IOIR)); ReadIntQHead; ReadIntQTail; while (etherCBCopy.EIntHead != etherCBCopy.EIntTail) { (void) WBRead(IORAMAddr + etherCBCopy.EIntHead, &status); completeStatus |= status; #ifdef DEBUG if ((status & CSR0_InterruptBits) == 0) { /* * Wonderboard says the LANCE interrupted, but the status * from the LANCE contradicts this. */ DebugPrint((DebugWBInterrupts | DebugWBStats), ("wbetintr: receive unknown interrupt, CSR0 = %x\n", status)); } #endif /* DEBUG */ if (status & CSR0_ErrorFlag) { DebugPrint((DebugWBInterrupts | DebugErrorMsgs | DebugWBStats), ("wbetintr: LANCE Error on Interrupt, CSR0 = %x\n", status)); err = LANCEError(status); if (err != ErOK) { IncrIntQHead; WriteIntQHead; return(err); } } IncrIntQHead; WriteIntQHead; ReadIntQTail; } if (completeStatus & CSR0_RecvInterrupt) { DebugPrint(DebugWBInterrupts, ("wbetintr: LANCE Receive Interrupt, CSR0 = %x\n", status)); err = wbetread(); if (err != ErOK) return(err); } if (completeStatus & CSR0_XmitInterrupt) { DebugPrint(DebugWBInterrupts, ("wbetintr: LANCE Xmit Interrupt, CSR0 = %x\n", status)); err = packetXmitted(); if (err != ErOK) return(err); } if (completeStatus & CSR0_InitDone) { if (WBDriverInited) { DebugPrint((DebugWBInterrupts | DebugWBInit), ("wbetintr: LANCE Init Done Interrupt, CSR0 = %x\n", status)); F_Cpt_Init++; DebugPrint(DebugWBTimer, ("Init wakeup (wbintr); D_Cpt_Init = %x, F_Cpt_Init = %x\n", D_Cpt_Init, F_Cpt_Init)); wakeup(InitStartCmds); } } return(ErOK); } /* end wbetintr */ /* * Encapsulate a packet for output on the local net. Create the ethernet * header as necessary for the packet type specified in the destination * structure. If the packet is addressed to us (either specifically or * through a broadcast), then loop it back on the loopback device. */ wbetoutput(ifp, m0, dst) struct ifnet *ifp; struct mbuf *m0; struct sockaddr *dst; { int type = 0; Error err = ErOK; u_char edst[6]; struct in_addr idst; register struct mbuf *m = m0; register struct ether_header *ec; register int off; struct mbuf *mcopy = (struct mbuf *)0; int tempQPtr; int offset; short protection; /* protection d'une sequence */ TracePrint(TraceProcs, ("wbetoutput\n")); if (!WBDriverInited) return(Erbaddevice); protection = spl7(); switch (dst->sa_family) { #ifdef INET case AF_INET: idst = ((struct sockaddr_in *)dst)->sin_addr; if (!arpresolve(&es, m, &idst, edst)) { splx(protection); return(ErOK); /* if not yet resolved */ } if (in_lnaof(idst) == INADDR_ANY) mcopy = m_copy(m, 0, (int)M_COPYALL); off = ntohs((u_short)mtod(m, struct ip *)->ip_len) - m->m_len; /* need per host negociation */ if ((ifp->if_flags & IFF_NOTRAILERS) == 0) if (off > 0 && (off & 0x1ff) == 0 && m->m_off >= MMINOFF + 2 * sizeof(u_short)) { type = ETHERPUP_TRAIL + (off>>9); m->m_off -= 2 * sizeof(u_short); m->m_len += 2 * sizeof(u_short); *mtod(m, u_short *) = ntohs((u_short)ETHERPUP_IPTYPE); *(mtod(m, u_short *) + 1) = ntohs((u_short)m->m_len); goto gottrailertype; } type = ETHERPUP_IPTYPE; goto gottype; #endif /* INET */ case AF_IMPLINK: /* * Copy the data as well as the ether header from the mbuf chain * to the LANCE transmit buffers. This uses an offset of zero. * The copy may fail if there are no free LANCE transmit buffers * within a reasonable length of time. */ err = copyMbufToLANCEBuf(m, 0); if (err != ErOK) goto bad; /* * Update the head of the xmit queue to be the first buffer of the * newly formed packet */ IncrXmitQPtr(XmitQHead); ec = (struct ether_header *) (XmitBufs[XmitQHead]); goto gotheader; case AF_UNSPEC: ec = (struct ether_header *)dst->sa_data; bcopy((caddr_t)ec->ether_dhost, (caddr_t)edst, sizeof(edst)); type = ec->ether_type; goto gottype; default: printf("wbet%x: can't handle af%x\n", ifp->if_unit, dst->sa_family); err = EAFNOSUPPORT; goto bad; } gottrailertype: /* * Packet to be sent as trailer: move first packet * (control information) to end of chain. */ while (m->m_next) m = m->m_next; m->m_next = m0; m = m0->m_next; m0->m_next = 0; m0 = m; gottype: /* * Copy the data from the mbuf chain to the LANCE transmit buffers. * The copy may fail if there are no free LANCE transmit buffers within * a reasonable length of time. Add the local net header. */ offset = sizeof(struct ether_header); /* copy the data to the output buffers */ err = copyMbufToLANCEBuf(m, offset); if (err != ErOK) goto bad; /* * Update the head of the xmit queue to be the first buffer of the * newly formed packet */ IncrXmitQPtr(XmitQHead); /* prepare to add ether header (destination addr, source addr & type field) */ ec = (struct ether_header *) (XmitBufs[XmitQHead]); /* copy the destination address to the output buffer */ bcopy((caddr_t)edst, (caddr_t)ec->ether_dhost, sizeof(edst)); /* copy the type field to the output buffer */ ec->ether_type = htons((u_short)type); gotheader: /* * copy the source address to the output buffer. Note that for * packet filter packets, the destination address and type fields * have already been filled in, so we only need copy the source * address field. */ bcopy((caddr_t)es.ac_enaddr, (caddr_t)ec->ether_shost, sizeof(es.ac_enaddr)); /* * Set the XmitOwn bits in buffers of the current packet, starting with * the last buffer in the packet. This gives the buffers to the LANCE. * Doing the first buffer in the packet last makes sure that the LANCE * has all of the buffers for the packet before it tries to transmit, * since it only looks ahead one buffer. Update the XmitQueue * pointers and issue a demand transmit command to the LANCE. */ tempQPtr = TempXmitQHead; while (tempQPtr != XmitQHead) { ReadXmitFlags(tempQPtr); XmitDescCopy.EXmitMsgStruct.EXmitFlags |= XmitOwn; WriteXmitFlags(tempQPtr); tempQPtr = (tempQPtr == 0 ? XmitNumBufs - 1 : --tempQPtr); } ReadXmitFlags(tempQPtr); XmitDescCopy.EXmitMsgStruct.EXmitFlags |= XmitOwn; WriteXmitFlags(tempQPtr); #ifdef DEBUG if (trace & TraceFrames) { dumpWBFrame(XmitBufs[XmitQHead], "Writing", (-(XmitDescCopy.EXmitMsgStruct.EXmitBuffByteCnt)) & 0XFFFF); } #endif /* DEBUG */ XmitQHead = TempXmitQHead; DebugPrint(DebugWBProcs, ("wbetoutput: output queued\n")); es.ac_if.if_opackets++; m0 = m; bad: m_freem(m0); if (err != ErOK) { TracePrint(TraceAll,("error in write = %d\n", err)); wbetreset(); es.ac_if.if_oerrors++; } splx(protection); return(mcopy ? looutput(&loif, mcopy, dst) : err); } /* end wbetoutput */ /* * Reset interface. */ wbetreset() { Error err; short protection; /* protection d'une sequence */ TracePrint(TraceProcs, ("wbetreset\n")); printf("resetting interface\n"); if (!WBDriverInited) return; protection=spl7(); /* Reinitialize the LANCE */ err = WB_Init(); if (err != ErOK) RemoveWBInterface(); splx(protection); return; } /* end wbetreset */ /* * Shutdown all ethernet operations on the wonderboard. This is called from panic(). */ wbshutdown() { TracePrint((TraceNet | TraceProcs), ("wbshutdown\n")); /* Stop the LANCE */ etherCBCopy.EWriteData.EReg0 = CSR0_InterruptEnable + CSR0_StopCmd; (void) WBWrite(IORAMAddr + etherCB + OffsetFunc(etherCBCopy, EWriteData.EReg0), etherCBCopy.EWriteData.EReg0); SleepOK = FALSE; (void) doWBWriteReg0Cmd; printf("LANCE has been stopped\n"); disableWBInterrupts(); WBDriverInited = FALSE; return; } /* end wbshutdown */ /* * Remove access to the interface by setting the IFF_DOWN flag. * Called when irrecoverable errors are detected. Do not try to * reinitialize the interface. Some form of operator invervention * is required. We stop the LANCE so it will no longer interract on * the network, and then disable interrupts from the ethernet portions * of the board, to improve system performance and simplify the * driver. */ RemoveWBInterface() { struct ifnet *ifp = &es.ac_if; es.ac_if.if_flags &= ~(IFF_UP|IFF_RUNNING); printf("removing interface\n"); /* Stop the LANCE */ etherCBCopy.EWriteData.EReg0 = CSR0_InterruptEnable + CSR0_StopCmd; (void) WBWrite(IORAMAddr + etherCB + OffsetFunc(etherCBCopy, EWriteData.EReg0), etherCBCopy.EWriteData.EReg0); SleepOK = FALSE; (void) doWBWriteReg0Cmd; printf("LANCE has been stopped\n"); disableWBInterrupts(); WBDriverInited = FALSE; } /* end RemoveWBInterface */ /* * Copy the number of bytes specified in WBLength from LANCE receive buffers * (offset by WBOffset) to mbufs. Assumes that that number of bytes exist * in LANCE receive buffers, and that the caller has verified the ownership * of the buffers and validity of the data. */ struct mbuf * copyLANCEBufToMbuf() { struct mbuf *m = 0; struct mbuf *front = 0; /* points to beginning of mbuf */ /* chain to be returned */ struct mbuf **lastPtr = &front; /* used in linking previous buffer */ /* to current buffer; contains addr */ /* of previous buff's m_next field */ int lengthCopied; int minimum; while (WBLength > 0 ) { /* * Get another mbuf if there is no current mbuf or the current mbuf * or bigbuf is full. Restore the offset in the current mbuf to the * beginning of the data. Initially set the new mbuf to be empty. */ if ((m == 0) || (m->m_off == MMAXOFF) || (m->m_len == MBIGSIZE)) { if (m != 0) m->m_off -= m->m_len; m = m_get(M_WAIT, MT_DATA); if (m == 0) goto nobuf; m->m_len = 0; /* * If the length to copy is larger than will fit into one mbuf, then * allocate a big buffer and set the mbuf to reference it. */ if (WBLength > MLEN) { struct mbuf *big = 0; MCLGET(big,1); if (big == 0) goto nobuf; m->m_off = (int) big - (int) m; } /* * Add the mbuf to the list. Note that on the first pass, this updates * front due to the way lastPtr is initialized. */ *lastPtr = m; lastPtr = &m->m_next; } /* get the next LANCE receive buffer if the current one is empty */ if (WBOffset == BufferSize) { ReleaseRecvBuf(RecvQHead); IncrRecvQPtr(RecvQHead); WBOffset = 0; } if (m->m_off > MMAXOFF) lengthCopied = MIN(MBIGSIZE - m->m_len, MIN(WBLength, (BufferSize - WBOffset))); else lengthCopied = MIN(MLEN - m->m_len, MIN(WBLength, (BufferSize - WBOffset))); /* copy the data (from, to, length) */ bcopy((u_char *) RecvBufs[RecvQHead] + WBOffset, mtod(m, caddr_t), lengthCopied); /* update the lengths */ WBLength -= lengthCopied; m->m_len += lengthCopied; WBOffset += lengthCopied; m->m_off += lengthCopied; } /* while */ /* Restore the offset into the mbuf to the beginning of the data */ m->m_off -= m->m_len; /* * If the ethernet FCS overflows into the next buffer, then release * the current buffer, and then fall through to release the next * buffer (with the FCS). */ if ((WBOffset + EtherFCSSize) > BufferSize) { ReleaseRecvBuf(RecvQHead); IncrRecvQPtr(RecvQHead); } /* * The last receive buffer in the packet was exhausted, so release * it and update the Q head. */ ReleaseRecvBuf(RecvQHead); IncrRecvQPtr(RecvQHead); /* return the mbuf chain */ return(front); nobuf: /* release the chain of mbufs */ m_freem(front); /* release the receive buffers for the packet */ minimum = MIN(WBLength , BufferSize - WBOffset); if (minimum == WBLength) { ReleaseRecvBuf(RecvQHead); IncrRecvQPtr(RecvQHead); } else { WBLength -= minimum; ReleaseRecvBuf(RecvQHead); IncrRecvQPtr(RecvQHead); while (WBLength > 0) { ReleaseRecvBuf(RecvQHead); IncrRecvQPtr(RecvQHead); WBLength -= BufferSize; } } WBLength = 0; return ((struct mbuf *) NULL); } /* end copyLANCEBufToMbuf */ /* * Copy data from mbuf(s) to LANCE transmit buffer(s). Assumes that the mbuf * total length is within the maximum frame size for ethernet. Also, assumes * that the offset specified by the caller is less than BufferSize (ie, is * within the first LANCE transmit buffer). The head of the transmit queue * is not updated, nor are the buffers given to the LANCE, so the caller can * fill in the header. The caller is expected to update these. */ Error copyMbufToLANCEBuf(m, offset) struct mbuf *m; int offset; { int length; int totalLength; int mbufOffset = 0; /* offset in addition to m->m_off */ Error err; TempXmitQHead = XmitQHead; IncrXmitQPtr(TempXmitQHead); err = GetXmitBuf(); if (err != ErOK) return(err); totalLength = offset; XmitDescCopy.EXmitMsgStruct.EXmitFlags = DefaultXmitFlags | StartXmitPacket; while (m != 0) { /* get the next mbuf if the current one is empty */ if (m->m_len == 0) { m = m->m_next; mbufOffset = 0; continue; } /* go to the next LANCE xmit buffer if the current one is full */ while (offset >= BufferSize) { XmitDescCopy.EXmitMsgStruct.EXmitBuffByteCnt = DefaultByteCnt; WriteXmitByteCnt(TempXmitQHead); WriteXmitFlags(TempXmitQHead); offset -= BufferSize; IncrXmitQPtr(TempXmitQHead); err = GetXmitBuf(); if (err != ErOK) return(err); XmitDescCopy.EXmitMsgStruct.EXmitFlags = DefaultXmitFlags; } /* copy from mbuf to LANCE buffer */ length = MIN(m->m_len, BufferSize - offset); bcopy(mtod(m, caddr_t) + mbufOffset, ((u_char *) XmitBufs[TempXmitQHead]) + offset, length); /* update lengths and offsets */ offset += length; totalLength += length; m->m_len -= length; mbufOffset += length; } /* while */ /* * If the total data length of the packet is less than the minimum frame * size, we must pad it out to meet the ethernet spec. The receiver * is expected to use the byte count from a higher level protocol in * order to discard the padding. Note that we know that a packet of * minimum size fits in one buffer since transmit buffers have a * minimum size of 100 bytes, and the minimum packet is 46 bytes of * data + 14 bytes of ethernet header, or 60 bytes (not including the * CRC which we do not include in the buffer). */ if (totalLength < (MinFrameData + sizeof(struct ether_header))) { offset = (MinFrameData + sizeof(struct ether_header)); } XmitDescCopy.EXmitMsgStruct.EXmitFlags |= EndXmitPacket; XmitDescCopy.EXmitMsgStruct.EXmitBuffByteCnt = -offset; WriteXmitByteCnt(TempXmitQHead); WriteXmitFlags(TempXmitQHead); return(ErOK); } /* end copyMbufToLANCEBuf */ #ifdef DEBUG /* * Print the ethernet header, length of frame and read/write. * Also print the beginning of the data area */ dumpWBFrame(frame, mode, length) FrameType *frame; char mode[]; int length; { #define BytesPerLine 16 int i; int j; int newline; int printLen; char *rawframe = (char *) frame; printf("%s frame. Length: %x\n", mode, length); printf(" EthernetHeader:\n"); printLen = MIN(length, sizeof(struct ether_header)); for (i = 0; i < printLen; i += BytesPerLine) { newline = MIN(printLen, i + BytesPerLine); for (j = i; j < newline; j++) printf("%x ",rawframe[j]); printf("\n"); } i = printLen; printLen = MIN(length, 100); printf (" Data:\n"); for (; i < printLen; i += BytesPerLine) { newline = MIN(printLen, i + BytesPerLine); for (j = i; j < newline; j++) printf("%x ", frame->FileData[j]); printf("\n"); } } /* end dumpWBFrame */ #endif /* DEBUG */ /* * Flush all entries from the interrupt queue in shared RAM. */ FlushLANCEInterruptQ() { ReadIntQTail; if (etherCBCopy.EIntHead != etherCBCopy.EIntTail) { etherCBCopy.EIntHead = etherCBCopy.EIntTail; DebugPrint(DebugWBInterrupts, ("WBStats: flushed interrupt(s): LANCEInterruptQ\n")); } WriteIntQHead; } /* end FlushLANCEInterruptQ */ /* * Disable all interrupts from the wonderboard. This is done only during * attempted error recovery from serious errors, so ignore any errors which * occur */ disableWBInterrupts() { SleepOK = FALSE; (void) doWBDisLANCECmd; SleepOK = FALSE; (void) doWBDisEtherCmd; FlushLANCEInterruptQ; return; } /* end disableWBInterrupts */ /* * We got a packet transmitted interrupt. Release any buffers from complete * packets which have been transmitted. An error is returned only if we needed * to reset the LANCE or shut down the LANCE. */ Error packetXmitted() { int QPtr; u_short xmit1; /* accumulate flags from all buffers in packet */ u_short xmit2; /* accumulate flags2 from all buffers in packet */ int endQPtr; QPtr = XmitQTail; ReadXmitDesc(QPtr); xmit1 = xmit2 = 0; endQPtr = XmitQHead; IncrXmitQPtr(endQPtr); while ((QPtr != endQPtr) && ((XmitDescCopy.EXmitMsgStruct.EXmitFlags & XmitOwn) == RidgeOwned)) { /* The transmit queue is not empty, and the LANCE has released a buffer */ xmit1 |= XmitDescCopy.EXmitMsgStruct.EXmitFlags; xmit2 |= XmitDescCopy.EXmitMsgStruct.EXmitFlags2; /* * Update error statistics and XmitQTail only when we reach the end of packet * or when an irrecoverable error occurs which causes the LANCE to shut down * the transmitter. In the latter case, the LANCE will not complete processing * of the buffer chain until it has been restarted, so we must process the * error as we encounter it. No harm is done by treating this as an end of * packet condition. */ if ((XmitDescCopy.EXmitMsgStruct.EXmitFlags & EndXmitPacket) || (XmitDescCopy.EXmitMsgStruct.EXmitFlags2 & (RetryError | Underflow))) { /* * Keep track of any errors which occurred. Note that the errors * may be indicated in any of the transmit buffers of the chain. * However, they may only be included in the error statistics * when we reach an end of packet, otherwise they'd be counted twice. */ if (xmit1 & XmitStatsMask) { if (xmit1 & MoreRetries) { Stats.StatsMoreRetries++; DebugPrint(DebugWBStats, ("WBStats: xmit more retries\n")); } /* * The LANCE has a bug where the one retry flag gets set erroneously * when a late collision error occurs. Do not count that error. */ if ((xmit1 & OneRetry) && !(xmit2 & LateCollision)) { Stats.StatsOneRetry++; DebugPrint(DebugWBStats, ("WBStats: xmit one retry\n")); } if (xmit1 & Deferred) { Stats.StatsDeferred++; DebugPrint(DebugWBStats, ("WBStats: xmit deferred\n")); } if (xmit1 & XmitError) { if (xmit2 & XmitBufferError) { Stats.StatsXmitBuf++; DebugPrint(DebugWBStats, ("WBStats: xmit buffer error\n")); } if (xmit2 & LateCollision) { Stats.StatsLateCollision++; DebugPrint(DebugWBStats, ("WBStats: xmit late collision\n")); } if (xmit2 & LostCarrier) { Stats.StatsLostCarrier++; DebugPrint(DebugWBStats, ("WBStats: xmit lost carrier\n")); } if (xmit2 & RetryError) { /* * LANCE turned off transmitter. Restart the LANCE, * releasing the transmit buffer, so the same error * will not be processed again erroneously. */ Stats.StatsRetryError++; printf("excessive retries on transmission, TDR value = %x\n", XmitDescCopy.EXmitMsgStruct.EXmitFlags2 & TDRMask); wbetreset(); XmitQTail = QPtr; IncrXmitQPtr(XmitQTail); return(ErLANCERetryError); } if (xmit2 & Underflow) { /* * LANCE turned off transmitter. Restart the LANCE, * releasing the transmit buffer, so the same error * will not be processed again erroneously. */ Stats.StatsUnderflow++; TracePrint(TraceAll, ("transmitter underflow\n")); wbetreset(); XmitQTail = QPtr; IncrXmitQPtr(XmitQTail); return(ErXmitUnderflow); } } } XmitQTail = QPtr; IncrXmitQPtr(XmitQTail); xmit1 = xmit2 = 0; } IncrXmitQPtr(QPtr); ReadXmitDesc(QPtr); } /* while */ return(ErOK); } /* end packetXmitted */ /* * The LANCE reported an error condition. The wonderboard microcode has * cleared the error for us, so we need only keep track of the error for * network statistics, and institute any necessary error recovery. An error * is returned if we had to reset or shut down the LANCE. */ Error LANCEError(CSR0) unsigned CSR0; { if (CSR0 & CSR0_Babble) { Stats.StatsBabble++; DebugPrint(DebugWBStats, ("WBStats: CSR0 babble\n")); } if (CSR0 & CSR0_CollisionError) { Stats.StatsCollision++; DebugPrint(DebugWBStats, ("WBStats: CSR0 collision\n")); es.ac_if.if_collisions++; } if (CSR0 & CSR0_MissedPacket) { Stats.StatsMissedPkt++; DebugPrint(DebugWBStats, ("WBStats: CSR0 missed packet\n")); } if (CSR0 & CSR0_MemoryError) { /* LANCE turned off xmitter & receiver; catastrophic error */ Stats.StatsMemoryError++; DebugPrint(DebugWBStats, ("WBStats: memory error; CSR0 = %x\n", CSR0)); TracePrint(TraceAll,("memory error; LANCE restarted\n")); wbetreset(); return(ErLANCEMemErr); } return(ErOK); } /* end LANCEError */ /*************************************/ /* WonderBoard interface routines */ /*************************************/ /* * Read from the wonderboard. We will always read into a halfword data * area since the high order half word is normally not relevant. Callers * who need the entire word read should call d_read, and do any necessary * error processing themselves. */ Error WBRead(IOAddr, IOData) u_short *IOData; unsigned IOAddr; { register Error err; int iodata; /* * Do an d_read, maskin 8 9 : ; < = > ? @g the result to just the low order halfword. * Check the status which comes back on the read */ err = d_read(IOAddr,&iodata); *IOData = (short)(iodata & 0xffff); #ifdef DEBUG DebugPrint(DebugWBIO, ("Reading: IOAddr = %x; IOData = %x; err = %x\n", IOAddr, *IOData, err)); #endif /* DEBUG */ switch(err) { case 0: return(ErOK); case 1: err = ErIODataNotValid; break; case 2: err = ErIOTimeOut; break; case 3: err = ErIOTmOAndDNV; break; default: err = ErUnknownError; break; } printf("Reading from CIO: IOAddr = %x; error = ", IOAddr); WBWriteIOErr(err); printf("\n"); return(err); } /* end WBRead */ /* * Write to the wonderboard. Usually, the caller will write only a halfword, * as writes to the shared RAM require the high order halfword to be zero. * Writes to the mapping RAM use the entire word, so this routine supports * word writes. */ Error WBWrite(IOAddr, IOData) unsigned IOData; unsigned IOAddr; { register Error err; /* Do an IOWrite, checking the status which comes back */ err = d_write(IOAddr, IOData); DebugPrint(DebugWBIO, ("Writing: IOAddr = %x; IOData = %x; err = %x\n", IOAddr, IOData, err)); switch(err) { case 0: return(ErOK); case 1: err = ErIODataNotValid; break; case 2: err = ErIOTimeOut; break; case 3: err = ErIOTmOAndDNV; break; default: err = ErUnknownError; break; } printf("Writing to CIO: IOAddr = %x; IOData = %x; error = ", IOAddr, IOData); WBWriteIOErr(err); printf("\n"); return(err); } /* end WBWrite */ /* * Write some text describing the I/O error. */ WBWriteIOErr(err) int err; { switch(err) { case ErIOTimeOut: printf("IO time out"); break; case ErIODataNotValid: printf("IO data not valid"); break; case ErIOTmOAndDNV: printf("IO time out and IO data not valid"); break; default: printf("unknown error: %x", err); } } /* end WBWriteIOErr */ /* * Write a command to the wonderboard, waiting for the response to * indicate command completion and the availability of any data read */ Error WriteWBCommand(command) u_char command; { Error err; short protection; /* * Make sure the last command completed, and that there were no errors since * then (eg, interrupt queue overflow). */ /* WARNING: This code reads both EError & ECommand, which must both be zero */ err = WBRead(IORAMAddr + etherCB + OffsetFunc(etherCBCopy, EError), ðerCBCopy.EError); if (err != ErOK) return(err); if ((etherCBCopy.EError != 0) || (etherCBCopy.ECommand != 0)) { /* * We can still issue the command on a wonderboard interrupt queue * overflow error, but other errors require error recovery. */ if (etherCBCopy.EError == EIntOvflErr) { TracePrint(TraceAll, ("Interrupt Q overflow; command = %x, err = %x\n", etherCBCopy.ECommand, etherCBCopy.EError)); etherCBCopy.EError = 0; (void) WBWriteHi(IORAMAddr + etherCB + OffsetFunc(etherCBCopy, EError), etherCBCopy.EError); Stats.StatsIntQOverflow++; } else return(bad_Write()); } protection = spl7(); if (SleepOK) { DebugPrint(DebugWBTimer, ("Command timer set; D_Cpt_Cmd = %x, F_Cpt_Cmd = %x\n", D_Cpt_Cmd, F_Cpt_Cmd)); timeout(CmdTimeout,D_Cpt_Cmd,TimeoutWriteWB); } D_Cpt_Cmd += 1; TO_ErrCmd = ErOK; (void) WBWriteLo(IORAMAddr+etherCB+OffsetFunc(etherCBCopy,ECommand), command); if (SleepOK) { DebugPrint(DebugWBTimer, ("sleeping..WriteWBCmd; D_Cpt_Cmd = %x, F_Cpt_Cmd = %x\n", D_Cpt_Cmd, F_Cpt_Cmd)); sleep(WriteWBCommand,PRIOR); } splx(protection); return(TO_ErrCmd); } /* end WriteWBCommand */ /* interruption venant du controleur Ethernet */ wbetctrl(dev,IOIR) int dev; /* pour normaliser l'interface */ int IOIR; { /* process interrupt */ /* * WARNING: This code reads both EError & ECommand, * which must both be zero */ if (WBDriverInited) { F_Cpt_Cmd++; TO_ErrCmd = WBRead(IORAMAddr+etherCB+OffsetFunc(etherCBCopy, EError), ðerCBCopy.EError); if (TO_ErrCmd == ErOK) if ((etherCBCopy.ECommand == 0) && (etherCBCopy.EError == 0)) { /* command completed without error */ TO_ErrCmd = ErOK; } else TO_ErrCmd = bad_Write(); DebugPrint(DebugWBTimer, ("Cmd wakeup (wbctrl); D_Cpt_Cmd = %x, F_Cpt_Cmd = %x\n", D_Cpt_Cmd, F_Cpt_Cmd)); wakeup(WriteWBCommand); } } /* wbetctrl */ CmdTimeout(indice) int indice; { short protection; /* protection de la sequence */ /* timeout sur une commande au controleur ethernet */ protection = spl7(); DebugPrint(DebugWBTimer, ("Command timeout; D_Cpt_Cmd = %x, F_Cpt_Cmd = %x\n", D_Cpt_Cmd, F_Cpt_Cmd)); if (WBDriverInited) if (indice == F_Cpt_Cmd) { F_Cpt_Cmd++; TO_ErrCmd = ErTimeout; DebugPrint(DebugWBTimer, ("Cmd wakeup (timeout); D_Cpt_Cmd = %x, F_Cpt_Cmd = %x\n", D_Cpt_Cmd, F_Cpt_Cmd)); wakeup(WriteWBCommand); } splx(protection); } /* CmdTimeout */ Error bad_Write() { /* error on command */ switch (etherCBCopy.EError) { case EBadCmdErr: printf("bad command = %d, err = %x\n", etherCBCopy.ECommand, etherCBCopy.EError); etherCBCopy.EError = 0; (void) WBWriteHi(IORAMAddr + etherCB + OffsetFunc(etherCBCopy, EError), etherCBCopy.EError); return(EBadCmdErr + ErEtherCtrl); case EIntOvflErr: TracePrint(TraceAll, ("Interrupt Q overflow; command = %x, err = %x\n", etherCBCopy.ECommand, etherCBCopy.EError)); etherCBCopy.EError = 0; (void) WBWriteHi(IORAMAddr + etherCB + OffsetFunc(etherCBCopy, EError), etherCBCopy.EError); Stats.StatsIntQOverflow++; return(ErOK); case ECheckSumErr: printf("bad checksum in address PAL; command = %x, err = %x\n", etherCBCopy.ECommand, etherCBCopy.EError); etherCBCopy.EError = 0; (void) WBWriteHi(IORAMAddr + etherCB + OffsetFunc(etherCBCopy, EError), etherCBCopy.EError); return(ECheckSumErr + ErEtherCtrl); default: /* TracePrint(TraceAll,("invalid error or command returned; cmd = %x, err = %x\n", etherCBCopy.ECommand, etherCBCopy.EError)); */ printf("invalid error or command returned; cmd = %x, err = %x\n", etherCBCopy.ECommand, etherCBCopy.EError); etherCBCopy.EError = 0; (void) WBWriteHi(IORAMAddr + etherCB + OffsetFunc(etherCBCopy, EError), etherCBCopy.EError); return(EInvalidError + ErEtherCtrl); } /* switch */ } /* end bad_Write */ #ifdef DEBUG /* * Dump the descriptors elements */ DumpDesc() { int iloc; u_short *IOAddr, *RidgeAddr; RidgeAddr = (u_short *) &Anneau[0]; IOAddr = (u_short *) (IORAMAddr + etherRecvRing); for (iloc=0; iloc<128; iloc++) (void) WBRead(IOAddr++,RidgeAddr++); IOAddr = (u_short *) (IORAMAddr + etherXmitRing); for (iloc=0; iloc<128; iloc++) (void) WBRead(IOAddr++,RidgeAddr++); } #endif /* DEBUG */ /* * Read the specified receive descriptor element */ ReadRecvDesc(BufNum) int BufNum; { register u_short *IOAddr; register u_short *RidgeAddr; IOAddr = (u_short *) (IORAMAddr + etherRecvRing + (BufNum * RingDescSize)); RidgeAddr = RecvDescCopy.ERecvHalfWord; (void) WBRead(IOAddr++, RidgeAddr++); (void) WBRead(IOAddr++, RidgeAddr++); (void) WBRead(IOAddr++, RidgeAddr++); (void) WBRead(IOAddr, RidgeAddr); return; } /* end ReadRecvDesc */ /* * Write the specified receive descriptor element. Assumes the caller * has verified proper ownership of the buffer */ Error WriteRecvDesc(BufNum) int BufNum; { int i; Error err = ErOK; for (i = 0; i < RingDescSize/2; i++) { err |= WBWrite(IORAMAddr + etherRecvRing + (BufNum * RingDescSize) + (i * 2), RecvDescCopy.ERecvHalfWord[i]); } if (err != ErOK) err = ErWriteError; return(err); } /* end WriteRecvDesc */ /* * Read the specified transmit descriptor element */ ReadXmitDesc(BufNum) int BufNum; { register u_short *IOAddr; register u_short *RidgeAddr; IOAddr = (u_short *) (IORAMAddr + etherXmitRing + (BufNum * RingDescSize)); RidgeAddr = XmitDescCopy.EXmitHalfWord; (void) WBRead(IOAddr++, RidgeAddr++); (void) WBRead(IOAddr++, RidgeAddr++); (void) WBRead(IOAddr++, RidgeAddr++); (void) WBRead(IOAddr, RidgeAddr); return; } /* end ReadXmitDesc */ /* * Write the specified transmit descriptor element. Assumes the caller * has verified proper ownership of the buffer */ Error WriteXmitDesc(BufNum) int BufNum; { int i; Error err = ErOK; for (i = 0; i < RingDescSize/2; i++) { err |= WBWrite(IORAMAddr + etherXmitRing + (BufNum * RingDescSize) + (i * 2), XmitDescCopy.EXmitHalfWord[i]); } if (err != ErOK) err = ErWriteError; return(err); } /* end WriteXmitDesc */ /* * Verify that the device specified on the command line is indeed * a wonderboard device. */ Error GetWonderBoard() { #define DeviceNumShiftCnt 24 #define BoardTypeShiftCnt 24 #define WonderBoardType 0X40 #define AltWonderBoardType 0X41 unsigned Reply; Error err; if ((WBDevice = ctladdr(CIODEBUG,0))== -1) WBDevice = ctladdr(CIODEBUG,4); /* type ctrl ethernet */ /* Verify that the board is a wonderboard */ if ((d_read((WBDevice << DeviceNumShiftCnt), &Reply) == ErOK) && (((Reply >> BoardTypeShiftCnt) == WonderBoardType) || ((Reply >> BoardTypeShiftCnt) == AltWonderBoardType))) { TracePrint(TraceNet, ("WonderBoard ethernet present, device # = %x\n", WBDevice)); WBPresent = TRUE; } else { TracePrint(TraceNet, ("hardware at address %x is not a CIO board\n", WBDevice)); WBPresent = FALSE; return(ErNoWonderBoard); } IORAMAddr = WBDevice << DeviceNumShiftCnt; IOMapAddr = IORAMAddr + MemMapFlag; /* * Read the revision codes for the board. If they are incompatible with * the current revision of software, an error will be returned. */ err = ReadRevCodes(); if (err != ErOK) return(err); WBDriverInited = TRUE; return(err); } /* end GetWonderBoard */ /* * Allocate the transmit and receive buffers, fix them in memory, and * translate their addresses to real addresses for use by wonderboard. * Any errors are returned to the caller for error processing. * * WARNING: * * This code assumes that an integral number of buffers fit exactly in * one page. Buffers do not span pages, so pages need not be contiguous. */ Error AllocDescRings() { int i,j; /* * Allocate the receive buffers; fix each page in memory, * translate its virtual address to its real address, and * save the virtual and real addresses for each buffer in the * page. */ for (i = 0; i < RecvNumBufs; i += BufsPerPage) { RecvBufs[i] = sptalloc(1 , PG_V | PG_KR , 0); RealRecvBufs[i] = svtophys(RecvBufs[i]); for (j=1; ja[i+1]; es.ac_enaddr[i+1] = localAddress.a[i+1] = address->a[i]; } DebugPrint(DebugWBInit, ("Physical Address = %x %x %x %x %x %x\n", localAddress.a[0], localAddress.a[1], localAddress.a[2], localAddress.a[3], localAddress.a[4], localAddress.a[5])); } else err = ErReadError; return(err); } /* end ReadPhysicalAddr */ /* * Set up the logical address filter for multicast. Note that we do not use * this feature currently. */ SetLogicalAddrFilter(filter) NodeAddrFilter *filter; { int i; /* * Zero the logical address filter for multicast, since we do not use this * feature. */ for (i = 0; i < LogicalAddrLen; i++) filter->a[i] = 0; } /* end SetLogicalAddrFilter */ /* * Set up our copy of the initialization control block */ Error CreateInitBlock() { Error err; InitBlockCopy.EMode = DefaultModeReg; err = ReadPhysicalAddr(&(InitBlockCopy.EPhysicalAddr)); if (err != ErOK) return(err); SetLogicalAddrFilter(&(InitBlockCopy.ELogicalAddrFilter)); InitBlockCopy.ERecvDescRingLo = etherRecvRing & HalfWordMask; InitBlockCopy.ERecvRingLength = LANCERecvNumBufs << LengthShiftCount; InitBlockCopy.ERecvDescRingHi = (etherRecvRing >> HalfWordShiftCnt) & HalfWordMask; InitBlockCopy.EXmitDescRingLo = etherXmitRing & HalfWordMask; InitBlockCopy.EXmitRingLength = LANCEXmitNumBufs << LengthShiftCount; InitBlockCopy.EXmitDescRingHi = (etherXmitRing >> HalfWordShiftCnt) & HalfWordMask; return(err); } /* end CreateInitBlock */ /* * Write our copy of the initialization control block to the shared memory * on the wonderboard */ Error WriteInitBlock() { #define maxIndex sizeof(InitBlockStruct) int i; unsigned IOAddr; unsigned IOData; Error err = ErOK; IOAddr = IORAMAddr + etherInitBlock; DebugPrint(DebugWBInit, ("Writing Init Block\n")); for (i = 0; i < maxIndex; i += IOSize, IOAddr += IOSize) { IOData = *((u_short *) (((char *)(&InitBlockCopy)) + i)); err |= WBWrite(IOAddr, IOData); } if (err != ErOK) { printf("could not write initialization block\n"); err = ErWriteError; } return(err); } /* end WriteInitBlock */ /* * Write out the transmit and receive descriptor rings into shared memory * for use by wonderboard */ Error InitDescRings() { int i; int BufferNum = 0; Error err = ErOK; /* * Initialize each recv buffer descriptor in the local copy, writing * each one to the wonderboard and initializing its mapping RAM entry. * These buffers are given to the LANCE, so we can not write in these * descriptors until data is received into the buffers and the LANCE * returns the buffers and their descriptors to us. */ RecvDescCopy.ERecvMsgStruct.ERecvFlags = DefaultRecvFlags; RecvDescCopy.ERecvMsgStruct.ERecvBuffByteCnt = DefaultByteCnt; RecvDescCopy.ERecvMsgStruct.ERecvMsgByteCnt = 0; DebugPrint(DebugWBInit, ("Writing Recv Desc Ring\n")); for (i = 0; i < RecvNumBufs; i++) { RecvDescCopy.ERecvMsgStruct.ERecvBuffAddrLo = ((RealRecvBufs[i]) & AddrLoMask) + WonderRidgeFlag; RecvDescCopy.ERecvMsgStruct.ERecvBuffAddrHi = SwapBits(BufferNum); err |= WBWrite(IOMapAddr + BufferNum, (RealRecvBufs[i]) & AddrHiMask); err |= WriteRecvDesc(BufferNum); BufferNum++; } if (err != ErOK) { printf("could not write recv descriptor ring\n"); return(ErWriteError); } /* * Initialize each xmit buffer descriptor in the local copy, writing * each one to the wonderboard and initializing its mapping RAM entry. * These buffers are kept by the driver until we are ready to transmit. */ XmitDescCopy.EXmitMsgStruct.EXmitFlags = DefaultXmitFlags; XmitDescCopy.EXmitMsgStruct.EXmitBuffByteCnt = DefaultByteCnt; XmitDescCopy.EXmitMsgStruct.EXmitFlags2 = DefaultXmitFlags2; DebugPrint(DebugWBInit, ("Writing Xmit Desc Ring\n")); for (i = 0; i < XmitNumBufs; i++) { XmitDescCopy.EXmitMsgStruct.EXmitBuffAddrLo = ((RealXmitBufs[i]) & AddrLoMask) + WonderRidgeFlag; XmitDescCopy.EXmitMsgStruct.EXmitBuffAddrHi = SwapBits(BufferNum); err |= WBWrite(IOMapAddr + BufferNum, (RealXmitBufs[i]) & AddrHiMask); err |= WriteXmitDesc(BufferNum - RecvNumBufs); BufferNum++; } if (err != ErOK) { printf("could not write xmit descriptor ring\n"); err = ErWriteError; } /* initialize local queue pointers to indicate the queues are empty */ RecvQHead = 0; XmitQTail = 0; XmitQHead = TempXmitQHead = XmitNumBufs - 1; return(err); } /* end InitDescRings */ /* * Initialize the copies of the CSRs, and write them to shared RAM. Issue * init and start commands */ Error InitStartCmds() { int i; Error err = ErOK; short protection; /* * Write out the CSRs, issuing the init command. */ etherCBCopy.EWriteData.EReg0 = InitCSR0; etherCBCopy.EWriteData.EReg1 = etherInitBlock & CSR1Mask; etherCBCopy.EWriteData.EReg2 = (etherInitBlock >> HalfWordShiftCnt) & CSR2Mask; etherCBCopy.EWriteData.EReg3 = DefaultCSR3; DebugPrint(DebugWBInit, ("Writing CSRs\n")); protection = spl7(); for (i = 0; i < sizeof(regStruct); i += IOSize) { err |= WBWrite(IORAMAddr + etherCB + OffsetFunc(etherCBCopy, EWriteData.EReg0) + i, *((u_short *) (((char *) (ðerCBCopy.EWriteData.EReg0)) + i))); } if (err != ErOK) { printf("could not write LANCE registers\n"); err = ErWriteError; splx(protection); return(err); } SleepOK = TRUE; err = doWBWriteRegsCmd; if (err != ErOK) { printf("could not write LANCE registers; err = %d\n", err); splx(protection); return(err); } /* * Wait for the Init Done interrupt. */ TO_ErrInit = 0; DebugPrint(DebugWBTimer, ("Init timer set; D_Cpt_Init = %x, F_Cpt_Init = %x\n", D_Cpt_Init, F_Cpt_Init)); timeout(StartTimeout,D_Cpt_Init++,TimeoutInit); if (D_Cpt_Init != F_Cpt_Init) /* sinon IT deja arrivee */ { DebugPrint(DebugWBTimer, ("sleeping..InitStartCmds; D_Cpt_Init = %x, F_Cpt_Init = %x\n", D_Cpt_Init, F_Cpt_Init)); sleep(InitStartCmds,PRIOR); } splx(protection); err = TO_ErrInit; if (err != ErOK) { printf("error waiting for Init Done interrupt, err = %d\n", err); return(err); } /* * Issue the start command. */ etherCBCopy.EWriteData.EReg0 = StartCSR0; DebugPrint(DebugWBInit, ("Issuing Start command in CSR0\n")); err = WBWrite(IORAMAddr + etherCB + OffsetFunc(etherCBCopy, EWriteData.EReg0), (etherCBCopy.EWriteData.EReg0)); if (err == ErOK) { SleepOK = TRUE; err = doWBWriteReg0Cmd; } if (err != ErOK) { printf("could not write start command in CSR0; err = %d\n", err); } return(err); } /* end InitStartCmds */ /* timeout sur initstartcommande */ StartTimeout(indice) int indice; { short protection; /* protection de la sequence */ protection = spl7(); DebugPrint(DebugWBTimer, ("Init timeout; D_Cpt_Init = %x, F_Cpt_Init = %x\n", D_Cpt_Init, F_Cpt_Init)); if (WBDriverInited) if (indice == F_Cpt_Init) { TO_ErrInit = ErTimeout; F_Cpt_Init++; DebugPrint(DebugWBTimer, ("Init wakeup (timeout); D_Cpt_Init = %x, F_Cpt_Init = %x\n", D_Cpt_Init, F_Cpt_Init)); wakeup(InitStartCmds); } splx(protection); } /* end StartTimeout */ /* * Get ownership of the current buffer (the buffer which is the temporary head * of the transmit queue). Wait for it if the transmit queue is full. Return * status indicating whether we were able to get the buffer in a reasonable * amount of time. */ Error GetXmitBuf() { short protection; ReadXmitFlags(XmitQHead); if ((TempXmitQHead == XmitQTail) && ((XmitDescCopy.EXmitMsgStruct.EXmitFlags & XmitOwn) != RidgeOwned)) { /* transmit queue is full */ printf("GetXmitBuf: ran out of xmit buffers\n"); return(ErBufWaitTimeOut); } ReadXmitDesc(TempXmitQHead); return(ErOK); } /* end GetXmitBuf */ /* * Test the validity of the current receive buffer (the buffer whose * descriptor is in our RAM copy). Return any unusual conditions. */ Error TestRecvBufValid(QPtr) int *QPtr; { #ifdef DEBUG if ((RecvDescCopy.ERecvMsgStruct.ERecvBuffAddrHi) != SwapBits(*QPtr)) { printf("Mapping RAM index (%x) for recv buffer # %x trashed\n", RecvDescCopy.ERecvMsgStruct.ERecvBuffAddrHi, SwapBits(*QPtr)); return(ErBadMappingRAM); } #endif /* DEBUG */ if ((RecvDescCopy.ERecvMsgStruct.ERecvFlags & RecvOwn) != RidgeOwned) return(ErNoData); if (RecvDescCopy.ERecvMsgStruct.ERecvFlags & RecvError) { DebugPrint(DebugWBStats, ("WBStats: error status on receive, flags = %x\n", RecvDescCopy.ERecvMsgStruct.ERecvFlags)); /* * Framing Error and CRC Error are valid only in the last buffer of * a packet. Overflow is only valid before the last buffer of a * packet. All other fields are assumed to only be set in the last * buffer of a packet, otherwise an error could be counted more * than once: once or more before the complete packet is received, * and once after. */ if ((RecvDescCopy.ERecvMsgStruct.ERecvFlags & (FramingError | EndRecvPacket)) == (FramingError | EndRecvPacket)) { Stats.StatsFramingErr++; DebugPrint(DebugWBStats, ("WBStats: recv framing error\n")); } if ((RecvDescCopy.ERecvMsgStruct.ERecvFlags & (Overflow | EndRecvPacket)) == Overflow) { Stats.StatsOverflow++; DebugPrint(DebugWBStats, ("WBStats: recv overflow\n")); } if ((RecvDescCopy.ERecvMsgStruct.ERecvFlags & (CRCError | EndRecvPacket)) == (CRCError | EndRecvPacket)) { Stats.StatsCRCError++; DebugPrint(DebugWBStats, ("WBStats: recv CRC error\n")); } /* * Receive buffer error occurs when the LANCE needed to chain to the * next receive buffer, but was unable to do so because it did not own * the buffer. This implies an end of packet condition, although it * is not explicitly set. Set the end of packet for the caller. */ if (RecvDescCopy.ERecvMsgStruct.ERecvFlags & RecvBufferError) { RecvDescCopy.ERecvMsgStruct.ERecvFlags |= EndRecvPacket; Stats.StatsRecvBuf++; DebugPrint(DebugWBStats, ("WBStats: recv buffer error\n")); } return(ErRecvError); } return(ErOK); } /* end TestRecvBufValid */ /* * Find the buffer which is the end of the current packet. Verify that it, * the buffer which is the start of packet, and all buffers in between are * error-free and owned by us rather than the LANCE. Note that the first * error encountered is usually the error which will be returned, even if * we continue perusing the queue for the end of packet. The queue pointer * is updated to point to the end of the packet, if any. */ Error FindRecvPktEnd(QPtr) int *QPtr; { Error err; Error newerr; int count = 0; *QPtr = RecvQHead; ReadRecvDesc(*QPtr); /* check validity of first buffer in packet */ err = TestRecvBufValid(QPtr); if (err == ErNoData) return(err); if ((RecvDescCopy.ERecvMsgStruct.ERecvFlags & StartRecvPacket) == 0) { TracePrint(TraceAll, ("No start packet on receive\n")); if (!err) err = ErBadRecvFlags; } /* * check validity of remaining buffers in packet, while finding the * last buffer in the packet */ while ((RecvDescCopy.ERecvMsgStruct.ERecvFlags & EndRecvPacket) == 0) { IncrRecvQPtr((*QPtr)); ReadRecvDesc(*QPtr); newerr = TestRecvBufValid(QPtr); if (!err) err = newerr; if (newerr == ErNoData) return(ErNoData); if (RecvDescCopy.ERecvMsgStruct.ERecvFlags & StartRecvPacket) { TracePrint(TraceAll, ("Encountered another start of packet before end of packet\n")); if (!err) err = ErBadRecvFlags; } /* * We assume that we will eventually encounter either an end of packet or * a buffer belonging to the LANCE. This is not necessarily so, e.g., * receiving data from a babbling node exhausts all of the receive buffers, * sets receive buffer error, but does not set end of packet. (We have a * special hack for this in TestRecvBufValid, but there could be other cases * which invalidate our assumption.) So, make sure we don't loop forever * reading receive buffer descriptors. Instead, reset to clear the error * and indicate there is no more data currently. This relies on the higher * level protocols to recover the data we've thrown away. */ count++; if (count >= RecvNumBufs) { printf("All receive buffers used by one packet!\n"); wbetreset(); return(ErNoData); } } /* while */ return(err); } /* end FindRecvPktEnd */ /* * Initialize the wonderboard */ Error WB_Init() { register Error err; /* Check if self test passed on the board */ WBRead(IORAMAddr + DiagCtrlBlk + OffsetFunc(diagCBCopy, DB_BdFailures), &(diagCBCopy.DB_BdFailures)); if (diagCBCopy.DB_BdFailures != ErOK) { err = (unsigned) (diagCBCopy.DB_BdFailures) + ErSelfTest; if ((err < ErUnknownSelfTestErr) #ifdef DEBUG || (trace & TraceErrors) #endif DEBUG ) { printf("self test error: "); switch (err) { case ErLANCERegs: printf("LANCE register test"); break; case ErLocalMemory: printf("local memory test"); break; case ErSharedMemory: printf("shared memory test"); break; case ErLANCEInit: printf("LANCE initialization test"); break; default: printf("unknown self test error"); } printf(", error = %x\n", err); if (err < ErUnknownSelfTestErr) return(err); } } D_Cpt_Init = 0; F_Cpt_Init = 0; F_Cpt_Cmd = 0; D_Cpt_Cmd = 0; /* enable interrupts for the ethernet controller */ SleepOK = TRUE; err = doWBEnEtherCmd; if (err != ErOK) { printf("cannot enable CIO ethernet command interrupts %d\n", err); return(err); } /* * Reinitialize the LANCE. Issue a stop command to the LANCE to get it * into a known state. Note that CSR1 is corrupted when the stop command * is issued. Since we subsequently reinitialize it, this should not * present a problem. */ etherCBCopy.EWriteData.EReg0 = CSR0_InterruptEnable + CSR0_StopCmd; err = WBWrite(IORAMAddr + etherCB + OffsetFunc(etherCBCopy, EWriteData.EReg0), etherCBCopy.EWriteData.EReg0); if (err == ErOK) { SleepOK = TRUE; err = doWBWriteReg0Cmd; } if (err != ErOK) { printf("could not write CSR0; err = %d\n", err); return(err); } /* Enable interrupts for the LANCE */ SleepOK = TRUE; err = doWBEnLANCECmd; if (err != ErOK) { printf("cannot enable CIO LANCE interrupts %d\n", err); return(err); } err = CreateInitBlock(); if (err == ErOK) { err = WriteInitBlock(); if (err == ErOK) { err = InitDescRings(); if (err == ErOK) err = InitStartCmds(); } } return(err); } /* end WB_Init */ /* * Read receive data from Wonderboard. If any buffer in the packet has an * error, discard the packet and return the error. If a complete packet is * not available, return status indicating that no data is available. */ WB_Read(sourceAddr, destAddr, protocolID) NodeAddressType *sourceAddr; NodeAddressType *destAddr; Halfword *protocolID; { int i; int LastPktPtr; Error err; Boolean acceptPacket; tryAgain: err = FindRecvPktEnd(&LastPktPtr); /* * Discard all buffers in the packet if any of them had any type of error. * If the error was recoverable, try to get the next packet. Otherwise, * return the error. */ if (err != ErOK) { if (err != ErNoData) { while (RecvQHead != LastPktPtr) { ReleaseRecvBuf(RecvQHead); IncrRecvQPtr(RecvQHead); } ReleaseRecvBuf(RecvQHead); IncrRecvQPtr(RecvQHead); } if (err == ErRecvError) goto tryAgain; return(err); } /* * Verify that the packet is for us. Due to bugs in the Rev B LANCE parts, * we end up receiving packets which we shouldn't. Accept packets with * our physical address. Also accept broadcast packets, so long as the * last packet we transmitted was not a broadcast. * * The Rev C LANCE parts will only receive packets which are for us, but * they will occasionally insert one byte in front of the packet, thus we * must verify the address is valid. */ acceptPacket = TRUE; /* check if address is our physical address */ for (i = 0; i < AddressLen; i++) { if (*(((u_char *) RecvBufs[RecvQHead]) + i) != localAddress.a[i]) { acceptPacket = FALSE; break; } } if (!acceptPacket) { /* address did not match our physical address; check if it's a broadcast */ acceptPacket = TRUE; for (i = 0; i < AddressLen; i++) { if (*(((u_char *) RecvBufs[RecvQHead]) + i) != etherbroadcastaddr[i]) { acceptPacket = FALSE; break; } } } if (!acceptPacket) { /* discard the packet, since it's not for us */ TracePrint(TraceAll, ("WB_Read: received extraneous packet\n")); #ifdef DEBUG if (trace & TraceAll) dumpWBFrame(RecvBufs[RecvQHead], "Reading", MIN(RecvDescCopy.ERecvMsgStruct.ERecvMsgByteCnt, BufferSize)); #endif /* DEBUG */ while (RecvQHead != LastPktPtr) { ReleaseRecvBuf(RecvQHead); IncrRecvQPtr(RecvQHead); } ReleaseRecvBuf(RecvQHead); IncrRecvQPtr(RecvQHead); goto tryAgain; } /* Discard packets which are too short to be legal */ if ((((int) RecvDescCopy.ERecvMsgStruct.ERecvMsgByteCnt) - (sizeof(struct ether_header) + EtherFCSSize)) < 0) { #ifdef DEBUG TracePrint(TraceAll, ("WB_Read: received too short packet\n")); DumpDesc(); if (trace & TraceAll) dumpWBFrame(RecvBufs[RecvQHead], "Reading", MIN(RecvDescCopy.ERecvMsgStruct.ERecvMsgByteCnt, BufferSize)); #endif /* DEBUG */ nbpkterr++; printf("%x paquets veroles\n",nbpkterr); while (RecvQHead != LastPktPtr) { ReleaseRecvBuf(RecvQHead); IncrRecvQPtr(RecvQHead); } ReleaseRecvBuf(RecvQHead); IncrRecvQPtr(RecvQHead); goto tryAgain; } /* read destination address, source address, and protocol ID (from,to,length) */ bcopy(((u_char *) RecvBufs[RecvQHead]), (u_char *) destAddr, sizeof(*destAddr)); bcopy(((u_char *) RecvBufs[RecvQHead] + sizeof(*destAddr)), (u_char *) sourceAddr, sizeof(*sourceAddr)); bcopy(((u_char *) RecvBufs[RecvQHead] + sizeof(*destAddr) + sizeof(*sourceAddr)), (u_char *) protocolID, sizeof(*protocolID)); WBLength = (int) RecvDescCopy.ERecvMsgStruct.ERecvMsgByteCnt; WBOffset = 0; #ifdef DEBUG if (trace & TraceFrames) dumpWBFrame(RecvBufs[RecvQHead], "Reading", MIN(WBLength, BufferSize)); #endif /* DEBUG */ return(ErOK); } /* end WB_Read */ /* fonction permettant de faire un traitement des trames recues en mode user */ /* a partir d'une interruption */ wbetopen() { struct ifqueue *ifq; u_short protection; struct mbuf *m; if (tcpipOpen) return; tcpipOpen = TRUE; ifq = &ipintrq; while (1) { sleep(wbetopen,PRIOR); do { protection = spl7(); IF_DEQUEUE(ifq,m); splx(protection); ipintr(m); } while (m); } } #ifdef DEBUG /*-----------------------------------*/ /* DEBUG2 */ /*-----------------------------------*/ debug2 (ptchaine,v0,v1,v2,v3,v4) char *ptchaine ; unsigned long v0 ; unsigned long v1 ; unsigned long v2 ; unsigned long v3 ; unsigned long v4 ; { register short i ; unsigned long a[8] ; unsigned long var[5] ; unsigned short car_courant; unsigned long *ptvar ; short s ; s = spl7(); var[0] = v0; var[1] = v1; var[2] = v2; var[3] = v3; var[4] = v4; ptvar = &var[0]; car_courant = ligne_courante * LG_LIGNE; if (init_debug == 0) { init_debug++; printf("adresse zone de trace du communicateur = %x\n",&texte[0]); } while (*ptchaine != '\0') { if (*ptchaine != '%') texte[car_courant++] = *(ptchaine++); else { ptchaine = ptchaine + 2; a[7] = *ptvar++ ; a[6] = a[7] >> 4 ; a[5] = a[6] >> 4 ; a[4] = a[5] >> 4 ; a[3] = a[4] >> 4 ; a[2] = a[3] >> 4 ; a[1] = a[2] >> 4 ; a[0] = a[1] >> 4 ; for (i=0;(i != 7) && (a[i] == 0);i++); for (;(i <= 7);texte[car_courant++] = ascii[a[i++] & 0xf] ); } } ligne_courante++; if (ligne_courante >= NB_LIGNES) ligne_courante = 0; car_courant = ligne_courante * LG_LIGNE; for (i=0;i < 16 ; texte[car_courant+(i++)] = '!'); for ( ;i < LG_LIGNE ; texte[car_courant+(i++)] = ' '); splx(s); return ; } #endif /* "%W% %E%" */ /* wonder.c */ /* * Ridge Ethernet Driver - Wonderboard interface */ #include #include #include #include #include #include #include #include #include #include #define PageSize NBPP #define MBIGSIZE PageSize typedef unsigned long n_long; #include "../net/if.h" #include "../net/route.h" #include "../netinet/in.h" #include "../netinet/ip.h" #include "../netinet/if_ether.h" #ifdef DEBUG #include "trace.h" #endif #include "wonder.h" #include "lance.h" typedef unsigned int Error; typedef unsigned int Boolean; typedef unsigned short Halfword; #define ErOK 0 #define FALSE 0 #define TRUE 1 #ifdef DEBUG /* variables pour debug */ #define TAILLE_DEBUG 0x10000 #define LG_LIGNE 0x40 #define NB_LIGNES TAILLE_DEBUG/LG_LIGNE u_short Anneau[256]; char texte[TAILLE_DEBUG]; unsigned short ligne_courante = 0; unsigned short init_debug = 0; char ascii[0x10] = {'0','1','2','3','4','5','6','7','8', '9','a','b','c','d','e','f'}; #endif /* DEBUG */ unsigned short nbpkterr = 0; Boolean tcpipOpen = FALSE; /* Global routines defined in this module */ int wbetattach(); int wbetinit(); int wbetioctl(); int wbetoutput(); int wbetopen(); int wbetreset(); /* External data structures */ extern struct ifnet loif; extern u_char etherbroadcastaddr[6]; extern struct in_addr arpmyaddr(); /* External routines referenced (non-integer functions) */ extern struct mbuf *m_get(); extern struct mbuf *m_freem(); extern struct mbuf *m_getbig(); extern struct mbuf *m_copy(); extern Error d_read(); extern Error d_write(); /* Local routines (non-integer functions) requiring forward references */ Error bad_Write(); Error AllocDescRings(); struct mbuf *copyLANCEBufToMbuf(); FrameType *sptalloc(); Error copyMbufToLANCEBuf(); Error GetXmitBuf(); Error GetWonderBoard(); Error LANCEError(); Error packetXmitted(); Error ReadRevCodes(); Error WB_Init(); Error WBRead(); Error WBWrite(); Error InitStartCmds(); Error WriteWBCommand(); /* fonction de timeout */ int XmitTimeout(); int CmdTimeout(); int StartTimeout(); int BufTimeout(); /*************************************/ /* VAR beginning of global variables */ /*************************************/ /* * Ethernet software structure for the interface. * * Each interface is referenced by a network interface structure, * es.ac_if, which the routing code uses to locate the interface. * This structure contains the output queue for the interface, its address, ... */ static struct arpcom es; /* common Ethernet structures */ NodeAddressType localAddress; Boolean SleepOK; /* TRUE pour synchroniser les requetes au controleur */ /* FALSE quand on est sous IT */ Boolean WBPresent; /* TRUE if wonderboard is present */ Boolean WBDriverInited; /* TRUE if ethernet is present & driver init'd OK */ static Boolean ipintrqFull; /* TRUE if we can't give a buffer to ip */ /* pointers to buffers */ FrameType *RecvBufs[RecvNumBufs]; /* points to buffers we will put read data into */ FrameType *XmitBufs[XmitNumBufs]; /* where to find data to write */ realAddress RealRecvBufs[RecvNumBufs]; /* real address of RecvBufs */ realAddress RealXmitBufs[XmitNumBufs]; /* real address of XmitBufs */ int RecvQHead; /* index into RecvBufs for next buf to read */ /* XmitQ is full when buffer at XmitQHead belongs */ /* to LANCE and TempXmitQHead = XmitQTail */ int XmitQHead; /* index into XmitBufs for last buffer filled */ /* next packet will start at next buffer */ int XmitQTail; /* index into XmitBufs of first buffer of next packet */ /* for LANCE to free */ int TempXmitQHead; /* used in filling buffers for a single packet */ /* error statistics */ /* WARNING: As a global variable, we assume this structure is initially zero */ struct { int StatsMoreRetries; /* xmit stats */ int StatsOneRetry; int StatsDeferred; int StatsXmitBuf; int StatsUnderflow; int StatsLateCollision; int StatsLostCarrier; int StatsRetryError; int StatsBabble; /* general stats */ int StatsCollision; int StatsMissedPkt; int StatsMemoryError; int StatsFlushedLANCEInt; int StatsIntQOverflow; int StatsFramingErr; /* receive stats */ int StatsOverflow; int StatsCRCError; int StatsRecvBuf; } Stats; InitBlockStruct InitBlockCopy; etherCBStruct etherCBCopy; diagCBStruct diagCBCopy; RecvMsgDesc RecvDescCopy; XmitMsgDesc XmitDescCopy; /* erreurs retournees par les differents timeouts */ Error TO_ErrXmit; Error TO_ErrInit; Error TO_ErrCmd; #define PRIOR 20 /* etat d'activation des differents entrees sorties */ unsigned int D_Cpt_Init; /* nombre init demande */ unsigned int F_Cpt_Init; /* nombre init recu */ unsigned int D_Cpt_Cmd; /* nombre commandes envoyees */ unsigned int F_Cpt_Cmd; /* nombre commandes recues */ int WBDevice; /* I/O address of WonderBoard */ int WBLength; int WBOffset; int IOMapAddr; int IORAMAddr; /*******************************/ /* MACROS */ /*******************************/ /* WARNING: This macro must be invoked with the parameter "string" in parentheses */ #ifdef DEBUG #define DebugPrint(flag,string) if (xebug & flag) debug2 string #else #define DebugPrint(flag,string) /* nop */ #endif /* DEBUG */ /* WARNING: This macro must be invoked with the parameter "string" in parentheses */ #ifdef DEBUG #define TracePrint(flag,string) if (trace & flag) debug2 string #else #define TracePrint(flag,string) /* nop */ #endif /* DEBUG */ #ifdef DEBUG #define doWBWriteRegsCmd \ WriteWBCommand(EWriteRegsCmd); \ DebugPrint(DebugWBCommands,("WriteRegsCmd\n")) #define doWBWriteReg0Cmd \ WriteWBCommand(EWriteReg0Cmd); \ DebugPrint(DebugWBCommands,("WriteReg0Cmd\n")) #define doWBReadAddrCmd \ WriteWBCommand(EReadAddrCmd); \ DebugPrint(DebugWBCommands,("ReadAddrCmd\n")) #define doWBDmdXmitCmd \ WriteWBCommand(EDemandXmitCmd); \ DebugPrint(DebugWBCommands,("DemandXmitCmd\n")) #define doWBEnLANCECmd \ WriteWBCommand(EEnLANCECmd); \ DebugPrint(DebugWBCommands,("EnableLANCECmd\n")) #define doWBDisLANCECmd \ WriteWBCommand(EDisLANCECmd); \ DebugPrint(DebugWBCommands,("DisableLANCECmd\n")) #define doWBEnEtherCmd \ WriteWBCommand(EEnEtherCmd); \ DebugPrint(DebugWBCommands,("EnableEtherCmd\n")) #define doWBDisEtherCmd \ WriteWBCommand(EDisEtherCmd); \ DebugPrint(DebugWBCommands,("DisableEtherCmd\n")) #else #define doWBWriteRegsCmd WriteWBCommand(EWriteRegsCmd) #define doWBWriteReg0Cmd WriteWBCommand(EWriteReg0Cmd) #define doWBReadAddrCmd WriteWBCommand(EReadAddrCmd) #define doWBDmdXmitCmd WriteWBCommand(EDemandXmitCmd) #define doWBEnLANCECmd WriteWBCommand(EEnLANCECmd) #define doWBDisLANCECmd WriteWBCommand(EDisLANCECmd) #define doWBEnEtherCmd WriteWBCommand(EEnEtherCmd) #define doWBDisEtherCmd WriteWBCommand(EDisEtherCmd) #endif /* DEBUG */ #define OffsetFunc(structure,element) \ (((u_char *) &structure.element) - ((u_char *) &structure)) /* WARNING: The caller is expected to verify IOData is a u_char */ #define WBWriteHi(IOAddr,IOData) \ WBWrite(IOAddr + 1, IOData << ByteShiftCount) #define WBWriteLo(IOAddr,IOData) \ WBWrite(IOAddr + BHE - 1, IOData & LoByteMask) #define ReadXmitFlags(BufNum) \ (void) WBRead(IORAMAddr + etherXmitRing + (BufNum * RingDescSize) + \ OffsetFunc(XmitDescCopy, EXmitHalfWord[1]), \ &(XmitDescCopy.EXmitHalfWord[1])) #define WriteRecvFlags(BufNum) \ (void) WBWriteHi(IORAMAddr + etherRecvRing + (BufNum * RingDescSize) + \ OffsetFunc(RecvDescCopy, ERecvMsgStruct.ERecvFlags), \ RecvDescCopy.ERecvMsgStruct.ERecvFlags) #define WriteXmitFlags(BufNum) \ (void) WBWriteHi(IORAMAddr + etherXmitRing + (BufNum * RingDescSize) + \ OffsetFunc(XmitDescCopy, EXmitMsgStruct.EXmitFlags), \ XmitDescCopy.EXmitMsgStruct.EXmitFlags) #define WriteXmitByteCnt(BufNum) \ (void) WBWrite(IORAMAddr + etherXmitRing + (BufNum * RingDescSize) + \ OffsetFunc(XmitDescCopy, EXmitMsgStruct.EXmitBuffByteCnt), \ XmitDescCopy.EXmitMsgStruct.EXmitBuffByteCnt) #define ReadIntQHead \ (void) WBRead(IORAMAddr + etherCB + OffsetFunc(etherCBCopy, EIntHead), \ &(etherCBCopy.EIntHead)) #define ReadIntQTail \ (void) WBRead(IORAMAddr + etherCB + OffsetFunc(etherCBCopy, EIntTail), \ &(etherCBCopy.EIntTail)) #define IncrIntQHead \ (etherCBCopy.EIntHead = (etherCBCopy.EIntHead == LANCEQEnd ? \ LANCEQBegin : etherCBCopy.EIntHead + IntQEntrySize)) #define WriteIntQHead \ (void) WBWrite(IORAMAddr + etherCB + OffsetFunc(etherCBCopy, EIntHead), \ etherCBCopy.EIntHead) #define IncrRecvQPtr(QPtr) \ QPtr = (QPtr < RecvNumBufs - 1 ? ++QPtr : 0) #define IncrXmitQPtr(QPtr) \ QPtr = (QPtr < XmitNumBufs - 1 ? ++QPtr : 0) #define ReleaseRecvBuf(BufNum) \ { \ /* RecvDescCopy.ERecvMsgStruct.ERecvMsgByteCnt = 0; */ \ RecvDescCopy.ERecvMsgStruct.ERecvFlags = DefaultRecvFlags; \ WriteRecvFlags(BufNum); \ } int SwapBits(statusByte) register unsigned statusByte; { return (((statusByte & 0x01) << 7) + ((statusByte & 0x02) << 5) + ((statusByte & 0x04) << 3) + ((statusByte & 0x08) << 1) + ((statusByte & 0x10) >> 1) + ((statusByte & 0x20) >> 3) + ((statusByte & 0x40) >> 5) + ((statusByte & 0x80) >> 7)); } /* end SwapBits */ /* * Make the interface available if it exists, by filling in the network * interface record and initializing the hardware. The system will initialize * the interface when it is ready to accept packets. */ wbetattach() { register struct ifnet *ifp = &es.ac_if; struct sockaddr_in *sin; Error err; short protection; /* protection d'une sequence */ #ifdef DEBUG /* go into kdb to allow changing of trace flags */ printf("trace (@%x) = %x; xebug (@%x) = %x\n", &trace, trace, &xebug, xebug); call_debug(); #endif DEBUG protection=spl7(); TracePrint((TraceNet | TraceProcs), ("wbetattach\n")); ifp->if_unit = 0; ifp->if_name = "wb"; ifp->if_mtu = ETHERMTU; /* ethernet max transmission unit */ sin = (struct sockaddr_in *)&es.ac_if.if_addr; sin->sin_family = AF_INET; /* get my arpanet address, NOT implemented */ sin->sin_addr = arpmyaddr((struct arpcom *) 0); ifp->if_init = wbetinit; ifp->if_ioctl = wbetioctl; ifp->if_output = wbetoutput; ifp->if_reset = wbetreset; ifp->if_flags |= (IFF_NOTRAILERS + IFF_BROADCAST); /* Initialize WB stuff */ ipintrqFull = FALSE; /* direct WonderBoard interrupts to us */ err = GetWonderBoard(); if (err != ErOK) { if (err != ErNoWonderBoard) printf("network interface down\n"); WBDriverInited = FALSE; splx(protection); return; } /* * Allocate buffers from the heap, fix the buffers in memory, and * translate virual addresses of buffers to real addresses. */ err = AllocDescRings(); if (err != ErOK) { printf("network interface down\n"); WBDriverInited = FALSE; disableWBInterrupts(); splx(protection); return; } /* * Write the real memory addresses of the transmit and receive buffers to the * descriptor rings in shared memory. Tell the LANCE to initialize */ err = WB_Init(); if (err != ErOK) { printf("network interface down\n"); WBDriverInited = FALSE; disableWBInterrupts(); splx(protection); return; } /* Add interface to ifnet */ if_attach(ifp); printf("ethernet initialized\n"); splx(protection); } /* end wbetattach */ /* * Initialize the interface */ wbetinit() { register struct ifnet *ifp = &es.ac_if; register struct sockaddr_in *sin; short protection; /* protection d'une sequence */ protection = spl7(); TracePrint((TraceNet | TraceProcs), ("wbetinit\n")); sin = (struct sockaddr_in *)&ifp->if_addr; /* If the address is still unknown then return */ if (sin->sin_addr.s_addr == 0) { splx(protection); return; } /* set interface to ready only if ethernet is present */ if (!WBDriverInited) { es.ac_if.if_flags &= ~(IFF_UP|IFF_RUNNING); splx(protection); return; } if ((es.ac_if.if_flags & IFF_RUNNING) == 0) es.ac_if.if_flags |= IFF_UP|IFF_RUNNING; /* add interface to routing tables */ if_rtinit(&es.ac_if, RTF_UP); /* attach interface to address resolution protocol */ arpattach(&es); arpwhohas(&es, &sin->sin_addr); splx(protection); } /* end wbetinit */ /* * Process an ioctl request. */ wbetioctl(ifp, cmd, data) register struct ifnet *ifp; int cmd; caddr_t data; { register struct ifreq *ifr = (struct ifreq *)data; Error err = ErOK; short protection; /* protection d'une sequence */ TracePrint(TraceProcs, ("wbetioctl\n")); if (!WBDriverInited) return(Erbaddevice); protection = spl7(); switch (cmd) { case SIOCSIFADDR: if (ifp->if_flags & IFF_RUNNING) if_rtinit(ifp, -1); /* delete previous route */ wbsetaddr(ifp, (struct sockaddr_in *)&ifr->ifr_addr); wbetinit(); break; case SIOCGIFADDR: bcopy((caddr_t)&ifp->if_addr, (caddr_t)&ifr->ifr_addr, sizeof(struct sockaddr)); break; default: err = EINVAL; } splx(protection); return (err); } /* end wbetioctl */ wbsetaddr(ifp, sin) register struct ifnet *ifp; register struct sockaddr_in *sin; { ifp->if_addr = *(struct sockaddr *)sin; ifp->if_net = in_netof(sin->sin_addr); ifp->if_host[0] = in_lnaof(sin->sin_addr); sin = (struct sockaddr_in *)&ifp->if_broadaddr; sin->sin_family = AF_INET; sin->sin_addr = if_makeaddr(ifp->if_net, INADDR_ANY); ifp->if_flags |= IFF_BROADCAST; } /* end wbsetaddr */ /* * Receive data is probably available. Due to the way receive interrupts are * processed, we may have an interrupt for data we've already processed, so * there may not always be data available when we expect it. */ Error wbetread() { Halfword Etype; struct mbuf *m; register struct ifqueue *inq; NodeAddressType Dest; NodeAddressType Source; Error err = ErOK; if (!WBDriverInited) { err = Erbaddevice; return(err); } while ((!ipintrqFull) && (err = WB_Read(&Source, &Dest, &Etype)) != ErNoData) { if (err != ErOK) { TracePrint(TraceAll, ("error in read = %x\n", err)); es.ac_if.if_ierrors++; wbetreset(); return(err); } /* * If the tcpip device is not open, discard the packet since * there is nobody listening. */ if (!tcpipOpen) { while (WBLength > 0) { WBLength -= BufferSize; ReleaseRecvBuf(RecvQHead); IncrRecvQPtr(RecvQHead); } WBLength = 0; return(ErOK); } es.ac_if.if_ipackets++; /* check for trailer protocol, & make sure it's valid */ if (Etype >= ETHERPUP_TRAIL && Etype < ETHERPUP_TRAIL + ETHERPUP_NTRAILER) { int trailerOffset; int trailerLength; struct mbuf *mtemp; trailerOffset = ((int)Etype - ETHERPUP_TRAIL) * 512; if (trailerOffset > ETHERMTU) { #ifdef DEBUG if (trace & TraceAll) { TracePrint(TraceAll, ("ns: wbetread, dropping packet: trailer error: EType = %x\n", Etype)); dumpWBFrame(RecvBufs[RecvQHead], "Reading", MIN(RecvDescCopy.ERecvMsgStruct.ERecvMsgByteCnt, BufferSize)); } #endif /* DEBUG */ es.ac_if.if_ierrors++; return(err); } /* Discard the ethernet header and copy the data into mbufs. */ WBOffset += sizeof(struct ether_header); WBLength -= (sizeof(struct ether_header) + EtherFCSSize); m = copyLANCEBufToMbuf(); if (m == 0) { goto nomorembuf; } /* Copy the trailer into new mbufs, then get the packet */ /* type and length of the trailer from the new copy. */ mtemp = m_copy(m, trailerOffset, M_COPYALL); Etype = *(mtod(mtemp,Halfword *)); mtemp->m_off += sizeof(Etype); mtemp->m_len -= sizeof(Etype); trailerLength = *(mtod(mtemp,Halfword *)); mtemp->m_off += sizeof(Halfword); mtemp->m_len -= sizeof(Halfword); /* Delete the trailer from the end of the mbufs and */ /* concatenate the new mbuf with the trailer with the */ /* older mbufs with the data. */ m_adj(m, -trailerLength); m_cat(mtemp,m); m = mtemp; goto doippacket; } switch (Etype) { case ETHERPUP_IPTYPE: /* Discard the ethernet header and copy the data into mbufs. */ WBOffset += sizeof(struct ether_header); WBLength -= (sizeof(struct ether_header) + EtherFCSSize); m = copyLANCEBufToMbuf(); if (m == 0) { goto nomorembuf; } doippacket: /* queue IP type packets for IP to process later */ DebugPrint(DebugWBProcs, ("wbetread: IP packet read, mbuf = %x\n", m)); inq = &ipintrq; if (IF_QFULL(inq)) { TracePrint(TraceAll, ("ipintrq full\n")); ipintrqFull = TRUE; IF_DROP(inq); m_freem(m); } else { IF_ENQUEUE(inq,m); wakeup(wbetopen); } break; case ETHERPUP_ARPTYPE: /* ARP packets are handled by that protocol */ /* Put the data into mbufs. Strip the ether header */ WBOffset += sizeof(struct ether_header); WBLength -= (sizeof(struct ether_header) + EtherFCSSize); m = copyLANCEBufToMbuf(); if (m == 0) { goto nomorembuf; } DebugPrint(DebugWBProcs, ("wbetread: ARP packet read, mbuf = %x\n", m)); arpinput(&es, m); break; default: /* * If there is a place for this unknown (raw) packet, * save it */ if (!rawbuffer()) { m = copyLANCEBufToMbuf(); if (m == 0) { goto nomorembuf; } rawinput(m); } else { /* delete packet */ TracePrint(TraceBadType, ("wbetread: illegal packet Etype = %x\n", Etype)); #ifdef DEBUG if (trace & TraceBadType) dumpWBFrame(RecvBufs[RecvQHead], "Reading", MIN(RecvDescCopy.ERecvMsgStruct.ERecvMsgByteCnt, BufferSize)); #endif /* DEBUG */ while (WBLength > 0) { WBLength -= BufferSize; ReleaseRecvBuf(RecvQHead); IncrRecvQPtr(RecvQHead); } WBLength = 0; } break; } } nomorembuf: ipintrqFull = FALSE; WBLength = 0; WBOffset = 0; return(ErOK); } /* end wbetread */ /* * Interrupt from LANCE. */ wbetintr(dev,IOIR) int dev; /* pour normaliser l'interface */ int IOIR; { u_short status; u_short completeStatus = 0; Error err; TracePrint(TraceProcs, ("wbetintr: IOIR = %x\n", IOIR)); ReadIntQHead; ReadIntQTail; while (etherCBCopy.EIntHead != etherCBCopy.EIntTail) { (void) WBRead(IORAMAddr + etherCBCopy.EIntHead, &status); completeStatus |= status; #ifdef DEBUG if ((status & CSR0_InterruptBits) == 0) { /* * Wonderboard says the LANCE interrupted, but the status * from the LANCE contradicts this. */ DebugPrint((DebugWBInterrupts | DebugWBStats), ("wbetintr: receive unknown interrupt, CSR0 = %x\n", status)); } #endif /* DEBUG */ if (status & CSR0_ErrorFlag) { DebugPrint((DebugWBInterrupts | DebugErrorMsgs | DebugWBStats), ("wbetintr: LANCE Error on Interrupt, CSR0 = %x\n", status)); err = LANCEError(status); if (err != ErOK) { IncrIntQHead; WriteIntQHead; return(err); } } IncrIntQHead; WriteIntQHead; ReadIntQTail; } if (completeStatus & CSR0_RecvInterrupt) { DebugPrint(DebugWBInterrupts, ("wbetintr: LANCE Receive Interrupt, CSR0 = %x\n", status)); err = wbetread(); if (err != ErOK) return(err); } if (completeStatus & CSR0_XmitInterrupt) { DebugPrint(DebugWBInterrupts, ("wbetintr: LANCE Xmit Interrupt, CSR0 = %x\n", status)); err = packetXmitted(); if (err != ErOK) return(err); } if (completeStatus & CSR0_InitDone) { if (WBDriverInited) { DebugPrint((DebugWBInterrupts | DebugWBInit), ("wbetintr: LANCE Init Done Interrupt, CSR0 = %x\n", status)); F_Cpt_Init++; DebugPrint(DebugWBTimer, ("Init wakeup (wbintr); D_Cpt_Init = %x, F_Cpt_Init = %x\n", D_Cpt_Init, F_Cpt_Init)); wakeup(InitStartCmds); } } return(ErOK); } /* end wbetintr */ /* * Encapsulate a packet for output on the local net. Create the ethernet * header as necessary for the packet type specified in the destination * structure. If the packet is addressed to us (either specifically or * through a broadcast), then loop it back on the loopback device. */ wbetoutput(ifp, m0, dst) struct ifnet *ifp; struct mbuf *m0; struct sockaddr *dst; { int type = 0; Error err = ErOK; u_char edst[6]; struct in_addr idst; register struct mbuf *m = m0; register struct ether_header *ec; register int off; struct mbuf *mcopy = (struct mbuf *)0; int tempQPtr; int offset; short protection; /* protection d'une sequence */ TracePrint(TraceProcs, ("wbetoutput\n")); if (!WBDriverInited) return(Erbaddevice); protection = spl7(); switch (dst->sa_family) { #ifdef INET case AF_INET: idst = ((struct sockaddr_in *)dst)->sin_addr; if (!arpresolve(&es, m, &idst, edst)) { splx(protection); return(ErOK); /* if not yet resolved */ } if (in_lnaof(idst) == INADDR_ANY) mcopy = m_copy(m, 0, (int)M_COPYALL); off = ntohs((u_short)mtod(m, struct ip *)->ip_len) - m->m_len; /* need per host negociation */ if ((ifp->if_flags & IFF_NOTRAILERS) == 0) if (off > 0 && (off & 0x1ff) == 0 && m->m_off >= MMINOFF + 2 * sizeof(u_short)) { type = ETHERPUP_TRAIL + (off>>9); m->m_off -= 2 * sizeof(u_short); m->m_len += 2 * sizeof(u_short); *mtod(m, u_short *) = ntohs((u_short)ETHERPUP_IPTYPE); *(mtod(m, u_short *) + 1) = ntohs((u_short)m->m_len); goto gottrailertype; } type = ETHERPUP_IPTYPE; goto gottype; #endif /* INET */ case AF_IMPLINK: /* * Copy the data as well as the ether header from the mbuf chain * to the LANCE transmit buffers. This uses an offset of zero. * The copy may fail if there are no free LANCE transmit buffers * within a reasonable length of time. */ err = copyMbufToLANCEBuf(m, 0); if (err != ErOK) goto bad; /* * Update the head of the xmit queue to be the first buffer of * the newly formed packet */ IncrXmitQPtr(XmitQHead); ec = (struct ether_header *) (XmitBufs[XmitQHead]); goto gotheader; case AF_UNSPEC: ec = (struct ether_header *)dst->sa_data; bcopy((caddr_t)ec->ether_dhost, (caddr_t)edst, sizeof(edst)); type = ec->ether_type; goto gottype; default: printf("wbet%x: can't handle af%x\n", ifp->if_unit, dst->sa_family); err = EAFNOSUPPORT; goto bad; } gottrailertype: /* * Packet to be sent as trailer: move first packet * (control information) to end of chain. */ while (m->m_next) m = m->m_next; m->m_next = m0; m = m0->m_next; m0->m_next = 0; m0 = m; gottype: /* * Copy the data from the mbuf chain to the LANCE transmit buffers. * The copy may fail if there are no free LANCE transmit buffers within * a reasonable length of time. Add the local net header. */ offset = sizeof(struct ether_header); /* copy the data to the output buffers */ err = copyMbufToLANCEBuf(m, offset); if (err != ErOK) goto bad; /* * Update the head of the xmit queue to be the first buffer of the * newly formed packet */ IncrXmitQPtr(XmitQHead); /* * Prepare to add ether header (destination addr, source addr & type * field). */ ec = (struct ether_header *) (XmitBufs[XmitQHead]); /* copy the destination address to the output buffer */ bcopy((caddr_t)edst, (caddr_t)ec->ether_dhost, sizeof(edst)); /* copy the type field to the output buffer */ ec->ether_type = htons((u_short)type); gotheader: /* * copy the source address to the output buffer. Note that for * packet filter packets, the destination address and type fields * have already been filled in, so we only need copy the source * address field. */ bcopy((caddr_t)es.ac_enaddr, (caddr_t)ec->ether_shost, sizeof(es.ac_enaddr)); /* * Set the XmitOwn bits in buffers of the current packet, starting with * the last buffer in the packet. This gives the buffers to the LANCE. * Doing the first buffer in the packet last makes sure that the LANCE * has all of the buffers for the packet before it tries to transmit, * since it only looks ahead one buffer. Update the XmitQueue * pointers and issue a demand transmit command to the LANCE. */ tempQPtr = TempXmitQHead; while (tempQPtr != XmitQHead) { ReadXmitFlags(tempQPtr); XmitDescCopy.EXmitMsgStruct.EXmitFlags |= XmitOwn; WriteXmitFlags(tempQPtr); tempQPtr = (tempQPtr == 0 ? XmitNumBufs - 1 : --tempQPtr); } ReadXmitFlags(tempQPtr); XmitDescCopy.EXmitMsgStruct.EXmitFlags |= XmitOwn; WriteXmitFlags(tempQPtr); #ifdef DEBUG if (trace & TraceFrames) { dumpWBFrame(XmitBufs[XmitQHead], "Writing", (-(XmitDescCopy.EXmitMsgStruct.EXmitBuffByteCnt)) & 0XFFFF); } #endif /* DEBUG */ XmitQHead = TempXmitQHead; DebugPrint(DebugWBProcs, ("wbetoutput: output queued\n")); es.ac_if.if_opackets++; m0 = m; bad: m_freem(m0); if (err != ErOK) { TracePrint(TraceAll,("error in write = %d\n", err)); wbetreset(); es.ac_if.if_oerrors++; } splx(protection); return(mcopy ? looutput(&loif, mcopy, dst) : err); } /* end wbetoutput */ /* * Reset interface. */ wbetreset() { Error err; short protection; /* protection d'une sequence */ TracePrint(TraceProcs, ("wbetreset\n")); printf("resetting interface\n"); if (!WBDriverInited) return; protection=spl7(); /* Reinitialize the LANCE */ err = WB_Init(); if (err != ErOK) RemoveWBInterface(); splx(protection); return; } /* end wbetreset */ /* * Shutdown all ethernet operations on the wonderboard. This is called from * panic(). */ wbshutdown() { TracePrint((TraceNet | TraceProcs), ("wbshutdown\n")); /* Stop the LANCE */ etherCBCopy.EWriteData.EReg0 = CSR0_InterruptEnable + CSR0_StopCmd; (void) WBWrite(IORAMAddr + etherCB + OffsetFunc(etherCBCopy, EWriteData.EReg0), etherCBCopy.EWriteData.EReg0); SleepOK = FALSE; (void) doWBWriteReg0Cmd; printf("LANCE has been stopped\n"); disableWBInterrupts(); WBDriverInited = FALSE; return; } /* end wbshutdown */ /* * Remove access to the interface by setting the IFF_DOWN flag. * Called when irrecoverable errors are detected. Do not try to * reinitialize the interface. Some form of operator invervention * is required. We stop the LANCE so it will no longer interract on * the network, and then disable interrupts from the ethernet portions * of the board, to improve system performance and simplify the * driver. */ RemoveWBInterface() { struct ifnet *ifp = &es.ac_if; es.ac_if.if_flags &= ~(IFF_UP|IFF_RUNNING); printf("removing interface\n"); /* Stop the LANCE */ etherCBCopy.EWriteData.EReg0 = CSR0_InterruptEnable + CSR0_StopCmd; (void) WBWrite(IORAMAddr + etherCB + OffsetFunc(etherCBCopy, EWriteData.EReg0), etherCBCopy.EWriteData.EReg0); SleepOK = FALSE; (void) doWBWriteReg0Cmd; printf("LANCE has been stopped\n"); disableWBInterrupts(); WBDriverInited = FALSE; } /* end RemoveWBInterface */ /* * Copy the number of bytes specified in WBLength from LANCE receive buffers * (offset by WBOffset) to mbufs. Assumes that that number of bytes exist * in LANCE receive buffers, and that the caller has verified the ownership * of the buffers and validity of the data. */ struct mbuf * copyLANCEBufToMbuf() { struct mbuf *m = 0; struct mbuf *front = 0; /* points to beginning of mbuf */ /* chain to be returned */ struct mbuf **lastPtr = &front; /* used in linking previous buffer */ /* to current buffer; contains addr */ /* of previous buff's m_next field */ int lengthCopied; int minimum; while (WBLength > 0 ) { /* * Get another mbuf if there is no current mbuf or the current mbuf * or bigbuf is full. Restore the offset in the current mbuf to the * beginning of the data. Initially set the new mbuf to be empty. */ if ((m == 0) || (m->m_off == MMAXOFF) || (m->m_len == MBIGSIZE)) { if (m != 0) m->m_off -= m->m_len; m = m_get(M_WAIT, MT_DATA); if (m == 0) goto nobuf; m->m_len = 0; /* * If the length to copy is larger than will fit into one mbuf, * then allocate a big buffer and set the mbuf to reference it. */ if (WBLength > MLEN) { struct mbuf *big = 0; MCLGET(big,1); if (big == 0) goto nobuf; m->m_off = (int) big - (int) m; } /* * Add the mbuf to the list. Note that on the first pass, this * updates front due to the way lastPtr is initialized. */ *lastPtr = m; lastPtr = &m->m_next; } /* get the next LANCE receive buffer if the current one is empty */ if (WBOffset == BufferSize) { ReleaseRecvBuf(RecvQHead); IncrRecvQPtr(RecvQHead); WBOffset = 0; } if (m->m_off > MMAXOFF) lengthCopied = MIN(MBIGSIZE - m->m_len, MIN(WBLength, (BufferSize - WBOffset))); else lengthCopied = MIN(MLEN - m->m_len, MIN(WBLength, (BufferSize - WBOffset))); /* copy the data (from, to, length) */ bcopy((u_char *) RecvBufs[RecvQHead] + WBOffset, mtod(m, caddr_t), lengthCopied); /* update the lengths */ WBLength -= lengthCopied; m->m_len += lengthCopied; WBOffset += lengthCopied; m->m_off += lengthCopied; } /* while */ /* Restore the offset into the mbuf to the beginning of the data */ m->m_off -= m->m_len; /* * If the ethernet FCS overflows into the next buffer, then release * the current buffer, and then fall through to release the next * buffer (with the FCS). */ if ((WBOffset + EtherFCSSize) > BufferSize) { ReleaseRecvBuf(RecvQHead); IncrRecvQPtr(RecvQHead); } /* * The last receive buffer in the packet was exhausted, so release * it and update the Q head. */ ReleaseRecvBuf(RecvQHead); IncrRecvQPtr(RecvQHead); /* return the mbuf chain */ return(front); nobuf: /* release the chain of mbufs */ m_freem(front); /* release the receive buffers for the packet */ minimum = MIN(WBLength , BufferSize - WBOffset); if (minimum == WBLength) { ReleaseRecvBuf(RecvQHead); IncrRecvQPtr(RecvQHead); } else { WBLength -= minimum; ReleaseRecvBuf(RecvQHead); IncrRecvQPtr(RecvQHead); while (WBLength > 0) { ReleaseRecvBuf(RecvQHead); IncrRecvQPtr(RecvQHead); WBLength -= BufferSize; } } WBLength = 0; return ((struct mbuf *) NULL); } /* end copyLANCEBufToMbuf */ /* * Copy data from mbuf(s) to LANCE transmit buffer(s). Assumes that the mbuf * total length is within the maximum frame size for ethernet. Also, assumes * that the offset specified by the caller is less than BufferSize (ie, is * within the first LANCE transmit buffer). The head of the transmit queue * is not updated, nor are the buffers given to the LANCE, so the caller can * fill in the header. The caller is expected to update these. */ Error copyMbufToLANCEBuf(m, offset) struct mbuf *m; int offset; { int length; int totalLength; int mbufOffset = 0; /* offset in addition to m->m_off */ Error err; TempXmitQHead = XmitQHead; IncrXmitQPtr(TempXmitQHead); err = GetXmitBuf(); if (err != ErOK) return(err); totalLength = offset; XmitDescCopy.EXmitMsgStruct.EXmitFlags = DefaultXmitFlags | StartXmitPacket; while (m != 0) { /* get the next mbuf if the current one is empty */ if (m->m_len == 0) { m = m->m_next; mbufOffset = 0; continue; } /* go to the next LANCE xmit buffer if the current one is full */ while (offset >= BufferSize) { XmitDescCopy.EXmitMsgStruct.EXmitBuffByteCnt = DefaultByteCnt; WriteXmitByteCnt(TempXmitQHead); WriteXmitFlags(TempXmitQHead); offset -= BufferSize; IncrXmitQPtr(TempXmitQHead); err = GetXmitBuf(); if (err != ErOK) return(err); XmitDescCopy.EXmitMsgStruct.EXmitFlags = DefaultXmitFlags; } /* copy from mbuf to LANCE buffer */ length = MIN(m->m_len, BufferSize - offset); bcopy(mtod(m, caddr_t) + mbufOffset, ((u_char *) XmitBufs[TempXmitQHead]) + offset, length); /* update lengths and offsets */ offset += length; totalLength += length; m->m_len -= length; mbufOffset += length; } /* while */ /* * If the total data length of the packet is less than the minimum frame * size, we must pad it out to meet the ethernet spec. The receiver * is expected to use the byte count from a higher level protocol in * order to discard the padding. Note that we know that a packet of * minimum size fits in one buffer since transmit buffers have a * minimum size of 100 bytes, and the minimum packet is 46 bytes of * data + 14 bytes of ethernet header, or 60 bytes (not including the * CRC which we do not include in the buffer). */ if (totalLength < (MinFrameData + sizeof(struct ether_header))) { offset = (MinFrameData + sizeof(struct ether_header)); } XmitDescCopy.EXmitMsgStruct.EXmitFlags |= EndXmitPacket; XmitDescCopy.EXmitMsgStruct.EXmitBuffByteCnt = -offset; WriteXmitByteCnt(TempXmitQHead); WriteXmitFlags(TempXmitQHead); return(ErOK); } /* end copyMbufToLANCEBuf */ #ifdef DEBUG /* * Print the ethernet header, length of frame and read/write. * Also print the beginning of the data area */ dumpWBFrame(frame, mode, length) FrameType *frame; char mode[]; int length; { #define BytesPerLine 16 int i; int j; int newline; int printLen; char *rawframe = (char *) frame; printf("%s frame. Length: %x\n", mode, length); printf(" EthernetHeader:\n"); printLen = MIN(length, sizeof(struct ether_header)); for (i = 0; i < printLen; i += BytesPerLine) { newline = MIN(printLen, i + BytesPerLine); for (j = i; j < newline; j++) printf("%x ",rawframe[j]); printf("\n"); } i = printLen; printLen = MIN(length, 100); printf (" Data:\n"); for (; i < printLen; i += BytesPerLine) { newline = MIN(printLen, i + BytesPerLine); for (j = i; j < newline; j++) printf("%x ", frame->FileData[j]); printf("\n"); } } /* end dumpWBFrame */ #endif /* DEBUG */ /* * Flush all entries from the interrupt queue in shared RAM. */ FlushLANCEInterruptQ() { ReadIntQTail; if (etherCBCopy.EIntHead != etherCBCopy.EIntTail) { etherCBCopy.EIntHead = etherCBCopy.EIntTail; DebugPrint(DebugWBInterrupts, ("WBStats: flushed interrupt(s): LANCEInterruptQ\n")); } WriteIntQHead; } /* end FlushLANCEInterruptQ */ /* * Disable all interrupts from the wonderboard. This is done only during * attempted error recovery from serious errors, so ignore any errors which * occur */ disableWBInterrupts() { SleepOK = FALSE; (void) doWBDisLANCECmd; SleepOK = FALSE; (void) doWBDisEtherCmd; FlushLANCEInterruptQ; return; } /* end disableWBInterrupts */ /* * We got a packet transmitted interrupt. Release any buffers from complete * packets which have been transmitted. An error is returned only if we needed * to reset the LANCE or shut down the LANCE. */ Error packetXmitted() { int QPtr; u_short xmit1; /* accumulate flags from all buffers in packet */ u_short xmit2; /* accumulate flags2 from all buffers in packet */ int endQPtr; QPtr = XmitQTail; ReadXmitDesc(QPtr); xmit1 = xmit2 = 0; endQPtr = XmitQHead; IncrXmitQPtr(endQPtr); while ((QPtr != endQPtr) && ((XmitDescCopy.EXmitMsgStruct.EXmitFlags & XmitOwn) == RidgeOwned)) { /* * The transmit queue is not empty, and the LANCE has released a * buffer. */ xmit1 |= XmitDescCopy.EXmitMsgStruct.EXmitFlags; xmit2 |= XmitDescCopy.EXmitMsgStruct.EXmitFlags2; /* * Update error statistics and XmitQTail only when we reach the end * of packet or when an irrecoverable error occurs which causes the * LANCE to shut down the transmitter. In the latter case, the * LANCE will not complete processing of the buffer chain until it * has been restarted, so we must process the error as we encounter * it. No harm is done by treating this as an end of packet * condition. */ if ((XmitDescCopy.EXmitMsgStruct.EXmitFlags & EndXmitPacket) || (XmitDescCopy.EXmitMsgStruct.EXmitFlags2 & (RetryError | Underflow))) { /* * Keep track of any errors which occurred. Note that the * errors may be indicated in any of the transmit buffers of the * chain. However, they may only be included in the error * statistics when we reach an end of packet, otherwise they'd * be counted twice. */ if (xmit1 & XmitStatsMask) { if (xmit1 & MoreRetries) { Stats.StatsMoreRetries++; DebugPrint(DebugWBStats, ("WBStats: xmit more retries\n")); } /* * The LANCE has a bug where the one retry flag gets set * erroneously when a late collision error occurs. Do not * count that error. */ if ((xmit1 & OneRetry) && !(xmit2 & LateCollision)) { Stats.StatsOneRetry++; DebugPrint(DebugWBStats, ("WBStats: xmit one retry\n")); } if (xmit1 & Deferred) { Stats.StatsDeferred++; DebugPrint(DebugWBStats, ("WBStats: xmit deferred\n")); } if (xmit1 & XmitError) { if (xmit2 & XmitBufferError) { Stats.StatsXmitBuf++; DebugPrint(DebugWBStats, ("WBStats: xmit buffer error\n")); } if (xmit2 & LateCollision) { Stats.StatsLateCollision++; DebugPrint(DebugWBStats, ("WBStats: xmit late collision\n")); } if (xmit2 & LostCarrier) { Stats.StatsLostCarrier++; DebugPrint(DebugWBStats, ("WBStats: xmit lost carrier\n")); } if (xmit2 & RetryError) { /* * LANCE turned off transmitter. Restart the LANCE, * releasing the transmit buffer, so the same error * will not be processed again erroneously. */ Stats.StatsRetryError++; printf("excessive retries on transmission, TDR value = %x\n", XmitDescCopy.EXmitMsgStruct.EXmitFlags2 & TDRMask); wbetreset(); XmitQTail = QPtr; IncrXmitQPtr(XmitQTail); return(ErLANCERetryError); } if (xmit2 & Underflow) { /* * LANCE turned off transmitter. Restart the LANCE, * releasing the transmit buffer, so the same error * will not be processed again erroneously. */ Stats.StatsUnderflow++; TracePrint(TraceAll, ("transmitter underflow\n")); wbetreset(); XmitQTail = QPtr; IncrXmitQPtr(XmitQTail); return(ErXmitUnderflow); } } } XmitQTail = QPtr; IncrXmitQPtr(XmitQTail); xmit1 = xmit2 = 0; } IncrXmitQPtr(QPtr); ReadXmitDesc(QPtr); } /* while */ return(ErOK); } /* end packetXmitted */ /* * The LANCE reported an error condition. The wonderboard microcode has * cleared the error for us, so we need only keep track of the error for * network statistics, and institute any necessary error recovery. An error * is returned if we had to reset or shut down the LANCE. */ Error LANCEError(CSR0) unsigned CSR0; { if (CSR0 & CSR0_Babble) { Stats.StatsBabble++; DebugPrint(DebugWBStats, ("WBStats: CSR0 babble\n")); } if (CSR0 & CSR0_CollisionError) { Stats.StatsCollision++; DebugPrint(DebugWBStats, ("WBStats: CSR0 collision\n")); es.ac_if.if_collisions++; } if (CSR0 & CSR0_MissedPacket) { Stats.StatsMissedPkt++; DebugPrint(DebugWBStats, ("WBStats: CSR0 missed packet\n")); } if (CSR0 & CSR0_MemoryError) { /* LANCE turned off xmitter & receiver; catastrophic error */ Stats.StatsMemoryError++; DebugPrint(DebugWBStats, ("WBStats: memory error; CSR0 = %x\n", CSR0)); TracePrint(TraceAll,("memory error; LANCE restarted\n")); wbetreset(); return(ErLANCEMemErr); } return(ErOK); } /* end LANCEError */ /*************************************/ /* WonderBoard interface routines */ /*************************************/ /* * Read from the wonderboard. We will always read into a halfword data * area since the high order half word is normally not relevant. Callers * who need the entire word read should call d_read, and do any necessary * error processing themselves. */ Error WBRead(IOAddr, IOData) u_short *IOData; unsigned IOAddr; { register Error err; int iodata; /* * Do an d_read, masking the result to just the low order halfword. * Check the status which comes back on the read */ err = d_read(IOAddr,&iodata); *IOData = (short)(iodata & 0xffff); DebugPrint(DebugWBIO, ("Reading: IOAddr = %x; IOData = %x; err = %x\n", IOAddr, *IOData, err)); switch(err) { case 0: return(ErOK); case 1: err = ErIODataNotValid; break; case 2: err = ErIOTimeOut; break; case 3: err = ErIOTmOAndDNV; break; L M N O P Q R S T default: err = ErUnknownError; break; } printf("Reading from CIO: IOAddr = %x; error = ", IOAddr); WBWriteIOErr(err); printf("\n"); return(err); } /* end WBRead */ /* * Write to the wonderboard. Usually, the caller will write only a halfword, * as writes to the shared RAM require the high order halfword to be zero. * Writes to the mapping RAM use the entire word, so this routine supports * word writes. */ Error WBWrite(IOAddr, IOData) unsigned IOData; unsigned IOAddr; { register Error err; /* Do an IOWrite, checking the status which comes back */ err = d_write(IOAddr, IOData); DebugPrint(DebugWBIO, ("Writing: IOAddr = %x; IOData = %x; err = %x\n", IOAddr, IOData, err)); switch(err) { case 0: return(ErOK); case 1: err = ErIODataNotValid; break; case 2: err = ErIOTimeOut; break; case 3: err = ErIOTmOAndDNV; break; default: err = ErUnknownError; break; } printf("Writing to CIO: IOAddr = %x; IOData = %x; error = ", IOAddr, IOData); WBWriteIOErr(err); printf("\n"); return(err); } /* end WBWrite */ /* * Write some text describing the I/O error. */ WBWriteIOErr(err) int err; { switch(err) { case ErIOTimeOut: printf("IO time out"); break; case ErIODataNotValid: printf("IO data not valid"); break; case ErIOTmOAndDNV: printf("IO time out and IO data not valid"); break; default: printf("unknown error: %x", err); } } /* end WBWriteIOErr */ /* * Write a command to the wonderboard, waiting for the response to * indicate command completion and the availability of any data read */ Error WriteWBCommand(command) u_char command; { Error err; short protection; /* * Make sure the last command completed, and that there were no errors * since then (eg, interrupt queue overflow). * * WARNING: This code reads both EError & ECommand, which must * both be zero. */ err = WBRead(IORAMAddr + etherCB + OffsetFunc(etherCBCopy, EError), ðerCBCopy.EError); if (err != ErOK) return(err); if ((etherCBCopy.EError != 0) || (etherCBCopy.ECommand != 0)) { /* * We can still issue the command on a wonderboard interrupt queue * overflow error, but other errors require error recovery. */ if (etherCBCopy.EError == EIntOvflErr) { TracePrint(TraceAll, ("Interrupt Q overflow; command = %x, err = %x\n", etherCBCopy.ECommand, etherCBCopy.EError)); etherCBCopy.EError = 0; (void) WBWriteHi(IORAMAddr + etherCB + OffsetFunc(etherCBCopy, EError), etherCBCopy.EError); Stats.StatsIntQOverflow++; } else return(bad_Write()); } protection = spl7(); if (SleepOK) { DebugPrint(DebugWBTimer, ("Command timer set; D_Cpt_Cmd = %x, F_Cpt_Cmd = %x\n", D_Cpt_Cmd, F_Cpt_Cmd)); timeout(CmdTimeout,D_Cpt_Cmd,TimeoutWriteWB); } D_Cpt_Cmd += 1; TO_ErrCmd = ErOK; (void) WBWriteLo(IORAMAddr+etherCB+OffsetFunc(etherCBCopy,ECommand), command); if (SleepOK) { DebugPrint(DebugWBTimer, ("sleeping..WriteWBCmd; D_Cpt_Cmd = %x, F_Cpt_Cmd = %x\n", D_Cpt_Cmd, F_Cpt_Cmd)); sleep(WriteWBCommand,PRIOR); } splx(protection); return(TO_ErrCmd); } /* end WriteWBCommand */ /* interruption venant du controleur Ethernet */ wbetctrl(dev,IOIR) int dev; /* pour normaliser l'interface */ int IOIR; { /* process interrupt */ /* * WARNING: This code reads both EError & ECommand, which must * both be zero. */ if (WBDriverInited) { F_Cpt_Cmd++; TO_ErrCmd = WBRead(IORAMAddr+etherCB+OffsetFunc(etherCBCopy, EError), ðerCBCopy.EError); if (TO_ErrCmd == ErOK) if ((etherCBCopy.ECommand == 0) && (etherCBCopy.EError == 0)) { /* command completed without error */ TO_ErrCmd = ErOK; } else TO_ErrCmd = bad_Write(); DebugPrint(DebugWBTimer, ("Cmd wakeup (wbctrl); D_Cpt_Cmd = %x, F_Cpt_Cmd = %x\n", D_Cpt_Cmd, F_Cpt_Cmd)); wakeup(WriteWBCommand); } } /* end wbetctrl */ CmdTimeout(indice) int indice; { short protection; /* protection de la sequence */ /* timeout sur une commande au controleur ethernet */ protection = spl7(); DebugPrint(DebugWBTimer, ("Command timeout; D_Cpt_Cmd = %x, F_Cpt_Cmd = %x\n", D_Cpt_Cmd, F_Cpt_Cmd)); if (WBDriverInited) if (indice == F_Cpt_Cmd) { F_Cpt_Cmd++; TO_ErrCmd = ErTimeout; DebugPrint(DebugWBTimer, ("Cmd wakeup (timeout); D_Cpt_Cmd = %x, F_Cpt_Cmd = %x\n", D_Cpt_Cmd, F_Cpt_Cmd)); wakeup(WriteWBCommand); } splx(protection); } /* end CmdTimeout */ Error bad_Write() { /* error on command */ switch (etherCBCopy.EError) { case EBadCmdErr: printf("bad command = %d, err = %x\n", etherCBCopy.ECommand, etherCBCopy.EError); etherCBCopy.EError = 0; (void) WBWriteHi(IORAMAddr + etherCB + OffsetFunc(etherCBCopy, EError), etherCBCopy.EError); return(EBadCmdErr + ErEtherCtrl); case EIntOvflErr: TracePrint(TraceAll, ("Interrupt Q overflow; command = %x, err = %x\n", etherCBCopy.ECommand, etherCBCopy.EError)); etherCBCopy.EError = 0; (void) WBWriteHi(IORAMAddr + etherCB + OffsetFunc(etherCBCopy, EError), etherCBCopy.EError); Stats.StatsIntQOverflow++; return(ErOK); case ECheckSumErr: printf("bad checksum in address PAL; command = %x, err = %x\n", etherCBCopy.ECommand, etherCBCopy.EError); etherCBCopy.EError = 0; (void) WBWriteHi(IORAMAddr + etherCB + OffsetFunc(etherCBCopy, EError), etherCBCopy.EError); return(ECheckSumErr + ErEtherCtrl); default: printf("invalid error or command returned; cmd = %x, err = %x\n", etherCBCopy.ECommand, etherCBCopy.EError); etherCBCopy.EError = 0; (void) WBWriteHi(IORAMAddr + etherCB + OffsetFunc(etherCBCopy, EError), etherCBCopy.EError); return(EInvalidError + ErEtherCtrl); } /* switch */ } /* end bad_Write */ #ifdef DEBUG /* * Dump the descriptors elements */ DumpDesc() { int iloc; u_short *IOAddr, *RidgeAddr; RidgeAddr = (u_short *) &Anneau[0]; IOAddr = (u_short *) (IORAMAddr + etherRecvRing); for (iloc=0; iloc<128; iloc++) (void) WBRead(IOAddr++,RidgeAddr++); IOAddr = (u_short *) (IORAMAddr + etherXmitRing); for (iloc=0; iloc<128; iloc++) (void) WBRead(IOAddr++,RidgeAddr++); } /* end DumpDesc */ #endif /* DEBUG */ /* * Read the specified receive descriptor element */ ReadRecvDesc(BufNum) int BufNum; { register u_short *IOAddr; register u_short *RidgeAddr; IOAddr = (u_short *) (IORAMAddr + etherRecvRing + (BufNum * RingDescSize)); RidgeAddr = RecvDescCopy.ERecvHalfWord; (void) WBRead(IOAddr++, RidgeAddr++); (void) WBRead(IOAddr++, RidgeAddr++); (void) WBRead(IOAddr++, RidgeAddr++); (void) WBRead(IOAddr, RidgeAddr); return; } /* end ReadRecvDesc */ /* * Write the specified receive descriptor element. Assumes the caller * has verified proper ownership of the buffer */ Error WriteRecvDesc(BufNum) int BufNum; { int i; Error err = ErOK; for (i = 0; i < RingDescSize/2; i++) { err |= WBWrite(IORAMAddr + etherRecvRing + (BufNum * RingDescSize) + (i * 2), RecvDescCopy.ERecvHalfWord[i]); } if (err != ErOK) err = ErWriteError; return(err); } /* end WriteRecvDesc */ /* * Read the specified transmit descriptor element */ ReadXmitDesc(BufNum) int BufNum; { register u_short *IOAddr; register u_short *RidgeAddr; IOAddr = (u_short *) (IORAMAddr + etherXmitRing + (BufNum * RingDescSize)); RidgeAddr = XmitDescCopy.EXmitHalfWord; (void) WBRead(IOAddr++, RidgeAddr++); (void) WBRead(IOAddr++, RidgeAddr++); (void) WBRead(IOAddr++, RidgeAddr++); (void) WBRead(IOAddr, RidgeAddr); return; } /* end ReadXmitDesc */ /* * Write the specified transmit descriptor element. Assumes the caller * has verified proper ownership of the buffer */ Error WriteXmitDesc(BufNum) int BufNum; { int i; Error err = ErOK; for (i = 0; i < RingDescSize/2; i++) { err |= WBWrite(IORAMAddr + etherXmitRing + (BufNum * RingDescSize) + (i * 2), XmitDescCopy.EXmitHalfWord[i]); } if (err != ErOK) err = ErWriteError; return(err); } /* end WriteXmitDesc */ /* * Verify that the device specified on the command line is indeed * a wonderboard device. */ Error GetWonderBoard() { #define DeviceNumShiftCnt 24 #define BoardTypeShiftCnt 24 #define WonderBoardType 0X40 #define AltWonderBoardType 0X41 unsigned Reply; Error err; if ((WBDevice = ctladdr(CIODEBUG,0))== -1) WBDevice = ctladdr(CIODEBUG,4); /* type ctrl ethernet */ /* Verify that the board is a wonderboard */ if ((d_read((WBDevice << DeviceNumShiftCnt), &Reply) == ErOK) && (((Reply >> BoardTypeShiftCnt) == WonderBoardType) || ((Reply >> BoardTypeShiftCnt) == AltWonderBoardType))) { TracePrint(TraceNet, ("WonderBoard ethernet present, device # = %x\n", WBDevice)); WBPresent = TRUE; } else { TracePrint(TraceNet, ("hardware at address %x is not a CIO board\n", WBDevice)); WBPresent = FALSE; return(ErNoWonderBoard); } IORAMAddr = WBDevice << DeviceNumShiftCnt; IOMapAddr = IORAMAddr + MemMapFlag; /* * Read the revision codes for the board. If they are incompatible with * the current revision of software, an error will be returned. */ err = ReadRevCodes(); if (err != ErOK) return(err); WBDriverInited = TRUE; return(err); } /* end GetWonderBoard */ /* * Allocate the transmit and receive buffers, fix them in memory, and * translate their addresses to real addresses for use by wonderboard. * Any errors are returned to the caller for error processing. * * WARNING: This code assumes that an integral number of buffers fit * exactly in one page. Buffers do not span pages, so pages * need not be contiguous. */ Error AllocDescRings() { int i,j; /* * Allocate the receive buffers; fix each page in memory, * translate its virtual address to its real address, and * save the virtual and real addresses for each buffer in the * page. */ for (i = 0; i < RecvNumBufs; i += BufsPerPage) { RecvBufs[i] = sptalloc(1 , PG_V | PG_KR , 0); RealRecvBufs[i] = svtophys(RecvBufs[i]); for (j=1; ja[i+1]; es.ac_enaddr[i+1] = localAddress.a[i+1] = address->a[i]; } DebugPrint(DebugWBInit, ("Physical Address = %x %x %x %x %x %x\n", localAddress.a[0], localAddress.a[1], localAddress.a[2], localAddress.a[3], localAddress.a[4], localAddress.a[5])); } else err = ErReadError; return(err); } /* end ReadPhysicalAddr */ /* * Set up the logical address filter for multicast. Note that we do not use * this feature currently. */ SetLogicalAddrFilter(filter) NodeAddrFilter *filter; { int i; /* * Zero the logical address filter for multicast, since we do not use * this feature. */ for (i = 0; i < LogicalAddrLen; i++) filter->a[i] = 0; } /* end SetLogicalAddrFilter */ /* * Set up our copy of the initialization control block */ Error CreateInitBlock() { Error err; InitBlockCopy.EMode = DefaultModeReg; err = ReadPhysicalAddr(&(InitBlockCopy.EPhysicalAddr)); if (err != ErOK) return(err); SetLogicalAddrFilter(&(InitBlockCopy.ELogicalAddrFilter)); InitBlockCopy.ERecvDescRingLo = etherRecvRing & HalfWordMask; InitBlockCopy.ERecvRingLength = LANCERecvNumBufs << LengthShiftCount; InitBlockCopy.ERecvDescRingHi = (etherRecvRing >> HalfWordShiftCnt) & HalfWordMask; InitBlockCopy.EXmitDescRingLo = etherXmitRing & HalfWordMask; InitBlockCopy.EXmitRingLength = LANCEXmitNumBufs << LengthShiftCount; InitBlockCopy.EXmitDescRingHi = (etherXmitRing >> HalfWordShiftCnt) & HalfWordMask; return(err); } /* end CreateInitBlock */ /* * Write our copy of the initialization control block to the shared memory * on the wonderboard */ Error WriteInitBlock() { #define maxIndex sizeof(InitBlockStruct) int i; unsigned IOAddr; unsigned IOData; Error err = ErOK; IOAddr = IORAMAddr + etherInitBlock; DebugPrint(DebugWBInit, ("Writing Init Block\n")); for (i = 0; i < maxIndex; i += IOSize, IOAddr += IOSize) { IOData = *((u_short *) (((char *)(&InitBlockCopy)) + i)); err |= WBWrite(IOAddr, IOData); } if (err != ErOK) { printf("could not write initialization block\n"); err = ErWriteError; } return(err); } /* end WriteInitBlock */ /* * Write out the transmit and receive descriptor rings into shared memory * for use by wonderboard */ Error InitDescRings() { int i; int BufferNum = 0; Error err = ErOK; /* * Initialize each recv buffer descriptor in the local copy, writing * each one to the wonderboard and initializing its mapping RAM entry. * These buffers are given to the LANCE, so we can not write in these * descriptors until data is received into the buffers and the LANCE * returns the buffers and their descriptors to us. */ RecvDescCopy.ERecvMsgStruct.ERecvFlags = DefaultRecvFlags; RecvDescCopy.ERecvMsgStruct.ERecvBuffByteCnt = DefaultByteCnt; RecvDescCopy.ERecvMsgStruct.ERecvMsgByteCnt = 0; DebugPrint(DebugWBInit, ("Writing Recv Desc Ring\n")); for (i = 0; i < RecvNumBufs; i++) { RecvDescCopy.ERecvMsgStruct.ERecvBuffAddrLo = ((RealRecvBufs[i]) & AddrLoMask) + WonderRidgeFlag; RecvDescCopy.ERecvMsgStruct.ERecvBuffAddrHi = SwapBits(BufferNum); err |= WBWrite(IOMapAddr + BufferNum, (RealRecvBufs[i]) & AddrHiMask); err |= WriteRecvDesc(BufferNum); BufferNum++; } if (err != ErOK) { printf("could not write recv descriptor ring\n"); return(ErWriteError); } /* * Initialize each xmit buffer descriptor in the local copy, writing * 2  ~ } | { z y x w v u t s r q p o n m l k j i h g f e d c b a ` _ ^ ] \ [ Z Y X W V U T S R QQHead); if ((TempXmitQHead == XmitQTail) && ((XmitDescCopy.EXmitMsgStruct.EXmitFlags & XmitOwn) != RidgeOwned)) { /* transmit queue is full */ printf("GetXmitBuf: ran out of xmit buffers\n"); return(ErBufWaitTimeOut); } ReadXmitDesc(TempXmitQHead); return(ErOK); } /* end GetXmitBuf */ /* * Test the validity of the current receive buffer (the buffer whose * descriptor is in our RAM copy). Return any unusual conditions. */ Error TestRecvBufValid(QPtr) int *QPtr; { #ifdef DEBUG if ((RecvDescCopy.ERecvMsgStruct.ERecvBuffAddrHi) != SwapBits(*QPtr)) { printf("Mapping RAM index (%x) for recv buffer # %x trashed\n", RecvDescCopy.ERecvMsgStruct.ERecvBuffAddrHi, SwapBits(*QPtr)); return(ErBadMappingRAM); } #endif /* DEBUG */ if ((RecvDescCopy.ERecvMsgStruct.ERecvFlags & RecvOwn) != RidgeOwned) return(ErNoData); if (RecvDescCopy.ERecvMsgStruct.ERecvFlags & RecvError) { DebugPrint(DebugWBStats, ("WBStats: error status on receive, flags = %x\n", RecvDescCopy.ERecvMsgStruct.ERecvFlags)); /* * Framing Error and CRC Error are valid only in the last buffer of * a packet. Overflow is only valid before the last buffer of a * packet. All other fields are assumed to only be set in the last * buffer of a packet, otherwise an error could be counted more * than once: once or more before the complete packet is received, * and once after. */ if ((RecvDescCopy.ERecvMsgStruct.ERecvFlags & (FramingError | EndRecvPacket)) == (FramingError | EndRecvPacket)) { Stats.StatsFramingErr++; DebugPrint(DebugWBStats, ("WBStats: recv framing error\n")); } if ((RecvDescCopy.ERecvMsgStruct.ERecvFlags & (Overflow | EndRecvPacket)) == Overflow) { Stats.StatsOverflow++; DebugPrint(DebugWBStats, ("WBStats: recv overflow\n")); } if ((RecvDescCopy.ERecvMsgStruct.ERecvFlags & (CRCError | EndRecvPacket)) == (CRCError | EndRecvPacket)) { Stats.StatsCRCError++; DebugPrint(DebugWBStats, ("WBStats: recv CRC error\n")); } /* * Receive buffer error occurs when the LANCE needed to chain to the * next receive buffer, but was unable to do so because it did not own * the buffer. This implies an end of packet condition, although it * is not explicitly set. Set the end of packet for the caller. */ if (RecvDescCopy.ERecvMsgStruct.ERecvFlags & RecvBufferError) { RecvDescCopy.ERecvMsgStruct.ERecvFlags |= EndRecvPacket; Stats.StatsRecvBuf++; DebugPrint(DebugWBStats, ("WBStats: recv buffer error\n")); } return(ErRecvError); } return(ErOK); } /* end TestRecvBufValid */ /* * Find the buffer which is the end of the current packet. Verify that it, * the buffer which is the start of packet, and all buffers in between are * error-free and owned by us rather than the LANCE. Note that the first * error encountered is usually the error which will be returned, even if * we continue perusing the queue for the end of packet. The queue pointer * is updated to point to the end of the packet, if any. */ Error FindRecvPktEnd(QPtr) int *QPtr; { Error err; Error newerr; int count = 0; *QPtr = RecvQHead; ReadRecvDesc(*QPtr); /* check validity of first buffer in packet */ err = TestRecvBufValid(QPtr); if (err == ErNoData) return(err); if ((RecvDescCopy.ERecvMsgStruct.ERecvFlags & StartRecvPacket) == 0) { TracePrint(TraceAll, ("No start packet on receive\n")); if (!err) err = ErBadRecvFlags; } /* * check validity of remaining buffers in packet, while finding the * last buffer in the packet */ while ((RecvDescCopy.ERecvMsgStruct.ERecvFlags & EndRecvPacket) == 0) { IncrRecvQPtr((*QPtr)); ReadRecvDesc(*QPtr); newerr = TestRecvBufValid(QPtr); if (!err) err = newerr; if (newerr == ErNoData) return(ErNoData); if (RecvDescCopy.ERecvMsgStruct.ERecvFlags & StartRecvPacket) { TracePrint(TraceAll, ("Encountered another start of packet before end of packet\n")); if (!err) err = ErBadRecvFlags; } /* * We assume that we will eventually encounter either an end of * packet or a buffer belonging to the LANCE. This is not * necessarily so, e.g., receiving data from a babbling node * exhausts all of the receive buffers, sets receive buffer error, * but does not set end of packet. (We have a special hack for * this in TestRecvBufValid, but there could be other cases which * invalidate our assumption.) So, make sure we don't loop forever * reading receive buffer descriptors. Instead, reset to clear the * error and indicate there is no more data currently. This relies * on the higher level protocols to recover the data we've thrown * away. */ count++; if (count >= RecvNumBufs) { printf("All receive buffers used by one packet!\n"); wbetreset(); return(ErNoData); } } /* while */ return(err); } /* end FindRecvPktEnd */ /* * Initialize the wonderboard */ Error WB_Init() { register Error err; /* Check if self test passed on the board */ WBRead(IORAMAddr + DiagCtrlBlk + OffsetFunc(diagCBCopy, DB_BdFailures), &(diagCBCopy.DB_BdFailures)); if (diagCBCopy.DB_BdFailures != ErOK) { err = (unsigned) (diagCBCopy.DB_BdFailures) + ErSelfTest; if ((err < ErUnknownSelfTestErr) #ifdef DEBUG || (trace & TraceErrors) #endif DEBUG ) { printf("self test error: "); switch (err) { case ErLANCERegs: printf("LANCE register test"); break; case ErLocalMemory: printf("local memory test"); break; case ErSharedMemory: printf("shared memory test"); break; case ErLANCEInit: printf("LANCE initialization test"); break; default: printf("unknown self test error"); } printf(", error = %x\n", err); if (err < ErUnknownSelfTestErr) return(err); } } D_Cpt_Init = 0; F_Cpt_Init = 0; F_Cpt_Cmd = 0; D_Cpt_Cmd = 0; /* enable interrupts for the ethernet controller */ SleepOK = TRUE; err = doWBEnEtherCmd; if (err != ErOK) { printf("cannot enable CIO ethernet command interrupts %d\n", err); return(err); } /* * Reinitialize the LANCE. Issue a stop command to the LANCE to get it * into a known state. Note that CSR1 is corrupted when the stop * command is issued. Since we subsequently reinitialize it, this * should not present a problem. */ etherCBCopy.EWriteData.EReg0 = CSR0_InterruptEnable + CSR0_StopCmd; err = WBWrite(IORAMAddr + etherCB + OffsetFunc(etherCBCopy, EWriteData.EReg0), etherCBCopy.EWriteData.EReg0); if (err == ErOK) { SleepOK = TRUE; err = doWBWriteReg0Cmd; } if (err != ErOK) { printf("could not write CSR0; err = %d\n", err); return(err); } /* Enable interrupts for the LANCE */ SleepOK = TRUE; err = doWBEnLANCECmd; if (err != ErOK) { printf("cannot enable CIO LANCE interrupts %d\n", err); return(err); } err = CreateInitBlock(); if (err == ErOK) { err = WriteInitBlock(); if (err == ErOK) { err = InitDescRings(); if (err == ErOK) err = InitStartCmds(); } } return(err); } /* end WB_Init */ /* * Read receive data from Wonderboard. If any buffer in the packet has an * error, discard the packet and return the error. If a complete packet is * not available, return status indicating that no data is available. */ WB_Read(sourceAddr, destAddr, protocolID) NodeAddressType *sourceAddr; NodeAddressType *destAddr; Halfword *protocolID; { int i; int LastPktPtr; Error err; Boolean acceptPacket; tryAgain: err = FindRecvPktEnd(&LastPktPtr); /* * Discard all buffers in the packet if any of them had any type of * error. If the error was recoverable, try to get the next packet. * Otherwise, return the error. */ if (err != ErOK) { if (err != ErNoData) { while (RecvQHead != LastPktPtr) { ReleaseRecvBuf(RecvQHead); IncrRecvQPtr(RecvQHead); } ReleaseRecvBuf(RecvQHead); IncrRecvQPtr(RecvQHead); } if (err == ErRecvError) goto tryAgain; return(err); } /* * Verify that the packet is for us. The Rev C LANCE parts will only * receive packets which are for us, but they will occasionally insert * one or more bytes in front of the packet, thus we must verify the * address is valid. Accept packets with our physical address. Also * accept broadcast packets. */ acceptPacket = TRUE; /* check if address is our physical address */ for (i = 0; i < AddressLen; i++) { if (*(((u_char *) RecvBufs[RecvQHead]) + i) != localAddress.a[i]) { acceptPacket = FALSE; break; } } if (!acceptPacket) { /* * Address did not match our physical address; check if it's a * broadcast. */ acceptPacket = TRUE; for (i = 0; i < AddressLen; i++) { if (*(((u_char *) RecvBufs[RecvQHead]) + i) != etherbroadcastaddr[i]) { acceptPacket = FALSE; break; } } } if (!acceptPacket) { /* discard the packet, since it's not for us */ TracePrint(TraceAll, ("WB_Read: received extraneous packet\n")); #ifdef DEBUG if (trace & TraceAll) dumpWBFrame(RecvBufs[RecvQHead], "Reading", MIN(RecvDescCopy.ERecvMsgStruct.ERecvMsgByteCnt, BufferSize)); #endif /* DEBUG */ while (RecvQHead != LastPktPtr) { ReleaseRecvBuf(RecvQHead); IncrRecvQPtr(RecvQHead); } ReleaseRecvBuf(RecvQHead); IncrRecvQPtr(RecvQHead); goto tryAgain; } /* Discard packets which are too short to be legal */ if ((((int) RecvDescCopy.ERecvMsgStruct.ERecvMsgByteCnt) - (sizeof(struct ether_header) + EtherFCSSize)) < 0) { #ifdef DEBUG TracePrint(TraceAll, ("WB_Read: received too short packet\n")); DumpDesc(); if (trace & TraceAll) dumpWBFrame(RecvBufs[RecvQHead], "Reading", MIN(RecvDescCopy.ERecvMsgStruct.ERecvMsgByteCnt, BufferSize)); #endif /* DEBUG */ nbpkterr++; printf("%x paquets veroles\n",nbpkterr); while (RecvQHead != LastPktPtr) { ReleaseRecvBuf(RecvQHead); IncrRecvQPtr(RecvQHead); } ReleaseRecvBuf(RecvQHead); IncrRecvQPtr(RecvQHead); goto tryAgain; } /* * Read destination address, source address, and protocol ID * (from,to,length). */ bcopy(((u_char *) RecvBufs[RecvQHead]), (u_char *) destAddr, sizeof(*destAddr)); bcopy(((u_char *) RecvBufs[RecvQHead] + sizeof(*destAddr)), (u_char *) sourceAddr, sizeof(*sourceAddr)); bcopy(((u_char *) RecvBufs[RecvQHead] + sizeof(*destAddr) + sizeof(*sourceAddr)), (u_char *) protocolID, sizeof(*protocolID)); WBLength = (int) RecvDescCopy.ERecvMsgStruct.ERecvMsgByteCnt; WBOffset = 0; #ifdef DEBUG if (trace & TraceFrames) dumpWBFrame(RecvBufs[RecvQHead], "Reading", MIN(WBLength, BufferSize)); #endif /* DEBUG */ return(ErOK); } /* end WB_Read */ /* fonction permettant de faire un traitement des trames recues en mode user */ /* a partir d'une interruption */ wbetopen() { struct ifqueue *ifq; u_short protection; struct mbuf *m; if (tcpipOpen) return; tcpipOpen = TRUE; ifq = &ipintrq; while (1) { sleep(wbetopen,PRIOR); do { protection = spl7(); IF_DEQUEUE(ifq,m); splx(protection); ipintr(m); } while (m); } } /* end wbetopen */ #ifdef DEBUG /*-----------------------------------*/ /* DEBUG2 */ /*-----------------------------------*/ debug2 (ptchaine,v0,v1,v2,v3,v4) char *ptchaine; unsigned long v0; unsigned long v1; unsigned long v2; unsigned long v3; unsigned long v4; { register short i; unsigned long a[8]; unsigned long var[5]; unsigned short car_courant; unsigned long *ptvar; short s; s = spl7(); var[0] = v0; var[1] = v1; var[2] = v2; var[3] = v3; var[4] = v4; ptvar = &var[0]; car_courant = ligne_courante * LG_LIGNE; if (init_debug == 0) { init_debug++; printf("adresse zone de trace du communicateur = %x\n",&texte[0]); } while (*ptchaine != '\0') { if (*ptchaine != '%') texte[car_courant++] = *(ptchaine++); else { ptchaine = ptchaine + 2; a[7] = *ptvar++; a[6] = a[7] >> 4 ; a[5] = a[6] >> 4 ; a[4] = a[5] >> 4 ; a[3] = a[4] >> 4 ; a[2] = a[3] >> 4 ; a[1] = a[2] >> 4 ; a[0] = a[1] >> 4 ; for (i=0;(i != 7) && (a[i] == 0);i++); for (;(i <= 7);texte[car_courant++] = ascii[a[i++] & 0xf] ); } } ligne_courante++; if (ligne_courante >= NB_LIGNES) ligne_courante = 0; car_courant = ligne_courante * LG_LIGNE; for (i=0;i < 16 ; texte[car_courant+(i++)] = '!'); for ( ;i < LG_LIGNE ; texte[car_courant+(i++)] = ' '); splx(s); return ; } /* end debug2 */ #endif #ident " @(#)wonder.c 4.7 87/05/14 " /* wonder.c */ /* * Ridge Ethernet Driver - Wonderboard interface */ #include #include #include "mbuf.h" #include "sys/socket.h" #include #include "sys/bsdioctl.h" #include #include #include #include #define PageSize NBPP #define MBIGSIZE PageSize typedef unsigned long n_long; #include "net/if.h" #include "net/route.h" #include "netinet/in.h" #include "netinet/ip.h" #include "netinet/if_ether.h" #ifdef DEBUG #include "trace.h" #endif #include "wonder.h" #include "lance.h" typedef unsigned int Error; typedef unsigned int Boolean; typedef unsigned short Halfword; #define ErOK 0 #define FALSE 0 #define TRUE 1 #ifdef DEBUG /* variables pour debug */ #define TAILLE_DEBUG 0x10000 #define LG_LIGNE 0x40 #define NB_LIGNES TAILLE_DEBUG/LG_LIGNE u_short Anneau[256]; char texte[TAILLE_DEBUG]; unsigned short ligne_courante = 0; unsigned short init_debug = 0; char ascii[0x10] = {'0','1','2','3','4','5','6','7','8', '9','a','b','c','d','e','f'}; #endif /* DEBUG */ unsigned short nbpkterr = 0; Boolean tcpipOpen = FALSE; /* Global routines defined in this module */ int wbetattach(); int wbetinit(); int wbetioctl(); int wbetoutput(); int wbetopen(); int wbetreset(); /* External data structures */ extern struct ifnet loif; extern u_char etherbroadcastaddr[6]; extern struct in_addr arpmyaddr(); /* External routines referenced (non-integer functions) */ extern struct mbuf *m_get(); extern struct mbuf *m_freem(); extern struct mbuf *m_getbig(); extern struct mbuf *m_copy(); extern Error d_read(); extern Error d_write(); /* Local routines (non-integer functions) requiring forward references */ Error bad_Write(); Error AllocDescRings(); struct mbuf *copyLANCEBufToMbuf(); FrameType *sptalloc(); Error copyMbufToLANCEBuf(); Error GetXmitBuf(); Error GetWonderBoard(); Error LANCEError(); Error packetXmitted(); Error ReadRevCodes(); Error WB_Init(); Error WBRead(); Error WBWrite(); Error InitStartCmds(); Error WriteWBCommand(); /* fonction de timeout */ int XmitTimeout(); int CmdTimeout(); int StartTimeout(); int BufTimeout(); /*************************************/ /* VAR beginning of global variables */ /*************************************/ /* * Ethernet software structure for the interface. * * Each interface is referenced by a network interface structure, * es.ac_if, which the routing code uses to locate the interface. * This structure contains the output queue for the interface, its address, ... */ static struct arpcom es; /* common Ethernet structures */ NodeAddressType localAddress; Boolean SleepOK; /* TRUE pour synchroniser les requetes au controleur */ /* FALSE quand on est sous IT */ Boolean WBPresent; /* TRUE if wonderboard is present */ Boolean WBDriverInited; /* TRUE if ethernet is present & driver init'd OK */ static Boolean ipintrqFull; /* TRUE if we can't give a buffer to ip */ /* pointers to buffers */ FrameType *RecvBufs[RecvNumBufs]; /* points to buffers we will put read data into */ FrameType *XmitBufs[XmitNumBufs]; /* where to find data to write */ realAddress RealRecvBufs[RecvNumBufs]; /* real address of RecvBufs */ realAddress RealXmitBufs[XmitNumBufs]; /* real address of XmitBufs */ int RecvQHead; /* index into RecvBufs for next buf to read */ /* XmitQ is full when buffer at XmitQHead belongs */ /* to LANCE and TempXmitQHead = XmitQTail */ int XmitQHead; /* index into XmitBufs for last buffer filled */ /* next packet will start at next buffer */ int XmitQTail; /* index into XmitBufs of first buffer of next packet */ /* for LANCE to free */ int TempXmitQHead; /* used in filling buffers for a single packet */ /* error statistics */ /* WARNING: As a global variable, we assume this structure is initially zero */ struct { int StatsMoreRetries; /* xmit stats */ int StatsOneRetry; int StatsDeferred; int StatsXmitBuf; int StatsUnderflow; int StatsLateCollision; int StatsLostCarrier; int StatsRetryError; int StatsBabble; /* general stats */ int StatsCollision; int StatsMissedPkt; int StatsMemoryError; int StatsFlushedLANCEInt; int StatsIntQOverflow; int StatsFramingErr; /* receive stats */ int StatsOverflow; int StatsCRCError; int StatsRecvBuf; } Stats; InitBlockStruct InitBlockCopy; etherCBStruct etherCBCopy; diagCBStruct diagCBCopy; RecvMsgDesc RecvDescCopy; XmitMsgDesc XmitDescCopy; /* erreurs retournees par les differents timeouts */ Error TO_ErrXmit; Error TO_ErrInit; Error TO_ErrCmd; #define PRIOR 20 /* etat d'activation des differents entrees sorties */ unsigned int D_Cpt_Init; /* nombre init demande */ unsigned int F_Cpt_Init; /* nombre init recu */ unsigned int D_Cpt_Cmd; /* nombre commandes envoyees */ unsigned int F_Cpt_Cmd; /* nombre commandes recues */ int WBDevice; /* I/O address of WonderBoard */ int WBLength; int WBOffset; int IOMapAddr; int IORAMAddr; /*******************************/ /* MACROS */ /*******************************/ /* WARNING: This macro must be invoked with the parameter "string" in parentheses */ #ifdef DEBUG #define DebugPrint(flag,string) if (xebug & flag) debug2 string #else #define DebugPrint(flag,string) /* nop */ #endif /* DEBUG */ /* WARNING: This macro must be invoked with the parameter "string" in parentheses */ #ifdef DEBUG #define TracePrint(flag,string) if (trace & flag) debug2 string #else #define TracePrint(flag,string) /* nop */ #endif /* DEBUG */ #ifdef DEBUG #define doWBWriteRegsCmd \ WriteWBCommand(EWriteRegsCmd); \ DebugPrint(DebugWBCommands,("WriteRegsCmd\n")) #define doWBWriteReg0Cmd \ WriteWBCommand(EWriteReg0Cmd); \ DebugPrint(DebugWBCommands,("WriteReg0Cmd\n")) #define doWBReadAddrCmd \ WriteWBCommand(EReadAddrCmd); \ DebugPrint(DebugWBCommands,("ReadAddrCmd\n")) #define doWBDmdXmitCmd \ WriteWBCommand(EDemandXmitCmd); \ DebugPrint(DebugWBCommands,("DemandXmitCmd\n")) #define doWBEnLANCECmd \ WriteWBCommand(EEnLANCECmd); \ DebugPrint(DebugWBCommands,("EnableLANCECmd\n")) #define doWBDisLANCECmd \ WriteWBCommand(EDisLANCECmd); \ DebugPrint(DebugWBCommands,("DisableLANCECmd\n")) #define doWBEnEtherCmd \ WriteWBCommand(EEnEtherCmd); \ DebugPrint(DebugWBCommands,("EnableEtherCmd\n")) #define doWBDisEtherCmd \ WriteWBCommand(EDisEtherCmd); \ DebugPrint(DebugWBCommands,("DisableEtherCmd\n")) #else #define doWBWriteRegsCmd WriteWBCommand(EWriteRegsCmd) #define doWBWriteReg0Cmd WriteWBCommand(EWriteReg0Cmd) #define doWBReadAddrCmd WriteWBCommand(EReadAddrCmd) #define doWBDmdXmitCmd WriteWBCommand(EDemandXmitCmd) #define doWBEnLANCECmd WriteWBCommand(EEnLANCECmd) #define doWBDisLANCECmd WriteWBCommand(EDisLANCECmd) #define doWBEnEtherCmd WriteWBCommand(EEnEtherCmd) #define doWBDisEtherCmd WriteWBCommand(EDisEtherCmd) #endif /* DEBUG */ #define OffsetFunc(structure,element) \ (((u_char *) &structure.element) - ((u_char *) &structure)) /* WARNING: The caller is expected to verify IOData is a u_char */ #define WBWriteHi(IOAddr,IOData) \ WBWrite(IOAddr + 1, IOData << ByteShiftCount) #define WBWriteLo(IOAddr,IOData) \ WBWrite(IOAddr + BHE - 1, IOData & LoByteMask) #define ReadXmitFlags(BufNum) \ (void) WBRead(IORAMAddr + etherXmitRing + (BufNum * RingDescSize) + \ OffsetFunc(XmitDescCopy, EXmitHalfWord[1]), \ &(XmitDescCopy.EXmitHalfWord[1])) #define WriteRecvFlags(BufNum) \ (void) WBWriteHi(IORAMAddr + etherRecvRing + (BufNum * RingDescSize) + \ OffsetFunc(RecvDescCopy, ERecvMsgStruct.ERecvFlags), \ RecvDescCopy.ERecvMsgStruct.ERecvFlags) #define WriteXmitFlags(BufNum) \ (void) WBWriteHi(IORAMAddr + etherXmitRing + (BufNum * RingDescSize) + \ OffsetFunc(XmitDescCopy, EXmitMsgStruct.EXmitFlags), \ XmitDescCopy.EXmitMsgStruct.EXmitFlags) #define WriteXmitByteCnt(BufNum) \ (void) WBWrite(IORAMAddr + etherXmitRing + (BufNum * RingDescSize) + \ OffsetFunc(XmitDescCopy, EXmitMsgStruct.EXmitBuffByteCnt), \ XmitDescCopy.EXmitMsgStruct.EXmitBuffByteCnt) #define ReadIntQHead \ (void) WBRead(IORAMAddr + etherCB + OffsetFunc(etherCBCopy, EIntHead), \ &(etherCBCopy.EIntHead)) #define ReadIntQTail \ (void) WBRead(IORAMAddr + etherCB + OffsetFunc(etherCBCopy, EIntTail), \ &(etherCBCopy.EIntTail)) #define IncrIntQHead \ (etherCBCopy.EIntHead = (etherCBCopy.EIntHead == LANCEQEnd ? \ LANCEQBegin : etherCBCopy.EIntHead + IntQEntrySize)) #define WriteIntQHead \ (void) WBWrite(IORAMAddr + etherCB + OffsetFunc(etherCBCopy, EIntHead), \ etherCBCopy.EIntHead) #define IncrRecvQPtr(QPtr) \ QPtr = (QPtr < RecvNumBufs - 1 ? ++QPtr : 0) #define IncrXmitQPtr(QPtr) \ QPtr = (QPtr < XmitNumBufs - 1 ? ++QPtr : 0) #define ReleaseRecvBuf(BufNum) \ { \ /* RecvDescCopy.ERecvMsgStruct.ERecvMsgByteCnt = 0; */ \ RecvDescCopy.ERecvMsgStruct.ERecvFlags = DefaultRecvFlags; \ WriteRecvFlags(BufNum); \ } int SwapBits(statusByte) register unsigned statusByte; { return (((statusByte & 0x01) << 7) + ((statusByte & 0x02) << 5) + ((statusByte & 0x04) << 3) + ((statusByte & 0x08) << 1) + ((statusByte & 0x10) >> 1) + ((statusByte & 0x20) >> 3) + ((statusByte & 0x40) >> 5) + ((statusByte & 0x80) >> 7)); } /* end SwapBits */ /* * Make the interface available if it exists, by filling in the network * interface record and initializing the hardware. The system will initialize * the interface when it is ready to accept packets. */ wbetattach() { register struct ifnet *ifp = &es.ac_if; struct sockaddr_in *sin; Error err; short protection; /* protection d'une sequence */ #ifdef DEBUG /* go into kdb to allow changing of trace flags */ printf("trace (@%x) = %x; xebug (@%x) = %x\n", &trace, trace, &xebug, xebug); call_debug(); #endif DEBUG protection=spl7(); TracePrint((TraceNet | TraceProcs), ("wbetattach\n")); ifp->if_unit = 0; ifp->if_name = "wb"; ifp->if_mtu = ETHERMTU; /* ethernet max transmission unit */ sin = (struct sockaddr_in *)&es.ac_if.if_addr; sin->sin_family = AF_INET; /* get my arpanet address, NOT implemented */ sin->sin_addr = arpmyaddr((struct arpcom *) 0); ifp->if_init = wbetinit; ifp->if_ioctl = wbetioctl; ifp->if_output = wbetoutput; ifp->if_reset = wbetreset; ifp->if_flags |= (IFF_NOTRAILERS + IFF_BROADCAST); /* Initialize WB stuff */ ipintrqFull = FALSE; /* direct WonderBoard interrupts to us */ err = GetWonderBoard(); if (err != ErOK) { if (err != ErNoWonderBoard) printf("network interface down\n"); WBDriverInited = FALSE; splx(protection); return; } /* * Allocate buffers from the heap, fix the buffers in memory, and * translate virual addresses of buffers to real addresses. */ err = AllocDescRings(); if (err != ErOK) { printf("network interface down\n"); WBDriverInited = FALSE; disableWBInterrupts(); splx(protection); return; } /* * Write the real memory addresses of the transmit and receive buffers to the * descriptor rings in shared memory. Tell the LANCE to initialize */ err = WB_Init(); if (err != ErOK) { printf("network interface down\n"); WBDriverInited = FALSE; disableWBInterrupts(); splx(protection); return; } /* Add interface to ifnet */ if_attach(ifp); printf("ethernet initialized\n"); splx(protection); } /* end wbetattach */ /* * Initialize the interface */ wbetinit() { register struct ifnet *ifp = &es.ac_if; register struct sockaddr_in *sin; short protection; /* protection d'une sequence */ protection = spl7(); TracePrint((TraceNet | TraceProcs), ("wbetinit\n")); sin = (struct sockaddr_in *)&ifp->if_addr; /* If the address is still unknown then return */ if (sin->sin_addr.s_addr == 0) { splx(protection); return; } /* set interface to ready only if ethernet is present */ if (!WBDriverInited) { es.ac_if.if_flags &= ~(IFF_UP|IFF_RUNNING); splx(protection); return; } if ((es.ac_if.if_flags & IFF_RUNNING) == 0) es.ac_if.if_flags |= IFF_UP|IFF_RUNNING; /* add interface to routing tables */ if_rtinit(&es.ac_if, RTF_UP); /* attach interface to address resolution protocol */ arpattach(&es); arpwhohas(&es, &sin->sin_addr); splx(protection); } /* end wbetinit */ /* * Process an ioctl request. */ wbetioctl(ifp, cmd, data) register struct ifnet *ifp; int cmd; caddr_t data; { register struct ifreq *ifr = (struct ifreq *)data; Error err = ErOK; short protection; /* protection d'une sequence */ TracePrint(TraceProcs, ("wbetioctl\n")); if (!WBDriverInited) return(Erbaddevice); protection = spl7(); switch (cmd) { case SIOCSIFADDR: if (ifp->if_flags & IFF_RUNNING) if_rtinit(ifp, -1); /* delete previous route */ wbsetaddr(ifp, (struct sockaddr_in *)&ifr->ifr_addr); wbetinit(); break; case SIOCGIFADDR: bcopy((caddr_t)&ifp->if_addr, (caddr_t)&ifr->ifr_addr, sizeof(struct sockaddr)); break; default: err = EINVAL; } splx(protection); return (err); } /* end wbetioctl */ wbsetaddr(ifp, sin) register struct ifnet *ifp; register struct sockaddr_in *sin; { ifp->if_addr = *(struct sockaddr *)sin; ifp->if_net = in_netof(sin->sin_addr); ifp->if_host[0] = in_lnaof(sin->sin_addr); sin = (struct sockaddr_in *)&ifp->if_broadaddr; sin->sin_family = AF_INET; sin->sin_addr = if_makeaddr(ifp->if_net, INADDR_ANY); ifp->if_flags |= IFF_BROADCAST; } /* end wbsetaddr */ /* * Receive data is probably available. Due to the way receive interrupts are * processed, we may have an interrupt for data we've already processed, so * there may not always be data available when we expect it. */ Error wbetread() { Halfword Etype; struct mbuf *m; register struct ifqueue *inq; NodeAddressType Dest; NodeAddressType Source; Error err = ErOK; if (!WBDriverInited) { err = Erbaddevice; return(err); } while ((!ipintrqFull) && (err = WB_Read(&Source, &Dest, &Etype)) != ErNoData) { if (err != ErOK) { TracePrint(TraceAll, ("error in read = %x\n", err)); es.ac_if.if_ierrors++; wbetreset(); return(err); } /* * If the tcpip device is not open, discard the packet since * there is nobody listening. */ if (!tcpipOpen) { TracePrint(TraceAll, ("tcpip device not open; discarding pkts\n")); while (WBLength > 0) { WBLength -= BufferSize; ReleaseRecvBuf(RecvQHead); IncrRecvQPtr(RecvQHead); } WBLength = 0; return(ErOK); } es.ac_if.if_ipackets++; /* check for trailer protocol, & make sure it's valid */ if (Etype >= ETHERPUP_TRAIL && Etype < ETHERPUP_TRAIL + ETHERPUP_NTRAILER) { int trailerOffset; int trailerLength; struct mbuf *mtemp; trailerOffset = ((int)Etype - ETHERPUP_TRAIL) * 512; if (trailerOffset > ETHERMTU) { #ifdef DEBUG if (trace & TraceAll) { TracePrint(TraceAll, ("ns: wbetread, dropping packet: trailer error: EType = %x\n", Etype)); dumpWBFrame(RecvBufs[RecvQHead], "Reading", MIN(RecvDescCopy.ERecvMsgStruct.ERecvMsgByteCnt, BufferSize)); } #endif /* DEBUG */ es.ac_if.if_ierrors++; return(err); } /* Discard the ethernet header and copy the data into mbufs. */ WBOffset += sizeof(struct ether_header); WBLength -= (sizeof(struct ether_header) + EtherFCSSize); m = copyLANCEBufToMbuf(); if (m == 0) { TracePrint(TraceAll, ("trailer: copyLANCEBufToMbuf returned 0\n")); goto nomorembuf; } /* Copy the trailer into new mbufs, then get the packet */ /* type and length of the trailer from the new copy. */ mtemp = m_copy(m, trailerOffset, M_COPYALL); Etype = *(mtod(mtemp,Halfword *)); mtemp->m_off += sizeof(Etype); mtemp->m_len -= sizeof(Etype); trailerLength = *(mtod(mtemp,Halfword *)); mtemp->m_off += sizeof(Halfword); mtemp->m_len -= sizeof(Halfword); /* Delete the trailer from the end of the mbufs and */ /* concatenate the new mbuf with the trailer with the */ /* older mbufs with the data. */ m_adj(m, -trailerLength); m_cat(mtemp,m); m = mtemp; goto doippacket; } switch (Etype) { case ETHERPUP_IPTYPE: /* Discard the ethernet header and copy the data into mbufs. */ WBOffset += sizeof(struct ether_header); WBLength -= (sizeof(struct ether_header) + EtherFCSSize); m = copyLANCEBufToMbuf(); if (m == 0) { TracePrint(TraceAll, ("ip: copyLANCEBufToMbuf returned 0\n")); goto nomorembuf; } doippacket: /* queue IP type packets for IP to process later */ DebugPrint(DebugWBProcs, ("wbetread: IP packet read, mbuf = %x\n", m)); inq = &ipintrq; if (IF_QFULL(inq)) { TracePrint(TraceAll, ("ipintrq full\n")); ipintrqFull = TRUE; IF_DROP(inq); m_freem(m); } else { TracePrint(TraceAll, ("enqueue: m = %x\n", m)); IF_ENQUEUE(inq,m); wakeup(wbetopen); } break; case ETHERPUP_ARPTYPE: /* ARP packets are handled by that protocol */ /* Put the data into mbufs. Strip the ether header */ WBOffset += sizeof(struct ether_header); WBLength -= (sizeof(struct ether_header) + EtherFCSSize); m = copyLANCEBufToMbuf(); if (m == 0) { TracePrint(TraceAll, ("arp: copyLANCEBufToMbuf returned 0\n")); goto nomorembuf; } DebugPrint(DebugWBProcs, ("wbetread: ARP packet read, mbuf = %x\n", m)); TracePrint(TraceAll, ("arp pkt received\n")); arpinput(&es, m); break; default: /* * If there is a place for this unknown (raw) packet, * save it */ if (!rawbuffer()) { m = copyLANCEBufToMbuf(); if (m == 0) { TracePrint(TraceAll, ("raw: copyLANCEBufToMbuf returned 0\n")); goto nomorembuf; } TracePrint(TraceAll, ("raw pkt received\n")); rawinput(m); } else { /* delete packet */ TracePrint(TraceAll, ("wbetread: illegal packet Etype = %x\n", Etype)); TracePrint(TraceBadType, ("wbetread: illegal packet Etype = %x\n", Etype)); #ifdef DEBUG if (trace & TraceBadType) dumpWBFrame(RecvBufs[RecvQHead], "Reading", MIN(RecvDescCopy.ERecvMsgStruct.ERecvMsgByteCnt, BufferSize)); #endif /* DEBUG */ while (WBLength > 0) { WBLength -= BufferSize; ReleaseRecvBuf(RecvQHead); IncrRecvQPtr(RecvQHead); } WBLength = 0; } break; } } nomorembuf: ipintrqFull = FALSE; WBLength = 0; WBOffset = 0; return(ErOK); } /* end wbetread */ /* * Interrupt from LANCE. */ wbetintr(dev,IOIR) int dev; /* pour normaliser l'interface */ int IOIR; { u_short status; u_short completeStatus = 0; Error err; TracePrint(TraceProcs, ("wbetintr: IOIR = %x\n", IOIR)); ReadIntQHead; ReadIntQTail; while (etherCBCopy.EIntHead != etherCBCopy.EIntTail) { (void) WBRead(IORAMAddr + etherCBCopy.EIntHead, &status); completeStatus |= status; #ifdef DEBUG if ((status & CSR0_InterruptBits) == 0) { /* * Wonderboard says the LANCE interrupted, but the status * from the LANCE contradicts this. */ DebugPrint((DebugWBInterrupts | DebugWBStats), ("wbetintr: receive unknown interrupt, CSR0 = %x\n", status)); } #endif /* DEBUG */ if (status & CSR0_ErrorFlag) { DebugPrint((DebugWBInterrupts | DebugErrorMsgs | DebugWBStats), ("wbetintr: LANCE Error on Interrupt, CSR0 = %x\n", status)); err = LANCEError(status); if (err != ErOK) { IncrIntQHead; WriteIntQHead; return(err); } } IncrIntQHead; WriteIntQHead; ReadIntQTail; } if (completeStatus & CSR0_RecvInterrupt) { DebugPrint(DebugWBInterrupts, ("wbetintr: LANCE Receive Interrupt, CSR0 = %x\n", status)); err = wbetread(); if (err != ErOK) return(err); } if (completeStatus & CSR0_XmitInterrupt) { DebugPrint(DebugWBInterrupts, ("wbetintr: LANCE Xmit Interrupt, CSR0 = %x\n", status)); err = packetXmitted(); if (err != ErOK) return(err); } if (completeStatus & CSR0_InitDone) { if (WBDriverInited) { DebugPrint((DebugWBInterrupts | DebugWBInit), ("wbetintr: LANCE Init Done Interrupt, CSR0 = %x\n", status)); F_Cpt_Init++; DebugPrint(DebugWBTimer, ("Init wakeup (wbintr); D_Cpt_Init = %x, F_Cpt_Init = %x\n", D_Cpt_Init, F_Cpt_Init)); wakeup(InitStartCmds); } } return(ErOK); } /* end wbetintr */ /* * Encapsulate a packet for output on the local net. Create the ethernet * header as necessary for the packet type specified in the destination * structure. If the packet is addressed to us (either specifically or * through a broadcast), then loop it back on the loopback device. */ wbetoutput(ifp, m0, dst) struct ifnet *ifp; struct mbuf *m0; struct sockaddr *dst; { int type = 0; Error err = ErOK; u_char edst[6]; struct in_addr idst; register struct mbuf *m = m0; register struct ether_header *ec; register int off; struct mbuf *mcopy = (struct mbuf *)0; int tempQPtr; int offset; short protection; /* protection d'une sequence */ TracePrint(TraceProcs, ("wbetoutput\n")); if (!WBDriverInited) return(Erbaddevice); protection = spl7(); switch (dst->sa_family) { #ifdef INET case AF_INET: idst = ((struct sockaddr_in *)dst)->sin_addr; if (!arpresolve(&es, m, &idst, edst)) { splx(protection); return(ErOK); /* if not yet resolved */ } if (in_lnaof(idst) == INADDR_ANY) mcopy = m_copy(m, 0, (int)M_COPYALL); off = ntohs((u_short)mtod(m, struct ip *)->ip_len) - m->m_len; /* need per host negociation */ if ((ifp->if_flags & IFF_NOTRAILERS) == 0) if (off > 0 && (off & 0x1ff) == 0 && m->m_off >= MMINOFF + 2 * sizeof(u_short)) { type = ETHERPUP_TRAIL + (off>>9); m->m_off -= 2 * sizeof(u_short); m->m_len += 2 * sizeof(u_short); *mtod(m, u_short *) = ntohs((u_short)ETHERPUP_IPTYPE); *(mtod(m, u_short *) + 1) = ntohs((u_short)m->m_len); goto gottrailertype; } type = ETHERPUP_IPTYPE; goto gottype; #endif /* INET */ case AF_IMPLINK: /* * Copy the data as well as the ether header from the mbuf chain * to the LANCE transmit buffers. This uses an offset of zero. * The copy may fail if there are no free LANCE transmit buffers * within a reasonable length of time. */ err = copyMbufToLANCEBuf(m, 0); if (err != ErOK) goto bad; /* * Update the head of the xmit queue to be the first buffer of the * newly formed packet */ IncrXmitQPtr(XmitQHead); ec = (struct ether_header *) (XmitBufs[XmitQHead]); goto gotheader; case AF_UNSPEC: ec = (struct ether_header *)dst->sa_data; bcopy((caddr_t)ec->ether_dhost, (caddr_t)edst, sizeof(edst)); type = ec->ether_type; goto gottype; default: printf("wbet%x: can't handle af%x\n", ifp->if_unit, dst->sa_family); err = EAFNOSUPPORT; goto bad; } gottrailertype: /* * Packet to be sent as trailer: move first packet * (control information) to end of chain. */ while (m->m_next) m = m->m_next; m->m_next = m0; m = m0->m_next; m0->m_next = 0; m0 = m; gottype: /* * Copy the data from the mbuf chain to the LANCE transmit buffers. * The copy may fail if there are no free LANCE transmit buffers within * a reasonable length of time. Add the local net header. */ offset = sizeof(struct ether_header); /* copy the data to the output buffers */ err = copyMbufToLANCEBuf(m, offset); if (err != ErOK) goto bad; /* * Update the head of the xmit queue to be the first buffer of the * newly formed packet */ IncrXmitQPtr(XmitQHead); /* prepare to add ether header (destination addr, source addr & type field) */ ec = (struct ether_header *) (XmitBufs[XmitQHead]); /* copy the destination address to the output buffer */ bcopy((caddr_t)edst, (caddr_t)ec->ether_dhost, sizeof(edst)); /* copy the type field to the output buffer */ ec->ether_type = htons((u_short)type); gotheader: /* * copy the source address to the output buffer. Note that for * packet filter packets, the destination address and type fields * have already been filled in, so we only need copy the source * address field. */ bcopy((caddr_t)es.ac_enaddr, (caddr_t)ec->ether_shost, sizeof(es.ac_enaddr)); /* * Set the XmitOwn bits in buffers of the current packet, starting with * the last buffer in the packet. This gives the buffers to the LANCE. * Doing the first buffer in the packet last makes sure that the LANCE * has all of the buffers for the packet before it tries to transmit, * since it only looks ahead one buffer. Update the XmitQueue * pointers and issue a demand transmit command to the LANCE. */ tempQPtr = TempXmitQHead; while (tempQPtr != XmitQHead) { ReadXmitFlags(tempQPtr); XmitDescCopy.EXmitMsgStruct.EXmitFlags |= XmitOwn; WriteXmitFlags(tempQPtr); tempQPtr = (tempQPtr == 0 ? XmitNumBufs - 1 : --tempQPtr); } ReadXmitFlags(tempQPtr); XmitDescCopy.EXmitMsgStruct.EXmitFlags |= XmitOwn; WriteXmitFlags(tempQPtr); #ifdef DEBUG if (trace & TraceFrames) { dumpWBFrame(XmitBufs[XmitQHead], "Writing", (-(XmitDescCopy.EXmitMsgStruct.EXmitBuffByteCnt)) & 0XFFFF); } #endif /* DEBUG */ XmitQHead = TempXmitQHead; DebugPrint(DebugWBProcs, ("wbetoutput: output queued\n")); es.ac_if.if_opackets++; m0 = m; bad: m_freem(m0); if (err != ErOK) { TracePrint(TraceAll,("error in write = %d\n", err)); wbetreset(); es.ac_if.if_oerrors++; } splx(protection); return(mcopy ? looutput(&loif, mcopy, dst) : err); } /* end wbetoutput */ /* * Reset interface. */ wbetreset() { Error err; short protection; /* protection d'une sequence */ TracePrint(TraceProcs, ("wbetreset\n")); printf("resetting interface\n"); if (!WBDriverInited) return; protection=spl7(); /* Reinitialize the LANCE */ err = WB_Init(); if (err != ErOK) RemoveWBInterface(); splx(protection); return; } /* end wbetreset */ /* * Shutdown all ethernet operations on the wonderboard. This is called from panic(). */ wbshutdown() { TracePrint((TraceNet | TraceProcs), ("wbshutdown\n")); /* Stop the LANCE */ etherCBCopy.EWriteData.EReg0 = CSR0_InterruptEnable + CSR0_StopCmd; (void) WBWrite(IORAMAddr + etherCB + OffsetFunc(etherCBCopy, EWriteData.EReg0), etherCBCopy.EWriteData.EReg0); SleepOK = FALSE; (void) doWBWriteReg0Cmd; printf("LANCE has been stopped\n"); disableWBInterrupts(); WBDriverInited = FALSE; return; } /* end wbshutdown */ /* * Remove access to the interface by setting the IFF_DOWN flag. * Called when irrecoverable errors are detected. Do not try to * reinitialize the interface. Some form of operator invervention * is required. We stop the LANCE so it will no longer interract on * the network, and then disable interrupts from the ethernet portions * of the board, to improve system performance and simplify the * driver. */ RemoveWBInterface() { struct ifnet *ifp = &es.ac_if; es.ac_if.if_flags &= ~(IFF_UP|IFF_RUNNING); printf("removing interface\n"); /* Stop the LANCE */ etherCBCopy.EWriteData.EReg0 = CSR0_InterruptEnable + CSR0_StopCmd; (void) WBWrite(IORAMAddr + etherCB + OffsetFunc(etherCBCopy, EWriteData.EReg0), etherCBCopy.EWriteData.EReg0); SleepOK = FALSE; (void) doWBWriteReg0Cmd; printf("LANCE has been stopped\n"); disableWBInterrupts(); WBDriverInited = FALSE; } /* end RemoveWBInterface */ /* * Copy the number of bytes specified in WBLength from LANCE receive buffers * (offset by WBOffset) to mbufs. Assumes that that number of bytes exist * in LANCE receive buffers, and that the caller has verified the ownership * of the buffers and validity of the data. */ struct mbuf * copyLANCEBufToMbuf() { struct mbuf *m = 0; struct mbuf *front = 0; /* points to beginning of mbuf */ /* chain to be returned */ struct mbuf **lastPtr = &front; /* used in linking previous buffer */ /* to current buffer; contains addr */ /* of previous buff's m_next field */ int lengthCopied; int minimum; while (WBLength > 0 ) { /* * Get another mbuf if there is no current mbuf or the current mbuf * or bigbuf is full. Restore the offset in the current mbuf to the * beginning of the data. Initially set the new mbuf to be empty. */ if ((m == 0) || (m->m_off == MMAXOFF) || (m->m_len == MBIGSIZE)) { if (m != 0) m->m_off -= m->m_len; m = m_get(M_WAIT, MT_DATA); if (m == 0) goto nobuf; m->m_len = 0; /* * If the length to copy is larger than will fit into one mbuf, then * allocate a big buffer and set the mbuf to reference it. */ if (WBLength > MLEN) { struct mbuf *big = 0; MCLGET(big,1); if (big == 0) goto nobuf; m->m_off = (int) big - (int) m; } /* * Add the mbuf to the list. Note that on the first pass, this updates * front due to the way lastPtr is initialized. */ *lastPtr = m; lastPtr = &m->m_next; } /* get the next LANCE receive buffer if the current one is empty */ if (WBOffset == BufferSize) { ReleaseRecvBuf(RecvQHead); IncrRecvQPtr(RecvQHead); WBOffset = 0; } if (m->m_off > MMAXOFF) lengthCopied = MIN(MBIGSIZE - m->m_len, MIN(WBLength, (BufferSize - WBOffset))); else lengthCopied = MIN(MLEN - m->m_len, MIN(WBLength, (BufferSize - WBOffset))); /* copy the data (from, to, length) */ bcopy((u_char *) RecvBufs[RecvQHead] + WBOffset, mtod(m, caddr_t), lengthCopied); /* update the lengths */ WBLength -= lengthCopied; m->m_len += lengthCopied; WBOffset += lengthCopied; m->m_off += lengthCopied; } /* while */ /* Restore the offset into the mbuf to the beginning of the data */ m->m_off -= m->m_len; /* * If the ethernet FCS overflows into the next buffer, then release * the current buffer, and then fall through to release the next * buffer (with the FCS). */ if ((WBOffset + EtherFCSSize) > BufferSize) { ReleaseRecvBuf(RecvQHead); IncrRecvQPtr(RecvQHead); } /* * The last receive buffer in the packet was exhausted, so release * it and update the Q head. */ ReleaseRecvBuf(RecvQHead); IncrRecvQPtr(RecvQHead); /* return the mbuf chain */ return(front); nobuf: /* release the chain of mbufs */ m_freem(front); /* release the receive buffers for the packet */ minimum = MIN(WBLength , BufferSize - WBOffset); if (minimum == WBLength) { ReleaseRecvBuf(RecvQHead); IncrRecvQPtr(RecvQHead); } else { WBLength -= minimum; ReleaseRecvBuf(RecvQHead); IncrRecvQPtr(RecvQHead); while (WBLength > 0) { ReleaseRecvBuf(RecvQHead); IncrRecvQPtr(RecvQHead); WBLength -= BufferSize; } } WBLength = 0; return ((struct mbuf *) NULL); } /* end copyLANCEBufToMbuf */ /* * Copy data from mbuf(s) to LANCE transmit buffer(s). Assumes that the mbuf * total length is within the maximum frame size for ethernet. Also, assumes * that the offset specified by the caller is less than BufferSize (ie, is * within the first LANCE transmit buffer). The head of the transmit queue * is not updated, nor are the buffers given to the LANCE, so the caller can * fill in the header. The caller is expected to update these. */ Error copyMbufToLANCEBuf(m, offset) struct mbuf *m; int offset; { int length; int totalLength; int mbufOffset = 0; /* offset in addition to m->m_off */ Error err; TempXmitQHead = XmitQHead; IncrXmitQPtr(TempXmitQHead); err = GetXmitBuf(); if (err != ErOK) return(err); totalLength = offset; XmitDescCopy.EXmitMsgStruct.EXmitFlags = DefaultXmitFlags | StartXmitPacket; while (m != 0) { /* get the next mbuf if the current one is empty */ if (m->m_len == 0) { m = m->m_next; mbufOffset = 0; continue; } /* go to the next LANCE xmit buffer if the current one is full */ while (offset >= BufferSize) { XmitDescCopy.EXmitMsgStruct.EXmitBuffByteCnt = DefaultByteCnt; WriteXmitByteCnt(TempXmitQHead); WriteXmitFlags(TempXmitQHead); offset -= BufferSize; IncrXmitQPtr(TempXmitQHead); err = GetXmitBuf(); if (err != ErOK) return(err); XmitDescCopy.EXmitMsgStruct.EXmitFlags = DefaultXmitFlags; } /* copy from mbuf to LANCE buffer */ length = MIN(m->m_len, BufferSize - offset); bcopy(mtod(m, caddr_t) + mbufOffset, ((u_char *) XmitBufs[TempXmitQHead]) + offset, length); /* update lengths and offsets */ offset += length; totalLength += length; m->m_len -= length; mbufOffset += length; } /* while */ /* * If the total data length of the packet is less than the minimum frame * size, we must pad it out to meet the ethernet spec. The receiver * is expected to use the byte count from a higher level protocol in * order to discard the padding. Note that we know that a packet of * minimum size fits in one buffer since transmit buffers have a * minimum size of 100 bytes, and the minimum packet is 46 bytes of * data + 14 bytes of ethernet header, or 60 bytes (not including the * CRC which we do not include in the buffer). */ if (totalLength < (MinFrameData + sizeof(struct ether_header))) { offset = (MinFrameData + sizeof(struct ether_header)); } XmitDescCopy.EXmitMsgStruct.EXmitFlags |= EndXmitPacket; XmitDescCopy.EXmitMsgStruct.EXmitBuffByteCnt = -offset; WriteXmitByteCnt(TempXmitQHead); WriteXmitFlags(TempXmitQHead); return(ErOK); } /* end copyMbufToLANCEBuf */ #ifdef DEBUG /* * Print the ethernet header, length of frame and read/write. * Also print the beginning of the data area */ dumpWBFrame(frame, mode, length) FrameType *frame; char mode[]; int length; { #define BytesPerLine 16 #define LogFrame 0x01 int i; int j; int newline; int printLen; char *rawframe = (char *) frame; if (trace & TraceLog) { unsigned long a[8]; unsigned car_courant; /* Output type of trace entry. */ car_courant = ligne_courante * LG_LIGNE; i = LogFrame; a[7] = i; a[6] = a[7] >> 4 ; a[5] = a[6] >> 4 ; a[4] = a[5] >> 4 ; a[3] = a[4] >> 4 ; a[2] = a[3] >> 4 ; a[1] = a[2] >> 4 ; a[0] = a[1] >> 4 ; for (i=0;(i != 7) && (a[i] == 0);i++) texte[car_courant++] = ' '; for (;(i <= 7);texte[car_courant++] = ascii[a[i++] & 0xf] ); /* Output length of trace entry. */ printLen = MIN(length, 100); a[7] = printLen; a[6] = a[7] >> 4 ; a[5] = a[6] >> 4 ; a[4] = a[5] >> 4 ; a[3] = a[4] >> 4 ; a[2] = a[3] >> 4 ; a[1] = a[2] >> 4 ; a[0] = a[1] >> 4 ; for (i=0;(i != 7) && (a[i] == 0);i++) texte[car_courant++] = ' '; for (;(i <= 7);texte[car_courant++] = ascii[a[i++] & 0xf] ); /* * Output trace entry. Wrap into next line of trace buffer * as appropriate. */ i = sizeof(i) * 2 + sizeof(printLen) * 2; while (printLen > 0) { for (; i < LG_LIGNE, printLen > 0; i++, printLen--) { texte[car_courant++] = *rawframe++; } if (printLen <= 0) break; i = 0; ligne_courante++; if (ligne_courante >= NB_LIGNES) ligne_courante = 0; car_courant = ligne_courante * LG_LIGNE; } /* Go to next trace entry for next time. */ ligne_courante++; if (ligne_courante >= NB_LIGNES) ligne_courante = 0; car_courant = ligne_courante * LG_LIGNE; /* Mark this as the last trace entry so far. */ for (i=0;i < 16 ; texte[car_courant+(i++)] = '!'); for ( ;i < LG_LIGNE ; texte[car_courant+(i++)] = ' '); } else { printf("%s frame. Length: %x\n", mode, length); printf(" EthernetHeader:\n"); printLen = MIN(length, sizeof(struct ether_header)); for (i = 0; i < printLen; i += BytesPerLine) { newline = MIN(printLen, i + BytesPerLine); for (j = i; j < newline; j++) printf("%x ",rawframe[j]); printf("\n"); } i = printLen; printLen = MIN(length, 100); printf (" Data:\n"); for (; i < printLen; i += BytesPerLine) { newline = MIN(printLen, i + BytesPerLine); for (j = i; j < newline; j++) printf("%x ", frame->FileData[j]); printf("\n"); } } } /* end dumpWBFrame */ #endif /* DEBUG */ /* * Flush all entries from the interrupt queue in shared RAM. */ FlushLANCEInterruptQ() { ReadIntQTail; if (etherCBCopy.EIntHead != etherCBCopy.EIntTail) { etherCBCopy.EIntHead = etherCBCopy.EIntTail; DebugPrint(DebugWBInterrupts, ("WBStats: flushed interrupt(s): LANCEInterruptQ\n")); } WriteIntQHead; } /* end FlushLANCEInterruptQ */ /* * Disable all interrupts from the wonderboard. This is done only during * attempted error recovery from serious errors, so ignore any errors which * occur */ disableWBInterrupts() { SleepOK = FALSE; (void) doWBDisLANCECmd; SleepOK = FALSE; (void) doWBDisEtherCmd; FlushLANCEInterruptQ; return; } /* end disableWBInterrupts */ /* * We got a packet transmitted interrupt. Release any buffers from complete * packets which have been transmitted. An error is returned only if we needed * to reset the LANCE or shut down the LANCE. */ Error packetXmitted() { int QPtr; u_short xmit1; /* accumulate flags from all buffers in packet */ u_short xmit2; /* accumulate flags2 from all buffers in packet */ int endQPtr; QPtr = XmitQTail; ReadXmitDesc(QPtr); xmit1 = xmit2 = 0; endQPtr = XmitQHead; IncrXmitQPtr(endQPtr); while ((QPtr != endQPtr) && ((XmitDescCopy.EXmitMsgStruct.EXmitFlags & XmitOwn) == RidgeOwned)) { /* The transmit queue is not empty, and the LANCE has released a buffer */ xmit1 |= XmitDescCopy.EXmitMsgStruct.EXmitFlags; xmit2 |= XmitDescCopy.EXmitMsgStruct.EXmitFlags2; /* * Update error statistics and XmitQTail only when we reach the end of packet * or when an irrecoverable error occurs which causes the LANCE to shut down * the transmitter. In the latter case, the LANCE will not complete processing * of the buffer chain until it has been restarted, so we must process the * error as we encounter it. No harm is done by treating this as an end of * packet condition. */ if ((XmitDescCopy.EXmitMsgStruct.EXmitFlags & EndXmitPacket) || (XmitDescCopy.EXmitMsgStruct.EXmitFlags2 & (RetryError | Underflow))) { /* * Keep track of any errors which occurred. Note that the errors * may be indicated in any of the transmit buffers of the chain. * However, they may only be included in the error statistics * when we reach an end of packet, otherwise they'd be counted twice. */ if (xmit1 & XmitStatsMask) { if (xmit1 & MoreRetries) { Stats.StatsMoreRetries++; DebugPrint(DebugWBStats, ("WBStats: xmit more retries\n")); } /* * The LANCE has a bug where the one retry flag gets set erroneously * when a late collision error occurs. Do not count that error. */ if ((xmit1 & OneRetry) && !(xmit2 & LateCollision)) { Stats.StatsOneRetry++; DebugPrint(DebugWBStats, ("WBStats: xmit one retry\n")); } if (xmit1 & Deferred) { Stats.StatsDeferred++; DebugPrint(DebugWBStats, ("WBStats: xmit deferred\n")); } if (xmit1 & XmitError) { if (xmit2 & XmitBufferError) { Stats.StatsXmitBuf++; DebugPrint(DebugWBStats, ("WBStats: xmit buffer error\n")); } if (xmit2 & LateCollision) { Stats.StatsLateCollision++; DebugPrint(DebugWBStats, ("WBStats: xmit late collision\n")); } if (xmit2 & LostCarrier) { Stats.StatsLostCarrier++; DebugPrint(DebugWBStats, ("WBStats: xmit lost carrier\n")); } if (xmit2 & RetryError) { /* * LANCE turned off transmitter. Restart the LANCE, * releasing the transmit buffer, so the same error * will not be processed again erroneously. */ Stats.StatsRetryError++; printf("excessive retries on transmission, TDR value = %x\n", XmitDescCopy.EXmitMsgS ` a b c d e f g htruct.EXmitFlags2 & TDRMask); wbetreset(); XmitQTail = QPtr; IncrXmitQPtr(XmitQTail); return(ErLANCERetryError); } if (xmit2 & Underflow) { /* * LANCE turned off transmitter. Restart the LANCE, * releasing the transmit buffer, so the same error * will not be processed again erroneously. */ Stats.StatsUnderflow++; TracePrint(TraceAll, ("transmitter underflow\n")); wbetreset(); XmitQTail = QPtr; IncrXmitQPtr(XmitQTail); return(ErXmitUnderflow); } } } XmitQTail = QPtr; IncrXmitQPtr(XmitQTail); xmit1 = xmit2 = 0; } IncrXmitQPtr(QPtr); ReadXmitDesc(QPtr); } /* while */ return(ErOK); } /* end packetXmitted */ /* * The LANCE reported an error condition. The wonderboard microcode has * cleared the error for us, so we need only keep track of the error for * network statistics, and institute any necessary error recovery. An error * is returned if we had to reset or shut down the LANCE. */ Error LANCEError(CSR0) unsigned CSR0; { if (CSR0 & CSR0_Babble) { Stats.StatsBabble++; DebugPrint(DebugWBStats, ("WBStats: CSR0 babble\n")); } if (CSR0 & CSR0_CollisionError) { Stats.StatsCollision++; DebugPrint(DebugWBStats, ("WBStats: CSR0 collision\n")); es.ac_if.if_collisions++; } if (CSR0 & CSR0_MissedPacket) { Stats.StatsMissedPkt++; DebugPrint(DebugWBStats, ("WBStats: CSR0 missed packet\n")); } if (CSR0 & CSR0_MemoryError) { /* LANCE turned off xmitter & receiver; catastrophic error */ Stats.StatsMemoryError++; DebugPrint(DebugWBStats, ("WBStats: memory error; CSR0 = %x\n", CSR0)); TracePrint(TraceAll,("memory error; LANCE restarted\n")); wbetreset(); return(ErLANCEMemErr); } return(ErOK); } /* end LANCEError */ /*************************************/ /* WonderBoard interface routines */ /*************************************/ /* * Read from the wonderboard. We will always read into a halfword data * area since the high order half word is normally not relevant. Callers * who need the entire word read should call d_read, and do any necessary * error processing themselves. */ Error WBRead(IOAddr, IOData) u_short *IOData; unsigned IOAddr; { register Error err; int iodata; /* * Do an d_read, masking the result to just the low order halfword. * Check the status which comes back on the read */ err = d_read(IOAddr,&iodata); *IOData = (short)(iodata & 0xffff); #ifdef DEBUG DebugPrint(DebugWBIO, ("Reading: IOAddr = %x; IOData = %x; err = %x\n", IOAddr, *IOData, err)); #endif /* DEBUG */ switch(err) { case 0: return(ErOK); case 1: err = ErIODataNotValid; break; case 2: err = ErIOTimeOut; break; case 3: err = ErIOTmOAndDNV; break; default: err = ErUnknownError; break; } printf("Reading from CIO: IOAddr = %x; error = ", IOAddr); WBWriteIOErr(err); printf("\n"); return(err); } /* end WBRead */ /* * Write to the wonderboard. Usually, the caller will write only a halfword, * as writes to the shared RAM require the high order halfword to be zero. * Writes to the mapping RAM use the entire word, so this routine supports * word writes. */ Error WBWrite(IOAddr, IOData) unsigned IOData; unsigned IOAddr; { register Error err; /* Do an IOWrite, checking the status which comes back */ err = d_write(IOAddr, IOData); DebugPrint(DebugWBIO, ("Writing: IOAddr = %x; IOData = %x; err = %x\n", IOAddr, IOData, err)); switch(err) { case 0: return(ErOK); case 1: err = ErIODataNotValid; break; case 2: err = ErIOTimeOut; break; case 3: err = ErIOTmOAndDNV; break; default: err = ErUnknownError; break; } printf("Writing to CIO: IOAddr = %x; IOData = %x; error = ", IOAddr, IOData); WBWriteIOErr(err); printf("\n"); return(err); } /* end WBWrite */ /* * Write some text describing the I/O error. */ WBWriteIOErr(err) int err; { switch(err) { case ErIOTimeOut: printf("IO time out"); break; case ErIODataNotValid: printf("IO data not valid"); break; case ErIOTmOAndDNV: printf("IO time out and IO data not valid"); break; default: printf("unknown error: %x", err); } } /* end WBWriteIOErr */ /* * Write a command to the wonderboard, waiting for the response to * indicate command completion and the availability of any data read */ Error WriteWBCommand(command) u_char command; { Error err; short protection; /* * Make sure the last command completed, and that there were no errors since * then (eg, interrupt queue overflow). */ /* WARNING: This code reads both EError & ECommand, which must both be zero */ err = WBRead(IORAMAddr + etherCB + OffsetFunc(etherCBCopy, EError), ðerCBCopy.EError); if (err != ErOK) return(err); if ((etherCBCopy.EError != 0) || (etherCBCopy.ECommand != 0)) { /* * We can still issue the command on a wonderboard interrupt queue * overflow error, but other errors require error recovery. */ if (etherCBCopy.EError == EIntOvflErr) { TracePrint(TraceAll, ("Interrupt Q overflow; command = %x, err = %x\n", etherCBCopy.ECommand, etherCBCopy.EError)); etherCBCopy.EError = 0; (void) WBWriteHi(IORAMAddr + etherCB + OffsetFunc(etherCBCopy, EError), etherCBCopy.EError); Stats.StatsIntQOverflow++; } else return(bad_Write()); } protection = spl7(); if (SleepOK) { DebugPrint(DebugWBTimer, ("Command timer set; D_Cpt_Cmd = %x, F_Cpt_Cmd = %x\n", D_Cpt_Cmd, F_Cpt_Cmd)); timeout(CmdTimeout,D_Cpt_Cmd,TimeoutWriteWB); } D_Cpt_Cmd += 1; TO_ErrCmd = ErOK; (void) WBWriteLo(IORAMAddr+etherCB+OffsetFunc(etherCBCopy,ECommand), command); if (SleepOK) { DebugPrint(DebugWBTimer, ("sleeping..WriteWBCmd; D_Cpt_Cmd = %x, F_Cpt_Cmd = %x\n", D_Cpt_Cmd, F_Cpt_Cmd)); sleep(WriteWBCommand,PRIOR); } splx(protection); return(TO_ErrCmd); } /* end WriteWBCommand */ /* interruption venant du controleur Ethernet */ wbetctrl(dev,IOIR) int dev; /* pour normaliser l'interface */ int IOIR; { /* process interrupt */ /* * WARNING: This code reads both EError & ECommand, * which must both be zero */ if (WBDriverInited) { F_Cpt_Cmd++; TO_ErrCmd = WBRead(IORAMAddr+etherCB+OffsetFunc(etherCBCopy, EError), ðerCBCopy.EError); if (TO_ErrCmd == ErOK) if ((etherCBCopy.ECommand == 0) && (etherCBCopy.EError == 0)) { /* command completed without error */ TO_ErrCmd = ErOK; } else TO_ErrCmd = bad_Write(); DebugPrint(DebugWBTimer, ("Cmd wakeup (wbctrl); D_Cpt_Cmd = %x, F_Cpt_Cmd = %x\n", D_Cpt_Cmd, F_Cpt_Cmd)); wakeup(WriteWBCommand); } } /* wbetctrl */ CmdTimeout(indice) int indice; { short protection; /* protection de la sequence */ /* timeout sur une commande au controleur ethernet */ protection = spl7(); DebugPrint(DebugWBTimer, ("Command timeout; D_Cpt_Cmd = %x, F_Cpt_Cmd = %x\n", D_Cpt_Cmd, F_Cpt_Cmd)); if (WBDriverInited) if (indice == F_Cpt_Cmd) { F_Cpt_Cmd++; TO_ErrCmd = ErTimeout; DebugPrint(DebugWBTimer, ("Cmd wakeup (timeout); D_Cpt_Cmd = %x, F_Cpt_Cmd = %x\n", D_Cpt_Cmd, F_Cpt_Cmd)); wakeup(WriteWBCommand); } splx(protection); } /* CmdTimeout */ Error bad_Write() { /* error on command */ switch (etherCBCopy.EError) { case EBadCmdErr: printf("bad command = %d, err = %x\n", etherCBCopy.ECommand, etherCBCopy.EError); etherCBCopy.EError = 0; (void) WBWriteHi(IORAMAddr + etherCB + OffsetFunc(etherCBCopy, EError), etherCBCopy.EError); return(EBadCmdErr + ErEtherCtrl); case EIntOvflErr: TracePrint(TraceAll, ("Interrupt Q overflow; command = %x, err = %x\n", etherCBCopy.ECommand, etherCBCopy.EError)); etherCBCopy.EError = 0; (void) WBWriteHi(IORAMAddr + etherCB + OffsetFunc(etherCBCopy, EError), etherCBCopy.EError); Stats.StatsIntQOverflow++; return(ErOK); case ECheckSumErr: printf("bad checksum in address PAL; command = %x, err = %x\n", etherCBCopy.ECommand, etherCBCopy.EError); etherCBCopy.EError = 0; (void) WBWriteHi(IORAMAddr + etherCB + OffsetFunc(etherCBCopy, EError), etherCBCopy.EError); return(ECheckSumErr + ErEtherCtrl); default: /* TracePrint(TraceAll,("invalid error or command returned; cmd = %x, err = %x\n", etherCBCopy.ECommand, etherCBCopy.EError)); */ printf("invalid error or command returned; cmd = %x, err = %x\n", etherCBCopy.ECommand, etherCBCopy.EError); etherCBCopy.EError = 0; (void) WBWriteHi(IORAMAddr + etherCB + OffsetFunc(etherCBCopy, EError), etherCBCopy.EError); return(EInvalidError + ErEtherCtrl); } /* switch */ } /* end bad_Write */ #ifdef DEBUG /* * Dump the descriptors elements */ DumpDesc() { int iloc; u_short *IOAddr, *RidgeAddr; RidgeAddr = (u_short *) &Anneau[0]; IOAddr = (u_short *) (IORAMAddr + etherRecvRing); for (iloc=0; iloc<128; iloc++) (void) WBRead(IOAddr++,RidgeAddr++); IOAddr = (u_short *) (IORAMAddr + etherXmitRing); for (iloc=0; iloc<128; iloc++) (void) WBRead(IOAddr++,RidgeAddr++); } #endif /* DEBUG */ /* * Read the specified receive descriptor element */ ReadRecvDesc(BufNum) int BufNum; { register u_short *IOAddr; register u_short *RidgeAddr; IOAddr = (u_short *) (IORAMAddr + etherRecvRing + (BufNum * RingDescSize)); RidgeAddr = RecvDescCopy.ERecvHalfWord; (void) WBRead(IOAddr++, RidgeAddr++); (void) WBRead(IOAddr++, RidgeAddr++); (void) WBRead(IOAddr++, RidgeAddr++); (void) WBRead(IOAddr, RidgeAddr); return; } /* end ReadRecvDesc */ /* * Write the specified receive descriptor element. Assumes the caller * has verified proper ownership of the buffer */ Error WriteRecvDesc(BufNum) int BufNum; { int i; Error err = ErOK; for (i = 0; i < RingDescSize/2; i++) { err |= WBWrite(IORAMAddr + etherRecvRing + (BufNum * RingDescSize) + (i * 2), RecvDescCopy.ERecvHalfWord[i]); } if (err != ErOK) err = ErWriteError; return(err); } /* end WriteRecvDesc */ /* * Read the specified transmit descriptor element */ ReadXmitDesc(BufNum) int BufNum; { register u_short *IOAddr; register u_short *RidgeAddr; IOAddr = (u_short *) (IORAMAddr + etherXmitRing + (BufNum * RingDescSize)); RidgeAddr = XmitDescCopy.EXmitHalfWord; (void) WBRead(IOAddr++, RidgeAddr++); (void) WBRead(IOAddr++, RidgeAddr++); (void) WBRead(IOAddr++, RidgeAddr++); (void) WBRead(IOAddr, RidgeAddr); return; } /* end ReadXmitDesc */ /* * Write the specified transmit descriptor element. Assumes the caller * has verified proper ownership of the buffer */ Error WriteXmitDesc(BufNum) int BufNum; { int i; Error err = ErOK; for (i = 0; i < RingDescSize/2; i++) { err |= WBWrite(IORAMAddr + etherXmitRing + (BufNum * RingDescSize) + (i * 2), XmitDescCopy.EXmitHalfWord[i]); } if (err != ErOK) err = ErWriteError; return(err); } /* end WriteXmitDesc */ /* * Verify that the device specified on the command line is indeed * a wonderboard device. */ Error GetWonderBoard() { #define DeviceNumShiftCnt 24 #define BoardTypeShiftCnt 24 #define WonderBoardType 0X40 #define AltWonderBoardType 0X41 unsigned Reply; Error err; if ((WBDevice = ctladdr(CIODEBUG,0))== -1) WBDevice = ctladdr(CIODEBUG,4); /* type ctrl ethernet */ /* Verify that the board is a wonderboard */ if ((d_read((WBDevice << DeviceNumShiftCnt), &Reply) == ErOK) && (((Reply >> BoardTypeShiftCnt) == WonderBoardType) || ((Reply >> BoardTypeShiftCnt) == AltWonderBoardType))) { TracePrint(TraceNet, ("WonderBoard ethernet present, device # = %x\n", WBDevice)); WBPresent = TRUE; } else { TracePrint(TraceNet, ("hardware at address %x is not a CIO board\n", WBDevice)); WBPresent = FALSE; return(ErNoWonderBoard); } IORAMAddr = WBDevice << DeviceNumShiftCnt; IOMapAddr = IORAMAddr + MemMapFlag; /* * Read the revision codes for the board. If they are incompatible with * the current revision of software, an error will be returned. */ err = ReadRevCodes(); if (err != ErOK) return(err); WBDriverInited = TRUE; return(err); } /* end GetWonderBoard */ /* * Allocate the transmit and receive buffers, fix them in memory, and * translate their addresses to real addresses for use by wonderboard. * Any errors are returned to the caller for error processing. * * WARNING: * * This code assumes that an integral number of buffers fit exactly in * one page. Buffers do not span pages, so pages need not be contiguous. */ Error AllocDescRings() { int i,j; /* * Allocate the receive buffers; fix each page in memory, * translate its virtual address to its real address, and * save the virtual and real addresses for each buffer in the * page. */ for (i = 0; i < RecvNumBufs; i += BufsPerPage) { RecvBufs[i] = sptalloc(1 , PG_V | PG_KR , 0); RealRecvBufs[i] = svtophys(RecvBufs[i]); for (j=1; ja[i+1]; es.ac_enaddr[i+1] = localAddress.a[i+1] = address->a[i]; } DebugPrint(DebugWBInit, ("Physical Address = %x %x %x %x %x %x\n", localAddress.a[0], localAddress.a[1], localAddress.a[2], localAddress.a[3], localAddress.a[4], localAddress.a[5])); } else err = ErReadError; return(err); } /* end ReadPhysicalAddr */ /* * Set up the logical address filter for multicast. Note that we do not use * this feature currently. */ SetLogicalAddrFilter(filter) NodeAddrFilter *filter; { int i; /* * Zero the logical address filter for multicast, since we do not use this * feature. */ for (i = 0; i < LogicalAddrLen; i++) filter->a[i] = 0; } /* end SetLogicalAddrFilter */ /* * Set up our copy of the initialization control block */ Error CreateInitBlock() { Error err; InitBlockCopy.EMode = DefaultModeReg; err = ReadPhysicalAddr(&(InitBlockCopy.EPhysicalAddr)); if (err != ErOK) return(err); SetLogicalAddrFilter(&(InitBlockCopy.ELogicalAddrFilter)); InitBlockCopy.ERecvDescRingLo = etherRecvRing & HalfWordMask; InitBlockCopy.ERecvRingLength = LANCERecvNumBufs << LengthShiftCount; InitBlockCopy.ERecvDescRingHi = (etherRecvRing >> HalfWordShiftCnt) & HalfWordMask; InitBlockCopy.EXmitDescRingLo = etherXmitRing & HalfWordMask; InitBlockCopy.EXmitRingLength = LANCEXmitNumBufs << LengthShiftCount; InitBlockCopy.EXmitDescRingHi = (etherXmitRing >> HalfWordShiftCnt) & HalfWordMask; return(err); } /* end CreateInitBlock */ /* * Write our copy of the initialization control block to the shared memory * on the wonderboard */ Error WriteInitBlock() { #define maxIndex sizeof(InitBlockStruct) int i; unsigned IOAddr; unsigned IOData; Error err = ErOK; IOAddr = IORAMAddr + etherInitBlock; DebugPrint(DebugWBInit, ("Writing Init Block\n")); for (i = 0; i < maxIndex; i += IOSize, IOAddr += IOSize) { IOData = *((u_short *) (((char *)(&InitBlockCopy)) + i)); err |= WBWrite(IOAddr, IOData); } if (err != ErOK) { printf("could not write initialization block\n"); err = ErWriteError; } return(err); } /* end WriteInitBlock */ /* * Write out the transmit and receive descriptor rings into shared memory * for use by wonderboard */ Error InitDescRings() { int i; int BufferNum = 0; Error err = ErOK; /* * Initialize each recv buffer descriptor in the local copy, writing * each one to the wonderboard and initializing its mapping RAM entry. * These buffers are given to the LANCE, so we can not write in these * descriptors until data is received into the buffers and the LANCE * returns the buffers and their descriptors to us. */ RecvDescCopy.ERecvMsgStruct.ERecvFlags = DefaultRecvFlags; RecvDescCopy.ERecvMsgStruct.ERecvBuffByteCnt = DefaultByteCnt; RecvDescCopy.ERecvMsgStruct.ERecvMsgByteCnt = 0; DebugPrint(DebugWBInit, ("Writing Recv Desc Ring\n")); for (i = 0; i < RecvNumBufs; i++) { RecvDescCopy.ERecvMsgStruct.ERecvBuffAddrLo = ((RealRecvBufs[i]) & AddrLoMask) + WonderRidgeFlag; RecvDescCopy.ERecvMsgStruct.ERecvBuffAddrHi = SwapBits(BufferNum); err |= WBWrite(IOMapAddr + BufferNum, (RealRecvBufs[i]) & AddrHiMask); err |= WriteRecvDesc(BufferNum); BufferNum++; } if (err != ErOK) { printf("could not write recv descriptor ring\n"); return(ErWriteError); } /* * Initialize each xmit buffer descriptor in the local copy, writing * each one to the wonderboard and initializing its mapping RAM entry. * These buffers are kept by the driver until we are ready to transmit. */ XmitDescCopy.EXmitMsgStruct.EXmitFlags = DefaultXmitFlags; XmitDescCopy.EXmitMsgStruct.EXmitBuffByteCnt = DefaultByteCnt; XmitDescCopy.EXmitMsgStruct.EXmitFlags2 = DefaultXmitFlags2; DebugPrint(DebugWBInit, ("Writing Xmit Desc Ring\n")); for (i = 0; i < XmitNumBufs; i++) { XmitDescCopy.EXmitMsgStruct.EXmitBuffAddrLo = ((RealXmitBufs[i]) & AddrLoMask) + WonderRidgeFlag; XmitDescCopy.EXmitMsgStruct.EXmitBuffAddrHi = SwapBits(BufferNum); err |= WBWrite(IOMapAddr + BufferNum, (RealXmitBufs[i]) & AddrHiMask); err |= WriteXmitDesc(BufferNum - RecvNumBufs); BufferNum++; } if (err != ErOK) { printf("could not write xmit descriptor ring\n"); err = ErWriteError; } /* initialize local queue pointers to indicate the queues are empty */ RecvQHead = 0; XmitQTail = 0; XmitQHead = TempXmitQHead = XmitNumBufs - 1; return(err); } /* end InitDescRings */ /* * Initialize the copies of the CSRs, and write them to shared RAM. Issue * init and start commands */ Error InitStartCmds() { int i; Error err = ErOK; short protection; /* * Write out the CSRs, issuing the init command. */ etherCBCopy.EWriteData.EReg0 = InitCSR0; etherCBCopy.EWriteData.EReg1 = etherInitBlock & CSR1Mask; etherCBCopy.EWriteData.EReg2 = (etherInitBlock >> HalfWordShiftCnt) & CSR2Mask; etherCBCopy.EWriteData.EReg3 = DefaultCSR3; DebugPrint(DebugWBInit, ("Writing CSRs\n")); protection = spl7(); for (i = 0; i < sizeof(regStruct); i += IOSize) { err |= WBWrite(IORAMAddr + etherCB + OffsetFunc(etherCBCopy, EWriteData.EReg0) + i, *((u_short *) (((char *) (ðerCBCopy.EWriteData.EReg0)) + i))); } if (err != ErOK) { printf("could not write LANCE registers\n"); err = ErWriteError; splx(protection); return(err); } SleepOK = TRUE; err = doWBWriteRegsCmd; if (err != ErOK) { printf("could not write LANCE registers; err = %d\n", err); splx(protection); return(err); } /* * Wait for the Init Done interrupt. */ TO_ErrInit = 0; DebugPrint(DebugWBTimer, ("Init timer set; D_Cpt_Init = %x, F_Cpt_Init = %x\n", D_Cpt_Init, F_Cpt_Init)); timeout(StartTimeout,D_Cpt_Init++,TimeoutInit); if (D_Cpt_Init != F_Cpt_Init) /* sinon IT deja arrivee */ { DebugPrint(DebugWBTimer, ("sleeping..InitStartCmds; D_Cpt_Init = %x, F_Cpt_Init = %x\n", D_Cpt_Init, F_Cpt_Init)); sleep(InitStartCmds,PRIOR); } splx(protection); err = TO_ErrInit; if (err != ErOK) { printf("error waiting for Init Done interrupt, err = %d\n", err); return(err); } /* * Issue the start command. */ etherCBCopy.EWriteData.EReg0 = StartCSR0; DebugPrint(DebugWBInit, ("Issuing Start command in CSR0\n")); err = WBWrite(IORAMAddr + etherCB + OffsetFunc(etherCBCopy, EWriteData.EReg0), (etherCBCopy.EWriteData.EReg0)); if (err == ErOK) { SleepOK = TRUE; err = doWBWriteReg0Cmd; } if (err != ErOK) { printf("could not write start command in CSR0; err = %d\n", err); } return(err); } /* end InitStartCmds */ /* timeout sur initstartcommande */ StartTimeout(indice) int indice; { short protection; /* protection de la sequence */ protection = spl7(); DebugPrint(DebugWBTimer, ("Init timeout; D_Cpt_Init = %x, F_Cpt_Init = %x\n", D_Cpt_Init, F_Cpt_Init)); if (WBDriverInited) if (indice == F_Cpt_Init) { TO_ErrInit = ErTimeout; F_Cpt_Init++; DebugPrint(DebugWBTimer, ("Init wakeup (timeout); D_Cpt_Init = %x, F_Cpt_Init = %x\n", D_Cpt_Init, F_Cpt_Init)); wakeup(InitStartCmds); } splx(protection); } /* end StartTimeout */ /* * Get ownership of the current buffer (the buffer which is the temporary head * of the transmit queue). Wait for it if the transmit queue is full. Return * status indicating whether we were able to get the buffer in a reasonable * amount of time. */ Error GetXmitBuf() { short protection; ReadXmitFlags(XmitQHead); if ((TempXmitQHead == XmitQTail) && ((XmitDescCopy.EXmitMsgStruct.EXmitFlags & XmitOwn) != RidgeOwned)) { /* transmit queue is full */ printf("GetXmitBuf: ran out of xmit buffers\n"); return(ErBufWaitTimeOut); } ReadXmitDesc(TempXmitQHead); return(ErOK); } /* end GetXmitBuf */ /* * Test the validity of the current receive buffer (the buffer whose * descriptor is in our RAM copy). Return any unusual conditions. */ Error TestRecvBufValid(QPtr) int *QPtr; { #ifdef DEBUG if ((RecvDescCopy.ERecvMsgStruct.ERecvBuffAddrHi) != SwapBits(*QPtr)) { printf("Mapping RAM index (%x) for recv buffer # %x trashed\n", RecvDescCopy.ERecvMsgStruct.ERecvBuffAddrHi, SwapBits(*QPtr)); return(ErBadMappingRAM); } #endif /* DEBUG */ if ((RecvDescCopy.ERecvMsgStruct.ERecvFlags & RecvOwn) != RidgeOwned) return(ErNoData); if (RecvDescCopy.ERecvMsgStruct.ERecvFlags & RecvError) { DebugPrint(DebugWBStats, ("WBStats: error status on receive, flags = %x\n", RecvDescCopy.ERecvMsgStruct.ERecvFlags)); /* * Framing Error and CRC Error are valid only in the last buffer of * a packet. Overflow is only valid before the last buffer of a * packet. All other fields are assumed to only be set in the last * buffer of a packet, otherwise an error could be counted more * than once: once or more before the complete packet is received, * and once after. */ if ((RecvDescCopy.ERecvMsgStruct.ERecvFlags & (FramingError | EndRecvPacket)) == (FramingError | EndRecvPacket)) { Stats.StatsFramingErr++; DebugPrint(DebugWBStats, ("WBStats: recv framing error\n")); } if ((RecvDescCopy.ERecvMsgStruct.ERecvFlags & (Overflow | EndRecvPacket)) == Overflow) { Stats.StatsOverflow++; DebugPrint(DebugWBStats, ("WBStats: recv overflow\n")); } if ((RecvDescCopy.ERecvMsgStruct.ERecvFlags & (CRCError | EndRecvPacket)) == (CRCError | EndRecvPacket)) { Stats.StatsCRCError++; DebugPrint(DebugWBStats, ("WBStats: recv CRC error\n")); } /* * Receive buffer error occurs when the LANCE needed to chain to the * next receive buffer, but was unable to do so because it did not own * the buffer. This implies an end of packet condition, although it * is not explicitly set. Set the end of packet for the caller. */ if (RecvDescCopy.ERecvMsgStruct.ERecvFlags & RecvBufferError) { RecvDescCopy.ERecvMsgStruct.ERecvFlags |= EndRecvPacket; Stats.StatsRecvBuf++; DebugPrint(DebugWBStats, ("WBStats: recv buffer error\n")); } return(ErRecvError); } return(ErOK); } /* end TestRecvBufValid */ /* * Find the buffer which is the end of the current packet. Verify that it, * the buffer which is the start of packet, and all buffers in between are * error-free and owned by us rather than the LANCE. Note that the first * error encountered is usually the error which will be returned, even if * we continue perusing the queue for the end of packet. The queue pointer * is updated to point to the end of the packet, if any. */ Error FindRecvPktEnd(QPtr) int *QPtr; { Error err; Error newerr; int count = 0; *QPtr = RecvQHead; ReadRecvDesc(*QPtr); /* check validity of first buffer in packet */ err = TestRecvBufValid(QPtr); if (err == ErNoData) return(err); if ((RecvDescCopy.ERecvMsgStruct.ERecvFlags & StartRecvPacket) == 0) { TracePrint(TraceAll, ("No start packet on receive\n")); if (!err) err = ErBadRecvFlags; } /* * check validity of remaining buffers in packet, while finding the * last buffer in the packet */ while ((RecvDescCopy.ERecvMsgStruct.ERecvFlags & EndRecvPacket) == 0) { IncrRecvQPtr((*QPtr)); ReadRecvDesc(*QPtr); newerr = TestRecvBufValid(QPtr); if (!err) err = newerr; if (newerr == ErNoData) return(ErNoData); if (RecvDescCopy.ERecvMsgStruct.ERecvFlags & StartRecvPacket) { TracePrint(TraceAll, ("Encountered another start of packet before end of packet\n")); if (!err) err = ErBadRecvFlags; } /* * We assume that we will eventually encounter either an end of packet or * a buffer belonging to the LANCE. This is not necessarily so, e.g., * receiving data from a babbling node exhausts all of the receive buffers, * sets receive buffer error, but does not set end of packet. (We have a * special hack for this in TestRecvBufValid, but there could be other cases * which invalidate our assumption.) So, make sure we don't loop forever * reading receive buffer descriptors. Instead, reset to clear the error * and indicate there is no more data currently. This relies on the higher * level protocols to recover the data we've thrown away. */ count++; if (count >= RecvNumBufs) { printf("All receive buffers used by one packet!\n"); wbetreset(); return(ErNoData); } } /* while */ return(err); } /* end FindRecvPktEnd */ /* * Initialize the wonderboard */ Error WB_Init() { register Error err; /* Check if self test passed on the board */ WBRead(IORAMAddr + DiagCtrlBlk + OffsetFunc(diagCBCopy, DB_BdFailures), &(diagCBCopy.DB_BdFailures)); if (diagCBCopy.DB_BdFailures != ErOK) { err = (unsigned) (diagCBCopy.DB_BdFailures) + ErSelfTest; if ((err < ErUnknownSelfTestErr) #ifdef DEBUG || (trace & TraceErrors) #endif DEBUG ) { printf("self test error: "); switch (err) { case ErLANCERegs: printf("LANCE register test"); break; case ErLocalMemory: printf("local memory test"); break; case ErSharedMemory: printf("shared memory test"); break; case ErLANCEInit: printf("LANCE initialization test"); break; default: printf("unknown self test error"); } printf(", error = %x\n", err); if (err < ErUnknownSelfTestErr) return(err); } } D_Cpt_Init = 0; F_Cpt_Init = 0; F_Cpt_Cmd = 0; D_Cpt_Cmd = 0; /* enable interrupts for the ethernet controller */ SleepOK = TRUE; err = doWBEnEtherCmd; if (err != ErOK) { printf("cannot enable CIO ethernet command interrupts %d\n", err); return(err); } /* * Reinitialize the LANCE. Issue a stop command to the LANCE to get it * into a known state. Note that CSR1 is corrupted when the stop command * is issued. Since we subsequently reinitialize it, this should not * present a problem. */ etherCBCopy.EWriteData.EReg0 = CSR0_InterruptEnable + CSR0_StopCmd; err = WBWrite(IORAMAddr + etherCB + OffsetFunc(etherCBCopy, EWriteData.EReg0), etherCBCopy.EWriteData.EReg0); if (err == ErOK) { SleepOK = TRUE; err = doWBWriteReg0Cmd; } if (err != ErOK) { printf("could not write CSR0; err = %d\n", err); return(err); } /* Enable interrupts for the LANCE */ SleepOK = TRUE; err = doWBEnLANCECmd; if (err != ErOK) { printf("cannot enable CIO LANCE interrupts %d\n", err); return(err); } err = CreateInitBlock(); if (err == ErOK) { err = WriteInitBlock(); if (err == ErOK) { err = InitDescRings(); if (err == ErOK) err = InitStartCmds(); } } return(err); } /* end WB_Init */ /* * Read receive data from Wonderboard. If any buffer in the packet has an * error, discard the packet and return the error. If a complete packet is * not available, return status indicating that no data is available. */ WB_Read(sourceAddr, destAddr, protocolID) NodeAddressType *sourceAddr; NodeAddressType *destAddr; Halfword *protocolID; { int i; int LastPktPtr; Error err; Boolean acceptPacket; tryAgain: err = FindRecvPktEnd(&LastPktPtr); /* * Discard all buffers in the packet if any of them had any type of error. * If the error was recoverable, try to get the next packet. Otherwise, * return the error. */ if (err != ErOK) { if (err != ErNoData) { while (RecvQHead != LastPktPtr) { ReleaseRecvBuf(RecvQHead); IncrRecvQPtr(RecvQHead); } ReleaseRecvBuf(RecvQHead); IncrRecvQPtr(RecvQHead); } if (err == ErRecvError) goto tryAgain; return(err); } /* * Verify that the packet is for us. Due to bugs in the Rev B LANCE parts, * we end up receiving packets which we shouldn't. Accept packets with * our physical address. Also accept broadcast packets, so long as the * last packet we transmitted was not a broadcast. * * The Rev C LANCE parts will only receive packets which are for us, but * they will occasionally insert one byte in front of the packet, thus we * must verify the address is valid. */ acceptPacket = TRUE; /* check if address is our physical address */ for (i = 0; i < AddressLen; i++) { if (*(((u_char *) RecvBufs[RecvQHead]) + i) != localAddress.a[i]) { acceptPacket = FALSE; break; } } if (!acceptPacket) { /* address did not match our physical address; check if it's a broadcast */ acceptPacket = TRUE; for (i = 0; i < AddressLen; i++) { if (*(((u_char *) RecvBufs[RecvQHead]) + i) != etherbroadcastaddr[i]) { acceptPacket = FALSE; break; } } } if (!acceptPacket) { /* discard the packet, since it's not for us */ TracePrint(TraceAll, ("WB_Read: received extraneous packet\n")); #ifdef DEBUG if (trace & TraceAll) dumpWBFrame(RecvBufs[RecvQHead], "Reading", MIN(RecvDescCopy.ERecvMsgStruct.ERecvMsgByteCnt, BufferSize)); #endif /* DEBUG */ while (RecvQHead != LastPktPtr) { ReleaseRecvBuf(RecvQHead); IncrRecvQPtr(RecvQHead); } ReleaseRecvBuf(RecvQHead); IncrRecvQPtr(RecvQHead); goto tryAgain; } /* Discard packets which are too short to be legal */ if ((((int) RecvDescCopy.ERecvMsgStruct.ERecvMsgByteCnt) - (sizeof(struct ether_header) + EtherFCSSize)) < 0) { #ifdef DEBUG TracePrint(TraceAll, ("WB_Read: received too short packet\n")); DumpDesc(); if (trace & TraceAll) dumpWBFrame(RecvBufs[RecvQHead], "Reading", MIN(RecvDescCopy.ERecvMsgStruct.ERecvMsgByteCnt, BufferSize)); #endif /* DEBUG */ nbpkterr++; printf("%x paquets veroles\n",nbpkterr); while (RecvQHead != LastPktPtr) { ReleaseRecvBuf(RecvQHead); IncrRecvQPtr(RecvQHead); } ReleaseRecvBuf(RecvQHead); IncrRecvQPtr(RecvQHead); goto tryAgain; } /* read destination address, source address, and protocol ID (from,to,length) */ bcopy(((u_char *) RecvBufs[RecvQHead]), (u_char *) destAddr, sizeof(*destAddr)); bcopy(((u_char *) RecvBufs[RecvQHead] + sizeof(*destAddr)), (u_char *) sourceAddr, sizeof(*sourceAddr)); bcopy(((u_char *) RecvBufs[RecvQHead] + sizeof(*destAddr) + sizeof(*sourceAddr)), (u_char *) protocolID, sizeof(*protocolID)); WBLength = (int) RecvDescCopy.ERecvMsgStruct.ERecvMsgByteCnt; WBOffset = 0; #ifdef DEBUG if (trace & TraceFrames) dumpWBFrame(RecvBufs[RecvQHead], "Reading", MIN(WBLength, BufferSize)); #endif /* DEBUG */ return(ErOK); } /* end WB_Read */ /* fonction permettant de faire un traitement des trames recues en mode user */ /* a partir d'une interruption */ wbetopen() { struct ifqueue *ifq; u_short protection; struct mbuf *m; if (tcpipOpen) return; tcpipOpen = TRUE; ifq = &ipintrq; while (1) { sleep(wbetopen,PRIOR); do { protection = spl7(); IF_DEQUEUE(ifq,m); splx(protection); TracePrint(TraceAll, ("dequeue: m = %x\n", m)); ipintr(m); } while (m); } } #ifdef DEBUG /*-----------------------------------*/ /* DEBUG2 */ /*-----------------------------------*/ debug2 (ptchaine,v0,v1,v2,v3,v4) char *ptchaine ; unsigned long v0 ; unsigned long v1 ; unsigned long v2 ; unsigned long v3 ; unsigned long v4 ; { register short i ; unsigned long a[8] ; unsigned long var[5] ; unsigned short car_courant; unsigned long *ptvar ; short s ; s = spl7(); var[0] = v0; var[1] = v1; var[2] = v2; var[3] = v3; var[4] = v4; ptvar = &var[0]; car_courant = ligne_courante * LG_LIGNE; if (init_debug == 0) { init_debug++; printf("adresse zone de trace du communicateur = %x\n",&texte[0]); } while (*ptchaine != '\0') { if (*ptchaine != '%') texte[car_courant++] = *(ptchaine++); else { ptchaine = ptchaine + 2; a[7] = *ptvar++ ; a[6] = a[7] >> 4 ; a[5] = a[6] >> 4 ; a[4] = a[5] >> 4 ; a[3] = a[4] >> 4 ; a[2] = a[3] >> 4 ; a[1] = a[2] >> 4 ; a[0] = a[1] >> 4 ; for (i=0;(i != 7) && (a[i] == 0);i++); for (;(i <= 7);texte[car_courant++] = ascii[a[i++] & 0xf] ); } } ligne_courante++; if (ligne_courante >= NB_LIGNES) ligne_courante = 0; car_courant = ligne_courante * LG_LIGNE; for (i=0;i < 16 ; texte[car_courant+(i++)] = '!'); for ( ;i < LG_LIGNE ; texte[car_courant+(i++)] = ' '); splx(s); return ; } #endif # "@(#)Makefile 4.9 87/05/07" # # makefile for cio enet driver # INCRT = $(SPX)/usr/include/sys IFLAGS = -I$(INCUCB) DFLAGS = -DKERNEL -DDEBUG -DINET -DSPS9 LIB = LIBWB.a # local headers which really live in the SCCS files HEADERS = wonder.h lance.h trace.h OBJECTS= $(LIB)(wonder.o) all: $(LIB) $(LIB): $(OBJECTS) $(LIB)(wonder.o):\ wonder.h\ lance.h\ trace.h\ $(INCUCB)/net/if.h\ $(INCUCB)/net/route.h\ $(INCUCB)/netinet/in.h\ $(INCUCB)/netinet/ip.h\ $(INCUCB)/netinet/if_ether.h\ $(INC)/sys/types.h\ $(INC)/sys/defsocket.h\ mbuf.h\ $(INCUCB)/sys/socket.h\ $(INC)/sys/iomachdep.h\ $(INCUCB)/sys/bsdioctl.h\ $(INC)/sys/page.h\ $(INC)/sys/param.h\ $(INC)/sys/sysmacros.h clean: rm -f *.o core $(HEADERS) clobber: clean rm -f LIBWB.a /* " @(#)mbuf.h 4.4 87/05/17 " */ /* * A "cluster" is the data part of a big mbuf. A Cluster seems to be the * same size as a Click. * CLBYTES (size of a Cluster) is a power of 2; MSIZE is a smaller power of 2 * Clusters come at a higher address in memory than Mbufs (contrary to * what the documentation says). * 'mbutl' is the low address of clusters; it must be aligned on a CLBYTES * boundary. Clusters must be allocated adjacent in (virtual) memory; * same for mbufs. */ /* * Constants related to memory allocator. */ #define MSIZE 128 /* sizeof(struct mbuf)(P of 2 */ #define MMINOFF 12 /* mbuf header length */ #define MTAIL 4 #define MMAXOFF (MSIZE-MTAIL) /* offset where data ends */ #define MLEN (MSIZE-MMINOFF-MTAIL) /* mbuf data length */ #define NMBPCL (CLBYTES/MSIZE) /* # mbufs per cluster */ #define NMBMIN ((v.v_mbuf*NMBPCL)/10) /* minimum for socket */ /* * Macros for type conversion */ /* network cluster number to virtual address, and back */ #define cltom(x) ((struct mbuf *)((int)mbutl + ((x) << CLSHIFT))) #define mtocl(x) (((int)x - (int)mbutl) >> CLSHIFT) /* mbutl is base address of clusters */ /* address in mbuf to mbuf head */ #define dtom(x) ((struct mbuf *)((int)x & ~(MSIZE-1))) /* mbuf head, to typed data */ #define mtod(x,t) ((t)((int)(x) + (x)->m_off)) struct mbuf { struct mbuf *m_next; /* next buffer in chain */ u_long m_off; /* offset of data */ short m_len; /* amount of data in this mbuf */ short m_type; /* mbuf type (0 == free) */ u_char m_dat[MLEN]; /* data storage */ struct mbuf *m_act; /* link in higher-level mbuf list */ }; /* mbuf types */ #define MT_FREE 0 /* should be on free list */ #define MT_DATA 1 /* dynamic (data) allocation */ #define MT_HEADER 2 /* packet header */ #define MT_SOCKET 3 /* socket structure */ #define MT_PCB 4 /* protocol control block */ #define MT_RTABLE 5 /* routing tables */ #define MT_HTABLE 6 /* IMP host tables */ #define MT_ATABLE 7 /* address resolution tables */ #define MT_SONAME 8 /* socket name */ #define MT_ZOMBIE 9 /* zombie proc status */ #define MT_SOOPTS 10 /* socket options */ #define MT_FTABLE 11 /* fragment reassembly header */ /* flags to m_get */ #define M_DONTWAIT 0 #define M_WAIT 1 /* flags to m_pgalloc */ #define MPG_MBUFS 0 /* put new mbufs on free list */ #define MPG_CLUSTERS 1 /* put new clusters on free list */ #define MPG_SPACE 2 /* don't free; caller wants space */ /* length to m_copy to copy all */ #define M_COPYALL 1000000000 #define MBGET(m, i, t) \ { int ms = splimp(); \ if ((m)=mbfree) \ { if ((m)->m_type != MT_FREE) panic("mget"); (m)->m_type = t; \ mbstat.m_mbfree--; mbstat.m_mtypes[t]++; \ mbfree = (m)->m_next; (m)->m_next = 0; \ (m)->m_off = MMINOFF; } \ else \ (m) = m_more(i, t); \ splx(ms); } #define MCLGET(m, i) \ { int ms = splimp(); \ if (mclfree == 0) \ (void)m_clalloc(1, MPG_CLUSTERS, M_DONTWAIT); \ if ((m)=mclfree) \ {++mclrefcnt[mtocl(m)];mbstat.m_clfree--;mclfree = (m)->m_next;} \ splx(ms); } #define MCLFREE(m) { \ if (--mclrefcnt[mtocl(m)] == 0) \ { (m)->m_next = mclfree;mclfree = (m);mbstat.m_clfree++;} \ } #define MBFREE(m, n) \ { int ms = splimp(); \ if ((m)->m_type == MT_FREE) panic("mbfree twice"); \ mbstat.m_mtypes[(m)->m_type]--; (m)->m_type = MT_FREE; \ if ((m)->m_off > MSIZE) { \ (n) = (struct mbuf *)(mtod(m, int)&~CLOFSET); \ if (--mclrefcnt[mtocl(n)] == 0) \ { (n)->m_next = mclfree;mclfree = (n);mbstat.m_clfree++;} \ } \ (n) = (m)->m_next; (m)->m_next = mbfree; \ (m)->m_off = 0; (m)->m_act = 0; mbfree = (m); mbstat.m_mbfree++; \ splx(ms); } /* * Mbuf statistics. */ struct mbstat { short m_mbufs; /* mbufs obtained from page pool */ short m_mbfree; /* mbufs on our free list */ short m_clusters; /* clusters obtained from page pool */ short m_clfree; /* free clusters */ short m_drops; /* times failed to find space */ short m_mtypes[256]; /* type specific mbuf allocations */ }; extern struct mbuf *mbutl; extern char mclrefcnt[]; struct mbstat mbstat; int nmbclusters; struct mbuf *mbfree, *mclfree; struct mbuf *m_get(),*m_getclr(),*m_free(),*m_more(),*m_copy(),*m_pullup(); caddr_t m_clalloc(); ! / 548578671 0 0 0 1474 ` Y_SwapBits_wbetattach_wbetinit_wbetioctl_wbetoutput_wbetreset_GetWonderBoard_WBDriverInited_AllocDescRings_disableWBInterrupts_WB_Init_wbsetaddr_wbetread_tcpipOpen_WBLength_RecvDescCopy_IORAMAddr_RecvQHead_WBWrite_WBOffset_copyLANCEBufToMbuf_ipintrq_wbetopen_WB_Read_wbetintr_etherCBCopy_WBRead_LANCEError_packetXmitted_F_Cpt_Init_InitStartCmds_copyMbufToLANCEBuf_XmitQHead_XmitBufs_TempXmitQHead_XmitDescCopy_RemoveWBInterface_wbshutdown_SleepOK_WriteWBCommand_mclfree_mbstat_RecvBufs_GetXmitBuf_FlushLANCEInterruptQ_XmitQTail_ReadXmitDesc_Stats_WBWriteIOErr_bad_Write_CmdTimeout_D_Cpt_Cmd_TO_ErrCmd_wbetctrl_F_Cpt_Cmd_ReadRecvDesc_WriteRecvDesc_WriteXmitDesc_WBDevice_WBPresent_IOMapAddr_ReadRevCodes_RealRecvBufs_RealXmitBufs_diagCBCopy_ReadPhysicalAddr_localAddress_SetLogicalAddrFilter_CreateInitBlock_InitBlockCopy_WriteInitBlock_InitDescRings_TO_ErrInit_StartTimeout_D_Cpt_Init_TestRecvBufValid_FindRecvPktEnd_etherbroadcastaddr_nbpkterr_nmbclusters_mbfree_rawintrq_rpintrq_ifnet_rthost_rtnet_rtstat_domains_TO_ErrXmitwonder.o/ 548578670 0 0 100664 34010 ` u mv .text6=$ .data667,uL@.bss<< ~2 0q7B@ AqE qr pqqpppp  ~ɞW@4~8piP3Qa1L֧T P X z"  ="0т7z#L,7zV.L,74bzL">7L2z*~8Ǟ4@@W@~8pb^nzn4hV ;@Wzg !  z \ X L(@s z d$pׁ b&X F)z7h8ΰwz pׁb&  =&րp  p p yp   p pf== v\==^nzR)> ~XɞPɾHDppW8 ȧ~47 *zp  z~488W8D Jf7b88W8p|& ֐ 8) s,z  Ǝ lp p 4|(n !' hz z(l !' hzp zp(!p""(8#)2 zz  ozdp p `p p TT jp pZp ppvpp p~~PɎHɮ@XXWP<@~Hqx :zLj$ސp \p p&p Mhz z (0!#p23'#)yzz< p p (p p~Hɞ@Ǿ<PPW8 n88W8 n ^88WP<@~H ְ  p<P`  D  \    &    @ .          `  7堓  @ H2 f    ~Hɞ@Ǿ<PPW0  @     $$== (( $,,00WH8~@DpD z'(6(.p""8 W"Fpppp84l80X~@Ɏ8HHWH<~@ p (6(.p""8`W"Hpppp8t(.8p~@Ǟ<HHW8 2\0 1 "18$8R28B"8ȓ28 88WH~@p p &XBpV44dz2\ . (  z~@HHW8~t288W@~8pz6*Ӷߨzߠ~8@@W@ (( " Z# 9:pp44 9ޮpPL 9Tbp@@W@ ~8pp'r'r(r~8@@WP<@~Hppsޠ2 ᆰ ް ~Hɞ@Ǿ<PPW@ ~8pp'r'r(r~8@@WP<@~HppsޠB ᆰ ް ~Hɞ@Ǿ<PPW@,`<4<`a@aAыD` @@Wh<@H~PްP^\\X P  s\   ? p"0 0 0sp00@ @? sps0 0pnXxx  p 1+Lǎ\}1tD$4^XP^X^\P ^\ ްP^d\` P  s\   ? p"0 0 0sp00@ @? sps0 0pn`xx  p 1+Lǎd}1tD$4^`P^`^dP ^d ~PɞHɾ@<hhW8 Ď* 88WP<@~H@96 qp  鎠\(p=0ް=@B2r"Ӌ ޠ ~Hɞ@Ǿ<PPW !(W8 ȧ~4p J~488WH<~@π(ph rᆐ9~ސ ~@Ǟ<HHWH8~@p    8 t 9մp n    t :ސ ~@ɞ8HHWH<~@pA(Ԛz 6 pφp&:0Ppz B""p":Tz !. . Ӝz Ӕpp:|\Bp,pp: ~@Ǟ<HHW@~8pz:`,ӶҬzҤ~8@@W8p l* :(֋88W ԋ`@ ! 88 << @@` DDW@4~8pԊ  ހԊ T ހ ";hRԋu~8Ǟ4@@W@~< p4qD(;`'<(`51(70R!p"";@W";tϜB;ϊ0;z ;j;̓Z;LD(  p;Dppp<(Π^pFNflt ",.8FNZtz8bt^2@ B L V!Z"\"`#b#n!p!t!v!~!!####    %%%" $ 0 P'()%%%   **&8+|-%%%   ./0    !""##"!$!(!*!6!8!D#F#V#d#h j v | %3333""33 3 3 3 3 " " 3 3 ,3 .3 2" 4" l3 n3 3 3 3 3 3 3 3 " " 3 3 3 3 3 3 3 3 3 3 3 " " 3 3 3 3 3 3 " " 3 3 &3 (3 ,3 .3   7 7 7 -    r 9   ' h; j; |; ; < <    ; ; ; .; 4< 6< D V b f= h= p" r" > > > > > > > > > " " > > > > > > ; ; " " >>>>>>(>*>6>:"<"J>L>P>R>^>`>l=n=t;z+??@ 8`3b3h3l3n3t"v"|3~3C33333"" 33C*0>E  FFGFFHHIIJJ"I*J4F<V%X%f!j"l"p#r#~!!!!!!####%%%  %%%%" $ 0%2%@%B%J L \%^%%%  %%##%%KK   %%%  "%$%:!>"@"D#F#R!T!X!Z!b!d!r#t###!""##!!!!!!####+% %  $%&%0 2 @!D"F"J#L#X!Z!^!`!h!j!x#z###   !""##!!!!!!####"" !(#*#2!4!8!:!F!H!T#V#f#t#x z     ;;===>@"B"F=H=N>Z>\>`>b>j>l>v"x"==>>>>>>====>==*<,<<b>d>n>v>z"|"==>>>>>>""==>>>>>>3 333""3 3*3,30323>3B3D3H3J3P"R"X3Z3CCNN;;> >>>XPZPbPPPPPPPPPPPPPP P(P@PBPF>H>VP\btNNNPPPNNNNNNB>D>PPPPPPPPPPPP4QbS.8FL 3 3""334363>3@3H3J3T3V3\3d"f"l3n3|P~PPCCVVWVVV33X33""$C&CDYLPXRXtv~[[33[""33X3333XX-  " $ ,[ .[ <[ HX Z- b 3 3 3 3 3 3   3 3 3 " " 3 3!3!3! 3!"!"!3!3!*P!,P!4P!@3!B3!F3!H3!N!T!Z3!\3!b3!j"!l"!r3!t3!3!3!3!3!!!3!3!3!"!"!3!3!"!""!" !"!"!""""""""">">#r>#t>#x"#z"#_#`#_#`#`#`$Q$8a$Da$T`$V`$d"$rb$$K$K$d$d$K$K$d$d$e%"f%$f%2g%4g%\g%^g%<%<%h%h%<%<%h%h&e&Ff&Hf&Vg&Xg&g&g'4"'6"'>i'@i'Di'Fi'Ni'Pi'^"'`"'hi'ji'ni'pi'xi'zi'C'''3'3'3'3'"'"((k(k($((k(*k(n(n(n(n(n(n(n(n)n)n)n)F")H")Tn)Vn)~))!)!)d)d)!)!* !*b*b*H*N*`>*l>*th*vh*|>*>*>*b*b***#*N+=+;+H3+R3+Z3+b3+h+p3+r3+v3+x3+~"+"+3+3++++C+++,q,s,s,s,<W,@s,Bs,F7,H7,fY,n,rq,tq,~,,3,3,3,3,3,",",3,3,C,,----$7-&7-:q-D7-V--^-"-"-;-;->->->->->->-=-=-N-N->->---=-=.!. !.$!.&!.DP.FP.NP.R!.T!.fP.hP.pP.t!.v!.P.P.P.!.!.!.P.P.P.#.#/!/!/p!/r!///!/!/"/"/i/i/i/i/i0i0 i0 i0,020X0`0f0r0x000000000s070[0V0C011313131 31"31("1*"1031231FC1Z1b1pC112"2"2"#2$#2*!26!28!2<!2>!2F!2H!2V#2X#2h#2t#2x#2z#2!2"2"2!2!2!2!2!2!2#2#2#2#3#3#3K3K3k3k3>#3@#3LK3NK3Tv3Vv3"3"3#3#3!3!3!3!3!3!3!3#3#3#3#3#3#3!3"4"4!4!4!4!4!4 !4.#40#4B#4P#4X!4Z!4h4t4z444"4"4!4#4#4!4!4!4!4!4!4#4#4#4#4#4#5!5 "5 "5!5!5 !5"!5.!50!5<#5>#5P#5\#5d#5f#5lK5nK5x5|#5~#5K5K55#5#5K5K55!5!5 5%56 *6 *660Y666x6x8 8$8(8,8`8d8h8l;@;D;H;L;P;T;X;\.text6.data6.bss<|_spl7'2<G S^#_printfn_splx~$x_WB_Init/_bcopy<(3_WBWrite>HT_m_copy_m_adj_m_cat_ipintrq_m_freem\5_wakeupfp{_WB_Read1(_WBReadt+0_loif$.AT_SleepOKM_m_get_mclfree]_mbutlh_mbstat s}-x"_StatsH_d_readl_d_write | _timeout_sleepl!"d%#T_ctladdr4>IT',bp_ksct_kbasez'(()4) -#/.A.Qe<_ipintro_mbfree|_rpintrq_ifnet_rthost_rtnet_rtstat _domains_ipintrqFull_SwapBits_wbetattach_arpmyaddr_wbetinit_wbetioctl_wbetoutput_wbetreset_GetWonderBoard_WBDriverInited_AllocDescRings_disableWBInterrupts_if_attach_if_rtinit_arpattach_arpwhohas_wbsetaddr_in_netof_in_lnaof_if_makeaddr_wbetread_tcpipOpen_WBLength_RecvDescCopy_IORAMAddr_RecvQHead_WBOffset_copyLANCEBufToMbuf_wbetopen_arpinput_rawbuffer_rawinput_wbetintr_etherCBCopy_LANCEError_packetXmitted_F_Cpt_Init_InitStartCmds_arpresolve_copyMbufToLANCEBuf_XmitQHead_XmitBufs_TempXmitQHead_XmitDescCopy_looutput_RemoveWBInterface_wbshutdown_WriteWBCommand_m_clalloc_mclrefcnt_RecvBufs_GetXmitBuf_FlushLANCEInterruptQ_XmitQTail_ReadXmitDesc_WBWriteIOErr_bad_Write_CmdTimeout_D_Cpt_Cmd_TO_ErrCmd_wbetctrl_F_Cpt_Cmd_ReadRecvDesc_WriteRecvDesc_WriteXmitDesc_WBDevice_WBPresent_IOMapAddr_ReadRevCodes_RealRecvBufs_sptalloc_RealXmitBufs_diagCBCopy_ReadPhysicalAddr_localAddress_SetLogicalAddrFilter_CreateInitBlock_InitBlockCopy_WriteInitBlock_InitDescRings_TO_ErrInit_StartTimeout_D_Cpt_Init_TestRecvBufValid_FindRecvPktEnd_etherbroadcastaddr_nbpkterr_nmbclusters_rawintrq_TO_ErrXmit: # " 87/05/20 @(#)maketape 4.2 " # This script will make a bootable backup tape containing the following files: # # readme # ctbootcio # diskboot # image of root # cpio of /usr # cpio of root # # All files have blocksize of 4096. It is assumed that the /usr partition # is /dev/dsk/c0d0s2 and the root is /dev/dsk/c0d0s0. If this is not true, # then change all appropriate node names to the correct node name. # This script must be run in single user mode. set `/bin/who -r` if [ $7 = S -o $7 = s ] then echo "mounting /usr" /etc/mount /dev/dsk/c0d0s2 /usr > /dev/null 2>&1 cmt rew echo "writing readme file to /dev/rct/0n" dd if=/etc/release of=/dev/rct/0n bs=512 conv=sync echo "writing the tape bootstrapper to /dev/rct/0n" dd if=/etc/ctbootcio of=/dev/rct/0n bs=4096 conv=sync count=2 echo "writing the disk bootstrapper to /dev/rct/0n" dd if=/etc/diskboot of=/dev/rct/0n bs=4096 conv=sync count=2 echo "writing image of the root to /dev/rct/0n" dd if=/dev/rdsk/c0d0s0 of=/dev/rct/0n bs=4096 count=4096 cd / echo "writing cpio archive of /usr to /dev/rct/0n" find /usr -depth -print | cpio -oB > /dev/rct/0n echo "writing cpio archive of root to /dev/rct/0n" find . -depth -print | grep -v '^\./usr/' | cpio -oB > /dev/rct/0n echo "unmounting /usr" /etc/umount /dev/dsk/c0d0s2 > /dev/null 2>&1 else echo "System needs to be in single user mode before running this program." echo "Run shutdown(1M) before proceeding." exit fi h14986 s 00001/00002/00057 d D 4.4 87/05/20 15:15:32 build 7 6 c removed reference to name.c. -mkm e s 00004/00000/00055 d D 4.3 87/03/15 18:57:24 build 6 5 c make cf before unix e s 00001/00079/00054 d D 4.2 87/03/15 18:27:14 build 5 4 c e s 00000/00000/00133 d D 4.1 87/03/15 18:23:48 build 4 3 c rolled rev to -r4 /dc e s 00000/00000/00133 d D 3.1 87/03/15 18:23:48 build 3 2 c AUTO NULL DELTA e s 00000/00000/00133 d D 2.1 87/03/15 18:23:48 build 2 1 c AUTO NULL DELTA e s 00133/00000/00000 d D 1.1 87/03/15 18:23:27 build 1 0 c Placed under source control - dc e u U f b f n t T I 1 # " %W% %E% " D 5 # for now, equate destdir, and pass it to subortdinates (below) DESTDIR = $(SMX) E 5 # directories under this directory OS = os/ CF = cf/ IO = io/ ML = ml/ KDB = kdb/ NET = net/ WB = wb/ NETINET = netinet/ INCSYS = sys/ # Librarys produced MLLIB = $(ML)LIB0.a OSLIB = $(OS)LIB1.a IOLIB = $(IO)LIB2.a KDBLIB = $(KDB)LIBKDB.a NETLIB = $(NET)LIBN.a NETINETLIB = $(NETINET)LIBIN.a WBLIB = $(WB)LIBWB.a ULIBS = \ $(MLLIB) \ $(OSLIB) \ $(IOLIB) \ $(KDBLIB) \ $(NETLIB) \ $(NETINETLIB) \ $(WBLIB) # make two references to ULIBS in order to fully resolve inter-library refs UNIX = $(CF)conf.o $(CF)linesw.o \ D 7 $(ULIBS) $(ULIBS) \ $(CF)name.o E 7 I 7 $(ULIBS) $(ULIBS) E 7 I 6 all: -cd $(CF); $(MAKE) $(MAKE) unix E 6 D 5 all: -echo environment is : -printenv -cd $(INCSYS); $(MAKE) -cd $(ML); $(MAKE) -cd $(CF); $(MAKE) -cd $(OS); $(MAKE) -cd $(IO); $(MAKE) -cd $(KDB);$(MAKE) -cd $(NET);$(MAKE) -cd $(NETINET);$(MAKE) -cd $(WB);$(MAKE) $(MAKE) unix E 5 unix: $(UNIX) unix.ld rm -f $@ start.o ar x $(ML)LIB0.a start.o /bin/ld -N -o $@ unix.ld -e _start start.o $(UNIX) chmod 544 unix rm -f start.o install: D 5 # move the header files over (this might be no-op if SPX==DESTDIR) # cd $(SPX)/usr/include/sys; ls | cpio -pdm $(DESTDIR)/usr/include/sys # setup the ownership / protections of the include files -chgrp bin $(DESTDIR)/usr/include/sys/* -chmod 444 $(DESTDIR)/usr/include/sys/* -chown bin $(DESTDIR)/usr/include/sys/* # copy all of the libraries -cd $(DESTDIR)/sys ; rm -f $(ULIBS) ls $(ULIBS) | cpio -pdm $(DESTDIR)/sys cd $(DESTDIR)/sys ; chgrp bin $(ULIBS) cd $(DESTDIR)/sys ; chmod 444 $(ULIBS) cd $(DESTDIR)/sys ; chown sys $(ULIBS) # move the configuration files over cd $(CF) ; $(MAKE) install DESTDIR=$(DESTDIR)/$(CF) # move the kernel itself over -rm -f $(DESTDIR)/unix ls unix | cpio -pdm $(DESTDIR) chmod 544 $(DESTDIR)/unix chgrp bin $(DESTDIR)/unix chown root $(DESTDIR)/unix E 5 D 5 unix.ld: s.unix.ld $(GET) $(GFLAGS) -p $? > $@ E 5 clean: D 5 -echo environment is : -printenv E 5 rm -f start.o D 5 -cd $(INCSYS); $(MAKE) clean -cd $(ML); $(MAKE) clean E 5 -cd $(CF); $(MAKE) clean D 5 -cd $(OS); $(MAKE) clean -cd $(IO); $(MAKE) clean -cd $(KDB);$(MAKE) clean -cd $(NET);$(MAKE) clean -cd $(NETINET);$(MAKE) clean -cd $(WB);$(MAKE) clean E 5 clobber: D 5 -echo environment is : -printenv rm -f unix $(SPX)/unix start.o unix.ld nmunix -cd $(INCSYS); $(MAKE) clobber -cd $(ML); $(MAKE) clobber E 5 I 5 rm -f unix start.o nmunix E 5 -cd $(CF); $(MAKE) clobber D 5 -cd $(OS); $(MAKE) clobber -cd $(IO); $(MAKE) clobber -cd $(KDB);$(MAKE) clobber -cd $(NET);$(MAKE) clobber -cd $(NETINET);$(MAKE) clobber -cd $(WB);$(MAKE) clobber E 5 nmunix: unix nm -vx unix |pr -4 -w130 | tee nmunix | lp -tNM_UNIX D 5 #DESTDIR = /source/v10/makespix #LIVRSPX = $(DESTDIR)/Spx/usr/include # #LIBOS = /source/v10/sys/os/LIB1.a #LIBML = /source/v10/sys/ml/LIB0.a #LIBIO = /source/v10/sys/io/LIB2.a #LIBKDB = /source/v10/sys/kdb/LIBKDB.a # # #livr: # cd $(DESTDIR)/sys/os; rm -f *;ln $(LIBOS) . # cd $(DESTDIR)/sys/ml; rm -f *;ln $(LIBML) . # cd $(DESTDIR)/sys/io; rm -f *;ln $(LIBIO) . # cd $(DESTDIR)/sys/kdb; rm -f *;ln $(LIBKDB) . # cd $(DESTDIR)/sys/cf; rm -f *;ln /source/v10/sys/cf/* . # cd $(LIVRSPX); rm -f *.h;ln $(SPX)/usr/include/*.h . # cd $(LIVRSPX)/sys; rm -f *.h;ln $(SPX)/usr/include/sys/*.h . # cd $(DESTDIR)/sys; make E 5 E 1 h27639 s 00001/00001/00143 d D 4.10 87/05/20 17:23:50 build 31 30 c REALLY fix maketape. -mkm e s 00005/00000/00139 d D 4.9 87/05/20 15:19:22 build 30 29 c added maketape script. -mkm e s 00001/00002/00138 d D 4.8 87/04/16 19:56:20 dc 29 28 c dc - Add Bull updates from 03/05/87 e s 00030/00030/00110 d D 4.7 87/03/25 19:01:29 build 28 27 c van - pass make flags to subordinate makes e s 00002/00000/00138 d D 4.6 87/03/15 18:53:24 build 27 26 c install unix.ld e s 00001/00001/00137 d D 4.5 87/03/15 18:42:32 build 26 25 c install cf in .../sys/cf e s 00007/00002/00131 d D 4.4 87/03/15 18:38:31 build 25 24 c add mk.field e s 00001/00001/00132 d D 4.3 87/03/15 18:21:29 build 24 23 c add CF to installation e s 00010/00008/00123 d D 4.2 87/02/25 18:08:51 dc 23 19 c fix up installation (some more) e s 00003/00003/00128 d D 3.10.2.2 87/02/24 20:10:48 build 22 21 c added '/sys' to $(DESTDIR) in the install section for libraries. -mkm e s 00001/00001/00130 d D 3.10.2.1 87/02/24 08:34:55 build 21 18 c don't try to fiddle modes on CF installation e s 00004/00004/00127 d D 3.10.1.1 87/02/24 08:29:32 build 20 18 c fix ownership of headers in install phase /dc e s 00000/00000/00131 d D 4.1 87/02/20 13:40:04 build 19 18 c rolled rev to -r4 /dc e s 00002/00002/00129 d D 3.10 87/02/20 01:56:51 build 18 17 c reordered install line that cpios things to target dir. -mkm e s 00006/00001/00125 d D 3.9 87/02/19 10:39:43 build 17 16 c place unix in destdir at installation time only e s 00002/00002/00124 d D 3.8 87/02/19 10:30:19 build 16 15 c use cpio instead of cp in installation e s 00002/00002/00124 d D 3.7 87/02/19 10:08:30 build 15 14 c pass destdir to subordinates (temporarily) e s 00002/00002/00124 d D 3.6 87/02/19 10:07:05 build 14 13 c fiddle order of chgrp chmod chown e s 00053/00025/00073 d D 3.5 87/02/19 09:59:21 build 13 12 c add installation phase e s 00004/00004/00094 d D 3.4 87/02/13 14:29:24 build 12 11 c change ld.file to unix.ld e s 00029/00029/00069 d D 3.3 87/01/28 09:33:13 build 11 10 c change make into $(MAKE) e s 00010/00004/00088 d D 3.2 87/01/27 16:03:25 build 10 9 c make 2 passes on library loads for inter-library dependencies. e s 00000/00000/00092 d D 3.1 87/01/19 09:30:37 build 9 8 c rolled rev to -r3 /dc e s 00000/00000/00092 d D 2.1 87/01/19 09:30:37 build 8 7 c AUTO NULL DELTA e s 00001/00000/00091 d D 1.6 87/01/16 10:26:23 build 7 5 c add ident string /dc e s 00001/00000/00091 d R 1.6 87/01/16 09:28:43 build 6 5 c add ident string e s 00003/00003/00088 d D 1.5 87/01/14 15:50:51 build 5 4 c add nmunix to clobber e s 00001/00001/00090 d D 1.4 87/01/14 15:47:41 build 4 3 c add start.o to clobber e s 00006/00003/00085 d D 1.3 87/01/14 15:40:02 build 3 2 c add sccs for ld.file. Clean up start.o and ld.file e s 00024/00002/00064 d D 1.2 87/01/11 11:24:42 build 2 1 c add environment printing. Make clean and clobber distinct e s 00066/00000/00000 d D 1.1 87/01/09 15:03:33 build 1 0 c Placed under source control - dc e u U f b f n t T I 7 D 18 # "%W% %E%" E 18 I 18 # " %W% %E% " E 18 I 13 D 15 # for now, equate destdir E 15 I 15 D 28 # for now, equate destdir, and pass it to subortdinates (below) E 28 I 28 # for now, equate destdir, and pass it to subordinates (below) E 28 E 15 DESTDIR = $(SMX) # directories under this directory E 13 E 7 I 1 OS = os/ CF = cf/ IO = io/ ML = ml/ KDB = kdb/ NET = net/ WB = wb/ NETINET = netinet/ INCSYS = sys/ D 10 UNIX = $(CF)conf.o $(CF)linesw.o $(ML)LIB0.a $(OS)LIB1.a\ $(IO)LIB2.a $(KDB)LIBKDB.a\ E 10 I 10 D 13 ULIBS = $(ML)LIB0.a \ $(OS)LIB1.a\ $(IO)LIB2.a \ $(KDB)LIBKDB.a\ E 10 $(NET)LIBN.a\ $(WB)LIBWB.a\ D 10 $(NETINET)LIBIN.a\ E 10 I 10 $(NETINET)LIBIN.a E 13 I 13 # Librarys produced MLLIB = $(ML)LIB0.a OSLIB = $(OS)LIB1.a IOLIB = $(IO)LIB2.a KDBLIB = $(KDB)LIBKDB.a NETLIB = $(NET)LIBN.a NETINETLIB = $(NETINET)LIBIN.a WBLIB = $(WB)LIBWB.a E 13 I 13 ULIBS = \ $(MLLIB) \ $(OSLIB) \ $(IOLIB) \ $(KDBLIB) \ $(NETLIB) \ $(NETINETLIB) \ $(WBLIB) E 13 # make two references to ULIBS in order to fully resolve inter-library refs UNIX = $(CF)conf.o $(CF)linesw.o \ D 29 $(ULIBS) $(ULIBS) \ E 10 $(CF)name.o E 29 I 29 $(ULIBS) $(ULIBS) E 29 all: I 2 -echo environment is : -printenv E 2 D 11 -cd $(INCSYS); make -cd $(ML); make -cd $(CF); make -cd $(OS); make -cd $(IO); make -cd $(KDB);make -cd $(NET);make -cd $(NETINET);make -cd $(WB);make make unix E 11 I 11 D 28 -cd $(INCSYS); $(MAKE) -cd $(ML); $(MAKE) -cd $(CF); $(MAKE) -cd $(OS); $(MAKE) -cd $(IO); $(MAKE) -cd $(KDB);$(MAKE) -cd $(NET);$(MAKE) -cd $(NETINET);$(MAKE) -cd $(WB);$(MAKE) $(MAKE) unix E 28 I 28 -cd $(INCSYS); $(MAKE) -$(MAKEFLAGS) all -cd $(ML); $(MAKE) -$(MAKEFLAGS) all -cd $(CF); $(MAKE) -$(MAKEFLAGS) all -cd $(OS); $(MAKE) -$(MAKEFLAGS) all -cd $(IO); $(MAKE) -$(MAKEFLAGS) all -cd $(KDB);$(MAKE) -$(MAKEFLAGS) all -cd $(NET);$(MAKE) -$(MAKEFLAGS) all -cd $(NETINET);$(MAKE) -$(MAKEFLAGS) all -cd $(WB);$(MAKE) -$(MAKEFLAGS) all $(MAKE) -$(MAKEFLAGS) unix E 28 E 11 D 3 unix: $(UNIX) E 3 I 3 D 12 unix: $(UNIX) ld.file E 12 I 12 D 25 unix: $(UNIX) unix.ld E 25 I 25 D 31 unix: $(UNIX) unix.ld mk.field E 31 I 31 unix: $(UNIX) unix.ld mk.field maketape E 31 E 25 E 12 E 3 rm -f $@ start.o ar x $(ML)LIB0.a start.o D 10 /bin/ld -N -o $@ ld.file -e _start start.o -u _bcopy -u _min -u _save $(UNIX) E 10 I 10 D 12 /bin/ld -N -o $@ ld.file -e _start start.o $(UNIX) E 12 I 12 /bin/ld -N -o $@ unix.ld -e _start start.o $(UNIX) E 12 E 10 D 17 chmod 544 unix ; rm -f $(SPX)/unix; ln unix $(SPX)/unix E 17 I 17 chmod 544 unix E 17 rm -f start.o I 13 install: # move the header files over (this might be no-op if SPX==DESTDIR) D 16 cp $(SPX)/usr/include/sys/* $(DESTDIR)/usr/include/sys E 16 I 16 D 18 ls $(SPX)/usr/include/sys/* | cpio -pdm $(DESTDIR)/usr/include/sys E 18 I 18 D 20 D 23 cd $(SPX)/usr/include/sys; ls | cpio -pdm $(DESTDIR)/usr/include/sys E 23 I 23 # cd $(SPX)/usr/include/sys; ls | cpio -pdm $(DESTDIR)/usr/include/sys E 23 E 20 I 20 # cd $(SPX)/usr/include/sys; ls | cpio -pdm $(DESTDIR)/usr/include/sys E 20 E 18 E 16 # setup the ownership / protections of the include files D 14 chown bin $(DESTDIR)/usr/include/sys/* E 14 D 23 chgrp bin $(DESTDIR)/usr/include/sys/* chmod 444 $(DESTDIR)/usr/include/sys/* I 14 chown bin $(DESTDIR)/usr/include/sys/* E 23 I 23 -chgrp bin $(DESTDIR)/usr/include/sys/* -chmod 444 $(DESTDIR)/usr/include/sys/* -chown bin $(DESTDIR)/usr/include/sys/* E 23 E 14 # copy all of the libraries I 23 -cd $(DESTDIR)/sys ; rm -f $(ULIBS) E 23 D 16 cp $(ULIBS) $(DESTDIR)/sys E 16 I 16 ls $(ULIBS) | cpio -pdm $(DESTDIR)/sys E 16 D 14 cd $(DESTDIR) ; chown sys $(ULIBS) E 14 D 20 D 22 D 23 cd $(DESTDIR) ; chgrp bin $(ULIBS) cd $(DESTDIR) ; chmod 444 $(ULIBS) I 14 cd $(DESTDIR) ; chown sys $(ULIBS) E 23 I 23 cd $(DESTDIR)/sys ; chgrp bin $(ULIBS) cd $(DESTDIR)/sys ; chmod 444 $(ULIBS) cd $(DESTDIR)/sys ; chown sys $(ULIBS) E 23 E 22 I 22 cd $(DESTDIR)/sys ; chgrp bin $(ULIBS) cd $(DESTDIR)/sys ; chmod 444 $(ULIBS) cd $(DESTDIR)/sys ; chown sys $(ULIBS) E 22 E 20 I 20 cd $(DESTDIR)/sys ; chgrp bin $(ULIBS) cd $(DESTDIR)/sys ; chmod 444 $(ULIBS) cd $(DESTDIR)/sys ; chown sys $(ULIBS) E 20 E 14 # move the configuration files over D 15 cd $(CF) ; $(MAKE) install E 15 I 15 D 21 D 23 cd $(CF) ; $(MAKE) install DESTDIR=$(DESTDIR) E 23 I 23 D 24 # cd $(CF) ; $(MAKE) install DESTDIR=$(DESTDIR) E 24 I 24 D 26 cd $(CF) ; $(MAKE) install DESTDIR=$(DESTDIR)/$(CF) E 26 I 26 D 28 cd $(CF) ; $(MAKE) install DESTDIR=$(DESTDIR)/sys/$(CF) E 28 I 28 cd $(CF) ; $(MAKE) -$(MAKEFLAGS) install DESTDIR=$(DESTDIR)/sys/$(CF) E 28 E 26 I 25 # install the field makefile cp mk.field $(DESTDIR)/sys/Makefile I 30 # install the field tape maker cp maketape $(DESTDIR)/sys/maketape E 30 I 27 # install the loader instructions file cp unix.ld $(DESTDIR)/sys E 27 E 25 E 24 E 23 E 21 I 21 # cd $(CF) ; $(MAKE) install DESTDIR=$(DESTDIR) E 21 I 17 # move the kernel itself over I 23 -rm -f $(DESTDIR)/unix E 23 ls unix | cpio -pdm $(DESTDIR) chmod 544 $(DESTDIR)/unix chgrp bin $(DESTDIR)/unix chown root $(DESTDIR)/unix E 17 E 15 E 13 I 3 D 12 ld.file: s.ld.file E 12 I 12 unix.ld: s.unix.ld E 12 $(GET) $(GFLAGS) -p $? > $@ I 25 mk.field: s.mk.field I 30 $(GET) $(GFLAGS) -p $? > $@ maketape: s.maketape E 30 $(GET) $(GFLAGS) -p $? > $@ E 25 E 3 clean: I 2 -echo environment is : -printenv E 2 D 3 rm -f unix $(SPX)/unix E 3 I 3 D 11 rm -f unix $(SPX)/unix start.o E 3 D 2 -cd $(CF); make clobber E 2 I 2 -cd $(INCSYS); make clean -cd $(ML); make clean -cd $(CF); make clean -cd $(OS); make clean -cd $(IO); make clean -cd $(KDB);make clean -cd $(NET);make clean -cd $(NETINET);make clean -cd $(WB);make clean E 11 I 11 rm -f start.o D 28 -cd $(INCSYS); $(MAKE) clean -cd $(ML); $(MAKE) clean -cd $(CF); $(MAKE) clean -cd $(OS); $(MAKE) clean -cd $(IO); $(MAKE) clean -cd $(KDB);$(MAKE) clean -cd $(NET);$(MAKE) clean -cd $(NETINET);$(MAKE) clean -cd $(WB);$(MAKE) clean E 28 I 28 -cd $(INCSYS); $(MAKE) -$(MAKEFLAGS) clean -cd $(ML); $(MAKE) -$(MAKEFLAGS) clean -cd $(CF); $(MAKE) -$(MAKEFLAGS) clean -cd $(OS); $(MAKE) -$(MAKEFLAGS) clean -cd $(IO); $(MAKE) -$(MAKEFLAGS) clean -cd $(KDB);$(MAKE) -$(MAKEFLAGS) clean -cd $(NET);$(MAKE) -$(MAKEFLAGS) clean -cd $(NETINET);$(MAKE) -$(MAKEFLAGS) clean -cd $(WB);$(MAKE) -$(MAKEFLAGS) clean E 28 E 11 clobber: -echo environment is : -printenv D 3 rm -f unix $(SPX)/unix E 3 I 3 D 4 rm -f unix $(SPX)/unix ld.file E 4 I 4 D 5 rm -f unix $(SPX)/unix start.o ld.file E 5 I 5 D 12 rm -f unix $(SPX)/unix start.o ld.file nmunix E 12 I 12 D 25 rm -f unix $(SPX)/unix start.o unix.ld nmunix E 25 I 25 rm -f unix $(SPX)/unix start.o unix.ld mk.field nmunix E 25 E 12 E 5 E 4 E 3 D 11 -cd $(INCSYS); make clobber E 2 -cd $(ML); make clobber I 2 -cd $(CF); make clobber E 2 -cd $(OS); make clobber -cd $(IO); make clobber D 2 -cd $(INCSYS); make clean E 2 I 2 -cd $(KDB);make clobber -cd $(NET);make clobber -cd $(NETINET);make clobber -cd $(WB);make clobber E 11 I 11 D 28 -cd $(INCSYS); $(MAKE) clobber -cd $(ML); $(MAKE) clobber -cd $(CF); $(MAKE) clobber -cd $(OS); $(MAKE) clobber -cd $(IO); $(MAKE) clobber -cd $(KDB);$(MAKE) clobber -cd $(NET);$(MAKE) clobber -cd $(NETINET);$(MAKE) clobber -cd $(WB);$(MAKE) clobber E 28 I 28 -cd $(INCSYS); $(MAKE) -$(MAKEFLAGS) clobber -cd $(ML); $(MAKE) -$(MAKEFLAGS) clobber -cd $(CF); $(MAKE) -$(MAKEFLAGS) clobber -cd $(OS); $(MAKE) -$(MAKEFLAGS) clobber -cd $(IO); $(MAKE) -$(MAKEFLAGS) clobber -cd $(KDB);$(MAKE) -$(MAKEFLAGS) clobber -cd $(NET);$(MAKE) -$(MAKEFLAGS) clobber -cd $(NETINET);$(MAKE) -$(MAKEFLAGS) clobber -cd $(WB);$(MAKE) -$(MAKEFLAGS) clobber E 28 E 11 E 2 D 5 nmunix: nm -vx unix |pr -4 -w130 |lp -tNM_UNIX E 5 I 5 nmunix: unix nm -vx unix |pr -4 -w130 | tee nmunix | lp -tNM_UNIX E 5 D 13 DESTDIR = /source/v10/makespix LIVRSPX = $(DESTDIR)/Spx/usr/include LIBOS = /source/v10/sys/os/LIB1.a LIBML = /source/v10/sys/ml/LIB0.a LIBIO = /source/v10/sys/io/LIB2.a LIBKDB = /source/v10/sys/kdb/LIBKDB.a livr: cd $(DESTDIR)/sys/os; rm -f *;ln $(LIBOS) . cd $(DESTDIR)/sys/ml; rm -f *;ln $(LIBML) . cd $(DESTDIR)/sys/io; rm -f *;ln $(LIBIO) . cd $(DESTDIR)/sys/kdb; rm -f *;ln $(LIBKDB) . cd $(DESTDIR)/sys/cf; rm -f *;ln /source/v10/sys/cf/* . cd $(LIVRSPX); rm -f *.h;ln $(SPX)/usr/include/*.h . cd $(LIVRSPX)/sys; rm -f *.h;ln $(SPX)/usr/include/sys/*.h . cd $(DESTDIR)/sys; make E 13 I 13 #DESTDIR = /source/v10/makespix #LIVRSPX = $(DESTDIR)/Spx/usr/include # #LIBOS = /source/v10/sys/os/LIB1.a #LIBML = /source/v10/sys/ml/LIB0.a #LIBIO = /source/v10/sys/io/LIB2.a #LIBKDB = /source/v10/sys/kdb/LIBKDB.a # # #livr: # cd $(DESTDIR)/sys/os; rm -f *;ln $(LIBOS) . # cd $(DESTDIR)/sys/ml; rm -f *;ln $(LIBML) . # cd $(DESTDIR)/sys/io; rm -f *;ln $(LIBIO) . # cd $(DESTDIR)/sys/kdb; rm -f *;ln $(LIBKDB) . # cd $(DESTDIR)/sys/cf; rm -f *;ln /source/v10/sys/cf/* . # cd $(LIVRSPX); rm -f *.h;ln $(SPX)/usr/include/*.h . # cd $(LIVRSPX)/sys; rm -f *.h;ln $(SPX)/usr/include/sys/*.h . # cd $(DESTDIR)/sys; make E 13 E 1 : SNAPDIR=/src.cmd/dc/snap SRCDIR=`pwd` GET="get ${GFLAGS}" for dir in os cf io ml kdb net wb netinet sys do mkdir ${SNAPDIR}/${dir} cd ${dir} ls s.* | ( cd ${SNAPDIR}/${dir} while read f do ${GET} ${SRCDIR}/${dir}/$f done ) cd ${SRCDIR} done + /usr/bin/get -r4 -t s.Makefile 4.10 144 lines echo environment is : environment is : printenv USER=root TERM=vt100 SPX=/src.cmd/unix.bin SMX=/src.cmd/unix.bin SHELL=/bin/sh SGSBASE=/src.cmd/pdp/sgs REL=1.0 PS1=# PROD=/src.cmd/bin.production PEEP=$(PROD)/peep PCOM=$(PROD)/pcom PATH=/bin:/etc:/usr/bin NM=/bin/nm M4=/usr/bin/m4 LOGNAME=van LIBUCB=$(SPX)/usr/ucb.lib/libucb.a LIBPAS=$(SPX)/usr/lib/libpc.a LIBM=$(SPX)/lib/libm.a LIBINET=$(SPX)/usr/ucb.lib/libinet.a LIBI77=$(SPX)/usr/lib/libI77.a LIBF77=$(SPX)/usr/lib/libF77.a LIBCURSES=$(SPX)/usr/lib/libcurses.a LIBC=$(SPX)/lib/libc.a INS=/bin/cp INCUCB=$(SPX)/usr/ucb.include INC=$(SPX)/usr/include HOME=/u/van FCOM=$(PROD)/fcom EXINIT=set nowrapscan set ignorecase set shiftwidth=2 set autoindent set sh=/bin/sh CRT0=$(SPX)/lib/crt0.o CPP=/lib/cpp CCOM=$(PROD)/ccom ASRAW=/bin/as9 AR=/bin/ar PCFLAGS=-O $(IFLAGS) -I$(INC) -Ts\,$(CRT0) -TC\,$(LIBC) -TP\,$(LIBPAS) -Tp\,$(PCOM) -Ta\,$(ASRAW) -Tq\,$(PEEP) -TM\,$(LIBM) $(PCFLAGS2) PC=$(PROD)/pc FFLAGS=-O $(IFLAGS) -I$(INC) -Ts\,$(CRT0) -TC\,$(LIBC) -TM\,$(LIBM) -TF\,$(LIBF77) -TI\,$(LIBI77) -Tf\,$(FCOM) -Ta\,$(ASRAW) -Tq\,$(PEEP) $(FFLAGS2) F77=$(PROD)/f77 GFLAGS=-r4 -t GET=/usr/bin/get ASFLAGS=-I$(INC) $(ASFLAGS2) AS=$(PROD)/as CFLAGS=-O $(IFLAGS) -I$(INC) -Ts\,$(CRT0) -Tc\,$(CCOM) -Ta\,$(ASRAW) -TC\,$(LIBC) -Tq\,$(PEEP) -TM\,$(LIBM) $(DFLAGS) CC=$(PROD)/cc LD=/bin/ld LEX=/usr/bin/lex YACC=/usr/bin/yacc MAKE=/bin/make MAKEFLAGS=b cd sys/; /bin/make -b all + /usr/bin/get -r4 -t s.Makefile 4.10 294 lines rm -f /src.cmd/unix.bin/usr/include/sys/acct.h ; /usr/bin/get -r4 -t -p s.acct.h > /src.cmd/unix.bin/usr/include/sys/acct.h 4.4 31 lines rm -f /src.cmd/unix.bin/usr/include/sys/ass.h ; /usr/bin/get -r4 -t -p s.ass.h > /src.cmd/unix.bin/usr/include/sys/ass.h 4.10 181 lines rm -f /src.cmd/unix.bin/usr/include/sys/aouthdr.h ; /usr/bin/get -r4 -t -p s.aouthdr.h > /src.cmd/unix.bin/usr/include/sys/aouthdr.h 4.4 39 lines rm -f /src.cmd/unix.bin/usr/include/sys/bitmasks.h ; /usr/bin/get -r4 -t -p s.bitmasks.h > /src.cmd/unix.bin/usr/include/sys/bitmasks.h 4.4 18 lines rm -f /src.cmd/unix.bin/usr/include/sys/buf.h ; /usr/bin/get -r4 -t -p s.buf.h > /src.cmd/unix.bin/usr/include/sys/buf.h 4.4 93 lines rm -f /src.cmd/unix.bin/usr/include/sys/callo.h ; /usr/bin/get -r4 -t -p s.callo.h > /src.cmd/unix.bin/usr/include/sys/callo.h 4.4 17 lines rm -f /src.cmd/unix.bin/usr/include/sys/cio.h ; /usr/bin/get -r4 -t -p s.cio.h > /src.cmd/unix.bin/usr/include/sys/cio.h 4.5 497 lines rm -f /src.cmd/unix.bin/usr/include/sys/clock.h ; /usr/bin/get -r4 -t -p s.clock.h > /src.cmd/unix.bin/usr/include/sys/clock.h 4.4 6 lines rm -f /src.cmd/unix.bin/usr/include/sys/conf.h ; /usr/bin/get -r4 -t -p s.conf.h > /src.cmd/unix.bin/usr/include/sys/conf.h 4.5 94 lines rm -f /src.cmd/unix.bin/usr/include/sys/const.as.h ; /usr/bin/get -r4 -t -p s.const.as.h > /src.cmd/unix.bin/usr/include/sys/const.as.h 4.6 3 lines rm -f /src.cmd/unix.bin/usr/include/sys/const.c.h ; /usr/bin/get -r4 -t -p s.const.c.h > /src.cmd/unix.bin/usr/include/sys/const.c.h 1.4 2 lines rm -f /src.cmd/unix.bin/usr/include/sys/crtctl.h ; /usr/bin/get -r4 -t -p s.crtctl.h > /src.cmd/unix.bin/usr/include/sys/crtctl.h 4.4 57 lines rm -f /src.cmd/unix.bin/usr/include/sys/ctio.h ; /usr/bin/get -r4 -t -p s.ctio.h > /src.cmd/unix.bin/usr/include/sys/ctio.h 4.4 31 lines rm -f /src.cmd/unix.bin/usr/include/sys/debug.h ; /usr/bin/get -r4 -t -p s.debug.h > /src.cmd/unix.bin/usr/include/sys/debug.h 4.5 56 lines rm -f /src.cmd/unix.bin/usr/include/sys/defsocket.h ; /usr/bin/get -r4 -t -p s.defsocket.h > /src.cmd/unix.bin/usr/include/sys/defsocket.h 4.4 94 lines rm -f /src.cmd/unix.bin/usr/include/sys/dir.h ; /usr/bin/get -r4 -t -p s.dir.h > /src.cmd/unix.bin/usr/include/sys/dir.h 4.4 9 lines rm -f /src.cmd/unix.bin/usr/include/sys/elog.h ; /usr/bin/get -r4 -t -p s.elog.h > /src.cmd/unix.bin/usr/include/sys/elog.h 4.4 34 lines rm -f /src.cmd/unix.bin/usr/include/sys/erec.h ; /usr/bin/get -r4 -t -p s.erec.h > /src.cmd/unix.bin/usr/include/sys/erec.h 4.4 124 lines rm -f /src.cmd/unix.bin/usr/include/sys/err.h ; /usr/bin/get -r4 -t -p s.err.h > /src.cmd/unix.bin/usr/include/sys/err.h 4.4 24 lines rm -f /src.cmd/unix.bin/usr/include/sys/errno.h ; /usr/bin/get -r4 -t -p s.errno.h > /src.cmd/unix.bin/usr/include/sys/errno.h 4.4 91 lines rm -f /src.cmd/unix.bin/usr/include/sys/fblk.h ; /usr/bin/get -r4 -t -p s.fblk.h > /src.cmd/unix.bin/usr/include/sys/fblk.h 4.4 6 lines rm -f /src.cmd/unix.bin/usr/include/sys/fdlp.h ; /usr/bin/get -r4 -t -p s.fdlp.h > /src.cmd/unix.bin/usr/include/sys/fdlp.h 4.4 194 lines rm -f /src.cmd/unix.bin/usr/include/sys/file.h ; /usr/bin/get -r4 -t -p s.file.h > /src.cmd/unix.bin/usr/include/sys/file.h 4.4 56 lines rm -f /src.cmd/unix.bin/usr/include/sys/filehdr.h ; /usr/bin/get -r4 -t -p s.filehdr.h > /src.cmd/unix.bin/usr/include/sys/filehdr.h 4.4 109 lines rm -f /src.cmd/unix.bin/usr/include/sys/filsys.h ; /usr/bin/get -r4 -t -p s.filsys.h > /src.cmd/unix.bin/usr/include/sys/filsys.h 4.4 33 lines rm -f /src.cmd/unix.bin/usr/include/sys/flock.h ; /usr/bin/get -r4 -t -p s.flock.h > /src.cmd/unix.bin/usr/include/sys/flock.h 4.4 56 lines rm -f /src.cmd/unix.bin/usr/include/sys/hwclock.h ; /usr/bin/get -r4 -t -p s.hwclock.h > /src.cmd/unix.bin/usr/include/sys/hwclock.h 4.5 16 lines rm -f /src.cmd/unix.bin/usr/include/sys/ieeefp.h ; /usr/bin/get -r4 -t -p s.ieeefp.h > /src.cmd/unix.bin/usr/include/sys/ieeefp.h 4.4 11 lines rm -f /src.cmd/unix.bin/usr/include/sys/init.h ; /usr/bin/get -r4 -t -p s.init.h > /src.cmd/unix.bin/usr/include/sys/init.h 4.4 27 lines rm -f /src.cmd/unix.bin/usr/include/sys/ino.h ; /usr/bin/get -r4 -t -p s.ino.h > /src.cmd/unix.bin/usr/include/sys/ino.h 4.4 19 lines rm -f /src.cmd/unix.bin/usr/include/sys/inode.h ; /usr/bin/get -r4 -t -p s.inode.h > /src.cmd/unix.bin/usr/include/sys/inode.h 4.4 94 lines rm -f /src.cmd/unix.bin/usr/include/sys/iobuf.h ; /usr/bin/get -r4 -t -p s.iobuf.h > /src.cmd/unix.bin/usr/include/sys/iobuf.h 4.5 63 lines rm -f /src.cmd/unix.bin/usr/include/sys/iomachdep.h ; /usr/bin/get -r4 -t -p s.iomachdep.h > /src.cmd/unix.bin/usr/include/sys/iomachdep.h 4.5 64 lines rm -f /src.cmd/unix.bin/usr/include/sys/ipc.h ; /usr/bin/get -r4 -t -p s.ipc.h > /src.cmd/unix.bin/usr/include/sys/ipc.h 4.4 26 lines rm -f /src.cmd/unix.bin/usr/include/sys/lock.h ; /usr/bin/get -r4 -t -p s.lock.h > /src.cmd/unix.bin/usr/include/sys/lock.h 4.4 8 lines rm -f /src.cmd/unix.bin/usr/include/sys/lprio.h ; /usr/bin/get -r4 -t -p s.lprio.h > /src.cmd/unix.bin/usr/include/sys/lprio.h 4.4 46 lines rm -f /src.cmd/unix.bin/usr/include/sys/maint.h ; /usr/bin/get -r4 -t -p s.maint.h > /src.cmd/unix.bin/usr/include/sys/maint.h 4.8 31 lines rm -f /src.cmd/unix.bin/usr/include/sys/map.h ; /usr/bin/get -r4 -t -p s.map.h > /src.cmd/unix.bin/usr/include/sys/map.h 4.4 13 lines rm -f /src.cmd/unix.bin/usr/include/sys/mas.h ; /usr/bin/get -r4 -t -p s.mas.h > /src.cmd/unix.bin/usr/include/sys/mas.h 4.6 342 lines rm -f /src.cmd/unix.bin/usr/include/sys/mbuf.h ; /usr/bin/get -r4 -t -p s.mbuf.h > /src.cmd/unix.bin/usr/include/sys/mbuf.h 4.5 125 lines rm -f /src.cmd/unix.bin/usr/include/sys/me.h ; /usr/bin/get -r4 -t -p s.me.h > /src.cmd/unix.bin/usr/include/sys/me.h 4.6 167 lines rm -f /src.cmd/unix.bin/usr/include/sys/mem.h ; /usr/bin/get -r4 -t -p s.mem.h > /src.cmd/unix.bin/usr/include/sys/mem.h 4.5 16 lines rm -f /src.cmd/unix.bin/usr/include/sys/mount.h ; /usr/bin/get -r4 -t -p s.mount.h > /src.cmd/unix.bin/usr/include/sys/mount.h 4.4 19 lines rm -f /src.cmd/unix.bin/usr/include/sys/msg.h ; /usr/bin/get -r4 -t -p s.msg.h > /src.cmd/unix.bin/usr/include/sys/msg.h 4.4 102 lines rm -f /src.cmd/unix.bin/usr/include/sys/mt.h ; /usr/bin/get -r4 -t -p s.mt.h > /src.cmd/unix.bin/usr/include/sys/mt.h 4.6 155 lines rm -f /src.cmd/unix.bin/usr/include/sys/mtio.h ; /usr/bin/get -r4 -t -p s.mtio.h > /src.cmd/unix.bin/usr/include/sys/mtio.h 4.6 18 lines rm -f /src.cmd/unix.bin/usr/include/sys/opt.h ; /usr/bin/get -r4 -t -p s.opt.h > /src.cmd/unix.bin/usr/include/sys/opt.h 4.4 76 lines rm -f /src.cmd/unix.bin/usr/include/sys/page.h ; /usr/bin/get -r4 -t -p s.page.h > /src.cmd/unix.bin/usr/include/sys/page.h 4.5 224 lines rm -f /src.cmd/unix.bin/usr/include/sys/param.h ; /usr/bin/get -r4 -t -p s.param.h > /src.cmd/unix.bin/usr/include/sys/param.h 4.4 177 lines rm -f /src.cmd/unix.bin/usr/include/sys/pcb.h ; /usr/bin/get -r4 -t -p s.pcb.h > /src.cmd/unix.bin/usr/include/sys/pcb.h 4.8 57 lines rm -f /src.cmd/unix.bin/usr/include/sys/pfdat.h ; /usr/bin/get -r4 -t -p s.pfdat.h > /src.cmd/unix.bin/usr/include/sys/pfdat.h 4.4 33 lines rm -f /src.cmd/unix.bin/usr/include/sys/physmem.h ; /usr/bin/get -r4 -t -p s.physmem.h > /src.cmd/unix.bin/usr/include/sys/physmem.h 4.5 49 lines rm -f /src.cmd/unix.bin/usr/include/sys/proc.h ; /usr/bin/get -r4 -t -p s.proc.h > /src.cmd/unix.bin/usr/include/sys/proc.h 4.4 87 lines rm -f /src.cmd/unix.bin/usr/include/sys/psl.h ; /usr/bin/get -r4 -t -p s.psl.h > /src.cmd/unix.bin/usr/include/sys/psl.h 4.4 13 lines rm -f /src.cmd/unix.bin/usr/include/sys/pty.h ; /usr/bin/get -r4 -t -p s.pty.h > /src.cmd/unix.bin/usr/include/sys/pty.h 4.5 13 lines rm -f /src.cmd/unix.bin/usr/include/sys/reg.h ; /usr/bin/get -r4 -t -p s.reg.h > /src.cmd/unix.bin/usr/include/sys/reg.h 4.4 54 lines rm -f /src.cmd/unix.bin/usr/include/sys/region.h ; /usr/bin/get -r4 -t -p s.region.h > /src.cmd/unix.bin/usr/include/sys/region.h 4.4 148 lines rm -f /src.cmd/unix.bin/usr/include/sys/rnio.h ; /usr/bin/get -r4 -t -p s.rnio.h > /src.cmd/unix.bin/usr/include/sys/rnio.h 4.3 8 lines rm -f /src.cmd/unix.bin/usr/include/sys/scnhdr.h ; /usr/bin/get -r4 -t -p s.scnhdr.h > /src.cmd/unix.bin/usr/include/sys/scnhdr.h 4.4 73 lines rm -f /src.cmd/unix.bin/usr/include/sys/seg.h ; /usr/bin/get -r4 -t -p s.seg.h > /src.cmd/unix.bin/usr/include/sys/seg.h 4.4 12 lines rm -f /src.cmd/unix.bin/usr/include/sys/sem.h ; /usr/bin/get -r4 -t -p s.sem.h > /src.cmd/unix.bin/usr/include/sys/sem.h 4.4 105 lines rm -f /src.cmd/unix.bin/usr/include/sys/shm.h ; /usr/bin/get -r4 -t -p s.shm.h > /src.cmd/unix.bin/usr/include/sys/shm.h 4.4 70 lines rm -f /src.cmd/unix.bin/usr/include/sys/signal.h ; /usr/bin/get -r4 -t -p s.signal.h > /src.cmd/unix.bin/usr/include/sys/signal.h 4.5 41 lines rm -f /src.cmd/unix.bin/usr/include/sys/smd.h ; /usr/bin/get -r4 -t -p s.smd.h > /src.cmd/unix.bin/usr/include/sys/smd.h 4.6 151 lines rm -f /src.cmd/unix.bin/usr/include/sys/space.h ; /usr/bin/get -r4 -t -p s.space.h > /src.cmd/unix.bin/usr/include/sys/space.h 4.9 306 lines rm -f /src.cmd/unix.bin/usr/include/sys/stat.h ; /usr/bin/get -r4 -t -p s.stat.h > /src.cmd/unix.bin/usr/include/sys/stat.h 4.4 69 lines rm -f /src.cmd/unix.bin/usr/include/sys/swap.h ; /usr/bin/get -r4 -t -p s.swap.h > /src.cmd/unix.bin/usr/include/sys/swap.h 4.4 69 lines rm -f /src.cmd/unix.bin/usr/include/sys/sxt.h ; /usr/bin/get -r4 -t -p s.sxt.h > /src.cmd/unix.bin/usr/include/sys/sxt.h 4.4 75 lines rm -f /src.cmd/unix.bin/usr/include/sys/sysinfo.h ; /usr/bin/get -r4 -t -p s.sysinfo.h > /src.cmd/unix.bin/usr/include/sys/sysinfo.h 4.4 89 lines rm -f /src.cmd/unix.bin/usr/include/sys/sysmacros.h ; /usr/bin/get -r4 -t -p s.sysmacros.h > /src.cmd/unix.bin/usr/include/sys/sysmacros.h 4.4 99 lines rm -f /src.cmd/unix.bin/usr/include/sys/sysridge.h ; /usr/bin/get -r4 -t -p s.sysridge.h > /src.cmd/unix.bin/usr/include/sys/sysridge.h 4.4 34 lines rm -f /src.cmd/unix.bin/usr/include/sys/systm.h ; /usr/bin/get -r4 -t -p s.systm.h > /src.cmd/unix.bin/usr/include/sys/systm.h 4.4 76 lines rm -f /src.cmd/unix.bin/usr/include/sys/termio.h ; /usr/bin/get -r4 -t -p s.termio.h > /src.cmd/unix.bin/usr/include/sys/termio.h 4.5 221 lines rm -f /src.cmd/unix.bin/usr/include/sys/text.h ; /usr/bin/get -r4 -t -p s.text.h > /src.cmd/unix.bin/usr/include/sys/text.h 4.4 24 lines rm -f /src.cmd/unix.bin/usr/include/sys/timeb.h ; /usr/bin/get -r4 -t -p s.timeb.h > /src.cmd/unix.bin/usr/include/sys/timeb.h 4.4 37 lines rm -f /src.cmd/unix.bin/usr/include/sys/times.h ; /usr/bin/get -r4 -t -p s.times.h > /src.cmd/unix.bin/usr/include/sys/times.h 4.4 10 lines rm -f /src.cmd/unix.bin/usr/include/sys/trace.h ; /usr/bin/get -r4 -t -p s.trace.h > /src.cmd/unix.bin/usr/include/sys/trace.h 4.4 12 lines rm -f /src.cmd/unix.bin/usr/include/sys/trap.h ; /usr/bin/get -r4 -t -p s.trap.h > /src.cmd/unix.bin/usr/include/sys/trap.h 4.5 35 lines rm -f /src.cmd/unix.bin/usr/include/sys/ttold.h ; /usr/bin/get -r4 -t -p s.ttold.h > /src.cmd/unix.bin/usr/include/sys/ttold.h 4.4 32 lines rm -f /src.cmd/unix.bin/usr/include/sys/tty.h ; /usr/bin/get -r4 -t -p s.tty.h > /src.cmd/unix.bin/usr/include/sys/tty.h 4.4 164 lines rm -f /src.cmd/unix.bin/usr/include/sys/tuneable.h ; /usr/bin/get -r4 -t -p s.tuneable.h > /src.cmd/unix.bin/usr/include/sys/tuneable.h 4.4 20 lines rm -f /src.cmd/unix.bin/usr/include/sys/types.h ; /usr/bin/get -r4 -t -p s.types.h > /src.cmd/unix.bin/usr/include/sys/types.h 4.4 23 lines rm -f /src.cmd/unix.bin/usr/include/sys/uio.h ; /usr/bin/get -r4 -t -p s.uio.h > /src.cmd/unix.bin/usr/include/sys/uio.h 4.5 22 lines rm -f /src.cmd/unix.bin/usr/include/sys/user.h ; /usr/bin/get -r4 -t -p s.user.h > /src.cmd/unix.bin/usr/include/sys/user.h 4.5 127 lines rm -f /src.cmd/unix.bin/usr/include/sys/utsname.h ; /usr/bin/get -r4 -t -p s.utsname.h > /src.cmd/unix.bin/usr/include/sys/utsname.h 4.4 9 lines rm -f /src.cmd/unix.bin/usr/include/sys/var.h ; /usr/bin/get -r4 -t -p s.var.h > /src.cmd/unix.bin/usr/include/sys/var.h 4.4 43 lines rm -f /src.cmd/unix.bin/usr/include/sys/version.h ; /usr/bin/get -r4 -t -p s.version.h > /src.cmd/unix.bin/usr/include/sys/version.h 4.5 1 lines rm -f /src.cmd/unix.bin/usr/include/sys/vtoc.h ; /usr/bin/get -r4 -t -p s.vtoc.h > /src.cmd/unix.bin/usr/include/sys/vtoc.h 4.5 101 lines cd ml/; /bin/make -b all + /usr/bin/get -r4 -t s.Makefile 4.6 88 lines /usr/bin/get -r4 -t -p s.mapa.c > mapa.c 4.3 42 lines /src.cmd/bin.production/cc -c -O -I/src.cmd/unix.bin/usr/include -Ts\,/src.cmd/unix.bin/lib/crt0.o -Tc\,/src.cmd/bin.production/ccom -Ta\,/bin/as9 -TC\,/src.cmd/unix.bin/lib/libc.a -Tq\,/src.cmd/bin.production/peep -TM\,/src.cmd/unix.bin/lib/libm.a -Dmldebug -Dosdebug -DKDB mapa.c C - Copyright (c) 1987 Ridge Computers v3.0 mapa.c: ar rv LIB0.a mapa.o ar: creating LIB0.a a - mapa.o rm -f mapa.[co] /usr/bin/get -r4 -t -p s.trap.s > trap.s 4.13 810 lines /src.cmd/bin.production/as -I/src.cmd/unix.bin/usr/include -Dmldebug -Dosdebug -DKDB -o trap.o trap.s ar rv LIB0.a trap.o a - trap.o rm -f trap.[so] /usr/bin/get -r4 -t -p s.paging.s > paging.s 4.8 180 lines /src.cmd/bin.production/as -I/src.cmd/unix.bin/usr/include -Dmldebug -Dosdebug -DKDB -o paging.o paging.s ar rv LIB0.a paging.o a - paging.o rm -f paging.[so] /usr/bin/get -r4 -t -p s.start.s > start.s 4.10 208 lines /src.cmd/bin.production/as -I/src.cmd/unix.bin/usr/include -Dmldebug -Dosdebug -DKDB -o start.o start.s ar rv LIB0.a start.o a - start.o rm -f start.[so] /usr/bin/get -r4 -t -p s.cswitch.s > cswitch.s 4.6 131 lines /src.cmd/bin.production/as -I/src.cmd/unix.bin/usr/include -Dmldebug -Dosdebug -DKDB -o cswitch.o cswitch.s ar rv LIB0.a cswitch.o a - cswitch.o rm -f cswitch.[so] /usr/bin/get -r4 -t -p s.copy.s > copy.s 4.5 76 lines /src.cmd/bin.production/as -I/src.cmd/unix.bin/usr/include -Dmldebug -Dosdebug -DKDB -o copy.o copy.s ar rv LIB0.a copy.o a - copy.o rm -f copy.[so] /usr/bin/get -r4 -t -p s.userio.s > userio.s 4.7 190 lines /src.cmd/bin.production/as -I/src.cmd/unix.bin/usr/include -Dmldebug -Dosdebug -DKDB -o userio.o userio.s ar rv LIB0.a userio.o a - userio.o rm -f userio.[so] /usr/bin/get -r4 -t -p s.math.s > math.s 4.5 57 lines /src.cmd/bin.production/as -I/src.cmd/unix.bin/usr/include -Dmldebug -Dosdebug -DKDB -o math.o math.s ar rv LIB0.a math.o a - math.o rm -f math.[so] /usr/bin/get -r4 -t -p s.memscan.s > memscan.s 4.5 187 lines /src.cmd/bin.production/as -I/src.cmd/unix.bin/usr/include -Dmldebug -Dosdebug -DKDB -o memscan.o memscan.s ar rv LIB0.a memscan.o a - memscan.o rm -f memscan.[so] /usr/bin/get -r4 -t -p s.misc.s > misc.s 4.11 388 lines /src.cmd/bin.production/as -I/src.cmd/unix.bin/usr/include -Dmldebug -Dosdebug -DKDB -o misc.o misc.s ar rv LIB0.a misc.o a - misc.o rm -f misc.[so] /usr/bin/get -r4 -t -p s.end.s > end.s 4.1 36 lines /src.cmd/bin.production/as -I/src.cmd/unix.bin/usr/include -Dmldebug -Dosdebug -DKDB -o end.o end.s ar rv LIB0.a end.o a - end.o rm -f end.[so] /usr/bin/get -r4 -t -p s.low.s > low.s 4.4 148 lines /src.cmd/bin.production/as -I/src.cmd/unix.bin/usr/include -Dmldebug -Dosdebug -DKDB -o low.o low.s ar rv LIB0.a low.o a - low.o rm -f low.[so] /usr/bin/get -r4 -t -p s.ccb.s > ccb.s 4.5 305 lines /src.cmd/bin.production/as -I/src.cmd/unix.bin/usr/include -Dmldebug -Dosdebug -DKDB -o ccb.o ccb.s ar rv LIB0.a ccb.o a - ccb.o rm -f ccb.[so] cd cf/; /bin/make -b all + /usr/bin/get -r4 -t s.Makefile 4.13 62 lines /usr/bin/get -r4 -t -p s.config.h > config.h 4.4 110 lines /usr/bin/get -r4 -t -p s.conf.c > conf.c 4.6 434 lines /src.cmd/bin.production/cc -O -I/src.cmd/unix.bin/usr/include -Ts\,/src.cmd/unix.bin/lib/crt0.o -Tc\,/src.cmd/bin.production/ccom -Ta\,/bin/as9 -TC\,/src.cmd/unix.bin/lib/libc.a -Tq\,/src.cmd/bin.production/peep -TM\,/src.cmd/unix.bin/lib/libm.a -DSYS=\"RX/V\" -DNODE=\"undef\" -DREL=\"1.0\" -DVER=\"standard\" -DMACH=\"ridge\" -c conf.c C - Copyright (c) 1987 Ridge Computers v3.0 conf.c: rm -f conf.c /usr/bin/get -r4 -t -p s.linesw.c > linesw.c 4.4 44 lines /src.cmd/bin.production/cc -O -I/src.cmd/unix.bin/usr/include -Ts\,/src.cmd/unix.bin/lib/crt0.o -Tc\,/src.cmd/bin.production/ccom -Ta\,/bin/as9 -TC\,/src.cmd/unix.bin/lib/libc.a -Tq\,/src.cmd/bin.production/peep -TM\,/src.cmd/unix.bin/lib/libm.a -DSYS=\"RX/V\" -DNODE=\"undef\" -DREL=\"1.0\" -DVER=\"standard\" -DMACH=\"ridge\" -c linesw.c C - Copyright (c) 1987 Ridge Computers v3.0 linesw.c: rm -f linesw.c cd os/; /bin/make -b all + /usr/bin/get -r4 -t s.Makefile 4.11 1144 lines /usr/bin/get -r4 -t -p s.acct.c > acct.c 4.4 119 lines /src.cmd/bin.production/cc -c -O -I/src.cmd/unix.bin/usr/ucb.include -I/src.cmd/unix.bin/usr/include -Ts\,/src.cmd/unix.bin/lib/crt0.o -Tc\,/src.cmd/bin.production/ccom -Ta\,/bin/as9 -TC\,/src.cmd/unix.bin/lib/libc.a -Tq\,/src.cmd/bin.production/peep -TM\,/src.cmd/unix.bin/lib/libm.a -DOSDEBUG -DSOCKET acct.c C - Copyright (c) 1987 Ridge Computers v3.0 acct.c: ar rv LIB1.a acct.o ar: creating LIB1.a a - acct.o rm -f acct.[co] /usr/bin/get -r4 -t -p s.alloc.c > alloc.c 4.4 329 lines /src.cmd/bin.production/cc -c -O -I/src.cmd/unix.bin/usr/ucb.include -I/src.cmd/unix.bin/usr/include -Ts\,/src.cmd/unix.bin/lib/crt0.o -Tc\,/src.cmd/bin.production/ccom -Ta\,/bin/as9 -TC\,/src.cmd/unix.bin/lib/libc.a -Tq\,/src.cmd/bin.production/peep -TM\,/src.cmd/unix.bin/lib/libm.a -DOSDEBUG -DSOCKET alloc.c C - Copyright (c) 1987 Ridge Computers v3.0 alloc.c: ar rv LIB1.a alloc.o a - alloc.o rm -f alloc.[co] /usr/bin/get -r4 -t -p s.bio.c > bio.c 4.4 507 lines /src.cmd/bin.production/cc -c -O -I/src.cmd/unix.bin/usr/ucb.include -I/src.cmd/unix.bin/usr/include -Ts\,/src.cmd/unix.bin/lib/crt0.o -Tc\,/src.cmd/bin.production/ccom -Ta\,/bin/as9 -TC\,/src.cmd/unix.bin/lib/libc.a -Tq\,/src.cmd/bin.production/peep -TM\,/src.cmd/unix.bin/lib/libm.a -DOSDEBUG -DSOCKET bio.c C - Copyright (c) 1987 Ridge Computers v3.0 bio.c: ar rv LIB1.a bio.o a - bio.o rm -f bio.[co] /usr/bin/get -r4 -t -p s.bitmasks.c > bitmasks.c 4.3 106 lines /src.cmd/bin.production/cc -c -O -I/src.cmd/unix.bin/usr/ucb.include -I/src.cmd/unix.bin/usr/include -Ts\,/src.cmd/unix.bin/lib/crt0.o -Tc\,/src.cmd/bin.production/ccom -Ta\,/bin/as9 -TC\,/src.cmd/unix.bin/lib/libc.a -Tq\,/src.cmd/bin.production/peep -TM\,/src.cmd/unix.bin/lib/libm.a -DOSDEBUG -DSOCKET bitmasks.c C - Copyright (c) 1987 Ridge Computers v3.0 bitmasks.c: ar rv LIB1.a bitmasks.o a - bitmasks.o rm -f bitmasks.[co] /usr/bin/get -r4 -t -p s.blklist.c > blklist.c 4.4 181 lines /src.cmd/bin.production/cc -c -O -I/src.cmd/unix.bin/usr/ucb.include -I/src.cmd/unix.bin/usr/include -Ts\,/src.cmd/unix.bin/lib/crt0.o -Tc\,/src.cmd/bin.production/ccom -Ta\,/bin/as9 -TC\,/src.cmd/unix.bin/lib/libc.a -Tq\,/src.cmd/bin.production/peep -TM\,/src.cmd/unix.bin/lib/libm.a -DOSDEBUG -DSOCKET blklist.c C - Copyright (c) 1987 Ridge Computers v3.0 blklist.c: ar rv LIB1.a blklist.o a - b2 rc.cmd/bin.production/peep -TM\,/src.cmd/unix.bin/lib/libm.a -DOSDEBUG -DSOCKET fork.c C - Copyright (c) 1987 Ridge Computers v3.0 fork.c: ar rv LIB1.a fork.o a - fork.o rm -f fork.[co] /usr/bin/get -r4 -t -p s.getpages.c > getpages.c 4.4 683 lines /src.cmd/bin.production/cc -c -O -I/src.cmd/unix.bin/usr/ucb.include -I/src.cmd/unix.bin/usr/include -Ts\,/src.cmd/unix.bin/lib/crt0.o -Tc\,/src.cmd/bin.production/ccom -Ta\,/bin/as9 -TC\,/src.cmd/unix.bin/lib/libc.a -Tq\,/src.cmd/bin.production/peep -TM\,/src.cmd/unix.bin/lib/libm.a -DOSDEBUG -DSOCKET getpages.c C - Copyright (c) 1987 Ridge Computers v3.0 getpages.c: ar rv LIB1.a getpages.o a - getpages.o rm -f getpages.[co] /usr/bin/get -r4 -t -p s.grow.c > grow.c 4.4 119 lines /src.cmd/bin.production/cc -c -O -I/src.cmd/unix.bin/usr/ucb.include -I/src.cmd/unix.bin/usr/include -Ts\,/src.cmd/unix.bin/lib/crt0.o -Tc\,/src.cmd/bin.production/ccom -Ta\,/bin/as9 -TC\,/src.cmd/unix.bin/lib/libc.a -Tq\,/src.cmd/bin.production/peep -TM\,/src.cmd/unix.bin/lib/libm.a -DOSDEBUG -DSOCKET grow.c C - Copyright (c) 1987 Ridge Computers v3.0 grow.c: ar rv LIB1.a grow.o a - grow.o rm -f grow.[co] /usr/bin/get -r4 -t -p s.iget.c > iget.c 4.5 535 lines /src.cmd/bin.production/cc -c -O -I/src.cmd/unix.bin/usr/ucb.include -I/src.cmd/unix.bin/usr/include -Ts\,/src.cmd/unix.bin/lib/crt0.o -Tc\,/src.cmd/bin.production/ccom -Ta\,/bin/as9 -TC\,/src.cmd/unix.bin/lib/libc.a -Tq\,/src.cmd/bin.production/peep -TM\,/src.cmd/unix.bin/lib/libm.a -DOSDEBUG -DSOCKET iget.c C - Copyright (c) 1987 Ridge Computers v3.0 iget.c: ar rv LIB1.a iget.o a - iget.o rm -f iget.[co] /usr/bin/get -r4 -t -p s.intr.c > intr.c 4.4 18 lines /src.cmd/bin.production/cc -c -O -I/src.cmd/unix.bin/usr/ucb.include -I/src.cmd/unix.bin/usr/include -Ts\,/src.cmd/unix.bin/lib/crt0.o -Tc\,/src.cmd/bin.production/ccom -Ta\,/bin/as9 -TC\,/src.cmd/unix.bin/lib/libc.a -Tq\,/src.cmd/bin.production/peep -TM\,/src.cmd/unix.bin/lib/libm.a -DOSDEBUG -DSOCKET intr.c C - Copyright (c) 1987 Ridge Computers v3.0 intr.c: ar rv LIB1.a intr.o a - intr.o rm -f intr.[co] /usr/bin/get -r4 -t -p s.ipc.c > ipc.c 4.4 130 lines /src.cmd/bin.production/cc -c -O -I/src.cmd/unix.bin/usr/ucb.include -I/src.cmd/unix.bin/usr/include -Ts\,/src.cmd/unix.bin/lib/crt0.o -Tc\,/src.cmd/bin.production/ccom -Ta\,/bin/as9 -TC\,/src.cmd/unix.bin/lib/libc.a -Tq\,/src.cmd/bin.production/peep -TM\,/src.cmd/unix.bin/lib/libm.a -DOSDEBUG -DSOCKET ipc.c C - Copyright (c) 1987 Ridge Computers v3.0 ipc.c: ar rv LIB1.a ipc.o a - ipc.o rm -f ipc.[co] /usr/bin/get -r4 -t -p s.lock.c > lock.c 4.3 130 lines /src.cmd/bin.production/cc -c -O -I/src.cmd/unix.bin/usr/ucb.include -I/src.cmd/unix.bin/usr/include -Ts\,/src.cmd/unix.bin/lib/crt0.o -Tc\,/src.cmd/bin.production/ccom -Ta\,/bin/as9 -TC\,/src.cmd/unix.bin/lib/libc.a -Tq\,/src.cmd/bin.production/peep -TM\,/src.cmd/unix.bin/lib/libm.a -DOSDEBUG -DSOCKET lock.c C - Copyright (c) 1987 Ridge Computers v3.0 lock.c: ar rv LIB1.a lock.o a - lock.o rm -f lock.[co] /usr/bin/get -r4 -t -p s.machdep.c > machdep.c 4.7 252 lines /src.cmd/bin.production/cc -c -O -I/src.cmd/unix.bin/usr/ucb.include -I/src.cmd/unix.bin/usr/include -Ts\,/src.cmd/unix.bin/lib/crt0.o -Tc\,/src.cmd/bin.production/ccom -Ta\,/bin/as9 -TC\,/src.cmd/unix.bin/lib/libc.a -Tq\,/src.cmd/bin.production/peep -TM\,/src.cmd/unix.bin/lib/libm.a -DOSDEBUG -DSOCKET machdep.c C - Copyright (c) 1987 Ridge Computers v3.0 machdep.c: ar rv LIB1.a machdep.o a - machdep.o rm -f machdep.[co] /usr/bin/get -r4 -t -p s.main.c > main.c 4.4 212 lines /src.cmd/bin.production/cc -c -O -I/src.cmd/unix.bin/usr/ucb.include -I/src.cmd/unix.bin/usr/include -Ts\,/src.cmd/unix.bin/lib/crt0.o -Tc\,/src.cmd/bin.production/ccom -Ta\,/bin/as9 -TC\,/src.cmd/unix.bin/lib/libc.a -Tq\,/src.cmd/bin.production/peep -TM\,/src.cmd/unix.bin/lib/libm.a -DOSDEBUG -DSOCKET main.c C - Copyright (c) 1987 Ridge Computers v3.0 main.c: ar rv LIB1.a main.o a - main.o rm -f main.[co] /usr/bin/get -r4 -t -p s.malloc.c > malloc.c 4.4 130 lines /src.cmd/bin.production/cc -c -O -I/src.cmd/unix.bin/usr/ucb.include -I/src.cmd/unix.bin/usr/include -Ts\,/src.cmd/unix.bin/lib/crt0.o -Tc\,/src.cmd/bin.production/ccom -Ta\,/bin/as9 -TC\,/src.cmd/unix.bin/lib/libc.a -Tq\,/src.cmd/bin.production/peep -TM\,/src.cmd/unix.bin/lib/libm.a -DOSDEBUG -DSOCKET malloc.c C - Copyright (c) 1987 Ridge Computers v3.0 malloc.c: ar rv LIB1.a malloc.o a - malloc.o rm -f malloc.[co] /usr/bin/get -r4 -t -p s.move.c > move.c 4.4 195 lines /src.cmd/bin.production/cc -c -O -I/src.cmd/unix.bin/usr/ucb.include -I/src.cmd/unix.bin/usr/include -Ts\,/src.cmd/unix.bin/lib/crt0.o -Tc\,/src.cmd/bin.production/ccom -Ta\,/bin/as9 -TC\,/src.cmd/unix.bin/lib/libc.a -Tq\,/src.cmd/bin.production/peep -TM\,/src.cmd/unix.bin/lib/libm.a -DOSDEBUG -DSOCKET move.c C - Copyright (c) 1987 Ridge Computers v3.0 move.c: ar rv LIB1.a move.o a - move.o rm -f move.[co] /usr/bin/get -r4 -t -p s.msg.c > msg.c 4.4 540 lines /src.cmd/bin.production/cc -c -O -I/src.cmd/unix.bin/usr/ucb.include -I/src.cmd/unix.bin/usr/include -Ts\,/src.cmd/unix.bin/lib/crt0.o -Tc\,/src.cmd/bin.production/ccom -Ta\,/bin/as9 -TC\,/src.cmd/unix.bin/lib/libc.a -Tq\,/src.cmd/bin.production/peep -TM\,/src.cmd/unix.bin/lib/libm.a -DOSDEBUG -DSOCKET msg.c C - Copyright (c) 1987 Ridge Computers v3.0 msg.c: ar rv LIB1.a msg.o a - msg.o rm -f msg.[co] /usr/bin/get -r4 -t -p s.nami.c > nami.c 4.3 224 lines /src.cmd/bin.production/cc -c -O -I/src.cmd/unix.bin/usr/ucb.include -I/src.cmd/unix.bin/usr/include -Ts\,/src.cmd/unix.bin/lib/crt0.o -Tc\,/src.cmd/bin.production/ccom -Ta\,/bin/as9 -TC\,/src.cmd/unix.bin/lib/libc.a -Tq\,/src.cmd/bin.production/peep -TM\,/src.cmd/unix.bin/lib/libm.a -DOSDEBUG -DSOCKET nami.c C - Copyright (c) 1987 Ridge Computers v3.0 nami.c: ar rv LIB1.a nami.o a - nami.o rm -f nami.[co] /usr/bin/get -r4 -t -p s.page.c > page.c 4.5 909 lines /src.cmd/bin.production/cc -c -O -I/src.cmd/unix.bin/usr/ucb.include -I/src.cmd/unix.bin/usr/include -Ts\,/src.cmd/unix.bin/lib/crt0.o -Tc\,/src.cmd/bin.production/ccom -Ta\,/bin/as9 -TC\,/src.cmd/unix.bin/lib/libc.a -Tq\,/src.cmd/bin.production/peep -TM\,/src.cmd/unix.bin/lib/libm.a -DOSDEBUG -DSOCKET page.c C - Copyright (c) 1987 Ridge Computers v3.0 page.c: ar rv LIB1.a page.o a - page.o rm -f page.[co] /usr/bin/get -r4 -t -p s.pgtalloc.c > pgtalloc.c 4.4 473 lines /src.cmd/bin.production/cc -c -O -I/src.cmd/unix.bin/usr/ucb.include -I/src.cmd/unix.bin/usr/include -Ts\,/src.cmd/unix.bin/lib/crt0.o -Tc\,/src.cmd/bin.production/ccom -Ta\,/bin/as9 -TC\,/src.cmd/unix.bin/lib/libc.a -Tq\,/src.cmd/bin.production/peep -TM\,/src.cmd/unix.bin/lib/libm.a -DOSDEBUG -DSOCKET pgtalloc.c C - Copyright (c) 1987 Ridge Computers v3.0 pgtalloc.c: ar rv LIB1.a pgtalloc.o a - pgtalloc.o rm -f pgtalloc.[co] /usr/bin/get -r4 -t -p s.physio.c > physio.c 4.4 297 lines /src.cmd/bin.production/cc -c -O -I/src.cmd/unix.bin/usr/ucb.include -I/src.cmd/unix.bin/usr/include -Ts\,/src.cmd/unix.bin/lib/crt0.o -Tc\,/src.cmd/bin.production/ccom -Ta\,/bin/as9 -TC\,/src.cmd/unix.bin/lib/libc.a -Tq\,/src.cmd/bin.production/peep -TM\,/src.cmd/unix.bin/lib/libm.a -DOSDEBUG -DSOCKET physio.c C - Copyright (c) 1987 Ridge Computers v3.0 physio.c: ar rv LIB1.a physio.o a - physio.o rm -f physio.[co] /usr/bin/get -r4 -t -p s.pipe.c > pipe.c 4.4 155 lines /src.cmd/bin.production/cc -c -O -I/src.cmd/unix.bin/usr/ucb.include -I/src.cmd/unix.bin/usr/include -Ts\,/src.cmd/unix.bin/lib/crt0.o -Tc\,/src.cmd/bin.production/ccom -Ta\,/bin/as9 -TC\,/src.cmd/unix.bin/lib/libc.a -Tq\,/src.cmd/bin.production/peep -TM\,/src.cmd/unix.bin/lib/libm.a -DOSDEBUG -DSOCKET pipe.c C - Copyright (c) 1987 Ridge Computers v3.0 pipe.c: ar rv LIB1.a pipe.o a - pipe.o rm -f pipe.[co] /usr/bin/get -r4 -t -p s.prf.c > prf.c 4.5 227 lines /src.cmd/bin.production/cc -c -O -I/src.cmd/unix.bin/usr/ucb.include -I/src.cmd/unix.bin/usr/include -Ts\,/src.cmd/unix.bin/lib/crt0.o -Tc\,/src.cmd/bin.production/ccom -Ta\,/bin/as9 -TC\,/src.cmd/unix.bin/lib/libc.a -Tq\,/src.cmd/bin.production/peep -TM\,/src.cmd/unix.bin/lib/libm.a -DOSDEBUG -DSOCKET prf.c C - Copyright (c) 1987 Ridge Computers v3.0 prf.c: ar rv LIB1.a prf.o a - prf.o rm -f prf.[co] /usr/bin/get -r4 -t -p s.probe.c > probe.c 4.4 118 lines /src.cmd/bin.production/cc -c -O -I/src.cmd/unix.bin/usr/ucb.include -I/src.cmd/unix.bin/usr/include -Ts\,/src.cmd/unix.bin/lib/crt0.o -Tc\,/src.cmd/bin.production/ccom -Ta\,/bin/as9 -TC\,/src.cmd/unix.bin/lib/libc.a -Tq\,/src.cmd/bin.production/peep -TM\,/src.cmd/unix.bin/lib/libm.a -DOSDEBUG -DSOCKET probe.c C - Copyright (c) 1987 Ridge Computers v3.0 probe.c: ar rv LIB1.a probe.o a - probe.o rm -f probe.[co] /usr/bin/get -r4 -t -p s.ptrace.c > ptrace.c 4.4 282 lines /src.cmd/bin.production/cc -c -O -I/src.cmd/unix.bin/usr/ucb.include -I/src.cmd/unix.bin/usr/include -Ts\,/src.cmd/unix.bin/lib/crt0.o -Tc\,/src.cmd/bin.production/ccom -Ta\,/bin/as9 -TC\,/src.cmd/unix.bin/lib/libc.a -Tq\,/src.cmd/bin.production/peep -TM\,/src.cmd/unix.bin/lib/libm.a -DOSDEBUG -DSOCKET ptrace.c C - Copyright (c) 1987 Ridge Computers v3.0 ptrace.c: ar rv LIB1.a ptrace.o a - ptrace.o rm -f ptrace.[co] /usr/bin/get -r4 -t -p s.rdwri.c > rdwri.c 4.4 242 lines /src.cmd/bin.production/cc -c -O -I/src.cmd/unix.bin/usr/ucb.include -I/src.cmd/unix.bin/usr/include -Ts\,/src.cmd/unix.bin/lib/crt0.o -Tc\,/src.cmd/bin.production/ccom -Ta\,/bin/as9 -TC\,/src.cmd/unix.bin/lib/libc.a -Tq\,/src.cmd/bin.production/peep -TM\,/src.cmd/unix.bin/lib/libm.a -DOSDEBUG -DSOCKET rdwri.c C - Copyright (c) 1987 Ridge Computers v3.0 rdwri.c: ar rv LIB1.a rdwri.o a - rdwri.o rm -f rdwri.[co] /usr/bin/get -r4 -t -p s.region.c > region.c 4.5 1466 lines /src.cmd/bin.production/cc -c -O -I/src.cmd/unix.bin/usr/ucb.include -I/src.cmd/unix.bin/usr/include -Ts\,/src.cmd/unix.bin/lib/crt0.o -Tc\,/src.cmd/bin.production/ccom -Ta\,/bin/as9 -TC\,/src.cmd/unix.bin/lib/libc.a -Tq\,/src.cmd/bin.production/peep -TM\,/src.cmd/unix.bin/lib/libm.a -DOSDEBUG -DSOCKET region.c C - Copyright (c) 1987 Ridge Computers v3.0 region.c: ar rv LIB1.a region.o a - region.o rm -f region.[co] /usr/bin/get -r4 -t -p s.sched.c > sched.c 4.5 223 lines /src.cmd/bin.production/cc -c -O -I/src.cmd/unix.bin/usr/ucb.include -I/src.cmd/unix.bin/usr/include -Ts\,/src.cmd/unix.bin/lib/crt0.o -Tc\,/src.cmd/bin.production/ccom -Ta\,/bin/as9 -TC\,/src.cmd/unix.bin/lib/libc.a -Tq\,/src.cmd/bin.production/peep -TM\,/src.cmd/unix.bin/lib/libm.a -DOSDEBUG -DSOCKET sched.c C - Copyright (c) 1987 Ridge Computers v3.0 sched.c: ar rv LIB1.a sched.o a - sched.o rm -f sched.[co] /usr/bin/get -r4 -t -p s.sem.c > sem.c 4.4 764 lines /src.cmd/bin.production/cc -c -O -I/src.cmd/unix.bin/usr/ucb.include -I/src.cmd/unix.bin/usr/include -Ts\,/src.cmd/unix.bin/lib/crt0.o -Tc\,/src.cmd/bin.production/ccom -Ta\,/bin/as9 -TC\,/src.cmd/unix.bin/lib/libc.a -Tq\,/src.cmd/bin.production/peep -TM\,/src.cmd/unix.bin/lib/libm.a -DOSDEBUG -DSOCKET sem.c C - Copyright (c) 1987 Ridge Computers v3.0 sem.c: ar rv LIB1.a sem.o a - sem.o rm -f sem.[co] /usr/bin/get -r4 -t -p s.shm.c > shm.c 4.4 374 lines /src.cmd/bin.production/cc -c -O -I/src.cmd/unix.bin/usr/ucb.include -I/src.cmd/unix.bin/usr/include -Ts\,/src.cmd/unix.bin/lib/crt0.o -Tc\,/src.cmd/bin.production/ccom -Ta\,/bin/as9 -TC\,/src.cmd/unix.bin/lib/libc.a -Tq\,/src.cmd/bin.production/peep -TM\,/src.cmd/unix.bin/lib/libm.a -DOSDEBUG -DSOCKET shm.c C - Copyright (c) 1987 Ridge Computers v3.0 shm.c: ar rv LIB1.a shm.o a - shm.o rm -f shm.[co] /usr/bin/get -r4 -t -p s.sig.c > sig.c 4.5 215 lines /src.cmd/bin.production/cc -c -O -I/src.cmd/unix.bin/usr/ucb.include -I/src.cmd/unix.bin/usr/include -Ts\,/src.cmd/unix.bin/lib/crt0.o -Tc\,/src.cmd/bin.production/ccom -Ta\,/bin/as9 -TC\,/src.cmd/unix.bin/lib/libc.a -Tq\,/src.cmd/bin.production/peep -TM\,/src.cmd/unix.bin/lib/libm.a -DOSDEBUG -DSOCKET sig.c C - Copyright (c) 1987 Ridge Computers v3.0 sig.c: ar rv LIB1.a sig.o a - sig.o rm -f sig.[co] /usr/bin/get -r4 -t -p s.slp.c > slp.c 4.4 221 lines /src.cmd/bin.production/cc -c -O -I/src.cmd/unix.bin/usr/ucb.include -I/src.cmd/unix.bin/usr/include -Ts\,/src.cmd/unix.bin/lib/crt0.o -Tc\,/src.cmd/bin.production/ccom -Ta\,/bin/as9 -TC\,/src.cmd/unix.bin/lib/libc.a -Tq\,/src.cmd/bin.production/peep -TM\,/src.cmd/unix.bin/lib/libm.a -DOSDEBUG -DSOCKET slp.c C - Copyright (c) 1987 Ridge Computers v3.0 slp.c: ar rv LIB1.a slp.o a - slp.o rm -f slp.[co] /usr/bin/get -r4 -t -p s.startup.c > startup.c 4.5 368 lines /src.cmd/bin.production/cc -c -O -I/src.cmd/unix.bin/usr/ucb.include -I/src.cmd/unix.bin/usr/include -Ts\,/src.cmd/unix.bin/lib/crt0.o -Tc\,/src.cmd/bin.production/ccom -Ta\,/bin/as9 -TC\,/src.cmd/unix.bin/lib/libc.a -Tq\,/src.cmd/bin.production/peep -TM\,/src.cmd/unix.bin/lib/libm.a -DOSDEBUG -DSOCKET startup.c C - Copyright (c) 1987 Ridge Computers v3.0 startup.c: ar rv LIB1.a startup.o a - startup.o rm -f startup.[co] /usr/bin/get -r4 -t -p s.subr.c > subr.c 4.4 187 lines /src.cmd/bin.production/cc -c -O -I/src.cmd/unix.bin/usr/ucb.include -I/src.cmd/unix.bin/usr/include -Ts\,/src.cmd/unix.bin/lib/crt0.o -Tc\,/src.cmd/bin.production/ccom -Ta\,/bin/as9 -TC\,/src.cmd/unix.bin/lib/libc.a -Tq\,/src.cmd/bin.production/peep -TM\,/src.cmd/unix.bin/lib/libm.a -DOSDEBUG -DSOCKET subr.c C - Copyright (c) 1987 Ridge Computers v3.0 subr.c: ar rv LIB1.a subr.o a - subr.o rm -f subr.[co] /usr/bin/get -r4 -t -p s.swapalloc.c > swapalloc.c 4.4 521 lines /src.cmd/bin.production/cc -c -O -I/src.cmd/unix.bin/usr/ucb.include -I/src.cmd/unix.bin/usr/include -Ts\,/src.cmd/unix.bin/lib/crt0.o -Tc\,/src.cmd/bin.production/ccom -Ta\,/bin/as9 -TC\,/src.cmd/unix.bin/lib/libc.a -Tq\,/src.cmd/bin.production/peep -TM\,/src.cmd/unix.bin/lib/libm.a -DOSDEBUG -DSOCKET swapalloc.c C - Copyright (c) 1987 Ridge Computers v3.0 swapalloc.c: ar rv LIB1.a swapalloc.o a - swapalloc.o rm -f swapalloc.[co] /usr/bin/get -r4 -t -p s.swtch.c > swtch.c 4.4 111 lines /src.cmd/bin.production/cc -c -O -I/src.cmd/unix.bin/usr/ucb.include -I/src.cmd/unix.bin/usr/include -Ts\,/src.cmd/unix.bin/lib/crt0.o -Tc\,/src.cmd/bin.production/ccom -Ta\,/bin/as9 -TC\,/src.cmd/unix.bin/lib/libc.a -Tq\,/src.cmd/bin.production/peep -TM\,/src.cmd/unix.bin/lib/libm.a -DOSDEBUG -DSOCKET swtch.c C - Copyright (c) 1987 Ridge Computers v3.0 swtch.c: ar rv LIB1.a swtch.o a - swtch.o rm -f swtch.[co] /usr/bin/get -r4 -t -p s.sys1.c > sys1.c 4.4 95 lines /src.cmd/bin.production/cc -c -O -I/src.cmd/unix.bin/usr/ucb.include -I/src.cmd/unix.bin/usr/include -Ts\,/src.cmd/unix.bin/lib/crt0.o -Tc\,/src.cmd/bin.production/ccom -Ta\,/bin/as9 -TC\,/src.cmd/unix.bin/lib/libc.a -Tq\,/src.cmd/bin.production/peep -TM\,/src.cmd/unix.bin/lib/libm.a -DOSDEBUG -DSOCKET sys1.c C - Copyright (c) 1987 Ridge Computers v3.0 sys1.c: ar rv LIB1.a sys1.o a - sys1.o rm -f sys1.[co] /usr/bin/get -r4 -t -p s.sys2.c > sys2.c 4.4 470 lines /src.cmd/bin.production/cc -c -O -I/src.cmd/unix.bin/usr/ucb.include -I/src.cmd/unix.bin/usr/include -Ts\,/src.cmd/unix.bin/lib/crt0.o -Tc\,/src.cmd/bin.production/ccom -Ta\,/bin/as9 -TC\,/src.cmd/unix.bin/lib/libc.a -Tq\,/src.cmd/bin.production/peep -TM\,/src.cmd/unix.bin/lib/libm.a -DOSDEBUG -DSOCKET sys2.c C - Copyright (c) 1987 Ridge Computers v3.0 sys2.c: ar rv LIB1.a sys2.o a - sys2.o rm -f sys2.[co] /usr/bin/get -r4 -t -p s.sys3.c > sys3.c 4.5 603 lines /src.cmd/bin.production/cc -c -O -I/src.cmd/unix.bin/usr/ucb.include -I/src.cmd/unix.bin/usr/include -Ts\,/src.cmd/unix.bin/lib/crt0.o -Tc\,/src.cmd/bin.production/ccom -Ta\,/bin/as9 -TC\,/src.cmd/unix.bin/lib/libc.a -Tq\,/src.cmd/bin.production/peep -TM\,/src.cmd/unix.bin/lib/libm.a -DOSDEBUG -DSOCKET sys3.c C - Copyright (c) 1987 Ridge Computers v3.0 sys3.c: ar rv LIB1.a sys3.o a - sys3.o rm -f sys3.[co] /usr/bin/get -r4 -t -p s.sys4.c > sys4.c 4.6 793 lines /src.cmd/bin.production/cc -c -O -I/src.cmd/unix.bin/usr/ucb.include -I/src.cmd/unix.bin/usr/include -Ts\,/src.cmd/unix.bin/lib/crt0.o -Tc\,/src.cmd/bin.production/ccom -Ta\,/bin/as9 -TC\,/src.cmd/unix.bin/lib/libc.a -Tq\,/src.cmd/bin.production/peep -TM\,/src.cmd/unix.bin/lib/libm.a -DOSDEBUG -DSOCKET sys4.c C - Copyright (c) 1987 Ridge Computers v3.0 sys4.c: ar rv LIB1.a sys4.o a - sys4.o rm -f sys4.[co] /usr/bin/get -r4 -t -p s.syscall.c > syscall.c 4.4 115 lines /src.cmd/bin.product ion/cc -c -O -I/src.cmd/unix.bin/usr/ucb.include -I/src.cmd/unix.bin/usr/include -Ts\,/src.cmd/unix.bin/lib/crt0.o -Tc\,/src.cmd/bin.production/ccom -Ta\,/bin/as9 -TC\,/src.cmd/unix.bin/lib/libc.a -Tq\,/src.cmd/bin.production/peep -TM\,/src.cmd/unix.bin/lib/libm.a -DOSDEBUG -DSOCKET syscall.c C - Copyright (c) 1987 Ridge Computers v3.0 syscall.c: ar rv LIB1.a syscall.o a - syscall.o rm -f syscall.[co] /usr/bin/get -r4 -t -p s.sysent.c > sysent.c 4.7 231 lines /src.cmd/bin.production/cc -c -O -I/src.cmd/unix.bin/usr/ucb.include -I/src.cmd/unix.bin/usr/include -Ts\,/src.cmd/unix.bin/lib/crt0.o -Tc\,/src.cmd/bin.production/ccom -Ta\,/bin/as9 -TC\,/src.cmd/unix.bin/lib/libc.a -Tq\,/src.cmd/bin.production/peep -TM\,/src.cmd/unix.bin/lib/libm.a -DOSDEBUG -DSOCKET sysent.c C - Copyright (c) 1987 Ridge Computers v3.0 sysent.c: ar rv LIB1.a sysent.o a - sysent.o rm -f sysent.[co] /usr/bin/get -r4 -t -p s.sysridge.c > sysridge.c 4.6 128 lines /src.cmd/bin.production/cc -c -O -I/src.cmd/unix.bin/usr/ucb.include -I/src.cmd/unix.bin/usr/include -Ts\,/src.cmd/unix.bin/lib/crt0.o -Tc\,/src.cmd/bin.production/ccom -Ta\,/bin/as9 -TC\,/src.cmd/unix.bin/lib/libc.a -Tq\,/src.cmd/bin.production/peep -TM\,/src.cmd/unix.bin/lib/libm.a -DOSDEBUG -DSOCKET sysridge.c C - Copyright (c) 1987 Ridge Computers v3.0 sysridge.c: ar rv LIB1.a sysridge.o a - sysridge.o rm -f sysridge.[co] /usr/bin/get -r4 -t -p s.text.c > text.c 4.4 245 lines /src.cmd/bin.production/cc -c -O -I/src.cmd/unix.bin/usr/ucb.include -I/src.cmd/unix.bin/usr/include -Ts\,/src.cmd/unix.bin/lib/crt0.o -Tc\,/src.cmd/bin.production/ccom -Ta\,/bin/as9 -TC\,/src.cmd/unix.bin/lib/libc.a -Tq\,/src.cmd/bin.production/peep -TM\,/src.cmd/unix.bin/lib/libm.a -DOSDEBUG -DSOCKET text.c C - Copyright (c) 1987 Ridge Computers v3.0 text.c: ar rv LIB1.a text.o a - text.o rm -f text.[co] /usr/bin/get -r4 -t -p s.time.c > time.c 4.4 279 lines /src.cmd/bin.production/cc -c -O -I/src.cmd/unix.bin/usr/ucb.include -I/src.cmd/unix.bin/usr/include -Ts\,/src.cmd/unix.bin/lib/crt0.o -Tc\,/src.cmd/bin.production/ccom -Ta\,/bin/as9 -TC\,/src.cmd/unix.bin/lib/libc.a -Tq\,/src.cmd/bin.production/peep -TM\,/src.cmd/unix.bin/lib/libm.a -DOSDEBUG -DSOCKET time.c C - Copyright (c) 1987 Ridge Computers v3.0 time.c: ar rv LIB1.a time.o a - time.o rm -f time.[co] /usr/bin/get -r4 -t -p s.timeout.c > timeout.c 4.4 130 lines /src.cmd/bin.production/cc -c -O -I/src.cmd/unix.bin/usr/ucb.include -I/src.cmd/unix.bin/usr/include -Ts\,/src.cmd/unix.bin/lib/crt0.o -Tc\,/src.cmd/bin.production/ccom -Ta\,/bin/as9 -TC\,/src.cmd/unix.bin/lib/libc.a -Tq\,/src.cmd/bin.production/peep -TM\,/src.cmd/unix.bin/lib/libm.a -DOSDEBUG -DSOCKET timeout.c C - Copyright (c) 1987 Ridge Computers v3.0 timeout.c: ar rv LIB1.a timeout.o a - timeout.o rm -f timeout.[co] /usr/bin/get -r4 -t -p s.trap.c > trap.c 4.8 195 lines /src.cmd/bin.production/cc -c -O -I/src.cmd/unix.bin/usr/ucb.include -I/src.cmd/unix.bin/usr/include -Ts\,/src.cmd/unix.bin/lib/crt0.o -Tc\,/src.cmd/bin.production/ccom -Ta\,/bin/as9 -TC\,/src.cmd/unix.bin/lib/libc.a -Tq\,/src.cmd/bin.production/peep -TM\,/src.cmd/unix.bin/lib/libm.a -DOSDEBUG -DSOCKET trap.c C - Copyright (c) 1987 Ridge Computers v3.0 trap.c: ar rv LIB1.a trap.o a - trap.o rm -f trap.[co] /usr/bin/get -r4 -t -p s.utssys.c > utssys.c 4.4 79 lines /src.cmd/bin.production/cc -c -O -I/src.cmd/unix.bin/usr/ucb.include -I/src.cmd/unix.bin/usr/include -Ts\,/src.cmd/unix.bin/lib/crt0.o -Tc\,/src.cmd/bin.production/ccom -Ta\,/bin/as9 -TC\,/src.cmd/unix.bin/lib/libc.a -Tq\,/src.cmd/bin.production/peep -TM\,/src.cmd/unix.bin/lib/libm.a -DOSDEBUG -DSOCKET utssys.c C - Copyright (c) 1987 Ridge Computers v3.0 utssys.c: ar rv LIB1.a utssys.o a - utssys.o rm -f utssys.[co] /usr/bin/get -r4 -t -p s.bsdcompat.c > bsdcompat.c 4.6 151 lines /src.cmd/bin.production/cc -c -O -I/src.cmd/unix.bin/usr/ucb.include -I/src.cmd/unix.bin/usr/include -Ts\,/src.cmd/unix.bin/lib/crt0.o -Tc\,/src.cmd/bin.production/ccom -Ta\,/bin/as9 -TC\,/src.cmd/unix.bin/lib/libc.a -Tq\,/src.cmd/bin.production/peep -TM\,/src.cmd/unix.bin/lib/libm.a -DOSDEBUG -DSOCKET bsdcompat.c C - Copyright (c) 1987 Ridge Computers v3.0 bsdcompat.c: ar rv LIB1.a bsdcompat.o a - bsdcompat.o rm -f bsdcompat.[co] /usr/bin/get -r4 -t -p s.i_domain.c > i_domain.c 4.6 120 lines /src.cmd/bin.production/cc -c -O -I/src.cmd/unix.bin/usr/ucb.include -I/src.cmd/unix.bin/usr/include -Ts\,/src.cmd/unix.bin/lib/crt0.o -Tc\,/src.cmd/bin.production/ccom -Ta\,/bin/as9 -TC\,/src.cmd/unix.bin/lib/libc.a -Tq\,/src.cmd/bin.production/peep -TM\,/src.cmd/unix.bin/lib/libm.a -DOSDEBUG -DSOCKET i_domain.c C - Copyright (c) 1987 Ridge Computers v3.0 i_domain.c: ar rv LIB1.a i_domain.o a - i_domain.o rm -f i_domain.[co] /usr/bin/get -r4 -t -p s.i_mbuf.c > i_mbuf.c 4.7 364 lines /src.cmd/bin.production/cc -c -O -I/src.cmd/unix.bin/usr/ucb.include -I/src.cmd/unix.bin/usr/include -Ts\,/src.cmd/unix.bin/lib/crt0.o -Tc\,/src.cmd/bin.production/ccom -Ta\,/bin/as9 -TC\,/src.cmd/unix.bin/lib/libc.a -Tq\,/src.cmd/bin.production/peep -TM\,/src.cmd/unix.bin/lib/libm.a -DOSDEBUG -DSOCKET i_mbuf.c C - Copyright (c) 1987 Ridge Computers v3.0 i_mbuf.c: ar rv LIB1.a i_mbuf.o a - i_mbuf.o rm -f i_mbuf.[co] /usr/bin/get -r4 -t -p s.i_proto.c > i_proto.c 4.6 38 lines /src.cmd/bin.production/cc -c -O -I/src.cmd/unix.bin/usr/ucb.include -I/src.cmd/unix.bin/usr/include -Ts\,/src.cmd/unix.bin/lib/crt0.o -Tc\,/src.cmd/bin.production/ccom -Ta\,/bin/as9 -TC\,/src.cmd/unix.bin/lib/libc.a -Tq\,/src.cmd/bin.production/peep -TM\,/src.cmd/unix.bin/lib/libm.a -DOSDEBUG -DSOCKET i_proto.c C - Copyright (c) 1987 Ridge Computers v3.0 i_proto.c: ar rv LIB1.a i_proto.o a - i_proto.o rm -f i_proto.[co] /usr/bin/get -r4 -t -p s.i_socket.c > i_socket.c 4.7 731 lines /src.cmd/bin.production/cc -c -O -I/src.cmd/unix.bin/usr/ucb.include -I/src.cmd/unix.bin/usr/include -Ts\,/src.cmd/unix.bin/lib/crt0.o -Tc\,/src.cmd/bin.production/ccom -Ta\,/bin/as9 -TC\,/src.cmd/unix.bin/lib/libc.a -Tq\,/src.cmd/bin.production/peep -TM\,/src.cmd/unix.bin/lib/libm.a -DOSDEBUG -DSOCKET i_socket.c C - Copyright (c) 1987 Ridge Computers v3.0 i_socket.c: ar rv LIB1.a i_socket.o a - i_socket.o rm -f i_socket.[co] /usr/bin/get -r4 -t -p s.i_socket2.c > i_socket2.c 4.7 485 lines /src.cmd/bin.production/cc -c -O -I/src.cmd/unix.bin/usr/ucb.include -I/src.cmd/unix.bin/usr/include -Ts\,/src.cmd/unix.bin/lib/crt0.o -Tc\,/src.cmd/bin.production/ccom -Ta\,/bin/as9 -TC\,/src.cmd/unix.bin/lib/libc.a -Tq\,/src.cmd/bin.production/peep -TM\,/src.cmd/unix.bin/lib/libm.a -DOSDEBUG -DSOCKET i_socket2.c C - Copyright (c) 1987 Ridge Computers v3.0 i_socket2.c: ar rv LIB1.a i_socket2.o a - i_socket2.o rm -f i_socket2.[co] /usr/bin/get -r4 -t -p s.i_syscl.c > i_syscl.c 4.7 789 lines /src.cmd/bin.production/cc -c -O -I/src.cmd/unix.bin/usr/ucb.include -I/src.cmd/unix.bin/usr/include -Ts\,/src.cmd/unix.bin/lib/crt0.o -Tc\,/src.cmd/bin.production/ccom -Ta\,/bin/as9 -TC\,/src.cmd/unix.bin/lib/libc.a -Tq\,/src.cmd/bin.production/peep -TM\,/src.cmd/unix.bin/lib/libm.a -DOSDEBUG -DSOCKET i_syscl.c C - Copyright (c) 1987 Ridge Computers v3.0 i_syscl.c: ar rv LIB1.a i_syscl.o a - i_syscl.o rm -f i_syscl.[co] /usr/bin/get -r4 -t -p s.i_usrreq.c > i_usrreq.c 4.7 605 lines /src.cmd/bin.production/cc -c -O -I/src.cmd/unix.bin/usr/ucb.include -I/src.cmd/unix.bin/usr/include -Ts\,/src.cmd/unix.bin/lib/crt0.o -Tc\,/src.cmd/bin.production/ccom -Ta\,/bin/as9 -TC\,/src.cmd/unix.bin/lib/libc.a -Tq\,/src.cmd/bin.production/peep -TM\,/src.cmd/unix.bin/lib/libm.a -DOSDEBUG -DSOCKET i_usrreq.c C - Copyright (c) 1987 Ridge Computers v3.0 i_usrreq.c: ar rv LIB1.a i_usrreq.o a - i_usrreq.o rm -f i_usrreq.[co] /usr/bin/get -r4 -t -p s.sys_socket.c > sys_socket.c 4.6 135 lines /src.cmd/bin.production/cc -c -O -I/src.cmd/unix.bin/usr/ucb.include -I/src.cmd/unix.bin/usr/include -Ts\,/src.cmd/unix.bin/lib/crt0.o -Tc\,/src.cmd/bin.production/ccom -Ta\,/bin/as9 -TC\,/src.cmd/unix.bin/lib/libc.a -Tq\,/src.cmd/bin.production/peep -TM\,/src.cmd/unix.bin/lib/libm.a -DOSDEBUG -DSOCKET sys_socket.c C - Copyright (c) 1987 Ridge Computers v3.0 sys_socket.c: ar rv LIB1.a sys_socket.o a - sys_socket.o rm -f sys_socket.[co] cd io/; /bin/make -b all + /usr/bin/get -r4 -t s.Makefile 4.14 458 lines /usr/bin/get -r4 -t -p s.clist.c > clist.c 4.4 225 lines /src.cmd/bin.production/cc -c -O -I/src.cmd/unix.bin/usr/ucb.include -I/src.cmd/unix.bin/usr/include -Ts\,/src.cmd/unix.bin/lib/crt0.o -Tc\,/src.cmd/bin.production/ccom -Ta\,/bin/as9 -TC\,/src.cmd/unix.bin/lib/libc.a -Tq\,/src.cmd/bin.production/peep -TM\,/src.cmd/unix.bin/lib/libm.a -DOSDEBUG -DBSD clist.c C - Copyright (c) 1987 Ridge Computers v3.0 clist.c: ar rv LIB2.a clist.o ar: creating LIB2.a a - clist.o rm -f clist.[co] /usr/bin/get -r4 -t -p s.err.c > err.c 4.4 55 lines /src.cmd/bin.production/cc -c -O -I/src.cmd/unix.bin/usr/ucb.include -I/src.cmd/unix.bin/usr/include -Ts\,/src.cmd/unix.bin/lib/crt0.o -Tc\,/src.cmd/bin.production/ccom -Ta\,/bin/as9 -TC\,/src.cmd/unix.bin/lib/libc.a -Tq\,/src.cmd/bin.production/peep -TM\,/src.cmd/unix.bin/lib/libm.a -DOSDEBUG -DBSD err.c C - Copyright (c) 1987 Ridge Computers v3.0 err.c: ar rv LIB2.a err.o a - err.o rm -f err.[co] /usr/bin/get -r4 -t -p s.fpal.c > fpal.c 4.4 1036 lines /src.cmd/bin.production/cc -c -O -I/src.cmd/unix.bin/usr/ucb.include -I/src.cmd/unix.bin/usr/include -Ts\,/src.cmd/unix.bin/lib/crt0.o -Tc\,/src.cmd/bin.production/ccom -Ta\,/bin/as9 -TC\,/src.cmd/unix.bin/lib/libc.a -Tq\,/src.cmd/bin.production/peep -TM\,/src.cmd/unix.bin/lib/libm.a -DOSDEBUG -DBSD fpal.c C - Copyright (c) 1987 Ridge Computers v3.0 fpal.c: ar rv LIB2.a fpal.o a - fpal.o rm -f fpal.[co] /usr/bin/get -r4 -t -p s.fplp.c > fplp.c 4.4 414 lines /src.cmd/bin.production/cc -c -O -I/src.cmd/unix.bin/usr/ucb.include -I/src.cmd/unix.bin/usr/include -Ts\,/src.cmd/unix.bin/lib/crt0.o -Tc\,/src.cmd/bin.production/ccom -Ta\,/bin/as9 -TC\,/src.cmd/unix.bin/lib/libc.a -Tq\,/src.cmd/bin.production/peep -TM\,/src.cmd/unix.bin/lib/libm.a -DOSDEBUG -DBSD fplp.c C - Copyright (c) 1987 Ridge Computers v3.0 fplp.c: ar rv LIB2.a fplp.o a - fplp.o rm -f fplp.[co] /usr/bin/get -r4 -t -p s.hwdiag.c > hwdiag.c 4.7 125 lines /src.cmd/bin.production/cc -c -O -I/src.cmd/unix.bin/usr/ucb.include -I/src.cmd/unix.bin/usr/include -Ts\,/src.cmd/unix.bin/lib/crt0.o -Tc\,/src.cmd/bin.production/ccom -Ta\,/bin/as9 -TC\,/src.cmd/unix.bin/lib/libc.a -Tq\,/src.cmd/bin.production/peep -TM\,/src.cmd/unix.bin/lib/libm.a -DOSDEBUG -DBSD hwdiag.c C - Copyright (c) 1987 Ridge Computers v3.0 hwdiag.c: ar rv LIB2.a hwdiag.o a - hwdiag.o rm -f hwdiag.[co] /usr/bin/get -r4 -t -p s.iomachdep.c > iomachdep.c 4.5 151 lines /src.cmd/bin.production/cc -c -O -I/src.cmd/unix.bin/usr/ucb.include -I/src.cmd/unix.bin/usr/include -Ts\,/src.cmd/unix.bin/lib/crt0.o -Tc\,/src.cmd/bin.production/ccom -Ta\,/bin/as9 -TC\,/src.cmd/unix.bin/lib/libc.a -Tq\,/src.cmd/bin.production/peep -TM\,/src.cmd/unix.bin/lib/libm.a -DOSDEBUG -DBSD iomachdep.c C - Copyright (c) 1987 Ridge Computers v3.0 iomachdep.c: ar rv LIB2.a iomachdep.o a - iomachdep.o rm -f iomachdep.[co] /usr/bin/get -r4 -t -p s.mas.c > mas.c 4.4 2328 lines /src.cmd/bin.production/cc -c -O -I/src.cmd/unix.bin/usr/ucb.include -I/src.cmd/unix.bin/usr/include -Ts\,/src.cmd/unix.bin/lib/crt0.o -Tc\,/src.cmd/bin.production/ccom -Ta\,/bin/as9 -TC\,/src.cmd/unix.bin/lib/libc.a -Tq\,/src.cmd/bin.production/peep -TM\,/src.cmd/unix.bin/lib/libm.a -DOSDEBUG -DBSD mas.c C - Copyright (c) 1987 Ridge Computers v3.0 mas.c: ar rv LIB2.a mas.o a - mas.o rm -f mas.[co] /usr/bin/get -r4 -t -p s.me.c > me.c 4.4 665 lines /src.cmd/bin.production/cc -c -O -I/src.cmd/unix.bin/usr/ucb.include -I/src.cmd/unix.bin/usr/include -Ts\,/src.cmd/unix.bin/lib/crt0.o -Tc\,/src.cmd/bin.production/ccom -Ta\,/bin/as9 -TC\,/src.cmd/unix.bin/lib/libc.a -Tq\,/src.cmd/bin.production/peep -TM\,/src.cmd/unix.bin/lib/libm.a -DOSDEBUG -DBSD me.c C - Copyright (c) 1987 Ridge Computers v3.0 me.c: ar rv LIB2.a me.o a - me.o rm -f me.[co] /usr/bin/get -r4 -t -p s.mem.c > mem.c 4.4 126 lines /src.cmd/bin.production/cc -c -O -I/src.cmd/unix.bin/usr/ucb.include -I/src.cmd/unix.bin/usr/include -Ts\,/src.cmd/unix.bin/lib/crt0.o -Tc\,/src.cmd/bin.production/ccom -Ta\,/bin/as9 -TC\,/src.cmd/unix.bin/lib/libc.a -Tq\,/src.cmd/bin.production/peep -TM\,/src.cmd/unix.bin/lib/libm.a -DOSDEBUG -DBSD mem.c C - Copyright (c) 1987 Ridge Computers v3.0 mem.c: ar rv LIB2.a mem.o a - mem.o rm -f mem.[co] /usr/bin/get -r4 -t -p s.mt.c > mt.c 4.5 886 lines /src.cmd/bin.production/cc -c -O -I/src.cmd/unix.bin/usr/ucb.include -I/src.cmd/unix.bin/usr/include -Ts\,/src.cmd/unix.bin/lib/crt0.o -Tc\,/src.cmd/bin.production/ccom -Ta\,/bin/as9 -TC\,/src.cmd/unix.bin/lib/libc.a -Tq\,/src.cmd/bin.production/peep -TM\,/src.cmd/unix.bin/lib/libm.a -DOSDEBUG -DBSD mt.c C - Copyright (c) 1987 Ridge Computers v3.0 mt.c: ar rv LIB2.a mt.o a - mt.o rm -f mt.[co] /usr/bin/get -r4 -t -p s.partab.c > partab.c 4.3 20 lines /src.cmd/bin.production/cc -c -O -I/src.cmd/unix.bin/usr/ucb.include -I/src.cmd/unix.bin/usr/include -Ts\,/src.cmd/unix.bin/lib/crt0.o -Tc\,/src.cmd/bin.production/ccom -Ta\,/bin/as9 -TC\,/src.cmd/unix.bin/lib/libc.a -Tq\,/src.cmd/bin.production/peep -TM\,/src.cmd/unix.bin/lib/libm.a -DOSDEBUG -DBSD partab.c C - Copyright (c) 1987 Ridge Computers v3.0 partab.c: ar rv LIB2.a partab.o a - partab.o rm -f partab.[co] /usr/bin/get -r4 -t -p s.prof.c > prof.c 4.4 113 lines /src.cmd/bin.production/cc -c -O -I/src.cmd/unix.bin/usr/ucb.include -I/src.cmd/unix.bin/usr/include -Ts\,/src.cmd/unix.bin/lib/crt0.o -Tc\,/src.cmd/bin.production/ccom -Ta\,/bin/as9 -TC\,/src.cmd/unix.bin/lib/libc.a -Tq\,/src.cmd/bin.production/peep -TM\,/src.cmd/unix.bin/lib/libm.a -DOSDEBUG -DBSD prof.c C - Copyright (c) 1987 Ridge Computers v3.0 prof.c: ar rv LIB2.a prof.o a - prof.o rm -f prof.[co] /usr/bin/get -r4 -t -p s.pty.c > pty.c 4.5 596 lines /src.cmd/bin.production/cc -c -O -I/src.cmd/unix.bin/usr/ucb.include -I/src.cmd/unix.bin/usr/include -Ts\,/src.cmd/unix.bin/lib/crt0.o -Tc\,/src.cmd/bin.production/ccom -Ta\,/bin/as9 -TC\,/src.cmd/unix.bin/lib/libc.a -Tq\,/src.cmd/bin.production/peep -TM\,/src.cmd/unix.bin/lib/libm.a -DOSDEBUG -DBSD pty.c C - Copyright (c) 1987 Ridge Computers v3.0 pty.c: ar rv LIB2.a pty.o a - pty.o rm -f pty.[co] /usr/bin/get -r4 -t -p s.rawnet.c > rawnet.c 4.6 183 lines /src.cmd/bin.production/cc -c -O -I/src.cmd/unix.bin/usr/ucb.include -I/src.cmd/unix.bin/usr/include -Ts\,/src.cmd/unix.bin/lib/crt0.o -Tc\,/src.cmd/bin.production/ccom -Ta\,/bin/as9 -TC\,/src.cmd/unix.bin/lib/libc.a -Tq\,/src.cmd/bin.production/peep -TM\,/src.cmd/unix.bin/lib/libm.a -DOSDEBUG -DBSD rawnet.c C - Copyright (c) 1987 Ridge Computers v3.0 rawnet.c: ar rv LIB2.a rawnet.o a - rawnet.o rm -f rawnet.[co] /usr/bin/get -r4 -t -p s.smd.c > smd.c 4.7 877 lines /src.cmd/bin.production/cc -c -O -I/src.cmd/unix.bin/usr/ucb.include -I/src.cmd/unix.bin/usr/include -Ts\,/src.cmd/unix.bin/lib/crt0.o -Tc\,/src.cmd/bin.production/ccom -Ta\,/bin/as9 -TC\,/src.cmd/unix.bin/lib/libc.a -Tq\,/src.cmd/bin.production/peep -TM\,/src.cmd/unix.bin/lib/libm.a -DOSDEBUG -DBSD smd.c C - Copyright (c) 1987 Ridge Computers v3.0 smd.c: ar rv LIB2.a smd.o a - smd.o rm -f smd.[co] /usr/bin/get -r4 -t -p s.smlog.c > smlog.c 4.2 116 lines /src.cmd/bin.production/cc -c -O -I/src.cmd/unix.bin/usr/ucb.include -I/src.cmd/unix.bin/usr/include -Ts\,/src.cmd/unix.bin/lib/crt0.o -Tc\,/src.cmd/bin.production/ccom -Ta\,/bin/as9 -TC\,/src.cmd/unix.bin/lib/libc.a -Tq\,/src.cmd/bin.production/peep -TM\,/src.cmd/unix.bin/lib/libm.a -DOSDEBUG -DBSD smlog.c C - Copyright (c) 1987 Ridge Computers v3.0 smlog.c: ar rv LIB2.a smlog.o a - smlog.o rm -f smlog.[co] /usr/bin/get -r4 -t -p s.sxt.c > sxt.c 4.4 1041 lines /src.cmd/bin.production/cc -c -O -I/src.cmd/unix.bin/usr/ucb.include -I/src.cmd/unix.bin/usr/include -Ts\,/src.cmd/unix.bin/lib/crt0.o -Tc\,/src.cmd/bin.production/ccom -Ta\,/bin/as9 -TC\,/src.cmd/unix.bin/lib/libc.a -Tq\,/src.cmd/bin.production/peep -TM\,/src.cmd/unix.bin/lib/libm.a -DOSDEBUG -DBSD sxt.c C - Copyright (c) 1987 Ridge Computers v3.0 sxt.c: ar rv LIB2.a sxt.o a - sxt.o rm -f sxt.[co] /usr/bin/get -r4 -t -p s.sys.c > sys.c 4.4 57 lines /src.cmd/bin.production/cc -c -O -I/src.cmd/unix.bin/usr/ucb.include -I/src.cmd/unix.bin/usr/include -Ts\,/src.cmd/unix.bin/lib/crt0.o -Tc\,/src.cmd/bin.production/ccom -Ta\,/bin/as9 -TC\,/src.cmd/unix.bin/lib/libc.a -Tq\,/src.cmd/bin.production/peep -TM\,/src.cmd/unix.bin/lib/libm.a -DOSDEBUG -DBSD sys.c C - Copyright (c) 1987 Ridge Computers v3.0 sys.c: ar rv LIB2.a sys.o a - sys.o rm -f sys.[co] /usr/bin/get -r4 -t -p s.tt1.c > tt1.c 4.4 643 lines /src.cmd/bin.production/cc -c -O -I/src.cmd/unix.bin/usr/ucb.include -I/src.cmd/unix.bin/usr/include -Ts\,/src.cmd/unix.bin/lib/crt0.o -Tc\,/src.cmd/bin.production/ccom -Ta\,/bin/as9 -TC\,/src.cmd/unix.bin/lib/libc.a -Tq\,/src.cmd/bin.production/peep -TM\,/src.cmd/unix.bin/lib/libm.a -DOSDEBUG -DBSD tt1.c C - Copyright (c) 1987 Ridge Computers v3.0 tt1.c: ar rv LIB2.a tt1.o a - tt1.o rm -f tt1.[co] /usr/bin/get -r4 -t -p s.tty.c > tty.c 4.4 458 lines /src.cmd/bin.production/cc -c -O -I/src.cmd/unix.bin/usr/ucb.include -I/src.cmd/unix.bin/usr/include -Ts\,/src.cmd/unix.bin/lib/crt0.o -Tc\,/src.cmd/bin.production/ccom -Ta\,/bin/as9 -TC\,/src.cmd/unix.bin/lib/libc.a -Tq\,/src.cmd/bin.production/peep -TM\,/src.cmd/unix.bin/lib/libm.a -DOSDEBUG -DBSD tty.c C - Copyright (c) 1987 Ridge Computers v3.0 tty.c: ar rv LIB2.a tty.o a - tty.o rm -f tty.[co] /usr/bin/get -r4 -t -p s.tv.c > tv.c 4.3 99 lines /src.cmd/bin.production/cc -c -O -I/src.cmd/unix.bin/usr/ucb.include -I/src.cmd/unix.bin/usr/include -Ts\,/src.cmd/unix.bin/lib/crt0.o -Tc\,/src.cmd/bin.production/ccom -Ta\,/bin/as9 -TC\,/src.cmd/unix.bin/lib/libc.a -Tq\,/src.cmd/bin.production/peep -TM\,/src.cmd/unix.bin/lib/libm.a -DOSDEBUG -DBSD tv.c C - Copyright (c) 1987 Ridge Computers v3.0 tv.c: ar rv LIB2.a tv.o a - tv.o rm -f tv.[co] /usr/bin/get -r4 -t -p s.wbal.c > wbal.c 4.10 1438 lines /src.cmd/bin.production/cc -c -O -I/src.cmd/unix.bin/usr/ucb.include -I/src.cmd/unix.bin/usr/include -Ts\,/src.cmd/unix.bin/lib/crt0.o -Tc\,/src.cmd/bin.production/ccom -Ta\,/bin/as9 -TC\,/src.cmd/unix.bin/lib/libc.a -Tq\,/src.cmd/bin.production/peep -TM\,/src.cmd/unix.bin/lib/libm.a -DOSDEBUG -DBSD wbal.c C - Copyright (c) 1987 Ridge Computers v3.0 wbal.c: ar rv LIB2.a wbal.o a - wbal.o rm -f wbal.[co] /usr/bin/get -r4 -t -p s.wbct.c > wbct.c 4.6 1108 lines /src.cmd/bin.production/cc -c -O -I/src.cmd/unix.bin/usr/ucb.include -I/src.cmd/unix.bin/usr/include -Ts\,/src.cmd/unix.bin/lib/crt0.o -Tc\,/src.cmd/bin.production/ccom -Ta\,/bin/as9 -TC\,/src.cmd/unix.bin/lib/libc.a -Tq\,/src.cmd/bin.production/peep -TM\,/src.cmd/unix.bin/lib/libm.a -DOSDEBUG -DBSD wbct.c C - Copyright (c) 1987 Ridge Computers v3.0 wbct.c: ar rv LIB2.a wbct.o a - wbct.o rm -f wbct.[co] /usr/bin/get -r4 -t -p s.wblp.c > wblp.c 4.4 557 lines /src.cmd/bin.production/cc -c -O -I/src.cmd/unix.bin/usr/ucb.include -I/src.cmd/unix.bin/usr/include -Ts\,/src.cmd/unix.bin/lib/crt0.o -Tc\,/src.cmd/bin.production/ccom -Ta\,/bin/as9 -TC\,/src.cmd/unix.bin/lib/libc.a -Tq\,/src.cmd/bin.production/peep -TM\,/src.cmd/unix.bin/lib/libm.a -DOSDEBUG -DBSD wblp.c C - Copyright (c) 1987 Ridge Computers v3.0 wblp.c: ar rv LIB2.a wblp.o a - wblp.o rm -f wblp.[co] cd kdb/;/bin/make -b all + /usr/bin/get -r4 -t s.Makefile 4.3 28 lines /usr/bin/get -r4 -t -p s.kdbn.c > kdbn.c 4.4 2168 lines /src.cmd/bin.production/cc -c -O -I/src.cmd/unix.bin/usr/include -Ts\,/src.cmd/unix.bin/lib/crt0.o -Tc\,/src.cmd/bin.production/ccom -Ta\,/bin/as9 -TC\,/src.cmd/unix.bin/lib/libc.a -Tq\,/src.cmd/bin.production/peep -TM\,/src.cmd/unix.bin/lib/libm.a kdbn.c C - Copyright (c) 1987 Ridge Computers v3.0 kdbn.c: ar rv LIBKDB.a kdbn.o ar: creating LIBKDB.a a - kdbn.o rm -f kdbn.[co] /usr/bin/get -r4 -t -p s.askdb.s > askdb.s 4.5 320 lines /src.cmd/bin.production/as -I/src.cmd/unix.bin/usr/include -o askdb.o askdb.s ar rv LIBKDB.a askdb.o a - askdb.o rm -f askdb.[so] /usr/bin/get -r4 -t -p s.kdbccb.s > kdbccb.s 4.2 295 lines /src.cmd/bin.production/as -I/src.cmd/unix.bin/usr/include -o kdbccb.o kdbccb.s ar rv LIBKDB.a kdbccb.o a - kdbccb.o rm -f kdbccb.[so] cd net/;/bin/make -b all + /usr/bin/get -r4 -t s.Makefile 4.12 108 lines /usr/bin/get -r4 -t -p s.af.c > af.c 4.7 58 lines /src.cmd/bin.production/cc -c -O -I/src.cmd/unix.bin/usr/ucb.include -I/src.cmd/unix.bin/usr/include -Ts\,/src.cmd/unix.bin/lib/crt0.o -Tc\,/src.cmd/bin.production/ccom -Ta\,/bin/as9 -TC\,/src.cmd/unix.bin/lib/libc.a -Tq\,/src.cmd/bin.production/peep -TM\,/src.cmd/unix.bin/lib/libm.a -DSOCKET -DINET -Ddebug af.c C - Copyright (c) 1987 Ridge Computers v3.0 af.c: ar rv LIBN.a af.o ar: creating LIBN.a a - af.o rm -f af.[co] /usr/bin/get -r4 -t -p s.if.c > if.c 4.7 314 lines /src.cmd/bin.production/cc -c -O -I/src.cmd/unix.bin/usr/ucb.include -I/src.cmd/unix.bin/usr/include -Ts\,/src.cmd/unix.bin/lib/crt0.o -Tc\,/src.cmd/bin.production/ccom -Ta\,/bin/as9 -TC\,/src.cmd/unix.bin/lib/libc.a -Tq\,/src.cmd/bin.production/peep -TM\,/src.cmd/unix.bin/lib/libm.a -DSOCKET -DINET -Ddebug if.c C - Copyright (c) 1987 Ridge Computers v3.0 if.c: ar rv LIBN.a if.o a - if.o rm -f if.[co] /usr/bin/get -r4 -t -p s.raw_cb.c > raw_cb.c 4.7 162 lines /src.cmd/bin.production/cc -c -O -I/src.cmd/unix.bin/usr/ucb.include -I/src.cmd/unix.bin/usr/include -Ts\,/src.cmd/unix.bin/lib/crt0.o -Tc\,/src.cmd/bin.production/ccom -Ta\,/bin/as9 -TC\,/src.cmd/unix.bin/lib/libc.a -Tq\,/src.cmd/bin.production/peep -TM\,/src.cmd/unix.bin/lib/libm.a -DSOCKET -DINET -Ddebug raw_cb.c C - Copyright (c) 1987 Ridge Computers v3.0 raw_cb.c: ar rv LIBN.a raw_cb.o a - raw_cb.o rm -f raw_cb.[co] /usr/bin/get -r4 -t -p s.raw_usrreq.c > raw_usrreq.c 4.7 339 lines /src.cmd/bin.production/cc -c -O -I/src.cmd/unix.bin/usr/ucb.include -I/src.cmd/unix.bin/usr/include -Ts\,/src.cmd/unix.bin/lib/crt0.o -Tc\,/src.cmd/bin.production/ccom -Ta\,/bin/as9 -TC\,/src.cmd/unix.bin/lib/libc.a -Tq\,/src.cmd/bin.production/peep -TM\,/src.cmd/unix.bin/lib/libm.a -DSOCKET -DINET -Ddebug raw_usrreq.c C - Copyright (c) 1987 Ridge Computers v3.0 raw_usrreq.c: ar rv LIBN.a raw_usrreq.o a - raw_usrreq.o rm -f raw_usrreq.[co] /usr/bin/get -r4 -t -p s.route.c > route.c 4.7 311 lines /src.cmd/bin.production/cc -c -O -I/src.cmd/unix.bin/usr/ucb.include -I/src.cmd/unix.bin/usr/include -Ts\,/src.cmd/unix.bin/lib/crt0.o -Tc\,/src.cmd/bin.production/ccom -Ta\,/bin/as9 -TC\,/src.cmd/unix.bin/lib/libc.a -Tq\,/src.cmd/bin.production/peep -TM\,/src.cmd/unix.bin/lib/libm.a -DSOCKET -DINET -Ddebug route.c C - Copyright (c) 1987 Ridge Computers v3.0 route.c: ar rv LIBN.a route.o a - route.o rm -f route.[co] cd netinet/;/bin/make -b all + /usr/bin/get -r4 -t s.Makefile 4.12 210 lines /usr/bin/get -r4 -t -p s.if_loop.c > if_loop.c 4.7 129 lines /src.cmd/bin.production/cc -c -O -I/src.cmd/unix.bin/usr/ucb.include -I/src.cmd/unix.bin/usr/include -Ts\,/src.cmd/unix.bin/lib/crt0.o -Tc\,/src.cmd/bin.production/ccom -Ta\,/bin/as9 -TC\,/src.cmd/unix.bin/lib/libc.a -Tq\,/src.cmd/bin.production/peep -TM\,/src.cmd/unix.bin/lib/libm.a -DSOCKET -DINET -Ddebug -DSPS9 -DROSSE if_loop.c C - Copyright (c) 1987 Ridge Computers v3.0 if_loop.c: ar rv LIBIN.a if_loop.o ar: creating LIBIN.a a - if_loop.o rm -f if_loop.[co] /usr/bin/get -r4 -t -p s.in.c > in.c 4.7 103 lines /src.cmd/bin.production/cc -c -O -I/src.cmd/unix.bin/usr/ucb.include -I/src.cmd/unix.bin/usr/include -Ts\,/src.cmd/unix.bin/lib/crt0.o -Tc\,/src.cmd/bin.production/ccom -Ta\,/bin/as9 -TC\,/src.cmd/unix.bin/lib/libc.a -Tq\,/src.cmd/bin.production/peep -TM\,/src.cmd/unix.bin/lib/libm.a -DSOCKET -DINET -Ddebug -DSPS9 -DROSSE in.c C - Copyright (c) 1987 Ridge Computers v3.0 in.c: ar rv LIBIN.a in.o a - in.o rm -f in.[co] /usr/bin/get -r4 -t -p s.in_pcb.c > in_pcb.c 4.7 273 lines /src.cmd/bin.production/cc -c -O -I/src.cmd/unix.bin/usr/ucb.include -I/src.cmd/unix.bin/usr/include -Ts\,/src.cmd/unix.bin/lib/crt0.o -Tc\,/src.cmd/bin.production/ccom -Ta\,/bin/as9 -TC\,/src.cmd/unix.bin/lib/libc.a -Tq\,/src.cmd/bin.production/peep -TM\,/src.cmd/unix.bin/lib/libm.a -DSOCKET -DINET -Ddebug -DSPS9 -DROSSE in_pcb.c C - Copyright (c) 1987 Ridge Computers v3.0 in_pcb.c: ar rv LIBIN.a in_pcb.o a - in_pcb.o rm -f in_pcb.[co] /usr/bin/get -r4 -t -p s.in_proto.c > in_proto.c 4.7 94 lines /src.cmd/bin.production/cc -c -O -I/src.cmd/unix.bin/usr/ucb.include -I/src.cmd/unix.bin/usr/include -Ts\,/src.cmd/unix.bin/lib/crt0.o -Tc\,/src.cmd/bin.production/ccom -Ta\,/bin/as9 -TC\,/src.cmd/unix.bin/lib/libc.a -Tq\,/src.cmd/bin.production/peep -TM\,/src.cmd/unix.bin/lib/libm.a -DSOCKET -DINET -Ddebug -DSPS9 -DROSSE in_proto.c C - Copyright (c) 1987 Ridge Computers v3.0 in_proto.c: ar rv LIBIN.a in_proto.o a - in_proto.o rm -f in_proto.[co] /usr/bin/get -r4 -t -p s.ip_icmp.c > ip_icmp.c 4.7 311 lines /src.cmd/bin.production/cc -c -O -I/src.cmd/unix.bin/usr/ucb.include -I/src.cmd/unix.bin/usr/include -Ts\,/src.cmd/unix.bin/lib/crt0.o -Tc\,/src.cmd/bin.production/ccom -Ta\,/bin/as9 -TC\,/src.cmd/unix.bin/lib/libc.a -Tq\,/src.cmd/bin.production/peep -TM\,/src.cmd/unix.bin/lib/libm.a -DSOCKET -DINET -Ddebug -DSPS9 -DROSSE ip_icmp.c C - Copyright (c) 1987 Ridge Computers v3.0 ip_icmp.c: ar rv LIBIN.a ip_icmp.o a - ip_icmp.o rm -f ip_icmp.[co] /usr/bin/get -r4 -t -p s.ip_input.c > ip_input.c 4.7 689 lines /src.cmd/bin.production/cc -c -O -I/src.cmd/unix.bin/usr/ucb.include -I/src.cmd/unix.bin/usr/include -Ts\,/src.cmd/unix.bin/lib/crt0.o -Tc\,/src.cmd/bin.production/ccom -Ta\,/bin/as9 -TC\,/src.cmd/unix.bin/lib/libc.a -Tq\,/src.cmd/bin.production/peep -TM\,/src.cmd/unix.bin/lib/libm.a -DSOCKET -DINET -Ddebug -DSPS9 -DROSSE ip_input.c C - Copyright (c) 1987 Ridge Computers v3.0 ip_input.c: ar rv LIBIN.a ip_input.o a - ip_input.o rm -f ip_input.[co] /usr/bin/get -r4 -t -p s.ip_output.c > ip_output.c 4.7 226 lines /src.cmd/bin.production/cc -c -O -I/src.cmd/unix.bin/usr/ucb.include -I/src.cmd/unix.bin/usr/include -Ts\,/src.cmd/unix.bin/lib/crt0.o -Tc\,/src.cmd/bin.production/ccom -Ta\,/bin/as9 -TC\,/src.cmd/unix.bin/lib/libc.a -Tq\,/src.cmd/bin.production/peep -TM\,/src.cmd/unix.bin/lib/libm.a -DSOCKET -DINET -Ddebug -DSPS9 -DROSSE ip_output.c C - Copyright (c) 1987 Ridge Computers v3.0 ip_output.c: ar rv LIBIN.a ip_output.o a - ip_output.o rm -f ip_output.[co] /usr/bin/get -r4 -t -p s.raw_ip.c > raw_ip.c 4.7 97 lines /src.cmd/bin.production/cc -c -O -I/src.cmd/unix.bin/usr/ucb.include -I/src.cmd/unix.bin/usr/include -Ts\,/src.cmd/unix.bin/lib/crt0.o -Tc\,/src.cmd/bin.production/ccom -Ta\,/bin/as9 -TC\,/src.cmd/unix.bin/lib/libc.a -Tq\,/src.cmd/bin.production/peep -TM\,/src.cmd/unix.bin/lib/libm.a -DSOCKET -DINET -Ddebug -DSPS9 -DROSSE raw_ip.c C - Copyright (c) 1987 Ridge Computers v3.0 raw_ip.c: ar rv LIBIN.a raw_ip.o a - raw_ip.o rm -f raw_ip.[co] /usr/bin/get -r4 -t -p s.tcp_debug.c > tcp_debug.c 4.7 124 lines /src.cmd/bin.production/cc -c -O -I/src.cmd/unix.bin/usr/ucb.include -I/src.cmd/unix.bin/usr/include -Ts\,/src.cmd/unix.bin/lib/crt0.o -Tc\,/src.cmd/bin.production/ccom -Ta\,/bin/as9 -TC\,/src.cmd/unix.bin/lib/libc.a -Tq\,/src.cmd/bin.production/peep -TM\,/src.cmd/unix.bin/lib/libm.a -DSOCKET -DINET -Ddebug -DSPS9 -DROSSE tcp_debug.c C - Copyright (c) 1987 Ridge Computers v3.0 tcp_debug.c: ar rv LIBIN.a tcp_debug.o a - tcp_debug.o rm -f tcp_debug.[co] /usr/bin/get -r4 -t -p s.tcp_input.c > tcp_input.c 4.7 936 lines /src.cmd/bin.production/cc -c -O -I/src.cmd/unix.bin/usr/ucb.include -I/src.cmd/unix.bin/usr/include -Ts\,/src.cmd/unix.bin/lib/crt0.o -Tc\,/src.cmd/bin.production/ccom -Ta\,/bin/as9 -TC\,/src.cmd/unix.bin/lib/libc.a -Tq\,/src.cmd/bin.production/peep -TM\,/src.cmd/unix.bin/lib/libm.a -DSOCKET -DINET -Ddebug -DSPS9 -DROSSE tcp_input.c C - Copyright (c) 1987 Ridge Computers v3.0 tcp_input.c: ar rv LIBIN.a tcp_input.o a - tcp_input.o rm -f tcp_input.[co] /usr/bin/get -r4 -t -p s.tcp_output.c > tcp_output.c 4.8 343 lines /src.cmd/bin.production/cc -c -O -I/src.cmd/unix.bin/usr/ucb.include -I/src.cmd/unix.bin/usr/include -Ts\,/src.cmd/unix.bin/lib/crt0.o -Tc\,/src.cmd/bin.production/ccom -Ta\,/bin/as9 -TC\,/src.cmd/unix.bin/lib/libc.a -Tq\,/src.cmd/bin.production/peep -TM\,/src.cmd/unix.bin/lib/libm.a -DSOCKET -DINET -Ddebug -DSPS9 -DROSSE tcp_output.c C - Copyright (c) 1987 Ridge Computers v3.0 tcp_output.c: ar rv LIBIN.a tcp_output.o a - tcp_output.o rm -f tcp_output.[co] /usr/bin/get -r4 -t -p s.tcp_subr.c > tcp_subr.c 4.7 276 lines /src.cmd/bin.production/cc -c -O -I/src.cmd/unix.bin/usr/ucb.include -I/src.cmd/unix.bin/usr/include -Ts\,/src.cmd/unix.bin/lib/crt0.o -Tc\,/src.cmd/bin.production/ccom -Ta\,/bin/as9 -TC\,/src.cmd/unix.bin/lib/libc.a -Tq\,/src.cmd/bin.production/peep -TM\,/src.cmd/unix.bin/lib/libm.a -DSOCKET -DINET -Ddebug -DSPS9 -DROSSE tcp_subr.c C - Copyright (c) 1987 Ridge Computers v3.0 tcp_subr.c: ar rv LIBIN.a tcp_subr.o a - tcp_subr.o rm -f tcp_subr.[co] /usr/bin/get -r4 -t -p s.in_cksum.s > in_cksum.s 4.4 390 lines /src.cmd/bin.production/as -I/src.cmd/unix.bin/usr/include -DARGSINREGS -DLINK=r15 -o in_cksum.o in_cksum.s ar rv LIBIN.a in_cksum.o a - in_cksum.o rm -f in_cksum.[so] /usr/bin/get -r4 -t -p s.tcp_timer.c > tcp_timer.c 4.7 208 lines /src.cmd/bin.production/cc -c -O -I/src.cmd/unix.bin/usr/ucb.include -I/src.cmd/unix.bin/usr/include -Ts\,/src.cmd/unix.bin/lib/crt0.o -Tc\,/src.cmd/bin.production/ccom -Ta\,/bin/as9 -TC\,/src.cmd/unix.bin/lib/libc.a -Tq\,/src.cmd/bin.production/peep -TM\,/src.cmd/unix.bin/lib/libm.a -DSOCKET -DINET -Ddebug -DSPS9 -DROSSE tcp_timer.c C - Copyright (c) 1987 Ridge Computers v3.0 tcp_timer.c: ar rv LIBIN.a tcp_timer.o a - tcp_timer.o rm -f tcp_timer.[co] /usr/bin/get -r4 -t -p s.tcp_usrreq.c > tcp_usrreq.c 4.7 397 lines /src.cmd/bin.production/cc -c -O -I/src.cmd/unix.bin/usr/ucb.include -I/src.cmd/unix.bin/usr/include -Ts\,/src.cmd/unix.bin/lib/crt0.o -Tc\,/src.cmd/bin.production/ccom -Ta\,/bin/as9 -TC\,/src.cmd/unix.bin/lib/libc.a -Tq\,/src.cmd/bin.production/peep -TM\,/src.cmd/unix.bin/lib/libm.a -DSOCKET -DINET -Ddebug -DSPS9 -DROSSE tcp_usrreq.c C - Copyright (c) 1987 Ridge Computers v3.0 tcp_usrreq.c: ar rv LIBIN.a tcp_usrreq.o a - tcp_usrreq.o rm -f tcp_usrreq.[co] /usr/bin/get -r4 -t -p s.if_ether.c > if_ether.c 4.7 769 lines /src.cmd/bin.production/cc -c -O -I/src.cmd/unix.bin/usr/ucb.include -I/src.cmd/unix.bin/usr/include -Ts\,/src.cmd/unix.bin/lib/crt0.o -Tc\,/src.cmd/bin.production/ccom -Ta\,/bin/as9 -TC\,/src.cmd/unix.bin/lib/libc.a -Tq\,/src.cmd/bin.production/peep -TM\,/src.cmd/unix.bin/lib/libm.a -DSOCKET -DINET -Ddebug -DSPS9 -DROSSE if_ether.c C - Copyright (c) 1987 Ridge Computers v3.0 if_ether.c: ar rv LIBIN.a if_ether.o a - if_ether.o rm -f if_ether.[co] /usr/bin/get -r4 -t -p s.udp_usrreq.c > udp_usrreq.c 4.7 380 lines /src.cmd/bin.production/cc -c -O -I/src.cmd/unix.bin/usr/ucb.include -I/src.cmd/unix.bin/usr/include -Ts\,/src.cmd/unix.bin/lib/crt0.o -Tc\,/src.cmd/bin.production/ccom -Ta\,/bin/as9 -TC\,/src.cmd/unix.bin/lib/libc.a -Tq\,/src.cmd/bin.production/peep -TM\,/src.cmd/unix.bin/lib/libm.a -DSOCKET -DINET -Ddebug -DSPS9 -DROSSE udp_usrreq.c C - Copyright (c) 1987 Ridge Computers v3.0 udp_usrreq.c: ar rv LIBIN.a udp_usrreq.o a - udp_usrreq.o rm -f udp_usrreq.[co] cd wb/;/bin/make -b all + /usr/bin/get -r4 -t s.Makefile 4.10 44 lines /usr/bin/get -r4 -t -p s.wonder.h > wonder.h 4.3 72 lines /usr/bin/get -r4 -t -p s.lance.h > lance.h 4.2 308 lines /usr/bin/get -r4 -t -p s.trace.h > trace.h 4.4 25 lines /usr/bin/get -r4 -t -p s.wonder.c > wonder.c 4.8 2862 lines /src.cmd/bin.production/cc -c -O -I/src.cmd/unix.bin/usr/ucb.include -I/src.cmd/unix.bin/usr/include -Ts\,/src.cmd/unix.bin/lib/crt0.o -Tc\,/src.cmd/bin.production/ccom -Ta\,/bin/as9 -TC\,/src.cmd/unix.bin/lib/libc.a -Tq\,/src.cmd/bin.production/peep -TM\,/src.cmd/unix.bin/lib/libm.a -DKERNEL -Ddebug -DINET -DSPS9 wonder.c C - Copyright (c) 1987 Ridge Computers v3.0 wonder.c: ar rv LIBWB.a wonder.o ar: creating LIBWB.a a - wonder.o rm -f wonder.[co] /bin/make -b unix /usr/bin/get -r4 -t -p s.unix.ld > unix.ld 4.2 11 lines /usr/bin/get -r4 -t -p s.mk.field > mk.field 4.4 58 lines rm -f unix start.o ar x ml/LIB0.a start.o /bin/ld -N -o unix unix.ld -e _start start.o cf/conf.o cf/linesw.o ml/LIB0.a os/LIB1.a io/LIB2.a kdb/LIBKDB.a net/LIBN.a netinet/LIBIN.a wb/LIBWB.a ml/LIB0.a os/LIB1.a io/LIB2.a kdb/LIBKDB.a net/LIBN.a netinet/LIBIN.a wb/LIBWB.a chmod 544 unix rm -f start.o + /usr/bin/get -r4 -t s.Makefile 4.10 144 lines # move the header files over (this might be no-op if SPX==DESTDIR) # cd /src.cmd/unix.bin/usr/include/sys; ls | cpio -pdm /src.cmd/unix.bin/usr/include/sys # setup the ownership / protections of the include files chgrp bin /src.cmd/unix.bin/usr/include/sys/* chmod 444 /src.cmd/unix.bin/usr/include/sys/* chown bin /src.cmd/unix.bin/usr/include/sys/* # copy all of the libraries cd /src.cmd/unix.bin/sys ; rm -f ml/LIB0.a os/LIB1.a io/LIB2.a kdb/LIBKDB.a net/LIBN.a netinet/LIBIN.a wb/LIBWB.a ls ml/LIB0.a os/LIB1.a io/LIB2.a kdb/LIBKDB.a net/LIBN.a netinet/LIBIN.a wb/LIBWB.a | cpio -pdm /src.cmd/unix.bin/sys 1368 blocks cd /src.cmd/unix.bin/sys ; chgrp bin ml/LIB0.a os/LIB1.a io/LIB2.a kdb/LIBKDB.a net/LIBN.a netinet/LIBIN.a wb/LIBWB.a cd /src.cmd/unix.bin/sys ; chmod 444 ml/LIB0.a os/LIB1.a io/LIB2.a kdb/LIBKDB.a net/LIBN.a netinet/LIBIN.a wb/LIBWB.a cd /src.cmd/unix.bin/sys ; chown sys ml/LIB0.a os/LIB1.a io/LIB2.a kdb/LIBKDB.a net/LIBN.a netinet/LIBIN.a wb/LIBWB.a # move the configuration files over cd cf/ ; /bin/make -b install DESTDIR=/src.cmd/unix.bin/sys/cf/ + /usr/bin/get -r4 -t s.Makefile 4.13 62 lines /usr/bin/get -r4 -t -p s.conf.c > /src.cmd/unix.bin/sys/cf//conf.c 4.6 434 lines /usr/bin/get -r4 -t -p s.linesw.c > /src.cmd/unix.bin/sys/cf//linesw.c 4.4 44 lines /usr/bin/get -r4 -t -p s.mk.field | sed -e "s/CuReL.*/1.0/" > /src.cmd/unix.bin/sys/cf//Makefile 4.6 48 lines cp config.h /src.cmd/unix.bin/sys/cf/ # then, fix ownership, etc on all that was copied. cd /src.cmd/unix.bin/sys/cf/ ; chgrp bin conf.c linesw.c /src.cmd/unix.bin/sys/cf//Makefile cd /src.cmd/unix.bin/sys/cf/ ; chmod 444 conf.c linesw.c /src.cmd/unix.bin/sys/cf//Makefile cd /src.cmd/unix.bin/sys/cf/ ; chown sys conf.c linesw.c /src.cmd/unix.bin/sys/cf//Makefile # install the field makefile cp mk.field /src.cmd/unix.bin/sys/Makefile # install the field tape maker cp maketape /src.cmd/unix.bin/sys/maketape # install the loader instructions file cp unix.ld /src.cmd/unix.bin/sys # move the kernel itself over rm -f /src.cmd/unix.bin/unix ls unix | cpio -pdm /src.cmd/unix.bin 720 blocks chmod 544 /src.cmd/unix.bin/unix chgrp bin /src.cmd/unix.bin/unix chown root /src.cmd/unix.bin/unix + /usr/bin/get -r4 -t s.Makefile 4.10 144 lines # move the header files over (this might be no-op if SPX==DESTDIR) # cd /src.cmd/unix.bin/usr/include/sys; ls | cpio -pdm /src.cmd/unix.bin/usr/include/sys # setup the ownership / protections of the include files chgrp bin /src.cmd/unix.bin/usr/include/sys/* chmod 444 /src.cmd/unix.bin/usr/include/sys/* chown bin /src.cmd/unix.bin/usr/include/sys/* # copy all of the libraries cd /src.cmd/unix.bin/sys ; rm -f ml/LIB0.a os/LIB1.a io/LIB2.a kdb/LIBKDB.a net/LIBN.a netinet/LIBIN.a wb/LIBWB.a ls ml/LIB0.a os/LIB1.a io/LIB2.a kdb/LIBKDB.a net/LIBN.a netinet/LIBIN.a wb/LIBWB.a | cpio -pdm /src.cmd/unix.bin/sys 1368 blocks cd /src.cmd/unix.bin/sys ; chgrp bin ml/LIB0.a os/LIB1.a io/LIB2.a kdb/LIBKDB.a net/LIBN.a netinet/LIBIN.a wb/LIBWB.a cd /src.cmd/unix.bin/sys ; chmod 444 ml/LIB0.a os/LIB1.a io/LIB2.a kdb/LIBKDB.a net/LIBN.a netinet/LIBIN.a wb/LIBWB.a cd /src.cmd/unix.bin/sys ; chown sys ml/LIB0.a os/LIB1.a io/LIB2.a kdb/LIBKDB.a net/LIBN.a netinet/LIBIN.a wb/LIBWB.a # move the configuration files over cd cf/ ; /bin/make -b install DESTDIR=/src.cmd/unix.bin/sys/cf/ + /usr/bin/get -r4 -t s.Makefile 4.13 62 lines /usr/bin/get -r4 -t -p s.conf.c > /src.cmd/unix.bin/sys/cf//conf.c 4.6 434 lines /usr/bin/get -r4 -t -p s.linesw.c > /src.cmd/unix.bin/sys/cf//linesw.c 4.4 44 lines /usr/bin/get -r4 -t -p s.mk.field | sed -e "s/CuReL.*/1.0/" > /src.cmd/unix.bin/sys/cf//Makefile 4.6 48 lines cp config.h /src.cmd/unix.bin/sys/cf/ # then, fix ownership, etc on all that was copied. cd /src.cmd/unix.bin/sys/cf/ ; chgrp bin conf.c linesw.c /src.cmd/unix.bin/sys/cf//Makefile cd /src.cmd/unix.bin/sys/cf/ ; chmod 444 conf.c linesw.c /src.cmd/unix.bin/sys/cf//Makefile cd /src.cmd/unix.bin/sys/cf/ ; chown sys conf.c linesw.c /src.cmd/unix.bin/sys/cf//Makefile # install the field makefile cp mk.field /src.cmd/unix.bin/sys/Makefile # install the field tape maker cp maketape /src.cmd/unix.bin/sys/maketape # install the loader instructions file cp unix.ld /src.cmd/unix.bin/sys # move the kernel itself over rm -f /src.cmd/unix.bin/unix ls unix | cpio -pdm /src.cmd/unix.bin 720 blocks chmod 544 /src.cmd/unix.bin/unix chgrp bin /src.cmd/unix.bin/unix chown root /src.cmd/unix.bin/unix /* " @(#)unix.ld 4.2 87/04/22 " */ MEMORY { valid : org = 0x80042000 , len = 0x8000000 } SECTIONS { .text : { } GROUP ALIGN(0x1000) : { .data : { } .bss : { } } } h16299 s 00001/00001/00042 d D 4.2 87/05/20 15:22:47 build 5 4 c added sccs id string. -mkm e s 00000/00000/00043 d D 4.1 87/05/20 15:21:02 build 4 3 c rolled rev to -r4 (mkm) e s 00000/00000/00043 d D 3.1 87/05/20 15:21:02 build 3 2 c AUTO NULL DELTA e s 00000/00000/00043 d D 2.1 87/05/20 15:21:02 build 2 1 c AUTO NULL DELTA e s 00043/00000/00000 d D 1.1 87/05/20 15:20:23 build 1 0 c placed under source control (mkm) e u U f b f n t T I 1 : D 5 # E 5 I 5 # " %E% %W% " E 5 # This script will make a bootable backup tape containing the following files: # # readme # ctbootcio # diskboot # image of root # cpio of /usr # cpio of root # # All files have blocksize of 4096. It is assumed that the /usr partition # is /dev/dsk/c0d0s2 and the root is /dev/dsk/c0d0s0. If this is not true, # then change all appropriate node names to the correct node name. # This script must be run in single user mode. set `/bin/who -r` if [ $7 = S -o $7 = s ] then echo "mounting /usr" /etc/mount /dev/dsk/c0d0s2 /usr > /dev/null 2>&1 cmt rew echo "writing readme file to /dev/rct/0n" dd if=/etc/release of=/dev/rct/0n bs=512 conv=sync echo "writing the tape bootstrapper to /dev/rct/0n" dd if=/etc/ctbootcio of=/dev/rct/0n bs=4096 conv=sync count=2 echo "writing the disk bootstrapper to /dev/rct/0n" dd if=/etc/diskboot of=/dev/rct/0n bs=4096 conv=sync count=2 echo "writing image of the root to /dev/rct/0n" dd if=/dev/rdsk/c0d0s0 of=/dev/rct/0n bs=4096 count=4096 cd / echo "writing cpio archive of /usr to /dev/rct/0n" find /usr -depth -print | cpio -oB > /dev/rct/0n echo "writing cpio archive of root to /dev/rct/0n" find . -depth -print | grep -v '^\./usr/' | cpio -oB > /dev/rct/0n echo "unmounting /usr" /etc/umount /dev/dsk/c0d0s2 > /dev/null 2>&1 else echo "System needs to be in single user mode before running this program." echo "Run shutdown(1M) before proceeding." exit fi E 1 ./sys/s.unix.ld ./sys/cf/s.config.h ./sys/cf/s.name.c ./sys/cf/s.conf.c ./sys/cf/s.linesw.c ./sys/cf/s.Makefile ./sys/cf/s.mk.field ./sys/cf/config.h ./sys/cf/conf.o ./sys/cf/linesw.o ./sys/cf/name.o ./sys/io/s.me.c ./sys/io/s.err.c ./sys/io/s.fpal.c ./sys/io/s.fplp.c ./sys/io/s.iomachdep.c ./sys/io/s.mas.c tp2->physdmar = (char *)svtophys(tp2->dmar); tp2->physdmax = (char *)svtophys(tp2->dmax); ./sys/io/s.mt.c ./sys/io/s.partab.c ./sys/io/s.prof.c ./sys/io/s.pty.c ./sys/io/s.smd.c bp->b_pt = svtopte(dtab->vtoc) ; ./sys/io/s.sxt.c ./sys/io/s.sys.c ./sys/io/s.tt0.c ./sys/io/s.tt1.c ./sys/io/s.tty.c ./sys/io/s.tty0.c ./sys/io/s.wbal.c ./sys/io/s.clist.c ./sys/io/s.mem.c pt = svtopte(u.u_offset | SYSVA) ; if (copyout(u.u_offset | SYSVA,u.u_base,n)) pt = (pte_t *)svtopte(u.u_offset | SYSVA) ; if (copyin(u.u_base, u.u_offset | SYSVA, n)) ./sys/io/s.wbct.c d_write(kcbUnit + CbPage0, (svtophys(&wbct_buf[unit].ResvdC))>>16); d_write(kcbUnit + CbPage0+2, (svtophys(&(wbct_buf[unit]).ResvdC))&0xFFFF); d_write(kcbUnit + CbPage0, (svtophys(&wbct_buf[unit].msl0))>>16); d_write(kcbUnit + CbPage0+2, (svtophys(&(wbct_buf[unit]).msl0))&0xFFFF); d_write(kcbUnit + CbPage0, (svtophys(&wbct_buf[unit].msl0))>>16); d_write(kcbUnit + CbPage0+2, (svtophys(&(wbct_buf[unit]).msl0))&0xFFFF); d_write(kcbUnit + CbPage0, (svtophys(&wbct_buf[unit]))>>16); d_write(kcbUnit + CbPage0+2, (svtophys(&(wbct_buf[unit])))&0xFFFF); ./sys/io/s.wblp.c ./sys/io/s.rawnet.c ./sys/io/s.Makefile ./sys/io/s.tv.c ./sys/io/LIB2.a ./sys/kdb/s.askdb.s ./sys/kdb/s.kdbccb.s ./sys/kdb/s.kdbn.c ./sys/kdb/s.Makefile ./sys/kdb/LIBKDB.a ./sys/ml/s.paging.s ./sys/ml/s.trap.s ./sys/ml/s.low.s ./sys/ml/s.math.s ./sys/ml/s.end.s ./sys/ml/s.copy.s load r0,_kbase,l load r0,_kbase,l ./sys/ml/s.cswitch.s ./sys/ml/s.userio.s ./sys/ml/s.memscan.s ./sys/ml/s.misc.s ./sys/ml/s.ccb.s ./sys/ml/s.start.s ./sys/ml/s.Makefile ./sys/ml/s.ccopy.c ./sys/ml/s.mapa.c st = (sgte_t *)ptol(sct->sgt_paddr) + ((i & L1MASK) >> L0WIDTH) ; pte = (pte_t *)ptol(sttop(st->pt_paddr)) + (i & L0MASK); ./sys/ml/LIB0.a ./sys/os/s.alloc.c ./sys/os/s.bio.c bp->b_pt = (pte_t *)svtopte(buffers) ; ./sys/os/s.bitmasks.c ./sys/os/s.i_mbuf.c mfree(mbmap, v.v_nmbcl, svtop(mbutl)) ; m = (struct mbuf *)ptosv(mbx) ; ./sys/os/s.blklist.c ./sys/os/s.bsdcompat.c ./sys/os/s.clock.c ./sys/os/s.debug.c ./sys/os/s.errlog.c ./sys/os/s.exec.c ./sys/os/s.exit.c ./sys/os/s.fault.c st = (sgte_t *)ptol(sct->sgt_paddr) + ((i & L1MASK) >> L0WIDTH) ; pt = (pte_t *)ptol(sttop(st->pt_paddr)) + (i & L0MASK) ; st = (sgte_t *)ptol(sct->sgt_paddr) + ((i & L1MASK) >> L0WIDTH) ; pt = (pte_t *)ptol(sttop(st->pt_paddr)) + (i & L0MASK) ; vaddr = ptol(ptob(ptep->pgm.pg_pfn)) ; ./sys/os/s.fio.c ./sys/os/s.flock.c ./sys/os/s.fork.c cpt = svtopte(useg); cp->p_addr.pt_paddr = ptost(svtophys(cublkptbl)) ; cpt = (pte_t *)svtopte(useg) ; useg->u_rsav[RSAV_SR8] = svtophys(cp->p_sct) ; ./sys/os/s.getpages.c ./sys/os/s.grow.c ./sys/os/s.i_domain.c ./sys/os/s.i_socket2.c ./sys/os/s.i_proto.c ./sys/os/s.i_socket.c ./sys/os/s.i_syscl.c ./sys/os/s.i_usrreq.c ./sys/os/s.iget.c ./sys/os/s.intr.c ./sys/os/s.ipc.c ./sys/os/s.lock.c ./sys/os/s.machdep.c p = (int *)((int)&edata - SYSVA) ; ./sys/os/s.main.c kbase = (caddr_t)(ptob(ksv_sz) + SYSVA) ; userpte = svtopte(uservad) ; mmpte = svtopte(mmvad) ; ./sys/os/s.malloc.c ./sys/os/s.move.c st = (sgte_t *)ptol(sct->sgt_paddr) + ((i & L1MASK) >> L0WIDTH) ; pt = (pte_t *)ptol(sttop(st->pt_paddr)) + (i & L0MASK) ; pcopyvad = ptol(ptob(pt->pgm.pg_pfn)) ; st = (sgte_t *)ptol(sct->sgt_paddr) + ((i & L1MASK) >> L0WIDTH) ; pt = (pte_t *)ptol(sttop(st->pt_paddr)) + (i & L0MASK) ; pcopyvad = ptol(ptob(pt->pgm.pg_pfn)) ; ./sys/os/s.msg.c ./sys/os/s.nami.c ./sys/os/s.page.c sct = ksct + ((vaddr & L2MASK) >> (L1WIDTH+L0WIDTH)) ; sct->sgt_paddr = kvtopfn((*pgtallocator)(NPTPSC)) ; stfill(ptol(sct->sgt_paddr), nvaddr, nsize, base, free) ; l1d->pt_paddr = ptost(kvtopfn((*pgtallocator)(1))) ; pt = (pte_t *)ptol(sttop(l1d->pt_paddr)) + (vaddr & L0MASK) ; sptlog[sptlgndx].begva = ptosv(sp); sptlog[sptlgndx].endva = ptosv(sp+size) -1; return(ptosv(sp)); sp = svtop(vaddr); sptlog[sptlgndx].endva = ptosv(sp+size) -1; ./sys/os/s.pgtalloc.c bzero(ptol(pfn),nbytes) ; return((uint)ptol(pfn)) ; pgtfree(ptol(pgt_e), npgtbls) ; pt = (int)ptol(physaddr); pf = &pfdat[btotp(kvtopfn(pt + ctob(j)))]; pf = &pfdat[btotp(kvtopfn(pt + ctob(i-1)))]; pfn = btotp(kvtopfn(pt)); return((int)ptol(ctob(pfn))); ./sys/os/s.physio.c st = (sgte_t *)ptol(sct->sgt_paddr) + ((i & L1MASK) >> L0WIDTH) ; bp->b_pt= (pte_t *)ptol(sttop(st->pt_paddr)) + (i & L0MASK) ; st = (sgte_t *)ptol(sct->sgt_paddr) + ((i & L1MASK) >> L0WIDTH) ; bp->b_pt = (pte_t *)ptol(sttop(st->pt_paddr)) + (i & L0MASK) ; st = (sgte_t *)ptol(sct->sgt_paddr) + ((i & L1MASK) >> L0WIDTH) ; pt = (pte_t *)ptol(sttop(st->pt_paddr)) + (i & L0MASK) ; ./sys/os/s.pipe.c ./sys/os/s.prf.c ./sys/os/s.probe.c st = (sgte_t *)ptol(sct->sgt_paddr) + ((i & L1MASK) >> L0WIDTH) ; pt = (pte_t *)ptol(sttop(st->pt_paddr)) + (i & L0MASK) ; st = (sgte_t *)ptol(sct->sgt_paddr) + ((i & L1MASK) >> L0WIDTH) ; pt = (pte_t *)ptol(sttop(st->pt_paddr)) + (i & L0MASK) ; ./sys/os/s.ptrace.c ./sys/os/s.sys4.c ./sys/os/s.rdwri.c ./sys/os/s.region.c st = (sgte_t *)ptol(sct->sgt_paddr) + ((j & L1MASK) >> L0WIDTH) ; st = (sgte_t *)ptol(sct->sgt_paddr) ; /* st = (sgte_t *)ptol(sct->sgt_paddr) + ((j & L1MASK) >> L0WIDTH) ;*/ st = (sgte_t *)ptol(sct->sgt_paddr) + j ; st = (sgte_t *)ptol(sct->sgt_paddr) + ((j & L1MASK) >> L0WIDTH) ; sct->sgt_paddr = kvtopfn(pgtalloc(NPTPSC)) ; st = (sgte_t *)ptol(sct->sgt_paddr) ; sct->sgt_paddr = kvtopfn(pgtalloc(NPTPSC)) ; st = (sgte_t *)ptol(sct->sgt_paddr) + ((j & L1MASK) >> L0WIDTH) ; st = (sgte_t *)ptol(sct->sgt_paddr) ; st = (sgte_t *)ptol(sct->sgt_paddr) + ((j & L1MASK) >> L0WIDTH) ; st = (sgte_t *)ptol(sct->sgt_paddr) + ((j & L1MASK) >> L0WIDTH) ; st = (sgte_t *)ptol(sct->sgt_paddr) ; st = (sgte_t *)ptol(sct->sgt_paddr) + ((j & L1MASK) >> L0WIDTH) ; st->pt_paddr = ptost(svtophys(*lp)) ; st = (sgte_t *)ptol(sct->sgt_paddr) ; ./sys/os/s.sched.c ./sys/os/s.Makefile ./sys/os/s.sem.c ./sys/os/s.shm.c ./sys/os/s.sig.c ./sys/os/s.slp.c ./sys/os/s.startup.c caddr_t kbase ; scte_t *ksct ; int nspte, nsgte, nscte, ubase ; nspte = (physmem+NPGPT-1)/NPGPT; nspte = (nspte + NPTPP -1)/NPTPP ; nsgte = (nspte + NPTPP - 1) / NPTPP ; ksct = (scte_t *)&sys_sect ; ksct->sgt_paddr = (int)sgtbl - SYSVA ; sctbl = ksct + NBSECT - (nscte + 1) ; sctbl->sgt_paddr = (int)sgtbl - SYSVA ; for (i = 0 ; i < btop((int)(&etext) - SYSVA) ; i++) for ( ; i < (btop((int)(&end) - SYSVA) + nspte + nsgte); i++) nspte = (physmem+NPGPT-1)/NPGPT; for (i = 0 ; i < nspte ; i ++ , sgtbl++) sgtbl->pt_paddr = ptost((int)sptbl - SYSVA) ; * Physical memory is mapped contiguously at virtual address kbase. kbase = (caddr_t)SYSVA ; curproc->p_addr.pt_paddr = ptost(svtophys(curprocptbl)) ; sys_sect.section[NBSECT - 1].sgt_paddr = (int)&ublk_sgtbl - SYSVA ; curprocptbl = (pte_t *)svtophys(curprocptbl) ; p0ptbl = svtopte(useg) ; ./sys/os/s.subr.c ./sys/os/s.swapalloc.c ./sys/os/s.swtch.c ./sys/os/s.sys1.c ./sys/os/s.sys2.c ./sys/os/s.sys3.c ./sys/os/s.sys_socket.c ./sys/os/s.syscall.c ./sys/os/s.sysent.c ./sys/os/s.text.c ./sys/os/s.timeout.c ./sys/os/s.trap.c ./sys/os/s.utssys.c ./sys/os/s.vrt.c pg_pfn = ((pte_t *)sbrpte)[svtop(vrt_e)].pgm.pg_pfn ; pg_pfn = ((pte_t *)sbrpte)[svtop(vrt_e)].pgm.pg_pfn ; ./sys/os/s.acct.c ./sys/os/LIB1.a ./sys/sys/s.aouthdr.h ./sys/sys/s.acct.h ./sys/sys/s.bitmasks.h ./sys/sys/s.bsdioctl.h ./sys/sys/s.buf.h ./sys/sys/s.callo.h ./sys/sys/s.cio.h ./sys/sys/s.clock.h ./sys/sys/s.conf.h ./sys/sys/s.crtctl.h ./sys/sys/s.ctio.h ./sys/sys/s.defsocket.h ./sys/sys/s.dir.h ./sys/sys/s.domain.h ./sys/sys/s.elog.h ./sys/sys/s.erec.h ./sys/sys/s.err.h ./sys/sys/s.errno.h ./sys/sys/s.fblk.h ./sys/sys/s.fdlp.h ./sys/sys/s.file.h ./sys/sys/s.filehdr.h ./sys/sys/s.flock.h ./sys/sys/s.init.h ./sys/sys/s.ino.h ./sys/sys/s.inode.h ./sys/sys/s.iobuf.h ./sys/sys/s.ass.h ./sys/sys/s.iomachdep.h ./sys/sys/s.ipc.h ./sys/sys/s.lock.h ./sys/sys/s.lprio.h ./sys/sys/s.map.h ./sys/sys/s.mas.h ./sys/sys/s.me.h ./sys/sys/s.mount.h ./sys/sys/s.msg.h ./sys/sys/s.mt.h ./sys/sys/s.mtio.h ./sys/sys/s.opt.h ./sys/sys/s.page.h extern caddr_t kbase ; extern scte_t *ksct ; #define SYSVA 0x80000000 * Used to access page tables in virtual space : ptol(x->zz_paddr) * physical memory is mapped contiguously at address kbase. #define ptol(x) ((x) + kbase) #define ltop(x) ((paddr_t)ptob(svtopte((int)(x))->pgm.pg_pfn)) #define kvtopfn(x) ((int)x - (int)kbase) #define sscte(a) (ksct + ((((int)a) & L2MASK) >> (L1WIDTH+L0WIDTH))) #define sste(a) ((sgte_t *)ptol(sscte(a)->sgt_paddr)\ #define spte(a) ((pte_t *)ptol(sttop(sste(a)->pt_paddr)) + (((int)a) & L0MASK)) #define uste(p , a) ((sgte_t)ptol(uscte(p,a)->sgt_paddr) \ #define upte(p , a) ((pte_t *)ptol(sttop(uste(p,a)->pt_paddr)) \ #define svtoc(X) (((int)(X) >> 12) & PG_PFNUM) #define ctosv(X) (((int)(X) << 12) + SYSVA) #define svtop(X) (((int)(X) >> 12) & PG_PFNUM) #define ptosv(X) (((int)(X) << 12) + SYSVA) #define ctopv(X) ((int)(X) << 12) #define svtopte(X) (spte(svtop((int)X))) #define svtophys(a) (ltop(a) + poff(a)) ./sys/sys/s.param.h ./sys/sys/s.pcb.h ./sys/sys/s.pfdat.h ./sys/sys/s.proc.h ./sys/sys/s.protosw.h ./sys/sys/s.filsys.h ./sys/sys/s.psl.h ./sys/sys/s.pty.h ./sys/sys/s.reg.h ./sys/sys/s.region.h ./sys/sys/s.scnhdr.h ./sys/sys/s.sem.h ./sys/sys/s.shm.h ./sys/sys/s.signal.h ./sys/sys/s.smd.h ./sys/sys/s.socket.h ./sys/sys/s.socketvar.h ./sys/sys/s.space.h ./sys/sys/s.stat.h ./sys/sys/s.swap.h ./sys/sys/s.seg.h ./sys/sys/s.sxt.h ./sys/sys/s.sysinfo.h ./sys/sys/s.mbuf.h ./sys/sys/s.sysmacros.h ./sys/sys/s.systm.h ./sys/sys/s.termio.h ./sys/sys/s.text.h ./sys/sys/s.timeb.h ./sys/sys/s.trace.h ./sys/sys/s.trap.h ./sys/sys/s.ttold.h ./sys/sys/s.tty.h ./sys/sys/s.tuneable.h ./sys/sys/s.types.h ./sys/sys/s.uio.h ./sys/sys/s.un.h ./sys/sys/s.unpcb.h ./sys/sys/s.user.h ./sys/sys/s.utsname.h ./sys/sys/s.var.h ./sys/sys/s.version.h ./sys/sys/s.mem.h ./sys/sys/s.vrt.h ./sys/sys/s.vtoc.h ./sys/sys/s.times.h ./sys/sys/s.debug.h ./sys/sys/s.Makefile ./sys/sys/s.rnio.h ./sys/sys/s.const.as.h ./sys/sys/s.maint.h ./sys/net/s.if.c ./sys/net/s.if.h ./sys/net/s.raw_cb.c ./sys/net/s.netisr.h ./sys/net/s.raw_cb.h ./sys/net/s.raw_usrreq.c ./sys/net/s.route.h ./sys/net/s.route.c ./sys/net/s.af.h ./sys/net/s.Makefile ./sys/net/s.af.c ./sys/net/af.h ./sys/net/if.h ./sys/net/route.h ./sys/net/LIBN.a ./sys/net/raw_cb.h ./sys/net/netisr.h ./sys/netinet/s.if_ether.h ./sys/netinet/s.if_loop.c ./sys/netinet/s.imp.h ./sys/netinet/s.in.c ./sys/netinet/s.in.h ./sys/netinet/s.in_pcb.c ./sys/netinet/s.in_pcb.h ./sys/netinet/s.in_cksum.s ./sys/netinet/s.in_proto.c ./sys/netinet/s.in_systm.h ./sys/netinet/s.ip_icmp.c ./sys/netinet/s.ip.h ./sys/netinet/s.ip_icmp.h ./sys/netinet/s.ip_input.c ./sys/netinet/s.ip_var.h ./sys/netinet/s.ip_output.c ./sys/netinet/s.raw_ip.c ./sys/netinet/s.nd.h ./sys/netinet/s.tcp.h ./sys/netinet/s.tcp_debug.c ./sys/netinet/s.tcp_debug.h ./sys/netinet/s.tcp_input.c ./sys/netinet/s.tcp_fsm.h ./sys/netinet/s.tcp_seq.h ./sys/netinet/s.tcp_output.c ./sys/netinet/s.tcp_subr.c ./sys/netinet/s.tcp_timer.h ./sys/netinet/s.tcp_timer.c ./sys/netinet/s.tcp_usrreq.c ./sys/netinet/s.tcp_var.h ./sys/netinet/s.udp_usrreq.c ./sys/netinet/s.tcpip.h ./sys/netinet/s.udp.h ./sys/netinet/s.udp_var.h ./sys/netinet/s.in_cksum.sau ./sys/netinet/s.if_ether.c ./sys/netinet/s.icmp_var.h ./sys/netinet/s.Makefile ./sys/netinet/in.h ./sys/netinet/icmp_var.h ./sys/netinet/if_ether.h ./sys/netinet/imp.h ./sys/netinet/in_pcb.h ./sys/netinet/in_systm.h ./sys/netinet/ip.h ./sys/netinet/ip_icmp.h ./sys/netinet/ip_var.h ./sys/netinet/nd.h ./sys/netinet/tcp.h ./sys/netinet/tcp_debug.h ./sys/netinet/tcp_fsm.h ./sys/netinet/tcp_seq.h ./sys/netinet/tcp_timer.h ./sys/netinet/tcp_var.h ./sys/netinet/tcpip.h ./sys/netinet/udp.h ./sys/netinet/udp_var.h ./sys/netinet/LIBIN.a ./sys/wb/s.trace.h ./sys/wb/s.wonder.h ./sys/wb/s.Makefile ./sys/wb/s.wonder.c RealRecvBufs[i] = svtophys(RecvBufs[i]); RealXmitBufs[i] = svtophys(XmitBufs[i]); ./sys/wb/s.lance.h ./sys/wb/wonder.h ./sys/wb/lance.h ./sys/wb/trace.h ./sys/wb/LIBWB.a ./sys/s.mk.field ./sys/s.Makefile ./sys/unix.ld ./sys/mk.field ./sys/unix ./boot/s.automove.c ./boot/s.file.c ./boot/s.ld.file ./boot/s.load.c ./boot/s.main.c ./boot/s.prf_cio.c ./boot/s.prf_fdlp.c ./boot/s.smd.c ./boot/s.common.h ./boot/s.starthdw.s ./boot/s.Makefile ./boot/s.start.s ./boot/s.load.h ./boot/s.main_old.c ./boot/start.s ./boot/start.o ./boot/load.h ./boot/common.h ./boot/automove.o ./boot/load.o ./boot/ld.file ./boot/file.o ./boot/smd.o ./boot/main.o ./boot/prf_cio.o ./boot/diskboot ./boot/main_old.o ./boot/odiskboot ./boot/prf_fdlp.o ./boot/bootfdlp ./tboot/s.automove.c ./tboot/s.ct.c ./tboot/s.ld.file ./tboot/s.main.c ./tboot/s.mt.c ./tboot/s.prf_cio.c ./tboot/s.prf_fdlp.c ./tboot/s.smd.c ./tboot/s.common.h ./tboot/s.load.h ./tboot/s.Makefile ./tboot/s.start.s ./tboot/load.h ./tboot/start.o ./tboot/common.h ./tboot/automove.o ./tboot/ld.file ./tboot/main.o ./tboot/smd.o ./tboot/ct.o ./tboot/prf_cio.o ./tboot/ctbootcio ./tboot/mt.o ./tboot/mtbootcio ./tboot/prf_fdlp.o ./tboot/mtbootfdlp ./obsolete/s.main_mt.obso ./obsolete/s.obs.headwall ./obsolete/s.smd_mt.obsol ./s.Makefile ./patterns ./patterns.out get -p $* 2> /dev/null | \ egrep 'kbase ksct SYSVA ptol ltop kvtopfn sscte sste spte svtoc ctosv svtop ptosv ctopv svtopte svtophys' # " @(#)mk.field 4.4 87/05/20 " # directories under this directory OS = os/ CF = cf/ IO = io/ ML = ml/ KDB = kdb/ NET = net/ WB = wb/ NETINET = netinet/ INCSYS = sys/ # Librarys produced MLLIB = $(ML)LIB0.a OSLIB = $(OS)LIB1.a IOLIB = $(IO)LIB2.a KDBLIB = $(KDB)LIBKDB.a NETLIB = $(NET)LIBN.a NETINETLIB = $(NETINET)LIBIN.a WBLIB = $(WB)LIBWB.a ULIBS = \ $(MLLIB) \ $(OSLIB) \ $(IOLIB) \ $(KDBLIB) \ $(NETLIB) \ $(NETINETLIB) \ $(WBLIB) # make two references to ULIBS in order to fully resolve inter-library refs UNIX = $(CF)conf.o $(CF)linesw.o \ $(ULIBS) $(ULIBS) all: -cd $(CF); $(MAKE) $(MAKE) unix unix: $(UNIX) unix.ld rm -f $@ start.o ar x $(ML)LIB0.a start.o /bin/ld -N -o $@ unix.ld -e _start start.o $(UNIX) chmod 544 unix rm -f start.o install: clean: rm -f start.o -cd $(CF); $(MAKE) clean clobber: rm -f unix start.o nmunix -cd $(CF); $(MAKE) clobber nmunix: unix nm -vx unix |pr -4 -w130 | tee nmunix | lp -tNM_UNIX p h(l  .text  ( .data@.bss  l`qs`FFЋL@r h@L @`@pt xp@p@"L@@  FhD! (rFFaFpAB (VkP[6 D F FptF`pAB( D(F FptF`pAB'؋8ȓ88W8ȓ88W0 Г00WWW@G^QGUFP@GN8h(FrD '*FFDFFBP[G$F8F`0FsAB@P\A$t@PHA$n@P4A$h@P A$`@P A$X@P A$\@P A$T @GSUڋA$*@P@PA$$@P|A$@PhA$@wwGbbCBPV@wCB@P A#G7GbF |pRUWU~jfb‹ҋ.fGN8G G1$XG"G3$`G7#( h# FrG$$hGGphDFFD F LG&FnFBB#4 P[GF8AhFD!pFbFsABGNAGE8G740  G$$hG&G7$p.Q!_LFrhDFFD !LFD@FnG FBPHP[LaHP*[bbPGD4tGbG$2tj܎P݆VLPGD(FrhDFFD@FnFB#4P6[LPGDBhFDBpFd8FFsL80AB@FCBP[P[bG@FPFBb FBWWUD! G/"FF> FnHF >(^0Ǿ8LBb` P$[b`ɀɠ WFW@G7*\G/! GS!GN80h(Fr F hGhGGp $LD !FFDGFFnG#GQFB#4. >$# _BP [$G0t80B@P.!PP. >$bP[HW 8W$# W # W # LW2!AC@2! BC@8zARG@C@A@`WPSP$QP8JAB(880J4AB$4002AB"201!1WW LnL @@ 0 10@8 10@Gǭ  ΀ΐ8 ΀ΐPUUUUI4TLtu`4v4ΐj`9CpLPUUUUdTLtW*&UTLtWd99dGۧ nɎɮ W^L W. hn`.d\q q.uL < >hd HWP[G'# FqGF@_L!bb!BP[G'# HFqF_LBP[G'#  FqGF@L!bb!>B<n~. 0@. 1BPP0P`rÆx"Rb^"Ȏ@@n~ǎW@L 8  WWWLW! ` 201L<TA@0L<A@R^Pp!%pW  [/etc/init$@~8z 4 4zFp p    q   UW88 , ,T~8@@WH8~@zpz 4 4znf    q   UW88 , , B(zZz h 0   q0 0UW88 , ,z~@ɞ8HHW@~8p 8 8LJ zq   UW<< 0   0.: , ,YY Y~8@@W8 8 8 4 0X88W8 B( 88W8 ȧ~4p@   Ba @   B Ba  ," . Bħp B q B* Bȧp  Bq B 7  B B~488Wz@1~  p΀0zS  p F'.( zz  "'~WH8z~@  p z S ߁ Fwȓ\x ( zz ha@@  z  z T@      B BJ wx9 B B* B@  B Brp Bēx      B Ba  Hpx  (  ~@ɞ8HHW@~8p@$ B  B BD B Bדrp Bހ B8      B Bpa  ƋHpx ~8@@W@~8p ΀z J T z  ,YY Y~8@@W8  0  88W@~<p'$ P0~<@@W@4z~82p BzR  |zzl       B B&p Bċ  w wГ: BW~8Ǟ4@@W@~0ހ F4p(z 1S܀~WX?@H~PS$ S Swޠ B S<q  xxpSp q  xVpx  s  ? ps  $  s p `&s 0 0? sps  &p  pz <pS( Ip B'

H8~@pw  ܆. Ћ    Є ~2!Ć܋b `  zz&zX#z   z $ $ z ( ( "p pd h7Vz4z42 z " zz44<  gP( $z$$z$z2$((0  d *   f0(p Ћ88a((a < <pS(e l l p p t t x x88.T$80T(,@@@T4 @DDD~@ɞ8HHW@~<p.`` *` B~<@@W0 Г "`ȶlh`00W@`P``&RR!OSHPhSHPl@@WH8~@' p^RN 긎 2 p0Ppps#$qp8~@ɞ8HHWH<~@pz  Pps!RN~@Ǟ<HHW@~8rn$Pd PdPh,PhpPhP`PhpSH(SHPhn~8@@W8 ȧ~4px(Pl PlpP`PlpSH(SHPlPda PdPh֠~488W@~8p&P`pSHPh4PhPhpPhPhPhSH(SHPhSHPl<(ppgPa^0Qa1&! 0Rb1`&# :Td1@&' 4Xh1 ~8@@W@~<p4 q~<@@W@~<pqHp~<@@W@4~8p((PǗ( ,r   gG zq0@z z p z H   @x  z  z (" $$ *7LJ B,B10'~8Ǟ4@@W@~8pLJ(p,0X *'G ,DŽD! 7~8@@W@~<p ,z ~<@@W@~8q q~8@@WX@H~Pdq 0  sp` ? sp s p0? pp аLdǐ x\  q @p  @pxx d zhxd   T  T!0^p  x/x! !Txx0  (1bg^T3Qa1J   fx    dLL~PɎHɮ@XXWPHPX~`(  dq 0  sp  ? sp s  s p ? p ta   P PL ^pdp * <d^pPLq!0@=p0@#p" x$/(r(jp""xW"   !0[* d^pPLF xxx  \      +  T0 ij"T0 0! 0~ +0  T0 0! 0B.= c!pz3z -pQ^l4Ýpzz-p)p"l xx xhPT0 p ^dkx |ǞxVH>hax^|  V^|X^|tnl(8,ndl$xx _T0xx OT00 0 -zzz"  (0\^ P^^xQ  hPdzUQ^tPFQz2nxx  !d! _t ,1pzǮt^ xx   d  b0  ɼ  t},P^  P^^zUz^P^:xx   !d! ^^tQ^^Pz^^z  Ǹ^ z  ^` p\n[P^xx p ΠY^<  0 Ln,N ^ z0^zZ^T^R^zx} > d^pPLh^nV^Z^%$.6Tn^V^P^^P^x.]n V^Pn%&ex  xx   d  b0  ƀti8 d^pPL4x{ Vd^pPL~`ɎXɮPHWP@~H Z0pPzyy$ )|ny,yD *|L0\00     Vΐz ÒgzR z d( ! xx !  ~Hɞ@PPWPD~HqnLW3Qa1 xx   d  b0   1Vg^L3Qa1~HǎDPPW@p YWP?8@~Hpp *Bgz((zzz  z> 00ްYPpPyhx.s&øz P+pPj T ! `!F q בV4: q  בUr$(0Sp R:z('$z  p(ؓ`x`\0S Ћ"zzH (z z  Wz ߰rz  W#B~Hɞ@ɾ8PPW@0!~<&Czp @A  A `AHqY( ~̎ pz0 01V0WJq Y(4z7 0@UWo$Y~<@@W@~8pfz!Yz  z YVZ FZs\ s   Y~8@@W@~<9Hp VZZ"z YY  ~<@@WZH HYWp &l$@YW@~8q zP4yxyt  Y>Ppzq ~8@@W R2 P2 0Sp R(W0@ Xz36zz$ " W 0`0tUUUU`  X0 X0XW zrUU X   ` ` `W@~8pހRqUԀp }U܋Rh h(hh hq UЀU~8@@W~phpUUUUh gZ*' l%# D%! ?Qa1`&! 7Rb1@&# 3Td1 &' 1Xh1d z "  pypx~ɞW8  ~4q  JUUhph&hhpph~488W@10 - %v  (2       Wp@HP~Xrz lǺd  z-lhpyWVzz NJ &zz  vNJ zzNJ zz n\Z*' ^%# >%! ?Qa1\7Rb1D3Td1,&' 1Xh1 :`# 2   \#Z.BNJ zz  n\Z*' ^%# >%! ?Qa1\7Rb1D3Td1,&' 1Xh1 :`# 2   \#N .8(    NJ Pzz      Vzz NJ &   Z   SlD(     (. ~XɎPɮH@ppW@1~ B|d  z( BH<0$dzzz zD@u#dp z"V"zwT4( zdzz  D@~WX@H~PqTj:÷z D  .TPgZ*' l%# D%! ?Qa1`&! 7Rb1@&# 3Td1 &' 1Xh1  <+$~PɎHɮ@XXW`@HP~X\pz z     p l d,z (  ^z  Ћ .\F\ (p p-dp  p.B     t p܋} ((pp  ~XɎPɮH@``W@1z8z z\ J!."   #W d0 z3z 0x  ! W@~8p >'(ǂd  z0( ~8@@W@~<TSTT(z`lf8zl^p Ћ|d V  0f8T<pS(pd4 zz z z b0f8TDTn" .owd[H~@pzz bjLJz zz b0f8TBTm> Jn.pi~@HHWP<@~Hpzzz atgz@zz?@ppgz z6:0p GzzD@J@@@6"a  1$C@y~Hɞ@Ǿ<PPWDHP~Xzz{ =`T zz  ! z 4 pz@| ^|ezz?@tpV^pVpR^lR^P^`YVP^dZnpzzƋl  pp npzz@^`^x^d^h` & ';r B^hPDa6  ( ';, \  x$/((p""zW"xx   d      0 0?x?x9 s   0 #  {   6 ! '; @`xdzB   !n '; t b  A{ [Ћj^xP   @   ! '; @ 4T,s" '; t# '; |^dP&0T4^|Q^|^lT^l^p@P^p^|nteK ';6 ~XɞPɾHDWh@HP~Xqz{8{P 9[Q^\p Js`ǧd{\VJ`{V:ǎ`Vdv{V P^\`V zL "  < p" z{"U,d!0J^^dTѧ^dn`mWs!   р-d.`0J`  ,\~XɎPɮH@hhWX?@H~Pz{{ Y  zz xx  dp  '8Nz|| YRzzNdxdh pdxp  00  9~PɞHɾ@XXWPP 0P3!38  : PQ !`SWH<~@zސ | |  p!q( zzw'p4|@|HW  YH   pr\' Xgz z zZ S Ћ6( Áqzp (|PU(z   zz ~@Ǟ<HHW@~8pz qqzpY8$z ?  p0'$<@ :!!1!1!1A ( `6$`q V $~8@@W@~<pzz z2zB zz\ z F (!pNpP pzNr~<@@WX8@H~Pz6zB Yz9 z qqz FhY$^Tz ?  ^TpP^Te^T^T^T ^T^Tu $ `$ $ ЋH |XMqqqѡ ( &qqqѡ ( ݋VЋH |lLqqqѡ (  `6$`q V $z ^T4z ^T8z @ (^T<z   Nz9 ~PɎHɮ@8XXWP@~Hy pp@péz|ωTdz " & 0z "0z  0n z !0^z !1Nqp \  r zB  ~Hɞ@PPWhDHP~Xzp  ϠpR^P^`|p,zpRnǷ$  P^dP8^`P$&dpz-0Tdzp z~XɞPɾHDhhW@ ~<  Jz z!pn~<@@W8xXPtTv88Wz@0 Rzz<z*"" 1` SW`~8`@z zq   !UW`@z zq   !UW p$`X`@zq Vz d|xptX@O>Y|Jض  @z  ~ |J z  Բ@@`@z z   `@ԣ@,~8Wh~@pzF (!z HJLNPR&zT `8$q VTz T Xz qqz0 $z ?  p 4\8`<dVH Y~@hhW8 c1 1@0Y @YW|Dp88WwW(WX<@H~Pրx8p+! s  p s   p p8th@tZtNtB ppx8(@~PɞHɾ@<XXW@1A1 !WH<~@pސ@t@H H.w~@Ǟ<HHW@~<@ }0Bv}XBjp pw& ' s"w~<@@W0 YWH<~@pdtP z t z   s z$$ P$`Lgs($ s( $|PtxXL` X`0zptpxLJ$`0zptpxL~@Ǟ<HHW888WH~D&-lp %Ps  ? s\p     sp `&0 0? sps  p %"Ps  ? s\p     sp `&0 0? sps  &p ж    J LpT8 Wt (@zz! @zжz! (,@$Onp( 3Rx#.(!0Z}A&NOp( 2R" 2"q,3q<CN(ZVN~ v d@hL8B*$ d  }&q}%q8@~$ d  }(q0}'q8 @2}&p}%pn~DHHW@1~$``(Np,2(8(~WH0~@q#(( (j`Z@($`ZpR&}:~(:>r(p ~@HHW@0~<qp XBt'Tt'ZYZ,t'nft'nRtt||xx~<@@WX?@H~P  |pxxq!0 sp`2@? 4s6p2s0 p0? #p" x/x! !p,)0 # 'm\g~PɞHɾ@XXWX?@H~P  |pxxq!0 sp`2@? 4s6p2s0 p0? #p" x/x! !p,)0 #  'l|g~PɞHɾ@XXW W8 > Y88W8t YDxx||ttx 88W8x TtxY2xx||tt88WH8~@YT|ΐ 0߀0p80 T| $\Y~@ɞ8HHWx<~@րhp 0ߐ8l  XZ x'T|     6   Zr H 0tYd0 HJ P   d(,J 4 0YY  ~@Ǟ<xxW@0~<r c   Wz(Taz%' z"!׸(Dp~<@@WPh 0T|0(^L ا^, pLBTx  ($(, T|0 0lPPW@~<TTq p ~0TTp׸T׸!0Pp%E P B,LT1~<@@WX?@H~Pրh  p~ 0ߠ8  FY.p  ~  $Y)8$ذY0ߠ8  }) 0 rZ @T@H@ ,r.` pr2" pz(  Y( z$Y JtX Tz!Y l  d  ( (L 'hf #YF     | zY  {~PɞHɾ@XXWX?<@H~P֠h  p0߀8Ԇ p TtYL T$ƆY*TYz  $Y'8$ذY0߀8z(   Y| zNxֆhY 0 @',0߀8y yދ   Yyx$RY ~ ',0߀8yF`NL֐  T׸F   Y׼׼ xx׸w(RY  ',0߀8xJdRP f tTX  Y( T,׸ d ($ T      g & Lw&l* vv~PɎHɮ@<XXW0 h(YhpW00W`<@Hѩ~P  WY:/D րp/ WY րzXY  p( qW/Y׋q(p/ WB>Y4pq  Y(VZVP^X @zY@Y | xP^\,. xz  X^Z0,\ P|x}YY   }YYz Y v$p | 4r B^\PP|R^\||xx||  *^XP"Øzrj.\ Sp D4zz(fLJz#J@p(4z К 8~PɞHɾ@<``WXH~PpzPh T(ZH 00.'zzz" (: ~PɞHXXWH~@ހdhx xp| m' n'z o't    d~@HHWhHPX~` VV  P^d|nd qpW {? p@ V, (9(8~`ɎXɮPHhhW`DHP~XVЋ ? qp ps 8Ws  x   ?  @! U<s   p*0? #p"p !6(l2  8&0( 7t! ~XɞPɾHD``WP<@~HǎxpΠ  $*   x/x! .W   xx   t y~Hɞ@Ǿ<PPWX<@H~PÆ(z #ސdh^Ћ$a  xx dpz( (#nzzdx"  y  p  yp  00 z (x| L    ~PɞHɾ@<XXWH<~@q`x.xAdzD 0xlj0< " \DX !HÈ zDz7 01 0d d Rsp 8zz,  " ~@Ǟ<HHWX?@H~P `x,xӑdz vxp`l Փ \t ֓ ×zzNj   d dBs ,zz  p  `xx   x    ~PɞHɾ@XXW @s d d0A1  WP@~Hpp \@`T**9")0p ~Hɞ@PPWH~@s p p 14 1 MR@`'~@HHW@1@ 0@ddhdtdhdx <8dh dxdx dx1! 1d 08dh dxdx dx1! 0<0W@4~8Ðրzdp,zz p ~8Ǟ4@@W8 ȧ~4pzd~488W@4~8 zp zz w`S(dp2 zz p ~8Ǟ4@@WP@~H`x.xqdzw 0xǚ * \ +yÙ zwz8 01 0d d@nsހ XzzL <  B ~Hɞ@PPWH<~@q(z m0p0f & ֐d0$$$b {(0p0 %Z~@Ǟ<HHWH~@pq  ?pDWpq '  ?lp H~@HHW8 0#88WP@~HHT Z:*Ib(yq t71(|0,2"#( ܋J.2(8  (W~Hɞ@PPWX<@H~P 4 p  pאրd(pz"z ` ` `zz z&    dp p( ( FX tq piLj dO s `x ٓ40p0(pp(R`  a d q p p  q d bp`d ddd( ( D ~PɞHɾ@<XXWX?@H~P q dp q p q$ 't Dq p  q( q p  qzld 0D ;Pd <d ddppdzp` p Lp` zz zX  XP Y2    00((((p~PɞHɾ@XXW@~8pp :d$$$[s~8@@WH D   xx  DD 1HHWP@~H0 hdhǁ  d0VBp* p( ! ߎ (( (   “`       x q(0d 0~Hɞ@PPWX8@H~Ppd z jT`xӁdz ( F@  F FW Fp Fj 8    q ߰U^ p (W@@( D D Lp L$ H H Pp PiVi@ <p p%   iF F  Fa@ p F  F FWXTir z ~PɎHɮ@8XXW`@HP~XqPx^\t0x,@ $PY  < < @ @ zVв h" F΀@$ F  F FT Fp F.΀@ T֐d  ,8t$tq   sp`0? sps p ? p   $q ? @p xΠ; |s ( Wf S|$$q   sp`0? sps p ? pxx||x   DDDT$^\րtqAVq 0 sp` ? sps p ? p ? 0(   $1A@ @@i F F  Fa @ p F  F FS* @  Sd 0x ,YY Y z ~XɎPɮH@``W0!t &x | Y`p | Y8 x|b ! !hxWH<~@@z p r֐l4P pPp0lplRT~@Ǟ<HHWH<~@p$RzzRRPFRzYTzzTTP:^$  DTNTz"RNRz~@Ǟ<HHWH<~@p<RzRRz&gVzz VTO<TzTTz&gVzz VROlRzXTzNχHz, NPzB ~@Ǟ<HHW@~8p΀zz MVgzz ~8@@W8 z bz z NT88W8ȧT.XT88WP@~H2p^z(44x%x 9  x0rdpupop xp6op xp   *Zsp$ǩ zp2cpvDp *(~Hɞ@PPW`8@H~P  ˋ ʋ -p.T=^0MV@B 0    @ q!Ŋ|q΀0 Z T0qp~PɎHɮ@8``WXL~Pp4z(a8 8m@@(Q <0 @ !J4(J,:09R~PǞLXXW@~8p\6\p &*p p ܓ 6VΓV<H@z!~Dq 0Y"zr q#7 z   UW~DHHWPD@~HqzW()8 ~HǞDPPWH~DpA20$\~DHHW@0!p@@Wh8@H~P.d ( 0d)s, s    ( d`.` P^P^XP^P^T  q p sp  ? sps  t s pX^T ? p r^\` *^\P<0  U U q@d Ǯ` p  q p sp` ? sps p ? p r8 Ta q@DŽ_~PɎHɮ@8hhW`@HP~Xpx|Yvç *@ *v@  ,(` D  4&zz qpVDp~ q$z  4z ? z !s&q0VHXpFpb(W z  q V8WHTTz 4zVz VRC" N|ZZRP^\NHY FҐҀ .z" _(Гa4, z WЋz W. 0-$!^\P  | |   >       Z<z YxV |NPPNgVz"z VLTBY~XɎPɮH@``Wh@HP~Xp|Y\÷ +@ *$  (`  &zzB qpVDp q&z , 6z ? z !s&q0VHXpFpb,W z  q VY^\PPxY~XɎPɮH@hhWd@d\d@d`dd4d d8.d` d@d`  d`"$S$ (W@~8pzz ;gzz ~8@@W8 z bzz <88W80Ad\ d@&r Yf   B20zA(d4d d4 d488W`DHP~Xpz( l z Fzz zzfgÇzzz@?4@ Г pppƋ ǀLT Փ:@00gz z 0z p(Z'r@'zLz   bgPH\0Qa1h&! 0Rb1H&# 8Td1(&' 3Xh1d\d@ d\p pd\~XɞPɾHD``WXDH~Pz`x    YZdRpY8 z ' z"^#gPp^;Qa1h&! 5Rb1H&# 2Td1(&' 0Xh1Yb7 z3^3 d E z d)zz"~PɞHǾDXXWP<@~Hzdǘ ](z ^   a`q 0 sp@ ? sp a y1 1zzwpT0ް x   $1@pp0D p d)zz" z z"z   6  *dpϘ hY)' l%# D%! ;Qa1t&! 5Rb1T&# 2Td14&' 0Xh1 qTMhPp\;Qa1h&! 5Rb1H&# 2Td1(&' 0Xh1~Hɞ@Ǿ<PPWp@HP~Xqz(  zt  *zЎ    zn     Y        P^l^d^`X``p&lp   Y4nlz@ w Úndzz@Zndzzzppzp @4P ϷVa   hW3Qa1`sVxx dhPz\p ?^hzn\[3Qa1\xd\Cx| K\C*   Yrh^\3Qa1t^lQ^l^`T^`^d@P^d nlzz?@ ~XɎPɮH@ppWPDHP~XҧçǾǻ }z ~p& z J z, * t^U zU^S^t {zzwpP]W^~[zU^[zU]^P@pp p pP^ZpR^ZpV^rǀ|@pp^nV nv( 7D^@P^^T^^Q^^?@.t >t-^^ Y$.t ʆ^ Yt~]W^[zU^[zU]^^E@pPpR ^^npP ^TpP^ZpR^|ZpV^xVVS^pVVP^l^t^P^h|ǀ~@pp^nxVnvnp @p8T ^hP> R )6 `0 P^. xx ^Q$^^^pPJP^4xx  p^T^^Q^^y ppj^l`P  !`   0(`*8 xx $qpً(x^ldP  !d   d0p(( xx $1p '6b| P^. xx ^Q$^^u^pP:P^&xx  ^Q^^up^x@P^x^|T^|^Q^^Q^^P^^?@>t- zz ^dz-z^ z^$ $~XɞPɾHDWH48A~@Ǡd!zz" 0@ @ jPq pr spx spa ? @qppz@ Tj? q p spx sp ? sppap p$ ȶ  ( ߋLs ^ 2q@ p~@ɞ8Ǿ4HHWH48~@ǰdqzzwp B kq   sp' sp> kq   sp' sp$n( `q  sp ? sp0a! !H&s  2!4@pp0 p~@ɞ8Ǿ4HHWP48@A~Hrǔ d ézzp4pj`q 0 sp ? sp  ?@p a1 1b`q 07 sp ? sp ?@0a1 10T0@ x   1@p$p 0p ‹~z dq 0 spI ? sp a1 1 zz?@p|` cΰ ? pc  spPc ? sps pxxΰ Dz`q x    1D$ ( A 0( ~Hɞ@ɾ84PPWh@HP~XЧ`.dǭd úzz úz`?@? @dN?p{?ł @*p(ً ?@? @QP^\zpϋ?&t  @*p( ϋ?t @*p(\pzz.\`  ?@?@z~J ?@? :? @!p" .*z ?@?@ ^`P d zz ?@?@p zpX* N 00? @!p"|*z^zd8j ?@pp ?@pj ?@? @! ?@pp ?@pt (n`pzz` : $f(( ~XɎPɮH@hhWXDH@~Pt!q,(0  q  q zzXtx| ffz gz@ z lx @  d ~PɞHǾDXXWxHPXǞ~`p   z \ ֆ ^ǧ z  -q,(0R q-)"q,!(0 j q z&  q zz   q q   @?d p]P ^tpRP^p[pV^l[pR^h nl ~tpp @ LBǞp@y @ Qh p0 N z  @   P q4$^hT^h^l@P^l^pQ^p^tQ^tndk   z  Zz@ z   X~`ɎXɮPHxxW8 A0 *b(( (2,( :88W0# z 6,&T ( W@ z z 2 z3^3 @@WP<@~H, Sΐp Ћ0<p(&$$$,H0T2J +p Ћr dR '! +*& *<pS(y+` jf  (   0*DDD  z ,WH<~@) z"(>8L ē2ljbz Nz z)n\:*p~@Ǟ<HHW?詾zz~z rTzz"YJd <pא P֐ 4  d <pЋYy9 @z3D zz x" zzA!z@ TzYZ z  zzzp hX7Qa1(㧧zz gTz z "Yz z z zp gW7Qa1x( zJ  ,    ~ɞɾW0`Tp P  YWP<@~H֠h  Dl($ppWZU  ) Éy@8"x)0s1p#T    FZU"  ""Y     (     !ʆY ^r (YVpl: & (Y pzl † (Ypl v t|XÉy"!Y Lx݋: & (Y pl Ɔ (Y T("Y p  q ދd  * (  t|X rY  T(z"Y( ! Dyf"ȋd x(Y~Hɞ@Ǿ<PPWH8~@d <pא J z Ézp p1z3pzppTLp z^O   ,    d <p~@ɞ8HHWXL~Pրh0T .(^T P^,p TTYpvYnp(&(Y$ T Psl~PǎLXXW@TpTp!2 ,0T!Tж@@WX?@H~P֠h   T(Y t|X Y pJz  hYNv ( ^ Ύ$Y t|X Y prWpgzzT*z L%zt8Y"Y *;B gzz(~z 8'z" *;. \& *;z  YH8(Y *;Hz  Y8(HYf,v ( p$vpd  (( l~PɞHɾ@XXW0 h(YhpW00WP@~HppZz Jp'z 'zv~Hɞ@PPW ~ pϗ    z p z  b:pWQpe^P7Qa1gzzz az:p" | wp ~Ɏɮ WH<~@4p  z2w<S(~@Ǟ<HHW8  0(1`1 (( .88WH<~@րd(hpFp , zzzH<pS(ыp  vT t  T0p,   $`( ((!~@Ǟ<HHWH<~@րd  (p `( (p , D vYtup,)pzD2.pWt pv u~@Ǟ<HHW0A! c0! W@~8Z^ Y(|p.Y jj<p RAʎ( q  YcYV~8@@WH48~@րd s? pq D,p44(    (^(.",4nHd(І &< z. j   ؓ~@ɞ8Ǿ4HHW@4~8ps? p0,|t,44 $(L݋ 24# w$ Г F~8Ǟ4@@W@~8pH44p~8@@W@~8p6B,s? p44,Rt4p.$$ ГP"L~8@@WWX?@ H~PUq (q ?@?@@u4 p  P 0Pp0tp@xp10 (q @@ p xx  <0 $1(u4q @JL* p xx  $1(F0* p xx  $1@u4 p  ?@0rp6sހ x    p1D  p @@`qS0dddpqd  &~PɞHɾ@XXW ~ жp0 Чd$h @ 8h<Lthp.@8LtPWp <p  (s,0 #2 ? 2p2(s,@ $@ $@s.p"$B B(s,ΐ )ΐ? )s&p"$"s!@ $@p!$#"x/x!0 #p,!q!0 #x! ! ! `P3Qa1P L s   ? p"s 0 0 sp0`6s @ @? sps0 pxx  p s ? ps   sp &s 0 4 sps  &pphP3Qa1qq~ǞW@~<TS q  bpSpq  H@ 0 Ћ$!sp, <p 1y dp@ 0p0( G1'4pt@L֋(4 440Lp\  nW3Qa1˚~@HHWP@~Hpǧw X XY   p߀ 4G!D4(lphؓ(DY Y WYNYzz݋lpLJd(2s(L݆ (  Ć@'*>~Hɞ@PPW8d488WWYWW0  !&< B  . "0123W.*pWWPD~HphpW@ L@L@L@ LLLr L  LN#2@Y' 7ܤY*Y L$І Y~HǎDPPWXDH~P ֠pd4zdz΀@.zz z * !(14  wd?Vp   z * !(1.jz 80 ((`( @~PɞHǾDXXWP?8@z~HZpd4|z؋fǗ>zz   ~ydd `~Hɞ@ɾ8PPW@4~8 z  pd4XzBLJ  ȋxdd ~8Ǟ4@@W@4~8pd4HzH4LJZ(xdd  ~8Ǟ4@@W8 z 88WP8@~Haz <LLǀp܋azw  lǡDZ   Bt $ az< hP4 ($ az< 0az< az < <!~HɎ@ɮ8PPW0!:&m n W `Q0@0 1A<    p @N0m F"  n@!  n6 F21" mn@!1@ 4@  mnnD @0!D   W8ȩP.XP TX2\` dh88W~qB$ΐF"m n mnnDϠ@D<8<<~ɞWH48~@p ГrSp ܆` w ' " 2.   0(ӧ  $~@ɞ8Ǿ4HHW@4~8vp Ћq`X(' l%# D%! ?Qa1`&! 7Rb1@&# 3Td1 &' 1Xh1 ψaw 5 ~8Ǟ4@@WP4~8 ܎ |P Є`ހ xDn@W'' ^%# >%! ?Qa1T7Rb1<3Td1$1Xh1 whW'' l%# D%! ?Qa1`&! 7Rb1@&# 3Td1 &' 1Xh1 ψc.HLWހ x  T~8Ǟ4PPWH~@pp Pd'~ dP~@HHWXH~Psp !,p )4 2 !p""W"&r& 'd=!X(*Rp'0 <DLdn P3Qa1. d z"T` nl*^ @xF)6nV {s   pR @d0 z3P^(Ћ @d0 z3PЧ^( @d0 z3P^(h~ @d0 z3P^(d,D*z d0@d z(P^,t dd0 z3PЧ^(&d z" 0yn@ dq0<LݎFX< @d0 z3PH^( p @d0 z3P^(p @d0 z3P^(pt @d0 z3P^(bp< @d0 z3P,^(*p @d0 z3Pd^(p @d0 z3P^(p{8Ptun @d0 z3Pԧ^(\w8@!݆ >"d݆ d( ,~PɞHXXW@~<p@~<@@WX<~@phJ  r,(a -Ɔ Y ta)x Ya!0@ Ћ$bz ΀ x ǀ$z pDHJ&>P&.D  Y.1@S[Y Y~@ǎ<XXWPD~Hրhp p (8LYY L*lpPpP~HǎDPPWXL~Pphz |'TYYR.T0YT'7(Y,h~PǎLXXW@~L#׸L$רP ~HɎ@Ǯ<PPWH<~@րh q(DHYYDYY gz  zYfؓY Y<Tlz VWYVD~@ǎ<HHW`D~Hph  ~Yh'7XlYY >'7\@YYlP  X  x \lX.\TYY  P(lTp Pp !\z! \Xz! Xj~HǞD``W`hHL@PT@DX\!  !H:``W`hHL@PT@DX\!  !H``W(~t.\>(;Yllt p ~XɎPɮHxxWp~Hphl$YY ^TlXL\`LPdh' 7 !(Tz~HppWhhPTHX\HL`d!  !(P0hhW ~Dph YY (Y.p#HϐYY XH؆  wY*'7 S4^(~DW?HP~XÓ  ` d lhpxhY@l(' wY~pxp p|^xt.`;^(ΰY|plh| t||#|$ʹj| x||#V|$Fx xt ~t~XɞPɾHW@~L#ʺYY L$ʒYp ~HɎ@PPWXH~Pph T$ YYLj$Y( A 9WYY fTiz zT)'>T#ɎYY T$fY ~PɎHXXWXH~PphҎǀzYYT$ȦYY ( A 9WYYdTiz zT)'>T#JYY T$"Y ~PɎHXXWXH~Pplp R70)(' (f z~PɞHXXW8ȓ $ zY88W`?HP~XAǸI"z@ pW  x hX( Ft4)" n + z(p9Rk)9#9z3#(;~ z l  p 7ܶ(*zzzBzB($*&zz>z z$>$<&ԓkz Ďt;+. V@  , pv  $&zz&>$*$  fz j p+8~(&$F*(zzzBzB(&*$zz>z z>$$&((iF ^4:$ 0i  ~ ~XɞPɾH``W@~<p  .{ p~<@@W@~8p ΀ J } {d~8@@W@~8!zp2"z"-\bpS(~<@@WH48~@p\wpXgz,zWwp|wp`z~@ɞ8Ǿ4HHW P  "p W8z(88WH0A~Dszz @@ @L30(W zz ~DHHWHA2~D t@fp@f}p |f~p 8spދ@sΐp @s pz z z z $zZZzrz@ ^Zs in:s rj( q$W~DHHW8 88W8 ȧ~4p}&~488W8 ȧ~4lllzpixz~488W@~$z$  ȓN Dzzp ~@Ǟ<HHW8@1z"( z8W88W`@HPz~Xz xp gzzz z   Ztzƣ Z\ $ !- (!(!d      q q\  ^\z V0Y( @ |$ HFz L $zz!@І@@|z^\Q^\\(92gzzzdԋtzHTY~XɎPɮH@``W8 z~4p qz  Nzd r֋ zzq~488W@z0~<@S ЋdTzzH p$z2zdzXS" (dR~<@@WH~@ z L z `p в ؋ $ \(z 䰀Y|xtX Z&pS(gp \gzHWz>zF 0zz zz(!N>`pS(x ~@HHWXH~P\8H !R~z     prq 3"\ \(\p IJp8$$q4G( Tp$88Iz3(#4>  q( ~PɞHXXW`DHP~Xp Y jnj$  Xd fPǮVRt:8(+Bpp   (  ~XɞPɾHD``Wx<@~H \p| Pt Ph tz     pJt   tPt^3^Pt3y*\q!0 \~Hɞ@Ǿ<xxWh<@H~P h hX P^`^dph /\X YR\>6 ^`Q^`p^dQ^d Y( YJ YY r 6 dpXjYd‹$\dpp Ϡ8dn` ^dn`V* Ƌq*(^dQ^d`ΐ B*(    q `q*(NX\!-X\!-~PɞHɾ@<hhWH<~@p @"(g I  YHжx|Y Yzǀ$p u\ {^ (> {   z XzL`Pq @`zz q @q z \zR0S R:z( YB (z Y#^Yp~@Ǟ<HHW`DHP~X%td}NT z.z!0(`U$|ZXǍp 0qhp0,!LzBp@ "@ *@J4L L0L LL L4q!(iz v .\  ְ֠{ p T ('2WpT v00z 0)(q:Xh,)(oX^<   0q<   q!# 2(0^WR spR2q!(0^>R\RJd L  Z  \dZd z  Y~XɞPɾHD``WXDH~Pp֐Q zְ( 2TR<F0 '(mVTְzzq10(#\UXضt䶐x|PrGPxPPZq q,! 4(0[ULO~PɞHǾDXXWH8~@րd p,8q X zz0``$zz z |Ɠ\ xNTXǘp * q ΐ $p | zz4 N  zz   zz  <pS(j~@ɞ8HHW8d@ 0 zDzzzh1Hb 4  zl(p p<< S(0dP Y88W @dPd zlzp $ (,W@~8p t@:LB:,"~8@@WP@@~HP Qu0P PP S0^p < . ` z <p! XSS < (4@"   Y=jրS( <ZSB^8S< ЂSԈ Y~pd  8P X  2 0z!4@zz k@, <p 1<dx> 8 zl~Hɞ@PPW`?HP~Xql >LJ{z HjQZH ((H2 M| ! Y(8 z3 (KZ I8H, ((G MP| !&4G G|  ~XɞPɾH``W?h@H~PpX q$   <pP s  ? p s    sp `& s 0 0? sps  p  <p s  !? !p"s0 0 sp16s@ @? sps0 6pxx  p q  x   p *x/x! !xx0 hiX3Qa1qqp.Xq$ s  ? p s     sp   s 0 0? sps   pxx p xx p h +b s  ? ps 0 0 0sp0P5s @ @? sps0 5pxx p   $ d~PɞHɾ@W@4~8p`Y3Qa1tݓf~8Ǟ4@@WPD~HddpCRh `(&8zzq<qCdZz 0 76()0NC C ~HǞDPPWH<~@p" q~@Ǟ<HHWPD~Hdc pBzp( B@jz )"q,  B<(0MAA~HǞDPPW0 !Z |ZF> q \ q     YW~sF@0" 8 1pY0@ b V  Y    Y< @B8 1p Yd@YN$<    Z\~ǞW0 ГhppWPz z~Pz,H`HPz " Y00W8d_Ԏ * z Pz P88W8d_| * z Pz P88W8d_$ V z d^ , z Pz P88W8d^ * z Pz P88Wd" Pz PW0 Pz 8d Pz PZ000W@~8dp] z ]| z  ]Lz$ $րdhzbp z&J zz8x Ɔ8<pS(d(u ~8@@WH<~@րhd  d p z"4$ zzz &<pS(Yΐv  ΐz  xu`lp` Yv~@Ǟ<HHW@~8d z |pRNpW0pp  spdZTHz: zz   Zh "pZ:p(tb*. psp1p p q$݋``@d(,  Xd o|ttDtbd(q t0~8@@W@~<pdW q1@@Bp#0@#4p"#pxx   d   x V ~<@@WXDH~Pph   `n   5TdV&dV0' Tΰzp    ' (48 j X!q,(0@":* 4~   &p (? 4   ' (47 4D  `!q,(0?*9B 3YH    3Yl( d ~PɞHǾDXXW0`T, i  YWp<~@րhp p@WZ, LJ  ' T i,  2 z3dz 2FJZ $D ,}YDFL   ((  ,} Y~n0z 1DH60z 1 Y~@ǎ<ppW@~8hdp z |Y05 iЋ ",T,i(T,i(($d ~8@@WWWWXL~Pրh0T ,.(^T iЧ^,rp  TT`(T(Y/  Y '$ ((d z .‹$(Y( T i ,l~PǎLXXW0 h(YhpXW00W0 h҄00W8h p2 YY. @ P)i&Yb*  Y:&zzz (8JqppV@#4W~Hɞ@W0 ht 00W0 ht00W80 ` `Y*&zzq Y YY 88WP?8@~H֠h: B8Y * &zz  > n j܊(zNYz*,  Y  @Y2z "0p z, 0z  07pS(s0Rz    !#z  q0 01UWY Tr ǐ$|xtX vY     ԣ   ~  Yz @gz z   `@z 0z  Rh*z V  q0 00UW l  YY~Hɞ@ɾ8PPWP<@~HY  &zzp z* (z ,pS( Y|zçzz t&z YB$zYz  XYLJz &" ǀ$Zz q^(Y|xtX <Y z  q    UWz qz z z q j` ~Hɞ@Ǿ<PPWX~@h~H aY'(( ! 2"Ћ( daZ Y 6l `RYD$ eڋ$ ' dF~@XXW(lWX@~H֐h΀2cJ(L$z2p pcL pLL 2( 2PaRaTL,_č Y~HɎ@XXW8 ȧ~4phJ.{(@(J~488W8 ȧ~4hp`(YVp(^dpZ0$pZdpdpp^~488W8 ȩ~0րhxp p^^qZ0 PLj ҀZ^Zdpp^Z~088W^lZpWZlW\lW8 ȧ~4hp`(Y$`2p\p`~488W8 ȩ~0րhxp p``q\̎ RLj Ҁ\`\`q p`\~088W`l\pWd zlzpW dh$  zz    zlW0 Г00W8 ȧ~4hpp (p~pdq(p'ppdplp~488W@~8\" Nxzzpp @zzYz  lz zYx||tPxXY "zz@ RJ~8@@W8R88W8ȓ`88W@~8j0pt @YJ@Z 2JBx 2~8@@W@~8րhp  Z. \    z@ z   j.V~8@@W8 ȧ~4ph H Z z@ ~488W@~8 hǂ(Yp,lp,8(88 "01p23W38@L LL LL LL L^L LL@ L(L LL LL LL LL LL L@ L LL L8L LL@ Ld!(` !(PdÀ zp .zd@<pS(~8@@WX8@H~P֐h  YF   Y(ǩp p Hְd zYTQZVP^T z ^TP  zzx  zdPZP<4`^a(QaYB ?N<pS(C Y~PɎHɮ@8XXW@h R YUlU@@Wh Whd!88 lW@~ ̋<L2LLld%lld A0*( 0(2,l0l'|lY~<@@W8ȓTMt88Wz0 Ћ zz $"<S< (W0 1!@WX<@H~PsЋLJ (  |  Bb ,NhЋ,N8 j* ,&d,&P      ~PɞHɾ@<XXW8X^88W@~8qPxxP~8@@W8 ȧ~4pP* P|~488W8 ȩ~08(,xW,p (Ljٓf~088W 1:!A "bzz , (W 1 Z2! z , (WH8~@ր2x   W,p (Lj~@ɞ8HHWH~@ր.x$W,p (Lj . c~@HHWH~@ր.x W,p (Lj . b~@HHW@T {\0T{s! !TSL T4B@@WX?@H~PT  p p  0"*LT* LpĔ hK0}p}p{z{{zz{ KX p @ {z{{z{p~PɞHɾ@XXWW8 _R_:88WP@~HJp}p\ zГ( {z{{z{}  p Jp p7^v~Hɞ@PPW@~8q^:p 'pz~8@@WPD~HpIb z z{z{g (T {s {{{$}{z}{LJ}|{p}z{ I'8\~HǞDPPWXH~PL8{z{p0p )\Hp}p\ z8렣 {z{{z{} @Rp Hp0pH)~([~PɞHXXWXDH~Ppd'[pt[ΐGF z| z{z{g (P{ s {{{$}{z}{LJ}|{p}z{ F'8Zx F`Zz~PɞHǾDXXWpHPX~`(9(Z$Z&6 z݋2ēz Ljzdd  ߰{ pPp^hl ;̓踋PDl}pV zԓ膣 {z{z} (plDh('1Xԧ|p z zh|(0 {! s,{{((!7'2'z"; zLjDŽ.dXd(.dWd&~`ɎXɮPHppWPD~Hp'8Wwΐ|g( &zz( '8WF^('7#7z32(z"zz((V쎀g~HǞDPPWH~@q8(7VpP >azzp!"z'z pŋbpL !zbzzpzzpz~@HHWXDH~PpL'9UplA ր}h z`  {z{ z{z{}  zD A Πphz zgzz'!81z+tzz zzz pq l"H(xT@ h'T(\~PɞHǾDXXWXH~Pp@'(:,SSp {z. z  npZ  (H 0W z @ z~PɞHXXWPD~Hp>0( A 8Wp >~HǞDPPWXH~PpX'8RB=( A 0W >  Dzww  " =~PɞHXXW@~<pp'Q6< ,|z (< ,~<@@WXH~Pp'P<`z42gzxz \z Hgzz   (΀T(z$( A 0Wz z  ; ~PɞHXXWH~Dp'On( A 0W~DHHWPD~Hp'8O:zԓ6z ( A 8Wp :~HǞDPPWPD~Hp'8N:zp ( A 8Wp :8~HǞDPPWPD~Hp'8M9x( A 8Wp 9~HǞDPPWPD~Hp'8M9z p6zp ( A 8Wp 9,~HǞDPPWXLPX~`pP^^^Ч(>,00'Lz   z >z (z  z!P^P^Q^P^^VP^"Pz(z PP$rgPzz! P^^^^7\z  &d P ^7`VPV7~@zH zP^7L^PP^7.^Pz  .>Ч>(7 C>W^Pz 6p^^ 6T ΐ<×>zz0z  zv  nz  P^6"Pz! PgPzz" PP#<5ދ5nhW<%' \%# <%! 0Qa1T;Rb1<5Td1$2Xh1  ,   H`4ր}\ zP0 {{zz{{}  4P^H 3} pְ} 8{+ s,{{z{{ }4 ΰ p   X(;G(!:RnT 6hzzlzhhÞjlzz lPz! PgPzz" PP  D~`ɞXɾPLWLPX~`p>pǧ (^p^,0`'9F   pD (J(0W Jǝhzz( =߰   " *"8z(z 88"g8zz! 81 |$zVV|1lLz |1J*z( z|1z  |08z! 8g8zz" 88$|0LJ0|zrp&$zz$(z(Vp2(z" l Lj &p Lj^PThzz&f 0Ǟ䀧  !pLj4$zz$(z(Tpp0P^x÷XpzP^P^t^pRVP^l Lǝz  h  zz|.(! =6z((9Bv-|z (X|^x^tP Lj$$(zz"$(z (-h zD z{z{h (T {s {{{$} {z}{Ǩ}|{}z{h-D0<^tP , zz$zz$^lP>Xz2XzzXXzz@ &  xpr z.^xP&ΐēϦ$zz(z$(X|^x0+ zГV z{z{h (P{ s {{{$} {z}{Ǩ}|{}z{ +\^xP z$( A 0W8z! 8g8zz" 88Ύ4n`*  zi|* ~`ɞXɾPLWPD~Hqǘ (7>jq F(I 0W~HǞDPPWh@~Hx$Ǩ (="zz .gzz ),^z gzz DnPW'' \%# <%! 0Qa1H;Rb105Td12Xh1V ( z,z  .\kjP ~Hɞ@hhWXH~PpH'(:,$b 3$<| 3~HǞDPPWH~@q((73Jxp~@HHW@~<p@'3r~<@@WPD~HP)82y pwz|Ԍp`|((|z|rHW&zz|(V(76z%#z4#zz zz F zz z p xLj~HǞDPPW`?HP~X΀h*(<,1> z{`z|w zz 6Ѹp  |`\,' n%# F%! ?Qa1l&! 7Rb1L&# 3Td1,&' 1Xh1  z )z" Պ | ~XɞPɾH``W@~<p'/rzgzzJzz  V~<@@WX?@H~Py ΰ):.ʋ:pW (     WXL~P 0@p~(,0#4+ >T~PǎLXXWXL~P >TZ 0@p~(,#4+~PǎLXXW@A~<s p~<@@WP@~HH+p`L|n .LLLaa 82  L@  !ΐ `'8*ߊ|*`(* $*rxY *RXY!Y    Y ̓*$),Y!112Y! Y0)((( "@ rA 0 @Yހ`#' 1D0 @Yހ`#' 1م4qw@p@zp @@@Y~HɎ@PPW@~8p!p( `~<`q<><~8@@W8 ȧ~4p`Wt~488W@~q0 A.q$FO  1"~W`HPX~` ж PY^@  ^@ ^@^<dp( q! _q!q.q  0(YY\\dZPTqq(YdާPD (%@0 ;\ (%.ddP*Qx (%x^^LP^HǠpǐހ,*<%\'9(%F  +4f 4484@ 8   @І @$@H `Hz.І$ -0 ;z($z  +(<$N  +J fh$X@J!Jz @ (` r  +  #@$d ~Pd^\І%#^^\W, -0 ;~(̧^,#4z@J!Jz  @ L ^\@%PX n^L|XTPɧ^Dpz j^XPXzp tzxPx"F^XzPz^XPz 8 01q z z z^Tzz zz T tz xP2x!^Tz Pz z^T^TPz 8 01q z 펀@z P -  @<8 .z 2^\zP^\@%PX R^D@P X &@ L @ P @  ` @J!Jz^H@$%Pd -   \І@^PP [~^<  ^@\^@` (C~`ɎXɮPH``W詞8~@ps ( 8Ά YώHt|жxX NxY0GA1z×z 8 0G"z A1zz'0.0BA1z(!zӆ Y  Y~@ɞ8W`Hΐ ~Pp q΀ І( )0 7 (xv HHH@z  )p(zzȧ . hx !  l  !@ lp x pl`l *Іz)r T@TTXX`s(І6z)̓V  \T\r  \T\J~PɎH``W8l llN88WX~Ht.xtpр  (PT PPTT`@P  (І&5 P@ T   H@@\І2t '0 8(\z,08`Hz .І$ '0 8z(`\z &l ll Jz" ,v 2 |< pl lHl l0l@ ll ll& '0 8h~HXXW@~8qXX?  X<ٚ><6@@W@~8qXX?  X<X ? >X<8@@WH~<q``?  `@B.`D  !0  !.`@.עBFD@x~<HHW@XX?  X<\>X<2.X  ! ^ !.X><@@W@~<qXX X֜~<@@W8ȩPP PTd88W@ 88 8  <8<|@@WP@~HVVx|s p p '0 #x/x! " p| pԀ  t( Yʋ؆|` s  ? p s     sp P%0 s 0 0? sps  %pY,| t(ֆ YB||ttxxYxG~Hɞ@PPWP@~HVVx|s p p '0 #x/x! & p| p҈ t0( Yԋ|a s   ? &p0 #s,0 #0 #0s.p"#2P5&@ $s,@ $@? $s&p"#"s!0 #5p!% YHY. t|0 ( Y||ttxxYx1~Hɞ@PPWP@~@rB H(YjC4HLьYH(‹0C .HL^YY~@PPWX?@H~P s pZ sp(p  ,f 4!$ $ B@ !|P P: !Ć &`Z d !b$  ,. (,!v (!YB@ (P 0 Ws Y~PɞHɾ@XXWH<~@ssp(pg ? Y&(H"YYxJ(!Y$(,!Y( (!tY ? ~@Ǟ<HHW@ 0 #@@@WXDH~PzȎzP*;hΐ@zzsp <qГ. *,(     zsp߁ x p x Ɠ  <  @   ,,~PɞHǾDXXW`DHP~Xp×z qp q p߰ (߀Ȏ(7(h   Ћ (0!` @Ѐ  (!Z@  Ѐh (!p 8!X  0 q`  2Ѐ@  0 qp 4h@ @   !Ȇ p0 q (PX `((( 0(`>Ȇ&1 ,(,  04( ' q)  & { p {  .~XɞPɾHD``WhDHP~X  z z zsp (pȎ'8(HhzsÓFj`,Ȇp6 B  vP<Ч^d ((x |( :, ( ( (8 ($ p""W"(H ދ( :v( z( j( F(Ѐ 8 x (   8L Q^d  .    $ ?( Z   hgxx p (aB($( (( `z ,8@  "8($7G #4V8 , pװp "7' .(+  J `" ' 7 #p `# ' 7$" #L 8 Z8 `! ( `` `  f  T  ^dP . `'ÂP    < Њ ȋ~XɞPɾHDhhWhLP~Xp. ! `Ȇ vpߠ   pp`  . p $` $( ؓ  (pȆ,'>GN(GN,z` j ! .`0 # ! .`  8 ` 4@ 4  .`((~p""W"8  `# d$d (  ddd d@ ( d8 (d  g@  d  0&8'H$7 Ǹ0;$RXv  ? _  8H   . 4` ! !, ! !(`<8@x ,g@  0^@   (`($$  0(p t @  '  $ <Њ z(D` _   8(,| `j ?    . @(H (x  p`   `! )p""p>` # `# ' 7$" #| `h48(0   D `" ' 7 #` $ (``z$,D  < Њ   ~XɞPǾLhhW@ x((Ydsp0(1|s. $. >$|4@@W@ x((Ybsp0(1|sl. $. >${@@W@~0 ֧.2 . j@@WXDH~PqȎP':( s sp(߀ < mY6'm *@m m ԋ4m m p""8W" p(Hp($  p(  p(bp(V  ^* (8  2p(,  *†Y~PɞHǾDXXW@Yb xpp !H xpp\ !G@@W@x (Y@x`(YYY Ћ$Ԋxaqp G. 2&(Y$4ppЊY@@Wd  H$l>pl. YW~p"ppЋP@p0 p( 2B!p~W@ ~8TYXp@2\< <;>: 84 b@ @@ @ˈ@ Fpb W~8@@W8 ȧ~4XpZFpb$W@~488WP@ ~HXp ߀ ʺχ,,ؓLǨ^x N  (!CxY  rD&4 Fpb(WG B~Hɞ@PPWX?@H~P ߰Xpϗ,4 (Y  ċ$@@ @&8x)   Bnx(2 ^Fpb8WxY_Fpb,W~PɞHɾ@XXWH~@pAX1'$΀  HpW@ @&@ @@0!  (D`Fpb8W  vp@ @^@  @F@4@ @]~ . ~@HHW8688W@~8TYlXp4YD@4 Ǹ@ @ ~8@@W@~<Xp@Dz@ @Wn4~<@@WP<@ ~HX߀@ Y p0 A dXAx$.@ Y,(@ ޠǷ x  !>x  g(.Fpb8W &(xY[<p,@a@  @H~Hɞ@Ǿ<PPWP<@ ~HXp ߰@ Ylχ,,Z֐xǨ(   <xY  H)0. "˜G  " '8 ,( 0!@ (Fp!b4Wx~Hɞ@Ǿ<PPW`?DHP~X Xp  ߀ \$ѴY`+tp *Ht 0! ti!Tts! @f!n\  \  R$\(\\$d\  R2( )<(~XɎPɮHD``WP@D~HX߀ pIXa!@ 6 ,   ΋2 .  @ ~HǞDPPW8ȓ88WY WW@ x`((Y ( x`z"(&x` (xtz (@@WX<~@ x`((Y \pPq} Zր}8{( s,{{z{{} lphtJ.<t!70x>#xx.HHv~@Ǟ<XXW@A r@Y&@@W8ȶ (~88WWX?@H~Ps(6 sqprpp߀f@f@.Y` ߠo p g@  Òz  Tp Yz  0z     &fY*`  `  ‹JÇpq T\ ~xp  Sp 0 &|q Sz pT.  Г0~PɞHɾ@XXWWP?8@z~Hΐ@z szsp<pk@̊ T̆   o  p($bsl ? p0 0 0sp0P5   ? sps  %p,b* @   ,,~Hɞ@ɾ8PPWH8~@pgzszs13p20@o$zpT'( F  0 ,ԋ 4p߀g@ߐ{s 400d p1    q, 44 x xx0j  080Ǘ00#0)  004 @ѧs G xh`n  :,    f@s Ɉ~@ɞ8HHW~ljy `  1JèL!a@ A 0$A   J2ւp (b(g  ~ɞWh@HP~Xp f@ ǰ  zs@ C4p6dp@߀o +q xx p8*$pxxq qptxx q 2 ( <k@ "$ (; #$   ( ^d,p! \p\^`  q  3 0q   +0{`  qrx\ A@  q! a - a P^` Ϙ Q^\zp T!(2sp!bP/QaP/[paP/[ã8;bP/S%*0`#(@^` p P^`r (2hqp p(ppp@:(0^\P^`P^`  L^\PP^\ x@  Ay ( 9 ^`q^d,p! n` ^d,|.dp(0 g 0 0@ 0^~XɎPɮH@hhWH<~@ppp. 8gJp~@Ǟ<HHWh@HP~X` 0 0@ 0^<``p߰f@ { ǧ VzspRPЀo ^d(2  zs p p\Pf4ǎ\ p\df\(p(  p\xe\(p( p\|e\(p(  s $. >$fTd s  zp<   "pW    ^ p  zspd <k@ x pp\Xdv\  p \"d@\     l}q- p p  p  \ -!0p1 #  qa a  ,)p(0 .ȓc@ 0 0@ 0^x     0440  04`d !{ !{,d !{  !{  H, { p{ `h~XɎPɮH@hhWH~Dpssp opTY2~ $. >$U ~DHHWH~Dpssp opTY60*~ $. >$T|~DHHW@ 0 #]"@@WH<~@A VYV@Yl ssp qo (V   ~q BD Y\'Y&&$ Yq  Bn~@Ǟ<HHW`8@H~PPf@^XTЧ^TX^T pg@߰o^\| ^ TF *@ Փ p@n\(^TT^T^X@P^X( #~PɎHɮ@8``W0! 8Y00Y 8  8W 8  8WH~@B xp2 !1qx(pxx t'YxZxxxxttxxp 8>PY 8 x 8x*  8 x~@HHW@~8p px 8` v` 8,  8րx xx  xxq~8@@W(?X~ s p!pY^p0Y s p!,Y(Y` .  Yȋ\   X'!4J  X'!4Ҋ Xn\,' \%# <%! 0Qa1H0Rb100Td1:Xh1p. >$4: X'!X\ X'G!s1 1(#4      Xq `d  zz,̎"DzD D@ @~ɞɾWP?8@~Hs p! s p! Xq@ F@pb$WD@ `@    nFx4Ϙl8y D4*2,X (" s p !! ~Hɞ@ɾ8PPWx?DHP~Xq s p!bpY $'T T !p""W"b!b!p""W"t! t !p""W"Y zqVDpY `zq$z  <`z ? z !s&zq0VHXp b P   b b Y̎ YY  Y/У  xFa   8s! !~(, s p! sF Oda  (zz,̎"DzD D@ @ Yj(` YJ Y F$ XPxX!88::<<>>PP('4W  X(!Y(` Yn ^ Xq  @Y(`  Y X!< <Y(`  Y X!< < X(!HJY2 v wv"ĆY `   `    X(!);# X(!);#|x \(YN8:>\ <\<@ <^R_S.`< <: :" : :*8 8: :> >> > > > \8 8: : : : : :L: : : : : : 4UT8 8<0 <FTU8 & 8: :< <> >8 0@ 86 8 8< <0@ : : : :'4W X(!); l d Y>~lFdl ΆY hz zq AV@T);Wd ~lY X(!);("4Wx X(!);XV X(!);4(hz zq AV@);W~XɎPɮHDxxWH8~@ǎpp&XF4O@ @ @~@ɞ8HHWP<@~Hs p!pYp Y'`  YXX$`    N `   Fpb( W~Hɞ@Ǿ<PPWP<@ ~Hs p!pYp Y7`  YXX$`    2<  `   Fpb, W~Hɞ@Ǿ<PPW8@0! ! 4  $X!Fp%"b,W88W80pW,Op!!X""4WOp!!""4WOp!!X1`0    ""4WOp!!""4W`Op!!X""4W$Op!!p88W@0@~<PO!pq!7 A a0 1$X!"` ~<@@WH48~@ Opq!l z1 @! a@ AXa$Y$7Qa1(\  P$*0 x H$(i$X$7Qa1Fpb8WTi$X$7Qa1$((    $*0 x HF$(i$X$7Qa1       JV1 6 `   7   !((G 1 ! a@ AXFpb8W>i$X$7Qa1$( p |$*0 x H$(i$X$7Qa1       ~@ɞ8Ǿ4HHW@~81Op!!Xq0| nFp!b4W^g,X,7Qa1Fp!b4Wh,W,7Qa1,0~8@@W"`"hW@~8"` z"`Tp"h>0 "`ls"hqTh~8@@W@Th q $"`8>@@W@~<q*&`z zq !V0W~<@@W8ȓ$`z zq V8W88W8ȓ$`z zq V  è:@$  ||΋P^\D&  |~|P^\|Fp"@ |F  |,:>\ސ* y AZp ~azp ppϘJp?  pW   r    FJ@ 4     z uTixp  @ n  p\upJ r:0   zLqpR@ p ڋ0    @ J  qep  uy  p   yhpt L@ >  y(s y&y xw^\P y~XɎPɮH@``WP@~Hp@a " @:}χ$>>v& x0Hyd@ @~>   . n>@  :v x0Hxy. <hޠ"xǘx DvT l (@0  '> |@ޠ  (u @a@ 2<p @{ ~Hɞ@PPW@ @ @> UT|@a 2G  @{>@ @n.U . @@W@~8p0D0 "D1 nD1r,Txu ,02'4W'4W  ^$& x0Hu$,& x0Hu,>    p0 PP`  gW %' l%# D%! ;Qa1h&! 5Rb1H&# 2Td1(&' 0Xh1g P"^;Qa1h&! 5Rb1H&# 2Td1(&' 0Xh1G~8@@WpDH~Pp(t  6|T!T!p""W"t!>!TljT ^ YFnfB(b(YFpAb0D :WÇ>^8`:b<d>gP(]Ff(FFpAb0D :W(>FpAb0D(:W8^:`<b>dFfPg(]&^  Y'4W|RNpW'4W@'4W0'4W '4WY2  ȋY: T(҆Y8:>T <T<@ <VRWSǎX< <: :" : :*8 8: :> >> > > > \8 8: : : : : :L: : : : : : 4UT8 8<0 <JTUV8 & 8: :< <> >8 8@ 6 8 8< <@ : : : :<TTURVSW<  > > > >   < @ (8   g:8    :  0:   :   :  :    :  @ :  T(X Y: DFpAb0):WY~PɎHǮDppW@F8:<>P(W@@W@~8p΀! @ @:nv@ ԓ~8@@W@~8p| kVk '4W@a @  @oB@a  @:oj k, jk G'4W@a  @n~8@@WH8~@p G@  z ><T4UJ@   @ F@ @lTGs>6g W'' l%# D%! ;Qa1h&! 5Rb1H&# 2Td1(&' 0Xh1gP"\;Qa1h&! 5Rb1H&# 2Td1(&' 0Xh1G~Vd~Lސ" V\ DR"( Sސ"T nRS T L>4ш\B\ U V"#( ePGG" ސ"  e~@ɞ8HHW8!4W88WPD~Hp(D D! VD!p8>  xހ8 >>  ހ@  {'4W{~HǞDPPWH~Dp d  zz*̎ DzD DD 0@  @~DHHWH~Dp@&@ @D 0bD~DHHW8 A> RRJb020 0 (* @(0,,,88W8 z~4s!#p#zqs~488WpDHP~X\-#P^dP#^lP^h  f\nl`l #Ol #Nl #N# ## ## #  #h #  # #  'nd^hΐ X` 0Ѐ`^`n` @ }  @ 480  ,00  *00  200. )0 p16 1#00  800  00   )r΀wh    d w@   0X (ynh^hQ^h^lT^l^dX^d# ~XɞPɾHDppWHP(J@ 4fYup< @ @ @@ @2@ @ a@ Fpb Wu~@Ǟ<HHW@z~8r΀ Xp`Fpb$W<   @ ~8@@W8z  X`!Fp%"b(W88W8z  X`!Fp%"b,W88W`DHzP~XzF TD2 0`,pD YTC4 0`,p( Y Xp`8÷<  X`(:*N8    $<      `~XɞPɾHD``WxDHP~X!` XP^w^w P^wnw0p`*VRpW @  @Z *( * (q`Jnw @   nw(nw H\V ΐ  nwƋ!] qZ @  @   nwqpQ#p e ^h@  @a   @ @ z$ @NwdqpQ#^hTW^wnwnhp `Enwnhp dEz` `d `dP^nnw.`0xǎdnh nwnhp P0 V^pFpb8 W   L@   D^p(^pJ p& Df( ǎp"   pD&^nP^nnn@nn`0nwnhp (0 #Cȋ @  @b\ @  @   nwqpQ#p e ^hċ  @  @m` Jnw  x    nw jnw   .h ΐ  nw !Y m2@ @  @l` Jnw  d̓ r   nw  Vnw   T ΐ  nw !X l @  @ k nw6 p! ! ! D R ΐ  nw ċ!W kVnw @n . &~XɞPɾHDxxWP<~@pn pD?pH?D DH HDH DL?Da    Dp?|L dǎL p $~@ǎ<PPWP8~@p pz  ԓJ pπ pϐH> L>H HL LHL .L @ >j  p>NLa    L p>"~@ɞ8PPWH<~@H pD=~D ppD=D tp  ~@ǎ<HHWH<~@ސ`\y @D p  @ @X#p (~@Ǟ<HHW`@HP΀~X Xߐ` 0p` <  W^_W^^8  )<0  !&D T  @0 4(&@ <  D<@  <  <  )<0  !&D T  @0 4(&@  `  e.     z" xi8    J     h  Lt8      H  ,8    "  6 (0 p1 1#  6 (0 p1 1#X Bn_6 (0 p1 1# n^6 (0 p1 1#  <  pK.0 8  p! ! !v` ΐ   !O bH ( b(~XɎPɮH@``W@~8p!7N@ 61 077 1 0 \΀7    !M  @~8@@W8 1BN@ 6A @BB0PA @  B0`:88WH0 08~@zr qp#7 pϐ  D5LD  > 2z? 8 '5 ~@Ɏ8HHW8 qp1#' p 88W8 0 1" @  4j   p4J88WH<~@p p Xߐ` 0߀`p 0 7 p! ! !x .     ~@Ǟ<HHWP@ΐ ~H 0p`]   0 9 p! ! ! >       | !   0 9 p! ! !LXv      ΀ !H  \:~Hɞ@PPW@ ~8q qp1#' p <0>~8@@W8 z1 qpA#' p #088W`<@ H ~P Q^X߀`0p`W ^p#p d0dsd @ @d @ @d@ @@  @g H(  pр#P^P RpS0^P`X^P`^P^P ^P^P^|P^xP^tP^p z~ǎ@ bx X.t \.X X\ X\  |  |!  `.>` '   ((((Fh((!p""W" ! @!(( &!΋>@(@(:l(( & !~*(l( 2!N6         r   b      <         !E      x   d   P   <   (    8&'0@  !  7'03 @ .   ! Cދ~ # (*(""p""W"           p  z    @       p  zZ     p  z LX4z,$`2 X)p \)xX X\ X\x  X X\^ \ ]^ø8 d)d g  Xh(X^X( ^^Xh`   @   `@ p   TFp!b4W2&on  h @ @@ @h @ @@ @d@ @@ @<  @  .@  ?@ @X@a  F.Dz:PD@ @Ǟh  @ T  Π <xދ(@h8   @Π  0   (4W (4W     p   68Fp!b4W &on  <  " ¡n   m, ~Ǟ j,,,m0008X  $b2,,Fp!b4W X\A  0 #$02,,Fp!b4W^Q^^p P^p^tP^t^xP^x^|P^|^P^^Q^^P^^Q^^XQ^^0Q^^X~PɞHɾ@<Wx@HP~X\-#P^g^\P#ȧ^`fng :n``n\ΰ pߐ|P^tP p^pP`^l^`^hng p  h 8hnt "b.h"np & p "8 *zc3 0 t$0 PLL 2 . a8L4nzc0 0~l v f< < zc1 0^pP^p^tP^t^l P@^l ()^gQ^g^`T^`^\R^\#ng~XɎPɮH@xxWX?@H~Pzzspzΰ zspΰ  # (  pp|< <n< < pߐ`zc3 0 T   z@  0< <=I 2 . ^ 6` IJzc2 0 n> z`>@<004< << <Y~PɞHɾ@XXW8  p`688WPD~Hzpzspz zsp   p߀|<Yzc"!0Y 6&40zc!!0RYzc# 06Y< <~HǞDPPWP?8@~Hzΐ@zspz zsp   <p~G  3G,( `  $ PQ8 @  4,~Hɞ@ɾ8PPW@~8pzs #p!z zsp  ! p߀| <~ (" ,P(0$ ,PЋ(0, Q 0Pz(0cfcfcFcF4 E* x p x E ~8@@W@~8pzs #p!z zsp  ! p߀| (" ,O2< $ ,O`4cc< T(0 0< << ==44N܋< $==44NNccƧ Ch x p x "C\~8@@W`<@H~P p 'H4X8z"zspzΐ zspΐ  ^\7 0cf16 Pc30c!0p23W3cF0 &cƀ0 c08^\ ^\^\ p^\)2^\ z^\h^\ pT^\D_<^\ *^\^\^\6^\ ^\^\ p^\_^\ ^\v^\f^\VT^\ @^\.^\^\ ^\ ^\^\^\ċ ^\ ^\^\^\x v^\ `^\N^\>^\. ,^\ ^\ ^\^\ ^\ ^\^\^\E@ p l pls  ? p pls 0 0 0sp00 pls Π Π? sps0 0pxx p a^\EB p l pls  ? p pls 0 0 0sp00 pls ΐ ΐ? sps0 0pxx p  ^\ ^\ ^\^\ ^\E@ p p pps  ? p pps 0 0 0sp00 pps Π Π? sps0 0pxx p a^\EB p p pps  ? p pps 0 0 0sp00 pps ΐ ΐ? sps0 0pxx p  "^\ ^\ ^\^\ ^\E@ p p pps  ? p pps 0 0 0sp00 pps Π Π? sps0 0pxx p a ^\EB p p pps  ? p pps 0 0 0sp00 pps ΐ ΐ? sps0 0pxx p  8^\(&^\ ^\^\^\ދ^\ ^\^\^\^\ ^\p^\ ^^\N^\E@ p ` p`s  ? p p`s 0 0 0sp00 p`s Π Π? sps0 0pxx p a ~^\EB p ` p`s  ? p p`s 0 0 0sp00 p`s ΐ ΐ? sps0 0pxx p   ^\  ^\ ^\ q p^\  ^ ǧq P@^X^\@R xx p Xn\ a    ^XR^X ( < (0(*="z,$   ` ^\  B^\  0^\ ^\ ǧ^\xx p@ a ^\B  ȋ^\  ^\ ^\ ^\ |ǧ^\xx p@ a P^\B  86(tǗ( `c& ^\  ^\ ^\p ^\ _(= z,$^\  p^\  ^^\ q J^\  8N^\  "^\ ^\ q^\ $   ǧ q *^\x/x! !p,@ a^\B rPD^X^\DRxx Xn\p a*  ^XT^X ( c^\ @  ԋ&   =B~PɞHɾ@<``W@ 1  @@W0# 3! (WP < @~Hcΐ p p߀|D p .8"LL L p(Ws JL 044= c,  p `  (0@ == =44p 0s֔ JL 044= c,  p `83, < <44:@ == =4402sN :>L(4 c, cFcFc c3c!~pHW c0,LR c, v,, c3@L L, c, , c1,L c, , c2,Lf c, ,@ c#,L c, B, c$,L c, , c%,L c, ,h c(,LF c, j,  c),L c, ", c",L c, , c!,Ln c, ,H c&,L& c, J,40"s@ N0L$ 04q4= c,  p ` p 0P  (0@ == =44 (7 0(0<1p980 <@  ==< < =' 04 q)4sȔ NL$ 04q4= c,  p `,3  446@ == =44  4.~HɎ@Ǯ<PPWH~Dzp4z $. >$~DHHWH~DzpT4|z $. >$j~DHHW | x Yxsp0 0sp0 0 1# (Y"|s  p|4WH~@zpA#zspz0 0zsp0 0 1# (Y cYvc"@c$@YF$c' 2c!*!p""W"z(0YY~@HHWP<@~H\-p`ޠހ#ذ#8  `ħ #| #f# L:L L LF ާ B JL@@ާ B  q# ~HɎ@Ǯ<PPW@0~:pWr H \ P 8   \ P 8  L*pD2 2& 1 ۋ 2 0 >6 ~ 2 0B @ @ `P/Q@ E΀ 0 4@ @D4 A  @   l.@\@  ,  x l T  B >2 2& 1 @~WH<΀ ~@ p` p# DPD`  0 p# DD`  pr  a   h~@ǎ<HHWH<~@p`  p# D&D`  p#  ap#  p#  p# z~@ǎ<HHWP@<~@sq`8lN0 "l0 bl0( F HJ LNF*4 YF*YFz I KM O : ާ B 6@ާ B Y~@ǎ<PPW0 `@  1 3WH < ~@p q p# D> '(( d(D  LD  8D` @  D LD  <D@  (D  D ~@ǎ<HHW@4~8p'  F   ~8Ǟ4@@W@~8q'@ P2 8d0 '#' ~8@@W8 ȧ~44pp"t~488W@~8pp~8@@W@~8pnLJ , ~8@@W@~8p x qx8~8@@WX<@H~Pۋ p g<)p*(R  {  ~PɞHɾ@<XXWX<@H~Pڋ pHp { q{gր& (Z ( )8   C   ~PɞHɾ@<XXW@1~p  ~W@4~8p H(p qr)| q)~8Ǟ4@@WX?@H~Psΰ0 ) a( z(  A(L F(<̐" 'ɧpH (6 9(&̐ 'Ч' ~PɞHɾ@XXWX@H~Pq ) b )8x  F ),` +: )>T T -> )>T TV *> )>T bT /> )>TJ T ~PɎHɮ@XXW 1@ (2 S B WC: (A   WP48@~Hp#VVzb \΀;z$+& !p ~Hɞ@ɾ84PPW *#z  W~pAz!V"1V1~a#z\#zzF0"$ B$ $   ~WP8@~Hqzz$ )  $LL$L$L$ Lz#zL #L$L$Lp#L#L$ L$ #~HɎ@ɮ8PPW8 ȧ~4p $#z. $(2   "0$$#~488WXDH~Pq.z" T1"z ()8 T#z$ #0T#z( #T$ T#z" # ^T#z  !L4T#z  #T$ T#~PɎHǮDXXWH48~@pzrzV6 &6  N pq ˎ   ~@ɞ8Ǿ4HHW`?DHP~Xp&Ž %   [ '\&X\z, \ * ')z(70\8($ pǐ \z ( +7~XɎPɮHD``W`HP ~Xp#zwא$נ$װ$ Ӏ#z#z''fz( \1jfF\#z #\a#z  4z(   z ( 0~XɎPɮH``WH<~@p#z 'z" !`! " &!@,֋((‹<z'z"Lvp 5~@Ǟ<HHWP@~Hs>LB֋fLaJ'`0''.Lzz( 0~HPPW0 0 #z"z''1  ' 00WP@~@zs>D20'x'Dp'zwDz'H1D ''HBDz'H2Ha #zL$z'L1҆΋"L#z #H#z #D~@PPW@~8ր' p'(F'0s s '8 '8'8p`~ !'@ ދ'(' '(~8@@Wh<@H~P'0d '0` !!  X'8   z*"!!Hq4~X4  (~(ΐ. 2q.'0'0  ~PɞHɾ@<hhWPD~Hr'@f '0'0H '0'8tċ"'8'@~HǞDPPWPD~Hr'@f '0'(FH '0' І "' '@~HǞDPPWXD~Hr '>P\ \ '>T:8 TPTP P~HǞDXXW@~<ppz ~<@@W`DHP~Xr px  pנ| ? ؋'7 <'ڋ'ʆpxW‹4X‹ȓjq Pqt* T.p 腦 "q   p(      !)(4' (~( . q ~XɞPɾHD``WX<@~Hp NNT2ώO\>$'>L T  .N ^~HɎ@Ǯ<XXWP@~Hs'@ p (0'0 (0'8΋h '8r '@8'0l'@ t '8~Hɞ@PPWH<~@y' tyX'p t~@Ǟ<HHW8'v2'H888WPT0>D0|D!D @LDL>HDH  DD@PPW8ȓX @X'@688W@~8p `< 4<a <  ~8@@WH<A~@s '_q'\a'^a'] 'Yq'X@ 'TD( DDq'p@@'P@D<DwDFlDaqDp.Da!'ܓDD`  ~@ǎ<HHWXD~Hr ̐ '>P@P '>Tゆ@sT̐P .P0@p`!Tp120'P / TP $P$TP.T`(/0~HǞDXXWxDHP~Xp/ ö̐ (>`dZ``(( <` $ (>d d`(( (>h.`@ p`!dpQRP^l'P /5V / /`  ‹fnh(gN( @hpT1 @p  ΰ?'PFGã'S^pP^t :$pPQ^pS^p ̓:mP/X `mP/X&bP/YpbP/Y&!)" .t>l 8^tPҧ^t@nt(= l ̐~XɞPɾHDxxWXD~HP LpTLT'޲Tp$'@TL0 A( z( R Z( a(,T@L T f2Z(a( F A( ! " z( A!.LHTLba(z(  !T TL !  pW L LT' VLT'vBLT'*&b  *H8PDRX(̧@P§RPX$p:t",'>'&  0(J:0MC0NV LT'8΋MRMVLT'NMDLT'nLT'vMAptMV LT'8鮋FM2TN1MMV LT'(X'@^Zp@WbLT'춋NLT'8.LT'&LT'*PD~Hq  ˀ֋h0ː˔p)X!B˕p)X!" ddnPPppuspp bp1xp|p)X!Bp}p)X!rp~!p"Xǁ'8~HǞDPPW`H~Pq'HȆs p&p'&rX\ @\&"rXX@@ &"\\(\z*X1>p  p1N\ z(4\s 'XXa#z ☓p   '0 0('N\ zЧ(4\'z '\X~PɞH``W'@'8' '0'(''0' #1  W@~8p΀ q~8@@W8 ȧ~4p q~488W8 ȧ~4pPvp0d~488W@~8qP0px~8@@W8ȧT.XT88WH<~@p 'q%'09q  'q0#d u o x 6o x  )Zs $ǘ 2) 2c D )(~@Ǟ<HHW`8@H~P  ˋ ʋ -^p.T=^0MV@B 0    @ q!Ŋ|q΀0  Tqp~PɎHɮ@8``Wth \ P D 8 , G xF@G.؆DDLLGGXGG`GGhGGpGGxG GFG GG012X12L10 ! G/")G#"L FXFF`F F1hF@FQpF`FqxFFFFFFGAGFBFs`FL xW;W0DWLW LLW#>$PKDB>W8 ȧ~4p'0L` zWDXDwtpד~488W ' t!WH~@p'\H.>J 6 z*.> wtp~@HHWH8~@É ( Bpנp'( W wtp~@ɞ8HHW ' tW0 '1 "t W8  z  88W@~"i!. tT0Y< p $)(i 0(iڐ! (i !Ƌ(i!ZhW%' l%# D%! ?Qa1`&! 7Rb1@&# 3Td1 &' 1Xh18 z  "hW(%' l%# D%! ?Qa1l&! 7Rb1L&# 3Td1,&' 1Xh1 | p z4z(j7T W  &T 7T*W~Hɞ@PPWx<@ ~Hp'Ǡǹ`P..P!( !z00n`W%' \%# <%! ?Qa1H7Rb103Td11Xh1P ( wt((p  ~Hɞ@Ǿ<xxWP'P'P'2'WP<@~Hp ܧ$`X(' l%# D%! ?Qa1l&! 7Rb1L&# 3Td1,&' 1Xh1 kY)' n%# F%! ?Qa1l&! 7Rb1L&# 3Td1,&' 1Xh1 kZ3Qa1''Āv>|'p''q|'p''&~Hɞ@Ǿ<PPWXDH~P8ְ' . |' ' |''nX p' z bzz Dz" 4* Dz"  3 \R  ;\ 4 $*0  $Ǘw'< f $+0 $r Zd~PɞHǾDXXW  WP<@A~Hzxz΀p@ ΀pW z  p ΀ p ΀| bpDz΀Z `B΀8Dz΀"  Dz ΀0  "  ̆,Dz΀ ܋Dz ΀Dz 4 1P 00 ^g4W %' l%# D%! ?Qa1`&! 7Rb1@&# 3Td1 &' 1Xh10 !  WDz D   l΀b΀X)  6)  ȓv  ~Hɞ@Ǿ<PPWp<@H~P[^l ,nl (vlp! XWlpPǞX^hP(0^`Q^d `P/Qn`pǀǮd^p z$z, zX  .†<$nl^hW(((Ljq$dǞ\P^dP(P^`(( (vz(v* &z &( (xz(x~PɞHɾ@<ppW8 ȧ~4ppt&z&&z.$z"( (`~488W`@~HZ(pz(pnPY)' ^%# >%! ?Qa1\7Rb1D3Td1,&' 1Xh1 LL~Lp,p!(Wpp$ "(rz(r$zgX(' l%# D%! ?Qa1`&! 7Rb1@&# 3Td1 &' 1Xh1(tz(t~HɎ@``W@~8p0r p0r p "XY~8@@Wp@HP~XP^lx (jp!\W$z"\ `P/Qpߠ(0` `P/Qpߠ(PΰpP^hͶd p r$z"+* H(^hW +)  u,0r F d0r !0S^l  &z*$z $((  6چP^l 4P^lP^l 0  p`X%' l%# D%! ?Qa1l&! 7Rb1L&# 3Td1,&' 1Xh1 gX%' l%# D%! ?Qa1l&! 7Rb1L&# 3Td1,&' 1Xh1 $z $&(,d:l~XɎPɮH@ppWx8~@rpޠ0r p ޠ0r H0JnLY)' ^%# >%! ?Qa1P7Rb183Td1 &' 1Xh1n\X(' ^%# >%! ?Qa1P7Rb183Td1 &' 1Xh1 H~l~@ɞ8xxW!WW@~8px<R$0p'x,<~~8@@W8 ȧ~4pw ~488W8 Dz Dz 88WH~@p'v((<( #(6 (w nDz D~@HHW@~<p "Dz D~<@@W@~8p((hP3Qa1A DT2P:~8@@WP@~Hqhh | ' &~~ 2|rp|rnƋ4 )zȓeh~`` Ť~Hɞ@PPWP<@~Hp(i " z @ ^gY%' l%# D%! ?Qa1`&! 7Rb1@&# 3Td1 &' 1Xh1nX3Qa1nX3Qa1d Π * ~Hɞ@Ǿ<PPW@~8pnW3Qa10~8@@W@~8qnX3Qa1nW3Qa1R~8@@W 1~p` ,` p g^3Qa1~W   a!:  a! qW   0   WX<~@p z RHHfnLY3Qa1H(^~@Ǟ<XXWX?@H~P xp)H)H z)L)L )P)Pu z|  p (Pc p)T)T ( "xzz   p ( z  ^ x2~PɞHɾ@XXWXDH ~PÐzxp))zz pð@ ))f( Rp!)!!)'7((p23`W3% (<! ( ~  j$  $ xp( )))0,P0 Wn))Z& ))2b $ xp( ))N`W3Qa1`W3Qa18`X 3Qa1`X3Qa1  0B,zz)): u ~PɞHǾDXXW@~8pn))hzzz uV *B  j* ( z@`,W3Qa1( l  )(> ,    ")( zzz  zpz8p Vxp  v ) ,HWoJ~@ɞ8HHWP<@~H   xp   zz k~ )(ex   h Y 3Qa1hY3Qa1x&x )z"zzw g\ &özzz@ z  r zz  zz ΠpWùgzzzz 0zzzz rxBw  md zzz} x "z w z x ΐ   pw w  pǘ i X3Qa1iX3Qa1cv j*  z     l"~Hɞ@Ǿ<PPWH8~@x Π Ǘ n kyb i~@ɞ8HHW    ! W    W@~8p)(pD,w )(~8@@W8ȋ)()()(88W`<@H~P  xpxpq  'D* ^! !h(( `,Z3Qa1(.Sŧ^\pH4nXY3Qa1iZ3Qa1j^X3Qa1(iZ3Qa1pDnY3Qa1 Z zd\^\x(X(27s  2!/x$ 27 '/(( ! "X( * * `Q3Qa1d`,Z3Qa1(. F( > ( \ ,~PɞHɾ@<``WH<~@p!xpϐ p  ()\( z" Bzz~@Ǟ<HHWH~@pp p v8 fp ρvw  ρ'8-*1$G'8=+01$G~@HHWPD~HpPTnW 3Qa1n W3Qa17. LX3 X( ; Ba e0gz@ z& @0 fp  1@ d̋p3 @6`A~A bA JAZ4NA :A 2A*$ $#4!~HǞDPPW<@H~PAP^p p@ a.ps" xx  @ @ z@ )D)DώXjX^lhW3Qa1  JnW3Qa1 FTǐ, (($zP^lnW 3Qa1  ^lnT3Qa1琎F z    ݋zz gzzP| ^|  ^|(%%z" q ^|zz ^|*zz"0(#q!   zz ""&nX 3&Qa1øn$X3Qa1(,>$*+6Ў } p zW^r^rzU`j ^rX(' \%# <%! 0Qa1H0Rb109Td14Xh1zT w ^lQ^lmX3Qa1} XZ^|P P^|$ &zzBBz Bz     Z  O|Pt ^t^tkX 3 Qa1nh]3 Qa1  mX3Qa1t 0.m^h3Qa1tO tO 0 2m^h3Qa1p i<i@iL<0T,(LDZP^l  *<aT &  Fp  ,( (, LD (<" r d X gBzz*zz UVB ! !4BzBD h z"z T ! !&ǷDXB !h& !(&  h zz  p Th  h&zz  ( & ! !&BDh zz6z  S zz ! !z,z" z\pVzLHpWp\pHp8\p  z pW(hT4(,( (,  ob4(TTǸ(gZ[zj\\`z`D`igZQ0z& Xz&X`ZT V`j  z   zX   z ZlV @z ,t-\  t"^tQ^t z lz z-q" xx  ^lX!$k&zzz "0g,Q(&&&! !(0 np<z! !       ( d$l,,, ,T ,T,TaZzZ \ z`,(T`j  z   zX   z Z $g(TTzz('8 ( z    0'$ "$0 T DPa  PD P h~`ɎXɮPHxxW8 ȧ~4p z(` jz`  zd   zX   z zz ~488WiP*P*P* ijW@~8ǀ$8 T(p g  X3Qa1gX 3Qa1   P  !"$&~8@@W`DHP@~XqІ@(d$$ñ&zz$$7)  `W'' l%# D%! 0Qa1l&! 0Rb1L&# 9Td1,&' 4Xh1  pR :  (         P  ! "&( $ ( -0j~XɞPɾHD``W@~<p6 2q$ ~<@@W@4~8p$ǐzVJ~8Ǟ4@@W8 88WP?8@~HǸ$xΠ$w / 7  5 5 5 5r~p p  Z  &~Hɞ@ɾ8PPWW@  L2'0p23W32.*28 *.$#>$@@W8n@ bzfpǒaaaF >p"9p8,0,ap9,0,appb  9,0,bd  9,0,dhgf9,,hfgd9,db9,ba9p8,p0,b& 9Ph5,0,bd& 9Ph5,0,dPhgf9h5,hE,hfgd9h5,db9h5,ba9,p0,,"  dbzfB  a a n@Ɏ8HW@~8{p*pPB  2b$  bw*|~8@@W`?HP~X{`֠* {ǚ Ǻy gz@zz.$!( 8  ,r XiZzz X z Z* qi@i {~XɞPɾH``W  !$WH~Dpp 8Wpzz pb  z   zX   z xP zz`  z   zX   z Zzp R zz  z   zX   z (,vz f$z:XzЀІ *z z xp zpp  І   Ў    Іx  Іd  xBQ Zi<i@i<0T,(Ћp   kY 3 Qa1TpzЋjj\<WFRІjHjH&ZpXzz@ d  e<>zz -<(z<0VZ`J  : p*p p  p&zd('0`t ~XɞPɾHDhhWH~@p   TF N*`4p:΀ ~@HHW@~8p$ǀzp\z zp.N$W0p ~8@@W8 ȧ~4pz:6p Wp pz $Nn~488WP+0P+4P+0WXL~P|(z,0jPjPpx(Bgz ,zjXjXz/* ІRJ  *jTjT)ڋ(nW 3Qa1×n$W3Qa1(,>$+0) BnW3Qa1#` W 3 Qa1z$ (0S($O(~PǞLXXW8 ~4qK~488W@  L2'0p23 HW32.*28 +0.$#>$ @@WP@~Hxwzp$Xp'` h  Z3Qa1hZ 3Qa1      І&"V  *2z z3 1 0 ²~Hɞ@PPWX@H~PpAǷzΠ@ Π҅p hW Π+0!M Π .x hΠ` ΠP  G4Π,Π$ Π ~HKvHnT[3Qa1 Π T Π & k^T3Qa1d .GH P: *ΠΠ R  $B ~PɎHɮ@XXWH<~@!t &py~@Ǟ<HHW`?HP~X!Ǩx'    z t (ù   Lù (Z  "jz z zj`n$Y3Qa1 (>$,  hY3Qa1 vΐ!!('÷j`n$X3Qa1 (,>$ ~XɞPɾH``W`HP~Xp!z zt  ZXnX3Qa1<  ϑ$n\W3Qa1 n\Y3Qa1ǷnX3Qa1è\$(,>$ *`0gY3Qa1g X3Qa1~XɎPɮH``W8  z 88W8 ȧ~4p)$ v *~488W@~8!bpp;<gX3Qa1~8@@W@~8!bpp:gX 3Qa1~8@@WP?8@~He|x6  w"VwWx e~Hɞ@ɾ8PPW( ا~Dp>L0 2'NDǾTL^@V^VVR" Lh  2 $ D , @  "'e~ɞɾ(W ~2 0q7B@ AqE qr pqqpppp  ~ɞW@4~8p @cjz hܣ X b0L^nzX4h ;dWzg !  z \ X L(@s z d$jjȋjpׁjЋ b&, F)z ГHΰwz jjȋjpׁjb&+  &+րkPjp kXkZkZkZ kZjp kXkZkZp jȊyjp kXkZkZ kZ kZjp kXkZkZpfkPj   *\  ^nzU†()& ~XɞPɾHDppW8 ȧ~4 jh *Tzp  zU:~488W8Djjjjj Jk`f rjh88W8 Lz  L  *Djjjjj k` 4Djh88WX@H~PTpϮT|zz >jpp|S"} ֐} 8{) s,{{z{{ } S6 jljzjjp jxjzjzp 4jjjj|(njjp !j' hz z(jjpjljjp !j' hzp zp(jjpjj!jp""kh(8#)&jjp jpzzj j jpozjdjzjjp jxjzjzp `jjjjzjjp jxjzjzp jjjTTjjp jjpjjzjjp jxjzjzpZjjjjpjpjzjjp jxjzjzpjjpjvjpjzjp jxjzjzp~jjjjpjpjpjp~PɎHɮ@XXWP<@~HqjkPkPkPx kZ:zLj$ސjkPk\p kXk\k\\jkPp kXkZkZp&pkPkPkP kZMhz z (0kP!#p23j'#)!yzz< pkZ kZk\jkPp kXk\k\(jkPp kXkZkZp~Hɞ@Ǿ<PPW8jjjjjj jjjjjn88W8k` nk` ^88WP<@~Hk ְj  p<PkZ`k^  D  \   kk &  kk kk @ .  kk  ll  ll  `l k^  l P鰓 kkk @ Hll2 kkkf kkk  kZ ~Hɞ@Ǿ<PPW0  @ ll  ll   ll $ll00WH8~@DVpD z'(6(.p"" W"Fpppp | h~@Ɏ8HHWH<~@ p (6(.p"" W"Hpppp (. ؓ~@Ǟ<HHW8 2\0 1 "18$ b2 R" 0B T088WH~@p pjjj &jjXjBjjjjpVl$l$E`zk`2\l8 . Zl8l8jl@jj  k`1zE&l@~@HHW8jh~lHjlHjjtl@2jjl@l@2Z88W@~8pCzjh6lH*lHӶl@1zD~8@@W@ j(( " Z#j j hJjjjjpjjjjpl$l$j j jjjjpPLj j rjjjjp@@W@ ~8jppjx'r'r(r~8@@WP<@~Hppsޠjxj2 ᆰ ް ~Hɞ@Ǿ<PPW@ ~8jppkX'r'r(r~8@@WP<@~HppsޠkXjB ᆰ ް ~Hɞ@Ǿ<PPW@,lP,ʶlPlP`<4<`a@aAlXlXыDlP`jl` jh@@Wh<@H~PްkhlhЀklPll^\\X "P  s\   ? p"0 0 0sp00@ @? sps0 0pnXxx  p 1+Lǎ\}1tD$4^XP^X^\P ^\ ްjlЀjPl^d\` P  s\   ? p"0 0 0sp00@ @? sps0 0pn`xx  p 1+Lǎd}1tD$4^`P^`^dP ^d ~PɞHɾ@<hhW8j mhmlmlĎ*j mhmnmn88WP<@~Hk`@ F jjqpj  鎠\(p 0ް @B2r"Ӌ ޠ ~Hɞ@Ǿ<PPW !(W8 ȧ~4mmp Jmmmmmmm~488WH<~@jπ(pmh rᆐ  ڎސ ~@Ǟ<HHWH8~@jzj|plhj~ jxj{l`   8 t  HkZk\plk^ kXnk[l`    t  p*ސjkkPj ~@ɞ8HHWH<~@pAj(jjj8zjjj j6 pφp& `pz 8"k`"p" &z 8~mm!m. . M.mj$|z 8pmp ׌\Bjjjjjpk`,pp 0~@Ǟ<HHW@~8p6zjh:j`,Ӷmj$z7~8@@W8jjp kXkZkZlkPk*kZ  P8֋kP88Wjz ԋ`jz@ ! l(l(jz l,l,jz l0l0`jz jzl4l4W@4~8pjԊ jz ހԊ Tjz ހ " xxRԋjzu~8Ǟ4@@W@~<j mhmjmjmjp4qD( ȓ'<(`51(70R!p"" W" ܓӬB Ӛ0 ӊ z 4j L\D( mjlHl8k` p \ Djjjjjpk`pp Ұ^k`p ҆4p$pp tp~<@@WX@H~PTԂpbjjpjzp jxjzjzp|jjjjT`jzjp jxjzjzpjjj  jq0pkh @ p1A!6p@jq0pkh @  p1A!6ppbjjpjzp jxjzjzpjjjjT`jzjp jxjzjzpjjjj~ p   ؓόfjpjzjp jxjzjzpjjjjT`jzjp jxjzjzpjjjjpkh&jpkh&jpkh"j~jpj~PɎHɮ@XXWH<~@  ހ' p-ǘ $ |xy| - s֎~@Ǟ<HHW ( dq  0 sp t0? sp0s  >s p ? p WP[D Ib GG(GG0G8FBP [D! Ibɂɢ (F`Fq0FFA8FFLB` W`ɀɠ WLW!rr, AB(Wr 0!WP[WB!/W!/W (! W (! W 0 W0 / @ކ@ # 0ATE#" 0@0W L03001!13"001!01$W 1NW OW 1N O2W0 m*mm 00WH~@2 . ?.mm<hpmm< #( p_~@HHW`<@~Hh*z|pR &  x& $ $P9P .PW~Hɞ@Ǿ<``Wh?@H~PnX3Qa1f8p &v* :n\X3XQa1(.Xa2 z B x#c  s    '@h az  z &qmppp*p   '<\"& '. :  L &~PɞHɾ@hhW~p @gP 3 Qa1~WpPX~` z4nY3Qa1 p $$x& P Hb' 7 G N(G N,G |N02h` az  z &߁mL&  ( tx9P .tW ,0&z &R$B x&2$"f& d9P .dW Z~`ɎXɮPW@~8p#n  #~8@@W@~8@ az  zpm7 *(A7!p%s4gX3Qa1~8@@W @(#)conf.c 4.6 87/05/14 @(#)config.h 4.4 87/05/14 Ѐ Ѐ    < (PB? w`#8@Ȁ\^`r d2( < `@d( \P^Ѐ`hn0253Ѐ,H$h`$h` 5p55+P-H/X\P^Ѐmdmn55IJ0KX55555Ѐ,̀0D02F,FĀGtPwx55555L`M<MNԀXpQ؀R|RTЀVq0qq555555555555555555555555555555555555555555555555555YXYYZ`[!aPaXhDaLa`ahapa|xaaиaaaaaa>4aH>4aaaDa@a X$RX/Vundef1.0standardridgeSASCIOMTSMDFDLPANSIKEYBDISPCIODEBUGCIODIAGCIOLANCECIOENETCIOTTYCIOLPCIOISBXCIOTAPECIODISCCIOSCSIMTEXTENETSASAL @(#)linesw.c 4.4 87/05/14 @(#)config.h 4.4 87/05/14 (|Ԁ0|5555Ā5L5|Ԁ(5555&&!"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""&f&d","@"T"h&"|""Ā"؀GG G,# #TGP @(#)bio.c 4.4 87/05/14 devtabbflush: bad free list Cache: number of buffers %d binit @(#)clock.c 4.4 87/05/14 @(#)debug.c 4.4 87/05/14 @(#)errlog.c 4.4 87/05/14 @(#)fault.c 4.4 87/05/14 pfault before vfaultSLLLTLTLtune.t_prep + 1 >= countfault.cpage read errorvfault - bad dbd_typepfd->pf_use == 0fault.cpfd->pf_flags & P_DONEfault.c @(#)fio.c 4.4 87/05/14 closef:DTYPEfileNFILE @(#)flock.c 4.4 87/05/14 bVb\bbbʀeeeeecbbeeeeece e\eeeeeeee\eeeeeeee @(#)getpages.c 4.4 87/05/14 run vhand DANGER: vhand needs swap space p->p_flag & SLOCKgetpages.crp->r_flags & RG_LOCKgetpages.crssttsrp->r_flags & RG_LOCKgetpages.cgetpagesgetpages - pbremoverp->r_flags & RG_LOCKgetpages.c WARNING: swap space running out, needed %d pages DANGER: out of swap space. Proc %d cmd %s Killed (out of swap) rp->r_flags & RG_LOCKgetpages.cpfd->pf_use > 0getpages.c @(#)iget.c 4.5 87/05/14 inodeNINODEno imtiaddress > 2^24 iaddress > 2^24 iinit - cannot read root superblociinit - not a valid root file system @(#)intr.c 4.4 87/05/14 spurious interrupt : IOIR = %x @(#)machdep.c 4.7 87/05/14 NO PAGE TABLE SUPPORT ON THIS MACHINE looping... @(#)main.c 4.4 87/05/14 etc/init growregvhandvhandbdflushbdflushschedsched @(#)malloc.c 4.4 87/05/14 DANGER: mfree map overflow %x lost %d items at %d  @ @ @ @ @(#)move.c 4.4 87/05/14 @(#)msg.c 4.4 87/05/14 Can't allocate message buffer. Ԁ̀\0 @(#)nami.c 4.3 87/05/14 @(#)page.c 4.5 87/05/14 rp->r_flags & RG_LOCKpage.cpfd != phpage.cpfd->pf_flags&P_QUEUEpage.cpfd->pf_use == 0page.c(pt->pgi.pg_pte & (PG_V | PG_REF)) == 0page.c!rp || rp->r_flags & RG_LOCKpage.cpfd->pf_use > 0page.cip != NULLpage.cip->i_map != NULLpage.cip != NULLpage.cip->i_map != NULLpage.cpinsert dupno kernel virtual space size %d %d %d ip != NULLpage.cip->i_map != NULLpage.c!rp || rp->r_flags & RG_LOCKpage.c @(#)pgtalloc.c 4.4 87/05/14 size >= 0pgtalloc.c(pt & POFFMASK) == 0pgtalloc.c(pf->pf_flags & (P_QUEUE | P_HASH)) == 0pgtalloc.c(pf->pf_flags & (P_QUEUE | P_HASH)) == 0pgtalloc.c(pf->pf_flags & (P_QUEUE | P_HASH)) == 0pgtalloc.cpf->pf_next == NULLpgtalloc.cpf->pf_prev == NULLpgtalloc.c(pf->pf_use & (setmask[nfree] << ndx)) == 0pgtalloc.cpf->pf_next != NULLpgtalloc.cpf->pf_prev != NULLpgtalloc.cpfd1 <= toppgtalloc.cpfd1 - pfd == npgspgtalloc.c~ @(#)physio.c 4.4 87/05/14 IO err in swapphysio: useracc failed @(#)pipe.c 4.4 87/05/14 @(#)prf.c 4.5 87/05/14 0123456789ABCDEF%d%d:%d%d:%d%d Double panic: %s panic: %s %s on dev %d,%d device error bn = %d er = %x,%x assertion failed: %s, file: %s, line: %d assertion errorWARNING: system table overflow: %s (%s) @(#)probe.c 4.4 87/05/14 @(#)rdwri.c 4.4 87/05/14 @(#)region.c 4.5 87/05/14 regionsREGIONSrp->r_flags & RG_LOCKregion.ci <= limregion.cpt != 0region.crp->r_flags & RG_LOCKregion.cup->u_procp->p_flag&SLOADregion.crp != NULLregion.crp->r_flags & RG_LOCKregion.crp->r_list[0] != 0region.crp->r_flags & RG_LOCKregion.csize > 0 && size <= NPGPTregion.cpfd->pf_use != 0region.cswpuse(&map) != 0region.cdupregrp != NULLregion.crp->r_flags & RG_LOCKregion.cchange >= 0 || (-change <= rp->r_pgsz)region.crp->r_refcnt == 1region.csize > 0 && size <= NPGPTregion.cgrowreg - ptmemall failedgrowreg p1 - ptmemall failedj >= 0 && j < NPGPTregion.clim >= j && lim <= NPGPTregion.cfindreg - no match @(#)sched.c 4.5 87/05/14 swapout(%d) p->p_flag & SLOCKsched.c @(#)sem.c 4.4 87/05/14 ^<HH \ 4 @(#)sig.c 4.5 87/05/14 ......L...LLLLLLL.........core @(#)slp.c 4.4 87/05/14 proc on q @(#)startup.c 4.5 87/05/14 %s release: %s version: %s on %s real mem = %d K avail mem = %d K @(#)subr.c 4.4 87/05/14 @(#)swapalloc.c 4.4 87/05/14 *cntptr != 0swapalloc.cswpuse count overflow - %s @(#)swtch.c 4.4 87/05/14 @(#)syscall.c 4.4 87/05/14 @(#)sysent.c 4.7 87/05/14 5<pHx 0$P(8<Ĥpʰք֬H5̰P5d5XLxP85rp@<55K8@@|5555555555555555555555555555555M TX(Q8M\(NN[Rx_xWT,XU^P55]55l6| @(#)sysridge.c 4.6 87/05/14 66666ڀ667 7x7<7T @(#)text.c 4.4 87/05/14 xalloc - bad magic @(#)time.c 4.4 87/05/14 M:/w///:/AY/Yp @(#)timeout.c 4.4 87/05/14 timeout table overflow @(#)trap.c 4.8 87/05/14 HG\GĀGHDHDJtFHtG(JHHI$I\IÌJJ<JH%x regsave != 0trap.cPROT or TRANS fault: va=%x pte = %x no pte trapuser = pid = %d uarea = %x ps = %x pc = %x trap type %x Privilege Violation at Address %x for Process %d comm %s Invalid Kcall at Address %x for Process %d comm %s Illegal Instruction at Address %x for Process %d comm %s Data Alignement Error at Address %x for Process %d comm %s Accessed Address %x Illegal Trap %d at Address %x for Process %d comm %s Memory Parity Error at Address %x for Process %d comm %s pid %d killed due to page fault read error comm %s syscall Integer Overflow at Address %x for process %d comm %s Integer Zero Divide at Address %x for process %d comm %s Real Overflow at Address %x for process %d comm %s Real Underflow at Address %x for process %d comm %s Real Zero Divide at Address %x for process %d comm %s Inexact Result at Address %x for process %d comm %s Real Before Trap at Address %x for process %d comm %s Check Instruction Failed at Address %x for Process %d stray interrupt at %x @(#)utssys.c 4.4 87/05/14 @(#)i_syscl.c 4.7 87/05/20 return from bind(%d,%x,%d)=%x acceptsorry no struct file lib rights lib from sockargs:copyin from:%x to:%x len:%d @(#)i_usrreq.c 4.7 87/05/20 bb8bDbTbxbbbc$c܀exeeeeeebeeuipc_usrreq(%x,LISTEN) uipc_usrreq:accept(%x,%x,%s) uipc_usrreq:shutdown(%x,%x) uipc 1uipc_usrreq:rcvd(%x,%x) uipc 2uipc_usrreq:send/dgram(%x,%x) uipc 3uipc_usrreq:send/stream(%x,%x,%x) uipc 4piusrreqIPUTIPUTunp_connect2unp_disconnectunp_externalizeunp_gcunp_gcscan @(#)sys_socket.c 4.6 87/05/14 @(#)acct.c 4.4 87/05/14 @(#)alloc.c 4.4 87/05/14 bad free countno spacebad blockout of inodesbad countno fs @(#)bitmasks.c 4.3 87/05/14 ???? @ @ @ @ @(#)blklist.c 4.4 87/05/14 ip->i_map == 0blklist.cindlvl >= 0blklist.cip->i_mapblklist.c @(#)exec.c 4.5 87/05/14 @(#)exit.c 4.5 87/05/14 @(#)fork.c 4.4 87/05/14 no procs @(#)grow.c 4.4 87/05/14 rp->r_pgsz+change >= 0grow.c @(#)ipc.c 4.4 87/05/14 @(#)lock.c 4.3 87/05/14 ,Ѐ@ @(#)ptrace.c 4.4 87/05/14 xȀ$   @(#)shm.c 4.4 87/05/14 shmat: prp.؀\8P @(#)sys1.c 4.4 87/05/14 @(#)sys2.c 4.4 87/05/14 @(#)sys3.c 4.5 87/05/14 vĀ؀,mountNMOUNT @(#)sys4.c 4.6 87/05/14 <tҬT΀Ӝ @(#)bsdcompat.c 4.6 87/05/14 selwakeup @(#)i_domain.c 4.6 87/05/14 @(#)i_mbuf.c 4.7 87/05/20 mbinitm_expand() = 1 m_expand() = 0 mgetm_get(%s):%x m_getclr: mbfree twice-- m_free(%x):%x m_more(%d,%s): failed mgetm_morem_more(%d,%s):%x m_freem(%x): NULL mbfree twice MBFREE(%x,%x)m_copy(%x,%d,%d): empty m_copym_copym_copymget MBGET(%x,%d,%s) %x nospace(%x) m_cat(%x,%x): joined(%x,%x) new(%x) m_adj(%x,%d) %x m_pullup(%x,%d): mgetbad %x ̀؀(4<DLMT_FREEMT_DATAMT_HEADERMT_SOCKETMT_PCBMT_RTABLEMT_HTABLEMT_ATABLEMT_SONAMEMT_ZOMBIEMT_SOOPTSMT_FTABLEMT_12MT_13MT_14MT_15 @(#)i_proto.c 4.6 87/05/14  aaQ(U,ULQxunix @(#)i_socket.c 4.7 87/05/20 socreate(%x,%x,%d,%d) solisten(%x,%d) sofree(%x) sofree dqsoclose(%x) soclose: NOFDREFsoabort(%x) soaccept(%x,%x) soaccept: !NOFDREFsoconnect(%x,%x) soconnect2(%x,%x) sodisconnect(%x,%x) sosend(%x,%x,%x,%x,%x)sosendmget!%x,%dsoreceive(%x,%x,%x,%x,%x) receivereceive 2receive 2areceive 3?%x,%d(%d)mbfree twicereceive 4mbfree twicesoshutdown(%x,%d) sorflush(%x) 4444sosetopt(%x,%d,%d,%x) @||@|||@|||||||@sogetopt(%x,%d,%d,%x) sohasoutofband(%x) @(#)i_socket2.c 4.7 87/05/20 soisconnecting(%x) soisconnected(%x) soisconnectedsoisdisconnecting(%x) soisdisconnected(%x) %x sonewconn(%x):bad soinsque(%x,%x,%x) soremque(%x,%x) socantsendmore(%x) socantrecvmore(%x) sbwait(%x) sbwakeup(%x) soreserve(%x,%d,%d): ok bad sbreserve(%x,%d) sbrelease(%x) sbappend(%x,%x) sbappendaddr(%x,%x,%x,%x) sbappendaddrsbflush(%x) sbflushsbflush 2sbdrop(%x,%d) sbdropmbfree twice @(#)hwdiag.c 4.7 87/05/14 ,4<DL,T< @(#)iomachdep.c 4.5 87/05/14 adr=%d , status=%x board address=%d type=%d UNDEFINED unknown type bypassed (can't dma beyond 16Mb) not configured overflow max board = %d %s number=%d d_write returned error on dcb move @(#)me.c 4.4 87/05/14 meload: %s inexistant Chargement de %s sur SAS%d meload: %s ne contient pas du code 68000 MELOAD: textsize=%8x, datasize=%8x textstart=%8x, datastart=%8x, totalsize=%8x dcb0adr=%8x meload: typepdev=%2x%2x, etat=%4x meload: arret du co-processeur impossible meload: initialisation impossible meload: adresse de chargement inaccessible adrIM=%8x meload: typepdev=%2x%2x, textstart=%8x, adrue=%8x meload: erreur de lecture meload: erreur de lecture meload: mauvaise fin de chargement meload: mauvais lancement MEWAIT: type=%2x, pdev=%2x, finordre=%2x meload:(fin sur timeout) typepdev=%4x meload:(pas d'IT appel 2) typepdev=%4x, statbase=%8x meload: dcb0adr<>: old=%8x, new=%8x SASINTR: type=%2x, pdev=%2x, ioir=%8x, cr=%4x sasintr: type=%2x, pdev=%2x, apres IT etat=%4x sasintr: type=%2x, pdev=%2x, IT fantome ... /etc/emc/ @(#)mem.c 4.4 87/05/14 @(#)mt.c 4.5 87/05/14 not ready statusoffline statuswrite protected%s on mt %d mtcommand(%x, %x, %x) mtstrategy:blkno %d,nxrec %d,b_blkno %d density switch not on BOTdensity not availablemt %d : error blkno(%d) > nxrec(%d) ; ;<;<;<;<;<;<;<; ;<;<;<:;<;<;<;<;<;<;<:mtstart(blkno %d,nxrec %d,b_blkno %d) mtstart:b_active = %x end of tapemtstart:cmd(%x) mode(%x) addr(%x) bcnt(%x) @HE,E,EE0spurious interruptmtintr:cmd(%x) mode(%x) ioir(%x) blkno(%d) nxrec(%d) unknown commandIITHH܀Hmtioctl(%x, %x, %x ,%x) (8((8(((8( @(#)prof.c 4.4 87/05/14 @(#)pty.c 4.5 87/05/14 PPQ$PQ8QQPPQ` @(#)rawnet.c 4.6 87/05/20 rnetwrite: out of mbufs rnetwrite: out of bigbufs @(#)smd.c 4.7 87/05/14 no vtoc areabad block list too longinvalid partitionSMD d_write errorSMD disc errorjjjjjjjpjpjtjtjtjtjtjtjtjzjzjzSMD d_read errorSMD d_read errorSMD d_read errorSMD d_read errorSMD d_read errorSMD d_read errorSMD d_write error%s on disk %d 04@L`t̀؀ Off Line Timeout Equipment Fault Write lock error Tranfer error Data overrun Sync. error header error CRC error in header Data check Seek failure Unknown drive type Unknown error Illegal param. in DCB order @(#)smlog.c 4.2 87/05/14 SYSTEM MESSAGE LOGGING OVERFLOW @(#)sxt.c 4.4 87/05/14 ~@tttDy8{|\|}@}~@~d~~ Ā^ ^^0d^^^^lsxt cannot allocate link buffers @(#)sys.c 4.4 87/05/14 @(#)tt1.c 4.4 87/05/14 Flush(%x) *48\Ԁl({)}!|^~'`\\ @(#)tty.c 4.4 87/05/14 tt` 0@((<<PPPPP<<<<<<xx|`{}~ABCDEFGHIJKLMNOPQRSTUVWXYZ @(#)tv.c 4.3 87/05/14 014B DF @(#)wbal.c 4.10 87/05/14 CIO %d PROM Rev: %x CIO %d CODE Rev: %x CIO %d PCA Conf: %x CIO %d :Error - Board Firmware version must be %x or greater. WBCIO: error wbreset %x %x %d Ā(WBCIO: error wbflush %d WBCIO: error wbflush %d CIOerwrit hd!=tl %x %x %x WBCIO: error wbsendxoff %d WBCIO: error wbsendxoff %d WBCIO: error wbsendxon %d WBCIO: error wbsendxon %d WBCIO: error wbsetbrk %d WBCIO: error wbparam %d %x WBCIO: error WBCtest0 %xWBCIO: error WBCtest1WBCIO: error wbresetbrk %d WBCIO: error wbmodem &d WBCIO: error wbmodem &d DTՈdՈՈՈtՈՈՈՈՈՈՈԄB\TtְȀT܀CIOerit case= %x CIOstit case= %x WBCIO: error wbintr &d O.S. messages -- OFF O.S. messages -- ON  2Kn,X `%K @(#)wbct.c 4.6 87/05/14 ct %d : cartridge not loaded ct %d : cartridge write protected hTꨀ8鸀넀Ѐ h@@\H4ct %d : end of cartridge bn=%d ct %d : end of cartridge bn=%d %s on ct %d ȀĀhĀx܀,t$fLffffff@ @(#)wblp.c 4.4 87/05/14 LP:Error - Board Firmware version must be %x or greater.      ʀ LP: *** Error - LP Order = %x after interrupt. (Should be 0) LP: *** Error - Return status byte = %x after interrupt. LP: *** Error - StartDMA called while DMA in progressLP: *** Error - About to start DMA, but LP Order is not 0. Order = %x @(#)clist.c 4.4 87/05/14 @(#)partab.c 4.3 87/05/14  @(#)kdbn.c 4.4 87/05/14 %s %x temporary %x permanent %x perm %s pid = %d %2x%8x: R%d.p.t.x.|....Ԁ// %8x, %s %8x: %2x%2x%2x%2x%2x%2x %3u %s %d R%2d: %8x SR%2d: %8x %8x : %2x = >4==L=@<<Ā>>>>>>>>Ѐ>>>>>>>>R2 : %2d Addr2 : %8x Mode : %s %s PC : %8x pid = %d %s %s Address : %8x pid = %d 0123456789ABCDEF̠ p@pΰ(dϜLtа(\рԀ  0@LXdp|̜̘҈ҔҠҬҸĀЀ܀?? LOAD , LOADB , LOADH , LOADD , LADDR , STORE , STOREB , STOREH , STORED ,  $0<HT`lxӄӐӜӨӴ ,8DP\htԀԌԘԤ԰Լ(4@LXdp|ՈՔՠլ ո $0<HT`lxք֐ִ֜֨ ,8DP\ ht׀׌טפװ׼ (4@LXdpHHXX88hhHHXX88hh((((((((|،ؤ,Xٌ<Th|ڐڤBCDEGHKMSTL 0@Pdۀۈ۠ۼ܀,`|ܔܰ̀ list of commands (all numbers in hexadecimal): ---------------------------------------------- b [address] - set breakpoint (Phys. Addr.), or list all breakpoints bv [address] - set breakpoint (Virt. Addr.), or list all breakpoints bt address - set TEMPORARY breakpoint (Phys. Addr.) btv address - set TEMPORARY breakpoint (Virt. Addr.) ca - clear all breakpoints cb [address] - clear breakpoint (physical addresses) cv [address] - clear breakpoint (virtual addresses) d address [count] - display data (physical addresses) dc address [count] - display code (physical addresses) dcv address [count] - display code (virtual addresses) dd dev unit part - dump memory on disk (dev, unit) , partition(part) dr - display registers dv address [count] - display data (virtual addresses) e - exit debugger g - go to the end of current function k - kill current process or go to Panic load - used to reboot from disk (dev, unit) m address - modify sequential data bytes s - single step t address [segno] - virtual to physical address translation Integer Overflow Integer Zero Divide Real Overflow Real Underflow Real Zero Divide Inexact Result Before Trap USER PRIVILEGEDKERNEL DEBUG ELOGR ELOGW TWRITEC TWRITED FLUSH TRAPEXIT ITEST REGN REGNB VERSION MAINT MOVE , NEG , ADD , SUB , MPY , DIV , REM , NOT , OR , XOR , AND , CBIT , SBIT , TBIT , CHK , NOP MOVEI , ADDI , SUBI , MPYI , NOTI , ANDI , CHKI , FIXT , FIXR , RNEG , RADD , RSUB , RMPY , RDIV , MAKERD , LCOMP , FLOAT , RCOMP , EADD , ESUB , EMPY , EDIV , DFIXT , DFIXR , DRNEG , DRADD , DRSUB , DRMPY , DRDIV , MAKEDR , DCOMP , DFLOAT , DRCOMP , TRAP SUS , LUS , RUM , LDREGS , TRANS , DIRT , MOVESR , MOVERS , MAINT , READ , WRITE , TEST > TEST < TEST = CALLR , TEST > TEST < TEST = RET , 2                    FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF̀F؀FFFGGG G,G8GDGP @(#)if.c 4.7 87/05/14 2 @(#)raw_usrreq.c 4.7 87/05/20 UUV8X`VXV`VXVWXXXXXX<V0raw_usrreq @(#)route.c 4.7 87/05/20 rtfree @(#)af.c 4.7 87/05/20 bbbbhhphhpbbbbbbbbbbbbbb @(#)raw_cb.c 4.7 87/05/20 @(#)if_loop.c 4.7 87/05/20 lolo%d: can't handle af%d @(#)in.c 4.7 87/05/20 @(#)in_proto.c 4.7 87/05/20  @ppyylP` $hЀ0@ULinternet @(#)ip_icmp.c 4.7 87/05/20 icmp_errorn8oom6mpn8oomoomHm\nn8n4n8 @(#)ip_input.c 4.7 87/05/20 ip_initforward: src %x dst %x ttl %x 2 @(#)ip_output.c 4.7 87/05/20 @(#)raw_ip.c 4.7 87/05/20  @(#)tcp_debug.c 4.7 87/05/20 vvBv %s>,URG,,RST,FIN,ACK,SYN<%x%s %x %s:???????? [%x..%x)@%x, urp=%x%s%s%s%s%s%s%s%s%s%sPUSH%s%s<%s> -> %s rcv_(nxt,wnd,up) (%x,%x,%x) snd_(una,nxt,max) (%x,%x,%x) snd_(wl1,wl2,wnd) (%x,%x,%x) Ѐ؀  (08@HP\ht̀؀$,4<DLT\ATTACHDETACHBINDLISTENCONNECTACCEPTDISCONNECTSHUTDOWNRCVDSENDABORTCONTROLSENSERCVOOBSENDOOBSOCKADDRPEERADDRCONNECT2FASTTIMOSLOWTIMOPROTORCVPROTOSENDCLOSEDLISTENSYN_SENTSYN_RCVDESTABLISHEDCLOSE_WAITFIN_WAIT_1CLOSINGLAST_ACKFIN_WAIT_2TIME_WAITREXMTPERSISTKEEP2MSLinputoutputuserresponddrop @(#)tcp_input.c 4.7 87/05/20 v$$$tcp sum: src %x tcp off: src %x off %d tcp_pulloutofband @(#)tcp_output.c 4.8 87/05/20 mgettcp_outputtcp_output REXMT @(#)tcp_subr.c 4.7 87/05/20 \T``X`\\ns: cksum: out of data @(#)tcp_timer.c 4.7 87/05/20 ̀v 2P@ @(#)tcp_usrreq.c 4.7 87/05/20 dȀ|̀8LT\$tL4tcp_usrreq  @(#)udp_usrreq.c 4.7 87/05/20 <4@@8@<<H$Ѐudp_usrreq @(#)in_pcb.c 4.7 87/05/20 @(#)wonder.c 4.8 87/05/20 @(#)wonder.h 4.3 87/05/14 @(#)lance.h 4.2 87/05/14 wbnetwork interface down network interface down network interface down ethernet initialized wbet%x: can't handle af%x resetting interface LANCE has been stopped removing interface LANCE has been stopped excessive retries on transmission, TDR value = %x  ( Reading from CIO: IOAddr = %x; error = 䰀一 Writing to CIO: IOAddr = %x; IOData = %x; error = IO time outIO data not validIO time out and IO data not validunknown error: %xbad command = %d, err = %x bad checksum in address PAL; command = %x, err = %x invalid error or command returned; cmd = %x, err = %x could not read physical address could not write initialization block could not write recv descriptor ring could not write xmit descriptor ring could not write LANCE registers could not write LANCE registers; err = %d error waiting for Init Done interrupt, err = %d could not write start command in CSR0; err = %d GetXmitBuf: ran out of xmit buffers All receive buffers used by one packet! H(HHH8self test error: LANCE register testlocal memory testshared memory testLANCE initialization testunknown self test error, error = %x cannot enable CIO ethernet command interrupts %d could not write CSR0; err = %d cannot enable CIO LANCE interrupts %d %x paquets veroles @(#)mapa.c 4.3 87/05/14 @(#)if_ether.c 4.7 87/05/20 duplicate IP address!! sent from ethernet address: %x %x %x %x %x %x .text 0.data0 .bss .text!0x.data@ !.bss .text!.dataa.bss .text!@,.datab@.bss .text&(.datab.bss .text(`.datab.bss .text)pX.datab.bss .text*P .datab.bss .text-(.datab.bss .text-@.datas`P.bss .text-@.dataw`.bss .text;P.datax .bss .text@ .datax0 .bss .text@b.dataxP .bss .textHH.dataxp.bss .textVPd.datayP8.bss .text\xW.datay%.bss .textlX .dataz@.bss .textw.data| .bss .textp .data|@.bss .textX`Q.data}X.bss .textp.data}hh.bss .text(.data}.bss .textD.data~ .bss .text .data~H.bss .textk.data .bss .text X.data0.bss .textx .data(.bss .textx.data H.bss .text.datah .bss .text˰p..data.bss .text  .data .bss .textӨu.data .bss .text(".data(.bss .text '.dataP.bss .textp.dataXP .bss .text2.data.bss .textA.data0(.bss .textP.dataXx.bss .text#X5.data .bss .text)8F.data`.bss .text20".dataP .bss .text30.datap .bss .text5.data|.bss .text5.dataP .bss .text8hA.data8.bss .text.data(.bss @.textbx(.data.bss @.textb@.data .bss @.textd0.dataH.bss @.texth.data .bss @.textj.data(.bss @.textj B.data0.bss @.textp.data.bss @.texthH.data` .bss @.text .dataH.bss @.textXD.data/.bss @.textm.datah.bss @.textXp".dataXh.bss @.text.data@.bss @.text.data .bss @.text.data h.bss @.text`5.data .bss @.textXA.data (.bss @.text8p.data  .bss @.textǨ6.data .bss @.textH.data  .bss .text.data  .bss .text`.data  .bss .textH0.data  .bss .textx.data  .bss .textX;.data  x.bss _start s_ccbs`ssyscall!sispstendrs)s_clrmem$s@s@s_bootdev@s_rootdev@s_pipedev@s'Bs1ts< sFHs_mains_usR s_proc0_u0sintstack s_ftbits@ s\@sj@sv@s_putchar!8~~_getchar!X~~!x~<~!~!~_acctbuf P~_acctp p~_cfree x~̀ B~_pbuf B~׀ F~_hbuf F~_file R~_inode ~_proc ~_sptmap@`~_callout ~_mount ~_errP`~_sysinfo ~_syswait ~_syserr ~_minfo ~_vS~_pregppT~_region ~_ractived~_rfreed@~_pheaddh~_pfdatd~_phashd~_ptfreed~d~_tuneT~_swaptabd~f0~f8~T8~ ~_inoinitw~`~_cinit#~_binit8~_errinit@~_finit\~_iinit~ ^`~_socinitr ~_smdctabf@~_smdutabg@~_smdbufk@~_smditabo~_smdstat{~_wbcttab|~*~~6`~@`~_wb_al`~J`~U~_mtbuf~_mttab~_mtcmd~_mtstat~_vmtbuf~_ctrbsyװ~_sxt_cntTh~_msgmap׸~_msgque~_msglock8~_msghp~_msginfoTp~_semaP~_sem~_semmapp~a~_semu~_semtmp~_seminfoT~k ~_shmemi~_shminfoT~_mbutl{~v{~_mbstat{~}~_mbfree}~_mclfree}~_mbmapT~U~_flox}~~_maxpmemU~_pt_tty~~_bdevswU~_smdopen\P~^~`h~Àn~_mtopen0~_mtclose2~̀5~_mtprint3~ـ~,~H~~_cdevswV0~$~~h~&~1~_syopen ~_nulldev5~_syreadp~_sywrite~_syioctl~_mmread+P~_mmwrite-H~_mmioctl/X~_smdreadmd~<m~Fn~_prfreadI~PJ0~ZKX~_nodev5~d~n0~yD~~~~~~_mtreadF,~_mtwriteF~_mtioctlG~_sxtopentP~w~_sxtread~À~̀x~_ptsopenL`~׀M<~_ptsreadM~N~Xp~_ptcopenQ~R|~_ptcreadR~T~ V~_smopenq0~_smcloseq~_smreadq~~YX~'Y~2Y~<Z`~G[~_bdevcntY~_cdevcntY~_confswY~_smdintrhD~Rx~\~fи~p~z~_mtintr>4~~_dblev`~_ciotype`~_confcnt`~`~~X~~$~Àa~_dstflaga~_swplo~_utsnamea~_lineswb l_ttopenl_ttclose(l_ttread|l_ttwritel_ttioctl0l_ttin|l_ttoutl̀l_sxtinLl_sxtoutl_tvopenl_tvclosel_tvioctl(l_tvinl_linecntbl_termswbl_termcntbl؀!yalltraps#zyXsyscall!y!y_syscall3yXkcall"y_i_kcallFyXalign",y_i_alignFy"@y_i_instrFyXfparity"TyFyXeparity"hyFyXkerviol"|y_i_pviolFyXcheck"y_i_checkFyXtrap"y_i_trapFy "yXswtch0"y_i_sw0GyXpwroff"y_i_pwfG yXpwron# y_i_pwonG,yXclock# yXcl100#Ly_tictac1byXcallout#TyXres#hy_i_resGPy_trapE`ytrap_ret$y__debugbyy_clock;y!y_runruny_idle&y_spl0+y-&dy7&fyXpage&yA&y_rbsavebyLby_old_psby_pfaultHPrH_vfaultJrHW(rHc)^rHbad_addr)^rH_fubyte(r`_subyte( r`_fuword(4r`_fuiword(4r`_suword(Pr`_suiword(pr`_copyin(r`_copyout(r`m*s_addupc*tp_spl1+Xtp_spl4+Xtp_spl5+tp_spl6+tp_spl7+tp_splhi+tp_splx,tp|,$tp,tp,tp,tp,tp_icode-k@_szicode-<k@ispstackbk@_bread-Hv8_getblk2v8_iowait68v8_breada.v8_incore2$v8_brelse1v8_bwrite/v8_bdwrite0hv8_lboltv8_bawrite0v8_wakeupv8_panic`v8_sleepv8_geteblk5v8_iodone6v8_clrbuf7$v8_bzerov8_bflush7`v8_binval8Xv8_maxmemv8_debug@ v8v8_sbufv8ǀv8_ksctv8_kbasev8_bdflush:v8рqX_timeinC4qX_prfstatqX_prfintrKqXۀ qX_lticks$qX_time(qX_freemem0qX_psignalqX8qX_vhandl`qX@qX_runinDqX_printk@_setlev@|k@_suser[pk@_mfreepA(p_malloc0pAp_geterecB(p_puterecBpCpp_logtchgDpE(p_blkactyHp_fmtberrEtp$Gp_logberrGp.Hp_curpriLv_findregv_reglockܸv9(vCv_pfreev_premove,v_swfree1*v_regrelevMvXTvev_pfindHv_assfailиv_ptfillv_pinsertv_swapv_prdevvqUv_bcopyv_getfVXt(_closefVt({kt(_unp_gclt(qt(Pt(_plockt(_closept(_iput| t(_setjmpt(_preleht(_openiXt(_openpt(_accessYt(_getfs{t(_xrele:t(_ownerZt(_uchart(_nameit(_ufalloc[t(_falloc[t(_provflt(_findfid\_fidsX]D_frfid`_freefid]_frlockh_insflck__delflck`d_regflcka_flckadja_blockedf8_getflckg\_convoffj_setflckhkpy_maxly_printf˸yǀn$yӀoyހp(yty_swpinc+y_memfreevyDy_swalloc)@yy_uaccessy_uservadyy _hinodey _igetxy y _ireadzy _itruncTy _ifree{Ly _iupdat}y _freevy _tloopHy _maknodeLy _iallocxLy _wdiry _writeiׄy _iflush4y _readiӰy y _clksetty _stat1dy _sendsign_grown_bcmpLn_setregsn_edata n_chksizen_maxumemn*n4@n>nLo_physmemo_meminito_ksv_szo_palloWob\olo_userpteo_mmvado_mmpteo_curproco_msginito_seminit `o_startup#0o_rootdiro_meloado_devinito_newprocoz`oo_growrego_schedo_maxuptso_masktab~(l_iomovem_pcopyinmm_scharm_passcm_cpassxm_msgconvw(_msgctlw(_msgfreew(`w(_msgfpw(_msggetw(_ipcgetw(_msgw(_msgrcv\w(_msgsnd0w(_msgsys8w(_bmap#ph_sptfill| _min`| _stfill| _sptfreeH| _flush| _maxfree | _ipflush| _pmountL| | _runout$| _swtch2h| u_pgtmap uTuʀ(u_pgtfreeu_setmasku_nptfree(uԀu߀0uuu_physioq_useracc(q_physckhq_pipen@_printchr_pr_time4r_printn4r_pr_hour8r_timelapHph?ph@ ph_timeoutApP_timeidpPBpP_delayDpP_mapaPsh_strayK\sh(~_getsockad~`~_sobind`~_m_freem\~~Ā ~_m_get~π~ـ|~~_sofreet~_senditU~_sosend~_recvitY~D~~ ~_m_free0~ ~ ~ %a~ 2e~ >fP~ Jf~ Tg~ aiL~ oj ~  ~ j~  ~ k~ ~ ŀ~ Ӏ L~ ݀j~ ~ ~  ~ ~ " ~_m_copy~ -~ <k~_ufavailِ~ MoL~ Z~ e~_sbwait 0~ po ~ znd~_soo_rwon( pn(_ifioctlLn(_rtioctl\n( qn(_soclose n(_mbinitޘn( dn(_ifinitI@n( n(_acctsm um xt_sbittabj_cbittabj_bldindrhn_getheadv Àv_shmexec,v_punlockv_get410|v_execregv_pexitn_shmexit8n_shmforkDq_procdupq ̀|q ؀\m  m m_tunlockm_dunlockm_procxmt,r_ipcr r_ipcregr sh_shmconvsh_shmctlsh_shmdt8sh_shmgetPsh_rdwrtX_sorwuio\tX_copen`tX_mgetdevy d}_chdirec@} Hm_uiomovem !m_insquem_remquelm_domainsn ,n 8(n Dn Pݔn \Ln hܸn u(n 8|8 |8 |8_m_moreH|8_m_cat`|8_m_adjX|8 L|8_unixswxk( Q(k( U,k( ÀULk( πQk( ـ  _soabort t    (xH + TxH 68xH I xH_sbflushxH_sbdrop(xH Tl_d_read0pP_cfdebug pP cpP m8pP_d_write<pP_ctladdr\pP_medmay x y_nomfic(y_nomdiry_gethdr y_metracey )y_dcb0adr@y_dcb0Hy 'dy_mewait"`y 'y )y $y_metoidhy_meflagly_merev*y *ly À*y_sasintr$y ̀( y ׀(y 4  _mtwaitG\ _mtdebug _mtstart8 _k_tab _C_tab _c_tab _d_unitp _mt_cnt _prfmaxpm_prfsymm_prfctrm_ttinitw Y4w Qw_getcbpw_getcw_putcbpw_ptsprocPw_ttrstrtw Pw_ttlowatw_putcw_ttiocomw ҈o o '\o 1\@o <^ Hc_smdbbb Rg ]_sm_rptxm hm_sm_wptm r! } @  _sxtfree <_putcf_sxtbuf"`_sxtbusy"h_sxtinit_sycheckXk_canon_getcb(_tthiwatX_getcfd_ttxput\_putcb_tttimeo`_partabp_ttywait_ttnulq"_ttccharz(_canonb"z(_maptabz(_tv_blk8l_tv_fdx@l hx #x #x Ȁx Ҁ#x ߀#x #x ˘xx_StartWBTx_ttcharxHxĀx_wbmodemx&x0x:̤xG xSx_wbalclrx^dx_BAUDxnx~xxx##8Àπڀ_wbctclr#w#w#ww"w- w_wblpclrw_deblank9D_blancC_newlineCD_number_BASE̐_expr FSd`#lI{,x0_kdb_dlgC !0̀"؀#L_defmode&'H$ '%.D _strphs_strvrt:&_kdb_wrtCG'lW'f'p'|) _v_count' '('0_d_count'8_dumpmem)I'@+\_vdump,,_doreg-Pƀ-_codassx_Subop р0X1H2<_exitcmd2'H_kdb_goHT34I &3_recon40_majdcb4_dcb'P_itestI_loadcmd6 _KDBdlg05I$_dumpcmd7@_ci:_KDBcmd_load_hlpC?_strhdrx_strknmpP@p_restart'[_kdbflag_strstp _strbkp(_KDBwrtxgD8rEl_casehs_loadb_loadh_loadd_laddr(_store8_storebH_storehX_storedh~ttxtttt_i_pageFt_i_intGtƀG8tЀGDt_kdb_ccbt_ifnet'vPڀXvPKlvPIvPIvP J\vPvP$JvP2KvP_if_downK4vP_ifunitLvP_ifconfOvP_ipintrq'vP?'vP_rpintrq'vP_rawcb'v8_rawintrSXv8Ibv8UcXv8adv8ocv8_rtfreeZxv8ycv8_rtallocXv8_rthost(0v8_rtnet(Pv8_rtstat(pv8(w_rttrash(wZw_rtinita w]LwbkbkĀhkπhpk_loif(oހho_loioctlfoeoj@oixo io_ipstat)o_ipq)(o_ip_id)Do_inetsw@lpl_ip_initplyl,yl6lPlBlMl[lg`lql|$lhlll0llǀlҀ@lހjq@)Hq@oxq@q@ )q@_iptimepq@oq@"~x_ifinet*~x_ipintrq~x_ipcksum ~x-y~x_ipaddr(~x;~t~xGu4~xQx`~x_ip_deqx~x_ip_enqx~x[}8~xl}~xy8~x~x_tcb*~x ~x~x_udb+0~xP~xX~xŀr_ripdstmрm_ripsrcmۀ`xx+hxx+pxxpxx_tanamesxxxxxx_tcp_issixxixx)jxx_tcpstatjxx3xxAPKHWƔej q¬Ą0Āπ4p H` s($s8sE0qSqaTpm xp Ppu`8u`u`u`ŀjHu`Ԁ$u`Řu` u`  u`@u`_udpstatjPu u_udp_in u)xu5j`tBǰL`Wɠahl֘wpjhL _WB_Init`ǀ|Ҁ@݀̐ jpjx jj_WBWritet j*>_WB_ReadHj_WBReadUa\pj|tdjjkPπkX݀l_SleepOKk` kh "ߨ8kC_StatskQ_$jvl8l@lH ÀlP̀lX؀l`lhl mh@+8ATRmaqTmmxȀ ܀ m_copysegq@q@_udivHpudivHp_uremTpuremTpDr_arpcommr`r`mr`_arptabmr`(r`_arptnewr`_btext _bdata_bbss $_sizememory__last_addr_mcversion_kdb_init_vadrspace_sys_sect_call_debug_fdlp_dcb_ftPageTables_ftHeadwall_machineid_cio_putchar_cio_getchar_breakchar_cio_breakchar_x25_attach_iomd_intr_bfreelist_pfreelist_phashmask_nextswap_swapwant_init_tbl_iomachdep_clkstart_flckinit_wbctcombuf_wbct_buf_wbal_tty_wblp_lpdt_wblp_lpbuf_sem_undo_shm_shmem_mclrefcnt_nmbclusters_flckinfo_flinotab_pt_ioctl_smdclose_smdstrategy_smdprint_mtstrategy_wbctopen_wbctclose_wbctstrategy_wbctprint_wbalopen_wbalclose_wbalread_wbalwrite_wbalioctl_smdwrite_smdioctl_prfwrite_prfioctl_wbctread_wbctwrite_wbctioctl_wblpopen_wblpclose_wblpread_wblpwrite_wblpioctl_sxtclose_sxtwrite_sxtioctl_ptsclose_ptswrite_ptsioctl_ptcclose_ptcwrite_ptcioctl_wbetopen_rnetopen_rnetclose_rnetread_rnetwrite_rnetioctl_wbetintr_wbetctrl_wbalintr_wblpintr_wbctintr_conf_devs_dev_init_wbalinit_wblpinit_wbctinit_wbetattach_timezone_sxtrwrite_xdbgcall_xsyscallXillinstr_i_dbpe_cf_i_dbpe_exXinterrupt_ext_intr_addupc_clk_kcall255_kcall254_call_rbug_idle_addr_copy_start_copy_end_headwallLight_searchdir__HeadwallDiag_HWLoadEnable_R32LoadEnable_HWSerCmd_sptalloc_bufstart_panicstr_switching_vhandcnt_bdflushcnt_geteslot_freeslot_logstart_logstray_fmtraerr_logmemory_ptmemall_copypage_clearpage_pageincache_memreserve_killpage_cleanlocks_soo_close_ffreelist_allocfid_deadflck_sleeplcks_getpgslim_ageprocess_ageregion_getpages_swapchunk_pbremove_ublk_ptbl_ifreelist_freeblklst_HWGetDate_coredump_findpreg_HeadwallDiag_firstfree_allocator_pgtalloc_pgtallocator_allocreg_attachreg_pcopyout_ipcaccess_punmount_startup_pgtalloc_ptmalloc_kpgtfree_getcpages_nptalloced_freepage_contmemall_nullregion_chkattach_nullpregion_loadstbl_detachreg_rptexpand_chkgrowth_bldblklst_lockedreg_freeproc_next_page_mktables_ublk_sgtbl_p0init_done_cfreelist_swapfind_swapclup_lastproc_swapfunc_socksend_sockrecv_setsockopt_shutdown_socketpair_getpeername_recvfrom_getsockname_getsockopt_setreuid_setregid_sysridge_traptoround_roundtotrap_HWClockCommand_timetoYMDHMS_YMDHMStotime_untimeout_socreate_sockargs_solisten_soqremque_soaccept_soconnect_soconnect2_soreceive_soshutdown_sosetopt_sogetopt_m_getclr_uipc_usrreq_unp_attach_unp_detach_unp_bind_unp_connect_unp_connect2_unp_disconnect_socantsendmore_unp_usrclosed_sbwakeup_unp_internalize_sun_noname_sbappendaddr_sbappend_unp_drop_unp_sendspace_unp_recvspace_soreserve_soisdisconnected_sonewconn_soisconnected_unp_externalize_unp_discard_unp_gcing_unp_defer_unp_mark_unp_scan_soo_ioctl_soo_stat_loattach_domaininit_compress_badblock_getxfile_makechild_textlock_datalock_proclock_dirtypage_shmattach_HWSetDate_procfind_selwakeup_unixdomain_inetdomain_pffasttimo_pfslowtimo_pffindtype_pffindproto_pfctlinput_m_clalloc_m_pgfree_m_expand_m_pullup_raw_input_raw_ctlinput_raw_usrreq_raw_init_sbrelease_sorflush_sodisconnect_socantrcvmore_sohasoutofband_soisconnecting_soqinsque_soisdisconnecting_sbreserve_GetHWSwitches_move_dcb_dcb_write_medmaptr_readlong_readshort_writeshort_writelong_metimeout_readstat_writecom_readbyte_writebyte_mtcommand_no_t_proc_ptcwakeup_ttyflush_wbetoutput_localAddress_rawinput_rawbuffer_smdcommand_smdstart_smd_write_smd_strer_sys_mess_linkTable_sxtnullproc_sxtvtproc_sxtlinit_sxtalloc_wbalunit_wbal_cnt_wbal_addr_wb_reset_PROMVersion_CODEVersion_PCAConfig_WBCommand_intrpInterval_wbalproc_wbalparam_WBCtest1_WBCtest0_WBWriteChar_wbresetbrk_diag_cons_WBSetStartStop_WBGetStartStop_timeInterval_wbal_cons_KEYBOARD_wbct_cnt_wbct_addr_wbctcommand_wbcttimout_wbctstart_wbctrstrategy_wbctphys_wblp_addr_wblp_cnt_CodeVersion_testOffline_wblpstart_wblpoutput_kdb_getline_instrucinfo_breakpoints_breaktable_txt_translate_findbreaktableentry_findbreak_addbreakpoint_deletebreakpoint_handleaddbreak_readtarget_singlestep_stepmode_pcb_access_handledeletebreak_numbreaksset_displaybreaktable_kdb_printf_setbreakcmd_clearallbreaks_clearbreakcmd_break_pc_break_type_vdumpmem_v_offset_d_offset_translate_modeflag_displaycmd_transaddr_dispinstr_displayinstruction_displaycodecmd_displayregscmd_cons_diag_modifycmd_kdb_flush_singlestepcmd_start_loader_writeheader_exception_modestring_kdb_print_kdb_printn_save_reg0_default_pcb_debug_pcb_user_pcb_user_default_kdb_default_i_timer1_i_timer2_ifqmaxlen_if_slowtimo_if_attach_if_ifwithaddr_if_ifwithnet_afswitch_if_ifonnetof_if_ifwithaf_rawintrq_raw_attach_raw_detach_raw_connaddr_raw_bind_raw_disconnect_wildcard_rtredirect_rtrequest_null_hash_null_netmatch_inet_hash_inet_netmatch_if_makeaddr_looutput_if_rtinit_in_netof_in_lnaof_ip_output_ip_slowtimo_ip_drain_icmp_input_udp_input_udp_ctlinput_udp_usrreq_udp_init_tcp_input_tcp_ctlinput_tcp_usrreq_tcp_init_tcp_fasttimo_tcp_slowtimo_tcp_drain_rip_input_rip_output_icmp_error_icmpstat_icmp_reflect_in_cksum_ip_protox_icmp_send_ipqmaxlen_ip_dooptions_ip_forward_ip_reass_ip_freef_ip_stripoptions_ip_ctlinput_inetctlerrmap_tcp_abort_in_pcbnotify_udp_abort_ipprintfs_ipforwarding_ip_optcopy_ripproto_tcp_trace_tcp_debx_tcp_debug_tcpstates_prurequests_tcptimers_tcp_alpha_tcp_beta_tcpconsdebug_tcpcksum_tcpprintfs_in_pcblookup_tcp_saveti_tcp_dooptions_in_pcbconnect_tcp_template_in_pcbdisconnect_tcp_drop_tcp_reass_tcp_close_tcp_canceltimers_tcp_pulloutofband_tcpnodelack_tcp_output_tcp_respond_tcp_outflags_tcp_setpersist_tcp_initopt_tcp_newtcpcb_in_pcbdetach_tcp_timers_tcpexprexmtbackoff_tcp_backoff_tcp_attach_tcp_disconnect_in_pcbbind_tcp_usrclosed_tcpsenderrors_in_setsockaddr_in_setpeeraddr_tcp_sendspace_tcp_recvspace_in_pcballoc_udpcksum_udp_output_zeroin_addr_SwapBits_arpmyaddr_wbetinit_wbetioctl_wbetreset_GetWonderBoard_WBDriverInited_AllocDescRings_disableWBInterrupts_arpattach_arpwhohas_wbsetaddr_wbetread_tcpipOpen_WBLength_RecvDescCopy_IORAMAddr_RecvQHead_WBOffset_copyLANCEBufToMbuf_arpinput_etherCBCopy_LANCEError_packetXmitted_F_Cpt_Init_InitStartCmds_arpresolve_copyMbufToLANCEBuf_XmitQHead_XmitBufs_TempXmitQHead_XmitDescCopy_RemoveWBInterface_wbshutdown_WriteWBCommand_RecvBufs_GetXmitBuf_FlushLANCEInterruptQ_XmitQTail_ReadXmitDesc_WBWriteIOErr_bad_Write_CmdTimeout_D_Cpt_Cmd_TO_ErrCmd_F_Cpt_Cmd_ReadRecvDesc_WriteRecvDesc_WriteXmitDesc_WBDevice_WBPresent_IOMapAddr_ReadRevCodes_RealRecvBufs_RealXmitBufs_diagCBCopy_ReadPhysicalAddr_SetLogicalAddrFilter_CreateInitBlock_InitBlockCopy_WriteInitBlock_InitDescRings_TO_ErrInit_StartTimeout_D_Cpt_Init_TestRecvBufValid_FindRecvPktEnd_etherbroadcastaddr_nbpkterr_TO_ErrXmit_clearseg_d_rwrite_arptimer_arpt_age_arptfreew.Q..xs.automove.cys.file.czs.ld.file{s.load.c|s.main.c}s.prf_cio.c~s.prf_fdlp.cs.smd.cs.common.hs.starthdw.ss.Makefiles.main_fdlp.cs.start.ss.load.hs.main_old.cload.hstart.ocommon.hautomove.oload.old.filefile.osmd.omain.oprf_cio.odiskbootmain_fdlp.oprf_fdlp.obootfdlph57994 s 00001/00001/00040 d D 4.3 87/05/14 16:44:51 build 8 7 c removed old SCCS strings and inserted #ident BB e s 00003/00002/00038 d D 4.2 87/04/22 10:49:46 dc 7 6 c Add Bull changes from 03/05/87 e s 00000/00000/00040 d D 4.1 87/02/26 17:16:24 dc 6 5 c rolled rev to -r4 /dc e s 00009/00014/00031 d D 3.2 87/02/12 13:24:06 build 5 4 c switch to newer calling convention. e s 00000/00000/00045 d D 3.1 87/01/19 09:30:39 build 4 3 c rolled rev to -r3 /dc e s 00000/00000/00045 d D 2.1 87/01/19 09:30:39 build 3 2 c AUTO NULL DELTA e s 00001/00000/00044 d D 1.2 87/01/16 10:26:26 build 2 1 c add ident string /dc e s 00044/00000/00000 d D 1.1 87/01/13 18:21:54 build 1 0 c Placed under source control - dc e u U f b f n t T I 2 D 7 /* "%W% %E%" */ E 7 I 7 D 8 /* " %W% %E% " */ E 8 I 8 #ident " %W% %E% " E 8 E 7 E 2 I 1 #include "load.h" /* D 5 * Move loader from 'src' to (1M0 - 2*4k) E 5 I 5 * Move loader from 'src' to somewhere in 'high' memory * If the loader already resides at this address, then * no movement is done. E 5 */ extern int start() ; extern int start1() ; auto_move(src) register src; { register nb_page, x, dest, entry, entry1 ; *(int *)BUF_ME = 0 ; nb_page = LOADERSIZE ; D 7 dest = LOADERBASE2 ; /* 1M0 - 2*4k0 */ E 7 I 7 dest = LOADERBASE2 ; /* 3M0 - 2*4k0 */ E 7 D 5 for (x = 0 ; x < nb_page ; x++) { copy_page(src, dest) ; src += PGSIZE ; dest += PGSIZE ; E 5 I 5 if ( dest != src ) { for (x = 0 ; x < nb_page ; x++) { copy_page(src, dest) ; src += PGSIZE ; dest += PGSIZE ; } E 5 } entry = (int)start1 ; entry1 = (int)start ; entry = LOADERBASE2 + (entry - entry1) ; start_loader(entry) ; } copy_page(src, dest) register int *src, *dest ; { register x ; for (x = 0 ; x < PGSIZE/4 ; x++) *dest++ = *src++ ; } I 7 E 7 D 5 start_loader(func) int (*func)() ; { (*func)() ; } E 5 E 1 h13489 s 00001/00001/00251 d D 4.3 87/05/14 16:45:02 build 8 7 c removed old SCCS strings and inserted #ident BB e s 00001/00001/00251 d D 4.2 87/04/22 10:50:26 dc 7 6 c Add Bull changes from 03/05/87 e s 00000/00000/00252 d D 4.1 87/02/26 17:16:30 dc 6 5 c rolled rev to -r4 /dc e s 00002/00000/00250 d D 3.2 87/02/12 14:16:35 build 5 4 c only print * if debug is compiled ON e s 00000/00000/00250 d D 3.1 87/01/19 09:30:42 build 4 3 c rolled rev to -r3 /dc e s 00000/00000/00250 d D 2.1 87/01/19 09:30:42 build 3 2 c AUTO NULL DELTA e s 00001/00000/00249 d D 1.2 87/01/16 10:26:29 build 2 1 c add ident string /dc e s 00249/00000/00000 d D 1.1 87/01/13 18:21:55 build 1 0 c Placed under source control - dc e u U f b f n t T I 2 D 7 /* "%W% %E%" */ E 7 I 7 D 8 /* " %W% %E% " */ E 8 I 8 #ident " %W% %E% " E 8 E 7 E 2 I 1 #include #include #include #include #include #include "common.h" #define min(x , y) ((x < y) ? (x) : (y)) /* OPEN | ---- | ouverture d'un fichier UNIX | | valeur rendue : | ------------- OK | E_IO erreur IO | E_INEX_FILE fichier inexistant | | Parametres d'entree : | ------------------- | file_name nom du fichier */ extern char *cb_buf ; open(file_name) char *file_name ; { struct direct *dp ; char name[14]; ino_t i_num ; short i_name; register short i, j ; unsigned short bloc_nb; /* determiner la taille du bloc */ i_num = 2; /* root */ i_name = 0; #ifdef DEBUG printf("open(%s)\n", file_name) ; #endif DEBUG for( ;; ) { next_dir: if ((i = iget(i_num, &i_node)) != OK) return( i ); bloc_nb = (i_node.di_size + BLKSIZE - 1) / BLKSIZE ; /* ignore first slash */ while (file_name[i_name] == '/') i_name++; if(file_name[i_name] == 0) return(E_INEX_FILE); for (i=0; (i<14)&&(file_name[i_name] != '/')&&(file_name[i_name] != '\0'); i++, i_name++) name[i] = file_name[i_name] ; for ( ; i<14; i++) name[i] = 0; for (i_blk=0; i_blk>4); i++, dp++) { for (j=0; (j<14)&&(dp->d_name[j] == name[j]); j++) ; if (j >= 14) { if (file_name[i_name] == '\0') { /* trouve */ i_num = dp->d_ino ; #ifdef DEBUG printf("i_num = %x\n", i_num) ; #endif DEBUG if ((i = iget(i_num, &i_node)) != OK) return ( i ); i_blk = 0 ; i_depl = BLKSIZE ; return( OK ); } i_num = dp->d_ino ; /* skip the '/' */ i_name++; goto next_dir; } } } return( E_INEX_FILE ) ; } } /* READ | ==== | ss/pgme interne lecture sequentielle d' un fichier | | valeur rendue : | ------------ | OK | io error | parametres d' entree : | -------------------- | length longueur a lire ( octets ) | | parametres de sortie : | -------------------- | buf_adr adr du buffer destinataire */ read(length, buf_adr) int length; char *buf_adr; { register short i,j; register char *p; i = i_depl; /* get from last buffer */ #ifdef DEBUG printf("read(%x, %x)\n", length, buf_adr) ; #endif DEBUG for (p = cb_buf + i; (i 0); length-- , i++ ) *buf_adr++ = *p++; for(; length > 0 ;) { if((j = rdblk()) != OK) return(j); for(i=0, p = cb_buf; i< min(length, BLKSIZE); i++) *buf_adr++ = *p++; length -= BLKSIZE; } i_depl = i; return(OK); } /* IGET | ==== | lecture du i_node d'un fichier | | valeur rendue : | ------------- OK | io error | parametres d'entree : | ------------------- | i_num no de i_node | parametres de sortie : | -------------------- | ip pointeur structure i_node */ iget(i_num ,ip) unsigned int i_num ; int *ip; { register int *p ; register int i ; #ifdef DEBUG printf("iget(%x, %x)\n", i_num, ip) ; #endif DEBUG p = (int *)(cb_buf + ( ((i_num-1)<<6) & (BLKSIZE-1) )) ; /* p = (int *)(cb_buf) ; */ if ((i=rdp((i_num - 1)/(BLKSIZE>>6) + 2, SMD_READ)) != OK) return(i) ; for ( ; i<16; i++) *ip++ = *p++; return( OK ); } /* RDBLK | ----- | lecture d'un bloc fichier | valeur rendue : | ------------- | OK | CB return code */ rdblk() { register int bloc_num; register int sec_num, i; bloc_num = i_blk++; #ifdef DEBUG printf("rdblk(%x)\n", bloc_num) ; #endif DEBUG if ( bloc_num >= 10 ) { bloc_num -= 10 ; if (bloc_num != 0) { if ( bloc_num >= BS_INT ) { if ((bloc_num & (BS_INT - 1)) == 0) { /**************************************/ /* num de bloc =138 et multiple de 128*/ /* lecture de la 1ere table d'indir */ /* et memorisation de la 2eme */ /**************************************/ sec_num = ((((i_node.di_addr[33] & 0xFF)<<8 ) + (i_node.di_addr[34] & 0xFF) ) <<8 ) + (i_node.di_addr[35] & 0xFF) ; if ((i = rdp(sec_num, SMD_READ)) != OK) return( i ); sec_num = ((int *)cb_buf)[(bloc_num - BS_INT) / BS_INT]; if((i = rdp(sec_num, SMD_READ)) != OK) return(i); for ( ; i a 138 et non */ /* multiple de 128 */ /*********************************/ bloc_num=bloc_num & (BS_INT -1); } } else { /*********************************/ /* num de bloc = a 10 */ /* memorisation de la 1ere table*/ /* d'indirection */ /*********************************/ sec_num = ((((i_node.di_addr[30] & 0xFF) <<8) + (i_node.di_addr[31] & 0xFF)) <<8 ) + (i_node.di_addr[32] & 0xFF ) ; if ((i = rdp(sec_num, SMD_READ)) != OK) return( i ); for ( ; i #include #include #include #include "load.h" /* file header */ struct filehdr filehdr; /* optionnal file hdr */ struct aouthdr aouthdr; /* table of sections */ struct scnhdr scnhdr_table[SECMAX]; /* LOAD | ---- | chargement d'une image memoire unix | only coff format accepted | | | valeur rendue : | ------------- | OK programme charge en memoire | E_INVALID_PROG programme invalide | E_INEX_FILE fichier image memoire inexistant | | | parametres d'entree : | ------------------- | file_name nom de fichier | p_entry entry point pointer | */ D 5 load(file_name, p_entry) E 5 I 5 load(file_name, p_entry,load_base) E 5 D 5 uint *p_entry ; E 5 I 5 uint load_base,*p_entry ; E 5 char *file_name; { struct scnhdr *scnhdr, *bsshdr; int size, p_s; register uint i, nscns, secn; if ((i = open(file_name)) != OK) return(i); if ((i = read(sizeof(filehdr), &filehdr)) != OK) return(i); if((filehdr.f_magic != SPS9WRMAGIC) && (filehdr.f_magic != SPS9ROMAGIC)) return(E_INVALID_PROG); /* read optionnal header */ if((i = read(filehdr.f_opthdr, &aouthdr)) != OK) return(i); I 7 E 7 D 5 *p_entry = aouthdr.entry + U_LOAD_BASE; E 5 I 5 *p_entry = aouthdr.entry + load_base; E 5 /* read section headers in table */ if((nscns = filehdr.f_nscns) > SECMAX) return(E_INVALID_PROG); if((i = read(nscns * sizeof(struct scnhdr), scnhdr_table)) != OK) return(i); for(secn=0, scnhdr=scnhdr_table; secns_vaddr += U_LOAD_BASE ; E 5 I 5 scnhdr->s_vaddr += load_base ; E 5 for(secn=0, scnhdr=scnhdr_table; secns_name, scnhdr->s_vaddr, scnhdr->s_size); switch (scnhdr->s_flags) { case STYP_TEXT: printf("TEXT"); break; case STYP_DATA: printf("DATA"); break; case STYP_BSS: printf("BSS"); } #endif size = scnhdr->s_size; /* data section may be followed by bss section */ bsshdr = (struct scnhdr *)0; if(scnhdr->s_flags == STYP_DATA) { bsshdr=scnhdr+1; if(bsshdr->s_flags==STYP_BSS) size += bsshdr->s_size; else bsshdr = (struct scnhdr *)0; } if((i = read(scnhdr->s_size, scnhdr->s_vaddr)) != OK) return(i); #ifdef DEBUG printf("...loaded\n"); #endif if (bsshdr) { scnhdr++; secn++; } } return(OK); } E 1 h05416 s 00001/00001/00069 d D 4.3 87/05/14 16:45:23 build 8 7 c removed old SCCS strings and inserted #ident BB e s 00015/00035/00055 d D 4.2 87/04/22 11:21:11 dc 7 6 c Add Bull changes from 03/05/87 e s 00000/00000/00090 d D 4.1 87/02/26 17:16:43 dc 6 5 c rolled rev to -r4 /dc e s 00049/00117/00041 d D 3.2 87/02/12 14:30:46 build 5 4 c ... track bull changes e s 00000/00000/00158 d D 3.1 87/01/19 09:30:48 build 4 3 c rolled rev to -r3 /dc e s 00000/00000/00158 d D 2.1 87/01/19 09:30:48 build 3 2 c AUTO NULL DELTA e s 00001/00000/00157 d D 1.2 87/01/16 10:26:35 build 2 1 c add ident string /dc e s 00157/00000/00000 d D 1.1 87/01/13 18:21:58 build 1 0 c Placed under source control - dc e u U f b f n t T I 2 D 7 /* "%W% %E%" */ E 7 I 7 D 8 /* " %W% %E% " */ E 8 I 8 #ident " %W% %E% " E 8 E 7 E 2 I 1 #include #include #include #include #include #include "common.h" /* exchange memory description */ D 5 #define KDB 0x4B44423E /* "KDB>" magic */ E 5 char *cb_buf = (char *)BUF_ME ; /* CB's buffer address */ char *cb_bblbuf = (char *)BUF_BBLK ; /* BadBlocs' buffer address */ char UNIX[8] = "unix" ; I 5 D 7 char KDB[]="/etc/odiskboot"; E 7 E 5 D 5 char *error[] = { "d_read(%x) error = %x\n", "\nBad format for '%s' on c%dd%ds%d\n", "\nNo '%s' system name on c%dd%ds%d\n", "\nNo c%dd%d in this machine\n", "\nNo smd disk in this machine\n", "\nFatal Error on loading\n", " ???" } ; char *texte[] = { "\n load :\ndevice number = ", "\nunit number = ", "\npartition number = ", "\nfile name = ", "%d" } ; E 5 D 5 fatal() E 5 I 5 D 7 fatal(kdb) E 7 I 7 fatal() E 7 E 5 { D 5 printf(error[E_FATAL]) ; for (;;) ; E 5 I 5 char *s ; D 7 if (kdb) { printf(" *** No %s on c%dd%ds%d ***",file_name,disc_dev,disc_unit,disc_part); for (;;); } else { s = (char *)0x3a000; sprintf(s," *** No %s on c%dd%ds%d ***",file_name,disc_dev,disc_unit,disc_part); start_loader(0x3e008,s); /* rappel rbug en slow boot */ } E 7 I 7 s = (char *)0x3a000; sprintf(s," *** No %s on c%dd%ds%d ***",file_name,disc_dev,disc_unit,disc_part); start_loader(0x3e008,s); /* rappel rbug en slow boot */ E 7 E 5 } D 5 main() E 5 I 5 D 7 main(dev,unit,part,filnam,magic) int dev,unit,part,magic; E 7 I 7 main(dev,unit,part,filnam) int dev,unit,part; E 7 char *filnam; E 5 { D 5 register unsigned i, l ; register device ; E 5 I 5 register unsigned i ; E 5 register struct vtoc *p ; D 5 register int *magic ; E 5 int (*entry)(); I 5 D 7 int load_base,kdb ; E 7 I 7 int load_base ; E 7 E 5 D 5 for (i=0 ; i < 272 ; i++) ccb[i] = (int)(&(*fatal)()) ; E 5 I 5 D 7 kdb = 0; if (magic == 'KDB>') kdb = 1; E 7 disc_dev = dev>>24; disc_unit = unit; disc_part = part; E 5 D 5 ccb[272] = 0x7FFFFFFF; ccb[273] = 0x7FFFFFFF; E 5 I 5 D 7 if ( smd_type() ) { fatal(kdb); } E 7 I 7 if ( smd_type() ) fatal(); E 7 E 5 D 5 for (i=274 ; i < 280 ; i++) ccb[i] = (int)(&(*fatal)()) ; /* get disk me physical address */ l = load_enable() ; magic = (int *)0 ; disc_dev = 31 ; if (*magic == KDB) { disc_dev = *(++magic) ; disc_unit = *(++magic) ; if ( l ) goto autol ; else goto manol ; E 5 I 5 p = (struct vtoc *)cb_bblbuf ; if (p->v_sanity != VTOC_SANE) { D 7 fatal(kdb); E 7 I 7 fatal(); E 7 E 5 } D 5 for( ; ; disc_dev--) { if ( l ) { disc_unit = UNIT0; for( ; disc_dev>0; disc_dev--) if ( recon() ) goto autol ; goto F0 ; autol: l = 0 ; if ( smd_type() ) { nodsk: printf(error[E_UNIT], disc_dev, disc_unit); continue; } disc_part = P0; goto Copx ; } /* adresse disque ? */ T0: printf(texte[0]); device = getnum(); E 5 D 5 if (device < 0) { for( ; disc_dev>0; disc_dev--) if ( recon() ) goto D0 ; F0: printf(error[E_SMD]) ; fatal() ; D0: printf(texte[4], disc_dev); } else { if ((device == 0) || (device > 31)) { printf(error[E_ERR]) ; goto T0 ; } disc_dev = device ; E 5 I 5 if (filnam == 0) { D 7 if (magic == 'KDB>') { i = 20 ; while(i--) file_name[i] = KDB[i] ; E 5 } D 5 /* numero d'unite ? */ T1: printf(texte[1]); disc_unit = getnum(); if (disc_unit < 0) { disc_unit = UNIT0; printf(texte[4], disc_unit); } else if (disc_unit > 3) { printf(error[E_ERR]) ; goto T1 ; } manol: if ( smd_type() ) goto nodsk ; p = (struct vtoc *)cb_bblbuf ; /* numero de partition ? */ T2: printf(texte[2]); if (p->v_sanity != VTOC_SANE) goto dP0 ; disc_part = getnum(); if (disc_part < 0) { dP0: disc_part = P0; printf(texte[4], disc_part); } else if (disc_part > p->v_nparts) { printf(error[E_ERR]) ; goto T2 ; } /* nom du systeme ? */ printf(texte[3]); getstr(file_name, 80); if (file_name[0] == 0) { printf(UNIX) ; Copx: i = 5 ; E 5 I 5 else { i = 5 ; E 5 while(i--) file_name[i] = UNIX[i] ; } E 7 I 7 i = 5 ; while(i--) file_name[i] = UNIX[i] ; E 7 I 5 } else { for(i=0;filnam[i] != 0;i++) file_name[i] = filnam[i]; file_name[i] = 0; } E 5 #ifdef DEBUG D 5 printf("load system"); E 5 I 5 printf("load system %s on dev %d unit %d part %d\n",file_name,disc_dev,disc_unit,disc_part); E 5 #endif D 5 Unix: putchar('\n'); if ((i=load(file_name, &entry)) == OK) goto entry; printf (error[i], file_name, disc_dev, disc_unit, disc_part); } E 5 I 5 load_base = 0 ; D 7 if (magic == 'KDB>') load_base = 0xffe00000; E 7 if ((i=load(file_name, &entry,load_base)) != OK) D 7 fatal(kdb); E 7 I 7 fatal(); E 7 E 5 /* jmp to system code */ entry : #ifdef DEBUG printf("running system code = %x\n", entry); #endif I 5 flush(); E 5 entry(disc_dev, disc_unit, disc_part); } E 1 h02091 s 00001/00001/00294 d D 4.5 87/05/14 16:45:36 build 10 9 c removed old SCCS strings and inserted #ident BB e s 00017/00015/00278 d D 4.4 87/04/22 15:05:25 dc 9 8 c dc - Add headwall diagnostic functions e s 00003/00001/00290 d D 4.3 87/04/22 10:40:04 dc 8 7 c Add Bull changes from 03/05/87 e s 00000/00002/00291 d D 4.2 87/02/26 18:39:10 dc 7 6 c convert printf to new calling conventions /dc e s 00000/00000/00293 d D 4.1 87/02/26 17:16:50 dc 6 5 c rolled rev to -r4 /dc e s 00092/00000/00201 d D 3.2 87/02/12 14:33:12 build 5 4 c add sprint(fn) functions e s 00000/00000/00201 d D 3.1 87/01/19 09:30:50 build 4 3 c rolled rev to -r3 /dc e s 00000/00000/00201 d D 2.1 87/01/19 09:30:50 build 3 2 c AUTO NULL DELTA e s 00001/00000/00200 d D 1.2 87/01/16 10:26:38 build 2 1 c add ident string /dc e s 00200/00000/00000 d D 1.1 87/01/13 18:22:00 build 1 0 c Placed under source control - dc e u U f b f n t T I 2 D 8 /* "%W% %E%" */ E 8 I 8 D 10 /* " %W% %E% " */ E 10 I 10 #ident " %W% %E% " E 10 E 8 E 2 I 1 #include #include I 9 #include #include #include "load.h" E 9 I 8 #ifdef DEBUG E 8 #define BS 0x08 #define BELL 0x07 /* * Scaled down version of C Library printf. * Only %s %u %d (==%u) %o %x %D are recognized. * Used to print diagnostic information * directly on console tty. * Since it is not interrupt driven, * all system activities are pretty much suspended. * Printf should not be used for chit-chat. */ D 9 #define A0 1 #define BHE 0x00400000 E 9 printf(fmt, x1) register char *fmt; unsigned x1; { register c; register unsigned int *adx; char *s; adx = &x1; loop: while((c = *fmt++) != '%') { if(c == '\0') return; putchar(c); } c = *fmt++; if(c == 'd' || c == 'u' || c == 'o' || c == 'x') printn((long)*adx, c=='o'? 8: (c=='x'? 16:10)); else if(c == 's') { s = (char *)*adx; while(c = *s++) putchar(c); } else if (c == 'D') { printn(*(long *)adx, 10); adx += (sizeof(long) / sizeof(int)) - 1; } adx++; D 7 adx++; E 7 goto loop; } printn(n, b) long n; register b; { register i, nd, c; int flag; int plmax; char d[12]; c = 1; flag = n < 0; if (flag) n = (-n); if (b==8) plmax = 11; else if (b==10) plmax = 10; else if (b==16) plmax = 8; if (flag && b==10) { flag = 0; putchar('-'); } for (i=0; i= b) { nd -= b; c = 1; } else c = 0; } d[i] = nd; n = n / b ; if ((n==0) && (flag==0)) break; } if (i == plmax) i--; for ( ; i>=0; i--) putchar("0123456789ABCDEF"[d[i]]); } getchar(flag) int flag; { int head, tail; int stat; int c; I 9 int unit; unit = HeadwallDiag() ? 3 : 0; E 9 loop: D 9 d_read(0x00000100, &head); d_read(0x00000102, &tail); E 9 I 9 d_read(TCB(unit)+ReceiveHead, &head); d_read(TCB(unit)+ReceiveTail, &tail); E 9 head &= 0x0000FFFF; tail &= 0x0000FFFF; if (head == tail) goto loop; d_read(head, &stat); D 9 head += 2; if (head >= 0x00002200) head = 0x00002000; d_write(0x00000100, head); E 9 I 9 head = (head & ~(BufSize-1)) | ((head+2) & (BufSize-1)); d_write(TCB(unit)+ReceiveHead, head); E 9 if (stat & 0x8000) goto loop; c = (stat & 0x7F); if (c == '\r') c = '\n'; if (flag) putchar(c); return(c); } putchar(c) register int c; { int head, tail; int addr; I 9 int unit; E 9 I 9 unit = HeadwallDiag() ? 3 : 0; E 9 c &= 0x7F; if (c == '\n') putchar('\r'); loop: D 9 d_read(0x00000104, &head); d_read(0x00000106, &tail); E 9 I 9 d_read(TCB(unit)+TransmitHead, &head); d_read(TCB(unit)+TransmitTail, &tail); E 9 head &= 0x0000FFFF; tail &= 0x0000FFFF; if (head != tail) goto loop; addr = tail; if (addr & 1) { addr &= ~A0; d_write(addr | BHE, c); } else { addr &= ~BHE; d_write(addr | A0, c << 8); } D 9 tail++; if (tail >= 0x00003200) tail = 0x00003000; d_write(0x00000106, tail); E 9 I 9 tail = (tail & ~(BufSize-1)) | ((tail+1) & (BufSize-1)); d_write(TCB(unit)+TransmitTail, tail); E 9 } getstr(s, l) char *s; short l; { register int i, c ; for(i=0; (i '9')) { x = BELL ; goto echo ; } num = (num * 10) + (x - '0'); pos++; echo: putchar(x); } if (pos == 0) num = -1 ; return(num); } I 8 #endif E 8 I 5 char *sbuf; sprintf(buf,fmt, x1) char *fmt,*buf; unsigned x1; { register c; register unsigned int *adx; char *s; sbuf = buf; adx = &x1; loop: while((c = *fmt++) != '%') { if(c == '\0') { sputchar(c); return; } sputchar(c); } c = *fmt++; if(c == 'd' || c == 'u' || c == 'o' || c == 'x') sprintn((long)*adx, c=='o'? 8: (c=='x'? 16:10)); else if(c == 's') { s = (char *)*adx; while(c = *s++) sputchar(c); } else if (c == 'D') { sprintn(*(long *)adx, 10); adx += (sizeof(long) / sizeof(int)) - 1; } D 7 adx++; E 7 adx++; goto loop; } sprintn(n, b) long n; register b; { register i, nd, c; int flag; int plmax; char d[12]; c = 1; flag = n < 0; if (flag) n = (-n); if (b==8) plmax = 11; else if (b==10) plmax = 10; else if (b==16) plmax = 8; if (flag && b==10) { flag = 0; sputchar('-'); } for (i=0; i= b) { nd -= b; c = 1; } else c = 0; } d[i] = nd; n = n / b ; if ((n==0) && (flag==0)) break; } if (i == plmax) i--; for ( ; i>=0; i--) sputchar("0123456789ABCDEF"[d[i]]); } sputchar(c) char c; { c &= 0x7f; *sbuf++ = c; if (c == '\n') *sbuf++ = '\r' ; if (c == '\r') *sbuf++ = '\n' ; } E 5 E 1 h31760 s 00001/00001/00175 d D 4.4 87/05/14 16:45:47 build 8 7 c removed old SCCS strings and inserted #ident BB e s 00001/00001/00175 d D 4.3 87/04/22 11:21:52 dc 7 6 c Add Bull changes from 03/05/87 e s 00000/00001/00176 d D 4.2 87/02/26 18:39:14 dc 6 5 c convert printf to new calling conventions /dc e s 00000/00000/00177 d D 4.1 87/02/26 17:16:54 dc 5 4 c rolled rev to -r4 /dc e s 00000/00000/00177 d D 3.1 87/01/19 09:30:52 build 4 3 c rolled rev to -r3 /dc e s 00000/00000/00177 d D 2.1 87/01/19 09:30:52 build 3 2 c AUTO NULL DELTA e s 00001/00000/00176 d D 1.2 87/01/16 10:26:41 build 2 1 c add ident string /dc e s 00176/00000/00000 d D 1.1 87/01/13 18:22:01 build 1 0 c Placed under source control - dc e u U f b f n t T I 2 D 7 /* "%W% %E%" */ E 7 I 7 D 8 /* " %W% %E% " */ E 8 I 8 #ident " %W% %E% " E 8 E 7 E 2 I 1 #include #include #define KEYBOARD 0x01000000 #define BS 0x08 #define BELL 0x07 /* * Scaled down version of C Library printf. * Only %s %u %d (==%u) %o %x %D are recognized. * Used to print diagnostic information * directly on console tty. * Since it is not interrupt driven, * all system activities are pretty much suspended. * Printf should not be used for chit-chat. */ printf(fmt, x1) register char *fmt; unsigned x1; { register c; register unsigned int *adx; char *s; adx = &x1; loop: while((c = *fmt++) != '%') { if(c == '\0') return; putchar(c); } c = *fmt++; if(c == 'd' || c == 'u' || c == 'o' || c == 'x') printn((long)*adx, c=='o'? 8: (c=='x'? 16:10)); else if(c == 's') { s = (char *)*adx; while(c = *s++) putchar(c); } else if (c == 'D') { printn(*(long *)adx, 10); adx += (sizeof(long) / sizeof(int)) - 1; } adx++; D 6 adx++; E 6 goto loop; } printn(n, b) long n; register b; { register i, nd, c; int flag; int plmax; char d[12]; c = 1; flag = n < 0; if (flag) n = (-n); if (b==8) plmax = 11; else if (b==10) plmax = 10; else if (b==16) plmax = 8; if (flag && b==10) { flag = 0; putchar('-'); } for (i=0; i= b) { nd -= b; c = 1; } else c = 0; } d[i] = nd; n = n / b; if ((n==0) && (flag==0)) break; } if (i == plmax) i-- ; for ( ; i>=0; i--) { putchar("0123456789ABCDEF"[d[i]]); } } getchar(flag) int flag; { int data ; d_write(KEYBOARD, 0xC2000000); d_read(KEYBOARD, &data); while (1) { d_read(KEYBOARD, &data); if ((data & 0x02) == 0) break; } data = ((data >> 16) & 0x7F); if (data == '\r') data = '\n'; if (flag) putchar(data); return(data); } putchar(c) register int c; { register int cmd; int status; c &= 0x7F ; if (c == '\n') putchar('\r'); d_write(KEYBOARD, c<<24); status = 2; while (status & 2) d_read(KEYBOARD, &status); } getstr(s, l) char *s; short l; { register int i, c ; for(i=0; (i '9')) { x = BELL ; goto echo ; } num = (num * 10) + (x - '0'); pos++; echo: putchar(x); } if (pos == 0) num = -1 ; return(num); } E 1 h50451 s 00001/00001/00237 d D 4.6 87/05/14 16:45:58 build 14 13 c removed old SCCS strings and inserted #ident BB e s 00026/00002/00212 d D 4.5 87/05/05 15:53:13 dc 13 12 c dc - Add adaptive bad block loader e s 00001/00001/00213 d D 4.4 87/05/05 12:01:07 dc 12 11 c dc - supply page number to ptoedma e s 00002/00000/00212 d D 4.3 87/04/22 12:36:44 build 11 10 c dc - add Bull changes e s 00001/00001/00211 d D 4.2 87/04/22 11:22:30 dc 10 9 c Add Bull changes from 03/05/87 e s 00000/00000/00212 d D 4.1 87/02/26 17:16:57 dc 9 8 c rolled rev to -r4 /dc e s 00004/00004/00208 d D 3.5 87/02/20 10:34:33 build 8 7 c .. more smd.h updates e s 00017/00016/00195 d D 3.4 87/02/20 09:23:12 dc 7 6 c update to latest smd.h e s 00000/00003/00211 d D 3.3 87/02/12 15:31:36 build 6 5 c remove a few printfs e s 00006/00013/00208 d D 3.2 87/02/12 15:26:56 build 5 4 c add bull changes e s 00000/00000/00221 d D 3.1 87/01/19 09:30:55 build 4 3 c rolled rev to -r3 /dc e s 00000/00000/00221 d D 2.1 87/01/19 09:30:55 build 3 2 c AUTO NULL DELTA e s 00001/00000/00220 d D 1.2 87/01/16 10:26:44 build 2 1 c add ident string /dc e s 00220/00000/00000 d D 1.1 87/01/13 18:22:02 build 1 0 c Placed under source control - dc e u U f b f n t T I 2 D 10 /* "%W% %E%" */ E 10 I 10 D 14 /* " %W% %E% " */ E 14 I 14 #ident " %W% %E% " E 14 E 10 E 2 I 1 #include #include #include #include #include I 13 #include E 13 #include "common.h" /*-------------------------------------------------*/ /* */ /* gestion interne des io physique disque */ /* utilisees par le loader */ /* */ /*-------------------------------------------------*/ D 5 struct smdcb Smd[] = { SMD_SIZE, 0 } ; E 5 I 5 struct smdcb Smd[1] ; E 5 unsigned char nsect; unsigned short npist; D 5 extern char *cb_bblbuf, *error[] ; E 5 I 5 extern char *cb_bblbuf; E 5 int recon() { uint ret, d, status ; ret = 0 ; d = disc_dev << 24 ; if (d_read(d, &status) & 3) goto bad ; if ((status >> 24) != disc_dev) goto bad ; if (status & 0x00C00000) goto bad ; ret = 1 ; bad: return(ret) ; } int smd_type() { register struct vtoc *p; register struct smdcb *smd = Smd ; int res ; I 13 int npg; int i; int L_max; E 13 /* reconnaissance */ if (recon() == 0) return(1) ; smd->gorder = SMD_SIZE ; if ( exec_dcmd() ) return(1); smd->gorder = SMD_READ; D 5 smd->count0 = (2 * BLKSIZE) >> 8 ; E 5 I 5 D 13 smd->count0 = (2 * BLKSIZE) >> 8 ; /* transfer 2 pages */ E 13 I 13 npg = BBMINP; again: smd->count0 = (npg * BLKSIZE) >> 8 ; /* set high byte of dma count */ E 13 E 5 smd->count1 = 0 ; D 7 smd->head = 0 ; smd->sector = 6; smd->cyl_high = 0 ; smd->cyl_low = 0 ; D 5 smd->addr0 = BUF_BBLK >> 16 ; smd->addr1 = BUF_BBLK >> 8 ; smd->addr2 = BUF_BBLK ; smd->header[0] = (BUF_BBLK >> 8) + 0x10; E 5 I 5 smd->mem_addr = BUF_BBLK; /* real memory address */ E 7 I 7 D 8 smd->da_r.head = 0 ; smd->da_r.sector = AD_VTOC ; smd->da_r.cyl_high = 0 ; smd->da_r.cyl_low = 0 ; E 8 I 8 smd->da_r.adrdsk.head = 0 ; smd->da_r.adrdsk.sector = AD_VTOC ; smd->da_r.adrdsk.cyl_high = 0 ; smd->da_r.adrdsk.cyl_low = 0 ; E 8 smd->ma_r.mem_addr = BUF_BBLK ; /* real memory address */ E 7 D 12 smd->header[0] = ptoedma(BUF_BBLK+BLKSIZE); /* 'next' buffer addr */ E 12 I 12 D 13 smd->header[0] = ptoedma((BUF_BBLK+BLKSIZE)>>BPPSHIFT); /* 'next' buffer addr */ E 13 I 13 /* set all needed extended dma addresses */ for (i=1 ; iheader[i-1] = ptoedma((BUF_BBLK+i*BLKSIZE)>>BPPSHIFT); E 13 E 12 I 7 E 7 E 5 if ( exec_dcmd()) return(1); p = (struct vtoc *)cb_bblbuf; #ifdef DEBUG if (p->v_sanity != VTOC_SANE) printf("\ndisk not formated\n") ; else printf("\nBad Bloc Table in memory\n"); #endif I 13 /* Compute number of pages required to hold the bad blocks */ L_max = sizeof(struct vtoc) + (p->v_cyls) * sizeof(struct bb_ind) + (p->v_nbbmax) * sizeof(struct bb_gb) ; L_max = btoc(L_max); if (L_max > npg) { /* check for list to large for 1 transfer */ if ((L_max > SMDMAXPGS) || (L_max > BUF_BBLK_PGS)) { #ifdef DEBUG printf("\nBad Block list too long\n") ; #endif DEBUG return(1) ; } npg = L_max; /* set new length */ goto again; /* redo the read */ } E 13 return(0); } /*RDP ====== | | entrees-sorties physiques disque | | valeur rendue: |--------------- | OK | | parametres d'entree: |--------------------- | bloc no de bloc physique a lire (bloc size = page size) | gorder ordre pour le controleur | */ int rdp(bloc, gorder) uint bloc; char gorder; { register struct smdcb *smd = Smd ; register struct vtoc *p ; struct bb_ind *indtab ; struct bb_gb *bbgb ; char *ptr ; uint addsk ; register rem; register ushort cylin ; #ifdef DEBUG printf("rdp(%x, %x)\n", bloc, gorder) ; #endif DEBUG bloc <<= 1 ; cylin = bloc / npist ; p = (struct vtoc *)cb_bblbuf; if (p->v_sanity == VTOC_SANE) cylin += p->v_part[disc_part].p_start; else cylin += 1; rem = bloc % npist ; D 7 smd->head = rem / nsect; smd->sector = rem % nsect; addsk = (cylin << 16) + (smd->head << 8) + smd->sector; E 7 I 7 smd->da_r.adrdsk.head = rem / nsect; smd->da_r.adrdsk.sector = rem % nsect; addsk = (cylin << 16) + (smd->da_r.adrdsk.head << 8) + smd->da_r.adrdsk.sector; E 7 if (p->v_sanity == VTOC_SANE) { ptr = (char *)p + sizeof(struct vtoc) ; if ((uint)ptr & 3) ptr += (char *)2 ; indtab = (struct bb_ind *)ptr ; ptr = (char *)indtab + (p->v_cyls)*sizeof(struct bb_ind) ; if ((uint)ptr & 3) ptr += (char *)2 ; bbgb = (struct bb_gb *)ptr ; indtab += cylin; if (indtab->b_mapind != p->v_nbbmax) { bbgb += indtab->b_mapind ; while (bbgb->bb < addsk) bbgb++ ; if (bbgb->bb == addsk) { cylin = bbgb->gb >> 16 ; D 7 smd->head = (bbgb->gb >> 8) & 0xFF ; smd->sector = bbgb->gb & 0xFF ; E 7 I 7 smd->da_r.adrdsk.head = (bbgb->gb >> 8) & 0xFF ; smd->da_r.adrdsk.sector = bbgb->gb & 0xFF ; E 7 #ifdef DEBUG printf("\nbad bloc : %x -> %x\n", bbgb->bb, bbgb->gb); #endif DEBUG } } } D 7 smd->cyl_high = cylin >> 8 ; smd->cyl_low = cylin & 0xFF; E 7 I 7 smd->da_r.adrdsk.cyl_high = cylin >> 8 ; smd->da_r.adrdsk.cyl_low = cylin & 0xFF; E 7 #ifdef DEBUG printf("\nbloc = %d, head = %d, cylin = %d, sector = %d\n", D 7 bloc>>1, smd->head, cylin, smd->sector); E 7 I 7 bloc>>1, smd->da_r.adrdsk.head, cylin, smd->da_r.adrdsk.sector); E 7 #endif smd->gorder = gorder ; smd->count0 = BLKSIZE >> 8 ; smd->count1 = 0 ; D 5 smd->addr0 = BUF_ME >> 16 ; smd->addr1 = BUF_ME >> 8 ; smd->addr2 = BUF_ME ; E 5 I 5 D 7 smd->mem_addr = BUF_ME; /* real memory address */ E 7 I 7 smd->ma_r.mem_addr = BUF_ME ; /* real memory address */ E 7 E 5 return( exec_dcmd() ); } int exec_dcmd() { register unsigned char *pmd; register struct smdcb *smd ; int idev, dev, y, err; pmd = (unsigned char *)Smd ; y = sizeof(struct smdcb) ; idev = (disc_dev << 16) + (disc_unit * y) ; dev = (idev + y) << 8 ; while ( y ) { dev -= 0x0100 ; y-- ; if (err = d_write(dev + pmd[y], 0)) { D 6 printf("\nd_write: error = %x\n", err); E 6 return(1) ; } } #ifdef DEBUG printf("d_write(%x)", dev + pmd[y]); #endif for ( ; ; ) { while (itest(&err)) ; if ((err>>24) == disc_dev) break ; } flush(); if (err & 0xFF00) { I 11 #ifdef DEBUG E 11 printf("\nDisk Error = %x\n", (err >> 8)& 0xFF); I 11 #endif E 11 return(1) ; } if (pmd[0] == SMD_SIZE) { smd = (struct smd *)(idev) ; D 7 if (err = d_read((uint)(&smd->sector) << 8, &y)) { E 7 I 7 if (err = d_read((uint)(&smd->da_r.adrdsk.sector) << 8, &y)) { E 7 D 6 printf(error[0], &smd->sector, err) ; E 6 return(1) ; } nsect = (y + 1) & 0xFF ; D 7 if (err = d_read((uint)(&smd->head) << 8, &y)) { E 7 I 7 if (err = d_read((uint)(&smd->da_r.adrdsk.head) << 8, &y)) { E 7 D 6 printf(error[0], &smd->head, err) ; E 6 return(1) ; } npist = (y + 1) & 0xFF ; #ifdef DEBUG printf("\nnb secteurs / pistes = %d / %d\n", nsect, npist); #endif npist *= nsect ; } return(0); } E 1 h22421 s 00001/00001/00025 d D 4.3 87/05/14 16:46:11 build 8 7 c removed old SCCS strings and inserted #ident BB e s 00001/00001/00025 d D 4.2 87/04/22 10:50:10 dc 7 6 c Add Bull changes from 03/05/87 e s 00000/00000/00026 d D 4.1 87/02/26 17:16:27 dc 6 5 c rolled rev to -r4 /dc e s 00000/00000/00026 d D 3.1 87/02/12 14:09:36 build 5 4 c rolled rev to -r3 /dc e s 00000/00000/00026 d D 2.1 87/02/12 14:09:36 build 4 3 c AUTO NULL DELTA e s 00001/00000/00025 d D 1.2 87/02/12 14:07:52 build 3 1 c add ident string /dc e s 00000/00000/00025 d R 1.2 87/02/12 14:06:55 build 2 1 c add ident string /dc e s 00025/00000/00000 d D 1.1 87/02/12 14:06:33 build 1 0 c Placed under source control - dc e u U f b f n t T I 3 D 7 /* "%W% %E%" */ E 7 I 7 D 8 /* " %W% %E% " */ E 8 I 8 #ident " %W% %E% " E 8 E 7 E 3 I 1 /* common loader datas */ /* ------------------- */ #include "load.h" /* volume description */ int disc_unit; /* unit number */ int disc_dev; /* device number */ int disc_part; /* partition number */ char file_name[80]; /* file description */ struct dinode i_node; short i_depl; /* offset in CB's buffer */ short i_blk; /* current block number in file */ int tabind[BS_INT]; /* first level's indirection table */ /* memory description */ int p_free; /* next memory free page */ E 1 h12371 s 00000/00000/00067 d D 4.1 87/02/26 17:17:03 dc 5 4 c rolled rev to -r4 /dc e s 00000/00000/00067 d D 3.1 87/01/19 09:30:59 build 4 3 c rolled rev to -r3 /dc e s 00000/00000/00067 d D 2.1 87/01/19 09:30:59 build 3 2 c AUTO NULL DELTA e s 00001/00000/00066 d D 1.2 87/01/16 10:26:50 build 2 1 c add ident string /dc e s 00066/00000/00000 d D 1.1 87/01/13 18:22:04 build 1 0 c Placed under source control - dc e u U f b f n t T I 2 ; "%W% %E%" E 2 I 1 ; csect code global _start,_start1 global _d_read,_d_write global _itest,_flush global _load_enable align 4 _start: laddr r0,0DFH ; Unmask in R0 word 4C051000H ; maintenance instruction (Imask) for IT laddr r14,0FC000H,l ; temporary loader stack laddr r0,_start,l store r0,r14,24 call r11,_auto_move,l; move the image from here to FC000 _start1: movei r0,1 move sr14,r0 laddr r0,_ccb,l move sr11,r0 call r11,_main,l br * ; These are routines needed by the system for ; reading and writing to io devices ; ; 4) d_read(dev,&data) ; 5) d_write(dev,data) ; align 4 _d_read: load r2,r14,24 ; Get 1st argument - device load r3,r14,32 ; Get 2nd argument - int pointer read r0,r2 ; Physical device read store r1,r3,0 ; store returned data ret r11,r11 align 4 _d_write: load r2,r14,24 ; Get 1st argument - device load r0,r14,32 ; Get 2nd argument - data to be sent to device write r0,r2 ; Physical device write ret r11,r11 align 4 _itest: laddr r0,0DFH ; Unmask in R0 word 4C051000H ; maintenance instruction (Imask) for IT load r2,r14,24 ; Get argument - int pointer to save dev # itest r0 ; Check for interruts r0 = 0 for true ; 1 for false and r1 = device that interrupted store r1,r2,0 ; store returned interrupting device ret r11,r11 align 4 _flush: movei r1,9 flush ret r11,r11 align 4 _load_enable: elogr r0 ; test switch load enable for auto boot andi r0,0 ; no load_enable mask on hdw ret r11,r11 E 1 h47554 s 00002/00001/00076 d D 4.5 87/05/05 15:56:09 dc 11 10 c dc - update depends for smd.c prf_cio.c e s 00010/00001/00067 d D 4.4 87/04/22 15:12:58 dc 10 9 c dc - Add headwall diagnostic functions e s 00001/00001/00067 d D 4.3 87/04/22 10:47:34 dc 9 8 c Add Bull changes from 03/05/87 e s 00003/00011/00065 d D 4.2 87/04/22 10:45:33 dc 8 7 c Add Bull changes from 03/05/87 e s 00000/00000/00076 d D 4.1 87/02/26 17:16:21 dc 7 6 c rolled rev to -r4 /dc e s 00001/00002/00075 d D 3.3 87/02/18 16:00:39 build 6 5 c fix up install commands. install in $SPX/etc. don't strip. e s 00046/00025/00031 d D 3.2 87/02/12 16:17:03 build 5 4 c add bull updates e s 00000/00000/00056 d D 3.1 87/02/12 13:28:55 build 4 3 c rolled rev to -r3 /dc e s 00000/00000/00056 d D 2.1 87/02/12 13:28:55 build 3 2 c AUTO NULL DELTA e s 00001/00000/00055 d D 1.2 87/02/12 13:28:34 build 2 1 c add ident string /dc e s 00055/00000/00000 d D 1.1 87/02/12 13:27:37 build 1 0 c Placed under source control - dc e u U f b f n t T I 2 D 9 # "%W% %E%" E 9 I 9 # " %W% %E% " E 9 E 2 I 1 D 5 INCRT = $(SPX)/usr/include E 5 D 5 CFLAGS = -O -I$(INCRT) E 5 I 5 D 8 O_LIV = diskboot odiskboot bootfdlp E 8 I 8 O_LIV = diskboot bootfdlp E 8 E 5 D 5 COMMON = automove.o main.o load.o file.o smd.o E 5 I 5 HEADERS = load.h common.h E 5 D 5 BOOTCIO = startcio.o $(COMMON) prf_cio.o E 5 I 5 COMMON = start.o automove.o load.o file.o smd.o E 5 D 5 BOOTHDW = starthdw.o $(COMMON) prf_cio.o E 5 I 5 NBOOTCIO = $(COMMON) main.o prf_cio.o E 5 D 5 BOOTFD = startcio.o $(COMMON) prf_fdlp.o E 5 I 5 D 8 OBOOTCIO = $(COMMON) main_old.o prf_cio.o E 8 I 8 BOOTFDLP = $(COMMON) main_fdlp.o prf_fdlp.o E 8 E 5 D 5 DESTDIR = /etc E 5 I 5 D 8 BOOTFDLP = $(COMMON) main_old.o prf_fdlp.o E 5 E 8 D 5 O_LIV = diskboot boothdw bootfdlp E 5 I 5 # load instruction file LFILE = ld.file E 5 I 5 # size of aouthdr + 3 section headers (not quite, but this is # the stuff from which this constant comes. AOUTHDSIZE = 168 E 5 all: $(O_LIV) D 5 diskboot: $(BOOTCIO) ld.file ld -N -o diskboot ld.file $(BOOTCIO) E 5 I 5 diskboot: $(NBOOTCIO) $(LFILE) $(LD) -N -o tmpboot $(LFILE) $(NBOOTCIO) strip -m tmpboot dd if=tmpboot of=diskboot bs=$(AOUTHDSIZE) skip=1 rm tmpboot E 5 D 5 boothdw: $(BOOTHDW) ld.file ld -N -o boothdw ld.file $(BOOTHDW) E 5 I 5 D 8 odiskboot: $(OBOOTCIO) $(LFILE) $(LD) -N -o tmpboot $(LFILE) $(OBOOTCIO) strip -m tmpboot dd if=tmpboot of=odiskboot bs=$(AOUTHDSIZE) skip=1 rm tmpboot E 5 E 8 D 5 bootfdlp: $(BOOTFD) ld.file ld -N -o bootfdlp ld.file $(BOOTFD) E 5 I 5 bootfdlp: $(BOOTFDLP) $(LFILE) $(LD) -N -o tmpboot $(LFILE) $(BOOTFDLP) strip -m tmpboot dd if=tmpboot of=bootfdlp bs=$(AOUTHDSIZE) skip=1 rm tmpboot E 5 I 5 D 10 start.o: $(INC)/sys/ass.h E 10 I 10 start.o: $(INC)/sys/ass.h \ $(INC)/sys/const.as.h \ $(INC)/sys/maint.h \ $(INC)/sys/physmem.h E 10 E 5 automove.o: load.h D 5 main.o: common.h E 5 I 5 main.o: $(INC)/sys/param.h $(INC)/sys/types.h $(INC)/sys/dir.h \ $(INC)/sys/ino.h $(INC)/sys/vtoc.h common.h E 5 D 5 load.o: E 5 I 5 D 8 main_old.o: $(INC)/sys/param.h $(INC)/sys/types.h $(INC)/sys/dir.h \ E 8 I 8 main_fdlp.o: $(INC)/sys/param.h $(INC)/sys/types.h $(INC)/sys/dir.h \ E 8 $(INC)/sys/ino.h $(INC)/sys/vtoc.h common.h E 5 D 5 file.o: E 5 I 5 load.o: $(INC)/sys/param.h $(INC)/sys/types.h $(INC)/a.out.h \ $(INC)/sys/ino.h load.h E 5 D 5 smd.o: E 5 I 5 file.o: $(INC)/sys/param.h $(INC)/sys/types.h $(INC)/sys/dir.h \ $(INC)/sys/ino.h $(INC)/sys/smd.h common.h E 5 D 5 nm: nm -xv $(O_LIV) | lp -tnm_boot E 5 I 5 smd.o: $(INC)/sys/param.h $(INC)/sys/types.h $(INC)/sys/ino.h \ D 11 $(INC)/sys/filsys.h $(INC)/sys/smd.h common.h E 11 I 11 $(INC)/sys/filsys.h $(INC)/sys/smd.h $(INC)/sys/sysmacros.h common.h E 11 I 10 prf_cio.o: $(INC)/sys/types.h \ $(INC)/ctype.h \ $(INC)/sys/termio.h \ $(INC)/sys/cio.h \ I 11 $(INC)/sys/smd.h \ E 11 load.h E 10 E 5 D 5 print: pr -n -f Makefile *.c *.h *.s | lp -tBOOT E 5 I 5 $(LFILE): s.$(LFILE) $(GET) $(GFLAGS) -p $? > $@ E 5 clean: D 5 rm -f *.o E 5 I 5 rm -f *.o tmpboot E 5 clobber: clean D 5 rm -f $(O_LIV) E 5 I 5 rm -f $(O_LIV) $(HEADERS) $(LFILE) E 5 I 5 D 6 DESTDIR = /etc E 6 I 6 DESTDIR = $(SPX)/etc E 6 E 5 install: D 5 rm -f $(DESTDIR)/diskboot $(DESTDIR)/boothdw $(DESTDIR)/bootfdlp E 5 I 5 cd $(DESTDIR) ; rm -f $(O_LIV) E 5 ls $(O_LIV) | cpio -pdmv $(DESTDIR) D 6 cd $(DESTDIR); strip -m $(O_LIV) E 6 cd $(DESTDIR) ; chmod 664 $(O_LIV) ;\ chgrp bin $(O_LIV) ; chown bin $(O_LIV) ; E 1 h03655 s 00001/00001/00124 d D 4.3 87/05/14 16:46:22 build 7 6 c removed old SCCS strings and inserted #ident BB e s 00005/00030/00120 d D 4.2 87/04/22 11:30:58 dc 6 5 c Add Bull changes from 03/05/87 e s 00000/00000/00150 d D 4.1 87/02/26 17:16:46 dc 5 4 c rolled rev to -r4 /dc e s 00000/00000/00150 d D 3.1 87/02/12 14:13:19 build 4 3 c rolled rev to -r3 /dc e s 00000/00000/00150 d D 2.1 87/02/12 14:13:19 build 3 2 c AUTO NULL DELTA e s 00001/00000/00149 d D 1.2 87/02/12 14:12:32 build 2 1 c add ident string /dc e s 00149/00000/00000 d D 1.1 87/02/12 14:11:48 build 1 0 c Placed under source control - dc e u U f b f n t T I 2 D 6 /* "%W% %E%" */ E 6 I 6 D 7 /* " %W% %E% " */ E 7 I 7 #ident " %W% %E% " E 7 E 6 E 2 I 1 #include #include #include #include #include #include "common.h" /* exchange memory description */ D 6 #define KDB 0x4B44423E /* "KDB>" magic */ E 6 char *cb_buf = (char *)BUF_ME ; /* CB's buffer address */ char *cb_bblbuf = (char *)BUF_BBLK ; /* BadBlocs' buffer address */ char UNIX[8] = "unix" ; char *error[] = { "d_read(%x) error = %x\n", "\nBad format for '%s' on c%dd%ds%d\n", "\nNo '%s' system name on c%dd%ds%d\n", "\nNo c%dd%d in this machine\n", "\nNo smd disk in this machine\n", "\nFatal Error on loading\n", " ???" } ; char *texte[] = { "\n load :\ndevice number = ", "\nunit number = ", "\npartition number = ", "\nfile name = ", "%d" } ; fatal() { printf(error[E_FATAL]) ; for (;;) ; } main() { register unsigned i, l ; register device ; register struct vtoc *p ; register int *magic ; int (*entry)(); /* get disk me physical address */ D 6 l = load_enable() ; magic = (int *)0 ; E 6 disc_dev = 31 ; D 6 if (*magic == KDB) { disc_dev = *(++magic) ; disc_unit = *(++magic) ; if ( l ) goto autol ; else goto manol ; } E 6 for( ; ; disc_dev--) { D 6 if ( l ) { disc_unit = UNIT0; for( ; disc_dev>0; disc_dev--) if ( recon() ) goto autol ; goto F0 ; autol: l = 0 ; if ( smd_type() ) { nodsk: printf(error[E_UNIT], disc_dev, disc_unit); continue; } disc_part = P0; goto Copx ; } E 6 /* adresse disque ? */ T0: printf(texte[0]); device = getnum(); if (device < 0) { for( ; disc_dev>0; disc_dev--) if ( recon() ) goto D0 ; F0: printf(error[E_SMD]) ; fatal() ; D0: printf(texte[4], disc_dev); } else { if ((device == 0) || (device > 31)) { printf(error[E_ERR]) ; goto T0 ; } disc_dev = device ; } /* numero d'unite ? */ T1: printf(texte[1]); disc_unit = getnum(); if (disc_unit < 0) { disc_unit = UNIT0; printf(texte[4], disc_unit); } else if (disc_unit > 3) { printf(error[E_ERR]) ; goto T1 ; } D 6 manol: if ( smd_type() ) goto nodsk ; E 6 I 6 if ( smd_type() ) { printf(error[E_UNIT], disc_dev, disc_unit); continue; } E 6 p = (struct vtoc *)cb_bblbuf ; /* numero de partition ? */ T2: printf(texte[2]); if (p->v_sanity != VTOC_SANE) goto dP0 ; disc_part = getnum(); if (disc_part < 0) { dP0: disc_part = P0; printf(texte[4], disc_part); } else if (disc_part > p->v_nparts) { printf(error[E_ERR]) ; goto T2 ; } /* nom du systeme ? */ printf(texte[3]); getstr(file_name, 80); if (file_name[0] == 0) { printf(UNIX) ; Copx: i = 5 ; while(i--) file_name[i] = UNIX[i] ; } #ifdef DEBUG printf("load system"); #endif Unix: putchar('\n'); if ((i=load(file_name, &entry,0)) == OK) goto entry; printf (error[i], file_name, disc_dev, disc_unit, disc_part); } /* jmp to system code */ entry : #ifdef DEBUG printf("running system code = %x\n", entry); #endif flush(); entry(disc_dev, disc_unit, disc_part); } E 1 h08337 s 00023/00000/00103 d D 4.5 87/04/22 15:08:56 dc 11 10 c dc - Add headwall diagnostic functions e s 00001/00006/00102 d D 4.4 87/04/22 11:30:00 dc 10 9 c Add Bull changes from 03/05/87 e s 00005/00001/00103 d D 4.3 87/02/26 19:10:51 build 9 8 c rephase stack correctly e s 00025/00021/00079 d D 4.2 87/02/26 17:17:40 dc 8 7 c convert to new calling conventions /dc e s 00000/00000/00100 d D 4.1 87/02/26 17:17:00 dc 7 5 c rolled rev to -r4 /dc e s 00025/00021/00079 d R 3.3 87/02/26 17:14:24 dc 6 5 c convert to new calling conventions /dc e s 00041/00008/00059 d D 3.2 87/02/12 15:07:45 build 5 4 c update to new bull code, include ass.h, and UNMASK I_MASK macros e s 00000/00000/00067 d D 3.1 87/01/19 09:30:57 build 4 3 c rolled rev to -r3 /dc e s 00000/00000/00067 d D 2.1 87/01/19 09:30:57 build 3 2 c AUTO NULL DELTA e s 00001/00000/00066 d D 1.2 87/01/16 10:26:48 build 2 1 c add ident string /dc e s 00066/00000/00000 d D 1.1 87/01/13 18:22:03 build 1 0 c Placed under source control - dc e u U f b f n t T I 2 D 10 ; "%W% %E%" E 10 I 10 ; " %W% %E% " E 10 I 5 #include I 11 #include #include #include E 11 ccb equ 2fb000H E 5 E 2 I 1 ; csect code global _start,_start1 global _d_read,_d_write global _itest,_flush D 10 global _load_enable E 10 I 5 global _start_loader I 11 global _HeadwallDiag E 11 E 5 align 4 _start: I 9 nop E 9 D 5 laddr r0,0CFH ; Unmask in R0 word 4C051000H ; maintenance instruction (Imask) for IT laddr r14,0FC000H,L ; temporary loader stack E 5 I 5 laddr r14,2fc000H-72,l ; loader stack D 8 store r0,r14,24 ; disc board address store r1,r14,32 ; disc unit number store r2,r14,40 ; partition number store r3,r14,48 ; file name pointer store r5,r14,56 ; KDB magic E 8 I 8 ; .... save params until we have automoved ... store r0,r14,STKPARAM1 ; disc board address store r1,r14,STKPARAM2 ; disc unit number store r2,r14,STKPARAM3 ; partition number store r3,r14,STKPARAM4 ; file name pointer store r5,r14,STKPARAM5 ; KDB magic E 8 laddr r14,r14,-72 ; laddr r0,UNMASK ; Unmask in R0 halfword I_MASK ; MAINT r0,twrited E 5 laddr r0,_start,l D 8 store r0,r14,24 D 5 call r11,_auto_move,l; move the image from here to FC000 E 5 I 5 call r11,_auto_move,l; move the image from here to 2FC000 E 8 I 8 call LINK,_auto_move,l; move the image from here to 2FC000 E 8 E 5 _start1: I 5 D 8 laddr r14,r15,72 E 8 I 8 D 9 laddr r14,r14,72 E 9 I 9 ; Since automove 'calls us back', we have to reset out stack ; in order to fetch the temps which were stored above. laddr r14,2fc000H-72,l ; reset loader stack E 9 E 8 E 5 movei r0,1 move sr14,r0 D 5 laddr r0,_ccb,l E 5 I 5 move r0,sr11 laddr r1,ccb,l br r0 >= r1,st100 laddr r2,271 ccbloop: load r3,r0,0 store r3,r1,0 add r0,4 add r1,4 sub r2,1 br r2 >= 0,ccbloop ! laddr r3,7fffffffH,l store r3,r1,0 store r3,r1,4 laddr r0,ccb,l E 5 move sr11,r0 I 5 st100: I 9 nop E 9 E 5 D 8 call r11,_main,L E 8 I 8 load r0,r14,STKPARAM1 ; disc board address load r1,r14,STKPARAM2 ; disc unit number load r2,r14,STKPARAM3 ; partition number load r3,r14,STKPARAM4 ; file name pointer ; load r5,r14,STKPARAM5 ; KDB magic passed on stack... call LINK,_main,L E 8 br * ; These are routines needed by the system for ; reading and writing to io devices ; ; 4) d_read(dev,&data) ; 5) d_write(dev,data) ; align 4 _d_read: D 8 load r2,r14,24 ; Get 1st argument - device load r3,r14,32 ; Get 2nd argument - int pointer E 8 I 8 move r2,r0 ; Get 1st argument - device move r3,r1 ; Get 2nd argument - int pointer E 8 read r0,r2 ; Physical device read store r1,r3,0 ; store returned data D 8 ret r11,r11 E 8 I 8 ret LINK,LINK E 8 align 4 _d_write: D 8 load r2,r14,24 ; Get 1st argument - device load r0,r14,32 ; Get 2nd argument - data to be sent to device E 8 I 8 move r2,r0 ; Get 1st argument - device move r0,r1 ; Get 2nd argument - data to be sent to device E 8 write r0,r2 ; Physical device write D 8 ret r11,r11 E 8 I 8 ret LINK,LINK E 8 align 4 _itest: I 8 move r2,r0 ; Get argument - int pointer to save dev # E 8 D 5 laddr r0,0CFH ; unmask word 4C051000H E 5 I 5 laddr r0,UNMASK ; Unmask in R0 halfword I_MASK ; MAINT r0,twrited E 5 D 8 load r2,r14,24 ; Get argument - int pointer to save dev # E 8 itest r0 ; Check for interruts r0 = 0 for true ; 1 for false and r1 = device that interrupted store r1,r2,0 ; store returned interrupting device D 8 ret r11,r11 E 8 I 8 ret LINK,LINK E 8 align 4 _flush: D 5 movei r1,9 E 5 I 5 movei r0,3 ; flush tmt and cache (... on headwall) E 5 flush D 8 ret r11,r11 E 8 I 8 ret LINK,LINK E 8 I 5 E 5 align 4 I 5 _start_loader: D 8 load r0,r14,24 load r8,r14,32 E 8 I 8 move r8,r1 E 8 ret r0,r0 I 11 ; Returns 1 if headwall processor AND diag mode, 0 otherwise _HeadwallDiag: MOVEI R1,0 ; get all zeros ; MACHINEID R0 ; Get the version BLOCK 1,04CH ; MAINT ... BLOCK 1,00AH ; ... R0,10 (MACHINEID) MOVEI R3,FTHeadwall ; extract headwall bit AND R1,R3 ; mask off just that one BR R1=0,NotHW ; quit if not a headwall LOADB R0,PMHWBootAux,L; Get diagnostic byte LADDR R1,PMHWBDiag ; Get diag bit mask AND R0,R1 ; Extract just this bit BR R0=0,NotHW ; if bit is off, return false MOVE R0,1 ; return true for hw AND diag mode RET LINK,LINK NotHW: MOVE r0,0 ; return false for most cases RET LINK,LINK E 11 align 4 E 5 D 10 _load_enable: elogr r0 ; test switch load enable for auto boot andi r0,1 ; load_enable mask = 1 (bit 31) D 8 ret r11,r11 E 8 I 8 ret LINK,LINK E 10 E 8 E 1 h42634 s 00001/00001/00026 d D 4.4 87/05/14 16:46:33 build 8 7 c removed old SCCS strings and inserted #ident BB e s 00002/00000/00025 d D 4.3 87/05/05 15:50:32 dc 7 6 c dc - parameterize bad block buffers e s 00001/00001/00024 d D 4.2 87/04/22 10:50:55 dc 6 5 c Add Bull changes from 03/05/87 e s 00000/00000/00025 d D 4.1 87/02/26 17:16:40 dc 5 4 c rolled rev to -r4 /dc e s 00000/00000/00025 d D 3.1 87/02/12 14:09:39 build 4 3 c rolled rev to -r3 /dc e s 00000/00000/00025 d D 2.1 87/02/12 14:09:39 build 3 2 c AUTO NULL DELTA e s 00001/00000/00024 d D 1.2 87/02/12 14:09:14 build 2 1 c add ident string /dc e s 00024/00000/00000 d D 1.1 87/02/12 14:03:52 build 1 0 c Placed under source control - dc e u U f b f n t T I 2 D 6 /* "%W% %E%" */ E 6 I 6 D 8 /* " %W% %E% " */ E 8 I 8 #ident " %W% %E% " E 8 E 6 E 2 I 1 #define OK 0 #define E_READ 0 #define E_INVALID_PROG 1 #define E_INEX_FILE 2 #define E_UNIT 3 #define E_SMD 4 #define E_FATAL 5 #define E_ERR 6 #define LOADERBASE2 0x2FC000 /* loader base after moving */ #define LOADERSIZE 2 /* must be 2 at least */ #define PGSIZE 4096 /* page size in bytes */ #define BLKSIZE 4096 /* block size in bytes */ #define BS_INT 1024 /* BLKSIZE >> 2 */ I 7 #define BBMINP 1 /* min pages for bad block list */ #define BUF_BBLK_PGS SMDMAXPGS /* pages in bb memory area */ E 7 #define BUF_ME 0x302000 /* buffer for IO */ #define BUF_BBLK 0x303000 /* buffer for bad blocks table */ #define U_LOAD_BASE 0 /* unix loading base */ #define P0 0 /* default partition number */ #define UNIT0 0 /* default unit number */ #define SECMAX 3 /* max sections number to load */ E 1 h53987 s 00001/00001/00149 d D 4.2 87/05/14 16:46:45 build 6 5 c removed old SCCS strings and inserted #ident BB e s 00000/00000/00150 d D 4.1 87/02/26 17:16:46 dc 5 4 c rolled rev to -r4 /dc e s 00000/00000/00150 d D 3.1 87/02/12 14:13:19 build 4 3 c rolled rev to -r3 /dc e s 00000/00000/00150 d D 2.1 87/02/12 14:13:19 build 3 2 c AUTO NULL DELTA e s 00001/00000/00149 d D 1.2 87/02/12 14:12:32 build 2 1 c add ident string /dc e s 00149/00000/00000 d D 1.1 87/02/12 14:11:48 build 1 0 c Placed under source control - dc e u U f b f n t T I 2 D 6 /* "%W% %E%" */ E 6 I 6 #ident " %W% %E% " E 6 E 2 I 1 #include #include #include #include #include #include "common.h" /* exchange memory description */ #define KDB 0x4B44423E /* "KDB>" magic */ char *cb_buf = (char *)BUF_ME ; /* CB's buffer address */ char *cb_bblbuf = (char *)BUF_BBLK ; /* BadBlocs' buffer address */ char UNIX[8] = "unix" ; char *error[] = { "d_read(%x) error = %x\n", "\nBad format for '%s' on c%dd%ds%d\n", "\nNo '%s' system name on c%dd%ds%d\n", "\nNo c%dd%d in this machine\n", "\nNo smd disk in this machine\n", "\nFatal Error on loading\n", " ???" } ; char *texte[] = { "\n load :\ndevice number = ", "\nunit number = ", "\npartition number = ", "\nfile name = ", "%d" } ; fatal() { printf(error[E_FATAL]) ; for (;;) ; } main() { register unsigned i, l ; register device ; register struct vtoc *p ; register int *magic ; int (*entry)(); /* get disk me physical address */ l = load_enable() ; magic = (int *)0 ; disc_dev = 31 ; if (*magic == KDB) { disc_dev = *(++magic) ; disc_unit = *(++magic) ; if ( l ) goto autol ; else goto manol ; } for( ; ; disc_dev--) { if ( l ) { disc_unit = UNIT0; for( ; disc_dev>0; disc_dev--) if ( recon() ) goto autol ; goto F0 ; autol: l = 0 ; if ( smd_type() ) { nodsk: printf(error[E_UNIT], disc_dev, disc_unit); continue; } disc_part = P0; goto Copx ; } /* adresse disque ? */ T0: printf(texte[0]); device = getnum(); if (device < 0) { for( ; disc_dev>0; disc_dev--) if ( recon() ) goto D0 ; F0: printf(error[E_SMD]) ; fatal() ; D0: printf(texte[4], disc_dev); } else { if ((device == 0) || (device > 31)) { printf(error[E_ERR]) ; goto T0 ; } disc_dev = device ; } /* numero d'unite ? */ T1: printf(texte[1]); disc_unit = getnum(); if (disc_unit < 0) { disc_unit = UNIT0; printf(texte[4], disc_unit); } else if (disc_unit > 3) { printf(error[E_ERR]) ; goto T1 ; } manol: if ( smd_type() ) goto nodsk ; p = (struct vtoc *)cb_bblbuf ; /* numero de partition ? */ T2: printf(texte[2]); if (p->v_sanity != VTOC_SANE) goto dP0 ; disc_part = getnum(); if (disc_part < 0) { dP0: disc_part = P0; printf(texte[4], disc_part); } else if (disc_part > p->v_nparts) { printf(error[E_ERR]) ; goto T2 ; } /* nom du systeme ? */ printf(texte[3]); getstr(file_name, 80); if (file_name[0] == 0) { printf(UNIX) ; Copx: i = 5 ; while(i--) file_name[i] = UNIX[i] ; } #ifdef DEBUG printf("load system"); #endif Unix: putchar('\n'); if ((i=load(file_name, &entry,0)) == OK) goto entry; printf (error[i], file_name, disc_dev, disc_unit, disc_part); } /* jmp to system code */ entry : #ifdef DEBUG printf("running system code = %x\n", entry); #endif flush(); entry(disc_dev, disc_unit, disc_part); } E 1 #ident " @(#)load.h 4.4 87/05/14 " #define OK 0 #define E_READ 0 #define E_INVALID_PROG 1 #define E_INEX_FILE 2 #define E_UNIT 3 #define E_SMD 4 #define E_FATAL 5 #define E_ERR 6 #define LOADERBASE2 0x2FC000 /* loader base after moving */ #define LOADERSIZE 2 /* must be 2 at least */ #define PGSIZE 4096 /* page size in bytes */ #define BLKSIZE 4096 /* block size in bytes */ #define BS_INT 1024 /* BLKSIZE >> 2 */ #define BBMINP 1 /* min pages for bad block list */ #define BUF_BBLK_PGS SMDMAXPGS /* pages in bb memory area */ #define BUF_ME 0x302000 /* buffer for IO */ #define BUF_BBLK 0x303000 /* buffer for bad blocks table */ #define U_LOAD_BASE 0 /* unix loading base */ #define P0 0 /* default partition number */ #define UNIT0 0 /* default unit number */ #define SECMAX 3 /* max sections number to load */ u G.textt .data@.bss/. >$^(Lړ/FG /0 01! 011/F. >$z 1NW OW LLWLWWL 8  WW..text.data.bss_startq_start12q_d_readq_d_writeq_itestq_flushqqqq_mainqSTKPARAM1STKPARAM2STKPARAM3STKPARAM4STKPARAM5PAGE_SHIFTPAGE_LENGTH_DPAGE_LENGTH_WPAGE_LENGTH_HPAGE_LENGTH_BKERNSTACKTIMER1_COUNTTIMER2_COUNTTIMER_PERIOD_start_loader_HeadwallDiag_auto_move#ident " @(#)common.h 4.3 87/05/14 " /* common loader datas */ /* ------------------- */ #include "load.h" /* volume description */ int disc_unit; /* unit number */ int disc_dev; /* device number */ int disc_part; /* partition number */ char file_name[80]; /* file description */ struct dinode i_node; short i_depl; /* offset in CB's buffer */ short i_blk; /* current block number in file */ int tabind[BS_INT]; /* first level's indirection table */ /* memory description */ int p_free; /* next memory free page */ u G .textt .data@4@.bssH8~@pހ/0 "Lwψ/~@ɞ8HHW0 C4!@W @(#)automove.c 4.3 87/05/14 @(#)load.h 4.4 87/05/14 LNR T d .text.data@.bsskk_start1k_startkk(_auto_move_copy_page_start_loaderu G` .textL .data@ @.bssH80~@q @  pu   Ҁ(  (8 pޠ  q ((pޠZ $@ ($     Ϫ(qqϪ((~@ɞ8HHW @(#)load.c 4.3 87/05/14 @(#)load.h 4.4 87/05/14 " 8 : @  T V p r x z            D  .text.data@.bss_loadlH_openlH_filehdrlH_readlH_aouthdrlHxlH_scnhdr_table/* " @(#)ld.file 4.2 87/04/22 " */ MEMORY { valid : org = 0x2FC000 , len = 0x9000 } SECTIONS { .text : {} .data : {} .bss : {} } u G.text< .data`@.bssXX`?8@~Hp" pz  z| / < >R !1z /R!z(z z zְz8KϞR 1AzzV>+Fz  zR8+!zsz ?~Hɞ@ɾ8``W8 ȩ~0q z"0q1!zXz zP0 HQ@q1!@  z ~088W@ ~8qp0 s( $(t ~8@@W@~<zzzpzRzp / -  !.p(0 pt LpB 2p2p@!D4 pz, *  !+p(0 p 2p2p@!D4p>p ' 2   1p8 p0 ~<@@W @(#)file.c 4.3 87/05/14 @(#)common.h 4.3 87/05/14 @(#)load.h 4.4 87/05/14 . 0 H J     X Z x             @ B        , .  >  ` b f h t v               $ & > X Z d f           .text<.data`.bssX_openp_i_node@p_igetp_i_blkp_rdblk p_cb_bufp_i_deplp_readp_rdpp_tabindpppp$Pp_p_freep/_disc_unit_disc_dev_disc_part_file_nameu Gx.textt+ .dataX@.bss@~8p`<*<`a q~8@@W8 ȩ~0p  p s   001@G *s  p$s s  1$Bۓ H J"p#!q     N~088W@0~8p΀ @0ppgP/Q %` pT !gP/Qv p r`q p` J q  ւNppxW( Y0ga !q    q   0  ~8ɞ0@@WP<~@p@H ` Hp8HHxL H΀LPLcܓ,L  ypHL dH  pHL .H ~@Ǟ<PPW @(#)smd.c 4.6 87/05/14 @(#)common.h 4.3 87/05/14 @(#)load.h 4.4 87/05/14 *@B  0 2       8 : FHLN 6Bdhjnpx.text+.dataX.bss_recono0o0_d_reado0to0_Smd@o0(o0#o0_rdpo0_npisto0.o0_nsecto09o0_d_writeo0_itesto0_flusho0DPo0_i_node@o0_i_deplo0_i_blko0_tabindo0_p_freeo0O_disc_dev_smd_type_exec_dcmd_cb_bblbuf_disc_part_disc_unit_file_nameu G.texth .datahh@.bssP~Lp(,0 ~LPPWHA~@s c @h d`  Jp$%!4 0!1 D  ֓>D W~@HHW @(#)main.c 4.3 87/05/14 @(#)common.h 4.3 87/05/14 @(#)load.h 4.4 87/05/14 *** No %s on c%dd%ds%d ***0 00unix  $ & 0 2  8 < >  D  R               & : B D  H J N P .texth.datah.bss_fatalmmmm$Pm_sprintfm/m_mainlm=mGm_UNIXm_loadm_flushm_i_node@m_i_deplm_i_blkm_tabindm_p_freem_cb_bufmR_disc_unit_disc_part_disc_dev_file_name_start_loader_smd_type_cb_bblbufu G .textx\ .dataxxX@.bssH<~@q.hώh 'q%'qd u o x 6o x  lBs $ǘ V) D *>~@Ǟ<HHWX?48@~HU   ˋ ʋ -p.L;^0KV@B 0    @ q!Ŋ|qL0qp~HɎ@ɮ84XXW      W @(#)prf_cio.c 4.5 87/05/14 @(#)load.h 4.4 87/05/14 0123456789ABCDEF$    " , > @ J ^ ` j .textx .dataxX.bss_sprintfm_sbufmm_sprintn m_sputchar/. >$^(Lړ/FG /0 01! 011/F. >$ ~ 1NW OW LLWLWWL 8  WWH8~@pހ/0 "Lwψ/r~@ɞ8HHW0 C4!@WH80~@qh @/Ҡ"  /Ҡpu /Ұ/Ҹ / Ҁ/Ң(  (/ؓ pޠ/؋  q ((pޠ/؋Z $@ ($     Ϫ(qqϪ((~@ɞ8HHW`?8@~Hp" /Ppz  z|/X / < >R !1z /R!z/Ӑ(z z zְ/0z8KϞR 1AzzV>+/PFz  zR/Ӑ/Ӓ8+!zs/Ӑz ?~Hɞ@ɾ8``W8 ȩ~0q /Ӓ/0z"0q1!zXz zP0/0 HQ@q1!@  z /Ӓ~088W@ ~8qp0 /0s $(t ~8@@W@~</Ӑzzzp/ӐzRzp / /}  !/~p(0 p Lp/0 2p2p@/⠋/0!D4 pz/| /z  !/{p(0 pD 2p2p@/⠋/0!D4p/⠋>p '/\2/\  1p8/\ p ~<@@W@~8/p`<`*<`a/ q~8@@W8 ȩ~0p/  p s   001@G *s  p$s s  1$Bۓ H /8J"p#!q     N~088W@0~8p΀ /P@/80/ppgP/Q %` /pT !/PgP/Q/Rv /Rp r`q p` J q  ւNppxW( Y0ga !q    q   0  ~8ɞ0@@WP<~@p/@H //` Hp8HH L H΀LL/cܓL  ypH~L dH  p/RHHL .H /P/R/P/P~@Ǟ<PPWP~L/p(/,0// /.~LPPWHA~@s c /@//L d/8`  Jp$%/@/!4 0/!1/ /D  ֓>D// /W~@HHWH<~@q.hώh/X 'q%'qd u o x 6o x  lBs $ǘ V) D *>~@Ǟ<HHWX?48@~HU   ˋ ʋ -p.L;^0KV@B 0    @ q!Ŋ|qL/҈0qp~HɎ@ɮ84XXW  /X/X  /X/X  /X/XW @(#)automove.c 4.3 87/05/14 @(#)load.h 4.4 87/05/14 @(#)load.c 4.3 87/05/14 @(#)load.h 4.4 87/05/14 @(#)file.c 4.3 87/05/14 @(#)common.h 4.3 87/05/14 @(#)load.h 4.4 87/05/14 @(#)smd.c 4.6 87/05/14 @(#)common.h 4.3 87/05/14 @(#)load.h 4.4 87/05/14 @(#)main.c 4.3 87/05/14 @(#)common.h 4.3 87/05/14 @(#)load.h 4.4 87/05/14 *** No %s on c%dd%ds%d ***0 00unix @(#)prf_cio.c 4.5 87/05/14 @(#)load.h 4.4 87/05/14 0123456789ABCDEF2 J I H G F E D C B A @ ? > = < ; : 9 8 7 6 5 4 3 2 1 0 / . - , + * ) ( ' & % $ # " !       u G\.textP .dataPP8@.bssH<~@dp.hώd z'q%'qd u o x 6o x  lBs $ǘ ) D *F~@Ǟ<HHWX?48@~HU   ˋ ʋ -Np.L;^0KV@B 0    @ q!Ŋ|qLpqp~HɎ@ɮ84XXWH<~@pDDD Dc D  DD$D~@ǎ<HHWH<~@p pz  ހ`DDD~@ǎ<HHWH8z~@pz<$p.Z Pr  :q  ~@ɞ8HHWH8~@p0Z *&  (x 9   ~@ɞ8HHW @(#)prf_fdlp.c 4.4 87/05/14 0123456789ABCDEF. > L   .textP.dataP8.bss_printfo_putcharo_printno_getchar o_d_writeo_d_reado_getstr(o_getnumo/. >$^(Lړ/FG /0 01! 011/F. >$ > 1NW OW LLWLWWL 8  WWH8~@pހ/0 "Lwψ/r~@ɞ8HHW0 C4!@WH80~@qh @/"  /pu // / Ҁ/(  (/ pޠ/  q ((pޠ/Z $@ ($     Ϫ(qqϪ((~@ɞ8HHW`?8@~Hp" /אpz  z|/ט / < >R !1z /R!z/Ћ(z z zְ/@z8KϞR 1AzzV>+/אFz  zR//8+!zs/z ?~Hɞ@ɾ8``W8 ȩ~0q //@z"0q1!zXz zP0/@ HQ@q1!@  z /~088W@ ~8qp0 /@s $(t ~8@@W@~</zzzp/ЅzRzp /׿ /׽  !/׾p(0 p Lp/@ 2p2p@//@!D4 pz/׼ /׺  !/׻p(0 pD 2p2p@//@!D4p/>p '/ל2/ל  1p8/ל p ~<@@W@~8/p`<`*<`a/ q~8@@W8 ȩ~0p/P  p s   001@G *s  p$s s  1$Bۓ H /HJ"p#!q     N~088W@0~8p΀ /@/H0/PppgP/Q %` /pT !/gP/Q/v /p r`q p` J q  ւNppxW( Y0ga !q    q   0  ~8ɞ0@@WP<~@p/P@H //` Hp8HH L H΀LL/cܓL  ypH~L dH  p/HHL .H ////~@Ǟ<PPW8/lP~H//x~$\"0////h8r/Ո/ , /pv//|/&/Ո//"//p /d/ /r$p/H/ՀX` /$/Ո//(/N(/p/Մ/P/,/P/P/ B/L  Fp!/X/( /0//N//>L// /W~HPPWH<~@dp.hώd z'q%'qd u o x 6o x  lBs $ǘ ) D *F~@Ǟ<HHWX?48@~HU   ˋ ʋ -Np.L;^0KV@B 0    @ q!Ŋ|qL/qp~HɎ@ɮ84XXWH<~@pDDD Dc D  DD$D~@ǎ<HHWH<~@p pz  ހ``DD>D~@ǎ<HHWH8z~@pz<$p.Z Pr  :q  ~@ɞ8HHWH8~@p0Z *&  (x 9   ~@ɞ8HHW @(#)automove.c 4.3 87/05/14 @(#)load.h 4.4 87/05/14 @(#)load.c 4.3 87/05/14 @(#)load.h 4.4 87/05/14 @(#)file.c 4.3 87/05/14 @(#)common.h 4.3 87/05/14 @(#)load.h 4.4 87/05/14 @(#)smd.c 4.6 87/05/14 @(#)common.h 4.3 87/05/14 @(#)load.h 4.4 87/05/14 @(#)main_fdlp.c 4.3 87/05/14 @(#)common.h 4.3 87/05/14 @(#)load.h 4.4 87/05/14 0 00unix/Ք/լ////0/L/T/p/ր/֘/Ր%dd_read(%x) error = %x Bad format for '%s' on c%dd%ds%d No '%s' system name on c%dd%ds%d No c%dd%d in this machine No smd disk in this machine Fatal Error on loading ??? load : device number = unit number = partition number = file name = @(#)prf_fdlp.c 4.4 87/05/14 0123456789ABCDEF.Q..s.automove.cs.ct.cs.ld.files.main.cs.mt.cs.prf_cio.cs.prf_fdlp.cs.smd.cs.common.hs.load.hload.hs.Makefilestart.os.start.scommon.hautomove.old.filemain.osmd.oct.oprf_cio.octbootciomt.omtbootcioprf_fdlp.omtbootfdlph22352 s 00001/00001/00038 d D 4.3 87/05/14 16:46:56 build 7 6 c removed old SCCS strings and inserted #ident BB e s 00001/00001/00038 d D 4.2 87/04/22 09:20:56 dc 6 5 c Add Bull changes from 03/05/87 e s 00000/00000/00039 d D 4.1 87/02/26 16:55:59 dc 5 4 c rolled rev to -r4 /dc e s 00000/00000/00039 d D 3.1 87/02/20 10:37:49 build 4 3 c rolled rev to -r3 /dc e s 00000/00000/00039 d D 2.1 87/02/11 15:30:42 build 3 2 c rolled rev to -r2 /dc e s 00001/00000/00038 d D 1.2 87/02/05 16:29:23 build 2 1 c add ident string /dc e s 00038/00000/00000 d D 1.1 87/02/05 16:19:33 build 1 0 c Placed under source control - dc e u U f b f n t T I 2 D 6 /* "%W% %E%" */ E 6 I 6 D 7 /* " %W% %E% " */ E 7 I 7 #ident " %W% %E% " E 7 E 6 E 2 I 1 #include "load.h" /* * Move loader from 'src' to (1M0 - 2*4k) */ extern int start() ; extern int start1() ; auto_move(src) register src; { register x, dest, entry, entry1 ; dest = LOADERBASE2 ; /* 1M0 - 2*4k0 */ for (x = 0 ; x < LOADERSIZE ; x++) { copy_page(src, dest) ; src += PGSIZE ; dest += PGSIZE ; } entry = (int)start1 ; entry1 = (int)start ; entry = LOADERBASE2 + (entry - entry1) ; execute(entry) ; } copy_page(src, dest) register int *src, *dest ; { register x ; for (x = 0 ; x < PGSIZE/4 ; x++) *dest++ = *src++ ; } execute(func) int (*func)() ; { (*func)() ; } E 1 h27634 s 00001/00001/00069 d D 4.3 87/05/14 16:47:06 build 7 6 c removed old SCCS strings and inserted #ident BB e s 00001/00001/00069 d D 4.2 87/04/22 09:21:54 dc 6 5 c Add Bull changes from 03/05/87 e s 00000/00000/00070 d D 4.1 87/02/26 16:56:03 dc 5 4 c rolled rev to -r4 /dc e s 00000/00000/00070 d D 3.1 87/02/20 10:37:50 build 4 3 c rolled rev to -r3 /dc e s 00000/00000/00070 d D 2.1 87/02/11 15:30:50 build 3 2 c rolled rev to -r2 /dc e s 00001/00000/00069 d D 1.2 87/02/05 16:21:53 build 2 1 c add ident string /dc e s 00069/00000/00000 d D 1.1 87/02/05 16:19:34 build 1 0 c Placed under source control - dc e u U f b f n t T I 2 D 6 /* "%W% %E%" */ E 6 I 6 D 7 /* " %W% %E% " */ E 7 I 7 #ident " %W% %E% " E 7 E 6 E 2 I 1 #include #include #include #include #include "load.h" #define tapeIoir 0x08 #define kcbUnit 0x1000 #define kcbStart 0x0040100c extern unsigned char *cb_buf ; inittape() { d_write(kcbUnit + CbOrder, ReadType) ; d_write(kcbUnit + AuxMsg, 0x00C0) ; d_write(kcbUnit + TargetID, 0x0608) ; d_write(kcbUnit + XCntMsb, 0x0000) ; d_write(kcbUnit + Set1Cmd0 + 2, 0x0000) ; return(0); } mtread() { unsigned int state ; unsigned char *stat ; d_write(kcbUnit + XCntLsb, BLKSIZE) ; d_write(kcbUnit + Set1Cmd0, ReadTape) ; d_write(kcbUnit + Set1Cmd4, BLKSIZE>>1) ; d_write(kcbUnit + CbPage0, (uint)(cb_buf)>>16) ; d_write(kcbUnit + CbPage0 + 2, (uint)cb_buf) ; state = mtstart() ; if (state == 0) return(0) ; stat = (char *)BUF_ME ; d_write(kcbUnit + XCntLsb, 0x0C) ; d_write(kcbUnit + Set1Cmd0, ReqSense) ; d_write(kcbUnit + Set1Cmd4, 0x0C00) ; d_write(kcbUnit + CbPage0, (uint)(BUF_ME)>>16) ; d_write(kcbUnit + CbPage0 + 2, (uint)BUF_ME) ; state = mtstart() ; #ifdef DEBUG printf("\nct : (s2,s8) = (%x,%x)\n", stat[2], stat[8]) ; #endif DEBUG if (state == 0) if (((stat[2] & 0x8F) == 0x80) && (stat[8] == 0x1C)) return(FMK) ; #ifdef DEBUG printf("\nct : state = %x ", state) ; #endif DEBUG return(-1) ; } mtstart() { uint state ; d_write(kcbStart, 0xFF) ; while(1) { while (itest(&state)) ; /* attend l'IT */ flush(); if ((state>>24) == tapeIoir) { d_read(kcbUnit + ScsiStatus1, &state) ; return(state & 0x1F) ; } } } E 1 h35221 s 00001/00000/00008 d D 4.2 87/04/22 09:18:41 dc 5 4 c Add Bull changes from 03/05/87 e s 00000/00000/00008 d D 4.1 87/02/26 16:57:03 dc 4 3 c rolled rev to -r4 /dc e s 00000/00000/00008 d D 3.1 87/02/20 10:47:43 build 3 2 c rolled rev to -r3 /dc e s 00000/00000/00008 d D 2.1 87/02/11 15:32:21 build 2 1 c rolled rev to -r2 /dc e s 00008/00000/00000 d D 1.1 87/02/05 16:19:35 build 1 0 c Placed under source control - dc e u U f b f n t T I 5 /* " %W% %E% " */ E 5 I 1 MEMORY { valid : org = 0xFC000 , len = 0x9000 } SECTIONS { .text : {} .data : {} .bss : {} } E 1 h46611 s 00001/00001/00188 d D 4.4 87/05/14 16:47:17 build 12 11 c removed old SCCS strings and inserted #ident BB e s 00026/00028/00163 d D 4.3 87/04/22 09:51:08 dc 11 10 c Add Bull changes from 03/05/87 e s 00004/00002/00187 d D 4.2 87/04/10 16:27:00 dc 10 9 c make line length be 64 so 16Mb file system is 64 lines e s 00000/00000/00189 d D 4.1 87/02/26 16:56:10 dc 9 8 c rolled rev to -r4 /dc e s 00000/00000/00189 d D 3.1 87/02/20 10:37:51 build 8 7 c rolled rev to -r3 /dc e s 00004/00002/00185 d D 2.5 87/02/12 16:40:15 build 7 6 c clean up default handler. e s 00046/00024/00141 d D 2.4 87/02/11 22:32:02 build 6 5 c show defaults to all questions /dc e s 00021/00000/00144 d D 2.3 87/02/11 18:23:27 build 5 4 c add (valid) partition selection. e s 00001/00001/00143 d D 2.2 87/02/11 15:37:29 build 4 3 c change execute to call_boot /dc e s 00000/00000/00144 d D 2.1 87/02/11 15:30:58 build 3 2 c rolled rev to -r2 /dc e s 00001/00000/00143 d D 1.2 87/02/05 16:21:58 build 2 1 c add ident string /dc e s 00143/00000/00000 d D 1.1 87/02/05 16:19:36 build 1 0 c Placed under source control - dc e u U f b f n t T I 2 D 11 /* "%W% %E%" */ E 11 I 11 D 12 /* " %W% %E% " */ E 12 I 12 #ident " %W% %E% " E 12 E 11 E 2 I 1 #include #include #include #include #include "common.h" I 10 #define LINELENGTH 64 E 10 char *string[] = { /*0*/ "\nFatal Error in Tape Copy .\n", /*1*/ "\nd_read(%x) error = %x\n", /*2*/ "\nd_write error = %x\n", /*3*/ "\nSmd Board not found !\n", /*4*/ "\nc%dd%d not found\n", /*5*/ "\nTape read error %x\n", /*6*/ "\nSmd write error %x\n", /*7*/ "\nEnd of Tape Copy\n", /*8*/ "\nBoot copied\n", /*9*/ "\nBoot skipped\n", /*10*/ "\nFile system copied : %d blocks\n", /*11*/ "\nTape Copy :" } ; fault() { printf(string[0]) ; for(;;) ; } D 10 unsigned int c_cptr = 70 ; E 10 I 10 unsigned int c_cptr = LINELENGTH ; E 10 unsigned int l_cptr = 0 ; unsigned char car = ':' ; main() { register unsigned i, ioir, out ; register unsigned char d ; I 11 int log_dev ; E 11 unsigned data ; I 11 static char *SRCS = "%SRCS%" ; E 11 I 6 int defi; E 6 D 11 for (i=0 ; i < 272 ; i++) ccb[i] = (int)(&(*fault)()) ; ccb[272] = 0x7FFFFFFF; ccb[273] = 0x7FFFFFFF; E 11 /* get disk me physical address */ cb_buf = (char *)(BUF_ME); D 11 printf(string[11]); E 11 I 11 printf(string[11]) ; E 11 for(;;) { D 6 disc_dev = getnum("\ndevice number = ") ; E 6 I 6 D 11 for(disc_dev=31; disc_dev>0; disc_dev--) { defi = disc_dev; if (rech_smd()) break; } E 11 I 11 defi = 0; printf("\ndisc controller number (%d) : ", defi) ; E 11 D 11 printf("\ndevice number (%d) : ", defi) ; disc_dev = getnum("") ; E 6 if (disc_dev < 0) { D 6 for(disc_dev=31; disc_dev>0; disc_dev--) if (rech_smd()) { printf("%d", disc_dev) ; goto devok ; } printf(string[3]) ; fault() ; } devok: if ( ! rech_smd() ) E 6 I 6 disc_dev = defi; E 11 I 11 log_dev = getnum("") ; if (log_dev < 0) { log_dev = defi; E 11 printf("%d", defi) ; } I 11 if (log_dev > 3) { printf("\n ? controller: 0-3"); continue; } for(disc_dev=0; disc_dev<32; disc_dev++) { if (rech_smd()) { if (log_dev == 0) goto devok ; log_dev--; } } printf(string[3]) ; continue; E 11 D 11 if ( ! rech_smd() ) E 6 continue ; E 11 I 11 devok: E 11 D 6 disc_unit = getnum("\nunit number = ") ; E 6 I 6 /* find the desired unit number. */ defi = 0; printf("\nunit number (%d) : ", defi) ; disc_unit = getnum("") ; E 6 if (disc_unit < 0) { D 6 disc_unit = 0 ; putchar('0') ; E 6 I 6 disc_unit = defi; printf("%d", defi) ; E 6 } D 6 if ((disc_unit<0) || (disc_unit>31)) E 6 I 6 D 11 if ((disc_unit<0) || (disc_unit>3)) E 6 goto smdko ; if (smd_type()) { smdko: printf(string[4], disc_dev, disc_unit) ; E 11 I 11 if ((disc_unit<0) || (disc_unit>3) || smd_type()) { printf(string[4], disc_dev, disc_unit) ; E 11 continue; } if ( inittape() ) fault() ; D 6 d = getstr("\nCopy Boot ? (y/n) : "); E 6 I 6 printf("\nCopy Boot ? (n) : "); d = getstr(""); E 6 if (d == 0) D 6 putchar('n') ; E 6 I 6 putchar ('n'); E 6 out = 5 ; cb_buf = (char *)BUF_BOOT ; for (i=1; i<=2; i++) { if ((ioir = mtread()) == -1) goto exit ; if (ioir & (EOTAPE|FMK)) goto sortie ; if (d == 'y') if (ioir = smdstart(i, SMD_WRITE, RAW)) { printf(string[7], ioir) ; fault() ; } cb_buf += BLKSIZE ; } I 6 out = 0 ; E 6 D 11 ccb[265] = 0 ; E 11 if (d == 'y') i = 8 ; else i = 9 ; printf(string[i]) ; cb_buf = (char *)BUF_ME ; if ((ioir = mtread()) == -1) /* skip File Mark if any */ goto exit ; D 6 d = getstr("\nCopy file system (y/n) : ") ; if (d != 'y') E 6 I 6 d = getstr("\nCopy file system (n) : ") ; if (d != 'y') { D 7 putchar ('n'); E 7 I 7 if (d == 0) putchar ('n'); E 7 E 6 break ; I 6 } E 6 I 5 disc_part = PARTMAX + 1 ; while (disc_part > PARTMAX) { D 6 disc_part = getnum("\npartition number = ") ; E 6 I 6 defi = 0; printf("\npartition number (%d) : ", defi) ; disc_part = getnum("") ; E 6 if (disc_part < 0) { D 6 disc_part = 0 ; putchar('0') ; E 6 I 6 disc_part = defi ; printf("%d",defi) ; E 6 } /* check desired partition for legality, and also for existence in the partition table. Ask again if there is any problem. */ if ((disc_part > PARTMAX) || !part_ok()) disc_part = PARTMAX + 1; } printf("\nCopy file system to c%dd%ds%d", D 11 disc_dev, disc_unit, disc_part); E 11 I 11 log_dev, disc_unit, disc_part); E 11 D 6 d = getstr("\nOK ? (y/n) : "); if (d != 'y') E 6 I 6 d = getstr("\nOK ? (n) : "); if (d != 'y') { D 7 putchar ('n'); E 7 I 7 if (d == 0) putchar ('n'); E 7 E 6 break ; I 6 } E 6 E 5 putchar('\n') ; cb_buf = (char *)(BUF_ME); for(ioir = 0; ; ioir++) { if ((i = mtread()) == -1) goto exit ; if (i & EOTAPE) goto sortie ; if (i & FMK) break; if (i = smdstart(ioir, SMD_WRITE, BLOC)) { out = 6 ; ioir =i ; goto sortie ; } D 10 if (c_cptr == 70) { E 10 I 10 if (c_cptr == LINELENGTH) { E 10 c_cptr = 0; printf("\r%d ", l_cptr) ; l_cptr++ ; car = (car == '.') ? ':' : '.' ; } putchar(car) ; c_cptr++; } out = 10 ; break; } sortie: D 6 printf(string[out], ioir) ; E 6 I 6 if (out != 0) printf(string[out], ioir) ; E 6 exit: printf(string[7]) ; flush() ; D 4 execute(0) ; E 4 I 4 call_boot(0) ; E 4 } E 1 h29712 s 00001/00001/00123 d D 4.3 87/05/14 16:47:29 build 8 7 c removed old SCCS strings and inserted #ident BB e s 00001/00001/00123 d D 4.2 87/04/22 09:24:52 dc 7 6 c Add Bull changes from 03/05/87 e s 00000/00000/00124 d D 4.1 87/02/26 16:56:13 dc 6 5 c rolled rev to -r4 /dc e s 00000/00000/00124 d D 3.1 87/02/20 10:37:53 build 5 4 c rolled rev to -r3 /dc e s 00001/00001/00123 d D 2.2 87/02/20 10:01:57 build 4 3 c chang density code name e s 00000/00000/00124 d D 2.1 87/02/11 15:31:05 build 3 2 c rolled rev to -r2 /dc e s 00001/00000/00123 d D 1.2 87/02/05 16:22:10 build 2 1 c add ident string /dc e s 00123/00000/00000 d D 1.1 87/02/05 16:19:38 build 1 0 c Placed under source control - dc e u U f b f n t T I 2 D 7 /* "%W% %E%" */ E 7 I 7 D 8 /* " %W% %E% " */ E 8 I 8 #ident " %W% %E% " E 8 E 7 E 2 I 1 #include #include #include "load.h" #define DEV 0x01000000 /* increment d'adresse device */ #define TAPENUM 0x20 /* type du controleur BM */ #define GO 0 /* commandes controleur */ #define RWD 1 #define RWDOFL 2 #define CONTROL 0 #define MODE 1 #define ADDR 2 #define BCNT 3 extern unsigned int *cb_buf ; unsigned int tapecmd ; unsigned int tapemode ; unsigned int tapedev ; unsigned int tapeioir ; unsigned int tapesize ; unsigned int s_ioir ; unsigned int s_state; char *edit[] = { /* 0 */ "\nRewind for BOT\n", /* 1 */ "\nWait for tape on line\n", #ifdef DEBUG /* 2 */ "\nMODE = %x IOIR = %x BCNT = %x " #endif DEBUG }; inittape() { unsigned int data,err ; s_ioir = s_state = 1; tapedev = rech_mt(TAPENUM) ; if (tapedev & 1) return(-1); err = 0 ; do { d_read(tapedev, &data) ; if ((data&(T_READY|ONLINE)) != (T_READY|ONLINE)) if ( !err ) printf(edit[1]) ; err = 1 ; } while ((data&(T_READY|ONLINE)) != (T_READY|ONLINE)) ; /* attente On Line */ D 4 d_write(tapedev|MODE, D1600) ; /* 1600 BPI */ E 4 I 4 d_write(tapedev|MODE, D1) ; /* 1600 BPI */ E 4 if ( !(data & BOTAPE) ) { printf(edit[0]) ; tapemode = ORWD ; tapecmd = RWD ; if ( iotape() ) return(-1); } return(0); } mtread() { int i; for (i=0; i<16; i++) { tapemode = RBLK ; tapecmd = GO ; tapesize = (-BLKSIZE)&M_BCNT ; if (!iotape()) break; tapemode = SRREV ; if (iotape()) i = 16 ; } if (i == 16) { printf("mt : ioir = %x ", s_ioir) ; s_ioir = -1 ; } return(s_ioir); } iotape() { unsigned int state , Ioir ; d_write(tapedev|ADDR, ((uint)cb_buf)&M_ADDR) ; /* adresse en memoire */ d_write(tapedev|BCNT, tapesize) ; /* BLKSIZE octets a ecrire */ d_write(tapedev|MODE, tapemode) ; /* write du bloc */ d_write(tapedev|CONTROL, tapecmd) ; while(1) { while (itest(&Ioir)) ; /* attend l'IT */ flush(); if ((Ioir>>24) == (tapedev>>24)) { d_read(tapedev|BCNT, &state) ; if (tapemode == tapeioir) if (Ioir == s_ioir) if (state == s_state) break ; #ifdef DEBUG printf(edit[2], tapemode, Ioir, state) ; #endif tapeioir = tapemode ; s_ioir = Ioir ; s_state = state ; break ; } } return(Ioir & G_ERROR) ; } rech_mt(x) unsigned int x ; { unsigned int data, xdev ; xdev = 0 ; do { d_read(xdev, &data) ; if ((data>>24) == x) return(xdev) ; xdev += DEV ; } while (xdev) ; return(1) ; /* not found */ } E 1 h61590 s 00001/00001/00206 d D 4.6 87/05/14 16:47:40 build 10 9 c removed old SCCS strings and inserted #ident BB e s 00001/00000/00206 d D 4.5 87/05/05 15:39:19 dc 9 8 c dc - include smd.h e s 00016/00016/00190 d D 4.4 87/04/22 14:37:59 dc 8 7 c dc - Add headwall diagnostic functions e s 00001/00001/00205 d D 4.3 87/04/22 09:17:48 dc 7 6 c Add Bull changes from 03/05/87 e s 00000/00001/00206 d D 4.2 87/02/26 18:40:03 dc 6 5 c convert printf to new calling conventions /dc e s 00000/00000/00207 d D 4.1 87/02/26 16:56:16 dc 5 4 c rolled rev to -r4 /dc e s 00000/00000/00207 d D 3.1 87/02/20 10:37:54 build 4 3 c rolled rev to -r3 /dc e s 00000/00000/00207 d D 2.1 87/02/11 15:31:15 build 3 2 c rolled rev to -r2 /dc e s 00001/00000/00206 d D 1.2 87/02/05 16:22:14 build 2 1 c add ident string /dc e s 00206/00000/00000 d D 1.1 87/02/05 16:19:39 build 1 0 c Placed under source control - dc e u U f b f n t T I 2 D 7 /* "%W% %E%" */ E 7 I 7 D 10 /* " %W% %E% " */ E 10 I 10 #ident " %W% %E% " E 10 E 7 E 2 I 1 D 8 /* @(#) prf.c 1.1 11/14/85 22:52:15 */ E 8 #include #include I 8 #include #include I 9 #include E 9 E 8 #include "load.h" #define BS 0x08 #define BELL 0x07 /* * Scaled down version of C Library printf. * Only %s %u %d (==%u) %o %x %D are recognized. * Used to print diagnostic information * directly on console tty. * Since it is not interrupt driven, * all system activities are pretty much suspended. * Printf should not be used for chit-chat. */ D 8 #define A0 1 #define BHE 0x00400000 E 8 printf(fmt, x1) register char *fmt; unsigned x1; { register c; register unsigned int *adx; char *s; adx = &x1; loop: while((c = *fmt++) != '%') { if(c == '\0') return; putchar(c); } c = *fmt++; if(c == 'd' || c == 'u' || c == 'o' || c == 'x') printn((long)*adx, c=='o'? 8: (c=='x'? 16:10)); else if(c == 's') { s = (char *)*adx; while(c = *s++) putchar(c); } else if (c == 'D') { printn(*(long *)adx, 10); adx += (sizeof(long) / sizeof(int)) - 1; } adx++; D 6 adx++; E 6 goto loop; } printn(n, b) long n; register b; { register i, nd, c; int flag; int plmax; char d[12]; c = 1; flag = n < 0; if (flag) n = (-n); if (b==8) plmax = 11; else if (b==10) plmax = 10; else if (b==16) plmax = 8; if (flag && b==10) { flag = 0; putchar('-'); } for (i=0; i= b) { nd -= b; c = 1; } else c = 0; } d[i] = nd; n = n / b ; if ((n==0) && (flag==0)) break; } if (i == plmax) i--; for ( ; i>=0; i--) putchar("0123456789ABCDEF"[d[i]]); } getchar(flag) int flag; { int head, tail; int stat; int c; I 8 int unit; unit = HeadwallDiag() ? 3 : 0; E 8 loop: D 8 d_read(0x00000100, &head); d_read(0x00000102, &tail); E 8 I 8 d_read(TCB(unit)+ReceiveHead, &head); d_read(TCB(unit)+ReceiveTail, &tail); E 8 head &= 0x0000FFFF; tail &= 0x0000FFFF; if (head == tail) goto loop; d_read(head, &stat); D 8 head += 2; if (head >= 0x00002200) head = 0x00002000; d_write(0x00000100, head); E 8 I 8 head = (head & ~(BufSize-1)) | ((head+2) & (BufSize-1)); d_write(TCB(unit)+ReceiveHead, head); E 8 if (stat & 0x8000) goto loop; c = (stat & 0x7F); if (c == '\r') c = '\n'; if (flag) putchar(c); return(c); } putchar(c) register int c; { int head, tail; int addr; I 8 int unit; E 8 I 8 unit = HeadwallDiag() ? 3 : 0; E 8 c &= 0x7F; if (c == '\n') putchar('\r'); loop: D 8 d_read(0x00000104, &head); d_read(0x00000106, &tail); E 8 I 8 d_read(TCB(unit)+TransmitHead, &head); d_read(TCB(unit)+TransmitTail, &tail); E 8 head &= 0x0000FFFF; tail &= 0x0000FFFF; if (head != tail) goto loop; addr = tail; if (addr & 1) { addr &= ~A0; d_write(addr | BHE, c); } else { addr &= ~BHE; d_write(addr | A0, c << 8); } D 8 tail++; if (tail >= 0x00003200) tail = 0x00003000; d_write(0x00000106, tail); E 8 I 8 tail = (tail & ~(BufSize-1)) | ((tail+1) & (BufSize-1)); d_write(TCB(unit)+TransmitTail, tail); E 8 } getstr(s) char *s; { register int i, c ; register unsigned char *dial_buf = (char *)BUF_DLG ; printf(s) ; for(i=0; (i<79) && ((c = getchar(0)) != '\n'); ) { if (c == BS) { if (i == 0) continue ; putchar(BS); putchar(' '); i -= 2 ; } else dial_buf[i] = c; putchar(c); i++ ; } dial_buf[i] = 0; return(dial_buf[0]) ; } getnum(s) char *s ; { int x, num, pos ; printf(s) ; num = 0; pos = 0; while ((x = getchar(0)) != '\n') { if (pos && (x == BS)) { pos--; putchar(BS); putchar(' '); num /= 10; goto echo ; } if ((x < '0') || (x > '9')) { x = BELL ; goto echo ; } num = (num * 10) + (x - '0'); pos++; echo: putchar(x); } if (pos == 0) num = -1 ; return(num); } E 1 h53385 s 00002/00002/00182 d D 4.5 87/05/14 16:47:57 build 9 8 c removed old SCCS strings and inserted #ident BB e s 00001/00000/00183 d D 4.4 87/05/05 15:57:20 dc 8 7 c dc - add smd.h e s 00001/00001/00182 d D 4.3 87/04/22 09:25:14 dc 7 6 c Add Bull changes from 03/05/87 e s 00000/00001/00183 d D 4.2 87/02/26 18:40:04 dc 6 5 c convert printf to new calling conventions /dc e s 00000/00000/00184 d D 4.1 87/02/26 16:56:19 dc 5 4 c rolled rev to -r4 /dc e s 00000/00000/00184 d D 3.1 87/02/20 10:37:55 build 4 3 c rolled rev to -r3 /dc e s 00000/00000/00184 d D 2.1 87/02/11 15:31:21 build 3 2 c rolled rev to -r2 /dc e s 00001/00000/00183 d D 1.2 87/02/05 16:22:20 build 2 1 c add ident string /dc e s 00183/00000/00000 d D 1.1 87/02/05 16:19:39 build 1 0 c Placed under source control - dc e u U f b f n t T I 2 D 7 /* "%W% %E%" */ E 7 I 7 D 9 /* " %W% %E% " */ E 7 E 2 I 1 /* @(#) prf.c 1.1 11/14/85 22:52:15 */ E 9 I 9 #ident " %W% %E% " /* prf.c 1.1 11/14/85 22:52:15 */ E 9 #include I 8 #include E 8 #include #include "load.h" #define KEYBOARD 0x01000000 #define BS 0x08 #define BELL 0x07 /* * Scaled down version of C Library printf. * Only %s %u %d (==%u) %o %x %D are recognized. * Used to print diagnostic information * directly on console tty. * Since it is not interrupt driven, * all system activities are pretty much suspended. * Printf should not be used for chit-chat. */ printf(fmt, x1) register char *fmt; unsigned x1; { register c; register unsigned int *adx; char *s; adx = &x1; loop: while((c = *fmt++) != '%') { if(c == '\0') return; putchar(c); } c = *fmt++; if(c == 'd' || c == 'u' || c == 'o' || c == 'x') printn((long)*adx, c=='o'? 8: (c=='x'? 16:10)); else if(c == 's') { s = (char *)*adx; while(c = *s++) putchar(c); } else if (c == 'D') { printn(*(long *)adx, 10); adx += (sizeof(long) / sizeof(int)) - 1; } adx++; D 6 adx++; E 6 goto loop; } printn(n, b) long n; register b; { register i, nd, c; int flag; int plmax; char d[12]; c = 1; flag = n < 0; if (flag) n = (-n); if (b==8) plmax = 11; else if (b==10) plmax = 10; else if (b==16) plmax = 8; if (flag && b==10) { flag = 0; putchar('-'); } for (i=0; i= b) { nd -= b; c = 1; } else c = 0; } d[i] = nd; n = n / b; if ((n==0) && (flag==0)) break; } if (i == plmax) i-- ; for ( ; i>=0; i--) { putchar("0123456789ABCDEF"[d[i]]); } } getchar(flag) int flag; { int data ; d_write(KEYBOARD, 0xC2000000); d_read(KEYBOARD, &data); while (1) { d_read(KEYBOARD, &data); if ((data & 0x02) == 0) break; } data = ((data >> 16) & 0x7F); if (data == '\r') data = '\n'; if (flag) putchar(data); return(data); } putchar(c) register int c; { register int cmd; int status; c &= 0x7F ; if (c == '\n') putchar('\r'); d_write(KEYBOARD, c<<24); status = 2; while (status & 2) d_read(KEYBOARD, &status); } getstr(s) char *s; { register int i, c ; register unsigned char *dial_buf = (char *)BUF_DLG ; printf(s) ; for(i=0; (i<79) && ((c = getchar(0)) != '\n'); ) { if (c == BS) { if (i == 0) continue ; putchar(BS); putchar(' '); i -= 2 ; } else dial_buf[i] = c; putchar(c); i++ ; } dial_buf[i] = 0; return(dial_buf[0]) ; } getnum(s) char *s ; { int x, num, pos ; printf(s) ; num = 0; pos = 0; while ((x = getchar(0)) != '\n') { if (pos && (x == BS)) { pos--; putchar(BS); putchar(' '); num /= 10; goto echo ; } if ((x < '0') || (x > '9')) { x = BELL ; goto echo ; } num = (num * 10) + (x - '0'); pos++; echo: putchar(x); } if (pos == 0) num = -1 ; return(num); } E 1 h60093 s 00001/00001/00264 d D 4.6 87/05/14 16:48:08 build 17 16 c removed old SCCS strings and inserted #ident BB e s 00023/00002/00242 d D 4.5 87/05/05 15:32:31 dc 16 15 c dc - add adaptive bad block list size handler e s 00001/00001/00243 d D 4.4 87/05/05 11:30:40 dc 15 14 c dc - supply page number to ptoedma for 2nd page of bad blocks. e s 00001/00001/00243 d D 4.3 87/04/30 10:21:13 dc 14 13 c dc - fix field names in DEBUG printing e s 00001/00003/00243 d D 4.2 87/04/22 09:54:03 dc 13 12 c Add Bull changes from 03/05/87 e s 00000/00000/00246 d D 4.1 87/02/26 16:56:22 dc 12 11 c rolled rev to -r4 /dc e s 00000/00000/00246 d D 3.1 87/02/20 10:37:56 build 11 10 c rolled rev to -r3 /dc e s 00015/00015/00231 d D 2.6 87/02/20 09:46:08 build 10 9 c update to new smd.h e s 00007/00010/00239 d D 2.5 87/02/20 09:30:02 dc 9 8 c update to latest smd.h, vtoc.h e s 00016/00000/00233 d D 2.4 87/02/11 18:22:52 build 8 7 c add part_ok routine. e s 00003/00000/00230 d D 2.3 87/02/11 17:58:25 build 7 6 c temporarily add ROOTMIN definition e s 00002/00002/00228 d D 2.2 87/02/11 15:36:14 build 6 5 c change to ROOTMIN symbolic partition size /dc e s 00000/00000/00230 d D 2.1 87/02/11 15:31:25 build 5 4 c rolled rev to -r2 /dc e s 00010/00004/00220 d D 1.4 87/02/09 13:12:49 build 4 3 c clarify default partition. e s 00004/00008/00220 d D 1.3 87/02/09 09:29:27 build 3 2 c convert to new smd.h e s 00001/00000/00227 d D 1.2 87/02/05 16:22:27 build 2 1 c add ident string /dc e s 00227/00000/00000 d D 1.1 87/02/05 16:19:40 build 1 0 c Placed under source control - dc e u U f b f n t T I 2 D 13 /* "%W% %E%" */ E 13 I 13 D 17 /* " %W% %E% " */ E 17 I 17 #ident " %W% %E% " E 17 E 13 E 2 I 1 #include #include #include #include #include I 16 #include E 16 #include "common.h" I 7 D 9 /* ... until we have the 'latest' vtoc.h updates....*/ #define ROOTMIN 32768 E 9 E 7 D 9 E 9 /*-------------------------------------------------*/ /* */ /* gestion interne des io physique disque */ /* */ /*-------------------------------------------------*/ struct smdcb Smd[] = { SMD_SIZE, 0 } ; D 4 unsigned char nsect; unsigned short npist; E 4 I 4 unsigned char nsect; /* number of sectors / track */ D 9 unsigned short npist; /* number of cylinders / drive */ E 9 I 9 unsigned short npist; /* number of tracks */ E 9 E 4 extern char *string[] ; I 4 /* verify that global 'disc_dev' is really an smd controller */ E 4 int rech_smd() { uint d, status ; if ((disc_dev<=0) || (disc_dev>31)) goto bad ; d = disc_dev << 24 ; if (d_read(d, &status) & 3) goto bad ; if ((status >> 24) != disc_dev) goto bad ; if (status & 0x00C00000) goto bad ; return(1) ; bad: return(0) ; } int smd_type() { register struct vtoc *p; register struct smdcb *smd = Smd ; int res ; I 16 int npg; int i; int L_max; E 16 /* reconnaissance */ if (rech_smd() == 0) return(1) ; smd->gorder = SMD_SIZE ; if ( exec_dcmd() ) return(1); smd->gorder = SMD_READ; I 16 npg = BBMINP; E 16 ecrit: D 3 smd->count0 = (2 * BLKSIZE) >> 8 ; E 3 I 3 D 16 smd->count0 = (2 * BLKSIZE) >> 8 ; /* transfer 2 pages */ E 16 I 16 smd->count0 = (npg * BLKSIZE) >> 8 ; /* set high byte of dma count */ E 16 E 3 smd->count1 = 0 ; D 9 smd->head = 0 ; smd->sector = 6; smd->cyl_high = 0 ; smd->cyl_low = 0 ; D 3 smd->addr0 = BUF_BBLK >> 16 ; smd->addr1 = BUF_BBLK >> 8 ; smd->addr2 = BUF_BBLK ; smd->header[0] = (BUF_BBLK >> 8) + 0x10; E 3 I 3 smd->mem_addr = BUF_BBLK; /* real memory address */ E 9 I 9 D 10 smd->da_r.head = 0 ; smd->da_r.sector = AD_VTOC ; smd->da_r.cyl_high = 0 ; smd->da_r.cyl_low = 0 ; E 10 I 10 smd->da_r.adrdsk.head = 0 ; smd->da_r.adrdsk.sector = AD_VTOC ; smd->da_r.adrdsk.cyl_high = 0 ; smd->da_r.adrdsk.cyl_low = 0 ; E 10 smd->ma_r.mem_addr = BUF_BBLK; /* real memory address */ E 9 D 15 smd->header[0] = ptoedma(BUF_BBLK+BLKSIZE); /* 'next' buffer addr */ E 15 I 15 D 16 smd->header[0] = ptoedma((BUF_BBLK+BLKSIZE)>>BPPSHIFT); /* 'next' buffer addr */ E 16 I 16 /* set all needed extended dma addresses */ for (i=1 ; iheader[i-1] = ptoedma((BUF_BBLK+i*BLKSIZE)>>BPPSHIFT); E 16 E 15 E 3 if ( exec_dcmd()) return(1); p = (struct vtoc *)BUF_BBLK ; if (p->v_sanity != VTOC_SANE) { D 13 #ifdef DEBUG E 13 printf("\ndisk not formated\n") ; D 13 #endif E 13 return(1) ; I 16 } /* Compute number of pages required to hold the bad blocks */ L_max = sizeof(struct vtoc) + (p->v_cyls) * sizeof(struct bb_ind) + (p->v_nbbmax) * sizeof(struct bb_gb) ; L_max = btoc(L_max); if (L_max > npg) { /* check for list to large for 1 transfer */ if ((L_max > SMDMAXPGS) || (L_max > BUF_BBLK_PGS)) { printf("\nBad Block list too long\n") ; return(1) ; } npg = L_max; /* set new length */ goto ecrit; /* redo the read */ E 16 } #ifdef DEBUG printf("\nBad Bloc Table in memory\n"); #endif if (p->v_part[0].p_blockn == 0) { D 6 p->v_part[0].p_blockn = 31200 ; E 6 I 6 p->v_part[0].p_blockn = ROOTMIN ; E 6 p->v_part[0].p_start = 1 ; smd->gorder = SMD_WRITE ; goto ecrit ; } return(0); } I 8 int part_ok() /* This routine returns 1 if the global disc_part describes a valid partition in the current vtoc. It is assumed that the vtoc has been read in, and resides in memory in the BUF_BBLK. It is assumed that this vtoc has already been checked for SANITY. A partition is valid if it has been marked as having some length. */ { register struct vtoc *p; p = (struct vtoc *)BUF_BBLK ; return ( (p->v_part[disc_part].p_blockn != 0) ); } E 8 /*RDP ====== | | entrees-sorties physiques disque | | valeur rendue: |--------------- | OK | | parametres d'entree: |--------------------- | bloc no de bloc physique a lire (bloc size = page size) | gorder ordre pour le controleur | mode raw => e/s par rapport au zero du disque | bloc => e/s par rapport au debut de la partition | */ int smdstart(bloc, gorder, mode) uint bloc, mode ; char gorder; { register struct smdcb *smd = Smd ; register struct vtoc *p ; struct bb_ind *indtab ; struct bb_gb *bbgb ; char *ptr ; uint addsk ; register rem; register ushort cylin ; #ifdef DEBUG printf("smdstart(%x, %x, %d)\n", bloc, gorder, mode) ; #endif DEBUG bloc <<= 1 ; cylin = bloc / npist ; p = (struct vtoc *)BUF_BBLK ; D 4 cylin += mode ; /* mode raw = 0 ; mode bloc = 1 */ E 4 I 4 if (mode == BLOC) { /* mode raw = 0 ; mode bloc = 1 */ if (p->v_sanity == VTOC_SANE) D 6 cylin += p->v_part[P0].p_start; E 6 I 6 cylin += p->v_part[disc_part].p_start; E 6 else cylin += 1 ; } E 4 rem = bloc % npist ; D 10 smd->head = rem / nsect; smd->sector = rem % nsect; addsk = (cylin << 16) + (smd->head << 8) + smd->sector; E 10 I 10 smd->da_r.adrdsk.head = rem / nsect; smd->da_r.adrdsk.sector = rem % nsect; addsk = (cylin << 16) + (smd->da_r.adrdsk.head << 8) + smd->da_r.adrdsk.sector; E 10 if (p->v_sanity == VTOC_SANE) { ptr = (char *)p + sizeof(struct vtoc) ; if ((uint)ptr & 3) ptr += (char *)2 ; indtab = (struct bb_ind *)ptr ; ptr = (char *)indtab + (p->v_cyls)*sizeof(struct bb_ind) ; if ((uint)ptr & 3) ptr += (char *)2 ; bbgb = (struct bb_gb *)ptr ; indtab += cylin; if (indtab->b_mapind != p->v_nbbmax) { bbgb += indtab->b_mapind ; while (bbgb->bb < addsk) bbgb++ ; if (bbgb->bb == addsk) { cylin = bbgb->gb >> 16 ; D 10 smd->head = (bbgb->gb >> 8) & 0xFF ; smd->sector = bbgb->gb & 0xFF ; E 10 I 10 smd->da_r.adrdsk.head = (bbgb->gb >> 8) & 0xFF ; smd->da_r.adrdsk.sector = bbgb->gb & 0xFF ; E 10 #ifdef DEBUG printf("\nbad bloc : %x -> %x\n", bbgb->bb, bbgb->gb); #endif DEBUG } } } D 10 smd->cyl_high = cylin >> 8 ; smd->cyl_low = cylin & 0xFF; E 10 I 10 smd->da_r.adrdsk.cyl_high = cylin >> 8 ; smd->da_r.adrdsk.cyl_low = cylin & 0xFF; E 10 #ifdef DEBUG printf("\nbloc = %d, head = %d, cylin = %d, sector = %d\n", D 14 bloc>>1, smd->head, cylin, smd->sector); E 14 I 14 bloc>>1, smd->da_r.adrdsk.head, cylin, smd->da_r.adrdsk.sector); E 14 #endif smd->gorder = gorder ; smd->count0 = BLKSIZE >> 8 ; smd->count1 = 0 ; D 3 smd->addr0 = (uint)(cb_buf) >> 16 ; smd->addr1 = (uint)(cb_buf) >> 8 ; smd->addr2 = (uint)(cb_buf) ; E 3 I 3 D 9 smd->mem_addr = (uint)(cb_buf); /* real memory address */ E 9 I 9 smd->ma_r.mem_addr = (uint)(cb_buf); /* real memory address */ E 9 E 3 return( exec_dcmd() ); } int exec_dcmd() { register unsigned char *pmd; register struct smdcb *smd ; int idev, dev, y, err; pmd = (unsigned char *)Smd ; y = sizeof(struct smdcb) ; idev = (disc_dev << 16) + (disc_unit * y) ; dev = (idev + y) << 8 ; while ( y ) { dev -= 0x0100 ; y-- ; if (err = d_write(dev + pmd[y], 0)) { printf(string[2], err); return(err) ; } } #ifdef DEBUG printf("d_write(%x)", dev + pmd[y]); #endif for ( ; ; ) { while (itest(&err)) ; if ((err>>24) == disc_dev) break ; } D 4 flush(); E 4 I 4 flush(); /* for headwall, make sure cache is emptied */ E 4 if (err & 0xFF00) { printf("\nDisk Error = %x\n", (err >> 8)& 0xFF); return(err) ; } if (pmd[0] == SMD_SIZE) { smd = (struct smd *)(idev) ; D 10 if (err = d_read((uint)(&smd->sector) << 8, &y)) { printf(string[1], &smd->sector, err) ; E 10 I 10 if (err = d_read((uint)(&smd->da_r.adrdsk.sector) << 8, &y)) { printf(string[1], &smd->da_r.adrdsk.sector, err) ; E 10 return(err) ; } nsect = (y + 1) & 0xFF ; D 10 if (err = d_read((uint)(&smd->head) << 8, &y)) { printf(string[1], &smd->head, err) ; E 10 I 10 if (err = d_read((uint)(&smd->da_r.adrdsk.head) << 8, &y)) { printf(string[1], &smd->da_r.adrdsk.head, err) ; E 10 return(err) ; } npist = (y + 1) & 0xFF ; #ifdef DEBUG printf("\nnb secteurs / pistes = %d / %d\n", nsect, npist); #endif npist *= nsect ; } return(0); } E 1 h04690 s 00001/00001/00012 d D 4.3 87/05/14 16:48:19 build 8 7 c removed old SCCS strings and inserted #ident BB e s 00001/00002/00012 d D 4.2 87/04/22 09:21:35 dc 7 6 c Add Bull changes from 03/05/87 e s 00000/00000/00014 d D 4.1 87/02/26 16:57:01 dc 6 5 c rolled rev to -r4 /dc e s 00000/00000/00014 d D 3.1 87/02/20 10:47:42 build 5 4 c rolled rev to -r3 /dc e s 00000/00002/00014 d D 2.2 87/02/11 15:33:53 build 4 3 c remove dial_buf /dc e s 00000/00000/00016 d D 2.1 87/02/11 15:32:17 build 3 2 c rolled rev to -r2 /dc e s 00001/00000/00015 d D 1.2 87/02/05 16:39:35 build 2 1 c add ident string /dc e s 00015/00000/00000 d D 1.1 87/02/05 16:39:09 build 1 0 c Placed under source control - dc e u U f b f n t T I 2 D 7 /* "%W% %E%" */ E 7 I 7 D 8 /* " %W% %E% " */ E 8 I 8 #ident " %W% %E% " E 8 E 7 E 2 I 1 #include "load.h" char *cb_buf; /* buffer address */ /* volume description */ int disc_unit; /* unit number */ int disc_dev; /* device number */ int disc_part; /* partition number */ D 4 char dial_buf[80]; E 4 /* memory description */ D 7 int ccb[280] ; E 7 E 1 h11816 s 00001/00001/00034 d D 4.4 87/05/14 16:48:30 build 10 8 c removed old SCCS strings and inserted #ident BB e s 00001/00000/00035 d R 4.4 87/05/05 15:36:17 dc 9 8 c dc - include smd.h e s 00003/00001/00032 d D 4.3 87/05/05 15:30:14 dc 8 7 c dc - expand and parameterize bad block buffer e s 00001/00000/00032 d D 4.2 87/04/22 09:22:27 dc 7 6 c Add Bull changes from 03/05/87 e s 00000/00000/00032 d D 4.1 87/02/26 16:57:06 dc 6 5 c rolled rev to -r4 /dc e s 00000/00000/00032 d D 3.1 87/02/20 10:47:44 build 5 4 c rolled rev to -r3 /dc e s 00000/00000/00032 d D 2.1 87/02/11 15:32:24 build 4 3 c rolled rev to -r2 /dc e s 00002/00000/00030 d D 1.3 87/02/09 09:21:27 build 3 2 c add BUF_BOOT and BUF_DLG e s 00000/00000/00030 d D 1.2 87/02/05 16:39:37 build 2 1 c add ident string /dc e s 00030/00000/00000 d D 1.1 87/02/05 16:39:10 build 1 0 c Placed under source control - dc e u U f b f n t T I 7 D 10 /* " %W% %E% " */ E 10 I 10 #ident " %W% %E% " E 10 E 7 I 1 #define OK 0 #define E_READ 0 #define E_INVALID_PROG 1 #define E_INEX_FILE 2 #define E_UNIT 3 #define E_SMD 4 #define E_FATAL 5 #define E_ERR 6 #define LOADERBASE2 0xFC000 /* loader base after moving */ #define LOADERSIZE 2 /* must be 2 at least */ #define PGSIZE 4096 /* page size in bytes */ #define BLKSIZE 4096 /* block size in bytes */ #define BS_INT 1024 /* BLKSIZE >> 2 */ I 8 #define BBMINP 1 /* min pages for bad block list */ #define BUF_BBLK_PGS SMDMAXPGS /* pages in bb memory area */ E 8 I 3 #define BUF_BOOT 0x000000 /* buffer for boot image */ E 3 #define BUF_ME 0x102000 /* buffer for IO */ #define BUF_BBLK 0x103000 /* buffer for bad blocks table */ I 3 D 8 #define BUF_DLG 0x104000 /* buffer for dialogs */ E 8 I 8 #define BUF_DLG (BUF_BBLK+(BUF_BBLK_PGS*PGSIZE))/* buffer for dialogs */ E 8 E 3 #define U_LOAD_BASE 0 /* unix loading base */ #define P0 0 /* default partition number */ #define UNIT0 0 /* default unit number */ #define RAW 0 #define BLOC 1 #define VTOCSIZE 2 /* vtoc size in pages */ #define PARTMAX 15 /* max partition number on the disc */ #define SECMAX 3 /* max sections number to load */ E 1 #ident " @(#)load.h 4.4 87/05/14 " #define OK 0 #define E_READ 0 #define E_INVALID_PROG 1 #define E_INEX_FILE 2 #define E_UNIT 3 #define E_SMD 4 #define E_FATAL 5 #define E_ERR 6 #define LOADERBASE2 0xFC000 /* loader base after moving */ #define LOADERSIZE 2 /* must be 2 at least */ #define PGSIZE 4096 /* page size in bytes */ #define BLKSIZE 4096 /* block size in bytes */ #define BS_INT 1024 /* BLKSIZE >> 2 */ #define BBMINP 1 /* min pages for bad block list */ #define BUF_BBLK_PGS SMDMAXPGS /* pages in bb memory area */ #define BUF_BOOT 0x000000 /* buffer for boot image */ #define BUF_ME 0x102000 /* buffer for IO */ #define BUF_BBLK 0x103000 /* buffer for bad blocks table */ #define BUF_DLG (BUF_BBLK+(BUF_BBLK_PGS*PGSIZE))/* buffer for dialogs */ #define U_LOAD_BASE 0 /* unix loading base */ #define P0 0 /* default partition number */ #define UNIT0 0 /* default unit number */ #define RAW 0 #define BLOC 1 #define VTOCSIZE 2 /* vtoc size in pages */ #define PARTMAX 15 /* max partition number on the disc */ #define SECMAX 3 /* max sections number to load */ h62823 s 00001/00001/00097 d D 4.6 87/05/05 15:58:31 dc 17 16 c dc - update depend for prf_fdlp e s 00002/00001/00096 d D 4.5 87/05/05 15:41:15 dc 16 15 c dc - update dependencies for smd.c and prf_cio.c e s 00009/00002/00088 d D 4.4 87/04/22 14:57:50 dc 15 14 c dc - Add headwall diagnostic functions e s 00002/00000/00088 d D 4.3 87/04/22 09:50:37 dc 14 13 c common.h depends on load.h e s 00001/00001/00087 d D 4.2 87/04/22 09:20:28 dc 13 12 c Add Bull changes from 03/05/87 e s 00000/00000/00088 d D 4.1 87/02/26 16:55:56 dc 12 11 c rolled rev to -r4 /dc e s 00000/00000/00088 d D 3.1 87/02/20 10:37:48 build 11 10 c rolled rev to -r3 /dc e s 00001/00002/00087 d D 2.4 87/02/18 16:05:41 build 10 9 c fix up installation: place in $SPX/etc, don't strip. e s 00010/00006/00079 d D 2.3 87/02/11 18:42:59 build 9 8 c eliminate mt specific modules e s 00004/00004/00081 d D 2.2 87/02/11 15:38:38 build 8 7 c change startcio to start /dc e s 00000/00000/00085 d D 2.1 87/02/11 15:30:38 build 7 6 c rolled rev to -r2 /dc e s 00002/00000/00083 d D 1.6 87/02/09 13:22:13 build 6 5 c add ass.h to startcio depend e s 00020/00007/00063 d D 1.5 87/02/09 12:21:45 build 5 4 c add strip and a.out pruning to production rules e s 00011/00008/00059 d D 1.4 87/02/09 09:36:01 build 4 3 c parameterize ld.file e s 00033/00025/00034 d D 1.3 87/02/09 09:34:16 build 3 2 c convert to sccs e s 00001/00000/00058 d D 1.2 87/02/05 16:22:46 build 2 1 c add ident string /dc e s 00058/00000/00000 d D 1.1 87/02/05 16:19:32 build 1 0 c Placed under source control - dc e u U f b f n t T I 2 D 13 # "%W% %E%" E 13 I 13 # " %W% %E% " E 13 E 2 I 1 D 3 INCRT = $(SPX)/usr/include CFLAGS = -c -O -I$(INCRT) E 3 I 3 O_LIV = ctbootcio mtbootcio mtbootfdlp E 3 D 3 .c.o: cc $(CFLAGS) $< E 3 I 3 HEADERS = load.h common.h E 3 D 3 O_LIV = ctboothdw ctbootcio mtboothdw mtbootcio mtbootfdlp E 3 D 5 all: $(O_LIV) E 5 D 9 CTCOMMON = automove.o main.o smd.o ct.o E 9 I 9 COMMON = start.o automove.o main.o smd.o ct.o E 9 D 9 MTCOMMON = automove.o main_mt.o smd_mt.o mt.o E 9 I 9 # read from cartridge tape, use cio as console. # This is most common for 'new' ridges. CTBOOTCIO = $(COMMON) ct.o prf_cio.o E 9 D 3 CTBOOTHDW = starthdw.o $(CTCOMMON) prf_cio.o E 3 D 8 CTBOOTCIO = startcio.o $(CTCOMMON) prf_cio.o E 8 I 8 D 9 CTBOOTCIO = start.o $(CTCOMMON) prf_cio.o E 9 I 9 # read from 1/2 mag tape, use cio as console. # This is for mixed mode cio systems with attached tape. MTBOOTCIO = $(COMMON) mt.o prf_cio.o E 9 E 8 D 3 MTBOOTHDW = starthdw.o $(MTCOMMON) prf_cio.o E 3 D 8 MTBOOTCIO = startcio.o $(MTCOMMON) prf_cio.o E 8 I 8 D 9 MTBOOTCIO = start.o $(MTCOMMON) prf_cio.o E 8 D 8 MTBOOTFD = startcio.o $(MTCOMMON) prf_fdlp.o E 8 I 8 MTBOOTFD = start.o $(MTCOMMON) prf_fdlp.o E 9 I 9 # read from 1/2 mag tape, use fdlp as console. # This is for old ridges with fdlp / floppy and attached tape. MTBOOTFD = $(COMMON) mt.o prf_fdlp.o E 9 E 8 D 3 ctboothdw: $(CTBOOTHDW) ld -N -o ctboothdw ld.file $(CTBOOTHDW) E 3 I 3 D 4 ctbootcio: $(CTBOOTCIO) ld.file $(LD) -N -o ctbootcio ld.file $(CTBOOTCIO) E 4 I 4 # load instruction file LFILE = ld.file E 4 E 3 I 5 # size of aouthdr + 3 section headers (not quite, but this is # the stuff from which this constant comes. AOUTHDSIZE = 168 all: $(O_LIV) E 5 D 3 ctbootcio: $(CTBOOTCIO) ld -N -o ctbootcio ld.file $(CTBOOTCIO) E 3 I 3 D 4 mtbootcio: $(MTBOOTCIO) ld.file $(LD) -N -o mtbootcio ld.file $(MTBOOTCIO) E 4 I 4 ctbootcio: $(CTBOOTCIO) $(LFILE) D 5 $(LD) -N -o ctbootcio $(LFILE) $(CTBOOTCIO) E 5 I 5 $(LD) -N -o tmpboot $(LFILE) $(CTBOOTCIO) strip -m tmpboot dd if=tmpboot of=ctbootcio bs=$(AOUTHDSIZE) skip=1 rm tmpboot E 5 E 4 E 3 D 3 mtboothdw: $(MTBOOTHDW) ld -N -o mtboothdw ld.file $(MTBOOTHDW) E 3 I 3 D 4 mtbootfdlp: $(MTBOOTFD) ld.file $(LD) -N -o mtbootfdlp ld.file $(MTBOOTFD) E 4 I 4 mtbootcio: $(MTBOOTCIO) $(LFILE) D 5 $(LD) -N -o mtbootcio $(LFILE) $(MTBOOTCIO) E 5 I 5 $(LD) -N -o tmpboot $(LFILE) $(CTBOOTCIO) strip -m tmpboot dd if=tmpboot of=mtbootcio bs=$(AOUTHDSIZE) skip=1 rm tmpboot E 5 E 4 E 3 I 4 mtbootfdlp: $(MTBOOTFD) $(LFILE) D 5 $(LD) -N -o mtbootfdlp $(LFILE) $(MTBOOTFD) E 5 I 5 $(LD) -N -o tmpboot $(LFILE) $(CTBOOTCIO) strip -m tmpboot dd if=tmpboot of=mtbootfdlp bs=$(AOUTHDSIZE) skip=1 rm tmpboot E 5 I 14 common.h: load.h E 14 I 6 D 8 startcio.o: $(INC)/sys/ass.h E 8 I 8 D 15 start.o: $(INC)/sys/ass.h E 15 I 15 start.o: $(INC)/sys/ass.h \ $(INC)/sys/const.as.h \ $(INC)/sys/maint.h \ $(INC)/sys/physmem.h E 15 E 8 E 6 E 4 D 3 mtbootcio: $(MTBOOTCIO) ld -N -o mtbootcio ld.file $(MTBOOTCIO) E 3 I 3 automove.o: load.h E 3 D 3 mtbootfdlp: $(MTBOOTFD) ld -N -o mtbootfdlp ld.file $(MTBOOTFD) E 3 I 3 main.o: $(INC)/sys/param.h $(INC)/sys/types.h $(INC)/sys/smd.h \ $(INC)/sys/mt.h common.h E 3 D 3 print: pr Makefile *.h *.c *.s | lp -tTBOOT E 3 I 3 main_mt.o: $(INC)/sys/param.h $(INC)/sys/types.h $(INC)/sys/smd.h \ $(INC)/sys/mt.h common.h E 3 I 3 smd.o: $(INC)/sys/param.h $(INC)/sys/types.h $(INC)/sys/ino.h \ D 16 $(INC)/sys/filsys.h $(INC)/sys/smd.h common.h E 16 I 16 $(INC)/sys/filsys.h $(INC)/sys/smd.h $(INC)/sys/sysmacros.h common.h E 16 smd_mt.o: $(INC)/sys/param.h $(INC)/sys/types.h $(INC)/sys/ino.h \ $(INC)/sys/filsys.h $(INC)/sys/smd.h common.h ct.o: $(INC)/sys/types.h $(INC)/sys/termio.h $(INC)/sys/cio.h \ $(INC)/sys/mt.h load.h mt.o: $(INC)/sys/types.h $(INC)/sys/mt.h load.h D 15 prf_cio.o: $(INC)/sys/types.h $(INC)/ctype.h load.h E 15 I 15 prf_cio.o: $(INC)/sys/types.h \ $(INC)/ctype.h \ $(INC)/sys/termio.h \ $(INC)/sys/cio.h \ I 16 $(INC)/sys/smd.h \ E 16 load.h E 15 D 17 prf_fdlp.o: $(INC)/sys/types.h $(INC)/ctype.h load.h E 17 I 17 prf_fdlp.o: $(INC)/sys/types.h $(INC)/sys/smd.h $(INC)/ctype.h load.h E 17 D 4 ld.file: s.ld.file E 4 I 4 $(LFILE): s.$(LFILE) E 4 $(GET) $(GFLAGS) -p $? > $@ E 3 clean: D 5 rm -f *.o E 5 I 5 rm -f *.o tmpboot E 5 clobber: clean D 3 rm -f $(O_LIV) E 3 I 3 D 4 rm -f $(O_LIV) $(HEADERS) E 4 I 4 rm -f $(O_LIV) $(HEADERS) $(LFILE) E 4 E 3 D 10 DESTDIR = /etc E 10 I 10 DESTDIR = $(SPX)/etc E 10 install: D 3 rm -f $(DESTDIR)/ctbootcio $(DESTDIR)/ctboothdw $(DESTDIR)/mtbootcio\ $(DESTDIR)/mtboothdw $(DESTDIR)/mtbootfdlp E 3 I 3 D 5 rm -f $(DESTDIR)/ctbootcio $(DESTDIR)/mtbootcio $(DESTDIR)/mtbootfdlp E 5 I 5 cd $(DESTDIR) ; rm -f $(O_LIV) E 5 E 3 ls $(O_LIV) | cpio -pdmv $(DESTDIR) D 10 cd $(DESTDIR) ; strip -m $(O_LIV) E 10 cd $(DESTDIR) ; chmod 664 $(O_LIV) ;\ chgrp bin $(O_LIV) ; chown bin $(O_LIV) ; E 1 u G.text$ .data@.bssLF 1NW OW LLWLWL 8  WW@` 0WDz|.text.data.bss_startq_start1q_d_read(q_d_write4q_itest<q_flushLqTqxqq_mainqqqqSTKPARAM1STKPARAM2STKPARAM3STKPARAM4STKPARAM5PAGE_SHIFTPAGE_LENGTH_DPAGE_LENGTH_WPAGE_LENGTH_HPAGE_LENGTH_BKERNSTACKTIMER1_COUNTTIMER2_COUNTTIMER_PERIOD_HeadwallDiag_call_boot_auto_move_disc_dev_disc_unit_disc_parth56851 s 00025/00000/00073 d D 4.4 87/04/22 14:51:10 dc 10 9 c dc - Add headwall diagnostic functions e s 00001/00003/00072 d D 4.3 87/04/22 09:55:48 dc 9 8 c Add Bull changes from 03/05/87 e s 00014/00014/00061 d D 4.2 87/02/26 17:01:55 dc 8 7 c convert to new calling conventions /dc e s 00000/00000/00075 d D 4.1 87/02/26 16:56:27 dc 7 6 c rolled rev to -r4 /dc e s 00000/00000/00075 d D 3.1 87/02/20 10:37:57 build 6 5 c rolled rev to -r3 /dc e s 00014/00001/00061 d D 2.2 87/02/11 15:51:27 build 5 4 c change flush parameter, add (and comment) call_boot. Pass disc_part c to call_boot. /dc e s 00000/00000/00062 d D 2.1 87/02/11 15:31:36 build 4 3 c rolled rev to -r2 /dc e s 00005/00004/00057 d D 1.3 87/02/09 13:20:52 build 3 2 c add kernel conventional UNMASK usage e s 00001/00000/00060 d D 1.2 87/02/05 16:22:38 build 2 1 c add ident string /dc e s 00060/00000/00000 d D 1.1 87/02/05 16:19:43 build 1 0 c Placed under source control - dc e u U f b f n t T I 2 D 9 ; "%W% %E%" E 9 I 9 ; " %W% %E% " E 9 I 3 #include I 10 #include #include #include E 10 E 3 E 2 I 1 ; csect code global _start,_start1 global _d_read,_d_write global _itest,_flush I 10 global _HeadwallDiag E 10 I 5 global _call_boot E 5 align 4 _start: D 3 laddr r0,0CFH ; Unmask in R0 word 4C051000H ; maintenance instruction (Imask) for IT E 3 I 3 laddr r0,UNMASK ; Unmask in R0 halfword I_MASK ; MAINT r0,twrited E 3 laddr r14,0FC000H,L ; temporary loader stack D 8 laddr r0,_start,l store r0,r14,24 call r11,_auto_move,l; move the image from here to FC000 E 8 I 8 laddr r0,_start,l ; one arg: start address call LINK,_auto_move,l; move the image from here to FC000 E 8 _start1: movei r0,1 move sr14,r0 D 9 laddr r0,_ccb,l move sr11,r0 E 9 D 8 call r11,_main,L E 8 I 8 call LINK,_main,L E 8 br * ; These are routines needed by the system for ; reading and writing to io devices ; ; 4) d_read(dev,&data) ; 5) d_write(dev,data) ; align 4 _d_read: D 8 load r2,r14,24 ; Get 1st argument - device load r3,r14,32 ; Get 2nd argument - int pointer E 8 I 8 move r2,r0 ; Get 1st argument - device move r3,r1 ; Get 2nd argument - int pointer E 8 read r0,r2 ; Physical device read store r1,r3,0 ; store returned data D 8 ret r11,r11 E 8 I 8 ret LINK,LINK E 8 align 4 _d_write: D 8 load r2,r14,24 ; Get 1st argument - device load r0,r14,32 ; Get 2nd argument - data to be sent to device E 8 I 8 move r2,r0 ; Get 1st argument - device move r0,r1 ; Get 2nd argument - data to be sent to device E 8 write r0,r2 ; Physical device write D 8 ret r11,r11 E 8 I 8 ret LINK,LINK E 8 align 4 _itest: I 8 move r2,r0 ; Get argument - int pointer to save dev # E 8 D 3 laddr r0,0CFH ; Unmask in R0 word 4C051000H ; maintenance instruction (Imask) for IT E 3 I 3 laddr r0,UNMASK ; Unmask in R0 halfword I_MASK ; MAINT r0,twrited E 3 D 8 load r2,r14,24 ; Get argument - int pointer to save dev # E 8 itest r0 ; Check for interruts r0 = 0 for true ; 1 for false and r1 = device that interrupted store r1,r2,0 ; store returned interrupting device D 8 ret r11,r11 E 8 I 8 ret LINK,LINK E 8 align 4 _flush: D 5 laddr r1,9,l E 5 I 5 movei r0,3 ; flush tmt and cache (... on headwall) E 5 flush D 8 ret r11,r11 E 8 I 8 ret LINK,LINK I 10 align 4 ; Returns 1 if headwall processor AND diag mode, 0 otherwise _HeadwallDiag: MOVEI R1,0 ; get all zeros ; MACHINEID R0 ; Get the version BLOCK 1,04CH ; MAINT ... BLOCK 1,00AH ; ... R0,10 (MACHINEID) MOVEI R3,FTHeadwall ; extract headwall bit AND R1,R3 ; mask off just that one BR R1=0,NotHW ; quit if not a headwall LOADB R0,PMHWBootAux,L; Get diagnostic byte LADDR R1,PMHWBDiag ; Get diag bit mask AND R0,R1 ; Extract just this bit BR R0=0,NotHW ; if bit is off, return false MOVE R0,1 ; return true for hw AND diag mode RET LINK,LINK NotHW: MOVE r0,0 ; return false for most cases RET LINK,LINK E 10 E 8 I 5 align 4 _call_boot: I 8 move r4,r0 ; get incoming arg: start address E 8 load r0,_disc_dev,l ; arg0 - device address laddr r1,24 ; .. move to high byte lsl r0,r1 ; make dev addr from dev # load r1,_disc_unit,l ; arg1 - unit on this controller load r2,_disc_part,l ; arg2 - partition movei r3,0 ; arg2 - file name (unknown) D 8 load r4,r14,24 ; get incoming arg: start address E 8 ret r4,r4 E 5 E 1 #ident " @(#)common.h 4.3 87/05/14 " #include "load.h" char *cb_buf; /* buffer address */ /* volume description */ int disc_unit; /* unit number */ int disc_dev; /* device number */ int disc_part; /* partition number */ /* memory description */ u G .text .data@D@.bssH<~@pސLpJ~@Ǟ<HHW0 C4!@W0 W00W @(#)automove.c 4.3 87/05/14 @(#)load.h 4.4 87/05/14 <>B D .text.data@.bssjtj_start1j_startj_executej_auto_move_copy_page/* " @(#)ld.file 4.2 87/04/22 " */ MEMORY { valid : org = 0xFC000 , len = 0x9000 } SECTIONS { .text : {} .data : {} .bss : {} } u G H.textg .data, @.bssXX8X?@H~P$ p$ |DlX0 !"tpXp   pΐ njqΠ yRhH @@ z, q( y xyp  ΐ y n`^p:.p 0ܓΐ y n  xp @ @ !>p ~(@L0(008.: .88((<p~PɞHɾ@XXW @(#)main.c 4.4 87/05/14 @(#)common.h 4.3 87/05/14 @(#)load.h 4.4 87/05/14 %d%d%d%SRCS% disc controller number (%d) : ? controller: 0-3 unit number (%d) : Copy Boot ? (n) : Copy file system (n) : partition number (%d) : Copy file system to c%dd%ds%d OK ? (n) : %d @`x D@: Fatal Error in Tape Copy . d_read(%x) error = %x d_write error = %x Smd Board not found ! c%dd%d not found Tape read error %x Smd write error %x End of Tape Copy Boot copied Boot skipped File system copied : %d blocks Tape Copy :  > J  R \ d j p  ~                   " $ 2 > B D  H J P Z l r x ~             D L X  ^ r x                     ( 0 6 < f v             * 0 8 > H \ d j r x               $ .textg.data .bssX_faults_strings_printfs_main(s_cb_bufs_getnumssss#s-s_getstrs_putchars_mtreads7sAs_part_oks_c_cptr(s_l_cptr0s_car8s_flushsLsW_disc_dev_rech_smd_disc_unit_smd_type_inittape_smdstart_disc_part_call_bootu G p.textp7 .datapp@.bssPP@RJ`<0<`a  @@W@~8pz , p s   01@G *s  p$s s  1$Bۓ 0 0` ȓjJ2p31q 0*00ܓp."XXV~8@@W0pT^W@0~8p΀  0pp`P/R %@0,` pT !gP/Qv p r`q p` J q  ւNppxW( Y0ga !q    q    ~8ɞ0@@WP<~@p@H ` HpNHHL  L,H΀LLcܓLa "s jLypHFL" (L|H  pHL   L.H ~@Ǟ<PPW @(#)smd.c 4.6 87/05/14 @(#)common.h 4.3 87/05/14 @(#)load.h 4.4 87/05/14 disk not formated Bad Block list too long Disk Error = %x 2HJPV  "TVnpz|~* JXZn   ( DHJNPX.textp7.datap.bssPoo_d_reado|o_Smdo"o_printfo_part_oko-o8o_npisto_nsecto_cb_bufoBo_d_writeo_stringo_itesto_flushoM_rech_smd_disc_dev_smd_type_exec_dcmd_disc_part_smdstart_disc_unitu G.text .data8\@.bss8 88W@~<zla@VBF p $ @B H*  @~<@@W@@ <t.<a!(""@DFRT`bprx X\.textA.data.bssn(_s_staten(_s_ioirn(_rech_mtn(_tapedevn(_d_readn(_editXn(_printfn(_d_writen(n(_tapecmdn(_iotapen(_mtreadn(n(_cb_bufn(_itestn(_flushn("n(,_inittape_tapemode_tapesize_tapeioirLF\ 1NW OW LLWLWL 8  WW@` 0WDH<~@pސLpD&J~@Ǟ<HHW0 C4!@W0 W00W88 ҋX?@H~Pd   pd L6X dӄ T0 !D tpӘ HTp  H   Ӱ xDΐ n ZqΠ  yRh @@ z, T  q ( y xyp8    ē ΐ y n P^p "@ ҶPp| 0 ΐ y n  |  p @ @ !p ~h@Lph,ppx.: .xx hh<p8Tx~PɞHɾ@XXW@RJ`<0<`a  @@W@~8p8z , p s   01@G *s  p$s s  1$Bۓ 0 0` jJ2p31q 0*00."XXV~8@@W0pT^W@0~8p΀  $08pp`P/R %@0,` pT !$gP/Q&v &p r`q p` J q  ւNppxW( Y0ga !q    q     ~8ɞ0@@WP<~@8p@H ` HpNHH8L @  L,H΀LLcܓLa "s  LypH~L"< pL|H  p&H0L <  "L.H $&$$~@Ǟ<PPW8 88W@~<\N@ a@* B p  @B H*  @~<@@W@@ ^<\`.<a!(""<<  @@WH<~@dp.hώd 'q%'qd u o x 6o x  lBs $ǘ Z) D *F~@Ǟ<HHWX?48@~HU   ˋ ʋ -p.L;^0KV@B 0    @ q!Ŋ|qL4qp~HɎ@ɮ84XXWP<~@p pDpHD DH HDH DLlDa    DpLL dǎL p $~@ǎ<PPWP8~@p  pz   pπ pϐH LH HL LHL .L @ F  p*La    L p~@ɞ8PPW@4ސ0~8p<$p. r  qO|   ~8Ǟ4@@WH8~@p0,\ *&  (x 9   ~@ɞ8HHW @(#)automove.c 4.3 87/05/14 @(#)load.h 4.4 87/05/14 @(#)main.c 4.4 87/05/14 @(#)common.h 4.3 87/05/14 @(#)load.h 4.4 87/05/14 %d%d%d%SRCS% disc controller number (%d) : ? controller: 0-3 unit number (%d) : Copy Boot ? (n) : Copy file system (n) : partition number (%d) : Copy file system to c%dd%ds%d OK ? (n) : %d ԀԠԸ,@P`Մ@: Fatal Error in Tape Copy . d_read(%x) error = %x d_write error = %x Smd Board not found ! c%dd%d not found Tape read error %x Smd write error %x End of Tape Copy Boot copied Boot skipped File system copied : %d blocks Tape Copy : @(#)smd.c 4.6 87/05/14 @(#)common.h 4.3 87/05/14 @(#)load.h 4.4 87/05/14 disk not formated Bad Block list too long Disk Error = %x  @(#)ct.c 4.3 87/05/14 @(#)load.h 4.4 87/05/14 @(#)prf_cio.c 4.6 87/05/14 @(#)load.h 4.4 87/05/14 0123456789ABCDEFu G.textpT .datappX@.bssH<~@dp.hώd z'q%'qd u o x 6o x  lBs $ǘ ) D *F~@Ǟ<HHWX?48@~HU   ˋ ʋ -Np.L;^0KV@B 0    @ q!Ŋ|qLqp~HɎ@ɮ84XXWH<~@pDDD Dc D  DD$D~@ǎ<HHWH<~@p pz  ހ`DDD~@ǎ<HHW@4ސ0~8p<$p.R Hr  2qO|   ~8Ǟ4@@WH8~@p0,\ *&  (x 9 t  ~@ɞ8HHW @(#)prf_fdlp.c 4.5 87/05/14 @(#)load.h 4.4 87/05/14 0123456789ABCDEF. > L   .textp.datapX.bss_printfo_putcharo_printno_getchar o_d_writeo_d_reado_getstr(o_getnumoLF\ 1NW OW LLWLWL 8  WW@` 0WDH<~@pސLpD&J~@Ǟ<HHW0 C4!@W0 W00W88 ҋX?@H~Pd   pd L6X dӄ T0 !D tpӘ HTp  H   Ӱ xDΐ n ZqΠ  yRh @@ z, T  q ( y xyp8    ē ΐ y n P^p "@ ҶPp| 0 ΐ y n  |  p @ @ !p ~h@Lph,ppx.: .xx hh<p8Tx~PɞHɾ@XXW@RJ`<0<`a  @@W@~8p8z , p s   01@G *s  p$s s  1$Bۓ 0 0` jJ2p31q 0*00."XXV~8@@W0pT^W@0~8p΀  $08pp`P/R %@0,` pT !$gP/Q&v &p r`q p` J q  ւNppxW( Y0ga !q    q     ~8ɞ0@@WP<~@8p@H ` HpNHH8L @  L,H΀LLcܓLa "s  LypH~L"< pL|H  p&H0L <  "L.H $&$$~@Ǟ<PPW8 88W@~<\N@ a@* B p  @B H*  @~<@@W@@ ^<\`.<a!(""<<  @@WH<~@dp.hώd 'q%'qd u o x 6o x  lBs $ǘ Z) D *F~@Ǟ<HHWX?48@~HU   ˋ ʋ -p.L;^0KV@B 0    @ q!Ŋ|qL4qp~HɎ@ɮ84XXWP<~@p pDpHD DH HDH DLlDa    DpLL dǎL p $~@ǎ<PPWP8~@p  pz   pπ pϐH LH HL LHL .L @ F  p*La    L p~@ɞ8PPW@4ސ0~8p<$p. r  qO|   ~8Ǟ4@@WH8~@p0,\ *&  (x 9   ~@ɞ8HHW @(#)automove.c 4.3 87/05/14 @(#)load.h 4.4 87/05/14 @(#)main.c 4.4 87/05/14 @(#)common.h 4.3 87/05/14 @(#)load.h 4.4 87/05/14 %d%d%d%SRCS% disc controller number (%d) : ? controller: 0-3 unit number (%d) : Copy Boot ? (n) : Copy file system (n) : partition number (%d) : Copy file system to c%dd%ds%d OK ? (n) : %d ԀԠԸ,@P`Մ@: Fatal Error in Tape Copy . d_read(%x) error = %x d_write error = %x Smd Board not found ! c%dd%d not found Tape read error %x Smd write error %x End of Tape Copy Boot copied Boot skipped File system copied : %d blocks Tape Copy : @(#)smd.c 4.6 87/05/14 @(#)common.h 4.3 87/05/14 @(#)load.h 4.4 87/05/14 disk not formated Bad Block list too long Disk Error = %x  @(#)ct.c 4.3 87/05/14 @(#)load.h 4.4 87/05/14 @(#)prf_cio.c 4.6 87/05/14 @(#)load.h 4.4 87/05/14 0123456789ABCDEFalias ls ls -C alias lf ls -F alias lr ls -R alias hexdump od -x alias hg "history | grep" alias hr history -r alias p0 ps -lt ttyp0 alias p1 ps -lt ttyp1 alias p2 ps -lt ttyp2 alias p3 ps -lt ttyp3 alias lplog tail /usr/spool/lp/log alias numusers "rwho | awk '{print "\$"1}' | uniq | wc -l" alias ston "echo -n Eh | tr E '\033'" alias uptime 'ruptime | grep $hostname' alias mk 'make >& errs &' alias chkerrs egrep \'annot\|atal\|rror\' errs umask 002 set history=1000 set histchars=',^' set hostname=`uname -n` set user=`whoami` if ( $?user ) set user=`whoami` if ( $?prompt ) set prompt="$user@$hostname \,> " set mail= ( 60 /usr/spool/mail/$user ) stty kill  setenv TZ PST8PDT set ignoreeof set path = ( $path /usr/ucb /usr/local $home/bin $home/ucb) set time=10 setenv EXINIT 'set nowrapscan \ set ignorecase\ set shiftwidth=2\ set autoindent\ set sh=/bin/sh' setenv SHELL /bin/sh source /src.cmd/tools/buildenv.csh while read i do echo ====== $i ====== # Make sure that null deltas get anchor points! admin -fn $i # check out for release 4 get -e -r4 $i # put it back in delta -y"rolled rev to -r4 /dc" $i done while read i do echo $i case $i in *.s) idstr='; \"%W% %E%\"' ;; *.c) idstr='/* "%W% %E%" */' ;; *.h) idstr='/* "%W% %E%" */' ;; *akefile) idstr='# "%W% %E%"' ;; *) echo unknown file type $i idstr="" ;; esac if [ "$idstr" ] then get -e $i name=`basename $i | sed -e 's/^s\.//'` echo $name (echo "0a" ; echo "$idstr" ; echo '.' ; echo "\nw\nq" ) | ex $name delta -y"add ident string /dc" $i else echo skipping $i fi done while read i do echo ====== $i ====== # Make sure that null deltas get anchor points! admin -fn $i # check out for release 3 get -e -r3 $i # put it back in delta -y"rolled rev to -r3 /dc" $i done : # while read a do if admin -fb -fn -i$a -y"Placed under source control - dc" s.$a then rm -f $a else echo admin failed. $a not removed. fi done while read i do echo ====== $i ====== # Make sure that null deltas get anchor points! admin -fn $i # check out for release 2 get -e -r2 $i # put it back in delta -y"rolled rev to -r2 /dc" $i done .Q..READMEs.main_mt.obsos.obs.headwalls.smd_mt.obsols.tttThis directory is a repository for files which have become obsolete. At some point, all files in this directory will be removed. For now, files may be placed here for validation of build sequences without these obsolete files, and for perusal / retrieval as necessary. h62617 s 00000/00000/00179 d D 2.1 87/02/11 15:31:01 build 3 2 c rolled rev to -r2 /dc e s 00001/00000/00178 d D 1.2 87/02/05 16:22:04 build 2 1 c add ident string /dc e s 00178/00000/00000 d D 1.1 87/02/05 16:19:37 build 1 0 c Placed under source control - dc e u U f b f n t T I 2 /* "%W% %E%" */ E 2 I 1 #include #include #include #include #include "common.h" char *error[] = { /*0*/ "d_read(%x) error = %x\n", /*1*/ "\nFatal Error in Tape Copy .\n", /*2*/ "\nNo c%dd%d in this machine\n", /*3*/ "\nNo smd board !\n", /*4*/ "\nFile system copied : %d blocks\n", /*5*/ "\nTape read error %x\n", /*6*/ "\nEnd of Tape Copy\n" /*7*/ "\nVTOC copied\n", /*8*/ "\nVTOC skipped\n" /*9*/ "\nBoot copied\n", /*10*/ "\nBoot skipped\n" } ; fault() { printf(error[1]) ; for(;;) ; } unsigned int c_cptr = 70 ; unsigned int l_cptr = 0 ; unsigned char car = ':' ; main() { register unsigned i, ioir, out ; register unsigned char d ; unsigned data ; for (i=0 ; i < 272 ; i++) ccb[i] = (int)(&(*fault)()) ; ccb[272] = 0x7FFFFFFF; ccb[273] = 0x7FFFFFFF; /* get disk me physical address */ cb_buf = (char *)(BUF_ME); printf("\nTape Copy :"); for(;;) { disc_dev = getnum("\ndevice number = ") ; if (disc_dev < 0) { for(disc_dev=31; disc_dev>0; disc_dev--) if (rech_smd()) { printf("%d", disc_dev) ; goto devok ; } printf(error[3]) ; fault() ; } devok: if ( ! rech_smd() ) continue ; disc_unit = getnum("\nunit number = ") ; if (disc_unit < 0) { disc_unit = 0 ; putchar('0') ; } if ((disc_unit<0) || (disc_unit>31)) goto smdko ; if (smd_type()) { smdko: printf(error[2], disc_dev, disc_unit) ; continue; } if ( inittape() ) fault() ; d = getstr("\nCopy Boot ? (y/n) : "); if (d == 0) putchar('n') ; out = 5 ; cb_buf = (char *)BUF_BOOT ; for (i=1; i<=2; i++) { if ((ioir = mtread()) == -1) goto exit ; if (ioir & (EOTAPE|FMK)) goto sortie ; if (d == 'y') smdstart(i, SMD_WRITE, RAW); cb_buf += BLKSIZE ; } ccb[265] = 0 ; if (d == 'y') i = 9 ; else i = 10 ; printf(error[i]) ; cb_buf = (char *)BUF_ME ; if ((ioir = mtread()) == -1) /* skip File Mark if any */ goto exit ; d = getstr("\nCopy Vtoc ? (y/n) : "); if (d == 'y') { data = 7 ; cb_buf = (char *)BUF_BBLK ; for (i=3; i<=2+VTOCSIZE; i++) { cb_buf += BLKSIZE ; if ((ioir = mtread()) == -1) goto exit ; if (ioir & (EOTAPE|FMK)) goto sortie ; smdstart(i, SMD_WRITE, RAW); } } else { data = 8 ; if (d == 0) putchar('n') ; cb_buf = (char *)BUF_ME ; for (i=3; i<=2+VTOCSIZE; i++) { if ((ioir = mtread()) == -1) goto exit ; if (ioir & (EOTAPE|FMK)) goto sortie ; } } printf(error[data]) ; cb_buf = (char *)(BUF_ME); if ((ioir = mtread()) == -1) /* skip File Mark if any */ goto sortie ; break; } d = getstr("\nCopy File System ? (y/n) : ") ; if (d != 'y') goto exit ; disc_part = PARTMAX + 1 ; while (disc_part > PARTMAX) { disc_part = getnum("\npartition number = ") ; if (disc_part < 0) { disc_part = 0 ; putchar('0') ; } } printf("\nCopy file system to c%dd%ds%d", disc_dev, disc_unit, disc_part); d = getstr("\nOK ? (y/n) : "); if (d != 'y') goto sortie ; putchar('\n') ; for(i = 0; ; i++) { if ((ioir = mtread()) == -1) goto exit ; if (ioir & EOTAPE) goto sortie ; if (ioir & FMK) break; smdstart(i, SMD_WRITE, BLOC); if (c_cptr == 70) { c_cptr = 0; printf("\r%d ", l_cptr) ; l_cptr++ ; car = (car == '.') ? ':' : '.' ; } putchar(car) ; c_cptr++; } out = 4 ; ioir = i ; sortie: printf(error[out], ioir) ; exit: printf(error[6]) ; flush() ; execute(0) ; } E 1 2 | { z y x w v u t s r q p o n m l k j i h g f e d c b a ` _ ^ ] \ [ Z Y X W V U T S R Q P O N M L Kh47435 s 00000/00000/00217 d D 2.1 87/02/11 15:31:31 build 4 3 c rolled rev to -r2 /dc e s 00004/00008/00213 d D 1.3 87/02/09 09:33:44 build 3 2 c convert to new smd.h e s 00001/00000/00220 d D 1.2 87/02/05 16:22:32 build 2 1 c add ident string /dc e s 00220/00000/00000 d D 1.1 87/02/05 16:19:42 build 1 0 c Placed under source control - dc e u U f b f n t T I 2 /* "%W% %E%" */ E 2 I 1 #include #include #include #include #include #include "common.h" /*-------------------------------------------------*/ /* */ /* gestion interne des io physique disque */ /* */ /*-------------------------------------------------*/ struct smdcb Smd[] = { SMD_SIZE, 0 } ; unsigned char nsect; unsigned short npist; extern char *error[] ; int rech_smd() { uint d, status ; if ((disc_dev<=0) || (disc_dev>31)) goto bad ; d = disc_dev << 24 ; if (d_read(d, &status) & 3) goto bad ; if ((status >> 24) != disc_dev) goto bad ; if (status & 0x00C00000) goto bad ; return(1) ; bad: return(0) ; } int smd_type() { register struct vtoc *p; register struct smdcb *smd = Smd ; int res ; /* reconnaissance */ if (rech_smd() == 0) return(1) ; smd->gorder = SMD_SIZE ; if ( exec_dcmd() ) return(1); smd->gorder = SMD_READ; D 3 smd->count0 = (2 * BLKSIZE) >> 8 ; E 3 I 3 smd->count0 = (2 * BLKSIZE) >> 8 ; /* transfer 2 pages */ E 3 smd->count1 = 0 ; smd->head = 0 ; smd->sector = 6; smd->cyl_high = 0 ; smd->cyl_low = 0 ; D 3 smd->addr0 = BUF_BBLK >> 16 ; smd->addr1 = BUF_BBLK >> 8 ; smd->addr2 = BUF_BBLK ; smd->header[0] = (BUF_BBLK >> 8) + 0x10; E 3 I 3 smd->mem_addr = BUF_BBLK; /* real memory address */ smd->header[0] = ptoedma(BUF_BBLK+BLKSIZE); /* 'next' buffer addr */ E 3 if ( exec_dcmd()) return(1); p = (struct vtoc *)BUF_BBLK ; #ifdef DEBUG if (p->v_sanity != VTOC_SANE) printf("\ndisk not formated\n") ; else printf("\nBad Bloc Table in memory\n"); #endif return(0); } /*RDP ====== | | entrees-sorties physiques disque | | valeur rendue: |--------------- | OK | | parametres d'entree: |--------------------- | bloc no de bloc physique a lire (bloc size = page size) | gorder ordre pour le controleur | mode raw => e/s par rapport au zero du disque | bloc => e/s par rapport au debut de la partition | */ int smdstart(bloc, gorder, mode) uint bloc, mode ; char gorder; { register struct smdcb *smd = Smd ; register struct vtoc *p ; struct bb_ind *indtab ; struct bb_gb *bbgb ; char *ptr ; uint addsk ; register rem; register ushort cylin ; #ifdef DEBUG printf("smdstart(%x, %x, %d)\n", bloc, gorder, mode) ; #endif DEBUG bloc <<= 1 ; cylin = bloc / npist ; p = (struct vtoc *)BUF_BBLK ; if (mode == BLOC) { /* mode raw = 0 ; mode bloc = 1 */ if (p->v_sanity == VTOC_SANE) cylin += p->v_part[disc_part].p_start; else cylin += 1 ; } rem = bloc % npist ; smd->head = rem / nsect; smd->sector = rem % nsect; addsk = (cylin << 16) + (smd->head << 8) + smd->sector; if (p->v_sanity == VTOC_SANE) { ptr = (char *)p + sizeof(struct vtoc) ; indtab = (struct bb_ind *)ptr ; ptr = (char *)indtab + (p->v_cyls)*sizeof(struct bb_ind) ; bbgb = (struct bb_gb *)ptr ; indtab += cylin; if (indtab->b_mapind != p->v_nbbmax) { bbgb += indtab->b_mapind ; while (bbgb->bb < addsk) bbgb++ ; if (bbgb->bb == addsk) { cylin = bbgb->gb >> 16 ; smd->head = (bbgb->gb >> 8) & 0xFF ; smd->sector = bbgb->gb & 0xFF ; #ifdef DEBUG printf("\nbad bloc : %x -> %x\n", bbgb->bb, bbgb->gb); #endif DEBUG } } } smd->cyl_high = cylin >> 8 ; smd->cyl_low = cylin & 0xFF; #ifdef DEBUG printf("\nbloc = %d, head = %d, cylin = %d, sector = %d\n", bloc>>1, smd->head, cylin, smd->sector); #endif smd->gorder = gorder ; smd->count0 = BLKSIZE >> 8 ; smd->count1 = 0 ; D 3 smd->addr0 = (uint)(cb_buf) >> 16 ; smd->addr1 = (uint)(cb_buf) >> 8 ; smd->addr2 = (uint)(cb_buf) ; E 3 I 3 smd->mem_addr = (uint)(cb_buf); /* real memory address */ E 3 return( exec_dcmd() ); } int exec_dcmd() { register unsigned char *pmd; register struct smdcb *smd ; int idev, dev, y, err; pmd = (unsigned char *)Smd ; y = sizeof(struct smdcb) ; idev = (disc_dev << 16) + (disc_unit * y) ; dev = (idev + y) << 8 ; while ( y ) { dev -= 0x0100 ; y-- ; if (err = d_write(dev + pmd[y], 0)) { printf("\nd_write: error = %x\n", err); return(1) ; } } #ifdef DEBUG printf("d_write(%x)", dev + pmd[y]); #endif for ( ; ; ) { while (itest(&err)) ; if ((err>>24) == disc_dev) break ; } flush(); if (err & 0xFF00) { printf("\nDisk Error = %x\n", (err >> 8)& 0xFF); return(1) ; } if (pmd[0] == SMD_SIZE) { smd = (struct smd *)(idev) ; if (err = d_read((uint)(&smd->sector) << 8, &y)) { printf(error[0], &smd->sector, err) ; return(1) ; } nsect = (y + 1) & 0xFF ; if (err = d_read((uint)(&smd->head) << 8, &y)) { printf(error[0], &smd->head, err) ; return(1) ; } npist = (y + 1) & 0xFF ; #ifdef DEBUG printf("\nnb secteurs / pistes = %d / %d\n", nsect, npist); #endif npist *= nsect ; } return(0); } E 1 h21018 s 00000/00000/00002 d D 4.1 87/02/17 10:39:01 mth 4 3 c rolled rev to -r4 (mth) e s 00000/00000/00002 d D 3.1 87/01/20 17:52:34 mkm 3 2 c e s 00000/00000/00002 d D 2.1 87/01/20 17:22:31 mkm 2 1 c e s 00002/00000/00000 d D 1.1 87/01/19 16:49:18 mkm 1 0 c Placed under source control - mkm e u U f b f n t T I 1 SYSC_SWAPF equ 58 Xsyscall equ 0 E 1 h49456 s 00000/00000/00027 d D 3.1 87/02/19 09:27:56 build 3 2 c rolled rev to -r3 /dc e s 00000/00000/00027 d D 2.1 87/02/19 09:27:56 build 2 1 c AUTO NULL DELTA e s 00027/00000/00000 d D 1.1 87/02/19 09:27:24 dc 1 0 c Placed under source control - dc e u U f b f n t T I 1 # "%W% %E%" # # Makefile for the unix kernel, and the bootstrappers boot and tboot # all: cd sys ; $(MAKE) cd boot ; $(MAKE) cd tboot ; $(MAKE) install: cd sys ; $(MAKE) install cd boot ; $(MAKE) install cd tboot ; $(MAKE) install clean: -rm errs core cd sys ; $(MAKE) clean cd boot ; $(MAKE) clean cd tboot ; $(MAKE) clean clobber: -rm errs core cd sys ; $(MAKE) clobber cd boot ; $(MAKE) clobber cd tboot ; $(MAKE) clobber E 1 + /usr/bin/get -r4 -t s.Makefile 3.1 27 lines cd sys ; /bin/make + /usr/bin/get -r4 -t s.Makefile 4.9 144 lines echo environment is : environment is : printenv USER=mkm TERM=vt100 SPX=/src.cmd/unix.bin SMX=/src.cmd/unix.bin SHELL=/bin/sh SGSBASE=/src.cmd/pdp/sgs REL=1.0 PS1=# PROD=/src.cmd/bin.production PEEP=$(PROD)/peep PCOM=$(PROD)/pcom PATH=/u/mkm/bin:/bin:/usr/bin NM=/bin/nm M4=/usr/bin/m4 LOGNAME=mkm LIBUCB=$(SPX)/usr/ucb.lib/libucb.a LIBPAS=$(SPX)/usr/lib/libpc.a LIBM=$(SPX)/lib/libm.a LIBINET=$(SPX)/usr/ucb.lib/libinet.a LIBI77=$(SPX)/usr/lib/libI77.a LIBF77=$(SPX)/usr/lib/libF77.a LIBCURSES=$(SPX)/usr/lib/libcurses.a LIBC=$(SPX)/lib/libc.a INS=/bin/cp INCUCB=$(SPX)/usr/ucb.include INC=$(SPX)/usr/include HOME=/u/mkm FCOM=$(PROD)/fcom CRT0=$(SPX)/lib/crt0.o CPP=/lib/cpp CCOM=$(PROD)/ccom ASRAW=/bin/as9 AR=/bin/ar PCFLAGS=-O $(IFLAGS) -I$(INC) -Ts\,$(CRT0) -TC\,$(LIBC) -TP\,$(LIBPAS) -Tp\,$(PCOM) -Ta\,$(ASRAW) -Tq\,$(PEEP) -TM\,$(LIBM) $(PCFLAGS2) PC=$(PROD)/pc FFLAGS=-O $(IFLAGS) -I$(INC) -Ts\,$(CRT0) -TC\,$(LIBC) -TM\,$(LIBM) -TF\,$(LIBF77) -TI\,$(LIBI77) -Tf\,$(FCOM) -Ta\,$(ASRAW) -Tq\,$(PEEP) $(FFLAGS2) F77=$(PROD)/f77 GFLAGS=-r4 -t GET=/usr/bin/get ASFLAGS=-I$(INC) $(ASFLAGS2) AS=$(PROD)/as CFLAGS=-O $(IFLAGS) -I$(INC) -Ts\,$(CRT0) -Tc\,$(CCOM) -Ta\,$(ASRAW) -TC\,$(LIBC) -Tq\,$(PEEP) -TM\,$(LIBM) $(DFLAGS) CC=$(PROD)/cc LD=/bin/ld LEX=/usr/bin/lex YACC=/usr/bin/yacc MAKE=/bin/make MAKEFLAGS=b cd sys/; /bin/make -b all + /usr/bin/get -r4 -t s.Makefile 4.10 294 lines cd ml/; /bin/make -b all + /usr/bin/get -r4 -t s.Makefile 4.6 88 lines cd cf/; /bin/make -b all + /usr/bin/get -r4 -t s.Makefile 4.13 62 lines cd os/; /bin/make -b all + /usr/bin/get -r4 -t s.Makefile 4.11 1144 lines cd io/; /bin/make -b all + /usr/bin/get -r4 -t s.Makefile 4.14 458 lines cd kdb/;/bin/make -b all + /usr/bin/get -r4 -t s.Makefile 4.3 28 lines cd net/;/bin/make -b all + /usr/bin/get -r4 -t s.Makefile 4.12 108 lines cd netinet/;/bin/make -b all + /usr/bin/get -r4 -t s.Makefile 4.12 210 lines /usr/bin/get -r4 -t -p s.if_loop.c > if_loop.c 4.7 129 lines /src.cmd/bin.production/cc -c -O -I/src.cmd/unix.bin/usr/ucb.include -I/src.cmd/unix.bin/usr/include -Ts\,/src.cmd/unix.bin/lib/crt0.o -Tc\,/src.cmd/bin.production/ccom -Ta\,/bin/as9 -TC\,/src.cmd/unix.bin/lib/libc.a -Tq\,/src.cmd/bin.production/peep -TM\,/src.cmd/unix.bin/lib/libm.a -DSOCKET -DINET -Ddebug -DSPS9 -DROSSE if_loop.c C - Copyright (c) 1987 Ridge Computers v3.0 if_loop.c: ar rv LIBIN.a if_loop.o ar: creating LIBIN.a a - if_loop.o rm -f if_loop.[co] /usr/bin/get -r4 -t -p s.in.c > in.c 4.7 103 lines /src.cmd/bin.production/cc -c -O -I/src.cmd/unix.bin/usr/ucb.include -I/src.cmd/unix.bin/usr/include -Ts\,/src.cmd/unix.bin/lib/crt0.o -Tc\,/src.cmd/bin.production/ccom -Ta\,/bin/as9 -TC\,/src.cmd/unix.bin/lib/libc.a -Tq\,/src.cmd/bin.production/peep -TM\,/src.cmd/unix.bin/lib/libm.a -DSOCKET -DINET -Ddebug -DSPS9 -DROSSE in.c C - Copyright (c) 1987 Ridge Computers v3.0 in.c: ar rv LIBIN.a in.o a - in.o rm -f in.[co] /usr/bin/get -r4 -t -p s.in_pcb.c > in_pcb.c 4.7 273 lines /src.cmd/bin.production/cc -c -O -I/src.cmd/unix.bin/usr/ucb.include -I/src.cmd/unix.bin/usr/include -Ts\,/src.cmd/unix.bin/lib/crt0.o -Tc\,/src.cmd/bin.production/ccom -Ta\,/bin/as9 -TC\,/src.cmd/unix.bin/lib/libc.a -Tq\,/src.cmd/bin.production/peep -TM\,/src.cmd/unix.bin/lib/libm.a -DSOCKET -DINET -Ddebug -DSPS9 -DROSSE in_pcb.c C - Copyright (c) 1987 Ridge Computers v3.0 in_pcb.c: ar rv LIBIN.a in_pcb.o a - in_pcb.o rm -f in_pcb.[co] /usr/bin/get -r4 -t -p s.in_proto.c > in_proto.c 4.7 94 lines /src.cmd/bin.production/cc -c -O -I/src.cmd/unix.bin/usr/ucb.include -I/src.cmd/unix.bin/usr/include -Ts\,/src.cmd/unix.bin/lib/crt0.o -Tc\,/src.cmd/bin.production/ccom -Ta\,/bin/as9 -TC\,/src.cmd/unix.bin/lib/libc.a -Tq\,/src.cmd/bin.production/peep -TM\,/src.cmd/unix.bin/lib/libm.a -DSOCKET -DINET -Ddebug -DSPS9 -DROSSE in_proto.c C - Copyright (c) 1987 Ridge Computers v3.0 in_proto.c: ar rv LIBIN.a in_proto.o a - in_proto.o rm -f in_proto.[co] /usr/bin/get -r4 -t -p s.ip_icmp.c > ip_icmp.c 4.7 311 lines /src.cmd/bin.production/cc -c -O -I/src.cmd/unix.bin/usr/ucb.include -I/src.cmd/unix.bin/usr/include -Ts\,/src.cmd/unix.bin/lib/crt0.o -Tc\,/src.cmd/bin.production/ccom -Ta\,/bin/as9 -TC\,/src.cmd/unix.bin/lib/libc.a -Tq\,/src.cmd/bin.production/peep -TM\,/src.cmd/unix.bin/lib/libm.a -DSOCKET -DINET -Ddebug -DSPS9 -DROSSE ip_icmp.c C - Copyright (c) 1987 Ridge Computers v3.0 ip_icmp.c: ar rv LIBIN.a ip_icmp.o a - ip_icmp.o rm -f ip_icmp.[co] /usr/bin/get -r4 -t -p s.ip_input.c > ip_input.c 4.7 689 lines /src.cmd/bin.production/cc -c -O -I/src.cmd/unix.bin/usr/ucb.include -I/src.cmd/unix.bin/usr/include -Ts\,/src.cmd/unix.bin/lib/crt0.o -Tc\,/src.cmd/bin.production/ccom -Ta\,/bin/as9 -TC\,/src.cmd/unix.bin/lib/libc.a -Tq\,/src.cmd/bin.production/peep -TM\,/src.cmd/unix.bin/lib/libm.a -DSOCKET -DINET -Ddebug -DSPS9 -DROSSE ip_input.c C - Copyright (c) 1987 Ridge Computers v3.0 ip_input.c: ar rv LIBIN.a ip_input.o a - ip_input.o rm -f ip_input.[co] /usr/bin/get -r4 -t -p s.ip_output.c > ip_output.c 4.7 226 lines /src.cmd/bin.production/cc -c -O -I/src.cmd/unix.bin/usr/ucb.include -I/src.cmd/unix.bin/usr/include -Ts\,/src.cmd/unix.bin/lib/crt0.o -Tc\,/src.cmd/bin.production/ccom -Ta\,/bin/as9 -TC\,/src.cmd/unix.bin/lib/libc.a -Tq\,/src.cmd/bin.production/peep -TM\,/src.cmd/unix.bin/lib/libm.a -DSOCKET -DINET -Ddebug -DSPS9 -DROSSE ip_output.c C - Copyright (c) 1987 Ridge Computers v3.0 ip_output.c: ar rv LIBIN.a ip_output.o a - ip_output.o rm -f ip_output.[co] /usr/bin/get -r4 -t -p s.raw_ip.c > raw_ip.c 4.7 97 lines /src.cmd/bin.production/cc -c -O -I/src.cmd/unix.bin/usr/ucb.include -I/src.cmd/unix.bin/usr/include -Ts\,/src.cmd/unix.bin/lib/crt0.o -Tc\,/src.cmd/bin.production/ccom -Ta\,/bin/as9 -TC\,/src.cmd/unix.bin/lib/libc.a -Tq\,/src.cmd/bin.production/peep -TM\,/src.cmd/unix.bin/lib/libm.a -DSOCKET -DINET -Ddebug -DSPS9 -DROSSE raw_ip.c C - Copyright (c) 1987 Ridge Computers v3.0 raw_ip.c: ar rv LIBIN.a raw_ip.o a - raw_ip.o rm -f raw_ip.[co] /usr/bin/get -r4 -t -p s.tcp_debug.c > tcp_debug.c 4.7 124 lines /src.cmd/bin.production/cc -c -O -I/src.cmd/unix.bin/usr/ucb.include -I/src.cmd/unix.bin/usr/include -Ts\,/src.cmd/unix.bin/lib/crt0.o -Tc\,/src.cmd/bin.production/ccom -Ta\,/bin/as9 -TC\,/src.cmd/unix.bin/lib/libc.a -Tq\,/src.cmd/bin.production/peep -TM\,/src.cmd/unix.bin/lib/libm.a -DSOCKET -DINET -Ddebug -DSPS9 -DROSSE tcp_debug.c C - Copyright (c) 1987 Ridge Computers v3.0 tcp_debug.c: ar rv LIBIN.a tcp_debug.o a - tcp_debug.o rm -f tcp_debug.[co] /usr/bin/get -r4 -t -p s.tcp_input.c > tcp_input.c 4.7 936 lines /src.cmd/bin.production/cc -c -O -I/src.cmd/unix.bin/usr/ucb.include -I/src.cmd/unix.bin/usr/include -Ts\,/src.cmd/unix.bin/lib/crt0.o -Tc\,/src.cmd/bin.production/ccom -Ta\,/bin/as9 -TC\,/src.cmd/unix.bin/lib/libc.a -Tq\,/src.cmd/bin.production/peep -TM\,/src.cmd/unix.bin/lib/libm.a -DSOCKET -DINET -Ddebug -DSPS9 -DROSSE tcp_input.c C - Copyright (c) 1987 Ridge Computers v3.0 tcp_input.c: ar rv LIBIN.a tcp_input.o a - tcp_input.o rm -f tcp_input.[co] /usr/bin/get -r4 -t -p s.tcp_output.c > tcp_output.c 4.8 343 lines /src.cmd/bin.production/cc -c -O -I/src.cmd/unix.bin/usr/ucb.include -I/src.cmd/unix.bin/usr/include -Ts\,/src.cmd/unix.bin/lib/crt0.o -Tc\,/src.cmd/bin.production/ccom -Ta\,/bin/as9 -TC\,/src.cmd/unix.bin/lib/libc.a -Tq\,/src.cmd/bin.production/peep -TM\,/src.cmd/unix.bin/lib/libm.a -DSOCKET -DINET -Ddebug -DSPS9 -DROSSE tcp_output.c C - Copyright (c) 1987 Ridge Computers v3.0 tcp_output.c: ar rv LIBIN.a tcp_output.o a - tcp_output.o rm -f tcp_output.[co] /usr/bin/get -r4 -t -p s.tcp_subr.c > tcp_subr.c 4.7 276 lines /src.cmd/bin.production/cc -c -O -I/src.cmd/unix.bin/usr/ucb.include -I/src.cmd/unix.bin/usr/include -Ts\,/src.cmd/unix.bin/lib/crt0.o -Tc\,/src.cmd/bin.production/ccom -Ta\,/bin/as9 -TC\,/src.cmd/unix.bin/lib/libc.a -Tq\,/src.cmd/bin.production/peep -TM\,/src.cmd/unix.bin/lib/libm.a -DSOCKET -DINET -Ddebug -DSPS9 -DROSSE tcp_subr.c C - Copyright (c) 1987 Ridge Computers v3.0 tcp_subr.c: ar rv LIBIN.a tcp_subr.o a - tcp_subr.o rm -f tcp_subr.[co] /usr/bin/get -r4 -t -p s.in_cksum.s > in_cksum.s 4.4 390 lines /src.cmd/bin.production/as -I/src.cmd/unix.bin/usr/include -DARGSINREGS -DLINK=r15 -o in_cksum.o in_cksum.s ar rv LIBIN.a in_cksum.o a - in_cksum.o rm -f in_cksum.[so] /usr/bin/get -r4 -t -p s.tcp_timer.c > tcp_timer.c 4.7 208 lines /src.cmd/bin.production/cc -c -O -I/src.cmd/unix.bin/usr/ucb.include -I/src.cmd/unix.bin/usr/include -Ts\,/src.cmd/unix.bin/lib/crt0.o -Tc\,/src.cmd/bin.production/ccom -Ta\,/bin/as9 -TC\,/src.cmd/unix.bin/lib/libc.a -Tq\,/src.cmd/bin.production/peep -TM\,/src.cmd/unix.bin/lib/libm.a -DSOCKET -DINET -Ddebug -DSPS9 -DROSSE tcp_timer.c C - Copyright (c) 1987 Ridge Computers v3.0 tcp_timer.c: ar rv LIBIN.a tcp_timer.o a - tcp_timer.o rm -f tcp_timer.[co] /usr/bin/get -r4 -t -p s.tcp_usrreq.c > tcp_usrreq.c 4.7 397 lines /src.cmd/bin.production/cc -c -O -I/src.cmd/unix.bin/usr/ucb.include -I/src.cmd/unix.bin/usr/include -Ts\,/src.cmd/unix.bin/lib/crt0.o -Tc\,/src.cmd/bin.production/ccom -Ta\,/bin/as9 -TC\,/src.cmd/unix.bin/lib/libc.a -Tq\,/src.cmd/bin.production/peep -TM\,/src.cmd/unix.bin/lib/libm.a -DSOCKET -DINET -Ddebug -DSPS9 -DROSSE tcp_usrreq.c C - Copyright (c) 1987 Ridge Computers v3.0 tcp_usrreq.c: ar rv LIBIN.a tcp_usrreq.o a - tcp_usrreq.o rm -f tcp_usrreq.[co] /usr/bin/get -r4 -t -p s.if_ether.c > if_ether.c 4.7 769 lines /src.cmd/bin.production/cc -c -O -I/src.cmd/unix.bin/usr/ucb.include -I/src.cmd/unix.bin/usr/include -Ts\,/src.cmd/unix.bin/lib/crt0.o -Tc\,/src.cmd/bin.production/ccom -Ta\,/bin/as9 -TC\,/src.cmd/unix.bin/lib/libc.a -Tq\,/src.cmd/bin.production/peep -TM\,/src.cmd/unix.bin/lib/libm.a -DSOCKET -DINET -Ddebug -DSPS9 -DROSSE if_ether.c C - Copyright (c) 1987 Ridge Computers v3.0 if_ether.c: ar rv LIBIN.a if_ether.o a - if_ether.o rm -f if_ether.[co] /usr/bin/get -r4 -t -p s.udp_usrreq.c > udp_usrreq.c 4.7 380 lines /src.cmd/bin.production/cc -c -O -I/src.cmd/unix.bin/usr/ucb.include -I/src.cmd/unix.bin/usr/include -Ts\,/src.cmd/unix.bin/lib/crt0.o -Tc\,/src.cmd/bin.production/ccom -Ta\,/bin/as9 -TC\,/src.cmd/unix.bin/lib/libc.a -Tq\,/src.cmd/bin.production/peep -TM\,/src.cmd/unix.bin/lib/libm.a -DSOCKET -DINET -Ddebug -DSPS9 -DROSSE udp_usrreq.c C - Copyright (c) 1987 Ridge Computers v3.0 udp_usrreq.c: ar rv LIBIN.a udp_usrreq.o a - udp_usrreq.o rm -f udp_usrreq.[co] cd wb/;/bin/make -b all + /usr/bin/get -r4 -t s.Makefile 4.10 44 lines /bin/make -b unix /usr/bin/get -r4 -t -p s.unix.ld > unix.ld 4.2 11 lines /usr/bin/get -r4 -t -p s.mk.field > mk.field 4.4 58 lines rm -f unix start.o ar x ml/LIB0.a start.o /bin/ld -N -o unix unix.ld -e _start start.o cf/conf.o cf/linesw.o ml/LIB0.a os/LIB1.a io/LIB2.a kdb/LIBKDB.a net/LIBN.a netinet/LIBIN.a wb/LIBWB.a ml/LIB0.a os/LIB1.a io/LIB2.a kdb/LIBKDB.a net/LIBN.a netinet/LIBIN.a wb/LIBWB.a chmod 544 unix rm -f start.o cd boot ; /bin/make + /usr/bin/get -r4 -t s.Makefile 4.5 78 lines /usr/bin/get -r4 -t -p s.start.s > start.s 4.5 126 lines /src.cmd/bin.production/as -I/src.cmd/unix.bin/usr/include -o start.o start.s rm -f start.s /usr/bin/get -r4 -t -p s.load.h > load.h 4.4 27 lines /usr/bin/get -r4 -t -p s.automove.c > automove.c 4.3 41 lines /src.cmd/bin.production/cc -O -I/src.cmd/unix.bin/usr/include -Ts\,/src.cmd/unix.bin/lib/crt0.o -Tc\,/src.cmd/bin.production/ccom -Ta\,/bin/as9 -TC\,/src.cmd/unix.bin/lib/libc.a -Tq\,/src.cmd/bin.production/peep -TM\,/src.cmd/unix.bin/lib/libm.a -c automove.c C - Copyright (c) 1987 Ridge Computers v3.0 automove.c: rm -f automove.c /usr/bin/get -r4 -t -p s.load.c > load.c 4.3 119 lines /src.cmd/bin.production/cc -O -I/src.cmd/unix.bin/usr/include -Ts\,/src.cmd/unix.bin/lib/crt0.o -Tc\,/src.cmd/bin.production/ccom -Ta\,/bin/as9 -TC\,/src.cmd/unix.bin/lib/libc.a -Tq\,/src.cmd/bin.production/peep -TM\,/src.cmd/unix.bin/lib/libm.a -c load.c C - Copyright (c) 1987 Ridge Computers v3.0 load.c: rm -f load.c /usr/bin/get -r4 -t -p s.common.h > common.h 4.3 26 lines /usr/bin/get -r4 -t -p s.file.c > file.c 4.3 252 lines /src.cmd/bin.production/cc -O -I/src.cmd/unix.bin/usr/include -Ts\,/src.cmd/unix.bin/lib/crt0.o -Tc\,/src.cmd/bin.production/ccom -Ta\,/bin/as9 -TC\,/src.cmd/unix.bin/lib/libc.a -Tq\,/src.cmd/bin.production/peep -TM\,/src.cmd/unix.bin/lib/libm.a -c file.c C - Copyright (c) 1987 Ridge Computers v3.0 file.c: rm -f file.c /usr/bin/get -r4 -t -p s.smd.c > smd.c 4.6 238 lines /src.cmd/bin.production/cc -O -I/src.cmd/unix.bin/usr/include -Ts\,/src.cmd/unix.bin/lib/crt0.o -Tc\,/src.cmd/bin.production/ccom -Ta\,/bin/as9 -TC\,/src.cmd/unix.bin/lib/libc.a -Tq\,/src.cmd/bin.production/peep -TM\,/src.cmd/unix.bin/lib/libm.a -c smd.c C - Copyright (c) 1987 Ridge Computers v3.0 smd.c: rm -f smd.c /usr/bin/get -r4 -t -p s.main.c > main.c 4.3 70 lines /src.cmd/bin.production/cc -O -I/src.cmd/unix.bin/usr/include -Ts\,/src.cmd/unix.bin/lib/crt0.o -Tc\,/src.cmd/bin.production/ccom -Ta\,/bin/as9 -TC\,/src.cmd/unix.bin/lib/libc.a -Tq\,/src.cmd/bin.production/peep -TM\,/src.cmd/unix.bin/lib/libm.a -c main.c C - Copyright (c) 1987 Ridge Computers v3.0 main.c: rm -f main.c /usr/bin/get -r4 -t -p s.prf_cio.c > prf_cio.c 4.5 295 lines /src.cmd/bin.production/cc -O -I/src.cmd/unix.bin/usr/include -Ts\,/src.cmd/unix.bin/lib/crt0.o -Tc\,/src.cmd/bin.production/ccom -Ta\,/bin/as9 -TC\,/src.cmd/unix.bin/lib/libc.a -Tq\,/src.cmd/bin.production/peep -TM\,/src.cmd/unix.bin/lib/libm.a -c prf_cio.c C - Copyright (c) 1987 Ridge Computers v3.0 prf_cio.c: rm -f prf_cio.c /usr/bin/get -r4 -t -p s.ld.file > ld.file 4.2 9 lines /bin/ld -N -o tmpboot ld.file start.o automove.o load.o file.o smd.o main.o prf_cio.o strip -m tmpboot dd if=tmpboot of=diskboot bs=168 skip=1 28+1 blocks in 28+1 blocks out rm tmpboot /usr/bin/get -r4 -t -p s.main_fdlp.c > main_fdlp.c 4.3 125 lines /src.cmd/bin.production/cc -O -I/src.cmd/unix.bin/usr/include -Ts\,/src.cmd/unix.bin/lib/crt0.o -Tc\,/src.cmd/bin.production/ccom -Ta\,/bin/as9 -TC\,/src.cmd/unix.bin/lib/libc.a -Tq\,/src.cmd/bin.production/peep -TM\,/src.cmd/unix.bin/lib/libm.a -c main_fdlp.c C - Copyright (c) 1987 Ridge Computers v3.0 main_fdlp.c: rm -f main_fdlp.c /usr/bin/get -r4 -t -p s.prf_fdlp.c > prf_fdlp.c 4.4 176 lines /src.cmd/bin.production/cc -O -I/src.cmd/unix.bin/usr/include -Ts\,/src.cmd/unix.bin/lib/crt0.o -Tc\,/src.cmd/bin.production/ccom -Ta\,/bin/as9 -TC\,/src.cmd/unix.bin/lib/libc.a -Tq\,/src.cmd/bin.production/peep -TM\,/src.cmd/unix.bin/lib/libm.a -c prf_fdlp.c C - Copyright (c) 1987 Ridge Computers v3.0 prf_fdlp.c: rm -f prf_fdlp.c /bin/ld -N -o tmpboot ld.file start.o automove.o load.o file.o smd.o main_fdlp.o prf_fdlp.o strip -m tmpboot dd if=tmpboot of=bootfdlp bs=168 skip=1 34+1 blocks in 34+1 blocks out rm tmpboot cd tboot ; /bin/make + /usr/bin/get -r4 -t s.Makefile 4.6 98 lines /usr/bin/get -r4 -t -p s.start.s > start.s 4.4 98 lines /src.cmd/bin.production/as -I/src.cmd/unix.bin/usr/include -o start.o start.s rm -f start.s /usr/bin/get -r4 -t -p s.load.h > load.h 4.4 35 lines /usr/bin/get -r4 -t -p s.automove.c > automove.c 4.3 39 lines /src.cmd/bin.production/cc -O -I/src.cmd/unix.bin/usr/include -Ts\,/src.cmd/unix.bin/lib/crt0.o -Tc\,/src.cmd/bin.production/ccom -Ta\,/bin/as9 -TC\,/src.cmd/unix.bin/lib/libc.a -Tq\,/src.cmd/bin.production/peep -TM\,/src.cmd/unix.bin/lib/libm.a -c automove.c C - Copyright (c) 1987 Ridge Computers v3.0 automove.c: rm -f automove.c /usr/bin/get -r4 -t -p s.common.h > common.h 4.3 13 lines /usr/bin/get -r4 -t -p s.main.c > main.c 4.4 189 lines /src.cmd/bin.production/cc -O -I/src.cmd/unix.bin/usr/include -Ts\,/src.cmd/unix.bin/lib/crt0.o -Tc\,/src.cmd/bin.production/ccom -Ta\,/bin/as9 -TC\,/src.cmd/unix.bin/lib/libc.a -Tq\,/src.cmd/bin.production/peep -TM\,/src.cmd/unix.bin/lib/libm.a -c main.c C - Copyright (c) 1987 Ridge Computers v3.0 main.c: rm -f main.c /usr/bin/get -r4 -t -p s.smd.c > smd.c 4.6 265 lines /src.cmd/bin.production/cc -O -I/src.cmd/unix.bin/usr/include -Ts\,/src.cmd/unix.bin/lib/crt0.o -Tc\,/src.cmd/bin.production/ccom -Ta\,/bin/as9 -TC\,/src.cmd/unix.bin/lib/libc.a -Tq\,/src.cmd/bin.production/peep -TM\,/src.cmd/unix.bin/lib/libm.a -c smd.c C - Copyright (c) 1987 Ridge Computers v3.0 smd.c: rm -f smd.c /usr/bin/get -r4 -t -p s.ct.c > ct.c 4.3 70 lines /src.cmd/bin.production/cc -O -I/src.cmd/unix.bin/usr/include -Ts\,/src.cmd/unix.bin/lib/crt0.o -Tc\,/src.cmd/bin.production/ccom -Ta\,/bin/as9 -TC\,/src.cmd/unix.bin/lib/libc.a -Tq\,/src.cmd/bin.production/peep -TM\,/src.cmd/unix.bin/lib/libm.a -c ct.c C - Copyright (c) 1987 Ridge Computers v3.0 ct.c: rm -f ct.c /usr/bin/get -r4 -t -p s.prf_cio.c > prf_cio.c 4.6 207 lines /src.cmd/bin.production/cc -O -I/src.cmd/unix.bin/usr/include -Ts\,/src.cmd/unix.bin/lib/crt0.o -Tc\,/src.cmd/bin.production/ccom -Ta\,/bin/as9 -TC\,/src.cmd/unix.bin/lib/libc.a -Tq\,/src.cmd/bin.production/peep -TM\,/src.cmd/unix.bin/lib/libm.a -c prf_cio.c C - Copyright (c) 1987 Ridge Computers v3.0 prf_cio.c: rm -f prf_cio.c /usr/bin/get -r4 -t -p s.ld.file > ld.file 4.2 9 lines /bin/ld -N -o tmpboot ld.file start.o automove.o main.o smd.o ct.o ct.o prf_cio.o strip -m tmpboot dd if=tmpboot of=ctbootcio bs=168 skip=1 35+1 blocks in 35+1 blocks out rm tmpboot /usr/bin/get -r4 -t -p s.mt.c > mt.c 4.3 124 lines /src.cmd/bin.production/cc -O -I/src.cmd/unix.bin/usr/include -Ts\,/src.cmd/unix.bin/lib/crt0.o -Tc\,/src.cmd/bin.production/ccom -Ta\,/bin/as9 -TC\,/src.cmd/unix.bin/lib/libc.a -Tq\,/src.cmd/bin.production/peep -TM\,/src.cmd/unix.bin/lib/libm.a -c mt.c C - Copyright (c) 1987 Ridge Computers v3.0 mt.c: rm -f mt.c /bin/ld -N -o tmpboot ld.file start.o automove.o main.o smd.o ct.o ct.o prf_cio.o strip -m tmpboot dd if=tmpboot of=mtbootcio bs=168 skip=1 35+1 blocks in 35+1 blocks out rm tmpboot /usr/bin/get -r4 -t -p s.prf_fdlp.c > prf_fdlp.c 4.5 184 lines /src.cmd/bin.production/cc -O -I/src.cmd/unix.bin/usr/include -Ts\,/src.cmd/unix.bin/lib/crt0.o -Tc\,/src.cmd/bin.production/ccom -Ta\,/bin/as9 -TC\,/src.cmd/unix.bin/lib/libc.a -Tq\,/src.cmd/bin.production/peep -TM\,/src.cmd/unix.bin/lib/libm.a -c prf_fdlp.c C - Copyright (c) 1987 Ridge Computers v3.0 prf_fdlp.c: rm -f prf_fdlp.c /bin/ld -N -o tmpboot ld.file start.o automove.o main.o smd.o ct.o ct.o prf_cio.o strip -m tmpboot dd if=tmpboot of=mtbootfdlp bs=168 skip=1 35+1 blocks in 35+1 blocks out rm tmpboot ...libF774libI77\libmcursesUlibcs.MakefilelibPW...s.abort_.cs.bit.cs.bit.hs.bitsIRTF.ss.bitsR2V2.ss.c_abs.cs.c_cos.cs.c_div.cs.c_exp.cs.c_log.cs.c_sin.cs.c_sqrt.cs.cabs.cs.complexs.d_abs.ss.d_acos.cs.d_cnjg.cs.d_dim.cs.d_imag.cs.d_int.cs.d_mod.cs.d_nint.cs.d_prod.cs.d_sign.cs.derf_.cs.derfc_.cs.ef1asc_.cs.ef1cmc_.cs.erf_.cs.erfc_.cs.exit_.cs.fdate_.cs.getarg_.cs.getenv_.cs.h_abs.cs.h_dim.cs.h_dnnt.cs.h_indx.cs.h_len.cs.h_mod.cs.h_nint.cs.h_sign.cs.hl_ge.cs.hl_gt.cs.hl_le.cs.hl_lt.cs.i_abs.cs.i_dim.cs.i_dnnt.cs.i_indx.cs.i_len.cs.i_mod.cs.i_nint.cs.i_sign.cs.iargc_.cs.l_ge.cs.l_gt.cs.l_le.cs.l_lt.cs.nint.ss.Makefiles.lnblnk_.cs.loc_.cs.main.cs.matherr.ss.mclock_.cs.minmax.cs.mvbits.cs.nbpar.ss.outstr_.cs.pow_ci.cs.pow_di.s s.pow_hh.c s.pow_ii.c s.pow_ri.s s.pow_zi.c s.pow_zz.cs.r_abs.ss.r_cnjg.cs.r_dim.cs.r_imag.cs.r_int.cs.r_mod.cs.r_nint.cs.r_sign.cs.rand_.cs.rindex_.cs.s_cat.cs.s_cmp.cs.s_copy.cs.s_paus.cs.s_rnge.cs.s_stop.cs.secnds.fs.signal_.c s.subout.c!s.system_.c"s.z_abs.c#s.z_cos.c$s.z_div.c%s.z_exp.c&s.z_log.c's.z_sin.c(s.z_sqrt.c)bit.h*Makefile+complex,libF77.a-minmax.c.r_mod.c/rr_nint.c0s.rr_nint.c1libF77.a.map2plibF77.a.map3plibF77.ah46099 s 00001/00001/00008 d D 4.2 87/05/13 17:27:53 build 5 4 c removed old SCCS strings and inserted #ident BB e s 00000/00000/00009 d D 4.1 87/02/17 08:27:08 mth 4 3 c rolled rev to -r4 (mth) e s 00000/00000/00009 d D 3.1 87/01/21 16:54:09 mkm 3 2 c e s 00000/00000/00009 d D 2.1 87/01/21 16:50:08 mkm 2 1 c e s 00009/00000/00000 d D 1.1 87/01/21 16:46:21 mkm 1 0 c Placed under source control - mkm c These files are direct descendants of the ROS files c by the same name at or about ROS rev 5.2 e u U f b f n t T I 1 D 5 /* "%W% %E%" */ E 5 I 5 #ident " %W% %E% " E 5 #include abort_() { fprintf(stderr, "Fortran abort routine called\n"); _cleanup(); abort(); } E 1 h23787 s 00001/00001/00046 d D 4.2 87/05/13 17:28:10 build 5 4 c removed old SCCS strings and inserted #ident BB e s 00000/00000/00047 d D 4.1 87/02/17 08:27:10 mth 4 3 c rolled rev to -r4 (mth) e s 00000/00000/00047 d D 3.1 87/01/21 16:54:10 mkm 3 2 c e s 00000/00000/00047 d D 2.1 87/01/21 16:50:09 mkm 2 1 c e s 00047/00000/00000 d D 1.1 87/01/21 16:46:22 mkm 1 0 c Placed under source control - mkm c These files are direct descendants of the ROS files c by the same name at or about ROS rev 5.2 e u U f b f n t T I 1 D 5 /* "%W% %E%" */ E 5 I 5 #ident " %W% %E% " E 5 /* * * bit set, clear, test routines * * calling sequences: * logical l, bit, state * call bis (bitnum, word) * call bic (bitnum, word) * call setbit (bitnum, word, state) * l = bit (bitnum, word) * where: * bis(bic) sets(clears) bitnum in word * setbit sets bitnum in word to 1 if state is .true. * bit tests bitnum in word and returns a logical (t/f) value */ long bis_(n, w) long *n, *w; { if (*n >= 0 && *n <= 31) *w |= (1L << (*n)); } long bic_(n, w) long *n, *w; { if (*n >= 0 && *n <= 31) *w &= ~(1L << (*n)); } long bit_(n, w) long *n, *w; { if (*n < 0 || *n > 31) return(0); return((*w & (1L << (*n))) != 0); } setbit_(n, w, s) long *n, *w, *s; { if (*s) bis_(n, w); else bic_(n, w); } E 1 h40499 s 00001/00001/00004 d D 3.2 87/05/13 17:28:20 build 4 3 c removed old SCCS strings and inserted #ident BB e s 00000/00000/00005 d D 3.1 87/01/21 16:54:11 mkm 3 2 c e s 00000/00000/00005 d D 2.1 87/01/21 16:50:10 mkm 2 1 c e s 00005/00000/00000 d D 1.1 87/01/21 16:46:22 mkm 1 0 c Placed under source control - mkm c These files are direct descendants of the ROS files c by the same name at or about ROS rev 5.2 e u U f b f n t T I 1 D 4 /* "%W% %E%" */ E 4 I 4 #ident " %W% %E% " E 4 #define NBSI 16 /* # bits in short int */ #define NBLI 32 /* # bits in long int */ extern long F77mask[], *F77zmask; E 1 h03216 s 00001/00001/00642 d D 4.4 87/04/27 11:08:55 mth 7 6 c L19 had been ifdefed out. e s 00042/00042/00601 d D 4.3 87/04/16 16:23:43 build 6 5 c Profiling changes e s 00175/00030/00468 d D 4.2 87/02/17 08:43:09 mth 5 4 c Parateters in registers. e s 00000/00000/00498 d D 4.1 87/02/17 08:27:14 mth 4 3 c rolled rev to -r4 (mth) e s 00000/00000/00498 d D 3.1 87/01/21 16:54:12 mkm 3 2 c e s 00000/00000/00498 d D 2.1 87/01/21 16:50:11 mkm 2 1 c e s 00498/00000/00000 d D 1.1 87/01/21 16:46:23 mkm 1 0 c Placed under source control - mkm c These files are direct descendants of the ROS files c by the same name at or about ROS rev 5.2 e u U f b f n t T I 1 ; "%W% %E%" ; ----------- jishl ---------- D 6 dsect data E 6 csect code D 6 align 2 E 6 I 6 align 4 E 6 global _jishl _jishl: I 6 ; MCOUNT E 6 I 5 #ifdef ARGSINREGS load r0,r0 load r1,r1 br r1 < 0,L1 lsl r0,r1 ret LINK,LINK L1: neg r1,r1 lsr r0,r1 ret LINK,LINK #else E 5 load r0,r14,32 load r0,r0,0 br r0 < 0,L21!,l load r0,r14,24 load r0,r0,0 load r1,r14,32 load r1,r1,0 lsl r0,r1 br L22,L L21: load r0,r14,24 load r0,r0,0 load r1,r14,32 load r1,r1,0 neg r1,r1 lsr r0,r1 L22: D 5 ret r11,r11 E 5 I 5 ret LINK,LINK #endif E 5 ; ----------- iishl --------- D 6 dsect data E 6 csect code D 6 align 2 E 6 I 6 align 4 E 6 global _iishl _iishl: I 6 ; MCOUNT E 6 I 5 #ifdef ARGSINREGS loadh r0,r0 seh r0,r0 load r1,r1 br r1<0,L2 lsl r0,r1 ret LINK,LINK L2: neg r1,r1 lsr r0,r1 ret LINK,LINK #else E 5 load r0,r14,32 load r0,r0,0 br r0 < 0,L23!,l load r0,r14,24 loadh r0,r0,0 seh r0,r0 load r1,r14,32 load r1,r1,0 lsl r0,r1 br L24,L L23: load r0,r14,24 loadh r0,r0,0 seh r0,r0 load r1,r14,32 load r1,r1,0 neg r1,r1 lsr r0,r1 L24: D 5 ret r11,r11 E 5 I 5 ret LINK,LINK #endif E 5 ;*--------- bishl ----------*/ D 6 dsect data E 6 csect code D 6 align 2 E 6 I 6 align 4 E 6 global _bishl _bishl: I 6 ; MCOUNT E 6 I 5 #ifdef ARGSINREGS loadb r0,r0 load r1,r1 br r1<0,L3 lsl r0,r1 ret LINK,LINK L3: neg r1,r1 lsr r0,r1 ret LINK,LINK #else E 5 load r0,r14,32 load r0,r0,0 br r0 < 0,L25!,l load r0,r14,24 loadb r0,r0,0 load r1,r14,32 load r1,r1,0 lsl r0,r1 br L26,L L25: load r0,r14,24 loadb r0,r0,0 load r1,r14,32 load r1,r1,0 neg r1,r1 lsr r0,r1 L26: D 5 ret r11,r11 E 5 I 5 ret LINK,LINK #endif E 5 ; ----------- jisha ---------- D 6 dsect data E 6 csect code D 6 align 2 E 6 I 6 align 4 E 6 global _jisha _jisha: I 6 ; MCOUNT E 6 I 5 #ifdef ARGSINREGS load r0,r0 load r1,r1 br r1<0,L4 asl r0,r1 ret LINK,LINK L4: neg r1,r1 asr r0,r1 ret LINK,LINK #else E 5 load r0,r14,32 load r0,r0,0 br r0 < 0,L27!,l load r0,r14,24 load r0,r0,0 load r1,r14,32 load r1,r1,0 asl r0,r1 br L28,L L27: load r0,r14,24 load r0,r0,0 load r1,r14,32 load r1,r1,0 neg r1,r1 asr r0,r1 L28: D 5 ret r11,r11 E 5 I 5 ret LINK,LINK #endif E 5 ; ----------- iisha --------- D 6 dsect data E 6 csect code D 6 align 2 E 6 I 6 align 4 E 6 global _iisha _iisha: I 6 ; MCOUNT E 6 I 5 #ifdef ARGSINREGS loadh r0,r0 seh r0,r0 load r1,r1 br r1<0,L5 asl r0,r1 ret LINK,LINK L5: neg r1,r1 asr r0,r1 ret LINK,LINK #else E 5 load r0,r14,32 load r0,r0,0 br r0 < 0,L29!,l load r0,r14,24 loadh r0,r0,0 seh r0,r0 load r1,r14,32 load r1,r1,0 asl r0,r1 br L30,L L29: load r0,r14,24 loadh r0,r0,0 seh r0,r0 load r1,r14,32 load r1,r1,0 neg r1,r1 asr r0,r1 L30: D 5 ret r11,r11 E 5 I 5 ret LINK,LINK #endif E 5 ;*--------- bisha ----------*/ D 6 dsect data E 6 csect code D 6 align 2 E 6 I 6 align 4 E 6 global _bisha _bisha: I 6 ; MCOUNT E 6 I 5 #ifdef ARGSINREGS loadb r0,r0 load r1,r1 br r1<0,L6 asl r0,r1 ret LINK,LINK L6: neg r1,r1 asr r0,r1 ret LINK,LINK #else E 5 load r0,r14,32 load r0,r0,0 br r0 < 0,L31!,l load r0,r14,24 loadb r0,r0,0 load r1,r14,32 load r1,r1,0 asl r0,r1 br L32,L L31: load r0,r14,24 loadb r0,r0,0 load r1,r14,32 load r1,r1,0 neg r1,r1 asr r0,r1 L32: D 5 ret r11,r11 E 5 I 5 ret LINK,LINK #endif E 5 ; ----------- jishc ---------- D 6 dsect data E 6 csect code D 6 align 2 E 6 I 6 align 4 E 6 global _jishc _jishc: I 6 ; MCOUNT E 6 I 5 #ifdef ARGSINREGS load r0,r0 load r1,r1 br r1<0,L7 csl r0,r1 ret LINK,LINK L7: laddr r1,r1,32 csl r0,r1 ret LINK,LINK #else E 5 load r0,r14,32 load r0,r0,0 br r0 < 0,L15!,l load r0,r14,24 load r0,r0,0 load r1,r14,32 load r1,r1,0 csl r0,r1 br L16,L L15: load r0,r14,24 load r0,r0,0 load r1,r14,32 load r1,r1,0 laddr r1,r1,32 csl r0,r1 L16: D 5 ret r11,r11 E 5 I 5 ret LINK,LINK #endif E 5 ; ----------- iishc --------- D 6 dsect data E 6 csect code D 6 align 2 E 6 I 6 align 4 E 6 global _iishc _iishc: I 6 ; MCOUNT E 6 I 5 #ifdef ARGSINREGS loadh r0,r0 seh r0,r0 load r1,r1 br r1<0,L17 #else E 5 load r0,r14,32 load r0,r0,0 br r0 < 0,L17!,l load r0,r14,24 loadh r0,r0,0 seh r0,r0 load r1,r14,32 load r1,r1,0 I 5 #endif E 5 csl r0,r1 move r2,r0 laddr r3,16 lsl r0,r3 lsr r0,r3 lsr r2,r3 or r0,r2 br L18,L L17: I 5 #ifndef ARGSINREGS E 5 load r0,r14,24 loadh r0,r0,0 seh r0,r0 load r1,r14,32 load r1,r1,0 I 5 #endif E 5 laddr r1,r1,32 csl r0,r1 move r2,r0 laddr r3,16 lsl r0,r3 lsr r0,r3 lsr r2,r3 or r0,r2 L18: D 5 ret r11,r11 E 5 I 5 ret LINK,LINK E 5 ;*--------- bishc ----------*/ D 6 dsect data E 6 csect code D 6 align 2 E 6 I 6 align 4 E 6 global _bishc _bishc: I 6 ; MCOUNT E 6 I 5 #ifdef ARGSINREGS loadb r0,r0 load r1,r1 br r1<0,L19 #else E 5 load r0,r14,32 load r0,r0,0 br r0 < 0,L19!,l load r0,r14,24 loadb r0,r0,0 load r1,r14,32 load r1,r1,0 I 5 #endif E 5 csl r0,r1 move r2,r0 laddr r3,24 lsl r0,r3 lsr r0,r3 laddr r3,8 lsr r2,r3 or r0,r2 lsr r2,8 or r0,r2 lsr r2,8 or r0,r2 br L20,L I 5 D 7 #ifndef ARGSINREGS E 7 E 5 L19: I 7 #ifndef ARGSINREGS E 7 D 5 E 5 load r0,r14,24 loadb r0,r0,0 load r1,r14,32 load r1,r1,0 I 5 #endif E 5 laddr r1,r1,32 csl r0,r1 move r2,r0 laddr r3,24 lsl r0,r3 lsr r0,r3 lsr r2,8 or r0,r2 lsr r2,8 or r0,r2 lsr r2,8 or r0,r2 L20: D 5 ret r11,r11 E 5 I 5 ret LINK,LINK E 5 ; ----------- jiset ---------- D 6 dsect data E 6 csect code D 6 align 2 E 6 I 6 align 4 E 6 global _jibset _jibset: I 6 ; MCOUNT E 6 I 5 #ifdef ARGSINREGS load r0,r0 #else E 5 load r0,r14,24 load r0,r0,0 load r1,r14,32 I 5 #endif E 5 load r2,r1,0 laddr r1,31 sub r1,r2 sbit r0,r1 D 5 ret r11,r11 E 5 I 5 ret LINK,LINK E 5 ; ----------- iibset --------- D 6 dsect data E 6 csect code D 6 align 2 E 6 I 6 align 4 E 6 global _iibset _iibset: I 6 ; MCOUNT E 6 D 5 E 5 I 5 #ifdef ARGSINREGS loadh r0,r0 seh r0,r0 #else E 5 load r0,r14,24 loadh r0,r0,0 seh r0,r0 load r1,r14,32 I 5 #endif E 5 load r2,r1,0 laddr r1,31 sub r1,r2 sbit r0,r1 D 5 ret r11,r11 E 5 I 5 ret LINK,LINK E 5 ;*--------- bibset ----------*/ D 6 dsect data E 6 csect code D 6 align 2 E 6 I 6 align 4 E 6 global _bibset _bibset: I 6 ; MCOUNT E 6 D 5 E 5 I 5 #ifdef ARGSINREGS loadb r0,r0 #else E 5 load r0,r14,24 loadb r0,r0,0 load r1,r14,32 I 5 #endif E 5 load r2,r1,0 laddr r1,31 sub r1,r2 sbit r0,r1 D 5 ret r11,r11 E 5 I 5 ret LINK,LINK E 5 ; ----------- jibclr ---------- D 6 dsect data E 6 csect code D 6 align 2 E 6 I 6 align 4 E 6 global _jibclr _jibclr: I 6 ; MCOUNT E 6 I 5 #ifdef ARGSINREGS load r0,r0 #else E 5 load r0,r14,24 load r0,r0,0 load r1,r14,32 I 5 #endif E 5 load r2,r1,0 laddr r1,31 sub r1,r2 cbit r0,r1 D 5 ret r11,r11 E 5 I 5 ret LINK,LINK E 5 ; ----------- iibclr --------- D 6 dsect data E 6 csect code D 6 align 2 E 6 I 6 align 4 E 6 global _iibclr _iibclr: I 6 ; MCOUNT E 6 D 5 E 5 I 5 #ifdef ARGSINREGS loadh r0,r0 seh r0,r0 #else E 5 load r0,r14,24 loadh r0,r0,0 seh r0,r0 load r1,r14,32 I 5 #endif E 5 load r2,r1,0 laddr r1,31 sub r1,r2 cbit r0,r1 D 5 ret r11,r11 E 5 I 5 ret LINK,LINK E 5 ;*--------- bibclr ----------*/ D 6 dsect data E 6 csect code D 6 align 2 E 6 I 6 align 4 E 6 global _bibclr _bibclr: I 6 ; MCOUNT E 6 D 5 E 5 I 5 #ifdef ARGSINREGS load r0,r0 #else E 5 load r0,r14,24 loadb r0,r0,0 load r1,r14,32 I 5 #endif E 5 load r2,r1,0 laddr r1,31 sub r1,r2 cbit r0,r1 D 5 ret r11,r11 E 5 I 5 ret LINK,LINK E 5 ; ----------- bjtest ---------- D 6 dsect data E 6 csect code D 6 align 2 E 6 I 6 align 4 E 6 global _bjtest _bjtest: I 6 ; MCOUNT E 6 I 5 #ifdef ARGSINREGS load r0,r0 #else E 5 load r0,r14,24 load r0,r0,0 load r1,r14,32 I 5 #endif E 5 load r2,r1,0 laddr r1,31 sub r1,r2 tbit r0,r1 D 5 ret r11,r11 E 5 I 5 ret LINK,LINK E 5 ; ----------- bitest --------- D 6 dsect data E 6 csect code D 6 align 2 E 6 I 6 align 4 E 6 global _bitest _bitest: I 6 ; MCOUNT E 6 D 5 E 5 I 5 #ifdef ARGSINREGS loadh r0,r0 seh r0,r0 #else E 5 load r0,r14,24 loadh r0,r0,0 seh r0,r0 load r1,r14,32 I 5 #endif E 5 load r2,r1,0 laddr r1,31 sub r1,r2 tbit r0,r1 D 5 ret r11,r11 E 5 I 5 ret LINK,LINK E 5 ;*--------- bbtest ----------*/ D 6 dsect data E 6 csect code D 6 align 2 E 6 I 6 align 4 E 6 global _bbtest _bbtest: I 6 ; MCOUNT E 6 D 5 E 5 I 5 #ifdef ARGSINREGS loadb r0,r0 #else E 5 load r0,r14,24 loadb r0,r0,0 load r1,r14,32 I 5 #endif E 5 load r2,r1,0 laddr r1,31 sub r1,r2 tbit r0,r1 D 5 ret r11,r11 E 5 I 5 ret LINK,LINK E 5 ; -----------jibchng ---------- D 6 dsect data E 6 csect code D 6 align 2 E 6 I 6 align 4 E 6 global _jibchng _jibchng: I 6 ; MCOUNT E 6 I 5 #ifndef ARGSINREGS E 5 load r0,r14,24 I 5 #endif E 5 load r0,r0,0 move r2,r0 I 5 #ifndef ARGSINREGS E 5 load r1,r14,32 I 5 #endif E 5 load r3,r1,0 laddr r1,31 sub r1,r3 tbit r0,r1 br r0 < 1,L40!,l move r0,r2 cbit r0,r1 br L41,L L40: move r0,r2 sbit r0,r1 L41: D 5 ret r11,r11 E 5 I 5 ret LINK,LINK E 5 ; ----------- iibchng --------- D 6 dsect data E 6 csect code D 6 align 2 E 6 I 6 align 4 E 6 global _iibchng _iibchng: I 6 ; MCOUNT E 6 D 5 E 5 I 5 #ifndef ARGSINREGS E 5 load r0,r14,24 I 5 #endif E 5 loadh r0,r0,0 seh r0,r0 move r2,r0 I 5 #ifndef ARGSINREGS E 5 load r1,r14,32 I 5 #endif E 5 load r3,r1,0 laddr r1,31 sub r1,r3 tbit r0,r1 br r0 < 1,L42!,l move r0,r2 cbit r0,r1 br L43,L L42: move r0,r2 sbit r0,r1 L43: D 5 ret r11,r11 E 5 I 5 ret LINK,LINK E 5 ;*--------- bibchng ----------*/ D 6 dsect data E 6 csect code D 6 align 2 E 6 I 6 align 4 E 6 global _bibchng _bibchng: I 6 ; MCOUNT E 6 D 5 E 5 I 5 #ifndef ARGSINREGS E 5 load r0,r14,24 I 5 #endif E 5 loadb r0,r0,0 move r2,r0 I 5 #ifndef ARGSINREGS E 5 load r1,r14,32 I 5 #endif E 5 load r3,r1,0 laddr r1,31 sub r1,r3 tbit r0,r1 br r0 < 1,L44!,l move r0,r2 cbit r0,r1 br L45,L L44: move r0,r2 sbit r0,r1 L45: D 5 ret r11,r11 E 5 I 5 ret LINK,LINK E 5 E 1 h07420 s 00006/00007/00689 d D 4.3 87/04/16 16:23:46 build 6 5 c Profiling changes e s 00036/00006/00660 d D 4.2 87/02/17 08:43:13 mth 5 4 c Parateters in registers. e s 00000/00000/00666 d D 4.1 87/02/17 08:27:17 mth 4 3 c rolled rev to -r4 (mth) e s 00000/00000/00666 d D 3.1 87/01/21 16:54:13 mkm 3 2 c e s 00000/00000/00666 d D 2.1 87/01/21 16:50:14 mkm 2 1 c e s 00666/00000/00000 d D 1.1 87/01/21 16:46:24 mkm 1 0 c Placed under source control - mkm c These files are direct descendants of the ROS files c by the same name at or about ROS rev 5.2 e u U f b f n t T I 1 ; "%W% %E%" ; ;#include "bit.h" ; ;/* Extract a subfield of len bits from m starting with bit position i ; * and extending left for len bits. The right most bit is bit 0. ;*/ ; ;short bext_h(m,i,len) ;short *m; ;long *i, *len; ;{ ; if ( (*i + *len > NBSI) || (*i < 0) || (*len < 0) || ; (*i >= NBSI) || (*len > NBSI) ) return(*m); ; return((*m & F77mask[*i + *len]) >> *i); ;} D 6 dsect data E 6 csect code align 2 global _bext_h _bext_h: I 6 ; MCOUNT E 6 I 5 #ifdef ARGSINREGS store r0,r14,24 store r1,r14,32 store r2,r14,40 #endif E 5 load r0,r14,32 load r0,r0,0 load r1,r14,40 load r1,r1,0 add r0,r1 laddr r1,16 br r0 > r1,L9999,l load r0,r14,32 load r0,r0,0 br r0 < 0,L9999,l load r0,r14,40 load r0,r0,0 br r0 < 0,L9999,l load r0,r14,32 load r0,r0,0 laddr r1,16 br r0 >= r1,L9999,l load r0,r14,40 load r0,r0,0 laddr r1,16 br r0 <= r1,L17!,l L9999: load r0,r14,24 loadh r0,r0,0 seh r0,r0 br L14,L L17: load r0,r14,24 loadh r0,r0,0 seh r0,r0 load r1,r14,32 load r1,r1,0 load r2,r14,40 load r2,r2,0 add r1,r2 lsli r1,2 load r1,r1,_F77mask,L and r0,r1 load r1,r14,32 load r1,r1,0 asr r0,r1 laddr r1,0ffffh,l and r1,r0 seh r1,r1 move r0,r1 L14: D 5 ret r11,r11 E 5 I 5 ret LINK,LINK E 5 ; ; ; ;#include "bit.h" ; ;/* Extract a subfield of len bits from m starting with bit position i ; * and extending left for len bits. The right most bit is bit 0. ;*/ ; ;long bext_l(m,i,len) ;long *m, *i, *len; ;{ ; if ( (*i + *len > NBLI) || (*i < 0) || (*len < 0) || ; (*i >= NBLI) || (*len > NBLI) ) return(*m); ; return((*m & F77mask[*i + *len]) >> *i); ;} D 6 dsect data E 6 csect code align 2 global _bext_l _bext_l: I 6 ; MCOUNT E 6 I 5 #ifdef ARGSINREGS store r0,r14,24 store r1,r14,32 store r2,r14,40 #endif E 5 load r0,r14,32 load r0,r0,0 load r1,r14,40 load r1,r1,0 add r0,r1 laddr r1,32 br r0 > r1,L99,l load r0,r14,32 load r0,r0,0 br r0 < 0,L99,l load r0,r14,40 load r0,r0,0 br r0 < 0,L99,l load r0,r14,32 load r0,r0,0 laddr r1,32 br r0 >= r1,L99,l load r0,r14,40 load r0,r0,0 laddr r1,32 br r0 <= r1,L34!,l L99: load r0,r14,24 load r0,r0,0 br L35,L L34: load r0,r14,24 load r0,r0,0 load r1,r14,32 load r1,r1,0 load r2,r14,40 load r2,r2,0 add r1,r2 lsli r1,2 load r1,r1,_F77mask,L and r0,r1 load r1,r14,32 load r1,r1,0 asr r0,r1 L35: D 5 ret r11,r11 E 5 I 5 ret LINK,LINK E 5 ; ; D 6 dsect data E 6 csect code align 2 global _bext_b _bext_b: I 6 ; MCOUNT E 6 I 5 #ifdef ARGSINREGS store r0,r14,24 store r1,r14,32 store r2,r14,40 #endif E 5 load r0,r14,32 load r0,r0,0 load r1,r14,40 load r1,r1,0 add r0,r1 laddr r1,8 br r0 > r1,L70,l load r0,r14,32 load r0,r0,0 br r0 < 0,L70,l load r0,r14,40 load r0,r0,0 br r0 < 0,L70,l load r0,r14,32 load r0,r0,0 laddr r1,8 br r0 >= r1,L70,l load r0,r14,40 load r0,r0,0 laddr r1,8 br r0 <= r1,L69!,l L70: load r0,r14,24 loadb r0,r0,0 seb r0,r0 br L67,L L69: load r0,r14,24 loadb r0,r0,0 seb r0,r0 load r1,r14,32 load r1,r1,0 load r2,r14,40 load r2,r2,0 add r1,r2 lsli r1,2 load r1,r1,_F77mask,L and r0,r1 load r1,r14,32 load r1,r1,0 asr r0,r1 laddr r1,000ffh,l and r1,r0 seb r1,r1 move r0,r1 L67: D 5 ret r11,r11 E 5 I 5 ret LINK,LINK E 5 ; ; ;/* mask[k] asserts right most k bits of a long. When used as a mask ; * (i.e. A & mask[k]) the bits to the left of the k bits are cleared. ; */ ; ;long F77mask[33] = { ; 0x0, ; 0x1, 0x3, 0x7, 0xf, ; 0x1f, 0x3f, 0x7f, 0xff, ; 0x1ff, 0x3ff, 0x7ff, 0xfff, ; 0x1fff, 0x3fff, 0x7fff, 0xffff, ; 0x1ffff, 0x3ffff, 0x7ffff, 0xfffff, ; 0x1fffff, 0x3fffff, 0x7fffff, 0xffffff, ; 0x1ffffff, 0x3ffffff, 0x7ffffff, 0xfffffff, ; 0x1fffffff, 0x3fffffff, 0x7fffffff, 0xffffffff ; }; ; ;/* zmask[k] asserts k+1 right most bits. */ ; ;long *F77zmask = &F77mask[1]; dsect data D 6 dsect data E 6 align 4 global _F77mask _F77mask: word 0 word 1 word 3 word 7 word 15 word 31 word 63 word 127 word 255 word 511 word 1023 word 2047 word 4095 word 8191 word 16383 word 32767 word 65535 word 131071 word 262143 word 524287 word 1048575 word 2097151 word 4194303 word 8388607 word 16777215 word 33554431 word 67108863 word 134217727 word 268435455 word 536870911 word 1073741823 word 2147483647 word -1 dsect data align 4 global _F77zmask _F77zmask: word _F77mask+4 ;#include "bit.h" ; ;/* Circular shift - The rightmost ic bits are shifted circularly k-places. ; * k > 0 => left shift. ; * k < 0 => right shift. ; * k = 0 => no shift. ; * left shift right shift ; * [ b1 | k2 | d ] [ b1 | d | k2 ] ; */ ; ;short shftc_h(m,k,ic) ;short *m; ;long *k, *ic; ;{ ; short b1, b2, b3, left; ; long k2,d; ; ; left = (*k > 0); ; k2 = left ? *k : -*k; ; if (k2 == 0 || k2 > NBSI || k2 > *ic || *ic < 1 || *ic > NBSI) ; return(*m); ; d = (*ic - k2); ; b1 = *m & ~F77mask[*ic]; /* mask off left most bits */ ; ; if (left) { ; b2 = (*m & F77mask[d]) << k2; /* get k2 bits */ ; b3 = (*m & F77mask[*ic]) >> d; /* get d bits */ ; } ; else { ; b2 = (*m & F77mask[k2]) << d; /* get k2 bits */ ; b3 = (*m & F77mask[*ic]) >> k2; /* get d bits */ ; } ; return( b1 | b2 | b3 ); ;} D 6 dsect data E 6 csect code align 2 global _shftc_h _shftc_h: I 6 ; MCOUNT E 6 I 5 #ifdef ARGSINREGS store r0,r14,24 store r1,r14,32 store r2,r14,40 #endif E 5 load r0,r14,32 load r0,r0,0 test r0 > 0 storeh r0,r14,-40 loadh r0,r14,-40 seh r0,r0 br r0=0,L999,L load r0,r14,32 load r0,r0,0 br L9998,L L999: load r0,r14,32 load r0,r0,0 neg r0,r0 L9998: store r0,r14,-44 load r0,r14,-44 br r0 = 0,L9997,l load r0,r14,-44 laddr r1,16 br r0 > r1,L9997,l load r0,r14,-44 load r1,r14,40 load r1,r1,0 br r0 > r1,L9997,l load r0,r14,40 load r0,r0,0 br r0 < 1,L9997,l load r0,r14,40 load r0,r0,0 laddr r1,16 br r0 <= r1,L20!,l L9997: load r0,r14,24 loadh r0,r0,0 seh r0,r0 br L23,L L20: load r0,r14,40 load r0,r0,0 load r1,r14,-44 sub r0,r1 store r0,r14,-48 load r0,r14,24 loadh r0,r0,0 seh r0,r0 load r1,r14,40 load r1,r1,0 lsli r1,2 load r1,r1,_F77mask,L not r1,r1 and r0,r1 storeh r0,r14,-34 loadh r0,r14,-40 seh r0,r0 br r0=0,L21,L load r0,r14,24 loadh r0,r0,0 seh r0,r0 load r1,r14,-48 lsli r1,2 load r1,r1,_F77mask,L and r0,r1 load r1,r14,-44 lsl r0,r1 storeh r0,r14,-36 load r0,r14,24 loadh r0,r0,0 seh r0,r0 load r1,r14,40 load r1,r1,0 lsli r1,2 load r1,r1,_F77mask,L and r0,r1 load r1,r14,-48 asr r0,r1 storeh r0,r14,-38 br L22,L L21: load r0,r14,24 loadh r0,r0,0 seh r0,r0 load r1,r14,-44 lsli r1,2 load r1,r1,_F77mask,L and r0,r1 load r1,r14,-48 lsl r0,r1 storeh r0,r14,-36 load r0,r14,24 loadh r0,r0,0 seh r0,r0 load r1,r14,40 load r1,r1,0 lsli r1,2 load r1,r1,_F77mask,L and r0,r1 load r1,r14,-44 asr r0,r1 storeh r0,r14,-38 L22: loadh r0,r14,-34 seh r0,r0 loadh r1,r14,-36 seh r1,r1 or r0,r1 loadh r1,r14,-38 seh r1,r1 or r0,r1 laddr r1,0ffffh,l and r1,r0 seh r1,r1 move r0,r1 L23: D 5 ret r11,r11 E 5 I 5 ret LINK,LINK E 5 ; ; ;#include "bit.h" ; ;/* Circular shift - The right most ic bits are shifted circularly k-places. ; * k > 0 => left shift. ; * k < 0 => right shift. ; * k = 0 => no shift. ; * left shift right shift ; * [ b1 | k2 | d ] [ b1 | d | k2 ] ; */ ; ;long shftc_l(m,k,ic) ;long *m, *k, *ic; ;{ ; long b1, b2, b3, k2, d; ; short left; ; ; left = (*k > 0); ; k2 = left ? *k : -*k; ; if (k2 == 0 || k2 > NBLI || k2 > *ic || *ic < 1 || *ic > NBLI) ; return(*m); ; d = (*ic - k2); ; b1 = *m & ~F77mask[*ic]; /* mask off left most bits */ ; ; if (left) { ; b2 = (*m & F77mask[d]) << k2; /* get k2 bits */ ; b3 = (*m & F77mask[*ic]) >> d; /* get d bits */ ; } ; else { ; b2 = (*m & F77mask[k2]) << d; /* get k2 bits */ ; b3 = (*m & F77mask[*ic]) >> k2; /* get d bits */ ; } ; return( b1 | b2 | b3 ); ;} D 6 dsect data E 6 csect code align 2 global _shftc_l _shftc_l: I 6 ; MCOUNT E 6 I 5 #ifdef ARGSINREGS store r0,r14,24 store r1,r14,32 store r2,r14,40 #endif E 5 load r0,r14,32 load r0,r0,0 test r0 > 0 storeh r0,r14,-54 loadh r0,r14,-54 seh r0,r0 br r0=0,L8888,L load r0,r14,32 load r0,r0,0 br L8887,L L8888: load r0,r14,32 load r0,r0,0 neg r0,r0 L8887: store r0,r14,-48 load r0,r14,-48 br r0 = 0,L8886,l load r0,r14,-48 laddr r1,32 br r0 > r1,L8886,l load r0,r14,-48 load r1,r14,40 load r1,r1,0 br r0 > r1,L8886,l load r0,r14,40 load r0,r0,0 br r0 < 1,L8886,l load r0,r14,40 load r0,r0,0 laddr r1,32 br r0 <= r1,L33!,l L8886: load r0,r14,24 load r0,r0,0 br L24,L L33: load r0,r14,40 load r0,r0,0 load r1,r14,-48 sub r0,r1 store r0,r14,-52 load r0,r14,24 load r0,r0,0 load r1,r14,40 load r1,r1,0 lsli r1,2 load r1,r1,_F77mask,L not r1,r1 and r0,r1 store r0,r14,-36 loadh r0,r14,-54 seh r0,r0 br r0=0,L18,L load r0,r14,24 load r0,r0,0 load r1,r14,-52 lsli r1,2 load r1,r1,_F77mask,L and r0,r1 load r1,r14,-48 lsl r0,r1 store r0,r14,-40 load r0,r14,24 load r0,r0,0 load r1,r14,40 load r1,r1,0 lsli r1,2 load r1,r1,_F77mask,L and r0,r1 load r1,r14,-52 asr r0,r1 store r0,r14,-44 br L19,L L18: load r0,r14,24 load r0,r0,0 load r1,r14,-48 lsli r1,2 load r1,r1,_F77mask,L and r0,r1 load r1,r14,-52 lsl r0,r1 store r0,r14,-40 load r0,r14,24 load r0,r0,0 load r1,r14,40 load r1,r1,0 lsli r1,2 load r1,r1,_F77mask,L and r0,r1 load r1,r14,-48 asr r0,r1 store r0,r14,-44 L19: load r0,r14,-36 load r1,r14,-40 or r0,r1 load r1,r14,-44 or r0,r1 L24: D 5 ret r11,r11 E 5 I 5 ret LINK,LINK E 5 ; ; D 6 dsect data E 6 csect code align 2 global _shftc_b _shftc_b: I 6 ; MCOUNT E 6 I 5 #ifdef ARGSINREGS store r0,r14,24 store r1,r14,32 store r2,r14,40 #endif E 5 load r0,r14,32 load r0,r0,0 test r0 > 0 storeh r0,r14,-40 loadh r0,r14,-40 seh r0,r0 br r0=0,L58,L load r0,r14,32 load r0,r0,0 br L57,L L58: load r0,r14,32 load r0,r0,0 neg r0,r0 L57: store r0,r14,-44 load r0,r14,-44 br r0 = 0,L56,l load r0,r14,-44 laddr r1,8 br r0 > r1,L56,l load r0,r14,-44 load r1,r14,40 load r1,r1,0 br r0 > r1,L56,l load r0,r14,40 load r0,r0,0 br r0 < 1,L56,l load r0,r14,40 load r0,r0,0 laddr r1,8 br r0 <= r1,L55!,l L56: load r0,r14,24 loadb r0,r0,0 seb r0,r0 br L52,L L55: load r0,r14,40 load r0,r0,0 load r1,r14,-44 sub r0,r1 store r0,r14,-48 load r0,r14,24 loadb r0,r0,0 seb r0,r0 load r1,r14,40 load r1,r1,0 lsli r1,2 load r1,r1,_F77mask,L not r1,r1 and r0,r1 storeb r0,r14,-34 loadh r0,r14,-40 seh r0,r0 br r0=0,L54,L load r0,r14,24 loadb r0,r0,0 seb r0,r0 load r1,r14,-48 lsli r1,2 load r1,r1,_F77mask,L and r0,r1 load r1,r14,-44 lsl r0,r1 storeb r0,r14,-36 load r0,r14,24 loadb r0,r0,0 seb r0,r0 load r1,r14,40 load r1,r1,0 lsli r1,2 load r1,r1,_F77mask,L and r0,r1 load r1,r14,-48 asr r0,r1 storeb r0,r14,-38 br L53,L L54: load r0,r14,24 loadb r0,r0,0 seb r0,r0 load r1,r14,-44 lsli r1,2 load r1,r1,_F77mask,L and r0,r1 load r1,r14,-48 lsl r0,r1 storeb r0,r14,-36 load r0,r14,24 loadb r0,r0,0 seb r0,r0 load r1,r14,40 load r1,r1,0 lsli r1,2 load r1,r1,_F77mask,L and r0,r1 load r1,r14,-44 asr r0,r1 storeb r0,r14,-38 L53: loadb r0,r14,-34 seb r0,r0 loadb r1,r14,-36 seb r1,r1 or r0,r1 loadb r1,r14,-38 seb r1,r1 or r0,r1 laddr r1,000ffh,l and r1,r0 seb r1,r1 move r0,r1 L52: D 5 ret r11,r11 E 5 I 5 ret LINK,LINK E 5 E 1 h44979 s 00001/00001/00009 d D 4.2 87/05/13 17:28:30 build 5 4 c removed old SCCS strings and inserted #ident BB e s 00000/00000/00010 d D 4.1 87/02/17 08:27:19 mth 4 3 c rolled rev to -r4 (mth) e s 00000/00000/00010 d D 3.1 87/01/21 16:54:15 mkm 3 2 c e s 00000/00000/00010 d D 2.1 87/01/21 16:50:18 mkm 2 1 c e s 00010/00000/00000 d D 1.1 87/01/21 16:46:24 mkm 1 0 c Placed under source control - mkm c These files are direct descendants of the ROS files c by the same name at or about ROS rev 5.2 e u U f b f n t T I 1 D 5 /* "%W% %E%" */ E 5 I 5 #ident " %W% %E% " E 5 #include "complex" float c_abs(z) complex *z; { double cabs(); return( cabs( z->real, z->imag ) ); } E 1 h49995 s 00001/00001/00010 d D 4.2 87/05/13 17:28:41 build 5 4 c removed old SCCS strings and inserted #ident BB e s 00000/00000/00011 d D 4.1 87/02/17 08:27:21 mth 4 3 c rolled rev to -r4 (mth) e s 00000/00000/00011 d D 3.1 87/01/21 16:54:16 mkm 3 2 c e s 00000/00000/00011 d D 2.1 87/01/21 16:50:19 mkm 2 1 c e s 00011/00000/00000 d D 1.1 87/01/21 16:46:25 mkm 1 0 c Placed under source control - mkm c These files are direct descendants of the ROS files c by the same name at or about ROS rev 5.2 e u U f b f n t T I 1 D 5 /* "%W% %E%" */ E 5 I 5 #ident " %W% %E% " E 5 #include "complex" c_cos(r, z) complex *r, *z; { double sin(), cos(), sinh(), cosh(); r->real = cos(z->real) * cosh(z->imag); r->imag = - sin(z->real) * sinh(z->imag); } E 1 h24759 s 00001/00001/00033 d D 4.2 87/05/13 17:28:56 build 5 4 c removed old SCCS strings and inserted #ident BB e s 00000/00000/00034 d D 4.1 87/02/17 08:27:23 mth 4 3 c rolled rev to -r4 (mth) e s 00000/00000/00034 d D 3.1 87/01/21 16:54:17 mkm 3 2 c e s 00000/00000/00034 d D 2.1 87/01/21 16:50:20 mkm 2 1 c e s 00034/00000/00000 d D 1.1 87/01/21 16:46:26 mkm 1 0 c Placed under source control - mkm c These files are direct descendants of the ROS files c by the same name at or about ROS rev 5.2 e u U f b f n t T I 1 D 5 /* "%W% %E%" */ E 5 I 5 #ident " %W% %E% " E 5 #include #define abort() {fprintf(stderr,"abort: complex division by zero\n"); exit(1);} struct complex { float real, imag; }; c_div(c, a, b) struct complex *a, *b, *c; { double ratio, den; double abr, abi; if( (abr = b->real) < 0.) abr = - abr; if( (abi = b->imag) < 0.) abi = - abi; if( abr <= abi ) { if(abi == 0) abort(); /* fatal("complex division by zero"); */ ratio = b->real / b->imag ; den = b->imag * (1 + ratio*ratio); c->real = (a->real*ratio + a->imag) / den; c->imag = (a->imag*ratio - a->real) / den; } else { ratio = b->imag / b->real ; den = b->real * (1 + ratio*ratio); c->real = (a->real + a->imag*ratio) / den; c->imag = (a->imag - a->real*ratio) / den; } } E 1 h50748 s 00001/00001/00013 d D 4.2 87/05/13 17:29:06 build 5 4 c removed old SCCS strings and inserted #ident BB e s 00000/00000/00014 d D 4.1 87/02/17 08:27:25 mth 4 3 c rolled rev to -r4 (mth) e s 00000/00000/00014 d D 3.1 87/01/21 16:54:18 mkm 3 2 c e s 00000/00000/00014 d D 2.1 87/01/21 16:50:21 mkm 2 1 c e s 00014/00000/00000 d D 1.1 87/01/21 16:46:26 mkm 1 0 c Placed under source control - mkm c These files are direct descendants of the ROS files c by the same name at or about ROS rev 5.2 e u U f b f n t T I 1 D 5 /* "%W% %E%" */ E 5 I 5 #ident " %W% %E% " E 5 #include "complex" c_exp(r, z) complex *r, *z; { double expx; double exp(), cos(), sin(); expx = exp(z->real); r->real = expx * cos(z->imag); r->imag = expx * sin(z->imag); } E 1 h49056 s 00001/00001/00010 d D 4.2 87/05/13 17:29:17 build 5 4 c removed old SCCS strings and inserted #ident BB e s 00000/00000/00011 d D 4.1 87/02/17 08:27:26 mth 4 3 c rolled rev to -r4 (mth) e s 00000/00000/00011 d D 3.1 87/01/21 16:54:19 mkm 3 2 c e s 00000/00000/00011 d D 2.1 87/01/21 16:50:23 mkm 2 1 c e s 00011/00000/00000 d D 1.1 87/01/21 16:46:27 mkm 1 0 c Placed under source control - mkm c These files are direct descendants of the ROS files c by the same name at or about ROS rev 5.2 e u U f b f n t T I 1 D 5 /* "%W% %E%" */ E 5 I 5 #ident " %W% %E% " E 5 #include "complex" c_log(r, z) complex *r, *z; { double log(), cabs(), atan2(); r->imag = atan2(z->imag, z->real); r->real = log( cabs(z->real, z->imag) ); } E 1 h49928 s 00001/00001/00010 d D 4.2 87/05/13 17:29:27 build 5 4 c removed old SCCS strings and inserted #ident BB e s 00000/00000/00011 d D 4.1 87/02/17 08:27:28 mth 4 3 c rolled rev to -r4 (mth) e s 00000/00000/00011 d D 3.1 87/01/21 16:54:20 mkm 3 2 c e s 00000/00000/00011 d D 2.1 87/01/21 16:50:24 mkm 2 1 c e s 00011/00000/00000 d D 1.1 87/01/21 16:46:27 mkm 1 0 c Placed under source control - mkm c These files are direct descendants of the ROS files c by the same name at or about ROS rev 5.2 e u U f b f n t T I 1 D 5 /* "%W% %E%" */ E 5 I 5 #ident " %W% %E% " E 5 #include "complex" c_sin(r, z) complex *r, *z; { double sin(), cos(), sinh(), cosh(); r->real = sin(z->real) * cosh(z->imag); r->imag = cos(z->real) * sinh(z->imag); } E 1 h63523 s 00001/00001/00023 d D 4.2 87/05/13 17:29:42 build 5 4 c removed old SCCS strings and inserted #ident BB e s 00000/00000/00024 d D 4.1 87/02/17 08:27:30 mth 4 3 c rolled rev to -r4 (mth) e s 00000/00000/00024 d D 3.1 87/01/21 16:54:20 mkm 3 2 c e s 00000/00000/00024 d D 2.1 87/01/21 16:50:25 mkm 2 1 c e s 00024/00000/00000 d D 1.1 87/01/21 16:46:28 mkm 1 0 c Placed under source control - mkm c These files are direct descendants of the ROS files c by the same name at or about ROS rev 5.2 e u U f b f n t T I 1 D 5 /* "%W% %E%" */ E 5 I 5 #ident " %W% %E% " E 5 #include "complex" c_sqrt(r, z) complex *r, *z; { double mag, sqrt(), cabs(); if( (mag = cabs(z->real, z->imag)) == 0.) r->real = r->imag = 0.; else if(z->real > 0) { r->real = sqrt(0.5 * (mag + z->real) ); r->imag = z->imag / r->real / 2; } else { r->imag = sqrt(0.5 * (mag - z->real) ); if(z->imag < 0) r->imag = - r->imag; r->real = z->imag / r->imag /2; } } E 1 h61017 s 00001/00001/00022 d D 4.2 87/05/13 17:29:58 build 5 4 c removed old SCCS strings and inserted #ident BB e s 00000/00000/00023 d D 4.1 87/02/17 08:27:32 mth 4 3 c rolled rev to -r4 (mth) e s 00000/00000/00023 d D 3.1 87/01/21 16:54:21 mkm 3 2 c e s 00000/00000/00023 d D 2.1 87/01/21 16:50:26 mkm 2 1 c e s 00023/00000/00000 d D 1.1 87/01/21 16:46:28 mkm 1 0 c Placed under source control - mkm c These files are direct descendants of the ROS files c by the same name at or about ROS rev 5.2 e u U f b f n t T I 1 D 5 /* "%W% %E%" */ E 5 I 5 #ident " %W% %E% " E 5 double cabs(real, imag) double real, imag; { double temp, sqrt(); if(real < 0) real = -real; if(imag < 0) imag = -imag; if(imag > real){ temp = real; real = imag; imag = temp; } if((real+imag) == real) return(real); temp = imag/real; temp = real*sqrt(1.0 + temp*temp); /*overflow!!*/ return(temp); } E 1 h36305 s 00000/00000/00003 d D 4.1 87/02/17 08:27:33 mth 4 3 c rolled rev to -r4 (mth) e s 00000/00000/00003 d D 3.1 87/01/21 16:54:22 mkm 3 2 c e s 00000/00000/00003 d D 2.1 87/01/21 16:50:28 mkm 2 1 c e s 00003/00000/00000 d D 1.1 87/01/21 16:46:29 mkm 1 0 c Placed under source control - mkm c These files are direct descendants of the ROS files c by the same name at or about ROS rev 5.2 e u U f b f n t T I 1 /* "%W% %E%" */ typedef struct { float real, imag; } complex; typedef struct { double dreal, dimag; } dcomplex; E 1 h52777 s 00002/00000/00012 d D 4.3 87/04/16 16:23:50 build 6 5 c Profiling changes e s 00003/00001/00009 d D 4.2 87/02/17 08:43:17 mth 5 4 c Parateters in registers. e s 00000/00000/00010 d D 4.1 87/02/17 08:27:35 mth 4 3 c rolled rev to -r4 (mth) e s 00000/00000/00010 d D 3.1 87/01/21 16:54:23 mkm 3 2 c e s 00000/00000/00010 d D 2.1 87/01/21 16:50:29 mkm 2 1 c e s 00010/00000/00000 d D 1.1 87/01/21 16:46:29 mkm 1 0 c Placed under source control - mkm c These files are direct descendants of the ROS files c by the same name at or about ROS rev 5.2 e u U f b f n t T I 1 ; "%W% %E%" global _d_abs global _D_abs _d_abs: I 6 ; MCOUNT E 6 I 5 #ifndef ARGSINREGS E 5 load r0,r14,24 I 5 #endif E 5 loadd r0,r0,0 _D_abs: I 6 ; MCOUNT E 6 laddr r2,7FFFFFFFh,L and r0,r2 D 5 ret r11,r11 E 5 I 5 ret LINK,LINK E 5 E 1 h42166 s 00001/00001/00006 d D 4.2 87/05/13 17:30:08 build 5 4 c removed old SCCS strings and inserted #ident BB e s 00000/00000/00007 d D 4.1 87/02/17 08:27:37 mth 4 3 c rolled rev to -r4 (mth) e s 00000/00000/00007 d D 3.1 87/01/21 16:54:24 mkm 3 2 c e s 00000/00000/00007 d D 2.1 87/01/21 16:50:31 mkm 2 1 c e s 00007/00000/00000 d D 1.1 87/01/21 16:46:30 mkm 1 0 c Placed under source control - mkm c These files are direct descendants of the ROS files c by the same name at or about ROS rev 5.2 e u U f b f n t T I 1 D 5 /* "%W% %E%" */ E 5 I 5 #ident " %W% %E% " E 5 double d_acos(x) double *x; { double acos(); return( acos(*x) ); } E 1 h44457 s 00001/00001/00008 d D 4.2 87/05/13 17:30:17 build 5 4 c removed old SCCS strings and inserted #ident BB e s 00000/00000/00009 d D 4.1 87/02/17 08:27:38 mth 4 3 c rolled rev to -r4 (mth) e s 00000/00000/00009 d D 3.1 87/01/21 16:54:25 mkm 3 2 c e s 00000/00000/00009 d D 2.1 87/01/21 16:50:32 mkm 2 1 c e s 00009/00000/00000 d D 1.1 87/01/21 16:46:30 mkm 1 0 c Placed under source control - mkm c These files are direct descendants of the ROS files c by the same name at or about ROS rev 5.2 e u U f b f n t T I 1 D 5 /* "%W% %E%" */ E 5 I 5 #ident " %W% %E% " E 5 #include "complex" d_cnjg(r, z) dcomplex *r, *z; { r->dreal = z->dreal; r->dimag = - z->dimag; } E 1 h41520 s 00001/00001/00005 d D 4.2 87/05/13 17:30:28 build 5 4 c removed old SCCS strings and inserted #ident BB e s 00000/00000/00006 d D 4.1 87/02/17 08:27:40 mth 4 3 c rolled rev to -r4 (mth) e s 00000/00000/00006 d D 3.1 87/01/21 16:54:26 mkm 3 2 c e s 00000/00000/00006 d D 2.1 87/01/21 16:50:33 mkm 2 1 c e s 00006/00000/00000 d D 1.1 87/01/21 16:46:31 mkm 1 0 c Placed under source control - mkm c These files are direct descendants of the ROS files c by the same name at or about ROS rev 5.2 e u U f b f n t T I 1 D 5 /* "%W% %E%" */ E 5 I 5 #ident " %W% %E% " E 5 double d_dim(a,b) double *a, *b; { return( *a > *b ? *a - *b : 0); } E 1 h42830 s 00001/00001/00007 d D 4.2 87/05/13 17:30:39 build 5 4 c removed old SCCS strings and inserted #ident BB e s 00000/00000/00008 d D 4.1 87/02/17 08:27:42 mth 4 3 c rolled rev to -r4 (mth) e s 00000/00000/00008 d D 3.1 87/01/21 16:54:27 mkm 3 2 c e s 00000/00000/00008 d D 2.1 87/01/21 16:50:34 mkm 2 1 c e s 00008/00000/00000 d D 1.1 87/01/21 16:46:32 mkm 1 0 c Placed under source control - mkm c These files are direct descendants of the ROS files c by the same name at or about ROS rev 5.2 e u U f b f n t T I 1 D 5 /* "%W% %E%" */ E 5 I 5 #ident " %W% %E% " E 5 #include "complex" double d_imag(z) dcomplex *z; { return(z->dimag); } E 1 h43864 s 00001/00001/00007 d D 4.2 87/05/13 17:30:48 build 5 4 c removed old SCCS strings and inserted #ident BB e s 00000/00000/00008 d D 4.1 87/02/17 08:27:44 mth 4 3 c rolled rev to -r4 (mth) e s 00000/00000/00008 d D 3.1 87/01/21 16:54:28 mkm 3 2 c e s 00000/00000/00008 d D 2.1 87/01/21 16:50:36 mkm 2 1 c e s 00008/00000/00000 d D 1.1 87/01/21 16:46:32 mkm 1 0 c Placed under source control - mkm c These files are direct descendants of the ROS files c by the same name at or about ROS rev 5.2 e u U f b f n t T I 1 D 5 /* "%W% %E%" */ E 5 I 5 #ident " %W% %E% " E 5 double d_int(x) double *x; { double floor(); return( (*x>0) ? floor(*x) : -floor(- *x) ); } E 1 h05235 s 00001/00001/00025 d D 4.2 87/05/13 17:31:04 build 5 4 c removed old SCCS strings and inserted #ident BB e s 00000/00000/00026 d D 4.1 87/02/17 08:27:45 mth 4 3 c rolled rev to -r4 (mth) e s 00000/00000/00026 d D 3.1 87/01/21 16:54:28 mkm 3 2 c e s 00000/00000/00026 d D 2.1 87/01/21 16:50:37 mkm 2 1 c e s 00026/00000/00000 d D 1.1 87/01/21 16:46:33 mkm 1 0 c Placed under source control - mkm c These files are direct descendants of the ROS files c by the same name at or about ROS rev 5.2 e u U f b f n t T I 1 D 5 /* "%W% %E%" */ E 5 I 5 #ident " %W% %E% " E 5 double d_mod(x,y) double *x, *y; { double floor(), quotient; if( (quotient = *x / *y) >= 0) quotient = floor(quotient); else quotient = -floor(-quotient); return(*x - (*y) * quotient ); } /* * Same as d_mod, but called by value */ double D_mod(x,y) double x, y; { double floor(), quotient; if( (quotient = x / y) >= 0) quotient = floor(quotient); else quotient = -floor(-quotient); return(x - y * quotient ); } E 1 h57628 s 00001/00001/00009 d D 4.3 87/05/13 17:31:14 build 6 5 c removed old SCCS strings and inserted #ident BB e s 00003/00002/00007 d D 4.2 87/02/17 08:43:27 mth 5 4 c Parateters in registers. e s 00000/00000/00009 d D 4.1 87/02/17 08:27:47 mth 4 3 c rolled rev to -r4 (mth) e s 00000/00000/00009 d D 3.1 87/01/21 16:54:29 mkm 3 2 c e s 00000/00000/00009 d D 2.1 87/01/21 16:50:39 mkm 2 1 c e s 00009/00000/00000 d D 1.1 87/01/21 16:46:33 mkm 1 0 c Placed under source control - mkm c These files are direct descendants of the ROS files c by the same name at or about ROS rev 5.2 e u U f b f n t T I 1 D 6 /* "%W% %E%" */ E 6 I 6 #ident " %W% %E% " E 6 double d_nint(x) double *x; { double floor(); I 5 register double tmpx = *x; E 5 D 5 return( (*x)>=0 ? floor(*x + .5) : -floor(.5 - *x) ); E 5 I 5 return( (tmpx)>=0 ? floor(tmpx + .5) : -floor(.5 - tmpx) ); E 5 } E 1 h41171 s 00001/00001/00005 d D 4.2 87/05/13 17:31:24 build 5 4 c removed old SCCS strings and inserted #ident BB e s 00000/00000/00006 d D 4.1 87/02/17 08:27:49 mth 4 3 c rolled rev to -r4 (mth) e s 00000/00000/00006 d D 3.1 87/01/21 16:54:30 mkm 3 2 c e s 00000/00000/00006 d D 2.1 87/01/21 16:50:40 mkm 2 1 c e s 00006/00000/00000 d D 1.1 87/01/21 16:46:34 mkm 1 0 c Placed under source control - mkm c These files are direct descendants of the ROS files c by the same name at or about ROS rev 5.2 e u U f b f n t T I 1 D 5 /* "%W% %E%" */ E 5 I 5 #ident " %W% %E% " E 5 double d_prod(x,y) float *x, *y; { return( (*x) * (*y) ); } E 1 h47728 s 00001/00001/00014 d D 4.2 87/05/13 17:31:34 build 5 4 c removed old SCCS strings and inserted #ident BB e s 00000/00000/00015 d D 4.1 87/02/17 08:27:50 mth 4 3 c rolled rev to -r4 (mth) e s 00000/00000/00015 d D 3.1 87/01/21 16:54:31 mkm 3 2 c e s 00000/00000/00015 d D 2.1 87/01/21 16:50:41 mkm 2 1 c e s 00015/00000/00000 d D 1.1 87/01/21 16:46:34 mkm 1 0 c Placed under source control - mkm c These files are direct descendants of the ROS files c by the same name at or about ROS rev 5.2 e u U f b f n t T I 1 D 5 /* "%W% %E%" */ E 5 I 5 #ident " %W% %E% " E 5 double d_sign(a,b) double *a, *b; { double x; x = *a; if (x <= 0) x = -x; if (*b < 0) x = -x; return (x); /*x = (*a >= 0 ? *a : - *a); *return( *b >= 0 ? x : -x); */ } E 1 h41872 s 00001/00001/00007 d D 4.2 87/05/13 17:31:43 build 5 4 c removed old SCCS strings and inserted #ident BB e s 00000/00000/00008 d D 4.1 87/02/17 08:27:52 mth 4 3 c rolled rev to -r4 (mth) e s 00000/00000/00008 d D 3.1 87/01/21 16:54:33 mkm 3 2 c e s 00000/00000/00008 d D 2.1 87/01/21 16:50:44 mkm 2 1 c e s 00008/00000/00000 d D 1.1 87/01/21 16:46:35 mkm 1 0 c Placed under source control - mkm c These files are direct descendants of the ROS files c by the same name at or about ROS rev 5.2 e u U f b f n t T I 1 D 5 /* "%W% %E%" */ E 5 I 5 #ident " %W% %E% " E 5 double derf_(x) double *x; { double erf(); return( erf(*x) ); } E 1 h42173 s 00001/00001/00007 d D 4.2 87/05/13 17:31:52 build 5 4 c removed old SCCS strings and inserted #ident BB e s 00000/00000/00008 d D 4.1 87/02/17 08:27:54 mth 4 3 c rolled rev to -r4 (mth) e s 00000/00000/00008 d D 3.1 87/01/21 16:54:34 mkm 3 2 c e s 00000/00000/00008 d D 2.1 87/01/21 16:50:45 mkm 2 1 c e s 00008/00000/00000 d D 1.1 87/01/21 16:46:35 mkm 1 0 c Placed under source control - mkm c These files are direct descendants of the ROS files c by the same name at or about ROS rev 5.2 e u U f b f n t T I 1 D 5 /* "%W% %E%" */ E 5 I 5 #ident " %W% %E% " E 5 double derfc_(x) double *x; { double erfc(); return( erfc(*x) ); } E 1 h53968 s 00001/00001/00011 d D 4.2 87/05/13 17:32:03 build 5 4 c removed old SCCS strings and inserted #ident BB e s 00000/00000/00012 d D 4.1 87/02/17 08:27:56 mth 4 3 c rolled rev to -r4 (mth) e s 00000/00000/00012 d D 3.1 87/01/21 16:54:35 mkm 3 2 c e s 00000/00000/00012 d D 2.1 87/01/21 16:50:47 mkm 2 1 c e s 00012/00000/00000 d D 1.1 87/01/21 16:46:36 mkm 1 0 c Placed under source control - mkm c These files are direct descendants of the ROS files c by the same name at or about ROS rev 5.2 e u U f b f n t T I 1 D 5 /* "%W% %E%" */ E 5 I 5 #ident " %W% %E% " E 5 /* EFL support routine to copy string b to string a */ #define M ( (long) (sizeof(long) - 1) ) #define EVEN(x) ( ( (x)+ M) & (~M) ) ef1asc_(a, la, b, lb) int *a, *b; long int *la, *lb; { s_copy( (char *)a, (char *)b, EVEN(*la), *lb ); } E 1 h50567 s 00001/00001/00008 d D 4.2 87/05/13 17:32:17 build 5 4 c removed old SCCS strings and inserted #ident BB e s 00000/00000/00009 d D 4.1 87/02/17 08:27:57 mth 4 3 c rolled rev to -r4 (mth) e s 00000/00000/00009 d D 3.1 87/01/21 16:54:36 mkm 3 2 c e s 00000/00000/00009 d D 2.1 87/01/21 16:50:49 mkm 2 1 c e s 00009/00000/00000 d D 1.1 87/01/21 16:46:36 mkm 1 0 c Placed under source control - mkm c These files are direct descendants of the ROS files c by the same name at or about ROS rev 5.2 e u U f b f n t T I 1 D 5 /* "%W% %E%" */ E 5 I 5 #ident " %W% %E% " E 5 /* EFL support routine to compare two character strings */ long int ef1cmc_(a, la, b, lb) int *a, *b; long int *la, *lb; { return( s_cmp( (char *)a, (char *)b, *la, *lb) ); } E 1 h41583 s 00001/00001/00007 d D 4.2 87/05/13 17:32:45 build 5 4 c removed old SCCS strings and inserted #ident BB e s 00000/00000/00008 d D 4.1 87/02/17 08:27:59 mth 4 3 c rolled rev to -r4 (mth) e s 00000/00000/00008 d D 3.1 87/01/21 16:54:37 mkm 3 2 c e s 00000/00000/00008 d D 2.1 87/01/21 16:50:50 mkm 2 1 c e s 00008/00000/00000 d D 1.1 87/01/21 16:46:37 mkm 1 0 c Placed under source control - mkm c These files are direct descendants of the ROS files c by the same name at or about ROS rev 5.2 e u U f b f n t T I 1 D 5 /* "%W% %E%" */ E 5 I 5 #ident " %W% %E% " E 5 float erf_(x) float *x; { double erf(); return( erf(*x) ); } E 1 h41871 s 00001/00001/00007 d D 4.2 87/05/13 17:32:54 build 5 4 c removed old SCCS strings and inserted #ident BB e s 00000/00000/00008 d D 4.1 87/02/17 08:28:01 mth 4 3 c rolled rev to -r4 (mth) e s 00000/00000/00008 d D 3.1 87/01/21 16:54:38 mkm 3 2 c e s 00000/00000/00008 d D 2.1 87/01/21 16:50:52 mkm 2 1 c e s 00008/00000/00000 d D 1.1 87/01/21 16:46:37 mkm 1 0 c Placed under source control - mkm c These files are direct descendants of the ROS files c by the same name at or about ROS rev 5.2 e u U f b f n t T I 1 D 5 /* "%W% %E%" */ E 5 I 5 #ident " %W% %E% " E 5 float erfc_(x) float *x; { double erfc(); return( erfc(*x) ); } E 1 h41380 s 00001/00001/00007 d D 4.2 87/05/13 17:33:03 build 5 4 c removed old SCCS strings and inserted #ident BB e s 00000/00000/00008 d D 4.1 87/02/17 08:28:02 mth 4 3 c rolled rev to -r4 (mth) e s 00000/00000/00008 d D 3.1 87/01/21 16:54:38 mkm 3 2 c e s 00000/00000/00008 d D 2.1 87/01/21 16:50:53 mkm 2 1 c e s 00008/00000/00000 d D 1.1 87/01/21 16:46:38 mkm 1 0 c Placed under source control - mkm c These files are direct descendants of the ROS files c by the same name at or about ROS rev 5.2 e u U f b f n t T I 1 D 5 /* "%W% %E%" */ E 5 I 5 #ident " %W% %E% " E 5 exit_(n) long *n; { f_exit(); _cleanup(); exit((int)*n); } E 1 h04945 s 00001/00001/00024 d D 4.2 87/05/13 17:33:20 build 5 4 c removed old SCCS strings and inserted #ident BB e s 00000/00000/00025 d D 4.1 87/02/17 08:28:04 mth 4 3 c rolled rev to -r4 (mth) e s 00000/00000/00025 d D 3.1 87/01/21 16:54:40 mkm 3 2 c e s 00000/00000/00025 d D 2.1 87/01/21 16:50:54 mkm 2 1 c e s 00025/00000/00000 d D 1.1 87/01/21 16:46:39 mkm 1 0 c Placed under source control - mkm c These files are direct descendants of the ROS files c by the same name at or about ROS rev 5.2 e u U f b f n t T I 1 D 5 /* "%W% %G%" */ E 5 I 5 #ident " %W% %E% " E 5 /* * * Return date and time in an ASCII string. * * calling sequence: * character*24 string * call fdate(string) * where: * the 24 character string will be filled with the date & time in * ascii form as described under ctime(3). * No 'newline' or NULL will be included. */ fdate_(s, strlen) char *s; long strlen; { char *ctime(), *c; long time(), t; t = time(0); c = ctime(&t); c[24] = '\0'; b_char(c, s, strlen); } E 1 h01494 s 00001/00001/00025 d D 4.2 87/05/13 17:33:32 build 5 4 c removed old SCCS strings and inserted #ident BB e s 00000/00000/00026 d D 4.1 87/02/17 08:28:06 mth 4 3 c rolled rev to -r4 (mth) e s 00000/00000/00026 d D 3.1 87/01/21 16:54:40 mkm 3 2 c e s 00000/00000/00026 d D 2.1 87/01/21 16:50:56 mkm 2 1 c e s 00026/00000/00000 d D 1.1 87/01/21 16:46:39 mkm 1 0 c Placed under source control - mkm c These files are direct descendants of the ROS files c by the same name at or about ROS rev 5.2 e u U f b f n t T I 1 D 5 /* "%W% %E%" */ E 5 I 5 #ident " %W% %E% " E 5 /* * subroutine getarg(k, c) * returns the kth unix command argument in fortran character * variable argument c */ getarg_(n, s, ls) long int *n; register char *s; long int ls; { extern int xargc; extern char **xargv; register char *t; register int i; if(*n>=0 && *n= 0) return(*x); return(- *x); } E 1 h41369 s 00001/00001/00005 d D 4.2 87/05/13 17:34:06 build 5 4 c removed old SCCS strings and inserted #ident BB e s 00000/00000/00006 d D 4.1 87/02/17 08:28:11 mth 4 3 c rolled rev to -r4 (mth) e s 00000/00000/00006 d D 3.1 87/01/21 16:54:44 mkm 3 2 c e s 00000/00000/00006 d D 2.1 87/01/21 16:51:00 mkm 2 1 c e s 00006/00000/00000 d D 1.1 87/01/21 16:46:41 mkm 1 0 c Placed under source control - mkm c These files are direct descendants of the ROS files c by the same name at or about ROS rev 5.2 e u U f b f n t T I 1 D 5 /* "%W% %E%" */ E 5 I 5 #ident " %W% %E% " E 5 short h_dim(a,b) short *a, *b; { return( *a > *b ? *a - *b : 0); } E 1 h44275 s 00001/00001/00008 d D 4.2 87/05/13 17:34:14 build 5 4 c removed old SCCS strings and inserted #ident BB e s 00000/00000/00009 d D 4.1 87/02/17 08:28:13 mth 4 3 c rolled rev to -r4 (mth) e s 00000/00000/00009 d D 3.1 87/01/21 16:54:45 mkm 3 2 c e s 00000/00000/00009 d D 2.1 87/01/21 16:51:02 mkm 2 1 c e s 00009/00000/00000 d D 1.1 87/01/21 16:46:41 mkm 1 0 c Placed under source control - mkm c These files are direct descendants of the ROS files c by the same name at or about ROS rev 5.2 e u U f b f n t T I 1 D 5 /* "%W% %E%" */ E 5 I 5 #ident " %W% %E% " E 5 short h_dnnt(x) double *x; { double floor(); return( (*x)>=0 ? floor(*x + .5) : -floor(.5 - *x) ); } E 1 h53679 s 00001/00001/00022 d D 4.2 87/05/13 17:34:25 build 5 4 c removed old SCCS strings and inserted #ident BB e s 00000/00000/00023 d D 4.1 87/02/17 08:28:14 mth 4 3 c rolled rev to -r4 (mth) e s 00000/00000/00023 d D 3.1 87/01/21 16:54:46 mkm 3 2 c e s 00000/00000/00023 d D 2.1 87/01/21 16:51:03 mkm 2 1 c e s 00023/00000/00000 d D 1.1 87/01/21 16:46:42 mkm 1 0 c Placed under source control - mkm c These files are direct descendants of the ROS files c by the same name at or about ROS rev 5.2 e u U f b f n t T I 1 D 5 /* "%W% %E%" */ E 5 I 5 #ident " %W% %E% " E 5 short h_indx(a, b, la, lb) char *a, *b; long int la, lb; { int i, n; char *s, *t, *bend; n = la - lb + 1; bend = b + lb; for(i = 0 ; i < n ; ++i) { s = a + i; t = b; while(t < bend) if(*s++ != *t++) goto no; return(i+1); no: ; } return(0); } E 1 h41107 s 00001/00001/00006 d D 4.2 87/05/13 17:34:34 build 5 4 c removed old SCCS strings and inserted #ident BB e s 00000/00000/00007 d D 4.1 87/02/17 08:28:16 mth 4 3 c rolled rev to -r4 (mth) e s 00000/00000/00007 d D 3.1 87/01/21 16:54:47 mkm 3 2 c e s 00000/00000/00007 d D 2.1 87/01/21 16:51:05 mkm 2 1 c e s 00007/00000/00000 d D 1.1 87/01/21 16:46:43 mkm 1 0 c Placed under source control - mkm c These files are direct descendants of the ROS files c by the same name at or about ROS rev 5.2 e u U f b f n t T I 1 D 5 /* "%W% %E%" */ E 5 I 5 #ident " %W% %E% " E 5 short h_len(s, n) char *s; long int n; { return(n); } E 1 h40684 s 00001/00001/00005 d D 4.2 87/05/13 17:34:43 build 5 4 c removed old SCCS strings and inserted #ident BB e s 00000/00000/00006 d D 4.1 87/02/17 08:28:18 mth 4 3 c rolled rev to -r4 (mth) e s 00000/00000/00006 d D 3.1 87/01/21 16:54:47 mkm 3 2 c e s 00000/00000/00006 d D 2.1 87/01/21 16:51:06 mkm 2 1 c e s 00006/00000/00000 d D 1.1 87/01/21 16:46:43 mkm 1 0 c Placed under source control - mkm c These files are direct descendants of the ROS files c by the same name at or about ROS rev 5.2 e u U f b f n t T I 1 D 5 /* "%W% %E%" */ E 5 I 5 #ident " %W% %E% " E 5 short h_mod(a,b) short *a, *b; { return( *a % *b); } E 1 h57353 s 00001/00001/00009 d D 4.3 87/05/13 17:34:53 build 6 5 c removed old SCCS strings and inserted #ident BB e s 00003/00002/00007 d D 4.2 87/02/17 08:43:28 mth 5 4 c Parateters in registers. e s 00000/00000/00009 d D 4.1 87/02/17 08:28:20 mth 4 3 c rolled rev to -r4 (mth) e s 00000/00000/00009 d D 3.1 87/01/21 16:54:48 mkm 3 2 c e s 00000/00000/00009 d D 2.1 87/01/21 16:51:07 mkm 2 1 c e s 00009/00000/00000 d D 1.1 87/01/21 16:46:44 mkm 1 0 c Placed under source control - mkm c These files are direct descendants of the ROS files c by the same name at or about ROS rev 5.2 e u U f b f n t T I 1 D 6 /* "%W% %E%" */ E 6 I 6 #ident " %W% %E% " E 6 short h_nint(x) float *x; { double floor(); I 5 register float tmpx = *x; E 5 D 5 return( (*x)>=0 ? floor(*x + .5) : -floor(.5 - *x) ); E 5 I 5 return( (tmpx)>=0 ? floor(tmpx + .5) : -floor(.5 - tmpx) ); E 5 } E 1 h43485 s 00001/00001/00007 d D 4.2 87/05/13 17:35:02 build 5 4 c removed old SCCS strings and inserted #ident BB e s 00000/00000/00008 d D 4.1 87/02/17 08:28:21 mth 4 3 c rolled rev to -r4 (mth) e s 00000/00000/00008 d D 3.1 87/01/21 16:54:49 mkm 3 2 c e s 00000/00000/00008 d D 2.1 87/01/21 16:51:08 mkm 2 1 c e s 00008/00000/00000 d D 1.1 87/01/21 16:46:44 mkm 1 0 c Placed under source control - mkm c These files are direct descendants of the ROS files c by the same name at or about ROS rev 5.2 e u U f b f n t T I 1 D 5 /* "%W% %E%" */ E 5 I 5 #ident " %W% %E% " E 5 short h_sign(a,b) short *a, *b; { short x; x = (*a >= 0 ? *a : - *a); return( *b >= 0 ? x : -x); } E 1 h43573 s 00001/00001/00006 d D 4.2 87/05/13 17:35:11 build 5 4 c removed old SCCS strings and inserted #ident BB e s 00000/00000/00007 d D 4.1 87/02/17 08:28:23 mth 4 3 c rolled rev to -r4 (mth) e s 00000/00000/00007 d D 3.1 87/01/21 16:54:51 mkm 3 2 c e s 00000/00000/00007 d D 2.1 87/01/21 16:51:10 mkm 2 1 c e s 00007/00000/00000 d D 1.1 87/01/21 16:46:45 mkm 1 0 c Placed under source control - mkm c These files are direct descendants of the ROS files c by the same name at or about ROS rev 5.2 e u U f b f n t T I 1 D 5 /* "%W% %E%" */ E 5 I 5 #ident " %W% %E% " E 5 short hl_ge(a,b,la,lb) char *a, *b; long int la, lb; { return(s_cmp(a,b,la,lb) >= 0); } E 1 h43531 s 00001/00001/00006 d D 4.2 87/05/13 17:35:20 build 5 4 c removed old SCCS strings and inserted #ident BB e s 00000/00000/00007 d D 4.1 87/02/17 08:28:25 mth 4 3 c rolled rev to -r4 (mth) e s 00000/00000/00007 d D 3.1 87/01/21 16:54:52 mkm 3 2 c e s 00000/00000/00007 d D 2.1 87/01/21 16:51:11 mkm 2 1 c e s 00007/00000/00000 d D 1.1 87/01/21 16:46:45 mkm 1 0 c Placed under source control - mkm c These files are direct descendants of the ROS files c by the same name at or about ROS rev 5.2 e u U f b f n t T I 1 D 5 /* "%W% %E%" */ E 5 I 5 #ident " %W% %E% " E 5 short hl_gt(a,b,la,lb) char *a, *b; long int la, lb; { return(s_cmp(a,b,la,lb) > 0); } E 1 h43586 s 00001/00001/00006 d D 4.2 87/05/13 17:35:30 build 5 4 c removed old SCCS strings and inserted #ident BB e s 00000/00000/00007 d D 4.1 87/02/17 08:28:26 mth 4 3 c rolled rev to -r4 (mth) e s 00000/00000/00007 d D 3.1 87/01/21 16:54:53 mkm 3 2 c e s 00000/00000/00007 d D 2.1 87/01/21 16:51:13 mkm 2 1 c e s 00007/00000/00000 d D 1.1 87/01/21 16:46:46 mkm 1 0 c Placed under source control - mkm c These files are direct descendants of the ROS files c by the same name at or about ROS rev 5.2 e u U f b f n t T I 1 D 5 /* "%W% %E%" */ E 5 I 5 #ident " %W% %E% " E 5 short hl_le(a,b,la,lb) char *a, *b; long int la, lb; { return(s_cmp(a,b,la,lb) <= 0); } E 1 h43546 s 00001/00001/00006 d D 4.2 87/05/13 17:35:40 build 5 4 c removed old SCCS strings and inserted #ident BB e s 00000/00000/00007 d D 4.1 87/02/17 08:28:28 mth 4 3 c rolled rev to -r4 (mth) e s 00000/00000/00007 d D 3.1 87/01/21 16:54:54 mkm 3 2 c e s 00000/00000/00007 d D 2.1 87/01/21 16:51:14 mkm 2 1 c e s 00007/00000/00000 d D 1.1 87/01/21 16:46:47 mkm 1 0 c Placed under source control - mkm c These files are direct descendants of the ROS files c by the same name at or about ROS rev 5.2 e u U f b f n t T I 1 D 5 /* "%W% %E%" */ E 5 I 5 #ident " %W% %E% " E 5 short hl_lt(a,b,la,lb) char *a, *b; long int la, lb; { return(s_cmp(a,b,la,lb) < 0); } E 1 h42362 s 00001/00001/00007 d D 4.2 87/05/13 17:35:49 build 5 4 c removed old SCCS strings and inserted #ident BB e s 00000/00000/00008 d D 4.1 87/02/17 08:28:30 mth 4 3 c rolled rev to -r4 (mth) e s 00000/00000/00008 d D 3.1 87/01/21 16:54:55 mkm 3 2 c e s 00000/00000/00008 d D 2.1 87/01/21 16:51:15 mkm 2 1 c e s 00008/00000/00000 d D 1.1 87/01/21 16:46:47 mkm 1 0 c Placed under source control - mkm c These files are direct descendants of the ROS files c by the same name at or about ROS rev 5.2 e u U f b f n t T I 1 D 5 /* "%W% %E%" */ E 5 I 5 #ident " %W% %E% " E 5 long int i_abs(x) long int *x; { if(*x >= 0) return(*x); return(- *x); } E 1 h41869 s 00001/00001/00005 d D 4.2 87/05/13 17:35:58 build 5 4 c removed old SCCS strings and inserted #ident BB e s 00000/00000/00006 d D 4.1 87/02/17 08:28:32 mth 4 3 c rolled rev to -r4 (mth) e s 00000/00000/00006 d D 3.1 87/01/21 16:54:56 mkm 3 2 c e s 00000/00000/00006 d D 2.1 87/01/21 16:51:17 mkm 2 1 c e s 00006/00000/00000 d D 1.1 87/01/21 16:46:48 mkm 1 0 c Placed under source control - mkm c These files are direct descendants of the ROS files c by the same name at or about ROS rev 5.2 e u U f b f n t T I 1 D 5 /* "%W% %E%" */ E 5 I 5 #ident " %W% %E% " E 5 long int i_dim(a,b) long int *a, *b; { return( *a > *b ? *a - *b : 0); } E 1 h44534 s 00001/00001/00008 d D 4.2 87/05/13 17:36:07 build 5 4 c removed old SCCS strings and inserted #ident BB e s 00000/00000/00009 d D 4.1 87/02/17 08:28:33 mth 4 3 c rolled rev to -r4 (mth) e s 00000/00000/00009 d D 3.1 87/01/21 16:54:57 mkm 3 2 c e s 00000/00000/00009 d D 2.1 87/01/21 16:51:18 mkm 2 1 c e s 00009/00000/00000 d D 1.1 87/01/21 16:46:48 mkm 1 0 c Placed under source control - mkm c These files are direct descendants of the ROS files c by the same name at or about ROS rev 5.2 e u U f b f n t T I 1 D 5 /* "%W% %E%" */ E 5 I 5 #ident " %W% %E% " E 5 long int i_dnnt(x) double *x; { double floor(); return( (*x)>=0 ? floor(*x + .5) : -floor(.5 - *x) ); } E 1 h54387 s 00001/00001/00022 d D 4.2 87/05/13 17:36:20 build 5 4 c removed old SCCS strings and inserted #ident BB e s 00000/00000/00023 d D 4.1 87/02/17 08:28:35 mth 4 3 c rolled rev to -r4 (mth) e s 00000/00000/00023 d D 3.1 87/01/21 16:54:57 mkm 3 2 c e s 00000/00000/00023 d D 2.1 87/01/21 16:51:20 mkm 2 1 c e s 00023/00000/00000 d D 1.1 87/01/21 16:46:49 mkm 1 0 c Placed under source control - mkm c These files are direct descendants of the ROS files c by the same name at or about ROS rev 5.2 e u U f b f n t T I 1 D 5 /* "%W% %E%" */ E 5 I 5 #ident " %W% %E% " E 5 long int i_indx(a, b, la, lb) char *a, *b; long int la, lb; { long int i, n; char *s, *t, *bend; n = la - lb + 1; bend = b + lb; for(i = 0 ; i < n ; ++i) { s = a + i; t = b; while(t < bend) if(*s++ != *t++) goto no; return(i+1); no: ; } return(0); } E 1 h41345 s 00001/00001/00006 d D 4.2 87/05/13 17:36:32 build 5 4 c removed old SCCS strings and inserted #ident BB e s 00000/00000/00007 d D 4.1 87/02/17 08:28:37 mth 4 3 c rolled rev to -r4 (mth) e s 00000/00000/00007 d D 3.1 87/01/21 16:54:58 mkm 3 2 c e s 00000/00000/00007 d D 2.1 87/01/21 16:51:22 mkm 2 1 c e s 00007/00000/00000 d D 1.1 87/01/21 16:46:50 mkm 1 0 c Placed under source control - mkm c These files are direct descendants of the ROS files c by the same name at or about ROS rev 5.2 e u U f b f n t T I 1 D 5 /* "%W% %E%" */ E 5 I 5 #ident " %W% %E% " E 5 long int i_len(s, n) char *s; long int n; { return(n); } E 1 h41157 s 00001/00001/00005 d D 4.2 87/05/13 17:36:41 build 5 4 c removed old SCCS strings and inserted #ident BB e s 00000/00000/00006 d D 4.1 87/02/17 08:28:39 mth 4 3 c rolled rev to -r4 (mth) e s 00000/00000/00006 d D 3.1 87/01/21 16:54:59 mkm 3 2 c e s 00000/00000/00006 d D 2.1 87/01/21 16:51:22 mkm 2 1 c e s 00006/00000/00000 d D 1.1 87/01/21 16:46:50 mkm 1 0 c Placed under source control - mkm c These files are direct descendants of the ROS files c by the same name at or about ROS rev 5.2 e u U f b f n t T I 1 D 5 /* "%W% %E%" */ E 5 I 5 #ident " %W% %E% " E 5 long int i_mod(a,b) long int *a, *b; { return( *a % *b); } E 1 h57579 s 00001/00001/00009 d D 4.3 87/05/13 17:36:52 build 6 5 c removed old SCCS strings and inserted #ident BB e s 00003/00002/00007 d D 4.2 87/02/17 08:43:29 mth 5 4 c Parateters in registers. e s 00000/00000/00009 d D 4.1 87/02/17 08:28:40 mth 4 3 c rolled rev to -r4 (mth) e s 00000/00000/00009 d D 3.1 87/01/21 16:55:00 mkm 3 2 c e s 00000/00000/00009 d D 2.1 87/01/21 16:51:24 mkm 2 1 c e s 00009/00000/00000 d D 1.1 87/01/21 16:46:51 mkm 1 0 c Placed under source control - mkm c These files are direct descendants of the ROS files c by the same name at or about ROS rev 5.2 e u U f b f n t T I 1 D 6 /* "%W% %E%" */ E 6 I 6 #ident " %W% %E% " E 6 long int i_nint(x) float *x; { double floor(); I 5 register float tmpx = *x; E 5 D 5 return( (*x)>=0 ? floor(*x + .5) : -floor(.5 - *x) ); E 5 I 5 return( (tmpx)>=0 ? floor(tmpx + .5) : -floor(.5 - tmpx) ); E 5 } E 1 h44183 s 00001/00001/00007 d D 4.2 87/05/13 17:37:02 build 5 4 c removed old SCCS strings and inserted #ident BB e s 00000/00000/00008 d D 4.1 87/02/17 08:28:42 mth 4 3 c rolled rev to -r4 (mth) e s 00000/00000/00008 d D 3.1 87/01/21 16:55:01 mkm 3 2 c e s 00000/00000/00008 d D 2.1 87/01/21 16:51:26 mkm 2 1 c e s 00008/00000/00000 d D 1.1 87/01/21 16:46:51 mkm 1 0 c Placed under source control - mkm c These files are direct descendants of the ROS files c by the same name at or about ROS rev 5.2 e u U f b f n t T I 1 D 5 /* "%W% %E%" */ E 5 I 5 #ident " %W% %E% " E 5 long int i_sign(a,b) long int *a, *b; { long int x; x = (*a >= 0 ? *a : - *a); return( *b >= 0 ? x : -x); } E 1 h41785 s 00001/00001/00005 d D 4.2 87/05/13 17:37:12 build 5 4 c removed old SCCS strings and inserted #ident BB e s 00000/00000/00006 d D 4.1 87/02/17 08:28:44 mth 4 3 c rolled rev to -r4 (mth) e s 00000/00000/00006 d D 3.1 87/01/21 16:55:02 mkm 3 2 c e s 00000/00000/00006 d D 2.1 87/01/21 16:51:27 mkm 2 1 c e s 00006/00000/00000 d D 1.1 87/01/21 16:46:52 mkm 1 0 c Placed under source control - mkm c These files are direct descendants of the ROS files c by the same name at or about ROS rev 5.2 e u U f b f n t T I 1 D 5 /* "%W% %E%" */ E 5 I 5 #ident " %W% %E% " E 5 long int iargc_() { extern int xargc; return ( xargc - 1 ); } E 1 h43719 s 00001/00001/00006 d D 4.2 87/05/13 17:37:22 build 5 4 c removed old SCCS strings and inserted #ident BB e s 00000/00000/00007 d D 4.1 87/02/17 08:28:45 mth 4 3 c rolled rev to -r4 (mth) e s 00000/00000/00007 d D 3.1 87/01/21 16:55:03 mkm 3 2 c e s 00000/00000/00007 d D 2.1 87/01/21 16:51:29 mkm 2 1 c e s 00007/00000/00000 d D 1.1 87/01/21 16:46:53 mkm 1 0 c Placed under source control - mkm c These files are direct descendants of the ROS files c by the same name at or about ROS rev 5.2 e u U f b f n t T I 1 D 5 /* "%W% %E%" */ E 5 I 5 #ident " %W% %E% " E 5 long int l_ge(a,b,la,lb) char *a, *b; long int la, lb; { return(s_cmp(a,b,la,lb) >= 0); } E 1 h43668 s 00001/00001/00006 d D 4.2 87/05/13 17:37:31 build 5 4 c removed old SCCS strings and inserted #ident BB e s 00000/00000/00007 d D 4.1 87/02/17 08:28:47 mth 4 3 c rolled rev to -r4 (mth) e s 00000/00000/00007 d D 3.1 87/01/21 16:55:04 mkm 3 2 c e s 00000/00000/00007 d D 2.1 87/01/21 16:51:30 mkm 2 1 c e s 00007/00000/00000 d D 1.1 87/01/21 16:46:53 mkm 1 0 c Placed under source control - mkm c These files are direct descendants of the ROS files c by the same name at or about ROS rev 5.2 e u U f b f n t T I 1 D 5 /* "%W% %E%" */ E 5 I 5 #ident " %W% %E% " E 5 long int l_gt(a,b,la,lb) char *a, *b; long int la, lb; { return(s_cmp(a,b,la,lb) > 0); } E 1 h43721 s 00001/00001/00006 d D 4.2 87/05/13 17:37:40 build 5 4 c removed old SCCS strings and inserted #ident BB e s 00000/00000/00007 d D 4.1 87/02/17 08:28:49 mth 4 3 c rolled rev to -r4 (mth) e s 00000/00000/00007 d D 3.1 87/01/21 16:55:04 mkm 3 2 c e s 00000/00000/00007 d D 2.1 87/01/21 16:51:31 mkm 2 1 c e s 00007/00000/00000 d D 1.1 87/01/21 16:46:54 mkm 1 0 c Placed under source control - mkm c These files are direct descendants of the ROS files c by the same name at or about ROS rev 5.2 e u U f b f n t T I 1 D 5 /* "%W% %E%" */ E 5 I 5 #ident " %W% %E% " E 5 long int l_le(a,b,la,lb) char *a, *b; long int la, lb; { return(s_cmp(a,b,la,lb) <= 0); } E 1 h43678 s 00001/00001/00006 d D 4.2 87/05/13 17:37:49 build 5 4 c removed old SCCS strings and inserted #ident BB e s 00000/00000/00007 d D 4.1 87/02/17 08:28:50 mth 4 3 c rolled rev to -r4 (mth) e s 00000/00000/00007 d D 3.1 87/01/21 16:55:05 mkm 3 2 c e s 00000/00000/00007 d D 2.1 87/01/21 16:51:32 mkm 2 1 c e s 00007/00000/00000 d D 1.1 87/01/21 16:46:54 mkm 1 0 c Placed under source control - mkm c These files are direct descendants of the ROS files c by the same name at or about ROS rev 5.2 e u U f b f n t T I 1 D 5 /* "%W% %E%" */ E 5 I 5 #ident " %W% %E% " E 5 long int l_lt(a,b,la,lb) char *a, *b; long int la, lb; { return(s_cmp(a,b,la,lb) < 0); } E 1 h05350 s 00003/00000/00115 d D 4.2 87/04/16 16:23:52 build 5 4 c Profiling changes e s 00000/00000/00115 d D 4.1 87/02/17 09:04:09 mth 4 3 c rolled rev to -r4 (mth) e s 00000/00000/00115 d D 3.1 87/02/17 09:04:09 mth 3 2 c AUTO NULL DELTA e s 00000/00000/00115 d D 2.1 87/02/17 09:04:09 mth 2 1 c AUTO NULL DELTA e s 00115/00000/00000 d D 1.1 87/02/17 09:02:33 mth 1 0 c Placed under source control mth e u U f b f n t T I 1 ; "%W% %E%" ; ; FORTRAN nint (nearest integer) rounding functions ; FONEHALF equ 3f000000h ; float 1/2 DONEHALF1 equ 3fe00000h ; double 1/2 (upper) DONEHALF2 equ 0 ; double 1/2 (lower) FMAXINT equ 1325400064 ; maxint as a float DMAXINT1 equ 1105199103 ; maxint as a double (upper) DMAXINT2 equ -4194304 ; maxint as a double (lower) FMININT equ -822083584 ; minint as a float DMININT1 equ -1042284544 ; minint as a double (upper) DMININT2 equ 0 ; minint as a double (lower) #ifndef ARGSINREGS arg1 equ 24 #endif global _xri_nint global _xrh_nint global _xrr_nint global _xd_nint align 4 _xri_nint: _xrh_nint: ; ; accept a single precision float, return an integer ; I 5 ; MCOUNT E 5 #ifndef ARGSINREGS load r0,r14,arg1 #endif load r0,r0 laddr r1,FONEHALF,l ; .5 br r0<0,neg1 radd r0,r1 fixt r0,r0 ret LINK,LINK align 4 neg1: rsub r0,r1 fixt r0,r0 ret LINK,LINK align 4 _xrr_nint: ; ; accept a single precision float, return a single precision real ; I 5 ; MCOUNT E 5 #ifndef ARGSINREGS load r0,r14,arg1 #endif load r0,r0 ; ; if the number is small enough, just add .5, convert to int, convert ; back to real. otherwise, let the slow standard routine take over. ; laddr r1,FMAXINT,l rcomp r1,r0 br r1<0,_rr_nint,l ; arg too large, use old slow routine laddr r1,FMININT,l rcomp r1,r0 br r1=1,_rr_nint,l ; arg too small, use old slow routine laddr r1,FONEHALF,l ; .5 br r0<0,neg2 radd r0,r1 fixt r0,r0 float r0,r0 ret LINK,LINK align 4 neg2: rsub r0,r1 fixt r0,r0 float r0,r0 ret LINK,LINK align 4 _xd_nint: ; ; accept a double precision float, return a double precision real ; I 5 ; MCOUNT E 5 #ifndef ARGSINREGS load r0,r14,arg1 #endif loadd r0,r0 ; ; if the number is small enough, just add .5, convert to int, convert ; back to real. otherwise, let the slow standard routine take over. ; laddr r2,DMAXINT1,l laddr r3,DMAXINT2,l drcomp r2,r0 br r2<0,_d_nint,l ; arg too large, use old slow routine laddr r2,DMININT1,l move r3,DMININT2 rcomp r2,r0 br r2=1,_d_nint,l ; arg too small, use old slow routine laddr r2,DONEHALF1,l ; .5 (upper half of double) move r3,DONEHALF2 ; .5 (lower half of double) br r0<0,neg3 dradd r0,r2 dfixt r0,r0 dfloat r0,r0 ret LINK,LINK align 4 neg3: drsub r0,r2 dfixt r0,r0 dfloat r0,r0 ret LINK,LINK E 1 h47418 s 00002/00002/00259 d D 4.11 87/04/16 17:40:19 mth 18 17 c Profiling changes e s 00014/00000/00247 d D 4.10 87/04/16 16:35:33 build 17 16 c Profiling changes e s 00027/00004/00220 d D 4.9 87/04/16 16:23:58 build 16 15 c Profiling changes e s 00007/00006/00217 d D 4.8 87/03/20 10:10:37 build 15 13 c add rr_nint.c e s 00008/00007/00216 d R 4.8 87/03/20 10:07:52 build 14 13 c add rr_nint.c e s 00001/00001/00222 d D 4.7 87/03/18 02:37:59 build 13 12 c added complex to clobber section. -mkm e s 00002/00002/00221 d D 4.6 87/03/16 22:35:52 build 12 11 c changed -z to -Fs. -mkm e s 00002/00002/00221 d D 4.5 87/03/02 11:35:33 build 11 9 c Change "-Fs" to "-z" for Ridge version of the compilers. e s 00001/00000/00218 d D 3.3.1.1 87/02/24 16:26:44 build 10 5 c added -rm -f to install section. -mkm e s 00001/00000/00222 d D 4.4 87/02/24 16:25:05 build 9 8 c added -rm -f to install section. -mkm e s 00003/00001/00219 d D 4.3 87/02/17 09:06:17 mth 8 7 c Add nint.s e s 00002/00000/00218 d D 4.2 87/02/17 08:47:32 mth 7 6 c Parameters in registers. e s 00000/00000/00218 d D 4.1 87/02/17 08:27:06 mth 6 5 c rolled rev to -r4 (mth) e s 00173/00157/00045 d D 3.3 87/02/07 14:22:13 build 5 4 c remade makefile using template. -mkm e s 00046/00049/00156 d D 3.2 87/02/03 11:25:16 mkm 4 3 c added dependancies. -mkm e s 00000/00000/00205 d D 3.1 87/01/21 16:55:06 mkm 3 2 c e s 00000/00000/00205 d D 2.1 87/01/21 16:51:33 mkm 2 1 c e s 00205/00000/00000 d D 1.1 87/01/21 16:46:55 mkm 1 0 c Placed under source control - mkm c These files are direct descendants of the ROS files c by the same name at or about ROS rev 5.2 e u U f b f n t T I 1 D 5 # "%W% %E%" E 5 D 4 include /usr/src/makerules VFLAGS= INSDIR=/usr/release E 4 I 4 D 16 E 16 D 5 INSDIR= E 4 DEST=${INSDIR}/lib INS= cp D 4 LPR=/bin/lpr LPROPTS=-f AR= ar E 4 LIBNAME=libF77.a E 5 I 5 # " %W% %E% " # # # libF77.a makefile # # # E 5 D 4 AS= /bin/as FC=/bin/f77 CC=/bin/cc E 4 I 5 # LIB is the library's name I 7 ASFLAGS2 = -DARGSINREGS -DLINK=r15 I 16 DFLAGS = $(PROFLAG) FFLAGS2 = $(PROFLAG) E 16 E 7 D 16 LIB = libF77.a E 16 I 16 PROFLAG = MCOUNT = E 16 I 16 LIBC_SRC = ../libc LIB = libF77.a PLIB = plibF77.a E 16 # DESTDIR is the directory where $(LIB)'s final form gets installed D 16 DESTDIR = $(SPX)/usr/lib E 16 I 16 DESTDIR = $(SPX)/usr/lib PDESTDIR = $(SPX)/usr/lib/libp E 16 # Here we define a suffix rule for .f~.a, since there is no default definition. E 5 I 4 .f~.a: $(GET) $(GFLAGS) -p $< > $*.f $(F77) -c $(FFLAGS) $*.f ar rv $@ $*.o rm -f $*.[fo] I 17 .s~.a: $(GET) $(GFLAGS) -p $< > tmp.s $(M4) $(MCOUNT) tmp.s > $*.s $(AS) -I$(INC) $(ASFLAGS) $*.s $(AR) r $@ $*.o rm -f $*.[so] tmp.[os] .s.a: $(M4) $(MCOUNT) $*.s > tmp.s $(AS) -I$(INC) $(ASFLAGS) tmp.s mv tmp.o $*.o $(AR) r $@ $*.o rm -f $*.o tmp.[os] E 17 E 4 D 5 MISC = $(LIBNAME)(main.o) \ $(LIBNAME)(derf_.o) \ $(LIBNAME)(derfc_.o) \ $(LIBNAME)(ef1asc_.o) \ $(LIBNAME)(ef1cmc_.o) \ $(LIBNAME)(erf_.o) \ $(LIBNAME)(outstr_.o) \ $(LIBNAME)(s_rnge.o) \ $(LIBNAME)(abort_.o) \ $(LIBNAME)(getarg_.o) \ $(LIBNAME)(iargc_.o) \ $(LIBNAME)(getenv_.o) \ $(LIBNAME)(signal_.o) \ $(LIBNAME)(s_stop.o) \ $(LIBNAME)(s_paus.o) \ $(LIBNAME)(system_.o) \ $(LIBNAME)(mclock_.o) \ $(LIBNAME)(subout.o) \ $(LIBNAME)(exit_.o) \ $(LIBNAME)(mvbits.o) \ $(LIBNAME)(loc_.o) \ D 4 $(LIBNAME)(fdate_.o) \ $(LIBNAME)(version.o) E 4 I 4 $(LIBNAME)(fdate_.o) E 5 I 5 MISC = $(LIB)(main.o) \ $(LIB)(derf_.o) \ $(LIB)(derfc_.o) \ $(LIB)(ef1asc_.o) \ $(LIB)(ef1cmc_.o) \ $(LIB)(erf_.o) \ $(LIB)(outstr_.o) \ $(LIB)(s_rnge.o) \ $(LIB)(abort_.o) \ $(LIB)(getarg_.o) \ $(LIB)(iargc_.o) \ $(LIB)(getenv_.o) \ $(LIB)(signal_.o) \ $(LIB)(s_stop.o) \ $(LIB)(s_paus.o) \ $(LIB)(system_.o) \ $(LIB)(mclock_.o) \ $(LIB)(subout.o) \ $(LIB)(exit_.o) \ $(LIB)(mvbits.o) \ $(LIB)(loc_.o) \ $(LIB)(fdate_.o) E 5 E 4 D 5 POW = $(LIBNAME)(pow_ci.o) \ $(LIBNAME)(pow_hh.o) \ $(LIBNAME)(pow_ii.o) \ $(LIBNAME)(pow_zi.o) \ $(LIBNAME)(pow_zz.o) E 5 I 5 POW = $(LIB)(pow_ci.o) \ $(LIB)(pow_hh.o) \ $(LIB)(pow_ii.o) \ $(LIB)(pow_zi.o) \ $(LIB)(pow_zz.o) E 5 I 4 E 4 D 5 CX = $(LIBNAME)(c_abs.o) \ $(LIBNAME)(c_cos.o) \ $(LIBNAME)(c_div.o) \ $(LIBNAME)(c_exp.o) \ $(LIBNAME)(c_log.o) \ $(LIBNAME)(c_sin.o) \ $(LIBNAME)(c_sqrt.o) E 5 I 5 CX = $(LIB)(c_abs.o) \ $(LIB)(c_cos.o) \ $(LIB)(c_div.o) \ $(LIB)(c_exp.o) \ $(LIB)(c_log.o) \ $(LIB)(c_sin.o) \ $(LIB)(c_sqrt.o) E 5 I 4 E 4 D 5 DCX = $(LIBNAME)(z_abs.o) \ $(LIBNAME)(z_cos.o) \ $(LIBNAME)(z_div.o) \ $(LIBNAME)(z_exp.o) \ $(LIBNAME)(z_log.o) \ $(LIBNAME)(z_sin.o) \ $(LIBNAME)(z_sqrt.o) E 5 I 5 DCX = $(LIB)(z_abs.o) \ $(LIB)(z_cos.o) \ $(LIB)(z_div.o) \ $(LIB)(z_exp.o) \ $(LIB)(z_log.o) \ $(LIB)(z_sin.o) \ $(LIB)(z_sqrt.o) E 5 I 4 E 4 D 5 REAL = $(LIBNAME)(r_cnjg.o) \ $(LIBNAME)(r_dim.o) \ $(LIBNAME)(r_imag.o) \ $(LIBNAME)(r_int.o) \ $(LIBNAME)(r_nint.o) \ $(LIBNAME)(r_sign.o) \ $(LIBNAME)(rand_.o) E 5 I 5 REAL = $(LIB)(r_cnjg.o) \ $(LIB)(r_dim.o) \ $(LIB)(r_imag.o) \ $(LIB)(r_int.o) \ $(LIB)(r_nint.o) \ $(LIB)(r_sign.o) \ $(LIB)(rand_.o) E 5 I 4 E 4 D 5 DBL = $(LIBNAME)(d_cnjg.o) \ $(LIBNAME)(d_dim.o) \ $(LIBNAME)(d_imag.o) \ $(LIBNAME)(d_int.o) \ $(LIBNAME)(d_mod.o) \ $(LIBNAME)(d_nint.o) \ $(LIBNAME)(d_prod.o) \ $(LIBNAME)(d_sign.o) E 5 I 5 DBL = $(LIB)(d_cnjg.o) \ $(LIB)(d_dim.o) \ $(LIB)(d_imag.o) \ $(LIB)(d_int.o) \ $(LIB)(d_mod.o) \ $(LIB)(d_nint.o) \ $(LIB)(d_prod.o) \ $(LIB)(d_sign.o) E 5 I 4 E 4 D 5 INT = $(LIBNAME)(i_abs.o) \ $(LIBNAME)(i_dim.o) \ $(LIBNAME)(i_dnnt.o) \ $(LIBNAME)(i_indx.o) \ $(LIBNAME)(i_len.o) \ $(LIBNAME)(i_mod.o) \ $(LIBNAME)(i_nint.o) \ $(LIBNAME)(i_sign.o) E 5 I 5 INT = $(LIB)(i_abs.o) \ $(LIB)(i_dim.o) \ $(LIB)(i_dnnt.o) \ $(LIB)(i_indx.o) \ $(LIB)(i_len.o) \ $(LIB)(i_mod.o) \ $(LIB)(i_nint.o) \ $(LIB)(i_sign.o) E 5 I 4 E 4 D 5 HALF = $(LIBNAME)(h_abs.o) \ $(LIBNAME)(h_dim.o) \ $(LIBNAME)(h_dnnt.o) \ $(LIBNAME)(h_indx.o) \ $(LIBNAME)(h_len.o) \ $(LIBNAME)(h_mod.o) \ $(LIBNAME)(h_nint.o) \ $(LIBNAME)(h_sign.o) E 5 I 5 HALF = $(LIB)(h_abs.o) \ $(LIB)(h_dim.o) \ $(LIB)(h_dnnt.o) \ $(LIB)(h_indx.o) \ $(LIB)(h_len.o) \ $(LIB)(h_mod.o) \ $(LIB)(h_nint.o) \ $(LIB)(h_sign.o) E 5 I 4 E 4 D 5 CMP = $(LIBNAME)(l_ge.o) \ $(LIBNAME)(l_gt.o) \ $(LIBNAME)(l_le.o) \ $(LIBNAME)(l_lt.o) \ $(LIBNAME)(hl_ge.o) \ $(LIBNAME)(hl_gt.o) \ $(LIBNAME)(hl_le.o) \ $(LIBNAME)(hl_lt.o) E 5 I 5 CMP = $(LIB)(l_ge.o) \ $(LIB)(l_gt.o) \ $(LIB)(l_le.o) \ $(LIB)(l_lt.o) \ $(LIB)(hl_ge.o) \ $(LIB)(hl_gt.o) \ $(LIB)(hl_le.o) \ $(LIB)(hl_lt.o) E 5 I 4 E 4 D 5 CHAR = $(LIBNAME)(s_cat.o) \ $(LIBNAME)(s_cmp.o) \ $(LIBNAME)(s_copy.o) E 5 I 5 CHAR = $(LIB)(s_cat.o) \ $(LIB)(s_cmp.o) \ $(LIB)(s_copy.o) E 5 I 4 E 4 D 5 ETC = $(LIBNAME)(bit.o) \ $(LIBNAME)(lnblnk_.o) \ $(LIBNAME)(rindex_.o) \ $(LIBNAME)(cabs.o) E 5 I 5 ETC = $(LIB)(bit.o) \ $(LIB)(lnblnk_.o) \ $(LIB)(rindex_.o) \ $(LIB)(cabs.o) E 5 I 4 E 4 D 5 FOROBJS=$(LIBNAME)(secnds.o) E 5 I 5 FOROBJS=$(LIB)(secnds.o) E 5 I 4 E 4 D 5 ASMOBJS=$(LIBNAME)(matherr.o) \ $(LIBNAME)(d_abs.o) \ $(LIBNAME)(pow_di.o) \ $(LIBNAME)(pow_ri.o) \ $(LIBNAME)(bitsR2V2.o) \ $(LIBNAME)(bitsIRTF.o) \ $(LIBNAME)(nbpar.o) E 5 I 5 ASMOBJS=$(LIB)(matherr.o) \ $(LIB)(d_abs.o) \ $(LIB)(pow_di.o) \ $(LIB)(pow_ri.o) \ $(LIB)(bitsR2V2.o) \ $(LIB)(bitsIRTF.o) \ I 8 $(LIB)(nint.o) \ E 8 $(LIB)(nbpar.o) E 5 I 4 E 4 D 5 RCDASHZ=$(LIBNAME)(minmax.o) \ $(LIBNAME)(r_mod.o) E 5 I 5 CCDASHZ=$(LIB)(minmax.o) \ I 15 $(LIB)(rr_nint.o) \ E 15 $(LIB)(r_mod.o) E 5 D 4 SRCS =main.c derf_.c derfc_.c ef1asc_.c ef1cmc_.c erf_.c outstr_.c \ E 4 I 4 D 5 SRCS = main.c derf_.c derfc_.c ef1asc_.c ef1cmc_.c erf_.c outstr_.c \ E 5 I 5 # SRC is the list of base source names, i.e. modulename.c SRC = main.c derf_.c derfc_.c ef1asc_.c ef1cmc_.c erf_.c outstr_.c \ E 5 E 4 s_rnge.c abort_.c getarg_.c iargc_.c getenv_.c \ signal_.c s_stop.c s_paus.c system_.c mclock_.c matherr.s \ D 5 subout.c exit_.c minmax.c\ pow_ci.c pow_hh.c pow_ii.c pow_ri.s \ pow_zi.c pow_di.s pow_zz.c \ c_abs.c c_cos.c c_div.c c_exp.c c_log.c c_sin.c c_sqrt.c \ z_abs.c z_cos.c z_div.c z_exp.c z_log.c z_sin.c z_sqrt.c \ r_cnjg.c \ r_dim.c r_imag.c r_int.c \ r_nint.c r_sign.c \ rand_.c \ d_abs.s \ d_cnjg.c d_dim.c \ d_imag.c d_int.c d_mod.c \ d_nint.c d_prod.c d_sign.c \ i_abs.c i_dim.c i_dnnt.c i_indx.c i_len.c i_mod.c i_nint.c i_sign.c \ h_abs.c h_dim.c h_dnnt.c h_indx.c h_len.c h_mod.c h_nint.c h_sign.c \ l_ge.c l_gt.c l_le.c l_lt.c hl_ge.c hl_gt.c hl_le.c hl_lt.c \ s_cat.c s_cmp.c s_copy.c \ bit.c lnblnk_.c rindex_.c cabs.c \ mvbits.c bitsR2V2.s bitsIRTF.s bit.h nbpar.s secnds.f \ loc_.c fdate_.c \ r_mod.c E 5 I 5 subout.c exit_.c minmax.c pow_ci.c pow_hh.c pow_ii.c pow_ri.s \ pow_zi.c pow_di.s pow_zz.c c_abs.c c_cos.c c_div.c c_exp.c c_log.c \ c_sin.c c_sqrt.c z_abs.c z_cos.c z_div.c z_exp.c z_log.c z_sin.c \ z_sqrt.c r_cnjg.c r_dim.c r_imag.c r_int.c r_nint.c r_sign.c rand_.c \ d_abs.s d_cnjg.c d_dim.c d_imag.c d_int.c d_mod.c d_nint.c d_prod.c \ d_sign.c i_abs.c i_dim.c i_dnnt.c i_indx.c i_len.c i_mod.c i_nint.c \ i_sign.c h_abs.c h_dim.c h_dnnt.c h_indx.c h_len.c h_mod.c h_nint.c \ h_sign.c l_ge.c l_gt.c l_le.c l_lt.c hl_ge.c hl_gt.c hl_le.c hl_lt.c \ s_cat.c s_cmp.c s_copy.c bit.c lnblnk_.c rindex_.c cabs.c mvbits.c \ D 8 bitsR2V2.s bitsIRTF.s bit.h nbpar.s secnds.f loc_.c fdate_.c r_mod.c E 8 I 8 bitsR2V2.s bitsIRTF.s bit.h nbpar.s secnds.f loc_.c fdate_.c r_mod.c \ D 15 nint.s E 15 I 15 nint.s rr_nint.c E 15 E 8 E 5 D 5 OBJS = $(MISC) $(POW) $(CX) $(DCX) $(REAL) $(DBL) $(INT) $(HALF) $(CMP) $(CHAR) $(ETC) E 5 I 5 # OBJ is the list of object module names in # library form, i.e. $(LIB)(modulename.o) E 5 D 4 DEPEND =s.libF77.v $(SRCS) complex version.c E 4 I 4 D 5 all: libF77.a E 5 I 5 OBJ = $(MISC) $(POW) $(CX) $(DCX) $(REAL) $(DBL) $(INT) $(HALF) $(CMP) \ $(CHAR) $(ETC) $(FOROBJS) $(ASMOBJS) $(CCDASHZ) E 5 E 4 D 4 all: Version.F77 libF77.a E 4 D 5 test: libF77.a E 5 I 5 all: $(LIB) D 16 $(NM) -xv $(LIB) > $(LIB).map E 16 I 16 get -p $(LIBC_SRC)/s.mcount.def > mcount.def rm -f *.o $(MAKE) -$(MAKEFLAGS) 'MCOUNT=mcount.def' 'PROFLAG=-p' \ 'LIB=plibF77.a' $(PLIB) E 16 E 5 D 4 Version.F77: makeversion -c $(VFLAGS) $(DEPEND) E 4 I 4 D 5 libF77.a : $(OBJS) $(FOROBJS) $(ASMOBJS) $(RCDASHZ) E 5 I 5 D 18 $(LIB): $(OBJ) E 18 I 18 libF77.a: $(OBJ) E 18 I 16 $(NM) -xv $(LIB) > $(LIB).map E 16 E 5 E 4 I 16 D 18 $(PLIB): $(OBJ) E 18 I 18 plibF77.a: $(OBJ) E 18 $(NM) -xv $(PLIB) > $(PLIB).map rm -f $(MCOUNT) E 16 D 4 libF77.a :: $(OBJS) $(CC) -c $(CFLAGS) $(?:.o=.c) $(AR) rv $(LIBNAME) $? -rm -f $? E 4 I 4 D 5 #The two files minmax.c and r_mod.c MUST be compiled with cc -Fs, therefore, #we need to handle them explicitly: E 5 I 5 D 11 # The two files minmax.c and r_mod.c MUST be compiled with cc -Fs, therefore, E 11 I 11 D 12 # The two files minmax.c and r_mod.c MUST be compiled with cc -z, therefore, E 12 I 12 D 15 # The two files minmax.c and r_mod.c MUST be compiled with cc -Fs, therefore, E 15 I 15 # The files minmax.c, rr_nint, r_mod.c MUST be compiled with cc -Fs, therefore E 15 E 12 E 11 # we need to handle them explicitly: E 5 E 4 D 4 libF77.a :: $(FOROBJS) $(FC) $(FFLAGS) -c $(?:.o=.f) $(AR) rv $(LIBNAME) $? -rm -f $? libF77.a :: $(ASMOBJS) $(AR) rv $(LIBNAME) $? -rm -f $? E 4 I 4 D 5 $(RCDASHZ): minmax.c r_mod.c E 5 I 5 D 15 $(CCDASHZ): minmax.c r_mod.c E 5 D 11 $(CC) -Fs -c $(CFLAGS) minmax.c r_mod.c E 11 I 11 D 12 $(CC) -z -c $(CFLAGS) minmax.c r_mod.c E 12 I 12 $(CC) -Fs -c $(CFLAGS) minmax.c r_mod.c E 12 E 11 D 5 $(AR) rv $(LIBNAME) minmax.o r_mod.o E 5 I 5 $(AR) rv $(LIB) minmax.o r_mod.o E 5 -rm -f minmax.o r_mod.o E 15 I 15 $(CCDASHZ): minmax.c r_mod.c rr_nint.c $(CC) -Fs -c $(CFLAGS) minmax.c r_mod.c rr_nint.c $(AR) rv $(LIB) minmax.o r_mod.o rr_nint.o -rm -f minmax.o r_mod.o rr_nint.o E 15 E 4 D 4 libF77.a :: $(RCDASHZ) $(CC) -Fs -c $(CFLAGS) $(?:.o=.c) $(AR) rv $(LIBNAME) $? -rm -f $? E 4 I 4 complex: s.complex $(GET) $(GFLAGS) s.complex E 4 D 4 $(LIBNAME)(version.o): libF77.v E 4 I 4 D 5 $(LIBNAME)(bitsR2V2.o) $(LIBNAME)(mvbits.o): bit.h E 4 D 4 $(MISC) $(POW) $(CX): complex $(DCX) $(REAL): complex $(DBL) $(INT): complex $(HALF) $(CMP) $(CHAR): complex E 4 I 4 $(LIBNAME)(c_abs.o) $(LIBNAME)(c_cos.o) $(LIBNAME)(c_exp.o) \ $(LIBNAME)(c_log.o) $(LIBNAME)(c_sin.o) $(LIBNAME)(c_sqrt.o) \ $(LIBNAME)(d_cnjg.o) $(LIBNAME)(d_imag.o) $(LIBNAME)(pow_ci.o) \ $(LIBNAME)(pow_zi.o) $(LIBNAME)(pow_zz.o) $(LIBNAME)(r_cnjg.o) \ $(LIBNAME)(r_imag.o) $(LIBNAME)(z_abs.o) $(LIBNAME)(z_cos.o) \ $(LIBNAME)(z_exp.o) $(LIBNAME)(z_log.o) \ $(LIBNAME)(z_sin.o) $(LIBNAME)(z_sqrt.o): complex E 4 D 4 #The two files minmax.c and r_mod.c MUST be compiled with cc -Fs, therefore, #we need to handle them explicitly: E 4 I 4 $(LIBNAME)(main.o) $(LIBNAME)(signal_.o): $(INC)/signal.h E 4 D 4 minmax.o: minmax.c $(CC) -c -Fs minmax.c E 4 I 4 $(LIBNAME)(abort_.o) $(LIBNAME)(c_div.o) $(LIBNAME)(main.o) \ $(LIBNAME)(outstr_.o) $(LIBNAME)(s_paus.o) $(LIBNAME)(s_rnge.o) \ $(LIBNAME)(s_stop.o) $(LIBNAME)(subout.o) \ $(LIBNAME)(z_div.o): $(INC)/stdio.h E 4 D 4 r_mod.o: r_mod.c $(CC) -c -Fs r_mod.c # These rules duplicate the rules in /usr/src/makerules .c.a:; .f.a:; .s.a: $(AS) -o $*.o $*.s E 4 I 4 minmax.o: $(INC)/varargs.h E 4 E 5 install: I 10 -rm -f $(DESTDIR)/$(LIB) E 10 I 9 -rm -f $(DESTDIR)/$(LIB) E 9 D 5 $(INS) $(LIBNAME) $(DEST) chmod 644 ${DEST}/${LIBNAME} chown bin ${DEST}/${LIBNAME} chgrp bin ${DEST}/${LIBNAME} E 5 I 5 $(INS) $(LIB) $(DESTDIR)/$(LIB) chmod 644 $(DESTDIR)/$(LIB) chgrp bin $(DESTDIR)/$(LIB) chown bin $(DESTDIR)/$(LIB) E 5 I 16 -rm -f $(PDESTDIR)/$(LIB) $(INS) $(PLIB) $(PDESTDIR)/$(LIB) chmod 644 $(PDESTDIR)/$(LIB) chgrp bin $(PDESTDIR)/$(LIB) chown bin $(PDESTDIR)/$(LIB) E 16 listing: D 5 $(LPR) $(LPROPTS) $(SRCS) E 5 I 5 $(PR) $(SRC) | $(LP) E 5 clean: -rm -f *.o I 5 -rm -f core errs E 5 I 5 # This clobber rule *requires* that the sources (SRC) be kept in sccs # format, ie the SRC copies are NOT the only ones!! E 5 clobber: clean D 5 -rm -f $(LIBNAME) E 5 I 5 D 13 -rm -f $(LIB) $(LIB).map $(SRC) E 13 I 13 -rm -f $(LIB) $(LIB).map $(SRC) complex I 16 -rm -f $(PLIB) $(PLIB).map E 16 E 13 WHAT: what $(LIB) I 16 what $(PLIB) E 16 # dependencies for included files and other non-obvious reasons are listed # below $(LIB)(bitsR2V2.o) $(LIB)(mvbits.o): bit.h $(LIB)(c_abs.o) $(LIB)(c_cos.o) $(LIB)(c_exp.o) \ $(LIB)(c_log.o) $(LIB)(c_sin.o) $(LIB)(c_sqrt.o) \ $(LIB)(d_cnjg.o) $(LIB)(d_imag.o) $(LIB)(pow_ci.o) \ $(LIB)(pow_zi.o) $(LIB)(pow_zz.o) $(LIB)(r_cnjg.o) \ $(LIB)(r_imag.o) $(LIB)(z_abs.o) $(LIB)(z_cos.o) \ $(LIB)(z_exp.o) $(LIB)(z_log.o) \ $(LIB)(z_sin.o) $(LIB)(z_sqrt.o): complex $(LIB)(main.o) $(LIB)(signal_.o): $(INC)/signal.h $(LIB)(abort_.o) $(LIB)(c_div.o) $(LIB)(main.o) \ $(LIB)(outstr_.o) $(LIB)(s_paus.o) $(LIB)(s_rnge.o) \ $(LIB)(s_stop.o) $(LIB)(subout.o) \ $(LIB)(z_div.o): $(INC)/stdio.h minmax.o: $(INC)/varargs.h E 5 E 1 h03967 s 00001/00001/00020 d D 4.2 87/05/13 17:37:59 build 5 4 c removed old SCCS strings and inserted #ident BB e s 00000/00000/00021 d D 4.1 87/02/17 08:28:52 mth 4 3 c rolled rev to -r4 (mth) e s 00000/00000/00021 d D 3.1 87/01/21 16:55:09 mkm 3 2 c e s 00000/00000/00021 d D 2.1 87/01/21 16:51:37 mkm 2 1 c e s 00021/00000/00000 d D 1.1 87/01/21 16:46:57 mkm 1 0 c Placed under source control - mkm c These files are direct descendants of the ROS files c by the same name at or about ROS rev 5.2 e u U f b f n t T I 1 D 5 /* "%W% %E%" */ E 5 I 5 #ident " %W% %E% " E 5 /* * * find last occurrence of a non-blank character in string * * calling sequence: * character*(*) string * indx = lnblnk (string) * where: * indx will be the index of the last occurence * of a non-blank character in string, or zero if not found. */ long lnblnk_(str, slen) char *str; long slen; { register char *p = str + slen; while (--p >= str && *p == ' ' ) ; return((long)(++p - str)); } E 1 h52036 s 00001/00001/00015 d D 4.2 87/05/13 17:38:08 build 5 4 c removed old SCCS strings and inserted #ident BB e s 00000/00000/00016 d D 4.1 87/02/17 08:28:54 mth 4 3 c rolled rev to -r4 (mth) e s 00000/00000/00016 d D 3.1 87/01/21 16:55:10 mkm 3 2 c e s 00000/00000/00016 d D 2.1 87/01/21 16:51:38 mkm 2 1 c e s 00016/00000/00000 d D 1.1 87/01/21 16:46:57 mkm 1 0 c Placed under source control - mkm c These files are direct descendants of the ROS files c by the same name at or about ROS rev 5.2 e u U f b f n t T I 1 D 5 /* "%W% %E%" */ E 5 I 5 #ident " %W% %E% " E 5 /* * * Return the address of the argument. * * calling sequence: * iloc = loc (arg) * where: * iloc will receive the address of arg */ long loc_(arg) long *arg; { return((long)arg); } E 1 h01782 s 00001/00001/00092 d D 4.2 87/05/13 17:38:24 build 5 4 c removed old SCCS strings and inserted #ident BB e s 00000/00000/00093 d D 4.1 87/02/17 08:28:56 mth 4 3 c rolled rev to -r4 (mth) e s 00000/00000/00093 d D 3.1 87/01/21 16:55:11 mkm 3 2 c e s 00000/00000/00093 d D 2.1 87/01/21 16:51:39 mkm 2 1 c e s 00093/00000/00000 d D 1.1 87/01/21 16:46:58 mkm 1 0 c Placed under source control - mkm c These files are direct descendants of the ROS files c by the same name at or about ROS rev 5.2 e u U f b f n t T I 1 D 5 /* "%W% %E%" */ E 5 I 5 #ident " %W% %E% " E 5 /* 3.0 SID # 1.2 */ /* STARTUP PROCEDURE FOR UNIX FORTRAN PROGRAMS */ #include #define abort() {fprintf(stderr,"abort\n"); exit(1);} #include int xargc; char **xargv; main(argc, argv, arge) int argc; char **argv; char **arge; { int sigfdie(), sigidie(), sigqdie(), sigindie(), sigtdie(); xargc = argc; xargv = argv; #ifdef Signals signal(SIGFPE, sigfdie); signal(SIGIOT, sigidie); if( (int)signal(SIGQUIT,sigqdie) & 01) signal(SIGQUIT, SIG_IGN); if( (int)signal(SIGINT, sigindie) & 01) signal(SIGINT, SIG_IGN); signal(SIGTERM,sigtdie); #endif /* Signals */ #ifdef pdp11 ldfps(01200); /* detect overflow as an exception */ #endif f_init(); MAIN_(); f_exit(); } #ifdef Signals static sigfdie() { sigdie("Floating Exception", 1); } static sigidie() { sigdie("IOT Trap", 1); } static sigqdie() { sigdie("Quit signal", 1); } static sigindie() { sigdie("Interrupt", 0); } static sigtdie() { sigdie("Killed", 0); } static sigdie(s, kill) register char *s; int kill; { /* print error message, then clear buffers */ fflush(stderr); fprintf(stderr, "%s\n", s); f_exit(); fflush(stderr); if(kill) { /* now get a core */ signal(SIGIOT, 0); abort(); } else exit(1); } #endif /* Signals */ E 1 h45949 s 00001/00000/00005 d D 4.3 87/04/16 16:23:51 build 6 5 c Profiling changes e s 00001/00001/00004 d D 4.2 87/02/17 08:43:18 mth 5 4 c Parateters in registers. e s 00000/00000/00005 d D 4.1 87/02/17 08:28:57 mth 4 3 c rolled rev to -r4 (mth) e s 00000/00000/00005 d D 3.1 87/01/21 16:55:11 mkm 3 2 c e s 00000/00000/00005 d D 2.1 87/01/21 16:51:41 mkm 2 1 c e s 00005/00000/00000 d D 1.1 87/01/21 16:46:59 mkm 1 0 c Placed under source control - mkm c These files are direct descendants of the ROS files c by the same name at or about ROS rev 5.2 e u U f b f n t T I 1 ; "%W% %E%" global _matherr _matherr: I 6 ; MCOUNT E 6 move r0,0 D 5 ret r11,r11 ; return 0 E 5 I 5 ret LINK,LINK ; return 0 E 5 E 1 h43597 s 00001/00001/00006 d D 4.2 87/05/13 17:38:34 build 5 4 c removed old SCCS strings and inserted #ident BB e s 00000/00000/00007 d D 4.1 87/02/17 08:28:59 mth 4 3 c rolled rev to -r4 (mth) e s 00000/00000/00007 d D 3.1 87/01/21 16:55:12 mkm 3 2 c e s 00000/00000/00007 d D 2.1 87/01/21 16:51:42 mkm 2 1 c e s 00007/00000/00000 d D 1.1 87/01/21 16:46:59 mkm 1 0 c Placed under source control - mkm c These files are direct descendants of the ROS files c by the same name at or about ROS rev 5.2 e u U f b f n t T I 1 D 5 /* "%W% %E%" */ E 5 I 5 #ident " %W% %E% " E 5 long int mclock_() { int buf[6]; times(buf); return(buf[0]+buf[2]+buf[3]); } E 1 h60628 s 00001/00001/00190 d D 3.2 87/05/13 17:38:49 build 4 3 c removed old SCCS strings and inserted #ident BB e s 00000/00000/00191 d D 3.1 87/01/21 16:55:13 mkm 3 2 c e s 00000/00000/00191 d D 2.1 87/01/21 16:51:43 mkm 2 1 c e s 00191/00000/00000 d D 1.1 87/01/21 16:47:00 mkm 1 0 c Placed under source control - mkm c These files are direct descendants of the ROS files c by the same name at or about ROS rev 5.2 e u U f b f n t T I 1 D 4 /* "%W% %E%" */ E 4 I 4 #ident " %W% %E% " E 4 /* * This file must be compiled with rc -z */ #include /* return minimum int arg, as int */ int min0(va_alist) va_dcl { va_list ap; int Min, tmp, count; va_start(ap); count = va_arg(ap, int); Min = va_arg(ap, int); while (--count) { if ((tmp = va_arg(ap, int)) < Min) Min = tmp; } return(Min); } /* return maximum int arg, as int */ int max0(va_alist) va_dcl { va_list ap; int Max, tmp, count; va_start(ap); count = va_arg(ap, int); Max = va_arg(ap, int); while (--count) { if ((tmp = va_arg(ap, int)) > Max) Max = tmp; } return(Max); } /* return minimum float arg, as int */ int min1(va_alist) va_dcl { va_list ap; float Min, tmp; int count; va_start(ap); count = va_arg(ap, int); Min = va_arg(ap, float); while (--count) { if ((tmp = va_arg(ap, float)) < Min) Min = tmp; } return(Min); } /* return maximum float arg, as int */ int max1(va_alist) va_dcl { va_list ap; float Max, tmp; int count; va_start(ap); count = va_arg(ap, int); Max = va_arg(ap, float); while (--count) { if ((tmp = va_arg(ap, float)) > Max) Max = tmp; } return(Max); } /* return minimum int arg, as float */ float amin0(va_alist) va_dcl { va_list ap; float Min, tmp; int count; va_start(ap); count = va_arg(ap, int); Min = va_arg(ap, int); while (--count) { if ((tmp = va_arg(ap, int)) < Min) Min = tmp; } return(Min); } /* return maximum int arg, as float */ float amax0(va_alist) va_dcl { va_list ap; float Max, tmp; int count; va_start(ap); count = va_arg(ap, int); Max = va_arg(ap, int); while (--count) { if ((tmp = va_arg(ap, int)) > Max) Max = tmp; } return(Max); } /* return minimum float arg, as float */ float amin1(va_alist) { va_list ap; float Min, tmp; int count; va_start(ap); count = va_arg(ap, int); Min = va_arg(ap, float); while (--count) { if ((tmp = va_arg(ap, float)) < Min) Min = tmp; } return(Min); } /* return maximum float arg, as float */ float amax1(va_alist) { va_list ap; float Max, tmp; int count; va_start(ap); count = va_arg(ap, int); Max = va_arg(ap, float); while (--count) { if ((tmp = va_arg(ap, float)) > Max) Max = tmp; } return(Max); } /* return minimum double arg, as double */ double dmin1(va_alist) { va_list ap; double Min, tmp; int count; va_start(ap); count = va_arg(ap, int); Min = va_arg(ap, double); while (--count) { if ((tmp = va_arg(ap, double)) < Min) Min = tmp; } return(Min); } /* return maximum double arg, as double */ double dmax1(va_alist) { va_list ap; double Max, tmp; int count; va_start(ap); count = va_arg(ap, int); Max = va_arg(ap, double); while (--count) { if ((tmp = va_arg(ap, double)) > Max) Max = tmp; } return(Max); } E 1 h10604 s 00001/00001/00020 d D 4.2 87/05/13 17:39:02 build 5 4 c removed old SCCS strings and inserted #ident BB e s 00000/00000/00021 d D 4.1 87/02/17 08:29:02 mth 4 3 c rolled rev to -r4 (mth) e s 00000/00000/00021 d D 3.1 87/01/21 16:55:14 mkm 3 2 c e s 00000/00000/00021 d D 2.1 87/01/21 16:51:44 mkm 2 1 c e s 00021/00000/00000 d D 1.1 87/01/21 16:47:01 mkm 1 0 c Placed under source control - mkm c These files are direct descendants of the ROS files c by the same name at or about ROS rev 5.2 e u U f b f n t T I 1 D 5 /* "%W% %E%" */ E 5 I 5 #ident " %W% %E% " E 5 #include "bit.h" /* Move len bits from position i through i+len-1 of argument m to * position j through j+len-1 of argument n. * The right most bit is bit 0. */ mvbits_(m,i,len,n,j) register long *m, *i, *len, *n, *j; { unsigned long b; if ( (*i + *len > NBLI) || (*j + *len > NBLI) || (*len <= 0) || (*i < 0) || (*j < 0) ) return; *n &= ~(F77mask[*j + *len] ^ F77mask[*j]); /* clear dest field */ b = (*m >> *i) & F77mask[*len]; /* extract bits from src */ *n |= (b << *j); /* position bits and insert */ } E 1 h53744 s 00001/00000/00036 d D 4.3 87/04/16 16:23:52 build 6 5 c Profiling changes e s 00008/00001/00028 d D 4.2 87/02/17 08:43:20 mth 5 4 c Parateters in registers. e s 00000/00000/00029 d D 4.1 87/02/17 08:29:04 mth 4 3 c rolled rev to -r4 (mth) e s 00000/00000/00029 d D 3.1 87/01/21 16:55:15 mkm 3 2 c e s 00000/00000/00029 d D 2.1 87/01/21 16:51:46 mkm 2 1 c e s 00029/00000/00000 d D 1.1 87/01/21 16:47:01 mkm 1 0 c Placed under source control - mkm c These files are direct descendants of the ROS files c by the same name at or about ROS rev 5.2 e u U f b f n t T I 1 ; "%W% %E%" global _nb$par_ _nb$par_: ; ; le fonction nb$par calcule le nombre de parametres dans la pile ; (nombre de parametres specifies par le programmeur + parametres ; ajoutes par le compilateur pour les retours de fonctions de type ; caractere ou complexe. Les parametres ajoutes servant a decrire ; les longueurs des parametres de type caractere ne sont pas comptes.) ; (en entree, r15+12 contient le nombre total de parametres dans la pile) ; I 6 ; MCOUNT E 6 I 5 #ifdef ARGSINREGS store r0,r15,24 #endif E 5 ; r0: valeur a retourner load r0,r15,12 ; r1: pointeur vers le block de parametres. laddr r1,r15,24 ; r2: compteur de boucle. I 5 #ifdef ARGSINREGS neg r2,r0 #else E 5 load r2,r15,12 neg r2,r2 I 5 #endif E 5 loop: ; charger le mot suivant le parametre (info supplementaire) load r3,r1,4 br r3 <= 0, endloop ; le parametre n'est un parametre du programmeur: decrementer nbpar. subi r0,1 endloop: addi r1,8 loop r2,1,loop ; D 5 ret r11,r11 E 5 I 5 ret LINK,LINK E 5 E 1 h47803 s 00001/00001/00010 d D 4.2 87/05/13 17:39:11 build 5 4 c removed old SCCS strings and inserted #ident BB e s 00000/00000/00011 d D 4.1 87/02/17 08:29:06 mth 4 3 c rolled rev to -r4 (mth) e s 00000/00000/00011 d D 3.1 87/01/21 16:55:16 mkm 3 2 c e s 00000/00000/00011 d D 2.1 87/01/21 16:51:48 mkm 2 1 c e s 00011/00000/00000 d D 1.1 87/01/21 16:47:02 mkm 1 0 c Placed under source control - mkm c These files are direct descendants of the ROS files c by the same name at or about ROS rev 5.2 e u U f b f n t T I 1 D 5 /* "%W% %E%" */ E 5 I 5 #ident " %W% %E% " E 5 #include /* print a character string */ outstr_(s, n) register char *s; register long n; { while ( --n >= 0) putchar(*s++); } E 1 h51924 s 00001/00001/00016 d D 4.2 87/05/13 17:39:20 build 5 4 c removed old SCCS strings and inserted #ident BB e s 00000/00000/00017 d D 4.1 87/02/17 08:29:07 mth 4 3 c rolled rev to -r4 (mth) e s 00000/00000/00017 d D 3.1 87/01/21 16:55:17 mkm 3 2 c e s 00000/00000/00017 d D 2.1 87/01/21 16:51:49 mkm 2 1 c e s 00017/00000/00000 d D 1.1 87/01/21 16:47:03 mkm 1 0 c Placed under source control - mkm c These files are direct descendants of the ROS files c by the same name at or about ROS rev 5.2 e u U f b f n t T I 1 D 5 /* "%W% %E%" */ E 5 I 5 #ident " %W% %E% " E 5 #include "complex" pow_ci(p, a, b) /* p = a**b */ complex *p, *a; long int *b; { dcomplex p1, a1; a1.dreal = a->real; a1.dimag = a->imag; pow_zi(&p1, &a1, b); p->real = p1.dreal; p->imag = p1.dimag; } E 1 h06631 s 00002/00000/00256 d D 4.3 87/04/16 16:23:54 build 6 5 c Profiling changes e s 00069/00014/00187 d D 4.2 87/02/17 08:43:21 mth 5 4 c Parateters in registers. e s 00000/00000/00201 d D 4.1 87/02/17 08:29:09 mth 4 3 c rolled rev to -r4 (mth) e s 00000/00000/00201 d D 3.1 87/01/21 16:55:18 mkm 3 2 c e s 00000/00000/00201 d D 2.1 87/01/21 16:51:50 mkm 2 1 c e s 00201/00000/00000 d D 1.1 87/01/21 16:47:03 mkm 1 0 c Placed under source control - mkm c These files are direct descendants of the ROS files c by the same name at or about ROS rev 5.2 e u U f b f n t T I 1 ; "%W% %E%" dsect data name byte 'pow',0 ;name of routine emess0 byte 'pow: SING error\n',0 ;error message if base=0 mess0len equ 16 ;length of emess0 emess byte 'pow: DOMAIN error\n',0 ;error message if base or pow ;is too big messlen equ 18 ;length of emess nanmess byte 'pow: input value was NAN\n',0 ;error message if nan nanlen equ 25 infmess byte 'pow: input value was INF\n',0 ;error message if "infinity" inflen equ 25 csect code align 2 externd _errno external _write external _matherr e_type equ -32 ;exception type e_name equ -28 ;name of routine in error e_arg1 equ -24 ;argument 1 e_arg2 equ -16 ;argument 2 (if present) e_retval equ -8 ;room for exception block e_size equ -80 ; plus stack frame with 3 parameters I 5 pe_size equ 80 ; positive e_size E 5 I 5 E 5 DOMAIN equ 1 SING equ 2 OVERFLOW equ 3 UNDERFLOW equ 4 TLOSS equ 5 PLOSS equ 6 EDOM equ 33 ERANGE equ 34 csect code ONE1 equ 03ff00000h ONE2 equ 000000000h ;equals 1.0 INF1 equ 07ff00000h INF2 equ 0 ;equals "infinity" LIMIT1 equ 050000000h ;equals upper word of bases whic are too big LIMIT2 equ 0000002c6h ;equals the two's complement form of 710 arg3 equ 40 arg_1 equ -8 arg1 equ 24 arg2 equ 32 global _pow_di global _Pow_di _pow_di: I 6 ; MCOUNT E 6 I 5 #ifdef ARGSINREGS loadd r2,r0 load r4,r1 #else E 5 load r2,r14,arg1 loadd r2,r2,0 ;get "base" = "x" load r4,r14,arg2 load r4,r4,0 ;get power to raise the base to (ie "pow")="n" I 5 #endif E 5 ; ; added code for GreenHills: ; br doit _Pow_di: I 6 ; MCOUNT E 6 I 5 #ifdef ARGSINREGS move r4,r2 move r2,r0 move r3,r1 #else E 5 load r4,r14,arg2 loadd r2,r14,arg1 I 5 #endif E 5 doit: ; ; done with GreenHills changes ; laddr r0,INF1,L br r2>=r0,nanorinf ;if base = nan or inf then nanorinf move r1,r3 ;if base = 0 then return 0 or r1,r2 ; check both regs for 0 br r1<>0,notzero! move r0,0 ; return zero in r0,r1 D 5 ret r11,r11 E 5 I 5 ret LINK,LINK E 5 notzero: laddr r0,LIMIT1,L br r2>=r0,toobig ;if base >=1.0e77 then toobig else ... laddr r0,LIMIT2,L br r4>=r0,toobig ;if pow > 710 then toobig else ... laddr r0,ONE1,L laddr r1,ONE2,L ;rp0="pow=1" br r4=0,done ;if (n!=0) then ... else done (returns 1) br r4>0,cont ;if (n<0) then ... else continue neg r4,r4 ;r4="n=-n" drdiv r0,r2 move r2,r0 move r3,r1 ;rp2="x=1/x" laddr r0,ONE1,L laddr r1,ONE2,L ;rp0="pow=1" cont: laddr r5,1 and r5,r4 br r5=0,even ;if (n & 01) then ... else even drmpy r0,r2 ;rp0="pow *= x" even: lsr r4,1 br r4=0,done ;if (n>>=1) then ... else done drmpy r2,r2 ;r1="x *= x" br cont ;continue loop until done D 5 done: ret r11,r11 ;return the result E 5 I 5 done: ret LINK,LINK ;return the result E 5 ; ; error checking ; toobig: ;loads values into error structure in case user ;wishes to do more with them than we have done D 5 store r11,r14,0 ;save old return E 5 I 5 store LINK,r14,0 ;save old return #ifndef ARGSINREGS E 5 store r15,r14,8 ;save old frame pointer move r15,r14 I 5 #endif E 5 laddr r14,r14,e_size ;update stack I 5 #ifdef ARGSINREGS stored r0,r14,pe_size+e_arg1 ;load arg's value into error structure laddr r2,name,L ;name of offending routine store r2,r14,pe_size+e_name ; into error structure #else E 5 stored r0,r15,e_arg1 ;load arg's value into error structure laddr r2,name,L ;name of offending routine store r2,r15,e_name ; into error structure I 5 #endif E 5 move r3,DOMAIN ;exception type I 5 #ifdef ARGSINREGS store r3,r14,pe_size+e_type #else E 5 store r3,r15,e_type I 5 #endif E 5 laddr r0,INF1,L laddr r1,0 D 5 stored r0,r15,e_retval ;return infinity E 5 I 5 #ifdef ARGSINREGS stored r0,r14,pe_size+e_retval ;return infinity laddr r0,r14,pe_size+e_type ;user want to do different anything with error? #else stored r0,r15,e_retval ;return infinity E 5 laddr r4,r15,e_type ;user want to do different anything with error? store r4,r14,arg1 ;gives matherr the address of error structure D 5 call r11,_matherr,L ;matherr is a function for user to define E 5 I 5 #endif call LINK,_matherr,L ;matherr is a function for user to define E 5 br r0<>0,err_rtn ;yes (assume user will change r0 if yes ) mess: ;prints out our error message I 5 #ifdef ARGSINREGS E 5 move r0,2 I 5 laddr r1,emess,L laddr r2,messlen #else move r0,2 E 5 store r0,r14,arg1 laddr r5,emess,L store r5,r14,arg2 ;gives message laddr r0,messlen store r0,r14,arg3 ;gives length of message D 5 call r11,_write,L ;writes out message E 5 I 5 #endif call LINK,_write,L ;writes out message E 5 laddr r0,EDOM ;sets global variable _errno for user store r0,_errno,L laddr r0,INF1,L laddr r1,0 br err_rtn nanorinf: laddr r1,INF2,L ;rp0="inf" drcomp r0,r2 br r0<>0,nan ;if !inf then nan else ... inf: ;writes message and returns inf D 5 store r11,r14,0 ;save old return E 5 I 5 store LINK,r14,0 ;save old return #ifndef ARGSINREGS E 5 store r15,r14,8 ;save old frame pointer move r15,r14 I 5 #endif E 5 laddr r14,r14,e_size ;update stack D 5 E 5 I 5 #ifdef ARGSINREGS E 5 move r0,2 ;to print I 5 laddr r1,infmess,L laddr r2,inflen #else move r0,2 ;to print E 5 store r0,r14,arg1 laddr r5,infmess,L store r5,r14,arg2 ;gives write the message laddr r0,inflen store r0,r14,arg3 ;gives write the length of message D 5 call r11,_write,L E 5 I 5 #endif call LINK,_write,L E 5 laddr r0,07ff00000h,L laddr r1,0 ;returns inf br err_rtn nan: ;writes message and returns the nan arg D 5 store r11,r14,0 ;save old return E 5 I 5 store LINK,r14,0 ;save old return #ifndef ARGSINREGS E 5 store r15,r14,8 ;save old frame pointer move r15,r14 I 5 #endif E 5 laddr r14,r14,e_size ;update stack D 5 stored r0,r14,arg_1 ;save arg E 5 I 5 stored r2,r14,arg_1 ;save arg E 5 I 5 #ifdef ARGSINREGS E 5 move r0,2 ;to print I 5 laddr r1,nanmess,L laddr r2,nanlen #else move r0,2 ;to print E 5 store r0,r14,arg1 laddr r5,nanmess,L store r5,r14,arg2 ;gives write the message laddr r0,nanlen store r0,r14,arg3 ;gives write the length of message D 5 call r11,_write,L E 5 I 5 #endif call LINK,_write,L E 5 loadd r0,r14,arg_1 ;restore arg to rp0 err_rtn: I 5 #ifdef ARGSINREGS laddr r14,r14,pe_size #else E 5 move r14,r15 ;re-updates the stack load r15,r14,8 ;resets old frame pointer D 5 load r11,r14,0 ;resets old return ret r11,r11 E 5 I 5 #endif load LINK,r14,0 ;resets old return ret LINK,LINK E 5 E 1 h50832 s 00001/00001/00023 d D 4.2 87/05/13 17:39:31 build 5 4 c removed old SCCS strings and inserted #ident BB e s 00000/00000/00024 d D 4.1 87/02/17 08:29:11 mth 4 3 c rolled rev to -r4 (mth) e s 00000/00000/00024 d D 3.1 87/01/21 16:55:19 mkm 3 2 c e s 00000/00000/00024 d D 2.1 87/01/21 16:51:52 mkm 2 1 c e s 00024/00000/00000 d D 1.1 87/01/21 16:47:04 mkm 1 0 c Placed under source control - mkm c These files are direct descendants of the ROS files c by the same name at or about ROS rev 5.2 e u U f b f n t T I 1 D 5 /* "%W% %E%" */ E 5 I 5 #ident " %W% %E% " E 5 short pow_hh(ap, bp) short *ap, *bp; { short pow, x, n; pow = 1; x = *ap; n = *bp; if(n < 0) { } else if(n > 0) for( ; ; ) { if(n & 01) pow *= x; if(n >>= 1) x *= x; else break; } return(pow); } E 1 h37333 s 00001/00001/00105 d D 4.2 87/05/13 17:39:45 build 5 4 c removed old SCCS strings and inserted #ident BB e s 00000/00000/00106 d D 4.1 87/02/17 08:29:13 mth 4 3 c rolled rev to -r4 (mth) e s 00000/00000/00106 d D 3.1 87/01/21 16:55:20 mkm 3 2 c e s 00000/00000/00106 d D 2.1 87/01/21 16:51:53 mkm 2 1 c e s 00106/00000/00000 d D 1.1 87/01/21 16:47:05 mkm 1 0 c Placed under source control - mkm c These files are direct descendants of the ROS files c by the same name at or about ROS rev 5.2 e u U f b f n t T I 1 D 5 /* "%W% %E%" */ E 5 I 5 #ident " %W% %E% " E 5 /* * Corrections by Robert P. Corbett, 1983 March 2 * Revised to restore portability, 1983 March 4 */ long int pow_ii(ap, bp) long int *ap, *bp; { register long int pow, x, n; int zero = 0; pow = 1; x = *ap; n = *bp; if (n == 0) return ( 1L ); if (x == 0) return ( 0L ); if (x == 1) return ( 1L ); if (x == -1) { if (n < 0) { if (n < -2) n += 2; n = -n; } if (n % 2 == 0) return ( 1L ); else return ( -1L ); } if (n > 0) for( ; ; ) { if(n & 01) pow *= x; if(n >>= 1) x *= x; else break; } else pow = 0; return(pow); } long int Pow_ii(ap, bp) long int ap, bp; { register long int pow, x, n; int zero = 0; pow = 1; x = ap; n = bp; if (n == 0) return ( 1L ); if (x == 0) return ( 0L ); if (x == 1) return ( 1L ); if (x == -1) { if (n < 0) { if (n < -2) n += 2; n = -n; } if (n % 2 == 0) return ( 1L ); else return ( -1L ); } if (n > 0) for( ; ; ) { if(n & 01) pow *= x; if(n >>= 1) x *= x; else break; } else pow = 0; return(pow); } E 1 h45659 s 00002/00000/00241 d D 4.3 87/04/16 16:23:55 build 6 5 c Profiling changes e s 00065/00013/00176 d D 4.2 87/02/17 08:43:23 mth 5 4 c Parateters in registers. e s 00000/00000/00189 d D 4.1 87/02/17 08:29:15 mth 4 3 c rolled rev to -r4 (mth) e s 00000/00000/00189 d D 3.1 87/01/21 16:55:21 mkm 3 2 c e s 00000/00000/00189 d D 2.1 87/01/21 16:51:55 mkm 2 1 c e s 00189/00000/00000 d D 1.1 87/01/21 16:47:06 mkm 1 0 c Placed under source control - mkm c These files are direct descendants of the ROS files c by the same name at or about ROS rev 5.2 e u U f b f n t T I 1 ; "%W% %E%" dsect data name byte 'pow',0 ;name of routine emess0 byte 'pow: SING error\n',0 ;error message if base=0 mess0len equ 16 ;length of emess0 emess byte 'pow: DOMAIN error\n',0 ;error message if base or pow ;is too big messlen equ 18 ;length of emess nanmess byte 'pow: input value was NAN\n',0 ;error message if nan nanlen equ 25 infmess byte 'pow: input value was INF\n',0 ;error message if "infinity" inflen equ 25 csect code align 2 externd _errno external _write external _matherr e_type equ -32 ;exception type e_name equ -28 ;name of routine in error e_arg1 equ -24 ;argument 1 e_arg2 equ -16 ;argument 2 (if present) e_retval equ -8 ;room for exception block e_size equ -80 ; plus stack frame with 3 parameters I 5 pe_size equ 80 ; positive e_size E 5 DOMAIN equ 1 SING equ 2 OVERFLOW equ 3 UNDERFLOW equ 4 TLOSS equ 5 PLOSS equ 6 EDOM equ 33 ERANGE equ 34 csect code ONE equ 03f800000h ;equals 1.0 INF equ 07f800000h ;equals "infinity" LIMIT1 equ 050000000h ;equals upper word of bases whic are too big LIMIT2 equ 0000002c6h ;equals the two's complement form of 710 arg3 equ 40 arg2 equ 32 arg1 equ 24 arg_1 equ -8 global _pow_ri global _Pow_ri _pow_ri: I 6 ; MCOUNT E 6 I 5 #ifdef ARGSINREGS load r2,r1 load r1,r0 #else E 5 load r1,r14,arg1 load r1,r1,0 ;get "base" = "x" load r2,r14,arg2 load r2,r2,0 ;get power to raise the base to (ie "pow")="n" I 5 #endif E 5 ; ; added code for GreenHills: ; br doit _Pow_ri: I 6 ; MCOUNT E 6 I 5 #ifdef ARGSINREGS move r2,r1 move r1,r0 #else E 5 load r1,r14,arg1 load r2,r14,arg2 I 5 #endif E 5 doit: ; ; done with GreenHills changes ; laddr r0,INF,L br r1>=r0,nanorinf ;if base = nan or inf then nanorinf br r1<>0,notzero! ;if base = 0 return 0 move r0,0 D 5 ret r11,r11 E 5 I 5 ret LINK,LINK E 5 notzero: laddr r0,LIMIT1,L br r1>=r0,toobig ;if base >=LIMIT then toobig else ... laddr r0,LIMIT2,L br r2>=r0,toobig ;if pow > 710 then toobig else ... laddr r0,ONE,L ;r0="pow=1" br r2=0,done ;if (n!=0) then ... else done (returns 1) br r2>0,cont ;if (n<0) then ... else continue br r1=0,done ;if ((n<0) & (x==0)) then done (returns 1) else neg r2,r2 ;r2="n=-n" laddr r3,ONE,L rdiv r3,r1 move r1,r3 ;r1="x=1/x" cont: laddr r3,1 and r3,r2 br r3=0,even ;if (n & 01) then ... else even rmpy r0,r1 ;r0="pow *= x" even: lsr r2,1 br r2=0,done ;if (n>>=1) then ... else done rmpy r1,r1 ;r1="x *= x" br cont ;continue loop until done D 5 done: ret r11,r11 ;return the result E 5 I 5 done: ret LINK,LINK ;return the result E 5 ; ; error checking ; toobig: ;loads values into error structure in case user ;wishes to do more with them than we have done D 5 store r11,r14,0 ;save old return E 5 I 5 store LINK,r14,0 ;save old return #ifndef ARGSINREGS E 5 store r15,r14,8 ;save old frame pointer move r15,r14 I 5 #endif E 5 laddr r14,r14,e_size ;update stack I 5 #ifdef ARGSINREGS store r0,r14,pe_size+e_arg1 ;load arg's value into error structure laddr r2,name,L ;name of offending routine store r2,r14,pe_size+e_name ; into error structure move r3,DOMAIN ;exception type store r3,r14,pe_size+e_type laddr r0,INF,L store r0,r14,pe_size+e_retval ;return infinity laddr r0,r14,pe_size+e_type ;user want to do different ; anything with error? #else E 5 store r0,r15,e_arg1 ;load arg's value into error structure laddr r2,name,L ;name of offending routine store r2,r15,e_name ; into error structure D 5 E 5 move r3,DOMAIN ;exception type store r3,r15,e_type laddr r0,INF,L store r0,r15,e_retval ;return infinity D 5 E 5 laddr r4,r15,e_type ;user want to do different anything with error? store r4,r14,arg1 ;gives matherr the address of error structure D 5 call r11,_matherr,L ;matherr is a function for user to define E 5 I 5 #endif call LINK,_matherr,L ;matherr is a function for user to define E 5 br r0<>0,err_rtn ;yes (assume user will change r0 if yes ) mess: ;prints out our error message I 5 #ifdef ARGSINREGS E 5 move r0,2 I 5 laddr r1,emess,L laddr r2,messlen #else move r0,2 E 5 store r0,r14,arg1 laddr r5,emess,L store r5,r14,arg2 ;gives message laddr r0,messlen store r0,r14,arg3 ;gives length of message D 5 call r11,_write,L ;writes out message E 5 I 5 #endif call LINK,_write,L ;writes out message E 5 laddr r0,EDOM ;sets global variable _errno for user store r0,_errno,L laddr r0,INF,L br err_rtn nanorinf: br r0dreal = 1; p->dimag = 0; if(n == 0) return; if(n < 0) { n = -n; z_div(&x, p, a); } else { x.dreal = a->dreal; x.dimag = a->dimag; } for( ; ; ) { if(n & 01) { t = p->dreal * x.dreal - p->dimag * x.dimag; p->dimag = p->dreal * x.dimag + p->dimag * x.dreal; p->dreal = t; } if(n >>= 1) { t = x.dreal * x.dreal - x.dimag * x.dimag; x.dimag = 2 * x.dreal * x.dimag; x.dreal = t; } else break; } } E 1 h62801 s 00001/00001/00017 d D 4.2 87/05/13 17:40:13 build 5 4 c removed old SCCS strings and inserted #ident BB e s 00000/00000/00018 d D 4.1 87/02/17 08:29:19 mth 4 3 c rolled rev to -r4 (mth) e s 00000/00000/00018 d D 3.1 87/01/21 16:55:24 mkm 3 2 c e s 00000/00000/00018 d D 2.1 87/01/21 16:51:58 mkm 2 1 c e s 00018/00000/00000 d D 1.1 87/01/21 16:47:08 mkm 1 0 c Placed under source control - mkm c These files are direct descendants of the ROS files c by the same name at or about ROS rev 5.2 e u U f b f n t T I 1 D 5 /* "%W% %E%" */ E 5 I 5 #ident " %W% %E% " E 5 #include "complex" pow_zz(r,a,b) dcomplex *r, *a, *b; { double logr, logi, x, y; double log(), exp(), cos(), sin(), atan2(), cabs(); logr = log( cabs(a->dreal, a->dimag) ); logi = atan2(a->dimag, a->dreal); x = exp( logr * b->dreal - logi * b->dimag ); y = logr * b->dimag + logi * b->dreal; r->dreal = x * cos(y); r->dimag = x * sin(y); } E 1 h59153 s 00002/00000/00019 d D 4.3 87/04/16 16:23:57 build 6 5 c Profiling changes e s 00005/00001/00014 d D 4.2 87/02/17 08:43:25 mth 5 4 c Parateters in registers. e s 00000/00000/00015 d D 4.1 87/02/17 08:29:21 mth 4 3 c rolled rev to -r4 (mth) e s 00000/00000/00015 d D 3.1 87/01/21 16:55:24 mkm 3 2 c e s 00000/00000/00015 d D 2.1 87/01/21 16:51:59 mkm 2 1 c e s 00015/00000/00000 d D 1.1 87/01/21 16:47:09 mkm 1 0 c Placed under source control - mkm c These files are direct descendants of the ROS files c by the same name at or about ROS rev 5.2 e u U f b f n t T I 1 ; "%W% %E%" ; ; double precision absolute value ; arg1 equ 24 global _r_abs global _R_abs _r_abs: I 6 ; MCOUNT E 6 I 5 #ifdef ARGSINREGS load r0,r0,0 ; r0 = arg1 #else E 5 load r2,r14,arg1 load r0,r2,0 ; r0 = arg1 I 5 #endif E 5 _R_abs: I 6 ; MCOUNT E 6 lsli r0,1 lsri r0,1 D 5 ret r11,r11 E 5 I 5 ret LINK,LINK E 5 E 1 2 h41432 s 00001/00001/00005 d D 4.2 87/05/13 17:40:33 build 5 4 c removed old SCCS strings and inserted #ident BB e s 00000/00000/00006 d D 4.1 87/02/17 08:29:24 mth 4 3 c rolled rev to -r4 (mth) e s 00000/00000/00006 d D 3.1 87/01/21 16:55:26 mkm 3 2 c e s 00000/00000/00006 d D 2.1 87/01/21 16:52:02 mkm 2 1 c e s 00006/00000/00000 d D 1.1 87/01/21 16:47:11 mkm 1 0 c Placed under source control - mkm c These files are direct descendants of the ROS files c by the same name at or about ROS rev 5.2 e u U f b f n t T I 1 D 5 /* "%W% %E%" */ E 5 I 5 #ident " %W% %E% " E 5 double r_dim(a,b) float *a, *b; { return( *a > *b ? *a - *b : 0); } E 1 h42640 s 00001/00001/00007 d D 4.2 87/05/13 17:40:42 build 5 4 c removed old SCCS strings and inserted #ident BB e s 00000/00000/00008 d D 4.1 87/02/17 08:29:26 mth 4 3 c rolled rev to -r4 (mth) e s 00000/00000/00008 d D 3.1 87/01/21 16:55:27 mkm 3 2 c e s 00000/00000/00008 d D 2.1 87/01/21 16:52:02 mkm 2 1 c e s 00008/00000/00000 d D 1.1 87/01/21 16:47:12 mkm 1 0 c Placed under source control - mkm c These files are direct descendants of the ROS files c by the same name at or about ROS rev 5.2 e u U f b f n t T I 1 D 5 /* "%W% %E%" */ E 5 I 5 #ident " %W% %E% " E 5 #include "complex" double r_imag(z) complex *z; { return(z->imag); } E 1 h43772 s 00001/00001/00007 d D 4.2 87/05/13 17:40:51 build 5 4 c removed old SCCS strings and inserted #ident BB e s 00000/00000/00008 d D 4.1 87/02/17 08:29:28 mth 4 3 c rolled rev to -r4 (mth) e s 00000/00000/00008 d D 3.1 87/01/21 16:55:28 mkm 3 2 c e s 00000/00000/00008 d D 2.1 87/01/21 16:52:03 mkm 2 1 c e s 00008/00000/00000 d D 1.1 87/01/21 16:47:12 mkm 1 0 c Placed under source control - mkm c These files are direct descendants of the ROS files c by the same name at or about ROS rev 5.2 e u U f b f n t T I 1 D 5 /* "%W% %E%" */ E 5 I 5 #ident " %W% %E% " E 5 double r_int(x) float *x; { double floor(); return( (*x>0) ? floor(*x) : -floor(- *x) ); } E 1 h65498 s 00001/00001/00025 d D 3.2 87/05/13 17:41:05 build 4 3 c removed old SCCS strings and inserted #ident BB e s 00000/00000/00026 d D 3.1 87/01/21 16:55:29 mkm 3 2 c e s 00000/00000/00026 d D 2.1 87/01/21 16:52:04 mkm 2 1 c e s 00026/00000/00000 d D 1.1 87/01/21 16:47:13 mkm 1 0 c Placed under source control - mkm c These files are direct descendants of the ROS files c by the same name at or about ROS rev 5.2 e u U f b f n t T I 1 D 4 /* "%W% %E%" */ E 4 I 4 #ident " %W% %E% " E 4 double r_mod(x,y) float *x, *y; { double floor(), quotient; if( (quotient = *x / *y) >= 0) quotient = floor(quotient); else quotient = -floor(-quotient); return(*x - (*y) * quotient ); } /* * Same as r_mod, but called by value */ float R_mod(x,y) float x, y; { double floor(), quotient; if( (quotient = x / y) >= 0) quotient = floor(quotient); else quotient = -floor(-quotient); return(x - y * quotient ); } E 1 h57417 s 00001/00001/00009 d D 4.3 87/05/13 17:41:22 build 6 5 c removed old SCCS strings and inserted #ident BB e s 00003/00002/00007 d D 4.2 87/02/17 08:43:30 mth 5 4 c Parateters in registers. e s 00000/00000/00009 d D 4.1 87/02/17 08:29:31 mth 4 3 c rolled rev to -r4 (mth) e s 00000/00000/00009 d D 3.1 87/01/21 16:55:30 mkm 3 2 c e s 00000/00000/00009 d D 2.1 87/01/21 16:52:05 mkm 2 1 c e s 00009/00000/00000 d D 1.1 87/01/21 16:47:14 mkm 1 0 c Placed under source control - mkm c These files are direct descendants of the ROS files c by the same name at or about ROS rev 5.2 e u U f b f n t T I 1 D 6 /* "%W% %E%" */ E 6 I 6 #ident " %W% %E% " E 6 double r_nint(x) float *x; { double floor(); I 5 register float tmpx = *x; E 5 D 5 return( (*x)>=0 ? floor(*x + .5) : -floor(.5 - *x) ); E 5 I 5 return( (tmpx)>=0 ? floor(tmpx + .5) : -floor(.5 - tmpx) ); E 5 } E 1 h43513 s 00001/00001/00007 d D 4.2 87/05/13 17:41:33 build 5 4 c removed old SCCS strings and inserted #ident BB e s 00000/00000/00008 d D 4.1 87/02/17 08:29:33 mth 4 3 c rolled rev to -r4 (mth) e s 00000/00000/00008 d D 3.1 87/01/21 16:55:31 mkm 3 2 c e s 00000/00000/00008 d D 2.1 87/01/21 16:52:06 mkm 2 1 c e s 00008/00000/00000 d D 1.1 87/01/21 16:47:15 mkm 1 0 c Placed under source control - mkm c These files are direct descendants of the ROS files c by the same name at or about ROS rev 5.2 e u U f b f n t T I 1 D 5 /* "%W% %E%" */ E 5 I 5 #ident " %W% %E% " E 5 double r_sign(a,b) float *a, *b; { float x; x = (*a >= 0 ? *a : - *a); return( *b >= 0 ? x : -x); } E 1 h63618 s 00001/00001/00022 d D 4.2 87/05/13 17:41:47 build 5 4 c removed old SCCS strings and inserted #ident BB e s 00000/00000/00023 d D 4.1 87/02/17 08:29:34 mth 4 3 c rolled rev to -r4 (mth) e s 00000/00000/00023 d D 3.1 87/01/21 16:55:32 mkm 3 2 c e s 00000/00000/00023 d D 2.1 87/01/21 16:52:07 mkm 2 1 c e s 00023/00000/00000 d D 1.1 87/01/21 16:47:16 mkm 1 0 c Placed under source control - mkm c These files are direct descendants of the ROS files c by the same name at or about ROS rev 5.2 e u U f b f n t T I 1 D 5 /* "%W% %E%" */ E 5 I 5 #ident " %W% %E% " E 5 /* Uniform random number generator. Linear congruential generator, suitable for 32 bit machines; multiplication is mod 2**31 */ static long randx = 1; srand_(x) /* subroutine to set seed */ long *x; { randx = *x; } double rand_() { double ldexp(); return(ldexp((double)(((randx = randx*1103515245 + 12345)>>7) & 077777777), -24)); } E 1 h13362 s 00001/00001/00024 d D 4.2 87/05/13 17:42:05 build 5 4 c removed old SCCS strings and inserted #ident BB e s 00000/00000/00025 d D 4.1 87/02/17 08:29:36 mth 4 3 c rolled rev to -r4 (mth) e s 00000/00000/00025 d D 3.1 87/01/21 16:55:33 mkm 3 2 c e s 00000/00000/00025 d D 2.1 87/01/21 16:52:08 mkm 2 1 c e s 00025/00000/00000 d D 1.1 87/01/21 16:47:17 mkm 1 0 c Placed under source control - mkm c These files are direct descendants of the ROS files c by the same name at or about ROS rev 5.2 e u U f b f n t T I 1 D 5 /* "%W% %E%" */ E 5 I 5 #ident " %W% %E% " E 5 /* * * find last occurrence of substring in string * * calling sequence: * character*(*) substr, string * indx = rindex (string, substr) * where: * indx will be the index of the first character of the last occurence * of substr in string, or zero if not found. */ long rindex_(str, substr, slen, sublen) char *str, *substr; long slen, sublen; { register char *p = str + (slen - sublen); while (p >= str) if (s_cmp(substr, p, sublen, slen) == 0) return((long)(++p - str)); else p--; return(0L); } E 1 h55413 s 00001/00001/00021 d D 4.2 87/05/13 17:42:16 build 5 4 c removed old SCCS strings and inserted #ident BB e s 00000/00000/00022 d D 4.1 87/02/17 08:29:38 mth 4 3 c rolled rev to -r4 (mth) e s 00000/00000/00022 d D 3.1 87/01/21 16:55:34 mkm 3 2 c e s 00000/00000/00022 d D 2.1 87/01/21 16:52:09 mkm 2 1 c e s 00022/00000/00000 d D 1.1 87/01/21 16:47:18 mkm 1 0 c Placed under source control - mkm c These files are direct descendants of the ROS files c by the same name at or about ROS rev 5.2 e u U f b f n t T I 1 D 5 /* "%W% %E%" */ E 5 I 5 #ident " %W% %E% " E 5 s_cat(lp, rpp, rnp, np, ll) char *lp, *rpp[]; long int rnp[], *np, ll; { int i, n, nc; char *rp; n = *np; for(i = 0 ; i < n ; ++i) { nc = ll; if(rnp[i] < nc) nc = rnp[i]; ll -= nc; rp = rpp[i]; while(--nc >= 0) *lp++ = *rp++; } while(--ll >= 0) *lp++ = ' '; } E 1 h03015 s 00001/00001/00036 d D 4.2 87/05/13 17:42:30 build 5 4 c removed old SCCS strings and inserted #ident BB e s 00000/00000/00037 d D 4.1 87/02/17 08:29:40 mth 4 3 c rolled rev to -r4 (mth) e s 00000/00000/00037 d D 3.1 87/01/21 16:55:35 mkm 3 2 c e s 00000/00000/00037 d D 2.1 87/01/21 16:52:10 mkm 2 1 c e s 00037/00000/00000 d D 1.1 87/01/21 16:47:18 mkm 1 0 c Placed under source control - mkm c These files are direct descendants of the ROS files c by the same name at or about ROS rev 5.2 e u U f b f n t T I 1 D 5 /* "%W% %E%" */ E 5 I 5 #ident " %W% %E% " E 5 int s_cmp(a, b, la, lb) /* compare two strings */ register char *a, *b; long int la, lb; { register char *aend, *bend; aend = a + la; bend = b + lb; if(la <= lb) { while(a < aend) if(*a != *b) return( *a - *b ); else { ++a; ++b; } while(b < bend) if(*b != ' ') return( ' ' - *b ); else ++b; } else { while(b < bend) if(*a == *b) { ++a; ++b; } else return( *a - *b ); while(a < aend) if(*a != ' ') return(*a - ' '); else ++a; } return(0); } E 1 h53795 s 00001/00001/00021 d D 4.2 87/05/13 17:42:42 build 5 4 c removed old SCCS strings and inserted #ident BB e s 00000/00000/00022 d D 4.1 87/02/17 08:29:43 mth 4 3 c rolled rev to -r4 (mth) e s 00000/00000/00022 d D 3.1 87/01/21 16:55:36 mkm 3 2 c e s 00000/00000/00022 d D 2.1 87/01/21 16:52:11 mkm 2 1 c e s 00022/00000/00000 d D 1.1 87/01/21 16:47:20 mkm 1 0 c Placed under source control - mkm c These files are direct descendants of the ROS files c by the same name at or about ROS rev 5.2 e u U f b f n t T I 1 D 5 /* "%W% %E%" */ E 5 I 5 #ident " %W% %E% " E 5 s_copy(a, b, la, lb) /* assign strings: a = b */ char *a, *b; long int la, lb; { char *aend, *bend; aend = a + la; if(la <= lb) while(a < aend) *a++ = *b++; else { bend = b + lb; while(b < bend) *a++ = *b++; while(a < aend) *a++ = ' '; } } E 1 h27342 s 00001/00001/00044 d D 4.2 87/05/13 17:42:58 build 5 4 c removed old SCCS strings and inserted #ident BB e s 00000/00000/00045 d D 4.1 87/02/17 08:29:44 mth 4 3 c rolled rev to -r4 (mth) e s 00000/00000/00045 d D 3.1 87/01/21 16:55:37 mkm 3 2 c e s 00000/00000/00045 d D 2.1 87/01/21 16:52:12 mkm 2 1 c e s 00045/00000/00000 d D 1.1 87/01/21 16:47:21 mkm 1 0 c Placed under source control - mkm c These files are direct descendants of the ROS files c by the same name at or about ROS rev 5.2 e u U f b f n t T I 1 D 5 /* "%W% %E%" */ E 5 I 5 #ident " %W% %E% " E 5 #include #define PAUSESIG 15 s_paus(s, n) char *s; long int n; { int i; int waitpause(); fprintf(stderr, "PAUSE "); if(n > 0) for(i = 0; i #define abort() {fprintf(stderr,"abort\n"); exit(1);} /* called when a subscript is out of range */ s_rnge(varn, offset, procn, line) char *varn, *procn; long int offset; int line; { register int i; fprintf(stderr, "Subscript out of range on file line %d, procedure ", line); for(i = 0 ; i < 8 && *procn!='_' ; ++i) putc(*procn++, stderr); fprintf(stderr, ".\nAttempt to access the %ld-th element of variable ", offset+1); D 5 for(i = 0 ; i < 6 && *varn!=' ' ; ++i) E 5 I 5 for(i = 0 ; i < 6 && *varn!=' ' && *varn!='\0'; ++i) E 5 putc(*varn++, stderr); fprintf(stderr, ".\n"); _cleanup(); abort(); } E 1 h53125 s 00001/00001/00018 d D 4.2 87/05/13 17:43:25 build 5 4 c removed old SCCS strings and inserted #ident BB e s 00000/00000/00019 d D 4.1 87/02/17 08:29:48 mth 4 3 c rolled rev to -r4 (mth) e s 00000/00000/00019 d D 3.1 87/01/21 16:55:39 mkm 3 2 c e s 00000/00000/00019 d D 2.1 87/01/21 16:52:14 mkm 2 1 c e s 00019/00000/00000 d D 1.1 87/01/21 16:47:22 mkm 1 0 c Placed under source control - mkm c These files are direct descendants of the ROS files c by the same name at or about ROS rev 5.2 e u U f b f n t T I 1 D 5 /* "%W% %E%" */ E 5 I 5 #ident " %W% %E% " E 5 #include s_stop(s, n) char *s; long int n; { int i; if(n > 0) { fprintf(stderr, "STOP "); for(i = 0; i typedef int (*F7_PTRFONC)(); F7_PTRFONC F7_SIG[30]; int F7_numsig; signal_(sigp, procp) int *sigp, (*procp)(); { int F7_trtsig(); if (*sigp == SIGFPE) { F7_SIG[SIGREALOVER] = procp; F7_SIG[SIGREALUNDER] = procp; F7_SIG[SIGREALDIVZERO] = procp; F7_SIG[SIGREALINV] = procp; signal(SIGREALOVER, F7_trtsig); signal(SIGREALUNDER, F7_trtsig); signal(SIGREALDIVZERO, F7_trtsig); signal(SIGREALINV, F7_trtsig); } else { F7_SIG[*sigp] = procp; signal(*sigp, F7_trtsig); } } F7_trtsig(code) int code; { F7_numsig = code; signal(code, F7_trtsig); F7_SIG[code](&F7_numsig); } E 1 h12317 s 00001/00001/00020 d D 4.2 87/05/13 17:43:57 build 5 4 c removed old SCCS strings and inserted #ident BB e s 00000/00000/00021 d D 4.1 87/02/17 08:29:53 mth 4 3 c rolled rev to -r4 (mth) e s 00000/00000/00021 d D 3.1 87/01/21 16:55:42 mkm 3 2 c e s 00000/00000/00021 d D 2.1 87/01/21 16:52:17 mkm 2 1 c e s 00021/00000/00000 d D 1.1 87/01/21 16:47:25 mkm 1 0 c Placed under source control - mkm c These files are direct descendants of the ROS files c by the same name at or about ROS rev 5.2 e u U f b f n t T I 1 D 5 /* "%W% %E%" */ E 5 I 5 #ident " %W% %E% " E 5 #include #define abort() {fprintf(stderr,"abort\n"); exit(1);} subout(varn, offset, procn, line) char *varn, *procn; long int offset; int line; { register int i; fprintf(stderr, "Subscript out of range on line %d of procedure ", line); for(i = 0 ; i < 8 && *procn!='_' ; ++i) putc(*procn++, stderr); fprintf(stderr, ".\nAttempt to access the %ld-th element of variable ", offset+1); for(i = 0 ; i < 6 && *varn!=' ' ; ++i) putc(*varn++, stderr); fprintf(stderr, ".\n"); _cleanup(); abort(); } E 1 h55474 s 00001/00001/00016 d D 4.2 87/05/13 17:44:12 build 5 4 c removed old SCCS strings and inserted #ident BB e s 00000/00000/00017 d D 4.1 87/02/17 08:29:55 mth 4 3 c rolled rev to -r4 (mth) e s 00000/00000/00017 d D 3.1 87/01/21 16:55:43 mkm 3 2 c e s 00000/00000/00017 d D 2.1 87/01/21 16:52:18 mkm 2 1 c e s 00017/00000/00000 d D 1.1 87/01/21 16:47:25 mkm 1 0 c Placed under source control - mkm c These files are direct descendants of the ROS files c by the same name at or about ROS rev 5.2 e u U f b f n t T I 1 D 5 /* "%W% %E%" */ E 5 I 5 #ident " %W% %E% " E 5 /* f77 interface to system routine */ system_(s, n) register char *s; long int n; { char buff[1000]; register char *bp, *blast; blast = buff + (n<1000 ? n : 1000L); for(bp = buff ; bpdreal, z->dimag ) ); } E 1 h50732 s 00001/00001/00010 d D 4.2 87/05/13 17:44:32 build 5 4 c removed old SCCS strings and inserted #ident BB e s 00000/00000/00011 d D 4.1 87/02/17 08:29:59 mth 4 3 c rolled rev to -r4 (mth) e s 00000/00000/00011 d D 3.1 87/01/21 16:55:47 mkm 3 2 c e s 00000/00000/00011 d D 2.1 87/01/21 16:52:21 mkm 2 1 c e s 00011/00000/00000 d D 1.1 87/01/21 16:47:27 mkm 1 0 c Placed under source control - mkm c These files are direct descendants of the ROS files c by the same name at or about ROS rev 5.2 e u U f b f n t T I 1 D 5 /* "%W% %E%" */ E 5 I 5 #ident " %W% %E% " E 5 #include "complex" z_cos(r, z) dcomplex *r, *z; { double sin(), cos(), sinh(), cosh(); r->dreal = cos(z->dreal) * cosh(z->dimag); r->dimag = - sin(z->dreal) * sinh(z->dimag); } E 1 h27284 s 00001/00001/00033 d D 4.2 87/05/13 17:44:48 build 5 4 c removed old SCCS strings and inserted #ident BB e s 00000/00000/00034 d D 4.1 87/02/17 08:30:01 mth 4 3 c rolled rev to -r4 (mth) e s 00000/00000/00034 d D 3.1 87/01/21 16:55:48 mkm 3 2 c e s 00000/00000/00034 d D 2.1 87/01/21 16:52:22 mkm 2 1 c e s 00034/00000/00000 d D 1.1 87/01/21 16:47:28 mkm 1 0 c Placed under source control - mkm c These files are direct descendants of the ROS files c by the same name at or about ROS rev 5.2 e u U f b f n t T I 1 D 5 /* "%W% %E%" */ E 5 I 5 #ident " %W% %E% " E 5 #include #define abort() {fprintf(stderr,"abort: complex division by zero\n"); exit(1);} struct dcomplex { double dreal, dimag; }; z_div(c, a, b) struct dcomplex *a, *b, *c; { double ratio, den; double abr, abi; if( (abr = b->dreal) < 0.) abr = - abr; if( (abi = b->dimag) < 0.) abi = - abi; if( abr <= abi ) { if(abi == 0) abort(); /* fatal("complex division by zero"); */ ratio = b->dreal / b->dimag ; den = b->dimag * (1 + ratio*ratio); c->dreal = (a->dreal*ratio + a->dimag) / den; c->dimag = (a->dimag*ratio - a->dreal) / den; } else { ratio = b->dimag / b->dreal ; den = b->dreal * (1 + ratio*ratio); c->dreal = (a->dreal + a->dimag*ratio) / den; c->dimag = (a->dimag - a->dreal*ratio) / den; } } E 1 h51360 s 00001/00001/00012 d D 4.2 87/05/13 17:44:57 build 5 4 c removed old SCCS strings and inserted #ident BB e s 00000/00000/00013 d D 4.1 87/02/17 08:30:02 mth 4 3 c rolled rev to -r4 (mth) e s 00000/00000/00013 d D 3.1 87/01/21 16:55:49 mkm 3 2 c e s 00000/00000/00013 d D 2.1 87/01/21 16:52:23 mkm 2 1 c e s 00013/00000/00000 d D 1.1 87/01/21 16:47:28 mkm 1 0 c Placed under source control - mkm c These files are direct descendants of the ROS files c by the same name at or about ROS rev 5.2 e u U f b f n t T I 1 D 5 /* "%W% %E%" */ E 5 I 5 #ident " %W% %E% " E 5 #include "complex" z_exp(r, z) dcomplex *r, *z; { double expx; double exp(), cos(), sin(); expx = exp(z->dreal); r->dreal = expx * cos(z->dimag); r->dimag = expx * sin(z->dimag); } E 1 h49831 s 00001/00001/00010 d D 4.2 87/05/13 17:45:06 build 5 4 c removed old SCCS strings and inserted #ident BB e s 00000/00000/00011 d D 4.1 87/02/17 08:30:04 mth 4 3 c rolled rev to -r4 (mth) e s 00000/00000/00011 d D 3.1 87/01/21 16:55:50 mkm 3 2 c e s 00000/00000/00011 d D 2.1 87/01/21 16:52:24 mkm 2 1 c e s 00011/00000/00000 d D 1.1 87/01/21 16:47:29 mkm 1 0 c Placed under source control - mkm c These files are direct descendants of the ROS files c by the same name at or about ROS rev 5.2 e u U f b f n t T I 1 D 5 /* "%W% %E%" */ E 5 I 5 #ident " %W% %E% " E 5 #include "complex" z_log(r, z) dcomplex *r, *z; { double log(), cabs(), atan2(); r->dimag = atan2(z->dimag, z->dreal); r->dreal = log( cabs( z->dreal, z->dimag ) ); } E 1 h50640 s 00001/00001/00010 d D 4.2 87/05/13 17:45:16 build 5 4 c removed old SCCS strings and inserted #ident BB e s 00000/00000/00011 d D 4.1 87/02/17 08:30:06 mth 4 3 c rolled rev to -r4 (mth) e s 00000/00000/00011 d D 3.1 87/01/21 16:55:51 mkm 3 2 c e s 00000/00000/00011 d D 2.1 87/01/21 16:52:25 mkm 2 1 c e s 00011/00000/00000 d D 1.1 87/01/21 16:47:30 mkm 1 0 c Placed under source control - mkm c These files are direct descendants of the ROS files c by the same name at or about ROS rev 5.2 e u U f b f n t T I 1 D 5 /* "%W% %E%" */ E 5 I 5 #ident " %W% %E% " E 5 #include "complex" z_sin(r, z) dcomplex *r, *z; { double sin(), cos(), sinh(), cosh(); r->dreal = sin(z->dreal) * cosh(z->dimag); r->dimag = cos(z->dreal) * sinh(z->dimag); } E 1 h65463 s 00001/00001/00022 d D 4.2 87/05/13 17:45:32 build 5 4 c removed old SCCS strings and inserted #ident BB e s 00000/00000/00023 d D 4.1 87/02/17 08:30:08 mth 4 3 c rolled rev to -r4 (mth) e s 00000/00000/00023 d D 3.1 87/01/21 16:55:53 mkm 3 2 c e s 00000/00000/00023 d D 2.1 87/01/21 16:52:26 mkm 2 1 c e s 00023/00000/00000 d D 1.1 87/01/21 16:47:30 mkm 1 0 c Placed under source control - mkm c These files are direct descendants of the ROS files c by the same name at or about ROS rev 5.2 e u U f b f n t T I 1 D 5 /* "%W% %E%" */ E 5 I 5 #ident " %W% %E% " E 5 #include "complex" z_sqrt(r, z) dcomplex *r, *z; { double mag, sqrt(), cabs(); if( (mag = cabs(z->dreal, z->dimag)) == 0.) r->dreal = r->dimag = 0.; else if(z->dreal > 0) { r->dreal = sqrt(0.5 * (mag + z->dreal) ); r->dimag = z->dimag / r->dreal / 2; } else { r->dimag = sqrt(0.5 * (mag - z->dreal) ); if(z->dimag < 0) r->dimag = - r->dimag; r->dreal = z->dimag / r->dimag / 2; } } E 1 #ident " @(#)bit.h 3.2 87/05/13 " #define NBSI 16 /* # bits in short int */ #define NBLI 32 /* # bits in long int */ extern long F77mask[], *F77zmask; # " @(#)Makefile 4.11 87/04/16 " # # # libF77.a makefile # # # # LIB is the library's name ASFLAGS2 = -DARGSINREGS -DLINK=r15 DFLAGS = $(PROFLAG) FFLAGS2 = $(PROFLAG) PROFLAG = MCOUNT = LIBC_SRC = ../libc LIB = libF77.a PLIB = plibF77.a # DESTDIR is the directory where $(LIB)'s final form gets installed DESTDIR = $(SPX)/usr/lib PDESTDIR = $(SPX)/usr/lib/libp # Here we define a suffix rule for .f~.a, since there is no default definition. .f~.a: $(GET) $(GFLAGS) -p $< > $*.f $(F77) -c $(FFLAGS) $*.f ar rv $@ $*.o rm -f $*.[fo] .s~.a: $(GET) $(GFLAGS) -p $< > tmp.s $(M4) $(MCOUNT) tmp.s > $*.s $(AS) -I$(INC) $(ASFLAGS) $*.s $(AR) r $@ $*.o rm -f $*.[so] tmp.[os] .s.a: $(M4) $(MCOUNT) $*.s > tmp.s $(AS) -I$(INC) $(ASFLAGS) tmp.s mv tmp.o $*.o $(AR) r $@ $*.o rm -f $*.o tmp.[os] MISC = $(LIB)(main.o) \ $(LIB)(derf_.o) \ $(LIB)(derfc_.o) \ $(LIB)(ef1asc_.o) \ $(LIB)(ef1cmc_.o) \ $(LIB)(erf_.o) \ $(LIB)(outstr_.o) \ $(LIB)(s_rnge.o) \ $(LIB)(abort_.o) \ $(LIB)(getarg_.o) \ $(LIB)(iargc_.o) \ $(LIB)(getenv_.o) \ $(LIB)(signal_.o) \ $(LIB)(s_stop.o) \ $(LIB)(s_paus.o) \ $(LIB)(system_.o) \ $(LIB)(mclock_.o) \ $(LIB)(subout.o) \ $(LIB)(exit_.o) \ $(LIB)(mvbits.o) \ $(LIB)(loc_.o) \ $(LIB)(fdate_.o) POW = $(LIB)(pow_ci.o) \ $(LIB)(pow_hh.o) \ $(LIB)(pow_ii.o) \ $(LIB)(pow_zi.o) \ $(LIB)(pow_zz.o) CX = $(LIB)(c_abs.o) \ $(LIB)(c_cos.o) \ $(LIB)(c_div.o) \ $(LIB)(c_exp.o) \ $(LIB)(c_log.o) \ $(LIB)(c_sin.o) \ $(LIB)(c_sqrt.o) DCX = $(LIB)(z_abs.o) \ $(LIB)(z_cos.o) \ $(LIB)(z_div.o) \ $(LIB)(z_exp.o) \ $(LIB)(z_log.o) \ $(LIB)(z_sin.o) \ $(LIB)(z_sqrt.o) REAL = $(LIB)(r_cnjg.o) \ $(LIB)(r_dim.o) \ $(LIB)(r_imag.o) \ $(LIB)(r_int.o) \ $(LIB)(r_nint.o) \ $(LIB)(r_sign.o) \ $(LIB)(rand_.o) DBL = $(LIB)(d_cnjg.o) \ $(LIB)(d_dim.o) \ $(LIB)(d_imag.o) \ $(LIB)(d_int.o) \ $(LIB)(d_mod.o) \ $(LIB)(d_nint.o) \ $(LIB)(d_prod.o) \ $(LIB)(d_sign.o) INT = $(LIB)(i_abs.o) \ $(LIB)(i_dim.o) \ $(LIB)(i_dnnt.o) \ $(LIB)(i_indx.o) \ $(LIB)(i_len.o) \ $(LIB)(i_mod.o) \ $(LIB)(i_nint.o) \ $(LIB)(i_sign.o) HALF = $(LIB)(h_abs.o) \ $(LIB)(h_dim.o) \ $(LIB)(h_dnnt.o) \ $(LIB)(h_indx.o) \ $(LIB)(h_len.o) \ $(LIB)(h_mod.o) \ $(LIB)(h_nint.o) \ $(LIB)(h_sign.o) CMP = $(LIB)(l_ge.o) \ $(LIB)(l_gt.o) \ $(LIB)(l_le.o) \ $(LIB)(l_lt.o) \ $(LIB)(hl_ge.o) \ $(LIB)(hl_gt.o) \ $(LIB)(hl_le.o) \ $(LIB)(hl_lt.o) CHAR = $(LIB)(s_cat.o) \ $(LIB)(s_cmp.o) \ $(LIB)(s_copy.o) ETC = $(LIB)(bit.o) \ $(LIB)(lnblnk_.o) \ $(LIB)(rindex_.o) \ $(LIB)(cabs.o) FOROBJS=$(LIB)(secnds.o) ASMOBJS=$(LIB)(matherr.o) \ $(LIB)(d_abs.o) \ $(LIB)(pow_di.o) \ $(LIB)(pow_ri.o) \ $(LIB)(bitsR2V2.o) \ $(LIB)(bitsIRTF.o) \ $(LIB)(nint.o) \ $(LIB)(nbpar.o) CCDASHZ=$(LIB)(minmax.o) \ $(LIB)(rr_nint.o) \ $(LIB)(r_mod.o) # SRC is the list of base source names, i.e. modulename.c SRC = main.c derf_.c derfc_.c ef1asc_.c ef1cmc_.c erf_.c outstr_.c \ s_rnge.c abort_.c getarg_.c iargc_.c getenv_.c \ signal_.c s_stop.c s_paus.c system_.c mclock_.c matherr.s \ subout.c exit_.c minmax.c pow_ci.c pow_hh.c pow_ii.c pow_ri.s \ pow_zi.c pow_di.s pow_zz.c c_abs.c c_cos.c c_div.c c_exp.c c_log.c \ c_sin.c c_sqrt.c z_abs.c z_cos.c z_div.c z_exp.c z_log.c z_sin.c \ z_sqrt.c r_cnjg.c r_dim.c r_imag.c r_int.c r_nint.c r_sign.c rand_.c \ d_abs.s d_cnjg.c d_dim.c d_imag.c d_int.c d_mod.c d_nint.c d_prod.c \ d_sign.c i_abs.c i_dim.c i_dnnt.c i_indx.c i_len.c i_mod.c i_nint.c \ i_sign.c h_abs.c h_dim.c h_dnnt.c h_indx.c h_len.c h_mod.c h_nint.c \ h_sign.c l_ge.c l_gt.c l_le.c l_lt.c hl_ge.c hl_gt.c hl_le.c hl_lt.c \ s_cat.c s_cmp.c s_copy.c bit.c lnblnk_.c rindex_.c cabs.c mvbits.c \ bitsR2V2.s bitsIRTF.s bit.h nbpar.s secnds.f loc_.c fdate_.c r_mod.c \ nint.s rr_nint.c # OBJ is the list of object module names in # library form, i.e. $(LIB)(modulename.o) OBJ = $(MISC) $(POW) $(CX) $(DCX) $(REAL) $(DBL) $(INT) $(HALF) $(CMP) \ $(CHAR) $(ETC) $(FOROBJS) $(ASMOBJS) $(CCDASHZ) all: $(LIB) get -p $(LIBC_SRC)/s.mcount.def > mcount.def rm -f *.o $(MAKE) -$(MAKEFLAGS) 'MCOUNT=mcount.def' 'PROFLAG=-p' \ 'LIB=plibF77.a' $(PLIB) libF77.a: $(OBJ) $(NM) -xv $(LIB) > $(LIB).map plibF77.a: $(OBJ) $(NM) -xv $(PLIB) > $(PLIB).map rm -f $(MCOUNT) # The files minmax.c, rr_nint, r_mod.c MUST be compiled with cc -Fs, therefore # we need to handle them explicitly: $(CCDASHZ): minmax.c r_mod.c rr_nint.c $(CC) -Fs -c $(CFLAGS) minmax.c r_mod.c rr_nint.c $(AR) rv $(LIB) minmax.o r_mod.o rr_nint.o -rm -f minmax.o r_mod.o rr_nint.o complex: s.complex $(GET) $(GFLAGS) s.complex install: -rm -f $(DESTDIR)/$(LIB) $(INS) $(LIB) $(DESTDIR)/$(LIB) chmod 644 $(DESTDIR)/$(LIB) chgrp bin $(DESTDIR)/$(LIB) chown bin $(DESTDIR)/$(LIB) -rm -f $(PDESTDIR)/$(LIB) $(INS) $(PLIB) $(PDESTDIR)/$(LIB) chmod 644 $(PDESTDIR)/$(LIB) chgrp bin $(PDESTDIR)/$(LIB) chown bin $(PDESTDIR)/$(LIB) listing: $(PR) $(SRC) | $(LP) clean: -rm -f *.o -rm -f core errs # This clobber rule *requires* that the sources (SRC) be kept in sccs # format, ie the SRC copies are NOT the only ones!! clobber: clean -rm -f $(LIB) $(LIB).map $(SRC) complex -rm -f $(PLIB) $(PLIB).map WHAT: what $(LIB) what $(PLIB) # dependencies for included files and other non-obvious reasons are listed # below $(LIB)(bitsR2V2.o) $(LIB)(mvbits.o): bit.h $(LIB)(c_abs.o) $(LIB)(c_cos.o) $(LIB)(c_exp.o) \ $(LIB)(c_log.o) $(LIB)(c_sin.o) $(LIB)(c_sqrt.o) \ $(LIB)(d_cnjg.o) $(LIB)(d_imag.o) $(LIB)(pow_ci.o) \ $(LIB)(pow_zi.o) $(LIB)(pow_zz.o) $(LIB)(r_cnjg.o) \ $(LIB)(r_imag.o) $(LIB)(z_abs.o) $(LIB)(z_cos.o) \ $(LIB)(z_exp.o) $(LIB)(z_log.o) \ $(LIB)(z_sin.o) $(LIB)(z_sqrt.o): complex $(LIB)(main.o) $(LIB)(signal_.o): $(INC)/signal.h $(LIB)(abort_.o) $(LIB)(c_div.o) $(LIB)(main.o) \ $(LIB)(outstr_.o) $(LIB)(s_paus.o) $(LIB)(s_rnge.o) \ $(LIB)(s_stop.o) $(LIB)(subout.o) \ $(LIB)(z_div.o): $(INC)/stdio.h minmax.o: $(INC)/varargs.h /* "@(#)complex 4.1 87/02/17" */ typedef struct { float real, imag; } complex; typedef struct { double dreal, dimag; } dcomplex; ! / 548427093 0 0 0 1792 ` DDD \ 4L!l####'+V357=0?RACnEGIrIrLRNRSVjY\^n`ceh kNmorJuvxJy{}JzzNF*N"NRBvJ&66ͮͮll $$$$$$$$$$$$$$$$$$$$$hhhh&_main_xargc_xargv_derf__derfc__ef1asc__ef1cmc__erf__outstr__s_rnge_abort__getarg__iargc__getenv__signal__F7_SIG_F7_trtsig_F7_numsig_s_stop_s_paus_system__mclock__subout_exit__mvbits__loc__fdate__pow_ci_pow_hh_pow_ii_Pow_ii_pow_zi_pow_zz_c_abs_c_cos_c_div_c_exp_c_log_c_sin_c_sqrt_z_abs_z_cos_z_div_z_exp_z_log_z_sin_z_sqrt_r_cnjg_r_dim_r_imag_r_int_r_nint_r_sign_srand__rand__d_cnjg_d_dim_d_imag_d_int_d_mod_D_mod_d_nint_d_prod_d_sign_i_abs_i_dim_i_dnnt_i_indx_i_len_i_mod_i_nint_i_sign_h_abs_h_dim_h_dnnt_h_indx_h_len_h_mod_h_nint_h_sign_l_ge_l_gt_l_le_l_lt_hl_ge_hl_gt_hl_le_hl_lt_s_cat_s_cmp_s_copy_bis__bic__bit__setbit__lnblnk__rindex__cabs_secnds__matherr_d_abs_D_abs_pow_di_Pow_di_pow_ri_Pow_ri_bext_h_F77mask_bext_l_bext_b_F77zmask_shftc_h_shftc_l_shftc_b_jishl_iishl_bishl_jisha_iisha_bisha_jishc_iishc_bishc_jibset_iibset_bibset_jibclr_iibclr_bibclr_bjtest_bitest_bbtest_jibchng_iibchng_bibchng_xri_nint_xrh_nint_xrr_nint_xd_nint_nb$par__min0_max0_min1_max1_amin0_amax0_amin1_amax1_dmin1_dmax1_r_mod_R_mod_rr_nintmain.o/ 548426674 98 100 100664 536 ` u S( .text@ .data@@ @.bss``0 00ܓ00W @(#)main.c 4.2 87/05/13  & , .text@.data@ .bss`_mainj_xargcj_xargvj_f_initj_MAIN_j_f_exitjderf_.o/ 548426676 98 100 100664 392 ` u S.text0 .data00 @.bssPP888W @(#)derf_.c 4.2 87/05/13 .text0.data0 .bssP_derf_jh_erfjhderfc_.o/ 548426678 98 100 100664 392 ` u S.text0 .data00 @.bssPP888W @(#)derfc_.c 4.2 87/05/13 .text0.data0 .bssP_derfc_jh_erfcjhef1asc_.o/ 548426681 98 100 100664 416 ` u S.textH .dataHH @.bsshhH~DpA43C 4A#4~DHHW @(#)ef1asc_.c 4.2 87/05/13 2.textH.dataH .bssh_ef1asc_jh_s_copyjhef1cmc_.o/ 548426684 98 100 100664 408 ` u S.text@ .data@@ @.bss``H~DpAD1$~DHHW @(#)ef1cmc_.c 4.2 87/05/13 *.text@.data@ .bss`_ef1cmc_jh_s_cmpjherf_.o/ 548426686 98 100 100664 392 ` u S.text0 .data00 @.bssPP8'88W @(#)erf_.c 4.2 87/05/13 .text0.data0 .bssP_erf_jh_erfjhoutstr_.o/ 548426689 98 100 100664 612 ` u S .text, .data  @.bss@~8pRq"q~8@@W @(#)outstr_.c 4.2 87/05/13 "$,<>DLNX.text .data .bss_outstr_j__iobj__flsbufjs_rnge.o/ 548426693 98 100 100664 1386 ` u Sl .texth( .datahh@.bssP<@~H#Π_ pT    "$$qx ΐ + PpT    "$$qv  ؓ ~Hɞ@Ǿ<PPW @(#)s_rnge.c 4.3 87/05/13 . Subscript out of range on file line %d, procedure . Attempt to access the %ld-th element of variable abort (*06@BFHP`bh pr| $*0 46<BJ .texth(.datah.bss_s_rngel0__iobl0_fprintfl0__flsbufl0l0_exitl0__cleanupabort_.o/ 548426696 98 100 100664 566 ` u SL .text8 .data88@@.bssxx8 Xޓ88W @(#)abort_.c 4.2 87/05/13 Fortran abort routine called $ * .text8.data8@.bssx_abort_j__iobj_fprintfjj_abortj__cleanupgetarg_.o/ 548426699 98 100 100664 556 ` u Sx .text< .data(@.bss@1~r$p@ @ 1A!r 1 !r~W @(#)getarg_.c 4.2 87/05/13 ,.>.text.data(.bss_getarg_kX_xargckX_xargvkXiargc_.o/ 548426702 98 100 100664 380 ` u S.text .data @.bss88W @(#)iargc_.c 4.2 87/05/13  .text.data .bss8_iargc_jh_xargcjhgetenv_.o/ 548426707 98 100 100664 580 ` u S.text .data l@.bss~qC֐  * !(b*!1D(1=(q1 A@90q A@~ɞW @(#)getenv_.c 4.2 87/05/13 .text.data .bss_getenv_k_environksignal_.o/ 548426710 98 100 100664 890 ` u S .text .data @.bss8880!x \ ` d llVz,p!*N88W@~<pppW~<@@W @(#)signal_.c 4.2 87/05/13 $*0F \ r       .text.data .bss8_signal_j_F7_SIGxjj_signaljj_F7_trtsig_F7_numsigs_stop.o/ 548426714 98 100 100664 888 ` u S .text .data@L@.bssH<~@p T   q "$$q hbZ~@Ǟ<HHW @(#)s_stop.c 4.2 87/05/13 STOP statement executed "(.8:>@HXZ` hjt  .text.data@.bss_s_stopk__iobk_fprintfk__flsbufk_f_exitk_exitks_paus.o/ 548426718 98 100 100664 2103 ` u S.textF .data@.bssPD~Hp 8،^T   q "$$q @h Z XB$goB ! $ lf^:T0 />H*$ ܓ~HǞDPPWW @(#)s_paus.c 4.2 87/05/13 PAUSE statement executed To resume execution, type go. Any other input will terminate job. STOP To resume execution, execute a kill -%d %d command Execution resumes after PAUSE. $*8:>@HXZ` hjt   ,.8JLT\^d pr|  .textF.data.bss_s_pausmh__iobmh_fprintfmh__flsbufmh_isattymh__filbufmh_f_exitmh_exitmh_getpidmh_signalmh_pausemh_waitpause system_.o/ 548426721 98 100 100664 456 ` u S(.textp .datapp @.bss 0 8@!!1( 8  W @(#)system_.c 4.2 87/05/13 ^.textp.datap .bss_system_j_systemjmclock_.o/ 548426724 98 100 100664 400 ` u S.text8 .data88 @.bssXXP8.@8D !PPW @(#)mclock_.c 4.2 87/05/13 .text8.data8 .bssX_mclock_jh_timesjhsubout.o/ 548426728 98 100 100664 1370 ` u S\ .text`|( .data``@.bssP<@~H#Π_ pT    "$$qx  ΀ + PpT    "$$qv  ܓ ~Hɞ@Ǿ<PPW @(#)subout.c 4.2 87/05/13 . Subscript out of range on line %d of procedure . Attempt to access the %ld-th element of variable abort (*06@BFHP`bh pr|  &, 028>F .text`(.data`.bss_suboutl0__iobl0_fprintfl0__flsbufl0l0_exitl0__cleanupexit_.o/ 548426731 98 100 100664 486 ` u S .text@ .data@@ @.bss``8 ȧ~4p~488W @(#)exit_.c 4.2 87/05/13 ( .text@.data@ .bss`_exit_j_f_exitjj_exitj__cleanupmvbits.o/ 548426735 98 100 100664 604 ` u S.textt .data8<@.bssN0~q` $T` P Zpp  Ljcp  ` ~W @(#)mvbits.c 4.2 87/05/13 @(#)bit.h 3.2 87/05/13 ^`df.text.data8.bss_mvbits_j_F77maskjloc_.o/ 548426738 98 100 100664 328 ` u S.text .data @.bss00W @(#)loc_.c 4.2 87/05/13 .text.data .bss0_loc_jPfdate_.o/ 548426741 98 100 100664 504 ` u S0 .text`  .data`` @.bssH<~@qDD'~@ǎ<HHW @(#)fdate_.c 4.2 87/05/13 0D .text`.data` .bss_fdate_j_timej_ctimej_b_charjpow_ci.o/ 548426744 98 100 100664 440 ` u S.text`  .data`` @.bss`~<p1'3>@1'3P@>HP7X7~<``W @(#)pow_ci.c 4.2 87/05/13 4.text`.data` .bss_pow_cijh_pow_zijhpow_hh.o/ 548426748 98 100 100664 416 ` u S.texth .datahh @.bss ~2@qz3zD@ 6z.!szczA 3 z~W @(#)pow_hh.c 4.2 87/05/13 .texth.datah .bss_pow_hhjpow_ii.o/ 548426752 98 100 100664 676 ` u T.textX .dataXX @.bssxx ~2 A 0 v1 j0. "  @: 0qCc! 3  @~W ~A2 0 v1 j0. "  @: 0qCc! 3  @~W @(#)pow_ii.c 4.2 87/05/13 .textX.dataX .bssx_pow_iim_Pow_iimpow_zi.o/ 548426756 98 100 100664 624 ` u T.text .data @.bss88h?@H~Pp1ǀ?X#X`@.`5 XW5 ɞ`41 5Xɷ5 3 's:.`^X5 5 41 ɞ`35 `.Xt~PɞHɾ@hhW @(#)pow_zi.c 4.2 87/05/13 R.text.data .bss8_pow_zik@_z_divk@pow_zz.o/ 548426760 98 100 100664 728 ` u T .text .data l@.bsshDHP~Xr8#4(!8#475<54`75:53qd^`!5L^`5 ~XɞPɾHDhhW @(#)pow_zz.c 4.2 87/05/13 <Hb ~   .text.data .bss_pow_zzj_cabsj_logj_atan2j_expj_cosj_sinjc_abs.o/ 548426763 98 100 100664 408 ` u T .text@ .data@@ @.bss``H~@q!'w'"~@HHW @(#)c_abs.c 4.2 87/05/13 (.text@.data@ .bss`_c_absjh_cabsjhc_cos.o/ 548426767 98 100 100664 584 ` u Tl .text< .data @.bssH8~@q''!57'!2'5 7~@ɞ8HHW @(#)c_cos.c 4.2 87/05/13 (<X n .text.data .bss_c_cosj_cosj_coshj_sinj_sinhjc_div.o/ 548426772 98 100 100664 808 ` u T` .textP$ .dataPPH@.bssX<@H~Pr''": 21 ':2:  0:  p&' '5?3 5 ''53 6 7 ''54 6 7 `&' '5?3 5 ''53 6 7 '5('"4 6 7 ~PɞHɾ@<XXW @(#)c_div.c 4.2 87/05/13 abort: complex division by zero fhnt| .textP.dataPH.bss_c_divk@__iobk@_fprintfk@_exitk@c_exp.o/ 548426775 98 100 100664 528 ` u TH .textx$ .dataxx @.bssH8~@q''!57'5 7~@ɞ8HHW @(#)c_exp.c 4.2 87/05/13 (<X .textx.datax .bss_c_expj_expj_cosj_sinjc_log.o/ 548426779 98 100 100664 536 ` u TP .text, .data  @.bssH~@q7''3#4!77''3#4(!7~@HHW @(#)c_log.c 4.2 87/05/13 .Vb .text.data .bss_c_logj_atan2j_cabsj_logjc_sin.o/ 548426783 98 100 100664 584 ` u Tl .text< .data @.bssH8~@q''!57''5 7~@ɞ8HHW @(#)c_sin.c 4.2 87/05/13 (<X l .text.data .bss_c_sinj_sinj_coshj_cosj_sinhjc_sqrt.o/ 548426787 98 100 100664 668 ` u T# .text .data @.bss88P@~Hp8''3#4!B1$:h*F'30?@57&' ?057^ǘ'$40?@5:7*"&' ?057~Hɞ@PPW @(#)c_sqrt.c 4.2 87/05/13 2.text.data .bss8_c_sqrtj_cabsj_sqrtjz_abs.o/ 548426790 98 100 100664 400 ` u T&.text8 .data88 @.bssXXH~@q!~@HHW @(#)z_abs.c 4.2 87/05/13 $.text8.data8 .bssX_z_absjh_cabsjhz_cos.o/ 548426794 98 100 100664 568 ` u T*\ .text, .data  @.bssH8~@q!5!25 ~@ɞ8HHW @(#)z_cos.c 4.2 87/05/13 &8P d .text.data .bss_z_cosj_cosj_coshj_sinj_sinhjz_div.o/ 548426798 98 100 100664 776 ` u T.@ .text0 .data00H@.bssxxX<@H~Pr': 21 :2: x 0:  PW%661 5"ޠ?3*5*ɨ536ɨx5 46 LW%661 5"ޠ?3*5*ɨ536ɨ54 6 ~PɞHɾ@<XXW @(#)z_div.c 4.2 87/05/13 abort: complex division by zero bdjpx .text0.data0H.bssx_z_divk@__iobk@_fprintfk@_exitk@z_exp.o/ 548426802 98 100 100664 520 ` u T2@ .textp .datapp @.bssH8~@q!55 ~@ɞ8HHW @(#)z_exp.c 4.2 87/05/13 &8P .textp.datap .bss_z_expj_expj_cosj_sinjz_log.o/ 548426806 98 100 100664 520 ` u T6@ .textp .datapp @.bssH~@q7#4!7#4(!~@HHW @(#)z_log.c 4.2 87/05/13 *LX .textp.datap .bss_z_logj_atan2j_cabsj_logjz_sin.o/ 548426810 98 100 100664 568 ` u T:\ .text, .data  @.bssH8~@q!55 ~@ɞ8HHW @(#)z_sin.c 4.2 87/05/13 &8P b .text.data .bss_z_sinj_sinj_coshj_cosj_sinhjz_sqrt.o/ 548426814 98 100 100664 652 ` u T> .text .data @.bss((P@~Hp8#4!B1:90X5F:90B5F31$0?@5'6 ?05R840?@5H 0:2'6 ?05~Hɞ@PPW @(#)z_sqrt.c 4.2 87/05/13 ..text.data .bss(_z_sqrtj_cabsj_sqrtjr_cnjg.o/ 548426818 98 100 100664 344 ` u TB.text .data @.bss@@ "W @(#)r_cnjg.c 4.2 87/05/13 .text .data  .bss@_r_cnjgjPr_dim.o/ 548426821 98 100 100664 360 ` u TE.text0 .data00 @.bssPP0!`*$' W @(#)r_dim.c 4.2 87/05/13 .text0.data0 .bssP_r_dimjr_imag.o/ 548426825 98 100 100664 328 ` u TI.text .data @.bss00'W @(#)r_imag.c 4.2 87/05/13 .text.data .bss0_r_imagjPr_int.o/ 548426829 98 100 100664 444 ` u TM.textX .dataXX @.bssxx8 b*'؋"'288W @(#)r_int.c 4.2 87/05/13 *B.textX.dataX .bssx_r_intj_floorjr_nint.o/ 548426833 98 100 100664 452 ` u TQ$.text`  .data`` @.bss8*'0?@3ҋ'1? 4288W @(#)r_nint.c 4.3 87/05/13 0J.text`.data` .bss_r_nintj_floorjr_sign.o/ 548426837 98 100 100664 384 ` u TT.textH .dataHH @.bsshh 1b*'"'7 * '"'W @(#)r_sign.c 4.2 87/05/13 .textH.dataH .bssh_r_signjrand_.o/ 548426841 98 100 100664 504 ` u TYD .text` .data``(@.bssW@ ANm09s 9 @@W @(#)rand_.c 4.2 87/05/13 &8R.text`.data`(.bss_srand_j_rand_j_ldexpjd_cnjg.o/ 548426844 98 100 100664 344 ` u T\.text .data @.bss@@ 022W @(#)d_cnjg.c 4.2 87/05/13 .text .data  .bss@_d_cnjgjPd_dim.o/ 548426848 98 100 100664 376 ` u T`.text@ .data@@ @.bss`` ~2p:70"4  ~W @(#)d_dim.c 4.2 87/05/13 .text@.data@ .bss`_d_dimjd_imag.o/ 548426852 98 100 100664 328 ` u Td.text .data @.bss00W @(#)d_imag.c 4.2 87/05/13 .text.data .bss0_d_imagjPd_int.o/ 548426856 98 100 100664 444 ` u Th.textX .dataXX @.bssxx@~8!p:' ԋ22~8@@W @(#)d_int.c 4.2 87/05/13 .D.textX.dataX .bssx_d_intj_floorjd_mod.o/ 548426861 98 100 100664 664 ` u Tm .text .data @.bss((H8~@q'61 : 1 "#21 5(4 ~@ɞ8HHWP?8@~Hr 61 : B1 "#,21 5):4 ~Hɞ@ɾ8PPW @(#)d_mod.c 4.2 87/05/13 <R.text.data .bss(_d_modj_floorj_D_modjd_nint.o/ 548426865 98 100 100664 444 ` u Tq.textX .dataXX @.bssxx80@:100?@3ҋ0?@41288W @(#)d_nint.c 4.3 87/05/13 0H.textX.dataX .bssx_d_nintj_floorjd_prod.o/ 548426869 98 100 100664 344 ` u Tu.text .data @.bss@@ %'W @(#)d_prod.c 4.2 87/05/13 .text .data  .bss@_d_prodjPd_sign.o/ 548426873 98 100 100664 384 ` u Ty.textH .dataHH @.bsshh ~r : 2q 0: 2p~W @(#)d_sign.c 4.2 87/05/13 .textH.dataH .bssh_d_signji_abs.o/ 548426877 98 100 100664 344 ` u T}.text .data @.bss@@ W @(#)i_abs.c 4.2 87/05/13 .text .data  .bss@_i_absji_dim.o/ 548426881 98 100 100664 360 ` u T.text0 .data00 @.bssPP0!bW @(#)i_dim.c 4.2 87/05/13 .text0.data0 .bssP_i_dimji_dnnt.o/ 548426885 98 100 100664 468 ` u T4.textp .datapp @.bss@~8!p:' 0?@3ʋ0?@4120~8@@W @(#)i_dnnt.c 4.2 87/05/13 8T.textp.datap .bss_i_dnntj_floorji_indx.o/ 548426890 98 100 100664 432 ` u T$.textx .dataxx @.bss~pAϠ80$1!(  ~ɞW @(#)i_indx.c 4.2 87/05/13 .textx.datax .bss_i_indxji_len.o/ 548426894 98 100 100664 328 ` u T.text .data @.bss00W @(#)i_len.c 4.2 87/05/13 .text.data .bss0_i_lenjPi_mod.o/ 548426898 98 100 100664 336 ` u T.text .data @.bss88W @(#)i_mod.c 4.2 87/05/13 .text.data .bss8_i_modjPi_nint.o/ 548426902 98 100 100664 452 ` u T$.text`  .data`` @.bss8*'0?@3ҋ'1? 42088W @(#)i_nint.c 4.3 87/05/13 0J.text`.data` .bss_i_nintj_floorji_sign.o/ 548426906 98 100 100664 368 ` u T.text8 .data88 @.bssXX    W @(#)i_sign.c 4.2 87/05/13 .text8.data8 .bssX_i_signjh_abs.o/ 548426911 98 100 100664 352 ` u T.text( .data(( @.bssHHaz zzzW @(#)h_abs.c 4.2 87/05/13 .text(.data( .bssH _h_absjh_dim.o/ 548426915 98 100 100664 360 ` u T.text0 .data00 @.bssPP0!SbzzzzzW @(#)h_dim.c 4.2 87/05/13 .text0.data0 .bssP_h_dimjh_dnnt.o/ 548426919 98 100 100664 468 ` u T4.textp .datapp @.bss@~8!p:' 0?@3ʋ0?@4120~8@@W @(#)h_dnnt.c 4.2 87/05/13 8T.textp.datap .bss_h_dnntj_floorjh_indx.o/ 548426924 98 100 100664 440 ` u T,.text .data  @.bss~pAϠ<0$1!( z~ɞW @(#)h_indx.c 4.2 87/05/13 .text.data .bss_h_indxjh_len.o/ 548426929 98 100 100664 328 ` u T.text .data @.bss00zW @(#)h_len.c 4.2 87/05/13 .text.data .bss0_h_lenjPh_mod.o/ 548426933 98 100 100664 344 ` u T.text .data @.bss@@ zzzW @(#)h_mod.c 4.2 87/05/13 .text .data  .bss@_h_modjPh_nint.o/ 548426938 98 100 100664 452 ` u T$.text`  .data`` @.bss8*'0?@3ҋ'1? 42088W @(#)h_nint.c 4.3 87/05/13 0J.text`.data` .bss_h_nintj_floorjh_sign.o/ 548426942 98 100 100664 376 ` u T.text@ .data@@ @.bss`` bz zzz z z zzW @(#)h_sign.c 4.2 87/05/13 .text@.data@ .bss`_h_signjl_ge.o/ 548426947 98 100 100664 384 ` u T.text( .data(( @.bssHH@@]@@W @(#)l_ge.c 4.2 87/05/13 .text(.data( .bssH_l_gejh_s_cmpjhl_gt.o/ 548426952 98 100 100664 384 ` u T.text( .data(( @.bssHH@@T@@W @(#)l_gt.c 4.2 87/05/13 .text(.data( .bssH_l_gtjh_s_cmpjhl_le.o/ 548426956 98 100 100664 384 ` u T.text( .data(( @.bssHH@@\@@W @(#)l_le.c 4.2 87/05/13 .text(.data( .bssH_l_lejh_s_cmpjhl_lt.o/ 548426961 98 100 100664 384 ` u T.text( .data(( @.bssHH@@U@@W @(#)l_lt.c 4.2 87/05/13 .text(.data( .bssH_l_ltjh_s_cmpjhhl_ge.o/ 548426966 98 100 100664 384 ` u T.text( .data(( @.bssHH@@]z@@W @(#)hl_ge.c 4.2 87/05/13 .text(.data( .bssH_hl_gejh_s_cmpjhhl_gt.o/ 548426970 98 100 100664 384 ` u T.text( .data(( @.bssHH@@Tz@@W @(#)hl_gt.c 4.2 87/05/13 .text(.data( .bssH_hl_gtjh_s_cmpjhhl_le.o/ 548426975 98 100 100664 384 ` u T.text( .data(( @.bssHH@@\z@@W @(#)hl_le.c 4.2 87/05/13 .text(.data( .bssH_hl_lejh_s_cmpjhhl_lt.o/ 548426980 98 100 100664 384 ` u T.text( .data(( @.bssHH@@Uz@@W @(#)hl_lt.c 4.2 87/05/13 .text(.data( .bssH_hl_ltjh_s_cmpjhs_cat.o/ 548426985 98 100 100664 464 ` u TD.text .data $@.bss@~qǠ@.8  887A1! tŋA 88~ɞW @(#)s_cat.c 4.2 87/05/13 .text.data .bss_s_catjs_cmp.o/ 548426991 98 100 100664 536 ` u T.text .data l@.bss~pA 0Z"gaqA(  nA(\( qA6(  q(~W @(#)s_cmp.c 4.2 87/05/13 .text.data .bss_s_cmpks_copy.o/ 548426996 98 100 100664 448 ` u T4.text .data @.bss@~q0!&Aq(F Aq(A (~W @(#)s_copy.c 4.2 87/05/13 .text.data .bss_s_copykbit.o/ 548427002 98 100 100664 572 ` u Tt .text .data\@.bss 1A`@ W 1` W 1  ` ^W80Xv88W @(#)bit.c 4.2 87/05/13 .text.data.bss_bis_k@_bic_4k@_bit_dk@_setbit_k@lnblnk_.o/ 548427008 98 100 100664 360 ` u U.text0 .data00 @.bssPP 0 ( W @(#)lnblnk_.c 4.2 87/05/13 .text0.data0 .bssP_lnblnk_jrindex_.o/ 548427014 98 100 100664 464 ` u U0.textx$ .dataxx @.bssXDH~Pp( ):qq(~PɞHǾDXXW @(#)rindex_.c 4.2 87/05/13 >.textx.datax .bss_rindex_j_s_cmpjcabs.o/ 548427019 98 100 100664 496 ` u U P.textD .data $@.bss@~8p#0@:70 27s0@:10"B1:707Hq$B137:70 *6B1$50?@35A0~8@@W @(#)cabs.c 4.2 87/05/13 ~.text.data .bss_cabsj_sqrtjsecnds.o/ 548427027 98 100 100664 376 ` u U.text@ .data@@@.bss@@8~4q)< %$~488W.text@.data@.bss@_secnds_jh_mclock_jhmatherr.o/ 548427032 98 100 100664 288 ` u U.text .data@.bssW.text.data.bss_matherrj d_abs.o/ 548427037 98 100 100664 316 ` u U.text .data@.bss  W.text.data.bss_d_absj8_D_absj8pow_di.o/ 548427042 98 100 100664 898 ` u U" .text@, .data@@`@.bss A B 1  WPPƈF?@4@D6 1?P TP5qA@ 5"W8 @.41>0H0TU >!Z:, &.h PWpowpow: SING error pow: DOMAIN error pow: input value was NAN pow: input value was INF        $ . .text@ .data@`.bss_errnon_writen_matherrn_pow_din_Pow_di nUNDERFLOWpow_ri.o/ 548427048 98 100 100664 866 ` u U(x .text  .data  `@.bss!! WPFƈ<? 0 ("0?&10 20%q! %W8  .41>0H0ht5 R!N(b  &H PWpowpow: SING error pow: DOMAIN error pow: input value was NAN pow: input value was INF |          .text .data `.bss_errnon_writen_matherrn_pow_rin_Pow_ri nUNDERFLOWbitsR2V2.o/ 548427056 98 100 100664 2526 ` u U0.text .dataD@.bssHH .( (F 8(* (zBz .("p  c zW .( ( F 8(*  ( 4 .("p  cW .( (F 8(* (jBj .("p  c jW .( Tz  ԖF8(&((z(z(p zTzp `z(p cڛNzp `z(p czz z  zW .( Tz  ЖF 8(&(( ((p zPp `(p cԛJp `(p c  W .( Tz  ԖF8(&((j(j(p zTjp `j(p cڛNjp `j(p cjj j  jW????J&Nth4\@.text.data.bssH_bext_hm_F77maskm_bext_lm_bext_b\m@m_shftc_hm_shftc_lm_shftc_b m_F77zmaskbitsIRTF.o/ 548427062 98 100 100664 1288 ` u U6.text` .data``@.bss```WaWz`WaW`WaWbWcWzbWcWbWcWhW hWzh 0`aa#  h 0`aa# W&h 0`a0a# q( q( " h 0`aq( q( q( W! Wz! W! W! Wz! W! W!Wz!W!W 1   Wz 1   W 1   W.text`.data`.bss`_jishlm_iishlm_bishl0m_jishaHm_iisha`m_bishaxm_jishcm_iishcm_bishcm_jibset0m_iibsetDm_bibsetXm_jibclrlm_iibclrm_bibclrm_bjtestm_bitestm_bbtestm_jibchngm_iibchng m_bibchng8mnint.o/ 548427068 98 100 100664 642 ` u U<\ .text, .data@.bss? # W$ WO**?# )W$ )W A0: 0* ! ?0 309W409W*  8  l  |  .text.data.bssk"k,k_xd_nintXk_rr_nintk_d_nintk6DONEHALF1DONEHALF2_xri_nint_xrh_nint_xrr_nintnbpar.o/ 548427074 98 100 100664 312 ` u UB.text .data @.bss   10!W.text .data .bss _nb$par_jPminmax.o/ 548427088 98 100 100664 1260 ` u UP.text .data @.bss  . !A0@C! W. !A0C! W. !A0*C! W. !A0*C! W. .$2$)A$)*A10W. .$2$)A$)*A10W. !A0*C! W. !A0*C! W~(.0.($2  ɒ$  r: 10 ~ɞW~(.0.($2  ɒ$  r: 10 ~ɞW @(#)minmax.c 3.2 87/05/13 .text.data .bss _min0m_max0Hm_min1m_max1m_amin0m_amax0Pm_amin1m_amax1m_dmin1m_dmax1mr_mod.o/ 548427090 98 100 100664 656 ` u UR .text .data @.bss  H8~@q&' : 1 "#21 '5('"4 ~@ɞ8HHWH8~@q&' : H1 "#021 '5 '(4 7~@ɞ8HHW @(#)r_mod.c 3.2 87/05/13 <R.text.data .bss _r_modj_floorj_R_modjrr_nint.o/ 548427091 98 100 100664 436 ` u US.textP .dataPP @.bsspp8* ?#؋ ?$!"88W @(#)rr_nint.c 4.2 87/05/13 *@.textP.dataP .bssp_rr_nintj_s_floorj#ident " @(#)minmax.c 3.2 87/05/13 " /* * This file must be compiled with rc -z */ #include /* return minimum int arg, as int */ int min0(va_alist) va_dcl { va_list ap; int Min, tmp, count; va_start(ap); count = va_arg(ap, int); Min = va_arg(ap, int); while (--count) { if ((tmp = va_arg(ap, int)) < Min) Min = tmp; } return(Min); } /* return maximum int arg, as int */ int max0(va_alist) va_dcl { va_list ap; int Max, tmp, count; va_start(ap); count = va_arg(ap, int); Max = va_arg(ap, int); while (--count) { if ((tmp = va_arg(ap, int)) > Max) Max = tmp; } return(Max); } /* return minimum float arg, as int */ int min1(va_alist) va_dcl { va_list ap; float Min, tmp; int count; va_start(ap); count = va_arg(ap, int); Min = va_arg(ap, float); while (--count) { if ((tmp = va_arg(ap, float)) < Min) Min = tmp; } return(Min); } /* return maximum float arg, as int */ int max1(va_alist) va_dcl { va_list ap; float Max, tmp; int count; va_start(ap); count = va_arg(ap, int); Max = va_arg(ap, float); while (--count) { if ((tmp = va_arg(ap, float)) > Max) Max = tmp; } return(Max); } /* return minimum int arg, as float */ float amin0(va_alist) va_dcl { va_list ap; float Min, tmp; int count; va_start(ap); count = va_arg(ap, int); Min = va_arg(ap, int); while (--count) { if ((tmp = va_arg(ap, int)) < Min) Min = tmp; } return(Min); } /* return maximum int arg, as float */ float amax0(va_alist) va_dcl { va_list ap; float Max, tmp; int count; va_start(ap); count = va_arg(ap, int); Max = va_arg(ap, int); while (--count) { if ((tmp = va_arg(ap, int)) > Max) Max = tmp; } return(Max); } /* return minimum float arg, as float */ float amin1(va_alist) { va_list ap; float Min, tmp; int count; va_start(ap); count = va_arg(ap, int); Min = va_arg(ap, float); while (--count) { if ((tmp = va_arg(ap, float)) < Min) Min = tmp; } return(Min); } /* return maximum float arg, as float */ float amax1(va_alist) { va_list ap; float Max, tmp; int count; va_start(ap); count = va_arg(ap, int); Max = va_arg(ap, float); while (--count) { if ((tmp = va_arg(ap, float)) > Max) Max = tmp; } return(Max); } /* return minimum double arg, as double */ double dmin1(va_alist) { va_list ap; double Min, tmp; int count; va_start(ap); count = va_arg(ap, int); Min = va_arg(ap, double); while (--count) { if ((tmp = va_arg(ap, double)) < Min) Min = tmp; } return(Min); } /* return maximum double arg, as double */ double dmax1(va_alist) { va_list ap; double Max, tmp; int count; va_start(ap); count = va_arg(ap, int); Max = va_arg(ap, double); while (--count) { if ((tmp = va_arg(ap, double)) > Max) Max = tmp; } return(Max); } #ident " @(#)r_mod.c 3.2 87/05/13 " double r_mod(x,y) float *x, *y; { double floor(), quotient; if( (quotient = *x / *y) >= 0) quotient = floor(quotient); else quotient = -floor(-quotient); return(*x - (*y) * quotient ); } /* * Same as r_mod, but called by value */ float R_mod(x,y) float x, y; { double floor(), quotient; if( (quotient = x / y) >= 0) quotient = floor(quotient); else quotient = -floor(-quotient); return(x - y * quotient ); } #ident " @(#)rr_nint.c 4.2 87/05/13 " /* * Single precision version of r_nint. * Must be compiled with -Fs (single precision) flag. */ float rr_nint(x) float *x; { float s_floor(); register float tmpx = *x; return( (tmpx)>=0 ? s_floor(tmpx + .5) : -s_floor(.5 - tmpx) ); } 2              Symbols from libF77.a[main.o]: Name Value Class Type Size Line Section _MAIN_ |0x00000000|extern| | | | _f_exit |0x00000000|extern| | | | _f_init |0x00000000|extern| | | | _xargc |0x00000004|extern| | | | _xargv |0x00000004|extern| | | | _main |0x00000008|extern| | | |.text Symbols from libF77.a[derf_.o]: Name Value Class Type Size Line Section _erf |0x00000000|extern| | | | _derf_ |0x00000008|extern| | | |.text Symbols from libF77.a[derfc_.o]: Name Value Class Type Size Line Section _erfc |0x00000000|extern| | | | _derfc_ |0x00000008|extern| | | |.text Symbols from libF77.a[ef1asc_.o]: Name Value Class Type Size Line Section _s_copy |0x00000000|extern| | | | _ef1asc_ |0x00000008|extern| | | |.text Symbols from libF77.a[ef1cmc_.o]: Name Value Class Type Size Line Section _s_cmp |0x00000000|extern| | | | _ef1cmc_ |0x00000008|extern| | | |.text Symbols from libF77.a[erf_.o]: Name Value Class Type Size Line Section _erf |0x00000000|extern| | | | _erf_ |0x00000008|extern| | | |.text Symbols from libF77.a[outstr_.o]: Name Value Class Type Size Line Section __flsbuf |0x00000000|extern| | | | __iob |0x00000000|extern| | | | _outstr_ |0x00000008|extern| | | |.text Symbols from libF77.a[s_rnge.o]: Name Value Class Type Size Line Section __cleanup |0x00000000|extern| | | | __flsbuf |0x00000000|extern| | | | __iob |0x00000000|extern| | | | _exit |0x00000000|extern| | | | _fprintf |0x00000000|extern| | | | _s_rnge |0x00000008|extern| | | |.text Symbols from libF77.a[abort_.o]: Name Value Class Type Size Line Section __cleanup |0x00000000|extern| | | | __iob |0x00000000|extern| | | | _abort |0x00000000|extern| | | | _fprintf |0x00000000|extern| | | | _abort_ |0x00000008|extern| | | |.text Symbols from libF77.a[getarg_.o]: Name Value Class Type Size Line Section _xargc |0x00000000|extern| | | | _xargv |0x00000000|extern| | | | _getarg_ |0x00000008|extern| | | |.text Symbols from libF77.a[iargc_.o]: Name Value Class Type Size Line Section _xargc |0x00000000|extern| | | | _iargc_ |0x00000008|extern| | | |.text Symbols from libF77.a[getenv_.o]: Name Value Class Type Size Line Section _environ |0x00000000|extern| | | | _getenv_ |0x00000008|extern| | | |.text Symbols from libF77.a[signal_.o]: Name Value Class Type Size Line Section _signal |0x00000000|extern| | | | _F7_numsig |0x00000004|extern| | | | _signal_ |0x00000008|extern| | | |.text _F7_SIG |0x00000078|extern| | | | _F7_trtsig |0x000000cc|extern| | | |.text Symbols from libF77.a[s_stop.o]: Name Value Class Type Size Line Section __flsbuf |0x00000000|extern| | | | __iob |0x00000000|extern| | | | _exit |0x00000000|extern| | | | _f_exit |0x00000000|extern| | | | _fprintf |0x00000000|extern| | | | _s_stop |0x00000008|extern| | | |.text Symbols from libF77.a[s_paus.o]: Name Value Class Type Size Line Section __filbuf |0x00000000|extern| | | | __flsbuf |0x00000000|extern| | | | __iob |0x00000000|extern| | | | _exit |0x00000000|extern| | | | _f_exit |0x00000000|extern| | | | _fprintf |0x00000000|extern| | | | _getpid |0x00000000|extern| | | | _isatty |0x00000000|extern| | | | _pause |0x00000000|extern| | | | _signal |0x00000000|extern| | | | _s_paus |0x00000008|extern| | | |.text Symbols from libF77.a[system_.o]: Name Value Class Type Size Line Section _system |0x00000000|extern| | | | _system_ |0x00000008|extern| | | |.text Symbols from libF77.a[mclock_.o]: Name Value Class Type Size Line Section _times |0x00000000|extern| | | | _mclock_ |0x00000008|extern| | | |.text Symbols from libF77.a[subout.o]: Name Value Class Type Size Line Section __cleanup |0x00000000|extern| | | | __flsbuf |0x00000000|extern| | | | __iob |0x00000000|extern| | | | _exit |0x00000000|extern| | | | _fprintf |0x00000000|extern| | | | _subout |0x00000008|extern| | | |.text Symbols from libF77.a[exit_.o]: Name Value Class Type Size Line Section __cleanup |0x00000000|extern| | | | _exit |0x00000000|extern| | | | _f_exit |0x00000000|extern| | | | _exit_ |0x00000008|extern| | | |.text Symbols from libF77.a[mvbits.o]: Name Value Class Type Size Line Section _F77mask |0x00000000|extern| | | | _mvbits_ |0x00000008|extern| | | |.text Symbols from libF77.a[loc_.o]: Name Value Class Type Size Line Section _loc_ |0x00000008|extern| | | |.text Symbols from libF77.a[fdate_.o]: Name Value Class Type Size Line Section _b_char |0x00000000|extern| | | | _ctime |0x00000000|extern| | | | _time |0x00000000|extern| | | | _fdate_ |0x00000008|extern| | | |.text Symbols from libF77.a[pow_ci.o]: Name Value Class Type Size Line Section _pow_zi |0x00000000|extern| | | | _pow_ci |0x00000008|extern| | | |.text Symbols from libF77.a[pow_hh.o]: Name Value Class Type Size Line Section _pow_hh |0x00000008|extern| | | |.text Symbols from libF77.a[pow_ii.o]: Name Value Class Type Size Line Section _pow_ii |0x00000008|extern| | | |.text _Pow_ii |0x000000b4|extern| | | |.text Symbols from libF77.a[pow_zi.o]: Name Value Class Type Size Line Section _z_div |0x00000000|extern| | | | _pow_zi |0x00000008|extern| | | |.text Symbols from libF77.a[pow_zz.o]: Name Value Class Type Size Line Section _atan2 |0x00000000|extern| | | | _cabs |0x00000000|extern| | | | _cos |0x00000000|extern| | | | _exp |0x00000000|extern| | | | _log |0x00000000|extern| | | | _sin |0x00000000|extern| | | | _pow_zz |0x00000008|extern| | | |.text Symbols from libF77.a[c_abs.o]: Name Value Class Type Size Line Section _cabs |0x00000000|extern| | | | _c_abs |0x00000008|extern| | | |.text Symbols from libF77.a[c_cos.o]: Name Value Class Type Size Line Section _cos |0x00000000|extern| | | | _cosh |0x00000000|extern| | | | _sin |0x00000000|extern| | | | _sinh |0x00000000|extern| | | | _c_cos |0x00000008|extern| | | |.text Symbols from libF77.a[c_div.o]: Name Value Class Type Size Line Section __iob |0x00000000|extern| | | | _exit |0x00000000|extern| | | | _fprintf |0x00000000|extern| | | | _c_div |0x00000008|extern| | | |.text Symbols from libF77.a[c_exp.o]: Name Value Class Type Size Line Section _cos |0x00000000|extern| | | | _exp |0x00000000|extern| | | | _sin |0x00000000|extern| | | | _c_exp |0x00000008|extern| | | |.text Symbols from libF77.a[c_log.o]: Name Value Class Type Size Line Section _atan2 |0x00000000|extern| | | | _cabs |0x00000000|extern| | | | _log |0x00000000|extern| | | | _c_log |0x00000008|extern| | | |.text Symbols from libF77.a[c_sin.o]: Name Value Class Type Size Line Section _cos |0x00000000|extern| | | | _cosh |0x00000000|extern| | | | _sin |0x00000000|extern| | | | _sinh |0x00000000|extern| | | | _c_sin |0x00000008|extern| | | |.text Symbols from libF77.a[c_sqrt.o]: Name Value Class Type Size Line Section _cabs |0x00000000|extern| | | | _sqrt |0x00000000|extern| | | | _c_sqrt |0x00000008|extern| | | |.text Symbols from libF77.a[z_abs.o]: Name Value Class Type Size Line Section _cabs |0x00000000|extern| | | | _z_abs |0x00000008|extern| | | |.text Symbols from libF77.a[z_cos.o]: Name Value Class Type Size Line Section _cos |0x00000000|extern| | | | _cosh |0x00000000|extern| | | | _sin |0x00000000|extern| | | | _sinh |0x00000000|extern| | | | _z_cos |0x00000008|extern| | | |.text Symbols from libF77.a[z_div.o]: Name Value Class Type Size Line Section __iob |0x00000000|extern| | | | _exit |0x00000000|extern| | | | _fprintf |0x00000000|extern| | | | _z_div |0x00000008|extern| | | |.text Symbols from libF77.a[z_exp.o]: Name Value Class Type Size Line Section _cos |0x00000000|extern| | | | _exp |0x00000000|extern| | | | _sin |0x00000000|extern| | | | _z_exp |0x00000008|extern| | | |.text Symbols from libF77.a[z_log.o]: Name Value Class Type Size Line Section _atan2 |0x00000000|extern| | | | _cabs |0x00000000|extern| | | | _log |0x00000000|extern| | | | _z_log |0x00000008|extern| | | |.text Symbols from libF77.a[z_sin.o]: Name Value Class Type Size Line Section _cos |0x00000000|extern| | | | _cosh |0x00000000|extern| | | | _sin |0x00000000|extern| | | | _sinh |0x00000000|extern| | | | _z_sin |0x00000008|extern| | | |.text Symbols from libF77.a[z_sqrt.o]: Name Value Class Type Size Line Section _cabs |0x00000000|extern| | | | _sqrt |0x00000000|extern| | | | _z_sqrt |0x00000008|extern| | | |.text Symbols from libF77.a[r_cnjg.o]: Name Value Class Type Size Line Section _r_cnjg |0x00000008|extern| | | |.text Symbols from libF77.a[r_dim.o]: Name Value Class Type Size Line Section _r_dim |0x00000008|extern| | | |.text Symbols from libF77.a[r_imag.o]: Name Value Class Type Size Line Section _r_imag |0x00000008|extern| | | |.text Symbols from libF77.a[r_int.o]: Name Value Class Type Size Line Section _floor |0x00000000|extern| | | | _r_int |0x00000008|extern| | | |.text Symbols from libF77.a[r_nint.o]: Name Value Class Type Size Line Section _floor |0x00000000|extern| | | | _r_nint |0x00000008|extern| | | |.text Symbols from libF77.a[r_sign.o]: Name Value Class Type Size Line Section _r_sign |0x00000008|extern| | | |.text Symbols from libF77.a[rand_.o]: Name Value Class Type Size Line Section _ldexp |0x00000000|extern| | | | _srand_ |0x00000008|extern| | | |.text _rand_ |0x0000001c|extern| | | |.text Symbols from libF77.a[d_cnjg.o]: Name Value Class Type Size Line Section _d_cnjg |0x00000008|extern| | | |.text Symbols from libF77.a[d_dim.o]: Name Value Class Type Size Line Section _d_dim |0x00000008|extern| | | |.text Symbols from libF77.a[d_imag.o]: Name Value Class Type Size Line Section _d_imag |0x00000008|extern| | | |.text Symbols from libF77.a[d_int.o]: Name Value Class Type Size Line Section _floor |0x00000000|extern| | | | _d_int |0x00000008|extern| | | |.text Symbols from libF77.a[d_mod.o]: Name Value Class Type Size Line Section _floor |0x00000000|extern| | | | _d_mod |0x00000008|extern| | | |.text _D_mod |0x00000088|extern| | | |.text Symbols from libF77.a[d_nint.o]: Name Value Class Type Size Line Section _floor |0x00000000|extern| | | | _d_nint |0x00000008|extern| | | |.text Symbols from libF77.a[d_prod.o]: Name Value Class Type Size Line Section _d_prod |0x00000008|extern| | | |.text Symbols from libF77.a[d_sign.o]: Name Value Class Type Size Line Section _d_sign |0x00000008|extern| | | |.text Symbols from libF77.a[i_abs.o]: Name Value Class Type Size Line Section _i_abs |0x00000008|extern| | | |.text Symbols from libF77.a[i_dim.o]: Name Value Class Type Size Line Section _i_dim |0x00000008|extern| | | |.text Symbols from libF77.a[i_dnnt.o]: Name Value Class Type Size Line Section _floor |0x00000000|extern| | | | _i_dnnt |0x00000008|extern| | | |.text Symbols from libF77.a[i_indx.o]: Name Value Class Type Size Line Section _i_indx |0x00000008|extern| | | |.text Symbols from libF77.a[i_len.o]: Name Value Class Type Size Line Section _i_len |0x00000008|extern| | | |.text Symbols from libF77.a[i_mod.o]: Name Value Class Type Size Line Section _i_mod |0x00000008|extern| | | |.text Symbols from libF77.a[i_nint.o]: Name Value Class Type Size Line Section _floor |0x00000000|extern| | | | _i_nint |0x00000008|extern| | | |.text Symbols from libF77.a[i_sign.o]: Name Value Class Type Size Line Section _i_sign |0x00000008|extern| | | |.text Symbols from libF77.a[h_abs.o]: Name Value Class Type Size Line Section _h_abs |0x00000008|extern| | | |.text Symbols from libF77.a[h_dim.o]: Name Value Class Type Size Line Section _h_dim |0x00000008|extern| | | |.text Symbols from libF77.a[h_dnnt.o]: Name Value Class Type Size Line Section _floor |0x00000000|extern| | | | _h_dnnt |0x00000008|extern| | | |.text Symbols from libF77.a[h_indx.o]: Name Value Class Type Size Line Section _h_indx |0x00000008|extern| | | |.text Symbols from libF77.a[h_len.o]: Name Value Class Type Size Line Section _h_len |0x00000008|extern| | | |.text Symbols from libF77.a[h_mod.o]: Name Value Class Type Size Line Section _h_mod |0x00000008|extern| | | |.text Symbols from libF77.a[h_nint.o]: Name Value Class Type Size Line Section _floor |0x00000000|extern| | | | _h_nint |0x00000008|extern| | | |.text Symbols from libF77.a[h_sign.o]: Name Value Class Type Size Line Section _h_sign |0x00000008|extern| | | |.text Symbols from libF77.a[l_ge.o]: Name Value Class Type Size Line Section _s_cmp |0x00000000|extern| | | | _l_ge |0x00000008|extern| | | |.text Symbols from libF77.a[l_gt.o]: Name Value Class Type Size Line Section _s_cmp |0x00000000|extern| | | | _l_gt |0x00000008|extern| | | |.text Symbols from libF77.a[l_le.o]: Name Value Class Type Size Line Section _s_cmp |0x00000000|extern| | | | _l_le |0x00000008|extern| | | |.text Symbols from libF77.a[l_lt.o]: Name Value Class Type Size Line Section _s_cmp |0x00000000|extern| | | | _l_lt |0x00000008|extern| | | |.text Symbols from libF77.a[hl_ge.o]: Name Value Class Type Size Line Section _s_cmp |0x00000000|extern| | | | _hl_ge |0x00000008|extern| | | |.text Symbols from libF77.a[hl_gt.o]: Name Value Class Type Size Line Section _s_cmp |0x00000000|extern| | | | _hl_gt |0x00000008|extern| | | |.text Symbols from libF77.a[hl_le.o]: Name Value Class Type Size Line Section _s_cmp |0x00000000|extern| | | | _hl_le |0x00000008|extern| | | |.text Symbols from libF77.a[hl_lt.o]: Name Value Class Type Size Line Section _s_cmp |0x00000000|extern| | | | _hl_lt |0x00000008|extern| | | |.text Symbols from libF77.a[s_cat.o]: Name Value Class Type Size Line Section _s_cat |0x00000008|extern| | | |.text Symbols from libF77.a[s_cmp.o]: Name Value Class Type Size Line Section _s_cmp |0x00000008|extern| | | |.text Symbols from libF77.a[s_copy.o]: Name Value Class Type Size Line Section _s_copy |0x00000008|extern| | | |.text Symbols from libF77.a[bit.o]: Name Value Class Type Size Line Section _bis_ |0x00000008|extern| | | |.text _bic_ |0x00000034|extern| | | |.text _bit_ |0x00000064|extern| | | |.text _setbit_ |0x0000009c|extern| | | |.text Symbols from libF77.a[lnblnk_.o]: Name Value Class Type Size Line Section _lnblnk_ |0x00000008|extern| | | |.text Symbols from libF77.a[rindex_.o]: Name Value Class Type Size Line Section _s_cmp |0x00000000|extern| | | | _rindex_ |0x00000008|extern| | | |.text Symbols from libF77.a[cabs.o]: Name Value Class Type Size Line Section _sqrt |0x00000000|extern| | | | _cabs |0x00000008|extern| | | |.text Symbols from libF77.a[secnds.o]: Name Value Class Type Size Line Section _mclock_ |0x00000000|extern| | | | _secnds_ |0x00000008|extern| | | |.text Symbols from libF77.a[matherr.o]: Name Value Class Type Size Line Section _matherr |0x00000000|extern| | | |.text Symbols from libF77.a[d_abs.o]: Name Value Class Type Size Line Section _d_abs |0x00000000|extern| | | |.text _D_abs |0x00000004|extern| | | |.text Symbols from libF77.a[pow_di.o]: Name Value Class Type Size Line Section _errno |0x00000000|extern| | | | _matherr |0x00000000|extern| | | | _pow_di |0x00000000|extern| | | |.text _write |0x00000000|extern| | | | _Pow_di |0x0000000c|extern| | | |.text Symbols from libF77.a[pow_ri.o]: Name Value Class Type Size Line Section _errno |0x00000000|extern| | | | _matherr |0x00000000|extern| | | | _pow_ri |0x00000000|extern| | | |.text _write |0x00000000|extern| | | | _Pow_ri |0x0000000c|extern| | | |.text Symbols from libF77.a[bitsR2V2.o]: Name Value Class Type Size Line Section _bext_h |0x00000000|extern| | | |.text _bext_l |0x000000b6|extern| | | |.text _bext_b |0x0000015c|extern| | | |.text _shftc_h |0x00000212|extern| | | |.text _shftc_l |0x000003a8|extern| | | |.text _shftc_b |0x00000520|extern| | | |.text _F77mask |0x000006b8|extern| | | |.data _F77zmask |0x00000740|extern| | | |.data Symbols from libF77.a[bitsIRTF.o]: Name Value Class Type Size Line Section _jishl |0x00000000|extern| | | |.text _iishl |0x00000018|extern| | | |.text _bishl |0x00000030|extern| | | |.text _jisha |0x00000048|extern| | | |.text _iisha |0x00000060|extern| | | |.text _bisha |0x00000078|extern| | | |.text _jishc |0x00000090|extern| | | |.text _iishc |0x000000a8|extern| | | |.text _bishc |0x000000e4|extern| | | |.text _jibset |0x00000130|extern| | | |.text _iibset |0x00000144|extern| | | |.text _bibset |0x00000158|extern| | | |.text _jibclr |0x0000016c|extern| | | |.text _iibclr |0x00000180|extern| | | |.text _bibclr |0x00000194|extern| | | |.text _bjtest |0x000001a8|extern| | | |.text _bitest |0x000001bc|extern| | | |.text _bbtest |0x000001d0|extern| | | |.text _jibchng |0x000001e4|extern| | | |.text _iibchng |0x0000020c|extern| | | |.text _bibchng |0x00000238|extern| | | |.text Symbols from libF77.a[nint.o]: Name Value Class Type Size Line Section _d_nint |0x00000000|extern| | | | _rr_nint |0x00000000|extern| | | | _xrh_nint |0x00000000|extern| | | |.text _xri_nint |0x00000000|extern| | | |.text _xrr_nint |0x0000001c|extern| | | |.text _xd_nint |0x00000058|extern| | | |.text Symbols from libF77.a[nbpar.o]: Name Value Class Type Size Line Section _nb$par_ |0x00000000|extern| | | |.text Symbols from libF77.a[minmax.o]: Name Value Class Type Size Line Section _min0 |0x00000008|extern| | | |.text _max0 |0x00000048|extern| | | |.text _min1 |0x00000088|extern| | | |.text _max1 |0x000000c8|extern| | | |.text _amin0 |0x00000108|extern| | | |.text _amax0 |0x00000150|extern| | | |.text _amin1 |0x00000198|extern| | | |.text _amax1 |0x000001d8|extern| | | |.text _dmin1 |0x00000218|extern| | | |.text _dmax1 |0x00000290|extern| | | |.text Symbols from libF77.a[r_mod.o]: Name Value Class Type Size Line Section _floor |0x00000000|extern| | | | _r_mod |0x00000008|extern| | | |.text _R_mod |0x0000008c|extern| | | |.text Symbols from libF77.a[rr_nint.o]: Name Value Class Type Size Line Section _s_floor |0x00000000|extern| | | | _rr_nint |0x00000008|extern| | | |.text Symbols from plibF77.a[main.o]: Name Value Class Type Size Line Section _MAIN_ |0x00000000|extern| | | | _f_exit |0x00000000|extern| | | | _f_init |0x00000000|extern| | | | mcount |0x00000000|extern| | | | _xargc |0x00000004|extern| | | | _xargv |0x00000004|extern| | | | _main |0x00000008|extern| | | |.text Symbols from plibF77.a[derf_.o]: Name Value Class Type Size Line Section _erf |0x00000000|extern| | | | mcount |0x00000000|extern| | | | _derf_ |0x00000008|extern| | | |.text Symbols from plibF77.a[derfc_.o]: Name Value Class Type Size Line Section _erfc |0x00000000|extern| | | | mcount |0x00000000|extern| | | | _derfc_ |0x00000008|extern| | | |.text Symbols from plibF77.a[ef1asc_.o]: Name Value Class Type Size Line Section _s_copy |0x00000000|extern| | | | mcount |0x00000000|extern| | | | _ef1asc_ |0x00000008|extern| | | |.text Symbols from plibF77.a[ef1cmc_.o]: Name Value Class Type Size Line Section _s_cmp |0x00000000|extern| | | | mcount |0x00000000|extern| | | | _ef1cmc_ |0x00000008|extern| | | |.text Symbols from plibF77.a[erf_.o]: Name Value Class Type Size Line Section _erf |0x00000000|extern| | | | mcount |0x00000000|extern| | | | _erf_ |0x00000008|extern| | | |.text Symbols from plibF77.a[outstr_.o]: Name Value Class Type Size Line Section __flsbuf |0x00000000|extern| | | | __iob |0x00000000|extern| | | | mcount |0x00000000|extern| | | | _outstr_ |0x00000008|extern| | | |.text Symbols from plibF77.a[s_rnge.o]: Name Value Class Type Size Line Section __cleanup |0x00000000|extern| | | | __flsbuf |0x00000000|extern| | | | __iob |0x00000000|extern| | | | _exit |0x00000000|extern| | | | _fprintf |0x00000000|extern| | | | mcount |0x00000000|extern| | | | _s_rnge |0x00000008|extern| | | |.text Symbols from plibF77.a[abort_.o]: Name Value Class Type Size Line Section __cleanup |0x00000000|extern| | | | __iob |0x00000000|extern| | | | _abort |0x00000000|extern| | | | _fprintf |0x00000000|extern| | | | mcount |0x00000000|extern| | | | _abort_ |0x00000008|extern| | | |.text Symbols from plibF77.a[getarg_.o]: Name Value Class Type Size Line Section _xargc |0x00000000|extern| | | | _xargv |0x00000000|extern| | | | mcount |0x00000000|extern| | | | _getarg_ |0x00000008|extern| | | |.text Symbols from plibF77.a[iargc_.o]: Name Value Class Type Size Line Section _xargc |0x00000000|extern| | | | mcount |0x00000000|extern| | | | _iargc_ |0x00000008|extern| | | |.text Symbols from plibF77.a[getenv_.o]: Name Value Class Type Size Line Section _environ |0x00000000|extern| | | | mcount |0x00000000|extern| | | | _getenv_ |0x00000008|extern| | | |.text Symbols from plibF77.a[signal_.o]: Name Value Class Type Size Line Section _signal |0x00000000|extern| | | | mcount |0x00000000|extern| | | | _F7_numsig |0x00000004|extern| | | | _signal_ |0x00000008|extern| | | |.text _F7_SIG |0x00000078|extern| | | | _F7_trtsig |0x000000d8|extern| | | |.text Symbols from plibF77.a[s_stop.o]: Name Value Class Type Size Line Section __flsbuf |0x00000000|extern| | | | __iob |0x00000000|extern| | | | _exit |0x00000000|extern| | | | _f_exit |0x00000000|extern| | | | _fprintf |0x00000000|extern| | | | mcount |0x00000000|extern| | | | _s_stop |0x00000008|extern| | | |.text Symbols from plibF77.a[s_paus.o]: Name Value Class Type Size Line Section __filbuf |0x00000000|extern| | | | __flsbuf |0x00000000|extern| | | | __iob |0x00000000|extern| | | | _exit |0x00000000|extern| | | | _f_exit |0x00000000|extern| | | | _fprintf |0x00000000|extern| | | | _getpid |0x00000000|extern| | | | _isatty |0x00000000|extern| | | | _pause |0x00000000|extern| | | | _signal |0x00000000|extern| | | | mcount |0x00000000|extern| | | | _s_paus |0x00000008|extern| | | |.text Symbols from plibF77.a[system_.o]: Name Value Class Type Size Line Section _system |0x00000000|extern| | | | mcount |0x00000000|extern| | | | _system_ |0x00000008|extern| | | |.text Symbols from plibF77.a[mclock_.o]: Name Value Class Type Size Line Section _times |0x00000000|extern| | | | mcount |0x00000000|extern| | | | _mclock_ |0x00000008|extern| | | |.text Symbols from plibF77.a[subout.o]: Name Value Class Type Size Line Section __cleanup |0x00000000|extern| | | | __flsbuf |0x00000000|extern| | | | __iob |0x00000000|extern| | | | _exit |0x00000000|extern| | | | _fprintf |0x00000000|extern| | | | mcount |0x00000000|extern| | | | _subout |0x00000008|extern| | | |.text Symbols from plibF77.a[exit_.o]: Name Value Class Type Size Line Section __cleanup |0x00000000|extern| | | | _exit |0x00000000|extern| | | | _f_exit |0x00000000|extern| | | | mcount |0x00000000|extern| | | | _exit_ |0x00000008|extern| | | |.text Symbols from plibF77.a[mvbits.o]: Name Value Class Type Size Line Section _F77mask |0x00000000|extern| | | | mcount |0x00000000|extern| | | | _mvbits_ |0x00000008|extern| | | |.text Symbols from plibF77.a[loc_.o]: Name Value Class Type Size Line Section mcount |0x00000000|extern| | | | _loc_ |0x00000008|extern| | | |.text Symbols from plibF77.a[fdate_.o]: Name Value Class Type Size Line Section _b_char |0x00000000|extern| | | | _ctime |0x00000000|extern| | | | _time |0x00000000|extern| | | | mcount |0x00000000|extern| | | | _fdate_ |0x00000008|extern| | | |.text Symbols from plibF77.a[pow_ci.o]: Name Value Class Type Size Line Section _pow_zi |0x00000000|extern| | | | mcount |0x00000000|extern| | | | _pow_ci |0x00000008|extern| | | |.text Symbols from plibF77.a[pow_hh.o]: Name Value Class Type Size Line Section mcount |0x00000000|extern| | | | _pow_hh |0x00000008|extern| | | |.text Symbols from plibF77.a[pow_ii.o]: Name Value Class Type Size Line Section mcount |0x00000000|extern| | | | _pow_ii |0x00000008|extern| | | |.text _Pow_ii |0x000000c0|extern| | | |.text Symbols from plibF77.a[pow_zi.o]: Name Value Class Type Size Line Section _z_div |0x00000000|extern| | | | mcount |0x00000000|extern| | | | _pow_zi |0x00000008|extern| | | |.text Symbols from plibF77.a[pow_zz.o]: Name Value Class Type Size Line Section _atan2 |0x00000000|extern| | | | _cabs |0x00000000|extern| | | | _cos |0x00000000|extern| | | | _exp |0x00000000|extern| | | | _log |0x00000000|extern| | | | _sin |0x00000000|extern| | | | mcount |0x00000000|extern| | | | _pow_zz |0x00000008|extern| | | |.text Symbols from plibF77.a[c_abs.o]: Name Value Class Type Size Line Section _cabs |0x00000000|extern| | | | mcount |0x00000000|extern| | | | _c_abs |0x00000008|extern| | | |.text Symbols from plibF77.a[c_cos.o]: Name Value Class Type Size Line Section _cos |0x00000000|extern| | | | _cosh |0x00000000|extern| | | | _sin |0x00000000|extern| | | | _sinh |0x00000000|extern| | | | mcount |0x00000000|extern| | | | _c_cos |0x00000008|extern| | | |.text Symbols from plibF77.a[c_div.o]: Name Value Class Type Size Line Section __iob |0x00000000|extern| | | | _exit |0x00000000|extern| | | | _fprintf |0x00000000|extern| | | | mcount |0x00000000|extern| | | | _c_div |0x00000008|extern| | | |.text Symbols from plibF77.a[c_exp.o]: Name Value Class Type Size Line Section _cos |0x00000000|extern| | | | _exp |0x00000000|extern| | | | _sin |0x00000000|extern| | | | mcount |0x00000000|extern| | | | _c_exp |0x00000008|extern| | | |.text Symbols from plibF77.a[c_log.o]: Name Value Class Type Size Line Section _atan2 |0x00000000|extern| | | | _cabs |0x00000000|extern| | | | _log |0x00000000|extern| | | | mcount |0x00000000|extern| | | | _c_log |0x00000008|extern| | | |.text Symbols from plibF77.a[c_sin.o]: Name Value Class Type Size Line Section _cos |0x00000000|extern| | | | _cosh |0x00000000|extern| | | | _sin |0x00000000|extern| | | | _sinh |0x00000000|extern| | | | mcount |0x00000000|extern| | | | _c_sin |0x00000008|extern| | | |.text Symbols from plibF77.a[c_sqrt.o]: Name Value Class Type Size Line Section _cabs |0x00000000|extern| | | | _sqrt |0x00000000|extern| | | | mcount |0x00000000|extern| | | | _c_sqrt |0x00000008|extern| | | |.text Symbols from plibF77.a[z_abs.o]: Name Value Class Type Size Line Section _cabs |0x00000000|extern| | | | mcount |0x00000000|extern| | | | _z_abs |0x00000008|extern| | | |.text Symbols from plibF77.a[z_cos.o]: Name Value Class Type Size Line Section _cos |0x00000000|extern| | | | _cosh |0x00000000|extern| | | | _sin |0x00000000|extern| | | | _sinh |0x00000000|extern| | | | mcount |0x00000000|extern| | | | _z_cos |0x00000008|extern| | | |.text Symbols from plibF77.a[z_div.o]: Name Value Class Type Size Line Section __iob |0x00000000|extern| | | | _exit |0x00000000|extern| | | | _fprintf |0x00000000|extern| | | | mcount |0x00000000|extern| | | | _z_div |0x00000008|extern| | | |.text Symbols from plibF77.a[z_exp.o]: Name Value Class Type Size Line Section _cos |0x00000000|extern| | | | _exp |0x00000000|extern| | | | _sin |0x00000000|extern| | | | mcount |0x00000000|extern| | | | _z_exp |0x00000008|extern| | | |.text Symbols from plibF77.a[z_log.o]: Name Value Class Type Size Line Section _atan2 |0x00000000|extern| | | | _cabs |0x00000000|extern| | | | _log |0x00000000|extern| | | | mcount |0x00000000|extern| | | | _z_log |0x00000008|extern| | | |.text Symbols from plibF77.a[z_sin.o]: Name Value Class Type Size Line Section _cos |0x00000000|extern| | | | _cosh |0x00000000|extern| | | | _sin |0x00000000|extern| | | | _sinh |0x00000000|extern| | | | mcount |0x00000000|extern| | | | _z_sin |0x00000008|extern| | | |.text Symbols from plibF77.a[z_sqrt.o]: Name Value Class Type Size Line Section _cabs |0x00000000|extern| | | | _sqrt |0x00000000|extern| | | | mcount |0x00000000|extern| | | | _z_sqrt |0x00000008|extern| | | |.text Symbols from plibF77.a[r_cnjg.o]: Name Value Class Type Size Line Section mcount |0x00000000|extern| | | | _r_cnjg |0x00000008|extern| | | |.text Symbols from plibF77.a[r_dim.o]: Name Value Class Type Size Line Section mcount |0x00000000|extern| | | | _r_dim |0x00000008|extern| | | |.text Symbols from plibF77.a[r_imag.o]: Name Value Class Type Size Line Section mcount |0x00000000|extern| | | | _r_imag |0x00000008|extern| | | |.text Symbols from plibF77.a[r_int.o]: Name Value Class Type Size Line Section _floor |0x00000000|extern| | | | mcount |0x00000000|extern| | | | _r_int |0x00000008|extern| | | |.text Symbols from plibF77.a[r_nint.o]: Name Value Class Type Size Line Section _floor |0x00000000|extern| | | | mcount |0x00000000|extern| | | | _r_nint |0x00000008|extern| | | |.text Symbols from plibF77.a[r_sign.o]: Name Value Class Type Size Line Section mcount |0x00000000|extern| | | | _r_sign |0x00000008|extern| | | |.text Symbols from plibF77.a[rand_.o]: Name Value Class Type Size Line Section _ldexp |0x00000000|extern| | | | mcount |0x00000000|extern| | | | _srand_ |0x00000008|extern| | | |.text _rand_ |0x00000028|extern| | | |.text Symbols from plibF77.a[d_cnjg.o]: Name Value Class Type Size Line Section mcount |0x00000000|extern| | | | _d_cnjg |0x00000008|extern| | | |.text Symbols from plibF77.a[d_dim.o]: Name Value Class Type Size Line Section mcount |0x00000000|extern| | | | _d_dim |0x00000008|extern| | | |.text Symbols from plibF77.a[d_imag.o]: Name Value Class Type Size Line Section mcount |0x00000000|extern| | | | _d_imag |0x00000008|extern| | | |.text Symbols from plibF77.a[d_int.o]: Name Value Class Type Size Line Section _floor |0x00000000|extern| | | | mcount |0x00000000|extern| | | | _d_int |0x00000008|extern| | | |.text Symbols from plibF77.a[d_mod.o]: Name Value Class Type Size Line Section _floor |0x00000000|extern| | | | mcount |0x00000000|extern| | | | _d_mod |0x00000008|extern| | | |.text _D_mod |0x00000094|extern| | | |.text Symbols from plibF77.a[d_nint.o]: Name Value Class Type Size Line Section _floor |0x00000000|extern| | | | mcount |0x00000000|extern| | | | _d_nint |0x00000008|extern| | | |.text Symbols from plibF77.a[d_prod.o]: Name Value Class Type Size Line Section mcount |0x00000000|extern| | | | _d_prod |0x00000008|extern| | | |.text Symbols from plibF77.a[d_sign.o]: Name Value Class Type Size Line Section mcount |0x00000000|extern| | | | _d_sign |0x00000008|extern| | | |.text Symbols from plibF77.a[i_abs.o]: Name Value Class Type Size Line Section mcount |0x00000000|extern| | | | _i_abs |0x00000008|extern| | | |.text Symbols from plibF77.a[i_dim.o]: Name Value Class Type Size Line Section mcount |0x00000000|extern| | | | _i_dim |0x00000008|extern| | | |.text Symbols from plibF77.a[i_dnnt.o]: Name Value Class Type Size Line Section _floor |0x00000000|extern| | | | mcount |0x00000000|extern| | | | _i_dnnt |0x00000008|extern| | | |.text Symbols from plibF77.a[i_indx.o]: Name Value Class Type Size Line Section mcount |0x00000000|extern| | | | _i_indx |0x00000008|extern| | | |.text Symbols from plibF77.a[i_len.o]: Name Value Class Type Size Line Section mcount |0x00000000|extern| | | | _i_len |0x00000008|extern| | | |.text Symbols from plibF77.a[i_mod.o]: Name Value Class Type Size Line Section mcount |0x00000000|extern| | | | _i_mod |0x00000008|extern| | | |.text Symbols from plibF77.a[i_nint.o]: Name Value Class Type Size Line Section _floor |0x00000000|extern| | | | mcount |0x00000000|extern| | | | _i_nint |0x00000008|extern| | | |.text Symbols from plibF77.a[i_sign.o]: Name Value Class Type Size Line Section mcount |0x00000000|extern| | | | _i_sign |0x00000008|extern| | | |.text Symbols from plibF77.a[h_abs.o]: Name Value Class Type Size Line Section mcount |0x00000000|extern| | | | _h_abs |0x00000008|extern| | | |.text Symbols from plibF77.a[h_dim.o]: Name Value Class Type Size Line Section mcount |0x00000000|extern| | | | _h_dim |0x00000008|extern| | | |.text Symbols from plibF77.a[h_dnnt.o]: Name Value Class Type Size Line Section _floor |0x00000000|extern| | | | mcount |0x00000000|extern| | | | _h_dnnt |0x00000008|extern| | | |.text Symbols from plibF77.a[h_indx.o]: Name Value Class Type Size Line Section mcount |0x00000000|extern| | | | _h_indx |0x00000008|extern| | | |.text Symbols from plibF77.a[h_len.o]: Name Value Class Type Size Line Section mcount |0x00000000|extern| | | | _h_len |0x00000008|extern| | | |.text Symbols from plibF77.a[h_mod.o]: Name Value Class Type Size Line Section mcount |0x00000000|extern| | | | _h_mod |0x00000008|extern| | | |.text Symbols from plibF77.a[h_nint.o]: Name Value Class Type Size Line Section _floor |0x00000000|extern| | | | mcount |0x00000000|extern| | | | _h_nint |0x00000008|extern| | | |.text Symbols from plibF77.a[h_sign.o]: Name Value Class Type Size Line Section mcount |0x00000000|extern| | | | _h_sign |0x00000008|extern| | | |.text Symbols from plibF77.a[l_ge.o]: Name Value Class Type Size Line Section _s_cmp |0x00000000|extern| | | | mcount |0x00000000|extern| | | | _l_ge |0x00000008|extern| | | |.text Symbols from plibF77.a[l_gt.o]: Name Value Class Type Size Line Section _s_cmp |0x00000000|extern| | | | mcount |0x00000000|extern| | | | _l_gt |0x00000008|extern| | | |.text Symbols from plibF77.a[l_le.o]: Name Value Class Type Size Line Section _s_cmp |0x00000000|extern| | | | mcount |0x00000000|extern| | | | _l_le |0x00000008|extern| | | |.text Symbols from plibF77.a[l_lt.o]: Name Value Class Type Size Line Section _s_cmp |0x00000000|extern| | | | mcount |0x00000000|extern| | | | _l_lt |0x00000008|extern| | | |.text Symbols from plibF77.a[hl_ge.o]: Name Value Class Type Size Line Section _s_cmp |0x00000000|extern| | | | mcount |0x00000000|extern| | | | _hl_ge |0x00000008|extern| | | |.text Symbols from plibF77.a[hl_gt.o]: Name Value Class Type Size Line Section _s_cmp |0x00000000|extern| | | | mcount |0x00000000|extern| | | | _hl_gt |0x00000008|extern| | | |.text Symbols from plibF77.a[hl_le.o]: Name Value Class Type Size Line Section _s_cmp |0x00000000|extern| | | | mcount |0x00000000|extern| | | | _hl_le |0x00000008|extern| | | |.text Symbols from plibF77.a[hl_lt.o]: Name Value Class Type Size Line Section _s_cmp |0x00000000|extern| | | | mcount |0x00000000|extern| | | | _hl_lt |0x00000008|extern| | | |.text Symbols from plibF77.a[s_cat.o]: Name Value Class Type Size Line Section mcount |0x00000000|extern| | | | _s_cat |0x00000008|extern| | | |.text Symbols from plibF77.a[s_cmp.o]: Name Value Class Type Size Line Section mcount |0x00000000|extern| | | | _s_cmp |0x00000008|extern| | | |.text Symbols from plibF77.a[s_copy.o]: Name Value Class Type Size Line Section mcount |0x00000000|extern| | | | _s_copy |0x00000008|extern| | | |.text Symbols from plibF77.a[bit.o]: Name Value Class Type Size Line Section mcount |0x00000000|extern| | | | _bis_ |0x00000008|extern| | | |.text _bic_ |0x00000040|extern| | | |.text _bit_ |0x0000007c|extern| | | |.text _setbit_ |0x000000c0|extern| | | |.text Symbols from plibF77.a[lnblnk_.o]: Name Value Class Type Size Line Section mcount |0x00000000|extern| | | | _lnblnk_ |0x00000008|extern| | | |.text Symbols from plibF77.a[rindex_.o]: Name Value Class Type Size Line Section _s_cmp |0x00000000|extern| | | | mcount |0x00000000|extern| | | | _rindex_ |0x00000008|extern| | | |.text Symbols from plibF77.a[cabs.o]: Name Value Class Type Size Line Section _sqrt |0x00000000|extern| | | | mcount |0x00000000|extern| | | | _cabs |0x00000008|extern| | | |.text Symbols from plibF77.a[secnds.o]: Name Value Class Type Size Line Section _mclock_ |0x00000000|extern| | | | mcount |0x00000000|extern| | | | _secnds_ |0x00000008|extern| | | |.text Symbols from plibF77.a[matherr.o]: Name Value Class Type Size Line Section _matherr |0x00000000|extern| | | |.text mcount |0x00000000|extern| | | | Symbols from plibF77.a[d_abs.o]: Name Value Class Type Size Line Section _d_abs |0x00000000|extern| | | |.text mcount |0x00000000|extern| | | | _D_abs |0x00000010|extern| | | |.text Symbols from plibF77.a[pow_di.o]: Name Value Class Type Size Line Section _errno |0x00000000|extern| | | | _matherr |0x00000000|extern| | | | _pow_di |0x00000000|extern| | | |.text _write |0x00000000|extern| | | | mcount |0x00000000|extern| | | | _Pow_di |0x00000018|extern| | | |.text Symbols from plibF77.a[pow_ri.o]: Name Value Class Type Size Line Section _errno |0x00000000|extern| | | | _matherr |0x00000000|extern| | | | _pow_ri |0x00000000|extern| | | |.text _write |0x00000000|extern| | | | mcount |0x00000000|extern| | | | _Pow_ri |0x00000018|extern| | | |.text Symbols from plibF77.a[bitsR2V2.o]: Name Value Class Type Size Line Section _bext_h |0x00000000|extern| | | |.text mcount |0x00000000|extern| | | | _bext_l |0x000000c2|extern| | | |.text _bext_b |0x00000174|extern| | | |.text _shftc_h |0x00000236|extern| | | |.text _shftc_l |0x000003d8|extern| | | |.text _shftc_b |0x0000055c|extern| | | |.text _F77mask |0x00000718|extern| | | |.data _F77zmask |0x000007a0|extern| | | |.data Symbols from plibF77.a[bitsIRTF.o]: Name Value Class Type Size Line Section _jishl |0x00000000|extern| | | |.text mcount |0x00000000|extern| | | | _iishl |0x00000024|extern| | | |.text _bishl |0x00000048|extern| | | |.text _jisha |0x0000006c|extern| | | |.text _iisha |0x00000090|extern| | | |.text _bisha |0x000000b4|extern| | | |.text _jishc |0x000000d8|extern| | | |.text _iishc |0x000000fc|extern| | | |.text _bishc |0x00000144|extern| | | |.text _jibset |0x0000019c|extern| | | |.text _iibset |0x000001bc|extern| | | |.text _bibset |0x000001dc|extern| | | |.text _jibclr |0x000001fc|extern| | | |.text _iibclr |0x0000021c|extern| | | |.text _bibclr |0x0000023c|extern| | | |.text _bjtest |0x0000025c|extern| | | |.text _bitest |0x0000027c|extern| | | |.text _bbtest |0x0000029c|extern| | | |.text _jibchng |0x000002bc|extern| | | |.text _iibchng |0x000002f0|extern| | | |.text _bibchng |0x00000328|extern| | | |.text Symbols from plibF77.a[nint.o]: Name Value Class Type Size Line Section _d_nint |0x00000000|extern| | | | _rr_nint |0x00000000|extern| | | | _xrh_nint |0x00000000|extern| | | |.text _xri_nint |0x00000000|extern| | | |.text mcount |0x00000000|extern| | | | _xrr_nint |0x00000028|extern| | | |.text _xd_nint |0x00000070|extern| | | |.text Symbols from plibF77.a[nbpar.o]: Name Value Class Type Size Line Section _nb$par_ |0x00000000|extern| | | |.text mcount |0x00000000|extern| | | | Symbols from plibF77.a[minmax.o]: Name Value Class Type Size Line Section mcount |0x00000000|extern| | | | _min0 |0x00000008|extern| | | |.text _max0 |0x00000054|extern| | | |.text _min1 |0x000000a0|extern| | | |.text _max1 |0x000000ec|extern| | | |.text _amin0 |0x00000138|extern| | | |.text _amax0 |0x0000018c|extern| | | |.text _amin1 |0x000001e0|extern| | | |.text _amax1 |0x0000022c|extern| | | |.text _dmin1 |0x00000278|extern| | | |.text _dmax1 |0x000002fc|extern| | | |.text Symbols from plibF77.a[r_mod.o]: Name Value Class Type Size Line Section _floor |0x00000000|extern| | | | mcount |0x00000000|extern| | | | _r_mod |0x00000008|extern| | | |.text _R_mod |0x00000098|extern| | | |.text Symbols from plibF77.a[rr_nint.o]: Name Value Class Type Size Line Section _s_floor |0x00000000|extern| | | | mcount |0x00000000|extern| | | | _rr_nint |0x00000008|extern| | | |.text ! / 548427554 0 0 0 1792 ` DDD x"$&&&&*.7:<ADVG*HKZMOORUY6[F^ad>filnqrtwzz|~FzV.&**jvvN.zj2nV6jb:vnf^VNNNNNў6nnnn٪ےRB(((((((((((((((((((((    r**********V_main_xargc_xargv_derf__derfc__ef1asc__ef1cmc__erf__outstr__s_rnge_abort__getarg__iargc__getenv__signal__F7_SIG_F7_trtsig_F7_numsig_s_stop_s_paus_system__mclock__subout_exit__mvbits__loc__fdate__pow_ci_pow_hh_pow_ii_Pow_ii_pow_zi_pow_zz_c_abs_c_cos_c_div_c_exp_c_log_c_sin_c_sqrt_z_abs_z_cos_z_div_z_exp_z_log_z_sin_z_sqrt_r_cnjg_r_dim_r_imag_r_int_r_nint_r_sign_srand__rand__d_cnjg_d_dim_d_imag_d_int_d_mod_D_mod_d_nint_d_prod_d_sign_i_abs_i_dim_i_dnnt_i_indx_i_len_i_mod_i_nint_i_sign_h_abs_h_dim_h_dnnt_h_indx_h_len_h_mod_h_nint_h_sign_l_ge_l_gt_l_le_l_lt_hl_ge_hl_gt_hl_le_hl_lt_s_cat_s_cmp_s_copy_bis__bic__bit__setbit__lnblnk__rindex__cabs_secnds__matherr_d_abs_D_abs_pow_di_Pow_di_pow_ri_Pow_ri_bext_h_F77mask_bext_l_bext_b_F77zmask_shftc_h_shftc_l_shftc_b_jishl_iishl_bishl_jisha_iisha_bisha_jishc_iishc_bishc_jibset_iibset_bibset_jibclr_iibclr_bibclr_bjtest_bitest_bbtest_jibchng_iibchng_bibchng_xri_nint_xrh_nint_xrr_nint_xd_nint_nb$par__min0_max0_min1_max1_amin0_amax0_amin1_amax1_dmin1_dmax1_r_mod_R_mod_rr_nintmain.o/ 548427128 98 100 100664 596 ` u UxP .textH .dataHH(@.bsspp0 `hP00֓Г00W @(#)main.c 4.2 87/05/13  & , 2 8 .textH.dataH(.bssp_mainjmcountj_xargcj_xargvj_f_initj_MAIN_j_f_exitjderf_.o/ 548427130 98 100 100664 452 ` u Uz .text8 .data88(@.bss``8`XP88W @(#)derf_.c 4.2 87/05/13 (.text8.data8(.bss`_derf_jmcountj_erfjderfc_.o/ 548427133 98 100 100664 452 ` u U} .text8 .data88(@.bss``8`XP88W @(#)derfc_.c 4.2 87/05/13 (.text8.data8(.bss`_derfc_jmcountj_erfcjef1asc_.o/ 548427135 98 100 100664 476 ` u U( .textP .dataPP(@.bssxxH`pP~DpA43C 4A#4~DHHW @(#)ef1asc_.c 4.2 87/05/13 >.textP.dataP(.bssx_ef1asc_jmcountj_s_copyjef1cmc_.o/ 548427138 98 100 100664 468 ` u U .textH .dataHH(@.bssppH`hP~DpAD1$~DHHW @(#)ef1cmc_.c 4.2 87/05/13 6.textH.dataH(.bssp_ef1cmc_jmcountj_s_cmpjerf_.o/ 548427141 98 100 100664 452 ` u U .text8 .data88(@.bss``8`XP'88W @(#)erf_.c 4.2 87/05/13 *.text8.data8(.bss`_erf_jmcountj_erfjoutstr_.o/ 548427144 98 100 100664 680 ` u U .textD .data(@.bss@`P~8pRq"q~8@@W @(#)outstr_.c 4.2 87/05/13 (*.08HJP XZd.text .data(.bss_outstr_jmcountj__iobj__flsbufjs_rnge.o/ 548427148 98 100 100664 1446 ` u U .textp* .datapp@.bssP`P<@~H#Π_ pT    "$$qx ΐ + ГDpT    "$$qv  ̓ ~Hɞ@Ǿ<PPW @(#)s_rnge.c 4.3 87/05/13 . Subscript out of range on file line %d, procedure . Attempt to access the %ld-th element of variable abort 46<B LNRT\lnt |~  (*06 < @BHN V .textp*.datap.bss_s_rngel`mcountl`__iobl`_fprintfl`__flsbufl`l`_exitl`__cleanupabort_.o/ 548427151 98 100 100664 634 ` u U| .textH .dataHHH@.bss8`hP pؓғ88W @(#)abort_.c 4.2 87/05/13 Fortran abort routine called $* 0 6 .textH.dataHH.bss_abort_kmcountk__iobk_fprintfkk_abortk__cleanupgetarg_.o/ 548427154 98 100 100664 616 ` u U .textL .data0@.bss`P@1~r$p@ @ 1A!r 1 !r~W @(#)getarg_.c 4.2 87/05/13 (*8 : J.text.data0.bss_getarg_kmcountk_xargck_xargvkiargc_.o/ 548427156 98 100 100664 440 ` u U .text  .data (@.bssHH`@PW @(#)iargc_.c 4.2 87/05/13 .text .data (.bssH_iargc_jmcountj_xargcjgetenv_.o/ 548427160 98 100 100664 648 ` u U .text .data(|@.bss`P~qC֐  * !(b*!1D(1=(q1 A@90q A@~ɞW @(#)getenv_.c 4.2 87/05/13 (*.text.data(.bss_getenv_lmcountl_environlsignal_.o/ 548427164 98 100 100664 998 ` u U .text0 .data000@.bss``8`PP0!x \ ` d llVn,p!*B88W@`XP"~<pppW~<@@W @(#)signal_.c 4.2 87/05/13 *06<R h ~       .text0.data00.bss`_signal_k(mcountk(_F7_SIGxk(k(_signalk(k(_F7_trtsig_F7_numsigs_stop.o/ 548427167 98 100 100664 956 ` u U .text .dataH\@.bssH`P<~@p T   q "$$q \VN~@Ǟ<HHW @(#)s_stop.c 4.2 87/05/13 STOP statement executed ,.4: DFJLTdfl tv   .text.dataH.bss_s_stopkmcountk__iobk_fprintfk__flsbufk_f_exitk_exitks_paus.o/ 548427172 98 100 100664 2211 ` u U,.text0J .data00@.bss((P`PPD~Hp X̌^T   q "$$q `\ N x6goB ! $ `ZR:H0 /2H ~HǞDPPW` PW @(#)s_paus.c 4.2 87/05/13 PAUSE statement executed To resume execution, type go. Any other input will terminate job. STOP To resume execution, execute a kill -%d %d command Execution resumes after PAUSE. (*06 DFJLTdfl tv    $&, 8:DVX`hjp |~    $.text0J.data0.bss(_s_pausmmcountm__iobm_fprintfm__flsbufm_isattym__filbufm_f_exitm_exitm_getpidm_signalm_pausem_waitpause system_.o/ 548427175 98 100 100664 516 ` u UP .textx, .dataxx(@.bss `P0 8@!!1( 8  W @(#)system_.c 4.2 87/05/13 j.textx.datax(.bss_system_kmcountk_systemkmclock_.o/ 548427178 98 100 100664 468 ` u U .textH .dataHH(@.bssppP`hP8.@8D !PPW @(#)mclock_.c 4.2 87/05/13 ".textH.dataH(.bssp_mclock_jmcountj_timesjsubout.o/ 548427182 98 100 100664 1438 ` u U .textp* .datapp@.bssP`P<@~H#Π_ pT    "$$qx  ΀ + ̓DpT    "$$qv  Г ~Hɞ@Ǿ<PPW @(#)subout.c 4.2 87/05/13 . Subscript out of range on line %d of procedure . Attempt to access the %ld-th element of variable abort 46<B LNRT\lnt |~  $&,2 8 <>DJ R .textp*.datap.bss_suboutl`mcountl`__iobl`_fprintfl`__flsbufl`l`_exitl`__cleanupexit_.o/ 548427185 98 100 100664 546 ` u U8 .textH .dataHH(@.bsspp8 `hPȧ~4pޓ~488W @(#)exit_.c 4.2 87/05/13 $* 4 .textH.dataH(.bssp_exit_jmcountj_f_exitjj_exitj__cleanupmvbits.o/ 548427189 98 100 100664 664 ` u U .text .data@D@.bss`PN0~q` $T` P Zpp  Ljcp  ` ~W @(#)mvbits.c 4.2 87/05/13 @(#)bit.h 3.2 87/05/13 jlpr.text.data@.bss_mvbits_jmcountj_F77maskjloc_.o/ 548427192 98 100 100664 388 ` u U.text .data(@.bss@@`8PW @(#)loc_.c 4.2 87/05/13 .text.data(.bss@_loc_jmcountjfdate_.o/ 548427195 98 100 100664 564 ` u UX .texth .datahh(@.bssH`P<~@qDD'~@ǎ<HHW @(#)fdate_.c 4.2 87/05/13 ,< P .texth.datah(.bss_fdate_jmcountj_timej_ctimej_b_charjpow_ci.o/ 548427198 98 100 100664 500 ` u U@ .texth .datahh(@.bss``P~<p1'3>@1'3P@>HP7X7~<``W @(#)pow_ci.c 4.2 87/05/13 @.texth.datah(.bss_pow_cijmcountj_pow_zijpow_hh.o/ 548427202 98 100 100664 484 ` u UD.textx, .dataxx(@.bss`P ~2@qz3zD@ 6z.!szczA 3 z~W @(#)pow_hh.c 4.2 87/05/13 .textx.datax(.bss_pow_hhkmcountkpow_ii.o/ 548427206 98 100 100664 784 ` u U\ .textp, .datapp0@.bss`P ~2 A 0 v1 j0. "  @: 0qCc! 3  @~W`P: ~A2 0 v1 j0. "  @: 0qCc! 3  @~W @(#)pow_ii.c 4.2 87/05/13 .textp.datap0.bss_pow_iimPmcountmP_Pow_iimPpow_zi.o/ 548427210 98 100 100664 684 ` u U .text  .data  (@.bssHHh?`@P@H~Pp1ǀ?X#X`@.`5 XW5 ɞ`41 5Xɷ5 3 's:.`^X5 5 41 ɞ`35 `.Xt~PɞHɾ@hhW @(#)pow_zi.c 4.2 87/05/13 ^.text .data (.bssH_pow_zikpmcountkp_z_divkppow_zz.o/ 548427214 98 100 100664 796 ` u U.text .data(|@.bssh`PDHP~Xr8#4(!8#475<54x`75:53qX^`!5@^`5 ~XɞPɾHDhhW @(#)pow_zz.c 4.2 87/05/13 HT n    .text.data(.bss_pow_zzkmcountk_cabsk_logk_atan2k_expk_cosk_sinkc_abs.o/ 548427218 98 100 100664 468 ` u U .textH .dataHH(@.bssppH`hP~@q!'w'"~@HHW @(#)c_abs.c 4.2 87/05/13 4.textH.dataH(.bssp_c_absjmcountj_cabsjc_cos.o/ 548427221 98 100 100664 644 ` u U .textL .data($@.bssH`P8~@q''!57'!2'5 7~@ɞ8HHW @(#)c_cos.c 4.2 87/05/13 4H d z .text.data(.bss_c_cosjmcountj_cosj_coshj_sinj_sinhjc_div.o/ 548427226 98 100 100664 876 ` u U .text`< .data``P@.bssX`P<@H~Pr''": 21 ':2:  0:  z&' '5?3 5 ''53 6 7 ''54 6 7 `&' '5?3 5 ''53 6 7 '5('"4 6 7 ~PɞHɾ@<XXW @(#)c_div.c 4.2 87/05/13 abort: complex division by zero rtz  .text`.data`P.bss_c_divkpmcountkp__iobkp_fprintfkp_exitkpc_exp.o/ 548427229 98 100 100664 596 ` u Ux .text< .data(@.bssH`P8~@q''!57'5 7~@ɞ8HHW @(#)c_exp.c 4.2 87/05/13 4H d .text.data(.bss_c_expjmcountj_expj_cosj_sinjc_log.o/ 548427233 98 100 100664 596 ` u Ux .text< .data(@.bssH`P~@q7''3#4!77''3#4(!7~@HHW @(#)c_log.c 4.2 87/05/13 :b n .text.data(.bss_c_logjmcountj_atan2j_cabsj_logjc_sin.o/ 548427237 98 100 100664 644 ` u U .textL .data($@.bssH`P8~@q''!57''5 7~@ɞ8HHW @(#)c_sin.c 4.2 87/05/13 4H d x .text.data(.bss_c_sinjmcountj_sinj_coshj_cosj_sinhjc_sqrt.o/ 548427241 98 100 100664 736 ` u U .text( .data(((@.bssPPP`HP@~Hp8''3#4!B1$:h*F'30?@5v7&' ?057^ǘ'$40?@5.7*"&' ?057~Hɞ@PPW @(#)c_sqrt.c 4.2 87/05/13 >  .text(.data((.bssP_c_sqrtkmcountk_cabsk_sqrtkz_abs.o/ 548427244 98 100 100664 468 ` u U .textH .dataHH(@.bssppH`hP~@q!~@HHW @(#)z_abs.c 4.2 87/05/13 0.textH.dataH(.bssp_z_absjmcountj_cabsjz_cos.o/ 548427248 98 100 100664 636 ` u U .textD .data(@.bssH`P8~@q!5!25 ~@ɞ8HHW @(#)z_cos.c 4.2 87/05/13 2D \ p .text.data(.bss_z_cosjmcountj_cosj_coshj_sinj_sinhjz_div.o/ 548427253 98 100 100664 844 ` u Up .text@ .data@@P@.bssX``P<@H~Pr': 21 :2: x 0:  h~W%661 5"ޠ?3*5*ɨ536ɨx5 46 LW%661 5"ޠ?3*5*ɨ536ɨ54 6 ~PɞHɾ@<XXW @(#)z_div.c 4.2 87/05/13 abort: complex division by zero npv|  .text@.data@P.bss_z_divkpmcountkp__iobkp_fprintfkp_exitkpz_exp.o/ 548427257 98 100 100664 580 ` u Uh .textx, .dataxx(@.bssH`P8~@q!55 ~@ɞ8HHW @(#)z_exp.c 4.2 87/05/13 2D \ .textx.datax(.bss_z_expjmcountj_expj_cosj_sinjz_log.o/ 548427260 98 100 100664 588 ` u Up .text4 .data( @.bssH`P~@q7#4!7#4(!~@HHW @(#)z_log.c 4.2 87/05/13 6X d .text.data(.bss_z_logjmcountj_atan2j_cabsj_logjz_sin.o/ 548427264 98 100 100664 636 ` u V .textD .data(@.bssH`P8~@q!55 ~@ɞ8HHW @(#)z_sin.c 4.2 87/05/13 2D \ n .text.data(.bss_z_sinjmcountj_sinj_coshj_cosj_sinhjz_sqrt.o/ 548427269 98 100 100664 712 ` u V .text .data(@.bss88P`0P@~Hp8#4!B1:90X5F:90B5F31$0?@5v'6 ?05R840?@5< 0:2'6 ?05~Hɞ@PPW @(#)z_sqrt.c 4.2 87/05/13 :  .text.data(.bss8_z_sqrtkmcountk_cabsk_sqrtkr_cnjg.o/ 548427272 98 100 100664 412 ` u V.text0 .data00(@.bssXX`PP "W @(#)r_cnjg.c 4.2 87/05/13 .text0.data0(.bssX_r_cnjgjmcountjr_dim.o/ 548427276 98 100 100664 428 ` u V  .text@ .data@@(@.bsshh``P0!`*$' W @(#)r_dim.c 4.2 87/05/13 .text@.data@(.bssh_r_dimjmcountjr_imag.o/ 548427280 98 100 100664 396 ` u V.text  .data (@.bssHH`@P'W @(#)r_imag.c 4.2 87/05/13 .text .data (.bssH_r_imagjmcountjr_int.o/ 548427284 98 100 100664 504 ` u VD .text` .data``(@.bss8`P b*'̋"'288W @(#)r_int.c 4.2 87/05/13 6N.text`.data`(.bss_r_intjmcountj_floorjr_nint.o/ 548427288 98 100 100664 512 ` u VL .texth .datahh(@.bss8`P*'0?@3Ƌ'1? 4288W @(#)r_nint.c 4.3 87/05/13 <V.texth.datah(.bss_r_nintjmcountj_floorjr_sign.o/ 548427292 98 100 100664 452 ` u V$.textX  .dataXX(@.bss`xP 1b*'"'7 * '"'W @(#)r_sign.c 4.2 87/05/13 .textX.dataX(.bss_r_signjmcountjrand_.o/ 548427296 98 100 100664 612 ` u V  .textx< .dataxx8@.bss`PW@`Pҧ ANm09s 9 @@W @(#)rand_.c 4.2 87/05/13  *0>Pj .textx.datax8.bss_srand_jmcountj_rand_(j_ldexpjd_cnjg.o/ 548427300 98 100 100664 412 ` u V$.text0 .data00(@.bssXX`PP 022W @(#)d_cnjg.c 4.2 87/05/13 .text0.data0(.bssX_d_cnjgjmcountjd_dim.o/ 548427305 98 100 100664 444 ` u V).textP .dataPP(@.bssxx`pP ~2p:70"4  ~W @(#)d_dim.c 4.2 87/05/13 .textP.dataP(.bssx_d_dimjmcountjd_imag.o/ 548427309 98 100 100664 396 ` u V-.text  .data (@.bssHH`@PW @(#)d_imag.c 4.2 87/05/13 .text .data (.bssH_d_imagjmcountjd_int.o/ 548427313 98 100 100664 512 ` u V1L .texth .datahh(@.bss@`P~8!p:' ȋ22~8@@W @(#)d_int.c 4.2 87/05/13 :P.texth.datah(.bss_d_intjmcountj_floorjd_mod.o/ 548427317 98 100 100664 772 ` u V5< .text  .data  0@.bssPPH`@P8~@q'61 : 1 "#21 5(4 ~@ɞ8HHWP?`HPf8@~Hr 61 : *1 "#21 5):4 ~Hɞ@ɾ8PPW @(#)d_mod.c 4.2 87/05/13 H^.text .data 0.bssP_d_modk(mcountk(_floork(_D_modk(d_nint.o/ 548427321 98 100 100664 512 ` u V9L .texth .datahh(@.bss8`P0@:100?@3Ƌ0?@41288W @(#)d_nint.c 4.3 87/05/13 <T.texth.datah(.bss_d_nintjmcountj_floorjd_prod.o/ 548427325 98 100 100664 404 ` u V=.text( .data(((@.bssPP`HP %'W @(#)d_prod.c 4.2 87/05/13 .text(.data((.bssP_d_prodjmcountjd_sign.o/ 548427330 98 100 100664 452 ` u VB$.textX  .dataXX(@.bss`xP ~r : 2q 0: 2p~W @(#)d_sign.c 4.2 87/05/13 .textX.dataX(.bss_d_signjmcountji_abs.o/ 548427334 98 100 100664 412 ` u VF.text0 .data00     (@.bssXX`PP W @(#)i_abs.c 4.2 87/05/13 .text0.data0(.bssX_i_absjmcountji_dim.o/ 548427338 98 100 100664 420 ` u VJ.text8 .data88(@.bss```XP0!bW @(#)i_dim.c 4.2 87/05/13 .text8.data8(.bss`_i_dimjmcountji_dnnt.o/ 548427342 98 100 100664 528 ` u VN\ .textx, .dataxx(@.bss@`P~8!p:' 0?@30?@4120~8@@W @(#)i_dnnt.c 4.2 87/05/13 D`.textx.datax(.bss_i_dnntjmcountj_floorji_indx.o/ 548427347 98 100 100664 500 ` u VST.text< .data(@.bss`P~pAϠ80$1!(  ~ɞW @(#)i_indx.c 4.2 87/05/13 .text.data(.bss_i_indxkmcountki_len.o/ 548427351 98 100 100664 388 ` u VW.text .data(@.bss@@`8PW @(#)i_len.c 4.2 87/05/13 .text.data(.bss@_i_lenjmcountji_mod.o/ 548427355 98 100 100664 396 ` u V[.text  .data (@.bssHH`@PW @(#)i_mod.c 4.2 87/05/13 .text .data (.bssH_i_modjmcountji_nint.o/ 548427360 98 100 100664 512 ` u V`L .texth .datahh(@.bss8`P*'0?@3Ƌ'1? 42088W @(#)i_nint.c 4.3 87/05/13 <V.texth.datah(.bss_i_nintjmcountj_floorji_sign.o/ 548427364 98 100 100664 428 ` u Vd .text@ .data@@(@.bsshh``P    W @(#)i_sign.c 4.2 87/05/13 .text@.data@(.bssh_i_signjmcountjh_abs.o/ 548427369 98 100 100664 420 ` u Vi.text8 .data88(@.bss```XPaz zzzW @(#)h_abs.c 4.2 87/05/13 .text8.data8(.bss`_h_absjmcountjh_dim.o/ 548427374 98 100 100664 428 ` u Vn .text@ .data@@(@.bsshh``P0!SbzzzzzW @(#)h_dim.c 4.2 87/05/13 .text@.data@(.bssh_h_dimjmcountjh_dnnt.o/ 548427378 98 100 100664 528 ` u Vr\ .textx, .dataxx(@.bss@`P~8!p:' 0?@30?@4120~8@@W @(#)h_dnnt.c 4.2 87/05/13 D`.textx.datax(.bss_h_dnntjmcountj_floorjh_indx.o/ 548427383 98 100 100664 500 ` u VwT.text< .data(@.bss`P~pAϠ<0$1!( z~ɞW @(#)h_indx.c 4.2 87/05/13 .text.data(.bss_h_indxkmcountkh_len.o/ 548427388 98 100 100664 396 ` u V|.text  .data (@.bssHH`@PzW @(#)h_len.c 4.2 87/05/13 .text .data (.bssH_h_lenjmcountjh_mod.o/ 548427392 98 100 100664 412 ` u V.text0 .data00(@.bssXX`PP zzzW @(#)h_mod.c 4.2 87/05/13 .text0.data0(.bssX_h_modjmcountjh_nint.o/ 548427397 98 100 100664 512 ` u VL .texth .datahh(@.bss8`P*'0?@3Ƌ'1? 42088W @(#)h_nint.c 4.3 87/05/13 <V.texth.datah(.bss_h_nintjmcountj_floorjh_sign.o/ 548427402 98 100 100664 444 ` u V.textP .dataPP(@.bssxx`pP bz zzz z z zzW @(#)h_sign.c 4.2 87/05/13 .textP.dataP(.bssx_h_signjmcountjl_ge.o/ 548427407 98 100 100664 444 ` u V .text0 .data00(@.bssXX@`PP@]@@W @(#)l_ge.c 4.2 87/05/13  .text0.data0(.bssX_l_gejmcountj_s_cmpjl_gt.o/ 548427411 98 100 100664 444 ` u V .text0 .data00(@.bssXX@`PP@T@@W @(#)l_gt.c 4.2 87/05/13  .text0.data0(.bssX_l_gtjmcountj_s_cmpjl_le.o/ 548427416 98 100 100664 444 ` u V .text0 .data00(@.bssXX@`PP@\@@W @(#)l_le.c 4.2 87/05/13  .text0.data0(.bssX_l_lejmcountj_s_cmpjl_lt.o/ 548427421 98 100 100664 444 ` u V .text0 .data00(@.bssXX@`PP@U@@W @(#)l_lt.c 4.2 87/05/13  .text0.data0(.bssX_l_ltjmcountj_s_cmpjhl_ge.o/ 548427426 98 100 100664 452 ` u V .text8 .data88(@.bss``@`XP@]z@@W @(#)hl_ge.c 4.2 87/05/13  .text8.data8(.bss`_hl_gejmcountj_s_cmpjhl_gt.o/ 548427431 98 100 100664 452 ` u V .text8 .data88(@.bss``@`XP@Tz@@W @(#)hl_gt.c 4.2 87/05/13  .text8.data8(.bss`_hl_gtjmcountj_s_cmpjhl_le.o/ 548427435 98 100 100664 452 ` u V .text8 .data88(@.bss``@`XP@\z@@W @(#)hl_le.c 4.2 87/05/13  .text8.data8(.bss`_hl_lejmcountj_s_cmpjhl_lt.o/ 548427441 98 100 100664 452 ` u V .text8 .data88(@.bss``@`XP@Uz@@W @(#)hl_lt.c 4.2 87/05/13  .text8.data8(.bss`_hl_ltjmcountj_s_cmpjs_cat.o/ 548427446 98 100 100664 532 ` u Vt.text\ .data(4@.bss`ȓP@~qǠ@.8  887A1! tŋA 88~ɞW @(#)s_cat.c 4.2 87/05/13 .text.data(.bss_s_catk(mcountk(s_cmp.o/ 548427452 98 100 100664 604 ` u V.text .data(|@.bss`P~pA 0Z"gaqA(  nA(\( qA6(  q(~W @(#)s_cmp.c 4.2 87/05/13 .text.data(.bss_s_cmpkmcountks_copy.o/ 548427457 98 100 100664 508 ` u V\.textD .data(@.bss`P@~q0!&Aq(F Aq(A (~W @(#)s_copy.c 4.2 87/05/13 .text.data(.bss_s_copyk@mcountk@bit.o/ 548427463 98 100 100664 768 ` u V$ .text .data8@.bss88`P 1A`@ W` P 1` W`(P~ 1  ` ^W8`0P:0(R88W @(#)bit.c 4.2 87/05/13 BH~.text.data8.bss8_bis_kmcountk_bic_@k_bit_|k_setbit_klnblnk_.o/ 548427468 98 100 100664 428 ` u V .text@ .data@@(@.bsshh``P 0 ( W @(#)lnblnk_.c 4.2 87/05/13 .text@.data@(.bssh_lnblnk_jmcountjrindex_.o/ 548427474 98 100 100664 532 ` u V` .text< .data(@.bssX`PDH~Pp( ):qq(~PɞHǾDXXW @(#)rindex_.c 4.2 87/05/13 J.text.data(.bss_rindex_jmcountj_s_cmpjcabs.o/ 548427480 98 100 100664 564 ` u V .text\ .data(4@.bss@`ȓP~8p#0@:70 27s0@:10"B1:707Hq$B137:70 *6B1$50?@3x5A0~8@@W @(#)cabs.c 4.2 87/05/13 .text.data(.bss_cabskmcountk_sqrtksecnds.o/ 548427485 98 100 100664 436 ` u V .textH .dataHH@.bssPP8`HP~4q)< %$~488W &.textH.dataH.bssP_secnds_jmcountj_mclock_jmatherr.o/ 548427490 98 100 100664 348 ` u V.text .data@.bss`PW.text.data.bss_matherrjmcountjd_abs.o/ 548427496 98 100 100664 424 ` u V .text( .data((@.bss88`(P`0P  W.text(.data(.bss8_d_absj_D_absjmcountjpow_di.o/ 548427502 98 100 100664 1006 ` u V .textXT .dataXXp@.bss`P A`PB 1  WPPƈF?@4@D6 1?P TP5qA@ 5"W8 X.41>0H0<m &!Z:, &. PWpowpow: SING error pow: DOMAIN error pow: input value was NAN pow: input value was INF   <F.textX .dataXp.bss_errnoo0_writeo0_matherro0_pow_dio0_Pow_dio0mcounto0UNDERFLOWpow_ri.o/ 548427508 98 100 100664 974 ` u V .text84 .data88p@.bss`P!`P! WPFƈ<? 0 ("0?&10 20%q! %W8 8.41>0H0PtM :!N(z &` PWpowpow: SING error pow: DOMAIN error pow: input value was NAN pow: input value was INF   ".text8 .data8p.bss_errnoo_writeo_matherro_pow_rio_Pow_riomcountoUNDERFLOWbitsR2V2.o/ 548427516 98 100 100664 2810 ` u V .textL .data @.bss`P .( (F 8(* (zBz .("p  c zW`P8 .( ( F 8(*  ( 4 .("p  cW`P .( (F 8(* (jBj .("p  c jW`Pħ .( Tz  ԖF8(&((z(z(p zTzp `z(p cڛNzp `z(p czz z  zW`P" .( Tz  ЖF 8(&(( ((p zPp `(p cԛJp `(p c  W`P .( Tz  ԖF8(&((j(j(p zTjp `j(p cڛNjp `j(p cjj j  jW????bv|8>0V~:^d,V|.text.data.bss_bext_hnpmcountnp_F77masknp_bext_lnp_bext_btnpnp_shftc_h6np_shftc_lnp_shftc_b\np_F77zmaskbitsIRTF.o/ 548427523 98 100 100664 2236 ` u W.text`* .data``@.bss``P`WaW`hPz`WaW`pP`WaW`xPbWcW`PjzbWcW`PFbWcW`P"hW hW`Pzh 0`aa#  h 0`aa# W`P&h 0`a0a# q( q( " h 0`aq( q( q( W`P^! W`P>z! W`P! W`P! W`ȓPz! W`ГP! W`ؓP!W`P~z!W`P^!W`P> 1   W`P z 1   W`P 1   W&,JPntFL$>D^d~*0.text`*.data`.bss_jishlomcounto_iishl$o_bishlHo_jishalo_iishao_bishao_jishco_iishco_bishcDo_jibseto_iibseto_bibseto_jibclro_iibclro_bibclr<o_bjtest\o_bitest|o_bbtesto_jibchngo_iibchngo_bibchng(onint.o/ 548427529 98 100 100664 790 ` u W  .textd .dataL@.bss`P? # W$ W`ȓPO**?# )W$ )W`ГP A0: r 0* !b ?0 309W409W *0 B P rx   .text .data.bsslH"lH,(lH_xd_nintplHmcountlH_rr_nintlH_d_nintlH6DONEHALF1DONEHALF2_xri_nint_xrh_nint_xrr_nintnbpar.o/ 548427535 98 100 100664 380 ` u W.text0 .data00@.bss88`0P  10!W.text0.data0.bss8_nb$par_jmcountjminmax.o/ 548427548 98 100 100664 1720 ` u Wd.textxt .dataxxp@.bss`P. !A0@C! W`P. !A0C! W`PZ. !A0*C! W`P. !A0*C! W`P©. .$2$)A$)*A10W`Pn. .$2$)A$)*A10W`ȓP. !A0*C! W`ГPΩ. !A0*C! W`ؓP~(.0.($2  ɒ$  r: 10 ~ɞW`P~(.0.($2  ɒ$  r: 10 ~ɞW @(#)minmax.c 3.2 87/05/13 V\:@.4z.textx.dataxp.bss_min0omcounto_max0To_min1o_max1o_amin08o_amax0o_amin1o_amax1,o_dmin1xo_dmax1or_mod.o/ 548427550 98 100 100664 764 ` u W4 .text .data0@.bssHHH`8P8~@q&' : 1 "#21 '5('"4 ~@ɞ8HHWH`@Pb8~@q&' : 01 "#21 '5 '(4 7~@ɞ8HHW @(#)r_mod.c 3.2 87/05/13 H^.text.data0.bssH_r_modk(mcountk(_floork(_R_modk(rr_nint.o/ 548427551 98 100 100664 504 ` u WD .text` .data``(@.bss8`P* ?#̋ ?$!"88W @(#)rr_nint.c 4.2 87/05/13 6L.text`.data`(.bss_rr_nintjmcountj_s_floorj4...5s.backspace.c6s.close.c7s.dfe.c8s.due.c9s.endfile.c:s.err.c;s.f7flsh.cs.fmt.h?s.fmtlib.c@s.getfd.cAs.iio.cBs.inquire.cCs.MakefileDs.lio.cEs.lio.hFs.lread.cGs.nio.cHs.open.cIs.rdfmt.cJs.rewind.cKs.rsfe.cLs.sfe.cMs.sue.cNs.uio.cOs.units.cPs.units.hQs.util.cRs.wrtfmt.cSs.wsfe.cTfio.hUunits.hVfmt.hWlibI77.aXlio.hYlibI77.a.mapZplibI77.a.map[plibI77.ah00325 s 00001/00001/00061 d D 4.3 87/05/13 17:45:59 build 6 5 c removed old SCCS strings and inserted #ident BB e s 00000/00000/00062 d D 4.2 87/02/17 09:40:47 mth 5 4 c rolled rev to -r4 (mth) e s 00000/00000/00062 d D 4.1 87/02/17 09:09:38 mth 4 3 c rolled rev to -r4 (mth) e s 00000/00000/00062 d D 3.1 87/01/21 17:21:49 mkm 3 2 c e s 00000/00000/00062 d D 2.1 87/01/21 17:20:34 mkm 2 1 c e s 00062/00000/00000 d D 1.1 87/01/21 17:12:07 mkm 1 0 c Placed under source control - mkm c These files are direct descendants of the ROS files c by the same name at or about ROS rev 1.3 e u U f b f n t T I 1 D 6 /* "%W% %E%" */ E 6 I 6 #ident " %W% %E% " E 6 #include "fio.h" f_back(a) register alist *a; { register unit *b; int n,i; register long x; char buf[32]; lunit=getunit(a->aunit); if (not_legal(lunit)) err(a->aerr,101,"backspace") b= &units[lunit]; if(b->ufd==NULL) if(fk_open(SEQ,FMT,a->aunit)) err(a->aerr,114,"backspace") if(b->uend==1) { b->uend=0; return(0); } if((x = ftell(b->ufd)) == 0) return(0); if(b->useek==0) err(a->aerr,106,"backspace") if(b->uwrt) { (void) t_runc(b); (void) nowreading(b); } if(b->url>0) { long y; x=ftell(b->ufd); y = x % b->url; if(y == 0) x--; x /= b->url; x *= b->url; (void) fseek(b->ufd,x,0); return(0); } if(b->ufmt==0) { (void) fseek(b->ufd,-(long)sizeof(int),1); (void) fread((char *)&n,sizeof(int),1,b->ufd); (void) fseek(b->ufd,-(long)n-2*sizeof(int),1); return(0); } for(;;) { long y; y = x=ftell(b->ufd); if(xufd,x,0); n=fread(buf,1,(int)(y-x), b->ufd); for(i=n-2;i>=0;i--) { if(buf[i]!='\n') continue; (void) fseek(b->ufd,(long)(i+1-n),1); return(0); } if(x==0) { (void) fseek(b->ufd,0L,0); return(0); } else if(n<=0) err(a->aerr,(EOF),"backspace") (void) fseek(b->ufd, x, 0); } } E 1 h22554 s 00001/00001/00081 d D 4.4 87/05/13 17:46:22 build 7 6 c removed old SCCS strings and inserted #ident BB e s 00008/00000/00074 d D 4.3 87/04/02 15:54:43 build 6 5 c Make logical file names work more like they do on VMS e s 00000/00000/00074 d D 4.2 87/02/17 09:40:52 mth 5 4 c rolled rev to -r4 (mth) e s 00000/00000/00074 d D 4.1 87/02/17 09:09:40 mth 4 3 c rolled rev to -r4 (mth) e s 00000/00000/00074 d D 3.1 87/01/21 17:21:50 mkm 3 2 c e s 00000/00000/00074 d D 2.1 87/01/21 17:20:35 mkm 2 1 c e s 00074/00000/00000 d D 1.1 87/01/21 17:12:07 mkm 1 0 c Placed under source control - mkm c These files are direct descendants of the ROS files c by the same name at or about ROS rev 1.3 e u U f b f n t T I 1 D 7 /* "%W% %E%" */ E 7 I 7 #ident " %W% %E% " E 7 #include "fio.h" #include "units.h" #ifdef LFNAMES extern int lfn_flag; #endif f_clos(a) register cllist *a; { register unit *b; #ifdef LFNAMES char *pfname; #endif lunit=getunit(a->cunit); if (not_legal(lunit)) return(0); b= &units[lunit]; if(b->ufd==NULL) return(0); b->uend=0; if(a->csta!=0) switch(*a->csta) { default: keep: case 'k': case 'K': if(b->uwrt) (void) t_runc(b); if(fclose(b->ufd) != 0) abort(); if(b->ufnm!=0) free(b->ufnm); b->ufnm=NULL; b->ufd=NULL; disconnect(lunit); return(0); case 'd': case 'D': delete: (void) fclose(b->ufd); #ifdef LFNAMES if(lfn_flag) I 6 #ifdef ridge { E 6 pfname = (char *) getenv(b->ufnm); I 6 if (pfname == NULL) pfname = b->ufnm; } #else pfname = (char *) getenv(b->ufnm); #endif E 6 else pfname = b->ufnm; if(pfname) unlink(pfname); /* SYSDEP */ if(b->ufnm) free(b->ufnm); #else if(b->ufnm!=0) { (void) unlink(b->ufnm); /*SYSDEP*/ free(b->ufnm); } #endif b->ufnm=NULL; b->ufd=NULL; disconnect(lunit); return(0); } else if(b->uscrtch==1) goto delete; else goto keep; } f_exit() { int i; cllist xx; xx.cerr=1; xx.csta=NULL; for(i=0;iuwrt) (void) nowreading(curunit); getn = y_getc; back = y_back; doed = rd_ed; doned = rd_ned; doend = dorevert = y_rnew; donewrec = y_err; if(pars_f(fmtbuf)<0) err(a->cierr,100,"startio"); if(checkmode(READING)) return(119); fmt_bg(); return(0); } s_wdfe(a) cilist *a; { int n; if(!init) f_init(); if(n=c_dfe(a)) return(n); reading=0; if(!curunit->uwrt) (void) nowwriting(curunit); putn = y_putc; back = y_back; doed = w_ed; doned= w_ned; donewrec = y_err; doend = dorevert = y_wnew; if(pars_f(fmtbuf)<0) err(a->cierr,100,"startwrt"); if(checkmode(WRITING)) return(119); fmt_bg(); return(0); } e_rdfe() { (void) en_fio(); return(0); } e_wdfe() { (void) en_fio(); return(0); } c_dfe(a) register cilist *a; { sequential=0; formatted=external=1; elist=a; cursor=scale=recpos=0; lunit=getunit(a->ciunit); if (not_legal(lunit)) err(a->cierr,101,"startchk"); curunit = &units[lunit]; if(curunit->ufd==NULL && fk_open(DIR,FMT,a->ciunit)) err(a->cierr,104,"dfe"); cf=curunit->ufd; if(!curunit->ufmt) err(a->cierr,102,"dfe") if(!curunit->useek) err(a->cierr,104,"dfe") fmtbuf=a->cifmt; (void) fseek(cf,(long)curunit->url * (a->cirec-1),0); curunit->uend = 0; return(0); } /*---------------------------------------- y_rsk() { if(curunit->uend || curunit->url <= recpos || curunit->url == 1) return; do { getc(cf); } while(++recpos < curunit->url); } ------------------------------------------*/ y_getc() { int ch; if(curunit->uend) return(-1); if((ch=getc(cf))!=EOF) { recpos++; if(curunit->url>=recpos || curunit->url==1) return(ch); else return(' '); } if(feof(cf)) { curunit->uend=1; errno=0; return(-1); } err(elist->cierr,errno,"readingd"); } y_putc(c) { recpos++; if(recpos <= curunit->url || curunit->url==1) putc(c,cf); else err(elist->cierr,110,"dout"); return(0); } y_back() { recpos--; } /*------------------------------------------------ y_rev() { /*what about work done? if(curunit->url==1 || recpos==curunit->url) return(0); while(recposurl) (*putn)(' '); recpos=0; return(0); } --------------------------------------------------*/ y_err() { err(elist->cierr, 110, "dfe"); } y_rnew() { if(curunit->url !=1) { fseek(cf,(long)curunit->url*(++icnum),0); recpos = cursor = 0; } return(0); } y_wnew() { if(curunit->url !=1) { while(recposurl)(*putn)(' '); icnum++; recpos = cursor = 0; } return(0); } E 1 h09733 s 00001/00001/00059 d D 4.3 87/05/13 17:46:53 build 6 5 c removed old SCCS strings and inserted #ident BB e s 00000/00000/00060 d D 4.2 87/02/17 09:41:02 mth 5 4 c rolled rev to -r4 (mth) e s 00000/00000/00060 d D 4.1 87/02/17 09:09:49 mth 4 3 c rolled rev to -r4 (mth) e s 00000/00000/00060 d D 3.1 87/01/21 17:21:51 mkm 3 2 c e s 00000/00000/00060 d D 2.1 87/01/21 17:20:37 mkm 2 1 c e s 00060/00000/00000 d D 1.1 87/01/21 17:12:08 mkm 1 0 c Placed under source control - mkm c These files are direct descendants of the ROS files c by the same name at or about ROS rev 1.3 e u U f b f n t T I 1 D 6 /* "%W% %E%" */ E 6 I 6 #ident " %W% %E% " E 6 #include "fio.h" s_rdue(a) cilist *a; { int n; if(n=c_due(a)) return(n); reading=1; if(checkmode(READING)) return(119); if(curunit->uwrt) (void) nowreading(curunit); return(0); } s_wdue(a) cilist *a; { int n; if(n=c_due(a)) return(n); reading=0; if(checkmode(WRITING)) return(119); if(!curunit->uwrt) (void) nowwriting(curunit); return(0); } c_due(a) register cilist *a; { if(!init) f_init(); lunit=getunit(a->ciunit); if (not_legal(lunit)) err(a->cierr,101,"startio"); recpos=sequential=formatted=0; external=1; curunit = &units[lunit]; elist=a; if(curunit->ufd==NULL && fk_open(DIR,UNF,a->ciunit) ) err(a->cierr,104,"due"); cf=curunit->ufd; if(curunit->ufmt) err(a->cierr,102,"cdue") if(!curunit->useek) err(a->cierr,104,"cdue") if(curunit->ufd==NULL) err(a->cierr,114,"cdue") (void) fseek(cf,(long)(a->cirec-1)*curunit->url,0); curunit->uend = 0; return(0); } e_rdue() { register int i; if(curunit->url==1 || recpos==curunit->url) return(0); i = (long) curunit->url-recpos; if(i <= cf->_cnt) { cf->_cnt -= i; cf->_ptr += i; } else (void) fseek(cf,(long)(curunit->url-recpos),1); if(ftell(cf)%curunit->url) err(elist->cierr,200,"syserr"); return(0); } e_wdue() { return(e_rdue()); } E 1 h11198 s 00001/00001/00059 d D 4.3 87/05/13 17:47:07 build 6 5 c removed old SCCS strings and inserted #ident BB e s 00000/00000/00060 d D 4.2 87/02/17 09:41:05 mth 5 4 c rolled rev to -r4 (mth) e s 00000/00000/00060 d D 4.1 87/02/17 09:09:52 mth 4 3 c rolled rev to -r4 (mth) e s 00000/00000/00060 d D 3.1 87/01/21 17:21:52 mkm 3 2 c e s 00000/00000/00060 d D 2.1 87/01/21 17:20:38 mkm 2 1 c e s 00060/00000/00000 d D 1.1 87/01/21 17:12:09 mkm 1 0 c Placed under source control - mkm c These files are direct descendants of the ROS files c by the same name at or about ROS rev 1.3 e u U f b f n t T I 1 D 6 /* "%W% %E%" */ E 6 I 6 #ident " %W% %E% " E 6 #include "fio.h" static alist *ax; extern char *mktemp(), *strcpy(); f_end(a) alist *a; { register unit *b; lunit=getunit(a->aunit); if (not_legal(lunit)) err(a->aerr,101,"endfile"); b = &units[lunit]; if(b->ufd==NULL) if(fk_open(SEQ,FMT,a->aunit)) err(a->aerr,114,"endfile") b->uend=1; if( b->useek==0) return(0); ax=a; if(b->uwrt) (void) nowreading(b); return(t_runc(b)); } t_runc(b) register unit *b; { char buf[128],nm[16]; FILE *tmp; int n,m; register long loc,len; if(b->url) return(0); /*don't truncate direct files*/ loc=ftell(b->ufd); (void) fseek(b->ufd,0L,2); len=ftell(b->ufd); if(loc==len || b->useek==0 || b->ufnm==NULL) return(0); (void) strcpy(nm,"tmp.FXXXXXX"); if(b->uwrt) (void) nowreading(b); (void) mktemp(nm); tmp=fopen(nm,"w"); (void) fseek(b->ufd,0L,0); for(;loc>0;) { n=fread(buf,1,loc>128?128:(int)loc,b->ufd); if(n>loc) n=loc; loc -= n; (void) fwrite(buf,1,n,tmp); } (void) fflush(tmp); for(n=0;n<10;n++) { if((m=fork())==-1) continue; else if(m==0) { (void) execl("/bin/cp","cp",nm,b->ufnm,0); (void) execl("/usr/bin/cp","cp",nm,b->ufnm,0); fprintf(stdout,"no cp\n"); exit(1); } (void) wait(&m); if(m!=0) err(ax->aerr,111,"endfile"); (void) fclose(tmp); (void) unlink(nm); return(0); } err(ax->aerr,111,"endfile"); } E 1 h38729 s 00001/00001/00172 d D 4.4 87/05/13 17:47:23 build 7 6 c removed old SCCS strings and inserted #ident BB e s 00016/00000/00157 d D 4.3 87/04/02 15:32:27 build 6 5 c Make logical file names work more like they do on VMS e s 00000/00000/00157 d D 4.2 87/02/17 09:41:08 mth 5 4 c rolled rev to -r4 (mth) e s 00000/00000/00157 d D 4.1 87/02/17 09:09:56 mth 4 3 c rolled rev to -r4 (mth) e s 00000/00000/00157 d D 3.1 87/01/21 17:21:53 mkm 3 2 c e s 00000/00000/00157 d D 2.1 87/01/21 17:20:38 mkm 2 1 c e s 00157/00000/00000 d D 1.1 87/01/21 17:12:10 mkm 1 0 c Placed under source control - mkm c These files are direct descendants of the ROS files c by the same name at or about ROS rev 1.3 e u U f b f n t T I 1 D 7 /* "%W% %E%" */ E 7 I 7 #ident " %W% %E% " E 7 #include #include #include #include "fio.h" #include "units.h" #define STR(x) (x==NULL?"":x) /*global definitions*/ unit units[MXUNIT]; /*unit table*/ char *fortfile = "fort.%d"; /* default file template*/ #ifdef LFNAMES char *fortlfile = "FORT%d"; /* default file template for lfn*/ extern int lfn_flag; #endif flag init; /*0 on entry, 1 after initializations*/ cilist *elist; /*active external io list*/ flag reading; /*1 if reading, 0 if writing*/ flag cplus,cblank; char *fmtbuf; flag external; /*1 if external io, 0 if internal */ int (*doed)(),(*doned)(); int (*doend)(),(*donewrec)(),(*dorevert)(); flag sequential; /*1 if sequential io, 0 if direct*/ flag formatted; /*1 if formatted io, 0 if unformatted*/ int (*getn)(),(*putn)(); /*for formatted io*/ int (*back)(); FILE *cf; /*current file*/ unit *curunit; /*current unit*/ int lunit; /*current logical unit*/ int recpos; /*place in current record*/ int cursor,scale; /*error messages*/ char *F_err[] = { "error in format", "illegal unit number", "formatted io not allowed", "unformatted io not allowed", "direct io not allowed", "sequential io not allowed", "can't backspace file", "null file name", "can't stat file", "unit not connected", "off end of record", "truncation failed in endfile", "incomprehensible list input", "out of free space", "unit not connected", "read unexpected character", "blank logical input field", "new file exist", "maximum number of concurrently open files exceeded", "opening mode violation", "illegal mode", "bad variable type", "bad namelist name", "variable not in namelist", "no end record", "variable count incorrect", "logical file name not defined", }; #define MAXERR (sizeof(F_err)/sizeof(char *)+100) fatal(n,s) char *s; { if(n<100 && n>=0) perror(s); /*SYSDEP*/ else if(n>=(int)MAXERR) { fprintf(stderr,"%s: illegal error number %d\n",s,n); } else if(n<0) fprintf(stderr,"%s: end of file %d\n",s,n); else fprintf(stderr,"%s: %s\n",s,F_err[n-100]); if(elist) { fprintf(stderr,"apparent state: unit %d named %s\n",avunit[lunit], STR(curunit->ufnm)); fprintf(stderr,"last format: %s\n",STR(fmtbuf)); fprintf(stderr,"lately %s %s %s %s IO\n",reading?"reading":"writing", sequential?"sequential":"direct",formatted?"formatted":"unformatted", external?"external":"internal"); } _cleanup(); abort(); } /*initialization routine*/ f_init() { register unit *p; init=1; p= &units[0]; p->ufd=stderr; p->useek=canseek(stderr); p->ufmt=1; p->uwrt=1; p = &units[5]; p->ufd=stdin; p->useek=canseek(stdin); p->ufmt=1; p->uwrt=0; p= &units[6]; p->ufd=stdout; p->useek=canseek(stdout); p->ufmt=1; p->uwrt=1; } canseek(f) register FILE *f; /*SYSDEP*/ { struct stat x; (void) fstat(fileno(f),&x); if(x.st_nlink > 0 /*pipe*/ && !isatty(fileno(f))) { return(1); } return(0); } nowreading(x) register unit *x; { register long loc; #ifdef LFNAMES char * pfname; #endif x->uwrt=0; loc=ftell(x->ufd); #ifdef LFNAMES if(lfn_flag) I 6 #ifdef ridge { E 6 pfname = (char *) getenv(x->ufnm); I 6 if (pfname == NULL) pfname = x->ufnm; } #else pfname = (char *) getenv(x->ufnm); #endif E 6 else pfname = x->ufnm; if(freopen(pfname,"r",x->ufd) == NULL) #else if(freopen(x->ufnm,"r",x->ufd) == NULL) #endif return(1); (void) fseek(x->ufd,loc,0); return(0); } nowwriting(x) register unit *x; { register long loc; #ifdef LFNAMES char *pfname; #endif loc=ftell(x->ufd); x->uwrt=1; #ifdef LFNAMES if (lfn_flag) I 6 #ifdef ridge { E 6 pfname = (char *) getenv(x->ufnm); I 6 if (pfname == NULL) pfname = x->ufnm; } #else pfname = (char *) getenv(x->ufnm); #endif E 6 else pfname = x->ufnm; if(!freopen(pfname,"r+",x->ufd) && !freopen(pfname,"w+",x->ufd)) #else if(!freopen(x->ufnm,"r+",x->ufd) && !freopen(x->ufnm,"w+",x->ufd)) #endif return(1); (void) fseek(x->ufd,loc,0); return(0); } E 1 h51461 s 00001/00001/00011 d D 4.3 87/05/13 17:47:32 build 6 5 c removed old SCCS strings and inserted #ident BB e s 00000/00000/00012 d D 4.2 87/02/17 09:41:11 mth 5 4 c rolled rev to -r4 (mth) e s 00000/00000/00012 d D 4.1 87/02/17 09:09:58 mth 4 3 c rolled rev to -r4 (mth) e s 00000/00000/00012 d D 3.1 87/01/21 17:21:54 mkm 3 2 c e s 00000/00000/00012 d D 2.1 87/01/21 17:20:39 mkm 2 1 c e s 00012/00000/00000 d D 1.1 87/01/21 17:12:10 mkm 1 0 c Placed under source control - mkm c These files are direct descendants of the ROS files c by the same name at or about ROS rev 1.3 e u U f b f n t T I 1 D 6 /* "%W% %E%" */ E 6 I 6 #ident " %W% %E% " E 6 #include #include "fio.h" f7flsh_(n) int *n; { register unit *b; b = &units[getunit(*n)]; fflush (b->ufd); } E 1 h30534 s 00001/00001/00120 d D 4.3 87/05/13 17:47:51 build 6 5 c removed old SCCS strings and inserted #ident BB e s 00000/00000/00121 d D 4.2 87/02/17 09:41:15 mth 5 4 c rolled rev to -r4 (mth) e s 00000/00000/00121 d D 4.1 87/02/17 09:12:09 mth 4 3 c rolled rev to -r4 (mth) e s 00000/00000/00121 d D 3.1 87/01/21 17:21:55 mkm 3 2 c e s 00000/00000/00121 d D 2.1 87/01/21 17:20:41 mkm 2 1 c e s 00121/00000/00000 d D 1.1 87/01/21 17:12:11 mkm 1 0 c Placed under source control - mkm c These files are direct descendants of the ROS files c by the same name at or about ROS rev 1.3 e u U f b f n t T I 1 D 6 /* "%W% %E%" */ E 6 I 6 #ident " %W% %E% " E 6 #include typedef long ftnint; typedef ftnint flag; typedef long ftnlen; /*external read, write*/ typedef struct { flag cierr; ftnint ciunit; flag ciend; char *cifmt; ftnint cirec; } cilist; /*internal read, write*/ typedef struct { flag icierr; char *iciunit; flag iciend; char *icifmt; ftnint icirlen; ftnint icirnum; } icilist; /*open*/ typedef struct { flag oerr; ftnint ounit; char *ofnm; ftnlen ofnmlen; char *osta; char *oacc; char *ofm; ftnint orl; char *oblnk; char *omode; } olist; /*close*/ typedef struct { flag cerr; ftnint cunit; char *csta; } cllist; /*rewind, backspace, endfile*/ typedef struct { flag aerr; ftnint aunit; } alist; /*units*/ typedef struct { FILE *ufd; /*0=unconnected*/ char *ufnm; long uinode; int url; /*0=sequential*/ flag useek; /*true=can backspace, use dir, ...*/ flag ufmt; flag uprnt; flag ublnk; flag uend; flag uwrt; /*last io was write*/ flag uscrtch; int umode; /* opening mode = RM,WM or RWN */ } unit; typedef struct { flag inerr; ftnint inunit; char *infile; ftnlen infilen; ftnint *inex; /*parameters in standard's order*/ ftnint *inopen; ftnint *innum; ftnint *innamed; char *inname; ftnlen innamlen; char *inacc; ftnlen inacclen; char *inseq; ftnlen inseqlen; char *indir; ftnlen indirlen; char *infmt; ftnlen infmtlen; char *inform; ftnint informlen; char *inunf; ftnlen inunflen; ftnint *inrecl; ftnint *innrec; char *inblank; ftnlen inblanklen; } inlist; extern int errno; extern flag init; extern cilist *elist; /*active external io list*/ extern flag reading,external,sequential,formatted; extern int (*getn)(),(*putn)(); /*for formatted io*/ extern int (*back)(); extern FILE *cf; /*current file*/ extern unit *curunit; /*current unit*/ extern int lunit; /*current logical unit*/ extern unit units[]; #define err(f,n,s) {if(f) errno= n; else fatal(n,s); return(n);} #define not_legal(u) (u>=MXUNIT || u<0) /*Table sizes*/ #define MXUNIT _NFILE extern int recpos; /*position in current record*/ #define RM 1 #define WM 2 #define RWM 3 #define READING 10 #define WRITING 11 #define WRITE 1 #define READ 2 #define SEQ 3 #define DIR 4 #define FMT 5 #define UNF 6 #define EXT 7 #define INT 8 E 1 h17266 s 00001/00001/00452 d D 4.3 87/05/13 17:48:11 build 6 5 c removed old SCCS strings and inserted #ident BB e s 00000/00000/00453 d D 4.2 87/02/17 09:41:18 mth 5 4 c rolled rev to -r4 (mth) e s 00000/00000/00453 d D 4.1 87/02/17 09:10:04 mth 4 3 c rolled rev to -r4 (mth) e s 00000/00000/00453 d D 3.1 87/01/21 17:21:56 mkm 3 2 c e s 00000/00000/00453 d D 2.1 87/01/21 17:20:42 mkm 2 1 c e s 00453/00000/00000 d D 1.1 87/01/21 17:12:11 mkm 1 0 c Placed under source control - mkm c These files are direct descendants of the ROS files c by the same name at or about ROS rev 1.3 e u U f b f n t T I 1 D 6 /* "%W% %E%" */ E 6 I 6 #ident " %W% %E% " E 6 #include "fio.h" #include "fmt.h" #define skip(s) while(*s==' ') s++ #define SYLMX 300 #define GLITCH '\2' /* special quote character for stu */ extern int cursor,scale; extern flag cblank,cplus; /*blanks in I and compulsory plus*/ struct syl syl[SYLMX]; int parenlvl,pc,revloc; char *f_s(),*f_list(),*i_tem(),*gt_num(); pars_f(s) char *s; { parenlvl=revloc=pc=0; if((s=f_s(s,0))==NULL) { return(-1); } return(0); } char *f_s(s,curloc) register char *s; { skip(s); if(*s++!='(') { return(NULL); } if(parenlvl++ ==1) revloc=curloc; if(op_gen(RET,curloc,0,0)<0 || (s=f_list(s))==NULL) { return(NULL); } skip(s); return(s); } char *f_list(s) register char *s; { for(;*s!=0;) { skip(s); if((s=i_tem(s))==NULL) return(NULL); skip(s); if(*s==',') s++; else if(*s==')') { if(--parenlvl==0) { (void) op_gen(REVERT,revloc,0,0); return(++s); } (void) op_gen(GOTO,0,0,0); return(++s); } } return(NULL); } char *i_tem(s) register char *s; { char *t; int n,curloc; if(*s==')') return(s); if(ne_d(s,&t)) return(t); if(e_d(s,&t)) return(t); s=gt_num(s,&n); if((curloc=op_gen(STACK,n,0,0))<0) return(NULL); return(f_s(s,curloc)); } ne_d(s,p) register char *s,**p; { int n,x,sign=0; char *ap_end(); switch(*s) { default: return(0); case ':': (void) op_gen(COLON,0,0,0); break; case '$': (void) op_gen(NONL, 0, 0, 0); break; case 'B': case 'b': if(*++s=='z' || *s == 'Z') (void) op_gen(BZ,0,0,0); else (void) op_gen(BN,0,0,0); break; case 'S': case 's': if(*(s+1)=='s' || *(s+1) == 'S') { x=SS; s++; } else if(*(s+1)=='p' || *(s+1) == 'P') { x=SP; s++; } else x=S; (void) op_gen(x,0,0,0); break; case '/': (void) op_gen(SLASH,0,0,0); break; case '-': sign=1; /*OUTRAGEOUS CODING TRICK*/ case '+': s++; case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': s=gt_num(s,&n); switch(*s) { default: return(0); case 'P': case 'p': if(sign) n= -n; (void) op_gen(P,n,0,0); break; case 'X': case 'x': (void) op_gen(X,n,0,0); break; case 'H': case 'h': (void) op_gen(H,n,(int)(s+1),0); s+=n; break; } break; case GLITCH: case '"': case '\'': (void) op_gen(APOS,(int)s,0,0); if((*p = ap_end(s)) == NULL) return(0); return(1); case 'T': case 't': if(*(s+1)=='l' || *(s+1) == 'L') { x=TL; s++; } else if(*(s+1)=='r'|| *(s+1) == 'R') { x=TR; s++; } else x=T; s=gt_num(s+1,&n); s--; (void) op_gen(x,n,0,0); break; case 'X': case 'x': (void) op_gen(X,1,0,0); break; case 'P': case 'p': (void) op_gen(P,1,0,0); break; } s++; *p=s; return(1); } e_d(s,p) register char *s,**p; { int n,w,d,e,found=0,x=0; register char *sv=s; s=gt_num(s,&n); (void) op_gen(STACK,n,0,0); switch(*s++) { default: break; case 'E': case 'e': x=1; case 'G': case 'g': found=1; s=gt_num(s,&w); if(w==0) break; if(*s=='.') { s++; s=gt_num(s,&d); } else d=0; if(*s!='E' && *s != 'e') (void) op_gen(x==1?E:G,w,d,0); else { s++; s=gt_num(s,&e); (void) op_gen(x==1?EE:GE,w,d,e); } break; case 'O': case 'o': found = 1; s = gt_num(s, &w); if(w==0) break; #ifdef EXTSEMS if(*s=='.') { s++; s=gt_num(s,&d); } else { d=1; } (void) op_gen(O, w, d, 0); #else (void) op_gen(O, w, 0, 0); #endif break; #ifdef EXTSEMS case 'Z': case 'z': found = 1; s = gt_num(s, &w); if(w==0) break; if(*s=='.') { s++; s=gt_num(s,&d); } else { d=1; } (void) op_gen(Z, w, d, 0); break; case 'Q': case 'q': found = 1; op_gen(Q, 0, 0, 0); break; #endif case 'L': case 'l': found=1; s=gt_num(s,&w); if(w==0) break; (void) op_gen(L,w,0,0); break; case 'A': case 'a': found=1; skip(s); if(*s>='0' && *s<='9') { s=gt_num(s,&w); if(w==0) break; (void) op_gen(AW,w,0,0); break; } (void) op_gen(A,0,0,0); break; case 'F': case 'f': found=1; s=gt_num(s,&w); if(w==0) break; if(*s=='.') { s++; s=gt_num(s,&d); } else d=0; (void) op_gen(F,w,d,0); break; case 'D': case 'd': found=1; s=gt_num(s,&w); if(w==0) break; if(*s=='.') { s++; s=gt_num(s,&d); } else d=0; (void) op_gen(D,w,d,0); break; case 'I': case 'i': found=1; s=gt_num(s,&w); if(w==0) break; if(*s!='.') { (void) op_gen(I,w,0,0); break; } s++; s=gt_num(s,&d); (void) op_gen(IM,w,d,0); break; } if(found==0) { pc--; /*unSTACK*/ *p=sv; return(0); } *p=s; return(1); } op_gen(a,b,c,d) { struct syl *p= &syl[pc]; if(pc>=SYLMX) { fprintf(stderr,"format too complicated:\n%s\n", fmtbuf); abort(); } p->op=a; p->p1=b; p->p2=c; p->p3=d; return(pc++); } char *gt_num(s,n) register char *s; register int *n; { int m=0,cnt=0; char c; for(c= *s;;c = *s) { if(c==' ') { s++; continue; } if(c>'9' || c<'0') break; m=10*m+c-'0'; cnt++; s++; } if(cnt==0) *n=1; else *n=m; return(s); } #define STKSZ 10 int cnt[STKSZ],ret[STKSZ],cp,rp; flag workdone, nonl; en_fio() { ftnint one=1; return(do_fio(&one,(char *)NULL,0l)); } do_fio(number,ptr,len) register ftnint *number; register ftnlen len; register char *ptr; { register struct syl *p; register int n,i; for(i=0;i<*number;i++,ptr+=len) { loop: switch(type_f((p= &syl[pc])->op)) { default: fprintf(stderr,"unknown code in do_fio: %d\n%s\n", p->op,fmtbuf); err(elist->cierr,100,"do_fio"); case NED: if((*doned)(p)) { pc++; goto loop; } pc++; continue; case ED: if(cnt[cp]<=0) { cp--; pc++; goto loop; } if(ptr==NULL) return((*doend)()); cnt[cp]--; workdone=1; if((n=(*doed)(p,ptr,len))>0) err(elist->cierr,errno,"fmt"); if(n<0) err(elist->ciend,(EOF),"fmt"); continue; case STACK: cnt[++cp]=p->p1; pc++; goto loop; case RET: ret[++rp]=p->p1; pc++; goto loop; case GOTO: if(--cnt[cp]<=0) { cp--; rp--; pc++; goto loop; } pc=1+ret[rp--]; goto loop; case REVERT: rp=cp=0; pc = p->p1; if(ptr==NULL) return((*doend)()); if(!workdone) return(0); if((n=(*dorevert)()) != 0) return(n); goto loop; case COLON: if(ptr==NULL) return((*doend)()); pc++; goto loop; case NONL: nonl = 1; pc++; goto loop; case S: case SS: cplus=0; pc++; goto loop; case SP: cplus = 1; pc++; goto loop; case P: scale=p->p1; pc++; goto loop; case BN: cblank=0; pc++; goto loop; case BZ: cblank=1; pc++; goto loop; } } return(0); } fmt_bg() { workdone=cp=rp=pc=cursor=0; cnt[0]=ret[0]=0; } type_f(n) { switch(n) { default: return(n); case RET: return(RET); case REVERT: return(REVERT); case GOTO: return(GOTO); case STACK: return(STACK); case X: case SLASH: case APOS: case H: case T: case TL: case TR: return(NED); case F: case I: case IM: case A: case AW: case O: #ifdef EXTSEMS case Z: case Q: #endif case L: case E: case EE: case D: case G: case GE: return(ED); } } char *ap_end(s) register char *s; { char quote; quote= *s++; for(;*s;s++) { if(*s!=quote) continue; if(*++s!=quote) return(s); } if(elist->cierr) { errno = 100; return(NULL); } fatal(100, "bad string"); /*NOTREACHED*/ } E 1 2 D C B A @ ? > = < ; : 9 8 7 6 5 4 3 2 1 0 / . - , + * ) ( ' & % $ # " !             h05804 s 00001/00001/00099 d D 4.3 87/05/13 17:48:47 build 6 5 c removed old SCCS strings and inserted #ident BB e s 00000/00000/00100 d D 4.2 87/02/17 09:41:26 mth 5 4 c rolled rev to -r4 (mth) e s 00000/00000/00100 d D 4.1 87/02/17 09:10:10 mth 4 3 c rolled rev to -r4 (mth) e s 00000/00000/00100 d D 3.1 87/01/21 17:21:58 mkm 3 2 c e s 00000/00000/00100 d D 2.1 87/01/21 17:20:44 mkm 2 1 c e s 00100/00000/00000 d D 1.1 87/01/21 17:12:13 mkm 1 0 c Placed under source control - mkm c These files are direct descendants of the ROS files c by the same name at or about ROS rev 1.3 e u U f b f n t T I 1 D 6 /* "%W% %E%" */ E 6 I 6 #ident " %W% %E% " E 6 #define MAXINTLENGTH 12 char *icvt(value,ndigit,sign, base) register long value; register int *ndigit,*sign; register int base; { static char buf[MAXINTLENGTH+1]; register int i; if(value>0) *sign=0; else if(value<0) { value = -value; *sign= 1; if(value<0) /* cas borne inf. -2**31(80000000)*/ { strcpy(buf+2,"2147483648"); *ndigit=10; return(&buf[2]); } } else { *sign=0; *ndigit=1; buf[MAXINTLENGTH]='0'; return(&buf[MAXINTLENGTH]); } for(i=MAXINTLENGTH-1;value>0;i--) { *(buf+i)=(int)(value%base)+'0'; value /= base; } *ndigit=MAXINTLENGTH-1-i; return(&buf[i+1]); } #ifdef EXTSEMS char *icvt_oz(pvalue,len,ndigit,sign,base) int *ndigit,*sign; int base,len; unsigned char *pvalue; #define MAXDIGITS 100 { register int nbits,hword,n,p,basenbits,basemask; static char buf[MAXDIGITS]; static char tabconv[17] = {"0123456789abcdef"}; /* initialisations */ n = len-1; /* on chargr 2 octets dans hword */ hword = (int) pvalue[n--]; if (n >= 0) { hword |= pvalue[n--]<<8; nbits = 16; } else nbits = 8; if (base == 8) { basenbits = 3; basemask = 7; } else { basenbits = 4; basemask = 15; } /* calcul du nombre de digits */ p = (len * 8 + basenbits - 1) / basenbits; *ndigit = p; /* indice de rangement dans buf : */ p--; if(p > MAXDIGITS) { strcpy(buf,"** impossible conversion : too long **"); *ndigit = strlen(buf); *sign = 0; return(buf); } /* traitement */ while (p >= 0) { /* convertir hword en digits (octal ou hexa) */ while (nbits >= basenbits) { buf[p--] = tabconv[hword & basemask]; hword = hword >> basenbits; nbits -= basenbits; } /* raccrocher un octet de plus a ce qui reste dans hword */ hword = hword << (8-nbits); if (n >= 0) hword |= pvalue[n--]<<8; hword = hword >> (8-nbits); nbits += 8; } /* fin */ *sign=0; /* enlever les zeros non significatifs */ /* a ne faire qui pour les types numeriques (len=1,2 4) */ /* tant pis pour les char *2 ou *4 */ p = 0; while (buf[p] == '0' && p < *ndigit ) p++; *ndigit -= p; return(&buf[p]); } #endif E 1 h07282 s 00001/00001/00021 d D 4.4 87/05/13 17:49:00 build 7 6 c removed old SCCS strings and inserted #ident BB e s 00011/00000/00011 d D 4.3 87/03/03 17:01:16 build 6 5 c add getfp call e s 00000/00000/00011 d D 4.2 87/02/17 09:41:29 mth 5 4 c rolled rev to -r4 (mth) e s 00000/00000/00011 d D 4.1 87/02/17 09:10:14 mth 4 3 c rolled rev to -r4 (mth) e s 00000/00000/00011 d D 3.1 87/01/21 17:21:59 mkm 3 2 c e s 00000/00000/00011 d D 2.1 87/01/21 17:20:45 mkm 2 1 c e s 00011/00000/00000 d D 1.1 87/01/21 17:12:13 mkm 1 0 c Placed under source control - mkm c These files are direct descendants of the ROS files c by the same name at or about ROS rev 1.3 e u U f b f n t T I 1 D 7 /* "%W% %E%" */ E 7 I 7 #ident " %W% %E% " E 7 #include #include "fio.h" I 6 FILE *getfp_(n) int *n; { register unit *b; b = &units[getunit(*n)]; return(b->ufd); } /* Copy of getfp, left in for Bull compatibility */ /* 'getfp' is a more accurate name for this routine */ E 6 FILE *getfd_(n) int *n; { register unit *b; b = &units[getunit(*n)]; return(b->ufd); } E 1 h00882 s 00001/00001/00126 d D 4.3 87/05/13 17:49:16 build 6 5 c removed old SCCS strings and inserted #ident BB e s 00000/00000/00127 d D 4.2 87/02/17 09:41:33 mth 5 4 c rolled rev to -r4 (mth) e s 00000/00000/00127 d D 4.1 87/02/17 09:10:17 mth 4 3 c rolled rev to -r4 (mth) e s 00000/00000/00127 d D 3.1 87/01/21 17:22:00 mkm 3 2 c e s 00000/00000/00127 d D 2.1 87/01/21 17:20:45 mkm 2 1 c e s 00127/00000/00000 d D 1.1 87/01/21 17:12:14 mkm 1 0 c Placed under source control - mkm c These files are direct descendants of the ROS files c by the same name at or about ROS rev 1.3 e u U f b f n t T I 1 D 6 /* "%W% %E%" */ E 6 I 6 #ident " %W% %E% " E 6 #include "fio.h" #include "fmt.h" char *icptr,*icend; icilist *svic; extern int rd_ed(),rd_ned(),w_ed(),w_ned(),y_ierr(); extern int z_wnew(); extern int z_wnewdor(); extern int z_rnew1(); int icnum; z_getc() { if(icptr >= icend) err(svic->iciend,(EOF),"endfile"); if(recpos++ < svic->icirlen) return(*icptr++); else err(svic->icierr,110,"recend"); } z_putc(c) { if(icptr >= icend) err(svic->icierr,110,"inwrite"); if(recpos++ < svic->icirlen) *icptr++ = c; else err(svic->icierr,110,"recend"); return(0); } z_back() { recpos--; icptr--; } z_rnew() { icptr = svic->iciunit + (++icnum)*svic->icirlen; recpos = 0; cursor = 0; return(0); } z_rnew1() { z_rnew(); return(1); } z_rnewdor() { icptr = svic->iciunit + (++icnum)*svic->icirlen; recpos = 0; return(0); } s_rsfi(a) icilist *a; { int n; if(n=c_si(a)) return(n); reading=1; doed=rd_ed; doned=rd_ned; getn=z_getc; back = z_back; dorevert = z_rnewdor; doend = z_rnew; donewrec = z_rnew1; return(0); } s_wsfi(a) icilist *a; { int n; if(n=c_si(a)) return(n); reading=0; doed=w_ed; doned=w_ned; putn=z_putc; back = z_back; dorevert = z_wnewdor; doend = donewrec = z_wnew; return(0); } c_si(a) register icilist *a; { fmtbuf=a->icifmt; if(pars_f(fmtbuf)<0) err(a->icierr,100,"startint"); fmt_bg(); sequential=formatted=1; external=0; elist = (cilist*) a; cblank=cplus=scale=0; svic=a; icnum=recpos=0; icptr=svic->iciunit; icend=icptr+svic->icirlen*svic->icirnum; return(0); } z_wnew() { while(recpos++ < svic->icirlen) *icptr++ = ' '; cursor = 0; recpos = 0; icnum++; return(1); } z_wnewdor() { while(recpos++ < svic->icirlen) *icptr++ = ' '; recpos = 0; icnum++; return(0); } e_rsfi() { int n; n = en_fio(); fmtbuf = NULL; return(n); } e_wsfi() { int n; n = en_fio(); fmtbuf = NULL; if(icnum >= svic->icirnum) return(n); while(recpos++ < svic->icirlen) *icptr++ = ' '; return(n); } y_ierr() { err(elist->cierr, 110, "iio"); } E 1 h56838 s 00001/00001/00233 d D 4.4 87/05/13 17:49:31 build 7 6 c removed old SCCS strings and inserted #ident BB e s 00010/00000/00224 d D 4.3 87/04/02 15:54:42 build 6 5 c Make logical file names work more like they do on VMS e s 00000/00000/00224 d D 4.2 87/02/17 09:41:38 mth 5 4 c rolled rev to -r4 (mth) e s 00000/00000/00224 d D 4.1 87/02/17 09:10:20 mth 4 3 c rolled rev to -r4 (mth) e s 00000/00000/00224 d D 3.1 87/01/21 17:22:01 mkm 3 2 c e s 00000/00000/00224 d D 2.1 87/01/21 17:20:46 mkm 2 1 c e s 00224/00000/00000 d D 1.1 87/01/21 17:12:15 mkm 1 0 c Placed under source control - mkm c These files are direct descendants of the ROS files c by the same name at or about ROS rev 1.3 e u U f b f n t T I 1 D 7 /* "%W% %E%" */ E 7 I 7 #ident " %W% %E% " E 7 #include "fio.h" #include "units.h" #ifdef LFNAMES extern int lfn_flag; #endif typedef struct { flag inerr; ftnint inunit; char *infile; ftnlen infilen; short *inex; /*parameters in standard's order*/ short *inopen; short *innum; short *innamed; char *inname; ftnlen innamlen; char *inacc; ftnlen inacclen; char *inseq; ftnlen inseqlen; char *indir; ftnlen indirlen; char *infmt; ftnlen infmtlen; char *inform; ftnint informlen; char *inunf; ftnlen inunflen; short *inrecl; short *innrec; char *inblank; ftnlen inblanklen; } inlist2; f_inqu2(a) register inlist2 *a; { flag byfile; register int i,j; register unit *p; char buf[256]; long x; #ifdef LFNAMES char * pfname; #endif if(a->infile!=NULL) { byfile=1; g_char(a->infile,a->infilen,buf); i=j=0; if (buf[i]==' ') { while (buf[i]==' ') i++; while ((buf[j++]=buf[j+i])!='\0'); buf[j]='\0'; } #ifdef LFNAMES if(lfn_flag) { pfname=(char *) getenv(buf); I 6 #ifdef ridge if (pfname == NULL) pfname = buf; else #endif E 6 strcpy(buf,pfname); } #endif x=inode(buf); for(i=0,p=NULL;iinunit); if (!not_legal(lunit)) { p= &units[lunit]; } else { p=NULL; } } if(a->inex!=NULL) if(byfile && x>0 || !byfile && p!=NULL) *a->inex=1; else *a->inex=0; if(a->inopen!=NULL) if(byfile) *a->inopen=(p!=NULL); else *a->inopen=(p!=NULL && p->ufd!=NULL); if(a->innum!=NULL) *a->innum= (p?(avunit[p-units]):-1); if(a->innamed!=NULL) if(byfile || p!=NULL && p->ufnm!=NULL) *a->innamed=1; else *a->innamed=0; if(a->inname!=NULL) if(byfile) b_char(buf,a->inname,a->innamlen); else if(p!=NULL && p->ufnm!=NULL) b_char(p->ufnm,a->inname,a->innamlen); if(a->inacc!=NULL && p!=NULL && p->ufd!=NULL) if(p->url) b_char("direct",a->inacc,a->inacclen); else b_char("sequential",a->inacc,a->inacclen); if(a->inseq!=NULL) if(byfile || p!=NULL && p->useek) b_char("yes",a->inseq,a->inseqlen); else b_char("no",a->inseq,a->inseqlen); if(a->indir!=NULL) if(byfile && !isdev(buf) || p!=NULL && p->useek) b_char("yes",a->indir,a->indirlen); else b_char("no",a->indir,a->indirlen); if(a->infmt!=NULL) if(p!=NULL && p->ufmt) b_char("formatted",a->infmt,a->infmtlen); else if(p!=NULL) b_char("unformatted",a->infmt,a->infmtlen); if(a->inform!=NULL) b_char("yes",a->inform,a->informlen); if(a->inunf) if(byfile || p!=NULL && p->useek) b_char("yes",a->inunf,a->inunflen); else b_char("unknown",a->inunf,a->inunflen); if(a->inrecl!=NULL && p!=NULL) *a->inrecl=p->url; if(a->innrec!=NULL && p!=NULL && p->url>0) *a->innrec=ftell(p->ufd)/p->url+1; if(a->inblank && p!=NULL && p->ufmt) if(p->ublnk) b_char("zero",a->inblank,a->inblanklen); else b_char("null",a->inblank,a->inblanklen); return(0); } f_inqu(a) register inlist *a; { flag byfile; register int i,j; register unit *p; char buf[256]; long x; #ifdef LFNAMES char * pfname; #endif if(a->infile!=NULL) { byfile=1; g_char(a->infile,a->infilen,buf); i=j=0; if (buf[i]==' ') { while (buf[i]==' ') i++; while ((buf[j++]=buf[j+i])!='\0'); buf[j]='\0'; } #ifdef LFNAMES if(lfn_flag) { pfname=(char *) getenv(buf); I 6 #ifdef ridge if (pfname == NULL) pfname = buf; else #endif E 6 strcpy(buf,pfname); } #endif x=inode(buf); for(i=0,p=NULL;iinunit); if (!not_legal(lunit)) { p= &units[lunit]; } else { p=NULL; } } if(a->inex!=NULL) if(byfile && x>0 || !byfile && p!=NULL) *a->inex=1; else *a->inex=0; if(a->inopen!=NULL) if(byfile) *a->inopen=(p!=NULL); else *a->inopen=(p!=NULL && p->ufd!=NULL); if(a->innum!=NULL) *a->innum= (p?(avunit[p-units]):-1); if(a->innamed!=NULL) if(byfile || p!=NULL && p->ufnm!=NULL) *a->innamed=1; else *a->innamed=0; if(a->inname!=NULL) if(byfile) b_char(buf,a->inname,a->innamlen); else if(p!=NULL && p->ufnm!=NULL) b_char(p->ufnm,a->inname,a->innamlen); if(a->inacc!=NULL && p!=NULL && p->ufd!=NULL) if(p->url) b_char("direct",a->inacc,a->inacclen); else b_char("sequential",a->inacc,a->inacclen); if(a->inseq!=NULL) if(byfile || p!=NULL && p->useek) b_char("yes",a->inseq,a->inseqlen); else b_char("no",a->inseq,a->inseqlen); if(a->indir!=NULL) if(byfile && !isdev(buf) || p!=NULL && p->useek) b_char("yes",a->indir,a->indirlen); else b_char("no",a->indir,a->indirlen); if(a->infmt!=NULL) if(p!=NULL && p->ufmt) b_char("formatted",a->infmt,a->infmtlen); else if(p!=NULL) b_char("unformatted",a->infmt,a->infmtlen); if(a->inform!=NULL) b_char("yes",a->inform,a->informlen); if(a->inunf) if(byfile || p!=NULL && p->useek) b_char("yes",a->inunf,a->inunflen); else b_char("unknown",a->inunf,a->inunflen); if(a->inrecl!=NULL && p!=NULL) *a->inrecl=p->url; if(a->innrec!=NULL && p!=NULL && p->url>0) *a->innrec=ftell(p->ufd)/p->url+1; if(a->inblank && p!=NULL && p->ufmt) if(p->ublnk) b_char("zero",a->inblank,a->inblanklen); else b_char("null",a->inblank,a->inblanklen); return(0); } E 1 h42458 s 00026/00003/00114 d D 4.5 87/04/17 09:03:20 mth 11 10 c Profiling changes e s 00001/00004/00116 d D 4.4 87/03/04 20:46:12 mth 10 9 c change CFLAGS use to DFLAGS e s 00001/00000/00119 d D 4.3 87/02/24 16:31:22 build 9 7 c added -rm -f section to install section. -mkm e s 00001/00000/00119 d D 3.3.1.1 87/02/24 16:28:40 build 8 5 c added -rm -f to insatll section. -mkm e s 00000/00000/00119 d D 4.2 87/02/17 09:40:42 mth 7 6 c rolled rev to -r4 (mth) e s 00000/00000/00119 d D 4.1 87/02/17 09:09:34 mth 6 5 c rolled rev to -r4 (mth) e s 00097/00059/00022 d D 3.3 87/02/07 14:59:32 build 5 4 c remade makefile using template. -mkm e s 00030/00022/00051 d D 3.2 87/02/03 13:20:19 mkm 4 3 c added dependancies. -mkm e s 00000/00000/00073 d D 3.1 87/01/21 17:22:02 mkm 3 2 c e s 00000/00000/00073 d D 2.1 87/01/21 17:20:48 mkm 2 1 c e s 00073/00000/00000 d D 1.1 87/01/21 17:12:15 mkm 1 0 c Placed under source control - mkm c These files are direct descendants of the ROS files c by the same name at or about ROS rev 1.3 e u U f b f n t T I 1 D 5 # "%W% %E%" E 5 I 5 # " %W% %E% " # # # libI77 makefile # # # E 5 D 4 include /usr/src/makerules E 4 D 4 VFLAGS= E 4 D 5 LIBI= libI77.a DEST=${INSDIR}/lib E 5 I 5 # LIB is the library's name E 5 D 5 CFLAGS= -O -DLFNAMES -DEXTSEMS E 5 I 5 LIB = libI77.a I 11 PLIB = plibI77.a E 11 E 5 D 4 CC=cc E 4 D 4 SOURCE=rewind.c endfile.c uio.c due.c dfe.c \ E 4 I 4 D 5 SOURCE= rewind.c endfile.c uio.c due.c dfe.c \ E 5 I 5 D 10 # I'm redefining CFLAGS locally to include the -Ds. This may want to be # redone more cleanly at some later date. CFLAGS = -O -I$(INC) -DLFNAMES -DEXTSEMS E 10 I 10 D 11 DFLAGS = -DLFNAMES -DEXTSEMS E 11 I 11 DFLAGS = -DLFNAMES -DEXTSEMS $(PROFLAG) E 11 E 10 I 11 PROFLAG = MCOUNT = LIBC_SRC = ../libc E 11 # DESTDIR is the directory where $(LIB)'s final form gets installed D 11 DESTDIR = $(SPX)/usr/lib E 11 I 11 DESTDIR = $(SPX)/usr/lib PDESTDIR = $(SPX)/usr/lib/libp E 11 # SRC is the list of base source names, i.e. modulename.c SRC = rewind.c endfile.c uio.c due.c dfe.c \ E 5 E 4 backspace.c close.c err.c fio.h fmt.c fmt.h units.h \ fmtlib.c open.c rdfmt.c rsfe.c sfe.c \ sue.c util.c wrtfmt.c wsfe.c iio.c lio.h lio.c \ D 4 inquire.c lread.c nio.c units.c getfd.c f7flsh.c version.c E 4 I 4 inquire.c lread.c nio.c units.c getfd.c f7flsh.c E 4 D 4 .c.a: $(CC) -c $(CFLAGS) $< ld -r -x $*.o mv a.out $*.o ar rv $(LIBI) $*.o rm $*.o E 4 D 5 FILES= $(LIBI)(backspace.o)\ $(LIBI)(close.o)\ $(LIBI)(dfe.o)\ $(LIBI)(due.o)\ $(LIBI)(endfile.o)\ $(LIBI)(err.o)\ $(LIBI)(fmt.o)\ $(LIBI)(fmtlib.o)\ $(LIBI)(iio.o)\ $(LIBI)(inquire.o)\ $(LIBI)(lio.o)\ $(LIBI)(lread.o)\ $(LIBI)(nio.o)\ $(LIBI)(open.o)\ $(LIBI)(rdfmt.o)\ $(LIBI)(rewind.o)\ $(LIBI)(rsfe.o)\ $(LIBI)(sfe.o)\ $(LIBI)(sue.o)\ $(LIBI)(uio.o)\ $(LIBI)(units.o)\ $(LIBI)(util.o)\ $(LIBI)(getfd.o)\ $(LIBI)(f7flsh.o)\ $(LIBI)(wrtfmt.o)\ D 4 $(LIBI)(version.o)\ E 4 $(LIBI)(wsfe.o) E 5 D 4 all: version $(LIBI) E 4 I 4 D 5 all: $(LIBI) E 5 I 5 # OBJ is the list of object module names in # library form, i.e. $(LIB)(modulename.o) E 5 E 4 D 4 version: makeversion -c $(VFLAGS) s.libI77.v $(SOURCE) E 4 D 5 test: $(LIBI) E 5 I 5 OBJ = $(LIB)(backspace.o)\ $(LIB)(close.o)\ $(LIB)(dfe.o)\ $(LIB)(due.o)\ $(LIB)(endfile.o)\ $(LIB)(err.o)\ $(LIB)(fmt.o)\ $(LIB)(fmtlib.o)\ $(LIB)(iio.o)\ $(LIB)(inquire.o)\ $(LIB)(lio.o)\ $(LIB)(lread.o)\ $(LIB)(nio.o)\ $(LIB)(open.o)\ $(LIB)(rdfmt.o)\ $(LIB)(rewind.o)\ $(LIB)(rsfe.o)\ $(LIB)(sfe.o)\ $(LIB)(sue.o)\ $(LIB)(uio.o)\ $(LIB)(units.o)\ $(LIB)(util.o)\ $(LIB)(getfd.o)\ $(LIB)(f7flsh.o)\ $(LIB)(wrtfmt.o)\ $(LIB)(wsfe.o) E 5 D 4 $(LIBI): $(FILES) E 4 I 4 D 5 $(LIBI): $(FILES) E 5 E 4 D 4 $(LIBI)(lio.o) $(LIBI)(lread.o): lio.h $(LIBI)(fmt.o) $(LIBI)(rdfmt.o) $(LIBI)(rsfe.o) $(LIBI)(wrtfmt.o) $(LIBI)(wsfe.o):fmt.h $(LIBI)(units.o) $(LIBI)(close.o): units.h $(FILES): fio.h /usr/include/stdio.h E 4 I 4 D 5 $(LIBI)(nio.o) $(LIBI)(lread.o): $(INC)/ctype.h E 5 I 5 all: $(LIB) I 11 get -p $(LIBC_SRC)/s.mcount.def > mcount.def rm -f *.o $(MAKE) -$(MAKEFLAGS) 'MCOUNT=mcount.def' 'PROFLAG=-p' \ 'LIB=plibI77.a' $(PLIB) libI77.a: $(OBJ) E 11 $(NM) -xv $(LIB) > $(LIB).map E 5 D 5 $(LIBI)(err.o) $(LIBI)(f7flsh.o) $(LIBI)(fio.h) $(LIBI)(getfd.o) $(LIBI)(nio.o) \ $(LIBI)(units.o): $(INC)/stdio.h E 5 I 5 D 11 $(LIB): $(OBJ) E 11 I 11 plibI77.a: $(OBJ) $(NM) -xv $(PLIB) > $(PLIB).map rm -f $(MCOUNT) E 11 E 5 D 5 $(LIBI)(util.o): $(INC)/sys/dir.h E 5 I 5 install: I 9 -rm -f $(DESTDIR)/$(LIB) E 9 I 8 -rm -f $(DESTDIR)/$(LIB) E 8 $(INS) $(LIB) $(DESTDIR)/$(LIB) chmod 644 $(DESTDIR)/$(LIB) chgrp bin $(DESTDIR)/$(LIB) chown bin $(DESTDIR)/$(LIB) E 5 I 11 -rm -f $(PDESTDIR)/$(LIB) $(INS) $(PLIB) $(PDESTDIR)/$(LIB) chmod 644 $(PDESTDIR)/$(LIB) chgrp bin $(PDESTDIR)/$(LIB) chown bin $(PDESTDIR)/$(LIB) E 11 D 5 $(LIBI)(err.o) $(LIBI)(util.o) $(LIBI)(open.o): $(INC)/sys/stat.h E 5 I 5 listing: $(PR) $(SRC) | $(LP) E 5 D 5 $(LIBI)(open.o) $(LIBI)(err.o) $(LIBI)(util.o): $(INC)/sys/types.h E 5 I 5 clean: -rm -f *.o -rm -f core errs E 5 D 5 $(LIBI)(backspace.o) $(LIBI)(close.o) $(LIBI)(dfe.o) $(LIBI)(due.o) \ $(LIBI)(endfile.o) $(LIBI)(err.o) $(LIBI)(f7flsh.o) $(LIBI)(fmt.o) \ $(LIBI)(getfd.o) $(LIBI)(iio.o) $(LIBI)(inquire.o) $(LIBI)(lio.o) \ $(LIBI)(lread.o) $(LIBI)(nio.o) $(LIBI)(open.o) $(LIBI)(rdfmt.o) \ $(LIBI)(rewind.o) $(LIBI)(rsfe.o) $(LIBI)(sfe.o) $(LIBI)(sue.o) \ $(LIBI)(uio.o) $(LIBI)(units.o) $(LIBI)(util.o) $(LIBI)(wrtfmt.o) \ $(LIBI)(wsfe.o): fio.h E 5 I 5 # This clobber rule *requires* that the sources (SRC) be kept in sccs # format, ie the SRC copies are NOT the only ones!! E 5 D 5 $(LIBI)(dfe.o) $(LIBI)(fmt.o) $(LIBI)(iio.o) $(LIBI)(lio.o) $(LIBI)(lread.o) \ $(LIBI)(nio.o) $(LIBI)(rdfmt.o) $(LIBI)(rsfe.o) $(LIBI)(wrtfmt.o) \ $(LIBI)(wsfe.o): fmt.h E 5 I 5 clobber: clean -rm -f $(LIB) $(LIB).map $(SRC) I 11 -rm -f $(PLIB) $(PLIB).map E 11 WHAT: what $(LIB) I 11 what $(PLIB) E 11 E 5 D 5 $(LIBI)(lio.o) $(LIBI)(lread.o) $(LIBI)(nio.o): lio.h E 5 I 5 # dependencies for included files and other non-obvious reasons are listed # below E 5 D 5 $(LIBI)(close.o) $(LIBI)(err.o) $(LIBI)(inquire.o) $(LIBI)(units.o): units.h E 5 E 4 D 5 install: cp $(LIBI) $(DEST) chmod 644 ${DEST}/${LIBI} chown bin ${DEST}/${LIBI} chgrp bin ${DEST}/${LIBI} E 5 I 5 $(LIB)(nio.o) $(LIB)(lread.o): $(INC)/ctype.h E 5 D 5 clean: rm -f $(LIBI) E 5 I 5 $(LIB)(err.o) $(LIB)(f7flsh.o) $(LIB)(fio.h) $(LIB)(getfd.o) $(LIB)(nio.o) \ $(LIB)(units.o): $(INC)/stdio.h $(LIB)(util.o): $(INC)/sys/dir.h $(LIB)(err.o) $(LIB)(util.o) $(LIB)(open.o): $(INC)/sys/stat.h $(LIB)(open.o) $(LIB)(err.o) $(LIB)(util.o): $(INC)/sys/types.h $(LIB)(backspace.o) $(LIB)(close.o) $(LIB)(dfe.o) $(LIB)(due.o) \ $(LIB)(endfile.o) $(LIB)(err.o) $(LIB)(f7flsh.o) $(LIB)(fmt.o) \ $(LIB)(getfd.o) $(LIB)(iio.o) $(LIB)(inquire.o) $(LIB)(lio.o) \ $(LIB)(lread.o) $(LIB)(nio.o) $(LIB)(open.o) $(LIB)(rdfmt.o) \ $(LIB)(rewind.o) $(LIB)(rsfe.o) $(LIB)(sfe.o) $(LIB)(sue.o) \ $(LIB)(uio.o) $(LIB)(units.o) $(LIB)(util.o) $(LIB)(wrtfmt.o) \ $(LIB)(wsfe.o): fio.h $(LIB)(dfe.o) $(LIB)(fmt.o) $(LIB)(iio.o) $(LIB)(lio.o) $(LIB)(lread.o) \ $(LIB)(nio.o) $(LIB)(rdfmt.o) $(LIB)(rsfe.o) $(LIB)(wrtfmt.o) \ $(LIB)(wsfe.o): fmt.h $(LIB)(lio.o) $(LIB)(lread.o) $(LIB)(nio.o): lio.h $(LIB)(close.o) $(LIB)(err.o) $(LIB)(inquire.o) $(LIB)(units.o): units.h E 5 E 1 h41167 s 00001/00001/00155 d D 4.3 87/05/13 17:49:46 build 6 5 c removed old SCCS strings and inserted #ident BB e s 00000/00000/00156 d D 4.2 87/02/17 09:41:42 mth 5 4 c rolled rev to -r4 (mth) e s 00000/00000/00156 d D 4.1 87/02/17 09:10:23 mth 4 3 c rolled rev to -r4 (mth) e s 00000/00000/00156 d D 3.1 87/01/21 17:22:03 mkm 3 2 c e s 00000/00000/00156 d D 2.1 87/01/21 17:20:50 mkm 2 1 c e s 00156/00000/00000 d D 1.1 87/01/21 17:12:16 mkm 1 0 c Placed under source control - mkm c These files are direct descendants of the ROS files c by the same name at or about ROS rev 1.3 e u U f b f n t T I 1 D 6 /* "%W% %E%" */ E 6 I 6 #ident " %W% %E% " E 6 #include "fio.h" #include "fmt.h" #include "lio.h" extern int l_write(); int t_putc(); s_wsle(a) cilist *a; { int n; if(!init) f_init(); if(n=c_le(a)) return(n); reading=0; external=1; formatted=1; putn = t_putc; lioproc = l_write; if(!curunit->uwrt) return(nowwriting(curunit)); else return(0); } e_wsle() { t_putc('\n'); recpos=0; return(0); } t_putc(c) { recpos++; putc(c,cf); return(0); } lwrt_I(n) ftnint n; { char buf[LINTW]; register char *p; (void) sprintf(buf," %ld",(long)n); if(recpos+strlen(buf)>=LINE) { t_putc('\n'); recpos=0; } for(p=buf;*p;t_putc(*p++)); } lwrt_L(n, len) ftnint n; ftnlen len; { if(recpos+LLOGW>=LINE) { t_putc('\n'); recpos=0; } (void) wrt_L((uint *)&n,LLOGW, sizeof(long)); } lwrt_A(p,len) char *p; ftnlen len; { register int i; if(recpos+len>=LINE) { t_putc('\n'); recpos=0; } t_putc(' '); for(i=0;i=LINE) { t_putc('\n'); recpos=0; } scale=0; (void) wrt_F((ufloat *)&n,LFW,LFD,(ftnlen)sizeof(n)); } else { if(recpos+LEW>=LINE) { t_putc('\n'); recpos=0; } scale=1; (void) wrt_E((ufloat *)&n,LEW,LED,LEE,(ftnlen)sizeof(n),fexpde); } } lwrt_C(a,b,fexpde) double a,b;char fexpde; { if(recpos+2*LFW+3>=LINE) { t_putc('\n'); recpos=0; } t_putc(' '); t_putc('('); lwrt_F(a,fexpde); t_putc(','); lwrt_F(b,fexpde); t_putc(')'); } l_write(number,ptr,len,type) register ftnint *number,type; register flex *ptr; register ftnlen len; { register int i; ftnint x; double y,z; float *xx; double *yy; for(i=0;i< *number; i++) { switch((int)type) { default: fatal(204,"unknown type in lio"); #ifdef EXTSEMS case TYBYTE: x=ptr->flbyte; goto xint; #endif case TYSHORT: x=ptr->flshort; goto xint; case TYLONG: x=ptr->flint; xint: lwrt_I(x); break; case TYREAL: y=ptr->flreal; lwrt_F(y,'e'); break; case TYDREAL: y=ptr->fldouble; xfloat: lwrt_F(y,'d'); break; case TYCOMPLEX: xx= &(ptr->flreal); y = *xx++; z = *xx; lwrt_C(y,z,'e'); break; case TYDCOMPLEX: yy = &(ptr->fldouble); y= *yy++; z = *yy; xcomplex: lwrt_C(y,z,'d'); break; #ifdef EXTSEMS case TYSLOGICAL: #endif case TYLOGICAL: if (len == 1) lwrt_L(ptr->flbyte, len); else if (len == 2) lwrt_L(ptr->flshort, len); else lwrt_L(ptr->flint, len); break; case TYCHAR: lwrt_A((char *)ptr,len); break; } ptr = (flex *)((char *)ptr + len); } return(0); } E 1 h59186 s 00001/00001/00065 d D 4.3 87/05/13 17:50:01 build 6 5 c removed old SCCS strings and inserted #ident BB e s 00000/00000/00066 d D 4.2 87/02/17 09:41:46 mth 5 4 c rolled rev to -r4 (mth) e s 00000/00000/00066 d D 4.1 87/02/17 09:12:17 mth 4 3 c rolled rev to -r4 (mth) e s 00000/00000/00066 d D 3.1 87/01/21 17:22:04 mkm 3 2 c e s 00000/00000/00066 d D 2.1 87/01/21 17:20:51 mkm 2 1 c e s 00066/00000/00000 d D 1.1 87/01/21 17:12:17 mkm 1 0 c Placed under source control - mkm c These files are direct descendants of the ROS files c by the same name at or about ROS rev 1.3 e u U f b f n t T I 1 D 6 /* "%W% %E%" */ E 6 I 6 #ident " %W% %E% " E 6 /* copy of ftypes from the compiler */ /* variable types * numeric assumptions: * int < reals < complexes * TYDREAL-TYREAL = TYDCOMPLEX-TYCOMPLEX */ #ifdef EXTSEMS /* add BYTE type (byte,logical*1,integer*1) and SLOGICAL type (logical*2) */ #define TYUNKNOWN 0 #define TYADDR 1 #define TYBYTE 2 #define TYSHORT 3 #define TYLONG 4 #define TYREAL 5 #define TYDREAL 6 #define TYCOMPLEX 7 #define TYDCOMPLEX 8 #define TYSLOGICAL 9 #define TYLOGICAL 10 #define TYCHAR 11 #define TYSUBR 12 #define TYERROR 13 #else #define TYUNKNOWN 0 #define TYADDR 1 #define TYSHORT 2 #define TYLONG 3 #define TYREAL 4 #define TYDREAL 5 #define TYCOMPLEX 6 #define TYDCOMPLEX 7 #define TYLOGICAL 8 #define TYCHAR 9 #define TYSUBR 10 #define TYERROR 11 #endif #define NTYPES (TYERROR+1) #define LINTW 12 #define LINE 80 #define LLOGW 2 #define LLOW 1.0 #define LHIGH 10.0 #define LFW 12 #define LFD 8 #define LEW 18 #define LED 9 #define LEE 3 typedef union { short flshort; ftnint flint; #ifdef EXTSEMS char flbyte; #endif float flreal; double fldouble; } flex; extern int scale; extern int (*lioproc)(); E 1 h61078 s 00001/00001/00480 d D 4.3 87/05/13 17:50:18 build 6 5 c removed old SCCS strings and inserted #ident BB e s 00000/00000/00481 d D 4.2 87/02/17 09:41:51 mth 5 4 c rolled rev to -r4 (mth) e s 00000/00000/00481 d D 4.1 87/02/17 09:10:29 mth 4 3 c rolled rev to -r4 (mth) e s 00000/00000/00481 d D 3.1 87/01/21 17:22:05 mkm 3 2 c e s 00000/00000/00481 d D 2.1 87/01/21 17:20:52 mkm 2 1 c e s 00481/00000/00000 d D 1.1 87/01/21 17:12:18 mkm 1 0 c Placed under source control - mkm c These files are direct descendants of the ROS files c by the same name at or about ROS rev 1.3 e u U f b f n t T I 1 D 6 /* "%W% %E%" */ E 6 I 6 #ident " %W% %E% " E 6 #include "fio.h" #include "fmt.h" #include "lio.h" #include "ctype.h" extern char *fmtbuf; extern char *malloc(), *realloc(); int (*lioproc)(); #define isblnk(x) (ltab[x+1]&B) #define issep(x) (ltab[x+1]&SX) #define isapos(x) (ltab[x+1]&AX) #define isexp(x) (ltab[x+1]&EX) #define issign(x) (ltab[x+1]&SG) #define SX 1 #define B 2 #define AX 4 #define EX 8 #define SG 16 char ltab[128+1] = { /* offset one for EOF */ 0, 0,0,AX,0,0,0,0,0,0,0,SX,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, SX|B,0,AX,0,0,0,0,AX,0,0,0,SG,SX,SG,0,SX, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,EX,EX,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, AX,0,0,0,EX,EX,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 }; char l_comma, l_first; t_getc() { int ch; if(curunit->uend) return(EOF); if((ch=getc(cf))!=EOF) return(ch); if(feof(cf)) curunit->uend = 1; return(EOF); } e_rsle() { int ch; if(curunit->uend) return(0); while((ch=t_getc())!='\n' && ch!=EOF); return(0); } flag lquit; int lcount,ltype; char *lchar; double lx,ly; #define ERR(x) if(n=(x)) return(n) #define GETC(x) (x=t_getc()) l_read(number,ptr,len,type) register ftnint *number,type; register flex *ptr; register ftnlen len; { int n,ch; register int i; double *yy; float *xx; for(i=0;i<*number;i++) { if(lquit) return(0); if(curunit->uend) err(elist->ciend, EOF, "list in") if(lcount == 0) { ltype = NULL; if(!l_first) l_comma = 0; else l_first = 0; for(;;) { GETC(ch); switch(ch) { case EOF: goto loopend; case ' ': case '\n': continue; case '/': lquit = 1; goto loopend; case ',': if(l_comma) { lcount = 1; (void) ungetc(ch, cf); goto loopend; } l_comma = 1; continue; default: (void) ungetc(ch, cf); goto rddata; } } } rddata: switch((int)type) { #ifdef EXTSEMS case TYBYTE: #endif case TYSHORT: case TYLONG: case TYREAL: case TYDREAL: ERR(l_R(1)); break; case TYCOMPLEX: case TYDCOMPLEX: ERR(l_C()); break; #ifdef EXTSEMS case TYSLOGICAL: #endif case TYLOGICAL: ERR(l_L()); break; case TYCHAR: ERR(l_CHAR()); break; } loopend: if(lquit) return(0); if(feof(cf)) err(elist->ciend,(EOF),"list in") else if(ferror(cf)) { clearerr(cf); err(elist->cierr,errno,"list in") } if(ltype==NULL) goto bump; switch((int)type) { #ifdef EXTSEMS case TYBYTE: ptr->flbyte=lx; break; #endif case TYSHORT: ptr->flshort=lx; break; #ifdef EXTSEMS case TYSLOGICAL: ptr->flshort=lx; break; #endif case TYLOGICAL: if (len == sizeof(short)) ptr->flshort=lx; #ifdef EXTSEMS else if(len == sizeof(char)) ptr->flbyte=lx; #endif else ptr->flint=lx; break; case TYLONG: ptr->flint=lx; break; case TYREAL: ptr->flreal=lx; break; case TYDREAL: ptr->fldouble=lx; break; case TYCOMPLEX: xx=(float *)ptr; *xx++ = ly ; *xx = lx; break; case TYDCOMPLEX: yy=(double *)ptr; *yy++ = ly; *yy = lx; break; case TYCHAR: b_char(lchar,(char *)ptr,len); break; } bump: if(lcount>0) lcount--; ptr = (flex *)((char *)ptr + len); } return(0); } l_R(flg) int flg; { double a,b,c,d; int ch,sign=0,da,db,dc,dd; register int i; register int j; int poststar = 0; a=b=c=d=0; da=db=dc=0; if(flg && lr_comm()) return(0); da=rd_int(&a); if(da== -1) sign=da; if(GETC(ch)!='*') { (void) ungetc(ch,cf); db=1; b=a; a=1; } else { db=rd_int(&b); lcount=a; } if(db > 0) poststar = 1; if(GETC(ch)!='.') { dc=c=0; (void) ungetc(ch,cf); } else dc=rd_int(&c); if(dc > 0) poststar = 1; if(isexp(GETC(ch))) dd=rd_int(&d); else if(issign(ch)) { (void) ungetc(ch, cf); dd = rd_int(&d); } else { (void) ungetc(ch,cf); dd = 0; d=0; } if(dd > 0) poststar = 1; if(poststar == 0) return(0); if(db && b<0) { sign=1; b = -b; } /*---------------------------- for(i=0;i d) { j = dc - d; for (i=0;icierr,(EOF),"lread") else err(elist->cierr,112,"no star"); } else { lcount=1; (void)ungetc(ch,cf); } while(isblnk(GETC(ch))); (void)ungetc(ch,cf); if(issep(ch) || (ch=='\n')) return(0); /* R* */ if(GETC(ch)!='(') err(elist->cierr,112,"no ("); while(isblnk(GETC(ch))); (void)ungetc(ch,cf); /* (void) fscanf(cf,"%lf",&lx); */ l_R(0); ly=lx; while(isblnk(GETC(ch)) || (ch == '\n')); if(ch!=',') { (void) ungetc(ch,cf); err(elist->cierr,112,"no comma"); } while(isblnk(GETC(ch)) || (ch == '\n')); (void) ungetc(ch,cf); /* (void) fscanf(cf,"%lf",&ly); */ l_R(0); while(isblnk(GETC(ch)) || (ch == '\n')); if(ch!=')') err(elist->cierr,112,"no )"); ltype=TYLONG; return(0); } l_L() { register int ch; if(lcount>0) return(0); ltype=NULL; GETC(ch); if(isdigit(ch)) { (void) ungetc(ch,cf); (void) fscanf(cf,"%d",&lcount); if(GETC(ch)!='*') if(!feof(cf)) err(elist->cierr,112,"no star") else err(elist->cierr,(EOF),"lread"); } else { lcount = 1; (void) ungetc(ch,cf); } if(GETC(ch)=='.') GETC(ch); switch(ch) { case 't': case 'T': lx=1; break; case 'f': case 'F': lx=0; break; default: if(isblnk(ch) || issep(ch) || ch==EOF) { (void) ungetc(ch,cf); return(0); } else err(elist->cierr,112,"logical"); } ltype=TYLONG; while(!issep(GETC(ch)) && ch!=EOF); (void) ungetc(ch, cf); return(0); } #define BUFSIZE 128 l_CHAR() { int ch,size; register int i; char quote,*p; if(lcount>0) return(0); ltype=NULL; GETC(ch); if(isdigit(ch)) { (void) ungetc(ch,cf); (void) fscanf(cf,"%d",&lcount); /* facteur de repetition */ if(GETC(ch)!='*') err(elist->cierr,112,"no star"); } else (void) ungetc(ch,cf); while(isblnk(GETC(ch))); /* R* */ (void)ungetc(ch,cf); if(issep(ch) || (ch=='\n')) return(0); if(GETC(ch)=='\'' || ch=='"') quote=ch; else if(isblnk(ch) || (issep(ch) && ch != '\n') || ch==EOF) { (void) ungetc(ch,cf); return(0); } else err(elist->cierr,112,"no quote"); ltype=TYCHAR; if(lchar!=NULL) free(lchar); size=BUFSIZE; p=lchar=malloc((unsigned int)size); if(lchar==NULL) err(elist->cierr,113,"no space"); for(i=0;;) { while(GETC(ch)!=quote && ch!='\n' && ch!=EOF && ++iuwrt) return(nowreading(curunit)); else return(0); } c_le(a) register cilist *a; { fmtbuf="list io"; lunit=getunit(a->ciunit); if (not_legal(lunit)) err(a->cierr,101,"stler"); scale=recpos=0; elist=a; curunit = &units[lunit]; if(curunit->ufd==NULL && fk_open(SEQ,FMT,a->ciunit)) err(a->cierr,102,"lio"); cf=curunit->ufd; if(!curunit->ufmt) err(a->cierr,103,"lio") return(0); } do_lio(type,number,ptr,len) ftnint *number,*type; flex *ptr; ftnlen len; { return((*lioproc)(number,ptr,len,*type)); } E 1 h41629 s 00001/00001/00993 d D 4.3 87/05/13 17:50:38 build 6 5 c removed old SCCS strings and inserted #ident BB e s 00000/00000/00994 d D 4.2 87/02/17 09:41:58 mth 5 4 c rolled rev to -r4 (mth) e s 00000/00000/00994 d D 4.1 87/02/17 09:10:35 mth 4 3 c rolled rev to -r4 (mth) e s 00000/00000/00994 d D 3.1 87/01/21 17:22:07 mkm 3 2 c e s 00000/00000/00994 d D 2.1 87/01/21 17:20:55 mkm 2 1 c e s 00994/00000/00000 d D 1.1 87/01/21 17:12:18 mkm 1 0 c Placed under source control - mkm c These files are direct descendants of the ROS files c by the same name at or about ROS rev 1.3 e u U f b f n t T I 1 D 6 /* "%W% %E%" */ E 6 I 6 #ident " %W% %E% " E 6 #include #include #include "fio.h" #include "fmt.h" #include "lio.h" /* * namelist io * * see f77's proc.c at namelist() for description */ typedef struct { int ndims; /* # of dimensions */ int nels; /* # of elements */ int baseoff; /* how to get to (0,...,0) element */ int span[7]; /* span of each dimension +1+ */ } Dims; /* dimension descriptor */ /* +1+ note: only # of dimensions applies here, i.e. actual array is between 0 and 7 elements based on ndims */ typedef union { char *pchar; short *pshort; int *pint; long *plong; float *pfloat; double *pdouble; char **pptr; } Pointer; /* pointer to all sorts of things */ typedef struct { char varname[18]; /* name of variable */ Pointer varaddr; /* where it is */ int type; /* its type */ Dims *dimp; /* dimension descriptor */ } Nlentry; /* namelist entry: 1 for each var */ typedef struct { char nlname[18]; /* name of namelist */ Nlentry nlvnames[1]; /* array of variable descriptors +2+*/ } Namelist; /* +2+ note: this array is not bounded but is terminated by an entry with a null varname */ int tabind[10]; /* tabind[0] = nb dimensions */ /* tabind[8] = debut sous chaine tabind[9] = fin sous chaine */ int flagtabchar; /* =1 sous chaine ds el. de tableau */ int lastchar; extern char *fmtbuf; extern char *malloc(), *realloc(); #define isblnk(x) (ltab[x+1]&B) #define issep(x) (ltab[x+1]&SX) #define isapos(x) (ltab[x+1]&AX) #define isexp(x) (ltab[x+1]&EX) #define issign(x) (ltab[x+1]&SG) #define SX 1 #define B 2 #define AX 4 #define EX 8 #define SG 16 extern char ltab[128+1] ;/* offset one for EOF */ char l_comma; int nio_lcount,nio_ltype; char *nio_lchar; double nio_lx,nio_ly; #define ERR(x) if(n=(x)) return(n) #define GETC(x) (x=t_getc()) nio_read(number,ptr,len,type) register ftnint *number,type; register flex *ptr; register ftnlen len; { int n,ch; register int i; double *yy; float *xx; int poscf; nio_lcount = 0; for(i=0;i<*number;i++) { if(curunit->uend) err(elist->ciend, EOF, "list in") if(nio_lcount == 0) { nio_ltype = NULL; l_comma = 0; for(;;) { GETC(ch); switch(ch) { case EOF: goto loopend; case ' ': case '\n': continue; case ',': if(l_comma) { nio_lcount = 1; (void) ungetc(ch, cf); goto loopend; } l_comma = 1; continue; default: (void) ungetc(ch, cf); goto rddata; } } rddata: poscf = ftell(cf); switch((int)type) { #ifdef EXTSEMS case TYBYTE: #endif case TYSHORT: case TYLONG: case TYREAL: case TYDREAL: ERR(niol_R(1)); break; case TYCOMPLEX: case TYDCOMPLEX: ERR(niol_C()); break; #ifdef EXTSEMS case TYSLOGICAL: #endif case TYLOGICAL: ERR(niol_L()); break; case TYCHAR: ERR(niol_CHAR()); break; } if (poscf == ftell(cf)) return(0);/* les procedures niol_R,niol_L,niol_CHAR n' ont pas trouves de valeurs ds la liste d' entree (position inchange ds le fichier) . on sort de maniere a ne pas modifier les elements de tableau suivant */ loopend: if(feof(cf)) err(elist->ciend,(EOF),"list in") else if(ferror(cf)) { clearerr(cf); err(elist->cierr,errno,"list in") } } if(nio_ltype==NULL) goto bump; switch((int)type) { #ifdef EXTSEMS case TYBYTE: ptr->flbyte=nio_lx; break; #endif case TYSHORT: ptr->flshort=nio_lx; break; #ifdef EXTSEMS case TYSLOGICAL: ptr->flshort=nio_lx; break; #endif case TYLOGICAL: if (len == sizeof(short)) ptr->flshort=nio_lx; #ifdef EXTSEMS else if (len == sizeof(char)) ptr->flbyte = nio_lx; #endif else ptr->flint=nio_lx; break; case TYLONG: ptr->flint=nio_lx; break; case TYREAL: ptr->flreal=nio_lx; break; case TYDREAL: ptr->fldouble=nio_lx; break; case TYCOMPLEX: xx=(float *)ptr; *xx++ = nio_ly ; *xx = nio_lx; break; case TYDCOMPLEX: yy=(double *)ptr; *yy++ = nio_ly; *yy = nio_lx; break; case TYCHAR: b_char(nio_lchar,(char *)ptr,len); break; } bump: if(nio_lcount>0) nio_lcount--; ptr = (flex *)((char *)ptr + len); } return(0); } niol_R(flg) int flg; { double a,b,c,d; int ch,sign=0,da,db,dc,dd; register int i; register int j; int poststar = 0; a=b=c=d=0; da=db=dc=0; if(flg && nio_lcount>0 ) return(0); da=niord_int(&a); if(da== -1) sign=da; if(GETC(ch)!='*') { (void) ungetc(ch,cf); db=1; b=a; a=1; } else { db=niord_int(&b); nio_lcount=a; if (nio_lcount <= 0) err(elist->cierr=0,112,"bad repetition count"); } if(db > 0) poststar = 1; if(GETC(ch)!='.') { dc=c=0; (void) ungetc(ch,cf); } else dc=niord_int(&c); if(dc > 0) poststar = 1; if(isexp(GETC(ch))) dd=niord_int(&d); else if(issign(ch)) { (void) ungetc(ch, cf); dd = niord_int(&d); } else { (void) ungetc(ch,cf); dd = 0; d=0; } if(dd > 0) poststar = 1; if(poststar == 0) return(0); if(db && b<0) { sign=1; b = -b; } /*---------------------------- for(i=0;i d) { j = dc - d; for (i=0;i0) return(0); if(isdigit(GETC(ch))) { (void)ungetc(ch,cf); /* facteur de repetition */ niord_int(&lc); nio_lcount=(int)lc; if (nio_lcount <= 0) err(elist->cierr=0,112,"bad repetition count"); if(GETC(ch)!='*') if(feof(cf)) err(elist->cierr=0,(EOF),"lread") else err(elist->cierr=0,112,"no star"); } else { (void)ungetc(ch,cf); if(ch == '-') err(elist->cierr=0,112,"bad repetition count"); if(isalpha(ch)) { nio_lcount = 0; return(0); } else nio_lcount=1; } while(isblnk(GETC(ch))); (void)ungetc(ch,cf); if(issep(ch) || (ch=='\n') || ch=='$' || ch=='&') return(0); /* R* */ if(GETC(ch)!='(') err(elist->cierr=0,112,"no ("); while(isblnk(GETC(ch))); (void)ungetc(ch,cf); niol_R(0); nio_ly=nio_lx; while(isblnk(GETC(ch)) || (ch == '\n')); if(ch!=',') { (void) ungetc(ch,cf); err(elist->cierr=0,112,"no comma"); } while(isblnk(GETC(ch)) || (ch == '\n')); (void) ungetc(ch,cf); niol_R(0); while(isblnk(GETC(ch)) || (ch == '\n')); if(ch!=')') err(elist->cierr=0,112,"no )"); nio_ltype=TYLONG; return(0); } niol_L() { register int ch; double lc; if(nio_lcount>0) return(0); nio_ltype=NULL; GETC(ch); if(isdigit(ch)) { (void) ungetc(ch,cf); niord_int(&lc); nio_lcount = (int) lc; if (nio_lcount <= 0) err(elist->cierr=0,112,"bad repetition count"); if(GETC(ch)!='*') if(!feof(cf)) err(elist->cierr=0,112,"no star") else err(elist->cierr=0,(EOF),"lread"); } else { (void) ungetc(ch,cf); if(ch == '-') err(elist->cierr=0,112,"bad repetition count"); } if(GETC(ch)=='.') GETC(ch); switch(ch) { case 't': case 'T': nio_lx=1; break; case 'f': case 'F': nio_lx=0; break; default: goto ret; } nio_ltype=TYLONG; if (!nio_lcount) nio_lcount = 1; while(!issep(GETC(ch)) && ch!=EOF && ch!='$' && ch!='&' && ch!='\n') ; ret: (void) ungetc(ch, cf); return(0); } #define BUFSIZE 128 niol_CHAR() { int ch,size; register int i; char quote,*p; double lc; if(nio_lcount>0) return(0); nio_ltype=NULL; GETC(ch); if(isdigit(ch)) { (void) ungetc(ch,cf); /* facteur de repetition */ niord_int(&lc); nio_lcount = (int) lc; if (nio_lcount <= 0) err(elist->cierr=0,112,"bad repetition count"); if(GETC(ch)!='*') err(elist->cierr=0,112,"no star"); } else { (void) ungetc(ch,cf); if(ch == '-') err(elist->cierr=0,112,"bad repetition count"); if(isalpha(ch)) { nio_lcount = 0; return(0); } else nio_lcount = 1; } while(isblnk(GETC(ch))); /* R* */ (void)ungetc(ch,cf); if(issep(ch) || (ch=='\n') || ch=='$' || ch=='&') return(0); if(GETC(ch)=='\'' || ch=='"') quote=ch; else if(isblnk(ch) || (issep(ch) && ch != '\n') || ch==EOF) { (void) ungetc(ch,cf); return(0); } else err(elist->cierr=0,112,"no quote"); nio_ltype=TYCHAR; if(nio_lchar!=NULL) free(nio_lchar); size=BUFSIZE; p=nio_lchar=malloc((unsigned int)size); if(nio_lchar==NULL) err(elist->cierr=0,113,"no space"); for(i=0;;) { while(GETC(ch)!=quote && ch!='\n' && ch!=EOF && ++i=0) { tabind[i--] = 0; } if (!init) f_init(); if (n = c_nle(pnlarg)) return (n); reading = external = sequential = 1; formatted = 1; if (curunit->uwrt && nowreading(curunit)) return (1); pnl = (Namelist *) pnlarg->cifmt; if (getc(cf) != ' ' || !(( x=getc(cf)) == '&' || x == '$' )) err(pnlarg->cierr, 115, nlrs); if (strcmp(pnl->nlname, getword(buf, strlen(pnl->nlname)))) err(pnlarg->cierr, 122, buf); n = lastchar; if (!isspace(n)) err(pnlarg->cierr, 115, nlrs); for(;;) { if (!getword(buf, BSIZ - 1)) err(pnlarg->cierr, 124, nlrs); if (!(strcmp(buf, "&end") && strcmp(buf, "$end") && strcmp(buf, "&") && strcmp(buf, "$"))) /* all namelist block has been read,but all variables in namelist were not defined in data. */ return(0); if (!(pnlent = findit(buf, pnl->nlvnames))) err(pnlarg->cierr, 123, buf); if (getvar(pnlent)) err(pnlarg->cierr, 124, nlrs); } } /* miscellaneous utility functions for namelist read */ /* getword - get a "word" text string from current file */ char *getword(s, n) char *s; int n; { int i; char *p; p = s; i = getc(cf); while (isspace(i) || (ispunct(i) && i != '&' && i != '$') ) i = getc(cf); while (n--) { if (i != EOF && i != '=' && !isspace(i)) { if (i == '(' ) { flagtabchar = 0; recupind(); i = getc(cf); if ( i == '(' ) { flagtabchar++; recupind(); i = getc(cf); } break; } else if (isupper(i)) *p++ = tolower(i); else *p++ = i; } else break; i = getc(cf); } lastchar = i; if (feof(cf) && p == s) return (NULL); *p = '\0'; return (s); } /* recuperation des indices */ recupind() { int i,j,k,signindice; k=8; if (!flagtabchar) { signindice=0; if( (i=getc(cf)) == '-') signindice++; else ungetc(i,cf); j = 1; } while ((i = getc(cf)) != ')' ) { if (!flagtabchar) { if (i == ',') { if(signindice) tabind[j] = -tabind[j]; j++; signindice = 0; if( (i=getc(cf)) == '-') signindice++; else ungetc(i,cf); } else if ( i == ':') { if(signindice) err(elist->cierr=0,112,"bad dimensions for substring"); /* indice debut sous chaine */ tabind[k] = tabind[j]; k++; j=0; } else if ( k == 8) { if(!isdigit(i)) err(elist->cierr=0,112,"bad dimensions"); tabind[j] = 10 * tabind[j] + i - '0'; } else { if(!isdigit(i)) err(elist->cierr=0,112,"bad dimensions for substring"); tabind[k] = 10 * tabind[k] + i - '0'; /* indice fin sous chaine */ } } else /* sous chaine ds el. de tableau */ if (i != ':') tabind[k] = 10 * tabind[k] + i - '0'; else k++; } tabind[0] = j; if(signindice) tabind[j] = -tabind[j]; if ( k == 9 ) flagtabchar++; } /* findit - find key in list of Nlentrys */ Nlentry *findit(key, list) char *key; Nlentry *list; { while (strlen(list->varname)) { if (!strcmp(key, list->varname)) return (list); else ++list; } return (NULL); } /* getvar - read values for namelist io * * getvar uses l_read of list io to do all the dirty work, therefore * it should be inserted into the library before lread.c (on UNIX * systems with barbaric topologically sorted libraries) * * It sets the cierr flag so that l_read (and its subordinates) will * not report errors, but pass them back so that the diagnostic message * will appear to come from "namelist read". */ getvar(pnlent) Nlentry *pnlent; { int n, i, size; char *pt; int typelrd; int j; Pointer ptvaraddr; typelrd = pnlent->type; if(( tabind[0] && ! pnlent->dimp ) || ( tabind[8] && typelrd > 0) ) err(elist->cierr=0,112,"bad type"); if (pnlent->dimp) { n = pnlent->dimp->nels; if (tabind[0]) { if( tabind[0] != pnlent->dimp->ndims) err(elist->cierr=0,112,"bad dimensions for array element"); j = 0; for (i=tabind[0]; i > 0 ; i--) j = j * pnlent->dimp->span[i-1] + tabind[i]; if( j < pnlent->dimp->baseoff) err(elist->cierr=0,112,"bad dimensions for array element"); j = j -pnlent->dimp->baseoff; if( j >= pnlent->dimp->nels) err(elist->cierr=0,112,"bad dimensions for array element"); n = n -j; /* nb el. a intialiser */ } } else n = 1; elist->cierr = 1; /* modif SEMS 08/09/86 BUG FIX reported by MTH ; rc detects an error pt = (char*) pnlent->varaddr ; */ pt = (char*) pnlent->varaddr.pchar ; /* */ ptvaraddr = pnlent->varaddr; switch (pnlent->type) { case TYADDR: size = sizeof(char *); break; #ifdef EXTSEMS case TYBYTE: size = sizeof(char); if(tabind[0]) { ptvaraddr.pchar += j; pt = (char*) ptvaraddr.pchar; } break; case TYSLOGICAL: #endif case TYSHORT: size = sizeof(short); if(tabind[0]) { ptvaraddr.pshort += j; pt = (char*) ptvaraddr.pshort; } break; case TYLOGICAL: case TYLONG: size = sizeof(long); if(tabind[0]) { ptvaraddr.plong += j; pt = (char*) ptvaraddr.plong; } break; case TYCOMPLEX: if(tabind[0] ) j *= 2; case TYREAL: size = sizeof(float); if(pnlent->type == TYCOMPLEX) size *= 2; if(tabind[0]) { ptvaraddr.pfloat += j; pt = (char*) ptvaraddr.pfloat; } break; case TYDCOMPLEX: if (tabind[0]) j *= 2; case TYDREAL: size = sizeof(double); if(pnlent->type == TYDCOMPLEX) size *= 2; if(tabind[0]) { ptvaraddr.pdouble += j; pt = (char*) ptvaraddr.pdouble; } break; default: if (pnlent->type < 0) { size = -pnlent->type; if ( tabind[0] ) pt = pt + j * ( - pnlent->type); if (flagtabchar) { if(tabind[8] <=0 || tabind[9] <=0 || tabind[8] > tabind[9] ) err(elist->cierr=0,112,"bad dimensions for array element"); if(tabind[9] > size) { if(tabind[8] > size) err(elist->cierr=0,112,"bad dimensions for array element"); size = size - tabind[8] +1; } else size = tabind[9] - tabind[8] +1; pt = pt + tabind[8] - 1; if(flagtabchar > 1) n=1; } typelrd = TYCHAR; break; } else err(elist->cierr = 0, 121, nlrs); } if (n = nio_read(&n, pt, size, typelrd)) err(0, n, nlrs); elist->cierr = 0; i = 9; while (i >= 0) tabind[i--] = 0; flagtabchar = 0; return (0); } /* * s_wsne - start write namelist external * * s_wsne * if (file not initialized) * initialize it * if (file doesn't jive with namelist io) * return error * initialize some global variables * if (not currently writing on file OR not capable of doing so) * return error * set up namelist and entry pointers * output namelist name in proper format * do * output variable name * output value based on type * point to next entry * while (there are more to do AND sneakily output a comma separator * output end line * end s_wsne */ s_wsne(pnlarg) cilist *pnlarg; { Namelist *pnl; Nlentry *pnlent; Pointer ptr; int i, n, vtype; char *pch, buf[BSIZ]; if (!init) f_init(); if (n = c_nle(pnlarg)) return(n); reading = 0; formatted =1; external = sequential = 1; if (!curunit->uwrt && nowwriting(curunit)) return(1); pnl = (Namelist *) pnlarg->cifmt; (void) putc(' ', cf); (void) putc('$', cf); (void) fputs(pnl->nlname, cf); (void) putc(' ', cf); pnlent = pnl->nlvnames; do { (void) putc('\n', cf); (void) fputs(pnlent->varname, cf); (void) putc('=', cf); if (pnlent->dimp) n = pnlent->dimp->nels; else n = 1; if ((vtype = pnlent->type) < 0 && (pch = pnlent->varaddr.pchar)) do { (void) putc('\'', cf); for (i = vtype; i; ++i) (void) putc(*pch++, cf); (void) putc('\'', cf); } while (--n && !t_putc(',')); else { ptr.pchar = pnlent->varaddr.pchar; do { switch (vtype) { case TYADDR: (void) sprintf(buf,"0x%x", *ptr.pptr++); break; #ifdef EXTSEMS case TYBYTE: (void) sprintf(buf,"%d", *ptr.pchar++); break; #endif case TYSHORT: (void) sprintf(buf,"%d", *ptr.pshort++); break; case TYLONG: (void) sprintf(buf,"%ld", *ptr.plong++); break; case TYREAL: (void)sprintf(buf,"%.6e",*ptr.pfloat++); break; case TYDREAL: (void) sprintf(buf, "%.16e", *ptr.pdouble++); break; case TYCOMPLEX: (void) sprintf(buf, "(%.6e,%.6e)", *ptr.pfloat, *(ptr.pfloat+1)); ptr.pfloat += 2; break; case TYDCOMPLEX: (void) sprintf(buf, "(%.16e,%.16e)", *ptr.pdouble, *(ptr.pdouble+1)); ptr.pdouble += 2; break; case TYCHAR: (void) sprintf(buf, "%c", *ptr.pchar++); break; #ifdef EXTSEMS case TYSLOGICAL: (void) sprintf(buf, ".%s.", (*ptr.pshort ? "TRUE" : "FALSE")); break; #endif case TYLOGICAL: (void) sprintf(buf, ".%s.", (*ptr.plong ? "TRUE" : "FALSE")); break; default: err(pnlarg->cierr, 121, "namelist io"); } (void) fputs(buf, cf); } while (--n && !t_putc(',')); } ++pnlent; } while (strlen(pnlent->varname) && !t_putc(',')); (void) fputs("\n $end\n", cf); return (0); } /* * c_nle - check namelist external * * c_nle * set up global variables * if (bogus unit) * fatal error * if (unit is unitialized AND can't be) * fatal error * if (can't do unformatted io on unit) * fatal error * end c_nle */ c_nle(pcl) cilist *pcl; { fmtbuf = "namelist io"; lunit=getunit(pcl->ciunit); if (not_legal(lunit)) err(pcl->cierr, 101, "start namelist io"); scale = recpos = 0; elist = pcl; curunit = &units[lunit]; if (curunit->ufd == NULL && fk_open(SEQ, FMT, pcl->ciunit)) err(pcl->cierr, 102, "namelist io"); cf = curunit->ufd; if (!curunit->ufmt) err(pcl->cierr, 103, "namelist io"); return(0); } E 1 h22773 s 00001/00001/00303 d D 4.4 87/05/13 17:50:59 build 7 6 c removed old SCCS strings and inserted #ident BB e s 00008/00000/00296 d D 4.3 87/04/02 14:15:19 build 6 5 c Make logical file names work more like they do on VMS. e s 00000/00000/00296 d D 4.2 87/02/17 09:42:04 mth 5 4 c rolled rev to -r4 (mth) e s 00000/00000/00296 d D 4.1 87/02/17 09:10:43 mth 4 3 c rolled rev to -r4 (mth) e s 00000/00000/00296 d D 3.1 87/01/21 17:22:09 mkm 3 2 c e s 00000/00000/00296 d D 2.1 87/01/21 17:21:00 mkm 2 1 c e s 00296/00000/00000 d D 1.1 87/01/21 17:12:19 mkm 1 0 c Placed under source control - mkm c These files are direct descendants of the ROS files c by the same name at or about ROS rev 1.3 e u U f b f n t T I 1 D 7 /* "%W% %E%" */ E 7 I 7 #ident " %W% %E% " E 7 #include "sys/types.h" #include "sys/stat.h" #include "fio.h" extern char *mktemp(), *malloc(), *strcpy(); extern char *fortfile; #ifdef LFNAMES extern char *fortlfile; int lfn_flag = 0; f_setlfnflag() { lfn_flag = 1; } /* entry point for rf */ f_setl() { lfn_flag = 1; } #endif f_open(a) register olist *a; { register unit *b; int n; short int i,j; char buf[256]; cllist x; #ifdef LFNAMES char * pfname; char lfnbuf[256]; #endif int flagstat; int append; char nbuf[10]; lunit=setunit(a->ounit); if (not_legal(lunit)) err(a->oerr,101,"open") b= &units[lunit]; /* 10/5/85 modif mode open */ append = 0; /* valeur par defaut en debut de fichier */ if( a->omode) { if(*a->omode == 'a' || *a->omode == 'A') { b->umode = WM; append = 1; /* open en fin de fichier */ } else if(*a->omode == 'w' || *a->omode == 'W') { b->umode = WM; append = 0; /* open en debut de fichier*/ } else if(*a->omode == 'r' || *a->omode == 'R') if(strlen(a->omode) >= 3) { a->omode++ ; a->omode++ ; if(*a->omode == 'w' || *a->omode == 'W') b->umode = RWM; else b->umode = RM; } else b->umode = RM; else err(a->oerr,120,"open mode="); } else b->umode = RWM; /*-----------------------------------------------*/ if(b->ufd!=0) goto connected; unconnected: b->url=a->orl; b->ublnk=0; /* blank=null par defaut*/ if(a->oblnk) if(*a->oblnk=='z' || *a->oblnk=='Z') b->ublnk=1; if(a->ofm==0) { if(b->url>0) b->ufmt=0; else b->ufmt=1; } else if(*a->ofm=='f' || *a->ofm=='F') b->ufmt=1; else b->ufmt=0; flagstat = 1; if(a->osta==0) goto unknown; switch(*a->osta) { default: case 'o': flagstat=2; case 'O': flagstat=2; case 'n': /* flagstat=1 */ case 'N': /* flagstat=1 */ if(a->ofnm==0) err(a->oerr,107,"open") g_char(a->ofnm,a->ofnmlen,buf); b->uscrtch=0; #ifndef LFNAMES if( flagstat == 2 && access(buf,0) ) err(a->oerr,errno,"open") #endif done1: if(a->ofnm!=0) { i=j=0; if(buf[i]==' ') { while (buf[i]==' ') i++; while ((buf[j++]=buf[j+i])!='\0') ; buf[j]='\0'; } } done: #ifdef LFNAMES if( lfn_flag && !b->uscrtch) { if(a->ofnm) { /* files names are logical files names: we must get the physical file name by getenv (only if status != SCRATCH) */ /* buf is a logical file name (lfn) ; get the physical one.(pfn) */ /* do it only if a file name is specified in open statement */ /* copy logical file name in lfnbuf */ strcpy(lfnbuf,buf); pfname =(char *)getenv(buf); I 6 #ifdef ridge if (pfname != NULL) strcpy(buf,pfname); /* else use the logical file name as the * physical file name, the way VMS fortran does */ #else E 6 if(pfname == 0) err(a->oerr,126,"open"); /* copy pfn in buf */ strcpy(buf,pfname); I 6 #endif E 6 if( flagstat == 1 ) /* status = new */ { /* status = new ;SYSDEP access */ if(access(buf, 0) == -1) (void) close(creat(buf, 0666)); else err(a->oerr,117,"open") } else if( flagstat == 2 && access(buf,0666) ) /* status = old */ err(a->oerr,errno,"open") } /* store in ufnm the logical file name */ b->ufnm = (char *) malloc((unsigned int)(strlen(lfnbuf)+1)); if(b->ufnm==NULL) err(a->oerr,113,"no space"); strcpy(b->ufnm,lfnbuf); } else { if( flagstat == 1 ) { /* status = new ;SYSDEP access */ if(access(buf, 0) == -1) (void) close(creat(buf, 0666)); else err(a->oerr,117,"open") } else if (flagstat == 2 && !lfn_flag && access(buf,0)) err(a->oerr,errno,"open") b->ufnm = (char *) malloc((unsigned int)(strlen(buf)+1)); if(b->ufnm==NULL) err(a->oerr,113,"no space"); (void) strcpy(b->ufnm,buf); } #else if( flagstat == 1 ) { /* status = new ;SYSDEP access */ if(access(buf, 0) == -1) (void) close(creat(buf, 0666)); else err(a->oerr,117,"open") } b->ufnum = (char *) malloc((unsigned int)(strlen(buf)+1)); if(b->ufnm==NULL) err(a->oerr,113,"no space"); (void) strcpy(b->ufnm,buf); #endif b->uend=0; if(isdev(buf)) { b->ufd = fopen(buf,"r"); if(b->ufd==NULL) err(a->oerr,errno,buf) else b->uwrt = 0; } else { if((b->ufd = fopen(buf, "r+")) || (b->ufd = fopen(buf, "w+"))) { if(append) { if (fseek(b->ufd,0L,2)) err(a->oerr,errno,"open") } if ( b->umode == WM) b->uwrt=1; else b->uwrt=0; } else if((b->ufd = fopen(buf, "r")) != NULL) { if(append) (void)fseek(b->ufd, 0L,2); b->uwrt = 0; } else err(a->oerr, errno, buf) } b->useek=canseek(b->ufd); if((b->uinode=inode(buf))==-1) err(a->oerr,108,"open") if(a->orl && b->useek) rewind(b->ufd); return(0); case 's': case 'S': b->uscrtch=1; (void) strcpy(buf,"tmp.FXXXXXX"); (void) mktemp(buf); goto done; unknown: case 'u': case 'U': flagstat = 0; if(a->ofnm==0) { /* status=unknown+file omis on prend un nom par deaut (fort.n)*/ #ifdef LFNAMES if (lfn_flag) (void)sprintf(nbuf,fortlfile,a->ounit); else (void)sprintf(nbuf,fortfile,a->ounit); #else (void)sprintf(nbuf,fortfile,a->ounit); #endif a->ofnmlen=strlen(nbuf); (void)strcpy(buf,nbuf); } else g_char(a->ofnm,a->ofnmlen,buf); b->uscrtch=0; goto done1; } connected: if(a->ofnm==0) { same: if(a->oblnk!= 0) b->ublnk= (*a->oblnk== 'n' || *a->oblnk== 'N')? 0:1; return(0); } g_char(a->ofnm,a->ofnmlen,buf); if(inode(buf)==b->uinode) goto same; x.cunit=a->ounit; x.csta=0; x.cerr=a->oerr; if((n=f_clos(&x))!=0) return(n); goto unconnected; } fk_open(seq,fmt,n) register ftnint n; { char nbuf[10]; register olist a; #ifdef LFNAMES if (lfn_flag) /* make a logical file name: FORTx (x is the unit number)*/ sprintf(nbuf,fortlfile,n); else /* make a physical file name: fort.x (x is the unit number)*/ sprintf(nbuf,fortfile,n); #else sprintf(nbuf,fortfile,n); #endif a.oerr=1; a.ounit=n; a.ofnm=nbuf; a.ofnmlen=strlen(nbuf); a.osta=NULL; a.oacc= seq==SEQ?"s":"d"; a.ofm = fmt==FMT?"f":"u"; a.orl = seq==DIR?1:0; a.oblnk=NULL; a.omode = "r/w"; return(f_open(&a)); } isdev(s) char *s; { struct stat x; int j; if(stat(s, &x) == -1) return(0); if((j = (x.st_mode&S_IFMT)) == S_IFREG || j == S_IFDIR) return(0); else return(1); } checkmode(mode) int mode; { if (mode == READING) { if (curunit->umode == WM) err(0,119,"attempt to read"); } else if (curunit->umode == RM) err(0,119,"attempt to write"); return(0); } E 1 h23174 s 00001/00001/00417 d D 4.3 87/05/13 17:51:23 build 6 5 c removed old SCCS strings and inserted #ident BB e s 00000/00000/00418 d D 4.2 87/02/17 09:42:09 mth 5 4 c rolled rev to -r4 (mth) e s 00000/00000/00418 d D 4.1 87/02/17 09:10:46 mth 4 3 c rolled rev to -r4 (mth) e s 00000/00000/00418 d D 3.1 87/01/21 17:22:11 mkm 3 2 c e s 00000/00000/00418 d D 2.1 87/01/21 17:21:02 mkm 2 1 c e s 00418/00000/00000 d D 1.1 87/01/21 17:12:20 mkm 1 0 c Placed under source control - mkm c These files are direct descendants of the ROS files c by the same name at or about ROS rev 1.3 e u U f b f n t T I 1 D 6 /* "%W% %E%" */ E 6 I 6 #ident " %W% %E% " E 6 #include "fio.h" #include "fmt.h" extern int cursor; rd_ed(p,ptr,len) register char *ptr; register struct syl *p; register ftnlen len; { register int ch; for(;cursor>0;cursor--) if((ch=(*getn)())<0) return(ch); if(cursor<0) { if(recpos+cursor < 0) err(elist->cierr,110,"fmt"); for(;cursor<0;cursor++) (*back)(); } /* if(curunit->useek) (void) fseek(cf,(long) cursor,1); else err(elist->cierr,106,"fmt"); cursor=0; */ switch(p->op) { default: fprintf(stderr,"rd_ed, unexpected code: %d\n%s\n", p->op,fmtbuf); abort(); case I: ch = (rd_I((uint *)ptr,p->p1,len, 10)); break; case IM: ch = (rd_I((uint *)ptr,p->p1,len, 10)); break; #ifdef EXTSEMS case O: ch = (rd_Ix(ptr, p->p1, len, 8)); #else case O: ch = (rd_I((uint *)ptr, p->p1, len, 8)); #endif break; #ifdef EXTSEMS case Z: ch = (rd_Ix(ptr, p->p1, len, 16)); break; #endif case L: ch = (rd_L((uint *)ptr,p->p1,len)); break; case A: ch = (rd_A(ptr,len)); break; case AW: ch = (rd_AW(ptr,p->p1,len)); break; case E: case EE: case D: case G: case GE: case F: ch = (rd_F((ufloat *)ptr,p->p1,p->p2,len)); break; #ifdef EXTSEMS case Q: ch = (rd_Q((uint *)ptr,len)); break; #endif } if(ch == 0) return(ch); else if(feof(cf)) return(EOF); clearerr(cf); return(errno); } rd_ned(p) register struct syl *p; { switch(p->op) { default: fprintf(stderr,"rd_ned, unexpected code: %d\n%s\n", p->op,fmtbuf); abort(); case APOS: return(rd_POS(p->p1)); case H: return(rd_H(p->p1,p->p2)); case SLASH: return((*donewrec)()); case TR: case X: cursor += p->p1; return(1); case T: cursor=p->p1-recpos - 1; return(1); case TL: cursor -= p->p1; return(1); } } #ifdef EXTSEMS rd_Ix(pn,w,len, base) ftnlen len; char *pn; int base; { long x=0; int i,sign=0,ch; #define MAXCHAR 100 char buf[MAXCHAR]; register int ipn,ibuf,nbits,hword; int masqueoctet =255; int basenbits; int ndigits; uint * pval; ibuf=0; for(i=0;i= 0) { /* alimenter un digit sans perdre les bits restant */ /* de maniere a constituer un octet */ while (nbits < 8) { if (ibuf >=0) if (nbits != 0) hword |= (buf[ibuf--] << nbits); else hword = buf[ibuf--]; nbits += basenbits; } /* vider l'octet constitue */ pn[ipn--] = hword & masqueoctet; hword = hword >> 8; nbits -= 8; } if (sign) if (len == 1 || len == 2 || len == 4) { /* prendre en compte le signe */ pval = (uint *)pn; if(len==sizeof(short)) x=pval->is; else if(len == sizeof(char)) x=pval->ic; else x=pval->il; x = -x; if(len==sizeof(short)) pval->is=x; else if(len == sizeof(char)) pval->ic = x; else pval->il=x; return(0); } else return(errno=115); return(0); } #endif rd_I(n,w,len, base) register ftnlen len; register uint *n; register int base; { long x=0; int i,sign=0,ch; for(i=0;iis=x; else if(len == sizeof(char)) n->ic = x; else n->il=x; return(0); } #ifdef EXTSEMS rd_Q(p,len) uint *p; { int q; q = howmany_pos(); if (len == sizeof(char)) p->ic=q; else if (len == sizeof(short)) p->is=q; else p->il=q; return(0); } #endif rd_L(n,w,len) uint *n; { int ch,i,v = -1; for(i=0;iis = v; else if (len==sizeof(char)) n->ic = v; else n->il=v; return(0); } rd_F(p,w,d,len) register ftnlen len; register ufloat *p; { double x,y; int sx,sz,dot,ny,z,sawz; register int i,ch; register int j; x=y=0; sawz=z=ny=dot=sx=sz=0; for(i=0;i='0') x=10*x+ch-'0'; else if(ch=='e' || ch=='E' || ch=='d' || ch=='D' || ch=='.') break; else if(cblank && (ch==' ' || ch== '\n')) x*=10; else if(ch==',') { i=w; break; } else return(errno = 115); } if(ch=='.') dot=1; while(i='0') y=10*y+ch-'0'; else if(cblank && (ch==' ' || ch == '\n')) y *= 10; else if(ch==',') {i=w; break;} else if(ch==' ') continue; else continue; ny++; } expon: if(ch=='-') sz=1; while(i='0') z=10*z+ch-'0'; else if(cblank && (ch==' ' || ch == '\n')) z *= 10; else if(ch==',') break; else if(ch==' ') continue; else if(ch=='+') continue; else if(ch!='\n') return(errno=115); } /*---------------------------- if(!dot) for(i=0;i z) { j = ny - z; for (i=0;i z) { j = d - z; for (i=0;i0;i--) x /= 10; for(i=scale;i<0;i++) x *= 10; } if(len==sizeof(float)) p->pf=x; else p->pd=x; return(0); } rd_A(p,len) register char *p; register ftnlen len; { register int i,ch; for(i=0;i=len) { for(i=0;iaunit); if (not_legal(lunit)) err(a->aerr,101,"rewind"); b = &units[lunit]; if(b->ufd == NULL) if(fk_open(SEQ,FMT,a->aunit)) err(a->aerr,114,"rewind") if(!b->useek) err(a->aerr,106,"rewind") if(b->uwrt) { (void) nowreading(b); if(ftell(b->ufd) != 0) (void) t_runc(b); } rewind(b->ufd); b->uend=0; return(0); } I 6 E 6 E 1 h06836 s 00001/00001/00070 d D 4.3 87/05/13 18:17:22 build 6 5 c removed old SCCS strings and inserted #ident BB e s 00000/00000/00071 d D 4.2 87/02/17 09:42:17 mth 5 4 c rolled rev to -r4 (mth) e s 00000/00000/00071 d D 4.1 87/02/17 09:10:54 mth 4 3 c rolled rev to -r4 (mth) e s 00000/00000/00071 d D 3.1 87/01/21 17:22:13 mkm 3 2 c e s 00000/00000/00071 d D 2.1 87/01/21 17:21:04 mkm 2 1 c e s 00071/00000/00000 d D 1.1 87/01/21 17:12:22 mkm 1 0 c Placed under source control - mkm c These files are direct descendants of the ROS files c by the same name at or about ROS rev 1.3 e u U f b f n t T I 1 D 6 /* "%W% %E%" */ E 6 I 6 #ident " %W% %E% " E 6 /* read sequential formatted external */ #include "fio.h" #include "fmt.h" extern int x_getc(),rd_ed(),rd_ned(); extern int x_back(); extern int x_endp(),x_rev(),xrd_SL(); s_rsfe(a) cilist *a; /* start */ { int n; if(!init) f_init(); if(n=c_sfe(a)) return(n); reading=1; sequential=1; formatted=1; external=1; elist=a; cursor=recpos=0; scale=0; fmtbuf=a->cifmt; curunit= &units[lunit]; /*lunit : voir c_sfe*/ cf=curunit->ufd; if(pars_f(fmtbuf)<0) err(a->cierr,100,"startio"); if(checkmode(READING)) return(119); getn= x_getc; back = x_back; doed= rd_ed; doned= rd_ned; fmt_bg(); doend=x_endp; donewrec=xrd_SL; dorevert=x_rev; cblank=curunit->ublnk; cplus=0; if(curunit->uwrt) (void) nowreading(curunit); return(0); } xrd_SL() { register int ch; if(!curunit->uend) while((ch=getc(cf))!='\n' && ch!=EOF); cursor=recpos=0; return(1); } x_getc() { register int ch; if(curunit->uend) return(EOF); if((ch=getc(cf))!=EOF && ch!='\n') { recpos++; return(ch); } if(ch=='\n') { (void) ungetc(ch,cf); return(ch); } if(feof(cf)) { errno=0; curunit->uend=1; return(-1); } return(-1); } x_endp() { (void) xrd_SL(); return(0); } x_rev() { (void) xrd_SL(); return(0); } E 1 h02398 s 00001/00001/00054 d D 4.3 87/05/13 18:17:40 build 6 5 c removed old SCCS strings and inserted #ident BB e s 00000/00000/00055 d D 4.2 87/02/17 09:42:20 mth 5 4 c rolled rev to -r4 (mth) e s 00000/00000/00055 d D 4.1 87/02/17 09:10:57 mth 4 3 c rolled rev to -r4 (mth) e s 00000/00000/00055 d D 3.1 87/01/21 17:22:14 mkm 3 2 c e s 00000/00000/00055 d D 2.1 87/01/21 17:21:05 mkm 2 1 c e s 00055/00000/00000 d D 1.1 87/01/21 17:12:24 mkm 1 0 c Placed under source control - mkm c These files are direct descendants of the ROS files c by the same name at or about ROS rev 1.3 e u U f b f n t T I 1 D 6 /* "%W% %E%" */ E 6 I 6 #ident " %W% %E% " E 6 /* sequential formatted external common routines*/ #include "fio.h" extern char *fmtbuf; #ifdef EXTSEMS howmany_pos() /* associe au format q (nombre de caracteres avant la fin d'enregistrement */ { int ch,nb; nb=0; /* est-ce la fin */ if (curunit->uend) return(0); if (!curunit->useek) { if (cf->_cnt == 0) { ch = getc(cf); /* pour alimenter le buffer d'e/s */ ungetc(ch,cf); /* si Q est en tete de format */ } return(cf->_cnt-1); } else { /* recherche du prochain retour chariot */ while ( (ch=getc(cf)) != '\n' && ch != EOF) nb++; /* on recule de nb positions */ fseek( cf, -(nb+1), 1); /* on rend le nombre de caracteres restant avant le retour chariot ( pos. courante (1) +nb -1) */ return(nb); } } #endif e_rsfe() { int n; n=en_fio(); fmtbuf=NULL; return(n); } c_sfe(a) register cilist *a; /* check */ { register unit *p; lunit=getunit(a->ciunit); if (lunit > MXUNIT) lunit=setunit(lunit); if (not_legal(lunit)) err(a->cierr,101,"startio") p = &units[lunit]; if(p->ufd==NULL && fk_open(SEQ,FMT,a->ciunit)) err(a->cierr,114,"sfe") if(!p->ufmt) err(a->cierr,102,"sfe") return(0); } e_wsfe() { return(e_rsfe()); } E 1 h35277 s 00001/00001/00082 d D 4.3 87/05/13 18:18:07 build 6 5 c removed old SCCS strings and inserted #ident BB e s 00000/00000/00083 d D 4.2 87/02/17 09:42:23 mth 5 4 c rolled rev to -r4 (mth) e s 00000/00000/00083 d D 4.1 87/02/17 09:11:00 mth 4 3 c rolled rev to -r4 (mth) e s 00000/00000/00083 d D 3.1 87/01/21 17:22:15 mkm 3 2 c e s 00000/00000/00083 d D 2.1 87/01/21 17:21:06 mkm 2 1 c e s 00083/00000/00000 d D 1.1 87/01/21 17:12:25 mkm 1 0 c Placed under source control - mkm c These files are direct descendants of the ROS files c by the same name at or about ROS rev 1.3 e u U f b f n t T I 1 D 6 /* "%W% %E%" */ E 6 I 6 #ident " %W% %E% " E 6 #include "fio.h" extern int reclen; long recloc; s_rsue(a) cilist *a; { int n; if(!init) f_init(); if(n=c_sue(a)) return(n); reading=1; recpos=0; if(curunit->uwrt) (void) nowreading(curunit); if(checkmode(READING)) return(119); if(fread((char *)&reclen,sizeof(int),1,cf) != 1) { if(feof(cf)) { curunit->uend = 1; err(a->ciend, EOF, "start"); } clearerr(cf); err(a->cierr, errno, "start"); } return(0); } s_wsue(a) cilist *a; { int n; register int i; if(!init) f_init(); if(n=c_sue(a)) return(n); reading=0; reclen=0; if(!curunit->uwrt) (void) nowwriting(curunit); if(checkmode(WRITING)) return(119); recloc=ftell(cf); i = (long) sizeof(int); if (i <= cf->_cnt) { cf->_cnt -= i; cf->_ptr += i; } else (void) fseek(cf,(long)sizeof(int),1); return(0); } c_sue(a)register cilist *a; { lunit=getunit(a->ciunit); if (not_legal(lunit)) err(a->cierr,101,"startio"); external=sequential=1; formatted=0; curunit = &units[lunit]; elist=a; if(curunit->ufd==NULL && fk_open(SEQ,UNF,a->ciunit)) err(a->cierr,114,"sue"); cf=curunit->ufd; if(curunit->ufmt) err(a->cierr,103,"sue") if(!curunit->useek) err(a->cierr,103,"sue") return(0); } e_wsue() { long loc; (void) fwrite((char *)&reclen,sizeof(int),1,cf); loc=ftell(cf); (void) fseek(cf,recloc,0); (void) fwrite((char *)&reclen,sizeof(int),1,cf); (void) fseek(cf,loc,0); return(0); } e_rsue() { register int i; i = reclen - recpos +sizeof(int); if ( i <= cf->_cnt) { cf->_cnt -= i; cf->_ptr += i; } else (void) fseek(cf,(long)(reclen-recpos+sizeof(int)),1); return(0); } E 1 h54878 s 00001/00001/00042 d D 4.3 87/05/13 18:18:23 build 6 5 c removed old SCCS strings and inserted #ident BB e s 00000/00000/00043 d D 4.2 87/02/17 09:42:27 mth 5 4 c rolled rev to -r4 (mth) e s 00000/00000/00043 d D 4.1 87/02/17 09:11:03 mth 4 3 c rolled rev to -r4 (mth) e s 00000/00000/00043 d D 3.1 87/01/21 17:22:16 mkm 3 2 c e s 00000/00000/00043 d D 2.1 87/01/21 17:21:07 mkm 2 1 c e s 00043/00000/00000 d D 1.1 87/01/21 17:12:26 mkm 1 0 c Placed under source control - mkm c These files are direct descendants of the ROS files c by the same name at or about ROS rev 1.3 e u U f b f n t T I 1 D 6 /* "%W% %E%" */ E 6 I 6 #ident " %W% %E% " E 6 #include "fio.h" int reclen; do_us(number,ptr,len) register ftnint *number; register ftnlen len; register char *ptr; { if(reading) { recpos += *number * len; if(recpos>reclen) { err(elist->cierr,110,"eof/uio"); } (void) fread(ptr,(int)len,(int)(*number),cf); return(0); } else { reclen += *number * len; (void) fwrite(ptr,(int)len,(int)(*number),cf); return(0); } } do_uio(number,ptr,len) register ftnint *number; register ftnlen len; register char *ptr; { if(sequential) return(do_us(number,ptr,len)); else return(do_ud(number,ptr,len)); } do_ud(number,ptr,len) register ftnint *number; register ftnlen len; register char *ptr; { recpos += *number * len; if(recpos > curunit->url && curunit->url!=1) err(elist->cierr,110,"eof/uio"); if(reading) { if(fread(ptr,(int)len,(int)(*number),cf) != *number) err(elist->cierr,27,"eof/uio") else return(0); } (void) fwrite(ptr,(int)len,(int)(*number),cf); return(0); } E 1 h42009 s 00001/00001/00045 d D 4.3 87/05/13 18:20:16 build 6 5 c removed old SCCS strings and inserted #ident BB e s 00000/00000/00046 d D 4.2 87/02/17 09:42:30 mth 5 4 c rolled rev to -r4 (mth) e s 00000/00000/00046 d D 4.1 87/02/17 09:11:06 mth 4 3 c rolled rev to -r4 (mth) e s 00000/00000/00046 d D 3.1 87/01/21 17:22:16 mkm 3 2 c e s 00000/00000/00046 d D 2.1 87/01/21 17:21:08 mkm 2 1 c e s 00046/00000/00000 d D 1.1 87/01/21 17:12:26 mkm 1 0 c Placed under source control - mkm c These files are direct descendants of the ROS files c by the same name at or about ROS rev 1.3 e u U f b f n t T I 1 D 6 /* "%W% %E%" */ E 6 I 6 #ident " %W% %E% " E 6 #include #include "fio.h" #include "units.h" /* map logical unit number to physical unit number */ UNITMAP unitmap[HIUNIT] = {0,0,0,0,0,5,6}; /* keep track of available unit numbers */ int avunit[MXUNIT] = {0,0,0,0,0,5,6}; setunit(n) register int n; { register int i; if ( (n==STDOUT) || (n==STDIN) || (n==STDERR) ) return(n); if ((n >= HIUNIT) || (n<0)) return (n); if ((i=unitmap[n]) != 0) return(i); /* return next available physical unit number, and map the * logical number (n) to the physical number */ for (i=1; i= HIUNIT) || (n < 0)) return(n); return((unitmap[n] == 0) ? setunit(n) : unitmap[n]); } E 1 h09103 s 00001/00001/00018 d D 4.3 87/05/13 18:20:30 build 6 5 c removed old SCCS strings and inserted #ident BB e s 00000/00000/00019 d D 4.2 87/02/17 09:42:34 mth 5 4 c rolled rev to -r4 (mth) e s 00000/00000/00019 d D 4.1 87/02/17 09:12:21 mth 4 3 c rolled rev to -r4 (mth) e s 00000/00000/00019 d D 3.1 87/01/21 17:22:17 mkm 3 2 c e s 00000/00000/00019 d D 2.1 87/01/21 17:21:09 mkm 2 1 c e s 00019/00000/00000 d D 1.1 87/01/21 17:12:27 mkm 1 0 c Placed under source control - mkm c These files are direct descendants of the ROS files c by the same name at or about ROS rev 1.3 e u U f b f n t T I 1 D 6 /* "%W% %E%" */ E 6 I 6 #ident " %W% %E% " E 6 #define UNITMAP unsigned char #define HIUNIT 1000 /* for unitmap stuff */ #define STDIN 5 #define STDOUT 6 #define STDERR 0 /* map logical unit number to physical unit number */ extern UNITMAP unitmap[HIUNIT]; /* keep track of available unit numbers */ extern int avunit[MXUNIT]; #define disconnect(n) \ { if ((n != STDOUT) && (n != STDIN) && (n != STDERR)) { \ unitmap[avunit[n]] = 0; \ avunit[n] = 0; \ } \ } E 1 h52064 s 00001/00001/00038 d D 4.3 87/05/13 18:21:08 build 6 5 c removed old SCCS strings and inserted #ident BB e s 00000/00000/00039 d D 4.2 87/02/17 09:42:38 mth 5 4 c rolled rev to -r4 (mth) e s 00000/00000/00039 d D 4.1 87/02/17 09:11:11 mth 4 3 c rolled rev to -r4 (mth) e s 00000/00000/00039 d D 3.1 87/01/21 17:22:18 mkm 3 2 c e s 00000/00000/00039 d D 2.1 87/01/21 17:21:10 mkm 2 1 c e s 00039/00000/00000 d D 1.1 87/01/21 17:12:27 mkm 1 0 c Placed under source control - mkm c These files are direct descendants of the ROS files c by the same name at or about ROS rev 1.3 e u U f b f n t T I 1 D 6 /* "%W% %E%" */ E 6 I 6 #ident " %W% %E% " E 6 #include #include #include #include "fio.h" #define DIRSIZE 14 g_char(a,alen,b) register char *a,*b; ftnlen alen; { char *x=a+alen-1,*y=b+alen-1; *(y+1)=0; for(;x>=a && *x==' ';x--) *y--=0; for(;x>=a;*y--= *x--); } b_char(a,b,blen) register char *a,*b; ftnlen blen; { register int i; for(i=0;iy) for(;num>0;num--) *y++= *x++; else for(num--;num>=0;num--) *(y+num)= *(x+num); } else { register char *x=a,*y=b; if(x>y) for(;num>0;num--) *y++= *x++; else for(num--;num>=0;num--) *(y+num)= *(x+num); } } E 1 h23985 s 00001/00001/00321 d D 4.3 87/05/13 18:21:23 build 6 5 c removed old SCCS strings and inserted #ident BB e s 00000/00000/00322 d D 4.2 87/02/17 09:42:42 mth 5 4 c rolled rev to -r4 (mth) e s 00000/00000/00322 d D 4.1 87/02/17 09:11:14 mth 4 3 c rolled rev to -r4 (mth) e s 00000/00000/00322 d D 3.1 87/01/21 17:22:20 mkm 3 2 c e s 00000/00000/00322 d D 2.1 87/01/21 17:21:11 mkm 2 1 c e s 00322/00000/00000 d D 1.1 87/01/21 17:12:28 mkm 1 0 c Placed under source control - mkm c These files are direct descendants of the ROS files c by the same name at or about ROS rev 1.3 e u U f b f n t T I 1 D 6 /* "%W% %E%" */ E 6 I 6 #ident " %W% %E% " E 6 #include "fio.h" #include "fmt.h" extern int cursor; extern char *icvt(), *ecvt(); mv_cur() { /*buggy, could move off front of record*/ for(;cursor>0;cursor--) (*putn)(' '); if(cursor<0) { if(cursor+recpos<0) err(elist->cierr,110,"left off"); /* if(curunit->useek) (void) fseek(cf,(long)cursor,1); else err(elist->cierr,106,"fmt"); cursor=0; */ for (;cursor<0;cursor++) (*back)(); } return(0); } w_ed(p,ptr,len) register char *ptr; register struct syl *p; register ftnlen len; { if(mv_cur()) return(mv_cur()); switch(p->op) { default: fprintf(stderr,"w_ed, unexpected code: %d\n%s\n", p->op,fmtbuf); abort(); case I: return(wrt_I((uint *)ptr,p->p1,len, 10)); case IM: return(wrt_IM((uint *)ptr,p->p1,p->p2,len)); #ifdef EXTSEMS case O: return(wrt_Ix((uint *)ptr, p->p1, p->p2, len, 8)); case Z: return(wrt_Ix((uint *)ptr, p->p1, p->p2, len, 16)); #else case O: return(wrt_I((uint *)ptr, p->p1, len, 8)); #endif case L: return(wrt_L((uint *)ptr,p->p1, len)); case A: return(wrt_A(ptr,len)); case AW: return(wrt_AW(ptr,p->p1,len)); case D: case E: case EE: return(wrt_E((ufloat *)ptr,p->p1,p->p2,p->p3,len,(p->op == D ?'d':'e'))); case G: case GE: return(wrt_G((ufloat *)ptr,p->p1,p->p2,p->p3,len)); case F: return(wrt_F((ufloat *)ptr,p->p1,p->p2,len)); } } w_ned(p) register struct syl *p; { switch(p->op) { default: fprintf(stderr,"w_ned, unexpected code: %d\n%s\n", p->op,fmtbuf); abort(); case SLASH: return((*donewrec)()); case T: cursor = p->p1-recpos - 1; return(1); case TL: cursor -= p->p1; return(1); case TR: case X: cursor += p->p1; return(1); case APOS: return(wrt_AP(p->p1)); case H: return(wrt_H(p->p1,p->p2)); } } #ifdef EXTSEMS wrt_Ix(ui,w,m,len, base) uint *ui; ftnlen len; register int base; { int ndigit,sign,spare,i,n; int xsign; char *ans; ans=icvt_oz((char *)ui,len,&ndigit,&sign, base); if(sign || cplus) xsign=1; else xsign=0; if(ndigit+xsign>w || m+xsign>w) { for(i=0;i=m) spare=w-ndigit-xsign; else spare=w-m-xsign; for(i=0;iis; else if(len == sizeof(char)) x = n->ic; else x=n->il; ans=icvt(x,&ndigit,&sign, base); spare=w-ndigit; if(sign || cplus) spare--; if(spare<0) for(i=0;iis; else if(len == sizeof(char)) x = n->ic; else x=n->il; ans=icvt(x,&ndigit,&sign, 10); if(sign || cplus) xsign=1; else xsign=0; if(ndigit+xsign>w || m+xsign>w) { for(i=0;i=m) spare=w-ndigit-xsign; else spare=w-m-xsign; for(i=0;iis; else if(sz == sizeof(char)) x = n->ic; else x=n->il; for(i=0;i 0) (*putn)(*p++); return(0); } wrt_AW(p,w,len) register char * p; register ftnlen len; { while(w>len) { w--; (*putn)(' '); } while(w-- > 0) (*putn)(*p++); return(0); } wrt_E(p,w,d,e,len,fexpde) register ufloat *p; register ftnlen len; char fexpde; { char *s; int dp,sign,delta; register int i; char *ecvt(); if(scale>0) d++; s=ecvt( (len==sizeof(float)?p->pf:p->pd) ,d,&dp,&sign); i=dp; if (i<0) i = -dp; if(e>0) delta=3+e; else { delta=5; if(len != sizeof(float)) if(i>99) delta++; } if(sign || cplus) delta++; if(w9) { for(i=0;i -d) { (*putn)('.'); for(i=0;i<-scale;i++) (*putn)('0'); for(i=0;i0 && scalepf != 0) dp -= scale; else dp = 0; if(dp <= 308 && dp > -307) if(fexpde=='d') (*putn)('d'); else (*putn)('e'); if(dp<0) { (*putn)('-'); dp = -dp; } else (*putn)('+'); if(e>0) if((e==1 && dp>9) || (e==2 && dp>99)) { for (i=0;i=3 || dp >= 100) { (*putn)(dp/100 + '0'); dp = dp % 100; } if(e!=1) (*putn)(dp/10+'0'); (*putn)(dp%10+'0'); return(0); } wrt_G(p,w,d,e,len) register ufloat *p; register ftnlen len; { double up = 1,x; int oldscale=scale,n; register int i,j; x= len==sizeof(float)?p->pf:p->pd; if(x < 0 ) x = -x; if(x<.1) return(wrt_E((ufloat *)p,w,d,e,len,'e')); for(i=0;i<=d;i++,up*=10) { if(x>up) continue; scale=0; if(e==0) n=4; else n=e+2; i=wrt_F(p,w-n,d-i-1,len); for(j=0;jpf:p->pd); if(scale) { if(scale>0) for(i=0;i=d) sign=0; if(sign || cplus) delta=2; else delta=1; n= w - (d+delta+(dp>0?dp:0)); if(n<0) { for(i=0;icifmt; curunit = &units[lunit]; /*lunit : voir c_sfe*/ cf=curunit->ufd; if(pars_f(fmtbuf)<0) err(a->cierr,100,"startio"); if(checkmode(WRITING)) return(119); putn= x_putc; back = x_back; doed= w_ed; doned= w_ned; doend=xw_end; dorevert=xw_rev; donewrec=x_wSL; fmt_bg(); cplus=0; cblank=curunit->ublnk; if(!curunit->uwrt) (void) nowwriting(curunit); return(0); } x_putc(c) register int c; { if(c=='\n') recpos = cursor = 0; else recpos++; if (c) putc(c,cf); return(0); } x_back() { recpos--; } pr_put(c) { static flag new = 1; recpos++; if(c=='\n') { new=1; putc(c,cf); } else if(new==1) { new=0; if(c=='0') putc('\n',cf); else if(c=='1') putc('\f',cf); } else putc(c,cf); } x_wSL() { (*putn)('\n'); recpos=0; cursor = 0; return(1); } xw_end() { if(nonl == 0) (*putn)('\n'); return(0); } xw_rev() { if(workdone) (*putn)('\n'); return(workdone=0); } E 1 #ident " @(#)fio.h 4.3 87/05/13 " #include typedef long ftnint; typedef ftnint flag; typedef long ftnlen; /*external read, write*/ typedef struct { flag cierr; ftnint ciunit; flag ciend; char *cifmt; ftnint cirec; } cilist; /*internal read, write*/ typedef struct { flag icierr; char *iciunit; flag iciend; char *icifmt; ftnint icirlen; ftnint icirnum; } icilist; /*open*/ typedef struct { flag oerr; ftnint ounit; char *ofnm; ftnlen ofnmlen; char *osta; char *oacc; char *ofm; ftnint orl; char *oblnk; char *omode; } olist; /*close*/ typedef struct { flag cerr; ftnint cunit; char *csta; } cllist; /*rewind, backspace, endfile*/ typedef struct { flag aerr; ftnint aunit; } alist; /*units*/ typedef struct { FILE *ufd; /*0=unconnected*/ char *ufnm; long uinode; int url; /*0=sequential*/ flag useek; /*true=can backspace, use dir, ...*/ flag ufmt; flag uprnt; flag ublnk; flag uend; flag uwrt; /*last io was write*/ flag uscrtch; int umode; /* opening mode = RM,WM or RWN */ } unit; typedef struct { flag inerr; ftnint inunit; char *infile; ftnlen infilen; ftnint *inex; /*parameters in standard's order*/ ftnint *inopen; ftnint *innum; ftnint *innamed; char *inname; ftnlen innamlen; char *inacc; ftnlen inacclen; char *inseq; ftnlen inseqlen; char *indir; ftnlen indirlen; char *infmt; ftnlen infmtlen; char *inform; ftnint informlen; char *inunf; ftnlen inunflen; ftnint *inrecl; ftnint *innrec; char *inblank; ftnlen inblanklen; } inlist; extern int errno; extern flag init; extern cilist *elist; /*active external io list*/ extern flag reading,external,sequential,formatted; extern int (*getn)(),(*putn)(); /*for formatted io*/ extern int (*back)(); extern FILE *cf; /*current file*/ extern unit *curunit; /*current unit*/ extern int lunit; /*current logical unit*/ extern unit units[]; #define err(f,n,s) {if(f) errno= n; else fatal(n,s); return(n);} #define not_legal(u) (u>=MXUNIT || u<0) /*Table sizes*/ #define MXUNIT _NFILE extern int recpos; /*position in current record*/ #define RM 1 #define WM 2 #define RWM 3 #define READING 10 #define WRITING 11 #define WRITE 1 #define READ 2 #define SEQ 3 #define DIR 4 #define FMT 5 #define UNF 6 #define EXT 7 #define INT 8 #ident " @(#)units.h 4.3 87/05/13 " #define UNITMAP unsigned char #define HIUNIT 1000 /* for unitmap stuff */ #define STDIN 5 #define STDOUT 6 #define STDERR 0 /* map logical unit number to physical unit number */ extern UNITMAP unitmap[HIUNIT]; /* keep track of available unit numbers */ extern int avunit[MXUNIT]; #define disconnect(n) \ { if ((n != STDOUT) && (n != STDIN) && (n != STDERR)) { \ unitmap[avunit[n]] = 0; \ avunit[n] = 0; \ } \ } #ident " @(#)fmt.h 4.3 87/05/13 " struct syl { int op,p1,p2,p3; }; #define RET 1 #define REVERT 2 #define GOTO 3 #define X 4 #define SLASH 5 #define STACK 6 #define I 7 #define ED 8 #define NED 9 #define IM 10 #define APOS 11 #define H 12 #define TL 13 #define TR 14 #define T 15 #define COLON 16 #define S 17 #define SP 18 #define SS 19 #define P 20 #define BN 21 #define BZ 22 #define F 23 #define E 24 #define EE 25 #define D 26 #define G 27 #define GE 28 #define L 29 #define A 30 #define AW 31 #define O 32 #define NONL 33 #define Z 34 #define Q 35 extern struct syl syl[]; extern int pc,parenlvl,revloc; extern int (*doed)(),(*doned)(); extern int (*dorevert)(),(*donewrec)(),(*doend)(); extern flag cblank,cplus,workdone, nonl; extern int dummy(); extern char *fmtbuf; extern int scale; typedef union { float pf; double pd; } ufloat; typedef union { short is; char ic; long il; } uint; #define GET(x) if((x=(*getn)())<0) return(x) #define VAL(x) (x!='\n'?x:' ') #define PUT(x) (*putn)(x) extern int cursor; ! / 548426376 0 0 0 2648 ` .....::D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D WWWWWWWWWWWWWWWWWWWWWWW~J~Jbbbbbbbbbbbbbbbbbbttttttttt......................5555555M8M8M8M8M8M8M8M8M8M8M8j|oHoHoHoHoH{${${${$""""jȼȼȼȼȼȼȼ_f_back_f_clos_f_exit_flush__s_rdfe_c_dfe_y_getc_y_back_y_rnew_y_err_s_wdfe_y_putc_y_wnew_e_rdfe_e_wdfe_icnum_s_rdue_c_due_s_wdue_e_rdue_e_wdue_f_end_t_runc_fatal_F_err_elist_curunit_lunit_fmtbuf_reading_sequential_formatted_external_f_init_units_init_canseek_nowreading_nowwriting_getn_putn_back_cf_recpos_fortfile_fortlfile_cplus_cblank_doed_doned_doend_donewrec_dorevert_cursor_scale_pars_f_pc_revloc_parenlvl_f_s_op_gen_f_list_i_tem_ne_d_e_d_gt_num_ap_end_syl_en_fio_do_fio_type_f_cp_cnt_workdone_rp_ret_nonl_fmt_bg_icvt_icvt_oz_z_getc_icptr_icend_svic_z_putc_z_back_z_rnew_icnum_z_rnew1_z_rnewdor_s_rsfi_c_si_s_wsfi_z_wnewdor_z_wnew_e_rsfi_e_wsfi_y_ierr_f_inqu2_f_inqu_s_wsle_t_putc_l_write_e_wsle_lwrt_I_lwrt_L_lwrt_A_lwrt_F_lwrt_C_t_getc_e_rsle_l_read_lquit_lcount_ltype_l_first_l_comma_l_R_l_C_l_L_l_CHAR_lx_ly_lchar_lr_comm_rd_int_ltab_s_rsle_c_le_lioproc_do_lio_nio_read_nio_lcount_nio_ltype_l_comma_niol_R_niol_C_niol_L_niol_CHAR_nio_lx_nio_ly_nio_lchar_niord_int_s_rsne_tabind_c_nle_getword_lastchar_findit_getvar_flagtabchar_recupind_s_wsne_f_setlfnflag_lfn_flag_f_setl_f_open_isdev_fk_open_checkmode_rd_ed_rd_I_rd_Ix_rd_L_rd_A_rd_AW_rd_F_rd_Q_rd_ned_rd_POS_rd_H_f_rew_s_rsfe_x_getc_x_endp_xrd_SL_x_rev_howmany_pos_e_rsfe_c_sfe_e_wsfe_s_rsue_c_sue_s_wsue_recloc_e_wsue_e_rsue_do_us_reclen_do_uio_do_ud_setunit_unitmap_avunit_getunit_g_char_b_char_inode_mvgbt_getfp__getfd__f7flsh__mv_cur_w_ed_wrt_I_wrt_IM_wrt_Ix_wrt_L_wrt_A_wrt_AW_wrt_E_wrt_G_wrt_F_w_ned_wrt_AP_wrt_H_s_wsfe_x_putc_x_back_xw_end_xw_rev_x_wSL_pr_putbackspace.o/ 548426117 98 100 100664 1760 ` u Qh.text# .datah\@.bss88xDH~P @2 eeeP0߀D)t2 rrJr  "p 4 jj j$ @ pq pq 6D!l8t!Z.t"(!B.p  p  p 8*'T tT0 $8.t!j! Վp Ht, ,l X~PɎHǮDxxW @(#)backspace.c 4.3 87/05/13 @(#)fio.h 4.3 87/05/13 backspacebackspacebackspacebackspace$.H V\ hjt v z |       4<P x Df  .text#.datah.bss8_f_backnX_getunitnX_lunitnX_errnonX_fatalnX_unitsnX_fk_opennX_ftellnX_t_runcnXnX_fseeknX_freadnX_nowreadingclose.o/ 548426123 98 100 100664 1806 ` u QH.text% .dataX4@.bss@~8@ 0p  f d(d(4D(*D( K! k!$ :. " `*&"pp  ~`*&"pp(i~8@@WP8~@DpހLHD0p@~@Ɏ8PPW@~8p ~0p@~8@@W @(#)close.c 4.4 87/05/13 @(#)fio.h 4.3 87/05/13 @(#)units.h 4.3 87/05/13 &8:D F J L      ,@ DFVt   r t .text%.dataX.bss_f_closm_getunitm_lunitm_unitsm_t_runcm_fclosem_abortm_freem_avunitm_unitmapmm_getenvm_unlinkm_f_exitm_flush_dm_fflushm_lfn_flagdfe.o/ 548426132 98 100 100664 5524 ` u Q:.textX| .dataXX@.bss@~<p P$ ¶T2dd*d$ w~<@@W@~<p <$ B@2ddd$ w~<@@W0 Г00W0 Г00W@~<ppB@2eeē e$0F'҆4hhh2ff^fx2hh"h< "   ~<@@W8  !  B`   n d   4Г88W8 `  \$  !T^111 8nnn88WW8nnn88W@ 8!"  D@@W8 ȧ~4 Jp W ~488W @(#)dfe.c 4.3 87/05/13 @(#)fio.h 4.3 87/05/13 @(#)fmt.h 4.3 87/05/13 startiostartwrtdfedfedfestartchkreadingddoutdfe"8 : B R ^jnpvz|*,6L N V f!r#~$$%%:(^(*+,-./0122233 04FV\h j t5    556  D F X5Z5l5n5t7|5~5..  ...55  - - "(.24V.X.\ ^ h.p.r.5555855--$.&...D-F-Xfl  9995560.   ##   .".*9,949<0D..textX.dataX.bss_s_rdfeux_initux_f_initux_c_dfexux_curunitux_readinguxux_y_getc<ux_getnux_y_back$ux_backux_rd_edux_doedux_rd_nedux_donedux_y_rnewuxux_doendux_y_err<uxux_fmtbufux_pars_fux_errnoux_fatalux$ux_fmt_bgux_s_wdfeux/ux_y_putcLux_putnux_w_edux_w_nedux_y_wnewux_e_rdfe0ux_en_fioux_e_wdfeTux;uxGuxQux_elistux_recposux_scaleux_cursorux_getunitux_lunitux_unitsux_fk_openux_cfux_fseekux__filbufux__flsbufux_icnumux\_nowreading_dorevert_donewrec_checkmode_nowwriting_sequential_external_formatteddue.o/ 548426137 98 100 100664 2948 ` u Q .textT .data`l@.bss@@8 > w$ 88W8^ > jw$ D88W@~<p @2eee|0pH't4hhFh2fff2hh$hp2rr,r4!  \ ~<@@W@~<   ! $$ !p 8ȶ8bȋ~<@@W0 Г00W @(#)due.c 4.3 87/05/13 @(#)fio.h 4.3 87/05/13 duestartiocduecduecduesyserr(0 D F V      .4DLRZ^`jlr x    ,:@L N hv|        (*< > FHLNX\ ^ bdjxz.textT.data`.bss@_s_rduep_c_duep_readingpp_curunitpp_s_wdueppp_initp_f_initp_getunitp_lunitp_errnop_fatalp'p2p_recposp>p_unitsp_elistp_fk_openp_cfp_fseekp_e_rduep_ftellp_e_wduepH_checkmode_nowreading_nowwriting_formatted_sequential_externalendfile.o/ 548426143 98 100 100664 2364 ` u Q.text(D5 .data((@.bssH~@@2ee`e0pD(|2rrhRr6  "$  ~@HHWHP~X p"p  \|$ zΐ\l\x\ J\4</ooo~XɎPɮHW @(#)endfile.c 4.3 87/05/13 @(#)fio.h 4.3 87/05/13 endfileendfilecpcpwtmp.FXXXXXX/bin/cp/usr/bin/cpno cp endfileendfile&@ NT `bl n r t     0BNrx  &0:FPZ^`flt~    .text(5.data(.bss_f_endp_getunitp_lunitp_errnop_fatalp_unitsp_fk_openpp_t_runcp_ftellp_fseekp_strcpyp_mktempp_fopenp_freadp_fwritep_fflushp_forkp_execlp__iobp_fprintfp_exitp_waitp_fclosep_unlinkp_nowreadingerr.o/ 548426150 98 100 100664 4966 ` u Q3.textd .data` @.bssXXP0!~Ld0ڋ^ P@0 p$p1P |0L0p! 0 H   ܋ 0 0  @ @$ (ħN,ztn~LPPW8 ȧ~4p $pX$p  *$~488W`~<p @Fz r ~<``WH~@p$.  '0  ~@HHWH<~@p$ ~ǗǗ' X \(p(p( x 4 LLL 0 2L 0L' 0Lp  0  l L q"r R qLLpq  0L* 08 0"qx~HɎ@PPWhDH~PpXhXp 0'qQ(A1(20>!p""W"q( 0Z(#p""`W"z!"\p\.q`p `E2e* \.`06qdpp \.`>dp\8p\V.q`p `\.` 0`\p\.q`p `\.`"0# 0\pp\ 0‹zqg 0(:9(.\p\6 0j" 0V\p\.q`p `\.`0\p\.q`\p `\.`0`\(n\p`D. 0n&q`\.`p 0H x~PɞHǾDhhWP<@~Hs`p߰," { ~Hɞ@Ǿ<PPW A~r09   !8 (2 0("  !r ~ǞW@<< @@WX?@H~Ppp pW !'0 @pdd`BdWT`p"Wp0+W8 D F J L l ~                         " * 8  :  D F N P T! V! ^ f" x z                     # # # &$ * , 4 < > F H P ` d# f# n# r t | # # # $ $   #    " " % %    &$&.8:@'HT'XZbr(vx))+#"$:@DHLPTX\`hlptx|  $(,048<@DHLPTX`dhlptx|  $(,04hlptx|.text.data.bss_pars_f~_pc~_revloc~~_f_sT~_op_gen ~_f_list~_i_tem~_ne_dl~_e_d~_gt_num P~_ap_end|~_syl~_fmtbuf~__iob~_fprintf~_abort~_en_fio ~_do_fio ~_type_f$~_elist~_errno~_fatal~_doned~_cp~_cnt(~_doend~_doed~~_rp~_ret(~~_nonl~_cplus~_scale~_cblank~_fmt_bg~_cursor~"_parenlvl_workdone_dorevertfmtlib.o/ 548426172 98 100 100664 1244 ` u Q .text@< .data@@p@.bssx@@~8s@b@<@@*` b$0<; 0@1!@ ~8@@WX<@Hѩ~Pύ  p @Hs tp01 d08  R 1 pc Gt`  p c H00  1!0   ~PɞHɾ@<XXW @(#)fmtlib.c 4.3 87/05/13 21474836480123456789abcdef** impossible conversion : too long **@HNZz^djpv .text@.data@p.bssx_icvtm _strcpym _icvt_ozm _strlenm iio.o/ 548426180 98 100 100664 4855 ` u Q4.text$ .data@.bss8(2`l6nnhRn88W8 (8nnpnr :nnxn88WW W0 Г00W W8  d`l088W8~ `\x88W@~<p h4dd:dx,pp ~<@@W W W0 Г00W0 Г  B 00W8nnn88W @(#)iio.c 4.3 87/05/13 @(#)fio.h 4.3 87/05/13 @(#)fmt.h 4.3 87/05/13 endfilerecendinwriterecendstartintiio" $ 4 @F P R \ ` b npz           ( , . :<FT V h v|       , . 24<DFT\ !!$("*"0<#HT`h&'  ()*+,-./  &8:Bdfp| ~           *14&V1Z \ f&np     ,,  .text.data.bss_z_getcr_icptrr_icendr_svicr_errnor_fatalr_recposr_z_putcr_z_backr_z_rnewr_icnumr_cursorr_z_rnew1r,r_s_rsfilr_c_sir_readingr_rd_edr_doedr_rd_nedr_donedr_getnr_backrr_doendrr_s_wsfir_w_edr_w_nedr_putnr#r_z_wnew`r_fmtbufr_pars_fr_fmt_bgr.r9rEr_elistr_scaler_cplusr_cblankr_e_rsfi r_en_fior_e_wsfiLr_y_ierrrO_z_rnewdor_dorevert_donewrec_z_wnewdor_formatted_sequential_external inquire.o/ 548426191 98 100 100664 4258 ` u Q.text  \ .data   @.bss ( (H<~@p' .H0 NH@ VHA!A 1HAHH !(HVHH<H20 !0@8@0߀0 0 g`0 ^2$0p0 g `> '$Hԋ$' 7$#(`D@8 ', (', f0D &0'4 |80'4 x8T H&8'< t8'< p@`>"'D @'D H'L lhPB $P'T h:P'T "X \`,( ( ``D@8'd `'d ~@Ǟ<HHWH<~@p' .HJ0 NH@ VHA!A 1HAHH !(HHHH0 !0@8f@0߀0 0 g`0 ^2$0p0 g `> '$HL$' 7$#((`D@8 ', (', 0D &0'4 ܓ0'4 ؓ8T H~&8'< ԓX8'< Г>@`>"'D @'D H'L ̓PB $P'T ȓP'T X  \`,(  B C D E F G H I J K L M N O P Q R S T Ub( ``D@8'd $`'d  ~@Ǟ<HHW @(#)inquire.c 4.4 87/05/13 @(#)fio.h 4.3 87/05/13 @(#)units.h 4.3 87/05/13 yesyesnoyesnoyesdirectsequentialformattedunformattedunknownzeronullyesyesnoyesnoyesdirectsequentialformattedunformattedunknownzeronull0      0 2   .R|"6<^dzPVjp$&4 N X b d    < > PR $LRfl"JPbh.text \.data .bss (_f_inqu2w(_g_charw(w(_getenvw(_strcpyw(_inodew(_unitsw(_getunitw(_lunitw(_avunitw(_b_charw(_isdevw(_ftellw(_f_inquw(_lfn_flaglio.o/ 548426200 98 100 100664 3197 ` u Q #.text4 .data $ @.bss((8 ȧ~4p Np$~488W8 "88W8 $  !&111 88WP ~@DD  P! D~Dq$~@PPW@X.`P X$@@W@4~8 P  tp`q~8Ǟ4@@WH`.h` 0: 2 ?0: R @$0: D P `(8PP (k`,)3HHWP@~HrP 4 "(.{ ,.{)~Hɞ@PPWhHPX~`qVXVQ^d,pWz ԋ' e d743''3e#4(|783d#4(pT^dP*zp ~`ɎXɮPHhhW @(#)lio.c 4.3 87/05/13 @(#)fio.h 4.3 87/05/13 @(#)fmt.h 4.3 87/05/13 @(#)lio.h 4.3 87/05/13 %ldV`l|Dunknown type in lio"* 8 : B J P \hxX^hln,.H &.N |~@LR" .text4.data .bss(_s_wslep_initp_f_initp_c_lep_curunitp_readingppp_t_putcp_putnp_l_writep_lioprocpp_e_wslep_recposp_cfp__flsbufp_lwrt_IDp_sprintfp_strlenp_lwrt_Lp_wrt_Lp_lwrt_Ap_lwrt_Fp_scalep_wrt_Fp_wrt_Ep_lwrt_Cdp_fatalp%_external_formatted_nowwriting lread.o/ 548426221 98 100 100664 11117 ` u Q'6.text<S .dataT& @.bss8 p‹ !   (   88W8 ȧ~4 p@ ~488WX<@H~PqVVҋ` X 2 h0  &D~! .*l(,`! &/!L ֋dd`p0WF <(     2`V  D  ,pXW0000$000p7`R7477078)  p ~PɞHɾ@<XXWh8~@ 0.H.P.Xp.`' `   0*.`qX? `XXp`0p 0. 0PzP f (HP( "H H fp"^X 0:2X^H 0:b%69 400 Pp?ހ5!P2H200 Xp?ހ5!X2.H9 :`9 :09 400 Pp?ހ5!P2,Hp@$9)400 P5!P2X 0:*Hp@$00 X5!X2X.P3X X2XX~@ɞ8hhWX8@H~PP^TB0 -2P^T(+P^Tp@$ :K57930@H@4 -"$ T 2 :  T~PɎHɮ@8XXW@~< `@p(,p/p~<@@WH~8h p(ހph@@0Tp *~  4pppp((z hp (:pp&p> p(2 v u t s r q p o n m l k j i h g f e d c b a ` _ ^ ] \ [ Z Y X W V U T S R Q P O N M L K J I H G F Ev. 0 LNT   ^ h j r v  x                 . 4 D F N V j t v ~              2 H J R V  X  j z             D F X d  f  z |       !            " 0 2 : B         &,>R`bj  !  .4DFNblnv  "(8<>H"T#^h j |$xz&&')*+," (8-hn.x/01200 334"(46@\jp,,048<@DHLPTX\`dhlptx|.textS.data.bss_t_getc_curunit_cf__filbuf_e_rsle_l_read_lquit_elist_errno_fatal_lcount_ltype_l_first_l_comma_ungetc_l_R_l_C 0_l_L 8_l_CHAR_lx_ly_lchar_b_char_lr_comm_rd_int_ltab(__ctype_fscanf_free_malloc_realloc_s_rsle_init_f_init_c_leX_reading_lioproc_fmtbuf_getunit_lunit_recpos_scale_units_fk_open_do_lio%_external_formatted_nowreading nio.o/ 548426258 98 100 100664 21904 ` u ROA.text&+L .data&& ',M)@.bss**`@HP~XqٶVYVR^\D 2'Ph0  &0^! *L,!@ tpp'Wb .H| 0   P N   2'X`V  D  '`0p'(W000^\P0$000p7`R7477078)  p ~XɎPɮH@``Wh 8~@HPXp`  ` 0*.`qX? `ZXp`0<pp'hrp.p^ 0. 0P:P  HP "H H fp"^X 0:2X^H 0:b%69 400 Pp?ހ5!P2H200 Xp?ހ5!X2.H9 :`9 :09 400 Pp?ހ5!P2,Hp@$9)400 P5!P2X 0:*Hp@$00 X5!X2X.P3X X2XX~@ɞ8hhWX8@H~PP^T0 -2P^T(+P^Tp@$ :K57930@H@4 -"$ nT 2 :  T~PɎHɮ@8XXWH~8 bހp@@0:pp'pp *  4'<pp'pZ|-p:pp'p |p\z$p &p (p (:pp'pBphpz,pHxpp'ȓJp<pzpz)p<pp'ԓp~8HHWH~8 FhpB@@0:pp'p“p *  <pp'pb(h2PP-p:pp(p p!.! p'f *@FH .T 4 t (? N lpx$p&pz6~8HHWX<@~H PP0:pp( ~p(p *:pp(86p|-:pp(@pn$ & X' "ΰ   pp(Xpp Π  <qq(dZqp  <! ! qՊz8 0 \}qq T  q h$h  ~Hɞ@Ǿ<XXWx<~@p)!p01 V $ LJ  !  d: 212 ! &B $4ss*s f 4zzFtzv 2ss**s,F1<4||*|F(xFF(0F(tF(p F  2{{FD{F62||*|~@ǎ<xxWH48~@qꤋ !  ހ@V !   & $ ހB = ( f馋 !  ( TN !  ~   Jڋ  q       ~@ɞ8Ǿ4HHWH8~@d( !  - p,   pp猋 !  - P6: \ :pp(pppԎl<pp(p0 ppзh<pp(>pppз.: $ppз̋  )  pp~@ɞ8HHW@~8q8  p ~8@@WX@~Hpǧ  >:pp)p8P :pp) Bp0p  p@1D$0<pp)0p(<pp)TrpPP PǗnTW3Qa1p(W$"!TT"TT$TpT$$TpT((TpTVg`&  P$` :pp)xp0$Z <pp)zp  $     P>yy*y`P:P*P691p0~Hɞ@XXW?hHP~Xp P  $ DLJ  ֋"!!! $ߐ$!!!$^ :"!!! ϸ "!!! =ޜ$!!!= ǐ  '*"!!!'Rڋ$!!! '݊"!!!' n,V` p)W!"b*!"b)!"z"b)ċ!"b)ܞ!"'"b*xZ!"b*R41'3'b(*#4&1b(*$#4!"b)۾z *<  *Db*4ۈj *T  *\b*LT6yy*d&ydb ,  ,*p~XɞPɾHW@~<p*xz@2ee*Be0pD'2ff*fN2gg*قg~<@@W @(#)nio.c 4.3 87/05/13 @(#)fio.h 4.3 87/05/13 @(#)fmt.h 4.3 87/05/13 @(#)lio.h 4.3 87/05/13 LLLLLhh <Xlist inlist inlist inbad repetition countbad repetition countlreadno starbad repetition countno (no commano )bad repetition countno starlreadbad repetition countbad repetition countno starbad repetition countno quoteno space$&&end$endbad dimensions for substringbad dimensionsbad dimensions for substring8dX8bad typebad dimensions for array elementbad dimensions for array elementbad dimensions for array elementbad dimensions for array elementbad dimensions for array element""# #H#l###$L$$(%c%ld%d%d0x%x%.6e%.16e(%.6e,%.6e)(%.16e,%.16e).%s.TRUEFALSE.%s.TRUEFALSEnamelist io $end namelist iostart namelist ionamelist ionamelist ionamelist read0DFR T d pv      "(*0F     , . : < D F LR V X ` b z ,.<>JLXZdhjv (\d f z    (<>F :<Bnpv$:B D X fl z            "  $  8  F L  X Z r                 " , . 8 : B N P V ^ h j                      2  B H  X                   & ( <  >  R  b h  t  v               Z j |             24<RZ \ p ~         (*BPV`blnv~  & 6< L PR\hr| ~   b!"" #$&.%4&:'@(P)dfxz** *0 D+b-z  ..    .4-DJ-Z`-pv-    @BVX^*hj*61@BTV\*df111*3  "(*02RTZ.11* (1*1H!J!R!VXnpv*    ! !!0 2 F V\ p!r!!    !!!!!!.06*@Bd!t!v!~!111-+!!,!.!: < P ^d !!    !!!!  . >D d f z    !!!!8!:!X!Z!p!r!!!!!!!11!!!!  ( 6< H!J!R!T!\ ^ r  !!!!!!!!11    06 D F d!p1""#'(%&5    " ,6 4 6 R T f h r6 | ~   7     6    !! !6!!!8!:!B7!F!H!Z!\!f6!p!r!!!!!6!!""" """(6"0"2"X"Z"l"n"x6"""8"""9##9#8#>9#^#d9##9##9##9$$9$>$D9$^$j$t$z9$$$$9$ $$ $$$7%8%+%*8%4%6%<%B7%x%~:%;%<% %% %=%>%<%<% %?%?%&@&$ &2&8 &D&F&P&l &z& '''' ''''' '$'(','0'4'8'<'@'D'H'L(((((((((())))))))))).text&.data& ).bss*00_curunit0_elist0_errno0_fatal00_l_comma0_t_getc0_cf0_ungetc0_ftell0_niol_R0_niol_C0_niol_L t0% 0_nio_lx0_nio_ly000_b_char0;0_ltab0__ctype0_free0_malloc0_realloc0_s_rsne0_tabind(0_init0_f_init0_c_nle%h0F0R0_reading0\0g0__filbuf0_strlen0_getword(0_strcmp0s0_findit0_getvar0}00_tolower0_s_wsne00__flsbuf0_fputs0_t_putc0_sprintf0_fmtbuf0_getunit0_lunit0_recpos0_scale0_units0_fk_open0_nio_read_nio_lcount_nio_ltype_niol_CHAR_nio_lchar_niord_int_sequential_external_formatted_nowreading_lastchar_flagtabchar_recupind_nowwritingopen.o/ 548426272 98 100 100664 5976 ` u R $&.text .data @ dd@.bss   W Wh<@~Hp@2ee `~e|g$0߀aA,g$w W,g$r R`$D$$w$W, ,B,6xx hrxp , g `"zZ "  0gf F  U(0N(2#p"" W"u(0n(#p"" 0W"2kk tJkH' .h,(x0zC$h `.h! A! z1!hzz$*.h*"!.h# ^(V\hhxhhnhX &> 46uu |uLHh4 | 4qq bq`\L(lh6 $ 4uu uTP Fh4 | l4qq :q8h$ h$Xh \4h$ h Xh Tl F"r4 HD,$ $nh P" "$4hh 4ll fldBB(h ē$hp^ 'R'RR hR' .h(p8g `(nN \' .h@h6`d\\ ~Hɞ@Ǿ<hhW@~Hr v'v'L~PvTvxX\  ܧ` ؋ ԧd hl ЧpLB~HɎ@WX8 .<   @ XXW8Ȏ 0,w pw4,,w Dw88W @(#)open.c 4.4 87/05/13 @(#)fio.h 4.3 87/05/13 rw+r+ropenopen mode=openopenopenno spaceopenopenno spaceopenopentmp.FXXXXXXr/wufdsattempt to readattempt to write  L V p ~   z  b  ^  , . 8 : @F J L ^n    2BT V ` b hn r t     $ & 0 4 6 RXlr       ( * 4 6 @ D F Xh    " ,6Jf! @ H J V `  b  n       # x% z%   % %        $ ( , 0 4 8 < @ D H L.text .data @.bss {0 {0_f_setl{0_f_open0{0_setunit{0_lunit{0_errno{0_fatal{0_units{0_strlen{0_g_char{0_strcpy{0_getenv{0_access{0_creat{0_close{0_malloc{0_isdev {0_fopen{0_fseek{0_canseek{0_inode{0_rewind{0_mktemp{0{0_sprintf{0'{0_f_clos{0_fk_open ({0_stat{01 l{0_curunit{0<_f_setlfnflag_lfn_flag_fortlfile_fortfile_checkmoderdfmt.o/ 548426290 98 100 100664 7431 ` u R2D".textPn .dataPPJ@.bssPD~Hp(W ٍh8nnؓznvW''8' P* Z# !p""W"'0 ܓ (:l (:V (8v (0` (lL  < ( ؋(' 8 Ԏ <     ~HǞDPPWH~DppW'0 0 `n ZWL4~DHHW@48@~HP^P^p[QP\ا^.W0 #F 6+!p""PW"*6* P !H f!a!p""W"sQ^00 |q.P СfsTq.P С:^Ps$0q.P ׎ p p pqH 0Z6p0 qP` 0qP0*(A s0(@h Lz  s~Hɞ@ɾ84WP48@~HsW0 #::* P B9!+!p""W"s`2(ы" s    ~Hɞ@ɾ84PPW8 ȩ~0p\ ~088WH?08~@q΀,XW zt T $f F  |t"  ~@ɞ8ɾ0HHWp48@~Hސ@$P`^^^X^\^T^l^|p^P2qW  (+ ^0@:50* - ^0@:50Q^\+ - 9 40,>599R3S5^pFP@H`^`45>te $E d D . L *^5Y^$, xs. Q^TqW 9 00(>@$50930@H@4L& *^@$5P^ , xP ^lQ^l4e ,E $d D + - 3- Q^XqQ^PW - Q^Xz9 0| Ч|T *^|Z^|0, , + *s]Xp.|nl&p^?5Pq^'T.|+ .|p^?5Pq^'^ln|V\V0%&p^?5Pq^',.|nl@$&p^5Pq^'^:Tbn|V.+&p^?5Pq^'(.|@$+p^5Pq^'(.|@$p^5Pq^'^..3R.^\^2PPp^?5Pq^pp@$^5Pq^p^7 ^\~Hɞ@ɾ84W@4~8p4W " q~8Ǟ4@@W@0~8fpW q  p2W ~ q\p4W > qp q  ~8ɞ0@@W@4~8p4W "  q~8Ǟ4@@W@4~8pqχH  4W $ q~8Ǟ4@@W @(#)rdfmt.c 4.3 87/05/13 @(#)fio.h 4.3 87/05/13 @(#)fmt.h 4.3 87/05/13 l@Tfmtrd_ed, unexpected code: %d %s FFFFFhxrd_ned, unexpected code: %d %s 444444444444 8888888888$&8:BFHT V ` b t       @JLPRX^d  @BJx  B P^  (*  j $&HJ &  H J   4 6    x! z! ! !  "      |~   $(,PTX\`dhlptx| .textPn.dataPJ.bss_rd_ed _getn _cursor _recpos _elist _errno _fatal _back _fmtbuf __iob _fprintf _abort _rd_I _rd_Ix _rd_L _rd_A  _rd_AW p _rd_F _rd_Q _cf _rd_ned  _rd_POS _rd_H`  _tolower _cblank  _scale _donewrec_howmany_pos rewind.o/ 548426296 98 100 100664 1168 ` u R8,.textH$ .dataHHP@.bssH~@@2eee0pH(|4rrNrx4jjj@$&  ~@HHW @(#)rewind.c 4.3 87/05/13 @(#)fio.h 4.3 87/05/13 rewindrewindrewind&@ NT `bl n r t       *.textH.dataHP.bss_f_rewl_getunitl_lunitl_errnol_fatall_unitsl_fk_openll_ftelll_t_runcl_rewindl_nowreadingrsfe.o/ 548426302 98 100 100664 2976 ` u R>/.text0L .data00X@.bss@~<p Bp 0^4dd2d " w ƶZҶ$ ~<@@W8 LB  88W@~<  ! pzPzh6   ~<@@W0 Г00W0 Гt00W @(#)rsfe.c 4.3 87/05/13 @(#)fio.h 4.3 87/05/13 @(#)fmt.h 4.3 87/05/13 startio"* < B H N T\djtxz  !!""#.%:'F)JLV*`+p,-02DFL-TVvx..text0L.data0X.bss_s_rsfep_initp_f_initp_c_sfep_readingpppp_elistp_recposp_cursorp_scalep_fmtbufp_lunitp_unitsp_curunitp_cfp_pars_fp_errnop_fatalp%p_x_getcp_getnp_x_backp_backp_rd_edp_doedp_rd_nedp_donedp_fmt_bgp_x_endpp_doendp_xrd_SLp0p_x_revp:p_cblankp_cpluspDp__filbufp_ungetcpP_sequential_formatted_external_checkmode_donewrec_dorevert_nowreadingsfe.o/ 548426309 98 100 100664 1933 ` u RE.textxD2 .dataxx@@.bss@~< p bB ! hqH  ! ~<@@W0 Г00WH~@p@@4eeZe0߀D'(2rrr>4fff~@HHW0 Г00W @(#)sfe.c 4.3 87/05/13 @(#)fio.h 4.3 87/05/13 sfesfestartio,.:<RTZ dfz|    (T^hnrt&6<.textx2.datax@.bssnp_curunitnp_cfnp__filbufnp_ungetcnp_fseeknp_e_rsfenp_en_fionp_fmtbufnp_c_sfe@np_getunitnp_lunitnp_setunitnp_errnonp_fatalnp_unitsnp_fk_opennp_e_wsfe`np_howmany_pos sue.o/ 548426317 98 100 100664 3556 ` u RL $.textx\t .dataxxX@.bssH~Dp $   w0!|  8 4J  ~DHHW@~<p $ ~ vw\Z$ &!~<@@W@~<p@2eeēe 0pD'T2rr*r2gggB2ggg~<@@WH~D0!dXp B0!, ~DHHW@  $" !@@W @(#)sue.c 4.3 87/05/13 @(#)fio.h 4.3 87/05/13 startstartsuesuesuestartio"8 : B J Z btvz|  BDNd f n t *DRXhpx|~      , . HV\""   8:LNR T XZf.textxt.dataxX.bss_s_rsuep_initp_f_initp_c_sue p_curunitp_readingp_recposppp_cfp_reclenp_freadp_errnop_fatalp_s_wsue4pp_ftellp_reclocp_fseekp_getunitp_lunitp'p3p=p_unitsp_elistp_fk_openp_e_wsuep_fwritep_e_rsuepH_nowreading_checkmode_nowwriting_sequential_external_formatteduio.o/ 548426323 98 100 100664 1700 ` u RS.text. .dataH@.bssPP@0Av:nn8nL3#0|03#0L@@W@0" @@WH~Dp1` >8nn@n^G0$n8H:$G0$~DHHW @(#)uio.c 4.3 87/05/13 @(#)fio.h 4.3 87/05/13 eof/uioeof/uioeof/uio"$.4 6 > @ R bh ~        "&(2D F X fl xz        .text..dataH.bssP_do_usmh_readingmh_recposmh_reclenmh_elistmh_errnomh_fatalmh_cfmh_freadmh_fwritemh_do_uiomhmh_do_ud mh_curunitmh_sequentialunits.o/ 548426329 98 100 100664 2040 ` u RY .text .dataHt@.bss00806 50 p0 ^HL 4p00H&$@v@zv88W8 "H< H88W @(#)units.c 4.3 87/05/13 @(#)fio.h 4.3 87/05/13 @(#)units.h 4.3 87/05/13 open:L^f .text.dataH.bss0_setunitl_unitmapHl_avunit0l_fatall_getunitlutil.o/ 548426336 98 100 100664 916 ` u R` .text .data8t@.bss  0A~r AA( A(~W@1~r 1A!r 1 !r~WX8  :XXW@~04ph`rA0( Dt10.1p $p1$0NrA( Aq10(1#$1!0~W @(#)util.c 4.3 87/05/13 @(#)fio.h 4.3 87/05/13 .text.data8.bss _g_charm _b_charm _inodem _statm _mvgbtm getfd.o/ 548426342 98 100 100664 572 ` u Rft .texth, .datahh8@.bss8088W8088W @(#)getfd.c 4.4 87/05/13 @(#)fio.h 4.3 87/05/13  "JTV.texth.datah8.bss_getfp_j_getunitj_unitsj_getfd_<jf7flsh.o/ 548426347 98 100 100664 508 ` u Rk4 .text@ .data@@8@.bssxx8 088W @(#)f7flsh.c 4.3 87/05/13 @(#)fio.h 4.3 87/05/13 "$0 .text@.data@8.bssx_f7flsh_j_getunitj_unitsj_fflushjwrtfmt.o/ 548426366 98 100 100664 8158 ` u R}&.text0 .data00@.bss00@~\N(\ X (΀*WyX p W\-W+WǞXp0W+WX ~PɞHǾD``WX@~Hz P.T4PT$ΐ*p Wqr΀ pWqT-W+Wp*WqP~Hɞ@XXW`DH~Ppzw ppX.\: \ X  (ΐ*p Wqp,(ΐ p WqX ΀ pWq\-W+W΀0pWqX p+WqX~PɞHǾD``W@~8p‹`qL  W,q  Wq~8@@W@~8p4(&(Wq~8@@W@14~8Àz ǀpϓ WqtWfW~8Ǟ4@@W@~8q(Wq~8@@W@4~8qq Wy(Wq~8Ǟ4@@WhDHǾP~X' ^d(>`^(J~`Ѝpw)%cp!d! < y(΀*pWq"p Wqd-W+Wh`Π0.Wp Wqp Wqj`p Wq.Wp Wq..Wp Wq *`` ``46͈.ddWeW` -W``+WD ` 4`c(΀*pWqh`d(`d0W`d``0W`0W~XɞPɾHDhhWxLPX@~`ǎP?`^p'Pha: 2h^h?:(e,@$prɾh^p:V0 ϳΐ '!8tp W*^pq5P^pr(e,T~`ɞXɾPLxxW`D@H~P' A0N&@$ p51q.p?50q^\(>X^(2X \\ X   (΀*pWqΠ p Wq\-W+Wp WqXΐ0.Wp WqX0  W0Wq~PɞHǾD``W @(#)wrtfmt.c 4.3 87/05/13 @(#)fio.h 4.3 87/05/13 @(#)fmt.h 4.3 87/05/13 left offL00|,w_ed, unexpected code: %d %s $w_ned, unexpected code: %d %s &(046D F R T f v|   &0268>DJ   t !! !!"$<>XZ"!! "8:H!J!RThj"!! "LN!!jldf|~   0 2 # # $ ! !  " H J b d t! v! ~  # #     # #   # # # #   &# (# 0 2 H J V# X# h j   # #         T V       # # #   #h#j#####%!!,.PRhjx!z! .text0.data0.bss0_mv_curH_putnH_cursorH_recposH_elistH_errnoH_fatalH_backH_w_edH_fmtbufH__iobH_fprintfH_abortH_wrt_IH_wrt_IMH_wrt_IxDH_wrt_L$H_wrt_AH_wrt_AWH_wrt_E `H_wrt_G H_wrt_F4H_w_nedxHH_wrt_AP,H_wrt_HH_icvt_ozH_cplusH_icvtH_scaleH_ecvtH_fcvtH_donewrecwsfe.o/ 548426374 98 100 100664 3722 ` u R \1.textxdj .dataxx`@.bss@~<p Lp 0V4ddȓ*d  w4`$ ~<@@W8 * X$  !&111 88WW8 *dQP$  !d&111 PЎQP0PЊ J p!!!P1 H "!!!X$  !\&111 88W8 W88W8 W88W8 W88W @(#)wsfe.c 4.3 87/05/13 @(#)fio.h 4.3 87/05/13 @(#)fmt.h 4.3 87/05/13 startio"* < D J P V^flr|   !""$#0%<'H)N*RT\+h,z-.8:BZ\dlnv.. 46HJR.\^|~. "*,P0R0Z\h0.textxj.datax`.bss_s_wsfep_initp_f_initp_c_sfep_readingpppp_elistp_recposp_cursorp_nonlp_scalep_fmtbufp_lunitp_unitsp_curunitp_cfp_pars_fp_errnop_fatalp%p_x_putcp_putnp_x_back8p_backp_w_edp_doedp_w_nedp_donedp_xw_endp_doendp_xw_revHp0p_x_wSLp:p_fmt_bgp_cplusp_cblankpDp__flsbufp_pr_putPpPpZ_sequential_formatted_external_checkmode_dorevert_donewrec_nowwriting_workdone#ident " @(#)lio.h 4.3 87/05/13 " /* copy of ftypes from the compiler */ /* variable types * numeric assumptions: * int < reals < complexes * TYDREAL-TYREAL = TYDCOMPLEX-TYCOMPLEX */ #ifdef EXTSEMS /* add BYTE type (byte,logical*1,integer*1) and SLOGICAL type (logical*2) */ #define TYUNKNOWN 0 #define TYADDR 1 #define TYBYTE 2 #define TYSHORT 3 #define TYLONG 4 #define TYREAL 5 #define TYDREAL 6 #define TYCOMPLEX 7 #define TYDCOMPLEX 8 #define TYSLOGICAL 9 #define TYLOGICAL 10 #define TYCHAR 11 #define TYSUBR 12 #define TYERROR 13 #else #define TYUNKNOWN 0 #define TYADDR 1 #define TYSHORT 2 #define TYLONG 3 #define TYREAL 4 #define TYDREAL 5 #define TYCOMPLEX 6 #define TYDCOMPLEX 7 #define TYLOGICAL 8 #define TYCHAR 9 #define TYSUBR 10 #define TYERROR 11 #endif #define NTYPES (TYERROR+1) #define LINTW 12 #define LINE 80 #define LLOGW 2 #define LLOW 1.0 #define LHIGH 10.0 #define LFW 12 #define LFD 8 #define LEW 18 #define LED 9 #define LEE 3 typedef union { short flshort; ftnint flint; #ifdef EXTSEMS char flbyte; #endif float flreal; double fldouble; } flex; extern int scale; extern int (*lioproc)(); Symbols from libI77.a[backspace.o]: Name Value Class Type Size Line Section _errno |0x00000000|extern| | | | _fatal |0x00000000|extern| | | | _fk_open |0x00000000|extern| | | | _fread |0x00000000|extern| | | | _fseek |0x00000000|extern| | | | _ftell |0x00000000|extern| | | | _getunit |0x00000000|extern| | | | _lunit |0x00000000|extern| | | | _nowreading |0x00000000|extern| | | | _t_runc |0x00000000|extern| | | | _units |0x00000000|extern| | | | _f_back |0x00000008|extern| | | |.text Symbols from libI77.a[close.o]: Name Value Class Type Size Line Section _abort |0x00000000|extern| | | | _avunit |0x00000000|extern| | | | _fclose |0x00000000|extern| | | | _fflush |0x00000000|extern| | | | _free |0x00000000|extern| | | | _getenv |0x00000000|extern| | | | _getunit |0x00000000|extern| | | | _lfn_flag |0x00000000|extern| | | | _lunit |0x00000000|extern| | | | _t_runc |0x00000000|extern| | | | _unitmap |0x00000000|extern| | | | _units |0x00000000|extern| | | | _unlink |0x00000000|extern| | | | _f_clos |0x00000008|extern| | | |.text _f_exit |0x000001f0|extern| | | |.text _flush_ |0x00000264|extern| | | |.text Symbols from libI77.a[dfe.o]: Name Value Class Type Size Line Section __filbuf |0x00000000|extern| | | | __flsbuf |0x00000000|extern| | | | _back |0x00000000|extern| | | | _cf |0x00000000|extern| | | | _checkmode |0x00000000|extern| | | | _cursor |0x00000000|extern| | | | _curunit |0x00000000|extern| | | | _doed |0x00000000|extern| | | | _doend |0x00000000|extern| | | | _doned |0x00000000|extern| | | | _donewrec |0x00000000|extern| | | | _dorevert |0x00000000|extern| | | | _elist |0x00000000|extern| | | | _en_fio |0x00000000|extern| | | | _errno |0x00000000|extern| | | | _external |0x00000000|extern| | | | _f_init |0x00000000|extern| | | | _fatal |0x00000000|extern| | | | _fk_open |0x00000000|extern| | | | _fmt_bg |0x00000000|extern| | | | _fmtbuf |0x00000000|extern| | | | _formatted |0x00000000|extern| | | | _fseek |0x00000000|extern| | | | _getn |0x00000000|extern| | | | _getunit |0x00000000|extern| | | | _init |0x00000000|extern| | | | _lunit |0x00000000|extern| | | | _nowreading |0x00000000|extern| | | | _nowwriting |0x00000000|extern| | | | _pars_f |0x00000000|extern| | | | _putn |0x00000000|extern| | | | _rd_ed |0x00000000|extern| | | | _rd_ned |0x00000000|extern| | | | _reading |0x00000000|extern| | | | _recpos |0x00000000|extern| | | | _scale |0x00000000|extern| | | | _sequential |0x00000000|extern| | | | _units |0x00000000|extern| | | | _w_ed |0x00000000|extern| | | | _w_ned |0x00000000|extern| | | | _icnum |0x00000004|extern| | | | _s_rdfe |0x00000008|extern| | | |.text _s_wdfe |0x0000011c|extern| | | |.text _e_rdfe |0x00000230|extern| | | |.text _e_wdfe |0x00000254|extern| | | |.text _c_dfe |0x00000278|extern| | | |.text _y_getc |0x0000043c|extern| | | |.text _y_putc |0x0000054c|extern| | | |.text _y_back |0x00000624|extern| | | |.text _y_err |0x0000063c|extern| | | |.text _y_rnew |0x00000688|extern| | | |.text _y_wnew |0x000006e8|extern| | | |.text Symbols from libI77.a[due.o]: Name Value Class Type Size Line Section _cf |0x00000000|extern| | | | _checkmode |0x00000000|extern| | | | _curunit |0x00000000|extern| | | | _elist |0x00000000|extern| | | | _errno |0x00000000|extern| | | | _external |0x00000000|extern| | | | _f_init |0x00000000|extern| | | | _fatal |0x00000000|extern| | | | _fk_open |0x00000000|extern| | | | _formatted |0x00000000|extern| | | | _fseek |0x00000000|extern| | | | _ftell |0x00000000|extern| | | | _getunit |0x00000000|extern| | | | _init |0x00000000|extern| | | | _lunit |0x00000000|extern| | | | _nowreading |0x00000000|extern| | | | _nowwriting |0x00000000|extern| | | | _reading |0x00000000|extern| | | | _recpos |0x00000000|extern| | | | _sequential |0x00000000|extern| | | | _units |0x00000000|extern| | | | _s_rdue |0x00000008|extern| | | |.text _s_wdue |0x00000070|extern| | | |.text _c_due |0x000000d8|extern| | | |.text _e_rdue |0x000002d0|extern| | | |.text _e_wdue |0x000003c4|extern| | | |.text Symbols from libI77.a[endfile.o]: Name Value Class Type Size Line Section __iob |0x00000000|extern| | | | _errno |0x00000000|extern| | | | _execl |0x00000000|extern| | | | _exit |0x00000000|extern| | | | _fatal |0x00000000|extern| | | | _fclose |0x00000000|extern| | | | _fflush |0x00000000|extern| | | | _fk_open |0x00000000|extern| | | | _fopen |0x00000000|extern| | | | _fork |0x00000000|extern| | | | _fprintf |0x00000000|extern| | | | _fread |0x00000000|extern| | | | _fseek |0x00000000|extern| | | | _ftell |0x00000000|extern| | | | _fwrite |0x00000000|extern| | | | _getunit |0x00000000|extern| | | | _lunit |0x00000000|extern| | | | _mktemp |0x00000000|extern| | | | _nowreading |0x00000000|extern| | | | _strcpy |0x00000000|extern| | | | _units |0x00000000|extern| | | | _unlink |0x00000000|extern| | | | _wait |0x00000000|extern| | | | _f_end |0x00000008|extern| | | |.text _t_runc |0x00000104|extern| | | |.text Symbols from libI77.a[err.o]: Name Value Class Type Size Line Section __cleanup |0x00000000|extern| | | | __iob |0x00000000|extern| | | | _abort |0x00000000|extern| | | | _avunit |0x00000000|extern| | | | _fprintf |0x00000000|extern| | | | _freopen |0x00000000|extern| | | | _fseek |0x00000000|extern| | | | _fstat |0x00000000|extern| | | | _ftell |0x00000000|extern| | | | _getenv |0x00000000|extern| | | | _isatty |0x00000000|extern| | | | _lfn_flag |0x00000000|extern| | | | _perror |0x00000000|extern| | | | _back |0x00000004|extern| | | | _cblank |0x00000004|extern| | | | _cf |0x00000004|extern| | | | _cplus |0x00000004|extern| | | | _cursor |0x00000004|extern| | | | _curunit |0x00000004|extern| | | | _doed |0x00000004|extern| | | | _doend |0x00000004|extern| | | | _doned |0x00000004|extern| | | | _donewrec |0x00000004|extern| | | | _dorevert |0x00000004|extern| | | | _elist |0x00000004|extern| | | | _external |0x00000004|extern| | | | _fmtbuf |0x00000004|extern| | | | _formatted |0x00000004|extern| | | | _getn |0x00000004|extern| | | | _init |0x00000004|extern| | | | _lunit |0x00000004|extern| | | | _putn |0x00000004|extern| | | | _reading |0x00000004|extern| | | | _recpos |0x00000004|extern| | | | _scale |0x00000004|extern| | | | _sequential |0x00000004|extern| | | | _fatal |0x00000008|extern| | | |.text _f_init |0x000001b0|extern| | | |.text _canseek |0x00000260|extern| | | |.text _nowreading |0x000002b8|extern| | | |.text _nowwriting |0x0000034c|extern| | | |.text _fortfile |0x00000540|extern| | | |.data _fortlfile |0x00000548|extern| | | |.data _F_err |0x00000550|extern| | | |.data _units |0x00000c00|extern| | | | Symbols from libI77.a[fmt.o]: Name Value Class Type Size Line Section __iob |0x00000000|extern| | | | _abort |0x00000000|extern| | | | _cblank |0x00000000|extern| | | | _cplus |0x00000000|extern| | | | _cursor |0x00000000|extern| | | | _doed |0x00000000|extern| | | | _doend |0x00000000|extern| | | | _doned |0x00000000|extern| | | | _dorevert |0x00000000|extern| | | | _elist |0x00000000|extern| | | | _errno |0x00000000|extern| | | | _fatal |0x00000000|extern| | | | _fmtbuf |0x00000000|extern| | | | _fprintf |0x00000000|extern| | | | _scale |0x00000000|extern| | | | _cp |0x00000004|extern| | | | _nonl |0x00000004|extern| | | | _parenlvl |0x00000004|extern| | | | _pc |0x00000004|extern| | | | _revloc |0x00000004|extern| | | | _rp |0x00000004|extern| | | | _workdone |0x00000004|extern| | | | _pars_f |0x00000008|extern| | | |.text _cnt |0x00000028|extern| | | | _ret |0x00000028|extern| | | | _f_s |0x00000054|extern| | | |.text _f_list |0x000000f8|extern| | | |.text _i_tem |0x000001c8|extern| | | |.text _ne_d |0x0000026c|extern| | | |.text _e_d |0x000005c4|extern| | | |.text _op_gen |0x000009bc|extern| | | |.text _gt_num |0x00000a50|extern| | | |.text _en_fio |0x00000ae8|extern| | | |.text _do_fio |0x00000b18|extern| | | |.text _fmt_bg |0x00000ee8|extern| | | |.text _type_f |0x00000f24|extern| | | |.text _ap_end |0x00000f7c|extern| | | |.text _syl |0x000012c0|extern| | | | Symbols from libI77.a[fmtlib.o]: Name Value Class Type Size Line Section _strcpy |0x00000000|extern| | | | _strlen |0x00000000|extern| | | | _icvt |0x00000008|extern| | | |.text _icvt_oz |0x000000d8|extern| | | |.text Symbols from libI77.a[iio.o]: Name Value Class Type Size Line Section _back |0x00000000|extern| | | | _cblank |0x00000000|extern| | | | _cplus |0x00000000|extern| | | | _cursor |0x00000000|extern| | | | _doed |0x00000000|extern| | | | _doend |0x00000000|extern| | | | _doned |0x00000000|extern| | | | _donewrec |0x00000000|extern| | | | _dorevert |0x00000000|extern| | | | _elist |0x00000000|extern| | | | _en_fio |0x00000000|extern| | | | _errno |0x00000000|extern| | | | _external |0x00000000|extern| | | | _fatal |0x00000000|extern| | | | _fmt_bg |0x00000000|extern| | | | _fmtbuf |0x00000000|extern| | | | _formatted |0x00000000|extern| | | | _getn |0x00000000|extern| | | | _pars_f |0x00000000|extern| | | | _putn |0x00000000|extern| | | | _rd_ed |0x00000000|extern| | | | _rd_ned |0x00000000|extern| | | | _reading |0x00000000|extern| | | | _recpos |0x00000000|extern| | | | _scale |0x00000000|extern| | | | _sequential |0x00000000|extern| | | | _w_ed |0x00000000|extern| | | | _w_ned |0x00000000|extern| | | | _icend |0x00000004|extern| | | | _icnum |0x00000004|extern| | | | _icptr |0x00000004|extern| | | | _svic |0x00000004|extern| | | | _z_getc |0x00000008|extern| | | |.text _z_putc |0x000000cc|extern| | | |.text _z_back |0x0000019c|extern| | | |.text _z_rnew |0x000001c4|extern| | | |.text _z_rnew1 |0x00000208|extern| | | |.text _z_rnewdor |0x0000022c|extern| | | |.text _s_rsfi |0x0000026c|extern| | | |.text _s_wsfi |0x000002f8|extern| | | |.text _c_si |0x00000380|extern| | | |.text _z_wnew |0x00000460|extern| | | |.text _z_wnewdor |0x000004c4|extern| | | |.text _e_rsfi |0x00000520|extern| | | |.text _e_wsfi |0x0000054c|extern| | | |.text _y_ierr |0x000005d0|extern| | | |.text Symbols from libI77.a[inquire.o]: Name Value Class Type Size Line Section _avunit |0x00000000|extern| | | | _b_char |0x00000000|extern| | | | _ftell |0x00000000|extern| | | | _g_char |0x00000000|extern| | | | _getenv |0x00000000|extern| | | | _getunit |0x00000000|extern| | | | _inode |0x00000000|extern| | | | _isdev |0x00000000|extern| | | | _lfn_flag |0x00000000|extern| | | | _lunit |0x00000000|extern| | | | _strcpy |0x00000000|extern| | | | _units |0x00000000|extern| | | | _f_inqu2 |0x00000008|extern| | | |.text _f_inqu |0x00000490|extern| | | |.text Symbols from libI77.a[lio.o]: Name Value Class Type Size Line Section __flsbuf |0x00000000|extern| | | | _c_le |0x00000000|extern| | | | _cf |0x00000000|extern| | | | _curunit |0x00000000|extern| | | | _external |0x00000000|extern| | | | _f_init |0x00000000|extern| | | | _fatal |0x00000000|extern| | | | _formatted |0x00000000|extern| | | | _init |0x00000000|extern| | | | _lioproc |0x00000000|extern| | | | _nowwriting |0x00000000|extern| | | | _putn |0x00000000|extern| | | | _reading |0x00000000|extern| | | | _recpos |0x00000000|extern| | | | _scale |0x00000000|extern| | | | _sprintf |0x00000000|extern| | | | _strlen |0x00000000|extern| | | | _wrt_E |0x00000000|extern| | | | _wrt_F |0x00000000|extern| | | | _wrt_L |0x00000000|extern| | | | _s_wsle |0x00000008|extern| | | |.text _e_wsle |0x00000098|extern| | | |.text _t_putc |0x000000c4|extern| | | |.text _lwrt_I |0x00000144|extern| | | |.text _lwrt_L |0x000001c4|extern| | | |.text _lwrt_A |0x00000218|extern| | | |.text _lwrt_F |0x0000028c|extern| | | |.text _lwrt_C |0x00000364|extern| | | |.text _l_write |0x000003fc|extern| | | |.text Symbols from libI77.a[lread.o]: Name Value Class Type Size Line Section __ctype |0x00000000|extern| | | | __filbuf |0x00000000|extern| | | | _b_char |0x00000000|extern| | | | _cf |0x00000000|extern| | | | _curunit |0x00000000|extern| | | | _elist |0x00000000|extern| | | | _errno |0x00000000|extern| | | | _external |0x00000000|extern| | | | _f_init |0x00000000|extern| | | | _fatal |0x00000000|extern| | | | _fk_open |0x00000000|extern| | | | _fmtbuf |0x00000000|extern| | | | _formatted |0x00000000|extern| | | | _free |0x00000000|extern| | | | _fscanf |0x00000000|extern| | | | _getunit |0x00000000|extern| | | | _init |0x00000000|extern| | | | _lunit |0x00000000|extern| | | | _malloc |0x00000000|extern| | | | _nowreading |0x00000000|extern| | | | _reading |0x00000000|extern| | | | _realloc |0x00000000|extern| | | | _recpos |0x00000000|extern| | | | _scale |0x00000000|extern| | | | _ungetc |0x00000000|extern| | | | _units |0x00000000|extern| | | | _l_comma |0x00000001|extern| | | | _l_first |0x00000001|extern| | | | _lchar |0x00000004|extern| | | | _lcount |0x00000004|extern| | | | _lioproc |0x00000004|extern| | | | _lquit |0x00000004|extern| | | | _ltype |0x00000004|extern| | | | _lx |0x00000008|extern| | | | _ly |0x00000008|extern| | | | _t_getc |0x00000008|extern| | | |.text _e_rsle |0x000000a4|extern| | | |.text _l_read |0x000000f4|extern| | | |.text _l_R |0x000004ac|extern| | | |.text _rd_int |0x000007a0|extern| | | |.text _lr_comm |0x000008a4|extern| | | |.text _l_C |0x00000930|extern| | | |.text _l_L |0x00000c38|extern| | | |.text _l_CHAR |0x00000e88|extern| | | |.text _s_rsle |0x000011bc|extern| | | |.text _c_le |0x00001258|extern| | | |.text _do_lio |0x00001394|extern| | | |.text _ltab |0x00001528|extern| | | |.data Symbols from libI77.a[nio.o]: Name Value Class Type Size Line Section __ctype |0x00000000|extern| | | | __filbuf |0x00000000|extern| | | | __flsbuf |0x00000000|extern| | | | _b_char |0x00000000|extern| | | | _cf |0x00000000|extern| | | | _curunit |0x00000000|extern| | | | _elist |0x00000000|extern| | | | _errno |0x00000000|extern| | | | _external |0x00000000|extern| | | | _f_init |0x00000000|extern| | | | _fatal |0x00000000|extern| | | | _fk_open |0x00000000|extern| | | | _fmtbuf |0x00000000|extern| | | | _formatted |0x00000000|extern| | | | _fputs |0x00000000|extern| | | | _free |0x00000000|extern| | | | _ftell |0x00000000|extern| | | | _getunit |0x00000000|extern| | | | _init |0x00000000|extern| | | | _ltab |0x00000000|extern| | | | _lunit |0x00000000|extern| | | | _malloc |0x00000000|extern| | | | _nowreading |0x00000000|extern| | | | _nowwriting |0x00000000|extern| | | | _reading |0x00000000|extern| | | | _realloc |0x00000000|extern| | | | _recpos |0x00000000|extern| | | | _scale |0x00000000|extern| | | | _sequential |0x00000000|extern| | | | _sprintf |0x00000000|extern| | | | _strcmp |0x00000000|extern| | | | _strlen |0x00000000|extern| | | | _t_getc |0x00000000|extern| | | | _t_putc |0x00000000|extern| | | | _tolower |0x00000000|extern| | | | _ungetc |0x00000000|extern| | | | _units |0x00000000|extern| | | | _l_comma |0x00000001|extern| | | | _flagtabchar |0x00000004|extern| | | | _lastchar |0x00000004|extern| | | | _nio_lchar |0x00000004|extern| | | | _nio_lcount |0x00000004|extern| | | | _nio_ltype |0x00000004|extern| | | | _nio_lx |0x00000008|extern| | | | _nio_ly |0x00000008|extern| | | | _nio_read |0x00000008|extern| | | |.text _tabind |0x00000028|extern| | | | _niol_R |0x000003b0|extern| | | |.text _niord_int |0x000006e0|extern| | | |.text _niol_C |0x000007e4|extern| | | |.text _niol_L |0x00000b74|extern| | | |.text _niol_CHAR |0x00000de8|extern| | | |.text _s_rsne |0x000011d4|extern| | | |.text _getword |0x00001528|extern| | | |.text _recupind |0x000017a0|extern| | | |.text _findit |0x00001ab0|extern| | | |.text _getvar |0x00001b04|extern| | | |.text _s_wsne |0x00001f90|extern| | | |.text _c_nle |0x00002568|extern| | | |.text Symbols from libI77.a[open.o]: Name Value Class Type Size Line Section _access |0x00000000|extern| | | | _canseek |0x00000000|extern| | | | _close |0x00000000|extern| | | | _creat |0x00000000|extern| | | | _curunit |0x00000000|extern| | | | _errno |0x00000000|extern| | | | _f_clos |0x00000000|extern| | | | _fatal |0x00000000|extern| | | | _fopen |0x00000000|extern| | | | _fortfile |0x00000000|extern| | | | _fortlfile |0x00000000|extern| | | | _fseek |0x00000000|extern| | | | _g_char |0x00000000|extern| | | | _getenv |0x00000000|extern| | | | _inode |0x00000000|extern| | | | _lunit |0x00000000|extern| | | | _malloc |0x00000000|extern| | | | _mktemp |0x00000000|extern| | | | _rewind |0x00000000|extern| | | | _setunit |0x00000000|extern| | | | _sprintf |0x00000000|extern| | | | _stat |0x00000000|extern| | | | _strcpy |0x00000000|extern| | | | _strlen |0x00000000|extern| | | | _units |0x00000000|extern| | | | _f_setlfnflag |0x00000008|extern| | | |.text _f_setl |0x0000001c|extern| | | |.text _f_open |0x00000030|extern| | | |.text _fk_open |0x00000928|extern| | | |.text _isdev |0x00000a10|extern| | | |.text _checkmode |0x00000a6c|extern| | | |.text _lfn_flag |0x00000c10|extern| | | |.data Symbols from libI77.a[rdfmt.o]: Name Value Class Type Size Line Section __iob |0x00000000|extern| | | | _abort |0x00000000|extern| | | | _back |0x00000000|extern| | | | _cblank |0x00000000|extern| | | | _cf |0x00000000|extern| | | | _cursor |0x00000000|extern| | | | _donewrec |0x00000000|extern| | | | _elist |0x00000000|extern| | | | _errno |0x00000000|extern| | | | _fatal |0x00000000|extern| | | | _fmtbuf |0x00000000|extern| | | | _fprintf |0x00000000|extern| | | | _getn |0x00000000|extern| | | | _howmany_pos |0x00000000|extern| | | | _recpos |0x00000000|extern| | | | _scale |0x00000000|extern| | | | _tolower |0x00000000|extern| | | | _rd_ed |0x00000008|extern| | | |.text _rd_ned |0x00000220|extern| | | |.text _rd_Ix |0x000002f8|extern| | | |.text _rd_I |0x0000058c|extern| | | |.text _rd_Q |0x00000694|extern| | | |.text _rd_L |0x000006e0|extern| | | |.text _rd_F |0x000007b0|extern| | | |.text _rd_A |0x00000d04|extern| | | |.text _rd_AW |0x00000d70|extern| | | |.text _rd_H |0x00000e60|extern| | | |.text _rd_POS |0x00000ecc|extern| | | |.text Symbols from libI77.a[rewind.o]: Name Value Class Type Size Line Section _errno |0x00000000|extern| | | | _fatal |0x00000000|extern| | | | _fk_open |0x00000000|extern| | | | _ftell |0x00000000|extern| | | | _getunit |0x00000000|extern| | | | _lunit |0x00000000|extern| | | | _nowreading |0x00000000|extern| | | | _rewind |0x00000000|extern| | | | _t_runc |0x00000000|extern| | | | _units |0x00000000|extern| | | | _f_rew |0x00000008|extern| | | |.text Symbols from libI77.a[rsfe.o]: Name Value Class Type Size Line Section __filbuf |0x00000000|extern| | | | _back |0x00000000|extern| | | | _c_sfe |0x00000000|extern| | | | _cblank |0x00000000|extern| | | | _cf |0x00000000|extern| | | | _checkmode |0x00000000|extern| | | | _cplus |0x00000000|extern| | | | _cursor |0x00000000|extern| | | | _curunit |0x00000000|extern| | | | _doed |0x00000000|extern| | | | _doend |0x00000000|extern| | | | _doned |0x00000000|extern| | | | _donewrec |0x00000000|extern| | | | _dorevert |0x00000000|extern| | | | _elist |0x00000000|extern| | | | _errno |0x00000000|extern| | | | _external |0x00000000|extern| | | | _f_init |0x00000000|extern| | | | _fatal |0x00000000|extern| | | | _fmt_bg |0x00000000|extern| | | | _fmtbuf |0x00000000|extern| | | | _formatted |0x00000000|extern| | | | _getn |0x00000000|extern| | | | _init |0x00000000|extern| | | | _lunit |0x00000000|extern| | | | _nowreading |0x00000000|extern| | | | _pars_f |0x00000000|extern| | | | _rd_ed |0x00000000|extern| | | | _rd_ned |0x00000000|extern| | | | _reading |0x00000000|extern| | | | _recpos |0x00000000|extern| | | | _scale |0x00000000|extern| | | | _sequential |0x00000000|extern| | | | _ungetc |0x00000000|extern| | | | _units |0x00000000|extern| | | | _x_back |0x00000000|extern| | | | _s_rsfe |0x00000008|extern| | | |.text _xrd_SL |0x0000018c|extern| | | |.text _x_getc |0x00000210|extern| | | |.text _x_endp |0x000002ec|extern| | | |.text _x_rev |0x00000310|extern| | | |.text Symbols from libI77.a[sfe.o]: Name Value Class Type Size Line Section __filbuf |0x00000000|extern| | | | _cf |0x00000000|extern| | | | _curunit |0x00000000|extern| | | | _en_fio |0x00000000|extern| | | | _errno |0x00000000|extern| | | | _fatal |0x00000000|extern| | | | _fk_open |0x00000000|extern| | | | _fmtbuf |0x00000000|extern| | | | _fseek |0x00000000|extern| | | | _getunit |0x00000000|extern| | | | _lunit |0x00000000|extern| | | | _setunit |0x00000000|extern| | | | _ungetc |0x00000000|extern| | | | _units |0x00000000|extern| b c d | | | _howmany_pos |0x00000008|extern| | | |.text _e_rsfe |0x00000114|extern| | | |.text _c_sfe |0x00000140|extern| | | |.text _e_wsfe |0x00000260|extern| | | |.text Symbols from libI77.a[sue.o]: Name Value Class Type Size Line Section _cf |0x00000000|extern| | | | _checkmode |0x00000000|extern| | | | _curunit |0x00000000|extern| | | | _elist |0x00000000|extern| | | | _errno |0x00000000|extern| | | | _external |0x00000000|extern| | | | _f_init |0x00000000|extern| | | | _fatal |0x00000000|extern| | | | _fk_open |0x00000000|extern| | | | _formatted |0x00000000|extern| | | | _fread |0x00000000|extern| | | | _fseek |0x00000000|extern| | | | _ftell |0x00000000|extern| | | | _fwrite |0x00000000|extern| | | | _getunit |0x00000000|extern| | | | _init |0x00000000|extern| | | | _lunit |0x00000000|extern| | | | _nowreading |0x00000000|extern| | | | _nowwriting |0x00000000|extern| | | | _reading |0x00000000|extern| | | | _reclen |0x00000000|extern| | | | _recpos |0x00000000|extern| | | | _sequential |0x00000000|extern| | | | _units |0x00000000|extern| | | | _recloc |0x00000004|extern| | | | _s_rsue |0x00000008|extern| | | |.text _s_wsue |0x00000134|extern| | | |.text _c_sue |0x0000020c|extern| | | |.text _e_wsue |0x00000380|extern| | | |.text _e_rsue |0x00000404|extern| | | |.text Symbols from libI77.a[uio.o]: Name Value Class Type Size Line Section _cf |0x00000000|extern| | | | _curunit |0x00000000|extern| | | | _elist |0x00000000|extern| | | | _errno |0x00000000|extern| | | | _fatal |0x00000000|extern| | | | _fread |0x00000000|extern| | | | _fwrite |0x00000000|extern| | | | _reading |0x00000000|extern| | | | _recpos |0x00000000|extern| | | | _sequential |0x00000000|extern| | | | _reclen |0x00000004|extern| | | | _do_us |0x00000008|extern| | | |.text _do_uio |0x000000d0|extern| | | |.text _do_ud |0x0000010c|extern| | | |.text Symbols from libI77.a[units.o]: Name Value Class Type Size Line Section _fatal |0x00000000|extern| | | | _setunit |0x00000008|extern| | | |.text _getunit |0x000000a4|extern| | | |.text _unitmap |0x00000148|extern| | | |.data _avunit |0x00000530|extern| | | |.data Symbols from libI77.a[util.o]: Name Value Class Type Size Line Section _stat |0x00000000|extern| | | | _g_char |0x00000008|extern| | | |.text _b_char |0x00000080|extern| | | |.text _inode |0x000000d8|extern| | | |.text _mvgbt |0x00000110|extern| | | |.text Symbols from libI77.a[getfd.o]: Name Value Class Type Size Line Section _getunit |0x00000000|extern| | | | _units |0x00000000|extern| | | | _getfp_ |0x00000008|extern| | | |.text _getfd_ |0x0000003c|extern| | | |.text Symbols from libI77.a[f7flsh.o]: Name Value Class Type Size Line Section _fflush |0x00000000|extern| | | | _getunit |0x00000000|extern| | | | _units |0x00000000|extern| | | | _f7flsh_ |0x00000008|extern| | | |.text Symbols from libI77.a[wrtfmt.o]: Name Value Class Type Size Line Section __iob |0x00000000|extern| | | | _abort |0x00000000|extern| | | | _back |0x00000000|extern| | | | _cplus |0x00000000|extern| | | | _cursor |0x00000000|extern| | | | _donewrec |0x00000000|extern| | | | _ecvt |0x00000000|extern| | | | _elist |0x00000000|extern| | | | _errno |0x00000000|extern| | | | _fatal |0x00000000|extern| | | | _fcvt |0x00000000|extern| | | | _fmtbuf |0x00000000|extern| | | | _fprintf |0x00000000|extern| | | | _icvt |0x00000000|extern| | | | _icvt_oz |0x00000000|extern| | | | _putn |0x00000000|extern| | | | _recpos |0x00000000|extern| | | | _scale |0x00000000|extern| | | | _mv_cur |0x00000008|extern| | | |.text _w_ed |0x000000c4|extern| | | |.text _w_ned |0x00000278|extern| | | |.text _wrt_Ix |0x00000344|extern| | | |.text _wrt_I |0x00000490|extern| | | |.text _wrt_IM |0x0000059c|extern| | | |.text _wrt_AP |0x0000072c|extern| | | |.text _wrt_H |0x000007c4|extern| | | |.text _wrt_L |0x00000824|extern| | | |.text _wrt_A |0x000008b4|extern| | | |.text _wrt_AW |0x000008f8|extern| | | |.text _wrt_E |0x00000960|extern| | | |.text _wrt_G |0x00000cf0|extern| | | |.text _wrt_F |0x00000e34|extern| | | |.text Symbols from libI77.a[wsfe.o]: Name Value Class Type Size Line Section __flsbuf |0x00000000|extern| | | | _back |0x00000000|extern| | | | _c_sfe |0x00000000|extern| | | | _cblank |0x00000000|extern| | | | _cf |0x00000000|extern| | | | _checkmode |0x00000000|extern| | | | _cplus |0x00000000|extern| | | | _cursor |0x00000000|extern| | | | _curunit |0x00000000|extern| | | | _doed |0x00000000|extern| | | | _doend |0x00000000|extern| | | | _doned |0x00000000|extern| | | | _donewrec |0x00000000|extern| | | | _dorevert |0x00000000|extern| | | | _elist |0x00000000|extern| | | | _errno |0x00000000|extern| | | | _external |0x00000000|extern| | | | _f_init |0x00000000|extern| | | | _fatal |0x00000000|extern| | | | _fmt_bg |0x00000000|extern| | | | _fmtbuf |0x00000000|extern| | | | _formatted |0x00000000|extern| | | | _init |0x00000000|extern| | | | _lunit |0x00000000|extern| | | | _nonl |0x00000000|extern| | | | _nowwriting |0x00000000|extern| | | | _pars_f |0x00000000|extern| | | | _putn |0x00000000|extern| | | | _reading |0x00000000|extern| | | | _recpos |0x00000000|extern| | | | _scale |0x00000000|extern| | | | _sequential |0x00000000|extern| | | | _units |0x00000000|extern| | | | _w_ed |0x00000000|extern| | | | _w_ned |0x00000000|extern| | | | _workdone |0x00000000|extern| | | | _s_wsfe |0x00000008|extern| | | |.text _x_putc |0x00000198|extern| | | |.text _x_back |0x00000238|extern| | | |.text _pr_put |0x00000250|extern| | | |.text _x_wSL |0x000003e4|extern| | | |.text _xw_end |0x00000418|extern| | | |.text _xw_rev |0x00000448|extern| | | |.text Symbols from plibI77.a[backspace.o]: Name Value Class Type Size Line Section _errno |0x00000000|extern| | | | _fatal |0x00000000|extern| | | | _fk_open |0x00000000|extern| | | | _fread |0x00000000|extern| | | | _fseek |0x00000000|extern| | | | _ftell |0x00000000|extern| | | | _getunit |0x00000000|extern| | | | _lunit |0x00000000|extern| | | | _nowreading |0x00000000|extern| | | | _t_runc |0x00000000|extern| | | | _units |0x00000000|extern| | | | mcount |0x00000000|extern| | | | _f_back |0x00000008|extern| | | |.text Symbols from plibI77.a[close.o]: Name Value Class Type Size Line Section _abort |0x00000000|extern| | | | _avunit |0x00000000|extern| | | | _fclose |0x00000000|extern| | | | _fflush |0x00000000|extern| | | | _free |0x00000000|extern| | | | _getenv |0x00000000|extern| | | | _getunit |0x00000000|extern| | | | _lfn_flag |0x00000000|extern| | | | _lunit |0x00000000|extern| | | | _t_runc |0x00000000|extern| | | | _unitmap |0x00000000|extern| | | | _units |0x00000000|extern| | | | _unlink |0x00000000|extern| | | | mcount |0x00000000|extern| | | | _f_clos |0x00000008|extern| | | |.text _f_exit |0x000001fc|extern| | | |.text _flush_ |0x0000027c|extern| | | |.text Symbols from plibI77.a[dfe.o]: Name Value Class Type Size Line Section __filbuf |0x00000000|extern| | | | __flsbuf |0x00000000|extern| | | | _back |0x00000000|extern| | | | _cf |0x00000000|extern| | | | _checkmode |0x00000000|extern| | | | _cursor |0x00000000|extern| | | | _curunit |0x00000000|extern| | | | _doed |0x00000000|extern| | | | _doend |0x00000000|extern| | | | _doned |0x00000000|extern| | | | _donewrec |0x00000000|extern| | | | _dorevert |0x00000000|extern| | | | _elist |0x00000000|extern| | | | _en_fio |0x00000000|extern| | | | _errno |0x00000000|extern| | | | _external |0x00000000|extern| | | | _f_init |0x00000000|extern| | | | _fatal |0x00000000|extern| | | | _fk_open |0x00000000|extern| | | | _fmt_bg |0x00000000|extern| | | | _fmtbuf |0x00000000|extern| | | | _formatted |0x00000000|extern| | | | _fseek |0x00000000|extern| | | | _getn |0x00000000|extern| | | | _getunit |0x00000000|extern| | | | _init |0x00000000|extern| | | | _lunit |0x00000000|extern| | | | _nowreading |0x00000000|extern| | | | _nowwriting |0x00000000|extern| | | | _pars_f |0x00000000|extern| | | | _putn |0x00000000|extern| | | | _rd_ed |0x00000000|extern| | | | _rd_ned |0x00000000|extern| | | | _reading |0x00000000|extern| | | | _recpos |0x00000000|extern| | | | _scale |0x00000000|extern| | | | _sequential |0x00000000|extern| | | | _units |0x00000000|extern| | | | _w_ed |0x00000000|extern| | | | _w_ned |0x00000000|extern| | | | mcount |0x00000000|extern| | | | _icnum |0x00000004|extern| | | | _s_rdfe |0x00000008|extern| | | |.text _s_wdfe |0x00000128|extern| | | |.text _e_rdfe |0x00000248|extern| | | |.text _e_wdfe |0x00000278|extern| | | |.text _c_dfe |0x000002a8|extern| | | |.text _y_getc |0x00000478|extern| | | |.text _y_putc |0x00000594|extern| | | |.text _y_back |0x00000678|extern| | | |.text _y_err |0x0000069c|extern| | | |.text _y_rnew |0x000006f4|extern| | | |.text _y_wnew |0x00000760|extern| | | |.text Symbols from plibI77.a[due.o]: Name Value Class Type Size Line Section _cf |0x00000000|extern| | | | _checkmode |0x00000000|extern| | | | _curunit |0x00000000|extern| | | | _elist |0x00000000|extern| | | | _errno |0x00000000|extern| | | | _external |0x00000000|extern| | | | _f_init |0x00000000|extern| | | | _fatal |0x00000000|extern| | | | _fk_open |0x00000000|extern| | | | _formatted |0x00000000|extern| | | | _fseek |0x00000000|extern| | | | _ftell |0x00000000|extern| | | | _getunit |0x00000000|extern| | | | _init |0x00000000|extern| | | | _lunit |0x00000000|extern| | | | _nowreading |0x00000000|extern| | | | _nowwriting |0x00000000|extern| | | | _reading |0x00000000|extern| | | | _recpos |0x00000000|extern| | | | _sequential |0x00000000|extern| | | | _units |0x00000000|extern| | | | mcount |0x00000000|extern| | | | _s_rdue |0x00000008|extern| | | |.text _s_wdue |0x0000007c|extern| | | |.text _c_due |0x000000f0|extern| | | |.text _e_rdue |0x000002f4|extern| | | |.text _e_wdue |0x000003f4|extern| | | |.text Symbols from plibI77.a[endfile.o]: Name Value Class Type Size Line Section __iob |0x00000000|extern| | | | _errno |0x00000000|extern| | | | _execl |0x00000000|extern| | | | _exit |0x00000000|extern| | | | _fatal |0x00000000|extern| | | | _fclose |0x00000000|extern| | | | _fflush |0x00000000|extern| | | | _fk_open |0x00000000|extern| | | | _fopen |0x00000000|extern| | | | _fork |0x00000000|extern| | | | _fprintf |0x00000000|extern| | | | _fread |0x00000000|extern| | | | _fseek |0x00000000|extern| | | | _ftell |0x00000000|extern| | | | _fwrite |0x00000000|extern| | | | _getunit |0x00000000|extern| | | | _lunit |0x00000000|extern| | | | _mktemp |0x00000000|extern| | | | _nowreading |0x00000000|extern| | | | _strcpy |0x00000000|extern| | | | _units |0x00000000|extern| | | | _unlink |0x00000000|extern| | | | _wait |0x00000000|extern| | | | mcount |0x00000000|extern| | | | _f_end |0x00000008|extern| | | |.text _t_runc |0x00000110|extern| | | |.text Symbols from plibI77.a[err.o]: Name Value Class Type Size Line Section __cleanup |0x00000000|extern| | | | __iob |0x00000000|extern| | | | _abort |0x00000000|extern| | | | _avunit |0x00000000|extern| | | | _fprintf |0x00000000|extern| | | | _freopen |0x00000000|extern| | | | _fseek |0x00000000|extern| | | | _fstat |0x00000000|extern| | | | _ftell |0x00000000|extern| | | | _getenv |0x00000000|extern| | | | _isatty |0x00000000|extern| | | | _lfn_flag |0x00000000|extern| | | | _perror |0x00000000|extern| | | | mcount |0x00000000|extern| | | | _back |0x00000004|extern| | | | _cblank |0x00000004|extern| | | | _cf |0x00000004|extern| | | | _cplus |0x00000004|extern| | | | _cursor |0x00000004|extern| | | | _curunit |0x00000004|extern| | | | _doed |0x00000004|extern| | | | _doend |0x00000004|extern| | | | _doned |0x00000004|extern| | | | _donewrec |0x00000004|extern| | | | _dorevert |0x00000004|extern| | | | _elist |0x00000004|extern| | | | _external |0x00000004|extern| | | | _fmtbuf |0x00000004|extern| | | | _formatted |0x00000004|extern| | | | _getn |0x00000004|extern| | | | _init |0x00000004|extern| | | | _lunit |0x00000004|extern| | | | _putn |0x00000004|extern| | | | _reading |0x00000004|extern| | | | _recpos |0x00000004|extern| | | | _scale |0x00000004|extern| | | | _sequential |0x00000004|extern| | | | _fatal |0x00000008|extern| | | |.text _f_init |0x000001bc|extern| | | |.text _canseek |0x00000278|extern| | | |.text _nowreading |0x000002dc|extern| | | |.text _nowwriting |0x0000037c|extern| | | |.text _fortfile |0x000005a8|extern| | | |.data _fortlfile |0x000005b0|extern| | | |.data _F_err |0x000005b8|extern| | | |.data _units |0x00000c00|extern| | | | Symbols from plibI77.a[fmt.o]: Name Value Class Type Size Line Section __iob |0x00000000|extern| | | | _abort |0x00000000|extern| | | | _cblank |0x00000000|extern| | | | _cplus |0x00000000|extern| | | | _cursor |0x00000000|extern| | | | _doed |0x00000000|extern| | | | _doend |0x00000000|extern| | | | _doned |0x00000000|extern| | | | _dorevert |0x00000000|extern| | | | _elist |0x00000000|extern| | | | _errno |0x00000000|extern| | | | _fatal |0x00000000|extern| | | | _fmtbuf |0x00000000|extern| | | | _fprintf |0x00000000|extern| | | | _scale |0x00000000|extern| | | | mcount |0x00000000|extern| | | | _cp |0x00000004|extern| | | | _nonl |0x00000004|extern| | | | _parenlvl |0x00000004|extern| | | | _pc |0x00000004|extern| | | | _revloc |0x00000004|extern| | | | _rp |0x00000004|extern| | | | _workdone |0x00000004|extern| | | | _pars_f |0x00000008|extern| | | |.text _cnt |0x00000028|extern| | | | _ret |0x00000028|extern| | | | _f_s |0x00000060|extern| | | |.text _f_list |0x00000110|extern| | | |.text _i_tem |0x000001ec|extern| | | |.text _ne_d |0x0000029c|extern| | | |.text _e_d |0x00000600|extern| | | |.text _op_gen |0x00000a04|extern| | | |.text _gt_num |0x00000aa4|extern| | | |.text _en_fio |0x00000b48|extern| | | |.text _do_fio |0x00000b84|extern| | | |.text _fmt_bg |0x00000f60|extern| | | |.text _type_f |0x00000fa8|extern| | | |.text _ap_end |0x0000100c|extern| | | |.text _syl |0x000012c0|extern| | | | Symbols from plibI77.a[fmtlib.o]: Name Value Class Type Size Line Section _strcpy |0x00000000|extern| | | | _strlen |0x00000000|extern| | | | mcount |0x00000000|extern| | | | _icvt |0x00000008|extern| | | |.text _icvt_oz |0x000000e4|extern| | | |.text Symbols from plibI77.a[iio.o]: Name Value Class Type Size Line Section _back |0x00000000|extern| | | | _cblank |0x00000000|extern| | | | _cplus |0x00000000|extern| | | | _cursor |0x00000000|extern| | | | _doed |0x00000000|extern| | | | _doend |0x00000000|extern| | | | _doned |0x00000000|extern| | | | _donewrec |0x00000000|extern| | | | _dorevert |0x00000000|extern| | | | _elist |0x00000000|extern| | | | _en_fio |0x00000000|extern| | | | _errno |0x00000000|extern| | | | _external |0x00000000|extern| | | | _fatal |0x00000000|extern| | | | _fmt_bg |0x00000000|extern| | | | _fmtbuf |0x00000000|extern| | | | _formatted |0x00000000|extern| | | | _getn |0x00000000|extern| | | | _pars_f |0x00000000|extern| | | | _putn |0x00000000|extern| | | | _rd_ed |0x00000000|extern| | | | _rd_ned |0x00000000|extern| | | | _reading |0x00000000|extern| | | | _recpos |0x00000000|extern| | | | _scale |0x00000000|extern| | | | _sequential |0x00000000|extern| | | | _w_ed |0x00000000|extern| | | | _w_ned |0x00000000|extern| | | | mcount |0x00000000|extern| | | | _icend |0x00000004|extern| | | | _icnum |0x00000004|extern| | | | _icptr |0x00000004|extern| | | | _svic |0x00000004|extern| | | | _z_getc |0x00000008|extern| | | |.text _z_putc |0x000000d8|extern| | | |.text _z_back |0x000001b4|extern| | | |.text _z_rnew |0x000001e8|extern| | | |.text _z_rnew1 |0x00000238|extern| | | |.text _z_rnewdor |0x00000268|extern| | | |.text _s_rsfi |0x000002b4|extern| | | |.text _s_wsfi |0x0000034c|extern| | | |.text _c_si |0x000003e0|extern| | | |.text _z_wnew |0x000004cc|extern| | | |.text _z_wnewdor |0x0000053c|extern| | | |.text _e_rsfi |0x000005a4|extern| | | |.text _e_wsfi |0x000005dc|extern| | | |.text _y_ierr |0x0000066c|extern| | | |.text Symbols from plibI77.a[inquire.o]: Name Value Class Type Size Line Section _avunit |0x00000000|extern| | | | _b_char |0x00000000|extern| | | | _ftell |0x00000000|extern| | | | _g_char |0x00000000|extern| | | | _getenv |0x00000000|extern| | | | _getunit |0x00000000|extern| | | | _inode |0x00000000|extern| | | | _isdev |0x00000000|extern| | | | _lfn_flag |0x00000000|extern| | | | _lunit |0x00000000|extern| | | | _strcpy |0x00000000|extern| | | | _units |0x00000000|extern| | | | mcount |0x00000000|extern| | | | _f_inqu2 |0x00000008|extern| | | |.text _f_inqu |0x0000049c|extern| | | |.text Symbols from plibI77.a[lio.o]: Name Value Class Type Size Line Section __flsbuf |0x00000000|extern| | | | _c_le |0x00000000|extern| | | | _cf |0x00000000|extern| | | | _curunit |0x00000000|extern| | | | _external |0x00000000|extern| | | | _f_init |0x00000000|extern| | | | _fatal |0x00000000|extern| | | | _formatted |0x00000000|extern| | | | _init |0x00000000|extern| | | | _lioproc |0x00000000|extern| | | | _nowwriting |0x00000000|extern| | | | _putn |0x00000000|extern| | | | _reading |0x00000000|extern| | | | _recpos |0x00000000|extern| | | | _scale |0x00000000|extern| | | | _sprintf |0x00000000|extern| | | | _strlen |0x00000000|extern| | | | _wrt_E |0x00000000|extern| | | | _wrt_F |0x00000000|extern| | | | _wrt_L |0x00000000|extern| | | | mcount |0x00000000|extern| | | | _s_wsle |0x00000008|extern| | | |.text _e_wsle |0x000000a4|extern| | | |.text _t_putc |0x000000dc|extern| | | |.text _lwrt_I |0x00000168|extern| | | |.text _lwrt_L |0x000001f4|extern| | | |.text _lwrt_A |0x00000254|extern| | | |.text _lwrt_F |0x000002d4|extern| | | |.text _lwrt_C |0x000003b8|extern| | | |.text _l_write |0x0000045c|extern| | | |.text Symbols from plibI77.a[lread.o]: Name Value Class Type Size Line Section __ctype |0x00000000|extern| | | | __filbuf |0x00000000|extern| | | | _b_char |0x00000000|extern| | | | _cf |0x00000000|extern| | | | _curunit |0x00000000|extern| | | | _elist |0x00000000|extern| | | | _errno |0x00000000|extern| | | | _external |0x00000000|extern| | | | _f_init |0x00000000|extern| | | | _fatal |0x00000000|extern| | | | _fk_open |0x00000000|extern| | | | _fmtbuf |0x00000000|extern| | | | _formatted |0x00000000|extern| | | | _free |0x00000000|extern| | | | _fscanf |0x00000000|extern| | | | _getunit |0x00000000|extern| | | | _init |0x00000000|extern| | | | _lunit |0x00000000|extern| | | | _malloc |0x00000000|extern| | | | _nowreading |0x00000000|extern| | | | _reading |0x00000000|extern| | | | _realloc |0x00000000|extern| | | | _recpos |0x00000000|extern| | | | _scale |0x00000000|extern| | | | _ungetc |0x00000000|extern| | | | _units |0x00000000|extern| | | | mcount |0x00000000|extern| | | | _l_comma |0x00000001|extern| | | | _l_first |0x00000001|extern| | | | _lchar |0x00000004|extern| | | | _lcount |0x00000004|extern| | | | _lioproc |0x00000004|extern| | | | _lquit |0x00000004|extern| | | | _ltype |0x00000004|extern| | | | _lx |0x00000008|extern| | | | _ly |0x00000008|extern| | | | _t_getc |0x00000008|extern| | | |.text _e_rsle |0x000000b0|extern| | | |.text _l_read |0x0000010c|extern| | | |.text _l_R |0x000004d0|extern| | | |.text _rd_int |0x000007d0|extern| | | |.text _lr_comm |0x000008e0|extern| | | |.text _l_C |0x00000978|extern| | | |.text _l_L |0x00000c8c|extern| | | |.text _l_CHAR |0x00000ee8|extern| | | |.text _s_rsle |0x00001228|extern| | | |.text _c_le |0x000012d0|extern| | | |.text _do_lio |0x00001418|extern| | | |.text _ltab |0x00001618|extern| | | |.data Symbols from plibI77.a[nio.o]: Name Value Class Type Size Line Section __ctype |0x00000000|extern| | | | __filbuf |0x00000000|extern| | | | __flsbuf |0x00000000|extern| | | | _b_char |0x00000000|extern| | | | _cf |0x00000000|extern| | | | _curunit |0x00000000|extern| | | | _elist |0x00000000|extern| | | | _errno |0x00000000|extern| | | | _external |0x00000000|extern| | | | _f_init |0x00000000|extern| | | | _fatal |0x00000000|extern| | | | _fk_open |0x00000000|extern| | | | _fmtbuf |0x00000000|extern| | | | _formatted |0x00000000|extern| | | | _fputs |0x00000000|extern| | | | _free |0x00000000|extern| | | | _ftell |0x00000000|extern| | | | _getunit |0x00000000|extern| | | | _init |0x00000000|extern| | | | _ltab |0x00000000|extern| | | | _lunit |0x00000000|extern| | | | _malloc |0x00000000|extern| | | | _nowreading |0x00000000|extern| | | | _nowwriting |0x00000000|extern| | | | _reading |0x00000000|extern| | | | _realloc |0x00000000|extern| | | | _recpos |0x00000000|extern| | | | _scale |0x00000000|extern| | | | _sequential |0x00000000|extern| | | | _sprintf |0x00000000|extern| | | | _strcmp |0x00000000|extern| | | | _strlen |0x00000000|extern| | | | _t_getc |0x00000000|extern| | | | _t_putc |0x00000000|extern| | | | _tolower |0x00000000|extern| | | | _ungetc |0x00000000|extern| | | | _units |0x00000000|extern| | | | mcount |0x00000000|extern| | | | _l_comma |0x00000001|extern| | | | _flagtabchar |0x00000004|extern| | | | _lastchar |0x00000004|extern| | | | _nio_lchar |0x00000004|extern| | | | _nio_lcount |0x00000004|extern| | | | _nio_ltype |0x00000004|extern| | | | _nio_lx |0x00000008|extern| | | | _nio_ly |0x00000008|extern| | | | _nio_read |0x00000008|extern| | | |.text _tabind |0x00000028|extern| | | | _niol_R |0x000003bc|extern| | | |.text _niord_int |0x000006f8|extern| | | |.text _niol_C |0x00000808|extern| | | |.text _niol_L |0x00000ba4|extern| | | |.text _niol_CHAR |0x00000e24|extern| | | |.text _s_rsne |0x0000121c|extern| | | |.text _getword |0x0000157c|extern| | | |.text _recupind |0x00001800|extern| | | |.text _findit |0x00001b1c|extern| | | |.text _getvar |0x00001b7c|extern| | | |.text _s_wsne |0x00002014|extern| | | |.text _c_nle |0x000025f8|extern| | | |.text Symbols from plibI77.a[open.o]: Name Value Class Type Size Line Section _access |0x00000000|extern| | | | _canseek |0x00000000|extern| | | | _close |0x00000000|extern| | | | _creat |0x00000000|extern| | | | _curunit |0x00000000|extern| | | | _errno |0x00000000|extern| | | | _f_clos |0x00000000|extern| | | | _fatal |0x00000000|extern| | | | _fopen |0x00000000|extern| | | | _fortfile |0x00000000|extern| | | | _fortlfile |0x00000000|extern| | | | _fseek |0x00000000|extern| | | | _g_char |0x00000000|extern| | | | _getenv |0x00000000|extern| | | | _inode |0x00000000|extern| | | | _lunit |0x00000000|extern| | | | _malloc |0x00000000|extern| | | | _mktemp |0x00000000|extern| | | | _rewind |0x00000000|extern| | | | _setunit |0x00000000|extern| | | | _sprintf |0x00000000|extern| | | | _stat |0x00000000|extern| | | | _strcpy |0x00000000|extern| | | | _strlen |0x00000000|extern| | | | _units |0x00000000|extern| | | | mcount |0x00000000|extern| | | | _f_setlfnflag |0x00000008|extern| | | |.text _f_setl |0x00000028|extern| | | |.text _f_open |0x00000048|extern| | | |.text _fk_open |0x0000094c|extern| | | |.text _isdev |0x00000a40|extern| | | |.text _checkmode |0x00000aa8|extern| | | |.text _lfn_flag |0x00000c88|extern| | | |.data Symbols from plibI77.a[rdfmt.o]: Name Value Class Type Size Line Section __iob |0x00000000|extern| | | | _abort |0x00000000|extern| | | | _back |0x00000000|extern| | | | _cblank |0x00000000|extern| | | | _cf |0x00000000|extern| | | | _cursor |0x00000000|extern| | | | _donewrec |0x00000000|extern| | | | _elist |0x00000000|extern| | | | _errno |0x00000000|extern| | | | _fatal |0x00000000|extern| | | | _fmtbuf |0x00000000|extern| | | | _fprintf |0x00000000|extern| | | | _getn |0x00000000|extern| | | | _howmany_pos |0x00000000|extern| | | | _recpos |0x00000000|extern| | | | _scale |0x00000000|extern| | | | _tolower |0x00000000|extern| | | | mcount |0x00000000|extern| | | | _rd_ed |0x00000008|extern| | | |.text _rd_ned |0x0000022c|extern| | | |.text _rd_Ix |0x00000310|extern| | | |.text _rd_I |0x000005b0|extern| | | |.text _rd_Q |0x000006c4|extern| | | |.text _rd_L |0x0000071c|extern| | | |.text _rd_F |0x000007f8|extern| | | |.text _rd_A |0x00000d58|extern| | | |.text _rd_AW |0x00000dd0|extern| | | |.text _rd_H |0x00000ecc|extern| | | |.text _rd_POS |0x00000f44|extern| | | |.text Symbols from plibI77.a[rewind.o]: Name Value Class Type Size Line Section _errno |0x00000000|extern| | | | _fatal |0x00000000|extern| | | | _fk_open |0x00000000|extern| | | | _ftell |0x00000000|extern| | | | _getunit |0x00000000|extern| | | | _lunit |0x00000000|extern| | | | _nowreading |0x00000000|extern| | | | _rewind |0x00000000|extern| | | | _t_runc |0x00000000|extern| | | | _units |0x00000000|extern| | | | mcount |0x00000000|extern| | | | _f_rew |0x00000008|extern| | | |.text Symbols from plibI77.a[rsfe.o]: Name Value Class Type Size Line Section __filbuf |0x00000000|extern| | | | _back |0x00000000|extern| | | | _c_sfe |0x00000000|extern| | | | _cblank |0x00000000|extern| | | | _cf |0x00000000|extern| | | | _checkmode |0x00000000|extern| | | | _cplus |0x00000000|extern| | | | _cursor |0x00000000|extern| | | | _curunit |0x00000000|extern| | | | _doed |0x00000000|extern| | | | _doend |0x00000000|extern| | | | _doned |0x00000000|extern| | | | _donewrec |0x00000000|extern| | | | _dorevert |0x00000000|extern| | | | _elist |0x00000000|extern| | | | _errno |0x00000000|extern| | | | _external |0x00000000|extern| | | | _f_init |0x00000000|extern| | | | _fatal |0x00000000|extern| | | | _fmt_bg |0x00000000|extern| | | | _fmtbuf |0x00000000|extern| | | | _formatted |0x00000000|extern| | | | _getn |0x00000000|extern| | | | _init |0x00000000|extern| | | | _lunit |0x00000000|extern| | | | _nowreading |0x00000000|extern| | | | _pars_f |0x00000000|extern| | | | _rd_ed |0x00000000|extern| | | | _rd_ned |0x00000000|extern| | | | _reading |0x00000000|extern| | | | _recpos |0x00000000|extern| | | | _scale |0x00000000|extern| | | | _sequential |0x00000000|extern| | | | _ungetc |0x00000000|extern| | | | _units |0x00000000|extern| | | | _x_back |0x00000000|extern| | | | mcount |0x00000000|extern| | | | _s_rsfe |0x00000008|extern| | | |.text _xrd_SL |0x00000198|extern| | | |.text _x_getc |0x00000228|extern| | | |.text _x_endp p q r s |0x00000310|extern| | | |.text _x_rev |0x00000340|extern| | | |.text Symbols from plibI77.a[sfe.o]: Name Value Class Type Size Line Section __filbuf |0x00000000|extern| | | | _cf |0x00000000|extern| | | | _curunit |0x00000000|extern| | | | _en_fio |0x00000000|extern| | | | _errno |0x00000000|extern| | | | _fatal |0x00000000|extern| | | | _fk_open |0x00000000|extern| | | | _fmtbuf |0x00000000|extern| | | | _fseek |0x00000000|extern| | | | _getunit |0x00000000|extern| | | | _lunit |0x00000000|extern| | | | _setunit |0x00000000|extern| | | | _ungetc |0x00000000|extern| | | | _units |0x00000000|extern| | | | mcount |0x00000000|extern| | | | _howmany_pos |0x00000008|extern| | | |.text _e_rsfe |0x00000120|extern| | | |.text _c_sfe |0x00000158|extern| | | |.text _e_wsfe |0x00000284|extern| | | |.text Symbols from plibI77.a[sue.o]: Name Value Class Type Size Line Section _cf |0x00000000|extern| | | | _checkmode |0x00000000|extern| | | | _curunit |0x00000000|extern| | | | _elist |0x00000000|extern| | | | _errno |0x00000000|extern| | | | _external |0x00000000|extern| | | | _f_init |0x00000000|extern| | | | _fatal |0x00000000|extern| | | | _fk_open |0x00000000|extern| | | | _formatted |0x00000000|extern| | | | _fread |0x00000000|extern| | | | _fseek |0x00000000|extern| | | | _ftell |0x00000000|extern| | | | _fwrite |0x00000000|extern| | | | _getunit |0x00000000|extern| | | | _init |0x00000000|extern| | | | _lunit |0x00000000|extern| | | | _nowreading |0x00000000|extern| | | | _nowwriting |0x00000000|extern| | | | _reading |0x00000000|extern| | | | _reclen |0x00000000|extern| | | | _recpos |0x00000000|extern| | | | _sequential |0x00000000|extern| | | | _units |0x00000000|extern| | | | mcount |0x00000000|extern| | | | _recloc |0x00000004|extern| | | | _s_rsue |0x00000008|extern| | | |.text _s_wsue |0x00000140|extern| | | |.text _c_sue |0x00000224|extern| | | |.text _e_wsue |0x000003a4|extern| | | |.text _e_rsue |0x00000434|extern| | | |.text Symbols from plibI77.a[uio.o]: Name Value Class Type Size Line Section _cf |0x00000000|extern| | | | _curunit |0x00000000|extern| | | | _elist |0x00000000|extern| | | | _errno |0x00000000|extern| | | | _fatal |0x00000000|extern| | | | _fread |0x00000000|extern| | | | _fwrite |0x00000000|extern| | | | _reading |0x00000000|extern| | | | _recpos |0x00000000|extern| | | | _sequential |0x00000000|extern| | | | mcount |0x00000000|extern| | | | _reclen |0x00000004|extern| | | | _do_us |0x00000008|extern| | | |.text _do_uio |0x000000dc|extern| | | |.text _do_ud |0x00000124|extern| | | |.text Symbols from plibI77.a[units.o]: Name Value Class Type Size Line Section _fatal |0x00000000|extern| | | | mcount |0x00000000|extern| | | | _setunit |0x00000008|extern| | | |.text _getunit |0x000000b0|extern| | | |.text _unitmap |0x00000170|extern| | | |.data _avunit |0x00000558|extern| | | |.data Symbols from plibI77.a[util.o]: Name Value Class Type Size Line Section _stat |0x00000000|extern| | | | mcount |0x00000000|extern| | | | _g_char |0x00000008|extern| | | |.text _b_char |0x0000008c|extern| | | |.text _inode |0x000000f0|extern| | | |.text _mvgbt |0x00000134|extern| | | |.text Symbols from plibI77.a[getfd.o]: Name Value Class Type Size Line Section _getunit |0x00000000|extern| | | | _units |0x00000000|extern| | | | mcount |0x00000000|extern| | | | _getfp_ |0x00000008|extern| | | |.text _getfd_ |0x00000048|extern| | | |.text Symbols from plibI77.a[f7flsh.o]: Name Value Class Type Size Line Section _fflush |0x00000000|extern| | | | _getunit |0x00000000|extern| | | | _units |0x00000000|extern| | | | mcount |0x00000000|extern| | | | _f7flsh_ |0x00000008|extern| | | |.text Symbols from plibI77.a[wrtfmt.o]: Name Value Class Type Size Line Section __iob |0x00000000|extern| | | | _abort |0x00000000|extern| | | | _back |0x00000000|extern| | | | _cplus |0x00000000|extern| | | | _cursor |0x00000000|extern| | | | _donewrec |0x00000000|extern| | | | _ecvt |0x00000000|extern| | | | _elist |0x00000000|extern| | | | _errno |0x00000000|extern| | | | _fatal |0x00000000|extern| | | | _fcvt |0x00000000|extern| | | | _fmtbuf |0x00000000|extern| | | | _fprintf |0x00000000|extern| | | | _icvt |0x00000000|extern| | | | _icvt_oz |0x00000000|extern| | | | _putn |0x00000000|extern| | | | _recpos |0x00000000|extern| | | | _scale |0x00000000|extern| | | | mcount |0x00000000|extern| | | | _mv_cur |0x00000008|extern| | | |.text _w_ed |0x000000d0|extern| | | |.text _w_ned |0x00000290|extern| | | |.text _wrt_Ix |0x00000368|extern| | | |.text _wrt_I |0x000004c0|extern| | | |.text _wrt_IM |0x000005d8|extern| | | |.text _wrt_AP |0x00000774|extern| | | |.text _wrt_H |0x00000818|extern| | | |.text _wrt_L |0x00000884|extern| | | |.text _wrt_A |0x00000920|extern| | | |.text _wrt_AW |0x00000970|extern| | | |.text _wrt_E |0x000009e4|extern| | | |.text _wrt_G |0x00000d80|extern| | | |.text _wrt_F |0x00000ed0|extern| | | |.text Symbols from plibI77.a[wsfe.o]: Name Value Class Type Size Line Section __flsbuf |0x00000000|extern| | | | _back |0x00000000|extern| | | | _c_sfe |0x00000000|extern| | | | _cblank |0x00000000|extern| | | | _cf |0x00000000|extern| | | | _checkmode |0x00000000|extern| | | | _cplus |0x00000000|extern| | | | _cursor |0x00000000|extern| | | | _curunit |0x00000000|extern| | | | _doed |0x00000000|extern| | | | _doend |0x00000000|extern| | | | _doned |0x00000000|extern| | | | _donewrec |0x00000000|extern| | | | _dorevert |0x00000000|extern| | | | _elist |0x00000000|extern| | | | _errno |0x00000000|extern| | | | _external |0x00000000|extern| | | | _f_init |0x00000000|extern| | | | _fatal |0x00000000|extern| | | | _fmt_bg |0x00000000|extern| | | | _fmtbuf |0x00000000|extern| | | | _formatted |0x00000000|extern| | | | _init |0x00000000|extern| | | | _lunit |0x00000000|extern| | | | _nonl |0x00000000|extern| | | | _nowwriting |0x00000000|extern| | | | _pars_f |0x00000000|extern| | | | _putn |0x00000000|extern| | | | _reading |0x00000000|extern| | | | _recpos |0x00000000|extern| | | | _scale |0x00000000|extern| | | | _sequential |0x00000000|extern| | | | _units |0x00000000|extern| | | | _w_ed |0x00000000|extern| | | | _w_ned |0x00000000|extern| | | | _workdone |0x00000000|extern| | | | mcount |0x00000000|extern| | | | _s_wsfe |0x00000008|extern| | | |.text _x_putc |0x000001a4|extern| | | |.text _x_back |0x00000250|extern| | | |.text _pr_put |0x00000274|extern| | | |.text _x_wSL |0x00000414|extern| | | |.text _xw_end |0x00000454|extern| | | |.text _xw_rev |0x00000490|extern| | | |.text ! / 548426658 0 0 0 2648 ` 11111>R>RH6H6H6H6H6H6H6H6H6H6H6H6H6H6H6H6H6H6H6H6H6H6H6H6H6H6H6H6H6H6H6H6\\\\\\\\\\\\\\\\\\\\\\\BBBBBBBBBBBBBBBBBB<<<<<<<<<``````````````````````FxFxFxFxFxFxFx_(_(_(_(_(_(_(_(_(_(_(~`hhhhh0000FFFFzz^ppppppp_f_back_f_clos_f_exit_flush__s_rdfe_c_dfe_y_getc_y_back_y_rnew_y_err_s_wdfe_y_putc_y_wnew_e_rdfe_e_wdfe_icnum_s_rdue_c_due_s_wdue_e_rdue_e_wdue_f_end_t_runc_fatal_F_err_elist_curunit_lunit_fmtbuf_reading_sequential_formatted_external_f_init_units_init_canseek_nowreading_nowwriting_getn_putn_back_cf_recpos_fortfile_fortlfile_cplus_cblank_doed_doned_doend_donewrec_dorevert_cursor_scale_pars_f_pc_revloc_parenlvl_f_s_op_gen_f_list_i_tem_ne_d_e_d_gt_num_ap_end_syl_en_fio_do_fio_type_f_cp_cnt_workdone_rp_ret_nonl_fmt_bg_icvt_icvt_oz_z_getc_icptr_icend_svic_z_putc_z_back_z_rnew_icnum_z_rnew1_z_rnewdor_s_rsfi_c_si_s_wsfi_z_wnewdor_z_wnew_e_rsfi_e_wsfi_y_ierr_f_inqu2_f_inqu_s_wsle_t_putc_l_write_e_wsle_lwrt_I_lwrt_L_lwrt_A_lwrt_F_lwrt_C_t_getc_e_rsle_l_read_lquit_lcount_ltype_l_first_l_comma_l_R_l_C_l_L_l_CHAR_lx_ly_lchar_lr_comm_rd_int_ltab_s_rsle_c_le_lioproc_do_lio_nio_read_nio_lcount_nio_ltype_l_comma_niol_R_niol_C_niol_L_niol_CHAR_nio_lx_nio_ly_nio_lchar_niord_int_s_rsne_tabind_c_nle_getword_lastchar_findit_getvar_flagtabchar_recupind_s_wsne_f_setlfnflag_lfn_flag_f_setl_f_open_isdev_fk_open_checkmode_rd_ed_rd_I_rd_Ix_rd_L_rd_A_rd_AW_rd_F_rd_Q_rd_ned_rd_POS_rd_H_f_rew_s_rsfe_x_getc_x_endp_xrd_SL_x_rev_howmany_pos_e_rsfe_c_sfe_e_wsfe_s_rsue_c_sue_s_wsue_recloc_e_wsue_e_rsue_do_us_reclen_do_uio_do_ud_setunit_unitmap_avunit_getunit_g_char_b_char_inode_mvgbt_getfp__getfd__f7flsh__mv_cur_w_ed_wrt_I_wrt_IM_wrt_Ix_wrt_L_wrt_A_wrt_AW_wrt_E_wrt_G_wrt_F_w_ned_wrt_AP_wrt_H_s_wsfe_x_putc_x_back_xw_end_xw_rev_x_wSL_pr_putbackspace.o/ 548426394 98 100 100664 1820 ` u R.text% .datapd@.bssHHx`PDH~P @2 eeeP0߀D)h2 rr$>r  p 4 jj0j$ @ pq pq ~6D!`8t!N.t"(!6"p  p  p 8*'T tT0 $8.t!j! Վp Ht, <` L~PɎHǮDxxW @(#)backspace.c 4.3 87/05/13 @(#)fio.h 4.3 87/05/13 backspacebackspacebackspacebackspace 0: T bh t v       "( @H\Pr  .text%.datap.bssH_f_backnmcountn_getunitn_lunitn_errnon_fataln_unitsn_fk_openn_ftelln_t_runcnn_fseekn_freadn_nowreadingclose.o/ 548426400 98 100 100664 1962 ` u R.text+ .datap\@.bss@@@`(P~8@ 0p  f d(d(4D(*D( K! k!$ ."  `*&"pp  r`*&"pp(i~8@@WP`0P8~@DpހLHD0p@~@Ɏ8PPW@`8P~~8p Z0p@~8@@W @(#)close.c 4.4 87/05/13 @(#)fio.h 4.3 87/05/13 @(#)units.h 4.3 87/05/13 (2 D F P R V X      "$,8L PRb  " $ (*~  .text+.datap.bss@_f_closnXmcountnX_getunitnX_lunitnX_unitsnX_t_runcnX_fclosenX_abortnX_freenX_avunitnX_unitmapnXnX_getenvnX_unlinknX_f_exitnX_flush_|nX_fflushnX_lfn_flagdfe.o/ 548426410 98 100 100664 6032 ` u R;.text \ .datal@.bss@`(P~<p t$  bH2dd0d$ w~<@@W@`8Pҧ~<p T$ (2dd@d$ w~<@@W0 `PPГ00W0 `XPГt00W@``PR~<pp@2eete$0F'4hhpjh2ffl"fx2hhhh< "   ~<@@W8`P F !  B`   n d   42  ~ } | { z y x wxv;vGvQv_elistv_recposv_scalev_cursorv_getunitv_lunitv_unitsv_fk_openv_cfv_fseekv__filbufv__flsbufv_icnumv\_nowreading_dorevert_donewrec_checkmode_nowwriting_sequential_external_formatteddue.o/ 548426416 98 100 100664 3184 ` u R !.text,^ .data@.bss8`HP > w$ 88W8`PP~^ > Rw$ ,88W@`XP ~<p @2eede|0pH'P4hh`"h2fflf2hhthp2rr|br4!  8 ~<@@W@`P~<   ! $$ !zph 8ȶ2ȋ~<@@W0 `PГ00W @(#)due.c 4.3 87/05/13 @(#)fio.h 4.3 87/05/13 duestartiocduecduecduesyserr 4 < P R b ~      *DRXhpv~   "(4 6 P^dp r       , . 68>@XZl n vx|~  .text^.data.bss_s_rdueq(mcountq(_c_dueq(_readingq(q(_curunitq(q(_s_wdue|q(q(_initq(_f_initq(_getunitq(_lunitq(_errnoq(_fatalq('q(2q(_recposq(>q(_unitsq(_elistq(_fk_openq(_cfq(_fseekq(_e_rdueq(_ftellq(_e_wdueq(H_checkmode_nowreading_nowwriting_formatted_sequential_externalendfile.o/ 548426421 98 100 100664 2472 ` u R .text@l9 .data@@@.bssH`xP~@@2eee0pD(p2rrFr6  "$ ~@HHW`PHP~X p"p  \r$ bΐ\T\D 2HR^hrvx~    .text@9.data@.bss_f_endpmcountp_getunitp_lunitp_errnop_fatalp_unitsp_fk_openpp_t_runcp_ftellp_fseekp_strcpyp_mktempp_fopenp_freadp_fwritep_fflushp_forkp_execlp__iobp_fprintfp_exitp_waitp_fclosep_unlinkp_nowreadingerr.o/ 548426429 98 100 100664 5210 ` u R4.text8 Ln .data88t@.bssP`P0!~Ld0΋^ @0 $p1 ̓p00p! ԓ$    $ ,04 0@H T@` @l ( N,nhb~LPPW8 `xP>ȧ~4p $pX$p  *$~488W``P~<p @dFz N ~<``WH`P~@p$  '  ~@HHWH`P~<~@p`$ BǗǗ' $'   ~@Ǟ<HHW @(#)err.c 4.4 87/05/13 @(#)fio.h 4.3 87/05/13 @(#)units.h 4.3 87/05/13 %s: illegal error number %d %s: end of file %d %s: %s apparent state: unit %d named %s last format: %s lately %s %s %s %s IO readingwritingsequentialdirectformattedunformattedexternalinternalrw+r+(08H\x(Hdx 0DXtfort.%dFORT%derror in formatillegal unit numberformatted io not allowedunformatted io not alloweddirect io not allowedsequential io not allowedcan't backspace filenull file namecan't stat fileunit not connectedoff end of recordtruncation failed in endfileincomprehensible list inputout of free spaceunit not connectedread unexpected characterblank logical input fieldnew file existmaximum number of concurrently open files exceededopening mode violationillegal modebad variable typebad namelist namevariable not in namelistno end recordvariable count incorrectlogical file name not defined 4D F LR ` b hn           &*,6BFHR^bdnz~            68< > DH J z   <B!^"~ !!"  .text8n.data8.bss_fatalvmcountv_perrorv__iobv_fprintfv_F_errv_elistv_curunitv_lunitv_avunitv_fmtbufv_readingvvvv%v_abortv_f_initv_units v_initv_canseekxv_fstatv_isattyv/v_ftellv;v_getenvv_freopenv_fseekvE|v_getnv_putnv_backv_cfv_recposvQv[v_cplusv_cblankv_doedv_donedv_doendvfvpv_cursorv_scalevz_sequential_formatted_external__cleanup_nowreading_lfn_flag_nowwriting_fortfile_fortlfile_donewrec_dorevertfmt.o/ 548426446 98 100 100664 10422 ` u R%-.text .datax$@.bss8`P ( 88WH`P~Dp!q q( ^  0 B@p q ~DHHWH`P~Dpq p q , qX)L  0`q( 0Hqa~DHHWP`P~Dp) pH~HVHH:LNLp 0  ~DPPWP`P^@~Hp'X(ZP(!p""W"(r( .B(X"(L!p""0W"b(6b( Tx(p(!p""W" 0h! 0Tqz Z 0X 0Bs Sΐq*p Pΐq ΐ  0 0؋qLbp h(h(DH(VH( P >X \(p(p( x 4 LLL 02L 0L' 0Lp  0 ԧ l L q"r R qL Lpq  0X* 0D 0.qx~HɎ@PPWh`PDH~PpXtXp 0'qQ(A1(20>!p""W"q( 0Z(#p""0W"z!"\p\.q`p `E2e* \.`06qd|p \.`>dp\Dp\V.q` p `\.` 0`\p\.q`p `\.`"0# 0\|p\ 0‹zqg 0(:9(.\$p\6 0j" 0V\p\.q`p `\.`0\p\.q`hp `\.`0`\4n\p`D. 0n&q`\.`p 0H x~PɞHǾDhhWP`P<@~Hs`p߰," { ~Hɞ@Ǿ<PPW`PV A~r09   !8 (2 0("  !r ~ǞW@`P<< @@WX?`ȓPv@H~Ppp pW !'0 0ddPdWT`p"Wp0+W8,"4(p0p`p.pW W HW&  y~PɞHɾ@XXW`XPW``PR!# !!p""hW"0(  W8`P 2!* !  <!dd~88W @(#)fmt.c 4.3 87/05/13 @(#)fio.h 4.3 87/05/13 @(#)fmt.h 4.3 87/05/13 ^^T^^^(^x^^(^^^:^8^$<<<<<<<<<<d^^^^^^^^^T^^^L  h XL  h Xformat too complicated: %s  \ x D pfmtfmtunknown code in do_fio: %d %s do_fiobad string "* 0 bh        Xl      , . 6 8 F H L N T Z ` t v    J P                  " 2 8 D F R T \ d f n x z      ! !    " "  #           ( * : H N \ ^ f r  v x  $ $ $ %         $ $ $    $ $$%%"($2:!<!H#J#X&Z&t!v!'(()** "*bhp,x$#% Z\n~  $(048<@DHLPTX\`dhlptx|  $(048<@DHLPTX\`dhlptx|  $hlptx|.text.datax.bss_pars_fmcount_pc_revloc_f_s`_op_gen _f_list_i_tem_ne_d_e_d_gt_num _ap_end _syl_fmtbuf__iob_fprintf_abort_en_fio H_do_fio _type_f_elist_errno_fatal_doned_cp_cnt(_doend_doed_rp_ret(_nonl_cplus_scale_cblank_fmt_bg`_cursor"_parenlvl_workdone_dorevertfmtlib.o/ 548426451 98 100 100664 1352 ` u Rl .textXd .dataXX@.bssx@`xP@~8s@b@<@@* ڋb$0<; 0@1!@ ~8@@WX`P<@Hѩ~Pύ  p @Hs tp01 d08t  R 1 c Gt`  p c H00  1!0   ~PɞHɾ@<XXW @(#)fmtlib.c 4.3 87/05/13 21474836480123456789abcdef** impossible conversion : too long ** LTZfv| 4.textX.dataX.bssx_icvtmhmcountmh_strcpymh_icvt_ozmh_strlenmhiio.o/ 548426459 98 100 100664 5491 ` u R5.text< .dataL@.bss8`P(2l6nnFn88W8` P" (8nn(nr :nn0nn88W`8PFW`@P W0 `HP§Г00W`PP W8`XPF d Tȶ 88W8``P~ `D88W@`hP~<p 4ddpdxpp ~<@@W`P. W`P W0 `PVГH00W0 `PГ  B 00W8`PnnZn88W @(#)iio.c 4.3 87/05/13 @(#)fio.h 4.3 87/05/13 @(#)fmt.h 4.3 87/05/13 endfilerecendinwriterecendstartintiio " $ . 0 @ LR \ ^ h l n z|       "( 4 6 @ D F RT^l n         $ *:@jpt v z| (4 NTx|"~"##$ '( .4 B)J*R+Z,`-f.l/r0x ~         "*>DLNXd f p t v  2'2  '   ",8 : D H J nt--  .text.data.bss_z_getcsmcounts_icptrs_icends_svics_errnos_fatals_recposs_z_putcs_z_backs_z_rnews_icnums_cursors_z_rnew18shs_s_rsfis_c_sis_readings_rd_eds_doeds_rd_neds_doneds_getns_backss_doendss_s_wsfiLs_w_eds_w_neds_putns#<s_z_wnews_fmtbufs_pars_fs_fmt_bgs.s9sE  s_elists_scales_cpluss_cblanks_e_rsfis_en_fios_e_wsfis_y_ierrlsO_z_rnewdor_dorevert_donewrec_z_wnewdor_formatted_sequential_external inquire.o/ 548426471 98 100 100664 4366 ` u R\.text ( ` .data ( (( @.bss P PH` P<~@p' .H0 NH@ VHA!A 1HAHH !(HJHH0H&0 !0@8@0߀0 0 g`0 ^2$0p0 g `> '$Hȋ$' 7$#(`D@8 ', t(', Z0D &0'4 ,0'4 8T H&8'< ԋ8'< @`>"'D @'D vH'L \PB $P'T .P'T ̓X \`,( ( ``D@8'd ԓ`'d ܓ~@Ǟ<HHWH` P^<~@p' .H20 NH@ VHA!A 1HAHH !(HHHH0 !0@8N@0߀0 0 g`0 ^2$0p0 g `> '$H4$' 7$#(`D@8 ', (', 0D &0'4 0'4 ~8T Hf&8'< @8'< &@`>"'D @'D (H'L PB $P'T P'T 4X  \`,( J( ``D@8'd < `'d D~@Ǟ<HHW @(#)inquire.c 4.4 87/05/13 @(#)fio.h 4.3 87/05/13 @(#)units.h 4.3 87/05/13 yesyesnoyesnoyesdirectsequentialformattedunformattedunknownzeronullyesyesnoyesnoyesdirectsequentialformattedunformattedunknownzeronull <      *< >   :^(.BHjp$\bv|< > L f p z |   T V hj"6<dj~ 4:bhz  .text (`.data ((.bss P_f_inqu2wpmcountwp_g_charwpwp_getenvwp_strcpywp_inodewp_unitswp_getunitwp_lunitwp_avunitwp_b_charwp_isdevwp_ftellwp_f_inquwp_lfn_flaglio.o/ 548426479 98 100 100664 3609 ` u R $$.textdF .datat @.bss8 `HPȧ~4p N|$~~488W8`PPV "88W8`XP $  !؋&111 88WP``P ~@DhtDj  P! ,~Dq ~@PPW@`pPX.`P X$@@W@`xP4~8 P V Dp0q~8Ǟ4@@WH`P&`.h` 0: 2 ?0: R @$0: D P `(8PP l(k`,)3`HHWP`PB@~HrP  (.{ ,.{)~Hɞ@PPWh`PHPX~`qVXVQ^d,pWDz ' eދ dȋ743''3e#4(|783d#4(XT^dPx*z`Np ~`ɎXɮPHhhW @(#)lio.c 4.3 87/05/13 @(#)fio.h 4.3 87/05/13 @(#)fmt.h 4.3 87/05/13 @(#)lio.h 4.3 87/05/13 %ldDllunknown type in lio "$. 6 D F N V \ht "*46jp.<V\tv:BR \^z!^d#.textF.data .bss_s_wsleqmcountq_initq_f_initq_c_leq_curunitq_readingqqq_t_putcq_putnq_l_write\q_lioprocqq_e_wsleq_recposq_cfq__flsbufq_lwrt_Ihq_sprintfq_strlenq_lwrt_Lq_wrt_Lq_lwrt_ATq_lwrt_Fq_scaleq_wrt_Fq_wrt_Eq_lwrt_Cq_fatalq%_external_formatted_nowwriting lread.o/ 548426501 98 100 100664 11665 ` u S) 7.textX,k .dataXXH(0@.bss8`P p !   (   88W8 `ȓPJȧ~4 p( ~488WX`ГP<@H~PqVVҋ` X 2(x D0  &D~! .*l(,`! &/!L dd`pWF <(     20`V  D  8,pW0000$000p7`R7477078)~  p ~PɞHɾ@<XXWh`@P*8~@ 0.H.P.Xp.`' `   0*.`qX? `XXp`0pv 0. 0PJP 6 HP "H H fp"^X 0:2X^H 0:b%69 400 Pp?ހ5!P2H200 Xp?ހ5!X2.H9 :`9 :09 400 Pp?ހ5!P2,Hp@$9)400 P5!P2X 0:*Hp@$00 X5!X2X.P3X X2XX~@ɞ8hhWX`HP*8@H~PP^T0 -2P^T(+P^Tp@$ :K57930@H@4 -"$ rT 2 :  T~PɎHɮ@8XXW@`PP~< `p,p/p~<@@WH`XP~8P dp<ހ8p@@0p *~  4`pphzpXXp0z p (:pppp>plpz,pH\ppx.p(pzpz)p8ppp~8HHW@`Pn~<  L   *  :pppxH`b 0. P 2f0*@FH0 .T04 t0(?z  rppvp<pd '8~<@@WP`P<@~H v  *:ppēbp`HH   ' "ΰ ~  pp̓npl NΠ B 8qqؓqp  ! ! qՊz8 0 \}qq TT  q h$  ~Hɞ@Ǿ<PPW8 `Pҧȧ~4p |Z$R~488W@`P*~<p@2eee0pD'쀆2ffVfN2ggg~<@@WH`P~DpA#7pW~DHHW @(#)lread.c 4.3 87/05/13 @(#)fio.h 4.3 87/05/13 @(#)fmt.h 4.3 87/05/13 @(#)lio.h 4.3 87/05/13  ,<\xlist inlist inlist inlreadno starno (no commano )%dno starlreadlogical%dno starno quoteno spacelioliolist iostler 0 2 D F L T V x z H J XZfhx, 46> @ HP\d f n    ", . PR^`hjpvz| ,.<>LN\^jlxzJ L T    , . 66 8 >j!l!     ( *  2 B X  z     ! !       0 2 B P V ` b t             * 0 J T V  ^ j l r            " 8 : L Z ` p      ! !       "    & ( : J P \ ^ n |     *<N P Xdfx   (!*!> @ HL N TXZ`"vx    .@V X `ln#$DFT%\  *0B'D'N(dfn*t+z,- ./01 .4D2L3P1R1^b4d4j5  <->-  $.textXk.dataXH.bss_t_getcmcount_curunit_cf__filbuf_e_rsle_l_read _lquit_elist_errno_fatal_lcount_ltype_l_first_l_comma_ungetc_l_R_l_C x_l_L _l_CHAR_lx_ly_lchar_b_char_lr_comm_rd_int_ltab__ctype_fscanf_free_malloc_realloc_s_rsle(_init_f_init_c_le_reading_lioproc_fmtbuf_getunit_lunit_recpos_scale_units_fk_open_do_lio%_external_formatted_nowreading nio.o/ 548426538 98 100 100664 22492 ` u S)RB.text'8,L .data'8'8'P()@.bss++``'P@HP~XqٶVYVR^\D 2'\0  &0^! *L,!@ tpp'Wb .H 0    B   2'`V  D  (0p'W000^\P0$000p7`R7477078)  p ~XɎPɮH@``Wh`(P> 8~@HPXp`  ` 0*.`qX? `ZXp`0<pp(Zp.pF 0. 0P"P  HP "H H fp"^X 0:2X^H 0:b%69 400 Pp?ހ5!P2H200 Xp?ހ5!X2.H9 :`9 :09 400 Pp?ހ5!P2,Hp@$9)400 P5!P2X 0:*Hp@$00 X5!X2X.P3X X2XX~@ɞ8hhWX`((P8@H~PP^T0 -2P^T(+P^Tp@$ :K57930@H@4h -"$ JT 2 :  T~PɎHɮ@8XXWH`(0P~8 bހp@@0:pp(8fpXp *  4(P pp(XpZ|-p:pp(`p Lp,z$p &p p (:pp(xpBpDtpz,pHHpp(p pzpz)p<pp(p~8HHWH`(PV~8 F,p@@0:pp(p“p *  <pp(^pb(,2P-p:pp(ȓpp!.! p'f *@FH .T 4 t (? N 0px$p&pz~8HHWX`(P֧<@~H ~PlP0:pp(6p(( *:pp)p|-:pp)pndD$ & ' "ΰ   pp) ~pp ^Π R <qq),qp  ! ! qՊz8 0 \}qq TX  q h$   ~Hɞ@Ǿ<XXWx`)8Pާ<~@p)!p01  $^ LJ . !  d 212 ! &B $4ss+~sj f L4zzF zv 2ss+s,F1<4||+|F)HzFF)Pd0F)DNF)@8 F8 2{{F{FZ2||+|~@ǎ<xxWH`)XP~48~@qD !  ހ@ !   & $ ހB = ( fF !  ( T !  ~財   Jz  q       ~@ɞ8Ǿ4HHWH`)`P8~@d缋 !  - p,   pp  !  - 6: \ :pp)hpppԎl<pp):p0 ppзh<pp)pppз.: $ppз`  )  pp~@ɞ8HHW@`)Pާ~8q  p~8@@WX`)P~@~Hpǧ  >:pp)p8P :pp)p0p  p@1D$0<pp* :p(<pp*DpPP PǗnTW3Qa1p)W$"!TT"TT$TpT$$TpT((TpTVg`&  P$` :pp*hBp0$Z <pp*p  $     P>yy+ry`P:dP+HP691p0~Hɞ@XXW?`*PhHP~Xp   $x DLJ  F"!!! $$!!!$ ު"!!! ϸ `"!!! 0= $!!!= ǐ  'ݚ"!!!'RJ$!!! '"!!!' n,Ǝ` p*W!"b*܀!"b*Z!"z"b*4!"b*!"'"b+Z!"b+‹41'3'b(+#4ۖ1b(+#4b!"b*.z +4  +<b+,j +L  +Tb+Dċ6yy+\ږydb~ ,l  X,H+h0~XɞPɾHW@`+pP~<p+x@2ee+٦e0pD'X2ff+.fN2gg+g~<@@W @(#)nio.c 4.3 87/05/13 @(#)fio.h 4.3 87/05/13 @(#)fmt.h 4.3 87/05/13 @(#)lio.h 4.3 87/05/13 XXXXXtt(Hdlist inlist inlist inbad repetition countbad repetition countlreadno starbad repetition countno (no commano )bad repetition countno starlreadbad repetition countbad repetition countno starbad repetition countno quoteno space$&&end$endbad dimensions for substringbad dimensionsbad dimensions for substringx bad typebad dimensions for array elementbad dimensions for array elementbad dimensions for array elementbad dimensions for array elementbad dimensions for array element#f####$$$H$$%$%c%ld%d%d0x%x%.6e%.16e(%.6e,%.6e)(%.16e,%.16e).%s.TRUEFALSE.%s.TRUEFALSEnamelist io $end namelist iostart namelist ionamelist ionamelist ionamelist read <P R ^ ` p |  $&.46<R    8 : F H P R X^ b d l n  (*8:HJVXdfptv&68@t| ~   $&68@TV^ ,^`f  "028JLTjr t            & ,  < > F R T  h  v |                  0  > D  R \ ^ h j r ~                   * 4 6 L N  b  r x                  0  > D  R b d x z                $  2 F          &,DFX ^dfz|        $&.: < P ^d pr*,BDLX Z n ~      8:H P$L"T#V#`$x z &'()*++(*n ~ ,.  // &, Z jp ....  < JP ~+ +`b2+222 +P4ln+/22(*>@F+PRxz22"""+6 8 L Z` t"v""    """   *0 D"F"T"l"n"|"+""""222$B.Z,~""""    ""  0 >D P"R"l"n"        6 8 r"""""""""""","."V"X"l2n2v"x"""    """"    "","."2"4">"@"J2L2d f z     "2   6# 8# B$ \ ^  f( n) t& z' 6     7      !7! !!*!,!48!8!:!L!N!X7!`!b!!!!!7!!!!!8!!!!!7"""H"J"\"^"h7"p"r"""""7""""""#7###<9#`#|#:##:##:##:$$:$:$@:$b$l:$$:$$:$$%% :%"%.%8%>:%V %f%l %x%z%8%9%,%9%%%%8%&&&;&$<&.=&H &V&\ &l>&t?&x=&z=& &@&@& &A& && & & &' '' ''''''''''''''''''''))))))))))***********.text'8.data'8).bss+mcount_curunit_elist_errno_fatal_l_comma_t_getc_cf_ungetc_ftell_niol_R_niol_C_niol_L %$_nio_lx_nio_ly0_b_char;_ltab__ctype_free_malloc_realloc_s_rsne_tabind(_init_f_init_c_nle%FR_reading\g__filbuf_strlen_getword|_strcmps_findit_getvar|}_tolower_s_wsne __flsbuf_fputs_t_putc_sprintf_fmtbuf_getunit_lunit_recpos_scale_units_fk_open_nio_read_nio_lcount_nio_ltype_niol_CHAR_nio_lchar_niord_int_sequential_external_formatted_nowreading_lastchar_flagtabchar_recupind_nowwritingopen.o/ 548426552 98 100 100664 6260 ` u S8,'.text  .data p l@.bss ` XP W` `P Wh` hP<@~Hp@2ee Ze|g$0߀aA,g$w W,g$r R`$ƅD$$w$W, ,B,6xx ȓNxp , g `"zZ "  0gf F  U(0N(2#p"" pW"u(0n(#p"" W"2kk ԓ&kH' .h(x0zC$h `.h! A! z1!hzz$*.h*"!.h# ^(V\h^hThDnh4 & 6uu ܓuLHh4 | p4qq >q`\((lh $ 4uu uTP Fh4 pX H4qq q8h h0Xh ڧ4h$ h h ll F"N4 $D,$ $nh " "$4hhv 4ll BldB(h $hp^ 'Rʋ'RR hR' .hx(p8g `(nN \' .hh`d\\ ~Hɞ@Ǿ<hhW` 0P@~Hr v'|v'dL~PvTvHX\ H  D` @ <d hl 8pL*~HɎ@WX` PP8 .<   @ XXW8` XPRȎ 0,w `(w4,,w pw88W @(#)open.c 4.4 87/05/13 @(#)fio.h 4.3 87/05/13 rw+r+ropenopen mode=openopenopenno spaceopenopenno spaceopenopentmp.FXXXXXXr/wufdsattempt to readattempt to write *08JPp z   <    >P R \ ^ djn p   * :@Vfx z      "(< > H J TX Z v|      6L N X Z dh j |   ,.8 D!F!P Zn " N T p x z  ! !        B H \$   & &   & &   p t x |            .text .data p.bss {mcount{ {_f_setl({_f_openH{_setunit{_lunit{_errno{_fatal{_units{_strlen{_g_char{_strcpy{_getenv{_access{_creat{_close{_malloc{_isdev @{_fopen{_fseek{_canseek{_inode{_rewind{_mktemp{{_sprintf{'{_f_clos{_fk_open L{_stat{1 {_curunit{<_f_setlfnflag_lfn_flag_fortlfile_fortfile_checkmoderdfmt.o/ 548426570 98 100 100664 7931 ` u SJ$#.text| .data \J@.bssP` PD~Hp(W ٍh8nn`nnvW''8' P* Z# !p""(W"'0 d (: (:n (8v (0` (L  ȋ< ( ,(' 8<  <     ~HǞDPPWH`PΧ~DppW'0  n 4ZWL4~DHHW`P@48@~HP^P^p[QP\ا^.W0 #F 6+!p""W"*6* P !H f!a!p""XW"sQ^00 |q.P СfsTq.P С:^Ps$0q.P ׎ p p pqH 0Z6p0 qP` 0qP0*(A s0(@h Lz  s~Hɞ@ɾ84WP`pPJ48@~HsW0 #::* P B9!+!p""xW"s`2(ы" s    ~Hɞ@ɾ84PPW8 `P6ȩ~0p  ~088WH?`Pާ08~@q΀,XW zt T $f F  |t"  ~@ɞ8ɾ0HHW`ȓPp48@~Hސ@$P`^^^X^\^T^l^|p^P2qW  (+ ^0@:50* - ^0@:50Q^\+ - 9 40,>599R3S5^pFP@H`^`45>te $E d D . L *^5Y^$, xs. Q^TqW 9 00(>@$50930@H@4L& *^@$5P^ , xP ^lQ^l4e ,E $d D + - 3- Q^XqQ^PW - Q^Xz9 0| Ч|T *^|Z^|0, , + *s]Xp.|nl&p^?5Pq^'T.|+ .|p^?5Pq^'^ln|V\V0%&p^?5Pq^',.|nl@$&p^5Pq^'^:Tbn|V.+&p^?5Pq^'(.|@$+p^5Pq^'(.|@$p^5Pq^'^..3R.^\^2PPp^?5Pq^pp@$^5Pq^p^7 ^\~Hɞ@ɾ84W@`ГP4~8p4W " q~8Ǟ4@@W@`ؓP*0~8fpW q  p2W ~ q\p4W > qp q  ~8ɞ0@@W@`P.4~8p4W "  q~8Ǟ4@@W@`P4~8pqχH  4W $ q~8Ǟ4@@W @(#)rdfmt.c 4.3 87/05/13 @(#)fio.h 4.3 87/05/13 @(#)fmt.h 4.3 87/05/13 xL`fmtrd_ed, unexpected code: %d %s ^^^^^rd_ned, unexpected code: %d %s ,,XXXXXXXXXXXXLHP88hhhhhhhhhh 02D F N R T ` b l n          .4Xbdhjpv|         dfn   6 f t 2> X Z !$PR XZx z    @ B  z          " " " " Z `       "`bFL(,048<@DHLPTX  $(,048<@DHLPTX\`dhlx|.text.data J.bss_rd_ed@mcount@_getn@_cursor@_recpos@_elist@_errno@_fatal@_back@_fmtbuf@__iob@_fprintf@_abort@_rd_I@_rd_Ix@_rd_L@_rd_A X@_rd_AW @_rd_F@_rd_Q@_cf@_rd_ned,@_rd_POSD@_rd_H@@_tolower@_cblank@@_scale@_donewrec_howmany_pos rewind.o/ 548426575 98 100 100664 1228 ` u SOT.textP4 .dataPPX@.bssH`P~@@2eee0pH(p4rrBrx4jj j@$&  ~@HHW @(#)rewind.c 4.3 87/05/13 @(#)fio.h 4.3 87/05/13 rewindrewindrewind (2 L Z` l n x z ~      *6.textP.dataPX.bss_f_rewmmcountm_getunitm_lunitm_errnom_fatalm_unitsm_fk_openmm_ftellm_t_runcm_rewindm_nowreadingrsfe.o/ 548426583 98 100 100664 3212 ` u SW|0.texthtV .datahh@.bss@`P~<p Bp 0R4dd&d  w,޶Z$ ~<@@W8`ȓPb L*  88W@`ГPҧ~<  ! pzPzD6   ~<@@W0 `ؓPГt00W0 `PГD00W @(#)rsfe.c 4.3 87/05/13 @(#)fio.h 4.3 87/05/13 @(#)fmt.h 4.3 87/05/13 startio "$. 6 H N T Z`hpv   ! """(#.$:&F(R*VXb+l,|-.*0@BTVhjp.xz/BH.texthV.datah.bss_s_rsfepmcountp_initp_f_initp_c_sfep_readingpppp_elistp_recposp_cursorp_scalep_fmtbufp_lunitp_unitsp_curunitp_cfp_pars_fp_errnop_fatalp%p_x_getc(p_getnp_x_backp_backp_rd_edp_doedp_rd_nedp_donedp_fmt_bgp_x_endpp_doendp_xrd_SLp0p_x_rev@p:p_cblankp_cpluspDp__filbufp_ungetcpP_sequential_formatted_external_checkmode_donewrec_dorevert_nowreadingsfe.o/ 548426589 98 100 100664 2129 ` u S]L.text: .data`4@.bss@`ؓP~< p bB ! thq<  !~<@@W0 `PڧГ00WH`P~@p@v@4ee6e0߀D'2rrr>4fff~@HHW0 `PvГ00W @(#)sfe.c 4.3 87/05/13 @(#)fio.h 4.3 87/05/13 sfesfestartio  "8:F H ^ ` f p r          "(6@Z`x"(JZ`.text:.data`.bssnmcountn_curunitn_cfn__filbufn_ungetcn_fseekn_e_rsfe n_en_fion_fmtbufn_c_sfeXn_getunitn_lunitn_setunitn_errnon_fataln_unitsn_fk_openn_e_wsfen_howmany_pos sue.o/ 548426597 98 100 100664 3800 ` u Se %.text~ .dataD@.bss88H`P~Dp $   w0!p  8 (J  ~DHHW@`P~<p $ f ^w\B$ &!~<@@W@`P֧~<p@2eee 0pD'02rrr2gggB2ggg~<@@WH`(PV~D0!4(p 0! ~DHHW@`0PƧ  $" !`@@W @(#)sue.c 4.3 87/05/13 @(#)fio.h 4.3 87/05/13 startstartsuesuesuestartio "$. D F N V fn   BHZ\f | ~  &,DNhv|  !  0>DP R lz##  6<HJN P VXtv  .text~.data.bss8_s_rsueqmcountq_initq_f_initq_c_sue$q_curunitq_readingq_recposqqq_cfq_reclenq_freadq_errnoq_fatalq_s_wsue@qq_ftellq_reclocq_fseekq_getunitq_lunitq'q3q=q_unitsq_elistq_fk_openq_e_wsueq_fwriteq_e_rsue4qH_nowreading_checkmode_nowwriting_sequential_external_formatteduio.o/ 548426603 98 100 100664 1848 ` u Sk.text(4 .data((`@.bss@`XP0Av:nn`nL3#0p03#0@@@W@`hP0 @@WH`pP֧~Dp1` >8nnxrn^G0$J8$G0$~DHHW @(#)uio.c 4.3 87/05/13 @(#)fio.h 4.3 87/05/13 eof/uioeof/uioeof/uio  ". 0 : @ B J L ^ nt   &,D F JLV h j |      .text(4.data(`.bss_do_usmmcountm_readingm_recposm_reclenm_elistm_errnom_fatalm_cfm_freadm_fwritem_do_uiomm_do_ud$m_curunitm_sequentialunits.o/ 548426610 98 100 100664 2148 ` u Srt .text .dataX@.bssXX8`XP06 50 p0 ^pL \p0Xp&$@v`nv88W8`hPJ "p$ p88W @(#)units.c 4.3 87/05/13 @(#)fio.h 4.3 87/05/13 @(#)units.h 4.3 87/05/13 open FXjr .text .dataX.bssX_setunitl`mcountl`_unitmappl`_avunitXl`_fatall`_getunitl`util.o/ 548426617 98 100 100664 1112 ` u Syh .text .dataX@.bsspp`PP0A~r AA( A(~W`XPn@1~r 1A!r 1 !r~WX``P 8  :XXW`hP@~04ph`rA0( Dt10.1p $p1$0NrA( Aq10(1#$1!0~W @(#)util.c 4.3 87/05/13 @(#)fio.h 4.3 87/05/13  6<.text .dataX.bssp_g_charmmcountm_b_charm_inodem_statm_mvgbt4mgetfd.o/ 548426623 98 100 100664 680 ` u S .textT .dataH @.bss8`P088W8`P088W @(#)getfd.c 4.4 87/05/13 @(#)fio.h 4.3 87/05/13 ", . JPbl n .text .dataH.bss_getfp_jmcountj_getunitj_unitsj_getfd_Hjf7flsh.o/ 548426628 98 100 100664 576 ` u Sd .textP .dataPP@@.bss8`P 088W @(#)f7flsh.c 4.3 87/05/13 @(#)fio.h 4.3 87/05/13 ". 0 < .textP.dataP@.bss_f7flsh_jmcountj_getunitj_unitsj_fflushjwrtfmt.o/ 548426647 98 100 100664 8794 ` u S@'.text .datapd @.bssHH@`(P~\N(^\ X (΀*WyX p W\-W+WǞXp0W+WX ~PɞHǾD``WX`P:@~Hz P.TPT$ΐ*p Wqr΀ pWqT-W+Wp*WqP~Hɞ@XXW``P"DH~Ppzw ppX.\:\ X  (ΐ*p Wqp,(ΐ p WqX ΀ pWq\-W+W΀0pWqX p+WqX~PɞHǾD``W@`P~8pzn`qL  W,q  Wq~8@@W@`P~8pȋ&(Wq~8@@W@`Pv14~8Àz ǀpϓ WqtWfW~8Ǟ4@@W@` Pڧ~8q(Wq~8@@W@`(P4~8qq Wy(Wq~8Ǟ4@@Wh`0PDHǾP~X' ^d(>`^(~`Ѝpw)%cp!d! < y(΀*pWq"p Wqd-W+Wh`Π0.Wp Wqp Wqj`p Wq.Wp Wq..Wp Wq *`` ``46͈.ddWeW` -W``+WD ` 4`c(΀*pWqh`d(`d0W`d``0W`0W~XɞPɾHDhhWx`8PzLPX@~`ǎP?`^p'Pha: 2h^h?:(e,֋@$prɾh^p:V0 ϳΐ '!8tp W*^pq5P^pr(e,<~`ɞXɾPLxxW``@P*D@H~P' A0N&@$ p51q.p?50q^\(>X^(X \\ X   (΀*pWqΠ p Wq\-W+Wp WqXΐ0.Wp WqX0  W0Wq~PɞHǾD``W @(#)wrtfmt.c 4.3 87/05/13 @(#)fio.h 4.3 87/05/13 @(#)fmt.h 4.3 87/05/13 left offd   HHDw_ed, unexpected code: %d %s  8H w_ned, unexpected code: %d %s (*2 4 < @ B P R ^ ` r     >HJNPV\b       " . jp!"" "8:H"J"RTln # """<>\^tv""*#8":"hj""<>v| TV " ( D F r x       $ $ H% " "       " "   $ $ , . D F P$ R$ h j v$ x$ $ $   $ $     $ $     2$ 4$ j l | ~         < > P R   $ $:$ln$$$0$2$X$Z$x&"" """*,@BVXlnHLPTX\`dhlpt.text.datap.bssH_mv_curmcount_putn_cursor_recpos_elist_errno_fatal_back_w_ed_fmtbuf__iob_fprintf_abort_wrt_I_wrt_IM_wrt_Ixh_wrt_L_wrt_A _wrt_AW p_wrt_E _wrt_G _wrt_F_w_ned_wrt_APt_wrt_H_icvt_oz_cplus_icvt_scale_ecvt_fcvt_donewrecwsfe.o/ 548426656 98 100 100664 4054 ` u S 2.textx .data\@.bsshh@` P~<p Lp 0J4dd(d  w@ Pȶ`$ |~<@@W8`0PV * X$  !&111 88W`8PW8`@P *dQPH$  !4&111 PHQP0PH J ΋p!!!P1 H "!!!X$  !,&111 88W8`PP W88W8`XP W88W8``Pj W88W @(#)wsfe.c 4.3 87/05/13 @(#)fio.h 4.3 87/05/13 @(#)fmt.h 4.3 87/05/13 startio "$. 6 H P V \bjrx~  !!$"(#*#0$<&H(T*Z+^`h,t-. /RX\^fv|/*,4/<>dfxz//(*6<V\hjrt111.textx.data.bssh_s_wsfeqmcountq_initq_f_initq_c_sfeq_readingqqqq_elistq_recposq_cursorq_nonlq_scaleq_fmtbufq_lunitq_unitsq_curunitq_cfq_pars_fq_errnoq_fatalq%q_x_putcq_putnq_x_backPq_backq_w_edq_doedq_w_nedq_donedq_xw_endTq_doendq_xw_revq0q_x_wSLq:q_fmt_bgq_cplusq_cblankqDq__flsbufq_pr_puttqPqZ_sequential_formatted_external_checkmode_dorevert_donewrec_nowwriting_workdone\...]s.d_asin.s^s.d_atan.s_s.d_atn2.s`s.d_cos.sas.d_cosh.sbs.d_exp.scs.d_lg10.sds.d_log.ses.d_sin.sfs.d_sinh.sgs.d_sqrt.shs.d_tan.sis.d_tanh.sjs.pow_dd.sks.erf.cls.fabs.cms.floor.cns.fmod.cos.gamma.cps.hypot.cqs.j0.crs.j1.css.jn.cts.matherr.cus.pow_rr.svs.r_acos.sws.r_asin.sxs.r_atan.sys.r_cos.szs.r_cosh.s{s.r_atn2.s|s.r_exp.s}s.r_lg10.s~s.r_log.ss.r_sin.ss.r_sinh.ss.r_sqrt.ss.r_tan.ss.r_tanh.ss.Makefiles.r_floor.cs.r_modf.cs.d_acos.sMakefiler_floor.cr_modf.clibm.ar_floor.or_modf.olibm.a.mapplibm.aplibm.a.maph32946 s 00003/00000/00512 d D 4.3 87/04/16 13:55:36 mth 8 7 c Profiling changes e s 00081/00007/00431 d D 4.2 87/02/16 17:08:53 mth 7 6 c Parameters in registers. e s 00000/00000/00438 d D 4.1 87/02/16 16:57:07 mth 6 5 c rolled rev to -r4 (mth) e s 00002/00002/00436 d D 3.3 87/01/31 13:27:45 mkm 5 4 c correct compatability probs between ROS and SPIX as. -mkm e s 00000/00000/00438 d D 3.2 87/01/31 11:54:05 mkm 4 3 c from ROS sources as of this date. -mkm e s 00000/00000/00438 d D 3.1 87/01/21 17:46:02 mkm 3 2 c e s 00000/00000/00438 d D 2.1 87/01/21 17:43:25 mkm 2 1 c e s 00438/00000/00000 d D 1.1 87/01/21 17:41:45 mkm 1 0 c Placed under source control - mkm c These files are direct descendants of the ROS files c by the same name at or about ROS rev 5.1 e u U f b f n t T I 1 ; "%W% %G%" dsect data name byte 'asin',0 ;name of routine emess byte 'asin: DOMAIN error\n',0 ;error message messlen equ 19 ;length of message D 5 nanmess byte 'asin: input value was NAN\n",0 ;error message if nan E 5 I 5 nanmess byte 'asin: input value was NAN\n',0 ;error message if nan E 5 nanlen equ 26 D 5 infmess byte 'asin: input value was INF\n",0 ;error message if "infinity" E 5 I 5 infmess byte 'asin: input value was INF\n',0 ;error message if "infinity" E 5 inflen equ 26 csect code align 2 externd _errno external _write external _matherr e_type equ -32 ;exception type e_name equ -28 ;name of routine in error e_arg1 equ -24 ;argument 1 e_arg2 equ -16 ;argument 2 (if present) e_retval equ -8 ;room for exception block e_size equ -80 ; plus stack frame with 3 parameters I 7 #ifdef ARGSINREGS pe_size equ 80 ; positive form of e_size #else pe_size equ 0 ; positive form of e_size #endif E 7 DOMAIN equ 1 SING equ 2 OVERFLOW equ 3 UNDERFLOW equ 4 TLOSS equ 5 PLOSS equ 6 EDOM equ 33 ERANGE equ 34 csect code C1P1 equ 03f737670h C1P2 equ 074cb69a4h ;equals C2P1 equ 0bfe2f50dh C2P2 equ 02368d8a6h ;equals C3P1 equ 04014208ch C3P2 equ 0678d8742h ;equals C4P1 equ 0c02cb368h C4P2 equ 074a263cdh ;equals C5P1 equ 04030a5d2h C5P2 equ 0bd0c7221h ;equals C6P1 equ 0c01b1843h C6P2 equ 0b89359e1h ;equals C7P1 equ 0c02bd9b5h C7P2 equ 03f41f7dch ;equals C8P1 equ 0404fdc8eh C8P2 equ 06afe0d47h ;equals C9P1 equ 0c0600ca4h C9P2 equ 0a46999e4h ;equals C10P1 equ 0405d8b3ah C10P2 equ 0bc517143h ;equals C11P1 equ 0c0445232h C11P2 equ 0ca6e7fech ;equals MPI2U equ 0bff921fbh ;-pi/2 upper (lower is the same as positive) PI2U equ 03ff921fbh ;pi/2 upper PI2L equ 054442d18h ;equals 1.57079632679489662 LIMITU equ 03fe6a090h LIMITL equ 02de00d1bh ;equals .7071 ONEU equ 03ff00000h ;equals high-order word of 1 ABS equ 07fffffffh ;to find absolute value ;NOTE: these constants are for d_sqrt CC1P1 equ 03fe2e29bh CC1P2 equ 0a0dad67bh ;equals .5901621 CC2P1 equ 03fdab52ah CC2P2 equ 0ef97d2f0h ;equals .4173076 HALF1 equ 03fe00000h HALF2 equ 000000000h ;equals .5 MASK1 equ 0800fffffh ;to clear off exponent MASK2 equ 0000007ffh ;to clear everything but integral exponent EBIAS equ 0000003ffh ;1023 EXP0 equ 03ff00000h ;gives biased exponent of 0 arg3 equ 40 arg2 equ 32 arg1 equ 24 arg_1 equ -8 arg_2 equ -16 arg_3 equ -20 ; ; _d_asin.s ; global _asin ;cc, rc and rp global _d_asin ;f77 global _D_asin ;rf D 7 _asin: loadd r0,r14,arg1 E 7 I 7 _asin: I 8 ; MCOUNT E 8 #ifndef ARGSINREGS loadd r0,r14,arg1 #endif E 7 br _D_asin _d_asin: I 8 ; MCOUNT E 8 I 7 #ifndef ARGSINREGS E 7 load r0,r14,arg1 I 7 #endif E 7 loadd r0,r0,0 _D_asin: I 8 ; MCOUNT E 8 move r2,r0 ;save sign of arg laddr r3,ONEU,L laddr r4,ABS,L and r0,r4 br r0>=r3,toobig ;if abs(arg)>1 then too big I 7 #ifdef ARGSINREGS stored r7,STKPTR,arg_1 stored r9,STKPTR,arg_2 ;save registers 7-10 #else E 7 stored r6,r14,arg_1 stored r8,r14,arg_2 store r10,r14,arg_3 ;save registers 6-10 I 7 #endif E 7 notoobig: laddr r3,LIMITU,L laddr r4,LIMITL,L drcomp r3,r0 br r3<1,greater ;if (x<.7071) then ... else go to greater lessthan: move r3,r0 move r4,r1 drmpy r3,r3 ;rp3="xsq=x*x" laddr r5,C1P1,L laddr r6,C1P2,L ;C1 drmpy r5,r3 ;"(C1)*xsq" laddr r7,C2P1,L laddr r8,C2P2,L ;C2 dradd r5,r7 ;"...+C2)" drmpy r5,r3 ;"...*xsq" laddr r7,C3P1,L laddr r8,C3P2,L ;C3 dradd r5,r7 ;"...+C3)" drmpy r5,r3 ;"...*xsq" laddr r7,C4P1,L laddr r8,C4P2,L ;C4 dradd r5,r7 ;"...+C4)" drmpy r5,r3 ;"...*xsq" laddr r7,C5P1,L laddr r8,C5P2,L ;C5 dradd r5,r7 ;"...+C5)" drmpy r5,r3 ;"...*xsq" laddr r7,C6P1,L laddr r8,C6P2,L ;C6 dradd r5,r7 ;"...+C6)" drmpy r5,r3 ;"...*xsq" drmpy r5,r0 ;"...*x" = numerator laddr r7,C7P1,L laddr r8,C7P2,L ;C7 dradd r7,r3 ;"(xsq+C7)" drmpy r7,r3 ;"...*xsq" laddr r9,C8P1,L laddr r10,C8P2,L ;C8 dradd r7,r9 ;"...+C8)" drmpy r7,r3 ;"...*xsq" laddr r9,C9P1,L laddr r10,C9P2,L ;C9 dradd r7,r9 ;"...+C9" drmpy r7,r3 ;"...*xsq" laddr r9,C10P1,L laddr r10,C10P2,L ;C10 dradd r7,r9 ;"...+C10" drmpy r7,r3 ;"...*xsq" laddr r9,C11P1,L laddr r10,C11P2,L ;C11 dradd r7,r9 ;"...+C11" = denominator drdiv r5,r7 ;".../..." dradd r0,r5 ;rp0="result=x+numerator/denominator" sign: laddr r3,080000000h,L and r2,r3 ;to clear r2 of everything but sign bit or r0,r2 ;rp0="result=%d_sign(result,arg)" done: I 7 #ifdef ARGSINREGS loadd r7,STKPTR,arg_1 loadd r9,STKPTR,arg_2 ;to restore registers 7-10 ret LINK,LINK #else E 7 loadd r6,r14,arg_1 loadd r8,r14,arg_2 load r10,r14,arg_3 ;to restore registers 6-10 ret r11,r11 I 7 #endif E 7 greater: laddr r3,ONEU,L move r4,0 drsub r3,r0 ;"(1-x)" laddr r5,ONEU,L move r6,0 dradd r0,r5 ;"(1+x)" drmpy r0,r3 ;rp0="temp=(1-x)*(1+x)" d_sqrt: move r4,r0 ;to save r0 or r0,r1 br r0=0,zero ;if arg=0 then return zero move r0,r4 dunp: move r3,r0 move r4,r1 laddr r5,MASK1,L and r3,r5 ;rp3="mant of arg with sign" laddr r5,EXP0,L or r3,r5 ;gives rp3="mant" an exponent of 0 to work with move r5,r0 csl r5,12 laddr r6,MASK2,L and r5,r6 ;r5="integer exponent of arg" laddr r6,EBIAS,L sub r5,r6 ;unbiases exponent move r6,1 and r6,r5 br r6=0,even ;if (odd(expon)) then begin odd: laddr r6,000100000h,L sub r3,r6 ;rp3="mant=mant*.5" add r5,1 ;r5="expon=expon+1" move r0,r3 move r1,r4 ;rp0=rp3="mant" laddr r6,CC1P1,L laddr r7,CC1P2,L drmpy r0,r6 ;rp0="approx=C1*mant" laddr r6,CC2P1,L laddr r7,CC2P2,L dradd r0,r6 ;rp0="approx=C1*mant+C2" br cont even: move r0,r3 move r1,r4 ;rp0=rp3="mant" laddr r6,CC2P1,L laddr r7,CC2P2,L drmpy r0,r6 ;rp0="approx=C2*mant" laddr r6,CC1P1,L laddr r7,CC1P2,L dradd r0,r6 ;rp0="approx=C2*mant+C1" cont: move r6,r3 move r7,r4 drdiv r6,r0 ;rp6="mant/approx" dradd r0,r6 ;rp0="approx="approx+(mant/approx)" laddr r6,000200000h,L move r7,r4 add r6,r3 ;rp6="4*mant" drdiv r6,r0 ;".../approx" dradd r0,r6 ;rp0="approx=approx+(4*mant/approx)" laddr r6,000400000h,L move r7,r4 add r6,r3 ;rp6="16*mant" drdiv r6,r0 ;".../approx) dradd r0,r6 ;rp0="approx=approx+(16*mant/approx)" dpck: ;no more need for mantissa move r6,2 div r5,r6 ;"expon div 2" sub r5,3 ;"r5=(expon div 2) - 3" move r3,r0 csl r3,12 laddr r4,MASK2,L and r3,r4 ;"pd_unpk(value,u)" without unbiasing exponent add r3,r5 ;r3="u.exp=u.exp+power2" laddr r5,20 csl r3,r5 ;place exponent in correct location for double laddr r5,MASK1,L and r0,r5 ;to clear approx's old exponent value or r0,r3 ;"pd_pack(result,u)" br calc ;finish calculations zero: move r0,0 move r1,0 ;if arg<0 then return 0 ;End of d_sqrt(temp) calc: move r3,r0 move r4,r1 drmpy r3,r3 ;rp3="xsq=x*x" laddr r5,C1P1,L laddr r6,C1P2,L ;C1 drmpy r5,r3 ;"(C1)*xsq" laddr r7,C2P1,L laddr r8,C2P2,L ;C2 dradd r5,r7 ;"...+C2)" drmpy r5,r3 ;"...*xsq" laddr r7,C3P1,L laddr r8,C3P2,L ;C3 dradd r5,r7 ;"...+C3)" drmpy r5,r3 ;"...*xsq" laddr r7,C4P1,L laddr r8,C4P2,L ;C4 dradd r5,r7 ;"...+C4)" drmpy r5,r3 ;"...*xsq" laddr r7,C5P1,L laddr r8,C5P2,L ;C5 dradd r5,r7 ;"...+C5)" drmpy r5,r3 ;"...*xsq" laddr r7,C6P1,L laddr r8,C6P2,L ;C6 dradd r5,r7 ;"...+C6)" drmpy r5,r3 ;"...*xsq" drmpy r5,r0 ;"...*x" = numerator laddr r7,C7P1,L laddr r8,C7P2,L ;C7 dradd r7,r3 ;"(xsq+C7)" drmpy r7,r3 ;"...*xsq" laddr r9,C8P1,L laddr r10,C8P2,L ;C8 dradd r7,r9 ;"...+C8)" drmpy r7,r3 ;"...*xsq" laddr r9,C9P1,L laddr r10,C9P2,L ;C9 dradd r7,r9 ;"...+C9" drmpy r7,r3 ;"...*xsq" laddr r9,C10P1,L laddr r10,C10P2,L ;C10 dradd r7,r9 ;"...+C10" drmpy r7,r3 ;"...*xsq" laddr r9,C11P1,L laddr r10,C11P2,L ;C11 dradd r7,r9 ;"...+C11" = denominator drdiv r5,r7 ;".../..." dradd r0,r5 ;rp0="result=x+numerator/denominator" sign2: laddr r3,080000000h,L and r2,r3 ;to clear r2 of everything but sign bit or r0,r2 ;rp0="result=%d_sign(result,arg)" br r2=0,positive! ;if (reducd) and (arg<0) then ... else positive neg: laddr r3,PI2U,L laddr r4,PI2L,L dradd r0,r3 ;"(pi_2+result)" xor r0,r2 ;rp0="result= -(pi_2 + result)" br done positive: laddr r3,PI2U,L laddr r4,PI2L,L drsub r3,r0 move r0,r3 move r1,r4 ;rp0="result= pi_2 - result" br done mpidiv2: laddr r0,MPI2U,L laddr r1,PI2L,L I 7 #ifdef ARGSINREGS ret LINK,LINK ;returns -pi/2 #else E 7 ret r11,r11 ;returns -pi/2 I 7 #endif E 7 pidiv2: laddr r0,PI2U,L laddr r1,PI2L,L I 7 #ifdef ARGSINREGS ret LINK,LINK ;returns pi/2 #else E 7 ret r11,r11 ;returns pi/2 I 7 #endif E 7 toobig: move r4,0 drcomp r3,r0 br r3<>0,badinput ;if arg<>1 then error br r2>0,pidiv2! ;if original sign positive, return pi/2 br mpidiv2 ; else return -pi/2 ; ; error handling ; badinput: ;returns info to user about input error laddr r4,07ff00000h,L move r5,0 ;rp5="infinity" drcomp r4,r0 struct: ;loads values into error structure in case user ;wishes to do more with them than we have done D 7 E 7 I 7 #ifdef ARGSINREGS store LINK,STKPTR ;save old return laddr STKPTR,STKPTR,e_size ;update stack store r4,STKPTR,arg_1 ;saves r4's value ; (ie whether or not it's inf) #else E 7 store r11,r14,0 ;save old return store r15,r14,8 ;save old frame pointer move r15,r14 laddr r14,r14,e_size ;update stack D 7 E 7 store r4,r14,arg_1 ;saves r4's value (ie whether or not it's inf) I 7 #endif E 7 D 7 stored r0,r15,e_arg1 ;loads abs(arg) into error structure E 7 I 7 stored r0,STKPTR,pe_size+e_arg1 ;loads abs(arg) into error structure E 7 laddr r2,name,L ;name of offending routine D 7 store r2,r15,e_name ; into error structure E 7 I 7 store r2,STKPTR,pe_size+e_name ; into error structure E 7 move r3,DOMAIN ;exception type D 7 store r3,r15,e_type E 7 I 7 store r3,STKPTR,pe_size+e_type E 7 move r0,0 move r1,0 D 7 stored r0,r15,e_retval ;return 0 E 7 I 7 stored r0,STKPTR,pe_size+e_retval ;return 0 E 7 I 7 #ifdef ARGSINREGS laddr r0,STKPTR,pe_size+e_type ;user want to do different anything with error? call LINK,_matherr,L ;matherr is a function for user to define #else E 7 laddr r4,r15,e_type ;user want to do different anything with error? store r4,r14,arg1 ;gives matherr the address of error structure call r11,_matherr,L ;matherr is a function for user to define I 7 #endif E 7 br r0<>0,err_rtn ;yes (assume user will change r0 if yes ) mess: ;prints out our error message I 7 #ifdef ARGSINREGS E 7 move r0,2 I 7 laddr r1,emess,L laddr r2,messlen call LINK,_write,L ;writes out message #else move r0,2 E 7 store r0,r14,arg1 laddr r5,emess,L store r5,r14,arg2 ;gives message laddr r0,messlen store r0,r14,arg3 ;gives length of message call r11,_write,L ;writes out message I 7 #endif E 7 laddr r0,EDOM ;sets global variable _errno for user store r0,_errno,L I 7 #ifdef ARGSINREGS load r4,STKPTR,arg_1 ;restore r4's old value (if inf or not) #else E 7 load r4,r14,arg_1 ;restore r4's old value (if inf or not) I 7 #endif E 7 br r4=0,inf ;if abs(arg)="infinity" then go to inf br r4<0,nan ;if abs(arg) is not-a-number then go to nan err_rtn: ;resets all old pointers and returns zero I 7 #ifdef ARGSINREGS laddr STKPTR,STKPTR,pe_size ;user will have already used matherr for himself load LINK,STKPTR,0 #else E 7 move r14,r15 ;user will have already used matherr for himself load r15,r14,8 load r11,r14,0 I 7 #endif E 7 move r0,0 move r1,0 ;to return 0 I 7 #ifdef ARGSINREGS ret LINK,LINK #else E 7 ret r11,r11 I 7 #endif E 7 inf: I 7 #ifdef ARGSINREGS E 7 move r0,2 ;to print I 7 laddr r5,infmess,L laddr r0,inflen call LINK,_write,L #else move r0,2 ;to print E 7 store r0,r14,arg1 laddr r5,infmess,L store r5,r14,arg2 ;gives write the message laddr r0,inflen store r0,r14,arg3 ;gives write the length of message call r11,_write,L I 7 #endif E 7 br err_rtn nan: I 7 #ifdef ARGSINREGS E 7 move r0,2 ;to print I 7 laddr r1,nanmess,L laddr r2,nanlen call LINK,_write,L #else move r0,2 ;to print E 7 store r0,r14,arg1 laddr r5,nanmess,L store r5,r14,arg2 ;gives write the message laddr r0,nanlen store r0,r14,arg3 ;gives write the length of message call r11,_write,L I 7 #endif E 7 br err_rtn E 1 h04786 s 00003/00000/00383 d D 4.3 87/04/16 13:55:39 mth 8 7 c Profiling changes e s 00082/00008/00301 d D 4.2 87/02/16 17:08:57 mth 7 6 c Parameters in registers. e s 00000/00000/00309 d D 4.1 87/02/16 16:57:11 mth 6 5 c rolled rev to -r4 (mth) e s 00002/00002/00307 d D 3.3 87/01/31 13:27:47 mkm 5 4 c correct compatability probs between ROS and SPIX as. -mkm e s 00000/00000/00309 d D 3.2 87/01/31 11:54:07 mkm 4 3 c from ROS sources as of this date. -mkm e s 00000/00000/00309 d D 3.1 87/01/21 17:46:04 mkm 3 2 c e s 00000/00000/00309 d D 2.1 87/01/21 17:43:26 mkm 2 1 c e s 00309/00000/00000 d D 1.1 87/01/21 17:41:45 mkm 1 0 c Placed under source control - mkm c These files are direct descendants of the ROS files c by the same name at or about ROS rev 5.1 e u U f b f n t T I 1 ; "%W% %G%" dsect data name byte 'atan',0 ;name of routine emess byte 'atan: DOMAIN error\n',0 ;error message messlen equ 19 ;length of message D 5 nanmess byte 'atan: input value was NAN\n",0 ;error message if nan E 5 I 5 nanmess byte 'atan: input value was NAN\n',0 ;error message if nan E 5 nanlen equ 26 D 5 infmess byte 'atan: input value was INF\n",0 ;error message if "infinity" E 5 I 5 infmess byte 'atan: input value was INF\n',0 ;error message if "infinity" E 5 inflen equ 26 csect code align 2 externd _errno external _write external _matherr e_type equ -32 ;exception type e_name equ -28 ;name of routine in error e_arg1 equ -24 ;argument 1 e_arg2 equ -16 ;argument 2 (if present) e_retval equ -8 ;room for exception block e_size equ -80 ; plus stack frame with 3 parameters I 7 #ifdef ARGSINREGS pe_size equ 80 ; positive e_size #else pe_size equ 0 ; positive e_size #endif E 7 DOMAIN equ 1 SING equ 2 OVERFLOW equ 3 UNDERFLOW equ 4 TLOSS equ 5 PLOSS equ 6 EDOM equ 33 ERANGE equ 34 PI2U equ 03ff921fbh PI2L equ 054442d18h ;equals 1.57079632679489662 PI4U equ 03fe921fbh PI4L equ 054442d18h ;equals 0.78539816339744831 C1P1 equ 03feafdfch C1P2 equ 00abb1127h ;equals 0.8435039720139102 C2P1 equ 0402237d6h C2P2 equ 077a1db85h ;equals 9.1090581307487438 C3P1 equ 04036ed3bh C3P2 equ 0266ed388h ;equals 22.9266838093349465 C4P1 equ 0402f8669h C4P2 equ 0f9d8f82ah ;equals 15.7625272824626173 C5P1 equ 0402fbc4eh C5P2 equ 085349abfh ;equals 15.8677865626062825 C6P1 equ 040505691h C6P2 equ 0760b164fh ;equals 65.3526282413742890 C7P1 equ 0405849c4h C7P2 equ 035098c6ah ;equals 97.1526005357024121 C8P1 equ 04047a4cfh C8P2 equ 07b62bd8eh ;equals 47.2875818473940949 LIMITU equ 0433ff973h LIMITL equ 0cafa8000h ;equals 9e15 HALF equ 03fe00000h ;equals .5 TWO equ 040000000h ;equals top of 2 for a double ONE1 equ 03ff00000h ;equals top of 1 for a double ZEROS equ 000000000h ;equals zeros for various uses ABS equ 07fffffffh ;gives a mask to obtain the absolute value arg3 equ 40 arg2 equ 32 arg1 equ 24 arg_1 equ -8 arg_2 equ -16 arg_3 equ -24 arg_4 equ -28 ; ; _d_atan.s ; global _atan ;cc and rc and rp global _d_atan ;f77 global _D_atan ;rf D 7 _atan: loadd r0,r14,arg1 E 7 I 7 _atan: I 8 ; MCOUNT E 8 #ifndef ARGSINREGS loadd r0,r14,arg1 #endif E 7 br _D_atan _d_atan: I 8 ; MCOUNT E 8 I 7 #ifndef ARGSINREGS E 7 load r0,r14,arg1 I 7 #endif E 7 loadd r0,r0,0 _D_atan: I 8 ; MCOUNT E 8 D 7 E 7 I 7 #ifdef ARGSINREGS store r7,STKPTR,arg_1 stored r8,STKPTR,arg_2 store r12,STKPTR,arg_4 ;saves r7-12 ,except rp10, for use as constants #else E 7 stored r6,r14,arg_1 stored r8,r14,arg_2 store r12,r14,arg_4 ;saves r6-12 ,except rp10, for use as constants I 7 #endif E 7 dck2: laddr r2,LIMITU,L ;to test highorder word of arg laddr r12,r0 ;to preserve the sign of arg laddr r4,ABS,L and r0,r4 ;rp0="x=abs(arg)" ;(keeps from having to find abs(arg) twice) br r0>=r2,toobig ;if abs(arg)>limit then pi_2 or error messages back: laddr r2,TWO,L ;(only use high order word since if low x>0 then br r0>=r2,greater2 ;still x>=2) if x>=2 then go to greater2 laddr r2,HALF,L br r0>r2,greater.5 ;if .5=0,back ;go back if more precise check reveals error ;in previous check laddr r4,07ff00000h,L laddr r5,0 ;"infinity" drcomp r4,r0 br r4=0,inf ;if abs(arg)=infinity then go to inf br r4<0,nan ;if abs(arg) is not-a-number then go to nan ;else return pi_2 laddr r0,PI2U,L laddr r1,PI2L,L ;returns pi_2 br sign ; ; error handling ; nan: ;loads values into error structure in case user ;wishes to do more with them than we have done D 7 E 7 I 7 #ifdef ARGSINREGS store LINK,STKPTR,0 ;save old return laddr STKPTR,STKPTR,e_size ;update stack #else E 7 store r11,r14,0 ;save old return store r15,r14,8 ;save old frame pointer move r15,r14 laddr r14,r14,e_size ;update stack I 7 #endif E 7 laddr r0,r12 ;restores arg's sign D 7 stored r0,r15,e_arg1 ;load arg's value into error structure E 7 I 7 stored r0,STKPTR,pe_size+e_arg1 ;load arg's value into error structure E 7 laddr r2,name,L ;name of offending routine D 7 store r2,r15,e_name ; into error structure E 7 I 7 store r2,STKPTR,pe_size+e_name ; into error structure E 7 move r3,DOMAIN ;exception type D 7 store r3,r15,e_type E 7 I 7 store r3,STKPTR,pe_size+e_type E 7 laddr r0,PI2U,L laddr r1,PI2L,L D 7 stored r0,r15,e_retval ;return pi_2 E 7 I 7 stored r0,STKPTR,pe_size+e_retval ;return pi_2 E 7 I 7 #ifdef ARGSINREGS laddr r0,STKPTR,pe_size+e_type ;user want to do different anything with error? call LINK,_matherr,L ;matherr is a function for user to define #else E 7 laddr r4,r15,e_type ;user want to do different anything with error? store r4,r14,arg1 ;gives matherr the address of error structure call r11,_matherr,L ;matherr is a function for user to define I 7 #endif E 7 br r0<>0,err_rtn ;yes (assume user will change r0 if yes ) mess: ;prints out our error message I 7 #ifdef ARGSINREGS E 7 move r0,2 I 7 laddr r1,emess,L laddr r2,messlen call LINK,_write,L ;writes out message #else move r0,2 E 7 store r0,r14,arg1 laddr r5,emess,L store r5,r14,arg2 ;gives message laddr r0,messlen store r0,r14,arg3 ;gives length of message call r11,_write,L ;writes out message I 7 #endif E 7 laddr r0,EDOM ;sets global variable _errno for user store r0,_errno,L I 7 #ifdef ARGSINREGS E 7 move r0,2 ;to print I 7 laddr r1,nanmess,L laddr r2,nanlen call LINK,_write,L #else move r0,2 ;to print E 7 store r0,r14,arg1 laddr r5,nanmess,L store r5,r14,arg2 ;gives write the message laddr r0,nanlen store r0,r14,arg3 ;gives write the length of message call r11,_write,L I 7 #endif E 7 err_rtn: ;resets all old pointers and returns one I 7 #ifdef ARGSINREGS laddr STKPTR,STKPTR,pe_size ;user will have already used matherr for himself load LINK,STKPTR,0 #else E 7 move r14,r15 ;user will have already used matherr for himself load r15,r14,8 load r11,r14,0 I 7 #endif E 7 laddr r0,PI2U,L laddr r1,PI2L,L ;to return pi_2 br sign inf: I 7 #ifdef ARGSINREGS store LINK,STKPTR,0 ;save old return laddr STKPTR,STKPTR,e_size ;update stack move r0,2 ;to print laddr r1,infmess,L laddr r2,inflen call LINK,_write,L #else E 7 store r11,r14,0 ;save old return store r15,r14,8 ;save old pointer move r15,r14 ;save old r14 pointer laddr r14,r14,e_size ;update stack move r0,2 ;to print store r0,r14,arg1 laddr r5,infmess,L store r5,r14,arg2 ;gives write the message laddr r0,inflen store r0,r14,arg3 ;gives write the length of message call r11,_write,L I 7 #endif E 7 br err_rtn E 1 h13337 s 00003/00000/00493 d D 4.3 87/04/16 13:55:42 mth 8 7 c Profiling changes e s 00097/00012/00396 d D 4.2 87/02/16 17:09:00 mth 7 6 c Parameters in registers. e s 00000/00000/00408 d D 4.1 87/02/16 16:57:14 mth 6 5 c rolled rev to -r4 (mth) e s 00002/00002/00406 d D 3.3 87/01/31 13:27:50 mkm 5 4 c correct compatability probs between ROS and SPIX as. -mkm e s 00000/00000/00408 d D 3.2 87/01/31 11:54:08 mkm 4 3 c from ROS sources as of this date. -mkm e s 00000/00000/00408 d D 3.1 87/01/21 17:46:05 mkm 3 2 c e s 00000/00000/00408 d D 2.1 87/01/21 17:43:28 mkm 2 1 c e s 00408/00000/00000 d D 1.1 87/01/21 17:41:46 mkm 1 0 c Placed under source control - mkm c These files are direct descendants of the ROS files c by the same name at or about ROS rev 5.1 e u U f b f n t T I 1 ; "%W% %G%" dsect data name byte 'atan2',0 ;name of routine emess byte 'atan2: DOMAIN error\n',0 ;error message messlen equ 20 ;length of message D 5 nanmess byte 'atan2: input value was NAN\n",0 ;error message if nan E 5 I 5 nanmess byte 'atan2: input value was NAN\n',0 ;error message if nan E 5 nanlen equ 27 D 5 infmess byte 'atan2: input value was INF\n",0;error message if "infinity" E 5 I 5 infmess byte 'atan2: input value was INF\n',0;error message if "infinity" E 5 inflen equ 27 csect code align 2 externd _errno external _write external _matherr e_type equ -32 ;exception type e_name equ -28 ;name of routine in error e_arg1 equ -24 ;argument 1 e_arg2 equ -16 ;argument 2 (if present) e_retval equ -8 ;room for exception block e_size equ -80 ; plus stack frame with 3 parameters I 7 #ifdef ARGSINREGS pe_size equ 80 ; positive e_size #else pe_size equ 0 ; positive e_size #endif E 7 DOMAIN equ 1 SING equ 2 OVERFLOW equ 3 UNDERFLOW equ 4 TLOSS equ 5 PLOSS equ 6 EDOM equ 33 ERANGE equ 34 PIU equ 0400921fbh PIL equ 054442d19h ;equals 3.14159265358979324 PI2U equ 03ff921fbh PI2L equ 054442d18h ;equals 1.57079632679489662 PI4U equ 03fe921fbh PI4L equ 054442d18h ;equals 0.78539816339744831 MPI2U equ 0bff921fbh MPI2L equ 054442d18h ;equals -1.57079632679489662 C1P1 equ 03feafdfch C1P2 equ 00abb1127h ;equals 0.8435039720139102 C2P1 equ 0402237d6h C2P2 equ 077a1db85h ;equals 9.1090581307487438 C3P1 equ 04036ed3bh C3P2 equ 0266ed388h ;equals 22.9266838093349465 C4P1 equ 0402f8669h C4P2 equ 0f9d8f82ah ;equals 15.7625272824626173 C5P1 equ 0402fbc4eh C5P2 equ 085349abfh ;equals 15.8677865626062825 C6P1 equ 040505691h C6P2 equ 0760b164fh ;equals 65.3526282413742890 C7P1 equ 0405849c4h C7P2 equ 035098c6ah ;equals 97.1526005357024121 C8P1 equ 04047a4cfh C8P2 equ 07b62bd8eh ;equals 47.2875818473940949 LIMITU equ 0433ff973h LIMITL equ 0cafa8000h ;equals 9e15 HALF equ 03fe00000h ;equals .5 TWO equ 040000000h ;equals top of 2 for a double ONE1 equ 03ff00000h ;equals top of 1 for a double ZEROS equ 000000000h ;equals zeros for various uses ABS equ 07fffffffh ;gives a mask to obtain the absolute value MASK equ 080000000h ;to mask off all but sign bit arg3 equ 40 arg2 equ 32 arg1 equ 24 arg_1 equ -8 arg_2 equ -16 arg_3 equ -24 arg_4 equ -32 ; ; _d_atn2.s ; global _atan2 ;cc, rc and rp global _d_atn2 ;f77 global _D_atn2 ;rf D 7 _atan2: loadd r0,r14,arg1 E 7 I 7 _atan2: I 8 ; MCOUNT E 8 #ifndef ARGSINREGS loadd r0,r14,arg1 E 7 loadd r2,r14,arg2 I 7 #endif E 7 br _D_atn2 _d_atn2: I 8 ; MCOUNT E 8 I 7 #ifdef ARGSINREGS loadd r2,r1 loadd r0,r0 #else E 7 load r0,r14,arg1 D 7 loadd r0,r0,0 E 7 load r2,r14,arg2 I 7 loadd r0,r0,0 E 7 loadd r2,r2,0 I 7 #endif E 7 _D_atn2: I 8 ; MCOUNT E 8 I 7 #ifdef ARGSINREGS store r7,STKPTR,arg_1 stored r8,STKPTR,arg_2 stored r12,STKPTR,arg_4 ;saves r7-13 ,except rp10, for use as constants #else E 7 stored r6,r14,arg_1 stored r8,r14,arg_2 stored r12,r14,arg_4 ;saves r6-13 ,except rp10, for use as constants I 7 #endif E 7 ; ; if ((arg1 == 0.0) && (arg2 == 0.0)) domain error ; move r4,r0 ;rp4 <- arg1 move r5,r1 move r6,r2 ;rp6 <- arg2 move r7,r3 or r4,r5 ;if rp4 != 0 br r4<>0,nz1! ; goto nz1 or r6,r7 ;if rp6 != 0 br r6<>0,nz2! ; goto nz2 br M_PI_2 ;return(pi/2) nz2: move r6,r2 ;rp6 <- arg2 move r7,r3 nz1: move r4,r0 ;rp4 <- arg1 move r5,r1 ; ; The next lines determine if |x| is neglibible compared to |y|, ; without dividing, and without adding values of the same sign. ; Prevents divide by zero if arg2 == 0. ; ; neg_y = 0; ; if (arg1 < 0) { ; arg1 = -arg1 ; neg_y++; ; } ; if (arg1 - ABS(arg2) == arg1) ; return(neg_y ? -M_PI_2 : M_PI_2); ; laddr r9,ABS,L ;mask for absolute values move r8,0 ;neg_y = 0 move r12,0 ;rp12 <- 0.0 move r13,0 drcomp r12,r4 ;check (0 > arg1) br r12<>1,notLT0! ;if arg1 >= 0 goto notLT0 and r4,r9 ;arg1 = -arg1 (same as ABS(arg1)) move r8,1 ;neg_y = 1 notLT0: and r6,r9 ;arg2 = ABS(arg2) move r12,r4 ;rp12 <- arg1 move r13,r5 drsub r12,r6 ;temp = arg1 - ABS(arg2) drcomp r12,r4 ;if subtraction made no difference in arg1, ; return(neg_y ? -M_PI_2 : M_PI_2) br r12<>0,DoAtan! br r8=0,M_PI_2! ;if neg_y = 0 return(M_PI_2) laddr r0,MPI2U,L ; else return( -M_PI_2 ) laddr r1,MPI2L,L D 7 E 7 I 7 #ifdef ARGSINREGS loadd r8,STKPTR,arg_2 load r7,STKPTR,arg_1 loadd r12,STKPTR,arg_4 ;restore all registers ret LINK,LINK #else E 7 loadd r8,r14,arg_2 loadd r6,r14,arg_1 loadd r12,r14,arg_4 ;restore all registers ret r11,r11 I 7 #endif E 7 M_PI_2: laddr r0,PI2U,L ;return( M_PI_2 ) laddr r1,PI2L,L D 7 E 7 I 7 #ifdef ARGSINREGS loadd r8,STKPTR,arg_2 load r7,STKPTR,arg_1 loadd r12,STKPTR,arg_4 ;restore all registers ret LINK,LINK #else E 7 loadd r8,r14,arg_2 loadd r6,r14,arg_1 loadd r12,r14,arg_4 ;restore all registers ret r11,r11 I 7 #endif E 7 DoAtan: laddr r13,r2 laddr r12,MASK,L and r13,r12 csl r13,1 ;to place sign bit of x in r13's low order bit laddr r12,r0 laddr r8,MASK,L and r12,r8 or r13,r12 ;to place sign bit of y in r13's high order bit drdiv r0,r2 ;rp0="quot=y/x" atn: ;rp0="result=%_datn(quot)" dck2: laddr r2,LIMITU,L ;to test highorder word of arg laddr r12,r0 ;to preserve the sign of arg laddr r4,ABS,L and r0,r4 ;rp0="x=abs(arg)" ;(keeps from having to find abs(arg) twice) br r0>=r2,toobig ;if abs(arg)>limit then pi_2 or error messages back: laddr r2,TWO,L ;(only use high order word since if low x>0 then br r0>=r2,greater2 ;still x>=2) if x>=2 then go to greater2 laddr r2,HALF,L br r0>r2,greater.5 ;if .5=0,back ;go back if more precise check reveals error ;in previous check laddr r4,07ff00000h,L laddr r5,0 ;"infinity" drcomp r4,r0 br r4=0,inf ;if abs(arg)=infinity then go to inf br r4<0,nan ;if abs(arg) is not-a-number then go to nan ;else return pi_2 laddr r0,PI2U,L laddr r1,PI2L,L ;returns pi_2 br sign ; ; error handling ; nan: ;loads values into error structure in case user ;wishes to do more with them than we have done D 7 E 7 I 7 #ifdef ARGSINREGS store LINK,STKPTR,0 ;save old return laddr STKPTR,STKPTR,e_size ;update stack #else E 7 store r11,r14,0 ;save old return store r15,r14,8 ;save old frame pointer move r15,r14 laddr r14,r14,e_size ;update stack D 7 E 7 I 7 #endif E 7 laddr r0,r12 ;restores arg's sign D 7 stored r0,r15,e_arg1 ;load arg's value into error structure E 7 I 7 stored r0,STKPTR,pe_size+e_arg1 ;load arg's value into error structure E 7 laddr r2,name,L ;name of offending routine D 7 store r2,r15,e_name ; into error structure E 7 I 7 store r2,STKPTR,pe_size+e_name ; into error structure E 7 move r3,DOMAIN ;exception type D 7 store r3,r15,e_type E 7 I 7 store r3,STKPTR,pe_size+e_type E 7 laddr r0,PI2U,L laddr r1,PI2L,L D 7 stored r0,r15,e_retval ;return pi_2 E 7 I 7 stored r0,STKPTR,pe_size+e_retval ;return pi_2 E 7 I 7 #ifdef ARGSINREGS laddr r0,STKPTR,pe_size+e_type ;user want to do different anything with error? call LINK,_matherr,L ;matherr is a function for user to define #else E 7 laddr r4,r15,e_type ;user want to do different anything with error? store r4,r14,arg1 ;gives matherr the address of error structure call r11,_matherr,L ;matherr is a function for user to define I 7 #endif E 7 br r0<>0,err_rtn ;yes (assume user will change r0 if yes ) mess: ;prints out our error message I 7 #ifdef ARGSINREGS E 7 move r0,2 I 7 laddr r1,emess,L laddr r2,messlen call LINK,_write,L ;writes out message #else move r0,2 E 7 store r0,r14,arg1 laddr r5,emess,L store r5,r14,arg2 ;gives message laddr r0,messlen store r0,r14,arg3 ;gives length of message call r11,_write,L ;writes out message I 7 #endif E 7 laddr r0,EDOM ;sets global variable _errno for user store r0,_errno,L move r0,2 ;to print I 7 #ifdef ARGSINREGS laddr r1,nanmess,L laddr r2,nanlen call LINK,_write,L #else E 7 store r0,r14,arg1 laddr r5,nanmess,L store r5,r14,arg2 ;gives write the message laddr r0,nanlen store r0,r14,arg3 ;gives write the length of message call r11,_write,L I 7 #endif E 7 err_rtn: ;resets all old pointers and returns one I 7 #ifdef ARGSINREGS laddr STKPTR,STKPTR,pe_size ;user will have already used matherr for himself load LINK,STKPTR,0 #else E 7 move r14,r15 ;user will have already used matherr for himself load r15,r14,8 load r11,r14,0 I 7 #endif E 7 laddr r0,PI2U,L laddr r1,PI2L,L ;to return pi_2 br sign inf: I 7 #ifdef ARGSINREGS store LINK,STKPTR,0 ;save old return laddr STKPTR,STKPTR,e_size #else E 7 store r11,r14,0 ;save old return store r15,r14,8 ;save old pointer move r15,r14 ;save old r14 pointer laddr r14,r14,e_size I 7 #endif E 7 move r0,2 ;to print I 7 #ifdef ARGSINREGS laddr r1,infmess,L laddr r2,inflen call LINK,_write,L #else E 7 store r0,r14,arg1 laddr r5,infmess,L store r5,r14,arg2 ;gives write the message laddr r0,inflen store r0,r14,arg3 ;gives write the length of message call r11,_write,L I 7 #endif E 7 br err_rtn ;1/24/85 hlf remove negate and branch to it because negative zeroes dont work well ;negate: or r12,r2 ;1/17/85 hlf if arg1 was zero force value to be negative ; br fini sign: laddr r2,MASK,L ; br r12=0,negate ;1/17/85 hlf and r12,r2 ;isolates sign bit fini: xor r0,r12 ;rp0="%_datn=%d_sign(result,arg)" laddr r12,1 and r12,r13 br r12=1,xless0 ;if (x<0) then go to xless0 D 7 done: loadd r8,r14,arg_2 E 7 I 7 done: #ifdef ARGSINREGS loadd r8,STKPTR,arg_2 load r7,STKPTR,arg_1 loadd r12,STKPTR,arg_4 ;restore all registers ret LINK,LINK #else loadd r8,r14,arg_2 E 7 loadd r6,r14,arg_1 loadd r12,r14,arg_4 ;restore all registers ret r11,r11 I 7 #endif E 7 xless0: laddr r2,PIU,L laddr r3,PIL,L laddr r12,MASK,L and r13,r12 ;to isolate high order bit of r13 (ie y's sign) xor r2,r13 ;(%d_sign(pi,y)) dradd r0,r2 ;rp0="%_dat2= result + %d_sign(pi,y)" br done E 1 h34380 s 00003/00000/00539 d D 4.3 87/04/16 13:55:45 mth 8 7 c Profiling changes e s 00120/00014/00419 d D 4.2 87/02/16 17:09:05 mth 7 6 c Parameters in registers. e s 00000/00000/00433 d D 4.1 87/02/16 16:57:17 mth 6 5 c rolled rev to -r4 (mth) e s 00003/00003/00430 d D 3.3 87/01/31 13:27:52 mkm 5 4 c correct compatability probs between ROS and SPIX as. -mkm e s 00000/00000/00433 d D 3.2 87/01/31 11:54:10 mkm 4 3 c from ROS sources as of this date. -mkm e s 00000/00000/00433 d D 3.1 87/01/21 17:46:06 mkm 3 2 c e s 00000/00000/00433 d D 2.1 87/01/21 17:43:30 mkm 2 1 c e s 00433/00000/00000 d D 1.1 87/01/21 17:41:47 mkm 1 0 c Placed under source control - mkm c These files are direct descendants of the ROS files c by the same name at or about ROS rev 5.1 e u U f b f n t T I 1 ; "%W% %G%" dsect data pix: ;initialize array pix word 1071931184 word 1073741824 ;equals 0.636619687080383301 word 1047979236 word 1073741824 ;equals 8.528719774858473100e-08 word 1018505720 word 0 ;equals 2.937086744604286430e-16 word 999333215 word 1073741824 ;equals 8.795767286342583120e-22 word 973034316 word 0 ;equals 2.471136637518957480e-29 word 951959771 word 1073741824 ;equals 2.238392930622293410e-35 name byte 'cos',0 ;name of routine D 5 emess byte 'cos: TLOSS error\n",0 ;error message E 5 I 5 emess byte 'cos: TLOSS error\n',0 ;error message E 5 messlen equ 17 ;length of message D 5 nanmess byte 'cos: input value was NAN\n",0 ;error message if nan E 5 I 5 nanmess byte 'cos: input value was NAN\n',0 ;error message if nan E 5 nanlen equ 25 D 5 infmess byte 'cos: input value was INF\n",0 ;error message if "infinity" E 5 I 5 infmess byte 'cos: input value was INF\n',0 ;error message if "infinity" E 5 inflen equ 25 csect code align 2 externd _errno external _write external _matherr e_type equ -32 ;exception type e_name equ -28 ;name of routine in error e_arg1 equ -24 ;argument 1 e_arg2 equ -16 ;argument 2 (if present) e_retval equ -8 ;room for exception block e_size equ -80 ; plus stack frame with 3 parameters I 7 #ifdef ARGSINREGS pe_size equ 80 ; positive e_size #else pe_size equ 0 ; positive e_size #endif E 7 DOMAIN equ 1 SING equ 2 OVERFLOW equ 3 UNDERFLOW equ 4 TLOSS equ 5 PLOSS equ 6 EDOM equ 33 ERANGE equ 34 PIX1U equ 1071931184 PIX1L equ 1073741824 ;equals pix[i] to save time in epre C1P1 equ 0c03a9a34h C1P2 equ 0939a4320h ;equals -26.602364754831 C2P1 equ 040a4bfc6h C2P2 equ 071b00eafh ;equals 2655.8875861185 C3P1 equ 0c0f920f0h C3P2 equ 019e78297h ;equals -102927.006324300873 C4P1 equ 0406571ech C4P2 equ 0610cc36dh ;equals 171.560104870728 C5P1 equ 040cd2f63h C5P2 equ 06070a8efh ;equals 14942.776380617605 C6P1 equ 04122d8b4h C6P2 equ 0136da1e4h ;equals 617562.037945803750 CC1P1 equ 0c05c5464h CC1P2 equ 0a1a690ech ;equals -113.318642056143 CC2P1 equ 040bfdca2h CC2P2 equ 054c66210h ;equals 8156.634106062833 CC3P1 equ 0c1027d14h CC3P2 equ 08399f561h ;equals -151458.564258496326 CC4P1 equ 040602b4bh CC4P2 equ 081c62df4h ;equals 129.352967154569 CC5P1 equ 040c170e9h CC5P2 equ 0b4d57133h ;equals 8929.825831108354 CC6P1 equ 041127d14h CC6P2 equ 08399f4fah ;equals 302917.128516986641 NUM1 equ 03ff921fbh NUM2 equ 054442d18h ;equals 1.570796323679489662 LIMITU equ 041dfffffh LIMITL equ 0ffc00000h ;equals 2147483647 HALFSZ equ 000000017h ;equals 23 as an integer representation HALF_2 equ 000000015h ;equals 21 as an integer representation MULTU equ 03fe921ffh MULTL equ 02e48e8a7h ;equals .7854 to test whether mult=0 or not SINLIM1 equ 03ff921fbh SINLIM2 equ 054442d18h ;equals 1.570796323679489662 = pi/2 ABS equ 07fffffffh ;constant to find absolute value MMANT equ 0000007ffh ;constant to mask rotated mantissa and sign bit EBIAS equ 1023 ;to unbias exponent arg equ -8 arg3 equ 40 arg2 equ 32 arg1 equ 24 arg_1 equ -16 arg_2 equ -24 arg_3 equ -32 arg_4 equ -40 arg_5 equ -48 arg_6 equ -56 arg_7 equ -64 ; ; _d_cos.s ; global _cos ;cc, rc and rp global _d_cos ;f77 global _D_cos ;rf D 7 _cos: loadd r0,r14,arg1 E 7 I 7 _cos: I 8 ; MCOUNT E 8 #ifndef ARGSINREGS loadd r0,r14,arg1 #endif E 7 br _D_cos _d_cos: I 8 ; MCOUNT E 8 I 7 #ifndef ARGSINREGS E 7 load r0,r14,arg1 I 7 #endif E 7 loadd r0,r0,0 _D_cos: I 8 ; MCOUNT E 8 laddr r2,r0 laddr r3,r1 ;to save sign of arg laddr r4,ABS,L and r2,r4 laddr r4,LIMITU,L laddr r5,LIMITL,L drcomp r4,r2 br r4<0,badinput ;if abs(arg)>limit then badinput I 7 #ifdef ARGSINREGS store r7,STKPTR,arg_1 stored r8,STKPTR,arg_2 stored r10,STKPTR,arg_3 ;save registers 7-11 for arithmetic constants stored r12,STKPTR,arg_4 ;store rp12 to use as variables #else E 7 stored r6,r14,arg_1 stored r8,r14,arg_2 D 7 stored r10,r14,arg_3 ;save registers 6-11 for arithmetic constants E 7 I 7 stored r10,r14,arg_3 ;save registers 7-11 for arithmetic constants stored r12,r14,arg_4 ;store rp12 to use as variables #endif E 7 ; rp0="result",arg stored at r14+arg; rp2="upper"; rp4="lower"; r6="cutoff" ; r7="mod4",%dlgb; rp8="dmult","rtemp",constants; r12="mult"; r13="i" D 7 stored r12,r14,arg_4 ;store rp12 to use as variables E 7 epre: laddr r4,MULTU,L laddr r5,MULTL,L ;load rp4 with .7854 to test with drcomp r4,r2 br r4>0,mult0! ;branchs to mult0 if lessthan .7854 ; laddr r4,SINLIM1,L ; laddr r5,SINLIM2,L ; drcomp r4,r2 ; br r4>0,mult1! ;if .7854=r6,cont! ;while (%_dlgb(result)=r8,cont ;and (i+2= -1) then begin ;?if (rtemp>=.5) then begin? dfixr r8,r8 dfloat r8,r8 ;rp8="dmult=%d_dnint(rtemp)" drsub r0,r8 ;rp0="result=result-dmult" I 7 #ifdef ARGSINREGS stored r2,STKPTR,arg_5 stored r4,STKPTR,arg_6 ;store rp2 and rp4 temporarily #else E 7 stored r2,r14,arg_5 stored r4,r14,arg_6 ;store rp2 and rp4 temporarily I 7 #endif E 7 laddr r2,000200000h,L laddr r4,r8 laddr r5,r9 ;rp4=rp8="dmult"; rp2=4 sub r4,r2 ;rp4="(dmult/4)" ????????? dfixt r4,r4 dfloat r4,r4 add r4,r2 ;rp4="%d_dint(dmult/4)*4)"????????? drsub r8,r4 ;rp8="dmult-..." dfixt r7,r8 ;r7="mod4=trunc(dmult-%d+dint(dmult/4)*4)" I 7 #ifdef ARGSINREGS loadd r2,STKPTR,arg_5 loadd r4,STKPTR,arg_6 ;restore rp2 and rp4 #else E 7 loadd r2,r14,arg_5 loadd r4,r14,arg_6 ;restore rp2 and rp4 I 7 #endif E 7 add r12,r7 ;r12="mult=mult+mod4" laddr r8,r0 laddr r9,r1 dradd r8,r10 ;rp8="rtemp=result+rlower" ifnot: drsub r0,r8 dradd r10,r0 ;rp10="(result-rtemp)+rlower" laddr r0,r8 laddr r1,r9 ;rp0="result=rtemp" laddr r8,HALFSZ,L sub r6,r8 ;r6="cutoff=cutoff-halfsz" add r13,8 ;r13="i=i+1" br while cont: ;assumes rp6 and rp8 free for use as constants I 7 #ifdef ARGSINREGS loadd r2,STKPTR,arg ;rp2="original arg" #else E 7 loadd r2,r14,arg ;rp2="original arg" I 7 #endif E 7 loadd r8,r13,pix,L ;rp8="pix[i]" drmpy r4,r8 ;rp4="lower*pix[i]" add r13,8 loadd r8,r13,pix,L ;rp8="pix[i+1]" add r13,8 loadd r6,r13,pix,L ;rp6="pix[i+2]" dradd r8,r6 ;rp8="(pix[i+1]+pix[i+2])" drmpy r2,r8 ;rp2="arg*..." dradd r4,r2 ;rp4="(lower*pix[i]+arg*(pix[i+1]+pix[i+2]))" dradd r4,r10 ;rp4="...+rlower" dradd r0,r4 ;rp0="...+result" laddr r8,NUM1,L laddr r9,NUM2,L drmpy r0,r8 ;rp0= ;result= NUM *(((lower * pix[i] + arg * (pix[i+1] + pix[i+2])) +rlower)+result) esnc: ;final calculations -uses rp0="x"(old result) ;rp2="xsq" and r12="mult" laddr r2,r0 laddr r3,r1 drmpy r2,r2 ;rp2="xsq=x*x" add r12,1 ;r12="mult=mult+sncsfg" (for cos sncsfg=1) laddr r4,000000001h and r4,r12 br r4=1,odd ;"if (not odd(mult)) then begin even: laddr r6,C1P1,L laddr r7,C1P2,L drmpy r6,r2 ;rp6="(c1)*xsq" laddr r8,C2P1,L laddr r9,C2P2,L dradd r6,r8 ;rp6="...+c2" drmpy r6,r2 ;rp6="...*xsq" laddr r8,C3P1,L laddr r9,C3P2,L dradd r6,r8 ;rp6="...+c3" drmpy r6,r2 ;rp6="...*xsq" drmpy r6,r0 ;rp6="...*x" laddr r8,C4P1,L laddr r9,C4P2,L dradd r8,r2 ;rp8="xsq+c4" drmpy r8,r2 ;rp8="...*xsq" laddr r10,C5P1,L laddr r11,C5P2,L dradd r8,r10 ;rp8="...+c5" drmpy r8,r2 ;rp8="...*xsq" laddr r10,C6P1,L laddr r11,C6P2,L dradd r8,r10 ;rp8="...+c6" drdiv r6,r8 dradd r0,r6 fini laddr r2,2 and r2,r12 br r2=2,negate ;"if (odd(mult div 2)) then result=-result" D 7 fini2: loadd r6,r14,arg_1 E 7 I 7 fini2: #ifdef ARGSINREGS load r7,STKPTR,arg_1 loadd r8,STKPTR,arg_2 loadd r10,STKPTR,arg_3 loadd r12,STKPTR,arg_4 ;restore saved registers ret LINK,LINK ;done #else loadd r6,r14,arg_1 E 7 loadd r8,r14,arg_2 loadd r10,r14,arg_3 loadd r12,r14,arg_4 ;restore saved registers ret r11,r11 ;done I 7 #endif E 7 D 7 mult0: stored r12,r14,arg_4 E 7 I 7 mult0: #ifdef ARGSINREGS stored r12,STKPTR,arg_4 #else stored r12,r14,arg_4 #endif E 7 laddr r12,0 ;since abs(arg)<.7854 mult=0 br esnc ;time for final calculations D 7 mult1: stored r12,r14,arg_4 E 7 I 7 mult1: #ifdef ARGSINREGS stored r12,STKPTR,arg_4 #else stored r12,r14,arg_4 #endif E 7 laddr r12,1 ;since .78540,err_rtn ;yes (assume user will change r0 if yes ) mess: ;prints out our error message move r0,2 I 7 #ifdef ARGSINREGS laddr r1,emess,L laddr r2,messlen call LINK,_write,L ;writes out message #else E 7 store r0,r14,arg1 laddr r5,emess,L store r5,r14,arg2 ;gives message laddr r0,messlen store r0,r14,arg3 ;gives length of message call r11,_write,L ;writes out message I 7 #endif E 7 laddr r0,ERANGE ;sets global variable _errno for user store r0,_errno,L D 7 E 7 I 7 #ifdef ARGSINREGS load r4,STKPTR,arg_1 ;restore r4's old value (if inf or not) #else E 7 load r4,r14,arg_1 ;restore r4's old value (if inf or not) I 7 #endif E 7 br r4=0,inf ;if abs(arg)="infinity" then go to inf br r4<0,nan ;if abs(arg) is not-a-number then go to nan err_rtn: ;resets all old pointers and returns zero I 7 #ifdef ARGSINREGS laddr STKPTR,STKPTR,pe_size ;user will have already used matherr for himself load LINK,STKPTR,0 #else E 7 move r14,r15 ;user will have already used matherr for himself load r15,r14,8 load r11,r14,0 I 7 #endif E 7 laddr r0,0 laddr r1,0 ;to return 0 I 7 #ifdef ARGSINREGS ret LINK,LINK #else E 7 ret r11,r11 I 7 #endif E 7 inf: move r0,2 ;to print I 7 #ifdef ARGSINREGS laddr r1,infmess,L laddr r2,inflen call LINK,_write,L #else E 7 store r0,r14,arg1 laddr r5,infmess,L store r5,r14,arg2 ;gives write the message laddr r0,inflen store r0,r14,arg3 ;gives write the length of message call r11,_write,L I 7 #endif E 7 br err_rtn nan: move r0,2 ;to print I 7 #ifdef ARGSINREGS laddr r1,nanmess,L laddr r2,nanlen call LINK,_write,L #else E 7 store r0,r14,arg1 laddr r5,nanmess,L store r5,r14,arg2 ;gives write the message laddr r0,nanlen store r0,r14,arg3 ;gives write the length of message call r11,_write,L I 7 #endif E 7 br err_rtn E 1 h51633 s 00003/00000/00367 d D 4.3 87/04/16 13:55:50 mth 8 7 c Profiling changes e s 00065/00010/00302 d D 4.2 87/02/16 17:09:10 mth 7 6 c Parameters in registers. e s 00000/00000/00312 d D 4.1 87/02/16 16:57:21 mth 6 5 c rolled rev to -r4 (mth) e s 00002/00002/00310 d D 3.3 87/01/31 13:27:55 mkm 5 4 c correct compatability probs between ROS and SPIX as. -mkm e s 00000/00000/00312 d D 3.2 87/01/31 11:54:11 mkm 4 3 c from ROS sources as of this date. -mkm e s 00000/00000/00312 d D 3.1 87/01/21 17:46:08 mkm 3 2 c e s 00000/00000/00312 d D 2.1 87/01/21 17:43:31 mkm 2 1 c e s 00312/00000/00000 d D 1.1 87/01/21 17:41:48 mkm 1 0 c Placed under source control - mkm c These files are direct descendants of the ROS files c by the same name at or about ROS rev 5.1 e u U f b f n t T I 1 ; "%W% %G%" dsect data name byte 'cosh',0 ;name of routine ;no messages printed D 5 nanmess byte 'cosh: input value was NAN\n",0 ;error message if nan E 5 I 5 nanmess byte 'cosh: input value was NAN\n',0 ;error message if nan E 5 nanlen equ 26 D 5 infmess byte 'cosh: input value was INF\n",0 ;error message if "infinity" E 5 I 5 infmess byte 'cosh: input value was INF\n',0 ;error message if "infinity" E 5 inflen equ 26 csect code align 2 externd _errno external _write external _matherr e_type equ -32 ;exception type e_name equ -28 ;name of routine in error e_arg1 equ -24 ;argument 1 e_arg2 equ -16 ;argument 2 (if present) e_retval equ -8 ;room for exception block e_size equ -80 ; plus stack frame with 3 parameters I 7 #ifdef ARGSINREGS pe_size equ 80 ; positive e_size #else pe_size equ 0 ; positive e_size #endif E 7 DOMAIN equ 1 SING equ 2 OVERFLOW equ 3 UNDERFLOW equ 4 TLOSS equ 5 PLOSS equ 6 EDOM equ 33 ERANGE equ 34 P0P1 equ 04097a774h P0P2 equ 0e9c773d2h ;equals 1513.86417304653562 P1P1 equ 0403433a2h P1P2 equ 09c957777h ;equals 20.20170000695313 P2P1 equ 03f97a609h P2P2 equ 0aa5cd009h ;equals 0.02309432127295 Q0P1 equ 040b11016h Q0P2 equ 0b314dfb0h ;equals 4368.08867006741699 Q1P1 equ 0406d25b4h Q1P2 equ 013b3ffdah ;equals 233.177823205143104 LOG2U1 equ 1073157447 LOG2U2 equ 1073741824 ;equals 1.44269490242004395 LOG2L1 equ 03e8295c1h LOG2L2 equ 07f0bbbe8h ;equals 1.384689194620474 C1P1 equ 03e22203bh C1P2 equ 08e37b8d4h ;equals .0000000021101335 C2P1 equ 03e927e04h C2P2 equ 0236f2b8dh ;equals .000000275556007731 C3P1 equ 03efa01a0h C3P2 equ 08c597eb2h ;equals .000024801593801248 C4P1 equ 03f56c16ch C4P2 equ 01668ecc9h ;equals .001388888887631267 C5P1 equ 03fa55555h C5P2 equ 055559647h ;equals .041666666666782032 C6P1 equ 03fdfffffh C6P2 equ 0ffffffb9h ;equals .499999999999996056 LIMIT1U equ 040863000h LIMIT1L equ 000000000h ;equals 710 LIMIT2U equ 03fe80000h LIMIT2L equ 000000000h ;equals .75 MINUS2 equ 0fffffffeh ;equals -2 in two's complement form HALF1 equ 03fe00000h HALF2 equ 000000000h ;equals .5 ONE1 equ 03ff00000h ONE2 equ 000000000h ;equals 1 ABS equ 07fffffffh ;to get absolute value MASK1 equ 0000007ffh ;to mask off all but moved exponent MASK2 equ 0800fffffh ;to clear of exponent arg3 equ 40 arg2 equ 32 arg1 equ 24 arg_1 equ -8 arg_2 equ -12 ; ; _d_cosh.s ; global _cosh ;cc, rc and rp global _d_cosh ;f77 global _D_cosh ;rf D 7 _cosh: loadd r0,r14,arg1 E 7 I 7 _cosh: I 8 ; MCOUNT E 8 #ifndef ARGSINREGS loadd r0,r14,arg1 #endif E 7 br _D_cosh _d_cosh: I 8 ; MCOUNT E 8 I 7 #ifndef ARGSINREGS E 7 load r0,r14,arg1 I 7 #endif E 7 loadd r0,r0,0 _D_cosh: I 8 ; MCOUNT E 8 laddr r2,LIMIT1U,L laddr r3,ABS,L and r0,r3 ;get abs(arg) br r0>=r2,toobig ;if abs(arg)>=710 then go to toobig ;"toobig" avoids having to use a drcomp normal: laddr r2,LIMIT2U,L ;need only comp high order since if r0's high ;is >= r3's then the loworder doesn't matter ;since r3's loworder=0. br r0>=r2,greater! ;if (x<.75) then ... else go to greater lessthan: drmpy r0,r0 ;rp0="xsq=x*x" laddr r2,C1P1,L laddr r3,C1P2,L ;C1 drmpy r2,r0 ;"(C1)*xsq" laddr r4,C2P1,L laddr r5,C2P2,L ;C2 dradd r2,r4 ;"(...+C2)" drmpy r2,r0 ;"...*xsq" laddr r4,C3P1,L laddr r5,C3P2,L ;C3 dradd r2,r4 ;"(...+C3)" drmpy r2,r0 ;"...*xsq" laddr r4,C4P1,L laddr r5,C4P2,L ;C4 dradd r2,r4 ;"(...+C4)" drmpy r2,r0 ;"...*xsq" laddr r4,C5P1,L laddr r5,C5P2,L ;C5 dradd r2,r4 ;"(...+C5)" drmpy r2,r0 ;"...*xsq" laddr r4,C6P1,L laddr r5,C6P2,L ;C6 dradd r2,r4 ;"(...+C6)" drmpy r2,r0 ;"...*xsq" laddr r0,ONE1,L laddr r1,ONE2,L dradd r0,r2 ;rp0="result=1+(...)" br done greater: I 7 #ifdef ARGSINREGS stored r7,STKPTR,arg_1 ;to save registers 7 and 8 #else E 7 stored r6,r14,arg_1 ;to save registers 6 and 7 store r8,r14,arg_2 ;to save registers 8 I 7 #endif E 7 eere: makedr r4,r0 ;"sngl_temp=arg" makerd r4,r4 ;"upper=sngl_temp" laddr r2,r0 laddr r3,r1 drsub r2,r4 ;"lower=arg-upper" laddr r6,LOG2U1,L laddr r7,LOG2U2,L ;LOG2U drmpy r4,r6 ;rp4="x=upper*log2_u.d" dfixr r6,r4 ;r6=mult="longmult=%i_idnint(x)" dfloat r7,r6 ;makes "longmult" a double so can use drsub drsub r4,r7 ;rp4="(x-longmult)" laddr r7,LOG2U1,L laddr r8,LOG2U2,L ;LOG2U drmpy r2,r7 ;rp2="(lower*log2_u.d" laddr r7,LOG2L1,L laddr r8,LOG2L2,L ;LOG2L drmpy r0,r7 ;rp0="arg*log2_l)" dradd r0,r2 ;rp0="(lower*log2_u.d + arg*log2_l)" dradd r0,r4 ;rp0="x=...+..." laddr r2,r0 laddr r3,r1 drmpy r2,r2 ;rp2="xsq=x*x" laddr r4,P2P1,L laddr r5,P2P2,L ;P2 drmpy r4,r2 ;"xsq*p2)" laddr r7,P1P1,L laddr r8,P1P2,L ;P1 dradd r4,r7 ;"(p1+...)" drmpy r4,r2 ;"xsq*(...)" laddr r7,P0P1,L laddr r8,P0P2,L ;P0 dradd r4,r7 ;"(p0+...)" drmpy r0,r4 ;rp0="p=x*(p0+xsq*(p1+xsq*p2))" laddr r4,Q1P1,L laddr r5,Q1P2,L ;Q1 dradd r4,r2 ;"(q1+xsq)" drmpy r2,r4 ;"xsq*(..)" laddr r4,Q0P1,L laddr r5,Q0P2,L ;Q0 dradd r2,r4 ;rp4="q=q0+xsq*(q1+xsq)" cont: drsub r2,r0 ;"(q-p)" drdiv r0,r2 ;rp0="x=p/(q-p)" laddr r2,28 br r6>=r2,skip ;if (mult<28) then ... laddr r2,HALF1,L laddr r3,HALF2,L dradd r2,r0 ;"(x+.5)" laddr r4,HALF1,L laddr r5,HALF2,L drdiv r4,r2 ;rp4=".5/(x+.5)" laddr r7,r6 ;to save r6 "mult" laddr r2,MINUS2,L mpy r7,r2 sub r7,1 ;r7="-2*mult-1" dpckless: laddr r2,r4 ;r2 gets value of highorder rp4 laddr r3,12 ;to make csl fastser csl r2,r3 ;exponent now on loworder side of r2 laddr r3,MASK1,L and r2,r3 ;exponent of r4 now integer value in r2 add r2,r7 ;r2="u.exp=u.exp+power2" laddr r3,20 csl r2,r3 ;place r2's value in double expon's place laddr r3,MASK2,L and r4,r3 ;to clear r4 of its exponent or r4,r2 ;give r4's exponent the value of integer r2 ;rp4="xsq" now dradd r0,r4 ;rp0="x=x+xsq" skip: laddr r2,HALF1,L laddr r3,HALF2,L dradd r0,r2 ;".5+x" dpck: laddr r2,r0 ;to give r2 highorder of rp0 laddr r3,12 csl r2,r3 laddr r3,MASK1,L and r2,r3 ;r2 = rp4's exponent in integer form add r2,r6 ;r2="u.exp=u.exp+power2" laddr r3,20 csl r2,r3 laddr r3,MASK2,L and r0,r3 ;to clear rp0 of its exponent or r0,r2 ;gives rp0 the value of integer r2 D 7 E 7 I 7 #ifdef ARGSINREGS loadd r7,STKPTR,arg_1 ;restore registers 7 and 8 #else E 7 loadd r6,r14,arg_1 ;restore registers 6 and 7 load r8,r14,arg_2 ;restore registers 8 I 7 #endif E 7 I 7 #ifdef ARGSINREGS done: ret LINK,LINK #else E 7 done: ret r11,r11 I 7 #endif E 7 equal: br r1=0,normal ;if abs(arg)=710 then go back to function br badinput ;go back to badinput toobig: br r0=r2,equal ;to check further ; ; error handling ; badinput: ;returns info to user about input error laddr r4,07ff00000h,L laddr r5,0 ;rp5="infinity" drcomp r4,r0 struct: ;loads values into error structure in case user ;wishes to do more with them than we have done D 7 E 7 I 7 #ifdef ARGSINREGS store LINK,STKPTR,0 ;save old return laddr STKPTR,STKPTR,e_size ;update stack store r4,STKPTR,arg_1 ;saves r4's value (ie whether or not it's inf) #else E 7 store r11,r14,0 ;save old return store r15,r14,8 ;save old frame pointer move r15,r14 laddr r14,r14,e_size ;update stack D 7 E 7 store r4,r14,arg_1 ;saves r4's value (ie whether or not it's inf) I 7 #endif E 7 D 7 stored r0,r15,e_arg1 ;load arg's value into error structure E 7 I 7 stored r0,STKPTR,pe_size+e_arg1 ;load arg's value into error structure E 7 laddr r2,name,L ;name of offending routine D 7 store r2,r15,e_name ; into error structure E 7 I 7 store r2,STKPTR,pe_size+e_name ; into error structure E 7 move r3,OVERFLOW ;exception type D 7 store r3,r15,e_type E 7 I 7 store r3,STKPTR,pe_size+e_type E 7 laddr r0,07ff00000h,L laddr r1,0 D 7 stored r0,r15,e_retval ;return inf E 7 I 7 stored r0,STKPTR,pe_size+e_retval ;return inf E 7 I 7 #ifdef ARGSINREGS laddr r0,STKPTR,pe_size+e_type ;user want to do different anything with error? call LINK,_matherr,L ;matherr is a function for user to define #else E 7 laddr r4,r15,e_type ;user want to do different anything with error? store r4,r14,arg1 ;gives matherr the address of error structure call r11,_matherr,L ;matherr is a function for user to define I 7 #endif E 7 br r0<>0,err_rtn ;yes (assume user will change r0 if yes ) laddr r0,ERANGE ;sets global variable _errno for user store r0,_errno,L D 7 E 7 I 7 #ifdef ARGSINREGS load r4,STKPTR,arg_1 ;restore r4's old value (if inf or not) #else E 7 load r4,r14,arg_1 ;restore r4's old value (if inf or not) I 7 #endif E 7 br r4=0,inf ;if abs(arg)="infinity" then go to inf br r4<0,nan ;if abs(arg) is not-a-number then go to nan err_rtn: ;resets all old pointers and returns inf I 7 #ifdef ARGSINREGS laddr STKPTR,STKPTR,pe_size ;user will have already used matherr for himself load LINK,STKPTR,0 #else E 7 move r14,r15 ;user will have already used matherr for himself load r15,r14,8 load r11,r14,0 I 7 #endif E 7 laddr r0,07ff00000h,L laddr r1,0 ;returns inf I 7 #ifdef ARGSINREGS ret LINK,LINK #else E 7 ret r11,r11 I 7 #endif E 7 inf: move r0,2 ;to print I 7 #ifdef ARGSINREGS laddr r1,infmess,L laddr r2,inflen call LINK,_write,L #else E 7 store r0,r14,arg1 laddr r5,infmess,L store r5,r14,arg2 ;gives write the message laddr r0,inflen store r0,r14,arg3 ;gives write the length of message call r11,_write,L I 7 #endif E 7 br err_rtn nan: move r0,2 ;to print I 7 #ifdef ARGSINREGS laddr r1,nanmess,L laddr r2,nanlen,L call LINK,_write,L #else E 7 store r0,r14,arg1 laddr r5,nanmess,L store r5,r14,arg2 ;gives write the message D 7 laddr r0,nanlen E 7 I 7 laddr r0,nanlen,L E 7 store r0,r14,arg3 ;gives write the length of message call r11,_write,L I 7 #endif E 7 br err_rtn E 1 2 xsq*p2)" laddr r7,P1P1,L laddr r8,P1P2,L ;P1 dradd r0,r7 ;"(p1+...)" drmpy r0,r2 ;"xsq*(...)" laddr r7,P0P1,L laddr r8,P0P2,L ;P0 dradd r0,r7 ;"(p0+...)" drmpy r0,r4 ;rp0="p=x*(p0+xsq*(p1+xsq*p2))" laddr r4,Q1P1,L laddr r5,Q1P2,L ;Q1 dradd r4,r2 ;"(q1+xsq)" drmpy r2,r4 ;"xsq*(..)" laddr r4,Q0P1,L laddr r5,Q0P2,L ;Q0 dradd r2,r4 ;rp2="q=q0+xsq*(q1+xsq)" dpck: drsub r2,r0 ;"(q-p)" drdiv r0,r2 ;"p/(q-p)" laddr r2,03fe00000h,L move r3,0 ;rp3=.5 dradd r0,r2 ;".5+..." add r6,1 ;"mult=mult+1" move r2,r0 move r3,12 ;to make csl faster csl r2,r3 ;to place exponent on loworder side of r8 laddr r3,0000007ffh,L ;to mask and r2,r3 ; off exponent add r2,r6 ;r2="u.exp=u.exp+power2" laddr r3,0800fffffh,L and r0,r3 ;to clear r5 of its exponent laddr r3,20 csl r2,r3 ;to replace the exponent in its proper position or r0,r2 ;to give rp5 back its expon + mult-rp5="temp" D 7 E 7 I 7 #ifdef ARGSINREGS loadd r7,STKPTR,arg_1 ret LINK,LINK #else E 7 loadd r6,r14,arg_1 load r8,r14,arg_2 ret r11,r11 I 7 #endif E 7 toosmall: laddr r0,03ff00000h,L move r1,0 I 7 #ifdef ARGSINREGS ret LINK,LINK ;returns the value of 1 #else E 7 ret r11,r11 ;returns the value of 1 I 7 #endif E 7 ; ; error handling ; toobig: ;sends program to neg or positvie laddr r3,080000000h,L and r3,r2 ;to get sign of arg alone br r3=0,positive ;if arg is positive then go to positive else neg: ;returns 0 after loading error structure for ;possible alternative error processing by user ;doesn't print any message unless -nan or -inf laddr r4,07ff00000h,L move r5,0 ;rp5="infinity" drcomp r4,r0 struct1: ;loads values into error structure I 7 #ifdef ARGSINREGS store LINK,STKPTR,0 ;save old return laddr STKPTR,STKPTR,e_size ;update stack store r4,STKPTR,arg_1 ;saves r4's value (ie whether or not it's inf) #else E 7 store r11,r14,0 ;save old return store r15,r14,8 ;save old frame pointer move r15,r14 laddr r14,r14,e_size ;update stack D 7 E 7 store r4,r14,arg_1 ;saves r4's value (ie whether or not it's inf) I 7 #endif E 7 D 7 stored r0,r15,e_arg1 ;load arg's value into error structure E 7 I 7 stored r0,STKPTR,pe_size+e_arg1 ;load arg's value into error structure E 7 laddr r2,name,L ;name of offending routine D 7 store r2,r15,e_name ; into error structure E 7 I 7 store r2,STKPTR,pe_size+e_name ; into error structure E 7 move r3,UNDERFLOW ;exception type D 7 store r3,r15,e_type E 7 I 7 store r3,STKPTR,pe_size+e_type E 7 move r0,0 move r1,0 D 7 stored r0,r15,e_retval ;return 0 E 7 I 7 stored r0,STKPTR,pe_size+e_retval ;return 0 E 7 I 7 #ifdef ARGSINREGS laddr r0,STKPTR,pe_size+e_type ;user want to do different anything with error? call LINK,_matherr,L ;matherr is a function for user to define #else E 7 laddr r4,r15,e_type ;user want to do different anything with error? store r4,r14,arg1 ;gives matherr the address of error structure call r11,_matherr,L ;matherr is a function for user to define I 7 #endif E 7 br r0<>0,err_rtn1 ;yes (assume user will change r0 if yes ) laddr r0,ERANGE ;sets global variable _errno for user store r0,_errno,L D 7 E 7 I 7 #ifdef ARGSINREGS load r4,LINK,arg_1 ;restore r4's old value (if inf or not) #else E 7 load r4,r14,arg_1 ;restore r4's old value (if inf or not) I 7 #endif E 7 br r4=0,inf1 ;if abs(arg)="infinity" then go to inf br r4<0,nan1 ;if abs(arg) is not-a-number then go to nan err_rtn1: ;resets all old pointers and returns 0 I 7 #ifdef ARGSINREGS laddr STKPTR,STKPTR,pe_size ;user will have already used matherr for himself load LINK,STKPTR,0 #else E 7 move r14,r15 ;user will have already used matherr for himself load r15,r14,8 load r11,r14,0 I 7 #endif E 7 move r0,0 move r1,0 ;returns 0 I 7 #ifdef ARGSINREGS ret LINK,LINK #else E 7 ret r11,r11 I 7 #endif E 7 D 7 inf1: move r0,2 ;to print E 7 I 7 inf1: move r0,2 ;to print #ifdef ARGSINREGS laddr r1,infmess,L laddr r2,inflen call LINK,_write,L #else E 7 store r0,r14,arg1 laddr r5,infmess,L store r5,r14,arg2 ;gives write the message laddr r0,inflen store r0,r14,arg3 ;gives write the length of message call r11,_write,L I 7 #endif E 7 br err_rtn1 nan1: move r0,2 ;to print I 7 #ifdef ARGSINREGS laddr r1,nanmess,L laddr r2,nanlen call LINK,_write,L #else E 7 store r0,r14,arg1 laddr r5,nanmess,L store r5,r14,arg2 ;gives write the message laddr r0,nanlen store r0,r14,arg3 ;gives write the length of message call r11,_write,L I 7 #endif E 7 br err_rtn1 positive: ;returns inf after loading error structure for ;possible alternative error processing by user ;doesn't print any message unless nan or nan laddr r3,040863000h,L ;r3=upper word of 710 br r00,err_rtn2 ;yes (assume user will change r0 if yes ) laddr r0,ERANGE ;sets global variable _errno for user store r0,_errno,L I 7 #ifdef ARGSINREGS load r4,STKPTR,arg_1 ;restore r4's old value (if inf or not) #else E 7 load r4,r14,arg_1 ;restore r4's old value (if inf or not) I 7 #endif E 7 br r4=0,inf2 ;if abs(arg)="infinity" then go to inf br r4<0,nan2 ;if abs(arg) is not-a-number then go to nan err_rtn2: ;resets all old pointers and returns inf I 7 #ifdef ARGSINREGS laddr STKPTR,STKPTR,pe_size ;user will have already used matherr for himself load LINK,STKPTR,0 #else E 7 move r14,r15 ;user will have already used matherr for himself load r15,r14,8 load r11,r14,0 I 7 #endif E 7 laddr r0,07ff00000h,L move r1,0 ;returns inf I 7 #ifdef ARGSINREGS ret LINK,LINK #else E 7 ret r11,r11 I 7 #endif E 7 inf2: move r0,2 ;to print I 7 #ifdef ARGSINREGS laddr r1,infmess,L laddr r2,inflen call LINK,_write,L #else E 7 store r0,r14,arg1 laddr r5,infmess,L store r5,r14,arg2 ;gives write the message laddr r0,inflen store r0,r14,arg3 ;gives write the length of message call r11,_write,L I 7 #endif E 7 br err_rtn2 nan2: move r0,2 ;to print I 7 #ifdef ARGSINREGS laddr r1,nanmess,L laddr r2,nanlen call LINK,_write,L #else E 7 store r0,r14,arg1 laddr r5,nanmess,L store r5,r14,arg2 ;gives write the message laddr r0,nanlen store r0,r14,arg3 ;gives write the length of message call r11,_write,L I 7 #endif E 7 br err_rtn2 E 1 h00307 s 00003/00000/00413 d D 4.3 87/04/16 13:55:56 mth 8 7 c Profiling changes e s 00112/00017/00301 d D 4.2 87/02/16 17:09:18 mth 7 6 c Parameters in registers. e s 00000/00000/00318 d D 4.1 87/02/16 16:57:27 mth 6 5 c rolled rev to -r4 (mth) e s 00004/00004/00314 d D 3.3 87/01/31 13:27:59 mkm 5 4 c correct compatability probs between ROS and SPIX as. -mkm e s 00000/00000/00318 d D 3.2 87/01/31 11:54:14 mkm 4 3 c from ROS sources as of this date. -mkm e s 00000/00000/00318 d D 3.1 87/01/21 17:46:11 mkm 3 2 c e s 00000/00000/00318 d D 2.1 87/01/21 17:43:34 mkm 2 1 c e s 00318/00000/00000 d D 1.1 87/01/21 17:41:49 mkm 1 0 c Placed under source control - mkm c These files are direct descendants of the ROS files c by the same name at or about ROS rev 5.1 e u U f b f n t T I 1 ; "%W% %G%" dsect data name byte 'log10',0 ;name of routine D 5 emess0 byte 'log10: SING error\n",0 ;error message if arg=0 E 5 I 5 emess0 byte 'log10: SING error\n',0 ;error message if arg=0 E 5 mess0len equ 18 ;length of emess0 D 5 emess2 byte 'log10: DOMAIN error\n",0 ;error message of arg<0 E 5 I 5 emess2 byte 'log10: DOMAIN error\n',0 ;error message of arg<0 E 5 mess2len equ 20 D 5 nanmess byte 'log10: input value was NAN\n",0;error message if nan E 5 I 5 nanmess byte 'log10: input value was NAN\n',0;error message if nan E 5 nanlen equ 27 D 5 infmess byte 'log10: input value was INF\n",0;error message if "infinity" E 5 I 5 infmess byte 'log10: input value was INF\n',0;error message if "infinity" E 5 inflen equ 27 csect code align 2 externd _errno external _write external _matherr e_type equ -32 ;exception type e_name equ -28 ;name of routine in error e_arg1 equ -24 ;argument 1 e_arg2 equ -16 ;argument 2 (if present) e_retval equ -8 ;room for exception block e_size equ -80 ; plus stack frame with 3 parameters I 7 #ifdef ARGSINREGS pe_size equ 80 ; positive e_size #else pe_size equ 0 ; positive e_size #endif E 7 DOMAIN equ 1 SING equ 2 OVERFLOW equ 3 UNDERFLOW equ 4 TLOSS equ 5 PLOSS equ 6 EDOM equ 33 ERANGE equ 34 C1P1 equ 0bfe9441ah C1P2 equ 0d8397d8dh ;equals -0.789563581765763543 C2P1 equ 040106261h C2P2 equ 008295419h ;equals 4.096073272249690401 C3P1 equ 0c0100820h C3P2 equ 0e2d5ca65h ;equals -4.007937950419181027 C4P1 equ 0c021d592h C4P2 equ 065a42680h ;equals -8.917132545745744675 C5P1 equ 0403380a4h C5P2 equ 05f65aad1h ;equals 19.502508127518754879 C6P1 equ 0c0280c31h C6P2 equ 05440afa8h ;equals -12.023813851257571257 LOG2U equ 03fe62e42h LOG2L equ 0fefa39efh ;equals 0.693147180559945309 LOG10U equ 040026bb1h LOG10L equ 0bbb55516h ;equals 2.302585092994045684 LIMITU equ 03ff6a09dh LIMITL equ 0cf893fafh ;equals 1.414213 MASK equ 0800fffffh ;to mask off exponent MASK2 equ 0000007ffh ;to mask off mant and sign EXP0 equ 03ff00000h ;gives the exponent value of 0 EBIAS equ 0000003ffh ;equals 1023 (the bias) ONE equ 03ff00000h ;equals 1 (with the ZEROS) ZEROS equ 000000000h ;zeros for 1 and 2 TWO equ 040000000h ;equals 2 (with the ZEROS) arg3 equ 40 arg2 equ 32 arg1 equ 24 arg_1 equ -8 arg_2 equ -16 arg_3 equ -20 ; ; _d_lg10.s ; global _log10 ;cc, rc and rp global _d_lg10 ;f77 global _D_lg10 ;rf D 7 _log10: loadd r0,r14,arg1 E 7 I 7 _log10: I 8 ; MCOUNT E 8 #ifndef ARGSINREGS loadd r0,r14,arg1 #endif E 7 br _D_lg10 _d_lg10: I 8 ; MCOUNT E 8 I 7 #ifndef ARGSINREGS E 7 load r0,r14,arg1 I 7 #endif E 7 loadd r0,r0,0 _D_lg10: I 8 ; MCOUNT E 8 br r0<=0,badinput ;if arg<=0 then badinput laddr r2,07ff00000h,L br r0>=r2,nanorinf ;if arg= nan or inf then nanorinf I 7 #ifdef ARGSINREGS stored r7,STKPTR,arg_1 stored r9,STKPTR,arg_2 ;to store r7-r10 for use as variables #else E 7 stored r6,r14,arg_1 stored r8,r14,arg_2 store r10,r14,arg_3 ;to store r6-r10 for use as variables I 7 #endif E 7 dunp: ;rp0=mant only="x" r2=unbiased exp="n" laddr r2,r0 csl r2,12 ;makes the exponent of arg an integer laddr r3,MASK2,L and r2,r3 ;masks off mant of arg laddr r3,EBIAS,L sub r2,r3 ;unbiases exponent laddr r3,MASK,L and r0,r3 ;masks off exponent of arg laddr r3,EXP0,L or r0,r3 ;gives rp0 exponent of 0 (so can do arth w/it) laddr r3,LIMITU,L laddr r4,LIMITL,L drcomp r3,r0 br r3<0,lessthan ;"if (x>1.414213) then" go to lessthan laddr r3,ONE,L laddr r4,ZEROS,L dradd r3,r0 ;"(x+1)" laddr r5,ONE,L laddr r6,ZEROS,L drsub r0,r5 ;"(x-1)" drdiv r0,r3 ;rp0="z=(x-1)/(x+1)" cont: laddr r3,r0 laddr r4,r1 drmpy r3,r3 ;rp3="zsq=z*z" laddr r5,C1P1,L laddr r6,C1P2,L ;C1 drmpy r5,r3 ;"(C1)*zsq" laddr r7,C2P1,L laddr r8,C2P2,L ;C2 dradd r5,r7 ;"((C1)*zsq+C2)" drmpy r5,r3 ;"...*zsq" laddr r7,C3P1,L laddr r8,C3P2,L ;C3 dradd r5,r7 ;"...+C3" drmpy r5,r3 ;"...*zsq" drmpy r5,r0 ;"...*z" = numerator laddr r7,C4P1,L laddr r8,C4P2,L ;C4 dradd r7,r3 ;"(zsq+C4)" drmpy r7,r3 ;"(zsq+C4)*zsq" laddr r9,C5P1,L laddr r10,C5P2,L ;C5 dradd r7,r9 ;"...+C5" drmpy r7,r3 ;"...*zsq" laddr r9,C6P1,L laddr r10,C6P2,L ;C6 dradd r7,r9 ;"...+C6" = denominator drdiv r5,r7 ;".../..." dradd r0,r5 ;"z+..." laddr r4,TWO,L laddr r5,ZEROS,L drmpy r0,r4 ;"2*..." dfloat r2,r2 laddr r4,LOG2U,L laddr r5,LOG2L,L drmpy r2,r4 ;"(n*log2)" dradd r0,r2 ;"...+..." = all of it laddr r2,LOG10U,L laddr r3,LOG10L,L drdiv r0,r2 ;rp0="%_dlog10=%_dlog(arg)/2.3025850..." D 7 fini: loadd r6,r14,arg_1 E 7 I 7 fini: #ifdef ARGSINREGS loadd r7,STKPTR,arg_1 loadd r9,STKPTR,arg_2 ;restore all used registers ret LINK,LINK #else loadd r6,r14,arg_1 E 7 loadd r8,r14,arg_2 load r10,r14,arg_3 ;restore all used registers ret r11,r11 I 7 #endif E 7 lessthan: laddr r3,TWO,L laddr r4,ZEROS,L dradd r3,r0 ;"(x+2)" laddr r5,TWO,L laddr r6,ZEROS,L drsub r0,r5 ;"(x-2)" drdiv r0,r3 ;rp0="z=(x-2)/(x+2)" add r2,1 ;r2="n=n+1" br cont ; ; error handling ; badinput: ;returns info to user about input error laddr r2,r0 or r2,r1 br r2=0,zero ;if arg=0 then zero struct: ;loads values into error structure in case user ;wishes to do more with them than we have done D 7 E 7 I 7 #ifdef ARGSINREGS store LINK,STKPTR,0 ;save old return laddr STKPTR,STKPTR,e_size ;update stack #else E 7 store r11,r14,0 ;save old return store r15,r14,8 ;save old frame pointer move r15,r14 laddr r14,r14,e_size ;update stack I 7 #endif E 7 D 7 stored r0,r15,e_arg1 ;load arg's value into error structure E 7 I 7 stored r0,STKPTR,pe_size+e_arg1 ;load arg's value into error structure E 7 laddr r2,name,L ;name of offending routine D 7 store r2,r15,e_name ; into error structure E 7 I 7 store r2,STKPTR,pe_size+e_name ; into error structure E 7 move r3,DOMAIN ;exception type D 7 store r3,r15,e_type E 7 I 7 store r3,STKPTR,pe_size+e_type E 7 laddr r0,0fff00000h,L laddr r1,0 D 7 stored r0,r15,e_retval ;return -inf E 7 I 7 stored r0,STKPTR,pe_size+e_retval ;return -inf E 7 I 7 #ifdef ARGSINREGS laddr r0,STKPTR,pe_size+e_type ;user want to do different anything with error? call LINK,_matherr,L ;matherr is a function for user to define #else E 7 laddr r4,r15,e_type ;user want to do different anything with error? store r4,r14,arg1 ;gives matherr the address of error structure call r11,_matherr,L ;matherr is a function for user to define I 7 #endif E 7 br r0<>0,err_rtn ;yes (assume user will change r0 if yes ) mess2: ;prints out our error message move r0,2 I 7 #ifdef ARGSINREGS laddr r1,emess2,L laddr r2,mess2len call LINK,_write,L ;writes out message #else E 7 store r0,r14,arg1 laddr r5,emess2,L store r5,r14,arg2 ;gives message laddr r0,mess2len store r0,r14,arg3 ;gives length of message call r11,_write,L ;writes out message I 7 #endif E 7 laddr r0,EDOM ;sets global variable _errno for user store r0,_errno,L err_rtn: ;resets all old pointers and returns -infinity I 7 #ifdef ARGSINREGS laddr STKPTR,STKPTR,pe_size ;user will have already used matherr for himself load LINK,STKPTR,0 #else E 7 move r14,r15 ;user will have already used matherr for himself load r15,r14,8 load r11,r14,0 I 7 #endif E 7 laddr r0,0fff00000h,L laddr r1,0 ;to return -inf I 7 #ifdef ARGSINREGS ret LINK,LINK #else E 7 ret r11,r11 I 7 #endif E 7 zero: ;loads values into error structure in case user D 7 ;wishes to do more with them than we have done E 7 I 7 #ifdef ARGSINREGS ;wishes to do more with them than we have done store LINK,STKPTR,0 ;save old return laddr STKPTR,STKPTR,e_size ;update stack #else E 7 store r11,r14,0 ;save old return store r15,r14,8 ;save old frame pointer move r15,r14 laddr r14,r14,e_size ;update stack I 7 #endif E 7 D 7 stored r0,r15,e_arg1 ;load arg's value into error structure E 7 I 7 stored r0,STKPTR,pe_size+e_arg1 ;load arg's value into error structure E 7 laddr r2,name,L ;name of offending routine D 7 store r2,r15,e_name ; into error structure E 7 I 7 store r2,STKPTR,pe_size+e_name ; into error structure E 7 move r3,SING ;exception type D 7 store r3,r15,e_type E 7 I 7 store r3,STKPTR,pe_size+e_type E 7 laddr r0,0fff00000h,L laddr r1,0 D 7 stored r0,r15,e_retval ;return -infinity E 7 I 7 stored r0,STKPTR,pe_size+e_retval ;return -infinity E 7 I 7 #ifdef ARGSINREGS laddr r0,STKPTR,pe_size+e_type ;user want to do different anything with error? call LINK,_matherr,L ;matherr is a function for user to define #else E 7 laddr r4,r15,e_type ;user want to do different anything with error? store r4,r14,arg1 ;gives matherr the address of error structure call r11,_matherr,L ;matherr is a function for user to define I 7 #endif E 7 br r0<>0,err_rtn ;yes (assume user will change r0 if yes ) mess0: ;prints out our error message move r0,2 I 7 #ifdef ARGSINREGS laddr r1,emess0,L laddr r2,mess0len call LINK,_write,L ;writes out message #else E 7 store r0,r14,arg1 laddr r5,emess0,L store r5,r14,arg2 ;gives message laddr r0,mess0len store r0,r14,arg3 ;gives length of message call r11,_write,L ;writes out message I 7 #endif E 7 laddr r0,EDOM ;sets global variable _errno for user store r0,_errno,L br err_rtn nanorinf: br r0>r2,nan laddr r3,0 br r1>r3,nan ;if arg>inf then nan inf: ;writes message and returns inf I 7 #ifdef ARGSINREGS store LINK,STKPTR,0 ;save old return laddr STKPTR,STKPTR,e_size ;update stack #else E 7 store r11,r14,0 ;save old return store r15,r14,8 ;save old frame pointer move r15,r14 laddr r14,r14,e_size ;update stack I 7 #endif E 7 move r0,2 ;to print I 7 #ifdef ARGSINREGS laddr r1,infmess,L laddr r2,inflen call LINK,_write,L laddr STKPTR,STKPTR,pe_size ;re-updates the stack load LINK,STKPTR,0 ;resets old return #else E 7 store r0,r14,arg1 laddr r5,infmess,L store r5,r14,arg2 ;gives write the message laddr r0,inflen store r0,r14,arg3 ;gives write the length of message call r11,_write,L D 7 E 7 move r14,r15 ;re-updates the stack load r15,r14,8 ;resets old frame pointer load r11,r14,0 ;resets old return I 7 #endif E 7 laddr r0,07ff00000h,L laddr r1,0 ;returns inf I 7 #ifdef ARGSINREGS ret LINK,LINK #else E 7 ret r11,r11 I 7 #endif E 7 nan: ;writes message and returns the nan arg I 7 #ifdef ARGSINREGS store LINK,STKPTR,0 ;save old return laddr STKPTR,STKPTR,e_size ;update stack stored r0,STKPTR,arg_1 ;save arg #else E 7 store r11,r14,0 ;save old return store r15,r14,8 ;save old frame pointer move r15,r14 laddr r14,r14,e_size ;update stack D 7 E 7 stored r0,r14,arg_1 ;save arg I 7 #endif move r0,2 ;to print #ifdef ARGSINREGS laddr r1,nanmess,L laddr r2,nanlen call LINK,_write,L E 7 D 7 move r0,2 ;to print E 7 I 7 loadd r0,STKPTR,arg_1 ;restore arg to rp0 laddr STKPTR,STKPTR,pe_size ;re-update stack load LINK,STKPTR,0 ;resets old return store LINK,STKPTR,8 ;save old return (KEN - IS THIS RIGHT? .. Mike) ret LINK,LINK #else E 7 store r0,r14,arg1 laddr r5,nanmess,L store r5,r14,arg2 ;gives write the message laddr r0,nanlen store r0,r14,arg3 ;gives write the length of message call r11,_write,L loadd r0,r14,arg_1 ;restore arg to rp0 move r14,r15 ;re-update stack load r15,r14,8 ;resets old frame pointer load r11,r14,0 ;resets old return store r11,r14,8 ;save old return ret r11,r11 D 7 E 7 I 7 #endif E 7 E 1 h52096 s 00003/00000/00409 d D 4.3 87/04/16 13:55:59 mth 8 7 c Profiling changes e s 00111/00013/00298 d D 4.2 87/02/16 17:09:22 mth 7 6 c Parameters in registers. e s 00000/00000/00311 d D 4.1 87/02/16 16:57:30 mth 6 5 c rolled rev to -r4 (mth) e s 00004/00004/00307 d D 3.3 87/01/31 13:28:01 mkm 5 4 c correct compatability probs between ROS and SPIX as. -mkm e s 00000/00000/00311 d D 3.2 87/01/31 11:54:16 mkm 4 3 c from ROS sources as of this date. -mkm e s 00000/00000/00311 d D 3.1 87/01/21 17:46:13 mkm 3 2 c e s 00000/00000/00311 d D 2.1 87/01/21 17:43:35 mkm 2 1 c e s 00311/00000/00000 d D 1.1 87/01/21 17:41:50 mkm 1 0 c Placed under source control - mkm c These files are direct descendants of the ROS files c by the same name at or about ROS rev 5.1 e u U f b f n t T I 1 ; "%W% %G%" dsect data name byte 'log',0 ;name of routine D 5 emess0 byte 'log: SING error\n",0 ;error message if arg=0 E 5 I 5 emess0 byte 'log: SING error\n',0 ;error message if arg=0 E 5 mess0len equ 16 ;length of emess0 D 5 emess2 byte 'log: DOMAIN error\n",0 ;error message of arg<0 E 5 I 5 emess2 byte 'log: DOMAIN error\n',0 ;error message of arg<0 E 5 mess2len equ 18 D 5 nanmess byte 'log: input value was NAN\n",0 ;error message if nan E 5 I 5 nanmess byte 'log: input value was NAN\n',0 ;error message if nan E 5 nanlen equ 25 D 5 infmess byte 'log: input value was INF\n",0 ;error message if "infinity" E 5 I 5 infmess byte 'log: input value was INF\n',0 ;error message if "infinity" E 5 inflen equ 25 csect code align 2 externd _errno external _write external _matherr e_type equ -32 ;exception type e_name equ -28 ;name of routine in error e_arg1 equ -24 ;argument 1 e_arg2 equ -16 ;argument 2 (if present) e_retval equ -8 ;room for exception block e_size equ -80 ; plus stack frame with 3 parameters I 7 #ifdef ARGSINREGS pe_size equ 80 ; positive e_size #else pe_size equ 0 ; positive e_size #endif E 7 DOMAIN equ 1 SING equ 2 OVERFLOW equ 3 UNDERFLOW equ 4 TLOSS equ 5 PLOSS equ 6 EDOM equ 33 ERANGE equ 34 csect code C1P1 equ 0bfe9441ah C1P2 equ 0d8397d8dh ;equals -0.789563581765763543 C2P1 equ 040106261h C2P2 equ 008295419h ;equals 4.096073272249690401 C3P1 equ 0c0100820h C3P2 equ 0e2d5ca65h ;equals -4.007937950419181027 C4P1 equ 0c021d592h C4P2 equ 065a42680h ;equals -8.917132545745744675 C5P1 equ 0403380a4h C5P2 equ 05f65aad1h ;equals 19.502508127518754879 C6P1 equ 0c0280c31h C6P2 equ 05440afa8h ;equals -12.023813851257571257 LOG2U equ 03fe62e42h LOG2L equ 0fefa39efh ;equals 0.693147180559945309 LIMITU equ 03ff6a09dh LIMITL equ 0cf893fafh ;equals 1.414213 MASK equ 0800fffffh ;to mask off exponent MASK2 equ 0000007ffh ;to mask off mant and sign EXP0 equ 03ff00000h ;gives the exponent value of 0 EBIAS equ 0000003ffh ;equals 1023 (the bias) ONE equ 03ff00000h ;equals 1 (with the ZEROS) ZEROS equ 000000000h ;zeros for 1 and 2 TWO equ 040000000h ;equals 2 (with the ZEROS) arg3 equ 40 arg2 equ 32 arg1 equ 24 arg_1 equ -8 arg_2 equ -16 arg_3 equ -20 ; ; _d_log.s ; global _log ;cc, rc and rp global _d_log ;f77 global _D_log ;rf D 7 _log: loadd r0,r14,arg1 E 7 I 7 _log: I 8 ; MCOUNT E 8 #ifndef ARGSINREGS loadd r0,r14,arg1 #endif E 7 br _D_log _d_log: I 8 ; MCOUNT E 8 I 7 #ifndef ARGSINREGS E 7 load r0,r14,arg1 I 7 #endif E 7 loadd r0,r0,0 _D_log: I 8 ; MCOUNT E 8 br r0<=0,badinput ;if arg <=0 then badinput laddr r2,07ff00000h,L br r0>=r2,nanorinf ;if arg=inf or nan then nanorinf I 7 #ifdef ARGSINREGS stored r7,STKPTR,arg_1 stored r9,STKPTR,arg_2 ;to store r7-r10 for use as variables #else E 7 stored r6,r14,arg_1 stored r8,r14,arg_2 store r10,r14,arg_3 ;to store r6-r10 for use as variables I 7 #endif E 7 dunp: ;rp0=mant only="x" r2=unbiased exp="n" laddr r2,r0 csl r2,12 ;makes the exponent of arg an integer laddr r3,MASK2,L and r2,r3 ;masks off mant of arg laddr r3,EBIAS,L sub r2,r3 ;unbiases exponent laddr r3,MASK,L and r0,r3 ;masks off exponent of arg laddr r3,EXP0,L or r0,r3 ;gives rp0 exponent of 0 (so can do arth w/it) laddr r3,LIMITU,L laddr r4,LIMITL,L drcomp r3,r0 br r3<0,lessthan ;"if (x>1.414213) then" go to lessthan laddr r3,ONE,L laddr r4,ZEROS,L dradd r3,r0 ;"(x+1)" laddr r5,ONE,L laddr r6,ZEROS,L drsub r0,r5 ;"(x-1)" drdiv r0,r3 ;rp0="z=(x-1)/(x+1)" cont: laddr r3,r0 laddr r4,r1 drmpy r3,r3 ;rp3="zsq=z*z" laddr r5,C1P1,L laddr r6,C1P2,L ;C1 drmpy r5,r3 ;"(C1)*zsq" laddr r7,C2P1,L laddr r8,C2P2,L ;C2 dradd r5,r7 ;"((C1)*zsq+C2)" drmpy r5,r3 ;"...*zsq" laddr r7,C3P1,L laddr r8,C3P2,L ;C3 dradd r5,r7 ;"...+C3" drmpy r5,r3 ;"...*zsq" drmpy r5,r0 ;"...*z" = numerator laddr r7,C4P1,L laddr r8,C4P2,L ;C4 dradd r7,r3 ;"(zsq+C4)" drmpy r7,r3 ;"(zsq+C4)*zsq" laddr r9,C5P1,L laddr r10,C5P2,L ;C5 dradd r7,r9 ;"...+C5" drmpy r7,r3 ;"...*zsq" laddr r9,C6P1,L laddr r10,C6P2,L ;C6 dradd r7,r9 ;"...+C6" = denominator drdiv r5,r7 ;".../..." dradd r0,r5 ;"z+..." laddr r4,TWO,L laddr r5,ZEROS,L drmpy r0,r4 ;"2*..." dfloat r2,r2 laddr r4,LOG2U,L laddr r5,LOG2L,L drmpy r2,r4 ;"(n*log2)" dradd r0,r2 ;"...+..." = all of it D 7 fini: loadd r6,r14,arg_1 E 7 I 7 fini: #ifdef ARGSINREGS loadd r7,STKPTR,arg_1 loadd r9,STKPTR,arg_2 ;restore all used registers ret LINK,LINK #else loadd r6,r14,arg_1 E 7 loadd r8,r14,arg_2 load r10,r14,arg_3 ;restore all used registers ret r11,r11 I 7 #endif E 7 lessthan: laddr r3,TWO,L laddr r4,ZEROS,L dradd r3,r0 ;"(x+2)" laddr r5,TWO,L laddr r6,ZEROS,L drsub r0,r5 ;"(x-2)" drdiv r0,r3 ;rp0="z=(x-2)/(x+2)" add r2,1 ;r2="n=n+1" br cont ; ; error handling ; badinput: ;returns info to user about input error laddr r2,r0 or r2,r1 br r2=0,zero ;if arg=0 then zero struct: ;loads values into error structure in case user ;wishes to do more with them than we have done D 7 E 7 I 7 #ifdef ARGSINREGS store LINK,STKPTR,0 ;save old return laddr STKPTR,STKPTR,e_size ;update stack #else E 7 store r11,r14,0 ;save old return store r15,r14,8 ;save old frame pointer move r15,r14 laddr r14,r14,e_size ;update stack I 7 #endif E 7 D 7 stored r0,r15,e_arg1 ;load arg's value into error structure E 7 I 7 stored r0,STKPTR,pe_size+e_arg1 ;load arg's value into error structure E 7 laddr r2,name,L ;name of offending routine D 7 store r2,r15,e_name ; into error structure E 7 I 7 store r2,STKPTR,pe_size+e_name ; into error structure E 7 move r3,DOMAIN ;exception type D 7 store r3,r15,e_type E 7 I 7 store r3,STKPTR,pe_size+e_type E 7 laddr r0,0fff00000h,L laddr r1,0 D 7 stored r0,r15,e_retval ;return -inf E 7 I 7 stored r0,STKPTR,pe_size+e_retval ;return -inf E 7 I 7 #ifdef ARGSINREGS laddr r0,STKPTR,pe_size+e_type ;user want to do different anything with error? call LINK,_matherr,L ;matherr is a function for user to define #else E 7 laddr r4,r15,e_type ;user want to do different anything with error? store r4,r14,arg1 ;gives matherr the address of error structure call r11,_matherr,L ;matherr is a function for user to define I 7 #endif E 7 br r0<>0,err_rtn ;yes (assume user will change r0 if yes ) mess2: ;prints out our error message move r0,2 I 7 #ifdef ARGSINREGS laddr r1,emess2,L laddr r2,mess2len call LINK,_write,L ;writes out message #else E 7 store r0,r14,arg1 laddr r5,emess2,L store r5,r14,arg2 ;gives message laddr r0,mess2len store r0,r14,arg3 ;gives length of message call r11,_write,L ;writes out message I 7 #endif E 7 laddr r0,EDOM ;sets global variable _errno for user store r0,_errno,L err_rtn: ;resets all old pointers and returns -infinity I 7 #ifdef ARGSINREGS laddr STKPTR,STKPTR,pe_size ;user will have already used matherr for himself load LINK,STKPTR,0 #else E 7 move r14,r15 ;user will have already used matherr for himself load r15,r14,8 load r11,r14,0 I 7 #endif E 7 laddr r0,0fff00000h,L laddr r1,0 ;to return -inf I 7 #ifdef ARGSINREGS ret LINK,LINK #else E 7 ret r11,r11 I 7 #endif E 7 zero: ;loads values into error structure in case user D 7 ;wishes to do more with them than we have done E 7 I 7 #ifdef ARGSINREGS ;wishes to do more with them than we have done store LINK,STKPTR,0 ;save old return laddr STKPTR,STKPTR,e_size ;update stack #else E 7 store r11,r14,0 ;save old return store r15,r14,8 ;save old frame pointer move r15,r14 laddr r14,r14,e_size ;update stack I 7 #endif E 7 D 7 stored r0,r15,e_arg1 ;load arg's value into error structure E 7 I 7 stored r0,STKPTR,pe_size+e_arg1 ;load arg's value into error structure E 7 laddr r2,name,L ;name of offending routine D 7 store r2,r15,e_name ; into error structure E 7 I 7 store r2,STKPTR,pe_size+e_name ; into error structure E 7 move r3,SING ;exception type D 7 store r3,r15,e_type E 7 I 7 store r3,STKPTR,pe_size+e_type E 7 laddr r0,0fff00000h,L laddr r1,0 D 7 stored r0,r15,e_retval ;return -infinity E 7 I 7 stored r0,STKPTR,pe_size+e_retval ;return -infinity E 7 I 7 #ifdef ARGSINREGS laddr r0,STKPTR,pe_size+e_type ;user want to do different anything with error? call LINK,_matherr,L ;matherr is a function for user to define #else E 7 laddr r4,r15,e_type ;user want to do different anything with error? store r4,r14,arg1 ;gives matherr the address of error structure call r11,_matherr,L ;matherr is a function for user to define I 7 #endif E 7 br r0<>0,err_rtn ;yes (assume user will change r0 if yes ) mess0: ;prints out our error message move r0,2 I 7 #ifdef ARGSINREGS laddr r1,emess0,L laddr r2,mess0len call LINK,_write,L ;writes out message #else E 7 store r0,r14,arg1 laddr r5,emess0,L store r5,r14,arg2 ;gives message laddr r0,mess0len store r0,r14,arg3 ;gives length of message call r11,_write,L ;writes out message I 7 #endif E 7 laddr r0,EDOM ;sets global variable _errno for user store r0,_errno,L br err_rtn nanorinf: br r0>r2,nan laddr r3,0 br r1>r3,nan ;if arg>inf then nan inf: ;writes message and returns inf I 7 #ifdef ARGSINREGS store LINK,STKPTR,0 ;save old return laddr STKPTR,STKPTR,e_size ;update stack #else E 7 store r11,r14,0 ;save old return store r15,r14,8 ;save old frame pointer move r15,r14 laddr r14,r14,e_size ;update stack I 7 #endif E 7 move r0,2 ;to print I 7 #ifdef ARGSINREGS laddr r1,infmess,L laddr r2,inflen call LINK,_write,L laddr STKPTR,STKPTR,pe_size ;re-updates the stack load LINK,STKPTR,0 ;resets old return #else E 7 store r0,r14,arg1 laddr r5,infmess,L store r5,r14,arg2 ;gives write the message laddr r0,inflen store r0,r14,arg3 ;gives write the length of message call r11,_write,L move r14,r15 ;re-updates the stack load r15,r14,8 ;resets old frame pointer load r11,r14,0 ;resets old return I 7 #endif E 7 laddr r0,07ff00000h,L laddr r1,0 ;returns inf I 7 #ifdef ARGSINREGS ret LINK,LINK #else E 7 ret r11,r11 I 7 #endif E 7 nan: ;writes message and returns the nan arg I 7 #ifdef ARGSINREGS store LINK,STKPTR,0 ;save old return laddr STKPTR,STKPTR,e_size ;update stack stored r0,STKPTR,arg_1 ;save arg #else E 7 store r11,r14,0 ;save old return store r15,r14,8 ;save old frame pointer move r15,r14 laddr r14,r14,e_size ;update stack D 7 E 7 stored r0,r14,arg_1 ;save arg I 7 #endif E 7 move r0,2 ;to print I 7 #ifdef ARGSINREGS laddr r1,nanmess,L laddr r2,nanlen call LINK,_write,L loadd r0,STKPTR,arg_1 ;restore arg to rp0 laddr STKPTR,STKPTR,pe_size ;re-update stack load LINK,STKPTR,0 ;resets old return store LINK,STKPTR,8 ;save old return (KEN - IS THIS RIGHT? .. Mike) ret LINK,LINK #else E 7 store r0,r14,arg1 laddr r5,nanmess,L store r5,r14,arg2 ;gives write the message laddr r0,nanlen store r0,r14,arg3 ;gives write the length of message call r11,_write,L loadd r0,r14,arg_1 ;restore arg to rp0 move r14,r15 ;re-update stack load r15,r14,8 ;resets old frame pointer load r11,r14,0 ;resets old return store r11,r14,8 ;save old return ret r11,r11 I 7 #endif E 7 E 1 h27337 s 00003/00000/00540 d D 4.3 87/04/16 13:56:04 mth 8 7 c Profiling changes e s 00122/00017/00418 d D 4.2 87/02/16 17:09:26 mth 7 6 c Parameters in registers. e s 00000/00000/00435 d D 4.1 87/02/16 16:57:33 mth 6 5 c rolled rev to -r4 (mth) e s 00003/00003/00432 d D 3.3 87/01/31 13:28:03 mkm 5 4 c correct compatability probs between ROS and SPIX as. -mkm e s 00000/00000/00435 d D 3.2 87/01/31 11:54:17 mkm 4 3 c from ROS sources as of this date. -mkm e s 00000/00000/00435 d D 3.1 87/01/21 17:46:14 mkm 3 2 c e s 00000/00000/00435 d D 2.1 87/01/21 17:43:37 mkm 2 1 c e s 00435/00000/00000 d D 1.1 87/01/21 17:41:50 mkm 1 0 c Placed under source control - mkm c These files are direct descendants of the ROS files c by the same name at or about ROS rev 5.1 e u U f b f n t T I 1 ; "%W% %G%" dsect data pix: ;initialize array pix word 1071931184 word 1073741824 ;equals 0.636619687080383301 word 1047979236 word 1073741824 ;equals 8.528719774858473100e-08 word 1018505720 word 0 ;equals 2.937086744604286430e-16 word 999333215 word 1073741824 ;equals 8.795767286342583120e-22 word 973034316 word 0 ;equals 2.471136637518957480e-29 word 951959771 word 1073741824 ;equals 2.238392930622293410e-35 name byte 'sin',0 ;name of routine D 5 emess byte 'sin: TLOSS error\n",0 ;error message E 5 I 5 emess byte 'sin: TLOSS error\n',0 ;error message E 5 messlen equ 17 ;length of message D 5 nanmess byte 'sin: input value was NAN\n",0 ;error message if nan E 5 I 5 nanmess byte 'sin: input value was NAN\n',0 ;error message if nan E 5 nanlen equ 25 D 5 infmess byte 'sin: input value was INF\n",0 ;error message if "infinity" E 5 I 5 infmess byte 'sin: input value was INF\n',0 ;error message if "infinity" E 5 inflen equ 25 csect code align 2 externd _errno external _write external _matherr e_type equ -32 ;exception type e_name equ -28 ;name of routine in error e_arg1 equ -24 ;argument 1 e_arg2 equ -16 ;argument 2 (if present) e_retval equ -8 ;room for exception block e_size equ -80 ; plus stack frame with 3 parameters I 7 #ifdef ARGSINREGS pe_size equ 80 ; positive e_size #else pe_size equ 0 ; positive e_size #endif E 7 DOMAIN equ 1 SING equ 2 OVERFLOW equ 3 UNDERFLOW equ 4 TLOSS equ 5 PLOSS equ 6 EDOM equ 33 ERANGE equ 34 PIX1U equ 1071931184 PIX1L equ 1073741824 ;equals pix[i] to save time in epre C1P1 equ 0c03a9a34h C1P2 equ 0939a4320h ;equals -26.602364754831 C2P1 equ 040a4bfc6h C2P2 equ 071b00eafh ;equals 2655.8875861185 C3P1 equ 0c0f920f0h C3P2 equ 019e78297h ;equals -102927.006324300873 C4P1 equ 0406571ech C4P2 equ 0610cc36dh ;equals 171.560104870728 C5P1 equ 040cd2f63h C5P2 equ 06070a8efh ;equals 14942.776380617605 C6P1 equ 04122d8b4h C6P2 equ 0136da1e4h ;equals 617562.037945803750 CC1P1 equ 0c05c5464h CC1P2 equ 0a1a690ech ;equals -113.318642056143 CC2P1 equ 040bfdca2h CC2P2 equ 054c66210h ;equals 8156.634106062833 CC3P1 equ 0c1027d14h CC3P2 equ 08399f561h ;equals -151458.564258496326 CC4P1 equ 040602b4bh CC4P2 equ 081c62df4h ;equals 129.352967154569 CC5P1 equ 040c170e9h CC5P2 equ 0b4d57133h ;equals 8929.825831108354 CC6P1 equ 041127d14h CC6P2 equ 08399f4fah ;equals 302917.128516986641 NUM1 equ 03ff921fbh NUM2 equ 054442d18h ;equals 1.570796323679489662 LIMITU equ 041dfffffh LIMITL equ 0ffc00000h ;equals 2147483647 HALFSZ equ 000000017h ;equals 23 as an integer representation HALF_2 equ 000000015h ;equals 21 as an integer representation MULTU equ 03fe921ffh MULTL equ 02e48e8a7h ;equals .7854 to test whether mult=0 or not COSLIM1 equ 03ff921fbh COSLIM2 equ 054442d18h ;equals 1.570796323679489662 = pi/2 ABS equ 07fffffffh ;constant to find absolute value MMANT equ 0000007ffh ;constant to mask rotated mantissa and sign bit EBIAS equ 1023 ;to unbias exponent arg equ -8 arg3 equ 40 arg2 equ 32 arg1 equ 24 arg_1 equ -16 arg_2 equ -24 arg_3 equ -32 arg_4 equ -40 arg_5 equ -48 arg_6 equ -56 arg_7 equ -64 ; ; _d_sin.s ; global _sin ;cc, rc and rp global _d_sin ;f77 global _D_sin ;rf D 7 _sin: loadd r0,r14,arg1 E 7 I 7 _sin: I 8 ; MCOUNT E 8 #ifndef ARGSINREGS loadd r0,r14,arg1 #endif E 7 br _D_sin _d_sin: I 8 ; MCOUNT E 8 I 7 #ifndef ARGSINREGS E 7 load r0,r14,arg1 I 7 #endif E 7 loadd r0,r0,0 _D_sin: I 8 ; MCOUNT E 8 dck2: laddr r2,r0 laddr r3,r1 ;to save sign of arg laddr r4,ABS,L and r2,r4 laddr r4,LIMITU,L laddr r5,LIMITL,L drcomp r4,r2 br r4<0,badinput ;if abs(arg)>limit then badinput D 7 E 7 I 7 #ifdef ARGSINREGS store r7,STKPTR,arg_1 stored r8,STKPTR,arg_2 stored r10,STKPTR,arg_3 ;save registers 7-11 for arithmetic constants stored r12,STKPTR,arg_4 ;store rp12 to use as variables #else E 7 stored r6,r14,arg_1 stored r8,r14,arg_2 stored r10,r14,arg_3 ;save registers 6-11 for arithmetic constants I 7 stored r12,r14,arg_4 ;store rp12 to use as variables #endif E 7 ; rp0="result",arg stored at r14+arg; rp2="upper"; rp4="lower"; r6="cutoff" ; r7="mod4",%dlgb; rp8="dmult","rtemp",constants; r12="mult"; r13="i" D 7 stored r12,r14,arg_4 ;store rp12 to use as variables E 7 epre: laddr r4,MULTU,L laddr r5,MULTL,L ;load rp2 with .7854 to test with drcomp r4,r2 br r4>0,mult0! ;branchs to mult0 if lessthan .7854 ; laddr r4,COSLIM1,L ; laddr r5,COSLIM2,L ; drcomp r4,r2 ; br r4>0,mult1! ;if .7584=r6,cont! ;while (%_dlgb(result)=r8,cont ;and (i+2= -1) then begin ;?if (rtemp>=.5) then begin? dfixr r8,r8 dfloat r8,r8 ;rp8="dmult=%d_dnint(rtemp)" drsub r0,r8 ;rp0="result=result-dmult" I 7 #ifdef ARGSINREGS stored r2,STKPTR,arg_5 stored r4,STKPTR,arg_6 ;store rp2 and rp4 temporarily #else E 7 stored r2,r14,arg_5 stored r4,r14,arg_6 ;store rp2 and rp4 temporarily I 7 #endif E 7 laddr r2,000200000h,L laddr r4,r8 laddr r5,r9 ;rp4=rp8="dmult"; rp2=4 sub r4,r2 ;rp4="(dmult/4)" dfixt r4,r4 dfloat r4,r4 add r4,r2 ;rp4="%d_dint(dmult/4)*4)" drsub r8,r4 ;rp8="dmult-..." dfixt r7,r8 ;r7="mod4=trunc(dmult-%d+dint(dmult/4)*4)" I 7 #ifdef ARGSINREGS loadd r2,STKPTR,arg_5 loadd r4,STKPTR,arg_6 ;restore rp2 and rp4 #else E 7 loadd r2,r14,arg_5 loadd r4,r14,arg_6 ;restore rp2 and rp4 I 7 #endif E 7 add r12,r7 ;r12="mult=mult+mod4" laddr r8,r0 laddr r9,r1 dradd r8,r10 ;rp8="rtemp=result+rlower" ifnot: drsub r0,r8 dradd r10,r0 ;rp10="(result-rtemp)+rlower" laddr r0,r8 laddr r1,r9 ;rp0="result=rtemp" laddr r8,HALFSZ,L sub r6,r8 ;r6="cutoff=cutoff-halfsz" add r13,8 ;r13="i=i+1" br while cont: ;assumes rp6 and rp8 free for use as constants I 7 #ifdef ARGSINREGS loadd r2,STKPTR,arg ;rp2="original arg" #else E 7 loadd r2,r14,arg ;rp2="original arg" I 7 #endif E 7 loadd r8,r13,pix,L ;rp8="pix[i]" drmpy r4,r8 ;rp4="lower*pix[i]" add r13,8 loadd r8,r13,pix,L ;rp8="pix[i+1]" add r13,8 loadd r6,r13,pix,L ;rp6="pix[i+2]" dradd r8,r6 ;rp8="(pix[i+1]+pix[i+2])" drmpy r2,r8 ;rp2="arg*..." dradd r4,r2 ;rp4="(lower*pix[i]+arg*(pix[i+1]+pix[i+2]))" dradd r4,r10 ;rp4="...+rlower" dradd r0,r4 ;rp0="...+result" laddr r8,NUM1,L laddr r9,NUM2,L drmpy r0,r8 ;rp0= ;result= NUM *(((lower * pix[i] + arg * (pix[i+1] + pix[i+2])) +rlower)+result) esnc: ;final calculations -uses rp0="x"(old result) ;rp2="xsq" and r12="mult" laddr r2,r0 laddr r3,r1 drmpy r2,r2 ;rp2="xsq=x*x" laddr r4,000000001h and r4,r12 br r4=1,odd ;"if (not odd(mult)) then begin even: laddr r6,C1P1,L laddr r7,C1P2,L drmpy r6,r2 ;rp6="(c1)*xsq" laddr r8,C2P1,L laddr r9,C2P2,L dradd r6,r8 ;rp6="...+c2" drmpy r6,r2 ;rp6="...*xsq" laddr r8,C3P1,L laddr r9,C3P2,L dradd r6,r8 ;rp6="...+c3" drmpy r6,r2 ;rp6="...*xsq" drmpy r6,r0 ;rp6="...*x" laddr r8,C4P1,L laddr r9,C4P2,L dradd r8,r2 ;rp8="xsq+c4" drmpy r8,r2 ;rp8="...*xsq" laddr r10,C5P1,L laddr r11,C5P2,L dradd r8,r10 ;rp8="...+c5" drmpy r8,r2 ;rp8="...*xsq" laddr r10,C6P1,L laddr r11,C6P2,L dradd r8,r10 ;rp8="...+c6" drdiv r6,r8 dradd r0,r6 fini laddr r2,2 and r2,r12 br r2=2,negate ;"if (odd(mult div 2)) then result=-result" D 7 fini2: loadd r6,r14,arg_1 E 7 I 7 fini2: #ifdef ARGSINREGS load r7,STKPTR,arg_1 loadd r8,STKPTR,arg_2 loadd r10,STKPTR,arg_3 loadd r12,STKPTR,arg_4 ;restore saved registers ret LINK,LINK ;done #else loadd r6,r14,arg_1 E 7 loadd r8,r14,arg_2 loadd r10,r14,arg_3 loadd r12,r14,arg_4 ;restore saved registers ret r11,r11 ;done I 7 #endif E 7 D 7 mult0: stored r12,r14,arg_4 E 7 I 7 mult0: #ifdef ARGSINREGS stored r12,STKPTR,arg_4 #else stored r12,r14,arg_4 #endif E 7 laddr r12,0 ;since abs(arg)<.7854 mult=0 br esnc ;time for final calculations D 7 mult1: stored r12,r14,arg_4 E 7 I 7 mult1: #ifdef ARGSINREGS stored r12,STKPTR,arg_4 #else stored r12,r14,arg_4 #endif E 7 laddr r12,1 ;sinc .78540,err_rtn ;yes (assume user will change r0 if yes ) mess: ;prints out our error message move r0,2 I 7 #ifdef ARGSINREGS laddr r1,emess,L laddr r2,messlen call LINK,_write,L ;writes out message #else E 7 store r0,r14,arg1 laddr r5,emess,L store r5,r14,arg2 ;gives message laddr r0,messlen store r0,r14,arg3 ;gives length of message call r11,_write,L ;writes out message I 7 #endif E 7 laddr r0,ERANGE ;sets global variable _errno for user store r0,_errno,L D 7 E 7 I 7 #ifdef ARGSINREGS load r4,STKPTR,arg_1 ;restore r4's old value (if inf or not) #else E 7 load r4,r14,arg_1 ;restore r4's old value (if inf or not) I 7 #endif E 7 br r4=0,inf ;if abs(arg)="infinity" then go to inf br r4<0,nan ;if abs(arg) is not-a-number then go to nan err_rtn: ;resets all old pointers and returns zero I 7 #ifdef ARGSINREGS laddr STKPTR,STKPTR,pe_size ;user will have already used matherr for himself load LINK,STKPTR,0 #else E 7 move r14,r15 ;user will have already used matherr for himself load r15,r14,8 load r11,r14,0 I 7 #endif E 7 laddr r0,0 laddr r1,0 ;to return 0 I 7 #ifdef ARGSINREGS ret LINK,LINK #else E 7 ret r11,r11 I 7 #endif E 7 inf: move r0,2 ;to print I 7 #ifdef ARGSINREGS laddr r1,infmess,L laddr r2,inflen call LINK,_write,L #else E 7 store r0,r14,arg1 laddr r5,infmess,L store r5,r14,arg2 ;gives write the message laddr r0,inflen store r0,r14,arg3 ;gives write the length of message call r11,_write,L I 7 #endif E 7 br err_rtn nan: move r0,2 ;to print I 7 #ifdef ARGSINREGS laddr r1,nanmess,L laddr r2,nanlen call LINK,_write,L #else E 7 store r0,r14,arg1 laddr r5,nanmess,L store r5,r14,arg2 ;gives write the message laddr r0,nanlen store r0,r14,arg3 ;gives write the length of message call r11,_write,L I 7 #endif E 7 br err_rtn D 7 E 7 E 1 h11911 s 00003/00000/00378 d D 4.3 87/04/16 13:56:08 mth 8 7 c Profiling changes e s 00072/00010/00306 d D 4.2 87/02/16 17:09:30 mth 7 6 c Parameters in registers. e s 00000/00000/00316 d D 4.1 87/02/16 16:57:36 mth 6 5 c rolled rev to -r4 (mth) e s 00002/00002/00314 d D 3.3 87/01/31 13:28:06 mkm 5 4 c correct compatability probs between ROS and SPIX as. -mkm e s 00000/00000/00316 d D 3.2 87/01/31 11:54:19 mkm 4 3 c from ROS sources as of this date. -mkm e s 00000/00000/00316 d D 3.1 87/01/21 17:46:16 mkm 3 2 c e s 00000/00000/00316 d D 2.1 87/01/21 17:43:39 mkm 2 1 c e s 00316/00000/00000 d D 1.1 87/01/21 17:41:51 mkm 1 0 c Placed under source control - mkm c These files are direct descendants of the ROS files c by the same name at or about ROS rev 5.1 e u U f b f n t T I 1 D 7 ; "%W% "%G%" E 7 I 7 ; "%W% %G%" E 7 dsect data name byte 'sinh',0 ;name of routine ;no messages printed D 5 nanmess byte 'sinh: input value was NAN\n",0 ;error message if nan E 5 I 5 nanmess byte 'sinh: input value was NAN\n',0 ;error message if nan E 5 nanlen equ 26 D 5 infmess byte 'sinh: input value was INF\n",0 ;error message if "infinity" E 5 I 5 infmess byte 'sinh: input value was INF\n',0 ;error message if "infinity" E 5 inflen equ 26 csect code align 2 externd _errno external _write external _matherr e_type equ -32 ;exception type e_name equ -28 ;name of routine in error e_arg1 equ -24 ;argument 1 e_arg2 equ -16 ;argument 2 (if present) e_retval equ -8 ;room for exception block e_size equ -80 ; plus stack frame with 3 parameters I 7 #ifdef ARGSINREGS pe_size equ 80 ; positive e_size #else pe_size equ 0 ; positive e_size #endif E 7 DOMAIN equ 1 SING equ 2 OVERFLOW equ 3 UNDERFLOW equ 4 TLOSS equ 5 PLOSS equ 6 EDOM equ 33 ERANGE equ 34 P0P1 equ 04097a774h P0P2 equ 0e9c773d2h ;equals 1513.86417304653562 P1P1 equ 0403433a2h P1P2 equ 09c957777h ;equals 20.20170000695313 P2P1 equ 03f97a609h P2P2 equ 0aa5cd009h ;equals 0.02309432127295 Q0P1 equ 040b11016h Q0P2 equ 0b314dfb0h ;equals 4368.08867006741699 Q1P1 equ 0406d25b4h Q1P2 equ 013b3ffdah ;equals 233.177823205143104 LOG2U1 equ 1073157447 LOG2U2 equ 1073741824 ;equals 1.44269490242004395 LOG2L1 equ 03e8295c1h LOG2L2 equ 07f0bbbe8h ;equals 1.384689194620474 C1P1 equ 03de6473ch C1P2 equ 0809eda4bh ;equals .000000000162095726 C2P1 equ 03e5ae5f3h C2P2 equ 0caf0d8a6h ;equals .00000002505094859 C3P1 equ 03ec71de3h C3P2 equ 0e3996da7h ;equals .0000027557323364785 C4P1 equ 03f2a01a0h C4P2 equ 019d0eea8h ;equals .000198412698326202 C5P1 equ 03f811111h C5P2 equ 01111232bh ;equals .008333333333341372 C6P1 equ 03fc55555h C6P2 equ 05555554bh ;equals .166666666666666387 LIMIT1U equ 040863000h LIMIT1L equ 000000000h ;equals 710 LIMIT2U equ 03fe80000h LIMIT2L equ 000000000h ;equals .75 MINUS2 equ 0fffffffeh ;equals -2 in two's complement form HALF1 equ 03fe00000h HALF2 equ 000000000h ;equals .5 ABS equ 07fffffffh ;to get absolute value MASK1 equ 0000007ffh ;to mask off all but moved exponent MASK2 equ 0800fffffh ;to clear of exponent arg3 equ 40 arg2 equ 32 arg1 equ 24 arg_1 equ -8 arg_2 equ -16 ; ; _d_sinh.s ; global _sinh ;cc, rc and rp global _d_sinh ;f77 global _D_sinh ;rf D 7 _sinh: loadd r0,r14,arg1 E 7 I 7 _sinh: I 8 ; MCOUNT E 8 #ifndef ARGSINREGS loadd r0,r14,arg1 #endif E 7 br _D_sinh _d_sinh: I 8 ; MCOUNT E 8 I 7 #ifndef ARGSINREGS E 7 load r0,r14,arg1 I 7 #endif E 7 loadd r0,r0,0 _D_sinh: I 8 ; MCOUNT E 8 laddr r2,r0 ;save sign laddr r3,LIMIT1U,L laddr r5,ABS,L and r0,r5 ;get abs(arg) br r0>=r3,toobig ;if abs(arg)>=710 then go to toobig ;"toobig" avoids having to use a drcomp normal: I 7 #ifdef ARGSINREGS store r7,STKPTR,arg_1 ;to save registers 7 #else E 7 stored r6,r14,arg_1 ;to save registers 6 and 7 I 7 #endif E 7 laddr r3,LIMIT2U,L ;need only comp high order since if r0's high ;is >= r3's then the loworder doesn't matter ;since r3's loworder=0. br r0>=r3,greater! ;if (x<.75) then ... else go to greater lessthan: laddr r4,r0 laddr r5,r1 drmpy r4,r4 ;rp4="xsq=x*x" laddr r0,r2 ;resets sign of arg laddr r2,C1P1,L laddr r3,C1P2,L ;C1 drmpy r2,r4 ;"(C1)*xsq" laddr r6,C2P1,L laddr r7,C2P2,L ;C2 dradd r2,r6 ;"(...+C2)" drmpy r2,r4 ;"...*xsq" laddr r6,C3P1,L laddr r7,C3P2,L ;C3 dradd r2,r6 ;"(...+C3)" drmpy r2,r4 ;"...*xsq" laddr r6,C4P1,L laddr r7,C4P2,L ;C4 dradd r2,r6 ;"(...+C4)" drmpy r2,r4 ;"...*xsq" laddr r6,C5P1,L laddr r7,C5P2,L ;C5 dradd r2,r6 ;"(...+C5)" drmpy r2,r4 ;"...*xsq" laddr r6,C6P1,L laddr r7,C6P2,L ;C6 dradd r2,r6 ;"(...+C6)" drmpy r2,r4 ;"...*xsq" drmpy r2,r0 ;"arg*..." dradd r0,r2 ;rp0="result=arg+..." br done greater: I 7 #ifdef ARGSINREGS stored r8,STKPTR,arg_2 ;to save registers 8 and 9 #else E 7 stored r8,r14,arg_2 ;to save registers 8 and 9 I 7 #endif E 7 eere: makedr r5,r0 ;"sngl_temp=arg" makerd r5,r5 ;"upper=sngl_temp" laddr r3,r0 laddr r4,r1 drsub r3,r5 ;"lower=arg-upper" laddr r7,LOG2U1,L laddr r8,LOG2U2,L ;LOG2U drmpy r5,r7 ;rp5="x=upper*log2_u.d" dfixr r7,r5 ;r7=mult="longmult=%i_idnint(x)" dfloat r8,r7 ;makes "longmult" a double so can use drsub drsub r5,r8 ;rp5="(x-longmult)" laddr r8,LOG2U1,L laddr r9,LOG2U2,L ;LOG2U drmpy r3,r8 ;rp3="(lower*log2_u.d" laddr r8,LOG2L1,L laddr r9,LOG2L2,L ;LOG2L drmpy r0,r8 ;rp0="arg*log2_l)" dradd r0,r3 ;rp0="(lower*log2_u.d + arg*log2_l)" dradd r0,r5 ;rp0="x=...+..." laddr r3,r0 laddr r4,r1 drmpy r3,r3 ;rp3="xsq=x*x" laddr r5,P2P1,L laddr r6,P2P2,L ;P2 drmpy r5,r3 ;"xsq*p2)" laddr r8,P1P1,L laddr r9,P1P2,L ;P1 dradd r5,r8 ;"(p1+...)" drmpy r5,r3 ;"xsq*(...)" laddr r8,P0P1,L laddr r9,P0P2,L ;P0 dradd r5,r8 ;"(p0+...)" drmpy r0,r5 ;rp0="p=x*(p0+xsq*(p1+xsq*p2))" laddr r5,Q1P1,L laddr r6,Q1P2,L ;Q1 dradd r5,r3 ;"(q1+xsq)" drmpy r3,r5 ;"xsq*(..)" laddr r5,Q0P1,L laddr r6,Q0P2,L ;Q0 dradd r3,r5 ;rp5="q=q0+xsq*(q1+xsq)" cont: drsub r3,r0 ;"(q-p)" drdiv r0,r3 ;rp0="x=p/(q-p)" laddr r3,28 br r7>=r3,skip ;if (mult<28) then ... laddr r3,HALF1,L laddr r4,HALF2,L dradd r3,r0 ;"(x+.5)" laddr r5,HALF1,L laddr r6,HALF2,L drdiv r5,r3 ;rp5=".5/(x+.5)" laddr r8,r7 ;to save r7 "mult" laddr r3,MINUS2,L mpy r8,r3 sub r8,1 ;r8="-2*mult-1" dpckless: laddr r3,r5 ;r3 gets value of highorder rp5 laddr r4,12 ;to make csl fastser csl r3,r4 ;exponent now on loworder side of r3 laddr r4,MASK1,L and r3,r4 ;exponent of r5 now integer value in r3 add r3,r8 ;r3="u.exp=u.exp+power2" laddr r4,20 csl r3,r4 ;place r3's value in double expon's place laddr r4,MASK2,L and r5,r4 ;to clear r5 of its exponent or r5,r3 ;give r5's exponent the value of integer r3 ;rp5="xsq" now drsub r0,r5 ;rp0="x=x-xsq" skip: laddr r3,HALF1,L laddr r4,HALF2,L dradd r0,r3 ;".5+x" dpck: laddr r3,r0 ;to give r3 highorder of rp0 laddr r4,12 csl r3,r4 laddr r4,MASK1,L and r3,r4 ;r3 = rp5's exponent in integer form add r3,r7 ;r3="u.exp=u.exp+power2" laddr r4,20 csl r3,r4 laddr r4,MASK2,L and r0,r4 ;to clear rp0 of its exponent or r0,r3 ;gives rp0 the value of integer r3 sign: laddr r3,080000000h,L and r2,r3 ;isolates arg's sign bit or r0,r2 ;rp0="result=%d_sign(result,arg)" I 7 #ifdef ARGSINREGS loadd r8,STKPTR,arg_2 ;restore registers 8 and 9 #else E 7 loadd r8,r14,arg_2 ;restore registers 8 and 9 I 7 #endif E 7 D 7 done: loadd r6,r14,arg_1 ;restore registers 6 and 7 E 7 I 7 done: #ifdef ARGSINREGS loadd r6,STKPTR,arg_1 ;restore registers 6 and 7 ret LINK,LINK #else loadd r6,r14,arg_1 ;restore registers 6 and 7 E 7 ret r11,r11 I 7 #endif E 7 equal: br r1=0,normal ;if abs(arg)=710 then go back to function br badinput ;go back to badinput toobig: br r0=r3,equal ;to check further ; ; error handling ; badinput: ;returns info to user about input error laddr r4,07ff00000h,L laddr r5,0 ;rp5="infinity" drcomp r4,r0 struct: ;loads values into error structure in case user ;wishes to do more with them than we have done D 7 E 7 I 7 #ifdef ARGSINREGS store LINK,STKPTR,0 ;save old return laddr STKPTR,STKPTR,e_size ;update stack store r4,STKPTR,arg_1 ;saves r4's value (ie whether or not it's inf) #else E 7 store r11,r14,0 ;save old return store r15,r14,8 ;save old frame pointer move r15,r14 laddr r14,r14,e_size ;update stack D 7 E 7 store r4,r14,arg_1 ;saves r4's value (ie whether or not it's inf) I 7 #endif E 7 D 7 stored r0,r15,e_arg1 ;load arg's value into error structure E 7 I 7 stored r0,STKPTR,pe_size+e_arg1 ;load arg's value into error structure E 7 laddr r2,name,L ;name of offending routine D 7 store r2,r15,e_name ; into error structure E 7 I 7 store r2,STKPTR,pe_size+e_name ; into error structure E 7 move r3,OVERFLOW ;exception type D 7 store r3,r15,e_type E 7 I 7 store r3,STKPTR,pe_size+e_type E 7 laddr r0,07ff00000h,L laddr r1,0 D 7 stored r0,r15,e_retval ;return inf E 7 I 7 stored r0,STKPTR,pe_size+e_retval ;return inf E 7 I 7 #ifdef ARGSINREGS laddr r0,STKPTR,pe_size+e_type ;user want to do different anything with error? call LINK,_matherr,L ;matherr is a function for user to define #else E 7 laddr r4,r15,e_type ;user want to do different anything with error? store r4,r14,arg1 ;gives matherr the address of error structure call r11,_matherr,L ;matherr is a function for user to define I 7 #endif E 7 br r0<>0,err_rtn ;yes (assume user will change r0 if yes ) laddr r0,ERANGE ;sets global variable _errno for user store r0,_errno,L D 7 E 7 I 7 #ifdef ARGSINREGS load r4,STKPTR,arg_1 ;restore r4's old value (if inf or not) #else E 7 load r4,r14,arg_1 ;restore r4's old value (if inf or not) I 7 #endif E 7 br r4=0,inf ;if abs(arg)="infinity" then go to inf br r4<0,nan ;if abs(arg) is not-a-number then go to nan err_rtn: ;resets all old pointers and returns inf I 7 #ifdef ARGSINREGS laddr STKPTR,STKPTR,pe_size ;user will have already used matherr for himself load LINK,STKPTR,0 #else E 7 move r14,r15 ;user will have already used matherr for himself load r15,r14,8 load r11,r14,0 I 7 #endif E 7 laddr r0,07ff00000h,L laddr r1,0 ;returns inf I 7 #ifdef ARGSINREGS ret LINK,LINK #else E 7 ret r11,r11 I 7 #endif E 7 inf: move r0,2 ;to print I 7 #ifdef ARGSINREGS laddr r1,infmess,L laddr r2,inflen call LINK,_write,L #else E 7 store r0,r14,arg1 laddr r5,infmess,L store r5,r14,arg2 ;gives write the message laddr r0,inflen store r0,r14,arg3 ;gives write the length of message call r11,_write,L I 7 #endif E 7 br err_rtn nan: move r0,2 ;to print I 7 #ifdef ARGSINREGS laddr r1,nanmess,L laddr r2,nanlen call LINK,_write,L #else E 7 store r0,r14,arg1 laddr r5,nanmess,L store r5,r14,arg2 ;gives write the message laddr r0,nanlen store r0,r14,arg3 ;gives write the length of message call r11,_write,L I 7 #endif E 7 br err_rtn E 1 h58014 s 00003/00000/00226 d D 4.3 87/04/16 13:56:12 mth 9 8 c Profiling changes e s 00057/00010/00169 d D 4.2 87/02/16 17:09:35 mth 8 7 c Parameters in registers. e s 00000/00000/00179 d D 4.1 87/02/16 16:57:39 mth 7 6 c rolled rev to -r4 (mth) e s 00001/00001/00178 d D 3.4 87/01/31 15:46:31 mkm 6 5 c fixed real constant representation for RX.V as. -mkm e s 00001/00001/00178 d D 3.3 87/01/31 13:28:08 mkm 5 4 c correct compatability probs between ROS and SPIX as. -mkm e s 00001/00001/00178 d D 3.2 87/01/31 11:54:20 mkm 4 3 c from ROS sources as of this date. -mkm e s 00000/00000/00179 d D 3.1 87/01/21 17:46:17 mkm 3 2 c e s 00000/00000/00179 d D 2.1 87/01/21 17:43:40 mkm 2 1 c e s 00179/00000/00000 d D 1.1 87/01/21 17:41:52 mkm 1 0 c Placed under source control - mkm c These files are direct descendants of the ROS files c by the same name at or about ROS rev 5.1 e u U f b f n t T I 1 D 8 ; "%W% %G%" E 8 I 8 ; "%W% %G%" E 8 ; ; general stack offsets ; arg1 equ 24 arg2 equ 32 arg3 equ 40 ; ; name of routine and error message strings ; dsect data sqrt_name byte 'sqrt',0 D 5 errmess byte 'sqrt: DOMAIN error\n",0 E 5 I 5 errmess byte 'sqrt: DOMAIN error\n',0 E 5 errmlen equ 19 csect code e_type equ -32 ; exception type e_name equ -28 ; name of routine in error e_arg1 equ -24 ; argument 1 e_arg2 equ -16 ; argument 2 (if present) e_retval equ -8 ; room for exception block e_size equ -80 ; plus stack frame w/3 params I 8 #ifdef ARGSINREGS pe_size equ 80 ; positive e_size #else pe_size equ 0 ; positive e_size #endif E 8 DOMAIN equ 1 ; domain error SING equ 2 ; singularity OVERFLOW equ 3 ; overflow UNDERFLOW equ 4 ; underflow TLOSS equ 5 ; total loss of significance PLOSS equ 6 ; partial loss of significance EDOM equ 33 ; argument out of domain of function ERANGE equ 34 ; argument out of range externd _errno external _write,_matherr sqrt2 equ 03fb504f4h ; 1.4142136 = sqrt(2) isqrt2 equ 03f3504f3h ; 0.707106781 = 1.0/sqrt(2) D 6 two equ 2.0e0 E 6 I 6 D 8 two equ 040000000h ; 2.0e0 E 8 I 8 two equ 040000000h ; 2.0e0 E 8 E 6 ; ; _d_sqrt.s ; global _sqrt ;cc, rc and rp global _d_sqrt ;f77 global _D_sqrt ;rf D 8 _sqrt: loadd r0,r14,arg1 E 8 I 8 _sqrt: I 9 ; MCOUNT E 9 #ifndef ARGSINREGS loadd r0,r14,arg1 #endif E 8 br _D_sqrt _d_sqrt: I 9 ; MCOUNT E 9 I 8 #ifndef ARGSINREGS E 8 load r0,r14,arg1 I 8 #endif E 8 loadd r0,r0,0 _D_sqrt: I 9 ; MCOUNT E 9 br r0<=0,not_pos ; br if arg not positive DSR0000: I 8 #ifdef ARGSINREGS laddr STKPTR,STKPTR,-16 store r7,STKPTR,0 ; save r7 stored r8,STKPTR,8 ; save r8/r9 #else E 8 laddr r14,r14,-16 stored r6,r14,0 ; save r6/r7 stored r8,r14,8 ; save r8/r9 D 8 E 8 I 8 #endif E 8 move r2,r0 CSLI R2,12 ;SHIFT EXPONENT INTO POSITION LADDR R3,07FFH ;LOAD MASK AND R2,R3 ;MASK OUT MANTISSA AND SIGN BIT LADDR R8,R2,0fffffc02h ;UNBIAS EXPONENT LADDR R2,0800FFFFFH,L ;LOAD MASK AND R0,R2 ;CLEAR EXPONENT LADDR R2,03feh ;ADD EXPONENT BIAS LSLI R2,15 ;SHIFT INTO POSITION LSLI R2,5 ; ... IN TWO SHIFTS ADD R0,R2 ;ADD IN NEW EXPONENT MOVE R6,R0 ;(R6,R7) <- F MOVE R7,R1 MAKEDR R0,R0 ;DO Y(0) IN SINGLE MOVE R9,R0 ;MAKE COPY LADDR R1,03F1714DDH,L ;R1 <- C2 (+0.59016206) RMPY R0,R1 LADDR R1,03ED5A957H,L ;R1 <- C1 (+0.41730759) RADD R0,R1 ;R0 IS NOW Y(0) RDIV R9,R0 ;DO Y(1) ALSO IN SINGLE RADD R9,R0 laddr r4,000800000h,L ;places a 1 in lowest bit of real exponent sub r9,r4 ;effectively does a rdiv on r9 by 2.0 MAKERD R2,R9 ;DO Y(2) IN DOUBLE MOVE R0,R6 MOVE R1,R7 DRDIV R0,R2 DRADD R0,R2 laddr r4,000100000h,L ;places a 1 in lowest bit of double exponent sub r0,r4 ;effectively does a drdiv on r0 by 2.0 DRDIV R6,R0 ;DO Y(3) IN DOUBLE DRADD R6,R0 sub r6,r4 ;effectively does a drdiv on r6 by 2.0 MOVE R9,R8 ;R9 <- EXPONENT ANDI R9,1 ;SEE IF IT'S ODD BR R9<>1,DSR0010 ;BRANCH IF EVEN ADDI R8,1 LADDR R0,03FE6A09EH,L ;R0 <- SQRT(1/2) D 4 LADDR R1,0667F3BCCH,L E 4 I 4 LADDR R1,0667F3BCDH,L E 4 DRMPY R6,R0 ;ADJUST RESULT DSR0010: MOVE R0,R8 ;DIVIDE EXPONENT BY TWO TEST R8<0 ADD R0,R8 ASRI R0,1 LSLI R0,15 ;SHIFT INTO POSITION LSLI R0,5 ;WITH TWO SHIFTS ADD R0,R6 ;AUGMENT EXPONENT move r1,r7 DSR9999: I 8 #ifdef ARGSINREGS load r7,STKPTR,0 ; restore r7 loadd r8,STKPTR,8 laddr STKPTR,STKPTR,16 RET LINK,LINK #else E 8 loadd r6,r14,0 ; restore r6/r7 loadd r8,r14,8 laddr r14,r14,16 RET R11,R11 I 8 #endif E 8 not_pos: MOVE R2,R0 ;CHECK IF X = 0.0D0 OR R2,R1 ; br r2<>0,dsqrt_err I 8 #ifdef ARGSINREGS ret LINK,LINK #else E 8 ret r11,r11 I 8 #endif E 8 ; ; error handling ; dsqrt_err: ; ; DOMAIN error ; I 8 #ifdef ARGSINREGS store LINK,STKPTR,0 ; save old return laddr STKPTR,STKPTR,e_size ; update stack #else E 8 store r11,r14,0 ; save old return store r15,r14,8 ; save old frame ptr move r15,r14 laddr r14,r14,e_size ; update stack I 8 #endif E 8 move r3,DOMAIN ; exception type D 8 store r3,r15,e_type E 8 I 8 store r3,STKPTR,pe_size+e_type E 8 laddr r5,sqrt_name,L ; name of offending routine D 8 store r5,r15,e_name store r0,r15,e_arg1 E 8 I 8 store r5,STKPTR,pe_size+e_name store r0,STKPTR,pe_size+e_arg1 E 8 move r0,0 move r1,0 D 8 stored r0,r15,e_retval ; return 0 E 8 I 8 stored r0,STKPTR,pe_size+e_retval ; return 0 E 8 I 8 #ifdef ARGSINREGS laddr r0,STKPTR,pe_size+e_type ; user want to do anything with error? call LINK,_matherr,L #else E 8 laddr r4,r15,e_type ; user want to do anything with error? store r4,r14,arg1 call r11,_matherr,L I 8 #endif E 8 br r0<>0,sqrt_rtn ; yes move r0,2 ; tell user about problem I 8 #ifdef ARGSINREGS laddr r1,errmess,L laddr r2,errmlen call LINK,_write,L #else E 8 store r0,r14,arg1 laddr r0,errmess,L store r0,r14,arg2 laddr r0,errmlen store r0,r14,arg3 call r11,_write,L I 8 #endif E 8 laddr r0,EDOM store r0,_errno,L sqrt_rtn: move r0,0 move r1,0 D 8 stored r0,r15,e_retval ; return 0 E 8 I 8 stored r0,STKPTR,pe_size+e_retval ; return 0 #ifdef ARGSINREGS laddr STKPTR,STKPTR,pe_size load LINK,STKPTR,0 ret LINK,LINK #else E 8 move r14,r15 load r15,r14,8 load r11,r14,0 ret r11,r11 I 8 #endif E 8 E 1 h11309 s 00003/00000/00488 d D 4.3 87/04/16 13:56:16 mth 8 7 c Profiling changes e s 00122/00018/00366 d D 4.2 87/02/16 17:09:37 mth 7 6 c Parameters in registers. e s 00000/00000/00384 d D 4.1 87/02/16 16:57:42 mth 6 5 c rolled rev to -r4 (mth) e s 00003/00003/00381 d D 3.3 87/01/31 13:28:10 mkm 5 4 c correct compatability probs between ROS and SPIX as. -mkm e s 00000/00000/00384 d D 3.2 87/01/31 11:54:22 mkm 4 3 c from ROS sources as of this date. -mkm e s 00000/00000/00384 d D 3.1 87/01/21 17:46:19 mkm 3 2 c e s 00000/00000/00384 d D 2.1 87/01/21 17:43:41 mkm 2 1 c e s 00384/00000/00000 d D 1.1 87/01/21 17:41:53 mkm 1 0 c Placed under source control - mkm c These files are direct descendants of the ROS files c by the same name at or about ROS rev 5.1 e u U f b f n t T I 1 ; "%W% %G%" dsect data pix: ;initialize array pix word 1071931184 word 1073741824 ;equals 0.636619687080383301 word 1047979236 word 1073741824 ;equals 8.528719774858473100e-08 word 1018505720 word 0 ;equals 2.937086744604286430e-16 word 999333215 word 1073741824 ;equals 8.795767286342583120e-22 word 973034316 word 0 ;equals 2.471136637518957480e-29 word 951959771 word 1073741824 ;equals 2.238392930622293410e-35 name byte 'tan',0 ;name of routine D 5 emess byte 'tan: TLOSS error\n",0 ;error message E 5 I 5 emess byte 'tan: TLOSS error\n',0 ;error message E 5 messlen equ 17 ;length of message D 5 nanmess byte 'tan: input value was NAN\n",0 ;error message if nan E 5 I 5 nanmess byte 'tan: input value was NAN\n',0 ;error message if nan E 5 nanlen equ 25 D 5 infmess byte 'tan: input value was INF\n",0 ;error message if "infinity" E 5 I 5 infmess byte 'tan: input value was INF\n',0 ;error message if "infinity" E 5 inflen equ 25 csect code align 2 externd _errno external _write external _matherr e_type equ -32 ;exception type e_name equ -28 ;name of routine in error e_arg1 equ -24 ;argument 1 e_arg2 equ -16 ;argument 2 (if present) e_retval equ -8 ;room for exception block e_size equ -80 ; plus stack frame with 3 parameters I 7 #ifdef ARGSINREGS pe_size equ 80 ; positive e_size #else pe_size equ 0 ; positive e_size #endif E 7 DOMAIN equ 1 SING equ 2 OVERFLOW equ 3 UNDERFLOW equ 4 TLOSS equ 5 PLOSS equ 6 EDOM equ 33 ERANGE equ 34 PIX1U equ 1071931184 PIX1L equ 1073741824 ;equals pix[i] to save time in epre C1P1 equ 0bfeed9e5h C1P2 equ 05681936dh ;equals -.9640986146520 C2P1 equ 04058a222h C2P2 equ 08e09b7bfh ;equals 98.5333590598011 C3P1 equ 0c098fc89h C3P2 equ 0af153dach ;equals -1599.1344569510355 C4P1 equ 0c05bffa4h C4P2 equ 081168c68h ;equals -111.9944155426216 C5P1 equ 040a14d1fh C5P2 equ 0732a7d4ah ;equals 2214.5614255216536 C6P1 equ 0c0b2bd67h C6P2 equ 0434fee6dh ;equals -4797.4033708531468 NUM1 equ 03ff921fbh NUM2 equ 054442d18h ;equals 1.57079632679489662 MINUS1U equ 0bff00000h MINUS1L equ 000000000h ;equals -1 LIMITU equ 041dfffffh LIMITL equ 0ffc00000h ;equals 2147483647 HALFSZ equ 000000017h ;equals 23 as an integer representation HALF_2 equ 000000015h ;equals 21 as an integer representation MULTU equ 03fe921ffh MULTL equ 02e48e8a7h ;equals .7854 to test whether mult=0 or not ABS equ 07fffffffh ;constant to find absolute value MMANT equ 0000007ffh ;constant to mask rotated mantissa and sign bit EBIAS equ 1023 ;to unbias exponent arg equ -8 arg3 equ 40 arg2 equ 32 arg1 equ 24 arg_1 equ -16 arg_2 equ -24 arg_3 equ -32 arg_4 equ -40 arg_5 equ -48 arg_6 equ -56 arg_7 equ -64 ; ; _d_tan.s ; global _tan ;cc, rc and rp global _d_tan ;f77 global _D_tan ;rf D 7 _tan: loadd r0,r14,arg1 E 7 I 7 _tan: I 8 ; MCOUNT E 8 #ifndef ARGSINREGS loadd r0,r14,arg1 #endif E 7 br _D_tan _d_tan: I 8 ; MCOUNT E 8 I 7 #ifndef ARGSINREGS E 7 load r0,r14,arg1 I 7 #endif E 7 loadd r0,r0,0 _D_tan: I 8 ; MCOUNT E 8 dck2: laddr r2,r0 laddr r3,r1 ;to save sign of arg laddr r4,ABS,L and r2,r4 laddr r4,LIMITU,L laddr r5,LIMITL,L drcomp r4,r2 br r4<0,badinput ;if abs(arg)>limit then badinput D 7 E 7 I 7 #ifdef ARGSINREGS store r7,STKPTR,arg_1 stored r8,STKPTR,arg_2 stored r10,STKPTR,arg_3 ;save registers 7-11 for arithmetic constants stored r12,STKPTR,arg_4 ;store rp12 to use as variables #else E 7 stored r6,r14,arg_1 stored r8,r14,arg_2 stored r10,r14,arg_3 ;save registers 6-11 for arithmetic constants I 7 stored r12,r14,arg_4 ;store rp12 to use as variables #endif E 7 ; rp0="result",arg stored at r14+arg; rp2="upper"; rp4="lower"; r6="cutoff" ; r7="mod4",%dlgb; rp8="dmult","rtemp",constants; r12="mult"; r13="i" D 7 stored r12,r14,arg_4 ;store rp12 to use as variables E 7 epre: laddr r4,MULTU,L laddr r5,MULTL,L ;load rp2 with .7854 to test with drcomp r2,r4 br r2<0,mult0 ;branchs to mult0 if lessthan .7854 makedr r4,r0 ;r4="sngl_temp=arg" makerd r2,r4 ;rp2="upper=sngl_temp" laddr r4,r0 laddr r5,r1 drsub r4,r2 ;rp4="lower=arg-upper" I 7 #ifdef ARGSINREGS stored r0,STKPTR,arg ;to save "arg" #else E 7 stored r0,r14,arg ;to save "arg" I 7 #endif E 7 laddr r0,PIX1U,L laddr r1,PIX1L,L drmpy r0,r2 ;rp0="result=pix[i]*upper" dlgb: ;gets unbiased exponent as an integer laddr r6,r0 csl r6,12 laddr r7,MMANT,L and r6,r7 ;masks off mantissa part of r6 and sign bit laddr r7,EBIAS,L sub r6,r7 ;unbiases the exponent of "result" laddr r7,HALF_2 sub r6,r7 ;r6="cutoff=%dlgb(result)-(halfsz-2)" dfixr r8,r0 ;rounds "result" to an integer dfloat r8,r8 ;rp8="dmult=%_dnint(result)" drsub r0,r8 ;rp0="result=result-dmult" laddr r12,r8 laddr r13,r9 ;rp12=rp8="dmult" laddr r10,000200000h,L sub r12,r10 ;"dmult/4" dfixt r12,r12 dfloat r12,r12 ;rp12="%d_dint(dmult/4)" add r12,r10 ;rp12="...*4" drsub r8,r12 ;rp8="dmult-..." dfixt r12,r8 ;r12="mult=trunc(dmult-%d_dint(dmult/4)*4)" laddr r10,0 laddr r11,0 ;rp10="rlower=0" laddr r13,0 ;r13="i=1" while: dlgb2: laddr r7,r0 ;load result csl r7,12 laddr r8,MMANT,L and r7,r8 ;masks off mantissa laddr r8,EBIAS,L sub r7,r8 ;unbiases exponent br r7>=r6,cont! ;while (%_dlgb(result)=r8,cont ;and (i+2= -1) then begin dfixr r8,r8 dfloat r8,r8 ;rp8="dmult=%d_dnint(rtemp)" drsub r0,r8 ;rp0="result=result-dmult" I 7 #ifdef ARGSINREGS stored r2,STKPTR,arg_5 stored r4,STKPTR,arg_6 ;store rp2 and rp4 temporarily #else E 7 stored r2,r14,arg_5 stored r4,r14,arg_6 ;store rp2 and rp4 temporarily I 7 #endif E 7 laddr r4,r8 laddr r5,r9 ;rp4=rp8="dmult"; rp2=4 laddr r2,000200000h,L sub r4,r2 ;rp4="(dmult/4)" dfixt r4,r4 dfloat r4,r4 add r4,r2 ;rp4="%d_dint(dmult/4)*4)" drsub r8,r4 ;rp8="dmult-..." dfixt r7,r8 ;r7="mod4=trunc(dmult-%d+dint(dmult/4)*4)" I 7 #ifdef ARGSINREGS loadd r2,STKPTR,arg_5 loadd r4,STKPTR,arg_6 ;restore rp2 and rp4 #else E 7 loadd r2,r14,arg_5 loadd r4,r14,arg_6 ;restore rp2 and rp4 I 7 #endif E 7 add r12,r7 ;r12="mult=mult+mod4" laddr r8,r0 laddr r9,r1 dradd r8,r10 ;rp8="rtemp=result+rlower" ifnot: drsub r0,r8 dradd r10,r0 ;rp10="(result=rtemp)_rlower" laddr r0,r8 laddr r1,r9 ;rp0="result=rtemp" laddr r8,HALFSZ,L sub r6,r8 ;r6="cutoff=cutoff-halfsz" add r13,8 ;r13="i=i+1" br while cont: ;assumes rp6 and rp8 free for use as constants I 7 #ifdef ARGSINREGS loadd r2,STKPTR,arg ;rp2="original arg" #else E 7 loadd r2,r14,arg ;rp2="original arg" I 7 #endif E 7 loadd r8,r13,pix,L ;rp8="pix[i]" drmpy r4,r8 ;rp4="lower*pix[i]" add r13,8 loadd r8,r13,pix,L ;rp8="pix[i+1]" add r13,8 loadd r6,r13,pix,L ;rp6="pix[i+2]" dradd r8,r6 ;rp8="(pix[i+1]+pix[i+2])" drmpy r2,r8 ;rp2="arg*..." dradd r4,r2 ;rp4="(lower*pix[i]+arg*(pix[i+1]+pix[i+2]))" dradd r4,r10 ;rp4="...+rlower" dradd r0,r4 ;rp0="...+result" laddr r8,NUM1,L laddr r9,NUM2,L drmpy r0,r8 ;rp0= ;result= NUM *(((lower * pix[i] + arg * (pix[i+1] + pix[i+2])) +rlower)+result) esnc: ;final calculations -uses rp0="x"(old result) ;rp2="xsq" and r12="mult" laddr r2,r0 laddr r3,r1 drmpy r2,r2 ;rp2="xsq=x*x" laddr r6,C1P1,L laddr r7,C1P2,L drmpy r6,r2 ;rp6="(c1)*xsq" laddr r8,C2P1,L laddr r9,C2P2,L dradd r6,r8 ;rp6="...+c2" drmpy r6,r2 ;rp6="...*xsq" laddr r8,C3P1,L laddr r9,C3P2,L dradd r6,r8 ;rp6="...+c3" drmpy r6,r2 ;rp6="...*xsq" drmpy r6,r0 ;rp6="...*x" laddr r8,C4P1,L laddr r9,C4P2,L dradd r8,r2 ;rp8="xsq+c4" drmpy r8,r2 ;rp8="...*xsq" laddr r10,C5P1,L laddr r11,C5P2,L dradd r8,r10 ;rp8="...+c5" drmpy r8,r2 ;rp8="...*xsq" laddr r10,C6P1,L laddr r11,C6P2,L dradd r8,r10 ;rp8="...+c6" drdiv r6,r8 dradd r0,r6 fini laddr r2,1 and r2,r12 br r2=1,inverse ;"if (odd(mult div 2)) then result=-result" D 7 fini2: loadd r6,r14,arg_1 E 7 I 7 fini2: #ifdef ARGSINREGS load r7,STKPTR,arg_1 loadd r8,STKPTR,arg_2 loadd r10,STKPTR,arg_3 loadd r12,STKPTR,arg_4 ;restore saved registers ret LINK,LINK ;done #else loadd r6,r14,arg_1 E 7 loadd r8,r14,arg_2 loadd r10,r14,arg_3 loadd r12,r14,arg_4 ;restore saved registers ret r11,r11 ;done I 7 #endif E 7 D 7 mult0: stored r12,r14,arg_4 E 7 I 7 mult0: #ifdef ARGSINREGS stored r12,STKPTR,arg_4 #else stored r12,r14,arg_4 #endif E 7 laddr r12,0 ;since abs(arg)<.7854 mult=0 br esnc ;time for final calculations inverse: laddr r2,MINUS1U,L laddr r3,MINUS1L,L ;rp2= -1 drdiv r2,r0 laddr r0,r2 laddr r1,r3 ;rp0="result= -1 / result" br fini2 ; ; error handling ; badinput: ;returns info to user about input error laddr r4,07ff00000h,L laddr r5,0 ;rp5="infinity" drcomp r4,r2 struct: ;loads values into error structure in case user ;wishes to do more with them than we have done D 7 E 7 I 7 #ifdef ARGSINREGS store LINK,STKPTR,0 ;save old return laddr STKPTR,STKPTR,e_size ;update stack store r4,STKPTR,arg_1 ;saves r4's value (ie whether or not it's inf) #else E 7 store r11,r14,0 ;save old return store r15,r14,8 ;save old frame pointer move r15,r14 laddr r14,r14,e_size ;update stack D 7 E 7 store r4,r14,arg_1 ;saves r4's value (ie whether or not it's inf) D 7 stored r0,r15,e_arg1 ;load arg's value into error structure E 7 I 7 #endif stored r0,STKPTR,pe_size+e_arg1 ;load arg's value into error structure E 7 laddr r2,name,L ;name of offending routine D 7 store r2,r15,e_name ; into error structure E 7 I 7 store r2,STKPTR,pe_size+e_name ; into error structure E 7 move r3,TLOSS ;exception type D 7 store r3,r15,e_type E 7 I 7 store r3,STKPTR,pe_size+e_type E 7 laddr r0,0 laddr r1,0 D 7 stored r0,r15,e_retval ;return 0 E 7 I 7 stored r0,STKPTR,pe_size+e_retval ;return 0 E 7 D 7 laddr r4,r15,e_type ;user want to do different anything with error? E 7 I 7 #ifdef ARGSINREGS laddr r0,STKPTR,pe_size+e_type ;user want to do different anything with error? call LINK,_matherr,L ;matherr is a function for user to define #else laddr r0,r14,e_type ;user want to do different anything with error? E 7 store r4,r14,arg1 ;gives matherr the address of error structure call r11,_matherr,L ;matherr is a function for user to define I 7 #endif E 7 br r0<>0,err_rtn ;yes (assume user will change r0 if yes ) mess: ;prints out our error message I 7 #ifdef ARGSINREGS E 7 move r0,2 I 7 laddr r1,emess,L laddr r2,messlen call LINK,_write,L ;writes out message #else move r0,2 E 7 store r0,r14,arg1 I 7 store r0,r14,arg1 E 7 laddr r5,emess,L store r5,r14,arg2 ;gives message laddr r0,messlen store r0,r14,arg3 ;gives length of message call r11,_write,L ;writes out message I 7 #endif E 7 laddr r0,ERANGE ;sets global variable _errno for user store r0,_errno,L D 7 E 7 I 7 #ifdef ARGSINREGS load r4,STKPTR,arg_1 ;restore r4's old value (if inf or not) #else E 7 load r4,r14,arg_1 ;restore r4's old value (if inf or not) I 7 #endif E 7 br r4=0,inf ;if abs(arg)="infinity" then go to inf br r4<0,nan ;if abs(arg) is not-a-number then go to nan err_rtn: ;resets all old pointers and returns zero I 7 #ifdef ARGSINREGS laddr STKPTR,STKPTR,pe_size ;user will have already used matherr for himself load LINK,STKPTR,0 #else E 7 move r14,r15 ;user will have already used matherr for himself load r15,r14,8 load r11,r14,0 I 7 #endif E 7 laddr r0,0 laddr r1,0 ;to return 0 I 7 #ifdef ARGSINREGS ret LINK,LINK #else E 7 ret r11,r11 I 7 #endif E 7 inf: I 7 #ifdef ARGSINREGS E 7 move r0,2 ;to print I 7 laddr r1,infmess,L laddr r2,inflen call LINK,_write,L #else move r0,2 ;to print E 7 store r0,r14,arg1 laddr r5,infmess,L store r5,r14,arg2 ;gives write the message laddr r0,inflen store r0,r14,arg3 ;gives write the length of message call r11,_write,L I 7 #endif E 7 br err_rtn nan: move r0,2 ;to print I 7 #ifdef ARGSINREGS laddr r1,nanmess,L laddr r2,nanlen call LINK,_write,L #else E 7 store r0,r14,arg1 laddr r5,nanmess,L store r5,r14,arg2 ;gives write the message laddr r0,nanlen store r0,r14,arg3 ;gives write the length of message call r11,_write,L I 7 #endif E 7 br err_rtn D 7 E 7 E 1 h33115 s 00003/00000/00373 d D 4.3 87/04/16 13:56:21 mth 8 7 c Profiling changes e s 00078/00009/00295 d D 4.2 87/02/16 17:09:41 mth 7 6 c Parameters in registers. e s 00000/00000/00304 d D 4.1 87/02/16 16:57:45 mth 6 5 c rolled rev to -r4 (mth) e s 00002/00002/00302 d D 3.3 87/01/31 13:28:12 mkm 5 4 c correct compatability probs between ROS and SPIX as. -mkm e s 00000/00000/00304 d D 3.2 87/01/31 11:54:24 mkm 4 3 c from ROS sources as of this date. -mkm e s 00000/00000/00304 d D 3.1 87/01/21 17:46:20 mkm 3 2 c e s 00000/00000/00304 d D 2.1 87/01/21 17:43:43 mkm 2 1 c e s 00304/00000/00000 d D 1.1 87/01/21 17:41:54 mkm 1 0 c Placed under source control - mkm c These files are direct descendants of the ROS files c by the same name at or about ROS rev 5.1 e u U f b f n t T I 1 ; "%W% %G%" dsect data name byte 'tanh',0 ;name of routine emess byte 'tanh: DOMAIN error\n',0 ;error message messlen equ 19 ;length of message D 5 nanmess byte 'tanh: input value was NAN\n",0 ;error message if nan E 5 I 5 nanmess byte 'tanh: input value was NAN\n',0 ;error message if nan E 5 nanlen equ 26 D 5 infmess byte 'tanh: input value was INF\n",0 ;error message if "infinity" E 5 I 5 infmess byte 'tanh: input value was INF\n',0 ;error message if "infinity" E 5 inflen equ 26 csect code align 2 externd _errno external _write external _matherr e_type equ -32 ;exception type e_name equ -28 ;name of routine in error e_arg1 equ -24 ;argument 1 e_arg2 equ -16 ;argument 2 (if present) e_retval equ -8 ;room for exception block e_size equ -80 ; plus stack frame with 3 parameters I 7 #ifdef ARGSINREGS pe_size equ 80 ; positive e_size #else pe_size equ 0 ; positive e_size #endif E 7 DOMAIN equ 1 SING equ 2 OVERFLOW equ 3 UNDERFLOW equ 4 TLOSS equ 5 PLOSS equ 6 EDOM equ 33 ERANGE equ 34 P0P1 equ 04097a774h P0P2 equ 0e9c773d2h ;equals 1513.86417304653562 P1P1 equ 0403433a2h P1P2 equ 09c957777h ;equals 20.20170000695313 P2P1 equ 03f97a609h P2P2 equ 0aa5cd009h ;equals 0.02309432127295 Q0P1 equ 040b11016h Q0P2 equ 0b314dfb0h ;equals 4368.08867006741699 Q1P1 equ 0406d25b4h Q1P2 equ 013b3ffdah ;equals 233.177823205143104 LOG2U1 equ 1073157447 LOG2U2 equ 1073741824 ;equals 1.44269490242004395 LOG2L1 equ 03e8295c1h LOG2L2 equ 07f0bbbe8h ;equals 1.384689194620474 C1P1 equ 0bfeedcc6h C1P2 equ 096444324h ;equals -.96445016240077 C2P1 equ 0c058dac3h C2P2 equ 0b304def0h ;equals -99.41819453693073 C3P1 equ 0c0994587h C3P2 equ 0a7d1b193h ;equals -1617.38247611662225 C4P1 equ 0405c3cfdh C4P2 equ 0ecd4a78fh ;equals 112.95299835936588 C5P1 equ 040a17e3ah C5P2 equ 023dfdb07h ;equals 2239.11355495022451 C6P1 equ 040b2f425h C6P2 equ 0bddd4541h ;equals 4852.14742834988424 LIMIT1U equ 040331999h LIMIT1L equ 09999999ah ;equals 19.1 LIMIT2U equ 03fe80000h ;equals upper word of .75 ABS equ 07fffffffh ;to mask off the sign bit arg3 equ 40 arg2 equ 32 arg1 equ 24 arg_1 equ -8 arg_2 equ -16 arg_3 equ -20 ; ; _d_tanh.s ; global _tanh ;cc, rc and rp global _d_tanh ;f77 global _D_tanh ;rf D 7 _tanh: loadd r0,r14,arg1 E 7 I 7 _tanh: I 8 ; MCOUNT E 8 #ifndef ARGSINREGS loadd r0,r14,arg1 #endif E 7 br _D_tanh _d_tanh: I 8 ; MCOUNT E 8 I 7 #ifndef ARGSINREGS E 7 load r0,r14,arg1 I 7 #endif E 7 loadd r0,r0,0 _D_tanh: I 8 ; MCOUNT E 8 dck2: move r2,r0 ;to save sign bit laddr r3,ABS,L and r0,r3 ;r0 now has the absolute value of the argument laddr r3,LIMIT1U,L laddr r4,LIMIT1L,L drcomp r3,r0 br r3<0,toobig ;if abs(arg)>19.1 then go to toobig I 7 #ifdef ARGSINREGS store r7,STKPTR,arg_1 stored r8,STKPTR,arg_2 ;to save registers 7-9 #else E 7 stored r6,r14,arg_1 stored r8,r14,arg_2 ;to save registers 6-9 I 7 #endif E 7 laddr r3,LIMIT2U,L move r4,0 drcomp r3,r0 br r3<=0,greater ;if x<.75 then ... else go to greater lessthan: D 7 E 7 I 7 #ifdef ARGSINREGS store r10,STKPTR,arg_3 ;to save register 10 #else E 7 store r10,r14,arg_3 ;to save register 10 I 7 #endif E 7 move r3,r0 move r4,r1 drmpy r3,r3 ;rp3="xsq=x*x" laddr r5,C1P1,L laddr r6,C1P2,L ;C1 drmpy r5,r3 ;"((C1)*xsq" laddr r7,C2P1,L laddr r8,C2P2,L ;C2 dradd r5,r7 ;"((C1)*xsq+C2)" drmpy r5,r3 ;"...*xsq" laddr r7,C3P1,L laddr r8,C3P2,L ;C3 dradd r5,r7 ;"...+C3" drmpy r5,r3 ;"...*xsq" drmpy r5,r0 ;"...*x" = numerator laddr r7,C4P1,L laddr r8,C4P2,L ;C4 dradd r7,r3 ;"(xsq+C4)" drmpy r7,r3 ;"...*xsq" laddr r9,C5P1,L laddr r10,C5P2,L ;C5 dradd r7,r9 ;"...+C5" drmpy r7,r3 ;"...*xsq" laddr r9,C6P1,L laddr r10,C6P2,L ;C6 dradd r7,r9 ;"...+C6" = denominator drdiv r5,r7 ;".../..." dradd r0,r5 ;rp0="resutl=x+..." done I 7 #ifdef ARGSINREGS load r10,STKPTR,arg_3 #else E 7 load r10,r14,arg_3 I 7 #endif E 7 br sign greater: dradd r0,r0 ;"x+x" eere: makedr r5,r0 ;"sngl_temp=arg" makerd r5,r5 ;"upper=sngl_temp" move r3,r0 move r4,r1 drsub r3,r5 ;"lower=arg-upper" laddr r7,LOG2U1,L laddr r8,LOG2U2,L ;LOG2U drmpy r5,r7 ;rp5="x=upper*log2_u.d" dfixr r7,r5 ;r7=mult="longmult=%i_idnint(x)" dfloat r8,r7 ;makes "longmult" a double so can use drsub drsub r5,r8 ;rp5="(x-longmult)" laddr r8,LOG2U1,L laddr r9,LOG2U2,L ;LOG2U drmpy r3,r8 ;rp3="(lower*log2_u.d" laddr r8,LOG2L1,L laddr r9,LOG2L2,L ;LOG2L drmpy r0,r8 ;rp0="arg*log2_l)" dradd r0,r3 ;rp0="(lower*log2_u.d + arg*log2_l)" dradd r0,r5 ;rp0="x=...+..." move r3,r0 move r4,r1 drmpy r3,r3 ;rp3="xsq=x*x" laddr r5,P2P1,L laddr r6,P2P2,L ;P2 drmpy r5,r3 ;"xsq*p2)" laddr r8,P1P1,L laddr r9,P1P2,L ;P1 dradd r5,r8 ;"(p1+...)" drmpy r5,r3 ;"xsq*(...)" laddr r8,P0P1,L laddr r9,P0P2,L ;P0 dradd r5,r8 ;"(p0+...)" drmpy r0,r5 ;rp0="p=x*(p0+xsq*(p1+xsq*p2))" laddr r5,Q1P1,L laddr r6,Q1P2,L ;Q1 dradd r5,r3 ;"(q1+xsq)" drmpy r3,r5 ;"xsq*(..)" laddr r5,Q0P1,L laddr r6,Q0P2,L ;Q0 dradd r3,r5 ;rp3="q=q0+xsq*(q1+xsq)" dcpk: move r5,r0 move r6,r1 dradd r5,r3 ;"q+p" move r8,r5 csl r8,12 ;to place exponent on loworder side of r8 laddr r9,0000007ffh,L ;to mask and r8,r9 ; off exponent add r8,r7 ;r8="u.exp=u.exp+power2" laddr r7,0800fffffh,L and r5,r7 ;to clear r5 of its exponent laddr r7,20 csl r8,r7 ;to replace the exponent in its proper position or r5,r8 ;to give rp5 back its expon + mult-rp5="temp" drsub r3,r0 ;rp3="(q-p)" dradd r5,r3 ;"(temp+(q-p))" = denominator laddr r7,040000000h,L move r8,0 ;rp7=2 drmpy r3,r7 ;"2*(q-p)" = numerator drdiv r3,r5 ;".../..." laddr r0,03ff00000h,L move r1,0 ;rp0=1 drsub r0,r3 ;rp0="result=1-2*(q-p)/(temp+(q-p))" sign: laddr r3,080000000h,L and r2,r3 or r0,r2 ;"%_dtnh=%d_sign(result,arg)" I 7 #ifdef ARGSINREGS load r7,STKPTR,arg_1 loadd r8,STKPTR,arg_2 ret LINK,LINK #else E 7 loadd r6,r14,arg_1 loadd r8,r14,arg_2 ret r11,r11 I 7 #endif E 7 toobig: laddr r4,07ff00000h,L move r5,0 ;"infinity" drcomp r4,r0 br r4<=0,badinput ;if abs(arg)=inf or nan then badinput ;else return 1 or -1 laddr r0,03ff00000h,L move r1,0 laddr r3,080000000h,L and r2,r3 ;gives r2 only the sign bit or r0,r2 ;to return the appropriate sign I 7 #ifdef ARGSINREGS ret LINK,LINK #else E 7 ret r11,r11 I 7 #endif E 7 ; ; error handling ; badinput: ;loads values into error structure in case user ;wishes to do more with them than we have done D 7 E 7 I 7 #ifdef ARGSINREGS store LINK,STKPTR,0 ;save old return laddr STKPTR,STKPTR,e_size ;update stack store r4,STKPTR,arg_1 ;store r4 for future reference #else E 7 store r11,r14,0 ;save old return store r15,r14,8 ;save old frame pointer move r15,r14 laddr r14,r14,e_size ;update stack D 7 E 7 store r4,r14,arg_1 ;store r4 for future reference I 7 #endif E 7 D 7 stored r0,r15,e_arg1 ;load arg's value into error structure E 7 I 7 stored r0,STKPTR,pe_size+e_arg1 ;load arg's value into error structure E 7 laddr r2,name,L ;name of offending routine D 7 store r2,r15,e_name ; into error structure E 7 I 7 store r2,STKPTR,pe_size+e_name ; into error structure E 7 move r3,DOMAIN ;exception type D 7 store r3,r15,e_type E 7 I 7 store r3,STKPTR,pe_size+e_type E 7 laddr r0,03ff00000h,L move r1,0 D 7 stored r0,r15,e_retval ;return 1 E 7 I 7 stored r0,STKPTR,pe_size+e_retval ;return 1 E 7 I 7 #ifdef ARGSINREGS laddr r0,STKPTR,pe_size+e_type ;user want to do different anything with error? call LINK,_matherr,L ;matherr is a function for user to define #else E 7 laddr r4,r15,e_type ;user want to do different anything with error? store r4,r14,arg1 ;gives matherr the address of error structure call r11,_matherr,L ;matherr is a function for user to define I 7 #endif E 7 br r0<>0,err_rtn ;yes (assume user will change r0 if yes ) mess: ;prints out our error message move r0,2 I 7 #ifdef ARGSINREGS laddr r1,emess,L laddr r2,messlen call LINK,_write,L ;writes out message #else E 7 store r0,r14,arg1 laddr r5,emess,L store r5,r14,arg2 ;gives message laddr r0,messlen store r0,r14,arg3 ;gives length of message call r11,_write,L ;writes out message I 7 #endif E 7 laddr r0,EDOM ;sets global variable _errno for user store r0,_errno,L D 7 load r4,r14,arg_1 ;restore r4 (ie is arg inf or nan) E 7 I 7 load r4,LINK,arg_1 ;restore r4 (ie is arg inf or nan) E 7 br r4=0,inf ;if arg = inf then inf else nan nan: move r0,2 ;to print I 7 #ifdef ARGSINREGS laddr r1,nanmess,L laddr r2,nanlen call LINK,_write,L #else E 7 store r0,r14,arg1 laddr r5,nanmess,L store r5,r14,arg2 ;gives write the message laddr r0,nanlen store r0,r14,arg3 ;gives write the length of message call r11,_write,L I 7 #endif E 7 err_rtn: ;resets all old pointers and returns one I 7 #ifdef ARGSINREGS laddr STKPTR,STKPTR,pe_size ;user will have already used matherr for himself load LINK,STKPTR,0 #else E 7 move r14,r15 ;user will have already used matherr for himself load r15,r14,8 load r11,r14,0 I 7 #endif E 7 laddr r0,03ff00000h,L move r1,0 ;to return 1 I 7 #ifdef ARGSINREGS ret LINK,LINK #else E 7 ret r11,r11 I 7 #endif E 7 inf: move r0,2 ;to print I 7 #ifdef ARGSINREGS laddr r1,infmess,L laddr r2,inflen call LINK,_write,L #else E 7 store r0,r14,arg1 laddr r5,infmess,L store r5,r14,arg2 ;gives write the message laddr r0,inflen store r0,r14,arg3 ;gives write the length of message call r11,_write,L I 7 #endif E 7 br err_rtn E 1 h10165 s 00002/00000/01042 d D 4.3 87/04/16 13:56:25 mth 8 7 c Profiling changes e s 00231/00030/00811 d D 4.2 87/02/16 17:09:44 mth 7 6 c Parameters in registers. e s 00000/00000/00841 d D 4.1 87/02/16 16:58:17 mth 6 5 c rolled rev to -r4 (mth) e s 00006/00006/00835 d D 3.3 87/01/31 13:28:14 mkm 5 4 c correct compatability probs between ROS and SPIX as. -mkm e s 00000/00000/00841 d D 3.2 87/01/31 11:54:25 mkm 4 3 c from ROS sources as of this date. -mkm e s 00000/00000/00841 d D 3.1 87/01/21 17:46:33 mkm 3 2 c e s 00000/00000/00841 d D 2.1 87/01/21 17:43:54 mkm 2 1 c e s 00841/00000/00000 d D 1.1 87/01/21 17:42:01 mkm 1 0 c Placed under source control - mkm c These files are direct descendants of the ROS files c by the same name at or about ROS rev 5.1 e u U f b f n t T I 1 ; "%W% %G%" dsect data ;FOR D_LOG() name byte 'pow',0 ;name of routine D 5 emess0 byte 'pow: SING error\n",0 ;error message if arg=0 E 5 I 5 emess0 byte 'pow: SING error\n',0 ;error message if arg=0 E 5 mess0len equ 16 ;length of emess0 D 5 emess2 byte 'pow: DOMAIN error\n",0 ;error message of arg<0 E 5 I 5 emess2 byte 'pow: DOMAIN error\n',0 ;error message of arg<0 E 5 mess2len equ 18 D 5 nanmess byte 'pow: input value was NAN\n",0 ;error message if nan E 5 I 5 nanmess byte 'pow: input value was NAN\n',0 ;error message if nan E 5 nanlen equ 25 D 5 infmess byte 'pow: input value was INF\n",0 ;error message if "infinity" E 5 I 5 infmess byte 'pow: input value was INF\n',0 ;error message if "infinity" E 5 inflen equ 25 csect code align 2 externd _errno external _write external _matherr e_type equ -32 ;exception type e_name equ -28 ;name of routine in error e_arg1 equ -24 ;argument 1 e_arg2 equ -16 ;argument 2 (if present) e_retval equ -8 ;room for exception block e_size equ -80 ; plus stack frame with 3 parameters I 7 #ifdef ARGSINREGS pe_size equ 80 ; positive e_size #else pe_size equ 0 ; positive e_size #endif E 7 DOMAIN equ 1 SING equ 2 OVERFLOW equ 3 UNDERFLOW equ 4 TLOSS equ 5 PLOSS equ 6 EDOM equ 33 ERANGE equ 34 C1P1 equ 0bfe9441ah C1P2 equ 0d8397d8dh ;equals -0.789563581765763543 C2P1 equ 040106261h C2P2 equ 008295419h ;equals 4.096073272249690401 C3P1 equ 0c0100820h C3P2 equ 0e2d5ca65h ;equals -4.007937950419181027 C4P1 equ 0c021d592h C4P2 equ 065a42680h ;equals -8.917132545745744675 C5P1 equ 0403380a4h C5P2 equ 05f65aad1h ;equals 19.502508127518754879 C6P1 equ 0c0280c31h C6P2 equ 05440afa8h ;equals -12.023813851257571257 LOG2U equ 03fe62e42h LOG2L equ 0fefa39efh ;equals 0.693147180559945309 LIMITU equ 03ff6a09dh LIMITL equ 0cf893fafh ;equals 1.414213 MASK equ 0800fffffh ;to mask off exponent MASK2 equ 0000007ffh ;to mask off mant and sign EXP0 equ 03ff00000h ;gives the exponent value of 0 EBIAS equ 0000003ffh ;equals 1023 (the bias) ONE equ 03ff00000h ;equals 1 (with the ZEROS) ZEROS equ 000000000h ;zeros for 1 and 2 TWO equ 040000000h ;equals 2 (with the ZEROS) dsect data ;FOR D_EXP() namexp byte 'pow',0 ;name of routine ;no messages printed D 5 nanmess2 byte 'pow: input value was NAN\n",0 ;error message if nan E 5 I 5 nanmess2 byte 'pow: input value was NAN\n',0 ;error message if nan E 5 nanlen2 equ 25 D 5 infmess2 byte 'pow: input value was INF\n",0 ;error message if "infinity" E 5 I 5 infmess2 byte 'pow: input value was INF\n',0 ;error message if "infinity" E 5 inflen2 equ 25 csect code P0P1 equ 04097a774h P0P2 equ 0e9c773d2h ;equals 1513.86417304653562 P1P1 equ 0403433a2h P1P2 equ 09c957777h ;equals 20.20170000695313 P2P1 equ 03f97a609h P2P2 equ 0aa5cd009h ;equals 0.02309432127295 Q0P1 equ 040b11016h Q0P2 equ 0b314dfb0h ;equals 4368.08867006741699 Q1P1 equ 0406d25b4h Q1P2 equ 013b3ffdah ;equals 233.177823205143104 LOG2U1 equ 1073157447 LOG2U2 equ 1073741824 ;equals 1.44269490242004395 LOG2L1 equ 03e8295c1h LOG2L2 equ 07f0bbbe8h ;equals 1.384689194620474 ABS equ 07fffffffh ;to find abs(arg) LIMIT1U equ 040863000h LIMIT1L equ 000000000h ;equals 710 arg3 equ 40 arg2 equ 32 arg1 equ 24 arg_1 equ -96 ;large negative values for storing are arg_2 equ -104 ; to avoid eradication of storage arg_3 equ -112 ; values by the error routines. arg_4 equ -120 ; ; _pow_dd.s ; global _pow ;cc, rc and rp global _Pow_dd ;rf global _pow_dd ;f77 _pow: _Pow_dd: I 8 ; MCOUNT E 8 I 7 #ifndef ARGSINREGS E 7 loadd r0,r14,arg1 loadd r2,r14,arg2 I 7 #endif E 7 br okay _pow_dd: I 8 ; MCOUNT E 8 I 7 #ifdef ARGSINREGS loadd r2,r1 loadd r0,r0 #else E 7 load r0,r14,arg1 loadd r0,r0,0 load r2,r14,arg2 loadd r2,r2,0 I 7 #endif E 7 okay: D 7 E 7 I 7 #ifdef ARGSINREGS store r7,STKPTR,arg_1 stored r8,STKPTR,arg_2 stored r10,STKPTR,arg_3 stored r12,STKPTR,arg_4 ;store r7-r13 for use as variables #else E 7 stored r6,r14,arg_1 stored r8,r14,arg_2 stored r10,r14,arg_3 stored r12,r14,arg_4 ;store r6-r13 for use as variables I 7 #endif E 7 move r13,0 ;don't negate result move r11,r2 move r12,r3 ;get exponent out of the way for now D 7 E 7 dlog: br r0>0,GoodBase! br r0=0,ZeroOrBad ; ; base is < 0. power must be integer for input to be acceptable. ; dfixt r2,r2 dfloat r4,r2 br r4<>r11,ZeroOrBad ;if power not integral, goto ZeroOrBad br r5<>r12,ZeroOrBad ; ; base is < 0. if power is odd, must negate result. ; move r3,1 and r2,r3 br r2=0,DontNegate laddr r13,080000000h,L ;negate the result DontNegate: laddr r2,07fffffffh,L and r0,r2 ;base = abs(base) GoodBase: laddr r2,07ff00000h,L br r0>=r2,nanorinf ;if arg=inf or nan then nanorinf dunp: ;rp0=mant only="x" r2=unbiased exp="n" move r2,r0 csl r2,12 ;makes the exponent of arg an integer laddr r3,MASK2,L and r2,r3 ;masks off mant of arg laddr r3,EBIAS,L sub r2,r3 ;unbiases exponent laddr r3,MASK,L and r0,r3 ;masks off exponent of arg laddr r3,EXP0,L or r0,r3 ;gives rp0 exponent of 0 (so can do arth w/it) laddr r3,LIMITU,L laddr r4,LIMITL,L drcomp r3,r0 br r3<0,lessthan ;"if (x>1.414213) then" go to lessthan laddr r3,ONE,L laddr r4,ZEROS,L dradd r3,r0 ;"(x+1)" laddr r5,ONE,L laddr r6,ZEROS,L drsub r0,r5 ;"(x-1)" drdiv r0,r3 ;rp0="z=(x-1)/(x+1)" contlog: move r3,r0 move r4,r1 drmpy r3,r3 ;rp3="zsq=z*z" laddr r5,C1P1,L laddr r6,C1P2,L ;C1 drmpy r5,r3 ;"(C1)*zsq" laddr r7,C2P1,L laddr r8,C2P2,L ;C2 dradd r5,r7 ;"((C1)*zsq+C2)" drmpy r5,r3 ;"...*zsq" laddr r7,C3P1,L laddr r8,C3P2,L ;C3 dradd r5,r7 ;"...+C3" drmpy r5,r3 ;"...*zsq" drmpy r5,r0 ;"...*z" = numerator laddr r7,C4P1,L laddr r8,C4P2,L ;C4 dradd r7,r3 ;"(zsq+C4)" drmpy r7,r3 ;"(zsq+C4)*zsq" laddr r9,C5P1,L laddr r10,C5P2,L ;C5 dradd r7,r9 ;"...+C5" drmpy r7,r3 ;"...*zsq" laddr r9,C6P1,L laddr r10,C6P2,L ;C6 dradd r7,r9 ;"...+C6" = denominator drdiv r5,r7 ;".../..." dradd r0,r5 ;"z+..." laddr r4,TWO,L laddr r5,ZEROS,L drmpy r0,r4 ;"2*..." dfloat r2,r2 laddr r4,LOG2U,L laddr r5,LOG2L,L drmpy r2,r4 ;"(n*log2)" dradd r0,r2 ;"...+..." = all of it br cont ;continue with d_upd function lessthan: laddr r3,TWO,L laddr r4,ZEROS,L dradd r3,r0 ;"(x+2)" laddr r5,TWO,L laddr r6,ZEROS,L drsub r0,r5 ;"(x-2)" drdiv r0,r3 ;rp0="z=(x-2)/(x+2)" add r2,1 ;r2="n=n+1" br contlog ZeroOrBad: ; ; The only acceptable input if we come here is 0 ** positive number ; in which case we retutn 0.0. Otherwise return domain error. ; br r0<0,domain_error ;if base < 0 goto domain_error br r2<=0,domain_error ;if power <= 0 goto domain_error I 7 #ifdef ARGSINREGS load r7,STKPTR,arg_1 ; else restore regs loadd r8,STKPTR,arg_2 ; ... loadd r10,STKPTR,arg_3 ; ... loadd r12,STKPTR,arg_4 ; ... ret LINK,LINK ; and return 0.0 #else E 7 loadd r6,r14,arg_1 ; else restore regs loadd r8,r14,arg_2 ; ... loadd r10,r14,arg_3 ; ... loadd r12,r14,arg_4 ; ... ret r11,r11 ; and return 0.0 I 7 #endif E 7 ; ; error handling ; domain_error: struct: ;loads values into error structure in case user ;wishes to do more with them than we have done D 7 E 7 I 7 #ifdef ARGSINREGS store LINK,STKPTR,0 ;save old return laddr STKPTR,STKPTR,e_size ;update stack #else E 7 store r11,r14,0 ;save old return store r15,r14,8 ;save old frame pointer move r15,r14 laddr r14,r14,e_size ;update stack I 7 #endif E 7 D 7 stored r0,r15,e_arg1 ;load arg's value into error structure E 7 I 7 stored r0,STKPTR,pe_size+e_arg1 ;load arg's value into error structure E 7 laddr r2,name,L ;name of offending routine D 7 store r2,r15,e_name ; into error structure E 7 I 7 store r2,STKPTR,pe_size+e_name ; into error structure E 7 move r3,DOMAIN ;exception type D 7 store r3,r15,e_type E 7 I 7 store r3,STKPTR,pe_size+e_type E 7 laddr r0,0fff00000h,L move r1,0 D 7 stored r0,r15,e_retval ;return -inf E 7 I 7 stored r0,STKPTR,pe_size+e_retval ;return -inf E 7 I 7 #ifdef ARGSINREGS laddr r0,STKPTR,pe_size+e_type ;user want to do different anything with error? call LINK,_matherr,L ;matherr is a function for user to define #else E 7 laddr r4,r15,e_type ;user want to do different anything with error? store r4,r14,arg1 ;gives matherr the address of error structure call r11,_matherr,L ;matherr is a function for user to define I 7 #endif E 7 br r0<>0,err_rtn ;yes (assume user will change r0 if yes ) mess2: ;prints out our error message move r0,2 I 7 #ifdef ARGSINREGS laddr r1,emess2,L laddr r2,mess2len call LINK,_write,L ;writes out message #else E 7 store r0,r14,arg1 laddr r5,emess2,L store r5,r14,arg2 ;gives message laddr r0,mess2len store r0,r14,arg3 ;gives length of message call r11,_write,L ;writes out message I 7 #endif E 7 laddr r0,EDOM ;sets global variable _errno for user store r0,_errno,L err_rtn: ;resets all old pointers and returns -infinity I 7 #ifdef ARGSINREGS laddr STKPTR,STKPTR,pe_size ;user will have already used matherr for himself load LINK,STKPTR,0 #else E 7 move r14,r15 ;user will have already used matherr for himself load r15,r14,8 load r11,r14,0 I 7 #endif E 7 laddr r0,0fff00000h,L move r1,0 ;to return -inf D 7 E 7 I 7 #ifdef ARGSINREGS load r7,STKPTR,arg_1 loadd r8,STKPTR,arg_2 loadd r10,STKPTR,arg_3 loadd r12,STKPTR,arg_4 ;restore all saved registers ret LINK,LINK #else E 7 loadd r6,r14,arg_1 loadd r8,r14,arg_2 loadd r10,r14,arg_3 loadd r12,r14,arg_4 ;restore all saved registers ret r11,r11 I 7 #endif E 7 zero: ;loads values into error structure in case user D 7 ;wishes to do more with them than we have done E 7 I 7 #ifdef ARGSINREGS ;wishes to do more with them than we have done store LINK,STKPTR,0 ;save old return laddr STKPTR,STKPTR,e_size ;update stack #else E 7 store r11,r14,0 ;save old return store r15,r14,8 ;save old frame pointer move r15,r14 laddr r14,r14,e_size ;update stack D 7 stored r0,r15,e_arg1 ;load arg's value into error structure E 7 I 7 #endif stored r0,STKPTR,pe_size+e_arg1 ;load arg's value into error structure E 7 laddr r2,name,L ;name of offending routine D 7 store r2,r15,e_name ; into error structure E 7 I 7 store r2,STKPTR,pe_size+e_name ; into error structure E 7 move r3,SING ;exception type D 7 store r3,r15,e_type E 7 I 7 store r3,STKPTR,pe_size+e_type E 7 laddr r0,0fff00000h,L move r1,0 D 7 stored r0,r15,e_retval ;return -infinity E 7 I 7 stored r0,STKPTR,pe_size+e_retval ;return -infinity E 7 I 7 #ifdef ARGSINREGS laddr r0,STKPTR,pe_size+e_type ;user want to do different anything with error? call LINK,_matherr,L ;matherr is a function for user to define #else E 7 laddr r4,r15,e_type ;user want to do different anything with error? store r4,r14,arg1 ;gives matherr the address of error structure call r11,_matherr,L ;matherr is a function for user to define I 7 #endif E 7 br r0<>0,err_rtn ;yes (assume user will change r0 if yes ) mess0: ;prints out our error message move r0,2 I 7 #ifdef ARGSINREGS laddr r1,emess0,L laddr r2,mess0len call LINK,_write,L ;writes out message #else E 7 store r0,r14,arg1 laddr r5,emess0,L store r5,r14,arg2 ;gives message laddr r0,mess0len store r0,r14,arg3 ;gives length of message call r11,_write,L ;writes out message I 7 #endif E 7 laddr r0,EDOM ;sets global variable _errno for user store r0,_errno,L br err_rtn nanorinf: br r0>r2,nan move r3,0 br r1>r3,nan ;if arg>inf then nan inf: ;writes message and returns inf I 7 #ifdef ARGSINREGS store LINK,STKPTR,0 ;save old return laddr STKPTR,STKPTR,e_size ;update stack #else E 7 store r11,r14,0 ;save old return store r15,r14,8 ;save old frame pointer move r15,r14 laddr r14,r14,e_size ;update stack I 7 #endif E 7 move r0,2 ;to print I 7 #ifdef ARGSINREGS laddr r1,infmess,L laddr r2,inflen call LINK,_write,L #else E 7 store r0,r14,arg1 laddr r5,infmess,L store r5,r14,arg2 ;gives write the message laddr r0,inflen store r0,r14,arg3 ;gives write the length of message call r11,_write,L I 7 #endif E 7 I 7 #ifdef ARGSINREGS laddr STKPTR,STKPTR,pe_size load LINK,STKPTR,0 #else E 7 move r14,r15 ;re-updates the stack load r15,r14,8 ;resets old frame pointer load r11,r14,0 ;resets old return I 7 #endif E 7 laddr r0,07ff00000h,L move r1,0 ;returns inf I 7 #ifdef ARGSINREGS load r7,STKPTR,arg_1 loadd r8,STKPTR,arg_2 loadd r10,STKPTR,arg_3 loadd r12,STKPTR,arg_4 ;restore all saved registers ret LINK,LINK #else E 7 loadd r6,r14,arg_1 loadd r8,r14,arg_2 loadd r10,r14,arg_3 loadd r12,r14,arg_4 ;restore all saved registers ret r11,r11 I 7 #endif E 7 nan: ;writes message and returns the nan arg I 7 #ifdef ARGSINREGS store LINK,STKPTR,0 ;save old return laddr STKPTR,STKPTR,e_size ;update stack stored r0,STKPTR,arg_1 ;save arg #else E 7 store r11,r14,0 ;save old return store r15,r14,8 ;save old frame pointer move r15,r14 laddr r14,r14,e_size ;update stack D 7 E 7 stored r0,r14,arg_1 ;save arg I 7 #endif E 7 move r0,2 ;to print I 7 #ifdef ARGSINREGS laddr r1,nanmess,L laddr r2,nanlen call LINK,_write,L loadd r0,STKPTR,arg_1 ;restore arg to rp0 laddr STKPTR,STKPTR,pe_size ;re-update stack load LINK,STKPTR,0 ;resets old return load r7,STKPTR,arg_1 loadd r8,STKPTR,arg_2 loadd r10,STKPTR,arg_3 loadd r12,STKPTR,arg_4 ;restore all saved registers ret LINK,LINK #else E 7 store r0,r14,arg1 laddr r5,nanmess,L store r5,r14,arg2 ;gives write the message laddr r0,nanlen store r0,r14,arg3 ;gives write the length of message call r11,_write,L loadd r0,r14,arg_1 ;restore arg to rp0 move r14,r15 ;re-update stack load r15,r14,8 ;resets old frame pointer load r11,r14,0 ;resets old return loadd r6,r14,arg_1 loadd r8,r14,arg_2 loadd r10,r14,arg_3 loadd r12,r14,arg_4 ;restore all saved registers ret r11,r11 I 7 #endif E 7 ;;;; cont: ;have now calculated "%_dlog(dbase)" ;;;; drmpy r0,r11 ;rp0="prd = de * %d_log(db)" D 7 E 7 dexp: dck2: move r2,r0 ;to save sign bit laddr r3,ABS,L and r0,r3 ;to find abs(arg) laddr r3,LIMIT1U,L laddr r4,LIMIT1L,L drcomp r3,r0 br r3<0,toobig ;if abs(arg)>710 then go to toobig move r0,r2 ;restore original sign of arg eere: makedr r4,r0 ;"sngl_temp=arg" makerd r4,r4 ;"upper=sngl_temp" move r2,r0 move r3,r1 drsub r2,r4 ;"lower=arg-upper" laddr r6,LOG2U1,L laddr r7,LOG2U2,L ;LOG2U drmpy r4,r6 ;rp4="x=upper*log2_u.d" dfixr r6,r4 ;r6=mult="longmult=%i_idnint(x)" dfloat r7,r6 ;makes "longmult" a double so can use drsub drsub r4,r7 ;rp5="(x-longmult)" laddr r7,LOG2U1,L laddr r8,LOG2U2,L ;LOG2U drmpy r2,r7 ;rp2="(lower*log2_u.d" laddr r7,LOG2L1,L laddr r8,LOG2L2,L ;LOG2L drmpy r0,r7 ;rp0="arg*log2_l)" dradd r0,r2 ;rp0="(lower*log2_u.d + arg*log2_l)" dradd r4,r0 ;rp4="x=...+..." move r2,r4 move r3,r5 drmpy r2,r2 ;rp2="xsq=x*x" laddr r0,P2P1,L laddr r1,P2P2,L ;P2 drmpy r0,r2 ;"xsq*p2)" laddr r7,P1P1,L laddr r8,P1P2,L ;P1 dradd r0,r7 ;"(p1+...)" drmpy r0,r2 ;"xsq*(...)" laddr r7,P0P1,L laddr r8,P0P2,L ;P0 dradd r0,r7 ;"(p0+...)" drmpy r0,r4 ;rp0="p=x*(p0+xsq*(p1+xsq*p2))" laddr r4,Q1P1,L laddr r5,Q1P2,L ;Q1 dradd r4,r2 ;"(q1+xsq)" drmpy r2,r4 ;"xsq*(..)" laddr r4,Q0P1,L laddr r5,Q0P2,L ;Q0 dradd r2,r4 ;rp2="q=q0+xsq*(q1+xsq)" dpck: drsub r2,r0 ;"(q-p)" drdiv r0,r2 ;"p/(q-p)" laddr r2,03fe00000h,L move r3,0 ;rp3=.5 dradd r0,r2 ;".5+..." add r6,1 ;"mult=mult+1" move r2,r0 move r3,12 ;to make csl faster csl r2,r3 ;to place exponent on loworder side of r8 laddr r3,0000007ffh,L ;to mask and r2,r3 ; off exponent add r2,r6 ;r2="u.exp=u.exp+power2" ;10/25/85 hlf. if the new exponent in r2 is negative or larger than 11 bits ;we need to use a longer algorithm to put the number back together again ;mr#1172 br r2<0,special br r2>=r3,special laddr r3,0800fffffh,L and r0,r3 ;to clear r5 of its exponent laddr r3,20 csl r2,r3 ;to replace the exponent in its proper position or r0,r2 ;to give rp5 back its expon + mult-rp5="temp" or r0,r13 ;negate result if necessary I 7 #ifdef ARGSINREGS load r7,STKPTR,arg_1 loadd r8,STKPTR,arg_2 loadd r10,STKPTR,arg_3 loadd r12,STKPTR,arg_4 ;restore all saved registers ret LINK,LINK #else E 7 loadd r6,r14,arg_1 loadd r8,r14,arg_2 loadd r10,r14,arg_3 loadd r12,r14,arg_4 ;restore all saved registers ret r11,r11 I 7 #endif E 7 ;special special: ;10/25/85 hlf. Here we carefully unpack the number into its parts. Then add ;mult to the exp. Then carefully repack the number and return ;mr#1172 ; pd_unpk incoming arg is a real in r0,r1 ; returns r0 upper part of mantissa with hidden bit set ; r1 lower part of mantissa ; r2 exponent in integer form ; r3 sign bit ; r4 type ( 1=arg is zero,2=arg is a gu(what?),3=arg is ordinary, ; 4=arg is inf,5=arg is nan) _pd_unpk: laddr r3,080000000h,L ;mask for sign bit and r3,r0 ;sign bit xor r0,r3 ;remove sign bit laddr r2,07ff00000h,L ;mask for exp and r2,r0 ;r2 has exp in high part xor r0,r2 ;r0 has mantissa only csl r2,12 ;r2 has exp in integer form br r2=0,zero_or_gu laddr r5,0000007ffh,L ;value of exp if arg is inf or nan br r2=r5,inf_or_nan laddr r5,000100000h,L ;20th(hidden) bit set or r0,r5 ;r0 now has high part of mantissa and ;hidden bit set sub r2,1 ;exp = exp -1 ;10/25/85 hlf. we assume for now that all numbers will be legal and bad ones ; weeded out before this. Don't bother with setting type ; move r4,3 ;set type = regular number contunpk: laddr r5,0432h,L ;magic number 1022+52 = 1074 = 0x432 sub r2,r5 doneunpk: br doadd ;finished with unpacking zero_or_gu: ;10/25/85 hlf. See above. Skip setting type ; move r5,r1 ;get lower part of mantissa ; or r5,r0 ;will be zero iff all of mantissa is 0 ; br r5=0,zero ; ; move r4,2 ;set type= gu (whatever that is) ; br contunpk ;zero: ; move r4,1 ;set type= zero br contunpk inf_or_nan: laddr r2,06000h,L ;?????????????????? ;10/25/85 hlf. See above. Skip setting type ; move r5,r1 ;get lower part of mantissa ; or r5,r0 ;will be zero iff all of mantissa is 0 ; br r5=0,inf ; ; move r4,5 ;set type= nan ; br doneunpk ;inf: ; move r4,4 ;set type= inf ; br doneunpk doadd: add r2,r6 ;r2="u.exp=u.exp+power2" ; pd_pack incoming args are ; r0 upper part of mantissa with hidden bit set ; r1 lower part of mantissa ; r2 exponent in integer form ; r3 sign bit ; r4 type ( 1=arg is zero,2=arg is a gu(what?),3=arg is ordinary, ; 4=arg is inf,5=arg is nan) ; returns a real in r0,r1 _pd_pack: ;10/25/85 hlf. comment out all inf or nan handling for now. We assume we really ;won't get any inf's or nan's at this point. They should have been weeded out ;before. But just in case..... Also, the handling should produce a message ;not an inf or nan by itself. ; br r4<4,regular ; ;inf_or_nan: ; ; wipe out the upper mantissa here. Presumably, it will be non-zero ; ; for a nan and zero if an infinity. But, if the only bits in the ; ; mantissa were in the upper half word of r1 they will be wiped ; ; out when the exp is or'd in. A bug?? ; or r0,r1 ;wipe out upper mantissa(why??) ; ; laddr r5,07ff00000h,L ;exp of nan or inf ; or r0,r5 ;it's a nan or inf now ; or r0,r3 ;signed now ; br donepack regular: laddr r5,043eh,L ;magic number 1022+52+12 = 1086 = 0x43e add r2,r5 normalize: br r0<>0,norm1 ;what about hidden bit? ;upper is a zero laddr r5,32 br r2=32 sub r2,r5 ;we know r0 is 0, so to speed things move r0,r1 ;up, we exchange r0 and r1, and move r1,0 ;subtract 32 from the exp. This ;keeps us from looping 32 needless times br r0<>0,norm1 ;upper=0,lower=0 laddr r2,-2222 ;exp=0 for zero. (what does this mean?) br rcp norm1: ;upper non-zero or ;upper=0,lower<>0 br r0<0,rcp ;already normalized norm: ;The following shifts the registers r0,r1 as a pair to the left bit ; by bit. It is done at least once. This continues to loop decrementing ; the exp until one of these two conditions are met: ;1) exp becomes neg or ;2) a 1 is shifted into the sign bit of r0 dlsl r0,1 ;shift once br r0<0,next ;normalized sub r2,1 ;one less in exp br r2>=0,norm ;no more exp, can not continue ;This makes sure to dec exp once. but only if number fully ;normalized next: br r0>=0,rcp sub r2,1 rcp: ;round,check,and pack br r2>0,drcpok ;exp is neg:denormalize before round laddr r5,-53 ;magic number br r2=0,denorm move r2,0 drcpok: ;round it now move r4,r0 ;move r0 to temp, eadd wipes out r0 laddr r5,0400h,L ;adding this crudely rounds the number eadd r1,r5 br r0>=0,drcp0 ;had no carry move r0,1 ;the carry to add to higher word eadd r4,r0 ;keep in temp, r0 wiped out by eadd br r0>=0,drcp0 move r0,r4 ;restore mantissa dlsr r0,1 ;found a carry, denormalize one bit laddr r5,080000000h,L ;mask to replace carry or r0,r5 ;put in carry add r2,1 ;compensate in exp br drcp1 drcp0: move r0,r4 ;restore mantissa drcp1: move r0,r4 ;replace r0 from temp location laddr r5,0000007ffh,L br r2=r5,drcpbig usel: ;rebuild number br r0<0,dra ;hidden bit is there br r2=r5,dra ;is inf or nan move r2,0 ;no exp dra: laddr r5,07fffffffh,L ;mask for hidden bit and r0,r5 ;get rid of hidden bit move r5,11 ;bits to move to make room for exp ;hidden bit masked off already dlsr r0,r5 ;move only 11 not 12 for exp laddr r5,20 csl r2,r5 ;move exp back into position or r0,r2 ;has exp or r0,r3 ;has sign br donepack signedo: ;set to zero move r0,0 move r1,0 or r0,r3 ;has sign br donepack drcpbig: laddr r0,07ff00000h,L ;infinity move r1,0 or r0,r3 ;has sign donepack: or r0,r13 ;negate result if necessary I 7 #ifdef ARGSINREGS load r7,STKPTR,arg_1 loadd r8,STKPTR,arg_2 loadd r10,STKPTR,arg_3 loadd r12,STKPTR,arg_4 ;restore all saved registers ret LINK,LINK #else E 7 loadd r6,r14,arg_1 loadd r8,r14,arg_2 loadd r10,r14,arg_3 loadd r12,r14,arg_4 ;restore all saved registers ret r11,r11 I 7 #endif E 7 ;10/25/85 hlf. end special ; ; error handling ; toobig: ;sends program to neg or positvie laddr r3,080000000h,L and r2,r3 ;to get sign of arg alone br r2=0,positive ;if arg is positive then go to positive else ... neg: ;returns 0 after loading error structure for ;possible alternative error processing by user ;doesn't print any message unless -nan or -inf laddr r4,07ff00000h,L move r5,0 ;rp5="infinity" drcomp r4,r0 struct1: ;loads values into error structure I 7 #ifdef ARGSINREGS store LINK,STKPTR,0 ;save old return laddr STKPTR,STKPTR,e_size ;update stack store r4,STKPTR,arg_1 ;saves r4's value (ie whether or not it's inf) #else E 7 store r11,r14,0 ;save old return store r15,r14,8 ;save old frame pointer move r15,r14 laddr r14,r14,e_size ;update stack D 7 E 7 store r4,r14,arg_1 ;saves r4's value (ie whether or not it's inf) I 7 #endif E 7 D 7 stored r0,r15,e_arg1 ;load arg's value into error structure E 7 I 7 stored r0,STKPTR,pe_size+e_arg1 ;load arg's value into error structure E 7 laddr r2,namexp,L ;name of offending routine D 7 store r2,r15,e_name ; into error structure E 7 I 7 store r2,STKPTR,pe_size+e_name ; into error structure E 7 move r3,UNDERFLOW ;exception type D 7 store r3,r15,e_type E 7 I 7 store r3,STKPTR,pe_size+e_type E 7 move r0,0 move r1,0 D 7 stored r0,r15,e_retval ;return 0 E 7 I 7 stored r0,STKPTR,pe_size+e_retval ;return 0 E 7 I 7 #ifdef ARGSINREGS laddr r0,STKPTR,pe_size+e_type ;user want to do different anything with error? call LINK,_matherr,L ;matherr is a function for user to define #else E 7 laddr r4,r15,e_type ;user want to do different anything with error? store r4,r14,arg1 ;gives matherr the address of error structure call r11,_matherr,L ;matherr is a function for user to define I 7 #endif E 7 br r0<>0,err_rtn1 ;yes (assume user will change r0 if yes ) laddr r0,ERANGE ;sets global variable _errno for user store r0,_errno,L D 7 E 7 I 7 #ifdef ARGSINREGS load r4,STKPTR,arg_1 ;restore r4's old value (if inf or not) #else E 7 load r4,r14,arg_1 ;restore r4's old value (if inf or not) I 7 #endif E 7 br r4=0,inf1 ;if abs(arg)="infinity" then go to inf br r4<0,nan1 ;if abs(arg) is not-a-number then go to nan err_rtn1: ;resets all old pointers and returns 0 I 7 #ifdef ARGSINREGS laddr STKPTR,STKPTR,pe_size ;user will have already used matherr for himself load LINK,STKPTR,0 #else E 7 move r14,r15 ;user will have already used matherr for himself load r15,r14,8 load r11,r14,0 I 7 #endif E 7 move r0,0 move r1,0 ;returns 0 D 7 E 7 I 7 #ifdef ARGSINREGS load r7,STKPTR,arg_1 loadd r8,STKPTR,arg_2 loadd r10,STKPTR,arg_3 loadd r12,STKPTR,arg_4 ;restore all saved registers ret LINK,LINK #else E 7 loadd r6,r14,arg_1 loadd r8,r14,arg_2 loadd r10,r14,arg_3 loadd r12,r14,arg_4 ;restore all saved registers ret r11,r11 I 7 #endif E 7 inf1: move r0,2 ;to print I 7 #ifdef ARGSINREGS laddr r1,infmess2,L laddr r2,inflen2 call LINK,_write,L #else E 7 store r0,r14,arg1 laddr r5,infmess2,L store r5,r14,arg2 ;gives write the message laddr r0,inflen2 store r0,r14,arg3 ;gives write the length of message call r11,_write,L I 7 #endif E 7 br err_rtn1 nan1: move r0,2 ;to print I 7 #ifdef ARGSINREGS laddr r1,nanmess2,L laddr r2,nanlen2 call LINK,_write,L #else E 7 store r0,r14,arg1 laddr r5,nanmess2,L store r5,r14,arg2 ;gives write the message laddr r0,nanlen2 store r0,r14,arg3 ;gives write the length of message call r11,_write,L I 7 #endif E 7 br err_rtn1 positive: ;returns inf after loading error structure for ;possible alternative error processing by user ;doesn't print any message unless nan or nan laddr r4,07ff00000h,L move r5,0 ;rp5="infinity" drcomp r4,r0 struct2: ;loads values into error structure I 7 #ifdef ARGSINREGS store LINK,STKPTR,0 ;save old return laddr STKPTR,STKPTR,e_size ;update stack store r4,STKPTR,arg_1 ;saves r4's value (ie whether or not it's inf) #else E 7 store r11,r14,0 ;save old return store r15,r14,8 ;save old frame pointer move r15,r14 laddr r14,r14,e_size ;update stack D 7 E 7 store r4,r14,arg_1 ;saves r4's value (ie whether or not it's inf) I 7 #endif E 7 D 7 stored r0,r15,e_arg1 ;load arg's value into error structure E 7 I 7 stored r0,STKPTR,pe_size+e_arg1 ;load arg's value into error structure E 7 laddr r2,namexp,L ;name of offending routine D 7 store r2,r15,e_name ; into error structure E 7 I 7 store r2,STKPTR,pe_size+e_name ; into error structure E 7 move r3,OVERFLOW ;exception type D 7 store r3,r15,e_type E 7 I 7 store r3,STKPTR,pe_size+e_type E 7 laddr r0,07ff00000h,L move r1,0 D 7 stored r0,r15,e_retval ;return inf E 7 I 7 stored r0,STKPTR,pe_size+e_retval ;return inf E 7 I 7 #ifdef ARGSINREGS laddr r0,STKPTR,pe_size+e_type ;user want to do different anything with error? call LINK,_matherr,L ;matherr is a function for user to define #else E 7 laddr r4,r15,e_type ;user want to do different anything with error? store r4,r14,arg1 ;gives matherr the address of error structure call r11,_matherr,L ;matherr is a function for user to define I 7 #endif E 7 br r0<>0,err_rtn2 ;yes (assume user will change r0 if yes ) laddr r0,ERANGE ;sets global variable _errno for user store r0,_errno,L D 7 load r4,r14,arg_1 ;restore r4's old value (if inf or not) E 7 I 7 load r4,STKPTR,arg_1 ;restore r4's old value (if inf or not) E 7 br r4=0,inf2 ;if abs(arg)="infinity" then go to inf br r4<0,nan2 ;if abs(arg) is not-a-number then go to nan err_rtn2: ;resets all old pointers and returns inf I 7 #ifdef ARGSINREGS laddr STKPTR,STKPTR,pe_size ;user will have already used matherr for himself load LINK,STKPTR,0 #else E 7 move r14,r15 ;user will have already used matherr for himself load r15,r14,8 load r11,r14,0 I 7 #endif E 7 laddr r0,07ff00000h,L move r1,0 ;returns inf D 7 E 7 I 7 #ifdef ARGSINREGS load r7,STKPTR,arg_1 loadd r8,STKPTR,arg_2 loadd r10,STKPTR,arg_3 loadd r12,STKPTR,arg_4 ;restores all saved registers ret LINK,LINK #else E 7 loadd r6,r14,arg_1 loadd r8,r14,arg_2 loadd r10,r14,arg_3 loadd r12,r14,arg_4 ;restores all saved registers ret r11,r11 I 7 #endif E 7 inf2: move r0,2 ;to print I 7 #ifdef ARGSINREGS laddr r1,infmess2,L laddr r2,inflen2 call LINK,_write,L #else E 7 store r0,r14,arg1 laddr r5,infmess2,L store r5,r14,arg2 ;gives write the message laddr r0,inflen2 store r0,r14,arg3 ;gives write the length of message call r11,_write,L I 7 #endif E 7 br err_rtn2 nan2: move r0,2 ;to print I 7 #ifdef ARGSINREGS laddr r1,nanmess2,L laddr r2,nanlen2 call LINK,_write,L #else E 7 store r0,r14,arg1 laddr r5,nanmess2,L store r5,r14,arg2 ;gives write the message laddr r0,nanlen2 store r0,r14,arg3 ;gives write the length of message call r11,_write,L I 7 #endif E 7 br err_rtn2 E 1 h57228 s 00001/00001/00101 d D 4.2 87/05/13 18:22:02 build 6 5 c removed old SCCS strings and inserted #ident BB e s 00000/00000/00102 d D 4.1 87/02/16 16:57:48 mth 5 4 c rolled rev to -r4 (mth) e s 00000/00000/00102 d D 3.2 87/01/31 11:43:46 mkm 4 3 c from ROS sources as of this date. -mkm e s 00000/00000/00102 d D 3.1 87/01/21 17:46:22 mkm 3 2 c e s 00000/00000/00102 d D 2.1 87/01/21 17:43:44 mkm 2 1 c e s 00102/00000/00000 d D 1.1 87/01/21 17:41:54 mkm 1 0 c Placed under source control - mkm c These files are direct descendants of the ROS files c by the same name at or about ROS rev 5.1 e u U f b f n t T I 1 D 6 /* "%W% %G%" */ E 6 I 6 #ident " %W% %E% " E 6 /*LINTLIBRARY*/ /* * erf returns the error function of its double-precision argument. * erfc(x) returns 1 - erf(x). * * erf(x) is defined by * ${2 over sqrt pi} int from 0 to x e sup {- t sup 2} dt$. * * The entry for erfc is provided because of the * extreme loss of relative accuracy if erf(x) is * called for large x and the result subtracted * from 1 (e.g. for x = 5, 12 places are lost). * * There are no error returns. * * Calls exp for |x| > 0.5. * * Coefficients for large x are #5667 from Hart & Cheney (18.72D). */ #include /* approx sqrt(log(MAXDOUBLE)) */ #define MAXVAL 26.6 #define DPOLYD(y, p, q) for (n = d = 0, i = sizeof(p)/sizeof(p[0]); --i >= 0; ) \ { n = n * y + p[i]; d = d * y + q[i]; } static double p1[] = { 0.804373630960840172832162e5, 0.740407142710151470082064e4, 0.301782788536507577809226e4, 0.380140318123903008244444e2, 0.143383842191748205576712e2, -.288805137207594084924010e0, 0.007547728033418631287834e0, }, q1[] = { 0.804373630960840172826266e5, 0.342165257924628539769006e5, 0.637960017324428279487120e4, 0.658070155459240506326937e3, 0.380190713951939403753468e2, 1.0, 0.0, }; static double p2[] = { 0.18263348842295112592168999e4, 0.28980293292167655611275846e4, 0.2320439590251635247384768711e4, 0.1143262070703886173606073338e4, 0.3685196154710010637133875746e3, 0.7708161730368428609781633646e2, 0.9675807882987265400604202961e1, 0.5641877825507397413087057563e0, 0.0, }, q2[] = { 0.18263348842295112595576438e4, 0.495882756472114071495438422e4, 0.60895424232724435504633068e4, 0.4429612803883682726711528526e4, 0.2094384367789539593790281779e4, 0.6617361207107653469211984771e3, 0.1371255960500622202878443578e3, 0.1714980943627607849376131193e2, 1.0, }; double erf(x) register double x; { int neg = 0; if (x < 0) { x = -x; neg++; } if (x > 0.5) x = 1 - erfc(x); else { register double n, d, xsq = x * x; register int i; DPOLYD(xsq, p1, q1); x *= M_2_SQRTPI * n/d; } return (neg ? -x : x); } double erfc(x) register double x; { register double n, d; register int i; if (x < 0.5) return (1 - erf(x)); if (x >= MAXVAL) /* exp(-x * x) sure to underflow */ return (0.0); DPOLYD(x, p2, q2); return (exp(-x * x) * n/d); } E 1 h55755 s 00001/00001/00011 d D 4.2 87/05/13 18:22:12 build 6 5 c removed old SCCS strings and inserted #ident BB e s 00000/00000/00012 d D 4.1 87/02/16 16:57:50 mth 5 4 c rolled rev to -r4 (mth) e s 00000/00000/00012 d D 3.2 87/01/31 11:43:48 mkm 4 3 c from ROS sources as of this date. -mkm e s 00000/00000/00012 d D 3.1 87/01/21 17:46:23 mkm 3 2 c e s 00000/00000/00012 d D 2.1 87/01/21 17:43:45 mkm 2 1 c e s 00012/00000/00000 d D 1.1 87/01/21 17:41:55 mkm 1 0 c Placed under source control - mkm c These files are direct descendants of the ROS files c by the same name at or about ROS rev 5.1 e u U f b f n t T I 1 D 6 /* "%W% %G%" */ E 6 I 6 #ident " %W% %E% " E 6 /*LINTLIBRARY*/ /* * fabs returns the absolute value of its double-precision argument. */ double fabs(x) register double x; { return (x < 0 ? -x : x); } E 1 h14400 s 00001/00001/00026 d D 4.2 87/05/13 18:22:24 build 6 5 c removed old SCCS strings and inserted #ident BB e s 00000/00000/00027 d D 4.1 87/02/16 16:57:52 mth 5 4 c rolled rev to -r4 (mth) e s 00000/00000/00027 d D 3.2 87/01/31 11:43:48 mkm 4 3 c from ROS sources as of this date. -mkm e s 00000/00000/00027 d D 3.1 87/01/21 17:46:23 mkm 3 2 c e s 00000/00000/00027 d D 2.1 87/01/21 17:43:45 mkm 2 1 c e s 00027/00000/00000 d D 1.1 87/01/21 17:41:55 mkm 1 0 c Placed under source control - mkm c These files are direct descendants of the ROS files c by the same name at or about ROS rev 5.1 e u U f b f n t T I 1 D 6 /* "%W% %G%" */ E 6 I 6 #ident " %W% %E% " E 6 /*LINTLIBRARY*/ /* * floor(x) returns the largest integer (as a double-precision number) * not greater than x. * ceil(x) returns the smallest integer not less than x. */ extern double modf(); double floor(x) double x; { double y; /* can't be in register because of modf() below */ return (modf(x, &y) < 0 ? y - 1 : y); } double ceil(x) double x; { double y; /* can't be in register because of modf() below */ return (modf(x, &y) > 0 ? y + 1 : y); } E 1 h28503 s 00001/00001/00028 d D 4.2 87/05/13 18:22:37 build 6 5 c removed old SCCS strings and inserted #ident BB e s 00000/00000/00029 d D 4.1 87/02/16 16:57:55 mth 5 4 c rolled rev to -r4 (mth) e s 00000/00000/00029 d D 3.2 87/01/31 11:43:50 mkm 4 3 c from ROS sources as of this date. -mkm e s 00000/00000/00029 d D 3.1 87/01/21 17:46:24 mkm 3 2 c e s 00000/00000/00029 d D 2.1 87/01/21 17:43:46 mkm 2 1 c e s 00029/00000/00000 d D 1.1 87/01/21 17:41:56 mkm 1 0 c Placed under source control - mkm c These files are direct descendants of the ROS files c by the same name at or about ROS rev 5.1 e u U f b f n t T I 1 D 6 /* "%W% %G%" */ E 6 I 6 #ident " %W% %E% " E 6 /*LINTLIBRARY*/ /* * fmod(x, y) returns the remainder of x on division by y, * with the same sign as x, * except that if |y| << |x|, it returns 0. */ #include double fmod(x, y) register double x, y; { double d; /* can't be in register because of modf() below */ /* * The next lines determine if |y| is negligible compared to |x|, * without dividing, and without adding values of the same sign. */ d = _ABS(x); if (d - _ABS(y) == d) return (0.0); #ifndef pdp11 /* pdp11 "cc" can't handle cast of double to void */ (void) #endif modf(x/y, &d); /* now it's safe to divide without overflow */ return (x - d * y); } E 1 h30531 s 00001/00001/00126 d D 4.2 87/05/13 18:26:35 build 6 5 c removed old SCCS strings and inserted #ident BB e s 00000/00000/00127 d D 4.1 87/02/16 16:57:57 mth 5 4 c rolled rev to -r4 (mth) e s 00000/00000/00127 d D 3.2 87/01/31 11:43:51 mkm 4 3 c from ROS sources as of this date. -mkm e s 00000/00000/00127 d D 3.1 87/01/21 17:46:25 mkm 3 2 c e s 00000/00000/00127 d D 2.1 87/01/21 17:43:47 mkm 2 1 c e s 00127/00000/00000 d D 1.1 87/01/21 17:41:56 mkm 1 0 c Placed under source control - mkm c These files are direct descendants of the ROS files c by the same name at or about ROS rev 5.1 e u U f b f n t T I 1 D 6 /* "%W% %G%" */ E 6 I 6 #ident " %W% %E% " E 6 /*LINTLIBRARY*/ /* * gamma returns the log of the absolute value of the gamma function * of its double-precision argument. * The sign of the gamma function is returned in the * external integer signgam. * Returns EDOM error and value HUGE if argument is non-negative integer. * Returns ERANGE error and value HUGE if the correct value would overflow. * * The coefficients for expansion around zero * are #5243 from Hart & Cheney; for expansion * around infinity they are #5404. * * Calls log and sin. */ #include #include #include #define X_MAX (3.0 * H_PREC) #define GOOBIE 0.9189385332046727417803297 int signgam; double gamma(x) register double x; { extern double pos_gamma(); struct exception exc; exc.type = 0; exc.name = "gamma"; exc.arg1 = x; exc.retval = HUGE; signgam = 1; if (x > 0) x = pos_gamma(x, &exc); else { static double pi = M_PI; double temp; /* can't be in register because of modf() below */ if (!modf(x = -x, &temp)) { /* SING if x is negative integer */ exc.type = SING; if (!matherr(&exc)) { (void) write(2, "gamma: SING error\n", 18); errno = EDOM; } return (exc.retval); } if (x >= X_MAX) exc.type = OVERFLOW; else { if ((temp = sin(pi * x)) < 0) temp = -temp; else signgam = -1; return (-(log(x * temp/pi) + pos_gamma(x, &exc))); } } if (exc.type != OVERFLOW) return (x); if (!matherr(&exc)) errno = ERANGE; return (exc.retval); } static double pos_gamma(x, excp) register double x; struct exception *excp; { static double p2[] = { -0.67449507245925289918e1, -0.50108693752970953015e2, -0.43933044406002567613e3, -0.20085274013072791214e4, -0.87627102978521489560e4, -0.20886861789269887364e5, -0.42353689509744089647e5, }, q2[] = { 1.0, -0.23081551524580124562e2, 0.18949823415702801641e3, -0.49902852662143904834e3, -0.15286072737795220248e4, 0.99403074150827709015e4, -0.29803853309256649932e4, -0.42353689509744090010e5, }; register double y, z; if (x > 8) { /* asymptotic approximation */ static double p[] = { -0.1633436431e-2, 0.83645878922e-3, -0.5951896861197e-3, 0.793650576493454e-3, -0.277777777735865004e-2, 0.83333333333333101837e-1, }; if (x >= MAXDOUBLE/LN_MAXDOUBLE) { excp->type = OVERFLOW; return (excp->retval); } z = (x - 0.5) * log(x) - x + GOOBIE; if (x > X_MAX) return (z); x = 1/x; y = x * x; return (z + x * _POLY5(y, p)); } y = 1; if (x < y) y /= (x * (y + x)); else if (x < 2) { y /= x; x -= 1; } else { for ( ; x >= 3; y *= x) x -= 1; x -= 2; } return (log(y * _POLY6(x, p2)/_POLY7(x, q2))); } E 1 h63302 s 00001/00001/00051 d D 4.2 87/05/13 18:26:47 build 6 5 c removed old SCCS strings and inserted #ident BB e s 00000/00000/00052 d D 4.1 87/02/16 16:58:00 mth 5 4 c rolled rev to -r4 (mth) e s 00000/00000/00052 d D 3.2 87/01/31 11:43:52 mkm 4 3 c from ROS sources as of this date. -mkm e s 00000/00000/00052 d D 3.1 87/01/21 17:46:26 mkm 3 2 c e s 00000/00000/00052 d D 2.1 87/01/21 17:43:48 mkm 2 1 c e s 00052/00000/00000 d D 1.1 87/01/21 17:41:57 mkm 1 0 c Placed under source control - mkm c These files are direct descendants of the ROS files c by the same name at or about ROS rev 5.1 e u U f b f n t T I 1 D 6 /* "%W% %G%" */ E 6 I 6 #ident " %W% %E% " E 6 /*LINTLIBRARY*/ /* * hypot(a, b) returns sqrt(a^2 + b^2), avoiding unnecessary overflows. * Returns ERANGE error and value HUGE if the correct value would overflow. */ #include #include #include #define ITERATIONS 4 double hypot(a, b) register double a, b; { register double t; register int i = ITERATIONS; struct exception exc; if ((exc.arg1 = a) < 0) a = -a; if ((exc.arg2 = b) < 0) b = -b; if (a > b) { /* make sure |a| <= |b| */ t = a; a = b; b = t; } /* 10/25/85 hlf. oops! if b is zero we will be dividing by zero. see spr425 ** See also mr 1171. What we really want to do is return a if b is a zero. */ if (b == 0) return(a); if ((t = a/b) < X_EPS) /* t <= 1 */ return (b); /* t << 1 */ a = 1 + t * t; /* a = 1 + (a/b)^2 */ t = 0.5 + 0.5 * a; /* first guess for sqrt */ do { t = 0.5 * (t + a/t); } while (--i > 0); /* t <= sqrt(2) */ if (b < MAXDOUBLE/M_SQRT2) /* result can't overflow */ return (t * b); if ((t *= 0.5 * b) < MAXDOUBLE/2) /* result won't overflow */ return (t + t); exc.type = OVERFLOW; exc.name = "hypot"; exc.retval = HUGE; if (!matherr(&exc)) errno = ERANGE; return (exc.retval); } E 1 h29462 s 00001/00001/00215 d D 4.2 87/05/13 18:27:00 build 6 5 c removed old SCCS strings and inserted #ident BB e s 00000/00000/00216 d D 4.1 87/02/16 16:58:03 mth 5 4 c rolled rev to -r4 (mth) e s 00000/00000/00216 d D 3.2 87/01/31 11:43:54 mkm 4 3 c from ROS sources as of this date. -mkm e s 00000/00000/00216 d D 3.1 87/01/21 17:46:27 mkm 3 2 c e s 00000/00000/00216 d D 2.1 87/01/21 17:43:49 mkm 2 1 c e s 00216/00000/00000 d D 1.1 87/01/21 17:41:58 mkm 1 0 c Placed under source control - mkm c These files are direct descendants of the ROS files c by the same name at or about ROS rev 5.1 e u U f b f n t T I 1 D 6 /* "%W% %G%" */ E 6 I 6 #ident " %W% %E% " E 6 /*LINTLIBRARY*/ /* * Double-precision Bessel's function * of the first and second kinds * of order zero. * * j0(x) returns the value of J0(x) * for all real values of x. * * Returns ERANGE error and value 0 for large arguments. * Calls sin, cos, sqrt. * * There is a niggling bug in J0 that * causes errors up to 2e-16 for x in the * interval [-8, 8]. * The bug is caused by an inappropriate order * of summation of the series. * * Coefficients are from Hart & Cheney. * #5849 (19.22D) * #6549 (19.25D) * #6949 (19.41D) * * y0(x) returns the value of Y0(x) * for positive real values of x. * Returns EDOM error and value -HUGE if argument <= 0. * * Calls sin, cos, sqrt, log, j0. * * The values of Y0 have not been checked * to more than ten places. * * Coefficients are from Hart & Cheney. * #6245 (18.78D) * #6549 (19.25D) * #6949 (19.41D) */ #include #include #include #define P2_0_Q2_0 0.999999999999999999944688442 #define P3_0_Q3_0 -0.0156249999999999999611615235 #define P4_0_Q4_0 0.073804295108687225110222 #define DPOLYD(y, p, q) for (n = d = 0, i = sizeof(p)/sizeof(p[0]); --i >= 0; ) \ { n = n * y + p[i]; d = d * y + q[i]; } static double tpi = 0.6366197723675813430755350535; static double p1[] = { 0.4933787251794133561816813446e21, -.1179157629107610536038440800e21, 0.6382059341072356562289432465e19, -.1367620353088171386865416609e18, 0.1434354939140344111664316553e16, -.8085222034853793871199468171e13, 0.2507158285536881945555156435e11, -.4050412371833132706360663322e8, 0.2685786856980014981415848441e5, }, q1[] = { 0.4933787251794133562113278438e21, 0.5428918384092285160200195092e19, 0.3024635616709462698627330784e17, 0.1127756739679798507056031594e15, 0.3123043114941213172572469442e12, 0.6699987672982239671814028660e9, 0.1114636098462985378182402543e7, 0.1363063652328970604442810507e4, 1.0, }; static double p2[] = { 0.5393485083869438325262122897e7, 0.1233238476817638145232406055e8, 0.8413041456550439208464315611e7, 0.2016135283049983642487182349e7, 0.1539826532623911470917825993e6, 0.2485271928957404011288128951e4, 0.0, }, q2[] = { 0.5393485083869438325560444960e7, 0.1233831022786324960844856182e8, 0.8426449050629797331554404810e7, 0.2025066801570134013891035236e7, 0.1560017276940030940592769933e6, 0.2615700736920839685159081813e4, 1.0, }; static double p3[] = { -.3984617357595222463506790588e4, -.1038141698748464093880530341e5, -.8239066313485606568803548860e4, -.2365956170779108192723612816e4, -.2262630641933704113967255053e3, -.4887199395841261531199129300e1, 0.0, }, q3[] = { 0.2550155108860942382983170882e6, 0.6667454239319826986004038103e6, 0.5332913634216897168722255057e6, 0.1560213206679291652539287109e6, 0.1570489191515395519392882766e5, 0.4087714673983499223402830260e3, 1.0, }; static double p4[] = { -.2750286678629109583701933175e20, 0.6587473275719554925999402049e20, -.5247065581112764941297350814e19, 0.1375624316399344078571335453e18, -.1648605817185729473122082537e16, 0.1025520859686394284509167421e14, -.3436371222979040378171030138e11, 0.5915213465686889654273830069e8, -.4137035497933148554125235152e5, }, q4[] = { 0.3726458838986165881989980e21, 0.4192417043410839973904769661e19, 0.2392883043499781857439356652e17, 0.9162038034075185262489147968e14, 0.2613065755041081249568482092e12, 0.5795122640700729537480087915e9, 0.1001702641288906265666651753e7, 0.1282452772478993804176329391e4, 1.0, }; extern double j0_asympt(); double j0(x) register double x; { register double n, d; register int i; if ((n = x) < 0) x = -x; if (x > 8) return (j0_asympt(x, n, 1)); if (x < X_EPS) return (1); x *= x; DPOLYD(x, p1, q1); return (n/d); } double y0(x) register double x; { register double n, d, y, z; register int i; if (x <= 0) { struct exception exc; exc.type = DOMAIN; exc.name = "y0"; exc.arg1 = x; exc.retval = -HUGE; if (!matherr(&exc)) { (void) write(2, "y0: DOMAIN error\n", 17); errno = EDOM; } return (exc.retval); } if (x > 8) return (j0_asympt(x, x, 0)); y = tpi * log(x); if (x < X_EPS) return (y - P4_0_Q4_0); z = x * x; DPOLYD(z, p4, q4); return (n/d + y * j0(x)); } static double j0_asympt(x, n, j0flag) register double x, n; int j0flag; { register double z, d, pzero, qzero; register int i; if (x > X_TLOSS) { struct exception exc; exc.type = TLOSS; exc.name = j0flag ? "j0" : "y0"; exc.arg1 = n; exc.retval = 0.0; if (!matherr(&exc)) { (void) write(2, exc.name, 2); (void) write(2, ": TLOSS error\n", 14); errno = ERANGE; } return (exc.retval); } if (x > X_PLOSS) { pzero = P2_0_Q2_0; qzero = P3_0_Q3_0; } else { z = 64/(x * x); DPOLYD(z, p2, q2); pzero = n/d; DPOLYD(z, p3, q3); qzero = n/d; } qzero *= 8/x; z = sqrt(tpi/x); pzero *= z; qzero *= z; x -= M_PI_4; return (j0flag ? pzero * cos(x) - qzero * sin(x) : pzero * sin(x) + qzero * cos(x)); } E 1 h33246 s 00001/00001/00215 d D 4.2 87/05/13 18:27:13 build 6 5 c removed old SCCS strings and inserted #ident BB e s 00000/00000/00216 d D 4.1 87/02/16 16:58:07 mth 5 4 c rolled rev to -r4 (mth) e s 00000/00000/00216 d D 3.2 87/01/31 11:43:56 mkm 4 3 c from ROS sources as of this date. -mkm e s 00000/00000/00216 d D 3.1 87/01/21 17:46:28 mkm 3 2 c e s 00000/00000/00216 d D 2.1 87/01/21 17:43:50 mkm 2 1 c e s 00216/00000/00000 d D 1.1 87/01/21 17:41:58 mkm 1 0 c Placed under source control - mkm c These files are direct descendants of the ROS files c by the same name at or about ROS rev 5.1 e u U f b f n t T I 1 D 6 /* "%W% %G%" */ E 6 I 6 #ident " %W% %E% " E 6 /*LINTLIBRARY*/ /* * Double-precision Bessel's function * of the first and second kinds * of order one. * * j1(x) returns the value of J1(x) * for all real values of x. * * Returns ERANGE error and value 0 for large arguments. * Calls sin, cos, sqrt. * * There is a niggling bug in J1 that * causes errors up to 2e-16 for x in the * interval [-8, 8]. * The bug is caused by an inappropriate order * of summation of the series. * * Coefficients are from Hart & Cheney. * #6050 (20.98D) * #6750 (19.19D) * #7150 (19.35D) * * y1(x) returns the value of Y1(x) * for positive real values of x. * Returns EDOM error and value -HUGE if argument <= 0. * * Calls sin, cos, sqrt, log, j1. * * The values of Y1 have not been checked * to more than ten places. * * Coefficients are from Hart & Cheney. * #6447 (22.18D) * #6750 (19.19D) * #7150 (19.35D) */ #include #include #include #define P1_0_Q1_0 0.4999999999999999999989557017 #define P2_0_Q2_0 1.0000000000000000000646346901 #define P3_0_Q3_0 0.046874999999999999955398015174 #define DPOLYD(y, p, q) for (n = d = 0, i = sizeof(p)/sizeof(p[0]); --i >= 0; ) \ { n = n * y + p[i]; d = d * y + q[i]; } static double tpi = 0.6366197723675813430755350535; static double p1[] = { 0.581199354001606143928050809e21, -.6672106568924916298020941484e20, 0.2316433580634002297931815435e19, -.3588817569910106050743641413e17, 0.2908795263834775409737601689e15, -.1322983480332126453125473247e13, 0.3413234182301700539091292655e10, -.4695753530642995859767162166e7, 0.2701122710892323414856790990e4, }, q1[] = { 0.1162398708003212287858529400e22, 0.1185770712190320999837113348e20, 0.6092061398917521746105196863e17, 0.2081661221307607351240184229e15, 0.5243710262167649715406728642e12, 0.1013863514358673989967045588e10, 0.1501793594998585505921097578e7, 0.1606931573481487801970916749e4, 1.0, }; static double p2[] = { -.4435757816794127857114720794e7, -.9942246505077641195658377899e7, -.6603373248364939109255245434e7, -.1523529351181137383255105722e7, -.1098240554345934672737413139e6, -.1611616644324610116477412898e4, 0.0, }, q2[] = { -.4435757816794127856828016962e7, -.9934124389934585658967556309e7, -.6585339479723087072826915069e7, -.1511809506634160881644546358e7, -.1072638599110382011903063867e6, -.1455009440190496182453565068e4, 1.0, }; static double p3[] = { 0.3322091340985722351859704442e5, 0.8514516067533570196555001171e5, 0.6617883658127083517939992166e5, 0.1849426287322386679652009819e5, 0.1706375429020768002061283546e4, 0.3526513384663603218592175580e2, 0.0, }, q3[] = { 0.7087128194102874357377502472e6, 0.1819458042243997298924553839e7, 0.1419460669603720892855755253e7, 0.4002944358226697511708610813e6, 0.3789022974577220264142952256e5, 0.8638367769604990967475517183e3, 1.0, }; static double p4[] = { -.9963753424306922225996744354e23, 0.2655473831434854326894248968e23, -.1212297555414509577913561535e22, 0.2193107339917797592111427556e20, -.1965887462722140658820322248e18, 0.9569930239921683481121552788e15, -.2580681702194450950541426399e13, 0.3639488548124002058278999428e10, -.2108847540133123652824139923e7, 0.0, }, q4[] = { 0.5082067366941243245314424152e24, 0.5435310377188854170800653097e22, 0.2954987935897148674290758119e20, 0.1082258259408819552553850180e18, 0.2976632125647276729292742282e15, 0.6465340881265275571961681500e12, 0.1128686837169442121732366891e10, 0.1563282754899580604737366452e7, 0.1612361029677000859332072312e4, 1.0, }; extern double j1_asympt(); double j1(x) register double x; { register double n, d, y; register int i; if ((y = x) < 0) x = -x; if (x > 8) return (j1_asympt(x, y, 1)); if (x < X_EPS) return (P1_0_Q1_0 * y); x *= x; DPOLYD(x, p1, q1); return (y * n/d); } double y1(x) register double x; { register double n, d, z; register int i; if (x <= 0) { struct exception exc; exc.type = DOMAIN; exc.name = "y1"; exc.arg1 = x; exc.retval = -HUGE; if (!matherr(&exc)) { (void) write(2, "y1: DOMAIN error\n", 17); errno = EDOM; } return (exc.retval); } if (x > 8) return (j1_asympt(x, x, 0)); z = x * x; DPOLYD(z, p4, q4); return (x * n/d + tpi * (j1(x) * log(x) - 1/x)); } static double j1_asympt(x, n, j1flag) register double x, n; int j1flag; { register double z, d, pzero, qzero; register int i; struct exception exc; exc.arg1 = n; if (x > X_TLOSS) { exc.type = TLOSS; exc.name = j1flag ? "j1" : "y1"; exc.retval = 0.0; if (!matherr(&exc)) { (void) write(2, exc.name, 2); (void) write(2, ": TLOSS error\n", 14); errno = ERANGE; } return (exc.retval); } if (x > X_PLOSS) { pzero = P2_0_Q2_0; qzero = P3_0_Q3_0; } else { z = 64/(x * x); DPOLYD(z, p2, q2); pzero = n/d; DPOLYD(z, p3, q3); qzero = n/d; } qzero *= 8/x; z = sqrt(tpi/x); pzero *= z; qzero *= z; x -= 3 * M_PI_4; if (!j1flag) return (pzero * sin(x) + qzero * cos(x)); x = pzero * cos(x) - qzero * sin(x); return (exc.arg1 < 0 ? -x : x); } E 1 h34316 s 00001/00001/00141 d D 4.2 87/05/13 18:27:28 build 6 5 c removed old SCCS strings and inserted #ident BB e s 00000/00000/00142 d D 4.1 87/02/16 16:58:11 mth 5 4 c rolled rev to -r4 (mth) e s 00000/00000/00142 d D 3.2 87/01/31 11:43:57 mkm 4 3 c from ROS sources as of this date. -mkm e s 00000/00000/00142 d D 3.1 87/01/21 17:46:30 mkm 3 2 c e s 00000/00000/00142 d D 2.1 87/01/21 17:43:51 mkm 2 1 c e s 00142/00000/00000 d D 1.1 87/01/21 17:41:59 mkm 1 0 c Placed under source control - mkm c These files are direct descendants of the ROS files c by the same name at or about ROS rev 5.1 e u U f b f n t T I 1 D 6 /* "%W% %G%" */ E 6 I 6 #ident " %W% %E% " E 6 /*LINTLIBRARY*/ /* * Double-precision Bessel's function of * the first and second kinds and of * integer order. * * jn(n, x) returns the value of Jn(x) for all * integer values of n and all real values * of x. * Returns ERANGE error and value 0 for large arguments. * Calls j0, j1. * * For n = 0, j0(x) is called, * For n = 1, j1(x) is called. * For n < x, forward recursion is used starting * from values of j0(x) and j1(x). * For n > x, a continued fraction approximation to * j(n, x)/j(n - 1, x) is evaluated and then backward * recursion is used starting from a supposed value * for j(n, x). The resulting value of j(0, x) is * compared with the actual value to correct the * supposed value of j(n, x). * * yn(n, x) is similar in all respects, except * that y0 and y1 are called, and that forward recursion * is used for values of n > 1. * Returns EDOM error and value -HUGE if argument <= 0. */ #include #include #include extern double jn_error(); double jn(n, x) register int n; register double x; { double a, b, temp, t; int i; if (_ABS(x) > X_TLOSS) return (jn_error(n, x, 1)); if (n == 0) return (j0(x)); if (x == 0) return (x); if (n < 0) { n = -n; x = -x; } if (n == 1) return (j1(x)); if (n <= x) { a = j0(x); b = j1(x); for (i = 1; i < n; i++) { temp = b; b = (i + i)/x * b - a; a = temp; } return (b); } temp = x * x; for (t = 0, i = n + 16; i > n; i--) t = temp/(i + i - t); a = t = x/(n + n - t); b = 1; for (i = n - 1; i > 0; i--) { temp = b; b = (i + i)/x * b - a; a = temp; } return (t * j0(x)/b); } double yn(n, x) register int n; register double x; { double a, b, temp; int i, neg; if (x <= 0) { struct exception exc; exc.type = DOMAIN; exc.name = "yn"; exc.arg1 = n; exc.arg2 = x; exc.retval = -HUGE; if (!matherr(&exc)) { (void) write(2, "yn: DOMAIN error\n", 17); errno = EDOM; } return (exc.retval); } if (x > X_TLOSS) return (jn_error(n, x, 0)); if (n == 0) return (y0(x)); neg = 0; if (n < 0) { n = -n; neg = n % 2; } b = y1(x); if (n > 1) { a = y0(x); for (i = 1; i < n; i++) { temp = b; b = (i + i)/x * b - a; a = temp; } } return (neg ? -b : b); } static double jn_error(n, x, jnflag) int n; double x; int jnflag; { struct exception exc; exc.type = TLOSS; exc.name = jnflag ? "jn" : "yn"; exc.arg1 = n; exc.arg2 = x; exc.retval = 0.0; if (!matherr(&exc)) { (void) write(2, exc.name, 2); (void) write(2, ": TLOSS error\n", 14); errno = ERANGE; } return (exc.retval); } E 1 h50907 s 00001/00001/00011 d D 4.2 87/05/13 18:27:40 build 6 5 c removed old SCCS strings and inserted #ident BB e s 00000/00000/00012 d D 4.1 87/02/16 16:58:13 mth 5 4 c rolled rev to -r4 (mth) e s 00000/00000/00012 d D 3.2 87/01/31 11:43:59 mkm 4 3 c from ROS sources as of this date. -mkm e s 00000/00000/00012 d D 3.1 87/01/21 17:46:32 mkm 3 2 c e s 00000/00000/00012 d D 2.1 87/01/21 17:43:54 mkm 2 1 c e s 00012/00000/00000 d D 1.1 87/01/21 17:42:00 mkm 1 0 c Placed under source control - mkm c These files are direct descendants of the ROS files c by the same name at or about ROS rev 5.1 e u U f b f n t T I 1 D 6 /* "%W% %G%" */ E 6 I 6 #ident " %W% %E% " E 6 /*LINTLIBRARY*/ #include /*ARGSUSED*/ int matherr(x) struct exception *x; { return (0); } E 1 h38776 s 00002/00000/00680 d D 4.3 87/04/16 13:56:34 mth 8 7 c Profiling changes e s 00196/00033/00484 d D 4.2 87/02/16 17:09:52 mth 7 6 c Parameters in registers. e s 00000/00000/00517 d D 4.1 87/02/16 16:58:21 mth 6 5 c rolled rev to -r4 (mth) e s 00006/00006/00511 d D 3.3 87/01/31 13:28:20 mkm 5 4 c correct compatability probs between ROS and SPIX as. -mkm e s 00000/00000/00517 d D 3.2 87/01/31 11:54:30 mkm 4 3 c from ROS sources as of this date. -mkm e s 00000/00000/00517 d D 3.1 87/01/21 17:46:36 mkm 3 2 c e s 00000/00000/00517 d D 2.1 87/01/21 17:43:58 mkm 2 1 c e s 00517/00000/00000 d D 1.1 87/01/21 17:42:02 mkm 1 0 c Placed under source control - mkm c These files are direct descendants of the ROS files c by the same name at or about ROS rev 5.1 e u U f b f n t T I 1 ; "%W% %G%" dsect data ;FOR D_LOG() SaveBase: word 0 ;save area for original base SavePower: word 0 ;save area for original power name byte 'pow',0 ;name of routine D 5 emess0 byte 'pow: OVERFLOW error\n",0 ;error message if arg=0 E 5 I 5 emess0 byte 'pow: OVERFLOW error\n',0 ;error message if arg=0 E 5 mess0len equ 20 ;length of emess0 D 5 emess2 byte 'pow: DOMAIN error\n",0 ;error message of arg<0 E 5 I 5 emess2 byte 'pow: DOMAIN error\n',0 ;error message of arg<0 E 5 mess2len equ 18 D 5 nanmess byte 'pow: input value was NAN\n",0 ;error message if nan E 5 I 5 nanmess byte 'pow: input value was NAN\n',0 ;error message if nan E 5 nanlen equ 25 D 5 infmess byte 'pow: input value was INF\n",0 ;error message if "infinity" E 5 I 5 infmess byte 'pow: input value was INF\n',0 ;error message if "infinity" E 5 inflen equ 25 csect code align 2 externd _errno external _write external _matherr e_type equ -32 ;exception type e_name equ -28 ;name of routine in error e_arg1 equ -24 ;argument 1 e_arg2 equ -16 ;argument 2 (if present) e_retval equ -8 ;room for exception block e_size equ -80 ; plus stack frame with 3 parameters I 7 #ifdef ARGSINREGS pe_size equ 80 ; positive e_size #else pe_size equ 0 ; positive e_size #endif E 7 DOMAIN equ 1 SING equ 2 OVERFLOW equ 3 UNDERFLOW equ 4 TLOSS equ 5 PLOSS equ 6 EDOM equ 33 ERANGE equ 34 dsect data ;FOR D_EXP() namexp byte 'pow',0 ;name of routine ;no messages printed D 5 nanmess2 byte 'pow: input value was NAN\n",0 ;error message if nan E 5 I 5 nanmess2 byte 'pow: input value was NAN\n',0 ;error message if nan E 5 nanlen2 equ 25 D 5 infmess2 byte 'pow: input value was INF\n",0 ;error message if "infinity" E 5 I 5 infmess2 byte 'pow: input value was INF\n',0 ;error message if "infinity" E 5 inflen2 equ 25 csect code ;csect code for log function EXP0 equ 03f800000h ;an exponent of 0 EBIAS equ 127 ;the bias LIMIT equ 03fb504eeh ;equals 1.414213 LOGC2 equ 03fd4114dh ;equals 1.65677798 LOGC1 equ 03f8d5eedh ;equals 1.10445938 LOG2 equ 03f317218h ;equals .693147181 ONE equ 03f800000h ;equals one csect code ;csect code for exp EXPC1 equ 03d6c5665h ;equals .05769958151 EXPC2 equ 040e6e1ach ;equals 7.21504804 EXPC3 equ 041a68bbbh ;equals 20.81822806 UL2I equ 03fb8a000h ;equals 1.4423828125 = upper_log_2_inv LL2I equ 039a3b296h ;equals .000312228389 = lower_log_2_inv MAXIN equ 0461c4000h ;equals 10,000 HALF equ 03f000000h ;equals .5 ABS equ 07fffffffh ;to find the absolute value of an argument HALFSZ equ 0fffff800h ;to mask off lower part of exponent MASK equ 07f800000h ;to mask off mantissa and sign bit MASKE equ 0807fffffh ;to mask off exponent INF equ 07f800000h ;equals "infinity" LIMITU equ 042b16666h ;88.7 the upper value of ln(base)*power LIMITL equ 0c2ae999ah ;-87.3 the lowest value of ln(base)*power arg1 equ 24 arg2 equ 32 arg3 equ 40 arg_1 equ -4 D 7 #ifdef SingleLib global _pow ;single precision library _pow: load r0,r14,arg1 load r1,r14,arg2 #else E 7 I 7 E 7 global _s_pow ;rc and rp global _pow_rr ;f77 global _Pow_rr ;rf _s_pow: _Pow_rr: I 8 ; MCOUNT E 8 I 7 #ifndef ARGSINREGS E 7 load r0,r14,arg1 load r1,r14,arg2 I 7 #endif E 7 br doit _pow_rr: I 8 ; MCOUNT E 8 I 7 #ifdef ARGSINREGS load r0,r0,0 ;get the base load r1,r1,0 ;get the power #else E 7 load r0,r14,arg1 load r0,r0,0 ;get the base load r1,r14,arg2 load r1,r1,0 ;get the power D 7 #endif SingleLib E 7 I 7 #endif E 7 I 7 E 7 doit: br r0=0,bzero ;if base=0 then bzero else ... laddr r2,ONE,L br r0<>r2,r_log! ;if base<>1.0 goto r_log I 7 #ifdef ARGSINREGS ret LINK,LINK ; else return 1.0 #else E 7 ret r11,r11 ; else return 1.0 I 7 #endif E 7 r_log: store r0,SaveBase,l ;save original args store r1,SavePower,l br r0>0,OkSoFar! ; ; base is <0. power must be integer for input to be acceptable. ; fixt r2,r1 float r2,r2 br r1<>r2,badinput ;if power is not integral, goto badinput laddr r3,07fffffffh,l and r0,r3 ;base = abs(base) OkSoFar: laddr r2,INF,L br r0>=r2,nanorinf ;if base=nan or inf then nanorinf br r1>=r2,pnanorinf ;if pow=nan or inf then pnanorinf laddr r2,MASK,L and r2,r0 ;clear off mantissa and sign bit csl r2,9 ;place exponent on low-order side of r2 laddr r3,EBIAS,L sub r2,r3 ;unbias the exponent laddr r3,MASKE,L and r0,r3 ;to clear off the exponent laddr r3,EXP0,L or r0,r3 ;to give mant "x" an exponent of 0 for arith laddr r3,LIMIT,L br r0<=r3,cont ;if x>1.414213 then ... else cont greater: laddr r3,000800000h,L ;places a one in the exponent's spot sub r0,r3 ;r0="x=x/2" add r2,1 ;r2="n=n+1" cont: laddr r3,ONE,L radd r3,r0 ;"(x+1)" laddr r4,ONE,L rsub r0,r4 ;"(x-1)" rdiv r0,r3 ;r0="z=(x-1) / (x+1)" move r3,r0 rmpy r3,r3 ;r3="zsq=sqr(z)" laddr r4,LOGC2,L rsub r4,r3 ;r4="(LOGC2-zsq)" laddr r5,LOGC1,L rdiv r5,r4 ;r5="(LOGC1/...)" rmpy r3,r5 ;"zsq*..." rmpy r3,r0 ;"z*..." laddr r5,LOG2,L float r2,r2 ;make n a real number to use arithmetic rmpy r2,r5 ;"n*LOG2" laddr r5,000800000h,L ;place a one in the first exponential bit add r0,r5 ;r0="z+z" radd r0,r2 ;"...+..." radd r0,r3 ;r0="result=n*LOG2+(z+z)+z*zsq*(LOGC1/(C2-zsq))" br contpow ;continue to calculate pow_rr ; ; error handling ; badinput: ;returns info to user about input error struct: ;loads values into error structure in case user ;wishes to do more with them than we have done D 7 E 7 I 7 #ifdef ARGSINREGS store LINK,STKPTR,0 ;save old return laddr STKPTR,STKPTR,e_size ;update stack #else E 7 store r11,r14,0 ;save old return store r15,r14,8 ;save old frame pointer move r15,r14 laddr r14,r14,e_size ;update stack I 7 #endif E 7 D 7 store r0,r15,e_arg1 ;load arg's value into error structure E 7 I 7 store r0,STKPTR,pe_size+e_arg1 ;load arg's value into error structure E 7 laddr r2,name,L ;name of offending routine D 7 store r2,r15,e_name ; into error structure E 7 I 7 store r2,STKPTR,pe_size+e_name ; into error structure E 7 move r3,DOMAIN ;exception type D 7 store r3,r15,e_type E 7 I 7 store r3,STKPTR,pe_size+e_type E 7 laddr r0,0ff800000h,L D 7 store r0,r15,e_retval ;return -inf E 7 I 7 store r0,STKPTR,pe_size+e_retval ;return -inf E 7 I 7 #ifdef ARGSINREGS laddr r0,STKPTR,pe_size+e_type ;user want to do different anything with error? call LINK,_matherr,L ;matherr is a function for user to define #else E 7 laddr r4,r15,e_type ;user want to do different anything with error? store r4,r14,arg1 ;gives matherr the address of error structure call r11,_matherr,L ;matherr is a function for user to define I 7 #endif E 7 br r0<>0,err_rtn ;yes (assume user will change r0 if yes ) mess2: ;prints out our error message move r0,2 I 7 #ifdef ARGSINREGS laddr r1,emess2,L laddr r2,mess2len call LINK,_write,L ;writes out message #else E 7 store r0,r14,arg1 laddr r5,emess2,L store r5,r14,arg2 ;gives message laddr r0,mess2len store r0,r14,arg3 ;gives length of message call r11,_write,L ;writes out message I 7 #endif E 7 laddr r0,EDOM ;sets global variable _errno for user store r0,_errno,L err_rtn: ;resets all old pointers and returns -infinity I 7 #ifdef ARGSINREGS laddr STKPTR,STKPTR,pe_size ;user will have already used matherr for himself load LINK,STKPTR,0 #else E 7 move r14,r15 ;user will have already used matherr for himself load r15,r14,8 load r11,r14,0 I 7 #endif E 7 laddr r0,0ff800000h,L ;returns -inf I 7 #ifdef ARGSINREGS ret LINK,LINK #else E 7 ret r11,r11 I 7 #endif E 7 zero: ;loads values into error structure in case user D 7 ;wishes to do more with them than we have done E 7 I 7 #ifdef ARGSINREGS ;wishes to do more with them than we have done store LINK,STKPTR,0 ;save old return laddr STKPTR,STKPTR,e_size ;update stack #else E 7 store r11,r14,0 ;save old return store r15,r14,8 ;save old frame pointer move r15,r14 laddr r14,r14,e_size ;update stack I 7 #endif E 7 D 7 store r0,r15,e_arg1 ;load arg's value into error structure E 7 I 7 store r0,STKPTR,pe_size+e_arg1 ;load arg's value into error structure E 7 laddr r2,name,L ;name of offending routine D 7 store r2,r15,e_name ; into error structure E 7 I 7 store r2,STKPTR,pe_size+e_name ; into error structure E 7 move r3,OVERFLOW ;exception type D 7 store r3,r15,e_type E 7 I 7 store r3,STKPTR,pe_size+e_type E 7 laddr r0,0ff800000h,L D 7 store r0,r15,e_retval ;return -infinity E 7 I 7 store r0,STKPTR,pe_size+e_retval ;return -infinity E 7 I 7 #ifdef ARGSINREGS laddr r0,STKPTR,pe_size+e_type ;user want to do different anything with error? call LINK,_matherr,L ;matherr is a function for user to define #else E 7 laddr r4,r15,e_type ;user want to do different anything with error? store r4,r14,arg1 ;gives matherr the address of error structure call r11,_matherr,L ;matherr is a function for user to define I 7 #endif E 7 br r0<>0,err_rtn ;yes (assume user will change r0 if yes ) mess0: ;prints out our error message move r0,2 I 7 #ifdef ARGSINREGS laddr r1,emess0,L laddr r2,mess0len call LINK,_write,L ;writes out message #else E 7 store r0,r14,arg1 laddr r5,emess0,L store r5,r14,arg2 ;gives message laddr r0,mess0len store r0,r14,arg3 ;gives length of message call r11,_write,L ;writes out message I 7 #endif E 7 laddr r0,EDOM ;sets global variable _errno for user store r0,_errno,L br err_rtn pnanorinf: move r0,r1 nanorinf: br r0>r2,nan ;if arg=nan then nan else ... inf: ;writes message and returns inf I 7 #ifdef ARGSINREGS store LINK,STKPTR,0 ;save old return laddr STKPTR,STKPTR,e_size ;update stack #else E 7 store r11,r14,0 ;save old return store r15,r14,8 ;save old frame pointer move r15,r14 laddr r14,r14,e_size ;update stack I 7 #endif E 7 move r0,2 ;to print I 7 #ifdef ARGSINREGS laddr r1,infmess,L laddr r2,inflen call LINK,_write,L laddr STKPTR,STKPTR,pe_size ;re-updates the stack load LINK,STKPTR,0 ;resets old return laddr r0,07f800000h,L ;returns inf ret LINK,LINK #else E 7 store r0,r14,arg1 laddr r5,infmess,L store r5,r14,arg2 ;gives write the message laddr r0,inflen store r0,r14,arg3 ;gives write the length of message call r11,_write,L move r14,r15 ;re-updates the stack load r15,r14,8 ;resets old frame pointer load r11,r14,0 ;resets old return laddr r0,07f800000h,L ;returns inf ret r11,r11 I 7 #endif E 7 nan: ;writes message and returns the nan arg I 7 #ifdef ARGSINREGS store LINK,STKPTR,0 ;save old return laddr STKPTR,STKPTR,e_size ;update stack store r0,STKPTR,arg_1 ;save arg #else E 7 store r11,r14,0 ;save old return store r15,r14,8 ;save old frame pointer move r15,r14 laddr r14,r14,e_size ;update stack D 7 E 7 store r0,r14,arg_1 ;save arg I 7 #endif E 7 move r0,2 ;to print I 7 #ifdef ARGSINREGS laddr r1,nanmess,L laddr r2,nanlen call LINK,_write,L #else E 7 store r0,r14,arg1 laddr r5,nanmess,L store r5,r14,arg2 ;gives write the message laddr r0,nanlen store r0,r14,arg3 ;gives write the length of message call r11,_write,L D 7 E 7 I 7 #endif #ifdef ARGSINREGS load r0,STKPTR,arg_1 ;restore arg to rp0 laddr STKPTR,STKPTR,pe_size ;re-update stack load LINK,STKPTR,0 ;resets old return ret LINK,LINK #else E 7 load r0,r14,arg_1 ;restore arg to rp0 move r14,r15 ;re-update stack load r15,r14,8 ;resets old frame pointer load r11,r14,0 ;resets old return ret r11,r11 I 7 #endif E 7 D 7 rtnzero: move r0,0 E 7 I 7 rtnzero: move r0,0 #ifdef ARGSINREGS ret LINK,LINK #else E 7 ret r11,r11 I 7 #endif E 7 rtninf: laddr r0,07f800000h,L I 7 #ifdef ARGSINREGS ret LINK,LINK #else E 7 ret r11,r11 I 7 #endif E 7 contpow: ;r0 now equals the result of log of the base, now find exp(result*power) rmpy r0,r1 ;r0="base_log * pow" laddr r1,LIMITU,L ;r1= upper limit of (ln(base))*power rcomp r1,r0 br r1<=0,rtninf laddr r1,LIMITL,L ;r1=lower limit of (ln(base))*power rcomp r1,r0 br r1>=0,rtnzero ;just tested so -87.3r2,toobig ;if abs(arg)>maxinput then toobig else ... e_reduce: laddr r1,HALFSZ,L and r1,r0 ;r1="upper=%t_halfsz(arg)" move r2,r0 rsub r2,r1 ;r2="lower=arg-upper" laddr r3,UL2I,L rmpy r1,r3 ;r1="x=upper*upper_log_2_inv" fixr r3,r1 ;r3="mult=round(x)" float r3,r3 ;make r3 a real to use rsub rsub r1,r3 ;"(x-mult)" fixt r3,r3 ;reconverts r3 to integer laddr r4,UL2I,L ; rmpy r2,r4 ;"lower*upper_log_2_inv" laddr r4,LL2I,L rmpy r0,r4 ;"arg*lower_log_2_inv" radd r0,r2 radd r0,r1 ;r0="x=(x-mult)+(lower*UL2I + arg*LL2I)" move r1,r0 rmpy r1,r1 ;r1="xsq=sqr(x)" laddr r2,EXPC1,L ;EXPC1 rmpy r2,r1 ;"EXPC1*xsq)" laddr r4,EXPC2,L ;EXPC2 radd r2,r4 ;"(EXPC2+EXPC1*xsq)" rmpy r0,r2 ;r0="p=x * (EXPC2 + EXPC1 * xsq)" laddr r2,EXPC3,L ;EXPC3 radd r1,r2 ;r1="q=EXPC3+xsq" expcont: rsub r1,r0 ;"(q-p)" rdiv r0,r1 ;"p/(q-p)" laddr r1,HALF,L radd r0,r1 ;r0="result=.5 + p/(q-p)" add r3,1 ;r3="mult+1" pack: laddr r1,MASK,L and r1,r0 ;r1=r0's exponent csl r1,9 ;makes exponent an integer add r1,r3 ;"u.exp=u.exp+mult" laddr r2,23 csl r1,r2 ;moves new exponent to appropriate bit placement laddr r2,MASKE,L and r0,r2 ;clears r0's exponential bits or r0,r1 ;r0="%t_pack(result,mult+1,result)" done: load r1,SaveBase,l br r1>=0,DontNegate! load r1,SavePower,l fixt r1,r1 move r2,1 and r1,r2 br r1=0,DontNegate laddr r1,080000000h,l ;negate result (base was negative) or r0,r1 DontNegate: I 7 #ifdef ARGSINREGS ret LINK,LINK #else E 7 ret r11,r11 I 7 #endif E 7 bzero: br r1<=0,zero ;if pow > 0 then ... else overflow I 7 #ifdef ARGSINREGS ret LINK,LINK ;returns result=0 #else E 7 ret r11,r11 ;returns result=0 I 7 #endif E 7 ; ; error handling ;for exp ; toobig: ;sends program to neg or positvie laddr r3,080000000h,L and r0,r3 ;to get sign of arg alone br r0=0,positive ;if arg is positive then go to positive else neg: ;returns 0 after loading error structure for ;possible alternative error processing by user ;doesn't print any message unless -nan or -inf laddr r4,INF,L ;r4="infinity" rcomp r4,r1 struct1: ;loads values into error structure I 7 #ifdef ARGSINREGS store LINK,STKPTR,0 ;save old return laddr STKPTR,STKPTR,e_size ;update stack store r4,STKPTR,arg_1 ;saves r4's value (ie whether or not it's inf) #else E 7 store r11,r14,0 ;save old return store r15,r14,8 ;save old frame pointer move r15,r14 laddr r14,r14,e_size ;update stack D 7 E 7 store r4,r14,arg_1 ;saves r4's value (ie whether or not it's inf) I 7 #endif E 7 D 7 store r0,r15,e_arg1 ;load arg's value into error structure E 7 I 7 store r0,STKPTR,pe_size+e_arg1 ;load arg's value into error structure E 7 laddr r2,name,L ;name of offending routine D 7 store r2,r15,e_name ; into error structure E 7 I 7 store r2,STKPTR,pe_size+e_name ; into error structure E 7 move r3,UNDERFLOW ;exception type D 7 store r3,r15,e_type E 7 I 7 store r3,STKPTR,pe_size+e_type E 7 move r0,0 D 7 store r0,r15,e_retval ;return 0 E 7 I 7 store r0,STKPTR,pe_size+e_retval ;return 0 E 7 I 7 #ifdef ARGSINREGS laddr r0,STKPTR,pe_size+e_type ;user want to do different anything with error? call LINK,_matherr,L ;matherr is a function for user to define #else E 7 laddr r4,r15,e_type ;user want to do different anythi2     e E 7 store r0,r14,arg1 laddr r5,infmess,L store r5,r14,arg2 ;gives write the message laddr r0,inflen store r0,r14,arg3 ;gives write the length of message call r11,_write,L I 7 #endif E 7 br err_rtn2 nan2: move r0,2 ;to print I 7 #ifdef ARGSINREGS laddr r5,nanmess,L laddr r0,nanlen call LINK,_write,L #else E 7 store r0,r14,arg1 laddr r5,nanmess,L store r5,r14,arg2 ;gives write the message laddr r0,nanlen store r0,r14,arg3 ;gives write the length of message call r11,_write,L I 7 #endif E 7 br err_rtn2 E 1 h22649 s 00004/00000/00380 d D 4.3 87/04/16 13:56:37 mth 8 7 c Profiling changes e s 00080/00013/00300 d D 4.2 87/02/16 17:09:57 mth 7 6 c Parameters in registers. e s 00000/00000/00313 d D 4.1 87/02/16 16:58:25 mth 6 5 c rolled rev to -r4 (mth) e s 00002/00002/00311 d D 3.3 87/01/31 13:28:23 mkm 5 4 c correct compatability probs between ROS and SPIX as. -mkm e s 00000/00000/00313 d D 3.2 87/01/31 11:54:32 mkm 4 3 c from ROS sources as of this date. -mkm e s 00000/00000/00313 d D 3.1 87/01/21 17:46:38 mkm 3 2 c e s 00000/00000/00313 d D 2.1 87/01/21 17:44:00 mkm 2 1 c e s 00313/00000/00000 d D 1.1 87/01/21 17:42:02 mkm 1 0 c Placed under source control - mkm c These files are direct descendants of the ROS files c by the same name at or about ROS rev 5.1 e u U f b f n t T I 1 ; "%W% %G%" dsect data name byte 'acos',0 ;name of routine emess byte 'acos: DOMAIN error\n',0 ;error message messlen equ 19 ;length of message D 5 nanmess byte 'acos: input value was NAN\n",0 ;error message if nan E 5 I 5 nanmess byte 'acos: input value was NAN\n',0 ;error message if nan E 5 nanlen equ 26 D 5 infmess byte 'acos: input value was INF\n",0 ;error message if "infinity" E 5 I 5 infmess byte 'acos: input value was INF\n',0 ;error message if "infinity" E 5 inflen equ 26 csect code align 2 externd _errno external _write external _matherr e_type equ -32 ;exception type e_name equ -28 ;name of routine in error e_arg1 equ -24 ;argument 1 e_arg2 equ -16 ;argument 2 (if present) e_retval equ -8 ;room for exception block e_size equ -80 ; plus stack frame with 3 parameters I 7 #ifdef ARGSINREGS pe_size equ 80 ; positive e_size #else pe_size equ 0 ; positive e_size #endif E 7 DOMAIN equ 1 SING equ 2 OVERFLOW equ 3 UNDERFLOW equ 4 TLOSS equ 5 PLOSS equ 6 EDOM equ 33 ERANGE equ 34 C1 equ 03efbd00fh ;equals .491821737 C2 equ 0bec79049h ;equals -.389772686 C3 equ 03cc32e36h ;equals .0238257453 C4 equ 0403cdbb7h ;equals 2.95091040 C5 equ 0c06aa2bfh ;equals -3.66618323 PI equ 040490fdbh ;equals pi = 3.141592654 PID2 equ 03fc90fdbh ;equals pi divided by 2 = 1.570796236 LIMIT equ 03f350481h ;equals .7071 radians = 45 degrees SMALL equ 033d6bf95h ;equals 1.0e-7, smallest value we calculate ABS equ 07fffffffh ;to get the absolute value of argument ONE equ 03f800000h ;equals one in single precision ;constants for r_sqrt SQRTC1 equ 03f1714ddh ;equals .5901621 SQRTC2 equ 03ed5a957h ;equals .4173076 EBIAS equ 127 ;the exponent's bias of a single precision # EXP0 equ 03f800000h ;an exponent of 0 (actually 127 biased) MASK equ 0000000ffh ;to mask off all but last 8 bits (int expon) MASKE equ 0007fffffh ;to mask expon (in its original pos) arg3 equ 40 arg2 equ 32 arg1 equ 24 arg_1 equ -8 I 7 E 7 #ifdef SingleLib global _acos ;single precision library _acos: I 8 ; MCOUNT E 8 I 7 #ifndef ARGSINREGS E 7 load r0,r14,arg1 I 7 #endif E 7 #else global _s_acos ;rc and rp global _r_acos ;f77 global _R_acos ;rf _s_acos: I 8 ; MCOUNT E 8 I 7 #ifndef ARGSINREGS E 7 load r0,r14,arg1 I 7 #endif E 7 br _R_acos _r_acos: I 8 ; MCOUNT E 8 I 7 #ifndef ARGSINREGS E 7 load r0,r14,arg1 ;get argument I 7 #endif E 7 load r0,r0,0 _R_acos: I 8 ; MCOUNT E 8 D 7 #endif SingleLib E 7 I 7 #endif E 7 laddr r1,ABS,L and r1,r0 ;r1="x=abs(arg)" laddr r2,ONE,L br r1>r2,toobig ;if x>1.0 then toobig else ... laddr r2,LIMIT,L br r10,err_rtn ;yes (assume user will change r0 if yes ) mess: ;prints out our error message move r0,2 I 7 #ifdef ARGSINREGS laddr r1,emess,L laddr r2,messlen call LINK,_write,L ;writes out message #else E 7 store r0,r14,arg1 laddr r5,emess,L store r5,r14,arg2 ;gives message laddr r0,messlen store r0,r14,arg3 ;gives length of message call r11,_write,L ;writes out message I 7 #endif E 7 laddr r0,EDOM ;sets global variable _errno for user store r0,_errno,L D 7 E 7 I 7 #ifdef ARGSINREGS load r4,STKPTR,arg_1 ;restore r4's old value (if inf or not) #else E 7 load r4,r14,arg_1 ;restore r4's old value (if inf or not) I 7 #endif E 7 br r4=0,inf ;if abs(arg)="infinity" then go to inf br r4<0,nan ;if abs(arg) is not-a-number then go to nan err_rtn: ;resets all old pointers and returns zero I 7 #ifdef ARGSINREGS laddr STKPTR,STKPTR,pe_size ;user will have already used matherr for himself load LINK,STKPTR,0 move r0,0 ;to return 0 ret LINK,LINK #else E 7 move r14,r15 ;user will have already used matherr for himself load r15,r14,8 load r11,r14,0 move r0,0 ;to return 0 ret r11,r11 I 7 #endif E 7 inf: move r0,2 ;to print I 7 #ifdef ARGSINREGS laddr r1,infmess,L laddr r2,inflen call LINK,_write,L #else E 7 store r0,r14,arg1 laddr r5,infmess,L store r5,r14,arg2 ;gives write the message laddr r0,inflen store r0,r14,arg3 ;gives write the length of message call r11,_write,L I 7 #endif E 7 br err_rtn nan: move r0,2 ;to print I 7 #ifdef ARGSINREGS laddr r1,nanmess,L laddr r2,nanlen call LINK,_write,L #else E 7 store r0,r14,arg1 laddr r5,nanmess,L store r5,r14,arg2 ;gives write the message laddr r0,nanlen store r0,r14,arg3 ;gives write the length of message call r11,_write,L I 7 #endif E 7 br err_rtn D 7 E 7 E 1 h44651 s 00004/00000/00354 d D 4.3 87/04/16 13:56:40 mth 8 7 c Profiling changes e s 00066/00009/00288 d D 4.2 87/02/16 17:10:01 mth 7 6 c Parameters in registers. e s 00000/00000/00297 d D 4.1 87/02/16 16:58:28 mth 6 5 c rolled rev to -r4 (mth) e s 00002/00002/00295 d D 3.3 87/01/31 13:28:26 mkm 5 4 c correct compatability probs between ROS and SPIX as. -mkm e s 00000/00000/00297 d D 3.2 87/01/31 11:54:33 mkm 4 3 c from ROS sources as of this date. -mkm e s 00000/00000/00297 d D 3.1 87/01/21 17:46:39 mkm 3 2 c e s 00000/00000/00297 d D 2.1 87/01/21 17:44:02 mkm 2 1 c e s 00297/00000/00000 d D 1.1 87/01/21 17:42:03 mkm 1 0 c Placed under source control - mkm c These files are direct descendants of the ROS files c by the same name at or about ROS rev 5.1 e u U f b f n t T I 1 ; "%W% %G%" dsect data name byte 'asin',0 ;name of routine emess byte 'asin: DOMAIN error\n',0 ;error message messlen equ 19 ;length of message D 5 nanmess byte 'asin: input value was NAN\n",0 ;error message if nan E 5 I 5 nanmess byte 'asin: input value was NAN\n',0 ;error message if nan E 5 nanlen equ 26 D 5 infmess byte 'asin: input value was INF\n",0 ;error message if "infinity" E 5 I 5 infmess byte 'asin: input value was INF\n',0 ;error message if "infinity" E 5 inflen equ 26 csect code align 2 externd _errno external _write external _matherr e_type equ -32 ;exception type e_name equ -28 ;name of routine in error e_arg1 equ -24 ;argument 1 e_arg2 equ -16 ;argument 2 (if present) e_retval equ -8 ;room for exception block e_size equ -80 ; plus stack frame with 3 parameters I 7 #ifdef ARGSINREGS pe_size equ 80 ; positive e_size #else pe_size equ 0 ; positive e_size #endif E 7 DOMAIN equ 1 SING equ 2 OVERFLOW equ 3 UNDERFLOW equ 4 TLOSS equ 5 PLOSS equ 6 EDOM equ 33 ERANGE equ 34 C1 equ 03efbd00fh ;equals .491821737 C2 equ 0bec79049h ;equals -.389772686 C3 equ 03cc32e36h ;equals .0238257453 C4 equ 0403cdbb7h ;equals 2.95091040 C5 equ 0c06aa2bfh ;equals -3.66618323 PID2 equ 03fc90fdbh ;equals pi divided by 2 = 1.5707963268 LIMIT equ 03f350481h ;equals .7071 radians = 45 degrees SMALL equ 033d6bf95h ;equals 1.0e-7, the smallest value we calculate ABS equ 07fffffffh ;to get the absolute value of argument ONE equ 03f800000h ;equals one in single precision ;constants for r_sqrt SQRTC1 equ 03f1714ddh ;equals .5901621 SQRTC2 equ 03ed5a957h ;equals .4173076 EBIAS equ 127 ;the exponent's bias of a single precision # EXP0 equ 03f800000h ;an exponent of 0 (actually 127 biased) MASK equ 0000000ffh ;to mask off all but last 8 bits (int expon) MASKE equ 0007fffffh ;to mask expon (in its original pos) arg3 equ 40 arg2 equ 32 arg1 equ 24 arg_1 equ -8 I 7 E 7 #ifdef SingleLib global _asin ;single precision library _asin: I 8 ; MCOUNT E 8 I 7 #ifndef ARGSINREGS E 7 load r0,r14,arg1 I 7 #endif E 7 #else global _s_asin ;rc and rp global _r_asin ;f77 global _R_asin ;rf _s_asin: I 8 ; MCOUNT E 8 I 7 #ifndef ARGSINREGS E 7 load r0,r14,arg1 I 7 #endif E 7 br _R_asin _r_asin: I 8 ; MCOUNT E 8 I 7 #ifndef ARGSINREGS E 7 load r0,r14,arg1 ;get argument I 7 #endif E 7 load r0,r0,0 _R_asin: I 8 ; MCOUNT E 8 D 7 #endif SingleLib E 7 I 7 #endif E 7 laddr r1,ABS,L and r1,r0 ;r1="x=abs(arg)" laddr r2,ONE,L br r1>r2,toobig ;if x>1.0 then toobig else ... laddr r2,LIMIT,L br r10,err_rtn ;yes (assume user will change r0 if yes ) mess: ;prints out our error message move r0,2 I 7 #ifdef ARGSINREGS laddr r1,emess,L laddr r2,messlen call LINK,_write,L ;writes out message #else E 7 store r0,r14,arg1 laddr r5,emess,L store r5,r14,arg2 ;gives message laddr r0,messlen store r0,r14,arg3 ;gives length of message call r11,_write,L ;writes out message I 7 #endif E 7 laddr r0,EDOM ;sets global variable _errno for user store r0,_errno,L D 7 E 7 I 7 #ifdef ARGSINREGS load r4,STKPTR,arg_1 ;restore r4's old value (if inf or not) #else E 7 load r4,r14,arg_1 ;restore r4's old value (if inf or not) I 7 #endif E 7 br r4=0,inf ;if abs(arg)="infinity" then go to inf br r4<0,nan ;if abs(arg) is not-a-number then go to nan err_rtn: ;resets all old pointers and returns zero I 7 #ifdef ARGSINREGS laddr STKPTR,STKPTR,pe_size ;user will have already used matherr for himself load LINK,STKPTR,0 move r0,0 ;to return 0 ret LINK,LINK #else E 7 move r14,r15 ;user will have already used matherr for himself load r15,r14,8 load r11,r14,0 move r0,0 ;to return 0 ret r11,r11 I 7 #endif E 7 inf: move r0,2 ;to print I 7 #ifdef ARGSINREGS laddr r1,infmess,L laddr r2,inflen call LINK,_write,L #else E 7 store r0,r14,arg1 laddr r5,infmess,L store r5,r14,arg2 ;gives write the message laddr r0,inflen store r0,r14,arg3 ;gives write the length of message call r11,_write,L I 7 #endif E 7 br err_rtn nan: move r0,2 ;to print I 7 #ifdef ARGSINREGS laddr r1,nanmess,L laddr r2,nanlen call LINK,_write,L #else E 7 store r0,r14,arg1 laddr r5,nanmess,L store r5,r14,arg2 ;gives write the message laddr r0,nanlen store r0,r14,arg3 ;gives write the length of message call r11,_write,L I 7 #endif E 7 br err_rtn E 1 h23703 s 00004/00000/00254 d D 4.3 87/04/16 13:56:43 mth 8 7 c Profiling changes e s 00064/00010/00190 d D 4.2 87/02/16 17:10:04 mth 7 6 c Parameters in registers. e s 00000/00000/00200 d D 4.1 87/02/16 16:58:31 mth 6 5 c rolled rev to -r4 (mth) e s 00002/00002/00198 d D 3.3 87/01/31 13:28:28 mkm 5 4 c correct compatability probs between ROS and SPIX as. -mkm e s 00000/00000/00200 d D 3.2 87/01/31 11:54:34 mkm 4 3 c from ROS sources as of this date. -mkm e s 00000/00000/00200 d D 3.1 87/01/21 17:46:41 mkm 3 2 c e s 00000/00000/00200 d D 2.1 87/01/21 17:44:03 mkm 2 1 c e s 00200/00000/00000 d D 1.1 87/01/21 17:42:04 mkm 1 0 c Placed under source control - mkm c These files are direct descendants of the ROS files c by the same name at or about ROS rev 5.1 e u U f b f n t T I 1 ; "%W% %G%" dsect data name byte 'atan',0 ;name of routine emess byte 'atan: DOMAIN error\n',0 ;error message messlen equ 19 ;length of message D 5 nanmess byte 'atan: input value was NAN\n",0 ;error message if nan E 5 I 5 nanmess byte 'atan: input value was NAN\n',0 ;error message if nan E 5 nanlen equ 26 D 5 infmess byte 'atan: input value was INF\n",0 ;error message if "infinity" E 5 I 5 infmess byte 'atan: input value was INF\n',0 ;error message if "infinity" E 5 inflen equ 26 csect code align 2 externd _errno external _write external _matherr e_type equ -32 ;exception type e_name equ -28 ;name of routine in error e_arg1 equ -24 ;argument 1 e_arg2 equ -16 ;argument 2 (if present) e_retval equ -8 ;room for exception block e_size equ -80 ; plus stack frame with 3 parameters I 7 #ifdef ARGSINREGS pe_size equ 80 ; positive e_size #else pe_size equ 0 ; positive e_size #endif E 7 DOMAIN equ 1 SING equ 2 OVERFLOW equ 3 UNDERFLOW equ 4 TLOSS equ 5 PLOSS equ 6 EDOM equ 33 ERANGE equ 34 csect code C1 equ 0bc2bff24h ;equals -.010497842 C2 equ 0bf2cddbch ;equals -6.75258397 C3 equ 0bf9b537ah ;equals -1.21348506 C4 equ 04086b4eah ;equals 4.20958442 C5 equ 04068fdb6h ;equals 3.64048526 PID2 equ 03fc90fdbh ;equals pi/2 = 1.5707963268 ONE equ 03f800000h ;equals one ABS equ 07fffffffh ;to get the absolute value of an argument INF equ 07f800000h ;equals infinity LIMIT equ 053518c2eh ;equals 9e11 LOWLIM equ 03727c5ach ;equals 1e5 done by hlf 1/11/84 arg3 equ 40 arg2 equ 32 arg1 equ 24 I 7 E 7 #ifdef SingleLib global _atan ;single precision library _atan: I 8 ; MCOUNT E 8 I 7 #ifndef ARGSINREGS E 7 load r0,r14,arg1 I 7 #endif E 7 #else global _s_atan ;rc and rp global _r_atan ;f77 global _R_atan ;rf _s_atan: I 8 ; MCOUNT E 8 I 7 #ifndef ARGSINREGS E 7 load r0,r14,arg1 I 7 #endif E 7 br _R_atan _r_atan: I 8 ; MCOUNT E 8 I 7 #ifndef ARGSINREGS E 7 load r0,r14,arg1 I 7 #endif E 7 load r0,r0,0 ;get arg _R_atan: I 8 ; MCOUNT E 8 D 7 #endif SingleLib E 7 I 7 #endif E 7 laddr r1,ABS,L and r1,r0 ;r1="x=abs(arg)" D 7 E 7 laddr r2,LOWLIM,L rcomp r2,r1 br r2>0,toosml laddr r2,LIMIT,L br r1>=r2,toobig ;if x>=9e11 then toobig else ... laddr r2,ONE,L br r1r2,nan ;elseif x=nan then nan else ... laddr r1,PID2,L ;return pi divided by 2 br sign ; ; error handling ; nan: ;loads values into error structure in case user ;wishes to do more with them than we have done D 7 E 7 I 7 #ifdef ARGSINREGS store LINK,STKPTR,0 ;save old return laddr STKPTR,STKPTR,e_size ;update stack #else E 7 store r11,r14,0 ;save old return store r15,r14,8 ;save old frame pointer move r15,r14 laddr r14,r14,e_size ;update stack I 7 #endif E 7 D 7 store r0,r15,e_arg1 ;load arg's value into error structure E 7 I 7 store r0,STKPTR,pe_size+e_arg1 ;load arg's value into error structure E 7 laddr r2,name,L ;name of offending routine D 7 store r2,r15,e_name ; into error structure E 7 I 7 store r2,STKPTR,pe_size+e_name ; into error structure E 7 move r3,DOMAIN ;exception type D 7 store r3,r15,e_type E 7 I 7 store r3,STKPTR,pe_size+e_type E 7 laddr r1,PID2,L D 7 store r1,r15,e_retval ;return pi_2 E 7 I 7 store r1,STKPTR,pe_size+e_retval ;return pi_2 E 7 I 7 #ifdef ARGSINREGS laddr r0,STKPTR,pe_size+e_type ;user want to do different anything with error? call LINK,_matherr,L ;matherr is a function for user to define #else E 7 laddr r4,r15,e_type ;user want to do different anything with error? store r4,r14,arg1 ;gives matherr the address of error structure call r11,_matherr,L ;matherr is a function for user to define I 7 #endif E 7 br r0<>0,err_rtn ;yes (assume user will change r0 if yes ) mess: ;prints out our error message move r0,2 I 7 #ifdef ARGSINREGS laddr r1,emess,L laddr r2,messlen call LINK,_write,L ;writes out message #else E 7 store r0,r14,arg1 laddr r5,emess,L store r5,r14,arg2 ;gives message laddr r0,messlen store r0,r14,arg3 ;gives length of message call r11,_write,L ;writes out message I 7 #endif E 7 laddr r0,EDOM ;sets global variable _errno for user store r0,_errno,L move r0,2 ;to print I 7 #ifdef ARGSINREGS laddr r1,nanmess,L laddr r2,nanlen call LINK,_write,L #else E 7 store r0,r14,arg1 laddr r5,nanmess,L store r5,r14,arg2 ;gives write the message laddr r0,nanlen store r0,r14,arg3 ;gives write the length of message call r11,_write,L I 7 #endif E 7 err_rtn: ;resets all old pointers and returns pi div 2 I 7 #ifdef ARGSINREGS laddr STKPTR,STKPTR,pe_size ;user will have already used matherr for himself load LINK,STKPTR,0 laddr r0,PID2,L ret LINK,LINK #else E 7 move r14,r15 ;user will have already used matherr for himself load r15,r14,8 load r11,r14,0 laddr r0,PID2,L ret r11,r11 I 7 #endif E 7 inf: I 7 #ifdef ARGSINREGS store LINK,STKPTR,0 ;save old return laddr STKPTR,STKPTR,e_size ;update stack #else E 7 store r11,r14,0 ;save old return store r15,r14,8 ;save old pointer move r15,r14 ;save old r14 pointer laddr r14,r14,e_size ;update stack I 7 #endif E 7 move r0,2 ;to print I 7 #ifdef ARGSINREGS laddr r1,infmess,L laddr r2,inflen call LINK,_write,L #else E 7 store r0,r14,arg1 laddr r5,infmess,L store r5,r14,arg2 ;gives write the message laddr r0,inflen store r0,r14,arg3 ;gives write the length of message call r11,_write,L I 7 #endif E 7 br err_rtn D 7 E 7 E 1 h07682 s 00004/00000/00429 d D 4.3 87/04/16 13:56:47 mth 8 7 c Profiling changes e s 00087/00014/00342 d D 4.2 87/02/19 08:48:37 mth 7 6 c Parameters in registers e s 00000/00000/00356 d D 4.1 87/02/19 08:42:59 mth 6 5 c rolled rev to -r4 (mth) e s 00003/00003/00353 d D 3.3 87/01/31 13:28:32 mkm 5 4 c correct compatability probs between ROS and SPIX as. -mkm e s 00000/00000/00356 d D 3.2 87/01/31 11:54:37 mkm 4 3 c from ROS sources as of this date. -mkm e s 00000/00000/00356 d D 3.1 87/01/21 17:46:43 mkm 3 2 c e s 00000/00000/00356 d D 2.1 87/01/21 17:44:06 mkm 2 1 c e s 00356/00000/00000 d D 1.1 87/01/21 17:42:05 mkm 1 0 c Placed under source control - mkm c These files are direct descendants of the ROS files c by the same name at or about ROS rev 5.1 e u U f b f n t T I 1 ; "%W% %G%" dsect data pi: ;initialize array pi word 1059250176 ;equals . word 969670656 word 878411776 word 782008320 word 679641088 word 596959232 word 510689280 word 418045952 word 324132864 word 229220352 ;equals .10453948e-29 name byte 'cos',0 ;name of routine D 5 emess byte 'cos: TLOSS error\n",0 ;error message E 5 I 5 emess byte 'cos: TLOSS error\n',0 ;error message E 5 messlen equ 17 ;length of message D 5 nanmess byte 'cos: input value was NAN\n",0 ;error message if nan E 5 I 5 nanmess byte 'cos: input value was NAN\n',0 ;error message if nan E 5 nanlen equ 25 D 5 infmess byte 'cos: input value was INF\n",0 ;error message if "infinity" E 5 I 5 infmess byte 'cos: input value was INF\n',0 ;error message if "infinity" E 5 inflen equ 25 csect code align 2 externd _errno external _write external _matherr e_type equ -32 ;exception type e_name equ -28 ;name of routine in error e_arg1 equ -24 ;argument 1 e_arg2 equ -16 ;argument 2 (if present) e_retval equ -8 ;room for exception block e_size equ -80 ; plus stack frame with 3 parameters I 7 #ifdef ARGSINREGS pe_size equ 80 ; positive e_size #else pe_size equ 0 ; positive e_size #endif E 7 DOMAIN equ 1 SING equ 2 OVERFLOW equ 3 UNDERFLOW equ 4 TLOSS equ 5 PLOSS equ 6 EDOM equ 33 ERANGE equ 34 csect code C3 equ 0be2aaaa0h ;equals -1.66666502e-1 C2 equ 03c088302h ;equals 8.33201640e-3 C1 equ 0b94c7dc9h ;equals -1.95018148e-4 CC3 equ 0beffffcbh ;equals -4.99998424e-1 CC2 equ 03d2a9dd3h ;equals 4.16544195e-2 CC1 equ 0bab1fcebh ;equals -1.35794036e-3 PI1 equ 03f22e000h ;equals pi[1]=.63623047 PID2 equ 03fc90fdbh ;equals pi divided by 2 = 1.5707963 PIU equ 0400921fbh PIL equ 054442d19h ;equals pi in double precision PI equ 040490fdbh ;equals pi in single precision LARGE equ 0495bba00h ;equals 9.0e5, largest # we calculate directly MMANT equ 0000000ffh ;to mask off mantissa and sign of rotated # MASK equ 0fffff800h ;to mask off 11 low order bits LIMIT equ 04f000000h ;equals 2147483647 LIMIT2 equ 03f490ff9h ;equals .7854 radians = 45 degrees SINLIM equ 03fc00000h ;equals pi/2 = 1.50 EBIAS equ 127 ;to unbias the exponent ONE equ 03f800000h ;equals one ABS equ 07fffffffh ;to find the absolute value of the argument INF equ 07f800000h ;equals infinity MIN equ 03951b717h ;equals 2e-4 as a lower bound arg3 equ 40 arg2 equ 32 arg1 equ 24 arg equ -4 arg_1 equ -8 arg_2 equ -16 I 7 E 7 #ifdef SingleLib global _cos ;single precision library _cos: I 8 ; MCOUNT E 8 I 7 #ifndef ARGSINREGS E 7 load r0,r14,arg1 I 7 #endif E 7 #else global _s_cos ;rc and rp global _r_cos ;f77 global _R_cos ;rf D 7 _s_cos: load r0,r14,arg1 E 7 I 7 _s_cos: I 8 ; MCOUNT E 8 #ifndef ARGSINREGS load r0,r14,arg1 #endif E 7 br _R_cos _r_cos: I 8 ; MCOUNT E 8 I 7 #ifndef ARGSINREGS E 7 load r0,r14,arg1 I 7 #endif E 7 load r0,r0,0 ;get argument _R_cos: I 8 ; MCOUNT E 8 D 7 #endif SingleLib E 7 I 7 #endif E 7 laddr r2,ABS,L and r2,r0 ;r2=abs(arg) laddr r1,LARGE,L br r2>r1,big ;if abs(arg)>LARGE then big else ... pi_reduce: ;r0="result",arg stored at r14+arg; r1="upper"; r2="lower"; r3="cutoff"(int) ;r4="mult"; r5="rlower"; r6="i"(int); r7=%logb,i+1,itemp,rtemp; r8= variables I 7 #ifdef ARGSINREGS stored r7,STKPTR,arg_2 ;save r7 and r8 for variables store r2,STKPTR,arg ;save abs(arg) #else E 7 store r6,r14,arg_1 ;save r6 for use as "i" and other variables stored r7,r14,arg_2 ;save r7 and r8 for variables store r2,r14,arg ;save abs(arg) I 7 #endif E 7 laddr r1,LIMIT2,L br r2=r3,cont! ;while (%t_logb(result) < cutoff) laddr r8,24 br r6>=r8,cont ;and (i+2 < prec) do ... move r7,4 add r7,r6 ;r7="i+1" load r8,r7,pi,L ;r8="pi[i+1]" rmpy r8,r1 ;"upper*pi[i+1]" load r7,r6,pi,L ;r7="pi[i]" rmpy r7,r2 ;"lower*pi[i]" radd r7,r8 ;"(... + ...)" radd r5,r7 ;r5="rlower=rlower+(lower*pi[i]+upper*pi[i+1])" move r7,r0 radd r7,r5 ;r7="rtemp=result+rlower" laddr r8,03f000000h,L ;equals .5 br r7= .5 then ... else ifnot fixr r7,r7 ;r7="itemp=round(rtemp)" add r4,r7 ;r4="mult=mult+itemp" float r7,r7 ;converts r7 to a real to use rsub on it rsub r0,r7 ;r0="result=result-rtemp" move r7,r0 radd r7,r0 ;r7="rtemp=result+rlower" ifnot: rsub r0,r7 ;"(result-rtemp)" radd r5,r0 ;r5="rlower=(result-rtemp)+rlower" move r0,r7 ;r0="result=rtemp" move r8,11 ;"halfsz" sub r3,r8 ;r3="cutoff=cutoff-halfsz" add r6,4 ;r6="i=i+1" br while ;loop cont: ;assumes r1,r3 are free for use as variables load r1,r6,pi,L ;r1=pi[i].rr rmpy r2,r1 ;r2="lower*pi[i].rr" add r6,4 ;r6=i=i+1 load r1,r6,pi,L ;r1=pi[i+1].rr add r6,4 ;r6=i=i+1 load r3,r6,pi,L ;r3=pi[i+2].rr radd r3,r1 ;r3="(pi[i+1].rr + pi[i+2].rr)" I 7 #ifdef ARGSINREGS load r1,STKPTR,arg ;restore saved original argument to r1 #else E 7 load r1,r14,arg ;restore saved original argument to r1 I 7 #endif E 7 rmpy r1,r3 ;"arg * (...)" radd r1,r2 ;"(...)+arg*(...)" radd r1,r5 ;"(... + rlower)" radd r0,r1 ;"(... + result)" laddr r1,PID2,L rmpy r0,r1 ;r0="result= piover2 * (( (lower*pi[i] + arg ; *(pi[i+1] + pi[i+2])) +rlower)+result)" sncs: ;final calculations -uses r0="x" (old result) I 7 #ifdef ARGSINREGS loadd r7,STKPTR,arg_2 ;restore old saved r7 and r8's value #else E 7 load r6,r14,arg_1 ;restore old saved r6's value loadd r7,r14,arg_2 ;restore old saved r7 and r8's value I 7 #endif E 7 move r5,1 move r1,r0 ;r1=r0="x" rmpy r1,r1 ;r1="xsq=sqr(x)" add r4,1 ;r4="mult=mult+sin_cos_flag" laddr r2,000000001h,L and r2,r4 br r2<>0,odd ;if odd(mult) then odd else ... even: laddr r2,C1,L ;C1 rmpy r2,r1 ;"xsq*(C1)" laddr r3,C2,L ;C2 radd r2,r3 ;"C2+...)" rmpy r2,r1 ;"xsq*..." laddr r3,C3,L ;C3 radd r2,r3 ;"(C3+...)" rmpy r2,r1 ;"xsq*..." rmpy r2,r0 ;"x*..." radd r0,r2 ;r0="result=x+..." fini: move r2,2 and r2,r4 br r2=2,negate ;"if (odd(mult div 2)) then result=-result br r5<0,negate ;special negate flag for pi/4 < arg < pi/2 I 7 #ifdef ARGSINREGS ret LINK,LINK ;else we're done!!! #else E 7 ret r11,r11 ;else we're done!!! I 7 #endif E 7 negate: rneg r0,r0 ;r0="result=-result" D 7 ret r11,r11 ;done!!! E 7 I 7 #ifdef ARGSINREGS ret LINK,LINK ;else we're done!!! #else ret r11,r11 ;else we're done!!! #endif E 7 done: laddr r0,03f800000h,L ;return 1.0 as the result D 7 ret r11,r11 E 7 I 7 #ifdef ARGSINREGS ret LINK,LINK ;else we're done!!! #else ret r11,r11 ;else we're done!!! #endif E 7 mult0: laddr r4,MIN,L ;r4=minimum argument to compute br r2LIMIT then badinput makerd r2,r2 ;make abs(arg) a double laddr r4,PIU,L laddr r5,PIL,L ;rp4=pi as a double precision number drdiv r2,r4 ;rp2= arg/pi dfixt r1,r2 ;r1=integer part of result dfloat r4,r1 ;rp4=integer part of result as double drsub r2,r4 ;subtract off integer part of result makedr r2,r2 ;convert the fraction part of result to real move r3,1 and r1,r3 ;to see if integer part of result odd br r1=0,bigeven laddr r1,03f800000h,L ;if so then add 1.0 to result's fraction radd r2,r1 bigeven: ;else continue laddr r1,PI,L ;r2=pi as a single precision number rmpy r2,r1 ;r2=the massively reduced big number br pi_reduce odd: laddr r2,CC1,L ;CC1 rmpy r2,r1 ;"xsq*(CC1)" laddr r3,CC2,L ;CC2 radd r2,r3 ;"CC2+...)" rmpy r2,r1 ;"xsq*..." laddr r3,CC3,L ;CC3 radd r2,r3 ;"(CC3+...)" rmpy r2,r1 ;"xsq*..." laddr r0,ONE,L radd r0,r2 ;r0="result=1+..." sub r4,1 ;r4="mult=mult-1" br fini ; ; error handling ; badinput: ;returns info to user about input error laddr r4,INF,L rcomp r4,r2 ;r4=0 if x=inf, r4=-1 if x=nan ,r4=1 if other struct: ;loads values into error structure in case user ;wishes to do more with them than we have done D 7 E 7 I 7 #ifdef ARGSINREGS store LINK,STKPTR,0 ;save old return laddr STKPTR,STKPTR,e_size ;update stack store r4,STKPTR,arg_1 ;saves r4's value (ie whether or not it's inf) #else E 7 store r11,r14,0 ;save old return store r15,r14,8 ;save old frame pointer move r15,r14 laddr r14,r14,e_size ;update stack D 7 E 7 store r4,r14,arg_1 ;saves r4's value (ie whether or not it's inf) D 7 store r0,r15,e_arg1 ;load arg's value into error structure E 7 I 7 #endif store r0,STKPTR,pe_size+e_arg1 ;load arg's value into error structure E 7 laddr r2,name,L ;name of offending routine D 7 store r2,r15,e_name ; into error structure E 7 I 7 store r2,STKPTR,pe_size+e_name ; into error structure E 7 move r3,TLOSS ;exception type D 7 store r3,r15,e_type E 7 I 7 store r3,STKPTR,pe_size+e_type E 7 move r0,0 D 7 store r0,r15,e_retval ;return 0 E 7 I 7 store r0,STKPTR,pe_size+e_retval ;return 0 E 7 I 7 #ifdef ARGSINREGS laddr r0,STKPTR,pe_size+e_type ;user want to do different anything with error? call LINK,_matherr,L ;matherr is a function for user to define #else E 7 laddr r4,r15,e_type ;user want to do different anything with error? store r4,r14,arg1 ;gives matherr the address of error structure call r11,_matherr,L ;matherr is a function for user to define I 7 #endif E 7 br r0<>0,err_rtn ;yes (assume user will change r0 if yes ) mess: ;prints out our error message move r0,2 I 7 #ifdef ARGSINREGS laddr r1,emess,L laddr r2,messlen call LINK,_write,L ;writes out message #else E 7 store r0,r14,arg1 laddr r5,emess,L store r5,r14,arg2 ;gives message laddr r0,messlen store r0,r14,arg3 ;gives length of message call r11,_write,L ;writes out message I 7 #endif E 7 laddr r0,ERANGE ;sets global variable _errno for user store r0,_errno,L D 7 E 7 I 7 #ifdef ARGSINREGS load r4,STKPTR,arg_1 ;restore r4's old value (if inf or not) #else E 7 load r4,r14,arg_1 ;restore r4's old value (if inf or not) I 7 #endif E 7 br r4=0,inf ;if abs(arg)="infinity" then go to inf br r4<0,nan ;if abs(arg) is not-a-number then go to nan ;else return err_rtn: ;resets all old pointers and returns zero I 7 #ifdef ARGSINREGS laddr STKPTR,STKPTR,pe_size ;user will have already used matherr for himself load LINK,STKPTR,0 move r0,0 ;return 0 ret LINK,LINK #else E 7 move r14,r15 ;user will have already used matherr for himself load r15,r14,8 load r11,r14,0 move r0,0 ;return 0 ret r11,r11 I 7 #endif E 7 inf: move r0,2 ;to print I 7 #ifdef ARGSINREGS laddr r1,infmess,L laddr r2,inflen call LINK,_write,L #else E 7 store r0,r14,arg1 laddr r5,infmess,L store r5,r14,arg2 ;gives write the message laddr r0,inflen store r0,r14,arg3 ;gives write the length of message call r11,_write,L I 7 #endif E 7 br err_rtn nan: move r0,2 ;to print I 7 #ifdef ARGSINREGS laddr r1,nanmess,L laddr r2,nanlen call LINK,_write,L #else E 7 store r0,r14,arg1 laddr r5,nanmess,L store r5,r14,arg2 ;gives write the message laddr r0,nanlen store r0,r14,arg3 ;gives write the length of message call r11,_write,L I 7 #endif E 7 br err_rtn D 7 E 7 E 1 h63765 s 00004/00000/00291 d D 4.3 87/04/16 13:56:50 mth 8 7 c Profiling changes e s 00057/00012/00234 d D 4.2 87/02/19 08:48:40 mth 7 6 c Parameters in registers e s 00000/00000/00246 d D 4.1 87/02/19 08:43:00 mth 6 5 c rolled rev to -r4 (mth) e s 00002/00002/00244 d D 3.3 87/01/31 13:28:34 mkm 5 4 c correct compatability probs between ROS and SPIX as. -mkm e s 00000/00000/00246 d D 3.2 87/01/31 11:54:39 mkm 4 3 c from ROS sources as of this date. -mkm e s 00000/00000/00246 d D 3.1 87/01/21 17:46:46 mkm 3 2 c e s 00000/00000/00246 d D 2.1 87/01/21 17:44:08 mkm 2 1 c e s 00246/00000/00000 d D 1.1 87/01/21 17:42:06 mkm 1 0 c Placed under source control - mkm c These files are direct descendants of the ROS files c by the same name at or about ROS rev 5.1 e u U f b f n t T I 1 ; "%W% %G%" dsect data name byte 'cosh',0 ;name of routine ;no message D 5 nanmess byte 'cosh: input value was NAN\n",0 ;error message if nan E 5 I 5 nanmess byte 'cosh: input value was NAN\n',0 ;error message if nan E 5 nanlen equ 26 D 5 infmess byte 'cosh: input value was INF\n",0 ;error message if "infinity" E 5 I 5 infmess byte 'cosh: input value was INF\n',0 ;error message if "infinity" E 5 inflen equ 26 csect code align 2 externd _errno external _write external _matherr e_type equ -32 ;exception type e_name equ -28 ;name of routine in error e_arg1 equ -24 ;argument 1 e_arg2 equ -16 ;argument 2 (if present) e_retval equ -8 ;room for exception block e_size equ -80 ; plus stack frame with 3 parameters I 7 #ifdef ARGSINREGS pe_size equ 80 ; positive e_size #else pe_size equ 0 ; positive e_size #endif E 7 DOMAIN equ 1 SING equ 2 OVERFLOW equ 3 UNDERFLOW equ 4 TLOSS equ 5 PLOSS equ 6 EDOM equ 33 ERANGE equ 34 C1 equ 03ab9aa6ah ;equals .00141651677 C2 equ 03d2aa0b8h ;equals .0416571793 C3 equ 03f000011h ;equals .166666786 LIMIT equ 03f400000h ;equals .75 MINUS2 equ 0fffffffeh ;equals -2 as as integer ONE equ 03f800000h ;equals 1 ;constants for e_reduce CC1 equ 03d6c5665h ;equals .05769958151 CC2 equ 040e6e1ach ;equals 7.21504804 CC3 equ 041a68bbbh ;equals 20.81822806 UL2I equ 03fb8a000h ;equals 1.4423828125 = upper_log_2_inv LL2I equ 039a3b296h ;equals .000312228389 = lower_log_2_inv MAXIN equ 0461c4000h ;equals 10,000 HALF equ 03f000000h ;equals .5 ABS equ 07fffffffh ;to find the absolute value of an argument HALFSZ equ 0fffff800h ;to mask off lower part of exponent MASK equ 07f800000h ;to mask off mantissa and sign bit MASKE equ 0807fffffh ;to mask off exponent INF equ 07f800000h ;equals infinity arg3 equ 40 arg2 equ 32 arg1 equ 24 arg_1 equ -8 I 7 E 7 #ifdef SingleLib global _cosh ;single precision library _cosh: I 8 ; MCOUNT E 8 I 7 #ifndef ARGSINREGS E 7 load r0,r14,arg1 I 7 #endif E 7 #else global _s_cosh ;rc and rp global _r_cosh ;f77 global _R_cosh ;rf _s_cosh: I 8 ; MCOUNT E 8 I 7 #ifndef ARGSINREGS E 7 load r0,r14,arg1 I 7 #endif E 7 br _R_cosh _r_cosh: I 8 ; MCOUNT E 8 I 7 #ifndef ARGSINREGS E 7 load r0,r14,arg1 I 7 #endif E 7 load r0,r0,0 ;get arg _R_cosh: I 8 ; MCOUNT E 8 D 7 #endif SingleLib E 7 I 7 #endif E 7 laddr r1,ABS,L and r1,r0 ;r1="x=abs(arg)" laddr r2,MAXIN,L br r1>r2,toobig ;if x>maxinput then toobig else ... laddr r2,LIMIT,L br r1>=r2,greater ;if x<.75 then ... else greater laddr r2,r1 rmpy r2,r2 ;r2="xsq=sqr(x)" laddr r3,C1,L ;C1 rmpy r3,r2 ;"xsq*(C1)" laddr r4,C2,L ;C2 radd r3,r4 ;"(C2 + ...)" rmpy r3,r2 ;"xsq * (...)" laddr r4,C3,L ;C3 radd r3,r4 ;"(C3 + ...)" rmpy r2,r3 ;"xsq * (...)" laddr r1,ONE,L radd r1,r2 ;r1="result=1.0+xsq*(C3+xsq*(C2+xsq*(C1)))" br done greater: e_reduce: laddr r2,HALFSZ,L and r2,r1 ;r2="upper=%t_halfsz(arg)" laddr r3,r1 rsub r3,r2 ;r3="lower=arg-upper" laddr r4,UL2I,L rmpy r2,r4 ;r2="x=upper*upper_log_2_inv" fixr r4,r2 ;r4="mult=round(x)" float r4,r4 ;make r4 a real to use rsub rsub r2,r4 ;"(x-mult)" fixt r4,r4 ;reconverts r4 to integer laddr r5,UL2I,L ; rmpy r3,r5 ;"lower*upper_log_2_inv" laddr r5,LL2I,L rmpy r1,r5 ;"arg*lower_log_2_inv" radd r1,r3 radd r1,r2 ;r1="x=(x-mult)+(lower*UL2I + arg*LL2I)" laddr r2,r1 rmpy r2,r2 ;r2="xsq=sqr(x)" laddr r3,CC1,L ;CC1 rmpy r3,r2 ;"CC1*xsq)" laddr r5,CC2,L ;CC2 radd r3,r5 ;"(CC2+CC1*xsq)" rmpy r1,r3 ;r1="p=x * (CC2 + CC1 * xsq)" laddr r3,CC3,L ;CC3 radd r2,r3 ;r2="q=CC3+xsq" contgreater: ;continues calculations after e_reduce rsub r2,r1 ;"(q-p)" rdiv r1,r2 ;r1="x=p / (q - p)" laddr r2,14 br r4>=r2,cont ;if mult<14 then ... else cont laddr r5,MINUS2,L mpy r5,r4 sub r5,1 ;r5="-2*mult-1" laddr r3,HALF,L radd r3,r1 ;"(x+.5)" laddr r2,HALF,L rdiv r2,r3 ;r2=".5 / (x+.5)" pack1: laddr r3,MASK,L and r3,r2 ;r3 gets the exponent of r2 csl r3,9 ;makes it an integer add r3,r5 ;adds u.exp and mult laddr r5,23 csl r3,r5 ;places u.exp + mult in exponents place laddr r5,MASKE,L and r2,r5 or r2,r3 ;r2="%t_pack(.5/(x+.5),-2*mult-1,xsq)" radd r1,r2 ;r1="x=x+xsq" cont: laddr r2,HALF,L radd r1,r2 ;r1=".5+x" pack: laddr r2,MASK,L and r2,r1 ;r2 gets only the exponent of r2 csl r2,9 ;makes exponent an integer add r2,r4 ;r2="u.exp=u.exp+mult" laddr r3,23 csl r2,r3 ;places new exponent in appropriate position laddr r3,MASKE,L and r1,r3 ;clear x of exponent or r1,r2 ;r1="%t_pack(.5+x,mult,result)" done: laddr r0,r1 I 7 #ifdef ARGSINREGS ret LINK,LINK #else E 7 ret r11,r11 I 7 #endif E 7 toobig: laddr r4,INF,L rcomp r4,r1 ;if x=inf then r4=0, if x=nan then r4=-1 ; ; error handling ; badinput: ;returns info to user about input error struct: ;loads values into error structure in case user ;wishes to do more with them than we have done D 7 E 7 I 7 #ifdef ARGSINREGS store LINK,STKPTR,0 ;save old return laddr STKPTR,STKPTR,e_size ;update stack store r4,STKPTR,arg_1 ;saves r4's value (ie whether or not it's inf) #else E 7 store r11,r14,0 ;save old return store r15,r14,8 ;save old frame pointer move r15,r14 laddr r14,r14,e_size ;update stack D 7 E 7 store r4,r14,arg_1 ;saves r4's value (ie whether or not it's inf) I 7 #endif E 7 D 7 store r0,r15,e_arg1 ;load arg's value into error structure E 7 I 7 store r0,STKPTR,pe_size+e_arg1 ;load arg's value into error structure E 7 laddr r2,name,L ;name of offending routine D 7 store r2,r15,e_name ; into error structure E 7 I 7 store r2,STKPTR,pe_size+e_name ; into error structure E 7 br r0>0,ovrflw ;if arg>10,000 then overflow else underflow udrflw: move r3,UNDERFLOW ;exception type D 7 store r3,r15,e_type E 7 I 7 store r3,STKPTR,pe_size+e_type E 7 br conterr ovrflw: move r3,OVERFLOW ;exception type D 7 store r3,r15,e_type E 7 I 7 store r3,STKPTR,pe_size+e_type E 7 conterr: laddr r0,INF,L D 7 store r0,r15,e_retval ;return inf E 7 I 7 store r0,STKPTR,pe_size+e_retval ;return inf E 7 I 7 #ifdef ARGSINREGS laddr r0,STKPTR,pe_size+e_type ;user want to do different anything with error? call LINK,_matherr,L ;matherr is a function for user to define #else E 7 laddr r4,r15,e_type ;user want to do different anything with error? store r4,r14,arg1 ;gives matherr the address of error structure call r11,_matherr,L ;matherr is a function for user to define I 7 #endif E 7 br r0<>0,err_rtn ;yes (assume user will change r0 if yes ) laddr r0,ERANGE ;sets global variable _errno for user store r0,_errno,L D 7 E 7 I 7 #ifdef ARGSINREGS load r4,STKPTR,arg_1 ;restore r4's old value (if inf or not) #else E 7 load r4,r14,arg_1 ;restore r4's old value (if inf or not) I 7 #endif E 7 br r4=0,inf ;if abs(arg)="infinity" then go to inf br r4<0,nan ;if abs(arg) is not-a-number then go to nan err_rtn: ;resets all old pointers and returns inf I 7 #ifdef ARGSINREGS laddr STKPTR,STKPTR,pe_size ;user will have already used matherr for himself load LINK,STKPTR,0 laddr r0,INF,L ;returns inf ret LINK,LINK #else E 7 move r14,r15 ;user will have already used matherr for himself load r15,r14,8 load r11,r14,0 D 7 laddr r0,07ff00000h,L E 7 laddr r0,INF,L ;returns inf ret r11,r11 D 7 E 7 I 7 #endif E 7 inf: move r0,2 ;to print I 7 #ifdef ARGSINREGS laddr r1,infmess,L laddr r2,inflen call LINK,_write,L #else E 7 store r0,r14,arg1 laddr r5,infmess,L store r5,r14,arg2 ;gives write the message laddr r0,inflen store r0,r14,arg3 ;gives write the length of message call r11,_write,L I 7 #endif E 7 br err_rtn nan: move r0,2 ;to print I 7 #ifdef ARGSINREGS laddr r1,nanmess,L laddr r2,nanlen call LINK,_write,L #else E 7 store r0,r14,arg1 laddr r5,nanmess,L store r5,r14,arg2 ;gives write the message laddr r0,nanlen store r0,r14,arg3 ;gives write the length of message call r11,_write,L I 7 #endif E 7 br err_rtn E 1 h12622 s 00004/00000/00394 d D 4.3 87/04/16 13:56:45 mth 8 7 c Profiling changes e s 00087/00013/00307 d D 4.2 87/02/19 08:48:34 mth 7 6 c Parameters in registers e s 00000/00000/00320 d D 4.1 87/02/19 08:42:57 mth 6 5 c rolled rev to -r4 (mth) e s 00002/00002/00318 d D 3.3 87/01/31 13:28:29 mkm 5 4 c correct compatability probs between ROS and SPIX as. -mkm e s 00000/00000/00320 d D 3.2 87/01/31 11:54:36 mkm 4 3 c from ROS sources as of this date. -mkm e s 00000/00000/00320 d D 3.1 87/01/21 17:46:42 mkm 3 2 c e s 00000/00000/00320 d D 2.1 87/01/21 17:44:04 mkm 2 1 c e s 00320/00000/00000 d D 1.1 87/01/21 17:42:05 mkm 1 0 c Placed under source control - mkm c These files are direct descendants of the ROS files c by the same name at or about ROS rev 5.1 e u U f b f n t T I 1 ; "%W% %G%" dsect data name byte 'atan2',0 ;name of routine emess byte 'atan2: DOMAIN error\n',0 ;error message messlen equ 20 ;length of message D 5 nanmess byte 'atan2: input value was NAN\n",0 ;error message if nan E 5 I 5 nanmess byte 'atan2: input value was NAN\n',0 ;error message if nan E 5 nanlen equ 27 D 5 infmess byte 'atan2: input value was INF\n",0 ;error message if "infinity" E 5 I 5 infmess byte 'atan2: input value was INF\n',0 ;error message if "infinity" E 5 inflen equ 27 csect code align 2 externd _errno external _write external _matherr e_type equ -32 ;exception type e_name equ -28 ;name of routine in error e_arg1 equ -24 ;argument 1 e_arg2 equ -16 ;argument 2 (if present) e_retval equ -8 ;room for exception block e_size equ -80 ; plus stack frame with 3 parameters I 7 #ifdef ARGSINREGS pe_size equ 80 ; positive e_size #else pe_size equ 0 ; positive e_size #endif E 7 DOMAIN equ 1 SING equ 2 OVERFLOW equ 3 UNDERFLOW equ 4 TLOSS equ 5 PLOSS equ 6 EDOM equ 33 ERANGE equ 34 csect code C1 equ 0bc2bff24h ;equals -.010497842 C2 equ 0bf2cddbch ;equals -6.75258397 C3 equ 0bf9b537ah ;equals -1.21348506 C4 equ 04086b4eah ;equals 4.20958442 C5 equ 04068fdb6h ;equals 3.64048526 PI equ 040490fdbh ;equals pi = 3.14159654 PID2 equ 03fc90fdbh ;equals pi/2 = 1.5707963268 MPID2 equ 0bfc90fdbh ;equals -pi/2 = -1.5707963268 ONE equ 03f800000h ;equals one ABS equ 07fffffffh ;to get the absolute value of an argument MASK equ 0000000ffh ;to mask all but last 8 bits LIMIT equ 053518c2eh ;equals 9e11 INF equ 07f800000h ;equals infinity arg3 equ 40 arg2 equ 32 arg1 equ 24 arg_1 equ -4 I 7 E 7 #ifdef SingleLib global _atan2 ;single precision library _atan2: I 8 ; MCOUNT E 8 I 7 #ifndef ARGSINREGS E 7 load r0,r14,arg1 I 7 #endif E 7 #else global _s_atan2 ;rc and rp global _r_atn2 ;f77 global _R_atn2 ;rf _s_atan2: I 8 ; MCOUNT E 8 I 7 #ifndef ARGSINREGS E 7 load r0,r14,arg1 I 7 #endif E 7 br _R_atn2 _r_atn2: I 8 ; MCOUNT E 8 I 7 #ifndef ARGSINREGS E 7 load r0,r14,arg1 D 7 load r0,r0,0 ;get arg "x" E 7 load r1,r14,arg2 I 7 #endif load r0,r0,0 ;get arg "x" E 7 load r1,r1,0 ;get 2nd arg "y" _R_atn2: I 8 ; MCOUNT E 8 D 7 #endif SingleLib E 7 I 7 #endif E 7 br r0<>0,doit! ;if arg1 <> 0 goto doit br r1=0,M_PI_2 ;if arg1=0 and arg2=0 return(pi/2) ; 1/16/85 hlf no! no! do not return here if arg1 is zero ; ret r11,r11 ; else arg1=0 and arg2<>0 ... return(0) ; ; The next lines determine if |x| is neglibible compared to |y|, ; without dividing, and without adding values of the same sign. ; Prevents divide by zero if arg2 == 0. ; ; neg_y = 0; ; if (arg1 < 0) { ; arg1 = -arg1 ; neg_y++; ; } ; if (arg1 - ABS(arg2) == arg1) ; return(neg_y ? -M_PI_2 : M_PI_2); ; doit: move r2,r0 ;r2 <- arg1 move r3,r1 ;r3 <- arg2 laddr r4,ABS,L ;mask for absolute values move r5,0 ;neg_y = 0 ; 1/16/85 hlf this is redundant, there is no "or" in sight ; move r2,r0 ;r2 <- arg1 (r2 wiped out by "or" above) br r2>=0,NotLt0 ;if arg1 >= 0 goto NotLt0 and r2,r4 ;arg1 = -arg1 move r5,1 ;neg_y = 1 NotLt0: and r3,r4 ;arg2 = ABS(arg2) move r4,r2 ;r4 <- arg1 rsub r2,r3 br r2<>r4,DoAtan! ;if (arg1 -ABS(arg2) != arg1) goto DoAtan br r5=0,M_PI_2! ;if (neg_y = 0) goto M_PI_2 laddr r0,MPID2,L ;return( -pi/2 ) I 7 #ifdef ARGSINREGS ret LINK,LINK #else E 7 ret r11,r11 I 7 #endif E 7 M_PI_2: laddr r0,PID2,L ;return( pi/2 ) I 7 #ifdef ARGSINREGS ret LINK,LINK #else E 7 ret r11,r11 I 7 #endif E 7 BigR0: br r0=r2,inf! br nan ;r0 > r2 BigR1: br r1=r2,inf! br nan ;r1 > r2 DoAtan: laddr r2,INF,L br r0>=r2,BigR0 br r1>=r2,BigR1 ;if x or y =inf or nan then inf or nan ; 1/16/85 hlf it is unknown what this does or why. In any case, if arg1 is zero this ; fails. So for now get rid of it. ;logb laddr r2,r0 ; csl r2,9 ; laddr r4,MASK,L ; and r2,r4 ;clear x's exponent of all else ; move r3,r1 ; csl r3,9 ; and r3,r4 ;clear y's exponent of all else ; sub r3,r2 ;"(%t_logb(y)-%t_logb(x)" ; laddr r2,26 ; br r3>r2,strange ;if ...>26 then strange else ... move r2,r0 laddr r3,080000000h,L and r2,r3 csl r2,1 ;places x's sign bit in low-bit of r2 move r4,r1 and r4,r3 or r2,r4 ;places y's sign bit in sign bit of r2 I 7 #ifdef ARGSINREGS store r2,STKPTR,arg_1 ;save it for later usage #else E 7 store r2,r14,arg_1 ;save it for later usage I 7 #endif E 7 rdiv r0,r1 ;r0=y/x=argument to r_atan r_atan: laddr r1,ABS,L and r1,r0 ;r1="x=abs(arg)" laddr r2,LIMIT,L br r1>=r2,toobig ;if x>=9e11 then toobig else ... laddr r2,ONE,L br r10 then done else ... laddr r3,31 ;1/16/85 hlf number of bits to shift lowest bit to highest csl r1,r3 ;1/16/85 hlf must get arg1 sign bit in highest bit and r1,r2 ;clears r1 of everything but y's sign bit laddr r2,PI,L or r2,r1 ;r2="sign(y)*pi" radd r0,r2 ;r0="result=sign(y) * pi + result" D 7 done: ret r11,r11 E 7 I 7 done: #ifdef ARGSINREGS ret LINK,LINK #else ret r11,r11 #endif E 7 reduced: laddr r2,PID2,L rsub r2,r1 move r1,r2 ;r1="result = piover2(PID2) - result" br sign less: move r5,0 ;r5="reduced=false" br cont ;1/16/85 hlf since code that branches to here is commented out, comment this out also. ;strange: ; laddr r0,080000000h,L ;places a 1 in the sign bit's position ; and r1,r0 ;clears y of all but it's sign bit ; laddr r0,PID2,L ; or r0,r1 ;r0="result=sign(y) * piover2" ; ret r11,r11 toobig: laddr r2,INF,L br r1=r2,inf ;if x=inf then inf br r1>r2,nan ;elseif x=nan then nan else ... laddr r1,PID2,L ;return pi divided by 2 br sign ; ; error handling ; nan: ;loads values into error structure in case user ;wishes to do more with them than we have done D 7 E 7 I 7 #ifdef ARGSIREGS store LINK,STKPTR,0 ;save old return laddr STKPTR,STKPTR,e_size ;update stack #else E 7 store r11,r14,0 ;save old return store r15,r14,8 ;save old frame pointer move r15,r14 laddr r14,r14,e_size ;update stack I 7 #endif E 7 D 7 store r0,r15,e_arg1 ;load arg's value into error structure E 7 I 7 store r0,STKPTR,pe_size+e_arg1 ;load arg's value into error structure E 7 laddr r2,name,L ;name of offending routine D 7 store r2,r15,e_name ; into error structure E 7 I 7 store r2,STKPTR,pe_size+e_name ; into error structure E 7 move r3,DOMAIN ;exception type D 7 store r3,r15,e_type E 7 I 7 store r3,STKPTR,pe_size+e_type E 7 move r1,0 D 7 store r1,r15,e_retval ;return 0 E 7 I 7 store r1,STKPTR,pe_size+e_retval ;return 0 E 7 I 7 #ifdef ARGSINREGS laddr r0,STKPTR,pe_size+e_type ;user want to do different anything with error? call LINK,_matherr,L ;matherr is a function for user to define #else E 7 laddr r4,r15,e_type ;user want to do different anything with error? store r4,r14,arg1 ;gives matherr the address of error structure call r11,_matherr,L ;matherr is a function for user to define I 7 #endif E 7 br r0<>0,err_rtn ;yes (assume user will change r0 if yes ) mess: ;prints out our error message move r0,2 I 7 #ifdef ARGSINREGS laddr r1,emess,L laddr r2,messlen call LINK,_write,L ;writes out message #else E 7 store r0,r14,arg1 laddr r0,emess,L store r0,r14,arg2 ;gives message laddr r0,messlen store r0,r14,arg3 ;gives length of message call r11,_write,L ;writes out message I 7 #endif E 7 laddr r0,EDOM ;sets global variable _errno for user store r0,_errno,L ; ; branch around printing the nan msg if both args = 0 ; D 7 load r0,r15,arg1 E 7 I 7 load r0,STKPTR,pe_size+arg1 E 7 load r0,r0,0 ;get arg "x" br r0<>0,printNAN D 7 load r1,r15,arg2 E 7 I 7 load r1,STKPTR,pe_size+arg2 E 7 load r1,r1,0 ;get 2nd arg "y" br r1=0,err_rtn! printNAN: move r0,2 ;to print I 7 #ifdef ARGSINREGS laddr r1,nanmess,L laddr r2,nanlen call LINK,_write,L #else E 7 store r0,r14,arg1 laddr r0,nanmess,L store r0,r14,arg2 ;gives write the message laddr r0,nanlen store r0,r14,arg3 ;gives write the length of message call r11,_write,L I 7 #endif E 7 err_rtn: ;resets all old pointers and returns pi div 2 I 7 #ifdef ARGSINREGS laddr STKPTR,STKPTR,pe_size ;user will have already used matherr for himself load LINK,STKPTR,0 move r0,0 ;domain error returns 0 ret LINK,LINK #else E 7 move r14,r15 ;user will have already used matherr for himself load r15,r14,8 load r11,r14,0 move r0,0 ;domain error returns 0 ret r11,r11 I 7 #endif E 7 inf: I 7 #ifdef ARGSINREGS store LINK,STKPTR,0 ;save old return laddr STKPTR,STKPTR,e_size ;update stack #else E 7 store r11,r14,0 ;save old return store r15,r14,8 ;save old pointer move r15,r14 ;save old r14 pointer laddr r14,r14,e_size ;update stack D 7 E 7 I 7 #endif E 7 move r0,2 ;to print I 7 #ifdef ARGSINREGS laddr r1,infmess,L laddr r2,inflen call LINK,_write,L #else E 7 store r0,r14,arg1 laddr r5,infmess,L store r5,r14,arg2 ;gives write the message laddr r0,inflen store r0,r14,arg3 ;gives write the length of message call r11,_write,L I 7 #endif E 7 br err_rtn D 7 E 7 I 7 #ifdef ARGSINREGS ret LINK,LINK #else E 7 ret r11,r11 I 7 #endif E 7 E 1 h33687 s 00004/00000/00468 d D 4.3 87/04/16 13:56:52 mth 8 7 c Profiling changes e s 00100/00019/00368 d D 4.2 87/02/19 08:48:42 mth 7 6 c Parameters in registers e s 00000/00000/00387 d D 4.1 87/02/19 08:43:01 mth 6 5 c rolled rev to -r4 (mth) e s 00003/00003/00384 d D 3.3 87/01/31 13:28:36 mkm 5 4 c correct compatability probs between ROS and SPIX as. -mkm e s 00000/00000/00387 d D 3.2 87/01/31 11:54:40 mkm 4 3 c from ROS sources as of this date. -mkm e s 00000/00000/00387 d D 3.1 87/01/21 17:46:47 mkm 3 2 c e s 00000/00000/00387 d D 2.1 87/01/21 17:44:09 mkm 2 1 c e s 00387/00000/00000 d D 1.1 87/01/21 17:42:07 mkm 1 0 c Placed under source control - mkm c These files are direct descendants of the ROS files c by the same name at or about ROS rev 5.1 e u U f b f n t T I 1 ; "%W% %G%" dsect data name byte 'exp',0 ;name of routine ;no message D 5 nanmess byte 'exp: input value was NAN\n",0 ;error message if nan E 5 I 5 nanmess byte 'exp: input value was NAN\n',0 ;error message if nan E 5 nanlen equ 25 D 5 infmess byte 'exp: input value was INF\n",0 ;error message if "infinity" E 5 I 5 infmess byte 'exp: input value was INF\n',0 ;error message if "infinity" E 5 inflen equ 25 csect code align 2 externd _errno external _write external _matherr e_type equ -32 ;exception type e_name equ -28 ;name of routine in error e_arg1 equ -24 ;argument 1 e_arg2 equ -16 ;argument 2 (if present) e_retval equ -8 ;room for exception block e_size equ -80 ; plus stack frame with 3 parameters I 7 #ifdef ARGSINREGS pe_size equ 80 ; positive e_size #else pe_size equ 0 ; positive e_size #endif E 7 DOMAIN equ 1 SING equ 2 OVERFLOW equ 3 UNDERFLOW equ 4 TLOSS equ 5 PLOSS equ 6 EDOM equ 33 ERANGE equ 34 ; ; EXP - Exponential function (single precision) ; exp0 equ 040000000H; 1.0 only used if use Dave's method at end exp1 equ 0B17214A9H; 0.6931469838E0 exp2 equ 03D7FB3D9H; 0.2402298362E0 exp3 equ 00E342802H; 0.5548334198E-1 exp4 equ 0027A4FFFH; 0.9678840997E-2 exp5 equ 000518654H; 0.1243968782E-2 exp6 equ 0000E3908H; 0.2170225547e-3 ;exp1 equ 0b1727ad4h ;equals .6931530732007278e00 ;exp2 equ 03d7ab51ah ;equals .240153617040129e00 ;exp3 equ 00e4aa232h ;equals .5558263180623292e-1 ;exp4 equ 0024d2018h ;equals .89893400833312e-02 ;exp5 equ 0007b0c82h ;equals .18775766770276e-02 D 5 one equ 1.0e0 E 5 I 5 D 7 one equ 03f800000H ;1.0e0 E 7 I 7 one equ 03f800000h ; 1.0e0 E 7 E 5 ILN2P equ 0b8aa3b28H ;equals 1/ln(2) for empy = 1.4426950408889633 SBIAS equ 037f00000H ;equals 1023-127-1 shifted left 20 spaces BBIAS equ 038000000H ;equals 1023-127 shifted left 20 spaces ABS equ 07fffffffH ;to find abs(value) INF equ 07f800000H ;equals "infinity" MININ equ 033000000H ;equals 2.98e-08 NEGMAX equ 042ae999aH ;equals -87.3 the max neg can compute MAXIN equ 042b29eb8H ;equals 89.31 arg3 equ 40 arg2 equ 32 arg1 equ 24 arg_1 equ -8 I 7 E 7 #ifdef SingleLib global _exp ;single precision library _exp: I 8 ; MCOUNT E 8 I 7 #ifndef ARGSINREGS E 7 load r0,r14,arg1 I 7 #endif E 7 #else global _s_exp ;rc and rp global _r_exp ;f77 global _R_exp ;rf _s_exp: I 8 ; MCOUNT E 8 I 7 #ifndef ARGSINREGS E 7 load r0,r14,arg1 I 7 #endif E 7 br _R_exp _r_exp: I 8 ; MCOUNT E 8 D 7 load r4,r14,arg1 load r0,r4,0 ; r0 = arg1 E 7 I 7 #ifndef ARGSINREGS load r0,r14,arg1 #endif load r0,r0,0 ; r0 = arg1 E 7 _R_exp: I 8 ; MCOUNT E 8 D 7 #endif SingleLib E 7 I 7 #endif E 7 move r4,r0 ;r4= "value" D 7 ; store r0,r14,arg_1 E 7 I 7 ; store r0,STKPTR,arg_1 E 7 laddr r1,ABS,L and r1,r0 laddr r2,NEGMAX,L br r1>r2,toobig ;if abs(arg)>negmax then toobig else ... laddr r2,MININ,L br r2>r1,toosmall ;if x=0,expos ; check if negative, complement and rneg r0,r0 ; and compute as positive and then expos: laddr r2,07f800000h,l and r2,r0 ;r2 gets exp lsr r2,3 laddr r5,0007fffffh,l and r0,r5 ;gets rid of r0's exp laddr r5,000800000h,l or r0,r5 lsl r0,8 laddr r3,ILN2P,L empy r0,r3 br r0<0,big small: dlsr r0,10 laddr r3,r2,SBIAS,l add r0,r3 br cont lsr: neg r2,r2 lsr r0,r2 move r3,r0 br calc ;okay: makedr r0,r0 ; br ok big: dlsr r0,11 laddr r3,r2,BBIAS,l add r0,r3 cont: dfixt r5,r0 ; find reciprocal at end dfloat r2,r5 ; integer and fractional part drsub r0,r2 ; makedr r0,r0 ; ; ; instead of dfixt,dfloat,drsub,makedr ;cont: ; as though using method 2 ; dfixt r5,r0 ;until I have time to find a better way ; laddr r2,07ff00000h,l ; and r2,r0 ; csl r2,12 ; move r3,r2 ;r3= orig exp ; laddr r4,0000003ffh,l ; sub r2,r4 ;r2=orig exp - 3ff (ie unbias the exp) ; br r2<0,okay ; ; laddr r4,0000fffffh,l ; lsr r4,r2 ;moves mask so that it only masks off signifi- ; ; cant bits ; and r0,r4 ;clears rp0 of exp and integral bits ; ; dlsl r0,r2 ;reduces # of times we have to go through loop ; ;lp: dlsl r0,1 ; laddr r4,000100000h,l ;places a one in implicit bit's spot ; and r4,r0 ; add r2,1 ; br r4=0,lp! ;keeps dlsl"ing" until a 1 in implicit's spot ; ; dlsl r0,3 ;makes the "double" mantisssa a "single" one ; laddr r4,0007fffffh,l ; and r0,r4 ;mask off implicit one ; laddr r4,896 ; sub r3,r4 ;orig exp - 1022 + 127 ; sub r3,r2 ; lsl r3,13 ; lsl r3,10 ; or r0,r3 ; ; ;ok: ; laddr r2,07f800000h,l ; and r2,r0 ; csl r2,9 ; laddr r3,118 ; 127-9 ; sub r2,r3 ; ; laddr r3,0007fffffh,l ; and r0,r3 ; laddr r3,000800000h,l ; or r0,r3 ; br r2<0,lsr ; lsl r0,r2 ; move r3,r0 ; laddr r0,r0,31*8388608,l; compute using polynomial ; fixt r3,r0 ; using integer arithmetic ; lsli r3,1 laddr r2,07ff00000h,l and r2,r0 csl r2,12 laddr r3,1011 ;1023 - 12 sub r2,r3 laddr r3,0000fffffh,l and r0,r3 laddr r3,000100000h,l or r0,r3 br r2<0,lsr dlsl r0,r2 move r3,r0 calc: laddr r0,exp6,l empy r0,r3 laddr r0,r0,exp5,l ;calc: laddr r0,exp5,l empy r0,r3 laddr r0,r0,exp4,l empy r0,r3 laddr r0,r0,exp3,l empy r0,r3 laddr r0,r0,exp2,l empy r0,r3 laddr r0,r0,exp1,l empy r0,r3 ; lsri r0,2 ;Dave's way ; laddr r0,r0,exp0,l ;Dave's way ; float r0,r0 ;Dave's way ; laddr r0,r0,-30*8388608,l ;Dave's way ; laddr r1,000000100h,l ;makes it as accurate as the "old" one, but ; and r1,r0 ; slows it way down. (ie from 1.36 to 1.26 ; million whetstones) In fact Dave's way of ; doing it is just as fast if we round! lsr r0,9 ; br r1>0,rnd ;if 9th bit is set then round else ... laddr r1,03f800000h,l add r0,r1 go: lsli r5,10 ; add power of two to exponent lsli r5,13 add r0,r5 D 7 ; load r4,r14,arg_1 E 7 I 7 ; load r4,STKPTR,arg_1 E 7 br r4>=0,exdone! laddr r1,one,l rdiv r1,r0 move r0,r1 exdone: I 7 #ifdef ARGSINREGS ret LINK,LINK #else E 7 ret r11,r11 I 7 #endif E 7 ;rnd: laddr r1,03f800001h,l ; add r0,r1 ; br go toosmall: laddr r0,03f800000h,L br exdone ;return 1 ; ; error handling ; toobig: ;sends program to neg or positvie br r0<0,neg ;if neg then neg-toobig laddr r2,MAXIN,L ;else r2=pos' max number br r00,err_rtn1 ;yes (assume user will change r0 if yes ) laddr r0,ERANGE ;sets global variable _errno for user store r0,_errno,L D 7 E 7 I 7 #ifdef ARGSINREGS load r4,STKPTR,arg_1 ;restore r4's old value (if inf or not) #else E 7 load r4,r14,arg_1 ;restore r4's old value (if inf or not) I 7 #endif E 7 br r4=0,inf1 ;if abs(arg)="infinity" then go to inf br r4<0,nan1 ;if abs(arg) is not-a-number then go to nan err_rtn1: ;resets all old pointers and returns 0 I 7 #ifdef ARGSINREGS laddr STKPTR,STKPTR,pe_size ;user will have already used matherr for himself load LINK,STKPTR,0 laddr r0,0 ;returns 0 ret LINK,LINK #else E 7 move r14,r15 ;user will have already used matherr for himself load r15,r14,8 load r11,r14,0 laddr r0,0 ;returns 0 ret r11,r11 I 7 #endif E 7 inf1: move r0,2 ;to print I 7 #ifdef ARGSINREGS laddr r1,infmess,L laddr r2,inflen call LINK,_write,L #else E 7 store r0,r14,arg1 laddr r5,infmess,L store r5,r14,arg2 ;gives write the message laddr r0,inflen store r0,r14,arg3 ;gives write the length of message call r11,_write,L I 7 #endif E 7 br err_rtn1 nan1: move r0,2 ;to print I 7 #ifdef ARGSINREGS laddr r1,nanmess,L laddr r2,nanlen call LINK,_write,L #else E 7 store r0,r14,arg1 laddr r5,nanmess,L store r5,r14,arg2 ;gives write the message laddr r0,nanlen store r0,r14,arg3 ;gives write the length of message call r11,_write,L I 7 #endif E 7 br err_rtn1 positive: ;returns inf after loading error structure for ;possible alternative error processing by user ;doesn't print any message unless nan or nan laddr r4,INF,L ;r4="infinity" rcomp r4,r1 struct2: ;loads values into error structure I 7 #ifdef ARGSINREGS store LINK,STKPTR,0 ;save old return laddr STKPTR,STKPTR,e_size ;update stack store r4,STKPTR,arg_1 ;saves r4's value (ie whether or not it's inf) #else E 7 store r11,r14,0 ;save old return store r15,r14,8 ;save old frame pointer move r15,r14 laddr r14,r14,e_size ;update stack D 7 E 7 store r4,r14,arg_1 ;saves r4's value (ie whether or not it's inf) I 7 #endif E 7 D 7 store r0,r15,e_arg1 ;load arg's value into error structure E 7 I 7 store r0,STKPTR,pe_size+e_arg1 ;load arg's value into error structure E 7 laddr r2,name,L ;name of offending routine D 7 store r2,r15,e_name ; into error structure E 7 I 7 store r2,STKPTR,pe_size+e_name ; into error structure E 7 move r3,OVERFLOW ;exception type D 7 store r3,r15,e_type E 7 I 7 store r3,STKPTR,pe_size+e_type E 7 laddr r0,INF,L D 7 store r0,r15,e_retval ;return inf E 7 I 7 store r0,STKPTR,pe_size+e_retval ;return inf E 7 I 7 #ifdef ARGSINREGS laddr r0,STKPTR,pe_size+e_type ;user want to do different anything with error? call LINK,_matherr,L ;matherr is a function for user to define #else E 7 laddr r4,r15,e_type ;user want to do different anything with error? store r4,r14,arg1 ;gives matherr the address of error structure call r11,_matherr,L ;matherr is a function for user to define I 7 #endif E 7 br r0<>0,err_rtn2 ;yes (assume user will change r0 if yes ) laddr r0,ERANGE ;sets global variable _errno for user store r0,_errno,L D 7 E 7 I 7 #ifdef ARGSINREGS load r4,STKPTR,arg_1 ;restore r4's old value (if inf or not) #else E 7 load r4,r14,arg_1 ;restore r4's old value (if inf or not) I 7 #endif E 7 br r4=0,inf2 ;if abs(arg)="infinity" then go to inf br r4<0,nan2 ;if abs(arg) is not-a-number then go to nan err_rtn2: ;resets all old pointers and returns inf I 7 #ifdef ARGSINREGS laddr STKPTR,STKPTR,pe_size ;user will have already used matherr for himself load LINK,STKPTR,0 laddr r0,INF,L ;returns inf ret LINK,LINK #else E 7 move r14,r15 ;user will have already used matherr for himself load r15,r14,8 load r11,r14,0 laddr r0,INF,L ;returns inf ret r11,r11 I 7 #endif E 7 inf2: move r0,2 ;to print I 7 #ifdef ARGSINREGS laddr r1,infmess,L laddr r2,inflen call LINK,_write,L #else E 7 store r0,r14,arg1 laddr r5,infmess,L store r5,r14,arg2 ;gives write the message laddr r0,inflen store r0,r14,arg3 ;gives write the length of message call r11,_write,L I 7 #endif E 7 br err_rtn2 nan2: move r0,2 ;to print I 7 #ifdef ARGSINREGS laddr r1,nanmess,L laddr r2,nanlen call LINK,_write,L #else E 7 store r0,r14,arg1 laddr r5,nanmess,L store r5,r14,arg2 ;gives write the message laddr r0,nanlen store r0,r14,arg3 ;gives write the length of message call r11,_write,L I 7 #endif E 7 br err_rtn2 E 1 h38745 s 00004/00000/00352 d D 4.3 87/04/16 13:56:55 mth 8 7 c Profiling changes e s 00105/00016/00247 d D 4.2 87/02/16 17:31:15 mth 7 6 c Parameters in registers. e s 00000/00000/00263 d D 4.1 87/02/16 16:58:48 mth 6 5 c rolled rev to -r4 (mth) e s 00004/00004/00259 d D 3.3 87/01/31 13:28:39 mkm 5 4 c correct compatability probs between ROS and SPIX as. -mkm e s 00000/00000/00263 d D 3.2 87/01/31 11:54:42 mkm 4 3 c from ROS sources as of this date. -mkm e s 00000/00000/00263 d D 3.1 87/01/21 17:46:49 mkm 3 2 c e s 00000/00000/00263 d D 2.1 87/01/21 17:44:11 mkm 2 1 c e s 00263/00000/00000 d D 1.1 87/01/21 17:42:07 mkm 1 0 c Placed under source control - mkm c These files are direct descendants of the ROS files c by the same name at or about ROS rev 5.1 e u U f b f n t T I 1 ; "%W% %G%" dsect data name byte 'log10',0 ;name of routine D 5 emess0 byte 'log10: SING error\n",0 ;error message if arg=0 E 5 I 5 emess0 byte 'log10: SING error\n',0 ;error message if arg=0 E 5 mess0len equ 18 ;length of emess0 D 5 emess2 byte 'log10: DOMAIN error\n",0 ;error message of arg<0 E 5 I 5 emess2 byte 'log10: DOMAIN error\n',0 ;error message of arg<0 E 5 mess2len equ 20 D 5 nanmess byte 'log10: input value was NAN\n",0 ;error message if nan E 5 I 5 nanmess byte 'log10: input value was NAN\n',0 ;error message if nan E 5 nanlen equ 27 D 5 infmess byte 'log10: input value was INF\n",0 ;error message if "infinity" E 5 I 5 infmess byte 'log10: input value was INF\n',0 ;error message if "infinity" E 5 inflen equ 27 csect code align 2 externd _errno external _write external _matherr e_type equ -32 ;exception type e_name equ -28 ;name of routine in error e_arg1 equ -24 ;argument 1 e_arg2 equ -16 ;argument 2 (if present) e_retval equ -8 ;room for exception block e_size equ -80 ; plus stack frame with 3 parameters D 7 E 7 I 7 #ifdef ARGSINREGS pe_size equ 80 ; positive e_size #else pe_size equ 0 ; positive e_size #endif E 7 DOMAIN equ 1 SING equ 2 OVERFLOW equ 3 UNDERFLOW equ 4 TLOSS equ 5 PLOSS equ 6 EDOM equ 33 ERANGE equ 34 MASK equ 0000000ffh ;to clear all but rotated exponent MASKE equ 0007fffffh ;to clear off the unrotated exponent EXP0 equ 03f800000h ;an exponent of 0 EBIAS equ 127 ;the bias LIMIT equ 03fb504eeh ;equals 1.414213 C2 equ 03fd4114dh ;equals 1.65677798 C1 equ 03f8d5eedh ;equals 1.10445938 LOG2 equ 03f317218h ;equals .693147181 LOG10 equ 040135d8eh ;equals 2.302585092994045684 ONE equ 03f800000h ;equals one INF equ 07f800000h ;equals infinity arg3 equ 40 arg2 equ 32 arg1 equ 24 arg_1 equ -8 I 7 E 7 #ifdef SingleLib global _log10 ;single precision library _log10: I 8 ; MCOUNT E 8 I 7 #ifndef ARGSINREGS E 7 load r0,r14,arg1 I 7 #endif E 7 #else global _s_log10 ;rc and rp global _r_lg10 global _R_lg10 global _r_alg10 global _R_alg10 _s_log10: I 8 ; MCOUNT E 8 I 7 #ifndef ARGSINREGS E 7 load r0,r14,arg1 I 7 #endif E 7 br _R_alg10 _r_lg10: _r_alg10: I 8 ; MCOUNT E 8 I 7 #ifndef ARGSINREGS E 7 load r0,r14,arg1 ;get arg I 7 #endif E 7 load r0,r0,0 _R_lg10: _R_alg10: I 8 ; MCOUNT E 8 D 7 #endif SingleLib E 7 I 7 #endif E 7 laddr r1,ONE,L br r0=r1,return0,L ;if arg=1.0 then return 0.0 br r0<=0,badinput ;if arg<=0 then badinput else ... laddr r1,INF,L br r0>=r1,nanorinf ;if arg=inf or nan then nanorinf laddr r1,r0 csl r1,9 ;place exponent on low-order side of r1 laddr r2,MASK,L and r1,r2 ;clear off mantissa and sign bit laddr r2,EBIAS,L sub r1,r2 ;unbias the exponent laddr r2,MASKE,L and r0,r2 ;to clear off the exponent laddr r2,EXP0,L or r0,r2 ;to give mant "x" an exponent of 0 for arith laddr r2,LIMIT,L br r0<=r2,cont ;if x>1.414213 then ... else cont greater: laddr r2,000800000h,L ;places a one in the exponent's spot sub r0,r2 ;r0="x=x/2" add r1,1 ;r1="n=n+1" cont: laddr r2,ONE,L radd r2,r0 ;"(x+1)" laddr r3,ONE,L rsub r0,r3 ;"(x-1)" rdiv r0,r2 ;r0="z=(x-1) / (x+1)" laddr r2,r0 rmpy r2,r2 ;r2="zsq=sqr(z)" laddr r3,C2,L rsub r3,r2 ;r3="(C2-zsq)" laddr r4,C1,L rdiv r4,r3 ;r4="(C1/...)" rmpy r2,r4 ;"zsq*..." rmpy r2,r0 ;"z*..." laddr r4,LOG2,L float r1,r1 ;make n a real number to use arithmetic rmpy r1,r4 ;"n*LOG2" laddr r4,000800000h,L ;place a one in the first exponential bit add r0,r4 ;r0="z+z" radd r0,r1 ;"...+..." radd r0,r2 ;r0="result=n*LOG2+(z+z)+z*zsq*(C1/(C2-zsq))" laddr r1,LOG10,L rdiv r0,r1 ;r0="log10=log(arg)/LOG10" I 7 #ifdef ARGSINREGS ret LINK,LINK #else E 7 ret r11,r11 I 7 #endif E 7 ; arg = 1.0, return 0.0 return0: move r0,0 D 7 ret r11,r11 E 7 I 7 #ifdef ARGSINREGS ret LINK,LINK #else ret r11,r11 #endif E 7 ; ; error handling ; badinput: ;returns info to user about input error br r0=0,zero ;if arg=0 then zero struct: ;loads values into error structure in case user ;wishes to do more with them than we have done D 7 E 7 I 7 #ifdef ARGSINREGS store LINK,STKPTR,0 ;save old return laddr STKPTR,STKPTR,e_size ;update stack #else E 7 store r11,r14,0 ;save old return store r15,r14,8 ;save old frame pointer move r15,r14 laddr r14,r14,e_size ;update stack I 7 #endif E 7 D 7 store r0,r15,e_arg1 ;load arg's value into error structure E 7 I 7 store r0,STKPTR,pe_size+e_arg1 ;load arg's value into error structure E 7 laddr r2,name,L ;name of offending routine D 7 store r2,r15,e_name ; into error structure E 7 I 7 store r2,STKPTR,pe_size+e_name ; into error structure E 7 move r3,DOMAIN ;exception type D 7 store r3,r15,e_type E 7 I 7 store r3,STKPTR,pe_size+e_type E 7 laddr r0,0ff800000h,L D 7 store r0,r15,e_retval ;return -inf E 7 I 7 store r0,STKPTR,pe_size+e_retval ;return -inf E 7 I 7 #ifdef ARGSINREGS laddr r0,STKPTR,pe_size+e_type ;user want to do different anything with error? call LINK,_matherr,L ;matherr is a function for user to define #else E 7 laddr r4,r15,e_type ;user want to do different anything with error? store r4,r14,arg1 ;gives matherr the address of error structure call r11,_matherr,L ;matherr is a function for user to define I 7 #endif E 7 br r0<>0,err_rtn ;yes (assume user will change r0 if yes ) mess2: ;prints out our error message move r0,2 I 7 #ifdef ARGSINREGS laddr r1,emess2,L laddr r2,mess2len call LINK,_write,L ;writes out message #else E 7 store r0,r14,arg1 laddr r5,emess2,L store r5,r14,arg2 ;gives message laddr r0,mess2len store r0,r14,arg3 ;gives length of message call r11,_write,L ;writes out message I 7 #endif E 7 laddr r0,EDOM ;sets global variable _errno for user store r0,_errno,L err_rtn: ;resets all old pointers and returns -infinity I 7 #ifdef ARGSINREGS laddr STKPTR,STKPTR,pe_size ;user will have already used matherr for himself load LINK,STKPTR,0 laddr r0,0ff800000h,L ;returns -inf ret LINK,LINK #else E 7 move r14,r15 ;user will have already used matherr for himself load r15,r14,8 load r11,r14,0 laddr r0,0ff800000h,L ;returns -inf ret r11,r11 I 7 #endif E 7 zero: ;loads values into error structure in case user D 7 ;wishes to do more with them than we have done E 7 I 7 #ifdef ARGSINREGS ;wishes to do more with them than we have done store LINK,STKPTR,0 ;save old return laddr STKPTR,STKPTR,e_size ;update stack #else E 7 store r11,r14,0 ;save old return store r15,r14,8 ;save old frame pointer move r15,r14 laddr r14,r14,e_size ;update stack I 7 #endif E 7 D 7 store r0,r15,e_arg1 ;load arg's value into error structure E 7 I 7 store r0,STKPTR,pe_size+e_arg1 ;load arg's value into error structure E 7 laddr r2,name,L ;name of offending routine D 7 store r2,r15,e_name ; into error structure E 7 I 7 store r2,STKPTR,pe_size+e_name ; into error structure E 7 move r3,SING ;exception type D 7 store r3,r15,e_type E 7 I 7 store r3,STKPTR,pe_size+e_type E 7 laddr r0,0ff800000h,L D 7 store r0,r15,e_retval ;return -infinity E 7 I 7 store r0,STKPTR,pe_size+e_retval ;return -infinity E 7 I 7 #ifdef ARGSINREGS laddr r0,STKPTR,pe_size+e_type ;user want to do different anything with error? call LINK,_matherr,L ;matherr is a function for user to define #else E 7 laddr r4,r15,e_type ;user want to do different anything with error? store r4,r14,arg1 ;gives matherr the address of error structure call r11,_matherr,L ;matherr is a function for user to define I 7 #endif E 7 br r0<>0,err_rtn ;yes (assume user will change r0 if yes ) mess0: ;prints out our error message move r0,2 I 7 #ifdef ARGSINREGS laddr r1,emess0,L laddr r2,mess0len call LINK,_write,L ;writes out message #else E 7 store r0,r14,arg1 laddr r5,emess0,L store r5,r14,arg2 ;gives message laddr r0,mess0len store r0,r14,arg3 ;gives length of message call r11,_write,L ;writes out message I 7 #endif E 7 laddr r0,EDOM ;sets global variable _errno for user store r0,_errno,L br err_rtn nanorinf: br r0>r1,nan ;if arg=nan then nan else ... inf: ;writes message and returns inf I 7 #ifdef ARGSINREGS store LINK,STKPTR,0 ;save old return laddr STKPTR,STKPTR,e_size ;update stack #else E 7 store r11,r14,0 ;save old return store r15,r14,8 ;save old frame pointer move r15,r14 laddr r14,r14,e_size ;update stack I 7 #endif E 7 move r0,2 ;to print I 7 #ifdef ARGSINREGS laddr r1,infmess,L laddr r2,inflen call LINK,_write,L laddr STKPTR,STKPTR,pe_size ;re-updates the stack load LINK,STKPTR,0 ;resets old return laddr r0,07f800000h,L ;returns inf ret LINK,LINK #else E 7 store r0,r14,arg1 laddr r5,infmess,L store r5,r14,arg2 ;gives write the message laddr r0,inflen store r0,r14,arg3 ;gives write the length of message call r11,_write,L move r14,r15 ;re-updates the stack D 7 load r15,r14,8 ;resets old frame pointer E 7 I 7 load r15,r14,8 E 7 load r11,r14,0 ;resets old return laddr r0,07f800000h,L ;returns inf ret r11,r11 I 7 #endif E 7 nan: ;writes message and returns the nan arg I 7 #ifdef ARGSINREGS store LINK,STKPTR,0 ;save old return laddr STKPTR,STKPTR,e_size ;update stack store r0,STKPTR,arg_1 ;save arg #else E 7 store r11,r14,0 ;save old return store r15,r14,8 ;save old frame pointer move r15,r14 laddr r14,r14,e_size ;update stack D 7 E 7 store r0,r14,arg_1 ;save arg I 7 #endif E 7 move r0,2 ;to print I 7 #ifdef ARGSINREGS laddr r1,nanmess,L laddr r2,nanlen call LINK,_write,L load r0,STKPTR,arg_1 ;restore arg to rp0 laddr STKPTR,STKPTR,pe_size ;re-update stack load LINK,STKPTR,0 ;resets old return ret LINK,LINK #else E 7 store r0,r14,arg1 laddr r5,nanmess,L store r5,r14,arg2 ;gives write the message laddr r0,nanlen store r0,r14,arg3 ;gives write the length of message call r11,_write,L load r0,r14,arg_1 ;restore arg to rp0 move r14,r15 ;re-update stack load r15,r14,8 ;resets old frame pointer load r11,r14,0 ;resets old return ret r11,r11 I 7 #endif E 7 E 1 h27913 s 00004/00000/00345 d D 4.3 87/04/16 13:56:57 mth 8 7 c Profiling changes e s 00108/00015/00237 d D 4.2 87/02/16 17:31:18 mth 7 6 c Parameters in registers. e s 00000/00000/00252 d D 4.1 87/02/16 16:58:51 mth 6 5 c rolled rev to -r4 (mth) e s 00004/00004/00248 d D 3.3 87/01/31 13:28:41 mkm 5 4 c correct compatability probs between ROS and SPIX as. -mkm e s 00000/00000/00252 d D 3.2 87/01/31 11:54:43 mkm 4 3 c from ROS sources as of this date. -mkm e s 00000/00000/00252 d D 3.1 87/01/21 17:46:50 mkm 3 2 c e s 00000/00000/00252 d D 2.1 87/01/21 17:44:12 mkm 2 1 c e s 00252/00000/00000 d D 1.1 87/01/21 17:42:08 mkm 1 0 c Placed under source control - mkm c These files are direct descendants of the ROS files c by the same name at or about ROS rev 5.1 e u U f b f n t T I 1 ; "%W% %G%" dsect data name byte 'log',0 ;name of routine D 5 emess0 byte 'log: SING error\n",0 ;error message if arg=0 E 5 I 5 emess0 byte 'log: SING error\n',0 ;error message if arg=0 E 5 mess0len equ 16 ;length of emess0 D 5 emess2 byte 'log: DOMAIN error\n",0 ;error message of arg<0 E 5 I 5 emess2 byte 'log: DOMAIN error\n',0 ;error message of arg<0 E 5 mess2len equ 18 D 5 nanmess byte 'log: input value was NAN\n",0 ;error message if nan E 5 I 5 nanmess byte 'log: input value was NAN\n',0 ;error message if nan E 5 nanlen equ 25 D 5 infmess byte 'log: input value was INF\n",0 ;error message if "infinity" E 5 I 5 infmess byte 'log: input value was INF\n',0 ;error message if "infinity" E 5 inflen equ 25 csect code align 2 externd _errno external _write external _matherr e_type equ -32 ;exception type e_name equ -28 ;name of routine in error e_arg1 equ -24 ;argument 1 e_arg2 equ -16 ;argument 2 (if present) e_retval equ -8 ;room for exception block e_size equ -80 ; plus stack frame with 3 parameters I 7 #ifdef ARGSINREGS pe_size equ 80 ; positive e_size #else pe_size equ 0 ; positive e_size #endif E 7 I 7 E 7 DOMAIN equ 1 SING equ 2 OVERFLOW equ 3 UNDERFLOW equ 4 TLOSS equ 5 PLOSS equ 6 EDOM equ 33 ERANGE equ 34 csect code MASK equ 0000000ffh ;to clear all but rotated exponent MASKE equ 0007fffffh ;to clear off the unrotated exponent EXP0 equ 03f800000h ;an exponent of 0 EBIAS equ 127 ;the bias LIMIT equ 03fb504eeh ;equals 1.414213 C2 equ 03fd4114dh ;equals 1.65677798 C1 equ 03f8d5eedh ;equals 1.10445938 LOG2 equ 03f317218h ;equals .693147181 ONE equ 03f800000h ;equals one INF equ 07f800000h ;equals "infinity" arg3 equ 40 arg2 equ 32 arg1 equ 24 arg_1 equ -8 I 7 E 7 #ifdef SingleLib global _log ;single precision library _log: I 8 ; MCOUNT E 8 I 7 #ifndef ARGSINREGS E 7 load r0,r14,arg1 I 7 #endif E 7 #else global _s_log ;rc and rp global _r_log ;f77 global _R_log ;rf D 7 _s_log: load r0,r14,arg1 E 7 I 7 _s_log: I 8 ; MCOUNT E 8 #ifndef ARGSINREGS load r0,r14,arg1 #endif E 7 br _R_log _r_log: I 8 ; MCOUNT E 8 I 7 #ifndef ARGSINREGS E 7 load r0,r14,arg1 ;get arg I 7 #endif E 7 load r0,r0,0 _R_log: I 8 ; MCOUNT E 8 D 7 #endif SingleLib E 7 I 7 #endif E 7 laddr r1,ONE,L br r0<>r1,NotOne! ;if arg <> 1 then goto NotOne move r0,0 ; else return 0.0 I 7 #ifdef ARGSINREGS ret LINK,LINK #else E 7 ret r11,r11 I 7 #endif E 7 NotOne: br r0<=0,badinput ;if arg<=0 then badinput else ... laddr r1,INF,L br r0>=r1,nanorinf ;if arg=inf or nan then nanorinf move r1,r0 csl r1,9 ;place exponent on low-order side of r1 laddr r2,MASK,L and r1,r2 ;clear off mantissa and sign bit laddr r2,EBIAS,L sub r1,r2 ;unbias the exponent laddr r2,MASKE,L and r0,r2 ;to clear off the exponent laddr r2,EXP0,L or r0,r2 ;to give mant "x" an exponent of 0 for arith laddr r2,LIMIT,L br r0<=r2,cont ;if x>1.414213 then ... else cont greater: laddr r2,000800000h,L ;places a one in the exponent's spot sub r0,r2 ;r0="x=x/2" add r1,1 ;r1="n=n+1" cont: laddr r2,ONE,L radd r2,r0 ;"(x+1)" laddr r3,ONE,L rsub r0,r3 ;"(x-1)" rdiv r0,r2 ;r0="z=(x-1) / (x+1)" move r2,r0 rmpy r2,r2 ;r2="zsq=sqr(z)" laddr r3,C2,L rsub r3,r2 ;r3="(C2-zsq)" laddr r4,C1,L rdiv r4,r3 ;r4="(C1/...)" rmpy r2,r4 ;"zsq*..." rmpy r2,r0 ;"z*..." laddr r4,LOG2,L float r1,r1 ;make n a real number to use arithmetic rmpy r1,r4 ;"n*LOG2" laddr r4,000800000h,L ;place a one in the first exponential bit add r0,r4 ;r0="z+z" radd r0,r1 ;"...+..." radd r0,r2 ;r0="result=n*LOG2+(z+z)+z*zsq*(C1/(C2-zsq))" I 7 #ifdef ARGSINREGS ret LINK,LINK #else E 7 ret r11,r11 I 7 #endif E 7 ; ; error handling ; badinput: ;returns info to user about input error br r0=0,zero ;if arg=0 then zero struct: ;loads values into error structure in case user ;wishes to do more with them than we have done D 7 E 7 I 7 #ifdef ARGSINREGS store LINK,STKPTR,0 ;save old return laddr STKPTR,STKPTR,e_size ;update stack #else E 7 store r11,r14,0 ;save old return store r15,r14,8 ;save old frame pointer move r15,r14 laddr r14,r14,e_size ;update stack I 7 #endif E 7 D 7 store r0,r15,e_arg1 ;load arg's value into error structure E 7 I 7 store r0,STKPTR,pe_size+e_arg1 ;load arg's value into error structure E 7 laddr r2,name,L ;name of offending routine D 7 store r2,r15,e_name ; into error structure E 7 I 7 store r2,STKPTR,pe_size+e_name ; into error structure E 7 move r3,DOMAIN ;exception type D 7 store r3,r15,e_type E 7 I 7 store r3,STKPTR,pe_size+e_type E 7 laddr r0,0ff800000h,L D 7 store r0,r15,e_retval ;return -inf E 7 I 7 store r0,STKPTR,pe_size+e_retval ;return -inf E 7 I 7 #ifdef ARGSINREGS laddr r0,STKPTR,pe_size+e_type ;user want to do different anything with error? call LINK,_matherr,L ;matherr is a function for user to define #else E 7 laddr r4,r15,e_type ;user want to do different anything with error? store r4,r14,arg1 ;gives matherr the address of error structure call r11,_matherr,L ;matherr is a function for user to define I 7 #endif E 7 br r0<>0,err_rtn ;yes (assume user will change r0 if yes ) mess2: ;prints out our error message move r0,2 I 7 #ifdef ARGSINREGS laddr r1,emess2,L laddr r2,mess2len call LINK,_write,L ;writes out message #else E 7 store r0,r14,arg1 laddr r5,emess2,L store r5,r14,arg2 ;gives message laddr r0,mess2len store r0,r14,arg3 ;gives length of message call r11,_write,L ;writes out message I 7 #endif E 7 laddr r0,EDOM ;sets global variable _errno for user store r0,_errno,L err_rtn: ;resets all old pointers and returns -infinity I 7 #ifdef ARGSINREGS laddr STKPTR,STKPTR,pe_size ;user will have already used matherr for himself load LINK,STKPTR,0 laddr r0,0ff800000h,L ;returns -inf ret LINK,LINK #else E 7 move r14,r15 ;user will have already used matherr for himself load r15,r14,8 load r11,r14,0 laddr r0,0ff800000h,L ;returns -inf ret r11,r11 I 7 #endif E 7 zero: ;loads values into error structure in case user D 7 ;wishes to do more with them than we have done E 7 I 7 #ifdef ARGSINREGS store LINK,STKPTR,0 ;save old return laddr STKPTR,STKPTR,e_size ;update stack #else E 7 store r11,r14,0 ;save old return store r15,r14,8 ;save old frame pointer move r15,r14 laddr r14,r14,e_size ;update stack I 7 #endif E 7 D 7 store r0,r15,e_arg1 ;load arg's value into error structure E 7 I 7 store r0,STKPTR,pe_size+e_arg1 ;load arg's value into error structure E 7 laddr r2,name,L ;name of offending routine D 7 store r2,r15,e_name ; into error structure E 7 I 7 store r2,STKPTR,pe_size+e_name ; into error structure E 7 move r3,SING ;exception type D 7 store r3,r15,e_type E 7 I 7 store r3,STKPTR,pe_size+e_type E 7 laddr r0,0ff800000h,L D 7 store r0,r15,e_retval ;return -infinity E 7 I 7 store r0,STKPTR,pe_size+e_retval ;return -infinity E 7 I 7 #ifdef ARGSINREGS laddr r0,STKPTR,pe_size+e_type ;user want to do different anything with error? call LINK,_matherr,L ;matherr is a function for user to define #else E 7 laddr r4,r15,e_type ;user want to do different anything with error? store r4,r14,arg1 ;gives matherr the address of error structure call r11,_matherr,L ;matherr is a function for user to define I 7 #endif E 7 br r0<>0,err_rtn ;yes (assume user will change r0 if yes ) mess0: ;prints out our error message move r0,2 I 7 #ifdef ARGSINREGS laddr r1,emess0,L laddr r2,mess0len call LINK,_write,L ;writes out message #else E 7 store r0,r14,arg1 laddr r5,emess0,L store r5,r14,arg2 ;gives message laddr r0,mess0len store r0,r14,arg3 ;gives length of message call r11,_write,L ;writes out message I 7 #endif E 7 laddr r0,EDOM ;sets global variable _errno for user store r0,_errno,L br err_rtn nanorinf: br r0>r1,nan ;if arg=nan then nan else ... inf: ;writes message and returns inf I 7 #ifdef ARGSINREGS store LINK,STKPTR,0 ;save old return laddr STKPTR,STKPTR,e_size ;update stack #else E 7 store r11,r14,0 ;save old return store r15,r14,8 ;save old frame pointer move r15,r14 laddr r14,r14,e_size ;update stack I 7 #endif E 7 move r0,2 ;to print I 7 #ifdef ARGSINREGS laddr r1,infmess,L laddr r2,inflen call LINK,_write,L #else E 7 store r0,r14,arg1 laddr r5,infmess,L store r5,r14,arg2 ;gives write the message laddr r0,inflen store r0,r14,arg3 ;gives write the length of message call r11,_write,L I 7 #endif E 7 I 7 #ifdef ARGSINREGS laddr STKPTR,STKPTR,pe_size ;user will have already used matherr for himself load LINK,STKPTR,0 laddr r0,07f800000h,L ;returns inf ret LINK,LINK #else E 7 move r14,r15 ;re-updates the stack load r15,r14,8 ;resets old frame pointer load r11,r14,0 ;resets old return laddr r0,07f800000h,L ;returns inf ret r11,r11 D 7 E 7 I 7 #endif E 7 nan: ;writes message and returns the nan arg I 7 #ifdef ARGSINREGS store LINK,STKPTR,0 ;save old return laddr STKPTR,STKPTR,e_size ;update stack store r0,STKPTR,arg_1 ;save arg #else E 7 store r11,r14,0 ;save old return store r15,r14,8 ;save old frame pointer move r15,r14 laddr r14,r14,e_size ;update stack D 7 E 7 store r0,r14,arg_1 ;save arg I 7 #endif E 7 move r0,2 ;to print I 7 #ifdef ARGSINREGS laddr r1,nanmess,L laddr r2,nanlen call LINK,_write,L load r0,STKPTR,arg_1 ;restore arg to rp0 laddr STKPTR,STKPTR,pe_size ;user will have already used matherr for himself load LINK,STKPTR,0 ret LINK,LINK #else E 7 store r0,r14,arg1 laddr r5,nanmess,L store r5,r14,arg2 ;gives write the message laddr r0,nanlen store r0,r14,arg3 ;gives write the length of message call r11,_write,L load r0,r14,arg_1 ;restore arg to rp0 move r14,r15 ;re-update stack load r15,r14,8 ;resets old frame pointer load r11,r14,0 ;resets old return ret r11,r11 I 7 #endif E 7 E 1 h10901 s 00004/00000/00428 d D 4.3 87/04/16 13:57:00 mth 8 7 c Profiling changes e s 00081/00012/00347 d D 4.2 87/02/16 17:31:21 mth 7 6 c Parameters in registers. e s 00000/00000/00359 d D 4.1 87/02/16 16:58:57 mth 6 5 c rolled rev to -r4 (mth) e s 00003/00003/00356 d D 3.3 87/01/31 13:28:43 mkm 5 4 c correct compatability probs between ROS and SPIX as. -mkm e s 00000/00000/00359 d D 3.2 87/01/31 11:54:44 mkm 4 3 c from ROS sources as of this date. -mkm e s 00000/00000/00359 d D 3.1 87/01/21 17:46:51 mkm 3 2 c e s 00000/00000/00359 d D 2.1 87/01/21 17:44:13 mkm 2 1 c e s 00359/00000/00000 d D 1.1 87/01/21 17:42:09 mkm 1 0 c Placed under source control - mkm c These files are direct descendants of the ROS files c by the same name at or about ROS rev 5.1 e u U f b f n t T I 1 ; "%W% %G%" dsect data name byte 'sin',0 ;name of routine D 5 emess byte 'sin: TLOSS error\n",0 ;error message E 5 I 5 emess byte 'sin: TLOSS error\n',0 ;error message E 5 messlen equ 17 ;length of message D 5 nanmess byte 'sin: input value was NAN\n",0 ;error message if nan E 5 I 5 nanmess byte 'sin: input value was NAN\n',0 ;error message if nan E 5 nanlen equ 25 D 5 infmess byte 'sin: input value was INF\n",0 ;error message if "infinity" E 5 I 5 infmess byte 'sin: input value was INF\n',0 ;error message if "infinity" E 5 inflen equ 25 csect code align 2 externd _errno external _write external _matherr e_type equ -32 ;exception type e_name equ -28 ;name of routine in error e_arg1 equ -24 ;argument 1 e_arg2 equ -16 ;argument 2 (if present) e_retval equ -8 ;room for exception block e_size equ -80 ; plus stack frame with 3 parameters I 7 #ifdef ARGSINREGS pe_size equ 80 ; positive e_size #else pe_size equ 0 ; positive e_size #endif E 7 DOMAIN equ 1 SING equ 2 OVERFLOW equ 3 UNDERFLOW equ 4 TLOSS equ 5 PLOSS equ 6 EDOM equ 33 ERANGE equ 34 pi: ;initialize array pi word 1059250176 ;equals . word 969670656 word 878411776 word 782008320 word 679641088 word 596959232 word 510689280 word 418045952 word 324132864 word 229220352 ;equals .10453948e-29 csect code C3 equ 0be2aaaa0h ;equals -1.66666502e-1 C2 equ 03c088302h ;equals 8.33201640e-3 C1 equ 0b94c7dc9h ;equals -1.95018148e-4 CC3 equ 0beffffcbh ;equals -4.99998424e-1 CC2 equ 03d2a9dd3h ;equals 4.16544195e-2 CC1 equ 0bab1fcebh ;equals -1.35794036e-3 PI1 equ 03f22e000h ;equals pi[1]=.63623047 PID2 equ 03fc90fdah ;equals pi divided by 2 = 1.5707963 PIU equ 0400921fbh PIL equ 054442d19h ;equals pi in double precision PI equ 040490fdbh ;equals pi in single precision MMANT equ 0000000ffh ;to mask off mantissa and sign of rotated # MASK equ 0fffff800h ;to mask off 11 low order bits LIMIT equ 04f000000h ;equals 2147483647 LIMIT2 equ 03f490ff9h ;equals .7854 radians = 45 degrees COSLIM equ 03fc00000h ;equals 1.50 almost = pi/2 LARGE equ 047c35000h ;equals 1.0e5, uses my reduction if larger EBIAS equ 127 ;to unbias the exponent ONE equ 03f800000h ;equals one ABS equ 07fffffffh ;to find the absolute value of the argument INF equ 07f800000h ;equals infinity MIN equ 03951b717h ;equals 2e-4 as a lower bound arg3 equ 40 arg2 equ 32 arg1 equ 24 arg equ -4 arg_1 equ -8 arg_2 equ -16 arg_3 equ -20 I 7 E 7 #ifdef SingleLib global _sin ;single precision library _sin: I 8 ; MCOUNT E 8 I 7 #ifndef ARGSINREGS E 7 load r0,r14,arg1 I 7 #endif E 7 #else global _s_sin ;rc and rp global _r_sin ;f77 global _R_sin ;rf _s_sin: I 8 ; MCOUNT E 8 I 7 #ifndef ARGSINREGS E 7 load r0,r14,arg1 I 7 #endif E 7 br _R_sin _r_sin: I 8 ; MCOUNT E 8 I 7 #ifndef ARGSINREGS E 7 load r0,r14,arg1 I 7 #endif E 7 load r0,r0,0 ;get argument _R_sin: I 8 ; MCOUNT E 8 D 7 #endif SingleLib E 7 I 7 #endif E 7 laddr r2,ABS,L and r2,r0 ;r2=abs(arg) laddr r1,LARGE,L br r2>=r1,big ;if abs(arg)>LIMIT then big else ... pi_reduce: ;r0="result",arg stored at r14+arg; r1="upper"; r2="lower"; r3="cutoff"(int) ;r4="mult"; r5="rlower"; r6="i"(int); r7=%logb,i+1,itemp,rtemp; r8= variables I 7 #ifdef ARGSINREGS stored r7,STKPTR,arg_2 ;save r7 and r8 for variables store r0,STKPTR,arg_3 ;save sign of arg store r2,STKPTR,arg ;save abs(arg) at STKPTR-4 #else E 7 store r6,r14,arg_1 ;save r6 for use as "i" and other variables stored r7,r14,arg_2 ;save r7 and r8 for variables store r0,r14,arg_3 ;save sign of arg store r2,r14,arg ;save abs(arg) at r14-4 I 7 #endif E 7 laddr r1,LIMIT2,L br r2=r3,cont! ;while (%t_logb(result) < cutoff) laddr r8,24 br r6>=r8,cont ;and (i+2 < prec) do ... move r7,4 add r7,r6 ;r7="i+1" load r8,r7,pi,L ;r8="pi[i+1]" rmpy r8,r1 ;"upper*pi[i+1]" load r7,r6,pi,L ;r7="pi[i]" rmpy r7,r2 ;"lower*pi[i]" radd r7,r8 ;"(... + ...)" radd r5,r7 ;r5="rlower=rlower+(lower*pi[i]+upper*pi[i+1])" move r7,r0 radd r7,r5 ;r7="rtemp=result+rlower" laddr r8,03f000000h,L ;equals .5 br r7= .5 then ... else ifnot fixr r7,r7 ;r7="itemp=round(rtemp)" add r4,r7 ;r4="mult=mult+itemp" float r7,r7 ;converts r7 to a real to use rsub on it rsub r0,r7 ;r0="result=result-rtemp" move r7,r0 radd r7,r0 ;r7="rtemp=result+rlower" ifnot: rsub r0,r7 ;"(result-rtemp)" radd r5,r0 ;r5="rlower=(result-rtemp)+rlower" move r0,r7 ;r0="result=rtemp" move r8,11 ;"halfsz" sub r3,r8 ;r3="cutoff=cutoff-halfsz" add r6,4 ;r6="i=i+1" br while ;loop cont: ;assumes r1,r3 are free for use as variables load r1,r6,pi,L ;r1=pi[i].rr rmpy r2,r1 ;r2="lower*pi[i].rr" add r6,4 ;r6=i=i+1 load r1,r6,pi,L ;r1=pi[i+1].rr add r6,4 ;r6=i=i+1 load r3,r6,pi,L ;r3=pi[i+2].rr radd r3,r1 ;r3="(pi[i+1].rr + pi[i+2].rr)" I 7 #ifdef ARGSINRES load r1,STKPTR,arg ;restore saved original argument to r1 #else E 7 load r1,r14,arg ;restore saved original argument to r1 I 7 #endif E 7 rmpy r1,r3 ;"arg * (...)" radd r1,r2 ;"(...)+arg*(...)" radd r1,r5 ;"(... + rlower)" radd r0,r1 ;"(... + result)" laddr r1,PID2,L rmpy r0,r1 ;r0="result= piover2 * (( (lower*pi[i] + arg ; *(pi[i+1] + pi[i+2])) +rlower)+result)" sncs: ;final calculations -uses r0="x" (old result) I 7 #ifdef ARGSINREGS loadd r7,STKPTR,arg_2 ;restore old saved r7 and r8's value load r5,STKPTR,arg_3 #else E 7 load r6,r14,arg_1 ;restore old saved r6's value loadd r7,r14,arg_2 ;restore old saved r7 and r8's value load r5,r14,arg_3 I 7 #endif E 7 move r1,r0 ;r1=r0="x" rmpy r1,r1 ;r1="xsq=sqr(x)" move r2,1 and r2,r4 br r2<>0,odd ;if odd(mult) then odd else ... even: laddr r2,C1,L ;C1 rmpy r2,r1 ;"xsq*(C1)" laddr r3,C2,L ;C2 radd r2,r3 ;"C2+...)" rmpy r2,r1 ;"xsq*..." laddr r3,C3,L ;C3 radd r2,r3 ;"(C3+...)" rmpy r2,r1 ;"xsq*..." rmpy r2,r0 ;"x*..." radd r0,r2 ;r0="result=x+..." fini: move r2,2 and r2,r4 br r2=2,negate ;"if (odd(mult div 2)) then result=-result br r5<0,rnegate ;special negate flag for pi/4 < arg < pi/2 D 7 done: ret r11,r11 ;else we're done!!! E 7 I 7 done: #ifdef ARGSINREGS ret LINK,LINK #else ret r11,r11 #endif E 7 negate: br r5<0,done ;double negation rnegate: rneg r0,r0 ;r0="result=-result" D 7 ret r11,r11 ;done!!! E 7 I 7 #ifdef ARGSINREGS ret LINK,LINK #else ret r11,r11 #endif E 7 mult0: laddr r4,MIN,L ;r4=minimum argument br r20,err_rtn ;yes (assume user will change r0 if yes ) mess: ;prints out our error message move r0,2 I 7 #ifdef ARGSINREGS laddr r1,emess,L laddr r2,messlen call LINK,_write,L ;writes out message #else E 7 store r0,r14,arg1 laddr r5,emess,L store r5,r14,arg2 ;gives message laddr r0,messlen store r0,r14,arg3 ;gives length of message call r11,_write,L ;writes out message I 7 #endif E 7 laddr r0,ERANGE ;sets global variable _errno for user store r0,_errno,L D 7 load r4,r14,arg_1 ;restore r4's old value (if inf or not) E 7 I 7 load r4,STKPTR,arg_1 ;restore r4's old value (if inf or not) E 7 br r4=0,inf ;if abs(arg)="infinity" then go to inf br r4<0,nan ;if abs(arg) is not-a-number then go to nan ;else return err_rtn: ;resets all old pointers and returns zero I 7 #ifdef ARGSINREGS laddr STKPTR,STKPTR,pe_size ;user will have already used matherr for himself load LINK,STKPTR,0 move r0,0 ;to return 0 ret LINK,LINK #else E 7 move r14,r15 ;user will have already used matherr for himself load r15,r14,8 load r11,r14,0 move r0,0 ;to return 0 ret r11,r11 I 7 #endif E 7 inf: move r0,2 ;to print I 7 #ifdef ARGSINREGS laddr r1,infmess,L laddr r2,inflen call LINK,_write,L #else E 7 store r0,r14,arg1 laddr r5,infmess,L store r5,r14,arg2 ;gives write the message laddr r0,inflen store r0,r14,arg3 ;gives write the length of message call r11,_write,L I 7 #endif E 7 br err_rtn nan: move r0,2 ;to print I 7 #ifdef ARGSINREGS laddr r1,nanmess,L laddr r2,nanlen call LINK,_write,L #else E 7 store r0,r14,arg1 laddr r5,nanmess,L store r5,r14,arg2 ;gives write the message laddr r0,nanlen store r0,r14,arg3 ;gives write the length of message call r11,_write,L I 7 #endif E 7 br err_rtn E 1 h04889 s 00004/00000/00295 d D 4.3 87/04/16 13:57:03 mth 8 7 c Profiling changes e s 00057/00011/00238 d D 4.2 87/02/16 17:31:24 mth 7 6 c Parameters in registers. e s 00000/00000/00249 d D 4.1 87/02/16 16:59:00 mth 6 5 c rolled rev to -r4 (mth) e s 00002/00002/00247 d D 3.3 87/01/31 13:28:45 mkm 5 4 c correct compatability probs between ROS and SPIX as. -mkm e s 00000/00000/00249 d D 3.2 87/01/31 11:54:46 mkm 4 3 c from ROS sources as of this date. -mkm e s 00000/00000/00249 d D 3.1 87/01/21 17:46:53 mkm 3 2 c e s 00000/00000/00249 d D 2.1 87/01/21 17:44:16 mkm 2 1 c e s 00249/00000/00000 d D 1.1 87/01/21 17:42:10 mkm 1 0 c Placed under source control - mkm c These files are direct descendants of the ROS files c by the same name at or about ROS rev 5.1 e u U f b f n t T I 1 ; "%W% %G%" dsect data name byte 'sinh',0 ;name of routine ;no message D 5 nanmess byte 'sinh: input value was NAN\n",0 ;error message if nan E 5 I 5 nanmess byte 'sinh: input value was NAN\n',0 ;error message if nan E 5 nanlen equ 26 D 5 infmess byte 'sinh: input value was INF\n",0 ;error message if "infinity" E 5 I 5 infmess byte 'sinh: input value was INF\n',0 ;error message if "infinity" E 5 inflen equ 26 csect code align 2 externd _errno external _write external _matherr e_type equ -32 ;exception type e_name equ -28 ;name of routine in error e_arg1 equ -24 ;argument 1 e_arg2 equ -16 ;argument 2 (if present) e_retval equ -8 ;room for exception block e_size equ -80 ; plus stack frame with 3 parameters I 7 #ifdef ARGSINREGS pe_size equ 80 ; positive e_size #else pe_size equ 0 ; positive e_size #endif E 7 DOMAIN equ 1 SING equ 2 OVERFLOW equ 3 UNDERFLOW equ 4 TLOSS equ 5 PLOSS equ 6 EDOM equ 33 ERANGE equ 34 C1 equ 039534c5bh ;equals .00020150972 C2 equ 03c088402h ;equals .00833225464 C3 equ 03e2aaab3h ;equals .166666786 LIMIT equ 03f400000h ;equals .75 MINUS2 equ 0fffffffeh ;equals -2 as as integer ;constants for e_reduce CC1 equ 03d6c5665h ;equals .05769958151 CC2 equ 040e6e1ach ;equals 7.21504804 CC3 equ 041a68bbbh ;equals 20.81822806 UL2I equ 03fb8a000h ;equals 1.4423828125 = upper_log_2_inv LL2I equ 039a3b296h ;equals .000312228389 = lower_log_2_inv MAXIN equ 0461c4000h ;equals 10,000 HALF equ 03f000000h ;equals .5 ABS equ 07fffffffh ;to find the absolute value of an argument HALFSZ equ 0fffff800h ;to mask off lower part of exponent MASK equ 07f800000h ;to mask off mantissa and sign bit MASKE equ 0807fffffh ;to mask off exponent INF equ 07f800000h ;equals infinity arg1 equ 24 arg3 equ 40 arg2 equ 32 arg_1 equ -8 I 7 E 7 #ifdef SingleLib global _sinh ;single precision library _sinh: I 8 ; MCOUNT E 8 I 7 #ifndef ARGSINREGS E 7 load r0,r14,arg1 I 7 #endif E 7 #else global _s_sinh ;rc and rp global _r_sinh ;f77 global _R_sinh ;rf _s_sinh: I 8 ; MCOUNT E 8 I 7 #ifndef ARGSINREGS E 7 load r0,r14,arg1 I 7 #endif E 7 br _R_sinh _r_sinh: I 8 ; MCOUNT E 8 I 7 #ifndef ARGSINREGS E 7 load r0,r14,arg1 I 7 #endif E 7 load r0,r0,0 ;get arg _R_sinh: I 8 ; MCOUNT E 8 D 7 #endif SingleLib E 7 I 7 #endif E 7 laddr r1,ABS,L and r1,r0 ;r1="x=abs(arg)" laddr r2,LIMIT,L br r1>=r2,greater ;if x<.75 then ... else greater laddr r2,r1 rmpy r2,r2 ;r2="xsq=sqr(x)" laddr r3,C1,L ;C1 rmpy r3,r2 ;"xsq*(C1)" laddr r4,C2,L ;C2 radd r3,r4 ;"(C2 + ...)" rmpy r3,r2 ;"xsq * (...)" laddr r4,C3,L ;C3 radd r3,r4 ;"(C3 + ...)" rmpy r2,r3 ;"xsq * (...)" rmpy r2,r1 ;"x * ..." radd r1,r2 ;r1="result=x+x*xsq*(C3+xsq*(C2+xsq*(C1)))" br done greater: laddr r2,MAXIN,L br r1>r2,toobig ;if x>maxinput then toobig else ... e_reduce: laddr r2,HALFSZ,L and r2,r1 ;r2="upper=%t_halfsz(arg)" laddr r3,r1 rsub r3,r2 ;r3="lower=arg-upper" laddr r4,UL2I,L rmpy r2,r4 ;r2="x=upper*upper_log_2_inv" fixr r4,r2 ;r4="mult=round(x)" float r4,r4 ;make r4 a real to use rsub rsub r2,r4 ;"(x-mult)" fixt r4,r4 ;reconverts r4 to integer laddr r5,UL2I,L ; rmpy r3,r5 ;"lower*upper_log_2_inv" laddr r5,LL2I,L rmpy r1,r5 ;"arg*lower_log_2_inv" radd r1,r3 radd r1,r2 ;r1="x=(x-mult)+(lower*UL2I + arg*LL2I)" laddr r2,r1 rmpy r2,r2 ;r2="xsq=sqr(x)" laddr r3,CC1,L ;CC1 rmpy r3,r2 ;"CC1*xsq)" laddr r5,CC2,L ;CC2 radd r3,r5 ;"(CC2+CC1*xsq)" rmpy r1,r3 ;r1="p=x * (CC2 + CC1 * xsq)" laddr r3,CC3,L ;CC3 radd r2,r3 ;r2="q=CC3+xsq" contgreater: ;continues calculations after e_reduce rsub r2,r1 ;"(q-p)" rdiv r1,r2 ;r1="x=p / (q - p)" laddr r2,14 br r4>=r2,cont ;if mult<14 then ... else cont laddr r5,MINUS2,L mpy r5,r4 sub r5,1 ;r5="-2*mult-1" laddr r3,HALF,L radd r3,r1 ;"(x+.5)" laddr r2,HALF,L rdiv r2,r3 ;r2=".5 / (x+.5)" pack1: laddr r3,MASK,L and r3,r2 ;r3 gets the exponent of r2 csl r3,9 ;makes it an integer add r3,r5 ;adds u.exp and mult laddr r5,23 csl r3,r5 ;places u.exp + mult in exponents place laddr r5,MASKE,L and r2,r5 or r2,r3 ;r2="%t_pack(.5/(x+.5),-2*mult-1,xsq)" rsub r1,r2 ;r1="x=x-xsq" cont: laddr r2,HALF,L radd r1,r2 ;r1=".5+x" pack: laddr r2,MASK,L and r2,r1 ;r2 gets only the exponent of r2 csl r2,9 ;makes exponent an integer add r2,r4 ;r2="u.exp=u.exp+mult" laddr r3,23 csl r2,r3 ;places new exponent in appropriate position laddr r3,MASKE,L and r1,r3 ;clear x of exponent or r1,r2 ;r1="%t_pack(.5+x,mult,result)" done: laddr r2,080000000h,L and r0,r2 ;saves only sign bit of original argument or r0,r1 ;"if arg<0 then result=-result" I 7 #ifdef ARGSINREGS ret LINK,LINK #else E 7 ret r11,r11 I 7 #endif E 7 toobig: laddr r4,INF,L rcomp r4,r1 ;if x=inf then r4=0, if x=nan then r4=-1 ; ; error handling ; badinput: ;returns info to user about input error struct: ;loads values into error structure in case user ;wishes to do more with them than we have done D 7 E 7 I 7 #ifdef ARGSINREGS store LINK,STKPTR,0 ;save old return laddr STKPTR,STKPTR,e_size ;update stack store r4,STKPTR,arg_1 ;save r4's value (ie whether or not it's inf) #else E 7 store r11,r14,0 ;save old return store r15,r14,8 ;save old frame pointer move r15,r14 laddr r14,r14,e_size ;update stack D 7 E 7 store r4,r14,arg_1 ;saves r4's value (ie whether or not it's inf) I 7 #endif E 7 D 7 store r0,r15,e_arg1 ;load arg's value into error structure E 7 I 7 store r0,STKPTR,pe_size+e_arg1 ;load arg's value into error structure E 7 laddr r2,name,L ;name of offending routine D 7 store r2,r15,e_name ; into error structure E 7 I 7 store r2,STKPTR,pe_size+e_name ; into error structure E 7 br r0>0,ovrflw ;if arg>10,000 then overflow else underflow udrflw: move r3,UNDERFLOW ;exception type D 7 store r3,r15,e_type E 7 I 7 store r3,STKPTR,pe_size+e_type E 7 br conterr ovrflw: move r3,OVERFLOW ;exception type D 7 store r3,r15,e_type E 7 I 7 store r3,STKPTR,pe_size+e_type E 7 conterr: laddr r0,INF,L D 7 store r0,r15,e_retval ;return inf E 7 I 7 store r0,STKPTR,pe_size+e_retval ;return inf E 7 I 7 #ifdef ARGSINREGS laddr r0,STKPTR,pe_size+e_type ;user want to do different anything with error? call LINK,_matherr,L ;matherr is a function for user to define #else E 7 laddr r4,r15,e_type ;user want to do different anything with error? store r4,r14,arg1 ;gives matherr the address of error structure call r11,_matherr,L ;matherr is a function for user to define I 7 #endif E 7 br r0<>0,err_rtn ;yes (assume user will change r0 if yes ) laddr r0,ERANGE ;sets global variable _errno for user store r0,_errno,L D 7 E 7 I 7 #ifdef ARGSINREGS load r4,STKPTR,arg_1 ;restore r4's old value (if inf or not) #else E 7 load r4,r14,arg_1 ;restore r4's old value (if inf or not) I 7 #endif E 7 br r4=0,inf ;if abs(arg)="infinity" then go to inf br r4<0,nan ;if abs(arg) is not-a-number then go to nan err_rtn: ;resets all old pointers and returns inf I 7 #ifdef ARGSINREGS laddr STKPTR,STKPTR,pe_size ;user will have already used matherr for himself load LINK,STKPTR,0 laddr r0,INF,L ;returns inf ret LINK,LINK #else E 7 move r14,r15 ;user will have already used matherr for himself load r15,r14,8 load r11,r14,0 D 7 laddr r0,07ff00000h,L E 7 laddr r0,INF,L ;returns inf ret r11,r11 I 7 #endif E 7 inf: move r0,2 ;to print I 7 #ifdef ARGSINREGS laddr r1,infmess,L laddr r2,inflen call LINK,_write,L #else E 7 store r0,r14,arg1 laddr r5,infmess,L store r5,r14,arg2 ;gives write the message laddr r0,inflen store r0,r14,arg3 ;gives write the length of message call r11,_write,L I 7 #endif E 7 br err_rtn nan: move r0,2 ;to print I 7 #ifdef ARGSINREGS laddr r1,nanmess,L laddr r2,nanlen call LINK,_write,L #else E 7 store r0,r14,arg1 laddr r5,nanmess,L store r5,r14,arg2 ;gives write the message laddr r0,nanlen store r0,r14,arg3 ;gives write the length of message call r11,_write,L I 7 #endif E 7 br err_rtn E 1 h43291 s 00004/00000/00449 d D 4.3 87/04/16 13:57:05 mth 8 7 c Profiling changes e s 00053/00014/00396 d D 4.2 87/02/16 17:31:26 mth 7 6 c Parameters in registers. e s 00000/00000/00410 d D 4.1 87/02/16 16:59:03 mth 6 5 c rolled rev to -r4 (mth) e s 00258/00258/00152 d D 3.3 87/01/31 13:28:47 mkm 5 4 c correct compatability probs between ROS and SPIX as. -mkm e s 00000/00000/00410 d D 3.2 87/01/31 11:54:47 mkm 4 3 c from ROS sources as of this date. -mkm e s 00000/00000/00410 d D 3.1 87/01/21 17:46:54 mkm 3 2 c e s 00000/00000/00410 d D 2.1 87/01/21 17:44:17 mkm 2 1 c e s 00410/00000/00000 d D 1.1 87/01/21 17:42:10 mkm 1 0 c Placed under source control - mkm c These files are direct descendants of the ROS files c by the same name at or about ROS rev 5.1 e u U f b f n t T I 1 ; "%W% %G%" ; ; general stack offsets ; arg1 equ 24 arg2 equ 32 arg3 equ 40 ; ; name of routine and error message strings ; dsect data sqrt_name byte 'sqrt',0 D 5 errmess byte 'sqrt: DOMAIN error\n",0 E 5 I 5 errmess byte 'sqrt: DOMAIN error\n',0 E 5 errmlen equ 19 csect code e_type equ -32 ; exception type e_name equ -28 ; name of routine in error e_arg1 equ -24 ; argument 1 e_arg2 equ -16 ; argument 2 (if present) e_retval equ -8 ; room for exception block e_size equ -80 ; plus stack frame w/3 params I 7 #ifdef ARGSINREGS pe_size equ 80 ; positive e_size #else pe_size equ 0 ; positive e_size #endif E 7 DOMAIN equ 1 ; domain error SING equ 2 ; singularity OVERFLOW equ 3 ; overflow UNDERFLOW equ 4 ; underflow TLOSS equ 5 ; total loss of significance PLOSS equ 6 ; partial loss of significance EDOM equ 33 ; argument out of domain of function ERANGE equ 34 ; argument out of range externd _errno external _write,_matherr sqrt2 equ 03fb504f4h ; 1.4142136 = sqrt(2) isqrt2 equ 03f3504f3h ; 0.707106781 = 1.0/sqrt(2) D 5 two equ 2.0e0 E 5 I 5 D 7 two equ 040000000h ; 2.0e0 E 7 I 7 two equ 040000000h E 7 E 5 I 7 E 7 #ifdef SingleLib global _sqrt ;single precision library _sqrt: I 8 ; MCOUNT E 8 I 7 #ifndef ARGSINREGS E 7 load r0,r14,arg1 I 7 #endif E 7 #else global _s_sqrt ;rc and rp global _r_sqrt ;f77 global _R_sqrt ;rf _s_sqrt: I 8 ; MCOUNT E 8 I 7 #ifndef ARGSINREGS E 7 load r0,r14,arg1 I 7 #endif E 7 br _R_sqrt _r_sqrt: I 8 ; MCOUNT E 8 D 7 load r2,r14,arg1 load r0,r2,0 ; r0 = arg1 E 7 I 7 #ifndef ARGSINREGS load r0,r14,arg1 #endif load r0,r0,0 ; r0 = arg1 E 7 _R_sqrt: I 8 ; MCOUNT E 8 D 7 #endif SingleLib E 7 I 7 #endif E 7 br r0<=0,sqrtz ; handle sqrt(0), error conditions move r4,r0 laddr r1,007fffffh,L ; mask off mantissa and r0,r1 move r1,r0 laddr r0,r0,3f000000h,L lsri r1,15 lsli r1,2 loadp r1,r1,sqrtbl move r2,r0 ; get better approx rdiv r2,r1 ; by using Heron's apporx radd r1,r2 laddr r2,00800000h,L ;places a one in the first exponential bit sub r1,r2 ;effectively divides r1 by 2.0 move r2,r0 rdiv r2,r1 radd r1,r2 laddr r2,00800000h,L ;places a one in the first exponential bit sub r1,r2 ;effectively divides r1 by 2.0 move r0,r1 laddr r2,23 lsr r4,r2 laddr r4,r4,-126 ; subtract out exponent move r1,r4 ; exponent bias and then andi r1,1 ; take 1/2 of the result move r2,r4 ; if odd the answer must test r2<0 ; be multiplied by a sqrt(2) add r4,r2 lsri r4,1 lsli r4,10 lsli r4,13 add r0,r4 br r1=0,sqdone br r2<>0,divsq2 laddr r1,sqrt2,L rmpy r0,r1 br sqdone divsq2: laddr r1,isqrt2,L rmpy r0,r1 sqdone: D 7 ret r11,r11 E 7 I 7 #ifdef ARGSINREGS ret LINK,LINK #else ret r11,r11 #endif E 7 sqrtz: br r0<0,sqrt_err D 7 ret r11,r11 ; return 0 E 7 I 7 #ifdef ARGSINREGS ret LINK,LINK #else ret r11,r11 #endif E 7 ; ; error handling ; sqrt_err: ; ; DOMAIN error ; I 7 #ifdef ARGSINREGS store LINK,STKPTR,0 ;save old return laddr STKPTR,STKPTR,e_size ;update stack #else E 7 store r11,r14,0 ; save old return store r15,r14,8 ; save old frame ptr move r15,r14 laddr r14,r14,e_size ; update stack D 7 E 7 I 7 #endif E 7 move r3,DOMAIN ; exception type D 7 store r3,r15,e_type E 7 I 7 store r3,STKPTR,pe_size+e_type E 7 laddr r5,sqrt_name,L ; name of offending routine D 7 store r5,r15,e_name store r0,r15,e_arg1 E 7 I 7 store r5,STKPTR,pe_size+e_name store r0,STKPTR,pe_size+e_arg1 E 7 move r0,0 D 7 store r0,r15,e_retval ; return 0 E 7 I 7 store r0,STKPTR,pe_size+e_retval ; return 0 E 7 I 7 #ifdef ARGSINREGS laddr r0,STKPTR,pe_size+e_type ; user want to do anything with error? call LINK,_matherr,L #else E 7 laddr r4,r15,e_type ; user want to do anything with error? store r4,r14,arg1 call r11,_matherr,L I 7 #endif E 7 br r0<>0,sqrt_rtn ; yes move r0,2 ; tell user about problem I 7 #ifdef ARGSINREGS laddr r1,errmess,L laddr r2,errmlen call LINK,_write,L #else E 7 store r0,r14,arg1 laddr r0,errmess,L store r0,r14,arg2 laddr r0,errmlen store r0,r14,arg3 call r11,_write,L I 7 #endif E 7 laddr r0,EDOM store r0,_errno,L sqrt_rtn: move r0,0 D 7 store r0,r15,e_retval ; return 0 E 7 I 7 #ifdef ARGSINREGS laddr STKPTR,STKPTR,pe_size ;user will have already used matherr for himself load LINK,STKPTR,0 ret LINK,LINK #else E 7 move r14,r15 load r15,r14,8 load r11,r14,0 ret r11,r11 I 7 #endif E 7 align 4 D 5 sqrtbl: word 7.07107E-1 ; sqrt( 5.00000E-1) word 7.08486E-1 ; sqrt( 5.01953E-1) word 7.09864E-1 ; sqrt( 5.03906E-1) word 7.11238E-1 ; sqrt( 5.05859E-1) word 7.12610E-1 ; sqrt( 5.07812E-1) word 7.13979E-1 ; sqrt( 5.09766E-1) word 7.15345E-1 ; sqrt( 5.11719E-1) word 7.16709E-1 ; sqrt( 5.13672E-1) word 7.18070E-1 ; sqrt( 5.15625E-1) word 7.19429E-1 ; sqrt( 5.17578E-1) word 7.20785E-1 ; sqrt( 5.19531E-1) word 7.22139E-1 ; sqrt( 5.21484E-1) word 7.23490E-1 ; sqrt( 5.23437E-1) word 7.24838E-1 ; sqrt( 5.25391E-1) word 7.26184E-1 ; sqrt( 5.27344E-1) word 7.27528E-1 ; sqrt( 5.29297E-1) word 7.28869E-1 ; sqrt( 5.31250E-1) word 7.30208E-1 ; sqrt( 5.33203E-1) word 7.31544E-1 ; sqrt( 5.35156E-1) word 7.32877E-1 ; sqrt( 5.37109E-1) word 7.34209E-1 ; sqrt( 5.39062E-1) word 7.35538E-1 ; sqrt( 5.41016E-1) word 7.36864E-1 ; sqrt( 5.42969E-1) word 7.38188E-1 ; sqrt( 5.44922E-1) word 7.39510E-1 ; sqrt( 5.46875E-1) word 7.40829E-1 ; sqrt( 5.48828E-1) word 7.42146E-1 ; sqrt( 5.50781E-1) word 7.43461E-1 ; sqrt( 5.52734E-1) word 7.44773E-1 ; sqrt( 5.54687E-1) word 7.46083E-1 ; sqrt( 5.56641E-1) word 7.47391E-1 ; sqrt( 5.58594E-1) word 7.48697E-1 ; sqrt( 5.60547E-1) word 7.50000E-1 ; sqrt( 5.62500E-1) word 7.51301E-1 ; sqrt( 5.64453E-1) word 7.52600E-1 ; sqrt( 5.66406E-1) word 7.53896E-1 ; sqrt( 5.68359E-1) word 7.55190E-1 ; sqrt( 5.70312E-1) word 7.56482E-1 ; sqrt( 5.72266E-1) word 7.57772E-1 ; sqrt( 5.74219E-1) word 7.59060E-1 ; sqrt( 5.76172E-1) word 7.60345E-1 ; sqrt( 5.78125E-1) word 7.61629E-1 ; sqrt( 5.80078E-1) word 7.62910E-1 ; sqrt( 5.82031E-1) word 7.64189E-1 ; sqrt( 5.83984E-1) word 7.65465E-1 ; sqrt( 5.85937E-1) word 7.66740E-1 ; sqrt( 5.87891E-1) word 7.68013E-1 ; sqrt( 5.89844E-1) word 7.69283E-1 ; sqrt( 5.91797E-1) word 7.70552E-1 ; sqrt( 5.93750E-1) word 7.71818E-1 ; sqrt( 5.95703E-1) word 7.73082E-1 ; sqrt( 5.97656E-1) word 7.74344E-1 ; sqrt( 5.99609E-1) word 7.75605E-1 ; sqrt( 6.01562E-1) word 7.76863E-1 ; sqrt( 6.03516E-1) word 7.78119E-1 ; sqrt( 6.05469E-1) word 7.79373E-1 ; sqrt( 6.07422E-1) word 7.80625E-1 ; sqrt( 6.09375E-1) word 7.81875E-1 ; sqrt( 6.11328E-1) word 7.83123E-1 ; sqrt( 6.13281E-1) word 7.84369E-1 ; sqrt( 6.15234E-1) word 7.85613E-1 ; sqrt( 6.17187E-1) word 7.86855E-1 ; sqrt( 6.19141E-1) word 7.88095E-1 ; sqrt( 6.21094E-1) word 7.89333E-1 ; sqrt( 6.23047E-1) word 7.90569E-1 ; sqrt( 6.25000E-1) word 7.91804E-1 ; sqrt( 6.26953E-1) word 7.93036E-1 ; sqrt( 6.28906E-1) word 7.94266E-1 ; sqrt( 6.30859E-1) word 7.95495E-1 ; sqrt( 6.32812E-1) word 7.96722E-1 ; sqrt( 6.34766E-1) word 7.97947E-1 ; sqrt( 6.36719E-1) word 7.99169E-1 ; sqrt( 6.38672E-1) word 8.00391E-1 ; sqrt( 6.40625E-1) word 8.01610E-1 ; sqrt( 6.42578E-1) word 8.02827E-1 ; sqrt( 6.44531E-1) word 8.04042E-1 ; sqrt( 6.46484E-1) word 8.05256E-1 ; sqrt( 6.48437E-1) word 8.06468E-1 ; sqrt( 6.50391E-1) word 8.07678E-1 ; sqrt( 6.52344E-1) word 8.08886E-1 ; sqrt( 6.54297E-1) word 8.10093E-1 ; sqrt( 6.56250E-1) word 8.11297E-1 ; sqrt( 6.58203E-1) word 8.12500E-1 ; sqrt( 6.60156E-1) word 8.13701E-1 ; sqrt( 6.62109E-1) word 8.14900E-1 ; sqrt( 6.64062E-1) word 8.16098E-1 ; sqrt( 6.66016E-1) word 8.17294E-1 ; sqrt( 6.67969E-1) word 8.18488E-1 ; sqrt( 6.69922E-1) word 8.19680E-1 ; sqrt( 6.71875E-1) word 8.20870E-1 ; sqrt( 6.73828E-1) word 8.22059E-1 ; sqrt( 6.75781E-1) word 8.23246E-1 ; sqrt( 6.77734E-1) word 8.24432E-1 ; sqrt( 6.79687E-1) word 8.25615E-1 ; sqrt( 6.81641E-1) word 8.26797E-1 ; sqrt( 6.83594E-1) word 8.27978E-1 ; sqrt( 6.85547E-1) word 8.29156E-1 ; sqrt( 6.87500E-1) word 8.30333E-1 ; sqrt( 6.89453E-1) word 8.31508E-1 ; sqrt( 6.91406E-1) word 8.32682E-1 ; sqrt( 6.93359E-1) word 8.33854E-1 ; sqrt( 6.95312E-1) word 8.35024E-1 ; sqrt( 6.97266E-1) word 8.36193E-1 ; sqrt( 6.99219E-1) word 8.37360E-1 ; sqrt( 7.01172E-1) word 8.38525E-1 ; sqrt( 7.03125E-1) word 8.39689E-1 ; sqrt( 7.05078E-1) word 8.40851E-1 ; sqrt( 7.07031E-1) word 8.42012E-1 ; sqrt( 7.08984E-1) word 8.43171E-1 ; sqrt( 7.10937E-1) word 8.44328E-1 ; sqrt( 7.12891E-1) word 8.45484E-1 ; sqrt( 7.14844E-1) word 8.46638E-1 ; sqrt( 7.16797E-1) word 8.47791E-1 ; sqrt( 7.18750E-1) word 8.48942E-1 ; sqrt( 7.20703E-1) word 8.50092E-1 ; sqrt( 7.22656E-1) word 8.51240E-1 ; sqrt( 7.24609E-1) word 8.52386E-1 ; sqrt( 7.26562E-1) word 8.53531E-1 ; sqrt( 7.28516E-1) word 8.54675E-1 ; sqrt( 7.30469E-1) word 8.55816E-1 ; sqrt( 7.32422E-1) word 8.56957E-1 ; sqrt( 7.34375E-1) word 8.58096E-1 ; sqrt( 7.36328E-1) word 8.59233E-1 ; sqrt( 7.38281E-1) word 8.60369E-1 ; sqrt( 7.40234E-1) word 8.61503E-1 ; sqrt( 7.42187E-1) word 8.62636E-1 ; sqrt( 7.44141E-1) word 8.63767E-1 ; sqrt( 7.46094E-1) word 8.64897E-1 ; sqrt( 7.48047E-1) word 8.66025E-1 ; sqrt( 7.50000E-1) word 8.67152E-1 ; sqrt( 7.51953E-1) word 8.68278E-1 ; sqrt( 7.53906E-1) word 8.69402E-1 ; sqrt( 7.55859E-1) word 8.70524E-1 ; sqrt( 7.57812E-1) word 8.71645E-1 ; sqrt( 7.59766E-1) word 8.72765E-1 ; sqrt( 7.61719E-1) word 8.73883E-1 ; sqrt( 7.63672E-1) word 8.75000E-1 ; sqrt( 7.65625E-1) word 8.76115E-1 ; sqrt( 7.67578E-1) word 8.77229E-1 ; sqrt( 7.69531E-1) word 8.78342E-1 ; sqrt( 7.71484E-1) word 8.79453E-1 ; sqrt( 7.73437E-1) word 8.80563E-1 ; sqrt( 7.75391E-1) word 8.81671E-1 ; sqrt( 7.77344E-1) word 8.82778E-1 ; sqrt( 7.79297E-1) word 8.83883E-1 ; sqrt( 7.81250E-1) word 8.84988E-1 ; sqrt( 7.83203E-1) word 8.86090E-1 ; sqrt( 7.85156E-1) word 8.87192E-1 ; sqrt( 7.87109E-1) word 8.88292E-1 ; sqrt( 7.89062E-1) word 8.89391E-1 ; sqrt( 7.91016E-1) word 8.90488E-1 ; sqrt( 7.92969E-1) word 8.91584E-1 ; sqrt( 7.94922E-1) word 8.92679E-1 ; sqrt( 7.96875E-1) word 8.93772E-1 ; sqrt( 7.98828E-1) word 8.94864E-1 ; sqrt( 8.00781E-1) word 8.95954E-1 ; sqrt( 8.02734E-1) word 8.97044E-1 ; sqrt( 8.04687E-1) word 8.98132E-1 ; sqrt( 8.06641E-1) word 8.99218E-1 ; sqrt( 8.08594E-1) word 9.00304E-1 ; sqrt( 8.10547E-1) word 9.01388E-1 ; sqrt( 8.12500E-1) word 9.02470E-1 ; sqrt( 8.14453E-1) word 9.03552E-1 ; sqrt( 8.16406E-1) word 9.04632E-1 ; sqrt( 8.18359E-1) word 9.05711E-1 ; sqrt( 8.20312E-1) word 9.06789E-1 ; sqrt( 8.22266E-1) word 9.07865E-1 ; sqrt( 8.24219E-1) word 9.08940E-1 ; sqrt( 8.26172E-1) word 9.10014E-1 ; sqrt( 8.28125E-1) word 9.11086E-1 ; sqrt( 8.30078E-1) word 9.12157E-1 ; sqrt( 8.32031E-1) word 9.13227E-1 ; sqrt( 8.33984E-1) word 9.14296E-1 ; sqrt( 8.35937E-1) word 9.15364E-1 ; sqrt( 8.37891E-1) word 9.16430E-1 ; sqrt( 8.39844E-1) word 9.17495E-1 ; sqrt( 8.41797E-1) word 9.18559E-1 ; sqrt( 8.43750E-1) word 9.19621E-1 ; sqrt( 8.45703E-1) word 9.20683E-1 ; sqrt( 8.47656E-1) word 9.21743E-1 ; sqrt( 8.49609E-1) word 9.22801E-1 ; sqrt( 8.51562E-1) word 9.23859E-1 ; sqrt( 8.53516E-1) word 9.24915E-1 ; sqrt( 8.55469E-1) word 9.25971E-1 ; sqrt( 8.57422E-1) word 9.27025E-1 ; sqrt( 8.59375E-1) word 9.28078E-1 ; sqrt( 8.61328E-1) word 9.29129E-1 ; sqrt( 8.63281E-1) word 9.30180E-1 ; sqrt( 8.65234E-1) word 9.31229E-1 ; sqrt( 8.67187E-1) word 9.32277E-1 ; sqrt( 8.69141E-1) word 9.33324E-1 ; sqrt( 8.71094E-1) word 9.34370E-1 ; sqrt( 8.73047E-1) word 9.35414E-1 ; sqrt( 8.75000E-1) word 9.36458E-1 ; sqrt( 8.76953E-1) word 9.37500E-1 ; sqrt( 8.78906E-1) word 9.38541E-1 ; sqrt( 8.80859E-1) word 9.39581E-1 ; sqrt( 8.82812E-1) word 9.40620E-1 ; sqrt( 8.84766E-1) word 9.41657E-1 ; sqrt( 8.86719E-1) word 9.42694E-1 ; sqrt( 8.88672E-1) word 9.43729E-1 ; sqrt( 8.90625E-1) word 9.44763E-1 ; sqrt( 8.92578E-1) word 9.45797E-1 ; sqrt( 8.94531E-1) word 9.46829E-1 ; sqrt( 8.96484E-1) word 9.47859E-1 ; sqrt( 8.98437E-1) word 9.48889E-1 ; sqrt( 9.00391E-1) word 9.49918E-1 ; sqrt( 9.02344E-1) word 9.50945E-1 ; sqrt( 9.04297E-1) word 9.51972E-1 ; sqrt( 9.06250E-1) word 9.52997E-1 ; sqrt( 9.08203E-1) word 9.54021E-1 ; sqrt( 9.10156E-1) word 9.55044E-1 ; sqrt( 9.12109E-1) word 9.56066E-1 ; sqrt( 9.14062E-1) word 9.57087E-1 ; sqrt( 9.16016E-1) word 9.58107E-1 ; sqrt( 9.17969E-1) word 9.59126E-1 ; sqrt( 9.19922E-1) word 9.60143E-1 ; sqrt( 9.21875E-1) word 9.61160E-1 ; sqrt( 9.23828E-1) word 9.62175E-1 ; sqrt( 9.25781E-1) word 9.63190E-1 ; sqrt( 9.27734E-1) word 9.64203E-1 ; sqrt( 9.29687E-1) word 9.65215E-1 ; sqrt( 9.31641E-1) word 9.66227E-1 ; sqrt( 9.33594E-1) word 9.67237E-1 ; sqrt( 9.35547E-1) word 9.68246E-1 ; sqrt( 9.37500E-1) word 9.69254E-1 ; sqrt( 9.39453E-1) word 9.70261E-1 ; sqrt( 9.41406E-1) word 9.71267E-1 ; sqrt( 9.43359E-1) word 9.72272E-1 ; sqrt( 9.45312E-1) word 9.73276E-1 ; sqrt( 9.47266E-1) word 9.74279E-1 ; sqrt( 9.49219E-1) word 9.75280E-1 ; sqrt( 9.51172E-1) word 9.76281E-1 ; sqrt( 9.53125E-1) word 9.77281E-1 ; sqrt( 9.55078E-1) word 9.78280E-1 ; sqrt( 9.57031E-1) word 9.79277E-1 ; sqrt( 9.58984E-1) word 9.80274E-1 ; sqrt( 9.60937E-1) word 9.81270E-1 ; sqrt( 9.62891E-1) word 9.82264E-1 ; sqrt( 9.64844E-1) word 9.83258E-1 ; sqrt( 9.66797E-1) word 9.84251E-1 ; sqrt( 9.68750E-1) word 9.85243E-1 ; sqrt( 9.70703E-1) word 9.86233E-1 ; sqrt( 9.72656E-1) word 9.87223E-1 ; sqrt( 9.74609E-1) word 9.88212E-1 ; sqrt( 9.76562E-1) word 9.89199E-1 ; sqrt( 9.78516E-1) word 9.90186E-1 ; sqrt( 9.80469E-1) word 9.91172E-1 ; sqrt( 9.82422E-1) word 9.92157E-1 ; sqrt( 9.84375E-1) word 9.93140E-1 ; sqrt( 9.86328E-1) word 9.94123E-1 ; sqrt( 9.88281E-1) word 9.95105E-1 ; sqrt( 9.90234E-1) word 9.96086E-1 ; sqrt( 9.92187E-1) word 9.97066E-1 ; sqrt( 9.94141E-1) word 9.98045E-1 ; sqrt( 9.96094E-1) word 9.99023E-1 ; sqrt( 9.98047E-1) E 5 I 5 sqrtbl: word 03f3504f7h ; sqrt( 5.00000E-1) word 03f355f57h ; sqrt( 5.01953E-1) word 03f35b9a6h ; sqrt( 5.03906E-1) word 03f3613b2h ; sqrt( 5.05859E-1) word 03f366d9ch ; sqrt( 5.07812E-1) word 03f36c754h ; sqrt( 5.09766E-1) word 03f3720dah ; sqrt( 5.11719E-1) word 03f377a3eh ; sqrt( 5.13672E-1) word 03f37d36fh ; sqrt( 5.15625E-1) word 03f382c80h ; sqrt( 5.17578E-1) word 03f38855eh ; sqrt( 5.19531E-1) word 03f38de1ah ; sqrt( 5.21484E-1) word 03f3936a4h ; sqrt( 5.23437E-1) word 03f398efch ; sqrt( 5.25391E-1) word 03f39e732h ; sqrt( 5.27344E-1) word 03f3a3f46h ; sqrt( 5.29297E-1) word 03f3a9729h ; sqrt( 5.31250E-1) word 03f3aeee9h ; sqrt( 5.33203E-1) word 03f3b4678h ; sqrt( 5.35156E-1) word 03f3b9dd4h ; sqrt( 5.37109E-1) word 03f3bf51fh ; sqrt( 5.39062E-1) word 03f3c4c38h ; sqrt( 5.41016E-1) word 03f3ca31eh ; sqrt( 5.42969E-1) word 03f3cf9e4h ; sqrt( 5.44922E-1) word 03f3d5087h ; sqrt( 5.46875E-1) word 03f3da6f8h ; sqrt( 5.48828E-1) word 03f3dfd48h ; sqrt( 5.50781E-1) word 03f3e5376h ; sqrt( 5.52734E-1) word 03f3ea971h ; sqrt( 5.54687E-1) word 03f3eff4ch ; sqrt( 5.56641E-1) word 03f3f5504h ; sqrt( 5.58594E-1) word 03f3faa9bh ; sqrt( 5.60547E-1) word 03f400000h ; sqrt( 5.62500E-1) word 03f405543h ; sqrt( 5.64453E-1) word 03f40aa65h ; sqrt( 5.66406E-1) word 03f40ff54h ; sqrt( 5.68359E-1) word 03f415422h ; sqrt( 5.70312E-1) word 03f41a8ceh ; sqrt( 5.72266E-1) word 03f41fd59h ; sqrt( 5.74219E-1) word 03f4251c2h ; sqrt( 5.76172E-1) word 03f42a5f8h ; sqrt( 5.78125E-1) word 03f42fa1eh ; sqrt( 5.80078E-1) word 03f434e12h ; sqrt( 5.82031E-1) word 03f43a1e4h ; sqrt( 5.83984E-1) word 03f43f584h ; sqrt( 5.85937E-1) word 03f444913h ; sqrt( 5.87891E-1) word 03f449c80h ; sqrt( 5.89844E-1) word 03f44efbbh ; sqrt( 5.91797E-1) word 03f4542e5h ; sqrt( 5.93750E-1) word 03f4595ddh ; sqrt( 5.95703E-1) word 03f45e8b4h ; sqrt( 5.97656E-1) word 03f463b69h ; sqrt( 5.99609E-1) word 03f468e0dh ; sqrt( 6.01562E-1) word 03f46e07eh ; sqrt( 6.03516E-1) word 03f4732cfh ; sqrt( 6.05469E-1) word 03f4784fdh ; sqrt( 6.07422E-1) word 03f47d70ah ; sqrt( 6.09375E-1) word 03f4828f6h ; sqrt( 6.11328E-1) word 03f487ac0h ; sqrt( 6.13281E-1) word 03f48cc68h ; sqrt( 6.15234E-1) word 03f491defh ; sqrt( 6.17187E-1) word 03f496f54h ; sqrt( 6.19141E-1) word 03f49c098h ; sqrt( 6.21094E-1) word 03f4a11bah ; sqrt( 6.23047E-1) word 03f4a62bbh ; sqrt( 6.25000E-1) word 03f4ab3abh ; sqrt( 6.26953E-1) word 03f4b0468h ; sqrt( 6.28906E-1) word 03f4b5504h ; sqrt( 6.30859E-1) word 03f4ba58fh ; sqrt( 6.32812E-1) word 03f4bf5f9h ; sqrt( 6.34766E-1) word 03f4c4641h ; sqrt( 6.36719E-1) word 03f4c9657h ; sqrt( 6.38672E-1) word 03f4ce66dh ; sqrt( 6.40625E-1) word 03f4d3650h ; sqrt( 6.42578E-1) word 03f4d8612h ; sqrt( 6.44531E-1) word 03f4dd5b2h ; sqrt( 6.46484E-1) word 03f4e2542h ; sqrt( 6.48437E-1) word 03f4e74b0h ; sqrt( 6.50391E-1) word 03f4ec3fch ; sqrt( 6.52344E-1) word 03f4f1327h ; sqrt( 6.54297E-1) word 03f4f6241h ; sqrt( 6.56250E-1) word 03f4fb129h ; sqrt( 6.58203E-1) word 03f500000h ; sqrt( 6.60156E-1) word 03f504eb5h ; sqrt( 6.62109E-1) word 03f509d49h ; sqrt( 6.64062E-1) word 03f50ebcch ; sqrt( 6.66016E-1) word 03f513a2eh ; sqrt( 6.67969E-1) word 03f51886eh ; sqrt( 6.69922E-1) word 03f51d68ch ; sqrt( 6.71875E-1) word 03f522489h ; sqrt( 6.73828E-1) word 03f527275h ; sqrt( 6.75781E-1) word 03f52c040h ; sqrt( 6.77734E-1) word 03f530dfah ; sqrt( 6.79687E-1) word 03f535b81h ; sqrt( 6.81641E-1) word 03f53a8f8h ; sqrt( 6.83594E-1) word 03f53f65eh ; sqrt( 6.85547E-1) word 03f544391h ; sqrt( 6.87500E-1) word 03f5490b4h ; sqrt( 6.89453E-1) word 03f54ddb5h ; sqrt( 6.91406E-1) word 03f552aa6h ; sqrt( 6.93359E-1) word 03f557775h ; sqrt( 6.95312E-1) word 03f55c422h ; sqrt( 6.97266E-1) word 03f5610bfh ; sqrt( 6.99219E-1) word 03f565d3ah ; sqrt( 7.01172E-1) word 03f56a993h ; sqrt( 7.03125E-1) word 03f56f5dch ; sqrt( 7.05078E-1) word 03f574203h ; sqrt( 7.07031E-1) word 03f578e19h ; sqrt( 7.08984E-1) word 03f57da0eh ; sqrt( 7.10937E-1) word 03f5825e1h ; sqrt( 7.12891E-1) word 03f5871a4h ; sqrt( 7.14844E-1) word 03f58bd45h ; sqrt( 7.16797E-1) word 03f5908d5h ; sqrt( 7.18750E-1) word 03f595443h ; sqrt( 7.20703E-1) word 03f599fa1h ; sqrt( 7.22656E-1) word 03f59eaddh ; sqrt( 7.24609E-1) word 03f5a35f8h ; sqrt( 7.26562E-1) word 03f5a8102h ; sqrt( 7.28516E-1) word 03f5acbfbh ; sqrt( 7.30469E-1) word 03f5b16c2h ; sqrt( 7.32422E-1) word 03f5b6189h ; sqrt( 7.34375E-1) word 03f5bac2eh ; sqrt( 7.36328E-1) word 03f5bf6b2h ; sqrt( 7.38281E-1) word 03f5c4125h ; sqrt( 7.40234E-1) word 03f5c8b76h ; sqrt( 7.42187E-1) word 03f5cd5b7h ; sqrt( 7.44141E-1) word 03f5d1fd6h ; sqrt( 7.46094E-1) word 03f5d69e4h ; sqrt( 7.48047E-1) word 03f5db3d0h ; sqrt( 7.50000E-1) word 03f5dfdach ; sqrt( 7.51953E-1) word 03f5e4778h ; sqrt( 7.53906E-1) word 03f5e9121h ; sqrt( 7.55859E-1) word 03f5edaa9h ; sqrt( 7.57812E-1) word 03f5f2420h ; sqrt( 7.59766E-1) word 03f5f6d87h ; sqrt( 7.61719E-1) word 03f5fb6cch ; sqrt( 7.63672E-1) word 03f600000h ; sqrt( 7.65625E-1) word 03f604913h ; sqrt( 7.67578E-1) word 03f609214h ; sqrt( 7.69531E-1) word 03f60db05h ; sqrt( 7.71484E-1) word 03f6123d5h ; sqrt( 7.73437E-1) word 03f616c94h ; sqrt( 7.75391E-1) word 03f61b531h ; sqrt( 7.77344E-1) word 03f61fdbdh ; sqrt( 7.79297E-1) word 03f624628h ; sqrt( 7.81250E-1) word 03f628e93h ; sqrt( 7.83203E-1) word 03f62d6cbh ; sqrt( 7.85156E-1) word 03f631f04h ; sqrt( 7.87109E-1) word 03f63671bh ; sqrt( 7.89062E-1) word 03f63af21h ; sqrt( 7.91016E-1) word 03f63f706h ; sqrt( 7.92969E-1) word 03f643ed9h ; sqrt( 7.94922E-1) word 03f64869ch ; sqrt( 7.96875E-1) word 03f64ce3eh ; sqrt( 7.98828E-1) word 03f6515cfh ; sqrt( 8.00781E-1) word 03f655d3eh ; sqrt( 8.02734E-1) word 03f65a4adh ; sqrt( 8.04687E-1) word 03f65ebfbh ; sqrt( 8.06641E-1) word 03f663327h ; sqrt( 8.08594E-1) word 03f667a53h ; sqrt( 8.10547E-1) word 03f66c15dh ; sqrt( 8.12500E-1) word 03f670846h ; sqrt( 8.14453E-1) word 03f674f2fh ; sqrt( 8.16406E-1) word 03f6795f6h ; sqrt( 8.18359E-1) word 03f67dcadh ; sqrt( 8.20312E-1) word 03f682353h ; sqrt( 8.22266E-1) word 03f6869d7h ; sqrt( 8.24219E-1) word 03f68b04bh ; sqrt( 8.26172E-1) word 03f68f6adh ; sqrt( 8.28125E-1) word 03f693cefh ; sqrt( 8.30078E-1) word 03f69831fh ; sqrt( 8.32031E-1) word 03f69c93fh ; sqrt( 8.33984E-1) word 03f6a0f4dh ; sqrt( 8.35937E-1) word 03f6a554ch ; sqrt( 8.37891E-1) word 03f6a9b28h ; sqrt( 8.39844E-1) word 03f6ae0f4h ; sqrt( 8.41797E-1) word 03f6b26afh ; sqrt( 8.43750E-1) word 03f6b6c48h ; sqrt( 8.45703E-1) word 03f6bb1e2h ; sqrt( 8.47656E-1) word 03f6bf759h ; sqrt( 8.49609E-1) word 03f6c3cb0h ; sqrt( 8.51562E-1) word 03f6c8206h ; sqrt( 8.53516E-1) word 03f6cc73bh ; sqrt( 8.55469E-1) word 03f6d0c6fh ; sqrt( 8.57422E-1) word 03f6d5183h ; sqrt( 8.59375E-1) word 03f6d9685h ; sqrt( 8.61328E-1) word 03f6ddb66h ; sqrt( 8.63281E-1) word 03f6e2047h ; sqrt( 8.65234E-1) word 03f6e6506h ; sqrt( 8.67187E-1) word 03f6ea9b5h ; sqrt( 8.69141E-1) word 03f6eee52h ; sqrt( 8.71094E-1) word 03f6f32dfh ; sqrt( 8.73047E-1) word 03f6f774bh ; sqrt( 8.75000E-1) word 03f6fbbb6h ; sqrt( 8.76953E-1) word 03f700000h ; sqrt( 8.78906E-1) word 03f704439h ; sqrt( 8.80859E-1) word 03f708861h ; sqrt( 8.82812E-1) word 03f70cc79h ; sqrt( 8.84766E-1) word 03f71106fh ; sqrt( 8.86719E-1) word 03f715465h ; sqrt( 8.88672E-1) word 03f719839h ; sqrt( 8.90625E-1) word 03f71dbfdh ; sqrt( 8.92578E-1) word 03f721fc1h ; sqrt( 8.94531E-1) word 03f726363h ; sqrt( 8.96484E-1) word 03f72a6e3h ; sqrt( 8.98437E-1) word 03f72ea64h ; sqrt( 9.00391E-1) word 03f732dd3h ; sqrt( 9.02344E-1) word 03f737122h ; sqrt( 9.04297E-1) word 03f73b470h ; sqrt( 9.06250E-1) word 03f73f79dh ; sqrt( 9.08203E-1) word 03f743ab8h ; sqrt( 9.10156E-1) word 03f747dc3h ; sqrt( 9.12109E-1) word 03f74c0beh ; sqrt( 9.14062E-1) word 03f7503a7h ; sqrt( 9.16016E-1) word 03f754680h ; sqrt( 9.17969E-1) word 03f758948h ; sqrt( 9.19922E-1) word 03f75cbefh ; sqrt( 9.21875E-1) word 03f760e95h ; sqrt( 9.23828E-1) word 03f76511ah ; sqrt( 9.25781E-1) word 03f76939fh ; sqrt( 9.27734E-1) word 03f76d602h ; sqrt( 9.29687E-1) word 03f771855h ; sqrt( 9.31641E-1) word 03f775aa7h ; sqrt( 9.33594E-1) word 03f779cd8h ; sqrt( 9.35547E-1) word 03f77def8h ; sqrt( 9.37500E-1) word 03f782108h ; sqrt( 9.39453E-1) word 03f786306h ; sqrt( 9.41406E-1) word 03f78a4f4h ; sqrt( 9.43359E-1) word 03f78e6d1h ; sqrt( 9.45312E-1) word 03f79289eh ; sqrt( 9.47266E-1) word 03f796a59h ; sqrt( 9.49219E-1) word 03f79abf3h ; sqrt( 9.51172E-1) word 03f79ed8dh ; sqrt( 9.53125E-1) word 03f7a2f16h ; sqrt( 9.55078E-1) word 03f7a708fh ; sqrt( 9.57031E-1) word 03f7ab1e6h ; sqrt( 9.58984E-1) word 03f7af33dh ; sqrt( 9.60937E-1) word 03f7b3483h ; sqrt( 9.62891E-1) word 03f7b75a7h ; sqrt( 9.64844E-1) word 03f7bb6cch ; sqrt( 9.66797E-1) word 03f7bf7e0h ; sqrt( 9.68750E-1) word 03f7c38e3h ; sqrt( 9.70703E-1) word 03f7c79c4h ; sqrt( 9.72656E-1) word 03f7cbaa6h ; sqrt( 9.74609E-1) word 03f7cfb76h ; sqrt( 9.76562E-1) word 03f7d3c25h ; sqrt( 9.78516E-1) word 03f7d7cd4h ; sqrt( 9.80469E-1) word 03f7dbd73h ; sqrt( 9.82422E-1) word 03f7dfe00h ; sqrt( 9.84375E-1) word 03f7e3e6ch ; sqrt( 9.86328E-1) word 03f7e7ed8h ; sqrt( 9.88281E-1) word 03f7ebf34h ; sqrt( 9.90234E-1) word 03f7eff7eh ; sqrt( 9.92187E-1) word 03f7f3fb8h ; sqrt( 9.94141E-1) word 03f7f7fe1h ; sqrt( 9.96094E-1) word 03f7fbff9h ; sqrt( 9.98047E-1) E 5 D 7 E 7 E 1 h12493 s 00004/00000/00388 d D 4.3 87/04/16 13:57:10 mth 8 7 c Profiling changes e s 00103/00021/00285 d D 4.2 87/02/16 17:31:31 mth 7 6 c Parameters in registers. e s 00000/00000/00306 d D 4.1 87/02/16 16:59:08 mth 6 5 c rolled rev to -r4 (mth) e s 00003/00003/00303 d D 3.3 87/01/31 13:28:52 mkm 5 4 c correct compatability probs between ROS and SPIX as. -mkm e s 00000/00000/00306 d D 3.2 87/01/31 11:54:49 mkm 4 3 c from ROS sources as of this date. -mkm e s 00000/00000/00306 d D 3.1 87/01/21 17:46:56 mkm 3 2 c e s 00000/00000/00306 d D 2.1 87/01/21 17:44:19 mkm 2 1 c e s 00306/00000/00000 d D 1.1 87/01/21 17:42:11 mkm 1 0 c Placed under source control - mkm c These files are direct descendants of the ROS files c by the same name at or about ROS rev 5.1 e u U f b f n t T I 1 ; "%W% %G%" dsect data name byte 'tan',0 ;name of routine D 5 emess byte 'tan: TLOSS error\n",0 ;error message E 5 I 5 emess byte 'tan: TLOSS error\n',0 ;error message E 5 messlen equ 17 ;length of message D 5 nanmess byte 'tan: input value was NAN\n",0 ;error message if nan E 5 I 5 nanmess byte 'tan: input value was NAN\n',0 ;error message if nan E 5 nanlen equ 25 D 5 infmess byte 'tan: input value was INF\n",0 ;error message if "infinity" E 5 I 5 infmess byte 'tan: input value was INF\n',0 ;error message if "infinity" E 5 inflen equ 25 csect code align 2 externd _errno external _write external _matherr e_type equ -32 ;exception type e_name equ -28 ;name of routine in error e_arg1 equ -24 ;argument 1 e_arg2 equ -16 ;argument 2 (if present) e_retval equ -8 ;room for exception block e_size equ -80 ; plus stack frame with 3 parameters I 7 #ifdef ARGSINREGS pe_size equ 80 ; positive e_size #else pe_size equ 0 ; positive e_size #endif E 7 DOMAIN equ 1 SING equ 2 OVERFLOW equ 3 UNDERFLOW equ 4 TLOSS equ 5 PLOSS equ 6 EDOM equ 33 ERANGE equ 34 pi: ;initialize array pi word 1059250176 ;equals . word 969670656 word 878411776 word 782008320 word 679641088 word 596959232 word 510689280 word 418045952 word 324132864 word 229220352 ;equals .10453948e-29 csect code C3 equ 03eaaaae4h ;equals .333335034 C2 equ 03ea88e8dh ;equals .329212565 C1 equ 0401e093ah ;equals 2.46931313 PI1 equ 03f22e000h ;equals pi[1]=.63623047 PID2 equ 03fc90fdah ;equals pi divided by 2 = 1.5707963 MMANT equ 0000000ffh ;to mask off mantissa and sign of rotated # MASK equ 0fffff800h ;to mask off 11 low order bits LIMIT equ 04f000000h ;equals 2147483647 LIMIT2 equ 03f490ff9h ;equals .7854 radians = 45 degrees EBIAS equ 127 ;to unbias the exponent ONE equ 03f800000h ;equals one ABS equ 07fffffffh ;to find the absolute value of the argument INF equ 07f800000h ;equals infinity MIN equ 03951b717h ;equals 2e-4 as a lower bound arg3 equ 40 arg2 equ 32 arg1 equ 24 arg equ -4 arg_1 equ -8 arg_2 equ -16 arg_3 equ -20 I 7 E 7 #ifdef SingleLib global _tan ;single precision library _tan: I 8 ; MCOUNT E 8 I 7 #ifndef ARGSINREGS E 7 load r0,r14,arg1 I 7 #endif E 7 #else global _s_tan ;rc and rp global _r_tan ;f77 global _R_tan ;rf D 7 _s_tan: load r0,r14,arg1 E 7 I 7 _s_tan: I 8 ; MCOUNT E 8 #ifndef ARGSINREGS load r0,r14,arg1 #endif E 7 br _R_tan _r_tan: I 8 ; MCOUNT E 8 I 7 #ifndef ARGSINREGS E 7 load r0,r14,arg1 I 7 #endif E 7 load r0,r0,0 ;get argument _R_tan: I 8 ; MCOUNT E 8 D 7 #endif SingleLib E 7 I 7 #endif E 7 laddr r2,ABS,L and r2,r0 ;r2=abs(arg) laddr r1,LIMIT,L br r2>r1,badinput ;if abs(arg)>LIMIT then badinput else ... pi_reduce: D 7 ;r0="result",arg stored at r14+arg; r1="upper"; r2="lower"; r3="cutoff"(int) E 7 I 7 ;r0="result",arg stored at STKPTR+arg; r1="upper"; r2="lower"; r3="cutoff"(int) E 7 ;r4="mult"; r5="rlower"; r6="i"(int); r7=%logb,i+1,itemp,rtemp; r8= variables I 7 #ifdef ARGSINREGS stored r7,STKPTR,arg_2 ;save r7 and r8 for variables store r0,STKPTR,arg_3 ;save sign of original argument store r2,STKPTR,arg ;save original abs(arg) #else E 7 store r6,r14,arg_1 ;save r6 for use as "i" and other variables stored r7,r14,arg_2 ;save r7 and r8 for variables store r0,r14,arg_3 ;save sign of original argument store r2,r14,arg ;save original abs(arg) I 7 #endif E 7 laddr r1,LIMIT2,L br r2=r3,cont! ;while (%t_logb(result) < cutoff) laddr r8,24 br r6>=r8,cont ;and (i+2 < prec) do ... move r7,4 add r7,r6 ;r7="i+1" load r8,r7,pi,L ;r8="pi[i+1]" rmpy r8,r1 ;"upper*pi[i+1]" load r7,r6,pi,L ;r7="pi[i]" rmpy r7,r2 ;"lower*pi[i]" radd r7,r8 ;"(... + ...)" radd r5,r7 ;r5="rlower=rlower+(lower*pi[i]+upper*pi[i+1])" move r7,r0 radd r7,r5 ;r7="rtemp=result+rlower" laddr r8,03f000000h,L ;equals .5 br r7= .5 then ... else ifnot fixr r7,r7 ;r7="itemp=round(rtemp)" add r4,r7 ;r4="mult=mult+itemp" float r7,r7 ;converts r7 to a real to use rsub on it rsub r0,r7 ;r0="result=result-rtemp" move r7,r0 radd r7,r0 ;r7="rtemp=result+rlower" ifnot: rsub r0,r7 ;"(result-rtemp)" radd r5,r0 ;r5="rlower=(result-rtemp)+rlower" move r0,r7 ;r0="result=rtemp" move r8,11 ;"halfsz" sub r3,r8 ;r3="cutoff=cutoff-halfsz" add r6,4 ;r6="i=i+1" br while ;loop cont: ;assumes r1,r3 are free for use as variables load r1,r6,pi,L ;r1=pi[i].rr rmpy r2,r1 ;r2="lower*pi[i].rr" add r6,4 ;r6=i=i+1 load r1,r6,pi,L ;r1=pi[i+1].rr add r6,4 ;r6=i=i+1 load r3,r6,pi,L ;r3=pi[i+2].rr radd r3,r1 ;r3="(pi[i+1].rr + pi[i+2].rr)" I 7 #ifdef ARGSINREGS load r1,STKPTR,arg ;restore saved original argument to r1 #else E 7 load r1,r14,arg ;restore saved original argument to r1 I 7 #endif E 7 rmpy r1,r3 ;"arg * (...)" radd r1,r2 ;"(...)+arg*(...)" radd r1,r5 ;"(... + rlower)" radd r0,r1 ;"(... + result)" laddr r1,PID2,L rmpy r0,r1 ;r0="result= piover2 * (( (lower*pi[i] + arg ; *(pi[i+1] + pi[i+2])) +rlower)+result)" calctan: ;finish calculations ; r0 = result r4=mult I 7 #ifdef ARGSINREGS loadd r7,STKPTR,arg_2 ;restore old saved r7 and r8's value ;end of pi_reduce load r5,STKPTR,arg_3 #else E 7 load r6,r14,arg_1 ;restore old saved r6's value loadd r7,r14,arg_2 ;restore old saved r7 and r8's value D 7 ;end of pi_reduce load r5,r14,arg_3 ;01/17/85 hlf move this here from line aboveso it works for ; very small numbers too. restore original sign to r5 E 7 I 7 ;end of pi_reduce load r5,r14,arg_3 #endif ;01/17/85 hlf move this here from line above so ; it works for very small numbers too. restore ; original sign to r5 E 7 move r1,r0 rmpy r1,r1 ;r1="xsq=sqr(x)" laddr r2,C1,L ;C1 move r3,r1 rsub r3,r2 ;r3="(xsq-C1)" laddr r2,C2,L ;C2 rdiv r2,r3 ;"(C2 / (xsq - C1))" rmpy r2,r1 ;"xsq * (...)" laddr r3,C3,L ;C3 rsub r3,r2 ;"(C3 - ...)" rmpy r1,r3 ;"xsq * (...)" move r2,r0 rmpy r2,r1 ;"x * ..." radd r0,r2 ;r0="result=x+x*xsq*(C3-xsq*(C2/(xsq-C1)))" move r1,1 and r4,r1 br r4=0,done ;if even(mult) then done else odd odd: laddr r1,0bf800000h,L ;equals -1.0 rdiv r1,r0 move r0,r1 ;r1="result= -1.0/result" done: br r5<0,negate D 7 ret r11,r11 ;done!!! E 7 I 7 #ifdef ARGSINREGS ret LINK,LINK #else ret r11,r11 #endif E 7 negate rneg r0,r0 D 7 ret r11,r11 ;done. E 7 I 7 #ifdef ARGSINREGS ret LINK,LINK #else ret r11,r11 #endif E 7 D 7 min: ret r11,r11 ;return as the result the argument E 7 I 7 min: #ifdef ARGSINREGS ret LINK,LINK ;return as the result the argument #else ret r11,r11 #endif E 7 mult0: laddr r4,MIN,L ;r4=minimum D 7 store r0,r14,arg_3 ;01/17/85 hlf was not doing this if arg very small ;save sign of original argument E 7 I 7 #ifdef ARGSINREGS store r0,STKPTR,arg_3 ;01/17/85 hlf was not doing this if arg very small #else store r0,r14,arg_3 ;01/17/85 hlf was not doing this if arg very small #endif ;save sign of original argument E 7 br r20,err_rtn ;yes (assume user will change r0 if yes ) mess: ;prints out our error message move r0,2 I 7 #ifdef ARGSINREGS laddr r1,emess,L laddr r2,messlen call LINK,_write,L ;writes out message #else E 7 store r0,r14,arg1 laddr r5,emess,L store r5,r14,arg2 ;gives message laddr r0,messlen store r0,r14,arg3 ;gives length of message call r11,_write,L ;writes out message I 7 #endif E 7 laddr r0,ERANGE ;sets global variable _errno for user store r0,_errno,L D 7 E 7 I 7 #ifdef ARGSINRESG load r4,STKPTR,arg_1 ;restore r4's old value (if inf or not) #else E 7 load r4,r14,arg_1 ;restore r4's old value (if inf or not) I 7 #endif E 7 br r4=0,inf ;if abs(arg)="infinity" then go to inf br r4<0,nan ;if abs(arg) is not-a-number then go to nan ;else return err_rtn: ;resets all old pointers and returns zero I 7 #ifdef ARGSINREGS laddr STKPTR,STKPTR,pe_size ;user will have already used matherr for himself load LINK,STKPTR,0 laddr r0,0 ;returns 0 ret LINK,LINK #else E 7 move r14,r15 ;user will have already used matherr for himself load r15,r14,8 load r11,r14,0 move r0,0 ;to return 0 ret r11,r11 I 7 #endif E 7 inf: move r0,2 ;to print I 7 #ifdef ARGSINREGS laddr r1,infmess,L laddr r2,inflen call LINK,_write,L #else E 7 store r0,r14,arg1 laddr r5,infmess,L store r5,r14,arg2 ;gives write the message laddr r0,inflen store r0,r14,arg3 ;gives write the length of message call r11,_write,L I 7 #endif E 7 br err_rtn nan: move r0,2 ;to print I 7 #ifdef ARGSINREGS laddr r1,nanmess,L laddr r2,nanlen call LINK,_write,L #else E 7 store r0,r14,arg1 laddr r5,nanmess,L store r5,r14,2>=<;:9876543210/.-,+*)('&%$#"!  h17021 s 00004/00000/00285 d D 4.3 87/04/16 13:57:12 mth 8 7 c Profiling changes e s 00069/00011/00216 d D 4.2 87/02/16 17:31:34 mth 7 6 c Parameters in registers. e s 00000/00000/00227 d D 4.1 87/02/16 16:59:11 mth 6 5 c rolled rev to -r4 (mth) e s 00002/00002/00225 d D 3.3 87/01/31 13:28:54 mkm 5 4 c correct compatability probs between ROS and SPIX as. -mkm e s 00000/00000/00227 d D 3.2 87/01/31 11:54:51 mkm 4 3 c from ROS sources as of this date. -mkm e s 00000/00000/00227 d D 3.1 87/01/21 17:46:58 mkm 3 2 c e s 00000/00000/00227 d D 2.1 87/01/21 17:44:21 mkm 2 1 c e s 00227/00000/00000 d D 1.1 87/01/21 17:42:12 mkm 1 0 c Placed under source control - mkm c These files are direct descendants of the ROS files c by the same name at or about ROS rev 5.1 e u U f b f n t T I 1 ; "%W% %G%" dsect data name byte 'tanh',0 ;name of routine emess byte 'tanh: DOMAIN error\n',0 ;error message messlen equ 19 ;length of message D 5 nanmess byte 'tanh: input value was NAN\n",0 ;error message if nan E 5 I 5 nanmess byte 'tanh: input value was NAN\n',0 ;error message if nan E 5 nanlen equ 26 D 5 infmess byte 'tanh: input value was INF\n",0 ;error message if "infinity" E 5 I 5 infmess byte 'tanh: input value was INF\n',0 ;error message if "infinity" E 5 inflen equ 26 csect code align 2 externd _errno external _write external _matherr e_type equ -32 ;exception type e_name equ -28 ;name of routine in error e_arg1 equ -24 ;argument 1 e_arg2 equ -16 ;argument 2 (if present) e_retval equ -8 ;room for exception block e_size equ -80 ; plus stack frame with 3 parameters I 7 #ifdef ARGSINREGS pe_size equ 80 ; positive e_size #else pe_size equ 0 ; positive e_size #endif E 7 DOMAIN equ 1 SING equ 2 OVERFLOW equ 3 UNDERFLOW equ 4 TLOSS equ 5 PLOSS equ 6 EDOM equ 33 ERANGE equ 34 csect code C1 equ 0bb763d74h ;equals -.003757325 C2 equ 0bf52f16ch ;equals -.8239962892 C3 equ 0401e352fh ;equals 2.47199617 CC1 equ 03d6c5665h ;equals .0575995815 CC2 equ 040e6e1ach ;equals 7.21504804 CC3 equ 041a68bbbh ;equals 20.8182281 TWODLN2 equ 04038aa3bh ;equals 2/ln(2) = 2.88539008 LIMIT1 equ 03f400000h ;equals .75 LIMIT2 equ 041102d0eh ;equals 9.011 MASK equ 0000000ffh ;to clear all but last 8 bits MASKE equ 0007fffffh ;to clear off the exponent ABS equ 07fffffffh ;to find the absolute value of a number ONE equ 03f800000h ;equals one INF equ 07f800000h ;equals "infinity" LOWLIM equ 029e12e13h ;equals 1e-13 arg3 equ 40 arg2 equ 32 arg1 equ 24 arg_1 equ -8 I 7 E 7 #ifdef SingleLib global _tanh ;single precision library _tanh: I 8 ; MCOUNT E 8 I 7 #ifndef ARGSINREGS E 7 load r0,r14,arg1 I 7 #endif E 7 #else global _s_tanh ;rc and rp global _r_tanh ;f77 global _R_tanh ;rf _s_tanh: I 8 ; MCOUNT E 8 I 7 #ifndef ARGSINREGS E 7 load r0,r14,arg1 I 7 #endif E 7 br _R_tanh _r_tanh: I 8 ; MCOUNT E 8 I 7 #ifndef ARGSINREGS E 7 load r0,r14,arg1 I 7 #endif E 7 load r0,r0,0 ;get arg _R_tanh: I 8 ; MCOUNT E 8 D 7 #endif SingleLib E 7 I 7 #endif E 7 laddr r1,ABS,L and r1,r0 ;r1="x=abs(arg)" laddr r2,LOWLIM,L rcomp r2,r1 br r2>0,toosml laddr r2,INF,L br r1>=r2,badinput ;if arg=nan or inf then badinput laddr r2,LIMIT1,L br r1>=r2,greater ;"if x<.75 then ... else greater less: laddr r2,r1 rmpy r2,r2 ;r2="xsq=sqr(x)" laddr r3,C1,L ;C1 rmpy r3,r2 ;"xsq*(C1)" laddr r4,C2,L ;C2 radd r3,r4 ;"(C2+...)" rmpy r3,r2 ;"xsq*(...)" rmpy r3,r0 ;r3="arg*..." = numerator laddr r4,C3,L ;C3 radd r4,r2 ;r4="(C3 + xsq)" = denominator rdiv r3,r4 ;".../..." radd r0,r3 ;r0="result=arg + ..." D 7 toosml: ret r11,r11 E 7 I 7 toosml: #ifdef ARGSINREGS ret LINK,LINK #else ret r11,r11 #endif E 7 greater: laddr r2,LIMIT2,L br r1>r2,one ;if x>9.011 then one else ... laddr r2,TWODLN2,L rmpy r1,r2 ;r1="x=x*TWODLN2" fixr r3,r1 ;r3="mult=round(x)" float r3,r3 ;to be able to use mult with rsub rsub r1,r3 ;r1="x=x-mult" laddr r2,r1 rmpy r2,r2 ;r2="xsq=sqr(x)" laddr r4,CC1,L ;CC1 rmpy r4,r2 ;"xsq*CC1" laddr r5,CC2,L ;CC2 radd r4,r5 ;"(CC2 + ...)" rmpy r1,r4 ;r1="p=x*(CC2 + xsq * CC1)" laddr r4,CC3,L ;CC3 radd r2,r4 ;r2="q=CC3 + xsq" fixt r3,r3 ;reconverts mult to an integer for "pack" laddr r4,r1 radd r4,r2 ;r4="p+q" for "pack" rsub r2,r1 ;r2="q-p" pack: laddr r5,r4 csl r5,9 laddr r1,MASK,L and r5,r1 ;clear r5 of all but exponent as an integer add r5,r3 ;r5="u.exp=u.exp+mult" laddr r3,MASKE,L and r3,r4 ;masks off r4's exponent laddr r4,23 csl r5,r4 or r3,r5 ;r3="temp=pack(p+q,mult)" radd r3,r2 ;r3="(temp+(q-p))" laddr r1,000800000h,L add r2,r1 ;r2="2*(q-p)" rdiv r2,r3 ;r2=".../..." laddr r1,ONE,L rsub r1,r2 ;r1="result = 1.0 - ..." sign: laddr r2,080000000h,L and r0,r2 ;to mask off everything but the sign bit of arg or r0,r1 ;"if arg<0 then result=-result" D 7 ret r11,r11 E 7 I 7 #ifdef ARGSINREGS ret LINK,LINK #else ret r11,r11 #endif E 7 one: laddr r1,ONE,L ;since x>9.011 result=1.0 br sign ; ; error handling ; badinput: ;loads values into error structure in case user ;wishes to do more with them than we have done rcomp r2,r1 ;if arg=inf then r2=0 ; if arg=nan then r2=-1 I 7 #ifdef ARGSINREGS store LINK,STKPTR,0 ;save old return laddr STKPTR,STKPTR,e_size ;update stack store r2,STKPTR,arg_1 #else E 7 store r11,r14,0 ;save old return store r15,r14,8 ;save old frame pointer move r15,r14 laddr r14,r14,e_size ;update stack D 7 E 7 store r2,r14,arg_1 ;to store r2's value D 7 store r0,r15,e_arg1 ;load arg's value into error structure E 7 I 7 #endif store r0,STKPTR,pe_size+e_arg1 ;load arg's value into error structure E 7 laddr r2,name,L ;name of offending routine D 7 store r2,r15,e_name ; into error structure E 7 I 7 store r2,STKPTR,pe_size+e_name ; into error structure E 7 move r3,DOMAIN ;exception type D 7 store r3,r15,e_type E 7 I 7 store r3,STKPTR,pe_size+e_type E 7 laddr r0,03f800000h,L D 7 store r0,r15,e_retval ;return 1 E 7 I 7 store r0,STKPTR,pe_size+e_retval ;return 1 E 7 I 7 #ifdef ARGSINREGS laddr r0,STKPTR,pe_size+e_type ;user want to do different anything with error? call LINK,_matherr,L ;matherr is a function for user to define #else E 7 laddr r4,r15,e_type ;user want to do different anything with error? store r4,r14,arg1 ;gives matherr the address of error structure call r11,_matherr,L ;matherr is a function for user to define I 7 #endif E 7 br r0<>0,err_rtn ;yes (assume user will change r0 if yes ) mess: ;prints out our error message move r0,2 I 7 #ifdef ARGSINREGS laddr r1,emess,L laddr r2,messlen call LINK,_write,L ;writes out message #else E 7 store r0,r14,arg1 laddr r5,emess,L store r5,r14,arg2 ;gives message laddr r0,messlen store r0,r14,arg3 ;gives length of message call r11,_write,L ;writes out message I 7 #endif E 7 laddr r0,EDOM ;sets global variable _errno for user store r0,_errno,L D 7 E 7 I 7 #ifdef ARGSINREGS load r2,STKPTR,arg_1 ;restore value of r2 (ie is arg inf or nan?) #else E 7 load r2,r14,arg_1 ;restore value of r2 (ie is arg inf or nan?) I 7 #endif E 7 br r2=0,inf ;if arg=inf then inf else nan nan: move r0,2 ;to print I 7 #ifdef ARGSINREGS laddr r1,nanmess,L laddr r2,nanlen call LINK,_write,L #else E 7 store r0,r14,arg1 laddr r5,nanmess,L store r5,r14,arg2 ;gives write the message laddr r0,nanlen store r0,r14,arg3 ;gives write the length of message call r11,_write,L I 7 #endif E 7 err_rtn: ;resets all old pointers and returns one I 7 #ifdef ARGSINREGS laddr STKPTR,STKPTR,pe_size ;user will have already used matherr for himself load LINK,STKPTR,0 laddr r0,03f800000h,L ;returns 1 ret LINK,LINK #else E 7 move r14,r15 ;user will have already used matherr for himself load r15,r14,8 load r11,r14,0 laddr r0,03f800000h,L ;to return 1 ret r11,r11 I 7 #endif E 7 inf: move r0,2 ;to print I 7 #ifdef ARGSINREGS laddr r1,infmess,L laddr r2,inflen call LINK,_write,L #else E 7 store r0,r14,arg1 laddr r5,infmess,L store r5,r14,arg2 ;gives write the message laddr r0,inflen store r0,r14,arg3 ;gives write the length of message call r11,_write,L I 7 #endif E 7 br err_rtn E 1 h24820 s 00001/00001/00148 d D 4.10 87/04/16 15:28:12 build 19 17 c Profiling cleanup e s 00000/00000/00149 d R 4.10 87/04/16 15:27:24 build 18 17 c Profiling cleanup e s 00001/00001/00148 d D 4.9 87/04/16 15:11:08 build 17 16 c Profiling cleanup e s 00008/00035/00141 d D 4.8 87/04/16 14:12:01 build 16 15 c Profiling changes e s 00066/00003/00110 d D 4.7 87/04/16 13:55:30 mth 15 14 c Profiling changes e s 00001/00001/00112 d D 4.6 87/03/21 11:36:40 build 14 13 c install: chmod, chgrp, chown. In that order! /dc e s 00003/00003/00110 d D 4.5 87/03/16 22:33:26 build 13 12 c changed -z to -Fs. -mkm e s 00003/00003/00110 d D 4.4 87/02/28 13:45:21 build 12 10 c Replace "-Fs" with "-z" for single precision modules. e s 00002/00001/00109 d D 3.5.1.1 87/02/24 16:49:18 build 11 7 c added -rm -f to install section. -mkm e s 00002/00001/00111 d D 4.3 87/02/24 16:47:22 build 10 9 c added -rm -f to install section. -mkm e s 00002/00000/00110 d D 4.2 87/02/19 08:51:49 mth 9 8 c Parameters in registers e s 00000/00000/00110 d D 4.1 87/02/16 16:57:01 mth 8 7 c rolled rev to -r4 (mth) e s 00006/00004/00104 d D 3.5 87/02/07 12:04:00 build 7 6 c changed the single precision flags. -mkm e s 00025/00019/00083 d D 3.4 87/02/05 23:57:25 build 6 5 c modified to conform with template. -mkm e s 00017/00019/00085 d D 3.3 87/01/31 15:45:28 mkm 5 4 c modified for RX.V -mkm e s 00009/00040/00095 d D 3.2 87/01/31 13:28:56 mkm 4 3 c correct compatability probs between ROS and SPIX as. -mkm e s 00000/00000/00135 d D 3.1 87/01/31 12:12:32 mkm 3 2 c rolled rev to -r3 (mkm) e s 00000/00000/00135 d D 2.1 87/01/31 12:12:32 mkm 2 1 c AUTO NULL DELTA e s 00135/00000/00000 d D 1.1 87/01/31 12:05:48 mkm 1 0 c placed under source control (mkm) e u U f b f n t T I 7 D 15 E 15 E 7 I 1 # "%W% %G%" # D 6 # makefile for libm E 6 I 6 # libm makefile E 6 # D 6 # Note that the object list given in FILES is in the order in which the files # should be added to the archive when it is created. If the files are not # ordered correctly, linking of libm fails on the pdp11 and is slowed down # on other machines. E 6 I 6 # E 6 D 4 include /usr/src/makerules .SUFFIXES: .S .S~ CFLAGS= -O VFLAGS= INSDIR=/priam/release E 4 I 4 I 9 ASFLAGS2 = -DARGSINREGS -DLINK=r15 -DSTKPTR=r14 I 15 DFLAGS = $(PROFLAG) E 15 I 15 PROFLAG = MCOUNT = E 15 E 9 D 6 INSDIR= E 4 DEST=${INSDIR}/lib INS= cp D 4 LPR=/bin/lpr E 4 I 4 LPR=/bin/lp E 4 LPROPTS=-f E 6 I 6 # DESTDIR is the directory where prog's final form gets installed D 15 DESTDIR = $(SMX)/lib E 15 I 15 DESTDIR = $(SMX)/lib PDESTDIR = $(SMX)/lib/libp E 15 E 6 LIBNAME = libm.a I 15 PLIBNAME = plibm.a E 15 D 4 CC = /bin/rc AR = ar CPP = cpp E 4 I 4 I 16 D 19 LIBC_SRC = /src.cmd/lib/libc E 19 I 19 LIBC_SRC = ../libc E 19 E 16 I 15 .s~.a: $(GET) $(GFLAGS) -p $< > tmp.s $(M4) $(MCOUNT) tmp.s > $*.s $(AS) -I$(INC) $(ASFLAGS) $*.s $(AR) r $@ $*.o rm -f $*.[so] tmp.[os] .s.a: $(M4) $(MCOUNT) $*.s > tmp.s $(AS) -I$(INC) $(ASFLAGS) tmp.s mv tmp.o $*.o $(AR) r $@ $*.o rm -f $*.o tmp.[os] E 15 E 4 D 5 ASMSRCS= d_acos.S d_asin.S d_atan.S d_atn2.S d_cos.S d_cosh.S \ d_exp.S d_lg10.S d_log.S d_sin.S d_sinh.S d_sqrt.S d_tan.S d_tanh.S \ r_acos.S r_asin.S r_atan.S r_atn2.S r_cos.S r_cosh.S \ r_exp.S r_lg10.S r_log.S r_sin.S r_sinh.S r_sqrt.S r_tan.S r_tanh.S \ pow_rr.S pow_dd.S E 5 I 5 ASMSRCS= d_acos.s d_asin.s d_atan.s d_atn2.s d_cos.s d_cosh.s \ d_exp.s d_lg10.s d_log.s d_sin.s d_sinh.s d_sqrt.s d_tan.s d_tanh.s \ r_acos.s r_asin.s r_atan.s r_atn2.s r_cos.s r_cosh.s \ r_exp.s r_lg10.s r_log.s r_sin.s r_sinh.s r_sqrt.s r_tan.s r_tanh.s \ pow_rr.s pow_dd.s E 5 D 6 SRCS= erf.c fabs.c floor.c fmod.c gamma.c hypot.c jn.c\ E 6 I 6 CSRCS= erf.c fabs.c floor.c fmod.c gamma.c hypot.c jn.c\ E 6 j0.c j1.c matherr.c D 7 # Must be compiled with -z (single precision) option. E 7 I 7 D 12 # ZSRCS must be compiled with -Fs (single precision) option. E 12 I 12 D 13 # ZSRCS must be compiled with -z (single precision) option. E 13 I 13 # ZSRCS must be compiled with -Fs (single precision) option. E 13 E 12 E 7 ZSRCS= r_floor.c r_modf.c I 6 SRC= $(ASMSRCS) $(CSRCS) $(ZSRCS) E 6 I 5 ZOBJS = r_floor.o r_modf.o E 5 OBJS =\ $(LIBNAME)(erf.o) \ $(LIBNAME)(fabs.o) \ $(LIBNAME)(floor.o) \ $(LIBNAME)(fmod.o) \ $(LIBNAME)(gamma.o) \ $(LIBNAME)(hypot.o) \ D 5 $(LIBNAME)(jn.o\ E 5 I 5 $(LIBNAME)(jn.o) \ E 5 $(LIBNAME)(j0.o) \ $(LIBNAME)(j1.o) \ $(LIBNAME)(version.o) \ D 5 $(LIBNAME)(matherr.o) D 4 ZOBJS =\ $(LIBNAME)(r_floor.o) \ $(LIBNAME)(r_modf.o) E 4 I 4 ZOBJS = r_floor.o r_modf.o E 4 ASMOBJS= \ E 5 I 5 $(LIBNAME)(matherr.o) \ E 5 $(LIBNAME)(d_acos.o) \ $(LIBNAME)(d_asin.o) \ $(LIBNAME)(d_atan.o) \ $(LIBNAME)(d_atn2.o) \ $(LIBNAME)(d_cos.o) \ $(LIBNAME)(d_cosh.o) \ $(LIBNAME)(d_exp.o) \ $(LIBNAME)(d_lg10.o) \ $(LIBNAME)(d_log.o) \ $(LIBNAME)(d_sin.o) \ $(LIBNAME)(d_sinh.o) \ $(LIBNAME)(d_sqrt.o) \ $(LIBNAME)(d_tan.o) \ $(LIBNAME)(d_tanh.o) \ $(LIBNAME)(pow_dd.o) \ $(LIBNAME)(r_acos.o) \ $(LIBNAME)(r_asin.o) \ $(LIBNAME)(r_atan.o) \ $(LIBNAME)(r_atn2.o) \ $(LIBNAME)(r_cos.o) \ $(LIBNAME)(r_cosh.o) \ $(LIBNAME)(r_exp.o) \ $(LIBNAME)(r_lg10.o) \ $(LIBNAME)(r_log.o) \ $(LIBNAME)(r_sin.o) \ $(LIBNAME)(r_sinh.o) \ $(LIBNAME)(r_sqrt.o) \ $(LIBNAME)(r_tan.o) \ $(LIBNAME)(r_tanh.o) \ $(LIBNAME)(pow_rr.o) I 5 ZOBJS = r_floor.o r_modf.o E 5 D 4 DEPEND = s.libm.v $(SRCS) version.c $(ASMSRCS) E 4 D 4 all: Version.libm $(LIBNAME) E 4 I 4 D 5 all: $(LIBNAME) E 5 I 5 all: $(LIBNAME) I 6 D 15 $(NM) -xv $(LIBNAME) > $(LIBNAME).map E 15 E 6 E 5 E 4 D 4 test: $(LIBNAME) Version.libm: makeversion -c $(VFLAGS) $(DEPEND) $(LIBNAME):: $(OBJS) $(CC) -c $(CFLAGS) $(?:.o=.c) $(AR) rv $(LIBNAME) $? -rm -f $? E 4 D 5 # Compile with -z (single precision) option D 4 $(LIBNAME):: $(ZOBJS) E 4 I 4 $(LIBNAME): $(ZOBJS) E 4 $(CC) -cz $(CFLAGS) $(?:.o=.c) $(AR) rv $(LIBNAME) $? -rm -f $? E 5 I 5 D 16 $(LIBNAME): $(OBJS) $(ZOBJS) E 16 I 16 libm.a: $(OBJS) $(ZOBJS) E 16 I 15 $(NM) -xv $(LIBNAME) > $(LIBNAME).map D 16 get -p ../libc/s.mcount.def > mcount.def E 16 I 16 get -p $(LIBC_SRC)/s.mcount.def > mcount.def E 16 rm -f *.o D 16 $(MAKE) -$(MAKEFLAGS) 'MCOUNT=mcount.def' 'PROFLAG=-p' $(PLIBNAME) E 16 I 16 $(MAKE) -$(MAKEFLAGS) 'MCOUNT=mcount.def' 'PROFLAG=-p' \ 'LIBNAME=plibm.a' $(PLIBNAME) E 16 E 15 E 5 I 15 D 16 $(PLIBNAME): $(OBJS) $(ZOBJS) E 16 I 16 plibm.a: $(OBJS) $(ZOBJS) E 16 $(NM) -xv $(PLIBNAME) > $(PLIBNAME).map D 17 rm $(MCOUNT) E 17 I 17 rm -f $(MCOUNT) E 17 E 15 D 4 $(LIBNAME):: $(ASMOBJS) $(AR) rv $(LIBNAME) $? -rm -f $? E 4 I 4 D 5 $(OBJS): $(INC)/math.h $(INC)/values.h $(INC)/errno.h $(INC)/sys/errno.h E 5 I 5 D 7 # ZOBJS must have been compiled with the single precision option. (-z) E 7 I 7 D 12 # ZOBJS must have been compiled with the single precision option. (-Fs) E 12 I 12 D 13 # ZOBJS must have been compiled with the single precision option. (-z) E 13 I 13 # ZOBJS must have been compiled with the single precision option. (-Fs) E 13 E 12 E 7 I 6 E 6 D 7 $(ZOBJS): $(INC)/nan.h $(INC)/values.h $(CC) -c -z $(CFLAGS) $(ZSRCS) E 7 I 7 $(ZOBJS): $(INC)/nan.h $(INC)/values.h $(ZSRCS) D 12 $(CC) -c -Fs $(CFLAGS) $(ZSRCS) E 12 I 12 D 13 $(CC) -c -z $(CFLAGS) $(ZSRCS) E 13 I 13 $(CC) -c -Fs $(CFLAGS) $(ZSRCS) E 13 E 12 E 7 $(AR) rv $(LIBNAME) $(ZOBJS) E 5 E 4 D 4 $(LIBNAME)(version.o): libm.v $(OBJS): /usr/include/math.h /usr/include/values.h /usr/include/errno.h \ /usr/include/sys/errno.h $(ZOBJS): /usr/include/nan.h /usr/include/values.h # The following rules are duplicated in /usr/src/makerules .c.a:; .S.a: $(CPP) -P $*.S > $*.s $(AS) $(ASFLAGS) -o $*.o $*.s E 4 I 4 D 5 $(ZOBJS): $(INC)/nan.h $(INC)/values.h E 5 I 5 $(OBJS): $(INC)/math.h $(INC)/values.h $(INC)/errno.h $(INC)/sys/errno.h E 5 E 4 install: D 6 $(INS) $(LIBNAME) $(DEST) chmod 644 $(DEST)/$(LIBNAME) chown bin $(DEST)/$(LIBNAME) chgrp bin $(DEST)/$(LIBNAME) E 6 I 6 D 10 D 11 $(INS) $(LIBNAME) $(DESTDIR) E 11 I 11 -rm -f $(DESTDIR)/$(LIBNAME) $(INS) $(LIBNAME) $(DESTDIR)/$(LIBNAME) E 11 E 10 I 10 -rm -f $(DESTDIR)/$(LIBNAME) $(INS) $(LIBNAME) $(DESTDIR)/$(LIBNAME) E 10 chmod 644 $(DESTDIR)/$(LIBNAME) D 14 chown bin $(DESTDIR)/$(LIBNAME) E 14 chgrp bin $(DESTDIR)/$(LIBNAME) I 14 chown bin $(DESTDIR)/$(LIBNAME) E 14 E 6 I 15 -rm -f $(PDESTDIR)/$(LIBNAME) $(INS) $(PLIBNAME) $(PDESTDIR)/$(LIBNAME) chmod 644 $(PDESTDIR)/$(LIBNAME) chgrp bin $(PDESTDIR)/$(LIBNAME) chown bin $(PDESTDIR)/$(LIBNAME) E 15 listing: D 6 $(LPR) $(LPROPTS) $(SRCS) $(ASMSRCS) E 6 I 6 $(PR) $(SRC) | $(LP) E 6 clean: D 6 -rm -f *.o E 6 I 6 -rm -f *.o -rm -f core errs E 6 D 6 clobber: clean -rm -f $(LIBNAME) E 6 I 6 clobber: clean -rm -f $(LIBNAME) $(LIBNAME).map $(SRC) I 15 D 16 -rm -f $(PLIBNAME) $(PLIBNAME).map $(SRC) E 16 I 16 -rm -f $(PLIBNAME) $(PLIBNAME).map E 16 E 15 WHAT: what $(LIBNAME) E 6 I 6 # dependancies for included files and other non-obvious reasons are listed # below E 6 I 15 D 16 $(LIBM)(d_acos.o) : ../mcount.def $(LIBM)(d_asin.o) : ../mcount.def $(LIBM)(d_atan.o) : ../mcount.def $(LIBM)(d_atn2.o) : ../mcount.def $(LIBM)(d_cos.o) : ../mcount.def $(LIBM)(d_cosh.o) : ../mcount.def $(LIBM)(d_exp.o) : ../mcount.def $(LIBM)(d_lg10.o) : ../mcount.def $(LIBM)(d_log.o) : ../mcount.def $(LIBM)(d_sin.o) : ../mcount.def $(LIBM)(d_sinh.o) : ../mcount.def $(LIBM)(d_sqrt.o) : ../mcount.def $(LIBM)(d_tan.o) : ../mcount.def $(LIBM)(d_tanh.o) : ../mcount.def $(LIBM)(r_acos.o) : ../mcount.def $(LIBM)(r_asin.o) : ../mcount.def $(LIBM)(r_atan.o) : ../mcount.def $(LIBM)(r_atn2.o) : ../mcount.def $(LIBM)(r_cos.o) : ../mcount.def $(LIBM)(r_cosh.o) : ../mcount.def $(LIBM)(r_exp.o) : ../mcount.def $(LIBM)(r_lg10.o) : ../mcount.def $(LIBM)(r_log.o) : ../mcount.def $(LIBM)(r_sin.o) : ../mcount.def $(LIBM)(r_sinh.o) : ../mcount.def $(LIBM)(r_sqrt.o) : ../mcount.def $(LIBM)(r_tan.o) : ../mcount.def $(LIBM)(r_tanh.o) : ../mcount.def $(LIBM)(pow_rr.o) : ../mcount.def $(LIBM)(pow_dd.o) : ../mcount.def E 16 E 15 E 1 h13554 s 00001/00001/00030 d D 4.2 87/05/14 16:59:24 build 5 4 c removed old SCCS strings and inserted #ident BB e s 00000/00000/00031 d D 4.1 87/02/16 16:58:46 mth 4 3 c rolled rev to -r4 (mth) e s 00000/00000/00031 d D 3.1 87/01/31 12:11:32 mkm 3 2 c rolled rev to -r3 (mkm) e s 00000/00000/00031 d D 2.1 87/01/31 12:11:32 mkm 2 1 c AUTO NULL DELTA e s 00031/00000/00000 d D 1.1 87/01/31 12:06:22 mkm 1 0 c placed under source control (mkm) e u U f b f n t T I 1 D 5 /* "W% %G% */ E 5 I 5 #ident " %W% %E% " E 5 /*LINTLIBRARY*/ /* * Single precision versions of floor and ceil. * (compiled with -z single precision option to C compiler) */ /* * s_floor(x) returns the largest integer (as a single-precision number) * not greater than x. * s_ceil(x) returns the smallest integer not less than x. */ extern float s_modf(); float s_floor(x) float x; { float y; /* can't be in register because of s_modf() below */ return (s_modf(x, &y) < 0 ? y - 1 : y); } float s_ceil(x) float x; { float y; /* can't be in register because of s_modf() below */ return (s_modf(x, &y) > 0 ? y + 1 : y); } E 1 h45504 s 00001/00001/00036 d D 4.2 87/05/14 16:59:36 build 5 4 c removed old SCCS strings and inserted #ident BB e s 00000/00000/00037 d D 4.1 87/02/16 16:58:54 mth 4 3 c rolled rev to -r4 (mth) e s 00000/00000/00037 d D 3.1 87/01/31 12:11:48 mkm 3 2 c rolled rev to -r3 (mkm) e s 00000/00000/00037 d D 2.1 87/01/31 12:11:48 mkm 2 1 c AUTO NULL DELTA e s 00037/00000/00000 d D 1.1 87/01/31 12:06:40 mkm 1 0 c placed under source control (mkm) e u U f b f n t T I 1 D 5 /* "W% %G% */ E 5 I 5 #ident " %W% %E% " E 5 /*LINTLIBRARY*/ /* * Single precision versions of floor and ceil. * (compiled with -z single precision option to C compiler) */ /* * s_modf(value, iptr) returns the signed fractional part of value * and stores the integer part indirectly through iptr. * */ #include #include float s_modf(value, iptr) float value; /* don't declare register, because of KILLNaN! */ register float *iptr; { register float absvalue; register float tmp; KILLNaN((double)value); /* raise exception on Not-a-Number (3b only) */ if ((absvalue = (value >= 0.0) ? value : -value) >= FMAXPOWTWO) tmp = value; /* it must be an integer */ else { tmp = absvalue + FMAXPOWTWO; /* shift fraction off right */ tmp -= FMAXPOWTWO; /* shift back without fraction */ while (tmp > absvalue) /* above arithmetic might round */ tmp -= 1.0; /* test again just to be sure */ if (value < 0.0) tmp = -tmp; } *iptr = tmp; return (value - tmp); /* signed fractional part */ } E 1 h48875 s 00003/00000/00517 d D 4.3 87/04/16 13:55:32 mth 8 7 c Profiling changes e s 00084/00012/00433 d D 4.2 87/02/16 17:08:49 mth 7 6 c Parameters in registers. e s 00000/00000/00445 d D 4.1 87/02/16 16:57:04 mth 6 5 c rolled rev to -r4 (mth) e s 00003/00003/00442 d D 3.3 87/01/31 13:28:58 mkm 5 4 c correct compatability probs between ROS and SPIX as. -mkm e s 00000/00000/00445 d D 3.2 87/01/31 11:54:52 mkm 4 3 c from ROS sources as of this date. -mkm e s 00000/00000/00445 d D 3.1 87/01/21 17:46:00 mkm 3 2 c e s 00000/00000/00445 d D 2.1 87/01/21 17:43:23 mkm 2 1 c e s 00445/00000/00000 d D 1.1 87/01/21 17:41:44 mkm 1 0 c Placed under source control - mkm c These files are direct descendants of the ROS files c by the same name at or about ROS rev 5.1 e u U f b f n t T I 1 ; "%W% %G%" dsect data name byte 'acos',0 ;name of routine D 5 emess byte 'acos: DOMAIN error\n",0 ;error message E 5 I 5 emess byte 'acos: DOMAIN error\n',0 ;error message E 5 messlen equ 19 ;length of message D 5 nanmess byte 'acos: input value was NAN\n",0 ;error message if nan E 5 I 5 nanmess byte 'acos: input value was NAN\n',0 ;error message if nan E 5 nanlen equ 26 D 5 infmess byte 'acos: input value was INF\n",0 ;error message if "infinity" E 5 I 5 infmess byte 'acos: input value was INF\n',0 ;error message if "infinity" E 5 inflen equ 26 csect code align 2 externd _errno external _write external _matherr e_type equ -32 ;exception type e_name equ -28 ;name of routine in error e_arg1 equ -24 ;argument 1 e_arg2 equ -16 ;argument 2 (if present) e_retval equ -8 ;room for exception block e_size equ -80 ; plus stack frame with 3 parameters I 7 #ifdef ARGSINREGS pe_size equ 80 ; positive e_size #else pe_size equ 0 ; positive e_size #endif E 7 DOMAIN equ 1 SING equ 2 OVERFLOW equ 3 UNDERFLOW equ 4 TLOSS equ 5 PLOSS equ 6 EDOM equ 33 ERANGE equ 34 C1P1 equ 03f737670h C1P2 equ 074cb69a4h ;equals C2P1 equ 0bfe2f50dh C2P2 equ 02368d8a6h ;equals C3P1 equ 04014208ch C3P2 equ 0678d8742h ;equals C4P1 equ 0c02cb368h C4P2 equ 074a263cdh ;equals C5P1 equ 04030a5d2h C5P2 equ 0bd0c7221h ;equals C6P1 equ 0c01b1843h C6P2 equ 0b89359e1h ;equals C7P1 equ 0c02bd9b5h C7P2 equ 03f41f7dch ;equals C8P1 equ 0404fdc8eh C8P2 equ 06afe0d47h ;equals C9P1 equ 0c0600ca4h C9P2 equ 0a46999e4h ;equals C10P1 equ 0405d8b3ah C10P2 equ 0bc517143h ;equals C11P1 equ 0c0445232h C11P2 equ 0ca6e7fech ;equals PIU equ 0400921fbh PIL equ 054442d19h ;equals 3.1415926535897324 PI2U equ 03ff921fbh PI2L equ 054442d18h ;equals 1.57079632679489662 LIMITU equ 03fe6a090h LIMITL equ 02de00d1bh ;equals .7071 ONEU equ 03ff00000h ;equals high-order word of 1 ABS equ 07fffffffh ;to find absolute value MONEU equ 0bff00000h ;equals high-order word of -1 (double) ;NOTE: these constants are for d_sqrt CC1P1 equ 03fe2e29bh CC1P2 equ 0a0dad67bh ;equals .5901621 CC2P1 equ 03fdab52ah CC2P2 equ 0ef97d2f0h ;equals .4173076 HALF1 equ 03fe00000h HALF2 equ 000000000h ;equals .5 MASK1 equ 0800fffffh ;to clear off exponent MASK2 equ 0000007ffh ;to clear everything but integral exponent EBIAS equ 0000003ffh ;1023 EXP0 equ 03ff00000h ;gives biased exponent of 0 arg3 equ 40 arg2 equ 32 arg1 equ 24 arg_1 equ -8 arg_2 equ -16 arg_3 equ -20 ; ; _d_acos.s ; global _acos ;cc, rc and rp global _d_acos ;f77 global _D_acos ;rf D 7 _acos: loadd r0,r14,arg1 E 7 I 7 _acos: I 8 ; MCOUNT E 8 #ifndef ARGSINREGS loadd r0,r14,arg1 #endif E 7 br _D_acos _d_acos: I 8 ; MCOUNT E 8 I 7 #ifndef ARGSINREGS E 7 load r0,r14,arg1 I 7 #endif E 7 loadd r0,r0,0 _D_acos: I 8 ; MCOUNT E 8 laddr r2,r0 ;save sign of arg laddr r3,ONEU,L laddr r4,ABS,L and r0,r4 br r0>=r3,toobig ;if abs(arg)>1 then too big I 7 #ifdef ARGSINREGS store r7,STKPTR,arg_1 stored r8,STKPTR,arg_2 store r10,STKPTR,arg_3 ;save registers 7-10 #else E 7 stored r6,r14,arg_1 stored r8,r14,arg_2 store r10,r14,arg_3 ;save registers 6-10 I 7 #endif E 7 notoobig: laddr r3,LIMITU,L laddr r4,LIMITL,L drcomp r3,r0 br r3<1,greater ;if (x<.7071) then ... else go to greater lessthan: laddr r3,r0 laddr r4,r1 drmpy r3,r3 ;rp3="xsq=x*x" laddr r5,C1P1,L laddr r6,C1P2,L ;C1 drmpy r5,r3 ;"(C1)*xsq" laddr r7,C2P1,L laddr r8,C2P2,L ;C2 dradd r5,r7 ;"...+C2)" drmpy r5,r3 ;"...*xsq" laddr r7,C3P1,L laddr r8,C3P2,L ;C3 dradd r5,r7 ;"...+C3)" drmpy r5,r3 ;"...*xsq" laddr r7,C4P1,L laddr r8,C4P2,L ;C4 dradd r5,r7 ;"...+C4)" drmpy r5,r3 ;"...*xsq" laddr r7,C5P1,L laddr r8,C5P2,L ;C5 dradd r5,r7 ;"...+C5)" drmpy r5,r3 ;"...*xsq" laddr r7,C6P1,L laddr r8,C6P2,L ;C6 dradd r5,r7 ;"...+C6)" drmpy r5,r3 ;"...*xsq" drmpy r5,r0 ;"...*x" = numerator laddr r7,C7P1,L laddr r8,C7P2,L ;C7 dradd r7,r3 ;"(xsq+C7)" drmpy r7,r3 ;"...*xsq" laddr r9,C8P1,L laddr r10,C8P2,L ;C8 dradd r7,r9 ;"...+C8)" drmpy r7,r3 ;"...*xsq" laddr r9,C9P1,L laddr r10,C9P2,L ;C9 dradd r7,r9 ;"...+C9" drmpy r7,r3 ;"...*xsq" laddr r9,C10P1,L laddr r10,C10P2,L ;C10 dradd r7,r9 ;"...+C10" drmpy r7,r3 ;"...*xsq" laddr r9,C11P1,L laddr r10,C11P2,L ;C11 dradd r7,r9 ;"...+C11" = denominator drdiv r5,r7 ;".../..." dradd r0,r5 ;rp0="result=x+numerator/denominator" sign: laddr r3,080000000h,L and r2,r3 ;to clear r2 of everything but sign bit or r0,r2 ;rp0="result=%d_sign(result,arg)" laddr r2,PI2U,L laddr r3,PI2L,L drsub r2,r0 laddr r0,r2 laddr r1,r3 ;since arg<0.7071 and its not arcsin ;result = pi_2 - result" done: I 7 #ifdef ARGSINREGS loadd r7,STKPTR,arg_1 loadd r8,STKPTR,arg_2 load r10,STKPTR,arg_3 ;to restore registers 7-10 ret LINK,LINK #else E 7 loadd r6,r14,arg_1 loadd r8,r14,arg_2 load r10,r14,arg_3 ;to restore registers 6-10 ret r11,r11 I 7 #endif E 7 greater: laddr r3,ONEU,L laddr r4,0 drsub r3,r0 ;"(1-x)" laddr r5,ONEU,L laddr r6,0 dradd r0,r5 ;"(1+x)" drmpy r0,r3 ;rp0="temp=(1-x)*(1+x)" d_sqrt: laddr r4,r0 ;to save r0 or r0,r1 br r0=0,zero ;if arg=0 then return zero laddr r0,r4 dunp: laddr r3,r0 laddr r4,r1 laddr r5,MASK1,L and r3,r5 ;rp3="mant of arg with sign" laddr r5,EXP0,L or r3,r5 ;gives rp3="mant" an exponent of 0 to work with laddr r5,r0 csl r5,12 laddr r6,MASK2,L and r5,r6 ;r5="integer exponent of arg" laddr r6,EBIAS,L sub r5,r6 ;unbiases exponent laddr r6,1 and r6,r5 br r6=0,even ;if (odd(expon)) then begin odd: laddr r6,000100000h,L sub r3,r6 ;rp3="mant=mant*.5" add r5,1 ;r5="expon=expon+1" laddr r0,r3 laddr r1,r4 ;rp0=rp3="mant" laddr r6,CC1P1,L laddr r7,CC1P2,L drmpy r0,r6 ;rp0="approx=C1*mant" laddr r6,CC2P1,L laddr r7,CC2P2,L dradd r0,r6 ;rp0="approx=C1*mant+C2" br cont even: laddr r0,r3 laddr r1,r4 ;rp0=rp3="mant" laddr r6,CC2P1,L laddr r7,CC2P2,L drmpy r0,r6 ;rp0="approx=C2*mant" laddr r6,CC1P1,L laddr r7,CC1P2,L dradd r0,r6 ;rp0="approx=C2*mant+C1" cont: laddr r6,r3 laddr r7,r4 drdiv r6,r0 ;rp6="mant/approx" dradd r0,r6 ;rp0="approx="approx+(mant/approx)" laddr r6,000200000h,L laddr r7,r4 add r6,r3 ;rp6="4*mant" drdiv r6,r0 ;".../approx" dradd r0,r6 ;rp0="approx=approx+(4*mant/approx)" laddr r6,000400000h,L laddr r7,r4 add r6,r3 ;rp6="16*mant" drdiv r6,r0 ;".../approx) dradd r0,r6 ;rp0="approx=approx+(16*mant/approx)" dpck: ;no more need for mantissa laddr r6,2 div r5,r6 ;"expon div 2" sub r5,3 ;"r5=(expon div 2) - 3" laddr r3,r0 csl r3,12 laddr r4,MASK2,L and r3,r4 ;"pd_unpk(value,u)" without unbiasing exponent add r3,r5 ;r3="u.exp=u.exp+power2" laddr r5,20 csl r3,r5 ;place exponent in correct location for double laddr r5,MASK1,L and r0,r5 ;to clear approx's old exponent value or r0,r3 ;"pd_pack(result,u)" br calc ;finish calculations zero: laddr r0,0 laddr r1,0 ;if arg<0 then return 0 ;End of d_sqrt(temp) calc: laddr r3,r0 laddr r4,r1 drmpy r3,r3 ;rp3="xsq=x*x" laddr r5,C1P1,L laddr r6,C1P2,L ;C1 drmpy r5,r3 ;"(C1)*xsq" laddr r7,C2P1,L laddr r8,C2P2,L ;C2 dradd r5,r7 ;"...+C2)" drmpy r5,r3 ;"...*xsq" laddr r7,C3P1,L laddr r8,C3P2,L ;C3 dradd r5,r7 ;"...+C3)" drmpy r5,r3 ;"...*xsq" laddr r7,C4P1,L laddr r8,C4P2,L ;C4 dradd r5,r7 ;"...+C4)" drmpy r5,r3 ;"...*xsq" laddr r7,C5P1,L laddr r8,C5P2,L ;C5 dradd r5,r7 ;"...+C5)" drmpy r5,r3 ;"...*xsq" laddr r7,C6P1,L laddr r8,C6P2,L ;C6 dradd r5,r7 ;"...+C6)" drmpy r5,r3 ;"...*xsq" drmpy r5,r0 ;"...*x" = numerator laddr r7,C7P1,L laddr r8,C7P2,L ;C7 dradd r7,r3 ;"(xsq+C7)" drmpy r7,r3 ;"...*xsq" laddr r9,C8P1,L laddr r10,C8P2,L ;C8 dradd r7,r9 ;"...+C8)" drmpy r7,r3 ;"...*xsq" laddr r9,C9P1,L laddr r10,C9P2,L ;C9 dradd r7,r9 ;"...+C9" drmpy r7,r3 ;"...*xsq" laddr r9,C10P1,L laddr r10,C10P2,L ;C10 dradd r7,r9 ;"...+C10" drmpy r7,r3 ;"...*xsq" laddr r9,C11P1,L laddr r10,C11P2,L ;C11 dradd r7,r9 ;"...+C11" = denominator drdiv r5,r7 ;".../..." dradd r0,r5 ;rp0="result=x+numerator/denominator" sign2: laddr r3,080000000h,L and r2,r3 ;to clear r2 of everything but sign bit or r0,r2 ;rp0="result=%d_sign(result,arg)" br r2=0,done! ;if -10,err_rtn ;yes (assume user will change r0 if yes ) mess: ;prints out our error message I 7 #ifdef ARGSINREGS E 7 move r0,2 I 7 laddr r1,emess,L laddr r2,messlen call LINK,_write,L ;writes out message #else move r0,2 E 7 store r0,r14,arg1 laddr r5,emess,L store r5,r14,arg2 ;gives message laddr r0,messlen store r0,r14,arg3 ;gives length of message call r11,_write,L ;writes out message I 7 #endif E 7 laddr r0,EDOM ;sets global variable _errno for user store r0,_errno,L D 7 E 7 I 7 #ifdef ARGSINREGS load r4,STKPTR,arg_1 ;restore r4's old value (if inf or not) #else E 7 load r4,r14,arg_1 ;restore r4's old value (if inf or not) I 7 #endif E 7 br r4=0,inf ;if abs(arg)="infinity" then go to inf br r4<0,nan ;if abs(arg) is not-a-number then go to nan err_rtn: ;resets all old pointers and returns zero I 7 #ifdef ARGSINREGS laddr STKPTR,STKPTR,pe_size load LINK,STKPTR,0 #else E 7 move r14,r15 ;user will have already used matherr for himself load r15,r14,8 load r11,r14,0 I 7 #endif E 7 laddr r0,0 laddr r1,0 ;to return 0 I 7 #ifdef ARGSINREGS ret LINK,LINK #else E 7 ret r11,r11 I 7 #endif E 7 inf: I 7 #ifdef ARGSINREGS E 7 move r0,2 ;to print I 7 laddr r1,infmess,L laddr r2,inflen call LINK,_write,L #else move r0,2 ;to print E 7 store r0,r14,arg1 laddr r5,infmess,L store r5,r14,arg2 ;gives write the message laddr r0,inflen store r0,r14,arg3 ;gives write the length of message call r11,_write,L I 7 #endif E 7 br err_rtn nan: I 7 #ifdef ARGSINREGS E 7 move r0,2 ;to print I 7 laddr r1,nanmess,L laddr r2,nanlen call LINK,_write,L #else move r0,2 ;to print E 7 store r0,r14,arg1 laddr r5,nanmess,L store r5,r14,arg2 ;gives write the message laddr r0,nanlen store r0,r14,arg3 ;gives write the length of message call r11,_write,L I 7 #endif E 7 br err_rtn D 7 E 7 E 1 # "@(#)Makefile 4.10 4/16/87" # # libm makefile # # ASFLAGS2 = -DARGSINREGS -DLINK=r15 -DSTKPTR=r14 DFLAGS = $(PROFLAG) PROFLAG = MCOUNT = # DESTDIR is the directory where prog's final form gets installed DESTDIR = $(SMX)/lib PDESTDIR = $(SMX)/lib/libp LIBNAME = libm.a PLIBNAME = plibm.a LIBC_SRC = ../libc .s~.a: $(GET) $(GFLAGS) -p $< > tmp.s $(M4) $(MCOUNT) tmp.s > $*.s $(AS) -I$(INC) $(ASFLAGS) $*.s $(AR) r $@ $*.o rm -f $*.[so] tmp.[os] .s.a: $(M4) $(MCOUNT) $*.s > tmp.s $(AS) -I$(INC) $(ASFLAGS) tmp.s mv tmp.o $*.o $(AR) r $@ $*.o rm -f $*.o tmp.[os] ASMSRCS= d_acos.s d_asin.s d_atan.s d_atn2.s d_cos.s d_cosh.s \ d_exp.s d_lg10.s d_log.s d_sin.s d_sinh.s d_sqrt.s d_tan.s d_tanh.s \ r_acos.s r_asin.s r_atan.s r_atn2.s r_cos.s r_cosh.s \ r_exp.s r_lg10.s r_log.s r_sin.s r_sinh.s r_sqrt.s r_tan.s r_tanh.s \ pow_rr.s pow_dd.s CSRCS= erf.c fabs.c floor.c fmod.c gamma.c hypot.c jn.c\ j0.c j1.c matherr.c # ZSRCS must be compiled with -Fs (single precision) option. ZSRCS= r_floor.c r_modf.c SRC= $(ASMSRCS) $(CSRCS) $(ZSRCS) ZOBJS = r_floor.o r_modf.o OBJS =\ $(LIBNAME)(erf.o) \ $(LIBNAME)(fabs.o) \ $(LIBNAME)(floor.o) \ $(LIBNAME)(fmod.o) \ $(LIBNAME)(gamma.o) \ $(LIBNAME)(hypot.o) \ $(LIBNAME)(jn.o) \ $(LIBNAME)(j0.o) \ $(LIBNAME)(j1.o) \ $(LIBNAME)(version.o) \ $(LIBNAME)(matherr.o) \ $(LIBNAME)(d_acos.o) \ $(LIBNAME)(d_asin.o) \ $(LIBNAME)(d_atan.o) \ $(LIBNAME)(d_atn2.o) \ $(LIBNAME)(d_cos.o) \ $(LIBNAME)(d_cosh.o) \ $(LIBNAME)(d_exp.o) \ $(LIBNAME)(d_lg10.o) \ $(LIBNAME)(d_log.o) \ $(LIBNAME)(d_sin.o) \ $(LIBNAME)(d_sinh.o) \ $(LIBNAME)(d_sqrt.o) \ $(LIBNAME)(d_tan.o) \ $(LIBNAME)(d_tanh.o) \ $(LIBNAME)(pow_dd.o) \ $(LIBNAME)(r_acos.o) \ $(LIBNAME)(r_asin.o) \ $(LIBNAME)(r_atan.o) \ $(LIBNAME)(r_atn2.o) \ $(LIBNAME)(r_cos.o) \ $(LIBNAME)(r_cosh.o) \ $(LIBNAME)(r_exp.o) \ $(LIBNAME)(r_lg10.o) \ $(LIBNAME)(r_log.o) \ $(LIBNAME)(r_sin.o) \ $(LIBNAME)(r_sinh.o) \ $(LIBNAME)(r_sqrt.o) \ $(LIBNAME)(r_tan.o) \ $(LIBNAME)(r_tanh.o) \ $(LIBNAME)(pow_rr.o) ZOBJS = r_floor.o r_modf.o all: $(LIBNAME) libm.a: $(OBJS) $(ZOBJS) $(NM) -xv $(LIBNAME) > $(LIBNAME).map get -p $(LIBC_SRC)/s.mcount.def > mcount.def rm -f *.o $(MAKE) -$(MAKEFLAGS) 'MCOUNT=mcount.def' 'PROFLAG=-p' \ 'LIBNAME=plibm.a' $(PLIBNAME) plibm.a: $(OBJS) $(ZOBJS) $(NM) -xv $(PLIBNAME) > $(PLIBNAME).map rm -f $(MCOUNT) # ZOBJS must have been compiled with the single precision option. (-Fs) $(ZOBJS): $(INC)/nan.h $(INC)/values.h $(ZSRCS) $(CC) -c -Fs $(CFLAGS) $(ZSRCS) $(AR) rv $(LIBNAME) $(ZOBJS) $(OBJS): $(INC)/math.h $(INC)/values.h $(INC)/errno.h $(INC)/sys/errno.h install: -rm -f $(DESTDIR)/$(LIBNAME) $(INS) $(LIBNAME) $(DESTDIR)/$(LIBNAME) chmod 644 $(DESTDIR)/$(LIBNAME) chgrp bin $(DESTDIR)/$(LIBNAME) chown bin $(DESTDIR)/$(LIBNAME) -rm -f $(PDESTDIR)/$(LIBNAME) $(INS) $(PLIBNAME) $(PDESTDIR)/$(LIBNAME) chmod 644 $(PDESTDIR)/$(LIBNAME) chgrp bin $(PDESTDIR)/$(LIBNAME) chown bin $(PDESTDIR)/$(LIBNAME) listing: $(PR) $(SRC) | $(LP) clean: -rm -f *.o -rm -f core errs clobber: clean -rm -f $(LIBNAME) $(LIBNAME).map $(SRC) -rm -f $(PLIBNAME) $(PLIBNAME).map WHAT: what $(LIBNAME) # dependancies for included files and other non-obvious reasons are listed # below #ident " @(#)r_floor.c 4.2 87/05/14 " /*LINTLIBRARY*/ /* * Single precision versions of floor and ceil. * (compiled with -z single precision option to C compiler) */ /* * s_floor(x) returns the largest integer (as a single-precision number) * not greater than x. * s_ceil(x) returns the smallest integer not less than x. */ extern float s_modf(); float s_floor(x) float x; { float y; /* can't be in register because of s_modf() below */ return (s_modf(x, &y) < 0 ? y - 1 : y); } float s_ceil(x) float x; { float y; /* can't be in register because of s_modf() below */ return (s_modf(x, &y) > 0 ? y + 1 : y); } #ident " @(#)r_modf.c 4.2 87/05/14 " /*LINTLIBRARY*/ /* * Single precision versions of floor and ceil. * (compiled with -z single precision option to C compiler) */ /* * s_modf(value, iptr) returns the signed fractional part of value * and stores the integer part indirectly through iptr. * */ #include #include float s_modf(value, iptr) float value; /* don't declare register, because of KILLNaN! */ register float *iptr; { register float absvalue; register float tmp; KILLNaN((double)value); /* raise exception on Not-a-Number (3b only) */ if ((absvalue = (value >= 0.0) ? value : -value) >= FMAXPOWTWO) tmp = value; /* it must be an integer */ else { tmp = absvalue + FMAXPOWTWO; /* shift fraction off right */ tmp -= FMAXPOWTWO; /* shift back without fraction */ while (tmp > absvalue) /* above arithmetic might round */ tmp -= 1.0; /* test again just to be sure */ if (value < 0.0) tmp = -tmp; } *iptr = tmp; return (value - tmp); /* signed fractional part */ } ! / 548423773 0 0 0 1246 ` o"" N N ""l"l,`,`6t777>r>r>rDDDIIIOOOVBVBVB[[[___e@e@e@jvjvjvpppuuuy y y    @@@ppp444RRR^^^ &_erf_erfc_fabs_floor_ceil_fmod_gamma_signgam_hypot_jn_yn_j0_y0_j1_y1_matherr_acos_d_acos_D_acos_asin_d_asin_D_asin_atan_d_atan_D_atan_atan2_d_atn2_D_atn2_cos_d_cos_D_cos_cosh_d_cosh_D_cosh_exp_d_exp_D_exp_log10_d_lg10_D_lg10_log_d_log_D_log_sin_d_sin_D_sin_sinh_d_sinh_D_sinh_sqrt_d_sqrt_D_sqrt_tan_d_tan_D_tan_tanh_d_tanh_D_tanh_pow_Pow_dd_pow_dd_s_acos_r_acos_R_acos_s_asin_r_asin_R_asin_s_atan_r_atan_R_atan_s_atan2_r_atn2_R_atn2_s_cos_r_cos_R_cos_s_cosh_r_cosh_R_cosh_s_exp_r_exp_R_exp_s_log10_r_lg10_R_lg10_r_alg10_R_alg10_s_log_r_log_R_log_s_sin_r_sin_R_sin_s_sinh_r_sinh_R_sinh_s_sqrt_r_sqrt_R_sqrt_s_tan_r_tan_R_tan_s_tanh_r_tanh_R_tanh_s_pow_pow_rr_Pow_rr_s_floor_s_ceil_s_modferf.o/ 548423573 98 100 100664 1116 ` u G .textl .dataT@.bssh<1@ HЩ~P: 21 ?:&1 ?41 h5p0[l5Y^Xpِ3[l5W^`pp3u ސ? ޠPBm5 65  2 ~PɞHɾ@<hhWP?81@ ~H?:"1 ?4p@::Tp*5pِP35pp3{25 \5 6~Hɞ@ɾ8PPW @(#)erf.c 4.2 87/05/13 @U=@I @/@C_@,@E<{ȊLW?~]@U=@J@뙤(!@X@CpuR?@V6@=5@ 4@ \C9@wPXO @SE97ȇ&@#Z}]? Ӊ[vD@V6@^H@Ɋ@g@MG@\k@AU*@a$@1&YEp?|.text.data.bss_erfl_erfcl_explfabs.o/ 548423576 98 100 100664 344 ` u G.text .data @.bss@@ 0: 2W @(#)fabs.c 4.2 87/05/13 .text .data  .bss@_fabsjfloor.o/ 548423579 98 100 100664 528 ` u G\ .textD .data $@.bssH!.@ 0:@ ?04 @HHWH!.@ 0:@ ?03 @HHW @(#)floor.c 4.2 87/05/13 f.text.data .bss_floorj_modfj_ceilTjfmod.o/ 548423582 98 100 100664 504 ` u GX.textL .data ,@.bssX@~Hr: 2  P: 2''8^P4%6: (*6.PP5):4 ~Hɞ@XXW @(#)fmod.c 4.2 87/05/13 x.text.data .bss_fmodj_modfjgamma.o/ 548423589 98 100 100664 2071 ` u G.text4% .dataD@.bssx@~HpX\~`p :.XDp2q.P!0@:>XXp  Z!pAv l:XxP(5!0@P:P2PPP56.XX3 22X  X"p~Hɞ@xxWx?8@~Hp @ 0:' WG0e+:' ? 45 4 ?g0d3 Av0l:' ذxؐ ?06'r85"53ذ53ذ53ذ535):ؐ3)5'3 & ?0:356 L@:6'?4p.?4p5'ސ@:@4pذ8ؐ@53ذH53ذP53ذX53ذ`53ذh53ذpP535W^pذ3P53^PP53^XP 53^`P(535{^hذ03{5r(6j~Hɞ@ɾ8xxW @(#)gamma.c 4.2 87/05/13 @ !TD-gammagamma: SING error \I I%{uI|bZ >e'.6v$?7@gE0tTVm-{@j'Y`fHJW6v$Z!G?KhsCO{?Jrdfl?UUUUUE$Dt    "0 f t  "(DNXh (.>FTbp .text%.data.bss_gammamP_signgammP_modfmP_matherrmP_writemP_errnomP_sinmP_logmP_pos_gamma hypot.o/ 548423593 98 100 100664 820 ` u G .text\ .data(4@.bss?p8@~Hp4~X: 2p `: 2 : (y: 6 !qް>Ff;:{p  ް?5p?3p[`5^x[`3!^pWh6Q^3Q^5 !100栞@f;:909J51n9Jp?575B1p΀:703>PT Ph"h~Hɞ@ɾ8W @(#)hypot.c 4.2 87/05/13 hypot\v.text.data(.bss_hypotk_matherrk_errnokjn.o/ 548423600 98 100 100664 1694 ` u Gd.textt .dataH,@.bssx?HP~Xr: 2' '8CI!TD-:! .('8J8:$ 2qb9:XLh>&^h96p54[l^h 5Pp`ϩ  ^`^`90p456`^`  947H61>`dSް?ϩ^h$^h9!6'p5+4%[l^hh^`56 ~XɞPɾHxxWpDHP~Xp:\`d9h?p `x  !xCI!TD-: .((9pvP^ppfq8T19654ʩ1s 2  ~XɞPɾHDW`@#@0ԋ 0Ч>D94>HP X@,D"."X``W @(#)jn.c 4.2 87/05/13 ynyn: DOMAIN error ynjn: TLOSS error j $. 8 v  2>^ p x  .text.dataH.bss_jnn_j0n_j1n_ynn_matherrn_writen_errnon_y0n_y1n_jn_errorj0.o/ 548423608 98 100 100664 2487 ` u G|.textP, .dataPPP@.bss`?H1P ~Xr: 21 @ :('8h>Ff;:?H5"y(5pp3{5pِ36 ~XɞPɾH``W?hHP~X: V`hd?h `xڎ l !x@ :  ( 1̋  5>Ff;:  ?04f 5 0r0[l5W^pp3u[l5R^p X3%6r ^53~XɞPɾHW?`@H~PrCI!TD-: rXȆ \~` Xpb,\"P.@"pbAŃ: P?`p^ 5 @P06  0r2Yj5W^pp03uYj5R^p h3%6 0r0Yj5W^xpp3uYj5R^p 3%6r@  65q6>^5Y5y?!TD-^4Ȇ* 5 ^54 & ^5 53 ~PɞHɾ@W @(#)j0.c 4.2 87/05/13 y0y0: DOMAIN error y0j0: TLOSS error ?_0mȃD:X}`C$hJ5~^UvCb'"ci&6-BYyPYݿ$@:w|D:XC m"CZ9żYB٤hZBR-g1AW,4A1 4@LA.|?ATE^AgA` .A>ÇHuA9@j:EATE^AgJA`z!aA>j3GA Q;@of\6?!<KrF_،|{7cRlHkh}=A!<KrA$X A FVh`A X@άr*F@yW2}?RD co4T"C~e\mnBt! yE˔A45AD{3K[pD43! C:WeCU@?}B\BNkH AES'A.HW@ ϣ;? (4> H  z   8N   ..textP.dataPP.bss_j0o0_y0o0_matherro0_writeo0_errnoo0_logo0_sqrto0_sino0_coso0_j0_asympt j1.o/ 548423617 98 100 100664 2519 ` u G.text`L .data```@.bssp?H1P ~Xp: 21 @ :(+<܋v>Ff;:  ?05P5"p0Rc5Y^`pِ3cR5W^hpp3u 5 6~XɞPɾHppW?hHP~Xp:V`xd?~h `xʎ | !x@ :( 15 00[l5Y^pِ 3[l5R^p p3%56ް?6^ 54 53 ~XɞPɾHW?`@H~PrCI!TD-: ~`nXȆ \ Xpn,\"\.L"pAŃ: P?`p?^ 5 @P06  0r2Yj5W^pp@3uYj5R^p x3%6 0r0Yj5W^xpp3uYj5R^p 3%6r@  65q6J^5Y5y@|3!ҩ^4Ȏ* ^5 53 D 5 ^54 ` 0: 2  ~PɞHɾ@W @(#)j1.c 4.2 87/05/13 y1y1: DOMAIN error y1j1: TLOSS error ?_0mȃD?#h= 홙CǼ_ aBڭzYs@]An:@ɧQa @>JDO#h=C9u"Ck 8YBnxqB^J0A7*--A6aQ@f>?PtFZb)Y0O67?IYb`.wqPtFZbzXY޳w7/2 u?@8:O@ɒ M@(-b @6@pw@A.A%ѣA;B ЀA5īk&CAnHLF@GZ@@{?ĵ\HD~$/waPnC0ZÅcb(bC 3 i C‚ٓA@# D|PG'gDrjaXhCd+pJCx k"B{Bb Aљ=J$A7ڒAR@1q~k?8DN X  r~   ,Bx   .text`.data``.bss_j1o0_y1o0_matherro0_writeo0_errnoo0_logo0_sqrto0_sino0_coso0_j1_asympt matherr.o/ 548423620 98 100 100664 328 ` u G.text .data @.bss00W @(#)matherr.c 4.2 87/05/13 .text.data .bss0_matherrjPd_acos.o/ 548423624 98 100 100664 1598 ` u G@ .text .dataP@.bssHH 0?@ 0~0?栐@- :010A53P?svp`ti5Sp ހ#hئ3W5Sp@ ހgB3W5Sp,hހtc3W5Sp@0ހ r!3W5SpCހY3W5S5Pp+ٵހ?A3s5sސ@O܎ޠj G3y5sސ` ޠi3y5sސ@]:ޠQqC3y5sސDR2ޠn3y6W30 #  ?!0TD-4 ~ɎǮW0?@40P?`35@ 0AP 5P? 5Px\` V`V` e`6`6Q`?p{5`?ڵ*p3(`?ڵ*p5`?p{3ct6`3` tc6`3`@tc6`3`VS0x<@ 45Ph5P   0A53P?svp`ti5Sp ހ#hئ3W5Sp@ ހgB3W5Sp,hހtc3W5Sp@0ހ r!3W5SpCހY3W5S5Pp+ٵހ?A3s5sސ@O܎ޠj G3y5sސ` ޠi3y5sސ@]:ޠQqC3y5sސDR2ޠn3y6W30 #  0@ !@TD-3W@ !TD-W@:000:00@P:@N8 .41>0H0|, f!N@@,PW, , acosacos: DOMAIN error acos: input value was NAN acos: input value was INF f         .text .dataP.bssH_errnos_writes_matherrs_acoss_d_acoss_D_acossUNDERFLOWd_asin.o/ 548423629 98 100 100664 1526 ` u G .text .dataP<@.bss 0?@ 0~0?栐@- :010A53P?svp`ti5Sp ހ#hئ3W5Sp@ ހgB3W5Sp,hހtc3W5Sp@0ހ r!3W5SpCހY3W5S5Pp+ٵހ?A3s5sސ@O܎ޠj G3y5sސ` ޠi3y5sސ@]:ޠQqC3y5sސDR2ޠn3y6W30 # ~ɞW0?@40P?`35@ 0AP 5P? 5Px\` V`Va e`2`6Q`?p{5`?ڵ*p3$`?ڵ*p5`?p{3ct6`3` tc6`3`@tc6`3bVS0x<@ 45Ph5P  0A53P?svp`ti5Sp ހ#hئ3W5Sp@ ހgB3W5Sp,hހtc3W5Sp@0ހ r!3W5SpCހY3W5S5Pp+ٵހ?A3s5sސ@O܎ޠj G3y5sސ` ޠi3y5sސ@]:ޠQqC3y5sސDR2ޠn3y6W30 #  0?!@TD-3 20?!@TD-40!TD-W?!TD-W@:00 @P:@N8 .41>0H0, !N@@(PWPr \asinasin: DOMAIN error asin: input value was NAN asin: input value was INF ( D P Z d     .text .dataP.bss_errnosh_writesh_matherrsh_asinsh_d_asinsh_D_asinshUNDERFLOWd_atan.o/ 548423633 98 100 100664 1272 ` u G .text .dataP4@.bss~ C?s@   @ ? 15"@?P '5B`@"7pwۅ3F5B`@6;p&nӈ3F5B`@/ip*3F5B5@`@/Np43b5bހ@PVސv O3h5bހ@XIސ5 j3h5bހ@Gސ{b3h6F4 06 ޠ?!ްTD-2 ?03 @?P46ޠ?!ްTD- 15"@?P '5B`@"7pwۅ3F5B`@6;p&nӈ3F5B`@/ip*3F5B5@`@/Np43b5bހ@PVސv O3h5bހ@XIސ5 j3h5bހ@Gސ{b3h6F43 ɮ Ɏ~W0: R@P:@@@?!TD- 8 .41>0?!TD-H0̎2 ! P?!TD-8 hatanatan: DOMAIN error atan: input value was NAN atan: input value was INF  6 B L V ^ h   .text .dataP.bss_errnoq@_writeq@_matherrq@_atanq@_d_atanq@_D_atanq@UNDERFLOWgreater.5d_atn2.o/ 548423637 98 100 100664 1480 ` u G .textpT .datappX@.bss !~@Qbs E@ g` Nbs@Qސ:Ď I i4:Ď=!TD-Ɏ~W?!TD-Ɏ~W xހ 6 C?s@   @ ? 15"@?P '5B`@"7pwۅ3F5B`@6;p&nӈ3F5B`@/ip*3F5B5@`@/Np43b5bހ@PVސv O3h5bހ@XIސ5 j3h5bހ@Gސ{b3h6F4ĩ 06 ޠ?!ްTD-2 ?03 @?P46ޠ?!ްTD- 15"@?P '5B`@"7pwۅ3F5B`@6;p&nӈ3F5B`@/ip*3F5B5@`@/Np43b5bހ@PVސv O3h5bހ@XIސ5 j3h5bހ@Gސ{b3h6F43 ɮ0: f@P:@@@?!TD- 8 p.41>0?!TD-H0B2v ,! P?!TD-" ދ  ͆Ɏ~W @ !0TD- -3atan2atan2: DOMAIN error atan2: input value was NAN atan2: input value was INF         $ .textp .datapX.bss_errnorx_writerx_matherrrx_atan2rx_d_atn2rx_D_atn2 rxUNDERFLOWgreater.5d_cos.o/ 548423642 98 100 100664 1578 ` u G, .textx .dataxx@.bss 1@ $@AP:B@~詮@?!P.H:B@7@'$@Q4B?_0@5`xlp gpgpg194ޠ 0940Πΰpx|ހ xހxg΀ٍx x5533πϑ3p?x@194.ЩN HYB0D9DB40x.Nπϑ343ހh؋N.ٍx5Hٍxmx35(3B3J3ހ?!ސTD-5 15"@ LA`:4pC 5bހ@ސq3h5bހ ސ炗3h5b5`ހ@eqސa m35ޠ@/cް`p35ޠA"شްm36h3  ,"6~ɎɮWd@?!4P"`\Tdp5bހ@ܢސTb3h5bހ}ސa3h5bހ@`+Kސ-35ޠ@pްq335ޠA}ް36h?3P@P:BN8 .45>0H0, "N@@,PW  ?_0@>v@<);_@9SL8@coscos: TLOSS error cos: input value was NAN cos: input value was INF   r |        * P Z f p .textx.datax.bss_errnos_writes_matherrs_coss_d_coss_D_cossUNDERFLOWd_cosh.o/ 548423646 98 100 100664 1174 ` u G .textxD .dataxx@@.bss @00   ? w5 >" ;075 @>~P#o+3$5 @>PY~3$5 @?VlPh3$5 @?UUPUUG3$5 @?P3$5 ?32~7@'D 14$`?Gp@5F1d9v4Gp?Gހ@5'p>ހ 533 15"@? P\ 5Bp@43ހww3G5Bp@tހs3G5@@m%P3B5$@@P߰3$4 6 &T ?03 @?P6Bv rq$0 h#0 #'0h#0 C B3 ?03 0 h#0 #&0h#0  ~WT@P:@N8 x.43>0H0"N@@.PW } coshcosh: input value was NAN cosh: input value was INF     H R ^ j .textx.datax@.bss_errnor0_writer0_matherrr0_coshr0_d_coshr0_D_coshr0UNDERFLOWd_exp.o/ 548423650 98 100 100664 1194 ` u G .text@ .data@@8@.bssxx 0 08 80@(@:00~7@'D 14$`?Gp@5F1d9v4Gp?Gހ@5'p>ހ 533@$55"? \ 5p@43ހww35p@tހs35@@m%P3B5$@@P߰3$4 6 ?03a 0H0"O@@(PW^ D n0@00@P:@N8 @.43>0H0 "N@@,PW^ D ̋expexp: input value was NAN exp: input value was INF ( D R t ~         , 6 .text@.data@8.bssx_errnop8_writep8_matherrp8_expp8_d_expp8_D_expp8UNDERFLOWd_lg10.o/ 548423655 98 100 100664 1290 ` u G .textpd .datapph@.bss4  ~ x,0 #0#0 0? 0?@ω?:000?@30P?`460A53PD`9}5Sp@baހ)T3W5Sp ހe3W5S5Pp!Ւހe&3s5sސ@3ޠ_e3y5sސ( 1ޠT@3y6W3@@P59"@?.BP95$3 @k0U6~ɞW0@@30P@`46!< ! l8 p.41>0H0  v!PW8 p.42>0H0$v !:02 PW PWlog10log10: SING error log10: DOMAIN error log10: input value was NAN log10: input value was INF T v          ( P Z .textp.dataph.bss_errnoq(_writeq(_matherrq(_log10q(_d_lg10q(_D_lg10q(UNDERFLOWd_log.o/ 548423659 98 100 100664 1274 ` u G .texthT .datahh`@.bss&  ~ x,0 #0#0 0? 0?@ω?:000?@30P?`460A53PD`9}5Sp@baހ)T3W5Sp ހe3W5S5Pp!Ւހe&3s5sސ@3ޠ_e3y5sސ( 1ޠT@3y6W3@@P59"@?.BP95$3~ɞW0@@30P@`46!J ! l8 h.41>0H0 } !PW8 h.42>0H02l !:02 PW PWloglog: SING error log: DOMAIN error log: input value was NAN log: input value was INF F h t ~         B L .texth.datah`.bss_errnop_writep_matherrp_logp_d_logp_D_logpUNDERFLOWd_sin.o/ 548423664 98 100 100664 1578 ` u G, .textx .dataxx@.bss 1@ $@AP:B@~詮@?!P.H:B@7@'$@Q4B?_0@5`xlp gpgpg194ޠ 0940Πΰpx|ހ xހxg΀ٍx x5533πϑ3p?x@194.ЩN HYB0D9DB40x.Nπϑ343ހh؋N.ٍx5Hٍxmx35(3B3J3ހ?!ސTD-5 15"@ LA`:4pC 5bހ@ސq3h5bހ ސ炗3h5b5`ހ@eqސa m35ޠ@/cް`p35ޠA"شްm36h3  ,"6~ɎɮWf@?!4R"`\Tdp5bހ@ܢސTb3h5bހ}ސa3h5bހ@`+Kސ-35ޠ@pްq335ޠA}ް36h?3P@P:BN8 .45>0H0, "N@@,PW  ?_0@>v@<);_@9SL8@sinsin: TLOSS error sin: input value was NAN sin: input value was INF   p z      & L V b l .textx.datax.bss_errnos_writes_matherrs_sins_d_sins_D_sinsUNDERFLOWd_sinh.o/ 548423668 98 100 100664 1190 ` u G .textT .data@@.bss 0@0P 0̧~0?0y@Q5D =G<0K5$`>Zpئ3&5$`>pm3&5$`?*p3&5$`?p#+3&5$`?UUpUUUK3&5$5 3<7P'U0A45p?Gހ@5W1u94Xހ?Gސ@58ހ>ސ 5330A53P? `\ 5Sހ@43ސww3X5Sހ@tސs3X5P@m%`3S55P@`߰3540607T0?@30P?`6Sχ05@ h4@ 48@h4@ T S40?@30@ h4@ 47@h4@  0 # ɎnW@@P:@N8 .43>0H0؎"N@@.PW  sinhsinh: input value was NAN sinh: input value was INF  * 8 ` j v  .text.data@.bss_errnor_writer_matherrr_sinhr_d_sinhr_D_sinhrUNDERFLOWd_sqrt.o/ 548423672 98 100 100664 786 ` u G .text .data @.bss88~ x,0 #ς   p/p%`q7?%>թW#&#@')63@6`3`d?栞f;5`Uspp~ɎW ! W1>0P^48H0$  !HPWsqrtsqrt: DOMAIN error      .text.data .bss8_errnom_writem_matherrm_sqrtm_d_sqrtm_D_sqrtm"sqrt_nameUNDERFLOWdsqrt_errd_tan.o/ 548423677 98 100 100664 1474 ` u G .text .data@.bss 1@ $@AP:B@<~詮@?!P.H:$ 7@'$@Q4B?_0@5`xlp gpgpg194ޠ 0940Πΰpx|ހ xހxg΀ٍ 5533πϑ3xx|n` v`vnЅp@194.ЩNHY B0D9DB40x.Nπϑ343ހh؋8.ٍ5Hٍm35(3B3J3ހ?!ސTD-5 15"`pVm5bހ@X"ސ 3h5bހސ=3h5b5`ހ[ސh35ޠ@Mްs*}J35ޠgްCOm36h3  ,!"~ɎɮWp 06 @P:BN8 @.45>0H0b,D L"N@@,PWp V ?_0@>v@<);_@9SL8@tantan: TLOSS error tan: input value was NAN tan: input value was INF               .text.data.bss_errnorH_writerH_matherrrH_tanrH_d_tanrH_D_tanrHUNDERFLOWd_tanh.o/ 548423681 98 100 100664 1174 ` u H .textP, .dataPPP@.bss 0 0@3@:00r~0?@:00x0A53P`DC$5SpXހ3W5SpEހѱ3W5S5Pp@\<ހԧ3s5sސ@~:ޠ#3y5sސ@%ޠEA3y6W3Ǯ37P'U0A45p?Gހ@5W1u94Xހ?Gސ@58ހ>ސ 5330A53P? `\ 5Sހ@43ސww3X5Sހ@tސs3X5P@m%`3S55P@`߰35Pa3Sxސ p Wph X403Sp@5765?40 # ~ɎW@P:@@?0 # WN8 P.41>0?H0:U !O@(i P?W tanhtanh: DOMAIN error tanh: input value was NAN tanh: input value was INF         : D .textP .dataPP.bss_errnoqX_writeqX_matherrqX_tanhqX_d_tanhqX_D_tanhqXUNDERFLOWpow_dd.o/ 548423688 98 100 100664 2532 ` u H .text0T .data00@.bss !~Ä+40"9BK,\(1 # Ѐ     x,0 #0#0 0? 0?@ω?:000?@30P?`460A53PD`9}5Sp@baހ)T3W5Sp ހe3W5S5Pp!Ւހe&3s5sސ@3ޠ_e3y5sސ( 1ޠT@3y6W3@@P59"@?.BP95$30@@30P@`46!T ~ɎɮW8 0.41>0H0` E J!P~ɎɮW8 0.42>0H04 !F0@r P~ɎɮWX dP~ɎɮW5  0 0@0@:007@'D 14$`?Gp@5F1d9v4Gp?Gހ@5'p>ހ 533@$55"? \ 5p@43ހww35p@tހs35@@m%P3B5$@@P߰3$4 6 ?03a %P R% Rt ! ! PˀRj"u!  @P,,@uP !P%2 % P [ePh%     ~ɎɮW0 # @P:@N8 .44>0H0"N@&@8P~ɎɮW  @P:@N8 .43>0H0B"N@*@<P~ɎɮW  ދpowpow: SING error pow: DOMAIN error pow: input value was NAN pow: input value was INF powpow: input value was NAN pow: input value was INF        " , 6 T ^     * \ f r |       $ .text0.data0.bss_errnow(_writew(_matherrw(_poww(_Pow_ddw(_pow_ddw(PUNDERFLOWZeroOrBadDontNegatedomain_errorzero_or_guinf_or_nannormalizer_acos.o/ 548423693 98 100 100664 1146 ` u H p .text( .data((P@.bssxx  ?t ?5! ?$!0?#%!1Ih4@ 4@4@ $@? $A CA>թW%@?#@$1?%@>թW#B&A#@$&!#B42!x)@ $2 h2   !%"0<.6%2@ǐI#4%2@>#4%2%1@j#B%BP@<۷#E&4# W@I$W?W 3ֿ!!%"0<.6%2@ǐI#4%2@>#4%2%1@j#B%BP@<۷#E&4# ?$W?#W@*AN8 (.41>0H0D,- .!N@@&PW\ A acosacos: DOMAIN error acos: input value was NAN acos: input value was INF          .text( .data(P.bssx_errnop_writep_matherrp_s_acosp_r_acosp_R_acospUNDERFLOWcontgreaterr_asin.o/ 548423697 98 100 100664 1106 ` u HH .text .dataP@.bssPP  ?N ?5! ?$!0?#%!1Ih4@ 4@4@ $@? $A CA>թW%@?#@$1?%@>թW#B&A#@$&!#B42!x)@ $2 h2   !%"0<.6%2@ǐI#4%2@>#4%2%1@j#B%BP@<۷#E&4# ?$!HW 3ֿ!!%"0<.6%2@ǐI#4%2@>#4%2%1@j#B%BP@<۷#E&4#  W@*@N8 .41>0H0j, T!N@@&PW4    asinasin: DOMAIN error asin: input value was NAN asin: input value was INF ~         .text .dataP.bssP_errnoph_writeph_matherrph_s_asinph_r_asinph_R_asinphUNDERFLOWcontgreaterr_atan.o/ 548423702 98 100 100664 902 ` u H .text@ .data@@P@.bss  7'Ŭ*! d SQ.!p ?!`&!Q!%"0+$%2@,ݼ#4%2@Sz#4%2%1@@#B%B @h#B&4#Q  W ?$!P ?ۋ̧8 @.41>0?ۧH0,2E !Y P?Wt Ћatanatan: DOMAIN error atan: input value was NAN atan: input value was INF        ( 2 .text@ .data@P.bss_errnoo0_writeo0_matherro0_s_atano0_r_atano0_R_atano0UNDERFLOWr_atn2.o/ 548423708 98 100 100664 1074 ` u H( .text .dataXd@.bss00  . 1@P  $Q 4B$#$)P W?Wqi  ! 0 #x!A C $.&  SQ.! ?!|&!Q!%"0+$%2@,ݼ#4%2@Sz#4%2%1@@#B%B @h#B&4#Q,   ! 0h  @I !#W ?$!P ?ۋ8 ا.41>0H0J !hp \PW 6Watan2atan2: DOMAIN error atan2: input value was NAN atan2: input value was INF B \ h r |     .text .dataX.bss0_errnopP_writepP_matherrpP_s_atan2pP_r_atn2pP_R_atn2 pPUNDERFLOWfinishatan2r_cos.o/ 548423713 98 100 100664 1324 ` u H!$ .textx| .dataxxx'()*@.bss  I[!\~.?I'?/ $!?"%0x9@ 4@4I4!@)D$!DP`pxyހ xހx7O΀Ftvׇx%vx%r#x#Wp#uހ?!wG)w$p#p$#P8dx%!dxd6x#1%###?%~Q%A  $ L}%!0<##%!0*##%!% #" $" PW"W?W@9QB@PA?$O!b'"@@ !PTD-6$09A4$7"1  ?#!@I%!n %!0=*##%!0##%!?#A^@*BN8 .45>0H0, "N@@&PW  ?"94[.(#pQ coscos: TLOSS error cos: input value was NAN cos: input value was INF         $ . N X d n .textx.dataxx.bss_errnoq_writeq_matherrq_s_cosq_r_cosq_R_cosqUNDERFLOWpi_reducer_cosh.o/ 548423717 98 100 100664 994 ` u H% .text .data@D@.bss  F@ ?@!2!%"0:j%2@=*#4%2@?#4%#?# !1$2@?%$!B)D$$ DP?%5P9%##!%"0=lVe%2P@#5%0A##$!& $0 3>0H0"N@@*PW n Xcoshcosh: input value was NAN cosh: input value was INF , X f     .text.data@.bss_errnop8_writep8_matherrp8_s_coshp8_r_coshp8_R_coshp8UNDERFLOWcontgreaterr_exp.o/ 548423722 98 100 100664 1178 ` u H* .text0 .data008@.bsshh@  B 3!ҍ"  q#P P p0;(.u 27"a00H0"N@@(PWN 4 l@*AN8 0.43>0H0,"N@@*PWN 4 ڋexpexp: input value was NAN exp: input value was INF * F T v          ( .text0.data08.bssh_errnop_writep_matherrp_s_expp_r_expp_R_exppUNDERFLOWr_lg10.o/ 548423727 98 100 100664 1154 ` u H/\.text .datahL@.bss((?Fx     ?  ?  ?# 0?$& %"0?M$2@?^&C%$% @?1r)%@##@]&WWd8 .41>0H0&  !PW8 .42>0H0Ǝ !. PW VPWlog10log10: SING error log10: DOMAIN error log10: input value was NAN log10: input value was INF       < H R \ t ~   .text.datah.bss(_errnoo_writeo_matherro_s_log10o_r_lg10o_R_lg10o_r_alg10o_R_alg10oUNDERFLOWr_log.o/ 548423732 98 100 100664 1090 ` u H4D .text .data`<@.bss? W6x     ?  ?  ?# 0?$& %"0?M$2@?^&C%$% @?1r)%@##Wd8 .41>0H04  !PW8 .42>0H0Ԏ !. PW dPWloglog: SING error log: DOMAIN error log: input value was NAN log: input value was INF       . : D N f p   .text.data`.bss_errnoox_writeox_matherrox_s_logox_r_logox_R_logoxUNDERFLOWr_sin.o/ 548423737 98 100 100664 1264 ` u H9 .text| .dataP,@.bss?"94[.(#pQ   GPX~.?I?' $!?"%0x9@ 4@4I4!@)D$!DP`pxyހ xހx7O΀FtvD%v<%r#x#Wp#uހ?!wG)w$p#p$#P8d%!dd6#1%###?%~^%! $ L}%!0<##%!0*##%!% #" $" P WP"W@9QB@PA?$O!b@@ !PTD-'"6$09A4$7"1  ?#!0@I%#r %!0=*##%!0##%!?#Ab@*BN8 .45>0H0Ў, "N@@&PW  psinsin: TLOSS error sin: input value was NAN sin: input value was INF  2 > H R r |   .text .dataP.bss_errnoq_writeq_matherrq_s_sin(q_r_sin,q_R_sin0qUNDERFLOWpi_reducer_sinh.o/ 548423741 98 100 100664 994 ` u H= .text .data@D@.bss  ?@!.!%"09SL[%2@<#4%2@>*#4%#%!# F@ !1$2@?%$!B)D$$ DP?%5P9%##!%"0=lVe%2P@#5%0A##$!& $0 3>0H0"N@@*PW l Vsinhsinh: input value was NAN sinh: input value was INF . Z h     .text.data@.bss_errnop _writep _matherrp _s_sinhp _r_sinhp _R_sinhp UNDERFLOWcontgreaterr_sqrt.o/ 548423748 98 100 100664 1744 ` u HD .text .data l@.bssv@ ?qp &!#  &!#  aBD$U BqApJpM ?% ?5%WW1>0P^48H0V  @!PW?5?5_W?5?6?6m?6T?7 ?7z>?7o?8,?8^?8?96?9?92?:?F?:)?:?;Fx?;?;?Sv?>q?>L??U???@?@UC?@e?@T?AT"?A?AY?BQ?B?B?CN?C?C?DI?D?D?EB?E?E?F;i?F ?F~?G2?G?G ?H(?Hz?Hh?I?IoT?I?J?Jb?J?Kh?KU?K?K?LFA?LW?Lm?M6P?M?Mղ?N%B?Nt?N?O'?ObA?O)?P?PN?PI?P?Q:.?Qn?Q֌?R$?Rru?R@?S ?S[?S?S^?TC?T?Tݵ?U*?Uwu?U"?V?V]:?V?V?WB?W?W?X%?Xq?XE?Y?YTC?Y?Y?Z5?Z?Z?[?[a?[.?[?\A%?\v?\շ?]?]i?]?]?^Gx?^!?^ک?_$ ?_m?_?`?`I?`?`?a#?al?a1?a?bF(?b?b?c?cg?c!?c?d>?d?d>?e?e]>?e?e?f3'?fzS?f]?gF?gO/?g?gܭ?h#S?hi?hK?h?il?~~?~4?~~????sqrtsqrt: DOMAIN error      .text.data .bss_errnom_writem_matherrm_s_sqrtm_r_sqrtm_R_sqrtmsqrt_nameUNDERFLOWr_tan.o/ 548423753 98 100 100664 1136 ` u HIh .text  .data  P@.bsspp?"94[.(#pQ   O!D~.?I $!?"%0x9@ 4@4I4!@)D$!DP`pxyހ xހx7O΀FtvN%vF%r#x#Wp#uހ?!wG)w$p#p$#P8d%!dd6#1%###?%~^% @ :1$2 >&#%!0>$2% %!# A@&PW"WW@9QB@@*BN8  .45>0H0L,$ 6"N@@(PWP 6 tantan: TLOSS error tan: input value was NAN tan: input value was INF          .text .data P.bssp_errnop_writep_matherrp_s_tan(p_r_tan,p_R_tan0pUNDERFLOWpi_reducer_tanh.o/ 548423758 98 100 100664 966 ` u HN .text\ .dataP @.bss  ).*! > ! ?@!,!%"0v=t%2@Rl#4%2%0@@5/#B&4#W A-| @8;%!1)3$!%"@=lVe%BP@#E%@A#$ 3A#B$!TxY QS0 4@hT 5#2!&#?$  W?*!.8 .41>0?H0: !. & P?W tanhtanh: DOMAIN error tanh: input value was NAN tanh: input value was INF   " , 6 F P h r .text .dataP.bss_errnoo_writeo_matherro_s_tanho_r_tanho_R_tanhoUNDERFLOWpow_rr.o/ 548423764 98 100 100664 1953 ` u HT .text .datad@.bssxx  ?Wض܄ !)"0   8!2  x)0#0 0? 0?0!0?#0@?$&0%3@?M$CP?^&T%5%0P?1r)"%%P## 8 .41>0H0  !PW8 .43>0H0 !.& nPW @PWWW%Bff*®*  F@  $!0?%!1)3$ 3@?%$@9%##% =lVe%!@@#$% A#$&?#1 x h   ؍ !   W|W0 @*AN8 .44>0H0"N@@&PW&܋ Ƌ@*AN8 .43>0H0"N@@*PWP&JP 4powpow: OVERFLOW error pow: DOMAIN error pow: input value was NAN pow: input value was INF powpow: input value was NAN pow: input value was INF  $      2 P \ f p           & 2 < ^ |      .text .data.bssx_errnosh_writesh_matherrsh_s_powsh_pow_rrsh_Pow_rrsh-SavePowerUNDERFLOWpnanorinfDontNegate r_floor.o/ 548423770 98 100 100664 512 ` u HZL .text4 .data @.bss@<*<?$<@@W@<*<?#<@@W @(#)r_floor.c 4.2 87/05/14 \.text.data .bss_s_floorj_s_modfj_s_ceilLjr_modf.o/ 548423772 98 100 100664 440 ` u H\,.text .data  @.bss0~q* " K* <@?K#K$$**"$~W @(#)r_modf.c 4.2 87/05/14 .text.data .bss_s_modfju I7 .text\ .data0,@.bss@`P<*<?$<@@W@`ȓP<*<?#<@@W @(#)r_floor.c 4.2 87/05/14 $Z`t.text.data0.bss_s_floork(mcountk(_s_modfk(_s_ceilXk(u I8\.textD .data(@.bss`P0~q* " K* <@?K#K$$**"$~W @(#)r_modf.c 4.2 87/05/14 .text.data(.bss_s_modfk(mcountk( Symbols from libm.a[erf.o]: Name Value Class Type Size Line Section _exp |0x00000000|extern| | | | _erf |0x00000008|extern| | | |.text _erfc |0x00000100|extern| | | |.text Symbols from libm.a[fabs.o]: Name Value Class Type Size Line Section _fabs |0x00000008|extern| | | |.text Symbols from libm.a[floor.o]: Name Value Class Type Size Line Section _modf |0x00000000|extern| | | | _floor |0x00000008|extern| | | |.text _ceil |0x00000054|extern| | | |.text Symbols from libm.a[fmod.o]: Name Value Class Type Size Line Section _modf |0x00000000|extern| | | | _fmod |0x00000008|extern| | | |.text Symbols from libm.a[gamma.o]: Name Value Class Type Size Line Section _errno |0x00000000|extern| | | | _log |0x00000000|extern| | | | _matherr |0x00000000|extern| | | | _modf |0x00000000|extern| | | | _sin |0x00000000|extern| | | | _write |0x00000000|extern| | | | _signgam |0x00000004|extern| | | | _gamma |0x00000008|extern| | | |.text Symbols from libm.a[hypot.o]: Name Value Class Type Size Line Section _errno |0x00000000|extern| | | | _matherr |0x00000000|extern| | | | _hypot |0x00000008|extern| | | |.text Symbols from libm.a[jn.o]: Name Value Class Type Size Line Section _errno |0x00000000|extern| | | | _j0 |0x00000000|extern| | | | _j1 |0x00000000|extern| | | | _matherr |0x00000000|extern| | | | _write |0x00000000|extern| | | | _y0 |0x00000000|extern| | | | _y1 |0x00000000|extern| | | | _jn |0x00000008|extern| | | |.text _yn |0x000001c4|extern| | | |.text Symbols from libm.a[j0.o]: Name Value Class Type Size Line Section _cos |0x00000000|extern| | | | _errno |0x00000000|extern| | | | _log |0x00000000|extern| | | | _matherr |0x00000000|extern| | | | _sin |0x00000000|extern| | | | _sqrt |0x00000000|extern| | | | _write |0x00000000|extern| | | | _j0 |0x00000008|extern| | | |.text _y0 |0x000000e0|extern| | | |.text Symbols from libm.a[j1.o]: Name Value Class Type Size Line Section _cos |0x00000000|extern| | | | _errno |0x00000000|extern| | | | _log |0x00000000|extern| | | | _matherr |0x00000000|extern| | | | _sin |0x00000000|extern| | | | _sqrt |0x00000000|extern| | | | _write |0x00000000|extern| | | | _j1 |0x00000008|extern| | | |.text _y1 |0x000000f0|extern| | | |.text Symbols from libm.a[matherr.o]: Name Value Class Type Size Line Section _matherr |0x00000008|extern| | | |.text Symbols from libm.a[d_acos.o]: Name Value Class Type Size Line Section _acos |0x00000000|extern| | | |.text _errno |0x00000000|extern| | | | _matherr |0x00000000|extern| | | | _write |0x00000000|extern| | | | _d_acos |0x00000004|extern| | | |.text _D_acos |0x00000008|extern| | | |.text Symbols from libm.a[d_asin.o]: Name Value Class Type Size Line Section _asin |0x00000000|extern| | | |.text _errno |0x00000000|extern| | | | _matherr |0x00000000|extern| | | | _write |0x00000000|extern| | | | _d_asin |0x00000004|extern| | | |.text _D_asin |0x00000008|extern| | | |.text Symbols from libm.a[d_atan.o]: Name Value Class Type Size Line Section _atan |0x00000000|extern| | | |.text _errno |0x00000000|extern| | | | _matherr |0x00000000|extern| | | | _write |0x00000000|extern| | | | _d_atan |0x00000004|extern| | | |.text _D_atan |0x00000008|extern| | | |.text Symbols from libm.a[d_atn2.o]: Name Value Class Type Size Line Section _atan2 |0x00000000|extern| | | |.text _errno |0x00000000|extern| | | | _matherr |0x00000000|extern| | | | _write |0x00000000|extern| | | | _d_atn2 |0x00000004|extern| | | |.text _D_atn2 |0x0000000c|extern| | | |.text Symbols from libm.a[d_cos.o]: Name Value Class Type Size Line Section _cos |0x00000000|extern| | | |.text _errno |0x00000000|extern| | | | _matherr |0x00000000|extern| | | | _write |0x00000000|extern| | | | _d_cos |0x00000004|extern| | | |.text _D_cos |0x00000008|extern| | | |.text Symbols from libm.a[d_cosh.o]: Name Value Class Type Size Line Section _cosh |0x00000000|extern| | | |.text _errno |0x00000000|extern| | | | _matherr |0x00000000|extern| | | | _write |0x00000000|extern| | | | _d_cosh |0x00000004|extern| | | |.text _D_cosh |0x00000008|extern| | | |.text Symbols from libm.a[d_exp.o]: Name Value Class Type Size Line Section _errno |0x00000000|extern| | | | _exp |0x00000000|extern| | | |.text _matherr |0x00000000|extern| | | | _write |0x00000000|extern| | | | _d_exp |0x00000004|extern| | | |.text _D_exp |0x00000008|extern| | | |.text Symbols from libm.a[d_lg10.o]: Name Value Class Type Size Line Section _errno |0x00000000|extern| | | | _log10 |0x00000000|extern| | | |.text _matherr |0x00000000|extern| | | | _write |0x00000000|extern| | | | _d_lg10 |0x00000004|extern| | | |.text _D_lg10 |0x00000008|extern| | | |.text Symbols from libm.a[d_log.o]: Name Value Class Type Size Line Section _errno |0x00000000|extern| | | | _log |0x00000000|extern| | | |.text _matherr |0x00000000|extern| | | | _write |0x00000000|extern| | | | _d_log |0x00000004|extern| | | |.text _D_log |0x00000008|extern| | | |.text Symbols from libm.a[d_sin.o]: Name Value Class Type Size Line Section _errno |0x00000000|extern| | | | _matherr |0x00000000|extern| | | | _sin |0x00000000|extern| | | |.text _write |0x00000000|extern| | | | _d_sin |0x00000004|extern| | | |.text _D_sin |0x00000008|extern| | | |.text Symbols from libm.a[d_sinh.o]: Name Value Class Type Size Line Section _errno |0x00000000|extern| | | | _matherr |0x00000000|extern| | | | _sinh |0x00000000|extern| | | |.text _write |0x00000000|extern| | | | _d_sinh |0x00000004|extern| | | |.text _D_sinh |0x00000008|extern| | | |.text Symbols from libm.a[d_sqrt.o]: Name Value Class Type Size Line Section _errno |0x00000000|extern| | | | _matherr |0x00000000|extern| | | | _sqrt |0x00000000|extern| | | |.text _write |0x00000000|extern| | | | _d_sqrt |0x00000004|extern| | | |.text _D_sqrt |0x00000008|extern| | | |.text Symbols from libm.a[d_tan.o]: Name Value Class Type Size Line Section _errno |0x00000000|extern| | | | _matherr |0x00000000|extern| | | | _tan |0x00000000|extern| | | |.text _write |0x00000000|extern| | | | _d_tan |0x00000004|extern| | | |.text _D_tan |0x00000008|extern| | | |.text Symbols from libm.a[d_tanh.o]: Name Value Class Type Size Line Section _errno |0x00000000|extern| | | | _matherr |0x00000000|extern| | | | _tanh |0x00000000|extern| | | |.text _write |0x00000000|extern| | | | _d_tanh |0x00000004|extern| | | |.text _D_tanh |0x00000008|extern| | | |.text Symbols from libm.a[pow_dd.o]: Name Value Class Type Size Line Section _Pow_dd |0x00000000|extern| | | |.text _errno |0x00000000|extern| | | | _matherr |0x00000000|extern| | | | _pow |0x00000000|extern| | | |.text _write |0x00000000|extern| | | | _pow_dd |0x00000004|extern| | | |.text Symbols from libm.a[r_acos.o]: Name Value Class Type Size Line Section _errno |0x00000000|extern| | | | _matherr |0x00000000|extern| | | | _s_acos |0x00000000|extern| | | |.text _write |0x00000000|extern| | | | _r_acos |0x00000004|extern| | | |.text _R_acos |0x00000008|extern| | | |.text Symbols from libm.a[r_asin.o]: Name Value Class Type Size Line Section _errno |0x00000000|extern| | | | _matherr |0x00000000|extern| | | | _s_asin |0x00000000|extern| | | |.text _write |0x00000000|extern| | | | _r_asin |0x00000004|extern| | | |.text _R_asin |0x00000008|extern| | | |.text Symbols from libm.a[r_atan.o]: Name Value Class Type Size Line Section _errno |0x00000000|extern| | | | _matherr |0x00000000|extern| | | | _s_atan |0x00000000|extern| | | |.text _write |0x00000000|extern| | | | _r_atan |0x00000004|extern| | | |.text _R_atan |0x00000008|extern| | | |.text Symbols from libm.a[r_atn2.o]: Name Value Class Type Size Line Section _errno |0x00000000|extern| | | | _matherr |0x00000000|extern| | | | _s_atan2 |0x00000000|extern| | | |.text _write |0x00000000|extern| | | | _r_atn2 |0x00000004|extern| | | |.text _R_atn2 |0x0000000c|extern| | | |.text Symbols from libm.a[r_cos.o]: Name Value Class Type Size Line Section _errno |0x00000000|extern| | | | _matherr |0x00000000|extern| | | | _s_cos |0x00000000|extern| | | |.text _write |0x00000000|extern| | | | _r_cos |0x00000004|extern| | | |.text _R_cos |0x00000008|extern| | | |.text Symbols from libm.a[r_cosh.o]: Name Value Class Type Size Line Section _errno |0x00000000|extern| | | | _matherr |0x00000000|extern| | | | _s_cosh |0x00000000|extern| | | |.text _write |0x00000000|extern| | | | _r_cosh |0x00000004|extern| | | |.text _R_cosh |0x00000008|extern| | | |.text Symbols from libm.a[r_exp.o]: Name Value Class Type Size Line Section _errno |0x00000000|extern| | | | _matherr |0x00000000|extern| | | | _s_exp |0x00000000|extern| | | |.text _write |0x00000000|extern| | | | _r_exp |0x00000004|extern| | | |.text _R_exp |0x00000008|extern| | | |.text Symbols from libm.a[r_lg10.o]: Name Value Class Type Size Line Section _errno |0x00000000|extern| | | | _matherr |0x00000000|extern| | | | _s_log10 |0x00000000|extern| | | |.text _write |0x00000000|extern| | | | _r_alg10 |0x00000004|extern| | | |.text _r_lg10 |0x00000004|extern| | | |.text _R_alg10 |0x00000008|extern| | | |.text _R_lg10 |0x00000008|extern| | | |.text Symbols from libm.a[r_log.o]: Name Value Class Type Size Line Section _errno |0x00000000|extern| | | | _matherr |0x00000000|extern| | | | _s_log |0x00000000|extern| | | |.text _write |0x00000000|extern| | | | _r_log |0x00000004|extern| | | |.text _R_log |0x00000008|extern| | | |.text Symbols from libm.a[r_sin.o]: Name Value Class Type Size Line Section _errno |0x00000000|extern| | | | _matherr |0x00000000|extern| | | | _write |0x00000000|extern| | | | _s_sin |0x00000028|extern| | | |.text _r_sin |0x0000002c|extern| | | |.text _R_sin |0x00000030|extern| | | |.text Symbols from libm.a[r_sinh.o]: Name Value Class Type Size Line Section _errno |0x00000000|extern| | | | _matherr |0x00000000|extern| | | | _s_sinh |0x00000000|extern| | | |.text _write |0x00000000|extern| | | | _r_sinh |0x00000004|extern| | | |.text _R_sinh |0x00000008|extern| | | |.text Symbols from libm.a[r_sqrt.o]: Name Value Class Type Size Line Section _errno |0x00000000|extern| | | | _matherr |0x00000000|extern| | | | _s_sqrt |0x00000000|extern| | | |.text _write |0x00000000|extern| | | | _r_sqrt |0x00000004|extern| | | |.text _R_sqrt |0x00000008|extern| | | |.text Symbols from libm.a[r_tan.o]: Name Value Class Type Size Line Section _errno |0x00000000|extern| | | | _matherr |0x00000000|extern| | | | _write |0x00000000|extern| | | | _s_tan |0x00000028|extern| | | |.text _r_tan |0x0000002c|extern| | | |.text _R_tan |0x00000030|extern| | | |.text Symbols from libm.a[r_tanh.o]: Name Value Class Type Size Line Section _errno |0x00000000|extern| | | | _matherr |0x00000000|extern| | | | _s_tanh |0x00000000|extern| | | |.text _write |0x00000000|extern| | | | _r_tanh |0x00000004|extern| | | |.text _R_tanh |0x00000008|extern| | | |.text Symbols from libm.a[pow_rr.o]: Name Value Class Type Size Line Section _Pow_rr |0x00000000|extern| | | |.text _errno |0x00000000|extern| | | | _matherr |0x00000000|extern| | | | _s_pow |0x00000000|extern| | | |.text _write |0x00000000|extern| | | | _pow_rr |0x00000004|extern| | | |.text Symbols from libm.a[r_floor.o]: Name Value Class Type Size Line Section _s_modf |0x00000000|extern| | | | _s_floor |0x00000008|extern| | | |.text _s_ceil |0x0000004c|extern| | | |.text Symbols from libm.a[r_modf.o]: Name Value Class Type Size Line Section _s_modf |0x00000008|extern| | | |.text ! / 548423994 0 0 0 1246 ` o"" & &&%%//:8;;;CCCIIIOOOV4V4V4]6]6]6bbbhhhnnnssszzzBBB$$$$$$,,,BBB(((ӚӚӚ:::bb _erf_erfc_fabs_floor_ceil_fmod_gamma_signgam_hypot_jn_yn_j0_y0_j1_y1_matherr_acos_d_acos_D_acos_asin_d_asin_D_asin_atan_d_atan_D_atan_atan2_d_atn2_D_atn2_cos_d_cos_D_cos_cosh_d_cosh_D_cosh_exp_d_exp_D_exp_log10_d_lg10_D_lg10_log_d_log_D_log_sin_d_sin_D_sin_sinh_d_sinh_D_sinh_sqrt_d_sqrt_D_sqrt_tan_d_tan_D_tan_tanh_d_tanh_D_tanh_pow_Pow_dd_pow_dd_s_acos_r_acos_R_acos_s_asin_r_asin_R_asin_s_atan_r_atan_R_atan_s_atan2_r_atn2_R_atn2_s_cos_r_cos_R_cos_s_cosh_r_cosh_R_cosh_s_exp_r_exp_R_exp_s_log10_r_lg10_R_lg10_r_alg10_R_alg10_s_log_r_log_R_log_s_sin_r_sin_R_sin_s_sinh_r_sinh_R_sinh_s_sqrt_r_sqrt_R_sqrt_s_tan_r_tan_R_tan_s_tanh_r_tanh_R_tanh_s_pow_pow_rr_Pow_rr_s_floor_s_ceil_s_modferf.o/ 548423793 98 100 100664 1224 ` u Hq .text .data(l@.bssh`P<1@ HЩ~P: 21 ?:&1 ?41 h5p0[l5Y^Xpِ3[l5W^`pp@3u ސ? ޠPBm5 65  2 ~PɞHɾ@<hhWP?`P81@ ~H?:"1 ?4p@::Tp*5pِx35pp3{25 D5 6~Hɞ@ɾ8PPW @(#)erf.c 4.2 87/05/13 @U=@I @/@C_@,@E<{ȊLW?~]@U=@J@뙤(!@X@CpuR?@V6@=5@ 4@ \C9@wPXO @SE97ȇ&@#Z}]? Ӊ[vD@V6@^H@Ɋ@g@MG@\k@AU*@a$@1&YEp?  .text .data(.bss_erfl`mcountl`_erfc l`_expl`fabs.o/ 548423795 98 100 100664 404 ` u Hs.text( .data(((@.bssPP`HP 0: 2W @(#)fabs.c 4.2 87/05/13 .text(.data((.bssP_fabsjmcountjfloor.o/ 548423798 98 100 100664 636 ` u Hv .textl .data0<@.bssH`ГP!.@ 0:@ ?04 @HHWH`ؓP!.@ 0:@ ?03 @HHW @(#)floor.c 4.2 87/05/13 &bh~.text.data0.bss_floork(mcountk(_modfk(_ceil`k(fmod.o/ 548423801 98 100 100664 572 ` u Hy .textd .data(<@.bssX`ГP@~Hr: 2  P: 2''8^P4%6: (*6.P~P5):4 ~Hɞ@XXW @(#)fmod.c 4.2 87/05/13 .text.data(.bss_fmodk(mcountk(_modfk(gamma.o/ 548423808 98 100 100664 2179 ` u HH.text\) .data\@.bssx`P@~HpX\~`p :.XDp2q.P!0@:>XXd  N!pAv l:XxP(5!0@P:P2PPP56.XX3 22X  X"p~Hɞ@xxWx?` PV8@~Hp @ 0:' WG0e+:' ? 45 4 ?g0d3 Av0l:' ذؐ ?06'r85"53ذ53ذ53ذ535):ؐ3)5'3 & ?0:356 L@:6'?4p.?4p5'ސ@:@4pذ`ؐh53ذp53ذx53ذ53ذ53ذ53ذP(535W^pذ03P853^PP@53^XPH53^`PP535{^hذX3{5r(6R~Hɞ@ɾ8xxW @(#)gamma.c 4.2 87/05/13 @ !TD-gammagamma: SING error \I I%{uI|bZ >e'.6v$?7@gE0tTVm-{@j'Y`fHJW6v$Z!G?KhsCO{?Jrdfl?UUUUUE 0P     $.<r   :@\fp",6@FV^lz.text).data.bss_gammammcountm_signgamm_modfm_matherrm_writem_errnom_sinm_logm_pos_gamma hypot.o/ 548423813 98 100 100664 880 ` u H .textl .data0<@.bss?`ГPp8@~Hp4~X: 2p `: 2 : (y: 6 !qް>Ff;:{p  ް?5p?3p[`5^x[`3!^pWh6Q^3Q^5 !100栞@f;:909J51n9Jp?575B1p΀:703>PT Ph"h~Hɞ@ɾ8W @(#)hypot.c 4.2 87/05/13 hypot h .text.data0.bss_hypotkmcountk_matherrk_errnokjn.o/ 548423819 98 100 100664 1842 ` u H.text .data`L@.bss  x?`ؓPHP~Xr: 2' '8CI!TD-:! .('8ʋJ8:$ 2qV9:X@h2&^h96p54[l^h 5Pp`ϩ  ^`^`90p456`^`  947H61>`dSް?ϩ^h$^h9!6'p5+4%[l^h\^`56 ~XɞPɾHxxW`P*pDHP~Xp:\`d9h?p `xҎ  !xCI!TD-: .((9ptvP^ppNq8<19654ʩ1s 2  ~XɞPɾHDW``PΧ@#@0 0>D94>HP X@,D"n.^"X``W @(#)jn.c 4.2 87/05/13 ynyn: DOMAIN error ynjn: TLOSS error v   0 <F P .4Vb    .text.data`.bss _jnnmcountn_j0n_j1n_ynn_matherrn_writen_errnon_y0n_y1n_jn_errorj0.o/ 548423827 98 100 100664 2635 ` u H.textpd" .datapph@.bss`?`PH1P ~Xr: 21 @ :('8h>Ff;:?H5"y(5pp3{5pِ 36 ~XɞPɾH``W?`PhHP~X: V`d?h `xŽ  !x@ :  ( 1̋ h 5>Ff;:  ?04f 5 0r0[l5W^ppH3u[l5R^p 3%6r ^53~XɞPɾHW?`P`@H~PrCI!TD-: rXȆ \~` Xp>,\",."pbAŃ: P?`p^ 5 @P06  0r2Yj5W^pph3uYj5R^p 3%6 0r0Yj5W^xpp3uYj5R^p 3%6r@  65q6^5Y5y?!TD-^4Ȇ* 5 ^54 & ^5 53 ~PɞHɾ@W @(#)j0.c 4.2 87/05/13 y0y0: DOMAIN error y0j0: TLOSS error ?_0mȃD:X}`C$hJ5~^UvCb'"ci&6-BYyPYݿ$@:w|D:XC m"CZ9żYB٤hZBR-g1AW,4A1 4@LA.|?ATE^AgA` .A>ÇHuA9@j:EATE^AgJA`z!aA>j3GA Q;@of\6?!<KrF_،|{7cRlHkh}=A!<KrA$X A FVh`A X@άr*F@yW2}?RD co4T"C~e\mnBt! yE˔A45AD{3K[pD43! C:WeCU@?}B\BNkH AES'A.HW@ ϣ;? "@ LV `  V\    \r (>R.textp".dataph.bss_j0omcounto_y0o_matherro_writeo_errnoo_logo_sqrto_sino_coso_j0_asympt j1.o/ 548423836 98 100 100664 2675 ` u H $.text" .datax@.bssp?`PH1P ~Xp: 21 @ :(+<v>Ff;:  ?05P5"p0Rc5Y^`pِ3cR5W^hpp83u 5 6~XɞPɾHppW?`PhHP~Xp:V`d?~h `x  !x@ :( 15 00[l5Y^pِ`3[l5R^p 3%56ް?6^ 54 53 ~XɞPɾHW?`ȓP`@H~PrCI!TD-: ~`nXȆԋ Ч\ XpJ,\"8.("pAŃ: P?`p?^ 5 @P06  0r2Yj5W^pp3uYj5R^p 3%6 0r0Yj5W^xpp3uYj5R^p (3%6r@  65q6&^5Y5y@|3!ҩ^4Ȏ* ^5 53 D 5 ^54 ` 0: 2  ~PɞHɾ@W @(#)j1.c 4.2 87/05/13 y1y1: DOMAIN error y1j1: TLOSS error ?_0mȃD?#h= 홙CǼ_ aBڭzYs@]An:@ɧQa @>JDO#h=C9u"Ck 8YBnxqB^J0A7*--A6aQ@f>?PtFZb)Y0O67?IYb`.wqPtFZbzXY޳w7/2 u?@8:O@ɒ M@(-b @6@pw@A.A%ѣA;B ЀA5īk&CAnHLF@GZ@@{?ĵ\HD~$/waPnC0ZÅcb(bC 3 i C‚ٓA@# D|PG'gDrjaXhCd+pJCx k"B{Bb Aљ=J$A7ڒAR@1q~k? 2P \f p  JP    Pf   2B.text".datax.bss_j1omcounto_y1o_matherro_writeo_errnoo_logo_sqrto_sino_coso_j1_asympt matherr.o/ 548423840 98 100 100664 388 ` u H.text .data(@.bss@@`8PW @(#)matherr.c 4.2 87/05/13 .text.data(.bss@_matherrjmcountjd_acos.o/ 548423844 98 100 100664 1746 ` u H .text  .datah@.bss`hP`pP`xP 0?@ 0~0?栐@- :010A53P?svp`ti5Sp ހ#hئ3W5Sp@ ހgB3W5Sp,hހtc3W5Sp@0ހ r!3W5SpCހY3W5S5Pp+ٵހ?A3s5sސ@O܎ޠj G3y5sސ` ޠi3y5sސ@]:ޠQqC3y5sސDR2ޠn3y6W30 #  ?!0TD-4 ~ɎǮW0?@40P?`35@ 0AP 5P? 5Px\` V`V` e`6`6Q`?p{5`?ڵ*p3(`?ڵ*p5`?p{3ct6`3` tc6`3`@tc6`3`VS0x<@ 45Ph5P   0A53P?svp`ti5Sp ހ#hئ3W5Sp@ ހgB3W5Sp,hހtc3W5Sp@0ހ r!3W5SpCހY3W5S5Pp+ٵހ?A3s5sސ@O܎ޠj G3y5sސ` ޠi3y5sސ@]:ޠQqC3y5sސDR2ޠn3y6W30 #  0@ !@TD-3W@ !TD-W@:000:00@P:@N8 .41>0H0X, B!N@@,PWL 1 acosacos: DOMAIN error acos: input value was NAN acos: input value was INF   "( .text.datah.bss_errnos_writes_matherrs_acoss_d_acoss_D_acos smcountsUNDERFLOWd_asin.o/ 548423848 98 100 100664 1682 ` u H .text .datahd@.bss@@`(P`0P`8P 0?@ 0~0?栐@- :010A53P?svp`ti5Sp ހ#hئ3W5Sp@ ހgB3W5Sp,hހtc3W5Sp@0ހ r!3W5SpCހY3W5S5Pp+ٵހ?A3s5sސ@O܎ޠj G3y5sސ` ޠi3y5sސ@]:ޠQqC3y5sސDR2ޠn3y6W30 # ~ɞW0?@40P?`35@ 0AP 5P? 5Px\` V`Va e`2`6Q`?p{5`?ڵ*p3$`?ڵ*p5`?p{3ct6`3` tc6`3`@tc6`3bVS0x<@ 45Ph5P  0A53P?svp`ti5Sp ހ#hئ3W5Sp@ ހgB3W5Sp,hހtc3W5Sp@0ހ r!3W5SpCހY3W5S5Pp+ٵހ?A3s5sސ@O܎ޠj G3y5sސ` ޠi3y5sސ@]:ޠQqC3y5sސDR2ޠn3y6W30 #  0?!@TD-3 20?!@TD-40!TD-W?!TD-W@:00 @P:@N8 ا.41>0H0, !N@@(PWP N 8asinasin: DOMAIN error asin: input value was NAN asin: input value was INF   "( Lht~.text.datah.bss@_errnos_writes_matherrs_asins_d_asins_D_asin smcountsUNDERFLOWd_atan.o/ 548423852 98 100 100664 1420 ` u Hp .text .datahT@.bss00`P` P`(Pڧ~ C?s@   @ ? 15"@?P '5B`@"7pwۅ3F5B`@6;p&nӈ3F5B`@/ip*3F5B5@`@/Np43b5bހ@PVސv O3h5bހ@XIސ5 j3h5bހ@Gސ{b3h6F4 06 ޠ?!ްTD-2 ?03 @?P46ޠ?!ްTD- 15"@?P '5B`@"7pwۅ3F5B`@6;p&nӈ3F5B`@/ip*3F5B5@`@/Np43b5bހ@PVސv O3h5bހ@XIސ5 j3h5bހ@Gސ{b3h6F43 ɮ Ɏ~W0: R@P:@@@?!TD- 8 ȧ.41>0?!TD-H02 ! vP?!TD-8 Datanatan: DOMAIN error atan: input value was NAN atan: input value was INF   "( 6Zfpz.text.datah.bss0_errnoq_writeq_matherrq_atanq_d_atanq_D_atan qmcountqUNDERFLOWgreater.5d_atn2.o/ 548423857 98 100 100664 1628 ` u H@ .text .datap@.bss`P`P!`P֧~@Qbs E@ g` Nbs@Qސ:Ď I i4:Ď=!TD-Ɏ~W?!TD-Ɏ~W xހ 6 C?s@   @ ? 15"@?P '5B`@"7pwۅ3F5B`@6;p&nӈ3F5B`@/ip*3F5B5@`@/Np43b5bހ@PVސv O3h5bހ@XIސ5 j3h5bހ@Gސ{b3h6F4ĩ 06 ޠ?!ްTD-2 ?03 @?P46ޠ?!ްTD- 15"@?P '5B`@"7pwۅ3F5B`@6;p&nӈ3F5B`@/ip*3F5B5@`@/Np43b5bހ@PVސv O3h5bހ@XIސ5 j3h5bހ@Gސ{b3h6F43 ɮ0: f@P:@@@?!TD- 8 .41>0?!TD-H02 ! P?!TD-"   ͆Ɏ~W @ !0TD- -3atan2atan2: DOMAIN error atan2: input value was NAN atan2: input value was INF   &,  >H.text.datap.bss_errnor_writer_matherrr_atan2r_d_atn2r_D_atn2$rmcountrUNDERFLOWgreater.5d_cos.o/ 548423862 98 100 100664 1734 ` u H .text .data,@.bss88` P`(P`0P 1@ $@AP:B@~詮@?!P.H:B@7@'$@Q4B?_0@5`xlp gpgpg194ޠ 0940Πΰpx|ހ xހxg΀ٍ 5533πϑ3p?x@194.ЩN HYB0D9DB40x.Nπϑ343ހh؋N.ٍ5Hٍm35(3B3J3ހ?!ސTD-5 15"@ LA`:4pC 5bހ@ސq3h5bހ ސ炗3h5b5`ހ@eqސa m35ޠ@/cް`p35ޠA"شްm36h3  ,"6~ɎɮWd@?!4P"`\Tdp5bހ@ܢސTb3h5bހ}ސa3h5bހ@`+Kސ-35ޠ@pްq335ޠA}ް36h?3P@P:BN8 Ч.45>0H0Ԏ, "N@@,PW  n?_0@>v@<);_@9SL8@coscos: TLOSS error cos: input value was NAN cos: input value was INF   "( .:DNt~.text.data.bss8_errnos_writes_matherrs_coss_d_coss_D_cos smcountsUNDERFLOWd_cosh.o/ 548423866 98 100 100664 1322 ` u H .text| .dataX$@.bss`ؓP`P`P @00   ? w5 >" ;075 @>~P#o+3$5 @>PY~3$5 @?VlPh3$5 @?UUPUUG3$5 @?P3$5 ?32~7@'D 14$`?Gp@5F1d9v4Gp?Gހ@5'p>ހ 533 15"@? P\ 5Bp@43ހww3G5Bp@tހs3G5@@m%P3B5$@@P߰3$4 6 &T ?03 @?P6Bv rq$0 h#0 #'0h#0 C B3 ?03 0 h#0 #&0h#0  ~WT@P:@N8 .43>0H0̎"N@@.PW  tcoshcosh: input value was NAN cosh: input value was INF   "( 6Dlv.text .dataX.bss_errnor_writer_matherrr_coshr_d_coshr_D_cosh rmcountrUNDERFLOWd_exp.o/ 548423870 98 100 100664 1350 ` u H4 .texthD .datahhP@.bss`P`P`P 0 08 80@(@:00~7@'D 14$`?Gp@5F1d9v4Gp?Gހ@5'p>ހ 533@$55"? \ 5p@43ހww35p@tހs35@@m%P3B5$@@P߰3$4 6 ?03a 0H0"O@@(PW `l J0@00@P:@N8 h.43>0H0"N@@,PW l expexp: input value was NAN exp: input value was INF   "( Lhv:DPZ.texth.datahP.bss_errnop_writep_matherrp_expp_d_expp_D_exp pmcountpUNDERFLOWd_lg10.o/ 548423875 98 100 100664 1446 ` u H .text .data$@.bss`P`P`Pڌ4  ~ x,0 #0#0 0? 0?@ω?:000?@30P?`460A53PD`9}5Sp@baހ)T3W5Sp ހe3W5S5Pp!Ւހe&3s5sސ@3ޠ_e3y5sސ( 1ޠT@3y6W3@@P59"@?.BP95$3 @k0U6~ɞW0@@30P@`46!< ! l8 .41>0H0h  R!PW8 .42>0H0 !:02 PW PWlog10log10: SING error log10: DOMAIN error log10: input value was NAN log10: input value was INF   "( x"BLt~.text.data.bss_errnoq_writeq_matherrq_log10q_d_lg10q_D_lg10 qmcountqUNDERFLOWd_log.o/ 548423879 98 100 100664 1422 ` u H| .text .datax@.bss`P`P`Pڌ&  ~ x,0 #0#0 0? 0?@ω?:000?@30P?`460A53PD`9}5Sp@baހ)T3W5Sp ހe3W5S5Pp!Ւހe&3s5sސ@3ޠ_e3y5sސ( 1ޠT@3y6W3@@P59"@?.BP95$3~ɞW0@@30P@`46!J ! l8 .41>0H0v  `!PW8 .42>0H0 !:02 PW PWloglog: SING error log: DOMAIN error log: input value was NAN log: input value was INF   "( j 4>fp.text.datax.bss_errnoqX_writeqX_matherrqX_logqX_d_logqX_D_log qXmcountqXUNDERFLOWd_sin.o/ 548423884 98 100 100664 1726 ` u H .text .data$@.bss00`P` P`(P 1@ $@AP:B@~詮@?!P.H:B@7@'$@Q4B?_0@5`xlp gpgpg194ޠ 0940Πΰpx|ހ xހxg΀ٍ 5533πϑ3p?x@194.ЩN HYB0D9DB40x.Nπϑ343ހh؋N.ٍ5Hٍm35(3B3J3ހ?!ސTD-5 15"@ LA`:4pC 5bހ@ސq3h5bހ ސ炗3h5b5`ހ@eqސa m35ޠ@/cް`p35ޠA"شްm36h3  ,"6~ɎɮWf@?!4R"`\Tdp5bހ@ܢސTb3h5bހ}ސa3h5bހ@`+Kސ-35ޠ@pްq335ޠA}ް36h?3P@P:BN8 ȧ.45>0H0؎, "N@@,PW  r?_0@>v@<);_@9SL8@sinsin: TLOSS error sin: input value was NAN sin: input value was INF   "(  *6@Jpz.text.data.bss0_errnot_writet_matherrt_sint_d_sint_D_sin tmcounttUNDERFLOWd_sinh.o/ 548423888 98 100 100664 1346 ` u H0 .text .dataX<@.bss`P`P`P 0@0P 0̧~0?0y@Q5D =G<0K5$`>Zpئ3&5$`>pm3&5$`?*p3&5$`?p#+3&5$`?UUpUUUK3&5$5 3<7P'U0A45p?Gހ@5W1u94Xހ?Gސ@58ހ>ސ 5330A53P? `\ 5Sހ@43ސww3X5Sހ@tސs3X5P@m%`3S55P@`߰3540607T0?@30P?`6Sχ05@ h4@ 48@h4@ T S40?@30@ h4@ 47@h4@  0 # ɎnW@@P:@N8 .43>0H0"N@@.PW t ^sinhsinh: input value was NAN sinh: input value was INF   "( ,N\.text .dataX.bss_errnorx_writerx_matherrrx_sinhrx_d_sinhrx_D_sinh rxmcountrxUNDERFLOWd_sqrt.o/ 548423893 98 100 100664 934 ` u H .text8 .data888@.bsspp`XP``P`hPڌ~ x,0 #ς   p/p%`q7?%>թW#&#@')63@6`3`d?栞f;5`Uspp~ɎW ! W1>0P8^48H0 = !HPWsqrtsqrt: DOMAIN error   "( ".text8 .data88.bssp_errnom_writem_matherrm_sqrtm_d_sqrtm_D_sqrt mmcountm"sqrt_nameUNDERFLOWdsqrt_errd_tan.o/ 548423897 98 100 100664 1630 ` u HL .text8\ .data88@.bss`P`P`ȓP 1@ $@AP:B@<~詮@?!P.H:$ 7@'$@Q4B?_0@5`xlp gpgpg194ޠ 0940Πΰpx|ހ xހxg΀ٍ8 85533πϑ3xx|n` v`vnЅp@194.ЩNHY B0D9DB40x.Nπϑ343ހh؋8.ٍ85Hٍ8m835(3B3J3ހ?!ސTD-5 15"`pVm5bހ@X"ސ 3h5bހސ=3h5b5`ހ[ސh35ޠ@Mްs*}J35ޠgްCOm36h3  ,!"~ɎɮWp 06 @P:BN8 h.45>0H0>,l ("N@@,PW ~ ؋?_0@>v@<);_@9SL8@tantan: TLOSS error tan: input value was NAN tan: input value was INF   "(   *.text8.data8.bss_errnor_writer_matherrr_tanr_d_tanr_D_tan rmcountrUNDERFLOWd_tanh.o/ 548423902 98 100 100664 1322 ` u H .textpd .datapph@.bss`P`ȓP`ГP 0 0@3@:00r~0?@:00x0A53P`DC$5SpXހ3W5SpEހѱ3W5S5Pp@\<ހԧ3s5sސ@~:ޠ#3y5sސ@%ޠEA3y6W3Ǯ37P'U0A45p?Gހ@5W1u94Xހ?Gސ@58ހ>ސ 5330A53P? `\ 5Sހ@43ސww3X5Sހ@tސs3X5P@m%`3S55P@`߰35Pa3Sxސ p Wph X403Sp@5765?40 # ~ɎW@P:@@?0 # WN8 p.41>0?H0:u !O@( P?W tanhtanh: DOMAIN error tanh: input value was NAN tanh: input value was INF   "(   *:D^h.textp.dataph.bss_errnoq_writeq_matherrq_tanhq_d_tanhq_D_tanh qmcountqUNDERFLOWpow_dd.o/ 548423909 98 100 100664 2640 ` u H .textH| .dataHH@.bss`P`P!~Ä+40"9BK,\(1 # Ѐ     x,0 #0#0 0? 0?@ω?:000?@30P?`460A53PD`9}5Sp@baހ)T3W5Sp ހe3W5S5Pp!Ւހe&3s5sސ@3ޠ_e3y5sސ( 1ޠT@3y6W3@@P59"@?.BP95$30@@30P@`46!T ~ɎɮW8 H.41>0H0H ] 2!P~ɎɮW8 H.42>0H0ԎL !F0@ P~ɎɮWp LP~ɎɮW5  0 0@0@:007@'D 14$`?Gp@5F1d9v4Gp?Gހ@5'p>ހ 533@$55"? \ 5p@43ހww35p@tހs35@@m%P3B5$@@P߰3$4 6 ?03a %P R% Rt ! ! PˀRj"u!  @P,,@uP !P%2 % P [ePh%     ~ɎɮW0 # @P:@N8 .44>0H0Ύ"N@&@8P~ɎɮW  n@P:@N8 .43>0H0*"N@*@<P~ɎɮW ܋ Ƌpowpow: SING error pow: DOMAIN error pow: input value was NAN pow: input value was INF powpow: input value was NAN pow: input value was INF   .:DNlv4Bt~&2<.textH .dataH.bss_errnowp_writewp_matherrwp_powwp_Pow_ddwp_pow_ddwpmcountwpPUNDERFLOWZeroOrBadDontNegatedomain_errorzero_or_guinf_or_nannormalizer_acos.o/ 548423914 98 100 100664 1302 ` u H .textPD .dataPPh@.bss`P`P`P  ?t ?5! ?$!0?#%!1Ih4@ 4@4@ $@? $A CA>թW%@?#@$1?%@>թW#B&A#@$&!#B42!x)@ $2 h2   !%"0<.6%2@ǐI#4%2@>#4%2%1@j#B%BP@<۷#E&4# W@I$W?W 3ֿ!!%"0<.6%2@ǐI#4%2@>#4%2%1@j#B%BP@<۷#E&4# ?$W?#W@*AN8 P.41>0H0 ,U  !N@@&PW ֋i acosacos: DOMAIN error acos: input value was NAN acos: input value was INF   "( ",8B.textP.dataPh.bss_errnoq(_writeq(_matherrq(_s_acosq(_r_acosq(_R_acos q(mcountq(UNDERFLOWcontgreate>?@ABC2ponmlkjihgfedcba`_^]\[ZYXWVUTSRQPONMLKJIHGFEDCBA@?Ftvׇ%v%r#x#Wp#uހ?!wG)w$p#p$#P8d%!dd6#1%###?%~Q%A  $ L}%!0<##%!0*##%!% #" $" PW"W?W@9QB@PA?$O!b'"@@ !PTD-6$09A4$7"1  ?#!@I%!n %!0=*##%!0##%!?#A^@*BN8 ȧ.45>0H0Ў, "N@@&PW  p?"94[.(#pQ coscos: TLOSS error cos: input value was NAN cos: input value was INF   "( 2>HRr|.text.data.bss0_errnor_writer_matherrr_s_cosr_r_cosr_R_cos rmcountrUNDERFLOWpi_reducer_cosh.o/ 548423937 98 100 100664 1142 ` u IX .text .dataXd@.bss00`P` P`(P  F@ ?@!2!%"0:j%2@=*#4%2@?#4%#?# !1$2@?%$!B)D$$ DP?%5P9%##!%"0=lVe%2P@#5%0A##$!& $0 3>0H0"N@@*PW J 4coshcosh: input value was NAN cosh: input value was INF   "( P|.text .dataX.bss0_errnop_writep_matherrp_s_coshp_r_coshp_R_cosh pmcountpUNDERFLOWcontgreaterr_exp.o/ 548423943 98 100 100664 1334 ` u I$ .textX4 .dataXXP@.bss`P`P`P@  B 3!ҍ"  q#P P p0;(.u 27"a00H0"N@@(PWv ^\ H@*AN8 X.43>0H0"N@@*PWv ̋\ expexp: input value was NAN exp: input value was INF   "( Njx,6BL.textX.dataXP.bss_errnop_writep_matherrp_s_expp_r_expp_R_exp pmcountpUNDERFLOWr_lg10.o/ 548423947 98 100 100664 1310 ` u I .text .datat@.bsshh`PP`XP``P?Fx     ?  ?  ?# 0?$& %"0?M$2@?^&C%$% @?1r)%@##@]&WWd8 .41>0H0  !PW8 .42>0H0 !.2 `PW 2PWlog10log10: SING error log10: DOMAIN error log10: input value was NAN log10: input value was INF "(  B`lv.text.data.bssh_errnop _writep _matherrp _s_log10p _r_lg10p _R_lg10 p _r_alg10p _R_alg10 p mcountp UNDERFLOWr_log.o/ 548423952 98 100 100664 1246 ` u I .text .dataxd@.bssPP`8P`@P`HP? W6x     ?  ?  ?# 0?$& %"0?M$2@?^&C%$% @?1r)%@##Wd8 ا.41>0H0  !PW8 ا.42>0H0 !. nPW @PWloglog: SING error log: DOMAIN error log: input value was NAN log: input value was INF   "( 4R^hr.text.datax.bssP_errnoo_writeo_matherro_s_logo_r_logo_R_log omcountoUNDERFLOWr_sin.o/ 548423958 98 100 100664 1412 ` u Ih .text .datahL@.bss((?"94[.(#pQ `Pҋ`P` P  GPX~.?I?' $!?"%0x9@ 4@4I4!@)D$!DP`pxyހ xހx7O΀Ftv %v%r#x#Wp#uހ?!wG)w$p#p$#P8d%!dd6#1%###?%~^%! $ L}%!0<##%!0*##%!% #" $" P WP"W@9QB@PA?$O!b@@ !PTD-'"6$09A4$7"1  ?#!0@I%#r %!0=*##%!0##%!?#Ab@*BN8 .45>0H0, "N@@&PW b Lsinsin: TLOSS error sin: input value was NAN sin: input value was INF *0 :@ JP <Vblv.text.datah.bss(_errnor0_writer0_matherrr0_s_sin(r0_r_sin8r0_R_sinHr0mcountr0UNDERFLOWpi_reducer_sinh.o/ 548423963 98 100 100664 1142 ` u IX .text .dataXd@.bss00`P` P`(P  ?@!.!%"09SL[%2@<#4%2@>*#4%#%!# F@ !1$2@?%$!B)D$$ DP?%5P9%##!%"0=lVe%2P@#5%0A##$!& $0 3>0H0"N@@*PW H 2sinhsinh: input value was NAN sinh: input value was INF   "( R~.text .dataX.bss0_errnop_writep_matherrp_s_sinhp_r_sinhp_R_sinh pmcountpUNDERFLOWcontgreaterr_sqrt.o/ 548423969 98 100 100664 1892 ` u I!H .text .data8@.bss88` P`(P`0Pڌv@ ?qp &!#  &!#  aBD$U BqApJpM ?% ?5%WW1>0P^48H02  !PW?5?5_W?5?6?6m?6T?7 ?7z>?7o?8,?8^?8?96?9?92?:?F?:)?:?;Fx?;?;?Sv?>q?>L??U???@?@UC?@e?@T?AT"?A?AY?BQ?B?B?CN?C?C?DI?D?D?EB?E?E?F;i?F ?F~?G2?G?G ?H(?Hz?Hh?I?IoT?I?J?Jb?J?Kh?KU?K?K?LFA?LW?Lm?M6P?M?Mղ?N%B?Nt?N?O'?ObA?O)?P?PN?PI?P?Q:.?Qn?Q֌?R$?Rru?R@?S ?S[?S?S^?TC?T?Tݵ?U*?Uwu?U"?V?V]:?V?V?WB?W?W?X%?Xq?XE?Y?YTC?Y?Y?Z5?Z?Z?[?[a?[.?[?\A%?\v?\շ?]?]i?]?]?^Gx?^!?^ک?_$ ?_m?_?`?`I?`?`?a#?al?a1?a?bF(?b?b?c?cg?c!?c?d>?d?d>?e?e]>?e?e?f3'?fzS?f]?gF?gO/?g?gܭ?h#S?hi?hK?h?il?~~?~4?~~????sqrtsqrt: DOMAIN error   "( .text .data8.bss8_errnom_writem_matherrm_s_sqrtm_r_sqrtm_R_sqrt mmcountmsqrt_nameUNDERFLOWr_tan.o/ 548423975 98 100 100664 1292 ` u I' .textH< .dataHHh@.bss?"94[.(#pQ `Pҋ`P`P  O!D~.?I $!?"%0x9@ 4@4I4!@)D$!DP`pxyހ xހx7O΀Ftv*%v"%r#x#Wp#uހ?!wG)w$p#p$#P8d%!dd6#1%###?%~^% @ :1$2 >&#%!0>$2% %!# A@&PW"WW@9QB@@*BN8 H.45>0H0(,L "N@@(PWx ܋^ Ƌtantan: TLOSS error tan: input value was NAN tan: input value was INF *0 :@ JP &2<.textH.dataHh.bss_errnop_writep_matherrp_s_tan(p_r_tan8p_R_tanHpmcountpUNDERFLOWpi_reducer_tanh.o/ 548423980 98 100 100664 1114 ` u I,H .text .datah,@.bss`P`P`P  ).*! > ! ?@!,!%"0v=t%2@Rl#4%2%0@@5/#B&4#W A-| @8;%!1)3$!%"@=lVe%BP@#E%@A#$ 3A#B$!TxY QS0 4@hT 5#2!&#?$  W?*!.8 .41>0?H0Ȏ: !. & P?W ltanhtanh: DOMAIN error tanh: input value was NAN tanh: input value was INF   "( :FPZjt.text.datah.bss_errnop_writep_matherrp_s_tanhp_r_tanhp_R_tanh pmcountpUNDERFLOWpow_rr.o/ 548423986 98 100 100664 2061 ` u I2 .text,$ .data|@.bss`P`P ?W !)"0   8!2  x)0#0 0? 0?0!0?#0@?$&0%3@?M$CP?^&T%5%0P?1r)"%%P## 8 .41>0H0  !PW8 .43>0H0 !.> VPW$ (PWWW%Bff*®*  F@  $!0?%!1)3$ 3@?%$@9%##% =lVe%!@@#$% A#$&?#1 x h    !   W|W0 @*AN8 .44>0H0"N@@&PW>ċ$ @*AN8 .43>0H0n"N@@*PWP>2P$powpow: OVERFLOW error pow: DOMAIN error pow: input value was NAN pow: input value was INF powpow: input value was NAN pow: input value was INF   6<(Jht~4>JTv.text$.data.bss_errnos_writes_matherrs_s_pows_pow_rrs_Pow_rrsmcounts-SavePowerUNDERFLOWpnanorinfDontNegate r_floor.o/ 548423991 98 100 100664 620 ` u I7 .text\ .data0,@.bss@`P<*<?$<@@W@`ȓP<*<?#<@@W @(#)r_floor.c 4.2 87/05/14 $Z`t.text.data0.bss_s_floork(mcountk(_s_modfk(_s_ceilXk(r_modf.o/ 548423992 98 100 100664 508 ` u I8\.textD .data(@.bss`P0~q* " K* <@?K#K$$**"$~W @(#)r_modf.c 4.2 87/05/14 .text.data(.bss_s_modfk(mcountk( Symbols from plibm.a[erf.o]: Name Value Class Type Size Line Section _exp |0x00000000|extern| | | | mcount |0x00000000|extern| | | | _erf |0x00000008|extern| | | |.text _erfc |0x0000010c|extern| | | |.text Symbols from plibm.a[fabs.o]: Name Value Class Type Size Line Section mcount |0x00000000|extern| | | | _fabs |0x00000008|extern| | | |.text Symbols from plibm.a[floor.o]: Name Value Class Type Size Line Section _modf |0x00000000|extern| | | | mcount |0x00000000|extern| | | | _floor |0x00000008|extern| | | |.text _ceil |0x00000060|extern| | | |.text Symbols from plibm.a[fmod.o]: Name Value Class Type Size Line Section _modf |0x00000000|extern| | | | mcount |0x00000000|extern| | | | _fmod |0x00000008|extern| | | |.text Symbols from plibm.a[gamma.o]: Name Value Class Type Size Line Section _errno |0x00000000|extern| | | | _log |0x00000000|extern| | | | _matherr |0x00000000|extern| | | | _modf |0x00000000|extern| | | | _sin |0x00000000|extern| | | | _write |0x00000000|extern| | | | mcount |0x00000000|extern| | | | _signgam |0x00000004|extern| | | | _gamma |0x00000008|extern| | | |.text Symbols from plibm.a[hypot.o]: Name Value Class Type Size Line Section _errno |0x00000000|extern| | | | _matherr |0x00000000|extern| | | | mcount |0x00000000|extern| | | | _hypot |0x00000008|extern| | | |.text Symbols from plibm.a[jn.o]: Name Value Class Type Size Line Section _errno |0x00000000|extern| | | | _j0 |0x00000000|extern| | | | _j1 |0x00000000|extern| | | | _matherr |0x00000000|extern| | | | _write |0x00000000|extern| | | | _y0 |0x00000000|extern| | | | _y1 |0x00000000|extern| | | | mcount |0x00000000|extern| | | | _jn |0x00000008|extern| | | |.text _yn |0x000001d0|extern| | | |.text Symbols from plibm.a[j0.o]: Name Value Class Type Size Line Section _cos |0x00000000|extern| | | | _errno |0x00000000|extern| | | | _log |0x00000000|extern| | | | _matherr |0x00000000|extern| | | | _sin |0x00000000|extern| | | | _sqrt |0x00000000|extern| | | | _write |0x00000000|extern| | | | mcount |0x00000000|extern| | | | _j0 |0x00000008|extern| | | |.text _y0 |0x000000ec|extern| | | |.text Symbols from plibm.a[j1.o]: Name Value Class Type Size Line Section _cos |0x00000000|extern| | | | _errno |0x00000000|extern| | | | _log |0x00000000|extern| | | | _matherr |0x00000000|extern| | | | _sin |0x00000000|extern| | | | _sqrt |0x00000000|extern| | | | _write |0x00000000|extern| | | | mcount |0x00000000|extern| | | | _j1 |0x00000008|extern| | | |.text _y1 |0x000000fc|extern| | | |.text Symbols from plibm.a[matherr.o]: Name Value Class Type Size Line Section mcount |0x00000000|extern| | | | _matherr |0x00000008|extern| | | |.text Symbols from plibm.a[d_acos.o]: Name Value Class Type Size Line Section _acos |0x00000000|extern| | | |.text _errno |0x00000000|extern| | | | _matherr |0x00000000|extern| | | | _write |0x00000000|extern| | | | mcount |0x00000000|extern| | | | _d_acos |0x00000010|extern| | | |.text _D_acos |0x00000020|extern| | | |.text Symbols from plibm.a[d_asin.o]: Name Value Class Type Size Line Section _asin |0x00000000|extern| | | |.text _errno |0x00000000|extern| | | | _matherr |0x00000000|extern| | | | _write |0x00000000|extern| | | | mcount |0x00000000|extern| | | | _d_asin |0x00000010|extern| | | |.text _D_asin |0x00000020|extern| | | |.text Symbols from plibm.a[d_atan.o]: Name Value Class Type Size Line Section _atan |0x00000000|extern| | | |.text _errno |0x00000000|extern| | | | _matherr |0x00000000|extern| | | | _write |0x00000000|extern| | | | mcount |0x00000000|extern| | | | _d_atan |0x00000010|extern| | | |.text _D_atan |0x00000020|extern| | | |.text Symbols from plibm.a[d_atn2.o]: Name Value Class Type Size Line Section _atan2 |0x00000000|extern| | | |.text _errno |0x00000000|extern| | | | _matherr |0x00000000|extern| | | | _write |0x00000000|extern| | | | mcount |0x00000000|extern| | | | _d_atn2 |0x00000010|extern| | | |.text _D_atn2 |0x00000024|extern| | | |.text Symbols from plibm.a[d_cos.o]: Name Value Class Type Size Line Section _cos |0x00000000|extern| | | |.text _errno |0x00000000|extern| | | | _matherr |0x00000000|extern| | | | _write |0x00000000|extern| | | | mcount |0x00000000|extern| | | | _d_cos |0x00000010|extern| | | |.text _D_cos |0x00000020|extern| | | |.text Symbols from plibm.a[d_cosh.o]: Name Value Class Type Size Line Section _cosh |0x00000000|extern| | | |.text _errno |0x00000000|extern| | | | _matherr |0x00000000|extern| | | | _write |0x00000000|extern| | | | mcount |0x00000000|extern| | | | _d_cosh |0x00000010|extern| | | |.text _D_cosh |0x00000020|extern| | | |.text Symbols from plibm.a[d_exp.o]: Name Value Class Type Size Line Section _errno |0x00000000|extern| | | | _exp |0x00000000|extern| | | |.text _matherr |0x00000000|extern| | | | _write |0x00000000|extern| | | | mcount |0x00000000|extern| | | | _d_exp |0x00000010|extern| | | |.text _D_exp |0x00000020|extern| | | |.text Symbols from plibm.a[d_lg10.o]: Name Value Class Type Size Line Section _errno |0x00000000|extern| | | | _log10 |0x00000000|extern| | | |.text _matherr |0x00000000|extern| | | | _write |0x00000000|extern| | | | mcount |0x00000000|extern| | | | _d_lg10 |0x00000010|extern| | | |.text _D_lg10 |0x00000020|extern| | | |.text Symbols from plibm.a[d_log.o]: Name Value Class Type Size Line Section _errno |0x00000000|extern| | | | _log |0x00000000|extern| | | |.text _matherr |0x00000000|extern| | | | _write |0x00000000|extern| | | | mcount |0x00000000|extern| | | | _d_log |0x00000010|extern| | | |.text _D_log |0x00000020|extern| | | |.text Symbols from plibm.a[d_sin.o]: Name Value Class Type Size Line Section _errno |0x00000000|extern| | | | _matherr |0x00000000|extern| | | | _sin |0x00000000|extern| | | |.text _write |0x00000000|extern| | | | mcount |0x00000000|extern| | | | _d_sin |0x00000010|extern| | | |.text _D_sin |0x00000020|extern| | | |.text Symbols from plibm.a[d_sinh.o]: Name Value Class Type Size Line Section _errno |0x00000000|extern| | | | _matherr |0x00000000|extern| | | | _sinh |0x00000000|extern| | | |.text _write |0x00000000|extern| | | | mcount |0x00000000|extern| | | | _d_sinh |0x00000010|extern| | | |.text _D_sinh |0x00000020|extern| | | |.text Symbols from plibm.a[d_sqrt.o]: Name Value Class Type Size Line Section _errno |0x00000000|extern| | | | _matherr |0x00000000|extern| | | | _sqrt |0x00000000|extern| | | |.text _write |0x00000000|extern| | | | mcount |0x00000000|extern| | | | _d_sqrt |0x00000010|extern| | | |.text _D_sqrt |0x00000020|extern| | | |.text Symbols from plibm.a[d_tan.o]: Name Value Class Type Size Line Section _errno |0x00000000|extern| | | | _matherr |0x00000000|extern| | | | _tan |0x00000000|extern| | | |.text _write |0x00000000|extern| | | | mcount |0x00000000|extern| | | | _d_tan |0x00000010|extern| | | |.text _D_tan |0x00000020|extern| | | |.text Symbols from plibm.a[d_tanh.o]: Name Value Class Type Size Line Section _errno |0x00000000|extern| | | | _matherr |0x00000000|extern| | | | _tanh |0x00000000|extern| | | |.text _write |0x00000000|extern| | | | mcount |0x00000000|extern| | | | _d_tanh |0x00000010|extern| | | |.text _D_tanh |0x00000020|extern| | | |.text Symbols from plibm.a[pow_dd.o]: Name Value Class Type Size Line Section _Pow_dd |0x00000000|extern| | | |.text _errno |0x00000000|extern| | | | _matherr |0x00000000|extern| | | | _pow |0x00000000|extern| | | |.text _write |0x00000000|extern| | | | mcount |0x00000000|extern| | | | _pow_dd |0x00000010|extern| | | |.text Symbols from plibm.a[r_acos.o]: Name Value Class Type Size Line Section _errno |0x00000000|extern| | | | _matherr |0x00000000|extern| | | | _s_acos |0x00000000|extern| | | |.text _write |0x00000000|extern| | | | mcount |0x00000000|extern| | | | _r_acos |0x00000010|extern| | | |.text _R_acos |0x00000020|extern| | | |.text Symbols from plibm.a[r_asin.o]: Name Value Class Type Size Line Section _errno |0x00000000|extern| | | | _matherr |0x00000000|extern| | | | _s_asin |0x00000000|extern| | | |.text _write |0x00000000|extern| | | | mcount |0x00000000|extern| | | | _r_asin |0x00000010|extern| | | |.text _R_asin |0x00000020|extern| | | |.text Symbols from plibm.a[r_atan.o]: Name Value Class Type Size Line Section _errno |0x00000000|extern| | | | _matherr |0x00000000|extern| | | | _s_atan |0x00000000|extern| | | |.text _write |0x00000000|extern| | | | mcount |0x00000000|extern| | | | _r_atan |0x00000010|extern| | | |.text _R_atan |0x00000020|extern| | | |.text Symbols from plibm.a[r_atn2.o]: Name Value Class Type Size Line Section _errno |0x00000000|extern| | | | _matherr |0x00000000|extern| | | | _s_atan2 |0x00000000|extern| | | |.text _write |0x00000000|extern| | | | mcount |0x00000000|extern| | | | _r_atn2 |0x00000010|extern| | | |.text _R_atn2 |0x00000024|extern| | | |.text Symbols from plibm.a[r_cos.o]: Name Value Class Type Size Line Section _errno |0x00000000|extern| | | | _matherr |0x00000000|extern| | | | _s_cos |0x00000000|extern| | | |.text _write |0x00000000|extern| | | | mcount |0x00000000|extern| | | | _r_cos |0x00000010|extern| | | |.text _R_cos |0x00000020|extern| | | |.text Symbols from plibm.a[r_cosh.o]: Name Value Class Type Size Line Section _errno |0x00000000|extern| | | | _matherr |0x00000000|extern| | | | _s_cosh |0x00000000|extern| | | |.text _write |0x00000000|extern| | | | mcount |0x00000000|extern| | | | _r_cosh |0x00000010|extern| | | |.text _R_cosh |0x00000020|extern| | | |.text Symbols from plibm.a[r_exp.o]: Name Value Class Type Size Line Section _errno |0x00000000|extern| | | | _matherr |0x00000000|extern| | | | _s_exp |0x00000000|extern| | | |.text _write |0x00000000|extern| | | | mcount |0x00000000|extern| | | | _r_exp |0x00000010|extern| | | |.text _R_exp |0x00000020|extern| | | |.text Symbols from plibm.a[r_lg10.o]: Name Value Class Type Size Line Section _errno |0x00000000|extern| | | | _matherr |0x00000000|extern| | | | _s_log10 |0x00000000|extern| | | |.text _write |0x00000000|extern| | | | mcount |0x00000000|extern| | | | _r_alg10 |0x00000010|extern| | | |.text _r_lg10 |0x00000010|extern| | | |.text _R_alg10 |0x00000020|extern| | | |.text _R_lg10 |0x00000020|extern| | | |.text Symbols from plibm.a[r_log.o]: Name Value Class Type Size Line Section _errno |0x00000000|extern| | | | _matherr |0x00000000|extern| | | | _s_log |0x00000000|extern| | | |.text _write |0x00000000|extern| | | | mcount |0x00000000|extern| | | | _r_log |0x00000010|extern| | | |.text _R_log |0x00000020|extern| | | |.text Symbols from plibm.a[r_sin.o]: Name Value Class Type Size Line Section _errno |0x00000000|extern| | | | _matherr |0x00000000|extern| | | | _write |0x00000000|extern| | | | mcount |0x00000000|extern| | | | _s_sin |0x00000028|extern| | | |.text _r_sin |0x00000038|extern| | | |.text _R_sin |0x00000048|extern| | | |.text Symbols from plibm.a[r_sinh.o]: Name Value Class Type Size Line Section _errno |0x00000000|extern| | | | _matherr |0x00000000|extern| | | | _s_sinh |0x00000000|extern| | | |.text _write |0x00000000|extern| | | | mcount |0x00000000|extern| | | | _r_sinh |0x00000010|extern| | | |.text _R_sinh |0x00000020|extern| | | |.text Symbols from plibm.a[r_sqrt.o]: Name Value Class Type Size Line Section _errno |0x00000000|extern| | | | _matherr |0x00000000|extern| | | | _s_sqrt |0x00000000|extern| | | |.text _write |0x00000000|extern| | | | mcount |0x00000000|extern| | | | _r_sqrt |0x00000010|extern| | | |.text _R_sqrt |0x00000020|extern| | | |.text Symbols from plibm.a[r_tan.o]: Name Value Class Type Size Line Section _errno |0x00000000|extern| | | | _matherr |0x00000000|extern| | | | _write |0x00000000|extern| | | | mcount |0x00000000|extern| | | | _s_tan |0x00000028|extern| | | |.text _r_tan |0x00000038|extern| | | |.text _R_tan |0x00000048|extern| | | |.text Symbols from plibm.a[r_tanh.o]: Name Value Class Type Size Line Section _errno |0x00000000|extern| | | | _matherr |0x00000000|extern| | | | _s_tanh |0x00000000|extern| | | |.text _write |0x00000000|extern| | | | mcount |0x00000000|extern| | | | _r_tanh |0x00000010|extern| | | |.text _R_tanh |0x00000020|extern| | | |.text Symbols from plibm.a[pow_rr.o]: Name Value Class Type Size Line Section _Pow_rr |0x00000000|extern| | | |.text _errno |0x00000000|extern| | | | _matherr |0x00000000|extern| | | | _s_pow |0x00000000|extern| | | |.text _write |0x00000000|extern| | | | mcount |0x00000000|extern| | | | _pow_rr |0x00000010|extern| | | |.text Symbols from plibm.a[r_floor.o]: Name Value Class Type Size Line Section _s_modf |0x00000000|extern| | | | mcount |0x00000000|extern| | | | _s_floor |0x00000008|extern| | | |.text _s_ceil |0x00000058|extern| | | |.text Symbols from plibm.a[r_modf.o]: Name Value Class Type Size Line Section mcount |0x00000000|extern| | | | _s_modf |0x00000008|extern| | | |.text ...s.Makefiles.READMEs.__cflush.cs.__sscans.cs._blanks.cs._c_clean.cs._clearhl.cs._clearline.cs._comphash.cs._delay.cs._delchars.cs._dellines.cs._dumpwin.cs._ec_quit.cs._fixdelay.cs._forcehl.cs._hlmode.cs._id_char.cs._init_cost.cs._inschars.cs._insmode.cs._kpmode.cs._line_free.cs._ll_move.cs._outch.cs._outchar.cs._pos.cs._reset.cs._scrdown.cs._scrollf.cs._sethl.cs._setmode.cs._setwind.cs._shove.cs._sprintw.cs._sputc.cs._syncmodes.cs._tscroll.cs._window.cs.addch.cs.addstr.cs.baudrate.cs.beep.cs.boolnamess.boolvalss.box.cs.capnames.cs.capss.cbreak.cs.chktypeahd.cs.clear.cs.clearok.cs.clreolinln.cs.clrtobot.cs.clrtoeol.cs.cntcostfn.cs.crmode.cs.curses.cs.curses.exts.curshdr.hs.def_prog.cs.def_shell.cs.delayoutpt.cs.delch.cs.deleteln.cs.delwin.cs.doprnt.cs.doscan.cs.doupdate.cs.draino.cs.echo.cs.endwin.cs.erase.cs.erasechar.cs.fixterm.cs.flash.cs.flushinp.cs.fonccallss.getch.cs.getstr.cs.gettmode.cs.has_ic.cs.has_il.cs.idln.getst.cs.idlok.cs.initkeypad.cs.initscr.cs.insch.cs.insertln.cs.intrflush.cs.keypad.cs.killchar.cs.leaveok.cs.libcurs.cs.line_alloc.cs.ll_refresh.cs.longname.cs.m_addch.cs.m_addstr.cs.m_clear.cs.m_erase.cs.m_move.cs.m_refresh.cs.m_tstp.cs.main.cs.make.mks.makenew.cs.maketerm.exs.meta.cs.miniinit.cs.mkti4.cs.move.cs.mvcur.cs.mvprintw.cs.mvscanw.cs.mvwin.cs.mvwprintw.cs.mvwscanw.cs.naps.c s.newpad.c s.newterm.c s.newwin.c s.nl.c s.nocbreak.cs.nocrmode.cs.nodelay.cs.noecho.cs.nonl.cs.noraw.cs.ns_curses.hs.nttychktrm.cs.numnamess.numvalss.overlay.cs.overwrite.cs.pnoutrfrsh.cs.prefresh.cs.printw.cs.putp.cs.raw.cs.reset_prog.cs.resetshell.c s.resetterm.c!s.resetty.c"s.restarttrm.c#s.saveterm.c$s.savetty.c%s.scanw.c&s.scroll.c's.scrollok.c(s.select.c)s.set_term.c*s.setbuffred.c+s.setterm.c,s.setupterm.c-s.showstring.c.s.strnames/s.strvals0s.subwin.c1s.termcap.ed2s.termcap.form3s.tgetent.c4s.tgetflag.c5s.tgetnum.c6s.tgetstr.c7s.tgoto.c8s.ti4.c9s.touchwin.c:s.tparm.c;s.tputs.cs.two.twostr.c?s.typeahead.c@s.unctrl.cAs.uparm.hBs.vidattr.cCs.vidputs.cDs.vsprintf.cEs.vsscanf.cFs.wattroff.cGs.wattron.cHs.wattrset.cIs.wnoutrfrsh.cJs.wprintw.cKs.wrefresh.cLs.writechars.cMs.wscanw.cNs.wstandend.cOs.wstandout.cPcurshdr.hQcurses.extRuparm.hSlibcurses.a.maTlibcurses.ah49274 s 00001/00001/00102 d D 3.5 87/03/04 21:41:36 build 7 6 c fixed redefinition of cflags. -mkm e s 00002/00001/00101 d D 3.4 87/02/24 22:02:50 build 6 5 c added -rm -f to install section. -mkm e s 00013/00007/00089 d D 3.3 87/02/06 00:57:34 build 5 4 c rennovated with template makefile. -mkm e s 00074/00074/00022 d D 3.2 87/02/03 13:25:44 mkm 4 3 c added dependancies. -mkm e s 00000/00000/00096 d D 3.1 87/01/20 18:47:48 mkm 3 2 c e s 00000/00000/00096 d D 2.1 87/01/20 18:38:32 mkm 2 1 c e s 00096/00000/00000 d D 1.1 87/01/20 18:30:16 mkm 1 0 c Placed under source control - mkm e u U f b f n t T I 1 # " %W% %E% " D 4 include /src.cmd/v10/Spix900/usr/include/makenviron.h E 4 # # lib/curses # D 4 CFLAGS = -O -I$(SPX)/usr/include -DVIDEO -DKEYPAD -c E 4 I 4 D 7 CFLAGS = -O -I$(INC) -DVIDEO -DKEYPAD -c E 7 I 7 DFLAGS = -DVIDEO -DKEYPAD E 7 I 5 E 5 E 4 L = libcurses.a D 4 COMPILE = $(CC) $(CFLAGS) $< LINK = $(LD) -r $*.o E 4 I 5 DESTDIR = $(SMX)/usr/lib E 5 D 4 .c.a: $(COMPILE) $(LINK) mv a.out $*.o ar r libcurses.a $*.o rm $*.o E 4 I 4 OBJ1= $(L)(__cflush.o) $(L)(__sscans.o) $(L)(_blanks.o) $(L)(_c_clean.o) \ $(L)(_clearhl.o) $(L)(_clearline.o) $(L)(_comphash.o) $(L)(_delay.o) \ $(L)(_delchars.o) $(L)(_dellines.o) $(L)(_dumpwin.o) $(L)(_ec_quit.o) \ $(L)(_fixdelay.o) $(L)(_forcehl.o) $(L)(_hlmode.o) $(L)(_id_char.o) \ $(L)(_init_cost.o) $(L)(_inschars.o) $(L)(_insmode.o) $(L)(_kpmode.o) \ $(L)(_line_free.o) $(L)(_ll_move.o) $(L)(_outch.o) $(L)(_outchar.o) \ $(L)(_pos.o) $(L)(_reset.o) $(L)(_scrdown.o) $(L)(_scrollf.o) \ $(L)(_sethl.o) $(L)(_setmode.o) $(L)(_setwind.o) $(L)(_shove.o) \ $(L)(_sprintw.o) $(L)(_sputc.o) $(L)(_syncmodes.o) $(L)(_tscroll.o) \ $(L)(_window.o) $(L)(addch.o) $(L)(addstr.o) $(L)(baudrate.o) \ $(L)(beep.o) $(L)(box.o) $(L)(capnames.o) $(L)(cbreak.o) \ $(L)(chktypeahd.o) $(L)(clear.o) $(L)(clearok.o) $(L)(clreolinln.o) \ $(L)(clrtobot.o) $(L)(clrtoeol.o) $(L)(cntcostfn.o) $(L)(crmode.o) \ $(L)(curses.o) $(L)(def_prog.o) $(L)(def_shell.o) $(L)(delayoutpt.o) \ $(L)(delch.o) $(L)(deleteln.o) $(L)(delwin.o) $(L)(doprnt.o) \ $(L)(doscan.o) $(L)(doupdate.o) $(L)(draino.o) $(L)(echo.o) \ $(L)(endwin.o) $(L)(erase.o) $(L)(erasechar.o) $(L)(fixterm.o) \ $(L)(flash.o) $(L)(flushinp.o) $(L)(getch.o) $(L)(getstr.o) \ $(L)(idlok.o) $(L)(gettmode.o) $(L)(has_ic.o) $(L)(has_il.o) \ $(L)(idln.getst.o) $(L)(initkeypad.o) $(L)(initscr.o) $(L)(insch.o) \ $(L)(insertln.o) $(L)(intrflush.o) $(L)(keypad.o) $(L)(killchar.o) \ $(L)(leaveok.o) $(L)(libcurs.o) E 4 D 4 OBJ1= $L(__cflush.o) $L(__sscans.o) $L(_blanks.o) $L(_c_clean.o) \ $L(_clearhl.o) $L(_clearline.o) $L(_comphash.o) $L(_delay.o) \ $L(_delchars.o) $L(_dellines.o) $L(_dumpwin.o) $L(_ec_quit.o) \ $L(_fixdelay.o) $L(_forcehl.o) $L(_hlmode.o) $L(_id_char.o) \ $L(_init_cost.o) $L(_inschars.o) $L(_insmode.o) $L(_kpmode.o) \ $L(_line_free.o) $L(_ll_move.o) $L(_outch.o) $L(_outchar.o) \ $L(_pos.o) $L(_reset.o) $L(_scrdown.o) $L(_scrollf.o) $L(_sethl.o) \ $L(_setmode.o) $L(_setwind.o) $L(_shove.o) $L(_sprintw.o) \ $L(_sputc.o) $L(_syncmodes.o) $L(_tscroll.o) $L(_window.o) \ $L(addch.o) $L(addstr.o) $L(baudrate.o) $L(beep.o) $L(box.o) \ $L(capnames.o) $L(cbreak.o) $L(chktypeahd.o) $L(clear.o) \ $L(clearok.o) $L(clreolinln.o) $L(clrtobot.o) $L(clrtoeol.o) \ $L(cntcostfn.o) $L(crmode.o) $L(curses.o) $L(def_prog.o) \ $L(def_shell.o) $L(delayoutpt.o) $L(delch.o) $L(deleteln.o) \ $L(delwin.o) $L(doprnt.o) $L(doscan.o) $L(doupdate.o) $L(draino.o) \ $L(echo.o) $L(endwin.o) $L(erase.o) $L(erasechar.o) $L(fixterm.o) \ $L(flash.o) $L(flushinp.o) $L(getch.o) $L(getstr.o) $L(idlok.o) \ $L(gettmode.o) $L(has_ic.o) $L(has_il.o) $L(idln.getst.o) \ $L(initkeypad.o) $L(initscr.o) $L(insch.o) $L(insertln.o) \ $L(intrflush.o) $L(keypad.o) $L(killchar.o) $L(leaveok.o) $L(libcurs.o) E 4 I 4 OBJ2= $(L)(line_alloc.o) $(L)(ll_refresh.o) $(L)(longname.o) $(L)(m_addch.o) \ $(L)(m_addstr.o) $(L)(m_clear.o) $(L)(m_erase.o) $(L)(m_move.o) \ $(L)(meta.o) $(L)(m_refresh.o) $(L)(m_tstp.o) $(L)(makenew.o) \ $(L)(miniinit.o) $(L)(move.o) $(L)(mvcur.o) $(L)(mvprintw.o) \ $(L)(mvscanw.o) $(L)(mvwin.o) $(L)(mvwprintw.o) $(L)(mvwscanw.o) \ $(L)(naps.o) $(L)(newpad.o) $(L)(newterm.o) $(L)(newwin.o) $(L)(nl.o) \ $(L)(nocbreak.o) $(L)(nocrmode.o) $(L)(nodelay.o) $(L)(noecho.o) \ $(L)(nonl.o) $(L)(noraw.o) $(L)(nttychktrm.o) $(L)(overlay.o) \ $(L)(overwrite.o) $(L)(pnoutrfrsh.o) $(L)(prefresh.o) $(L)(printw.o) \ $(L)(putp.o) $(L)(raw.o) $(L)(reset_prog.o) $(L)(resetshell.o) \ $(L)(resetterm.o) $(L)(resetty.o) $(L)(restarttrm.o) $(L)(saveterm.o) \ $(L)(savetty.o) $(L)(scanw.o) $(L)(scroll.o) $(L)(scrollok.o) \ $(L)(select.o) $(L)(set_term.o) $(L)(setbuffred.o) $(L)(setterm.o) \ $(L)(setupterm.o) $(L)(showstring.o) $(L)(subwin.o) $(L)(tgetent.o) \ $(L)(tgetflag.o) $(L)(tgetnum.o) $(L)(tgetstr.o) $(L)(tgoto.o) \ $(L)(touchwin.o) $(L)(tparm.o) $(L)(tputs.o) $(L)(traceonoff.o) \ $(L)(tstp.o) $(L)(typeahead.o) $(L)(unctrl.o) $(L)(vidattr.o) \ $(L)(vidputs.o) $(L)(vsprintf.o) $(L)(vsscanf.o) $(L)(wattroff.o) \ $(L)(wattron.o) $(L)(wattrset.o) $(L)(wnoutrfrsh.o) $(L)(wprintw.o) \ $(L)(wrefresh.o) $(L)(writechars.o) $(L)(wscanw.o) $(L)(wstandend.o) \ $(L)(wstandout.o) E 4 D 4 OBJ2= $L(line_alloc.o) $L(ll_refresh.o) $L(longname.o) $L(m_addch.o) \ $L(m_addstr.o) $L(m_clear.o) $L(m_erase.o) $L(m_move.o) $L(meta.o) \ $L(m_refresh.o) $L(m_tstp.o) $L(makenew.o) $L(miniinit.o) \ $L(move.o) $L(mvcur.o) $L(mvprintw.o) $L(mvscanw.o) $L(mvwin.o) \ $L(mvwprintw.o) $L(mvwscanw.o) $L(naps.o) $L(newpad.o) \ $L(newterm.o) $L(newwin.o) $L(nl.o) $L(nocbreak.o) $L(nocrmode.o) \ $L(nodelay.o) $L(noecho.o) $L(nonl.o) $L(noraw.o) $L(nttychktrm.o) \ $L(overlay.o) $L(overwrite.o) $L(pnoutrfrsh.o) $L(prefresh.o) \ $L(printw.o) $L(putp.o) $L(raw.o) $L(reset_prog.o) $L(resetshell.o) \ $L(resetterm.o) $L(resetty.o) $L(restarttrm.o) $L(saveterm.o) \ $L(savetty.o) $L(scanw.o) $L(scroll.o) $L(scrollok.o) $L(select.o) \ $L(set_term.o) $L(setbuffred.o) $L(setterm.o) $L(setupterm.o) \ $L(showstring.o) $L(subwin.o) $L(tgetent.o) $L(tgetflag.o) \ $L(tgetnum.o) $L(tgetstr.o) $L(tgoto.o) $L(touchwin.o) $L(tparm.o) \ $L(tputs.o) $L(traceonoff.o) $L(tstp.o) \ $L(typeahead.o) $L(unctrl.o) $L(vidattr.o) $L(vidputs.o) \ $L(vsprintf.o) $L(vsscanf.o) $L(wattroff.o) $L(wattron.o) \ $L(wattrset.o) $L(wnoutrfrsh.o) $L(wprintw.o) $L(wrefresh.o) \ $L(writechars.o) $L(wscanw.o) $L(wstandend.o) $L(wstandout.o) E 4 I 4 all: $(L) E 4 D 4 O_LIV= usr/lib/libcurses.a all: libcurses.a libcurses.a:: $(OBJ1) $(OBJ2) E 4 I 4 $(L): $(OBJ1) $(OBJ2) E 4 D 5 chmod 664 $@ rm -f $(SPX)/usr/lib/libcurses.a ln $@ $(SPX)/usr/lib/libcurses.a E 5 I 5 $(NM) -xv $(L) > $(L).map E 5 D 4 O_UF= bcurses S_UF= scurses O_D= id_uf/$(O_UF).d S_LIV= Makefile *.[cysh]* $(S_UF).d FILED= $(SPX)/id_uf/$(O_UF).d\ $(SPX)/id_uf/$(S_UF).d $(SPX)/id_uf/$(O_UF).d: $(O_UF).d rm -f $@; ln $(O_UF).d $@ $(SPX)/id_uf/$(S_UF).d: $(S_UF).d rm -f $@; ln $(S_UF).d $@ E 4 install: D 5 cd $(SPX); ls $(O_LIV) | cpio -pmdlv $(DESTDIR) cd $(DESTDIR); chown bin $(O_LIV) ; chgrp bin $(O_LIV) E 5 I 5 D 6 $(INS) $(L) $(DESTDIR) E 6 I 6 -rm -f $(DESTDIR)/$(L) $(INS) $(L) $(DESTDIR)/$(L) E 6 chmod 644 $(DESTDIR)/$(L) chgrp bin $(DESTDIR)/$(L) chown bin $(DESTDIR)/$(L) E 5 clean: D 5 rm -f core libcurses.a cd $(SPX); rm -f $(O_LIV) E 5 I 5 -rm -f *.o -rm -f core errs clobber: clean -rm -f $(L) $(L).map curses.ext curshdr.h uparm.h E 5 D 4 livr: $(FILED) cd $(SPX); chown bin $(O_LIV) ; chgrp bin $(O_LIV) ls $(S_LIV) | cpio -omv >$(LIVR)/urt/ep/uf/$(S_UF) cd $(SPX); ls $(O_LIV) $(O_LNK) $(O_D) |cpio -omv >$(LIVR)/urt/ep/uf/$(O_UF) E 4 I 4 curses.ext: s.curses.ext curshdr.h $(GET) $(GFLAGS) s.curses.ext $(OBJ1) $(OBJ2) : curses.ext $(L)(_delay.o) $(L)(doprnt.o) $(L)(doscan.o) $(L)(mkti4.o) $(L)(ti4.o) \ $(L)(tputs.o): $(INC)/ctype.h $(L)(naps.o): $(INC)/setjmp.h $(L)(delayoutpt.o) $(L)(draino.o) $(L)(naps.o) $(L)(select.o): $(INC)/signal.h $(L)(_outchar.o) $(L)(doprnt.o) $(L)(doscan.o) $(L)(mkti4.o) \ $(L)(mkti4.o) $(L)(putp.o) $(L)(ti4.o) $(L)(tparm.o) \ $(L)(vidattr.o) $(L)(vsprintf.o) $(L)(vsscanf.o): $(INC)/stdio.h $(L)(doprnt.o) $(L)(doscan.o): $(INC)/values.h $(L)(doprnt.o) $(L)(doscan.o) $(L)(vsprintf.o) $(L)(vsscanf.o): $(INC)/varargs.h $(L)(_delay.o) $(L)(def_prog.o) $(L)(def_shell.o) $(L)(deleteln.o) \ $(L)(mkti4.o) $(L)(ti4.o) $(L)(tparm.o) $(L)(tputs.o): $(INC)/curses.h $(L)(_delay.o) $(L)(def_prog.o) $(L)(def_shell.o) $(L)(mkti4.o) $(L)(ti4.o) \ $(L)(tparm.o) $(L)(tputs.o): $(INC)/term.h $(L)(fixterm.o) $(L)(reset_prog.o) $(L)(resetshell.o) $(L)(resetterm.o) \ $(L)(restarttrm.o) $(L)(saveterm.o) $(L)(setupterm.o): uparm.h E 4 E 1 h30993 s 00000/00000/00061 d D 3.1 87/01/20 18:47:50 mkm 3 2 c e s 00000/00000/00061 d D 2.1 87/01/20 18:38:34 mkm 2 1 c e s 00061/00000/00000 d D 1.1 87/01/20 18:30:17 mkm 1 0 c Placed under source control - mkm e u U f b f n t T I 1 Curses/Terminfo distribution THIS CODE IS PROPRIETARY TO BELL LABS. DO NOT GIVE IT TO ANYONE ELSE. You have a distribution of curses and terminfo. This is the second internal distribution of curses. To find the version, look in screen/curses.c for a version number. To report bugs, if at all possible, demonstrate the bug in the form of a "show script", that is, a 2 page (often 48 line) file which will cause the show program to mess up. If a simple modification to show will illustrate the bug, this is second choice. Otherwise, please write a small program that illustrates the bug. Huge programs that "don't work" are unlikely to get much sympathy. To install curses, be guided by the makefiles. You can use the makefile in this directory. Do a "make all install". Do not do "make clean" until the install completes. This will not install any manual pages or demos - they are up to you to install by hand if you want them. If you are on a 16 bit machine, it will be necessary to add the -i option to ../screen/makefile's compilation of tic. (This has already been done for the PDP-11). Otherwise, tic will dump core when trying to compile some terminals. If you are on a small 11 without separate I/D, you'll have to compile only those entries that don't use lots of use= indirection: what's happening is that 3 or 4 levels of use= recursion runs out of memory on the stack. Now you can run programs using curses. A sample program included in the screen directory is show.c, say "make show" and it will compile. "show" is a paging program - you hit space to go on to the next page. You can use show to make sure everything works. (Be sure you have TERM set in your environment. TERMCAP is no longer necessary.) A fancier demo can be found in the demo directory. If you add or change terminfo descriptions in the terminfo directory, you can run compile on the single source file, instead of on terminfo.src. Since the compiler is so slow, it's worthwhile to only run it on one source file. If you add capabilities you should edit screen/caps. Be sure to add the capabilties at the END of the section (bools, nums, or strings) as this will preserve compatibility with older binaries. Then run "make term.h", "make clean", and recompile the library. For debugging, the makefile will create several other versions of curses. In addition to the .c (source) and .o (object) files, there are .p's for profiling, .d's for debugging, and .t's for tracing. These will create dlibcurses.a, plibcurses.a, and tlibcurses.a. The d version defines DEBUG and uses the -g flag for sdb. DEBUG causes the file "trace" to be created in the current directory when you run a program with curses. This can be installed as -lcurses if you wish. The t version defines DEBUG for tracing, but doesn't use -g, so it's faster to compile, but won't help much if core dumps. A recent addition is screen/termcap.c (made from screen/termcap.form and screen/caps) which emulates the older termcap library. This is intended only as a conversion aid, but it is complete enough to enable vi 3.7 (the last termcap version) to run using terminfo. E 1 h40366 s 00001/00001/00014 d D 3.2 87/05/13 18:27:52 build 4 3 c removed old SCCS strings and inserted #ident BB e s 00000/00000/00015 d D 3.1 87/01/20 18:47:53 mkm 3 2 c e s 00000/00000/00015 d D 2.1 87/01/20 18:38:36 mkm 2 1 c e s 00015/00000/00000 d D 1.1 87/01/20 18:30:18 mkm 1 0 c Placed under source control - mkm e u U f b f n t T I 1 D 4 /* " %W% %E% " */ E 4 I 4 #ident " %W% %E% " E 4 /* * This routine is one of the main things * in this level of curses that depends on the outside * environment. */ #include "curses.ext" /* * Flush stdout. */ __cflush() { fflush(SP->term_file); } E 1 h63753 s 00001/00001/00027 d D 3.2 87/05/13 18:28:04 build 4 3 c removed old SCCS strings and inserted #ident BB e s 00000/00000/00028 d D 3.1 87/01/20 18:47:57 mkm 3 2 c e s 00000/00000/00028 d D 2.1 87/01/20 18:38:37 mkm 2 1 c e s 00028/00000/00000 d D 1.1 87/01/20 18:30:18 mkm 1 0 c Placed under source control - mkm e u U f b f n t T I 1 D 4 /* " %W% %E% " */ E 4 I 4 #ident " %W% %E% " E 4 /* */ # include "curses.ext" # include /* * This routine actually executes the scanf from the window. * * This code calls vsscanf, which is like sscanf except * that it takes a va_list as an argument pointer instead * of the argument list itself. We provide one until * such a routine becomes available. */ __sscans(win, fmt, ap) WINDOW *win; char *fmt; va_list ap; { char buf[256]; if (wgetstr(win, buf) == ERR) return ERR; return vsscanf(buf, fmt, ap); } E 1 h15618 s 00001/00001/00064 d D 3.2 87/05/13 18:28:18 build 4 3 c removed old SCCS strings and inserted #ident BB e s 00000/00000/00065 d D 3.1 87/01/20 18:47:59 mkm 3 2 c e s 00000/00000/00065 d D 2.1 87/01/20 18:38:38 mkm 2 1 c e s 00065/00000/00000 d D 1.1 87/01/20 18:30:20 mkm 1 0 c Placed under source control - mkm e u U f b f n t T I 1 D 4 /* " %W% %E% " */ E 4 I 4 #ident " %W% %E% " E 4 #include "curses.ext" extern int _outch(); extern int _sethl(); extern int _setmode(); extern char *tparm(); extern int tputs(); /* * Output n blanks, or the equivalent. This is done to erase text, and * also to insert blanks. The semantics of this call do not define where * it leaves the cursor - it might be where it was before, or it might * be at the end of the blanks. We will, of course, leave SP->phys_x * properly updated. */ _blanks (n) { #ifdef DEBUG if(outf) fprintf(outf, "_blanks(%d).\n", n); #endif if (n == 0) return; _setmode (); _sethl (); if (SP->virt_irm==1 && parm_ich) { if (n == 1) tputs(insert_character, 1, _outch); else tputs(tparm(parm_ich, n), n, _outch); return; } if (erase_chars && SP->phys_irm != 1 && n > 5) { tputs(tparm(erase_chars, n), n, _outch); return; } if (repeat_char && SP->phys_irm != 1 && n > 5) { tputs(tparm(repeat_char, ' ', n), n, _outch); SP->phys_x += n; return; } while (--n >= 0) { if (SP->phys_irm == 1 && insert_character) tputs (insert_character, columns - SP->phys_x, _outch); if (++SP->phys_x >= columns && auto_right_margin) { if (SP->phys_y >= lines-1) { /* * We attempted to put something in the last * position of the last line. Since this will * cause a scroll (we only get here if the * terminal has auto_right_margin) we refuse * to put it out. */ SP->phys_x--; return; } SP->phys_x = 0; SP->phys_y++; } _outch (' '); if (SP->phys_irm == 1 && insert_padding) tputs (insert_padding, 1, _outch); } } E 1 h46351 s 00001/00001/00018 d D 3.2 87/05/13 18:28:29 build 4 3 c removed old SCCS strings and inserted #ident BB e s 00000/00000/00019 d D 3.1 87/01/20 18:48:01 mkm 3 2 c e s 00000/00000/00019 d D 2.1 87/01/20 18:38:40 mkm 2 1 c e s 00019/00000/00000 d D 1.1 87/01/20 18:30:22 mkm 1 0 c Placed under source control - mkm e u U f b f n t T I 1 D 4 /* " %W% %E% " */ E 4 I 4 #ident " %W% %E% " E 4 #include "curses.ext" extern int _outch(); _c_clean () { #ifdef DEBUG if(outf) fprintf(outf, "_c_clean().\n"); #endif _hlmode (0); _kpmode(0); SP->virt_irm = 0; _window(0, lines-1, 0, columns-1); _syncmodes(); tputs(exit_ca_mode, 0, _outch); tputs(cursor_normal, 0, _outch); } E 1 h39741 s 00001/00001/00015 d D 3.2 87/05/13 18:28:41 build 4 3 c removed old SCCS strings and inserted #ident BB e s 00000/00000/00016 d D 3.1 87/01/20 18:48:02 mkm 3 2 c e s 00000/00000/00016 d D 2.1 87/01/20 18:38:41 mkm 2 1 c e s 00016/00000/00000 d D 1.1 87/01/20 18:30:22 mkm 1 0 c Placed under source control - mkm e u U f b f n t T I 1 D 4 /* " %W% %E% " */ E 4 I 4 #ident " %W% %E% " E 4 #include "curses.ext" _clearhl () { #ifdef DEBUG if(outf) fprintf(outf, "_clearhl().\n"); #endif if (SP->phys_gr) { register oldes = SP->virt_gr; SP->virt_gr = 0; _sethl (); SP->virt_gr = oldes; } } E 1 h41664 s 00001/00001/00012 d D 3.2 87/05/13 18:28:52 build 4 3 c removed old SCCS strings and inserted #ident BB e s 00000/00000/00013 d D 3.1 87/01/20 18:48:04 mkm 3 2 c e s 00000/00000/00013 d D 2.1 87/01/20 18:38:42 mkm 2 1 c e s 00013/00000/00000 d D 1.1 87/01/20 18:30:24 mkm 1 0 c Placed under source control - mkm e u U f b f n t T I 1 D 4 /* " %W% %E% " */ E 4 I 4 #ident " %W% %E% " E 4 #include "curses.ext" /* * '_clearline' positions the cursor at the beginning of the * indicated line and clears the line (in the image) */ _clearline (row) { _ll_move (row, 0); SP->std_body[row+1] -> length = 0; } E 1 h50924 s 00001/00001/00027 d D 3.2 87/05/13 18:29:04 build 4 3 c removed old SCCS strings and inserted #ident BB e s 00000/00000/00028 d D 3.1 87/01/20 18:48:05 mkm 3 2 c e s 00000/00000/00028 d D 2.1 87/01/20 18:38:44 mkm 2 1 c e s 00028/00000/00000 d D 1.1 87/01/20 18:30:25 mkm 1 0 c Placed under source control - mkm e u U f b f n t T I 1 D 4 /* " %W% %E% " */ E 4 I 4 #ident " %W% %E% " E 4 #include "curses.ext" _comphash (p) register struct line *p; { register chtype *c, *l; register int rc; if (p == NULL) return; if (p -> hash) return; rc = 1; c = p -> body; l = &p -> body[p -> length]; while (--l > c && *l == ' ') ; while (c <= l && *c == ' ') c++; p -> bodylen = l - c + 1; while (c <= l) rc = (rc<<1) + *c++; p -> hash = rc; if (p->hash == 0) p->hash = 123; } E 1 h08025 s 00001/00001/00058 d D 3.2 87/05/13 18:29:18 build 4 3 c removed old SCCS strings and inserted #ident BB e s 00000/00000/00059 d D 3.1 87/01/20 18:48:06 mkm 3 2 c e s 00000/00000/00059 d D 2.1 87/01/20 18:38:45 mkm 2 1 c e s 00059/00000/00000 d D 1.1 87/01/20 18:30:26 mkm 1 0 c Placed under source control - mkm e u U f b f n t T I 1 D 4 /* " %W% %E% " */ E 4 I 4 #ident " %W% %E% " E 4 /* Copyright (c) 1979 Regents of the University of California */ #include #include "curses.h" #include "term.h" #ifdef NONSTANDARD # include "ns_curses.h" #endif /* * The following array gives the number of tens of milliseconds per * character for each speed as returned by gtty. Thus since 300 * baud returns a 7, there are 33.3 milliseconds per char at 300 baud. */ static short tmspc10[] = { /* 0 50 75 110 134.5 150 200 300 baud */ 0, 2000, 1333, 909, 743, 666, 500, 333, /* 600 1200 1800 2400 4800 9600 19200 38400 baud */ 166, 83, 55, 41, 20, 10, 5, 2 }; /* * Insert a delay into the output stream for "delay/10" milliseconds. * Round up by a half a character frame, and then do the delay. * Too bad there are no user program accessible programmed delays. * Transmitting pad characters slows many terminals down and also * loads the system. */ _delay(delay, outc) register int delay; int (*outc)(); { register int mspc10; register int pc; register int outspeed; #ifndef NONSTANDARD # ifdef USG outspeed = cur_term->Nttyb.c_cflag&CBAUD; # else outspeed = cur_term->Nttyb.sg_ospeed; # endif #else NONSTANDARD outspeed = outputspeed(cur_term); #endif NONSTANDARD if (outspeed <= 0 || outspeed >= (sizeof tmspc10 / sizeof tmspc10[0])) return ERR; mspc10 = tmspc10[outspeed]; delay += mspc10 / 2; if (pad_char) pc = *pad_char; else pc = 0; for (delay /= mspc10; delay > 0; delay--) (*outc)(pc); return OK; } E 1 h17541 s 00001/00001/00039 d D 3.2 87/05/13 18:29:30 build 4 3 c removed old SCCS strings and inserted #ident BB e s 00000/00000/00040 d D 3.1 87/01/20 18:48:08 mkm 3 2 c e s 00000/00000/00040 d D 2.1 87/01/20 18:38:46 mkm 2 1 c e s 00040/00000/00000 d D 1.1 87/01/20 18:30:27 mkm 1 0 c Placed under source control - mkm e u U f b f n t T I 1 D 4 /* " %W% %E% " */ E 4 I 4 #ident " %W% %E% " E 4 #include "curses.ext" extern int _outch(); /* * Delete n characters. */ _delchars (n) { #ifdef DEBUG if(outf) fprintf(outf, "_delchars(%d).\n", n); #endif if (enter_delete_mode) { if (strcmp(enter_delete_mode, enter_insert_mode) == 0) { if (SP->phys_irm == 0) { tputs(enter_delete_mode,1,_outch); SP->phys_irm = 1; } } else { if (SP->phys_irm == 1) { tputs(exit_insert_mode,1,_outch); SP->phys_irm = 0; } tputs(enter_delete_mode,1,_outch); } } while (--n >= 0) { /* Only one line can be affected by our delete char */ tputs(delete_character, 1, _outch); } if (exit_delete_mode) { if (strcmp(exit_delete_mode, exit_insert_mode) == 0) SP->phys_irm = 0; else tputs(exit_delete_mode, 1, _outch); } } E 1 h27525 s 00001/00001/00056 d D 3.2 87/05/13 18:29:44 build 4 3 c removed old SCCS strings and inserted #ident BB e s 00000/00000/00057 d D 3.1 87/01/20 18:48:09 mkm 3 2 c e s 00000/00000/00057 d D 2.1 87/01/20 18:38:48 mkm 2 1 c e s 00057/00000/00000 d D 1.1 87/01/20 18:30:27 mkm 1 0 c Placed under source control - mkm e u U f b f n t T I 1 D 4 /* " %W% %E% " */ E 4 I 4 #ident " %W% %E% " E 4 #include "curses.ext" char *tparm(); extern int _outch(); _dellines (n) { register int i; #ifdef DEBUG if(outf) fprintf(outf, "_dellines(%d).\n", n); #endif if (lines - SP->phys_y <= n && (clr_eol && n == 1 || clr_eos)) { tputs(clr_eos, n, _outch); } else if (scroll_forward && SP->phys_y == SP->des_top_mgn /* &&costSF 0; i--) { _pos(SP->des_bot_mgn, 0); tputs(scroll_forward, 1, _outch); SP->ml_above++; } if (SP->ml_above + lines > lines_of_memory) SP->ml_above = lines_of_memory - lines; } else if (parm_delete_line && (n>1 || *delete_line==0)) { tputs(tparm(parm_delete_line, n, SP->phys_y), lines-SP->phys_y, _outch); } else if (change_scroll_region && *delete_line==0) { /* vt100: fake delete_line by changing scrolling region */ /* Save since change_scroll_region homes cursor */ tputs(save_cursor, 1, _outch); tputs(tparm(change_scroll_region, SP->phys_y, SP->des_bot_mgn), 1, _outch); /* go to bottom left corner.. */ tputs(tparm(cursor_address, SP->des_bot_mgn, 0), 1, _outch); for (i=0; ides_top_mgn, SP->des_bot_mgn), 1, _outch); tputs(restore_cursor, 1, _outch); /* put SP->curptr back */ SP->phys_top_mgn = SP->des_top_mgn; SP->phys_bot_mgn = SP->des_bot_mgn; } else { for (i = 0; i < n; i++) tputs(delete_line, lines-SP->phys_y, _outch); } } E 1 h12944 s 00001/00001/00041 d D 3.2 87/05/13 18:29:56 build 4 3 c removed old SCCS strings and inserted #ident BB e s 00000/00000/00042 d D 3.1 87/01/20 18:48:11 mkm 3 2 c e s 00000/00000/00042 d D 2.1 87/01/20 18:38:50 mkm 2 1 c e s 00042/00000/00000 d D 1.1 87/01/20 18:30:28 mkm 1 0 c Placed under source control - mkm e u U f b f n t T I 1 D 4 /* " %W% %E% " */ E 4 I 4 #ident " %W% %E% " E 4 /* * make the current screen look like "win" over the area covered by * win. * */ # include "curses.ext" static WINDOW *lwin; #ifdef DEBUG _dumpwin(win) register WINDOW *win; { register int x, y; register chtype *nsp; if (!outf) { return; } if (win == stdscr) fprintf(outf, "_dumpwin(stdscr)--------------\n"); else if (win == curscr) fprintf(outf, "_dumpwin(curscr)--------------\n"); else fprintf(outf, "_dumpwin(%o)----------------\n", win); for (y=0; y_maxy; y++) { if (y > 76) break; nsp = &win->_y[y][0]; fprintf(outf, "%d: ", y); for (x=0; x_maxx; x++) { _sputc(*nsp, outf); nsp++; } fprintf(outf, "\n"); } fprintf(outf, "end of _dumpwin----------------------\n"); } #endif E 1 h51259 s 00001/00001/00019 d D 3.2 87/05/13 18:30:08 build 4 3 c removed old SCCS strings and inserted #ident BB e s 00000/00000/00020 d D 3.1 87/01/20 18:48:12 mkm 3 2 c e s 00000/00000/00020 d D 2.1 87/01/20 18:38:52 mkm 2 1 c e s 00020/00000/00000 d D 1.1 87/01/20 18:30:30 mkm 1 0 c Placed under source control - mkm e u U f b f n t T I 1 D 4 /* " %W% %E% " */ E 4 I 4 #ident " %W% %E% " E 4 #include "curses.ext" #ifndef NONSTANDARD /* * Emergency quit. Called at startup only if something wrong in * initializing termcap. */ _ec_quit(msg, parm) char *msg, *parm; { #ifdef DEBUG if(outf) fprintf(outf, "_ec_quit(%s,%s).\n", msg, parm); #endif reset_shell_mode(); fprintf(stderr, msg, parm); exit(1); } #endif NONSTANDARD E 1 h02273 s 00001/00001/00033 d D 3.2 87/05/13 18:30:21 build 4 3 c removed old SCCS strings and inserted #ident BB e s 00000/00000/00034 d D 3.1 87/01/20 18:48:13 mkm 3 2 c e s 00000/00000/00034 d D 2.1 87/01/20 18:38:53 mkm 2 1 c e s 00034/00000/00000 d D 1.1 87/01/20 18:30:32 mkm 1 0 c Placed under source control - mkm e u U f b f n t T I 1 D 4 /* " %W% %E% " */ E 4 I 4 #ident " %W% %E% " E 4 #include "curses.ext" /* * The use has just changed his notion of whether we want nodelay mode. * Do any system dependent processing. */ /* ARGSUSED */ _fixdelay(old, new) bool old, new; { #ifdef USG # include int fl, rv, fd; extern int errno; FILE *inf; inf = SP -> term_file; if( inf == stdout ) { inf = stdin; } fd = fileno( inf ); fl = fcntl(fd, F_GETFL, 0); if (new) fl |= O_NDELAY; else fl &= ~O_NDELAY; if (old != new) rv = fcntl(fd, F_SETFL, fl); #else /* No system dependent processing on the V7 or Berkeley systems. */ #endif } E 1 h43031 s 00001/00001/00015 d D 3.2 87/05/13 18:30:33 build 4 3 c removed old SCCS strings and inserted #ident BB e s 00000/00000/00016 d D 3.1 87/01/20 18:48:14 mkm 3 2 c e s 00000/00000/00016 d D 2.1 87/01/20 18:38:54 mkm 2 1 c e s 00016/00000/00000 d D 1.1 87/01/20 18:30:33 mkm 1 0 c Placed under source control - mkm e u U f b f n t T I 1 D 4 /* " %W% %E% " */ E 4 I 4 #ident " %W% %E% " E 4 #include "curses.ext" /* * Output the string to get us in the right highlight mode, * no matter what mode we are currently in. */ _forcehl() { #ifdef DEBUG if(outf) fprintf(outf, "_forcehl().\n"); #endif SP->phys_gr = -1; _sethl(); } E 1 h33386 s 00001/00001/00010 d D 3.2 87/05/13 18:30:43 build 4 3 c removed old SCCS strings and inserted #ident BB e s 00000/00000/00011 d D 3.1 87/01/20 18:48:15 mkm 3 2 c e s 00000/00000/00011 d D 2.1 87/01/20 18:38:55 mkm 2 1 c e s 00011/00000/00000 d D 1.1 87/01/20 18:30:34 mkm 1 0 c Placed under source control - mkm e u U f b f n t T I 1 D 4 /* " %W% %E% " */ E 4 I 4 #ident " %W% %E% " E 4 #include "curses.ext" _hlmode (on) { #ifdef DEBUG if(outf) fprintf(outf, "_hlmode(%o).\n", on); #endif SP->virt_gr = on; } E 1 h18907 s 00001/00001/00507 d D 3.2 87/05/13 18:31:01 build 4 3 c removed old SCCS strings and inserted #ident BB e s 00000/00000/00508 d D 3.1 87/01/20 18:48:17 mkm 3 2 c e s 00000/00000/00508 d D 2.1 87/01/20 18:38:57 mkm 2 1 c e s 00508/00000/00000 d D 1.1 87/01/20 18:30:35 mkm 1 0 c Placed under source control - mkm e u U f b f n t T I 1 D 4 /* " %W% %E% " */ E 4 I 4 #ident " %W% %E% " E 4 /* * Modify current screen line 'old' to match desired line 'new'. * The old line is at position ln. Each line is divided into 4 regions: * * nlws, olws - amount of leading white space on new/old line * com_head - length of common head * nchanged, ochanged - length of the parts changed * com_tail - length of a common tail */ #include "curses.ext" #define min(a,b) (alength); for (j=0; jlength; j++) { n = old->body[j]; if (n & A_ATTRIBUTES) putc('\'', outf); n &= 0177; if(outf) fprintf(outf, "%c", n>=' ' ? n : '.'); } if(outf) fprintf(outf, "\n"); } if(outf) fprintf(outf, "new: "); if(outf) fprintf(outf, "%8x: ", new); if (new == NULL) { if(outf) fprintf(outf, "()\n"); } else { if(outf) fprintf(outf, "%4d ", new->length); for (j=0; jlength; j++) { n = new->body[j]; if (n & A_ATTRIBUTES) putc('\'', outf); n &= 0177; if(outf) fprintf(outf, "%c", n>=' ' ? n : '.'); } if(outf) fprintf(outf, "\n"); } #endif DEBUG if (old == new) { return; } /* Start at the ends of the lines */ if( old ) { oc_beg = old -> body; oc_end = &old -> body[old -> length]; } else { oc_beg = nullline; oc_end = oc_beg; } if( new ) { nc_beg = new -> body; nc_end = &new -> body[new -> length]; } else { nc_beg = nullline; nc_end = nc_beg; } /* Find leading and trailing blanks */ olws = nlws = com_head = com_tail = 0; while (*--oc_end == ' ' && oc_end >= oc_beg) ; while (*--nc_end == ' ' && nc_end >= nc_beg) ; samelen = (nc_end-nc_beg) == (oc_end-oc_beg) ; while( *oc_beg == ' ' && oc_beg <= oc_end ) { oc_beg++; olws++; } while( *nc_beg == ' ' && nc_beg <= nc_end ) { nc_beg++; nlws++; } /* * Now find common heads and tails (com_head & com_tail). If the * lengths are the same, the change was probably at the beginning, * so count common tail first. This only matters if it could match * both ways, for example, when changing * " ####" * to * "#### ####" */ if( samelen ) { while( *oc_end==*nc_end && oc_beg<=oc_end && nc_beg<=nc_end ) { oc_end--; nc_end--; com_tail++; } while( *oc_beg==*nc_beg && oc_beg<=oc_end && nc_beg<=nc_end ) { oc_beg++; nc_beg++; com_head++; } } else { while( *oc_beg==*nc_beg && oc_beg<=oc_end && nc_beg<=nc_end ) { oc_beg++; nc_beg++; com_head++; } while( *oc_end==*nc_end && oc_beg<=oc_end && nc_beg<=nc_end ) { oc_end--; nc_end--; com_tail++; } } ochanged = oc_end - oc_beg + 1; nchanged = nc_end - nc_beg + 1; /* Optimization: lines are identical, so return now */ if( ochanged==0 && nchanged==0 && nlws==olws ) { #ifdef DEBUG if(outf) fprintf(outf, "identical lines, returning early\n"); #endif return; } #ifdef DEBUG if(outf) fprintf (outf, "Before costs: nlws=%2d olws=%2d\ com_head=%2d nchanged=%2d ochanged=%2d com_tail=%2d, icfixed %d,\ icvar %d/32\n", nlws, olws, com_head, nchanged, ochanged, com_tail, SP->term_costs.icfixed, SP->term_costs.icvar); if(outf) fprintf (outf, "samelen %d, *oc_beg %o *nc_beg %o\ *oc_end %o *nc_end %o\n", samelen, *oc_beg, *nc_beg, *oc_end, *nc_end); #endif DEBUG /* Decide whether to use insert/delete character */ #define costic(nchars) (SP->term_costs.icfixed + \ (((nchars)*SP->term_costs.icvar)>>5) ) /* #define costic(nchars) (fprintf(outf,"costic %d, add %g\n", nchars, SP->term_costs.icfixed + (nchars)*SP->term_costs.icvar),(SP->term_costs.icfixed + (nchars)*SP->term_costs.icvar)) */ cw_idc = cwo_idc = nchanged; if( olws > nlws ) /* delete char */ { cw_idc += costic(olws-nlws); } else { if( nlws > olws ) /* insert char */ { cw_idc += costic(nlws-olws); } } if( ochanged > nchanged ) /* delete char */ { cw_idc += costic(ochanged-nchanged); } else { if( nchanged > ochanged ) /* insert char */ { cw_idc += costic(nchanged-ochanged); } } if( olws != nlws ) { cwo_idc += com_head; } if( olws+ochanged != nlws+nchanged ) { cwo_idc += com_tail; } if( cw_idc > cwo_idc ) { /* * It's cheaper to NOT use insert/delete character! * This may be because the gain from saving the common head * and tail is not worth the cost of doing the insert and * delete chars (some terminals are slow at this, or the * tails may be really short) or because the cost is * infinite (i.e. the terminal does not have ins/del char). * We note this fact by forgetting about the common heads * and tails. */ ochanged += com_head+com_tail; nchanged += com_head+com_tail; oc_end += com_tail; nc_end += com_tail; oc_beg -= com_head; nc_beg -= com_head; com_head = 0; com_tail = 0; } /* * On magic cookie terminals, we have to check for the possibility * that there is a cookie that we must overwrite. This is only * necessary because a "go normal" cookie looks like an ordinary * blank but must compare differently. */ if( magic_cookie_glitch >= 0 && com_tail > 0 && nc_end[1] == ' ' && oc_end[0]&A_ATTRIBUTES && oc_end[1] == ' ' ) { #ifdef DEBUG if (outf) fprintf(outf, "adding one because of magic cookie\n"); #endif oc_end++; nc_end++; ochanged++; nchanged++; com_tail--; } #ifdef DEBUG if(outf) fprintf (outf, "After costs: nlws=%2d olws=%2d com_head=%2d nchanged=%2d ochanged=%2d com_tail=%2d, cost w/idc %d, cost wo/idc %d\n", nlws, olws, com_head, nchanged, ochanged, com_tail, cw_idc, cwo_idc); #endif DEBUG /* * Now actually go fix up the line. * There are several cases to consider. * The most important thing to keep in mind is * that deletions need to be done before insertions * to prevent shifting good text off the end of the line. */ if( com_head == 0 && com_tail == 0 ) { /* No common text - must redraw entire line */ if( ochanged == 0 && nchanged == 0 ) { /* Empty lines - do nothing */ _chk_typeahead(); return; } /* If empty old line, pretend leading blanks */ if( ochanged == 0 && !insert_null_glitch ) { olws = nlws; } /* Make sure changed parts start at same column */ j = nlws - olws; if( j > 0 ) { nc_beg -= j; nchanged += j; nlws = olws; } else { if( j < 0 ) { oc_beg += j; ochanged -= j; olws = nlws; } } for(nbl=nms=0,p=oc_beg,q=nc_beg;p<=oc_end && q<=nc_end;p++,q++) { if( *q==' ' && *p != ' ' ) { nbl++; } if( *q == *p ) { nms++; } #ifdef FULLDEBUG if (outf) fprintf(outf, "*p '%c', *q '%c', nms %d, nbl %d\n", *p, *q, nms, nbl); #endif } if( !clr_eol || insert_null_glitch || nms>=nbl ) { _showstring(ln, min(nlws, olws), nc_beg, nc_end, old); if( nlws + nchanged < olws + ochanged ) { _pos(ln, nlws + nchanged); _clreol(); } } else { if( ochanged > 0 ) { _pos(ln, olws); _clreol(); for (p=oc_beg; p<=oc_end; p++) *p = ' '; } _showstring(ln, nlws, nc_beg, nc_end, old); } _chk_typeahead(); return; } if( com_head==0 ) { /* We have only a common tail. */ if( nchanged == 0 && ochanged == 0 ) { _chk_typeahead(); return; } i = (nlws + nchanged) - (olws + ochanged); /* Simplify things - force olws == nlws */ j = nlws - olws; if( j > 0 ) { nc_beg -= j; nchanged += j; nlws = olws; } else { if( j < 0 ) { oc_beg += j; ochanged -= j; olws = nlws; } } if( i >= 0 ) { _showstring(ln, nlws, nc_beg, nc_end-i, old); if( i > 0 ) { _ins_string(ln, nlws+nchanged-i, nc_end-i+1, nc_end); } } else { _showstring(ln, nlws, nc_beg, nc_end, old); _delchars(-i); } _chk_typeahead(); return; } /* At this point, we know there is a common head (com_head != 0) */ if( nlws < olws ) { /* Do the leading delete chars right away */ _pos(ln, 0); _delchars(diff = olws - nlws); olws = nlws; len = old->length; for( i=0; ibody[i] = old->body[i]+diff; } } if (com_tail == 0) { if( nchanged == 0 && ochanged == 0 ) { if( nlws > olws ) { _ins_blanks(ln, 0, nlws - olws); } _chk_typeahead(); return; } _showstring(ln, olws+com_head, nc_beg, nc_end, old); if( nchanged < ochanged ) { _pos(ln, olws + com_head + nchanged); _clreol(); } if( nlws > olws ) { _ins_blanks(ln, 0, nlws - olws); } } else { if( nchanged > 0 && ochanged > 0 ) { i = min(nchanged, ochanged); _showstring(ln, olws+com_head, nc_beg, nc_beg+i-1, old); } if( nchanged < ochanged ) { _pos(ln, nlws + com_head + nchanged); _delchars(ochanged - nchanged); } else { if( nchanged > ochanged ) { _ins_string(ln, olws+com_head+ochanged, nc_beg + ochanged, nc_end); } } if( nlws > olws ) { _ins_blanks(ln, 0, nlws-olws); } } _chk_typeahead(); return; } /* * Insert nblanks blanks at position (sline, scol). */ static int _ins_blanks(sline, scol, nblanks) int sline, scol, nblanks; { #ifdef DEBUG if (outf) fprintf(outf, "_ins_blanks at (%d, %d) %d blanks\n", sline, scol, nblanks); #endif _pos(sline, scol); if( nblanks > 1 && parm_ich ) { /* Insert the characters and then draw on the blanks */ _inschars(nblanks); } else { /* * Type the blanks in "insert mode". This includes * having to send insert_character before each character * is output. */ _insmode(1); _blanks(nblanks); } _insmode(0); } /* * Insert the given string on the screen. * This is like _showstring but you know you're in insert mode. */ static _ins_string(sline, scol, first, last) int sline, scol; chtype *first, *last; { int len = last-first+1; #ifdef DEBUG if (outf) fprintf(outf, "_ins_string at (%d, %d) %d chars\n", sline, scol, len); #endif _pos(sline, scol); if( len > 1 && parm_ich ) { /* Insert the characters and then draw on the blanks */ _inschars(len); _showstring(sline, scol, first, last, NULL); } else { /* * Type the characters in "insert mode". This includes * having to send insert_character before each character * is output. */ _insmode(1); _showstring(sline, scol, first, last, NULL); } _insmode(0); } E 1 h29514 s 00001/00001/00089 d D 3.2 87/05/13 18:31:15 build 4 3 c removed old SCCS strings and inserted #ident BB e s 00000/00000/00090 d D 3.1 87/01/20 18:48:21 mkm 3 2 c e s 00000/00000/00090 d D 2.1 87/01/20 18:39:00 mkm 2 1 c e s 00090/00000/00000 d D 1.1 87/01/20 18:30:36 mkm 1 0 c Placed under source control - mkm e u U f b f n t T I 1 D 4 /* " %W% %E% " */ E 4 I 4 #ident " %W% %E% " E 4 #include "curses.ext" /* * Figure out (roughly) how much each of these capabilities costs. * In the parameterized cases, we just take a typical case and * use that value. This is done only once at startup, since it * would be too expensive for intensive use. */ _init_costs() { int c_il0, c_il100; char *tparm(); /* * Insert line costs. These are a mess, they do not take into * account parameterized insert line, but rather assume 1 at a time. * Cost is # chars to insert one line k lines from bottom of screen. */ if (insert_line) { #ifdef DEBUG if(outf) fprintf(outf, "real insert line\n"); #endif c_il0 = _cost_fn(insert_line,0); c_il100 = _cost_fn(insert_line,100); } else if (change_scroll_region && save_cursor && restore_cursor) { #ifdef DEBUG if(outf) fprintf(outf, "use scrolling region\n"); #endif c_il0 = 2*_cost_fn(change_scroll_region,lines-1) + 2*_cost_fn(restore_cursor,0) + _cost_fn(save_cursor,0) + _cost_fn(scroll_reverse,0); c_il100 = c_il0; } else { #ifdef DEBUG if(outf) fprintf(outf, "no insert line\n"); #endif c_il0 = c_il100 = INFINITY; } _cost(ilfixed) = c_il0; _cost(ilvar) = ((long)(c_il100 - c_il0)<<32) / 100 ; #ifdef DEBUG if(outf) fprintf(outf,"_init_costs, ilfixed %d, ilvar %d/32,\ c_il0 %d, c_il100 %d\n", _cost(ilfixed), _cost(ilvar), c_il0, c_il100); #endif /* This is also a botch: treated as _cost to insert k characters */ _cost(icvar) = _cost(icfixed) = 0; if (enter_insert_mode && exit_insert_mode) _cost(icfixed) += _cost_fn(enter_insert_mode,0) + _cost_fn(exit_insert_mode,0); if (parm_ich) _cost(icfixed) = _cost_fn(tparm(parm_ich, 10), 10); else if (insert_character) _cost(icfixed) = 0; else if (_cost(icfixed) == 0) _cost(icfixed) = INFINITY; _cost(icvar) = 1<<5; /* for the character itself */ if (!parm_ich) { if (insert_character) _cost(icvar) += _cost_fn(insert_character,1)<<5; if (insert_padding) _cost(icvar) += _cost_fn(insert_padding,1)<<5; } #ifdef DEBUG if (outf) fprintf(outf, "icfixed %d=%d+%d, icvar=%d/32\n", _cost(icfixed), _cost_fn(enter_insert_mode,0), _cost_fn(exit_insert_mode,0), _cost(icvar)); if (outf) fprintf(outf, "from ich1 %x %d\n", insert_character, _cost_fn(insert_character,1)); if (outf) fprintf(outf, "ip %x %d\n", insert_padding, _cost_fn(insert_padding)); #endif _cost(Cursor_address) = _cost_fn(tparm(cursor_address,8,10),1); _cost(Cursor_home) = _cost_fn(cursor_home,1); _cost(Carriage_return) = _cost_fn(carriage_return,1); _cost(Tab) = _cost_fn(tab,1); _cost(Back_tab) = _cost_fn(back_tab,1); _cost(Cursor_left) = _cost_fn(cursor_left,1); _cost(Cursor_right) = _cost_fn(cursor_right,1); _cost(Right_base) = _cost(Cursor_right); _cost(Cursor_down) = _cost_fn(cursor_down,1); _cost(Cursor_up) = _cost_fn(cursor_up,1); _cost(Parm_left_cursor) = _cost_fn(tparm(parm_left_cursor, 10),1); _cost(Parm_right_cursor)= _cost_fn(tparm(parm_right_cursor, 10),1); _cost(Parm_up_cursor) = _cost_fn(tparm(parm_up_cursor, 10),1); _cost(Parm_down_cursor) = _cost_fn(tparm(parm_down_cursor, 10),1); _cost(Column_address) = _cost_fn(tparm(column_address, 10),1); _cost(Row_address) = _cost_fn(tparm(row_address, 8),1); } E 1 h56476 s 00001/00001/00025 d D 3.2 87/05/13 18:31:29 build 4 3 c removed old SCCS strings and inserted #ident BB e s 00000/00000/00026 d D 3.1 87/01/20 18:48:23 mkm 3 2 c e s 00000/00000/00026 d D 2.1 87/01/20 18:39:02 mkm 2 1 c e s 00026/00000/00000 d D 1.1 87/01/20 18:30:38 mkm 1 0 c Placed under source control - mkm e u U f b f n t T I 1 D 4 /* " %W% %E% " */ E 4 I 4 #ident " %W% %E% " E 4 #include "curses.ext" char *tparm(); extern int _outch(); /* * Insert n blank characters. */ _inschars(n) { #ifdef DEBUG if(outf) fprintf(outf, "_inschars(%d).\n", n); #endif if (enter_insert_mode && SP->phys_irm == 0) { tputs(enter_insert_mode, 1, _outch); SP->phys_irm = 1; } if (parm_ich && n > 1) tputs(tparm(parm_ich, n), n, _outch); else while (--n >= 0) tputs(insert_character, 1, _outch); } E 1 h39666 s 00001/00001/00014 d D 3.2 87/05/13 18:31:39 build 4 3 c removed old SCCS strings and inserted #ident BB e s 00000/00000/00015 d D 3.1 87/01/20 18:48:24 mkm 3 2 c e s 00000/00000/00015 d D 2.1 87/01/20 18:39:03 mkm 2 1 c e s 00015/00000/00000 d D 1.1 87/01/20 18:30:39 mkm 1 0 c Placed under source control - mkm e u U f b f n t T I 1 D 4 /* " %W% %E% " */ E 4 I 4 #ident " %W% %E% " E 4 #include "curses.ext" /* * Set the virtual insert/replacement mode to new. */ _insmode (new) int new; { #ifdef DEBUG if(outf) fprintf(outf, "_insmode(%d).\n", new); #endif SP->virt_irm = new; } E 1 h46416 s 00001/00001/00019 d D 3.2 87/05/13 18:31:52 build 4 3 c removed old SCCS strings and inserted #ident BB e s 00000/00000/00020 d D 3.1 87/01/20 18:48:26 mkm 3 2 c e s 00000/00000/00020 d D 2.1 87/01/20 18:39:04 mkm 2 1 c e s 00020/00000/00000 d D 1.1 87/01/20 18:30:40 mkm 1 0 c Placed under source control - mkm e u U f b f n t T I 1 D 4 /* " %W% %E% " */ E 4 I 4 #ident " %W% %E% " E 4 #include "curses.ext" extern int _outch(); _kpmode(m) { #ifdef DEBUG if (outf) fprintf(outf, "kpmode(%d), SP->kp_state %d\n", m, SP->kp_state); #endif if (m == SP->kp_state) return; if (m) tputs(keypad_xmit, 1, _outch); else tputs(keypad_local, 1, _outch); SP->kp_state = m; } E 1 h04811 s 00001/00001/00031 d D 3.2 87/05/13 18:32:06 build 4 3 c removed old SCCS strings and inserted #ident BB e s 00000/00000/00032 d D 3.1 87/01/20 18:48:28 mkm 3 2 c e s 00000/00000/00032 d D 2.1 87/01/20 18:39:05 mkm 2 1 c e s 00032/00000/00000 d D 1.1 87/01/20 18:30:41 mkm 1 0 c Placed under source control - mkm e u U f b f n t T I 1 D 4 /* " %W% %E% " */ E 4 I 4 #ident " %W% %E% " E 4 #include "curses.ext" /* '_line_free' returns a line object to the free list */ _line_free (p) register struct line *p; { register int i, sl, n=0; register struct line **q; if (p == NULL) return; #ifdef DEBUG if(outf) fprintf(outf, "mem: Releaseline (%x), prev SP->freelist %x", p, SP->freelist); #endif sl = lines; for (i=sl,q = &SP->cur_body[sl]; i>0; i--,q--) if (p == *q) n++; for (i=sl,q = &SP->std_body[sl]; i>0; i--,q--) if (p == *q) n++; #ifdef DEBUG if(outf) fprintf(outf, ", count %d\n", n); #endif if (n > 1) return; p -> next = SP->freelist; p -> hash = -888; SP->freelist = p; } E 1 h37606 s 00001/00001/00044 d D 3.2 87/05/13 18:32:21 build 4 3 c removed old SCCS strings and inserted #ident BB e s 00000/00000/00045 d D 3.1 87/01/20 18:48:29 mkm 3 2 c e s 00000/00000/00045 d D 2.1 87/01/20 18:39:07 mkm 2 1 c e s 00045/00000/00000 d D 1.1 87/01/20 18:30:42 mkm 1 0 c Placed under source control - mkm e u U f b f n t T I 1 D 4 /* " %W% %E% " */ E 4 I 4 #ident " %W% %E% " E 4 #include "curses.ext" extern struct line *_line_alloc(); /* * _ll_move positions the cursor at position (row,col) * in the virtual screen */ _ll_move (row, col) register int row, col; { register struct line *p; register int l; register chtype *b1, *b2; register int rp1 = row+1; #ifdef DEBUG if(outf) fprintf(outf, "_ll_move(%d, %d)\n", row, col); #endif if (SP->virt_y >= 0 && (p=SP->std_body[SP->virt_y+1]) && p->length < SP->virt_x) p->length = SP->virt_x >= columns ? columns : SP->virt_x; SP->virt_x = col; SP->virt_y = row; if (row < 0 || col < 0) return; if (!SP->std_body[rp1] || SP->std_body[rp1] == SP->cur_body[rp1]) { p = _line_alloc (); if (SP->cur_body[rp1]) { p->length = l = SP->cur_body[rp1]->length; b1 = &(p->body[0]); b2 = &(SP->cur_body[rp1]->body[0]); for ( ; l>0; l--) *b1++ = *b2++; } SP->std_body[rp1] = p; } p = SP->std_body[rp1]; p -> hash = 0; while (p -> length < col) p -> body[p -> length++] = ' '; SP->curptr = &(SP->std_body[rp1] -> body[col]); } E 1 h07060 s 00001/00001/00034 d D 3.2 87/05/13 18:32:33 build 4 3 c removed old SCCS strings and inserted #ident BB e s 00000/00000/00035 d D 3.1 87/01/20 18:48:31 mkm 3 2 c e s 00000/00000/00035 d D 2.1 87/01/20 18:39:08 mkm 2 1 c e s 00035/00000/00000 d D 1.1 87/01/20 18:30:43 mkm 1 0 c Placed under source control - mkm e u U f b f n t T I 1 D 4 /* " %W% %E% " */ E 4 I 4 #ident " %W% %E% " E 4 /* * This routine is one of the main things * in this level of curses that depends on the outside * environment. */ #include "curses.ext" int outchcount; /* * Write out one character to the tty. */ _outch (c) chtype c; { #ifdef DEBUG # ifndef LONGDEBUG if (outf) if (c < ' ') fprintf(outf, "^%c", (c+'@')&0177); else fprintf(outf, "%c", c&0177); # else LONGDEBUG if(outf) fprintf(outf, "_outch: char '%s' term %x file %x=%d\n", unctrl(c&0177), SP, SP->term_file, fileno(SP->term_file)); # endif LONGDEBUG #endif DEBUG outchcount++; if (SP && SP->term_file) putc (c&0177, SP->term_file); else putc (c&0177, stdout); } E 1 h59860 s 00001/00001/00018 d D 3.2 87/05/13 18:32:45 build 4 3 c removed old SCCS strings and inserted #ident BB e s 00000/00000/00019 d D 3.1 87/01/20 18:48:32 mkm 3 2 c e s 00000/00000/00019 d D 2.1 87/01/20 18:39:10 mkm 2 1 c e s 00019/00000/00000 d D 1.1 87/01/20 18:30:44 mkm 1 0 c Placed under source control - mkm e u U f b f n t T I 1 D 4 /* " %W% %E% " */ E 4 I 4 #ident " %W% %E% " E 4 /* * Handy functions to put out a string with padding. * These make two assumptions: * (1) Output is via stdio to stdout through putchar. * (2) There is no count of affected lines. Thus, this * routine is only valid for certain capabilities, * i.e. those that don't have *'s in the documentation. */ #include /* * Routine to act like putchar for passing to tputs. */ _outchar(ch) char ch; { putchar(ch); } E 1 h46693 s 00001/00001/00046 d D 3.2 87/05/13 18:32:58 build 4 3 c removed old SCCS strings and inserted #ident BB e s 00000/00000/00047 d D 3.1 87/01/20 18:48:34 mkm 3 2 c e s 00000/00000/00047 d D 2.1 87/01/20 18:39:11 mkm 2 1 c e s 00047/00000/00000 d D 1.1 87/01/20 18:30:45 mkm 1 0 c Placed under source control - mkm e u U f b f n t T I 1 D 4 /* " %W% %E% " */ E 4 I 4 #ident " %W% %E% " E 4 #include "curses.ext" extern int _outch(); /* Position the SP->curptr to (row, column) which start at 0. */ _pos(row, column) int row; int column; { #ifdef DEBUG if(outf) fprintf(outf, "_pos from row %d, col %d => row %d, col %d\n", SP->phys_y, SP->phys_x, row, column); #endif if( SP->phys_x == column && SP->phys_y == row ) { return; /* already there */ } /* * Many terminals can't move the cursor when in standout mode. * We must be careful, however, because HP's and cookie terminals * will drop a cookie when we do this. */ if( !move_standout_mode && SP->phys_gr && magic_cookie_glitch < 0 ) { if( !ceol_standout_glitch ) { _clearhl (); } } /* some terminals can't move in insert mode */ if( SP->phys_irm == 1 && !move_insert_mode ) { tputs(exit_insert_mode, 1, _outch); SP->phys_irm = 0; } /* If we try to move outside the scrolling region, widen it */ if( rowphys_top_mgn || row>SP->phys_bot_mgn ) { _window(0, lines-1, 0, columns-1); _setwind(); } mvcur(SP->phys_y, SP->phys_x, row, column); SP->phys_x = column; SP->phys_y = row; } E 1 h60521 s 00001/00001/00025 d D 3.2 87/05/13 18:33:11 build 4 3 c removed old SCCS strings and inserted #ident BB e s 00000/00000/00026 d D 3.1 87/01/20 18:48:36 mkm 3 2 c e s 00000/00000/00026 d D 2.1 87/01/20 18:39:12 mkm 2 1 c e s 00026/00000/00000 d D 1.1 87/01/20 18:30:46 mkm 1 0 c Placed under source control - mkm e u U f b f n t T I 1 D 4 /* " %W% %E% " */ E 4 I 4 #ident " %W% %E% " E 4 #include "curses.ext" extern int _outch(); _reset () { #ifdef DEBUG if(outf) fprintf(outf, "_reset().\n"); #endif tputs(enter_ca_mode, 0, _outch); tputs(cursor_visible, 0, _outch); tputs(exit_attribute_mode, 0, _outch); tputs(clear_screen, 0, _outch); SP->phys_x = 0; SP->phys_y = 0; SP->phys_irm = 1; SP->virt_irm = 0; SP->phys_top_mgn = 4; SP->phys_bot_mgn = 4; SP->des_top_mgn = 0; SP->des_bot_mgn = lines-1; SP->ml_above = 0; _setwind(); } E 1 h35424 s 00001/00001/00050 d D 3.2 87/05/13 18:33:23 build 4 3 c removed old SCCS strings and inserted #ident BB e s 00000/00000/00051 d D 3.1 87/01/20 18:48:37 mkm 3 2 c e s 00000/00000/00051 d D 2.1 87/01/20 18:39:14 mkm 2 1 c e s 00051/00000/00000 d D 1.1 87/01/20 18:30:47 mkm 1 0 c Placed under source control - mkm e u U f b f n t T I 1 D 4 /* " %W% %E% " */ E 4 I 4 #ident " %W% %E% " E 4 #include "curses.ext" /* * Scroll the screen down (e.g. in the normal direction of text) one line * physically, and update the internal notion of what's on the screen * (SP->cur_body) to know about this. Do it in such a way that we will * realize this has been done later and take advantage of it. */ _scrdown() { struct line *old_d, *old_p; register int i, l=lines; #ifdef DEBUG if(outf) { fprintf(outf, "_scrdown()\n"); fprintf( outf, "\tDoing _pos( %d, 0 )\n", lines - 1 ); fprintf( outf, "\tDoing _scrollf(1)\n" ); } #endif /* physically... */ _pos(lines-1, 0); _scrollf(1); /* internally */ old_d = SP->std_body[1]; old_p = SP->cur_body[1]; #ifdef DEBUG if(outf) { fprintf( outf, "lines = l = %d\n", l ); } #endif DEBUG for( i=1; i<=l; i++ ) { SP->std_body[i] = SP->std_body[i+1]; SP->cur_body[i] = SP->cur_body[i+1]; } SP->std_body[1] = NULL; SP->cur_body[1] = NULL; _line_free(old_d); if( old_d != old_p ) { _line_free(old_p); } } E 1 h02856 s 00001/00001/00035 d D 3.2 87/05/13 18:33:34 build 4 3 c removed old SCCS strings and inserted #ident BB e s 00000/00000/00036 d D 3.1 87/01/20 18:48:38 mkm 3 2 c e s 00000/00000/00036 d D 2.1 87/01/20 18:39:15 mkm 2 1 c e s 00036/00000/00000 d D 1.1 87/01/20 18:30:48 mkm 1 0 c Placed under source control - mkm e u U f b f n t T I 1 D 4 /* " %W% %E% " */ E 4 I 4 #ident " %W% %E% " E 4 #include "curses.ext" extern int _outch(); /* * Scroll the terminal forward n lines, bringing up blank lines from bottom. * This only affects the current scrolling region. */ _scrollf(n) int n; { register int i; if( scroll_forward ) { _setwind(); _pos( SP->des_bot_mgn, 0 ); for( i=0; iml_above += n; if( SP->ml_above + lines > lines_of_memory ) { SP->ml_above = lines_of_memory - lines; } } else { /* If terminal can't do it, try delete line. */ _pos(0, 0); _dellines(n); } } E 1 h58399 s 00001/00001/00020 d D 3.2 87/05/13 18:33:45 build 4 3 c removed old SCCS strings and inserted #ident BB e s 00000/00000/00021 d D 3.1 87/01/20 18:48:40 mkm 3 2 c e s 00000/00000/00021 d D 2.1 87/01/20 18:39:17 mkm 2 1 c e s 00021/00000/00000 d D 1.1 87/01/20 18:30:49 mkm 1 0 c Placed under source control - mkm e u U f b f n t T I 1 D 4 /* " %W% %E% " */ E 4 I 4 #ident " %W% %E% " E 4 #include "curses.ext" extern int _outch(); _sethl () { #ifdef DEBUG if(outf) fprintf(outf, "_sethl(). SP->phys_gr=%o, SP->virt_gr %o\n", SP->phys_gr, SP->virt_gr); #endif #ifdef VIDEO if (SP->phys_gr == SP->virt_gr) return; vidputs(SP->virt_gr, _outch); SP->phys_gr = SP->virt_gr; /* Account for the extra space the cookie takes up */ if (magic_cookie_glitch >= 0) SP->phys_x += magic_cookie_glitch; #endif VIDEO } E 1 h46080 s 00001/00001/00015 d D 3.2 87/05/13 18:33:56 build 4 3 c removed old SCCS strings and inserted #ident BB e s 00000/00000/00016 d D 3.1 87/01/20 18:48:42 mkm 3 2 c e s 00000/00000/00016 d D 2.1 87/01/20 18:39:19 mkm 2 1 c e s 00016/00000/00000 d D 1.1 87/01/20 18:30:50 mkm 1 0 c Placed under source control - mkm e u U f b f n t T I 1 D 4 /* " %W% %E% " */ E 4 I 4 #ident " %W% %E% " E 4 #include "curses.ext" extern int _outch(); _setmode () { #ifdef DEBUG if(outf) fprintf(outf, "_setmode().\n"); #endif if (SP->virt_irm == SP->phys_irm) return; tputs(SP->virt_irm==1 ? enter_insert_mode : exit_insert_mode, 0, _outch); SP->phys_irm = SP->virt_irm; } E 1 2~}|{zyxwvutsrqh45836 s 00001/00001/00084 d D 3.2 87/05/13 18:34:31 build 4 3 c removed old SCCS strings and inserted #ident BB e s 00000/00000/00085 d D 3.1 87/01/20 18:48:44 mkm 3 2 c e s 00000/00000/00085 d D 2.1 87/01/20 18:39:21 mkm 2 1 c e s 00085/00000/00000 d D 1.1 87/01/20 18:30:51 mkm 1 0 c Placed under source control - mkm e u U f b f n t T I 1 D 4 /* " %W% %E% " */ E 4 I 4 #ident " %W% %E% " E 4 #include "curses.ext" /* * Shove right in body as much as necessary. * Note that we give the space the same attributes as the upcoming * character, to force the cookie to be placed on the space. */ /* ARGSUSED */ _shove(body, len, lno) register chtype *body; register int len, lno; { register int j, k, prev = 0; register int curscol = SP->virt_x, cursincr = 0, shoved = 0; static chtype buf[256]; #ifdef DEBUG if(outf) fprintf(outf, "_shove('"); _prstr(body, len); if(outf) fprintf(outf, "', %d, %d), SP->virt_x %d\n", len, lno, SP->virt_x); #endif for (j=0, k=0; j columns) k = columns; if (buf[k-1]&A_ATTRIBUTES) { if (k < columns) k++; buf[k-1] = ' '; /* All attributes off */ } for (j=0; jvirt_y+1) SP->virt_x = SP->virt_x + cursincr; /*compilo n'aime pas x +=y*/ #ifdef DEBUG if(outf) fprintf(outf, "returns '"); _prstr(body, len); if(outf) fprintf(outf, "', len %d, SP->virt_x %d\n", len, SP->virt_x); #endif return len; } #ifdef DEBUG static _prstr(result, len) chtype *result; int len; { register chtype *cp; for (cp=result; *cp && cp < result+len; cp++) if (*cp >= ' ' && *cp <= '~') { if(outf) fprintf(outf, "%c", *cp); } else { if(outf) fprintf(outf, "<%o,%c>", *cp&A_ATTRIBUTES, *cp&A_CHARTEXT); } } #endif E 1 h57743 s 00001/00001/00022 d D 3.2 87/05/13 18:34:42 build 4 3 c removed old SCCS strings and inserted #ident BB e s 00000/00000/00023 d D 3.1 87/01/20 18:48:46 mkm 3 2 c e s 00000/00000/00023 d D 2.1 87/01/20 18:39:23 mkm 2 1 c e s 00023/00000/00000 d D 1.1 87/01/20 18:30:52 mkm 1 0 c Placed under source control - mkm e u U f b f n t T I 1 D 4 /* " %W% %E% " */ E 4 I 4 #ident " %W% %E% " E 4 # include "curses.ext" # include /* * This routine actually executes the printf and adds it to the window * * This code now uses the vsprintf routine, which portably digs * into stdio. We provide a vsprintf for older systems that don't * have one. */ _sprintw(win, fmt, ap) WINDOW *win; char *fmt; va_list ap; { char buf[BUFSIZ]; vsprintf(buf, fmt, ap); return waddstr(win, buf); } E 1 h38374 s 00001/00001/00023 d D 3.2 87/05/13 18:34:53 build 4 3 c removed old SCCS strings and inserted #ident BB e s 00000/00000/00024 d D 3.1 87/01/20 18:48:47 mkm 3 2 c e s 00000/00000/00024 d D 2.1 87/01/20 18:39:24 mkm 2 1 c e s 00024/00000/00000 d D 1.1 87/01/20 18:30:54 mkm 1 0 c Placed under source control - mkm e u U f b f n t T I 1 D 4 /* " %W% %E% " */ E 4 I 4 #ident " %W% %E% " E 4 /* */ # include "curses.ext" #ifdef DEBUG _sputc(c, f) chtype c; FILE *f; { int so; so = c & A_ATTRIBUTES; c &= 0177; if (so) { putc('<', f); fprintf(f, "%o,", so); } putc(c, f); if (so) putc('>', f); } #endif E 1 h34767 s 00001/00001/00012 d D 3.2 87/05/13 18:35:03 build 4 3 c removed old SCCS strings and inserted #ident BB e s 00000/00000/00013 d D 3.1 87/01/20 18:48:48 mkm 3 2 c e s 00000/00000/00013 d D 2.1 87/01/20 18:39:26 mkm 2 1 c e s 00013/00000/00000 d D 1.1 87/01/20 18:30:55 mkm 1 0 c Placed under source control - mkm e u U f b f n t T I 1 D 4 /* " %W% %E% " */ E 4 I 4 #ident " %W% %E% " E 4 #include "curses.ext" _syncmodes() { #ifdef DEBUG if(outf) fprintf(outf, "_syncmodes().\n"); #endif _sethl(); _setmode(); _setwind(); } E 1 h12151 s 00001/00001/00080 d D 3.2 87/05/13 18:35:27 build 4 3 c removed old SCCS strings and inserted #ident BB e s 00000/00000/00081 d D 3.1 87/01/20 18:48:50 mkm 3 2 c e s 00000/00000/00081 d D 2.1 87/01/20 18:39:28 mkm 2 1 c e s 00081/00000/00000 d D 1.1 87/01/20 18:30:55 mkm 1 0 c Placed under source control - mkm e u U f b f n t T I 1 D 4 /* " %W% %E% " */ E 4 I 4 #ident " %W% %E% " E 4 # include "curses.ext" _tscroll( win ) register WINDOW *win; { register chtype *sp; register int i; register chtype *temp; register int top, bot; #ifdef DEBUG if( win == stdscr ) { if(outf) fprintf( outf, "scroll( stdscr )\n" ); } else { if( win == curscr) { if(outf) fprintf( outf, "scroll( curscr )\n" ); } else { if(outf) fprintf( outf, "scroll( %x )\n", win ); } } #endif if( !win->_scroll ) { return ERR; } /* scroll the window lines themselves up */ top = win->_tmarg; bot = win->_bmarg; temp = win->_y[top]; #ifdef DEBUG if(outf) { fprintf( outf, "top = %d, bot = %d\n", top, bot ); } #endif DEBUG for (i = top; i < bot; i++) { win->_y[i] = win->_y[i+1]; } /* Put a blank line in the opened up space */ for (sp = temp; sp - temp < win->_maxx; ) *sp++ = ' '; win->_y[bot] = temp; #ifdef DEBUG if(outf) { fprintf(outf,"SCROLL win [0%o], curscr [0%o], top %d, bot %d\n", win, curscr, top, bot); fprintf( outf, "Doing --> touchwin( 0%o )\n", win ); } #endif DEBUG win->_cury--; /* ** This section taken out because it wasn't allowing the scrolling of a ** region smaller than the full screen. Taken out on 10/12/83. The ** function call touchwin(win) is done all the time now, & seems to do ** the correct thing when it comes to scrolling with a smaller than screen ** sized region, & a screen sized region. ** ** if( win->_flags&_FULLWIN ) ** { ** _scrdown(); ** } ** else ** { ** musttouch = 1; ** } ** if( musttouch ) ** touchwin(win); */ touchwin(win); return OK; } E 1 h40654 s 00001/00001/00031 d D 3.2 87/05/13 18:35:40 build 4 3 c removed old SCCS strings and inserted #ident BB e s 00000/00000/00032 d D 3.1 87/01/20 18:48:52 mkm 3 2 c e s 00000/00000/00032 d D 2.1 87/01/20 18:39:29 mkm 2 1 c e s 00032/00000/00000 d D 1.1 87/01/20 18:30:57 mkm 1 0 c Placed under source control - mkm e u U f b f n t T I 1 D 4 /* " %W% %E% " */ E 4 I 4 #ident " %W% %E% " E 4 #include "curses.ext" /* * Set the desired window to the box with the indicated boundaries. * All scrolling should only affect the area inside the window. * We currently ignore the last 2 args since we're only using this * for scrolling and want to use the feature on vt100's as well as * on concept 100's. left and right are for future expansion someday. * * Note that we currently assume cursor addressing within the window * is relative to the screen, not the window. This will have to be * generalized if concept windows are to be used. */ /* ARGSUSED */ _window(top, bottom, left, right) int top, bottom, left, right; { #ifdef DEBUG if(outf) fprintf(outf, "_window old top=%d, bot %d; new top=%d, bot %d\n", SP->des_top_mgn, SP->des_bot_mgn, top, bottom); #endif if (change_scroll_region || set_window) { SP->des_top_mgn = top; SP->des_bot_mgn = bottom; } #ifdef DEBUG else if(outf) fprintf(outf, "window setting ignored\n"); #endif } E 1 h65486 s 00001/00001/00145 d D 3.2 87/05/13 18:35:53 build 4 3 c removed old SCCS strings and inserted #ident BB e s 00000/00000/00146 d D 3.1 87/01/20 18:48:53 mkm 3 2 c e s 00000/00000/00146 d D 2.1 87/01/20 18:39:31 mkm 2 1 c e s 00146/00000/00000 d D 1.1 87/01/20 18:30:58 mkm 1 0 c Placed under source control - mkm e u U f b f n t T I 1 D 4 /* " %W% %E% " */ E 4 I 4 #ident " %W% %E% " E 4 # include "curses.ext" /* * This routine prints the character in the current position. * Think of it as putc. * */ waddch(win, c) register WINDOW *win; register chtype c; { register int x, y; char *uctr; register char rawc = c & A_CHARTEXT; x = win->_curx; y = win->_cury; # ifdef DEBUG if (outf) if (c == rawc) fprintf(outf, "'%c'", rawc); else fprintf(outf, "'%c' %o, raw %o", c, c, rawc); # endif if (y >= win->_maxy || x >= win->_maxx || y < 0 || x < 0) { # ifdef DEBUG if(outf) { fprintf(outf,"off edge, (%d,%d) not in (%d,%d)\n",y,x,win->_maxy,win->_maxx); } # endif return ERR; } switch( rawc ) { case '\t': { register int newx; for( newx = x + (8 - (x & 07)); x < newx; x++ ) { if( waddch(win, ' ') == ERR ) { return ERR; } } return OK; } default: if( rawc < ' ' || rawc > '~' ) { uctr = unctrl(rawc); waddch(win, (chtype)uctr[0]|(c&A_ATTRIBUTES)); waddch(win, (chtype)uctr[1]|(c&A_ATTRIBUTES)); return OK; } if( win->_attrs ) { #ifdef DEBUG if(outf) fprintf(outf, "(attrs %o, %o=>%o)", win->_attrs, c, c | win->_attrs); #endif DEBUG c |= win->_attrs;; } if( win->_y[y][x] != c ) { if( win->_firstch[y] == _NOCHANGE ) { win->_firstch[y] = win->_lastch[y] = x; } else { if( x < win->_firstch[y] ) { win->_firstch[y] = x; } else { if( x > win->_lastch[y] ) { win->_lastch[y] = x; } } } } win->_y[y][x++] = c; if (x >= win->_maxx) { x = 0; new_line: if (++y > win->_bmarg) { if (win->_scroll && !(win->_flags&_ISPAD)) { #ifdef DEBUG if(outf) { fprintf( outf, "Calling wrefresh( 0%o ) & _tscroll( 0%o )\n", win, win ); } #endif DEBUG wrefresh(win); _tscroll( win ); --y; } else { # ifdef DEBUG int i; if(outf) { fprintf(outf, "ERR because (%d,%d) > (%d,%d)\n", x, y, win->_maxx, win->_maxy); fprintf(outf, "line: '"); for (i=0; i_maxy; i++) fprintf(outf, "%c", win->_y[y-1][i]); fprintf(outf, "'\n"); } # endif DEBUG return ERR; } } } # ifdef DEBUG if(outf) fprintf(outf, "ADDCH: 2: y = %d, x = %d, firstch = %d, lastch = %d\n", y, x, win->_firstch[y], win->_lastch[y]); # endif DEBUG break; case '\n': wclrtoeol(win); x = 0; goto new_line; case '\r': x = 0; break; case '\b': if (--x < 0) x = 0; break; } win->_curx = x; win->_cury = y; return OK; } E 1 h56778 s 00001/00001/00033 d D 3.2 87/05/13 18:36:05 build 4 3 c removed old SCCS strings and inserted #ident BB e s 00000/00000/00034 d D 3.1 87/01/20 18:48:55 mkm 3 2 c e s 00000/00000/00034 d D 2.1 87/01/20 18:39:32 mkm 2 1 c e s 00034/00000/00000 d D 1.1 87/01/20 18:31:00 mkm 1 0 c Placed under source control - mkm e u U f b f n t T I 1 D 4 /* " %W% %E% " */ E 4 I 4 #ident " %W% %E% " E 4 # include "curses.ext" /* * This routine adds a string starting at (_cury,_curx) * */ waddstr(win,str) register WINDOW *win; register char *str; { # ifdef DEBUG if(outf) { if( win == stdscr ) { fprintf(outf, "WADDSTR(stdscr, "); } else { fprintf(outf, "WADDSTR(%o, ", win); } fprintf(outf, "\"%s\")\n", str); } # endif DEBUG while( *str ) { if( waddch( win, ( chtype ) *str++ ) == ERR ) { return ERR; } } return OK; } E 1 h28321 s 00001/00001/00007 d D 3.2 87/05/13 18:36:14 build 4 3 c removed old SCCS strings and inserted #ident BB e s 00000/00000/00008 d D 3.1 87/01/20 18:48:57 mkm 3 2 c e s 00000/00000/00008 d D 2.1 87/01/20 18:39:34 mkm 2 1 c e s 00008/00000/00000 d D 1.1 87/01/20 18:31:01 mkm 1 0 c Placed under source control - mkm e u U f b f n t T I 1 D 4 /* " %W% %E% " */ E 4 I 4 #ident " %W% %E% " E 4 #include "curses.ext" int baudrate() { return SP->baud; } E 1 h39885 s 00001/00001/00016 d D 3.2 87/05/13 18:36:24 build 4 3 c removed old SCCS strings and inserted #ident BB e s 00000/00000/00017 d D 3.1 87/01/20 18:48:58 mkm 3 2 c e s 00000/00000/00017 d D 2.1 87/01/20 18:39:35 mkm 2 1 c e s 00017/00000/00000 d D 1.1 87/01/20 18:31:03 mkm 1 0 c Placed under source control - mkm e u U f b f n t T I 1 D 4 /* " %W% %E% " */ E 4 I 4 #ident " %W% %E% " E 4 #include "curses.ext" extern int _outch(); beep() { #ifdef DEBUG if(outf) fprintf(outf, "beep().\n"); #endif if (bell) tputs (bell, 0, _outch); else tputs (flash_screen, 0, _outch); __cflush(); } E 1 h34144 s 00000/00000/00010 d D 3.1 87/01/20 18:49:00 mkm 3 2 c e s 00000/00000/00010 d D 2.1 87/01/20 18:39:37 mkm 2 1 c e s 00010/00000/00000 d D 1.1 87/01/20 18:31:04 mkm 1 0 c Placed under source control - mkm e u U f b f n t T I 1 char *boolnames[] = { "bw", "am", "xsb", "xhp", "xenl", "eo", "gn", "hc", "km", "hs", "in", "da", "db", "mir", "msgr", "os", "eslok", "xt", "hz", "ul", "xon", 0 }; char *boolcodes[] = { "bw", "am", "xb", "xs", "xn", "eo", "gn", "hc", "km", "hs", "in", "da", "db", "mi", "ms", "os", "es", "xt", "hz", "ul", "xo", 0 }; E 1 h53712 s 00000/00000/00023 d D 3.1 87/01/20 18:49:01 mkm 3 2 c e s 00000/00000/00023 d D 2.1 87/01/20 18:39:39 mkm 2 1 c e s 00023/00000/00000 d D 1.1 87/01/20 18:31:05 mkm 1 0 c Placed under source control - mkm e u U f b f n t T I 1 char auto_left_margin, /* cub1 wraps from column 0 to last column */ auto_right_margin, /* Terminal has automatic margins */ beehive_glitch, /* Beehive (f1=escape, f2=ctrl C) */ ceol_standout_glitch, /* Standout not erased by overwriting (hp) */ eat_newline_glitch, /* newline ignored after 80 cols (Concept) */ erase_overstrike, /* Can erase overstrikes with a blank */ generic_type, /* Generic line type (e.g. dialup, switch). */ hard_copy, /* Hardcopy terminal */ has_meta_key, /* Has a meta key (shift, sets parity bit) */ has_status_line, /* Has extra "status line" */ insert_null_glitch, /* Insert mode distinguishes nulls */ memory_above, /* Display may be retained above the screen */ memory_below, /* Display may be retained below the screen */ move_insert_mode, /* Safe to move while in insert mode */ move_standout_mode, /* Safe to move in standout modes */ over_strike, /* Terminal overstrikes */ status_line_esc_ok, /* Escape can be used on the status line */ teleray_glitch, /* Tabs destructive, magic so char (t1061) */ tilde_glitch, /* Hazeltine; can't print ~'s */ transparent_underline, /* underline character overstrikes */ xon_xoff, /* Terminal uses xon/xoff handshaking */ lastbool; E 1 h14006 s 00001/00001/00035 d D 3.2 87/05/13 18:36:36 build 4 3 c removed old SCCS strings and inserted #ident BB e s 00000/00000/00036 d D 3.1 87/01/20 18:49:02 mkm 3 2 c e s 00000/00000/00036 d D 2.1 87/01/20 18:39:40 mkm 2 1 c e s 00036/00000/00000 d D 1.1 87/01/20 18:31:06 mkm 1 0 c Placed under source control - mkm e u U f b f n t T I 1 D 4 /* " %W% %E% " */ E 4 I 4 #ident " %W% %E% " E 4 # include "curses.ext" /* * This routine draws a box around the given window with "vert" * as the vertical delimiting char, and "hor", as the horizontal one. * */ /* Defaults - might someday be terminal dependent using graphics chars */ #define DEFVERT '|' #define DEFHOR '-' box(win, vert, hor) register WINDOW *win; chtype vert, hor; { register int i; register int endy, endx; register chtype *fp, *lp; if (vert == 0) vert = DEFVERT; if (hor == 0) hor = DEFHOR; endx = win->_maxx; endy = win->_maxy - 1; fp = win->_y[0]; lp = win->_y[endy]; for (i = 0; i < endx; i++) fp[i] = lp[i] = hor; endx--; for (i = 0; i <= endy; i++) win->_y[i][0] = (win->_y[i][endx] = vert); touchwin(win); } E 1 h47546 s 00001/00001/00054 d D 3.2 87/05/13 18:36:48 build 4 3 c removed old SCCS strings and inserted #ident BB e s 00000/00000/00055 d D 3.1 87/01/20 18:49:04 mkm 3 2 c e s 00000/00000/00055 d D 2.1 87/01/20 18:39:42 mkm 2 1 c e s 00055/00000/00000 d D 1.1 87/01/20 18:31:07 mkm 1 0 c Placed under source control - mkm e u U f b f n t T I 1 D 4 /* " %W% %E% " */ E 4 I 4 #ident " %W% %E% " E 4 char *boolnames[] = { "bw", "am", "xsb", "xhp", "xenl", "eo", "gn", "hc", "km", "hs", "in", "da", "db", "mir", "msgr", "os", "eslok", "xt", "hz", "ul", "xon", 0 }; char *boolcodes[] = { "bw", "am", "xb", "xs", "xn", "eo", "gn", "hc", "km", "hs", "in", "da", "db", "mi", "ms", "os", "es", "xt", "hz", "ul", "xo", 0 }; char *numnames[] = { "cols", "it", "lines", "lm", "xmc", "pb", "vt", "wsl", 0 }; char *numcodes[] = { "co", "it", "li", "lm", "sg", "pb", "vt", "ws", 0 }; char *strnames[] = { "cbt", "bel", "cr", "csr", "tbc", "clear", "el", "ed", "hpa", "cmdch", "cup", "cud1", "home", "civis", "cub1", "mrcup", "cnorm", "cuf1", "ll", "cuu1", "cvvis", "dch1", "dl1", "dsl", "hd", "smacs", "blink", "bold", "smcup", "smdc", "dim", "smir", "invis", "prot", "rev", "smso", "smul", "ech", "rmacs", "sgr0", "rmcup", "rmdc", "rmir", "rmso", "rmul", "flash", "ff", "fsl", "is1", "is2", "is3", "if", "ich1", "il1", "ip", "kbs", "ktbc", "kclr", "kctab", "kdch1", "kdl1", "kcud1", "krmir", "kel", "ked", "kf0", "kf1", "kf10", "kf2", "kf3", "kf4", "kf5", "kf6", "kf7", "kf8", "kf9", "khome", "kich1", "kil1", "kcub1", "kll", "knp", "kpp", "kcuf1", "kind", "kri", "khts", "kcuu1", "rmkx", "smkx", "lf0", "lf1", "lf10", "lf2", "lf3", "lf4", "lf5", "lf6", "lf7", "lf8", "lf9", "rmm", "smm", "nel", "pad", "dch", "dl", "cud", "ich", "indn", "il", "cub", "cuf", "rin", "cuu", "pfkey", "pfloc", "pfx", "mc0", "mc4", "mc5", "rep", "rs1", "rs2", "rs3", "rf", "rc", "vpa", "sc", "ind", "ri", "sgr", "hts", "wind", "ht", "tsl", "uc", "hu", "iprog", "ka1", "ka3", "kb2", "kc1", "kc3", "mc5p", 0 }; char *strcodes[] = { "bt", "bl", "cr", "cs", "ct", "cl", "ce", "cd", "ch", "CC", "cm", "do", "ho", "vi", "le", "CM", "ve", "nd", "ll", "up", "vs", "dc", "dl", "ds", "hd", "as", "mb", "md", "ti", "dm", "mh", "im", "mk", "mp", "mr", "so", "us", "ec", "ae", "me", "te", "ed", "ei", "se", "ue", "vb", "ff", "fs", "i1", "is", "i2", "if", "ic", "al", "ip", "kb", "ka", "kC", "kt", "kD", "kL", "kd", "kM", "kE", "kS", "k0", "k1", "k;", "k2", "k3", "k4", "k5", "k6", "k7", "k8", "k9", "kh", "kI", "kA", "kl", "kH", "kN", "kP", "kr", "kF", "kR", "kT", "ku", "ke", "ks", "l0", "l1", "la", "l2", "l3", "l4", "l5", "l6", "l7", "l8", "l9", "mo", "mm", "nw", "pc", "DC", "DL", "DO", "IC", "SF", "AL", "LE", "RI", "SR", "UP", "pk", "pl", "px", "ps", "pf", "po", "rp", "r1", "r2", "r3", "rf", "rc", "cv", "sc", "sf", "sr", "sa", "st", "wi", "ta", "ts", "uc", "hu", "iP", "K1", "K3", "K2", "K4", "K5", "pO", 0 }; E 1 h43734 s 00000/00000/00187 d D 3.1 87/01/20 18:49:06 mkm 3 2 c e s 00000/00000/00187 d D 2.1 87/01/20 18:39:44 mkm 2 1 c e s 00187/00000/00000 d D 1.1 87/01/20 18:31:08 mkm 1 0 c Placed under source control - mkm e u U f b f n t T I 1 # @(#)caps 1.1 (1.19 10/31/82) # Be sure to add new capabilties at the END of the appropriate section! --- begin bool auto_left_margin, "bw" "bw" cub1 wraps from column 0 to last column auto_right_margin, "am" "am" Terminal has automatic margins beehive_glitch, "xsb" "xb" Beehive (f1=escape, f2=ctrl C) ceol_standout_glitch, "xhp" "xs" Standout not erased by overwriting (hp) eat_newline_glitch, "xenl" "xn" newline ignored after 80 cols (Concept) erase_overstrike, "eo" "eo" Can erase overstrikes with a blank generic_type, "gn" "gn" Generic line type (e.g. dialup, switch). hard_copy, "hc" "hc" Hardcopy terminal has_meta_key, "km" "km" Has a meta key (shift, sets parity bit) has_status_line, "hs" "hs" Has extra "status line" insert_null_glitch, "in" "in" Insert mode distinguishes nulls memory_above, "da" "da" Display may be retained above the screen memory_below, "db" "db" Display may be retained below the screen move_insert_mode, "mir" "mi" Safe to move while in insert mode move_standout_mode, "msgr" "ms" Safe to move in standout modes over_strike, "os" "os" Terminal overstrikes status_line_esc_ok, "eslok" "es" Escape can be used on the status line teleray_glitch, "xt" "xt" Tabs destructive, magic so char (t1061) tilde_glitch, "hz" "hz" Hazeltine; can't print ~'s transparent_underline, "ul" "ul" underline character overstrikes xon_xoff, "xon" "xo" Terminal uses xon/xoff handshaking # Add new Booleans before this line. --- end bool --- begin num columns, "cols" "co" Number of columns in a line init_tabs, "it" "it" Tabs initially every # spaces. lines, "lines" "li" Number of lines on screen or page lines_of_memory, "lm" "lm" Lines of memory if > lines. 0 => varies magic_cookie_glitch, "xmc" "sg" Number blank chars left by smso or rmso padding_baud_rate, "pb" "pb" Lowest baud rate where padding needed virtual_terminal, "vt" "vt" Virtual terminal number (CB/Unix) width_status_line, "wsl" "ws" # columns in status line # Add new numbers before this line. --- end num --- begin str back_tab, "cbt" "bt" Back tab (P) bell, "bel" "bl" Audible signal (bell) (P) carriage_return, "cr" "cr" Carriage return (P*) change_scroll_region, "csr" "cs" change to lines #1 thru #2 (vt100) (PG) clear_all_tabs, "tbc" "ct" Clear all tab stops. (P) clear_screen, "clear" "cl" Clear screen (P*) clr_eol, "el" "ce" Clear to end of line (P) clr_eos, "ed" "cd" Clear to end of display (P*) column_address, "hpa" "ch" Set cursor column (PG) command_character, "cmdch" "CC" Term. settable cmd char in prototype cursor_address, "cup" "cm" Cursor motion to row #1 col #2 (PG) cursor_down, "cud1" "do" Down one line cursor_home, "home" "ho" Home cursor (if no cup) cursor_invisible, "civis" "vi" Make cursor invisible cursor_left, "cub1" "le" Move cursor left one space. cursor_mem_address, "mrcup" "CM" Memory relative cursor addressing. cursor_normal, "cnorm" "ve" Make cursor appear normal (undo vs/vi) cursor_right, "cuf1" "nd" Non-destructive space (cursor right) cursor_to_ll, "ll" "ll" Last line, first column (if no cup) cursor_up, "cuu1" "up" Upline (cursor up) cursor_visible, "cvvis" "vs" Make cursor very visible delete_character, "dch1" "dc" Delete character (P*) delete_line, "dl1" "dl" Delete line (P*) dis_status_line, "dsl" "ds" Disable status line down_half_line, "hd" "hd" Half-line down (forward 1/2 linefeed) enter_alt_charset_mode, "smacs" "as" Start alternate character set (P) enter_blink_mode, "blink" "mb" Turn on blinking enter_bold_mode, "bold" "md" Turn on bold (extra bright) mode enter_ca_mode, "smcup" "ti" String to begin programs that use cup enter_delete_mode, "smdc" "dm" Delete mode (enter) enter_dim_mode, "dim" "mh" Turn on half-bright mode enter_insert_mode, "smir" "im" Insert mode (enter); enter_secure_mode, "invis" "mk" Turn on blank mode (chars invisible) enter_protected_mode, "prot" "mp" Turn on protected mode enter_reverse_mode, "rev" "mr" Turn on reverse video mode enter_standout_mode, "smso" "so" Begin stand out mode enter_underline_mode, "smul" "us" Start underscore mode erase_chars, "ech" "ec" Erase #1 characters (PG) exit_alt_charset_mode, "rmacs" "ae" End alternate character set (P) exit_attribute_mode, "sgr0" "me" Turn off all attributes exit_ca_mode, "rmcup" "te" String to end programs that use cup exit_delete_mode, "rmdc" "ed" End delete mode exit_insert_mode, "rmir" "ei" End insert mode; exit_standout_mode, "rmso" "se" End stand out mode exit_underline_mode, "rmul" "ue" End underscore mode flash_screen, "flash" "vb" Visible bell (may not move cursor) form_feed, "ff" "ff" Hardcopy terminal page eject (P*) from_status_line, "fsl" "fs" Return from status line init_1string, "is1" "i1" Terminal initialization string init_2string, "is2" "is" Terminal initialization string init_3string, "is3" "i2" Terminal initialization string init_file, "if" "if" Name of file containing is insert_character, "ich1" "ic" Insert character (P) insert_line, "il1" "al" Add new blank line (P*) insert_padding, "ip" "ip" Insert pad after character inserted (P*) key_backspace, "kbs" "kb" Sent by backspace key key_catab, "ktbc" "ka" Sent by clear-all-tabs key. key_clear, "kclr" "kC" Sent by clear screen or erase key. key_ctab, "kctab" "kt" Sent by clear-tab key key_dc, "kdch1" "kD" Sent by delete character key. key_dl, "kdl1" "kL" Sent by delete line key. key_down, "kcud1" "kd" Sent by terminal down arrow key key_eic, "krmir" "kM" Sent by rmir or smir in insert mode. key_eol, "kel" "kE" Sent by clear-to-end-of-line key. key_eos, "ked" "kS" Sent by clear-to-end-of-screen key. key_f0, "kf0" "k0" Sent by function key f0. key_f1, "kf1" "k1" Sent by function key f1. key_f10, "kf10" "k;" Sent by function key f10. key_f2, "kf2" "k2" Sent by function key f2. key_f3, "kf3" "k3" Sent by function key f3. key_f4, "kf4" "k4" Sent by function key f4. key_f5, "kf5" "k5" Sent by function key f5. key_f6, "kf6" "k6" Sent by function key f6. key_f7, "kf7" "k7" Sent by function key f7. key_f8, "kf8" "k8" Sent by function key f8. key_f9, "kf9" "k9" Sent by function key f9. key_home, "khome" "kh" Sent by home key. key_ic, "kich1" "kI" Sent by ins char/enter ins mode key. key_il, "kil1" "kA" Sent by insert line. key_left, "kcub1" "kl" Sent by terminal left arrow key key_ll, "kll" "kH" Sent by home-down key key_npage, "knp" "kN" Sent by next-page key key_ppage, "kpp" "kP" Sent by previous-page key key_right, "kcuf1" "kr" Sent by terminal right arrow key key_sf, "kind" "kF" Sent by scroll-forward/down key key_sr, "kri" "kR" Sent by scroll-backward/up key key_stab, "khts" "kT" Sent by set-tab key key_up, "kcuu1" "ku" Sent by terminal up arrow key keypad_local, "rmkx" "ke" Out of "keypad transmit" mode keypad_xmit, "smkx" "ks" Put terminal in "keypad transmit" mode lab_f0, "lf0" "l0" Labels on function key f0 if not f0 lab_f1, "lf1" "l1" Labels on function key f1 if not f1 lab_f10, "lf10" "la" Labels on function key f10 if not f10 lab_f2, "lf2" "l2" Labels on function key f2 if not f2 lab_f3, "lf3" "l3" Labels on function key f3 if not f3 lab_f4, "lf4" "l4" Labels on function key f4 if not f4 lab_f5, "lf5" "l5" Labels on function key f5 if not f5 lab_f6, "lf6" "l6" Labels on function key f6 if not f6 lab_f7, "lf7" "l7" Labels on function key f7 if not f7 lab_f8, "lf8" "l8" Labels on function key f8 if not f8 lab_f9, "lf9" "l9" Labels on function key f9 if not f9 meta_off, "rmm" "mo" Turn off "meta mode" meta_on, "smm" "mm" Turn on "meta mode" (8th bit) newline, "nel" "nw" Newline (behaves like cr followed by lf) pad_char, "pad" "pc" Pad character (rather than null) parm_dch, "dch" "DC" Delete #1 chars (PG*) parm_delete_line, "dl" "DL" Delete #1 lines (PG*) parm_down_cursor, "cud" "DO" Move cursor down #1 lines. (PG*) parm_ich, "ich" "IC" Insert #1 blank chars (PG*) parm_index, "indn" "SF" Scroll forward #1 lines. (PG) parm_insert_line, "il" "AL" Add #1 new blank lines (PG*) parm_left_cursor, "cub" "LE" Move cursor left #1 spaces (PG) parm_right_cursor, "cuf" "RI" Move cursor right #1 spaces. (PG*) parm_rindex, "rin" "SR" Scroll backward #1 lines. (PG) parm_up_cursor, "cuu" "UP" Move cursor up #1 lines. (PG*) pkey_key, "pfkey" "pk" Prog funct key #1 to type string #2 pkey_local, "pfloc" "pl" Prog funct key #1 to execute string #2 pkey_xmit, "pfx" "px" Prog funct key #1 to xmit string #2 print_screen, "mc0" "ps" Print contents of the screen prtr_off, "mc4" "pf" Turn off the printer prtr_on, "mc5" "po" Turn on the printer repeat_char, "rep" "rp" Repeat char #1 #2 times. (PG*) reset_1string, "rs1" "r1" Reset terminal completely to sane modes. reset_2string, "rs2" "r2" Reset terminal completely to sane modes. reset_3string, "rs3" "r3" Reset terminal completely to sane modes. reset_file, "rf" "rf" Name of file containing reset string. restore_cursor, "rc" "rc" Restore cursor to position of last sc. row_address, "vpa" "cv" Like hpa but sets row. (PG) save_cursor, "sc" "sc" Save cursor position. (P) scroll_forward, "ind" "sf" Scroll text up (P) scroll_reverse, "ri" "sr" Scroll text down (P) set_attributes, "sgr" "sa" Define the video attributes (PG9) set_tab, "hts" "st" Set a tab in all rows, current column. set_window, "wind" "wi" Current window is lines #1-#2 cols #3-#4 tab, "ht" "ta" Tab to next 8 space hardware tab stop. to_status_line, "tsl" "ts" Go to status line underline_char, "uc" "uc" Underscore one char and move past it up_half_line, "hu" "hu" Half-line up (reverse 1/2 linefeed) init_prog, "iprog" "iP" Path name of program for init. key_a1, "ka1" "K1" Upper left of keypad key_a3, "ka3" "K3" Upper right of keypad key_b2, "kb2" "K2" Center of keypad key_c1, "kc1" "K4" Lower left of keypad key_c3, "kc3" "K5" Lower right of keypad prtr_non, "mc5p" "pO" Turn on the printer for #1 bytes. # Add new strings before this line. --- end str E 1 h64913 s 00001/00001/00020 d D 3.2 87/05/13 18:37:00 build 4 3 c removed old SCCS strings and inserted #ident BB e s 00000/00000/00021 d D 3.1 87/01/20 18:49:09 mkm 3 2 c e s 00000/00000/00021 d D 2.1 87/01/20 18:39:48 mkm 2 1 c e s 00021/00000/00000 d D 1.1 87/01/20 18:31:10 mkm 1 0 c Placed under source control - mkm e u U f b f n t T I 1 D 4 /* " %W% %E% " */ E 4 I 4 #ident " %W% %E% " E 4 #include "curses.ext" cbreak() { #ifdef USG (cur_term->Nttyb).c_lflag &= ~ICANON; (cur_term->Nttyb).c_cc[VMIN] = 1; (cur_term->Nttyb).c_cc[VTIME] = 1; # ifdef DEBUG if(outf) fprintf(outf, "crmode(), file %x, SP %x, flags %x\n", SP->term_file, SP, cur_term->Nttyb.c_lflag); # endif #else (cur_term->Nttyb).sg_flags |= CBREAK; # ifdef DEBUG if(outf) fprintf(outf, "crmode(), file %x, SP %x, flags %x\n", SP->term_file, SP, cur_term->Nttyb.sg_flags); # endif #endif SP->fl_rawmode = TRUE; reset_prog_mode(); } E 1 h28011 s 00001/00001/00031 d D 3.2 87/05/13 18:37:11 build 4 3 c removed old SCCS strings and inserted #ident BB e s 00000/00000/00032 d D 3.1 87/01/20 18:49:10 mkm 3 2 c e s 00000/00000/00032 d D 2.1 87/01/20 18:39:50 mkm 2 1 c e s 00032/00000/00000 d D 1.1 87/01/20 18:31:11 mkm 1 0 c Placed under source control - mkm e u U f b f n t T I 1 D 4 /* " %W% %E% " */ E 4 I 4 #ident " %W% %E% " E 4 #include "curses.ext" extern int InputPending; /* * If it's been long enough, check to see if we have any typeahead * waiting. If so, we quit this update until next time. */ _chk_typeahead() { #ifdef FIONREAD # ifdef DEBUG if(outf) fprintf(outf, "end of _id_char: --SP->check_input %d, InputPending %d, chars buffered %d: ", SP->check_input-1, InputPending, (SP->term_file->_ptr-SP->term_file->_base)); # endif if(--SP->check_input<0 && !InputPending && ((SP->term_file->_ptr - SP->term_file->_base) > 20)) { __cflush(); if (SP->check_fd >= 0) ioctl(SP->check_fd, FIONREAD, &InputPending); else InputPending = 0; SP->check_input = SP->baud / 2400; # ifdef DEBUG if(outf) fprintf(outf, "flush, ioctl returns %d, SP->check_input set to %d\n", InputPending, SP->check_input); # endif } # ifdef DEBUG if(outf) fprintf(outf, ".\n"); # endif #endif } E 1 h37807 s 00001/00001/00015 d D 3.2 87/05/13 18:37:21 build 4 3 c removed old SCCS strings and inserted #ident BB e s 00000/00000/00016 d D 3.1 87/01/20 18:49:12 mkm 3 2 c e s 00000/00000/00016 d D 2.1 87/01/20 18:39:51 mkm 2 1 c e s 00016/00000/00000 d D 1.1 87/01/20 18:31:13 mkm 1 0 c Placed under source control - mkm e u U f b f n t T I 1 D 4 /* " %W% %E% " */ E 4 I 4 #ident " %W% %E% " E 4 # include "curses.ext" /* * This routine clears the _window. * */ wclear(win) reg WINDOW *win; { if (win == curscr) win = stdscr; werase(win); win->_clear = TRUE; return OK; } E 1 h46445 s 00001/00001/00018 d D 3.2 87/05/13 18:37:33 build 4 3 c removed old SCCS strings and inserted #ident BB e s 00000/00000/00019 d D 3.1 87/01/20 18:49:13 mkm 3 2 c e s 00000/00000/00019 d D 2.1 87/01/20 18:39:52 mkm 2 1 c e s 00019/00000/00000 d D 1.1 87/01/20 18:31:13 mkm 1 0 c Placed under source control - mkm e u U f b f n t T I 1 D 4 /* " %W% %E% " */ E 4 I 4 #ident " %W% %E% " E 4 #include "curses.ext" clearok(win,bf) WINDOW *win; int bf; { #ifdef DEBUG if (win == stdscr) fprintf("it's stdscr: "); if (win == curscr) fprintf("it's curscr: "); if (outf) fprintf(outf, "clearok(%x, %d)\n", win, bf); #endif if (win==curscr) SP->doclear = 1; else win->_clear = bf; } E 1 h19438 s 00001/00001/00145 d D 3.2 87/05/13 18:37:45 build 4 3 c removed old SCCS strings and inserted #ident BB e s 00000/00000/00146 d D 3.1 87/01/20 18:49:14 mkm 3 2 c e s 00000/00000/00146 d D 2.1 87/01/20 18:39:53 mkm 2 1 c e s 00146/00000/00000 d D 1.1 87/01/20 18:31:14 mkm 1 0 c Placed under source control - mkm e u U f b f n t T I 1 D 4 /* " %W% %E% " */ E 4 I 4 #ident " %W% %E% " E 4 #include "curses.ext" extern int _clearhl(); extern int _dellines(); extern int _inslines(); extern int _outch(); extern int _pos(); extern int _setwind(); extern int clreol(); extern char *tparm(); extern int tputs(); _clreol() { register int col; register struct line *cb; #ifdef DEBUG if(outf) fprintf(outf, "_clreol().\n"); #endif if (!move_standout_mode) _clearhl (); if (clr_eol) { tputs (clr_eol, columns-SP->phys_x, _outch); } else if (delete_line && insert_line && SP->phys_x == 0) { _dellines (1); _inslines (1); } else { /* * Should consider using delete/insert line here, too, * if the part that would have to be redrawn is short, * or if we have to get rid of some cemented highlights. * This might win on the DTC 382 or the Teleray 1061. */ cb = SP->cur_body[SP->phys_y+1]; for (col=SP->phys_x+1; collength; col++) if (cb->body[col] != ' ') { _pos(SP->phys_y, col); _blanks(1); } /* * Could save and restore SP->curptr position, but since we * keep track of what _blanks does to it, it turns out * that this is wasted. Not backspacing over the stuff * cleared out is a real win on a super dumb terminal. */ } } _inslines (n) { register int i; #ifdef DEBUG if(outf) fprintf(outf, "_inslines(%d).\n", n); #endif if (!move_standout_mode && SP->phys_gr) _clearhl(); if (SP->phys_y + n >= lines && clr_eos) { /* * Really quick -- clear to end of screen. */ tputs(clr_eos, lines-SP->phys_y, _outch); return; } /* * We are about to _shove something off the bottom of the screen. * Terminals with extra memory keep this around, and it might * show up again to haunt us later if we do a delete line or * scroll into it, or when we exit. So we clobber it now. We * might get better performance by somehow remembering that this * stuff is down there and worrying about it if/when we have to. * In particular, having to do this extra pair of SP->curptr motions * is a lose. */ if (memory_below) { int save; save = SP->phys_y; if (save_cursor && restore_cursor) tputs(save_cursor, 1, _outch); if (clr_eos) { _pos(lines-n, 0); tputs(clr_eos, n, _outch); } else { for (i=0; iphys_y == SP->des_top_mgn /* &&costSR 0; i--) { _pos(SP->phys_y, 0); tputs(scroll_reverse, 1, _outch); if (SP->ml_above > 0) SP->ml_above--; /* * If we are at the top of the screen, and the * terminal retains display above, then we * should try to clear to end of line. * Have to use CE since we don't remember what is * actually on the line. */ if (clr_eol && memory_above) tputs(clr_eol, 1, _outch); } } else if (parm_insert_line && (n>1 || *insert_line==0)) { tputs(tparm(parm_insert_line, n, SP->phys_y), lines-SP->phys_y, _outch); } else if (change_scroll_region && *insert_line==0) { /* vt100 change scrolling region to fake AL */ tputs(save_cursor, 1, _outch); tputs( tparm(change_scroll_region, SP->phys_y, SP->des_bot_mgn), 1, _outch); /* change_scroll_region homes stupid cursor */ tputs(restore_cursor, 1, _outch); for (i=n; i>0; i--) tputs(scroll_reverse, 1, _outch);/* should do @'s */ /* restore scrolling region */ tputs(tparm(change_scroll_region, SP->des_top_mgn, SP->des_bot_mgn), 1, _outch); tputs(restore_cursor, 1, _outch);/* Once again put it back */ SP->phys_top_mgn = SP->des_top_mgn; SP->phys_bot_mgn = SP->des_bot_mgn; } else { tputs(insert_line, lines - SP->phys_y, _outch); for (i = n - 1; i > 0; i--) { tputs(insert_line, lines - SP->phys_y, _outch); } } } E 1 h12405 s 00001/00001/00035 d D 3.2 87/05/13 18:37:59 build 4 3 c removed old SCCS strings and inserted #ident BB e s 00000/00000/00036 d D 3.1 87/01/20 18:49:16 mkm 3 2 c e s 00000/00000/00036 d D 2.1 87/01/20 18:39:56 mkm 2 1 c e s 00036/00000/00000 d D 1.1 87/01/20 18:31:15 mkm 1 0 c Placed under source control - mkm e u U f b f n t T I 1 D 4 /* " %W% %E% " */ E 4 I 4 #ident " %W% %E% " E 4 # include "curses.ext" /* * This routine erases everything on the window. * */ wclrtobot(win) reg WINDOW *win; { reg int y; reg chtype *sp, *end, *maxx; reg int startx, minx; startx = win->_curx; for (y = win->_cury; y < win->_maxy; y++) { minx = _NOCHANGE; end = &win->_y[y][win->_maxx]; for (sp = &win->_y[y][startx]; sp < end; sp++) if (*sp != ' ') { maxx = sp; if (minx == _NOCHANGE) minx = sp - win->_y[y]; *sp = ' '; } if (minx != _NOCHANGE) { if (win->_firstch[y] > minx || win->_firstch[y] == _NOCHANGE) win->_firstch[y] = minx; if (win->_lastch[y] < maxx - win->_y[y]) win->_lastch[y] = maxx - win->_y[y]; } startx = 0; } /* win->_curx = win->_cury = 0; */ } E 1 h27827 s 00001/00001/00039 d D 3.2 87/05/13 18:38:11 build 4 3 c removed old SCCS strings and inserted #ident BB e s 00000/00000/00040 d D 3.1 87/01/20 18:49:18 mkm 3 2 c e s 00000/00000/00040 d D 2.1 87/01/20 18:39:57 mkm 2 1 c e s 00040/00000/00000 d D 1.1 87/01/20 18:31:17 mkm 1 0 c Placed under source control - mkm e u U f b f n t T I 1 D 4 /* " %W% %E% " */ E 4 I 4 #ident " %W% %E% " E 4 # include "curses.ext" /* * This routine clears up to the end of line * */ wclrtoeol(win) reg WINDOW *win; { reg chtype *sp, *end; reg int y, x; reg chtype *maxx; reg int minx; y = win->_cury; x = win->_curx; end = &win->_y[y][win->_maxx]; minx = _NOCHANGE; maxx = &win->_y[y][x]; for (sp = maxx; sp < end; sp++) if (*sp != ' ') { maxx = sp; if (minx == _NOCHANGE) minx = sp - win->_y[y]; *sp = ' '; } /* * update firstch and lastch for the line */ # ifdef DEBUG if(outf) fprintf(outf, "CLRTOEOL: line %d minx = %d, maxx = %d, firstch = %d, lastch = %d, next firstch %d\n", y, minx, maxx - win->_y[y], win->_firstch[y], win->_lastch[y], win->_firstch[y+1]); # endif if (minx != _NOCHANGE) { if (win->_firstch[y] > minx || win->_firstch[y] == _NOCHANGE) win->_firstch[y] = minx; if (win->_lastch[y] < maxx - win->_y[y]) win->_lastch[y] = maxx - win->_y[y]; } } E 1 h12431 s 00001/00001/00031 d D 3.2 87/05/13 18:38:23 build 4 3 c removed old SCCS strings and inserted #ident BB e s 00000/00000/00032 d D 3.1 87/01/20 18:49:20 mkm 3 2 c e s 00000/00000/00032 d D 2.1 87/01/20 18:39:59 mkm 2 1 c e s 00032/00000/00000 d D 1.1 87/01/20 18:31:18 mkm 1 0 c Placed under source control - mkm e u U f b f n t T I 1 D 4 /* " %W% %E% " */ E 4 I 4 #ident " %W% %E% " E 4 #include "curses.ext" static counter = 0; /* ARGSUSED */ _countchar(ch) char ch; { counter++; } /* * Figure out the _cost in characters to print this string. * Due to padding, we can't just use strlen, so instead we * feed it through tputs and trap the results. * Even if the terminal uses xon/xoff handshaking, count the * pad chars here since they estimate the real time to do the * operation, useful in calculating costs. */ _cost_fn(str, affcnt) char *str; { int save_xflag = xon_xoff; if (str == NULL) return INFINITY; counter = 0; xon_xoff = 0; tputs(str, affcnt, _countchar); xon_xoff = save_xflag; return counter; } E 1 h27070 s 00001/00001/00006 d D 3.2 87/05/13 18:38:34 build 4 3 c removed old SCCS strings and inserted #ident BB e s 00000/00000/00007 d D 3.1 87/01/20 18:49:21 mkm 3 2 c e s 00000/00000/00007 d D 2.1 87/01/20 18:40:00 mkm 2 1 c e s 00007/00000/00000 d D 1.1 87/01/20 18:31:18 mkm 1 0 c Placed under source control - mkm e u U f b f n t T I 1 D 4 /* " %W% %E% " */ E 4 I 4 #ident " %W% %E% " E 4 #include "curses.ext" crmode() { cbreak(); } E 1 h56213 s 00001/00001/00025 d D 3.2 87/05/13 18:38:46 build 4 3 c removed old SCCS strings and inserted #ident BB e s 00000/00000/00026 d D 3.1 87/01/20 18:49:22 mkm 3 2 c e s 00000/00000/00026 d D 2.1 87/01/20 18:40:01 mkm 2 1 c e s 00026/00000/00000 d D 1.1 87/01/20 18:31:19 mkm 1 0 c Placed under source control - mkm e u U f b f n t T I 1 D 4 /* " %W% %E% " */ E 4 I 4 #ident " %W% %E% " E 4 /* * Define global variables * */ # include "curses.ext" char *Def_term = "unknown"; /* default terminal type */ WINDOW *stdscr, *curscr; int LINES, COLS; struct screen *SP; char *curses_version = "Packaged for USG UNIX 6.0, 3/6/83"; # ifdef DEBUG FILE *outf; /* debug output file */ # endif struct term _first_term; struct term *cur_term = &_first_term; WINDOW *lwin; int _endwin = FALSE; int tputs(); E 1 h33764 s 00000/00000/00018 d D 3.1 87/01/20 18:49:24 mkm 3 2 c e s 00000/00000/00018 d D 2.1 87/01/20 18:40:03 mkm 2 1 c e s 00018/00000/00000 d D 1.1 87/01/20 18:31:20 mkm 1 0 c Placed under source control - mkm e u U f b f n t T I 1 /* * External variables for the library * * " %W% %E% " */ /* LINTLIBRARY */ # define CURSES /* We are internal to curses */ # ifdef NONSTANDARD # include "RecStruct.h" # include "VTio.h" # endif ITC # include # include # include "curshdr.h" E 1 h36677 s 00001/00001/00109 d D 3.2 87/05/13 18:38:58 build 4 3 c removed old SCCS strings and inserted #ident BB e s 00000/00000/00110 d D 3.1 87/01/20 18:49:26 mkm 3 2 c e s 00000/00000/00110 d D 2.1 87/01/20 18:40:04 mkm 2 1 c e s 00110/00000/00000 d D 1.1 87/01/20 18:31:21 mkm 1 0 c Placed under source control - mkm e u U f b f n t T I 1 D 4 /* " %W% %E% " */ E 4 I 4 #ident " %W% %E% " E 4 /*LINTLIBRARY*/ /* * IC and IL overheads and costs should be set to this * value if the corresponding feature is missing */ #define INFINITY 500 struct line { int hash; /* hash value for this line, 0 if not known */ struct line *next; /* pointer to the next line in list of lines */ short bodylen; /* the cost of redrawing this line */ short length; /* the number of valid characters in line */ chtype *body; /* the actual text of the line */ }; struct costs { short Cursor_address; short Cursor_home; short Carriage_return; short Tab; short Back_tab; short Cursor_left; short Cursor_right; /* current cost, which is 1 unless in insert * mode, since you can just output the * character you want to move over */ short Right_base; /* actual cost to do cursor_right */ short Cursor_down; short Cursor_up; short Parm_left_cursor; short Parm_right_cursor; short Parm_up_cursor; short Parm_down_cursor; short Column_address; short Row_address; unsigned ilvar; /* Insert line varying part * 32 */ int ilfixed; /* Insert line fixed overhead */ unsigned dlvar; /* Delete line varying part * 32 */ int dlfixed; /* Delete line fixed overhead */ unsigned icvar; /* Insert char varying part * 32 */ int icfixed; /* Insert char fixed overhead */ unsigned dcvar; /* Delete char varying part * 32 */ int dcfixed; /* Delete char fixed overhead */ /* Should have costs for delete char/delete line here too. */ }; #define _cost(field) (SP->term_costs.field) struct map { char label[16]; /* Text the key is labelled with */ char sends[16]; /* Characters sent when key is pressed */ short keynum; /* "char" we pass back to program */ }; struct screen { unsigned fl_nonl : 1; /* we shouldn't output \n */ unsigned fl_uppercase : 1; /* upper case terminal */ unsigned fl_normtty : 1; /* currently in normal tty mode */ unsigned fl_my_term : 1; /* user names his terminal type */ unsigned fl_echoit : 1; /* in software echo mode */ unsigned fl_rawmode : 1; /* in raw or cbreak mode */ unsigned fl_endwin : 1; /* has called endwin */ unsigned phys_irm : 1; /* physically in insert char mode */ unsigned virt_irm : 1; /* want to be in insert char mode */ unsigned fl_nodelay : 1; /* tty is in nodelay mode */ struct line **cur_body; /* physical screen image */ struct line **std_body; /* desired screen image */ struct line *freelist; /* free space list */ short phys_x; /* physical cursor X position */ short phys_y; /* physical cursor Y position */ short virt_x; /* virtual cursor X position */ short virt_y; /* virtual cursor Y position */ short phys_top_mgn; /* physical top margin of scrolling region */ short phys_bot_mgn; /* physical bottom margin of scrolling region */ short des_top_mgn; /* desired top margin of scrolling region */ short des_bot_mgn; /* desired bottom margin of scrolling region */ chtype *curptr; /* pointer to cursor */ chtype virt_gr; /* desired highlight state */ chtype phys_gr; /* current highlight state */ short winsize; /* no. of lines on which ID operations done */ short doclear; /* flag to say whether screen garbaged */ short baud; /* baud rate of this tty */ short check_input; /* flag for input check */ short check_fd; /* file descriptor for input check */ struct _win_st *std_scr;/* primary output screen */ struct _win_st *cur_scr;/* what's physically on the screen */ struct term *tcap; /* TERMCAP strings and storage space */ struct costs term_costs;/* costs of various capabilities */ short kp_state; /* 1 iff keypad is on, else 0 */ short ml_above; /* # memory lines above top of screen */ #ifndef NONSTANDARD SGTTY save_tty_buf; /* current state of this tty */ FILE *term_file; /* File to write on for output. */ #endif NONSTANDARD #ifdef KEYPAD struct map *kp; /* keypad map */ #endif KEYPAD short *input_queue; /* a place to put stuff ungetc'ed */ FILE *input_file; /* Where to get keyboard input */ }; #ifndef NONSTANDARD extern struct screen *SP; #endif #ifdef DEBUG extern FILE *outf; #endif E 1 h42384 s 00001/00001/00014 d D 3.2 87/05/13 18:39:09 build 4 3 c removed old SCCS strings and inserted #ident BB e s 00000/00000/00015 d D 3.1 87/01/20 18:49:28 mkm 3 2 c e s 00000/00000/00015 d D 2.1 87/01/20 18:40:06 mkm 2 1 c e s 00015/00000/00000 d D 1.1 87/01/20 18:31:22 mkm 1 0 c Placed under source control - mkm e u U f b f n t T I 1 D 4 /* " %W% %E% " */ E 4 I 4 #ident " %W% %E% " E 4 #include "curses.h" #include "term.h" extern struct term *cur_term; def_prog_mode() { #ifdef USG ioctl(cur_term -> Filedes, TCGETA, &(cur_term->Nttyb)); #else ioctl(cur_term -> Filedes, TIOCGETP, &(cur_term->Nttyb)); #endif } E 1 h27977 s 00001/00001/00033 d D 3.2 87/05/13 18:39:20 build 4 3 c removed old SCCS strings and inserted #ident BB e s 00000/00000/00034 d D 3.1 87/01/20 18:49:30 mkm 3 2 c e s 00000/00000/00034 d D 2.1 87/01/20 18:40:08 mkm 2 1 c e s 00034/00000/00000 d D 1.1 87/01/20 18:31:23 mkm 1 0 c Placed under source control - mkm e u U f b f n t T I 1 D 4 /* " %W% %E% " */ E 4 I 4 #ident " %W% %E% " E 4 #include "curses.h" #include "term.h" extern struct term *cur_term; /* * Getting the baud rate is different on the two systems. * In either case, a baud rate of 0 hangs up the phone. * Since things are often initialized to 0, getting the phone * hung up on you is a common result of a bug in your program. * This is not very friendly, so if the baud rate is 0, we * assume we're doing a reset_xx_mode with no def_xx_mode, and * just don't do anything. */ #ifdef USG #define BR(x) (cur_term->x.c_cflag&CBAUD) #else #define BR(x) (cur_term->x.sg_ispeed) #endif def_shell_mode() { #ifdef USG ioctl(cur_term -> Filedes, TCGETA, &(cur_term->Ottyb)); #else ioctl(cur_term -> Filedes, TIOCGETP, &(cur_term->Ottyb)); #endif /* This is a useful default for Nttyb, too */ if (BR(Nttyb) == 0) cur_term -> Nttyb = cur_term -> Ottyb; } E 1 h52857 s 00001/00001/00030 d D 3.2 87/05/13 18:39:33 build 4 3 c removed old SCCS strings and inserted #ident BB e s 00000/00000/00031 d D 3.1 87/01/20 18:49:31 mkm 3 2 c e s 00000/00000/00031 d D 2.1 87/01/20 18:40:09 mkm 2 1 c e s 00031/00000/00000 d D 1.1 87/01/20 18:31:24 mkm 1 0 c Placed under source control - mkm e u U f b f n t T I 1 D 4 /* " %W% %E% " */ E 4 I 4 #ident " %W% %E% " E 4 /* * Code for various kinds of delays. Most of this is nonportable and * requires various enhancements to the operating system, so it won't * work on all systems. It is included in curses to provide a portable * interface, and so curses itself can use it for function keys. */ #include "curses.ext" #include /* * Delay the output for ms milliseconds. * Note that this is NOT the same as a high resolution sleep. It will * cause a delay in the output but will not necessarily suspend the * processor. For applications needing to sleep for 1/10th second, * this is not a usable substitute. It causes a pause in the displayed * output, for example, for the eye wink in snake. It is disrecommended * for "delay" to be much more than 1/2 second, especially at high * baud rates, because of all the characters it will output. Note * that due to system delays, the actual pause could be even more. * Some games won't work decently with this routine. */ delay_output(ms) int ms; { extern int _outchar(); /* it's in putp.c */ return _delay(ms*10, _outchar); } E 1 h02959 s 00001/00001/00025 d D 3.2 87/05/13 18:39:45 build 4 3 c removed old SCCS strings and inserted #ident BB e s 00000/00000/00026 d D 3.1 87/01/20 18:49:32 mkm 3 2 c e s 00000/00000/00026 d D 2.1 87/01/20 18:40:11 mkm 2 1 c e s 00026/00000/00000 d D 1.1 87/01/20 18:31:25 mkm 1 0 c Placed under source control - mkm e u U f b f n t T I 1 D 4 /* " %W% %E% " */ E 4 I 4 #ident " %W% %E% " E 4 # include "curses.ext" /* * This routine performs an delete-char on the line, leaving * (_cury,_curx) unchanged. * */ wdelch(win) reg WINDOW *win; { reg chtype *temp1, *temp2; reg chtype *end; end = &win->_y[win->_cury][win->_maxx - 1]; temp2 = &win->_y[win->_cury][win->_curx + 1]; temp1 = temp2 - 1; while (temp1 < end) *temp1++ = *temp2++; *temp1 = ' '; win->_lastch[win->_cury] = win->_maxx - 1; if (win->_firstch[win->_cury] == _NOCHANGE || win->_firstch[win->_cury] > win->_curx) win->_firstch[win->_cury] = win->_curx; return OK; } E 1 h60876 s 00001/00001/00025 d D 3.2 87/05/13 18:39:57 build 4 3 c removed old SCCS strings and inserted #ident BB e s 00000/00000/00026 d D 3.1 87/01/20 18:49:34 mkm 3 2 c e s 00000/00000/00026 d D 2.1 87/01/20 18:40:12 mkm 2 1 c e s 00026/00000/00000 d D 1.1 87/01/20 18:31:26 mkm 1 0 c Placed under source control - mkm e u U f b f n t T I 1 D 4 /* " %W% %E% " */ E 4 I 4 #ident " %W% %E% " E 4 #include "curses.h" /* * This routine deletes a line from the screen. It leaves * (_cury,_curx) unchanged. * */ wdeleteln(win) reg WINDOW *win; { reg chtype *temp; reg int y; reg chtype *end; temp = win->_y[win->_cury]; for (y = win->_cury; y < win->_maxy; y++) { win->_y[y] = win->_y[y+1]; win->_firstch[y] = 0; win->_lastch[y] = win->_maxx - 1; } for (end = &temp[win->_maxx]; temp < end; ) *temp++ = ' '; win->_y[win->_maxy-1] = temp - win->_maxx; } E 1 h46829 s 00001/00001/00017 d D 3.2 87/05/13 18:40:09 build 4 3 c removed old SCCS strings and inserted #ident BB e s 00000/00000/00018 d D 3.1 87/01/20 18:49:36 mkm 3 2 c e s 00000/00000/00018 d D 2.1 87/01/20 18:40:14 mkm 2 1 c e s 00018/00000/00000 d D 1.1 87/01/20 18:31:27 mkm 1 0 c Placed under source control - mkm e u U f b f n t T I 1 D 4 /* " %W% %E% " */ E 4 I 4 #ident " %W% %E% " E 4 # include "curses.ext" /* * This routine deletes a _window and releases it back to the system. * */ delwin(win) reg WINDOW *win; { reg int i; if (!(win->_flags & _SUBWIN)) for (i = 0; i < win->_maxy && win->_y[i]; i++) cfree((char *) win->_y[i]); cfree((char *) win->_y); cfree((char *) win); } E 1 h25735 s 00001/00001/00588 d D 3.2 87/05/13 18:40:26 build 4 3 c removed old SCCS strings and inserted #ident BB e s 00000/00000/00589 d D 3.1 87/01/20 18:49:38 mkm 3 2 c e s 00000/00000/00589 d D 2.1 87/01/20 18:40:15 mkm 2 1 c e s 00589/00000/00000 d D 1.1 87/01/20 18:31:28 mkm 1 0 c Placed under source control - mkm e u U f b f n t T I 1 D 4 /* " %W% %E% " */ E 4 I 4 #ident " %W% %E% " E 4 /* * Alas, doprnt is not documented, so people feel they have license to * change the parameters. The 3B implementation does not even look * callable from C, and without documentation is not comprehensible. * Since many systems have their own doprnt which is written in assembly * language, and thus faster, but callable from C, we try to use the * standard system version where possible. The ifdefs below attempt * to decide where it is possible - it may need to be updated later. */ #ifdef u3b #define NEEDDOPRNT #endif #ifdef NEEDDOPRNT /*LINTLIBRARY*/ /* * _doprnt: common code for printf, fprintf, sprintf */ #include #include #include #include /* Maximum number of digits in any integer representation */ #define MAXDIGS 11 /* Maximum total number of digits in E format */ #define MAXECVT 17 /* Maximum number of digits after decimal point in F format */ #define MAXFCVT 60 /* Maximum significant figures in a floating-point number */ #define MAXFSIG 17 /* Maximum number of characters in an exponent */ #if u3b #define MAXESIZ 5 #else #define MAXESIZ 4 #endif /* Maximum (positive) exponent */ #if u3b #define MAXEXP 310 #else #define MAXEXP 40 #endif /* Data type for flags */ typedef char bool; /* Convert a digit character to the corresponding number */ #define tonumber(x) ((x)-'0') /* Convert a number between 0 and 9 to the corresponding digit */ #define todigit(x) ((x)+'0') /* Max and Min macros */ #define max(a,b) ((a) > (b)? (a): (b)) #define min(a,b) ((a) < (b)? (a): (b)) /* end of print.h */ static char * memcpy(dest, src, n) register char *dest, *src; register int n; { register char *rv = dest; while (n--) *dest++ = *src++; return rv; } #define PUT(p, n) if (n == 1) (void) putc(*p, iop); \ else if (iop->_file == _NFILE) \ iop->_ptr = (unsigned char *) \ memcpy((char *)iop->_ptr, p, n) +n; \ else (void) fwrite(p, 1, n, iop) /* * C-Library routines for floating conversion */ extern char *fcvt(), *ecvt(); extern int strlen(), fwrite(); int _doprnt(format, args, iop) register char *format; va_list args; register FILE *iop; { /* This variable counts output characters. */ int count = 0; /* Starting and ending points for value to be printed */ register char *bp, *p; /* Field width and precision */ int width, prec; /* Format code */ register int fcode; /* Number of padding zeroes required on the left and right */ int lzero, rzero; /* Flags - nonzero if corresponding character is in format */ int length; /* l */ int fplus; /* + */ int fminus; /* - */ int fblank; /* blank */ int fsharp; /* # */ /* Values are developed in this buffer */ char buf[max(MAXDIGS, 1+max(MAXFCVT+MAXEXP, MAXECVT))]; /* Pointer to sign, "0x", "0X", or empty */ char *prefix; /* Exponent or empty */ char *suffix; /* Buffer to create exponent */ char expbuf[MAXESIZ + 1]; /* The value being converted, if integer */ long val; /* The value being converted, if real */ double dval; /* Output values from fcvt and ecvt */ int decpt, sign; /* Pointer to a translate table for digits of whatever radix */ char *tab; /* Work variables */ int k, n, hradix, lowbit; expbuf[MAXESIZ] = '\0'; /* * The main loop -- this loop goes through one iteration * for each string of ordinary characters or format specification. */ for ( ; ; ) { for (bp = format; (fcode = *format) != '\0' && fcode != '%'; format++) ; if (n = format - bp) { /* ordinary non-% characters */ count += n; PUT(bp, n); } if (fcode == '\0') /* end of format; normal return */ return (ferror(iop) ? EOF : count); /* * % has been found. * First, parse the format specification. */ fplus = fminus = fblank = fsharp = lzero = 0; for ( ; ; ) { /* Scan the */ switch (fcode = *++format) { case '+': fplus++; continue; case '-': fminus++; continue; case ' ': fblank++; continue; case '#': fsharp++; continue; } break; } /* Scan the field width */ if (fcode == '*') { width = va_arg(args, int); if (width < 0) { width = -width; fminus++; } format++; } else { if (fcode == '0') /* obsolescent spec. */ lzero++; /* pad with leading zeros */ for (width = 0; isdigit(fcode = *format); format++) width = width * 10 + tonumber(fcode); } /* Scan the precision */ if (*format != '.') prec = lzero ? width : -1; else if (*++format == '*') { /* '*' instead of digits? */ prec = va_arg(args, int); format++; } else for (prec = 0; isdigit(fcode = *format); format++) prec = prec * 10 + tonumber(fcode); /* Scan the length modifier */ length = 0; switch (*format) { case 'l': length++; /* No break */ case 'h': format++; } /* * The character addressed by format must be * the format letter -- there is nothing * left for it to be. * * The status of the +, -, #, and blank * flags are reflected in the variables * "fplus", "fminus", "fsharp", and * "fblank". "width" and "prec" contain * numbers corresponding to the digit * strings before and after the decimal * point, respectively. If there was no * decimal point, "prec" is -1. * * The following switch sets things up * for printing. What ultimately gets * printed will be padding blanks, a * prefix, left padding zeroes, a value, * right padding zeroes, a suffix, and * more padding blanks. Padding blanks * will not appear simultaneously on both * the left and the right. Each case in * this switch will compute the value, and * leave in several variables the informa- * tion necessary to construct what is to * be printed. * * The prefix is a sign, a blank, "0x", * "0X", or null, and is addressed by * "prefix". * * The suffix is either null or an * exponent, and is addressed by "suffix". * * The value to be printed starts at "bp" * and continues up to and not including * "p". * * "lzero" and "rzero" will contain the * number of padding zeroes required on * the left and right, respectively. If * either of these variables is negative, * it will be treated as if it were zero. * * The number of padding blanks, and * whether they go on the left or the * right, will be computed on exit from * the switch. */ prefix = ""; suffix = &expbuf[MAXESIZ]; lzero = rzero = 0; switch (fcode = *format++) { /* * fixed point representations * * "hradix" is half the radix for the * conversion. Conversion is unsigned * unless fcode is 'd'. HIBITL is 100...000 * binary, and is equal to the maximum * negative number. * We assume a 2's complement machine */ case 'd': case 'u': hradix = 10/2; goto fixed; case 'o': hradix = 8/2; goto fixed; case 'X': case 'x': hradix = 16/2; fixed: /* Establish default precision */ if (prec < 0) prec = 1; /* Fetch the argument to be printed */ if(length) val = va_arg(args, long); else if(fcode == 'd') val = va_arg(args, int); else val = va_arg(args, unsigned); /* If signed conversion, make sign */ if(fcode == 'd') { if(val < 0) { prefix = "-"; /* * Negate, checking in * advance for possible * overflow. */ if(val != HIBITL) val = -val; } else if (fplus) prefix = "+"; else if (fblank) prefix = " "; } /* Set translate table for digits */ tab = (fcode == 'X') ? "0123456789ABCDEF" : "0123456789abcdef"; /* Develop the digits of the value */ p = bp = buf + MAXDIGS; while (val != 0) { lowbit = val & 1; val = (val >> 1) & ~HIBITL; *--bp = tab[val % hradix * 2 + lowbit]; val /= hradix; } /* Calculate padding zero requirement */ lzero = bp - p + prec; /* Handle the # flag */ if (fsharp && bp != p) switch (fcode) { case 'o': if (lzero < 1) lzero = 1; break; case 'x': prefix = "0x"; break; case 'X': prefix = "0X"; break; } break; case 'E': case 'e': /* * E-format. The general strategy * here is fairly easy: we take * what ecvt gives us and re-format it. */ /* Establish default precision */ if (prec < 0) prec = 6; /* Fetch the value */ dval = va_arg(args, double); /* Develop the mantissa */ bp = ecvt(dval, min(prec + 1, MAXECVT), &decpt, &sign); /* Determine the prefix */ e_merge: if (sign) prefix = "-"; else if (fplus) prefix = "+"; else if (fblank) prefix = " "; /* Place the first digit in the buffer*/ p = &buf[0]; *p++ = (*bp != '\0') ? *bp++ : '0'; /* Put in a decimal point if needed */ if (prec != 0 || fsharp) *p++ = '.'; /* Create the rest of the mantissa */ for (rzero = prec; rzero > 0 && *bp != '\0'; --rzero) *p++ = *bp++; bp = &buf[0]; /* Create the exponent */ if (dval != 0) { n = decpt - 1; if (n < 0) n = -n; for ( ; n != 0; n /= 10) *--suffix = todigit(n % 10); } /* Prepend leading zeroes to the exponent */ while (suffix > &expbuf[MAXESIZ - 2]) *--suffix = '0'; /* Put in the exponent sign */ *--suffix = (decpt > 0 || dval == 0) ? '+' : '-'; /* Put in the e */ *--suffix = isupper(fcode) ? 'E' : 'e'; break; case 'f': /* * F-format floating point. This is a * good deal less simple than E-format. * The overall strategy will be to call * fcvt, reformat its result into buf, * and calculate how many trailing * zeroes will be required. There will * never be any leading zeroes needed. */ /* Establish default precision */ if (prec < 0) prec = 6; /* Fetch the value */ dval = va_arg(args, double); /* Do the conversion */ bp = fcvt(dval, min(prec, MAXFCVT), &decpt, &sign); /* Determine the prefix */ f_merge: if (sign && decpt > -prec && *bp != '0') prefix = "-"; else if (fplus) prefix = "+"; else if (fblank) prefix = " "; /* Initialize buffer pointer */ p = &buf[0]; /* Emit the digits before the decimal point */ n = decpt; k = 0; do { *p++ = (n <= 0 || *bp == '\0' || k >= MAXFSIG) ? '0' : (k++, *bp++); } while (--n > 0); /* Decide whether we need a decimal point */ if (fsharp || prec > 0) *p++ = '.'; /* Digits (if any) after the decimal point */ n = min(prec, MAXFCVT); rzero = prec - n; while (--n >= 0) *p++ = (++decpt <= 0 || *bp == '\0' || k >= MAXFSIG) ? '0' : (k++, *bp++); bp = &buf[0]; break; case 'G': case 'g': /* * g-format. We play around a bit * and then jump into e or f, as needed. */ /* Establish default precision */ if (prec < 0) prec = 6; /* Fetch the value */ dval = va_arg(args, double); /* Do the conversion */ bp = ecvt(dval, min(prec, MAXECVT), &decpt, &sign); if (dval == 0) decpt = 1; k = prec; if (!fsharp) { n = strlen(bp); if (n < k) k = n; while (k >= 1 && bp[k-1] == '0') --k; } if (decpt < -3 || decpt > prec) { prec = k - 1; goto e_merge; } prec = k - decpt; goto f_merge; /* case '%': */ default: buf[0] = fcode; goto c_merge; case 'c': buf[0] = va_arg(args, int); c_merge: p = (bp = &buf[0]) + 1; break; case 's': p = bp = va_arg(args, char *); if (prec < 0) p += strlen(bp); else { /* a strnlen function would be useful here! */ while (*p++ != '\0' && --prec >= 0) ; --p; } break; case '\0': /* unexpected end of format; return error */ return (EOF); } /* Calculate number of padding blanks */ if (lzero < 0) lzero = 0; if (rzero < 0) rzero = 0; k = (n = p - bp) + lzero + rzero + (prefix[0] == '\0' ? 0 : prefix[1] == '\0' ? 1 : 2) + (&expbuf[MAXESIZ] - suffix); count += (width > k) ? width : k; /* Blanks on left if required */ if (!fminus) while (--width >= k) (void) putc(' ', iop); /* Prefix, if any */ while (*prefix != '\0') (void) putc(*prefix++, iop); /* Zeroes on the left */ while (--lzero >= 0) (void) putc('0', iop); /* The value itself */ if (n > 0) PUT(bp, n); /* Zeroes on the right */ while (--rzero >= 0) (void) putc('0', iop); /* The suffix */ while (*suffix != '\0') (void) putc(*suffix++, iop); /* Blanks on the right if required */ while (--width >= k) (void) putc(' ', iop); } } #else /* This is just to keep from getting a diagnostic from ranlib. */ __dpdummy__() { } #endif NEEDDOPRNT E 1 h60014 s 00001/00001/00255 d D 3.2 87/05/13 18:40:42 build 4 3 c removed old SCCS strings and inserted #ident BB e s 00000/00000/00256 d D 3.1 87/01/20 18:49:42 mkm 3 2 c e s 00000/00000/00256 d D 2.1 87/01/20 18:40:19 mkm 2 1 c e s 00256/00000/00000 d D 1.1 87/01/20 18:31:31 mkm 1 0 c Placed under source control - mkm e u U f b f n t T I 1 D 4 /* " %W% %E% " */ E 4 I 4 #ident " %W% %E% " E 4 /* * Alas, doscan is not documented, so people feel they have license to * change the parameters. The 3B implementation does not even look * callable from C, and without documentation is not comprehensible. * Since many systems have their own doprnt which is written in assembly * language, and thus faster, but callable from C, we try to use the * standard system version where possible. The ifdefs below attempt * to decide where it is possible - it may need to be updated later. */ #ifdef u3b #define NEEDDOSCAN #endif #ifdef NEEDDOSCAN /*LINTLIBRARY*/ #include #include #include #include #define NCHARS (1 << BITSPERBYTE) extern double atof(); extern char *memset(); extern int ungetc(); int _doscan(iop, fmt, va_alist) register FILE *iop; register unsigned char *fmt; va_list va_alist; { extern unsigned char *setup(); char tab[NCHARS]; register int ch; int nmatch = 0, len, inchar, stow, size; /******************************************************* * Main loop: reads format to determine a pattern, * and then goes to read input stream * in attempt to match the pattern. *******************************************************/ for( ; ; ) { if((ch = *fmt++) == '\0') return(nmatch); /* end of format */ if(isspace(ch)) { while(isspace(inchar = getc(iop))) ; if(ungetc(inchar, iop) != EOF) continue; break; } if(ch != '%' || (ch = *fmt++) == '%') { if((inchar = getc(iop)) == ch) continue; if(ungetc(inchar, iop) != EOF) return(nmatch); /* failed to match input */ break; } if(ch == '*') { stow = 0; ch = *fmt++; } else stow = 1; for(len = 0; isdigit(ch); ch = *fmt++) len = len * 10 + ch - '0'; if(len == 0) len = MAXINT; if((size = ch) == 'l' || size == 'h') ch = *fmt++; if(ch == '\0' || ch == '[' && (fmt = setup(fmt, tab)) == NULL) return(EOF); /* unexpected end of format */ if(isupper(ch)) { /* no longer documented */ size = 'l'; ch = _tolower(ch); } if(ch != 'c' && ch != '[') { while(isspace(inchar = getc(iop))) ; if(ungetc(inchar, iop) == EOF) break; } if((size = (ch == 'c' || ch == 's' || ch == '[') ? string(stow, ch, len, tab, iop, &va_alist) : number(stow, ch, len, size, iop, &va_alist)) != 0) nmatch += stow; if(va_alist == NULL) /* end of input */ break; if(size == 0) return(nmatch); /* failed to match input */ } return(nmatch != 0 ? nmatch : EOF); /* end of input */ } /*************************************************************** * Functions to read the input stream in an attempt to match incoming * data to the current pattern from the main loop of _doscan(). ***************************************************************/ static int number(stow, type, len, size, iop, listp) int stow, type, len, size; register FILE *iop; va_list *listp; { char numbuf[64]; register char *np = numbuf; register int c, base; int digitseen = 0, dotseen = 0, expseen = 0, floater = 0, negflg = 0; long lcval = 0; switch(type) { case 'e': case 'f': case 'g': floater++; case 'd': case 'u': base = 10; break; case 'o': base = 8; break; case 'x': base = 16; break; default: return(0); /* unrecognized conversion character */ } switch(c = getc(iop)) { case '-': negflg++; case '+': /* fall-through */ len--; c = getc(iop); } for( ; --len >= 0; *np++ = c, c = getc(iop)) { if(isdigit(c) || base == 16 && isxdigit(c)) { int digit = c - (isdigit(c) ? '0' : isupper(c) ? 'A' - 10 : 'a' - 10); if(digit >= base) break; if(stow && !floater) lcval = base * lcval + digit; digitseen++; continue; } if(!floater) break; if(c == '.' && !dotseen++) continue; if((c == 'e' || c == 'E') && digitseen && !expseen++) { *np++ = c; c = getc(iop); if(isdigit(c) || c == '+' || c == '-') continue; } break; } if(stow && digitseen) if(floater) { register double dval; *np = '\0'; dval = atof(numbuf); if(negflg) dval = -dval; if(size == 'l') *va_arg(*listp, double *) = dval; else *va_arg(*listp, float *) = (float)dval; } else { /* suppress possible overflow on 2's-comp negation */ if(negflg && lcval != HIBITL) lcval = -lcval; if(size == 'l') *va_arg(*listp, long *) = lcval; else if(size == 'h') *va_arg(*listp, short *) = (short)lcval; else *va_arg(*listp, int *) = (int)lcval; } if(ungetc(c, iop) == EOF) *listp = NULL; /* end of input */ return(digitseen); /* successful match if non-zero */ } static int string(stow, type, len, tab, iop, listp) register int stow, type, len; register char *tab; register FILE *iop; va_list *listp; { register int ch; register char *ptr; char *start; start = ptr = stow ? va_arg(*listp, char *) : NULL; if(type == 'c' && len == MAXINT) len = 1; while((ch = getc(iop)) != EOF && !(type == 's' && isspace(ch) || type == '[' && tab[ch])) { if(stow) *ptr = ch; ptr++; if(--len <= 0) break; } if(ch == EOF || len > 0 && ungetc(ch, iop) == EOF) *listp = NULL; /* end of input */ if(ptr == start) return(0); /* no match */ if(stow && type != 'c') *ptr = '\0'; return(1); /* successful match */ } static unsigned char * setup(fmt, tab) register unsigned char *fmt; register char *tab; { register int b, c, d, t = 0; if(*fmt == '^') { t++; fmt++; } (void)memset(tab, !t, NCHARS); if((c = *fmt) == ']' || c == '-') { /* first char is special */ tab[c] = t; fmt++; } while((c = *fmt++) != ']') { if(c == '\0') return(NULL); /* unexpected end of format */ if(c == '-' && (d = *fmt) != ']' && (b = fmt[-2]) < d) { (void)memset(&tab[b], t, d - b); fmt++; } else tab[c] = t; } return(fmt); } #else /* This is just to keep from getting a diagnostic from ranlib. */ __dsdummy__() { } #endif NEEDDOSCAN E 1 h50734 s 00001/00001/00065 d D 3.2 87/05/13 18:40:55 build 4 3 c removed old SCCS strings and inserted #ident BB e s 00000/00000/00066 d D 3.1 87/01/20 18:49:44 mkm 3 2 c e s 00000/00000/00066 d D 2.1 87/01/20 18:40:21 mkm 2 1 c e s 00066/00000/00000 d D 1.1 87/01/20 18:31:31 mkm 1 0 c Placed under source control - mkm e u U f b f n t T I 1 D 4 /* " %W% %E% " */ E 4 I 4 #ident " %W% %E% " E 4 /* * make the current screen look like "win" over the area covered by * win. * */ #include "curses.ext" extern WINDOW *lwin; /* Update screen */ doupdate() { int rc; extern int _endwin; int _outch(); #ifdef DEBUG if(outf) fprintf( outf, "doupdate()\n" ); #endif DEBUG if( lwin == NULL ) { return ERR; } if( _endwin ) { /* * We've called endwin since last refresh. Undo the * effects of this call. */ _fixdelay(FALSE, SP->fl_nodelay); if (stdscr->_use_meta) tputs(meta_on, 1, _outch); _endwin = FALSE; SP->doclear = TRUE; reset_prog_mode(); } /* Tell the back end where to leave the cursor */ if( lwin->_leave || lwin->_flags&_ISPAD ) { #ifdef DEBUG if(outf) fprintf( outf, "'_ll_move(-1, -1)' being done.\n" ); #endif DEBUG _ll_move(-1, -1); } else { #ifdef DEBUG if(outf) fprintf( outf, "'lwin->_cury+lwin->_begy, lwin->_curx+lwin->_begx' being done.\n" ); #endif DEBUG _ll_move( lwin->_cury+lwin->_begy, lwin->_curx+lwin->_begx ); } #ifdef DEBUG if(outf) fprintf( outf, "doing 'rc = _ll_refresh(lwin->_use_idl)'.\n" ); #endif DEBUG rc = _ll_refresh(lwin->_use_idl); #ifdef DEBUG _dumpwin(lwin); #endif DEBUG return rc; } E 1 h32890 s 00001/00001/00072 d D 3.2 87/05/13 18:41:10 build 4 3 c removed old SCCS strings and inserted #ident BB e s 00000/00000/00073 d D 3.1 87/01/20 18:49:46 mkm 3 2 c e s 00000/00000/00073 d D 2.1 87/01/20 18:40:23 mkm 2 1 c e s 00073/00000/00000 d D 1.1 87/01/20 18:31:32 mkm 1 0 c Placed under source control - mkm e u U f b f n t T I 1 D 4 /* " %W% %E% " */ E 4 I 4 #ident " %W% %E% " E 4 /* * Code for various kinds of delays. Most of this is nonportable and * requires various enhancements to the operating system, so it won't * work on all systems. It is included in curses to provide a portable * interface, and so curses itself can use it for function keys. */ #include "curses.ext" #include #define NAPINTERVAL 100 #define HZ 60 /* From early specs - this may change by 4.2BSD */ struct _timeval { long tv_sec; long tv_usec; }; /* * Wait until the output has drained enough that it will only take * ms more milliseconds to drain completely. * Needs Berkeley TIOCOUTQ ioctl. Returns ERR if impossible. */ int draino(ms) int ms; { int ncthere; /* number of chars actually in output queue */ int ncneeded; /* number of chars = that many ms */ int rv; /* ioctl return value */ #ifdef TIOCOUTQ # define _DRAINO /* 10 bits/char, 1000 ms/sec, baudrate in bits/sec */ ncneeded = baudrate() * ms / (10 * 1000); for (;;) { ncthere = 0; rv = ioctl(cur_term->Filedes, TIOCOUTQ, &ncthere); #ifdef DEBUG fprintf(outf, "draino: rv %d, ncneeded %d, ncthere %d\n", rv, ncneeded, ncthere); #endif if (rv < 0) return ERR; /* ioctl didn't work */ if (ncthere <= ncneeded) { return 0; } napms(NAPINTERVAL); } #endif #ifdef TCSETAW # define _DRAINO /* * USG simulation - waits until the entire queue is empty, * then sets the state to what it already is (e.g. no-op). * Unfortunately this only works if ms is zero. */ if (ms <= 0) { ioctl(cur_term->Filedes, TCSETAW, cur_term->Nttyb); return OK; } #endif #ifndef _DRAINO /* No way to fake it, so we return failure. */ /* Used #else to avoid warning from compiler about unreached stmt */ return ERR; #endif } E 1 h27823 s 00001/00001/00006 d D 3.2 87/05/13 18:41:21 build 4 3 c removed old SCCS strings and inserted #ident BB e s 00000/00000/00007 d D 3.1 87/01/20 18:49:48 mkm 3 2 c e s 00000/00000/00007 d D 2.1 87/01/20 18:40:25 mkm 2 1 c e s 00007/00000/00000 d D 1.1 87/01/20 18:31:34 mkm 1 0 c Placed under source control - mkm e u U f b f n t T I 1 D 4 /* " %W% %E% " */ E 4 I 4 #ident " %W% %E% " E 4 #include "curses.ext" echo() { SP->fl_echoit = TRUE; } E 1 h18340 s 00001/00001/00040 d D 3.2 87/05/13 18:41:34 build 4 3 c removed old SCCS strings and inserted #ident BB e s 00000/00000/00041 d D 3.1 87/01/20 18:49:50 mkm 3 2 c e s 00000/00000/00041 d D 2.1 87/01/20 18:40:27 mkm 2 1 c e s 00041/00000/00000 d D 1.1 87/01/20 18:31:35 mkm 1 0 c Placed under source control - mkm e u U f b f n t T I 1 D 4 /* " %W% %E% " */ E 4 I 4 #ident " %W% %E% " E 4 #include "curses.ext" /* * Clean things up before exiting. * endwin is TRUE if we have called endwin - this avoids calling it twice. */ extern int _endwin; extern int _c_clean(); extern int _fixdelay(); extern int _outch(); extern int _pos(); extern int doupdate(); extern int reset_shell_mode(); extern int tputs(); int endwin() { int saveci = SP->check_input; if (_endwin) return; /* Flush out any output not output due to typeahead */ SP->check_input = 9999; doupdate(); SP->check_input = saveci; /* in case of another initscr */ _fixdelay(SP->fl_nodelay, FALSE); if (stdscr->_use_meta) tputs(meta_off, 1, _outch); _pos(lines-1, 0); _c_clean(); _endwin = TRUE; reset_shell_mode(); fflush(stdout); } E 1 h37171 s 00001/00001/00047 d D 3.2 87/05/13 18:41:46 build 4 3 c removed old SCCS strings and inserted #ident BB e s 00000/00000/00048 d D 3.1 87/01/20 18:49:51 mkm 3 2 c e s 00000/00000/00048 d D 2.1 87/01/20 18:40:29 mkm 2 1 c e s 00048/00000/00000 d D 1.1 87/01/20 18:31:36 mkm 1 0 c Placed under source control - mkm e u U f b f n t T I 1 D 4 /* " %W% %E% " */ E 4 I 4 #ident " %W% %E% " E 4 # include "curses.ext" /* * This routine erases everything on the _window. * */ werase(win) reg WINDOW *win; { reg int y; reg chtype *sp, *end, *start, *maxx; reg int minx; # ifdef DEBUG if(outf) fprintf(outf, "WERASE(%0.2o), _maxx %d\n", win, win->_maxx); # endif for (y = 0; y < win->_maxy; y++) { minx = _NOCHANGE; maxx = NULL; start = win->_y[y]; end = &start[win->_maxx]; for (sp = start; sp < end; sp++) { #ifdef DEBUG if (y == 23) if(outf) fprintf(outf, "sp %x, *sp %c %o\n", sp, *sp, *sp); #endif if (*sp != ' ') { maxx = sp; if (minx == _NOCHANGE) minx = sp - start; *sp = ' '; } } if (minx != _NOCHANGE) { if (win->_firstch[y] > minx || win->_firstch[y] == _NOCHANGE) win->_firstch[y] = minx; if (win->_lastch[y] < maxx - win->_y[y]) win->_lastch[y] = maxx - win->_y[y]; } # ifdef DEBUG if(outf) fprintf(outf, "WERASE: minx %d maxx %d _firstch[%d] %d, start %x, end %x\n", minx, maxx ? maxx-start : NULL, y, win->_firstch[y], start, end); # endif } win->_curx = win->_cury = 0; } E 1 h35410 s 00001/00001/00011 d D 3.2 87/05/13 18:41:57 build 4 3 c removed old SCCS strings and inserted #ident BB e s 00000/00000/00012 d D 3.1 87/01/20 18:49:53 mkm 3 2 c e s 00000/00000/00012 d D 2.1 87/01/20 18:40:31 mkm 2 1 c e s 00012/00000/00000 d D 1.1 87/01/20 18:31:37 mkm 1 0 c Placed under source control - mkm e u U f b f n t T I 1 D 4 /* " %W% %E% " */ E 4 I 4 #ident " %W% %E% " E 4 #include "curses.ext" char erasechar() { #ifdef USG return cur_term->Ottyb.c_cc[VERASE]; #else return cur_term->Ottyb.sg_erase; #endif } E 1 2h40951 s 00001/00001/00016 d D 3.2 87/05/13 18:42:20 build 4 3 c removed old SCCS strings and inserted #ident BB e s 00000/00000/00017 d D 3.1 87/01/20 18:49:56 mkm 3 2 c e s 00000/00000/00017 d D 2.1 87/01/20 18:40:34 mkm 2 1 c e s 00017/00000/00000 d D 1.1 87/01/20 18:31:39 mkm 1 0 c Placed under source control - mkm e u U f b f n t T I 1 D 4 /* " %W% %E% " */ E 4 I 4 #ident " %W% %E% " E 4 #include "curses.ext" extern int _outch(); flash() { #ifdef DEBUG if(outf) fprintf(outf, "flash().\n"); #endif if (flash_screen) tputs (flash_screen, 0, _outch); else tputs (bell, 0, _outch); __cflush(); } E 1 h12262 s 00001/00001/00025 d D 3.2 87/05/13 18:42:32 build 4 3 c removed old SCCS strings and inserted #ident BB e s 00000/00000/00026 d D 3.1 87/01/20 18:49:57 mkm 3 2 c e s 00000/00000/00026 d D 2.1 87/01/20 18:40:35 mkm 2 1 c e s 00026/00000/00000 d D 1.1 87/01/20 18:31:40 mkm 1 0 c Placed under source control - mkm e u U f b f n t T I 1 D 4 /* " %W% %E% " */ E 4 I 4 #ident " %W% %E% " E 4 #include "curses.ext" flushinp() { #ifdef DEBUG if(outf) fprintf(outf, "flushinp(), file %x, SP %x\n", SP->term_file, SP); #endif #ifdef USG ioctl(cur_term -> Filedes, TCFLSH, 0); #else /* for insurance against someone using their own buffer: */ ioctl(cur_term -> Filedes, TIOCGETP, &(cur_term->Nttyb)); /* * SETP waits on output and flushes input as side effect. * Really want an ioctl like TCFLSH but Berkeley doesn't have one. */ ioctl(cur_term -> Filedes, TIOCSETP, &(cur_term->Nttyb)); #endif /* * Have to doupdate() because, if we've stopped output due to * typeahead, now that typeahead is gone, so we'd better catch up. */ doupdate(); } E 1 h37678 s 00000/00000/00316 d D 3.1 87/01/20 18:49:59 mkm 3 2 c e s 00000/00000/00316 d D 2.1 87/01/20 18:40:36 mkm 2 1 c e s 00316/00000/00000 d D 1.1 87/01/20 18:31:41 mkm 1 0 c Placed under source control - mkm e u U f b f n t T I 1 tparm.c: 11: #define CTRL(c) ('c' & 037) curses.h: 48: #define ERR (-1) mkti4.c: 11: #define FAILURE (-1) curses.h: 47: #define FALSE (0) curses.h: 49: #define OK (0) ns_curses.h: 19: #define SP ((struct screen *)&(WS->w_screen)) curses.h: 46: #define TRUE (1) curses.h: 137: #define addch(ch) m_addch(ch) curses.h: 93: #define addch(ch) waddch(stdscr, ch) curses.h: 138: #define addstr(str) m_addstr(str) curses.h: 95: #define addstr(str) waddstr(stdscr, str) curses.h: 111: #define attroff(at) wattroff(stdscr,at) curses.h: 146: #define attroff(at) wattroff(stdscr,at) curses.h: 110: #define attron(at) wattron(stdscr,at) curses.h: 145: #define attron(at) wattron(stdscr,at) curses.h: 112: #define attrset(at) wattrset(stdscr,at) curses.h: 147: #define attrset(at) wattrset(stdscr,at) curses.h: 140: #define clear() m_clear() curses.h: 98: #define clear() wclear(stdscr) curses.h: 100: #define clrtobot() wclrtobot(stdscr) curses.h: 101: #define clrtoeol() wclrtoeol(stdscr) curses.h: 107: #define delch() wdelch(stdscr) curses.h: 103: #define deleteln() wdeleteln(stdscr) curses.h: 141: #define erase() m_erase() curses.h: 99: #define erase() werase(stdscr) curses.h: 94: #define getch() wgetch(stdscr) curses.h: 96: #define getstr(str) wgetstr(stdscr, str) curses.h: 105: #define inch() winch(stdscr) curses.h: 106: #define insch(c) winsch(stdscr,c) curses.h: 102: #define insertln() winsertln(stdscr) overlay.c: 6: #define max(a,b) (a > b ? a : b) overlay.c: 5: #define min(a,b) (a < b ? a : b) overwrite.c: 4: #define min(a,b) (a < b ? a : b) curses.h: 139: #define move(y, x) m_move(y, x) curses.h: 97: #define move(y, x) wmove(stdscr, y, x) curses.h: 148: #define mvaddch(y,x,ch) move(y, x), addch(ch) curses.h: 127: #define mvaddch(y,x,ch) mvwaddch(stdscr,y,x,ch) curses.h: 149: #define mvaddstr(y,x,str) move(y, x), addstr(str) curses.h: 129: #define mvaddstr(y,x,str) mvwaddstr(stdscr,y,x,str) curses.h: 132: #define mvdelch(y,x) mvwdelch(stdscr,y,x) curses.h: 128: #define mvgetch(y,x) mvwgetch(stdscr,y,x) curses.h: 130: #define mvgetstr(y,x,str) mvwgetstr(stdscr,y,x,str) curses.h: 131: #define mvinch(y,x) mvwinch(stdscr,y,x) curses.h: 133: #define mvinsch(y,x,c) mvwinsch(stdscr,y,x,c) curses.h: 120: #define mvwaddch(win,y,x,ch) (wmove(win,y,x)==ERR?ERR: waddch(win,ch)) curses.h: 122: #define mvwaddstr(win,y,x,str) (wmove(win,y,x)==ERR?ERR: waddstr(win,str)) curses.h: 125: #define mvwdelch(win,y,x) (wmove(win,y,x)==ERR?ERR: wdelch(win)) curses.h: 121: #define mvwgetch(win,y,x) (wmove(win,y,x)==ERR?ERR: wgetch(win)) curses.h: 123: #define mvwgetstr(win,y,x,str) (wmove(win,y,x)==ERR?ERR: wgetstr(win,str)) curses.h: 124: #define mvwinch(win,y,x) (wmove(win,y,x)==ERR?ERR: winch(win)) curses.h: 126: #define mvwinsch(win,y,x,c) (wmove(win,y,x)==ERR?ERR: winsch(win,c)) curses.h: 142: #define refresh() m_refresh() curses.h: 104: #define refresh() wrefresh(stdscr) curses.h: 114: #define setscrreg(t,b) wsetscrreg(stdscr, t, b) curses.h: 109: #define standend() wstandend(stdscr) curses.h: 144: #define standend() wstandend(stdscr) curses.h: 108: #define standout() wstandout(stdscr) curses.h: 143: #define standout() wstandout(stdscr) tgetnum.c: 10: #define two( s1, s2 ) (s1 + 256 * s2 ) tgetstr.c: 10: #define two( s1, s2 ) (s1 + 256 * s2 ) two.twostr.c: 2: #define two( s1, s2 ) (s1 + 256 * s2 ) tgetnum.c: 11: #define twostr( str ) two( *str, str[ 1 ] ) tgetstr.c: 11: #define twostr( str ) two( *str, str[ 1 ] ) two.twostr.c: 3: #define twostr( str ) two( *str, str[ 1 ] ) unctrl.h: 11: #define unctrl(ch) (_unctrl[(unsigned) ch]) curses.h: 228: #define winch(win) (win->_y[win->_cury][win->_curx]) curses.h: 115: #define wsetscrreg(win,t,b) (win->_tmarg=(t),win->_bmarg=(b)) def_shell.c: 19: #define BR(x) (cur_term->x.c_cflag&CBAUD) reset_prog.c: 31: #define BR(x) (cur_term->x.c_cflag&CBAUD) resetshell.c: 32: #define BR(x) (cur_term->x.c_cflag&CBAUD) def_shell.c: 21: #define BR(x) (cur_term->x.sg_ispeed) reset_prog.c: 33: #define BR(x) (cur_term->x.sg_ispeed) resetshell.c: 34: #define BR(x) (cur_term->x.sg_ispeed) doscan.c: 25: #define NCHARS (1 << BITSPERBYTE) curshdr.h: 49: #define _cost(field) (SP->term_costs.field) s.rain.c: 35: #define cursor(col,row) tputs(tgoto(CM,col,row),1,outc) setupterm.c: 30: #define getsh(ip) (* (short *) ip) setupterm.c: 33: #define getsh(ip) (* (short *) ip) doprnt.c: 65: #define max(a,b) ((a) > (b)? (a): (b)) doprnt.c: 66: #define min(a,b) ((a) < (b)? (a): (b)) _id_char.c: 15: #define min(a,b) (a # include static int sig_caught; /* * This routine reads in a character from the window. * * wgetch MUST return an int, not a char, because it can return * things like ERR, meta characters, and function keys > 256. */ int wgetch(win) register WINDOW *win; { register int inp; register int i, j; char c; int arg; bool weset = FALSE; FILE *inf; if (SP->fl_echoit && !win->_scroll && (win->_flags&_FULLWIN) && win->_curx == win->_maxx && win->_cury == win->_maxy) return ERR; # ifdef DEBUG if(outf) fprintf(outf, "WGETCH: SP->fl_echoit = %c, SP->fl_rawmode = %c\n", SP->fl_echoit ? 'T' : 'F', SP->fl_rawmode ? 'T' : 'F'); if (outf) fprintf(outf, "_use_keypad %d, kp_state %d\n", win->_use_keypad, SP->kp_state); # endif if (SP->fl_echoit && !SP->fl_rawmode) { cbreak(); weset++; } #ifdef KEYPAD /* Make sure keypad on is in proper state */ if (win->_use_keypad != SP->kp_state) { _kpmode(win->_use_keypad); fflush(stdout); } #endif /* Make sure we are in proper nodelay state */ if (win->_nodelay != SP->fl_nodelay) _fixdelay(SP->fl_nodelay, win->_nodelay); /* Check for pushed typeahead. We make the assumption that * if a function key is being typed, there is no pushed * typeahead from the previous key waiting. */ if (SP->input_queue[0] >= 0) { inp = SP->input_queue[0]; for (i=0; i<16; i++) { SP->input_queue[i] = SP->input_queue[i+1]; if (SP->input_queue[i] < 0) break; } goto gotit; } inf = SP->input_file; if (inf == stdout) /* so output can be teed somewhere */ inf = stdin; #ifdef FIONREAD if (win->_nodelay) { ioctl(fileno(inf), FIONREAD, &arg); #ifdef DEBUG if (outf) fprintf(outf, "FIONREAD returns %d\n", arg); #endif if (arg < 1) return -1; } #endif for (i = -1; i<0; ) { extern int errno; sig_caught = 0; i = read(fileno(inf), &c, 1); /* * I hope the system won't retern infinite EINTRS - maybe * there should be a hop count here. */ if (i < 0 && errno != EINTR && !sig_caught) { inp = ERR; goto gotit; } } if (i > 0) { inp = c; if (!win->_use_meta) inp &= 0177; else inp &= 0377; } else { inp = ERR; goto gotit; } # ifdef DEBUG if(outf) fprintf(outf,"WGETCH got '%s'\n",unctrl(inp)); # endif #ifdef KEYPAD /* Check for arrow and function keys */ if (win->_use_keypad) { SP->input_queue[0] = inp; SP->input_queue[1] = -1; for (i=0; SP->kp[i].keynum >= 0; i++) { if (SP->kp[i].sends[0] == inp) { for (j=0; ; j++) { if (SP->kp[i].sends[j] <= 0) break; /* found */ if (SP->input_queue[j] == -1) { SP->input_queue[j] = _fpk(inf); SP->input_queue[j+1] = -1; } if (SP->kp[i].sends[j] != SP->input_queue[j]) goto contouter; /* not this one */ } /* It matched the function key. */ inp = SP->kp[i].keynum; SP->input_queue[0] = -1; goto gotit; } contouter:; } /* Didn't match any function keys. */ inp = SP->input_queue[0]; for (i=0; i<16; i++) { SP->input_queue[i] = SP->input_queue[i+1]; if (SP->input_queue[i] < 0) break; } goto gotit; } #endif if (SP->fl_echoit) { waddch(win, (chtype) inp); wrefresh(win); } gotit: if (weset) nocbreak(); #ifdef DEBUG if(outf) fprintf(outf, "getch returns %o, pushed %o %o %o\n", inp, SP->input_queue[0], SP->input_queue[1], SP->input_queue[2]); #endif return inp; } _catch_alarm() { sig_caught = 1; } /* * Fast peek key. Like getchar but if the right flags are set, times out * quickly if there is nothing waiting, returning -1. * f is an output stdio descriptor, we read from the fileno. win is the * window this is supposed to have something to do with. */ #ifndef FIONREAD /* * Traditional implementation. The best resolution we have is 1 second, * so we set a 1 second alarm and try to read. If we fail for 1 second, * we assume there is no key waiting. Problem here is that 1 second is * too long, people can type faster than this. */ static _fpk(f) FILE *f; { char c; int rc; int (*oldsig)(); int oldalarm; oldsig = signal(SIGALRM, _catch_alarm); oldalarm = alarm(1); sig_caught = 0; rc = read(fileno(f), &c, 1); if (sig_caught) { sig_caught = 0; alarm(oldalarm); return -2; } signal(SIGALRM, oldsig); alarm(oldalarm); return rc == 1 ? c : -1; } #else FIONREAD /* * If we have the select system call, we can do much better. * We wait for long enough for a terminal to send another character * (at 15cps repeat rate, this is 67 ms, I'm using 100ms to allow * a bit of a fudge factor) and time out more quickly. Even if we * don't have the real 4.2BSD select, we can emulate it with napms * and FIONREAD. napms might be done with only 1 second resolution, * but this is no worse than what we have above. */ static _fpk(f) FILE *f; { int infd, rc; int *outfd, *exfd; char c; infd = 1 << fileno(f); outfd = exfd = (int *) NULL; rc = select(20, &infd, outfd, exfd, 100); if (rc < 0) return -2; rc = read(fileno(f), &c, 1); return rc == 1 ? c : -1; } #endif FIONREAD E 1 h52445 s 00001/00001/00071 d D 3.2 87/05/13 18:42:58 build 4 3 c removed old SCCS strings and inserted #ident BB e s 00000/00000/00072 d D 3.1 87/01/20 18:50:04 mkm 3 2 c e s 00000/00000/00072 d D 2.1 87/01/20 18:40:42 mkm 2 1 c e s 00072/00000/00000 d D 1.1 87/01/20 18:31:44 mkm 1 0 c Placed under source control - mkm e u U f b f n t T I 1 D 4 /* " %W% %E% " */ E 4 I 4 #ident " %W% %E% " E 4 # include "curses.ext" /* * This routine gets a string starting at (_cury,_curx) * */ wgetstr(win,str) WINDOW *win; char *str; { char myerase, mykill; char rownum[256], colnum[256]; int doecho = SP->fl_echoit; int savecb = SP->fl_rawmode; register int cpos = 0; register int ch; register char *cp = str; #ifdef DEBUG if (outf) fprintf(outf, "doecho %d, savecb %d\n", doecho, savecb); #endif myerase = erasechar(); mykill = killchar(); noecho(); crmode(); for (;;) { rownum[cpos] = win->_cury; colnum[cpos] = win->_curx; if (! (win->_flags&_ISPAD)) wrefresh(win); ch = wgetch(win); if (ch <= 0 ||ch == ERR || ch == '\n' || ch == '\r') break; if (ch == myerase || ch == KEY_LEFT || ch == KEY_BACKSPACE) { if (cpos > 0) { cp--; cpos--; if (doecho) { wmove(win, rownum[cpos], colnum[cpos]); wclrtoeol(win); } } } else if (ch == mykill) { cp = str; cpos = 0; if (doecho) { wmove(win, rownum[cpos], colnum[cpos]); wclrtoeol(win); } } else { *cp++ = ch; cpos++; if (doecho) { waddch(win, ch); } } } *cp = '\0'; if (doecho) echo(); if (!savecb) nocrmode(); waddch(win, '\n'); if (win->_flags & _ISPAD); wrefresh(win); if (ch == ERR) return ERR; return OK; } E 1 h39385 s 00001/00001/00013 d D 3.2 87/05/13 18:43:09 build 4 3 c removed old SCCS strings and inserted #ident BB e s 00000/00000/00014 d D 3.1 87/01/20 18:50:06 mkm 3 2 c e s 00000/00000/00014 d D 2.1 87/01/20 18:40:44 mkm 2 1 c e s 00014/00000/00000 d D 1.1 87/01/20 18:31:45 mkm 1 0 c Placed under source control - mkm e u U f b f n t T I 1 D 4 /* " %W% %E% " */ E 4 I 4 #ident " %W% %E% " E 4 # include "curses.ext" # include char *calloc(); char *malloc(); extern char *getenv(); extern WINDOW *makenew(); gettmode() { /* No-op included only for upward compatibility. */ } E 1 h34196 s 00001/00001/00009 d D 3.2 87/05/13 18:43:19 build 4 3 c removed old SCCS strings and inserted #ident BB e s 00000/00000/00010 d D 3.1 87/01/20 18:50:08 mkm 3 2 c e s 00000/00000/00010 d D 2.1 87/01/20 18:40:46 mkm 2 1 c e s 00010/00000/00000 d D 1.1 87/01/20 18:31:47 mkm 1 0 c Placed under source control - mkm e u U f b f n t T I 1 D 4 /* " %W% %E% " */ E 4 I 4 #ident " %W% %E% " E 4 #include "curses.ext" /* * Does it have insert/delete char? */ has_ic() { return insert_character || enter_insert_mode; } E 1 h37124 s 00001/00001/00009 d D 3.2 87/05/13 18:43:29 build 4 3 c removed old SCCS strings and inserted #ident BB e s 00000/00000/00010 d D 3.1 87/01/20 18:50:09 mkm 3 2 c e s 00000/00000/00010 d D 2.1 87/01/20 18:40:47 mkm 2 1 c e s 00010/00000/00000 d D 1.1 87/01/20 18:31:47 mkm 1 0 c Placed under source control - mkm e u U f b f n t T I 1 D 4 /* " %W% %E% " */ E 4 I 4 #ident " %W% %E% " E 4 #include "curses.ext" /* * Queries: does the terminal have insert/delete line? */ has_il() { return insert_line && delete_line || change_scroll_region; } E 1 h21599 s 00001/00001/00478 d D 3.2 87/05/13 18:43:45 build 4 3 c removed old SCCS strings and inserted #ident BB e s 00000/00000/00479 d D 3.1 87/01/20 18:50:10 mkm 3 2 c e s 00000/00000/00479 d D 2.1 87/01/20 18:40:48 mkm 2 1 c e s 00479/00000/00000 d D 1.1 87/01/20 18:31:48 mkm 1 0 c Placed under source control - mkm e u U f b f n t T I 1 D 4 /* " %W% %E% " */ E 4 I 4 #ident " %W% %E% " E 4 #include "curses.ext" int InputPending; struct st { /* symbol table */ int hash; /* hashed value of line ("text") */ char oc, nc; /* 0, 1, or many: # times this value occurs */ short olno; /* line # of line in "old" array */ }; /* * Routines to deal with calculation of how to do ins/del line optimally. * Update the Screen. Consider using insert and delete line. * Using Heckel's algorithm from April 1978 CACM. * * This algorithm is based on two observations: * (1) A line that occurs once and only once in each file must be * the same line (unchanged but possibly moved). * (2) If i each file immediately adjacent to a "found" line pair * there are lines identical to each other, these lines must be * the same line. Repeated application will "find" sequences * of unchanged lines. * * We view the old and new screens' hashed values as the old and new "files". * Since crossing match lines cannot be taken advantage of with real insert * and delete line, we ignore those matches - this is the one real disadvantage * of this algorithm. * * first and last are the integer line numbers (first line is 1) of the * portion of the screen to consider. */ _id_line(first, last) register int first, last; { register int i, j, k, n; int base, ndel; int idl_offset = 0; /* number of extra del lines done so far. */ #ifdef NONSTANDARD static #endif NONSTANDARD struct st symtab[256]; /* * oa and na represent the old and new files (SP->cur_body and * SP->std_body, respectively.) If they are > 0 they are * subscripts in each other (e.g. na[4] = 3 means that na[4] * points to oa[3]). If they are <= 0 their negative is taken * as a symbol table index into the symtab array. */ #ifdef NONSTANDARD static #endif NONSTANDARD short oa[256], na[256]; for (i=0; i<256; i++) symtab[i].hash = symtab[i].oc = symtab[i].nc = 0; #ifdef DEBUG if(outf) fprintf(outf, "_id_line(%d, %d)\n", first, last); #endif /* Pass 1: enter old file into symtab */ for (i=first; i<=last; i++) { n = _getst(SP->std_body[i]->hash, symtab); symtab[n].nc++; na[i] = -n; } #ifdef LONGDEBUG if(outf) fprintf(outf, "Pass 2\n"); if(outf) fprintf(outf, "na[12] = %d\n", na[12]); #endif /* Pass 2: enter new into symtab */ for (i=first; i<=last; i++) { n = _getst(SP->cur_body[i]->hash, symtab); symtab[n].oc++; symtab[n].olno = i; oa[i] = -n; } #ifdef LONGDEBUG if(outf) fprintf(outf, "Pass 3\n"); if(outf) fprintf(outf, "\nsymtab oc nc olno hash\n"); for (i=0; i<256; i++) if (symtab[i].hash) if(outf) fprintf(outf, "%d %d %d %d %d\n", i, symtab[i].oc, symtab[i].nc, symtab[i].olno, symtab[i].hash); #endif /* * Pass 3: Match all lines with exactly one match. * Matching lines in oa and na point at each other. */ for (i=first; i<=last; i++) { n = -na[i]; if (symtab[n].oc == 1 && symtab[n].nc == 1) { na[i] = symtab[n].olno; oa[na[i]] = i; } } oa[first-1] = na[first-1] = first-1; oa[last+1] = na[last+1] = last+1; /* Pass 4: Find following implied matches based on sequence */ #ifdef DEBUG if(outf) fprintf(outf, "Pass 4\n"); #endif for (i=first; i<=last; i++) { if (na[i] > 0 && na[i+1] <= 0) { j = na[i]; if (na[i+1] == oa[j+1]) { oa[j+1] = i+1; na[i+1] = j+1; } } } /* Pass 5: Find preceding implied matches based on sequence */ #ifdef DEBUG if(outf) fprintf(outf, "Pass 5\n"); if(outf) fprintf(outf, "na[12] = %d\n", na[12]); #endif for (i=last; i>=first; i--) { if (na[i] > 0 && na[i-1] <= 0) { j = na[i]; if (na[i-1] == oa[j-1]) { oa[j-1] = i-1; na[i-1] = j-1; } } } #ifdef DEBUG if(outf) fprintf(outf, "\ni oa na After pass 5\n"); for (i=first; i<=last; i++) if(outf) fprintf(outf, "%d %d %d\n", i, oa[i], na[i]); if(outf) fprintf(outf, "\n"); #endif /* Pass 6: Find matches from more than one line, in order. */ for (i=first; i<=last; i++) { if (na[i] < -1 && symtab[-na[i]].nc > 1) { j = na[i]; #ifdef DEBUG if(outf) fprintf(outf, "i %d, na[i] %d\n", i, na[i]); #endif for (k=first; k 0 && na[i] < n) { k += SP->std_body[i]->bodylen; } if (na[i] > n) n = na[i]; } /* 7b: get sw-ne cost in j */ /* Consider throwing away in the other direction. */ if (k > 0) { j = 0; /* j is the added cost to throw away sw-ne matches */ n = last+1; for (i=last; i>=first; i--) { if (na[i] > 0 && na[i] > n) { j += SP->std_body[i]->bodylen; } if (na[i] > 0 && na[i] < n) n = na[i]; } } else j = 1; /* will be > 0 for sure */ #ifdef DEBUG if(outf) fprintf(outf, "forward, k is %d, backward, j is %d\n", k, j); #endif /* Remove whichever is cheapest. */ if (k < j) { /* 7c: remove nw-se */ n = 0; for (i=first; i<=last; i++) { if (na[i] > 0 && na[i] < n) { oa[na[i]] = -1; na[i] = -1; } if (na[i] > n) n = na[i]; } } else { /* 7d: remove sw-ne */ n = last+1; for (i=last; i>=first; i--) { if (na[i] > 0 && na[i] > n) { oa[na[i]] = -1; na[i] = -1; } if (na[i] > 0 && na[i] < n) n = na[i]; } } #ifdef DEBUG if(outf) fprintf(outf, "\ni oa na After pass 7\n"); for (i=first; i<=last; i++) if(outf) fprintf(outf, "%d %d %d\n", i, oa[i], na[i]); if(outf) fprintf(outf, "\nPass 7\n"); if(outf) fprintf(outf, "ILmf %d/32, ILov %d\n", SP->term_costs.ilvar, SP->term_costs.ilfixed); if(outf) fprintf(outf, "i base j k DC n\n"); #endif /* * Pass 8: we go through and remove all matches if the * overall ins/del lines would be too expensive to capatilize on. * j is cost with ins/del line, k is cost without it. base is the * logical beginning of the oa array, as the array would be after * inserts and deletes, ignoring anything before row i. This * approximates things by not taking into account SP->curptr motion, * funny insert line costs, or lines that are partially equal. * This macro is the cost to insert or delete n lines at screen line i. * It is approximated for speed and simplicity, but shouldn't be. * The approximation assumes each line is deleted separately. */ #define idlcost(n, i) n * \ (((SP->term_costs.ilvar * (lines-i))>>5) + SP->term_costs.ilfixed) base = ndel = 0; j = k = 0; for (i=first; i<=last; i++) { #ifdef DEBUG n = 0; #endif if (oa[i] != na[i]) { /* Cost to turn Phys[i] into Des[i] on same line */ if (SP->cur_body[i] == 0 || SP->cur_body[i]->length == 0) { k += SP->std_body[i]->bodylen; } else if (SP->std_body[i] == 0 || SP->std_body[i]->length == 0) { k += 2; /* guess at cost of clr to eol */ } else { register chtype *p0, *p1, *p2; n = SP->cur_body[i]->length - SP->std_body[i]->length; if (n > 0) { k += n; n = SP->std_body[i]->length; } else { k += -n; n = SP->cur_body[i]->length; } p0 = &SP->std_body[i]->body[0]; p1 = &SP->std_body[i]->body[n]; p2 = &SP->cur_body[i]->body[n]; while (--p1 >= p0) if (*p1 != *--p2) k++; } } /* cost to do using ins/del line */ if (na[i] <= 0) { /* totally different - plan on redrawing whole thing * (even though chances are good they are partly the * same - _id_char will take care of this, if it * happens to get the same line on the screen). * Should probably figure out what will be there on * the screen and do above k algorithm on it. */ j += SP->std_body[i]->bodylen; } else if ((n = (na[i] - base) - i) > 0) { /* delete line */ j += idlcost(n, i); ndel += n; base += n; } else if (n < 0) { /* insert line */ j += idlcost((-n), i); ndel += n; base += n; } /* else they are the same line: no cost */ #ifdef DEBUG if(outf) fprintf(outf, "%d %d %d %d %d", i, base, j, k, SP->std_body[i]->bodylen); if (n < 0) if(outf) fprintf(outf, " %d lines inserted", -n); else if (n > 0) if(outf) fprintf(outf, " %d lines deleted", n); if(outf) fprintf(outf, "\n"); #endif } if (j >= k) { /* It's as cheap to just redraw, so do it. */ for (i=first; i<=last; i++) na[i] = oa[i] = -1; } else if (ndel < 0) { ndel = -ndel; #ifdef DEBUG if(outf) fprintf(outf, "will do %d extra inserts, so del now.\n", ndel); #endif if (SP->des_bot_mgn - last >= 0) { _pos(last-ndel, 0); idl_offset += ndel; _dellines(ndel); } } #ifdef DEBUG if(outf) fprintf(outf, "\ni oa na After pass 8\n"); for (i=first; i<=last; i++) if(outf) fprintf(outf, "%d %d %d\n", i, oa[i], na[i]); if(outf) fprintf(outf, "\n"); #endif /* Pass 9: Do any delete lines that are needed */ k = first-1; /* previous matching spot in oa */ ndel = 0; for (i=first; i<=last; i++) { if (oa[i] > 0) { n = (i-k) - (oa[i]-oa[k]); #ifdef DEBUG if(outf) fprintf(outf, "del loop, i %d, k %d, oa[i] %d, oa[k] %d, n %d\n", i, k, oa[i], oa[k], n); #endif if (n > 0) { if (i-n == SP->des_top_mgn+1) { _scrollf(n); } else { _pos(i-n-1, 0); _dellines(n); } idl_offset += n; ndel += n; for (j=i-n; j<=last-n; j++) { if (oa[j] > 0 && na[oa[j]] > 0) /*compilo n'aime pas na -= n ici?*/ na[oa[j]] = na[oa[j]] - n; _line_free(SP->cur_body[j]); SP->cur_body[j] = SP->cur_body[j+n]; oa[j] = oa[j+n]; } for ( ; j<=last; j++) { if (oa[j] > 0 && na[oa[j]] > 0) /*compilo n'aime pas na -= n ici?*/ na[oa[j]] = na[oa[j]] - n; _line_free(SP->cur_body[j]); SP->cur_body[j] = NULL; oa[j] = -1; } i -= n; } k = i; } } #ifdef DEBUG if(outf) fprintf(outf, "\ni oa na After pass 9\n"); for (i=first; i<=last; i++) if(outf) fprintf(outf, "%d %d %d\n", i, oa[i], na[i]); if(outf) fprintf(outf, "\n"); #endif /* Half way through - check for typeahead */ _chk_typeahead(); if (idl_offset == 0 && InputPending) { #ifdef DEBUG if (outf) fprintf(outf, "InputPending %d, aborted after dellines\n", InputPending); #endif return; } /* for pass 10, j is the next line above i that will be used */ for (j=first; na[j] <= 0; j++) ; /* Pass 10: insert and fix remaining lines */ for (i=first; i<=last; i++) { if (j <= i) for (j++; na[j] <= 0; j++) ; #ifdef DEBUG if(outf) fprintf(outf, "i %d, j %d, na[i] %d, na[j] %d\n", i, j, na[i], na[j]); if (na[i] > 0 && na[i] != i) if(outf) fprintf(outf, "OOPS: na[%d] is %d\n", i, na[i]); #endif /* There are two cases: na[i] < 0 or na[i] == i */ if (na[i] < 0) { /* * This line must be fixed from scratch. First * check to see if the line physically there is * going to be used later, if so, move it down. */ if (na[j]==i || ndel+i>last && lastdes_bot_mgn+1) { _pos(i-1, 0); n = j - i; idl_offset -= n; ndel -= n; _inslines(n); _chk_typeahead(); if (idl_offset == 0 && InputPending) { #ifdef DEBUG if (outf) fprintf(outf, "InputPending %d, aborted after dellines\n", InputPending); #endif return; } for (k=last; k>=j; k--) { if (na[k] > 0) /*compilo n'aime pas na += n ici?*/ na[k] = na[k] + n; _line_free(SP->cur_body[k]); SP->cur_body[k] = SP->cur_body[k-n]; oa[k] = oa[k-n]; } for ( ; k>=i; k--) { if (na[k] > 0) /*compilo n'aime pas na += n ici?*/ na[k] = na[k] + n; _line_free(SP->cur_body[k]); SP->cur_body[k] = NULL; oa[k] = 0; } } } /* Now transform line i to new line j */ if (!InputPending) { _id_char (SP->cur_body[i], SP->std_body[i], i-1); if (SP->cur_body[i] != SP->std_body[i]) _line_free (SP->cur_body[i]); SP->cur_body[i] = SP->std_body[i]; } } #ifdef DEBUG if(outf) fprintf(outf, "\ni oa na After pass 10: _id_line completed\n"); for (i=first; i<=last; i++) if(outf) fprintf(outf, "%d %d %d\n", i, oa[i], na[i]); if(outf) fprintf(outf, "\n"); #endif } int _getst(val, symtab) register struct st *symtab; { register int i; register int h; register int hopcount = 256; i = val & 0377; while ((h=symtab[i].hash) && h != val) { if (++i >= 256) i = 0; if (--hopcount <= 0) { _ec_quit("Hash table full in dispcalc", ""); } } symtab[i].hash = val; #ifdef LONGDEBUG if(outf) fprintf(outf, "_getst, val %d, init slot %d, return %d\n", val, val & 0377, i); #endif return i; } E 1 h33515 s 00001/00001/00011 d D 3.2 87/05/13 18:43:59 build 4 3 c removed old SCCS strings and inserted #ident BB e s 00000/00000/00012 d D 3.1 87/01/20 18:50:14 mkm 3 2 c e s 00000/00000/00012 d D 2.1 87/01/20 18:40:52 mkm 2 1 c e s 00012/00000/00000 d D 1.1 87/01/20 18:31:50 mkm 1 0 c Placed under source control - mkm e u U f b f n t T I 1 D 4 /* " %W% %E% " */ E 4 I 4 #ident " %W% %E% " E 4 #include "curses.ext" /* * TRUE => OK to use insert/delete line. */ idlok(win,bf) WINDOW *win; int bf; { win->_use_idl = bf; } E 1 h55203 s 00001/00001/00093 d D 3.2 87/05/13 18:44:13 build 4 3 c removed old SCCS strings and inserted #ident BB e s 00000/00000/00094 d D 3.1 87/01/20 18:50:15 mkm 3 2 c e s 00000/00000/00094 d D 2.1 87/01/20 18:40:53 mkm 2 1 c e s 00094/00000/00000 d D 1.1 87/01/20 18:31:51 mkm 1 0 c Placed under source control - mkm e u U f b f n t T I 1 D 4 /* " %W% %E% " */ E 4 I 4 #ident " %W% %E% " E 4 #include "curses.ext" #ifdef KEYPAD static struct map *_addone(); /* * Make up the needed array of map structures for dealing with the keypad. */ #define MAXKEYS 50 /* number of keys we understand */ struct map * _init_keypad() { struct map *r, *p; r = (struct map *) calloc(MAXKEYS, sizeof (struct map)); p = r; /* If down arrow key sends \n, don't map it. */ if (key_down && strcmp(key_down, "\n")) p = _addone(p, key_down, KEY_DOWN, "down"); p = _addone(p, key_up, KEY_UP, "up"); /* If left arrow key sends \b, don't map it. */ if (key_left && strcmp(key_left, "\b")) p = _addone(p, key_left, KEY_LEFT, "left"); p = _addone(p, key_right, KEY_RIGHT, "right"); p = _addone(p, key_home, KEY_HOME, "home"); /* If backspace key sends \b, don't map it. */ if (key_backspace && strcmp(key_backspace, "\b")) p = _addone(p, key_backspace, KEY_BACKSPACE, "backspace"); p = _addone(p, key_f0, KEY_F(0), lab_f0?lab_f0:"f0"); p = _addone(p, key_f1, KEY_F(1), lab_f1?lab_f1:"f1"); p = _addone(p, key_f2, KEY_F(2), lab_f2?lab_f2:"f2"); p = _addone(p, key_f3, KEY_F(3), lab_f3?lab_f3:"f3"); p = _addone(p, key_f4, KEY_F(4), lab_f4?lab_f4:"f4"); p = _addone(p, key_f5, KEY_F(5), lab_f5?lab_f5:"f5"); p = _addone(p, key_f6, KEY_F(6), lab_f6?lab_f6:"f6"); p = _addone(p, key_f7, KEY_F(7), lab_f7?lab_f7:"f7"); p = _addone(p, key_f8, KEY_F(8), lab_f8?lab_f8:"f8"); p = _addone(p, key_f9, KEY_F(9), lab_f9?lab_f9:"f9"); p = _addone(p, key_dl, KEY_DL, "dl"); p = _addone(p, key_il, KEY_IL, "il"); p = _addone(p, key_dc, KEY_DC, "dc"); p = _addone(p, key_ic, KEY_IC, "ic"); p = _addone(p, key_eic, KEY_EIC, "eic"); p = _addone(p, key_clear, KEY_CLEAR, "clear"); p = _addone(p, key_eos, KEY_EOS, "eos"); p = _addone(p, key_eol, KEY_EOL, "eol"); p = _addone(p, key_sf, KEY_SF, "sf"); p = _addone(p, key_sr, KEY_SR, "sr"); p = _addone(p, key_npage, KEY_NPAGE, "npage"); p = _addone(p, key_ppage, KEY_PPAGE, "ppage"); p = _addone(p, key_stab, KEY_STAB, "stab"); p = _addone(p, key_ctab, KEY_CTAB, "ctab"); p = _addone(p, key_catab, KEY_CATAB, "catab"); p = _addone(p, key_ll, KEY_LL, "ll"); p = _addone(p, key_a1, KEY_A1, "a1"); p = _addone(p, key_a3, KEY_A3, "a3"); p = _addone(p, key_b2, KEY_B2, "b2"); p = _addone(p, key_c1, KEY_C1, "c1"); p = _addone(p, key_c3, KEY_C3, "c3"); p -> keynum = 0; /* termination convention */ #ifdef DEBUG if(outf) fprintf(outf, "return key structure %x, ending at %x\n", r, p); #endif return r; } /* * Map text into num, updating the map structure p. * label is currently unused, but is an English description * of what the key is labelled, similar to the name in vi. */ static struct map * _addone(p, text, num, label) struct map *p; char *text; int num; char *label; { if (text) { strcpy(p->label, label); strcpy(p->sends, text); p->keynum = num; #ifdef DEBUG if(outf) fprintf(outf, "have key label %s, sends '%s', value %o\n", p->label, p->sends, p->keynum); #endif p++; } return p; } #endif KEYPAD E 1 h08031 s 00001/00001/00044 d D 3.2 87/05/13 18:44:25 build 4 3 c removed old SCCS strings and inserted #ident BB e s 00000/00000/00045 d D 3.1 87/01/20 18:50:17 mkm 3 2 c e s 00000/00000/00045 d D 2.1 87/01/20 18:40:55 mkm 2 1 c e s 00045/00000/00000 d D 1.1 87/01/20 18:31:52 mkm 1 0 c Placed under source control - mkm e u U f b f n t T I 1 D 4 /* " %W% %E% " */ E 4 I 4 #ident " %W% %E% " E 4 # include "curses.ext" # include char *calloc(); char *malloc(); extern char *getenv(); extern WINDOW *makenew(); /* * This routine initializes the current and standard screen. * */ WINDOW * initscr() { register char *sp; struct screen *scp; extern char *_c_why_not; # ifdef DEBUG if (outf == NULL) { if( ( outf = fopen("trace", "w") ) == NULL) { perror("trace"); exit(-1); } } #endif if( ( sp = getenv( "TERM" ) ) == NULL ) { sp = Def_term; } # ifdef DEBUG if(outf) fprintf(outf, "INITSCR: term = %s\n", sp); # endif if( ( scp = newterm( sp, stdout, stdin ) ) == NULL ) { _ec_quit(_c_why_not, sp); } return stdscr; } E 1 h18200 s 00001/00001/00034 d D 3.2 87/05/13 18:44:37 build 4 3 c removed old SCCS strings and inserted #ident BB e s 00000/00000/00035 d D 3.1 87/01/20 18:50:18 mkm 3 2 c e s 00000/00000/00035 d D 2.1 87/01/20 18:40:57 mkm 2 1 c e s 00035/00000/00000 d D 1.1 87/01/20 18:31:53 mkm 1 0 c Placed under source control - mkm e u U f b f n t T I 1 D 4 /* " %W% %E% " */ E 4 I 4 #ident " %W% %E% " E 4 # include "curses.ext" /* * This routine performs an insert-char on the line, leaving * (_cury,_curx) unchanged. * */ winsch(win, c) reg WINDOW *win; chtype c; { register chtype *temp1, *temp2; register chtype *end; end = &win->_y[win->_cury][win->_curx]; temp1 = &win->_y[win->_cury][win->_maxx - 1]; temp2 = temp1 - 1; while (temp1 > end) *temp1-- = *temp2--; *temp1 = c; win->_lastch[win->_cury] = win->_maxx - 1; if (win->_firstch[win->_cury] == _NOCHANGE || win->_firstch[win->_cury] > win->_curx) win->_firstch[win->_cury] = win->_curx; if (win->_cury == LINES - 1 && win->_y[LINES-1][COLS-1] != ' ') if (win->_scroll && !(win->_flags&_ISPAD)) { wrefresh(win); scroll(win); win->_cury--; } else return ERR; return OK; } E 1 h17053 s 00001/00001/00035 d D 3.2 87/05/13 18:44:52 build 4 3 c removed old SCCS strings and inserted #ident BB e s 00000/00000/00036 d D 3.1 87/01/20 18:50:20 mkm 3 2 c e s 00000/00000/00036 d D 2.1 87/01/20 18:40:58 mkm 2 1 c e s 00036/00000/00000 d D 1.1 87/01/20 18:31:54 mkm 1 0 c Placed under source control - mkm e u U f b f n t T I 1 D 4 /* " %W% %E% " */ E 4 I 4 #ident " %W% %E% " E 4 # include "curses.ext" /* * This routine performs an insert-line on the _window, leaving * (_cury,_curx) unchanged. * */ winsertln(win) reg WINDOW *win; { reg chtype *temp; reg int y; reg chtype *end; temp = win->_y[win->_maxy-1]; win->_firstch[win->_cury] = 0; win->_lastch[win->_cury] = win->_maxx - 1; for (y = win->_maxy - 1; y > win->_cury; --y) { win->_y[y] = win->_y[y-1]; win->_firstch[y] = 0; win->_lastch[y] = win->_maxx - 1; } for (end = &temp[win->_maxx]; temp < end; ) *temp++ = ' '; win->_y[win->_cury] = temp - win->_maxx; if (win->_cury == LINES - 1 && win->_y[LINES-1][COLS-1] != ' ') if (win->_scroll && !(win->_flags&_ISPAD)) { wrefresh(win); scroll(win); win->_cury--; } else return ERR; return OK; } E 1 h47389 s 00001/00001/00018 d D 3.2 87/05/13 18:45:04 build 4 3 c removed old SCCS strings and inserted #ident BB e s 00000/00000/00019 d D 3.1 87/01/20 18:50:22 mkm 3 2 c e s 00000/00000/00019 d D 2.1 87/01/20 18:41:01 mkm 2 1 c e s 00019/00000/00000 d D 1.1 87/01/20 18:31:55 mkm 1 0 c Placed under source control - mkm e u U f b f n t T I 1 D 4 /* " %W% %E% " */ E 4 I 4 #ident " %W% %E% " E 4 #include "curses.ext" /* * TRUE => flush input when an interrupt key is pressed */ intrflush(win,bf) WINDOW *win; int bf; { #ifdef USG if (bf) (cur_term->Nttyb).c_lflag &= ~NOFLSH; else (cur_term->Nttyb).c_lflag |= NOFLSH; #else /* can't do this in 4.1BSD or V7 */ #endif reset_prog_mode(); } E 1 h36992 s 00001/00001/00010 d D 3.2 87/05/13 18:45:17 build 4 3 c removed old SCCS strings and inserted #ident BB e s 00000/00000/00011 d D 3.1 87/01/20 18:50:23 mkm 3 2 c e s 00000/00000/00011 d D 2.1 87/01/20 18:41:03 mkm 2 1 c e s 00011/00000/00000 d D 1.1 87/01/20 18:31:56 mkm 1 0 c Placed under source control - mkm e u U f b f n t T I 1 D 4 /* " %W% %E% " */ E 4 I 4 #ident " %W% %E% " E 4 #include "curses.ext" /* * TRUE => special keys should be passed as a single character by getch. */ keypad(win,bf) WINDOW *win; int bf; { win->_use_keypad = bf; } E 1 h35133 s 00001/00001/00011 d D 3.2 87/05/13 18:45:32 build 4 3 c removed old SCCS strings and inserted #ident BB e s 00000/00000/00012 d D 3.1 87/01/20 18:50:24 mkm 3 2 c e s 00000/00000/00012 d D 2.1 87/01/20 18:41:05 mkm 2 1 c e s 00012/00000/00000 d D 1.1 87/01/20 18:31:57 mkm 1 0 c Placed under source control - mkm e u U f b f n t T I 1 D 4 /* " %W% %E% " */ E 4 I 4 #ident " %W% %E% " E 4 #include "curses.ext" char killchar() { #ifdef USG return cur_term->Ottyb.c_cc[VKILL]; #else return cur_term->Ottyb.sg_kill; #endif } E 1 h36262 s 00001/00001/00010 d D 3.2 87/05/13 18:45:42 build 4 3 c removed old SCCS strings and inserted #ident BB e s 00000/00000/00011 d D 3.1 87/01/20 18:50:25 mkm 3 2 c e s 00000/00000/00011 d D 2.1 87/01/20 18:41:06 mkm 2 1 c e s 00011/00000/00000 d D 1.1 87/01/20 18:31:58 mkm 1 0 c Placed under source control - mkm e u U f b f n t T I 1 D 4 /* " %W% %E% " */ E 4 I 4 #ident " %W% %E% " E 4 #include "curses.ext" /* * TRUE => OK to leave cursor where it happens to fall after refresh. */ leaveok(win,bf) WINDOW *win; int bf; { win->_leave = bf; } E 1 h25502 s 00001/00002/00000 d D 3.2 87/05/13 18:46:02 build 4 3 c removed old SCCS strings and inserted #ident BB e s 00000/00000/00002 d D 3.1 87/01/20 18:50:27 mkm 3 2 c e s 00000/00000/00002 d D 2.1 87/01/20 18:41:08 mkm 2 1 c e s 00002/00000/00000 d D 1.1 87/01/20 18:31:59 mkm 1 0 c Placed under source control - mkm e u U f b f n t T I 1 D 4 /* " %W% %E% " */ static char *SCCS = " %W% %E% "; E 4 I 4 #ident " %W% %E% " E 4 E 1 h04177 s 00001/00001/00029 d D 3.2 87/05/13 18:46:16 build 4 3 c removed old SCCS strings and inserted #ident BB e s 00000/00000/00030 d D 3.1 87/01/20 18:50:29 mkm 3 2 c e s 00000/00000/00030 d D 2.1 87/01/20 18:41:09 mkm 2 1 c e s 00030/00000/00000 d D 1.1 87/01/20 18:32:03 mkm 1 0 c Placed under source control - mkm e u U f b f n t T I 1 D 4 /* " %W% %E% " */ E 4 I 4 #ident " %W% %E% " E 4 #include "curses.ext" /* * _line_alloc returns a pointer to a new line structure. */ struct line * _line_alloc () { register struct line *rv = SP->freelist; char *calloc(); #ifdef DEBUG if(outf) fprintf(outf, "mem: _line_alloc (), prev SP->freelist %x\n", SP->freelist); #endif if (rv) { SP->freelist = rv -> next; } else { #ifdef NONSTANDARD _ec_quit("No lines available in line_alloc", ""); #else rv = (struct line *) calloc (1, sizeof *rv); rv -> body = (chtype *) calloc (columns, sizeof (chtype)); #endif } rv -> length = 0; rv -> hash = 0; return rv; } E 1 h11761 s 00001/00001/00399 d D 3.2 87/05/13 18:46:32 build 4 3 c removed old SCCS strings and inserted #ident BB e s 00000/00000/00400 d D 3.1 87/01/20 18:50:31 mkm 3 2 c e s 00000/00000/00400 d D 2.1 87/01/20 18:41:11 mkm 2 1 c e s 00400/00000/00000 d D 1.1 87/01/20 18:32:03 mkm 1 0 c Placed under source control - mkm e u U f b f n t T I 1 D 4 /* " %W% %E% " */ E 4 I 4 #ident " %W% %E% " E 4 #include "curses.ext" extern int InputPending; extern int outchcount; extern int *context; int didntdobotright; /* writechars didn't output char in bot right corner */ /* * Optimally make the screen (which currently looks like SP->cur_body) * look like SP->std_body. If use_idl is 1, this routine will call * out all its horses, including some code to figure out * how to use insert/delete line. If use_idl is 0, or if the terminal * does not have insert/delete line, a simpler scheme will * be used, and the insert/delete line features of the terminal will not * be used. * * While the original intent of this parameter was speed (insert/delete * line was slow) the parameter currently is there to avoid annoying * the user with unnecessary insert/delete lines. */ int _ll_refresh (use_idl) int use_idl; { register int n, i, j; register struct line *dln, *pln; struct line *_line_alloc(); #ifdef DEBUG if(outf) fprintf(outf, "_ll_refresh(%d)\n", use_idl); if(outf) fprintf(outf, "phys cursor at (%d,%d), want cursor at (%d,%d)\n", SP->phys_y, SP->phys_x, SP->virt_y, SP->virt_x); #endif DEBUG outchcount = 0; #ifdef FIONREAD if( SP->check_fd >= 0 ) { ioctl (SP->check_fd, FIONREAD, &InputPending); } else { InputPending = 0; } if( InputPending ) { #ifdef DEBUG if (outf) fprintf(outf, "InputPending %d, aborted ll_refresh at start\n", InputPending); #endif DEBUG return 0; } #endif FIONREAD #ifdef NONSTANDARD input_wait(); #endif NONSTANDARD #ifdef DEBUG if (outf) fprintf(outf, "virt cursor at y=%d, x=%d, length %d\n", SP->virt_y, SP->virt_x, SP->std_body[SP->virt_y+1]->length); #endif DEBUG if( SP->virt_y >= 0 && SP->std_body[SP->virt_y+1]->length < SP->virt_x ) { SP->std_body[SP->virt_y+1]->length = SP->virt_x >= columns ? columns : SP->virt_x; } /* Get rid of trailing blanks on all lines */ for( n = 1; n <= lines; n++ ) { dln = SP->std_body[n]; pln = SP->cur_body[n]; if( dln && dln != pln ) { register chtype *p; if( i = dln->length ) { p = dln->body + i; while( *--p == ' ' && --i > 0 ) ; dln->length = i; } } if( pln ) { register chtype *p; if( i = pln->length ) { p = pln->body + i; while( *--p == ' ' && --i > 0 ) ; pln->length = i; } } } if( magic_cookie_glitch > 0 ) _toss_cookies(); #ifdef DEBUG if(outf) fprintf(outf, "what we have:\n"); for( i=1; i<=lines; i++ ) { if(outf) fprintf(outf, "%8x: ", SP->cur_body[i]); if( SP->cur_body[i] == NULL ) { if(outf) fprintf(outf, "()\n"); } else { if(outf) fprintf(outf, "%4d ", SP->cur_body[i]->length); for( j=0; jcur_body[i]->length; j++ ) { n = SP->cur_body[i]->body[j]; if( n & A_ATTRIBUTES ) { putc('\'', outf); } n &= 0177; if(outf) fprintf(outf, "%c", n>=' ' ? n : '.'); } if(outf) fprintf(outf, "\n"); } } if(outf) fprintf(outf, "what we want:\n"); for (i=1; i<=lines; i++) { if(outf) fprintf(outf, "%8x: ", SP->std_body[i]); if (SP->std_body[i] == NULL) { if(outf) fprintf(outf, "()\n"); } else { if(outf) fprintf(outf, "%4d ", SP->std_body[i]->length); for (j=0; jstd_body[i]->length; j++) { n = SP->std_body[i]->body[j]; if (n & A_ATTRIBUTES) { putc('\'', outf); } n &= 0177; if(outf) fprintf(outf, "%c", n>=' ' ? n : '.'); } if(outf) fprintf(outf, "\n"); } } if(outf) fprintf(outf, "----\n"); if(outf) fflush(outf); #endif DEBUG SP->check_input = SP->baud / 2400; if (SP->doclear) { #ifdef DEBUG if(outf) fprintf(outf, "SP->doclear, clearing screen\n"); #endif _reset(); SP->doclear = 0; for( n = 0; n <= lines; n++ ) { if( SP->cur_body[n] != SP->std_body[n] ) { _line_free( SP->cur_body[n] ); } SP->cur_body[n] = 0; } } /* Choose between two updating algorithms. */ if( use_idl && _cost(ilfixed) < INFINITY ) { #ifdef DEBUG if(outf) fprintf(outf, "use_idl\n"); #endif for( n = 1; n <= lines; n++ ) { if( SP->cur_body[n] == 0 ) { SP->cur_body[n] = _line_alloc(); } if( SP->std_body[n] == 0 ) { SP->std_body[n] = SP->cur_body[n]; } else { _comphash( SP->std_body[n] ); } _comphash( SP->cur_body[n] ); } /* * Count number of matches if we scroll 1 line and if we * don't scroll at all. This is primarily useful for the * case where we scroll the whole screen. Scrolling a portion * of the screen will be handled by the ins/del line routines, * although a special case here might buy some CPU speed. */ for( i=1,n=0,j=0; icur_body[i+1]->hash == SP->std_body[i]->hash ) n++; if( SP->cur_body[i]->hash == SP->std_body[i]->hash ) j++; } if( n > lines-3 && n > j ) { _window(0, lines-1, 0, columns-1); _scrollf(1); _line_free(SP->cur_body[1]); for( i=1; icur_body[i+1] == SP->std_body[i+1] ) { struct line *p; int l; chtype *b1, *b2; p = _line_alloc (); p->length=l=SP->cur_body[i+1]->length; p->hash = SP->cur_body[i+1]->hash; b1 = &(p->body[0]); b2 = &(SP->cur_body[i+1]->body[0]); for( ; l>0; l-- ) { *b1++ = *b2++; } SP->std_body[i+1] = p; } SP->cur_body[i] = SP->cur_body[i+1]; } SP->cur_body[lines] = _line_alloc(); } i = 1; /* * Break the screen (from 1 to lines) into clumps of * lines that are different. Thus we ignore the ones that * are identical. */ for( ;; ) { while( i<=lines && SP->cur_body[i]==SP->std_body[i] ) { i++; } if( i > lines ) { break; } for( j=i; j <= lines && SP->cur_body[j] != SP->std_body[j]; j++) ; j--; #ifdef DEBUG if(outf) fprintf(outf, "window from %d to %d\n", i, j); #endif /* i thru j is a window of different lines. */ if( i == j ) { _id_char(SP->cur_body[i], SP->std_body[i], i-1); if( SP->cur_body[i] != SP->std_body[i] ) { _line_free (SP->cur_body[i]); } SP->cur_body[i] = SP->std_body[i]; } else { _window(i-1, j-1, 0, columns-1); _setwind(); /* Force action for moves, etc */ _id_line(i, j); } i = j+1; } } else /* fast update */ { #ifdef DEBUG if(outf) fprintf(outf, "Fast Update, lines %d\n", lines); #endif _window(0, lines-1, 0, columns-1); _setwind(); /* Force action for moves, etc */ for( n = 1; n <= lines; n++ ) if( SP->std_body[n] != SP->cur_body[n] ) { _id_char( SP->cur_body[n],SP->std_body[n],n-1 ); if( SP->cur_body[n] != SP->std_body[n] ) { _line_free (SP->cur_body[n]); } SP->cur_body[n] = SP->std_body[n]; } } /* * Didn't output char in bottom right corner of screen. * Remember this fact so that next time when it's higher * on the screen, we'll fix it up. */ if( didntdobotright ) { int holdvx, holdvy; #ifdef DEBUG if (outf) fprintf(outf, "didntdobotright so setting SP->cur_body[%d]->body[%d] from '%c' to space.\n", lines, columns-1, SP->cur_body[lines]->body[columns-1]); #endif holdvx = SP->virt_x; holdvy = SP->virt_y; /* * This code in effect marks the last line dirty * so that the next time it will get fixed. It also * splits the line back into virt/phys so we don't * clobber the virtual part too. */ _ll_move(lines-1, columns-1); SP->cur_body[lines]->body[columns-1] = ' '; didntdobotright = 0; /* Now restore the cursor we clobbered. */ _ll_move(holdvy, holdvx); } _hlmode(0); _sethl(); #ifdef DEBUG if(outf) fprintf(outf, "at end, phys SP->curptr at (%d,%d), want SP->curptr at (%d,%d)\n", SP->phys_y, SP->phys_x, SP->virt_y, SP->virt_x); #endif DEBUG #ifdef notdef if(magic_cookie_glitch > 0) _fixcursor(); #endif notdef if( !InputPending && SP->virt_x >= 0 && SP->virt_y >= 0 ) { _pos (SP->virt_y, SP->virt_x); } __cflush(); #ifdef DEBUG if(outf) fprintf(outf, "end of _ll_refresh, InputPending %d\n", InputPending); if(outf) fflush(outf); #endif DEBUG return outchcount; } /* * This routine is only needed on terminals with the "magic cookie" * effect. The problem is that the designers of * these terminals didn't allocate 16 bits for * each character (7 for the character and 9 for attributes) but instead * created some reserved "magic cookie" characters to tell the scan * routine "you should change attributes now". This would be fine except * that these cookies take up a space in memory, and usually display as a * blank. This makes it impossible to display what the user really * wanted, if he is using attributes for underlining, bold, etc. Such * terminals include the Teleray 1061, TVI 912 and 950, Teletype * DataSpeed 40, and Adds Regent 40. * * One approach to this problem is to make everybody pay the price of * this effect, forcing the programmer to allocate a blank space * when attributes are changed. This works cleanly but I consider it * unacceptable. * * My approach is to simulate what the programmer (who wasn't thinking * about these terminals) wanted as closely as possible. If there * is a desired blank in there, we use that slot. If not, we shove the * rest of the line to the right one space. (When several attributes * are changed on one line, this can result in losing several characters * from the right of the line.) * * This routine looks for places in SP->std_body where shoving to the * right is needed, and does the required shoving. */ static _toss_cookies() { register int i, j, len; register struct line *dsi; register chtype *b; #ifdef DEBUG if(outf) fprintf(outf, "_toss_cookies\n"); #endif for( i=1; i<=lines; i++ ) { dsi = SP->std_body[i]; if( dsi && dsi != SP->cur_body[i] ) { len = dsi->length; b = dsi->body; for( j=0; jlength = _shove(b, len, i); break; } } } } } E 1 h44583 s 00001/00001/00016 d D 3.2 87/05/13 18:46:46 build 4 3 c removed old SCCS strings and inserted #ident BB e s 00000/00000/00017 d D 3.1 87/01/20 18:50:34 mkm 3 2 c e s 00000/00000/00017 d D 2.1 87/01/20 18:41:14 mkm 2 1 c e s 00017/00000/00000 d D 1.1 87/01/20 18:32:05 mkm 1 0 c Placed under source control - mkm e u U f b f n t T I 1 D 4 /* " %W% %E% " */ E 4 I 4 #ident " %W% %E% " E 4 /* * This routine returns the long name of the terminal. */ char * longname() { register char *cp; extern char ttytype[]; for (cp=ttytype; *cp++; ) /* Go to end of string */ ; while (*--cp != '|' && cp>=ttytype) /* Back up to | or beginning */ ; return ++cp; } E 1 h42608 s 00001/00001/00112 d D 3.2 87/05/13 18:47:00 build 4 3 c removed old SCCS strings and inserted #ident BB e s 00000/00000/00113 d D 3.1 87/01/20 18:50:35 mkm 3 2 c e s 00000/00000/00113 d D 2.1 87/01/20 18:41:15 mkm 2 1 c e s 00113/00000/00000 d D 1.1 87/01/20 18:32:06 mkm 1 0 c Placed under source control - mkm e u U f b f n t T I 1 D 4 /* " %W% %E% " */ E 4 I 4 #ident " %W% %E% " E 4 # include "curses.ext" # include /* * mini.c contains versions of curses routines for minicurses. * They work just like their non-mini counterparts but draw on * std_body rather than stdscr. This cuts down on overhead but * restricts what you are allowed to do - you can't get stuff back * from the screen and you can't use multiple windows or things * like insert/delete line (the logical ones that affect the screen). * All this but multiple windows could probably be added if somebody * wanted to mess with it. * */ m_addch(c) register chtype c; { register int x, y; char *uctr; register char rawc = c & A_CHARTEXT; #ifdef DEBUG if (outf) fprintf(outf, "m_addch: [(%d,%d)] ", stdscr->_cury, stdscr->_curx); #endif x = stdscr->_curx; y = stdscr->_cury; # ifdef DEBUG if (c == rawc) if(outf) fprintf(outf, "'%c'", rawc); else if(outf) fprintf(outf, "'%c' %o, raw %o", c, c, rawc); # endif if (y >= stdscr->_maxy || x >= stdscr->_maxx || y < 0 || x < 0) { return ERR; } switch (rawc) { case '\t': { register int newx; for (newx = x + (8 - (x & 07)); x < newx; x++) if (m_addch(' ') == ERR) return ERR; return OK; } default: if (rawc < ' ' || rawc > '~') { uctr = unctrl(rawc); m_addch((chtype)uctr[0]|(c&A_ATTRIBUTES)); m_addch((chtype)uctr[1]|(c&A_ATTRIBUTES)); return OK; } if (stdscr->_attrs) { #ifdef DEBUG if(outf) fprintf(outf, "(attrs %o, %o=>%o)", stdscr->_attrs, c, c | stdscr->_attrs); #endif c |= stdscr->_attrs;; } /* This line actually puts it out. */ SP->virt_x++; *(SP->curptr++) = c; if (x >= stdscr->_maxx) { x = 0; new_line: if (++y >= stdscr->_maxy) if (stdscr->_scroll) { _ll_refresh(stdscr->_use_idl); _scrdown(); --y; } else { # ifdef DEBUG int i; if(outf) fprintf(outf, "ERR because (%d,%d) > (%d,%d)\n", x, y, stdscr->_maxx, stdscr->_maxy); if(outf) fprintf(outf, "line: '"); if(outf) for (i=0; i_maxy; i++) fprintf(outf, "%c", stdscr->_y[y-1][i]); if(outf) fprintf(outf, "'\n"); # endif return ERR; } _ll_move(y, x); } # ifdef FULLDEBUG if(outf) fprintf(outf, "ADDCH: 2: y = %d, x = %d, firstch = %d, lastch = %d\n", y, x, stdscr->_firstch[y], stdscr->_lastch[y]); # endif break; case '\n': # ifdef DEBUG if (outf) fprintf(outf, "newline, y %d, lengths %d->%d, %d->%d, %d->%d\n", y, y, SP->std_body[y]->length, y+1, SP->std_body[y+1]->length, y+2, SP->std_body[y+2]->length); # endif if (SP->std_body[y+1]) SP->std_body[y+1]->length = x; x = 0; goto new_line; case '\r': x = 0; break; case '\b': if (--x < 0) x = 0; break; } stdscr->_curx = x; stdscr->_cury = y; #ifdef DEBUG if (outf) fprintf(outf, " => (%d,%d)]\n", stdscr->_cury, stdscr->_curx); #endif return OK; } E 1 h25603 s 00001/00001/00030 d D 3.2 87/05/13 18:47:13 build 4 3 c removed old SCCS strings and inserted #ident BB e s 00000/00000/00031 d D 3.1 87/01/20 18:50:37 mkm 3 2 c e s 00000/00000/00031 d D 2.1 87/01/20 18:41:17 mkm 2 1 c e s 00031/00000/00000 d D 1.1 87/01/20 18:32:07 mkm 1 0 c Placed under source control - mkm e u U f b f n t T I 1 D 4 /* " %W% %E% " */ E 4 I 4 #ident " %W% %E% " E 4 # include "curses.ext" # include /* * mini.c contains versions of curses routines for minicurses. * They work just like their non-mini counterparts but draw on * std_body rather than stdscr. This cuts down on overhead but * restricts what you are allowed to do - you can't get stuff back * from the screen and you can't use multiple windows or things * like insert/delete line (the logical ones that affect the screen). * All this but multiple windows could probably be added if somebody * wanted to mess with it. * */ /* * This routine adds a string starting at (_cury,_curx) * */ m_addstr(str) register char *str; { # ifdef DEBUG if(outf) fprintf(outf, "M_ADDSTR(\"%s\")\n", str); # endif while (*str) if (m_addch((chtype) *str++) == ERR) return ERR; return OK; } E 1 h20565 s 00001/00001/00026 d D 3.2 87/05/13 18:47:28 build 4 3 c removed old SCCS strings and inserted #ident BB e s 00000/00000/00027 d D 3.1 87/01/20 18:50:39 mkm 3 2 c e s 00000/00000/00027 d D 2.1 87/01/20 18:41:18 mkm 2 1 c e s 00027/00000/00000 d D 1.1 87/01/20 18:32:07 mkm 1 0 c Placed under source control - mkm e u U f b f n t T I 1 D 4 /* " %W% %E% " */ E 4 I 4 #ident " %W% %E% " E 4 # include "curses.ext" # include /* * mini.c contains versions of curses routines for minicurses. * They work just like their non-mini counterparts but draw on * std_body rather than stdscr. This cuts down on overhead but * restricts what you are allowed to do - you can't get stuff back * from the screen and you can't use multiple windows or things * like insert/delete line (the logical ones that affect the screen). * All this but multiple windows could probably be added if somebody * wanted to mess with it. * */ /* * Like m_erase but ensures that the screen will be cleared on next refresh. */ m_clear() { #ifdef DEBUG if (outf) fprintf(outf, "M_CLEAR\n"); #endif SP->doclear = 1; m_erase(); } E 1 h24379 s 00001/00001/00029 d D 3.2 87/05/13 18:47:44 build 4 3 c removed old SCCS strings and inserted #ident BB e s 00000/00000/00030 d D 3.1 87/01/20 18:50:41 mkm 3 2 c e s 00000/00000/00030 d D 2.1 87/01/20 18:41:20 mkm 2 1 c e s 00030/00000/00000 d D 1.1 87/01/20 18:32:08 mkm 1 0 c Placed under source control - mkm e u U f b f n t T I 1 D 4 /* " %W% %E% " */ E 4 I 4 #ident " %W% %E% " E 4 # include "curses.ext" # include /* * mini.c contains versions of curses routines for minicurses. * They work just like their non-mini counterparts but draw on * std_body rather than stdscr. This cuts down on overhead but * restricts what you are allowed to do - you can't get stuff back * from the screen and you can't use multiple windows or things * like insert/delete line (the logical ones that affect the screen). * All this but multiple windows could probably be added if somebody * wanted to mess with it. * */ /* * Erase the contents of the desired screen - set to all _blanks. */ m_erase() { register int n; #ifdef DEBUG if (outf) fprintf(outf, "M_ERASE, erasing %d lines\n", lines); #endif for (n = 0; n < lines; n++) { _clearline(n); } } E 1 h32298 s 00001/00001/00029 d D 3.2 87/05/13 18:47:59 build 4 3 c removed old SCCS strings and inserted #ident BB e s 00000/00000/00030 d D 3.1 87/01/20 18:50:42 mkm 3 2 c e s 00000/00000/00030 d D 2.1 87/01/20 18:41:22 mkm 2 1 c e s 00030/00000/00000 d D 1.1 87/01/20 18:32:09 mkm 1 0 c Placed under source control - mkm e u U f b f n t T I 1 D 4 /* " %W% %E% " */ E 4 I 4 #ident " %W% %E% " E 4 # include "curses.ext" # include /* * mini.c contains versions of curses routines for minicurses. * They work just like their non-mini counterparts but draw on * std_body rather than stdscr. This cuts down on overhead but * restricts what you are allowed to do - you can't get stuff back * from the screen and you can't use multiple windows or things * like insert/delete line (the logical ones that affect the screen). * All this but multiple windows could probably be added if somebody * wanted to mess with it. * */ /* * Move to given location on stdscr. Update curses notion of where we * are (stdscr). This could be a macro * and originally was, but if you do * move(line++, 0) * it will increment line twice, which is a lose. */ m_move(row, col) int row, col; { stdscr->_cury=row; stdscr->_curx=col; _ll_move(row,col); } E 1 h30781 s 00001/00001/00029 d D 3.2 87/05/13 18:48:13 build 4 3 c removed old SCCS strings and inserted #ident BB e s 00000/00000/00030 d D 3.1 87/01/20 18:50:44 mkm 3 2 c e s 00000/00000/00030 d D 2.1 87/01/20 18:41:23 mkm 2 1 c e s 00030/00000/00000 d D 1.1 87/01/20 18:32:11 mkm 1 0 c Placed under source control - mkm e u U f b f n t T I 1 D 4 /* " %W% %E% " */ E 4 I 4 #ident " %W% %E% " E 4 # include "curses.ext" # include /* * mini.c contains versions of curses routines for minicurses. * They work just like their non-mini counterparts but draw on * std_body rather than stdscr. This cuts down on overhead but * restricts what you are allowed to do - you can't get stuff back * from the screen and you can't use multiple windows or things * like insert/delete line (the logical ones that affect the screen). * All this but multiple windows could probably be added if somebody * wanted to mess with it. * */ /* * Update the screen. Like refresh but minicurses version. */ m_refresh() { /* Tell the back end where to leave the cursor */ if (stdscr->_leave) { _ll_move(-1, -1); } else { _ll_move(stdscr->_cury+stdscr->_begy, stdscr->_curx+stdscr->_begx); } return _ll_refresh(stdscr->_use_idl); } E 1 h27100 s 00001/00001/00036 d D 3.2 87/05/13 18:48:31 build 4 3 c removed old SCCS strings and inserted #ident BB e s 00000/00000/00037 d D 3.1 87/01/20 18:50:45 mkm 3 2 c e s 00000/00000/00037 d D 2.1 87/01/20 18:41:25 mkm 2 1 c e s 00037/00000/00000 d D 1.1 87/01/20 18:32:12 mkm 1 0 c Placed under source control - mkm e u U f b f n t T I 1 D 4 /* " %W% %E% " */ E 4 I 4 #ident " %W% %E% " E 4 # include "curses.ext" # include /* * mini.c contains versions of curses routines for minicurses. * They work just like their non-mini counterparts but draw on * std_body rather than stdscr. This cuts down on overhead but * restricts what you are allowed to do - you can't get stuff back * from the screen and you can't use multiple windows or things * like insert/delete line (the logical ones that affect the screen). * All this but multiple windows could probably be added if somebody * wanted to mess with it. * */ # ifdef SIGTSTP /* * handle stop and start signals * */ m_tstp() { # ifdef DEBUG if (outf) fflush(outf); # endif _ll_move(lines-1, 0); endwin(); fflush(stdout); kill(0, SIGTSTP); signal(SIGTSTP, m_tstp); reset_prog_mode(); SP->doclear = 1; _ll_refresh(0); } # endif E 1 h28539 s 00001/00001/00009 d D 3.2 87/05/13 18:48:42 build 4 3 c removed old SCCS strings and inserted #ident BB e s 00000/00000/00010 d D 3.1 87/01/20 18:50:47 mkm 3 2 c e s 00000/00000/00010 d D 2.1 87/01/20 18:41:27 mkm 2 1 c e s 00010/00000/00000 d D 1.1 87/01/20 18:32:13 mkm 1 0 c Placed under source control - mkm e u U f b f n t T I 1 D 4 /* " %W% %E% " */ E 4 I 4 #ident " %W% %E% " E 4 main { _dumpwin(); _sputc(); m_tstp(); tstp(); two.twostr(); } E 1 h20323 s 00000/00000/00245 d D 3.1 87/01/20 18:50:49 mkm 3 2 c e s 00000/00000/00245 d D 2.1 87/01/20 18:41:28 mkm 2 1 c e s 00245/00000/00000 d D 1.1 87/01/20 18:32:14 mkm 1 0 c Placed under source control - mkm e u U f b f n t T I 1 # " %W% %E% " # Curses Library Low Level Makefile # update history for Ridge: # # 05/11/84 dont' include delayoutpt.c (see naps.c) # remove gettmode() and setterm() entry from miniinit.c # int *context in ll_refresh.c is unused # # CFLAGS has -DVIDEO & -DKEYPAD for the libcurses.a library. They could # be put into a separate variable if desired, but I saw no reason # for doing so. # DFLAGS, TFLAGS, & PFLAGS are for debugging, tracing, & profiling # respectively. They all contain the DEBUG flag because it is # thought that any of the styles of compiling is still debugging. # Also the DEBUG flag will create very large files and it is not # recommended that all of the files be compiled with the DEBUG # flag defined. This will make 'ar' die because the library will # exceed 2065 blocks in size. But I see no reason not to compile # individual or groups of files with these flags defined. These # flags can't be used on a pdp11/70 or other small machines # because of the huge sizes of .o files produced for the library. # MINICURSES is a flag used to compile a small version of libcurses. # It should not be used for the compiling of libcurses.a. It is # strictly for the application programmers convenience. # If MINICURSES is desired with ti4 or show then type: # "make <[ti4][show] MINICURSES=-DMINICURSES" # include /usr/src/makerules VFLAGS= INSDIR=/priam/release DEST=${INSDIR}/ LIB = usr/lib BIN = usr/bin INS= cp LPR=/bin/lpr LPROPTS=-f FILES = AR = ar LIBNAME = libcurses.a MINICURSES = CFLAGS = -O -DVIDEO -DKEYPAD ${MINICURSES} -I. DFLAGS = -DVIDEO -DKEYPAD -DDEBUG -I. TFLAGS = -DVIDEO -DKEYPAD -DDEBUG -O -I. PFLAGS = -DVIDEO -DKEYPAD -DDEBUG -p -O -I. SRCS = __cflush.c __sscans.c _blanks.c _c_clean.c \ _clearhl.c _clearline.c _comphash.c _delay.c \ _delchars.c _dellines.c _dumpwin.c _ec_quit.c \ _fixdelay.c _forcehl.c _hlmode.c _id_char.c \ _init_cost.c _inschars.c _insmode.c _kpmode.c \ _line_free.c _ll_move.c _outch.c _outchar.c \ _pos.c _reset.c _scrdown.c _scrollf.c _sethl.c \ _setmode.c _setwind.c _shove.c _sprintw.c \ _sputc.c _syncmodes.c _tscroll.c _window.c \ addch.c addstr.c baudrate.c beep.c box.c \ capnames.c cbreak.c chktypeahd.c clear.c \ clearok.c clreolinln.c clrtobot.c clrtoeol.c \ cntcostfn.c crmode.c curses.c def_prog.c \ def_shell.c delch.c deleteln.c \ delwin.c doprnt.c doscan.c doupdate.c draino.c \ echo.c endwin.c erase.c erasechar.c fixterm.c \ flash.c flushinp.c getch.c getstr.c idlok.c \ gettmode.c has_ic.c has_il.c idln.getst.c \ initkeypad.c initscr.c insch.c insertln.c \ intrflush.c keypad.c killchar.c leaveok.c \ line_alloc.c ll_refresh.c longname.c m_addch.c \ m_addstr.c m_clear.c m_erase.c m_move.c meta.c \ m_refresh.c m_tstp.c makenew.c miniinit.c \ move.c mvcur.c mvprintw.c mvscanw.c mvwin.c \ mvwprintw.c mvwscanw.c naps.c newpad.c \ newterm.c newwin.c nl.c nocbreak.c nocrmode.c \ nodelay.c noecho.c nonl.c noraw.c nttychktrm.c \ overlay.c overwrite.c pnoutrfrsh.c prefresh.c \ printw.c putp.c raw.c reset_prog.c resetshell.c \ resetterm.c resetty.c restarttrm.c saveterm.c \ savetty.c scanw.c scroll.c scrollok.c select.c \ set_term.c setbuffred.c setterm.c setupterm.c \ showstring.c subwin.c tgetent.c tgetflag.c \ tgetnum.c tgetstr.c tgoto.c touchwin.c tparm.c \ tputs.c traceonoff.c tstp.c two.twostr.c \ typeahead.c unctrl.c vidattr.c vidputs.c \ vsprintf.c vsscanf.c wattroff.c wattron.c \ wattrset.c wnoutrfrsh.c wprintw.c wrefresh.c \ writechars.c wscanw.c wstandend.c wstandout.c \ version.c OBJS = $(LIBNAME)(__cflush.o) $(LIBNAME)(__sscans.o) \ $(LIBNAME)(_blanks.o) $(LIBNAME)(_c_clean.o) \ $(LIBNAME)(_clearhl.o) $(LIBNAME)(_clearline.o) \ $(LIBNAME)(_comphash.o) $(LIBNAME)(_delay.o) \ $(LIBNAME)(_delchars.o) $(LIBNAME)(_dellines.o) \ $(LIBNAME)(_dumpwin.o) $(LIBNAME)(_ec_quit.o) \ $(LIBNAME)(_fixdelay.o) $(LIBNAME)(_forcehl.o) \ $(LIBNAME)(_hlmode.o) $(LIBNAME)(_id_char.o) \ $(LIBNAME)(_init_cost.o) $(LIBNAME)(_inschars.o) \ $(LIBNAME)(_insmode.o) $(LIBNAME)(_kpmode.o) \ $(LIBNAME)(_line_free.o) $(LIBNAME)(_ll_move.o) \ $(LIBNAME)(_outch.o) $(LIBNAME)(_outchar.o) \ $(LIBNAME)(_pos.o) $(LIBNAME)(_reset.o) \ $(LIBNAME)(_scrdown.o) $(LIBNAME)(_scrollf.o) \ $(LIBNAME)(_sethl.o) $(LIBNAME)(_setmode.o) \ $(LIBNAME)(_setwind.o) $(LIBNAME)(_shove.o) \ $(LIBNAME)(_sprintw.o) $(LIBNAME)(_sputc.o) \ $(LIBNAME)(_syncmodes.o) $(LIBNAME)(_tscroll.o) \ $(LIBNAME)(_window.o) $(LIBNAME)(addch.o) \ $(LIBNAME)(addstr.o) $(LIBNAME)(baudrate.o) \ $(LIBNAME)(beep.o) $(LIBNAME)(box.o) \ $(LIBNAME)(capnames.o) $(LIBNAME)(cbreak.o) \ $(LIBNAME)(chktypeahd.o) $(LIBNAME)(clear.o) \ $(LIBNAME)(clearok.o) $(LIBNAME)(clreolinln.o) \ $(LIBNAME)(clrtobot.o) $(LIBNAME)(clrtoeol.o) \ $(LIBNAME)(cntcostfn.o) $(LIBNAME)(crmode.o) \ $(LIBNAME)(curses.o) $(LIBNAME)(def_prog.o) \ $(LIBNAME)(def_shell.o) $(LIBNAME)(delch.o) \ $(LIBNAME)(deleteln.o) $(LIBNAME)(delwin.o) \ $(LIBNAME)(doprnt.o) $(LIBNAME)(doscan.o) \ $(LIBNAME)(doupdate.o) $(LIBNAME)(draino.o) \ $(LIBNAME)(echo.o) $(LIBNAME)(endwin.o) \ $(LIBNAME)(erase.o) $(LIBNAME)(erasechar.o) \ $(LIBNAME)(fixterm.o) $(LIBNAME)(flash.o) \ $(LIBNAME)(flushinp.o) $(LIBNAME)(getch.o) \ $(LIBNAME)(getstr.o) $(LIBNAME)(idlok.o) \ $(LIBNAME)(gettmode.o) $(LIBNAME)(has_ic.o) \ $(LIBNAME)(has_il.o) $(LIBNAME)(idln.getst.o) \ $(LIBNAME)(initkeypad.o) $(LIBNAME)(initscr.o) \ $(LIBNAME)(insch.o) $(LIBNAME)(insertln.o) \ $(LIBNAME)(intrflush.o) $(LIBNAME)(keypad.o) \ $(LIBNAME)(killchar.o) $(LIBNAME)(leaveok.o) \ $(LIBNAME)(line_alloc.o) $(LIBNAME)(ll_refresh.o) \ $(LIBNAME)(longname.o) $(LIBNAME)(m_addch.o) \ $(LIBNAME)(m_addstr.o) $(LIBNAME)(m_clear.o) \ $(LIBNAME)(m_erase.o) $(LIBNAME)(m_move.o) \ $(LIBNAME)(meta.o) $(LIBNAME)(m_refresh.o) \ $(LIBNAME)(m_tstp.o) $(LIBNAME)(makenew.o) \ $(LIBNAME)(miniinit.o) $(LIBNAME)(move.o) \ $(LIBNAME)(mvcur.o) $(LIBNAME)(mvprintw.o) \ $(LIBNAME)(mvscanw.o) $(LIBNAME)(mvwin.o) \ $(LIBNAME)(mvwprintw.o) $(LIBNAME)(mvwscanw.o) \ $(LIBNAME)(naps.o) $(LIBNAME)(newpad.o) \ $(LIBNAME)(newterm.o) $(LIBNAME)(newwin.o) \ $(LIBNAME)(nl.o) $(LIBNAME)(nocbreak.o) \ $(LIBNAME)(nocrmode.o) $(LIBNAME)(nodelay.o) \ $(LIBNAME)(noecho.o) $(LIBNAME)(nonl.o) \ $(LIBNAME)(noraw.o) $(LIBNAME)(nttychktrm.o) \ $(LIBNAME)(overlay.o) $(LIBNAME)(overwrite.o) \ $(LIBNAME)(pnoutrfrsh.o) $(LIBNAME)(prefresh.o) \ $(LIBNAME)(printw.o) $(LIBNAME)(putp.o) \ $(LIBNAME)(raw.o) $(LIBNAME)(reset_prog.o) \ $(LIBNAME)(resetshell.o) $(LIBNAME)(resetterm.o) \ $(LIBNAME)(resetty.o) $(LIBNAME)(restarttrm.o) \ $(LIBNAME)(saveterm.o) $(LIBNAME)(savetty.o) \ $(LIBNAME)(scanw.o) $(LIBNAME)(scroll.o) \ $(LIBNAME)(scrollok.o) $(LIBNAME)(select.o) \ $(LIBNAME)(set_term.o) $(LIBNAME)(setbuffred.o) \ $(LIBNAME)(setterm.o) $(LIBNAME)(setupterm.o) \ $(LIBNAME)(showstring.o) $(LIBNAME)(subwin.o) \ $(LIBNAME)(tgetent.o) $(LIBNAME)(tgetflag.o) \ $(LIBNAME)(tgetnum.o) $(LIBNAME)(tgetstr.o) \ $(LIBNAME)(tgoto.o) $(LIBNAME)(touchwin.o) \ $(LIBNAME)(tparm.o) $(LIBNAME)(tputs.o) \ $(LIBNAME)(traceonoff.o) $(LIBNAME)(tstp.o) \ $(LIBNAME)(two.twostr.o) $(LIBNAME)(typeahead.o) \ $(LIBNAME)(unctrl.o) $(LIBNAME)(vidattr.o) \ $(LIBNAME)(vidputs.o) $(LIBNAME)(vsprintf.o) \ $(LIBNAME)(vsscanf.o) $(LIBNAME)(wattroff.o) \ $(LIBNAME)(wattron.o) $(LIBNAME)(wattrset.o) \ $(LIBNAME)(wnoutrfrsh.o) $(LIBNAME)(wprintw.o) \ $(LIBNAME)(wrefresh.o) $(LIBNAME)(writechars.o) \ $(LIBNAME)(wscanw.o) $(LIBNAME)(wstandend.o) \ $(LIBNAME)(wstandout.o) HDR-MISC = unctrl.h curshdr.h term.h \ unctrl.h ../local/uparm.h curses.ext \ boolnames boolvals caps maketerm.ex numnames numvals strnames \ strvals termcap.ed termcap.form all: Version.lib $(LIBNAME) Version.tic tic test: $(LIBNAME) tic Version.lib: makeversion -c $(VFLAGS) s.libcurses.v $(SRCS) $(HDR-MISC) $(LIBNAME): $(OBJS) $(LIBNAME)(version.o) $(CC) -c $(CFLAGS) $(?:.o=.c) $(AR) rv $(LIBNAME) $? -rm -f $? $(OBJS): curses.ext $(LIBNAME)(version.o): libcurses.v debug: $(MAKE) -$(MAKEFLAGS) CFLAGS="$(DFLAGS)" LIBNAME=libdcurses.a $(FILES) $(AR) rv $(LIBNAME) $(FILES) trace: $(MAKE) -$(MAKEFLAGS) CFLAGS="$(TFLAGS)" LIBNAME=libtcurses.a $(FILES) $(AR) rv $(LIBNAME) $% profile: $(MAKE) -$(MAKEFLAGS) CFLAGS="$(PFLAGS)" LIBNAME=libpcurses.a $(FILES) $(AR) rv $(LIBNAME) $% show: libcurses.a show.o $(CC) $(CFLAGS) $(MINICURSES) show.o libcurses.a -o show tic: tic.o capnames.o $(CC) $(CFLAGS) $(MINICURSES) tic.o capnames.o -o tic Version.tic: makeversion -c s.tic.v tic.c capnames.c ../local/uparm.h tic.o: ../local/uparm.h tic.v ti4: libcurses.a ti4.o $(CC) $(CFLAGS) $(MINICURSES) ti4.o libcurses.a -o ti4 ti4.o: mkti4.c $(CC) mkti4.c -O -o mkti4 ./mkti4 >ti4.c $(CC) $(CFLAGS) -c $(MINICURSES) ti4.c install: -mkdir ${DEST}usr/preserve chmod 777 ${DEST}usr/preserve chown bin ${DEST}usr/preserve chgrp bin ${DEST}usr/preserve -mkdir ${DEST}${BIN} chmod 755 $(DEST)${BIN} chown bin $(DEST)$(BIN) chgrp bin $(DEST)$(BIN) $(INS) $(LIBNAME) ${DEST}${LIB} $(INS) tic ${DEST}${BIN} chmod 755 ${DEST}${BIN}/tic chmod 644 ${DEST}${LIB}/${LIBNAME} chgrp bin ${DEST}${BIN}/tic ${DEST}${LIB}/${LIBNAME} chown bin ${DEST}${BIN}/tic ${DEST}${LIB}/${LIBNAME} listing: $(LPR) $(LPROPTS) $(SRCS) $(HDR-MISC) clean: : clobber: clean -rm -f libcurses.a tic E 1 h27000 s 00001/00001/00087 d D 3.2 87/05/13 18:48:54 build 4 3 c removed old SCCS strings and inserted #ident BB e s 00000/00000/00088 d D 3.1 87/01/20 18:50:51 mkm 3 2 c e s 00000/00000/00088 d D 2.1 87/01/20 18:41:31 mkm 2 1 c e s 00088/00000/00000 d D 1.1 87/01/20 18:32:15 mkm 1 0 c Placed under source control - mkm e u U f b f n t T I 1 D 4 /* " %W% %E% " */ E 4 I 4 #ident " %W% %E% " E 4 # include "curses.ext" # include char *calloc(); char *malloc(); extern char *getenv(); extern WINDOW *makenew(); /* * This routine sets up a window buffer and returns a pointer to it. */ WINDOW * makenew(num_lines, num_cols, begy, begx) int num_lines, num_cols, begy, begx; { register int i; register WINDOW *win; register int by, bx, nlines, ncols; char *malloc(), *calloc(); by = begy; bx = begx; nlines = num_lines; ncols = num_cols; if (nlines <= 0 || ncols <= 0 || by > LINES || bx > COLS) return NULL; # ifdef DEBUG if(outf) fprintf(outf, "MAKENEW(%d, %d, %d, %d)\n", nlines, ncols, by, bx); # endif if ((win = (WINDOW *) calloc(1, sizeof (WINDOW))) == NULL) return NULL; # ifdef DEBUG if(outf) fprintf(outf, "MAKENEW: nlines = %d\n", nlines); # endif if ((win->_y = (chtype **) calloc(nlines, sizeof (chtype *))) == NULL) { cfree((char *)win); return (WINDOW *) NULL; } if ((win->_firstch = (short *) calloc(nlines, sizeof (short))) == NULL) { cfree((char *)win); cfree((char *)win->_y); } if ((win->_lastch = (short *) calloc(nlines, sizeof (short))) == NULL) { cfree((char *)win); cfree((char *)win->_y); cfree((char *)win->_firstch); } # ifdef DEBUG if(outf) fprintf(outf, "MAKENEW: ncols = %d\n", ncols); # endif win->_cury = win->_curx = 0; win->_clear = (nlines == LINES && ncols == COLS); win->_maxy = nlines; win->_maxx = ncols; win->_begy = by; win->_begx = bx; win->_scroll = win->_leave = win->_use_idl = FALSE; win->_tmarg = 0; win->_bmarg = nlines - 1; for (i = 0; i < nlines; i++) win->_firstch[i] = win->_lastch[i] = _NOCHANGE; if (bx + ncols == COLS) { win->_flags |= _ENDLINE; /* Full window: scrolling heuristics (linefeed) work */ if (nlines == LINES && ncols == COLS && by == 0 && bx == 0 && scroll_forward) win->_flags |= _FULLWIN; /* Scrolling window: it might scroll on us by accident */ if (by + nlines == LINES && auto_right_margin) win->_flags |= _SCROLLWIN; } # ifdef DEBUG if(outf) fprintf(outf, "MAKENEW: win->_clear = %d\n", win->_clear); if(outf) fprintf(outf, "MAKENEW: win->_leave = %d\n", win->_leave); if(outf) fprintf(outf, "MAKENEW: win->_scroll = %d\n", win->_scroll); if(outf) fprintf(outf, "MAKENEW: win->_flags = %0.2o\n", win->_flags); if(outf) fprintf(outf, "MAKENEW: win->_maxy = %d\n", win->_maxy); if(outf) fprintf(outf, "MAKENEW: win->_maxx = %d\n", win->_maxx); if(outf) fprintf(outf, "MAKENEW: win->_begy = %d\n", win->_begy); if(outf) fprintf(outf, "MAKENEW: win->_begx = %d\n", win->_begx); # endif return win; } E 1 h49044 s 00000/00000/00204 d D 3.1 87/01/20 18:50:53 mkm 3 2 c e s 00000/00000/00204 d D 2.1 87/01/20 18:41:33 mkm 2 1 c e s 00204/00000/00000 d D 1.1 87/01/20 18:32:17 mkm 1 0 c Placed under source control - mkm e u U f b f n t T I 1 e caps set noreadonly g/^#/d /--- begin bool/+,/--- end bool/-w bool /--- begin num/+,/--- end num/-w num /--- begin str/+,/--- end str/-w str e! bool 1,$s/" .*/", / 1,$s/.* "/"/ 1,10j 2,$j 1i char *boolnames[] = { . $a 0 }; . w boolnames e bool 1,$s/^[^"]*"[^"]*".// 1,$s/" .*/",/ 1,10j 2,$j 1i char *boolcodes[] = { . $a 0 }; . w>> boolnames e! bool 1,$s;"[^"]*"[ ]*".." ;/* ; 1,$s;$; */; 1,$s;^; ; 1i char . $a lastbool; . w boolvals e num 1,$s/" .*/", / 1,$s/.* "/"/ 1,$j 1i char *numnames[] = { . $a 0 }; . w numnames e num 1,$s/^[^"]*"[^"]*".// 1,$s/" .*/",/ 1,$j 1i char *numcodes[] = { . $a 0 }; . w>> numnames e! num 1,$s;"[^"]*"[ ]*".." ;/* ; 1,$s;$; */; 1,$s;^; ; 1i short . $a lastnum; . w numvals e str 1,$s/" .*/", / 1,$s/.* "/"/ 1,$-10g/^/.,+9j +,$j 1i char *strnames[] = { . $a 0 }; . w strnames e str 1,$s/^[^"]*"[^"]*".// 1,$s/" .*/",/ 1,$-10g/^/.,+9j +,$j 1i char *strcodes[] = { . $a 0 }; . w>> strnames e! str 1,$s;"[^"]*"[ ]*".." ;/* ; 1,$s;$; */; 1,$s;^; strs.; $a laststr; . w strvals 1,$d f capnames.c r boolnames r numnames r strnames w! 1,$d f term.h a typedef char *charptr; struct strs { charptr . r strvals 1,.s/strs\.// $a }; struct term { . r boolvals r numvals a }; #ifndef NONSTANDARD extern struct term *cur_term; #endif . 1,$s/^ ./\U&/ 0r boolvals .r numvals .r strvals .ka 1,'av/^ /d 1,'as/^ // 1,.s/ [^ ].*/ / 1,.s/,/ / 1,.s/.*/#define & CUR \u&/ 1,.s/strs\.// 1,.s/Strs.\(.\)/strs.\u\1/ 1,+g/;/d a . $;?^}?;.i struct strs strs; struct strs2 strs2; short Filedes; /* file descriptor being written to */ #ifndef NONSTANDARD SGTTY Ottyb, /* original state of the terminal */ Nttyb; /* current state of the terminal */ #endif . " clean up unused fields 1,$s/[ ]*$// /Laststr/-s/,/;/ /Laststr/d /Lastbool/-s/,/;/ /Lastbool/d /Lastnum/-s/,/;/ /Lastnum/d " split strings into two groups < 100 to fit in ritchie compiler 1;/CUR strs/+100;.,$s/CUR strs/CUR strs2/ /^struct strs/+101s/,/;/ a }; struct strs2 { charptr . 1i /* * term.h - this file is automatically made from caps and maketerm.ex. * * Guard against multiple includes. */ #ifndef auto_left_margin . $a #endif auto_left_margin #ifdef SINGLE extern struct term _first_term; # define CUR _first_term. #else # define CUR cur_term-> #endif . w! q E 1 h35453 s 00001/00001/00050 d D 3.2 87/05/13 18:49:10 build 4 3 c removed old SCCS strings and inserted #ident BB e s 00000/00000/00051 d D 3.1 87/01/20 18:50:55 mkm 3 2 c e s 00000/00000/00051 d D 2.1 87/01/20 18:41:35 mkm 2 1 c e s 00051/00000/00000 d D 1.1 87/01/20 18:32:18 mkm 1 0 c Placed under source control - mkm e u U f b f n t T I 1 D 4 /* " %W% %E% " */ E 4 I 4 #ident " %W% %E% " E 4 #include "curses.ext" /* * TRUE => all 8 bits of input character should be passed through. */ meta(win,bf) WINDOW *win; int bf; { int _outch(); if (!has_meta_key) return ERR; /* * Do the appropriate fiddling with the tty driver to make it send * all 8 bits through. On USG this means clearing ISTRIP, on * V7 you have to resort to RAW mode. */ #ifdef USG if (bf) { (cur_term->Nttyb).c_iflag &= ~ISTRIP; (cur_term->Nttyb).c_cflag &= ~CSIZE; (cur_term->Nttyb).c_cflag |= CS8; (cur_term->Nttyb).c_cflag &= ~PARENB; } else { (cur_term->Nttyb).c_iflag |= ISTRIP; (cur_term->Nttyb).c_cflag &= ~CSIZE; (cur_term->Nttyb).c_cflag |= CS7; (cur_term->Nttyb).c_cflag |= PARENB; } #else if (bf) raw(); else noraw(); #endif reset_prog_mode(); /* * Do whatever is needed to put the terminal into meta-mode. */ if (bf) tputs(meta_on, 1, _outch); else tputs(meta_off, 1, _outch); /* Keep track internally. */ win->_use_meta = bf; return OK; } E 1 h10101 s 00001/00001/00123 d D 3.2 87/05/13 18:49:24 build 4 3 c removed old SCCS strings and inserted #ident BB e s 00000/00000/00124 d D 3.1 87/01/20 18:50:57 mkm 3 2 c e s 00000/00000/00124 d D 2.1 87/01/20 18:41:36 mkm 2 1 c e s 00124/00000/00000 d D 1.1 87/01/20 18:32:19 mkm 1 0 c Placed under source control - mkm e u U f b f n t T I 1 D 4 /* " %W% %E% " */ E 4 I 4 #ident " %W% %E% " E 4 # include "curses.ext" # include char *calloc(); extern char *getenv(); static WINDOW *makenew(); struct screen *m_newterm(); /* * This routine initializes the current and standard screen. * */ WINDOW * m_initscr() { reg char *sp; # ifdef DEBUG if (outf == NULL) { outf = fopen("trace", "w"); if (outf == NULL) { perror("trace"); exit(-1); } } #endif if (isatty(2)) { if ((sp = getenv("TERM")) == NULL) sp = Def_term; # ifdef DEBUG if(outf) fprintf(outf, "INITSCR: term = %s\n", sp); # endif } else { sp = Def_term; } (void) m_newterm(sp, stdout, stdin); return stdscr; } struct screen * m_newterm(type, outfd, infd) char *type; FILE *outfd, *infd; { int m_tstp(); struct screen *scp; struct screen *_new_tty(); extern int _endwin; #ifdef DEBUG if(outf) fprintf(outf, "NEWTERM() isatty(2) %d, getenv %s\n", isatty(2), getenv("TERM")); # endif SP = (struct screen *) calloc(1, sizeof (struct screen)); SP->term_file = outfd; SP->input_file = infd; savetty(); scp = _new_tty(type, outfd); # ifdef SIGTSTP signal(SIGTSTP, m_tstp); # endif LINES = lines; COLS = columns; # ifdef DEBUG if(outf) fprintf(outf, "LINES = %d, COLS = %d\n", LINES, COLS); # endif curscr = makenew(LINES, COLS, 0, 0); stdscr = makenew(LINES, COLS, 0, 0); # ifdef DEBUG if(outf) fprintf(outf, "SP %x, stdscr %x, curscr %x\n", SP, stdscr, curscr); # endif SP->std_scr = stdscr; SP->cur_scr = curscr; _endwin = FALSE; return scp; } /* * Low level interface, for compatibility with old curses. */ setterm(type) char *type; { setupterm(type, 1, 0); } gettmode() { /* No-op included only for upward compatibility. */ } /* * This routine sets up a _window buffer and returns a pointer to it. */ static WINDOW * makenew(num_lines, num_cols, begy, begx) int num_lines, num_cols, begy, begx; { reg WINDOW *win; char *calloc(); # ifdef DEBUG if(outf) fprintf(outf, "MAKENEW(%d, %d, %d, %d)\n", num_lines, num_cols, begy, begx); # endif if ((win = (WINDOW *) calloc(1, sizeof (WINDOW))) == NULL) return NULL; # ifdef DEBUG if(outf) fprintf(outf, "MAKENEW: num_lines = %d\n", num_lines); # endif win->_cury = win->_curx = 0; win->_maxy = num_lines; win->_maxx = num_cols; win->_begy = begy; win->_begx = begx; win->_scroll = win->_leave = win->_use_idl = FALSE; return win; } E 1 h25639 s 00001/00001/00243 d D 3.2 87/05/13 19:00:42 build 4 3 c removed old SCCS strings and inserted #ident BB e s 00000/00000/00244 d D 3.1 87/01/20 18:50:59 mkm 3 2 c e s 00000/00000/00244 d D 2.1 87/01/20 18:41:38 mkm 2 1 c e s 00244/00000/00000 d D 1.1 87/01/20 18:32:20 mkm 1 0 c Placed under source control - mkm e u U f b f n t T I 1 D 4 /* " %W% %E% " */ E 4 I 4 #ident " %W% %E% " E 4 /* "mkti4" produces a C file, ti4.c, which contains the */ /* proper string definitions found in "caps", the source of */ /* curses structure element definitions. */ #include #define TRUE 1 #define FALSE 0 #define FAILURE (-1) #define CAPS "caps" char *part1[] = { "/*\n", " * ti4 [term]\n", " * dummy program to test termlib.\n", " * gets entry, counts it, and prints it.\n", " */\n", "#include \n", "#include \"curses.h\"\n", "#include \"term.h\"\n", "\n", "#define prb(name)\tif (name) printf(\"name\\n\")\n", "#define prn(name)\tif (name != -1) printf(\"name = %d\\n\", \ name)\n", "#define prs(name)\tif (name) {printf(\"name = '\"); pr(name); \ printf(\"'\\n\");}\n", "\n", "char buf[1024];\n", "char *getenv();\n", "\n", "main(argc, argv) char **argv; {\n", "\tchar *p;\n", "\tint rc;\n", "\n", "\tif (argc < 2)\n", "\t\tp = getenv(\"TERM\");\n", "\telse\n", "\t\tp = argv[1];\n", "\tprintf(\"Terminal type %s\\n\", p);\n", "\tsetupterm(p,1,0);\n", "\n", "\tprintf(\"flags\\n\");\n", "\n",0 } ; char *part2[] = { "\n", "\tprintf(\"\\nnumbers\\n\");\n", "\n",0 } ; char *part3[] = { "\n", "\tprintf(\"\\nstrings\\n\");\n", "\n",0 } ; char *part4[] = { "\n", "\tprintf(\"end of strings\\n\");\n", "\treset_shell_mode();\n", "\texit(0);\n", "}\n", "\n", "pr(p)\n", "register char *p;\n", "{\n", "\tchar *rdchar();\n", "\n", "\tfor (; *p; p++)\n", "\t\tprintf(\"%s\", rdchar(*p));\n", "}\n", "\n", "/*\n", " * rdchar: returns a readable representation of an ASCII char, \ using ^ notation.\n", " */\n", "#include \n", "char *rdchar(c)\n", "char c;\n", "{\n", "\tstatic char ret[4];\n", "\tregister char *p;\n", "\n", "\t/*\n", "\t * Due to a bug in isprint, this prints spaces as ^`, but \ this is OK\n", "\t * because we want something to show up on the screen.\n", "\t */\n", "\tret[0] = ((c&0377) > 0177) ? '\\'' : ' ';\n", "\tc &= 0177;\n", "\tret[1] = isprint(c) ? ' ' : '^';\n", "\tret[2] = isprint(c) ? c : c^0100;\n", "\tret[3] = 0;\n", "\tfor (p=ret; *p==' '; p++)\n", "\t\t;\n", "\treturn (p);\n", "}\n", 0 } ; main(argc,argv) int argc ; char **argv ; { register char **section ; register char *ptr ; register int i ; char line[256],word[120] ; FILE *fp ; if (--argc <= 0) ptr = CAPS ; else ptr = *++argv ; if ((fp = fopen(ptr,"r")) == (FILE*)NULL) { perror(ptr) ; exit(1) ; } /* Print out the first section of the program. */ for (section= &part1[0]; *section ;) fputs(*section++,stdout) ; /* Look for "--- begin bool" in "caps" file. */ while (ptr = fgets(&line[0],sizeof(line),fp)) { if (strncmp(ptr,"--- begin bool",sizeof("--- begin bool")-1) == 0) break ; } if (ptr == (char*)NULL) { fprintf(stderr,"Unable to find \"--- begin bool\"\n") ; exit(1) ; } while (ptr = fgets(&line[0],sizeof(line),fp)) { if (*ptr == '#') continue ; if (strncmp(ptr,"--- end bool",sizeof("--- end bool")-1) == 0) break ; if (sscanf(ptr,"%s",&word[0]) == 1) { /* Remove the comma after the word. */ word[strlen(&word[0])-1] = '\0' ; fprintf(stdout,"\t prb(%s) ;\n",&word[0]) ; } } if (ptr == (char*)NULL) { fprintf(stderr,"Premature termination during bools\n") ; exit(1) ; } /* Print out the second section of the program. */ for (section= &part2[0]; *section ;) fputs(*section++,stdout) ; /* Look for "--- begin num" in "caps" file. */ while (ptr = fgets(&line[0],sizeof(line),fp)) { if (*ptr == '#') continue ; if (strncmp(ptr,"--- begin num",sizeof("--- begin num")-1) == 0) break ; } if (ptr == (char*)NULL) { fprintf(stderr,"Unable to find \"--- begin num\"\n") ; exit(1) ; } while (ptr = fgets(&line[0],sizeof(line),fp)) { if (*ptr == '#') continue ; if (strncmp(ptr,"--- end num",sizeof("--- end num")-1) == 0) break ; if (sscanf(ptr,"%s",&word[0]) == 1) { /* Remove the comma after the word. */ word[strlen(&word[0])-1] = '\0' ; fprintf(stdout,"\t prn(%s) ;\n",&word[0]) ; } } if (ptr == (char*)NULL) { fprintf(stderr,"Premature termination during nums\n") ; exit(1) ; } /* Print out the third section of the program. */ for (section= &part3[0]; *section ;) fputs(*section++,stdout) ; /* Look for "--- begin str" in "caps" file. */ while (ptr = fgets(&line[0],sizeof(line),fp)) { if (*ptr == '#') continue ; if (strncmp(ptr,"--- begin str",sizeof("--- begin str")-1) == 0) break ; } if (ptr == (char*)NULL) { fprintf(stderr,"Unable to find \"--- begin str\"\n") ; exit(1) ; } while (ptr = fgets(&line[0],sizeof(line),fp)) { if (*ptr == '#') continue ; if (strncmp(ptr,"--- end str",sizeof("--- end str")-1) == 0) break ; if (sscanf(ptr,"%s",&word[0]) == 1) { /* Remove the comma after the word. */ word[strlen(&word[0])-1] = '\0' ; fprintf(stdout,"\t prs(%s) ;\n",&word[0]) ; } } if (ptr == (char*)NULL) { fprintf(stderr,"Premature termination during strs\n") ; exit(1) ; } /* Print out final section of program. */ for (section= &part4[0]; *section ;) fputs(*section++,stdout) ; exit(0) ; } E 1 h58997 s 00001/00001/00031 d D 3.2 87/05/13 19:00:55 build 4 3 c removed old SCCS strings and inserted #ident BB e s 00000/00000/00032 d D 3.1 87/01/20 18:51:02 mkm 3 2 c e s 00000/00000/00032 d D 2.1 87/01/20 18:41:40 mkm 2 1 c e s 00032/00000/00000 d D 1.1 87/01/20 18:32:21 mkm 1 0 c Placed under source control - mkm e u U f b f n t T I 1 D 4 /* " %W% %E% " */ E 4 I 4 #ident " %W% %E% " E 4 # include "curses.ext" /* * This routine moves the cursor to the given point * */ wmove(win, y, x) reg WINDOW *win; reg int y, x; { # ifdef DEBUG if(outf) fprintf(outf, "MOVE to win "); if( win == stdscr ) { if(outf) fprintf(outf, "stdscr "); } else { if(outf) fprintf(outf, "%o ", win); } if(outf) fprintf(outf, "(%d, %d)\n", y, x); # endif if( x >= win->_maxx || y >= win->_maxy ) { return ERR; } win->_curx = x; win->_cury = y; return OK; } E 1 2(cursor_down, 1, _outch); return; } /* Figure out costs of various component motions */ home_right = _loc_right(0 , newcol, 0, newcol); cur_right = _loc_right(oldcol, newcol, 0, newcol); cur_left = _loc_left (oldcol, newcol, 0); home_down = _loc_down (0 , newrow, 0, newcol); cur_down = _loc_down (oldrow, newrow, 0, newcol); cur_up = _loc_up (oldrow, newrow, 0); #ifdef DEBUG if(outf) fprintf(outf, "home_right %d, cur_right %d, cur_left %d, home_down %d, cur_down %d, cur_up %d\n", home_right, cur_right, cur_left, home_down, cur_down, cur_up); #endif /* 4 possible strategies: get costs for each */ cost_ca = _cost(Cursor_address); cost_hdr = _cost(Cursor_home) + home_down + home_right; /* 3rd and 4th strategies: local motions and with carriage return. */ if (newrow < oldrow) { if (newcol < oldcol) cost_lm = cur_left + cur_up; else cost_lm = cur_right + cur_up; cost_cr = _cost(Carriage_return) + cur_up + home_right; } else { if (newcol < oldcol) cost_lm = cur_left + cur_down; else cost_lm = cur_right + cur_down; if (cur_down >= INFINITY) cur_down = _loc_down(oldrow, newrow, 0, 0); cost_cr = _cost(Carriage_return) + cur_down + home_right; } #ifdef DEBUG if(outf) fprintf(outf, "cost_ca %d, cost_hdr %d, cost_cr %d, cost_lm %d\n", cost_ca, cost_hdr, cost_cr, cost_lm); #endif /* * Now we pick which one is cheapest and actually do it. * Note the ordering if they come out equal - this was * conciously chosen based on how visually distracting * it is to see the cursor bounce all over the screen, * I did not take into account approximation errors. */ if (cost_ca <= cost_hdr && cost_ca <= cost_cr && cost_ca <= cost_lm) { /* direct cursor addressing is cheapest */ #ifdef DEBUG if(outf) fprintf(outf, "chose absolute cursor addressing\n"); #endif tputs(tparm(cursor_address, newrow, newcol), 1, _outch); } else if (cost_lm <= cost_cr && cost_lm <= cost_hdr) { /* local motions are cheapest */ #ifdef DEBUG if(outf) fprintf(outf, "chose local motions\n"); #endif if (newcol > oldcol) { if (newrow > oldrow) (void) _loc_down(oldrow, newrow, 1, newcol); else (void) _loc_up(oldrow, newrow, 1); (void) _loc_right(oldcol, newcol, 1, newrow); } else { if (newrow > oldrow) (void) _loc_down(oldrow, newrow, 1, newcol); else (void) _loc_up(oldrow, newrow, 1); (void) _loc_left(oldcol, newcol, 1); } } else if (cost_cr <= cost_hdr) { /* carriage return + local motions are cheapest */ #ifdef DEBUG if(outf) fprintf(outf, "chose carriage return + local motions\n"); #endif tputs(carriage_return, 1, _outch); if (newrow > oldrow) (void) _loc_down(oldrow, newrow, 1, 0); else (void) _loc_up(oldrow, newrow, 1); (void) _loc_right(0, newcol, 1, newrow); } else { /* home + local motions are cheapest */ #ifdef DEBUG if(outf) fprintf(outf, "chose home + local motions\n"); #endif tputs(cursor_home, 1, _outch); (void) _loc_down(0, newrow, 1, newcol); (void) _loc_right(0, newcol, 1, newrow); } #ifdef DEBUG if(outf) fprintf(outf, "end of mvcur\n"); #endif } /* * These four routines figure out what the cost of the most efficient * kind of local motion from the given row or column to the other given * row or column is. They return the cost, in characters. If the third * argument is 1, they actually do the motion. The row number is useful * if we're going to actually do the motion - that way we can look in * the screen image (if we have it) and just output the characters that * are already on the screen - this usually saves 50% over cursor_right. */ static _loc_right(oldcol, newcol, domotion, row) { int c0, c1, c2, c3; int i, tabcol, ntabs, nright, nleft; /* notinsmode: we know for sure we aren't in insert char mode */ int notinsmode = SP && SP->phys_irm!=1; register struct line *rp; if (newcol < oldcol) /* can't go left with right motions */ return INFINITY; if (newcol == oldcol) return 0; /* already there - nothing to do */ #ifdef DEBUG fprintf(outf, "SP %x, phys_irm %d, notinsmode %d\n", SP, SP->phys_irm, notinsmode); #endif /* * Code here and further down attempts to output the character that * is already on the screen to move right. */ if (notinsmode) _cost(Cursor_right) = 1; else _cost(Cursor_right) = _cost(Right_base); /* figure out various costs */ tabcol = (newcol+4)/8 * 8; /* round to nearest 8 */ /* tab past right margin is undefined */ if (tabcol >= columns) tabcol = (columns-1)/8 * 8; ntabs = (tabcol-oldcol+7)/8; if (ntabs <= 0) tabcol = oldcol; if (tabcol < newcol) { /* some tabs plus some rights */ nright = newcol - tabcol; c1 = ntabs*_cost(Tab) + nright*_cost(Cursor_right); } else { /* some tabs plus some lefts */ nleft = tabcol - newcol; c1 = ntabs*_cost(Tab) + nleft*_cost(Cursor_left); } c0 = (newcol - oldcol) * _cost(Cursor_right); if (parm_right_cursor) c2 = _cost(Parm_right_cursor); else c2 = INFINITY; if (column_address) c3 = _cost(Column_address); else c3 = INFINITY; #ifdef DEBUG if(outf) fprintf(outf, "_loc_right(%d, %d, %d), chars %d, ri %d, RI %d, ch %d\n", oldcol, newcol, domotion, c0, c1, c2, c3); #endif /* Decide and maybe do them */ if (c3 <= c1 && c3 <= c2 && c3 <= c0) { /* cheapest to use column absolute cursor addressing */ #ifdef DEBUG if(outf) fprintf(outf, "chose column absolute cursor addressing\n"); #endif if (domotion) tputs(tparm(column_address, newcol), 1, _outch); return c3; } else if (c2 <= c1 && c2 <= c0) { /* cheapest to use column relative motion */ #ifdef DEBUG if(outf) fprintf(outf, "chose column relative motion\n"); #endif if (domotion) tputs(tparm(parm_right_cursor, newcol-oldcol), 1, _outch); return c2; } else { /* cheapest to use several right commands */ #ifdef DEBUG if(outf) fprintf(outf, "chose rights: ntabs %d, tabcol %d, nleft %d, nright %d\n", ntabs, tabcol, nleft, nright); #endif if (domotion) if (c1 < c0) { for (i=0; icur_body[row+1]) fprintf(outf, "nd1, row %d col %d+%d=%d, char '%c'\n", row, tabcol, i, tabcol+i, SP->cur_body[row+1]->body[tabcol+i]); #endif rp = SP->cur_body[row+1]; if (cursor_right && (!notinsmode || rp && SP->phys_gr != (rp->body[tabcol+i] & A_ATTRIBUTES))) /* dont know */ tputs(cursor_right,1,_outch); else if (rp && rp->length > tabcol+i) /* Note we assume dumb terminals without cursor_right don't have * standout either, otherwise we should go into right standout * mode here and in the essentially similar code below. */ _outch(rp->body[tabcol+i]&A_CHARTEXT); else /* off edge */ _outch(' '); } } else { /* some tabs plus some lefts */ for (i=0; icur_body[row+1]) fprintf(outf, "nd2, row %d col %d, char '%c'\n", row, i, SP->cur_body[row+1]->body[i]); #endif rp = SP->cur_body[row+1]; if (cursor_right && (!notinsmode || rp && SP->phys_gr != (rp->body[i] & A_ATTRIBUTES))) /* dont know */ tputs(cursor_right,1,_outch); else if (rp && rp->length > i) _outch(rp->body[i]&A_CHARTEXT); else /* off edge */ _outch(' '); } } return (c1 < c0) ? c1 : c0; } } static _loc_left(oldcol, newcol, domotion) { int c1, c2, c3; int i, tabcol, ntabs, nright, nleft; if (newcol > oldcol) /* can't go right with left motions */ return INFINITY; if (newcol == oldcol) return 0; /* already there - nothing to do */ /* figure out various costs */ if (cursor_left) { if (back_tab) { tabcol = (newcol+4)/8 * 8; /* round to nearest 8 */ /* tab past left margin is undefined */ if (tabcol < 8) tabcol = 8; ntabs = (oldcol-tabcol+7)/8; if (ntabs <= 0) tabcol = oldcol; if (tabcol < newcol) { /* some backtabs plus some rights */ nright = newcol - tabcol; c1 = ntabs*_cost(Back_tab) + nright*_cost(Cursor_right); } else { /* some tabs plus some lefts */ nleft = tabcol - newcol; c1 = ntabs*_cost(Back_tab) + nleft*_cost(Cursor_left); } } else { c1 = (oldcol - newcol) * _cost(Cursor_left); } } else c1 = INFINITY; if (parm_left_cursor) c2 = _cost(Parm_left_cursor); else c2 = INFINITY; if (column_address) c3 = _cost(Column_address); else c3 = INFINITY; #ifdef DEBUG if(outf) fprintf(outf, "_loc_left(%d, %d, %d), le %d, LE %d, ch %d\n", oldcol, newcol, domotion, c1, c2, c3); #endif /* Decide and maybe do them */ if (c3 <= c1 && c3 <= c2) { /* cheapest to use column absolute cursor addressing */ #ifdef DEBUG if(outf) fprintf(outf, "chose column absolute cursor addressing\n"); #endif if (domotion) tputs(tparm(column_address, newcol), 1, _outch); return c3; } else if (c2 <= c1) { /* cheapest to use column relative motion */ #ifdef DEBUG if(outf) fprintf(outf, "chose column relative motion\n"); #endif if (domotion) tputs(tparm(parm_left_cursor, oldcol-newcol), 1, _outch); return c2; } else { /* cheapest to use several left commands */ #ifdef DEBUG if(outf) fprintf(outf, "chose several left commands\n"); #endif if (domotion) if (back_tab) { for (i=0; inewcol; i--) tputs(cursor_left, 1, _outch); } return c1; } } static _loc_up(oldrow, newrow, domotion) { int c1, c2, c3, i; if (newrow > oldrow) /* can't go down with up motions */ return INFINITY; if (newrow == oldrow) return 0; /* already there - nothing to do */ /* figure out various costs */ if (cursor_up) c1 = (oldrow - newrow) * _cost(Cursor_up); else c1 = INFINITY; if (parm_up_cursor) c2 = _cost(Parm_up_cursor); else c2 = INFINITY; if (row_address) c3 = _cost(Row_address); else c3 = INFINITY; #ifdef DEBUG if(outf) fprintf(outf, "_loc_up(%d, %d, %d), up %d, UP %d, cv %d\n", oldrow, newrow, domotion, c1, c2, c3); #endif /* Decide and maybe do them */ if (c3 <= c1 && c3 <= c2) { /* cheapest to use row absolute cursor addressing */ #ifdef DEBUG if(outf) fprintf(outf, "chose row absolute cursor addressing\n"); #endif if (domotion) tputs(tparm(row_address, newrow), 1, _outch); return c3; } else if (c2 <= c1) { /* cheapest to use row relative motion */ #ifdef DEBUG if(outf) fprintf(outf, "chose row relative motion\n"); #endif if (domotion) tputs(tparm(parm_up_cursor, oldrow-newrow), 1, _outch); return c2; } else { /* cheapest to use several up commands */ #ifdef DEBUG if(outf) fprintf(outf, "chose several up commands\n"); #endif if (domotion) for (i=oldrow; i>newrow; i--) tputs(cursor_up, 1, _outch); return c1; } } static _loc_down(oldrow, newrow, domotion, col) { int c1, c2, c3, i; if (newrow < oldrow) /* can't go up with down motions */ return INFINITY; if (newrow == oldrow) return 0; /* already there - nothing to do */ /* figure out various costs */ if (cursor_down && (col==0 || bare_lf_ok || *cursor_down!='\n')) c1 = (newrow - oldrow) * _cost(Cursor_down); else c1 = INFINITY; if (parm_down_cursor) c2 = _cost(Parm_down_cursor); else c2 = INFINITY; if (row_address) c3 = _cost(Row_address); else c3 = INFINITY; #ifdef DEBUG if(outf) fprintf(outf, "_loc_down(%d, %d, %d, %d), do %d, DO %d, cv %d\n", oldrow, newrow, domotion, col,c1, c2, c3); #endif /* Decide and maybe do them */ if (c3 <= c1 && c3 <= c2) { /* cheapest to use row absolute cursor addressing */ #ifdef DEBUG if(outf) fprintf(outf, "chose row absolute cursor addressing\n"); #endif if (domotion) tputs(tparm(row_address, newrow), 1, _outch); return c3; } else if (c2 <= c1) { /* cheapest to use row relative motion */ #ifdef DEBUG if(outf) fprintf(outf, "chose row relative motion\n"); #endif if (domotion) tputs(tparm(parm_down_cursor, newrow-oldrow), 1, _outch); return c2; } else { /* cheapest to use several down commands */ #ifdef DEBUG if(outf) fprintf(outf, "chose several down commands\n"); #endif if (domotion) for (i=oldrow; i_maxy > LINES || bx + win->_maxx > COLS) return ERR; win->_begy = by; win->_begx = bx; touchwin(win); return OK; } E 1 h38394 s 00001/00001/00012 d D 3.2 87/05/13 19:02:41 build 4 3 c removed old SCCS strings and inserted #ident BB e s 00000/00000/00013 d D 3.1 87/01/20 18:51:11 mkm 3 2 c e s 00000/00000/00013 d D 2.1 87/01/20 18:41:50 mkm 2 1 c e s 00013/00000/00000 d D 1.1 87/01/20 18:32:26 mkm 1 0 c Placed under source control - mkm e u U f b f n t T I 1 D 4 /* " %W% %E% " */ E 4 I 4 #ident " %W% %E% " E 4 # include "curses.ext" /* VARARGS */ mvwprintw(win, y, x, fmt, args) reg WINDOW *win; reg int y, x; char *fmt; int args; { return wmove(win, y, x) == OK ? _sprintw(win, fmt, &args) : ERR; } E 1 h38142 s 00001/00001/00011 d D 3.2 87/05/13 19:02:51 build 4 3 c removed old SCCS strings and inserted #ident BB e s 00000/00000/00012 d D 3.1 87/01/20 18:51:14 mkm 3 2 c e s 00000/00000/00012 d D 2.1 87/01/20 18:41:51 mkm 2 1 c e s 00012/00000/00000 d D 1.1 87/01/20 18:32:27 mkm 1 0 c Placed under source control - mkm e u U f b f n t T I 1 D 4 /* " %W% %E% " */ E 4 I 4 #ident " %W% %E% " E 4 # include "curses.ext" /* VARARGS */ mvwscanw(win, y, x, fmt, args) reg WINDOW *win; reg int y, x; char *fmt; int args; { return wmove(win, y, x) == OK ? _sscans(win, fmt, &args) : ERR; } E 1 h54277 s 00001/00001/00262 d D 3.2 87/05/13 19:03:04 build 4 3 c removed old SCCS strings and inserted #ident BB e s 00000/00000/00263 d D 3.1 87/01/20 18:51:15 mkm 3 2 c e s 00000/00000/00263 d D 2.1 87/01/20 18:41:53 mkm 2 1 c e s 00263/00000/00000 d D 1.1 87/01/20 18:32:28 mkm 1 0 c Placed under source control - mkm e u U f b f n t T I 1 D 4 /* " %W% %E% " */ E 4 I 4 #ident " %W% %E% " E 4 /* * Code for various kinds of delays. Most of this is nonportable and * requires various enhancements to the operating system, so it won't * work on all systems. It is included in curses to provide a portable * interface, and so curses itself can use it for function keys. */ #include "curses.ext" #include #define NAPINTERVAL 100 #define HZ 60 /* From early specs - this may change by 4.2BSD */ struct _timeval { long tv_sec; long tv_usec; }; /* * Delay the output for ms milliseconds. * Note that this is NOT the same as a high resolution sleep. It will * cause a delay in the output but will not necessarily suspend the * processor. For applications needing to sleep for 1/10th second, * this is not a usable substitute. It causes a pause in the displayed * output, for example, for the eye wink in snake. It is disrecommended * for "delay" to be much more than 1/2 second, especially at high * baud rates, because of all the characters it will output. Note * that due to system delays, the actual pause could be even more. * Some games won't work decently with this routine. */ delay_output(ms) int ms; { extern int _outchar(); /* it's in putp.c */ return _delay(ms*10, _outchar); } /* * napms. Sleep for ms milliseconds. We don't expect a particularly good * resolution - 60ths of a second is normal, 10ths might even be good enough, * but the rest of the program thinks in ms because the unit of resolution * varies from system to system. (In some countries, it's 50ths, for example.) * * Here are some reasonable ways to get a good nap. * * (1) Use the select system call in Berkeley 4.2BSD. * * (2) Use the 1/10th second resolution wait in the UNIX 3.0 tty driver. * It turns out this is hard to do - you need a tty line that is * always unused that you have read permission on to sleep on. * * (3) Install the ft (fast timer) device in your kernel. * This is a psuedo-device to which an ioctl will wait n ticks * and then send you an alarm. * * (4) Install the nap system call in your kernel. * This system call does a timeout for the requested number of ticks. * * (5) Write a routine that busy waits checking the time with ftime. * Ftime is not present on USG systems, and since this busy waits, * it will drag down response on your system. But it works. */ #ifdef TIOCREMOTE /* on 4.2BSD, use select */ napms(ms) int ms; { struct _timeval t; /* * If your 4.2BSD select still rounds up to the next higher second, * you should remove this code and install the ft driver. * This routine was written under the assumption that the problem * would be corrected by 4.2BSD. */ t.sec = ms/1000; t.usec = 1000 * (ms % 1000); select(0, 0, 0, 0, &t); return OK; } #else /* * Pause for ms milliseconds. Convert to ticks and wait that long. * Call nap, which is either defined below or a system call. */ napms(ms) int ms; { int ticks; int rv; ticks = ms / (1000 / HZ); if (ticks <= 0) ticks = 1; rv = nap(ticks); /* call either the code below or nap system call */ return rv; } #endif #ifdef FTIOCSET #define HASNAP /* * The following code is adapted from the sleep code in libc. * It uses the "fast timer" device posted to USENET in Feb 1982. * nap is like sleep but the units are ticks (e.g. 1/60ths of * seconds in the USA). */ #include static jmp_buf jmp; static int ftfd; /* don't call nap directly, you should call napms instead */ static int nap(n) unsigned n; { int napx(); unsigned altime; int (*alsig)() = SIG_DFL; char *ftname; struct requestbuf { short time; short signo; } rb; if (n==0) return OK; if (ftfd <= 0) { ftname = "/dev/ft0"; while (ftfd <= 0 && ftname[7] <= '~') { ftfd = open(ftname, 0); if (ftfd <= 0) ftname[7] ++; } } if (ftfd <= 0) { /* Couldn't open a /dev/ft? */ sleepnap(n); return ERR; } altime = alarm(1000); /* time to maneuver */ if (setjmp(jmp)) { signal(SIGALRM, alsig); alarm(altime); return OK; } if (altime) { if (altime > n) altime -= n; else { n = altime; altime = 1; } } alsig = signal(SIGALRM, napx); rb.time = n; rb.signo = SIGALRM; ioctl(ftfd, FTIOCSET, &rb); for(;;) pause(); /*NOTREACHED*/ } static napx() { longjmp(jmp, 1); } #endif #ifdef USG #ifndef HASNAP #define HASNAP #define IDLETTY "/dev/idletty" /* * Do it with the timer in the tty driver. Resolution is only 1/10th * of a second. Problem is, if the user types something while we're * sleeping, we wake up immediately, and have no way to tell how long * we should sleep again. So we're sneaky and use a tty which we are * pretty sure nobody is using. * * Note that we should be able to do this by setting VMIN to 100 and VTIME * to the proper number of ticks. But due to a bug in the USG tty driver * (this bug was still there in 5.0) this hangs until VMIN chars are typed * no matter how much time elapses. * * This requires some care. If you choose a tty that is a dialup or * which otherwise can show carrier, it will hang and you won't get * any response from the keyboard. You can use /dev/tty if you have * no such tty, but response will feel funny as described above. * To find a suitable tty, try "stty > /dev/ttyxx" for various ttyxx's * that look unused. If it hangs, you can't use it. You might try * connecting a cable to your port that raises carrier to keep it from hanging. * * To use this feature on USG, you must * ln /dev/ttyxx /dev/idletty, * where /dev/ttyxx is one of your tty lines that is never used but * won't hang on open. Otherwise we always return ERR. * * THIS USG CODE IS UNSUPPORTED AND ON A USE-AT-YOUR-OWN-RISK BASIS. */ static int nap(ticks) int ticks; { struct termio t, ot; static int ttyfd; int n, tenths; char c; if (ttyfd == 0) ttyfd = open(IDLETTY, 2); if (ttyfd < 0) { sleepnap(ticks); return ERR; } tenths = (ticks+(HZ/10)/2) / (HZ/10); /* Round to nearest 10th second */ ioctl(ttyfd, TCGETA, &t); ot = t; t.c_lflag &= ~ICANON; t.c_cc[VMIN] = 0; t.c_cc[VTIME] = tenths; ioctl(ttyfd, TCSETAW, &t); n = read(ttyfd, &c, 1); ioctl(ttyfd, TCSETAW, &ot); /* * Now we potentially have a character in c that somebody's going * to want. We just hope and pray they use getch, because there * is no reasonable way to push it back onto the tty. */ if (n > 0) { for (n=0; SP->input_queue[n] >= 0; n++) ; SP->input_queue[n++] = c; SP->input_queue[n++] = -1; } return OK; } #endif #endif /* If you have some other externally supplied nap(), add -DHASNAP to cflags */ #ifndef HASNAP static int nap(ms) int ms; { sleep((ms+999)/1000); return ERR; } #endif /* * Nothing better around, so we have to simulate nap with sleep. */ static sleepnap(ticks) { sleep((ticks+(HZ-1))/HZ); } E 1 h33371 s 00000/00001/00043 d D 3.3 87/05/13 19:05:29 build 5 4 c removed old SCCS strings and inserted #ident BB e s 00001/00000/00043 d D 3.2 87/05/13 19:03:20 build 4 3 c removed old SCCS strings and inserted #ident BB e s 00000/00000/00043 d D 3.1 87/01/20 18:51:18 mkm 3 2 c e s 00000/00000/00043 d D 2.1 87/01/20 18:41:56 mkm 2 1 c e s 00043/00000/00000 d D 1.1 87/01/20 18:32:29 mkm 1 0 c Placed under source control - mkm e u U f b f n t T I 1 D 5 /* " %W% %E% " */ E 5 I 4 #ident " %W% %E% " E 4 # include "curses.ext" # include char *calloc(); char *malloc(); extern char *getenv(); extern WINDOW *makenew(); /* * Like newwin, but makes a pad instead of a window. A pad is not * associated with part of the screen, so it can be bigger. */ WINDOW * newpad(nlines, ncols) register int nlines; { register WINDOW *win; register chtype *sp; register int i; char *calloc(); if ((win = makenew(nlines, ncols, 0, 0)) == NULL) return NULL; win->_flags |= _ISPAD; for (i = 0; i < nlines; i++) if ((win->_y[i] = (chtype *) calloc(ncols, sizeof (chtype))) == NULL) { register int j; for (j = 0; j < i; j++) cfree((char *)win->_y[j]); cfree((char *)win->_firstch); cfree((char *)win->_lastch); cfree((char *)win->_y); cfree((char *)win); return NULL; } else for (sp = win->_y[i]; sp < win->_y[i] + ncols; ) *sp++ = ' '; return win; } E 1 h19821 s 00000/00000/00067 d D 3.3 87/05/13 19:05:39 build 5 4 c removed old SCCS strings and inserted #ident BB e s 00001/00001/00066 d D 3.2 87/05/13 19:04:36 build 4 3 c removed old SCCS strings and inserted #ident BB e s 00000/00000/00067 d D 3.1 87/01/20 18:51:19 mkm 3 2 c e s 00000/00000/00067 d D 2.1 87/01/20 18:41:57 mkm 2 1 c e s 00067/00000/00000 d D 1.1 87/01/20 18:32:30 mkm 1 0 c Placed under source control - mkm e u U f b f n t T I 1 D 4 /* " %W% %E% " */ E 4 I 4 #ident " %W% %E% " E 4 # include "curses.ext" # include char *calloc(); char *malloc(); extern char *getenv(); extern WINDOW *makenew(); struct screen * newterm(type, outfd, infd) char *type; FILE *outfd, *infd; { int _tstp(); struct screen *scp; struct screen *_new_tty(); extern int _endwin; #ifdef DEBUG if(outf) fprintf(outf, "NEWTERM() isatty(2) %d, getenv %s\n", isatty(2), getenv("TERM")); # endif SP = (struct screen *) calloc(1, sizeof (struct screen)); SP->term_file = outfd; SP->input_file = infd; /* * The default is echo, for upward compatibility, but we do * all echoing in curses to avoid problems with the tty driver * echoing things during critical sections. */ SP->fl_echoit = 1; savetty(); scp = _new_tty(type, outfd); if (scp == NULL) return NULL; #ifdef USG (cur_term->Nttyb).c_lflag &= ~ECHO; #else (cur_term->Nttyb).sg_flags &= ~ECHO; #endif reset_prog_mode(); # ifdef SIGTSTP signal(SIGTSTP, _tstp); # endif if (curscr != NULL) { # ifdef DEBUG if(outf) fprintf(outf, "INITSCR: non null curscr = 0%o\n", curscr); # endif } # ifdef DEBUG if(outf) fprintf(outf, "LINES = %d, COLS = %d\n", LINES, COLS); # endif LINES = lines; COLS = columns; curscr = makenew(LINES, COLS, 0, 0); stdscr = newwin(LINES, COLS, 0, 0); # ifdef DEBUG if(outf) fprintf(outf, "SP %x, stdscr %x, curscr %x\n", SP, stdscr, curscr); # endif SP->std_scr = stdscr; SP->cur_scr = curscr; /* Maybe should use makewin and glue _y's to DesiredScreen. */ _endwin = FALSE; return scp; } E 1 h36243 s 00001/00001/00053 d D 3.2 87/05/13 19:05:50 build 4 3 c removed old SCCS strings and inserted #ident BB e s 00000/00000/00054 d D 3.1 87/01/20 18:51:21 mkm 3 2 c e s 00000/00000/00054 d D 2.1 87/01/20 18:41:59 mkm 2 1 c e s 00054/00000/00000 d D 1.1 87/01/20 18:32:31 mkm 1 0 c Placed under source control - mkm e u U f b f n t T I 1 D 4 /* " %W% %E% " */ E 4 I 4 #ident " %W% %E% " E 4 # include "curses.ext" # include char *calloc(); char *malloc(); extern char *getenv(); extern WINDOW *makenew(); /* * allocate space for and set up defaults for a new _window * * 1/26/81 (Berkeley). This used to be newwin.c */ WINDOW * newwin(nlines, ncols, by, bx) register int nlines, ncols, by, bx; { register WINDOW *win; register chtype *sp; register int i; char *calloc(); if (by + nlines > LINES) nlines = LINES - by; if (bx + ncols > COLS) ncols = COLS - bx; if (nlines == 0) nlines = LINES - by; if (ncols == 0) ncols = COLS - bx; if ((win = makenew(nlines, ncols, by, bx)) == NULL) return NULL; for (i = 0; i < nlines; i++) if ((win->_y[i] = (chtype *) calloc(ncols, sizeof (chtype))) == NULL) { register int j; for (j = 0; j < i; j++) cfree((char *)win->_y[j]); cfree((char *)win->_firstch); cfree((char *)win->_lastch); cfree((char *)win->_y); cfree((char *)win); return NULL; } else for (sp = win->_y[i]; sp < win->_y[i] + ncols; ) *sp++ = ' '; return win; } E 1 h61662 s 00001/00001/00018 d D 3.2 87/05/13 19:06:02 build 4 3 c removed old SCCS strings and inserted #ident BB e s 00000/00000/00019 d D 3.1 87/01/20 18:51:23 mkm 3 2 c e s 00000/00000/00019 d D 2.1 87/01/20 18:42:01 mkm 2 1 c e s 00019/00000/00000 d D 1.1 87/01/20 18:32:32 mkm 1 0 c Placed under source control - mkm e u U f b f n t T I 1 D 4 /* " %W% %E% " */ E 4 I 4 #ident " %W% %E% " E 4 #include "curses.ext" nl() { #ifdef USG (cur_term->Nttyb).c_iflag |= ICRNL; (cur_term->Nttyb).c_oflag |= ONLCR; # ifdef DEBUG if(outf) fprintf(outf, "nl(), file %x, SP %x, flags %x,%x\n", SP->term_file, SP, cur_term->Nttyb.c_iflag, cur_term->Nttyb.c_oflag); # endif #else (cur_term->Nttyb).sg_flags |= CRMOD; # ifdef DEBUG if(outf) fprintf(outf, "nl(), file %x, SP %x, flags %x\n", SP->term_file, SP, cur_term->Nttyb.sg_flags); # endif #endif reset_prog_mode(); } E 1 h04840 s 00001/00001/00020 d D 3.2 87/05/13 19:06:16 build 4 3 c removed old SCCS strings and inserted #ident BB e s 00000/00000/00021 d D 3.1 87/01/20 18:51:24 mkm 3 2 c e s 00000/00000/00021 d D 2.1 87/01/20 18:42:02 mkm 2 1 c e s 00021/00000/00000 d D 1.1 87/01/20 18:32:33 mkm 1 0 c Placed under source control - mkm e u U f b f n t T I 1 D 4 /* " %W% %E% " */ E 4 I 4 #ident " %W% %E% " E 4 #include "curses.ext" nocbreak() { #ifdef USG (cur_term->Nttyb).c_lflag |= ICANON; (cur_term->Nttyb).c_cc[VEOF] = (cur_term->Ottyb).c_cc[VEOF]; (cur_term->Nttyb).c_cc[VEOL] = (cur_term->Ottyb).c_cc[VEOL]; # ifdef DEBUG if(outf) fprintf(outf, "nocrmode(), file %x, SP %x, flags %x\n", SP->term_file, SP, cur_term->Nttyb.c_lflag); # endif #else (cur_term->Nttyb).sg_flags &= ~CBREAK; # ifdef DEBUG if(outf) fprintf(outf, "nocrmode(), file %x, SP %x, flags %x\n", SP->term_file, SP, cur_term->Nttyb.sg_flags); # endif #endif SP->fl_rawmode=FALSE; reset_prog_mode(); } E 1 h27512 s 00001/00001/00006 d D 3.2 87/05/13 19:06:27 build 4 3 c removed old SCCS strings and inserted #ident BB e s 00000/00000/00007 d D 3.1 87/01/20 18:51:25 mkm 3 2 c e s 00000/00000/00007 d D 2.1 87/01/20 18:42:04 mkm 2 1 c e s 00007/00000/00000 d D 1.1 87/01/20 18:32:34 mkm 1 0 c Placed under source control - mkm e u U f b f n t T I 1 D 4 /* " %W% %E% " */ E 4 I 4 #ident " %W% %E% " E 4 #include "curses.ext" nocrmode() { nocbreak(); } E 1 h37742 s 00001/00001/00011 d D 3.2 87/05/13 19:06:37 build 4 3 c removed old SCCS strings and inserted #ident BB e s 00000/00000/00012 d D 3.1 87/01/20 18:51:26 mkm 3 2 c e s 00000/00000/00012 d D 2.1 87/01/20 18:42:06 mkm 2 1 c e s 00012/00000/00000 d D 1.1 87/01/20 18:32:35 mkm 1 0 c Placed under source control - mkm e u U f b f n t T I 1 D 4 /* " %W% %E% " */ E 4 I 4 #ident " %W% %E% " E 4 #include "curses.ext" /* * TRUE => don't wait for input, but return -1 instead. */ nodelay(win,bf) WINDOW *win; int bf; { _fixdelay(win->_nodelay, bf); win->_nodelay = bf; } E 1 h28085 s 00001/00001/00006 d D 3.2 87/05/13 19:06:47 build 4 3 c removed old SCCS strings and inserted #ident BB e s 00000/00000/00007 d D 3.1 87/01/20 18:51:28 mkm 3 2 c e s 00000/00000/00007 d D 2.1 87/01/20 18:42:07 mkm 2 1 c e s 00007/00000/00000 d D 1.1 87/01/20 18:32:37 mkm 1 0 c Placed under source control - mkm e u U f b f n t T I 1 D 4 /* " %W% %E% " */ E 4 I 4 #ident " %W% %E% " E 4 #include "curses.ext" noecho() { SP->fl_echoit = FALSE; } E 1 h62477 s 00001/00001/00018 d D 3.2 87/05/13 19:06:59 build 4 3 c removed old SCCS strings and inserted #ident BB e s 00000/00000/00019 d D 3.1 87/01/20 18:51:29 mkm 3 2 c e s 00000/00000/00019 d D 2.1 87/01/20 18:42:09 mkm 2 1 c e s 00019/00000/00000 d D 1.1 87/01/20 18:32:38 mkm 1 0 c Placed under source control - mkm e u U f b f n t T I 1 D 4 /* " %W% %E% " */ E 4 I 4 #ident " %W% %E% " E 4 #include "curses.ext" nonl() { #ifdef USG (cur_term->Nttyb).c_iflag &= ~ICRNL; (cur_term->Nttyb).c_oflag &= ~ONLCR; # ifdef DEBUG if(outf) fprintf(outf, "nonl(), file %x, SP %x, flags %x,%x\n", SP->term_file, SP, cur_term->Nttyb.c_iflag, cur_term->Nttyb.c_oflag); # endif #else (cur_term->Nttyb).sg_flags &= ~CRMOD; # ifdef DEBUG if(outf) fprintf(outf, "nonl(), file %x, SP %x, flags %x\n", SP->term_file, SP, cur_term->Nttyb.sg_flags); # endif #endif reset_prog_mode(); } E 1 h03725 s 00001/00001/00021 d D 3.2 87/05/13 19:07:11 build 4 3 c removed old SCCS strings and inserted #ident BB e s 00000/00000/00022 d D 3.1 87/01/20 18:51:31 mkm 3 2 c e s 00000/00000/00022 d D 2.1 87/01/20 18:42:10 mkm 2 1 c e s 00022/00000/00000 d D 1.1 87/01/20 18:32:39 mkm 1 0 c Placed under source control - mkm e u U f b f n t T I 1 D 4 /* " %W% %E% " */ E 4 I 4 #ident " %W% %E% " E 4 #include "curses.ext" noraw() { #ifdef USG (cur_term->Nttyb).c_cc[VINTR] = (cur_term->Ottyb).c_cc[VINTR]; (cur_term->Nttyb).c_cc[VQUIT] = (cur_term->Ottyb).c_cc[VQUIT]; (cur_term->Nttyb).c_iflag |= ISTRIP; (cur_term->Nttyb).c_cflag &= ~CSIZE; (cur_term->Nttyb).c_cflag |= CS7; (cur_term->Nttyb).c_cflag |= PARENB; nocrmode(); #else (cur_term->Nttyb).sg_flags&=~RAW; # ifdef DEBUG if(outf) fprintf(outf, "noraw(), file %x, SP %x, flags %x\n", SP->term_file, SP, cur_term->Nttyb.sg_flags); # endif #endif SP->fl_rawmode=FALSE; reset_prog_mode(); } E 1 h61098 s 00001/00001/00022 d D 3.2 87/05/13 19:07:23 build 4 3 c removed old SCCS strings and inserted #ident BB e s 00000/00000/00023 d D 3.1 87/01/20 18:51:33 mkm 3 2 c e s 00000/00000/00023 d D 2.1 87/01/20 18:42:11 mkm 2 1 c e s 00023/00000/00000 d D 1.1 87/01/20 18:32:40 mkm 1 0 c Placed under source control - mkm e u U f b f n t T I 1 D 4 /* " %W% %E% " */ E 4 I 4 #ident " %W% %E% " E 4 /* Defines and includes required for curses to work in a non- */ /* standard environment. */ #include "RecStruct.h" #include "VTio.h" #include "VTioctl.h" /* Make sure that curshdr.h is included before workst.h is */ /* brought in so that screen can be defined properly. */ #ifndef INFINITY #include "curshdr.h" #endif #include "workst.h" #define SP ((struct screen *)&(WS->w_screen)) #define cur_term WS->w_cur_term #define outputspeed(x) B9600 E 1 h22072 s 00001/00001/00092 d D 3.2 87/05/13 19:07:37 build 4 3 c removed old SCCS strings and inserted #ident BB e s 00000/00000/00093 d D 3.1 87/01/20 18:51:34 mkm 3 2 c e s 00000/00000/00093 d D 2.1 87/01/20 18:42:14 mkm 2 1 c e s 00093/00000/00000 d D 1.1 87/01/20 18:32:41 mkm 1 0 c Placed under source control - mkm e u U f b f n t T I 1 D 4 /* " %W% %E% " */ E 4 I 4 #ident " %W% %E% " E 4 #include "curses.ext" char *_c_why_not = NULL; static char * _stupid = "Sorry, I don't know how to deal with your '%s' terminal.\r\n"; static char * _unknown = "Sorry, I need to know a more specific terminal type than '%s'.\r\n"; struct screen * _new_tty(type, fd) char *type; FILE *fd; { int retcode; struct map *_init_keypad(); char *calloc(); #ifdef DEBUG if(outf) fprintf(outf, "__new_tty: type %s, fd %x\n", type, fd); #endif /* * Allocate an SP structure if there is none, or if SP is * still pointing to an old structure from a previous call * to this routine. But don't allocate one if we are being * called from a higher level curses routine. Since it's our * job to initialize the phys_scr field and higher level routines * aren't supposed to, we check that field to figure which to do. */ if (SP == NULL || SP->cur_body!=0) SP = (struct screen *) calloc(1, sizeof (struct screen)); SP->term_file = fd; if (type == 0) type = "unknown"; _setbuffered(fd); setupterm(type, fileno(fd), &retcode); if (retcode < 0) { /* * This happens if /usr/lib/terminfo doesn't exist, there is * no such terminal type, or the file is corrupted. * This would be a good place to print an error message. */ return NULL; } savetty(); /* as a "useful default" - hanging up is nasty. */ if (chk_trm() == ERR) return NULL; SP->tcap = cur_term; SP->doclear = 1; SP->cur_body = (struct line **) calloc(lines+2, sizeof (struct line *)); SP->std_body = (struct line **) calloc(lines+2, sizeof (struct line *)); #ifdef KEYPAD SP->kp = _init_keypad(); #endif SP->input_queue = (short *) calloc(20, sizeof (short)); SP->input_queue[0] = -1; SP->virt_x = 0; /* X and Y coordinates of the SP->curptr */ SP->virt_y = 0; /* between updates. */ _init_costs(); return SP; } static int chk_trm() { #ifdef DEBUG if(outf) fprintf(outf, "chk_trm().\n"); #endif if (generic_type) { _c_why_not = _unknown; return ERR; } if (clear_screen == 0 || hard_copy || over_strike) { _c_why_not = _stupid; return ERR; } if (cursor_address) { /* we can handle it */ } else if ( (cursor_up || cursor_home) /* some way to move up */ && cursor_down /* some way to move down */ && (cursor_left || carriage_return) /* ... move left */ /* printing chars moves right */ ) { /* we can handle it */ } else { _c_why_not = _stupid; return ERR; } return OK; } E 1 h24180 s 00000/00000/00008 d D 3.1 87/01/20 18:51:36 mkm 3 2 c e s 00000/00000/00008 d D 2.1 87/01/20 18:42:16 mkm 2 1 c e s 00008/00000/00000 d D 1.1 87/01/20 18:32:42 mkm 1 0 c Placed under source control - mkm e u U f b f n t T I 1 char *numnames[] = { "cols", "it", "lines", "lm", "xmc", "pb", "vt", "wsl", 0 }; char *numcodes[] = { "co", "it", "li", "lm", "sg", "pb", "vt", "ws", 0 }; E 1 h52885 s 00000/00000/00010 d D 3.1 87/01/20 18:51:37 mkm 3 2 c e s 00000/00000/00010 d D 2.1 87/01/20 18:42:17 mkm 2 1 c e s 00010/00000/00000 d D 1.1 87/01/20 18:32:44 mkm 1 0 c Placed under source control - mkm e u U f b f n t T I 1 short columns, /* Number of columns in a line */ init_tabs, /* Tabs initially every # spaces. */ lines, /* Number of lines on screen or page */ lines_of_memory, /* Lines of memory if > lines. 0 => varies */ magic_cookie_glitch, /* Number blank chars left by smso or rmso */ padding_baud_rate, /* Lowest baud rate where padding needed */ virtual_terminal, /* Virtual terminal number (CB/Unix) */ width_status_line, /* # columns in status line */ lastnum; E 1 h29238 s 00001/00001/00038 d D 3.2 87/05/13 19:07:49 build 4 3 c removed old SCCS strings and inserted #ident BB e s 00000/00000/00039 d D 3.1 87/01/20 18:51:39 mkm 3 2 c e s 00000/00000/00039 d D 2.1 87/01/20 18:42:19 mkm 2 1 c e s 00039/00000/00000 d D 1.1 87/01/20 18:32:47 mkm 1 0 c Placed under source control - mkm e u U f b f n t T I 1 D 4 /* " %W% %E% " */ E 4 I 4 #ident " %W% %E% " E 4 # include "curses.ext" # include # define min(a,b) (a < b ? a : b) # define max(a,b) (a > b ? a : b) /* * This routine writes win1 on win2 non-destructively. * */ overlay(win1, win2) reg WINDOW *win1, *win2; { reg chtype *sp, *end; reg int x, y, endy, endx, starty, startx, y_top, y_bot, x_left, x_right; # ifdef DEBUG if(outf) fprintf(outf, "OVERLAY(%0.2o, %0.2o);\n", win1, win2); # endif y_top = max(win1->_begy, win2->_begy); y_bot = min(win1->_maxy, win2->_maxy); x_left = max(win1->_begx, win2->_begx); x_right = min(win1->_maxx, win2->_maxx); starty = y_top - win1->_begy; startx = x_left - win1->_begx; endy = y_bot - win1->_begy; endx = x_right - win1->_begx; for (y = starty; y < endy; y++) { end = &win1->_y[y][endx]; x = startx + win1->_begx; for (sp = &win1->_y[y][startx]; sp < end; sp++) { if (!isspace(*sp)) mvwaddch(win2, y + win1->_begy, x, *sp); x++; } } } E 1 h06271 s 00001/00001/00027 d D 3.2 87/05/13 19:08:03 build 4 3 c removed old SCCS strings and inserted #ident BB e s 00000/00000/00028 d D 3.1 87/01/20 18:51:41 mkm 3 2 c e s 00000/00000/00028 d D 2.1 87/01/20 18:42:20 mkm 2 1 c e s 00028/00000/00000 d D 1.1 87/01/20 18:32:48 mkm 1 0 c Placed under source control - mkm e u U f b f n t T I 1 D 4 /* " %W% %E% " */ E 4 I 4 #ident " %W% %E% " E 4 # include "curses.ext" # define min(a,b) (a < b ? a : b) /* * This routine writes win1 on win2 destructively. * */ overwrite(win1, win2) reg WINDOW *win1, *win2; { reg int x, y, minx, miny, starty; # ifdef DEBUG if(outf) fprintf(outf, "OVERWRITE(0%o, 0%o);\n", win1, win2); # endif miny = min(win1->_maxy, win2->_maxy); minx = min(win1->_maxx, win2->_maxx); # ifdef DEBUG if(outf) fprintf(outf, "OVERWRITE:\tminx = %d, miny = %d\n", minx, miny); # endif starty = win1->_begy - win2->_begy; for (y = 0; y < miny; y++) if (wmove(win2, y + starty, 0) != ERR) for (x = 0; x < minx; x++) waddch(win2, win1->_y[y][x]); } E 1 h09206 s 00001/00001/00051 d D 3.2 87/05/13 19:08:16 build 4 3 c removed old SCCS strings and inserted #ident BB e s 00000/00000/00052 d D 3.1 87/01/20 18:51:42 mkm 3 2 c e s 00000/00000/00052 d D 2.1 87/01/20 18:42:22 mkm 2 1 c e s 00052/00000/00000 d D 1.1 87/01/20 18:32:49 mkm 1 0 c Placed under source control - mkm e u U f b f n t T I 1 D 4 /* " %W% %E% " */ E 4 I 4 #ident " %W% %E% " E 4 /* * make the current screen look like "win" over the area covered by * win. * */ #include "curses.ext" extern WINDOW *lwin; /* Put out pad but don't actually update screen. */ pnoutrefresh(pad, pminrow, pmincol, sminrow, smincol, smaxrow, smaxcol) register WINDOW *pad; int pminrow, pmincol, sminrow, smincol, smaxrow, smaxcol; { register int pr, r, c; register chtype *nsp, *lch; # ifdef DEBUG if(outf) fprintf(outf, "PREFRESH(pad %x, pcorner %d,%d, smin %d,%d, smax %d,%d)", pad, pminrow, pmincol, sminrow, smincol, smaxrow, smaxcol); _dumpwin(pad); if(outf) fprintf(outf, "PREFRESH:\n\tfirstch\tlastch\n"); # endif /* Make sure everything fits */ if (pminrow < 0) pminrow = 0; if (pmincol < 0) pmincol = 0; if (sminrow < 0) sminrow = 0; if (smincol < 0) smincol = 0; if (smaxrow >= lines) smaxrow = lines-1; if (smaxcol >= columns) smaxcol = columns-1; if (smaxrow - sminrow > pad->_maxy - pminrow) smaxrow = sminrow + (pad->_maxy - pminrow); /* Copy it out, like a refresh, but appropriately offset */ for (pr=pminrow,r=sminrow; r <= smaxrow; r++,pr++) { /* No record of what previous loc looked like, so do it all */ lch = &pad->_y[pr][pad->_maxx-1]; nsp = &pad->_y[pr][pmincol]; _ll_move(r, smincol); for (c=smincol; nsp<=lch; c++) { if (SP->virt_x++ < columns && c <= smaxcol) *SP->curptr++ = *nsp++; else break; } pad->_firstch[pr] = _NOCHANGE; } lwin = pad; return OK; } E 1 h57621 s 00001/00001/00016 d D 3.2 87/05/13 19:08:29 build 4 3 c removed old SCCS strings and inserted #ident BB e s 00000/00000/00017 d D 3.1 87/01/20 18:51:44 mkm 3 2 c e s 00000/00000/00017 d D 2.1 87/01/20 18:42:23 mkm 2 1 c e s 00017/00000/00000 d D 1.1 87/01/20 18:32:50 mkm 1 0 c Placed under source control - mkm e u U f b f n t T I 1 D 4 /* " %W% %E% " */ E 4 I 4 #ident " %W% %E% " E 4 /* * make the current screen look like "win" over the area covered by * win. * */ #include "curses.ext" /* Like wrefresh but refreshing from a pad. */ prefresh(pad, pminrow, pmincol, sminrow, smincol, smaxrow, smaxcol) WINDOW *pad; int pminrow, pmincol, sminrow, smincol, smaxrow, smaxcol; { pnoutrefresh(pad, pminrow, pmincol, sminrow, smincol, smaxrow, smaxcol); return doupdate(); } E 1 h45049 s 00001/00001/00021 d D 3.2 87/05/13 19:08:41 build 4 3 c removed old SCCS strings and inserted #ident BB e s 00000/00000/00022 d D 3.1 87/01/20 18:51:45 mkm 3 2 c e s 00000/00000/00022 d D 2.1 87/01/20 18:42:25 mkm 2 1 c e s 00022/00000/00000 d D 1.1 87/01/20 18:32:51 mkm 1 0 c Placed under source control - mkm e u U f b f n t T I 1 D 4 /* " %W% %E% " */ E 4 I 4 #ident " %W% %E% " E 4 /* * printw and friends * */ # include "curses.ext" # include /* * This routine implements a printf on the standard screen. */ /* VARARGS */ printw(fmt, va_alist) char *fmt; va_dcl { va_list ap; va_start(ap); return _sprintw(stdscr, fmt, ap); } E 1 h60244 s 00001/00001/00022 d D 3.2 87/05/13 19:08:52 build 4 3 c removed old SCCS strings and inserted #ident BB e s 00000/00000/00023 d D 3.1 87/01/20 18:51:47 mkm 3 2 c e s 00000/00000/00023 d D 2.1 87/01/20 18:42:26 mkm 2 1 c e s 00023/00000/00000 d D 1.1 87/01/20 18:32:52 mkm 1 0 c Placed under source control - mkm e u U f b f n t T I 1 D 4 /* " %W% %E% " */ E 4 I 4 #ident " %W% %E% " E 4 /* * Handy function to put out a string with padding. * It makes two assumptions: * (1) Output is via stdio to stdout through putchar. * (2) There is no count of affected lines. Thus, this * routine is only valid for certain capabilities, * i.e. those that don't have *'s in the documentation. */ #include extern _outchar(); /* * Handy way to output a string. */ putp(str) char *str; { tputs(str, 1, _outchar); } E 1 h03834 s 00001/00001/00023 d D 3.2 87/05/13 19:09:03 build 4 3 c removed old SCCS strings and inserted #ident BB e s 00000/00000/00024 d D 3.1 87/01/20 18:51:49 mkm 3 2 c e s 00000/00000/00024 d D 2.1 87/01/20 18:42:28 mkm 2 1 c e s 00024/00000/00000 d D 1.1 87/01/20 18:32:53 mkm 1 0 c Placed under source control - mkm e u U f b f n t T I 1 D 4 /* " %W% %E% " */ E 4 I 4 #ident " %W% %E% " E 4 #include "curses.ext" raw() { #ifdef USG /* Disable interrupt characters */ (cur_term->Nttyb).c_cc[VINTR] = 0377; (cur_term->Nttyb).c_cc[VQUIT] = 0377; /* Allow 8 bit input/output */ (cur_term->Nttyb).c_iflag &= ~ISTRIP; (cur_term->Nttyb).c_cflag &= ~CSIZE; (cur_term->Nttyb).c_cflag |= CS8; (cur_term->Nttyb).c_cflag &= ~PARENB; crmode(); #else (cur_term->Nttyb).sg_flags|=RAW; #ifdef DEBUG if(outf) fprintf(outf, "raw(), file %x, SP %x, flags %x\n", SP->term_file, SP, cur_term->Nttyb.sg_flags); #endif SP->fl_rawmode=TRUE; #endif reset_prog_mode(); } E 1 h09748 s 00001/00001/00059 d D 3.2 87/05/13 19:09:14 build 4 3 c removed old SCCS strings and inserted #ident BB e s 00000/00000/00060 d D 3.1 87/01/20 18:51:51 mkm 3 2 c e s 00000/00000/00060 d D 2.1 87/01/20 18:42:29 mkm 2 1 c e s 00060/00000/00000 d D 1.1 87/01/20 18:32:56 mkm 1 0 c Placed under source control - mkm e u U f b f n t T I 1 D 4 /* " %W% %E% " */ E 4 I 4 #ident " %W% %E% " E 4 #include "curses.ext" #include "uparm.h" extern struct term *cur_term; #ifdef DIOCSETT /* * Disable CB/UNIX virtual terminals. * This really should be a field in the cur_term structure, but * I didn't do it that way because I'm trying to make ex fit. * If you're using virtual terminals on a 32 bit machine it * probably makes sense to change it. */ static struct termcb new, old; #endif #ifdef LTILDE static int newlmode, oldlmode; #endif /* * Getting the baud rate is different on the two systems. * In either case, a baud rate of 0 hangs up the phone. * Since things are often initialized to 0, getting the phone * hung up on you is a common result of a bug in your program. * This is not very friendly, so if the baud rate is 0, we * assume we're doing a reset_xx_mode with no def_xx_mode, and * just don't do anything. */ #ifdef USG #define BR(x) (cur_term->x.c_cflag&CBAUD) #else #define BR(x) (cur_term->x.sg_ispeed) #endif reset_prog_mode() { if (BR(Nttyb)) ioctl(cur_term -> Filedes, #ifdef USG TCSETAW, #else TIOCSETN, #endif &(cur_term->Nttyb)); # ifdef LTILDE ioctl(cur_term -> Filedes, TIOCLGET, &oldlmode); newlmode = oldlmode & ~LTILDE; if (newlmode != oldlmode) ioctl(cur_term -> Filedes, TIOCLSET, &newlmode); # endif #ifdef DIOCSETT if (old.st_termt == 0) ioctl(2, DIOCGETT, &old); new = old; new.st_termt = 0; new.st_flgs |= TM_SET; ioctl(2, DIOCSETT, &new); #endif } E 1 h09100 s 00001/00001/00059 d D 3.2 87/05/13 19:09:26 build 4 3 c removed old SCCS strings and inserted #ident BB e s 00000/00000/00060 d D 3.1 87/01/20 18:51:52 mkm 3 2 c e s 00000/00000/00060 d D 2.1 87/01/20 18:42:30 mkm 2 1 c e s 00060/00000/00000 d D 1.1 87/01/20 18:32:57 mkm 1 0 c Placed under source control - mkm e u U f b f n t T I 1 D 4 /* " %W% %E% " */ E 4 I 4 #ident " %W% %E% " E 4 #include "curses.ext" #include "uparm.h" extern struct term *cur_term; #ifdef DIOCSETT /* * Disable CB/UNIX virtual terminals. * This really should be a field in the cur_term structure, but * I didn't do it that way because I'm trying to make ex fit. * If you're using virtual terminals on a 32 bit machine it * probably makes sense to change it. */ static struct termcb new, old; #endif #ifdef LTILDE static int newlmode, oldlmode; #endif /* * Getting the baud rate is different on the two systems. * In either case, a baud rate of 0 hangs up the phone. * Since things are often initialized to 0, getting the phone * hung up on you is a common result of a bug in your program. * This is not very friendly, so if the baud rate is 0, we * assume we're doing a reset_xx_mode with no def_xx_mode, and * just don't do anything. */ #ifdef USG #define BR(x) (cur_term->x.c_cflag&CBAUD) #else #define BR(x) (cur_term->x.sg_ispeed) #endif reset_shell_mode() { #ifdef DIOCSETT /* * Restore any virtual terminal setting. This must be done * before the TIOCSETN because DIOCSETT will clobber flags like xtabs. */ old.st_flgs |= TM_SET; ioctl(2, DIOCSETT, &old); #endif if (BR(Ottyb)) { ioctl(cur_term -> Filedes, #ifdef USG TCSETAW, #else TIOCSETN, #endif &(cur_term->Ottyb)); # ifdef LTILDE if (newlmode != oldlmode) ioctl(cur_term -> Filedes, TIOCLSET, &oldlmode); # endif } } E 1 h32925 s 00001/00001/00010 d D 3.2 87/05/13 19:09:35 build 4 3 c removed old SCCS strings and inserted #ident BB e s 00000/00000/00011 d D 3.1 87/01/20 18:51:55 mkm 3 2 c e s 00000/00000/00011 d D 2.1 87/01/20 18:42:32 mkm 2 1 c e s 00011/00000/00000 d D 1.1 87/01/20 18:32:58 mkm 1 0 c Placed under source control - mkm e u U f b f n t T I 1 D 4 /* " %W% %E% " */ E 4 I 4 #ident " %W% %E% " E 4 #include "curses.ext" #include "uparm.h" extern struct term *cur_term; resetterm() { reset_shell_mode(); } E 1 h11535 s 00001/00001/00021 d D 3.2 87/05/13 19:09:47 build 4 3 c removed old SCCS strings and inserted #ident BB e s 00000/00000/00022 d D 3.1 87/01/20 18:51:56 mkm 3 2 c e s 00000/00000/00022 d D 2.1 87/01/20 18:42:34 mkm 2 1 c e s 00022/00000/00000 d D 1.1 87/01/20 18:32:59 mkm 1 0 c Placed under source control - mkm e u U f b f n t T I 1 D 4 /* " %W% %E% " */ E 4 I 4 #ident " %W% %E% " E 4 #include "curses.ext" resetty() { #ifdef USG if (SP == NULL || SP->save_tty_buf.c_cflag&CBAUD == 0) return; /* Never called savetty */ #else if (SP == NULL || SP->save_tty_buf.sg_ospeed == 0) return; /* Never called savetty */ #endif cur_term->Nttyb = SP->save_tty_buf; #ifdef DEBUG # ifdef USG if(outf) fprintf(outf, "savetty(), file %x, SP %x, flags %x,%x,%x,%x\n", SP->term_file, SP, cur_term->Nttyb.c_iflag, cur_term->Nttyb.c_oflag, cur_term->Nttyb.c_cflag, cur_term->Nttyb.c_lflag); # else if(outf) fprintf(outf, "resetty(), file %x, SP %x, flags %x\n", SP->term_file, SP, cur_term->Nttyb.sg_flags); # endif #endif reset_prog_mode(); } E 1 h46805 s 00001/00001/00056 d D 3.2 87/05/13 19:09:59 build 4 3 c removed old SCCS strings and inserted #ident BB e s 00000/00000/00057 d D 3.1 87/01/20 18:51:58 mkm 3 2 c e s 00000/00000/00057 d D 2.1 87/01/20 18:42:35 mkm 2 1 c e s 00057/00000/00000 d D 1.1 87/01/20 18:33:00 mkm 1 0 c Placed under source control - mkm e u U f b f n t T I 1 D 4 /* " %W% %E% " */ E 4 I 4 #ident " %W% %E% " E 4 #include "curses.ext" #include "uparm.h" extern struct term *cur_term; /* * This is useful after saving/restoring memory from a file (e.g. as * in a rogue save game). It assumes that the modes and windows are * as wanted by the user, but the terminal type and baud rate may * have changed. */ restartterm(term, filenum, errret) char *term; int filenum; /* This is a UNIX file descriptor, not a stdio ptr. */ int *errret; { int saveecho = SP->fl_echoit; int savecbreak = SP->fl_rawmode; int saveraw; int savenl; #ifdef USG saveraw = (cur_term->Nttyb).c_cc[VINTR] == 0377; savenl = (cur_term->Nttyb).c_iflag & ICRNL; #else saveraw = (cur_term->Nttyb).sg_flags | RAW; savenl = (cur_term->Nttyb).sg_flags & CRMOD; #endif setupterm(term, filenum, errret); /* * Restore curses settable flags, leaving other stuff alone. */ if (saveecho) echo(); else noecho(); if (savecbreak) cbreak(), noraw(); else if (saveraw) nocbreak(), raw(); else nocbreak(), noraw(); if (savenl) nl(); else nonl(); reset_prog_mode(); LINES = lines; COLS = columns; } E 1 h32446 s 00001/00001/00010 d D 3.2 87/05/13 19:10:08 build 4 3 c removed old SCCS strings and inserted #ident BB e s 00000/00000/00011 d D 3.1 87/01/20 18:52:00 mkm 3 2 c e s 00000/00000/00011 d D 2.1 87/01/20 18:42:37 mkm 2 1 c e s 00011/00000/00000 d D 1.1 87/01/20 18:33:01 mkm 1 0 c Placed under source control - mkm e u U f b f n t T I 1 D 4 /* " %W% %E% " */ E 4 I 4 #ident " %W% %E% " E 4 #include "curses.ext" #include "uparm.h" extern struct term *cur_term; saveterm() { def_prog_mode(); } E 1 h59105 s 00001/00001/00013 d D 3.2 87/05/13 19:10:20 build 4 3 c removed old SCCS strings and inserted #ident BB e s 00000/00000/00014 d D 3.1 87/01/20 18:52:02 mkm 3 2 c e s 00000/00000/00014 d D 2.1 87/01/20 18:42:38 mkm 2 1 c e s 00014/00000/00000 d D 1.1 87/01/20 18:33:03 mkm 1 0 c Placed under source control - mkm e u U f b f n t T I 1 D 4 /* " %W% %E% " */ E 4 I 4 #ident " %W% %E% " E 4 #include "curses.ext" savetty() { SP->save_tty_buf = cur_term->Nttyb; #ifdef DEBUG # ifdef USG if(outf) fprintf(outf, "savetty(), file %x, SP %x, flags %x,%x,%x,%x\n", SP->term_file, SP, cur_term->Nttyb.c_iflag, cur_term->Nttyb.c_oflag, cur_term->Nttyb.c_cflag, cur_term->Nttyb.c_lflag); # else if(outf) fprintf(outf, "savetty(), file %x, SP %x, flags %x\n", SP->term_file, SP, cur_term->Nttyb.sg_flags); # endif #endif } E 1 h42705 s 00001/00001/00019 d D 3.2 87/05/13 19:10:29 build 4 3 c removed old SCCS strings and inserted #ident BB e s 00000/00000/00020 d D 3.1 87/01/20 18:52:03 mkm 3 2 c e s 00000/00000/00020 d D 2.1 87/01/20 18:42:40 mkm 2 1 c e s 00020/00000/00000 d D 1.1 87/01/20 18:33:03 mkm 1 0 c Placed under source control - mkm e u U f b f n t T I 1 D 4 /* " %W% %E% " */ E 4 I 4 #ident " %W% %E% " E 4 /* */ # include "curses.ext" # include /* * This routine implements a scanf on the standard screen. */ /* VARARGS */ scanw(fmt, va_alist) char *fmt; va_dcl { va_list ap; va_start(ap); return __sscans(stdscr, fmt, ap); } E 1 h33436 s 00001/00001/00011 d D 3.2 87/05/13 19:10:39 build 4 3 c removed old SCCS strings and inserted #ident BB e s 00000/00000/00012 d D 3.1 87/01/20 18:52:04 mkm 3 2 c e s 00000/00000/00012 d D 2.1 87/01/20 18:42:41 mkm 2 1 c e s 00012/00000/00000 d D 1.1 87/01/20 18:33:05 mkm 1 0 c Placed under source control - mkm e u U f b f n t T I 1 D 4 /* " %W% %E% " */ E 4 I 4 #ident " %W% %E% " E 4 # include "curses.ext" /* * This routine scrolls the window up a line. * */ scroll(win) WINDOW *win; { _tscroll(win, 1); } E 1 h41532 s 00001/00001/00012 d D 3.2 87/05/13 19:10:50 build 4 3 c removed old SCCS strings and inserted #ident BB e s 00000/00000/00013 d D 3.1 87/01/20 18:52:06 mkm 3 2 c e s 00000/00000/00013 d D 2.1 87/01/20 18:42:43 mkm 2 1 c e s 00013/00000/00000 d D 1.1 87/01/20 18:33:05 mkm 1 0 c Placed under source control - mkm e u U f b f n t T I 1 D 4 /* " %W% %E% " */ E 4 I 4 #ident " %W% %E% " E 4 #include "curses.ext" /* * TRUE => OK to scroll screen up when you run off the bottom. */ scrollok(win,bf) WINDOW *win; int bf; { /* Should consider using scroll/page mode of some terminals. */ win->_scroll = bf; } E 1 h28717 s 00001/00001/00099 d D 3.2 87/05/13 19:11:03 build 4 3 c removed old SCCS strings and inserted #ident BB e s 00000/00000/00100 d D 3.1 87/01/20 18:52:08 mkm 3 2 c e s 00000/00000/00100 d D 2.1 87/01/20 18:42:45 mkm 2 1 c e s 00100/00000/00000 d D 1.1 87/01/20 18:33:08 mkm 1 0 c Placed under source control - mkm e u U f b f n t T I 1 D 4 /* " %W% %E% " */ E 4 I 4 #ident " %W% %E% " E 4 /* * Code for various kinds of delays. Most of this is nonportable and * requires various enhancements to the operating system, so it won't * work on all systems. It is included in curses to provide a portable * interface, and so curses itself can use it for function keys. */ #include "curses.ext" #include #define NAPINTERVAL 100 /* From early specs - this may change by 4.2BSD */ struct _timeval { long tv_sec; long tv_usec; }; #ifdef FIONREAD # ifndef TIOCREMOTE /* * Decide if we can emulate select but don't have it. This is * intended to be true only on 4.1BSD, not 4.2BSD or USG. */ # define NEEDSELECT # endif #endif #ifdef NEEDSELECT /* * Emulation of 4.2BSD select system call. This is somewhat crude but * better than nothing. We do FIONREAD on each fd, and if we have to * wait we use nap to avoid a busy wait. The resolution of the nap * will hurt response - so will the fact that we ignore the write fds. * If we are simulating nap with a 1 second sleep, this will be very poor. * * nfds is the number of fds to check - this is usually 20. * prfds is a pointer to a bit vector of file descriptors - in the case * where nfds < 32, prfds points to an integer, where bit 1<tv_sec * 1000 + timeout->tv_usec / 1000; for (;;) { /* check the fds */ for (fd=0; fd 0) { rv++; } else *prfds &= ~(1<tcap; LINES = lines; COLS = columns; stdscr = SP->std_scr; curscr = SP->cur_scr; return rv; } E 1 h14904 s 00001/00001/00036 d D 3.2 87/05/13 19:11:26 build 4 3 c removed old SCCS strings and inserted #ident BB e s 00000/00000/00037 d D 3.1 87/01/20 18:52:12 mkm 3 2 c e s 00000/00000/00037 d D 2.1 87/01/20 18:42:48 mkm 2 1 c e s 00037/00000/00000 d D 1.1 87/01/20 18:33:10 mkm 1 0 c Placed under source control - mkm e u U f b f n t T I 1 D 4 /* " %W% %E% " */ E 4 I 4 #ident " %W% %E% " E 4 /* * This routine is one of the main things * in this level of curses that depends on the outside * environment. */ #include "curses.ext" static short baud_convert[] = { 0, 50, 75, 110, 135, 150, 200, 300, 600, 1200, 1800, 2400, 4800, 9600, 19200, 38400 }; /* * Force output to be buffered. * Also figures out the baud rate. * Grouped here because they are machine dependent. */ _setbuffered(fd) FILE *fd; { char *sobuf; char *calloc(); SGTTY sg; sobuf = calloc(1, BUFSIZ); setbuf(fd, sobuf); # ifdef USG ioctl (fileno (fd), TCGETA, &sg); SP->baud = sg.c_cflag&CBAUD ? baud_convert[sg.c_cflag&CBAUD] : 1200; # else ioctl (fileno (fd), TIOCGETP, &sg); SP->baud = sg.sg_ospeed ? baud_convert[sg.sg_ospeed] : 1200; # endif } E 1 h43630 s 00001/00001/00017 d D 3.2 87/05/13 19:11:38 build 4 3 c removed old SCCS strings and inserted #ident BB e s 00000/00000/00018 d D 3.1 87/01/20 18:52:13 mkm 3 2 c e s 00000/00000/00018 d D 2.1 87/01/20 18:42:49 mkm 2 1 c e s 00018/00000/00000 d D 1.1 87/01/20 18:33:11 mkm 1 0 c Placed under source control - mkm e u U f b f n t T I 1 D 4 /* " %W% %E% " */ E 4 I 4 #ident " %W% %E% " E 4 # include "curses.ext" # include char *calloc(); char *malloc(); extern char *getenv(); extern WINDOW *makenew(); /* * Low level interface, for compatibility with old curses. */ setterm(type) char *type; { setupterm(type, 1, 0); } E 1 h15441 s 00001/00001/00289 d D 3.2 87/05/13 19:11:51 build 4 3 c removed old SCCS strings and inserted #ident BB e s 00000/00000/00290 d D 3.1 87/01/20 18:52:14 mkm 3 2 c e s 00000/00000/00290 d D 2.1 87/01/20 18:42:51 mkm 2 1 c e s 00290/00000/00000 d D 1.1 87/01/20 18:33:12 mkm 1 0 c Placed under source control - mkm e u U f b f n t T I 1 D 4 /* " %W% %E% " */ E 4 I 4 #ident " %W% %E% " E 4 #include "curses.ext" #include "uparm.h" extern struct term _first_term; extern struct term *cur_term; static char firststrtab[2048]; static int called_before = 0; /* To check for first time. */ char *getenv(); char *malloc(); char ttytype[128]; #ifndef termpath #define termpath(file) "/usr/lib/terminfo/file" #endif #define MAGNUM 0432 #define getshi() getsh(ip) ; ip += 2 /* * "function" to get a short from a pointer. The short is in a standard * format: two bytes, the first is the low order byte, the second is * the high order byte (base 256). The only negative number allowed is * -1, which is represented as 255, 255. This format happens to be the * same as the hardware on the pdp-11 and vax, making it fast and * convenient and small to do this on a pdp-11. */ #ifdef vax #define getsh(ip) (* (short *) ip) #endif #ifdef pdp11 #define getsh(ip) (* (short *) ip) #endif #ifndef getsh /* * Here is a more portable version, which does not assume byte ordering * in shorts, sign extension, etc. * * Hoho! if that's the best you can do, don't sign on for a 68000 port. * You may get those extension bits where I didn't want'em! */ getsh(p) /*register char *p;*/ /* this is where you get the pay off */ unsigned register char *p; { register int rv; if (*p == 0377) return -1; rv = *p++; rv += *p * 256; return rv; } #endif /* * setupterm: low level routine to dig up terminfo from database * and read it in. Parms are terminal type (0 means use getenv("TERM"), * file descriptor all output will go to (for ioctls), and a pointer * to an int into which the error return code goes (0 means to bomb * out with an error message if there's an error). Thus, setupterm(0, 1, 0) * is a reasonable way for a simple program to set up. */ setupterm(term, filenum, errret) char *term; int filenum; /* This is a UNIX file descriptor, not a stdio ptr. */ int *errret; { char tiebuf[4096]; char fname[128]; register char *ip; register char *cp; int n, tfd; char *lcp, *ccp; int snames, nbools, nints, nstrs, sstrtab; char *strtab; if (term == NULL) term = getenv("TERM"); if (term == NULL || *term == '\0') term = "unknown"; tfd = -1; if (cp=getenv("TERMINFO")) { strcpy(fname, cp); cp = fname + strlen(fname); *cp++ = '/'; *cp++ = *term; *cp++ = '/'; strcpy(cp, term); tfd = open(fname, 0); } if (tfd < 0) { strcpy(fname, termpath(a/)); cp = fname + strlen(fname); cp[-2] = *term; strcpy(cp, term); tfd = open(fname, 0); } if( tfd < 0 ) { if( access( termpath( . ), 0 ) ) { if( errret == 0 ) perror( termpath( . ) ); else *errret = -1; } else { if( errret == 0 ) { write(2, "No such terminal: ", 18); write(2, term, strlen(term)); write(2, "\r\n", 2); } else { *errret = 0; } } if( errret == 0 ) exit( -2 ); else return -1; } if( called_before && cur_term ) /* 2nd or more times through */ { cur_term = (struct term *) malloc(sizeof (struct term)); strtab = NULL; } else /* First time through */ { cur_term = &_first_term; called_before = TRUE; strtab = firststrtab; } if( filenum == 1 && !isatty(filenum) ) /* Allow output redirect */ { filenum = 2; } cur_term -> Filedes = filenum; def_shell_mode(); if (errret) *errret = 1; n = read(tfd, tiebuf, sizeof tiebuf); close(tfd); if (n <= 0) { corrupt: write(2, "corrupted term entry\r\n", 22); if (errret == 0) exit(-3); else return -1; } if (n == sizeof tiebuf) { write(2, "term entry too long\r\n", 21); if (errret == 0) exit(-4); else return -1; } cp = ttytype; ip = tiebuf; /* Pick up header */ snames = getshi(); if (snames != MAGNUM) { goto corrupt; } snames = getshi(); nbools = getshi(); nints = getshi(); nstrs = getshi(); sstrtab = getshi(); if (strtab == NULL) { strtab = (char *) malloc(sstrtab); } while (snames--) *cp++ = *ip++; /* Skip names of terminals */ /* * Inner blocks to share this register among two variables. */ { register char *sp; char *fp = (char *)&cur_term->Columns; register char s; for (cp= &cur_term->Auto_left_margin; nbools--; ) { s = *ip++; if (cp < fp) *cp++ = s; } } /* Force proper alignment */ if (((unsigned int) ip) & 1) ip++; { register short *sp; short *fp = (short *)&cur_term->strs; register int s; for (sp= &cur_term->Columns; nints--; ) { s = getshi(); if (sp < fp) *sp++ = s; } } #ifdef JWINSIZE /* * ioctls for Blit - you may need to #include * This ioctl defines the window size and overrides what * it says in terminfo. */ { struct winsize w; if (ioctl(2, JWINSIZE, &w) != -1) { lines = w.bytesy; columns = w.bytesx; } } #endif lcp = getenv("LINES"); ccp = getenv("COLUMNS"); if (lcp) lines = atoi(lcp); if (ccp) columns = atoi(ccp); { register char **pp; char **fp = (char **)&cur_term->Filedes; for (pp= &cur_term->strs.Back_tab; nstrs--; ) { n = getshi(); if (pp < fp) { if (n == -1) *pp++ = NULL; else *pp++ = strtab+n; } } } for (cp=strtab; sstrtab--; ) { *cp++ = *ip++; } /* * If tabs are being expanded in software, turn this off * so output won't get messed up. Also, don't use tab * or backtab, even if the terminal has them, since the * user might not have hardware tabs set right. */ #ifdef USG if ((cur_term -> Nttyb.c_oflag & TABDLY) == TAB3) { cur_term->Nttyb.c_oflag &= ~TABDLY; tab = NULL; back_tab = NULL; reset_prog_mode(); return 0; } #else if ((cur_term -> Nttyb.sg_flags & XTABS) == XTABS) { cur_term->Nttyb.sg_flags &= ~XTABS; tab = NULL; back_tab = NULL; reset_prog_mode(); return 0; } #endif #ifdef DIOCSETT reset_prog_mode(); #endif #ifdef LTILDE ioctl(cur_term -> Filedes, TIOCLGET, &n); if (n & LTILDE); reset_prog_mode(); #endif return 0; } E 1 h00916 s 00001/00001/00196 d D 3.2 87/05/13 19:12:04 build 4 3 c removed old SCCS strings and inserted #ident BB e s 00000/00000/00197 d D 3.1 87/01/20 18:52:17 mkm 3 2 c e s 00000/00000/00197 d D 2.1 87/01/20 18:42:56 mkm 2 1 c e s 00197/00000/00000 d D 1.1 87/01/20 18:33:13 mkm 1 0 c Placed under source control - mkm e u U f b f n t T I 1 D 4 /* " %W% %E% " */ E 4 I 4 #ident " %W% %E% " E 4 #include "curses.ext" /* * Dump the string running from first to last out to the terminal. * Take into account attributes, and attempt to take advantage of * large pieces of white space and text that's already there. * oldline is the old text of the line. * * Variable naming convention: *x means "extension", e.g. a rubber band * that briefly looks ahead; *c means a character version of an otherwise * chtype pointer; old means what was on the screen before this call; * left means the char 1 space to the left. */ _showstring(sline, scol, first, last, oldlp) int sline, scol; chtype *first, *last; struct line *oldlp; { register int hl = 0; /* nontrivial line, highlighted or with holes */ int prevhl=SP->virt_gr, thishl; /* highlight state tty is in */ register chtype *p, *px; /* current char being considered */ register chtype *oldp, *oldpx; /* stuff under p and px */ register char *pc, *pcx; /* like p, px but in char buffer */ chtype *tailoldp; /* last valid oldp */ int oldlen; /* length of old line */ int lcol, lrow; /* position on screen */ int oldc; /* char at oldp */ int leftoldc, leftnewc; /* old & new chars to left of p */ int diff_cookies; /* magic cookies changed */ int diff_attrs; /* highlights changed */ chtype *oldline; #ifdef NONSTANDARD static #endif NONSTANDARD char firstc[256], *lastc; /* char copy of input first, last */ #ifdef DEBUG if(outf) fprintf(outf, "_showstring((%d,%d) %d:'", sline, scol, last-first+1); if(outf) for (p=first; p<=last; p++) { thishl = *p & A_ATTRIBUTES; if (thishl) putc('\'', outf); putc(*p & A_CHARTEXT, outf); } if(outf) fprintf(outf, "').\n"); #endif if (last-first > columns) { _pos(lines-1, 0); #ifndef NONSTANDARD fprintf(stderr, "Bad call to _showstring, first %x, last %x,\ diff %d\pcx\n", first, last, last-first); #endif abort(); } if (oldlp) { oldline = oldlp->body; oldp = oldline+scol; } else oldp = 0; for (p=first,lastc=firstc; p<=last; ) { if (*p & A_ATTRIBUTES) hl++; /* attributes on the line */ if (oldp && (*oldp++ & A_ATTRIBUTES)) hl++; /* attributes on old line */ if (*p==' ' && (px=p+1,*px++==' ') && *px++==' ' && *px==' ') hl++; /* a run of at least 4 blanks */ *lastc++ = *p & A_CHARTEXT; p++; /* On a separate line due to C optimizer bug */ #ifdef FULLDEBUG if(outf) fprintf(outf, "p %x '%c' %o, lastc %x %o, oldp %x %o, hl %d\n", p, p[-1], p[-1], lastc, lastc[-1], oldp, oldp ? oldp[-1] : 0, hl); #endif } lastc--; lcol = scol; lrow = sline; if (oldlp) { oldline = oldlp->body; oldlen = oldlp->length; /* Check for runs of stuff that's already there. */ for (p=first,oldp=oldline+lcol; p<=last; p++,oldp++) { if (*p==*oldp && (px=p+1,oldpx=oldp+1,*px++==*oldpx++) && *px++==*oldpx++ && *px==*oldpx) hl++; /* a run of at least 4 matches */ #ifdef FULLDEBUG if(outf) fprintf(outf, "p %x '%c%c%c%c', oldp %x '%c%c%c%c', hl %d\n", p, p[0], p[1], p[2], p[3], oldp, oldp[0], oldp[1], oldp[2], oldp[3], hl); #endif } } else { oldline = NULL; oldlen = 0; } if (!hl) { /* Simple, common case. Do it fast. */ _pos(lrow, lcol); _hlmode(0); _writechars(firstc, lastc); return; } #ifdef DEBUG if(outf) fprintf(outf, "oldlp %x, oldline %x, oldlen %d 0x%x\n", oldlp, oldline, oldlen, oldlen); if(outf) fprintf(outf, "old body('"); if (oldlp) for (p=oldline; p<=oldline+oldlen; p++) if(outf) fprintf(outf, "%c", *p); if(outf) fprintf(outf, "').\n"); #endif oldc = first[-1]; tailoldp = oldline + oldlen; for (p=first, oldp=oldline+lcol, pc=firstc; pc<=lastc; p++,oldp++,pc++) { thishl = *p & A_ATTRIBUTES; #2876543210/.-,+*)('&%$#"!      h06364 s 00000/00000/00036 d D 3.1 87/01/20 18:52:19 mkm 3 2 c e s 00000/00000/00036 d D 2.1 87/01/20 18:42:58 mkm 2 1 c e s 00036/00000/00000 d D 1.1 87/01/20 18:33:14 mkm 1 0 c Placed under source control - mkm e u U f b f n t T I 1 char *strnames[] = { "cbt", "bel", "cr", "csr", "tbc", "clear", "el", "ed", "hpa", "cmdch", "cup", "cud1", "home", "civis", "cub1", "mrcup", "cnorm", "cuf1", "ll", "cuu1", "cvvis", "dch1", "dl1", "dsl", "hd", "smacs", "blink", "bold", "smcup", "smdc", "dim", "smir", "invis", "prot", "rev", "smso", "smul", "ech", "rmacs", "sgr0", "rmcup", "rmdc", "rmir", "rmso", "rmul", "flash", "ff", "fsl", "is1", "is2", "is3", "if", "ich1", "il1", "ip", "kbs", "ktbc", "kclr", "kctab", "kdch1", "kdl1", "kcud1", "krmir", "kel", "ked", "kf0", "kf1", "kf10", "kf2", "kf3", "kf4", "kf5", "kf6", "kf7", "kf8", "kf9", "khome", "kich1", "kil1", "kcub1", "kll", "knp", "kpp", "kcuf1", "kind", "kri", "khts", "kcuu1", "rmkx", "smkx", "lf0", "lf1", "lf10", "lf2", "lf3", "lf4", "lf5", "lf6", "lf7", "lf8", "lf9", "rmm", "smm", "nel", "pad", "dch", "dl", "cud", "ich", "indn", "il", "cub", "cuf", "rin", "cuu", "pfkey", "pfloc", "pfx", "mc0", "mc4", "mc5", "rep", "rs1", "rs2", "rs3", "rf", "rc", "vpa", "sc", "ind", "ri", "sgr", "hts", "wind", "ht", "tsl", "uc", "hu", "iprog", "ka1", "ka3", "kb2", "kc1", "kc3", "mc5p", 0 }; char *strcodes[] = { "bt", "bl", "cr", "cs", "ct", "cl", "ce", "cd", "ch", "CC", "cm", "do", "ho", "vi", "le", "CM", "ve", "nd", "ll", "up", "vs", "dc", "dl", "ds", "hd", "as", "mb", "md", "ti", "dm", "mh", "im", "mk", "mp", "mr", "so", "us", "ec", "ae", "me", "te", "ed", "ei", "se", "ue", "vb", "ff", "fs", "i1", "is", "i2", "if", "ic", "al", "ip", "kb", "ka", "kC", "kt", "kD", "kL", "kd", "kM", "kE", "kS", "k0", "k1", "k;", "k2", "k3", "k4", "k5", "k6", "k7", "k8", "k9", "kh", "kI", "kA", "kl", "kH", "kN", "kP", "kr", "kF", "kR", "kT", "ku", "ke", "ks", "l0", "l1", "la", "l2", "l3", "l4", "l5", "l6", "l7", "l8", "l9", "mo", "mm", "nw", "pc", "DC", "DL", "DO", "IC", "SF", "AL", "LE", "RI", "SR", "UP", "pk", "pl", "px", "ps", "pf", "po", "rp", "r1", "r2", "r3", "rf", "rc", "cv", "sc", "sf", "sr", "sa", "st", "wi", "ta", "ts", "uc", "hu", "iP", "K1", "K3", "K2", "K4", "K5", "pO", 0 }; E 1 h07626 s 00000/00000/00146 d D 3.1 87/01/20 18:52:21 mkm 3 2 c e s 00000/00000/00146 d D 2.1 87/01/20 18:43:00 mkm 2 1 c e s 00146/00000/00000 d D 1.1 87/01/20 18:33:15 mkm 1 0 c Placed under source control - mkm e u U f b f n t T I 1 strs.back_tab, /* Back tab (P) */ strs.bell, /* Audible signal (bell) (P) */ strs.carriage_return, /* Carriage return (P*) */ strs.change_scroll_region, /* change to lines #1 thru #2 (vt100) (PG) */ strs.clear_all_tabs, /* Clear all tab stops. (P) */ strs.clear_screen, /* Clear screen (P*) */ strs.clr_eol, /* Clear to end of line (P) */ strs.clr_eos, /* Clear to end of display (P*) */ strs.column_address, /* Set cursor column (PG) */ strs.command_character, /* Term. settable cmd char in prototype */ strs.cursor_address, /* Cursor motion to row #1 col #2 (PG) */ strs.cursor_down, /* Down one line */ strs.cursor_home, /* Home cursor (if no cup) */ strs.cursor_invisible, /* Make cursor invisible */ strs.cursor_left, /* Move cursor left one space. */ strs.cursor_mem_address, /* Memory relative cursor addressing. */ strs.cursor_normal, /* Make cursor appear normal (undo vs/vi) */ strs.cursor_right, /* Non-destructive space (cursor right) */ strs.cursor_to_ll, /* Last line, first column (if no cup) */ strs.cursor_up, /* Upline (cursor up) */ strs.cursor_visible, /* Make cursor very visible */ strs.delete_character, /* Delete character (P*) */ strs.delete_line, /* Delete line (P*) */ strs.dis_status_line, /* Disable status line */ strs.down_half_line, /* Half-line down (forward 1/2 linefeed) */ strs.enter_alt_charset_mode, /* Start alternate character set (P) */ strs.enter_blink_mode, /* Turn on blinking */ strs.enter_bold_mode, /* Turn on bold (extra bright) mode */ strs.enter_ca_mode, /* String to begin programs that use cup */ strs.enter_delete_mode, /* Delete mode (enter) */ strs.enter_dim_mode, /* Turn on half-bright mode */ strs.enter_insert_mode, /* Insert mode (enter); */ strs.enter_secure_mode, /* Turn on blank mode (chars invisible) */ strs.enter_protected_mode, /* Turn on protected mode */ strs.enter_reverse_mode, /* Turn on reverse video mode */ strs.enter_standout_mode, /* Begin stand out mode */ strs.enter_underline_mode, /* Start underscore mode */ strs.erase_chars, /* Erase #1 characters (PG) */ strs.exit_alt_charset_mode, /* End alternate character set (P) */ strs.exit_attribute_mode, /* Turn off all attributes */ strs.exit_ca_mode, /* String to end programs that use cup */ strs.exit_delete_mode, /* End delete mode */ strs.exit_insert_mode, /* End insert mode; */ strs.exit_standout_mode, /* End stand out mode */ strs.exit_underline_mode, /* End underscore mode */ strs.flash_screen, /* Visible bell (may not move cursor) */ strs.form_feed, /* Hardcopy terminal page eject (P*) */ strs.from_status_line, /* Return from status line */ strs.init_1string, /* Terminal initialization string */ strs.init_2string, /* Terminal initialization string */ strs.init_3string, /* Terminal initialization string */ strs.init_file, /* Name of file containing is */ strs.insert_character, /* Insert character (P) */ strs.insert_line, /* Add new blank line (P*) */ strs.insert_padding, /* Insert pad after character inserted (P*) */ strs.key_backspace, /* Sent by backspace key */ strs.key_catab, /* Sent by clear-all-tabs key. */ strs.key_clear, /* Sent by clear screen or erase key. */ strs.key_ctab, /* Sent by clear-tab key */ strs.key_dc, /* Sent by delete character key. */ strs.key_dl, /* Sent by delete line key. */ strs.key_down, /* Sent by terminal down arrow key */ strs.key_eic, /* Sent by rmir or smir in insert mode. */ strs.key_eol, /* Sent by clear-to-end-of-line key. */ strs.key_eos, /* Sent by clear-to-end-of-screen key. */ strs.key_f0, /* Sent by function key f0. */ strs.key_f1, /* Sent by function key f1. */ strs.key_f10, /* Sent by function key f10. */ strs.key_f2, /* Sent by function key f2. */ strs.key_f3, /* Sent by function key f3. */ strs.key_f4, /* Sent by function key f4. */ strs.key_f5, /* Sent by function key f5. */ strs.key_f6, /* Sent by function key f6. */ strs.key_f7, /* Sent by function key f7. */ strs.key_f8, /* Sent by function key f8. */ strs.key_f9, /* Sent by function key f9. */ strs.key_home, /* Sent by home key. */ strs.key_ic, /* Sent by ins char/enter ins mode key. */ strs.key_il, /* Sent by insert line. */ strs.key_left, /* Sent by terminal left arrow key */ strs.key_ll, /* Sent by home-down key */ strs.key_npage, /* Sent by next-page key */ strs.key_ppage, /* Sent by previous-page key */ strs.key_right, /* Sent by terminal right arrow key */ strs.key_sf, /* Sent by scroll-forward/down key */ strs.key_sr, /* Sent by scroll-backward/up key */ strs.key_stab, /* Sent by set-tab key */ strs.key_up, /* Sent by terminal up arrow key */ strs.keypad_local, /* Out of "keypad transmit" mode */ strs.keypad_xmit, /* Put terminal in "keypad transmit" mode */ strs.lab_f0, /* Labels on function key f0 if not f0 */ strs.lab_f1, /* Labels on function key f1 if not f1 */ strs.lab_f10, /* Labels on function key f10 if not f10 */ strs.lab_f2, /* Labels on function key f2 if not f2 */ strs.lab_f3, /* Labels on function key f3 if not f3 */ strs.lab_f4, /* Labels on function key f4 if not f4 */ strs.lab_f5, /* Labels on function key f5 if not f5 */ strs.lab_f6, /* Labels on function key f6 if not f6 */ strs.lab_f7, /* Labels on function key f7 if not f7 */ strs.lab_f8, /* Labels on function key f8 if not f8 */ strs.lab_f9, /* Labels on function key f9 if not f9 */ strs.meta_off, /* Turn off "meta mode" */ strs.meta_on, /* Turn on "meta mode" (8th bit) */ strs.newline, /* Newline (behaves like cr followed by lf) */ strs.pad_char, /* Pad character (rather than null) */ strs.parm_dch, /* Delete #1 chars (PG*) */ strs.parm_delete_line, /* Delete #1 lines (PG*) */ strs.parm_down_cursor, /* Move cursor down #1 lines. (PG*) */ strs.parm_ich, /* Insert #1 blank chars (PG*) */ strs.parm_index, /* Scroll forward #1 lines. (PG) */ strs.parm_insert_line, /* Add #1 new blank lines (PG*) */ strs.parm_left_cursor, /* Move cursor left #1 spaces (PG) */ strs.parm_right_cursor, /* Move cursor right #1 spaces. (PG*) */ strs.parm_rindex, /* Scroll backward #1 lines. (PG) */ strs.parm_up_cursor, /* Move cursor up #1 lines. (PG*) */ strs.pkey_key, /* Prog funct key #1 to type string #2 */ strs.pkey_local, /* Prog funct key #1 to execute string #2 */ strs.pkey_xmit, /* Prog funct key #1 to xmit string #2 */ strs.print_screen, /* Print contents of the screen */ strs.prtr_off, /* Turn off the printer */ strs.prtr_on, /* Turn on the printer */ strs.repeat_char, /* Repeat char #1 #2 times. (PG*) */ strs.reset_1string, /* Reset terminal completely to sane modes. */ strs.reset_2string, /* Reset terminal completely to sane modes. */ strs.reset_3string, /* Reset terminal completely to sane modes. */ strs.reset_file, /* Name of file containing reset string. */ strs.restore_cursor, /* Restore cursor to position of last sc. */ strs.row_address, /* Like hpa but sets row. (PG) */ strs.save_cursor, /* Save cursor position. (P) */ strs.scroll_forward, /* Scroll text up (P) */ strs.scroll_reverse, /* Scroll text down (P) */ strs.set_attributes, /* Define the video attributes (PG9) */ strs.set_tab, /* Set a tab in all rows, current column. */ strs.set_window, /* Current window is lines #1-#2 cols #3-#4 */ strs.tab, /* Tab to next 8 space hardware tab stop. */ strs.to_status_line, /* Go to status line */ strs.underline_char, /* Underscore one char and move past it */ strs.up_half_line, /* Half-line up (reverse 1/2 linefeed) */ strs.init_prog, /* Path name of program for init. */ strs.key_a1, /* Upper left of keypad */ strs.key_a3, /* Upper right of keypad */ strs.key_b2, /* Center of keypad */ strs.key_c1, /* Lower left of keypad */ strs.key_c3, /* Lower right of keypad */ strs.prtr_non, /* Turn on the printer for #1 bytes. */ laststr; E 1 h41662 s 00001/00001/00048 d D 3.2 87/05/13 19:12:16 build 4 3 c removed old SCCS strings and inserted #ident BB e s 00000/00000/00049 d D 3.1 87/01/20 18:52:24 mkm 3 2 c e s 00000/00000/00049 d D 2.1 87/01/20 18:43:02 mkm 2 1 c e s 00049/00000/00000 d D 1.1 87/01/20 18:33:16 mkm 1 0 c Placed under source control - mkm e u U f b f n t T I 1 D 4 /* " %W% %E% " */ E 4 I 4 #ident " %W% %E% " E 4 # include "curses.ext" # include char *calloc(); char *malloc(); extern char *getenv(); extern WINDOW *makenew(); WINDOW * subwin(orig, num_lines, num_cols, begy, begx) register WINDOW *orig; int num_lines, num_cols, begy, begx; { register int i; register WINDOW *win; register int by, bx, nlines, ncols; register int j, k; by = begy; bx = begx; nlines = num_lines; ncols = num_cols; /* * make sure window fits inside the original one */ # ifdef DEBUG if(outf) fprintf(outf, "SUBWIN(%0.2o, %d, %d, %d, %d)\n", orig, nlines, ncols, by, bx); # endif if (by < orig->_begy || bx < orig->_begx || by + nlines > orig->_begy + orig->_maxy || bx + ncols > orig->_begx + orig->_maxx) return NULL; if (nlines == 0) nlines = orig->_maxy - orig->_begy - by; if (ncols == 0) ncols = orig->_maxx - orig->_begx - bx; if ((win = makenew(nlines, ncols, by, bx)) == NULL) return NULL; j = by - orig->_begy; k = bx - orig->_begx; for (i = 0; i < nlines; i++) win->_y[i] = &orig->_y[j++][k]; win->_flags = _SUBWIN; return win; } E 1 h49686 s 00000/00000/00035 d D 3.1 87/01/20 18:52:25 mkm 3 2 c e s 00000/00000/00035 d D 2.1 87/01/20 18:43:04 mkm 2 1 c e s 00035/00000/00000 d D 1.1 87/01/20 18:33:18 mkm 1 0 c Placed under source control - mkm e u U f b f n t T I 1 e caps g/^#/d /--- begin bool/+,/--- end bool/-w bool /--- begin num/+,/--- end num/-w num /--- begin str/+,/--- end str/-w str e bool 1,$s/"/'/ 1,$s/"/'/ 1,$s/ *'[^ ]*' *"// 1,$s/".*// 1,$s/\(.*\),\(.\)\(.\)/ case two('\2','\3'): rv = \1; break; w e num 1,$s/"/'/ 1,$s/"/'/ 1,$s/ *'[^ ]*' *"// 1,$s/".*// 1,$s/\(.*\),\(.\)\(.\)/ case two('\2','\3'): rv = \1; break; w e str 1,$s/"/'/ 1,$s/"/'/ 1,$s/ *'[^ ]*' *"// 1,$s/".*// 1,$s/\(.*\),\(.\)\(.\)/ case two('\2','\3'): rv = \1; break; w e termcap.form /BOOL/d -r bool /NUM/d -r num /STR/d -r str w termcap.c q E 1 h35754 s 00000/00000/00084 d D 3.1 87/01/20 18:52:27 mkm 3 2 c e s 00000/00000/00084 d D 2.1 87/01/20 18:43:05 mkm 2 1 c e s 00084/00000/00000 d D 1.1 87/01/20 18:33:19 mkm 1 0 c Placed under source control - mkm e u U f b f n t T I 1 /* * Simulation of termcap using terminfo. */ #include "curses.ext" static char *sccsid = "@(#)termcap.form 1.1 1.8 3/6/83"; char *UP; char *BC; char PC; short ospeed; int tgetent(bp, name) char *bp, *name; { int rv; if (setupterm(name, 1, &rv) >= 0) /* Leave things as they were (for compatibility) */ reset_shell_mode(); return rv; } /* Make a 2 letter code into an integer we can switch on easily */ #define two(s1, s2) (s1 + 256*s2) #define twostr(str) two(*str, str[1]) int tgetflag(id) char *id; { register int rv; register char *p; switch (twostr(id)) { BOOLS case two('b','s'): p = cursor_left; rv = p && *p==8 && p[1] == 0; break; case two('p','t'): p = tab; rv = p && *p==9 && p[1] == 0; break; case two('n','c'): p = carriage_return; rv = ! (p && *p==13 && p[1] == 0); break; case two('n','s'): p = scroll_forward; rv = ! (p && *p==10 && p[1] == 0); break; default: rv = 0; } return rv; } int tgetnum(id) char *id; { int rv; switch (twostr(id)) { NUMS default: rv = -1; } return rv; } char * tgetstr(id, area) char *id, *area; { char *rv; switch (twostr(id)) { STRS default: rv = NULL; } return rv; } E 1 h43375 s 00001/00001/00018 d D 3.2 87/05/13 19:12:28 build 4 3 c removed old SCCS strings and inserted #ident BB e s 00000/00000/00019 d D 3.1 87/01/20 18:52:29 mkm 3 2 c e s 00000/00000/00019 d D 2.1 87/01/20 18:43:07 mkm 2 1 c e s 00019/00000/00000 d D 1.1 87/01/20 18:33:20 mkm 1 0 c Placed under source control - mkm e u U f b f n t T I 1 D 4 /* " %W% %E% " */ E 4 I 4 #ident " %W% %E% " E 4 /* * Simulation of termcap using terminfo. */ #include "curses.ext" int tgetent(bp, name) char *bp, *name; { int rv; if (setupterm(name, 1, &rv) >= 0) /* Leave things as they were (for compatibility) */ reset_shell_mode(); return rv; } E 1 h24530 s 00001/00001/00060 d D 3.2 87/05/13 19:12:39 build 4 3 c removed old SCCS strings and inserted #ident BB e s 00000/00000/00061 d D 3.1 87/01/20 18:52:31 mkm 3 2 c e s 00000/00000/00061 d D 2.1 87/01/20 18:43:08 mkm 2 1 c e s 00061/00000/00000 d D 1.1 87/01/20 18:33:21 mkm 1 0 c Placed under source control - mkm e u U f b f n t T I 1 D 4 /* " %W% %E% " */ E 4 I 4 #ident " %W% %E% " E 4 /* * Simulation of termcap using terminfo. */ #include "curses.ext" /* Make a 2 letter code into an integer we can switch on easily */ #define two(s1, s2) (s1 + 256*s2) #define twostr(str) two(*str, str[1]) int tgetflag(id) char *id; { register int rv; register char *p; switch (twostr(id)) { case two('b','w'): rv = auto_left_margin; break; case two('a','m'): rv = auto_right_margin; break; case two('x','b'): rv = beehive_glitch; break; case two('x','s'): rv = ceol_standout_glitch; break; case two('x','n'): rv = eat_newline_glitch; break; case two('e','o'): rv = erase_overstrike; break; case two('g','n'): rv = generic_type; break; case two('h','c'): rv = hard_copy; break; case two('k','m'): rv = has_meta_key; break; case two('h','s'): rv = has_status_line; break; case two('i','n'): rv = insert_null_glitch; break; case two('d','a'): rv = memory_above; break; case two('d','b'): rv = memory_below; break; case two('m','i'): rv = move_insert_mode; break; case two('m','s'): rv = move_standout_mode; break; case two('o','s'): rv = over_strike; break; case two('e','s'): rv = status_line_esc_ok; break; case two('x','t'): rv = teleray_glitch; break; case two('h','z'): rv = tilde_glitch; break; case two('u','l'): rv = transparent_underline; break; case two('x','o'): rv = xon_xoff; break; case two('b','s'): p = cursor_left; rv = p && *p==8 && p[1] == 0; break; case two('p','t'): p = tab; rv = p && *p==9 && p[1] == 0; break; case two('n','c'): p = carriage_return; rv = ! (p && *p==13 && p[1] == 0); break; case two('n','s'): p = scroll_forward; rv = ! (p && *p==10 && p[1] == 0); break; default: rv = 0; } return rv; } E 1 h13381 s 00001/00001/00030 d D 3.2 87/05/13 19:12:51 build 4 3 c removed old SCCS strings and inserted #ident BB e s 00000/00000/00031 d D 3.1 87/01/20 18:52:32 mkm 3 2 c e s 00000/00000/00031 d D 2.1 87/01/20 18:43:10 mkm 2 1 c e s 00031/00000/00000 d D 1.1 87/01/20 18:33:22 mkm 1 0 c Placed under source control - mkm e u U f b f n t T I 1 D 4 /* " %W% %E% " */ E 4 I 4 #ident " %W% %E% " E 4 /* * Simulation of termcap using terminfo. */ #include "curses.ext" /* Make a 2 letter code into an integer we can switch on easily */ #define two( s1, s2 ) (s1 + 256 * s2 ) #define twostr( str ) two( *str, str[ 1 ] ) int tgetnum(id) char *id; { int rv; switch (twostr(id)) { case two('c','o'): rv = columns; break; case two('i','t'): rv = init_tabs; break; case two('l','i'): rv = lines; break; case two('l','m'): rv = lines_of_memory; break; case two('s','g'): rv = magic_cookie_glitch; break; case two('p','b'): rv = padding_baud_rate; break; case two('v','t'): rv = virtual_terminal; break; case two('w','s'): rv = width_status_line; break; default: rv = -1; } return rv; } E 1 h37170 s 00001/00001/00167 d D 3.2 87/05/13 19:13:05 build 4 3 c removed old SCCS strings and inserted #ident BB e s 00000/00000/00168 d D 3.1 87/01/20 18:52:34 mkm 3 2 c e s 00000/00000/00168 d D 2.1 87/01/20 18:43:12 mkm 2 1 c e s 00168/00000/00000 d D 1.1 87/01/20 18:33:23 mkm 1 0 c Placed under source control - mkm e u U f b f n t T I 1 D 4 /* " %W% %E% " */ E 4 I 4 #ident " %W% %E% " E 4 /* * Simulation of termcap using terminfo. */ #include "curses.ext" /* Make a 2 letter code into an integer we can switch on easily */ #define two( s1, s2 ) (s1 + 256 * s2 ) #define twostr( str ) two( *str, str[ 1 ] ) char * tgetstr(id, area) char *id, *area; { char *rv; switch (twostr(id)) { case two('b','t'): rv = back_tab; break; case two('b','l'): rv = bell; break; case two('c','r'): rv = carriage_return; break; case two('c','s'): rv = change_scroll_region; break; case two('c','t'): rv = clear_all_tabs; break; case two('c','l'): rv = clear_screen; break; case two('c','e'): rv = clr_eol; break; case two('c','d'): rv = clr_eos; break; case two('c','h'): rv = column_address; break; case two('C','C'): rv = command_character; break; case two('c','m'): rv = cursor_address; break; case two('d','o'): rv = cursor_down; break; case two('h','o'): rv = cursor_home; break; case two('v','i'): rv = cursor_invisible; break; case two('l','e'): rv = cursor_left; break; case two('C','M'): rv = cursor_mem_address; break; case two('v','e'): rv = cursor_normal; break; case two('n','d'): rv = cursor_right; break; case two('l','l'): rv = cursor_to_ll; break; case two('u','p'): rv = cursor_up; break; case two('v','s'): rv = cursor_visible; break; case two('d','c'): rv = delete_character; break; case two('d','l'): rv = delete_line; break; case two('d','s'): rv = dis_status_line; break; case two('h','d'): rv = down_half_line; break; case two('a','s'): rv = enter_alt_charset_mode; break; case two('m','b'): rv = enter_blink_mode; break; case two('m','d'): rv = enter_bold_mode; break; case two('t','i'): rv = enter_ca_mode; break; case two('d','m'): rv = enter_delete_mode; break; case two('m','h'): rv = enter_dim_mode; break; case two('i','m'): rv = enter_insert_mode; break; case two('m','k'): rv = enter_secure_mode; break; case two('m','p'): rv = enter_protected_mode; break; case two('m','r'): rv = enter_reverse_mode; break; case two('s','o'): rv = enter_standout_mode; break; case two('u','s'): rv = enter_underline_mode; break; case two('e','c'): rv = erase_chars; break; case two('a','e'): rv = exit_alt_charset_mode; break; case two('m','e'): rv = exit_attribute_mode; break; case two('t','e'): rv = exit_ca_mode; break; case two('e','d'): rv = exit_delete_mode; break; case two('e','i'): rv = exit_insert_mode; break; case two('s','e'): rv = exit_standout_mode; break; case two('u','e'): rv = exit_underline_mode; break; case two('v','b'): rv = flash_screen; break; case two('f','f'): rv = form_feed; break; case two('f','s'): rv = from_status_line; break; case two('i','1'): rv = init_1string; break; case two('i','s'): rv = init_2string; break; case two('i','2'): rv = init_3string; break; case two('i','f'): rv = init_file; break; case two('i','c'): rv = insert_character; break; case two('a','l'): rv = insert_line; break; case two('i','p'): rv = insert_padding; break; case two('k','b'): rv = key_backspace; break; case two('k','a'): rv = key_catab; break; case two('k','C'): rv = key_clear; break; case two('k','t'): rv = key_ctab; break; case two('k','D'): rv = key_dc; break; case two('k','L'): rv = key_dl; break; case two('k','d'): rv = key_down; break; case two('k','M'): rv = key_eic; break; case two('k','E'): rv = key_eol; break; case two('k','S'): rv = key_eos; break; case two('k','0'): rv = key_f0; break; case two('k','1'): rv = key_f1; break; case two('k',';'): rv = key_f10; break; case two('k','2'): rv = key_f2; break; case two('k','3'): rv = key_f3; break; case two('k','4'): rv = key_f4; break; case two('k','5'): rv = key_f5; break; case two('k','6'): rv = key_f6; break; case two('k','7'): rv = key_f7; break; case two('k','8'): rv = key_f8; break; case two('k','9'): rv = key_f9; break; case two('k','h'): rv = key_home; break; case two('k','I'): rv = key_ic; break; case two('k','A'): rv = key_il; break; case two('k','l'): rv = key_left; break; case two('k','H'): rv = key_ll; break; case two('k','N'): rv = key_npage; break; case two('k','P'): rv = key_ppage; break; case two('k','r'): rv = key_right; break; case two('k','F'): rv = key_sf; break; case two('k','R'): rv = key_sr; break; case two('k','T'): rv = key_stab; break; case two('k','u'): rv = key_up; break; case two('k','e'): rv = keypad_local; break; case two('k','s'): rv = keypad_xmit; break; case two('l','0'): rv = lab_f0; break; case two('l','1'): rv = lab_f1; break; case two('l','a'): rv = lab_f10; break; case two('l','2'): rv = lab_f2; break; case two('l','3'): rv = lab_f3; break; case two('l','4'): rv = lab_f4; break; case two('l','5'): rv = lab_f5; break; case two('l','6'): rv = lab_f6; break; case two('l','7'): rv = lab_f7; break; case two('l','8'): rv = lab_f8; break; case two('l','9'): rv = lab_f9; break; case two('m','o'): rv = meta_off; break; case two('m','m'): rv = meta_on; break; case two('n','w'): rv = newline; break; case two('p','c'): rv = pad_char; break; case two('D','C'): rv = parm_dch; break; case two('D','L'): rv = parm_delete_line; break; case two('D','O'): rv = parm_down_cursor; break; case two('I','C'): rv = parm_ich; break; case two('S','F'): rv = parm_index; break; case two('A','L'): rv = parm_insert_line; break; case two('L','E'): rv = parm_left_cursor; break; case two('R','I'): rv = parm_right_cursor; break; case two('S','R'): rv = parm_rindex; break; case two('U','P'): rv = parm_up_cursor; break; case two('p','k'): rv = pkey_key; break; case two('p','l'): rv = pkey_local; break; case two('p','x'): rv = pkey_xmit; break; case two('p','s'): rv = print_screen; break; case two('p','f'): rv = prtr_off; break; case two('p','o'): rv = prtr_on; break; case two('r','p'): rv = repeat_char; break; case two('r','1'): rv = reset_1string; break; case two('r','2'): rv = reset_2string; break; case two('r','3'): rv = reset_3string; break; case two('r','f'): rv = reset_file; break; case two('r','c'): rv = restore_cursor; break; case two('c','v'): rv = row_address; break; case two('s','c'): rv = save_cursor; break; case two('s','f'): rv = scroll_forward; break; case two('s','r'): rv = scroll_reverse; break; case two('s','a'): rv = set_attributes; break; case two('s','t'): rv = set_tab; break; case two('w','i'): rv = set_window; break; case two('t','a'): rv = tab; break; case two('t','s'): rv = to_status_line; break; case two('u','c'): rv = underline_char; break; case two('h','u'): rv = up_half_line; break; case two('i','P'): rv = init_prog; break; case two('K','1'): rv = key_a1; break; case two('K','3'): rv = key_a3; break; case two('K','2'): rv = key_b2; break; case two('K','4'): rv = key_c1; break; case two('K','5'): rv = key_c3; break; case two('p','O'): rv = prtr_non; break; default: rv = NULL; } return rv; } E 1 h46193 s 00001/00001/00015 d D 3.2 87/05/13 19:13:18 build 4 3 c removed old SCCS strings and inserted #ident BB e s 00000/00000/00016 d D 3.1 87/01/20 18:52:36 mkm 3 2 c e s 00000/00000/00016 d D 2.1 87/01/20 18:43:15 mkm 2 1 c e s 00016/00000/00000 d D 1.1 87/01/20 18:33:24 mkm 1 0 c Placed under source control - mkm e u U f b f n t T I 1 D 4 /* " %W% %E% " */ E 4 I 4 #ident " %W% %E% " E 4 /* * tgoto: function included only for upward compatibility with old termcap * library. Assumes exactly two parameters in the wrong order. */ char * tgoto(cap, col, row) char *cap; int col, row; { char *cp; char *tparm(); cp = tparm(cap, row, col); return cp; } E 1 h48528 s 00001/00001/00247 d D 3.2 87/05/13 19:13:31 build 4 3 c removed old SCCS strings and inserted #ident BB e s 00000/00000/00248 d D 3.1 87/01/20 18:52:37 mkm 3 2 c e s 00000/00000/00248 d D 2.1 87/01/20 18:43:16 mkm 2 1 c e s 00248/00000/00000 d D 1.1 87/01/20 18:33:25 mkm 1 0 c Placed under source control - mkm e u U f b f n t T I 1 D 4 /* " %W% %E% " */ E 4 I 4 #ident " %W% %E% " E 4 /* * ti4 [term] * dummy program to test termlib. * gets entry, counts it, and prints it. */ #include #include "curses.h" #include "term.h" #define prb(name) if (name) printf("name\n") #define prn(name) if (name != -1) printf("name = %d\n", name) #define prs(name) if (name) {printf("name = '"); pr(name); printf("'\n");} char buf[1024]; char *getenv(); main(argc, argv) char **argv; { char *p; int rc; if (argc < 2) p = getenv("TERM"); else p = argv[1]; printf("Terminal type %s\n", p); setupterm(p,1,0); printf("flags\n"); prb(auto_left_margin) ; prb(auto_right_margin) ; prb(beehive_glitch) ; prb(ceol_standout_glitch) ; prb(eat_newline_glitch) ; prb(erase_overstrike) ; prb(generic_type) ; prb(hard_copy) ; prb(has_meta_key) ; prb(has_status_line) ; prb(insert_null_glitch) ; prb(memory_above) ; prb(memory_below) ; prb(move_insert_mode) ; prb(move_standout_mode) ; prb(over_strike) ; prb(status_line_esc_ok) ; prb(teleray_glitch) ; prb(tilde_glitch) ; prb(transparent_underline) ; prb(xon_xoff) ; printf("\nnumbers\n"); prn(columns) ; prn(init_tabs) ; prn(lines) ; prn(lines_of_memory) ; prn(magic_cookie_glitch) ; prn(padding_baud_rate) ; prn(virtual_terminal) ; prn(width_status_line) ; printf("\nstrings\n"); prs(back_tab) ; prs(bell) ; prs(carriage_return) ; prs(change_scroll_region) ; prs(clear_all_tabs) ; prs(clear_screen) ; prs(clr_eol) ; prs(clr_eos) ; prs(column_address) ; prs(command_character) ; prs(cursor_address) ; prs(cursor_down) ; prs(cursor_home) ; prs(cursor_invisible) ; prs(cursor_left) ; prs(cursor_mem_address) ; prs(cursor_normal) ; prs(cursor_right) ; prs(cursor_to_ll) ; prs(cursor_up) ; prs(cursor_visible) ; prs(delete_character) ; prs(delete_line) ; prs(dis_status_line) ; prs(down_half_line) ; prs(enter_alt_charset_mode) ; prs(enter_blink_mode) ; prs(enter_bold_mode) ; prs(enter_ca_mode) ; prs(enter_delete_mode) ; prs(enter_dim_mode) ; prs(enter_insert_mode) ; prs(enter_secure_mode) ; prs(enter_protected_mode) ; prs(enter_reverse_mode) ; prs(enter_standout_mode) ; prs(enter_underline_mode) ; prs(erase_chars) ; prs(exit_alt_charset_mode) ; prs(exit_attribute_mode) ; prs(exit_ca_mode) ; prs(exit_delete_mode) ; prs(exit_insert_mode) ; prs(exit_standout_mode) ; prs(exit_underline_mode) ; prs(flash_screen) ; prs(form_feed) ; prs(from_status_line) ; prs(init_1string) ; prs(init_2string) ; prs(init_3string) ; prs(init_file) ; prs(insert_character) ; prs(insert_line) ; prs(insert_padding) ; prs(key_backspace) ; prs(key_catab) ; prs(key_clear) ; prs(key_ctab) ; prs(key_dc) ; prs(key_dl) ; prs(key_down) ; prs(key_eic) ; prs(key_eol) ; prs(key_eos) ; prs(key_f0) ; prs(key_f1) ; prs(key_f10) ; prs(key_f2) ; prs(key_f3) ; prs(key_f4) ; prs(key_f5) ; prs(key_f6) ; prs(key_f7) ; prs(key_f8) ; prs(key_f9) ; prs(key_home) ; prs(key_ic) ; prs(key_il) ; prs(key_left) ; prs(key_ll) ; prs(key_npage) ; prs(key_ppage) ; prs(key_right) ; prs(key_sf) ; prs(key_sr) ; prs(key_stab) ; prs(key_up) ; prs(keypad_local) ; prs(keypad_xmit) ; prs(lab_f0) ; prs(lab_f1) ; prs(lab_f10) ; prs(lab_f2) ; prs(lab_f3) ; prs(lab_f4) ; prs(lab_f5) ; prs(lab_f6) ; prs(lab_f7) ; prs(lab_f8) ; prs(lab_f9) ; prs(meta_off) ; prs(meta_on) ; prs(newline) ; prs(pad_char) ; prs(parm_dch) ; prs(parm_delete_line) ; prs(parm_down_cursor) ; prs(parm_ich) ; prs(parm_index) ; prs(parm_insert_line) ; prs(parm_left_cursor) ; prs(parm_right_cursor) ; prs(parm_rindex) ; prs(parm_up_cursor) ; prs(pkey_key) ; prs(pkey_local) ; prs(pkey_xmit) ; prs(print_screen) ; prs(prtr_off) ; prs(prtr_on) ; prs(repeat_char) ; prs(reset_1string) ; prs(reset_2string) ; prs(reset_3string) ; prs(reset_file) ; prs(restore_cursor) ; prs(row_address) ; prs(save_cursor) ; prs(scroll_forward) ; prs(scroll_reverse) ; prs(set_attributes) ; prs(set_tab) ; prs(set_window) ; prs(tab) ; prs(to_status_line) ; prs(underline_char) ; prs(up_half_line) ; prs(init_prog) ; prs(key_a1) ; prs(key_a3) ; prs(key_b2) ; prs(key_c1) ; prs(key_c3) ; prs(prtr_non) ; printf("end of strings\n"); reset_shell_mode(); exit(0); } pr(p) register char *p; { char *rdchar(); for (; *p; p++) printf("%s", rdchar(*p)); } /* * rdchar: returns a readable representation of an ASCII char, using ^ notation. */ #include char *rdchar(c) char c; { static char ret[4]; register char *p; /* * Due to a bug in isprint, this prints spaces as ^`, but this is OK * because we want something to show up on the screen. */ ret[0] = ((c&0377) > 0177) ? '\'' : ' '; c &= 0177; ret[1] = isprint(c) ? ' ' : '^'; ret[2] = isprint(c) ? c : c^0100; ret[3] = 0; for (p=ret; *p==' '; p++) ; return (p); } E 1 h50430 s 00001/00001/00021 d D 3.2 87/05/13 19:13:46 build 4 3 c removed old SCCS strings and inserted #ident BB e s 00000/00000/00022 d D 3.1 87/01/20 18:52:40 mkm 3 2 c e s 00000/00000/00022 d D 2.1 87/01/20 18:43:19 mkm 2 1 c e s 00022/00000/00000 d D 1.1 87/01/20 18:33:26 mkm 1 0 c Placed under source control - mkm e u U f b f n t T I 1 D 4 /* " %W% %E% " */ E 4 I 4 #ident " %W% %E% " E 4 # include "curses.ext" /* * make it look like the whole window has been changed. * */ touchwin(win) reg WINDOW *win; { reg int y, maxy, maxx; #ifdef DEBUG if (outf) fprintf(outf, "touchwin(%x)\n", win); #endif maxy = win->_maxy; maxx = win->_maxx - 1; for (y = 0; y < maxy; y++) { win->_firstch[y] = 0; win->_lastch[y] = maxx; } } E 1 h11979 s 00001/00001/00388 d D 3.2 87/05/13 19:14:19 build 4 3 c removed old SCCS strings and inserted #ident BB e s 00000/00000/00389 d D 3.1 87/01/20 18:52:41 mkm 3 2 c e s 00000/00000/00389 d D 2.1 87/01/20 18:43:20 mkm 2 1 c e s 00389/00000/00000 d D 1.1 87/01/20 18:33:27 mkm 1 0 c Placed under source control - mkm e u U f b f n t T I 1 D 4 /* " %W% %E% " */ E 4 I 4 #ident " %W% %E% " E 4 /* Copyright (c) 1979 Regents of the University of California */ #include "curses.h" #include "term.h" #ifdef NONSTANDARD #include "ns_curses.h" #endif #define CTRL(c) ('c' & 037) /* #define _err(msg) 0 */ static char *_err(); char *_branchto(); /* * Routine to perform parameter substitution. * instring is a string containing printf type escapes. * The whole thing uses a stack, much like an HP 35. * The following escapes are defined for substituting row/column: * * %d print pop() as in printf * %[0]2d print pop() like %[0]2d * %[0]3d print pop() like %[0]3d * %c print pop() like %c * %s print pop() like %s * %l pop() a string and push its length. * * %p[1-0] push ith parm * %P[a-z] set variable * %g[a-z] get variable * %'c' char constant c * %{nn} integer constant nn * * %+ %- %* %/ %m arithmetic (%m is mod): push(pop() op pop()) * %& %| %^ bit operations: push(pop() op pop()) * %= %> %< logical operations: push(pop() op pop()) * %! %~ unary operations push(op pop()) * %b unary BCD conversion * %d unary Delta Data conversion * * %? expr %t thenpart %e elsepart %; * if-then-else, %e elsepart is optional. * else-if's are possible ala Algol 68: * %? c1 %t %e c2 %t %e c3 %t %e c4 %t %e %; * * all other characters are ``self-inserting''. %% gets % output. */ /* #define tparmdebug */ #ifdef tparmdebug char *tparm(); #include #define DEBUG FILE *outf; main() { int so, ul, rev, bl, dim, bold, blank, prot, alt; setupterm(getenv("TERM"), 1, 0); outf = stdout; for (;;) { printf("so, ul, rev, bl, dim, bold, blank, prot, alt: "); scanf("%d %d %d %d %d %d %d %d %d", &so, &ul, &rev, &bl, &dim, &bold, &blank, &prot, &alt); printf("-->%s<--\n", tparm(set_attributes, so, ul, rev, bl, dim, bold, blank, prot, alt)); } } _prstr(result) char *result; { register char *cp; for (cp=result; *cp; cp++) if (*cp >= ' ' && *cp <= '~') putchar(*cp); else printf("\\%o", *cp&0377); } #endif #define push(i) (stack[++top] = (i)) #define pop() (stack[top--]) /* VARARGS */ char * tparm(instring, p1, p2, p3, p4, p5, p6, p7, p8, p9) char *instring; int p1, p2, p3, p4, p5, p6, p7, p8 ,p9; { static char result[32]; static char added[10]; int vars[26]; int stack[10], top = 0; register char *cp = instring; register char *outp = result; register int c; register int op; int sign; int onrow = 0; int leadzero = 0; /* not having leading zero is unimplemented */ char *xp; if (instring == 0) return _err("null arg"); added[0] = 0; #ifdef tparmdebug printf("'"); _prstr(instring); printf("'\n"); #endif while (c = *cp++) { #ifdef tparmdebug printf("loop, c %c%c%c, top %d @ %d, 2nd %d, out '", c, *cp, *(cp+1), stack[top], top, stack[top-1]); _prstr(result); printf("'\n"); #endif if (c != '%') { *outp++ = c; continue; } op = stack[top]; if (*cp == '0') { leadzero = 1; cp++; } switch (c = *cp++) { /* PRINTING CASES */ case 'd': if (op < 10) goto one; if (op < 100) goto two; /* fall into... */ case '3': three: if (c == '3' && *cp++ != 'd') return _err("bad char after %3"); *outp++ = (op / 100) | '0'; op %= 100; /* fall into... */ case '2': if (op >= 100) goto three; if (c == '2' && *cp++ != 'd') return _err("bad char after %2"); two: *outp++ = op / 10 | '0'; one: *outp++ = op % 10 | '0'; (void) pop(); continue; case 'c': /* * This code is worth scratching your head at for a * while. The idea is that various weird things can * happen to nulls, EOT's, tabs, and newlines by the * tty driver, arpanet, and so on, so we don't send * them if we can help it. So we instead alter the * place being addessed and then move the cursor * locally using UP or RIGHT. * * This is a kludge, clearly. It loses if the * parameterized string isn't addressing the cursor * (but hopefully that is all that %c terminals do * with parms). Also, since tab and newline happen * to be next to each other in ASCII, if tab were * included a loop would be needed. Finally, note * that lots of other processing is done here, so * this hack won't always work (e.g. the Ann Arbor * 4080, which uses %B and then %c.) */ switch (op) { /* * Null. Problem is that our output is, by * convention, null terminated. */ case 0: op = 0200; /* Parity should be ignored */ break; /* * Control D. Problem is that certain very * ancient hardware hangs up on this, so the * current (!) UNIX tty driver doesn't xmit * control D's. */ case CTRL(d): /* * Newline. Problem is that UNIX will expand * this to CRLF. */ case '\n': xp = onrow ? cursor_down : cursor_right; if (onrow && xp && op < lines-1 && cursor_up) { op += 2; xp = cursor_up; } if (xp && instring == cursor_address) { strcat(added, xp); op--; } break; /* * Tab used to be in this group too, * because UNIX might expand it to blanks. * We now require that this tab mode be turned * off by any program using this routine, * or using termcap in general, since some * terminals use tab for other stuff, like * nondestructive space. (Filters like ul * or vcrt will lose, since they can't stty.) * Tab was taken out to get the Ann Arbor * 4080 to work. */ } *outp++ = op; (void) pop(); break; case 'l': xp = (char *) pop(); push(strlen(xp)); break; case 's': xp = (char *) pop(); while (*xp) *outp++ = *xp++; break; case '%': *outp++ = c; break; /* * %i: shorthand for increment first two parms. * Useful for terminals that start numbering from * one instead of zero (like ANSI terminals). */ case 'i': p1++; p2++; break; /* %pi: push the ith parameter */ case 'p': switch (c = *cp++) { case '1': push(p1); break; case '2': push(p2); break; case '3': push(p3); break; case '4': push(p4); break; case '5': push(p5); break; case '6': push(p6); break; case '7': push(p7); break; case '8': push(p8); break; case '9': push(p9); break; default: return _err("bad parm number"); } onrow = (c == '1'); break; /* %Pi: pop from stack into variable i (a-z) */ case 'P': vars[*cp++ - 'a'] = pop(); break; /* %gi: push variable i (a-z) */ case 'g': push(vars[*cp++ - 'a']); break; /* %'c' : character constant */ case '\'': push(*cp++); if (*cp++ != '\'') return _err("missing closing quote"); break; /* %{nn} : integer constant. */ case '{': op = 0; sign = 1; if (*cp == '-') { sign = -1; cp++; } else if (*cp == '+') cp++; while ((c = *cp++) >= '0' && c <= '9') { op = 10*op + c - '0'; } if (c != '}') return _err("missing closing brace"); push(sign * op); break; /* binary operators */ case '+': c=pop(); op=pop(); push(op + c); break; case '-': c=pop(); op=pop(); push(op - c); break; case '*': c=pop(); op=pop(); push(op * c); break; case '/': c=pop(); op=pop(); push(op / c); break; case 'm': c=pop(); op=pop(); push(op % c); break; /* %m: mod */ case '&': c=pop(); op=pop(); push(op & c); break; case '|': c=pop(); op=pop(); push(op | c); break; case '^': c=pop(); op=pop(); push(op ^ c); break; case '=': c=pop(); op=pop(); push(op = c); break; case '>': c=pop(); op=pop(); push(op > c); break; case '<': c=pop(); op=pop(); push(op < c); break; /* Unary operators. */ case '!': stack[top] = !stack[top]; break; case '~': stack[top] = ~stack[top]; break; /* Sorry, no unary minus, because minus is binary. */ /* * If-then-else. Implemented by a low level hack of * skipping forward until the match is found, counting * nested if-then-elses. */ case '?': /* IF - just a marker */ break; case 't': /* THEN - branch if false */ if (!pop()) cp = _branchto(cp, 'e'); break; case 'e': /* ELSE - branch to ENDIF */ cp = _branchto(cp, ';'); break; case ';': /* ENDIF - just a marker */ break; default: return _err("bad % sequence"); } } #ifdef tparmdebug printf("part a: '"); _prstr(result); printf("', len %d, part b: '", outp-result); _prstr(added); printf("'\n"); #endif strcpy(outp, added); return (result); } static char * _err(msg) char *msg; { #ifdef tparmdebug write(2,"tparm: ", 7); write(2, msg, strlen(msg)); write(2, "\r\n", 2); #endif return 0; } char * _branchto(cp, to) register char *cp; char to; { register int level = 0; register char c; while (c = *cp++) { if (c == '%') { if ((c = *cp++) == to || c == ';') { if (level == 0) { return cp; } } if (c == '?') level++; if (c == ';') level--; } } return _err("no matching ENDIF"); } E 1 h50128 s 00001/00001/00102 d D 3.2 87/05/13 19:14:33 build 4 3 c removed old SCCS strings and inserted #ident BB e s 00000/00000/00103 d D 3.1 87/01/20 18:52:44 mkm 3 2 c e s 00000/00000/00103 d D 2.1 87/01/20 18:43:23 mkm 2 1 c e s 00103/00000/00000 d D 1.1 87/01/20 18:33:29 mkm 1 0 c Placed under source control - mkm e u U f b f n t T I 1 D 4 /* " %W% %E% " */ E 4 I 4 #ident " %W% %E% " E 4 /* Copyright (c) 1979 Regents of the University of California */ #include #include "curses.h" #include "term.h" #ifdef NONSTANDARD # include "ns_curses.h" #endif /* * Put the character string cp out, with padding. * The number of affected lines is affcnt, and the routine * used to output one character is outc. */ tputs(cp, affcnt, outc) register char *cp; int affcnt; int (*outc)(); { /* static (11 cc gripes) */ char *_tpad(); if (cp == 0) return; /* * The guts of the string. */ while (*cp) if (*cp == '$' && cp[1] == '<') cp = _tpad(cp, affcnt, outc); else (*outc)(*cp++); } static char * _tpad(cp, affcnt, outc) register char *cp; int affcnt; int (*outc)(); { register int delay = 0; register int mspc10; register char *icp = cp; /* Eat initial $< */ cp += 2; /* * Convert the number representing the delay. */ if (isdigit(*cp)) { do delay = delay * 10 + *cp++ - '0'; while (isdigit(*cp)); } delay *= 10; if (*cp == '.') { cp++; if (isdigit(*cp)) delay += *cp - '0'; /* * Only one digit to the right of the decimal point. */ while (isdigit(*cp)) cp++; } /* * If the delay is followed by a `*', then * multiply by the affected lines count. */ if (*cp == '*') cp++, delay *= affcnt; if (*cp == '>') cp++; /* Eat trailing '>' */ else { /* * We got a "$<" with no ">". This is usually caused by * a cursor addressing sequence that happened to generate * $<. To avoid an infinite loop, we output the $ here * and pass back the rest. */ (*outc)(*icp++); return icp; } /* * If no delay needed, or output speed is * not comprehensible, then don't try to delay. */ if (delay == 0) return cp; /* * Let handshaking take care of it - no extra cpu load from pads. * Also, this will be more optimal since the pad info is usually * worst case. We only use padding info for such terminals to * estimate the cost of a capability in choosing the cheapest one. */ if (xon_xoff) return cp; (void) _delay(delay, outc); return cp; } E 1 h48355 s 00001/00001/00026 d D 3.2 87/05/13 19:14:45 build 4 3 c removed old SCCS strings and inserted #ident BB e s 00000/00000/00027 d D 3.1 87/01/20 18:52:46 mkm 3 2 c e s 00000/00000/00027 d D 2.1 87/01/20 18:43:24 mkm 2 1 c e s 00027/00000/00000 d D 1.1 87/01/20 18:33:30 mkm 1 0 c Placed under source control - mkm e u U f b f n t T I 1 D 4 /* " %W% %E% " */ E 4 I 4 #ident " %W% %E% " E 4 #include "curses.ext" traceon() { #ifdef DEBUG if (outf == NULL) { outf = fopen("trace", "a"); if (outf == NULL) { perror("trace"); exit(-1); } fprintf(outf, "trace turned on\n"); } #endif } traceoff() { #ifdef DEBUG if (outf != NULL) { fprintf(outf, "trace turned off\n"); fclose(outf); outf = NULL; } #endif } E 1 h47838 s 00001/00001/00025 d D 3.2 87/05/13 19:14:57 build 4 3 c removed old SCCS strings and inserted #ident BB e s 00000/00000/00026 d D 3.1 87/01/20 18:52:47 mkm 3 2 c e s 00000/00000/00026 d D 2.1 87/01/20 18:43:26 mkm 2 1 c e s 00026/00000/00000 d D 1.1 87/01/20 18:33:31 mkm 1 0 c Placed under source control - mkm e u U f b f n t T I 1 D 4 /* " %W% %E% " */ E 4 I 4 #ident " %W% %E% " E 4 # include # ifdef SIGTSTP # include "curses.ext" /* * handle stop and start signals * */ _tstp() { # ifdef DEBUG if (outf) fflush(outf); # endif _ll_move(lines-1, 0); endwin(); fflush(stdout); kill(0, SIGTSTP); signal(SIGTSTP, _tstp); fixterm(); SP->doclear = 1; wrefresh(curscr); } # endif E 1 h34893 s 00001/00001/00003 d D 3.2 87/05/13 19:15:07 build 4 3 c removed old SCCS strings and inserted #ident BB e s 00000/00000/00004 d D 3.1 87/01/20 18:52:48 mkm 3 2 c e s 00000/00000/00004 d D 2.1 87/01/20 18:43:28 mkm 2 1 c e s 00004/00000/00000 d D 1.1 87/01/20 18:33:32 mkm 1 0 c Placed under source control - mkm e u U f b f n t T I 1 D 4 /* " %W% %E% " */ E 4 I 4 #ident " %W% %E% " E 4 /* Make a 2 letter code into an integer we can switch on easily */ #define two( s1, s2 ) (s1 + 256 * s2 ) #define twostr( str ) two( *str, str[ 1 ] ) E 1 h37327 s 00001/00001/00011 d D 3.2 87/05/13 19:15:22 build 4 3 c removed old SCCS strings and inserted #ident BB e s 00000/00000/00012 d D 3.1 87/01/20 18:52:50 mkm 3 2 c e s 00000/00000/00012 d D 2.1 87/01/20 18:43:30 mkm 2 1 c e s 00012/00000/00000 d D 1.1 87/01/20 18:33:33 mkm 1 0 c Placed under source control - mkm e u U f b f n t T I 1 D 4 /* " %W% %E% " */ E 4 I 4 #ident " %W% %E% " E 4 #include "curses.ext" /* * Set the file descriptor for typeahead checks to fd. fd can be -1 * to disable the checking. */ typeahead(fd) int fd; { SP->check_fd = fd; } E 1 h64869 s 00001/00001/00018 d D 3.2 87/05/13 19:15:33 build 4 3 c removed old SCCS strings and inserted #ident BB e s 00000/00000/00019 d D 3.1 87/01/20 18:52:52 mkm 3 2 c e s 00000/00000/00019 d D 2.1 87/01/20 18:43:31 mkm 2 1 c e s 00019/00000/00000 d D 1.1 87/01/20 18:33:35 mkm 1 0 c Placed under source control - mkm e u U f b f n t T I 1 D 4 /* " %W% %E% " */ E 4 I 4 #ident " %W% %E% " E 4 /* * define unctrl codes for each character * */ /* LINTLIBRARY */ char *_unctrl[] = { /* unctrl codes for ttys */ "^@", "^A", "^B", "^C", "^D", "^E", "^F", "^G", "^H", "^I", "^J", "^K", "^L", "^M", "^N", "^O", "^P", "^Q", "^R", "^S", "^T", "^U", "^V", "^W", "^X", "^Y", "^Z", "^[", "^\\", "^]", "^~", "^_", " ", "!", "\"", "#", "$", "%", "&", "'", "(", ")", "*", "+", ",", "-", ".", "/", "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", ":", ";", "<", "=", ">", "?", "@", "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z", "[", "\\", "]", "^", "_", "`", "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z", "{", "|", "}", "~", "^?" }; E 1 h34382 s 00001/00001/00034 d D 3.2 87/05/13 19:15:45 build 4 3 c removed old SCCS strings and inserted #ident BB e s 00000/00000/00035 d D 3.1 87/01/20 18:52:53 mkm 3 2 c e s 00000/00000/00035 d D 2.1 87/01/20 18:43:32 mkm 2 1 c e s 00035/00000/00000 d D 1.1 87/01/20 18:33:36 mkm 1 0 c Placed under source control - mkm e u U f b f n t T I 1 D 4 /* " %W% %E% " */ E 4 I 4 #ident " %W% %E% " E 4 /* * Local configuration of various files. Used if you can't put these * things in the standard places or aren't the super user, so you * don't have to modify the source files. Thus, you can install updates * without having to re-localize your sources. */ /* Path to library files */ #define libpath(file) "/usr/lib/file" /* Path to local library files */ #define loclibpath(file) "/usr/lib/file" /* Path to binaries */ #define binpath(file) "/usr/bin/file" /* Path to things under /usr (e.g. /usr/preserve) */ #define usrpath(file) "/usr/file" /* Location of termcap file */ #define E_TERMCAP "/etc/termcap" /* Location of terminfo source file */ #define E_TERMINFO "./terminfo.src" /* Location of terminfo binary directory tree */ #define termpath(file) "/usr/lib/terminfo/file" /* Location of the C shell */ #define B_CSH "/bin/sh" /* Location of temporary files */ #define TMPDIR "/usr/tmp" E 1 h62918 s 00001/00001/00020 d D 3.2 87/05/13 19:15:58 build 4 3 c removed old SCCS strings and inserted #ident BB e s 00000/00000/00021 d D 3.1 87/01/20 18:52:56 mkm 3 2 c e s 00000/00000/00021 d D 2.1 87/01/20 18:43:34 mkm 2 1 c e s 00021/00000/00000 d D 1.1 87/01/20 18:33:36 mkm 1 0 c Placed under source control - mkm e u U f b f n t T I 1 D 4 /* " %W% %E% " */ E 4 I 4 #ident " %W% %E% " E 4 /* * Handy function to put out a string with padding. * It makes two assumptions: * (1) Output is via stdio to stdout through putchar. * (2) There is no count of affected lines. Thus, this * routine is only valid for certain capabilities, * i.e. those that don't have *'s in the documentation. */ #include extern int _outchar(); /* * Handy way to output video attributes. */ vidattr(newmode) int newmode; { vidputs(newmode, _outchar); } E 1 h29246 s 00001/00001/00118 d D 3.2 87/05/13 19:16:10 build 4 3 c removed old SCCS strings and inserted #ident BB e s 00000/00000/00119 d D 3.1 87/01/20 18:52:57 mkm 3 2 c e s 00000/00000/00119 d D 2.1 87/01/20 18:43:36 mkm 2 1 c e s 00119/00000/00000 d D 1.1 87/01/20 18:33:38 mkm 1 0 c Placed under source control - mkm e u U f b f n t T I 1 D 4 /* " %W% %E% " */ E 4 I 4 #ident " %W% %E% " E 4 #include "curses.ext" static int oldmode = 0; /* This really should be in the struct term */ char *tparm(); /* nooff: modes that don't have an explicit "turn me off" capability */ #define nooff (A_PROTECT|A_INVIS|A_BOLD|A_DIM|A_BLINK|A_REVERSE) /* hilite: modes that could be faked with standout in a pinch. */ #define hilite (A_UNDERLINE|A_BOLD|A_DIM|A_BLINK|A_REVERSE) vidputs(newmode, outc) int newmode; int (*outc)(); { int curmode = oldmode; #ifdef DEBUG if (outf) fprintf(outf, "vidputs oldmode=%o, newmode=%o\n", oldmode, newmode); #endif if (newmode || !exit_attribute_mode) { if (set_attributes) { tputs(tparm(set_attributes, newmode & A_STANDOUT, newmode & A_UNDERLINE, newmode & A_REVERSE, newmode & A_BLINK, newmode & A_DIM, newmode & A_BOLD, newmode & A_INVIS, newmode & A_PROTECT, newmode & A_ALTCHARSET), 1, outc); curmode = newmode; } else { if ((oldmode&nooff) > (newmode&nooff)) { if (exit_attribute_mode) { tputs(exit_attribute_mode, 1, outc); } else if (oldmode == A_UNDERLINE && exit_underline_mode) { tputs(exit_underline_mode, 1, outc); } else if (exit_standout_mode) { tputs(exit_standout_mode, 1, outc); } curmode = oldmode = 0; } if ((newmode&A_ALTCHARSET) && !(oldmode&A_ALTCHARSET)) { tputs(enter_alt_charset_mode, 1, outc); curmode |= A_ALTCHARSET; } if (!(newmode&A_ALTCHARSET) && (oldmode&A_ALTCHARSET)) { tputs(exit_alt_charset_mode, 1, outc); curmode &= ~A_ALTCHARSET; } if ((newmode&A_PROTECT) && !(oldmode&A_PROTECT)) { tputs(enter_protected_mode, 1, outc); curmode |= A_PROTECT; } if ((newmode&A_INVIS) && !(oldmode&A_INVIS)) { tputs(enter_secure_mode, 1, outc); curmode |= A_INVIS; } if ((newmode&A_BOLD) && !(oldmode&A_BOLD)) if (enter_bold_mode) { curmode |= A_BOLD; tputs(enter_bold_mode, 1, outc); } if ((newmode&A_DIM) && !(oldmode&A_DIM)) if (enter_dim_mode) { curmode |= A_DIM; tputs(enter_dim_mode, 1, outc); } if ((newmode&A_BLINK) && !(oldmode&A_BLINK)) if (enter_blink_mode) { curmode |= A_BLINK; tputs(enter_blink_mode, 1, outc); } if ((newmode&A_REVERSE) && !(oldmode&A_REVERSE)) if (enter_reverse_mode) { curmode |= A_REVERSE; tputs(enter_reverse_mode, 1, outc); } if ((newmode&A_UNDERLINE) && !(oldmode&A_UNDERLINE)) if (enter_underline_mode) { curmode |= A_UNDERLINE; tputs(enter_underline_mode,1,outc); } if (!(newmode&A_UNDERLINE) && (oldmode&A_UNDERLINE)) { tputs(exit_underline_mode, 1, outc); curmode &= ~A_UNDERLINE; } if ((newmode&A_STANDOUT) && !(oldmode&A_STANDOUT)) if (enter_standout_mode) { curmode |= A_STANDOUT; tputs(enter_standout_mode,1,outc); } if (!(newmode&A_STANDOUT) && (oldmode&A_STANDOUT)) { tputs(exit_standout_mode, 1, outc); curmode &= ~A_STANDOUT; } } } else { if (exit_attribute_mode) tputs(exit_attribute_mode, 1, outc); else if (oldmode == A_UNDERLINE && exit_underline_mode) tputs(exit_underline_mode, 1, outc); else if (exit_standout_mode) tputs(exit_standout_mode, 1, outc); curmode = 0; } /* * If we asked for bold, say, on a terminal with only standout, * and we aren't already in standout, we settle for standout. */ if ((newmode&hilite) && curmode!=newmode && (curmode&A_STANDOUT)==0) { tputs(enter_standout_mode, 1, outc); curmode |= A_STANDOUT; } oldmode = curmode; } E 1 h59051 s 00001/00001/00023 d D 3.2 87/05/13 19:16:21 build 4 3 c removed old SCCS strings and inserted #ident BB e s 00000/00000/00024 d D 3.1 87/01/20 18:52:59 mkm 3 2 c e s 00000/00000/00024 d D 2.1 87/01/20 18:43:39 mkm 2 1 c e s 00024/00000/00000 d D 1.1 87/01/20 18:33:39 mkm 1 0 c Placed under source control - mkm e u U f b f n t T I 1 D 4 /* " %W% %E% " */ E 4 I 4 #ident " %W% %E% " E 4 /*LINTLIBRARY*/ #include #include #define MAXINT 32767 extern int _doprnt(); int vsprintf(string, format, ap) char *string, *format; va_list ap; { register int count; FILE siop; siop._cnt = MAXINT; siop._file = _NFILE; siop._flag = _IOWRT; siop._base = siop._ptr = (unsigned char *)string; count = _doprnt(format, ap, &siop); *siop._ptr = '\0'; /* plant terminating null character */ return(count); } E 1 h53346 s 00001/00001/00021 d D 3.2 87/05/13 19:16:33 build 4 3 c removed old SCCS strings and inserted #ident BB e s 00000/00000/00022 d D 3.1 87/01/20 18:53:01 mkm 3 2 c e s 00000/00000/00022 d D 2.1 87/01/20 18:43:40 mkm 2 1 c e s 00022/00000/00000 d D 1.1 87/01/20 18:33:40 mkm 1 0 c Placed under source control - mkm e u U f b f n t T I 1 D 4 /* " %W% %E% " */ E 4 I 4 #ident " %W% %E% " E 4 #include #include /* * This routine implements vsscanf (nonportably) until such time * as one is available in the system (if ever). */ vsscanf(buf, fmt, ap) char *buf; char *fmt; va_list ap; { FILE junk; junk._flag = _IOREAD; junk._file = -1; junk._base = junk._ptr = buf; junk._cnt = strlen(buf); return _doscan(&junk, fmt, ap); } E 1 h42638 s 00001/00001/00019 d D 3.2 87/05/13 19:16:45 build 4 3 c removed old SCCS strings and inserted #ident BB e s 00000/00000/00020 d D 3.1 87/01/20 18:53:03 mkm 3 2 c e s 00000/00000/00020 d D 2.1 87/01/20 18:43:42 mkm 2 1 c e s 00020/00000/00000 d D 1.1 87/01/20 18:33:41 mkm 1 0 c Placed under source control - mkm e u U f b f n t T I 1 D 4 /* " %W% %E% " */ E 4 I 4 #ident " %W% %E% " E 4 /* */ # include "curses.ext" /* * Turn off selected attributes. */ wattroff(win, attrs) register WINDOW *win; int attrs; { #ifdef DEBUG if(outf) fprintf(outf, "WATTRON(%x, %o)\n", win, attrs); #endif win->_attrs &= ~attrs; return 1; } E 1 h42416 s 00001/00001/00019 d D 3.2 87/05/13 19:16:57 build 4 3 c removed old SCCS strings and inserted #ident BB e s 00000/00000/00020 d D 3.1 87/01/20 18:53:04 mkm 3 2 c e s 00000/00000/00020 d D 2.1 87/01/20 18:43:43 mkm 2 1 c e s 00020/00000/00000 d D 1.1 87/01/20 18:33:42 mkm 1 0 c Placed under source control - mkm e u U f b f n t T I 1 D 4 /* " %W% %E% " */ E 4 I 4 #ident " %W% %E% " E 4 /* */ # include "curses.ext" /* * Turn on selected attributes. */ wattron(win, attrs) register WINDOW *win; int attrs; { #ifdef DEBUG if(outf) fprintf(outf, "WATTRON(%x, %o)\n", win, attrs); #endif win->_attrs |= attrs; return 1; } E 1 h42027 s 00001/00001/00019 d D 3.2 87/05/13 19:17:08 build 4 3 c removed old SCCS strings and inserted #ident BB e s 00000/00000/00020 d D 3.1 87/01/20 18:53:05 mkm 3 2 c e s 00000/00000/00020 d D 2.1 87/01/20 18:43:46 mkm 2 1 c e s 00020/00000/00000 d D 1.1 87/01/20 18:33:43 mkm 1 0 c Placed under source control - mkm e u U f b f n t T I 1 D 4 /* " %W% %E% " */ E 4 I 4 #ident " %W% %E% " E 4 /* */ # include "curses.ext" /* * Set selected attributes. */ wattrset(win, attrs) register WINDOW *win; int attrs; { #ifdef DEBUG if(outf) fprintf(outf, "WATTRON(%x, %o)\n", win, attrs); #endif win->_attrs = attrs; return 1; } E 1 h19768 s 00001/00001/00094 d D 3.2 87/05/13 19:17:20 build 4 3 c removed old SCCS strings and inserted #ident BB e s 00000/00000/00095 d D 3.1 87/01/20 18:53:07 mkm 3 2 c e s 00000/00000/00095 d D 2.1 87/01/20 18:43:47 mkm 2 1 c e s 00095/00000/00000 d D 1.1 87/01/20 18:33:45 mkm 1 0 c Placed under source control - mkm e u U f b f n t T I 1 D 4 /* " %W% %E% " */ E 4 I 4 #ident " %W% %E% " E 4 /* * make the current screen look like "win" over the area covered by * win. * */ #include "curses.ext" extern WINDOW *lwin; /* Put out window but don't actually update screen. */ wnoutrefresh(win) register WINDOW *win; { register int wy, y; register chtype *nsp, *lch; # ifdef DEBUG if( win == stdscr ) { if(outf) fprintf(outf, "REFRESH(stdscr %x)", win); } else { if( win == curscr ) { if(outf) fprintf(outf, "REFRESH(curscr %x)", win); } else { if(outf) fprintf(outf, "REFRESH(%d)", win); } } if(outf) fprintf(outf, " (win == curscr) = %d, maxy %d\n", win, (win == curscr), win->_maxy); if( win != curscr ) { _dumpwin( win ); } if(outf) fprintf(outf, "REFRESH:\n\tfirstch\tlastch\n"); # endif DEBUG /* * initialize loop parameters */ if( win->_clear || win == curscr || SP->doclear ) { # ifdef DEBUG if (outf) fprintf(outf, "refresh clears, win->_clear %d, curscr %d\n", win->_clear, win == curscr); # endif DEBUG SP->doclear = 1; win->_clear = FALSE; if( win != curscr ) { touchwin( win ); } } if( win == curscr ) { #ifdef DEBUG if(outf) fprintf(outf, "Calling _ll_refresh(FALSE)\n" ); #endif DEBUG _ll_refresh(FALSE); return OK; } #ifdef DEBUG if(outf) fprintf(outf, "Didn't do _ll_refresh(FALSE)\n" ); #endif DEBUG for( wy = 0; wy < win->_maxy; wy++ ) { if( win->_firstch[wy] != _NOCHANGE ) { y = wy + win->_begy; lch = &win->_y[wy][win->_maxx-1]; nsp = &win->_y[wy][0]; _ll_move(y, win->_begx); while( nsp <= lch ) { if( SP->virt_x++ < columns ) { *SP->curptr++ = *nsp++; } else { break; } } win->_firstch[wy] = _NOCHANGE; } } lwin = win; return OK; } E 1 h43697 s 00001/00001/00018 d D 3.2 87/05/13 19:17:32 build 4 3 c removed old SCCS strings and inserted #ident BB e s 00000/00000/00019 d D 3.1 87/01/20 18:53:09 mkm 3 2 c e s 00000/00000/00019 d D 2.1 87/01/20 18:43:50 mkm 2 1 c e s 00019/00000/00000 d D 1.1 87/01/20 18:33:46 mkm 1 0 c Placed under source control - mkm e u U f b f n t T I 1 D 4 /* " %W% %E% " */ E 4 I 4 #ident " %W% %E% " E 4 # include "curses.ext" # include /* * This routine implements a printf on the given window. */ /* VARARGS */ wprintw(win, fmt, va_alist) WINDOW *win; char *fmt; va_dcl { va_list ap; va_start(ap); return _sprintw(win, fmt, ap); } E 1 h41495 s 00001/00001/00015 d D 3.2 87/05/13 19:17:45 build 4 3 c removed old SCCS strings and inserted #ident BB e s 00000/00000/00016 d D 3.1 87/01/20 18:53:11 mkm 3 2 c e s 00000/00000/00016 d D 2.1 87/01/20 18:43:51 mkm 2 1 c e s 00016/00000/00000 d D 1.1 87/01/20 18:33:47 mkm 1 0 c Placed under source control - mkm e u U f b f n t T I 1 D 4 /* " %W% %E% " */ E 4 I 4 #ident " %W% %E% " E 4 /* * make the current screen look like "win" over the area covered by * win. * */ # include "curses.ext" /* Put out window and update screen */ wrefresh(win) WINDOW *win; { wnoutrefresh(win); return doupdate(); } E 1 h47647 s 00001/00001/00114 d D 3.2 87/05/13 19:17:57 build 4 3 c removed old SCCS strings and inserted #ident BB e s 00000/00000/00115 d D 3.1 87/01/20 18:53:12 mkm 3 2 c e s 00000/00000/00115 d D 2.1 87/01/20 18:43:52 mkm 2 1 c e s 00115/00000/00000 d D 1.1 87/01/20 18:33:48 mkm 1 0 c Placed under source control - mkm e u U f b f n t T I 1 D 4 /* " %W% %E% " */ E 4 I 4 #ident " %W% %E% " E 4 #include "curses.ext" char *tparm(); extern int _outch(); _writechars (start, end) register char *start, *end; { register int c; register char *p; extern int didntdobotright; /* did not output char in corner */ #ifdef DEBUG if(outf) fprintf(outf, "_writechars(%d:'", end-start+1); if(outf) fwrite(start, sizeof (char), end-start+1, outf); if(outf) fprintf(outf, "').\n"); #endif DEBUG _setmode (); _sethl(); while( start <= end ) { #ifdef FULLDEBUG if(outf) fprintf(outf, "wc loop: repeat_char '%s', SP->phys_irm %d, *start '%c'\n", repeat_char, SP->phys_irm, *start); #endif FULLDEBUG if (repeat_char && SP->phys_irm != 1 && ((p=start+1),*start==*p++) && (*start==*p++) && (*start==*p++) && (*start==*p++) && p<=end) { /* We have a run of at least 5 characters */ c = 5; while (p <= end && *start == *p++) c++; SP->phys_x += c; /* Don't assume anything about how repeat and auto * margins interact. The concept is different. */ while (SP->phys_x >= columns-1 && auto_right_margin) { c--; p--; SP->phys_x--; } #ifdef DEBUG if(outf) fprintf(outf, "using repeat, count %d, char '%c'\n", c, *start); #endif DEBUG tputs(tparm(repeat_char, *start, c), c, _outch); start = p-1; if (*start == start[-1]) start++; continue; } c = *start++; #ifdef DEBUG if (outf) fprintf(outf, "c is '%c', phys_x %d, phys_y %d\n", c, SP->phys_x, SP->phys_y); #endif DEBUG if(SP->phys_irm == 1 && insert_character) { tputs(insert_character, columns-SP->phys_x, _outch); } /* * If transparent_underline && !erase_overstrike, * should probably do clr_eol. No such terminal yet. */ if(transparent_underline && erase_overstrike && c == '_' && SP->phys_irm != 1) { _outch (' '); tputs(cursor_left, 1, _outch); } if( ++SP->phys_x >= columns && auto_right_margin ) { /* Have to on c100 anyway..*/ if( SP->phys_y >= lines-1 /*&& !eat_newline_glitch*/ ) { /* * We attempted to put something in the last * position of the last line. Since this will * cause a scroll (we only get here if the * terminal has auto_right_margin) we refuse * to put it out. */ #ifdef DEBUG if(outf) fprintf(outf,"Avoiding lower right corner\n"); #endif didntdobotright = 1; SP->phys_x--; return; } SP->phys_x = 0; SP->phys_y++; } if( tilde_glitch && c == '~' ) { _outch('`'); } else { _outch (c); } /* Only 1 line can be affected by insert char here */ if( SP->phys_irm == 1 && insert_padding ) { tputs(insert_padding, 1, _outch); } if( eat_newline_glitch && SP->phys_x == 0 ) { /* * This handles both C100 and VT100, which are * different. We don't output carriage_return * and cursor_down because it might confuse a * terminal that is looking for return and linefeed. */ _outch('\r'); _outch('\n'); } } } E 1 h43568 s 00001/00001/00020 d D 3.2 87/05/13 19:18:09 build 4 3 c removed old SCCS strings and inserted #ident BB e s 00000/00000/00021 d D 3.1 87/01/20 18:53:15 mkm 3 2 c e s 00000/00000/00021 d D 2.1 87/01/20 18:43:54 mkm 2 1 c e s 00021/00000/00000 d D 1.1 87/01/20 18:33:49 mkm 1 0 c Placed under source control - mkm e u U f b f n t T I 1 D 4 /* " %W% %E% " */ E 4 I 4 #ident " %W% %E% " E 4 /* */ # include "curses.ext" # include /* * This routine implements a scanf on the given window. */ /* VARARGS */ wscanw(win, fmt, va_alist) WINDOW *win; char *fmt; va_dcl { va_list ap; va_start(ap); return __sscans(win, fmt, ap); } E 1 h38712 s 00001/00001/00018 d D 3.2 87/05/13 19:18:20 build 4 3 c removed old SCCS strings and inserted #ident BB e s 00000/00000/00019 d D 3.1 87/01/20 18:53:16 mkm 3 2 c e s 00000/00000/00019 d D 2.1 87/01/20 18:43:56 mkm 2 1 c e s 00019/00000/00000 d D 1.1 87/01/20 18:33:50 mkm 1 0 c Placed under source control - mkm e u U f b f n t T I 1 D 4 /* " %W% %E% " */ E 4 I 4 #ident " %W% %E% " E 4 /* */ # include "curses.ext" /* * exit standout mode */ wstandend(win) register WINDOW *win; { #ifdef DEBUG if(outf) fprintf(outf, "WSTANDEND(%x)\n", win); #endif win->_attrs = 0; return 1; } E 1 h39746 s 00001/00001/00018 d D 3.2 87/05/13 19:18:31 build 4 3 c removed old SCCS strings and inserted #ident BB e s 00000/00000/00019 d D 3.1 87/01/20 18:53:18 mkm 3 2 c e s 00000/00000/00019 d D 2.1 87/01/20 18:43:57 mkm 2 1 c e s 00019/00000/00000 d D 1.1 87/01/20 18:33:51 mkm 1 0 c Placed under source control - mkm e u U f b f n t T I 1 D 4 /* " %W% %E% " */ E 4 I 4 #ident " %W% %E% " E 4 /* */ # include "curses.ext" /* * enter standout mode */ wstandout(win) register WINDOW *win; { #ifdef DEBUG if(outf) fprintf(outf, "WSTANDOUT(%x)\n", win); #endif win->_attrs |= A_STANDOUT; return 1; } E 1 #ident " @(#)curshdr.h 3.2 87/05/13 " /*LINTLIBRARY*/ /* * IC and IL overheads and costs should be set to this * value if the corresponding feature is missing */ #define INFINITY 500 struct line { int hash; /* hash value for this line, 0 if not known */ struct line *next; /* pointer to the next line in list of lines */ short bodylen; /* the cost of redrawing this line */ short length; /* the number of valid characters in line */ chtype *body; /* the actual text of the line */ }; struct costs { short Cursor_address; short Cursor_home; short Carriage_return; short Tab; short Back_tab; short Cursor_left; short Cursor_right; /* current cost, which is 1 unless in insert * mode, since you can just output the * character you want to move over */ short Right_base; /* actual cost to do cursor_right */ short Cursor_down; short Cursor_up; short Parm_left_cursor; short Parm_right_cursor; short Parm_up_cursor; short Parm_down_cursor; short Column_address; short Row_address; unsigned ilvar; /* Insert line varying part * 32 */ int ilfixed; /* Insert line fixed overhead */ unsigned dlvar; /* Delete line varying part * 32 */ int dlfixed; /* Delete line fixed overhead */ unsigned icvar; /* Insert char varying part * 32 */ int icfixed; /* Insert char fixed overhead */ unsigned dcvar; /* Delete char varying part * 32 */ int dcfixed; /* Delete char fixed overhead */ /* Should have costs for delete char/delete line here too. */ }; #define _cost(field) (SP->term_costs.field) struct map { char label[16]; /* Text the key is labelled with */ char sends[16]; /* Characters sent when key is pressed */ short keynum; /* "char" we pass back to program */ }; struct screen { unsigned fl_nonl : 1; /* we shouldn't output \n */ unsigned fl_uppercase : 1; /* upper case terminal */ unsigned fl_normtty : 1; /* currently in normal tty mode */ unsigned fl_my_term : 1; /* user names his terminal type */ unsigned fl_echoit : 1; /* in software echo mode */ unsigned fl_rawmode : 1; /* in raw or cbreak mode */ unsigned fl_endwin : 1; /* has called endwin */ unsigned phys_irm : 1; /* physically in insert char mode */ unsigned virt_irm : 1; /* want to be in insert char mode */ unsigned fl_nodelay : 1; /* tty is in nodelay mode */ struct line **cur_body; /* physical screen image */ struct line **std_body; /* desired screen image */ struct line *freelist; /* free space list */ short phys_x; /* physical cursor X position */ short phys_y; /* physical cursor Y position */ short virt_x; /* virtual cursor X position */ short virt_y; /* virtual cursor Y position */ short phys_top_mgn; /* physical top margin of scrolling region */ short phys_bot_mgn; /* physical bottom margin of scrolling region */ short des_top_mgn; /* desired top margin of scrolling region */ short des_bot_mgn; /* desired bottom margin of scrolling region */ chtype *curptr; /* pointer to cursor */ chtype virt_gr; /* desired highlight state */ chtype phys_gr; /* current highlight state */ short winsize; /* no. of lines on which ID operations done */ short doclear; /* flag to say whether screen garbaged */ short baud; /* baud rate of this tty */ short check_input; /* flag for input check */ short check_fd; /* file descriptor for input check */ struct _win_st *std_scr;/* primary output screen */ struct _win_st *cur_scr;/* what's physically on the screen */ struct term *tcap; /* TERMCAP strings and storage space */ struct costs term_costs;/* costs of various capabilities */ short kp_state; /* 1 iff keypad is on, else 0 */ short ml_above; /* # memory lines above top of screen */ #ifndef NONSTANDARD SGTTY save_tty_buf; /* current state of this tty */ FILE *term_file; /* File to write on for output. */ #endif NONSTANDARD #ifdef KEYPAD struct map *kp; /* keypad map */ #endif KEYPAD short *input_queue; /* a place to put stuff ungetc'ed */ FILE *input_file; /* Where to get keyboard input */ }; #ifndef NONSTANDARD extern struct screen *SP; #endif #ifdef DEBUG extern FILE *outf; #endif /* * External variables for the library * * " @(#)curses.ext 3.1 87/01/20 " */ /* LINTLIBRARY */ # define CURSES /* We are internal to curses */ # ifdef NONSTANDARD # include "RecStruct.h" # include "VTio.h" # endif ITC # include # include # include "curshdr.h" #ident " @(#)uparm.h 3.2 87/05/13 " /* * Local configuration of various files. Used if you can't put these * things in the standard places or aren't the super user, so you * don't have to modify the source files. Thus, you can install updates * without having to re-localize your sources. */ /* Path to library files */ #define libpath(file) "/usr/lib/file" /* Path to local library files */ #define loclibpath(file) "/usr/lib/file" /* Path to binaries */ #define binpath(file) "/usr/bin/file" /* Path to things under /usr (e.g. /usr/preserve) */ #define usrpath(file) "/usr/file" /* Location of termcap file */ #define E_TERMCAP "/etc/termcap" /* Location of terminfo source file */ #define E_TERMINFO "./terminfo.src" /* Location of terminfo binary directory tree */ #define termpath(file) "/usr/lib/terminfo/file" /* Location of the C shell */ #define B_CSH "/bin/sh" /* Location of temporary files */ #define TMPDIR "/usr/tmp" Symbols from libcurses.a[__cflush.o]: Name Value Class Type Size Line Section _SP |0x00000000|extern| | | | _fflush |0x00000000|extern| | | | ___cflush |0x00000008|extern| | | |.text Symbols from libcurses.a[__sscans.o]: Name Value Class Type Size Line Section _vsscanf |0x00000000|extern| | | | _wgetstr |0x00000000|extern| | | | ___sscans |0x00000008|extern| | | |.text Symbols from libcurses.a[_blanks.o]: Name Value Class Type Size Line Section _SP |0x00000000|extern| | | | __outch |0x00000000|extern| | | | __sethl |0x00000000|extern| | | | __setmode |0x00000000|extern| | | | _cur_term |0x00000000|extern| | | | _tparm |0x00000000|extern| | | | _tputs |0x00000000|extern| | | | __blanks |0x00000008|extern| | | |.text Symbols from libcurses.a[_c_clean.o]: Name Value Class Type Size Line Section _SP |0x00000000|extern| | | | __hlmode |0x00000000|extern| | | | __kpmode |0x00000000|extern| | | | __outch |0x00000000|extern| | | | __syncmodes |0x00000000|extern| | | | __window |0x00000000|extern| | | | _cur_term |0x00000000|extern| | | | _tputs |0x00000000|extern| | | | __c_clean |0x00000008|extern| | | |.text Symbols from libcurses.a[_clearhl.o]: Name Value Class Type Size Line Section _SP |0x00000000|extern| | | | __sethl |0x00000000|extern| | | | __clearhl |0x00000008|extern| | | |.text Symbols from libcurses.a[_clearline.o]: Name Value Class Type Size Line Section _SP |0x00000000|extern| | | | __ll_move |0x00000000|extern| | | | __clearline |0x00000008|extern| | | |.text Symbols from libcurses.a[_comphash.o]: Name Value Class Type Size Line Section __comphash |0x00000008|extern| | | |.text Symbols from libcurses.a[_delay.o]: Name Value Class Type Size Line Section _cur_term |0x00000000|extern| | | | __delay |0x00000008|extern| | | |.text Symbols from libcurses.a[_delchars.o]: Name Value Class Type Size Line Section _SP |0x00000000|extern| | | | __outch |0x00000000|extern| | | | _cur_term |0x00000000|extern| | | | _strcmp |0x00000000|extern| | | | _tputs |0x00000000|extern| | | | __delchars |0x00000008|extern| | | |.text Symbols from libcurses.a[_dellines.o]: Name Value Class Type Size Line Section _SP |0x00000000|extern| | | | __outch |0x00000000|extern| | | | __pos |0x00000000|extern| | | | __setwind |0x00000000|extern| | | | _cur_term |0x00000000|extern| | | | _tparm |0x00000000|extern| | | | _tputs |0x00000000|extern| | | | __dellines |0x00000008|extern| | | |.text Symbols from libcurses.a[_dumpwin.o]: Name Value Class Type Size Line Section Symbols from libcurses.a[_ec_quit.o]: Name Value Class Type Size Line Section __iob |0x00000000|extern| | | | _exit |0x00000000|extern| | | | _fprintf |0x00000000|extern| | | | _reset_shell_mode |0x00000000|extern| | | | __ec_quit |0x00000008|extern| | | |.text Symbols from libcurses.a[_fixdelay.o]: Name Value Class Type Size Line Section _SP |0x00000000|extern| | | | __iob |0x00000000|extern| | | | _fcntl |0x00000000|extern| | | | __fixdelay |0x00000008|extern| | | |.text Symbols from libcurses.a[_forcehl.o]: Name Value Class Type Size Line Section _SP |0x00000000|extern| | | | __sethl |0x00000000|extern| | | | __forcehl |0x00000008|extern| | | |.text Symbols from libcurses.a[_hlmode.o]: Name Value Class Type Size Line Section _SP |0x00000000|extern| | | | __hlmode |0x00000008|extern| | | |.text Symbols from libcurses.a[_id_char.o]: Name Value Class Type Size Line Section _SP |0x00000000|extern| | | | __blanks |0x00000000|extern| | | | __chk_typeahead |0x00000000|extern| | | | __clreol |0x00000000|extern| | | | __delchars |0x00000000|extern| | | | __inschars |0x00000000|extern| | | | __insmode |0x00000000|extern| | | | __pos |0x00000000|extern| | | | __showstring |0x00000000|extern| | | | _cur_term |0x00000000|extern| | | | __id_char |0x00000008|extern| | | |.text Symbols from libcurses.a[_init_cost.o]: Name Value Class Type Size Line Section _SP |0x00000000|extern| | | | __cost_fn |0x00000000|extern| | | | _cur_term |0x00000000|extern| | | | _tparm |0x00000000|extern| | | | __init_costs |0x00000008|extern| | | |.text Symbols from libcurses.a[_inschars.o]: Name Value Class Type Size Line Section _SP |0x00000000|extern| | | | __outch |0x00000000|extern| | | | _cur_term |0x00000000|extern| | | | _tparm |0x00000000|extern| | | | _tputs |0x00000000|extern| | | | __inschars |0x00000008|extern| | | |.text Symbols from libcurses.a[_insmode.o]: Name Value Class Type Size Line Section _SP |0x00000000|extern| | | | __insmode |0x00000008|extern| | | |.text Symbols from libcurses.a[_kpmode.o]: Name Value Class Type Size Line Section _SP |0x00000000|extern| | | | __outch |0x00000000|extern| | | | _cur_term |0x00000000|extern| | | | _tputs |0x00000000|extern| | | | __kpmode |0x00000008|extern| | | |.text Symbols from libcurses.a[_line_free.o]: Name Value Class Type Size Line Section _SP |0x00000000|extern| | | | _cur_term |0x00000000|extern| | | | __line_free |0x00000008|extern| | | |.text Symbols from libcurses.a[_ll_move.o]: Name Value Class Type Size Line Section _SP |0x00000000|extern| | | | __line_alloc |0x00000000|extern| | | | _cur_term |0x00000000|extern| | | | __ll_move |0x00000008|extern| | | |.text Symbols from libcurses.a[_outch.o]: Name Value Class Type Size Line Section _SP |0x00000000|extern| | | | __flsbuf |0x00000000|extern| | | | __iob |0x00000000|extern| | | | _outchcount |0x00000004|extern| | | | __outch |0x00000008|extern| | | |.text Symbols from libcurses.a[_outchar.o]: Name Value Class Type Size Line Section __flsbuf |0x00000000|extern| | | | __iob |0x00000000|extern| | | | __outchar |0x00000008|extern| | | |.text Symbols from libcurses.a[_pos.o]: Name Value Class Type Size Line Section _SP |0x00000000|extern| | | | __clearhl |0x00000000|extern| | | | __outch |0x00000000|extern| | | | __setwind |0x00000000|extern| | | | __window |0x00000000|extern| | | | _cur_term |0x00000000|extern| | | | _mvcur |0x00000000|extern| | | | _tputs |0x00000000|extern| | | | __pos |0x00000008|extern| | | |.text Symbols from libcurses.a[_reset.o]: Name Value Class Type Size Line Section _SP |0x00000000|extern| | | | __outch |0x00000000|extern| | | | __setwind |0x00000000|extern| | | | _cur_term |0x00000000|extern| | | | _tputs |0x00000000|extern| | | | __reset |0x00000008|extern| | | |.text Symbols from libcurses.a[_scrdown.o]: Name Value Class Type Size Line Section _SP |0x00000000|extern| | | | __line_free |0x00000000|extern| | | | __pos |0x00000000|extern| | | | __scrollf |0x00000000|extern| | | | _cur_term |0x00000000|extern| | | | __scrdown |0x00000008|extern| | | |.text Symbols from libcurses.a[_scrollf.o]: Name Value Class Type Size Line Section _SP |0x00000000|extern| | | | __dellines |0x00000000|extern| | | | __outch |0x00000000|extern| | | | __pos |0x00000000|extern| | | | __setwind |0x00000000|extern| | | | _cur_term |0x00000000|extern| | | | _tputs |0x00000000|extern| | | | __scrollf |0x00000008|extern| | | |.text Symbols from libcurses.a[_sethl.o]: Name Value Class Type Size Line Section _SP |0x00000000|extern| | | | __outch |0x00000000|extern| | | | _cur_term |0x00000000|extern| | | | _vidputs |0x00000000|extern| | | | __sethl |0x00000008|extern| | | |.text Symbols from libcurses.a[_setmode.o]: Name Value Class Type Size Line Section _SP |0x00000000|extern| | | | __outch |0x00000000|extern| | | | _cur_term |0x00000000|extern| | | | _tputs |0x00000000|extern| | | | __setmode |0x00000008|extern| | | |.text Symbols from libcurses.a[_setwind.o]: Name Value Class Type Size Line Section _SP |0x00000000|extern| | | | __outch |0x00000000|extern| | | | _cur_term |0x00000000|extern| | | | _tparm |0x00000000|extern| | | | _tputs |0x00000000|extern| | | | __setwind |0x00000008|extern| | | |.text Symbols from libcurses.a[_shove.o]: Name Value Class Type Size Line Section _SP |0x00000000|extern| | | | _cur_term |0x00000000|extern| | | | __shove |0x00000008|extern| | | |.text Symbols from libcurses.a[_sprintw.o]: Name Value Class Type Size Line Section _vsprintf |0x00000000|extern| | | | _waddstr |0x00000000|extern| | | | __sprintw |0x00000008|extern| | | |.text Symbols from libcurses.a[_sputc.o]: Name Value Class Type Size Line Section Symbols from libcurses.a[_syncmodes.o]: Name Value Class Type Size Line Section __sethl |0x00000000|extern| | | | __setmode |0x00000000|extern| | | | __setwind |0x00000000|extern| | | | __syncmodes |0x00000008|extern| | | |.text Symbols from libcurses.a[_tscroll.o]: Name Value Class Type Size Line Section _touchwin |0x00000000|extern| | | | __tscroll |0x00000008|extern| | | |.text Symbols from libcurses.a[_window.o]: Name Value Class Type Size Line Section _SP |0x00000000|extern| | | | _cur_term |0x00000000|extern| | | | __window |0x00000008|extern| | | |.text Symbols from libcurses.a[addch.o]: Name Value Class Type Size Line Section __tscroll |0x00000000|extern| | | | __unctrl |0x00000000|extern| | | | _wclrtoeol |0x00000000|extern| | | | _wrefresh |0x00000000|extern| | | | _waddch |0x00000008|extern| | | |.text Symbols from libcurses.a[addstr.o]: Name Value Class Type Size Line Section _waddch |0x00000000|extern| | | | _waddstr |0x00000008|extern| | | |.text Symbols from libcurses.a[baudrate.o]: Name Value Class Type Size Line Section _SP |0x00000000|extern| | | | _baudrate |0x00000008|extern| | | |.text Symbols from libcurses.a[beep.o]: Name Value Class Type Size Line Section ___cflush |0x00000000|extern| | | | __outch |0x00000000|extern| | | | _cur_term |0x00000000|extern| | | | _tputs |0x00000000|extern| | | | _beep |0x00000008|extern| | | |.text Symbols from libcurses.a[box.o]: Name Value Class Type Size Line Section _touchwin |0x00000000|extern| | | | _box |0x00000008|extern| | | |.text Symbols from libcurses.a[capnames.o]: Name Value Class Type Size Line Section _boolnames |0x00000020|extern| | | |.data _boolcodes |0x00000078|extern| | | |.data _numnames |0x000000d0|extern| | | |.data _numcodes |0x000000f8|extern| | | |.data _strnames |0x00000120|extern| | | |.data _strcodes |0x00000368|extern| | | |.data Symbols from libcurses.a[cbreak.o]: Name Value Class Type Size Line Section _SP |0x00000000|extern| | | | _cur_term |0x00000000|extern| | | | _reset_prog_mode |0x00000000|extern| | | | _cbreak |0x00000008|extern| | | |.text Symbols from libcurses.a[chktypeahd.o]: Name Value Class Type Size Line Section __chk_typeahead |0x00000008|extern| | | |.text Symbols from libcurses.a[clear.o]: Name Value Class Type Size Line Section _curscr |0x00000000|extern| | | | _stdscr |0x00000000|extern| | | | _werase |0x00000000|extern| | | | _wclear |0x00000008|extern| | | |.text Symbols from libcurses.a[clearok.o]: Name Value Class Type Size Line Section _SP |0x00000000|extern| | | | _curscr |0x00000000|extern| | | | _clearok |0x00000008|extern| | | |.text Symbols from libcurses.a[clreolinln.o]: Name Value Class Type Size Line Section _SP |0x00000000|extern| | | | __blanks |0x00000000|extern| | | | __clearhl |0x00000000|extern| | | | __dellines |0x00000000|extern| | | | __outch |0x00000000|extern| | | | __pos |0x00000000|extern| | | | __setwind2jihgfedcba`_^]\[ZYXWVUTSRQPONMLKJIHGFEDCBA@?>=<;:9ls from libcurses.a[doprnt.o]: Name Value Class Type Size Line Section ___dpdummy__ |0x00000008|extern| | | |.text Symbols from libcurses.a[doscan.o]: Name Value Class Type Size Line Section ___dsdummy__ |0x00000008|extern| | | |.text Symbols from libcurses.a[doupdate.o]: Name Value Class Type Size Line Section _SP |0x00000000|extern| | | | __endwin |0x00000000|extern| | | | __fixdelay |0x00000000|extern| | | | __ll_move |0x00000000|extern| | | | __ll_refresh |0x00000000|extern| | | | __outch |0x00000000|extern| | | | _cur_term |0x00000000|extern| | | | _lwin |0x00000000|extern| | | | _reset_prog_mode |0x00000000|extern| | | | _stdscr |0x00000000|extern| | | | _tputs |0x00000000|extern| | | | _doupdate |0x00000008|extern| | | |.text Symbols from libcurses.a[draino.o]: Name Value Class Type Size Line Section _cur_term |0x00000000|extern| | | | _ioctl |0x00000000|extern| | | | _draino |0x00000008|extern| | | |.text Symbols from libcurses.a[echo.o]: Name Value Class Type Size Line Section _SP |0x00000000|extern| | | | _echo |0x00000008|extern| | | |.text Symbols from libcurses.a[endwin.o]: Name Value Class Type Size Line Section _SP |0x00000000|extern| | | | __c_clean |0x00000000|extern| | | | __endwin |0x00000000|extern| | | | __fixdelay |0x00000000|extern| | | | __iob |0x00000000|extern| | | | __outch |0x00000000|extern| | | | __pos |0x00000000|extern| | | | _cur_term |0x00000000|extern| | | | _doupdate |0x00000000|extern| | | | _fflush |0x00000000|extern| | | | _reset_shell_mode |0x00000000|extern| | | | _stdscr |0x00000000|extern| | | | _tputs |0x00000000|extern| | | | _endwin |0x00000008|extern| | | |.text Symbols from libcurses.a[erase.o]: Name Value Class Type Size Line Section _werase |0x00000008|extern| | | |.text Symbols from libcurses.a[erasechar.o]: Name Value Class Type Size Line Section _cur_term |0x00000000|extern| | | | _erasechar |0x00000008|extern| | | |.text Symbols from libcurses.a[fixterm.o]: Name Value Class Type Size Line Section _reset_prog_mode |0x00000000|extern| | | | _fixterm |0x00000008|extern| | | |.text Symbols from libcurses.a[flash.o]: Name Value Class Type Size Line Section ___cflush |0x00000000|extern| | | | __outch |0x00000000|extern| | | | _cur_term |0x00000000|extern| | | | _tputs |0x00000000|extern| | | | _flash |0x00000008|extern| | | |.text Symbols from libcurses.a[flushinp.o]: Name Value Class Type Size Line Section _cur_term |0x00000000|extern| | | | _doupdate |0x00000000|extern| | | | _ioctl |0x00000000|extern| | | | _flushinp |0x00000008|extern| | | |.text Symbols from libcurses.a[getch.o]: Name Value Class Type Size Line Section _SP |0x00000000|extern| | | | __fixdelay |0x00000000|extern| | | | __iob |0x00000000|extern| | | | __kpmode |0x00000000|extern| | | | _alarm |0x00000000|extern| | | | _cbreak |0x00000000|extern| | | | _errno |0x00000000|extern| | | | _fflush |0x00000000|extern| | | | _nocbreak |0x00000000|extern| | | | _read |0x00000000|extern| | | | _signal |0x00000000|extern| | | | _waddch |0x00000000|extern| | | | _wrefresh |0x00000000|extern| | | | _wgetch |0x00000008|extern| | | |.text __catch_alarm |0x00000428|extern| | | |.text Symbols from libcurses.a[getstr.o]: Name Value Class Type Size Line Section _SP |0x00000000|extern| | | | _crmode |0x00000000|extern| | | | _echo |0x00000000|extern| | | | _erasechar |0x00000000|extern| | | | _killchar |0x00000000|extern| | | | _nocrmode |0x00000000|extern| | | | _noecho |0x00000000|extern| | | | _waddch |0x00000000|extern| | | | _wclrtoeol |0x00000000|extern| | | | _wgetch |0x00000000|extern| | | | _wmove |0x00000000|extern| | | | _wrefresh |0x00000000|extern| | | | _wgetstr |0x00000008|extern| | | |.text Symbols from libcurses.a[idlok.o]: Name Value Class Type Size Line Section _idlok |0x00000008|extern| | | |.text Symbols from libcurses.a[gettmode.o]: Name Value Class Type Size Line Section _gettmode |0x00000008|extern| | | |.text Symbols from libcurses.a[has_ic.o]: Name Value Class Type Size Line Section _cur_term |0x00000000|extern| | | | _has_ic |0x00000008|extern| | | |.text Symbols from libcurses.a[has_il.o]: Name Value Class Type Size Line Section _cur_term |0x00000000|extern| | | | _has_il |0x00000008|extern| | | |.text Symbols from libcurses.a[idln.getst.o]: Name Value Class Type Size Line Section _SP |0x00000000|extern| | | | __chk_typeahead |0x00000000|extern| | | | __dellines |0x00000000|extern| | | | __ec_quit |0x00000000|extern| | | | __id_char |0x00000000|extern| | | | __inslines |0x00000000|extern| | | | __line_free |0x00000000|extern| | | | __pos |0x00000000|extern| | | | __scrollf |0x00000000|extern| | | | _cur_term |0x00000000|extern| | | | _InputPending |0x00000004|extern| | | | __id_line |0x00000008|extern| | | |.text __getst |0x00000d04|extern| | | |.text Symbols from libcurses.a[initkeypad.o]: Name Value Class Type Size Line Section _calloc |0x00000000|extern| | | | _cur_term |0x00000000|extern| | | | _strcmp |0x00000000|extern| | | | _strcpy |0x00000000|extern| | | | __init_keypad |0x00000008|extern| | | |.text Symbols from libcurses.a[initscr.o]: Name Value Class Type Size Line Section _Def_term |0x00000000|extern| | | | __c_why_not |0x00000000|extern| | | | __ec_quit |0x00000000|extern| | | | __iob |0x00000000|extern| | | | _getenv |0x00000000|extern| | | | _newterm |0x00000000|extern| | | | _stdscr |0x00000000|extern| | | | _initscr |0x00000008|extern| | | |.text Symbols from libcurses.a[insch.o]: Name Value Class Type Size Line Section _COLS |0x00000000|extern| | | | _LINES |0x00000000|extern| | | | _scroll |0x00000000|extern| | | | _wrefresh |0x00000000|extern| | | | _winsch |0x00000008|extern| | | |.text Symbols from libcurses.a[insertln.o]: Name Value Class Type Size Line Section _COLS |0x00000000|extern| | | | _LINES |0x00000000|extern| | | | _scroll |0x00000000|extern| | | | _wrefresh |0x00000000|extern| | | | _winsertln |0x00000008|extern| | | |.text Symbols from libcurses.a[intrflush.o]: Name Value Class Type Size Line Section _cur_term |0x00000000|extern| | | | _reset_prog_mode |0x00000000|extern| | | | _intrflush |0x00000008|extern| | | |.text Symbols from libcurses.a[keypad.o]: Name Value Class Type Size Line Section _keypad |0x00000008|extern| | | |.text Symbols from libcurses.a[killchar.o]: Name Value Class Type Size Line Section _cur_term |0x00000000|extern| | | | _killchar |0x00000008|extern| | | |.text Symbols from libcurses.a[leaveok.o]: Name Value Class Type Size Line Section _leaveok |0x00000008|extern| | | |.text Symbols from libcurses.a[libcurs.o]: Name Value Class Type Size Line Section Symbols from libcurses.a[line_alloc.o]: Name Value Class Type Size Line Section _SP |0x00000000|extern| | | | _calloc |0x00000000|extern| | | | _cur_term |0x00000000|extern| | | | __line_alloc |0x00000008|extern| | | |.text Symbols from libcurses.a[ll_refresh.o]: Name Value Class Type Size Line Section _InputPending |0x00000000|extern| | | | _SP |0x00000000|extern| | | | ___cflush |0x00000000|extern| | | | __comphash |0x00000000|extern| | | | __hlmode |0x00000000|extern| | | | __id_char |0x00000000|extern| | | | __id_line |0x00000000|extern| | | | __line_alloc |0x00000000|extern| | | | __line_free |0x00000000|extern| | | | __ll_move |0x00000000|extern| | | | __pos |0x00000000|extern| | | | __reset |0x00000000|extern| | | | __scrollf |0x00000000|extern| | | | __sethl |0x00000000|extern| | | | __setwind |0x00000000|extern| | | | __shove |0x00000000|extern| | | | __window |0x00000000|extern| | | | _cur_term |0x00000000|extern| | | | _outchcount |0x00000000|extern| | | | _didntdobotright |0x00000004|extern| | | | __ll_refresh |0x00000008|extern| | | |.text Symbols from libcurses.a[longname.o]: Name Value Class Type Size Line Section _ttytype |0x00000000|extern| | | | _longname |0x00000008|extern| | | |.text Symbols from libcurses.a[m_addch.o]: Name Value Class Type Size Line Section _SP |0x00000000|extern| | | | __ll_move |0x00000000|extern| | | | __ll_refresh |0x00000000|extern| | | | __scrdown |0x00000000|extern| | | | __unctrl |0x00000000|extern| | | | _stdscr |0x00000000|extern| | | | _m_addch |0x00000008|extern| | | |.text Symbols from libcurses.a[m_addstr.o]: Name Value Class Type Size Line Section _m_addch |0x00000000|extern| | | | _m_addstr |0x00000008|extern| | | |.text Symbols from libcurses.a[m_clear.o]: Name Value Class Type Size Line Section _SP |0x00000000|extern| | | | _m_erase |0x00000000|extern| | | | _m_clear |0x00000008|extern| | | |.text Symbols from libcurses.a[m_erase.o]: Name Value Class Type Size Line Section __clearline |0x00000000|extern| | | | _cur_term |0x00000000|extern| | | | _m_erase |0x00000008|extern| | | |.text Symbols from libcurses.a[m_move.o]: Name Value Class Type Size Line Section __ll_move |0x00000000|extern| | | | _stdscr |0x00000000|extern| | | | _m_move |0x00000008|extern| | | |.text Symbols from libcurses.a[meta.o]: Name >?@ABCDE Value Class Type Size Line Section __outch |0x00000000|extern| | | | _cur_term |0x00000000|extern| | | | _reset_prog_mode |0x00000000|extern| | | | _tputs |0x00000000|extern| | | | _meta |0x00000008|extern| | | |.text Symbols from libcurses.a[m_refresh.o]: Name Value Class Type Size Line Section __ll_move |0x00000000|extern| | | | __ll_refresh |0x00000000|extern| | | | _stdscr |0x00000000|extern| | | | _m_refresh |0x00000008|extern| | | |.text Symbols from libcurses.a[m_tstp.o]: Name Value Class Type Size Line Section Symbols from libcurses.a[makenew.o]: Name Value Class Type Size Line Section _COLS |0x00000000|extern| | | | _LINES |0x00000000|extern| | | | _calloc |0x00000000|extern| | | | _cfree |0x00000000|extern| | | | _cur_term |0x00000000|extern| | | | _makenew |0x00000008|extern| | | |.text Symbols from libcurses.a[miniinit.o]: Name Value Class Type Size Line Section _COLS |0x00000000|extern| | | | _Def_term |0x00000000|extern| | | | _LINES |0x00000000|extern| | | | _SP |0x00000000|extern| | | | __endwin |0x00000000|extern| | | | __iob |0x00000000|extern| | | | __new_tty |0x00000000|extern| | | | _calloc |0x00000000|extern| | | | _cur_term |0x00000000|extern| | | | _curscr |0x00000000|extern| | | | _getenv |0x00000000|extern| | | | _isatty |0x00000000|extern| | | | _savetty |0x00000000|extern| | | | _setupterm |0x00000000|extern| | | | _stdscr |0x00000000|extern| | | | _m_initscr |0x00000008|extern| | | |.text _m_newterm |0x00000070|extern| | | |.text _setterm |0x00000150|extern| | | |.text _gettmode |0x00000174|extern| | | |.text Symbols from libcurses.a[move.o]: Name Value Class Type Size Line Section _wmove |0x00000008|extern| | | |.text Symbols from libcurses.a[mvcur.o]: Name Value Class Type Size Line Section _SP |0x00000000|extern| | | | __outch |0x00000000|extern| | | | _cur_term |0x00000000|extern| | | | _tparm |0x00000000|extern| | | | _tputs |0x00000000|extern| | | | _mvcur |0x00000008|extern| | | |.text Symbols from libcurses.a[mvprintw.o]: Name Value Class Type Size Line Section __sprintw |0x00000000|extern| | | | _stdscr |0x00000000|extern| | | | _wmove |0x00000000|extern| | | | _mvprintw |0x00000008|extern| | | |.text Symbols from libcurses.a[mvscanw.o]: Name Value Class Type Size Line Section __sscans |0x00000000|extern| | | | _stdscr |0x00000000|extern| | | | _wmove |0x00000000|extern| | | | _mvscanw |0x00000008|extern| | | |.text Symbols from libcurses.a[mvwin.o]: Name Value Class Type Size Line Section _COLS |0x00000000|extern| | | | _LINES |0x00000000|extern| | | | _touchwin |0x00000000|extern| | | | _mvwin |0x00000008|extern| | | |.text Symbols from libcurses.a[mvwprintw.o]: Name Value Class Type Size Line Section __sprintw |0x00000000|extern| | | | _wmove |0x00000000|extern| | | | _mvwprintw |0x00000008|extern| | | |.text Symbols from libcurses.a[mvwscanw.o]: Name Value Class Type Size Line Section __sscans |0x00000000|extern| | | | _wmove |0x00000000|extern| | | | _mvwscanw |0x00000008|extern| | | |.text Symbols from libcurses.a[naps.o]: Name Value Class Type Size Line Section _SP |0x00000000|extern| | | | __delay |0x00000000|extern| | | | __outchar |0x00000000|extern| | | | _ioctl |0x00000000|extern| | | | _open |0x00000000|extern| | | | _read |0x00000000|extern| | | | _sleep |0x00000000|extern| | | | _delay_output |0x00000008|extern| | | |.text _napms |0x00000034|extern| | | |.text Symbols from libcurses.a[newpad.o]: Name Value Class Type Size Line Section _calloc |0x00000000|extern| | | | _cfree |0x00000000|extern| | | | _makenew |0x00000000|extern| | | | _newpad |0x00000008|extern| | | |.text Symbols from libcurses.a[newterm.o]: Name Value Class Type Size Line Section _COLS |0x00000000|extern| | | | _LINES |0x00000000|extern| | | | _SP |0x00000000|extern| | | | __endwin |0x00000000|extern| | | | __new_tty |0x00000000|extern| | | | _calloc |0x00000000|extern| | | | _cur_term |0x00000000|extern| | | | _curscr |0x00000000|extern| | | | _makenew |0x00000000|extern| | | | _newwin |0x00000000|extern| | | | _reset_prog_mode |0x00000000|extern| | | | _savetty |0x00000000|extern| | | | _stdscr |0x00000000|extern| | | | _newterm |0x00000008|extern| | | |.text Symbols from libcurses.a[newwin.o]: Name Value Class Type Size Line Section _COLS |0x00000000|extern| | | | _LINES |0x00000000|extern| | | | _calloc |0x00000000|extern| | | | _cfree |0x00000000|extern| | | | _makenew |0x00000000|extern| | | | _newwin |0x00000008|extern| | | |.text Symbols from libcurses.a[nl.o]: Name Value Class Type Size Line Section _cur_term |0x00000000|extern| | | | _reset_prog_mode |0x00000000|extern| | | | _nl |0x00000008|extern| | | |.text Symbols from libcurses.a[nocbreak.o]: Name Value Class Type Size Line Section _SP |0x00000000|extern| | | | _cur_term |0x00000000|extern| | | | _reset_prog_mode |0x00000000|extern| | | | _nocbreak |0x00000008|extern| | | |.text Symbols from libcurses.a[nocrmode.o]: Name Value Class Type Size Line Section _nocbreak |0x00000000|extern| | | | _nocrmode |0x00000008|extern| | | |.text Symbols from libcurses.a[nodelay.o]: Name Value Class Type Size Line Section __fixdelay |0x00000000|extern| | | | _nodelay |0x00000008|extern| | | |.text Symbols from libcurses.a[noecho.o]: Name Value Class Type Size Line Section _SP |0x00000000|extern| | | | _noecho |0x00000008|extern| | | |.text Symbols from libcurses.a[nonl.o]: Name Value Class Type Size Line Section _cur_term |0x00000000|extern| | | | _reset_prog_mode |0x00000000|extern| | | | _nonl |0x00000008|extern| | | |.text Symbols from libcurses.a[noraw.o]: Name Value Class Type Size Line Section _SP |0x00000000|extern| | | | _cur_term |0x00000000|extern| | | | _nocrmode |0x00000000|extern| | | | _reset_prog_mode |0x00000000|extern| | | | _noraw |0x00000008|extern| | | |.text Symbols from libcurses.a[nttychktrm.o]: Name Value Class Type Size Line Section _SP |0x00000000|extern| | | | __init_costs |0x00000000|extern| | | | __init_keypad |0x00000000|extern| | | | __setbuffered |0x00000000|extern| | | | _calloc |0x00000000|extern| | | | _cur_term |0x00000000|extern| | | | _savetty |0x00000000|extern| | | | _setupterm |0x00000000|extern| | | | __new_tty |0x00000008|extern| | | |.text __c_why_not |0x00000270|extern| | | |.data Symbols from libcurses.a[overlay.o]: Name Value Class Type Size Line Section __ctype |0x00000000|extern| | | | _waddch |0x00000000|extern| | | | _wmove |0x00000000|extern| | | | _overlay |0x00000008|extern| | | |.text Symbols from libcurses.a[overwrite.o]: Name Value Class Type Size Line Section _waddch |0x00000000|extern| | | | _wmove |0x00000000|extern| | | | _overwrite |0x00000008|extern| | | |.text Symbols from libcurses.a[pnoutrfrsh.o]: Name Value Class Type Size Line Section _SP |0x00000000|extern| | | | __ll_move |0x00000000|extern| | | | _cur_term |0x00000000|extern| | | | _lwin |0x00000000|extern| | | | _pnoutrefresh |0x00000008|extern| | | |.text Symbols from libcurses.a[prefresh.o]: Name Value Class Type Size Line Section _doupdate |0x00000000|extern| | | | _pnoutrefresh |0x00000000|extern| | | | _prefresh |0x00000008|extern| | | |.text Symbols from libcurses.a[printw.o]: Name Value Class Type Size Line Section __sprintw |0x00000000|extern| | | | _stdscr |0x00000000|extern| | | | _printw |0x00000008|extern| | | |.text Symbols from libcurses.a[putp.o]: Name Value Class Type Size Line Section __outchar |0x00000000|extern| | | | _tputs |0x00000000|extern| | | | _putp |0x00000008|extern| | | |.text Symbols from libcurses.a[raw.o]: Name Value Class Type Size Line Section _crmode |0x00000000|extern| | | | _cur_term |0x00000000|extern| | | | _reset_prog_mode |0x00000000|extern| | | | _raw |0x00000008|extern| | | |.text Symbols from libcurses.a[reset_prog.o]: Name Value Class Type Size Line Section _cur_term |0x00000000|extern| | | | _ioctl |0x00000000|extern| | | | _reset_prog_mode |0x00000008|extern| | | |.text Symbols from libcurses.a[resetshell.o]: Name Value Class Type Size Line Section _cur_term |0x00000000|extern| | | | _ioctl |0x00000000|extern| | | | _reset_shell_mode |0x00000008|extern| | | |.text Symbols from libcurses.a[resetterm.o]: Name Value Class Type Size Line Section _reset_shell_mode |0x00000000|extern| | | | _resetterm |0x00000008|extern| | | |.text Symbols from libcurses.a[resetty.o]: Name Value Class Type Size Line Section _SP |0x00000000|extern| | | | _cur_term |0x00000000|extern| | | | _reset_prog_mode |0x00000000|extern| | | | _resetty |0x00000008|extern| | | |.text Symbols from libcurses.a[restarttrm.o]: Name Value Class Type Size Line Section _COLS |0x00000000|extern| | | | _LINES |0x00000000|extern| | | | _SP |0x00000000|extern| | | | _cbreak |0x00000000|extern| | | | _cur_term |0x00000000|extern| | | | _echo |0x00000000|extern| | | | _nl |0x00000000|extern| | | | _nocbreak |0x00000000|extern| | | | _noecho |0x00000000|extern| | | | _nonl |0x00000000|extern| | | | _noraw |0x00000000|extern| | | | _raw |0x00000000|extern| | | | _reset_prog_mode |0x00000000|extern| | | | _setupterm |0x00000000|extern| | | | _restartterm |0x00000008|extern| | | |.text Symbols from libcurses.a[saveterm.o]: Name Value Class Type Size Line Section _def_prog_mode |0x00000000|extern| | | | _saveterm |0x00000008|extern| | | |.text Symbols from libcurses.a[savetty.o]: Name Value Class Type Size Line Section _SP |0x00000000|extern| | | | _cur_term |0x00000000|extern| | | | _savetty |0x00000008|extern| | | |.text Symbols from libcurses.a[scanw.o]: Name Value Class Type Size Line Section ___sscans |0x00000000|extern| | | | _stdscr |0x00000000|extern| | | | _scanw |0x00000008|extern| | | |.text Symbols from libcurses.a[scroll.o]: Name Value Class Type Size Line Section __tscroll |0x00000000|extern| | | | _scroll |0x00000008|extern| | | |.text Symbols from libcurses.a[scrollok.o]: Name Value Class Type Size Line Section _scrollok |0x00000008|extern| | | |.text Symbols from libcurses.a[select.o]: Name Value Class Type Size Line Section _select |0x00000008|extern| | | |.text Symbols from libcurses.a[set_term.o]: Name Value Class Type Size Line Section _COLS |0x00000000|extern| | | | _LINES |0x00000000|extern| | | | _SP |0x00000000|extern| | | | _cur_term |0x00000000|extern| | | | _curscr |0x00000000|extern| | | | _stdscr |0x00000000|extern| | | | _set_term |0x00000008|extern| | | |.text Symbols from libcurses.a[setbuffred.o]: Name Value Class Type Size Line Section _SP |0x00000000|extern| | | | _calloc |0x00000000|extern| | | | _ioctl |0x00000000|extern| | | | _setbuf |0x00000000|extern| | | | __setbuffered |0x00000008|extern| | | |.text Symbols from libcurses.a[setterm.o]: Name Value Class Type Size Line Section _setupterm |0x00000000|extern| | | | _setterm |0x00000008|extern| | | |.text Symbols from libcurses.a[setupterm.o]: Name Value Class Type Size Line Section __first_term |0x00000000|extern| | | | _access |0x00000000|extern| | | | _atoi |0x00000000|extern| | | | _close |0x00000000|extern| | | | _cur_term |0x00000000|extern| | | | _def_shell_mode |0x00000000|extern| | | | _exit |0x00000000|extern| | | | _getenv |0x00000000|extern| | | | _isatty |0x00000000|extern| | | | _malloc |0x00000000|extern| | | | _open |0x00000000|extern| | | | _perror |0x00000000|extern| | | | _read |0x00000000|extern| | | | _reset_prog_mode |0x00000000|extern| | | | _strcpy |0x00000000|extern| | | | _strlen |0x00000000|extern| | | | _write |0x00000000|extern| | | | _getsh |0x00000008|extern| | | |.text _setupterm |0x00000038|extern| | | |.text _ttytype |0x00000080|extern| | | | Symbols from libcurses.a[showstring.o]: Name Value Class Type Size Line Section _SP |0x00000000|extern| | | | __forcehl |0x00000000|extern| | | | __hlmode |0x00000000|extern| | | | __iob |0x00000000|extern| | | | __pos |0x00000000|extern| | | | __sethl |0x00000000|extern| | | | __writechars |0x00000000|extern| | | | _abort |0x00000000|extern| | | | _cur_term |0x00000000|extern| | | | _fprintf |0x00000000|extern| | | | __showstring |0x00000008|extern| | | |.text Symbols from libcurses.a[subwin.o]: Name Value Class Type Size Line Section _makenew |0x00000000|extern| | | | _subwin |0x00000008|extern| | | |.text Symbols from libcurses.a[tgetent.o]: Name Value Class Type Size Line Section _reset_shell_mode |0x00000000|extern| | | | _setupterm |0x00000000|extern| | | | _tgetent |0x00000008|extern| | | |.text Symbols from libcurses.a[tgetflag.o]: Name Value Class Type Size Line Section _cur_term |0x00000000|extern| | | | _tgetflag |0x00000008|extern| | | |.text Symbols from libcurses.a[tgetnum.o]: Name Value Class Type Size Line Section _cur_term |0x00000000|extern| | | | _tgetnum |0x00000008|extern| | | |.text Symbols from libcurses.a[tgetstr.o]: Name Value Class Type Size Line Section _cur_term |0x00000000|extern| | | | _tgetstr |0x00000008|extern| | | |.text Symbols from libcurses.a[tgoto.o]: Name Value Class Type Size Line Section _tparm |0x00000000|extern| | | | _tgoto |0x00000008|extern| | | |.text Symbols from libcurses.a[touchwin.o]: Name Value Class Type Size Line Section _touchwin |0x00000008|extern| | | |.text Symbols from libcurses.a[tparm.o]: Name Value Class Type Size Line Section _cur_term |0x00000000|extern| | | | _strcat |0x00000000|extern| | | | _strcpy |0x00000000|extern| | | | _strlen |0x00000000|extern| | | | _tparm |0x00000008|extern| | | |.text __branchto |0x000009c0|extern| | | |.text Symbols from libcurses.a[tputs.o]: Name Value Class Type Size Line Section __ctype |0x00000000|extern| | | | __delay |0x00000000|extern| | | | _cur_term |0x00000000|extern| | | | _tputs |0x00000008|extern| | | |.text Symbols from libcurses.a[traceonoff.o]: Name Value Class Type Size Line Section _traceon |0x00000008|extern| | | |.text _traceoff |0x00000014|extern| | | |.text Symbols from libcurses.a[tstp.o]: Name Value Class Type Size Line Section Symbols from libcurses.a[typeahead.o]: Name Value Class Type Size Line Section _SP |0x00000000|extern| | | | _typeahead |0x00000008|extern| | | |.text Symbols from libcurses.a[unctrl.o]: Name Value Class Type Size Line Section __unctrl |0x00000020|extern| | | |.data Symbols from libcurses.a[vidattr.o]: Name Value Class Type Size Line Section __outchar |0x00000000|extern| | | | _vidputs |0x00000000|extern| | | | _vidattr |0x00000008|extern| | | |.text Symbols from libcurses.a[vidputs.o]: Name Value Class Type Size Line Section _cur_term |0x00000000|extern| | | | _tparm |0x00000000|extern| | | | _tputs |0x00000000|extern| | | | _vidputs |0x00000008|extern| | | |.text Symbols from libcurses.a[vsprintf.o]: Name Value Class Type Size Line Section __doprnt |0x00000000|extern| | | | _vsprintf |0x00000008|extern| | | |.text Symbols from libcurses.a[vsscanf.o]: Name Value Class Type Size Line Section __doscan |0x00000000|extern| | | | _strlen |0x00000000|extern| | | | _vsscanf |0x00000008|extern| | | |.text Symbols from libcurses.a[wattroff.o]: Name Value Class Type Size Line Section _wattroff |0x00000008|extern| | | |.text Symbols from libcurses.a[wattron.o]: Name Value Class Type Size Line Section _wattron |0x00000008|extern| | | |.text Symbols from libcurses.a[wattrset.o]: Name Value Class Type Size Line Section _wattrset |0x00000008|extern| | | |.text Symbols from libcurses.a[wnoutrfrsh.o]: Name Value Class Type Size Line Section _SP |0x00000000|extern| | | | __ll_move |0x00000000|extern| | | | __ll_refresh |0x00000000|extern| | | | _cur_term |0x00000000|extern| | | | _curscr |0x00000000|extern| | | | _lwin |0x00000000|extern| | | | _touchwin |0x00000000|extern| | | | _wnoutrefresh |0x00000008|extern| | | |.text Symbols from libcurses.a[wprintw.o]: Name Value Class Type Size Line Section __sprintw |0x00000000|extern| | | | _wprintw |0x00000008|extern| | | |.text Symbols from libcurses.a[wrefresh.o]: Name Value Class Type Size Line Section _doupdate |0x00000000|extern| | | | _wnoutrefresh |0x00000000|extern| | | | _wrefresh |0x00000008|extern| | | |.text Symbols from libcurses.a[writechars.o]: Name Value Class Type Size Line Section _SP |0x00000000|extern| | | | __outch |0x00000000|extern| | | | __sethl |0x00000000|extern| | | | __setmode |0x00000000|extern| | | | _cur_term |0x00000000|extern| | | | _didntdobotright |0x00000000|extern| | | | _tparm |0x00000000|extern| | | | _tputs |0x00000000|extern| | | | __writechars |0x00000008|extern| | | |.text Symbols from libcurses.a[wscanw.o]: Name Value Class Type Size Line Section ___sscans |0x00000000|extern| | | | _wscanw |0x00000008|extern| | | |.text Symbols from libcurses.a[wstandend.o]: Name Value Class Type Size Line Section _wstandend |0x00000008|extern| | | |.text Symbols from libcurses.a[wstandout.o]: Name Value Class Type Size Line Section _wstandout |0x00000008|extern| | | |.text ! / 548426057 0 0 0 2672 ` \!P#)p47t:LBLnY]z_xbejjnq`vR{~LVl<H.*Ϯ"h LL  '-v/"02444IYb\`xdffhj|mp,p,2pj*úJ<rϜϜbضX\njJ00^4~  * #%')p+.(1333?HKMVlZd(""xvðl&؎ڀ<___cflush___sscans__blanks__c_clean__clearhl__clearline__comphash__delay__delchars__dellines__ec_quit__fixdelay__forcehl__hlmode__id_char__init_costs__inschars__insmode__kpmode__line_free__ll_move__outch_outchcount__outchar__pos__reset__scrdown__scrollf__sethl__setmode__setwind__shove__sprintw__syncmodes__tscroll__window_waddch_waddstr_baudrate_beep_box_boolnames_boolcodes_numnames_numcodes_strnames_strcodes_cbreak__chk_typeahead_wclear_clearok__clreol__inslines_wclrtobot_wclrtoeol__countchar__cost_fn_crmode_LINES_COLS_stdscr_curscr_Def_term_cur_term__first_term_SP_curses_version_lwin__endwin_def_prog_mode_def_shell_mode_delay_output_wdelch_wdeleteln_delwin___dpdummy_____dsdummy___doupdate_draino_echo_endwin_werase_erasechar_fixterm_flash_flushinp_wgetch__catch_alarm_wgetstr_idlok_gettmode_has_ic_has_il__id_line__getst_InputPending__init_keypad_initscr_winsch_winsertln_intrflush_keypad_killchar_leaveok__line_alloc__ll_refresh_didntdobotright_longname_m_addch_m_addstr_m_clear_m_erase_m_move_meta_m_refresh_makenew_m_initscr_m_newterm_setterm_gettmode_wmove_mvcur_mvprintw_mvscanw_mvwin_mvwprintw_mvwscanw_delay_output_napms_newpad_newterm_newwin_nl_nocbreak_nocrmode_nodelay_noecho_nonl_noraw__new_tty__c_why_not_overlay_overwrite_pnoutrefresh_prefresh_printw_putp_raw_reset_prog_mode_reset_shell_mode_resetterm_resetty_restartterm_saveterm_savetty_scanw_scroll_scrollok_select_set_term__setbuffered_setterm_getsh_setupterm_ttytype__showstring_subwin_tgetent_tgetflag_tgetnum_tgetstr_tgoto_touchwin_tparm__branchto_tputs_traceon_traceoff_typeahead__unctrl_vidattr_vidputs_vsprintf_vsscanf_wattroff_wattron_wattrset_wnoutrefresh_wprintw_wrefresh__writechars_wscanw_wstandend_wstandout__cflush.o/ 548424420 98 100 100664 482 ` u J .text0 .data00@@.bsspp888W @(#)__cflush.c 3.2 87/05/13 @(#)curshdr.h 3.2 87/05/13 .text0.data0@.bsspj_SPj_fflushj___cflush__sscans.o/ 548424426 98 100 100664 502 ` u J4 .textP .dataPP@@.bssH0~@rH  H'~@HHW @(#)__sscans.c 3.2 87/05/13 @(#)curshdr.h 3.2 87/05/13 ">.textP.dataP@.bssj_wgetstrj_vsscanfj___sscans_blanks.o/ 548424434 98 100 100664 1860 ` u J.text\: .data@@.bssH~@pp hx j؆\q  . 6  . haPJx8u4*  . a PbxPuL '( . z'z Qx6a&%0z"z . Lz(z`zzXNPzzznz(z x* ! qp~@HHW @(#)_blanks.c 3.2 87/05/13 @(#)curshdr.h 3.2 87/05/13 "(, . > @ T V d l n                 4 > @ N R T t v              $ & > B D T V d f v .text:.data@.bss__blanksl0l0__sethll0_SPl0l0__outchl0_tputsl0_tparml0__setmode_cur_term_c_clean.o/ 548424440 98 100 100664 924 ` u JL.textt .data@4@.bss@  0zz31  . !h! l@@W @(#)_c_clean.c 3.2 87/05/13 @(#)curshdr.h 3.2 87/05/13  " 6 8 R X \ ^ f h vz |   .text.data@.bssk__hlmodek__kpmodek_SPkk__windowkk__outchk_tputsk$__c_clean_cur_term__syncmodes_clearhl.o/ 548424445 98 100 100664 538 ` u JX .textP .dataPP@@.bss8 ȧ~4& q$$p$~488W @(#)_clearhl.c 3.2 87/05/13 @(#)curshdr.h 3.2 87/05/13 046.textP.dataP@.bssj_SPj__sethlj__clearhl_clearline.o/ 548424451 98 100 100664 526 ` u K@ .textP .dataPP@@.bss@~<p p ~<@@W @(#)_clearline.c 3.2 87/05/13 @(#)curshdr.h 3.2 87/05/13  .textP.dataP@.bssjj_SPj__clearline__ll_move_comphash.o/ 548424457 98 100 100664 535 ` u K |.text .data@<@.bss0~0#  p Az( p "( qs`G"@(C {~W @(#)_comphash.c 3.2 87/05/13 @(#)curshdr.h 3.2 87/05/13 .text.data@.bsskp__comphash _delay.o/ 548424463 98 100 100664 590 ` u K.textd .data@$@.bss@4~8p  N z"pȆp Wqp~8Ǟ4@@W @(#)_delay.c 3.2 87/05/13 5MS7) BNP.text.data@.bss__delayk@k@_cur_term_delchars.o/ 548424470 98 100 100664 1369 ` u KP .textd) .data@$@.bss@~<p`&Vx@ .    hx8 . F  . $!|! qp`̆X&  &!! ~<@@W @(#)_delchars.c 3.2 87/05/13 @(#)curshdr.h 3.2 87/05/13 4> @ PRZ \ j n p               ">H J dfn p  .text).data@.bsskk_strcmpk_SPk__outchk_tputsk__delchars_cur_term _dellines.o/ 548424479 98 100 100664 2495 ` u K.textP^ .dataPP@@.bssH~@`zzD@D(D . ,zzhxJzN, . 0zqpP`Fzzzz$z Іn^ "z"!(0z"z . ja4XL( . 214`&zz" ( . !Pz ( . p&, . q14`&zz"^( . D . &Bp8`6!z"z . q~@HHW @(#)_dellines.c 3.2 87/05/13 @(#)curshdr.h 3.2 87/05/13  "BDPRZ \ j tv     (*FHPRf jltv           "6 @ B P \^f h v         * , 8 .textP^.dataP@.bssl`_SPl`l`__outchl`_tputsl`l`__posl`_tparml`#__dellines_cur_term__setwind _dumpwin.o/ 548424485 98 100 100664 324 ` u K%.text .data@@.bss@@ @(#)_dumpwin.c 3.2 87/05/13 @(#)curshdr.h 3.2 87/05/13 .text.data@.bss@_ec_quit.o/ 548424490 98 100 100664 588 ` u K*P .textH .dataHH@@.bssH~@q '~@HHW @(#)_ec_quit.c 3.2 87/05/13 @(#)curshdr.h 3.2 87/05/13  * 2 .textH.dataH@.bssjj__iobj_fprintfj_exitj __ec_quit_reset_shell_mode_fixdelay.o/ 548424497 98 100 100664 667 ` u K1 .textd .data@$@.bssH<~@΀ p q         ~@Ǟ<HHW @(#)_fixdelay.c 3.2 87/05/13 @(#)curshdr.h 3.2 87/05/13 $&.08:J ~ .text.data@.bssj_SPj__iobj_fcntlj__fixdelay _forcehl.o/ 548424503 98 100 100664 482 ` u K7 .text0 .data00@@.bsspp0 &00W @(#)_forcehl.c 3.2 87/05/13 @(#)curshdr.h 3.2 87/05/13 .text0.data0@.bsspj_SPj__sethlj__forcehl_hlmode.o/ 548424509 98 100 100664 412 ` u K=.text .data@@.bssXX$W @(#)_hlmode.c 3.2 87/05/13 @(#)curshdr.h 3.2 87/05/13  .text.data@.bssX__hlmodejh_SPjh_id_char.o/ 548424523 98 100 100664 3567 ` u KK ,.text 6 .dataH \@.bss  xDHP1~X |Ǭ  z  ޠ 0s  z p P^d^l^t^p    (   (s   sR ^pQ^p    ( ^trQ^t  ( j^dQ^d  ( (ۋ^lrQ^l  ( (ۋd^lrQ^l  ( (ۋ^dQ^d  ( (  sPs^hP^tnpV ^pnt=-V$ptEFq ,^tnpVptEFq ^h]"ptEMq &nhptMFq ^pntV nl6hnpnt nd6#Fdnl^hP^hdddpP^l^dzP^dPH <  *  ^hQ^h^dQ^d^lP^dP^hP^^hP ^t^ptnppVnt"^hQ^h^t^p :G`2^`Q^`2B( (@ n`oZ^tnpe p '8(jnthV npe D>J^hP.p  ": 2( t( '8^lP؎^hPЋphnpntnppVnt"^hQ^h^t^pDt  80( '\"nt  ( " 8f t( '8" ^tnpeZ pnt^t^pL zD $ 0 :"I^dP2^hP*^tnpV%& Fxlnp '8(Xnhmlnp <6^tnpV%& @^hP8e]  hlnp  0 '(nhm(lnt h .^he$lnpe ' 8^tnpV%& .`~XɞPɾHDxxW@~<r*q ؆~<@@WXDH~Pssϰ 4؆& ( (7|"n( (7ZR~PɞHǾDXXW @(#)_id_char.c 3.2 87/05/13 @(#)curshdr.h 3.2 87/05/13 Nr(*TVvx*, XZ       2           , H T   X `br  .text6.dataH.bss t_SPttt(t__post__clreoltBtZtet__blanksto__id_char_cur_term__chk_typeahead__showstring__ins_string__delchars__ins_blanks__inschars__insmode _init_cost.o/ 548424534 98 100 100664 3293 ` u KV .textL .data@ @.bssH8~@*pd4z(r j0(z!4z^ Fppxzy qpd ` d` !t!p`@І8p0#t!#t؆4p ~t>ttt p؎R 0#pp!#p 0p p%ppP*(@pXBp0lDp@PFp(4Hp`JplLLNpTңPptRp Tpf ZVp8 ,Xp ZpH У\p$ ^~@ɞ8HHW @(#)_init_cost.c 3.2 87/05/13 @(#)curshdr.h 3.2 87/05/13 *.0BLNrvx        (,.>B D VXd f x          " $ 6 8 <>R ^f h lnz              "$08 : >@LT V Z\n z           & 2: < @BT `.text.data@.bsskkk_SPk_tparmk%__init_costs_cur_term__cost_fn _inschars.o/ 548424540 98 100 100664 949 ` u K\ .text .data@|@.bss00@~<paLx: .    ؆8q4t  . Z0$!! 2qp~<@@W @(#)_inschars.c 3.2 87/05/13 @(#)curshdr.h 3.2 87/05/13 &(< > L PRnp       .text.data@.bss0k@k@_SPk@__outchk@_tputsk@_tparmk@__inschars_cur_term _insmode.o/ 548424547 98 100 100664 450 ` u Kb.text0 .data00@@.bsspp 0 21x?x8 W @(#)_insmode.c 3.2 87/05/13 @(#)curshdr.h 3.2 87/05/13  .text0.data0@.bsspjh_SPjh__insmode_kpmode.o/ 548424553 98 100 100664 750 ` u Ki .text\ .data@@.bss@~<pz Xp& . $!! p~<@@W @(#)_kpmode.c 3.2 87/05/13 @(#)curshdr.h 3.2 87/05/13 24< > L TV^ ` p tv.text.data@.bss__kpmodek_SPkk__outchk_tputsk_cur_term_line_free.o/ 548424560 98 100 100664 706 ` u Kp .text| .data@<@.bss@0~@ pzw'p1! 'p1! 1 & @ ~W @(#)_line_free.c 3.2 87/05/13 @(#)curshdr.h 3.2 87/05/13 &(RT.text .data@.bsskXkX_SPkX__line_free_cur_term_ll_move.o/ 548424568 98 100 100664 1213 ` u Kx .text .data@|@.bss00@04~8`szb&zp! HF zz6Qzzzz 00,`&p p&p0c pRp0 z32 B րp B10p 1p ( zCzz    z0))p  ~8Ǟ4@@W @(#)_ll_move.c 3.2 87/05/13 @(#)curshdr.h 3.2 87/05/13 ^`  "TVhj.text.data@.bss0k_SPkkk%__ll_move_cur_term__line_alloc _outch.o/ 548424575 98 100 100664 1004 ` u K .text8 .data88@@.bssxx8 ``4    !  "111    ! v0    ! 2    ! 88W @(#)_outch.c 3.2 87/05/13 @(#)curshdr.h 3.2 87/05/13  (hjx            .text8.data8@.bssx__outchkk_SPk__flsbufk__iobk_outchcount_outchar.o/ 548424578 98 100 100664 610 ` u K .textp .datapp @.bss8  ċ 88W @(#)_outchar.c 3.2 87/05/13 &68>HJT.textp .datap .bssj__iobj__flsbufj__outchar_pos.o/ 548424586 98 100 100664 1206 ` u Kh.text@  .data@@@@.bssH~@pzz `,&z x@ 2 . ^ zzp*0zz31 `zz'8p~@HHW @(#)_pos.c 3.2 87/05/13 @(#)curshdr.h 3.2 87/05/13 8:HJl pr     $&.text@.data@@.bss__posk_SPkkk__outchk_tputsk__windowkk_mvcurk"_cur_term__clearhl__setwind_reset.o/ 548424593 98 100 100664 1264 ` u K .text0) .data00@@.bsspp@ . x .  . < . ~     z@@W @(#)_reset.c 3.2 87/05/13 @(#)curshdr.h 3.2 87/05/13 * .08:H LNVXf jltv                    .text0).data0@.bssp__resetjj__outchj_tputsj_SPjj_cur_term__setwind_scrdown.o/ 548424600 98 100 100664 914 ` u Kt .text .data@t@.bss((H8~@pzwzǑǡ1$$D@PDž`dž1D$7 !  !<  0~@ɞ8HHW @(#)_scrdown.c 3.2 87/05/13 @(#)curshdr.h 3.2 87/05/13 08 < > d f ~        .text.data@.bss(kk__poskk_SPk"k.__scrdown_cur_term__scrollf__line_free_scrollf.o/ 548424607 98 100 100664 973 ` u K.text .data@d@.bssH~@,zp&!,! qz(zP`Fzzzz$zD<~@HHW @(#)_scrollf.c 3.2 87/05/13 @(#)curshdr.h 3.2 87/05/13 &* , : DFN P ` j l ~    .text.data@.bsskpkpkp_SPkp__poskp__outchkp_tputskp"kp-__scrollf_cur_term__setwind__dellines _sethl.o/ 548424614 98 100 100664 730 ` u K .textT .data@@.bss8&$ \$ .$&z!z"z !88W @(#)_sethl.c 3.2 87/05/13 @(#)curshdr.h 3.2 87/05/13 (*24B FHT V fh.text .data@.bss__sethlj_SPj__outchj_vidputsjj_cur_term_setmode.o/ 548424621 98 100 100664 764 ` u K .textl .data@,@.bss@x x jx  . 0#x)! 1xx 10@@W @(#)_setmode.c 3.2 87/05/13 @(#)curshdr.h 3.2 87/05/13 02BDPRZ \ j np.text .data@.bssk_SPkk__outchk_tputsk__setmode_cur_term_setwind.o/ 548424628 98 100 100664 1188 ` u K .textP .dataPP@@.bss@`zzzz `<T!1@z"z3z(#00 . j4|( . @14`&zz"( .  . @@W @(#)_setwind.c 3.2 87/05/13 @(#)curshdr.h 3.2 87/05/13 @BPR~              " &(46.textP .dataP@.bssk(_SPk(k(_tparmk(__outchk(_tputsk(__setwind_cur_term_shove.o/ 548424637 98 100 100664 1074 ` u Kp .text .data@|@.bss00?@©~pàz 0   ,p p 0x  0p p 021p p 0p p1!0 xaz0z60 (z1 0 @0!B2&z z(z ~ɞɾW @(#)_shove.c 3.2 87/05/13 @(#)curshdr.h 3.2 87/05/13 $&2@B\np.text.data@.bss0__shovek_SPkk_cur_term_sprintw.o/ 548424643 98 100 100664 496 ` u K$ .text@  .data@@@@.bss@~<p@@~<@@W @(#)_sprintw.c 3.2 87/05/13 @(#)curshdr.h 3.2 87/05/13 (.text@.data@@.bssjj_waddstrj__sprintw_vsprintf_sputc.o/ 548424650 98 100 100664 324 ` u K.text .data@@.bss@@ @(#)_sputc.c 3.2 87/05/13 @(#)curshdr.h 3.2 87/05/13 .text.data@.bss@_syncmodes.o/ 548424656 98 100 100664 524 ` u K .text0 .data00@@.bsspp0 Г00W @(#)_syncmodes.c 3.2 87/05/13 @(#)curshdr.h 3.2 87/05/13  .text0.data0@.bsspj__sethljjj$__syncmodes__setmode__setwind_tscroll.o/ 548424664 98 100 100664 608 ` u K.text .data@\@.bssH8 ~@ 2$r&z3zwpǀCpBp Ǣ  1Ds82 szpzN~@ɞ8HHW @(#)_tscroll.c 3.2 87/05/13 @(#)curshdr.h 3.2 87/05/13 .text.data@.bssjj__tscroll_touchwin_window.o/ 548424671 98 100 100664 542 ` u K\ .textH .dataHH@@.bss~pA4 <p@~W @(#)_window.c 3.2 87/05/13 @(#)curshdr.h 3.2 87/05/13 (*24.textH.dataH@.bss__windowjj_SPj_cur_termaddch.o/ 548424680 98 100 100664 1315 ` u K$ .text .dataX<@.bssH8~@ޠ xØ   zwzz z p 80 2 (N(F8p23W3Π l  q  ( ~(h pq ! 0   ! 0  ^  p  QRSTUVWXYZ[\]^_`abcdefghijklmnopqrst h  z&( qPh  zp(h   zpp pqzNp& z>. z 6&ppqppx~@ɞ8HHW @(#)addch.c 3.2 87/05/13 @(#)curshdr.h 3.2 87/05/13 l|LT p .text.dataX.bss_waddchmP__unctrlmPmPmPmP#_wrefresh__tscroll_wclrtoeol addstr.o/ 548424687 98 100 100664 464 ` u K0.textX$ .dataXX@@.bss@~8q('q   ~8@@W @(#)addstr.c 3.2 87/05/13 @(#)curshdr.h 3.2 87/05/13 ..textX.dataX@.bss_waddstrj_waddchjbaudrate.o/ 548424694 98 100 100664 426 ` u K.text .data@@.bssXX,zW @(#)baudrate.c 3.2 87/05/13 @(#)curshdr.h 3.2 87/05/13  .text.data@.bssXjh_SPjh_baudratebeep.o/ 548424701 98 100 100664 692 ` u K .textp< .datapp@@.bss@,", . Ћ&!! @@W @(#)beep.c 3.2 87/05/13 @(#)curshdr.h 3.2 87/05/13 "$2 <>FHX ^ .textp .datap@.bss_beepjj__outchj_tputsjj_cur_term___cflushbox.o/ 548424708 98 100 100664 622 ` u L.text .data8|@.bss((H4@8ސ 0 2~@ ΐ| 0-ÄtdǦzzwqp : ! 0.DŽDZLj!4'0~@ɞ8Ǿ4HHW @(#)box.c 3.2 87/05/13 @(#)curshdr.h 3.2 87/05/13 .text.data8.bss(_boxjj_touchwincapnames.o/ 548424717 98 100 100664 7718 ` u L  .text .data  \@.bss   @(#)capnames.c 3.2 87/05/13 ( $  ,      4 < D L | x t p l h d ` \ X T P L H D T @ < 8 \ 4 d l t | 0 , ( $      $ , 4 <     D L T \ d l t |     |xtpl hd`\X TPLHD@<840,($     |xtplhd`\XTPLHD@<840,($  |xtplhd`\XTPLHD@<840,($  pOK5K4K2K3K1iPhuuctstawistsasrsfsccvrcrfr3r2r1rppopfpspxplpkUPSRRILEALSFICDODLDCpcnwmmmol9l8l7l6l5l4l3l2lal1l0kskekukTkRkFkrkPkNkHklkAkIkhk9k8k7k6k5k4k3k2k;k1k0kSkEkMkdkLkDktkCkakbipalicifi2isi1fsffvbueseeiedtemeaeecussomrmpmkimmhdmtimdmbashddsdldcvsupllndveCMlevihodocmCCchcdceclctcscrblbtkc3kc1kb2ka3ka1huuctslhthtssgrriindscvparcrfrs3rs2rs1repmc5mc4mc0pfxcuurincufcubilichcuddldchpadnelsmmrmmlf9lf8lf7lf6lf5lf4lf3lf2lf1lf0krikppknpkllkf9kf8kf7kf6kf5kf4kf3kf2kf1kf0kedkelkbsipil1ifis3is2is1fslffechrevdimhddsldl1llcuphpaedeltbccsrcrbelcbtwsvtpbsglmliitcowslvtpbxmclmitxoulhzxtesosmsmidbdainhskmhcgneoxnxsxbambwxonulhzxtosmirdbdainhskmhcgneoxhpxsbambwxenlmsgreslokcolslinesclearcmdchcud1homeciviscub1mrcupcnormcuf1cuu1cvvisdch1smacsblinkboldsmcupsmdcsmirinvisprotsmsosmulrmacssgr0rmcuprmdcrmirrmsormulflashich1ktbckclrkctabkdch1kdl1kcud1krmirkf10khomekich1kil1kcub1kcuf1kindkhtskcuu1rmkxsmkxlf10indnpfkeypflocwindiprogmc5p $(,048<@DHLPTX\`dhlpx|  $(,048<@DHLPTX\`dhlptx|  $(,048<@DHLPTX\`dhlptx|  $(,048<@DHLPTX\`hlptx|  $(,048<@DHLPTX\`dhlptx|  $(,048<@DHLPTX\`dhlptx|.text.data \.bss  x$. 8hB_boolnames_boolcodes_numnames_numcodes_strnames_strcodescbreak.o/ 548424724 98 100 100664 655 ` u L .textp< .datapp@@.bss0     00W @(#)cbreak.c 3.2 87/05/13 @(#)curshdr.h 3.2 87/05/13 &(24>@^ .textp .datap@.bss_cbreakjj_SPjj_cur_term_reset_prog_mode chktypeahd.o/ 548424731 98 100 100664 380 ` u L.text .data@@.bssPPW @(#)chktypeahd.c 3.2 87/05/13 @(#)curshdr.h 3.2 87/05/13 .text.data@.bssPjP__chk_typeaheadclear.o/ 548424738 98 100 100664 536 ` u L"P .textH .dataHH@@.bss8 ȧ~4p p~488W @(#)clear.c 3.2 87/05/13 @(#)curshdr.h 3.2 87/05/13  "* .textH.dataH@.bss_wclearj_curscrj_stdscrj_werasejclearok.o/ 548424746 98 100 100664 480 ` u L*, .text0 .data00@@.bsspp *W @(#)clearok.c 3.2 87/05/13 @(#)curshdr.h 3.2 87/05/13  .text0.data0@.bssp_clearokj_curscrj_SPjclreolinln.o/ 548424758 98 100 100664 3784 ` u L6 (.text\ .data@@.bssH<~@ a@0!0z"z . 2*zpt`zpǐvzwq:   z q z~@Ǟ<HHWH<~@& P`Fzz2D(%0z"z . ` Ð(z$ ( . D8zD . ܋2p&zq(* " . | l0zzBxz&0 . zz@$ @ . qp.n^ "z"p!(0z"z . >a48,( . 14`&zz"( .  . x&0 . qp14`&zz"R( . 8 . r`6!z"z . x6`6!z"z . qp~@Ǟ<HHW @(#)clreolinln.c 3.2 87/05/13 @(#)curshdr.h 3.2 87/05/13 (,.< > R T ` hj~       >@L N \` b jl           & 8:L\^v x           6 8 F TVrt| ~           $. 0 > BDL N \ hjr t                . 0 < HJR T f h t .text.data@.bss__clreoln@n@n@_SPn@__outchn@_tputsn@n@#,n@__posn@__blanksn@.n@_tparmn@8_cur_term__clearhl__dellines__inslines__setwindclrtobot.o/ 548424766 98 100 100664 663 ` u L>.text0 .data00@@.bsspp?詾0~szzwp‹c@,&"z,& 6 (@s@ "( @lczz @c# sz ,&"sqz~ɞɾW @(#)clrtobot.c 3.2 87/05/13 @(#)curshdr.h 3.2 87/05/13 .text0.data0@.bsspk@_wclrtobot clrtoeol.o/ 548424775 98 100 100664 663 ` u LG.text0 .data00@@.bsspp0~CczDzp &"zpp & p8 (psp "( pczzpcp# sz"p!&"s~ɞW @(#)clrtoeol.c 3.2 87/05/13 @(#)curshdr.h 3.2 87/05/13 .text0.data0@.bsspk_wclrtoeol cntcostfn.o/ 548424783 98 100 100664 724 ` u LO .textd .dataH@.bssW@ 1~<p @! p~<@@W @(#)cntcostfn.c 3.2 87/05/13 @(#)curshdr.h 3.2 87/05/13 02LPRn rt~.text .dataH.bssj jj_tputsj$__countchar__cost_fn_cur_termcrmode.o/ 548424790 98 100 100664 408 ` u LV.text  .data @@.bss``0 Г00W @(#)crmode.c 3.2 87/05/13 @(#)curshdr.h 3.2 87/05/13 .text .data @.bss`_crmodejh_cbreakjhcurses.o/ 548424798 98 100 100664 713 ` u L^@.text .data@.bss @(#)curses.c 3.2 87/05/13 @(#)curshdr.h 3.2 87/05/13 `hunknownPackaged for USG UNIX 6.0, 3/6/83@H P.text.data.bss_LINESk_COLSk_stdscrk_curscrk@kHkk_SPk%Pk_lwink__endwinXk5_Def_term_cur_term__first_term_curses_version def_prog.o/ 548424805 98 100 100664 473 ` u Le .text8 .data88 @.bssXX@`lzT&@@W @(#)def_prog.c 3.2 87/05/13 &.text8.data8 .bssXjj_ioctlj_def_prog_mode_cur_term def_shell.o/ 548424813 98 100 100664 698 ` u Lm .text .data @.bss  @~<`lzT&nqgPn%' n%# F%! 0Qa1t&! 8Rb1T&# 3Td1,&' 1Xh1 ~<@@W @(#)def_shell.c 3.2 87/05/13 *.0.text.data .bss kk_ioctlk_def_shell_mode_cur_termdelayoutpt.o/ 548424821 98 100 100664 496 ` u Lu .text0 .data00@@.bsspp8 88W @(#)delayoutpt.c 3.2 87/05/13 @(#)curshdr.h 3.2 87/05/13 .text0.data0@.bsspjj__delayj_delay_output__outchardelch.o/ 548424829 98 100 100664 576 ` u L}.text .data@t@.bss(( ~Rbzpzpzpz@02B( z zRbzzzzzz~W @(#)delch.c 3.2 87/05/13 @(#)curshdr.h 3.2 87/05/13 .text.data@.bss(_wdelchjdeleteln.o/ 548424836 98 100 100664 551 ` u L.text .data l@.bss ~bzp0zFtprpDǢ   zAtzz@2 (zpz#! ~ɞW @(#)deleteln.c 3.2 87/05/13 .text.data .bssj_wdeleteln delwin.o/ 548424844 98 100 100664 536 ` u Lx.textT .data@@.bss@4~8 z>p(tz (~8Ǟ4@@W @(#)delwin.c 3.2 87/05/13 @(#)curshdr.h 3.2 87/05/13 @jr.text.data@.bss_delwinj_cfreejdoprnt.o/ 548424849 98 100 100664 345 ` u L.text .data @.bss00W @(#)doprnt.c 3.2 87/05/13 .text.data .bss0jP___dpdummy__ doscan.o/ 548424854 98 100 100664 345 ` u L.text .data @.bss00W @(#)doscan.c 3.2 87/05/13 .text.data .bss0jP___dsdummy__ doupdate.o/ 548424863 98 100 100664 1219 ` u L.text .data@@.bss@@@ `x" . * z T2`zz& z"z"@@W @(#)doupdate.c 3.2 87/05/13 @(#)curshdr.h 3.2 87/05/13  "* , < @ B N P X Z hpt v .text.data@.bss@l_lwinl__endwinl_SPll_stdscrll__outchl_tputsl#l4l>lK_doupdate__fixdelay_cur_term_reset_prog_mode__ll_move__ll_refresh draino.o/ 548424871 98 100 100664 658 ` u L .text .data@l@.bss  X~T@ltzn W%' \%# <%! 0Qa1\8Rb1D3Td1$1Xh1 . >$T<~TXXW @(#)draino.c 3.2 87/05/13 @(#)curshdr.h 3.2 87/05/13 .text.data@.bss _drainokk_ioctlk_cur_termecho.o/ 548424879 98 100 100664 428 ` u L .text( .data((@@.bsshh   W @(#)echo.c 3.2 87/05/13 @(#)curshdr.h 3.2 87/05/13  .text(.data(@.bssh_echojh_SPjhendwin.o/ 548424888 98 100 100664 1219 ` u L.text .data@d@.bss@~<p.zw '.p.x" . tz^XJ>~<@@W @(#)endwin.c 3.2 87/05/13 @(#)curshdr.h 3.2 87/05/13  02@ DFNPb f h t v ~    .text.data@.bss_endwink_SPk__endwinkkk_stdscrkk__outchk_tputsk__posk#k-k__iobk_fflushk?_doupdate__fixdelay_cur_term__c_clean_reset_shell_mode erase.o/ 548424897 98 100 100664 632 ` u L.text .data  @@.bss`` 0~Ћ@ pz'* K s@ "( @lczz @c# sz -&"sz 3~ɞɾ W @(#)erase.c 3.2 87/05/13 @(#)curshdr.h 3.2 87/05/13 .text .data @.bss`_werasek@erasechar.o/ 548424906 98 100 100664 437 ` u L.text .data@@.bssXXyW @(#)erasechar.c 3.2 87/05/13 @(#)curshdr.h 3.2 87/05/13  .text.data@.bssXjhjh_erasechar_cur_term fixterm.o/ 548424915 98 100 100664 461 ` u L.text   .data `@.bss0 Г00W @(#)fixterm.c 3.2 87/05/13 @(#)curshdr.h 3.2 87/05/13 @(#)uparm.h 3.2 87/05/13 .text .data `.bss_fixtermjhjh_reset_prog_mode flash.o/ 548424923 98 100 100664 692 ` u L .textp< .datapp@@.bss@܆" . Ћ&!,! @@W @(#)flash.c 3.2 87/05/13 @(#)curshdr.h 3.2 87/05/13 "$2 <>FHX ^ .textp .datap@.bss_flashjj__outchj_tputsjj_cur_term___cflushflushinp.o/ 548424931 98 100 100664 542 ` u L4 .text8 .data88@@.bssxx@lzT ޓ@@W @(#)flushinp.c 3.2 87/05/13 @(#)curshdr.h 3.2 87/05/13 $* .text8.data8@.bssxjj_ioctljj"_flushinp_cur_term_doupdategetch.o/ 548424944 98 100 100664 2749 ` u L.textD .data@l@.bss  h@HP~XP^_xB: z,zzzz `xxj^_Q^_zB6Ph@x &x zdázp"0`Fz q2"Pe^`P^`p ^` ^!Pp   pp(^  pP^d  d"a  "(( `Vz,`œ  `&&z<b`'0"#à z !^dq"P^dd` zázp"0`Fz q2"8x$ * n_`  ~XɎPɮH@hhW WP@~Hp  O!~p  b(PHqO~HɎ@PPW @(#)getch.c 3.2 87/05/13 @(#)curshdr.h 3.2 87/05/13 (*xz     $&>@prz |    "$@Bdf DFtv,^hr .textD.data@.bss _wgetcho_SPo_cbreako__kpmodeo__iobo_fflushoo_reado_errnoo_waddchoo%o/(o_signalo_alarmo=_sig_caught__fixdelay_wrefresh_nocbreak__catch_alarm getstr.o/ 548424954 98 100 100664 1348 ` u L.text .data@@.bss88h@HP~Xpx`x\ ГP^g^g P^gǾ`^ \)\! z   T L    z\zz" \ 2" \  \1ZSzHbz>z\zz" \ 2"  \!jbzXzp\(>z  \(z   \ "pp!  \12czzpzczzv2$ӌj{p!  \18czzzcz zpzv2$͋Zp  \!>bz"zpz\bzzv"ɋ^{  \!Dbz"zz\bz zpzv"P,p" \^ |  d\ `$ ` dzz>`V z"z`V z `V 6zq zwppp zw p zw`V  F0 @B2(  dz$03z dzq>03`d^ |zqW^ |>p80C`3d^ |zqW^ |^ `R^ `^ dR$^ dဩ@  \! \12"J^ |PB |z *n | ^ hn |V^ hpϬP^ |$\z\z.\ zxzppz^ hW^ h^ |W^ |pYpR \^  x  \ n Vz4z\zz7z.\!z  "@  " xn ^ R^ ^ xR^ x^ T^  Kp  \ n Vz4z\zz7z.\!z "r n ^ R^ 4^ hP  \zp \ \"  \z \z\z"n | z x^ hyxW^ h^ |W^ |XR^ hP pZpR \^  t  \   \ p^ zezz  "  " tn p^ pR^ p^ R^ ^ tR^ t^ Tħ^ ep  \   \ lr^ zezz " n l^ lR^ l^ Rħ^ `&!68#`V&%V`& ^ \Rԧ^ \E~XɎPɮH@ WH8~@΀y p,qp  ȓpp ~@ɞ8HHW @(#)idln.getst.c 3.2 87/05/13 @(#)curshdr.h 3.2 87/05/13 Hash table full in dispcalchj@B.0LN|~LN    ^`|       z |       p r      . 0 F  J L X Z       F H P R x | ~    @ F L.text V.data `.bss u0_SPu0__getst u0u0__posu0u0#u0-u09u0Iu0Wu0bu0lu0v__id_line_cur_term__dellines__scrollf__line_free__chk_typeahead_InputPending__inslines__id_char__ec_quitinitkeypad.o/ 548425025 98 100 100664 3988 ` u MA .text( .data((@.bss88H~@2"q6ؓ$ 0ܓzp 0ԓZpd6Гf$d 0pt 0Xp 0p6̓$ 0p` 6 0, jap`6 00  2ap`6 08  ap`6 0<  ap`6 0@  ap`6 0D  Rap`6 0H ap`6 0L ap`6 0P ap`6 0T rp H0V`p I0:p J0\p K0 p L0 p M0(p N0$p O0xp P0v|p Q0Zlp R0>pp S0"p T0 p U0(p V00hp [0|Tp \0xXp ]0tz\p ^0p^`p _0lBdp `0h&p ~@HHWH<~@p" " p~@Ǟ<HHW @(#)initkeypad.c 3.2 87/05/13 @(#)curshdr.h 3.2 87/05/13 c3c1b2a3a1llsrsfeoleoseicicdcildlf9f8f7f6f5f4f3f2f1f0up downleftrighthomebackspaceclearnpageppagestabctabcatab(*8> HJZhjz   "2@BZ^`tv:>@TVrvx 46RVXln~ &02BLN^hjz",.>HJZdfv  .text(.data(.bss8p_callocpp_strcmpp_strcpyp__init_keypad_cur_terminitscr.o/ 548425034 98 100 100664 808 ` u MJ.textpD .datappH@.bss@~<p p ~<@@W @(#)initscr.c 3.2 87/05/13 @(#)curshdr.h 3.2 87/05/13 TERM(*0 2 6 8 > H J R V X .textp.datapH.bss_initscrkX_getenvkXkX__iobkX_newtermkXkXkX_stdscrkX$_Def_term__c_why_not__ec_quitinsch.o/ 548425044 98 100 100664 886 ` u MT .textxD .dataxx@@.bss@~8pހ Wgzpz@zpz 0"2(z zWgzzzzzzazpp!!" F6 z $z ~8@@W @(#)insch.c 3.2 87/05/13 @(#)curshdr.h 3.2 87/05/13 @ H .textx.datax@.bss_winschkX_LINESkX_COLSkXkX_scrollkX_wrefreshinsertln.o/ 548425054 98 100 100664 945 ` u M^ .textt .data@4@.bssH8~@pzp0zz z'z"!BpBpBǧ   z!Dz z 2 (zpz#! azrp!!" H8 z &z~@ɞ8HHW @(#)insertln.c 3.2 87/05/13 @(#)curshdr.h 3.2 87/05/13  02j r .text.data@.bsskX_LINESkX_COLSkXkX_scrollkX_winsertln_wrefresh intrflush.o/ 548425063 98 100 100664 574 ` u Mg` .textX$ .dataXX@@.bss0    00W @(#)intrflush.c 3.2 87/05/13 @(#)curshdr.h 3.2 87/05/13 02F.textX.dataX@.bssjjj*_intrflush_cur_term_reset_prog_modekeypad.o/ 548425072 98 100 100664 368 ` u Mp.text .data@@.bssXX W @(#)keypad.c 3.2 87/05/13 @(#)curshdr.h 3.2 87/05/13 .text.data@.bssX_keypadjPkillchar.o/ 548425081 98 100 100664 436 ` u My.text .data@@.bssXXzW @(#)killchar.c 3.2 87/05/13 @(#)curshdr.h 3.2 87/05/13  .text.data@.bssXjhjh_killchar_cur_termleaveok.o/ 548425089 98 100 100664 368 ` u M.text .data@@.bssXX W @(#)leaveok.c 3.2 87/05/13 @(#)curshdr.h 3.2 87/05/13 .text.data@.bssX_leaveokjPlibcurs.o/ 548425095 98 100 100664 292 ` u M.text .data @.bss @(#)libcurs.c 3.2 87/05/13 .text.data .bss line_alloc.o/ 548425104 98 100 100664 615 ` u M .textp< .datapp@@.bss@~<p p ,pz  ~<@@W @(#)line_alloc.c 3.2 87/05/13 @(#)curshdr.h 3.2 87/05/13 8> @ N.textp.datap@.bssj_SPj_callocjj__line_alloc_cur_term ll_refresh.o/ 548425123 98 100 100664 4685 ` u M|.texth 4 .datahh@@.bssP@~HaAztzp zzTPzz%z" z"0zp `   0 @#@X n         vx    .text.data@.bssP_makenewl_LINESl_COLSl_callocl_cfreell_cur_termminiinit.o/ 548425231 98 100 100664 1797 ` u N.text* .dataH@.bss@@@"8   @@WPD~HqtqX Npzz 0 048~HǞDPPW@ @@WWH8~@s(b :r ~@ɞ8HHW @(#)miniinit.c 3.2 87/05/13 @(#)curshdr.h 3.2 87/05/13 TERM &2 4 < > D F J L V X        ".^ .text*.dataH.bss@l_isattyl_getenvll__ioblpl_stdscrl_callocl_SPl_savettyl$l.l_LINESl_COLSl_curscrl__endwinl_settermPl8lCtlM_m_initscr_Def_term_m_newterm__new_tty_cur_term_setupterm_gettmode move.o/ 548425240 98 100 100664 400 ` u N.text8 .data88@@.bssxx0Azz CW @(#)move.c 3.2 87/05/13 @(#)curshdr.h 3.2 87/05/13 .text8.data8@.bssx_wmovejmvcur.o/ 548425262 98 100 100664 6280 ` u N.\ .text .data @ t@.bss ( (pDHP~Xr V (d \a0`RTJ"`0 . ~T . `R 1hh  1Vd  f` 8 t  8 d   P@zU^lBnhzƈ4n` ndDnhzHn` nd   0 Dnhz^l\DQ@[<P(8( . xtXGt XLNLapz zpPdPz.WZ^`FndñLzze*ZW^\FndñJzze`LzÖVz ΐH\z݋ LHD 6HX  . > PHD 8!  .   6$@ . ndi݈zXxprVЋ` lL$ D&2 0 (l . 8@ 0   z"   n`iW6&` . n\i݋XpVЋ` lL$ D&2 0 (l . << , z "    y_   ~PɞHɾ@<hhW`@HP0~Xqs `s V`(npz$HÑLz z HÑJz zÑJz ΐÀTz ΀HP\zU^\P^\^\YHXD 6H  . f\D 8!:  .  (&( . z4&l . 0&` . 2(!`! N ~XɎPɮH@``WP@0~Hqs @s 6tÑRzΐÀXz ΀$à^z ΠHD 6$`  . F ~D 8!  . 8 0&!t!  ~Hɞ@PPWP@@~HqG Xt NaT`00 (  ÑPzΐԆÀZz ΀$à^z ΠHD 6$  .  ~D 8!  . p8 0&!T! >x ~Hɞ@PPW @(#)mvcur.c 3.2 87/05/13 @(#)curshdr.h 3.2 87/05/13 46Dtv    H J     hjrt  : < | ~       . 0 8:`bn p     (*24B l n ~  (*24B h j z| pr         02> @ np         "  8 : B D R  h j r t            8 : F  H  \ ^ j  l                 " $ 4                 2  < > L  b d x         .text .data @.bss (_mvcurw(w(__outchw(_tputsw(_SPw(_tparmw(<_bare_lf_ok_cur_term__loc_right__loc_left__loc_downmvprintw.o/ 548425271 98 100 100664 596 ` u N7t .text`, .data``@@.bss@~<@>d1r#.d~<@@W @(#)mvprintw.c 3.2 87/05/13 @(#)curshdr.h 3.2 87/05/13  *46B .text`.data`@.bssj_stdscrj_wmovejj_mvprintw__sprintwmvscanw.o/ 548425281 98 100 100664 572 ` u NAt .text`, .data``@@.bss@~<@>d1r#.d~<@@W @(#)mvscanw.c 3.2 87/05/13 @(#)curshdr.h 3.2 87/05/13  *46B .text`.data`@.bss_mvscanwj_stdscrj_wmovej__sscansjmvwin.o/ 548425291 98 100 100664 574 ` u NKh .text`, .data``@@.bss80Azz C# 88W @(#)mvwin.c 3.2 87/05/13 @(#)curshdr.h 3.2 87/05/13 *,L .text`.data`@.bss_mvwinj_LINESj_COLSjj_touchwinmvwprintw.o/ 548425301 98 100 100664 505 ` u NU, .textH .dataHH@@.bssH~@p.pҋ~@HHW @(#)mvwprintw.c 3.2 87/05/13 @(#)curshdr.h 3.2 87/05/13 0.textH.dataH@.bssj_wmovejj_mvwprintw__sprintw mvwscanw.o/ 548425311 98 100 100664 494 ` u N_, .textH .dataHH@@.bssH~@p.pҋ~@HHW @(#)mvwscanw.c 3.2 87/05/13 @(#)curshdr.h 3.2 87/05/13 0.textH.dataH@.bssj_wmovej__sscansj_mvwscanwnaps.o/ 548425323 98 100 100664 1418 ` u Nk8.textH$ .dataHHP@.bss8 88W888Wh~<pPPPPjpT.TDnB^T60Qa1x8Rb1`&# 3Td10&' 1Xh1Z Za~bT.T|g!jpT.BTpVp qzqgq~<hhW8;<88W @(#)naps.c 3.2 87/05/13 @(#)curshdr.h 3.2 87/05/13 /dev/idlettypz  x         4.textH.dataHP.bssm m __delaym _napms4m _openm _ioctlm _readm _SPm _sleepm &_delay_output__outchar_sleepnapnewpad.o/ 548425334 98 100 100664 792 ` u NvP .text0 .data00@@.bsspp`DHP~X  0p  z ٣   \'r^ RF>H  ;M" (Q~XɞPɾHD``W @(#)newpad.c 3.3 87/05/13 @(#)curshdr.h 3.2 87/05/13 .j     .text0.data0@.bssp_newpadkp_makenewkp_callockp_cfreekpnewterm.o/ 548425345 98 100 100664 1381 ` u N.text0$ .data00@@.bssppPD~Hqq    p  nzz 06 048~HǞDPPW @(#)newterm.c 3.3 87/05/13 @(#)curshdr.h 3.2 87/05/13 &.68@B` j | ~         .text0$.data0@.bssp_newtermk_callock_SPk_savettykkkk_curscrk_LINESk_COLSk_makenewk_newwink_stdscrk__endwink)__new_tty_cur_term_reset_prog_mode newwin.o/ 548425357 98 100 100664 968 ` u N .textX$ .dataXX@@.bss`DHP~X  ֐ ր p ؋p \'J6 *H  ;M" (Q~XɞPɾHD``W @(#)newwin.c 3.2 87/05/13 @(#)curshdr.h 3.2 87/05/13 $&68LNXZf       .textX.dataX@.bss_newwinl_LINESl_COLSl_makenewl_callocl_cfreelnl.o/ 548425367 98 100 100664 539 ` u NH .textH  .dataHH8@.bss0   $ 00W @(#)nl.c 3.2 87/05/13 @(#)curshdr.h 3.2 87/05/13 $&8.textH.dataH8.bss_nljjj_cur_term_reset_prog_mode nocbreak.o/ 548425377 98 100 100664 657 ` u N .texth4 .datahh@@.bss0 " {| 00W @(#)nocbreak.c 3.2 87/05/13 @(#)curshdr.h 3.2 87/05/13 "$24BDZ .texth .datah@.bssjj_SPjj)_nocbreak_cur_term_reset_prog_mode nocrmode.o/ 548425387 98 100 100664 432 ` u N.text  .data @@.bss``0 Г00W @(#)nocrmode.c 3.2 87/05/13 @(#)curshdr.h 3.2 87/05/13 .text .data @.bss`jhjh_nocrmode_nocbreaknodelay.o/ 548425397 98 100 100664 447 ` u N.text8 .data88@@.bssxx@~8qx~8@@W @(#)nodelay.c 3.2 87/05/13 @(#)curshdr.h 3.2 87/05/13 ".text8.data8@.bssx_nodelayjhjh__fixdelay noecho.o/ 548425407 98 100 100664 420 ` u N.text  .data @@.bss`` W @(#)noecho.c 3.2 87/05/13 @(#)curshdr.h 3.2 87/05/13  .text .data @.bss`_noechojh_SPjhnonl.o/ 548425417 98 100 100664 555 ` u NX .textP .dataPP@@.bss0   00W @(#)nonl.c 3.2 87/05/13 @(#)curshdr.h 3.2 87/05/13 &(>.textP.dataP@.bss_nonljjj_cur_term_reset_prog_mode noraw.o/ 548425428 98 100 100664 833 ` u N< .text| .data@<@.bss0 wx     ~ b00W @(#)noraw.c 3.2 87/05/13 @(#)curshdr.h 3.2 87/05/13  "02DFZ\np   .text.data@.bss_norawjjj_SPjj)_cur_term_nocrmode_reset_prog_mode nttychktrm.o/ 548425440 98 100 100664 2034 ` u NP.text(9 .data((8@.bssH<~@pp ph .DD  <*pz2pzpp !~@ǎ<HHWxp< |pfP Rt X&T` 0|pW @(#)nttychktrm.c 3.2 87/05/13 @(#)curshdr.h 3.2 87/05/13 unknownSorry, I don't know how to deal with your '%s' terminal. Sorry, I need to know a more specific terminal type than '%s'. 8@DFT\ l           "$24>@LPRp r         x|.text(9.data(.bssmP_SPmP_callocmPmPmP_savettymP'mP1mP?mPLpmPb__new_tty__setbuffered_setupterm_cur_term__init_keypad__init_costs__c_why_not__unknownoverlay.o/ 548425452 98 100 100664 884 ` u N .text| .data@<@.bssp@HP~Xizz z  zi zz z  zi  @zz z  zi0zz z  z z zSP^l zTP^h nlzRpR^dQQ^`VV^\d)`QÉ nl\zpF.z (  r( ^dT^dnhki~XɎPɮH@ppW @(#)overlay.c 3.2 87/05/13 @(#)curshdr.h 3.2 87/05/13 (*Tl .text.data@.bss_overlayk__ctypek_wmovek_waddchkoverwrite.o/ 548425464 98 100 100664 687 ` u N .text .data@@.bssHHh@HP~Xjzz z zdjzz z zzzP^\h x DǾ\pP^`0*.`!@^`qR^`^\T^\ndi~XɎPɮH@hhW @(#)overwrite.c 3.2 87/05/13 @(#)curshdr.h 3.2 87/05/13 .text.data@.bssHkX_wmovekX_waddchkX_overwrite pnoutrfrsh.o/ 548425476 98 100 100664 1022 ` u O .textl .data@,@.bssX8@H~PAr#@@pp   `Vzz`VzzhzzpWgWԧ^ThzTp .\0zzz, $1 21 r!(  ģI~PɎHɮ@8XXW @(#)pnoutrfrsh.c 3.2 87/05/13 @(#)curshdr.h 3.2 87/05/13 HJfh  , . | .text .data@.bsslll_SPl_lwinl&_pnoutrefresh_cur_term__ll_moveprefresh.o/ 548425486 98 100 100664 526 ` u O4 .textP .dataPP@@.bssP@~L~x~(~|~,~~0Г~LPPW @(#)prefresh.c 3.2 87/05/13 @(#)curshdr.h 3.2 87/05/13 28.textP.dataP@.bssjjj&_prefresh_pnoutrefresh_doupdateprintw.o/ 548425497 98 100 100664 490 ` u O( .text8 .data88@@.bssxx@\.`\ @@W @(#)printw.c 3.2 87/05/13 @(#)curshdr.h 3.2 87/05/13 "(.text8.data8@.bssx_printwj_stdscrjj__sprintwputp.o/ 548425506 98 100 100664 450 ` u O" .text0 .data00 @.bssPP@ . @@W @(#)putp.c 3.2 87/05/13 ".text0.data0 .bssP_putpjj_tputsj__outcharraw.o/ 548425517 98 100 100664 747 ` u O- .text\ .data8$@.bss0    0  |00W @(#)raw.c 3.2 87/05/13 @(#)curshdr.h 3.2 87/05/13  (*>@TVhj .text.data8.bss_rawjj_crmodejj_cur_term_reset_prog_mode reset_prog.o/ 548425527 98 100 100664 547 ` u O7P .text@, .data@@`@.bss@`lzT&@@W @(#)reset_prog.c 3.2 87/05/13 @(#)curshdr.h 3.2 87/05/13 @(#)uparm.h 3.2 87/05/13 2.text@.data@`.bssjj_ioctlj_reset_prog_mode_cur_term resetshell.o/ 548425538 98 100 100664 548 ` u OBP .text@, .data@@`@.bss@`rlzT&n@@W @(#)resetshell.c 3.2 87/05/13 @(#)curshdr.h 3.2 87/05/13 @(#)uparm.h 3.2 87/05/13 2.text@.data@`.bssjj_ioctlj _reset_shell_mode_cur_termresetterm.o/ 548425549 98 100 100664 473 ` u OM.text   .data `@.bss0 Г00W @(#)resetterm.c 3.2 87/05/13 @(#)curshdr.h 3.2 87/05/13 @(#)uparm.h 3.2 87/05/13 .text .data `.bssjhjh!_resetterm_reset_shell_mode resetty.o/ 548425560 98 100 100664 759 ` u OX .text .data@|@.bss008 ȩ~0 րphW%' l%# D%! 0Qa1t&! 8Rb1T&# 3Td1,&' 1Xh1 $~088W @(#)resetty.c 3.2 87/05/13 @(#)curshdr.h 3.2 87/05/13 (*.0 .text.data@.bss0_resettyk_SPkkk_cur_term_reset_prog_mode restarttrm.o/ 548425571 98 100 100664 1209 ` u Oc.text .data`@.bssXXP@@1~HpaxxR q   (rl`ZpN D>zz~Hɞ@PPW @(#)restarttrm.c 3.2 87/05/13 @(#)curshdr.h 3.2 87/05/13 @(#)uparm.h 3.2 87/05/13 &(V b n z   .text.data`.bssXlH_SPlHlHlH_echolH_noecholH_cbreaklH_norawlH&lH_rawlH_nllH_nonllH0lH_LINESlH_COLSlHA_restartterm_cur_term_setupterm_nocbreak_reset_prog_mode saveterm.o/ 548425582 98 100 100664 469 ` u On.text   .data `@.bss0 Г00W @(#)saveterm.c 3.2 87/05/13 @(#)curshdr.h 3.2 87/05/13 @(#)uparm.h 3.2 87/05/13 .text .data `.bssjhjh_saveterm_def_prog_mode savetty.o/ 548425594 98 100 100664 654 ` u Oz .text .data@\@.bss~pgP%' n%# F%! 0Qa1t&! 8Rb1T&# 3Td1,&' 1Xh1 ~W @(#)savetty.c 3.2 87/05/13 @(#)curshdr.h 3.2 87/05/13 .text.data@.bss_savettykp_SPkpkp_cur_termscanw.o/ 548425604 98 100 100664 490 ` u O( .text8 .data88@@.bssxx@\.`\ @@W @(#)scanw.c 3.2 87/05/13 @(#)curshdr.h 3.2 87/05/13 "(.text8.data8@.bssx_scanwj_stdscrjj___sscansscroll.o/ 548425615 98 100 100664 430 ` u O.text( .data((@@.bsshh888W @(#)scroll.c 3.2 87/05/13 @(#)curshdr.h 3.2 87/05/13 .text(.data(@.bssh_scrolljhjh__tscrollscrollok.o/ 548425626 98 100 100664 382 ` u O.text .data@@.bssXX W @(#)scrollok.c 3.2 87/05/13 @(#)curshdr.h 3.2 87/05/13 .text.data@.bssXjP_scrollokselect.o/ 548425637 98 100 100664 360 ` u O.text .data@@.bssPPW @(#)select.c 3.2 87/05/13 @(#)curshdr.h 3.2 87/05/13 .text.data@.bssP_selectjPset_term.o/ 548425650 98 100 100664 728 ` u O .text`, .data``@@.bss <zz48W @(#)set_term.c 3.2 87/05/13 @(#)curshdr.h 3.2 87/05/13  $&. 68@ J V .text` .data`@.bssj_SPjj_LINESj_COLSj_stdscrj_curscrj_set_term_cur_termsetbuffred.o/ 548425661 98 100 100664 688 ` u O .textl .data` @.bssX~@p T.FnJz ,~@XXW @(#)setbuffred.c 3.2 87/05/13 @(#)curshdr.h 3.2 87/05/13 2Kn,X `%K(< X2~}|{zyxwvutsrqponmlk ` u Ol.text( .datax@.bssxDЩHP~XP$  ^d`sz:zs (*; z^`^l~   ( ""^lQ^l  r( ^lQ^lt`| tzzGL:$0"2""2rB(  .`t*"`lxZt^phzϞ`  ϋ>p' 0 @z 2A0( 1nh#(P ^p X^pp8x &@   P (H`t p    ndNz>zpzz^tzQ^tz  r 0@ ^@*@nh("2( "2s   ^tZ  p^td^tQr^tnl (zd~XɞPɾHDxxW @(#)showstring.c 3.2 87/05/13 @(#)curshdr.h 3.2 87/05/13 Bad call to _showstring, first %x, last %x, diff %dpcx *,<>Z d f pz    8:\^  ,.>BDvxDF` f.text(.datax.bssn_SPnn__posn__iobn_fprintfn_abortn__hlmodenn(n__sethln2__showstring_cur_term__writechars__forcehlsubwin.o/ 548425717 98 100 100664 656 ` u O.text .data@@.bssXXXDH~PpAǾW!z 2g z ( z5z z6z Çzz  'zz" +*;d Xz*  z@0*!pǪA4  ~PɞHǾDXXW @(#)subwin.c 3.2 87/05/13 @(#)curshdr.h 3.2 87/05/13 .text.data@.bssX_subwink(_makenewk(tgetent.o/ 548425728 98 100 100664 497 ` u P .text8 .data88@@.bssxx@.< <@@W @(#)tgetent.c 3.2 87/05/13 @(#)curshdr.h 3.2 87/05/13 &.text8.data8@.bssx_tgetentjjj!_setupterm_reset_shell_mode tgetflag.o/ 548425742 98 100 100664 2112 ` u P.textx|3 .dataxxx@.bss!p( ni!im ^ bx *Had bd ch fcn mk *TluĐ ma ng sx Zox *nxp oe \so PsbH p""W"wb *0tp tx   zh $p ` P @ 0  ` !@  !^0  !V4,  !VW @(#)tgetflag.c 3.2 87/05/13 @(#)curshdr.h 3.2 87/05/13 ppxppppppXDh2xz (*8:HJXZhjxzDF.textx3.dataxx.bsso0o0_tgetflag_cur_termtgetnum.o/ 548425754 98 100 100664 858 ` u P.text  .data  @@.bss``!p( oc!Jtil *bpؐ gs ċml dsw ti "tv dzvzfzVzFz6 z&"z$zW @(#)tgetnum.c 3.2 87/05/13 @(#)curshdr.h 3.2 87/05/13  .text .data @.bss`_tgetnumll_cur_termtgetstr.o/ 548425782 98 100 100664 11302 ` u P5+x.textPl0 .dataPP!@.bss "p( MC!֋8k r 4K ʋ2r |2i p""W"1K *d0k 0l  41r 1i p""W"2K ~:3l * 43K\ 3k H 3r < 5l J 5K * 4k N4l 5k D7k * P6k Ȑ .6l 7l EL pCC ^9l * 8l ` v9k L;k @ VAk ,Ck *CD CI Dk IR J Fk *Ek FS `Hk LD * Ik x .LA d 0Lk Xhk Tk |Pi ^ OD * Mk Nk Op ܐ PU ȋ Rk *Pk RS Sk tcu hcd p""W"bm 6at ak > p""(W"bk *bv fs Vff p""PW"dn dc  p""W"ev ea  p""W"hc "os od p""W"iw J it *hm ` &ie Liv @lp <la p""PW"km  kp mm mc  p""W"uh Lsv Vsa p""W"pu pi  p""W"rs rc ~ p""PW"ts jtb b p""W"wn ,uk 8 vc $xp T( ,048<@DHLxPhTXXH\8`(dhlptx|xhXH8(ċȋ̋xЋhԋX؋H܋8( xhXH8 ($(,048<@DHLxPhTXXH\8`(dhlptx|xhXH8(ċȋ̋xЋhԋX؋H܋8( xhXH8 ($(,048<@DHLxPhTXXH\8`(dhW @(#)tgetstr.c 3.2 87/05/13 @(#)curshdr.h 3.2 87/05/13 XH x HHHHH 8H X HHHHH HHH xHHHHHH H8H HHHHHHh HH hHHHHHH HHHHHHH HHHHHHHHHH HHHHH8HHHHHHH HH HHh HHHHHHH (XHHH xHHHH(HHH HhH (HH HH HHHH HHHxx HHHHHHHH HHhXHHHHHHH hHXHHHHHX8xHHHHHHH HHHHHHHxnNl*f8:HJXZhjxz (*8:HJXZhjxz (*8:HJXZhjxz     ( * 8 : H J X Z h j x z                     ( * 8 : H J X Z h j x z                     ( * 8 : H J X Z h j x z                     ( * 8 : H J X Z h j x z                     ( * 8 : H J X Z h j x z                 (*8:HJXZhjxz (*8:  $(,048<@DHLPTX\`dhlptx|  $(,048<@DHLPTX\`dhlptx|  $(,048<@DHPTX\`dhlptx|.textP0.dataP.bss_tgetstr_cur_termtgoto.o/ 548425790 98 100 100664 392 ` u P>.text0 .data00 @.bssPP@@1#@@W @(#)tgoto.c 3.2 87/05/13 .text0.data0 .bssP_tgotojh_tparmjhtouchwin.o/ 548425802 98 100 100664 446 ` u PJ$.textX .dataXX@@.bss@~Ätzzwq0 $ 1"p~W @(#)touchwin.c 3.2 87/05/13 @(#)curshdr.h 3.2 87/05/13 .textX.dataX@.bssj_touchwintparm.o/ 548425825 98 100 100664 4765 ` u Pa .text h  .data h h (I@.bss X X0<@H~PP^^ސ X p F x %   pXq0(2?0!1p23 W3P1 ~1^1p23 W3zd3 $d ēz 0d00 dpd2 $d ؓP& * 0  * 0 PQp^p   pxTl!* &zt` &r "P  xq pPQp^ PQp.X^!"Qp~Xq^l^Qp.X^!" !  (290,1$1p23 W3^QpX^ ^QpX^^QpX^^QpX^^QpX^^QpX^ t^QpX^$T^QpX^(4^QpX^, X1RRP^(ap.!^Qp>X^1^QpX^(0a#p">2#!^Q^(pX!' ʋ|pA- @+09 q(0#}  ^4^QpX'^$!^QpX^ QpX^pQpX^'!PQpX^ QpX^pQpX7^21\^QpX^ QpX^pQpX^'!PQpX^ QpX^pQpX7^21^QpX^ QpX^pQpX7^21xPQpX^ QpX^pQpX^ '!.^QpX^ QpX^pQpX^ '!PQpX^ QpX^pQpX^ '!^QpX^ QpX^pQpX^r!JPQpX^ QpX^pQpX7^P21^QpX^ QpX^pQpX7^Q21`pX&p">X2#V !`pX&p">X2#"!b\^Qp.X^!e,;r ,N$(   x| X~PɞHɾ@<WW8 @~4p q0b %R$A   ;0 @ ?1 ;1$A  @f~488W @(#)tparm.c 3.2 87/05/13  ` ` ` ` ` ` `d ` `< ` ` ` ` ` ` ` \x,  ` ` ` ` H ` ` ` `h ` ` ` `  ` ` ` ` ` `H `4Pl null argbad char after %3bad char after %2bad parm numbermissing closing quotemissing closing bracebad % sequenceno matching ENDIF6@T ` .0>F .R b    J                                       $ ( , 0 4 8 < @ D H L P T X \ ` d h l p t x |            .text h.data hI.bss X0_tparmt(t(_strcatt(_strlent( t(_strcpyt(_cur_term__branchto tputs.o/ 548425837 98 100 100664 950 ` u Pm .text\ .data <@.bssP@~Hpp HΠ$6 $<(:pqW~Hɞ@PPWH<~@pB r00q!*.Jqg00 0q*q)> qW0 & p~@Ǟ<HHW @(#)tputs.c 3.2 87/05/13 xz .text .data .bss_tputslH__ctypelHlH__delaylH_cur_termtraceonoff.o/ 548425849 98 100 100664 402 ` u Py.text .data@@.bssXXWW @(#)traceonoff.c 3.2 87/05/13 @(#)curshdr.h 3.2 87/05/13 .text.data@.bssX_traceonjhjh_traceofftstp.o/ 548425858 98 100 100664 292 ` u P.text .data @.bss @(#)tstp.c 3.2 87/05/13 .text.data .bss typeahead.o/ 548425870 98 100 100664 427 ` u P.text .data@@.bssXX0W @(#)typeahead.c 3.2 87/05/13 @(#)curshdr.h 3.2 87/05/13  .text.data@.bssXjh_SPjh_typeahead unctrl.o/ 548425881 98 100 100664 2872 ` u P .text .data @.bss  @(#)unctrl.c 3.2 87/05/13  |xtplhd`\XTPLHD@<840,($  |xtplhd`\XTPLHD@<840,($ ^?~}|{zyxwvutsrqponmlkjihgfedcba`_^]\[ZYXWVUTSRQPONMLKJIHGFEDCBA@?>=<;:9876543210/.-,+*)('&%$#"! ^_^~^]^\^[^Z^Y^X^W^V^U^T^S^R^Q^P^O^N^M^L^K^J^I^H^G^F^E^D^C^B^A^@ $(,048<@DHLPTX\`dhlptx|  $(,048<@DHLPTX\`dhlptx| .text.data .bss __unctrl vhvidattr.o/ 548425890 98 100 100664 450 ` u P .text0 .data00 @.bssPP888W @(#)vidattr.c 3.2 87/05/13 .text0.data0 .bssP_vidattrjj_vidputsj__outcharvidputs.o/ 548425907 98 100 100664 2606 ` u P X .textQ .dataHD@.bssP@~Hp֐pĎ4 '0 #7@ 4GΠ JN(GΠ JN,GΠ JN0GΠ JN4GΠ@ JN8Gޠ J N , ( hĆ(H"؆(Ԇ( .*  (n ~Hɞ@PPW @(#)vidputs.c 3.2 87/05/13 @(#)curshdr.h 3.2 87/05/13 (*68     (*< F\hjx    :FHb v   *68R frt    ".0B LN`  .textQ.dataH.bss_vidputsm m _tparmm _tputsm _cur_termvsprintf.o/ 548425916 98 100 100664 446 ` u P.textX .dataXX @.bssxxP@1@@MLND.@NH DPPW @(#)vsprintf.c 3.2 87/05/13 <.textX.dataX .bssxjh__doprntjh_vsprintfvsscanf.o/ 548425925 98 100 100664 464 ` u P .textX .dataXX @.bssxxX0~@rTU>L>PHH'~@XXW @(#)vsscanf.c 3.2 87/05/13 2F.textX.dataX .bssx_vsscanfj_strlenj__doscanjwattroff.o/ 548425937 98 100 100664 398 ` u P.text( .data((@@.bsshh 0 0 W @(#)wattroff.c 3.2 87/05/13 @(#)curshdr.h 3.2 87/05/13 .text(.data(@.bsshjP_wattroffwattron.o/ 548425950 98 100 100664 384 ` u P.text( .data((@@.bsshh   W @(#)wattron.c 3.2 87/05/13 @(#)curshdr.h 3.2 87/05/13 .text(.data(@.bssh_wattronjPwattrset.o/ 548425962 98 100 100664 382 ` u P.text .data@@.bssXX W @(#)wattrset.c 3.2 87/05/13 @(#)curshdr.h 3.2 87/05/13 .text.data@.bssXjP_wattrsetwnoutrfrsh.o/ 548425976 98 100 100664 1145 ` u P$.texth4 .datahh@@.bssP?8@~Hp*z(* z'gz")zǁ z2P zzz$! "!  (  z Cp~Hɞ@ɾ8PPW @(#)wnoutrfrsh.c 3.2 87/05/13 @(#)curshdr.h 3.2 87/05/13 &(02@BRT` dfr    N .texth.datah@.bssl0_curscrl0_SPl0l0l0)l03l0_lwinl0=_wnoutrefresh_touchwin__ll_refresh__ll_move_cur_term wprintw.o/ 548425988 98 100 100664 438 ` u Q.text0 .data00@@.bsspp@.` `0#@@W @(#)wprintw.c 3.2 87/05/13 @(#)curshdr.h 3.2 87/05/13 ".text0.data0@.bssp_wprintwjhjh__sprintwwrefresh.o/ 548426000 98 100 100664 486 ` u Q .text( .data((@@.bsshh888W @(#)wrefresh.c 3.2 87/05/13 @(#)curshdr.h 3.2 87/05/13 .text(.data(@.bsshjjj&_wrefresh_wnoutrefresh_doupdatewritechars.o/ 548426015 98 100 100664 2146 ` u Q.text(A .data((@@.bsshhP@~Hދ x pqqqq( !( q z(zqz`zz )(( . Qx6a&%0z"z . fNF_>x, ,` . z`zz^TPzzzz~`l^x* ! &$z   ( ~Hɞ@PPW @(#)writechars.c 3.2 87/05/13 @(#)curshdr.h 3.2 87/05/13 $, . : <            & ( 6 X Z n p                  * , F\ ^ h j z |                .text(A.data(@.bsshll__sethlll_SPl_tparml__outchl_tputsl%l6__writechars__setmode_cur_term_didntdobotrightwscanw.o/ 548426027 98 100 100664 438 ` u Q+.text0 .data00@@.bsspp@.` `0#@@W @(#)wscanw.c 3.2 87/05/13 @(#)curshdr.h 3.2 87/05/13 ".text0.data0@.bssp_wscanwjhjh___sscanswstandend.o/ 548426039 98 100 100664 383 ` u Q7.text .data@@.bssXXW @(#)wstandend.c 3.2 87/05/13 @(#)curshdr.h 3.2 87/05/13 .text.data@.bssXjP_wstandend wstandout.o/ 548426052 98 100 100664 391 ` u QD.text .data @@.bss``  W @(#)wstandout.c 3.2 87/05/13 @(#)curshdr.h 3.2 87/05/13 .text .data @.bss`jP_wstandout U...Vcrt]csudgens.libenviron.hs.Makefilelibc.acrt0.os.mcount.defmcrt0.olibc.mapplibc.aplibc.mapV.U..Ws.udiv.sXs.urem.sYs.MakefileZs.cerror.s[s.mcount.s\mcount.sh04694 s 00000/00000/00034 d D 4.4 87/04/10 15:29:35 mth 7 6 c Profiling changes e s 00003/00001/00031 d D 4.3 87/04/09 15:41:02 mth 6 5 c Profiling e s 00007/00001/00025 d D 4.2 87/02/17 10:43:04 mth 5 4 c Parameters in registers e s 00000/00000/00026 d D 4.1 87/02/17 09:53:18 mth 4 3 c rolled rev to -r4 (mth) e s 00000/00000/00026 d D 3.1 87/01/21 17:59:28 mkm 3 2 c e s 00000/00000/00026 d D 2.1 87/01/20 16:33:58 mkm 2 1 c e s 00026/00000/00000 d D 1.1 87/01/19 16:36:12 mkm 1 0 c Placed under source control - mkm e u U f b f n t T I 1 ; " %W% %E% " ; ; udiv - unsigned division ; ; arguments: dividend, divisor. ; result: quotient. ; ; ; unsigned int divide: ; i = udiv((int)dvdnd, (int)divis) ; ; #include "sys/ass.h" csect code align 4 global _udiv global udiv I 6 word 0 ;framesize (for sdb) word 0 ;#args (for sdb) E 6 _udiv: udiv: I 6 ; MCOUNT E 6 I 5 #ifdef ARGSINREGS move r2,r1 move r1,r0 move r0,0 #else E 5 movei r0,0 load r1,r14,PARAM1 load r2,r14,PARAM2 I 5 #endif E 5 ediv r0,r2 D 5 ret r11,r11 E 5 I 5 ret LINK,LINK E 5 D 6 E 6 E 1 h64028 s 00000/00000/00028 d D 4.4 87/04/10 15:29:35 mth 7 6 c Profiling changes e s 00003/00001/00025 d D 4.3 87/04/09 15:41:03 mth 6 5 c Profiling e s 00007/00001/00019 d D 4.2 87/02/17 10:43:06 mth 5 4 c Parameters in registers e s 00000/00000/00020 d D 4.1 87/02/17 09:53:21 mth 4 3 c rolled rev to -r4 (mth) e s 00000/00000/00020 d D 3.1 87/01/21 17:59:29 mkm 3 2 c e s 00000/00000/00020 d D 2.1 87/01/20 16:33:59 mkm 2 1 c e s 00020/00000/00000 d D 1.1 87/01/19 16:36:12 mkm 1 0 c Placed under source control - mkm e u U f b f n t T I 1 ; " %W% %E% " #include "sys/ass.h" ; ; unsigned int remainder: ; j = urem((int)dvdnd, (int)divis) ; csect code align 4 global _urem global urem I 6 word 0 ;framesize (for sdb) word 0 ;#args (for sdb) E 6 _urem: urem: I 6 ; MCOUNT E 6 I 5 #ifdef ARGSINREGS move r2,r1 move r1,r0 move r0,0 #else E 5 movei r0,0 load r1,r14,PARAM1 load r2,r14,PARAM2 I 5 #endif E 5 ediv r0,r2 move r0,r1 D 5 ret r11,r11 E 5 I 5 ret LINK,LINK E 5 D 6 E 6 E 1 h13450 s 00000/00000/00084 d D 4.7 87/04/10 15:29:33 mth 13 12 c Profiling changes e s 00002/00002/00082 d D 4.6 87/04/09 16:19:52 mth 12 11 c Profiling e s 00002/00002/00082 d D 4.5 87/04/09 15:48:36 mth 11 10 c Profiling fixes e s 00011/00006/00073 d D 4.4 87/04/09 15:40:59 mth 10 9 c Profiling e s 00002/00002/00077 d D 4.3 87/02/17 13:33:34 mth 9 8 c Add ASFLAGS usage to assembly lines. e s 00002/00000/00077 d D 4.2 87/02/17 10:41:44 mth 8 7 c Parameters in registers. e s 00000/00000/00077 d D 4.1 87/02/17 09:53:07 mth 7 6 c rolled rev to -r4 (mth) e s 00023/00004/00054 d D 3.4 87/02/05 15:41:43 build 6 5 c added comments, changed clobber, added '-c' to cc lines. -mkm e s 00037/00012/00021 d D 3.3 87/02/05 09:42:43 build 5 4 c fixed error where I failed to ld. -mkm e s 00003/00000/00030 d D 3.2 87/01/29 15:56:21 build 4 3 c added dependancies on included files. -mkm e s 00000/00000/00030 d D 3.1 87/01/21 17:59:30 mkm 3 2 c e s 00000/00000/00030 d D 2.1 87/01/20 16:33:55 mkm 2 1 c e s 00030/00000/00000 d D 1.1 87/01/19 16:36:10 mkm 1 0 c Placed under source control - mkm e u U f b f n t T I 1 # " %W% %E% " D 5 include ../libenviron.h E 5 # # makefile for libc/ridge/crt # # D 5 LPOPTS = -b crt ASSEMBLE = $(AS) -I$(INC) $< LINK = $(LD) -r -x $*.o E 5 I 5 # during actual production of libc, $LIBC will be passed in on the MAKE's # command line, which overrides the definition in this makefile. I 8 ASFLAGS2 = -DARGSINREGS -DLINK=r15 E 8 LIBC= libc.a I 10 D 12 # passed in on the MAKE command line, overrides this definition MCOUNT= ../mcount.def E 12 I 12 # passed in for the profiled library MCOUNT= E 12 E 10 I 10 E 10 I 6 # We can't use the default suffix rules because they would omit the ld. .s~.a: $(GET) $(GFLAGS) -p $< > $*.s D 9 $(AS) -I$(INC) $*.s E 9 I 9 D 10 $(AS) -I$(INC) $(ASFLAGS) $*.s E 9 $(LD) -r -x $*.o E 10 I 10 D 11 $(M4) MCOUNT $*.s > tmp.s E 11 I 11 $(M4) $(MCOUNT) $*.s > tmp.s E 11 $(AS) -I$(INC) $(ASFLAGS) tmp.s $(LD) -r -x tmp.o E 10 mv a.out $*.o $(AR) r $@ $*.o D 10 rm -f $*.[so] E 10 I 10 rm -f $*.[so] tmp.[os] E 10 E 6 E 5 .s.a: D 5 $(ASSEMBLE) $(LINK) E 5 I 5 D 9 $(AS) -I$(INC) $< E 9 I 9 D 10 $(AS) -I$(INC) $(ASFLAGS) $< E 9 $(LD) -r -x $*.o E 10 I 10 D 11 $(M4) MCOUNT $*.s > tmp.s E 11 I 11 $(M4) $(MCOUNT) $*.s > tmp.s E 11 $(AS) -I$(INC) $(ASFLAGS) tmp.s $(LD) -r -x tmp.o E 10 E 5 mv a.out $*.o D 6 ar r $@ $*.o D 5 rm $*.o E 5 I 5 rm -f $*.[so] E 6 I 6 $(AR) r $@ $*.o D 10 rm -f $*.o E 10 I 10 rm -f $*.o tmp.[os] E 10 E 6 E 5 I 6 .c~.a: $(GET) $(GFLAGS) -p $< > $*.c $(CC) $(CFLAGS) $*.c $(LD) -r -x $*.o mv a.out $*.o $(AR) r $@ $*.o rm -f $*.[co] E 6 I 5 .c.a: $(CC) $(CFLAGS) $< $(LD) -r -x $*.o mv a.out $*.o D 6 ar r $@ $*.o rm -f $*.[co] E 6 I 6 $(AR) r $@ $*.o rm -f $*.o E 6 E 5 OBJECTS=\ $(LIBC)(cerror.o) $(LIBC)(mcount.o) $(LIBC)(udiv.o)\ $(LIBC)(urem.o) I 5 E 5 $(LIBC): $(OBJECTS) I 4 D 5 $(LIBC)(udiv.o): $(INC)/sys/ass.h E 5 I 5 all: $(LIBC) E 5 D 5 $(LIBC)(urem.o): $(INC)/sys/ass.h E 5 I 5 test: E 5 E 4 I 5 install: E 5 listing: D 5 $(LL) > list $(PR) list $(MK) *.s | $(LPR) $(LPOPTS) rm list E 5 I 5 clean: -rm -f *.o clobber: clean I 6 -rm -f libc.a E 6 WHAT: what $(LIBC) # included file dependancies start here $(LIBC)(udiv.o): $(INC)/sys/ass.h $(LIBC)(urem.o): $(INC)/sys/ass.h E 5 E 1 h62033 s 00000/00000/00017 d D 4.4 87/04/10 15:29:33 mth 7 6 c Profiling changes e s 00005/00008/00012 d D 4.3 87/04/09 15:41:01 mth 6 5 c Profiling e s 00002/00002/00018 d D 4.2 87/02/17 10:43:01 mth 5 4 c Parameters in registers e s 00000/00000/00020 d D 4.1 87/02/17 09:53:11 mth 4 3 c rolled rev to -r4 (mth) e s 00000/00000/00020 d D 3.1 87/01/21 17:59:31 mkm 3 2 c e s 00000/00000/00020 d D 2.1 87/01/20 16:33:56 mkm 2 1 c e s 00020/00000/00000 d D 1.1 87/01/19 16:36:10 mkm 1 0 c Placed under source control - mkm e u U f b f n t T I 1 ; " %W% %E% " D 6 ; ; E 6 dsect data global _errno D 6 csect code global cerror dsect data E 6 align 4 D 6 _errno: word 00H E 6 I 6 _errno: word 0 E 6 csect code I 6 global cerror E 6 D 5 align 2 E 5 I 5 align 4 I 6 word 0 ;framesize (for sdb) word 0 ;#args (for sdb) E 6 E 5 cerror: I 6 ; MCOUNT E 6 store r1,_errno,L ; save error in errno noti r0,0 ; return with -1 D 5 ret r11,r11 E 5 I 5 ret LINK,LINK E 5 E 1 h10558 s 00000/00000/00049 d D 4.6 87/04/10 15:29:34 mth 9 8 c Profiling changes e s 00001/00001/00048 d D 4.5 87/04/09 17:50:01 mth 8 7 c 'incr' -> 'inc' e s 00001/00001/00048 d D 4.4 87/04/09 16:32:53 mth 7 6 c m4 uses 'incr', change 'incr' label to 'inc' e s 00016/00006/00033 d D 4.3 87/03/26 15:29:22 mth 6 5 c fix for parameters in registers e s 00000/00000/00039 d D 4.2 87/02/17 10:43:02 mth 5 4 c Parameters in registers e s 00000/00000/00039 d D 4.1 87/02/17 09:53:14 mth 4 3 c rolled rev to -r4 (mth) e s 00000/00000/00039 d D 3.1 87/01/21 17:59:32 mkm 3 2 c e s 00000/00000/00039 d D 2.1 87/01/20 16:33:57 mkm 2 1 c e s 00039/00000/00000 d D 1.1 87/01/19 16:36:11 mkm 1 0 c Placed under source control - mkm e u U f b f n t T I 1 ; " %W% %E% " ; count subroutine called during profiling ; D 6 ; calling sequence: laddr r0,a_word,l ; call r1,mcount,l E 6 I 6 ; calling sequence: laddr r6,a_word,l ; call r5,mcount,l E 6 ; dsect data ; a_word: ; word 0 ; I 6 framesz equ 8 ; stack frame size E 6 global mcount global __countbase I 6 align 4 word framesz ;framesize word 1 ;#args E 6 mcount: D 6 load r2,r0,0 ; a_word to r2 E 6 I 6 sub r14,framesz ; need space to store scratch regs stored r2,r14 ; save r2/r3 load r2,r6,0 ; a_word to r2 E 6 D 8 br r2 <> 0,incr ; skip initialization if not zero E 8 I 8 br r2 <> 0,inc ; skip initialization if not zero E 8 load r2,__countbase,l ; get stack base in r2 br r2 = 0,return ; return if counting not turned on yet laddr r3,r2,8 ; allocate a new pc,count pair store r3,__countbase,l D 6 store r1,r2,0 ; remember pc E 6 I 6 store r5,r2,0 ; remember pc E 6 addi r2,4 load r3,__countmax,l br r2 <= r3,ok movei r3,0 store r3,__countbase,l ok: D 6 store r2,r0,0 ; store &pair+4 in a_word E 6 I 6 store r2,r6,0 ; store &pair+4 in a_word E 6 D 7 incr: E 7 I 7 inc: E 7 load r3,r2,0 ; count function call addi r3,1 store r3,r2,0 return: D 6 ret r1,r1 E 6 I 6 loadd r2,r14 ; restore r2/r3 add r14,framesz ret r5,r5 E 6 E 1 ; " @(#)mcount.s 4.6 87/04/10 " ; count subroutine called during profiling ; ; calling sequence: laddr r6,a_word,l ; call r5,mcount,l ; dsect data ; a_word: ; word 0 ; framesz equ 8 ; stack frame size global mcount global __countbase align 4 word framesz ;framesize word 1 ;#args mcount: sub r14,framesz ; need space to store scratch regs stored r2,r14 ; save r2/r3 load r2,r6,0 ; a_word to r2 br r2 <> 0,inc ; skip initialization if not zero load r2,__countbase,l ; get stack base in r2 br r2 = 0,return ; return if counting not turned on yet laddr r3,r2,8 ; allocate a new pc,count pair store r3,__countbase,l store r5,r2,0 ; remember pc addi r2,4 load r3,__countmax,l br r2 <= r3,ok movei r3,0 store r3,__countbase,l ok: store r2,r6,0 ; store &pair+4 in a_word inc: load r3,r2,0 ; count function call addi r3,1 store r3,r2,0 return: loadd r2,r14 ; restore r2/r3 add r14,framesz ret r5,r5 ].U..^s.crt0.s_s.mcrt0.s`s.prof.cas.Makefilebmcrt0.scprof.ch13619 s 00001/00000/00070 d D 4.3 87/04/03 09:29:44 mth 6 5 c add "ret LINK,LINK" so sdb can find the end of __startup e s 00015/00002/00055 d D 4.2 87/02/17 10:45:52 mth 5 4 c Parameters in registers e s 00000/00000/00057 d D 4.1 87/02/17 09:54:01 mth 4 3 c rolled rev to -r4 (mth) e s 00000/00000/00057 d D 3.1 87/01/20 16:35:58 mkm 3 2 c e s 00000/00000/00057 d D 2.1 87/01/20 16:34:32 mkm 2 1 c e s 00057/00000/00000 d D 1.1 87/01/19 16:36:50 mkm 1 0 c Placed under source control - mkm e u U f b f n t T I 1 ; " %W% %E% " ; C runtime startup code ; #include "../sys/sysent.h" dsect data global _environ csect code global __startup global _exit global _main align 2 __startup: ; ; Upon entry r14 contains the address of argc ; and r14 + 4 contains &argv[0] ; and r14 + 8 contains &argv[1] -- etc ; laddr r0,__nd,L load r1,r0 laddr r2,4095 laddr r3,0f000H add r1,r2 and r1,r3 store r1,r0 move r1,r14 laddr r14,r14,-48,L noti r0,7 and r14,r0 I 5 #ifdef ARGSINREGS E 5 load r0,r1,0 ; get argc I 5 addi r1,4 ; point to argv[0] move r2,r1 arg: load r3,r2,0 addi r2,4 br r3<>0,arg! store r2,_environ,L ; save envp at environ #else load r0,r1,0 ; get argc E 5 store r0,r14,24 ; store argc at argc for main addi r1,4 ; point to argv[0] store r1,r14,32 ; store the &argv[0] at argv for main arg: load r0,r1,0 ; get the contents of argv[x] addi r1,4 ; point to next argv br r0<>0,arg,L ; addi r1,4 ; point to first envp store r1,r14,40 ; store the &envp[0] at argv for main store r1,_environ,L ; save envp at environ I 5 #endif E 5 D 5 call r11,_main,L ; execute main E 5 I 5 call LINK,_main,L ; execute main E 5 movei r0,0 I 5 #ifndef ARGSINREGS E 5 store r0,r14,24 D 5 call r11,_exit,L ; execute ending code E 5 I 5 #endif call LINK,_exit,L ; execute ending code E 5 laddr r0,SYSC_EXIT ; get syscall number kcall Xsyscall ; call kernel ; ; NEVER GET HERE I 6 ret LINK,LINK ; help sdb find the end of this routine E 6 dsect data align 4 _environ: word 0000H E 1 h40623 s 00018/00000/00058 d D 4.4 87/05/04 17:24:14 build 7 6 c added ARGSINREGS stuff, somewhat belatedly. -mkm e s 00001/00000/00057 d D 4.3 87/04/03 09:29:46 mth 6 5 c add "ret LINK,LINK" so sdb can find the end of __startup e s 00002/00002/00055 d D 4.2 87/02/17 10:45:54 mth 5 4 c Parameters in registers e s 00000/00000/00057 d D 4.1 87/02/17 09:54:06 mth 4 3 c rolled rev to -r4 (mth) e s 00000/00000/00057 d D 3.1 87/01/20 16:35:59 mkm 3 2 c e s 00000/00000/00057 d D 2.1 87/01/20 16:34:33 mkm 2 1 c e s 00057/00000/00000 d D 1.1 87/01/19 16:36:52 mkm 1 0 c Placed under source control - mkm e u U f b f n t T I 1 ; " %W% %E% " ; C runtime startup code ; #include "../sys/sysent.h" dsect data global _environ csect code global ___startup global _exit global __mcrt0 align 2 ___startup: ; ; Upon entry r14 contains the address of argc ; and r14 + 4 contains &argv[0] ; and r14 + 8 contains &argv[1] -- etc ; laddr r0,__nd,L load r1,r0 laddr r2,4095 laddr r3,0f000H add r1,r2 and r1,r3 store r1,r0 move r1,r14 laddr r14,r14,-48,L noti r0,7 and r14,r0 load r0,r1,0 ; get argc I 7 #ifdef ARGSINREGS ;;; store r0,r14,24 ; store argc at argc for main addi r1,4 ; point to argv[0] ;;; store r1,r14,32 ; store the &argv[0] at argv for main move r2,r1 arg: load r3,r2,0 ; get the contents of argv[x] addi r2,4 ; point to next argv br r3<>0,arg,L ; addi r2,4 ; point to first envp ;;; store r2,r14,40 ; store the &envp[0] at argv for main store r2,_environ,L ; save envp at environ #else E 7 store r0,r14,24 ; store argc at argc for main addi r1,4 ; point to argv[0] store r1,r14,32 ; store the &argv[0] at argv for main arg: load r0,r1,0 ; get the contents of argv[x] addi r1,4 ; point to next argv br r0<>0,arg,L ; addi r1,4 ; point to first envp store r1,r14,40 ; store the &envp[0] at argv for main store r1,_environ,L ; save envp at environ I 7 #endif E 7 D 5 call r11,__mcrt0,L ; execute main E 5 I 5 call LINK,__mcrt0,L ; execute main E 5 movei r0,0 I 7 #ifndef ARGSINREGS E 7 store r0,r14,24 I 7 #endif E 7 D 5 call r11,_exit,L ; execute ending code E 5 I 5 call LINK,_exit,L ; execute ending code E 5 laddr r0,SYSC_EXIT ; get syscall number kcall Xsyscall ; call kernel ; ; NEVER GET HERE I 6 ret LINK,LINK ; help sdb find the end of this routine E 6 dsect data align 4 _environ: word 0000H E 1 h55115 s 00001/00001/00017 d D 4.2 87/05/13 19:18:41 build 5 4 c removed old SCCS strings and inserted #ident BB e s 00000/00000/00018 d D 4.1 87/02/17 09:54:10 mth 4 3 c rolled rev to -r4 (mth) e s 00000/00000/00018 d D 3.1 87/01/20 16:35:56 mkm 3 2 c e s 00000/00000/00018 d D 2.1 87/01/20 16:34:34 mkm 2 1 c e s 00018/00000/00000 d D 1.1 87/01/19 16:36:52 mkm 1 0 c Placed under source control - mkm e u U f b f n t T I 1 D 5 /* " %W% %E% " */ E 5 I 5 #ident " %W% %E% " E 5 #include #include #define CBUFS 600 extern long etext,btext; _mcrt0(argc,argv,envp) char *argv[],*envp[]; long argc; { long a,i; char *b; a=((long)&etext-(long)&btext); a = a + sizeof(struct cnt) * CBUFS + sizeof(struct hdr); b=sbrk(a); monitor(&btext,&etext,b,a>>1,CBUFS); main((int)argc,argv,envp); } E 1 h50805 s 00001/00002/00049 d D 4.4 87/03/18 02:43:53 build 11 10 c added crt0.s to clobber section. -mkm e s 00002/00002/00049 d D 4.3 87/02/17 13:34:48 mth 10 9 c Add ASFLAGS usage to assembly lines. e s 00002/00000/00049 d D 4.2 87/02/17 10:44:54 mth 9 8 c Parameters in registers. e s 00000/00000/00049 d D 4.1 87/02/17 09:53:58 mth 8 7 c rolled rev to -r4 (mth) e s 00006/00009/00043 d D 3.5 87/02/05 11:55:57 build 7 6 c repaired install option and clobber. -mkm e s 00028/00020/00024 d D 3.4 87/02/05 10:25:00 build 6 5 c changed install. -mkm e s 00000/00001/00044 d D 3.3 87/02/03 18:18:57 mkm 5 4 c removed reference to libenv file. -mkm e s 00009/00010/00036 d D 3.2 87/01/29 15:43:31 build 4 3 c added dependancies for included files, .s~.s suffix rule. -mkm e s 00000/00000/00046 d D 3.1 87/01/20 16:35:56 mkm 3 2 c e s 00000/00000/00046 d D 2.1 87/01/20 16:35:36 mkm 2 1 c e s 00046/00000/00000 d D 1.1 87/01/19 16:36:49 mkm 1 0 c Placed under source control - mkm e u U f b f n t T I 1 # " %W% %E% " D 5 include ../libenviron.h E 5 # # makefile for libc/csu # # I 9 ASFLAGS2 = -DARGSINREGS -DLINK=r15 E 9 I 7 # there currently is no default .s~.s rule. .s~.s: $(GET) $(GFLAGS) -p $< > $*.s E 7 D 6 LPOPTS= -tCSU ASSEMBLE = $(AS) -I$(INC) $< LINK = $(LD) -r -x $*.o D 4 COMPILE = $(CC) $(CFLAGS) $< E 4 I 4 .s~.s: $(GET) $(GFLAGS) -p $< > $*.s E 4 E 6 I 6 # we don't use the default .s.o rule because it omits the ld step. E 6 .s.o: D 6 rm -f $(SPX)/lib/$@ $(ASSEMBLE) $(LINK) E 6 I 6 D 10 $(AS) -I$(INC) $< E 10 I 10 $(AS) -I$(INC) $(ASFLAGS) $< E 10 $(LD) -r -x $*.o E 6 mv a.out $@ D 6 ln $@ $(SPX)/lib/$@ E 6 D 4 .c.a: $(COMPILE) $(LINK) mv a.out $*.o ar r $(LIBC) $*.o rm $*.o E 4 OBJECTS=\ crt0.o mcrt0.o all: $(OBJECTS) I 7 mv $(OBJECTS) .. E 7 D 4 mcrt0.o: mcrt0.s prof.o E 4 I 4 mcrt0.o: mcrt0.s prof.o ../sys/sysent.h E 4 D 6 rm -f $(SPX)/lib/$@ $(ASSEMBLE) E 6 I 6 D 10 $(AS) -I$(INC) $< E 10 I 10 $(AS) -I$(INC) $(ASFLAGS) $< E 10 E 6 $(LD) -r -x $@ prof.o I 4 rm -f prof.o E 4 mv a.out $@ D 6 ln $@ $(SPX)/lib/$@ E 6 I 4 D 6 prof.o: $(INC)/mon.h $(INC)/stdio.h E 6 I 6 D 11 test: E 11 E 6 D 6 crt0.o: ../sys/sysent.h E 6 I 6 install: D 7 mv -f crt0.o $(SPX)/lib chmod 744 $(SPX)/lib/crt0.o chgrp bin $(SPX)/lib/crt0.o chown bin $(SPX)/lib/crt0.o E 7 E 6 I 6 D 7 mv -f mcrt0.o $(SPX)/lib chmod 744 $(SPX)/lib/mcrt0.o chgrp bin $(SPX)/lib/mcrt0.o chown bin $(SPX)/lib/mcrt0.o E 7 E 6 E 4 listing: D 6 $(LL) > list $(PR) list $(MK) *.s *.c | $(LPR) $(LPOPTS) rm list E 6 clean: D 4 rm -f *.o E 4 I 4 D 6 rm -f *.o mcrt0.s E 6 I 6 -rm -f *.o clobber: clean I 7 D 11 -rm -f mcrt0.s E 11 I 11 -rm -f mcrt0.s crt0.s E 11 E 7 WHAT: what $(OBJECTS) # included file dependancies start here prof.o: $(INC)/mon.h $(INC)/stdio.h crt0.o: ../sys/sysent.h E 6 E 4 E 1 ; " @(#)mcrt0.s 4.4 87/05/04 " ; C runtime startup code ; #include "../sys/sysent.h" dsect data global _environ csect code global ___startup global _exit global __mcrt0 align 2 ___startup: ; ; Upon entry r14 contains the address of argc ; and r14 + 4 contains &argv[0] ; and r14 + 8 contains &argv[1] -- etc ; laddr r0,__nd,L load r1,r0 laddr r2,4095 laddr r3,0f000H add r1,r2 and r1,r3 store r1,r0 move r1,r14 laddr r14,r14,-48,L noti r0,7 and r14,r0 load r0,r1,0 ; get argc #ifdef ARGSINREGS ;;; store r0,r14,24 ; store argc at argc for main addi r1,4 ; point to argv[0] ;;; store r1,r14,32 ; store the &argv[0] at argv for main move r2,r1 arg: load r3,r2,0 ; get the contents of argv[x] addi r2,4 ; point to next argv br r3<>0,arg,L ; addi r2,4 ; point to first envp ;;; store r2,r14,40 ; store the &envp[0] at argv for main store r2,_environ,L ; save envp at environ #else store r0,r14,24 ; store argc at argc for main addi r1,4 ; point to argv[0] store r1,r14,32 ; store the &argv[0] at argv for main arg: load r0,r1,0 ; get the contents of argv[x] addi r1,4 ; point to next argv br r0<>0,arg,L ; addi r1,4 ; point to first envp store r1,r14,40 ; store the &envp[0] at argv for main store r1,_environ,L ; save envp at environ #endif call LINK,__mcrt0,L ; execute main movei r0,0 #ifndef ARGSINREGS store r0,r14,24 #endif call LINK,_exit,L ; execute ending code laddr r0,SYSC_EXIT ; get syscall number kcall Xsyscall ; call kernel ; ; NEVER GET HERE ret LINK,LINK ; help sdb find the end of this routine dsect data align 4 _environ: word 0000H #ident " @(#)prof.c 4.2 87/05/13 " #include #include #define CBUFS 600 extern long etext,btext; _mcrt0(argc,argv,envp) char *argv[],*envp[]; long argc; { long a,i; char *b; a=((long)&etext-(long)&btext); a = a + sizeof(struct cnt) * CBUFS + sizeof(struct hdr); b=sbrk(a); monitor(&btext,&etext,b,a>>1,CBUFS); main((int)argc,argv,envp); } d.U..ea64l.sfecvt.ogs.assert.chs.atof.cis.atoi.cjs.atol.cks.bsearch.cls.calloc.cms.clock.cns.crypt.cos.ctime.cpold}s.ctype.c~s.cuexit.ss.dial.cs.drand48.cs.ecvt.cs.errlst.cs.execvp.cs.fakcu.cs.frexp.cs.ftok.cs.ftw.cs.gcvt.cs.getcwd.cs.getenv.cs.getgrent.cs.getgrgid.cs.getgrnam.cs.getlogin.cs.getopt.cs.getpw.cs.getpwent.cs.getpwnam.cs.getpwuid.cs.getut.cs.hsearch.cs.isatty.cs.l3.cs.l64a.cs.ldexp.cs.lfind.cs.libc.cs.lsearch.cs.malloc.cs.memccpy.cs.memchr.cs.memcmp.cs.memcpy.cs.memset.cs.mktemp.cs.modf.cs.mon.cs.nlist.cs.perror.cs.putenv.cs.putpwent.cs.qsort.cs.rand.cs.setjmp.ss.sleep.cs.ssignal.cs.strcat.ss.strchr.ss.strcmp.ss.strcpy.ss.strcspn.ss.strlen.ss.strncat.ss.strncmp.ss.strncpy.ss.strpbrk.ss.strrchr.ss.strspn.ss.strtod.cs.strtok.cs.strtol.cs.swab.cs.tell.cs.tfind.cs.tolower.cs.toupper.cs.tsearch.cs.ttyname.cs.ttyslot.cs.Makefiles.a64l.cs.abort.cs.abs.catof.cs.ri.sa64l.cs.fpround.cu ?$ .textxd .dataxx`@.bssXP~Hpx(,^~HPPWP~Hpx(,~HPPW`8@~Hpސ 0:'T  2p p(((p  :bްx  (p  C@:< 6p  :@$: @$0 1 P@$`^P5XaP:W^XP60@ 0954p  @$: ?5 P?:B 5p  5 @$0: ( &( &:( 0 &009 4 @$05p (  5(T؊ &1  &0  9( ~Hɞ@ɾ8``WFn CAy7Aׄ@È@Y@$$8 ^.textx.datax`.bssX_ecvtm_fcvtHmm_Reduce_infh18300 s 00001/00001/00028 d D 4.2 87/05/13 19:20:48 build 5 4 c removed old SCCS strings and inserted #ident BB e s 00000/00000/00029 d D 4.1 87/02/17 09:55:07 mth 4 3 c rolled rev to -r4 (mth) e s 00000/00000/00029 d D 3.1 87/01/20 16:54:25 mkm 3 2 c e s 00000/00000/00029 d D 2.1 87/01/20 16:47:53 mkm 2 1 c e s 00029/00000/00000 d D 1.1 87/01/19 16:38:00 mkm 1 0 c Placed under source control - mkm e u U f b f n t T I 1 D 5 /* " %W% %E% " */ E 5 I 5 #ident " %W% %E% " E 5 /*LINTLIBRARY*/ /* * called from "assert" macro; prints without printf or stdio. */ #define WRITE(s, n) (void) write(2, (s), (n)) #define WRITESTR(s1, n, s2) WRITE((s1), n), \ WRITE((s2), (unsigned) strlen(s2)) _assert(assertion, filename, line_num) char *assertion; char *filename; int line_num; { static char linestr[] = ", line NNNNN\n"; register char *p = &linestr[7]; register int div, digit; WRITESTR("Assertion failed: ", 18, assertion); WRITESTR(", file ", 7, filename); for (div = 10000; div != 0; line_num %= div, div /= 10) if ((digit = line_num/div) != 0 || p != &linestr[7] || div == 1) *p++ = digit + '0'; *p++ = '\n'; *p = '\0'; WRITE(linestr, (unsigned) strlen(linestr)); (void) abort(); } E 1 h47608 s 00001/00001/00187 d D 4.2 87/05/13 19:21:06 build 5 4 c removed old SCCS strings and inserted #ident BB e s 00000/00000/00188 d D 4.1 87/02/17 09:55:12 mth 4 3 c rolled rev to -r4 (mth) e s 00000/00000/00188 d D 3.1 87/01/20 16:54:26 mkm 3 2 c e s 00000/00000/00188 d D 2.1 87/01/20 16:47:56 mkm 2 1 c e s 00188/00000/00000 d D 1.1 87/01/19 16:38:01 mkm 1 0 c Placed under source control - mkm e u U f b f n t T I 1 D 5 /* " %W% %E% " */ E 5 I 5 #ident " %W% %E% " E 5 /*LINTLIBRARY*/ /* * C library - ascii to floating (atof) and string to double (strtod) * * This version compiles both atof and strtod depending on the value * of STRTOD, which is set in the file and may be overridden on the * "cc" command line. The only difference is the storage of a pointer * to the character which terminated the conversion. * Long-integer accumulation is used, except on the PDP11, where * "long" arithmetic is simulated, so floating-point is much faster. */ #ifndef STRTOD #define STRTOD 0 #endif #include #include extern double ldexp(); #if u3b || u3b5 # define POW1_25LEN 9 #else # define POW1_25LEN 10 #endif static double pow1_25[POW1_25LEN] = { 0.0 }; #if STRTOD #define STORE_PTR (*ptr = p) #define GOT_DIGIT (got_digit++) #define RET_ZERO(val) if (!got_digit) return (0.0) double strtod(p, ptr) register char *p; char **ptr; #else #define STORE_PTR #define GOT_DIGIT #define RET_ZERO(val) if (!val) return (0.0) double atof(p) register char *p; #endif { register int c; int exp = 0, neg_val = 0; double fl_val; #if STRTOD int got_digit = 0; char *dummy; if (ptr == (char **)0) ptr = &dummy; /* harmless dumping place */ STORE_PTR; #endif while (isspace(c = *p)) /* eat leading white space */ p++; switch (c) { /* process sign */ case '-': neg_val++; case '+': /* fall-through */ p++; } { /* accumulate value */ #if pdp11 /* "long" arithmetic on the PDP-11 is simulated using int's and * is outrageously slow, so the accumulation is done using double's */ register int decpt = 0; fl_val = 0.0; while (isdigit(c = *p++) || c == '.' && !decpt++) { if (c == '.') continue; GOT_DIGIT; exp -= decpt; /* decr exponent if dec point seen */ if (fl_val < 2.0 * MAXPOWTWO) fl_val = 10.0 * fl_val + (double)(c - '0'); else exp++; } RET_ZERO(fl_val); #else register long high = 0, low = 0, scale = 1; register int decpt = 0, nzeroes = 0; while (isdigit(c = *p++) || c == '.' && !decpt++) { if (c == '.') continue; GOT_DIGIT; if (decpt) { /* handle trailing zeroes specially */ if (c == '0') { /* ignore zero for now */ nzeroes++; continue; } while (nzeroes > 0) { /* put zeroes back in */ exp--; if (high < MAXLONG/10) { high *= 10; } else if (scale < MAXLONG/10) { scale *= 10; low *= 10; } else exp++; nzeroes--; } exp--; /* decr exponent if decimal pt. seen */ } if (high < MAXLONG/10) { high *= 10; high += c - '0'; } else if (scale < MAXLONG/10) { scale *= 10; low *= 10; low += c - '0'; } else exp++; } RET_ZERO(high); fl_val = (double)high; if (scale > 1) fl_val = (double)scale * fl_val + (double)low; #endif } STORE_PTR; /* in case there is no legitimate exponent */ if (c == 'E' || c == 'e') { /* accumulate exponent */ register int e_exp = 0, neg_exp = 0; switch (*p) { /* process sign */ case '-': neg_exp++; case '+': /* fall-through */ case ' ': /* many FORTRAN environments generate this! */ p++; } if (isdigit(c = *p)) { /* found a legitimate exponent */ do { /* limit outrageously large exponents */ if (e_exp < DMAXEXP) e_exp = 10 * e_exp + c - '0'; } while (isdigit(c = *++p)); if (neg_exp) exp -= e_exp; else exp += e_exp; STORE_PTR; } } #if STRTOD if (!fl_val) /* atof will already have returned, but strtod had */ return (fl_val); /* to find the end of the exponent first */ #endif /* * The following computation is done in two stages, * first accumulating powers of (10/8), then jamming powers of 8, * to avoid underflow in situations like the following (for * the DEC representation): 1.2345678901234567890e-37, * where exp would be about (-37 + -18) = -55, and the * value 10^(-55) can't be represented, but 1.25^(-55) can * be represented, and then 8^(-55) jammed via ldexp(). */ if (exp != 0) { /* apply exponent */ register double *powptr = pow1_25, fl_exp = fl_val; if (*powptr == 0.0) { /* need to initialize table */ *powptr = 1.25; for (; powptr < &pow1_25[POW1_25LEN - 1]; powptr++) powptr[1] = *powptr * *powptr; powptr = pow1_25; } if ((c = exp) < 0) { c = -c; fl_exp = 1.0; } if (c > DMAXEXP/2) /* outrageously large exponents */ c = DMAXEXP/2; /* will be handled by ldexp */ for ( ; ; powptr++) { /* binary representation of ints assumed; otherwise * replace (& 01) by (% 2) and (>>= 1) by (/= 2) */ if (c & 01) fl_exp *= *powptr; if ((c >>= 1) == 0) break; } fl_val = ldexp(exp < 0 ? fl_val/fl_exp : fl_exp, 3 * exp); } return (neg_val ? -fl_val : fl_val); /* apply sign */ } E 1 h05316 s 00001/00001/00038 d D 4.2 87/05/13 19:21:17 build 5 4 c removed old SCCS strings and inserted #ident BB e s 00000/00000/00039 d D 4.1 87/02/17 09:55:16 mth 4 3 c rolled rev to -r4 (mth) e s 00000/00000/00039 d D 3.1 87/01/20 16:54:28 mkm 3 2 c e s 00000/00000/00039 d D 2.1 87/01/20 16:47:58 mkm 2 1 c e s 00039/00000/00000 d D 1.1 87/01/19 16:38:01 mkm 1 0 c Placed under source control - mkm e u U f b f n t T I 1 D 5 /* " %W% %E% " */ E 5 I 5 #ident " %W% %E% " E 5 /*LINTLIBRARY*/ #include #define ATOI #ifdef ATOI typedef int TYPE; #define NAME atoi #else typedef long TYPE; #define NAME atol #endif TYPE NAME(p) register char *p; { register TYPE n; register int c, neg = 0; if (!isdigit(c = *p)) { while (isspace(c)) c = *++p; switch (c) { case '-': neg++; case '+': /* fall-through */ c = *++p; } if (!isdigit(c)) return (0); } for (n = '0' - c; isdigit(c = *++p); ) { n *= 10; /* two steps to avoid unnecessary overflow */ n += '0' - c; /* accum neg to avoid surprises at MAX */ } return (neg ? n : -n); } E 1 h05314 s 00001/00001/00038 d D 4.2 87/05/13 19:21:28 build 5 4 c removed old SCCS strings and inserted #ident BB e s 00000/00000/00039 d D 4.1 87/02/17 09:55:19 mth 4 3 c rolled rev to -r4 (mth) e s 00000/00000/00039 d D 3.1 87/01/20 16:54:29 mkm 3 2 c e s 00000/00000/00039 d D 2.1 87/01/20 16:48:00 mkm 2 1 c e s 00039/00000/00000 d D 1.1 87/01/19 16:38:02 mkm 1 0 c Placed under source control - mkm e u U f b f n t T I 1 D 5 /* " %W% %E% " */ E 5 I 5 #ident " %W% %E% " E 5 /*LINTLIBRARY*/ #include #define ATOL #ifdef ATOI typedef int TYPE; #define NAME atoi #else typedef long TYPE; #define NAME atol #endif TYPE NAME(p) register char *p; { register TYPE n; register int c, neg = 0; if (!isdigit(c = *p)) { while (isspace(c)) c = *++p; switch (c) { case '-': neg++; case '+': /* fall-through */ c = *++p; } if (!isdigit(c)) return (0); } for (n = '0' - c; isdigit(c = *++p); ) { n *= 10; /* two steps to avoid unnecessary overflow */ n += '0' - c; /* accum neg to avoid surprises at MAX */ } return (neg ? n : -n); } E 1 h22795 s 00001/00001/00033 d D 4.2 87/05/13 19:21:40 build 5 4 c removed old SCCS strings and inserted #ident BB e s 00000/00000/00034 d D 4.1 87/02/17 09:55:23 mth 4 3 c rolled rev to -r4 (mth) e s 00000/00000/00034 d D 3.1 87/01/20 16:54:30 mkm 3 2 c e s 00000/00000/00034 d D 2.1 87/01/20 16:48:01 mkm 2 1 c e s 00034/00000/00000 d D 1.1 87/01/19 16:38:03 mkm 1 0 c Placed under source control - mkm e u U f b f n t T I 1 D 5 /* " %W% %E% " */ E 5 I 5 #ident " %W% %E% " E 5 /*LINTLIBRARY*/ /* * Binary search algorithm, generalized from Knuth (6.2.1) Algorithm B. * */ typedef char *POINTER; POINTER bsearch(key, base, nel, width, compar) POINTER key; /* Key to be located */ POINTER base; /* Beginning of table */ unsigned nel; /* Number of elements in the table */ unsigned width; /* Width of an element (bytes) */ int (*compar)(); /* Comparison function */ { int two_width = width + width; POINTER last = base + width * (nel - 1); /* Last element in table */ while (last >= base) { register POINTER p = base + width * ((last - base)/two_width); register int res = (*compar)(key, p); if (res == 0) return (p); /* Key found */ if (res < 0) last = p - width; else base = p + width; } return ((POINTER) 0); /* Key not found */ } E 1 h57194 s 00001/00001/00027 d D 4.2 87/05/13 19:22:33 build 5 4 c removed old SCCS strings and inserted #ident BB e s 00000/00000/00028 d D 4.1 87/02/17 09:55:27 mth 4 3 c rolled rev to -r4 (mth) e s 00000/00000/00028 d D 3.1 87/01/20 16:54:31 mkm 3 2 c e s 00000/00000/00028 d D 2.1 87/01/20 16:48:01 mkm 2 1 c e s 00028/00000/00000 d D 1.1 87/01/19 16:38:03 mkm 1 0 c Placed under source control - mkm e u U f b f n t T I 1 D 5 /* " %W% %E% " */ E 5 I 5 #ident " %W% %E% " E 5 /*LINTLIBRARY*/ /* calloc - allocate and clear memory block */ #define NULL 0 extern char *malloc(), *memset(); extern void free(); char * calloc(num, size) unsigned num, size; { register char *mp; if((mp = malloc(num *= size)) != NULL) (void)memset(mp, 0, num); return(mp); } /*ARGSUSED*/ void cfree(p, num, size) char *p; unsigned num, size; { free(p); } E 1 h59783 s 00001/00001/00019 d D 4.2 87/05/13 19:22:44 build 5 4 c removed old SCCS strings and inserted #ident BB e s 00000/00000/00020 d D 4.1 87/02/17 09:55:32 mth 4 3 c rolled rev to -r4 (mth) e s 00000/00000/00020 d D 3.1 87/01/20 16:54:32 mkm 3 2 c e s 00000/00000/00020 d D 2.1 87/01/20 16:48:02 mkm 2 1 c e s 00020/00000/00000 d D 1.1 87/01/19 16:38:04 mkm 1 0 c Placed under source control - mkm e u U f b f n t T I 1 D 5 /* " %W% %E% " */ E 5 I 5 #ident " %W% %E% " E 5 /*LINTLIBRARY*/ #include #include #include /* for HZ (clock frequency in Hz) */ #define TIMES(B) (B.tms_utime+B.tms_stime+B.tms_cutime+B.tms_cstime) extern long times(); static long first = 0L; long clock() { struct tms buffer; if (times(&buffer) != -1L && first == 0L) first = TIMES(buffer); return ((TIMES(buffer) - first) * (1000000L/HZ)); } E 1 h56479 s 00001/00001/00268 d D 4.2 87/05/13 19:24:48 build 5 4 c removed old SCCS strings and inserted #ident BB e s 00000/00000/00269 d D 4.1 87/02/17 09:55:37 mth 4 3 c rolled rev to -r4 (mth) e s 00000/00000/00269 d D 3.1 87/01/20 16:54:32 mkm 3 2 c e s 00000/00000/00269 d D 2.1 87/01/20 16:48:03 mkm 2 1 c e s 00269/00000/00000 d D 1.1 87/01/19 16:38:05 mkm 1 0 c Placed under source control - mkm e u U f b f n t T I 1 D 5 /* " %W% %E% " */ E 5 I 5 #ident " %W% %E% " E 5 /*LINTLIBRARY*/ /* * This program implements a data encryption algorithm to encrypt passwords. */ static char IP[] = { 58,50,42,34,26,18,10, 2, 60,52,44,36,28,20,12, 4, 62,54,46,38,30,22,14, 6, 64,56,48,40,32,24,16, 8, 57,49,41,33,25,17, 9, 1, 59,51,43,35,27,19,11, 3, 61,53,45,37,29,21,13, 5, 63,55,47,39,31,23,15, 7, }; static char FP[] = { 40, 8,48,16,56,24,64,32, 39, 7,47,15,55,23,63,31, 38, 6,46,14,54,22,62,30, 37, 5,45,13,53,21,61,29, 36, 4,44,12,52,20,60,28, 35, 3,43,11,51,19,59,27, 34, 2,42,10,50,18,58,26, 33, 1,41, 9,49,17,57,25, }; static char PC1_C[] = { 57,49,41,33,25,17, 9, 1,58,50,42,34,26,18, 10, 2,59,51,43,35,27, 19,11, 3,60,52,44,36, }; static char PC1_D[] = { 63,55,47,39,31,23,15, 7,62,54,46,38,30,22, 14, 6,61,53,45,37,29, 21,13, 5,28,20,12, 4, }; static char shifts[] = { 1,1,2,2,2,2,2,2,1,2,2,2,2,2,2,1, }; static char PC2_C[] = { 14,17,11,24, 1, 5, 3,28,15, 6,21,10, 23,19,12, 4,26, 8, 16, 7,27,20,13, 2, }; static char PC2_D[] = { 41,52,31,37,47,55, 30,40,51,45,33,48, 44,49,39,56,34,53, 46,42,50,36,29,32, }; static char C[28]; static char D[28]; static char KS[16][48]; static char E[48]; static char e2[] = { 32, 1, 2, 3, 4, 5, 4, 5, 6, 7, 8, 9, 8, 9,10,11,12,13, 12,13,14,15,16,17, 16,17,18,19,20,21, 20,21,22,23,24,25, 24,25,26,27,28,29, 28,29,30,31,32, 1, }; void setkey(key) char *key; { register int i, j, k; int t; for(i=0; i < 28; i++) { C[i] = key[PC1_C[i]-1]; D[i] = key[PC1_D[i]-1]; } for(i=0; i < 16; i++) { for(k=0; k < shifts[i]; k++) { t = C[0]; for(j=0; j < 28-1; j++) C[j] = C[j+1]; C[27] = t; t = D[0]; for(j=0; j < 28-1; j++) D[j] = D[j+1]; D[27] = t; } for(j=0; j < 24; j++) { KS[i][j] = C[PC2_C[j]-1]; KS[i][j+24] = D[PC2_D[j]-28-1]; } } for(i=0; i < 48; i++) E[i] = e2[i]; } static char S[8][64] = { 14, 4,13, 1, 2,15,11, 8, 3,10, 6,12, 5, 9, 0, 7, 0,15, 7, 4,14, 2,13, 1,10, 6,12,11, 9, 5, 3, 8, 4, 1,14, 8,13, 6, 2,11,15,12, 9, 7, 3,10, 5, 0, 15,12, 8, 2, 4, 9, 1, 7, 5,11, 3,14,10, 0, 6,13, 15, 1, 8,14, 6,11, 3, 4, 9, 7, 2,13,12, 0, 5,10, 3,13, 4, 7,15, 2, 8,14,12, 0, 1,10, 6, 9,11, 5, 0,14, 7,11,10, 4,13, 1, 5, 8,12, 6, 9, 3, 2,15, 13, 8,10, 1, 3,15, 4, 2,11, 6, 7,12, 0, 5,14, 9, 10, 0, 9,14, 6, 3,15, 5, 1,13,12, 7,11, 4, 2, 8, 13, 7, 0, 9, 3, 4, 6,10, 2, 8, 5,14,12,11,15, 1, 13, 6, 4, 9, 8,15, 3, 0,11, 1, 2,12, 5,10,14, 7, 1,10,13, 0, 6, 9, 8, 7, 4,15,14, 3,11, 5, 2,12, 7,13,14, 3, 0, 6, 9,10, 1, 2, 8, 5,11,12, 4,15, 13, 8,11, 5, 6,15, 0, 3, 4, 7, 2,12, 1,10,14, 9, 10, 6, 9, 0,12,11, 7,13,15, 1, 3,14, 5, 2, 8, 4, 3,15, 0, 6,10, 1,13, 8, 9, 4, 5,11,12, 7, 2,14, 2,12, 4, 1, 7,10,11, 6, 8, 5, 3,15,13, 0,14, 9, 14,11, 2,12, 4, 7,13, 1, 5, 0,15,10, 3, 9, 8, 6, 4, 2, 1,11,10,13, 7, 8,15, 9,12, 5, 6, 3, 0,14, 11, 8,12, 7, 1,14, 2,13, 6,15, 0, 9,10, 4, 5, 3, 12, 1,10,15, 9, 2, 6, 8, 0,13, 3, 4,14, 7, 5,11, 10,15, 4, 2, 7,12, 9, 5, 6, 1,13,14, 0,11, 3, 8, 9,14,15, 5, 2, 8,12, 3, 7, 0, 4,10, 1,13,11, 6, 4, 3, 2,12, 9, 5,15,10,11,14, 1, 7, 6, 0, 8,13, 4,11, 2,14,15, 0, 8,13, 3,12, 9, 7, 5,10, 6, 1, 13, 0,11, 7, 4, 9, 1,10,14, 3, 5,12, 2,15, 8, 6, 1, 4,11,13,12, 3, 7,14,10,15, 6, 8, 0, 5, 9, 2, 6,11,13, 8, 1, 4,10, 7, 9, 5, 0,15,14, 2, 3,12, 13, 2, 8, 4, 6,15,11, 1,10, 9, 3,14, 5, 0,12, 7, 1,15,13, 8,10, 3, 7, 4,12, 5, 6,11, 0,14, 9, 2, 7,11, 4, 1, 9,12,14, 2, 0, 6,10,13,15, 3, 5, 8, 2, 1,14, 7, 4,10, 8,13,15,12, 9, 0, 3, 5, 6,11, }; static char P[] = { 16, 7,20,21, 29,12,28,17, 1,15,23,26, 5,18,31,10, 2, 8,24,14, 32,27, 3, 9, 19,13,30, 6, 22,11, 4,25, }; static char L[32], R[32]; static char tempL[32]; static char f[32]; static char preS[48]; void encrypt(block,fake) char *block; int fake; { int i; register int t, j, k; for(j=0; j < 64; j++) L[j] = block[IP[j]-1]; for(i=0; i < 16; i++) { for(j=0; j < 32; j++) tempL[j] = R[j]; for(j=0; j < 48; j++) preS[j] = R[E[j]-1] ^ KS[i][j]; for(j=0; j < 8; j++) { t = 6*j; k = S[j][(preS[t+0]<<5)+ (preS[t+1]<<3)+ (preS[t+2]<<2)+ (preS[t+3]<<1)+ (preS[t+4]<<0)+ (preS[t+5]<<4)]; t = 4*j; f[t+0] = (k>>3)&01; f[t+1] = (k>>2)&01; f[t+2] = (k>>1)&01; f[t+3] = (k>>0)&01; } for(j=0; j < 32; j++) R[j] = L[j] ^ f[P[j]-1]; for(j=0; j < 32; j++) L[j] = tempL[j]; } for(j=0; j < 32; j++) { t = L[j]; L[j] = R[j]; R[j] = t; } for(j=0; j < 64; j++) block[j] = L[FP[j]-1]; } char * crypt(pw, salt) char *pw, *salt; { register int c, i, j, k; int temp; static char block[66], iobuf[16]; for(i=0; i < 66; i++) block[i] = 0; for(i=0; (c= *pw) && i < 64; pw++) { for(j=0; j < 7; j++, i++) block[i] = (c>>(6-j)) & 01; i++; } setkey(block); for(i=0; i < 66; i++) block[i] = 0; for(i=0; i < 2; i++) { c = *salt++; iobuf[i] = c; if(c > 'Z') c -= 6; if(c > '9') c -= 7; c -= '.'; for(j=0; j < 6; j++) { if((c>>j) & 01) { temp = E[6*i+j]; E[6*i+j] = E[6*i+j+24]; E[6*i+j+24] = temp; } } } for(i=0; i < 25; i++) encrypt(block,0); for(i=0; i < 11; i++) { c = 0; for(j=0; j < 6; j++) { c <<= 1; c |= block[6*i+j]; } c += '.'; if(c > '9') c += 7; if(c > 'Z') c += 6; iobuf[i+2] = c; } iobuf[i+2] = 0; if(iobuf[1] == 0) iobuf[1] = iobuf[0]; return(iobuf); } E 1 h60757 s 00001/00001/00396 d D 4.3 87/05/13 19:25:01 build 6 5 c removed old SCCS strings and inserted #ident BB e s 00017/00013/00380 d D 4.2 87/04/17 15:02:18 build 5 4 c added fix for 1987 changes to daylight time rules. (ksm) e s 00000/00000/00393 d D 4.1 87/02/17 09:55:43 mth 4 3 c rolled rev to -r4 (mth) e s 00000/00000/00393 d D 3.1 87/01/20 16:54:34 mkm 3 2 c e s 00000/00000/00393 d D 2.1 87/01/20 16:48:04 mkm 2 1 c e s 00393/00000/00000 d D 1.1 87/01/19 16:38:06 mkm 1 0 c Placed under source control - mkm e u U f b f n t T I 1 D 6 /* " %W% %E% " */ E 6 I 6 #ident " %W% %E% " E 6 /*LINTLIBRARY*/ /* * This routine converts time as follows. * The epoch is 0000 Jan 1 1970 GMT. * The argument time is in seconds since then. * The localtime(t) entry returns a pointer to an array * containing * seconds (0-59) * minutes (0-59) * hours (0-23) * day of month (1-31) * month (0-11) * year-1970 * weekday (0-6, Sun is 0) * day of the year * daylight savings flag * * The routine corrects for daylight saving * time and will work in any time zone provided * "timezone" is adjusted to the difference between * Greenwich and local standard time (measured in seconds). * In places like Michigan "daylight" must * be initialized to 0 to prevent the conversion * to daylight time. D 5 * There is a table which accounts for the peculiarities * undergone by daylight time in 1974-1975 in the USA. E 5 * I 5 * Most of this routine is taken from 4.2 BSD. However, it contains * a workaround to account for the vagaries of daylight time legislation * in the USA, taken from a fix to System V.3. The dstab tables have been * reorganized to implement this fix; the structure format is the same but * the meanings of the entries are different. * E 5 * If TZ is set in the environment, it is decoded to get * timezone and DST information. * Otherwise, the routine calls the system to determine the local * timezone and whether Daylight Saving Time is permitted locally. * (DST is then determined by the current local rules) D 5 * Most information taken from BSD4.2 . E 5 * * The routine does not work * in Saudi Arabia which runs on Solar time. * * asctime(tvec) * where tvec is produced by localtime * returns a ptr to a character string * that has the ascii time in the form * Thu Jan 01 00:00:00 1970n0\\ * 01234567890123456789012345 * 0 1 2 * * ctime(t) just calls localtime, then asctime. * * tzset() looks for an environment variable named * TZ. It should be in the form "ESTn" or "ESTnEDT", * where "n" represents a string of digits with an optional * negative sign (for locations east of Greenwich, England). * If the variable is present, it will set the external * variables "timezone", "daylight", and "tzname" appropriately. * Otherwise, information is set from the kernel. * It is called by localtime, and * may also be called explicitly by the user. */ #define dysize(A) (((A)%4)? 365: 366) #include #include #include long timezone; int daylight; char *tzname[] = {"WIN", "SUM",}; struct tm *gmtime(), *localtime(); char *ctime(), *asctime(); void tzset(); static char cbuf[26]; static int dmsize[12]={31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}; /* * The following tables are used to determine DST change days */ struct dstab { int dayyr; int daylb; int dayle; }; /* * USA */ static struct dstab usdaytab[] = { D 5 1974, 5, 333, /* 1974: Jan 6 - last Sun. in Nov */ E 5 I 5 1987, 96, 303, /* New legislation: 1st Sun in Apr */ 1976, 119, 303, /* Normal: last Sun in Apr - last Sun in Oct */ E 5 1975, 58, 303, /* 1975: Last Sun. in Feb - last Sun in Oct */ D 5 0, 119, 303, /* all other years: end Apr - end Oct */ E 5 I 5 1974, 5, 333, /* 1974: Jan 6 - last Sun. in Nov */ 1970, 119, 303, /* all other years: end Apr - end Oct */ E 5 }; /* * Australia */ static struct dstab ausdaytab[] = { D 5 1970, 400, 0, /* 1970: no daylight saving at all */ 1971, 303, 0, /* 1971: daylight saving from Oct 31 */ E 5 I 5 1973, 303, 65, /* others: -> Mar 7, Oct 31 -> */ E 5 1972, 303, 58, /* 1972: Jan 1 -> Feb 27 & Oct 31 -> dec 31 */ D 5 0, 303, 65, /* others: -> Mar 7, Oct 31 -> */ E 5 I 5 1971, 303, 0, /* 1971: daylight saving from Oct 31 */ 1970, 400, 0, /* 1970: no daylight saving at all */ E 5 }; /* * The European tables * WE: Great Britain, Ireland, Portugal * ME: Belgium, Luxembourg, Netherlands, Denmark, Norway, * Austria, Poland, Czechoslovakia, Sweden, Switzerland, * DDR, DBR, France, Spain, Hungary, Italy, Jugoslavia * Eastern European dst is unknown, we'll make it ME until someone speaks up. * EE: Bulgaria, Finland, Greece, Rumania, Turkey, Western Russia */ static struct dstab wedaytab[] = { D 5 0, 89, 303, /* 1983: end March - end Oct */ E 5 I 5 1970, 89, 303, /* all: end March - end Oct */ E 5 }; static struct dstab medaytab[] = { D 5 0, 89, 272, /* 1983: end March - end Sep */ E 5 I 5 1970, 89, 272, /* all: end March - end Sep */ E 5 }; static struct dayrules { int dst_type; /* number obtained from system */ int dst_hrs; /* hours to add when dst on */ struct dstab * dst_rules; /* one of the above */ enum {STH,NTH} dst_hemi; /* southern, northern hemisphere */ } dayrules [] = { DST_USA, 1, usdaytab, NTH, DST_AUST, 1, ausdaytab, STH, DST_WET, 1, wedaytab, NTH, DST_MET, 1, medaytab, NTH, DST_EET, 1, medaytab, NTH, -1, }; static struct tznames { int timezone; /* lag west of Greenwich in minutes */ char winter[4]; /* Winter name */ char summer[4]; /* Summer name */ } tznames [] = { ZONE_MET, "MET", "EET", /* Europe : Middle */ ZONE_WET, "WET", "MET", /* Europe : Western */ ZONE_EET, "EET", "EET", /* Europe : Eastern */ ZONE_AST, "AST", "ADT", /* USA : Atlantic */ ZONE_EST, "EST", "EDT", /* USA : Eastern */ ZONE_CST, "CST", "CDT", /* USA : Central */ ZONE_MST, "MST", "MDT", /* USA : Mountain */ ZONE_PST, "PST", "PDT", /* USA : Pacific */ ZONE_EAT, "EST", "EST", /* Australia: Eastern */ ZONE_CAT, "CST", "CST", /* Australia: Central */ ZONE_WAT, "WST", " ", /* Australia: Western */ -1, }; char * ctime(t) long *t; { return(asctime(localtime(t))); } struct tm * localtime(tim) long *tim; { register int dayno, daylbegin, daylend; register struct tm *ct; long copyt; int year; register struct dayrules *dr; register struct dstab *ds; tzset(); copyt = *tim - timezone; ct = gmtime(©t); dayno = ct->tm_yday; for (dr = dayrules; dr->dst_type >= 0; dr++) if (dr->dst_type == daylight) break; if (dr->dst_type >= 0) { year = ct->tm_year + 1900; D 5 for (ds = dr->dst_rules; ds->dayyr; ds++) if (ds->dayyr == year) break; E 5 I 5 for (ds = dr->dst_rules; year < ds->dayyr; ds++) ; E 5 daylbegin= ds->daylb; /* first Sun after dst starts */ daylend = ds->dayle; /* first Sunday after DST ends */ daylbegin= sunday(ct, daylbegin); daylend = sunday(ct, daylend); switch (dr->dst_hemi) { case NTH: if (!( (dayno>daylbegin || (dayno==daylbegin && ct->tm_hour>=2)) && (daynotm_hour<1)) )) return(ct); break; case STH: if (!( (dayno>daylbegin || (dayno==daylbegin && ct->tm_hour>=2)) || (daynotm_hour<2)) )) return(ct); break; default: return(ct); } copyt += dr->dst_hrs*60*60; ct = gmtime(©t); ct->tm_isdst++; } return(ct); } /* * The argument is a 0-origin day number. * The value is the day number of the last * Sunday on or before the day. */ static int sunday(t, d) register struct tm *t; register int d; { if(d >= 58) d += dysize(t->tm_year) - 365; return(d - (d - t->tm_yday + t->tm_wday + 700) % 7); } struct tm * gmtime(tim) long *tim; { register int d0, d1; long hms, day; static struct tm xtime; /* * break initial number into days */ hms = *tim % 86400L; day = *tim / 86400L; if(hms < 0) { hms += 86400L; day -= 1; } /* * generate hours:minutes:seconds */ xtime.tm_sec = hms % 60; d1 = hms / 60; xtime.tm_min = d1 % 60; d1 /= 60; xtime.tm_hour = d1; /* * day is the day number. * generate day of the week. * The addend is 4 mod 7 (1/1/1970 was Thursday) */ xtime.tm_wday = (day + 7340036L) % 7; /* * year number */ if(day >= 0) for(d1=70; day >= dysize(d1); d1++) day -= dysize(d1); else for(d1=70; day < 0; d1--) day += dysize(d1-1); xtime.tm_year = d1; xtime.tm_yday = d0 = day; /* * generate month */ if(dysize(d1) == 366) dmsize[1] = 29; for(d1=0; d0 >= dmsize[d1]; d1++) d0 -= dmsize[d1]; dmsize[1] = 28; xtime.tm_mday = d0+1; xtime.tm_mon = d1; xtime.tm_isdst = 0; return(&xtime); } char * asctime(t) struct tm *t; { register char *cp, *ncp; register int *tp; char *ct_numb(); cp = cbuf; for(ncp = "Day Mon 00 00:00:00 1900\n"; *cp++ = *ncp++; ); ncp = &"SunMonTueWedThuFriSat"[3*t->tm_wday]; cp = cbuf; *cp++ = *ncp++; *cp++ = *ncp++; *cp++ = *ncp++; cp++; tp = &t->tm_mon; ncp = &"JanFebMarAprMayJunJulAugSepOctNovDec"[(*tp)*3]; *cp++ = *ncp++; *cp++ = *ncp++; *cp++ = *ncp++; cp = ct_numb(cp, *--tp); cp = ct_numb(cp, *--tp+100); cp = ct_numb(cp, *--tp+100); cp = ct_numb(cp, *--tp+100); if(t->tm_year >= 100) { cp[1] = '2'; cp[2] = '0'; } cp += 2; cp = ct_numb(cp, t->tm_year+100); return(cbuf); } static char * ct_numb(cp, n) register char *cp; int n; { cp++; if(n >= 10) *cp++ = (n/10)%10 + '0'; else *cp++ = ' '; *cp++ = n%10 + '0'; return(cp); } static struct timeb timebuf = {0, 0, 0, 0}; void tzset() { register char *p, *q; register int n; int sign; char *getenv(); register struct tznames *tz; if((p = getenv ("TZ")) && *p) { /* TZ is set : decode it*/ n = 3; q = tzname[0]; do { *q++ = *p? *p++: ' '; } while(--n); if(sign = *p == '-') p++; n = 0; while(*p >= '0' && *p <= '9') n = (n * 10) + *p++ - '0'; if(sign) n = -n; timezone = ((long)(n * 60)) * 60; if(daylight = *p != '\0') { daylight = DST_MET; /* arbitrary default */ q = tzname[1]; n = 3; do { *q++ = *p? *p++: ' '; } while(--n); } } else { /* TZ is not set : get info from the kernel */ if(timebuf.time == 0) ftime(&timebuf); timezone = (long)timebuf.timezone * 60; daylight = (int)timebuf.dstflag; for (tz = tznames; tz->timezone != -1; tz++) if (tz->timezone == timebuf.timezone) { p = &tz->winter[0]; q = tzname[0]; n = 3; do { *q++ = *p? *p++: ' '; } while(--n); p = &tz->summer[0]; q = tzname[1]; n = 3; do { *q++ = *p? *p++: ' '; } while(--n); } } } E 1 p.d..qs.strcat.crs.strchr.css.strcmp.cts.strcpy.cus.strcspn.cvs.strlen.cws.strncat.cxs.strncmp.cys.strncpy.czs.strpbrk.c{s.strrchr.c|s.strspn.ch46529 s 00001/00001/00020 d D 4.2 87/05/13 19:25:14 build 5 4 c removed old SCCS strings and inserted #ident BB e s 00000/00000/00021 d D 4.1 87/02/17 09:59:16 mth 4 3 c rolled rev to -r4 (mth) e s 00000/00000/00021 d D 3.1 87/01/20 16:55:32 mkm 3 2 c e s 00000/00000/00021 d D 2.1 87/01/20 16:49:22 mkm 2 1 c e s 00021/00000/00000 d D 1.1 87/01/19 16:38:46 mkm 1 0 c Placed under source control - mkm e u U f b f n t T I 1 D 5 /* " %W% %E% " */ E 5 I 5 #ident " %W% %E% " E 5 /*LINTLIBRARY*/ /* * Concatenate s2 on the end of s1. S1's space must be large enough. * Return s1. */ char * strcat(s1, s2) register char *s1, *s2; { register char *os1; os1 = s1; while(*s1++) ; --s1; while(*s1++ = *s2++) ; return(os1); } E 1 h45903 s 00001/00001/00018 d D 4.2 87/05/13 19:25:31 build 5 4 c removed old SCCS strings and inserted #ident BB e s 00000/00000/00019 d D 4.1 87/02/17 09:59:20 mth 4 3 c rolled rev to -r4 (mth) e s 00000/00000/00019 d D 3.1 87/01/20 16:55:33 mkm 3 2 c e s 00000/00000/00019 d D 2.1 87/01/20 16:49:23 mkm 2 1 c e s 00019/00000/00000 d D 1.1 87/01/19 16:38:47 mkm 1 0 c Placed under source control - mkm e u U f b f n t T I 1 D 5 /* " %W% %E% " */ E 5 I 5 #ident " %W% %E% " E 5 /*LINTLIBRARY*/ /* * Return the ptr in sp at which the character c appears; * NULL if not found */ #define NULL 0 char * strchr(sp, c) register char *sp, c; { do { if(*sp == c) return(sp); } while(*sp++); return(NULL); } E 1 h43405 s 00001/00001/00017 d D 4.2 87/05/13 19:25:43 build 5 4 c removed old SCCS strings and inserted #ident BB e s 00000/00000/00018 d D 4.1 87/02/17 09:59:24 mth 4 3 c rolled rev to -r4 (mth) e s 00000/00000/00018 d D 3.1 87/01/20 16:55:34 mkm 3 2 c e s 00000/00000/00018 d D 2.1 87/01/20 16:49:24 mkm 2 1 c e s 00018/00000/00000 d D 1.1 87/01/19 16:38:47 mkm 1 0 c Placed under source control - mkm e u U f b f n t T I 1 D 5 /* " %W% %E% " */ E 5 I 5 #ident " %W% %E% " E 5 /*LINTLIBRARY*/ /* * Compare strings: s1>s2: >0 s1==s2: 0 s1s2; >0 s1==s2; 0 s1= 0 && *s1 == *s2++) if(*s1++ == '\0') return(0); return((n < 0)? 0: (*s1 - *--s2)); } E 1 2h58612 s 00001/00001/00023 d D 4.2 87/05/13 19:27:02 build 5 4 c removed old SCCS strings and inserted #ident BB e s 00000/00000/00024 d D 4.1 87/02/17 09:59:50 mth 4 3 c rolled rev to -r4 (mth) e s 00000/00000/00024 d D 3.1 87/01/20 16:55:41 mkm 3 2 c e s 00000/00000/00024 d D 2.1 87/01/20 16:49:31 mkm 2 1 c e s 00024/00000/00000 d D 1.1 87/01/19 16:38:51 mkm 1 0 c Placed under source control - mkm e u U f b f n t T I 1 D 5 /* " %W% %E% " */ E 5 I 5 #ident " %W% %E% " E 5 /*LINTLIBRARY*/ /* * Return ptr to first occurance of any character from `brkset' * in the character string `string'; NULL if none exists. */ #define NULL (char *) 0 char * strpbrk(string, brkset) register char *string, *brkset; { register char *p; do { for(p=brkset; *p != '\0' && *p != *string; ++p) ; if(*p != '\0') return(string); } while(*string++); return(NULL); } E 1 h47983 s 00001/00001/00021 d D 4.2 87/05/13 19:27:14 build 5 4 c removed old SCCS strings and inserted #ident BB e s 00000/00000/00022 d D 4.1 87/02/17 09:59:54 mth 4 3 c rolled rev to -r4 (mth) e s 00000/00000/00022 d D 3.1 87/01/20 16:55:42 mkm 3 2 c e s 00000/00000/00022 d D 2.1 87/01/20 16:49:32 mkm 2 1 c e s 00022/00000/00000 d D 1.1 87/01/19 16:38:52 mkm 1 0 c Placed under source control - mkm e u U f b f n t T I 1 D 5 /* " %W% %E% " */ E 5 I 5 #ident " %W% %E% " E 5 /*LINTLIBRARY*/ /* * Return the ptr in sp at which the character c last * appears; NULL if not found */ #define NULL 0 char * strrchr(sp, c) register char *sp, c; { register char *r; r = NULL; do { if(*sp == c) r = sp; } while(*sp++); return(r); } E 1 h58182 s 00001/00001/00020 d D 4.2 87/05/13 19:27:24 build 5 4 c removed old SCCS strings and inserted #ident BB e s 00000/00000/00021 d D 4.1 87/02/17 09:59:57 mth 4 3 c rolled rev to -r4 (mth) e s 00000/00000/00021 d D 3.1 87/01/20 16:55:42 mkm 3 2 c e s 00000/00000/00021 d D 2.1 87/01/20 16:49:33 mkm 2 1 c e s 00021/00000/00000 d D 1.1 87/01/19 16:38:53 mkm 1 0 c Placed under source control - mkm e u U f b f n t T I 1 D 5 /* " %W% %E% " */ E 5 I 5 #ident " %W% %E% " E 5 /*LINTLIBRARY*/ /* * Return the number of characters in the maximum leading segment * of string which consists solely of characters from charset. */ int strspn(string, charset) char *string; register char *charset; { register char *p, *q; for(q=string; *q != '\0'; ++q) { for(p=charset; *p != '\0' && *p != *q; ++p) ; if(*p == '\0') break; } return(q-string); } E 1 h28346 s 00001/00001/00040 d D 4.2 87/05/13 19:27:35 build 5 4 c removed old SCCS strings and inserted #ident BB e s 00000/00000/00041 d D 4.1 87/02/17 09:55:54 mth 4 3 c rolled rev to -r4 (mth) e s 00000/00000/00041 d D 3.1 87/01/20 16:54:37 mkm 3 2 c e s 00000/00000/00041 d D 2.1 87/01/20 16:48:12 mkm 2 1 c e s 00041/00000/00000 d D 1.1 87/01/19 16:38:07 mkm 1 0 c Placed under source control - mkm e u U f b f n t T I 1 D 5 /* " %W% %E% " */ E 5 I 5 #ident " %W% %E% " E 5 /*LINTLIBRARY*/ #include char _ctype[] = { 0, /* 0 1 2 3 4 5 6 7 */ /* 0*/ _C, _C, _C, _C, _C, _C, _C, _C, /* 10*/ _C, _S|_C, _S|_C, _S|_C, _S|_C, _S|_C, _C, _C, /* 20*/ _C, _C, _C, _C, _C, _C, _C, _C, /* 30*/ _C, _C, _C, _C, _C, _C, _C, _C, /* 40*/ _S|_B, _P, _P, _P, _P, _P, _P, _P, /* 50*/ _P, _P, _P, _P, _P, _P, _P, _P, /* 60*/ _N|_X, _N|_X, _N|_X, _N|_X, _N|_X, _N|_X, _N|_X, _N|_X, /* 70*/ _N|_X, _N|_X, _P, _P, _P, _P, _P, _P, /*100*/ _P, _U|_X, _U|_X, _U|_X, _U|_X, _U|_X, _U|_X, _U, /*110*/ _U, _U, _U, _U, _U, _U, _U, _U, /*120*/ _U, _U, _U, _U, _U, _U, _U, _U, /*130*/ _U, _U, _U, _P, _P, _P, _P, _P, /*140*/ _P, _L|_X, _L|_X, _L|_X, _L|_X, _L|_X, _L|_X, _L, /*150*/ _L, _L, _L, _L, _L, _L, _L, _L, /*160*/ _L, _L, _L, _L, _L, _L, _L, _L, /*170*/ _L, _L, _L, _P, _P, _P, _P, _C, /*200*/ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; E 1 h19911 s 00002/00002/00033 d D 4.3 87/03/30 17:38:58 build 6 5 c Save arg in r7 instead of r6. e s 00012/00002/00023 d D 4.2 87/02/17 11:22:29 mth 5 4 c Parameters in registers e s 00000/00000/00025 d D 4.1 87/02/17 09:55:58 mth 4 3 c rolled rev to -r4 (mth) e s 00000/00000/00025 d D 3.1 87/01/20 16:54:38 mkm 3 2 c e s 00000/00000/00025 d D 2.1 87/01/20 16:48:13 mkm 2 1 c e s 00025/00000/00000 d D 1.1 87/01/19 16:38:08 mkm 1 0 c Placed under source control - mkm e u U f b f n t T I 1 ; " %W% %E% " ; C library -- int exit(code) ; int code; ; #include "../sys/sysent.h" dsect data csect code global _exit global __cleanup align 2 _exit: ; MCOUNT I 5 #ifdef ARGSINREGS D 6 move r6,r0 ; save first arg E 6 I 6 move r7,r0 ; save first arg E 6 #else E 5 move r15,r14 I 5 #endif E 5 laddr r14,r14,-72 D 5 call r11,__cleanup,L E 5 I 5 call LINK,__cleanup,L E 5 movei r0,0 I 5 #ifndef ARGSINREGS E 5 store r0,r14,24 D 5 call r11,_monitor E 5 I 5 #endif call LINK,_monitor E 5 laddr r0,SYSC_EXIT ; get syscall number I 5 #ifdef ARGSINREGS D 6 move r1,r6 E 6 I 6 move r1,r7 E 6 #else E 5 load r1,r15,24 ; get parameter -- code I 5 #endif E 5 kcall Xsyscall ; call kernel ; should never get here rum ; illegal instruction for trapping E 1 h62696 s 00001/00001/00514 d D 4.2 87/05/13 19:27:52 build 5 4 c removed old SCCS strings and inserted #ident BB e s 00000/00000/00515 d D 4.1 87/02/17 09:56:02 mth 4 3 c rolled rev to -r4 (mth) e s 00000/00000/00515 d D 3.1 87/01/20 16:54:39 mkm 3 2 c e s 00000/00000/00515 d D 2.1 87/01/20 16:48:14 mkm 2 1 c e s 00515/00000/00000 d D 1.1 87/01/19 16:38:09 mkm 1 0 c Placed under source control - mkm e u U f b f n t T I 1 D 5 /* " %W% %E% " */ E 5 I 5 #ident " %W% %E% " E 5 /*LINTLIBRARY*/ /*************************************************************** * dial() returns an fd for an open tty-line connected to the * specified remote. The caller should trap all ways to * terminate, and call undial(). This will release the `lock' * file and return the outgoing line to the system. This routine * would prefer that the calling routine not use the `alarm()' * system call, nor issue a `signal(SIGALRM, xxx)' call. * If you must, then please save and restore the alarm times. * The sleep() library routine is ok, though. * * #include * #include * #include "dial.h" * * int dial(call); * CALL call; * * void undial(rlfd); * int rlfd; * * rlfd is the "remote-lne file descriptor" returned from dial. * * The CALL structure as (defined in dial.h): * * typedef struct { * struct termio *attr; ptr to term attribute structure * int baud; transmission baud-rate * int speed; 212A modem: low=300, high=1200 * char *line; device name for out-going line * char *telno; ptr to tel-no digit string * char *device Will hold the name of the device * used to makes a connection. * int dev_len This is the length of the device * used to makes a connection. * } CALL; * * The error returns from dial are negative, in the range -1 * to -12, and their meanings are: * * INTRPT -1: interrupt occured * D_HUNG -2: dialer hung (no return from write) * NO_ANS -3: no answer within 20 seconds * ILL_BD -4: illegal baud-rate * A_PROB -5: acu problem (open() failure) * L_PROB -6: line problem (open() failure) * NO_Ldv -7: can't open L-devs file * DV_NT_A -8: specified device not available * DV_NT_K -9: specified device not known * NO_BD_A -10: no device available at requested baud-rate * NO_BD_K -11: no device known at requested baud-rate * DV_NT_E -12: requested speed does not match * * Setting attributes in the termio structure indicated in * the `attr' field of the CALL structure before passing the * structure to dial(), will cause those attributes to be set * before the connection is made. This can be important for * some attributes such as parity and baud. * * As a device-lockout semaphore mechanism, we create an entry, * in the directory #defined as LOCK, whose name is LCK..dev * where dev is the device name taken from the "line" column * in the file #defined as LDEVS. Be sure to trap every possible * way out of execution in order to "release" the device. * This entry is `touched' every hour in order to keep uucp * from removing it on its 90 minute rounds. * Also, have the system start-up procedure clean all such * entries from the LOCK directory. * * With an error return (negative value), there will not be * any `lock-file' entry, so no need to call undial(). ***************************************************************/ #include #include #include #include #include #include #include #include #include "dial.h" #define DEV "/dev/" #define UPDTE 3600 /* how often to touch the lock entry */ #define ACULAST "<" /* character which terminates dialing*/ #define YES 1 /* mnemonic */ #define NO 0 /* mnemonic */ #define DIFFER strcmp /* mnemonic */ #define say (void)fprintf /* mnemonic */ extern unsigned sleep(), alarm(); extern int errno; extern char *malloc(); static char cul[15+sizeof(DEVDIR)] = DEV, /* line's device-name */ cua[15+sizeof(DEVDIR)] = DEV, /* acu's device-name */ *find_dev(), /* local function */ lock[16+sizeof(LOCK)]; /* directory in which to make lockfile*/ static int sperfg=0, /* requested speed not available */ found=0, /* set when device is seen legal */ saverr, /* hide errno during other calls */ rlfd, /* fd for remote comm line */ lfd= -1, /* fd for the device-lock file */ intflag=NO, /* interrupt indicator */ connect(), /* local function */ intcatch(), /* interrupt routine */ alrmcatch(), /* interrupt routine */ hupcatch(); /* interrupt routine */ #ifdef ddt static void dump(); #endif char device[34]; int _debug=0; void undial(); int dial(call) CALL call; { FILE *Ldevices; /* file pointer for Device name file */ char dvc[30]; int (*savint)(), (*savhup)(); #ifdef ddt if(_debug == YES) { say(stderr, "call dial(%d)\r\n", call); dump(&call, 0); } #endif saverr = 0; savint = signal(SIGINT, intcatch); savhup = signal(SIGHUP, hupcatch); (void)signal(SIGALRM, alrmcatch); if(call.telno == NULL && call.line == NULL) { rlfd = DV_NT_K; goto OUT; } if((Ldevices = fopen(LDEVS, "r")) == NULL) { saverr = errno; rlfd = NO_Ldv; goto OUT; } while(1) { int xx; (void)strcpy(dvc, find_dev(Ldevices, &call)); if(strlen(dvc) == 0) goto F1; /* failure to find device */ (void)strcpy(lock, LOCK); (void)strcat(lock, dvc); /* creat will always succeed if usr-id is 0, so check that case separately */ if(geteuid() == 0 && access(lock, 0) == 0) goto F0; /* device found but busy */ if((lfd = creat(lock, 0444)) < 0) goto F0; /* device found but busy */ xx = getpid(); (void)write(lfd, (char*)&xx, sizeof(xx)); break; /* we have a device get out of here */ F0: if(!call.line) /* dial device is busy */ continue; /* try to find another */ F1: if(call.line) if(found) /* specific device request */ rlfd = DV_NT_A; else if(sperfg == 1) rlfd = DV_NT_E; else rlfd = DV_NT_K; else if(found) /* we are dialing */ rlfd = NO_BD_A; else rlfd = NO_BD_K; goto CLOUT; } if(intflag == YES) rlfd = INTRPT; else if((rlfd = connect(&call)) < 0) undial(rlfd); else (void)alarm(UPDTE); CLOUT: (void)fclose(Ldevices); OUT: (void)signal(SIGINT, savint); (void)signal(SIGHUP, savhup); errno = saverr; return(rlfd); } /*************************************************************** * connect: establish dial-out or direct connection. * Negative values returned (-1...-7) are error message indices. ***************************************************************/ static int connect(call) CALL *call; { struct termio *lvp, lv; unsigned u; int er=0, dum, fdac, fd=0, t, w, x; char *p, sp_code, b[30]; #ifdef ddt if(_debug == YES) { say(stderr, "call connect(%o)\n", call); dump(call, 0); } #endif switch(call->baud) { case 110: sp_code = (B110 | CSTOPB); break; case 134: sp_code = B134; break; case 150: sp_code = B150; break; case 300: sp_code = B300; break; case 600: sp_code = B600; break; case 1200: sp_code = B1200; break; case 2400: sp_code = B2400; break; case 4800: sp_code = B4800; break; case 9600: sp_code = B9600; break; default: er = ILL_BD; goto RTN; } if((fd = open(cul, O_EXCL | O_RDWR | O_NDELAY)) < 0) { perror(cul); er = L_PROB; goto RTN; } if(call->device && call->dev_len !=0) { strncpy(call->device, cul, call->dev_len); if(strlen(cul) >= call->dev_len) call->device[call->dev_len -1] = '\0'; } if(!call->attr) lvp = &lv; else lvp = call->attr; lvp->c_cflag |= (CREAD | HUPCL); if(!(lvp->c_cflag & CSIZE)) lvp->c_cflag |= CS8; if( (call->telno == NULL ) && (call->modem) ) { lvp->c_cflag |= CLOCAL; } else lvp->c_cflag &= ~CLOCAL; #ifdef ddt if(_debug == YES) say(stderr,"value of cflag = %o\n\r", lvp->c_cflag); #endif lvp->c_cflag &= ~CBAUD; lvp->c_cflag |= sp_code; if((t = ioctl(fd, TCSETA, lvp)) < 0) { perror("stty for remote"); er = L_PROB; goto RTN; } if(call->telno) { (void)alarm(30); if((fdac = open(cua, O_WRONLY)) < 0) { perror(cua); er = A_PROB; goto RTN; } alrmcatch(); t = strlen(strcat(strcpy(b, call->telno), ACULAST)); #ifdef ddt if(_debug == YES) say(stderr, "dialing %s\n", b); #endif w = write(fdac, b, (unsigned)t); /* dial the number */ x = errno; p = &b[t-2]; for(; *p-- == '-'; t--); if(w < t) { errno = x; if(w == -1) perror("write to acu"); else say(stderr, "%s: Semaphore failure\n", cul); er = (errno == EINTR)? D_HUNG: A_PROB; (void)close(fdac); goto RTN; } (void)close(fdac); /* dialing is complete */ #ifdef ddt if(_debug == YES) say(stderr, "dialing complete\n"); #endif } (void)alarm(20); /* should answer within 20 seconds */ dum = open(cul, O_RDWR); /* wait here for carrier */ x = errno; alrmcatch(); if(dum < 0) { errno = x; #ifdef ddt if(_debug == YES) perror(cul); #endif er = (errno == EINTR)? NO_ANS: L_PROB; goto RTN; } (void)close(dum); /* the dummy open used for waiting*/ (void)fcntl(fd, F_SETFL, fcntl(fd, F_GETFL, 0) & ~O_NDELAY); RTN: if(intflag == YES) er = INTRPT; #ifdef ddt if(_debug == YES) say(stderr, "connect ends with er=%d, fd=%d\n", er, fd); #endif if(er) { close(fd); return(er); } else return(fd); } /*************************************************************** * find_dev: find a device pair with the wanted characteristics * specified in line and baud arguments. * Return pointer to device name for use in lock-out semaphore. * The variables 'cua' and 'cul' will be set to contain the * complete path names of the corresponding devices. * If the L-devices list contains a '0' entry because the * line is direct, the variable 'cua' is set to '\0'. ***************************************************************/ static char* find_dev(iop, call) FILE *iop; CALL *call; { char buf[50], typ[4], temp[15], *b; int tspeed; #ifdef ddt if(_debug == YES) { say(stderr, "call find_dev(%o)\n", call); dump(call, 0); } #endif if(call->telno == NULL) (void)strcpy(typ, "DIR"); else (void)strcpy(typ, "ACU"); while(fgets(buf, 50, iop) != NULL) { if (strchr("# \t\n", buf[0]) != NULL) continue; if(DIFFER(typ, strtok(buf, " \t"))) continue; (void)strcat(strcpy(cul,DEVDIR),strtok((char*)0," \t")); if(*(b = strtok((char*)0, " \t")) == '0') cua[0] = '\0'; else { (void)strcat(strcpy(cua, DEVDIR), b); } tspeed = atoi(strtok((char*)0," \t\n")); if(call->line) { if(strchr((b=call->line), '/') == 0) { (void)strcpy(temp, DEVDIR); b = strcat(temp, call->line); } if(DIFFER(b, cul)) continue; if(call->baud < 0) { /*found line, no baud rate requested, set */ call->baud = call->speed = tspeed; } else if(tspeed != call->baud) { /* found line at wrong speed, keep looking */ sperfg = 1; continue; } else { /* found line at correct speed, clear error */ sperfg = 0; } } if(call->telno) { if(call->speed != tspeed) continue; } if(call->baud > call->speed) continue; ++found; return(1+strrchr(cul, '/')); } return(""); } void undial(rfd) int rfd; { #ifdef ddt if(_debug == YES) say(stderr, "call undial(%d)\n", rfd); #endif if(rfd > 0) (void)close(rfd); if(lfd > 0) { (void)close(lfd); lfd = -1; if(unlink(lock) < 0) say(stderr, "Can't unlink lock-file\r\n"); #ifdef ddt else if(_debug == YES) say(stderr, "Lock-file unlinked\r\n"); #endif } return; } static int alrmcatch() { (void)alarm(UPDTE); (void)utime(lock, (struct {long a,b;} *)0); (void)signal(SIGALRM, alrmcatch); } static int hupcatch() { undial(rlfd); } static int intcatch() { intflag = YES; (void)signal(SIGINT, intcatch); } #ifdef ddt static void dump(arg, fd) CALL *arg; int fd; { struct termio xv; int i; if(fd > 0) { say(stderr, "\r\ndevice status for fd=%d\r\n", fd); say(stderr, "F_GETFL=%o\r\n", fcntl(fd, F_GETFL,1)); if(ioctl(fd, TCGETA, &xv) < 0) { char buf[100]; int x=errno; (void)sprintf(buf, "\rtdmp for fd=%d:", fd); errno = x; perror(buf); return; } say(stderr, "iflag=`%o',", xv.c_iflag); say(stderr, "oflag=`%o',", xv.c_oflag); say(stderr, "cflag=`%o',", xv.c_cflag); say(stderr, "lflag=`%o',", xv.c_lflag); say(stderr, "line=`%o'\r\n", xv.c_line); say(stderr, "cc[0]=`%o',", xv.c_cc[0]); for(i=1; i<8; ++i) say(stderr, "[%d]=`%o',", i, xv.c_cc[i]); say(stderr, "\r\n"); } say(stderr,"baud=%d, ",arg->baud); say(stderr,"speed=%d, ",arg->speed); say(stderr,"line=%s, ",arg->line? arg->line: "(null)"); say(stderr,"telno=%s\r\n",arg->telno? arg->telno: "(null)"); } #endif E 1 h05694 s 00001/00001/00183 d D 4.2 87/05/13 19:28:09 build 5 4 c removed old SCCS strings and inserted #ident BB e s 00000/00000/00184 d D 4.1 87/02/17 09:56:07 mth 4 3 c rolled rev to -r4 (mth) e s 00000/00000/00184 d D 3.1 87/01/20 16:54:41 mkm 3 2 c e s 00000/00000/00184 d D 2.1 87/01/20 16:48:18 mkm 2 1 c e s 00184/00000/00000 d D 1.1 87/01/19 16:38:10 mkm 1 0 c Placed under source control - mkm e u U f b f n t T I 1 D 5 /* " %W% %E% " */ E 5 I 5 #ident " %W% %E% " E 5 /*LINTLIBRARY*/ /* * drand48, etc. pseudo-random number generator * This implementation assumes unsigned short integers of at least * 16 bits, long integers of at least 32 bits, and ignores * overflows on adding or multiplying two unsigned integers. * Two's-complement representation is assumed in a few places. * Some extra masking is done if unsigneds are exactly 16 bits * or longs are exactly 32 bits, but so what? * An assembly-language implementation would run significantly faster. */ #ifndef HAVEFP #define HAVEFP 1 #endif #define N 16 #define MASK ((unsigned)(1 << (N - 1)) + (1 << (N - 1)) - 1) #define LOW(x) ((unsigned)(x) & MASK) #define HIGH(x) LOW((x) >> N) #define MUL(x, y, z) { long l = (long)(x) * (long)(y); \ (z)[0] = LOW(l); (z)[1] = HIGH(l); } #define CARRY(x, y) ((long)(x) + (long)(y) > MASK) #define ADDEQU(x, y, z) (z = CARRY(x, (y)), x = LOW(x + (y))) #define X0 0x330E #define X1 0xABCD #define X2 0x1234 #define A0 0xE66D #define A1 0xDEEC #define A2 0x5 #define C 0xB #define SET3(x, x0, x1, x2) ((x)[0] = (x0), (x)[1] = (x1), (x)[2] = (x2)) #define SETLOW(x, y, n) SET3(x, LOW((y)[n]), LOW((y)[(n)+1]), LOW((y)[(n)+2])) #define SEED(x0, x1, x2) (SET3(x, x0, x1, x2), SET3(a, A0, A1, A2), c = C) #define REST(v) for (i = 0; i < 3; i++) { xsubi[i] = x[i]; x[i] = temp[i]; } \ return (v); #define NEST(TYPE, f, F) TYPE f(xsubi) register unsigned short *xsubi; { \ register int i; register TYPE v; unsigned temp[3]; \ for (i = 0; i < 3; i++) { temp[i] = x[i]; x[i] = LOW(xsubi[i]); } \ v = F(); REST(v); } #define HI_BIT (1L << (2 * N - 1)) static unsigned x[3] = { X0, X1, X2 }, a[3] = { A0, A1, A2 }, c = C; static unsigned short lastx[3]; static void next(); #if HAVEFP double drand48() { #if pdp11 static double two16m; /* old pdp11 cc can't compile an expression */ two16m = 1.0 / (1L << N); /* in "double" initializer! */ #else static double two16m = 1.0 / (1L << N); #endif next(); return (two16m * (two16m * (two16m * x[0] + x[1]) + x[2])); } NEST(double, erand48, drand48); #else long irand48(m) /* Treat x[i] as a 48-bit fraction, and multiply it by the 16-bit * multiplier m. Return integer part as result. */ register unsigned short m; { unsigned r[4], p[2], carry0 = 0; next(); MUL(m, x[0], &r[0]); MUL(m, x[2], &r[2]); MUL(m, x[1], p); if (CARRY(r[1], p[0])) ADDEQU(r[2], 1, carry0); return (r[3] + carry0 + CARRY(r[2], p[1])); } long krand48(xsubi, m) /* same as irand48, except user provides storage in xsubi[] */ register unsigned short *xsubi; unsigned short m; { register int i; register long iv; unsigned temp[3]; for (i = 0; i < 3; i++) { temp[i] = x[i]; x[i] = xsubi[i]; } iv = irand48(m); REST(iv); } #endif long lrand48() { next(); return (((long)x[2] << (N - 1)) + (x[1] >> 1)); } long mrand48() { register long l; next(); /* sign-extend in case length of a long > 32 bits (as on Honeywell) */ return ((l = ((long)x[2] << N) + x[1]) & HI_BIT ? l | -HI_BIT : l); } static void next() { unsigned p[2], q[2], r[2], carry0, carry1; MUL(a[0], x[0], p); ADDEQU(p[0], c, carry0); ADDEQU(p[1], carry0, carry1); MUL(a[0], x[1], q); ADDEQU(p[1], q[0], carry0); MUL(a[1], x[0], r); x[2] = LOW(carry0 + carry1 + CARRY(p[1], r[0]) + q[1] + r[1] + a[0] * x[2] + a[1] * x[1] + a[2] * x[0]); x[1] = LOW(p[1] + r[0]); x[0] = LOW(p[0]); } void srand48(seedval) long seedval; { SEED(X0, LOW(seedval), HIGH(seedval)); } unsigned short * seed48(seed16v) unsigned short seed16v[3]; { SETLOW(lastx, x, 0); SEED(LOW(seed16v[0]), LOW(seed16v[1]), LOW(seed16v[2])); return (lastx); } void lcong48(param) unsigned short param[7]; { SETLOW(x, param, 0); SETLOW(a, param, 3); c = LOW(param[6]); } NEST(long, nrand48, lrand48); NEST(long, jrand48, mrand48); #ifdef DRIVER /* This should print the sequences of integers in Tables 2 and 1 of the TM: 1623, 3442, 1447, 1829, 1305, ... 657EB7255101, D72A0C966378, 5A743C062A23, ... */ #include main() { int i; for (i = 0; i < 80; i++) { printf("%4d ", (int)(4096 * drand48())); printf("%.4X%.4X%.4X\n", x[2], x[1], x[0]); } } #endif E 1 h10242 s 00001/00001/00133 d D 4.4 87/05/19 13:27:04 mth 7 6 c "v" should not be a global symbol e s 00001/00001/00133 d D 4.3 87/05/13 19:28:21 build 6 5 c removed old SCCS strings and inserted #ident BB e s 00017/00002/00117 d D 4.2 87/04/29 13:36:29 mth 5 4 c Use ROS version of ecvt.c with fix for converting denormalized numbers and nan with waterfall board (smr #911) e s 00000/00000/00119 d D 4.1 87/02/17 09:56:12 mth 4 3 c rolled rev to -r4 (mth) e s 00000/00000/00119 d D 3.1 87/01/20 16:54:43 mkm 3 2 c e s 00000/00000/00119 d D 2.1 87/01/20 16:48:20 mkm 2 1 c e s 00119/00000/00000 d D 1.1 87/01/19 16:38:10 mkm 1 0 c Placed under source control - mkm e u U f b f n t T I 1 D 6 /* " %W% %E% " */ E 6 I 6 #ident " %W% %E% " E 6 /*LINTLIBRARY*/ /* * ecvt converts to decimal * the number of digits is specified by ndigit * decpt is set to the position of the decimal point * sign is set to 0 for positive, 1 for negative * */ #include #include #define NMAX ((DSIGNIF * 3 + 19)/10) /* restrict max precision */ #define NDIG 80 extern char *cvt(); char * ecvt(value, ndigit, decpt, sign) double value; int ndigit, *decpt, *sign; { return (cvt(value, ndigit, decpt, sign, 0)); } char * fcvt(value, ndigit, decpt, sign) double value; int ndigit, *decpt, *sign; { return (cvt(value, ndigit, decpt, sign, 1)); } static char buf[NDIG]; I 5 extern double Reduce_inf(); D 7 union { E 7 I 7 static union { E 7 double d; int i[2]; } v; E 5 static char * cvt(value, ndigit, decpt, sign, f_flag) D 5 double value; E 5 I 5 register double value; E 5 int ndigit, *sign, f_flag; register int *decpt; { register char *p = &buf[0], *p_last = &buf[ndigit]; KILLNaN(value); /* raise exception on Not-a-Number (3b only) */ if (*sign = (value < 0.0)) value = -value; buf[0] = '\0'; *decpt = 0; D 5 if (value != 0.0) { /* rescale to range [1.0, 10.0) */ E 5 I 5 v.d=value; if (v.i[0]<0x00100000) { value=v.d=0.0; ++*decpt; } if (value != 0.0) { /* rescale to range [1.0, 10.0) */ E 5 /* in binary for speed and to minimize error build-up */ /* even for the IEEE standard with its high exponents, it's probably better for speed to just loop on them */ static struct s { double p10; int n; } s[] = { 1e32, 32, 1e16, 16, 1e8, 8, 1e4, 4, 1e2, 2, 1e1, 1, }; register struct s *sp = s; ++*decpt; I 5 if ( v.i[0] >= 0x7ff00000) { /* divides value by 10 by hand */ value=Reduce_inf(value); ++*decpt; /* inc decpt because already done /10 */ } E 5 if (value >= 2.0 * MAXPOWTWO) /* can't be precisely integral */ do { for ( ; value >= sp->p10; *decpt += sp->n) value /= sp->p10; } while (sp++->n > 1); else if (value >= 10.0) { /* convert integer part separately */ register double pow10 = 10.0, powtemp; while ((powtemp = 10.0 * pow10) <= value) pow10 = powtemp; for ( ; ; pow10 /= 10.0) { register int digit = value/pow10; *p++ = digit + '0'; value -= digit * pow10; ++*decpt; if (pow10 <= 10.0) break; } } else if (value < 1.0) do { for ( ; value * sp->p10 < 10.0; *decpt -= sp->n) value *= sp->p10; } while (sp++->n > 1); } if (f_flag) p_last += *decpt; if (p_last >= buf) { if (p_last > &buf[NDIG - 2]) p_last = &buf[NDIG - 2]; for ( ; ; ++p) { if (value == 0 || p >= &buf[NMAX]) *p = '0'; else { register int intx; /* intx in [0, 9] */ *p = (intx = (int)value) + '0'; value = 10.0 * (value - (double)intx); } if (p >= p_last) { p = p_last; break; } } if (*p >= '5') /* check rounding in last place + 1 */ do { if (p == buf) { /* rollover from 99999... */ buf[0] = '1'; /* later digits are 0 */ ++*decpt; if (f_flag) ++p_last; break; } *p = '0'; } while (++*--p > '9'); /* propagate carries left */ *p_last = '\0'; } return (buf); } E 1 h55036 s 00001/00001/00050 d D 4.2 87/05/13 19:28:34 build 5 4 c removed old SCCS strings and inserted #ident BB e s 00000/00000/00051 d D 4.1 87/02/17 09:56:16 mth 4 3 c rolled rev to -r4 (mth) e s 00000/00000/00051 d D 3.1 87/01/20 16:54:44 mkm 3 2 c e s 00000/00000/00051 d D 2.1 87/01/20 16:48:21 mkm 2 1 c e s 00051/00000/00000 d D 1.1 87/01/19 16:38:11 mkm 1 0 c Placed under source control - mkm e u U f b f n t T I 1 D 5 /* " %W% %E% " */ E 5 I 5 #ident " %W% %E% " E 5 /*LINTLIBRARY*/ char *sys_errlist[] = { "Error 0", "Not owner", "No such file or directory", "No such process", "Interrupted system call", "I/O error", "No such device or address", "Arg list too long", "Exec format error", "Bad file number", "No child processes", "No more processes", "Not enough space", "Permission denied", "Bad address", "Block device required", "Device busy", "File exists", "Cross-device link", "No such device", "Not a directory", "Is a directory", "Invalid argument", "File table overflow", "Too many open files", "Not a typewriter", "Text file busy", "File too large", "No space left on device", "Illegal seek", "Read-only file system", "Too many links", "Broken pipe", "Argument out of domain", "Result too large", "No message of desired type", "Identifier removed", "Channel number out of range", "Level 2 not synchronized", "Level 3 halted", "Level 3 reset", "Link number out of range", "Protocol driver not attached", "No CSI structure available", "Level 2 halted", "Deadlock condition if locked" }; int sys_nerr = { sizeof(sys_errlist)/sizeof(sys_errlist[0]) }; E 1 h24537 s 00001/00001/00095 d D 4.3 87/05/13 19:28:48 build 6 5 c removed old SCCS strings and inserted #ident BB e s 00002/00000/00094 d D 4.2 87/02/24 09:28:22 mth 5 4 c execlp doesn't need to squeeze args together if ARGSINREGS (args are already packed). e s 00000/00000/00094 d D 4.1 87/02/17 09:56:19 mth 4 3 c rolled rev to -r4 (mth) e s 00000/00000/00094 d D 3.1 87/01/20 16:54:45 mkm 3 2 c e s 00000/00000/00094 d D 2.1 87/01/20 16:48:22 mkm 2 1 c e s 00094/00000/00000 d D 1.1 87/01/19 16:38:12 mkm 1 0 c Placed under source control - mkm e u U f b f n t T I 1 D 6 /* " %W% %E% " */ E 6 I 6 #ident " %W% %E% " E 6 /*LINTLIBRARY*/ /* * execlp(name, arg,...,0) (like execl, but does path search) * execvp(name, argv) (like execv, but does path search) */ #include #define NULL 0 static char *execat(), shell[] = "/bin/sh"; extern char *getenv(), *strchr(); extern unsigned sleep(); extern int errno, execv(); /*VARARGS1*/ int execlp(name, argv) char *name, *argv; { int i,j ; char **nargs = &argv ; I 5 #ifndef ARGSINREGS E 5 for (i=1,j=2;nargs[i]=nargs[j];i++,j += 2) ; I 5 #endif E 5 return(execvp(name, &argv)); } int execvp(name, argv) char *name, **argv; { char *pathstr; char fname[128]; char *newargs[256]; int i; register char *cp; register unsigned etxtbsy=1; register int eacces=0; if((pathstr = getenv("PATH")) == NULL) pathstr = ":/bin:/usr/bin"; cp = strchr(name, '/')? "": pathstr; do { cp = execat(cp, name, fname); retry: (void) execv(fname, argv); switch(errno) { case ENOEXEC: newargs[0] = "sh"; newargs[1] = fname; for(i=1; newargs[i+1]=argv[i]; ++i) { if(i >= 254) { errno = E2BIG; return(-1); } } (void) execv(shell, newargs); return(-1); case ETXTBSY: if(++etxtbsy > 5) return(-1); (void) sleep(etxtbsy); goto retry; case EACCES: ++eacces; break; case ENOMEM: case E2BIG: return(-1); } } while(cp); if(eacces) errno = EACCES; return(-1); } static char * execat(s1, s2, si) register char *s1, *s2; char *si; { register char *s; s = si; while(*s1 && *s1 != ':') *s++ = *s1++; if(si != s) *s++ = '/'; while(*s2) *s++ = *s2++; *s = '\0'; return(*s1? ++s1: 0); } E 1 h50720 s 00001/00001/00012 d D 4.2 87/05/13 19:28:59 build 5 4 c removed old SCCS strings and inserted #ident BB e s 00000/00000/00013 d D 4.1 87/02/17 09:56:23 mth 4 3 c rolled rev to -r4 (mth) e s 00000/00000/00013 d D 3.1 87/01/20 16:54:46 mkm 3 2 c e s 00000/00000/00013 d D 2.1 87/01/20 16:48:23 mkm 2 1 c e s 00013/00000/00000 d D 1.1 87/01/19 16:38:12 mkm 1 0 c Placed under source control - mkm e u U f b f n t T I 1 D 5 /* " %W% %E% " */ E 5 I 5 #ident " %W% %E% " E 5 /*LINTLIBRARY*/ /* * This is a dummy _cleanup routine to place at the end * of the C library in case no other definition is found. * If the standard I/O routines are used, they supply a * real "_cleanup" routine in file flsbuf.c */ void _cleanup() { } E 1 h17031 s 00001/00001/00028 d D 4.2 87/05/13 19:29:09 build 5 4 c removed old SCCS strings and inserted #ident BB e s 00000/00000/00029 d D 4.1 87/02/17 09:56:26 mth 4 3 c rolled rev to -r4 (mth) e s 00000/00000/00029 d D 3.1 87/01/20 16:54:47 mkm 3 2 c e s 00000/00000/00029 d D 2.1 87/01/20 16:48:24 mkm 2 1 c e s 00029/00000/00000 d D 1.1 87/01/19 16:38:13 mkm 1 0 c Placed under source control - mkm e u U f b f n t T I 1 D 5 /* " %W% %E% " */ E 5 I 5 #ident " %W% %E% " E 5 /*LINTLIBRARY*/ /* * frexp(value, eptr) * returns a double x such that x = 0 or 0.5 <= |x| < 1.0 * and stores an integer n such that value = x * 2 ** n * indirectly through eptr. * */ #include double frexp(value, eptr) double value; /* don't declare register, because of KILLNan! */ register int *eptr; { register double absvalue; KILLNaN(value); /* raise exception on Not-a-Number (3b only) */ *eptr = 0; if (value == 0.0) /* nothing to do for zero */ return (value); absvalue = (value > 0.0) ? value : -value; for ( ; absvalue >= 1.0; absvalue *= 0.5) ++*eptr; for ( ; absvalue < 0.5; absvalue += absvalue) --*eptr; return (value > 0.0 ? absvalue : -absvalue); } E 1 h50950 s 00001/00001/00015 d D 4.2 87/05/13 19:29:24 build 5 4 c removed old SCCS strings and inserted #ident BB e s 00000/00000/00016 d D 4.1 87/02/17 09:56:31 mth 4 3 c rolled rev to -r4 (mth) e s 00000/00000/00016 d D 3.1 87/01/20 16:54:48 mkm 3 2 c e s 00000/00000/00016 d D 2.1 87/01/20 16:48:25 mkm 2 1 c e s 00016/00000/00000 d D 1.1 87/01/19 16:38:14 mkm 1 0 c Placed under source control - mkm e u U f b f n t T I 1 D 5 /* " %W% %E% " */ E 5 I 5 #ident " %W% %E% " E 5 #include #include #include key_t ftok(path, id) char *path; char id; { struct stat st; return(stat(path, &st) < 0 ? (key_t)-1 : (key_t)((key_t)id << 24 | ((long)(unsigned)minor(st.st_dev)) << 16 | (unsigned)st.st_ino)); } E 1 h47541 s 00001/00001/00206 d D 4.2 87/05/13 19:29:43 build 5 4 c removed old SCCS strings and inserted #ident BB e s 00000/00000/00207 d D 4.1 87/02/17 09:56:34 mth 4 3 c rolled rev to -r4 (mth) e s 00000/00000/00207 d D 3.1 87/01/20 16:54:49 mkm 3 2 c e s 00000/00000/00207 d D 2.1 87/01/20 16:48:26 mkm 2 1 c e s 00207/00000/00000 d D 1.1 87/01/19 16:38:14 mkm 1 0 c Placed under source control - mkm e u U f b f n t T I 1 D 5 /* " %W% %E% " */ E 5 I 5 #ident " %W% %E% " E 5 /*LINTLIBRARY*/ /*************************************************************** * ftw - file tree walk * * int ftw (path, fn, depth) char *path; int (*fn)(); int depth; * * Given a path name, ftw starts from the file given by that path * name and visits each file and directory in the tree beneath * that file. If a single file has multiple links within the * structure, it will be visited once for each such link. * For each object visited, fn is called with three arguments. * The first contains the path name of the object, the second * contains a pointer to a stat buffer which will usually hold * appropriate information for the object and the third will * contain an integer value giving additional information about * * FTW_F The object is a file for which stat was * successful. It does not guarantee that the * file can actually be read. * * FTW_D The object is a directory for which stat and * open for read were both successful. * * FTW_DNR The object is a directory for which stat * succeeded, but which cannot be read. Because * the directory cannot be read, fn will not be * called for any descendants of this directory. * * FTW_NS Stat failed on the object because of lack of * appropriate permission. This indication will * be given, for example, for each file in a * directory with read but no execute permission. * Because stat failed, it is not possible to * determine whether this object is a file or a * directory. The stat buffer passed to fn will * contain garbage. Stat failure for any reason * other than lack of permission will be * considered an error and will cause ftw to stop * and return -1 to its caller. * * If fn returns nonzero, ftw stops and returns the same value * to its caller. If ftw gets into other trouble along the way, * it returns -1 and leaves an indication of the cause in errno. * * The third argument to ftw does not limit the depth to which * ftw will go. Rather, it limits the depth to which ftw will * go before it starts recycling file descriptors. In general, * it is necessary to use a file descriptor for each level of the * tree, but they can be recycled for deep trees by saving the * position, closing, re-opening, and seeking. It is possible * to start recycling file descriptors by sensing when we have * run out, but in general this will not be terribly useful if * fn expects to be able to open files. We could also figure out * how many file descriptors are available and guarantee a certain * number to fn, but we would not know how many to guarantee, * and we do not want to impose the extra overhead on a caller who * knows how many are available without having to figure it out. * * It is possible for ftw to die with a memory fault in the event * of a file system so deeply nested that the stack overflows. **************************************************************/ #include #include #include #include #include #define NULL 0 extern char *malloc(), *strcpy(); extern long lseek(); extern int errno; int ftw(path, fn, depth) char *path; int (*fn)(); int depth; { int rc, rl, n, fd; char *subpath, *component; struct stat sb; struct direct dir; /* Try to get file status. If unsuccessful, errno will say why. */ if(stat(path, &sb) < 0) return(errno == EACCES? (*fn)(path, &sb, FTW_NS): -1); /* * The stat succeeded, so we know the object exists. * If not a directory, call the user function and return. */ if((sb.st_mode & S_IFMT) != S_IFDIR) return((*fn)(path, &sb, FTW_F)); /* * The object was a directory. * * Open a file to read the directory */ fd = open(path, 0); /* * Call the user function, telling it whether * the directory can be read. If it can't be read * call the user function or indicate an error, * depending on the reason it couldn't be read. */ if(fd < 0) return(errno == EACCES? (*fn)(path, &sb, FTW_DNR): -1); /* We could read the directory. Call user function. */ rc = (*fn)(path, &sb, FTW_D); if(rc != 0) return(rc); /* Allocate a buffer to hold generated pathnames. */ n = strlen(path); subpath = malloc((unsigned)(n+DIRSIZ+2)); if(subpath == NULL) { (void)close(fd); errno = ENOMEM; return(-1); } /* Create a prefix to which we will append component names */ (void)strcpy(subpath, path); if(subpath[0] != '\0' && subpath[n-1] != '/') subpath[n++] = '/'; component = &subpath[n]; /* * Read the directory one component at a time. * We must ignore "." and "..", but other than that, * just create a path name and call self to check it out. */ while((rl = read(fd, (char*)&dir, sizeof(struct direct))) == sizeof(struct direct)) { if(dir.d_ino != 0 && strcmp(dir.d_name, ".") != 0 && strcmp(dir.d_name, "..") != 0) { int i; char *p, *q; long here; /* Append component name to the working path */ p = component; q = dir.d_name; for(i=0; i < DIRSIZ && *q != '\0'; i++) *p++ = *q++; *p = '\0'; /* * If we are about to exceed our depth, * remember where we are and close a file. */ if(depth <= 1) { here = lseek(fd, 0L, 1); if(close(fd) < 0) { free(subpath); return(-1); } } /* * Do a recursive call to process the file. * (watch this, sports fans) */ rc = ftw(subpath, fn, depth-1); if(rc != 0) { free(subpath); if(depth > 1) (void)close(fd); return(rc); } /* * If we closed the file, try to reopen it. */ if(depth <= 1) { fd = open(path, 0); if(fd < 0) { free(subpath); return(-1); } if(lseek(fd, here, 0) < 0) { (void)close(fd); free(subpath); return(-1); } } } } /* * We got out of the subdirectory loop. The return from * the final read is in rl. Clean up and then check if * the final read was successful. If not, give an * error return. */ free(subpath); if(close(fd) < 0 || rl != 0) return(-1); return(0); } E 1 h40366 s 00001/00001/00072 d D 4.2 87/05/13 19:29:58 build 5 4 c removed old SCCS strings and inserted #ident BB e s 00000/00000/00073 d D 4.1 87/02/17 09:56:39 mth 4 3 c rolled rev to -r4 (mth) e s 00000/00000/00073 d D 3.1 87/01/20 16:54:50 mkm 3 2 c e s 00000/00000/00073 d D 2.1 87/01/20 16:48:27 mkm 2 1 c e s 00073/00000/00000 d D 1.1 87/01/19 16:38:15 mkm 1 0 c Placed under source control - mkm e u U f b f n t T I 1 D 5 /* " %W% %E% " */ E 5 I 5 #ident " %W% %E% " E 5 /*LINTLIBRARY*/ /* * gcvt - Floating output conversion to * * pleasant-looking string. */ extern char *ecvt(); char * gcvt(number, ndigit, buf) double number; int ndigit; char *buf; { int sign, decpt; register char *p1, *p2 = buf; register int i; p1 = ecvt(number, ndigit, &decpt, &sign); if (sign) *p2++ = '-'; if (decpt > ndigit || decpt <= -4) { /* E-style */ decpt--; *p2++ = *p1++; *p2++ = '.'; for (i = 1; i < ndigit; i++) *p2++ = *p1++; #ifdef TRIMZERO while (p2[-1] == '0') p2--; if (p2[-1] == '.') p2--; #endif *p2++ = 'e'; if (decpt < 0) { decpt = -decpt; *p2++ = '-'; } else *p2++ = '+'; for (i = 1000; i != 0; i /= 10) /* 3B or CRAY, for example */ if (i <= decpt || i <= 10) /* force 2 digits */ *p2++ = (decpt / i) % 10 + '0'; } else { if (decpt <= 0) { *p2++ = '0'; *p2++ = '.'; while (decpt < 0) { decpt++; *p2++ = '0'; } } for (i = 1; i <= ndigit; i++) { *p2++ = *p1++; if (i == decpt) *p2++ = '.'; } if (ndigit < decpt) { while (ndigit++ < decpt) *p2++ = '0'; *p2++ = '.'; } #ifdef TRIMZERO while (*--p2 == '0' && p2 > buf) ; if (*p2 != '.') p2++; #endif } *p2 = '\0'; return (buf); } E 1 h52501 s 00001/00001/00050 d D 4.2 87/05/13 19:30:10 build 5 4 c removed old SCCS strings and inserted #ident BB e s 00000/00000/00051 d D 4.1 87/02/17 09:56:42 mth 4 3 c rolled rev to -r4 (mth) e s 00000/00000/00051 d D 3.1 87/01/20 16:54:51 mkm 3 2 c e s 00000/00000/00051 d D 2.1 87/01/20 16:48:28 mkm 2 1 c e s 00051/00000/00000 d D 1.1 87/01/19 16:38:16 mkm 1 0 c Placed under source control - mkm e u U f b f n t T I 1 D 5 /* " %W% %E% " */ E 5 I 5 #ident " %W% %E% " E 5 /*LINTLIBRARY*/ /* * Library routine to GET the Current Working Directory. * arg1 is a pointer to a character buffer into which the * path name of the current directory is placed by the * subroutine. arg1 may be zero, in which case the * subroutine will call malloc to get the required space. * arg2 is the length of the buffer space for the path-name. * If the actual path-name is longer than (arg2-2), or if * the value of arg2 is not at least 3, the subroutine will * return a value of zero, with errno set as appropriate. */ #include #include extern FILE *popen(); extern char *malloc(), *fgets(), *strchr(); extern int errno, pclose(); char * getcwd(arg1, arg2) char *arg1; int arg2; { FILE *pipe; char *trm; if(arg2 == 0) { errno = EINVAL; return(0); } if(arg1 == 0) if((arg1 = malloc((unsigned)arg2)) == 0) { errno = ENOMEM; return(0); } errno = 0; if((pipe = popen("pwd", "r")) == 0) return(0); (void) fgets(arg1, arg2, pipe); (void) pclose(pipe); trm = strchr(arg1, '\0'); if(*(trm-1) != '\n') { errno = ERANGE; return(0); } *(trm-1) = '\0'; return(arg1); } E 1 h15583 s 00001/00001/00041 d D 4.2 87/05/13 19:30:23 build 5 4 c removed old SCCS strings and inserted #ident BB e s 00000/00000/00042 d D 4.1 87/02/17 09:56:45 mth 4 3 c rolled rev to -r4 (mth) e s 00000/00000/00042 d D 3.1 87/01/20 16:54:52 mkm 3 2 c e s 00000/00000/00042 d D 2.1 87/01/20 16:48:29 mkm 2 1 c e s 00042/00000/00000 d D 1.1 87/01/19 16:38:17 mkm 1 0 c Placed under source control - mkm e u U f b f n t T I 1 D 5 /* " %W% %E% " */ E 5 I 5 #ident " %W% %E% " E 5 /*LINTLIBRARY*/ /* * getenv(name) * returns ptr to value associated with name, if any, else NULL */ #define NULL 0 extern char **environ; static char *nvmatch(); char * getenv(name) register char *name; { register char *v, **p=environ; if(p == NULL) return(NULL); while(*p != NULL) if((v = nvmatch(name, *p++)) != NULL) return(v); return(NULL); } /* * s1 is either name, or name=value * s2 is name=value * if names match, return value of s2, else NULL * used for environment searching: see getenv */ static char * nvmatch(s1, s2) register char *s1, *s2; { while(*s1 == *s2++) if(*s1++ == '=') return(s2); if(*s1 == '\0' && *(s2-1) == '=') return(s2); return(NULL); } E 1 h53507 s 00001/00001/00082 d D 4.2 87/05/13 19:30:37 build 5 4 c removed old SCCS strings and inserted #ident BB e s 00000/00000/00083 d D 4.1 87/02/17 09:56:48 mth 4 3 c rolled rev to -r4 (mth) e s 00000/00000/00083 d D 3.1 87/01/20 16:54:53 mkm 3 2 c e s 00000/00000/00083 d D 2.1 87/01/20 16:48:30 mkm 2 1 c e s 00083/00000/00000 d D 1.1 87/01/19 16:38:17 mkm 1 0 c Placed under source control - mkm e u U f b f n t T I 1 D 5 /* " %W% %E% " */ E 5 I 5 #ident " %W% %E% " E 5 /*LINTLIBRARY*/ #include #include #define CL ':' #define CM ',' #define NL '\n' #define MAXGRP 100 extern int atoi(), fclose(); extern char *fgets(); extern FILE *fopen(); extern void rewind(); static char GROUP[] = "/etc/group"; static FILE *grf = NULL; static char line[BUFSIZ+1]; static struct group grp; static char *gr_mem[MAXGRP]; void setgrent() { if(grf == NULL) grf = fopen(GROUP, "r"); else rewind(grf); } void endgrent() { if(grf != NULL) { (void) fclose(grf); grf = NULL; } } static char * grskip(p, c) register char *p; register int c; { while(*p != '\0' && *p != c) ++p; if(*p != '\0') *p++ = '\0'; return(p); } struct group * getgrent() { extern struct group *fgetgrent(); if(grf == NULL && (grf = fopen(GROUP, "r")) == NULL) return(NULL); return (fgetgrent(grf)); } struct group * fgetgrent(f) FILE *f; { register char *p, **q; if((p = fgets(line, BUFSIZ, f)) == NULL) return(NULL); grp.gr_name = p; grp.gr_passwd = p = grskip(p, CL); grp.gr_gid = atoi(p = grskip(p, CL)); grp.gr_mem = gr_mem; p = grskip(p, CL); (void) grskip(p, NL); q = gr_mem; while(*p != '\0') { *q++ = p; p = grskip(p, CM); } *q = NULL; return(&grp); } E 1 h50491 s 00001/00001/00018 d D 4.2 87/05/13 19:30:53 build 5 4 c removed old SCCS strings and inserted #ident BB e s 00000/00000/00019 d D 4.1 87/02/17 09:56:53 mth 4 3 c rolled rev to -r4 (mth) e s 00000/00000/00019 d D 3.1 87/01/20 16:54:54 mkm 3 2 c e s 00000/00000/00019 d D 2.1 87/01/20 16:48:31 mkm 2 1 c e s 00019/00000/00000 d D 1.1 87/01/19 16:38:18 mkm 1 0 c Placed under source control - mkm e u U f b f n t T I 1 D 5 /* " %W% %E% " */ E 5 I 5 #ident " %W% %E% " E 5 /*LINTLIBRARY*/ #include extern struct group *getgrent(); extern void setgrent(), endgrent(); struct group * getgrgid(gid) register int gid; { register struct group *p; setgrent(); while((p = getgrent()) && p->gr_gid != gid) ; endgrent(); return(p); } E 1 h53568 s 00001/00001/00019 d D 4.2 87/05/13 19:31:05 build 5 4 c removed old SCCS strings and inserted #ident BB e s 00000/00000/00020 d D 4.1 87/02/17 09:56:55 mth 4 3 c rolled rev to -r4 (mth) e s 00000/00000/00020 d D 3.1 87/01/20 16:54:55 mkm 3 2 c e s 00000/00000/00020 d D 2.1 87/01/20 16:48:32 mkm 2 1 c e s 00020/00000/00000 d D 1.1 87/01/19 16:38:19 mkm 1 0 c Placed under source control - mkm e u U f b f n t T I 1 D 5 /* " %W% %E% " */ E 5 I 5 #ident " %W% %E% " E 5 /*LINTLIBRARY*/ #include extern struct group *getgrent(); extern void setgrent(), endgrent(); extern int strcmp(); struct group * getgrnam(name) register char *name; { register struct group *p; setgrent(); while((p = getgrent()) && strcmp(p->gr_name, name)) ; endgrent(); return(p); } E 1 h16409 s 00001/00001/00032 d D 4.2 87/05/13 19:31:17 build 5 4 c removed old SCCS strings and inserted #ident BB e s 00000/00000/00033 d D 4.1 87/02/17 09:56:59 mth 4 3 c rolled rev to -r4 (mth) e s 00000/00000/00033 d D 3.1 87/01/20 16:54:56 mkm 3 2 c e s 00000/00000/00033 d D 2.1 87/01/20 16:48:33 mkm 2 1 c e s 00033/00000/00000 d D 1.1 87/01/19 16:38:19 mkm 1 0 c Placed under source control - mkm e u U f b f n t T I 1 D 5 /* " %W% %E% " */ E 5 I 5 #ident " %W% %E% " E 5 /*LINTLIBRARY*/ #include #include "utmp.h" #define NULL 0 extern long lseek(); extern int open(), read(), close(), ttyslot(); char * getlogin() { register me, uf; struct utmp ubuf ; static char answer[sizeof(ubuf.ut_user)+1] ; if((me = ttyslot()) < 0) return(NULL); if((uf = open(UTMP_FILE, 0)) < 0) return(NULL); (void) lseek(uf, (long)(me * sizeof(ubuf)), 0); if(read(uf, (char*)&ubuf, sizeof(ubuf)) != sizeof(ubuf)) { (void) close(uf); return(NULL); } (void) close(uf); if(ubuf.ut_user[0] == '\0') return(NULL); strncpy(&answer[0],&ubuf.ut_user[0],sizeof(ubuf.ut_user)) ; answer[sizeof(ubuf.ut_user)] = '\0' ; return(&answer[0]); } E 1 h55740 s 00001/00001/00064 d D 4.2 87/05/13 19:31:29 build 5 4 c removed old SCCS strings and inserted #ident BB e s 00000/00000/00065 d D 4.1 87/02/17 09:57:02 mth 4 3 c rolled rev to -r4 (mth) e s 00000/00000/00065 d D 3.1 87/01/20 16:54:57 mkm 3 2 c e s 00000/00000/00065 d D 2.1 87/01/20 16:48:34 mkm 2 1 c e s 00065/00000/00000 d D 1.1 87/01/19 16:38:20 mkm 1 0 c Placed under source control - mkm e u U f b f n t T I 1 D 5 /* " %W% %E% " */ E 5 I 5 #ident " %W% %E% " E 5 /*LINTLIBRARY*/ #define NULL 0 #define EOF (-1) #define ERR(s, c) if(opterr){\ extern int strlen(), write();\ char errbuf[2];\ errbuf[0] = c; errbuf[1] = '\n';\ (void) write(2, argv[0], (unsigned)strlen(argv[0]));\ (void) write(2, s, (unsigned)strlen(s));\ (void) write(2, errbuf, 2);} extern int strcmp(); extern char *strchr(); int opterr = 1; int optind = 1; int optopt; char *optarg; int getopt(argc, argv, opts) int argc; char **argv, *opts; { static int sp = 1; register int c; register char *cp; if(sp == 1) if(optind >= argc || argv[optind][0] != '-' || argv[optind][1] == '\0') return(EOF); else if(strcmp(argv[optind], "--") == NULL) { optind++; return(EOF); } optopt = c = argv[optind][sp]; if(c == ':' || (cp=strchr(opts, c)) == NULL) { ERR(": illegal option -- ", c); if(argv[optind][++sp] == '\0') { optind++; sp = 1; } return('?'); } if(*++cp == ':') { if(argv[optind][sp+1] != '\0') optarg = &argv[optind++][sp+1]; else if(++optind >= argc) { ERR(": option requires an argument -- ", c); sp = 1; return('?'); } else optarg = argv[optind++]; sp = 1; } else { if(argv[optind][++sp] == '\0') { sp = 1; optind++; } optarg = NULL; } return(c); } E 1 h05249 s 00001/00001/00046 d D 4.2 87/05/13 19:31:46 build 5 4 c removed old SCCS strings and inserted #ident BB e s 00000/00000/00047 d D 4.1 87/02/17 09:57:06 mth 4 3 c rolled rev to -r4 (mth) e s 00000/00000/00047 d D 3.1 87/01/20 16:54:58 mkm 3 2 c e s 00000/00000/00047 d D 2.1 87/01/20 16:48:35 mkm 2 1 c e s 00047/00000/00000 d D 1.1 87/01/19 16:38:21 mkm 1 0 c Placed under source control - mkm e u U f b f n t T I 1 D 5 /* " %W% %E% " */ E 5 I 5 #ident " %W% %E% " E 5 /*LINTLIBRARY*/ #include #include extern void rewind(); extern FILE *fopen(); static FILE *pwf; int getpw(uid, buf) int uid; char buf[]; { register n, c; register char *bp; if(pwf == 0) pwf = fopen("/etc/passwd", "r"); if(pwf == NULL) return(1); rewind(pwf); while(1) { bp = buf; while((c=getc(pwf)) != '\n') { if(c == EOF) return(1); *bp++ = c; } *bp = '\0'; bp = buf; n = 3; while(--n) while((c = *bp++) != ':') if(c == '\n') return(1); while((c = *bp++) != ':') if(isdigit(c)) n = n*10+c-'0'; else continue; if(n == uid) return(0); } } E 1 h36278 s 00001/00001/00110 d D 4.2 87/05/13 19:31:58 build 5 4 c removed old SCCS strings and inserted #ident BB e s 00000/00000/00111 d D 4.1 87/02/17 09:57:10 mth 4 3 c rolled rev to -r4 (mth) e s 00000/00000/00111 d D 3.1 87/01/20 16:54:59 mkm 3 2 c e s 00000/00000/00111 d D 2.1 87/01/20 16:48:36 mkm 2 1 c e s 00111/00000/00000 d D 1.1 87/01/19 16:38:21 mkm 1 0 c Placed under source control - mkm e u U f b f n t T I 1 D 5 /* " %W% %E% " */ E 5 I 5 #ident " %W% %E% " E 5 /*LINTLIBRARY*/ #include #include #include extern void rewind(); extern long atol(); extern FILE *fopen(); extern int fclose(); extern char *fgets(); static char PASSWD[] = "/etc/passwd"; static char EMPTY[] = ""; static FILE *pwf = NULL; static char line[BUFSIZ+1]; static struct passwd passwd; void setpwent() { if(pwf == NULL) pwf = fopen(PASSWD, "r"); else rewind(pwf); } void endpwent() { if(pwf != NULL) { (void) fclose(pwf); pwf = NULL; } } static char * pwskip(p) register char *p; { while(*p && *p != ':' && *p != '\n') ++p; if(*p == '\n') *p = '\0'; else if(*p) *p++ = '\0'; return(p); } struct passwd * getpwent() { extern struct passwd *fgetpwent(); if(pwf == NULL) { if((pwf = fopen(PASSWD, "r")) == NULL) return(NULL); } return (fgetpwent(pwf)); } struct passwd * fgetpwent(f) FILE *f; { register char *p; char *end; long x, strtol(); char *memchr(); p = fgets(line, BUFSIZ, f); if(p == NULL) return(NULL); passwd.pw_name = p; p = pwskip(p); passwd.pw_passwd = p; p = pwskip(p); if (p == NULL || *p == ':') /* check for non-null uid */ return (NULL); x = strtol(p, &end, 10); if (end != memchr(p, ':', strlen(p))) /* check for numeric value */ return (NULL); p = pwskip(p); passwd.pw_uid = (x < 0 || x > MAXUID)? (MAXUID+1): x; if (p == NULL || *p == ':') /* check for non-null uid */ return (NULL); x = strtol(p, &end, 10); if (end != memchr(p, ':', strlen(p))) /* check for numeric value */ return (NULL); p = pwskip(p); passwd.pw_gid = (x < 0 || x > MAXUID)? (MAXUID+1): x; passwd.pw_comment = EMPTY; passwd.pw_gecos = p; p = pwskip(p); passwd.pw_dir = p; p = pwskip(p); passwd.pw_shell = p; (void) pwskip(p); p = passwd.pw_passwd; while(*p && *p != ',') p++; if(*p) *p++ = '\0'; passwd.pw_age = p; return(&passwd); } E 1 h58991 s 00001/00001/00020 d D 4.2 87/05/13 19:32:12 build 5 4 c removed old SCCS strings and inserted #ident BB e s 00000/00000/00021 d D 4.1 87/02/17 09:57:13 mth 4 3 c rolled rev to -r4 (mth) e s 00000/00000/00021 d D 3.1 87/01/20 16:55:00 mkm 3 2 c e s 00000/00000/00021 d D 2.1 87/01/20 16:48:37 mkm 2 1 c e s 00021/00000/00000 d D 1.1 87/01/19 16:38:22 mkm 1 0 c Placed under source control - mkm e u U f b f n t T I 1 D 5 /* " %W% %E% " */ E 5 I 5 #ident " %W% %E% " E 5 /*LINTLIBRARY*/ #include #include /* for definition of L_cuserid */ extern struct passwd *getpwent(); extern void setpwent(), endpwent(); extern int strncmp(); struct passwd * getpwnam(name) char *name; { register struct passwd *p; setpwent(); while ((p = getpwent()) && strncmp(name, p->pw_name, L_cuserid - 1)) ; endpwent(); return (p); } E 1 h50976 s 00001/00001/00018 d D 4.2 87/05/13 19:32:25 build 5 4 c removed old SCCS strings and inserted #ident BB e s 00000/00000/00019 d D 4.1 87/02/17 09:57:17 mth 4 3 c rolled rev to -r4 (mth) e s 00000/00000/00019 d D 3.1 87/01/20 16:55:01 mkm 3 2 c e s 00000/00000/00019 d D 2.1 87/01/20 16:48:38 mkm 2 1 c e s 00019/00000/00000 d D 1.1 87/01/19 16:38:23 mkm 1 0 c Placed under source control - mkm e u U f b f n t T I 1 D 5 /* " %W% %E% " */ E 5 I 5 #ident " %W% %E% " E 5 /*LINTLIBRARY*/ #include extern struct passwd *getpwent(); extern void setpwent(), endpwent(); struct passwd * getpwuid(uid) register int uid; { register struct passwd *p; setpwent(); while((p = getpwent()) && p->pw_uid != uid) ; endpwent(); return(p); } E 1 h30970 s 00001/00001/00318 d D 4.2 87/05/13 19:32:41 build 5 4 c removed old SCCS strings and inserted #ident BB e s 00000/00000/00319 d D 4.1 87/02/17 09:57:21 mth 4 3 c rolled rev to -r4 (mth) e s 00000/00000/00319 d D 3.1 87/01/20 16:55:02 mkm 3 2 c e s 00000/00000/00319 d D 2.1 87/01/20 16:48:39 mkm 2 1 c e s 00319/00000/00000 d D 1.1 87/01/19 16:38:23 mkm 1 0 c Placed under source control - mkm e u U f b f n t T I 1 D 5 /* " %W% %E% " */ E 5 I 5 #ident " %W% %E% " E 5 /* Routines to read and write the /etc/utmp file. */ /* */ #include #include #include #include #include #include #define MAXFILE 79 /* Maximum pathname length for "utmp" file */ #ifdef DEBUG #undef UTMP_FILE #define UTMP_FILE "utmp" #endif static int fd = -1; /* File descriptor for the utmp file. */ static char utmpfile[MAXFILE+1] = UTMP_FILE; /* Name of the current * "utmp" like file. */ static long loc_utmp; /* Where in "utmp" the current "ubuf" was * found. */ static struct utmp ubuf; /* Copy of last entry read in. */ /* "getutent" gets the next entry in the utmp file. */ struct utmp *getutent() { extern int fd; extern char utmpfile[]; extern struct utmp ubuf; extern long loc_utmp,lseek(); extern int errno; register char *u; register int i; struct stat stbuf; /* If the "utmp" file is not open, attempt to open it for * reading. If there is no file, attempt to create one. If * both attempts fail, return NULL. If the file exists, but * isn't readable and writeable, do not attempt to create. */ if (fd < 0) { /* Make sure file is a multiple of 'utmp' entries long */ if (stat(utmpfile,&stbuf) == 0) { if((stbuf.st_size % sizeof(struct utmp)) != 0) { unlink(utmpfile); } } if ((fd = open(utmpfile, O_RDWR|O_CREAT, 0644)) < 0) { /* If the open failed for permissions, try opening it only for * reading. All "pututline()" later will fail the writes. */ if (errno == EACCES && (fd = open(utmpfile, O_RDONLY)) < 0) return(NULL); } } /* Try to read in the next entry from the utmp file. */ if (read(fd,&ubuf,sizeof(ubuf)) != sizeof(ubuf)) { /* Make sure ubuf is zeroed. */ for (i=0,u=(char *)(&ubuf); iut_type) { /* Do not look for an entry if the user sent us an EMPTY entry. */ case EMPTY: return(NULL); /* For RUN_LVL, BOOT_TIME, OLD_TIME, and NEW_TIME entries, only */ /* the types have to match. If they do, return the address of */ /* internal buffer. */ case RUN_LVL: case BOOT_TIME: case OLD_TIME: case NEW_TIME: if (entry->ut_type == ubuf.ut_type) return(&ubuf); break; /* For INIT_PROCESS, LOGIN_PROCESS, USER_PROCESS, and DEAD_PROCESS */ /* the type of the entry in "ubuf", must be one of the above and */ /* id's must match. */ case INIT_PROCESS: case LOGIN_PROCESS: case USER_PROCESS: case DEAD_PROCESS: if (((type = ubuf.ut_type) == INIT_PROCESS || type == LOGIN_PROCESS || type == USER_PROCESS || type == DEAD_PROCESS) && ubuf.ut_id[0] == entry->ut_id[0] && ubuf.ut_id[1] == entry->ut_id[1] && ubuf.ut_id[2] == entry->ut_id[2] && ubuf.ut_id[3] == entry->ut_id[3]) return(&ubuf); break; /* Do not search for illegal types of entry. */ default: return(NULL); } } } while (getutent() != NULL); /* Return NULL since the proper entry wasn't found. */ return(NULL); } /* "getutline" searches the "utmp" file for a LOGIN_PROCESS or * USER_PROCESS with the same "line" as the specified "entry". */ struct utmp *getutline(entry) register struct utmp *entry; { extern struct utmp ubuf,*getutent(); register struct utmp *cur; /* Start by using the entry currently incore. This prevents */ /* doing reads that aren't necessary. */ cur = &ubuf; do { /* If the current entry is the one we are interested in, return */ /* a pointer to it. */ if (cur->ut_type != EMPTY && (cur->ut_type == LOGIN_PROCESS || cur->ut_type == USER_PROCESS) && strncmp(&entry->ut_line[0], &cur->ut_line[0],sizeof(cur->ut_line)) == 0) return(cur); } while ((cur = getutent()) != NULL); /* Since entry wasn't found, return NULL. */ return(NULL); } /* "pututline" writes the structure sent into the utmp file. */ /* If there is already an entry with the same id, then it is */ /* overwritten, otherwise a new entry is made at the end of the */ /* utmp file. */ struct utmp *pututline(entry) struct utmp *entry; { int fc; struct utmp *answer; extern long time(); extern struct utmp ubuf; extern long loc_utmp,lseek(); extern struct utmp *getutid(); extern int fd,errno; struct utmp tmpbuf; /* Copy the user supplied entry into our temporary buffer to */ /* avoid the possibility that the user is actually passing us */ /* the address of "ubuf". */ tmpbuf = *entry; getutent(); if (fd < 0) { #ifdef ERRDEBUG gdebug("pututline: Unable to create utmp file.\n"); #endif return((struct utmp *)NULL); } /* Make sure file is writable */ if ((fc=fcntl(fd, F_GETFL, NULL)) == -1 || (fc & O_RDWR) != O_RDWR) { return((struct utmp *)NULL); } /* Find the proper entry in the utmp file. Start at the current */ /* location. If it isn't found from here to the end of the */ /* file, then reset to the beginning of the file and try again. */ /* If it still isn't found, then write a new entry at the end of */ /* the file. (Making sure the location is an integral number of */ /* utmp structures into the file incase the file is scribbled.) */ if (getutid(&tmpbuf) == NULL) { #ifdef ERRDEBUG gdebug("First getutid() failed. fd: %d",fd); #endif setutent(); if (getutid(&tmpbuf) == NULL) { #ifdef ERRDEBUG loc_utmp = lseek(fd, 0L, 1); gdebug("Second getutid() failed. fd: %d loc_utmp: %ld\n",fd,loc_utmp); #endif fcntl(fd, F_SETFL, fc | O_APPEND); } else { lseek(fd, -(long)sizeof(struct utmp), 1); } } else { lseek(fd, -(long)sizeof(struct utmp), 1); } /* Write out the user supplied structure. If the write fails, */ /* then the user probably doesn't have permission to write the */ /* utmp file. */ if (write(fd,&tmpbuf,sizeof(tmpbuf)) != sizeof(tmpbuf)) { #ifdef ERRDEBUG gdebug("pututline failed: write-%d\n",errno); #endif answer = (struct utmp *)NULL; } else { /* Copy the user structure into ubuf so that it will be up to */ /* date in the future. */ ubuf = tmpbuf; answer = &ubuf; #ifdef ERRDEBUG gdebug("id: %c%c loc: %x\n",ubuf.ut_id[0],ubuf.ut_id[1], ubuf.ut_id[2],ubuf.ut_id[3],loc_utmp); #endif } fcntl(fd, F_SETFL, fc); return(answer); } /* "setutent" just resets the utmp file back to the beginning. */ setutent() { register char *ptr; register int i; extern int fd; extern struct utmp ubuf; extern long loc_utmp; if (fd != -1) lseek(fd,0L,0); /* Zero the stored copy of the last entry read, since we are */ /* resetting to the beginning of the file. */ for (i=0,ptr=(char*)&ubuf; i < sizeof(ubuf);i++) *ptr++ = '\0'; loc_utmp = 0L; } /* "endutent" closes the utmp file. */ endutent() { extern int fd; extern long loc_utmp; extern struct utmp ubuf; register char *ptr; register int i; if (fd != -1) close(fd); fd = -1; loc_utmp = 0; for (i=0,ptr= (char *)(&ubuf); i < sizeof(ubuf);i++) *ptr++ = '\0'; } /* "utmpname" allows the user to read a file other than the */ /* normal "utmp" file. */ utmpname(newfile) char *newfile; { extern char utmpfile[]; /* Determine if the new filename will fit. If not, return 0. */ if (strlen(newfile) > MAXFILE) return (0); /* Otherwise copy in the new file name. */ else strcpy(&utmpfile[0],newfile); /* Make sure everything is reset to the beginning state. */ endutent(); return(1); } #ifdef ERRDEBUG #include gdebug(format,arg1,arg2,arg3,arg4,arg5,arg6) char *format; int arg1,arg2,arg3,arg4,arg5,arg6; { register FILE *fp; register int errnum; extern int errno; if ((fp = fopen("/etc/dbg.getut","a+")) == NULL) return; fprintf(fp,format,arg1,arg2,arg3,arg4,arg5,arg6); fclose(fp); } #endif E 1 h26978 s 00001/00001/00491 d D 4.2 87/05/13 19:32:57 build 5 4 c removed old SCCS strings and inserted #ident BB e s 00000/00000/00492 d D 4.1 87/02/17 09:57:28 mth 4 3 c rolled rev to -r4 (mth) e s 00000/00000/00492 d D 3.1 87/01/20 16:55:03 mkm 3 2 c e s 00000/00000/00492 d D 2.1 87/01/20 16:48:40 mkm 2 1 c e s 00492/00000/00000 d D 1.1 87/01/19 16:38:24 mkm 1 0 c Placed under source control - mkm e u U f b f n t T I 1 D 5 /* " %W% %E% " */ E 5 I 5 #ident " %W% %E% " E 5 /*LINTLIBRARY*/ /* Compile time switches: MULT - use a multiplicative hashing function. DIV - use the remainder mod table size as a hashing function. CHAINED - use a linked list to resolve collisions. OPEN - use open addressing to resolve collisions. BRENT - use Brent's modification to improve the OPEN algorithm. SORTUP - CHAINED list is sorted in increasing order. SORTDOWN - CHAINED list is sorted in decreasing order. START - CHAINED list with entries appended at front. DRIVER - compile in a main program to drive the tests. DEBUG - compile some debugging printout statements. USCR - user supplied comparison routine. */ #include #define SUCCEED 0 #define FAIL 1 #define TRUE 1 #define FALSE 0 #define repeat for(;;) #define until(A) if(A) break; #ifdef OPEN # undef CHAINED #else #ifndef CHAINED # define OPEN #endif #endif #ifdef MULT # undef DIV #else #ifndef DIV # define MULT #endif #endif #ifdef START # undef SORTUP # undef SORTDOWN #else #ifdef SORTUP # undef SORTDOWN #endif #endif #ifdef USCR # define COMPARE(A, B) (* hcompar)((A), (B)) extern int (* hcompar)(); #else # define COMPARE(A, B) strcmp((A), (B)) #endif #ifdef MULT # define SHIFT ((bitsper * sizeof(int)) - m) /* Shift factor */ # define FACTOR 035761254233 /* Magic multiplication factor */ # define HASH hashm /* Multiplicative hash function */ # define HASH2 hash2m /* Secondary hash function */ static unsigned int bitsper; /* Bits per byte */ static unsigned int hashm(); static unsigned int hash2m(); #else #ifdef DIV # define HASH hashd /* Division hashing routine */ # define HASH2(A) 1 /* Secondary hash function */ static unsigned int hashd(); #endif #endif typedef enum { FIND, /* Find, if present */ ENTER /* Find; enter if not present */ } ACTION; typedef char *POINTER; typedef struct entry { /* Hash table entry */ POINTER key; POINTER data; } ENTRY; #ifdef CHAINED typedef struct node { /* Part of the linked list of entries */ ENTRY item; struct node *next; } NODE; typedef NODE *TABELEM; static NODE **table; /* The address of the hash table */ static ENTRY *build(); #else #ifdef OPEN typedef ENTRY TABELEM; /* What the table contains (TABle ELEMents) */ static TABELEM *table; /* The address of the hash table */ static unsigned int count = 0; /* Number of entries in hash table */ #endif #endif static unsigned int length; /* Size of the hash table */ static unsigned int m; /* Log base 2 of length */ static unsigned int prcnt; /* Number of probes this item */ extern void free(); extern int printf(), fprintf(); extern char *malloc(), *calloc(), *strcpy(); int hcreate(); void hdestroy(); ENTRY *hsearch(); static unsigned int crunch(); #ifdef DRIVER static void hdump(); main() { char line[80]; /* Room for the input line */ int i = 0; /* Data generator */ ENTRY *res; /* Result of hsearch */ ENTRY *new; /* Test entry */ if(hcreate(5)) printf("Length = %u, m = %u\n", length, m); else { fprintf(stderr, "Out of core\n"); exit(FAIL); } repeat { hdump(); printf("Enter a probe: "); until (EOF == scanf("%s", line)); #ifdef DEBUG printf("%s, ", line); printf("division: %d, ", hashd(line)); printf("multiplication: %d\n", hashm(line)); #endif new = (ENTRY *) malloc(sizeof(ENTRY)); if(new == NULL) { fprintf(stderr, "Out of core \n"); exit(FAIL); } else { new->key = malloc((unsigned) strlen(line) + 1); if(new->key == NULL) { fprintf(stderr, "Out of core \n"); exit(FAIL); } strcpy(new->key, line); new->data = malloc(sizeof(int)); if(new->data == NULL) { fprintf(stderr, "Out of core \n"); exit(FAIL); } *new->data = i++; } res = hsearch(*new, ENTER); printf("The number of probes required was %d\n", prcnt); if(res == (ENTRY *) 0) printf("Table is full\n"); else { printf("Success: "); printf("Key = %s, Value = %d\n", res->key, *res->data); } } exit(SUCCEED); } #endif int hcreate(size) /* Create a hash table no smaller than size */ int size; /* Minimum size for hash table */ { unsigned int unsize; /* Holds the shifted size */ if(size <= 0) return(FALSE); unsize = size; /* +1 for empty table slot; -1 for ceiling */ length = 1; /* Maximum entries in tabbe */ m = 0; /* Log2 length */ while(unsize) { unsize >>= 1; length <<= 1; m++; } table = (TABELEM *) calloc(length, sizeof(TABELEM)); return(table != NULL); } void hdestroy() /* Reset the module to its initial state */ { free((POINTER) table); #ifdef OPEN count = 0; #endif } #ifdef OPEN /* Hash search of a fixed-capacity table. Open addressing used to resolve collisions. Algorithm modified from Knuth, Volume 3, section 6.4, algorithm D. Labels flag corresponding actions. */ ENTRY *hsearch(item, action) /* Find or insert the item into the table */ ENTRY item; /* Item to be inserted or found */ ACTION action; /* FIND or ENTER */ { unsigned int i; /* Insertion index */ unsigned int c; /* Secondary probe displacement */ prcnt = 1; /* D1: */ i = HASH(item.key); /* Primary hash on key */ #ifdef DEBUG if(action == ENTER) printf("hash = %o\n", i); #endif /* D2: */ if(table[i].key == NULL) /* Empty slot? */ goto D6; else if(COMPARE(table[i].key, item.key) == 0) /* Match? */ return(&table[i]); /* D3: */ c = HASH2(item.key); /* No match => compute secondary hash */ #ifdef DEBUG if(action == ENTER) printf("hash2 = %o\n", c); #endif D4: i = (i + c) % length; /* Advance to next slot */ prcnt++; /* D5: */ if(table[i].key == NULL) /* Empty slot? */ goto D6; else if(COMPARE(table[i].key, item.key) == 0) /* Match? */ return(&table[i]); else goto D4; D6: if(action == FIND) /* Insert if requested */ return((ENTRY *) NULL); if(count == (length - 1)) /* Table full? */ return((ENTRY *) 0); #ifdef BRENT /* Brent's variation of the open addressing algorithm. Do extra work during insertion to speed retrieval. May require switching of previously placed items. Adapted from Knuth, Volume 3, section 4.6 and Brent's article in CACM, volume 10, #2, February 1973. */ { unsigned int p0 = HASH(item.key); /* First probe index */ unsigned int c0 = HASH2(item.key); /* Main branch increment */ unsigned int r = prcnt - 1; /* Current minimum distance */ unsigned int j; /* Counts along main branch */ unsigned int k; /* Counts along secondary branch */ unsigned int curj; /* Current best main branch site */ unsigned int curpos; /* Current best table index */ unsigned int pj; /* Main branch indices */ unsigned int cj; /* Secondary branch increment distance*/ unsigned int pjk; /* Secondary branch probe indices */ if(prcnt >= 3) { for(j = 0; j < prcnt; j++) { /* Count along main branch */ pj = (p0 + j * c0) % length; /* New main branch index */ cj = HASH2(table[pj].key); /* Secondary branch incr. */ for(k=1; j+k <= r; k++) { /* Count on secondary branch*/ pjk = (pj + k * cj) % length; /* Secondary probe */ if(table[pjk].key == NULL) { /* Improvement found */ r = j + k; /* Decrement upper bound */ curj = pj; /* Save main probe index */ curpos = pjk; /* Save secondeary index */ } } } if(r != prcnt - 1) { /* If an improvement occurred */ table[curpos] = table[curj]; /* Old key to new site */ #ifdef DEBUG printf("Switch curpos = %o, curj = %o, oldi = %o\n", curj, curpos, i); #endif i = curj; } } } #endif count++; /* Increment table occupancy count */ table[i] = item; /* Save item */ return(&table[i]); /* Address of item is returned */ } #endif #ifdef USCR # ifdef DRIVER static int compare(a, b) POINTER a; POINTER b; { return(strcmp(a, b)); } int (* hcompar)() = compare; # endif #endif #ifdef CHAINED # ifdef SORTUP # define STRCMP(A, B) (COMPARE((A), (B)) > 0) # else # ifdef SORTDOWN # define STRCMP(A, B) (COMPARE((A), (B)) < 0) # else # define STRCMP(A, B) (COMPARE((A), (B)) != 0) # endif # endif ENTRY *hsearch(item, action) /* Chained search with sorted lists */ ENTRY item; /* Item to be inserted or found */ ACTION action; /* FIND or ENTER */ { NODE *p; /* Searches through the linked list */ NODE **q; /* Where to store the pointer to a new NODE */ unsigned int i; /* Result of hash */ int res; /* Result of string comparison */ prcnt = 1; i = HASH(item.key); /* Table[i] contains list head */ if(table[i] == (NODE*)NULL) { /* List has not yet been begun */ if(action == FIND) return((ENTRY *) NULL); else return(build(&table[i], (NODE *) NULL, item)); } else { /* List is not empty */ q = &table[i]; p = table[i]; while(p != NULL && (res = STRCMP(item.key, p->item.key))) { prcnt++; q = &(p->next); p = p->next; } if(p != NULL && res == 0) /* Item has been found */ return(&(p->item)); else { /* Item is not yet on list */ if(action == FIND) return((ENTRY *) NULL); else #ifdef START return(build(&table[i], table[i], item)); #else return(build(q, p, item)); #endif } } } static ENTRY *build(last, next, item) NODE **last; /* Where to store in last list item */ NODE *next; /* Link to next list item */ ENTRY item; /* Item to be kept in node */ { NODE *p = (NODE *) malloc(sizeof(NODE)); if(p != NULL) { p->item = item; *last = p; p->next = next; return(&(p->item)); } else return(NULL); } #endif #ifdef DIV static unsigned int hashd(key) /* Division hashing scheme */ POINTER key; /* Key to be hashed */ { return(crunch(key) % length); } #else #ifdef MULT /* NOTE: The following algorithm only works on machines where the results of multiplying two integers is the least significant part of the double word integer required to hold the result. It is adapted from Knuth, Volume 3, section 6.4. */ static unsigned int hashm(key) /* Multiplication hashing scheme */ POINTER key; /* Key to be hashed */ { static int first = TRUE; /* TRUE on the first call only */ if(first) { /* Compute the number of bits in a byte */ unsigned char c = ~0; /* A byte full of 1's */ bitsper = 0; while(c) { /* Shift until no more 1's */ c >>= 1; bitsper++; /* Count number of shifts */ } first = FALSE; } return((int) (((unsigned) (crunch(key) * FACTOR)) >> SHIFT)); } /* * Secondary hashing, for use with multiplicitive hashing scheme. * Adapted from Knuth, Volume 3, section 6.4. */ static unsigned int hash2m(key) /* Secondary hashing routine */ POINTER key; /* String to be hashed */ { return((int) (((unsigned) ((crunch(key) * FACTOR) << m) >> SHIFT) | 1)); } #endif #endif static unsigned int crunch(key) /* Convert multicharacter key to unsigned int */ POINTER key; { unsigned int sum = 0; /* Results */ int s; /* Length of the key */ for(s = 0; *key; s++) /* Simply add up the bytes */ sum += *key++; return(sum + s); } #ifdef DRIVER static void hdump() /* Dumps loc, data, probe count, key */ { unsigned int i; /* Counts table slots */ #ifdef OPEN unsigned int sum = 0; /* Counts probes */ #else #ifdef CHAINED NODE *a; /* Current Node on list */ #endif #endif for(i = 0; i < length; i++) #ifdef OPEN if(table[i].key == NULL) printf("%o.\t-,\t-,\t(NULL)\n", i); else { unsigned int oldpr = prcnt; /* Save current probe count */ hsearch(table[i], FIND); sum += prcnt; printf("%o.\t%d,\t%d,\t%s\n", i, *table[i].data, prcnt, table[i].key); prcnt = oldpr; } printf("Total probes = %d\n", sum); #else #ifdef CHAINED if(table[i] == NULL) printf("%o.\t-,\t-,\t(NULL)\n", i); else { printf("%o.", i); for(a = table[i]; a != NULL; a = a->next) printf("\t%d,\t%#0.4x,\t%s\n", *a->item.data, a, a->item.key); } #endif #endif } #endif E 1 h43855 s 00001/00001/00018 d D 4.2 87/05/13 19:33:15 build 5 4 c removed old SCCS strings and inserted #ident BB e s 00000/00000/00019 d D 4.1 87/02/17 09:57:33 mth 4 3 c rolled rev to -r4 (mth) e s 00000/00000/00019 d D 3.1 87/01/20 16:55:05 mkm 3 2 c e s 00000/00000/00019 d D 2.1 87/01/20 16:48:42 mkm 2 1 c e s 00019/00000/00000 d D 1.1 87/01/19 16:38:25 mkm 1 0 c Placed under source control - mkm e u U f b f n t T I 1 D 5 /* " %W% %E% " */ E 5 I 5 #ident " %W% %E% " E 5 /*LINTLIBRARY*/ /* * Returns 1 iff file is a tty */ #include extern int ioctl(); int isatty(f) int f; { struct termio tty; if(ioctl(f, TCGETA, &tty) < 0) return(0); return(1); } E 1 h16926 s 00001/00001/00069 d D 4.2 87/05/13 19:33:28 build 5 4 c removed old SCCS strings and inserted #ident BB e s 00000/00000/00070 d D 4.1 87/02/17 09:57:37 mth 4 3 c rolled rev to -r4 (mth) e s 00000/00000/00070 d D 3.1 87/01/20 16:55:06 mkm 3 2 c e s 00000/00000/00070 d D 2.1 87/01/20 16:48:43 mkm 2 1 c e s 00070/00000/00000 d D 1.1 87/01/19 16:38:26 mkm 1 0 c Placed under source control - mkm e u U f b f n t T I 1 D 5 /* " %W% %E% " */ E 5 I 5 #ident " %W% %E% " E 5 /*LINTLIBRARY*/ /* * Convert longs to and from 3-byte disk addresses */ void ltol3(cp, lp, n) char *cp; long *lp; int n; { register i; register char *a, *b; a = cp; b = (char *)lp; for(i=0; i < n; ++i) { #if interdata || u370 || u3b || u3b5 || ridge b++; *a++ = *b++; *a++ = *b++; *a++ = *b++; #endif #if vax *a++ = *b++; *a++ = *b++; *a++ = *b++; b++; #endif #if pdp11 *a++ = *b++; b++; *a++ = *b++; *a++ = *b++; #endif } } void l3tol(lp, cp, n) long *lp; char *cp; int n; { register i; register char *a, *b; a = (char *)lp; b = cp; for(i=0; i < n; ++i) { #if interdata || u370 || u3b || u3b5 || ridge *a++ = 0; *a++ = *b++; *a++ = *b++; *a++ = *b++; #endif #if vax *a++ = *b++; *a++ = *b++; *a++ = *b++; *a++ = 0; #endif #if pdp11 *a++ = *b++; *a++ = 0; *a++ = *b++; *a++ = *b++; #endif } } E 1 h32476 s 00001/00001/00042 d D 4.2 87/05/13 19:33:40 build 5 4 c removed old SCCS strings and inserted #ident BB e s 00000/00000/00043 d D 4.1 87/02/17 09:57:42 mth 4 3 c rolled rev to -r4 (mth) e s 00000/00000/00043 d D 3.1 87/01/20 16:55:07 mkm 3 2 c e s 00000/00000/00043 d D 2.1 87/01/20 16:48:44 mkm 2 1 c e s 00043/00000/00000 d D 1.1 87/01/19 16:38:26 mkm 1 0 c Placed under source control - mkm e u U f b f n t T I 1 D 5 /* " %W% %E% " */ E 5 I 5 #ident " %W% %E% " E 5 /*LINTLIBRARY*/ /* * convert long int to base 64 ascii * char set is [./0-9A-Za-z] * two's complement negatives are assumed, * but no assumptions are made about sign propagation on right shift * */ #include #define BITSPERCHAR 6 /* to hold entire character set */ #define BITSPERLONG (BITSPERBYTE * sizeof(long)) #define NMAX ((BITSPERLONG + BITSPERCHAR - 1)/BITSPERCHAR) #define SIGN (-(1L << (BITSPERLONG - BITSPERCHAR - 1))) #define CHARMASK ((1 << BITSPERCHAR) - 1) #define WORDMASK ((1L << ((NMAX - 1) * BITSPERCHAR)) - 1) static char buf[NMAX + 1]; char * l64a(lg) register long lg; { register char *s = buf; while (lg != 0) { register int c = ((int)lg & CHARMASK) + ('0' - 2); if (c > '9') c += 'A' - '9' - 1; if (c > 'Z') c += 'a' - 'Z' - 1; *s++ = c; /* fill high-order CHAR if negative */ /* but suppress sign propagation */ lg = ((lg < 0) ? (lg >> BITSPERCHAR) | SIGN : lg >> BITSPERCHAR) & WORDMASK; } *s = '\0'; return (buf); } E 1 h14038 s 00001/00001/00054 d D 4.2 87/05/13 19:33:52 build 5 4 c removed old SCCS strings and inserted #ident BB e s 00000/00000/00055 d D 4.1 87/02/17 09:57:46 mth 4 3 c rolled rev to -r4 (mth) e s 00000/00000/00055 d D 3.1 87/01/20 16:55:08 mkm 3 2 c e s 00000/00000/00055 d D 2.1 87/01/20 16:48:45 mkm 2 1 c e s 00055/00000/00000 d D 1.1 87/01/19 16:38:27 mkm 1 0 c Placed under source control - mkm e u U f b f n t T I 1 D 5 /* " %W% %E% " */ E 5 I 5 #ident " %W% %E% " E 5 /*LINTLIBRARY*/ /* * double ldexp (value, exp) * double value; * int exp; * * Ldexp returns value * 2**exp, if that result is in range. * If underflow occurs, it returns zero. If overflow occurs, * it returns a value of appropriate sign and largest single- * precision magnitude. In case of underflow or overflow, * the external int "errno" is set to ERANGE. Note that errno is * not modified if no error occurs, so if you intend to test it * after you use ldexp, you had better set it to something * other than ERANGE first (zero is a reasonable value to use). */ #include #include /* Largest signed long int power of 2 */ #define MAXSHIFT (BITSPERBYTE * sizeof(long) - 2) extern double frexp(); double ldexp(value, exp) register double value; register int exp; { int old_exp; if (exp == 0 || value == 0.0) /* nothing to do for zero */ return (value); #if !(pdp11 || u3b5) /* pdp11 "cc" can't handle cast of double to void on pdp11 or 3b5 */ (void) #endif frexp(value, &old_exp); if (exp > 0) { if (exp + old_exp > MAXBEXP) { /* overflow */ errno = ERANGE; return (value < 0 ? -MAXFLOAT : MAXFLOAT); } for ( ; exp > MAXSHIFT; exp -= MAXSHIFT) value *= (1L << MAXSHIFT); return (value * (1L << exp)); } if (exp + old_exp < MINBEXP) { /* underflow */ errno = ERANGE; return (0.0); } for ( ; exp < -MAXSHIFT; exp += MAXSHIFT) value *= 1.0/(1L << MAXSHIFT); /* mult faster than div */ return (value / (1L << -exp)); } E 1 h57724 s 00001/00001/00031 d D 4.2 87/05/13 19:34:06 build 5 4 c removed old SCCS strings and inserted #ident BB e s 00000/00000/00032 d D 4.1 87/02/17 09:57:49 mth 4 3 c rolled rev to -r4 (mth) e s 00000/00000/00032 d D 3.1 87/01/20 16:55:09 mkm 3 2 c e s 00000/00000/00032 d D 2.1 87/01/20 16:48:47 mkm 2 1 c e s 00032/00000/00000 d D 1.1 87/01/19 16:38:28 mkm 1 0 c Placed under source control - mkm e u U f b f n t T I 1 D 5 /* " %W% %E% " */ E 5 I 5 #ident " %W% %E% " E 5 /*LINTLIBRARY*/ /* * Linear search algorithm, generalized from Knuth (6.1) Algorithm Q. * * This version no longer has anything to do with Knuth's Algorithm Q, * which first copies the new element into the table, then looks for it. * The assumption there was that the cost of checking for the end of the * table before each comparison outweighed the cost of the comparison, which * isn't true when an arbitrary comparison function must be called and when the * copy itself takes a significant number of cycles. * Actually, it has now reverted to Algorithm S, which is "simpler." */ typedef char *POINTER; extern POINTER memcpy(); POINTER lfind(key, base, nelp, width, compar) register POINTER key; /* Key to be located */ register POINTER base; /* Beginning of table */ unsigned *nelp; /* Pointer to current table size */ register unsigned width; /* Width of an element (bytes) */ int (*compar)(); /* Comparison function */ { register POINTER next = base + *nelp * width; /* End of table */ for ( ; base < next; base += width) if ((*compar)(key, base) == 0) return (base); /* Key found */ return (POINTER)(-1); } E 1 h30525 s 00001/00002/00000 d D 4.2 87/05/13 19:34:23 build 5 4 c removed old SCCS strings and inserted #ident BB e s 00000/00000/00002 d D 4.1 87/02/17 09:57:53 mth 4 3 c rolled rev to -r4 (mth) e s 00000/00000/00002 d D 3.1 87/01/20 16:55:10 mkm 3 2 c e s 00000/00000/00002 d D 2.1 87/01/20 16:48:49 mkm 2 1 c e s 00002/00000/00000 d D 1.1 87/01/19 16:38:28 mkm 1 0 c Placed under source control - mkm e u U f b f n t T I 1 D 5 /* " %W% %E% " */ static char *SCCS = " %W% %E% "; E 5 I 5 #ident " %W% %E% " E 5 E 1 h64421 s 00001/00001/00032 d D 4.2 87/05/13 19:34:36 build 5 4 c removed old SCCS strings and inserted #ident BB e s 00000/00000/00033 d D 4.1 87/02/17 09:57:58 mth 4 3 c rolled rev to -r4 (mth) e s 00000/00000/00033 d D 3.1 87/01/20 16:55:11 mkm 3 2 c e s 00000/00000/00033 d D 2.1 87/01/20 16:48:50 mkm 2 1 c e s 00033/00000/00000 d D 1.1 87/01/19 16:38:32 mkm 1 0 c Placed under source control - mkm e u U f b f n t T I 1 D 5 /* " %W% %E% " */ E 5 I 5 #ident " %W% %E% " E 5 /*LINTLIBRARY*/ /* * Linear search algorithm, generalized from Knuth (6.1) Algorithm Q. * * This version no longer has anything to do with Knuth's Algorithm Q, * which first copies the new element into the table, then looks for it. * The assumption there was that the cost of checking for the end of the * table before each comparison outweighed the cost of the comparison, which * isn't true when an arbitrary comparison function must be called and when the * copy itself takes a significant number of cycles. * Actually, it has now reverted to Algorithm S, which is "simpler." */ typedef char *POINTER; extern POINTER memcpy(); POINTER lsearch(key, base, nelp, width, compar) register POINTER key; /* Key to be located */ register POINTER base; /* Beginning of table */ unsigned *nelp; /* Pointer to current table size */ register unsigned width; /* Width of an element (bytes) */ int (*compar)(); /* Comparison function */ { register POINTER next = base + *nelp * width; /* End of table */ for ( ; base < next; base += width) if ((*compar)(key, base) == 0) return (base); /* Key found */ ++*nelp; /* Not found, add to table */ return (memcpy(base, key, (int)width)); /* base now == next */ } E 1 h10447 s 00001/00001/00246 d D 4.2 87/05/13 19:35:07 build 5 4 c removed old SCCS strings and inserted #ident BB e s 00000/00000/00247 d D 4.1 87/02/17 09:58:03 mth 4 3 c rolled rev to -r4 (mth) e s 00000/00000/00247 d D 3.1 87/01/20 16:55:12 mkm 3 2 c e s 00000/00000/00247 d D 2.1 87/01/20 16:48:51 mkm 2 1 c e s 00247/00000/00000 d D 1.1 87/01/19 16:38:33 mkm 1 0 c Placed under source control - mkm e u U f b f n t T I 1 D 5 /* " %W% %E% " */ E 5 I 5 #ident " %W% %E% " E 5 #include "values.h" /*LINTLIBRARY*/ #define NDEBUG #ifdef debug #undef NDEBUG #endif #include /* avoid break bug */ #if pdp11 #define GRANULE 64 #else #define GRANULE 0 #endif #if pdp11 || vax || u3b || u3b5 || ridge /* this make the assumption that MAXINT is one less than an even block */ #define MAXALLOC (MAXINT-BLOCK+1) #endif /* C storage allocator * circular first-fit strategy * works with noncontiguous, but monotonically linked, arena * each block is preceded by a ptr to the (pointer of) * the next following block * blocks are exact number of words long * aligned to the data type requirements of ALIGN * pointers to blocks must have BUSY bit 0 * bit in ptr is 1 for busy, 0 for idle * gaps in arena are merely noted as busy blocks * last block of arena (pointed to by alloct) is empty and * has a pointer to first * idle blocks are coalesced during space search * * a different implementation may need to redefine * ALIGN, NALIGN, BLOCK, BUSY, INT * where INT is integer type to which a pointer can be cast */ #define INT int #define ALIGN int #define NALIGN 2 #define WORD sizeof(union store) #define BLOCK 4096 /* a multiple of WORD*/ #define BUSY 1 #define NULL 0 #define testbusy(p) ((INT)(p)&BUSY) #define setbusy(p) (union store *)((INT)(p)|BUSY) #define clearbusy(p) (union store *)((INT)(p)&~BUSY) union store { union store *ptr; ALIGN dummy[NALIGN]; int calloc; /*calloc clears an array of integers*/ }; extern char *sbrk(), *memcpy(); static union store allocs[2]; /*initial arena*/ static union store *allocp; /*search ptr*/ static union store *alloct; /*arena top*/ static union store *allocx; /*for benefit of realloc*/ static union store *allocend; /*the last block, if it is free, or *alloct */ char * malloc(nbytes) unsigned nbytes; { register union store *p, *q; register int nw; register unsigned int temp; register unsigned int incr = 0; unsigned int sav_temp; if(allocs[0].ptr == 0) { /*first time*/ allocs[0].ptr = setbusy(&allocs[1]); allocs[1].ptr = setbusy(&allocs[0]); alloct = &allocs[1]; allocp = &allocs[0]; allocend = alloct; } nw = (nbytes+WORD+WORD-1)/WORD; assert(allocp >= allocs && allocp <= alloct); assert(allock()); for(p=allocp; ; ) { for(temp=0; ; ) { if(!testbusy(p->ptr)) { while(!testbusy((q=p->ptr)->ptr)) { assert(q > p && q < alloct); allocp = p; p->ptr = q->ptr; if (allocend == q) allocend = p; } if(q >= p+nw && p+nw >= p) goto found; } q = p; p = clearbusy(p->ptr); if(p > q) assert(p <= alloct); else if(q != alloct || p != allocs) { assert(q == alloct && p == allocs); return(NULL); } else if(++temp > 1) break; } /* set block to search next */ p = allocend; q = (union store *)sbrk(0); if (q != alloct+1) { /* the addition must be done in words to prevent overflow. Also, use temporaries, since order of operations may be changed, otherwise. */ temp = ((nw+BLOCK/WORD - 1)/(BLOCK/WORD)); temp = temp * BLOCK; if (((INT)q%WORD) != 0) { incr = (WORD-(INT)q%WORD); q = (union store *)((char *)q + incr); temp += incr; } } else { temp = nw - (alloct - allocend); temp = ((temp+BLOCK/WORD)/(BLOCK/WORD)); temp = temp * BLOCK; } if(((unsigned int)q)+temp+GRANULE < (unsigned int)q) { return(NULL); } sav_temp = temp; if (temp > MAXALLOC) { if ((INT)sbrk(MAXALLOC) == -1) { return NULL; } temp -= MAXALLOC; } if((INT)sbrk(temp) == -1) { brk(q); /* move brkval back */ return(NULL); } allocend = q; assert(q > alloct); alloct->ptr = q; /* must subtract incr, since both q and temp had incr added */ q->ptr = (union store *) ((unsigned char *)q + sav_temp - incr) - 1; if(q != alloct+1) alloct->ptr = setbusy(alloct->ptr); alloct = q->ptr; alloct->ptr = setbusy(allocs); q = p; } found: allocp = p + nw; assert(allocp <= alloct); if(q > allocp) { allocx = allocp->ptr; allocp->ptr = p->ptr; } p->ptr = setbusy(allocp); /* move last block ptr, if necessary */ if (allocend == p) allocend = allocp; return((char*)(p+1)); } /* freeing strategy tuned for LIFO allocation */ void free(ap) register char *ap; { register union store *p = (union store *)ap; assert(p > clearbusy(allocs[1].ptr) && p <= alloct); assert(allock()); allocp = --p; assert(testbusy(p->ptr)); /* if just freed last block in arena */ p->ptr = clearbusy(p->ptr); if (p->ptr == alloct) allocend = p; assert(p->ptr > allocp && p->ptr <= alloct); assert(allocend <= alloct); } /* * realloc(p, nbytes) reallocates a block obtained from malloc() * and freed since last call of malloc() * to have new size nbytes, and old content * returns new location, or 0 on failure */ char * realloc(p, nbytes) char *p; unsigned nbytes; { register char *q; register union store *ap, *aq; register unsigned nw; unsigned onw; ap = (union store *)p; if(testbusy(ap[-1].ptr)) free(p); onw = ap[-1].ptr - ap; q = malloc(nbytes); if(q == NULL || q == p) return(q); nw = (nbytes+WORD-1)/WORD; if(nw < onw) onw = nw; aq = (union store *) memcpy(q, p, onw * WORD); if(aq < ap && aq+nw >= ap) (aq+(aq+nw-ap))->ptr = allocx; return(q); } #ifdef debug allock() { #ifdef longdebug register union store *p; int x; x = 0; for(p= &allocs[0]; clearbusy(p->ptr) > p; p=clearbusy(p->ptr)) { if(p == allocp) x++; } assert(p == alloct); return(x == 1 || p == allocp); #else return(1); #endif } #endif /* For debugging purposes only /*rstalloc() /*{ /* /* allocs[0].ptr = 0; /* brk(clearbusy(allocs[1].ptr)); /*} */ E 1 h56634 s 00001/00001/00016 d D 4.2 87/05/13 19:35:19 build 5 4 c removed old SCCS strings and inserted #ident BB e s 00000/00000/00017 d D 4.1 87/02/17 09:58:07 mth 4 3 c rolled rev to -r4 (mth) e s 00000/00000/00017 d D 3.1 87/01/20 16:55:13 mkm 3 2 c e s 00000/00000/00017 d D 2.1 87/01/20 16:48:52 mkm 2 1 c e s 00017/00000/00000 d D 1.1 87/01/19 16:38:34 mkm 1 0 c Placed under source control - mkm e u U f b f n t T I 1 D 5 /* " %W% %E% " */ E 5 I 5 #ident " %W% %E% " E 5 /*LINTLIBRARY*/ /* * Copy s2 to s1, stopping if character c is copied. Copy no more than n bytes. * Return a pointer to the byte after character c in the copy, * or NULL if c is not found in the first n bytes. */ char * memccpy(s1, s2, c, n) register char *s1, *s2; register int c, n; { while (--n >= 0) if ((*s1++ = *s2++) == c) return (s1); return (0); } E 1 2h45114 s 00001/00001/00017 d D 4.2 87/05/13 19:35:41 build 5 4 c removed old SCCS strings and inserted #ident BB e s 00000/00000/00018 d D 4.1 87/02/17 09:58:16 mth 4 3 c rolled rev to -r4 (mth) e s 00000/00000/00018 d D 3.1 87/01/20 16:55:16 mkm 3 2 c e s 00000/00000/00018 d D 2.1 87/01/20 16:48:56 mkm 2 1 c e s 00018/00000/00000 d D 1.1 87/01/19 16:38:36 mkm 1 0 c Placed under source control - mkm e u U f b f n t T I 1 D 5 /* " %W% %E% " */ E 5 I 5 #ident " %W% %E% " E 5 /*LINTLIBRARY*/ /* * Compare n bytes: s1>s2: >0 s1==s2: 0 s1= 0) if (diff = *s1++ - *s2++) return (diff); return (0); } E 1 h44306 s 00001/00001/00016 d D 4.2 87/05/13 19:35:52 build 5 4 c removed old SCCS strings and inserted #ident BB e s 00000/00000/00017 d D 4.1 87/02/17 09:58:20 mth 4 3 c rolled rev to -r4 (mth) e s 00000/00000/00017 d D 3.1 87/01/20 16:55:17 mkm 3 2 c e s 00000/00000/00017 d D 2.1 87/01/20 16:48:58 mkm 2 1 c e s 00017/00000/00000 d D 1.1 87/01/19 16:38:37 mkm 1 0 c Placed under source control - mkm e u U f b f n t T I 1 D 5 /* " %W% %E% " */ E 5 I 5 #ident " %W% %E% " E 5 /*LINTLIBRARY*/ /* * Copy s2 to s1, always copy n bytes. * Return s1 */ char * memcpy(s1, s2, n) register char *s1, *s2; register int n; { register char *os1 = s1; while (--n >= 0) *s1++ = *s2++; return (os1); } E 1 h46482 s 00001/00001/00016 d D 4.2 87/05/13 19:36:02 build 5 4 c removed old SCCS strings and inserted #ident BB e s 00000/00000/00017 d D 4.1 87/02/17 09:58:24 mth 4 3 c rolled rev to -r4 (mth) e s 00000/00000/00017 d D 3.1 87/01/20 16:55:18 mkm 3 2 c e s 00000/00000/00017 d D 2.1 87/01/20 16:49:00 mkm 2 1 c e s 00017/00000/00000 d D 1.1 87/01/19 16:38:37 mkm 1 0 c Placed under source control - mkm e u U f b f n t T I 1 D 5 /* " %W% %E% " */ E 5 I 5 #ident " %W% %E% " E 5 /*LINTLIBRARY*/ /* * Set an array of n chars starting at sp to the character c. * Return sp. */ char * memset(sp, c, n) register char *sp, c; register int n; { register char *sp0 = sp; while (--n >= 0) *sp++ = c; return (sp0); } E 1 h28599 s 00001/00001/00037 d D 4.2 87/05/13 19:36:13 build 5 4 c removed old SCCS strings and inserted #ident BB e s 00000/00000/00038 d D 4.1 87/02/17 09:58:28 mth 4 3 c rolled rev to -r4 (mth) e s 00000/00000/00038 d D 3.1 87/01/20 16:55:19 mkm 3 2 c e s 00000/00000/00038 d D 2.1 87/01/20 16:49:01 mkm 2 1 c e s 00038/00000/00000 d D 1.1 87/01/19 16:38:38 mkm 1 0 c Placed under source control - mkm e u U f b f n t T I 1 D 5 /* " %W% %E% " */ E 5 I 5 #ident " %W% %E% " E 5 /*LINTLIBRARY*/ /**************************************************************** * Routine expects a string of length at least 6, with * six trailing 'X's. These will be overlaid with a * letter and the last (5) digigts of the proccess ID. * If every letter (a thru z) thus inserted leads to * an existing file name, your string is shortened to * length zero upon return (first character set to '\0'). ***************************************************************/ extern int strlen(), access(), getpid(); char * mktemp(as) char *as; { register char *s=as; register unsigned pid; pid = getpid(); s += strlen(as); /* point at the terminal null */ while(*--s == 'X') { *s = (pid%10) + '0'; pid /= 10; } if(*++s) { /* maybe there were no 'X's */ *s = 'a'; while(access(as, 0) == 0) { if(++*s > 'z') { *as = '\0'; break; } } } else if(access(as, 0) == 0) *as = '\0'; return(as); } E 1 h30078 s 00001/00001/00030 d D 4.2 87/05/13 19:36:26 build 5 4 c removed old SCCS strings and inserted #ident BB e s 00000/00000/00031 d D 4.1 87/02/17 09:58:31 mth 4 3 c rolled rev to -r4 (mth) e s 00000/00000/00031 d D 3.1 87/01/20 16:55:20 mkm 3 2 c e s 00000/00000/00031 d D 2.1 87/01/20 16:49:02 mkm 2 1 c e s 00031/00000/00000 d D 1.1 87/01/19 16:38:38 mkm 1 0 c Placed under source control - mkm e u U f b f n t T I 1 D 5 /* " %W% %E% " */ E 5 I 5 #ident " %W% %E% " E 5 /*LINTLIBRARY*/ /* * modf(value, iptr) returns the signed fractional part of value * and stores the integer part indirectly through iptr. * */ #include #include double modf(value, iptr) double value; /* don't declare register, because of KILLNaN! */ register double *iptr; { register double absvalue; KILLNaN(value); /* raise exception on Not-a-Number (3b only) */ if ((absvalue = (value >= 0.0) ? value : -value) >= MAXPOWTWO) *iptr = value; /* it must be an integer */ else { *iptr = absvalue + MAXPOWTWO; /* shift fraction off right */ *iptr -= MAXPOWTWO; /* shift back without fraction */ while (*iptr > absvalue) /* above arithmetic might round */ *iptr -= 1.0; /* test again just to be sure */ if (value < 0.0) *iptr = -*iptr; } return (value - *iptr); /* signed fractional part */ } E 1 h28370 s 00001/00001/00106 d D 4.2 87/05/13 19:36:40 build 5 4 c removed old SCCS strings and inserted #ident BB e s 00000/00000/00107 d D 4.1 87/02/17 09:58:36 mth 4 3 c rolled rev to -r4 (mth) e s 00000/00000/00107 d D 3.1 87/01/20 16:55:21 mkm 3 2 c e s 00000/00000/00107 d D 2.1 87/01/20 16:49:04 mkm 2 1 c e s 00107/00000/00000 d D 1.1 87/01/19 16:38:39 mkm 1 0 c Placed under source control - mkm e u U f b f n t T I 1 D 5 /* " %W% %E% " */ E 5 I 5 #ident " %W% %E% " E 5 /*LINTLIBRARY*/ /* * Environment variable PROFDIR added such that: * If PROFDIR doesn't exist, "mon.out" is produced as before. * If PROFDIR = NULL, no profiling output is produced. * If PROFDIR = string, "string/pid.progname" is produced, * where name consists of argv[0] suitably massaged. */ #include #define PROFDIR "PROFDIR" extern int creat(), write(), close(), getpid(); extern void profil(), perror(); extern char *getenv(), *strcpy(), *strrchr(); char **___Argv = NULL; /* initialized to argv array by mcrt0 (if loaded) */ char *_countbase; /* BULL SEMS */ char *_countmax; static int ssiz; static struct hdr *sbuf; static char mon_out[100]; void monitor(lowpc, highpc, buffer, bufsize, nfunc) char *lowpc, *highpc; /* boundaries of text to be monitored */ WORD *buffer; /* ptr to space for monitor data (WORDs) */ int bufsize; /* size of above space (in WORDs) */ int nfunc; /* max no. of functions whose calls are counted (default nfunc is 300 on PDP11, 600 on others) */ { int scale; long text; register char *s, *end, *name = mon_out; if (lowpc == NULL) { /* true only at the end */ if (sbuf != NULL) { int fd; profil((char *)NULL, 0, 0, 0); if ((fd = creat(mon_out, 0666)) < 0 || write(fd, (char *)sbuf, (unsigned)ssiz) != ssiz) perror(mon_out); if (fd >= 0) (void) close(fd); } return; } _countbase = (char *)buffer + sizeof(struct hdr); /* BULL SEMS */ _countmax = _countbase + nfunc * sizeof(struct cnt) ; sbuf = NULL; ssiz = (sizeof(struct hdr) + nfunc * sizeof(struct cnt))/sizeof(WORD); if (ssiz >= bufsize || lowpc >= highpc) return; if ((s = getenv(PROFDIR)) == NULL) /* PROFDIR not in environment */ end = MON_OUT; /* use default "mon.out" */ else if (*s == '\0') /* value of PROFDIR is NULL */ return; /* no profiling on this run */ else { /* construct "PROFDIR/pid.progname" */ register int pid, n; while (*s != '\0') /* copy PROFDIR value (path-prefix) */ *name++ = *s++; *name++ = '/'; /* two slashes won't hurt */ if ((pid = getpid()) <= 0) /* extra test just in case */ pid = 1; /* getpid returns something inappropriate */ for (n = 10000; n > pid; n /= 10) ; /* suppress leading zeros */ for ( ; ; n /= 10) { *name++ = pid/n + '0'; if (n == 1) break; pid %= n; } *name++ = '.'; if (___Argv != NULL) /* mcrt0.s executed */ end = ((s = strrchr(___Argv[0], '/')) != NULL) ? s + 1 : /* use only file-name part */ ___Argv[0]; /* use entire name */ } (void) strcpy(name, end); /* copy final element of file-name */ sbuf = (struct hdr *)buffer; /* for writing buffer at the wrapup */ sbuf->lpc = lowpc; /* initialize the first */ sbuf->hpc = highpc; /* region of the buffer */ sbuf->nfns = nfunc; buffer += ssiz; /* move ptr past 2'nd region */ bufsize -= ssiz; /* no. WORDs in third region */ /* no. WORDs of text */ text = (highpc - lowpc + sizeof(WORD) - 1)/ sizeof(WORD); /* scale is a 16 bit fixed point fraction with the decimal point at the left */ if (bufsize < text) { /* make sure cast is done first! */ double temp = (double)bufsize; scale = (temp * (long)0200000L) / text; } else { /* scale must be less than 1 */ scale = 0xffff; } bufsize *= sizeof(WORD); /* bufsize into # bytes */ ssiz = ssiz * sizeof(WORD) + bufsize; /* size into # bytes */ profil((char *)buffer, bufsize, (int)lowpc, scale); } E 1 h28941 s 00001/00001/00240 d D 4.2 87/05/13 19:36:56 build 5 4 c removed old SCCS strings and inserted #ident BB e s 00000/00000/00241 d D 4.1 87/02/17 09:58:40 mth 4 3 c rolled rev to -r4 (mth) e s 00000/00000/00241 d D 3.1 87/01/20 16:55:22 mkm 3 2 c e s 00000/00000/00241 d D 2.1 87/01/20 16:49:05 mkm 2 1 c e s 00241/00000/00000 d D 1.1 87/01/19 16:38:40 mkm 1 0 c Placed under source control - mkm e u U f b f n t T I 1 D 5 /* " %W% %E% " */ E 5 I 5 #ident " %W% %E% " E 5 /*LINTLIBRARY*/ #if vax #define ISMAGIC(x) ((((unsigned short)x)==(unsigned short)VAXROMAGIC) || \ (((unsigned short)x)==(unsigned short)VAXWRMAGIC)) #endif #if u3b #define ISMAGIC(x) ((((unsigned short)x)==(unsigned short)N3BMAGIC) || \ (((unsigned short)x)==(unsigned short)NTVMAGIC)) #endif #if u3b5 #define ISMAGIC(x) ((x)==FBOMAGIC) #endif #if ridge #define ISMAGIC(x) ((((unsigned short)x)==(unsigned short)SPS9ROMAGIC) || \ (((unsigned short)x)==(unsigned short)SPS9WRMAGIC)) #endif #if u3b || vax || u3b5 || ridge #define BADMAG(x) (!ISMAGIC(x)) #endif /* * When a UNIX aout header is to be built in the optional header, * the following magic numbers can appear in that header: * * AOUT1MAGIC : default : readonly sharable text segment * AOUT2MAGIC : : writable text segment * PAGEMAGIC : : directly paged object file */ #define AOUT1MAGIC 0410 #define AOUT2MAGIC 0407 #define PAGEMAGIC 0413 #define SGSNAME "" #define SGS "" #define RELEASE "Release 6.0 6/1/82" #include #if vax || u3b || u3b5 || ridge # ifndef FLEXNAMES # define FLEXNAMES 1 # endif # undef n_name /* this patch causes problems here */ #endif #if !(u3b || vax || u3b5 || ridge) #define SPACE 100 /* number of symbols read at a time */ #endif extern long lseek(); extern int open(), read(), close(), strncmp(), strcmp(); int nlist(name, list) char *name; struct nlist *list; { #if u3b || vax || u3b5 || ridge extern char *malloc(); extern void free(); struct filehdr buf; struct syment sym; struct auxent aux; long n; int bufsiz=FILHSZ; #if FLEXNAMES char *strtab = (char *)0; long strtablen; #endif register struct nlist *p; register struct syment *q; #else struct nlist space[SPACE]; struct exec buf; int nlen=sizeof(space[0].n_name), bufsiz=(sizeof(buf)); unsigned n, m; register struct nlist *p, *q; #endif long sa; int fd; for (p = list; p->n_name && p->n_name[0]; p++) /* n_name can be ptr */ { p->n_type = 0; p->n_value = 0; #if u3b || vax || u3b5 || ridge p->n_value = 0L; p->n_scnum = 0; p->n_sclass = 0; #endif } if ((fd = open(name, 0)) < 0) return(-1); (void) read(fd, (char *)&buf, bufsiz); #if u3b || vax || u3b5 || ridge if (BADMAG(buf.f_magic)) #else if (BADMAG(buf)) #endif { (void) close(fd); return (-1); } #if u3b || vax || u3b5 || ridge sa = buf.f_symptr; /* direct pointer to sym tab */ lseek(fd, sa, 0); q = &sym; n = buf.f_nsyms; /* num. of sym tab entries */ #else sa = buf.a_text; sa += buf.a_data; #if u370 sa += (long)(buf.a_trsize + buf.a_drsize); #endif #if pdp11 if (buf.a_flag != 1) sa += sa; else if ( buf.a_magic == A_MAGIC5 ) sa += (long)buf.a_hitext << 16; /* remainder of text size for system overlay a.out */ #endif sa += (long)sizeof(buf); (void) lseek(fd, sa, 0); n = buf.a_syms; #endif while (n) { #if u3b || vax || u3b5 || ridge read(fd, (char *)&sym, SYMESZ); n -= (q->n_numaux + 1L); /* read past aux ent , if there is one */ if (q->n_numaux != 0) read(fd, (char *) &aux, AUXESZ); #else m = (n < sizeof(space))? n: sizeof(space); (void) read(fd, (char*)space, m); n -= m; for (q=space; (int)(m -= sizeof(space[0])) >= 0; ++q) { #endif for (p = list; p->n_name && p->n_name[0]; ++p) { #if u3b || vax || u3b5 || ridge /* * For 6.0, the name in an object file is * either stored in the eight long character * array, or in a string table at the end * of the object file. If the name is in the * string table, the eight characters are * thought of as a pair of longs, (n_zeroes * and n_offset) the first of which is zero * and the second is the offset of the name * in the string table. */ #if FLEXNAMES if (q->n_zeroes == 0L) /* in string table */ { if (strtab == (char *)0) /* need it */ { long home = lseek(fd, 0L, 1); if (lseek(fd, buf.f_symptr + buf.f_nsyms * SYMESZ, 0) == -1 || read(fd, (char *)&strtablen, sizeof(long)) != sizeof(long) || (strtab = malloc( (unsigned)strtablen)) == (char *)0 || read(fd, strtab + sizeof(long), strtablen - sizeof(long)) != strtablen - sizeof(long) || strtab[strtablen - 1] != '\0' || lseek(fd, home, 0) == -1) { (void) lseek(fd,home,0); (void) close(fd); if (strtab != (char *)0) free(strtab); return (-1); } } if (q->n_offset < sizeof(long) || q->n_offset >= strtablen) { (void) close(fd); if (strtab != (char *)0) free(strtab); return (-1); } if (strcmp(&strtab[q->n_offset], p->n_name)) { continue; } } else #endif /*FLEXNAMES*/ { if (strncmp(q->_n._n_name, p->n_name, SYMNMLEN)) { continue; } } #else if (strncmp(p->n_name, q->n_name, nlen)) continue; #endif #if u3b || vax || u3b5 || ridge if (p->n_value != 0L) /* got one already */ break; #endif p->n_value = q->n_value; p->n_type = q->n_type; #if u3b || vax || u3b5 || ridge p->n_scnum = q->n_scnum; p->n_sclass = q->n_sclass; #endif break; } #if !(u3b || vax || u3b5 || ridge) } #endif } (void) close(fd); #if (vax || u3b || u3b5 || ridge) && FLEXNAMES if (strtab != (char *)0) free(strtab); #endif return (0); } E 1 h63363 s 00001/00001/00027 d D 4.2 87/05/13 19:37:12 build 5 4 c removed old SCCS strings and inserted #ident BB e s 00000/00000/00028 d D 4.1 87/02/17 09:58:46 mth 4 3 c rolled rev to -r4 (mth) e s 00000/00000/00028 d D 3.1 87/01/20 16:55:24 mkm 3 2 c e s 00000/00000/00028 d D 2.1 87/01/20 16:49:08 mkm 2 1 c e s 00028/00000/00000 d D 1.1 87/01/19 16:38:41 mkm 1 0 c Placed under source control - mkm e u U f b f n t T I 1 D 5 /* " %W% %E% " */ E 5 I 5 #ident " %W% %E% " E 5 /*LINTLIBRARY*/ /* * Print the error indicated * in the cerror cell. */ extern int errno, sys_nerr, strlen(), write(); extern char *sys_errlist[]; void perror(s) char *s; { register char *c; register int n; c = "Unknown error"; if(errno < sys_nerr) c = sys_errlist[errno]; n = strlen(s); if(n) { (void) write(2, s, (unsigned)n); (void) write(2, ": ", 2); } (void) write(2, c, (unsigned)strlen(c)); (void) write(2, "\n", 1); } E 1 h51139 s 00001/00001/00090 d D 4.2 87/05/13 19:37:24 build 5 4 c removed old SCCS strings and inserted #ident BB e s 00000/00000/00091 d D 4.1 87/02/17 09:58:49 mth 4 3 c rolled rev to -r4 (mth) e s 00000/00000/00091 d D 3.1 87/01/20 16:55:25 mkm 3 2 c e s 00000/00000/00091 d D 2.1 87/01/20 16:49:10 mkm 2 1 c e s 00091/00000/00000 d D 1.1 87/01/19 16:38:41 mkm 1 0 c Placed under source control - mkm e u U f b f n t T I 1 D 5 /* " %W% %E% " */ E 5 I 5 #ident " %W% %E% " E 5 /* LINTLIBRARY */ /* putenv - change environment variables input - char *change = a pointer to a string of the form "name=value" output - 0, if successful 1, otherwise */ #define NULL 0 extern char **environ; /* pointer to enviroment */ static reall = 0; /* flag to reallocate space, if putenv is called more than once */ int putenv(change) char *change; { char **newenv; /* points to new environment */ register int which; /* index of variable to replace */ char *realloc(), *malloc(); /* memory alloc routines */ if ((which = find(change)) < 0) { /* if a new variable */ /* which is negative of table size, so invert and count new element */ which = (-which) + 1; if (reall) { /* we have expanded environ before */ newenv = (char **)realloc(environ, which*sizeof(char *)); if (newenv == NULL) return -1; /* now that we have space, change environ */ environ = newenv; } else { /* environ points to the original space */ reall++; newenv = (char **)malloc(which*sizeof(char *)); if (newenv == NULL) return -1; (void)memcpy((char *)newenv, (char *)environ, (int)(which*sizeof(char *))); environ = newenv; } environ[which-2] = change; environ[which-1] = NULL; } else { /* we are replacing an old variable */ environ[which] = change; } return 0; } /* find - find where s2 is in environ * * input - str = string of form name=value * * output - index of name in environ that matches "name" * -size of table, if none exists */ static find(str) register char *str; { register int ct = 0; /* index into environ */ while(environ[ct] != NULL) { if (match(environ[ct], str) != 0) return ct; ct++; } return -(++ct); } /* * s1 is either name, or name=value * s2 is name=value * if names match, return value of 1, * else return 0 */ static match(s1, s2) register char *s1, *s2; { while(*s1 == *s2++) { if (*s1 == '=') return 1; s1++; } return 0; } E 1 h63446 s 00001/00001/00026 d D 4.2 87/05/13 19:37:39 build 5 4 c removed old SCCS strings and inserted #ident BB e s 00000/00000/00027 d D 4.1 87/02/17 09:58:52 mth 4 3 c rolled rev to -r4 (mth) e s 00000/00000/00027 d D 3.1 87/01/20 16:55:26 mkm 3 2 c e s 00000/00000/00027 d D 2.1 87/01/20 16:49:12 mkm 2 1 c e s 00027/00000/00000 d D 1.1 87/01/19 16:38:42 mkm 1 0 c Placed under source control - mkm e u U f b f n t T I 1 D 5 /* " %W% %E% " */ E 5 I 5 #ident " %W% %E% " E 5 /*LINTLIBRARY*/ /* * format a password file entry */ #include #include extern int fprintf(); int putpwent(p, f) register struct passwd *p; register FILE *f; { (void) fprintf(f, "%s:%s", p->pw_name, p->pw_passwd); if((*p->pw_age) != '\0') (void) fprintf(f, ",%s", p->pw_age); (void) fprintf(f, ":%u:%u:%s:%s:%s", p->pw_uid, p->pw_gid, p->pw_gecos, p->pw_dir, p->pw_shell); (void) putc('\n', f); return(ferror(f)); } E 1 h59072 s 00001/00001/00151 d D 4.2 87/05/13 19:37:51 build 5 4 c removed old SCCS strings and inserted #ident BB e s 00000/00000/00152 d D 4.1 87/02/17 09:58:56 mth 4 3 c rolled rev to -r4 (mth) e s 00000/00000/00152 d D 3.1 87/01/20 16:55:27 mkm 3 2 c e s 00000/00000/00152 d D 2.1 87/01/20 16:49:14 mkm 2 1 c e s 00152/00000/00000 d D 1.1 87/01/19 16:38:43 mkm 1 0 c Placed under source control - mkm e u U f b f n t T I 1 D 5 /* " %W% %E% " */ E 5 I 5 #ident " %W% %E% " E 5 /*LINTLIBRARY*/ #ifndef pdp11 #ifdef vax /* number is determined experimentally on vax-11/780 */ #define MINCPY 24 /* minimum number of characters worth using memcpy for */ #else /* number is determined experimentally on 3b20s */ #define MINCPY 8 /* minimum number of characters worth using memcpy for */ #endif #define NULL 0 #define CPY(i, j) ((void) memcpy(i, j, n)) extern char *malloc(), *realloc(), *memcpy(); static char *qsbuf = NULL; #endif static qses, (*qscmp)(); void qsort(a, n, es, fc) char *a; unsigned n, es; int (*fc)(); { void qs1(); #ifndef pdp11 { static unsigned qsbufsize; if (es >= MINCPY) if (qsbuf == NULL) qsbuf = malloc(qsbufsize = es); else if (qsbufsize < es) qsbuf = realloc(qsbuf, qsbufsize = es); } #endif qscmp = fc; qses = es; qs1(a, a+n*es); } static void qs1(a, l) char *a, *l; { register char *i, *j; register int es; char *lp, *hp; int c; void qsexc(), qstexc(); unsigned n; es = qses; start: if((n=l-a) <= es) return; n = es * (n / (2*es)); hp = lp = a+n; i = a; j = l-es; while(1) { if(i < lp) { if((c = (*qscmp)(i, lp)) == 0) { qsexc(i, lp -= es); continue; } if(c < 0) { i += es; continue; } } loop: if(j > hp) { if((c = (*qscmp)(hp, j)) == 0) { qsexc(hp += es, j); goto loop; } if(c > 0) { if(i == lp) { qstexc(i, hp += es, j); i = lp += es; goto loop; } qsexc(i, j); j -= es; i += es; continue; } j -= es; goto loop; } if(i == lp) { if(lp-a >= l-hp) { qs1(hp+es, l); l = lp; } else { qs1(a, lp); a = hp+es; } goto start; } qstexc(j, lp -= es, i); j = hp -= es; } } static void qsexc(ri, rj) register char *ri, *rj; { register int n = qses; #ifndef pdp11 if (n >= MINCPY && qsbuf != NULL) { CPY(qsbuf, ri); CPY(ri, rj); CPY(rj, qsbuf); return; } #endif do { register char c = *ri; *ri++ = *rj; *rj++ = c; } while(--n); } static void qstexc(ri, rj, rk) register char *ri, *rj, *rk; { register int n = qses; #ifndef pdp11 if (n >= MINCPY && qsbuf != NULL) { CPY(qsbuf, ri); CPY(ri, rk); CPY(rk, rj); CPY(rj, qsbuf); return; } #endif do { register char c = *ri; *ri++ = *rk; *rk++ = *rj; *rj++ = c; } while(--n); } E 1 h39959 s 00001/00001/00016 d D 4.2 87/05/13 19:38:02 build 5 4 c removed old SCCS strings and inserted #ident BB e s 00000/00000/00017 d D 4.1 87/02/17 09:59:01 mth 4 3 c rolled rev to -r4 (mth) e s 00000/00000/00017 d D 3.1 87/01/20 16:55:28 mkm 3 2 c e s 00000/00000/00017 d D 2.1 87/01/20 16:49:15 mkm 2 1 c e s 00017/00000/00000 d D 1.1 87/01/19 16:38:43 mkm 1 0 c Placed under source control - mkm e u U f b f n t T I 1 D 5 /* " %W% %E% " */ E 5 I 5 #ident " %W% %E% " E 5 /*LINTLIBRARY*/ static long randx=1; void srand(x) unsigned x; { randx = x; } int rand() { return(((randx = randx * 1103515245L + 12345)>>16) & 0x7fff); } E 1 h10878 s 00001/00000/00058 d D 4.3 87/04/10 15:36:46 build 6 5 c Profiling changes e s 00019/00003/00039 d D 4.2 87/02/17 11:22:31 mth 5 4 c Parameters in registers e s 00000/00000/00042 d D 4.1 87/02/17 09:59:04 mth 4 3 c rolled rev to -r4 (mth) e s 00000/00000/00042 d D 3.1 87/01/20 16:55:29 mkm 3 2 c e s 00000/00000/00042 d D 2.1 87/01/20 16:49:17 mkm 2 1 c e s 00042/00000/00000 d D 1.1 87/01/19 16:38:44 mkm 1 0 c Placed under source control - mkm e u U f b f n t T I 1 ; " %W% %E% " global _setjmp global _longjmp csect code align 8 _setjmp: I 6 ; MCOUNT E 6 I 5 #ifndef ARGSINREGS E 5 load r0,r14,24 ; get address of save area D 5 E 5 store r6,r0,0 ; save register R6 I 5 #endif E 5 store r7,r0,4 ; save register R7 store r8,r0,8 ; save register R8 store r9,r0,12 ; save register R9 store r10,r0,16 ; save register R10 store r11,r0,20 ; save register R11 store r12,r0,24 ; save register R12 store r13,r0,28 ; save register R13 store r14,r0,32 ; save register R14 store r15,r0,36 ; save register R15 movei r0,0 ; return a value of 0 D 5 ret r11,r11 ; return E 5 I 5 ret LINK,LINK ; return E 5 align 8 _longjmp: I 5 #ifdef ARGSINREGS ; load r6,r0,0 ; get register R6 load r7,r0,4 ; get register R7 load r8,r0,8 ; get register R8 load r9,r0,12 ; get register R9 load r10,r0,16 ; get register R10 load r11,r0,20 ; get register R11 load r12,r0,24 ; get register R12 load r13,r0,28 ; get register R13 load r14,r0,32 ; get register R14 load r15,r0,36 ; get register R15 move r0,r1 #else E 5 load r1,r14,24 ; get address of save area load r0,r14,32 ; get returned value load r6,r1,0 ; get register R6 load r7,r1,4 ; get register R7 load r8,r1,8 ; get register R8 load r9,r1,12 ; get register R9 load r10,r1,16 ; get register R10 load r11,r1,20 ; get register R11 load r12,r1,24 ; get register R12 load r13,r1,28 ; get register R13 load r14,r1,32 ; get register R14 load r15,r1,36 ; get register R15 I 5 #endif E 5 D 5 ret r11,r11 ; return E 5 I 5 ret LINK,LINK ; return E 5 E 1 h64150 s 00001/00001/00070 d D 4.2 87/05/13 19:38:15 build 5 4 c removed old SCCS strings and inserted #ident BB e s 00000/00000/00071 d D 4.1 87/02/17 09:59:09 mth 4 3 c rolled rev to -r4 (mth) e s 00000/00000/00071 d D 3.1 87/01/20 16:55:30 mkm 3 2 c e s 00000/00000/00071 d D 2.1 87/01/20 16:49:18 mkm 2 1 c e s 00071/00000/00000 d D 1.1 87/01/19 16:38:45 mkm 1 0 c Placed under source control - mkm e u U f b f n t T I 1 D 5 /* " %W% %E% " */ E 5 I 5 #ident " %W% %E% " E 5 /*LINTLIBRARY*/ /* * Suspend the process for `sleep_tm' seconds - using alarm/pause * system calls. If caller had an alarm already set to go off `n' * seconds from now, then Case 1: (sleep_tm >= n) sleep for n, and * cause the callers previously specified alarm interrupt routine * to be executed, then return the value (sleep_tm - n) to the caller * as the unslept amount of time, Case 2: (sleep_tm < n) sleep for * sleep_tm, after which, reset alarm to go off when it would have * anyway. In case process is aroused during sleep by any caught * signal, then reset any prior alarm, as above, and return to the * caller the (unsigned) quantity of (requested) seconds unslept. */ #include #include extern int (*signal())(), pause(); extern unsigned alarm(); static jmp_buf env; unsigned sleep(sleep_tm) unsigned sleep_tm; { int alrm_flg, (*alrm_sig)(), awake(); unsigned unslept, alrm_tm, left_ovr; if(sleep_tm == 0) return(0); alrm_tm = alarm(0); /* prev. alarm time */ alrm_sig = signal(SIGALRM, awake); /* prev. alarm prog */ alrm_flg = 0; left_ovr = 0; if(alrm_tm != 0) { /* skip all this if no prev. alarm */ if(alrm_tm > sleep_tm) { /* alarm set way-out */ alrm_tm -= sleep_tm; ++alrm_flg; } else { /* alarm will shorten sleep time */ left_ovr = sleep_tm - alrm_tm; sleep_tm = alrm_tm; alrm_tm = 0; --alrm_flg; (void) signal(SIGALRM, alrm_sig); } } /* use setjmp and long jump to avoid infinite sleep if alarm goes off before pause is called. The interupt handling routine will return via a longjmp, not a return. */ if (setjmp(env) == 0) { (void) alarm(sleep_tm); pause(); /* Some other signal may be caught, returning here, in which case we set-up to return to our caller */ } unslept = alarm(0); if(alrm_flg >= 0) (void) signal(SIGALRM, alrm_sig); if(alrm_flg > 0 || (alrm_flg < 0 && unslept != 0)) (void) alarm(alrm_tm + unslept); return(left_ovr + unslept); } static awake() { longjmp(env, 1); } E 1 h23876 s 00001/00001/00046 d D 4.2 87/05/13 19:38:33 build 5 4 c removed old SCCS strings and inserted #ident BB e s 00000/00000/00047 d D 4.1 87/02/17 09:59:12 mth 4 3 c rolled rev to -r4 (mth) e s 00000/00000/00047 d D 3.1 87/01/20 16:55:31 mkm 3 2 c e s 00000/00000/00047 d D 2.1 87/01/20 16:49:20 mkm 2 1 c e s 00047/00000/00000 d D 1.1 87/01/19 16:38:45 mkm 1 0 c Placed under source control - mkm e u U f b f n t T I 1 D 5 /* " %W% %E% " */ E 5 I 5 #ident " %W% %E% " E 5 /*LINTLIBRARY*/ /* * ssignal, gsignal: software signals */ #include /* Highest allowable user signal number */ #define MAXSIG 16 /* Lowest allowable signal number (lowest user number is always 1) */ #define MINSIG (-4) /* Table of signal values */ static int (*sigs[MAXSIG-MINSIG+1])(); int (*ssignal(sig, fn))() register int sig, (*fn)(); { register int (*savefn)(); if(sig >= MINSIG && sig <= MAXSIG) { savefn = sigs[sig-MINSIG]; sigs[sig-MINSIG] = fn; } else savefn = SIG_DFL; return(savefn); } int gsignal(sig) register int sig; { register int (*sigfn)(); if(sig < MINSIG || sig > MAXSIG || (sigfn = sigs[sig-MINSIG]) == SIG_DFL) return(0); else if(sigfn == SIG_IGN) return(1); else { sigs[sig-MINSIG] = SIG_DFL; return((*sigfn)(sig)); } } E 1 h56236 s 00001/00000/00053 d D 4.2 87/04/10 15:36:47 build 5 4 c Profiling changes e s 00000/00000/00053 d D 4.1 87/02/20 17:03:59 mth 4 3 c rolled rev to -r4 (mth) e s 00000/00000/00053 d D 3.1 87/02/20 17:03:59 mth 3 2 c AUTO NULL DELTA e s 00000/00000/00053 d D 2.1 87/02/20 17:03:59 mth 2 1 c AUTO NULL DELTA e s 00053/00000/00000 d D 1.1 87/02/20 17:03:00 mth 1 0 c placed under source control (replaces .c file) mth e u U f b f n t T I 1 ; "%W% %G%" ; ; char *strcat(s1, s2) ; char *s1, *s2 ; ; { ; char *os1 ; ; ; os1 = s1 ; ; while (*s1++) ; ; --s1 ; ; while (*s1++ = *s2++) ; ; return(os1) ; ; } ; argbase equ 24 s1 equ argbase + 0 s2 equ argbase + 8 align 8 ; force word alignment of key inner loop #ifndef ARGSINREGS move r0,r0 ; (nop) for loop start alignment move r0,r0 ; (nop) for loop start alignment move r0,r0 ; (nop) for loop start alignment #endif global _strcat _strcat: I 5 ; MCOUNT E 5 #ifdef ARGSINREGS move r2,r1 move r1,r0 #else load r1,r14,s1 ;r1 is s1 and a working pointer load r2,r14,s2 ;r2 is s2 and a working pointer move r0,r1 ;r0 is s1 and the result #endif l0: loadb r3,r1,0 ;load a byte of s1 addi r1,1 ;bump pointer br r3<>0,l0 ! ;branch if no null byte align 4 l1: loadb r3,r2,0 ;load a byte of s2 storeb r3,r1,-1 ;concatenate it addi r1,1 ;bump destination pointer addi r2,1 ;bump source pointer br r3<>0,l1 ! ;branch if no null byte ret LINK,LINK ;get the hell out of here ;with the result in r0 E 1 h38228 s 00001/00000/00047 d D 4.2 87/04/10 15:36:48 build 5 4 c Profiling changes e s 00000/00000/00047 d D 4.1 87/02/20 17:04:08 mth 4 3 c rolled rev to -r4 (mth) e s 00000/00000/00047 d D 3.1 87/02/20 17:04:08 mth 3 2 c AUTO NULL DELTA e s 00000/00000/00047 d D 2.1 87/02/20 17:04:08 mth 2 1 c AUTO NULL DELTA e s 00047/00000/00000 d D 1.1 87/02/20 17:03:01 mth 1 0 c placed under source control (replaces .c file) mth e u U f b f n t T I 1 ; "%W% %G%" ; ; purpose: This is the standard C string ; character find routine. ; ; ; char *strrchr(s, c) ; char *s, c ; ; { ; char *r ; ; ; r = NULL ; ; do ; { ; if (*s == c) { ; r = s ; ; break; ; } ; } ; while (*s++) ; ; return(r) ; ; } ; argbase equ 24 s equ argbase + 0 c equ argbase + 8 align 8 ; force word alignment of key inner loop global _strchr _strchr: I 5 ; MCOUNT E 5 #ifndef ARGSINREGS load r0,r14,s ;r0 is pointer to s load r1,r14,c ;r1 is the character #endif ; try to maintain word alignment of this label l0: loadb r2,r0,0 ;load a byte of s br r2=r1,out ;found first occurence add r0,1 br r2<>0,l0! ;keep looping till NULL move r0, r2 ;return NULL out: ret LINK,LINK ;get the hell out of here ;with the result in r0 E 1 h32014 s 00001/00000/00044 d D 4.2 87/04/10 15:36:49 build 5 4 c Profiling changes e s 00000/00000/00044 d D 4.1 87/02/20 17:04:16 mth 4 3 c rolled rev to -r4 (mth) e s 00000/00000/00044 d D 3.1 87/02/20 17:04:16 mth 3 2 c AUTO NULL DELTA e s 00000/00000/00044 d D 2.1 87/02/20 17:04:16 mth 2 1 c AUTO NULL DELTA e s 00044/00000/00000 d D 1.1 87/02/20 17:03:02 mth 1 0 c placed under source control (replaces .c file) mth e u U f b f n t T I 1 ; "%W% %G%" ; ; char *strcmp(s1, s2) ; char *s1, *s2 ; ; { ; for ( ; *s1 == *s2 ; s1++, s2++) ; if (*s1 == '\0') ; return(0) ; ; return(*s1 - *s2) ; ; } ; argbase equ 24 s1 equ argbase + 0 s2 equ argbase + 8 align 8 ; force word alignment of key inner loop global _strcmp _strcmp: I 5 ; MCOUNT E 5 #ifdef ARGSINREGS move r2,r1 move r1,r0 #else load r1,r14,s1 ;r1 is s1 load r2,r14,s2 ;r2 is s2 #endif ; try to maintain word alignment of this label l0: loadb r0,r1,0 ;load a byte of s1 loadb r3,r2,0 ;load a byte of s2 addi r1,1 ; addi r2,1 ; br r0<>r3,l1 ;branch if mismatch br r0<>0,l0 ! ; usual case, look at next char br l999 ; l1: sub r0,r3 ;compute difference l999: ret LINK,LINK ;get the hell out of here ;with the result in r0 E 1 h43420 s 00001/00000/00046 d D 4.2 87/04/10 15:36:50 build 5 4 c Profiling changes e s 00000/00000/00046 d D 4.1 87/02/20 17:04:01 mth 4 3 c rolled rev to -r4 (mth) e s 00000/00000/00046 d D 3.1 87/02/20 17:04:01 mth 3 2 c AUTO NULL DELTA e s 00000/00000/00046 d D 2.1 87/02/20 17:04:01 mth 2 1 c AUTO NULL DELTA e s 00046/00000/00000 d D 1.1 87/02/20 17:03:03 mth 1 0 c placed under source control (replaces .c file) mth e u U f b f n t T I 1 ; "%W% %G%" ; ; char *strcpy(s1, s2) ; char *s1, *s2 ; ; { ; char *os1 ; ; ; os1 = s1 ; ; while (*s1++ = *s2++) ; ; return(os1) ; ; } ; argbase equ 24 s1 equ argbase + 0 s2 equ argbase + 8 align 8 ; force word alignment of key inner loop #ifndef ARGSINREGS move r0,r0 ; (nop) for loop start alignment move r0,r0 ; (nop) for loop start alignment move r0,r0 ; (nop) for loop start alignment #endif global _strcpy _strcpy: I 5 ; MCOUNT E 5 #ifdef ARGSINREGS move r2,r1 move r1,r0 #else load r1,r14,s1 ;r1 is s1 and a working pointer load r2,r14,s2 ;r2 is s2 and a working pointer move r0,r1 ;r0 is s1 and the result #endif ; try to maintain word alignment of this label l0: loadb r3,r2,0 ;load a char from s2 storeb r3,r1,0 ;store it into s1 addi r1,1 ; addi r2,1 ; br r3<>0,l0 ! ;do it again if no null byte ret LINK,LINK ;get the hell out of here ;with the result in r0 E 1 h19826 s 00001/00000/00067 d D 4.2 87/04/10 15:36:51 build 5 4 c Profiling changes e s 00000/00000/00067 d D 4.1 87/02/20 17:04:09 mth 4 3 c rolled rev to -r4 (mth) e s 00000/00000/00067 d D 3.1 87/02/20 17:04:09 mth 3 2 c AUTO NULL DELTA e s 00000/00000/00067 d D 2.1 87/02/20 17:04:09 mth 2 1 c AUTO NULL DELTA e s 00067/00000/00000 d D 1.1 87/02/20 17:03:04 mth 1 0 c placed under source control (replaces .c file) mth e u U f b f n t T I 1 ; "%W% %G%" ; ; purpose: This is the standard C string ; character span routine that finds ; a span of characters in s1 that ; are NOT composed of chars in s2. ; ; ; int strcspn(s1, s2) ; char *s1, *s2 ; ; { ; char *p, *q ; ; ; for (q=s1 ; *q != '\0' ; ++q) ; { ; for (p=s2 ; *p != '\0' && *p != *q ; ++p) ; ; if (*p != '\0') ; break ; ; } ; ; return (q-s1) ; ; } ; ; argbase equ 24 s1 equ argbase + 0 s2 equ argbase + 8 align 8 ; force word alignment of key inner loop #ifndef ARGSINREGS move r0,r0 ; (nop) for loop start alignment move r0,r0 ; (nop) for loop start alignment move r0,r0 ; (nop) for loop start alignment #endif global _strcspn _strcspn: I 5 ; MCOUNT E 5 #ifdef ARGSINREGS move r2,r1 move r1,r0 #else load r1,r14,s1 ;r1 is s1 load r2,r14,s2 ;r2 is s2 move r0,r1 ;r0 is s1 and the result #endif ; try to maintain word alignment of this label l0: loadb r4,r0,0 ;load a char from s1 addi r0,1 ; br r4=0,l3 ; move r3,r2 ;r3 is span set pointer ; try to maintain word alignment of this label l1: loadb r5,r3,0 ;load a char from the span set addi r3,1 ; br r5=0,l0 ;not predicted since not normal case br r4<>r5,l1 ! ;predicted branch to speed up innermost case l3: sub r0,r1 ;compute length subi r0,1 ; ret LINK,LINK ;get the hell out of here ;with the result in r0 E 1 h32671 s 00001/00000/00047 d D 4.2 87/04/10 15:36:52 build 5 4 c Profiling changes e s 00000/00000/00047 d D 4.1 87/02/20 17:04:17 mth 4 3 c rolled rev to -r4 (mth) e s 00000/00000/00047 d D 3.1 87/02/20 17:04:17 mth 3 2 c AUTO NULL DELTA e s 00000/00000/00047 d D 2.1 87/02/20 17:04:17 mth 2 1 c AUTO NULL DELTA e s 00047/00000/00000 d D 1.1 87/02/20 17:03:05 mth 1 0 c placed under source control (replaces .c file) mth e u U f b f n t T I 1 ; "%W% %G%" ; ; purpose: This is the standard C string ; length routine. ; ; ; int strlen(s) ; char *s ; ; { ; int n ; ; ; n = 0 ; ; while (*s++) ; n++ ; ; return(n) ; ; } ; argbase equ 24 s equ argbase + 0 align 8 ; force word alignment of key inner loop #ifndef ARGSINREGS move r0,r0 ; (nop) for loop start alignment #endif global _strlen _strlen: I 5 ; MCOUNT E 5 #ifdef ARGSINREGS move r1,r0 #else load r1,r14,s ;r1 is s and a working pointer #endif move r0,0 ;n <- 0 ; try to maintain word alignment of this label l0: loadb r2,r1,0 ;load a byte from s addi r1,1 ; br r2=0,l999 ;check for null byte addi r0,1 ;n <- n + 1 br l0 ;do it again align 4 l999: ret LINK,LINK ;get the hell out of here ;with the result in r0 E 1 h31179 s 00001/00000/00070 d D 4.2 87/04/10 15:36:53 build 5 4 c Profiling changes e s 00000/00000/00070 d D 4.1 87/02/20 17:04:02 mth 4 3 c rolled rev to -r4 (mth) e s 00000/00000/00070 d D 3.1 87/02/20 17:04:02 mth 3 2 c AUTO NULL DELTA e s 00000/00000/00070 d D 2.1 87/02/20 17:04:02 mth 2 1 c AUTO NULL DELTA e s 00070/00000/00000 d D 1.1 87/02/20 17:03:06 mth 1 0 c placed under source control (replaces .c file) mth e u U f b f n t T I 1 ; "%W% %G%" ; ; purpose: This is the standard C string ; concatenation routine, with an ; "n" character limit. ; ; ; char *strcat(s1, s2, n) ; char *s1, *s2 ; ; int n; ; { ; char *os1 ; ; ; os1 = s1 ; ; while (*s1++) ; ; --s1 ; ; while (*s1++ = *s2++) ; ; if (--n < 0) ; { ; *--s1 = '\0' ; ; break ; ; } ; return(os1); ; } ; argbase equ 24 s1 equ argbase + 0 s2 equ argbase + 8 n equ argbase + 16 align 8 ; force word alignment of key inner loop move r0,r0 ; (nop) for loop start alignment global _strcatn global _strncat _strcatn: _strncat: I 5 ; MCOUNT E 5 #ifdef ARGSINREGS move r3,r2 move r2,r1 move r1,r0 #else load r1,r14,s1 ;r1 is s1 and a working pointer load r2,r14,s2 ;r2 is s2 and a working pointer load r3,r14,n ;r3 is n move r0,r1 ;r0 is s1 and the result #endif ; try to maintain word alignment of this label l0: loadb r4,r1,0 ;load a byte of s1 addi r1,1 ;bump pointer br r4<>0,l0 ! ;branch if no null byte (usual case) align 4 ; try to maintain word alignment of this label l1: loadb r4,r2,0 ;load a byte of s2 storeb r4,r1,-1 ;concatenate it addi r1,1 ;bump destination pointer addi r2,1 ;bump source pointer br r4=0,l2 ;branch if null byte subi r3,1 ;n-- br r3>=0,l1 ! ;branch if we haven't done n chars (usual case) move r4,0 ;null byte storeb r4,r1,-2 ;terminate string l2: ret LINK,LINK ;get the hell out of here ;with the result in r0 E 1 h06265 s 00001/00000/00069 d D 4.2 87/04/10 15:36:54 build 5 4 c Profiling changes e s 00000/00000/00069 d D 4.1 87/02/20 17:04:10 mth 4 3 c rolled rev to -r4 (mth) e s 00000/00000/00069 d D 3.1 87/02/20 17:04:10 mth 3 2 c AUTO NULL DELTA e s 00000/00000/00069 d D 2.1 87/02/20 17:04:10 mth 2 1 c AUTO NULL DELTA e s 00069/00000/00000 d D 1.1 87/02/20 17:03:07 mth 1 0 c placed under source control (replaces .c file) mth e u U f b f n t T I 1 ; "%W% %G%" ; ; purpose: This is the standard C string ; compare routine, with an "n" ; character limit. ; ; ; char *strncmp(s1, s2, n) ; char *s1, *s2 ; ; int n ; ; { ; while ( --n >= 0 && *s1 == *s2++) ; if (*s1++ == '\0') ; return(0) ; ; return(n < 0 ? 0 : *s1 - *--s2) ; ; } ; ; argbase equ 24 s1 equ argbase + 0 s2 equ argbase + 8 n equ argbase + 16 align 8 ; force word alignment of key inner loop #ifndef ARGSINREGS move r0,r0 ; (nop) for loop start alignment #endif move r0,r0 ; (nop) for loop start alignment global _strcmpn global _strncmp _strcmpn: _strncmp: I 5 ; MCOUNT E 5 #ifdef ARGSINREGS move r3,r2 move r2,r1 move r1,r0 #else load r1,r14,s1 ;r1 is s1 load r2,r14,s2 ;r2 is s2 load r3,r14,n ;r3 is n #endif ; try to maintain word alignment of this label l0: subi r3,1 ;n <- n - 1 br r3<0,l1 ; loadb r0,r1,0 ;load char from s1 loadb r4,r2,0 ;load char from s2 addi r1,1 ; addi r2,1 ; br r0<>r4,l1 ;branch if mismatch br r0<>0,l0 ! ;do it again if no null (usual case) br l999 ; align 4 l1: br r3>=0,l2 ; move r0,0 ; br l999 ; align 4 l2: sub r0,r4 ;compute difference l999: ret LINK,LINK ;get the hell out of here ;with the result in r0 E 1 h20084 s 00001/00000/00074 d D 4.2 87/04/10 15:36:55 build 5 4 c Profiling changes e s 00000/00000/00074 d D 4.1 87/02/20 17:04:17 mth 4 3 c rolled rev to -r4 (mth) e s 00000/00000/00074 d D 3.1 87/02/20 17:04:17 mth 3 2 c AUTO NULL DELTA e s 00000/00000/00074 d D 2.1 87/02/20 17:04:17 mth 2 1 c AUTO NULL DELTA e s 00074/00000/00000 d D 1.1 87/02/20 17:03:08 mth 1 0 c placed under source control (replaces .c file) mth e u U f b f n t T I 1 ; "%W% %G%" ; ; purpose: This is the standard C string ; copy routine, with an ; "n" character limit. ; ; ; char *strncpy(s1, s2, n) ; char *s1, *s2 ; ; int n ; ; { ; char *os1 ; ; int i ; ; ; os1 = s1 ; ; for (i = 0 ; i < n ; i++) ; if ((*s1++ = *s2++) == '\0') ; { ; while (++i < n) ; *s1++ = '\0' ; ; return(os1) ; ; } ; ; return(os1) ; ; } ; ; argbase equ 24 s1 equ argbase + 0 s2 equ argbase + 8 n equ argbase + 16 align 8 ; force word alignment of key inner loop global _strcpyn global _strncpy _strcpyn: _strncpy: I 5 ; MCOUNT E 5 #ifdef ARGSINREGS move r3,r2 move r2,r1 move r1,r0 #else load r1,r14,s1 ;r1 is s1 load r2,r14,s2 ;r2 is s2 load r3,r14,n ;r3 is n move r0,r1 ;r0 is result #endif move r4,0 ;r4 is i ; try to maintain word alignment of this label l0: br r4>=r3,l999 ;test i against n addi r4,1 ;i <- i + 1 loadb r5,r2,0 ;load a byte of s2 storeb r5,r1,0 ;store it into s1 addi r1,1 ; addi r2,1 ; br r5<>0,l0 ! ;do it again if no null byte (usual case) align 4 ; try to maintain word alignment of this label l1: br r4>=r3,l999 ;see if we need to pad with nulls addi r4,1 ; storeb r5,r1,0 ;remember: r8 is '\0' at this point addi r1,1 ; br l1 ;do it again align 4 l999: ret LINK,LINK ;get the hell out of here ;with the result in r0 E 1 h64019 s 00001/00000/00062 d D 4.2 87/04/10 15:36:56 build 5 4 c Profiling changes e s 00000/00000/00062 d D 4.1 87/02/20 17:04:03 mth 4 3 c rolled rev to -r4 (mth) e s 00000/00000/00062 d D 3.1 87/02/20 17:04:03 mth 3 2 c AUTO NULL DELTA e s 00000/00000/00062 d D 2.1 87/02/20 17:04:03 mth 2 1 c AUTO NULL DELTA e s 00062/00000/00000 d D 1.1 87/02/20 17:03:09 mth 1 0 c placed under source control (replaces .c file) mth e u U f b f n t T I 1 ; "%W% %G%" ; ; char *strpbrk(s1, s2) ; char *s1, *s2 ; ; { ; char *p ; ; ; if (!s1 || !s2) ; return(0) ; ; do ; { ; for (p=s2 ; *p != '\0' && *p != *s1 ; ++p); ; if (*p != '\0') ; return(s1) ; ; } ; while (*s1++) ; ; return(0) ; ; } ; argbase equ 24 s1 equ argbase + 0 s2 equ argbase + 8 align 8 ; force word alignment of key inner loop #ifndef ARGSINREGS move r0,r0 ; (nop) for loop start alignment move r0,r0 ; (nop) for loop start alignment #endif global _strpbrk _strpbrk: I 5 ; MCOUNT E 5 #ifndef ARGSINREGS load r0,r14,s1 ;s1 pointer load r1,r14,s2 ;s2 pointer #endif br r0=0,l999 ;test for null strings br r1<>0,l0 ; move r0,0 ; br l999 ; l0: move r2,r1 ;r2 is break set pointer loadb r4,r0,0 ;load char from s1 ; try to maintain word alignment of this label l1: loadb r5,r2,0 ;load char from break set addi r2,1 ; br r5=0,l2 ; br r4<>r5,l1 ! ; (usual case) l2: br r5<>0,l999 ;we have a match addi r0,1 ; br r4<>0,l0 ;repeat outer loop movei r0,0 ; l999: ret LINK,LINK ;get the hell out of here ;with the result in r0 E 1 h60151 s 00001/00000/00060 d D 4.2 87/04/10 15:36:57 build 5 4 c Profiling changes e s 00000/00000/00060 d D 4.1 87/02/20 17:04:11 mth 4 3 c rolled rev to -r4 (mth) e s 00000/00000/00060 d D 3.1 87/02/20 17:04:11 mth 3 2 c AUTO NULL DELTA e s 00000/00000/00060 d D 2.1 87/02/20 17:04:11 mth 2 1 c AUTO NULL DELTA e s 00060/00000/00000 d D 1.1 87/02/20 17:03:11 mth 1 0 c placed under source control (replaces .c file) mth e u U f b f n t T I 1 ; "%W% %G%" ; ; purpose: This is the standard C string ; character find routine. This ; routine finds the last occurence. ; ; ; char *strrchr(s, c) ; char *s, c ; ; { ; char *r ; ; ; r = NULL ; ; do ; { ; if (*s == c) ; r = s ; ; } ; while (*s++) ; ; return(r) ; ; } ; argbase equ 24 s equ argbase + 0 c equ argbase + 8 align 8 ; force word alignment of key inner loop #ifndef ARGSINREGS move r0,r0 ; (nop) for loop start alignment move r0,r0 ; (nop) for loop start alignment #endif move r0,r0 ; (nop) for loop start alignment global _strrchr _strrchr: I 5 ; MCOUNT E 5 #ifdef ARGSINREGS move r2,r1 move r1,r0 #else load r1,r14,s ;r1 is pointer to s load r2,r14,c ;r2 is the character #endif move r0,0 ;r <- NULL ; try to maintain word alignment of this label l0: loadb r3,r1,0 ;load a byte of s br r3<>r2,l1 ;branch if no match move r0,r1 ;r <- s align 4 ; try to maintain word alignment of this label l1: addi r1,1 ; br r3<>0,l0 ; ret LINK,LINK ;get the hell out of here ;with the result in r0 E 1 h62376 s 00001/00000/00062 d D 4.2 87/04/10 15:36:58 build 5 4 c Profiling changes e s 00000/00000/00062 d D 4.1 87/02/20 17:04:19 mth 4 3 c rolled rev to -r4 (mth) e s 00000/00000/00062 d D 3.1 87/02/20 17:04:19 mth 3 2 c AUTO NULL DELTA e s 00000/00000/00062 d D 2.1 87/02/20 17:04:19 mth 2 1 c AUTO NULL DELTA e s 00062/00000/00000 d D 1.1 87/02/20 17:03:11 mth 1 0 c placed under source control (replaces .c file) mth e u U f b f n t T I 1 ; "%W% %G%" ; ; purpose: This is the standard C string ; character span routine. ; ; ; int strspn(s1, s2) ; char *s1, *s2 ; ; { ; char *p, *q ; ; ; for (q=s1 ; *q != '\0' ; ++q) ; { ; for (p=s2 ; *p != '\0' && *p != *q ; ++p) ; ; if (*p == '\0') ; break ; ; } ; ; return (q-s1) ; ; } ; ; argbase equ 24 s1 equ argbase + 0 s2 equ argbase + 8 align 8 ; force word alignment of key inner loop #ifndef ARGSINREGS move r0,r0 ; (nop) for loop start alignment #endif global _strspn _strspn: I 5 ; MCOUNT E 5 #ifdef ARGSINREGS move r2,r1 move r1,r0 #else load r1,r14,s1 ;r1 is s1 load r2,r14,s2 ;r2 is s2 move r0,r1 ;r0 is s1 and the result #endif l0: loadb r4,r0,0 ;load a char from s1 addi r0,1 ; br r4=0,l3 ; move r3,r2 ;r3 is span set pointer ; try to maintain word alignment of this label l1: loadb r5,r3,0 ;load a char from the span set addi r3,1 ; br r5=0,l3 ; br r4<>r5,l1 ! ; (usual case) not match, try next span char br l0 ;mj 2/28/86 l3: sub r0,r1 ;compute length subi r0,1 ; ret LINK,LINK ;get the hell out of here ;with the result in r0 E 1 h09392 s 00001/00001/00015 d D 4.2 87/05/13 19:38:46 build 5 4 c removed old SCCS strings and inserted #ident BB e s 00000/00000/00016 d D 4.1 87/02/17 10:00:01 mth 4 3 c rolled rev to -r4 (mth) e s 00000/00000/00016 d D 3.1 87/01/20 16:55:43 mkm 3 2 c e s 00000/00000/00016 d D 2.1 87/01/20 16:49:34 mkm 2 1 c e s 00016/00000/00000 d D 1.1 87/01/19 16:38:53 mkm 1 0 c Placed under source control - mkm e u U f b f n t T I 1 D 5 /* " %W% %E% " */ E 5 I 5 #ident " %W% %E% " E 5 /*LINTLIBRARY*/ /* * C library - ascii to floating (atof) and string to double (strtod) * * This version compiles both atof and strtod depending on the value * of STRTOD, which is set in the file and may be overridden on the * "cc" command line. The only difference is the storage of a pointer * to the character which terminated the conversion. * Long-integer accumulation is used, except on the PDP11, where * "long" arithmetic is simulated, so floating-point is much faster. */ #ifndef STRTOD #define STRTOD 1 #endif #include "atof.c" E 1 h29538 s 00001/00001/00039 d D 4.2 87/05/13 19:38:57 build 5 4 c removed old SCCS strings and inserted #ident BB e s 00000/00000/00040 d D 4.1 87/02/17 10:00:05 mth 4 3 c rolled rev to -r4 (mth) e s 00000/00000/00040 d D 3.1 87/01/20 16:55:44 mkm 3 2 c e s 00000/00000/00040 d D 2.1 87/01/20 16:49:35 mkm 2 1 c e s 00040/00000/00000 d D 1.1 87/01/19 16:38:54 mkm 1 0 c Placed under source control - mkm e u U f b f n t T I 1 D 5 /* " %W% %E% " */ E 5 I 5 #ident " %W% %E% " E 5 /*LINTLIBRARY*/ /* * uses strpbrk and strspn to break string into tokens on * sequentially subsequent calls. returns NULL when no * non-separator characters remain. * `subsequent' calls are calls with first argument NULL. */ #define NULL (char*)0 extern int strspn(); extern char *strpbrk(); char * strtok(string, sepset) char *string, *sepset; { register char *p, *q, *r; static char *savept; /*first or subsequent call*/ p = (string == NULL)? savept: string; if(p == 0) /* return if no tokens remaining */ return(NULL); q = p + strspn(p, sepset); /* skip leading separators */ if(*q == '\0') /* return if no tokens remaining */ return(NULL); if((r = strpbrk(q, sepset)) == NULL) /* move past token */ savept = 0; /* indicate this is last token */ else { *r = '\0'; savept = ++r; } return(q); } E 1 h53877 s 00001/00001/00053 d D 4.2 87/05/13 19:39:09 build 5 4 c removed old SCCS strings and inserted #ident BB e s 00000/00000/00054 d D 4.1 87/02/17 10:00:08 mth 4 3 c rolled rev to -r4 (mth) e s 00000/00000/00054 d D 3.1 87/01/20 16:55:45 mkm 3 2 c e s 00000/00000/00054 d D 2.1 87/01/20 16:49:36 mkm 2 1 c e s 00054/00000/00000 d D 1.1 87/01/19 16:38:55 mkm 1 0 c Placed under source control - mkm e u U f b f n t T I 1 D 5 /* " %W% %E% " */ E 5 I 5 #ident " %W% %E% " E 5 /*LINTLIBRARY*/ #include #define DIGIT(x) (isdigit(x) ? (x) - '0' : \ islower(x) ? (x) + 10 - 'a' : (x) + 10 - 'A') #define MBASE ('z' - 'a' + 1 + 10) long strtol(str, ptr, base) register char *str; char **ptr; register int base; { register long val; register int c; int xx, neg = 0; if (ptr != (char **)0) *ptr = str; /* in case no number is formed */ if (base < 0 || base > MBASE) return (0); /* base is invalid -- should be a fatal error */ if (!isalnum(c = *str)) { while (isspace(c)) c = *++str; switch (c) { case '-': neg++; case '+': /* fall-through */ c = *++str; } } if (base == 0) if (c != '0') base = 10; else if (str[1] == 'x' || str[1] == 'X') base = 16; else base = 8; /* * for any base > 10, the digits incrementally following * 9 are assumed to be "abc...z" or "ABC...Z" */ if (!isalnum(c) || (xx = DIGIT(c)) >= base) return (0); /* no number formed */ if (base == 16 && c == '0' && isxdigit(str[2]) && (str[1] == 'x' || str[1] == 'X')) c = *(str += 2); /* skip over leading "0x" or "0X" */ for (val = -DIGIT(c); isalnum(c = *++str) && (xx = DIGIT(c)) < base; ) /* accumulate neg avoids surprises near MAXLONG */ val = base * val - xx; if (ptr != (char **)0) *ptr = str; return (neg ? val : -val); } E 1 h46638 s 00001/00001/00017 d D 4.2 87/05/13 19:39:22 build 5 4 c removed old SCCS strings and inserted #ident BB e s 00000/00000/00018 d D 4.1 87/02/17 10:00:14 mth 4 3 c rolled rev to -r4 (mth) e s 00000/00000/00018 d D 3.1 87/01/20 16:55:46 mkm 3 2 c e s 00000/00000/00018 d D 2.1 87/01/20 16:49:37 mkm 2 1 c e s 00018/00000/00000 d D 1.1 87/01/19 16:38:55 mkm 1 0 c Placed under source control - mkm e u U f b f n t T I 1 D 5 /* " %W% %E% " */ E 5 I 5 #ident " %W% %E% " E 5 /*LINTLIBRARY*/ /* * Swap bytes in 16-bit [half-]words * for going between the 11 and the interdata */ void swab(pf, pt, n) register short *pf, *pt; register int n; { n /= 2; while(--n >= 0) { *pt++ = (*pf << 8) + ((*pf >> 8) & 0377); pf++; } } E 1 h37431 s 00001/00001/00013 d D 4.2 87/05/13 19:39:32 build 5 4 c removed old SCCS strings and inserted #ident BB e s 00000/00000/00014 d D 4.1 87/02/17 10:00:18 mth 4 3 c rolled rev to -r4 (mth) e s 00000/00000/00014 d D 3.1 87/01/20 16:55:47 mkm 3 2 c e s 00000/00000/00014 d D 2.1 87/01/20 16:49:38 mkm 2 1 c e s 00014/00000/00000 d D 1.1 87/01/19 16:38:56 mkm 1 0 c Placed under source control - mkm e u U f b f n t T I 1 D 5 /* " %W% %E% " */ E 5 I 5 #ident " %W% %E% " E 5 /*LINTLIBRARY*/ /* * return offset in file. */ extern long lseek(); long tell(f) int f; { return(lseek(f, 0L, 1)); } E 1 h31045 s 00001/00001/00034 d D 4.2 87/05/13 19:39:46 build 5 4 c removed old SCCS strings and inserted #ident BB e s 00000/00000/00035 d D 4.1 87/02/17 10:00:21 mth 4 3 c rolled rev to -r4 (mth) e s 00000/00000/00035 d D 3.1 87/01/20 16:55:48 mkm 3 2 c e s 00000/00000/00035 d D 2.1 87/01/20 16:49:39 mkm 2 1 c e s 00035/00000/00000 d D 1.1 87/01/19 16:38:57 mkm 1 0 c Placed under source control - mkm e u U f b f n t T I 1 D 5 /* " %W% %E% " */ E 5 I 5 #ident " %W% %E% " E 5 /*LINTLIBRARY*/ /* * Tree search algorithm, generalized from Knuth (6.2.2) Algorithm T. * * The NODE * arguments are declared in the lint files as char *, * because the definition of NODE isn't available to the user. */ #include typedef char *POINTER; typedef struct node { POINTER key; struct node *llink, *rlink; } NODE; #define NULL 0 /* tfind - find a node, or return 0 */ NODE * tfind(key, rootp, compar) POINTER key; /* Key to be located */ register NODE **rootp; /* Address of the root of the tree */ int (*compar)(); /* Comparison function */ { if (rootp == NULL) return (NULL); while (*rootp != NULL) { /* T1: */ int r = (*compar)(key, (*rootp)->key); /* T2: */ if (r == 0) return (*rootp); /* Key found */ rootp = (r < 0) ? &(*rootp)->llink : /* T3: Take left branch */ &(*rootp)->rlink; /* T4: Take right branch */ } return (NODE *)(NULL); } E 1 h41715 s 00001/00001/00013 d D 4.2 87/05/13 19:40:01 build 5 4 c removed old SCCS strings and inserted #ident BB e s 00000/00000/00014 d D 4.1 87/02/17 10:00:24 mth 4 3 c rolled rev to -r4 (mth) e s 00000/00000/00014 d D 3.1 87/01/20 16:55:49 mkm 3 2 c e s 00000/00000/00014 d D 2.1 87/01/20 16:49:40 mkm 2 1 c e s 00014/00000/00000 d D 1.1 87/01/19 16:38:57 mkm 1 0 c Placed under source control - mkm e u U f b f n t T I 1 D 5 /* " %W% %E% " */ E 5 I 5 #ident " %W% %E% " E 5 /*LINTLIBRARY*/ /* * If arg is upper-case, return the lower-case, else return the arg. */ int tolower(c) register int c; { if(c >= 'A' && c <= 'Z') c -= 'A' - 'a'; return(c); } E 1 h41634 s 00001/00001/00013 d D 4.2 87/05/13 19:40:12 build 5 4 c removed old SCCS strings and inserted #ident BB e s 00000/00000/00014 d D 4.1 87/02/17 10:00:28 mth 4 3 c rolled rev to -r4 (mth) e s 00000/00000/00014 d D 3.1 87/01/20 16:55:50 mkm 3 2 c e s 00000/00000/00014 d D 2.1 87/01/20 16:49:40 mkm 2 1 c e s 00014/00000/00000 d D 1.1 87/01/19 16:38:58 mkm 1 0 c Placed under source control - mkm e u U f b f n t T I 1 D 5 /* " %W% %E% " */ E 5 I 5 #ident " %W% %E% " E 5 /*LINTLIBRARY*/ /* * If arg is lower-case, return upper-case, otherwise return arg. */ int toupper(c) register int c; { if(c >= 'a' && c <= 'z') c += 'A' - 'a'; return(c); } E 1 h06593 s 00001/00001/00114 d D 4.2 87/05/13 19:40:23 build 5 4 c removed old SCCS strings and inserted #ident BB e s 00000/00000/00115 d D 4.1 87/02/17 10:00:31 mth 4 3 c rolled rev to -r4 (mth) e s 00000/00000/00115 d D 3.1 87/01/20 16:55:51 mkm 3 2 c e s 00000/00000/00115 d D 2.1 87/01/20 16:49:41 mkm 2 1 c e s 00115/00000/00000 d D 1.1 87/01/19 16:38:59 mkm 1 0 c Placed under source control - mkm e u U f b f n t T I 1 D 5 /* " %W% %E% " */ E 5 I 5 #ident " %W% %E% " E 5 /*LINTLIBRARY*/ /* * Tree search algorithm, generalized from Knuth (6.2.2) Algorithm T. * * * The NODE * arguments are declared in the lint files as char *, * because the definition of NODE isn't available to the user. */ #include typedef char *POINTER; typedef struct node { POINTER key; struct node *llink, *rlink; } NODE; #define NULL 0 extern char *malloc(); NODE * tsearch(key, rootp, compar) /* Find or insert key into search tree*/ POINTER key; /* Key to be located */ register NODE **rootp; /* Address of the root of the tree */ int (*compar)(); /* Comparison function */ { register NODE *q; /* New node if key not found */ if (rootp == NULL) return (NULL); while (*rootp != NULL) { /* T1: */ int r = (*compar)(key, (*rootp)->key); /* T2: */ if (r == 0) return (*rootp); /* Key found */ rootp = (r < 0) ? &(*rootp)->llink : /* T3: Take left branch */ &(*rootp)->rlink; /* T4: Take right branch */ } q = (NODE *) malloc(sizeof(NODE)); /* T5: Not found */ if (q != NULL) { /* Allocate new node */ *rootp = q; /* Link new node to old */ q->key = key; /* Initialize new node */ q->llink = q->rlink = NULL; } return (q); } NODE * tdelete(key, rootp, compar) /* Delete node with key key */ POINTER key; /* Key to be deleted */ register NODE **rootp; /* Address of the root of tree */ int (*compar)(); /* Comparison function */ { NODE *p; /* Parent of node to be deleted */ register NODE *q; /* Successor node */ register NODE *r; /* Right son node */ int ans; /* Result of comparison */ if (rootp == NULL || (p = *rootp) == NULL) return (NULL); while ((ans = (*compar)(key, (*rootp)->key)) != 0) { p = *rootp; rootp = (ans < 0) ? &(*rootp)->llink : /* Take left branch */ &(*rootp)->rlink; /* Take right branch */ if (*rootp == NULL) return (NULL); /* Key not found */ } r = (*rootp)->rlink; /* D1: */ if ((q = (*rootp)->llink) == NULL) /* Llink NULL? */ q = r; else if (r != NULL) { /* Rlink NULL? */ if (r->llink == NULL) { /* D2: Find successor */ r->llink = q; q = r; } else { /* D3: Find NULL link */ for (q = r->llink; q->llink != NULL; q = r->llink) r = q; r->llink = q->rlink; q->llink = (*rootp)->llink; q->rlink = (*rootp)->rlink; } } free((POINTER) *rootp); /* D4: Free node */ *rootp = q; /* Link parent to replacement */ return (p); } void twalk(root, action) /* Walk the nodes of a tree */ NODE *root; /* Root of the tree to be walked */ void (*action)(); /* Function to be called at each node */ { void _twalk(); if (root != NULL && action != NULL) _twalk(root, action, 0); } static void _twalk(root, action, level) /* Walk the nodes of a tree */ register NODE *root; /* Root of the tree to be walked */ register void (*action)(); /* Function to be called at each node */ register int level; { if (root->llink == NULL && root->rlink == NULL) (*action)(root, leaf, level); else { (*action)(root, preorder, level); if (root->llink != NULL) _twalk(root->llink, action, level + 1); (*action)(root, postorder, level); if (root->rlink != NULL) _twalk(root->rlink, action, level + 1); (*action)(root, endorder, level); } } E 1 h09448 s 00001/00001/00062 d D 4.2 87/05/13 19:40:36 build 5 4 c removed old SCCS strings and inserted #ident BB e s 00000/00000/00063 d D 4.1 87/02/17 10:00:35 mth 4 3 c rolled rev to -r4 (mth) e s 00000/00000/00063 d D 3.1 87/01/20 16:55:52 mkm 3 2 c e s 00000/00000/00063 d D 2.1 87/01/20 16:49:43 mkm 2 1 c e s 00063/00000/00000 d D 1.1 87/01/19 16:38:59 mkm 1 0 c Placed under source control - mkm e u U f b f n t T I 1 D 5 /* " %W% %E% " */ E 5 I 5 #ident " %W% %E% " E 5 /*LINTLIBRARY*/ /* * ttyname(f): return "/dev/ttyXX" which the the name of the * tty belonging to file f. * * This program works in two passes: the first pass tries to * find the device by matching device and inode numbers; if * that doesn't work, it tries a second time, this time doing a * stat on every file in /dev and trying to match device numbers * only. If that fails too, NULL is returned. */ #define NULL 0 #include #include #include extern int open(), read(), close(), stat(), fstat(), isatty(); extern char *strcpy(), *strcat(); extern long lseek(); static char rbuf[32], dev[]="/dev/"; char * ttyname(f) int f; { struct stat fsb, tsb; struct direct db; register int df, pass1; if(isatty(f) == 0) return(NULL); if(fstat(f, &fsb) < 0) return(NULL); if((fsb.st_mode & S_IFMT) != S_IFCHR) return(NULL); if((df = open(dev, 0)) < 0) return(NULL); pass1 = 1; do { while(read(df, (char *)&db, sizeof(db)) == sizeof(db)) { if(db.d_ino == 0) continue; if(pass1 && db.d_ino != fsb.st_ino) continue; (void) strcpy(rbuf, dev); (void) strcat(rbuf, db.d_name); if(stat(rbuf, &tsb) < 0) continue; if(tsb.st_rdev == fsb.st_rdev && (tsb.st_mode&S_IFMT) == S_IFCHR && (!pass1 || tsb.st_ino == fsb.st_ino)) { (void) close(df); return(rbuf); } } (void) lseek(df, 0L, 0); } while(pass1--); (void) close(df); return(NULL); } E 1 h35146 s 00001/00001/00047 d D 4.2 87/05/13 19:40:48 build 5 4 c removed old SCCS strings and inserted #ident BB e s 00000/00000/00048 d D 4.1 87/02/17 10:00:38 mth 4 3 c rolled rev to -r4 (mth) e s 00000/00000/00048 d D 3.1 87/01/20 16:55:53 mkm 3 2 c e s 00000/00000/00048 d D 2.1 87/01/20 16:49:44 mkm 2 1 c e s 00048/00000/00000 d D 1.1 87/01/19 16:39:00 mkm 1 0 c Placed under source control - mkm e u U f b f n t T I 1 D 5 /* " %W% %E% " */ E 5 I 5 #ident " %W% %E% " E 5 /*LINTLIBRARY*/ /* * Return the number of the slot in the utmp file * corresponding to the current user: try for file 0, 1, 2. * Returns -1 if slot not found. */ #include #include "utmp.h" #define NULL 0 extern char *ttyname(), *strrchr(); extern int strncmp(), open(), read(), close(); int ttyslot() { struct utmp ubuf; register char *tp, *p; register int s, fd; if((tp=ttyname(0)) == NULL && (tp=ttyname(1)) == NULL && (tp=ttyname(2)) == NULL) return(-1); if((p=strrchr(tp, '/')) == NULL) p = tp; else p++; if((fd=open(UTMP_FILE, 0)) < 0) return(-1); s = 0; while(read(fd, (char*)&ubuf, sizeof(ubuf)) == sizeof(ubuf)) { if( (ubuf.ut_type == INIT_PROCESS || ubuf.ut_type == LOGIN_PROCESS || ubuf.ut_type == USER_PROCESS || ubuf.ut_type == DEAD_PROCESS ) && strncmp(p, ubuf.ut_line, sizeof(ubuf.ut_line)) == 0){ (void) close(fd); return(s); } s++; } (void) close(fd); return(-1); } E 1 h60436 s 00003/00001/00154 d D 4.7 87/05/11 08:55:14 dc 13 12 c dc - Add fpround e s 00001/00001/00154 d D 4.6 87/04/29 13:53:19 mth 12 11 c Add "ri.s" to Makefile e s 00011/00006/00144 d D 4.5 87/04/10 15:36:44 build 11 10 c Profiling changes e s 00002/00000/00148 d D 4.4 87/03/06 12:16:01 dc 10 9 c add ARGSINREGS to DFLAGS e s 00002/00002/00146 d D 4.3 87/02/17 13:35:40 mth 9 8 c Add ASFLAGS usage to assembly lines. e s 00002/00000/00146 d D 4.2 87/02/17 11:23:23 mth 8 7 c Parameters in registers e s 00000/00000/00146 d D 4.1 87/02/17 09:54:50 mth 7 6 c rolled rev to -r4 (mth) e s 00061/00010/00085 d D 3.4 87/02/05 16:08:22 build 6 5 c fixed suffix rules, -c in CC, clobber. -mkm e s 00001/00016/00094 d D 3.3 87/02/03 18:27:18 mkm 5 4 c removed reference to libenv. -mkm e s 00001/00001/00109 d D 3.2 87/01/29 17:46:08 build 4 3 c added dependancy for included files. -mkm e s 00000/00000/00110 d D 3.1 87/01/20 16:55:54 mkm 3 2 c e s 00000/00000/00110 d D 2.1 87/01/20 16:50:34 mkm 2 1 c e s 00110/00000/00000 d D 1.1 87/01/19 16:37:57 mkm 1 0 c Placed under source control - mkm e u U f b f n t T I 1 D 6 # " %W% %E% " E 6 I 6 # " @(#)Makefile 2.1 87/01/20 " E 6 D 5 include ../libenviron.h E 5 # # makefile for libc/port/gen # # D 6 LPOPTS = -b gen E 6 D 5 ASSEMBLE = $(AS) -I$(INC) $< LINK = $(LD) -r -x $*.o COMPILE = $(CC) $(CFLAGS) $< E 5 I 8 ASFLAGS2 = -DARGSINREGS -DLINK=r15 I 10 D 11 DFLAGS = -DARGSINREGS E 11 I 11 DFLAGS = -DARGSINREGS $(PROFLAG) E 11 E 10 E 8 D 5 .s.a: $(ASSEMBLE) $(LINK) mv a.out $*.o ar r $(LIBC) $*.o rm $*.o .c.a: $(COMPILE) $(LINK) mv a.out $*.o ar r $(LIBC) $*.o rm $*.o E 5 I 5 D 6 LIBC=$(SPX)/lib/libc.a E 6 I 6 # when actually building all of libc, this make will be performed with # LIBC defined on the command line, which will override the following define # (not to mention the environment). E 6 E 5 I 6 LIBC= libc.a I 11 # This is passed in for the profiled library MCOUNT= E 11 I 11 E 11 # We can't use the default suffix rules because they would omit the ld. .s~.a: D 11 $(GET) $(GFLAGS) -p $< > $*.s E 11 I 11 $(GET) $(GFLAGS) -p $< > tmp.s $(M4) $(MCOUNT) tmp.s > $*.s E 11 D 9 $(AS) -I$(INC) $*.s E 9 I 9 $(AS) -I$(INC) $(ASFLAGS) $*.s E 9 $(LD) -r -x $*.o mv a.out $*.o $(AR) r $@ $*.o D 11 rm -f $*.[so] E 11 I 11 rm -f $*.[so] tmp.[os] E 11 .s.a: D 9 $(AS) -I$(INC) $< E 9 I 9 D 11 $(AS) -I$(INC) $(ASFLAGS) $< E 9 $(LD) -r -x $*.o E 11 I 11 $(M4) $(MCOUNT) $*.s > tmp.s $(AS) -I$(INC) $(ASFLAGS) tmp.s $(LD) -r -x tmp.o E 11 mv a.out $*.o $(AR) r $@ $*.o D 11 rm -f $*.o E 11 I 11 rm -f $*.o tmp.[os] E 11 .c~.a: $(GET) $(GFLAGS) -p $< > $*.c $(CC) -c $(CFLAGS) $*.c $(LD) -r -x $*.o mv a.out $*.o $(AR) r $@ $*.o rm -f $*.[co] .c.a: $(CC) -c $(CFLAGS) $< $(LD) -r -x $*.o mv a.out $*.o $(AR) r $@ $*.o rm -f $*.o E 6 OBJECTS=\ $(LIBC)(a64l.o) $(LIBC)(abort.o) $(LIBC)(abs.o)\ $(LIBC)(assert.o) $(LIBC)(atof.o) $(LIBC)(atoi.o)\ $(LIBC)(atol.o) $(LIBC)(bsearch.o) $(LIBC)(calloc.o)\ $(LIBC)(clock.o) $(LIBC)(crypt.o) $(LIBC)(ctime.o)\ $(LIBC)(ctype.o) $(LIBC)(cuexit.o) $(LIBC)(dial.o)\ $(LIBC)(drand48.o) $(LIBC)(ecvt.o) $(LIBC)(errlst.o)\ D 13 $(LIBC)(execvp.o) $(LIBC)(frexp.o) $(LIBC)(ftok.o)\ E 13 I 13 $(LIBC)(execvp.o) $(LIBC)(fpround.o)\ $(LIBC)(frexp.o) $(LIBC)(ftok.o)\ E 13 $(LIBC)(ftw.o) $(LIBC)(gcvt.o) $(LIBC)(getcwd.o)\ $(LIBC)(getenv.o) $(LIBC)(getgrent.o) $(LIBC)(getgrgid.o)\ $(LIBC)(getgrnam.o) $(LIBC)(getlogin.o) $(LIBC)(getopt.o)\ $(LIBC)(getpw.o) $(LIBC)(getpwent.o) $(LIBC)(getpwnam.o)\ $(LIBC)(getpwuid.o) $(LIBC)(getut.o) $(LIBC)(hsearch.o)\ $(LIBC)(isatty.o) $(LIBC)(l3.o) $(LIBC)(l64a.o)\ $(LIBC)(ldexp.o) $(LIBC)(lfind.o) $(LIBC)(libc.o)\ $(LIBC)(lsearch.o)\ $(LIBC)(malloc.o) $(LIBC)(memccpy.o) $(LIBC)(memchr.o)\ $(LIBC)(memcmp.o) $(LIBC)(memcpy.o) $(LIBC)(memset.o)\ $(LIBC)(mktemp.o) $(LIBC)(modf.o) $(LIBC)(mon.o)\ $(LIBC)(nlist.o) $(LIBC)(perror.o) $(LIBC)(putenv.o)\ $(LIBC)(putpwent.o) $(LIBC)(qsort.o) $(LIBC)(rand.o)\ D 12 $(LIBC)(setjmp.o)\ E 12 I 12 $(LIBC)(ri.o) $(LIBC)(setjmp.o)\ E 12 $(LIBC)(sleep.o) $(LIBC)(ssignal.o) $(LIBC)(strcat.o)\ $(LIBC)(strchr.o) $(LIBC)(strcmp.o) $(LIBC)(strcpy.o)\ $(LIBC)(strcspn.o) $(LIBC)(strlen.o) $(LIBC)(strncat.o)\ $(LIBC)(strncmp.o) $(LIBC)(strncpy.o) $(LIBC)(strpbrk.o)\ $(LIBC)(strrchr.o) $(LIBC)(strspn.o) $(LIBC)(strtod.o)\ $(LIBC)(strtok.o) $(LIBC)(strtol.o) $(LIBC)(swab.o)\ $(LIBC)(tell.o) $(LIBC)(tfind.o) $(LIBC)(tolower.o)\ $(LIBC)(toupper.o) $(LIBC)(tsearch.o) $(LIBC)(ttyname.o)\ $(LIBC)(ttyslot.o) I 6 E 6 $(LIBC): $(OBJECTS) I 6 all: $(LIBC) E 6 I 6 test: $(MAKE) -$(MAKEFLAGS) $(LIBC) TEST='test' install: listing: clean: -rm -f *.o -rm -f errs clobber: clean -rm -f libc.a atof.c WHAT: what $(LIBC) # included file dependancies start here $(LIBC)(strtod.o) : atof.c E 6 $(LIBC)(nlist.o) : $(INC)/a.out.h $(INC)/ar.h $(LIBC)(atof.o) $(LIBC)(ctype.o) $(LIBC)(getpw.o) \ $(LIBC)(strtol.o) : $(INC)/ctype.h $(LIBC)(dial.o) : $(INC)/dial.h $(INC)/sys/termio.h $(LIBC)(dial.o) $(LIBC)(ftw.o) \ $(LIBC)(getut.o) : $(INC)/errno.h $(INC)/sys/errno.h $(LIBC)(dial.o) : $(INC)/fcntl.h $(LIBC)(ftw.o) : $(INC)/ftw.h $(LIBC)(getgrent.o) $(LIBC)(getgrgid.o) \ $(LIBC)(getgrnam.o) : $(INC)/grp.h $(LIBC)(mon.o) : $(INC)/mon.h $(LIBC)(ecvt.o) $(LIBC)(frexp.o) $(LIBC)(ldexp.o) \ $(LIBC)(modf.o) : $(INC)/nan.h $(LIBC)(getpwent.o) $(LIBC)(getpwnam.o) \ $(LIBC)(getpwuid.o) \ $(LIBC)(putpwent.o) : $(INC)/search.h $(LIBC)(tsearch.o) $(LIBC)(tfind.o) : $(INC)/search.h $(LIBC)(abort.o) $(LIBC)(dial.o) $(LIBC)(sleep.o) \ $(LIBC)(ssignal.o) : $(INC)/signal.h \ $(INC)/sys/signal.h $(LIBC)(dial.o) $(LIBC)(drand48.o) $(LIBC)(getcwd.o) \ $(LIBC)(getgrent.o) $(LIBC)(getopt.o) \ $(LIBC)(getpw.o) $(LIBC)(getpwent.o) \ $(LIBC)(getut.o) \ $(LIBC)(hsearch.o) \ $(LIBC)(putpwent.o) : $(INC)/string.h $(LIBC)(dial.o) : $(INC)/string.h I 13 $(LIBC)(fpround.o) : $(INC)/sys/ieeefp.h $(INC)/sys/sysridge.h E 13 $(LIBC)(ftw.o) $(LIBC)(ttyname.o) : $(INC)/sys/dir.h $(LIBC)(execvp.o) $(LIBC)(getcwd.o) : $(INC)/sys/errno.h $(LIBC)(clock.o) $(LIBC)(getpwent.o) : $(INC)/sys/param.h $(LIBC)(ftok.o) $(LIBC)(ftw.o) $(LIBC)(getut.o) \ $(LIBC)(ttyname.o) : $(INC)/sys/stat.h $(LIBC)(ftok.o) : $(INC)/sys/sysmacros.h $(LIBC)(isatty.o) : $(INC)/sys/termio.h $(LIBC)(clock.o) : $(INC)/sys/times.h $(LIBC)(dial.o) : $(INC)/termio.h \ $(INC)/sys/termio.h $(LIBC)(ctime.o) : $(INC)/time.h $(LIBC)(getlogin.o) $(LIBC)(getut.o) \ $(LIBC)(ttyslot.o) : $(INC)/utmp.h $(LIBC)(atof.o) $(LIBC)(ecvt.o) $(LIBC)(l64a.o) \ $(LIBC)(ldexp.o) $(LIBC)(modf.o) $(LIBC)(strtod.o) : $(INC)/values.h $(LIBC)(cuexit.o) : ../sys/sysent.h D 4 E 4 I 4 D 6 $(LIBC)(strtod.o) : atof.c E 6 E 4 D 6 listing: $(LL) > list $(PR) list $(MK) *.s *.c | $(LPR) $(LPOPTS) rm list E 6 E 1 h54500 s 00001/00001/00025 d D 4.2 87/05/13 19:41:01 build 5 4 c removed old SCCS strings and inserted #ident BB e s 00000/00000/00026 d D 4.1 87/02/17 09:54:56 mth 4 3 c rolled rev to -r4 (mth) e s 00000/00000/00026 d D 3.1 87/01/20 16:55:55 mkm 3 2 c e s 00000/00000/00026 d D 2.1 87/01/20 16:47:50 mkm 2 1 c e s 00026/00000/00000 d D 1.1 87/01/19 16:37:58 mkm 1 0 c Placed under source control - mkm e u U f b f n t T I 1 D 5 /* " %W% %E% " */ E 5 I 5 #ident " %W% %E% " E 5 /*LINTLIBRARY*/ /* * convert base 64 ascii to long int * char set is [./0-9A-Za-z] * */ #define BITSPERCHAR 6 /* to hold entire character set */ long a64l(s) register char *s; { register int i, c; long lg = 0; for (i = 0; (c = *s++) != '\0'; i += BITSPERCHAR) { if (c > 'Z') c -= 'a' - 'Z' - 1; if (c > '9') c -= 'A' - '9' - 1; lg |= (long)(c - ('0' - 2)) << i; } return (lg); } E 1 h56126 s 00001/00001/00019 d D 4.2 87/05/13 19:41:13 build 5 4 c removed old SCCS strings and inserted #ident BB e s 00000/00000/00020 d D 4.1 87/02/17 09:55:01 mth 4 3 c rolled rev to -r4 (mth) e s 00000/00000/00020 d D 3.1 87/01/20 16:55:56 mkm 3 2 c e s 00000/00000/00020 d D 2.1 87/01/20 16:47:51 mkm 2 1 c e s 00020/00000/00000 d D 1.1 87/01/19 16:37:59 mkm 1 0 c Placed under source control - mkm e u U f b f n t T I 1 D 5 /* " %W% %E% " */ E 5 I 5 #ident " %W% %E% " E 5 /*LINTLIBRARY*/ /* * abort() - terminate current process with dump via SIGIOT */ #include extern int kill(), getpid(); static pass = 0; /* counts how many times abort has been called*/ int abort() { /* increment first to avoid any hassle with interupts */ if (++pass == 1) { _cleanup(); } return(kill(getpid(), SIGIOT)); } E 1 h34758 s 00001/00001/00008 d D 4.2 87/05/13 19:43:35 build 5 4 c removed old SCCS strings and inserted #ident BB e s 00000/00000/00009 d D 4.1 87/02/17 09:55:04 mth 4 3 c rolled rev to -r4 (mth) e s 00000/00000/00009 d D 3.1 87/01/20 16:55:57 mkm 3 2 c e s 00000/00000/00009 d D 2.1 87/01/20 16:47:52 mkm 2 1 c e s 00009/00000/00000 d D 1.1 87/01/19 16:37:59 mkm 1 0 c Placed under source control - mkm e u U f b f n t T I 1 D 5 /* " %W% %E% " */ E 5 I 5 #ident " %W% %E% " E 5 /*LINTLIBRARY*/ int abs(arg) register int arg; { return (arg >= 0 ? arg : -arg); } E 1 #ident " @(#)atof.c 4.2 87/05/13 " /*LINTLIBRARY*/ /* * C library - ascii to floating (atof) and string to double (strtod) * * This version compiles both atof and strtod depending on the value * of STRTOD, which is set in the file and may be overridden on the * "cc" command line. The only difference is the storage of a pointer * to the character which terminated the conversion. * Long-integer accumulation is used, except on the PDP11, where * "long" arithmetic is simulated, so floating-point is much faster. */ #ifndef STRTOD #define STRTOD 0 #endif #include #include extern double ldexp(); #if u3b || u3b5 # define POW1_25LEN 9 #else # define POW1_25LEN 10 #endif static double pow1_25[POW1_25LEN] = { 0.0 }; #if STRTOD #define STORE_PTR (*ptr = p) #define GOT_DIGIT (got_digit++) #define RET_ZERO(val) if (!got_digit) return (0.0) double strtod(p, ptr) register char *p; char **ptr; #else #define STORE_PTR #define GOT_DIGIT #define RET_ZERO(val) if (!val) return (0.0) double atof(p) register char *p; #endif { register int c; int exp = 0, neg_val = 0; double fl_val; #if STRTOD int got_digit = 0; char *dummy; if (ptr == (char **)0) ptr = &dummy; /* harmless dumping place */ STORE_PTR; #endif while (isspace(c = *p)) /* eat leading white space */ p++; switch (c) { /* process sign */ case '-': neg_val++; case '+': /* fall-through */ p++; } { /* accumulate value */ #if pdp11 /* "long" arithmetic on the PDP-11 is simulated using int's and * is outrageously slow, so the accumulation is done using double's */ register int decpt = 0; fl_val = 0.0; while (isdigit(c = *p++) || c == '.' && !decpt++) { if (c == '.') continue; GOT_DIGIT; exp -= decpt; /* decr exponent if dec point seen */ if (fl_val < 2.0 * MAXPOWTWO) fl_val = 10.0 * fl_val + (double)(c - '0'); else exp++; } RET_ZERO(fl_val); #else register long high = 0, low = 0, scale = 1; register int decpt = 0, nzeroes = 0; while (isdigit(c = *p++) || c == '.' && !decpt++) { if (c == '.') continue; GOT_DIGIT; if (decpt) { /* handle trailing zeroes specially */ if (c == '0') { /* ignore zero for now */ nzeroes++; continue; } while (nzeroes > 0) { /* put zeroes back in */ exp--; if (high < MAXLONG/10) { high *= 10; } else if (scale < MAXLONG/10) { scale *= 10; low *= 10; } else exp++; nzeroes--; } exp--; /* decr exponent if decimal pt. seen */ } if (high < MAXLONG/10) { high *= 10; high += c - '0'; } else if (scale < MAXLONG/10) { scale *= 10; low *= 10; low += c - '0'; } else exp++; } RET_ZERO(high); fl_val = (double)high; if (scale > 1) fl_val = (double)scale * fl_val + (double)low; #endif } STORE_PTR; /* in case there is no legitimate exponent */ if (c == 'E' || c == 'e') { /* accumulate exponent */ register int e_exp = 0, neg_exp = 0; switch (*p) { /* process sign */ case '-': neg_exp++; case '+': /* fall-through */ case ' ': /* many FORTRAN environments generate this! */ p++; } if (isdigit(c = *p)) { /* found a legitimate exponent */ do { /* limit outrageously large exponents */ if (e_exp < DMAXEXP) e_exp = 10 * e_exp + c - '0'; } while (isdigit(c = *++p)); if (neg_exp) exp -= e_exp; else exp += e_exp; STORE_PTR; } } #if STRTOD if (!fl_val) /* atof will already have returned, but strtod had */ return (fl_val); /* to find the end of the exponent first */ #endif /* * The following computation is done in two stages, * first accumulating powers of (10/8), then jamming powers of 8, * to avoid underflow in situations like the following (for * the DEC representation): 1.2345678901234567890e-37, * where exp would be about (-37 + -18) = -55, and the * value 10^(-55) can't be represented, but 1.25^(-55) can * be represented, and then 8^(-55) jammed via ldexp(). */ if (exp != 0) { /* apply exponent */ register double *powptr = pow1_25, fl_exp = fl_val; if (*powptr == 0.0) { /* need to initialize table */ *powptr = 1.25; for (; powptr < &pow1_25[POW1_25LEN - 1]; powptr++) powptr[1] = *powptr * *powptr; powptr = pow1_25; } if ((c = exp) < 0) { c = -c; fl_exp = 1.0; } if (c > DMAXEXP/2) /* outrageously large exponents */ c = DMAXEXP/2; /* will be handled by ldexp */ for ( ; ; powptr++) { /* binary representation of ints assumed; otherwise * replace (& 01) by (% 2) and (>>= 1) by (/= 2) */ if (c & 01) fl_exp *= *powptr; if ((c >>= 1) == 0) break; } fl_val = ldexp(exp < 0 ? fl_val/fl_exp : fl_exp, 3 * exp); } return (neg_val ? -fl_val : fl_val); /* apply sign */ } h04586 s 00001/00000/00033 d D 1.2 87/05/01 09:18:10 mth 2 1 c Add MCOUNT for profiling. e s 00033/00000/00000 d D 1.1 87/04/29 13:46:25 mth 1 0 c Placed under source control (mth) e u U f b f n t T I 1 ; " %W% %E% " csect code FINALMAN2 equ 07fb00000h FINALMAN1 equ 07fc00000h MANT10 equ 03ff40000h arg1 equ 24 global _Reduce_inf _Reduce_inf: I 2 ; MCOUNT E 2 #ifndef ARGSINREGS loadd r0,r14,arg1 ;r0=value #endif laddr r2,0800fffffh,L and r0,r2 ;since know value's exp=7ff we can lose it laddr r2,03ff00000h,L or r0,r2 ;gives r0 an exponent of 0 laddr r2,MANT10,L move r3,0 br r2>r0,sub1 drdiv r0,r2 laddr r2,0800fffffh,L and r0,r2 ;since know value's exp=7ff we can lose it laddr r2,FINALMAN1,L or r0,r2 ;gives r0 the final exponential value ret LINK,LINK sub1: drdiv r0,r2 laddr r2,0800fffffh,L and r0,r2 ;since know value's exp=7ff we can lose it laddr r2,FINALMAN2,L or r0,r2 ;gives r0 the final exponential value ret LINK,LINK E 1 #ident " @(#)a64l.c 4.2 87/05/13 " /*LINTLIBRARY*/ /* * convert base 64 ascii to long int * char set is [./0-9A-Za-z] * */ #define BITSPERCHAR 6 /* to hold entire character set */ long a64l(s) register char *s; { register int i, c; long lg = 0; for (i = 0; (c = *s++) != '\0'; i += BITSPERCHAR) { if (c > 'Z') c -= 'a' - 'Z' - 1; if (c > '9') c -= 'A' - '9' - 1; lg |= (long)(c - ('0' - 2)) << i; } return (lg); } h22399 s 00001/00001/00033 d D 4.3 87/05/13 19:43:46 build 6 5 c removed old SCCS strings and inserted #ident BB e s 00003/00003/00031 d D 4.2 87/05/11 09:35:56 dc 5 4 c dc - make names: fpgetround, fpsetround e s 00000/00000/00034 d D 4.1 87/05/11 08:52:23 dc 4 3 c rolled rev to -r4 /dc e s 00000/00000/00034 d D 3.1 87/05/11 08:52:23 dc 3 2 c AUTO NULL DELTA e s 00000/00000/00034 d D 2.1 87/05/11 08:52:23 dc 2 1 c AUTO NULL DELTA e s 00034/00000/00000 d D 1.1 87/05/11 08:52:10 dc 1 0 c Placed under source control - dc e u U f b f n t T I 1 D 6 /* " %W% %E% " */ E 6 I 6 #ident " %W% %E% " E 6 /* * Routines to get / set ieee floating point rounding modes. */ #include #include /* * Return the current setting of the rounding modes */ fp_rnd D 5 fp_getround() E 5 I 5 fpgetround() E 5 { fp_rnd old_round; sysridge (SRG_FPROUND, &old_round); return (old_round); } /* * Establish a new rounding mode. (Returns previous mode as value.) */ fp_rnd D 5 fp_setround(new_round) E 5 I 5 fpsetround(new_round) E 5 fp_rnd new_round; { fp_rnd old_round; D 5 old_round = fp_getround(); E 5 I 5 old_round = fpgetround(); E 5 sysridge (SRS_FPROUND, new_round); return (old_round); } E 1