%!PS-Adobe-3.0 %%Creator: xpdf/pdftops 3.01 %%LanguageLevel: 2 %%DocumentSuppliedResources: (atend) %%DocumentMedia: plain 612 792 0 () () %%BoundingBox: 0 0 612 792 %%Pages: 79 %%EndComments %%BeginDefaults %%PageMedia: plain %%EndDefaults %%BeginProlog %%BeginResource: procset xpdf 3.01 0 /xpdf 75 dict def xpdf begin % PDF special state /pdfDictSize 15 def /pdfSetup { 3 1 roll 2 array astore /setpagedevice where { pop 3 dict begin /PageSize exch def /ImagingBBox null def /Policies 1 dict dup begin /PageSize 3 def end def { /Duplex true def } if currentdict end setpagedevice } { pop pop } ifelse } def /pdfStartPage { pdfDictSize dict begin /pdfFillCS [] def /pdfFillXform {} def /pdfStrokeCS [] def /pdfStrokeXform {} def /pdfFill [0] def /pdfStroke [0] def /pdfFillOP false def /pdfStrokeOP false def /pdfLastFill false def /pdfLastStroke false def /pdfTextMat [1 0 0 1 0 0] def /pdfFontSize 0 def /pdfCharSpacing 0 def /pdfTextRender 0 def /pdfTextRise 0 def /pdfWordSpacing 0 def /pdfHorizScaling 1 def /pdfTextClipPath [] def } def /pdfEndPage { end } def % PDF color state /cs { /pdfFillXform exch def dup /pdfFillCS exch def setcolorspace } def /CS { /pdfStrokeXform exch def dup /pdfStrokeCS exch def setcolorspace } def /sc { pdfLastFill not { pdfFillCS setcolorspace } if dup /pdfFill exch def aload pop pdfFillXform setcolor /pdfLastFill true def /pdfLastStroke false def } def /SC { pdfLastStroke not { pdfStrokeCS setcolorspace } if dup /pdfStroke exch def aload pop pdfStrokeXform setcolor /pdfLastStroke true def /pdfLastFill false def } def /op { /pdfFillOP exch def pdfLastFill { pdfFillOP setoverprint } if } def /OP { /pdfStrokeOP exch def pdfLastStroke { pdfStrokeOP setoverprint } if } def /fCol { pdfLastFill not { pdfFillCS setcolorspace pdfFill aload pop pdfFillXform setcolor pdfFillOP setoverprint /pdfLastFill true def /pdfLastStroke false def } if } def /sCol { pdfLastStroke not { pdfStrokeCS setcolorspace pdfStroke aload pop pdfStrokeXform setcolor pdfStrokeOP setoverprint /pdfLastStroke true def /pdfLastFill false def } if } def % build a font /pdfMakeFont { 4 3 roll findfont 4 2 roll matrix scale makefont dup length dict begin { 1 index /FID ne { def } { pop pop } ifelse } forall /Encoding exch def currentdict end definefont pop } def /pdfMakeFont16 { exch findfont dup length dict begin { 1 index /FID ne { def } { pop pop } ifelse } forall /WMode exch def currentdict end definefont pop } def % graphics state operators /q { gsave pdfDictSize dict begin } def /Q { end grestore /pdfLastFill where { pop pdfLastFill { pdfFillOP setoverprint } { pdfStrokeOP setoverprint } ifelse } if } def /cm { concat } def /d { setdash } def /i { setflat } def /j { setlinejoin } def /J { setlinecap } def /M { setmiterlimit } def /w { setlinewidth } def % path segment operators /m { moveto } def /l { lineto } def /c { curveto } def /re { 4 2 roll moveto 1 index 0 rlineto 0 exch rlineto neg 0 rlineto closepath } def /h { closepath } def % path painting operators /S { sCol stroke } def /Sf { fCol stroke } def /f { fCol fill } def /f* { fCol eofill } def % clipping operators /W { clip newpath } def /W* { eoclip newpath } def % text state operators /Tc { /pdfCharSpacing exch def } def /Tf { dup /pdfFontSize exch def dup pdfHorizScaling mul exch matrix scale pdfTextMat matrix concatmatrix dup 4 0 put dup 5 0 put exch findfont exch makefont setfont } def /Tr { /pdfTextRender exch def } def /Ts { /pdfTextRise exch def } def /Tw { /pdfWordSpacing exch def } def /Tz { /pdfHorizScaling exch def } def % text positioning operators /Td { pdfTextMat transform moveto } def /Tm { /pdfTextMat exch def } def % text string operators /cshow where { pop /cshow2 { dup { pop pop 1 string dup 0 3 index put 3 index exec } exch cshow pop pop } def }{ /cshow2 { currentfont /FontType get 0 eq { 0 2 2 index length 1 sub { 2 copy get exch 1 add 2 index exch get 2 copy exch 256 mul add 2 string dup 0 6 5 roll put dup 1 5 4 roll put 3 index exec } for } { dup { 1 string dup 0 3 index put 3 index exec } forall } ifelse pop pop } def } ifelse /awcp { exch { false charpath 5 index 5 index rmoveto 6 index eq { 7 index 7 index rmoveto } if } exch cshow2 6 {pop} repeat } def /Tj { fCol 1 index stringwidth pdfTextMat idtransform pop sub 1 index length dup 0 ne { div } { pop pop 0 } ifelse pdfWordSpacing pdfHorizScaling mul 0 pdfTextMat dtransform 32 4 3 roll pdfCharSpacing pdfHorizScaling mul add 0 pdfTextMat dtransform 6 5 roll Tj1 } def /Tj16 { fCol 2 index stringwidth pdfTextMat idtransform pop sub exch div pdfWordSpacing pdfHorizScaling mul 0 pdfTextMat dtransform 32 4 3 roll pdfCharSpacing pdfHorizScaling mul add 0 pdfTextMat dtransform 6 5 roll Tj1 } def /Tj16V { fCol 2 index stringwidth pdfTextMat idtransform exch pop sub exch div 0 pdfWordSpacing pdfTextMat dtransform 32 4 3 roll pdfCharSpacing add 0 exch pdfTextMat dtransform 6 5 roll Tj1 } def /Tj1 { 0 pdfTextRise pdfTextMat dtransform rmoveto currentpoint 8 2 roll pdfTextRender 1 and 0 eq { 6 copy awidthshow } if pdfTextRender 3 and dup 1 eq exch 2 eq or { 7 index 7 index moveto 6 copy currentfont /FontType get 3 eq { fCol } { sCol } ifelse false awcp currentpoint stroke moveto } if pdfTextRender 4 and 0 ne { 8 6 roll moveto false awcp /pdfTextClipPath [ pdfTextClipPath aload pop {/moveto cvx} {/lineto cvx} {/curveto cvx} {/closepath cvx} pathforall ] def currentpoint newpath moveto } { 8 {pop} repeat } ifelse 0 pdfTextRise neg pdfTextMat dtransform rmoveto } def /TJm { pdfFontSize 0.001 mul mul neg 0 pdfTextMat dtransform rmoveto } def /TJmV { pdfFontSize 0.001 mul mul neg 0 exch pdfTextMat dtransform rmoveto } def /Tclip { pdfTextClipPath cvx exec clip newpath /pdfTextClipPath [] def } def % Level 2 image operators /pdfImBuf 100 string def /pdfIm { image { currentfile pdfImBuf readline not { pop exit } if (%-EOD-) eq { exit } if } loop } def /pdfImM { fCol imagemask { currentfile pdfImBuf readline not { pop exit } if (%-EOD-) eq { exit } if } loop } def /pdfImClip { gsave 0 2 4 index length 1 sub { dup 4 index exch 2 copy get 5 index div put 1 add 3 index exch 2 copy get 3 index div put } for pop pop rectclip } def /pdfImClipEnd { grestore } def % shading operators /colordelta { false 0 1 3 index length 1 sub { dup 4 index exch get 3 index 3 2 roll get sub abs 0.004 gt { pop true } if } for exch pop exch pop } def /funcCol { func n array astore } def /funcSH { dup 0 eq { true } { dup 6 eq { false } { 4 index 4 index funcCol dup 6 index 4 index funcCol dup 3 1 roll colordelta 3 1 roll 5 index 5 index funcCol dup 3 1 roll colordelta 3 1 roll 6 index 8 index funcCol dup 3 1 roll colordelta 3 1 roll colordelta or or or } ifelse } ifelse { 1 add 4 index 3 index add 0.5 mul exch 4 index 3 index add 0.5 mul exch 6 index 6 index 4 index 4 index 4 index funcSH 2 index 6 index 6 index 4 index 4 index funcSH 6 index 2 index 4 index 6 index 4 index funcSH 5 3 roll 3 2 roll funcSH pop pop } { pop 3 index 2 index add 0.5 mul 3 index 2 index add 0.5 mul funcCol sc dup 4 index exch mat transform m 3 index 3 index mat transform l 1 index 3 index mat transform l mat transform l pop pop h f* } ifelse } def /axialCol { dup 0 lt { pop t0 } { dup 1 gt { pop t1 } { dt mul t0 add } ifelse } ifelse func n array astore } def /axialSH { dup 0 eq { true } { dup 8 eq { false } { 2 index axialCol 2 index axialCol colordelta } ifelse } ifelse { 1 add 3 1 roll 2 copy add 0.5 mul dup 4 3 roll exch 4 index axialSH exch 3 2 roll axialSH } { pop 2 copy add 0.5 mul axialCol sc exch dup dx mul x0 add exch dy mul y0 add 3 2 roll dup dx mul x0 add exch dy mul y0 add dx abs dy abs ge { 2 copy yMin sub dy mul dx div add yMin m yMax sub dy mul dx div add yMax l 2 copy yMax sub dy mul dx div add yMax l yMin sub dy mul dx div add yMin l h f* } { exch 2 copy xMin sub dx mul dy div add xMin exch m xMax sub dx mul dy div add xMax exch l exch 2 copy xMax sub dx mul dy div add xMax exch l xMin sub dx mul dy div add xMin exch l h f* } ifelse } ifelse } def /radialCol { dup t0 lt { pop t0 } { dup t1 gt { pop t1 } if } ifelse func n array astore } def /radialSH { dup 0 eq { true } { dup 8 eq { false } { 2 index dt mul t0 add radialCol 2 index dt mul t0 add radialCol colordelta } ifelse } ifelse { 1 add 3 1 roll 2 copy add 0.5 mul dup 4 3 roll exch 4 index radialSH exch 3 2 roll radialSH } { pop 2 copy add 0.5 mul dt mul t0 add axialCol sc exch dup dx mul x0 add exch dup dy mul y0 add exch dr mul r0 add 0 360 arc h dup dx mul x0 add exch dup dy mul y0 add exch dr mul r0 add 0 360 arc h f* } ifelse } def end %%EndResource %%EndProlog %%BeginSetup xpdf begin %%BeginResource: font LucidaSans-Typewriter83 %!FontType1-1.0: LucidaSans-Typewriter83 12 dict begin /FontInfo 10 dict dup begin /Notice (Copyright (c) 1991 Bigelow & Holmes Inc. and Y&Y, Inc. (508) 371-3286. All Rights Reserved.) readonly def /FullName (Lucida Sans Typewriter 83) readonly def /FamilyName (LucidaSansTypewriter83) readonly def /isFixedPitch true def /ItalicAngle 0 def /UnderlinePosition 0 def /UnderlineThickness 0 def end readonly def /FontName /LucidaSans-Typewriter83 def /PaintType 0 def /FontType 1 def /FontMatrix [0.000833333 0 0 0.000833333 0 0] readonly def /FontBBox [0 -205 602 783] readonly def /StrokeWidth 0 def /Encoding 256 array 0 1 255 {1 index exch /.notdef put} for dup 32 /space put dup 33 /exclam put dup 34 /quotedbl put dup 35 /numbersign put dup 36 /dollar put dup 37 /percent put dup 38 /ampersand put dup 39 /quoteright put dup 40 /parenleft put dup 41 /parenright put dup 42 /asterisk put dup 43 /plus put dup 44 /comma put dup 45 /minus put dup 46 /period put dup 47 /slash put dup 48 /zero put dup 49 /one put dup 50 /two put dup 51 /three put dup 52 /four put dup 53 /five put dup 54 /six put dup 55 /seven put dup 56 /eight put dup 57 /nine put dup 58 /colon put dup 59 /semicolon put dup 60 /less put dup 61 /equal put dup 62 /greater put dup 63 /question put dup 64 /at put dup 65 /A put dup 66 /B put dup 67 /C put dup 68 /D put dup 69 /E put dup 70 /F put dup 71 /G put dup 72 /H put dup 73 /I put dup 74 /J put dup 75 /K put dup 76 /L put dup 77 /M put dup 78 /N put dup 79 /O put dup 80 /P put dup 81 /Q put dup 82 /R put dup 83 /S put dup 84 /T put dup 85 /U put dup 86 /V put dup 87 /W put dup 88 /X put dup 89 /Y put dup 90 /Z put dup 91 /bracketleft put dup 92 /backslash put dup 93 /bracketright put dup 94 /asciicircum put dup 95 /underscore put dup 96 /quoteleft put dup 97 /a put dup 98 /b put dup 99 /c put dup 100 /d put dup 101 /e put dup 102 /f put dup 103 /g put dup 104 /h put dup 105 /i put dup 106 /j put dup 107 /k put dup 108 /l put dup 109 /m put dup 110 /n put dup 111 /o put dup 112 /p put dup 113 /q put dup 114 /r put dup 115 /s put dup 116 /t put dup 117 /u put dup 118 /v put dup 119 /w put dup 120 /x put dup 121 /y put dup 122 /z put dup 123 /braceleft put dup 124 /bar put dup 125 /braceright put dup 126 /asciitilde put readonly def currentdict end currentfile eexec 5AA4F71255501637F1A431BAB555283D093E1B588B45B0281559110D21315C62 BD638C6B34BA54AA75227715D9947EBCD51A104CAEA657499E94138F5645BF68 368BB1B1EC8E4776F067FFF2CE9B89FB7E63A7DB304498C1036D399C47A4CB79 BD517EDB02BEB90195FD7DDAF3E839BCE2DB156D9337DBB2305A465B3E0FFB97 1985C79DC71C47E26F9F0F042B2CDEE97B679358059256FB93D662D43C7ECB5B 1A564DFCECB963478373C69F52172F071E0AA6082A3E10D9E1CE2851CFA210EE 7BD5FCB1AAE15E89D1FB339D587D218B89C18A32F47C7451A80CB1FC07CF5EF5 C2A9054AD59AE4D5522D8745045620C9C40EAB675A6FE53511D83C04968F37DE 389C3A7A551DC79580FF1B382205C5951A9F8E7B6CEF33E027D608C14A394033 1E603A09B3061B66BB71AC1D2A232B5F2BC9481D7D44F334ACCBBF6538A439A3 FE8DA1ABE05931A20F8FC365A0F90C9A22578FEBDD03E4201D2887923DD20ED9 2F8F50AA500DE6414F5521ACCBBA45FBD55A4882C7485B52146BD36775948914 F8D5FB4C38AFAA25CC8946C7A7DBA010B186D6B5B07DA514976B3CC03535B838 7B3B0BE3D2A1813A3B406846433DF6235D79BA455E54E35184F42053C1FB0105 CDB7B017C5BF449CEF69EF7E7B143698D00B249BA50E98D198F29782A6B41D7B 1657972CE1B773E8F6BDF2F38627E3E254C1AB4B1BAF1E96EAECC19CD5885CC3 18BA21AC88B179CCD63EA17D817039FEFF575F828A888D366BCEA4F32B5E08B2 88464C27C4064DE920F98B8B350E8909D4E911609C781479D656DE0403B7A396 5037AFD507B87055E4C40B573D52B9DDA04D793623219B54DA3BB5E85FB9F38F 17AAE45F7BAFDDA475C914C30C626E51B3AC52AC2BB692DA805202931C39904E C8DCFBF3A3816FD86144CFBAFFC5AED23CD770A772B3DE93AE3AA46D01B137F3 079DFBCD31CB35CED7AA81B518B6EF7EBB9DAB59EFDFEBC0E649AAC792DF01C1 F0DD981180E792CDD32DBCBAA0CE6897E0EAB4683038239A39BFFDC512570DC6 321D9BBED278C72D31CA21BEC6911C36873310E2E7FB57D97F25697D76B76FC9 E4D95B941ECDB8D0D9EF464325032DC37B344686C8F0CD35F07CBBC94A106148 62810B1BE1C3A617510410749ED1EEF9357C0A9D7D9282027993205C1ACF05FA 9E6147B29A5B864FE6EB6E4EE46EAE685CD7C64482CDAFAB9F8BAF6872DDA515 09ED15B9733598C9AFF4AECC9D55391AA1AFFAADCCEEF4F66A0C4AA25B87C8C5 FC9FE42F2DA51AC0AD6BB9F654F06EF095BE97E6B54DA5153F3CD25D637F4A6A 420025CF63ADFA7F7AF70DCC98C19973444AEF1B142552216B51617F1EAD9246 90B7C98B8EEA31C7F9CB2D674FF7E59810A33F935C83268ACD56BD0F30828FD5 231419642A62358DF745778D5136AD5F7C792394A095791C035580A45F821C35 22C1F9BA6581F5E6ED9C927831B044DD4B37C1ACE021244A7C9B27B779DB3805 C265D3D206FE79B571D84DC6CC9963E3820340C705BC6BCFAEFFB3902CD0D5B3 83E949A70EF1D3CC6F43DE4D4C353F6664F5C7AA76E2386FC870FBF675988DDA 37EC2E2D5B885191FA6A86AB5FCCF76A6451663B6B06AAC022E419520CDEFB20 459A5119EDE46B9E5B11095D514ED3C7E065068670CCB8492C0369E019A1E593 E74012A86291DD86ABD697BE589ED20C7FBA7D932381FA2202E441F24AD6C794 F2511FEFA77206A5AB961CCFA703A863091EF6134B394A33F698D61937EBD4AC 4EDE750831AE6502E7CF167512733AE03921CC5E79ABB9436FC6864C728237B5 207BAFAD710948E1DE008339EB0E74D210DB63177F83428C6642099254186EF3 5D10815BF66C3D39F983DB8BBF1D1F75496CE08603D6D0FE7D4A5E889C0FF14A DDD66FFF11AA07760ABB80A1D97F5B2513CBC404E54E8E3B072343AB427E8547 596CE54741408AC24D20428990F191BB7995F952F3EC7429769FEEF9E9B0268B 7AFB6D1988672E75CBF43D07682C4500E5E590358976235A22385444AB887F87 58D841E64AAA34FA390A30A96357FE4BC1604116196F810DE5833F6538AC691E 394146C31B724E3C9F04D00A33D3D85570B2343AC21DB14B40732ECF9C9E1BC0 D2B627D84FD673E47A693B00F8E610840CE3519F7B5E0500CF9D7AC00C46E519 0C003743A733DDBC7C45504133B088C3D571168A1C8C9216759A86BE04C79B5F 24CF56F3C329980932C84270166F1385355DFAE46FE1FF755B92A37983B5FD76 949A8476FEF28ED491C38DD4B2A06798C710856EA01256BF3FC53D88551C3F11 BF3241B0989BD2944F3AEB99DB98C8E7B13A6EFA23288EB24381B8717B851E70 C4542F4879BFDE6E13F979C2ADE45FE4AA085F829BD6DDB6560362C050840B02 C798DCD4C7832CFB9774ED70E691D86D8A86A2010D1A948EAE8977787C2CAA76 02FBDA7F065632C681F5DAF2A33169C1DA952E530C87988A13740565CFA08AB2 6ECCCA8E16A45E53FBAF970ED68E4499B7ED3EACE0F280F5D292DB4707032758 3F97251D05DBDC7BF5FE4F6E71BA0EA3A2F3E324AB91828166EEA0C6EE595F14 9AC72C8E8B7E09C5F543D7B05463F6EA56C7492C5200D4DF9DB562C6E0725E07 3D7182AAC88C770F30129AE22AC5F7FCE82771459038E017E642A007BC31A09D 4435B6D4E9F8F8065906A55D8ACC1DCB85F7A29F3F9D6C5BC8D474578E4061D7 046F1DC5E005221FB7064AB74C801884A80358610F8BFDC093E109321CAD2550 393308C3343596DE9D1EA17FA96D9E9977FBA13642D8454CBD431637F023B5CF 8703EC37E0DC6297472BC9B43115222D6F15C143BC542B0A2A8F294D113BA00B 5B87D2BA2EB5A0FC6390A0F9339C91F176C8466769E931418B9376404C501E7F 10379A780E49D860FC6C8202491FBCFDE51FE3072D6183EA1084C39A2D3E018C 5DD75689B89841C0A125869B34189E5E840EB6B6278382629F7BA224A22754A9 649B44DE8CC27F09C15DEBB60BA7285E1CB9E1F0CD329281759581156CE88C3B FB04313662155185B07F24E537234276086739F635CB180C16F94038E9C88BA1 1EB3A62AD61A1B4150610C91F62F9F64B4155E0619E10DA82D66C86C2FE3982A 4DD67D12F20E634157E04F3D39B8F07FD28FF4089FA6F05179116CE4543A3FFC A91B41B80C259926962CA27EDAFAC6CFD0E58013FDCAE1295B61160D583F59F7 3C00DB237704F2F564F5AF4028720A7F1DB2CC528D7D9B6BF5D8105B3B54C265 929CFE89E57ED4B08FD41248EEF489F6C651A9AC76651B1275E1038E9B690652 C1B406AF9778E97BC80DE3D93174C2B9B582E078B9F9BAAAEAF67AA32AEB71A7 B673391D121D0E0D12760517916D459AFA9391702079E246407DC99D3D02CD51 F655AA30FC9BBEA16DF8197953B881E04D677592D70D7A3E2AD408D9470E5D58 E99EC5F2EAA2F28C658333A6956871F7F01A39D5802F52763C11178C4B6F9BF4 2381391D41C045DACB4621F380171B9AB04A1E16FF35FDCEC2936AC830A4645E FBD7E8B702C39AF4BA6CD16AADB151FD42DBDF4E23A0365021F81B4774406242 8E106DC131F170397C20387B30FC73E6858340A9DBE603AEF4FF7C82B5625D63 F1C20BB5C80A17E98CBDD36B4C45A76D1713A5A3FB0400F64AD12A31CFCC1F96 2F81957D1AF253990DA80A5D2CDE29B8D24F3508D3F90190600909BD363BCCD6 9B69D8F6A9F2533B62A43CE479734AE4DDE7101187BBB0EA712F80A6AC31E7C6 6CB9392FF86C6648BF7C7884DE5F2D755D5AA88813E3C8257AC3F6CFCB748A78 403BCA49935A8BCC09C52459E92E4A908677CC48F780929FBAF8E4EB2B8472E1 E8603A2CA2106264AC860B8EB85A91239BFD401B0171620A79EC3C6520DAE462 5F0F69E99045D48DD92E1418FF4EF3CC338FEB2912C61FD39544E33D85B3F86E F6C9AEB273B10E3F5B429432CCCE7DDD9848EB13D98681E8E1F3CDCEE8269811 A48EFA015E5EAB231C99AB6864C338DCAE61DB3EBF713D5B50DEE579D3907D8A B9F4A73A436E6B63CA2E5E8B67B167F0457F81D67DFD616B757D3EEADABB04B4 10A309E404D3907CA96EE321E13600A57899231F5E277E716A0416927FD25711 4359F3642E74D74123E0A2276EA0F3F1FCC75260F56E683E2C55ED8B8CBFCC2F D6DF2764591492F3065908A84BE711C5E3BA2329C775ADC9024945DE8C400FAE 6CDE3C51FBA4A95569B3EF6CF35B6DAA5A7F5C73BC84F200B38ABF60013310DF 960253DFA4379D5A3FC96A5C982D6D68A03603E920479402702AE888F682AB8B F3569F16B323D877A7ABDC905FEFB3DC0C1132B6F924E05ADB0506F5615EAA37 83C066477D511C0F280EC5AA6AE297334B31D5B863279BE653B3F7F2405D3F10 008C3C8EBF6FF798407568DE82BA8003DD36BF2CF810B337F21D5239219FBE5F 2024F94BE1644D03C9A651CFCE355F9D49AA235C8847087F10C4F625FDAA6FF9 E56CFBAE5CCE73905AD829B351A49EFFA1F863C22CDF59DD2EF1A39802D907F2 53B22E02FEE6A2A98C23E1F212C536A59F22150E9BD7B02BDE693A3F09893836 607552A6B44915433B683881882ACCBEA20A21BDAA1CCA358E29E3BB13A44835 D95509EADB6FD4B14B400916E9A1374639B85DCCC938A35E64D3D5BB4F6813D9 0D63316ED052BB7D5C733A5FEF0F18D193E5C9854C0199B66AEB89D8E620E093 D5CB4DE6E00312B0DC5995DF91167A89BBB8410C4AE494004D67902101714EE8 8EE7B4EF096A14A1D5189C41260A7D163DA79328FD997250020E6DED6435B934 17DDBB6A4D6F5E3F1D315BB5AFBB320538CF3BCD60D9FA7BE2BB0FFECF889E2B 2CB825224EBB436BA04560AD1F3CCECDAECC1766577BFDCC0B6AFDC6129D3540 F98173E907574C582D757FAB72555864D18E3EE045A6D47B73C5714A4372345F 786825BE53684D1FA6479D89906563BE44A3552A94163DD7AF5D672F24A0D73E AF0DF1DDFEF513C73EB0DF2524132B99820AFF80B3EE999CDA07C6A8D50D0BA6 FF8E302984628FA5D8500F8F2F6E4472CC4A439F19781EF0CA63738F5B1AFD3F 72EF6418D46673AB5B922119A1355F7FB0834E82E0C0C045CE524345E00B9FAE 17048D638D92B9550519290CE93CD789FCD57CDD38E95AB31FCC13F1ADD83A9E 460603BB7F82032008E72E0FC8B22DB3195E011D7CC67F24BB2095E125F815FE 07773BAAB462AF86BA31A80AED3944ACB38565FF5D029A94ADE79B6D5277A5B9 EE6B13D6B293AA37F8C604338B62CBB53D0EF7B1534DBA09A96285F6DA40C5D3 F075C44383350D81D0DBF0B712B71A810E818B5CD0E5F10F73839EF211266A1F D44FA728BDB371491B412CB86467AC653B68CB2BE823A842EDDC390A27153540 69C2F61167AD196FF7437CAA9C35501700A1269C881CE6E6299D72FDBC478083 6AC84423A2F21836713E70804B897976F5E1B09FBD5F03BF67A973AE009817F6 7123D220B24FF1AF52684A775BB3087AE505A26B1932CB613D185F1D01EF69BA 10B9E4797BC341CA9ACB2FD2BCB4220293B5196BFA78EBA63648BC2EEC584C9C E967E52D100C5F5441FC0C9F5D56D4FF03EB1277AD9BA2D2B7D1442C5C87D46E B7D024CB9A3BDD65B8B010EB343BA8A76EF8E5EC6811692EB1DC0B6195B624E0 E416296B97F77AEBCAFBB8571B0A208881611F613E48BF2408500D27DF7EFCD6 0C8976CD9E4FF44288B8C06E6A615413D04D33CD2510B752FCF88CFD6C99A447 3268D81DC35DC48E342B9B900C6AB9269E563A7E91FFD4B77DED7C252D36F2F9 713C4B51524A7DBCF224929EAFD95627D4A5504A3DA8B34F427BE75CD03C5810 A72DDEEF62A1137C79841C159FC7D743DC046FD31A4199A63158B62C7C1022AF 5D07E4CC28E67CD3BFC91C48A11760263B4C309320DA8560C9A43DDD7EEE4532 96C2FDF054AE919DCA1A00402549E56A55CBBB5E0A1DCFD01D25ED33600471FA 05FD4371FD2FB1AA9D2C98B4D7BD59A01F85B4C7F3452797C8F118DC831AD655 06042662135431C2310DE546D2BEF1B2831215E7C8517D63B87EA71D3202938E A1C98658C5366297A80BE635DAACAC441B212D592AEE3C608C460054D3992C86 EB6301AFBB4D0C9655C07D7402A96A20946F0DFD6CF6CCF0E28EA03747AD27EE 9CC964B2F3103C81D7FB5D93756FF05C6C5F5488A68A5A66D2ED24CF72FAA7D3 250111E99821015336B7694912A035849A35A5880DAC8B7CA0936F35470E4CF7 D007A045286FF0FC932B51AA00C3B7979E0A0C9BD8080CAA104119963606C7E2 63216E24F42AA45205D454F5479A90A85D38C51316DC51FAE4C4D9780719F0DD 513D6C3192BE8007E9819A364AF38BD27CB82FA02FEA92FE360A8A019BABAC29 88A7D867C6C4D83AD4B447F3641C004132E53963ACD7AEE574332CA6584F8F62 6F9C806CB698C8B3611AC29DD173285C8EE05AE4D2623BC1A102E81A20A2E086 B0FE38CCF8B771EA46C6DD9EB64CA70308E75F9870F45B769CAEA0C79F2242C0 0C084C059EA10A8B19D73A6D32F18B751C1777E1C045182FB0F55AAA3C512AA8 3A94927B2E15EB3A8E02FBCBA7BB91C7B86193D02B2236CF5E897EF78C910DFA 448245519BAB629D5AB46695E89B45A6D3FF7F31B36014BCCF2829C3807993E3 0AA0FC58E323E37E762A16DCD9942432B40B5E7F86C2C5FCB800BEEF48F4876F 936EA3EE6625E82A3444AF512C2C2A79F01B8445B6B6B50789FF111D66ABA715 2AD0145891E33883A8198168F6EAD23455BD413A89AC440EB9ED9E2FD063B616 AF9DA0254C823915295B41F11B51BB3D6FD3AE3A786A765F406CC8E8DC3A3A77 84724AC6B99D4C3FDAE00A9BA466A1A9483EDB52CF4A497CF7B976706C9047ED 98904C9C9E2C180704558B251B962231E1FA26AF69E7A76CA9A9F75493122C1F 721E1E9E66777F734BB45425A451CEDC82C01D53902F79511D8E3E09CFCED53C 44B0625DD281E8E7C710DE0AB402083BA08FEBFDA0DD92D561047C7C7C886901 C19F97E680318A95A1FD8FAA45867E2F137B884EAC35331710FA7B4E8C88A04D 033AC9B1D19A1BD20A8EDB1C15EA7CE40CBE18CF3433DA37E0ECC411DF9E6E4E 0ED790336EBB2B81ED312685E85896A0C93F1698B650A4C80D2A97B3CDBB60C8 76E29F5D8E37A9A8CB648E423D087742B4073C94E4DEC3F0B65B90FC1B53781C 31C8118273678B29A5DD532A194EB18710F63E7AAF3A386BE497E60CD89497C7 D989EBD8D32A0B61134DE00A4B35062DE5ABE3921FF7C6E1DAA3F8E417C5CEFC 2BE6583641E0F8EA3E0C303A9DCD86F3BCC6E77AE8DA8BC0472D63059D1DAC0B D711C4BE91D8189BBFA27B9DB9953F8512B97B7856059E2E724C33D27A7B96E3 60459092030EA07693C0C090D79207DFA9C321151F34860636F053F0DB5DDACB E50A3D629784358C331376EED92121B58B15EAE5B7176CCBCF9FE9883FD7575C 452A0AA8AF20BBC0857A772E0552E59A0D885DCDCFC868AC570FF4E754974680 0204D378AF1818B2A06D5B846EC14DFA99FA45F047B36067E4CAC3A9CF24A100 6099295C6D93465294871CC83F474885F29C5F0BDFDEE54040E6E7AE97EC2FA4 E523E7CB217FF45E09D271F90E17EC023822B4EECB4297983D5BB2C05CC730EF DC5180D8E160B9EECE8F5FB7B0A08D7865220115DB00EFA49EFB7D06E10A55B6 D10C85ED53531FE410EB3DBA0F67A47A8E27F2F25EABE9CB427FDC0223A0D92D 654064A4545708964F4633BD883B9B4905005DA01AC337A2DC968FA04BEC1717 D79C7B1BE11C224F9F5A8A2AF3C6738AB69458DC5C3427287BBB2736F0CC2BEB 5AF4AB990EE0C2AC844A0F4053E5B12E6B03B5FF21DDF0C973C4E2A417A93D48 361ED01895B8885273D9177DA92382C068C796C3C22A253A905A35F149A5217A DCA982F1E98B99DB8A5456980930A76198FADB5A1724719DF7F289E14BAEFFFF 6821D9A629B6C0E1FE485A95EB3E1697725D02BFF48397E5B3718113DF345F32 F418E64EB0EDB69645A652BA9AEB3BDF4C875D3EEAA434C337751E4606AAE20D 6236E52CD645DA4A408EAF6CD0A1386D62D01D34CA441EDB0D1B7A861B145B6B 8B62FC7809BB5EAB15D744FE018743AF377E7B7C0FE12BDCF629855849D15479 22B405ADBF5F683BA7F6959EC8D5BEEA9224ED14B2F681A2C340967E4735C4F1 E0577EE6A50B68BF714D82894B89D667E94037182FFF78C090AAE4E5DFD92B9D D5C99728CAE567E59849EF1EC3D652978E955DD3B3905CCEF7CCBF908F2F0738 203E4AFB7BC0F833C5AB1D939F3982AF794751D17AB6FCF9A460492E881D51AE 3BBD943C57D3F167D8E62A8B5222F8F554EADD8BA9F293EBA46B7111491121BD B93F08D5FC1A9C38C7F2F535797E7FAD32A979D0BF0A6FA6F6DA7A3BDE7A507C DB27A3537B77AA489493D15FE9FB543B5821FE3AF90E784FFFCF2B2134CB5086 E9E285610AB07AEEAC8829B558F179BAE83B2A4F2B9A835021EA40BC624ED541 45C4D4119AD32FE631AF21A3929B6C0581DEB93DD2EA2D9444998955A2E78849 4644CE06B89A8C882A39E608851FB10C8865654A5DB5C832DC647824727CAA5F 552AB9E387C454EDAB0F06C60EA75DB83E95BF412AAD817BC4ECB94627EC8B7E E7E83DD5C4402EAF5F48CBEF96BFE9C1629D9BA86088EF30DAFB3F10BDB5FB37 29EC542C85079817BFF82C2B8CEE595400B56CA9FA8F1242DB812F2501344A96 3EA9DE4997D7B05C1919FE89057FBA2EF9D1264593A3D0ED202BBFAF14821673 B01DE184BA7BBE138D9BBAE94F906D8C71B020B4C737FD57D2CB6A121F4FE5C7 3DC7CC35C8455982782C2017BB85E1B52433AFE0DAB3FF42D977DCEFDDB2AAC2 8576718D4F5979761147777F85FC7870863B90E14345E8456435E1CEB74DEEBC 06F4EBCD0E6ADE8A80F7D0B219E7D7FFC3688CE3400943D647AD5672C096277C F132F95800C0EB9872431644356F881B90F149FED4F23CAF54B2D52D100851BD A8EE01FFDC060E2174ABBBF719E36D56F0FA306CE21779CF44409A4BFD48A8E1 9EBE632AA6ACFFEE6E18D914677B33E666AF5302A413B841E52107F784968E9C 64AAA89D53017D64A13ACD0E3A2ED7267772DF8D631F2CFEFA9C879838EADC7D 50E31E1E0ABE6EE4CA4FCAE3EE5542884D6EAA6D86621031D5148615F5DB2AD1 795E709A6EB9137A7346822D152D1FC457ED0B978167575BFC038B0141473837 AEC0544592322B0E773E433A1D6A044F419EE83F817EDE767BBA12FC8512E505 ADB660FF5A02434CB5A0C933FA42229228D964358AE95F0427517D4AF162C2FF 4A2428DB0F6D71CCCCEAD9418C37D72C6E23F44FB374535A8FB6030BA4B0B826 0D4B4B4832908D6544C8ED4FA682BE1B9E0D737A647B480E0675AD1545D6B310 AF496A4A5E933BC31477DA4CDE9E7FF3AA0ADF2803B9EC2C7DA6E0C82D5EBBCE 5A08531FD871A4E9735C05DA3C63E4716558F194C1E4B93607FBB8FFAB07BA80 47FAB24472D762C775332E9E03F8B751CFEC9B4514BB8B2CD222CB0D66118945 E0EFB15A99D9F141BACFAD9B7EE2090C510C21049815DD51ECE2A5B5EEF03494 107DC5190CF64BDCFFA0DCDDA01E6C96C8D204B8BA0EBAB88285E7FD86DDD4A3 55165DC5344FD15D033B67C052CC34D4151CB059FA36C3BB9CE4610124760684 5826EE3D0439F43501E3C45DA83D72C4C8CE66C23C7326D4F9B24FE3CF5836E6 C08A52BB0535B5AF1C177873397D12A681DF891DBD737B2C1F11C9065E8363F5 36CDB1AFDC2C52CE8D979DAA304B354AD0192532C958AB74EC56C4C68E402D82 CDDDAF61F1E70015C29B5A14999878E56CEAB7B24F9C8B0C1CE14298B210AC26 8B481737EC2546944F1FDA561BA9D27758DDB065F1AF690E188EDAFB2F6B7F28 0C9161AFEBE9952FC317EA1549BB3485B9B920B86F2593C506596D42616643E5 C899EB5D0FCBA6834ACE98FA02A06AE617B67C2E60B2973722673ED65436A364 BF380C17F1A7A7794B5E04EACB7BD14A28C971ABF824AA01036741D714FC499F 875D28A0342D4FFE2EEAEEC06B190514428857047099828F3AD34E3F92122699 7346785297D037E7C7C083143904778B2C80B6BB8BFD1CB6AEBF5700C8384E59 669DE1B2CC069A6314C039BEBECFCF589F805316723C0E0438915CF4560F434B AE973C2569F1B09A80B36CE737E34B030C87964F0FC9F55B66C495D7998206F2 4A51B1984E8AE3437AADC0D998BB002B4CF7C245219D0DDA9C57A053383A7290 B35BC0513DD72B30FC8B89BB4EAF23C8432A12577DAAF9BD440743501D414D95 5EF815165AA2B6DBE8E73770FB37EFBF42D3539E950A56C61611517D09746942 E1DB3B6B9691B39C3B3019ECB5A34ABE7707A181DAA1F9711EF9935B690F4DC9 C030D1E61F62BC95DD60047F9AA7911C147DE7D45BA72269923B3DCE74742B8A DBAD222EF43A7FF4B662075D70374080309F0699F58A670DEFF1865273D4CE23 E64AD57C823DCD1719F698E86636007102678F106AE91420B98839585FEDBD73 AFA186BADF28E1BC6048620D032F04008E811A6720D5092EF4B2E631DA92BABB ECAF0270C5D5035D54705BF1255F8824C127349FB1960764C835882ACE8BB80C AADA8C07535487CD6B3E4E298D94B7F01FB66CD4A738C4A7B4DED0EFDC5376E4 B685CB25470D1DBA78CA3C24774601D58589AD6CD6ECB4506AAF054BF0A53C9F 6D278253291501D876CDC7C74395C1D0DCA5097B3283933748B1ED58283D1EAB 1CA5A1C2A3F20351DEDF7CB8D3D05F4245C6231A440A4195AAE18ED5B40DD5F3 A4FEC08391BD7282D7EEAF7CF899C5C4919B892A3175ACE9605874F65BDD27BB 71E59509005E8E7A042331C5455C39D2DDF8BCFF2EA60FACC5A036E682FC1012 49C55467AA92C5E680D08E4479109D90040CF597FA613BABCA1FF1F880DD1E51 DD285C9F88DACEBF2A16294DA824D8F0117D18EFB203DA81FBDCB95FB77E416F C90E482A11DC578B3C939A547C3F71D9FD8788D4D9392A555B2A022FC9858FB9 951FD6B2DE4F57A307C09C01FA634ACB308AE7F23976237C97A4C234485E21D0 E6D32ED82680FE5AA05224E4A38A5E5DEDCAF1464C10FE145A2C387B718B9A60 1B9BFAB5F7B3BB0D2DC8EA4559B8E69F4200A4320AEA96398E56EF208AC093BB 99088A4710309A8CBA96AC27708EC1B3FE4647FDC35126ED11A3F4EB4BFC8509 3B5338D0A3F06FE04BFBEB7C03E35EA0750FB5FC159F8F4B10B993DF88CBC19D 7C460825F70F88E92292D02C337AB051E8EE0165518BF7996E09172918EE9F6A EC1A0A7009AF5C05B28F885C9C4652AF6845386F349EF3F3ABC8FD78E21404E8 D0BA47DE48097CEBBF69B19B81FE55E61DAC5F496104DAA997122936DA6714BF F273FA47B03EB3D32E06268DF938CE0FDED9A2C30EE605D662C5ABCA81A31379 4A49CCD50259E173B7E4348B2C9CD498C5EE3487F9EB00F9411C88908AAF36B6 5CAD710C5A37B156FCBC3BD7BC9963FABA229234D2E7C4E9046A5FC3A6235329 78255D660B00D3F5AA4AE02BFB1C6293188189ED6610EF5D76578A28C375E9C2 9B02A8DF4357F38DB47C101C5D2E949D054DAA24BBC6C9B84CA3B3179A3355A8 17D4F0D36A8E3DEAD9E4C5AF6E364BD30B375A3962BED22FE7CFAF926A732016 35FD036B7A331CD245970B6056D2EF69D76FC144ADD030538B2DE3C123817E38 0076E4FC37CF42D9D7BB8E787FF1BD2F6777F590DB94586CD1D59E80B32DCE6D 6420A8A6CEFECAF66067FDB979D6F20231D492FA636B040A8BF91C27DD53D096 CC40A017126A50B1ECCC34E9C04804CB04B36B814DF1872EAE51C59A28B082D1 7C1451E8603CA534B2F0677DC21A9AA54D7B6C6C8CD1C28615E3E963BB917061 9FE57F47B1F1FCE60D6315D9873A3E7379EC5577A28EB61A180F1E341860B487 86880B03C761A3AA013917C7B19D873A35CC4217439219CCBB1B215B03A65019 1386A19F82072E5D62D7F053D68932783C6A7A9E13CABDCAF1BEB546F555D936 A4DDBBED5C1B752DE424C1C2BD4493B37213414AF936FE2B68B7AE7E462D8FC0 7F3B21B7C7225A662DBADA1D6694BC2C07EF3A9E1B363EBCE9DE5A1C273DF5B6 4C853AF7738D868142C0DA8DD2FDC98678D883E78CE70F9D51ABFAF18516076F 06322B0554C099C7AF185C8374C6BA6E5274555A66AD5D28A4F8E350EECF5C73 2E0418422E11D2A40FDDE3CEB4992D161512B1F8A08436BE96C8318F9B404401 B82C511CB0375FAD93AB6CF95CA8885229C21D8B63FCB0883011E8F699BF330D F7FD4AC95154576459A0BF71A9AA5649C1133BF47F9E74183A996391E332CC81 6C3EB6FFE1A669258A161AC5864C26A441D70DAEDF0CE1140C1E4FB13C7B00CA 62DB457152117737F05B8EC1DA3DE229A6CE29D70001C42CBFFF79012BF79086 7A4B74241403D98CCF3628BD1F0F45D71E5F5C6DA6E4B75CB0D6A09DEDF57FA5 32E3CBA461CCD32957E92E124727520FB36E70D8E89583831544711C4F592BBD 02903896E53321F2B1E4EE4E11BEDA9D7DD2A87868E9E72BC225B0ABA41BA1AE 82F67F42F5EB3E8BF28B62F72A2D5F6F7EF7D9D6492E9D84F6A1DAC2987FD343 F3674B603F3EDFBE07910079DE0D0A7B849E94C7F24E5C8650145A5680963400 C8EAAFB866F3B307E6FB7CF772CFFBA49BBD30691CFB6BEB6D7FB3AD4EDB51DD 68857CAC2E130B9AE2D39F4F0EC51A56FF8FD5BAD6FC426281ECF47BDBA41F8F A0DA6EDCADA409419B3B083605AD8E507D8F2122BC93BAB30D100CA8DD5F375C E60C4911F19FAFCF1F84CAB08CE5446377AC2B83FAA3880D0A91A476477167EA 525ED7EBCA27ED020D788646B59FB808985303E7273D3C4D91DDCAA8044FABD6 B27F80C10AD00F78738719AB306946C235CE8693A395C2D56233E1253BC111CB ABED30182C02551FE3BDC78C0353F33C80C4C8F034B8585D648389961290DF78 EA9DBAAC78DE16BDC2E03DF0F977EC4B16D12BAB0B180C57437A64B70A919799 C47812F61406554A49E3ED806F0084F4F3E86F09DB272A7C00CF103535D32467 A6691D88E7C4C69F40C03330E97C629F8F265B7E3E67FF3F195BF5E9221767AD A6546EB7CFC6552E4D4B887411BA6047BB487399314E5536B24561FDB58D7A13 B4D778C56231C3E1FE9C11D5C57330101409A099971779AC99BAF87027D93528 C2335A9BE780C005D904DD2F2BA0AAD0052466424E49C7DB87DD0DCC0CB7304C 29BEBC57224E64D31D7D6691CAF4617EAFFEBEF01B086463EAB1FF176B33EA51 47425F03BCB318CC289FBC9C2AB20AC5CE598056EFDECE8F0515AE916365D173 AECA95DC64C8E04A8BC9996B3195D65A7598F68609B02AA0E60ABBA6F934C0E0 11AD7127AB10B29E49E942F42C7EA2B283A0E16F0E14E21A1A82024BF91AD2FC 6821AEE8A54C6D3499301150C5C817BFAF9456E90312AF13703D7435F7767D39 86687858FC2F787E2420A784B5EBF899F6C9D8478DEC292B7C6ADB8E82D2219C EE2E5F23316EDE7FE048291515A7BDD0FD8B928E2EDA631B554ACF09330EFADD FCE138D89C24088FE5D6DF21C136C90EDA2D58AA2F6844696C103374A392FC2E 7CE785FE52E2D405DBF0A3D1A4663593B0281C623638A601D70BDBDB5284E3F5 862DF61900A6B43DC57BDA6E19DE422900563770A83DC4FA966A451E0B2EBD0C 4F0FF1095F7D242A93204327C27B09F8FB74B7E91B941F1C234B97A5DA196BA0 5FD287FFF11E35332161D09FDFF6F1EFD1BA50990C9B11FB9F9335F0F22DC8AA 88C21AEE73AB8EE7532BD1D59E2C7FC3881B07EE879731F3786C2CFE72BF49EE CB820B4882CF73DC9F4D01454B9C2D38A3CC62053A46CF09B3CEF59690D1B22D AF4633FEF5F4FCD97CBA72139A783E82E1435525C67FD4FA258D660A6C7E7326 699043AB0F76E1BE3FC72D765CB95E05140BC874A0414893570363B979BA0479 816617C99ABB3B34CDE3E8CFB3E7813094F26E6F5EDCD2B415E498DDA03E8AA6 43F74128CE5B2FDA0D2789CF98AC4097C3CDD68EBD42BB79373FC8A82D740CF9 74C6C2CB86C9FE616C34962539749CA69D5B4BF0176CA88FBC4A35CFF9DC0816 3A21DCB24CA986D07CAA99E3E60069A68CBF325C924A3A69162A93C225D0A6FF 427B0753DF16BF95F7530D7403AD80FF9D7A49AB1493422EF7459D8812DBDA3D 80482627BA2A128D9AB3600DF2B4BEE0380C6B8FEF27B9930D851ED92A63057F D3DE810452A287538D0C483B2219467C5C9FB30D7943677D72E1FC16418BC267 08CA35E9B961A69D8F9E52D4EFA6F26C9121FDA7DEC06C734E1F5E7D20190079 688FEA50B8C6357AB001E3ABE6222E9B5706F88EC69D2E456C8ED643DECBC8C0 C09BF2426B872A23C43266FE8C90AABA28B3FE1E2C9B250FC1220498478850F7 76D2ACA6A2B7793C0E06FCD72052E1AA87B86F0B7A918BE77ADCB424467E23C4 A60D4556B256F6EDBCDDAC65AF54D25C3C7CE4462726E7BE8672600AF0A7B648 8956FDC8BC9E1F56DD24C28AA1703A50ACE4EB81D083FE57C9665A1FD9111821 1315042979FAA6F6953E30FF6085E62272CD0915168B39A9490F20DBF72563A9 D3263948A5129F3E8CC8C3DC374D5EBDEBE63761F2690B9565B92320E5D8B405 706406D55535E1383C8DBE9CB32B6663C12DBB38D9184346C055F435125FF7C6 6FA84AAFC27D9502E04FB08A5243F331A512E1E024870ABA03901B1D54CD0F21 1D1C736712388171EFE06BFB32076B68BABEB92A92291B5DD8A51216E4E735A8 A1D2321E2B8FE59E1631D96EF4F38835628B03D1C82F3BDDFD1ADDA5FA78F449 5832ACD7257D0CAAD4A60F5D236670C7A5F99E7408C0C5FEB321B771CBB3553D 04B05959AF7F709542D68C52585E67906183CC48AC7D703A41CC9272B804312B 4640CDC7DAD92A040404EF278B26E83265A6C6C3263D3B389EB4845E7F9F2A84 D404CAE1F901E0111DE0B41DB6E2DED17A56E9CF875DC6092C5333391AE2EC2C 0C76810412CFFE9F8BB820C3E73D7013C852657BA98DD0785D5678C65CF3FC0A 9F8F32664EA880F297842558494D31C09CDE5E41B4BDDE39628D530EC7138753 48B2A4B4B68805F5A6827FC2D46A74F9A5212EDFE7A3C7DEB342A5414F7BEEDE FB4CA90AF375B00B39E79E3077E85A474C5F8E12D8A450707F1C333703BFB751 CDC84D322F81FB17574D87D41AC5D5852ABB2FF37364D39B8DCEC51AB98A48C8 62294808419DE6BC29CD3172FAC041913E02 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 cleartomark %%EndResource /F9_0 /LucidaSans-Typewriter83 1 1 [ /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef /space/exclam/quotedbl/numbersign/dollar/percent/ampersand/quoteright /parenleft/parenright/asterisk/plus/comma/minus/period/slash /zero/one/two/three/four/five/six/seven /eight/nine/colon/semicolon/less/equal/greater/question /at/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/bracketleft/backslash/bracketright/asciicircum/underscore /quoteleft/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/braceleft/bar/braceright/asciitilde/bullet /Euro/bullet/quotesinglbase/florin/quotedblbase/ellipsis/dagger/daggerdbl /circumflex/perthousand/Scaron/guilsinglleft/OE/bullet/Zcaron/bullet /bullet/quoteleft/quoteright/quotedblleft/quotedblright/bullet/endash/emdash /tilde/trademark/scaron/guilsinglright/oe/bullet/zcaron/Ydieresis /space/exclamdown/cent/sterling/currency/yen/brokenbar/section /dieresis/copyright/ordfeminine/guillemotleft/logicalnot/hyphen/registered/macron /degree/plusminus/twosuperior/threesuperior/acute/mu/paragraph/periodcentered /cedilla/onesuperior/ordmasculine/guillemotright/onequarter/onehalf/threequarters/questiondown /Agrave/Aacute/Acircumflex/Atilde/Adieresis/Aring/AE/Ccedilla /Egrave/Eacute/Ecircumflex/Edieresis/Igrave/Iacute/Icircumflex/Idieresis /Eth/Ntilde/Ograve/Oacute/Ocircumflex/Otilde/Odieresis/multiply /Oslash/Ugrave/Uacute/Ucircumflex/Udieresis/Yacute/Thorn/germandbls /agrave/aacute/acircumflex/atilde/adieresis/aring/ae/ccedilla /egrave/eacute/ecircumflex/edieresis/igrave/iacute/icircumflex/idieresis /eth/ntilde/ograve/oacute/ocircumflex/otilde/odieresis/divide /oslash/ugrave/uacute/ucircumflex/udieresis/yacute/thorn/ydieresis] pdfMakeFont 612 792 false pdfSetup %%EndSetup %%Page: 1 1 %%BeginPageSetup %%PageOrientation: Landscape pdfStartPage 180 rotate -612 -792 translate 0 0 612 792 re W %%EndPageSetup [] 0 d 1 i 0 j 0 J 10 M 1 w /DeviceGray {} cs [0] sc /DeviceGray {} CS [0] SC false op false OP 0 0 612 792 re W q q [0.1 0 0 0.1 0 0] cm q 180 3960 5760 3460 re W /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [10 0 0 10 0 0] cm [1 0 0 1 0 0] Tm 0 0 Td [0 -0.967854 1 0 564.72 738.864] Tm 0 0 Td /F9_0 8.70222 Tf (Aug 30 10:08 2007 README Page 1) 144.161 Tj 0 -28.4801 Td (xv6 is a re-implementation of Dennis Ritchie's and Ken Thompson\ 's Unix) 305.796 Tj 0 -37.9735 Td (Version 6 \(v6\). xv6 loosely follows the structure and style \ of v6,) 292.69 Tj 0 -47.4668 Td (but is implemented for a modern x86-based multiprocessor using \ ANSI C.) 305.796 Tj 0 -66.4535 Td (ACKNOWLEDGMENTS) 65.5277 Tj 0 -85.4402 Td (xv6 is inspired by John Lions's Commentary on UNIX 6th Edition \ \(Peer) 297.059 Tj 0 -94.9336 Td (to Peer Communications; ISBN: 1-57398-013-7; 1st edition \(June\ 14,) 288.322 Tj 0 -104.427 Td (2000\)\). See also http://pdos.csail.mit.edu/6.828/2007/v6.html\ , which) 297.059 Tj 0 -113.92 Td (provides pointers to on-line resources for v6.) 200.952 Tj 0 -132.907 Td (xv6 borrows code from the following sources:) 192.215 Tj 17.4609 -142.4 Td (JOS \(asm.h, elf.h, mmu.h, bootasm.S, ide.c, console.c, and oth\ ers\)) 288.322 Tj 17.4609 -151.893 Td (Plan 9 \(bootother.S, mp.h, mp.c, lapic.c\)) 179.109 Tj 17.4609 -161.387 Td (FreeBSD \(ioapic.c\)) 78.6333 Tj 17.4609 -170.88 Td (NetBSD \(console.c\)) 78.6333 Tj 0 -189.867 Td (The following people made contributions:) 174.741 Tj 17.4609 -199.36 Td (Russ Cox \(context switching, locking\)) 161.635 Tj 17.4609 -208.853 Td (Cliff Frey \(MP\)) 65.5277 Tj 17.4609 -218.347 Td (Xiao Yu \(MP\)) 52.4222 Tj 0 -237.334 Td (The code in the files that constitute xv6 is) 192.215 Tj 0 -246.827 Td (Copyright 2006-2007 Frans Kaashoek, Robert Morris, and Russ Cox\ .) 279.585 Tj 0 -265.813 Td (ERROR REPORTS) 56.7907 Tj 0 -284.799 Td (If you spot errors or have suggestions for improvement, please \ send) 292.69 Tj 0 -294.293 Td (email to Frans Kaashoek and Robert Morris \(kaashoek,rtm@csail.\ mit.edu\). ) 314.533 Tj 0 -313.28 Td (BUILDING AND RUNNING XV6) 104.844 Tj 0 -332.266 Td (To build xv6 on an x86 ELF machine \(like Linux or FreeBSD\), r\ un "make".) 310.165 Tj 0 -341.76 Td (On non-x86 or non-ELF machines \(like OS X, even on x86\), you \ will) 283.953 Tj 0 -351.253 Td (need to install a cross-compiler gcc suite capable of producing\ x86 ELF) 310.165 Tj 0 -360.746 Td (binaries. See http://pdos.csail.mit.edu/6.828/2007/tools.html.) 275.216 Tj 0 -370.24 Td (Then run "make TOOLPREFIX=i386-jos-elf-".) 179.109 Tj 0 -389.226 Td (To run xv6, you can use Bochs or QEMU, both PC simulators.) 253.374 Tj 0 -398.72 Td (Bochs makes debugging easier, but QEMU is much faster. ) 240.268 Tj 0 -408.213 Td (To run in Bochs, run "make bochs" and then type "c" at the boch\ s prompt.) 314.533 Tj 0 -417.706 Td (To run in QEMU, run "make qemu". Both log the xv6 screen outpu\ t to ) 297.059 Tj 0 -427.2 Td (standard output.) 69.8962 Tj 0 -446.187 Td (To create a typeset version of the code, run "make xv6.pdf".) 262.111 Tj 0 -455.68 Td (This requires the "mpage" text formatting utility.) 218.426 Tj 0 -465.173 Td (See http://www.mesa.nl/pub/mpage/.) 148.529 Tj Q Q q 180 500 5760 3460 re W /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [10 0 0 10 0 0] cm [1 0 0 1 0 0] Tm 0 0 Td [0 -0.967854 1 0 564.72 392.864] Tm 0 0 Td /F9_0 8.70222 Tf (Aug 30 10:08 2007 table of contents Page 1) 192.215 Tj 0 -28.4801 Td (The numbers to the left of the file names in the table are shee\ t numbers.) 318.902 Tj 0 -37.9735 Td (The source code has been printed in a double column format with\ fifty) 301.427 Tj 0 -47.4668 Td (lines per column, giving one hundred lines per sheet \(or page\)\ .) 275.216 Tj 0 -56.9602 Td (Thus there is a convenient relationship between line numbers an\ d sheet numbers.) 345.113 Tj 0 -85.4403 Td (# basic headers) 65.5277 Tj -4514.16 TJm (# system calls) 61.1592 Tj -5015.87 TJm (# pipes) 30.5796 Tj 0 -94.9336 Td (01 types.h) 43.6851 Tj -7022.49 TJm (23 traps.h) 43.6851 Tj -7022.54 TJm (51 pipe.c) 39.3166 Tj 0 -104.427 Td (01 param.h) 43.6851 Tj -7022.49 TJm (24 vectors.pl) 56.7907 Tj 0 -113.92 Td (02 defs.h) 39.3166 Tj -7524.16 TJm (24 trapasm.S) 52.4222 Tj -6019.2 TJm (# string operations) 83.0018 Tj 0 -123.414 Td (03 x86.h) 34.9481 Tj -8025.82 TJm (25 trap.c) 39.3166 Tj -7524.2 TJm (53 string.c) 48.0537 Tj 0 -132.907 Td (05 asm.h) 34.9481 Tj -8025.82 TJm (26 syscall.h) 52.4222 Tj 0 -142.4 Td (06 mmu.h) 34.9481 Tj -8025.82 TJm (26 syscall.c) 52.4222 Tj -6019.2 TJm (# low-level hardware) 87.3703 Tj 0 -151.894 Td (08 elf.h) 34.9481 Tj -8025.82 TJm (28 sysproc.c) 52.4222 Tj -6019.2 TJm (54 mp.h) 30.5796 Tj 209.535 -161.387 Td (55 mp.c) 30.5796 Tj 0 -170.881 Td (# startup) 39.3166 Tj -7524.16 TJm (# file system) 56.7907 Tj -5517.54 TJm (56 lapic.c) 43.6851 Tj 0 -180.374 Td (09 bootasm.S) 52.4222 Tj -6019.16 TJm (29 buf.h) 34.9481 Tj -8025.87 TJm (58 ioapic.c) 48.0537 Tj 0 -189.867 Td (10 bootother.S) 61.1592 Tj -5015.82 TJm (29 dev.h) 34.9481 Tj -8025.87 TJm (59 picirq.c) 48.0537 Tj 0 -199.361 Td (11 bootmain.c) 56.7907 Tj -5517.49 TJm (30 fcntl.h) 43.6851 Tj -7022.54 TJm (60 kbd.h) 34.9481 Tj 0 -208.854 Td (12 main.c) 39.3166 Tj -7524.16 TJm (30 stat.h) 39.3166 Tj -7524.2 TJm (61 kbd.c) 34.9481 Tj 104.767 -218.347 Td (31 file.h) 39.3166 Tj -7524.2 TJm (62 console.c) 52.4222 Tj 0 -227.841 Td (# locks) 30.5796 Tj -8527.49 TJm (31 fs.h) 30.5796 Tj -8527.54 TJm (65 timer.c) 43.6851 Tj 0 -237.334 Td (13 spinlock.h) 56.7907 Tj -5517.49 TJm (32 fsvar.h) 43.6851 Tj 0 -246.827 Td (14 spinlock.c) 56.7907 Tj -5517.49 TJm (33 ide.c) 34.9481 Tj -8025.87 TJm (# user-level) 52.4222 Tj 104.767 -256.321 Td (35 bio.c) 34.9481 Tj -8025.87 TJm (66 initcode.S) 56.7907 Tj 0 -265.814 Td (# processes) 48.0537 Tj -6520.82 TJm (36 fs.c) 30.5796 Tj -8527.54 TJm (66 init.c) 39.3166 Tj 0 -275.307 Td (15 proc.h) 39.3166 Tj -7524.16 TJm (44 file.c) 39.3166 Tj -7524.2 TJm (67 usys.S) 39.3166 Tj 0 -284.8 Td (16 proc.c) 39.3166 Tj -7524.16 TJm (45 sysfile.c) 52.4222 Tj -6019.2 TJm (67 sh.c) 30.5796 Tj 0 -294.294 Td (21 swtch.S) 43.6851 Tj -7022.49 TJm (50 exec.c) 39.3166 Tj 0 -303.787 Td (22 kalloc.c) 48.0537 Tj 0 -341.761 Td (The source listing is preceded by a cross-reference that lists \ every defined ) 336.376 Tj 0 -351.254 Td (constant, struct, global variable, and function in xv6. Each e\ ntry gives,) 323.27 Tj 0 -360.747 Td (on the same line as the name, the line number \(or, in a few ca\ ses, numbers\)) 327.639 Tj 0 -370.241 Td (where the name is defined. Successive lines in an entry list t\ he line) 305.796 Tj 0 -379.734 Td (numbers where the name is used. For example, this entry:) 249.005 Tj 17.4609 -398.721 Td (swtch 2256) 43.6851 Tj 34.9222 -408.214 Td (0311 1928 1962 2255) 83.0018 Tj 34.9222 -417.707 Td (2256) 17.4741 Tj -7.10543e-15 -436.694 Td (indicates that swtch is defined on line 2256 and is mentioned o\ n five lines) 327.639 Tj -7.10543e-15 -446.187 Td (on sheets 03, 19, and 22.) 109.213 Tj Q Q Q Q showpage %%PageTrailer pdfEndPage %%Page: 2 2 %%BeginPageSetup %%PageOrientation: Landscape pdfStartPage 180 rotate -612 -792 translate 0 0 612 792 re W %%EndPageSetup [] 0 d 1 i 0 j 0 J 10 M 1 w /DeviceGray {} cs [0] sc /DeviceGray {} CS [0] SC false op false OP 0 0 612 792 re W q q [0.1 0 0 0.1 0 0] cm q 180 3960 5760 3460 re W /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [10 0 0 10 0 0] cm [1 0 0 1 0 0] Tm 0 0 Td [0 -0.967854 1 0 564.72 738.864] Tm 0 0 Td /F9_0 8.70222 Tf (Aug 30 10:08 2007 cross-references Page 1) 187.846 Tj 0 -28.4801 Td (acquire 1425) 52.4222 Tj -14045.3 TJm (2911 3387 3414 3419) 83.0018 Tj 17.4609 -37.9735 Td (0314 1425 1428 1633) 83.0018 Tj -8527.18 TJm (3460 3479 3618) 61.1592 Tj 17.4609 -47.4668 Td (1815 1869 1918 1933) 83.0018 Tj -6520.6 TJm (bfree 3730) 43.6851 Tj 17.4609 -56.9602 Td (1967 1980 2023 2058) 83.0018 Tj -8527.18 TJm (3730 4060 4070) 61.1592 Tj 17.4609 -66.4535 Td (2265 2312 2553 2871) 83.0018 Tj -6520.6 TJm (bget 3565) 39.3166 Tj 17.4609 -75.9469 Td (3406 3465 3569 3629) 83.0018 Tj -8527.18 TJm (3565 3596 3606) 61.1592 Tj 17.4609 -85.4403 Td (3807 3840 3860 3889) 83.0018 Tj -6520.6 TJm (binit 3538) 43.6851 Tj 17.4609 -94.9336 Td (3904 3914 4423 4440) 83.0018 Tj -8527.18 TJm (0210 1235 3538) 61.1592 Tj 17.4609 -104.427 Td (4456 5217 5255 5278) 83.0018 Tj -6520.6 TJm (bmap 4010) 39.3166 Tj 17.4609 -113.92 Td (6335 6390 6416 6458) 83.0018 Tj -8527.18 TJm (4010 4047 4119 4169) 83.0018 Tj 0 -123.413 Td (allocproc 1628) 61.1592 Tj -13042 TJm (4222) 17.4741 Tj 17.4609 -132.907 Td (1628 1710) 39.3166 Tj -11537.3 TJm (bootmain 1117) 56.7907 Tj 0 -142.4 Td (alltraps 2456) 56.7907 Tj -13543.7 TJm (0975 1117) 39.3166 Tj 17.4609 -151.893 Td (2410 2418 2432 2437) 83.0018 Tj -6520.6 TJm (bootothers 1276) 65.5277 Tj 17.4609 -161.387 Td (2455 2456) 39.3166 Tj -13543.8 TJm (1207 1246 1276) 61.1592 Tj 0 -170.88 Td (ALT 6010) 34.9481 Tj -14045.4 TJm (BPB 3193) 34.9481 Tj 17.4609 -180.373 Td (6010 6038 6040) 61.1592 Tj -11035.5 TJm (3193 3196 3712 3714) 83.0018 Tj 0 -189.867 Td (argfd 4564) 43.6851 Tj -15048.7 TJm (3740) 17.4741 Tj 17.4609 -199.36 Td (4564 4607 4619 4630) 83.0018 Tj -6520.6 TJm (bread 3602) 43.6851 Tj 17.4609 -208.854 Td (4644 4656) 39.3166 Tj -13543.8 TJm (0211 3602 3683 3694) 83.0018 Tj 0 -218.347 Td (argint 2694) 48.0537 Tj -14547 TJm (3713 3739 3867 3961) 83.0018 Tj 17.4609 -227.84 Td (0330 2694 2708 2724) 83.0018 Tj -8527.18 TJm (3982 4032 4066 4119) 83.0018 Tj 17.4609 -237.334 Td (2835 2856 2869 4569) 83.0018 Tj -8527.18 TJm (4169 4222) 39.3166 Tj 17.4609 -246.827 Td (4607 4619 4858 4909) 83.0018 Tj -6520.6 TJm (brelse 3624) 48.0537 Tj 17.4609 -256.32 Td (4910 4957) 39.3166 Tj -13543.8 TJm (0212 3624 3627 3685) 83.0018 Tj 0 -265.813 Td (argptr 2704) 48.0537 Tj -14547 TJm (3697 3719 3723 3746) 83.0018 Tj 17.4609 -275.307 Td (0331 2704 4607 4619) 83.0018 Tj -8527.18 TJm (3875 3967 3970 3991) 83.0018 Tj 17.4609 -284.8 Td (4656 4982) 39.3166 Tj -13543.8 TJm (4037 4043 4072 4122) 83.0018 Tj 0 -294.293 Td (argstr 2721) 48.0537 Tj -14547 TJm (4173 4233 4237) 61.1592 Tj 17.4609 -303.787 Td (0332 2721 4668 4758) 83.0018 Tj -6520.6 TJm (BSIZE 3157) 43.6851 Tj 17.4609 -313.28 Td (4858 4908 4923 4935) 83.0018 Tj -8527.18 TJm (3157 3169 3187 3193) 83.0018 Tj 17.4609 -322.773 Td (4957) 17.4741 Tj -16052.2 TJm (3695 4119 4120 4121) 83.0018 Tj 0 -332.267 Td (BACK 6761) 39.3166 Tj -15550.3 TJm (4165 4166 4169 4170) 83.0018 Tj 17.4609 -341.76 Td (6761 6874 7020 7289) 83.0018 Tj -8527.18 TJm (4171 4221 4222 4224) 83.0018 Tj 0 -351.254 Td (backcmd 6796 7014) 74.2647 Tj -9530.43 TJm (buf 2900) 34.9481 Tj 17.4609 -360.747 Td (6796 6809 6875 7014) 83.0018 Tj -8527.18 TJm (0200 0211 0212 0213) 83.0018 Tj 17.4609 -370.24 Td (7016 7142 7255 7290) 83.0018 Tj -8527.18 TJm (0253 2900 2904 2905) 83.0018 Tj 0 -379.734 Td (BACKSPACE 6216) 61.1592 Tj -13042 TJm (2906 3310 3325 3375) 83.0018 Tj 17.4609 -389.227 Td (6216 6234 6263 6426) 83.0018 Tj -8527.18 TJm (3404 3454 3456 3459) 83.0018 Tj 17.4609 -398.72 Td (6432) 17.4741 Tj -16052.2 TJm (3527 3529 3535 3540) 83.0018 Tj 0 -408.213 Td (balloc 3704) 48.0537 Tj -14547 TJm (3553 3564 3567 3577) 83.0018 Tj 17.4609 -417.707 Td (3704 3725 4019 4030) 83.0018 Tj -8527.18 TJm (3601 3604 3614 3624) 83.0018 Tj 17.4609 -427.2 Td (4040) 17.4741 Tj -16052.2 TJm (3639 3669 3681 3692) 83.0018 Tj 0 -436.693 Td (BBLOCK 3196) 48.0537 Tj -14547 TJm (3707 3732 3854 3955) 83.0018 Tj 17.4609 -446.187 Td (3196 3713 3739) 61.1592 Tj -11035.5 TJm (3979 4013 4055 4105) 83.0018 Tj 0 -455.68 Td (B_BUSY 2909) 48.0537 Tj -14547 TJm (4155 4215 6304 6316) 83.0018 Tj 17.4609 -465.173 Td (2909 3458 3574 3576) 83.0018 Tj -8527.18 TJm (6319 6322 6385 6392) 83.0018 Tj 17.4609 -474.667 Td (3580 3588 3589 3616) 83.0018 Tj -8527.18 TJm (6403 6424 6437 6468) 83.0018 Tj 17.4609 -484.16 Td (3626 3638) 39.3166 Tj -13543.8 TJm (6884 6887 6888 6889) 83.0018 Tj 0 -493.654 Td (B_DIRTY 2911) 52.4222 Tj -14045.3 TJm (6903 6915 6917) 61.1592 Tj Q Q q 180 500 5760 3460 re W /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [10 0 0 10 0 0] cm [1 0 0 1 0 0] Tm 0 0 Td [0 -0.967854 1 0 564.72 392.864] Tm 0 0 Td /F9_0 8.70222 Tf (Aug 30 10:08 2007 cross-references Page 2) 187.846 Tj 0 -28.4801 Td (bufhead 3535) 52.4222 Tj -14045.3 TJm (7158 7160 7163 7164) 83.0018 Tj 17.4609 -37.9735 Td (3535 3551 3552 3554) 83.0018 Tj -8527.18 TJm (7175 7178 7181 7185) 83.0018 Tj 17.4609 -47.4668 Td (3555 3556 3557 3573) 83.0018 Tj -8527.18 TJm (7200 7203 7208 7212) 83.0018 Tj 17.4609 -56.9602 Td (3587 3633 3634 3635) 83.0018 Tj -8527.18 TJm (7213 7216 7221 7222) 83.0018 Tj 17.4609 -66.4535 Td (3636) 17.4741 Tj -16052.2 TJm (7228 7237 7238 7244) 83.0018 Tj 0 -75.9469 Td (buf_table_lock 3530) 83.0018 Tj -10533.7 TJm (7245 7251 7252 7261) 83.0018 Tj 17.4609 -85.4403 Td (3530 3542 3569 3577) 83.0018 Tj -8527.18 TJm (7264 7266 7272 7273) 83.0018 Tj 17.4609 -94.9336 Td (3581 3592 3629 3641) 83.0018 Tj -8527.18 TJm (7278 7284 7290 7291) 83.0018 Tj 0 -104.427 Td (B_VALID 2910) 52.4222 Tj -14045.3 TJm (7294) 17.4741 Tj 17.4609 -113.92 Td (2910 3418 3460 3479) 83.0018 Tj -6520.6 TJm (cmpxchg 0469) 52.4222 Tj 17.4609 -123.414 Td (3574 3607) 39.3166 Tj -13543.9 TJm (0469 1434) 39.3166 Tj 0 -132.907 Td (bwrite 3614) 48.0537 Tj -12540.4 TJm (CONSOLE 2957) 52.4222 Tj 17.4609 -142.4 Td (0213 3614 3617 3696) 83.0018 Tj -8527.18 TJm (2957 6506 6507) 61.1592 Tj 17.4609 -151.894 Td (3718 3745 3966 3990) 83.0018 Tj -6520.6 TJm (console_init 6501) 74.2647 Tj 17.4609 -161.387 Td (4041 4172) 39.3166 Tj -13543.9 TJm (0216 1244 6501) 61.1592 Tj 0 -170.88 Td (bzero 3690) 43.6851 Tj -13042.1 TJm (console_intr 6412) 74.2647 Tj 17.4609 -180.374 Td (3690 3736) 39.3166 Tj -13543.9 TJm (0218 6198 6412) 61.1592 Tj 0 -189.867 Td (C 6031 6409) 48.0537 Tj -12540.4 TJm (console_lock 6220) 74.2647 Tj 17.4609 -199.361 Td (6031 6079 6104 6105) 83.0018 Tj -8527.18 TJm (6220 6335 6381 6390) 83.0018 Tj 17.4609 -208.854 Td (6106 6107 6108 6110) 83.0018 Tj -8527.18 TJm (6393 6503) 39.3166 Tj 17.4609 -218.347 Td (6409 6419 6422 6429) 83.0018 Tj -6520.6 TJm (console_read 6451) 74.2647 Tj 17.4609 -227.841 Td (6439 6469) 39.3166 Tj -13543.9 TJm (6451 6507) 39.3166 Tj 0 -237.334 Td (CAPSLOCK 6012) 56.7907 Tj -11537.1 TJm (console_write 6385) 78.6333 Tj 17.4609 -246.827 Td (6012 6045 6186) 61.1592 Tj -11035.5 TJm (6385 6506) 39.3166 Tj 0 -256.321 Td (cga_putc 6251) 56.7907 Tj -11537.1 TJm (cons_putc 6283) 61.1592 Tj 17.4609 -265.814 Td (6251 6292) 39.3166 Tj -13543.9 TJm (6283 6322 6346 6364) 83.0018 Tj 0 -275.307 Td (cli 0482) 34.9481 Tj -16052 TJm (6367 6371 6372 6392) 83.0018 Tj 17.4609 -284.8 Td (0482 0484 0914 1027) 83.0018 Tj -8527.18 TJm (6426 6432 6438) 61.1592 Tj 17.4609 -294.294 Td (1431 6286 6520) 61.1592 Tj -9028.94 TJm (context 1515) 52.4222 Tj 0 -303.787 Td (cmd 6765) 34.9481 Tj -16052 TJm (0201 0311 1515 1540) 83.0018 Tj 17.4609 -313.281 Td (6765 6777 6786 6787) 83.0018 Tj -8527.18 TJm (1568 1740 1741 1742) 83.0018 Tj 17.4609 -322.774 Td (6792 6793 6798 6802) 83.0018 Tj -8527.18 TJm (1828 1862 2129) 61.1592 Tj 17.4609 -332.267 Td (6806 6815 6818 6823) 83.0018 Tj -6520.6 TJm (copyproc 1704) 56.7907 Tj 17.4609 -341.761 Td (6831 6837 6841 6851) 83.0018 Tj -8527.18 TJm (0296 1704 1757 2811) 83.0018 Tj 17.4609 -351.254 Td (6875 6877 6952 6955) 83.0018 Tj -6520.6 TJm (cp 1560) 30.5796 Tj 17.4609 -360.747 Td (6957 6958 6959 6960) 83.0018 Tj -8527.18 TJm (1560 1657 1660 1661) 83.0018 Tj 17.4609 -370.241 Td (6963 6964 6966 6968) 83.0018 Tj -8527.18 TJm (1662 1663 1664 1665) 83.0018 Tj 17.4609 -379.734 Td (6969 6970 6971 6972) 83.0018 Tj -8527.18 TJm (1666 1825 1832 1855) 83.0018 Tj 17.4609 -389.227 Td (6973 6974 6975 6976) 83.0018 Tj -8527.18 TJm (1862 1870 1884 1905) 83.0018 Tj 17.4609 -398.721 Td (6979 6980 6982 6984) 83.0018 Tj -8527.18 TJm (1923 1924 1928 2009) 83.0018 Tj 17.4609 -408.214 Td (6985 6986 6987 6988) 83.0018 Tj -8527.18 TJm (2014 2015 2016 2020) 83.0018 Tj 17.4609 -417.707 Td (6989 7000 7001 7003) 83.0018 Tj -8527.18 TJm (2021 2026 2030 2038) 83.0018 Tj 17.4609 -427.201 Td (7005 7006 7007 7008) 83.0018 Tj -8527.18 TJm (2039 2066 2084 2090) 83.0018 Tj 17.4609 -436.694 Td (7009 7010 7013 7014) 83.0018 Tj -8527.18 TJm (2537 2539 2541 2574) 83.0018 Tj 17.4609 -446.188 Td (7016 7018 7019 7020) 83.0018 Tj -8527.18 TJm (2582 2583 2590 2595) 83.0018 Tj 17.4609 -455.681 Td (7021 7022 7112 7113) 83.0018 Tj -8527.18 TJm (2696 2710 2712 2726) 83.0018 Tj 17.4609 -465.174 Td (7114 7115 7117 7121) 83.0018 Tj -8527.18 TJm (2778 2780 2783 2784) 83.0018 Tj 17.4609 -474.668 Td (7124 7130 7131 7134) 83.0018 Tj -8527.18 TJm (2811 2843 2860 2874) 83.0018 Tj 17.4609 -484.161 Td (7137 7139 7142 7146) 83.0018 Tj -8527.18 TJm (4361 4571 4588 4589) 83.0018 Tj 17.4609 -493.654 Td (7148 7150 7153 7155) 83.0018 Tj -8527.18 TJm (4605 4607 4609 4617) 83.0018 Tj Q Q Q Q showpage %%PageTrailer pdfEndPage %%Page: 3 3 %%BeginPageSetup %%PageOrientation: Landscape pdfStartPage 180 rotate -612 -792 translate 0 0 612 792 re W %%EndPageSetup [] 0 d 1 i 0 j 0 J 10 M 1 w /DeviceGray {} cs [0] sc /DeviceGray {} CS [0] SC false op false OP 0 0 612 792 re W q q [0.1 0 0 0.1 0 0] cm q 180 3960 5760 3460 re W /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [10 0 0 10 0 0] cm [1 0 0 1 0 0] Tm 0 0 Td [0 -0.967854 1 0 564.72 738.864] Tm 0 0 Td /F9_0 8.70222 Tf (Aug 30 10:08 2007 cross-references Page 3) 187.846 Tj 17.4609 -28.4801 Td (4619 4621 4646 4943) 83.0018 Tj -6520.6 TJm (DIRSIZ 3201) 48.0537 Tj 17.4609 -37.9735 Td (4944 4963 4969 4989) 83.0018 Tj -8527.18 TJm (3201 3205 4205 4272) 83.0018 Tj 17.4609 -47.4668 Td (5097 5101 5102 5103) 83.0018 Tj -8527.18 TJm (4327 4328 4391 4665) 83.0018 Tj 17.4609 -56.9602 Td (5104 5105 5106 5258) 83.0018 Tj -8527.18 TJm (4755 4805) 39.3166 Tj 17.4609 -66.4535 Td (5280 6461) 39.3166 Tj -11537.3 TJm (disk_1_present 3327) 83.0018 Tj 0 -75.9469 Td (cprintf 6327) 52.4222 Tj -14045.3 TJm (3327 3364 3462) 61.1592 Tj 17.4609 -85.4403 Td (0217 1232 1261 2127) 83.0018 Tj -6520.6 TJm (DPL_USER 0664) 56.7907 Tj 17.4609 -94.9336 Td (2131 2133 2235 2328) 83.0018 Tj -8527.18 TJm (0664 1689 1690 1762) 83.0018 Tj 17.4609 -104.427 Td (2569 2576 2581 2782) 83.0018 Tj -8527.18 TJm (1763 2522 2590) 61.1592 Tj 17.4609 -113.92 Td (3408 5637 5862 6327) 83.0018 Tj -6520.6 TJm (E0ESC 6016) 43.6851 Tj 17.4609 -123.414 Td (6522 6523 6524 6527) 83.0018 Tj -8527.18 TJm (6016 6170 6174 6175) 83.0018 Tj 0 -132.907 Td (cpu 1566 5751) 56.7907 Tj -13543.7 TJm (6177 6180) 39.3166 Tj 17.4609 -142.4 Td (0256 0269 1232 1251) 83.0018 Tj -6520.6 TJm (elfhdr 0805) 48.0537 Tj 17.4609 -151.894 Td (1261 1263 1266 1269) 83.0018 Tj -8527.18 TJm (0805 1119 1123 5014) 83.0018 Tj 17.4609 -161.387 Td (1280 1287 1306 1417) 83.0018 Tj -6520.6 TJm (ELF_MAGIC 0802) 61.1592 Tj 17.4609 -170.88 Td (1430 1432 1445 1458) 83.0018 Tj -8527.18 TJm (0802 1129 5029) 61.1592 Tj 17.4609 -180.374 Td (1465 1491 1560 1566) 83.0018 Tj -6520.6 TJm (ELF_PROG_LOAD 0836) 78.6333 Tj 17.4609 -189.867 Td (1576 1674 1676 1828) 83.0018 Tj -8527.18 TJm (0836 5034 5061) 61.1592 Tj 17.4609 -199.361 Td (1859 1862 2548 2552) 83.0018 Tj -6520.6 TJm (EOI 5660) 34.9481 Tj 17.4609 -208.854 Td (2569 2576 2577 2581) 83.0018 Tj -8527.18 TJm (5660 5737 5763) 61.1592 Tj 17.4609 -218.347 Td (2582 2585 5512 5513) 83.0018 Tj -6520.6 TJm (ERROR 5678) 43.6851 Tj 17.4609 -227.841 Td (5751 6522) 39.3166 Tj -13543.8 TJm (5678 5730) 39.3166 Tj 0 -237.334 Td (cpuid 0451) 43.6851 Tj -13042.1 TJm (ESR 5663) 34.9481 Tj 17.4609 -246.827 Td (0451 0455 1265 1439) 83.0018 Tj -8527.18 TJm (5663 5733 5734) 61.1592 Tj 17.4609 -256.321 Td (1462) 17.4741 Tj -14045.6 TJm (EXEC 6757) 39.3166 Tj 0 -265.814 Td (create 4801) 48.0537 Tj -14547 TJm (6757 6822 6959 7265) 83.0018 Tj 17.4609 -275.307 Td (4801 4843 4862 4911) 83.0018 Tj -6520.6 TJm (execcmd 6769 6953) 74.2647 Tj 17.4609 -284.8 Td (4923) 17.4741 Tj -16052.2 TJm (6769 6810 6823 6953) 83.0018 Tj 0 -294.294 Td (CRTPORT 6214) 52.4222 Tj -14045.3 TJm (6955 7221 7227 7228) 83.0018 Tj 17.4609 -303.787 Td (6214 6256 6257 6258) 83.0018 Tj -8527.18 TJm (7256 7266) 39.3166 Tj 17.4609 -313.281 Td (6259 6275 6276 6277) 83.0018 Tj -6520.6 TJm (exit 2004) 39.3166 Tj 17.4609 -322.774 Td (6278) 17.4741 Tj -16052.2 TJm (0297 2004 2041 2538) 83.0018 Tj 0 -332.267 Td (CTL 6009) 34.9481 Tj -16052 TJm (2542 2591 2820 6615) 83.0018 Tj 17.4609 -341.761 Td (6009 6035 6039 6185) 83.0018 Tj -8527.18 TJm (6618 6676 6681 6711) 83.0018 Tj 0 -351.254 Td (devsw 2950) 43.6851 Tj -15048.7 TJm (6816 6825 6835 6880) 83.0018 Tj 17.4609 -360.747 Td (2950 2955 4108 4110) 83.0018 Tj -8527.18 TJm (6920 6927) 39.3166 Tj 17.4609 -370.241 Td (4158 4160 4407 6506) 83.0018 Tj -6520.6 TJm (fdalloc 4583) 52.4222 Tj 17.4609 -379.734 Td (6507) 17.4741 Tj -16052.2 TJm (4583 4632 4874 4987) 83.0018 Tj 0 -389.227 Td (dinode 3173) 48.0537 Tj -12540.4 TJm (fetchint 2666) 56.7907 Tj 17.4609 -398.721 Td (3173 3187 3855 3868) 83.0018 Tj -8527.18 TJm (0333 2666 2696 4963) 83.0018 Tj 17.4609 -408.214 Td (3956 3962 3980 3983) 83.0018 Tj -6520.6 TJm (fetchstr 2678) 56.7907 Tj 0 -417.707 Td (dirent 3203) 48.0537 Tj -14547 TJm (0334 2678 2726 4969) 83.0018 Tj 17.4609 -427.201 Td (3203 4216 4223 4224) 83.0018 Tj -6520.6 TJm (file 3100) 39.3166 Tj 17.4609 -436.694 Td (4255 4705 4754) 61.1592 Tj -11035.5 TJm (0202 0225 0226 0227) 83.0018 Tj 0 -446.188 Td (dirlink 4252) 52.4222 Tj -14045.3 TJm (0229 0230 0231 0290) 83.0018 Tj 17.4609 -455.681 Td (0234 4252 4267 4275) 83.0018 Tj -8527.18 TJm (1538 3100 4403 4409) 83.0018 Tj 17.4609 -465.174 Td (4684 4831 4842) 61.1592 Tj -11035.5 TJm (4418 4425 4426 4427) 83.0018 Tj 0 -474.668 Td (dirlookup 4212) 61.1592 Tj -13042 TJm (4429 4437 4438 4452) 83.0018 Tj 17.4609 -484.161 Td (0235 4212 4219 4259) 83.0018 Tj -8527.18 TJm (4454 4478 4502 4522) 83.0018 Tj 17.4609 -493.654 Td (4374 4770 4811) 61.1592 Tj -11035.5 TJm (4558 4564 4567 4583) 83.0018 Tj Q Q q 180 500 5760 3460 re W /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [10 0 0 10 0 0] cm [1 0 0 1 0 0] Tm 0 0 Td [0 -0.967854 1 0 564.72 392.864] Tm 0 0 Td /F9_0 8.70222 Tf (Aug 30 10:08 2007 cross-references Page 4) 187.846 Tj 17.4609 -28.4801 Td (4603 4615 4627 4642) 83.0018 Tj -6520.6 TJm (ialloc 3952) 48.0537 Tj 17.4609 -37.9735 Td (4653 4855 4979 5155) 83.0018 Tj -8527.18 TJm (0236 3952 3972 4821) 83.0018 Tj 17.4609 -47.4668 Td (5170 6778 6833 6834) 83.0018 Tj -6520.6 TJm (IBLOCK 3190) 48.0537 Tj 17.4609 -56.9602 Td (6964 6972 7172) 61.1592 Tj -11035.5 TJm (3190 3867 3961 3982) 83.0018 Tj 0 -66.4535 Td (filealloc 4419) 61.1592 Tj -11035.4 TJm (I_BUSY 3266) 48.0537 Tj 17.4609 -75.9469 Td (0225 4419 4874 5176) 83.0018 Tj -8527.18 TJm (3266 3861 3863 3886) 83.0018 Tj 0 -85.4403 Td (fileclose 4452) 61.1592 Tj -13042 TJm (3890 3907 3909 3915) 83.0018 Tj 17.4609 -94.9336 Td (0226 2015 4452 4458) 83.0018 Tj -6520.6 TJm (ICRHI 5671) 43.6851 Tj 17.4609 -104.427 Td (4473 4647 4876 4990) 83.0018 Tj -8527.18 TJm (5671 5740 5786 5792) 83.0018 Tj 17.4609 -113.92 Td (4991 5205 5209) 61.1592 Tj -9028.94 TJm (ICRLO 5664) 43.6851 Tj 0 -123.413 Td (filedup 4438) 52.4222 Tj -14045.3 TJm (5664 5741 5742 5787) 83.0018 Tj 17.4609 -132.907 Td (0227 1735 4438 4442) 83.0018 Tj -8527.18 TJm (5793) 17.4741 Tj 17.4609 -142.4 Td (4634) 17.4741 Tj -14045.6 TJm (ID 5657) 30.5796 Tj 0 -151.893 Td (fileinit 4412) 56.7907 Tj -13543.7 TJm (5657 5754) 39.3166 Tj 17.4609 -161.387 Td (0228 1241 4412) 61.1592 Tj -9028.94 TJm (IDE_BSY 3312) 52.4222 Tj 0 -170.88 Td (fileread 4502) 56.7907 Tj -13543.7 TJm (3312 3336) 39.3166 Tj 17.4609 -180.373 Td (0229 4502 4517 4609) 83.0018 Tj -6520.6 TJm (IDE_CMD_READ 3317) 74.2647 Tj 0 -189.867 Td (filestat 4478) 56.7907 Tj -13543.7 TJm (3317 3391) 39.3166 Tj 17.4609 -199.36 Td (0230 4478 4658) 61.1592 Tj -9028.94 TJm (IDE_CMD_WRITE 3318) 78.6333 Tj 0 -208.854 Td (file_table_lock 4408) 87.3703 Tj -10032 TJm (3318 3388) 39.3166 Tj 17.4609 -218.347 Td (4408 4414 4423 4428) 83.0018 Tj -6520.6 TJm (IDE_DF 3314) 48.0537 Tj 17.4609 -227.84 Td (4432 4440 4444 4456) 83.0018 Tj -8527.18 TJm (3314 3338) 39.3166 Tj 17.4609 -237.334 Td (4460 4466) 39.3166 Tj -11537.3 TJm (IDE_DRDY 3313) 56.7907 Tj 0 -246.827 Td (filewrite 4522) 61.1592 Tj -13042 TJm (3313 3336) 39.3166 Tj 17.4609 -256.32 Td (0231 4522 4537 4621) 83.0018 Tj -6520.6 TJm (IDE_ERR 3315) 52.4222 Tj 0 -265.813 Td (FL_IF 0610) 43.6851 Tj -15048.7 TJm (3315 3338) 39.3166 Tj 17.4609 -275.307 Td (0610 1766) 39.3166 Tj -11537.3 TJm (ide_init 3351) 56.7907 Tj 0 -284.8 Td (fork1 6931) 43.6851 Tj -15048.7 TJm (0251 1245 3351) 61.1592 Tj 17.4609 -294.293 Td (6800 6842 6854 6861) 83.0018 Tj -6520.6 TJm (ide_intr 3402) 56.7907 Tj 17.4609 -303.787 Td (6876 6916 6931) 61.1592 Tj -11035.5 TJm (0252 2561 3402) 61.1592 Tj 0 -313.28 Td (forkret 1878) 52.4222 Tj -12038.8 TJm (ide_lock 3324) 56.7907 Tj 17.4609 -322.773 Td (1615 1741 1878) 61.1592 Tj -11035.5 TJm (3324 3355 3406 3409) 83.0018 Tj 0 -332.267 Td (forkret1 2484) 56.7907 Tj -13543.7 TJm (3426 3465 3480 3482) 83.0018 Tj 17.4609 -341.76 Td (1616 1884 2483 2484) 83.0018 Tj -6520.6 TJm (ide_rw 3454) 48.0537 Tj 0 -351.254 Td (gatedesc 0751) 56.7907 Tj -13543.7 TJm (0253 3454 3459 3461) 83.0018 Tj 17.4609 -360.747 Td (0414 0417 0751 2510) 83.0018 Tj -8527.18 TJm (3608 3619) 39.3166 Tj 0 -370.24 Td (getcallerpcs 1471) 74.2647 Tj -9530.42 TJm (ide_start_request 3375) 96.1073 Tj 17.4609 -379.734 Td (0315 1446 1471 2129) 83.0018 Tj -8527.18 TJm (3328 3375 3378 3424) 83.0018 Tj 17.4609 -389.227 Td (6525) 17.4741 Tj -16052.2 TJm (3475) 17.4741 Tj 0 -398.72 Td (getcmd 6884) 48.0537 Tj -12540.4 TJm (ide_wait_ready 3332) 83.0018 Tj 17.4609 -408.213 Td (6884 6915) 39.3166 Tj -13543.9 TJm (3332 3358 3380 3414) 83.0018 Tj 0 -417.707 Td (gettoken 7056) 56.7907 Tj -11537.1 TJm (idtinit 2528) 52.4222 Tj 17.4609 -427.2 Td (7056 7141 7145 7157) 83.0018 Tj -8527.18 TJm (0341 1240 1262 2528) 83.0018 Tj 17.4609 -436.693 Td (7170 7171 7207 7211) 83.0018 Tj -6520.6 TJm (idup 3838) 39.3166 Tj 17.4609 -446.187 Td (7233) 17.4741 Tj -16052.2 TJm (0237 1736 3838 4361) 83.0018 Tj 0 -455.68 Td (growproc 1653) 56.7907 Tj -11537.1 TJm (iget 3803) 39.3166 Tj 17.4609 -465.173 Td (0298 1653 2858) 61.1592 Tj -11035.5 TJm (3803 3823 3968 4234) 83.0018 Tj 0 -474.667 Td (holding 1489) 52.4222 Tj -14045.3 TJm (4359) 17.4741 Tj 17.4609 -484.16 Td (0316 1427 1454 1489) 83.0018 Tj -6520.6 TJm (iinit 3789) 43.6851 Tj 17.4609 -493.654 Td (1857) 17.4741 Tj -16052.2 TJm (0238 1242 3789) 61.1592 Tj Q Q Q Q showpage %%PageTrailer pdfEndPage %%Page: 4 4 %%BeginPageSetup %%PageOrientation: Landscape pdfStartPage 180 rotate -612 -792 translate 0 0 612 792 re W %%EndPageSetup [] 0 d 1 i 0 j 0 J 10 M 1 w /DeviceGray {} cs [0] sc /DeviceGray {} CS [0] SC false op false OP 0 0 612 792 re W q q [0.1 0 0 0.1 0 0] cm q 180 3960 5760 3460 re W /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [10 0 0 10 0 0] cm [1 0 0 1 0 0] Tm 0 0 Td [0 -0.967854 1 0 564.72 738.864] Tm 0 0 Td /F9_0 8.70222 Tf (Aug 30 10:08 2007 cross-references Page 5) 187.846 Tj 0 -28.4801 Td (ilock 3852) 43.6851 Tj -13042.1 TJm (ioapic_read 5834) 69.8962 Tj 17.4609 -37.9735 Td (0239 3852 3858 3878) 83.0018 Tj -8527.18 TJm (5834 5859 5860) 61.1592 Tj 17.4609 -47.4668 Td (4364 4481 4511 4531) 83.0018 Tj -6520.6 TJm (ioapic_write 5841) 74.2647 Tj 17.4609 -56.9602 Td (4672 4683 4693 4762) 83.0018 Tj -8527.18 TJm (5841 5867 5868 5881) 83.0018 Tj 17.4609 -66.4535 Td (4774 4809 4813 4825) 83.0018 Tj -8527.18 TJm (5882) 17.4741 Tj 17.4609 -75.9469 Td (4867 4937 5020 6394) 83.0018 Tj -6520.6 TJm (IO_PIC1 5907) 52.4222 Tj 17.4609 -85.4403 Td (6463 6485) 39.3166 Tj -13543.8 TJm (5907 5920 5935 5944) 83.0018 Tj 0 -94.9336 Td (inb 0354) 34.9481 Tj -16052 TJm (5947 5952 5962 5976) 83.0018 Tj 17.4609 -104.427 Td (0354 0928 0936 1154) 83.0018 Tj -8527.18 TJm (5977) 17.4741 Tj 17.4609 -113.92 Td (3336 3363 5646 6164) 83.0018 Tj -6520.6 TJm (IO_PIC2 5908) 52.4222 Tj 17.4609 -123.414 Td (6167 6232 6257 6259) 83.0018 Tj -8527.18 TJm (5908 5921 5936 5965) 83.0018 Tj 0 -132.907 Td (INDIRECT 3168) 56.7907 Tj -13543.7 TJm (5966 5967 5970 5979) 83.0018 Tj 17.4609 -142.4 Td (3168 4027 4030 4065) 83.0018 Tj -8527.18 TJm (5980) 17.4741 Tj 17.4609 -151.894 Td (4066 4073) 39.3166 Tj -11537.3 TJm (IO_TIMER1 6559) 61.1592 Tj 0 -161.387 Td (initlock 1413) 56.7907 Tj -13543.7 TJm (6559 6568 6578 6579) 83.0018 Tj 17.4609 -170.88 Td (0317 1413 1621 2231) 83.0018 Tj -6520.6 TJm (IPB 3187) 34.9481 Tj 17.4609 -180.374 Td (2524 3355 3542 3791) 83.0018 Tj -8527.18 TJm (3187 3190 3196 3868) 83.0018 Tj 17.4609 -189.867 Td (4414 5184 6503 6504) 83.0018 Tj -8527.18 TJm (3962 3983) 39.3166 Tj 0 -199.361 Td (inode 3252) 43.6851 Tj -13042.1 TJm (iput 3902) 39.3166 Tj 17.4609 -208.854 Td (0203 0234 0235 0236) 83.0018 Tj -8527.18 TJm (0240 2020 3902 3908) 83.0018 Tj 17.4609 -218.347 Td (0237 0239 0240 0241) 83.0018 Tj -8527.18 TJm (3927 4260 4382 4471) 83.0018 Tj 17.4609 -227.841 Td (0242 0243 0245 0246) 83.0018 Tj -8527.18 TJm (4687 4943) 39.3166 Tj 17.4609 -237.334 Td (0247 0248 0249 1539) 83.0018 Tj -6520.6 TJm (IRQ_ERROR 2384) 61.1592 Tj 17.4609 -246.827 Td (2951 2952 3106 3252) 83.0018 Tj -8527.18 TJm (2384 5730) 39.3166 Tj 17.4609 -256.321 Td (3675 3785 3802 3805) 83.0018 Tj -6520.6 TJm (IRQ_IDE 2383) 52.4222 Tj 17.4609 -265.814 Td (3811 3837 3838 3852) 83.0018 Tj -8527.18 TJm (2383 2560 3356 3357) 83.0018 Tj 17.4609 -275.307 Td (3884 3902 3924 3951) 83.0018 Tj -6520.6 TJm (IRQ_KBD 2382) 52.4222 Tj 17.4609 -284.801 Td (3977 4010 4052 4082) 83.0018 Tj -8527.18 TJm (2382 2564 6510 6511) 83.0018 Tj 17.4609 -294.294 Td (4102 4152 4211 4212) 83.0018 Tj -6520.6 TJm (IRQ_OFFSET 2379) 65.5277 Tj 17.4609 -303.788 Td (4252 4256 4353 4356) 83.0018 Tj -8527.18 TJm (2379 2551 2560 2564) 83.0018 Tj 17.4609 -313.281 Td (4388 4395 4666 4702) 83.0018 Tj -8527.18 TJm (2568 2595 5707 5718) 83.0018 Tj 17.4609 -322.774 Td (4753 4800 4804 4856) 83.0018 Tj -8527.18 TJm (5730 5867 5881 5947) 83.0018 Tj 17.4609 -332.268 Td (4903 4921 4933 5015) 83.0018 Tj -8527.18 TJm (5966) 17.4741 Tj 17.4609 -341.761 Td (6385 6451) 39.3166 Tj -11537.3 TJm (IRQ_SLAVE 5910) 61.1592 Tj 0 -351.254 Td (INPUT_BUF 6400) 61.1592 Tj -13042 TJm (5910 5914 5952 5967) 83.0018 Tj 17.4609 -360.748 Td (6400 6403 6424 6436) 83.0018 Tj -6520.6 TJm (IRQ_SPURIOUS 2385) 74.2647 Tj 17.4609 -370.241 Td (6439 6481) 39.3166 Tj -13543.8 TJm (2385 2568 5707) 61.1592 Tj 0 -379.734 Td (insl 0363) 39.3166 Tj -13543.8 TJm (IRQ_TIMER 2381) 61.1592 Tj 17.4609 -389.228 Td (0363 1173 3415) 61.1592 Tj -11035.5 TJm (2381 2551 2595 5718) 83.0018 Tj 0 -398.721 Td (INT_DISABLED 5819) 74.2647 Tj -11537 TJm (6580) 17.4741 Tj 17.4609 -408.214 Td (5819 5867) 39.3166 Tj -11537.3 TJm (isdirempty 4702) 65.5277 Tj 0 -417.707 Td (IOAPIC 5808) 48.0537 Tj -14547 TJm (4702 4709 4778) 61.1592 Tj 17.4609 -427.201 Td (5808 5858) 39.3166 Tj -11537.3 TJm (ismp 5514) 39.3166 Tj 0 -436.694 Td (ioapic_enable 5873) 78.6333 Tj -11035.3 TJm (0280 1247 5514 5613) 83.0018 Tj 17.4609 -446.188 Td (0256 3357 5873 6511) 83.0018 Tj -8527.18 TJm (5855 5875) 39.3166 Tj 0 -455.681 Td (ioapic_id 5516) 61.1592 Tj -11035.4 TJm (itrunc 4052) 48.0537 Tj 17.4609 -465.174 Td (0257 5516 5628 5861) 83.0018 Tj -8527.18 TJm (3675 3911 4052) 61.1592 Tj 17.4609 -474.668 Td (5862) 17.4741 Tj -14045.6 TJm (iunlock 3884) 52.4222 Tj 0 -484.161 Td (ioapic_init 5851) 69.8962 Tj -12038.7 TJm (0241 3884 3887 3926) 83.0018 Tj 17.4609 -493.654 Td (0258 1237 5851 5862) 83.0018 Tj -8527.18 TJm (4371 4483 4514 4534) 83.0018 Tj Q Q q 180 500 5760 3460 re W /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [10 0 0 10 0 0] cm [1 0 0 1 0 0] Tm 0 0 Td [0 -0.967854 1 0 564.72 392.864] Tm 0 0 Td /F9_0 8.70222 Tf (Aug 30 10:08 2007 cross-references Page 6) 187.846 Tj 17.4609 -28.4801 Td (4679 4880 4942 6389) 83.0018 Tj -8527.18 TJm (6024 6067 6089 6113) 83.0018 Tj 17.4609 -37.9735 Td (6456) 17.4741 Tj -14045.6 TJm (KEY_UP 6021) 48.0537 Tj 0 -47.4668 Td (iunlockput 3924) 65.5277 Tj -12540.3 TJm (6021 6065 6087 6111) 83.0018 Tj 17.4609 -56.9602 Td (0242 3924 4366 4375) 83.0018 Tj -6520.6 TJm (kfree 2255) 43.6851 Tj 17.4609 -66.4535 Td (4378 4674 4686 4692) 83.0018 Tj -8527.18 TJm (0262 1664 1726 2069) 83.0018 Tj 17.4609 -75.9469 Td (4696 4766 4771 4779) 83.0018 Tj -8527.18 TJm (2070 2236 2255 2260) 83.0018 Tj 17.4609 -85.4403 Td (4780 4787 4791 4812) 83.0018 Tj -8527.18 TJm (5101 5111 5202 5228) 83.0018 Tj 17.4609 -94.9336 Td (4815 4822 4833 4834) 83.0018 Tj -6520.6 TJm (kill 1976) 39.3166 Tj 17.4609 -104.427 Td (4845 4869 4877 4913) 83.0018 Tj -8527.18 TJm (0299 1976 2581 2837) 83.0018 Tj 17.4609 -113.92 Td (4925 4939 5069 5112) 83.0018 Tj -8527.18 TJm (6717) 17.4741 Tj 0 -123.413 Td (iupdate 3977) 52.4222 Tj -12038.8 TJm (kinit 2225) 43.6851 Tj 17.4609 -132.907 Td (0243 3913 3977 4077) 83.0018 Tj -8527.18 TJm (0263 1238 2225) 61.1592 Tj 17.4609 -142.4 Td (4178 4678 4695 4790) 83.0018 Tj -6520.6 TJm (KSTACKSIZE 0152) 65.5277 Tj 17.4609 -151.893 Td (4829 4840) 39.3166 Tj -13543.9 TJm (0152 1679 1714 1718) 83.0018 Tj 0 -161.387 Td (I_VALID 3267) 52.4222 Tj -14045.3 TJm (1726 2070) 39.3166 Tj 17.4609 -170.88 Td (3267 3866 3876 3905) 83.0018 Tj -6520.6 TJm (lapic_eoi 5760) 61.1592 Tj 0 -180.373 Td (kalloc 2304) 48.0537 Tj -14547 TJm (0273 2558 2562 2566) 83.0018 Tj 17.4609 -189.867 Td (0261 1657 1714 1725) 83.0018 Tj -8527.18 TJm (2570 5760) 39.3166 Tj 17.4609 -199.36 Td (1759 2231 2304 2310) 83.0018 Tj -6520.6 TJm (lapic_init 5701) 65.5277 Tj 17.4609 -208.854 Td (2328 5052 5178) 61.1592 Tj -11035.5 TJm (0274 1231 1263 5701) 83.0018 Tj 0 -218.347 Td (kalloc_lock 2212) 69.8962 Tj -10032.1 TJm (lapic_startap 5780) 78.6333 Tj 17.4609 -227.84 Td (2212 2231 2265 2293) 83.0018 Tj -8527.18 TJm (0275 1293 5780) 61.1592 Tj 17.4609 -237.334 Td (2312 2316 2322 2326) 83.0018 Tj -6520.6 TJm (lgdt 0403) 39.3166 Tj 0 -246.827 Td (KBDATAP 6004) 52.4222 Tj -14045.3 TJm (0403 0411 0954 1054) 83.0018 Tj 17.4609 -256.32 Td (6004 6167) 39.3166 Tj -13543.9 TJm (1696) 17.4741 Tj 0 -265.813 Td (kbd_getc 6156) 56.7907 Tj -11537.1 TJm (lidt 0417) 39.3166 Tj 17.4609 -275.307 Td (6156 6198) 39.3166 Tj -13543.9 TJm (0417 0425 2530) 61.1592 Tj 0 -284.8 Td (kbd_intr 6196) 56.7907 Tj -11537.1 TJm (LINT0 5676) 43.6851 Tj 17.4609 -294.293 Td (0266 2565 6196) 61.1592 Tj -11035.5 TJm (5676 5721) 39.3166 Tj 0 -303.787 Td (KBS_DIB 6003) 52.4222 Tj -12038.8 TJm (LINT1 5677) 43.6851 Tj 17.4609 -313.28 Td (6003 6165) 39.3166 Tj -13543.9 TJm (5677 5722) 39.3166 Tj 0 -322.773 Td (KBSTATP 6002) 52.4222 Tj -12038.8 TJm (LIST 6760) 39.3166 Tj 17.4609 -332.267 Td (6002 6164) 39.3166 Tj -13543.9 TJm (6760 6840 7007 7283) 83.0018 Tj 0 -341.76 Td (KEY_DEL 6028) 52.4222 Tj -12038.8 TJm (listcmd 6790 7001) 74.2647 Tj 17.4609 -351.254 Td (6028 6069 6091 6115) 83.0018 Tj -8527.18 TJm (6790 6811 6841 7001) 83.0018 Tj 0 -360.747 Td (KEY_DN 6022) 48.0537 Tj -14547 TJm (7003 7146 7257 7284) 83.0018 Tj 17.4609 -370.24 Td (6022 6065 6087 6111) 83.0018 Tj -6520.6 TJm (LPTPORT 6215) 52.4222 Tj 0 -379.734 Td (KEY_END 6020) 52.4222 Tj -14045.3 TJm (6215 6232 6236 6237) 83.0018 Tj 17.4609 -389.227 Td (6020 6068 6090 6114) 83.0018 Tj -8527.18 TJm (6238) 17.4741 Tj 0 -398.72 Td (KEY_HOME 6019) 56.7907 Tj -11537.1 TJm (lpt_putc 6228) 56.7907 Tj 17.4609 -408.213 Td (6019 6068 6090 6114) 83.0018 Tj -8527.18 TJm (6228 6291) 39.3166 Tj 0 -417.707 Td (KEY_INS 6027) 52.4222 Tj -12038.8 TJm (ltr 0429) 34.9481 Tj 17.4609 -427.2 Td (6027 6069 6091 6115) 83.0018 Tj -8527.18 TJm (0429 0431 1697) 61.1592 Tj 0 -436.693 Td (KEY_LF 6023) 48.0537 Tj -12540.4 TJm (MAXARGS 6763) 52.4222 Tj 17.4609 -446.187 Td (6023 6067 6089 6113) 83.0018 Tj -8527.18 TJm (6763 6771 6772 7240) 83.0018 Tj 0 -455.68 Td (KEY_PGDN 6026) 56.7907 Tj -11537.1 TJm (MAXFILE 3170) 52.4222 Tj 17.4609 -465.173 Td (6026 6066 6088 6112) 83.0018 Tj -8527.18 TJm (3170 4165 4166) 61.1592 Tj 0 -474.667 Td (KEY_PGUP 6025) 56.7907 Tj -11537.1 TJm (memcmp 5315) 48.0537 Tj 17.4609 -484.16 Td (6025 6066 6088 6112) 83.0018 Tj -8527.18 TJm (0321 5315 5543 5588) 83.0018 Tj 0 -493.654 Td (KEY_RT 6024) 48.0537 Tj -12540.4 TJm (memmove 5331) 52.4222 Tj Q Q Q Q showpage %%PageTrailer pdfEndPage %%Page: 5 5 %%BeginPageSetup %%PageOrientation: Landscape pdfStartPage 180 rotate -612 -792 translate 0 0 612 792 re W %%EndPageSetup [] 0 d 1 i 0 j 0 J 10 M 1 w /DeviceGray {} cs [0] sc /DeviceGray {} CS [0] SC false op false OP 0 0 612 792 re W q q [0.1 0 0 0.1 0 0] cm q 180 3960 5760 3460 re W /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [10 0 0 10 0 0] cm [1 0 0 1 0 0] Tm 0 0 Td [0 -0.967854 1 0 564.72 738.864] Tm 0 0 Td /F9_0 8.70222 Tf (Aug 30 10:08 2007 cross-references Page 7) 187.846 Tj 17.4609 -28.4801 Td (0322 1284 1660 1722) 83.0018 Tj -8527.18 TJm (3166 3179 3263) 61.1592 Tj 17.4609 -37.9735 Td (1731 1775 3684 3874) 83.0018 Tj -6520.6 TJm (namecmp 4203) 52.4222 Tj 17.4609 -47.4668 Td (3989 4121 4171 4328) 83.0018 Tj -8527.18 TJm (0244 4203 4228 4765) 83.0018 Tj 17.4609 -56.9602 Td (4330 5080 5331 6270) 83.0018 Tj -6520.6 TJm (namei 4389) 43.6851 Tj 0 -66.4535 Td (memset 5303) 48.0537 Tj -14547 TJm (0245 1760 4389 4670) 83.0018 Tj 17.4609 -75.9469 Td (0323 1218 1661 1740) 83.0018 Tj -8527.18 TJm (4865 4935 5018) 61.1592 Tj 17.4609 -85.4403 Td (1761 2263 3695 3964) 83.0018 Tj -6520.6 TJm (_namei 4354) 48.0537 Tj 17.4609 -94.9336 Td (4784 4959 5055 5067) 83.0018 Tj -8527.18 TJm (4354 4392 4398) 61.1592 Tj 17.4609 -104.427 Td (5303 6272 6887 6958) 83.0018 Tj -6520.6 TJm (nameiparent 4396) 69.8962 Tj 17.4609 -113.92 Td (6969 6985 7006 7019) 83.0018 Tj -8527.18 TJm (0246 4396 4681 4760) 83.0018 Tj 0 -123.413 Td (microdelay 5769) 65.5277 Tj -12540.3 TJm (4807) 17.4741 Tj 17.4609 -132.907 Td (5769 5788) 39.3166 Tj -11537.3 TJm (NBUF 0156) 39.3166 Tj 0 -142.4 Td (min 3674) 34.9481 Tj -16052 TJm (0156 3529 3553) 61.1592 Tj 17.4609 -151.893 Td (3674 4120 4170) 61.1592 Tj -9028.94 TJm (NCPU 0153) 39.3166 Tj 0 -161.387 Td (mp 5402) 30.5796 Tj 174.613 -161.387 Td (0153 1221 1559 1576) 83.0018 Tj 17.461 -170.88 Td (5402 5507 5536 5542) 83.0018 Tj -8527.18 TJm (1611 5512) 39.3166 Tj 17.461 -180.373 Td (5543 5544 5555 5560) 83.0018 Tj -6520.6 TJm (NDEV 0158) 39.3166 Tj 17.461 -189.867 Td (5564 5565 5568 5569) 83.0018 Tj -8527.18 TJm (0158 4108 4158 4407) 83.0018 Tj 17.461 -199.36 Td (5580 5583 5585 5587) 83.0018 Tj -6520.6 TJm (NDIRECT 3167) 52.4222 Tj 17.461 -208.854 Td (5594 5604 5610 5642) 83.0018 Tj -8527.18 TJm (3166 3167 3170 4015) 83.0018 Tj 1e-04 -218.347 Td (mp_bcpu 5519) 52.4222 Tj -14045.3 TJm (4023 4058) 39.3166 Tj 17.461 -227.84 Td (0281 1225 5519) 61.1592 Tj -9028.94 TJm (NELEM 0347) 43.6851 Tj 1e-04 -237.334 Td (MPBUS 5452) 43.6851 Tj -15048.7 TJm (0347 2123 2779 4961) 83.0018 Tj 17.461 -246.827 Td (5452 5631) 39.3166 Tj -11537.3 TJm (NFILE 0155) 43.6851 Tj 1e-04 -256.32 Td (mpconf 5413) 48.0537 Tj -14547 TJm (0155 4409 4424) 61.1592 Tj 17.461 -265.813 Td (5413 5579 5582 5587) 83.0018 Tj -6520.6 TJm (NINDIRECT 3169) 61.1592 Tj 17.461 -275.307 Td (5605) 17.4741 Tj -16052.2 TJm (3169 3170 4025 4068) 83.0018 Tj 1e-04 -284.8 Td (mp_config 5580) 61.1592 Tj -11035.4 TJm (NINODE 0157) 48.0537 Tj 17.461 -294.293 Td (5580 5610) 39.3166 Tj -13543.8 TJm (0157 3785 3811) 61.1592 Tj 1e-04 -303.787 Td (mp_init 5601) 52.4222 Tj -12038.8 TJm (NO 6006) 30.5796 Tj 17.461 -313.28 Td (0282 1224 5601 5637) 83.0018 Tj -8527.18 TJm (6006 6052 6055 6057) 83.0018 Tj 17.461 -322.773 Td (5638) 17.4741 Tj -16052.2 TJm (6058 6059 6060 6062) 83.0018 Tj 1e-04 -332.267 Td (mpioapic 5439) 56.7907 Tj -13543.7 TJm (6074 6077 6079 6080) 83.0018 Tj 17.461 -341.76 Td (5439 5607 5627 5629) 83.0018 Tj -8527.18 TJm (6081 6082 6084 6102) 83.0018 Tj 1e-04 -351.254 Td (MPIOINTR 5454) 56.7907 Tj -13543.7 TJm (6103 6105 6106 6107) 83.0018 Tj 17.461 -360.747 Td (5454 5632) 39.3166 Tj -13543.8 TJm (6108) 17.4741 Tj 1e-04 -370.24 Td (MPLINTR 5455) 52.4222 Tj -12038.8 TJm (NOFILE 0154) 48.0537 Tj 17.461 -379.734 Td (5455 5633) 39.3166 Tj -13543.8 TJm (0154 1538 1733 2013) 83.0018 Tj 1e-04 -389.227 Td (mpmain 1259) 48.0537 Tj -14547 TJm (4571 4587) 39.3166 Tj 17.461 -398.72 Td (1259 1292) 39.3166 Tj -11537.3 TJm (NPROC 0150) 43.6851 Tj 1e-04 -408.213 Td (mpproc 5428) 48.0537 Tj -14547 TJm (0150 1610 1634 1817) 83.0018 Tj 17.461 -417.707 Td (5428 5606 5619 5624) 83.0018 Tj -8527.18 TJm (1957 1981 2029 2062) 83.0018 Tj 1e-04 -427.2 Td (mp_search 5556) 61.1592 Tj -13042 TJm (2119) 17.4741 Tj 17.461 -436.693 Td (5556 5585) 39.3166 Tj -11537.3 TJm (NSEGS 1506) 43.6851 Tj 1e-04 -446.187 Td (mp_search1 5537) 65.5277 Tj -12540.3 TJm (1506 1570) 39.3166 Tj 17.461 -455.68 Td (5537 5564 5568 5571) 83.0018 Tj -6520.6 TJm (nulterminate 7252) 74.2647 Tj 1e-04 -465.173 Td (MPSTACK 1563) 52.4222 Tj -14045.3 TJm (7115 7130 7252 7273) 83.0018 Tj 17.461 -474.667 Td (1228 1229 1291 1563) 83.0018 Tj -8527.18 TJm (7279 7280 7285 7286) 83.0018 Tj 17.461 -484.16 Td (1571) 17.4741 Tj -16052.2 TJm (7291) 17.4741 Tj 1e-04 -493.654 Td (NADDRS 3166) 48.0537 Tj -12540.4 TJm (NUMLOCK 6013) 52.4222 Tj Q Q q 180 500 5760 3460 re W /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [10 0 0 10 0 0] cm [1 0 0 1 0 0] Tm 0 0 Td [0 -0.967854 1 0 564.72 392.864] Tm 0 0 Td /F9_0 8.70222 Tf (Aug 30 10:08 2007 cross-references Page 8) 187.846 Tj 17.4609 -28.4801 Td (6013 6046) 39.3166 Tj -13543.9 TJm (7201 7206 7225) 61.1592 Tj 0 -37.9735 Td (O_CREATE 3003) 56.7907 Tj -11537.1 TJm (parsecmd 7118) 56.7907 Tj 17.4609 -47.4668 Td (3003 4861 7178 7181) 83.0018 Tj -8527.18 TJm (6802 6917 7118) 61.1592 Tj 0 -56.9602 Td (O_RDONLY 3000) 56.7907 Tj -11537.1 TJm (parseexec 7217) 61.1592 Tj 17.4609 -66.4535 Td (3000 7175) 39.3166 Tj -13543.9 TJm (7114 7155 7217) 61.1592 Tj 0 -75.9469 Td (O_RDWR 3002) 48.0537 Tj -12540.4 TJm (parseline 7135) 61.1592 Tj 17.4609 -85.4403 Td (3002 4868 4886 6664) 83.0018 Tj -8527.18 TJm (7112 7124 7135 7146) 83.0018 Tj 17.4609 -94.9336 Td (6666 6907) 39.3166 Tj -13543.9 TJm (7208) 17.4741 Tj 0 -104.427 Td (outb 0372) 39.3166 Tj -13543.8 TJm (parsepipe 7151) 61.1592 Tj 17.4609 -113.92 Td (0372 0933 0941 1164) 83.0018 Tj -8527.18 TJm (7113 7139 7151 7158) 83.0018 Tj 17.4609 -123.414 Td (1165 1166 1167 1168) 83.0018 Tj -6520.6 TJm (parseredirs 7164) 69.8962 Tj 17.4609 -132.907 Td (1169 3361 3370 3381) 83.0018 Tj -8527.18 TJm (7164 7212 7231 7242) 83.0018 Tj 17.4609 -142.4 Td (3382 3383 3384 3385) 83.0018 Tj -6520.6 TJm (PCINT 5675) 43.6851 Tj 17.4609 -151.894 Td (3386 3388 3391 5645) 83.0018 Tj -8527.18 TJm (5675 5727) 39.3166 Tj 17.4609 -161.387 Td (5646 5920 5921 5935) 83.0018 Tj -6520.6 TJm (peek 7101) 39.3166 Tj 17.4609 -170.88 Td (5936 5944 5947 5952) 83.0018 Tj -8527.18 TJm (7101 7125 7140 7144) 83.0018 Tj 17.4609 -180.374 Td (5962 5965 5966 5967) 83.0018 Tj -8527.18 TJm (7156 7169 7205 7209) 83.0018 Tj 17.4609 -189.867 Td (5970 5976 5977 5979) 83.0018 Tj -8527.18 TJm (7224 7232) 39.3166 Tj 17.4609 -199.361 Td (5980 6236 6237 6238) 83.0018 Tj -6520.6 TJm (pic_enable 5925) 65.5277 Tj 17.4609 -208.854 Td (6256 6258 6275 6276) 83.0018 Tj -8527.18 TJm (0286 3356 5925 6510) 83.0018 Tj 17.4609 -218.347 Td (6277 6278 6577 6578) 83.0018 Tj -8527.18 TJm (6580) 17.4741 Tj 17.4609 -227.841 Td (6579) 17.4741 Tj -14045.6 TJm (pic_init 5932) 56.7907 Tj 0 -237.334 Td (outsl 0384) 43.6851 Tj -15048.7 TJm (0287 1236 5932) 61.1592 Tj 17.4609 -246.827 Td (0384 3389) 39.3166 Tj -11537.3 TJm (pic_setmask 5917) 69.8962 Tj 0 -256.321 Td (outw 0378) 39.3166 Tj -15550.3 TJm (5917 5927 5983) 61.1592 Tj 17.4609 -265.814 Td (0378 1144 1145) 61.1592 Tj -9028.94 TJm (pinit 1619) 43.6851 Tj 0 -275.307 Td (O_WRONLY 3001) 56.7907 Tj -13543.7 TJm (0300 1234 1619) 61.1592 Tj 17.4609 -284.8 Td (3001 4868 4885 4886) 83.0018 Tj -6520.6 TJm (pipe 5160) 39.3166 Tj 17.4609 -294.294 Td (7178 7181) 39.3166 Tj -13543.9 TJm (0204 0291 0292 0293) 83.0018 Tj 0 -303.787 Td (PAGE 0151) 39.3166 Tj -15550.3 TJm (3105 4469 4509 4529) 83.0018 Tj 17.4609 -313.281 Td (0151 0152 1758 2233) 83.0018 Tj -8527.18 TJm (5160 5172 5178 5184) 83.0018 Tj 17.4609 -322.774 Td (2235 2236 2259 2309) 83.0018 Tj -8527.18 TJm (5188 5192 5215 5251) 83.0018 Tj 17.4609 -332.267 Td (5049 5051 5178 5202) 83.0018 Tj -8527.18 TJm (5274 6713 6852 6853) 83.0018 Tj 17.4609 -341.761 Td (5228) 17.4741 Tj -14045.6 TJm (pipealloc 5170) 61.1592 Tj 0 -351.254 Td (panic 6515 6924) 65.5277 Tj -12540.3 TJm (0290 4984 5170) 61.1592 Tj 17.4609 -360.747 Td (0219 1428 1455 1856) 83.0018 Tj -6520.6 TJm (pipeclose 5215) 61.1592 Tj 17.4609 -370.241 Td (1858 1860 1906 1909) 83.0018 Tj -8527.18 TJm (0291 4469 5215) 61.1592 Tj 17.4609 -379.734 Td (2010 2041 2260 2271) 83.0018 Tj -6520.6 TJm (pipecmd 6784 6980) 74.2647 Tj 17.4609 -389.227 Td (2310 2578 3378 3459) 83.0018 Tj -8527.18 TJm (6784 6812 6851 6980) 83.0018 Tj 17.4609 -398.721 Td (3461 3463 3596 3617) 83.0018 Tj -8527.18 TJm (6982 7158 7258 7278) 83.0018 Tj 17.4609 -408.214 Td (3627 3725 3743 3823) 83.0018 Tj -6520.6 TJm (piperead 5274) 56.7907 Tj 17.4609 -417.707 Td (3858 3878 3887 3908) 83.0018 Tj -8527.18 TJm (0292 4509 5274) 61.1592 Tj 17.4609 -427.201 Td (3972 4047 4219 4267) 83.0018 Tj -6520.6 TJm (PIPESIZE 5158) 56.7907 Tj 17.4609 -436.694 Td (4275 4442 4458 4473) 83.0018 Tj -8527.18 TJm (5158 5166 5257 5266) 83.0018 Tj 17.4609 -446.188 Td (4517 4537 4709 4777) 83.0018 Tj -8527.18 TJm (5290) 17.4741 Tj 17.4609 -455.681 Td (4786 4843 5638 6515) 83.0018 Tj -6520.6 TJm (pipewrite 5251) 61.1592 Tj 17.4609 -465.174 Td (6522 6801 6820 6853) 83.0018 Tj -8527.18 TJm (0293 4529 5251) 61.1592 Tj 17.4609 -474.668 Td (6924 6937 7128 7172) 83.0018 Tj -6520.6 TJm (printint 6301) 56.7907 Tj 17.4609 -484.161 Td (7206 7210 7236 7241) 83.0018 Tj -8527.18 TJm (6301 6353 6357) 61.1592 Tj 0 -493.654 Td (parseblock 7201) 65.5277 Tj -10533.8 TJm (proc 1529) 39.3166 Tj Q Q Q Q showpage %%PageTrailer pdfEndPage %%Page: 6 6 %%BeginPageSetup %%PageOrientation: Landscape pdfStartPage 180 rotate -612 -792 translate 0 0 612 792 re W %%EndPageSetup [] 0 d 1 i 0 j 0 J 10 M 1 w /DeviceGray {} cs [0] sc /DeviceGray {} CS [0] SC false op false OP 0 0 612 792 re W q q [0.1 0 0 0.1 0 0] cm q 180 3960 5760 3460 re W /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [10 0 0 10 0 0] cm [1 0 0 1 0 0] Tm 0 0 Td [0 -0.967854 1 0 564.72 738.864] Tm 0 0 Td /F9_0 8.70222 Tf (Aug 30 10:08 2007 cross-references Page 9) 187.846 Tj 17.4609 -28.4801 Td (0205 0296 0303 0333) 83.0018 Tj -8527.18 TJm (1643 1836 1872 1881) 83.0018 Tj 17.4609 -37.9735 Td (0334 1204 1407 1529) 83.0018 Tj -8527.18 TJm (1919 1932 1969 1987) 83.0018 Tj 17.4609 -47.4668 Td (1535 1559 1605 1610) 83.0018 Tj -8527.18 TJm (1991 2076 2085 2293) 83.0018 Tj 17.4609 -56.9602 Td (1611 1612 1627 1631) 83.0018 Tj -8527.18 TJm (2316 2322 2326 2556) 83.0018 Tj 17.4609 -66.4535 Td (1635 1672 1703 1704) 83.0018 Tj -8527.18 TJm (2875 2880 3409 3426) 83.0018 Tj 17.4609 -75.9469 Td (1707 1754 1810 1818) 83.0018 Tj -8527.18 TJm (3482 3581 3592 3641) 83.0018 Tj 17.4609 -85.4403 Td (1955 1957 1978 1981) 83.0018 Tj -8527.18 TJm (3814 3830 3842 3864) 83.0018 Tj 17.4609 -94.9336 Td (2006 2029 2055 2063) 83.0018 Tj -8527.18 TJm (3892 3910 3919 4428) 83.0018 Tj 17.4609 -104.427 Td (2115 2120 2504 2581) 83.0018 Tj -8527.18 TJm (4432 4444 4460 4466) 83.0018 Tj 17.4609 -113.92 Td (2654 2666 2678 2804) 83.0018 Tj -8527.18 TJm (5225 5259 5269 5281) 83.0018 Tj 17.4609 -123.414 Td (2809 3306 3667 4555) 83.0018 Tj -8527.18 TJm (5293 6381 6393 6447) 83.0018 Tj 17.4609 -132.907 Td (5003 5154 5510 5606) 83.0018 Tj -8527.18 TJm (6462 6484) 39.3166 Tj 17.4609 -142.4 Td (5619 5620 5621 6211) 83.0018 Tj -6520.6 TJm (ROOTDEV 0159) 52.4222 Tj 0 -151.894 Td (procdump 2104) 56.7907 Tj -13543.7 TJm (0159 4359) 39.3166 Tj 17.4609 -161.387 Td (0301 2104 6420) 61.1592 Tj -9028.94 TJm (run 2214) 34.9481 Tj 0 -170.88 Td (proc_table_lock 1608) 87.3703 Tj -10032 TJm (2111 2214 2215 2218) 83.0018 Tj 17.4609 -180.374 Td (1608 1621 1633 1639) 83.0018 Tj -8527.18 TJm (2257 2266 2267 2269) 83.0018 Tj 17.4609 -189.867 Td (1643 1815 1836 1857) 83.0018 Tj -8527.18 TJm (2307) 17.4741 Tj 17.4609 -199.361 Td (1858 1869 1872 1881) 83.0018 Tj -6520.6 TJm (runcmd 6806) 48.0537 Tj 17.4609 -208.854 Td (1917 1918 1931 1932) 83.0018 Tj -8527.18 TJm (6806 6820 6837 6843) 83.0018 Tj 17.4609 -218.347 Td (1967 1969 1980 1987) 83.0018 Tj -8527.18 TJm (6845 6859 6866 6877) 83.0018 Tj 17.4609 -227.841 Td (1991 2023 2058 2076) 83.0018 Tj -8527.18 TJm (6917) 17.4741 Tj 17.4609 -237.334 Td (2085 2090) 39.3166 Tj -11537.3 TJm (RUNNING 1526) 52.4222 Tj 0 -246.827 Td (proghdr 0824) 52.4222 Tj -14045.3 TJm (1526 1827 1855 2111) 83.0018 Tj 17.4609 -256.321 Td (0824 1120 1133 5016) 83.0018 Tj -8527.18 TJm (2595) 17.4741 Tj 0 -265.814 Td (readi 4102) 43.6851 Tj -13042.1 TJm (safestrcpy 5375) 65.5277 Tj 17.4609 -275.307 Td (0247 4102 4266 4512) 83.0018 Tj -8527.18 TJm (0324 1776 5097 5375) 83.0018 Tj 17.4609 -284.8 Td (4708 4709 5027 5032) 83.0018 Tj -6520.6 TJm (sched 1853) 43.6851 Tj 17.4609 -294.294 Td (5059 5065) 39.3166 Tj -13543.8 TJm (1853 1856 1858 1860) 83.0018 Tj 0 -303.787 Td (readsb 3679) 48.0537 Tj -14547 TJm (1871 1925 2040) 61.1592 Tj 17.4609 -313.281 Td (3679 3711 3738 3959) 83.0018 Tj -6520.6 TJm (scheduler 1808) 61.1592 Tj 0 -322.774 Td (readsect 1160) 56.7907 Tj -13543.7 TJm (0302 1254 1272 1808) 83.0018 Tj 17.4609 -332.267 Td (1160 1196) 39.3166 Tj -11537.3 TJm (SCROLLLOCK 6014) 65.5277 Tj 0 -341.761 Td (readseg 1179) 52.4222 Tj -14045.3 TJm (6014 6047) 39.3166 Tj 17.4609 -351.254 Td (1114 1126 1136 1179) 83.0018 Tj -6520.6 TJm (SECTSIZE 1112) 56.7907 Tj 0 -360.747 Td (REDIR 6758) 43.6851 Tj -15048.7 TJm (1112 1126 1173 1187) 83.0018 Tj 17.4609 -370.241 Td (6758 6830 6970 7271) 83.0018 Tj -8527.18 TJm (1190 1195) 39.3166 Tj 0 -379.734 Td (redircmd 6775 6964) 78.6333 Tj -9028.76 TJm (SEG 0654) 34.9481 Tj 17.4609 -389.227 Td (6775 6813 6831 6964) 83.0018 Tj -8527.18 TJm (0654 1684 1685 1689) 83.0018 Tj 17.4609 -398.721 Td (6966 7175 7178 7181) 83.0018 Tj -8527.18 TJm (1690) 17.4741 Tj 17.4609 -408.214 Td (7259 7272) 39.3166 Tj -11537.3 TJm (SEG16 0659) 43.6851 Tj 0 -417.707 Td (REG_ID 5810) 48.0537 Tj -14547 TJm (0659 1686) 39.3166 Tj 17.4609 -427.201 Td (5810 5860) 39.3166 Tj -11537.3 TJm (SEG_ASM 0558) 52.4222 Tj 0 -436.694 Td (REG_TABLE 5812) 61.1592 Tj -13042 TJm (0558 0985 0986 1081) 83.0018 Tj 17.4609 -446.188 Td (5812 5867 5868 5881) 83.0018 Tj -8527.18 TJm (1082) 17.4741 Tj 17.4609 -455.681 Td (5882) 17.4741 Tj -14045.6 TJm (segdesc 0627) 52.4222 Tj 0 -465.174 Td (REG_VER 5811) 52.4222 Tj -14045.3 TJm (0400 0403 0627 0651) 83.0018 Tj 17.4609 -474.668 Td (5811 5859) 39.3166 Tj -13543.8 TJm (0654 0659 1570) 61.1592 Tj 0 -484.161 Td (release 1452) 52.4222 Tj -12038.8 TJm (SEG_KCODE 1501) 61.1592 Tj 17.4609 -493.654 Td (0318 1452 1455 1639) 83.0018 Tj -8527.18 TJm (1501 1684 2521 2522) 83.0018 Tj Q Q q 180 500 5760 3460 re W /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [10 0 0 10 0 0] cm [1 0 0 1 0 0] Tm 0 0 Td [0 -0.967854 1 0 564.72 392.864] Tm 0 0 Td /F9_0 8.70222 Tf (Aug 30 10:08 2007 cross-references Page 10) 192.215 Tj 0 -28.4801 Td (SEG_KDATA 1502) 61.1592 Tj -11035.4 TJm (STA_W 0566 0670) 65.5277 Tj 17.4609 -37.9735 Td (1502 1677 1685) 61.1592 Tj -11035.5 TJm (0566 0670 0986 1082) 83.0018 Tj 0 -47.4668 Td (SEG_NULL 0651) 56.7907 Tj -13543.7 TJm (1685 1690) 39.3166 Tj 17.4609 -56.9602 Td (0651 1683 1692 1693) 83.0018 Tj -6520.6 TJm (STA_X 0563 0667) 65.5277 Tj 0 -66.4535 Td (SEG_NULLASM 0554) 69.8962 Tj -12038.7 TJm (0563 0667 0985 1081) 83.0018 Tj 17.4609 -75.9469 Td (0554 0984 1080) 61.1592 Tj -11035.5 TJm (1684 1689) 39.3166 Tj 0 -85.4403 Td (SEG_TSS 1505) 52.4222 Tj -12038.8 TJm (sti 0488) 34.9481 Tj 17.4609 -94.9336 Td (1505 1686 1687 1697) 83.0018 Tj -8527.18 TJm (0488 0490 1252 1270) 83.0018 Tj 0 -104.427 Td (SEG_UCODE 1503) 61.1592 Tj -13042 TJm (1466) 17.4741 Tj 17.4609 -113.92 Td (1503 1689 1692 1762) 83.0018 Tj -6520.6 TJm (strlen 5389) 48.0537 Tj 0 -123.413 Td (SEG_UDATA 1504) 61.1592 Tj -13042 TJm (0325 5044 5078 5389) 83.0018 Tj 17.4609 -132.907 Td (1504 1690 1693 1763) 83.0018 Tj -8527.18 TJm (7123) 17.4741 Tj 0 -142.4 Td (SETGATE 0771) 52.4222 Tj -12038.8 TJm (strncmp 5351) 52.4222 Tj 17.4609 -151.893 Td (0771 2521 2522) 61.1592 Tj -11035.5 TJm (0326 4205 5351) 61.1592 Tj 0 -161.387 Td (setupsegs 1672) 61.1592 Tj -11035.4 TJm (strncpy 5361) 52.4222 Tj 17.4609 -170.88 Td (0303 1243 1264 1672) 83.0018 Tj -8527.18 TJm (0327 4272 5361) 61.1592 Tj 17.4609 -180.373 Td (1826 1833 2860 5106) 83.0018 Tj -6520.6 TJm (STS_IG32 0685) 56.7907 Tj 0 -189.867 Td (SHIFT 6008) 43.6851 Tj -15048.7 TJm (0685 0777) 39.3166 Tj 17.4609 -199.36 Td (6008 6036 6037 6185) 83.0018 Tj -6520.6 TJm (STS_T32A 0682) 56.7907 Tj 0 -208.854 Td (skipelem 4314) 56.7907 Tj -13543.7 TJm (0682 1686) 39.3166 Tj 17.4609 -218.347 Td (4314 4363) 39.3166 Tj -11537.3 TJm (STS_TG32 0686) 56.7907 Tj 0 -227.84 Td (sleep 1903) 43.6851 Tj -15048.7 TJm (0686 0777) 39.3166 Tj 17.4609 -237.334 Td (0304 1903 1906 1909) 83.0018 Tj -6520.6 TJm (STUB 6703 6710 6711 6712 6713 6714) 148.529 Tj 17.4609 -246.827 Td (2090 2109 2878 3480) 83.0018 Tj -8527.18 TJm (6710 6711 6712 6713) 83.0018 Tj 17.4609 -256.32 Td (3577 3862 5263 5284) 83.0018 Tj -8527.18 TJm (6714 6715 6716 6717) 83.0018 Tj 17.4609 -265.814 Td (6466 6729) 39.3166 Tj -13543.9 TJm (6718 6719 6720 6721) 83.0018 Tj 0 -275.307 Td (spinlock 1301) 56.7907 Tj -13543.7 TJm (6722 6723 6724 6725) 83.0018 Tj 17.4609 -284.8 Td (0206 0304 0314 0316) 83.0018 Tj -8527.18 TJm (6726 6727 6728 6729) 83.0018 Tj 17.4609 -294.294 Td (0317 0318 0344 1301) 83.0018 Tj -6520.6 TJm (sum 5525) 34.9481 Tj 17.4609 -303.787 Td (1408 1413 1425 1452) 83.0018 Tj -8527.18 TJm (5525 5527 5529 5531) 83.0018 Tj 17.4609 -313.281 Td (1489 1606 1608 1903) 83.0018 Tj -8527.18 TJm (5532 5543 5592) 61.1592 Tj 17.4609 -322.774 Td (2210 2212 2507 2512) 83.0018 Tj -6520.6 TJm (superblock 3160) 65.5277 Tj 17.4609 -332.267 Td (3309 3324 3526 3530) 83.0018 Tj -8527.18 TJm (3160 3679 3708 3733) 83.0018 Tj 17.4609 -341.761 Td (3668 3784 4404 4408) 83.0018 Tj -8527.18 TJm (3957) 17.4741 Tj 17.4609 -351.254 Td (5156 5165 6208 6220) 83.0018 Tj -6520.6 TJm (SVR 5661) 34.9481 Tj 17.4609 -360.747 Td (6402) 17.4741 Tj -16052.2 TJm (5661 5707) 39.3166 Tj 0 -370.241 Td (STA_R 0567 0671) 65.5277 Tj -10533.8 TJm (swtch 2156) 43.6851 Tj 17.4609 -379.734 Td (0567 0671 0985 1081) 83.0018 Tj -8527.18 TJm (0311 1828 1862 2155) 83.0018 Tj 17.4609 -389.227 Td (1684 1689) 39.3166 Tj -13543.9 TJm (2156) 17.4741 Tj 0 -398.721 Td (start 0912 1025 6607) 87.3703 Tj -8025.43 TJm (syscall 2774) 52.4222 Tj 17.4609 -408.214 Td (0911 0912 0974 1024) 83.0018 Tj -8527.18 TJm (0335 2540 2656 2774) 83.0018 Tj 17.4609 -417.707 Td (1025 1073 1074 2229) 83.0018 Tj -6520.6 TJm (SYS_chdir 2616) 61.1592 Tj 17.4609 -427.2 Td (2232 2233 2236 6606) 83.0018 Tj -8527.18 TJm (2616 2751) 39.3166 Tj 17.4609 -436.694 Td (6607) 17.4741 Tj -14045.6 TJm (SYS_close 2607) 61.1592 Tj 0 -446.187 Td (stat 3050) 39.3166 Tj -15550.3 TJm (2607 2752) 39.3166 Tj 17.4609 -455.681 Td (0207 0230 0248 3050) 83.0018 Tj -6520.6 TJm (SYS_dup 2617) 52.4222 Tj 17.4609 -465.174 Td (3665 4082 4478 4553) 83.0018 Tj -8527.18 TJm (2617 2753) 39.3166 Tj 17.4609 -474.667 Td (4654 6653) 39.3166 Tj -11537.3 TJm (SYS_exec 2609) 56.7907 Tj 0 -484.161 Td (stati 4082) 43.6851 Tj -15048.7 TJm (2609 2754 6611) 61.1592 Tj 17.4609 -493.654 Td (0248 4082 4482) 61.1592 Tj -9028.94 TJm (SYS_exit 2602) 56.7907 Tj Q Q Q Q showpage %%PageTrailer pdfEndPage %%Page: 7 7 %%BeginPageSetup %%PageOrientation: Landscape pdfStartPage 180 rotate -612 -792 translate 0 0 612 792 re W %%EndPageSetup [] 0 d 1 i 0 j 0 J 10 M 1 w /DeviceGray {} cs [0] sc /DeviceGray {} CS [0] SC false op false OP 0 0 612 792 re W q q [0.1 0 0 0.1 0 0] cm q 180 3960 5760 3460 re W /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [10 0 0 10 0 0] cm [1 0 0 1 0 0] Tm 0 0 Td [0 -0.967854 1 0 564.72 738.864] Tm 0 0 Td /F9_0 8.70222 Tf (Aug 30 10:08 2007 cross-references Page 11) 192.215 Tj 17.4609 -28.4801 Td (2602 2755 6616) 61.1592 Tj -11035.5 TJm (2556 2871 2875 2878) 83.0018 Tj 0 -37.9735 Td (SYS_fork 2601) 56.7907 Tj -13543.7 TJm (2880) 17.4741 Tj 17.4609 -47.4668 Td (2601 2756) 39.3166 Tj -11537.3 TJm (TICR 5680) 39.3166 Tj 0 -56.9602 Td (SYS_fstat 2613) 61.1592 Tj -13042 TJm (5680 5716) 39.3166 Tj 17.4609 -66.4535 Td (2613 2757) 39.3166 Tj -11537.3 TJm (TIMER 5672) 43.6851 Tj 0 -75.9469 Td (SYS_getpid 2618) 65.5277 Tj -12540.3 TJm (5672 5718) 39.3166 Tj 17.4609 -85.4403 Td (2618 2758) 39.3166 Tj -11537.3 TJm (TIMER_16BIT 6571) 69.8962 Tj 0 -94.9336 Td (SYS_kill 2608) 56.7907 Tj -13543.7 TJm (6571 6577) 39.3166 Tj 17.4609 -104.427 Td (2608 2759) 39.3166 Tj -11537.3 TJm (TIMER_DIV 6566) 61.1592 Tj 0 -113.92 Td (SYS_link 2614) 56.7907 Tj -13543.7 TJm (6566 6578 6579) 61.1592 Tj 17.4609 -123.413 Td (2614 2760) 39.3166 Tj -11537.3 TJm (TIMER_FREQ 6565) 65.5277 Tj 0 -132.907 Td (SYS_mkdir 2615) 61.1592 Tj -13042 TJm (6565 6566) 39.3166 Tj 17.4609 -142.4 Td (2615 2761) 39.3166 Tj -11537.3 TJm (timer_init 6574) 65.5277 Tj 0 -151.893 Td (SYS_mknod 2611) 61.1592 Tj -13042 TJm (0338 1248 6574) 61.1592 Tj 17.4609 -161.387 Td (2611 2762) 39.3166 Tj -11537.3 TJm (TIMER_MODE 6568) 65.5277 Tj 0 -170.88 Td (SYS_open 2610) 56.7907 Tj -13543.7 TJm (6568 6577) 39.3166 Tj 17.4609 -180.373 Td (2610 2763) 39.3166 Tj -11537.3 TJm (TIMER_RATEGEN 6570) 78.6333 Tj 0 -189.867 Td (SYS_pipe 2604) 56.7907 Tj -13543.7 TJm (6570 6577) 39.3166 Tj 17.4609 -199.36 Td (2604 2764) 39.3166 Tj -11537.3 TJm (TIMER_SEL0 6569) 65.5277 Tj 0 -208.854 Td (SYS_read 2606) 56.7907 Tj -13543.7 TJm (6569 6577) 39.3166 Tj 17.4609 -218.347 Td (2606 2765) 39.3166 Tj -11537.3 TJm (TPR 5659) 34.9481 Tj 0 -227.84 Td (SYS_sbrk 2619) 56.7907 Tj -13543.7 TJm (5659 5746) 39.3166 Tj 17.4609 -237.334 Td (2619 2766) 39.3166 Tj -11537.3 TJm (trap 2534) 39.3166 Tj 0 -246.827 Td (SYS_sleep 2620) 61.1592 Tj -13042 TJm (2402 2404 2469 2534) 83.0018 Tj 17.4609 -256.32 Td (2620 2767) 39.3166 Tj -13543.8 TJm (2576 2578 2581) 61.1592 Tj 0 -265.813 Td (SYS_unlink 2612) 65.5277 Tj -10533.8 TJm (trapframe 0501) 61.1592 Tj 17.4609 -275.307 Td (2612 2768) 39.3166 Tj -13543.8 TJm (0501 1541 1616 1718) 83.0018 Tj 0 -284.8 Td (SYS_wait 2603) 56.7907 Tj -13543.7 TJm (2534) 17.4741 Tj 17.4609 -294.293 Td (2603 2769) 39.3166 Tj -11537.3 TJm (trapret 2474) 52.4222 Tj 0 -303.787 Td (SYS_write 2605) 61.1592 Tj -13042 TJm (2473 2474 2486) 61.1592 Tj 17.4609 -313.28 Td (2605 2770) 39.3166 Tj -11537.3 TJm (T_SYSCALL 2376) 61.1592 Tj 0 -322.773 Td (taskstate 0701) 61.1592 Tj -13042 TJm (2376 2522 2536 6612) 83.0018 Tj 17.4609 -332.267 Td (0701 1569) 39.3166 Tj -13543.8 TJm (6617 6707) 39.3166 Tj 0 -341.76 Td (TCCR 5681) 39.3166 Tj -13543.8 TJm (tvinit 2516) 48.0537 Tj 17.4609 -351.254 Td (5681 5717) 39.3166 Tj -13543.8 TJm (0343 1239 2516) 61.1592 Tj 0 -360.747 Td (TDCR 5682) 39.3166 Tj -13543.8 TJm (userinit 1752) 56.7907 Tj 17.4609 -370.24 Td (5682 5715) 39.3166 Tj -13543.8 TJm (0305 1249 1752) 61.1592 Tj 0 -379.734 Td (T_DEV 3184) 43.6851 Tj -13042.1 TJm (VER 5658) 34.9481 Tj 17.4609 -389.227 Td (3184 4107 4157 4911) 83.0018 Tj -8527.18 TJm (5658 5726) 39.3166 Tj 0 -398.72 Td (T_DIR 3182) 43.6851 Tj -13042.1 TJm (wait 2053) 39.3166 Tj 17.4609 -408.213 Td (3182 4218 4365 4673) 83.0018 Tj -8527.18 TJm (0306 2053 2827 6683) 83.0018 Tj 17.4609 -417.707 Td (4778 4838 4868 4923) 83.0018 Tj -8527.18 TJm (6712 6844 6870 6871) 83.0018 Tj 17.4609 -427.2 Td (4938) 17.4741 Tj -16052.2 TJm (6918) 17.4741 Tj 0 -436.693 Td (T_FILE 3183) 48.0537 Tj -12540.4 TJm (waitdisk 1151) 56.7907 Tj 17.4609 -446.187 Td (3183 4862) 39.3166 Tj -13543.8 TJm (1151 1163 1172) 61.1592 Tj 0 -455.68 Td (ticks 2513) 43.6851 Tj -13042.1 TJm (wakeup 1965) 48.0537 Tj 17.4609 -465.173 Td (0342 2513 2554 2555) 83.0018 Tj -8527.18 TJm (0307 1965 2555 3420) 83.0018 Tj 17.4609 -474.667 Td (2872 2873 2878) 61.1592 Tj -11035.5 TJm (3639 3891 3916 5220) 83.0018 Tj 0 -484.16 Td (tickslock 2512) 61.1592 Tj -13042 TJm (5223 5262 5268 5292) 83.0018 Tj 17.4609 -493.654 Td (0344 2512 2524 2553) 83.0018 Tj -8527.18 TJm (6441) 17.4741 Tj Q Q q 180 500 5760 3460 re W /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [10 0 0 10 0 0] cm [1 0 0 1 0 0] Tm 0 0 Td [0 -0.967854 1 0 564.72 392.864] Tm 0 0 Td /F9_0 8.70222 Tf (Aug 30 10:08 2007 cross-references Page 12) 192.215 Tj 0 -28.4801 Td (wakeup1 1953) 52.4222 Tj -14045.3 TJm (4785 4786) 39.3166 Tj 17.4609 -37.9735 Td (1953 1968 2026 2033) 83.0018 Tj -6520.6 TJm (yield 1867) 43.6851 Tj 0 -47.4668 Td (writei 4152) 48.0537 Tj -14547 TJm (0308 1867 2596) 61.1592 Tj 17.4609 -56.9602 Td (0249 4152 4274 4532) 83.0018 Tj Q Q Q Q showpage %%PageTrailer pdfEndPage %%Page: 8 8 %%BeginPageSetup %%PageOrientation: Landscape pdfStartPage 180 rotate -612 -792 translate 0 0 612 792 re W %%EndPageSetup [] 0 d 1 i 0 j 0 J 10 M 1 w /DeviceGray {} cs [0] sc /DeviceGray {} CS [0] SC false op false OP 0 0 612 792 re W q q [0.1 0 0 0.1 0 0] cm q 180 3960 5760 3460 re W /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [10 0 0 10 0 0] cm [1 0 0 1 0 0] Tm 0 0 Td [0 -0.967854 1 0 564.72 738.864] Tm 0 0 Td /F9_0 8.70222 Tf (Aug 30 10:08 2007 xv6/types.h Page 1) 166.004 Tj 0 -28.4801 Td (0100 typedef unsigned int uint;) 144.161 Tj 0 -37.9735 Td (0101 typedef unsigned short ushort;) 152.898 Tj 0 -47.4668 Td (0102 typedef unsigned char uchar;) 148.529 Tj 0 -56.9602 Td (0103 ) 21.8426 Tj 0 -66.4535 Td (0104 ) 21.8426 Tj 0 -75.9469 Td (0105 ) 21.8426 Tj 0 -85.4403 Td (0106 ) 21.8426 Tj 0 -94.9336 Td (0107 ) 21.8426 Tj 0 -104.427 Td (0108 ) 21.8426 Tj 0 -113.92 Td (0109 ) 21.8426 Tj 0 -123.414 Td (0110 ) 21.8426 Tj 0 -132.907 Td (0111 ) 21.8426 Tj 0 -142.4 Td (0112 ) 21.8426 Tj 0 -151.894 Td (0113 ) 21.8426 Tj 0 -161.387 Td (0114 ) 21.8426 Tj 0 -170.88 Td (0115 ) 21.8426 Tj 0 -180.374 Td (0116 ) 21.8426 Tj 0 -189.867 Td (0117 ) 21.8426 Tj 0 -199.361 Td (0118 ) 21.8426 Tj 0 -208.854 Td (0119 ) 21.8426 Tj 0 -218.347 Td (0120 ) 21.8426 Tj 0 -227.841 Td (0121 ) 21.8426 Tj 0 -237.334 Td (0122 ) 21.8426 Tj 0 -246.827 Td (0123 ) 21.8426 Tj 0 -256.321 Td (0124 ) 21.8426 Tj 0 -265.814 Td (0125 ) 21.8426 Tj 0 -275.307 Td (0126 ) 21.8426 Tj 0 -284.801 Td (0127 ) 21.8426 Tj 0 -294.294 Td (0128 ) 21.8426 Tj 0 -303.788 Td (0129 ) 21.8426 Tj 0 -313.281 Td (0130 ) 21.8426 Tj 0 -322.774 Td (0131 ) 21.8426 Tj 0 -332.268 Td (0132 ) 21.8426 Tj 0 -341.761 Td (0133 ) 21.8426 Tj 0 -351.254 Td (0134 ) 21.8426 Tj 0 -360.748 Td (0135 ) 21.8426 Tj 0 -370.241 Td (0136 ) 21.8426 Tj 0 -379.734 Td (0137 ) 21.8426 Tj 0 -389.228 Td (0138 ) 21.8426 Tj 0 -398.721 Td (0139 ) 21.8426 Tj 0 -408.214 Td (0140 ) 21.8426 Tj 0 -417.708 Td (0141 ) 21.8426 Tj 0 -427.201 Td (0142 ) 21.8426 Tj 0 -436.695 Td (0143 ) 21.8426 Tj 0 -446.188 Td (0144 ) 21.8426 Tj 0 -455.681 Td (0145 ) 21.8426 Tj 0 -465.175 Td (0146 ) 21.8426 Tj 0 -474.668 Td (0147 ) 21.8426 Tj 0 -484.161 Td (0148 ) 21.8426 Tj 0 -493.655 Td (0149 ) 21.8426 Tj 0 -522.135 Td (Sheet 01) 34.9481 Tj Q Q q 180 500 5760 3460 re W /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [10 0 0 10 0 0] cm [1 0 0 1 0 0] Tm 0 0 Td [0 -0.967854 1 0 564.72 392.864] Tm 0 0 Td /F9_0 8.70222 Tf (Aug 30 10:08 2007 xv6/param.h Page 1) 166.004 Tj 0 -28.4801 Td (0150 #define NPROC 64 // maximum number of processes) 262.111 Tj 0 -37.9735 Td (0151 #define PAGE 4096 // granularity of user-space memo\ ry allocation) 332.007 Tj 0 -47.4668 Td (0152 #define KSTACKSIZE PAGE // size of per-process kernel sta\ ck) 283.953 Tj 0 -56.9602 Td (0153 #define NCPU 8 // maximum number of CPUs) 240.268 Tj 0 -66.4535 Td (0154 #define NOFILE 16 // open files per process) 240.268 Tj 0 -75.9469 Td (0155 #define NFILE 100 // open files per system) 235.9 Tj 0 -85.4403 Td (0156 #define NBUF 10 // size of disk block cache) 249.005 Tj 0 -94.9336 Td (0157 #define NINODE 50 // maximum number of active i-nod\ es) 283.953 Tj 0 -104.427 Td (0158 #define NDEV 10 // maximum major device number) 262.111 Tj 0 -113.92 Td (0159 #define ROOTDEV 1 // device number of file system r\ oot disk) 310.165 Tj 0 -123.414 Td (0160 ) 21.8426 Tj 0 -132.907 Td (0161 ) 21.8426 Tj 0 -142.4 Td (0162 ) 21.8426 Tj 0 -151.894 Td (0163 ) 21.8426 Tj 0 -161.387 Td (0164 ) 21.8426 Tj 0 -170.88 Td (0165 ) 21.8426 Tj 0 -180.374 Td (0166 ) 21.8426 Tj 0 -189.867 Td (0167 ) 21.8426 Tj 0 -199.361 Td (0168 ) 21.8426 Tj 0 -208.854 Td (0169 ) 21.8426 Tj 0 -218.347 Td (0170 ) 21.8426 Tj 0 -227.841 Td (0171 ) 21.8426 Tj 0 -237.334 Td (0172 ) 21.8426 Tj 0 -246.827 Td (0173 ) 21.8426 Tj 0 -256.321 Td (0174 ) 21.8426 Tj 0 -265.814 Td (0175 ) 21.8426 Tj 0 -275.307 Td (0176 ) 21.8426 Tj 0 -284.801 Td (0177 ) 21.8426 Tj 0 -294.294 Td (0178 ) 21.8426 Tj 0 -303.788 Td (0179 ) 21.8426 Tj 0 -313.281 Td (0180 ) 21.8426 Tj 0 -322.774 Td (0181 ) 21.8426 Tj 0 -332.268 Td (0182 ) 21.8426 Tj 0 -341.761 Td (0183 ) 21.8426 Tj 0 -351.254 Td (0184 ) 21.8426 Tj 0 -360.748 Td (0185 ) 21.8426 Tj 0 -370.241 Td (0186 ) 21.8426 Tj 0 -379.734 Td (0187 ) 21.8426 Tj 0 -389.228 Td (0188 ) 21.8426 Tj 0 -398.721 Td (0189 ) 21.8426 Tj 0 -408.214 Td (0190 ) 21.8426 Tj 0 -417.708 Td (0191 ) 21.8426 Tj 0 -427.201 Td (0192 ) 21.8426 Tj 0 -436.695 Td (0193 ) 21.8426 Tj 0 -446.188 Td (0194 ) 21.8426 Tj 0 -455.681 Td (0195 ) 21.8426 Tj 0 -465.175 Td (0196 ) 21.8426 Tj 0 -474.668 Td (0197 ) 21.8426 Tj 0 -484.161 Td (0198 ) 21.8426 Tj 0 -493.655 Td (0199 ) 21.8426 Tj 0 -522.135 Td (Sheet 01) 34.9481 Tj Q Q Q Q showpage %%PageTrailer pdfEndPage %%Page: 9 9 %%BeginPageSetup %%PageOrientation: Landscape pdfStartPage 180 rotate -612 -792 translate 0 0 612 792 re W %%EndPageSetup [] 0 d 1 i 0 j 0 J 10 M 1 w /DeviceGray {} cs [0] sc /DeviceGray {} CS [0] SC false op false OP 0 0 612 792 re W q q [0.1 0 0 0.1 0 0] cm q 180 3960 5760 3460 re W /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [10 0 0 10 0 0] cm [1 0 0 1 0 0] Tm 0 0 Td [0 -0.967854 1 0 564.72 738.864] Tm 0 0 Td /F9_0 8.70222 Tf (Aug 30 10:08 2007 xv6/defs.h Page 1) 161.635 Tj 0 -28.4801 Td (0200 struct buf;) 69.8962 Tj 0 -37.9735 Td (0201 struct context;) 87.3703 Tj 0 -47.4668 Td (0202 struct file;) 74.2647 Tj 0 -56.9602 Td (0203 struct inode;) 78.6333 Tj 0 -66.4535 Td (0204 struct pipe;) 74.2647 Tj 0 -75.9469 Td (0205 struct proc;) 74.2647 Tj 0 -85.4403 Td (0206 struct spinlock;) 91.7388 Tj 0 -94.9336 Td (0207 struct stat;) 74.2647 Tj 0 -104.427 Td (0208 ) 21.8426 Tj 0 -113.92 Td (0209 // bio.c) 56.7907 Tj 0 -123.414 Td (0210 void binit\(void\);) 144.161 Tj 0 -132.907 Td (0211 struct buf* bread\(uint, uint\);) 170.372 Tj 0 -142.4 Td (0212 void brelse\(struct buf*\);) 179.109 Tj 0 -151.894 Td (0213 void bwrite\(struct buf*\);) 179.109 Tj 0 -161.387 Td (0214 ) 21.8426 Tj 0 -170.88 Td (0215 // console.c) 74.2647 Tj 0 -180.374 Td (0216 void console_init\(void\);) 174.741 Tj 0 -189.867 Td (0217 void cprintf\(char*, ...\);) 179.109 Tj 0 -199.361 Td (0218 void console_intr\(int\(*\)\(void\)\);) 209.689 Tj 0 -208.854 Td (0219 void panic\(char*\) __attribute__\(\(noreturn\)\ \);) 262.111 Tj 0 -218.347 Td (0220 ) 21.8426 Tj 0 -227.841 Td (0221 // exec.c) 61.1592 Tj 0 -237.334 Td (0222 int exec\(char*, char**\);) 179.109 Tj 0 -246.827 Td (0223 ) 21.8426 Tj 0 -256.321 Td (0224 // file.c) 61.1592 Tj 0 -265.814 Td (0225 struct file* filealloc\(void\);) 161.635 Tj 0 -275.307 Td (0226 void fileclose\(struct file*\);) 196.583 Tj 0 -284.801 Td (0227 struct file* filedup\(struct file*\);) 187.846 Tj 0 -294.294 Td (0228 void fileinit\(void\);) 157.267 Tj 0 -303.788 Td (0229 int fileread\(struct file*, char*, int n\);) 253.374 Tj 0 -313.281 Td (0230 int filestat\(struct file*, struct stat*\);) 253.374 Tj 0 -322.774 Td (0231 int filewrite\(struct file*, char*, int n\);) 257.742 Tj 0 -332.268 Td (0232 ) 21.8426 Tj 0 -341.761 Td (0233 // fs.c) 52.4222 Tj 0 -351.254 Td (0234 int dirlink\(struct inode*, char*, uint\);) 249.005 Tj 0 -360.748 Td (0235 struct inode* dirlookup\(struct inode*, char*, uint*\);) 262.111 Tj 0 -370.241 Td (0236 struct inode* ialloc\(uint, short\);) 179.109 Tj 0 -379.734 Td (0237 struct inode* idup\(struct inode*\);) 179.109 Tj 0 -389.228 Td (0238 void iinit\(void\);) 144.161 Tj 0 -398.721 Td (0239 void ilock\(struct inode*\);) 183.478 Tj 0 -408.214 Td (0240 void iput\(struct inode*\);) 179.109 Tj 0 -417.708 Td (0241 void iunlock\(struct inode*\);) 192.215 Tj 0 -427.201 Td (0242 void iunlockput\(struct inode*\);) 205.32 Tj 0 -436.695 Td (0243 void iupdate\(struct inode*\);) 192.215 Tj 0 -446.188 Td (0244 int namecmp\(const char*, const char*\);) 240.268 Tj 0 -455.681 Td (0245 struct inode* namei\(char*\);) 148.529 Tj 0 -465.175 Td (0246 struct inode* nameiparent\(char*, char*\);) 205.32 Tj 0 -474.668 Td (0247 int readi\(struct inode*, char*, uint, uint\);) 266.479 Tj 0 -484.161 Td (0248 void stati\(struct inode*, struct stat*\);) 244.637 Tj 0 -493.655 Td (0249 int writei\(struct inode*, char*, uint, uint\)\ ;) 270.848 Tj 0 -522.135 Td (Sheet 02) 34.9481 Tj Q Q q 180 500 5760 3460 re W /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [10 0 0 10 0 0] cm [1 0 0 1 0 0] Tm 0 0 Td [0 -0.967854 1 0 564.72 392.864] Tm 0 0 Td /F9_0 8.70222 Tf (Aug 30 10:08 2007 xv6/defs.h Page 2) 161.635 Tj 0 -28.4801 Td (0250 // ide.c) 56.7907 Tj 0 -37.9735 Td (0251 void ide_init\(void\);) 157.267 Tj 0 -47.4668 Td (0252 void ide_intr\(void\);) 157.267 Tj 0 -56.9602 Td (0253 void ide_rw\(struct buf *\);) 183.478 Tj 0 -66.4535 Td (0254 ) 21.8426 Tj 0 -75.9469 Td (0255 // ioapic.c) 69.8962 Tj 0 -85.4403 Td (0256 void ioapic_enable\(int irq, int cpu\);) 231.531 Tj 0 -94.9336 Td (0257 extern uchar ioapic_id;) 135.424 Tj 0 -104.427 Td (0258 void ioapic_init\(void\);) 170.372 Tj 0 -113.92 Td (0259 ) 21.8426 Tj 0 -123.414 Td (0260 // kalloc.c) 69.8962 Tj 0 -132.907 Td (0261 char* kalloc\(int\);) 144.161 Tj 0 -142.4 Td (0262 void kfree\(char*, int\);) 170.372 Tj 0 -151.894 Td (0263 void kinit\(void\);) 144.161 Tj 0 -161.387 Td (0264 ) 21.8426 Tj 0 -170.88 Td (0265 // kbd.c) 56.7907 Tj 0 -180.374 Td (0266 void kbd_intr\(void\);) 157.267 Tj 0 -189.867 Td (0267 ) 21.8426 Tj 0 -199.361 Td (0268 // lapic.c) 65.5277 Tj 0 -208.854 Td (0269 int cpu\(void\);) 135.424 Tj 0 -218.347 Td (0270 extern volatile uint* lapic;) 157.267 Tj 0 -227.841 Td (0271 void lapic_disableintr\(void\);) 196.583 Tj 0 -237.334 Td (0272 void lapic_enableintr\(void\);) 192.215 Tj 0 -246.827 Td (0273 void lapic_eoi\(void\);) 161.635 Tj 0 -256.321 Td (0274 void lapic_init\(int\);) 161.635 Tj 0 -265.814 Td (0275 void lapic_startap\(uchar, uint\);) 209.689 Tj 0 -275.307 Td (0276 void lapic_timerinit\(void\);) 187.846 Tj 0 -284.801 Td (0277 void lapic_timerintr\(void\);) 187.846 Tj 0 -294.294 Td (0278 ) 21.8426 Tj 0 -303.788 Td (0279 // mp.c) 52.4222 Tj 0 -313.281 Td (0280 extern int ismp;) 113.581 Tj 0 -322.774 Td (0281 int mp_bcpu\(void\);) 152.898 Tj 0 -332.268 Td (0282 void mp_init\(void\);) 152.898 Tj 0 -341.761 Td (0283 void mp_startthem\(void\);) 174.741 Tj 0 -351.254 Td (0284 ) 21.8426 Tj 0 -360.748 Td (0285 // picirq.c) 69.8962 Tj 0 -370.241 Td (0286 void pic_enable\(int\);) 161.635 Tj 0 -379.734 Td (0287 void pic_init\(void\);) 157.267 Tj 0 -389.228 Td (0288 ) 21.8426 Tj 0 -398.721 Td (0289 // pipe.c) 61.1592 Tj 0 -408.214 Td (0290 int pipealloc\(struct file**, struct file**\);) 266.479 Tj 0 -417.708 Td (0291 void pipeclose\(struct pipe*, int\);) 218.426 Tj 0 -427.201 Td (0292 int piperead\(struct pipe*, char*, int\);) 244.637 Tj 0 -436.695 Td (0293 int pipewrite\(struct pipe*, char*, int\);) 249.005 Tj 0 -446.188 Td (0294 ) 21.8426 Tj 0 -455.681 Td (0295 // proc.c) 61.1592 Tj 0 -465.175 Td (0296 struct proc* copyproc\(struct proc*\);) 192.215 Tj 0 -474.668 Td (0297 void exit\(void\);) 139.792 Tj 0 -484.161 Td (0298 int growproc\(int\);) 152.898 Tj 0 -493.655 Td (0299 int kill\(int\);) 135.424 Tj 0 -522.135 Td (Sheet 02) 34.9481 Tj Q Q Q Q showpage %%PageTrailer pdfEndPage %%Page: 10 10 %%BeginPageSetup %%PageOrientation: Landscape pdfStartPage 180 rotate -612 -792 translate 0 0 612 792 re W %%EndPageSetup [] 0 d 1 i 0 j 0 J 10 M 1 w /DeviceGray {} cs [0] sc /DeviceGray {} CS [0] SC false op false OP 0 0 612 792 re W q q [0.1 0 0 0.1 0 0] cm q 180 3960 5760 3460 re W /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [10 0 0 10 0 0] cm [1 0 0 1 0 0] Tm 0 0 Td [0 -0.967854 1 0 564.72 738.864] Tm 0 0 Td /F9_0 8.70222 Tf (Aug 30 10:08 2007 xv6/defs.h Page 3) 161.635 Tj 0 -28.4801 Td (0300 void pinit\(void\);) 144.161 Tj 0 -37.9735 Td (0301 void procdump\(void\);) 157.267 Tj 0 -47.4668 Td (0302 void scheduler\(void\) __attribute__\(\(noretur\ n\)\);) 275.216 Tj 0 -56.9602 Td (0303 void setupsegs\(struct proc*\);) 196.583 Tj 0 -66.4535 Td (0304 void sleep\(void*, struct spinlock*\);) 227.163 Tj 0 -75.9469 Td (0305 void userinit\(void\);) 157.267 Tj 0 -85.4403 Td (0306 int wait\(void\);) 139.792 Tj 0 -94.9336 Td (0307 void wakeup\(void*\);) 152.898 Tj 0 -104.427 Td (0308 void yield\(void\);) 144.161 Tj 0 -113.92 Td (0309 ) 21.8426 Tj 0 -123.414 Td (0310 // swtch.S) 65.5277 Tj 0 -132.907 Td (0311 void swtch\(struct context*, struct context*\);) 266.479 Tj 0 -142.4 Td (0312 ) 21.8426 Tj 0 -151.894 Td (0313 // spinlock.c) 78.6333 Tj 0 -161.387 Td (0314 void acquire\(struct spinlock*\);) 205.32 Tj 0 -170.88 Td (0315 void getcallerpcs\(void*, uint*\);) 209.689 Tj 0 -180.374 Td (0316 int holding\(struct spinlock*\);) 205.32 Tj 0 -189.867 Td (0317 void initlock\(struct spinlock*, char*\);) 240.268 Tj 0 -199.361 Td (0318 void release\(struct spinlock*\);) 205.32 Tj 0 -208.854 Td (0319 ) 21.8426 Tj 0 -218.347 Td (0320 // string.c) 69.8962 Tj 0 -227.841 Td (0321 int memcmp\(const void*, const void*, uint\);) 262.111 Tj 0 -237.334 Td (0322 void* memmove\(void*, const void*, uint\);) 240.268 Tj 0 -246.827 Td (0323 void* memset\(void*, int, uint\);) 200.952 Tj 0 -256.321 Td (0324 char* safestrcpy\(char*, const char*, int\);) 249.005 Tj 0 -265.814 Td (0325 int strlen\(const char*\);) 179.109 Tj 0 -275.307 Td (0326 int strncmp\(const char*, const char*, uint\);) 266.479 Tj 0 -284.801 Td (0327 char* strncpy\(char*, const char*, int\);) 235.9 Tj 0 -294.294 Td (0328 ) 21.8426 Tj 0 -303.788 Td (0329 // syscall.c) 74.2647 Tj 0 -313.281 Td (0330 int argint\(int, int*\);) 170.372 Tj 0 -322.774 Td (0331 int argptr\(int, char**, int\);) 200.952 Tj 0 -332.268 Td (0332 int argstr\(int, char**\);) 179.109 Tj 0 -341.761 Td (0333 int fetchint\(struct proc*, uint, int*\);) 244.637 Tj 0 -351.254 Td (0334 int fetchstr\(struct proc*, uint, char**\);) 253.374 Tj 0 -360.748 Td (0335 void syscall\(void\);) 152.898 Tj 0 -370.241 Td (0336 ) 21.8426 Tj 0 -379.734 Td (0337 // timer.c) 65.5277 Tj 0 -389.228 Td (0338 void timer_init\(void\);) 166.004 Tj 0 -398.721 Td (0339 ) 21.8426 Tj 0 -408.214 Td (0340 // trap.c) 61.1592 Tj 0 -417.708 Td (0341 void idtinit\(void\);) 152.898 Tj 0 -427.201 Td (0342 extern int ticks;) 117.95 Tj 0 -436.695 Td (0343 void tvinit\(void\);) 148.529 Tj 0 -446.188 Td (0344 extern struct spinlock tickslock;) 166.004 Tj 0 -455.681 Td (0345 ) 21.8426 Tj 0 -465.175 Td (0346 // number of elements in fixed-size array) 200.952 Tj 0 -474.668 Td (0347 #define NELEM\(x\) \(sizeof\(x\)/sizeof\(\(x\)[0]\)\)) 209.689 Tj 0 -484.161 Td (0348 ) 21.8426 Tj 0 -493.655 Td (0349 ) 21.8426 Tj 0 -522.135 Td (Sheet 03) 34.9481 Tj Q Q q 180 500 5760 3460 re W /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [10 0 0 10 0 0] cm [1 0 0 1 0 0] Tm 0 0 Td [0 -0.967854 1 0 564.72 392.864] Tm 0 0 Td /F9_0 8.70222 Tf (Aug 30 10:08 2007 xv6/x86.h Page 1) 157.267 Tj 0 -28.4801 Td (0350 // Special assembly routines to access x86-specific) 244.637 Tj 0 -37.9735 Td (0351 // hardware instructions.) 131.055 Tj 0 -47.4668 Td (0352 ) 21.8426 Tj 0 -56.9602 Td (0353 static inline uchar) 104.844 Tj 0 -66.4535 Td (0354 inb\(ushort port\)) 91.7388 Tj 0 -75.9469 Td (0355 {) 26.2111 Tj 0 -85.4403 Td (0356 uchar data;) 78.6333 Tj 0 -94.9336 Td (0357 ) 21.8426 Tj 0 -104.427 Td (0358 asm volatile\("in %1,%0" : "=a" \(data\) : "d" \(port\)\)\ ;) 257.742 Tj 0 -113.92 Td (0359 return data;) 83.0018 Tj 0 -123.414 Td (0360 }) 26.2111 Tj 0 -132.907 Td (0361 ) 21.8426 Tj 0 -142.4 Td (0362 static inline void) 100.476 Tj 0 -151.894 Td (0363 insl\(int port, void *addr, int cnt\)) 174.741 Tj 0 -161.387 Td (0364 {) 26.2111 Tj 0 -170.88 Td (0365 asm volatile\("cld\\n\\trepne\\n\\tinsl" :) 209.689 Tj 0 -180.374 Td (0366 "=D" \(addr\), "=c" \(cnt\) :) 227.163 Tj 0 -189.867 Td (0367 "d" \(port\), "0" \(addr\), "1" \(cnt\)\ :) 262.111 Tj 0 -199.361 Td (0368 "memory", "cc"\);) 174.741 Tj 0 -208.854 Td (0369 }) 26.2111 Tj 0 -218.347 Td (0370 ) 21.8426 Tj 0 -227.841 Td (0371 static inline void) 100.476 Tj 0 -237.334 Td (0372 outb\(ushort port, uchar data\)) 148.529 Tj 0 -246.827 Td (0373 {) 26.2111 Tj 0 -256.321 Td (0374 asm volatile\("out %0,%1" : : "a" \(data\), "d" \(port\)\ \);) 262.111 Tj 0 -265.814 Td (0375 }) 26.2111 Tj 0 -275.307 Td (0376 ) 21.8426 Tj 0 -284.801 Td (0377 static inline void) 100.476 Tj 0 -294.294 Td (0378 outw\(ushort port, ushort data\)) 152.898 Tj 0 -303.788 Td (0379 {) 26.2111 Tj 0 -313.281 Td (0380 asm volatile\("out %0,%1" : : "a" \(data\), "d" \(port\)\ \);) 262.111 Tj 0 -322.774 Td (0381 }) 26.2111 Tj 0 -332.268 Td (0382 ) 21.8426 Tj 0 -341.761 Td (0383 static inline void) 100.476 Tj 0 -351.254 Td (0384 outsl\(int port, const void *addr, int cnt\)) 205.32 Tj 0 -360.748 Td (0385 {) 26.2111 Tj 0 -370.241 Td (0386 asm volatile\("cld\\n\\trepne\\n\\toutsl" :) 209.689 Tj 0 -379.734 Td (0387 "=S" \(addr\), "=c" \(cnt\) :) 227.163 Tj 0 -389.228 Td (0388 "d" \(port\), "0" \(addr\), "1" \(cnt\)\ :) 262.111 Tj 0 -398.721 Td (0389 "cc"\);) 131.055 Tj 0 -408.214 Td (0390 }) 26.2111 Tj 0 -417.708 Td (0391 ) 21.8426 Tj 0 -427.201 Td (0392 ) 21.8426 Tj 0 -436.695 Td (0393 ) 21.8426 Tj 0 -446.188 Td (0394 ) 21.8426 Tj 0 -455.681 Td (0395 ) 21.8426 Tj 0 -465.175 Td (0396 ) 21.8426 Tj 0 -474.668 Td (0397 ) 21.8426 Tj 0 -484.161 Td (0398 ) 21.8426 Tj 0 -493.655 Td (0399 ) 21.8426 Tj 0 -522.135 Td (Sheet 03) 34.9481 Tj Q Q Q Q showpage %%PageTrailer pdfEndPage %%Page: 11 11 %%BeginPageSetup %%PageOrientation: Landscape pdfStartPage 180 rotate -612 -792 translate 0 0 612 792 re W %%EndPageSetup [] 0 d 1 i 0 j 0 J 10 M 1 w /DeviceGray {} cs [0] sc /DeviceGray {} CS [0] SC false op false OP 0 0 612 792 re W q q [0.1 0 0 0.1 0 0] cm q 180 3960 5760 3460 re W /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [10 0 0 10 0 0] cm [1 0 0 1 0 0] Tm 0 0 Td [0 -0.967854 1 0 564.72 738.864] Tm 0 0 Td /F9_0 8.70222 Tf (Aug 30 10:08 2007 xv6/x86.h Page 2) 157.267 Tj 0 -28.4801 Td (0400 struct segdesc;) 87.3703 Tj 0 -37.9735 Td (0401 ) 21.8426 Tj 0 -47.4668 Td (0402 static inline void) 100.476 Tj 0 -56.9602 Td (0403 lgdt\(struct segdesc *p, int size\)) 166.004 Tj 0 -66.4535 Td (0404 {) 26.2111 Tj 0 -75.9469 Td (0405 volatile ushort pd[3];) 126.687 Tj 0 -85.4403 Td (0406 ) 21.8426 Tj 0 -94.9336 Td (0407 pd[0] = size-1;) 96.1073 Tj 0 -104.427 Td (0408 pd[1] = \(uint\)p;) 100.476 Tj 0 -113.92 Td (0409 pd[2] = \(uint\)p >> 16;) 126.687 Tj 0 -123.414 Td (0410 ) 21.8426 Tj 0 -132.907 Td (0411 asm volatile\("lgdt \(%0\)" : : "r" \(pd\)\);) 200.952 Tj 0 -142.4 Td (0412 }) 26.2111 Tj 0 -151.894 Td (0413 ) 21.8426 Tj 0 -161.387 Td (0414 struct gatedesc;) 91.7388 Tj 0 -170.88 Td (0415 ) 21.8426 Tj 0 -180.374 Td (0416 static inline void) 100.476 Tj 0 -189.867 Td (0417 lidt\(struct gatedesc *p, int size\)) 170.372 Tj 0 -199.361 Td (0418 {) 26.2111 Tj 0 -208.854 Td (0419 volatile ushort pd[3];) 126.687 Tj 0 -218.347 Td (0420 ) 21.8426 Tj 0 -227.841 Td (0421 pd[0] = size-1;) 96.1073 Tj 0 -237.334 Td (0422 pd[1] = \(uint\)p;) 100.476 Tj 0 -246.827 Td (0423 pd[2] = \(uint\)p >> 16;) 126.687 Tj 0 -256.321 Td (0424 ) 21.8426 Tj 0 -265.814 Td (0425 asm volatile\("lidt \(%0\)" : : "r" \(pd\)\);) 200.952 Tj 0 -275.307 Td (0426 }) 26.2111 Tj 0 -284.801 Td (0427 ) 21.8426 Tj 0 -294.294 Td (0428 static inline void) 100.476 Tj 0 -303.788 Td (0429 ltr\(ushort sel\)) 87.3703 Tj 0 -313.281 Td (0430 {) 26.2111 Tj 0 -322.774 Td (0431 asm volatile\("ltr %0" : : "r" \(sel\)\);) 192.215 Tj 0 -332.268 Td (0432 }) 26.2111 Tj 0 -341.761 Td (0433 ) 21.8426 Tj 0 -351.254 Td (0434 static inline uint) 100.476 Tj 0 -360.748 Td (0435 read_eflags\(void\)) 96.1073 Tj 0 -370.241 Td (0436 {) 26.2111 Tj 0 -379.734 Td (0437 uint eflags;) 83.0018 Tj 0 -389.228 Td (0438 asm volatile\("pushfl; popl %0" : "=r" \(eflags\)\);) 240.268 Tj 0 -398.721 Td (0439 return eflags;) 91.7388 Tj 0 -408.214 Td (0440 }) 26.2111 Tj 0 -417.708 Td (0441 ) 21.8426 Tj 0 -427.201 Td (0442 static inline void) 100.476 Tj 0 -436.695 Td (0443 write_eflags\(uint eflags\)) 131.055 Tj 0 -446.188 Td (0444 {) 26.2111 Tj 0 -455.681 Td (0445 asm volatile\("pushl %0; popfl" : : "r" \(eflags\)\);) 244.637 Tj 0 -465.175 Td (0446 }) 26.2111 Tj 0 -474.668 Td (0447 ) 21.8426 Tj 0 -484.161 Td (0448 ) 21.8426 Tj 0 -493.655 Td (0449 ) 21.8426 Tj 0 -522.135 Td (Sheet 04) 34.9481 Tj Q Q q 180 500 5760 3460 re W /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [10 0 0 10 0 0] cm [1 0 0 1 0 0] Tm 0 0 Td [0 -0.967854 1 0 564.72 392.864] Tm 0 0 Td /F9_0 8.70222 Tf (Aug 30 10:08 2007 xv6/x86.h Page 3) 157.267 Tj 0 -28.4801 Td (0450 static inline void) 100.476 Tj 0 -37.9735 Td (0451 cpuid\(uint info, uint *eaxp, uint *ebxp, uint *ecxp, uint\ *edxp\)) 301.427 Tj 0 -47.4668 Td (0452 {) 26.2111 Tj 0 -56.9602 Td (0453 uint eax, ebx, ecx, edx;) 135.424 Tj 0 -66.4535 Td (0454 ) 21.8426 Tj 0 -75.9469 Td (0455 asm volatile\("cpuid" :) 126.687 Tj 0 -85.4403 Td (0456 "=a" \(eax\), "=b" \(ebx\), "=c" \(ecx\), "\ =d" \(edx\) :) 297.059 Tj 0 -94.9336 Td (0457 "a" \(info\)\);) 139.792 Tj 0 -104.427 Td (0458 if\(eaxp\)) 65.5277 Tj 0 -113.92 Td (0459 *eaxp = eax;) 91.7388 Tj 0 -123.414 Td (0460 if\(ebxp\)) 65.5277 Tj 0 -132.907 Td (0461 *ebxp = ebx;) 91.7388 Tj 0 -142.4 Td (0462 if\(ecxp\)) 65.5277 Tj 0 -151.894 Td (0463 *ecxp = ecx;) 91.7388 Tj 0 -161.387 Td (0464 if\(edxp\)) 65.5277 Tj 0 -170.88 Td (0465 *edxp = edx;) 91.7388 Tj 0 -180.374 Td (0466 }) 26.2111 Tj 0 -189.867 Td (0467 ) 21.8426 Tj 0 -199.361 Td (0468 static inline uint) 100.476 Tj 0 -208.854 Td (0469 cmpxchg\(uint oldval, uint newval, volatile uint* lock_add\ r\)) 279.585 Tj 0 -218.347 Td (0470 {) 26.2111 Tj 0 -227.841 Td (0471 uint result;) 83.0018 Tj 0 -237.334 Td (0472 ) 21.8426 Tj 0 -246.827 Td (0473 // The + in "+m" denotes a read-modify-write operand.) 262.111 Tj 0 -256.321 Td (0474 asm volatile\("lock; cmpxchgl %2, %0" :) 196.583 Tj 0 -265.814 Td (0475 "+m" \(*lock_addr\), "=a" \(result\)\ :) 270.848 Tj 0 -275.307 Td (0476 "r"\(newval\), "1"\(oldval\) :) 235.9 Tj 0 -284.801 Td (0477 "cc"\);) 148.529 Tj 0 -294.294 Td (0478 return result;) 91.7388 Tj 0 -303.788 Td (0479 }) 26.2111 Tj 0 -313.281 Td (0480 ) 21.8426 Tj 0 -322.774 Td (0481 static inline void) 100.476 Tj 0 -332.268 Td (0482 cli\(void\)) 61.1592 Tj 0 -341.761 Td (0483 {) 26.2111 Tj 0 -351.254 Td (0484 asm volatile\("cli"\);) 117.95 Tj 0 -360.748 Td (0485 }) 26.2111 Tj 0 -370.241 Td (0486 ) 21.8426 Tj 0 -379.734 Td (0487 static inline void) 100.476 Tj 0 -389.228 Td (0488 sti\(void\)) 61.1592 Tj 0 -398.721 Td (0489 {) 26.2111 Tj 0 -408.214 Td (0490 asm volatile\("sti"\);) 117.95 Tj 0 -417.708 Td (0491 }) 26.2111 Tj 0 -427.201 Td (0492 ) 21.8426 Tj 0 -436.695 Td (0493 ) 21.8426 Tj 0 -446.188 Td (0494 ) 21.8426 Tj 0 -455.681 Td (0495 ) 21.8426 Tj 0 -465.175 Td (0496 ) 21.8426 Tj 0 -474.668 Td (0497 ) 21.8426 Tj 0 -484.161 Td (0498 ) 21.8426 Tj 0 -493.655 Td (0499 ) 21.8426 Tj 0 -522.135 Td (Sheet 04) 34.9481 Tj Q Q Q Q showpage %%PageTrailer pdfEndPage %%Page: 12 12 %%BeginPageSetup %%PageOrientation: Landscape pdfStartPage 180 rotate -612 -792 translate 0 0 612 792 re W %%EndPageSetup [] 0 d 1 i 0 j 0 J 10 M 1 w /DeviceGray {} cs [0] sc /DeviceGray {} CS [0] SC false op false OP 0 0 612 792 re W q q [0.1 0 0 0.1 0 0] cm q 180 3960 5760 3460 re W /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [10 0 0 10 0 0] cm [1 0 0 1 0 0] Tm 0 0 Td [0 -0.967854 1 0 564.72 738.864] Tm 0 0 Td /F9_0 8.70222 Tf (Aug 30 10:08 2007 xv6/x86.h Page 4) 157.267 Tj 0 -28.4801 Td (0500 // Layout of the trap frame on the stack upon entry to tra\ p.) 283.953 Tj 0 -37.9735 Td (0501 struct trapframe {) 100.476 Tj 0 -47.4668 Td (0502 // registers as pushed by pusha) 166.004 Tj 0 -56.9602 Td (0503 uint edi;) 69.8962 Tj 0 -66.4535 Td (0504 uint esi;) 69.8962 Tj 0 -75.9469 Td (0505 uint ebp;) 69.8962 Tj 0 -85.4403 Td (0506 uint oesp; // useless & ignored) 187.846 Tj 0 -94.9336 Td (0507 uint ebx;) 69.8962 Tj 0 -104.427 Td (0508 uint edx;) 69.8962 Tj 0 -113.92 Td (0509 uint ecx;) 69.8962 Tj 0 -123.414 Td (0510 uint eax;) 69.8962 Tj 0 -132.907 Td (0511 ) 21.8426 Tj 0 -142.4 Td (0512 // rest of trap frame) 122.318 Tj 0 -151.894 Td (0513 ushort es;) 74.2647 Tj 0 -161.387 Td (0514 ushort padding1;) 100.476 Tj 0 -170.88 Td (0515 ushort ds;) 74.2647 Tj 0 -180.374 Td (0516 ushort padding2;) 100.476 Tj 0 -189.867 Td (0517 uint trapno;) 83.0018 Tj 0 -199.361 Td (0518 ) 21.8426 Tj 0 -208.854 Td (0519 // below here defined by x86 hardware) 192.215 Tj 0 -218.347 Td (0520 uint err;) 69.8962 Tj 0 -227.841 Td (0521 uint eip;) 69.8962 Tj 0 -237.334 Td (0522 ushort cs;) 74.2647 Tj 0 -246.827 Td (0523 ushort padding3;) 100.476 Tj 0 -256.321 Td (0524 uint eflags;) 83.0018 Tj 0 -265.814 Td (0525 ) 21.8426 Tj 0 -275.307 Td (0526 // below here only when crossing rings, such as from use\ r to kernel) 323.27 Tj 0 -284.801 Td (0527 uint esp;) 69.8962 Tj 0 -294.294 Td (0528 ushort ss;) 74.2647 Tj 0 -303.788 Td (0529 ushort padding4;) 100.476 Tj 0 -313.281 Td (0530 };) 30.5796 Tj 0 -322.774 Td (0531 ) 21.8426 Tj 0 -332.268 Td (0532 ) 21.8426 Tj 0 -341.761 Td (0533 ) 21.8426 Tj 0 -351.254 Td (0534 ) 21.8426 Tj 0 -360.748 Td (0535 ) 21.8426 Tj 0 -370.241 Td (0536 ) 21.8426 Tj 0 -379.734 Td (0537 ) 21.8426 Tj 0 -389.228 Td (0538 ) 21.8426 Tj 0 -398.721 Td (0539 ) 21.8426 Tj 0 -408.214 Td (0540 ) 21.8426 Tj 0 -417.708 Td (0541 ) 21.8426 Tj 0 -427.201 Td (0542 ) 21.8426 Tj 0 -436.695 Td (0543 ) 21.8426 Tj 0 -446.188 Td (0544 ) 21.8426 Tj 0 -455.681 Td (0545 ) 21.8426 Tj 0 -465.175 Td (0546 ) 21.8426 Tj 0 -474.668 Td (0547 ) 21.8426 Tj 0 -484.161 Td (0548 ) 21.8426 Tj 0 -493.655 Td (0549 ) 21.8426 Tj 0 -522.135 Td (Sheet 05) 34.9481 Tj Q Q q 180 500 5760 3460 re W /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [10 0 0 10 0 0] cm [1 0 0 1 0 0] Tm 0 0 Td [0 -0.967854 1 0 564.72 392.864] Tm 0 0 Td /F9_0 8.70222 Tf (Aug 30 10:08 2007 xv6/asm.h Page 1) 157.267 Tj 0 -28.4801 Td (0550 //) 30.5796 Tj 0 -37.9735 Td (0551 // macros to create x86 segments from assembler) 227.163 Tj 0 -47.4668 Td (0552 //) 30.5796 Tj 0 -56.9602 Td (0553 ) 21.8426 Tj 0 -66.4535 Td (0554 #define SEG_NULLASM \ \\) 305.796 Tj 0 -75.9469 Td (0555 .word 0, 0; \ \\) 305.796 Tj 0 -85.4403 Td (0556 .byte 0, 0, 0, 0) 126.687 Tj 0 -94.9336 Td (0557 ) 21.8426 Tj 0 -104.427 Td (0558 #define SEG_ASM\(type,base,lim\) \ \\) 305.796 Tj 0 -113.92 Td (0559 .word \(\(\(lim\) >> 12\) & 0xffff\), \(\(base\) &\ 0xffff\); \\) 305.796 Tj 0 -123.414 Td (0560 .byte \(\(\(base\) >> 16\) & 0xff\), \(0x90 | \(ty\ pe\)\), \\) 305.796 Tj 0 -132.907 Td (0561 \(0xC0 | \(\(\(lim\) >> 28\) & 0xf\)\), \(\ \(\(base\) >> 24\) & 0xff\)) 332.007 Tj 0 -142.4 Td (0562 ) 21.8426 Tj 0 -151.894 Td (0563 #define STA_X 0x8 // Executable segment) 235.9 Tj 0 -161.387 Td (0564 #define STA_E 0x4 // Expand down \(non-executabl\ e segments\)) 318.902 Tj 0 -170.88 Td (0565 #define STA_C 0x4 // Conforming code segment \(e\ xecutable only\)) 336.376 Tj 0 -180.374 Td (0566 #define STA_W 0x2 // Writeable \(non-executable \ segments\)) 310.165 Tj 0 -189.867 Td (0567 #define STA_R 0x2 // Readable \(executable segme\ nts\)) 288.322 Tj 0 -199.361 Td (0568 #define STA_A 0x1 // Accessed) 192.215 Tj 0 -208.854 Td (0569 ) 21.8426 Tj 0 -218.347 Td (0570 ) 21.8426 Tj 0 -227.841 Td (0571 ) 21.8426 Tj 0 -237.334 Td (0572 ) 21.8426 Tj 0 -246.827 Td (0573 ) 21.8426 Tj 0 -256.321 Td (0574 ) 21.8426 Tj 0 -265.814 Td (0575 ) 21.8426 Tj 0 -275.307 Td (0576 ) 21.8426 Tj 0 -284.801 Td (0577 ) 21.8426 Tj 0 -294.294 Td (0578 ) 21.8426 Tj 0 -303.788 Td (0579 ) 21.8426 Tj 0 -313.281 Td (0580 ) 21.8426 Tj 0 -322.774 Td (0581 ) 21.8426 Tj 0 -332.268 Td (0582 ) 21.8426 Tj 0 -341.761 Td (0583 ) 21.8426 Tj 0 -351.254 Td (0584 ) 21.8426 Tj 0 -360.748 Td (0585 ) 21.8426 Tj 0 -370.241 Td (0586 ) 21.8426 Tj 0 -379.734 Td (0587 ) 21.8426 Tj 0 -389.228 Td (0588 ) 21.8426 Tj 0 -398.721 Td (0589 ) 21.8426 Tj 0 -408.214 Td (0590 ) 21.8426 Tj 0 -417.708 Td (0591 ) 21.8426 Tj 0 -427.201 Td (0592 ) 21.8426 Tj 0 -436.695 Td (0593 ) 21.8426 Tj 0 -446.188 Td (0594 ) 21.8426 Tj 0 -455.681 Td (0595 ) 21.8426 Tj 0 -465.175 Td (0596 ) 21.8426 Tj 0 -474.668 Td (0597 ) 21.8426 Tj 0 -484.161 Td (0598 ) 21.8426 Tj 0 -493.655 Td (0599 ) 21.8426 Tj 0 -522.135 Td (Sheet 05) 34.9481 Tj Q Q Q Q showpage %%PageTrailer pdfEndPage %%Page: 13 13 %%BeginPageSetup %%PageOrientation: Landscape pdfStartPage 180 rotate -612 -792 translate 0 0 612 792 re W %%EndPageSetup [] 0 d 1 i 0 j 0 J 10 M 1 w /DeviceGray {} cs [0] sc /DeviceGray {} CS [0] SC false op false OP 0 0 612 792 re W q q [0.1 0 0 0.1 0 0] cm q 180 3960 5760 3460 re W /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [10 0 0 10 0 0] cm [1 0 0 1 0 0] Tm 0 0 Td [0 -0.967854 1 0 564.72 738.864] Tm 0 0 Td /F9_0 8.70222 Tf (Aug 30 10:08 2007 xv6/mmu.h Page 1) 157.267 Tj 0 -28.4801 Td (0600 // This file contains definitions for the) 200.952 Tj 0 -37.9735 Td (0601 // x86 memory management unit \(MMU\).) 179.109 Tj 0 -47.4668 Td (0602 ) 21.8426 Tj 0 -56.9602 Td (0603 // Eflags register) 100.476 Tj 0 -66.4535 Td (0604 #define FL_CF 0x00000001 // Carry Flag) 253.374 Tj 0 -75.9469 Td (0605 #define FL_PF 0x00000004 // Parity Flag) 257.742 Tj 0 -85.4403 Td (0606 #define FL_AF 0x00000010 // Auxiliary carry\ Flag) 297.059 Tj 0 -94.9336 Td (0607 #define FL_ZF 0x00000040 // Zero Flag) 249.005 Tj 0 -104.427 Td (0608 #define FL_SF 0x00000080 // Sign Flag) 249.005 Tj 0 -113.92 Td (0609 #define FL_TF 0x00000100 // Trap Flag) 249.005 Tj 0 -123.414 Td (0610 #define FL_IF 0x00000200 // Interrupt Enabl\ e) 279.585 Tj 0 -132.907 Td (0611 #define FL_DF 0x00000400 // Direction Flag) 270.848 Tj 0 -142.4 Td (0612 #define FL_OF 0x00000800 // Overflow Flag) 266.479 Tj 0 -151.894 Td (0613 #define FL_IOPL_MASK 0x00003000 // I/O Privilege L\ evel bitmask) 327.639 Tj 0 -161.387 Td (0614 #define FL_IOPL_0 0x00000000 // IOPL == 0) 257.742 Tj 0 -170.88 Td (0615 #define FL_IOPL_1 0x00001000 // IOPL == 1) 257.742 Tj 0 -180.374 Td (0616 #define FL_IOPL_2 0x00002000 // IOPL == 2) 257.742 Tj 0 -189.867 Td (0617 #define FL_IOPL_3 0x00003000 // IOPL == 3) 257.742 Tj 0 -199.361 Td (0618 #define FL_NT 0x00004000 // Nested Task) 257.742 Tj 0 -208.854 Td (0619 #define FL_RF 0x00010000 // Resume Flag) 257.742 Tj 0 -218.347 Td (0620 #define FL_VM 0x00020000 // Virtual 8086 mo\ de) 283.953 Tj 0 -227.841 Td (0621 #define FL_AC 0x00040000 // Alignment Check) 275.216 Tj 0 -237.334 Td (0622 #define FL_VIF 0x00080000 // Virtual Interru\ pt Flag) 305.796 Tj 0 -246.827 Td (0623 #define FL_VIP 0x00100000 // Virtual Interru\ pt Pending) 318.902 Tj 0 -256.321 Td (0624 #define FL_ID 0x00200000 // ID flag) 240.268 Tj 0 -265.814 Td (0625 ) 21.8426 Tj 0 -275.307 Td (0626 // Segment Descriptor) 113.581 Tj 0 -284.801 Td (0627 struct segdesc {) 91.7388 Tj 0 -294.294 Td (0628 uint lim_15_0 : 16; // Low bits of segment limit) 244.637 Tj 0 -303.788 Td (0629 uint base_15_0 : 16; // Low bits of segment base address) 275.216 Tj 0 -313.281 Td (0630 uint base_23_16 : 8; // Middle bits of segment base addr\ ess) 288.322 Tj 0 -322.774 Td (0631 uint type : 4; // Segment type \(see STS_ constant\ s\)) 279.585 Tj 0 -332.268 Td (0632 uint s : 1; // 0 = system, 1 = application) 253.374 Tj 0 -341.761 Td (0633 uint dpl : 2; // Descriptor Privilege Level) 249.005 Tj 0 -351.254 Td (0634 uint p : 1; // Present) 166.004 Tj 0 -360.748 Td (0635 uint lim_19_16 : 4; // High bits of segment limit) 249.005 Tj 0 -370.241 Td (0636 uint avl : 1; // Unused \(available for software \ use\)) 288.322 Tj 0 -379.734 Td (0637 uint rsv1 : 1; // Reserved) 170.372 Tj 0 -389.228 Td (0638 uint db : 1; // 0 = 16-bit segment, 1 = 32-bit s\ egment) 301.427 Tj 0 -398.721 Td (0639 uint g : 1; // Granularity: limit scaled by 4K \ when set) 310.165 Tj 0 -408.214 Td (0640 uint base_31_24 : 8; // High bits of segment base addres\ s) 279.585 Tj 0 -417.708 Td (0641 };) 30.5796 Tj 0 -427.201 Td (0642 ) 21.8426 Tj 0 -436.695 Td (0643 ) 21.8426 Tj 0 -446.188 Td (0644 ) 21.8426 Tj 0 -455.681 Td (0645 ) 21.8426 Tj 0 -465.175 Td (0646 ) 21.8426 Tj 0 -474.668 Td (0647 ) 21.8426 Tj 0 -484.161 Td (0648 ) 21.8426 Tj 0 -493.655 Td (0649 ) 21.8426 Tj 0 -522.135 Td (Sheet 06) 34.9481 Tj Q Q q 180 500 5760 3460 re W /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [10 0 0 10 0 0] cm [1 0 0 1 0 0] Tm 0 0 Td [0 -0.967854 1 0 564.72 392.864] Tm 0 0 Td /F9_0 8.70222 Tf (Aug 30 10:08 2007 xv6/mmu.h Page 2) 157.267 Tj 0 -28.4801 Td (0650 // Null segment) 87.3703 Tj 0 -37.9735 Td (0651 #define SEG_NULL \(struct segdesc\){ 0,0,0,0,0,0,0,\ 0,0,0,0,0,0 }) 323.27 Tj 0 -47.4668 Td (0652 ) 21.8426 Tj 0 -56.9602 Td (0653 // Normal segment) 96.1073 Tj 0 -66.4535 Td (0654 #define SEG\(type, base, lim, dpl\) \(struct segdesc\) \ \\) 340.744 Tj 0 -75.9469 Td (0655 { \(\(lim\) >> 12\) & 0xffff, \(base\) & 0xffff, \(\(base\)\ >> 16\) & 0xff, \\) 340.744 Tj 0 -85.4403 Td (0656 type, 1, dpl, 1, \(uint\) \(lim\) >> 28, 0, 0, 1, 1, \ \\) 340.744 Tj 0 -94.9336 Td (0657 \(uint\) \(base\) >> 24 }) 131.055 Tj 0 -104.427 Td (0658 ) 21.8426 Tj 0 -113.92 Td (0659 #define SEG16\(type, base, lim, dpl\) \(struct segdesc\) \ \\) 340.744 Tj 0 -123.414 Td (0660 { \(lim\) & 0xffff, \(base\) & 0xffff, \(\(base\) >> 16\) \ & 0xff, \\) 340.744 Tj 0 -132.907 Td (0661 type, 1, dpl, 1, \(uint\) \(lim\) >> 16, 0, 0, 1, 0, \ \\) 340.744 Tj 0 -142.4 Td (0662 \(uint\) \(base\) >> 24 }) 131.055 Tj 0 -151.894 Td (0663 ) 21.8426 Tj 0 -161.387 Td (0664 #define DPL_USER 0x3 // User DPL) 192.215 Tj 0 -170.88 Td (0665 ) 21.8426 Tj 0 -180.374 Td (0666 // Application segment type bits) 161.635 Tj 0 -189.867 Td (0667 #define STA_X 0x8 // Executable segment) 235.9 Tj 0 -199.361 Td (0668 #define STA_E 0x4 // Expand down \(non-executabl\ e segments\)) 318.902 Tj 0 -208.854 Td (0669 #define STA_C 0x4 // Conforming code segment \(e\ xecutable only\)) 336.376 Tj 0 -218.347 Td (0670 #define STA_W 0x2 // Writeable \(non-executable \ segments\)) 310.165 Tj 0 -227.841 Td (0671 #define STA_R 0x2 // Readable \(executable segme\ nts\)) 288.322 Tj 0 -237.334 Td (0672 #define STA_A 0x1 // Accessed) 192.215 Tj 0 -246.827 Td (0673 ) 21.8426 Tj 0 -256.321 Td (0674 // System segment type bits) 139.792 Tj 0 -265.814 Td (0675 #define STS_T16A 0x1 // Available 16-bit TSS) 244.637 Tj 0 -275.307 Td (0676 #define STS_LDT 0x2 // Local Descriptor Table) 253.374 Tj 0 -284.801 Td (0677 #define STS_T16B 0x3 // Busy 16-bit TSS) 222.794 Tj 0 -294.294 Td (0678 #define STS_CG16 0x4 // 16-bit Call Gate) 227.163 Tj 0 -303.788 Td (0679 #define STS_TG 0x5 // Task Gate / Coum Transmitio\ ns) 283.953 Tj 0 -313.281 Td (0680 #define STS_IG16 0x6 // 16-bit Interrupt Gate) 249.005 Tj 0 -322.774 Td (0681 #define STS_TG16 0x7 // 16-bit Trap Gate) 227.163 Tj 0 -332.268 Td (0682 #define STS_T32A 0x9 // Available 32-bit TSS) 244.637 Tj 0 -341.761 Td (0683 #define STS_T32B 0xB // Busy 32-bit TSS) 222.794 Tj 0 -351.254 Td (0684 #define STS_CG32 0xC // 32-bit Call Gate) 227.163 Tj 0 -360.748 Td (0685 #define STS_IG32 0xE // 32-bit Interrupt Gate) 249.005 Tj 0 -370.241 Td (0686 #define STS_TG32 0xF // 32-bit Trap Gate) 227.163 Tj 0 -379.734 Td (0687 ) 21.8426 Tj 0 -389.228 Td (0688 ) 21.8426 Tj 0 -398.721 Td (0689 ) 21.8426 Tj 0 -408.214 Td (0690 ) 21.8426 Tj 0 -417.708 Td (0691 ) 21.8426 Tj 0 -427.201 Td (0692 ) 21.8426 Tj 0 -436.695 Td (0693 ) 21.8426 Tj 0 -446.188 Td (0694 ) 21.8426 Tj 0 -455.681 Td (0695 ) 21.8426 Tj 0 -465.175 Td (0696 ) 21.8426 Tj 0 -474.668 Td (0697 ) 21.8426 Tj 0 -484.161 Td (0698 ) 21.8426 Tj 0 -493.655 Td (0699 ) 21.8426 Tj 0 -522.135 Td (Sheet 06) 34.9481 Tj Q Q Q Q showpage %%PageTrailer pdfEndPage %%Page: 14 14 %%BeginPageSetup %%PageOrientation: Landscape pdfStartPage 180 rotate -612 -792 translate 0 0 612 792 re W %%EndPageSetup [] 0 d 1 i 0 j 0 J 10 M 1 w /DeviceGray {} cs [0] sc /DeviceGray {} CS [0] SC false op false OP 0 0 612 792 re W q q [0.1 0 0 0.1 0 0] cm q 180 3960 5760 3460 re W /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [10 0 0 10 0 0] cm [1 0 0 1 0 0] Tm 0 0 Td [0 -0.967854 1 0 564.72 738.864] Tm 0 0 Td /F9_0 8.70222 Tf (Aug 30 10:08 2007 xv6/mmu.h Page 3) 157.267 Tj 0 -28.4801 Td (0700 // Task state segment format) 144.161 Tj 0 -37.9735 Td (0701 struct taskstate {) 100.476 Tj 0 -47.4668 Td (0702 uint link; // Old ts selector) 192.215 Tj 0 -56.9602 Td (0703 uint esp0; // Stack pointers and segment selecto\ rs) 283.953 Tj 0 -66.4535 Td (0704 ushort ss0; // after an increase in privilege l\ evel) 292.69 Tj 0 -75.9469 Td (0705 ushort padding1;) 100.476 Tj 0 -85.4403 Td (0706 uint *esp1;) 78.6333 Tj 0 -94.9336 Td (0707 ushort ss1;) 78.6333 Tj 0 -104.427 Td (0708 ushort padding2;) 100.476 Tj 0 -113.92 Td (0709 uint *esp2;) 78.6333 Tj 0 -123.414 Td (0710 ushort ss2;) 78.6333 Tj 0 -132.907 Td (0711 ushort padding3;) 100.476 Tj 0 -142.4 Td (0712 void *cr3; // Page directory base) 209.689 Tj 0 -151.894 Td (0713 uint *eip; // Saved state from last task switch) 270.848 Tj 0 -161.387 Td (0714 uint eflags;) 83.0018 Tj 0 -170.88 Td (0715 uint eax; // More saved state \(registers\)) 249.005 Tj 0 -180.374 Td (0716 uint ecx;) 69.8962 Tj 0 -189.867 Td (0717 uint edx;) 69.8962 Tj 0 -199.361 Td (0718 uint ebx;) 69.8962 Tj 0 -208.854 Td (0719 uint *esp;) 74.2647 Tj 0 -218.347 Td (0720 uint *ebp;) 74.2647 Tj 0 -227.841 Td (0721 uint esi;) 69.8962 Tj 0 -237.334 Td (0722 uint edi;) 69.8962 Tj 0 -246.827 Td (0723 ushort es; // Even more saved state \(segment se\ lectors\)) 305.796 Tj 0 -256.321 Td (0724 ushort padding4;) 100.476 Tj 0 -265.814 Td (0725 ushort cs;) 74.2647 Tj 0 -275.307 Td (0726 ushort padding5;) 100.476 Tj 0 -284.801 Td (0727 ushort ss;) 74.2647 Tj 0 -294.294 Td (0728 ushort padding6;) 100.476 Tj 0 -303.788 Td (0729 ushort ds;) 74.2647 Tj 0 -313.281 Td (0730 ushort padding7;) 100.476 Tj 0 -322.774 Td (0731 ushort fs;) 74.2647 Tj 0 -332.268 Td (0732 ushort padding8;) 100.476 Tj 0 -341.761 Td (0733 ushort gs;) 74.2647 Tj 0 -351.254 Td (0734 ushort padding9;) 100.476 Tj 0 -360.748 Td (0735 ushort ldt;) 78.6333 Tj 0 -370.241 Td (0736 ushort padding10;) 104.844 Tj 0 -379.734 Td (0737 ushort t; // Trap on task switch) 209.689 Tj 0 -389.228 Td (0738 ushort iomb; // I/O map base address) 214.057 Tj 0 -398.721 Td (0739 };) 30.5796 Tj 0 -408.214 Td (0740 ) 21.8426 Tj 0 -417.708 Td (0741 ) 21.8426 Tj 0 -427.201 Td (0742 ) 21.8426 Tj 0 -436.695 Td (0743 ) 21.8426 Tj 0 -446.188 Td (0744 ) 21.8426 Tj 0 -455.681 Td (0745 ) 21.8426 Tj 0 -465.175 Td (0746 ) 21.8426 Tj 0 -474.668 Td (0747 ) 21.8426 Tj 0 -484.161 Td (0748 ) 21.8426 Tj 0 -493.655 Td (0749 ) 21.8426 Tj 0 -522.135 Td (Sheet 07) 34.9481 Tj Q Q q 180 500 5760 3460 re W /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [10 0 0 10 0 0] cm [1 0 0 1 0 0] Tm 0 0 Td [0 -0.967854 1 0 564.72 392.864] Tm 0 0 Td /F9_0 8.70222 Tf (Aug 30 10:08 2007 xv6/mmu.h Page 4) 157.267 Tj 0 -28.4801 Td (0750 // Gate descriptors for interrupts and traps) 214.057 Tj 0 -37.9735 Td (0751 struct gatedesc {) 96.1073 Tj 0 -47.4668 Td (0752 uint off_15_0 : 16; // low 16 bits of offset in segmen\ t) 279.585 Tj 0 -56.9602 Td (0753 uint ss : 16; // segment selector) 209.689 Tj 0 -66.4535 Td (0754 uint args : 5; // # args, 0 for interrupt/trap ga\ tes) 288.322 Tj 0 -75.9469 Td (0755 uint rsv1 : 3; // reserved\(should be zero I gues\ s\)) 279.585 Tj 0 -85.4403 Td (0756 uint type : 4; // type\(STS_{TG,IG32,TG32}\)) 244.637 Tj 0 -94.9336 Td (0757 uint s : 1; // must be 0 \(system\)) 218.426 Tj 0 -104.427 Td (0758 uint dpl : 2; // descriptor\(meaning new\) privi\ lege level) 310.165 Tj 0 -113.92 Td (0759 uint p : 1; // Present) 170.372 Tj 0 -123.414 Td (0760 uint off_31_16 : 16; // high bits of offset in segment) 270.848 Tj 0 -132.907 Td (0761 };) 30.5796 Tj 0 -142.4 Td (0762 ) 21.8426 Tj 0 -151.894 Td (0763 // Set up a normal interrupt/trap gate descriptor.) 240.268 Tj 0 -161.387 Td (0764 // - istrap: 1 for a trap \(= exception\) gate, 0 for an i\ nterrupt gate.) 327.639 Tj 0 -170.88 Td (0765 // interrupt gate clears FL_IF, trap gate leaves FL_IF a\ lone) 292.69 Tj 0 -180.374 Td (0766 // - sel: Code segment selector for interrupt/trap handler) 275.216 Tj 0 -189.867 Td (0767 // - off: Offset in code segment for interrupt/trap handle\ r) 279.585 Tj 0 -199.361 Td (0768 // - dpl: Descriptor Privilege Level -) 187.846 Tj 0 -208.854 Td (0769 // the privilege level required for software to inv\ oke) 288.322 Tj 0 -218.347 Td (0770 // this interrupt/trap gate explicitly using an int\ instruction.) 332.007 Tj 0 -227.841 Td (0771 #define SETGATE\(gate, istrap, sel, off, d\) \ \\) 279.585 Tj 0 -237.334 Td (0772 { \ \\) 279.585 Tj 0 -246.827 Td (0773 \(gate\).off_15_0 = \(uint\) \(off\) & 0xffff; \ \\) 279.585 Tj 0 -256.321 Td (0774 \(gate\).ss = \(sel\); \ \\) 279.585 Tj 0 -265.814 Td (0775 \(gate\).args = 0; \ \\) 279.585 Tj 0 -275.307 Td (0776 \(gate\).rsv1 = 0; \ \\) 279.585 Tj 0 -284.801 Td (0777 \(gate\).type = \(istrap\) ? STS_TG32 : STS_IG32; \ \\) 279.585 Tj 0 -294.294 Td (0778 \(gate\).s = 0; \ \\) 279.585 Tj 0 -303.788 Td (0779 \(gate\).dpl = \(d\); \ \\) 279.585 Tj 0 -313.281 Td (0780 \(gate\).p = 1; \ \\) 279.585 Tj 0 -322.774 Td (0781 \(gate\).off_31_16 = \(uint\) \(off\) >> 16; \ \\) 279.585 Tj 0 -332.268 Td (0782 }) 26.2111 Tj 0 -341.761 Td (0783 ) 21.8426 Tj 0 -351.254 Td (0784 ) 21.8426 Tj 0 -360.748 Td (0785 ) 21.8426 Tj 0 -370.241 Td (0786 ) 21.8426 Tj 0 -379.734 Td (0787 ) 21.8426 Tj 0 -389.228 Td (0788 ) 21.8426 Tj 0 -398.721 Td (0789 ) 21.8426 Tj 0 -408.214 Td (0790 ) 21.8426 Tj 0 -417.708 Td (0791 ) 21.8426 Tj 0 -427.201 Td (0792 ) 21.8426 Tj 0 -436.695 Td (0793 ) 21.8426 Tj 0 -446.188 Td (0794 ) 21.8426 Tj 0 -455.681 Td (0795 ) 21.8426 Tj 0 -465.175 Td (0796 ) 21.8426 Tj 0 -474.668 Td (0797 ) 21.8426 Tj 0 -484.161 Td (0798 ) 21.8426 Tj 0 -493.655 Td (0799 ) 21.8426 Tj 0 -522.135 Td (Sheet 07) 34.9481 Tj Q Q Q Q showpage %%PageTrailer pdfEndPage %%Page: 15 15 %%BeginPageSetup %%PageOrientation: Landscape pdfStartPage 180 rotate -612 -792 translate 0 0 612 792 re W %%EndPageSetup [] 0 d 1 i 0 j 0 J 10 M 1 w /DeviceGray {} cs [0] sc /DeviceGray {} CS [0] SC false op false OP 0 0 612 792 re W q q [0.1 0 0 0.1 0 0] cm q 180 3960 5760 3460 re W /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [10 0 0 10 0 0] cm [1 0 0 1 0 0] Tm 0 0 Td [0 -0.967854 1 0 564.72 738.864] Tm 0 0 Td /F9_0 8.70222 Tf (Aug 30 10:08 2007 xv6/elf.h Page 1) 157.267 Tj 0 -28.4801 Td (0800 // Format of an ELF executable file) 174.741 Tj 0 -37.9735 Td (0801 ) 21.8426 Tj 0 -47.4668 Td (0802 #define ELF_MAGIC 0x464C457FU // "\\x7FELF" in little end\ ian) 283.953 Tj 0 -56.9602 Td (0803 ) 21.8426 Tj 0 -66.4535 Td (0804 // File header) 83.0018 Tj 0 -75.9469 Td (0805 struct elfhdr {) 87.3703 Tj 0 -85.4403 Td (0806 uint magic; // must equal ELF_MAGIC) 187.846 Tj 0 -94.9336 Td (0807 uchar elf[12];) 91.7388 Tj 0 -104.427 Td (0808 ushort type;) 83.0018 Tj 0 -113.92 Td (0809 ushort machine;) 96.1073 Tj 0 -123.414 Td (0810 uint version;) 87.3703 Tj 0 -132.907 Td (0811 uint entry;) 78.6333 Tj 0 -142.4 Td (0812 uint phoff;) 78.6333 Tj 0 -151.894 Td (0813 uint shoff;) 78.6333 Tj 0 -161.387 Td (0814 uint flags;) 78.6333 Tj 0 -170.88 Td (0815 ushort ehsize;) 91.7388 Tj 0 -180.374 Td (0816 ushort phentsize;) 104.844 Tj 0 -189.867 Td (0817 ushort phnum;) 87.3703 Tj 0 -199.361 Td (0818 ushort shentsize;) 104.844 Tj 0 -208.854 Td (0819 ushort shnum;) 87.3703 Tj 0 -218.347 Td (0820 ushort shstrndx;) 100.476 Tj 0 -227.841 Td (0821 };) 30.5796 Tj 0 -237.334 Td (0822 ) 21.8426 Tj 0 -246.827 Td (0823 // Program section header) 131.055 Tj 0 -256.321 Td (0824 struct proghdr {) 91.7388 Tj 0 -265.814 Td (0825 uint type;) 74.2647 Tj 0 -275.307 Td (0826 uint offset;) 83.0018 Tj 0 -284.801 Td (0827 uint va;) 65.5277 Tj 0 -294.294 Td (0828 uint pa;) 65.5277 Tj 0 -303.788 Td (0829 uint filesz;) 83.0018 Tj 0 -313.281 Td (0830 uint memsz;) 78.6333 Tj 0 -322.774 Td (0831 uint flags;) 78.6333 Tj 0 -332.268 Td (0832 uint align;) 78.6333 Tj 0 -341.761 Td (0833 };) 30.5796 Tj 0 -351.254 Td (0834 ) 21.8426 Tj 0 -360.748 Td (0835 // Values for Proghdr type) 135.424 Tj 0 -370.241 Td (0836 #define ELF_PROG_LOAD 1) 166.004 Tj 0 -379.734 Td (0837 ) 21.8426 Tj 0 -389.228 Td (0838 // Flag bits for Proghdr flags) 152.898 Tj 0 -398.721 Td (0839 #define ELF_PROG_FLAG_EXEC 1) 166.004 Tj 0 -408.214 Td (0840 #define ELF_PROG_FLAG_WRITE 2) 166.004 Tj 0 -417.708 Td (0841 #define ELF_PROG_FLAG_READ 4) 166.004 Tj 0 -427.201 Td (0842 ) 21.8426 Tj 0 -436.695 Td (0843 ) 21.8426 Tj 0 -446.188 Td (0844 ) 21.8426 Tj 0 -455.681 Td (0845 ) 21.8426 Tj 0 -465.175 Td (0846 ) 21.8426 Tj 0 -474.668 Td (0847 ) 21.8426 Tj 0 -484.161 Td (0848 ) 21.8426 Tj 0 -493.655 Td (0849 ) 21.8426 Tj 0 -522.135 Td (Sheet 08) 34.9481 Tj Q Q q 180 500 5760 3460 re W /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [10 0 0 10 0 0] cm [1 0 0 1 0 0] Tm 0 0 Td [0 -0.967854 1 0 564.72 392.864] Tm 0 0 Td /F9_0 8.70222 Tf (Aug 30 10:08 2007 xv6/elf.h Page 2) 157.267 Tj 0 -28.4801 Td (0850 // Blank page.) 83.0018 Tj 0 -37.9735 Td (0851 ) 21.8426 Tj 0 -47.4668 Td (0852 ) 21.8426 Tj 0 -56.9602 Td (0853 ) 21.8426 Tj 0 -66.4535 Td (0854 ) 21.8426 Tj 0 -75.9469 Td (0855 ) 21.8426 Tj 0 -85.4403 Td (0856 ) 21.8426 Tj 0 -94.9336 Td (0857 ) 21.8426 Tj 0 -104.427 Td (0858 ) 21.8426 Tj 0 -113.92 Td (0859 ) 21.8426 Tj 0 -123.414 Td (0860 ) 21.8426 Tj 0 -132.907 Td (0861 ) 21.8426 Tj 0 -142.4 Td (0862 ) 21.8426 Tj 0 -151.894 Td (0863 ) 21.8426 Tj 0 -161.387 Td (0864 ) 21.8426 Tj 0 -170.88 Td (0865 ) 21.8426 Tj 0 -180.374 Td (0866 ) 21.8426 Tj 0 -189.867 Td (0867 ) 21.8426 Tj 0 -199.361 Td (0868 ) 21.8426 Tj 0 -208.854 Td (0869 ) 21.8426 Tj 0 -218.347 Td (0870 ) 21.8426 Tj 0 -227.841 Td (0871 ) 21.8426 Tj 0 -237.334 Td (0872 ) 21.8426 Tj 0 -246.827 Td (0873 ) 21.8426 Tj 0 -256.321 Td (0874 ) 21.8426 Tj 0 -265.814 Td (0875 ) 21.8426 Tj 0 -275.307 Td (0876 ) 21.8426 Tj 0 -284.801 Td (0877 ) 21.8426 Tj 0 -294.294 Td (0878 ) 21.8426 Tj 0 -303.788 Td (0879 ) 21.8426 Tj 0 -313.281 Td (0880 ) 21.8426 Tj 0 -322.774 Td (0881 ) 21.8426 Tj 0 -332.268 Td (0882 ) 21.8426 Tj 0 -341.761 Td (0883 ) 21.8426 Tj 0 -351.254 Td (0884 ) 21.8426 Tj 0 -360.748 Td (0885 ) 21.8426 Tj 0 -370.241 Td (0886 ) 21.8426 Tj 0 -379.734 Td (0887 ) 21.8426 Tj 0 -389.228 Td (0888 ) 21.8426 Tj 0 -398.721 Td (0889 ) 21.8426 Tj 0 -408.214 Td (0890 ) 21.8426 Tj 0 -417.708 Td (0891 ) 21.8426 Tj 0 -427.201 Td (0892 ) 21.8426 Tj 0 -436.695 Td (0893 ) 21.8426 Tj 0 -446.188 Td (0894 ) 21.8426 Tj 0 -455.681 Td (0895 ) 21.8426 Tj 0 -465.175 Td (0896 ) 21.8426 Tj 0 -474.668 Td (0897 ) 21.8426 Tj 0 -484.161 Td (0898 ) 21.8426 Tj 0 -493.655 Td (0899 ) 21.8426 Tj 0 -522.135 Td (Sheet 08) 34.9481 Tj Q Q Q Q showpage %%PageTrailer pdfEndPage %%Page: 16 16 %%BeginPageSetup %%PageOrientation: Landscape pdfStartPage 180 rotate -612 -792 translate 0 0 612 792 re W %%EndPageSetup [] 0 d 1 i 0 j 0 J 10 M 1 w /DeviceGray {} cs [0] sc /DeviceGray {} CS [0] SC false op false OP 0 0 612 792 re W q q [0.1 0 0 0.1 0 0] cm q 180 3960 5760 3460 re W /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [10 0 0 10 0 0] cm [1 0 0 1 0 0] Tm 0 0 Td [0 -0.967854 1 0 564.72 738.864] Tm 0 0 Td /F9_0 8.70222 Tf (Aug 30 10:08 2007 xv6/bootasm.S Page 1) 174.741 Tj 0 -28.4801 Td (0900 #include "asm.h") 91.7388 Tj 0 -37.9735 Td (0901 ) 21.8426 Tj 0 -47.4668 Td (0902 # Start the first CPU: switch to 32-bit protected mode, ju\ mp into C.) 318.902 Tj 0 -56.9602 Td (0903 # The BIOS loads this code from the first sector of the ha\ rd disk into) 327.639 Tj 0 -66.4535 Td (0904 # memory at physical address 0x7c00 and starts executing i\ n real mode) 323.27 Tj 0 -75.9469 Td (0905 # with %cs=0 %ip=7c00.) 117.95 Tj 0 -85.4403 Td (0906 ) 21.8426 Tj 0 -94.9336 Td (0907 .set PROT_MODE_CSEG, 0x8 # kernel code segment sel\ ector) 297.059 Tj 0 -104.427 Td (0908 .set PROT_MODE_DSEG, 0x10 # kernel data segment sel\ ector) 297.059 Tj 0 -113.92 Td (0909 .set CR0_PE_ON, 0x1 # protected mode enable f\ lag) 288.322 Tj 0 -123.414 Td (0910 ) 21.8426 Tj 0 -132.907 Td (0911 .globl start) 74.2647 Tj 0 -142.4 Td (0912 start:) 48.0537 Tj 0 -151.894 Td (0913 .code16 # Assemble for 16-bit mode) 266.479 Tj 0 -161.387 Td (0914 cli # Disable interrupts) 240.268 Tj 0 -170.88 Td (0915 cld # String operations incremen\ t) 279.585 Tj 0 -180.374 Td (0916 ) 21.8426 Tj 0 -189.867 Td (0917 # Set up the important data segment registers \(DS, ES, \ SS\).) 288.322 Tj 0 -199.361 Td (0918 xorw %ax,%ax # Segment number zero) 244.637 Tj 0 -208.854 Td (0919 movw %ax,%ds # -> Data Segment) 227.163 Tj 0 -218.347 Td (0920 movw %ax,%es # -> Extra Segment) 231.531 Tj 0 -227.841 Td (0921 movw %ax,%ss # -> Stack Segment) 231.531 Tj 0 -237.334 Td (0922 ) 21.8426 Tj 0 -246.827 Td (0923 # Enable A20:) 87.3703 Tj 0 -256.321 Td (0924 # For backwards compatibility with the earliest PCs, p\ hysical) 305.796 Tj 0 -265.814 Td (0925 # address line 20 is tied low, so that addresses highe\ r than) 301.427 Tj 0 -275.307 Td (0926 # 1MB wrap around to zero by default. This code undoe\ s this.) 305.796 Tj 0 -284.801 Td (0927 seta20.1:) 61.1592 Tj 0 -294.294 Td (0928 inb $0x64,%al # Wait for not busy) 253.374 Tj 0 -303.788 Td (0929 testb $0x2,%al) 100.476 Tj 0 -313.281 Td (0930 jnz seta20.1) 100.476 Tj 0 -322.774 Td (0931 ) 21.8426 Tj 0 -332.268 Td (0932 movb $0xd1,%al # 0xd1 -> port 0x64) 253.374 Tj 0 -341.761 Td (0933 outb %al,$0x64) 104.844 Tj 0 -351.254 Td (0934 ) 21.8426 Tj 0 -360.748 Td (0935 seta20.2:) 61.1592 Tj 0 -370.241 Td (0936 inb $0x64,%al # Wait for not busy) 253.374 Tj 0 -379.734 Td (0937 testb $0x2,%al) 100.476 Tj 0 -389.228 Td (0938 jnz seta20.2) 100.476 Tj 0 -398.721 Td (0939 ) 21.8426 Tj 0 -408.214 Td (0940 movb $0xdf,%al # 0xdf -> port 0x60) 253.374 Tj 0 -417.708 Td (0941 outb %al,$0x60) 104.844 Tj 0 -427.201 Td (0942 ) 21.8426 Tj 0 -436.695 Td (0943 ) 21.8426 Tj 0 -446.188 Td (0944 ) 21.8426 Tj 0 -455.681 Td (0945 ) 21.8426 Tj 0 -465.175 Td (0946 ) 21.8426 Tj 0 -474.668 Td (0947 ) 21.8426 Tj 0 -484.161 Td (0948 ) 21.8426 Tj 0 -493.655 Td (0949 ) 21.8426 Tj 0 -522.135 Td (Sheet 09) 34.9481 Tj Q Q q 180 500 5760 3460 re W /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [10 0 0 10 0 0] cm [1 0 0 1 0 0] Tm 0 0 Td [0 -0.967854 1 0 564.72 392.864] Tm 0 0 Td /F9_0 8.70222 Tf (Aug 30 10:08 2007 xv6/bootasm.S Page 2) 174.741 Tj 0 -28.4801 Td (0950 # Switch from real to protected mode, using a bootstrap \ GDT) 288.322 Tj 0 -37.9735 Td (0951 # and segment translation that makes virtual addresses) 266.479 Tj 0 -47.4668 Td (0952 # identical to their physical addresses, so that the) 257.742 Tj 0 -56.9602 Td (0953 # effective memory map does not change during the switch\ .) 279.585 Tj 0 -66.4535 Td (0954 lgdt gdtdesc) 96.1073 Tj 0 -75.9469 Td (0955 movl %cr0, %eax) 109.213 Tj 0 -85.4403 Td (0956 orl $CR0_PE_ON, %eax) 135.424 Tj 0 -94.9336 Td (0957 movl %eax, %cr0) 109.213 Tj 0 -104.427 Td (0958 ) 21.8426 Tj 0 -113.92 Td (0959 # Jump to next instruction, but in 32-bit code segment.) 270.848 Tj 0 -123.414 Td (0960 # Switches processor into 32-bit mode.) 196.583 Tj 0 -132.907 Td (0961 ljmp $PROT_MODE_CSEG, $protcseg) 179.109 Tj 0 -142.4 Td (0962 ) 21.8426 Tj 0 -151.894 Td (0963 .code32 # Assemble for 32-bit mode) 266.479 Tj 0 -161.387 Td (0964 protcseg:) 61.1592 Tj 0 -170.88 Td (0965 # Set up the protected-mode data segment registers) 249.005 Tj 0 -180.374 Td (0966 movw $PROT_MODE_DSEG, %ax # Our data segment selec\ tor) 288.322 Tj 0 -189.867 Td (0967 movw %ax, %ds # -> DS: Data Segment) 262.111 Tj 0 -199.361 Td (0968 movw %ax, %es # -> ES: Extra Segment) 266.479 Tj 0 -208.854 Td (0969 movw %ax, %fs # -> FS) 200.952 Tj 0 -218.347 Td (0970 movw %ax, %gs # -> GS) 200.952 Tj 0 -227.841 Td (0971 movw %ax, %ss # -> SS: Stack Segment) 266.479 Tj 0 -237.334 Td (0972 ) 21.8426 Tj 0 -246.827 Td (0973 # Set up the stack pointer and call into C.) 218.426 Tj 0 -256.321 Td (0974 movl $start, %esp) 117.95 Tj 0 -265.814 Td (0975 call bootmain) 100.476 Tj 0 -275.307 Td (0976 ) 21.8426 Tj 0 -284.801 Td (0977 # If bootmain returns \(it shouldn't\), loop.) 218.426 Tj 0 -294.294 Td (0978 spin:) 43.6851 Tj 0 -303.788 Td (0979 jmp spin) 83.0018 Tj 0 -313.281 Td (0980 ) 21.8426 Tj 0 -322.774 Td (0981 # Bootstrap GDT) 87.3703 Tj 0 -332.268 Td (0982 .p2align 2 # force 4 byte a\ lignment) 310.165 Tj 0 -341.761 Td (0983 gdt:) 39.3166 Tj 0 -351.254 Td (0984 SEG_NULLASM # null seg) 249.005 Tj 0 -360.748 Td (0985 SEG_ASM\(STA_X|STA_R, 0x0, 0xffffffff\) # code seg) 249.005 Tj 0 -370.241 Td (0986 SEG_ASM\(STA_W, 0x0, 0xffffffff\) # data seg) 249.005 Tj 0 -379.734 Td (0987 ) 21.8426 Tj 0 -389.228 Td (0988 gdtdesc:) 56.7907 Tj 0 -398.721 Td (0989 .word 0x17 # sizeof\(gdt\) \ - 1) 279.585 Tj 0 -408.214 Td (0990 .long gdt # address gdt) 262.111 Tj 0 -417.708 Td (0991 ) 21.8426 Tj 0 -427.201 Td (0992 ) 21.8426 Tj 0 -436.695 Td (0993 ) 21.8426 Tj 0 -446.188 Td (0994 ) 21.8426 Tj 0 -455.681 Td (0995 ) 21.8426 Tj 0 -465.175 Td (0996 ) 21.8426 Tj 0 -474.668 Td (0997 ) 21.8426 Tj 0 -484.161 Td (0998 ) 21.8426 Tj 0 -493.655 Td (0999 ) 21.8426 Tj 0 -522.135 Td (Sheet 09) 34.9481 Tj Q Q Q Q showpage %%PageTrailer pdfEndPage %%Page: 17 17 %%BeginPageSetup %%PageOrientation: Landscape pdfStartPage 180 rotate -612 -792 translate 0 0 612 792 re W %%EndPageSetup [] 0 d 1 i 0 j 0 J 10 M 1 w /DeviceGray {} cs [0] sc /DeviceGray {} CS [0] SC false op false OP 0 0 612 792 re W q q [0.1 0 0 0.1 0 0] cm q 180 3960 5760 3460 re W /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [10 0 0 10 0 0] cm [1 0 0 1 0 0] Tm 0 0 Td [0 -0.967854 1 0 564.72 738.864] Tm 0 0 Td /F9_0 8.70222 Tf (Aug 30 10:08 2007 xv6/bootother.S Page 1) 183.478 Tj 0 -28.4801 Td (1000 #include "asm.h") 91.7388 Tj 0 -37.9735 Td (1001 ) 21.8426 Tj 0 -47.4668 Td (1002 # Start an Application Processor. This must be placed on a\ 4KB boundary) 332.007 Tj 0 -56.9602 Td (1003 # somewhere in the 1st MB of conventional memory \(APBOOTS\ TRAP\). However,) 336.376 Tj 0 -66.4535 Td (1004 # due to some shortcuts below it's restricted further to w\ ithin the 1st) 332.007 Tj 0 -75.9469 Td (1005 # 64KB. The AP starts in real-mode, with) 196.583 Tj 0 -85.4403 Td (1006 # CS selector set to the startup memory address/16;) 253.374 Tj 0 -94.9336 Td (1007 # CS base set to startup memory address;) 205.32 Tj 0 -104.427 Td (1008 # CS limit set to 64KB;) 131.055 Tj 0 -113.92 Td (1009 # CPL and IP set to 0.) 126.687 Tj 0 -123.414 Td (1010 #) 26.2111 Tj 0 -132.907 Td (1011 # Bootothers \(in main.c\) starts each non-boot CPU in tur\ n.) 275.216 Tj 0 -142.4 Td (1012 # It puts the correct %esp in start-4,) 187.846 Tj 0 -151.894 Td (1013 # and the place to jump to in start-8.) 187.846 Tj 0 -161.387 Td (1014 #) 26.2111 Tj 0 -170.88 Td (1015 # This code is identical to bootasm.S except:) 218.426 Tj 0 -180.374 Td (1016 # - it does not need to enable A20) 179.109 Tj 0 -189.867 Td (1017 # - it uses the address at start-4 for the %esp) 235.9 Tj 0 -199.361 Td (1018 # - it jumps to the address at start-8 instead of callin\ g bootmain) 318.902 Tj 0 -208.854 Td (1019 ) 21.8426 Tj 0 -218.347 Td (1020 .set PROT_MODE_CSEG, 0x8 # kernel code segment sel\ ector) 297.059 Tj 0 -227.841 Td (1021 .set PROT_MODE_DSEG, 0x10 # kernel data segment sel\ ector) 297.059 Tj 0 -237.334 Td (1022 .set CR0_PE_ON, 0x1 # protected mode enable f\ lag) 288.322 Tj 0 -246.827 Td (1023 ) 21.8426 Tj 0 -256.321 Td (1024 .globl start) 74.2647 Tj 0 -265.814 Td (1025 start:) 48.0537 Tj 0 -275.307 Td (1026 .code16 # Assemble for 16-bit mode) 266.479 Tj 0 -284.801 Td (1027 cli # Disable interrupts) 240.268 Tj 0 -294.294 Td (1028 cld # String operations incremen\ t) 279.585 Tj 0 -303.788 Td (1029 ) 21.8426 Tj 0 -313.281 Td (1030 # Set up the important data segment registers \(DS, ES, \ SS\).) 288.322 Tj 0 -322.774 Td (1031 xorw %ax,%ax # Segment number zero) 244.637 Tj 0 -332.268 Td (1032 movw %ax,%ds # -> Data Segment) 227.163 Tj 0 -341.761 Td (1033 movw %ax,%es # -> Extra Segment) 231.531 Tj 0 -351.254 Td (1034 movw %ax,%ss # -> Stack Segment) 231.531 Tj 0 -360.748 Td (1035 ) 21.8426 Tj 0 -370.241 Td (1036 ) 21.8426 Tj 0 -379.734 Td (1037 ) 21.8426 Tj 0 -389.228 Td (1038 ) 21.8426 Tj 0 -398.721 Td (1039 ) 21.8426 Tj 0 -408.214 Td (1040 ) 21.8426 Tj 0 -417.708 Td (1041 ) 21.8426 Tj 0 -427.201 Td (1042 ) 21.8426 Tj 0 -436.695 Td (1043 ) 21.8426 Tj 0 -446.188 Td (1044 ) 21.8426 Tj 0 -455.681 Td (1045 ) 21.8426 Tj 0 -465.175 Td (1046 ) 21.8426 Tj 0 -474.668 Td (1047 ) 21.8426 Tj 0 -484.161 Td (1048 ) 21.8426 Tj 0 -493.655 Td (1049 ) 21.8426 Tj 0 -522.135 Td (Sheet 10) 34.9481 Tj Q Q q 180 500 5760 3460 re W /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [10 0 0 10 0 0] cm [1 0 0 1 0 0] Tm 0 0 Td [0 -0.967854 1 0 564.72 392.864] Tm 0 0 Td /F9_0 8.70222 Tf (Aug 30 10:08 2007 xv6/bootother.S Page 2) 183.478 Tj 0 -28.4801 Td (1050 # Switch from real to protected mode, using a bootstrap \ GDT) 288.322 Tj 0 -37.9735 Td (1051 # and segment translation that makes virtual addresses) 266.479 Tj 0 -47.4668 Td (1052 # identical to their physical addresses, so that the) 257.742 Tj 0 -56.9602 Td (1053 # effective memory map does not change during the switch\ .) 279.585 Tj 0 -66.4535 Td (1054 lgdt gdtdesc) 96.1073 Tj 0 -75.9469 Td (1055 movl %cr0, %eax) 109.213 Tj 0 -85.4403 Td (1056 orl $CR0_PE_ON, %eax) 135.424 Tj 0 -94.9336 Td (1057 movl %eax, %cr0) 109.213 Tj 0 -104.427 Td (1058 ) 21.8426 Tj 0 -113.92 Td (1059 # Jump to next instruction, but in 32-bit code segment.) 270.848 Tj 0 -123.414 Td (1060 # Switches processor into 32-bit mode.) 196.583 Tj 0 -132.907 Td (1061 ljmp $PROT_MODE_CSEG, $protcseg) 179.109 Tj 0 -142.4 Td (1062 ) 21.8426 Tj 0 -151.894 Td (1063 .code32 # Assemble for 32-bit mode) 266.479 Tj 0 -161.387 Td (1064 protcseg:) 61.1592 Tj 0 -170.88 Td (1065 # Set up the protected-mode data segment registers) 249.005 Tj 0 -180.374 Td (1066 movw $PROT_MODE_DSEG, %ax # Our data segment selec\ tor) 288.322 Tj 0 -189.867 Td (1067 movw %ax, %ds # -> DS: Data Segment) 262.111 Tj 0 -199.361 Td (1068 movw %ax, %es # -> ES: Extra Segment) 266.479 Tj 0 -208.854 Td (1069 movw %ax, %fs # -> FS) 200.952 Tj 0 -218.347 Td (1070 movw %ax, %gs # -> GS) 200.952 Tj 0 -227.841 Td (1071 movw %ax, %ss # -> SS: Stack Segment) 266.479 Tj 0 -237.334 Td (1072 ) 21.8426 Tj 0 -246.827 Td (1073 movl start-4, %esp) 122.318 Tj 0 -256.321 Td (1074 movl start-8, %eax) 122.318 Tj 0 -265.814 Td (1075 jmp *%eax) 87.3703 Tj 0 -275.307 Td (1076 ) 21.8426 Tj 0 -284.801 Td (1077 # Bootstrap GDT) 87.3703 Tj 0 -294.294 Td (1078 .p2align 2 # force 4 byte a\ lignment) 310.165 Tj 0 -303.788 Td (1079 gdt:) 39.3166 Tj 0 -313.281 Td (1080 SEG_NULLASM # null seg) 249.005 Tj 0 -322.774 Td (1081 SEG_ASM\(STA_X|STA_R, 0x0, 0xffffffff\) # code seg) 249.005 Tj 0 -332.268 Td (1082 SEG_ASM\(STA_W, 0x0, 0xffffffff\) # data seg) 249.005 Tj 0 -341.761 Td (1083 ) 21.8426 Tj 0 -351.254 Td (1084 gdtdesc:) 56.7907 Tj 0 -360.748 Td (1085 .word 0x17 # sizeof\(gdt\) \ - 1) 279.585 Tj 0 -370.241 Td (1086 .long gdt # address gdt) 262.111 Tj 0 -379.734 Td (1087 ) 21.8426 Tj 0 -389.228 Td (1088 ) 21.8426 Tj 0 -398.721 Td (1089 ) 21.8426 Tj 0 -408.214 Td (1090 ) 21.8426 Tj 0 -417.708 Td (1091 ) 21.8426 Tj 0 -427.201 Td (1092 ) 21.8426 Tj 0 -436.695 Td (1093 ) 21.8426 Tj 0 -446.188 Td (1094 ) 21.8426 Tj 0 -455.681 Td (1095 ) 21.8426 Tj 0 -465.175 Td (1096 ) 21.8426 Tj 0 -474.668 Td (1097 ) 21.8426 Tj 0 -484.161 Td (1098 ) 21.8426 Tj 0 -493.655 Td (1099 ) 21.8426 Tj 0 -522.135 Td (Sheet 10) 34.9481 Tj Q Q Q Q showpage %%PageTrailer pdfEndPage %%Page: 18 18 %%BeginPageSetup %%PageOrientation: Landscape pdfStartPage 180 rotate -612 -792 translate 0 0 612 792 re W %%EndPageSetup [] 0 d 1 i 0 j 0 J 10 M 1 w /DeviceGray {} cs [0] sc /DeviceGray {} CS [0] SC false op false OP 0 0 612 792 re W q q [0.1 0 0 0.1 0 0] cm q 180 3960 5760 3460 re W /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [10 0 0 10 0 0] cm [1 0 0 1 0 0] Tm 0 0 Td [0 -0.967854 1 0 564.72 738.864] Tm 0 0 Td /F9_0 8.70222 Tf (Aug 30 10:08 2007 xv6/bootmain.c Page 1) 179.109 Tj 0 -28.4801 Td (1100 // Boot loader.) 87.3703 Tj 0 -37.9735 Td (1101 //) 30.5796 Tj 0 -47.4668 Td (1102 // The BIOS loads boot sector \(bootasm.S\) from sector 0 \ of the disk) 314.533 Tj 0 -56.9602 Td (1103 // into memory and executes it. The boot sector puts the \ processor) 314.533 Tj 0 -66.4535 Td (1104 // in 32-bit mode and calls bootmain below, which loads an\ ELF kernel) 323.27 Tj 0 -75.9469 Td (1105 // image from the disk starting at sector 1 and then jumps\ to the) 305.796 Tj 0 -85.4403 Td (1106 // kernel entry routine.) 126.687 Tj 0 -94.9336 Td (1107 ) 21.8426 Tj 0 -104.427 Td (1108 #include "types.h") 100.476 Tj 0 -113.92 Td (1109 #include "elf.h") 91.7388 Tj 0 -123.414 Td (1110 #include "x86.h") 91.7388 Tj 0 -132.907 Td (1111 ) 21.8426 Tj 0 -142.4 Td (1112 #define SECTSIZE 512) 113.581 Tj 0 -151.894 Td (1113 ) 21.8426 Tj 0 -161.387 Td (1114 void readseg\(uint, uint, uint\);) 157.267 Tj 0 -170.88 Td (1115 ) 21.8426 Tj 0 -180.374 Td (1116 void) 39.3166 Tj 0 -189.867 Td (1117 bootmain\(void\)) 83.0018 Tj 0 -199.361 Td (1118 {) 26.2111 Tj 0 -208.854 Td (1119 struct elfhdr *elf;) 113.581 Tj 0 -218.347 Td (1120 struct proghdr *ph, *eph;) 139.792 Tj 0 -227.841 Td (1121 void \(*entry\)\(void\);) 117.95 Tj 0 -237.334 Td (1122 ) 21.8426 Tj 0 -246.827 Td (1123 elf = \(struct elfhdr*\)0x10000; // scratch space) 240.268 Tj 0 -256.321 Td (1124 ) 21.8426 Tj 0 -265.814 Td (1125 // Read 1st page off disk) 139.792 Tj 0 -275.307 Td (1126 readseg\(\(uint\)elf, SECTSIZE*8, 0\);) 179.109 Tj 0 -284.801 Td (1127 ) 21.8426 Tj 0 -294.294 Td (1128 // Is this an ELF executable?) 157.267 Tj 0 -303.788 Td (1129 if\(elf->magic != ELF_MAGIC\)) 148.529 Tj 0 -313.281 Td (1130 goto bad;) 78.6333 Tj 0 -322.774 Td (1131 ) 21.8426 Tj 0 -332.268 Td (1132 // Load each program segment \(ignores ph flags\).) 240.268 Tj 0 -341.761 Td (1133 ph = \(struct proghdr*\)\(\(uchar*\)elf + elf->phoff\);) 244.637 Tj 0 -351.254 Td (1134 eph = ph + elf->phnum;) 126.687 Tj 0 -360.748 Td (1135 for\(; ph < eph; ph++\)) 122.318 Tj 0 -370.241 Td (1136 readseg\(ph->va, ph->memsz, ph->offset\);) 209.689 Tj 0 -379.734 Td (1137 ) 21.8426 Tj 0 -389.228 Td (1138 // Call the entry point from the ELF header.) 222.794 Tj 0 -398.721 Td (1139 // Does not return!) 113.581 Tj 0 -408.214 Td (1140 entry = \(void\(*\)\(void\)\)\(elf->entry & 0xFFFFFF\);) 235.9 Tj 0 -417.708 Td (1141 entry\(\);) 65.5277 Tj 0 -427.201 Td (1142 ) 21.8426 Tj 0 -436.695 Td (1143 bad:) 39.3166 Tj 0 -446.188 Td (1144 outw\(0x8A00, 0x8A00\);) 122.318 Tj 0 -455.681 Td (1145 outw\(0x8A00, 0x8E00\);) 122.318 Tj 0 -465.175 Td (1146 for\(;;\)) 61.1592 Tj 0 -474.668 Td (1147 ;) 43.6851 Tj 0 -484.161 Td (1148 }) 26.2111 Tj 0 -493.655 Td (1149 ) 21.8426 Tj 0 -522.135 Td (Sheet 11) 34.9481 Tj Q Q q 180 500 5760 3460 re W /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [10 0 0 10 0 0] cm [1 0 0 1 0 0] Tm 0 0 Td [0 -0.967854 1 0 564.72 392.864] Tm 0 0 Td /F9_0 8.70222 Tf (Aug 30 10:08 2007 xv6/bootmain.c Page 2) 179.109 Tj 0 -28.4801 Td (1150 void) 39.3166 Tj 0 -37.9735 Td (1151 waitdisk\(void\)) 83.0018 Tj 0 -47.4668 Td (1152 {) 26.2111 Tj 0 -56.9602 Td (1153 // Wait for disk ready.) 131.055 Tj 0 -66.4535 Td (1154 while\(\(inb\(0x1F7\) & 0xC0\) != 0x40\)) 179.109 Tj 0 -75.9469 Td (1155 ;) 43.6851 Tj 0 -85.4403 Td (1156 }) 26.2111 Tj 0 -94.9336 Td (1157 ) 21.8426 Tj 0 -104.427 Td (1158 // Read a single sector at offset into dst.) 209.689 Tj 0 -113.92 Td (1159 void) 39.3166 Tj 0 -123.414 Td (1160 readsect\(void *dst, uint offset\)) 161.635 Tj 0 -132.907 Td (1161 {) 26.2111 Tj 0 -142.4 Td (1162 // Issue command.) 104.844 Tj 0 -151.894 Td (1163 waitdisk\(\);) 78.6333 Tj 0 -161.387 Td (1164 outb\(0x1F2, 1\); // count = 1) 161.635 Tj 0 -170.88 Td (1165 outb\(0x1F3, offset\);) 117.95 Tj 0 -180.374 Td (1166 outb\(0x1F4, offset >> 8\);) 139.792 Tj 0 -189.867 Td (1167 outb\(0x1F5, offset >> 16\);) 144.161 Tj 0 -199.361 Td (1168 outb\(0x1F6, \(offset >> 24\) | 0xE0\);) 183.478 Tj 0 -208.854 Td (1169 outb\(0x1F7, 0x20\); // cmd 0x20 - read sectors) 231.531 Tj 0 -218.347 Td (1170 ) 21.8426 Tj 0 -227.841 Td (1171 // Read data.) 87.3703 Tj 0 -237.334 Td (1172 waitdisk\(\);) 78.6333 Tj 0 -246.827 Td (1173 insl\(0x1F0, dst, SECTSIZE/4\);) 157.267 Tj 0 -256.321 Td (1174 }) 26.2111 Tj 0 -265.814 Td (1175 ) 21.8426 Tj 0 -275.307 Td (1176 // Read 'count' bytes at 'offset' from kernel into virtual\ address 'va'.) 336.376 Tj 0 -284.801 Td (1177 // Might copy more than asked.) 152.898 Tj 0 -294.294 Td (1178 void) 39.3166 Tj 0 -303.788 Td (1179 readseg\(uint va, uint count, uint offset\)) 200.952 Tj 0 -313.281 Td (1180 {) 26.2111 Tj 0 -322.774 Td (1181 uint eva;) 69.8962 Tj 0 -332.268 Td (1182 ) 21.8426 Tj 0 -341.761 Td (1183 va &= 0xFFFFFF;) 96.1073 Tj 0 -351.254 Td (1184 eva = va + count;) 104.844 Tj 0 -360.748 Td (1185 ) 21.8426 Tj 0 -370.241 Td (1186 // Round down to sector boundary.) 174.741 Tj 0 -379.734 Td (1187 va &= ~\(SECTSIZE - 1\);) 126.687 Tj 0 -389.228 Td (1188 ) 21.8426 Tj 0 -398.721 Td (1189 // Translate from bytes to sectors; kernel starts at sec\ tor 1.) 301.427 Tj 0 -408.214 Td (1190 offset = \(offset / SECTSIZE\) + 1;) 174.741 Tj 0 -417.708 Td (1191 ) 21.8426 Tj 0 -427.201 Td (1192 // If this is too slow, we could read lots of sectors at\ a time.) 310.165 Tj 0 -436.695 Td (1193 // We'd write more to memory than asked, but it doesn't \ matter --) 314.533 Tj 0 -446.188 Td (1194 // we load in increasing order.) 166.004 Tj 0 -455.681 Td (1195 for\(; va < eva; va += SECTSIZE, offset++\)) 209.689 Tj 0 -465.175 Td (1196 readsect\(\(uchar*\)va, offset\);) 166.004 Tj 0 -474.668 Td (1197 }) 26.2111 Tj 0 -484.161 Td (1198 ) 21.8426 Tj 0 -493.655 Td (1199 ) 21.8426 Tj 0 -522.135 Td (Sheet 11) 34.9481 Tj Q Q Q Q showpage %%PageTrailer pdfEndPage %%Page: 19 19 %%BeginPageSetup %%PageOrientation: Landscape pdfStartPage 180 rotate -612 -792 translate 0 0 612 792 re W %%EndPageSetup [] 0 d 1 i 0 j 0 J 10 M 1 w /DeviceGray {} cs [0] sc /DeviceGray {} CS [0] SC false op false OP 0 0 612 792 re W q q [0.1 0 0 0.1 0 0] cm q 180 3960 5760 3460 re W /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [10 0 0 10 0 0] cm [1 0 0 1 0 0] Tm 0 0 Td [0 -0.967854 1 0 564.72 738.864] Tm 0 0 Td /F9_0 8.70222 Tf (Aug 30 10:08 2007 xv6/main.c Page 1) 161.635 Tj 0 -28.4801 Td (1200 #include "types.h") 100.476 Tj 0 -37.9735 Td (1201 #include "defs.h") 96.1073 Tj 0 -47.4668 Td (1202 #include "param.h") 100.476 Tj 0 -56.9602 Td (1203 #include "mmu.h") 91.7388 Tj 0 -66.4535 Td (1204 #include "proc.h") 96.1073 Tj 0 -75.9469 Td (1205 #include "x86.h") 91.7388 Tj 0 -85.4403 Td (1206 ) 21.8426 Tj 0 -94.9336 Td (1207 static void bootothers\(void\);) 148.529 Tj 0 -104.427 Td (1208 ) 21.8426 Tj 0 -113.92 Td (1209 // Bootstrap processor starts running C code here.) 240.268 Tj 0 -123.414 Td (1210 int) 34.9481 Tj 0 -132.907 Td (1211 main\(void\)) 65.5277 Tj 0 -142.4 Td (1212 {) 26.2111 Tj 0 -151.894 Td (1213 int i;) 56.7907 Tj 0 -161.387 Td (1214 static volatile int bcpu; // cannot be on stack) 240.268 Tj 0 -170.88 Td (1215 extern char edata[], end[];) 148.529 Tj 0 -180.374 Td (1216 ) 21.8426 Tj 0 -189.867 Td (1217 // clear BSS) 83.0018 Tj 0 -199.361 Td (1218 memset\(edata, 0, end - edata\);) 161.635 Tj 0 -208.854 Td (1219 ) 21.8426 Tj 0 -218.347 Td (1220 // Prevent release\(\) from enabling interrupts.) 231.531 Tj 0 -227.841 Td (1221 for\(i=0; impstack + MPSTACK;) 218.426 Tj 0 -427.201 Td (1292 *\(void**\)\(code-8\) = mpmain;) 157.267 Tj 0 -436.695 Td (1293 lapic_startap\(c->apicid, \(uint\)code\);) 200.952 Tj 0 -446.188 Td (1294 ) 21.8426 Tj 0 -455.681 Td (1295 // Wait for cpu to get through bootstrap.) 218.426 Tj 0 -465.175 Td (1296 while\(c->booted == 0\)) 131.055 Tj 0 -474.668 Td (1297 ;) 52.4222 Tj 0 -484.161 Td (1298 }) 34.9481 Tj 0 -493.655 Td (1299 }) 26.2111 Tj 0 -522.135 Td (Sheet 12) 34.9481 Tj Q Q Q Q showpage %%PageTrailer pdfEndPage %%Page: 20 20 %%BeginPageSetup %%PageOrientation: Landscape pdfStartPage 180 rotate -612 -792 translate 0 0 612 792 re W %%EndPageSetup [] 0 d 1 i 0 j 0 J 10 M 1 w /DeviceGray {} cs [0] sc /DeviceGray {} CS [0] SC false op false OP 0 0 612 792 re W q q [0.1 0 0 0.1 0 0] cm q 180 3960 5760 3460 re W /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [10 0 0 10 0 0] cm [1 0 0 1 0 0] Tm 0 0 Td [0 -0.967854 1 0 564.72 738.864] Tm 0 0 Td /F9_0 8.70222 Tf (Aug 30 10:08 2007 xv6/spinlock.h Page 1) 179.109 Tj 0 -28.4801 Td (1300 // Mutual exclusion lock.) 131.055 Tj 0 -37.9735 Td (1301 struct spinlock {) 96.1073 Tj 0 -47.4668 Td (1302 uint locked; // Is the lock held?) 183.478 Tj 0 -56.9602 Td (1303 ) 21.8426 Tj 0 -66.4535 Td (1304 // For debugging:) 104.844 Tj 0 -75.9469 Td (1305 char *name; // Name of lock.) 166.004 Tj 0 -85.4403 Td (1306 int cpu; // The number of the cpu holding the lock\ .) 279.585 Tj 0 -94.9336 Td (1307 uint pcs[10]; // The call stack \(an array of program c\ ounters\)) 305.796 Tj 0 -104.427 Td (1308 // that locked the lock.) 200.952 Tj 0 -113.92 Td (1309 };) 30.5796 Tj 0 -123.414 Td (1310 ) 21.8426 Tj 0 -132.907 Td (1311 ) 21.8426 Tj 0 -142.4 Td (1312 ) 21.8426 Tj 0 -151.894 Td (1313 ) 21.8426 Tj 0 -161.387 Td (1314 ) 21.8426 Tj 0 -170.88 Td (1315 ) 21.8426 Tj 0 -180.374 Td (1316 ) 21.8426 Tj 0 -189.867 Td (1317 ) 21.8426 Tj 0 -199.361 Td (1318 ) 21.8426 Tj 0 -208.854 Td (1319 ) 21.8426 Tj 0 -218.347 Td (1320 ) 21.8426 Tj 0 -227.841 Td (1321 ) 21.8426 Tj 0 -237.334 Td (1322 ) 21.8426 Tj 0 -246.827 Td (1323 ) 21.8426 Tj 0 -256.321 Td (1324 ) 21.8426 Tj 0 -265.814 Td (1325 ) 21.8426 Tj 0 -275.307 Td (1326 ) 21.8426 Tj 0 -284.801 Td (1327 ) 21.8426 Tj 0 -294.294 Td (1328 ) 21.8426 Tj 0 -303.788 Td (1329 ) 21.8426 Tj 0 -313.281 Td (1330 ) 21.8426 Tj 0 -322.774 Td (1331 ) 21.8426 Tj 0 -332.268 Td (1332 ) 21.8426 Tj 0 -341.761 Td (1333 ) 21.8426 Tj 0 -351.254 Td (1334 ) 21.8426 Tj 0 -360.748 Td (1335 ) 21.8426 Tj 0 -370.241 Td (1336 ) 21.8426 Tj 0 -379.734 Td (1337 ) 21.8426 Tj 0 -389.228 Td (1338 ) 21.8426 Tj 0 -398.721 Td (1339 ) 21.8426 Tj 0 -408.214 Td (1340 ) 21.8426 Tj 0 -417.708 Td (1341 ) 21.8426 Tj 0 -427.201 Td (1342 ) 21.8426 Tj 0 -436.695 Td (1343 ) 21.8426 Tj 0 -446.188 Td (1344 ) 21.8426 Tj 0 -455.681 Td (1345 ) 21.8426 Tj 0 -465.175 Td (1346 ) 21.8426 Tj 0 -474.668 Td (1347 ) 21.8426 Tj 0 -484.161 Td (1348 ) 21.8426 Tj 0 -493.655 Td (1349 ) 21.8426 Tj 0 -522.135 Td (Sheet 13) 34.9481 Tj Q Q q 180 500 5760 3460 re W /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [10 0 0 10 0 0] cm [1 0 0 1 0 0] Tm 0 0 Td [0 -0.967854 1 0 564.72 392.864] Tm 0 0 Td /F9_0 8.70222 Tf (Aug 30 10:08 2007 xv6/spinlock.h Page 2) 179.109 Tj 0 -28.4801 Td (1350 // Blank page.) 83.0018 Tj 0 -37.9735 Td (1351 ) 21.8426 Tj 0 -47.4668 Td (1352 ) 21.8426 Tj 0 -56.9602 Td (1353 ) 21.8426 Tj 0 -66.4535 Td (1354 ) 21.8426 Tj 0 -75.9469 Td (1355 ) 21.8426 Tj 0 -85.4403 Td (1356 ) 21.8426 Tj 0 -94.9336 Td (1357 ) 21.8426 Tj 0 -104.427 Td (1358 ) 21.8426 Tj 0 -113.92 Td (1359 ) 21.8426 Tj 0 -123.414 Td (1360 ) 21.8426 Tj 0 -132.907 Td (1361 ) 21.8426 Tj 0 -142.4 Td (1362 ) 21.8426 Tj 0 -151.894 Td (1363 ) 21.8426 Tj 0 -161.387 Td (1364 ) 21.8426 Tj 0 -170.88 Td (1365 ) 21.8426 Tj 0 -180.374 Td (1366 ) 21.8426 Tj 0 -189.867 Td (1367 ) 21.8426 Tj 0 -199.361 Td (1368 ) 21.8426 Tj 0 -208.854 Td (1369 ) 21.8426 Tj 0 -218.347 Td (1370 ) 21.8426 Tj 0 -227.841 Td (1371 ) 21.8426 Tj 0 -237.334 Td (1372 ) 21.8426 Tj 0 -246.827 Td (1373 ) 21.8426 Tj 0 -256.321 Td (1374 ) 21.8426 Tj 0 -265.814 Td (1375 ) 21.8426 Tj 0 -275.307 Td (1376 ) 21.8426 Tj 0 -284.801 Td (1377 ) 21.8426 Tj 0 -294.294 Td (1378 ) 21.8426 Tj 0 -303.788 Td (1379 ) 21.8426 Tj 0 -313.281 Td (1380 ) 21.8426 Tj 0 -322.774 Td (1381 ) 21.8426 Tj 0 -332.268 Td (1382 ) 21.8426 Tj 0 -341.761 Td (1383 ) 21.8426 Tj 0 -351.254 Td (1384 ) 21.8426 Tj 0 -360.748 Td (1385 ) 21.8426 Tj 0 -370.241 Td (1386 ) 21.8426 Tj 0 -379.734 Td (1387 ) 21.8426 Tj 0 -389.228 Td (1388 ) 21.8426 Tj 0 -398.721 Td (1389 ) 21.8426 Tj 0 -408.214 Td (1390 ) 21.8426 Tj 0 -417.708 Td (1391 ) 21.8426 Tj 0 -427.201 Td (1392 ) 21.8426 Tj 0 -436.695 Td (1393 ) 21.8426 Tj 0 -446.188 Td (1394 ) 21.8426 Tj 0 -455.681 Td (1395 ) 21.8426 Tj 0 -465.175 Td (1396 ) 21.8426 Tj 0 -474.668 Td (1397 ) 21.8426 Tj 0 -484.161 Td (1398 ) 21.8426 Tj 0 -493.655 Td (1399 ) 21.8426 Tj 0 -522.135 Td (Sheet 13) 34.9481 Tj Q Q Q Q showpage %%PageTrailer pdfEndPage %%Page: 21 21 %%BeginPageSetup %%PageOrientation: Landscape pdfStartPage 180 rotate -612 -792 translate 0 0 612 792 re W %%EndPageSetup [] 0 d 1 i 0 j 0 J 10 M 1 w /DeviceGray {} cs [0] sc /DeviceGray {} CS [0] SC false op false OP 0 0 612 792 re W q q [0.1 0 0 0.1 0 0] cm q 180 3960 5760 3460 re W /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [10 0 0 10 0 0] cm [1 0 0 1 0 0] Tm 0 0 Td [0 -0.967854 1 0 564.72 738.864] Tm 0 0 Td /F9_0 8.70222 Tf (Aug 30 10:08 2007 xv6/spinlock.c Page 1) 179.109 Tj 0 -28.4801 Td (1400 // Mutual exclusion spin locks.) 157.267 Tj 0 -37.9735 Td (1401 ) 21.8426 Tj 0 -47.4668 Td (1402 #include "types.h") 100.476 Tj 0 -56.9602 Td (1403 #include "defs.h") 96.1073 Tj 0 -66.4535 Td (1404 #include "param.h") 100.476 Tj 0 -75.9469 Td (1405 #include "x86.h") 91.7388 Tj 0 -85.4403 Td (1406 #include "mmu.h") 91.7388 Tj 0 -94.9336 Td (1407 #include "proc.h") 96.1073 Tj 0 -104.427 Td (1408 #include "spinlock.h") 113.581 Tj 0 -113.92 Td (1409 ) 21.8426 Tj 0 -123.414 Td (1410 extern int use_console_lock;) 144.161 Tj 0 -132.907 Td (1411 ) 21.8426 Tj 0 -142.4 Td (1412 void) 39.3166 Tj 0 -151.894 Td (1413 initlock\(struct spinlock *lock, char *name\)) 209.689 Tj 0 -161.387 Td (1414 {) 26.2111 Tj 0 -170.88 Td (1415 lock->name = name;) 109.213 Tj 0 -180.374 Td (1416 lock->locked = 0;) 104.844 Tj 0 -189.867 Td (1417 lock->cpu = 0xffffffff;) 131.055 Tj 0 -199.361 Td (1418 }) 26.2111 Tj 0 -208.854 Td (1419 ) 21.8426 Tj 0 -218.347 Td (1420 // Acquire the lock.) 109.213 Tj 0 -227.841 Td (1421 // Loops \(spins\) until the lock is acquired.) 214.057 Tj 0 -237.334 Td (1422 // \(Because contention is handled by spinning,) 222.794 Tj 0 -246.827 Td (1423 // must not go to sleep holding any locks.\)) 209.689 Tj 0 -256.321 Td (1424 void) 39.3166 Tj 0 -265.814 Td (1425 acquire\(struct spinlock *lock\)) 152.898 Tj 0 -275.307 Td (1426 {) 26.2111 Tj 0 -284.801 Td (1427 if\(holding\(lock\)\)) 104.844 Tj 0 -294.294 Td (1428 panic\("acquire"\);) 113.581 Tj 0 -303.788 Td (1429 ) 21.8426 Tj 0 -313.281 Td (1430 if\(cpus[cpu\(\)].nlock == 0\)) 144.161 Tj 0 -322.774 Td (1431 cli\(\);) 65.5277 Tj 0 -332.268 Td (1432 cpus[cpu\(\)].nlock++;) 117.95 Tj 0 -341.761 Td (1433 ) 21.8426 Tj 0 -351.254 Td (1434 while\(cmpxchg\(0, 1, &lock->locked\) == 1\)) 205.32 Tj 0 -360.748 Td (1435 ;) 43.6851 Tj 0 -370.241 Td (1436 ) 21.8426 Tj 0 -379.734 Td (1437 // Serialize instructions: now that lock is acquired, ma\ ke sure) 305.796 Tj 0 -389.228 Td (1438 // we wait for all pending writes from other processors.) 275.216 Tj 0 -398.721 Td (1439 cpuid\(0, 0, 0, 0, 0\); // memory barrier \(see Ch 7, I\ A-32 manual vol 3\)) 340.744 Tj 0 -408.214 Td (1440 ) 21.8426 Tj 0 -417.708 Td (1441 // Record info about lock acquisition for debugging.) 257.742 Tj 0 -427.201 Td (1442 // The +10 is only so that we can tell the difference) 262.111 Tj 0 -436.695 Td (1443 // between forgetting to initialize lock->cpu) 227.163 Tj 0 -446.188 Td (1444 // and holding a lock on cpu 0.) 166.004 Tj 0 -455.681 Td (1445 lock->cpu = cpu\(\) + 10;) 131.055 Tj 0 -465.175 Td (1446 getcallerpcs\(&lock, lock->pcs\);) 166.004 Tj 0 -474.668 Td (1447 }) 26.2111 Tj 0 -484.161 Td (1448 ) 21.8426 Tj 0 -493.655 Td (1449 ) 21.8426 Tj 0 -522.135 Td (Sheet 14) 34.9481 Tj Q Q q 180 500 5760 3460 re W /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [10 0 0 10 0 0] cm [1 0 0 1 0 0] Tm 0 0 Td [0 -0.967854 1 0 564.72 392.864] Tm 0 0 Td /F9_0 8.70222 Tf (Aug 30 10:08 2007 xv6/spinlock.c Page 2) 179.109 Tj 0 -28.4801 Td (1450 // Release the lock.) 109.213 Tj 0 -37.9735 Td (1451 void) 39.3166 Tj 0 -47.4668 Td (1452 release\(struct spinlock *lock\)) 152.898 Tj 0 -56.9602 Td (1453 {) 26.2111 Tj 0 -66.4535 Td (1454 if\(!holding\(lock\)\)) 109.213 Tj 0 -75.9469 Td (1455 panic\("release"\);) 113.581 Tj 0 -85.4403 Td (1456 ) 21.8426 Tj 0 -94.9336 Td (1457 lock->pcs[0] = 0;) 104.844 Tj 0 -104.427 Td (1458 lock->cpu = 0xffffffff;) 131.055 Tj 0 -113.92 Td (1459 ) 21.8426 Tj 0 -123.414 Td (1460 // Serialize instructions: before unlocking the lock, ma\ ke sure) 305.796 Tj 0 -132.907 Td (1461 // to flush any pending memory writes from this processo\ r.) 283.953 Tj 0 -142.4 Td (1462 cpuid\(0, 0, 0, 0, 0\); // memory barrier \(see Ch 7, I\ A-32 manual vol 3\)) 340.744 Tj 0 -151.894 Td (1463 ) 21.8426 Tj 0 -161.387 Td (1464 lock->locked = 0;) 104.844 Tj 0 -170.88 Td (1465 if\(--cpus[cpu\(\)].nlock == 0\)) 152.898 Tj 0 -180.374 Td (1466 sti\(\);) 65.5277 Tj 0 -189.867 Td (1467 }) 26.2111 Tj 0 -199.361 Td (1468 ) 21.8426 Tj 0 -208.854 Td (1469 // Record the current call stack in pcs[] by following the\ %ebp chain.) 327.639 Tj 0 -218.347 Td (1470 void) 39.3166 Tj 0 -227.841 Td (1471 getcallerpcs\(void *v, uint pcs[]\)) 166.004 Tj 0 -237.334 Td (1472 {) 26.2111 Tj 0 -246.827 Td (1473 uint *ebp;) 74.2647 Tj 0 -256.321 Td (1474 int i;) 56.7907 Tj 0 -265.814 Td (1475 ) 21.8426 Tj 0 -275.307 Td (1476 ebp = \(uint*\)v - 2;) 113.581 Tj 0 -284.801 Td (1477 for\(i = 0; i < 10; i++\){) 135.424 Tj 0 -294.294 Td (1478 if\(ebp == 0 || ebp == \(uint*\)0xffffffff\)) 214.057 Tj 0 -303.788 Td (1479 break;) 74.2647 Tj 0 -313.281 Td (1480 pcs[i] = ebp[1]; // saved %eip) 187.846 Tj 0 -322.774 Td (1481 ebp = \(uint*\)ebp[0]; // saved %ebp) 187.846 Tj 0 -332.268 Td (1482 }) 34.9481 Tj 0 -341.761 Td (1483 for\(; i < 10; i++\)) 109.213 Tj 0 -351.254 Td (1484 pcs[i] = 0;) 87.3703 Tj 0 -360.748 Td (1485 }) 26.2111 Tj 0 -370.241 Td (1486 ) 21.8426 Tj 0 -379.734 Td (1487 // Check whether this cpu is holding the lock.) 222.794 Tj 0 -389.228 Td (1488 int) 34.9481 Tj 0 -398.721 Td (1489 holding\(struct spinlock *lock\)) 152.898 Tj 0 -408.214 Td (1490 {) 26.2111 Tj 0 -417.708 Td (1491 return lock->locked && lock->cpu == cpu\(\) + 10;) 235.9 Tj 0 -427.201 Td (1492 }) 26.2111 Tj 0 -436.695 Td (1493 ) 21.8426 Tj 0 -446.188 Td (1494 ) 21.8426 Tj 0 -455.681 Td (1495 ) 21.8426 Tj 0 -465.175 Td (1496 ) 21.8426 Tj 0 -474.668 Td (1497 ) 21.8426 Tj 0 -484.161 Td (1498 ) 21.8426 Tj 0 -493.655 Td (1499 ) 21.8426 Tj 0 -522.135 Td (Sheet 14) 34.9481 Tj Q Q Q Q showpage %%PageTrailer pdfEndPage %%Page: 22 22 %%BeginPageSetup %%PageOrientation: Landscape pdfStartPage 180 rotate -612 -792 translate 0 0 612 792 re W %%EndPageSetup [] 0 d 1 i 0 j 0 J 10 M 1 w /DeviceGray {} cs [0] sc /DeviceGray {} CS [0] SC false op false OP 0 0 612 792 re W q q [0.1 0 0 0.1 0 0] cm q 180 3960 5760 3460 re W /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [10 0 0 10 0 0] cm [1 0 0 1 0 0] Tm 0 0 Td [0 -0.967854 1 0 564.72 738.864] Tm 0 0 Td /F9_0 8.70222 Tf (Aug 30 10:08 2007 xv6/proc.h Page 1) 161.635 Tj 0 -28.4801 Td (1500 // Segments in proc->gdt) 126.687 Tj 0 -37.9735 Td (1501 #define SEG_KCODE 1 // kernel code) 174.741 Tj 0 -47.4668 Td (1502 #define SEG_KDATA 2 // kernel data+stack) 200.952 Tj 0 -56.9602 Td (1503 #define SEG_UCODE 3) 104.844 Tj 0 -66.4535 Td (1504 #define SEG_UDATA 4) 104.844 Tj 0 -75.9469 Td (1505 #define SEG_TSS 5 // this process's task state) 235.9 Tj 0 -85.4403 Td (1506 #define NSEGS 6) 104.844 Tj 0 -94.9336 Td (1507 ) 21.8426 Tj 0 -104.427 Td (1508 // Saved registers for kernel context switches.) 227.163 Tj 0 -113.92 Td (1509 // Don't need to save all the %fs etc. segment registers,) 270.848 Tj 0 -123.414 Td (1510 // because they are constant across kernel contexts.) 249.005 Tj 0 -132.907 Td (1511 // Save all the regular registers so we don't need to care) 275.216 Tj 0 -142.4 Td (1512 // which are caller save, but not the return register %eax\ .) 279.585 Tj 0 -151.894 Td (1513 // \(Not saving %eax just simplifies the switching code.\)) 266.479 Tj 0 -161.387 Td (1514 // The layout of context must match code in swtch.S.) 249.005 Tj 0 -170.88 Td (1515 struct context {) 91.7388 Tj 0 -180.374 Td (1516 int eip;) 65.5277 Tj 0 -189.867 Td (1517 int esp;) 65.5277 Tj 0 -199.361 Td (1518 int ebx;) 65.5277 Tj 0 -208.854 Td (1519 int ecx;) 65.5277 Tj 0 -218.347 Td (1520 int edx;) 65.5277 Tj 0 -227.841 Td (1521 int esi;) 65.5277 Tj 0 -237.334 Td (1522 int edi;) 65.5277 Tj 0 -246.827 Td (1523 int ebp;) 65.5277 Tj 0 -256.321 Td (1524 };) 30.5796 Tj 0 -265.814 Td (1525 ) 21.8426 Tj 0 -275.307 Td (1526 enum proc_state { UNUSED, EMBRYO, SLEEPING, RUNNABLE, RUNN\ ING, ZOMBIE };) 336.376 Tj 0 -284.801 Td (1527 ) 21.8426 Tj 0 -294.294 Td (1528 // Per-process state) 109.213 Tj 0 -303.788 Td (1529 struct proc {) 78.6333 Tj 0 -313.281 Td (1530 char *mem; // Start of process memory \(k\ ernel address\)) 332.007 Tj 0 -322.774 Td (1531 uint sz; // Size of process memory \(by\ tes\)) 288.322 Tj 0 -332.268 Td (1532 char *kstack; // Bottom of kernel stack for \ this process) 327.639 Tj 0 -341.761 Td (1533 enum proc_state state; // Process state) 214.057 Tj 0 -351.254 Td (1534 int pid; // Process ID) 200.952 Tj 0 -360.748 Td (1535 struct proc *parent; // Parent process) 218.426 Tj 0 -370.241 Td (1536 void *chan; // If non-zero, sleeping on ch\ an) 283.953 Tj 0 -379.734 Td (1537 int killed; // If non-zero, have been kill\ ed) 283.953 Tj 0 -389.228 Td (1538 struct file *ofile[NOFILE]; // Open files) 214.057 Tj 0 -398.721 Td (1539 struct inode *cwd; // Current directory) 231.531 Tj 0 -408.214 Td (1540 struct context context; // Switch here to run process) 270.848 Tj 0 -417.708 Td (1541 struct trapframe *tf; // Trap frame for current inte\ rrupt) 297.059 Tj 0 -427.201 Td (1542 char name[16]; // Process name \(debugging\)) 262.111 Tj 0 -436.695 Td (1543 };) 30.5796 Tj 0 -446.188 Td (1544 ) 21.8426 Tj 0 -455.681 Td (1545 ) 21.8426 Tj 0 -465.175 Td (1546 ) 21.8426 Tj 0 -474.668 Td (1547 ) 21.8426 Tj 0 -484.161 Td (1548 ) 21.8426 Tj 0 -493.655 Td (1549 ) 21.8426 Tj 0 -522.135 Td (Sheet 15) 34.9481 Tj Q Q q 180 500 5760 3460 re W /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [10 0 0 10 0 0] cm [1 0 0 1 0 0] Tm 0 0 Td [0 -0.967854 1 0 564.72 392.864] Tm 0 0 Td /F9_0 8.70222 Tf (Aug 30 10:08 2007 xv6/proc.h Page 2) 161.635 Tj 0 -28.4801 Td (1550 // Process memory is laid out contiguously, low addresses \ first:) 301.427 Tj 0 -37.9735 Td (1551 // text) 61.1592 Tj 0 -47.4668 Td (1552 // original data and bss) 135.424 Tj 0 -56.9602 Td (1553 // fixed-size stack) 113.581 Tj 0 -66.4535 Td (1554 // expandable heap) 109.213 Tj 0 -75.9469 Td (1555 ) 21.8426 Tj 0 -85.4403 Td (1556 // Arrange that cp point to the struct proc that this) 253.374 Tj 0 -94.9336 Td (1557 // CPU is currently running. Such preprocessor) 227.163 Tj 0 -104.427 Td (1558 // subterfuge can be confusing, but saves a lot of typing.) 275.216 Tj 0 -113.92 Td (1559 extern struct proc *curproc[NCPU]; // Current \(running\)\ process per CPU) 336.376 Tj 0 -123.414 Td (1560 #define cp \(curproc[cpu\(\)]\) // Current process on thi\ s CPU) 279.585 Tj 0 -132.907 Td (1561 ) 21.8426 Tj 0 -142.4 Td (1562 ) 21.8426 Tj 0 -151.894 Td (1563 #define MPSTACK 512) 104.844 Tj 0 -161.387 Td (1564 ) 21.8426 Tj 0 -170.88 Td (1565 // Per-CPU state) 91.7388 Tj 0 -180.374 Td (1566 struct cpu {) 74.2647 Tj 0 -189.867 Td (1567 uchar apicid; // Local APIC ID) 222.794 Tj 0 -199.361 Td (1568 struct context context; // Switch here to enter sche\ duler) 297.059 Tj 0 -208.854 Td (1569 struct taskstate ts; // Used by x86 to find stack\ for interrupt) 336.376 Tj 0 -218.347 Td (1570 struct segdesc gdt[NSEGS]; // x86 global descriptor tab\ le) 283.953 Tj 0 -227.841 Td (1571 char mpstack[MPSTACK]; // Per-CPU startup stack) 257.742 Tj 0 -237.334 Td (1572 volatile int booted; // Has the CPU started?) 253.374 Tj 0 -246.827 Td (1573 int nlock; // Number of locks currently\ held) 297.059 Tj 0 -256.321 Td (1574 };) 30.5796 Tj 0 -265.814 Td (1575 ) 21.8426 Tj 0 -275.307 Td (1576 extern struct cpu cpus[NCPU];) 148.529 Tj 0 -284.801 Td (1577 extern int ncpu;) 91.7388 Tj 0 -294.294 Td (1578 ) 21.8426 Tj 0 -303.788 Td (1579 ) 21.8426 Tj 0 -313.281 Td (1580 ) 21.8426 Tj 0 -322.774 Td (1581 ) 21.8426 Tj 0 -332.268 Td (1582 ) 21.8426 Tj 0 -341.761 Td (1583 ) 21.8426 Tj 0 -351.254 Td (1584 ) 21.8426 Tj 0 -360.748 Td (1585 ) 21.8426 Tj 0 -370.241 Td (1586 ) 21.8426 Tj 0 -379.734 Td (1587 ) 21.8426 Tj 0 -389.228 Td (1588 ) 21.8426 Tj 0 -398.721 Td (1589 ) 21.8426 Tj 0 -408.214 Td (1590 ) 21.8426 Tj 0 -417.708 Td (1591 ) 21.8426 Tj 0 -427.201 Td (1592 ) 21.8426 Tj 0 -436.695 Td (1593 ) 21.8426 Tj 0 -446.188 Td (1594 ) 21.8426 Tj 0 -455.681 Td (1595 ) 21.8426 Tj 0 -465.175 Td (1596 ) 21.8426 Tj 0 -474.668 Td (1597 ) 21.8426 Tj 0 -484.161 Td (1598 ) 21.8426 Tj 0 -493.655 Td (1599 ) 21.8426 Tj 0 -522.135 Td (Sheet 15) 34.9481 Tj Q Q Q Q showpage %%PageTrailer pdfEndPage %%Page: 23 23 %%BeginPageSetup %%PageOrientation: Landscape pdfStartPage 180 rotate -612 -792 translate 0 0 612 792 re W %%EndPageSetup [] 0 d 1 i 0 j 0 J 10 M 1 w /DeviceGray {} cs [0] sc /DeviceGray {} CS [0] SC false op false OP 0 0 612 792 re W q q [0.1 0 0 0.1 0 0] cm q 180 3960 5760 3460 re W /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [10 0 0 10 0 0] cm [1 0 0 1 0 0] Tm 0 0 Td [0 -0.967854 1 0 564.72 738.864] Tm 0 0 Td /F9_0 8.70222 Tf (Aug 30 10:08 2007 xv6/proc.c Page 1) 161.635 Tj 0 -28.4801 Td (1600 #include "types.h") 100.476 Tj 0 -37.9735 Td (1601 #include "defs.h") 96.1073 Tj 0 -47.4668 Td (1602 #include "param.h") 100.476 Tj 0 -56.9602 Td (1603 #include "mmu.h") 91.7388 Tj 0 -66.4535 Td (1604 #include "x86.h") 91.7388 Tj 0 -75.9469 Td (1605 #include "proc.h") 96.1073 Tj 0 -85.4403 Td (1606 #include "spinlock.h") 113.581 Tj 0 -94.9336 Td (1607 ) 21.8426 Tj 0 -104.427 Td (1608 struct spinlock proc_table_lock;) 161.635 Tj 0 -113.92 Td (1609 ) 21.8426 Tj 0 -123.414 Td (1610 struct proc proc[NPROC];) 126.687 Tj 0 -132.907 Td (1611 struct proc *curproc[NCPU];) 139.792 Tj 0 -142.4 Td (1612 static struct proc *initproc;) 148.529 Tj 0 -151.894 Td (1613 ) 21.8426 Tj 0 -161.387 Td (1614 int nextpid = 1;) 91.7388 Tj 0 -170.88 Td (1615 extern void forkret\(void\);) 135.424 Tj 0 -180.374 Td (1616 extern void forkret1\(struct trapframe*\);) 196.583 Tj 0 -189.867 Td (1617 ) 21.8426 Tj 0 -199.361 Td (1618 void) 39.3166 Tj 0 -208.854 Td (1619 pinit\(void\)) 69.8962 Tj 0 -218.347 Td (1620 {) 26.2111 Tj 0 -227.841 Td (1621 initlock\(&proc_table_lock, "proc_table"\);) 209.689 Tj 0 -237.334 Td (1622 }) 26.2111 Tj 0 -246.827 Td (1623 ) 21.8426 Tj 0 -256.321 Td (1624 // Look in the process table for an UNUSED proc.) 231.531 Tj 0 -265.814 Td (1625 // If found, change state to EMBRYO and return it.) 240.268 Tj 0 -275.307 Td (1626 // Otherwise return 0.) 117.95 Tj 0 -284.801 Td (1627 static struct proc*) 104.844 Tj 0 -294.294 Td (1628 allocproc\(void\)) 87.3703 Tj 0 -303.788 Td (1629 {) 26.2111 Tj 0 -313.281 Td (1630 int i;) 56.7907 Tj 0 -322.774 Td (1631 struct proc *p;) 96.1073 Tj 0 -332.268 Td (1632 ) 21.8426 Tj 0 -341.761 Td (1633 acquire\(&proc_table_lock\);) 144.161 Tj 0 -351.254 Td (1634 for\(i = 0; i < NPROC; i++\){) 148.529 Tj 0 -360.748 Td (1635 p = &proc[i];) 96.1073 Tj 0 -370.241 Td (1636 if\(p->state == UNUSED\){) 139.792 Tj 0 -379.734 Td (1637 p->state = EMBRYO;) 126.687 Tj 0 -389.228 Td (1638 p->pid = nextpid++;) 131.055 Tj 0 -398.721 Td (1639 release\(&proc_table_lock\);) 161.635 Tj 0 -408.214 Td (1640 return p;) 87.3703 Tj 0 -417.708 Td (1641 }) 43.6851 Tj 0 -427.201 Td (1642 }) 34.9481 Tj 0 -436.695 Td (1643 release\(&proc_table_lock\);) 144.161 Tj 0 -446.188 Td (1644 return 0;) 69.8962 Tj 0 -455.681 Td (1645 }) 26.2111 Tj 0 -465.175 Td (1646 ) 21.8426 Tj 0 -474.668 Td (1647 ) 21.8426 Tj 0 -484.161 Td (1648 ) 21.8426 Tj 0 -493.655 Td (1649 ) 21.8426 Tj 0 -522.135 Td (Sheet 16) 34.9481 Tj Q Q q 180 500 5760 3460 re W /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [10 0 0 10 0 0] cm [1 0 0 1 0 0] Tm 0 0 Td [0 -0.967854 1 0 564.72 392.864] Tm 0 0 Td /F9_0 8.70222 Tf (Aug 30 10:08 2007 xv6/proc.c Page 2) 161.635 Tj 0 -28.4801 Td (1650 // Grow current process's memory by n bytes.) 214.057 Tj 0 -37.9735 Td (1651 // Return old size on success, -1 on failure.) 218.426 Tj 0 -47.4668 Td (1652 int) 34.9481 Tj 0 -56.9602 Td (1653 growproc\(int n\)) 87.3703 Tj 0 -66.4535 Td (1654 {) 26.2111 Tj 0 -75.9469 Td (1655 char *newmem, *oldmem;) 126.687 Tj 0 -85.4403 Td (1656 ) 21.8426 Tj 0 -94.9336 Td (1657 newmem = kalloc\(cp->sz + n\);) 152.898 Tj 0 -104.427 Td (1658 if\(newmem == 0\)) 96.1073 Tj 0 -113.92 Td (1659 return -1;) 83.0018 Tj 0 -123.414 Td (1660 memmove\(newmem, cp->mem, cp->sz\);) 174.741 Tj 0 -132.907 Td (1661 memset\(newmem + cp->sz, 0, n\);) 161.635 Tj 0 -142.4 Td (1662 oldmem = cp->mem;) 104.844 Tj 0 -151.894 Td (1663 cp->mem = newmem;) 104.844 Tj 0 -161.387 Td (1664 kfree\(oldmem, cp->sz\);) 126.687 Tj 0 -170.88 Td (1665 cp->sz += n;) 83.0018 Tj 0 -180.374 Td (1666 return cp->sz - n;) 109.213 Tj 0 -189.867 Td (1667 }) 26.2111 Tj 0 -199.361 Td (1668 ) 21.8426 Tj 0 -208.854 Td (1669 // Set up CPU's segment descriptors and task state for a g\ iven process.) 332.007 Tj 0 -218.347 Td (1670 // If p==0, set up for "idle" state for when scheduler\(\)\ is running.) 318.902 Tj 0 -227.841 Td (1671 void) 39.3166 Tj 0 -237.334 Td (1672 setupsegs\(struct proc *p\)) 131.055 Tj 0 -246.827 Td (1673 {) 26.2111 Tj 0 -256.321 Td (1674 struct cpu *c;) 91.7388 Tj 0 -265.814 Td (1675 ) 21.8426 Tj 0 -275.307 Td (1676 c = &cpus[cpu\(\)];) 104.844 Tj 0 -284.801 Td (1677 c->ts.ss0 = SEG_KDATA << 3;) 148.529 Tj 0 -294.294 Td (1678 if\(p\)) 52.4222 Tj 0 -303.788 Td (1679 c->ts.esp0 = \(uint\)\(p->kstack + KSTACKSIZE\);) 231.531 Tj 0 -313.281 Td (1680 else) 48.0537 Tj 0 -322.774 Td (1681 c->ts.esp0 = 0xffffffff;) 144.161 Tj 0 -332.268 Td (1682 ) 21.8426 Tj 0 -341.761 Td (1683 c->gdt[0] = SEG_NULL;) 122.318 Tj 0 -351.254 Td (1684 c->gdt[SEG_KCODE] = SEG\(STA_X|STA_R, 0, 0x100000 + 64*1\ 024-1, 0\);) 314.533 Tj 0 -360.748 Td (1685 c->gdt[SEG_KDATA] = SEG\(STA_W, 0, 0xffffffff, 0\);) 244.637 Tj 0 -370.241 Td (1686 c->gdt[SEG_TSS] = SEG16\(STS_T32A, \(uint\)&c->ts, sizeo\ f\(c->ts\)-1, 0\);) 327.639 Tj 0 -379.734 Td (1687 c->gdt[SEG_TSS].s = 0;) 126.687 Tj 0 -389.228 Td (1688 if\(p\){) 56.7907 Tj 0 -398.721 Td (1689 c->gdt[SEG_UCODE] = SEG\(STA_X|STA_R, \(uint\)p->mem, \ p->sz-1, DPL_USER\);) 345.113 Tj 0 -408.214 Td (1690 c->gdt[SEG_UDATA] = SEG\(STA_W, \(uint\)p->mem, p->sz-\ 1, DPL_USER\);) 318.902 Tj 0 -417.708 Td (1691 } else {) 65.5277 Tj 0 -427.201 Td (1692 c->gdt[SEG_UCODE] = SEG_NULL;) 166.004 Tj 0 -436.695 Td (1693 c->gdt[SEG_UDATA] = SEG_NULL;) 166.004 Tj 0 -446.188 Td (1694 }) 34.9481 Tj 0 -455.681 Td (1695 ) 21.8426 Tj 0 -465.175 Td (1696 lgdt\(c->gdt, sizeof\(c->gdt\)\);) 157.267 Tj 0 -474.668 Td (1697 ltr\(SEG_TSS << 3\);) 109.213 Tj 0 -484.161 Td (1698 }) 26.2111 Tj 0 -493.655 Td (1699 ) 21.8426 Tj 0 -522.135 Td (Sheet 16) 34.9481 Tj Q Q Q Q showpage %%PageTrailer pdfEndPage %%Page: 24 24 %%BeginPageSetup %%PageOrientation: Landscape pdfStartPage 180 rotate -612 -792 translate 0 0 612 792 re W %%EndPageSetup [] 0 d 1 i 0 j 0 J 10 M 1 w /DeviceGray {} cs [0] sc /DeviceGray {} CS [0] SC false op false OP 0 0 612 792 re W q q [0.1 0 0 0.1 0 0] cm q 180 3960 5760 3460 re W /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [10 0 0 10 0 0] cm [1 0 0 1 0 0] Tm 0 0 Td [0 -0.967854 1 0 564.72 738.864] Tm 0 0 Td /F9_0 8.70222 Tf (Aug 30 10:08 2007 xv6/proc.c Page 3) 161.635 Tj 0 -28.4801 Td (1700 // Create a new process copying p as the parent.) 231.531 Tj 0 -37.9735 Td (1701 // Sets up stack to return as if from system call.) 240.268 Tj 0 -47.4668 Td (1702 // Caller must set state of returned proc to RUNNABLE.) 257.742 Tj 0 -56.9602 Td (1703 struct proc*) 74.2647 Tj 0 -66.4535 Td (1704 copyproc\(struct proc *p\)) 126.687 Tj 0 -75.9469 Td (1705 {) 26.2111 Tj 0 -85.4403 Td (1706 int i;) 56.7907 Tj 0 -94.9336 Td (1707 struct proc *np;) 100.476 Tj 0 -104.427 Td (1708 ) 21.8426 Tj 0 -113.92 Td (1709 // Allocate process.) 117.95 Tj 0 -123.414 Td (1710 if\(\(np = allocproc\(\)\) == 0\)) 148.529 Tj 0 -132.907 Td (1711 return 0;) 78.6333 Tj 0 -142.4 Td (1712 ) 21.8426 Tj 0 -151.894 Td (1713 // Allocate kernel stack.) 139.792 Tj 0 -161.387 Td (1714 if\(\(np->kstack = kalloc\(KSTACKSIZE\)\) == 0\){) 218.426 Tj 0 -170.88 Td (1715 np->state = UNUSED;) 122.318 Tj 0 -180.374 Td (1716 return 0;) 78.6333 Tj 0 -189.867 Td (1717 }) 34.9481 Tj 0 -199.361 Td (1718 np->tf = \(struct trapframe*\)\(np->kstack + KSTACKSIZE\)\ - 1;) 283.953 Tj 0 -208.854 Td (1719 ) 21.8426 Tj 0 -218.347 Td (1720 if\(p\){ // Copy process state from p.) 192.215 Tj 0 -227.841 Td (1721 np->parent = p;) 104.844 Tj 0 -237.334 Td (1722 memmove\(np->tf, p->tf, sizeof\(*np->tf\)\);) 214.057 Tj 0 -246.827 Td (1723 ) 21.8426 Tj 0 -256.321 Td (1724 np->sz = p->sz;) 104.844 Tj 0 -265.814 Td (1725 if\(\(np->mem = kalloc\(np->sz\)\) == 0\){) 196.583 Tj 0 -275.307 Td (1726 kfree\(np->kstack, KSTACKSIZE\);) 179.109 Tj 0 -284.801 Td (1727 np->kstack = 0;) 113.581 Tj 0 -294.294 Td (1728 np->state = UNUSED;) 131.055 Tj 0 -303.788 Td (1729 return 0;) 87.3703 Tj 0 -313.281 Td (1730 }) 43.6851 Tj 0 -322.774 Td (1731 memmove\(np->mem, p->mem, np->sz\);) 183.478 Tj 0 -332.268 Td (1732 ) 21.8426 Tj 0 -341.761 Td (1733 for\(i = 0; i < NOFILE; i++\)) 157.267 Tj 0 -351.254 Td (1734 if\(p->ofile[i]\)) 113.581 Tj 0 -360.748 Td (1735 np->ofile[i] = filedup\(p->ofile[i]\);) 214.057 Tj 0 -370.241 Td (1736 np->cwd = idup\(p->cwd\);) 139.792 Tj 0 -379.734 Td (1737 }) 34.9481 Tj 0 -389.228 Td (1738 ) 21.8426 Tj 0 -398.721 Td (1739 // Set up new context to start executing at forkret \(se\ e below\).) 310.165 Tj 0 -408.214 Td (1740 memset\(&np->context, 0, sizeof\(np->context\)\);) 227.163 Tj 0 -417.708 Td (1741 np->context.eip = \(uint\)forkret;) 170.372 Tj 0 -427.201 Td (1742 np->context.esp = \(uint\)np->tf;) 166.004 Tj 0 -436.695 Td (1743 ) 21.8426 Tj 0 -446.188 Td (1744 // Clear %eax so that fork system call returns 0 in chil\ d.) 283.953 Tj 0 -455.681 Td (1745 np->tf->eax = 0;) 100.476 Tj 0 -465.175 Td (1746 return np;) 74.2647 Tj 0 -474.668 Td (1747 }) 26.2111 Tj 0 -484.161 Td (1748 ) 21.8426 Tj 0 -493.655 Td (1749 ) 21.8426 Tj 0 -522.135 Td (Sheet 17) 34.9481 Tj Q Q q 180 500 5760 3460 re W /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [10 0 0 10 0 0] cm [1 0 0 1 0 0] Tm 0 0 Td [0 -0.967854 1 0 564.72 392.864] Tm 0 0 Td /F9_0 8.70222 Tf (Aug 30 10:08 2007 xv6/proc.c Page 4) 161.635 Tj 0 -28.4801 Td (1750 // Set up first user process.) 148.529 Tj 0 -37.9735 Td (1751 void) 39.3166 Tj 0 -47.4668 Td (1752 userinit\(void\)) 83.0018 Tj 0 -56.9602 Td (1753 {) 26.2111 Tj 0 -66.4535 Td (1754 struct proc *p;) 96.1073 Tj 0 -75.9469 Td (1755 extern uchar _binary_initcode_start[], _binary_initcode_\ size[];) 305.796 Tj 0 -85.4403 Td (1756 ) 21.8426 Tj 0 -94.9336 Td (1757 p = copyproc\(0\);) 100.476 Tj 0 -104.427 Td (1758 p->sz = PAGE;) 87.3703 Tj 0 -113.92 Td (1759 p->mem = kalloc\(p->sz\);) 131.055 Tj 0 -123.414 Td (1760 p->cwd = namei\("/"\);) 117.95 Tj 0 -132.907 Td (1761 memset\(p->tf, 0, sizeof\(*p->tf\)\);) 174.741 Tj 0 -142.4 Td (1762 p->tf->cs = \(SEG_UCODE << 3\) | DPL_USER;) 205.32 Tj 0 -151.894 Td (1763 p->tf->ds = \(SEG_UDATA << 3\) | DPL_USER;) 205.32 Tj 0 -161.387 Td (1764 p->tf->es = p->tf->ds;) 126.687 Tj 0 -170.88 Td (1765 p->tf->ss = p->tf->ds;) 126.687 Tj 0 -180.374 Td (1766 p->tf->eflags = FL_IF;) 126.687 Tj 0 -189.867 Td (1767 p->tf->esp = p->sz;) 113.581 Tj 0 -199.361 Td (1768 ) 21.8426 Tj 0 -208.854 Td (1769 // Make return address readable; needed for some gcc.) 262.111 Tj 0 -218.347 Td (1770 p->tf->esp -= 4;) 100.476 Tj 0 -227.841 Td (1771 *\(uint*\)\(p->mem + p->tf->esp\) = 0xefefefef;) 218.426 Tj 0 -237.334 Td (1772 ) 21.8426 Tj 0 -246.827 Td (1773 // On entry to user space, start executing at beginning \ of initcode.S.) 336.376 Tj 0 -256.321 Td (1774 p->tf->eip = 0;) 96.1073 Tj 0 -265.814 Td (1775 memmove\(p->mem, _binary_initcode_start, \(int\)_binary_\ initcode_size\);) 327.639 Tj 0 -275.307 Td (1776 safestrcpy\(p->name, "initcode", sizeof\(p->name\)\);) 244.637 Tj 0 -284.801 Td (1777 p->state = RUNNABLE;) 117.95 Tj 0 -294.294 Td (1778 ) 21.8426 Tj 0 -303.788 Td (1779 initproc = p;) 87.3703 Tj 0 -313.281 Td (1780 }) 26.2111 Tj 0 -322.774 Td (1781 ) 21.8426 Tj 0 -332.268 Td (1782 ) 21.8426 Tj 0 -341.761 Td (1783 ) 21.8426 Tj 0 -351.254 Td (1784 ) 21.8426 Tj 0 -360.748 Td (1785 ) 21.8426 Tj 0 -370.241 Td (1786 ) 21.8426 Tj 0 -379.734 Td (1787 ) 21.8426 Tj 0 -389.228 Td (1788 ) 21.8426 Tj 0 -398.721 Td (1789 ) 21.8426 Tj 0 -408.214 Td (1790 ) 21.8426 Tj 0 -417.708 Td (1791 ) 21.8426 Tj 0 -427.201 Td (1792 ) 21.8426 Tj 0 -436.695 Td (1793 ) 21.8426 Tj 0 -446.188 Td (1794 ) 21.8426 Tj 0 -455.681 Td (1795 ) 21.8426 Tj 0 -465.175 Td (1796 ) 21.8426 Tj 0 -474.668 Td (1797 ) 21.8426 Tj 0 -484.161 Td (1798 ) 21.8426 Tj 0 -493.655 Td (1799 ) 21.8426 Tj 0 -522.135 Td (Sheet 17) 34.9481 Tj Q Q Q Q showpage %%PageTrailer pdfEndPage %%Page: 25 25 %%BeginPageSetup %%PageOrientation: Landscape pdfStartPage 180 rotate -612 -792 translate 0 0 612 792 re W %%EndPageSetup [] 0 d 1 i 0 j 0 J 10 M 1 w /DeviceGray {} cs [0] sc /DeviceGray {} CS [0] SC false op false OP 0 0 612 792 re W q q [0.1 0 0 0.1 0 0] cm q 180 3960 5760 3460 re W /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [10 0 0 10 0 0] cm [1 0 0 1 0 0] Tm 0 0 Td [0 -0.967854 1 0 564.72 738.864] Tm 0 0 Td /F9_0 8.70222 Tf (Aug 30 10:08 2007 xv6/proc.c Page 5) 161.635 Tj 0 -28.4801 Td (1800 // Per-CPU process scheduler.) 148.529 Tj 0 -37.9735 Td (1801 // Each CPU calls scheduler\(\) after setting itself up.) 257.742 Tj 0 -47.4668 Td (1802 // Scheduler never returns. It loops, doing:) 218.426 Tj 0 -56.9602 Td (1803 // - choose a process to run) 148.529 Tj 0 -66.4535 Td (1804 // - longjmp to start running that process) 209.689 Tj 0 -75.9469 Td (1805 // - eventually that process transfers control back) 249.005 Tj 0 -85.4403 Td (1806 // via longjmp back to the scheduler.) 205.32 Tj 0 -94.9336 Td (1807 void) 39.3166 Tj 0 -104.427 Td (1808 scheduler\(void\)) 87.3703 Tj 0 -113.92 Td (1809 {) 26.2111 Tj 0 -123.414 Td (1810 struct proc *p;) 96.1073 Tj 0 -132.907 Td (1811 int i;) 56.7907 Tj 0 -142.4 Td (1812 ) 21.8426 Tj 0 -151.894 Td (1813 for\(;;\){) 65.5277 Tj 0 -161.387 Td (1814 // Loop over process table looking for process to run.) 275.216 Tj 0 -170.88 Td (1815 acquire\(&proc_table_lock\);) 152.898 Tj 0 -180.374 Td (1816 ) 21.8426 Tj 0 -189.867 Td (1817 for\(i = 0; i < NPROC; i++\){) 157.267 Tj 0 -199.361 Td (1818 p = &proc[i];) 104.844 Tj 0 -208.854 Td (1819 if\(p->state != RUNNABLE\)) 152.898 Tj 0 -218.347 Td (1820 continue;) 96.1073 Tj 0 -227.841 Td (1821 ) 21.8426 Tj 0 -237.334 Td (1822 // Switch to chosen process. It is the process's jo\ b) 279.585 Tj 0 -246.827 Td (1823 // to release proc_table_lock and then reacquire it) 270.848 Tj 0 -256.321 Td (1824 // before jumping back to us.) 174.741 Tj 0 -265.814 Td (1825 cp = p;) 78.6333 Tj 0 -275.307 Td (1826 setupsegs\(p\);) 104.844 Tj 0 -284.801 Td (1827 p->state = RUNNING;) 131.055 Tj 0 -294.294 Td (1828 swtch\(&cpus[cpu\(\)].context, &p->context\);) 227.163 Tj 0 -303.788 Td (1829 ) 21.8426 Tj 0 -313.281 Td (1830 // Process is done running for now.) 200.952 Tj 0 -322.774 Td (1831 // It should have changed its p->state before coming\ back.) 301.427 Tj 0 -332.268 Td (1832 cp = 0;) 78.6333 Tj 0 -341.761 Td (1833 setupsegs\(0\);) 104.844 Tj 0 -351.254 Td (1834 }) 43.6851 Tj 0 -360.748 Td (1835 ) 21.8426 Tj 0 -370.241 Td (1836 release\(&proc_table_lock\);) 152.898 Tj 0 -379.734 Td (1837 }) 34.9481 Tj 0 -389.228 Td (1838 }) 26.2111 Tj 0 -398.721 Td (1839 ) 21.8426 Tj 0 -408.214 Td (1840 ) 21.8426 Tj 0 -417.708 Td (1841 ) 21.8426 Tj 0 -427.201 Td (1842 ) 21.8426 Tj 0 -436.695 Td (1843 ) 21.8426 Tj 0 -446.188 Td (1844 ) 21.8426 Tj 0 -455.681 Td (1845 ) 21.8426 Tj 0 -465.175 Td (1846 ) 21.8426 Tj 0 -474.668 Td (1847 ) 21.8426 Tj 0 -484.161 Td (1848 ) 21.8426 Tj 0 -493.655 Td (1849 ) 21.8426 Tj 0 -522.135 Td (Sheet 18) 34.9481 Tj Q Q q 180 500 5760 3460 re W /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [10 0 0 10 0 0] cm [1 0 0 1 0 0] Tm 0 0 Td [0 -0.967854 1 0 564.72 392.864] Tm 0 0 Td /F9_0 8.70222 Tf (Aug 30 10:08 2007 xv6/proc.c Page 6) 161.635 Tj 0 -28.4801 Td (1850 // Enter scheduler. Must already hold proc_table_lock) 257.742 Tj 0 -37.9735 Td (1851 // and have changed curproc[cpu\(\)]->state.) 205.32 Tj 0 -47.4668 Td (1852 void) 39.3166 Tj 0 -56.9602 Td (1853 sched\(void\)) 69.8962 Tj 0 -66.4535 Td (1854 {) 26.2111 Tj 0 -75.9469 Td (1855 if\(cp->state == RUNNING\)) 135.424 Tj 0 -85.4403 Td (1856 panic\("sched running"\);) 139.792 Tj 0 -94.9336 Td (1857 if\(!holding\(&proc_table_lock\)\)) 161.635 Tj 0 -104.427 Td (1858 panic\("sched proc_table_lock"\);) 174.741 Tj 0 -113.92 Td (1859 if\(cpus[cpu\(\)].nlock != 1\)) 144.161 Tj 0 -123.414 Td (1860 panic\("sched locks"\);) 131.055 Tj 0 -132.907 Td (1861 ) 21.8426 Tj 0 -142.4 Td (1862 swtch\(&cp->context, &cpus[cpu\(\)].context\);) 214.057 Tj 0 -151.894 Td (1863 }) 26.2111 Tj 0 -161.387 Td (1864 ) 21.8426 Tj 0 -170.88 Td (1865 // Give up the CPU for one scheduling round.) 214.057 Tj 0 -180.374 Td (1866 void) 39.3166 Tj 0 -189.867 Td (1867 yield\(void\)) 69.8962 Tj 0 -199.361 Td (1868 {) 26.2111 Tj 0 -208.854 Td (1869 acquire\(&proc_table_lock\);) 144.161 Tj 0 -218.347 Td (1870 cp->state = RUNNABLE;) 122.318 Tj 0 -227.841 Td (1871 sched\(\);) 65.5277 Tj 0 -237.334 Td (1872 release\(&proc_table_lock\);) 144.161 Tj 0 -246.827 Td (1873 }) 26.2111 Tj 0 -256.321 Td (1874 ) 21.8426 Tj 0 -265.814 Td (1875 // A fork child's very first scheduling by scheduler\(\)) 257.742 Tj 0 -275.307 Td (1876 // will longjmp here. "Return" to user space.) 222.794 Tj 0 -284.801 Td (1877 void) 39.3166 Tj 0 -294.294 Td (1878 forkret\(void\)) 78.6333 Tj 0 -303.788 Td (1879 {) 26.2111 Tj 0 -313.281 Td (1880 // Still holding proc_table_lock from scheduler.) 240.268 Tj 0 -322.774 Td (1881 release\(&proc_table_lock\);) 144.161 Tj 0 -332.268 Td (1882 ) 21.8426 Tj 0 -341.761 Td (1883 // Jump into assembly, never to return.) 200.952 Tj 0 -351.254 Td (1884 forkret1\(cp->tf\);) 104.844 Tj 0 -360.748 Td (1885 }) 26.2111 Tj 0 -370.241 Td (1886 ) 21.8426 Tj 0 -379.734 Td (1887 ) 21.8426 Tj 0 -389.228 Td (1888 ) 21.8426 Tj 0 -398.721 Td (1889 ) 21.8426 Tj 0 -408.214 Td (1890 ) 21.8426 Tj 0 -417.708 Td (1891 ) 21.8426 Tj 0 -427.201 Td (1892 ) 21.8426 Tj 0 -436.695 Td (1893 ) 21.8426 Tj 0 -446.188 Td (1894 ) 21.8426 Tj 0 -455.681 Td (1895 ) 21.8426 Tj 0 -465.175 Td (1896 ) 21.8426 Tj 0 -474.668 Td (1897 ) 21.8426 Tj 0 -484.161 Td (1898 ) 21.8426 Tj 0 -493.655 Td (1899 ) 21.8426 Tj 0 -522.135 Td (Sheet 18) 34.9481 Tj Q Q Q Q showpage %%PageTrailer pdfEndPage %%Page: 26 26 %%BeginPageSetup %%PageOrientation: Landscape pdfStartPage 180 rotate -612 -792 translate 0 0 612 792 re W %%EndPageSetup [] 0 d 1 i 0 j 0 J 10 M 1 w /DeviceGray {} cs [0] sc /DeviceGray {} CS [0] SC false op false OP 0 0 612 792 re W q q [0.1 0 0 0.1 0 0] cm q 180 3960 5760 3460 re W /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [10 0 0 10 0 0] cm [1 0 0 1 0 0] Tm 0 0 Td [0 -0.967854 1 0 564.72 738.864] Tm 0 0 Td /F9_0 8.70222 Tf (Aug 30 10:08 2007 xv6/proc.c Page 7) 161.635 Tj 0 -28.4801 Td (1900 // Atomically release lock and sleep on chan.) 218.426 Tj 0 -37.9735 Td (1901 // Reacquires lock when reawakened.) 174.741 Tj 0 -47.4668 Td (1902 void) 39.3166 Tj 0 -56.9602 Td (1903 sleep\(void *chan, struct spinlock *lk\)) 187.846 Tj 0 -66.4535 Td (1904 {) 26.2111 Tj 0 -75.9469 Td (1905 if\(cp == 0\)) 78.6333 Tj 0 -85.4403 Td (1906 panic\("sleep"\);) 104.844 Tj 0 -94.9336 Td (1907 ) 21.8426 Tj 0 -104.427 Td (1908 if\(lk == 0\)) 78.6333 Tj 0 -113.92 Td (1909 panic\("sleep without lk"\);) 152.898 Tj 0 -123.414 Td (1910 ) 21.8426 Tj 0 -132.907 Td (1911 // Must acquire proc_table_lock in order to) 218.426 Tj 0 -142.4 Td (1912 // change p->state and then call sched.) 200.952 Tj 0 -151.894 Td (1913 // Once we hold proc_table_lock, we can be) 214.057 Tj 0 -161.387 Td (1914 // guaranteed that we won't miss any wakeup) 218.426 Tj 0 -170.88 Td (1915 // \(wakeup runs with proc_table_lock locked\),) 227.163 Tj 0 -180.374 Td (1916 // so it's okay to release lk.) 161.635 Tj 0 -189.867 Td (1917 if\(lk != &proc_table_lock\){) 148.529 Tj 0 -199.361 Td (1918 acquire\(&proc_table_lock\);) 152.898 Tj 0 -208.854 Td (1919 release\(lk\);) 91.7388 Tj 0 -218.347 Td (1920 }) 34.9481 Tj 0 -227.841 Td (1921 ) 21.8426 Tj 0 -237.334 Td (1922 // Go to sleep.) 96.1073 Tj 0 -246.827 Td (1923 cp->chan = chan;) 100.476 Tj 0 -256.321 Td (1924 cp->state = SLEEPING;) 122.318 Tj 0 -265.814 Td (1925 sched\(\);) 65.5277 Tj 0 -275.307 Td (1926 ) 21.8426 Tj 0 -284.801 Td (1927 // Tidy up.) 78.6333 Tj 0 -294.294 Td (1928 cp->chan = 0;) 87.3703 Tj 0 -303.788 Td (1929 ) 21.8426 Tj 0 -313.281 Td (1930 // Reacquire original lock.) 148.529 Tj 0 -322.774 Td (1931 if\(lk != &proc_table_lock\){) 148.529 Tj 0 -332.268 Td (1932 release\(&proc_table_lock\);) 152.898 Tj 0 -341.761 Td (1933 acquire\(lk\);) 91.7388 Tj 0 -351.254 Td (1934 }) 34.9481 Tj 0 -360.748 Td (1935 }) 26.2111 Tj 0 -370.241 Td (1936 ) 21.8426 Tj 0 -379.734 Td (1937 ) 21.8426 Tj 0 -389.228 Td (1938 ) 21.8426 Tj 0 -398.721 Td (1939 ) 21.8426 Tj 0 -408.214 Td (1940 ) 21.8426 Tj 0 -417.708 Td (1941 ) 21.8426 Tj 0 -427.201 Td (1942 ) 21.8426 Tj 0 -436.695 Td (1943 ) 21.8426 Tj 0 -446.188 Td (1944 ) 21.8426 Tj 0 -455.681 Td (1945 ) 21.8426 Tj 0 -465.175 Td (1946 ) 21.8426 Tj 0 -474.668 Td (1947 ) 21.8426 Tj 0 -484.161 Td (1948 ) 21.8426 Tj 0 -493.655 Td (1949 ) 21.8426 Tj 0 -522.135 Td (Sheet 19) 34.9481 Tj Q Q q 180 500 5760 3460 re W /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [10 0 0 10 0 0] cm [1 0 0 1 0 0] Tm 0 0 Td [0 -0.967854 1 0 564.72 392.864] Tm 0 0 Td /F9_0 8.70222 Tf (Aug 30 10:08 2007 xv6/proc.c Page 8) 161.635 Tj 0 -28.4801 Td (1950 // Wake up all processes sleeping on chan.) 205.32 Tj 0 -37.9735 Td (1951 // Proc_table_lock must be held.) 161.635 Tj 0 -47.4668 Td (1952 static void) 69.8962 Tj 0 -56.9602 Td (1953 wakeup1\(void *chan\)) 104.844 Tj 0 -66.4535 Td (1954 {) 26.2111 Tj 0 -75.9469 Td (1955 struct proc *p;) 96.1073 Tj 0 -85.4403 Td (1956 ) 21.8426 Tj 0 -94.9336 Td (1957 for\(p = proc; p < &proc[NPROC]; p++\)) 187.846 Tj 0 -104.427 Td (1958 if\(p->state == SLEEPING && p->chan == chan\)) 227.163 Tj 0 -113.92 Td (1959 p->state = RUNNABLE;) 135.424 Tj 0 -123.414 Td (1960 }) 26.2111 Tj 0 -132.907 Td (1961 ) 21.8426 Tj 0 -142.4 Td (1962 // Wake up all processes sleeping on chan.) 205.32 Tj 0 -151.894 Td (1963 // Proc_table_lock is acquired and released.) 214.057 Tj 0 -161.387 Td (1964 void) 39.3166 Tj 0 -170.88 Td (1965 wakeup\(void *chan\)) 100.476 Tj 0 -180.374 Td (1966 {) 26.2111 Tj 0 -189.867 Td (1967 acquire\(&proc_table_lock\);) 144.161 Tj 0 -199.361 Td (1968 wakeup1\(chan\);) 91.7388 Tj 0 -208.854 Td (1969 release\(&proc_table_lock\);) 144.161 Tj 0 -218.347 Td (1970 }) 26.2111 Tj 0 -227.841 Td (1971 ) 21.8426 Tj 0 -237.334 Td (1972 // Kill the process with the given pid.) 192.215 Tj 0 -246.827 Td (1973 // Process won't actually exit until it returns) 227.163 Tj 0 -256.321 Td (1974 // to user space \(see trap in trap.c\).) 187.846 Tj 0 -265.814 Td (1975 int) 34.9481 Tj 0 -275.307 Td (1976 kill\(int pid\)) 78.6333 Tj 0 -284.801 Td (1977 {) 26.2111 Tj 0 -294.294 Td (1978 struct proc *p;) 96.1073 Tj 0 -303.788 Td (1979 ) 21.8426 Tj 0 -313.281 Td (1980 acquire\(&proc_table_lock\);) 144.161 Tj 0 -322.774 Td (1981 for\(p = proc; p < &proc[NPROC]; p++\){) 192.215 Tj 0 -332.268 Td (1982 if\(p->pid == pid\){) 117.95 Tj 0 -341.761 Td (1983 p->killed = 1;) 109.213 Tj 0 -351.254 Td (1984 // Wake process from sleep if necessary.) 222.794 Tj 0 -360.748 Td (1985 if\(p->state == SLEEPING\)) 152.898 Tj 0 -370.241 Td (1986 p->state = RUNNABLE;) 144.161 Tj 0 -379.734 Td (1987 release\(&proc_table_lock\);) 161.635 Tj 0 -389.228 Td (1988 return 0;) 87.3703 Tj 0 -398.721 Td (1989 }) 43.6851 Tj 0 -408.214 Td (1990 }) 34.9481 Tj 0 -417.708 Td (1991 release\(&proc_table_lock\);) 144.161 Tj 0 -427.201 Td (1992 return -1;) 74.2647 Tj 0 -436.695 Td (1993 }) 26.2111 Tj 0 -446.188 Td (1994 ) 21.8426 Tj 0 -455.681 Td (1995 ) 21.8426 Tj 0 -465.175 Td (1996 ) 21.8426 Tj 0 -474.668 Td (1997 ) 21.8426 Tj 0 -484.161 Td (1998 ) 21.8426 Tj 0 -493.655 Td (1999 ) 21.8426 Tj 0 -522.135 Td (Sheet 19) 34.9481 Tj Q Q Q Q showpage %%PageTrailer pdfEndPage %%Page: 27 27 %%BeginPageSetup %%PageOrientation: Landscape pdfStartPage 180 rotate -612 -792 translate 0 0 612 792 re W %%EndPageSetup [] 0 d 1 i 0 j 0 J 10 M 1 w /DeviceGray {} cs [0] sc /DeviceGray {} CS [0] SC false op false OP 0 0 612 792 re W q q [0.1 0 0 0.1 0 0] cm q 180 3960 5760 3460 re W /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [10 0 0 10 0 0] cm [1 0 0 1 0 0] Tm 0 0 Td [0 -0.967854 1 0 564.72 738.864] Tm 0 0 Td /F9_0 8.70222 Tf (Aug 30 10:08 2007 xv6/proc.c Page 9) 161.635 Tj 0 -28.4801 Td (2000 // Exit the current process. Does not return.) 222.794 Tj 0 -37.9735 Td (2001 // Exited processes remain in the zombie state) 222.794 Tj 0 -47.4668 Td (2002 // until their parent calls wait\(\) to find out they exit\ ed.) 279.585 Tj 0 -56.9602 Td (2003 void) 39.3166 Tj 0 -66.4535 Td (2004 exit\(void\)) 65.5277 Tj 0 -75.9469 Td (2005 {) 26.2111 Tj 0 -85.4403 Td (2006 struct proc *p;) 96.1073 Tj 0 -94.9336 Td (2007 int fd;) 61.1592 Tj 0 -104.427 Td (2008 ) 21.8426 Tj 0 -113.92 Td (2009 if\(cp == initproc\)) 109.213 Tj 0 -123.414 Td (2010 panic\("init exiting"\);) 135.424 Tj 0 -132.907 Td (2011 ) 21.8426 Tj 0 -142.4 Td (2012 // Close all open files.) 135.424 Tj 0 -151.894 Td (2013 for\(fd = 0; fd < NOFILE; fd++\){) 166.004 Tj 0 -161.387 Td (2014 if\(cp->ofile[fd]\){) 117.95 Tj 0 -170.88 Td (2015 fileclose\(cp->ofile[fd]\);) 157.267 Tj 0 -180.374 Td (2016 cp->ofile[fd] = 0;) 126.687 Tj 0 -189.867 Td (2017 }) 43.6851 Tj 0 -199.361 Td (2018 }) 34.9481 Tj 0 -208.854 Td (2019 ) 21.8426 Tj 0 -218.347 Td (2020 iput\(cp->cwd\);) 91.7388 Tj 0 -227.841 Td (2021 cp->cwd = 0;) 83.0018 Tj 0 -237.334 Td (2022 ) 21.8426 Tj 0 -246.827 Td (2023 acquire\(&proc_table_lock\);) 144.161 Tj 0 -256.321 Td (2024 ) 21.8426 Tj 0 -265.814 Td (2025 // Parent might be sleeping in proc_wait.) 209.689 Tj 0 -275.307 Td (2026 wakeup1\(cp->parent\);) 117.95 Tj 0 -284.801 Td (2027 ) 21.8426 Tj 0 -294.294 Td (2028 // Pass abandoned children to init.) 183.478 Tj 0 -303.788 Td (2029 for\(p = proc; p < &proc[NPROC]; p++\){) 192.215 Tj 0 -313.281 Td (2030 if\(p->parent == cp\){) 126.687 Tj 0 -322.774 Td (2031 p->parent = initproc;) 139.792 Tj 0 -332.268 Td (2032 if\(p->state == ZOMBIE\)) 144.161 Tj 0 -341.761 Td (2033 wakeup1\(initproc\);) 135.424 Tj 0 -351.254 Td (2034 }) 43.6851 Tj 0 -360.748 Td (2035 }) 34.9481 Tj 0 -370.241 Td (2036 ) 21.8426 Tj 0 -379.734 Td (2037 // Jump into the scheduler, never to return.) 222.794 Tj 0 -389.228 Td (2038 cp->killed = 0;) 96.1073 Tj 0 -398.721 Td (2039 cp->state = ZOMBIE;) 113.581 Tj 0 -408.214 Td (2040 sched\(\);) 65.5277 Tj 0 -417.708 Td (2041 panic\("zombie exit"\);) 122.318 Tj 0 -427.201 Td (2042 }) 26.2111 Tj 0 -436.695 Td (2043 ) 21.8426 Tj 0 -446.188 Td (2044 ) 21.8426 Tj 0 -455.681 Td (2045 ) 21.8426 Tj 0 -465.175 Td (2046 ) 21.8426 Tj 0 -474.668 Td (2047 ) 21.8426 Tj 0 -484.161 Td (2048 ) 21.8426 Tj 0 -493.655 Td (2049 ) 21.8426 Tj 0 -522.135 Td (Sheet 20) 34.9481 Tj Q Q q 180 500 5760 3460 re W /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [10 0 0 10 0 0] cm [1 0 0 1 0 0] Tm 0 0 Td [0 -0.967854 1 0 564.72 392.864] Tm 0 0 Td /F9_0 8.70222 Tf (Aug 30 10:08 2007 xv6/proc.c Page 10) 166.004 Tj 0 -28.4801 Td (2050 // Wait for a child process to exit and return its pid.) 262.111 Tj 0 -37.9735 Td (2051 // Return -1 if this process has no children.) 218.426 Tj 0 -47.4668 Td (2052 int) 34.9481 Tj 0 -56.9602 Td (2053 wait\(void\)) 65.5277 Tj 0 -66.4535 Td (2054 {) 26.2111 Tj 0 -75.9469 Td (2055 struct proc *p;) 96.1073 Tj 0 -85.4403 Td (2056 int i, havekids, pid;) 122.318 Tj 0 -94.9336 Td (2057 ) 21.8426 Tj 0 -104.427 Td (2058 acquire\(&proc_table_lock\);) 144.161 Tj 0 -113.92 Td (2059 for\(;;\){) 65.5277 Tj 0 -123.414 Td (2060 // Scan through table looking for zombie children.) 257.742 Tj 0 -132.907 Td (2061 havekids = 0;) 96.1073 Tj 0 -142.4 Td (2062 for\(i = 0; i < NPROC; i++\){) 157.267 Tj 0 -151.894 Td (2063 p = &proc[i];) 104.844 Tj 0 -161.387 Td (2064 if\(p->state == UNUSED\)) 144.161 Tj 0 -170.88 Td (2065 continue;) 96.1073 Tj 0 -180.374 Td (2066 if\(p->parent == cp\){) 135.424 Tj 0 -189.867 Td (2067 if\(p->state == ZOMBIE\){) 157.267 Tj 0 -199.361 Td (2068 // Found one.) 122.318 Tj 0 -208.854 Td (2069 kfree\(p->mem, p->sz\);) 157.267 Tj 0 -218.347 Td (2070 kfree\(p->kstack, KSTACKSIZE\);) 192.215 Tj 0 -227.841 Td (2071 pid = p->pid;) 122.318 Tj 0 -237.334 Td (2072 p->state = UNUSED;) 144.161 Tj 0 -246.827 Td (2073 p->pid = 0;) 113.581 Tj 0 -256.321 Td (2074 p->parent = 0;) 126.687 Tj 0 -265.814 Td (2075 p->name[0] = 0;) 131.055 Tj 0 -275.307 Td (2076 release\(&proc_table_lock\);) 179.109 Tj 0 -284.801 Td (2077 return pid;) 113.581 Tj 0 -294.294 Td (2078 }) 61.1592 Tj 0 -303.788 Td (2079 havekids = 1;) 113.581 Tj 0 -313.281 Td (2080 }) 52.4222 Tj 0 -322.774 Td (2081 }) 43.6851 Tj 0 -332.268 Td (2082 ) 21.8426 Tj 0 -341.761 Td (2083 // No point waiting if we don't have any children.) 257.742 Tj 0 -351.254 Td (2084 if\(!havekids || cp->killed\){) 161.635 Tj 0 -360.748 Td (2085 release\(&proc_table_lock\);) 161.635 Tj 0 -370.241 Td (2086 return -1;) 91.7388 Tj 0 -379.734 Td (2087 }) 43.6851 Tj 0 -389.228 Td (2088 ) 21.8426 Tj 0 -398.721 Td (2089 // Wait for children to exit. \(See wakeup1 call in p\ roc_exit.\)) 314.533 Tj 0 -408.214 Td (2090 sleep\(cp, &proc_table_lock\);) 161.635 Tj 0 -417.708 Td (2091 }) 34.9481 Tj 0 -427.201 Td (2092 }) 26.2111 Tj 0 -436.695 Td (2093 ) 21.8426 Tj 0 -446.188 Td (2094 ) 21.8426 Tj 0 -455.681 Td (2095 ) 21.8426 Tj 0 -465.175 Td (2096 ) 21.8426 Tj 0 -474.668 Td (2097 ) 21.8426 Tj 0 -484.161 Td (2098 ) 21.8426 Tj 0 -493.655 Td (2099 ) 21.8426 Tj 0 -522.135 Td (Sheet 20) 34.9481 Tj Q Q Q Q showpage %%PageTrailer pdfEndPage %%Page: 28 28 %%BeginPageSetup %%PageOrientation: Landscape pdfStartPage 180 rotate -612 -792 translate 0 0 612 792 re W %%EndPageSetup [] 0 d 1 i 0 j 0 J 10 M 1 w /DeviceGray {} cs [0] sc /DeviceGray {} CS [0] SC false op false OP 0 0 612 792 re W q q [0.1 0 0 0.1 0 0] cm q 180 3960 5760 3460 re W /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [10 0 0 10 0 0] cm [1 0 0 1 0 0] Tm 0 0 Td [0 -0.967854 1 0 564.72 738.864] Tm 0 0 Td /F9_0 8.70222 Tf (Aug 30 10:08 2007 xv6/proc.c Page 11) 166.004 Tj 0 -28.4801 Td (2100 // Print a process listing to console. For debugging.) 257.742 Tj 0 -37.9735 Td (2101 // Runs when user types ^P on console.) 187.846 Tj 0 -47.4668 Td (2102 // No lock to avoid wedging a stuck machine further.) 249.005 Tj 0 -56.9602 Td (2103 void) 39.3166 Tj 0 -66.4535 Td (2104 procdump\(void\)) 83.0018 Tj 0 -75.9469 Td (2105 {) 26.2111 Tj 0 -85.4403 Td (2106 static char *states[] = {) 139.792 Tj 0 -94.9336 Td (2107 [UNUSED] "unused",) 122.318 Tj 0 -104.427 Td (2108 [EMBRYO] "embryo",) 122.318 Tj 0 -113.92 Td (2109 [SLEEPING] "sleep ",) 122.318 Tj 0 -123.414 Td (2110 [RUNNABLE] "runble",) 122.318 Tj 0 -132.907 Td (2111 [RUNNING] "run ",) 122.318 Tj 0 -142.4 Td (2112 [ZOMBIE] "zombie") 117.95 Tj 0 -151.894 Td (2113 };) 39.3166 Tj 0 -161.387 Td (2114 int i, j;) 69.8962 Tj 0 -170.88 Td (2115 struct proc *p;) 96.1073 Tj 0 -180.374 Td (2116 char *state;) 83.0018 Tj 0 -189.867 Td (2117 uint pc[10];) 83.0018 Tj 0 -199.361 Td (2118 ) 21.8426 Tj 0 -208.854 Td (2119 for\(i = 0; i < NPROC; i++\){) 148.529 Tj 0 -218.347 Td (2120 p = &proc[i];) 96.1073 Tj 0 -227.841 Td (2121 if\(p->state == UNUSED\)) 135.424 Tj 0 -237.334 Td (2122 continue;) 87.3703 Tj 0 -246.827 Td (2123 if\(p->state >= 0 && p->state < NELEM\(states\) && sta\ tes[p->state]\)) 323.27 Tj 0 -256.321 Td (2124 state = states[p->state];) 157.267 Tj 0 -265.814 Td (2125 else) 56.7907 Tj 0 -275.307 Td (2126 state = "???";) 109.213 Tj 0 -284.801 Td (2127 cprintf\("%d %s %s", p->pid, state, p->name\);) 231.531 Tj 0 -294.294 Td (2128 if\(p->state == SLEEPING\){) 148.529 Tj 0 -303.788 Td (2129 getcallerpcs\(\(uint*\)p->context.ebp+2, pc\);) 231.531 Tj 0 -313.281 Td (2130 for\(j=0; j<10 && pc[j] != 0; j++\)) 192.215 Tj 0 -322.774 Td (2131 cprintf\(" %p", pc[j]\);) 152.898 Tj 0 -332.268 Td (2132 }) 43.6851 Tj 0 -341.761 Td (2133 cprintf\("\\n"\);) 100.476 Tj 0 -351.254 Td (2134 }) 34.9481 Tj 0 -360.748 Td (2135 }) 26.2111 Tj 0 -370.241 Td (2136 ) 21.8426 Tj 0 -379.734 Td (2137 ) 21.8426 Tj 0 -389.228 Td (2138 ) 21.8426 Tj 0 -398.721 Td (2139 ) 21.8426 Tj 0 -408.214 Td (2140 ) 21.8426 Tj 0 -417.708 Td (2141 ) 21.8426 Tj 0 -427.201 Td (2142 ) 21.8426 Tj 0 -436.695 Td (2143 ) 21.8426 Tj 0 -446.188 Td (2144 ) 21.8426 Tj 0 -455.681 Td (2145 ) 21.8426 Tj 0 -465.175 Td (2146 ) 21.8426 Tj 0 -474.668 Td (2147 ) 21.8426 Tj 0 -484.161 Td (2148 ) 21.8426 Tj 0 -493.655 Td (2149 ) 21.8426 Tj 0 -522.135 Td (Sheet 21) 34.9481 Tj Q Q q 180 500 5760 3460 re W /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [10 0 0 10 0 0] cm [1 0 0 1 0 0] Tm 0 0 Td [0 -0.967854 1 0 564.72 392.864] Tm 0 0 Td /F9_0 8.70222 Tf (Aug 30 10:08 2007 xv6/swtch.S Page 1) 166.004 Tj 0 -28.4801 Td (2150 # void swtch\(struct context *old, struct context *new\)\ ;) 270.848 Tj 0 -37.9735 Td (2151 #) 26.2111 Tj 0 -47.4668 Td (2152 # Save current register context in old) 187.846 Tj 0 -56.9602 Td (2153 # and then load register context from new.) 205.32 Tj 0 -66.4535 Td (2154 ) 21.8426 Tj 0 -75.9469 Td (2155 .globl swtch) 74.2647 Tj 0 -85.4403 Td (2156 swtch:) 48.0537 Tj 0 -94.9336 Td (2157 # Save old registers) 117.95 Tj 0 -104.427 Td (2158 movl 4\(%esp\), %eax) 109.213 Tj 0 -113.92 Td (2159 ) 21.8426 Tj 0 -123.414 Td (2160 popl 0\(%eax\) # %eip) 117.95 Tj 0 -132.907 Td (2161 movl %esp, 4\(%eax\)) 109.213 Tj 0 -142.4 Td (2162 movl %ebx, 8\(%eax\)) 109.213 Tj 0 -151.894 Td (2163 movl %ecx, 12\(%eax\)) 113.581 Tj 0 -161.387 Td (2164 movl %edx, 16\(%eax\)) 113.581 Tj 0 -170.88 Td (2165 movl %esi, 20\(%eax\)) 113.581 Tj 0 -180.374 Td (2166 movl %edi, 24\(%eax\)) 113.581 Tj 0 -189.867 Td (2167 movl %ebp, 28\(%eax\)) 113.581 Tj 0 -199.361 Td (2168 ) 21.8426 Tj 0 -208.854 Td (2169 # Load new registers) 117.95 Tj 0 -218.347 Td (2170 movl 4\(%esp\), %eax # not 8\(%esp\) - popped return ad\ dress above) 305.796 Tj 0 -227.841 Td (2171 ) 21.8426 Tj 0 -237.334 Td (2172 movl 28\(%eax\), %ebp) 113.581 Tj 0 -246.827 Td (2173 movl 24\(%eax\), %edi) 113.581 Tj 0 -256.321 Td (2174 movl 20\(%eax\), %esi) 113.581 Tj 0 -265.814 Td (2175 movl 16\(%eax\), %edx) 113.581 Tj 0 -275.307 Td (2176 movl 12\(%eax\), %ecx) 113.581 Tj 0 -284.801 Td (2177 movl 8\(%eax\), %ebx) 109.213 Tj 0 -294.294 Td (2178 movl 4\(%eax\), %esp) 109.213 Tj 0 -303.788 Td (2179 pushl 0\(%eax\) # %eip) 122.318 Tj 0 -313.281 Td (2180 ) 21.8426 Tj 0 -322.774 Td (2181 ret) 43.6851 Tj 0 -332.268 Td (2182 ) 21.8426 Tj 0 -341.761 Td (2183 ) 21.8426 Tj 0 -351.254 Td (2184 ) 21.8426 Tj 0 -360.748 Td (2185 ) 21.8426 Tj 0 -370.241 Td (2186 ) 21.8426 Tj 0 -379.734 Td (2187 ) 21.8426 Tj 0 -389.228 Td (2188 ) 21.8426 Tj 0 -398.721 Td (2189 ) 21.8426 Tj 0 -408.214 Td (2190 ) 21.8426 Tj 0 -417.708 Td (2191 ) 21.8426 Tj 0 -427.201 Td (2192 ) 21.8426 Tj 0 -436.695 Td (2193 ) 21.8426 Tj 0 -446.188 Td (2194 ) 21.8426 Tj 0 -455.681 Td (2195 ) 21.8426 Tj 0 -465.175 Td (2196 ) 21.8426 Tj 0 -474.668 Td (2197 ) 21.8426 Tj 0 -484.161 Td (2198 ) 21.8426 Tj 0 -493.655 Td (2199 ) 21.8426 Tj 0 -522.135 Td (Sheet 21) 34.9481 Tj Q Q Q Q showpage %%PageTrailer pdfEndPage %%Page: 29 29 %%BeginPageSetup %%PageOrientation: Landscape pdfStartPage 180 rotate -612 -792 translate 0 0 612 792 re W %%EndPageSetup [] 0 d 1 i 0 j 0 J 10 M 1 w /DeviceGray {} cs [0] sc /DeviceGray {} CS [0] SC false op false OP 0 0 612 792 re W q q [0.1 0 0 0.1 0 0] cm q 180 3960 5760 3460 re W /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [10 0 0 10 0 0] cm [1 0 0 1 0 0] Tm 0 0 Td [0 -0.967854 1 0 564.72 738.864] Tm 0 0 Td /F9_0 8.70222 Tf (Aug 30 10:08 2007 xv6/kalloc.c Page 1) 170.372 Tj 0 -28.4801 Td (2200 // Physical memory allocator, intended to allocate) 240.268 Tj 0 -37.9735 Td (2201 // memory for user processes. Allocates in 4096-byte "page\ s".) 288.322 Tj 0 -47.4668 Td (2202 // Free list is kept sorted and combines adjacent pages in\ to) 283.953 Tj 0 -56.9602 Td (2203 // long runs, to make it easier to allocate big segments.) 270.848 Tj 0 -66.4535 Td (2204 // One reason the page size is 4k is that the x86 segment \ size) 292.69 Tj 0 -75.9469 Td (2205 // granularity is 4k.) 113.581 Tj 0 -85.4403 Td (2206 ) 21.8426 Tj 0 -94.9336 Td (2207 #include "types.h") 100.476 Tj 0 -104.427 Td (2208 #include "defs.h") 96.1073 Tj 0 -113.92 Td (2209 #include "param.h") 100.476 Tj 0 -123.414 Td (2210 #include "spinlock.h") 113.581 Tj 0 -132.907 Td (2211 ) 21.8426 Tj 0 -142.4 Td (2212 struct spinlock kalloc_lock;) 144.161 Tj 0 -151.894 Td (2213 ) 21.8426 Tj 0 -161.387 Td (2214 struct run {) 74.2647 Tj 0 -170.88 Td (2215 struct run *next;) 104.844 Tj 0 -180.374 Td (2216 int len; // bytes) 104.844 Tj 0 -189.867 Td (2217 };) 30.5796 Tj 0 -199.361 Td (2218 struct run *freelist;) 113.581 Tj 0 -208.854 Td (2219 ) 21.8426 Tj 0 -218.347 Td (2220 // Initialize free list of physical pages.) 205.32 Tj 0 -227.841 Td (2221 // This code cheats by just considering one megabyte of) 262.111 Tj 0 -237.334 Td (2222 // pages after _end. Real systems would determine the) 257.742 Tj 0 -246.827 Td (2223 // amount of memory available in the system and use it all\ .) 279.585 Tj 0 -256.321 Td (2224 void) 39.3166 Tj 0 -265.814 Td (2225 kinit\(void\)) 69.8962 Tj 0 -275.307 Td (2226 {) 26.2111 Tj 0 -284.801 Td (2227 extern int end;) 96.1073 Tj 0 -294.294 Td (2228 uint mem;) 69.8962 Tj 0 -303.788 Td (2229 char *start;) 83.0018 Tj 0 -313.281 Td (2230 ) 21.8426 Tj 0 -322.774 Td (2231 initlock\(&kalloc_lock, "kalloc"\);) 174.741 Tj 0 -332.268 Td (2232 start = \(char*\) &end;) 122.318 Tj 0 -341.761 Td (2233 start = \(char*\) \(\(\(uint\)start + PAGE\) & ~\(PAGE-1\ \)\);) 253.374 Tj 0 -351.254 Td (2234 mem = 256; // assume computer has 256 pages of RAM) 249.005 Tj 0 -360.748 Td (2235 cprintf\("mem = %d\\n", mem * PAGE\);) 179.109 Tj 0 -370.241 Td (2236 kfree\(start, mem * PAGE\);) 139.792 Tj 0 -379.734 Td (2237 }) 26.2111 Tj 0 -389.228 Td (2238 ) 21.8426 Tj 0 -398.721 Td (2239 ) 21.8426 Tj 0 -408.214 Td (2240 ) 21.8426 Tj 0 -417.708 Td (2241 ) 21.8426 Tj 0 -427.201 Td (2242 ) 21.8426 Tj 0 -436.695 Td (2243 ) 21.8426 Tj 0 -446.188 Td (2244 ) 21.8426 Tj 0 -455.681 Td (2245 ) 21.8426 Tj 0 -465.175 Td (2246 ) 21.8426 Tj 0 -474.668 Td (2247 ) 21.8426 Tj 0 -484.161 Td (2248 ) 21.8426 Tj 0 -493.655 Td (2249 ) 21.8426 Tj 0 -522.135 Td (Sheet 22) 34.9481 Tj Q Q q 180 500 5760 3460 re W /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [10 0 0 10 0 0] cm [1 0 0 1 0 0] Tm 0 0 Td [0 -0.967854 1 0 564.72 392.864] Tm 0 0 Td /F9_0 8.70222 Tf (Aug 30 10:08 2007 xv6/kalloc.c Page 2) 170.372 Tj 0 -28.4801 Td (2250 // Free the len bytes of memory pointed at by v,) 231.531 Tj 0 -37.9735 Td (2251 // which normally should have been returned by a) 231.531 Tj 0 -47.4668 Td (2252 // call to kalloc\(len\). \(The exception is when) 227.163 Tj 0 -56.9602 Td (2253 // initializing the allocator; see kinit above.\)) 231.531 Tj 0 -66.4535 Td (2254 void) 39.3166 Tj 0 -75.9469 Td (2255 kfree\(char *v, int len\)) 122.318 Tj 0 -85.4403 Td (2256 {) 26.2111 Tj 0 -94.9336 Td (2257 struct run *r, *rend, **rp, *p, *pend;) 196.583 Tj 0 -104.427 Td (2258 ) 21.8426 Tj 0 -113.92 Td (2259 if\(len <= 0 || len % PAGE\)) 144.161 Tj 0 -123.414 Td (2260 panic\("kfree"\);) 104.844 Tj 0 -132.907 Td (2261 ) 21.8426 Tj 0 -142.4 Td (2262 // Fill with junk to catch dangling refs.) 209.689 Tj 0 -151.894 Td (2263 memset\(v, 1, len\);) 109.213 Tj 0 -161.387 Td (2264 ) 21.8426 Tj 0 -170.88 Td (2265 acquire\(&kalloc_lock\);) 126.687 Tj 0 -180.374 Td (2266 p = \(struct run*\)v;) 113.581 Tj 0 -189.867 Td (2267 pend = \(struct run*\)\(v + len\);) 161.635 Tj 0 -199.361 Td (2268 for\(rp=&freelist; \(r=*rp\) != 0 && r <= pend; rp=&r->n\ ext\){) 283.953 Tj 0 -208.854 Td (2269 rend = \(struct run*\)\(\(char*\)r + r->len\);) 214.057 Tj 0 -218.347 Td (2270 if\(r <= p && p < rend\)) 135.424 Tj 0 -227.841 Td (2271 panic\("freeing free page"\);) 166.004 Tj 0 -237.334 Td (2272 if\(pend == r\){ // p next to r: replace r with p) 249.005 Tj 0 -246.827 Td (2273 p->len = len + r->len;) 144.161 Tj 0 -256.321 Td (2274 p->next = r->next;) 126.687 Tj 0 -265.814 Td (2275 *rp = p;) 83.0018 Tj 0 -275.307 Td (2276 goto out;) 87.3703 Tj 0 -284.801 Td (2277 }) 43.6851 Tj 0 -294.294 Td (2278 if\(rend == p\){ // r next to p: replace p with r) 249.005 Tj 0 -303.788 Td (2279 r->len += len;) 109.213 Tj 0 -313.281 Td (2280 if\(r->next && r->next == pend\){ // r now next to \ r->next?) 301.427 Tj 0 -322.774 Td (2281 r->len += r->next->len;) 157.267 Tj 0 -332.268 Td (2282 r->next = r->next->next;) 161.635 Tj 0 -341.761 Td (2283 }) 52.4222 Tj 0 -351.254 Td (2284 goto out;) 87.3703 Tj 0 -360.748 Td (2285 }) 43.6851 Tj 0 -370.241 Td (2286 }) 34.9481 Tj 0 -379.734 Td (2287 // Insert p before r in list.) 157.267 Tj 0 -389.228 Td (2288 p->len = len;) 87.3703 Tj 0 -398.721 Td (2289 p->next = r;) 83.0018 Tj 0 -408.214 Td (2290 *rp = p;) 65.5277 Tj 0 -417.708 Td (2291 ) 21.8426 Tj 0 -427.201 Td (2292 out:) 43.6851 Tj 0 -436.695 Td (2293 release\(&kalloc_lock\);) 126.687 Tj 0 -446.188 Td (2294 }) 26.2111 Tj 0 -455.681 Td (2295 ) 21.8426 Tj 0 -465.175 Td (2296 ) 21.8426 Tj 0 -474.668 Td (2297 ) 21.8426 Tj 0 -484.161 Td (2298 ) 21.8426 Tj 0 -493.655 Td (2299 ) 21.8426 Tj 0 -522.135 Td (Sheet 22) 34.9481 Tj Q Q Q Q showpage %%PageTrailer pdfEndPage %%Page: 30 30 %%BeginPageSetup %%PageOrientation: Landscape pdfStartPage 180 rotate -612 -792 translate 0 0 612 792 re W %%EndPageSetup [] 0 d 1 i 0 j 0 J 10 M 1 w /DeviceGray {} cs [0] sc /DeviceGray {} CS [0] SC false op false OP 0 0 612 792 re W q q [0.1 0 0 0.1 0 0] cm q 180 3960 5760 3460 re W /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [10 0 0 10 0 0] cm [1 0 0 1 0 0] Tm 0 0 Td [0 -0.967854 1 0 564.72 738.864] Tm 0 0 Td /F9_0 8.70222 Tf (Aug 30 10:08 2007 xv6/kalloc.c Page 3) 170.372 Tj 0 -28.4801 Td (2300 // Allocate n bytes of physical memory.) 192.215 Tj 0 -37.9735 Td (2301 // Returns a kernel-segment pointer.) 179.109 Tj 0 -47.4668 Td (2302 // Returns 0 if the memory cannot be allocated.) 227.163 Tj 0 -56.9602 Td (2303 char*) 43.6851 Tj 0 -66.4535 Td (2304 kalloc\(int n\)) 78.6333 Tj 0 -75.9469 Td (2305 {) 26.2111 Tj 0 -85.4403 Td (2306 char *p;) 65.5277 Tj 0 -94.9336 Td (2307 struct run *r, **rp;) 117.95 Tj 0 -104.427 Td (2308 ) 21.8426 Tj 0 -113.92 Td (2309 if\(n % PAGE || n <= 0\)) 126.687 Tj 0 -123.414 Td (2310 panic\("kalloc"\);) 109.213 Tj 0 -132.907 Td (2311 ) 21.8426 Tj 0 -142.4 Td (2312 acquire\(&kalloc_lock\);) 126.687 Tj 0 -151.894 Td (2313 for\(rp=&freelist; \(r=*rp\) != 0; rp=&r->next\){) 227.163 Tj 0 -161.387 Td (2314 if\(r->len == n\){) 109.213 Tj 0 -170.88 Td (2315 *rp = r->next;) 109.213 Tj 0 -180.374 Td (2316 release\(&kalloc_lock\);) 144.161 Tj 0 -189.867 Td (2317 return \(char*\)r;) 117.95 Tj 0 -199.361 Td (2318 }) 43.6851 Tj 0 -208.854 Td (2319 if\(r->len > n\){) 104.844 Tj 0 -218.347 Td (2320 r->len -= n;) 100.476 Tj 0 -227.841 Td (2321 p = \(char*\)r + r->len;) 144.161 Tj 0 -237.334 Td (2322 release\(&kalloc_lock\);) 144.161 Tj 0 -246.827 Td (2323 return p;) 87.3703 Tj 0 -256.321 Td (2324 }) 43.6851 Tj 0 -265.814 Td (2325 }) 34.9481 Tj 0 -275.307 Td (2326 release\(&kalloc_lock\);) 126.687 Tj 0 -284.801 Td (2327 ) 21.8426 Tj 0 -294.294 Td (2328 cprintf\("kalloc: out of memory\\n"\);) 183.478 Tj 0 -303.788 Td (2329 return 0;) 69.8962 Tj 0 -313.281 Td (2330 }) 26.2111 Tj 0 -322.774 Td (2331 ) 21.8426 Tj 0 -332.268 Td (2332 ) 21.8426 Tj 0 -341.761 Td (2333 ) 21.8426 Tj 0 -351.254 Td (2334 ) 21.8426 Tj 0 -360.748 Td (2335 ) 21.8426 Tj 0 -370.241 Td (2336 ) 21.8426 Tj 0 -379.734 Td (2337 ) 21.8426 Tj 0 -389.228 Td (2338 ) 21.8426 Tj 0 -398.721 Td (2339 ) 21.8426 Tj 0 -408.214 Td (2340 ) 21.8426 Tj 0 -417.708 Td (2341 ) 21.8426 Tj 0 -427.201 Td (2342 ) 21.8426 Tj 0 -436.695 Td (2343 ) 21.8426 Tj 0 -446.188 Td (2344 ) 21.8426 Tj 0 -455.681 Td (2345 ) 21.8426 Tj 0 -465.175 Td (2346 ) 21.8426 Tj 0 -474.668 Td (2347 ) 21.8426 Tj 0 -484.161 Td (2348 ) 21.8426 Tj 0 -493.655 Td (2349 ) 21.8426 Tj 0 -522.135 Td (Sheet 23) 34.9481 Tj Q Q q 180 500 5760 3460 re W /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [10 0 0 10 0 0] cm [1 0 0 1 0 0] Tm 0 0 Td [0 -0.967854 1 0 564.72 392.864] Tm 0 0 Td /F9_0 8.70222 Tf (Aug 30 10:08 2007 xv6/traps.h Page 1) 166.004 Tj 0 -28.4801 Td (2350 // x86 trap and interrupt constants.) 179.109 Tj 0 -37.9735 Td (2351 ) 21.8426 Tj 0 -47.4668 Td (2352 // Processor-defined:) 113.581 Tj 0 -56.9602 Td (2353 #define T_DIVIDE 0 // divide error) 227.163 Tj 0 -66.4535 Td (2354 #define T_DEBUG 1 // debug exception) 240.268 Tj 0 -75.9469 Td (2355 #define T_NMI 2 // non-maskable interrupt) 270.848 Tj 0 -85.4403 Td (2356 #define T_BRKPT 3 // breakpoint) 218.426 Tj 0 -94.9336 Td (2357 #define T_OFLOW 4 // overflow) 209.689 Tj 0 -104.427 Td (2358 #define T_BOUND 5 // bounds check) 227.163 Tj 0 -113.92 Td (2359 #define T_ILLOP 6 // illegal opcode) 235.9 Tj 0 -123.414 Td (2360 #define T_DEVICE 7 // device not available) 262.111 Tj 0 -132.907 Td (2361 #define T_DBLFLT 8 // double fault) 227.163 Tj 0 -142.4 Td (2362 // #define T_COPROC 9 // reserved \(not used sin\ ce 486\)) 301.427 Tj 0 -151.894 Td (2363 #define T_TSS 10 // invalid task switch seg\ ment) 292.69 Tj 0 -161.387 Td (2364 #define T_SEGNP 11 // segment not present) 257.742 Tj 0 -170.88 Td (2365 #define T_STACK 12 // stack exception) 240.268 Tj 0 -180.374 Td (2366 #define T_GPFLT 13 // general protection faul\ t) 279.585 Tj 0 -189.867 Td (2367 #define T_PGFLT 14 // page fault) 218.426 Tj 0 -199.361 Td (2368 // #define T_RES 15 // reserved) 209.689 Tj 0 -208.854 Td (2369 #define T_FPERR 16 // floating point error) 262.111 Tj 0 -218.347 Td (2370 #define T_ALIGN 17 // aligment check) 235.9 Tj 0 -227.841 Td (2371 #define T_MCHK 18 // machine check) 231.531 Tj 0 -237.334 Td (2372 #define T_SIMDERR 19 // SIMD floating point err\ or) 283.953 Tj 0 -246.827 Td (2373 ) 21.8426 Tj 0 -256.321 Td (2374 // These are arbitrarily chosen, but with care not to over\ lap) 288.322 Tj 0 -265.814 Td (2375 // processor defined exceptions or interrupt vectors.) 253.374 Tj 0 -275.307 Td (2376 #define T_SYSCALL 48 // system call) 222.794 Tj 0 -284.801 Td (2377 #define T_DEFAULT 500 // catchall) 209.689 Tj 0 -294.294 Td (2378 ) 21.8426 Tj 0 -303.788 Td (2379 #define IRQ_OFFSET 32 // IRQ 0 corresponds to in\ t IRQ_OFFSET) 327.639 Tj 0 -313.281 Td (2380 ) 21.8426 Tj 0 -322.774 Td (2381 #define IRQ_TIMER 0) 135.424 Tj 0 -332.268 Td (2382 #define IRQ_KBD 1) 135.424 Tj 0 -341.761 Td (2383 #define IRQ_IDE 14) 135.424 Tj 0 -351.254 Td (2384 #define IRQ_ERROR 19) 135.424 Tj 0 -360.748 Td (2385 #define IRQ_SPURIOUS 31) 135.424 Tj 0 -370.241 Td (2386 ) 21.8426 Tj 0 -379.734 Td (2387 ) 21.8426 Tj 0 -389.228 Td (2388 ) 21.8426 Tj 0 -398.721 Td (2389 ) 21.8426 Tj 0 -408.214 Td (2390 ) 21.8426 Tj 0 -417.708 Td (2391 ) 21.8426 Tj 0 -427.201 Td (2392 ) 21.8426 Tj 0 -436.695 Td (2393 ) 21.8426 Tj 0 -446.188 Td (2394 ) 21.8426 Tj 0 -455.681 Td (2395 ) 21.8426 Tj 0 -465.175 Td (2396 ) 21.8426 Tj 0 -474.668 Td (2397 ) 21.8426 Tj 0 -484.161 Td (2398 ) 21.8426 Tj 0 -493.655 Td (2399 ) 21.8426 Tj 0 -522.135 Td (Sheet 23) 34.9481 Tj Q Q Q Q showpage %%PageTrailer pdfEndPage %%Page: 31 31 %%BeginPageSetup %%PageOrientation: Landscape pdfStartPage 180 rotate -612 -792 translate 0 0 612 792 re W %%EndPageSetup [] 0 d 1 i 0 j 0 J 10 M 1 w /DeviceGray {} cs [0] sc /DeviceGray {} CS [0] SC false op false OP 0 0 612 792 re W q q [0.1 0 0 0.1 0 0] cm q 180 3960 5760 3460 re W /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [10 0 0 10 0 0] cm [1 0 0 1 0 0] Tm 0 0 Td [0 -0.967854 1 0 564.72 738.864] Tm 0 0 Td /F9_0 8.70222 Tf (Aug 30 10:08 2007 xv6/vectors.pl Page 1) 179.109 Tj 0 -28.4801 Td (2400 #!/usr/bin/perl -w) 100.476 Tj 0 -37.9735 Td (2401 ) 21.8426 Tj 0 -47.4668 Td (2402 # Generate vectors.S, the trap/interrupt entry points.) 257.742 Tj 0 -56.9602 Td (2403 # There has to be one entry point per interrupt number) 257.742 Tj 0 -66.4535 Td (2404 # since otherwise there's no way for trap\(\) to discover) 262.111 Tj 0 -75.9469 Td (2405 # the interrupt number.) 122.318 Tj 0 -85.4403 Td (2406 ) 21.8426 Tj 0 -94.9336 Td (2407 print "# generated by vectors.pl - do not edit\\n";) 240.268 Tj 0 -104.427 Td (2408 print "# handlers\\n";) 113.581 Tj 0 -113.92 Td (2409 print ".text\\n";) 91.7388 Tj 0 -123.414 Td (2410 print ".globl alltraps\\n";) 135.424 Tj 0 -132.907 Td (2411 for\(my $i = 0; $i < 256; $i++\){) 157.267 Tj 0 -142.4 Td (2412 print ".globl vector$i\\n";) 152.898 Tj 0 -151.894 Td (2413 print "vector$i:\\n";) 126.687 Tj 0 -161.387 Td (2414 if\(\($i < 8 || $i > 14\) && $i != 17\){) 196.583 Tj 0 -170.88 Td (2415 print " pushl \\$0\\n";) 152.898 Tj 0 -180.374 Td (2416 }) 43.6851 Tj 0 -189.867 Td (2417 print " pushl \\$$i\\n";) 139.792 Tj 0 -199.361 Td (2418 print " jmp alltraps\\n";) 148.529 Tj 0 -208.854 Td (2419 }) 26.2111 Tj 0 -218.347 Td (2420 ) 21.8426 Tj 0 -227.841 Td (2421 print "\\n# vector table\\n";) 139.792 Tj 0 -237.334 Td (2422 print ".data\\n";) 91.7388 Tj 0 -246.827 Td (2423 print ".globl vectors\\n";) 131.055 Tj 0 -256.321 Td (2424 print "vectors:\\n";) 104.844 Tj 0 -265.814 Td (2425 for\(my $i = 0; $i < 256; $i++\){) 157.267 Tj 0 -275.307 Td (2426 print " .long vector$i\\n";) 157.267 Tj 0 -284.801 Td (2427 }) 26.2111 Tj 0 -294.294 Td (2428 ) 21.8426 Tj 0 -303.788 Td (2429 # sample output:) 91.7388 Tj 0 -313.281 Td (2430 # # handlers) 83.0018 Tj 0 -322.774 Td (2431 # .text) 61.1592 Tj 0 -332.268 Td (2432 # .globl alltraps) 104.844 Tj 0 -341.761 Td (2433 # .globl vector0) 100.476 Tj 0 -351.254 Td (2434 # vector0:) 74.2647 Tj 0 -360.748 Td (2435 # pushl $0) 83.0018 Tj 0 -370.241 Td (2436 # pushl $0) 83.0018 Tj 0 -379.734 Td (2437 # jmp alltraps) 100.476 Tj 0 -389.228 Td (2438 # ...) 52.4222 Tj 0 -398.721 Td (2439 #) 26.2111 Tj 0 -408.214 Td (2440 # # vector table) 100.476 Tj 0 -417.708 Td (2441 # .data) 61.1592 Tj 0 -427.201 Td (2442 # .globl vectors) 100.476 Tj 0 -436.695 Td (2443 # vectors:) 74.2647 Tj 0 -446.188 Td (2444 # .long vector0) 104.844 Tj 0 -455.681 Td (2445 # .long vector1) 104.844 Tj 0 -465.175 Td (2446 # .long vector2) 104.844 Tj 0 -474.668 Td (2447 # ...) 52.4222 Tj 0 -484.161 Td (2448 ) 21.8426 Tj 0 -493.655 Td (2449 ) 21.8426 Tj 0 -522.135 Td (Sheet 24) 34.9481 Tj Q Q q 180 500 5760 3460 re W /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [10 0 0 10 0 0] cm [1 0 0 1 0 0] Tm 0 0 Td [0 -0.967854 1 0 564.72 392.864] Tm 0 0 Td /F9_0 8.70222 Tf (Aug 30 10:08 2007 xv6/trapasm.S Page 1) 174.741 Tj 0 -28.4801 Td (2450 .text) 43.6851 Tj 0 -37.9735 Td (2451 ) 21.8426 Tj 0 -47.4668 Td (2452 .set SEG_KDATA_SEL, 0x10 # selector for SEG_KDATA) 244.637 Tj 0 -56.9602 Td (2453 ) 21.8426 Tj 0 -66.4535 Td (2454 # vectors.S sends all traps here.) 174.741 Tj 0 -75.9469 Td (2455 .globl alltraps) 87.3703 Tj 0 -85.4403 Td (2456 alltraps:) 61.1592 Tj 0 -94.9336 Td (2457 # Build trap frame.) 113.581 Tj 0 -104.427 Td (2458 pushl %ds) 69.8962 Tj 0 -113.92 Td (2459 pushl %es) 69.8962 Tj 0 -123.414 Td (2460 pushal) 56.7907 Tj 0 -132.907 Td (2461 ) 21.8426 Tj 0 -142.4 Td (2462 # Set up data segments.) 131.055 Tj 0 -151.894 Td (2463 movl $SEG_KDATA_SEL, %eax) 139.792 Tj 0 -161.387 Td (2464 movw %ax,%ds) 83.0018 Tj 0 -170.88 Td (2465 movw %ax,%es) 83.0018 Tj 0 -180.374 Td (2466 ) 21.8426 Tj 0 -189.867 Td (2467 # Call trap\(tf\), where tf=%esp) 161.635 Tj 0 -199.361 Td (2468 pushl %esp) 74.2647 Tj 0 -208.854 Td (2469 call trap) 69.8962 Tj 0 -218.347 Td (2470 addl $4, %esp) 87.3703 Tj 0 -227.841 Td (2471 ) 21.8426 Tj 0 -237.334 Td (2472 # Return falls through to trapret...) 187.846 Tj 0 -246.827 Td (2473 .globl trapret) 83.0018 Tj 0 -256.321 Td (2474 trapret:) 56.7907 Tj 0 -265.814 Td (2475 popal) 52.4222 Tj 0 -275.307 Td (2476 popl %es) 65.5277 Tj 0 -284.801 Td (2477 popl %ds) 65.5277 Tj 0 -294.294 Td (2478 addl $0x8, %esp # trapno and errcode) 192.215 Tj 0 -303.788 Td (2479 iret) 48.0537 Tj 0 -313.281 Td (2480 ) 21.8426 Tj 0 -322.774 Td (2481 # A forked process switches to user mode by calling) 253.374 Tj 0 -332.268 Td (2482 # forkret1\(tf\), where tf is the trap frame to use.) 249.005 Tj 0 -341.761 Td (2483 .globl forkret1) 87.3703 Tj 0 -351.254 Td (2484 forkret1:) 61.1592 Tj 0 -360.748 Td (2485 movl 4\(%esp\), %esp) 109.213 Tj 0 -370.241 Td (2486 jmp trapret) 78.6333 Tj 0 -379.734 Td (2487 ) 21.8426 Tj 0 -389.228 Td (2488 ) 21.8426 Tj 0 -398.721 Td (2489 ) 21.8426 Tj 0 -408.214 Td (2490 ) 21.8426 Tj 0 -417.708 Td (2491 ) 21.8426 Tj 0 -427.201 Td (2492 ) 21.8426 Tj 0 -436.695 Td (2493 ) 21.8426 Tj 0 -446.188 Td (2494 ) 21.8426 Tj 0 -455.681 Td (2495 ) 21.8426 Tj 0 -465.175 Td (2496 ) 21.8426 Tj 0 -474.668 Td (2497 ) 21.8426 Tj 0 -484.161 Td (2498 ) 21.8426 Tj 0 -493.655 Td (2499 ) 21.8426 Tj 0 -522.135 Td (Sheet 24) 34.9481 Tj Q Q Q Q showpage %%PageTrailer pdfEndPage %%Page: 32 32 %%BeginPageSetup %%PageOrientation: Landscape pdfStartPage 180 rotate -612 -792 translate 0 0 612 792 re W %%EndPageSetup [] 0 d 1 i 0 j 0 J 10 M 1 w /DeviceGray {} cs [0] sc /DeviceGray {} CS [0] SC false op false OP 0 0 612 792 re W q q [0.1 0 0 0.1 0 0] cm q 180 3960 5760 3460 re W /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [10 0 0 10 0 0] cm [1 0 0 1 0 0] Tm 0 0 Td [0 -0.967854 1 0 564.72 738.864] Tm 0 0 Td /F9_0 8.70222 Tf (Aug 30 10:08 2007 xv6/trap.c Page 1) 161.635 Tj 0 -28.4801 Td (2500 #include "types.h") 100.476 Tj 0 -37.9735 Td (2501 #include "defs.h") 96.1073 Tj 0 -47.4668 Td (2502 #include "param.h") 100.476 Tj 0 -56.9602 Td (2503 #include "mmu.h") 91.7388 Tj 0 -66.4535 Td (2504 #include "proc.h") 96.1073 Tj 0 -75.9469 Td (2505 #include "x86.h") 91.7388 Tj 0 -85.4403 Td (2506 #include "traps.h") 100.476 Tj 0 -94.9336 Td (2507 #include "spinlock.h") 113.581 Tj 0 -104.427 Td (2508 ) 21.8426 Tj 0 -113.92 Td (2509 // Interrupt descriptor table \(shared by all CPUs\).) 244.637 Tj 0 -123.414 Td (2510 struct gatedesc idt[256];) 131.055 Tj 0 -132.907 Td (2511 extern uint vectors[]; // in vectors.S: array of 256 entr\ y pointers) 318.902 Tj 0 -142.4 Td (2512 struct spinlock tickslock;) 135.424 Tj 0 -151.894 Td (2513 int ticks;) 65.5277 Tj 0 -161.387 Td (2514 ) 21.8426 Tj 0 -170.88 Td (2515 void) 39.3166 Tj 0 -180.374 Td (2516 tvinit\(void\)) 74.2647 Tj 0 -189.867 Td (2517 {) 26.2111 Tj 0 -199.361 Td (2518 int i;) 56.7907 Tj 0 -208.854 Td (2519 ) 21.8426 Tj 0 -218.347 Td (2520 for\(i = 0; i < 256; i++\)) 135.424 Tj 0 -227.841 Td (2521 SETGATE\(idt[i], 0, SEG_KCODE<<3, vectors[i], 0\);) 249.005 Tj 0 -237.334 Td (2522 SETGATE\(idt[T_SYSCALL], 0, SEG_KCODE<<3, vectors[T_SYSC\ ALL], DPL_USER\);) 340.744 Tj 0 -246.827 Td (2523 ) 21.8426 Tj 0 -256.321 Td (2524 initlock\(&tickslock, "time"\);) 157.267 Tj 0 -265.814 Td (2525 }) 26.2111 Tj 0 -275.307 Td (2526 ) 21.8426 Tj 0 -284.801 Td (2527 void) 39.3166 Tj 0 -294.294 Td (2528 idtinit\(void\)) 78.6333 Tj 0 -303.788 Td (2529 {) 26.2111 Tj 0 -313.281 Td (2530 lidt\(idt, sizeof\(idt\)\);) 131.055 Tj 0 -322.774 Td (2531 }) 26.2111 Tj 0 -332.268 Td (2532 ) 21.8426 Tj 0 -341.761 Td (2533 void) 39.3166 Tj 0 -351.254 Td (2534 trap\(struct trapframe *tf\)) 135.424 Tj 0 -360.748 Td (2535 {) 26.2111 Tj 0 -370.241 Td (2536 if\(tf->trapno == T_SYSCALL\){) 152.898 Tj 0 -379.734 Td (2537 if\(cp->killed\)) 100.476 Tj 0 -389.228 Td (2538 exit\(\);) 78.6333 Tj 0 -398.721 Td (2539 cp->tf = tf;) 91.7388 Tj 0 -408.214 Td (2540 syscall\(\);) 83.0018 Tj 0 -417.708 Td (2541 if\(cp->killed\)) 100.476 Tj 0 -427.201 Td (2542 exit\(\);) 78.6333 Tj 0 -436.695 Td (2543 return;) 69.8962 Tj 0 -446.188 Td (2544 }) 34.9481 Tj 0 -455.681 Td (2545 ) 21.8426 Tj 0 -465.175 Td (2546 // Increment nlock to make sure interrupts stay off) 253.374 Tj 0 -474.668 Td (2547 // during interrupt handler. Decrement before returning\ .) 279.585 Tj 0 -484.161 Td (2548 cpus[cpu\(\)].nlock++;) 117.95 Tj 0 -493.655 Td (2549 ) 21.8426 Tj 0 -522.135 Td (Sheet 25) 34.9481 Tj Q Q q 180 500 5760 3460 re W /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [10 0 0 10 0 0] cm [1 0 0 1 0 0] Tm 0 0 Td [0 -0.967854 1 0 564.72 392.864] Tm 0 0 Td /F9_0 8.70222 Tf (Aug 30 10:08 2007 xv6/trap.c Page 2) 161.635 Tj 0 -28.4801 Td (2550 switch\(tf->trapno\){) 113.581 Tj 0 -37.9735 Td (2551 case IRQ_OFFSET + IRQ_TIMER:) 152.898 Tj 0 -47.4668 Td (2552 if\(cpu\(\) == 0\){) 104.844 Tj 0 -56.9602 Td (2553 acquire\(&tickslock\);) 135.424 Tj 0 -66.4535 Td (2554 ticks++;) 83.0018 Tj 0 -75.9469 Td (2555 wakeup\(&ticks\);) 113.581 Tj 0 -85.4403 Td (2556 release\(&tickslock\);) 135.424 Tj 0 -94.9336 Td (2557 }) 43.6851 Tj 0 -104.427 Td (2558 lapic_eoi\(\);) 91.7388 Tj 0 -113.92 Td (2559 break;) 65.5277 Tj 0 -123.414 Td (2560 case IRQ_OFFSET + IRQ_IDE:) 144.161 Tj 0 -132.907 Td (2561 ide_intr\(\);) 87.3703 Tj 0 -142.4 Td (2562 lapic_eoi\(\);) 91.7388 Tj 0 -151.894 Td (2563 break;) 65.5277 Tj 0 -161.387 Td (2564 case IRQ_OFFSET + IRQ_KBD:) 144.161 Tj 0 -170.88 Td (2565 kbd_intr\(\);) 87.3703 Tj 0 -180.374 Td (2566 lapic_eoi\(\);) 91.7388 Tj 0 -189.867 Td (2567 break;) 65.5277 Tj 0 -199.361 Td (2568 case IRQ_OFFSET + IRQ_SPURIOUS:) 166.004 Tj 0 -208.854 Td (2569 cprintf\("spurious interrupt from cpu %d eip %x\\n", c\ pu\(\), tf->eip\);) 332.007 Tj 0 -218.347 Td (2570 lapic_eoi\(\);) 91.7388 Tj 0 -227.841 Td (2571 break;) 65.5277 Tj 0 -237.334 Td (2572 ) 21.8426 Tj 0 -246.827 Td (2573 default:) 65.5277 Tj 0 -256.321 Td (2574 if\(cp == 0\){) 91.7388 Tj 0 -265.814 Td (2575 // Otherwise it's our mistake.) 179.109 Tj 0 -275.307 Td (2576 cprintf\("unexpected trap %d from cpu %d eip %x\\n",) 266.479 Tj 0 -284.801 Td (2577 tf->trapno, cpu\(\), tf->eip\);) 205.32 Tj 0 -294.294 Td (2578 panic\("trap"\);) 109.213 Tj 0 -303.788 Td (2579 }) 43.6851 Tj 0 -313.281 Td (2580 // Assume process divided by zero or dereferenced null\ , etc.) 301.427 Tj 0 -322.774 Td (2581 cprintf\("pid %d %s: trap %d err %d on cpu %d eip %x -\ - kill proc\\n",) 336.376 Tj 0 -332.268 Td (2582 cp->pid, cp->name, tf->trapno, tf->err, cpu\(\)\ , tf->eip\);) 318.902 Tj 0 -341.761 Td (2583 cp->killed = 1;) 104.844 Tj 0 -351.254 Td (2584 }) 34.9481 Tj 0 -360.748 Td (2585 cpus[cpu\(\)].nlock--;) 117.95 Tj 0 -370.241 Td (2586 ) 21.8426 Tj 0 -379.734 Td (2587 // Force process exit if it has been killed and is in us\ er space.) 314.533 Tj 0 -389.228 Td (2588 // \(If it is still executing in the kernel, let it keep\ running) 305.796 Tj 0 -398.721 Td (2589 // until it gets to the regular system call return.\)) 257.742 Tj 0 -408.214 Td (2590 if\(cp && cp->killed && \(tf->cs&3\) == DPL_USER\)) 231.531 Tj 0 -417.708 Td (2591 exit\(\);) 69.8962 Tj 0 -427.201 Td (2592 ) 21.8426 Tj 0 -436.695 Td (2593 // Force process to give up CPU on clock tick.) 231.531 Tj 0 -446.188 Td (2594 // If interrupts were on while locks held, would need to\ check nlock.) 332.007 Tj 0 -455.681 Td (2595 if\(cp && cp->state == RUNNING && tf->trapno == IRQ_OFFS\ ET+IRQ_TIMER\)) 327.639 Tj 0 -465.175 Td (2596 yield\(\);) 74.2647 Tj 0 -474.668 Td (2597 }) 26.2111 Tj 0 -484.161 Td (2598 ) 21.8426 Tj 0 -493.655 Td (2599 ) 21.8426 Tj 0 -522.135 Td (Sheet 25) 34.9481 Tj Q Q Q Q showpage %%PageTrailer pdfEndPage %%Page: 33 33 %%BeginPageSetup %%PageOrientation: Landscape pdfStartPage 180 rotate -612 -792 translate 0 0 612 792 re W %%EndPageSetup [] 0 d 1 i 0 j 0 J 10 M 1 w /DeviceGray {} cs [0] sc /DeviceGray {} CS [0] SC false op false OP 0 0 612 792 re W q q [0.1 0 0 0.1 0 0] cm q 180 3960 5760 3460 re W /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [10 0 0 10 0 0] cm [1 0 0 1 0 0] Tm 0 0 Td [0 -0.967854 1 0 564.72 738.864] Tm 0 0 Td /F9_0 8.70222 Tf (Aug 30 10:08 2007 xv6/syscall.h Page 1) 174.741 Tj 0 -28.4801 Td (2600 // System call numbers) 117.95 Tj 0 -37.9735 Td (2601 #define SYS_fork 1) 113.581 Tj 0 -47.4668 Td (2602 #define SYS_exit 2) 113.581 Tj 0 -56.9602 Td (2603 #define SYS_wait 3) 113.581 Tj 0 -66.4535 Td (2604 #define SYS_pipe 4) 113.581 Tj 0 -75.9469 Td (2605 #define SYS_write 5) 113.581 Tj 0 -85.4403 Td (2606 #define SYS_read 6) 113.581 Tj 0 -94.9336 Td (2607 #define SYS_close 7) 113.581 Tj 0 -104.427 Td (2608 #define SYS_kill 8) 113.581 Tj 0 -113.92 Td (2609 #define SYS_exec 9) 113.581 Tj 0 -123.414 Td (2610 #define SYS_open 10) 113.581 Tj 0 -132.907 Td (2611 #define SYS_mknod 11) 113.581 Tj 0 -142.4 Td (2612 #define SYS_unlink 12) 113.581 Tj 0 -151.894 Td (2613 #define SYS_fstat 13) 113.581 Tj 0 -161.387 Td (2614 #define SYS_link 14) 113.581 Tj 0 -170.88 Td (2615 #define SYS_mkdir 15) 113.581 Tj 0 -180.374 Td (2616 #define SYS_chdir 16) 113.581 Tj 0 -189.867 Td (2617 #define SYS_dup 17) 113.581 Tj 0 -199.361 Td (2618 #define SYS_getpid 18) 113.581 Tj 0 -208.854 Td (2619 #define SYS_sbrk 19) 113.581 Tj 0 -218.347 Td (2620 #define SYS_sleep 20) 113.581 Tj 0 -227.841 Td (2621 ) 21.8426 Tj 0 -237.334 Td (2622 ) 21.8426 Tj 0 -246.827 Td (2623 ) 21.8426 Tj 0 -256.321 Td (2624 ) 21.8426 Tj 0 -265.814 Td (2625 ) 21.8426 Tj 0 -275.307 Td (2626 ) 21.8426 Tj 0 -284.801 Td (2627 ) 21.8426 Tj 0 -294.294 Td (2628 ) 21.8426 Tj 0 -303.788 Td (2629 ) 21.8426 Tj 0 -313.281 Td (2630 ) 21.8426 Tj 0 -322.774 Td (2631 ) 21.8426 Tj 0 -332.268 Td (2632 ) 21.8426 Tj 0 -341.761 Td (2633 ) 21.8426 Tj 0 -351.254 Td (2634 ) 21.8426 Tj 0 -360.748 Td (2635 ) 21.8426 Tj 0 -370.241 Td (2636 ) 21.8426 Tj 0 -379.734 Td (2637 ) 21.8426 Tj 0 -389.228 Td (2638 ) 21.8426 Tj 0 -398.721 Td (2639 ) 21.8426 Tj 0 -408.214 Td (2640 ) 21.8426 Tj 0 -417.708 Td (2641 ) 21.8426 Tj 0 -427.201 Td (2642 ) 21.8426 Tj 0 -436.695 Td (2643 ) 21.8426 Tj 0 -446.188 Td (2644 ) 21.8426 Tj 0 -455.681 Td (2645 ) 21.8426 Tj 0 -465.175 Td (2646 ) 21.8426 Tj 0 -474.668 Td (2647 ) 21.8426 Tj 0 -484.161 Td (2648 ) 21.8426 Tj 0 -493.655 Td (2649 ) 21.8426 Tj 0 -522.135 Td (Sheet 26) 34.9481 Tj Q Q q 180 500 5760 3460 re W /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [10 0 0 10 0 0] cm [1 0 0 1 0 0] Tm 0 0 Td [0 -0.967854 1 0 564.72 392.864] Tm 0 0 Td /F9_0 8.70222 Tf (Aug 30 10:08 2007 xv6/syscall.c Page 1) 174.741 Tj 0 -28.4801 Td (2650 #include "types.h") 100.476 Tj 0 -37.9735 Td (2651 #include "defs.h") 96.1073 Tj 0 -47.4668 Td (2652 #include "param.h") 100.476 Tj 0 -56.9602 Td (2653 #include "mmu.h") 91.7388 Tj 0 -66.4535 Td (2654 #include "proc.h") 96.1073 Tj 0 -75.9469 Td (2655 #include "x86.h") 91.7388 Tj 0 -85.4403 Td (2656 #include "syscall.h") 109.213 Tj 0 -94.9336 Td (2657 ) 21.8426 Tj 0 -104.427 Td (2658 // User code makes a system call with INT T_SYSCALL.) 249.005 Tj 0 -113.92 Td (2659 // System call number in %eax.) 152.898 Tj 0 -123.414 Td (2660 // Arguments on the stack, from the user call to the C) 257.742 Tj 0 -132.907 Td (2661 // library system call function. The saved user %esp point\ s) 279.585 Tj 0 -142.4 Td (2662 // to a saved program counter, and then the first argument\ .) 279.585 Tj 0 -151.894 Td (2663 ) 21.8426 Tj 0 -161.387 Td (2664 // Fetch the int at addr from process p.) 196.583 Tj 0 -170.88 Td (2665 int) 34.9481 Tj 0 -180.374 Td (2666 fetchint\(struct proc *p, uint addr, int *ip\)) 214.057 Tj 0 -189.867 Td (2667 {) 26.2111 Tj 0 -199.361 Td (2668 if\(addr >= p->sz || addr+4 > p->sz\)) 183.478 Tj 0 -208.854 Td (2669 return -1;) 83.0018 Tj 0 -218.347 Td (2670 *ip = *\(int*\)\(p->mem + addr\);) 157.267 Tj 0 -227.841 Td (2671 return 0;) 69.8962 Tj 0 -237.334 Td (2672 }) 26.2111 Tj 0 -246.827 Td (2673 ) 21.8426 Tj 0 -256.321 Td (2674 // Fetch the nul-terminated string at addr from process p.) 275.216 Tj 0 -265.814 Td (2675 // Doesn't actually copy the string - just sets *pp to poi\ nt at it.) 314.533 Tj 0 -275.307 Td (2676 // Returns length of string, not including nul.) 227.163 Tj 0 -284.801 Td (2677 int) 34.9481 Tj 0 -294.294 Td (2678 fetchstr\(struct proc *p, uint addr, char **pp\)) 222.794 Tj 0 -303.788 Td (2679 {) 26.2111 Tj 0 -313.281 Td (2680 char *s, *ep;) 87.3703 Tj 0 -322.774 Td (2681 ) 21.8426 Tj 0 -332.268 Td (2682 if\(addr >= p->sz\)) 104.844 Tj 0 -341.761 Td (2683 return -1;) 83.0018 Tj 0 -351.254 Td (2684 *pp = p->mem + addr;) 117.95 Tj 0 -360.748 Td (2685 ep = p->mem + p->sz;) 117.95 Tj 0 -370.241 Td (2686 for\(s = *pp; s < ep; s++\)) 139.792 Tj 0 -379.734 Td (2687 if\(*s == 0\)) 87.3703 Tj 0 -389.228 Td (2688 return s - *pp;) 113.581 Tj 0 -398.721 Td (2689 return -1;) 74.2647 Tj 0 -408.214 Td (2690 }) 26.2111 Tj 0 -417.708 Td (2691 ) 21.8426 Tj 0 -427.201 Td (2692 // Fetch the nth 32-bit system call argument.) 218.426 Tj 0 -436.695 Td (2693 int) 34.9481 Tj 0 -446.188 Td (2694 argint\(int n, int *ip\)) 117.95 Tj 0 -455.681 Td (2695 {) 26.2111 Tj 0 -465.175 Td (2696 return fetchint\(cp, cp->tf->esp + 4 + 4*n, ip\);) 235.9 Tj 0 -474.668 Td (2697 }) 26.2111 Tj 0 -484.161 Td (2698 ) 21.8426 Tj 0 -493.655 Td (2699 ) 21.8426 Tj 0 -522.135 Td (Sheet 26) 34.9481 Tj Q Q Q Q showpage %%PageTrailer pdfEndPage %%Page: 34 34 %%BeginPageSetup %%PageOrientation: Landscape pdfStartPage 180 rotate -612 -792 translate 0 0 612 792 re W %%EndPageSetup [] 0 d 1 i 0 j 0 J 10 M 1 w /DeviceGray {} cs [0] sc /DeviceGray {} CS [0] SC false op false OP 0 0 612 792 re W q q [0.1 0 0 0.1 0 0] cm q 180 3960 5760 3460 re W /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [10 0 0 10 0 0] cm [1 0 0 1 0 0] Tm 0 0 Td [0 -0.967854 1 0 564.72 738.864] Tm 0 0 Td /F9_0 8.70222 Tf (Aug 30 10:08 2007 xv6/syscall.c Page 2) 174.741 Tj 0 -28.4801 Td (2700 // Fetch the nth word-sized system call argument as a poin\ ter) 288.322 Tj 0 -37.9735 Td (2701 // to a block of memory of size n bytes. Check that the p\ ointer) 301.427 Tj 0 -47.4668 Td (2702 // lies within the process address space.) 200.952 Tj 0 -56.9602 Td (2703 int) 34.9481 Tj 0 -66.4535 Td (2704 argptr\(int n, char **pp, int size\)) 170.372 Tj 0 -75.9469 Td (2705 {) 26.2111 Tj 0 -85.4403 Td (2706 int i;) 56.7907 Tj 0 -94.9336 Td (2707 ) 21.8426 Tj 0 -104.427 Td (2708 if\(argint\(n, &i\) < 0\)) 122.318 Tj 0 -113.92 Td (2709 return -1;) 83.0018 Tj 0 -123.414 Td (2710 if\(\(uint\)i >= cp->sz || \(uint\)i+size >= cp->sz\)) 235.9 Tj 0 -132.907 Td (2711 return -1;) 83.0018 Tj 0 -142.4 Td (2712 *pp = cp->mem + i;) 109.213 Tj 0 -151.894 Td (2713 return 0;) 69.8962 Tj 0 -161.387 Td (2714 }) 26.2111 Tj 0 -170.88 Td (2715 ) 21.8426 Tj 0 -180.374 Td (2716 // Fetch the nth word-sized system call argument as a stri\ ng pointer.) 323.27 Tj 0 -189.867 Td (2717 // Check that the pointer is valid and the string is nul-t\ erminated.) 318.902 Tj 0 -199.361 Td (2718 // \(There is no shared writable memory, so the string can\ 't change) 310.165 Tj 0 -208.854 Td (2719 // between this check and being used by the kernel.\)) 249.005 Tj 0 -218.347 Td (2720 int) 34.9481 Tj 0 -227.841 Td (2721 argstr\(int n, char **pp\)) 126.687 Tj 0 -237.334 Td (2722 {) 26.2111 Tj 0 -246.827 Td (2723 int addr;) 69.8962 Tj 0 -256.321 Td (2724 if\(argint\(n, &addr\) < 0\)) 135.424 Tj 0 -265.814 Td (2725 return -1;) 83.0018 Tj 0 -275.307 Td (2726 return fetchstr\(cp, addr, pp\);) 161.635 Tj 0 -284.801 Td (2727 }) 26.2111 Tj 0 -294.294 Td (2728 ) 21.8426 Tj 0 -303.788 Td (2729 extern int sys_chdir\(void\);) 139.792 Tj 0 -313.281 Td (2730 extern int sys_close\(void\);) 139.792 Tj 0 -322.774 Td (2731 extern int sys_dup\(void\);) 131.055 Tj 0 -332.268 Td (2732 extern int sys_exec\(void\);) 135.424 Tj 0 -341.761 Td (2733 extern int sys_exit\(void\);) 135.424 Tj 0 -351.254 Td (2734 extern int sys_fork\(void\);) 135.424 Tj 0 -360.748 Td (2735 extern int sys_fstat\(void\);) 139.792 Tj 0 -370.241 Td (2736 extern int sys_getpid\(void\);) 144.161 Tj 0 -379.734 Td (2737 extern int sys_kill\(void\);) 135.424 Tj 0 -389.228 Td (2738 extern int sys_link\(void\);) 135.424 Tj 0 -398.721 Td (2739 extern int sys_mkdir\(void\);) 139.792 Tj 0 -408.214 Td (2740 extern int sys_mknod\(void\);) 139.792 Tj 0 -417.708 Td (2741 extern int sys_open\(void\);) 135.424 Tj 0 -427.201 Td (2742 extern int sys_pipe\(void\);) 135.424 Tj 0 -436.695 Td (2743 extern int sys_read\(void\);) 135.424 Tj 0 -446.188 Td (2744 extern int sys_sbrk\(void\);) 135.424 Tj 0 -455.681 Td (2745 extern int sys_sleep\(void\);) 139.792 Tj 0 -465.175 Td (2746 extern int sys_unlink\(void\);) 144.161 Tj 0 -474.668 Td (2747 extern int sys_wait\(void\);) 135.424 Tj 0 -484.161 Td (2748 extern int sys_write\(void\);) 139.792 Tj 0 -493.655 Td (2749 ) 21.8426 Tj 0 -522.135 Td (Sheet 27) 34.9481 Tj Q Q q 180 500 5760 3460 re W /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [10 0 0 10 0 0] cm [1 0 0 1 0 0] Tm 0 0 Td [0 -0.967854 1 0 564.72 392.864] Tm 0 0 Td /F9_0 8.70222 Tf (Aug 30 10:08 2007 xv6/syscall.c Page 3) 174.741 Tj 0 -28.4801 Td (2750 static int \(*syscalls[]\)\(void\) = {) 170.372 Tj 0 -37.9735 Td (2751 [SYS_chdir] sys_chdir,) 126.687 Tj 0 -47.4668 Td (2752 [SYS_close] sys_close,) 126.687 Tj 0 -56.9602 Td (2753 [SYS_dup] sys_dup,) 117.95 Tj 0 -66.4535 Td (2754 [SYS_exec] sys_exec,) 122.318 Tj 0 -75.9469 Td (2755 [SYS_exit] sys_exit,) 122.318 Tj 0 -85.4403 Td (2756 [SYS_fork] sys_fork,) 122.318 Tj 0 -94.9336 Td (2757 [SYS_fstat] sys_fstat,) 126.687 Tj 0 -104.427 Td (2758 [SYS_getpid] sys_getpid,) 131.055 Tj 0 -113.92 Td (2759 [SYS_kill] sys_kill,) 122.318 Tj 0 -123.414 Td (2760 [SYS_link] sys_link,) 122.318 Tj 0 -132.907 Td (2761 [SYS_mkdir] sys_mkdir,) 126.687 Tj 0 -142.4 Td (2762 [SYS_mknod] sys_mknod,) 126.687 Tj 0 -151.894 Td (2763 [SYS_open] sys_open,) 122.318 Tj 0 -161.387 Td (2764 [SYS_pipe] sys_pipe,) 122.318 Tj 0 -170.88 Td (2765 [SYS_read] sys_read,) 122.318 Tj 0 -180.374 Td (2766 [SYS_sbrk] sys_sbrk,) 122.318 Tj 0 -189.867 Td (2767 [SYS_sleep] sys_sleep,) 126.687 Tj 0 -199.361 Td (2768 [SYS_unlink] sys_unlink,) 131.055 Tj 0 -208.854 Td (2769 [SYS_wait] sys_wait,) 122.318 Tj 0 -218.347 Td (2770 [SYS_write] sys_write,) 126.687 Tj 0 -227.841 Td (2771 };) 30.5796 Tj 0 -237.334 Td (2772 ) 21.8426 Tj 0 -246.827 Td (2773 void) 39.3166 Tj 0 -256.321 Td (2774 syscall\(void\)) 78.6333 Tj 0 -265.814 Td (2775 {) 26.2111 Tj 0 -275.307 Td (2776 int num;) 65.5277 Tj 0 -284.801 Td (2777 ) 21.8426 Tj 0 -294.294 Td (2778 num = cp->tf->eax;) 109.213 Tj 0 -303.788 Td (2779 if\(num >= 0 && num < NELEM\(syscalls\) && syscalls[num]\ \)) 266.479 Tj 0 -313.281 Td (2780 cp->tf->eax = syscalls[num]\(\);) 170.372 Tj 0 -322.774 Td (2781 else {) 56.7907 Tj 0 -332.268 Td (2782 cprintf\("%d %s: unknown sys call %d\\n",) 209.689 Tj 0 -341.761 Td (2783 cp->pid, cp->name, num\);) 179.109 Tj 0 -351.254 Td (2784 cp->tf->eax = -1;) 113.581 Tj 0 -360.748 Td (2785 }) 34.9481 Tj 0 -370.241 Td (2786 }) 26.2111 Tj 0 -379.734 Td (2787 ) 21.8426 Tj 0 -389.228 Td (2788 ) 21.8426 Tj 0 -398.721 Td (2789 ) 21.8426 Tj 0 -408.214 Td (2790 ) 21.8426 Tj 0 -417.708 Td (2791 ) 21.8426 Tj 0 -427.201 Td (2792 ) 21.8426 Tj 0 -436.695 Td (2793 ) 21.8426 Tj 0 -446.188 Td (2794 ) 21.8426 Tj 0 -455.681 Td (2795 ) 21.8426 Tj 0 -465.175 Td (2796 ) 21.8426 Tj 0 -474.668 Td (2797 ) 21.8426 Tj 0 -484.161 Td (2798 ) 21.8426 Tj 0 -493.655 Td (2799 ) 21.8426 Tj 0 -522.135 Td (Sheet 27) 34.9481 Tj Q Q Q Q showpage %%PageTrailer pdfEndPage %%Page: 35 35 %%BeginPageSetup %%PageOrientation: Landscape pdfStartPage 180 rotate -612 -792 translate 0 0 612 792 re W %%EndPageSetup [] 0 d 1 i 0 j 0 J 10 M 1 w /DeviceGray {} cs [0] sc /DeviceGray {} CS [0] SC false op false OP 0 0 612 792 re W q q [0.1 0 0 0.1 0 0] cm q 180 3960 5760 3460 re W /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [10 0 0 10 0 0] cm [1 0 0 1 0 0] Tm 0 0 Td [0 -0.967854 1 0 564.72 738.864] Tm 0 0 Td /F9_0 8.70222 Tf (Aug 30 10:08 2007 xv6/sysproc.c Page 1) 174.741 Tj 0 -28.4801 Td (2800 #include "types.h") 100.476 Tj 0 -37.9735 Td (2801 #include "defs.h") 96.1073 Tj 0 -47.4668 Td (2802 #include "param.h") 100.476 Tj 0 -56.9602 Td (2803 #include "mmu.h") 91.7388 Tj 0 -66.4535 Td (2804 #include "proc.h") 96.1073 Tj 0 -75.9469 Td (2805 ) 21.8426 Tj 0 -85.4403 Td (2806 int) 34.9481 Tj 0 -94.9336 Td (2807 sys_fork\(void\)) 83.0018 Tj 0 -104.427 Td (2808 {) 26.2111 Tj 0 -113.92 Td (2809 struct proc *np;) 100.476 Tj 0 -123.414 Td (2810 ) 21.8426 Tj 0 -132.907 Td (2811 if\(\(np = copyproc\(cp\)\) == 0\)) 152.898 Tj 0 -142.4 Td (2812 return -1;) 83.0018 Tj 0 -151.894 Td (2813 np->state = RUNNABLE;) 122.318 Tj 0 -161.387 Td (2814 return np->pid;) 96.1073 Tj 0 -170.88 Td (2815 }) 26.2111 Tj 0 -180.374 Td (2816 ) 21.8426 Tj 0 -189.867 Td (2817 int) 34.9481 Tj 0 -199.361 Td (2818 sys_exit\(void\)) 83.0018 Tj 0 -208.854 Td (2819 {) 26.2111 Tj 0 -218.347 Td (2820 exit\(\);) 61.1592 Tj 0 -227.841 Td (2821 return 0; // not reached) 139.792 Tj 0 -237.334 Td (2822 }) 26.2111 Tj 0 -246.827 Td (2823 ) 21.8426 Tj 0 -256.321 Td (2824 int) 34.9481 Tj 0 -265.814 Td (2825 sys_wait\(void\)) 83.0018 Tj 0 -275.307 Td (2826 {) 26.2111 Tj 0 -284.801 Td (2827 return wait\(\);) 91.7388 Tj 0 -294.294 Td (2828 }) 26.2111 Tj 0 -303.788 Td (2829 ) 21.8426 Tj 0 -313.281 Td (2830 int) 34.9481 Tj 0 -322.774 Td (2831 sys_kill\(void\)) 83.0018 Tj 0 -332.268 Td (2832 {) 26.2111 Tj 0 -341.761 Td (2833 int pid;) 65.5277 Tj 0 -351.254 Td (2834 ) 21.8426 Tj 0 -360.748 Td (2835 if\(argint\(0, &pid\) < 0\)) 131.055 Tj 0 -370.241 Td (2836 return -1;) 83.0018 Tj 0 -379.734 Td (2837 return kill\(pid\);) 104.844 Tj 0 -389.228 Td (2838 }) 26.2111 Tj 0 -398.721 Td (2839 ) 21.8426 Tj 0 -408.214 Td (2840 int) 34.9481 Tj 0 -417.708 Td (2841 sys_getpid\(void\)) 91.7388 Tj 0 -427.201 Td (2842 {) 26.2111 Tj 0 -436.695 Td (2843 return cp->pid;) 96.1073 Tj 0 -446.188 Td (2844 }) 26.2111 Tj 0 -455.681 Td (2845 ) 21.8426 Tj 0 -465.175 Td (2846 ) 21.8426 Tj 0 -474.668 Td (2847 ) 21.8426 Tj 0 -484.161 Td (2848 ) 21.8426 Tj 0 -493.655 Td (2849 ) 21.8426 Tj 0 -522.135 Td (Sheet 28) 34.9481 Tj Q Q q 180 500 5760 3460 re W /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [10 0 0 10 0 0] cm [1 0 0 1 0 0] Tm 0 0 Td [0 -0.967854 1 0 564.72 392.864] Tm 0 0 Td /F9_0 8.70222 Tf (Aug 30 10:08 2007 xv6/sysproc.c Page 2) 174.741 Tj 0 -28.4801 Td (2850 int) 34.9481 Tj 0 -37.9735 Td (2851 sys_sbrk\(void\)) 83.0018 Tj 0 -47.4668 Td (2852 {) 26.2111 Tj 0 -56.9602 Td (2853 int addr;) 69.8962 Tj 0 -66.4535 Td (2854 int n;) 56.7907 Tj 0 -75.9469 Td (2855 ) 21.8426 Tj 0 -85.4403 Td (2856 if\(argint\(0, &n\) < 0\)) 122.318 Tj 0 -94.9336 Td (2857 return -1;) 83.0018 Tj 0 -104.427 Td (2858 if\(\(addr = growproc\(n\)\) < 0\)) 152.898 Tj 0 -113.92 Td (2859 return -1;) 83.0018 Tj 0 -123.414 Td (2860 setupsegs\(cp\);) 91.7388 Tj 0 -132.907 Td (2861 return addr;) 83.0018 Tj 0 -142.4 Td (2862 }) 26.2111 Tj 0 -151.894 Td (2863 ) 21.8426 Tj 0 -161.387 Td (2864 int) 34.9481 Tj 0 -170.88 Td (2865 sys_sleep\(void\)) 87.3703 Tj 0 -180.374 Td (2866 {) 26.2111 Tj 0 -189.867 Td (2867 int n, ticks0;) 91.7388 Tj 0 -199.361 Td (2868 ) 21.8426 Tj 0 -208.854 Td (2869 if\(argint\(0, &n\) < 0\)) 122.318 Tj 0 -218.347 Td (2870 return -1;) 83.0018 Tj 0 -227.841 Td (2871 acquire\(&tickslock\);) 117.95 Tj 0 -237.334 Td (2872 ticks0 = ticks;) 96.1073 Tj 0 -246.827 Td (2873 while\(ticks - ticks0 < n\){) 144.161 Tj 0 -256.321 Td (2874 if\(cp->killed\){) 104.844 Tj 0 -265.814 Td (2875 release\(&tickslock\);) 135.424 Tj 0 -275.307 Td (2876 return -1;) 91.7388 Tj 0 -284.801 Td (2877 }) 43.6851 Tj 0 -294.294 Td (2878 sleep\(&ticks, &tickslock\);) 152.898 Tj 0 -303.788 Td (2879 }) 34.9481 Tj 0 -313.281 Td (2880 release\(&tickslock\);) 117.95 Tj 0 -322.774 Td (2881 return 0;) 69.8962 Tj 0 -332.268 Td (2882 }) 26.2111 Tj 0 -341.761 Td (2883 ) 21.8426 Tj 0 -351.254 Td (2884 ) 21.8426 Tj 0 -360.748 Td (2885 ) 21.8426 Tj 0 -370.241 Td (2886 ) 21.8426 Tj 0 -379.734 Td (2887 ) 21.8426 Tj 0 -389.228 Td (2888 ) 21.8426 Tj 0 -398.721 Td (2889 ) 21.8426 Tj 0 -408.214 Td (2890 ) 21.8426 Tj 0 -417.708 Td (2891 ) 21.8426 Tj 0 -427.201 Td (2892 ) 21.8426 Tj 0 -436.695 Td (2893 ) 21.8426 Tj 0 -446.188 Td (2894 ) 21.8426 Tj 0 -455.681 Td (2895 ) 21.8426 Tj 0 -465.175 Td (2896 ) 21.8426 Tj 0 -474.668 Td (2897 ) 21.8426 Tj 0 -484.161 Td (2898 ) 21.8426 Tj 0 -493.655 Td (2899 ) 21.8426 Tj 0 -522.135 Td (Sheet 28) 34.9481 Tj Q Q Q Q showpage %%PageTrailer pdfEndPage %%Page: 36 36 %%BeginPageSetup %%PageOrientation: Landscape pdfStartPage 180 rotate -612 -792 translate 0 0 612 792 re W %%EndPageSetup [] 0 d 1 i 0 j 0 J 10 M 1 w /DeviceGray {} cs [0] sc /DeviceGray {} CS [0] SC false op false OP 0 0 612 792 re W q q [0.1 0 0 0.1 0 0] cm q 180 3960 5760 3460 re W /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [10 0 0 10 0 0] cm [1 0 0 1 0 0] Tm 0 0 Td [0 -0.967854 1 0 564.72 738.864] Tm 0 0 Td /F9_0 8.70222 Tf (Aug 30 10:08 2007 xv6/buf.h Page 1) 157.267 Tj 0 -28.4801 Td (2900 struct buf {) 74.2647 Tj 0 -37.9735 Td (2901 int flags;) 74.2647 Tj 0 -47.4668 Td (2902 uint dev;) 69.8962 Tj 0 -56.9602 Td (2903 uint sector;) 83.0018 Tj 0 -66.4535 Td (2904 struct buf *prev; // LRU cache list) 183.478 Tj 0 -75.9469 Td (2905 struct buf *next;) 104.844 Tj 0 -85.4403 Td (2906 struct buf *qnext; // disk queue) 170.372 Tj 0 -94.9336 Td (2907 uchar data[512];) 100.476 Tj 0 -104.427 Td (2908 };) 30.5796 Tj 0 -113.92 Td (2909 #define B_BUSY 0x1 // buffer is locked by some process) 266.479 Tj 0 -123.414 Td (2910 #define B_VALID 0x2 // buffer has been read from disk) 257.742 Tj 0 -132.907 Td (2911 #define B_DIRTY 0x4 // buffer needs to be written to disk) 275.216 Tj 0 -142.4 Td (2912 ) 21.8426 Tj 0 -151.894 Td (2913 ) 21.8426 Tj 0 -161.387 Td (2914 ) 21.8426 Tj 0 -170.88 Td (2915 ) 21.8426 Tj 0 -180.374 Td (2916 ) 21.8426 Tj 0 -189.867 Td (2917 ) 21.8426 Tj 0 -199.361 Td (2918 ) 21.8426 Tj 0 -208.854 Td (2919 ) 21.8426 Tj 0 -218.347 Td (2920 ) 21.8426 Tj 0 -227.841 Td (2921 ) 21.8426 Tj 0 -237.334 Td (2922 ) 21.8426 Tj 0 -246.827 Td (2923 ) 21.8426 Tj 0 -256.321 Td (2924 ) 21.8426 Tj 0 -265.814 Td (2925 ) 21.8426 Tj 0 -275.307 Td (2926 ) 21.8426 Tj 0 -284.801 Td (2927 ) 21.8426 Tj 0 -294.294 Td (2928 ) 21.8426 Tj 0 -303.788 Td (2929 ) 21.8426 Tj 0 -313.281 Td (2930 ) 21.8426 Tj 0 -322.774 Td (2931 ) 21.8426 Tj 0 -332.268 Td (2932 ) 21.8426 Tj 0 -341.761 Td (2933 ) 21.8426 Tj 0 -351.254 Td (2934 ) 21.8426 Tj 0 -360.748 Td (2935 ) 21.8426 Tj 0 -370.241 Td (2936 ) 21.8426 Tj 0 -379.734 Td (2937 ) 21.8426 Tj 0 -389.228 Td (2938 ) 21.8426 Tj 0 -398.721 Td (2939 ) 21.8426 Tj 0 -408.214 Td (2940 ) 21.8426 Tj 0 -417.708 Td (2941 ) 21.8426 Tj 0 -427.201 Td (2942 ) 21.8426 Tj 0 -436.695 Td (2943 ) 21.8426 Tj 0 -446.188 Td (2944 ) 21.8426 Tj 0 -455.681 Td (2945 ) 21.8426 Tj 0 -465.175 Td (2946 ) 21.8426 Tj 0 -474.668 Td (2947 ) 21.8426 Tj 0 -484.161 Td (2948 ) 21.8426 Tj 0 -493.655 Td (2949 ) 21.8426 Tj 0 -522.135 Td (Sheet 29) 34.9481 Tj Q Q q 180 500 5760 3460 re W /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [10 0 0 10 0 0] cm [1 0 0 1 0 0] Tm 0 0 Td [0 -0.967854 1 0 564.72 392.864] Tm 0 0 Td /F9_0 8.70222 Tf (Aug 30 10:08 2007 xv6/dev.h Page 1) 157.267 Tj 0 -28.4801 Td (2950 struct devsw {) 83.0018 Tj 0 -37.9735 Td (2951 int \(*read\)\(struct inode*, char*, int\);) 200.952 Tj 0 -47.4668 Td (2952 int \(*write\)\(struct inode*, char*, int\);) 205.32 Tj 0 -56.9602 Td (2953 };) 30.5796 Tj 0 -66.4535 Td (2954 ) 21.8426 Tj 0 -75.9469 Td (2955 extern struct devsw devsw[];) 144.161 Tj 0 -85.4403 Td (2956 ) 21.8426 Tj 0 -94.9336 Td (2957 #define CONSOLE 1) 96.1073 Tj 0 -104.427 Td (2958 ) 21.8426 Tj 0 -113.92 Td (2959 ) 21.8426 Tj 0 -123.414 Td (2960 ) 21.8426 Tj 0 -132.907 Td (2961 ) 21.8426 Tj 0 -142.4 Td (2962 ) 21.8426 Tj 0 -151.894 Td (2963 ) 21.8426 Tj 0 -161.387 Td (2964 ) 21.8426 Tj 0 -170.88 Td (2965 ) 21.8426 Tj 0 -180.374 Td (2966 ) 21.8426 Tj 0 -189.867 Td (2967 ) 21.8426 Tj 0 -199.361 Td (2968 ) 21.8426 Tj 0 -208.854 Td (2969 ) 21.8426 Tj 0 -218.347 Td (2970 ) 21.8426 Tj 0 -227.841 Td (2971 ) 21.8426 Tj 0 -237.334 Td (2972 ) 21.8426 Tj 0 -246.827 Td (2973 ) 21.8426 Tj 0 -256.321 Td (2974 ) 21.8426 Tj 0 -265.814 Td (2975 ) 21.8426 Tj 0 -275.307 Td (2976 ) 21.8426 Tj 0 -284.801 Td (2977 ) 21.8426 Tj 0 -294.294 Td (2978 ) 21.8426 Tj 0 -303.788 Td (2979 ) 21.8426 Tj 0 -313.281 Td (2980 ) 21.8426 Tj 0 -322.774 Td (2981 ) 21.8426 Tj 0 -332.268 Td (2982 ) 21.8426 Tj 0 -341.761 Td (2983 ) 21.8426 Tj 0 -351.254 Td (2984 ) 21.8426 Tj 0 -360.748 Td (2985 ) 21.8426 Tj 0 -370.241 Td (2986 ) 21.8426 Tj 0 -379.734 Td (2987 ) 21.8426 Tj 0 -389.228 Td (2988 ) 21.8426 Tj 0 -398.721 Td (2989 ) 21.8426 Tj 0 -408.214 Td (2990 ) 21.8426 Tj 0 -417.708 Td (2991 ) 21.8426 Tj 0 -427.201 Td (2992 ) 21.8426 Tj 0 -436.695 Td (2993 ) 21.8426 Tj 0 -446.188 Td (2994 ) 21.8426 Tj 0 -455.681 Td (2995 ) 21.8426 Tj 0 -465.175 Td (2996 ) 21.8426 Tj 0 -474.668 Td (2997 ) 21.8426 Tj 0 -484.161 Td (2998 ) 21.8426 Tj 0 -493.655 Td (2999 ) 21.8426 Tj 0 -522.135 Td (Sheet 29) 34.9481 Tj Q Q Q Q showpage %%PageTrailer pdfEndPage %%Page: 37 37 %%BeginPageSetup %%PageOrientation: Landscape pdfStartPage 180 rotate -612 -792 translate 0 0 612 792 re W %%EndPageSetup [] 0 d 1 i 0 j 0 J 10 M 1 w /DeviceGray {} cs [0] sc /DeviceGray {} CS [0] SC false op false OP 0 0 612 792 re W q q [0.1 0 0 0.1 0 0] cm q 180 3960 5760 3460 re W /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [10 0 0 10 0 0] cm [1 0 0 1 0 0] Tm 0 0 Td [0 -0.967854 1 0 564.72 738.864] Tm 0 0 Td /F9_0 8.70222 Tf (Aug 30 10:08 2007 xv6/fcntl.h Page 1) 166.004 Tj 0 -28.4801 Td (3000 #define O_RDONLY 0x000) 122.318 Tj 0 -37.9735 Td (3001 #define O_WRONLY 0x001) 122.318 Tj 0 -47.4668 Td (3002 #define O_RDWR 0x002) 122.318 Tj 0 -56.9602 Td (3003 #define O_CREATE 0x200) 122.318 Tj 0 -66.4535 Td (3004 ) 21.8426 Tj 0 -75.9469 Td (3005 ) 21.8426 Tj 0 -85.4403 Td (3006 ) 21.8426 Tj 0 -94.9336 Td (3007 ) 21.8426 Tj 0 -104.427 Td (3008 ) 21.8426 Tj 0 -113.92 Td (3009 ) 21.8426 Tj 0 -123.414 Td (3010 ) 21.8426 Tj 0 -132.907 Td (3011 ) 21.8426 Tj 0 -142.4 Td (3012 ) 21.8426 Tj 0 -151.894 Td (3013 ) 21.8426 Tj 0 -161.387 Td (3014 ) 21.8426 Tj 0 -170.88 Td (3015 ) 21.8426 Tj 0 -180.374 Td (3016 ) 21.8426 Tj 0 -189.867 Td (3017 ) 21.8426 Tj 0 -199.361 Td (3018 ) 21.8426 Tj 0 -208.854 Td (3019 ) 21.8426 Tj 0 -218.347 Td (3020 ) 21.8426 Tj 0 -227.841 Td (3021 ) 21.8426 Tj 0 -237.334 Td (3022 ) 21.8426 Tj 0 -246.827 Td (3023 ) 21.8426 Tj 0 -256.321 Td (3024 ) 21.8426 Tj 0 -265.814 Td (3025 ) 21.8426 Tj 0 -275.307 Td (3026 ) 21.8426 Tj 0 -284.801 Td (3027 ) 21.8426 Tj 0 -294.294 Td (3028 ) 21.8426 Tj 0 -303.788 Td (3029 ) 21.8426 Tj 0 -313.281 Td (3030 ) 21.8426 Tj 0 -322.774 Td (3031 ) 21.8426 Tj 0 -332.268 Td (3032 ) 21.8426 Tj 0 -341.761 Td (3033 ) 21.8426 Tj 0 -351.254 Td (3034 ) 21.8426 Tj 0 -360.748 Td (3035 ) 21.8426 Tj 0 -370.241 Td (3036 ) 21.8426 Tj 0 -379.734 Td (3037 ) 21.8426 Tj 0 -389.228 Td (3038 ) 21.8426 Tj 0 -398.721 Td (3039 ) 21.8426 Tj 0 -408.214 Td (3040 ) 21.8426 Tj 0 -417.708 Td (3041 ) 21.8426 Tj 0 -427.201 Td (3042 ) 21.8426 Tj 0 -436.695 Td (3043 ) 21.8426 Tj 0 -446.188 Td (3044 ) 21.8426 Tj 0 -455.681 Td (3045 ) 21.8426 Tj 0 -465.175 Td (3046 ) 21.8426 Tj 0 -474.668 Td (3047 ) 21.8426 Tj 0 -484.161 Td (3048 ) 21.8426 Tj 0 -493.655 Td (3049 ) 21.8426 Tj 0 -522.135 Td (Sheet 30) 34.9481 Tj Q Q q 180 500 5760 3460 re W /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [10 0 0 10 0 0] cm [1 0 0 1 0 0] Tm 0 0 Td [0 -0.967854 1 0 564.72 392.864] Tm 0 0 Td /F9_0 8.70222 Tf (Aug 30 10:08 2007 xv6/stat.h Page 1) 161.635 Tj 0 -28.4801 Td (3050 struct stat {) 78.6333 Tj 0 -37.9735 Td (3051 int dev; // Device number) 157.267 Tj 0 -47.4668 Td (3052 uint ino; // Inode number on device) 196.583 Tj 0 -56.9602 Td (3053 short type; // Type of file) 152.898 Tj 0 -66.4535 Td (3054 short nlink; // Number of links to file) 200.952 Tj 0 -75.9469 Td (3055 uint size; // Size of file in bytes) 192.215 Tj 0 -85.4403 Td (3056 };) 30.5796 Tj 0 -94.9336 Td (3057 ) 21.8426 Tj 0 -104.427 Td (3058 ) 21.8426 Tj 0 -113.92 Td (3059 ) 21.8426 Tj 0 -123.414 Td (3060 ) 21.8426 Tj 0 -132.907 Td (3061 ) 21.8426 Tj 0 -142.4 Td (3062 ) 21.8426 Tj 0 -151.894 Td (3063 ) 21.8426 Tj 0 -161.387 Td (3064 ) 21.8426 Tj 0 -170.88 Td (3065 ) 21.8426 Tj 0 -180.374 Td (3066 ) 21.8426 Tj 0 -189.867 Td (3067 ) 21.8426 Tj 0 -199.361 Td (3068 ) 21.8426 Tj 0 -208.854 Td (3069 ) 21.8426 Tj 0 -218.347 Td (3070 ) 21.8426 Tj 0 -227.841 Td (3071 ) 21.8426 Tj 0 -237.334 Td (3072 ) 21.8426 Tj 0 -246.827 Td (3073 ) 21.8426 Tj 0 -256.321 Td (3074 ) 21.8426 Tj 0 -265.814 Td (3075 ) 21.8426 Tj 0 -275.307 Td (3076 ) 21.8426 Tj 0 -284.801 Td (3077 ) 21.8426 Tj 0 -294.294 Td (3078 ) 21.8426 Tj 0 -303.788 Td (3079 ) 21.8426 Tj 0 -313.281 Td (3080 ) 21.8426 Tj 0 -322.774 Td (3081 ) 21.8426 Tj 0 -332.268 Td (3082 ) 21.8426 Tj 0 -341.761 Td (3083 ) 21.8426 Tj 0 -351.254 Td (3084 ) 21.8426 Tj 0 -360.748 Td (3085 ) 21.8426 Tj 0 -370.241 Td (3086 ) 21.8426 Tj 0 -379.734 Td (3087 ) 21.8426 Tj 0 -389.228 Td (3088 ) 21.8426 Tj 0 -398.721 Td (3089 ) 21.8426 Tj 0 -408.214 Td (3090 ) 21.8426 Tj 0 -417.708 Td (3091 ) 21.8426 Tj 0 -427.201 Td (3092 ) 21.8426 Tj 0 -436.695 Td (3093 ) 21.8426 Tj 0 -446.188 Td (3094 ) 21.8426 Tj 0 -455.681 Td (3095 ) 21.8426 Tj 0 -465.175 Td (3096 ) 21.8426 Tj 0 -474.668 Td (3097 ) 21.8426 Tj 0 -484.161 Td (3098 ) 21.8426 Tj 0 -493.655 Td (3099 ) 21.8426 Tj 0 -522.135 Td (Sheet 30) 34.9481 Tj Q Q Q Q showpage %%PageTrailer pdfEndPage %%Page: 38 38 %%BeginPageSetup %%PageOrientation: Landscape pdfStartPage 180 rotate -612 -792 translate 0 0 612 792 re W %%EndPageSetup [] 0 d 1 i 0 j 0 J 10 M 1 w /DeviceGray {} cs [0] sc /DeviceGray {} CS [0] SC false op false OP 0 0 612 792 re W q q [0.1 0 0 0.1 0 0] cm q 180 3960 5760 3460 re W /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [10 0 0 10 0 0] cm [1 0 0 1 0 0] Tm 0 0 Td [0 -0.967854 1 0 564.72 738.864] Tm 0 0 Td /F9_0 8.70222 Tf (Aug 30 10:08 2007 xv6/file.h Page 1) 161.635 Tj 0 -28.4801 Td (3100 struct file {) 78.6333 Tj 0 -37.9735 Td (3101 enum { FD_CLOSED, FD_NONE, FD_PIPE, FD_INODE } type;) 257.742 Tj 0 -47.4668 Td (3102 int ref; // reference count) 148.529 Tj 0 -56.9602 Td (3103 char readable;) 91.7388 Tj 0 -66.4535 Td (3104 char writable;) 91.7388 Tj 0 -75.9469 Td (3105 struct pipe *pipe;) 109.213 Tj 0 -85.4403 Td (3106 struct inode *ip;) 104.844 Tj 0 -94.9336 Td (3107 uint off;) 69.8962 Tj 0 -104.427 Td (3108 };) 30.5796 Tj 0 -113.92 Td (3109 ) 21.8426 Tj 0 -123.414 Td (3110 ) 21.8426 Tj 0 -132.907 Td (3111 ) 21.8426 Tj 0 -142.4 Td (3112 ) 21.8426 Tj 0 -151.894 Td (3113 ) 21.8426 Tj 0 -161.387 Td (3114 ) 21.8426 Tj 0 -170.88 Td (3115 ) 21.8426 Tj 0 -180.374 Td (3116 ) 21.8426 Tj 0 -189.867 Td (3117 ) 21.8426 Tj 0 -199.361 Td (3118 ) 21.8426 Tj 0 -208.854 Td (3119 ) 21.8426 Tj 0 -218.347 Td (3120 ) 21.8426 Tj 0 -227.841 Td (3121 ) 21.8426 Tj 0 -237.334 Td (3122 ) 21.8426 Tj 0 -246.827 Td (3123 ) 21.8426 Tj 0 -256.321 Td (3124 ) 21.8426 Tj 0 -265.814 Td (3125 ) 21.8426 Tj 0 -275.307 Td (3126 ) 21.8426 Tj 0 -284.801 Td (3127 ) 21.8426 Tj 0 -294.294 Td (3128 ) 21.8426 Tj 0 -303.788 Td (3129 ) 21.8426 Tj 0 -313.281 Td (3130 ) 21.8426 Tj 0 -322.774 Td (3131 ) 21.8426 Tj 0 -332.268 Td (3132 ) 21.8426 Tj 0 -341.761 Td (3133 ) 21.8426 Tj 0 -351.254 Td (3134 ) 21.8426 Tj 0 -360.748 Td (3135 ) 21.8426 Tj 0 -370.241 Td (3136 ) 21.8426 Tj 0 -379.734 Td (3137 ) 21.8426 Tj 0 -389.228 Td (3138 ) 21.8426 Tj 0 -398.721 Td (3139 ) 21.8426 Tj 0 -408.214 Td (3140 ) 21.8426 Tj 0 -417.708 Td (3141 ) 21.8426 Tj 0 -427.201 Td (3142 ) 21.8426 Tj 0 -436.695 Td (3143 ) 21.8426 Tj 0 -446.188 Td (3144 ) 21.8426 Tj 0 -455.681 Td (3145 ) 21.8426 Tj 0 -465.175 Td (3146 ) 21.8426 Tj 0 -474.668 Td (3147 ) 21.8426 Tj 0 -484.161 Td (3148 ) 21.8426 Tj 0 -493.655 Td (3149 ) 21.8426 Tj 0 -522.135 Td (Sheet 31) 34.9481 Tj Q Q q 180 500 5760 3460 re W /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [10 0 0 10 0 0] cm [1 0 0 1 0 0] Tm 0 0 Td [0 -0.967854 1 0 564.72 392.864] Tm 0 0 Td /F9_0 8.70222 Tf (Aug 30 10:08 2007 xv6/fs.h Page 1) 152.898 Tj 0 -28.4801 Td (3150 // On-disk file system format.) 152.898 Tj 0 -37.9735 Td (3151 // Both the kernel and user programs use this header file.) 275.216 Tj 0 -47.4668 Td (3152 ) 21.8426 Tj 0 -56.9602 Td (3153 // Block 0 is unused.) 113.581 Tj 0 -66.4535 Td (3154 // Block 1 is super block.) 135.424 Tj 0 -75.9469 Td (3155 // Inodes start at block 2.) 139.792 Tj 0 -85.4403 Td (3156 ) 21.8426 Tj 0 -94.9336 Td (3157 #define BSIZE 512 // block size) 161.635 Tj 0 -104.427 Td (3158 ) 21.8426 Tj 0 -113.92 Td (3159 // File system super block) 135.424 Tj 0 -123.414 Td (3160 struct superblock {) 104.844 Tj 0 -132.907 Td (3161 uint size; // Size of file system image \(blocks\ \)) 275.216 Tj 0 -142.4 Td (3162 uint nblocks; // Number of data blocks) 218.426 Tj 0 -151.894 Td (3163 uint ninodes; // Number of inodes.) 200.952 Tj 0 -161.387 Td (3164 };) 30.5796 Tj 0 -170.88 Td (3165 ) 21.8426 Tj 0 -180.374 Td (3166 #define NADDRS \(NDIRECT+1\)) 135.424 Tj 0 -189.867 Td (3167 #define NDIRECT 12) 100.476 Tj 0 -199.361 Td (3168 #define INDIRECT 12) 104.844 Tj 0 -208.854 Td (3169 #define NINDIRECT \(BSIZE / sizeof\(uint\)\)) 196.583 Tj 0 -218.347 Td (3170 #define MAXFILE \(NDIRECT + NINDIRECT\)) 187.846 Tj 0 -227.841 Td (3171 ) 21.8426 Tj 0 -237.334 Td (3172 // On-disk inode structure) 135.424 Tj 0 -246.827 Td (3173 struct dinode {) 87.3703 Tj 0 -256.321 Td (3174 short type; // File type) 179.109 Tj 0 -265.814 Td (3175 short major; // Major device number \(T_DEV onl\ y\)) 279.585 Tj 0 -275.307 Td (3176 short minor; // Minor device number \(T_DEV onl\ y\)) 279.585 Tj 0 -284.801 Td (3177 short nlink; // Number of links to inode in fil\ e system) 310.165 Tj 0 -294.294 Td (3178 uint size; // Size of file \(bytes\)) 227.163 Tj 0 -303.788 Td (3179 uint addrs[NADDRS]; // Data block addresses) 227.163 Tj 0 -313.281 Td (3180 };) 30.5796 Tj 0 -322.774 Td (3181 ) 21.8426 Tj 0 -332.268 Td (3182 #define T_DIR 1 // Directory) 157.267 Tj 0 -341.761 Td (3183 #define T_FILE 2 // File) 135.424 Tj 0 -351.254 Td (3184 #define T_DEV 3 // Special device) 179.109 Tj 0 -360.748 Td (3185 ) 21.8426 Tj 0 -370.241 Td (3186 // Inodes per block.) 109.213 Tj 0 -379.734 Td (3187 #define IPB \(BSIZE / sizeof\(struct dinode\)\)) 253.374 Tj 0 -389.228 Td (3188 ) 21.8426 Tj 0 -398.721 Td (3189 // Block containing inode i) 139.792 Tj 0 -408.214 Td (3190 #define IBLOCK\(i\) \(\(i\) / IPB + 2\)) 183.478 Tj 0 -417.708 Td (3191 ) 21.8426 Tj 0 -427.201 Td (3192 // Bitmap bits per block) 126.687 Tj 0 -436.695 Td (3193 #define BPB \(BSIZE*8\)) 157.267 Tj 0 -446.188 Td (3194 ) 21.8426 Tj 0 -455.681 Td (3195 // Block containing bit for block b) 174.741 Tj 0 -465.175 Td (3196 #define BBLOCK\(b, ninodes\) \(b/BPB + \(ninodes\)/IPB + 3\ \)) 257.742 Tj 0 -474.668 Td (3197 ) 21.8426 Tj 0 -484.161 Td (3198 ) 21.8426 Tj 0 -493.655 Td (3199 ) 21.8426 Tj 0 -522.135 Td (Sheet 31) 34.9481 Tj Q Q Q Q showpage %%PageTrailer pdfEndPage %%Page: 39 39 %%BeginPageSetup %%PageOrientation: Landscape pdfStartPage 180 rotate -612 -792 translate 0 0 612 792 re W %%EndPageSetup [] 0 d 1 i 0 j 0 J 10 M 1 w /DeviceGray {} cs [0] sc /DeviceGray {} CS [0] SC false op false OP 0 0 612 792 re W q q [0.1 0 0 0.1 0 0] cm q 180 3960 5760 3460 re W /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [10 0 0 10 0 0] cm [1 0 0 1 0 0] Tm 0 0 Td [0 -0.967854 1 0 564.72 738.864] Tm 0 0 Td /F9_0 8.70222 Tf (Aug 30 10:08 2007 xv6/fs.h Page 2) 152.898 Tj 0 -28.4801 Td (3200 // Directory is a file containing a sequence of dirent str\ uctures.) 310.165 Tj 0 -37.9735 Td (3201 #define DIRSIZ 14) 96.1073 Tj 0 -47.4668 Td (3202 ) 21.8426 Tj 0 -56.9602 Td (3203 struct dirent {) 87.3703 Tj 0 -66.4535 Td (3204 ushort inum;) 83.0018 Tj 0 -75.9469 Td (3205 char name[DIRSIZ];) 109.213 Tj 0 -85.4403 Td (3206 };) 30.5796 Tj 0 -94.9336 Td (3207 ) 21.8426 Tj 0 -104.427 Td (3208 ) 21.8426 Tj 0 -113.92 Td (3209 ) 21.8426 Tj 0 -123.414 Td (3210 ) 21.8426 Tj 0 -132.907 Td (3211 ) 21.8426 Tj 0 -142.4 Td (3212 ) 21.8426 Tj 0 -151.894 Td (3213 ) 21.8426 Tj 0 -161.387 Td (3214 ) 21.8426 Tj 0 -170.88 Td (3215 ) 21.8426 Tj 0 -180.374 Td (3216 ) 21.8426 Tj 0 -189.867 Td (3217 ) 21.8426 Tj 0 -199.361 Td (3218 ) 21.8426 Tj 0 -208.854 Td (3219 ) 21.8426 Tj 0 -218.347 Td (3220 ) 21.8426 Tj 0 -227.841 Td (3221 ) 21.8426 Tj 0 -237.334 Td (3222 ) 21.8426 Tj 0 -246.827 Td (3223 ) 21.8426 Tj 0 -256.321 Td (3224 ) 21.8426 Tj 0 -265.814 Td (3225 ) 21.8426 Tj 0 -275.307 Td (3226 ) 21.8426 Tj 0 -284.801 Td (3227 ) 21.8426 Tj 0 -294.294 Td (3228 ) 21.8426 Tj 0 -303.788 Td (3229 ) 21.8426 Tj 0 -313.281 Td (3230 ) 21.8426 Tj 0 -322.774 Td (3231 ) 21.8426 Tj 0 -332.268 Td (3232 ) 21.8426 Tj 0 -341.761 Td (3233 ) 21.8426 Tj 0 -351.254 Td (3234 ) 21.8426 Tj 0 -360.748 Td (3235 ) 21.8426 Tj 0 -370.241 Td (3236 ) 21.8426 Tj 0 -379.734 Td (3237 ) 21.8426 Tj 0 -389.228 Td (3238 ) 21.8426 Tj 0 -398.721 Td (3239 ) 21.8426 Tj 0 -408.214 Td (3240 ) 21.8426 Tj 0 -417.708 Td (3241 ) 21.8426 Tj 0 -427.201 Td (3242 ) 21.8426 Tj 0 -436.695 Td (3243 ) 21.8426 Tj 0 -446.188 Td (3244 ) 21.8426 Tj 0 -455.681 Td (3245 ) 21.8426 Tj 0 -465.175 Td (3246 ) 21.8426 Tj 0 -474.668 Td (3247 ) 21.8426 Tj 0 -484.161 Td (3248 ) 21.8426 Tj 0 -493.655 Td (3249 ) 21.8426 Tj 0 -522.135 Td (Sheet 32) 34.9481 Tj Q Q q 180 500 5760 3460 re W /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [10 0 0 10 0 0] cm [1 0 0 1 0 0] Tm 0 0 Td [0 -0.967854 1 0 564.72 392.864] Tm 0 0 Td /F9_0 8.70222 Tf (Aug 30 10:08 2007 xv6/fsvar.h Page 1) 166.004 Tj 0 -28.4801 Td (3250 // in-core file system types) 144.161 Tj 0 -37.9735 Td (3251 ) 21.8426 Tj 0 -47.4668 Td (3252 struct inode {) 83.0018 Tj 0 -56.9602 Td (3253 uint dev; // Device number) 187.846 Tj 0 -66.4535 Td (3254 uint inum; // Inode number) 183.478 Tj 0 -75.9469 Td (3255 int ref; // Reference count) 196.583 Tj 0 -85.4403 Td (3256 int flags; // I_BUSY, I_VALID) 196.583 Tj 0 -94.9336 Td (3257 ) 21.8426 Tj 0 -104.427 Td (3258 short type; // copy of disk inode) 209.689 Tj 0 -113.92 Td (3259 short major;) 83.0018 Tj 0 -123.414 Td (3260 short minor;) 83.0018 Tj 0 -132.907 Td (3261 short nlink;) 83.0018 Tj 0 -142.4 Td (3262 uint size;) 74.2647 Tj 0 -151.894 Td (3263 uint addrs[NADDRS];) 113.581 Tj 0 -161.387 Td (3264 };) 30.5796 Tj 0 -170.88 Td (3265 ) 21.8426 Tj 0 -180.374 Td (3266 #define I_BUSY 0x1) 100.476 Tj 0 -189.867 Td (3267 #define I_VALID 0x2) 104.844 Tj 0 -199.361 Td (3268 ) 21.8426 Tj 0 -208.854 Td (3269 ) 21.8426 Tj 0 -218.347 Td (3270 ) 21.8426 Tj 0 -227.841 Td (3271 ) 21.8426 Tj 0 -237.334 Td (3272 ) 21.8426 Tj 0 -246.827 Td (3273 ) 21.8426 Tj 0 -256.321 Td (3274 ) 21.8426 Tj 0 -265.814 Td (3275 ) 21.8426 Tj 0 -275.307 Td (3276 ) 21.8426 Tj 0 -284.801 Td (3277 ) 21.8426 Tj 0 -294.294 Td (3278 ) 21.8426 Tj 0 -303.788 Td (3279 ) 21.8426 Tj 0 -313.281 Td (3280 ) 21.8426 Tj 0 -322.774 Td (3281 ) 21.8426 Tj 0 -332.268 Td (3282 ) 21.8426 Tj 0 -341.761 Td (3283 ) 21.8426 Tj 0 -351.254 Td (3284 ) 21.8426 Tj 0 -360.748 Td (3285 ) 21.8426 Tj 0 -370.241 Td (3286 ) 21.8426 Tj 0 -379.734 Td (3287 ) 21.8426 Tj 0 -389.228 Td (3288 ) 21.8426 Tj 0 -398.721 Td (3289 ) 21.8426 Tj 0 -408.214 Td (3290 ) 21.8426 Tj 0 -417.708 Td (3291 ) 21.8426 Tj 0 -427.201 Td (3292 ) 21.8426 Tj 0 -436.695 Td (3293 ) 21.8426 Tj 0 -446.188 Td (3294 ) 21.8426 Tj 0 -455.681 Td (3295 ) 21.8426 Tj 0 -465.175 Td (3296 ) 21.8426 Tj 0 -474.668 Td (3297 ) 21.8426 Tj 0 -484.161 Td (3298 ) 21.8426 Tj 0 -493.655 Td (3299 ) 21.8426 Tj 0 -522.135 Td (Sheet 32) 34.9481 Tj Q Q Q Q showpage %%PageTrailer pdfEndPage %%Page: 40 40 %%BeginPageSetup %%PageOrientation: Landscape pdfStartPage 180 rotate -612 -792 translate 0 0 612 792 re W %%EndPageSetup [] 0 d 1 i 0 j 0 J 10 M 1 w /DeviceGray {} cs [0] sc /DeviceGray {} CS [0] SC false op false OP 0 0 612 792 re W q q [0.1 0 0 0.1 0 0] cm q 180 3960 5760 3460 re W /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [10 0 0 10 0 0] cm [1 0 0 1 0 0] Tm 0 0 Td [0 -0.967854 1 0 564.72 738.864] Tm 0 0 Td /F9_0 8.70222 Tf (Aug 30 10:08 2007 xv6/ide.c Page 1) 157.267 Tj 0 -28.4801 Td (3300 // Simple PIO-based \(non-DMA\) IDE driver code.) 222.794 Tj 0 -37.9735 Td (3301 ) 21.8426 Tj 0 -47.4668 Td (3302 #include "types.h") 100.476 Tj 0 -56.9602 Td (3303 #include "defs.h") 96.1073 Tj 0 -66.4535 Td (3304 #include "param.h") 100.476 Tj 0 -75.9469 Td (3305 #include "mmu.h") 91.7388 Tj 0 -85.4403 Td (3306 #include "proc.h") 96.1073 Tj 0 -94.9336 Td (3307 #include "x86.h") 91.7388 Tj 0 -104.427 Td (3308 #include "traps.h") 100.476 Tj 0 -113.92 Td (3309 #include "spinlock.h") 113.581 Tj 0 -123.414 Td (3310 #include "buf.h") 91.7388 Tj 0 -132.907 Td (3311 ) 21.8426 Tj 0 -142.4 Td (3312 #define IDE_BSY 0x80) 135.424 Tj 0 -151.894 Td (3313 #define IDE_DRDY 0x40) 135.424 Tj 0 -161.387 Td (3314 #define IDE_DF 0x20) 135.424 Tj 0 -170.88 Td (3315 #define IDE_ERR 0x01) 135.424 Tj 0 -180.374 Td (3316 ) 21.8426 Tj 0 -189.867 Td (3317 #define IDE_CMD_READ 0x20) 135.424 Tj 0 -199.361 Td (3318 #define IDE_CMD_WRITE 0x30) 135.424 Tj 0 -208.854 Td (3319 ) 21.8426 Tj 0 -218.347 Td (3320 // ide_queue points to the buf now being read/written to t\ he disk.) 310.165 Tj 0 -227.841 Td (3321 // ide_queue->qnext points to the next buf to be processed\ .) 279.585 Tj 0 -237.334 Td (3322 // You must hold ide_lock while manipulating queue.) 244.637 Tj 0 -246.827 Td (3323 ) 21.8426 Tj 0 -256.321 Td (3324 static struct spinlock ide_lock;) 161.635 Tj 0 -265.814 Td (3325 static struct buf *ide_queue;) 148.529 Tj 0 -275.307 Td (3326 ) 21.8426 Tj 0 -284.801 Td (3327 static int disk_1_present;) 135.424 Tj 0 -294.294 Td (3328 static void ide_start_request\(\);) 161.635 Tj 0 -303.788 Td (3329 ) 21.8426 Tj 0 -313.281 Td (3330 // Wait for IDE disk to become ready.) 183.478 Tj 0 -322.774 Td (3331 static int) 65.5277 Tj 0 -332.268 Td (3332 ide_wait_ready\(int check_error\)) 157.267 Tj 0 -341.761 Td (3333 {) 26.2111 Tj 0 -351.254 Td (3334 int r;) 56.7907 Tj 0 -360.748 Td (3335 ) 21.8426 Tj 0 -370.241 Td (3336 while\(\(\(r = inb\(0x1f7\)\) & IDE_BSY\) || !\(r & IDE_\ DRDY\)\)) 266.479 Tj 0 -379.734 Td (3337 ;) 43.6851 Tj 0 -389.228 Td (3338 if\(check_error && \(r & \(IDE_DF|IDE_ERR\)\) != 0\)) 231.531 Tj 0 -398.721 Td (3339 return -1;) 83.0018 Tj 0 -408.214 Td (3340 return 0;) 69.8962 Tj 0 -417.708 Td (3341 }) 26.2111 Tj 0 -427.201 Td (3342 ) 21.8426 Tj 0 -436.695 Td (3343 ) 21.8426 Tj 0 -446.188 Td (3344 ) 21.8426 Tj 0 -455.681 Td (3345 ) 21.8426 Tj 0 -465.175 Td (3346 ) 21.8426 Tj 0 -474.668 Td (3347 ) 21.8426 Tj 0 -484.161 Td (3348 ) 21.8426 Tj 0 -493.655 Td (3349 ) 21.8426 Tj 0 -522.135 Td (Sheet 33) 34.9481 Tj Q Q q 180 500 5760 3460 re W /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [10 0 0 10 0 0] cm [1 0 0 1 0 0] Tm 0 0 Td [0 -0.967854 1 0 564.72 392.864] Tm 0 0 Td /F9_0 8.70222 Tf (Aug 30 10:08 2007 xv6/ide.c Page 2) 157.267 Tj 0 -28.4801 Td (3350 void) 39.3166 Tj 0 -37.9735 Td (3351 ide_init\(void\)) 83.0018 Tj 0 -47.4668 Td (3352 {) 26.2111 Tj 0 -56.9602 Td (3353 int i;) 56.7907 Tj 0 -66.4535 Td (3354 ) 21.8426 Tj 0 -75.9469 Td (3355 initlock\(&ide_lock, "ide"\);) 148.529 Tj 0 -85.4403 Td (3356 pic_enable\(IRQ_IDE\);) 117.95 Tj 0 -94.9336 Td (3357 ioapic_enable\(IRQ_IDE, ncpu - 1\);) 174.741 Tj 0 -104.427 Td (3358 ide_wait_ready\(0\);) 109.213 Tj 0 -113.92 Td (3359 ) 21.8426 Tj 0 -123.414 Td (3360 // Check if disk 1 is present) 157.267 Tj 0 -132.907 Td (3361 outb\(0x1f6, 0xe0 | \(1<<4\)\);) 148.529 Tj 0 -142.4 Td (3362 for\(i=0; i<1000; i++\){) 126.687 Tj 0 -151.894 Td (3363 if\(inb\(0x1f7\) != 0\){) 126.687 Tj 0 -161.387 Td (3364 disk_1_present = 1;) 131.055 Tj 0 -170.88 Td (3365 break;) 74.2647 Tj 0 -180.374 Td (3366 }) 43.6851 Tj 0 -189.867 Td (3367 }) 34.9481 Tj 0 -199.361 Td (3368 ) 21.8426 Tj 0 -208.854 Td (3369 // Switch back to disk 0.) 139.792 Tj 0 -218.347 Td (3370 outb\(0x1f6, 0xe0 | \(0<<4\)\);) 148.529 Tj 0 -227.841 Td (3371 }) 26.2111 Tj 0 -237.334 Td (3372 ) 21.8426 Tj 0 -246.827 Td (3373 // Start the request for b. Caller must hold ide_lock.) 262.111 Tj 0 -256.321 Td (3374 static void) 69.8962 Tj 0 -265.814 Td (3375 ide_start_request\(struct buf *b\)) 161.635 Tj 0 -275.307 Td (3376 {) 26.2111 Tj 0 -284.801 Td (3377 if\(b == 0\)) 74.2647 Tj 0 -294.294 Td (3378 panic\("ide_start_request"\);) 157.267 Tj 0 -303.788 Td (3379 ) 21.8426 Tj 0 -313.281 Td (3380 ide_wait_ready\(0\);) 109.213 Tj 0 -322.774 Td (3381 outb\(0x3f6, 0\); // generate interrupt) 196.583 Tj 0 -332.268 Td (3382 outb\(0x1f2, 1\); // number of sectors) 192.215 Tj 0 -341.761 Td (3383 outb\(0x1f3, b->sector & 0xff\);) 161.635 Tj 0 -351.254 Td (3384 outb\(0x1f4, \(b->sector >> 8\) & 0xff\);) 192.215 Tj 0 -360.748 Td (3385 outb\(0x1f5, \(b->sector >> 16\) & 0xff\);) 196.583 Tj 0 -370.241 Td (3386 outb\(0x1f6, 0xe0 | \(\(b->dev&1\)<<4\) | \(\(b->sector>\ >24\)&0x0f\)\);) 297.059 Tj 0 -379.734 Td (3387 if\(b->flags & B_DIRTY\){) 131.055 Tj 0 -389.228 Td (3388 outb\(0x1f7, IDE_CMD_WRITE\);) 157.267 Tj 0 -398.721 Td (3389 outsl\(0x1f0, b->data, 512/4\);) 166.004 Tj 0 -408.214 Td (3390 } else {) 65.5277 Tj 0 -417.708 Td (3391 outb\(0x1f7, IDE_CMD_READ\);) 152.898 Tj 0 -427.201 Td (3392 }) 34.9481 Tj 0 -436.695 Td (3393 }) 26.2111 Tj 0 -446.188 Td (3394 ) 21.8426 Tj 0 -455.681 Td (3395 ) 21.8426 Tj 0 -465.175 Td (3396 ) 21.8426 Tj 0 -474.668 Td (3397 ) 21.8426 Tj 0 -484.161 Td (3398 ) 21.8426 Tj 0 -493.655 Td (3399 ) 21.8426 Tj 0 -522.135 Td (Sheet 33) 34.9481 Tj Q Q Q Q showpage %%PageTrailer pdfEndPage %%Page: 41 41 %%BeginPageSetup %%PageOrientation: Landscape pdfStartPage 180 rotate -612 -792 translate 0 0 612 792 re W %%EndPageSetup [] 0 d 1 i 0 j 0 J 10 M 1 w /DeviceGray {} cs [0] sc /DeviceGray {} CS [0] SC false op false OP 0 0 612 792 re W q q [0.1 0 0 0.1 0 0] cm q 180 3960 5760 3460 re W /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [10 0 0 10 0 0] cm [1 0 0 1 0 0] Tm 0 0 Td [0 -0.967854 1 0 564.72 738.864] Tm 0 0 Td /F9_0 8.70222 Tf (Aug 30 10:08 2007 xv6/ide.c Page 3) 157.267 Tj 0 -28.4801 Td (3400 // Interrupt handler.) 113.581 Tj 0 -37.9735 Td (3401 void) 39.3166 Tj 0 -47.4668 Td (3402 ide_intr\(void\)) 83.0018 Tj 0 -56.9602 Td (3403 {) 26.2111 Tj 0 -66.4535 Td (3404 struct buf *b;) 91.7388 Tj 0 -75.9469 Td (3405 ) 21.8426 Tj 0 -85.4403 Td (3406 acquire\(&ide_lock\);) 113.581 Tj 0 -94.9336 Td (3407 if\(\(b = ide_queue\) == 0\){) 139.792 Tj 0 -104.427 Td (3408 cprintf\("stray ide interrupt\\n"\);) 183.478 Tj 0 -113.92 Td (3409 release\(&ide_lock\);) 122.318 Tj 0 -123.414 Td (3410 return;) 69.8962 Tj 0 -132.907 Td (3411 }) 34.9481 Tj 0 -142.4 Td (3412 ) 21.8426 Tj 0 -151.894 Td (3413 // Read data if needed.) 131.055 Tj 0 -161.387 Td (3414 if\(!\(b->flags & B_DIRTY\) && ide_wait_ready\(1\) >= 0\)) 253.374 Tj 0 -170.88 Td (3415 insl\(0x1f0, b->data, 512/4\);) 161.635 Tj 0 -180.374 Td (3416 ) 21.8426 Tj 0 -189.867 Td (3417 // Wake process waiting for this buf.) 192.215 Tj 0 -199.361 Td (3418 b->flags |= B_VALID;) 117.95 Tj 0 -208.854 Td (3419 b->flags &= ~B_DIRTY;) 122.318 Tj 0 -218.347 Td (3420 wakeup\(b\);) 74.2647 Tj 0 -227.841 Td (3421 ) 21.8426 Tj 0 -237.334 Td (3422 // Start disk on next buf in queue.) 183.478 Tj 0 -246.827 Td (3423 if\(\(ide_queue = b->qnext\) != 0\)) 166.004 Tj 0 -256.321 Td (3424 ide_start_request\(ide_queue\);) 166.004 Tj 0 -265.814 Td (3425 ) 21.8426 Tj 0 -275.307 Td (3426 release\(&ide_lock\);) 113.581 Tj 0 -284.801 Td (3427 }) 26.2111 Tj 0 -294.294 Td (3428 ) 21.8426 Tj 0 -303.788 Td (3429 ) 21.8426 Tj 0 -313.281 Td (3430 ) 21.8426 Tj 0 -322.774 Td (3431 ) 21.8426 Tj 0 -332.268 Td (3432 ) 21.8426 Tj 0 -341.761 Td (3433 ) 21.8426 Tj 0 -351.254 Td (3434 ) 21.8426 Tj 0 -360.748 Td (3435 ) 21.8426 Tj 0 -370.241 Td (3436 ) 21.8426 Tj 0 -379.734 Td (3437 ) 21.8426 Tj 0 -389.228 Td (3438 ) 21.8426 Tj 0 -398.721 Td (3439 ) 21.8426 Tj 0 -408.214 Td (3440 ) 21.8426 Tj 0 -417.708 Td (3441 ) 21.8426 Tj 0 -427.201 Td (3442 ) 21.8426 Tj 0 -436.695 Td (3443 ) 21.8426 Tj 0 -446.188 Td (3444 ) 21.8426 Tj 0 -455.681 Td (3445 ) 21.8426 Tj 0 -465.175 Td (3446 ) 21.8426 Tj 0 -474.668 Td (3447 ) 21.8426 Tj 0 -484.161 Td (3448 ) 21.8426 Tj 0 -493.655 Td (3449 ) 21.8426 Tj 0 -522.135 Td (Sheet 34) 34.9481 Tj Q Q q 180 500 5760 3460 re W /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [10 0 0 10 0 0] cm [1 0 0 1 0 0] Tm 0 0 Td [0 -0.967854 1 0 564.72 392.864] Tm 0 0 Td /F9_0 8.70222 Tf (Aug 30 10:08 2007 xv6/ide.c Page 4) 157.267 Tj 0 -28.4801 Td (3450 // Sync buf with disk.) 117.95 Tj 0 -37.9735 Td (3451 // If B_DIRTY is set, write buf to disk, clear B_DIRTY, se\ t B_VALID.) 318.902 Tj 0 -47.4668 Td (3452 // Else if B_VALID is not set, read buf from disk, set B_V\ ALID.) 297.059 Tj 0 -56.9602 Td (3453 void) 39.3166 Tj 0 -66.4535 Td (3454 ide_rw\(struct buf *b\)) 113.581 Tj 0 -75.9469 Td (3455 {) 26.2111 Tj 0 -85.4403 Td (3456 struct buf **pp;) 100.476 Tj 0 -94.9336 Td (3457 ) 21.8426 Tj 0 -104.427 Td (3458 if\(!\(b->flags & B_BUSY\)\)) 135.424 Tj 0 -113.92 Td (3459 panic\("ide_rw: buf not busy"\);) 170.372 Tj 0 -123.414 Td (3460 if\(\(b->flags & \(B_VALID|B_DIRTY\)\) == B_VALID\)) 227.163 Tj 0 -132.907 Td (3461 panic\("ide_rw: nothing to do"\);) 174.741 Tj 0 -142.4 Td (3462 if\(b->dev != 0 && !disk_1_present\)) 179.109 Tj 0 -151.894 Td (3463 panic\("ide disk 1 not present"\);) 179.109 Tj 0 -161.387 Td (3464 ) 21.8426 Tj 0 -170.88 Td (3465 acquire\(&ide_lock\);) 113.581 Tj 0 -180.374 Td (3466 ) 21.8426 Tj 0 -189.867 Td (3467 // Append b to ide_queue.) 139.792 Tj 0 -199.361 Td (3468 b->qnext = 0;) 87.3703 Tj 0 -208.854 Td (3469 for\(pp=&ide_queue; *pp; pp=&\(*pp\)->qnext\)) 209.689 Tj 0 -218.347 Td (3470 ;) 43.6851 Tj 0 -227.841 Td (3471 *pp = b;) 65.5277 Tj 0 -237.334 Td (3472 ) 21.8426 Tj 0 -246.827 Td (3473 // Start disk if necessary.) 148.529 Tj 0 -256.321 Td (3474 if\(ide_queue == b\)) 109.213 Tj 0 -265.814 Td (3475 ide_start_request\(b\);) 131.055 Tj 0 -275.307 Td (3476 ) 21.8426 Tj 0 -284.801 Td (3477 // Wait for request to finish.) 161.635 Tj 0 -294.294 Td (3478 // Assuming will not sleep too long: ignore cp->killed.) 270.848 Tj 0 -303.788 Td (3479 while\(\(b->flags & \(B_VALID|B_DIRTY\)\) != B_VALID\)) 240.268 Tj 0 -313.281 Td (3480 sleep\(b, &ide_lock\);) 126.687 Tj 0 -322.774 Td (3481 ) 21.8426 Tj 0 -332.268 Td (3482 release\(&ide_lock\);) 113.581 Tj 0 -341.761 Td (3483 }) 26.2111 Tj 0 -351.254 Td (3484 ) 21.8426 Tj 0 -360.748 Td (3485 ) 21.8426 Tj 0 -370.241 Td (3486 ) 21.8426 Tj 0 -379.734 Td (3487 ) 21.8426 Tj 0 -389.228 Td (3488 ) 21.8426 Tj 0 -398.721 Td (3489 ) 21.8426 Tj 0 -408.214 Td (3490 ) 21.8426 Tj 0 -417.708 Td (3491 ) 21.8426 Tj 0 -427.201 Td (3492 ) 21.8426 Tj 0 -436.695 Td (3493 ) 21.8426 Tj 0 -446.188 Td (3494 ) 21.8426 Tj 0 -455.681 Td (3495 ) 21.8426 Tj 0 -465.175 Td (3496 ) 21.8426 Tj 0 -474.668 Td (3497 ) 21.8426 Tj 0 -484.161 Td (3498 ) 21.8426 Tj 0 -493.655 Td (3499 ) 21.8426 Tj 0 -522.135 Td (Sheet 34) 34.9481 Tj Q Q Q Q showpage %%PageTrailer pdfEndPage %%Page: 42 42 %%BeginPageSetup %%PageOrientation: Landscape pdfStartPage 180 rotate -612 -792 translate 0 0 612 792 re W %%EndPageSetup [] 0 d 1 i 0 j 0 J 10 M 1 w /DeviceGray {} cs [0] sc /DeviceGray {} CS [0] SC false op false OP 0 0 612 792 re W q q [0.1 0 0 0.1 0 0] cm q 180 3960 5760 3460 re W /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [10 0 0 10 0 0] cm [1 0 0 1 0 0] Tm 0 0 Td [0 -0.967854 1 0 564.72 738.864] Tm 0 0 Td /F9_0 8.70222 Tf (Aug 30 10:08 2007 xv6/bio.c Page 1) 157.267 Tj 0 -28.4801 Td (3500 // Buffer cache.) 91.7388 Tj 0 -37.9735 Td (3501 //) 30.5796 Tj 0 -47.4668 Td (3502 // The buffer cache is a linked list of buf structures hol\ ding) 292.69 Tj 0 -56.9602 Td (3503 // cached copies of disk block contents. Caching disk blo\ cks) 288.322 Tj 0 -66.4535 Td (3504 // in memory reduces the number of disk reads and also pro\ vides) 297.059 Tj 0 -75.9469 Td (3505 // a synchronization point for disk blocks used by multipl\ e processes.) 327.639 Tj 0 -85.4403 Td (3506 //) 30.5796 Tj 0 -94.9336 Td (3507 // Interface:) 78.6333 Tj 0 -104.427 Td (3508 // * To get a buffer for a particular disk block, call bre\ ad.) 288.322 Tj 0 -113.92 Td (3509 // * After changing buffer data, call bwrite to flush it t\ o disk.) 305.796 Tj 0 -123.414 Td (3510 // * When done with the buffer, call brelse.) 214.057 Tj 0 -132.907 Td (3511 // * Do not use the buffer after calling brelse.) 231.531 Tj 0 -142.4 Td (3512 // * Only one process at a time can use a buffer,) 235.9 Tj 0 -151.894 Td (3513 // so do not keep them longer than necessary.) 235.9 Tj 0 -161.387 Td (3514 //) 30.5796 Tj 0 -170.88 Td (3515 // The implementation uses three state flags internally:) 266.479 Tj 0 -180.374 Td (3516 // * B_BUSY: the block has been returned from bread) 244.637 Tj 0 -189.867 Td (3517 // and has not been passed back to brelse.) 222.794 Tj 0 -199.361 Td (3518 // * B_VALID: the buffer data has been initialized) 240.268 Tj 0 -208.854 Td (3519 // with the associated disk block contents.) 227.163 Tj 0 -218.347 Td (3520 // * B_DIRTY: the buffer data has been modified) 227.163 Tj 0 -227.841 Td (3521 // and needs to be written to disk.) 192.215 Tj 0 -237.334 Td (3522 ) 21.8426 Tj 0 -246.827 Td (3523 #include "types.h") 100.476 Tj 0 -256.321 Td (3524 #include "defs.h") 96.1073 Tj 0 -265.814 Td (3525 #include "param.h") 100.476 Tj 0 -275.307 Td (3526 #include "spinlock.h") 113.581 Tj 0 -284.801 Td (3527 #include "buf.h") 91.7388 Tj 0 -294.294 Td (3528 ) 21.8426 Tj 0 -303.788 Td (3529 struct buf buf[NBUF];) 113.581 Tj 0 -313.281 Td (3530 struct spinlock buf_table_lock;) 157.267 Tj 0 -322.774 Td (3531 ) 21.8426 Tj 0 -332.268 Td (3532 // Linked list of all buffers, through prev/next.) 235.9 Tj 0 -341.761 Td (3533 // bufhead->next is most recently used.) 192.215 Tj 0 -351.254 Td (3534 // bufhead->tail is least recently used.) 196.583 Tj 0 -360.748 Td (3535 struct buf bufhead;) 104.844 Tj 0 -370.241 Td (3536 ) 21.8426 Tj 0 -379.734 Td (3537 void) 39.3166 Tj 0 -389.228 Td (3538 binit\(void\)) 69.8962 Tj 0 -398.721 Td (3539 {) 26.2111 Tj 0 -408.214 Td (3540 struct buf *b;) 91.7388 Tj 0 -417.708 Td (3541 ) 21.8426 Tj 0 -427.201 Td (3542 initlock\(&buf_table_lock, "buf_table"\);) 200.952 Tj 0 -436.695 Td (3543 ) 21.8426 Tj 0 -446.188 Td (3544 ) 21.8426 Tj 0 -455.681 Td (3545 ) 21.8426 Tj 0 -465.175 Td (3546 ) 21.8426 Tj 0 -474.668 Td (3547 ) 21.8426 Tj 0 -484.161 Td (3548 ) 21.8426 Tj 0 -493.655 Td (3549 ) 21.8426 Tj 0 -522.135 Td (Sheet 35) 34.9481 Tj Q Q q 180 500 5760 3460 re W /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [10 0 0 10 0 0] cm [1 0 0 1 0 0] Tm 0 0 Td [0 -0.967854 1 0 564.72 392.864] Tm 0 0 Td /F9_0 8.70222 Tf (Aug 30 10:08 2007 xv6/bio.c Page 2) 157.267 Tj 0 -28.4801 Td (3550 // Create linked list of buffers) 170.372 Tj 0 -37.9735 Td (3551 bufhead.prev = &bufhead;) 135.424 Tj 0 -47.4668 Td (3552 bufhead.next = &bufhead;) 135.424 Tj 0 -56.9602 Td (3553 for\(b = buf; b < buf+NBUF; b++\){) 170.372 Tj 0 -66.4535 Td (3554 b->next = bufhead.next;) 139.792 Tj 0 -75.9469 Td (3555 b->prev = &bufhead;) 122.318 Tj 0 -85.4403 Td (3556 bufhead.next->prev = b;) 139.792 Tj 0 -94.9336 Td (3557 bufhead.next = b;) 113.581 Tj 0 -104.427 Td (3558 }) 34.9481 Tj 0 -113.92 Td (3559 }) 26.2111 Tj 0 -123.414 Td (3560 ) 21.8426 Tj 0 -132.907 Td (3561 // Look through buffer cache for sector on device dev.) 257.742 Tj 0 -142.4 Td (3562 // If not found, allocate fresh block.) 187.846 Tj 0 -151.894 Td (3563 // In either case, return locked buffer.) 196.583 Tj 0 -161.387 Td (3564 static struct buf*) 100.476 Tj 0 -170.88 Td (3565 bget\(uint dev, uint sector\)) 139.792 Tj 0 -180.374 Td (3566 {) 26.2111 Tj 0 -189.867 Td (3567 struct buf *b;) 91.7388 Tj 0 -199.361 Td (3568 ) 21.8426 Tj 0 -208.854 Td (3569 acquire\(&buf_table_lock\);) 139.792 Tj 0 -218.347 Td (3570 ) 21.8426 Tj 0 -227.841 Td (3571 loop:) 48.0537 Tj 0 -237.334 Td (3572 // Try for cached block.) 135.424 Tj 0 -246.827 Td (3573 for\(b = bufhead.next; b != &bufhead; b = b->next\){) 249.005 Tj 0 -256.321 Td (3574 if\(\(b->flags & \(B_BUSY|B_VALID\)\) &&) 192.215 Tj 0 -265.814 Td (3575 b->dev == dev && b->sector == sector\){) 218.426 Tj 0 -275.307 Td (3576 if\(b->flags & B_BUSY\){) 144.161 Tj 0 -284.801 Td (3577 sleep\(buf, &buf_table_lock\);) 179.109 Tj 0 -294.294 Td (3578 goto loop;) 100.476 Tj 0 -303.788 Td (3579 }) 52.4222 Tj 0 -313.281 Td (3580 b->flags |= B_BUSY;) 131.055 Tj 0 -322.774 Td (3581 release\(&buf_table_lock\);) 157.267 Tj 0 -332.268 Td (3582 return b;) 87.3703 Tj 0 -341.761 Td (3583 }) 43.6851 Tj 0 -351.254 Td (3584 }) 34.9481 Tj 0 -360.748 Td (3585 ) 21.8426 Tj 0 -370.241 Td (3586 // Allocate fresh block.) 135.424 Tj 0 -379.734 Td (3587 for\(b = bufhead.prev; b != &bufhead; b = b->prev\){) 249.005 Tj 0 -389.228 Td (3588 if\(\(b->flags & B_BUSY\) == 0\){) 166.004 Tj 0 -398.721 Td (3589 b->flags = B_BUSY;) 126.687 Tj 0 -408.214 Td (3590 b->dev = dev;) 104.844 Tj 0 -417.708 Td (3591 b->sector = sector;) 131.055 Tj 0 -427.201 Td (3592 release\(&buf_table_lock\);) 157.267 Tj 0 -436.695 Td (3593 return b;) 87.3703 Tj 0 -446.188 Td (3594 }) 43.6851 Tj 0 -455.681 Td (3595 }) 34.9481 Tj 0 -465.175 Td (3596 panic\("bget: no buffers"\);) 144.161 Tj 0 -474.668 Td (3597 }) 26.2111 Tj 0 -484.161 Td (3598 ) 21.8426 Tj 0 -493.655 Td (3599 ) 21.8426 Tj 0 -522.135 Td (Sheet 35) 34.9481 Tj Q Q Q Q showpage %%PageTrailer pdfEndPage %%Page: 43 43 %%BeginPageSetup %%PageOrientation: Landscape pdfStartPage 180 rotate -612 -792 translate 0 0 612 792 re W %%EndPageSetup [] 0 d 1 i 0 j 0 J 10 M 1 w /DeviceGray {} cs [0] sc /DeviceGray {} CS [0] SC false op false OP 0 0 612 792 re W q q [0.1 0 0 0.1 0 0] cm q 180 3960 5760 3460 re W /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [10 0 0 10 0 0] cm [1 0 0 1 0 0] Tm 0 0 Td [0 -0.967854 1 0 564.72 738.864] Tm 0 0 Td /F9_0 8.70222 Tf (Aug 30 10:08 2007 xv6/bio.c Page 3) 157.267 Tj 0 -28.4801 Td (3600 // Return a B_BUSY buf with the contents of the indicated \ disk sector.) 327.639 Tj 0 -37.9735 Td (3601 struct buf*) 69.8962 Tj 0 -47.4668 Td (3602 bread\(uint dev, uint sector\)) 144.161 Tj 0 -56.9602 Td (3603 {) 26.2111 Tj 0 -66.4535 Td (3604 struct buf *b;) 91.7388 Tj 0 -75.9469 Td (3605 ) 21.8426 Tj 0 -85.4403 Td (3606 b = bget\(dev, sector\);) 126.687 Tj 0 -94.9336 Td (3607 if\(!\(b->flags & B_VALID\)\)) 139.792 Tj 0 -104.427 Td (3608 ide_rw\(b\);) 83.0018 Tj 0 -113.92 Td (3609 return b;) 69.8962 Tj 0 -123.414 Td (3610 }) 26.2111 Tj 0 -132.907 Td (3611 ) 21.8426 Tj 0 -142.4 Td (3612 // Write buf's contents to disk. Must be locked.) 235.9 Tj 0 -151.894 Td (3613 void) 39.3166 Tj 0 -161.387 Td (3614 bwrite\(struct buf *b\)) 113.581 Tj 0 -170.88 Td (3615 {) 26.2111 Tj 0 -180.374 Td (3616 if\(\(b->flags & B_BUSY\) == 0\)) 152.898 Tj 0 -189.867 Td (3617 panic\("bwrite"\);) 109.213 Tj 0 -199.361 Td (3618 b->flags |= B_DIRTY;) 117.95 Tj 0 -208.854 Td (3619 ide_rw\(b\);) 74.2647 Tj 0 -218.347 Td (3620 }) 26.2111 Tj 0 -227.841 Td (3621 ) 21.8426 Tj 0 -237.334 Td (3622 // Release the buffer buf.) 135.424 Tj 0 -246.827 Td (3623 void) 39.3166 Tj 0 -256.321 Td (3624 brelse\(struct buf *b\)) 113.581 Tj 0 -265.814 Td (3625 {) 26.2111 Tj 0 -275.307 Td (3626 if\(\(b->flags & B_BUSY\) == 0\)) 152.898 Tj 0 -284.801 Td (3627 panic\("brelse"\);) 109.213 Tj 0 -294.294 Td (3628 ) 21.8426 Tj 0 -303.788 Td (3629 acquire\(&buf_table_lock\);) 139.792 Tj 0 -313.281 Td (3630 ) 21.8426 Tj 0 -322.774 Td (3631 b->next->prev = b->prev;) 135.424 Tj 0 -332.268 Td (3632 b->prev->next = b->next;) 135.424 Tj 0 -341.761 Td (3633 b->next = bufhead.next;) 131.055 Tj 0 -351.254 Td (3634 b->prev = &bufhead;) 113.581 Tj 0 -360.748 Td (3635 bufhead.next->prev = b;) 131.055 Tj 0 -370.241 Td (3636 bufhead.next = b;) 104.844 Tj 0 -379.734 Td (3637 ) 21.8426 Tj 0 -389.228 Td (3638 b->flags &= ~B_BUSY;) 117.95 Tj 0 -398.721 Td (3639 wakeup\(buf\);) 83.0018 Tj 0 -408.214 Td (3640 ) 21.8426 Tj 0 -417.708 Td (3641 release\(&buf_table_lock\);) 139.792 Tj 0 -427.201 Td (3642 }) 26.2111 Tj 0 -436.695 Td (3643 ) 21.8426 Tj 0 -446.188 Td (3644 ) 21.8426 Tj 0 -455.681 Td (3645 ) 21.8426 Tj 0 -465.175 Td (3646 ) 21.8426 Tj 0 -474.668 Td (3647 ) 21.8426 Tj 0 -484.161 Td (3648 ) 21.8426 Tj 0 -493.655 Td (3649 ) 21.8426 Tj 0 -522.135 Td (Sheet 36) 34.9481 Tj Q Q q 180 500 5760 3460 re W /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [10 0 0 10 0 0] cm [1 0 0 1 0 0] Tm 0 0 Td [0 -0.967854 1 0 564.72 392.864] Tm 0 0 Td /F9_0 8.70222 Tf (Aug 30 10:08 2007 xv6/fs.c Page 1) 152.898 Tj 0 -28.4801 Td (3650 // File system implementation. Four layers:) 214.057 Tj 0 -37.9735 Td (3651 // + Blocks: allocator for raw disk blocks.) 218.426 Tj 0 -47.4668 Td (3652 // + Files: inode allocator, reading, writing, metadata.) 275.216 Tj 0 -56.9602 Td (3653 // + Directories: inode with special contents \(list of \ other inodes!\)) 332.007 Tj 0 -66.4535 Td (3654 // + Names: paths like /usr/rtm/xv6/fs.c for convenient \ naming.) 305.796 Tj 0 -75.9469 Td (3655 //) 30.5796 Tj 0 -85.4403 Td (3656 // Disk layout is: superblock, inodes, block in-use bitmap\ , data blocks.) 336.376 Tj 0 -94.9336 Td (3657 //) 30.5796 Tj 0 -104.427 Td (3658 // This file contains the low-level file system manipulati\ on) 283.953 Tj 0 -113.92 Td (3659 // routines. The \(higher-level\) system call implementat\ ions) 283.953 Tj 0 -123.414 Td (3660 // are in sysfile.c.) 109.213 Tj 0 -132.907 Td (3661 ) 21.8426 Tj 0 -142.4 Td (3662 #include "types.h") 100.476 Tj 0 -151.894 Td (3663 #include "defs.h") 96.1073 Tj 0 -161.387 Td (3664 #include "param.h") 100.476 Tj 0 -170.88 Td (3665 #include "stat.h") 96.1073 Tj 0 -180.374 Td (3666 #include "mmu.h") 91.7388 Tj 0 -189.867 Td (3667 #include "proc.h") 96.1073 Tj 0 -199.361 Td (3668 #include "spinlock.h") 113.581 Tj 0 -208.854 Td (3669 #include "buf.h") 91.7388 Tj 0 -218.347 Td (3670 #include "fs.h") 87.3703 Tj 0 -227.841 Td (3671 #include "fsvar.h") 100.476 Tj 0 -237.334 Td (3672 #include "dev.h") 91.7388 Tj 0 -246.827 Td (3673 ) 21.8426 Tj 0 -256.321 Td (3674 #define min\(a, b\) \(\(a\) < \(b\) ? \(a\) : \(b\)\)) 200.952 Tj 0 -265.814 Td (3675 static void itrunc\(struct inode*\);) 170.372 Tj 0 -275.307 Td (3676 ) 21.8426 Tj 0 -284.801 Td (3677 // Read the super block.) 126.687 Tj 0 -294.294 Td (3678 static void) 69.8962 Tj 0 -303.788 Td (3679 readsb\(int dev, struct superblock *sb\)) 187.846 Tj 0 -313.281 Td (3680 {) 26.2111 Tj 0 -322.774 Td (3681 struct buf *bp;) 96.1073 Tj 0 -332.268 Td (3682 ) 21.8426 Tj 0 -341.761 Td (3683 bp = bread\(dev, 1\);) 113.581 Tj 0 -351.254 Td (3684 memmove\(sb, bp->data, sizeof\(*sb\)\);) 183.478 Tj 0 -360.748 Td (3685 brelse\(bp\);) 78.6333 Tj 0 -370.241 Td (3686 }) 26.2111 Tj 0 -379.734 Td (3687 ) 21.8426 Tj 0 -389.228 Td (3688 // Zero a block.) 91.7388 Tj 0 -398.721 Td (3689 static void) 69.8962 Tj 0 -408.214 Td (3690 bzero\(int dev, int bno\)) 122.318 Tj 0 -417.708 Td (3691 {) 26.2111 Tj 0 -427.201 Td (3692 struct buf *bp;) 96.1073 Tj 0 -436.695 Td (3693 ) 21.8426 Tj 0 -446.188 Td (3694 bp = bread\(dev, bno\);) 122.318 Tj 0 -455.681 Td (3695 memset\(bp->data, 0, BSIZE\);) 148.529 Tj 0 -465.175 Td (3696 bwrite\(bp\);) 78.6333 Tj 0 -474.668 Td (3697 brelse\(bp\);) 78.6333 Tj 0 -484.161 Td (3698 }) 26.2111 Tj 0 -493.655 Td (3699 ) 21.8426 Tj 0 -522.135 Td (Sheet 36) 34.9481 Tj Q Q Q Q showpage %%PageTrailer pdfEndPage %%Page: 44 44 %%BeginPageSetup %%PageOrientation: Landscape pdfStartPage 180 rotate -612 -792 translate 0 0 612 792 re W %%EndPageSetup [] 0 d 1 i 0 j 0 J 10 M 1 w /DeviceGray {} cs [0] sc /DeviceGray {} CS [0] SC false op false OP 0 0 612 792 re W q q [0.1 0 0 0.1 0 0] cm q 180 3960 5760 3460 re W /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [10 0 0 10 0 0] cm [1 0 0 1 0 0] Tm 0 0 Td [0 -0.967854 1 0 564.72 738.864] Tm 0 0 Td /F9_0 8.70222 Tf (Aug 30 10:08 2007 xv6/fs.c Page 2) 152.898 Tj 0 -28.4801 Td (3700 // Blocks.) 65.5277 Tj 0 -37.9735 Td (3701 ) 21.8426 Tj 0 -47.4668 Td (3702 // Allocate a disk block.) 131.055 Tj 0 -56.9602 Td (3703 static uint) 69.8962 Tj 0 -66.4535 Td (3704 balloc\(uint dev\)) 91.7388 Tj 0 -75.9469 Td (3705 {) 26.2111 Tj 0 -85.4403 Td (3706 int b, bi, m;) 87.3703 Tj 0 -94.9336 Td (3707 struct buf *bp;) 96.1073 Tj 0 -104.427 Td (3708 struct superblock sb;) 122.318 Tj 0 -113.92 Td (3709 ) 21.8426 Tj 0 -123.414 Td (3710 bp = 0;) 61.1592 Tj 0 -132.907 Td (3711 readsb\(dev, &sb\);) 104.844 Tj 0 -142.4 Td (3712 for\(b = 0; b < sb.size; b += BPB\){) 179.109 Tj 0 -151.894 Td (3713 bp = bread\(dev, BBLOCK\(b, sb.ninodes\)\);) 209.689 Tj 0 -161.387 Td (3714 for\(bi = 0; bi < BPB; bi++\){) 161.635 Tj 0 -170.88 Td (3715 m = 1 << \(bi % 8\);) 126.687 Tj 0 -180.374 Td (3716 if\(\(bp->data[bi/8] & m\) == 0\){ // Is block free\ ?) 262.111 Tj 0 -189.867 Td (3717 bp->data[bi/8] |= m; // Mark block in use on disk\ .) 279.585 Tj 0 -199.361 Td (3718 bwrite\(bp\);) 104.844 Tj 0 -208.854 Td (3719 brelse\(bp\);) 104.844 Tj 0 -218.347 Td (3720 return b + bi;) 117.95 Tj 0 -227.841 Td (3721 }) 52.4222 Tj 0 -237.334 Td (3722 }) 43.6851 Tj 0 -246.827 Td (3723 brelse\(bp\);) 87.3703 Tj 0 -256.321 Td (3724 }) 34.9481 Tj 0 -265.814 Td (3725 panic\("balloc: out of blocks"\);) 166.004 Tj 0 -275.307 Td (3726 }) 26.2111 Tj 0 -284.801 Td (3727 ) 21.8426 Tj 0 -294.294 Td (3728 // Free a disk block.) 113.581 Tj 0 -303.788 Td (3729 static void) 69.8962 Tj 0 -313.281 Td (3730 bfree\(int dev, uint b\)) 117.95 Tj 0 -322.774 Td (3731 {) 26.2111 Tj 0 -332.268 Td (3732 struct buf *bp;) 96.1073 Tj 0 -341.761 Td (3733 struct superblock sb;) 122.318 Tj 0 -351.254 Td (3734 int bi, m;) 74.2647 Tj 0 -360.748 Td (3735 ) 21.8426 Tj 0 -370.241 Td (3736 bzero\(dev, b\);) 91.7388 Tj 0 -379.734 Td (3737 ) 21.8426 Tj 0 -389.228 Td (3738 readsb\(dev, &sb\);) 104.844 Tj 0 -398.721 Td (3739 bp = bread\(dev, BBLOCK\(b, sb.ninodes\)\);) 200.952 Tj 0 -408.214 Td (3740 bi = b % BPB;) 87.3703 Tj 0 -417.708 Td (3741 m = 1 << \(bi % 8\);) 109.213 Tj 0 -427.201 Td (3742 if\(\(bp->data[bi/8] & m\) == 0\)) 157.267 Tj 0 -436.695 Td (3743 panic\("freeing free block"\);) 161.635 Tj 0 -446.188 Td (3744 bp->data[bi/8] &= ~m; // Mark block free on disk.) 249.005 Tj 0 -455.681 Td (3745 bwrite\(bp\);) 78.6333 Tj 0 -465.175 Td (3746 brelse\(bp\);) 78.6333 Tj 0 -474.668 Td (3747 }) 26.2111 Tj 0 -484.161 Td (3748 ) 21.8426 Tj 0 -493.655 Td (3749 ) 21.8426 Tj 0 -522.135 Td (Sheet 37) 34.9481 Tj Q Q q 180 500 5760 3460 re W /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [10 0 0 10 0 0] cm [1 0 0 1 0 0] Tm 0 0 Td [0 -0.967854 1 0 564.72 392.864] Tm 0 0 Td /F9_0 8.70222 Tf (Aug 30 10:08 2007 xv6/fs.c Page 3) 152.898 Tj 0 -28.4801 Td (3750 // Inodes.) 65.5277 Tj 0 -37.9735 Td (3751 //) 30.5796 Tj 0 -47.4668 Td (3752 // An inode is a single, unnamed file in the file system.) 270.848 Tj 0 -56.9602 Td (3753 // The inode disk structure holds metadata \(the type, dev\ ice numbers,) 323.27 Tj 0 -66.4535 Td (3754 // and data size\) along with a list of blocks where the a\ ssociated) 310.165 Tj 0 -75.9469 Td (3755 // data can be found.) 113.581 Tj 0 -85.4403 Td (3756 //) 30.5796 Tj 0 -94.9336 Td (3757 // The inodes are laid out sequentially on disk immediatel\ y after) 305.796 Tj 0 -104.427 Td (3758 // the superblock. The kernel keeps a cache of the in-use) 275.216 Tj 0 -113.92 Td (3759 // on-disk structures to provide a place for synchronizing\ access) 305.796 Tj 0 -123.414 Td (3760 // to inodes shared between multiple processes.) 227.163 Tj 0 -132.907 Td (3761 //) 30.5796 Tj 0 -142.4 Td (3762 // ip->ref counts the number of pointer references to this\ cached) 305.796 Tj 0 -151.894 Td (3763 // inode; references are typically kept in struct file and\ in cp->cwd.) 327.639 Tj 0 -161.387 Td (3764 // When ip->ref falls to zero, the inode is no longer cach\ ed.) 288.322 Tj 0 -170.88 Td (3765 // It is an error to use an inode without holding a refere\ nce to it.) 318.902 Tj 0 -180.374 Td (3766 //) 30.5796 Tj 0 -189.867 Td (3767 // Processes are only allowed to read and write inode) 253.374 Tj 0 -199.361 Td (3768 // metadata and contents when holding the inode's lock,) 262.111 Tj 0 -208.854 Td (3769 // represented by the I_BUSY flag in the in-memory copy.) 266.479 Tj 0 -218.347 Td (3770 // Because inode locks are held during disk accesses,) 253.374 Tj 0 -227.841 Td (3771 // they are implemented using a flag rather than with) 253.374 Tj 0 -237.334 Td (3772 // spin locks. Callers are responsible for locking) 244.637 Tj 0 -246.827 Td (3773 // inodes before passing them to routines in this file; le\ aving) 297.059 Tj 0 -256.321 Td (3774 // this responsibility with the caller makes it possible f\ or them) 305.796 Tj 0 -265.814 Td (3775 // to create arbitrarily-sized atomic operations.) 235.9 Tj 0 -275.307 Td (3776 //) 30.5796 Tj 0 -284.801 Td (3777 // To give maximum control over locking to the callers,) 262.111 Tj 0 -294.294 Td (3778 // the routines in this file that return inode pointers) 262.111 Tj 0 -303.788 Td (3779 // return pointers to *unlocked* inodes. It is the caller\ s') 283.953 Tj 0 -313.281 Td (3780 // responsibility to lock them before using them. A non-z\ ero) 288.322 Tj 0 -322.774 Td (3781 // ip->ref keeps these unlocked inodes in the cache.) 249.005 Tj 0 -332.268 Td (3782 ) 21.8426 Tj 0 -341.761 Td (3783 struct {) 56.7907 Tj 0 -351.254 Td (3784 struct spinlock lock;) 122.318 Tj 0 -360.748 Td (3785 struct inode inode[NINODE];) 148.529 Tj 0 -370.241 Td (3786 } icache;) 61.1592 Tj 0 -379.734 Td (3787 ) 21.8426 Tj 0 -389.228 Td (3788 void) 39.3166 Tj 0 -398.721 Td (3789 iinit\(void\)) 69.8962 Tj 0 -408.214 Td (3790 {) 26.2111 Tj 0 -417.708 Td (3791 initlock\(&icache.lock, "icache.lock"\);) 196.583 Tj 0 -427.201 Td (3792 }) 26.2111 Tj 0 -436.695 Td (3793 ) 21.8426 Tj 0 -446.188 Td (3794 ) 21.8426 Tj 0 -455.681 Td (3795 ) 21.8426 Tj 0 -465.175 Td (3796 ) 21.8426 Tj 0 -474.668 Td (3797 ) 21.8426 Tj 0 -484.161 Td (3798 ) 21.8426 Tj 0 -493.655 Td (3799 ) 21.8426 Tj 0 -522.135 Td (Sheet 37) 34.9481 Tj Q Q Q Q showpage %%PageTrailer pdfEndPage %%Page: 45 45 %%BeginPageSetup %%PageOrientation: Landscape pdfStartPage 180 rotate -612 -792 translate 0 0 612 792 re W %%EndPageSetup [] 0 d 1 i 0 j 0 J 10 M 1 w /DeviceGray {} cs [0] sc /DeviceGray {} CS [0] SC false op false OP 0 0 612 792 re W q q [0.1 0 0 0.1 0 0] cm q 180 3960 5760 3460 re W /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [10 0 0 10 0 0] cm [1 0 0 1 0 0] Tm 0 0 Td [0 -0.967854 1 0 564.72 738.864] Tm 0 0 Td /F9_0 8.70222 Tf (Aug 30 10:08 2007 xv6/fs.c Page 4) 152.898 Tj 0 -28.4801 Td (3800 // Find the inode with number inum on device dev) 231.531 Tj 0 -37.9735 Td (3801 // and return the in-memory copy.) 166.004 Tj 0 -47.4668 Td (3802 static struct inode*) 109.213 Tj 0 -56.9602 Td (3803 iget\(uint dev, uint inum\)) 131.055 Tj 0 -66.4535 Td (3804 {) 26.2111 Tj 0 -75.9469 Td (3805 struct inode *ip, *empty;) 139.792 Tj 0 -85.4403 Td (3806 ) 21.8426 Tj 0 -94.9336 Td (3807 acquire\(&icache.lock\);) 126.687 Tj 0 -104.427 Td (3808 ) 21.8426 Tj 0 -113.92 Td (3809 // Try for cached inode.) 135.424 Tj 0 -123.414 Td (3810 empty = 0;) 74.2647 Tj 0 -132.907 Td (3811 for\(ip = &icache.inode[0]; ip < &icache.inode[NINODE]; \ ip++\){) 297.059 Tj 0 -142.4 Td (3812 if\(ip->ref > 0 && ip->dev == dev && ip->inum == inum\)\ {) 275.216 Tj 0 -151.894 Td (3813 ip->ref++;) 91.7388 Tj 0 -161.387 Td (3814 release\(&icache.lock\);) 144.161 Tj 0 -170.88 Td (3815 return ip;) 91.7388 Tj 0 -180.374 Td (3816 }) 43.6851 Tj 0 -189.867 Td (3817 if\(empty == 0 && ip->ref == 0\) // Remember empty \ slot.) 288.322 Tj 0 -199.361 Td (3818 empty = ip;) 96.1073 Tj 0 -208.854 Td (3819 }) 34.9481 Tj 0 -218.347 Td (3820 ) 21.8426 Tj 0 -227.841 Td (3821 // Allocate fresh inode.) 135.424 Tj 0 -237.334 Td (3822 if\(empty == 0\)) 91.7388 Tj 0 -246.827 Td (3823 panic\("iget: no inodes"\);) 148.529 Tj 0 -256.321 Td (3824 ) 21.8426 Tj 0 -265.814 Td (3825 ip = empty;) 78.6333 Tj 0 -275.307 Td (3826 ip->dev = dev;) 91.7388 Tj 0 -284.801 Td (3827 ip->inum = inum;) 100.476 Tj 0 -294.294 Td (3828 ip->ref = 1;) 83.0018 Tj 0 -303.788 Td (3829 ip->flags = 0;) 91.7388 Tj 0 -313.281 Td (3830 release\(&icache.lock\);) 126.687 Tj 0 -322.774 Td (3831 ) 21.8426 Tj 0 -332.268 Td (3832 return ip;) 74.2647 Tj 0 -341.761 Td (3833 }) 26.2111 Tj 0 -351.254 Td (3834 ) 21.8426 Tj 0 -360.748 Td (3835 // Increment reference count for ip.) 179.109 Tj 0 -370.241 Td (3836 // Returns ip to enable ip = idup\(ip1\) idiom.) 218.426 Tj 0 -379.734 Td (3837 struct inode*) 78.6333 Tj 0 -389.228 Td (3838 idup\(struct inode *ip\)) 117.95 Tj 0 -398.721 Td (3839 {) 26.2111 Tj 0 -408.214 Td (3840 acquire\(&icache.lock\);) 126.687 Tj 0 -417.708 Td (3841 ip->ref++;) 74.2647 Tj 0 -427.201 Td (3842 release\(&icache.lock\);) 126.687 Tj 0 -436.695 Td (3843 return ip;) 74.2647 Tj 0 -446.188 Td (3844 }) 26.2111 Tj 0 -455.681 Td (3845 ) 21.8426 Tj 0 -465.175 Td (3846 ) 21.8426 Tj 0 -474.668 Td (3847 ) 21.8426 Tj 0 -484.161 Td (3848 ) 21.8426 Tj 0 -493.655 Td (3849 ) 21.8426 Tj 0 -522.135 Td (Sheet 38) 34.9481 Tj Q Q q 180 500 5760 3460 re W /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [10 0 0 10 0 0] cm [1 0 0 1 0 0] Tm 0 0 Td [0 -0.967854 1 0 564.72 392.864] Tm 0 0 Td /F9_0 8.70222 Tf (Aug 30 10:08 2007 xv6/fs.c Page 5) 152.898 Tj 0 -28.4801 Td (3850 // Lock the given inode.) 126.687 Tj 0 -37.9735 Td (3851 void) 39.3166 Tj 0 -47.4668 Td (3852 ilock\(struct inode *ip\)) 122.318 Tj 0 -56.9602 Td (3853 {) 26.2111 Tj 0 -66.4535 Td (3854 struct buf *bp;) 96.1073 Tj 0 -75.9469 Td (3855 struct dinode *dip;) 113.581 Tj 0 -85.4403 Td (3856 ) 21.8426 Tj 0 -94.9336 Td (3857 if\(ip == 0 || ip->ref < 1\)) 144.161 Tj 0 -104.427 Td (3858 panic\("ilock"\);) 104.844 Tj 0 -113.92 Td (3859 ) 21.8426 Tj 0 -123.414 Td (3860 acquire\(&icache.lock\);) 126.687 Tj 0 -132.907 Td (3861 while\(ip->flags & I_BUSY\)) 139.792 Tj 0 -142.4 Td (3862 sleep\(ip, &icache.lock\);) 144.161 Tj 0 -151.894 Td (3863 ip->flags |= I_BUSY;) 117.95 Tj 0 -161.387 Td (3864 release\(&icache.lock\);) 126.687 Tj 0 -170.88 Td (3865 ) 21.8426 Tj 0 -180.374 Td (3866 if\(!\(ip->flags & I_VALID\)\){) 148.529 Tj 0 -189.867 Td (3867 bp = bread\(ip->dev, IBLOCK\(ip->inum\)\);) 205.32 Tj 0 -199.361 Td (3868 dip = \(struct dinode*\)bp->data + ip->inum%IPB;) 240.268 Tj 0 -208.854 Td (3869 ip->type = dip->type;) 131.055 Tj 0 -218.347 Td (3870 ip->major = dip->major;) 139.792 Tj 0 -227.841 Td (3871 ip->minor = dip->minor;) 139.792 Tj 0 -237.334 Td (3872 ip->nlink = dip->nlink;) 139.792 Tj 0 -246.827 Td (3873 ip->size = dip->size;) 131.055 Tj 0 -256.321 Td (3874 memmove\(ip->addrs, dip->addrs, sizeof\(ip->addrs\)\);) 257.742 Tj 0 -265.814 Td (3875 brelse\(bp\);) 87.3703 Tj 0 -275.307 Td (3876 ip->flags |= I_VALID;) 131.055 Tj 0 -284.801 Td (3877 if\(ip->type == 0\)) 113.581 Tj 0 -294.294 Td (3878 panic\("ilock: no type"\);) 152.898 Tj 0 -303.788 Td (3879 }) 34.9481 Tj 0 -313.281 Td (3880 }) 26.2111 Tj 0 -322.774 Td (3881 ) 21.8426 Tj 0 -332.268 Td (3882 // Unlock the given inode.) 135.424 Tj 0 -341.761 Td (3883 void) 39.3166 Tj 0 -351.254 Td (3884 iunlock\(struct inode *ip\)) 131.055 Tj 0 -360.748 Td (3885 {) 26.2111 Tj 0 -370.241 Td (3886 if\(ip == 0 || !\(ip->flags & I_BUSY\) || ip->ref < 1\)) 253.374 Tj 0 -379.734 Td (3887 panic\("iunlock"\);) 113.581 Tj 0 -389.228 Td (3888 ) 21.8426 Tj 0 -398.721 Td (3889 acquire\(&icache.lock\);) 126.687 Tj 0 -408.214 Td (3890 ip->flags &= ~I_BUSY;) 122.318 Tj 0 -417.708 Td (3891 wakeup\(ip\);) 78.6333 Tj 0 -427.201 Td (3892 release\(&icache.lock\);) 126.687 Tj 0 -436.695 Td (3893 }) 26.2111 Tj 0 -446.188 Td (3894 ) 21.8426 Tj 0 -455.681 Td (3895 ) 21.8426 Tj 0 -465.175 Td (3896 ) 21.8426 Tj 0 -474.668 Td (3897 ) 21.8426 Tj 0 -484.161 Td (3898 ) 21.8426 Tj 0 -493.655 Td (3899 ) 21.8426 Tj 0 -522.135 Td (Sheet 38) 34.9481 Tj Q Q Q Q showpage %%PageTrailer pdfEndPage %%Page: 46 46 %%BeginPageSetup %%PageOrientation: Landscape pdfStartPage 180 rotate -612 -792 translate 0 0 612 792 re W %%EndPageSetup [] 0 d 1 i 0 j 0 J 10 M 1 w /DeviceGray {} cs [0] sc /DeviceGray {} CS [0] SC false op false OP 0 0 612 792 re W q q [0.1 0 0 0.1 0 0] cm q 180 3960 5760 3460 re W /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [10 0 0 10 0 0] cm [1 0 0 1 0 0] Tm 0 0 Td [0 -0.967854 1 0 564.72 738.864] Tm 0 0 Td /F9_0 8.70222 Tf (Aug 30 10:08 2007 xv6/fs.c Page 6) 152.898 Tj 0 -28.4801 Td (3900 // Caller holds reference to unlocked ip. Drop reference.) 275.216 Tj 0 -37.9735 Td (3901 void) 39.3166 Tj 0 -47.4668 Td (3902 iput\(struct inode *ip\)) 117.95 Tj 0 -56.9602 Td (3903 {) 26.2111 Tj 0 -66.4535 Td (3904 acquire\(&icache.lock\);) 126.687 Tj 0 -75.9469 Td (3905 if\(ip->ref == 1 && \(ip->flags & I_VALID\) && ip->nlink\ == 0\){) 292.69 Tj 0 -85.4403 Td (3906 // inode is no longer used: truncate and free inode.) 266.479 Tj 0 -94.9336 Td (3907 if\(ip->flags & I_BUSY\)) 135.424 Tj 0 -104.427 Td (3908 panic\("iput busy"\);) 131.055 Tj 0 -113.92 Td (3909 ip->flags |= I_BUSY;) 126.687 Tj 0 -123.414 Td (3910 release\(&icache.lock\);) 135.424 Tj 0 -132.907 Td (3911 itrunc\(ip\);) 87.3703 Tj 0 -142.4 Td (3912 ip->type = 0;) 96.1073 Tj 0 -151.894 Td (3913 iupdate\(ip\);) 91.7388 Tj 0 -161.387 Td (3914 acquire\(&icache.lock\);) 135.424 Tj 0 -170.88 Td (3915 ip->flags &= ~I_BUSY;) 131.055 Tj 0 -180.374 Td (3916 wakeup\(ip\);) 87.3703 Tj 0 -189.867 Td (3917 }) 34.9481 Tj 0 -199.361 Td (3918 ip->ref--;) 74.2647 Tj 0 -208.854 Td (3919 release\(&icache.lock\);) 126.687 Tj 0 -218.347 Td (3920 }) 26.2111 Tj 0 -227.841 Td (3921 ) 21.8426 Tj 0 -237.334 Td (3922 // Common idiom: unlock, then put.) 170.372 Tj 0 -246.827 Td (3923 void) 39.3166 Tj 0 -256.321 Td (3924 iunlockput\(struct inode *ip\)) 144.161 Tj 0 -265.814 Td (3925 {) 26.2111 Tj 0 -275.307 Td (3926 iunlock\(ip\);) 83.0018 Tj 0 -284.801 Td (3927 iput\(ip\);) 69.8962 Tj 0 -294.294 Td (3928 }) 26.2111 Tj 0 -303.788 Td (3929 ) 21.8426 Tj 0 -313.281 Td (3930 ) 21.8426 Tj 0 -322.774 Td (3931 ) 21.8426 Tj 0 -332.268 Td (3932 ) 21.8426 Tj 0 -341.761 Td (3933 ) 21.8426 Tj 0 -351.254 Td (3934 ) 21.8426 Tj 0 -360.748 Td (3935 ) 21.8426 Tj 0 -370.241 Td (3936 ) 21.8426 Tj 0 -379.734 Td (3937 ) 21.8426 Tj 0 -389.228 Td (3938 ) 21.8426 Tj 0 -398.721 Td (3939 ) 21.8426 Tj 0 -408.214 Td (3940 ) 21.8426 Tj 0 -417.708 Td (3941 ) 21.8426 Tj 0 -427.201 Td (3942 ) 21.8426 Tj 0 -436.695 Td (3943 ) 21.8426 Tj 0 -446.188 Td (3944 ) 21.8426 Tj 0 -455.681 Td (3945 ) 21.8426 Tj 0 -465.175 Td (3946 ) 21.8426 Tj 0 -474.668 Td (3947 ) 21.8426 Tj 0 -484.161 Td (3948 ) 21.8426 Tj 0 -493.655 Td (3949 ) 21.8426 Tj 0 -522.135 Td (Sheet 39) 34.9481 Tj Q Q q 180 500 5760 3460 re W /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [10 0 0 10 0 0] cm [1 0 0 1 0 0] Tm 0 0 Td [0 -0.967854 1 0 564.72 392.864] Tm 0 0 Td /F9_0 8.70222 Tf (Aug 30 10:08 2007 xv6/fs.c Page 7) 152.898 Tj 0 -28.4801 Td (3950 // Allocate a new inode with the given type on device dev.) 275.216 Tj 0 -37.9735 Td (3951 struct inode*) 78.6333 Tj 0 -47.4668 Td (3952 ialloc\(uint dev, short type\)) 144.161 Tj 0 -56.9602 Td (3953 {) 26.2111 Tj 0 -66.4535 Td (3954 int inum;) 69.8962 Tj 0 -75.9469 Td (3955 struct buf *bp;) 96.1073 Tj 0 -85.4403 Td (3956 struct dinode *dip;) 113.581 Tj 0 -94.9336 Td (3957 struct superblock sb;) 122.318 Tj 0 -104.427 Td (3958 ) 21.8426 Tj 0 -113.92 Td (3959 readsb\(dev, &sb\);) 104.844 Tj 0 -123.414 Td (3960 for\(inum = 1; inum < sb.ninodes; inum++\){ // loop ove\ r inode blocks) 327.639 Tj 0 -132.907 Td (3961 bp = bread\(dev, IBLOCK\(inum\)\);) 170.372 Tj 0 -142.4 Td (3962 dip = \(struct dinode*\)bp->data + inum%IPB;) 222.794 Tj 0 -151.894 Td (3963 if\(dip->type == 0\){ // a free inode) 196.583 Tj 0 -161.387 Td (3964 memset\(dip, 0, sizeof\(*dip\)\);) 174.741 Tj 0 -170.88 Td (3965 dip->type = type;) 122.318 Tj 0 -180.374 Td (3966 bwrite\(bp\); // mark it allocated on the disk) 249.005 Tj 0 -189.867 Td (3967 brelse\(bp\);) 96.1073 Tj 0 -199.361 Td (3968 return iget\(dev, inum\);) 148.529 Tj 0 -208.854 Td (3969 }) 43.6851 Tj 0 -218.347 Td (3970 brelse\(bp\);) 87.3703 Tj 0 -227.841 Td (3971 }) 34.9481 Tj 0 -237.334 Td (3972 panic\("ialloc: no inodes"\);) 148.529 Tj 0 -246.827 Td (3973 }) 26.2111 Tj 0 -256.321 Td (3974 ) 21.8426 Tj 0 -265.814 Td (3975 // Copy inode, which has changed, from memory to disk.) 257.742 Tj 0 -275.307 Td (3976 void) 39.3166 Tj 0 -284.801 Td (3977 iupdate\(struct inode *ip\)) 131.055 Tj 0 -294.294 Td (3978 {) 26.2111 Tj 0 -303.788 Td (3979 struct buf *bp;) 96.1073 Tj 0 -313.281 Td (3980 struct dinode *dip;) 113.581 Tj 0 -322.774 Td (3981 ) 21.8426 Tj 0 -332.268 Td (3982 bp = bread\(ip->dev, IBLOCK\(ip->inum\)\);) 196.583 Tj 0 -341.761 Td (3983 dip = \(struct dinode*\)bp->data + ip->inum%IPB;) 231.531 Tj 0 -351.254 Td (3984 dip->type = ip->type;) 122.318 Tj 0 -360.748 Td (3985 dip->major = ip->major;) 131.055 Tj 0 -370.241 Td (3986 dip->minor = ip->minor;) 131.055 Tj 0 -379.734 Td (3987 dip->nlink = ip->nlink;) 131.055 Tj 0 -389.228 Td (3988 dip->size = ip->size;) 122.318 Tj 0 -398.721 Td (3989 memmove\(dip->addrs, ip->addrs, sizeof\(ip->addrs\)\);) 249.005 Tj 0 -408.214 Td (3990 bwrite\(bp\);) 78.6333 Tj 0 -417.708 Td (3991 brelse\(bp\);) 78.6333 Tj 0 -427.201 Td (3992 }) 26.2111 Tj 0 -436.695 Td (3993 ) 21.8426 Tj 0 -446.188 Td (3994 ) 21.8426 Tj 0 -455.681 Td (3995 ) 21.8426 Tj 0 -465.175 Td (3996 ) 21.8426 Tj 0 -474.668 Td (3997 ) 21.8426 Tj 0 -484.161 Td (3998 ) 21.8426 Tj 0 -493.655 Td (3999 ) 21.8426 Tj 0 -522.135 Td (Sheet 39) 34.9481 Tj Q Q Q Q showpage %%PageTrailer pdfEndPage %%Page: 47 47 %%BeginPageSetup %%PageOrientation: Landscape pdfStartPage 180 rotate -612 -792 translate 0 0 612 792 re W %%EndPageSetup [] 0 d 1 i 0 j 0 J 10 M 1 w /DeviceGray {} cs [0] sc /DeviceGray {} CS [0] SC false op false OP 0 0 612 792 re W q q [0.1 0 0 0.1 0 0] cm q 180 3960 5760 3460 re W /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [10 0 0 10 0 0] cm [1 0 0 1 0 0] Tm 0 0 Td [0 -0.967854 1 0 564.72 738.864] Tm 0 0 Td /F9_0 8.70222 Tf (Aug 30 10:08 2007 xv6/fs.c Page 8) 152.898 Tj 0 -28.4801 Td (4000 // Inode contents) 96.1073 Tj 0 -37.9735 Td (4001 //) 30.5796 Tj 0 -47.4668 Td (4002 // The contents \(data\) associated with each inode is sto\ red) 279.585 Tj 0 -56.9602 Td (4003 // in a sequence of blocks on the disk. The first NDIRECT\ blocks) 305.796 Tj 0 -66.4535 Td (4004 // are listed in ip->addrs[]. The next NINDIRECT blocks a\ re) 283.953 Tj 0 -75.9469 Td (4005 // listed in the block ip->addrs[INDIRECT].) 209.689 Tj 0 -85.4403 Td (4006 ) 21.8426 Tj 0 -94.9336 Td (4007 // Return the disk block address of the nth block in inode\ ip.) 292.69 Tj 0 -104.427 Td (4008 // If there is no such block, alloc controls whether one i\ s allocated.) 327.639 Tj 0 -113.92 Td (4009 static uint) 69.8962 Tj 0 -123.414 Td (4010 bmap\(struct inode *ip, uint bn, int alloc\)) 205.32 Tj 0 -132.907 Td (4011 {) 26.2111 Tj 0 -142.4 Td (4012 uint addr, *a;) 91.7388 Tj 0 -151.894 Td (4013 struct buf *bp;) 96.1073 Tj 0 -161.387 Td (4014 ) 21.8426 Tj 0 -170.88 Td (4015 if\(bn < NDIRECT\){) 104.844 Tj 0 -180.374 Td (4016 if\(\(addr = ip->addrs[bn]\) == 0\){) 179.109 Tj 0 -189.867 Td (4017 if\(!alloc\)) 91.7388 Tj 0 -199.361 Td (4018 return -1;) 100.476 Tj 0 -208.854 Td (4019 ip->addrs[bn] = addr = balloc\(ip->dev\);) 218.426 Tj 0 -218.347 Td (4020 }) 43.6851 Tj 0 -227.841 Td (4021 return addr;) 91.7388 Tj 0 -237.334 Td (4022 }) 34.9481 Tj 0 -246.827 Td (4023 bn -= NDIRECT;) 91.7388 Tj 0 -256.321 Td (4024 ) 21.8426 Tj 0 -265.814 Td (4025 if\(bn < NINDIRECT\){) 113.581 Tj 0 -275.307 Td (4026 // Load indirect block, allocating if necessary.) 249.005 Tj 0 -284.801 Td (4027 if\(\(addr = ip->addrs[INDIRECT]\) == 0\){) 205.32 Tj 0 -294.294 Td (4028 if\(!alloc\)) 91.7388 Tj 0 -303.788 Td (4029 return -1;) 100.476 Tj 0 -313.281 Td (4030 ip->addrs[INDIRECT] = addr = balloc\(ip->dev\);) 244.637 Tj 0 -322.774 Td (4031 }) 43.6851 Tj 0 -332.268 Td (4032 bp = bread\(ip->dev, addr\);) 152.898 Tj 0 -341.761 Td (4033 a = \(uint*\)bp->data;) 126.687 Tj 0 -351.254 Td (4034 ) 21.8426 Tj 0 -360.748 Td (4035 if\(\(addr = a[bn]\) == 0\){) 144.161 Tj 0 -370.241 Td (4036 if\(!alloc\){) 96.1073 Tj 0 -379.734 Td (4037 brelse\(bp\);) 104.844 Tj 0 -389.228 Td (4038 return -1;) 100.476 Tj 0 -398.721 Td (4039 }) 52.4222 Tj 0 -408.214 Td (4040 a[bn] = addr = balloc\(ip->dev\);) 183.478 Tj 0 -417.708 Td (4041 bwrite\(bp\);) 96.1073 Tj 0 -427.201 Td (4042 }) 43.6851 Tj 0 -436.695 Td (4043 brelse\(bp\);) 87.3703 Tj 0 -446.188 Td (4044 return addr;) 91.7388 Tj 0 -455.681 Td (4045 }) 34.9481 Tj 0 -465.175 Td (4046 ) 21.8426 Tj 0 -474.668 Td (4047 panic\("bmap: out of range"\);) 152.898 Tj 0 -484.161 Td (4048 }) 26.2111 Tj 0 -493.655 Td (4049 ) 21.8426 Tj 0 -522.135 Td (Sheet 40) 34.9481 Tj Q Q q 180 500 5760 3460 re W /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [10 0 0 10 0 0] cm [1 0 0 1 0 0] Tm 0 0 Td [0 -0.967854 1 0 564.72 392.864] Tm 0 0 Td /F9_0 8.70222 Tf (Aug 30 10:08 2007 xv6/fs.c Page 9) 152.898 Tj 0 -28.4801 Td (4050 // Truncate inode \(discard contents\).) 183.478 Tj 0 -37.9735 Td (4051 static void) 69.8962 Tj 0 -47.4668 Td (4052 itrunc\(struct inode *ip\)) 126.687 Tj 0 -56.9602 Td (4053 {) 26.2111 Tj 0 -66.4535 Td (4054 int i, j;) 69.8962 Tj 0 -75.9469 Td (4055 struct buf *bp;) 96.1073 Tj 0 -85.4403 Td (4056 uint *a;) 65.5277 Tj 0 -94.9336 Td (4057 ) 21.8426 Tj 0 -104.427 Td (4058 for\(i = 0; i < NDIRECT; i++\){) 157.267 Tj 0 -113.92 Td (4059 if\(ip->addrs[i]\){) 113.581 Tj 0 -123.414 Td (4060 bfree\(ip->dev, ip->addrs[i]\);) 174.741 Tj 0 -132.907 Td (4061 ip->addrs[i] = 0;) 122.318 Tj 0 -142.4 Td (4062 }) 43.6851 Tj 0 -151.894 Td (4063 }) 34.9481 Tj 0 -161.387 Td (4064 ) 21.8426 Tj 0 -170.88 Td (4065 if\(ip->addrs[INDIRECT]\){) 135.424 Tj 0 -180.374 Td (4066 bp = bread\(ip->dev, ip->addrs[INDIRECT]\);) 218.426 Tj 0 -189.867 Td (4067 a = \(uint*\)bp->data;) 126.687 Tj 0 -199.361 Td (4068 for\(j = 0; j < NINDIRECT; j++\){) 174.741 Tj 0 -208.854 Td (4069 if\(a[j]\)) 83.0018 Tj 0 -218.347 Td (4070 bfree\(ip->dev, a[j]\);) 148.529 Tj 0 -227.841 Td (4071 }) 43.6851 Tj 0 -237.334 Td (4072 brelse\(bp\);) 87.3703 Tj 0 -246.827 Td (4073 ip->addrs[INDIRECT] = 0;) 144.161 Tj 0 -256.321 Td (4074 }) 34.9481 Tj 0 -265.814 Td (4075 ) 21.8426 Tj 0 -275.307 Td (4076 ip->size = 0;) 87.3703 Tj 0 -284.801 Td (4077 iupdate\(ip\);) 83.0018 Tj 0 -294.294 Td (4078 }) 26.2111 Tj 0 -303.788 Td (4079 ) 21.8426 Tj 0 -313.281 Td (4080 // Copy stat information from inode.) 179.109 Tj 0 -322.774 Td (4081 void) 39.3166 Tj 0 -332.268 Td (4082 stati\(struct inode *ip, struct stat *st\)) 196.583 Tj 0 -341.761 Td (4083 {) 26.2111 Tj 0 -351.254 Td (4084 st->dev = ip->dev;) 109.213 Tj 0 -360.748 Td (4085 st->ino = ip->inum;) 113.581 Tj 0 -370.241 Td (4086 st->type = ip->type;) 117.95 Tj 0 -379.734 Td (4087 st->nlink = ip->nlink;) 126.687 Tj 0 -389.228 Td (4088 st->size = ip->size;) 117.95 Tj 0 -398.721 Td (4089 }) 26.2111 Tj 0 -408.214 Td (4090 ) 21.8426 Tj 0 -417.708 Td (4091 ) 21.8426 Tj 0 -427.201 Td (4092 ) 21.8426 Tj 0 -436.695 Td (4093 ) 21.8426 Tj 0 -446.188 Td (4094 ) 21.8426 Tj 0 -455.681 Td (4095 ) 21.8426 Tj 0 -465.175 Td (4096 ) 21.8426 Tj 0 -474.668 Td (4097 ) 21.8426 Tj 0 -484.161 Td (4098 ) 21.8426 Tj 0 -493.655 Td (4099 ) 21.8426 Tj 0 -522.135 Td (Sheet 40) 34.9481 Tj Q Q Q Q showpage %%PageTrailer pdfEndPage %%Page: 48 48 %%BeginPageSetup %%PageOrientation: Landscape pdfStartPage 180 rotate -612 -792 translate 0 0 612 792 re W %%EndPageSetup [] 0 d 1 i 0 j 0 J 10 M 1 w /DeviceGray {} cs [0] sc /DeviceGray {} CS [0] SC false op false OP 0 0 612 792 re W q q [0.1 0 0 0.1 0 0] cm q 180 3960 5760 3460 re W /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [10 0 0 10 0 0] cm [1 0 0 1 0 0] Tm 0 0 Td [0 -0.967854 1 0 564.72 738.864] Tm 0 0 Td /F9_0 8.70222 Tf (Aug 30 10:08 2007 xv6/fs.c Page 10) 157.267 Tj 0 -28.4801 Td (4100 // Read data from inode.) 126.687 Tj 0 -37.9735 Td (4101 int) 34.9481 Tj 0 -47.4668 Td (4102 readi\(struct inode *ip, char *dst, uint off, uint n\)) 249.005 Tj 0 -56.9602 Td (4103 {) 26.2111 Tj 0 -66.4535 Td (4104 uint tot, m;) 83.0018 Tj 0 -75.9469 Td (4105 struct buf *bp;) 96.1073 Tj 0 -85.4403 Td (4106 ) 21.8426 Tj 0 -94.9336 Td (4107 if\(ip->type == T_DEV\){) 126.687 Tj 0 -104.427 Td (4108 if\(ip->major < 0 || ip->major >= NDEV || !devsw[ip->m\ ajor].read\)) 318.902 Tj 0 -113.92 Td (4109 return -1;) 91.7388 Tj 0 -123.414 Td (4110 return devsw[ip->major].read\(ip, dst, n\);) 218.426 Tj 0 -132.907 Td (4111 }) 34.9481 Tj 0 -142.4 Td (4112 ) 21.8426 Tj 0 -151.894 Td (4113 if\(off > ip->size || off + n < off\)) 183.478 Tj 0 -161.387 Td (4114 return -1;) 83.0018 Tj 0 -170.88 Td (4115 if\(off + n > ip->size\)) 126.687 Tj 0 -180.374 Td (4116 n = ip->size - off;) 122.318 Tj 0 -189.867 Td (4117 ) 21.8426 Tj 0 -199.361 Td (4118 for\(tot=0; totdev, bmap\(ip, off/BSIZE, 0\)\);) 231.531 Tj 0 -218.347 Td (4120 m = min\(n - tot, BSIZE - off%BSIZE\);) 196.583 Tj 0 -227.841 Td (4121 memmove\(dst, bp->data + off%BSIZE, m\);) 205.32 Tj 0 -237.334 Td (4122 brelse\(bp\);) 87.3703 Tj 0 -246.827 Td (4123 }) 34.9481 Tj 0 -256.321 Td (4124 return n;) 69.8962 Tj 0 -265.814 Td (4125 }) 26.2111 Tj 0 -275.307 Td (4126 ) 21.8426 Tj 0 -284.801 Td (4127 ) 21.8426 Tj 0 -294.294 Td (4128 ) 21.8426 Tj 0 -303.788 Td (4129 ) 21.8426 Tj 0 -313.281 Td (4130 ) 21.8426 Tj 0 -322.774 Td (4131 ) 21.8426 Tj 0 -332.268 Td (4132 ) 21.8426 Tj 0 -341.761 Td (4133 ) 21.8426 Tj 0 -351.254 Td (4134 ) 21.8426 Tj 0 -360.748 Td (4135 ) 21.8426 Tj 0 -370.241 Td (4136 ) 21.8426 Tj 0 -379.734 Td (4137 ) 21.8426 Tj 0 -389.228 Td (4138 ) 21.8426 Tj 0 -398.721 Td (4139 ) 21.8426 Tj 0 -408.214 Td (4140 ) 21.8426 Tj 0 -417.708 Td (4141 ) 21.8426 Tj 0 -427.201 Td (4142 ) 21.8426 Tj 0 -436.695 Td (4143 ) 21.8426 Tj 0 -446.188 Td (4144 ) 21.8426 Tj 0 -455.681 Td (4145 ) 21.8426 Tj 0 -465.175 Td (4146 ) 21.8426 Tj 0 -474.668 Td (4147 ) 21.8426 Tj 0 -484.161 Td (4148 ) 21.8426 Tj 0 -493.655 Td (4149 ) 21.8426 Tj 0 -522.135 Td (Sheet 41) 34.9481 Tj Q Q q 180 500 5760 3460 re W /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [10 0 0 10 0 0] cm [1 0 0 1 0 0] Tm 0 0 Td [0 -0.967854 1 0 564.72 392.864] Tm 0 0 Td /F9_0 8.70222 Tf (Aug 30 10:08 2007 xv6/fs.c Page 11) 157.267 Tj 0 -28.4801 Td (4150 // Write data to inode.) 122.318 Tj 0 -37.9735 Td (4151 int) 34.9481 Tj 0 -47.4668 Td (4152 writei\(struct inode *ip, char *src, uint off, uint n\)) 253.374 Tj 0 -56.9602 Td (4153 {) 26.2111 Tj 0 -66.4535 Td (4154 uint tot, m;) 83.0018 Tj 0 -75.9469 Td (4155 struct buf *bp;) 96.1073 Tj 0 -85.4403 Td (4156 ) 21.8426 Tj 0 -94.9336 Td (4157 if\(ip->type == T_DEV\){) 126.687 Tj 0 -104.427 Td (4158 if\(ip->major < 0 || ip->major >= NDEV || !devsw[ip->m\ ajor].write\)) 323.27 Tj 0 -113.92 Td (4159 return -1;) 91.7388 Tj 0 -123.414 Td (4160 return devsw[ip->major].write\(ip, src, n\);) 222.794 Tj 0 -132.907 Td (4161 }) 34.9481 Tj 0 -142.4 Td (4162 ) 21.8426 Tj 0 -151.894 Td (4163 if\(off + n < off\)) 104.844 Tj 0 -161.387 Td (4164 return -1;) 83.0018 Tj 0 -170.88 Td (4165 if\(off + n > MAXFILE*BSIZE\)) 148.529 Tj 0 -180.374 Td (4166 n = MAXFILE*BSIZE - off;) 144.161 Tj 0 -189.867 Td (4167 ) 21.8426 Tj 0 -199.361 Td (4168 for\(tot=0; totdev, bmap\(ip, off/BSIZE, 1\)\);) 231.531 Tj 0 -218.347 Td (4170 m = min\(n - tot, BSIZE - off%BSIZE\);) 196.583 Tj 0 -227.841 Td (4171 memmove\(bp->data + off%BSIZE, src, m\);) 205.32 Tj 0 -237.334 Td (4172 bwrite\(bp\);) 87.3703 Tj 0 -246.827 Td (4173 brelse\(bp\);) 87.3703 Tj 0 -256.321 Td (4174 }) 34.9481 Tj 0 -265.814 Td (4175 ) 21.8426 Tj 0 -275.307 Td (4176 if\(n > 0 && off > ip->size\){) 152.898 Tj 0 -284.801 Td (4177 ip->size = off;) 104.844 Tj 0 -294.294 Td (4178 iupdate\(ip\);) 91.7388 Tj 0 -303.788 Td (4179 }) 34.9481 Tj 0 -313.281 Td (4180 return n;) 69.8962 Tj 0 -322.774 Td (4181 }) 26.2111 Tj 0 -332.268 Td (4182 ) 21.8426 Tj 0 -341.761 Td (4183 ) 21.8426 Tj 0 -351.254 Td (4184 ) 21.8426 Tj 0 -360.748 Td (4185 ) 21.8426 Tj 0 -370.241 Td (4186 ) 21.8426 Tj 0 -379.734 Td (4187 ) 21.8426 Tj 0 -389.228 Td (4188 ) 21.8426 Tj 0 -398.721 Td (4189 ) 21.8426 Tj 0 -408.214 Td (4190 ) 21.8426 Tj 0 -417.708 Td (4191 ) 21.8426 Tj 0 -427.201 Td (4192 ) 21.8426 Tj 0 -436.695 Td (4193 ) 21.8426 Tj 0 -446.188 Td (4194 ) 21.8426 Tj 0 -455.681 Td (4195 ) 21.8426 Tj 0 -465.175 Td (4196 ) 21.8426 Tj 0 -474.668 Td (4197 ) 21.8426 Tj 0 -484.161 Td (4198 ) 21.8426 Tj 0 -493.655 Td (4199 ) 21.8426 Tj 0 -522.135 Td (Sheet 41) 34.9481 Tj Q Q Q Q showpage %%PageTrailer pdfEndPage %%Page: 49 49 %%BeginPageSetup %%PageOrientation: Landscape pdfStartPage 180 rotate -612 -792 translate 0 0 612 792 re W %%EndPageSetup [] 0 d 1 i 0 j 0 J 10 M 1 w /DeviceGray {} cs [0] sc /DeviceGray {} CS [0] SC false op false OP 0 0 612 792 re W q q [0.1 0 0 0.1 0 0] cm q 180 3960 5760 3460 re W /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [10 0 0 10 0 0] cm [1 0 0 1 0 0] Tm 0 0 Td [0 -0.967854 1 0 564.72 738.864] Tm 0 0 Td /F9_0 8.70222 Tf (Aug 30 10:08 2007 xv6/fs.c Page 12) 157.267 Tj 0 -28.4801 Td (4200 // Directories) 83.0018 Tj 0 -37.9735 Td (4201 ) 21.8426 Tj 0 -47.4668 Td (4202 int) 34.9481 Tj 0 -56.9602 Td (4203 namecmp\(const char *s, const char *t\)) 183.478 Tj 0 -66.4535 Td (4204 {) 26.2111 Tj 0 -75.9469 Td (4205 return strncmp\(s, t, DIRSIZ\);) 157.267 Tj 0 -85.4403 Td (4206 }) 26.2111 Tj 0 -94.9336 Td (4207 ) 21.8426 Tj 0 -104.427 Td (4208 // Look for a directory entry in a directory.) 218.426 Tj 0 -113.92 Td (4209 // If found, set *poff to byte offset of entry.) 227.163 Tj 0 -123.414 Td (4210 // Caller must have already locked dp.) 187.846 Tj 0 -132.907 Td (4211 struct inode*) 78.6333 Tj 0 -142.4 Td (4212 dirlookup\(struct inode *dp, char *name, uint *poff\)) 244.637 Tj 0 -151.894 Td (4213 {) 26.2111 Tj 0 -161.387 Td (4214 uint off, inum;) 96.1073 Tj 0 -170.88 Td (4215 struct buf *bp;) 96.1073 Tj 0 -180.374 Td (4216 struct dirent *de;) 109.213 Tj 0 -189.867 Td (4217 ) 21.8426 Tj 0 -199.361 Td (4218 if\(dp->type != T_DIR\)) 122.318 Tj 0 -208.854 Td (4219 panic\("dirlookup not DIR"\);) 157.267 Tj 0 -218.347 Td (4220 ) 21.8426 Tj 0 -227.841 Td (4221 for\(off = 0; off < dp->size; off += BSIZE\){) 218.426 Tj 0 -237.334 Td (4222 bp = bread\(dp->dev, bmap\(dp, off / BSIZE, 0\)\);) 240.268 Tj 0 -246.827 Td (4223 for\(de = \(struct dirent*\)bp->data;) 187.846 Tj 0 -256.321 Td (4224 de < \(struct dirent*\)\(bp->data + BSIZE\);) 231.531 Tj 0 -265.814 Td (4225 de++\){) 83.0018 Tj 0 -275.307 Td (4226 if\(de->inum == 0\)) 122.318 Tj 0 -284.801 Td (4227 continue;) 96.1073 Tj 0 -294.294 Td (4228 if\(namecmp\(name, de->name\) == 0\){) 192.215 Tj 0 -303.788 Td (4229 // entry matches path element) 183.478 Tj 0 -313.281 Td (4230 if\(poff\)) 91.7388 Tj 0 -322.774 Td (4231 *poff = off + \(uchar*\)de - bp->data;) 222.794 Tj 0 -332.268 Td (4232 inum = de->inum;) 126.687 Tj 0 -341.761 Td (4233 brelse\(bp\);) 104.844 Tj 0 -351.254 Td (4234 return iget\(dp->dev, inum\);) 174.741 Tj 0 -360.748 Td (4235 }) 52.4222 Tj 0 -370.241 Td (4236 }) 43.6851 Tj 0 -379.734 Td (4237 brelse\(bp\);) 87.3703 Tj 0 -389.228 Td (4238 }) 34.9481 Tj 0 -398.721 Td (4239 return 0;) 69.8962 Tj 0 -408.214 Td (4240 }) 26.2111 Tj 0 -417.708 Td (4241 ) 21.8426 Tj 0 -427.201 Td (4242 ) 21.8426 Tj 0 -436.695 Td (4243 ) 21.8426 Tj 0 -446.188 Td (4244 ) 21.8426 Tj 0 -455.681 Td (4245 ) 21.8426 Tj 0 -465.175 Td (4246 ) 21.8426 Tj 0 -474.668 Td (4247 ) 21.8426 Tj 0 -484.161 Td (4248 ) 21.8426 Tj 0 -493.655 Td (4249 ) 21.8426 Tj 0 -522.135 Td (Sheet 42) 34.9481 Tj Q Q q 180 500 5760 3460 re W /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [10 0 0 10 0 0] cm [1 0 0 1 0 0] Tm 0 0 Td [0 -0.967854 1 0 564.72 392.864] Tm 0 0 Td /F9_0 8.70222 Tf (Aug 30 10:08 2007 xv6/fs.c Page 13) 157.267 Tj 0 -28.4801 Td (4250 // Write a new directory entry \(name, ino\) into the dire\ ctory dp.) 305.796 Tj 0 -37.9735 Td (4251 int) 34.9481 Tj 0 -47.4668 Td (4252 dirlink\(struct inode *dp, char *name, uint ino\)) 227.163 Tj 0 -56.9602 Td (4253 {) 26.2111 Tj 0 -66.4535 Td (4254 int off;) 65.5277 Tj 0 -75.9469 Td (4255 struct dirent de;) 104.844 Tj 0 -85.4403 Td (4256 struct inode *ip;) 104.844 Tj 0 -94.9336 Td (4257 ) 21.8426 Tj 0 -104.427 Td (4258 // Check that name is not present.) 179.109 Tj 0 -113.92 Td (4259 if\(\(ip = dirlookup\(dp, name, 0\)\) != 0\){) 200.952 Tj 0 -123.414 Td (4260 iput\(ip\);) 78.6333 Tj 0 -132.907 Td (4261 return -1;) 83.0018 Tj 0 -142.4 Td (4262 }) 34.9481 Tj 0 -151.894 Td (4263 ) 21.8426 Tj 0 -161.387 Td (4264 // Look for an empty dirent.) 152.898 Tj 0 -170.88 Td (4265 for\(off = 0; off < dp->size; off += sizeof\(de\)\){) 240.268 Tj 0 -180.374 Td (4266 if\(readi\(dp, \(char*\)&de, off, sizeof\(de\)\) != si\ zeof\(de\)\)) 283.953 Tj 0 -189.867 Td (4267 panic\("dirlink read"\);) 144.161 Tj 0 -199.361 Td (4268 if\(de.inum == 0\)) 109.213 Tj 0 -208.854 Td (4269 break;) 74.2647 Tj 0 -218.347 Td (4270 }) 34.9481 Tj 0 -227.841 Td (4271 ) 21.8426 Tj 0 -237.334 Td (4272 strncpy\(de.name, name, DIRSIZ\);) 166.004 Tj 0 -246.827 Td (4273 de.inum = ino;) 91.7388 Tj 0 -256.321 Td (4274 if\(writei\(dp, \(char*\)&de, off, sizeof\(de\)\) != siz\ eof\(de\)\)) 279.585 Tj 0 -265.814 Td (4275 panic\("dirlink"\);) 113.581 Tj 0 -275.307 Td (4276 ) 21.8426 Tj 0 -284.801 Td (4277 return 0;) 69.8962 Tj 0 -294.294 Td (4278 }) 26.2111 Tj 0 -303.788 Td (4279 ) 21.8426 Tj 0 -313.281 Td (4280 ) 21.8426 Tj 0 -322.774 Td (4281 ) 21.8426 Tj 0 -332.268 Td (4282 ) 21.8426 Tj 0 -341.761 Td (4283 ) 21.8426 Tj 0 -351.254 Td (4284 ) 21.8426 Tj 0 -360.748 Td (4285 ) 21.8426 Tj 0 -370.241 Td (4286 ) 21.8426 Tj 0 -379.734 Td (4287 ) 21.8426 Tj 0 -389.228 Td (4288 ) 21.8426 Tj 0 -398.721 Td (4289 ) 21.8426 Tj 0 -408.214 Td (4290 ) 21.8426 Tj 0 -417.708 Td (4291 ) 21.8426 Tj 0 -427.201 Td (4292 ) 21.8426 Tj 0 -436.695 Td (4293 ) 21.8426 Tj 0 -446.188 Td (4294 ) 21.8426 Tj 0 -455.681 Td (4295 ) 21.8426 Tj 0 -465.175 Td (4296 ) 21.8426 Tj 0 -474.668 Td (4297 ) 21.8426 Tj 0 -484.161 Td (4298 ) 21.8426 Tj 0 -493.655 Td (4299 ) 21.8426 Tj 0 -522.135 Td (Sheet 42) 34.9481 Tj Q Q Q Q showpage %%PageTrailer pdfEndPage %%Page: 50 50 %%BeginPageSetup %%PageOrientation: Landscape pdfStartPage 180 rotate -612 -792 translate 0 0 612 792 re W %%EndPageSetup [] 0 d 1 i 0 j 0 J 10 M 1 w /DeviceGray {} cs [0] sc /DeviceGray {} CS [0] SC false op false OP 0 0 612 792 re W q q [0.1 0 0 0.1 0 0] cm q 180 3960 5760 3460 re W /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [10 0 0 10 0 0] cm [1 0 0 1 0 0] Tm 0 0 Td [0 -0.967854 1 0 564.72 738.864] Tm 0 0 Td /F9_0 8.70222 Tf (Aug 30 10:08 2007 xv6/fs.c Page 14) 157.267 Tj 0 -28.4801 Td (4300 // Paths) 56.7907 Tj 0 -37.9735 Td (4301 ) 21.8426 Tj 0 -47.4668 Td (4302 // Copy the next path element from path into name.) 240.268 Tj 0 -56.9602 Td (4303 // Return a pointer to the element following the copied on\ e.) 283.953 Tj 0 -66.4535 Td (4304 // The returned path has no leading slashes,) 214.057 Tj 0 -75.9469 Td (4305 // so the caller can check *path=='\\0' to see if the name\ is the last one.) 345.113 Tj 0 -85.4403 Td (4306 // If no name to remove, return 0.) 170.372 Tj 0 -94.9336 Td (4307 //) 30.5796 Tj 0 -104.427 Td (4308 // Examples:) 74.2647 Tj 0 -113.92 Td (4309 // skipelem\("a/bb/c", name\) = "bb/c", setting name = "\ a") 275.216 Tj 0 -123.414 Td (4310 // skipelem\("///a//bb", name\) = "bb", setting name = "\ a") 275.216 Tj 0 -132.907 Td (4311 // skipelem\("", name\) = skipelem\("////", name\) = 0) 249.005 Tj 0 -142.4 Td (4312 //) 30.5796 Tj 0 -151.894 Td (4313 static char*) 74.2647 Tj 0 -161.387 Td (4314 skipelem\(char *path, char *name\)) 161.635 Tj 0 -170.88 Td (4315 {) 26.2111 Tj 0 -180.374 Td (4316 char *s;) 65.5277 Tj 0 -189.867 Td (4317 int len;) 65.5277 Tj 0 -199.361 Td (4318 ) 21.8426 Tj 0 -208.854 Td (4319 while\(*path == '/'\)) 113.581 Tj 0 -218.347 Td (4320 path++;) 69.8962 Tj 0 -227.841 Td (4321 if\(*path == 0\)) 91.7388 Tj 0 -237.334 Td (4322 return 0;) 78.6333 Tj 0 -246.827 Td (4323 s = path;) 69.8962 Tj 0 -256.321 Td (4324 while\(*path != '/' && *path != 0\)) 174.741 Tj 0 -265.814 Td (4325 path++;) 69.8962 Tj 0 -275.307 Td (4326 len = path - s;) 96.1073 Tj 0 -284.801 Td (4327 if\(len >= DIRSIZ\)) 104.844 Tj 0 -294.294 Td (4328 memmove\(name, s, DIRSIZ\);) 148.529 Tj 0 -303.788 Td (4329 else {) 56.7907 Tj 0 -313.281 Td (4330 memmove\(name, s, len\);) 135.424 Tj 0 -322.774 Td (4331 name[len] = 0;) 100.476 Tj 0 -332.268 Td (4332 }) 34.9481 Tj 0 -341.761 Td (4333 while\(*path == '/'\)) 113.581 Tj 0 -351.254 Td (4334 path++;) 69.8962 Tj 0 -360.748 Td (4335 return path;) 83.0018 Tj 0 -370.241 Td (4336 }) 26.2111 Tj 0 -379.734 Td (4337 ) 21.8426 Tj 0 -389.228 Td (4338 ) 21.8426 Tj 0 -398.721 Td (4339 ) 21.8426 Tj 0 -408.214 Td (4340 ) 21.8426 Tj 0 -417.708 Td (4341 ) 21.8426 Tj 0 -427.201 Td (4342 ) 21.8426 Tj 0 -436.695 Td (4343 ) 21.8426 Tj 0 -446.188 Td (4344 ) 21.8426 Tj 0 -455.681 Td (4345 ) 21.8426 Tj 0 -465.175 Td (4346 ) 21.8426 Tj 0 -474.668 Td (4347 ) 21.8426 Tj 0 -484.161 Td (4348 ) 21.8426 Tj 0 -493.655 Td (4349 ) 21.8426 Tj 0 -522.135 Td (Sheet 43) 34.9481 Tj Q Q q 180 500 5760 3460 re W /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [10 0 0 10 0 0] cm [1 0 0 1 0 0] Tm 0 0 Td [0 -0.967854 1 0 564.72 392.864] Tm 0 0 Td /F9_0 8.70222 Tf (Aug 30 10:08 2007 xv6/fs.c Page 15) 157.267 Tj 0 -28.4801 Td (4350 // Look up and return the inode for a path name.) 231.531 Tj 0 -37.9735 Td (4351 // If parent != 0, return the inode for the parent and cop\ y the final) 323.27 Tj 0 -47.4668 Td (4352 // path element into name, which must have room for DIRSIZ\ bytes.) 305.796 Tj 0 -56.9602 Td (4353 static struct inode*) 109.213 Tj 0 -66.4535 Td (4354 _namei\(char *path, int parent, char *name\)) 205.32 Tj 0 -75.9469 Td (4355 {) 26.2111 Tj 0 -85.4403 Td (4356 struct inode *ip, *next;) 135.424 Tj 0 -94.9336 Td (4357 ) 21.8426 Tj 0 -104.427 Td (4358 if\(*path == '/'\)) 100.476 Tj 0 -113.92 Td (4359 ip = iget\(ROOTDEV, 1\);) 135.424 Tj 0 -123.414 Td (4360 else) 48.0537 Tj 0 -132.907 Td (4361 ip = idup\(cp->cwd\);) 122.318 Tj 0 -142.4 Td (4362 ) 21.8426 Tj 0 -151.894 Td (4363 while\(\(path = skipelem\(path, name\)\) != 0\){) 214.057 Tj 0 -161.387 Td (4364 ilock\(ip\);) 83.0018 Tj 0 -170.88 Td (4365 if\(ip->type != T_DIR\){) 135.424 Tj 0 -180.374 Td (4366 iunlockput\(ip\);) 113.581 Tj 0 -189.867 Td (4367 return 0;) 87.3703 Tj 0 -199.361 Td (4368 }) 43.6851 Tj 0 -208.854 Td (4369 if\(parent && *path == '\\0'\){) 161.635 Tj 0 -218.347 Td (4370 // Stop one level early.) 152.898 Tj 0 -227.841 Td (4371 iunlock\(ip\);) 100.476 Tj 0 -237.334 Td (4372 return ip;) 91.7388 Tj 0 -246.827 Td (4373 }) 43.6851 Tj 0 -256.321 Td (4374 if\(\(next = dirlookup\(ip, name, 0\)\) == 0\){) 218.426 Tj 0 -265.814 Td (4375 iunlockput\(ip\);) 113.581 Tj 0 -275.307 Td (4376 return 0;) 87.3703 Tj 0 -284.801 Td (4377 }) 43.6851 Tj 0 -294.294 Td (4378 iunlockput\(ip\);) 104.844 Tj 0 -303.788 Td (4379 ip = next;) 83.0018 Tj 0 -313.281 Td (4380 }) 34.9481 Tj 0 -322.774 Td (4381 if\(parent\){) 78.6333 Tj 0 -332.268 Td (4382 iput\(ip\);) 78.6333 Tj 0 -341.761 Td (4383 return 0;) 78.6333 Tj 0 -351.254 Td (4384 }) 34.9481 Tj 0 -360.748 Td (4385 return ip;) 74.2647 Tj 0 -370.241 Td (4386 }) 26.2111 Tj 0 -379.734 Td (4387 ) 21.8426 Tj 0 -389.228 Td (4388 struct inode*) 78.6333 Tj 0 -398.721 Td (4389 namei\(char *path\)) 96.1073 Tj 0 -408.214 Td (4390 {) 26.2111 Tj 0 -417.708 Td (4391 char name[DIRSIZ];) 109.213 Tj 0 -427.201 Td (4392 return _namei\(path, 0, name\);) 157.267 Tj 0 -436.695 Td (4393 }) 26.2111 Tj 0 -446.188 Td (4394 ) 21.8426 Tj 0 -455.681 Td (4395 struct inode*) 78.6333 Tj 0 -465.175 Td (4396 nameiparent\(char *path, char *name\)) 174.741 Tj 0 -474.668 Td (4397 {) 26.2111 Tj 0 -484.161 Td (4398 return _namei\(path, 1, name\);) 157.267 Tj 0 -493.655 Td (4399 }) 26.2111 Tj 0 -522.135 Td (Sheet 43) 34.9481 Tj Q Q Q Q showpage %%PageTrailer pdfEndPage %%Page: 51 51 %%BeginPageSetup %%PageOrientation: Landscape pdfStartPage 180 rotate -612 -792 translate 0 0 612 792 re W %%EndPageSetup [] 0 d 1 i 0 j 0 J 10 M 1 w /DeviceGray {} cs [0] sc /DeviceGray {} CS [0] SC false op false OP 0 0 612 792 re W q q [0.1 0 0 0.1 0 0] cm q 180 3960 5760 3460 re W /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [10 0 0 10 0 0] cm [1 0 0 1 0 0] Tm 0 0 Td [0 -0.967854 1 0 564.72 738.864] Tm 0 0 Td /F9_0 8.70222 Tf (Aug 30 10:08 2007 xv6/file.c Page 1) 161.635 Tj 0 -28.4801 Td (4400 #include "types.h") 100.476 Tj 0 -37.9735 Td (4401 #include "defs.h") 96.1073 Tj 0 -47.4668 Td (4402 #include "param.h") 100.476 Tj 0 -56.9602 Td (4403 #include "file.h") 96.1073 Tj 0 -66.4535 Td (4404 #include "spinlock.h") 113.581 Tj 0 -75.9469 Td (4405 #include "dev.h") 91.7388 Tj 0 -85.4403 Td (4406 ) 21.8426 Tj 0 -94.9336 Td (4407 struct devsw devsw[NDEV];) 131.055 Tj 0 -104.427 Td (4408 struct spinlock file_table_lock;) 161.635 Tj 0 -113.92 Td (4409 struct file file[NFILE];) 126.687 Tj 0 -123.414 Td (4410 ) 21.8426 Tj 0 -132.907 Td (4411 void) 39.3166 Tj 0 -142.4 Td (4412 fileinit\(void\)) 83.0018 Tj 0 -151.894 Td (4413 {) 26.2111 Tj 0 -161.387 Td (4414 initlock\(&file_table_lock, "file_table"\);) 209.689 Tj 0 -170.88 Td (4415 }) 26.2111 Tj 0 -180.374 Td (4416 ) 21.8426 Tj 0 -189.867 Td (4417 // Allocate a file structure.) 148.529 Tj 0 -199.361 Td (4418 struct file*) 74.2647 Tj 0 -208.854 Td (4419 filealloc\(void\)) 87.3703 Tj 0 -218.347 Td (4420 {) 26.2111 Tj 0 -227.841 Td (4421 int i;) 56.7907 Tj 0 -237.334 Td (4422 ) 21.8426 Tj 0 -246.827 Td (4423 acquire\(&file_table_lock\);) 144.161 Tj 0 -256.321 Td (4424 for\(i = 0; i < NFILE; i++\){) 148.529 Tj 0 -265.814 Td (4425 if\(file[i].type == FD_CLOSED\){) 170.372 Tj 0 -275.307 Td (4426 file[i].type = FD_NONE;) 148.529 Tj 0 -284.801 Td (4427 file[i].ref = 1;) 117.95 Tj 0 -294.294 Td (4428 release\(&file_table_lock\);) 161.635 Tj 0 -303.788 Td (4429 return file + i;) 117.95 Tj 0 -313.281 Td (4430 }) 43.6851 Tj 0 -322.774 Td (4431 }) 34.9481 Tj 0 -332.268 Td (4432 release\(&file_table_lock\);) 144.161 Tj 0 -341.761 Td (4433 return 0;) 69.8962 Tj 0 -351.254 Td (4434 }) 26.2111 Tj 0 -360.748 Td (4435 ) 21.8426 Tj 0 -370.241 Td (4436 // Increment ref count for file f.) 170.372 Tj 0 -379.734 Td (4437 struct file*) 74.2647 Tj 0 -389.228 Td (4438 filedup\(struct file *f\)) 122.318 Tj 0 -398.721 Td (4439 {) 26.2111 Tj 0 -408.214 Td (4440 acquire\(&file_table_lock\);) 144.161 Tj 0 -417.708 Td (4441 if\(f->ref < 1 || f->type == FD_CLOSED\)) 196.583 Tj 0 -427.201 Td (4442 panic\("filedup"\);) 113.581 Tj 0 -436.695 Td (4443 f->ref++;) 69.8962 Tj 0 -446.188 Td (4444 release\(&file_table_lock\);) 144.161 Tj 0 -455.681 Td (4445 return f;) 69.8962 Tj 0 -465.175 Td (4446 }) 26.2111 Tj 0 -474.668 Td (4447 ) 21.8426 Tj 0 -484.161 Td (4448 ) 21.8426 Tj 0 -493.655 Td (4449 ) 21.8426 Tj 0 -522.135 Td (Sheet 44) 34.9481 Tj Q Q q 180 500 5760 3460 re W /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [10 0 0 10 0 0] cm [1 0 0 1 0 0] Tm 0 0 Td [0 -0.967854 1 0 564.72 392.864] Tm 0 0 Td /F9_0 8.70222 Tf (Aug 30 10:08 2007 xv6/file.c Page 2) 161.635 Tj 0 -28.4801 Td (4450 // Close file f. \(Decrement ref count, close when reache\ s 0.\)) 292.69 Tj 0 -37.9735 Td (4451 void) 39.3166 Tj 0 -47.4668 Td (4452 fileclose\(struct file *f\)) 131.055 Tj 0 -56.9602 Td (4453 {) 26.2111 Tj 0 -66.4535 Td (4454 struct file ff;) 96.1073 Tj 0 -75.9469 Td (4455 ) 21.8426 Tj 0 -85.4403 Td (4456 acquire\(&file_table_lock\);) 144.161 Tj 0 -94.9336 Td (4457 if\(f->ref < 1 || f->type == FD_CLOSED\)) 196.583 Tj 0 -104.427 Td (4458 panic\("fileclose"\);) 122.318 Tj 0 -113.92 Td (4459 if\(--f->ref > 0\){) 104.844 Tj 0 -123.414 Td (4460 release\(&file_table_lock\);) 152.898 Tj 0 -132.907 Td (4461 return;) 69.8962 Tj 0 -142.4 Td (4462 }) 34.9481 Tj 0 -151.894 Td (4463 ff = *f;) 65.5277 Tj 0 -161.387 Td (4464 f->ref = 0;) 78.6333 Tj 0 -170.88 Td (4465 f->type = FD_CLOSED;) 117.95 Tj 0 -180.374 Td (4466 release\(&file_table_lock\);) 144.161 Tj 0 -189.867 Td (4467 ) 21.8426 Tj 0 -199.361 Td (4468 if\(ff.type == FD_PIPE\)) 126.687 Tj 0 -208.854 Td (4469 pipeclose\(ff.pipe, ff.writable\);) 179.109 Tj 0 -218.347 Td (4470 else if\(ff.type == FD_INODE\)) 152.898 Tj 0 -227.841 Td (4471 iput\(ff.ip\);) 91.7388 Tj 0 -237.334 Td (4472 else) 48.0537 Tj 0 -246.827 Td (4473 panic\("fileclose"\);) 122.318 Tj 0 -256.321 Td (4474 }) 26.2111 Tj 0 -265.814 Td (4475 ) 21.8426 Tj 0 -275.307 Td (4476 // Get metadata about file f.) 148.529 Tj 0 -284.801 Td (4477 int) 34.9481 Tj 0 -294.294 Td (4478 filestat\(struct file *f, struct stat *st\)) 200.952 Tj 0 -303.788 Td (4479 {) 26.2111 Tj 0 -313.281 Td (4480 if\(f->type == FD_INODE\){) 135.424 Tj 0 -322.774 Td (4481 ilock\(f->ip\);) 96.1073 Tj 0 -332.268 Td (4482 stati\(f->ip, st\);) 113.581 Tj 0 -341.761 Td (4483 iunlock\(f->ip\);) 104.844 Tj 0 -351.254 Td (4484 return 0;) 78.6333 Tj 0 -360.748 Td (4485 }) 34.9481 Tj 0 -370.241 Td (4486 return -1;) 74.2647 Tj 0 -379.734 Td (4487 }) 26.2111 Tj 0 -389.228 Td (4488 ) 21.8426 Tj 0 -398.721 Td (4489 ) 21.8426 Tj 0 -408.214 Td (4490 ) 21.8426 Tj 0 -417.708 Td (4491 ) 21.8426 Tj 0 -427.201 Td (4492 ) 21.8426 Tj 0 -436.695 Td (4493 ) 21.8426 Tj 0 -446.188 Td (4494 ) 21.8426 Tj 0 -455.681 Td (4495 ) 21.8426 Tj 0 -465.175 Td (4496 ) 21.8426 Tj 0 -474.668 Td (4497 ) 21.8426 Tj 0 -484.161 Td (4498 ) 21.8426 Tj 0 -493.655 Td (4499 ) 21.8426 Tj 0 -522.135 Td (Sheet 44) 34.9481 Tj Q Q Q Q showpage %%PageTrailer pdfEndPage %%Page: 52 52 %%BeginPageSetup %%PageOrientation: Landscape pdfStartPage 180 rotate -612 -792 translate 0 0 612 792 re W %%EndPageSetup [] 0 d 1 i 0 j 0 J 10 M 1 w /DeviceGray {} cs [0] sc /DeviceGray {} CS [0] SC false op false OP 0 0 612 792 re W q q [0.1 0 0 0.1 0 0] cm q 180 3960 5760 3460 re W /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [10 0 0 10 0 0] cm [1 0 0 1 0 0] Tm 0 0 Td [0 -0.967854 1 0 564.72 738.864] Tm 0 0 Td /F9_0 8.70222 Tf (Aug 30 10:08 2007 xv6/file.c Page 3) 161.635 Tj 0 -28.4801 Td (4500 // Read from file f. Addr is kernel address.) 218.426 Tj 0 -37.9735 Td (4501 int) 34.9481 Tj 0 -47.4668 Td (4502 fileread\(struct file *f, char *addr, int n\)) 209.689 Tj 0 -56.9602 Td (4503 {) 26.2111 Tj 0 -66.4535 Td (4504 int r;) 56.7907 Tj 0 -75.9469 Td (4505 ) 21.8426 Tj 0 -85.4403 Td (4506 if\(f->readable == 0\)) 117.95 Tj 0 -94.9336 Td (4507 return -1;) 83.0018 Tj 0 -104.427 Td (4508 if\(f->type == FD_PIPE\)) 126.687 Tj 0 -113.92 Td (4509 return piperead\(f->pipe, addr, n\);) 187.846 Tj 0 -123.414 Td (4510 if\(f->type == FD_INODE\){) 135.424 Tj 0 -132.907 Td (4511 ilock\(f->ip\);) 96.1073 Tj 0 -142.4 Td (4512 if\(\(r = readi\(f->ip, addr, f->off, n\)\) > 0\)) 227.163 Tj 0 -151.894 Td (4513 f->off += r;) 100.476 Tj 0 -161.387 Td (4514 iunlock\(f->ip\);) 104.844 Tj 0 -170.88 Td (4515 return r;) 78.6333 Tj 0 -180.374 Td (4516 }) 34.9481 Tj 0 -189.867 Td (4517 panic\("fileread"\);) 109.213 Tj 0 -199.361 Td (4518 }) 26.2111 Tj 0 -208.854 Td (4519 ) 21.8426 Tj 0 -218.347 Td (4520 // Write to file f. Addr is kernel address.) 214.057 Tj 0 -227.841 Td (4521 int) 34.9481 Tj 0 -237.334 Td (4522 filewrite\(struct file *f, char *addr, int n\)) 214.057 Tj 0 -246.827 Td (4523 {) 26.2111 Tj 0 -256.321 Td (4524 int r;) 56.7907 Tj 0 -265.814 Td (4525 ) 21.8426 Tj 0 -275.307 Td (4526 if\(f->writable == 0\)) 117.95 Tj 0 -284.801 Td (4527 return -1;) 83.0018 Tj 0 -294.294 Td (4528 if\(f->type == FD_PIPE\)) 126.687 Tj 0 -303.788 Td (4529 return pipewrite\(f->pipe, addr, n\);) 192.215 Tj 0 -313.281 Td (4530 if\(f->type == FD_INODE\){) 135.424 Tj 0 -322.774 Td (4531 ilock\(f->ip\);) 96.1073 Tj 0 -332.268 Td (4532 if\(\(r = writei\(f->ip, addr, f->off, n\)\) > 0\)) 231.531 Tj 0 -341.761 Td (4533 f->off += r;) 100.476 Tj 0 -351.254 Td (4534 iunlock\(f->ip\);) 104.844 Tj 0 -360.748 Td (4535 return r;) 78.6333 Tj 0 -370.241 Td (4536 }) 34.9481 Tj 0 -379.734 Td (4537 panic\("filewrite"\);) 113.581 Tj 0 -389.228 Td (4538 }) 26.2111 Tj 0 -398.721 Td (4539 ) 21.8426 Tj 0 -408.214 Td (4540 ) 21.8426 Tj 0 -417.708 Td (4541 ) 21.8426 Tj 0 -427.201 Td (4542 ) 21.8426 Tj 0 -436.695 Td (4543 ) 21.8426 Tj 0 -446.188 Td (4544 ) 21.8426 Tj 0 -455.681 Td (4545 ) 21.8426 Tj 0 -465.175 Td (4546 ) 21.8426 Tj 0 -474.668 Td (4547 ) 21.8426 Tj 0 -484.161 Td (4548 ) 21.8426 Tj 0 -493.655 Td (4549 ) 21.8426 Tj 0 -522.135 Td (Sheet 45) 34.9481 Tj Q Q q 180 500 5760 3460 re W /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [10 0 0 10 0 0] cm [1 0 0 1 0 0] Tm 0 0 Td [0 -0.967854 1 0 564.72 392.864] Tm 0 0 Td /F9_0 8.70222 Tf (Aug 30 10:08 2007 xv6/sysfile.c Page 1) 174.741 Tj 0 -28.4801 Td (4550 #include "types.h") 100.476 Tj 0 -37.9735 Td (4551 #include "defs.h") 96.1073 Tj 0 -47.4668 Td (4552 #include "param.h") 100.476 Tj 0 -56.9602 Td (4553 #include "stat.h") 96.1073 Tj 0 -66.4535 Td (4554 #include "mmu.h") 91.7388 Tj 0 -75.9469 Td (4555 #include "proc.h") 96.1073 Tj 0 -85.4403 Td (4556 #include "fs.h") 87.3703 Tj 0 -94.9336 Td (4557 #include "fsvar.h") 100.476 Tj 0 -104.427 Td (4558 #include "file.h") 96.1073 Tj 0 -113.92 Td (4559 #include "fcntl.h") 100.476 Tj 0 -123.414 Td (4560 ) 21.8426 Tj 0 -132.907 Td (4561 // Fetch the nth word-sized system call argument as a file\ descriptor) 323.27 Tj 0 -142.4 Td (4562 // and return both the descriptor and the corresponding st\ ruct file.) 318.902 Tj 0 -151.894 Td (4563 static int) 65.5277 Tj 0 -161.387 Td (4564 argfd\(int n, int *pfd, struct file **pf\)) 196.583 Tj 0 -170.88 Td (4565 {) 26.2111 Tj 0 -180.374 Td (4566 int fd;) 61.1592 Tj 0 -189.867 Td (4567 struct file *f;) 96.1073 Tj 0 -199.361 Td (4568 ) 21.8426 Tj 0 -208.854 Td (4569 if\(argint\(n, &fd\) < 0\)) 126.687 Tj 0 -218.347 Td (4570 return -1;) 83.0018 Tj 0 -227.841 Td (4571 if\(fd < 0 || fd >= NOFILE || \(f=cp->ofile[fd]\) == 0\)) 257.742 Tj 0 -237.334 Td (4572 return -1;) 83.0018 Tj 0 -246.827 Td (4573 if\(pfd\)) 61.1592 Tj 0 -256.321 Td (4574 *pfd = fd;) 83.0018 Tj 0 -265.814 Td (4575 if\(pf\)) 56.7907 Tj 0 -275.307 Td (4576 *pf = f;) 74.2647 Tj 0 -284.801 Td (4577 return 0;) 69.8962 Tj 0 -294.294 Td (4578 }) 26.2111 Tj 0 -303.788 Td (4579 ) 21.8426 Tj 0 -313.281 Td (4580 // Allocate a file descriptor for the given file.) 235.9 Tj 0 -322.774 Td (4581 // Takes over file reference from caller on success.) 249.005 Tj 0 -332.268 Td (4582 static int) 65.5277 Tj 0 -341.761 Td (4583 fdalloc\(struct file *f\)) 122.318 Tj 0 -351.254 Td (4584 {) 26.2111 Tj 0 -360.748 Td (4585 int fd;) 61.1592 Tj 0 -370.241 Td (4586 ) 21.8426 Tj 0 -379.734 Td (4587 for\(fd = 0; fd < NOFILE; fd++\){) 166.004 Tj 0 -389.228 Td (4588 if\(cp->ofile[fd] == 0\){) 139.792 Tj 0 -398.721 Td (4589 cp->ofile[fd] = f;) 126.687 Tj 0 -408.214 Td (4590 return fd;) 91.7388 Tj 0 -417.708 Td (4591 }) 43.6851 Tj 0 -427.201 Td (4592 }) 34.9481 Tj 0 -436.695 Td (4593 return -1;) 74.2647 Tj 0 -446.188 Td (4594 }) 26.2111 Tj 0 -455.681 Td (4595 ) 21.8426 Tj 0 -465.175 Td (4596 ) 21.8426 Tj 0 -474.668 Td (4597 ) 21.8426 Tj 0 -484.161 Td (4598 ) 21.8426 Tj 0 -493.655 Td (4599 ) 21.8426 Tj 0 -522.135 Td (Sheet 45) 34.9481 Tj Q Q Q Q showpage %%PageTrailer pdfEndPage %%Page: 53 53 %%BeginPageSetup %%PageOrientation: Landscape pdfStartPage 180 rotate -612 -792 translate 0 0 612 792 re W %%EndPageSetup [] 0 d 1 i 0 j 0 J 10 M 1 w /DeviceGray {} cs [0] sc /DeviceGray {} CS [0] SC false op false OP 0 0 612 792 re W q q [0.1 0 0 0.1 0 0] cm q 180 3960 5760 3460 re W /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [10 0 0 10 0 0] cm [1 0 0 1 0 0] Tm 0 0 Td [0 -0.967854 1 0 564.72 738.864] Tm 0 0 Td /F9_0 8.70222 Tf (Aug 30 10:08 2007 xv6/sysfile.c Page 2) 174.741 Tj 0 -28.4801 Td (4600 int) 34.9481 Tj 0 -37.9735 Td (4601 sys_read\(void\)) 83.0018 Tj 0 -47.4668 Td (4602 {) 26.2111 Tj 0 -56.9602 Td (4603 struct file *f;) 96.1073 Tj 0 -66.4535 Td (4604 int n;) 56.7907 Tj 0 -75.9469 Td (4605 char *cp;) 69.8962 Tj 0 -85.4403 Td (4606 ) 21.8426 Tj 0 -94.9336 Td (4607 if\(argfd\(0, 0, &f\) < 0 || argint\(2, &n\) < 0 || argp\ tr\(1, &cp, n\) < 0\)) 332.007 Tj 0 -104.427 Td (4608 return -1;) 83.0018 Tj 0 -113.92 Td (4609 return fileread\(f, cp, n\);) 144.161 Tj 0 -123.414 Td (4610 }) 26.2111 Tj 0 -132.907 Td (4611 ) 21.8426 Tj 0 -142.4 Td (4612 int) 34.9481 Tj 0 -151.894 Td (4613 sys_write\(void\)) 87.3703 Tj 0 -161.387 Td (4614 {) 26.2111 Tj 0 -170.88 Td (4615 struct file *f;) 96.1073 Tj 0 -180.374 Td (4616 int n;) 56.7907 Tj 0 -189.867 Td (4617 char *cp;) 69.8962 Tj 0 -199.361 Td (4618 ) 21.8426 Tj 0 -208.854 Td (4619 if\(argfd\(0, 0, &f\) < 0 || argint\(2, &n\) < 0 || argp\ tr\(1, &cp, n\) < 0\)) 332.007 Tj 0 -218.347 Td (4620 return -1;) 83.0018 Tj 0 -227.841 Td (4621 return filewrite\(f, cp, n\);) 148.529 Tj 0 -237.334 Td (4622 }) 26.2111 Tj 0 -246.827 Td (4623 ) 21.8426 Tj 0 -256.321 Td (4624 int) 34.9481 Tj 0 -265.814 Td (4625 sys_dup\(void\)) 78.6333 Tj 0 -275.307 Td (4626 {) 26.2111 Tj 0 -284.801 Td (4627 struct file *f;) 96.1073 Tj 0 -294.294 Td (4628 int fd;) 61.1592 Tj 0 -303.788 Td (4629 ) 21.8426 Tj 0 -313.281 Td (4630 if\(argfd\(0, 0, &f\) < 0\)) 131.055 Tj 0 -322.774 Td (4631 return -1;) 83.0018 Tj 0 -332.268 Td (4632 if\(\(fd=fdalloc\(f\)\) < 0\)) 131.055 Tj 0 -341.761 Td (4633 return -1;) 83.0018 Tj 0 -351.254 Td (4634 filedup\(f\);) 78.6333 Tj 0 -360.748 Td (4635 return fd;) 74.2647 Tj 0 -370.241 Td (4636 }) 26.2111 Tj 0 -379.734 Td (4637 ) 21.8426 Tj 0 -389.228 Td (4638 int) 34.9481 Tj 0 -398.721 Td (4639 sys_close\(void\)) 87.3703 Tj 0 -408.214 Td (4640 {) 26.2111 Tj 0 -417.708 Td (4641 int fd;) 61.1592 Tj 0 -427.201 Td (4642 struct file *f;) 96.1073 Tj 0 -436.695 Td (4643 ) 21.8426 Tj 0 -446.188 Td (4644 if\(argfd\(0, &fd, &f\) < 0\)) 139.792 Tj 0 -455.681 Td (4645 return -1;) 83.0018 Tj 0 -465.175 Td (4646 cp->ofile[fd] = 0;) 109.213 Tj 0 -474.668 Td (4647 fileclose\(f\);) 87.3703 Tj 0 -484.161 Td (4648 return 0;) 69.8962 Tj 0 -493.655 Td (4649 }) 26.2111 Tj 0 -522.135 Td (Sheet 46) 34.9481 Tj Q Q q 180 500 5760 3460 re W /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [10 0 0 10 0 0] cm [1 0 0 1 0 0] Tm 0 0 Td [0 -0.967854 1 0 564.72 392.864] Tm 0 0 Td /F9_0 8.70222 Tf (Aug 30 10:08 2007 xv6/sysfile.c Page 3) 174.741 Tj 0 -28.4801 Td (4650 int) 34.9481 Tj 0 -37.9735 Td (4651 sys_fstat\(void\)) 87.3703 Tj 0 -47.4668 Td (4652 {) 26.2111 Tj 0 -56.9602 Td (4653 struct file *f;) 96.1073 Tj 0 -66.4535 Td (4654 struct stat *st;) 100.476 Tj 0 -75.9469 Td (4655 ) 21.8426 Tj 0 -85.4403 Td (4656 if\(argfd\(0, 0, &f\) < 0 || argptr\(1, \(void*\)&st, si\ zeof\(*st\)\) < 0\)) 314.533 Tj 0 -94.9336 Td (4657 return -1;) 83.0018 Tj 0 -104.427 Td (4658 return filestat\(f, st\);) 131.055 Tj 0 -113.92 Td (4659 }) 26.2111 Tj 0 -123.414 Td (4660 ) 21.8426 Tj 0 -132.907 Td (4661 // Create the path new as a link to the same inode as old.) 275.216 Tj 0 -142.4 Td (4662 int) 34.9481 Tj 0 -151.894 Td (4663 sys_link\(void\)) 83.0018 Tj 0 -161.387 Td (4664 {) 26.2111 Tj 0 -170.88 Td (4665 char name[DIRSIZ], *new, *old;) 161.635 Tj 0 -180.374 Td (4666 struct inode *dp, *ip;) 126.687 Tj 0 -189.867 Td (4667 ) 21.8426 Tj 0 -199.361 Td (4668 if\(argstr\(0, &old\) < 0 || argstr\(1, &new\) < 0\)) 231.531 Tj 0 -208.854 Td (4669 return -1;) 83.0018 Tj 0 -218.347 Td (4670 if\(\(ip = namei\(old\)\) == 0\)) 144.161 Tj 0 -227.841 Td (4671 return -1;) 83.0018 Tj 0 -237.334 Td (4672 ilock\(ip\);) 74.2647 Tj 0 -246.827 Td (4673 if\(ip->type == T_DIR\){) 126.687 Tj 0 -256.321 Td (4674 iunlockput\(ip\);) 104.844 Tj 0 -265.814 Td (4675 return -1;) 83.0018 Tj 0 -275.307 Td (4676 }) 34.9481 Tj 0 -284.801 Td (4677 ip->nlink++;) 83.0018 Tj 0 -294.294 Td (4678 iupdate\(ip\);) 83.0018 Tj 0 -303.788 Td (4679 iunlock\(ip\);) 83.0018 Tj 0 -313.281 Td (4680 ) 21.8426 Tj 0 -322.774 Td (4681 if\(\(dp = nameiparent\(new, name\)\) == 0\)) 196.583 Tj 0 -332.268 Td (4682 goto bad;) 83.0018 Tj 0 -341.761 Td (4683 ilock\(dp\);) 74.2647 Tj 0 -351.254 Td (4684 if\(dp->dev != ip->dev || dirlink\(dp, name, ip->inum\) \ < 0\)) 279.585 Tj 0 -360.748 Td (4685 goto bad;) 78.6333 Tj 0 -370.241 Td (4686 iunlockput\(dp\);) 96.1073 Tj 0 -379.734 Td (4687 iput\(ip\);) 69.8962 Tj 0 -389.228 Td (4688 return 0;) 69.8962 Tj 0 -398.721 Td (4689 ) 21.8426 Tj 0 -408.214 Td (4690 bad:) 39.3166 Tj 0 -417.708 Td (4691 if\(dp\)) 56.7907 Tj 0 -427.201 Td (4692 iunlockput\(dp\);) 104.844 Tj 0 -436.695 Td (4693 ilock\(ip\);) 74.2647 Tj 0 -446.188 Td (4694 ip->nlink--;) 83.0018 Tj 0 -455.681 Td (4695 iupdate\(ip\);) 83.0018 Tj 0 -465.175 Td (4696 iunlockput\(ip\);) 96.1073 Tj 0 -474.668 Td (4697 return -1;) 74.2647 Tj 0 -484.161 Td (4698 }) 26.2111 Tj 0 -493.655 Td (4699 ) 21.8426 Tj 0 -522.135 Td (Sheet 46) 34.9481 Tj Q Q Q Q showpage %%PageTrailer pdfEndPage %%Page: 54 54 %%BeginPageSetup %%PageOrientation: Landscape pdfStartPage 180 rotate -612 -792 translate 0 0 612 792 re W %%EndPageSetup [] 0 d 1 i 0 j 0 J 10 M 1 w /DeviceGray {} cs [0] sc /DeviceGray {} CS [0] SC false op false OP 0 0 612 792 re W q q [0.1 0 0 0.1 0 0] cm q 180 3960 5760 3460 re W /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [10 0 0 10 0 0] cm [1 0 0 1 0 0] Tm 0 0 Td [0 -0.967854 1 0 564.72 738.864] Tm 0 0 Td /F9_0 8.70222 Tf (Aug 30 10:08 2007 xv6/sysfile.c Page 4) 174.741 Tj 0 -28.4801 Td (4700 // Is the directory dp empty except for "." and ".." ?) 257.742 Tj 0 -37.9735 Td (4701 static int) 65.5277 Tj 0 -47.4668 Td (4702 isdirempty\(struct inode *dp\)) 144.161 Tj 0 -56.9602 Td (4703 {) 26.2111 Tj 0 -66.4535 Td (4704 int off;) 65.5277 Tj 0 -75.9469 Td (4705 struct dirent de;) 104.844 Tj 0 -85.4403 Td (4706 ) 21.8426 Tj 0 -94.9336 Td (4707 for\(off=2*sizeof\(de\); offsize; off+=sizeof\(de\)\ \){) 262.111 Tj 0 -104.427 Td (4708 if\(readi\(dp, \(char*\)&de, off, sizeof\(de\)\) != si\ zeof\(de\)\)) 283.953 Tj 0 -113.92 Td (4709 panic\("isdirempty: readi"\);) 166.004 Tj 0 -123.414 Td (4710 if\(de.inum != 0\)) 109.213 Tj 0 -132.907 Td (4711 return 0;) 87.3703 Tj 0 -142.4 Td (4712 }) 34.9481 Tj 0 -151.894 Td (4713 return 1;) 69.8962 Tj 0 -161.387 Td (4714 }) 26.2111 Tj 0 -170.88 Td (4715 ) 21.8426 Tj 0 -180.374 Td (4716 ) 21.8426 Tj 0 -189.867 Td (4717 ) 21.8426 Tj 0 -199.361 Td (4718 ) 21.8426 Tj 0 -208.854 Td (4719 ) 21.8426 Tj 0 -218.347 Td (4720 ) 21.8426 Tj 0 -227.841 Td (4721 ) 21.8426 Tj 0 -237.334 Td (4722 ) 21.8426 Tj 0 -246.827 Td (4723 ) 21.8426 Tj 0 -256.321 Td (4724 ) 21.8426 Tj 0 -265.814 Td (4725 ) 21.8426 Tj 0 -275.307 Td (4726 ) 21.8426 Tj 0 -284.801 Td (4727 ) 21.8426 Tj 0 -294.294 Td (4728 ) 21.8426 Tj 0 -303.788 Td (4729 ) 21.8426 Tj 0 -313.281 Td (4730 ) 21.8426 Tj 0 -322.774 Td (4731 ) 21.8426 Tj 0 -332.268 Td (4732 ) 21.8426 Tj 0 -341.761 Td (4733 ) 21.8426 Tj 0 -351.254 Td (4734 ) 21.8426 Tj 0 -360.748 Td (4735 ) 21.8426 Tj 0 -370.241 Td (4736 ) 21.8426 Tj 0 -379.734 Td (4737 ) 21.8426 Tj 0 -389.228 Td (4738 ) 21.8426 Tj 0 -398.721 Td (4739 ) 21.8426 Tj 0 -408.214 Td (4740 ) 21.8426 Tj 0 -417.708 Td (4741 ) 21.8426 Tj 0 -427.201 Td (4742 ) 21.8426 Tj 0 -436.695 Td (4743 ) 21.8426 Tj 0 -446.188 Td (4744 ) 21.8426 Tj 0 -455.681 Td (4745 ) 21.8426 Tj 0 -465.175 Td (4746 ) 21.8426 Tj 0 -474.668 Td (4747 ) 21.8426 Tj 0 -484.161 Td (4748 ) 21.8426 Tj 0 -493.655 Td (4749 ) 21.8426 Tj 0 -522.135 Td (Sheet 47) 34.9481 Tj Q Q q 180 500 5760 3460 re W /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [10 0 0 10 0 0] cm [1 0 0 1 0 0] Tm 0 0 Td [0 -0.967854 1 0 564.72 392.864] Tm 0 0 Td /F9_0 8.70222 Tf (Aug 30 10:08 2007 xv6/sysfile.c Page 5) 174.741 Tj 0 -28.4801 Td (4750 int) 34.9481 Tj 0 -37.9735 Td (4751 sys_unlink\(void\)) 91.7388 Tj 0 -47.4668 Td (4752 {) 26.2111 Tj 0 -56.9602 Td (4753 struct inode *ip, *dp;) 126.687 Tj 0 -66.4535 Td (4754 struct dirent de;) 104.844 Tj 0 -75.9469 Td (4755 char name[DIRSIZ], *path;) 139.792 Tj 0 -85.4403 Td (4756 uint off;) 69.8962 Tj 0 -94.9336 Td (4757 ) 21.8426 Tj 0 -104.427 Td (4758 if\(argstr\(0, &path\) < 0\)) 135.424 Tj 0 -113.92 Td (4759 return -1;) 83.0018 Tj 0 -123.414 Td (4760 if\(\(dp = nameiparent\(path, name\)\) == 0\)) 200.952 Tj 0 -132.907 Td (4761 return -1;) 83.0018 Tj 0 -142.4 Td (4762 ilock\(dp\);) 74.2647 Tj 0 -151.894 Td (4763 ) 21.8426 Tj 0 -161.387 Td (4764 // Cannot unlink "." or "..".) 157.267 Tj 0 -170.88 Td (4765 if\(namecmp\(name, "."\) == 0 || namecmp\(name, ".."\) =\ = 0\){) 275.216 Tj 0 -180.374 Td (4766 iunlockput\(dp\);) 104.844 Tj 0 -189.867 Td (4767 return -1;) 83.0018 Tj 0 -199.361 Td (4768 }) 34.9481 Tj 0 -208.854 Td (4769 ) 21.8426 Tj 0 -218.347 Td (4770 if\(\(ip = dirlookup\(dp, name, &off\)\) == 0\){) 214.057 Tj 0 -227.841 Td (4771 iunlockput\(dp\);) 104.844 Tj 0 -237.334 Td (4772 return -1;) 83.0018 Tj 0 -246.827 Td (4773 }) 34.9481 Tj 0 -256.321 Td (4774 ilock\(ip\);) 74.2647 Tj 0 -265.814 Td (4775 ) 21.8426 Tj 0 -275.307 Td (4776 if\(ip->nlink < 1\)) 104.844 Tj 0 -284.801 Td (4777 panic\("unlink: nlink < 1"\);) 157.267 Tj 0 -294.294 Td (4778 if\(ip->type == T_DIR && !isdirempty\(ip\)\){) 209.689 Tj 0 -303.788 Td (4779 iunlockput\(ip\);) 104.844 Tj 0 -313.281 Td (4780 iunlockput\(dp\);) 104.844 Tj 0 -322.774 Td (4781 return -1;) 83.0018 Tj 0 -332.268 Td (4782 }) 34.9481 Tj 0 -341.761 Td (4783 ) 21.8426 Tj 0 -351.254 Td (4784 memset\(&de, 0, sizeof\(de\)\);) 148.529 Tj 0 -360.748 Td (4785 if\(writei\(dp, \(char*\)&de, off, sizeof\(de\)\) != siz\ eof\(de\)\)) 279.585 Tj 0 -370.241 Td (4786 panic\("unlink: writei"\);) 144.161 Tj 0 -379.734 Td (4787 iunlockput\(dp\);) 96.1073 Tj 0 -389.228 Td (4788 ) 21.8426 Tj 0 -398.721 Td (4789 ip->nlink--;) 83.0018 Tj 0 -408.214 Td (4790 iupdate\(ip\);) 83.0018 Tj 0 -417.708 Td (4791 iunlockput\(ip\);) 96.1073 Tj 0 -427.201 Td (4792 return 0;) 69.8962 Tj 0 -436.695 Td (4793 }) 26.2111 Tj 0 -446.188 Td (4794 ) 21.8426 Tj 0 -455.681 Td (4795 ) 21.8426 Tj 0 -465.175 Td (4796 ) 21.8426 Tj 0 -474.668 Td (4797 ) 21.8426 Tj 0 -484.161 Td (4798 ) 21.8426 Tj 0 -493.655 Td (4799 ) 21.8426 Tj 0 -522.135 Td (Sheet 47) 34.9481 Tj Q Q Q Q showpage %%PageTrailer pdfEndPage %%Page: 55 55 %%BeginPageSetup %%PageOrientation: Landscape pdfStartPage 180 rotate -612 -792 translate 0 0 612 792 re W %%EndPageSetup [] 0 d 1 i 0 j 0 J 10 M 1 w /DeviceGray {} cs [0] sc /DeviceGray {} CS [0] SC false op false OP 0 0 612 792 re W q q [0.1 0 0 0.1 0 0] cm q 180 3960 5760 3460 re W /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [10 0 0 10 0 0] cm [1 0 0 1 0 0] Tm 0 0 Td [0 -0.967854 1 0 564.72 738.864] Tm 0 0 Td /F9_0 8.70222 Tf (Aug 30 10:08 2007 xv6/sysfile.c Page 6) 174.741 Tj 0 -28.4801 Td (4800 static struct inode*) 109.213 Tj 0 -37.9735 Td (4801 create\(char *path, int canexist, short type, short major,\ short minor\)) 327.639 Tj 0 -47.4668 Td (4802 {) 26.2111 Tj 0 -56.9602 Td (4803 uint off;) 69.8962 Tj 0 -66.4535 Td (4804 struct inode *ip, *dp;) 126.687 Tj 0 -75.9469 Td (4805 char name[DIRSIZ];) 109.213 Tj 0 -85.4403 Td (4806 ) 21.8426 Tj 0 -94.9336 Td (4807 if\(\(dp = nameiparent\(path, name\)\) == 0\)) 200.952 Tj 0 -104.427 Td (4808 return 0;) 78.6333 Tj 0 -113.92 Td (4809 ilock\(dp\);) 74.2647 Tj 0 -123.414 Td (4810 ) 21.8426 Tj 0 -132.907 Td (4811 if\(canexist && \(ip = dirlookup\(dp, name, &off\)\) != \ 0\){) 266.479 Tj 0 -142.4 Td (4812 iunlockput\(dp\);) 104.844 Tj 0 -151.894 Td (4813 ilock\(ip\);) 83.0018 Tj 0 -161.387 Td (4814 if\(ip->type != type || ip->major != major || ip->mino\ r != minor\){) 323.27 Tj 0 -170.88 Td (4815 iunlockput\(ip\);) 113.581 Tj 0 -180.374 Td (4816 return 0;) 87.3703 Tj 0 -189.867 Td (4817 }) 43.6851 Tj 0 -199.361 Td (4818 return ip;) 83.0018 Tj 0 -208.854 Td (4819 }) 34.9481 Tj 0 -218.347 Td (4820 ) 21.8426 Tj 0 -227.841 Td (4821 if\(\(ip = ialloc\(dp->dev, type\)\) == 0\){) 196.583 Tj 0 -237.334 Td (4822 iunlockput\(dp\);) 104.844 Tj 0 -246.827 Td (4823 return 0;) 78.6333 Tj 0 -256.321 Td (4824 }) 34.9481 Tj 0 -265.814 Td (4825 ilock\(ip\);) 74.2647 Tj 0 -275.307 Td (4826 ip->major = major;) 109.213 Tj 0 -284.801 Td (4827 ip->minor = minor;) 109.213 Tj 0 -294.294 Td (4828 ip->nlink = 1;) 91.7388 Tj 0 -303.788 Td (4829 iupdate\(ip\);) 83.0018 Tj 0 -313.281 Td (4830 ) 21.8426 Tj 0 -322.774 Td (4831 if\(dirlink\(dp, name, ip->inum\) < 0\){) 187.846 Tj 0 -332.268 Td (4832 ip->nlink = 0;) 100.476 Tj 0 -341.761 Td (4833 iunlockput\(ip\);) 104.844 Tj 0 -351.254 Td (4834 iunlockput\(dp\);) 104.844 Tj 0 -360.748 Td (4835 return 0;) 78.6333 Tj 0 -370.241 Td (4836 }) 34.9481 Tj 0 -379.734 Td (4837 ) 21.8426 Tj 0 -389.228 Td (4838 if\(type == T_DIR\){ // Create . and .. entries.) 235.9 Tj 0 -398.721 Td (4839 dp->nlink++; // for "..") 148.529 Tj 0 -408.214 Td (4840 iupdate\(dp\);) 91.7388 Tj 0 -417.708 Td (4841 // No ip->nlink++ for ".": avoid cyclic ref count.) 257.742 Tj 0 -427.201 Td (4842 if\(dirlink\(ip, ".", ip->inum\) < 0 || dirlink\(ip, "\ ..", dp->inum\) < 0\)) 340.744 Tj 0 -436.695 Td (4843 panic\("create dots"\);) 139.792 Tj 0 -446.188 Td (4844 }) 34.9481 Tj 0 -455.681 Td (4845 iunlockput\(dp\);) 96.1073 Tj 0 -465.175 Td (4846 return ip;) 74.2647 Tj 0 -474.668 Td (4847 }) 26.2111 Tj 0 -484.161 Td (4848 ) 21.8426 Tj 0 -493.655 Td (4849 ) 21.8426 Tj 0 -522.135 Td (Sheet 48) 34.9481 Tj Q Q q 180 500 5760 3460 re W /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [10 0 0 10 0 0] cm [1 0 0 1 0 0] Tm 0 0 Td [0 -0.967854 1 0 564.72 392.864] Tm 0 0 Td /F9_0 8.70222 Tf (Aug 30 10:08 2007 xv6/sysfile.c Page 7) 174.741 Tj 0 -28.4801 Td (4850 int) 34.9481 Tj 0 -37.9735 Td (4851 sys_open\(void\)) 83.0018 Tj 0 -47.4668 Td (4852 {) 26.2111 Tj 0 -56.9602 Td (4853 char *path;) 78.6333 Tj 0 -66.4535 Td (4854 int fd, omode;) 91.7388 Tj 0 -75.9469 Td (4855 struct file *f;) 96.1073 Tj 0 -85.4403 Td (4856 struct inode *ip;) 104.844 Tj 0 -94.9336 Td (4857 ) 21.8426 Tj 0 -104.427 Td (4858 if\(argstr\(0, &path\) < 0 || argint\(1, &omode\) < 0\)) 244.637 Tj 0 -113.92 Td (4859 return -1;) 83.0018 Tj 0 -123.414 Td (4860 ) 21.8426 Tj 0 -132.907 Td (4861 if\(omode & O_CREATE\){) 122.318 Tj 0 -142.4 Td (4862 if\(\(ip = create\(path, 1, T_FILE, 0, 0\)\) == 0\)) 235.9 Tj 0 -151.894 Td (4863 return -1;) 91.7388 Tj 0 -161.387 Td (4864 } else {) 65.5277 Tj 0 -170.88 Td (4865 if\(\(ip = namei\(path\)\) == 0\)) 157.267 Tj 0 -180.374 Td (4866 return -1;) 91.7388 Tj 0 -189.867 Td (4867 ilock\(ip\);) 83.0018 Tj 0 -199.361 Td (4868 if\(ip->type == T_DIR && \(omode & \(O_RDWR|O_WRONLY\)\ \)\){) 270.848 Tj 0 -208.854 Td (4869 iunlockput\(ip\);) 113.581 Tj 0 -218.347 Td (4870 return -1;) 91.7388 Tj 0 -227.841 Td (4871 }) 43.6851 Tj 0 -237.334 Td (4872 }) 34.9481 Tj 0 -246.827 Td (4873 ) 21.8426 Tj 0 -256.321 Td (4874 if\(\(f = filealloc\(\)\) == 0 || \(fd = fdalloc\(f\)\) \ < 0\){) 257.742 Tj 0 -265.814 Td (4875 if\(f\)) 61.1592 Tj 0 -275.307 Td (4876 fileclose\(f\);) 104.844 Tj 0 -284.801 Td (4877 iunlockput\(ip\);) 104.844 Tj 0 -294.294 Td (4878 return -1;) 83.0018 Tj 0 -303.788 Td (4879 }) 34.9481 Tj 0 -313.281 Td (4880 iunlock\(ip\);) 83.0018 Tj 0 -322.774 Td (4881 ) 21.8426 Tj 0 -332.268 Td (4882 f->type = FD_INODE;) 113.581 Tj 0 -341.761 Td (4883 f->ip = ip;) 78.6333 Tj 0 -351.254 Td (4884 f->off = 0;) 78.6333 Tj 0 -360.748 Td (4885 f->readable = !\(omode & O_WRONLY\);) 179.109 Tj 0 -370.241 Td (4886 f->writable = \(omode & O_WRONLY\) || \(omode & O_RDWR\)\ ;) 262.111 Tj 0 -379.734 Td (4887 ) 21.8426 Tj 0 -389.228 Td (4888 return fd;) 74.2647 Tj 0 -398.721 Td (4889 }) 26.2111 Tj 0 -408.214 Td (4890 ) 21.8426 Tj 0 -417.708 Td (4891 ) 21.8426 Tj 0 -427.201 Td (4892 ) 21.8426 Tj 0 -436.695 Td (4893 ) 21.8426 Tj 0 -446.188 Td (4894 ) 21.8426 Tj 0 -455.681 Td (4895 ) 21.8426 Tj 0 -465.175 Td (4896 ) 21.8426 Tj 0 -474.668 Td (4897 ) 21.8426 Tj 0 -484.161 Td (4898 ) 21.8426 Tj 0 -493.655 Td (4899 ) 21.8426 Tj 0 -522.135 Td (Sheet 48) 34.9481 Tj Q Q Q Q showpage %%PageTrailer pdfEndPage %%Page: 56 56 %%BeginPageSetup %%PageOrientation: Landscape pdfStartPage 180 rotate -612 -792 translate 0 0 612 792 re W %%EndPageSetup [] 0 d 1 i 0 j 0 J 10 M 1 w /DeviceGray {} cs [0] sc /DeviceGray {} CS [0] SC false op false OP 0 0 612 792 re W q q [0.1 0 0 0.1 0 0] cm q 180 3960 5760 3460 re W /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [10 0 0 10 0 0] cm [1 0 0 1 0 0] Tm 0 0 Td [0 -0.967854 1 0 564.72 738.864] Tm 0 0 Td /F9_0 8.70222 Tf (Aug 30 10:08 2007 xv6/sysfile.c Page 8) 174.741 Tj 0 -28.4801 Td (4900 int) 34.9481 Tj 0 -37.9735 Td (4901 sys_mknod\(void\)) 87.3703 Tj 0 -47.4668 Td (4902 {) 26.2111 Tj 0 -56.9602 Td (4903 struct inode *ip;) 104.844 Tj 0 -66.4535 Td (4904 char *path;) 78.6333 Tj 0 -75.9469 Td (4905 int len;) 65.5277 Tj 0 -85.4403 Td (4906 int major, minor;) 104.844 Tj 0 -94.9336 Td (4907 ) 21.8426 Tj 0 -104.427 Td (4908 if\(\(len=argstr\(0, &path\)\) < 0 ||) 170.372 Tj 0 -113.92 Td (4909 argint\(1, &major\) < 0 ||) 148.529 Tj 0 -123.414 Td (4910 argint\(2, &minor\) < 0 ||) 148.529 Tj 0 -132.907 Td (4911 \(ip = create\(path, 0, T_DEV, major, minor\)\) == 0\)) 257.742 Tj 0 -142.4 Td (4912 return -1;) 83.0018 Tj 0 -151.894 Td (4913 iunlockput\(ip\);) 96.1073 Tj 0 -161.387 Td (4914 return 0;) 69.8962 Tj 0 -170.88 Td (4915 }) 26.2111 Tj 0 -180.374 Td (4916 ) 21.8426 Tj 0 -189.867 Td (4917 int) 34.9481 Tj 0 -199.361 Td (4918 sys_mkdir\(void\)) 87.3703 Tj 0 -208.854 Td (4919 {) 26.2111 Tj 0 -218.347 Td (4920 char *path;) 78.6333 Tj 0 -227.841 Td (4921 struct inode *ip;) 104.844 Tj 0 -237.334 Td (4922 ) 21.8426 Tj 0 -246.827 Td (4923 if\(argstr\(0, &path\) < 0 || \(ip = create\(path, 0, T_\ DIR, 0, 0\)\) == 0\)) 327.639 Tj 0 -256.321 Td (4924 return -1;) 83.0018 Tj 0 -265.814 Td (4925 iunlockput\(ip\);) 96.1073 Tj 0 -275.307 Td (4926 return 0;) 69.8962 Tj 0 -284.801 Td (4927 }) 26.2111 Tj 0 -294.294 Td (4928 ) 21.8426 Tj 0 -303.788 Td (4929 int) 34.9481 Tj 0 -313.281 Td (4930 sys_chdir\(void\)) 87.3703 Tj 0 -322.774 Td (4931 {) 26.2111 Tj 0 -332.268 Td (4932 char *path;) 78.6333 Tj 0 -341.761 Td (4933 struct inode *ip;) 104.844 Tj 0 -351.254 Td (4934 ) 21.8426 Tj 0 -360.748 Td (4935 if\(argstr\(0, &path\) < 0 || \(ip = namei\(path\)\) == \ 0\)) 253.374 Tj 0 -370.241 Td (4936 return -1;) 83.0018 Tj 0 -379.734 Td (4937 ilock\(ip\);) 74.2647 Tj 0 -389.228 Td (4938 if\(ip->type != T_DIR\){) 126.687 Tj 0 -398.721 Td (4939 iunlockput\(ip\);) 104.844 Tj 0 -408.214 Td (4940 return -1;) 83.0018 Tj 0 -417.708 Td (4941 }) 34.9481 Tj 0 -427.201 Td (4942 iunlock\(ip\);) 83.0018 Tj 0 -436.695 Td (4943 iput\(cp->cwd\);) 91.7388 Tj 0 -446.188 Td (4944 cp->cwd = ip;) 87.3703 Tj 0 -455.681 Td (4945 return 0;) 69.8962 Tj 0 -465.175 Td (4946 }) 26.2111 Tj 0 -474.668 Td (4947 ) 21.8426 Tj 0 -484.161 Td (4948 ) 21.8426 Tj 0 -493.655 Td (4949 ) 21.8426 Tj 0 -522.135 Td (Sheet 49) 34.9481 Tj Q Q q 180 500 5760 3460 re W /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [10 0 0 10 0 0] cm [1 0 0 1 0 0] Tm 0 0 Td [0 -0.967854 1 0 564.72 392.864] Tm 0 0 Td /F9_0 8.70222 Tf (Aug 30 10:08 2007 xv6/sysfile.c Page 9) 174.741 Tj 0 -28.4801 Td (4950 int) 34.9481 Tj 0 -37.9735 Td (4951 sys_exec\(void\)) 83.0018 Tj 0 -47.4668 Td (4952 {) 26.2111 Tj 0 -56.9602 Td (4953 char *path, *argv[20];) 126.687 Tj 0 -66.4535 Td (4954 int i;) 56.7907 Tj 0 -75.9469 Td (4955 uint uargv, uarg;) 104.844 Tj 0 -85.4403 Td (4956 ) 21.8426 Tj 0 -94.9336 Td (4957 if\(argstr\(0, &path\) < 0 || argint\(1, \(int*\)&uargv\)\ < 0\)) 270.848 Tj 0 -104.427 Td (4958 return -1;) 83.0018 Tj 0 -113.92 Td (4959 memset\(argv, 0, sizeof\(argv\)\);) 161.635 Tj 0 -123.414 Td (4960 for\(i=0;; i++\){) 96.1073 Tj 0 -132.907 Td (4961 if\(i >= NELEM\(argv\)\)) 126.687 Tj 0 -142.4 Td (4962 return -1;) 91.7388 Tj 0 -151.894 Td (4963 if\(fetchint\(cp, uargv+4*i, \(int*\)&uarg\) < 0\)) 231.531 Tj 0 -161.387 Td (4964 return -1;) 91.7388 Tj 0 -170.88 Td (4965 if\(uarg == 0\){) 100.476 Tj 0 -180.374 Td (4966 argv[i] = 0;) 100.476 Tj 0 -189.867 Td (4967 break;) 74.2647 Tj 0 -199.361 Td (4968 }) 43.6851 Tj 0 -208.854 Td (4969 if\(fetchstr\(cp, uarg, &argv[i]\) < 0\)) 196.583 Tj 0 -218.347 Td (4970 return -1;) 91.7388 Tj 0 -227.841 Td (4971 }) 34.9481 Tj 0 -237.334 Td (4972 return exec\(path, argv\);) 135.424 Tj 0 -246.827 Td (4973 }) 26.2111 Tj 0 -256.321 Td (4974 ) 21.8426 Tj 0 -265.814 Td (4975 int) 34.9481 Tj 0 -275.307 Td (4976 sys_pipe\(void\)) 83.0018 Tj 0 -284.801 Td (4977 {) 26.2111 Tj 0 -294.294 Td (4978 int *fd;) 65.5277 Tj 0 -303.788 Td (4979 struct file *rf, *wf;) 122.318 Tj 0 -313.281 Td (4980 int fd0, fd1;) 87.3703 Tj 0 -322.774 Td (4981 ) 21.8426 Tj 0 -332.268 Td (4982 if\(argptr\(0, \(void*\)&fd, 2*sizeof\(fd[0]\)\) < 0\)) 231.531 Tj 0 -341.761 Td (4983 return -1;) 83.0018 Tj 0 -351.254 Td (4984 if\(pipealloc\(&rf, &wf\) < 0\)) 148.529 Tj 0 -360.748 Td (4985 return -1;) 83.0018 Tj 0 -370.241 Td (4986 fd0 = -1;) 69.8962 Tj 0 -379.734 Td (4987 if\(\(fd0 = fdalloc\(rf\)\) < 0 || \(fd1 = fdalloc\(wf\)\ \) < 0\){) 270.848 Tj 0 -389.228 Td (4988 if\(fd0 >= 0\)) 91.7388 Tj 0 -398.721 Td (4989 cp->ofile[fd0] = 0;) 131.055 Tj 0 -408.214 Td (4990 fileclose\(rf\);) 100.476 Tj 0 -417.708 Td (4991 fileclose\(wf\);) 100.476 Tj 0 -427.201 Td (4992 return -1;) 83.0018 Tj 0 -436.695 Td (4993 }) 34.9481 Tj 0 -446.188 Td (4994 fd[0] = fd0;) 83.0018 Tj 0 -455.681 Td (4995 fd[1] = fd1;) 83.0018 Tj 0 -465.175 Td (4996 return 0;) 69.8962 Tj 0 -474.668 Td (4997 }) 26.2111 Tj 0 -484.161 Td (4998 ) 21.8426 Tj 0 -493.655 Td (4999 ) 21.8426 Tj 0 -522.135 Td (Sheet 49) 34.9481 Tj Q Q Q Q showpage %%PageTrailer pdfEndPage %%Page: 57 57 %%BeginPageSetup %%PageOrientation: Landscape pdfStartPage 180 rotate -612 -792 translate 0 0 612 792 re W %%EndPageSetup [] 0 d 1 i 0 j 0 J 10 M 1 w /DeviceGray {} cs [0] sc /DeviceGray {} CS [0] SC false op false OP 0 0 612 792 re W q q [0.1 0 0 0.1 0 0] cm q 180 3960 5760 3460 re W /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [10 0 0 10 0 0] cm [1 0 0 1 0 0] Tm 0 0 Td [0 -0.967854 1 0 564.72 738.864] Tm 0 0 Td /F9_0 8.70222 Tf (Aug 30 10:08 2007 xv6/exec.c Page 1) 161.635 Tj 0 -28.4801 Td (5000 #include "types.h") 100.476 Tj 0 -37.9735 Td (5001 #include "param.h") 100.476 Tj 0 -47.4668 Td (5002 #include "mmu.h") 91.7388 Tj 0 -56.9602 Td (5003 #include "proc.h") 96.1073 Tj 0 -66.4535 Td (5004 #include "defs.h") 96.1073 Tj 0 -75.9469 Td (5005 #include "x86.h") 91.7388 Tj 0 -85.4403 Td (5006 #include "elf.h") 91.7388 Tj 0 -94.9336 Td (5007 ) 21.8426 Tj 0 -104.427 Td (5008 int) 34.9481 Tj 0 -113.92 Td (5009 exec\(char *path, char **argv\)) 148.529 Tj 0 -123.414 Td (5010 {) 26.2111 Tj 0 -132.907 Td (5011 char *mem, *s, *last;) 122.318 Tj 0 -142.4 Td (5012 int i, argc, arglen, len, off;) 161.635 Tj 0 -151.894 Td (5013 uint sz, sp, argp;) 109.213 Tj 0 -161.387 Td (5014 struct elfhdr elf;) 109.213 Tj 0 -170.88 Td (5015 struct inode *ip;) 104.844 Tj 0 -180.374 Td (5016 struct proghdr ph;) 109.213 Tj 0 -189.867 Td (5017 ) 21.8426 Tj 0 -199.361 Td (5018 if\(\(ip = namei\(path\)\) == 0\)) 148.529 Tj 0 -208.854 Td (5019 return -1;) 83.0018 Tj 0 -218.347 Td (5020 ilock\(ip\);) 74.2647 Tj 0 -227.841 Td (5021 ) 21.8426 Tj 0 -237.334 Td (5022 // Compute memory size of new process.) 196.583 Tj 0 -246.827 Td (5023 mem = 0;) 65.5277 Tj 0 -256.321 Td (5024 sz = 0;) 61.1592 Tj 0 -265.814 Td (5025 ) 21.8426 Tj 0 -275.307 Td (5026 // Program segments.) 117.95 Tj 0 -284.801 Td (5027 if\(readi\(ip, \(char*\)&elf, 0, sizeof\(elf\)\) < sizeo\ f\(elf\)\)) 275.216 Tj 0 -294.294 Td (5028 goto bad;) 78.6333 Tj 0 -303.788 Td (5029 if\(elf.magic != ELF_MAGIC\)) 144.161 Tj 0 -313.281 Td (5030 goto bad;) 78.6333 Tj 0 -322.774 Td (5031 for\(i=0, off=elf.phoff; i sz\)) 148.529 Tj 0 -161.387 Td (5064 goto bad;) 87.3703 Tj 0 -170.88 Td (5065 if\(readi\(ip, mem + ph.va, ph.offset, ph.filesz\) != \ ph.filesz\)) 305.796 Tj 0 -180.374 Td (5066 goto bad;) 87.3703 Tj 0 -189.867 Td (5067 memset\(mem + ph.va + ph.filesz, 0, ph.memsz - ph.file\ sz\);) 288.322 Tj 0 -199.361 Td (5068 }) 34.9481 Tj 0 -208.854 Td (5069 iunlockput\(ip\);) 96.1073 Tj 0 -218.347 Td (5070 ) 21.8426 Tj 0 -227.841 Td (5071 // Initialize stack.) 117.95 Tj 0 -237.334 Td (5072 sp = sz;) 65.5277 Tj 0 -246.827 Td (5073 argp = sz - arglen - 4*\(argc+1\);) 170.372 Tj 0 -256.321 Td (5074 ) 21.8426 Tj 0 -265.814 Td (5075 // Copy argv strings and pointers to stack.) 218.426 Tj 0 -275.307 Td (5076 *\(uint*\)\(mem+argp + 4*argc\) = 0; // argv[argc]) 235.9 Tj 0 -284.801 Td (5077 for\(i=argc-1; i>=0; i--\){) 139.792 Tj 0 -294.294 Td (5078 len = strlen\(argv[i]\) + 1;) 152.898 Tj 0 -303.788 Td (5079 sp -= len;) 83.0018 Tj 0 -313.281 Td (5080 memmove\(mem+sp, argv[i], len\);) 170.372 Tj 0 -322.774 Td (5081 *\(uint*\)\(mem+argp + 4*i\) = sp; // argv[i]) 222.794 Tj 0 -332.268 Td (5082 }) 34.9481 Tj 0 -341.761 Td (5083 ) 21.8426 Tj 0 -351.254 Td (5084 // Stack frame for main\(argc, argv\), below arguments.) 262.111 Tj 0 -360.748 Td (5085 sp = argp;) 74.2647 Tj 0 -370.241 Td (5086 sp -= 4;) 65.5277 Tj 0 -379.734 Td (5087 *\(uint*\)\(mem+sp\) = argp;) 135.424 Tj 0 -389.228 Td (5088 sp -= 4;) 65.5277 Tj 0 -398.721 Td (5089 *\(uint*\)\(mem+sp\) = argc;) 135.424 Tj 0 -408.214 Td (5090 sp -= 4;) 65.5277 Tj 0 -417.708 Td (5091 *\(uint*\)\(mem+sp\) = 0xffffffff; // fake return pc) 249.005 Tj 0 -427.201 Td (5092 ) 21.8426 Tj 0 -436.695 Td (5093 // Save program name for debugging.) 183.478 Tj 0 -446.188 Td (5094 for\(last=s=path; *s; s++\)) 139.792 Tj 0 -455.681 Td (5095 if\(*s == '/'\)) 96.1073 Tj 0 -465.175 Td (5096 last = s+1;) 96.1073 Tj 0 -474.668 Td (5097 safestrcpy\(cp->name, last, sizeof\(cp->name\)\);) 227.163 Tj 0 -484.161 Td (5098 ) 21.8426 Tj 0 -493.655 Td (5099 ) 21.8426 Tj 0 -522.135 Td (Sheet 50) 34.9481 Tj Q Q Q Q showpage %%PageTrailer pdfEndPage %%Page: 58 58 %%BeginPageSetup %%PageOrientation: Landscape pdfStartPage 180 rotate -612 -792 translate 0 0 612 792 re W %%EndPageSetup [] 0 d 1 i 0 j 0 J 10 M 1 w /DeviceGray {} cs [0] sc /DeviceGray {} CS [0] SC false op false OP 0 0 612 792 re W q q [0.1 0 0 0.1 0 0] cm q 180 3960 5760 3460 re W /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [10 0 0 10 0 0] cm [1 0 0 1 0 0] Tm 0 0 Td [0 -0.967854 1 0 564.72 738.864] Tm 0 0 Td /F9_0 8.70222 Tf (Aug 30 10:08 2007 xv6/exec.c Page 3) 161.635 Tj 0 -28.4801 Td (5100 // Commit to the new image.) 148.529 Tj 0 -37.9735 Td (5101 kfree\(cp->mem, cp->sz\);) 131.055 Tj 0 -47.4668 Td (5102 cp->mem = mem;) 91.7388 Tj 0 -56.9602 Td (5103 cp->sz = sz;) 83.0018 Tj 0 -66.4535 Td (5104 cp->tf->eip = elf.entry; // main) 174.741 Tj 0 -75.9469 Td (5105 cp->tf->esp = sp;) 104.844 Tj 0 -85.4403 Td (5106 setupsegs\(cp\);) 91.7388 Tj 0 -94.9336 Td (5107 return 0;) 69.8962 Tj 0 -104.427 Td (5108 ) 21.8426 Tj 0 -113.92 Td (5109 bad:) 43.6851 Tj 0 -123.414 Td (5110 if\(mem\)) 61.1592 Tj 0 -132.907 Td (5111 kfree\(mem, sz\);) 104.844 Tj 0 -142.4 Td (5112 iunlockput\(ip\);) 96.1073 Tj 0 -151.894 Td (5113 return -1;) 74.2647 Tj 0 -161.387 Td (5114 }) 26.2111 Tj 0 -170.88 Td (5115 ) 21.8426 Tj 0 -180.374 Td (5116 ) 21.8426 Tj 0 -189.867 Td (5117 ) 21.8426 Tj 0 -199.361 Td (5118 ) 21.8426 Tj 0 -208.854 Td (5119 ) 21.8426 Tj 0 -218.347 Td (5120 ) 21.8426 Tj 0 -227.841 Td (5121 ) 21.8426 Tj 0 -237.334 Td (5122 ) 21.8426 Tj 0 -246.827 Td (5123 ) 21.8426 Tj 0 -256.321 Td (5124 ) 21.8426 Tj 0 -265.814 Td (5125 ) 21.8426 Tj 0 -275.307 Td (5126 ) 21.8426 Tj 0 -284.801 Td (5127 ) 21.8426 Tj 0 -294.294 Td (5128 ) 21.8426 Tj 0 -303.788 Td (5129 ) 21.8426 Tj 0 -313.281 Td (5130 ) 21.8426 Tj 0 -322.774 Td (5131 ) 21.8426 Tj 0 -332.268 Td (5132 ) 21.8426 Tj 0 -341.761 Td (5133 ) 21.8426 Tj 0 -351.254 Td (5134 ) 21.8426 Tj 0 -360.748 Td (5135 ) 21.8426 Tj 0 -370.241 Td (5136 ) 21.8426 Tj 0 -379.734 Td (5137 ) 21.8426 Tj 0 -389.228 Td (5138 ) 21.8426 Tj 0 -398.721 Td (5139 ) 21.8426 Tj 0 -408.214 Td (5140 ) 21.8426 Tj 0 -417.708 Td (5141 ) 21.8426 Tj 0 -427.201 Td (5142 ) 21.8426 Tj 0 -436.695 Td (5143 ) 21.8426 Tj 0 -446.188 Td (5144 ) 21.8426 Tj 0 -455.681 Td (5145 ) 21.8426 Tj 0 -465.175 Td (5146 ) 21.8426 Tj 0 -474.668 Td (5147 ) 21.8426 Tj 0 -484.161 Td (5148 ) 21.8426 Tj 0 -493.655 Td (5149 ) 21.8426 Tj 0 -522.135 Td (Sheet 51) 34.9481 Tj Q Q q 180 500 5760 3460 re W /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [10 0 0 10 0 0] cm [1 0 0 1 0 0] Tm 0 0 Td [0 -0.967854 1 0 564.72 392.864] Tm 0 0 Td /F9_0 8.70222 Tf (Aug 30 10:08 2007 xv6/pipe.c Page 1) 161.635 Tj 0 -28.4801 Td (5150 #include "types.h") 100.476 Tj 0 -37.9735 Td (5151 #include "defs.h") 96.1073 Tj 0 -47.4668 Td (5152 #include "param.h") 100.476 Tj 0 -56.9602 Td (5153 #include "mmu.h") 91.7388 Tj 0 -66.4535 Td (5154 #include "proc.h") 96.1073 Tj 0 -75.9469 Td (5155 #include "file.h") 96.1073 Tj 0 -85.4403 Td (5156 #include "spinlock.h") 113.581 Tj 0 -94.9336 Td (5157 ) 21.8426 Tj 0 -104.427 Td (5158 #define PIPESIZE 512) 109.213 Tj 0 -113.92 Td (5159 ) 21.8426 Tj 0 -123.414 Td (5160 struct pipe {) 78.6333 Tj 0 -132.907 Td (5161 int readopen; // read fd is still open) 205.32 Tj 0 -142.4 Td (5162 int writeopen; // write fd is still open) 209.689 Tj 0 -151.894 Td (5163 int writep; // next index to write) 196.583 Tj 0 -161.387 Td (5164 int readp; // next index to read) 192.215 Tj 0 -170.88 Td (5165 struct spinlock lock;) 122.318 Tj 0 -180.374 Td (5166 char data[PIPESIZE];) 117.95 Tj 0 -189.867 Td (5167 };) 30.5796 Tj 0 -199.361 Td (5168 ) 21.8426 Tj 0 -208.854 Td (5169 int) 34.9481 Tj 0 -218.347 Td (5170 pipealloc\(struct file **f0, struct file **f1\)) 218.426 Tj 0 -227.841 Td (5171 {) 26.2111 Tj 0 -237.334 Td (5172 struct pipe *p;) 96.1073 Tj 0 -246.827 Td (5173 ) 21.8426 Tj 0 -256.321 Td (5174 p = 0;) 56.7907 Tj 0 -265.814 Td (5175 *f0 = *f1 = 0;) 91.7388 Tj 0 -275.307 Td (5176 if\(\(*f0 = filealloc\(\)\) == 0 || \(*f1 = filealloc\(\)\ \) == 0\)) 275.216 Tj 0 -284.801 Td (5177 goto bad;) 78.6333 Tj 0 -294.294 Td (5178 if\(\(p = \(struct pipe*\)kalloc\(PAGE\)\) == 0\)) 209.689 Tj 0 -303.788 Td (5179 goto bad;) 78.6333 Tj 0 -313.281 Td (5180 p->readopen = 1;) 100.476 Tj 0 -322.774 Td (5181 p->writeopen = 1;) 104.844 Tj 0 -332.268 Td (5182 p->writep = 0;) 91.7388 Tj 0 -341.761 Td (5183 p->readp = 0;) 87.3703 Tj 0 -351.254 Td (5184 initlock\(&p->lock, "pipe"\);) 148.529 Tj 0 -360.748 Td (5185 \(*f0\)->type = FD_PIPE;) 126.687 Tj 0 -370.241 Td (5186 \(*f0\)->readable = 1;) 117.95 Tj 0 -379.734 Td (5187 \(*f0\)->writable = 0;) 117.95 Tj 0 -389.228 Td (5188 \(*f0\)->pipe = p;) 100.476 Tj 0 -398.721 Td (5189 \(*f1\)->type = FD_PIPE;) 126.687 Tj 0 -408.214 Td (5190 \(*f1\)->readable = 0;) 117.95 Tj 0 -417.708 Td (5191 \(*f1\)->writable = 1;) 117.95 Tj 0 -427.201 Td (5192 \(*f1\)->pipe = p;) 100.476 Tj 0 -436.695 Td (5193 return 0;) 69.8962 Tj 0 -446.188 Td (5194 ) 21.8426 Tj 0 -455.681 Td (5195 ) 21.8426 Tj 0 -465.175 Td (5196 ) 21.8426 Tj 0 -474.668 Td (5197 ) 21.8426 Tj 0 -484.161 Td (5198 ) 21.8426 Tj 0 -493.655 Td (5199 ) 21.8426 Tj 0 -522.135 Td (Sheet 51) 34.9481 Tj Q Q Q Q showpage %%PageTrailer pdfEndPage %%Page: 59 59 %%BeginPageSetup %%PageOrientation: Landscape pdfStartPage 180 rotate -612 -792 translate 0 0 612 792 re W %%EndPageSetup [] 0 d 1 i 0 j 0 J 10 M 1 w /DeviceGray {} cs [0] sc /DeviceGray {} CS [0] SC false op false OP 0 0 612 792 re W q q [0.1 0 0 0.1 0 0] cm q 180 3960 5760 3460 re W /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [10 0 0 10 0 0] cm [1 0 0 1 0 0] Tm 0 0 Td [0 -0.967854 1 0 564.72 738.864] Tm 0 0 Td /F9_0 8.70222 Tf (Aug 30 10:08 2007 xv6/pipe.c Page 2) 161.635 Tj 0 -28.4801 Td (5200 bad:) 43.6851 Tj 0 -37.9735 Td (5201 if\(p\)) 52.4222 Tj 0 -47.4668 Td (5202 kfree\(\(char*\)p, PAGE\);) 135.424 Tj 0 -56.9602 Td (5203 if\(*f0\){) 65.5277 Tj 0 -66.4535 Td (5204 \(*f0\)->type = FD_NONE;) 135.424 Tj 0 -75.9469 Td (5205 fileclose\(*f0\);) 104.844 Tj 0 -85.4403 Td (5206 }) 34.9481 Tj 0 -94.9336 Td (5207 if\(*f1\){) 65.5277 Tj 0 -104.427 Td (5208 \(*f1\)->type = FD_NONE;) 135.424 Tj 0 -113.92 Td (5209 fileclose\(*f1\);) 104.844 Tj 0 -123.414 Td (5210 }) 34.9481 Tj 0 -132.907 Td (5211 return -1;) 74.2647 Tj 0 -142.4 Td (5212 }) 26.2111 Tj 0 -151.894 Td (5213 ) 21.8426 Tj 0 -161.387 Td (5214 void) 39.3166 Tj 0 -170.88 Td (5215 pipeclose\(struct pipe *p, int writable\)) 192.215 Tj 0 -180.374 Td (5216 {) 26.2111 Tj 0 -189.867 Td (5217 acquire\(&p->lock\);) 109.213 Tj 0 -199.361 Td (5218 if\(writable\){) 87.3703 Tj 0 -208.854 Td (5219 p->writeopen = 0;) 113.581 Tj 0 -218.347 Td (5220 wakeup\(&p->readp\);) 117.95 Tj 0 -227.841 Td (5221 } else {) 65.5277 Tj 0 -237.334 Td (5222 p->readopen = 0;) 109.213 Tj 0 -246.827 Td (5223 wakeup\(&p->writep\);) 122.318 Tj 0 -256.321 Td (5224 }) 34.9481 Tj 0 -265.814 Td (5225 release\(&p->lock\);) 109.213 Tj 0 -275.307 Td (5226 ) 21.8426 Tj 0 -284.801 Td (5227 if\(p->readopen == 0 && p->writeopen == 0\)) 209.689 Tj 0 -294.294 Td (5228 kfree\(\(char*\)p, PAGE\);) 135.424 Tj 0 -303.788 Td (5229 }) 26.2111 Tj 0 -313.281 Td (5230 ) 21.8426 Tj 0 -322.774 Td (5231 ) 21.8426 Tj 0 -332.268 Td (5232 ) 21.8426 Tj 0 -341.761 Td (5233 ) 21.8426 Tj 0 -351.254 Td (5234 ) 21.8426 Tj 0 -360.748 Td (5235 ) 21.8426 Tj 0 -370.241 Td (5236 ) 21.8426 Tj 0 -379.734 Td (5237 ) 21.8426 Tj 0 -389.228 Td (5238 ) 21.8426 Tj 0 -398.721 Td (5239 ) 21.8426 Tj 0 -408.214 Td (5240 ) 21.8426 Tj 0 -417.708 Td (5241 ) 21.8426 Tj 0 -427.201 Td (5242 ) 21.8426 Tj 0 -436.695 Td (5243 ) 21.8426 Tj 0 -446.188 Td (5244 ) 21.8426 Tj 0 -455.681 Td (5245 ) 21.8426 Tj 0 -465.175 Td (5246 ) 21.8426 Tj 0 -474.668 Td (5247 ) 21.8426 Tj 0 -484.161 Td (5248 ) 21.8426 Tj 0 -493.655 Td (5249 ) 21.8426 Tj 0 -522.135 Td (Sheet 52) 34.9481 Tj Q Q q 180 500 5760 3460 re W /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [10 0 0 10 0 0] cm [1 0 0 1 0 0] Tm 0 0 Td [0 -0.967854 1 0 564.72 392.864] Tm 0 0 Td /F9_0 8.70222 Tf (Aug 30 10:08 2007 xv6/pipe.c Page 3) 161.635 Tj 0 -28.4801 Td (5250 int) 34.9481 Tj 0 -37.9735 Td (5251 pipewrite\(struct pipe *p, char *addr, int n\)) 214.057 Tj 0 -47.4668 Td (5252 {) 26.2111 Tj 0 -56.9602 Td (5253 int i;) 56.7907 Tj 0 -66.4535 Td (5254 ) 21.8426 Tj 0 -75.9469 Td (5255 acquire\(&p->lock\);) 109.213 Tj 0 -85.4403 Td (5256 for\(i = 0; i < n; i++\){) 131.055 Tj 0 -94.9336 Td (5257 while\(\(\(p->writep + 1\) % PIPESIZE\) == p->readp\){) 249.005 Tj 0 -104.427 Td (5258 if\(p->readopen == 0 || cp->killed\){) 200.952 Tj 0 -113.92 Td (5259 release\(&p->lock\);) 135.424 Tj 0 -123.414 Td (5260 return -1;) 100.476 Tj 0 -132.907 Td (5261 }) 52.4222 Tj 0 -142.4 Td (5262 wakeup\(&p->readp\);) 126.687 Tj 0 -151.894 Td (5263 sleep\(&p->writep, &p->lock\);) 170.372 Tj 0 -161.387 Td (5264 }) 43.6851 Tj 0 -170.88 Td (5265 p->data[p->writep] = addr[i];) 166.004 Tj 0 -180.374 Td (5266 p->writep = \(p->writep + 1\) % PIPESIZE;) 209.689 Tj 0 -189.867 Td (5267 }) 34.9481 Tj 0 -199.361 Td (5268 wakeup\(&p->readp\);) 109.213 Tj 0 -208.854 Td (5269 release\(&p->lock\);) 109.213 Tj 0 -218.347 Td (5270 return i;) 69.8962 Tj 0 -227.841 Td (5271 }) 26.2111 Tj 0 -237.334 Td (5272 ) 21.8426 Tj 0 -246.827 Td (5273 int) 34.9481 Tj 0 -256.321 Td (5274 piperead\(struct pipe *p, char *addr, int n\)) 209.689 Tj 0 -265.814 Td (5275 {) 26.2111 Tj 0 -275.307 Td (5276 int i;) 56.7907 Tj 0 -284.801 Td (5277 ) 21.8426 Tj 0 -294.294 Td (5278 acquire\(&p->lock\);) 109.213 Tj 0 -303.788 Td (5279 while\(p->readp == p->writep && p->writeopen\){) 227.163 Tj 0 -313.281 Td (5280 if\(cp->killed\){) 104.844 Tj 0 -322.774 Td (5281 release\(&p->lock\);) 126.687 Tj 0 -332.268 Td (5282 return -1;) 91.7388 Tj 0 -341.761 Td (5283 }) 43.6851 Tj 0 -351.254 Td (5284 sleep\(&p->readp, &p->lock\);) 157.267 Tj 0 -360.748 Td (5285 }) 34.9481 Tj 0 -370.241 Td (5286 for\(i = 0; i < n; i++\){) 131.055 Tj 0 -379.734 Td (5287 if\(p->readp == p->writep\)) 148.529 Tj 0 -389.228 Td (5288 break;) 74.2647 Tj 0 -398.721 Td (5289 addr[i] = p->data[p->readp];) 161.635 Tj 0 -408.214 Td (5290 p->readp = \(p->readp + 1\) % PIPESIZE;) 200.952 Tj 0 -417.708 Td (5291 }) 34.9481 Tj 0 -427.201 Td (5292 wakeup\(&p->writep\);) 113.581 Tj 0 -436.695 Td (5293 release\(&p->lock\);) 109.213 Tj 0 -446.188 Td (5294 return i;) 69.8962 Tj 0 -455.681 Td (5295 }) 26.2111 Tj 0 -465.175 Td (5296 ) 21.8426 Tj 0 -474.668 Td (5297 ) 21.8426 Tj 0 -484.161 Td (5298 ) 21.8426 Tj 0 -493.655 Td (5299 ) 21.8426 Tj 0 -522.135 Td (Sheet 52) 34.9481 Tj Q Q Q Q showpage %%PageTrailer pdfEndPage %%Page: 60 60 %%BeginPageSetup %%PageOrientation: Landscape pdfStartPage 180 rotate -612 -792 translate 0 0 612 792 re W %%EndPageSetup [] 0 d 1 i 0 j 0 J 10 M 1 w /DeviceGray {} cs [0] sc /DeviceGray {} CS [0] SC false op false OP 0 0 612 792 re W q q [0.1 0 0 0.1 0 0] cm q 180 3960 5760 3460 re W /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [10 0 0 10 0 0] cm [1 0 0 1 0 0] Tm 0 0 Td [0 -0.967854 1 0 564.72 738.864] Tm 0 0 Td /F9_0 8.70222 Tf (Aug 30 10:08 2007 xv6/string.c Page 1) 170.372 Tj 0 -28.4801 Td (5300 #include "types.h") 100.476 Tj 0 -37.9735 Td (5301 ) 21.8426 Tj 0 -47.4668 Td (5302 void*) 43.6851 Tj 0 -56.9602 Td (5303 memset\(void *dst, int c, uint n\)) 161.635 Tj 0 -66.4535 Td (5304 {) 26.2111 Tj 0 -75.9469 Td (5305 char *d;) 65.5277 Tj 0 -85.4403 Td (5306 ) 21.8426 Tj 0 -94.9336 Td (5307 d = \(char*\)dst;) 96.1073 Tj 0 -104.427 Td (5308 while\(n-- > 0\)) 91.7388 Tj 0 -113.92 Td (5309 *d++ = c;) 78.6333 Tj 0 -123.414 Td (5310 ) 21.8426 Tj 0 -132.907 Td (5311 return dst;) 78.6333 Tj 0 -142.4 Td (5312 }) 26.2111 Tj 0 -151.894 Td (5313 ) 21.8426 Tj 0 -161.387 Td (5314 int) 34.9481 Tj 0 -170.88 Td (5315 memcmp\(const void *v1, const void *v2, uint n\)) 222.794 Tj 0 -180.374 Td (5316 {) 26.2111 Tj 0 -189.867 Td (5317 const uchar *s1, *s2;) 122.318 Tj 0 -199.361 Td (5318 ) 21.8426 Tj 0 -208.854 Td (5319 s1 = v1;) 65.5277 Tj 0 -218.347 Td (5320 s2 = v2;) 65.5277 Tj 0 -227.841 Td (5321 while\(n-- > 0\){) 96.1073 Tj 0 -237.334 Td (5322 if\(*s1 != *s2\)) 100.476 Tj 0 -246.827 Td (5323 return *s1 - *s2;) 122.318 Tj 0 -256.321 Td (5324 s1++, s2++;) 87.3703 Tj 0 -265.814 Td (5325 }) 34.9481 Tj 0 -275.307 Td (5326 ) 21.8426 Tj 0 -284.801 Td (5327 return 0;) 69.8962 Tj 0 -294.294 Td (5328 }) 26.2111 Tj 0 -303.788 Td (5329 ) 21.8426 Tj 0 -313.281 Td (5330 void*) 43.6851 Tj 0 -322.774 Td (5331 memmove\(void *dst, const void *src, uint n\)) 209.689 Tj 0 -332.268 Td (5332 {) 26.2111 Tj 0 -341.761 Td (5333 const char *s;) 91.7388 Tj 0 -351.254 Td (5334 char *d;) 65.5277 Tj 0 -360.748 Td (5335 ) 21.8426 Tj 0 -370.241 Td (5336 s = src;) 65.5277 Tj 0 -379.734 Td (5337 d = dst;) 65.5277 Tj 0 -389.228 Td (5338 if\(s < d && s + n > d\){) 131.055 Tj 0 -398.721 Td (5339 s += n;) 69.8962 Tj 0 -408.214 Td (5340 d += n;) 69.8962 Tj 0 -417.708 Td (5341 while\(n-- > 0\)) 100.476 Tj 0 -427.201 Td (5342 *--d = *--s;) 100.476 Tj 0 -436.695 Td (5343 } else) 56.7907 Tj 0 -446.188 Td (5344 while\(n-- > 0\)) 100.476 Tj 0 -455.681 Td (5345 *d++ = *s++;) 100.476 Tj 0 -465.175 Td (5346 ) 21.8426 Tj 0 -474.668 Td (5347 return dst;) 78.6333 Tj 0 -484.161 Td (5348 }) 26.2111 Tj 0 -493.655 Td (5349 ) 21.8426 Tj 0 -522.135 Td (Sheet 53) 34.9481 Tj Q Q q 180 500 5760 3460 re W /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [10 0 0 10 0 0] cm [1 0 0 1 0 0] Tm 0 0 Td [0 -0.967854 1 0 564.72 392.864] Tm 0 0 Td /F9_0 8.70222 Tf (Aug 30 10:08 2007 xv6/string.c Page 2) 170.372 Tj 0 -28.4801 Td (5350 int) 34.9481 Tj 0 -37.9735 Td (5351 strncmp\(const char *p, const char *q, uint n\)) 218.426 Tj 0 -47.4668 Td (5352 {) 26.2111 Tj 0 -56.9602 Td (5353 while\(n > 0 && *p && *p == *q\)) 161.635 Tj 0 -66.4535 Td (5354 n--, p++, q++;) 100.476 Tj 0 -75.9469 Td (5355 if\(n == 0\)) 74.2647 Tj 0 -85.4403 Td (5356 return 0;) 78.6333 Tj 0 -94.9336 Td (5357 return \(uchar\)*p - \(uchar\)*q;) 157.267 Tj 0 -104.427 Td (5358 }) 26.2111 Tj 0 -113.92 Td (5359 ) 21.8426 Tj 0 -123.414 Td (5360 char*) 43.6851 Tj 0 -132.907 Td (5361 strncpy\(char *s, const char *t, int n\)) 187.846 Tj 0 -142.4 Td (5362 {) 26.2111 Tj 0 -151.894 Td (5363 char *os;) 69.8962 Tj 0 -161.387 Td (5364 ) 21.8426 Tj 0 -170.88 Td (5365 os = s;) 61.1592 Tj 0 -180.374 Td (5366 while\(n-- > 0 && \(*s++ = *t++\) != 0\)) 187.846 Tj 0 -189.867 Td (5367 ;) 43.6851 Tj 0 -199.361 Td (5368 while\(n-- > 0\)) 91.7388 Tj 0 -208.854 Td (5369 *s++ = 0;) 78.6333 Tj 0 -218.347 Td (5370 return os;) 74.2647 Tj 0 -227.841 Td (5371 }) 26.2111 Tj 0 -237.334 Td (5372 ) 21.8426 Tj 0 -246.827 Td (5373 // Like strncpy but guaranteed to NUL-terminate.) 231.531 Tj 0 -256.321 Td (5374 char*) 43.6851 Tj 0 -265.814 Td (5375 safestrcpy\(char *s, const char *t, int n\)) 200.952 Tj 0 -275.307 Td (5376 {) 26.2111 Tj 0 -284.801 Td (5377 char *os;) 69.8962 Tj 0 -294.294 Td (5378 ) 21.8426 Tj 0 -303.788 Td (5379 os = s;) 61.1592 Tj 0 -313.281 Td (5380 if\(n <= 0\)) 74.2647 Tj 0 -322.774 Td (5381 return os;) 83.0018 Tj 0 -332.268 Td (5382 while\(--n > 0 && \(*s++ = *t++\) != 0\)) 187.846 Tj 0 -341.761 Td (5383 ;) 43.6851 Tj 0 -351.254 Td (5384 *s = 0;) 61.1592 Tj 0 -360.748 Td (5385 return os;) 74.2647 Tj 0 -370.241 Td (5386 }) 26.2111 Tj 0 -379.734 Td (5387 ) 21.8426 Tj 0 -389.228 Td (5388 int) 34.9481 Tj 0 -398.721 Td (5389 strlen\(const char *s\)) 113.581 Tj 0 -408.214 Td (5390 {) 26.2111 Tj 0 -417.708 Td (5391 int n;) 56.7907 Tj 0 -427.201 Td (5392 ) 21.8426 Tj 0 -436.695 Td (5393 for\(n = 0; s[n]; n++\)) 122.318 Tj 0 -446.188 Td (5394 ;) 43.6851 Tj 0 -455.681 Td (5395 return n;) 69.8962 Tj 0 -465.175 Td (5396 }) 26.2111 Tj 0 -474.668 Td (5397 ) 21.8426 Tj 0 -484.161 Td (5398 ) 21.8426 Tj 0 -493.655 Td (5399 ) 21.8426 Tj 0 -522.135 Td (Sheet 53) 34.9481 Tj Q Q Q Q showpage %%PageTrailer pdfEndPage %%Page: 61 61 %%BeginPageSetup %%PageOrientation: Landscape pdfStartPage 180 rotate -612 -792 translate 0 0 612 792 re W %%EndPageSetup [] 0 d 1 i 0 j 0 J 10 M 1 w /DeviceGray {} cs [0] sc /DeviceGray {} CS [0] SC false op false OP 0 0 612 792 re W q q [0.1 0 0 0.1 0 0] cm q 180 3960 5760 3460 re W /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [10 0 0 10 0 0] cm [1 0 0 1 0 0] Tm 0 0 Td [0 -0.967854 1 0 564.72 738.864] Tm 0 0 Td /F9_0 8.70222 Tf (Aug 30 10:08 2007 xv6/mp.h Page 1) 152.898 Tj 0 -28.4801 Td (5400 // See MultiProcessor Specification Version 1.[14]) 240.268 Tj 0 -37.9735 Td (5401 ) 21.8426 Tj 0 -47.4668 Td (5402 struct mp { // floating pointer) 209.689 Tj 0 -56.9602 Td (5403 uchar signature[4]; // "_MP_") 200.952 Tj 0 -66.4535 Td (5404 void *physaddr; // phys addr of MP config \ table) 297.059 Tj 0 -75.9469 Td (5405 uchar length; // 1) 179.109 Tj 0 -85.4403 Td (5406 uchar specrev; // [14]) 192.215 Tj 0 -94.9336 Td (5407 uchar checksum; // all bytes must add up t\ o 0) 288.322 Tj 0 -104.427 Td (5408 uchar type; // MP system config type) 266.479 Tj 0 -113.92 Td (5409 uchar imcrp;) 83.0018 Tj 0 -123.414 Td (5410 uchar reserved[3];) 109.213 Tj 0 -132.907 Td (5411 };) 30.5796 Tj 0 -142.4 Td (5412 ) 21.8426 Tj 0 -151.894 Td (5413 struct mpconf { // configuration table header) 253.374 Tj 0 -161.387 Td (5414 uchar signature[4]; // "PCMP") 200.952 Tj 0 -170.88 Td (5415 ushort length; // total table length) 253.374 Tj 0 -180.374 Td (5416 uchar version; // [14]) 192.215 Tj 0 -189.867 Td (5417 uchar checksum; // all bytes must add up t\ o 0) 288.322 Tj 0 -199.361 Td (5418 uchar product[20]; // product id) 218.426 Tj 0 -208.854 Td (5419 uint *oemtable; // OEM table pointer) 249.005 Tj 0 -218.347 Td (5420 ushort oemlength; // OEM table length) 244.637 Tj 0 -227.841 Td (5421 ushort entry; // entry count) 222.794 Tj 0 -237.334 Td (5422 uint *lapicaddr; // address of local APIC) 266.479 Tj 0 -246.827 Td (5423 ushort xlength; // extended table length) 266.479 Tj 0 -256.321 Td (5424 uchar xchecksum; // extended table checksum) 275.216 Tj 0 -265.814 Td (5425 uchar reserved;) 96.1073 Tj 0 -275.307 Td (5426 };) 30.5796 Tj 0 -284.801 Td (5427 ) 21.8426 Tj 0 -294.294 Td (5428 struct mpproc { // processor table entry) 231.531 Tj 0 -303.788 Td (5429 uchar type; // entry type \(0\)) 235.9 Tj 0 -313.281 Td (5430 uchar apicid; // local APIC id) 231.531 Tj 0 -322.774 Td (5431 uchar version; // local APIC verison) 253.374 Tj 0 -332.268 Td (5432 uchar flags; // CPU flags) 214.057 Tj 0 -341.761 Td (5433 #define MPBOOT 0x02 // This proc is the boot\ strap processor.) 345.113 Tj 0 -351.254 Td (5434 uchar signature[4]; // CPU signature) 231.531 Tj 0 -360.748 Td (5435 uint feature; // feature flags from CPUI\ D instruction) 332.007 Tj 0 -370.241 Td (5436 uchar reserved[8];) 109.213 Tj 0 -379.734 Td (5437 };) 30.5796 Tj 0 -389.228 Td (5438 ) 21.8426 Tj 0 -398.721 Td (5439 struct mpioapic { // I/O APIC table entry) 227.163 Tj 0 -408.214 Td (5440 uchar type; // entry type \(2\)) 235.9 Tj 0 -417.708 Td (5441 uchar apicno; // I/O APIC id) 222.794 Tj 0 -427.201 Td (5442 uchar version; // I/O APIC version) 244.637 Tj 0 -436.695 Td (5443 uchar flags; // I/O APIC flags) 235.9 Tj 0 -446.188 Td (5444 uint *addr; // I/O APIC address) 240.268 Tj 0 -455.681 Td (5445 };) 30.5796 Tj 0 -465.175 Td (5446 ) 21.8426 Tj 0 -474.668 Td (5447 ) 21.8426 Tj 0 -484.161 Td (5448 ) 21.8426 Tj 0 -493.655 Td (5449 ) 21.8426 Tj 0 -522.135 Td (Sheet 54) 34.9481 Tj Q Q q 180 500 5760 3460 re W /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [10 0 0 10 0 0] cm [1 0 0 1 0 0] Tm 0 0 Td [0 -0.967854 1 0 564.72 392.864] Tm 0 0 Td /F9_0 8.70222 Tf (Aug 30 10:08 2007 xv6/mp.h Page 2) 152.898 Tj 0 -28.4801 Td (5450 // Table entry types) 109.213 Tj 0 -37.9735 Td (5451 #define MPPROC 0x00 // One per processor) 214.057 Tj 0 -47.4668 Td (5452 #define MPBUS 0x01 // One per bus) 187.846 Tj 0 -56.9602 Td (5453 #define MPIOAPIC 0x02 // One per I/O APIC) 209.689 Tj 0 -66.4535 Td (5454 #define MPIOINTR 0x03 // One per bus interrupt source) 262.111 Tj 0 -75.9469 Td (5455 #define MPLINTR 0x04 // One per system interrupt source) 275.216 Tj 0 -85.4403 Td (5456 ) 21.8426 Tj 0 -94.9336 Td (5457 ) 21.8426 Tj 0 -104.427 Td (5458 ) 21.8426 Tj 0 -113.92 Td (5459 ) 21.8426 Tj 0 -123.414 Td (5460 ) 21.8426 Tj 0 -132.907 Td (5461 ) 21.8426 Tj 0 -142.4 Td (5462 ) 21.8426 Tj 0 -151.894 Td (5463 ) 21.8426 Tj 0 -161.387 Td (5464 ) 21.8426 Tj 0 -170.88 Td (5465 ) 21.8426 Tj 0 -180.374 Td (5466 ) 21.8426 Tj 0 -189.867 Td (5467 ) 21.8426 Tj 0 -199.361 Td (5468 ) 21.8426 Tj 0 -208.854 Td (5469 ) 21.8426 Tj 0 -218.347 Td (5470 ) 21.8426 Tj 0 -227.841 Td (5471 ) 21.8426 Tj 0 -237.334 Td (5472 ) 21.8426 Tj 0 -246.827 Td (5473 ) 21.8426 Tj 0 -256.321 Td (5474 ) 21.8426 Tj 0 -265.814 Td (5475 ) 21.8426 Tj 0 -275.307 Td (5476 ) 21.8426 Tj 0 -284.801 Td (5477 ) 21.8426 Tj 0 -294.294 Td (5478 ) 21.8426 Tj 0 -303.788 Td (5479 ) 21.8426 Tj 0 -313.281 Td (5480 ) 21.8426 Tj 0 -322.774 Td (5481 ) 21.8426 Tj 0 -332.268 Td (5482 ) 21.8426 Tj 0 -341.761 Td (5483 ) 21.8426 Tj 0 -351.254 Td (5484 ) 21.8426 Tj 0 -360.748 Td (5485 ) 21.8426 Tj 0 -370.241 Td (5486 ) 21.8426 Tj 0 -379.734 Td (5487 ) 21.8426 Tj 0 -389.228 Td (5488 ) 21.8426 Tj 0 -398.721 Td (5489 ) 21.8426 Tj 0 -408.214 Td (5490 ) 21.8426 Tj 0 -417.708 Td (5491 ) 21.8426 Tj 0 -427.201 Td (5492 ) 21.8426 Tj 0 -436.695 Td (5493 ) 21.8426 Tj 0 -446.188 Td (5494 ) 21.8426 Tj 0 -455.681 Td (5495 ) 21.8426 Tj 0 -465.175 Td (5496 ) 21.8426 Tj 0 -474.668 Td (5497 ) 21.8426 Tj 0 -484.161 Td (5498 ) 21.8426 Tj 0 -493.655 Td (5499 ) 21.8426 Tj 0 -522.135 Td (Sheet 54) 34.9481 Tj Q Q Q Q showpage %%PageTrailer pdfEndPage %%Page: 62 62 %%BeginPageSetup %%PageOrientation: Landscape pdfStartPage 180 rotate -612 -792 translate 0 0 612 792 re W %%EndPageSetup [] 0 d 1 i 0 j 0 J 10 M 1 w /DeviceGray {} cs [0] sc /DeviceGray {} CS [0] SC false op false OP 0 0 612 792 re W q q [0.1 0 0 0.1 0 0] cm q 180 3960 5760 3460 re W /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [10 0 0 10 0 0] cm [1 0 0 1 0 0] Tm 0 0 Td [0 -0.967854 1 0 564.72 738.864] Tm 0 0 Td /F9_0 8.70222 Tf (Aug 30 10:08 2007 xv6/mp.c Page 1) 152.898 Tj 0 -28.4801 Td (5500 // Multiprocessor bootstrap.) 144.161 Tj 0 -37.9735 Td (5501 // Search memory for MP description structures.) 227.163 Tj 0 -47.4668 Td (5502 // http://developer.intel.com/design/pentium/datashts/2420\ 1606.pdf) 310.165 Tj 0 -56.9602 Td (5503 ) 21.8426 Tj 0 -66.4535 Td (5504 #include "types.h") 100.476 Tj 0 -75.9469 Td (5505 #include "defs.h") 96.1073 Tj 0 -85.4403 Td (5506 #include "param.h") 100.476 Tj 0 -94.9336 Td (5507 #include "mp.h") 87.3703 Tj 0 -104.427 Td (5508 #include "x86.h") 91.7388 Tj 0 -113.92 Td (5509 #include "mmu.h") 91.7388 Tj 0 -123.414 Td (5510 #include "proc.h") 96.1073 Tj 0 -132.907 Td (5511 ) 21.8426 Tj 0 -142.4 Td (5512 struct cpu cpus[NCPU];) 117.95 Tj 0 -151.894 Td (5513 static struct cpu *bcpu;) 126.687 Tj 0 -161.387 Td (5514 int ismp;) 61.1592 Tj 0 -170.88 Td (5515 int ncpu;) 61.1592 Tj 0 -180.374 Td (5516 uchar ioapic_id;) 91.7388 Tj 0 -189.867 Td (5517 ) 21.8426 Tj 0 -199.361 Td (5518 int) 34.9481 Tj 0 -208.854 Td (5519 mp_bcpu\(void\)) 78.6333 Tj 0 -218.347 Td (5520 {) 26.2111 Tj 0 -227.841 Td (5521 return bcpu-cpus;) 104.844 Tj 0 -237.334 Td (5522 }) 26.2111 Tj 0 -246.827 Td (5523 ) 21.8426 Tj 0 -256.321 Td (5524 static uchar) 74.2647 Tj 0 -265.814 Td (5525 sum\(uchar *addr, int len\)) 131.055 Tj 0 -275.307 Td (5526 {) 26.2111 Tj 0 -284.801 Td (5527 int i, sum;) 78.6333 Tj 0 -294.294 Td (5528 ) 21.8426 Tj 0 -303.788 Td (5529 sum = 0;) 65.5277 Tj 0 -313.281 Td (5530 for\(i=0; iphysaddr == 0\)) 240.268 Tj 0 -370.241 Td (5586 return 0;) 78.6333 Tj 0 -379.734 Td (5587 conf = \(struct mpconf*\)mp->physaddr;) 187.846 Tj 0 -389.228 Td (5588 if\(memcmp\(conf, "PCMP", 4\) != 0\)) 170.372 Tj 0 -398.721 Td (5589 return 0;) 78.6333 Tj 0 -408.214 Td (5590 if\(conf->version != 1 && conf->version != 4\)) 222.794 Tj 0 -417.708 Td (5591 return 0;) 78.6333 Tj 0 -427.201 Td (5592 if\(sum\(\(uchar*\)conf, conf->length\) != 0\)) 205.32 Tj 0 -436.695 Td (5593 return 0;) 78.6333 Tj 0 -446.188 Td (5594 *pmp = mp;) 74.2647 Tj 0 -455.681 Td (5595 return conf;) 83.0018 Tj 0 -465.175 Td (5596 }) 26.2111 Tj 0 -474.668 Td (5597 ) 21.8426 Tj 0 -484.161 Td (5598 ) 21.8426 Tj 0 -493.655 Td (5599 ) 21.8426 Tj 0 -522.135 Td (Sheet 55) 34.9481 Tj Q Q Q Q showpage %%PageTrailer pdfEndPage %%Page: 63 63 %%BeginPageSetup %%PageOrientation: Landscape pdfStartPage 180 rotate -612 -792 translate 0 0 612 792 re W %%EndPageSetup [] 0 d 1 i 0 j 0 J 10 M 1 w /DeviceGray {} cs [0] sc /DeviceGray {} CS [0] SC false op false OP 0 0 612 792 re W q q [0.1 0 0 0.1 0 0] cm q 180 3960 5760 3460 re W /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [10 0 0 10 0 0] cm [1 0 0 1 0 0] Tm 0 0 Td [0 -0.967854 1 0 564.72 738.864] Tm 0 0 Td /F9_0 8.70222 Tf (Aug 30 10:08 2007 xv6/mp.c Page 3) 152.898 Tj 0 -28.4801 Td (5600 void) 39.3166 Tj 0 -37.9735 Td (5601 mp_init\(void\)) 78.6333 Tj 0 -47.4668 Td (5602 {) 26.2111 Tj 0 -56.9602 Td (5603 uchar *p, *e;) 87.3703 Tj 0 -66.4535 Td (5604 struct mp *mp;) 91.7388 Tj 0 -75.9469 Td (5605 struct mpconf *conf;) 117.95 Tj 0 -85.4403 Td (5606 struct mpproc *proc;) 117.95 Tj 0 -94.9336 Td (5607 struct mpioapic *ioapic;) 135.424 Tj 0 -104.427 Td (5608 ) 21.8426 Tj 0 -113.92 Td (5609 bcpu = &cpus[ncpu];) 113.581 Tj 0 -123.414 Td (5610 if\(\(conf = mp_config\(&mp\)\) == 0\)) 170.372 Tj 0 -132.907 Td (5611 return;) 69.8962 Tj 0 -142.4 Td (5612 ) 21.8426 Tj 0 -151.894 Td (5613 ismp = 1;) 69.8962 Tj 0 -161.387 Td (5614 lapic = \(uint*\)conf->lapicaddr;) 166.004 Tj 0 -170.88 Td (5615 ) 21.8426 Tj 0 -180.374 Td (5616 for\(p=\(uchar*\)\(conf+1\), e=\(uchar*\)conf+conf->leng\ th; papicid;) 192.215 Tj 0 -227.841 Td (5621 if\(proc->flags & MPBOOT\)) 152.898 Tj 0 -237.334 Td (5622 bcpu = &cpus[ncpu];) 139.792 Tj 0 -246.827 Td (5623 ncpu++;) 78.6333 Tj 0 -256.321 Td (5624 p += sizeof\(struct mpproc\);) 166.004 Tj 0 -265.814 Td (5625 continue;) 87.3703 Tj 0 -275.307 Td (5626 case MPIOAPIC:) 100.476 Tj 0 -284.801 Td (5627 ioapic = \(struct mpioapic*\)p;) 174.741 Tj 0 -294.294 Td (5628 ioapic_id = ioapic->apicno;) 166.004 Tj 0 -303.788 Td (5629 p += sizeof\(struct mpioapic\);) 174.741 Tj 0 -313.281 Td (5630 continue;) 87.3703 Tj 0 -322.774 Td (5631 case MPBUS:) 87.3703 Tj 0 -332.268 Td (5632 case MPIOINTR:) 100.476 Tj 0 -341.761 Td (5633 case MPLINTR:) 96.1073 Tj 0 -351.254 Td (5634 p += 8;) 78.6333 Tj 0 -360.748 Td (5635 continue;) 87.3703 Tj 0 -370.241 Td (5636 default:) 74.2647 Tj 0 -379.734 Td (5637 cprintf\("mp_init: unknown config type %x\\n", *p\);) 262.111 Tj 0 -389.228 Td (5638 panic\("mp_init"\);) 122.318 Tj 0 -398.721 Td (5639 }) 43.6851 Tj 0 -408.214 Td (5640 }) 34.9481 Tj 0 -417.708 Td (5641 ) 21.8426 Tj 0 -427.201 Td (5642 if\(mp->imcrp\){) 91.7388 Tj 0 -436.695 Td (5643 // Bochs doesn't support IMCR, so this doesn't run on \ Bochs.) 301.427 Tj 0 -446.188 Td (5644 // But it would on real hardware.) 183.478 Tj 0 -455.681 Td (5645 outb\(0x22, 0x70\); // Select IMCR) 187.846 Tj 0 -465.175 Td (5646 outb\(0x23, inb\(0x23\) | 1\); // Mask external inter\ rupts.) 283.953 Tj 0 -474.668 Td (5647 }) 34.9481 Tj 0 -484.161 Td (5648 }) 26.2111 Tj 0 -493.655 Td (5649 ) 21.8426 Tj 0 -522.135 Td (Sheet 56) 34.9481 Tj Q Q q 180 500 5760 3460 re W /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [10 0 0 10 0 0] cm [1 0 0 1 0 0] Tm 0 0 Td [0 -0.967854 1 0 564.72 392.864] Tm 0 0 Td /F9_0 8.70222 Tf (Aug 30 10:08 2007 xv6/lapic.c Page 1) 166.004 Tj 0 -28.4801 Td (5650 // The local APIC manages internal \(non-I/O\) interrupts.) 266.479 Tj 0 -37.9735 Td (5651 // See Chapter 8 & Appendix C of Intel processor manual vo\ lume 3.) 305.796 Tj 0 -47.4668 Td (5652 ) 21.8426 Tj 0 -56.9602 Td (5653 #include "types.h") 100.476 Tj 0 -66.4535 Td (5654 #include "traps.h") 100.476 Tj 0 -75.9469 Td (5655 ) 21.8426 Tj 0 -85.4403 Td (5656 // Local APIC registers, divided by 4 for use as uint[] in\ dices.) 301.427 Tj 0 -94.9336 Td (5657 #define ID \(0x0020/4\) // ID) 170.372 Tj 0 -104.427 Td (5658 #define VER \(0x0030/4\) // Version) 192.215 Tj 0 -113.92 Td (5659 #define TPR \(0x0080/4\) // Task Priority) 218.426 Tj 0 -123.414 Td (5660 #define EOI \(0x00B0/4\) // EOI) 174.741 Tj 0 -132.907 Td (5661 #define SVR \(0x00F0/4\) // Spurious Interrupt Vecto\ r) 270.848 Tj 0 -142.4 Td (5662 #define ENABLE 0x00000100 // Unit Enable) 231.531 Tj 0 -151.894 Td (5663 #define ESR \(0x0280/4\) // Error Status) 214.057 Tj 0 -161.387 Td (5664 #define ICRLO \(0x0300/4\) // Interrupt Command) 235.9 Tj 0 -170.88 Td (5665 #define INIT 0x00000500 // INIT/RESET) 227.163 Tj 0 -180.374 Td (5666 #define STARTUP 0x00000600 // Startup IPI) 231.531 Tj 0 -189.867 Td (5667 #define DELIVS 0x00001000 // Delivery status) 249.005 Tj 0 -199.361 Td (5668 #define ASSERT 0x00004000 // Assert interrupt \(vs\ deassert\)) 314.533 Tj 0 -208.854 Td (5669 #define LEVEL 0x00008000 // Level triggered) 249.005 Tj 0 -218.347 Td (5670 #define BCAST 0x00080000 // Send to all APICs, in\ cluding self.) 332.007 Tj 0 -227.841 Td (5671 #define ICRHI \(0x0310/4\) // Interrupt Command [63:32\ ]) 270.848 Tj 0 -237.334 Td (5672 #define TIMER \(0x0320/4\) // Local Vector Table 0 \(T\ IMER\)) 283.953 Tj 0 -246.827 Td (5673 #define X1 0x0000000B // divide counts by 1) 262.111 Tj 0 -256.321 Td (5674 #define PERIODIC 0x00020000 // Periodic) 218.426 Tj 0 -265.814 Td (5675 #define PCINT \(0x0340/4\) // Performance Counter LVT) 262.111 Tj 0 -275.307 Td (5676 #define LINT0 \(0x0350/4\) // Local Vector Table 1 \(L\ INT0\)) 283.953 Tj 0 -284.801 Td (5677 #define LINT1 \(0x0360/4\) // Local Vector Table 2 \(L\ INT1\)) 283.953 Tj 0 -294.294 Td (5678 #define ERROR \(0x0370/4\) // Local Vector Table 3 \(E\ RROR\)) 283.953 Tj 0 -303.788 Td (5679 #define MASKED 0x00010000 // Interrupt masked) 253.374 Tj 0 -313.281 Td (5680 #define TICR \(0x0380/4\) // Timer Initial Count) 244.637 Tj 0 -322.774 Td (5681 #define TCCR \(0x0390/4\) // Timer Current Count) 244.637 Tj 0 -332.268 Td (5682 #define TDCR \(0x03E0/4\) // Timer Divide Configurati\ on) 275.216 Tj 0 -341.761 Td (5683 ) 21.8426 Tj 0 -351.254 Td (5684 volatile uint *lapic; // Initialized in mp.c) 218.426 Tj 0 -360.748 Td (5685 ) 21.8426 Tj 0 -370.241 Td (5686 ) 21.8426 Tj 0 -379.734 Td (5687 ) 21.8426 Tj 0 -389.228 Td (5688 ) 21.8426 Tj 0 -398.721 Td (5689 ) 21.8426 Tj 0 -408.214 Td (5690 ) 21.8426 Tj 0 -417.708 Td (5691 ) 21.8426 Tj 0 -427.201 Td (5692 ) 21.8426 Tj 0 -436.695 Td (5693 ) 21.8426 Tj 0 -446.188 Td (5694 ) 21.8426 Tj 0 -455.681 Td (5695 ) 21.8426 Tj 0 -465.175 Td (5696 ) 21.8426 Tj 0 -474.668 Td (5697 ) 21.8426 Tj 0 -484.161 Td (5698 ) 21.8426 Tj 0 -493.655 Td (5699 ) 21.8426 Tj 0 -522.135 Td (Sheet 56) 34.9481 Tj Q Q Q Q showpage %%PageTrailer pdfEndPage %%Page: 64 64 %%BeginPageSetup %%PageOrientation: Landscape pdfStartPage 180 rotate -612 -792 translate 0 0 612 792 re W %%EndPageSetup [] 0 d 1 i 0 j 0 J 10 M 1 w /DeviceGray {} cs [0] sc /DeviceGray {} CS [0] SC false op false OP 0 0 612 792 re W q q [0.1 0 0 0.1 0 0] cm q 180 3960 5760 3460 re W /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [10 0 0 10 0 0] cm [1 0 0 1 0 0] Tm 0 0 Td [0 -0.967854 1 0 564.72 738.864] Tm 0 0 Td /F9_0 8.70222 Tf (Aug 30 10:08 2007 xv6/lapic.c Page 2) 166.004 Tj 0 -28.4801 Td (5700 void) 39.3166 Tj 0 -37.9735 Td (5701 lapic_init\(int c\)) 96.1073 Tj 0 -47.4668 Td (5702 {) 26.2111 Tj 0 -56.9602 Td (5703 if\(!lapic\)) 74.2647 Tj 0 -66.4535 Td (5704 return;) 69.8962 Tj 0 -75.9469 Td (5705 ) 21.8426 Tj 0 -85.4403 Td (5706 // Enable local APIC; set spurious interrupt vector.) 257.742 Tj 0 -94.9336 Td (5707 lapic[SVR] = ENABLE | \(IRQ_OFFSET+IRQ_SPURIOUS\);) 240.268 Tj 0 -104.427 Td (5708 ) 21.8426 Tj 0 -113.92 Td (5709 // The timer repeatedly counts down at bus frequency) 257.742 Tj 0 -123.414 Td (5710 // from lapic[TICR] and then issues an interrupt.) 244.637 Tj 0 -132.907 Td (5711 // Lapic[TCCR] is the current counter value.) 222.794 Tj 0 -142.4 Td (5712 // If xv6 cared more about precise timekeeping, the) 253.374 Tj 0 -151.894 Td (5713 // values of TICR and TCCR would be calibrated using) 257.742 Tj 0 -161.387 Td (5714 // an external time source.) 148.529 Tj 0 -170.88 Td (5715 lapic[TDCR] = X1;) 104.844 Tj 0 -180.374 Td (5716 lapic[TICR] = 10000000;) 131.055 Tj 0 -189.867 Td (5717 lapic[TCCR] = 10000000;) 131.055 Tj 0 -199.361 Td (5718 lapic[TIMER] = PERIODIC | \(IRQ_OFFSET + IRQ_TIMER\);) 253.374 Tj 0 -208.854 Td (5719 ) 21.8426 Tj 0 -218.347 Td (5720 // Disable logical interrupt lines.) 183.478 Tj 0 -227.841 Td (5721 lapic[LINT0] = MASKED;) 126.687 Tj 0 -237.334 Td (5722 lapic[LINT1] = MASKED;) 126.687 Tj 0 -246.827 Td (5723 ) 21.8426 Tj 0 -256.321 Td (5724 // Disable performance counter overflow interrupts) 249.005 Tj 0 -265.814 Td (5725 // on machines that provide that interrupt entry.) 244.637 Tj 0 -275.307 Td (5726 if\(\(\(lapic[VER]>>16\) & 0xFF\) >= 4\)) 179.109 Tj 0 -284.801 Td (5727 lapic[PCINT] = MASKED;) 135.424 Tj 0 -294.294 Td (5728 ) 21.8426 Tj 0 -303.788 Td (5729 // Map error interrupt to IRQ_ERROR.) 187.846 Tj 0 -313.281 Td (5730 lapic[ERROR] = IRQ_OFFSET+IRQ_ERROR;) 187.846 Tj 0 -322.774 Td (5731 ) 21.8426 Tj 0 -332.268 Td (5732 // Clear error status register \(requires back-to-back w\ rites\).) 301.427 Tj 0 -341.761 Td (5733 lapic[ESR] = 0;) 96.1073 Tj 0 -351.254 Td (5734 lapic[ESR] = 0;) 96.1073 Tj 0 -360.748 Td (5735 ) 21.8426 Tj 0 -370.241 Td (5736 // Ack any outstanding interrupts.) 179.109 Tj 0 -379.734 Td (5737 lapic[EOI] = 0;) 96.1073 Tj 0 -389.228 Td (5738 ) 21.8426 Tj 0 -398.721 Td (5739 // Send an Init Level De-Assert to synchronise arbitrati\ on ID's.) 310.165 Tj 0 -408.214 Td (5740 lapic[ICRHI] = 0;) 104.844 Tj 0 -417.708 Td (5741 lapic[ICRLO] = BCAST | INIT | LEVEL;) 187.846 Tj 0 -427.201 Td (5742 while\(lapic[ICRLO] & DELIVS\)) 152.898 Tj 0 -436.695 Td (5743 ;) 43.6851 Tj 0 -446.188 Td (5744 ) 21.8426 Tj 0 -455.681 Td (5745 // Enable interrupts on the APIC \(but not on the proces\ sor\).) 292.69 Tj 0 -465.175 Td (5746 lapic[TPR] = 0;) 96.1073 Tj 0 -474.668 Td (5747 }) 26.2111 Tj 0 -484.161 Td (5748 ) 21.8426 Tj 0 -493.655 Td (5749 ) 21.8426 Tj 0 -522.135 Td (Sheet 57) 34.9481 Tj Q Q q 180 500 5760 3460 re W /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [10 0 0 10 0 0] cm [1 0 0 1 0 0] Tm 0 0 Td [0 -0.967854 1 0 564.72 392.864] Tm 0 0 Td /F9_0 8.70222 Tf (Aug 30 10:08 2007 xv6/lapic.c Page 3) 166.004 Tj 0 -28.4801 Td (5750 int) 34.9481 Tj 0 -37.9735 Td (5751 cpu\(void\)) 61.1592 Tj 0 -47.4668 Td (5752 {) 26.2111 Tj 0 -56.9602 Td (5753 if\(lapic\)) 69.8962 Tj 0 -66.4535 Td (5754 return lapic[ID]>>24;) 131.055 Tj 0 -75.9469 Td (5755 return 0;) 69.8962 Tj 0 -85.4403 Td (5756 }) 26.2111 Tj 0 -94.9336 Td (5757 ) 21.8426 Tj 0 -104.427 Td (5758 // Acknowledge interrupt.) 131.055 Tj 0 -113.92 Td (5759 void) 39.3166 Tj 0 -123.414 Td (5760 lapic_eoi\(void\)) 87.3703 Tj 0 -132.907 Td (5761 {) 26.2111 Tj 0 -142.4 Td (5762 if\(lapic\)) 69.8962 Tj 0 -151.894 Td (5763 lapic[EOI] = 0;) 104.844 Tj 0 -161.387 Td (5764 }) 26.2111 Tj 0 -170.88 Td (5765 ) 21.8426 Tj 0 -180.374 Td (5766 // Spin for a given number of microseconds.) 209.689 Tj 0 -189.867 Td (5767 // On real hardware would want to tune this dynamically.) 266.479 Tj 0 -199.361 Td (5768 static void) 69.8962 Tj 0 -208.854 Td (5769 microdelay\(int us\)) 100.476 Tj 0 -218.347 Td (5770 {) 26.2111 Tj 0 -227.841 Td (5771 volatile int j = 0;) 113.581 Tj 0 -237.334 Td (5772 ) 21.8426 Tj 0 -246.827 Td (5773 while\(us-- > 0\)) 96.1073 Tj 0 -256.321 Td (5774 for\(j=0; j<10000; j++\);) 139.792 Tj 0 -265.814 Td (5775 }) 26.2111 Tj 0 -275.307 Td (5776 ) 21.8426 Tj 0 -284.801 Td (5777 // Start additional processor running bootstrap code at ad\ dr.) 288.322 Tj 0 -294.294 Td (5778 // See Appendix B of MultiProcessor Specification.) 240.268 Tj 0 -303.788 Td (5779 void) 39.3166 Tj 0 -313.281 Td (5780 lapic_startap\(uchar apicid, uint addr\)) 187.846 Tj 0 -322.774 Td (5781 {) 26.2111 Tj 0 -332.268 Td (5782 int i;) 56.7907 Tj 0 -341.761 Td (5783 volatile int j = 0;) 113.581 Tj 0 -351.254 Td (5784 ) 21.8426 Tj 0 -360.748 Td (5785 // Send INIT interrupt to reset other CPU.) 214.057 Tj 0 -370.241 Td (5786 lapic[ICRHI] = apicid<<24;) 144.161 Tj 0 -379.734 Td (5787 lapic[ICRLO] = INIT | LEVEL;) 152.898 Tj 0 -389.228 Td (5788 microdelay\(10\);) 96.1073 Tj 0 -398.721 Td (5789 ) 21.8426 Tj 0 -408.214 Td (5790 // Send startup IPI \(twice!\) to enter bootstrap code.) 262.111 Tj 0 -417.708 Td (5791 for\(i = 0; i < 2; i++\){) 131.055 Tj 0 -427.201 Td (5792 lapic[ICRHI] = apicid<<24;) 152.898 Tj 0 -436.695 Td (5793 lapic[ICRLO] = STARTUP | \(addr>>12\);) 196.583 Tj 0 -446.188 Td (5794 for\(j=0; j<10000; j++\); // 200us) 183.478 Tj 0 -455.681 Td (5795 }) 34.9481 Tj 0 -465.175 Td (5796 }) 26.2111 Tj 0 -474.668 Td (5797 ) 21.8426 Tj 0 -484.161 Td (5798 ) 21.8426 Tj 0 -493.655 Td (5799 ) 21.8426 Tj 0 -522.135 Td (Sheet 57) 34.9481 Tj Q Q Q Q showpage %%PageTrailer pdfEndPage %%Page: 65 65 %%BeginPageSetup %%PageOrientation: Landscape pdfStartPage 180 rotate -612 -792 translate 0 0 612 792 re W %%EndPageSetup [] 0 d 1 i 0 j 0 J 10 M 1 w /DeviceGray {} cs [0] sc /DeviceGray {} CS [0] SC false op false OP 0 0 612 792 re W q q [0.1 0 0 0.1 0 0] cm q 180 3960 5760 3460 re W /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [10 0 0 10 0 0] cm [1 0 0 1 0 0] Tm 0 0 Td [0 -0.967854 1 0 564.72 738.864] Tm 0 0 Td /F9_0 8.70222 Tf (Aug 30 10:08 2007 xv6/ioapic.c Page 1) 170.372 Tj 0 -28.4801 Td (5800 // The I/O APIC manages hardware interrupts for an SMP sys\ tem.) 292.69 Tj 0 -37.9735 Td (5801 // http://www.intel.com/design/chipsets/datashts/29056601.\ pdf) 288.322 Tj 0 -47.4668 Td (5802 // See also picirq.c.) 113.581 Tj 0 -56.9602 Td (5803 ) 21.8426 Tj 0 -66.4535 Td (5804 #include "types.h") 100.476 Tj 0 -75.9469 Td (5805 #include "defs.h") 96.1073 Tj 0 -85.4403 Td (5806 #include "traps.h") 100.476 Tj 0 -94.9336 Td (5807 ) 21.8426 Tj 0 -104.427 Td (5808 #define IOAPIC 0xFEC00000 // Default physical address o\ f IO APIC) 314.533 Tj 0 -113.92 Td (5809 ) 21.8426 Tj 0 -123.414 Td (5810 #define REG_ID 0x00 // Register index: ID) 222.794 Tj 0 -132.907 Td (5811 #define REG_VER 0x01 // Register index: version) 244.637 Tj 0 -142.4 Td (5812 #define REG_TABLE 0x10 // Redirection table base) 240.268 Tj 0 -151.894 Td (5813 ) 21.8426 Tj 0 -161.387 Td (5814 // The redirection table starts at REG_TABLE and uses) 253.374 Tj 0 -170.88 Td (5815 // two registers to configure each interrupt.) 218.426 Tj 0 -180.374 Td (5816 // The first \(low\) register in a pair contains configura\ tion bits.) 310.165 Tj 0 -189.867 Td (5817 // The second \(high\) register contains a bitmask telling\ which) 292.69 Tj 0 -199.361 Td (5818 // CPUs can serve that interrupt.) 166.004 Tj 0 -208.854 Td (5819 #define INT_DISABLED 0x00100000 // Interrupt disabled) 266.479 Tj 0 -218.347 Td (5820 #define INT_LEVEL 0x00008000 // Level-triggered \(vs\ edge-\)) 301.427 Tj 0 -227.841 Td (5821 #define INT_ACTIVELOW 0x00002000 // Active low \(vs high\ \)) 275.216 Tj 0 -237.334 Td (5822 #define INT_LOGICAL 0x00000800 // Destination is CPU i\ d \(vs APIC ID\)) 336.376 Tj 0 -246.827 Td (5823 ) 21.8426 Tj 0 -256.321 Td (5824 volatile struct ioapic *ioapic;) 157.267 Tj 0 -265.814 Td (5825 ) 21.8426 Tj 0 -275.307 Td (5826 // IO APIC MMIO structure: write reg, then read or write d\ ata.) 292.69 Tj 0 -284.801 Td (5827 struct ioapic {) 87.3703 Tj 0 -294.294 Td (5828 uint reg;) 69.8962 Tj 0 -303.788 Td (5829 uint pad[3];) 83.0018 Tj 0 -313.281 Td (5830 uint data;) 74.2647 Tj 0 -322.774 Td (5831 };) 30.5796 Tj 0 -332.268 Td (5832 ) 21.8426 Tj 0 -341.761 Td (5833 static uint) 69.8962 Tj 0 -351.254 Td (5834 ioapic_read\(int reg\)) 109.213 Tj 0 -360.748 Td (5835 {) 26.2111 Tj 0 -370.241 Td (5836 ioapic->reg = reg;) 109.213 Tj 0 -379.734 Td (5837 return ioapic->data;) 117.95 Tj 0 -389.228 Td (5838 }) 26.2111 Tj 0 -398.721 Td (5839 ) 21.8426 Tj 0 -408.214 Td (5840 static void) 69.8962 Tj 0 -417.708 Td (5841 ioapic_write\(int reg, uint data\)) 161.635 Tj 0 -427.201 Td (5842 {) 26.2111 Tj 0 -436.695 Td (5843 ioapic->reg = reg;) 109.213 Tj 0 -446.188 Td (5844 ioapic->data = data;) 117.95 Tj 0 -455.681 Td (5845 }) 26.2111 Tj 0 -465.175 Td (5846 ) 21.8426 Tj 0 -474.668 Td (5847 ) 21.8426 Tj 0 -484.161 Td (5848 ) 21.8426 Tj 0 -493.655 Td (5849 ) 21.8426 Tj 0 -522.135 Td (Sheet 58) 34.9481 Tj Q Q q 180 500 5760 3460 re W /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [10 0 0 10 0 0] cm [1 0 0 1 0 0] Tm 0 0 Td [0 -0.967854 1 0 564.72 392.864] Tm 0 0 Td /F9_0 8.70222 Tf (Aug 30 10:08 2007 xv6/ioapic.c Page 2) 170.372 Tj 0 -28.4801 Td (5850 void) 39.3166 Tj 0 -37.9735 Td (5851 ioapic_init\(void\)) 96.1073 Tj 0 -47.4668 Td (5852 {) 26.2111 Tj 0 -56.9602 Td (5853 int i, id, maxintr;) 113.581 Tj 0 -66.4535 Td (5854 ) 21.8426 Tj 0 -75.9469 Td (5855 if\(!ismp\)) 69.8962 Tj 0 -85.4403 Td (5856 return;) 69.8962 Tj 0 -94.9336 Td (5857 ) 21.8426 Tj 0 -104.427 Td (5858 ioapic = \(volatile struct ioapic*\)IOAPIC;) 209.689 Tj 0 -113.92 Td (5859 maxintr = \(ioapic_read\(REG_VER\) >> 16\) & 0xFF;) 231.531 Tj 0 -123.414 Td (5860 id = ioapic_read\(REG_ID\) >> 24;) 166.004 Tj 0 -132.907 Td (5861 if\(id != ioapic_id\)) 113.581 Tj 0 -142.4 Td (5862 cprintf\("ioapic_init: id isn't equal to ioapic_id; no\ t a MP\\n"\);) 318.902 Tj 0 -151.894 Td (5863 ) 21.8426 Tj 0 -161.387 Td (5864 // Mark all interrupts edge-triggered, active high, disa\ bled,) 297.059 Tj 0 -170.88 Td (5865 // and not routed to any CPUs.) 161.635 Tj 0 -180.374 Td (5866 for\(i = 0; i <= maxintr; i++\){) 161.635 Tj 0 -189.867 Td (5867 ioapic_write\(REG_TABLE+2*i, INT_DISABLED | \(IRQ_OFFS\ ET + i\)\);) 305.796 Tj 0 -199.361 Td (5868 ioapic_write\(REG_TABLE+2*i+1, 0\);) 183.478 Tj 0 -208.854 Td (5869 }) 34.9481 Tj 0 -218.347 Td (5870 }) 26.2111 Tj 0 -227.841 Td (5871 ) 21.8426 Tj 0 -237.334 Td (5872 void) 39.3166 Tj 0 -246.827 Td (5873 ioapic_enable\(int irq, int cpunum\)) 170.372 Tj 0 -256.321 Td (5874 {) 26.2111 Tj 0 -265.814 Td (5875 if\(!ismp\)) 69.8962 Tj 0 -275.307 Td (5876 return;) 69.8962 Tj 0 -284.801 Td (5877 ) 21.8426 Tj 0 -294.294 Td (5878 // Mark interrupt edge-triggered, active high,) 231.531 Tj 0 -303.788 Td (5879 // enabled, and routed to the given cpunum,) 218.426 Tj 0 -313.281 Td (5880 // which happens to be that cpu's APIC ID.) 214.057 Tj 0 -322.774 Td (5881 ioapic_write\(REG_TABLE+2*irq, IRQ_OFFSET + irq\);) 240.268 Tj 0 -332.268 Td (5882 ioapic_write\(REG_TABLE+2*irq+1, cpunum << 24\);) 231.531 Tj 0 -341.761 Td (5883 }) 26.2111 Tj 0 -351.254 Td (5884 ) 21.8426 Tj 0 -360.748 Td (5885 ) 21.8426 Tj 0 -370.241 Td (5886 ) 21.8426 Tj 0 -379.734 Td (5887 ) 21.8426 Tj 0 -389.228 Td (5888 ) 21.8426 Tj 0 -398.721 Td (5889 ) 21.8426 Tj 0 -408.214 Td (5890 ) 21.8426 Tj 0 -417.708 Td (5891 ) 21.8426 Tj 0 -427.201 Td (5892 ) 21.8426 Tj 0 -436.695 Td (5893 ) 21.8426 Tj 0 -446.188 Td (5894 ) 21.8426 Tj 0 -455.681 Td (5895 ) 21.8426 Tj 0 -465.175 Td (5896 ) 21.8426 Tj 0 -474.668 Td (5897 ) 21.8426 Tj 0 -484.161 Td (5898 ) 21.8426 Tj 0 -493.655 Td (5899 ) 21.8426 Tj 0 -522.135 Td (Sheet 58) 34.9481 Tj Q Q Q Q showpage %%PageTrailer pdfEndPage %%Page: 66 66 %%BeginPageSetup %%PageOrientation: Landscape pdfStartPage 180 rotate -612 -792 translate 0 0 612 792 re W %%EndPageSetup [] 0 d 1 i 0 j 0 J 10 M 1 w /DeviceGray {} cs [0] sc /DeviceGray {} CS [0] SC false op false OP 0 0 612 792 re W q q [0.1 0 0 0.1 0 0] cm q 180 3960 5760 3460 re W /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [10 0 0 10 0 0] cm [1 0 0 1 0 0] Tm 0 0 Td [0 -0.967854 1 0 564.72 738.864] Tm 0 0 Td /F9_0 8.70222 Tf (Aug 30 10:08 2007 xv6/picirq.c Page 1) 170.372 Tj 0 -28.4801 Td (5900 // Intel 8259A programmable interrupt controllers.) 240.268 Tj 0 -37.9735 Td (5901 ) 21.8426 Tj 0 -47.4668 Td (5902 #include "types.h") 100.476 Tj 0 -56.9602 Td (5903 #include "x86.h") 91.7388 Tj 0 -66.4535 Td (5904 #include "traps.h") 100.476 Tj 0 -75.9469 Td (5905 ) 21.8426 Tj 0 -85.4403 Td (5906 // I/O Addresses of the two programmable interrupt control\ lers) 292.69 Tj 0 -94.9336 Td (5907 #define IO_PIC1 0x20 // Master \(IRQs 0-7\)) 249.005 Tj 0 -104.427 Td (5908 #define IO_PIC2 0xA0 // Slave \(IRQs 8-15\)) 249.005 Tj 0 -113.92 Td (5909 ) 21.8426 Tj 0 -123.414 Td (5910 #define IRQ_SLAVE 2 // IRQ at which slave conn\ ects to master) 336.376 Tj 0 -132.907 Td (5911 ) 21.8426 Tj 0 -142.4 Td (5912 // Current IRQ mask.) 109.213 Tj 0 -151.894 Td (5913 // Initial IRQ mask has interrupt 2 enabled \(for slave 82\ 59A\).) 292.69 Tj 0 -161.387 Td (5914 static ushort irqmask = 0xFFFF & ~\(1<> 8\);) 148.529 Tj 0 -237.334 Td (5922 }) 26.2111 Tj 0 -246.827 Td (5923 ) 21.8426 Tj 0 -256.321 Td (5924 void) 39.3166 Tj 0 -265.814 Td (5925 pic_enable\(int irq\)) 104.844 Tj 0 -275.307 Td (5926 {) 26.2111 Tj 0 -284.801 Td (5927 pic_setmask\(irqmask & ~\(1<', '?', NO, '*', // 0x30) 270.848 Tj 0 -322.774 Td (6081 NO, ' ', NO, NO, NO, NO, NO, NO,) 227.163 Tj 0 -332.268 Td (6082 NO, NO, NO, NO, NO, NO, NO, '7', // 0x40) 270.848 Tj 0 -341.761 Td (6083 '8', '9', '-', '4', '5', '6', '+', '1',) 231.531 Tj 0 -351.254 Td (6084 '2', '3', '0', '.', NO, NO, NO, NO, // 0x50) 270.848 Tj 0 -360.748 Td (6085 [0x9C] '\\n', // KP_Enter) 157.267 Tj 0 -370.241 Td (6086 [0xB5] '/', // KP_Div) 148.529 Tj 0 -379.734 Td (6087 [0xC8] KEY_UP, [0xD0] KEY_DN,) 170.372 Tj 0 -389.228 Td (6088 [0xC9] KEY_PGUP, [0xD1] KEY_PGDN,) 179.109 Tj 0 -398.721 Td (6089 [0xCB] KEY_LF, [0xCD] KEY_RT,) 170.372 Tj 0 -408.214 Td (6090 [0x97] KEY_HOME, [0xCF] KEY_END,) 174.741 Tj 0 -417.708 Td (6091 [0xD2] KEY_INS, [0xD3] KEY_DEL) 170.372 Tj 0 -427.201 Td (6092 };) 30.5796 Tj 0 -436.695 Td (6093 ) 21.8426 Tj 0 -446.188 Td (6094 ) 21.8426 Tj 0 -455.681 Td (6095 ) 21.8426 Tj 0 -465.175 Td (6096 ) 21.8426 Tj 0 -474.668 Td (6097 ) 21.8426 Tj 0 -484.161 Td (6098 ) 21.8426 Tj 0 -493.655 Td (6099 ) 21.8426 Tj 0 -522.135 Td (Sheet 60) 34.9481 Tj Q Q Q Q showpage %%PageTrailer pdfEndPage %%Page: 68 68 %%BeginPageSetup %%PageOrientation: Landscape pdfStartPage 180 rotate -612 -792 translate 0 0 612 792 re W %%EndPageSetup [] 0 d 1 i 0 j 0 J 10 M 1 w /DeviceGray {} cs [0] sc /DeviceGray {} CS [0] SC false op false OP 0 0 612 792 re W q q [0.1 0 0 0.1 0 0] cm q 180 3960 5760 3460 re W /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [10 0 0 10 0 0] cm [1 0 0 1 0 0] Tm 0 0 Td [0 -0.967854 1 0 564.72 738.864] Tm 0 0 Td /F9_0 8.70222 Tf (Aug 30 10:08 2007 xv6/kbd.h Page 3) 157.267 Tj 0 -28.4801 Td (6100 static uchar ctlmap[256] =) 135.424 Tj 0 -37.9735 Td (6101 {) 26.2111 Tj 0 -47.4668 Td (6102 NO, NO, NO, NO, NO, NO, NO\ , NO,) 318.902 Tj 0 -56.9602 Td (6103 NO, NO, NO, NO, NO, NO, NO\ , NO,) 318.902 Tj 0 -66.4535 Td (6104 C\('Q'\), C\('W'\), C\('E'\), C\('R'\), C\('T'\), C\ \('Y'\), C\('U'\), C\('I'\),) 336.376 Tj 0 -75.9469 Td (6105 C\('O'\), C\('P'\), NO, NO, '\\r', NO, \ C\('A'\), C\('S'\),) 336.376 Tj 0 -85.4403 Td (6106 C\('D'\), C\('F'\), C\('G'\), C\('H'\), C\('J'\), C\ \('K'\), C\('L'\), NO,) 318.902 Tj 0 -94.9336 Td (6107 NO, NO, NO, C\('\\\\'\), C\('Z'\), C\('X\ '\), C\('C'\), C\('V'\),) 336.376 Tj 0 -104.427 Td (6108 C\('B'\), C\('N'\), C\('M'\), NO, NO, C\('/\ '\), NO, NO,) 318.902 Tj 0 -113.92 Td (6109 [0x9C] '\\r', // KP_Enter) 157.267 Tj 0 -123.414 Td (6110 [0xB5] C\('/'\), // KP_Div) 148.529 Tj 0 -132.907 Td (6111 [0xC8] KEY_UP, [0xD0] KEY_DN,) 170.372 Tj 0 -142.4 Td (6112 [0xC9] KEY_PGUP, [0xD1] KEY_PGDN,) 179.109 Tj 0 -151.894 Td (6113 [0xCB] KEY_LF, [0xCD] KEY_RT,) 170.372 Tj 0 -161.387 Td (6114 [0x97] KEY_HOME, [0xCF] KEY_END,) 174.741 Tj 0 -170.88 Td (6115 [0xD2] KEY_INS, [0xD3] KEY_DEL) 170.372 Tj 0 -180.374 Td (6116 };) 30.5796 Tj 0 -189.867 Td (6117 ) 21.8426 Tj 0 -199.361 Td (6118 ) 21.8426 Tj 0 -208.854 Td (6119 ) 21.8426 Tj 0 -218.347 Td (6120 ) 21.8426 Tj 0 -227.841 Td (6121 ) 21.8426 Tj 0 -237.334 Td (6122 ) 21.8426 Tj 0 -246.827 Td (6123 ) 21.8426 Tj 0 -256.321 Td (6124 ) 21.8426 Tj 0 -265.814 Td (6125 ) 21.8426 Tj 0 -275.307 Td (6126 ) 21.8426 Tj 0 -284.801 Td (6127 ) 21.8426 Tj 0 -294.294 Td (6128 ) 21.8426 Tj 0 -303.788 Td (6129 ) 21.8426 Tj 0 -313.281 Td (6130 ) 21.8426 Tj 0 -322.774 Td (6131 ) 21.8426 Tj 0 -332.268 Td (6132 ) 21.8426 Tj 0 -341.761 Td (6133 ) 21.8426 Tj 0 -351.254 Td (6134 ) 21.8426 Tj 0 -360.748 Td (6135 ) 21.8426 Tj 0 -370.241 Td (6136 ) 21.8426 Tj 0 -379.734 Td (6137 ) 21.8426 Tj 0 -389.228 Td (6138 ) 21.8426 Tj 0 -398.721 Td (6139 ) 21.8426 Tj 0 -408.214 Td (6140 ) 21.8426 Tj 0 -417.708 Td (6141 ) 21.8426 Tj 0 -427.201 Td (6142 ) 21.8426 Tj 0 -436.695 Td (6143 ) 21.8426 Tj 0 -446.188 Td (6144 ) 21.8426 Tj 0 -455.681 Td (6145 ) 21.8426 Tj 0 -465.175 Td (6146 ) 21.8426 Tj 0 -474.668 Td (6147 ) 21.8426 Tj 0 -484.161 Td (6148 ) 21.8426 Tj 0 -493.655 Td (6149 ) 21.8426 Tj 0 -522.135 Td (Sheet 61) 34.9481 Tj Q Q q 180 500 5760 3460 re W /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [10 0 0 10 0 0] cm [1 0 0 1 0 0] Tm 0 0 Td [0 -0.967854 1 0 564.72 392.864] Tm 0 0 Td /F9_0 8.70222 Tf (Aug 30 10:08 2007 xv6/kbd.c Page 1) 157.267 Tj 0 -28.4801 Td (6150 #include "types.h") 100.476 Tj 0 -37.9735 Td (6151 #include "x86.h") 91.7388 Tj 0 -47.4668 Td (6152 #include "defs.h") 96.1073 Tj 0 -56.9602 Td (6153 #include "kbd.h") 91.7388 Tj 0 -66.4535 Td (6154 ) 21.8426 Tj 0 -75.9469 Td (6155 int) 34.9481 Tj 0 -85.4403 Td (6156 kbd_getc\(void\)) 83.0018 Tj 0 -94.9336 Td (6157 {) 26.2111 Tj 0 -104.427 Td (6158 static uint shift;) 109.213 Tj 0 -113.92 Td (6159 static uchar *charcode[4] = {) 157.267 Tj 0 -123.414 Td (6160 normalmap, shiftmap, ctlmap, ctlmap) 192.215 Tj 0 -132.907 Td (6161 };) 39.3166 Tj 0 -142.4 Td (6162 uint st, data, c;) 104.844 Tj 0 -151.894 Td (6163 ) 21.8426 Tj 0 -161.387 Td (6164 st = inb\(KBSTATP\);) 109.213 Tj 0 -170.88 Td (6165 if\(\(st & KBS_DIB\) == 0\)) 131.055 Tj 0 -180.374 Td (6166 return -1;) 83.0018 Tj 0 -189.867 Td (6167 data = inb\(KBDATAP\);) 117.95 Tj 0 -199.361 Td (6168 ) 21.8426 Tj 0 -208.854 Td (6169 if\(data == 0xE0\){) 104.844 Tj 0 -218.347 Td (6170 shift |= E0ESC;) 104.844 Tj 0 -227.841 Td (6171 return 0;) 78.6333 Tj 0 -237.334 Td (6172 } else if\(data & 0x80\){) 131.055 Tj 0 -246.827 Td (6173 // Key released) 104.844 Tj 0 -256.321 Td (6174 data = \(shift & E0ESC ? data : data & 0x7F\);) 231.531 Tj 0 -265.814 Td (6175 shift &= ~\(shiftcode[data] | E0ESC\);) 196.583 Tj 0 -275.307 Td (6176 return 0;) 78.6333 Tj 0 -284.801 Td (6177 } else if\(shift & E0ESC\){) 139.792 Tj 0 -294.294 Td (6178 // Last character was an E0 escape; or with 0x80) 249.005 Tj 0 -303.788 Td (6179 data |= 0x80;) 96.1073 Tj 0 -313.281 Td (6180 shift &= ~E0ESC;) 109.213 Tj 0 -322.774 Td (6181 }) 34.9481 Tj 0 -332.268 Td (6182 ) 21.8426 Tj 0 -341.761 Td (6183 shift |= shiftcode[data];) 139.792 Tj 0 -351.254 Td (6184 shift ^= togglecode[data];) 144.161 Tj 0 -360.748 Td (6185 c = charcode[shift & \(CTL | SHIFT\)][data];) 214.057 Tj 0 -370.241 Td (6186 if\(shift & CAPSLOCK\){) 122.318 Tj 0 -379.734 Td (6187 if\('a' <= c && c <= 'z'\)) 144.161 Tj 0 -389.228 Td (6188 c += 'A' - 'a';) 113.581 Tj 0 -398.721 Td (6189 else if\('A' <= c && c <= 'Z'\)) 166.004 Tj 0 -408.214 Td (6190 c += 'a' - 'A';) 113.581 Tj 0 -417.708 Td (6191 }) 34.9481 Tj 0 -427.201 Td (6192 return c;) 69.8962 Tj 0 -436.695 Td (6193 }) 26.2111 Tj 0 -446.188 Td (6194 ) 21.8426 Tj 0 -455.681 Td (6195 void) 39.3166 Tj 0 -465.175 Td (6196 kbd_intr\(void\)) 83.0018 Tj 0 -474.668 Td (6197 {) 26.2111 Tj 0 -484.161 Td (6198 console_intr\(kbd_getc\);) 131.055 Tj 0 -493.655 Td (6199 }) 26.2111 Tj 0 -522.135 Td (Sheet 61) 34.9481 Tj Q Q Q Q showpage %%PageTrailer pdfEndPage %%Page: 69 69 %%BeginPageSetup %%PageOrientation: Landscape pdfStartPage 180 rotate -612 -792 translate 0 0 612 792 re W %%EndPageSetup [] 0 d 1 i 0 j 0 J 10 M 1 w /DeviceGray {} cs [0] sc /DeviceGray {} CS [0] SC false op false OP 0 0 612 792 re W q q [0.1 0 0 0.1 0 0] cm q 180 3960 5760 3460 re W /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [10 0 0 10 0 0] cm [1 0 0 1 0 0] Tm 0 0 Td [0 -0.967854 1 0 564.72 738.864] Tm 0 0 Td /F9_0 8.70222 Tf (Aug 30 10:08 2007 xv6/console.c Page 1) 174.741 Tj 0 -28.4801 Td (6200 // Console input and output.) 144.161 Tj 0 -37.9735 Td (6201 // Input is from the keyboard only.) 174.741 Tj 0 -47.4668 Td (6202 // Output is written to the screen and the printer port.) 266.479 Tj 0 -56.9602 Td (6203 ) 21.8426 Tj 0 -66.4535 Td (6204 #include "types.h") 100.476 Tj 0 -75.9469 Td (6205 #include "defs.h") 96.1073 Tj 0 -85.4403 Td (6206 #include "param.h") 100.476 Tj 0 -94.9336 Td (6207 #include "traps.h") 100.476 Tj 0 -104.427 Td (6208 #include "spinlock.h") 113.581 Tj 0 -113.92 Td (6209 #include "dev.h") 91.7388 Tj 0 -123.414 Td (6210 #include "mmu.h") 91.7388 Tj 0 -132.907 Td (6211 #include "proc.h") 96.1073 Tj 0 -142.4 Td (6212 #include "x86.h") 91.7388 Tj 0 -151.894 Td (6213 ) 21.8426 Tj 0 -161.387 Td (6214 #define CRTPORT 0x3d4) 113.581 Tj 0 -170.88 Td (6215 #define LPTPORT 0x378) 113.581 Tj 0 -180.374 Td (6216 #define BACKSPACE 0x100) 122.318 Tj 0 -189.867 Td (6217 ) 21.8426 Tj 0 -199.361 Td (6218 static ushort *crt = \(ushort*\)0xb8000; // CGA memory) 253.374 Tj 0 -208.854 Td (6219 ) 21.8426 Tj 0 -218.347 Td (6220 static struct spinlock console_lock;) 179.109 Tj 0 -227.841 Td (6221 int panicked = 0;) 96.1073 Tj 0 -237.334 Td (6222 int use_console_lock = 0;) 131.055 Tj 0 -246.827 Td (6223 ) 21.8426 Tj 0 -256.321 Td (6224 // Copy console output to parallel port, which you can tel\ l) 279.585 Tj 0 -265.814 Td (6225 // .bochsrc to copy to the stdout:) 170.372 Tj 0 -275.307 Td (6226 // parport1: enabled=1, file="/dev/stdout") 214.057 Tj 0 -284.801 Td (6227 static void) 69.8962 Tj 0 -294.294 Td (6228 lpt_putc\(int c\)) 87.3703 Tj 0 -303.788 Td (6229 {) 26.2111 Tj 0 -313.281 Td (6230 int i;) 56.7907 Tj 0 -322.774 Td (6231 ) 21.8426 Tj 0 -332.268 Td (6232 for\(i = 0; !\(inb\(LPTPORT+1\) & 0x80\) && i < 12800; i\ ++\)) 266.479 Tj 0 -341.761 Td (6233 ;) 43.6851 Tj 0 -351.254 Td (6234 if\(c == BACKSPACE\)) 109.213 Tj 0 -360.748 Td (6235 c = '\\b';) 78.6333 Tj 0 -370.241 Td (6236 outb\(LPTPORT+0, c\);) 113.581 Tj 0 -379.734 Td (6237 outb\(LPTPORT+2, 0x08|0x04|0x01\);) 170.372 Tj 0 -389.228 Td (6238 outb\(LPTPORT+2, 0x08\);) 126.687 Tj 0 -398.721 Td (6239 }) 26.2111 Tj 0 -408.214 Td (6240 ) 21.8426 Tj 0 -417.708 Td (6241 ) 21.8426 Tj 0 -427.201 Td (6242 ) 21.8426 Tj 0 -436.695 Td (6243 ) 21.8426 Tj 0 -446.188 Td (6244 ) 21.8426 Tj 0 -455.681 Td (6245 ) 21.8426 Tj 0 -465.175 Td (6246 ) 21.8426 Tj 0 -474.668 Td (6247 ) 21.8426 Tj 0 -484.161 Td (6248 ) 21.8426 Tj 0 -493.655 Td (6249 ) 21.8426 Tj 0 -522.135 Td (Sheet 62) 34.9481 Tj Q Q q 180 500 5760 3460 re W /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [10 0 0 10 0 0] cm [1 0 0 1 0 0] Tm 0 0 Td [0 -0.967854 1 0 564.72 392.864] Tm 0 0 Td /F9_0 8.70222 Tf (Aug 30 10:08 2007 xv6/console.c Page 2) 174.741 Tj 0 -28.4801 Td (6250 static void) 69.8962 Tj 0 -37.9735 Td (6251 cga_putc\(int c\)) 87.3703 Tj 0 -47.4668 Td (6252 {) 26.2111 Tj 0 -56.9602 Td (6253 int pos;) 65.5277 Tj 0 -66.4535 Td (6254 ) 21.8426 Tj 0 -75.9469 Td (6255 // Cursor position: col + 80*row.) 174.741 Tj 0 -85.4403 Td (6256 outb\(CRTPORT, 14\);) 109.213 Tj 0 -94.9336 Td (6257 pos = inb\(CRTPORT+1\) << 8;) 144.161 Tj 0 -104.427 Td (6258 outb\(CRTPORT, 15\);) 109.213 Tj 0 -113.92 Td (6259 pos |= inb\(CRTPORT+1\);) 126.687 Tj 0 -123.414 Td (6260 ) 21.8426 Tj 0 -132.907 Td (6261 if\(c == '\\n'\)) 87.3703 Tj 0 -142.4 Td (6262 pos += 80 - pos%80;) 122.318 Tj 0 -151.894 Td (6263 else if\(c == BACKSPACE\){) 135.424 Tj 0 -161.387 Td (6264 if\(pos > 0\)) 87.3703 Tj 0 -170.88 Td (6265 crt[--pos] = ' ' | 0x0700;) 161.635 Tj 0 -180.374 Td (6266 } else) 56.7907 Tj 0 -189.867 Td (6267 crt[pos++] = \(c&0xff\) | 0x0700; // black on white) 257.742 Tj 0 -199.361 Td (6268 ) 21.8426 Tj 0 -208.854 Td (6269 if\(\(pos/80\) >= 24\){ // Scroll up.) 179.109 Tj 0 -218.347 Td (6270 memmove\(crt, crt+80, sizeof\(crt[0]\)*23*80\);) 227.163 Tj 0 -227.841 Td (6271 pos -= 80;) 83.0018 Tj 0 -237.334 Td (6272 memset\(crt+pos, 0, sizeof\(crt[0]\)*\(24*80 - pos\)\)\ ;) 253.374 Tj 0 -246.827 Td (6273 }) 34.9481 Tj 0 -256.321 Td (6274 ) 21.8426 Tj 0 -265.814 Td (6275 outb\(CRTPORT, 14\);) 109.213 Tj 0 -275.307 Td (6276 outb\(CRTPORT+1, pos>>8\);) 135.424 Tj 0 -284.801 Td (6277 outb\(CRTPORT, 15\);) 109.213 Tj 0 -294.294 Td (6278 outb\(CRTPORT+1, pos\);) 122.318 Tj 0 -303.788 Td (6279 crt[pos] = ' ' | 0x0700;) 135.424 Tj 0 -313.281 Td (6280 }) 26.2111 Tj 0 -322.774 Td (6281 ) 21.8426 Tj 0 -332.268 Td (6282 static void) 69.8962 Tj 0 -341.761 Td (6283 cons_putc\(int c\)) 91.7388 Tj 0 -351.254 Td (6284 {) 26.2111 Tj 0 -360.748 Td (6285 if\(panicked\){) 87.3703 Tj 0 -370.241 Td (6286 cli\(\);) 65.5277 Tj 0 -379.734 Td (6287 for\(;;\)) 69.8962 Tj 0 -389.228 Td (6288 ;) 52.4222 Tj 0 -398.721 Td (6289 }) 34.9481 Tj 0 -408.214 Td (6290 ) 21.8426 Tj 0 -417.708 Td (6291 lpt_putc\(c\);) 83.0018 Tj 0 -427.201 Td (6292 cga_putc\(c\);) 83.0018 Tj 0 -436.695 Td (6293 }) 26.2111 Tj 0 -446.188 Td (6294 ) 21.8426 Tj 0 -455.681 Td (6295 ) 21.8426 Tj 0 -465.175 Td (6296 ) 21.8426 Tj 0 -474.668 Td (6297 ) 21.8426 Tj 0 -484.161 Td (6298 ) 21.8426 Tj 0 -493.655 Td (6299 ) 21.8426 Tj 0 -522.135 Td (Sheet 62) 34.9481 Tj Q Q Q Q showpage %%PageTrailer pdfEndPage %%Page: 70 70 %%BeginPageSetup %%PageOrientation: Landscape pdfStartPage 180 rotate -612 -792 translate 0 0 612 792 re W %%EndPageSetup [] 0 d 1 i 0 j 0 J 10 M 1 w /DeviceGray {} cs [0] sc /DeviceGray {} CS [0] SC false op false OP 0 0 612 792 re W q q [0.1 0 0 0.1 0 0] cm q 180 3960 5760 3460 re W /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [10 0 0 10 0 0] cm [1 0 0 1 0 0] Tm 0 0 Td [0 -0.967854 1 0 564.72 738.864] Tm 0 0 Td /F9_0 8.70222 Tf (Aug 30 10:08 2007 xv6/console.c Page 3) 174.741 Tj 0 -28.4801 Td (6300 void) 39.3166 Tj 0 -37.9735 Td (6301 printint\(int xx, int base, int sgn\)) 174.741 Tj 0 -47.4668 Td (6302 {) 26.2111 Tj 0 -56.9602 Td (6303 static char digits[] = "0123456789ABCDEF";) 214.057 Tj 0 -66.4535 Td (6304 char buf[16];) 87.3703 Tj 0 -75.9469 Td (6305 int i = 0, neg = 0;) 113.581 Tj 0 -85.4403 Td (6306 uint x;) 61.1592 Tj 0 -94.9336 Td (6307 ) 21.8426 Tj 0 -104.427 Td (6308 if\(sgn && xx < 0\){) 109.213 Tj 0 -113.92 Td (6309 neg = 1;) 74.2647 Tj 0 -123.414 Td (6310 x = 0 - xx;) 87.3703 Tj 0 -132.907 Td (6311 } else {) 65.5277 Tj 0 -142.4 Td (6312 x = xx;) 69.8962 Tj 0 -151.894 Td (6313 }) 34.9481 Tj 0 -161.387 Td (6314 ) 21.8426 Tj 0 -170.88 Td (6315 do{) 43.6851 Tj 0 -180.374 Td (6316 buf[i++] = digits[x % base];) 161.635 Tj 0 -189.867 Td (6317 }while\(\(x /= base\) != 0\);) 139.792 Tj 0 -199.361 Td (6318 if\(neg\)) 61.1592 Tj 0 -208.854 Td (6319 buf[i++] = '-';) 104.844 Tj 0 -218.347 Td (6320 ) 21.8426 Tj 0 -227.841 Td (6321 while\(--i >= 0\)) 96.1073 Tj 0 -237.334 Td (6322 cons_putc\(buf[i]\);) 117.95 Tj 0 -246.827 Td (6323 }) 26.2111 Tj 0 -256.321 Td (6324 ) 21.8426 Tj 0 -265.814 Td (6325 // Print to the console. only understands %d, %x, %p, %s.) 270.848 Tj 0 -275.307 Td (6326 void) 39.3166 Tj 0 -284.801 Td (6327 cprintf\(char *fmt, ...\)) 122.318 Tj 0 -294.294 Td (6328 {) 26.2111 Tj 0 -303.788 Td (6329 int i, c, state, locking;) 139.792 Tj 0 -313.281 Td (6330 uint *argp;) 78.6333 Tj 0 -322.774 Td (6331 char *s;) 65.5277 Tj 0 -332.268 Td (6332 ) 21.8426 Tj 0 -341.761 Td (6333 locking = use_console_lock;) 148.529 Tj 0 -351.254 Td (6334 if\(locking\)) 78.6333 Tj 0 -360.748 Td (6335 acquire\(&console_lock\);) 139.792 Tj 0 -370.241 Td (6336 ) 21.8426 Tj 0 -379.734 Td (6337 argp = \(uint*\)\(void*\)&fmt + 1;) 161.635 Tj 0 -389.228 Td (6338 state = 0;) 74.2647 Tj 0 -398.721 Td (6339 for\(i = 0; fmt[i]; i++\){) 135.424 Tj 0 -408.214 Td (6340 c = fmt[i] & 0xff;) 117.95 Tj 0 -417.708 Td (6341 switch\(state\){) 100.476 Tj 0 -427.201 Td (6342 case 0:) 69.8962 Tj 0 -436.695 Td (6343 if\(c == '%'\)) 100.476 Tj 0 -446.188 Td (6344 state = '%';) 109.213 Tj 0 -455.681 Td (6345 else) 65.5277 Tj 0 -465.175 Td (6346 cons_putc\(c\);) 113.581 Tj 0 -474.668 Td (6347 break;) 74.2647 Tj 0 -484.161 Td (6348 ) 21.8426 Tj 0 -493.655 Td (6349 ) 21.8426 Tj 0 -522.135 Td (Sheet 63) 34.9481 Tj Q Q q 180 500 5760 3460 re W /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [10 0 0 10 0 0] cm [1 0 0 1 0 0] Tm 0 0 Td [0 -0.967854 1 0 564.72 392.864] Tm 0 0 Td /F9_0 8.70222 Tf (Aug 30 10:08 2007 xv6/console.c Page 4) 174.741 Tj 0 -28.4801 Td (6350 case '%':) 78.6333 Tj 0 -37.9735 Td (6351 switch\(c\){) 91.7388 Tj 0 -47.4668 Td (6352 case 'd':) 87.3703 Tj 0 -56.9602 Td (6353 printint\(*argp++, 10, 1\);) 166.004 Tj 0 -66.4535 Td (6354 break;) 83.0018 Tj 0 -75.9469 Td (6355 case 'x':) 87.3703 Tj 0 -85.4403 Td (6356 case 'p':) 87.3703 Tj 0 -94.9336 Td (6357 printint\(*argp++, 16, 0\);) 166.004 Tj 0 -104.427 Td (6358 break;) 83.0018 Tj 0 -113.92 Td (6359 case 's':) 87.3703 Tj 0 -123.414 Td (6360 s = \(char*\)*argp++;) 139.792 Tj 0 -132.907 Td (6361 if\(s == 0\)) 100.476 Tj 0 -142.4 Td (6362 s = "\(null\)";) 122.318 Tj 0 -151.894 Td (6363 for\(; *s; s++\)) 117.95 Tj 0 -161.387 Td (6364 cons_putc\(*s\);) 126.687 Tj 0 -170.88 Td (6365 break;) 83.0018 Tj 0 -180.374 Td (6366 case '%':) 87.3703 Tj 0 -189.867 Td (6367 cons_putc\('%'\);) 122.318 Tj 0 -199.361 Td (6368 break;) 83.0018 Tj 0 -208.854 Td (6369 default:) 83.0018 Tj 0 -218.347 Td (6370 // Print unknown % sequence to draw attention.) 257.742 Tj 0 -227.841 Td (6371 cons_putc\('%'\);) 122.318 Tj 0 -237.334 Td (6372 cons_putc\(c\);) 113.581 Tj 0 -246.827 Td (6373 break;) 83.0018 Tj 0 -256.321 Td (6374 }) 52.4222 Tj 0 -265.814 Td (6375 state = 0;) 91.7388 Tj 0 -275.307 Td (6376 break;) 74.2647 Tj 0 -284.801 Td (6377 }) 43.6851 Tj 0 -294.294 Td (6378 }) 34.9481 Tj 0 -303.788 Td (6379 ) 21.8426 Tj 0 -313.281 Td (6380 if\(locking\)) 78.6333 Tj 0 -322.774 Td (6381 release\(&console_lock\);) 139.792 Tj 0 -332.268 Td (6382 }) 26.2111 Tj 0 -341.761 Td (6383 ) 21.8426 Tj 0 -351.254 Td (6384 int) 34.9481 Tj 0 -360.748 Td (6385 console_write\(struct inode *ip, char *buf, int n\)) 235.9 Tj 0 -370.241 Td (6386 {) 26.2111 Tj 0 -379.734 Td (6387 int i;) 56.7907 Tj 0 -389.228 Td (6388 ) 21.8426 Tj 0 -398.721 Td (6389 iunlock\(ip\);) 83.0018 Tj 0 -408.214 Td (6390 acquire\(&console_lock\);) 131.055 Tj 0 -417.708 Td (6391 for\(i = 0; i < n; i++\)) 126.687 Tj 0 -427.201 Td (6392 cons_putc\(buf[i] & 0xff\);) 148.529 Tj 0 -436.695 Td (6393 release\(&console_lock\);) 131.055 Tj 0 -446.188 Td (6394 ilock\(ip\);) 74.2647 Tj 0 -455.681 Td (6395 ) 21.8426 Tj 0 -465.175 Td (6396 return n;) 69.8962 Tj 0 -474.668 Td (6397 }) 26.2111 Tj 0 -484.161 Td (6398 ) 21.8426 Tj 0 -493.655 Td (6399 ) 21.8426 Tj 0 -522.135 Td (Sheet 63) 34.9481 Tj Q Q Q Q showpage %%PageTrailer pdfEndPage %%Page: 71 71 %%BeginPageSetup %%PageOrientation: Landscape pdfStartPage 180 rotate -612 -792 translate 0 0 612 792 re W %%EndPageSetup [] 0 d 1 i 0 j 0 J 10 M 1 w /DeviceGray {} cs [0] sc /DeviceGray {} CS [0] SC false op false OP 0 0 612 792 re W q q [0.1 0 0 0.1 0 0] cm q 180 3960 5760 3460 re W /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [10 0 0 10 0 0] cm [1 0 0 1 0 0] Tm 0 0 Td [0 -0.967854 1 0 564.72 738.864] Tm 0 0 Td /F9_0 8.70222 Tf (Aug 30 10:08 2007 xv6/console.c Page 5) 174.741 Tj 0 -28.4801 Td (6400 #define INPUT_BUF 128) 113.581 Tj 0 -37.9735 Td (6401 struct {) 56.7907 Tj 0 -47.4668 Td (6402 struct spinlock lock;) 122.318 Tj 0 -56.9602 Td (6403 char buf[INPUT_BUF];) 117.95 Tj 0 -66.4535 Td (6404 int r; // Read index) 122.318 Tj 0 -75.9469 Td (6405 int w; // Write index) 126.687 Tj 0 -85.4403 Td (6406 int e; // Edit index) 122.318 Tj 0 -94.9336 Td (6407 } input;) 56.7907 Tj 0 -104.427 Td (6408 ) 21.8426 Tj 0 -113.92 Td (6409 #define C\(x\) \(\(x\)-'@'\) // Control-x) 183.478 Tj 0 -123.414 Td (6410 ) 21.8426 Tj 0 -132.907 Td (6411 void) 39.3166 Tj 0 -142.4 Td (6412 console_intr\(int \(*getc\)\(void\)\)) 157.267 Tj 0 -151.894 Td (6413 {) 26.2111 Tj 0 -161.387 Td (6414 int c;) 56.7907 Tj 0 -170.88 Td (6415 ) 21.8426 Tj 0 -180.374 Td (6416 acquire\(&input.lock\);) 122.318 Tj 0 -189.867 Td (6417 while\(\(c = getc\(\)\) >= 0\){) 139.792 Tj 0 -199.361 Td (6418 switch\(c\){) 83.0018 Tj 0 -208.854 Td (6419 case C\('P'\): // Process listing.) 183.478 Tj 0 -218.347 Td (6420 procdump\(\);) 96.1073 Tj 0 -227.841 Td (6421 break;) 74.2647 Tj 0 -237.334 Td (6422 case C\('U'\): // Kill line.) 157.267 Tj 0 -246.827 Td (6423 while\(input.e > input.w &&) 161.635 Tj 0 -256.321 Td (6424 input.buf[\(input.e-1\) % INPUT_BUF] != '\\n'\)\ {) 266.479 Tj 0 -265.814 Td (6425 input.e--;) 100.476 Tj 0 -275.307 Td (6426 cons_putc\(BACKSPACE\);) 148.529 Tj 0 -284.801 Td (6427 }) 52.4222 Tj 0 -294.294 Td (6428 break;) 74.2647 Tj 0 -303.788 Td (6429 case C\('H'\): // Backspace) 152.898 Tj 0 -313.281 Td (6430 if\(input.e > input.w\){) 144.161 Tj 0 -322.774 Td (6431 input.e--;) 100.476 Tj 0 -332.268 Td (6432 cons_putc\(BACKSPACE\);) 148.529 Tj 0 -341.761 Td (6433 }) 52.4222 Tj 0 -351.254 Td (6434 break;) 74.2647 Tj 0 -360.748 Td (6435 default:) 74.2647 Tj 0 -370.241 Td (6436 if\(c != 0 && input.e < input.r+INPUT_BUF\){) 231.531 Tj 0 -379.734 Td (6437 input.buf[input.e++] = c;) 166.004 Tj 0 -389.228 Td (6438 cons_putc\(c\);) 113.581 Tj 0 -398.721 Td (6439 if\(c == '\\n' || c == C\('D'\) || input.e == inpu\ t.r+INPUT_BUF\){) 323.27 Tj 0 -408.214 Td (6440 input.w = input.e;) 144.161 Tj 0 -417.708 Td (6441 wakeup\(&input.r\);) 139.792 Tj 0 -427.201 Td (6442 }) 61.1592 Tj 0 -436.695 Td (6443 }) 52.4222 Tj 0 -446.188 Td (6444 break;) 74.2647 Tj 0 -455.681 Td (6445 }) 43.6851 Tj 0 -465.175 Td (6446 }) 34.9481 Tj 0 -474.668 Td (6447 release\(&input.lock\);) 122.318 Tj 0 -484.161 Td (6448 }) 26.2111 Tj 0 -493.655 Td (6449 ) 21.8426 Tj 0 -522.135 Td (Sheet 64) 34.9481 Tj Q Q q 180 500 5760 3460 re W /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [10 0 0 10 0 0] cm [1 0 0 1 0 0] Tm 0 0 Td [0 -0.967854 1 0 564.72 392.864] Tm 0 0 Td /F9_0 8.70222 Tf (Aug 30 10:08 2007 xv6/console.c Page 6) 174.741 Tj 0 -28.4801 Td (6450 int) 34.9481 Tj 0 -37.9735 Td (6451 console_read\(struct inode *ip, char *dst, int n\)) 231.531 Tj 0 -47.4668 Td (6452 {) 26.2111 Tj 0 -56.9602 Td (6453 uint target;) 83.0018 Tj 0 -66.4535 Td (6454 int c;) 56.7907 Tj 0 -75.9469 Td (6455 ) 21.8426 Tj 0 -85.4403 Td (6456 iunlock\(ip\);) 83.0018 Tj 0 -94.9336 Td (6457 target = n;) 78.6333 Tj 0 -104.427 Td (6458 acquire\(&input.lock\);) 122.318 Tj 0 -113.92 Td (6459 while\(n > 0\){) 87.3703 Tj 0 -123.414 Td (6460 while\(input.r == input.w\){) 152.898 Tj 0 -132.907 Td (6461 if\(cp->killed\){) 113.581 Tj 0 -142.4 Td (6462 release\(&input.lock\);) 148.529 Tj 0 -151.894 Td (6463 ilock\(ip\);) 100.476 Tj 0 -161.387 Td (6464 return -1;) 100.476 Tj 0 -170.88 Td (6465 }) 52.4222 Tj 0 -180.374 Td (6466 sleep\(&input.r, &input.lock\);) 174.741 Tj 0 -189.867 Td (6467 }) 43.6851 Tj 0 -199.361 Td (6468 c = input.buf[input.r++];) 148.529 Tj 0 -208.854 Td (6469 if\(c == C\('D'\)\){ // EOF) 144.161 Tj 0 -218.347 Td (6470 if\(n < target\){) 113.581 Tj 0 -227.841 Td (6471 // Save ^D for next time, to make sure) 222.794 Tj 0 -237.334 Td (6472 // caller gets a 0-byte result.) 192.215 Tj 0 -246.827 Td (6473 input.r--;) 100.476 Tj 0 -256.321 Td (6474 }) 52.4222 Tj 0 -265.814 Td (6475 break;) 74.2647 Tj 0 -275.307 Td (6476 }) 43.6851 Tj 0 -284.801 Td (6477 *dst++ = c;) 87.3703 Tj 0 -294.294 Td (6478 --n;) 56.7907 Tj 0 -303.788 Td (6479 if\(c == '\\n'\)) 96.1073 Tj 0 -313.281 Td (6480 break;) 74.2647 Tj 0 -322.774 Td (6481 if\(input.r >= INPUT_BUF\)) 144.161 Tj 0 -332.268 Td (6482 input.r = 0;) 100.476 Tj 0 -341.761 Td (6483 }) 34.9481 Tj 0 -351.254 Td (6484 release\(&input.lock\);) 122.318 Tj 0 -360.748 Td (6485 ilock\(ip\);) 74.2647 Tj 0 -370.241 Td (6486 ) 21.8426 Tj 0 -379.734 Td (6487 return target - n;) 109.213 Tj 0 -389.228 Td (6488 }) 26.2111 Tj 0 -398.721 Td (6489 ) 21.8426 Tj 0 -408.214 Td (6490 ) 21.8426 Tj 0 -417.708 Td (6491 ) 21.8426 Tj 0 -427.201 Td (6492 ) 21.8426 Tj 0 -436.695 Td (6493 ) 21.8426 Tj 0 -446.188 Td (6494 ) 21.8426 Tj 0 -455.681 Td (6495 ) 21.8426 Tj 0 -465.175 Td (6496 ) 21.8426 Tj 0 -474.668 Td (6497 ) 21.8426 Tj 0 -484.161 Td (6498 ) 21.8426 Tj 0 -493.655 Td (6499 ) 21.8426 Tj 0 -522.135 Td (Sheet 64) 34.9481 Tj Q Q Q Q showpage %%PageTrailer pdfEndPage %%Page: 72 72 %%BeginPageSetup %%PageOrientation: Landscape pdfStartPage 180 rotate -612 -792 translate 0 0 612 792 re W %%EndPageSetup [] 0 d 1 i 0 j 0 J 10 M 1 w /DeviceGray {} cs [0] sc /DeviceGray {} CS [0] SC false op false OP 0 0 612 792 re W q q [0.1 0 0 0.1 0 0] cm q 180 3960 5760 3460 re W /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [10 0 0 10 0 0] cm [1 0 0 1 0 0] Tm 0 0 Td [0 -0.967854 1 0 564.72 738.864] Tm 0 0 Td /F9_0 8.70222 Tf (Aug 30 10:08 2007 xv6/console.c Page 7) 174.741 Tj 0 -28.4801 Td (6500 void) 39.3166 Tj 0 -37.9735 Td (6501 console_init\(void\)) 100.476 Tj 0 -47.4668 Td (6502 {) 26.2111 Tj 0 -56.9602 Td (6503 initlock\(&console_lock, "console"\);) 183.478 Tj 0 -66.4535 Td (6504 initlock\(&input.lock, "console input"\);) 200.952 Tj 0 -75.9469 Td (6505 ) 21.8426 Tj 0 -85.4403 Td (6506 devsw[CONSOLE].write = console_write;) 192.215 Tj 0 -94.9336 Td (6507 devsw[CONSOLE].read = console_read;) 183.478 Tj 0 -104.427 Td (6508 //use_console_lock = 1;) 131.055 Tj 0 -113.92 Td (6509 ) 21.8426 Tj 0 -123.414 Td (6510 pic_enable\(IRQ_KBD\);) 117.95 Tj 0 -132.907 Td (6511 ioapic_enable\(IRQ_KBD, 0\);) 144.161 Tj 0 -142.4 Td (6512 }) 26.2111 Tj 0 -151.894 Td (6513 ) 21.8426 Tj 0 -161.387 Td (6514 void) 39.3166 Tj 0 -170.88 Td (6515 panic\(char *s\)) 83.0018 Tj 0 -180.374 Td (6516 {) 26.2111 Tj 0 -189.867 Td (6517 int i;) 56.7907 Tj 0 -199.361 Td (6518 uint pcs[10];) 87.3703 Tj 0 -208.854 Td (6519 ) 21.8426 Tj 0 -218.347 Td (6520 __asm __volatile\("cli"\);) 135.424 Tj 0 -227.841 Td (6521 use_console_lock = 0;) 122.318 Tj 0 -237.334 Td (6522 cprintf\("panic \(%d\): ", cpu\(\)\);) 166.004 Tj 0 -246.827 Td (6523 cprintf\(s, 0\);) 91.7388 Tj 0 -256.321 Td (6524 cprintf\("\\n", 0\);) 104.844 Tj 0 -265.814 Td (6525 getcallerpcs\(&s, pcs\);) 126.687 Tj 0 -275.307 Td (6526 for\(i=0; i<10; i++\)) 113.581 Tj 0 -284.801 Td (6527 cprintf\(" %p", pcs[i]\);) 139.792 Tj 0 -294.294 Td (6528 panicked = 1; // freeze other CPU) 174.741 Tj 0 -303.788 Td (6529 for\(;;\)) 61.1592 Tj 0 -313.281 Td (6530 ;) 43.6851 Tj 0 -322.774 Td (6531 }) 26.2111 Tj 0 -332.268 Td (6532 ) 21.8426 Tj 0 -341.761 Td (6533 ) 21.8426 Tj 0 -351.254 Td (6534 ) 21.8426 Tj 0 -360.748 Td (6535 ) 21.8426 Tj 0 -370.241 Td (6536 ) 21.8426 Tj 0 -379.734 Td (6537 ) 21.8426 Tj 0 -389.228 Td (6538 ) 21.8426 Tj 0 -398.721 Td (6539 ) 21.8426 Tj 0 -408.214 Td (6540 ) 21.8426 Tj 0 -417.708 Td (6541 ) 21.8426 Tj 0 -427.201 Td (6542 ) 21.8426 Tj 0 -436.695 Td (6543 ) 21.8426 Tj 0 -446.188 Td (6544 ) 21.8426 Tj 0 -455.681 Td (6545 ) 21.8426 Tj 0 -465.175 Td (6546 ) 21.8426 Tj 0 -474.668 Td (6547 ) 21.8426 Tj 0 -484.161 Td (6548 ) 21.8426 Tj 0 -493.655 Td (6549 ) 21.8426 Tj 0 -522.135 Td (Sheet 65) 34.9481 Tj Q Q q 180 500 5760 3460 re W /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [10 0 0 10 0 0] cm [1 0 0 1 0 0] Tm 0 0 Td [0 -0.967854 1 0 564.72 392.864] Tm 0 0 Td /F9_0 8.70222 Tf (Aug 30 10:08 2007 xv6/timer.c Page 1) 166.004 Tj 0 -28.4801 Td (6550 // Intel 8253/8254/82C54 Programmable Interval Timer \(PIT\ \).) 279.585 Tj 0 -37.9735 Td (6551 // Only used on uniprocessors;) 152.898 Tj 0 -47.4668 Td (6552 // SMP machines use the local APIC timer.) 200.952 Tj 0 -56.9602 Td (6553 ) 21.8426 Tj 0 -66.4535 Td (6554 #include "types.h") 100.476 Tj 0 -75.9469 Td (6555 #include "defs.h") 96.1073 Tj 0 -85.4403 Td (6556 #include "traps.h") 100.476 Tj 0 -94.9336 Td (6557 #include "x86.h") 91.7388 Tj 0 -104.427 Td (6558 ) 21.8426 Tj 0 -113.92 Td (6559 #define IO_TIMER1 0x040 // 8253 Timer #1) 266.479 Tj 0 -123.414 Td (6560 ) 21.8426 Tj 0 -132.907 Td (6561 // Frequency of all three count-down timers;) 214.057 Tj 0 -142.4 Td (6562 // \(TIMER_FREQ/freq\) is the appropriate count) 218.426 Tj 0 -151.894 Td (6563 // to generate a frequency of freq Hz.) 187.846 Tj 0 -161.387 Td (6564 ) 21.8426 Tj 0 -170.88 Td (6565 #define TIMER_FREQ 1193182) 157.267 Tj 0 -180.374 Td (6566 #define TIMER_DIV\(x\) \(\(TIMER_FREQ+\(x\)/2\)/\(x\)\)) 231.531 Tj 0 -189.867 Td (6567 ) 21.8426 Tj 0 -199.361 Td (6568 #define TIMER_MODE \(IO_TIMER1 + 3\) // timer mode po\ rt) 275.216 Tj 0 -208.854 Td (6569 #define TIMER_SEL0 0x00 // select counter 0) 244.637 Tj 0 -218.347 Td (6570 #define TIMER_RATEGEN 0x04 // mode 2, rate generator) 270.848 Tj 0 -227.841 Td (6571 #define TIMER_16BIT 0x30 // r/w counter 16 bits, LS\ B first) 305.796 Tj 0 -237.334 Td (6572 ) 21.8426 Tj 0 -246.827 Td (6573 void) 39.3166 Tj 0 -256.321 Td (6574 timer_init\(void\)) 91.7388 Tj 0 -265.814 Td (6575 {) 26.2111 Tj 0 -275.307 Td (6576 // Interrupt 100 times/sec.) 148.529 Tj 0 -284.801 Td (6577 outb\(TIMER_MODE, TIMER_SEL0 | TIMER_RATEGEN | TIMER_16B\ IT\);) 288.322 Tj 0 -294.294 Td (6578 outb\(IO_TIMER1, TIMER_DIV\(100\) % 256\);) 196.583 Tj 0 -303.788 Td (6579 outb\(IO_TIMER1, TIMER_DIV\(100\) / 256\);) 196.583 Tj 0 -313.281 Td (6580 pic_enable\(IRQ_TIMER\);) 126.687 Tj 0 -322.774 Td (6581 }) 26.2111 Tj 0 -332.268 Td (6582 ) 21.8426 Tj 0 -341.761 Td (6583 ) 21.8426 Tj 0 -351.254 Td (6584 ) 21.8426 Tj 0 -360.748 Td (6585 ) 21.8426 Tj 0 -370.241 Td (6586 ) 21.8426 Tj 0 -379.734 Td (6587 ) 21.8426 Tj 0 -389.228 Td (6588 ) 21.8426 Tj 0 -398.721 Td (6589 ) 21.8426 Tj 0 -408.214 Td (6590 ) 21.8426 Tj 0 -417.708 Td (6591 ) 21.8426 Tj 0 -427.201 Td (6592 ) 21.8426 Tj 0 -436.695 Td (6593 ) 21.8426 Tj 0 -446.188 Td (6594 ) 21.8426 Tj 0 -455.681 Td (6595 ) 21.8426 Tj 0 -465.175 Td (6596 ) 21.8426 Tj 0 -474.668 Td (6597 ) 21.8426 Tj 0 -484.161 Td (6598 ) 21.8426 Tj 0 -493.655 Td (6599 ) 21.8426 Tj 0 -522.135 Td (Sheet 65) 34.9481 Tj Q Q Q Q showpage %%PageTrailer pdfEndPage %%Page: 73 73 %%BeginPageSetup %%PageOrientation: Landscape pdfStartPage 180 rotate -612 -792 translate 0 0 612 792 re W %%EndPageSetup [] 0 d 1 i 0 j 0 J 10 M 1 w /DeviceGray {} cs [0] sc /DeviceGray {} CS [0] SC false op false OP 0 0 612 792 re W q q [0.1 0 0 0.1 0 0] cm q 180 3960 5760 3460 re W /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [10 0 0 10 0 0] cm [1 0 0 1 0 0] Tm 0 0 Td [0 -0.967854 1 0 564.72 738.864] Tm 0 0 Td /F9_0 8.70222 Tf (Aug 30 10:08 2007 xv6/initcode.S Page 1) 179.109 Tj 0 -28.4801 Td (6600 # Initial process execs /init.) 152.898 Tj 0 -37.9735 Td (6601 ) 21.8426 Tj 0 -47.4668 Td (6602 #include "syscall.h") 109.213 Tj 0 -56.9602 Td (6603 #include "traps.h") 100.476 Tj 0 -66.4535 Td (6604 ) 21.8426 Tj 0 -75.9469 Td (6605 # exec\(init, argv\)) 100.476 Tj 0 -85.4403 Td (6606 .globl start) 74.2647 Tj 0 -94.9336 Td (6607 start:) 48.0537 Tj 0 -104.427 Td (6608 pushl $argv) 78.6333 Tj 0 -113.92 Td (6609 pushl $init) 78.6333 Tj 0 -123.414 Td (6610 pushl $0) 65.5277 Tj 0 -132.907 Td (6611 movl $SYS_exec, %eax) 117.95 Tj 0 -142.4 Td (6612 int $T_SYSCALL) 91.7388 Tj 0 -151.894 Td (6613 ) 21.8426 Tj 0 -161.387 Td (6614 # for\(;;\) exit\(\);) 96.1073 Tj 0 -170.88 Td (6615 exit:) 43.6851 Tj 0 -180.374 Td (6616 movl $SYS_exit, %eax) 117.95 Tj 0 -189.867 Td (6617 int $T_SYSCALL) 91.7388 Tj 0 -199.361 Td (6618 jmp exit) 65.5277 Tj 0 -208.854 Td (6619 ) 21.8426 Tj 0 -218.347 Td (6620 # char init[] = "/init\\0";) 135.424 Tj 0 -227.841 Td (6621 init:) 43.6851 Tj 0 -237.334 Td (6622 .string "/init\\0") 104.844 Tj 0 -246.827 Td (6623 ) 21.8426 Tj 0 -256.321 Td (6624 # char *argv[] = { init, 0 };) 148.529 Tj 0 -265.814 Td (6625 .p2align 2) 65.5277 Tj 0 -275.307 Td (6626 argv:) 43.6851 Tj 0 -284.801 Td (6627 .long init) 74.2647 Tj 0 -294.294 Td (6628 .long 0) 61.1592 Tj 0 -303.788 Td (6629 ) 21.8426 Tj 0 -313.281 Td (6630 ) 21.8426 Tj 0 -322.774 Td (6631 ) 21.8426 Tj 0 -332.268 Td (6632 ) 21.8426 Tj 0 -341.761 Td (6633 ) 21.8426 Tj 0 -351.254 Td (6634 ) 21.8426 Tj 0 -360.748 Td (6635 ) 21.8426 Tj 0 -370.241 Td (6636 ) 21.8426 Tj 0 -379.734 Td (6637 ) 21.8426 Tj 0 -389.228 Td (6638 ) 21.8426 Tj 0 -398.721 Td (6639 ) 21.8426 Tj 0 -408.214 Td (6640 ) 21.8426 Tj 0 -417.708 Td (6641 ) 21.8426 Tj 0 -427.201 Td (6642 ) 21.8426 Tj 0 -436.695 Td (6643 ) 21.8426 Tj 0 -446.188 Td (6644 ) 21.8426 Tj 0 -455.681 Td (6645 ) 21.8426 Tj 0 -465.175 Td (6646 ) 21.8426 Tj 0 -474.668 Td (6647 ) 21.8426 Tj 0 -484.161 Td (6648 ) 21.8426 Tj 0 -493.655 Td (6649 ) 21.8426 Tj 0 -522.135 Td (Sheet 66) 34.9481 Tj Q Q q 180 500 5760 3460 re W /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [10 0 0 10 0 0] cm [1 0 0 1 0 0] Tm 0 0 Td [0 -0.967854 1 0 564.72 392.864] Tm 0 0 Td /F9_0 8.70222 Tf (Aug 30 10:08 2007 xv6/init.c Page 1) 161.635 Tj 0 -28.4801 Td (6650 // init: The initial user-level program) 192.215 Tj 0 -37.9735 Td (6651 ) 21.8426 Tj 0 -47.4668 Td (6652 #include "types.h") 100.476 Tj 0 -56.9602 Td (6653 #include "stat.h") 96.1073 Tj 0 -66.4535 Td (6654 #include "user.h") 96.1073 Tj 0 -75.9469 Td (6655 #include "fcntl.h") 100.476 Tj 0 -85.4403 Td (6656 ) 21.8426 Tj 0 -94.9336 Td (6657 char *sh_args[] = { "sh", 0 };) 152.898 Tj 0 -104.427 Td (6658 ) 21.8426 Tj 0 -113.92 Td (6659 int) 34.9481 Tj 0 -123.414 Td (6660 main\(void\)) 65.5277 Tj 0 -132.907 Td (6661 {) 26.2111 Tj 0 -142.4 Td (6662 int pid, wpid;) 91.7388 Tj 0 -151.894 Td (6663 ) 21.8426 Tj 0 -161.387 Td (6664 if\(open\("console", O_RDWR\) < 0\){) 170.372 Tj 0 -170.88 Td (6665 mknod\("console", 1, 1\);) 139.792 Tj 0 -180.374 Td (6666 open\("console", O_RDWR\);) 144.161 Tj 0 -189.867 Td (6667 }) 34.9481 Tj 0 -199.361 Td (6668 dup\(0\); // stdout) 109.213 Tj 0 -208.854 Td (6669 dup\(0\); // stderr) 109.213 Tj 0 -218.347 Td (6670 ) 21.8426 Tj 0 -227.841 Td (6671 for\(;;\){) 65.5277 Tj 0 -237.334 Td (6672 printf\(1, "init: starting sh\\n"\);) 183.478 Tj 0 -246.827 Td (6673 pid = fork\(\);) 96.1073 Tj 0 -256.321 Td (6674 if\(pid < 0\){) 91.7388 Tj 0 -265.814 Td (6675 printf\(1, "init: fork failed\\n"\);) 192.215 Tj 0 -275.307 Td (6676 exit\(\);) 78.6333 Tj 0 -284.801 Td (6677 }) 43.6851 Tj 0 -294.294 Td (6678 if\(pid == 0\){) 96.1073 Tj 0 -303.788 Td (6679 exec\("sh", sh_args\);) 135.424 Tj 0 -313.281 Td (6680 printf\(1, "init: exec sh failed\\n"\);) 205.32 Tj 0 -322.774 Td (6681 exit\(\);) 78.6333 Tj 0 -332.268 Td (6682 }) 43.6851 Tj 0 -341.761 Td (6683 while\(\(wpid=wait\(\)\) >= 0 && wpid != pid\)) 214.057 Tj 0 -351.254 Td (6684 printf\(1, "zombie!\\n"\);) 148.529 Tj 0 -360.748 Td (6685 }) 34.9481 Tj 0 -370.241 Td (6686 }) 26.2111 Tj 0 -379.734 Td (6687 ) 21.8426 Tj 0 -389.228 Td (6688 ) 21.8426 Tj 0 -398.721 Td (6689 ) 21.8426 Tj 0 -408.214 Td (6690 ) 21.8426 Tj 0 -417.708 Td (6691 ) 21.8426 Tj 0 -427.201 Td (6692 ) 21.8426 Tj 0 -436.695 Td (6693 ) 21.8426 Tj 0 -446.188 Td (6694 ) 21.8426 Tj 0 -455.681 Td (6695 ) 21.8426 Tj 0 -465.175 Td (6696 ) 21.8426 Tj 0 -474.668 Td (6697 ) 21.8426 Tj 0 -484.161 Td (6698 ) 21.8426 Tj 0 -493.655 Td (6699 ) 21.8426 Tj 0 -522.135 Td (Sheet 66) 34.9481 Tj Q Q Q Q showpage %%PageTrailer pdfEndPage %%Page: 74 74 %%BeginPageSetup %%PageOrientation: Landscape pdfStartPage 180 rotate -612 -792 translate 0 0 612 792 re W %%EndPageSetup [] 0 d 1 i 0 j 0 J 10 M 1 w /DeviceGray {} cs [0] sc /DeviceGray {} CS [0] SC false op false OP 0 0 612 792 re W q q [0.1 0 0 0.1 0 0] cm q 180 3960 5760 3460 re W /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [10 0 0 10 0 0] cm [1 0 0 1 0 0] Tm 0 0 Td [0 -0.967854 1 0 564.72 738.864] Tm 0 0 Td /F9_0 8.70222 Tf (Aug 30 10:08 2007 xv6/usys.S Page 1) 161.635 Tj 0 -28.4801 Td (6700 #include "syscall.h") 109.213 Tj 0 -37.9735 Td (6701 #include "traps.h") 100.476 Tj 0 -47.4668 Td (6702 ) 21.8426 Tj 0 -56.9602 Td (6703 #define STUB\(name\) \\) 109.213 Tj 0 -66.4535 Td (6704 .globl name; \\) 91.7388 Tj 0 -75.9469 Td (6705 name: \\) 61.1592 Tj 0 -85.4403 Td (6706 movl $SYS_ ## name, %eax; \\) 157.267 Tj 0 -94.9336 Td (6707 int $T_SYSCALL; \\) 113.581 Tj 0 -104.427 Td (6708 ret) 52.4222 Tj 0 -113.92 Td (6709 ) 21.8426 Tj 0 -123.414 Td (6710 STUB\(fork\)) 65.5277 Tj 0 -132.907 Td (6711 STUB\(exit\)) 65.5277 Tj 0 -142.4 Td (6712 STUB\(wait\)) 65.5277 Tj 0 -151.894 Td (6713 STUB\(pipe\)) 65.5277 Tj 0 -161.387 Td (6714 STUB\(read\)) 65.5277 Tj 0 -170.88 Td (6715 STUB\(write\)) 69.8962 Tj 0 -180.374 Td (6716 STUB\(close\)) 69.8962 Tj 0 -189.867 Td (6717 STUB\(kill\)) 65.5277 Tj 0 -199.361 Td (6718 STUB\(exec\)) 65.5277 Tj 0 -208.854 Td (6719 STUB\(open\)) 65.5277 Tj 0 -218.347 Td (6720 STUB\(mknod\)) 69.8962 Tj 0 -227.841 Td (6721 STUB\(unlink\)) 74.2647 Tj 0 -237.334 Td (6722 STUB\(fstat\)) 69.8962 Tj 0 -246.827 Td (6723 STUB\(link\)) 65.5277 Tj 0 -256.321 Td (6724 STUB\(mkdir\)) 69.8962 Tj 0 -265.814 Td (6725 STUB\(chdir\)) 69.8962 Tj 0 -275.307 Td (6726 STUB\(dup\)) 61.1592 Tj 0 -284.801 Td (6727 STUB\(getpid\)) 74.2647 Tj 0 -294.294 Td (6728 STUB\(sbrk\)) 65.5277 Tj 0 -303.788 Td (6729 STUB\(sleep\)) 69.8962 Tj 0 -313.281 Td (6730 ) 21.8426 Tj 0 -322.774 Td (6731 ) 21.8426 Tj 0 -332.268 Td (6732 ) 21.8426 Tj 0 -341.761 Td (6733 ) 21.8426 Tj 0 -351.254 Td (6734 ) 21.8426 Tj 0 -360.748 Td (6735 ) 21.8426 Tj 0 -370.241 Td (6736 ) 21.8426 Tj 0 -379.734 Td (6737 ) 21.8426 Tj 0 -389.228 Td (6738 ) 21.8426 Tj 0 -398.721 Td (6739 ) 21.8426 Tj 0 -408.214 Td (6740 ) 21.8426 Tj 0 -417.708 Td (6741 ) 21.8426 Tj 0 -427.201 Td (6742 ) 21.8426 Tj 0 -436.695 Td (6743 ) 21.8426 Tj 0 -446.188 Td (6744 ) 21.8426 Tj 0 -455.681 Td (6745 ) 21.8426 Tj 0 -465.175 Td (6746 ) 21.8426 Tj 0 -474.668 Td (6747 ) 21.8426 Tj 0 -484.161 Td (6748 ) 21.8426 Tj 0 -493.655 Td (6749 ) 21.8426 Tj 0 -522.135 Td (Sheet 67) 34.9481 Tj Q Q q 180 500 5760 3460 re W /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [10 0 0 10 0 0] cm [1 0 0 1 0 0] Tm 0 0 Td [0 -0.967854 1 0 564.72 392.864] Tm 0 0 Td /F9_0 8.70222 Tf (Aug 30 10:08 2007 xv6/sh.c Page 1) 152.898 Tj 0 -28.4801 Td (6750 // Shell.) 61.1592 Tj 0 -37.9735 Td (6751 ) 21.8426 Tj 0 -47.4668 Td (6752 #include "types.h") 100.476 Tj 0 -56.9602 Td (6753 #include "user.h") 96.1073 Tj 0 -66.4535 Td (6754 #include "fcntl.h") 100.476 Tj 0 -75.9469 Td (6755 ) 21.8426 Tj 0 -85.4403 Td (6756 // Parsed command representation) 161.635 Tj 0 -94.9336 Td (6757 #define EXEC 1) 87.3703 Tj 0 -104.427 Td (6758 #define REDIR 2) 87.3703 Tj 0 -113.92 Td (6759 #define PIPE 3) 87.3703 Tj 0 -123.414 Td (6760 #define LIST 4) 87.3703 Tj 0 -132.907 Td (6761 #define BACK 5) 87.3703 Tj 0 -142.4 Td (6762 ) 21.8426 Tj 0 -151.894 Td (6763 #define MAXARGS 10) 100.476 Tj 0 -161.387 Td (6764 ) 21.8426 Tj 0 -170.88 Td (6765 struct cmd {) 74.2647 Tj 0 -180.374 Td (6766 int type;) 69.8962 Tj 0 -189.867 Td (6767 };) 30.5796 Tj 0 -199.361 Td (6768 ) 21.8426 Tj 0 -208.854 Td (6769 struct execcmd {) 91.7388 Tj 0 -218.347 Td (6770 int type;) 69.8962 Tj 0 -227.841 Td (6771 char *argv[MAXARGS];) 117.95 Tj 0 -237.334 Td (6772 char *eargv[MAXARGS];) 122.318 Tj 0 -246.827 Td (6773 };) 30.5796 Tj 0 -256.321 Td (6774 ) 21.8426 Tj 0 -265.814 Td (6775 struct redircmd {) 96.1073 Tj 0 -275.307 Td (6776 int type;) 69.8962 Tj 0 -284.801 Td (6777 struct cmd *cmd;) 100.476 Tj 0 -294.294 Td (6778 char *file;) 78.6333 Tj 0 -303.788 Td (6779 char *efile;) 83.0018 Tj 0 -313.281 Td (6780 int mode;) 69.8962 Tj 0 -322.774 Td (6781 int fd;) 61.1592 Tj 0 -332.268 Td (6782 };) 30.5796 Tj 0 -341.761 Td (6783 ) 21.8426 Tj 0 -351.254 Td (6784 struct pipecmd {) 91.7388 Tj 0 -360.748 Td (6785 int type;) 69.8962 Tj 0 -370.241 Td (6786 struct cmd *left;) 104.844 Tj 0 -379.734 Td (6787 struct cmd *right;) 109.213 Tj 0 -389.228 Td (6788 };) 30.5796 Tj 0 -398.721 Td (6789 ) 21.8426 Tj 0 -408.214 Td (6790 struct listcmd {) 91.7388 Tj 0 -417.708 Td (6791 int type;) 69.8962 Tj 0 -427.201 Td (6792 struct cmd *left;) 104.844 Tj 0 -436.695 Td (6793 struct cmd *right;) 109.213 Tj 0 -446.188 Td (6794 };) 30.5796 Tj 0 -455.681 Td (6795 ) 21.8426 Tj 0 -465.175 Td (6796 struct backcmd {) 91.7388 Tj 0 -474.668 Td (6797 int type;) 69.8962 Tj 0 -484.161 Td (6798 struct cmd *cmd;) 100.476 Tj 0 -493.655 Td (6799 };) 30.5796 Tj 0 -522.135 Td (Sheet 67) 34.9481 Tj Q Q Q Q showpage %%PageTrailer pdfEndPage %%Page: 75 75 %%BeginPageSetup %%PageOrientation: Landscape pdfStartPage 180 rotate -612 -792 translate 0 0 612 792 re W %%EndPageSetup [] 0 d 1 i 0 j 0 J 10 M 1 w /DeviceGray {} cs [0] sc /DeviceGray {} CS [0] SC false op false OP 0 0 612 792 re W q q [0.1 0 0 0.1 0 0] cm q 180 3960 5760 3460 re W /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [10 0 0 10 0 0] cm [1 0 0 1 0 0] Tm 0 0 Td [0 -0.967854 1 0 564.72 738.864] Tm 0 0 Td /F9_0 8.70222 Tf (Aug 30 10:08 2007 xv6/sh.c Page 2) 152.898 Tj 0 -28.4801 Td (6800 int fork1\(void\); // Fork but panics on failure.) 231.531 Tj 0 -37.9735 Td (6801 void panic\(char*\);) 100.476 Tj 0 -47.4668 Td (6802 struct cmd *parsecmd\(char*\);) 144.161 Tj 0 -56.9602 Td (6803 ) 21.8426 Tj 0 -66.4535 Td (6804 // Execute cmd. Never returns.) 157.267 Tj 0 -75.9469 Td (6805 void) 39.3166 Tj 0 -85.4403 Td (6806 runcmd\(struct cmd *cmd\)) 122.318 Tj 0 -94.9336 Td (6807 {) 26.2111 Tj 0 -104.427 Td (6808 int p[2];) 69.8962 Tj 0 -113.92 Td (6809 struct backcmd *bcmd;) 122.318 Tj 0 -123.414 Td (6810 struct execcmd *ecmd;) 122.318 Tj 0 -132.907 Td (6811 struct listcmd *lcmd;) 122.318 Tj 0 -142.4 Td (6812 struct pipecmd *pcmd;) 122.318 Tj 0 -151.894 Td (6813 struct redircmd *rcmd;) 126.687 Tj 0 -161.387 Td (6814 ) 21.8426 Tj 0 -170.88 Td (6815 if\(cmd == 0\)) 83.0018 Tj 0 -180.374 Td (6816 exit\(\);) 69.8962 Tj 0 -189.867 Td (6817 ) 21.8426 Tj 0 -199.361 Td (6818 switch\(cmd->type\){) 109.213 Tj 0 -208.854 Td (6819 default:) 65.5277 Tj 0 -218.347 Td (6820 panic\("runcmd"\);) 109.213 Tj 0 -227.841 Td (6821 ) 21.8426 Tj 0 -237.334 Td (6822 case EXEC:) 74.2647 Tj 0 -246.827 Td (6823 ecmd = \(struct execcmd*\)cmd;) 161.635 Tj 0 -256.321 Td (6824 if\(ecmd->argv[0] == 0\)) 135.424 Tj 0 -265.814 Td (6825 exit\(\);) 78.6333 Tj 0 -275.307 Td (6826 exec\(ecmd->argv[0], ecmd->argv\);) 179.109 Tj 0 -284.801 Td (6827 printf\(2, "exec %s failed\\n", ecmd->argv[0]\);) 235.9 Tj 0 -294.294 Td (6828 break;) 65.5277 Tj 0 -303.788 Td (6829 ) 21.8426 Tj 0 -313.281 Td (6830 case REDIR:) 78.6333 Tj 0 -322.774 Td (6831 rcmd = \(struct redircmd*\)cmd;) 166.004 Tj 0 -332.268 Td (6832 close\(rcmd->fd\);) 109.213 Tj 0 -341.761 Td (6833 if\(open\(rcmd->file, rcmd->mode\) < 0\){) 200.952 Tj 0 -351.254 Td (6834 printf\(2, "open %s failed\\n", rcmd->file\);) 231.531 Tj 0 -360.748 Td (6835 exit\(\);) 78.6333 Tj 0 -370.241 Td (6836 }) 43.6851 Tj 0 -379.734 Td (6837 runcmd\(rcmd->cmd\);) 117.95 Tj 0 -389.228 Td (6838 break;) 65.5277 Tj 0 -398.721 Td (6839 ) 21.8426 Tj 0 -408.214 Td (6840 case LIST:) 74.2647 Tj 0 -417.708 Td (6841 lcmd = \(struct listcmd*\)cmd;) 161.635 Tj 0 -427.201 Td (6842 if\(fork1\(\) == 0\)) 109.213 Tj 0 -436.695 Td (6843 runcmd\(lcmd->left\);) 131.055 Tj 0 -446.188 Td (6844 wait\(\);) 69.8962 Tj 0 -455.681 Td (6845 runcmd\(lcmd->right\);) 126.687 Tj 0 -465.175 Td (6846 break;) 65.5277 Tj 0 -474.668 Td (6847 ) 21.8426 Tj 0 -484.161 Td (6848 ) 21.8426 Tj 0 -493.655 Td (6849 ) 21.8426 Tj 0 -522.135 Td (Sheet 68) 34.9481 Tj Q Q q 180 500 5760 3460 re W /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [10 0 0 10 0 0] cm [1 0 0 1 0 0] Tm 0 0 Td [0 -0.967854 1 0 564.72 392.864] Tm 0 0 Td /F9_0 8.70222 Tf (Aug 30 10:08 2007 xv6/sh.c Page 3) 152.898 Tj 0 -28.4801 Td (6850 case PIPE:) 74.2647 Tj 0 -37.9735 Td (6851 pcmd = \(struct pipecmd*\)cmd;) 161.635 Tj 0 -47.4668 Td (6852 if\(pipe\(p\) < 0\)) 104.844 Tj 0 -56.9602 Td (6853 panic\("pipe"\);) 109.213 Tj 0 -66.4535 Td (6854 if\(fork1\(\) == 0\){) 113.581 Tj 0 -75.9469 Td (6855 close\(1\);) 87.3703 Tj 0 -85.4403 Td (6856 dup\(p[1]\);) 91.7388 Tj 0 -94.9336 Td (6857 close\(p[0]\);) 100.476 Tj 0 -104.427 Td (6858 close\(p[1]\);) 100.476 Tj 0 -113.92 Td (6859 runcmd\(pcmd->left\);) 131.055 Tj 0 -123.414 Td (6860 }) 43.6851 Tj 0 -132.907 Td (6861 if\(fork1\(\) == 0\){) 113.581 Tj 0 -142.4 Td (6862 close\(0\);) 87.3703 Tj 0 -151.894 Td (6863 dup\(p[0]\);) 91.7388 Tj 0 -161.387 Td (6864 close\(p[0]\);) 100.476 Tj 0 -170.88 Td (6865 close\(p[1]\);) 100.476 Tj 0 -180.374 Td (6866 runcmd\(pcmd->right\);) 135.424 Tj 0 -189.867 Td (6867 }) 43.6851 Tj 0 -199.361 Td (6868 close\(p[0]\);) 91.7388 Tj 0 -208.854 Td (6869 close\(p[1]\);) 91.7388 Tj 0 -218.347 Td (6870 wait\(\);) 69.8962 Tj 0 -227.841 Td (6871 wait\(\);) 69.8962 Tj 0 -237.334 Td (6872 break;) 65.5277 Tj 0 -246.827 Td (6873 ) 21.8426 Tj 0 -256.321 Td (6874 case BACK:) 74.2647 Tj 0 -265.814 Td (6875 bcmd = \(struct backcmd*\)cmd;) 161.635 Tj 0 -275.307 Td (6876 if\(fork1\(\) == 0\)) 109.213 Tj 0 -284.801 Td (6877 runcmd\(bcmd->cmd\);) 126.687 Tj 0 -294.294 Td (6878 break;) 65.5277 Tj 0 -303.788 Td (6879 }) 34.9481 Tj 0 -313.281 Td (6880 exit\(\);) 61.1592 Tj 0 -322.774 Td (6881 }) 26.2111 Tj 0 -332.268 Td (6882 ) 21.8426 Tj 0 -341.761 Td (6883 int) 34.9481 Tj 0 -351.254 Td (6884 getcmd\(char *buf, int nbuf\)) 139.792 Tj 0 -360.748 Td (6885 {) 26.2111 Tj 0 -370.241 Td (6886 printf\(2, "$ "\);) 100.476 Tj 0 -379.734 Td (6887 memset\(buf, 0, nbuf\);) 122.318 Tj 0 -389.228 Td (6888 gets\(buf, nbuf\);) 100.476 Tj 0 -398.721 Td (6889 if\(buf[0] == 0\) // EOF) 126.687 Tj 0 -408.214 Td (6890 return -1;) 83.0018 Tj 0 -417.708 Td (6891 return 0;) 69.8962 Tj 0 -427.201 Td (6892 }) 26.2111 Tj 0 -436.695 Td (6893 ) 21.8426 Tj 0 -446.188 Td (6894 ) 21.8426 Tj 0 -455.681 Td (6895 ) 21.8426 Tj 0 -465.175 Td (6896 ) 21.8426 Tj 0 -474.668 Td (6897 ) 21.8426 Tj 0 -484.161 Td (6898 ) 21.8426 Tj 0 -493.655 Td (6899 ) 21.8426 Tj 0 -522.135 Td (Sheet 68) 34.9481 Tj Q Q Q Q showpage %%PageTrailer pdfEndPage %%Page: 76 76 %%BeginPageSetup %%PageOrientation: Landscape pdfStartPage 180 rotate -612 -792 translate 0 0 612 792 re W %%EndPageSetup [] 0 d 1 i 0 j 0 J 10 M 1 w /DeviceGray {} cs [0] sc /DeviceGray {} CS [0] SC false op false OP 0 0 612 792 re W q q [0.1 0 0 0.1 0 0] cm q 180 3960 5760 3460 re W /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [10 0 0 10 0 0] cm [1 0 0 1 0 0] Tm 0 0 Td [0 -0.967854 1 0 564.72 738.864] Tm 0 0 Td /F9_0 8.70222 Tf (Aug 30 10:08 2007 xv6/sh.c Page 4) 152.898 Tj 0 -28.4801 Td (6900 int) 34.9481 Tj 0 -37.9735 Td (6901 main\(void\)) 65.5277 Tj 0 -47.4668 Td (6902 {) 26.2111 Tj 0 -56.9602 Td (6903 static char buf[100];) 122.318 Tj 0 -66.4535 Td (6904 int fd;) 61.1592 Tj 0 -75.9469 Td (6905 ) 21.8426 Tj 0 -85.4403 Td (6906 // Assumes three file descriptors open.) 200.952 Tj 0 -94.9336 Td (6907 while\(\(fd = open\("console", O_RDWR\)\) >= 0\){) 218.426 Tj 0 -104.427 Td (6908 if\(fd >= 3\){) 91.7388 Tj 0 -113.92 Td (6909 close\(fd\);) 91.7388 Tj 0 -123.414 Td (6910 break;) 74.2647 Tj 0 -132.907 Td (6911 }) 43.6851 Tj 0 -142.4 Td (6912 }) 34.9481 Tj 0 -151.894 Td (6913 ) 21.8426 Tj 0 -161.387 Td (6914 // Read and run input commands.) 166.004 Tj 0 -170.88 Td (6915 while\(getcmd\(buf, sizeof\(buf\)\) >= 0\){) 192.215 Tj 0 -180.374 Td (6916 if\(fork1\(\) == 0\)) 109.213 Tj 0 -189.867 Td (6917 runcmd\(parsecmd\(buf\)\);) 144.161 Tj 0 -199.361 Td (6918 wait\(\);) 69.8962 Tj 0 -208.854 Td (6919 }) 34.9481 Tj 0 -218.347 Td (6920 exit\(\);) 61.1592 Tj 0 -227.841 Td (6921 }) 26.2111 Tj 0 -237.334 Td (6922 ) 21.8426 Tj 0 -246.827 Td (6923 void) 39.3166 Tj 0 -256.321 Td (6924 panic\(char *s\)) 83.0018 Tj 0 -265.814 Td (6925 {) 26.2111 Tj 0 -275.307 Td (6926 printf\(2, "%s\\n", s\);) 122.318 Tj 0 -284.801 Td (6927 exit\(\);) 61.1592 Tj 0 -294.294 Td (6928 }) 26.2111 Tj 0 -303.788 Td (6929 ) 21.8426 Tj 0 -313.281 Td (6930 int) 34.9481 Tj 0 -322.774 Td (6931 fork1\(void\)) 69.8962 Tj 0 -332.268 Td (6932 {) 26.2111 Tj 0 -341.761 Td (6933 int pid;) 65.5277 Tj 0 -351.254 Td (6934 ) 21.8426 Tj 0 -360.748 Td (6935 pid = fork\(\);) 87.3703 Tj 0 -370.241 Td (6936 if\(pid == -1\)) 87.3703 Tj 0 -379.734 Td (6937 panic\("fork"\);) 100.476 Tj 0 -389.228 Td (6938 return pid;) 78.6333 Tj 0 -398.721 Td (6939 }) 26.2111 Tj 0 -408.214 Td (6940 ) 21.8426 Tj 0 -417.708 Td (6941 ) 21.8426 Tj 0 -427.201 Td (6942 ) 21.8426 Tj 0 -436.695 Td (6943 ) 21.8426 Tj 0 -446.188 Td (6944 ) 21.8426 Tj 0 -455.681 Td (6945 ) 21.8426 Tj 0 -465.175 Td (6946 ) 21.8426 Tj 0 -474.668 Td (6947 ) 21.8426 Tj 0 -484.161 Td (6948 ) 21.8426 Tj 0 -493.655 Td (6949 ) 21.8426 Tj 0 -522.135 Td (Sheet 69) 34.9481 Tj Q Q q 180 500 5760 3460 re W /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [10 0 0 10 0 0] cm [1 0 0 1 0 0] Tm 0 0 Td [0 -0.967854 1 0 564.72 392.864] Tm 0 0 Td /F9_0 8.70222 Tf (Aug 30 10:08 2007 xv6/sh.c Page 5) 152.898 Tj 0 -28.4801 Td (6950 // Constructors) 87.3703 Tj 0 -37.9735 Td (6951 ) 21.8426 Tj 0 -47.4668 Td (6952 struct cmd*) 69.8962 Tj 0 -56.9602 Td (6953 execcmd\(void\)) 78.6333 Tj 0 -66.4535 Td (6954 {) 26.2111 Tj 0 -75.9469 Td (6955 struct execcmd *cmd;) 117.95 Tj 0 -85.4403 Td (6956 ) 21.8426 Tj 0 -94.9336 Td (6957 cmd = malloc\(sizeof\(*cmd\)\);) 148.529 Tj 0 -104.427 Td (6958 memset\(cmd, 0, sizeof\(*cmd\)\);) 157.267 Tj 0 -113.92 Td (6959 cmd->type = EXEC;) 104.844 Tj 0 -123.414 Td (6960 return \(struct cmd*\)cmd;) 135.424 Tj 0 -132.907 Td (6961 }) 26.2111 Tj 0 -142.4 Td (6962 ) 21.8426 Tj 0 -151.894 Td (6963 struct cmd*) 69.8962 Tj 0 -161.387 Td (6964 redircmd\(struct cmd *subcmd, char *file, char *efile, int\ mode, int fd\)) 332.007 Tj 0 -170.88 Td (6965 {) 26.2111 Tj 0 -180.374 Td (6966 struct redircmd *cmd;) 122.318 Tj 0 -189.867 Td (6967 ) 21.8426 Tj 0 -199.361 Td (6968 cmd = malloc\(sizeof\(*cmd\)\);) 148.529 Tj 0 -208.854 Td (6969 memset\(cmd, 0, sizeof\(*cmd\)\);) 157.267 Tj 0 -218.347 Td (6970 cmd->type = REDIR;) 109.213 Tj 0 -227.841 Td (6971 cmd->cmd = subcmd;) 109.213 Tj 0 -237.334 Td (6972 cmd->file = file;) 104.844 Tj 0 -246.827 Td (6973 cmd->efile = efile;) 113.581 Tj 0 -256.321 Td (6974 cmd->mode = mode;) 104.844 Tj 0 -265.814 Td (6975 cmd->fd = fd;) 87.3703 Tj 0 -275.307 Td (6976 return \(struct cmd*\)cmd;) 135.424 Tj 0 -284.801 Td (6977 }) 26.2111 Tj 0 -294.294 Td (6978 ) 21.8426 Tj 0 -303.788 Td (6979 struct cmd*) 69.8962 Tj 0 -313.281 Td (6980 pipecmd\(struct cmd *left, struct cmd *right\)) 214.057 Tj 0 -322.774 Td (6981 {) 26.2111 Tj 0 -332.268 Td (6982 struct pipecmd *cmd;) 117.95 Tj 0 -341.761 Td (6983 ) 21.8426 Tj 0 -351.254 Td (6984 cmd = malloc\(sizeof\(*cmd\)\);) 148.529 Tj 0 -360.748 Td (6985 memset\(cmd, 0, sizeof\(*cmd\)\);) 157.267 Tj 0 -370.241 Td (6986 cmd->type = PIPE;) 104.844 Tj 0 -379.734 Td (6987 cmd->left = left;) 104.844 Tj 0 -389.228 Td (6988 cmd->right = right;) 113.581 Tj 0 -398.721 Td (6989 return \(struct cmd*\)cmd;) 135.424 Tj 0 -408.214 Td (6990 }) 26.2111 Tj 0 -417.708 Td (6991 ) 21.8426 Tj 0 -427.201 Td (6992 ) 21.8426 Tj 0 -436.695 Td (6993 ) 21.8426 Tj 0 -446.188 Td (6994 ) 21.8426 Tj 0 -455.681 Td (6995 ) 21.8426 Tj 0 -465.175 Td (6996 ) 21.8426 Tj 0 -474.668 Td (6997 ) 21.8426 Tj 0 -484.161 Td (6998 ) 21.8426 Tj 0 -493.655 Td (6999 ) 21.8426 Tj 0 -522.135 Td (Sheet 69) 34.9481 Tj Q Q Q Q showpage %%PageTrailer pdfEndPage %%Page: 77 77 %%BeginPageSetup %%PageOrientation: Landscape pdfStartPage 180 rotate -612 -792 translate 0 0 612 792 re W %%EndPageSetup [] 0 d 1 i 0 j 0 J 10 M 1 w /DeviceGray {} cs [0] sc /DeviceGray {} CS [0] SC false op false OP 0 0 612 792 re W q q [0.1 0 0 0.1 0 0] cm q 180 3960 5760 3460 re W /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [10 0 0 10 0 0] cm [1 0 0 1 0 0] Tm 0 0 Td [0 -0.967854 1 0 564.72 738.864] Tm 0 0 Td /F9_0 8.70222 Tf (Aug 30 10:08 2007 xv6/sh.c Page 6) 152.898 Tj 0 -28.4801 Td (7000 struct cmd*) 69.8962 Tj 0 -37.9735 Td (7001 listcmd\(struct cmd *left, struct cmd *right\)) 214.057 Tj 0 -47.4668 Td (7002 {) 26.2111 Tj 0 -56.9602 Td (7003 struct listcmd *cmd;) 117.95 Tj 0 -66.4535 Td (7004 ) 21.8426 Tj 0 -75.9469 Td (7005 cmd = malloc\(sizeof\(*cmd\)\);) 148.529 Tj 0 -85.4403 Td (7006 memset\(cmd, 0, sizeof\(*cmd\)\);) 157.267 Tj 0 -94.9336 Td (7007 cmd->type = LIST;) 104.844 Tj 0 -104.427 Td (7008 cmd->left = left;) 104.844 Tj 0 -113.92 Td (7009 cmd->right = right;) 113.581 Tj 0 -123.414 Td (7010 return \(struct cmd*\)cmd;) 135.424 Tj 0 -132.907 Td (7011 }) 26.2111 Tj 0 -142.4 Td (7012 ) 21.8426 Tj 0 -151.894 Td (7013 struct cmd*) 69.8962 Tj 0 -161.387 Td (7014 backcmd\(struct cmd *subcmd\)) 139.792 Tj 0 -170.88 Td (7015 {) 26.2111 Tj 0 -180.374 Td (7016 struct backcmd *cmd;) 117.95 Tj 0 -189.867 Td (7017 ) 21.8426 Tj 0 -199.361 Td (7018 cmd = malloc\(sizeof\(*cmd\)\);) 148.529 Tj 0 -208.854 Td (7019 memset\(cmd, 0, sizeof\(*cmd\)\);) 157.267 Tj 0 -218.347 Td (7020 cmd->type = BACK;) 104.844 Tj 0 -227.841 Td (7021 cmd->cmd = subcmd;) 109.213 Tj 0 -237.334 Td (7022 return \(struct cmd*\)cmd;) 135.424 Tj 0 -246.827 Td (7023 }) 26.2111 Tj 0 -256.321 Td (7024 ) 21.8426 Tj 0 -265.814 Td (7025 ) 21.8426 Tj 0 -275.307 Td (7026 ) 21.8426 Tj 0 -284.801 Td (7027 ) 21.8426 Tj 0 -294.294 Td (7028 ) 21.8426 Tj 0 -303.788 Td (7029 ) 21.8426 Tj 0 -313.281 Td (7030 ) 21.8426 Tj 0 -322.774 Td (7031 ) 21.8426 Tj 0 -332.268 Td (7032 ) 21.8426 Tj 0 -341.761 Td (7033 ) 21.8426 Tj 0 -351.254 Td (7034 ) 21.8426 Tj 0 -360.748 Td (7035 ) 21.8426 Tj 0 -370.241 Td (7036 ) 21.8426 Tj 0 -379.734 Td (7037 ) 21.8426 Tj 0 -389.228 Td (7038 ) 21.8426 Tj 0 -398.721 Td (7039 ) 21.8426 Tj 0 -408.214 Td (7040 ) 21.8426 Tj 0 -417.708 Td (7041 ) 21.8426 Tj 0 -427.201 Td (7042 ) 21.8426 Tj 0 -436.695 Td (7043 ) 21.8426 Tj 0 -446.188 Td (7044 ) 21.8426 Tj 0 -455.681 Td (7045 ) 21.8426 Tj 0 -465.175 Td (7046 ) 21.8426 Tj 0 -474.668 Td (7047 ) 21.8426 Tj 0 -484.161 Td (7048 ) 21.8426 Tj 0 -493.655 Td (7049 ) 21.8426 Tj 0 -522.135 Td (Sheet 70) 34.9481 Tj Q Q q 180 500 5760 3460 re W /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [10 0 0 10 0 0] cm [1 0 0 1 0 0] Tm 0 0 Td [0 -0.967854 1 0 564.72 392.864] Tm 0 0 Td /F9_0 8.70222 Tf (Aug 30 10:08 2007 xv6/sh.c Page 7) 152.898 Tj 0 -28.4801 Td (7050 // Parsing) 65.5277 Tj 0 -37.9735 Td (7051 ) 21.8426 Tj 0 -47.4668 Td (7052 char whitespace[] = " \\t\\r\\n\\v";) 161.635 Tj 0 -56.9602 Td (7053 char symbols[] = "<|>&;\(\)";) 139.792 Tj 0 -66.4535 Td (7054 ) 21.8426 Tj 0 -75.9469 Td (7055 int) 34.9481 Tj 0 -85.4403 Td (7056 gettoken\(char **ps, char *es, char **q, char **eq\)) 240.268 Tj 0 -94.9336 Td (7057 {) 26.2111 Tj 0 -104.427 Td (7058 char *s;) 65.5277 Tj 0 -113.92 Td (7059 int ret;) 65.5277 Tj 0 -123.414 Td (7060 ) 21.8426 Tj 0 -132.907 Td (7061 s = *ps;) 65.5277 Tj 0 -142.4 Td (7062 while\(s < es && strchr\(whitespace, *s\)\)) 200.952 Tj 0 -151.894 Td (7063 s++;) 56.7907 Tj 0 -161.387 Td (7064 if\(q\)) 52.4222 Tj 0 -170.88 Td (7065 *q = s;) 69.8962 Tj 0 -180.374 Td (7066 ret = *s;) 69.8962 Tj 0 -189.867 Td (7067 switch\(*s\){) 78.6333 Tj 0 -199.361 Td (7068 case 0:) 61.1592 Tj 0 -208.854 Td (7069 break;) 65.5277 Tj 0 -218.347 Td (7070 case '|':) 69.8962 Tj 0 -227.841 Td (7071 case '\(':) 69.8962 Tj 0 -237.334 Td (7072 case '\)':) 69.8962 Tj 0 -246.827 Td (7073 case ';':) 69.8962 Tj 0 -256.321 Td (7074 case '&':) 69.8962 Tj 0 -265.814 Td (7075 case '<':) 69.8962 Tj 0 -275.307 Td (7076 s++;) 56.7907 Tj 0 -284.801 Td (7077 break;) 65.5277 Tj 0 -294.294 Td (7078 case '>':) 69.8962 Tj 0 -303.788 Td (7079 s++;) 56.7907 Tj 0 -313.281 Td (7080 if\(*s == '>'\){) 100.476 Tj 0 -322.774 Td (7081 ret = '+';) 91.7388 Tj 0 -332.268 Td (7082 s++;) 65.5277 Tj 0 -341.761 Td (7083 }) 43.6851 Tj 0 -351.254 Td (7084 break;) 65.5277 Tj 0 -360.748 Td (7085 default:) 65.5277 Tj 0 -370.241 Td (7086 ret = 'a';) 83.0018 Tj 0 -379.734 Td (7087 while\(s < es && !strchr\(whitespace, *s\) && !strchr\(\ symbols, *s\)\)) 318.902 Tj 0 -389.228 Td (7088 s++;) 65.5277 Tj 0 -398.721 Td (7089 break;) 65.5277 Tj 0 -408.214 Td (7090 }) 34.9481 Tj 0 -417.708 Td (7091 if\(eq\)) 56.7907 Tj 0 -427.201 Td (7092 *eq = s;) 74.2647 Tj 0 -436.695 Td (7093 ) 21.8426 Tj 0 -446.188 Td (7094 while\(s < es && strchr\(whitespace, *s\)\)) 200.952 Tj 0 -455.681 Td (7095 s++;) 56.7907 Tj 0 -465.175 Td (7096 *ps = s;) 65.5277 Tj 0 -474.668 Td (7097 return ret;) 78.6333 Tj 0 -484.161 Td (7098 }) 26.2111 Tj 0 -493.655 Td (7099 ) 21.8426 Tj 0 -522.135 Td (Sheet 70) 34.9481 Tj Q Q Q Q showpage %%PageTrailer pdfEndPage %%Page: 78 78 %%BeginPageSetup %%PageOrientation: Landscape pdfStartPage 180 rotate -612 -792 translate 0 0 612 792 re W %%EndPageSetup [] 0 d 1 i 0 j 0 J 10 M 1 w /DeviceGray {} cs [0] sc /DeviceGray {} CS [0] SC false op false OP 0 0 612 792 re W q q [0.1 0 0 0.1 0 0] cm q 180 3960 5760 3460 re W /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [10 0 0 10 0 0] cm [1 0 0 1 0 0] Tm 0 0 Td [0 -0.967854 1 0 564.72 738.864] Tm 0 0 Td /F9_0 8.70222 Tf (Aug 30 10:08 2007 xv6/sh.c Page 8) 152.898 Tj 0 -28.4801 Td (7100 int) 34.9481 Tj 0 -37.9735 Td (7101 peek\(char **ps, char *es, char *toks\)) 183.478 Tj 0 -47.4668 Td (7102 {) 26.2111 Tj 0 -56.9602 Td (7103 char *s;) 65.5277 Tj 0 -66.4535 Td (7104 ) 21.8426 Tj 0 -75.9469 Td (7105 s = *ps;) 65.5277 Tj 0 -85.4403 Td (7106 while\(s < es && strchr\(whitespace, *s\)\)) 200.952 Tj 0 -94.9336 Td (7107 s++;) 56.7907 Tj 0 -104.427 Td (7108 *ps = s;) 65.5277 Tj 0 -113.92 Td (7109 return *s && strchr\(toks, *s\);) 161.635 Tj 0 -123.414 Td (7110 }) 26.2111 Tj 0 -132.907 Td (7111 ) 21.8426 Tj 0 -142.4 Td (7112 struct cmd *parseline\(char**, char*\);) 183.478 Tj 0 -151.894 Td (7113 struct cmd *parsepipe\(char**, char*\);) 183.478 Tj 0 -161.387 Td (7114 struct cmd *parseexec\(char**, char*\);) 183.478 Tj 0 -170.88 Td (7115 struct cmd *nulterminate\(struct cmd*\);) 187.846 Tj 0 -180.374 Td (7116 ) 21.8426 Tj 0 -189.867 Td (7117 struct cmd*) 69.8962 Tj 0 -199.361 Td (7118 parsecmd\(char *s\)) 96.1073 Tj 0 -208.854 Td (7119 {) 26.2111 Tj 0 -218.347 Td (7120 char *es;) 69.8962 Tj 0 -227.841 Td (7121 struct cmd *cmd;) 100.476 Tj 0 -237.334 Td (7122 ) 21.8426 Tj 0 -246.827 Td (7123 es = s + strlen\(s\);) 113.581 Tj 0 -256.321 Td (7124 cmd = parseline\(&s, es\);) 135.424 Tj 0 -265.814 Td (7125 peek\(&s, es, ""\);) 104.844 Tj 0 -275.307 Td (7126 if\(s != es\){) 83.0018 Tj 0 -284.801 Td (7127 printf\(2, "leftovers: %s\\n", s\);) 179.109 Tj 0 -294.294 Td (7128 panic\("syntax"\);) 109.213 Tj 0 -303.788 Td (7129 }) 34.9481 Tj 0 -313.281 Td (7130 nulterminate\(cmd\);) 109.213 Tj 0 -322.774 Td (7131 return cmd;) 78.6333 Tj 0 -332.268 Td (7132 }) 26.2111 Tj 0 -341.761 Td (7133 ) 21.8426 Tj 0 -351.254 Td (7134 struct cmd*) 69.8962 Tj 0 -360.748 Td (7135 parseline\(char **ps, char *es\)) 152.898 Tj 0 -370.241 Td (7136 {) 26.2111 Tj 0 -379.734 Td (7137 struct cmd *cmd;) 100.476 Tj 0 -389.228 Td (7138 ) 21.8426 Tj 0 -398.721 Td (7139 cmd = parsepipe\(ps, es\);) 135.424 Tj 0 -408.214 Td (7140 while\(peek\(ps, es, "&"\)\){) 139.792 Tj 0 -417.708 Td (7141 gettoken\(ps, es, 0, 0\);) 139.792 Tj 0 -427.201 Td (7142 cmd = backcmd\(cmd\);) 122.318 Tj 0 -436.695 Td (7143 }) 34.9481 Tj 0 -446.188 Td (7144 if\(peek\(ps, es, ";"\)\){) 126.687 Tj 0 -455.681 Td (7145 gettoken\(ps, es, 0, 0\);) 139.792 Tj 0 -465.175 Td (7146 cmd = listcmd\(cmd, parseline\(ps, es\)\);) 205.32 Tj 0 -474.668 Td (7147 }) 34.9481 Tj 0 -484.161 Td (7148 return cmd;) 78.6333 Tj 0 -493.655 Td (7149 }) 26.2111 Tj 0 -522.135 Td (Sheet 71) 34.9481 Tj Q Q q 180 500 5760 3460 re W /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [10 0 0 10 0 0] cm [1 0 0 1 0 0] Tm 0 0 Td [0 -0.967854 1 0 564.72 392.864] Tm 0 0 Td /F9_0 8.70222 Tf (Aug 30 10:08 2007 xv6/sh.c Page 9) 152.898 Tj 0 -28.4801 Td (7150 struct cmd*) 69.8962 Tj 0 -37.9735 Td (7151 parsepipe\(char **ps, char *es\)) 152.898 Tj 0 -47.4668 Td (7152 {) 26.2111 Tj 0 -56.9602 Td (7153 struct cmd *cmd;) 100.476 Tj 0 -66.4535 Td (7154 ) 21.8426 Tj 0 -75.9469 Td (7155 cmd = parseexec\(ps, es\);) 135.424 Tj 0 -85.4403 Td (7156 if\(peek\(ps, es, "|"\)\){) 126.687 Tj 0 -94.9336 Td (7157 gettoken\(ps, es, 0, 0\);) 139.792 Tj 0 -104.427 Td (7158 cmd = pipecmd\(cmd, parsepipe\(ps, es\)\);) 205.32 Tj 0 -113.92 Td (7159 }) 34.9481 Tj 0 -123.414 Td (7160 return cmd;) 78.6333 Tj 0 -132.907 Td (7161 }) 26.2111 Tj 0 -142.4 Td (7162 ) 21.8426 Tj 0 -151.894 Td (7163 struct cmd*) 69.8962 Tj 0 -161.387 Td (7164 parseredirs\(struct cmd *cmd, char **ps, char *es\)) 235.9 Tj 0 -170.88 Td (7165 {) 26.2111 Tj 0 -180.374 Td (7166 int tok;) 65.5277 Tj 0 -189.867 Td (7167 char *q, *eq;) 87.3703 Tj 0 -199.361 Td (7168 ) 21.8426 Tj 0 -208.854 Td (7169 while\(peek\(ps, es, "<>"\)\){) 144.161 Tj 0 -218.347 Td (7170 tok = gettoken\(ps, es, 0, 0\);) 166.004 Tj 0 -227.841 Td (7171 if\(gettoken\(ps, es, &q, &eq\) != 'a'\)) 196.583 Tj 0 -237.334 Td (7172 panic\("missing file for redirection"\);) 214.057 Tj 0 -246.827 Td (7173 switch\(tok\){) 91.7388 Tj 0 -256.321 Td (7174 case '<':) 78.6333 Tj 0 -265.814 Td (7175 cmd = redircmd\(cmd, q, eq, O_RDONLY, 0\);) 222.794 Tj 0 -275.307 Td (7176 break;) 74.2647 Tj 0 -284.801 Td (7177 case '>':) 78.6333 Tj 0 -294.294 Td (7178 cmd = redircmd\(cmd, q, eq, O_WRONLY|O_CREATE, 1\);) 262.111 Tj 0 -303.788 Td (7179 break;) 74.2647 Tj 0 -313.281 Td (7180 case '+': // >>) 109.213 Tj 0 -322.774 Td (7181 cmd = redircmd\(cmd, q, eq, O_WRONLY|O_CREATE, 1\);) 262.111 Tj 0 -332.268 Td (7182 break;) 74.2647 Tj 0 -341.761 Td (7183 }) 43.6851 Tj 0 -351.254 Td (7184 }) 34.9481 Tj 0 -360.748 Td (7185 return cmd;) 78.6333 Tj 0 -370.241 Td (7186 }) 26.2111 Tj 0 -379.734 Td (7187 ) 21.8426 Tj 0 -389.228 Td (7188 ) 21.8426 Tj 0 -398.721 Td (7189 ) 21.8426 Tj 0 -408.214 Td (7190 ) 21.8426 Tj 0 -417.708 Td (7191 ) 21.8426 Tj 0 -427.201 Td (7192 ) 21.8426 Tj 0 -436.695 Td (7193 ) 21.8426 Tj 0 -446.188 Td (7194 ) 21.8426 Tj 0 -455.681 Td (7195 ) 21.8426 Tj 0 -465.175 Td (7196 ) 21.8426 Tj 0 -474.668 Td (7197 ) 21.8426 Tj 0 -484.161 Td (7198 ) 21.8426 Tj 0 -493.655 Td (7199 ) 21.8426 Tj 0 -522.135 Td (Sheet 71) 34.9481 Tj Q Q Q Q showpage %%PageTrailer pdfEndPage %%Page: 79 79 %%BeginPageSetup %%PageOrientation: Landscape pdfStartPage 180 rotate -612 -792 translate 0 0 612 792 re W %%EndPageSetup [] 0 d 1 i 0 j 0 J 10 M 1 w /DeviceGray {} cs [0] sc /DeviceGray {} CS [0] SC false op false OP 0 0 612 792 re W q q [0.1 0 0 0.1 0 0] cm q 180 3960 5760 3460 re W /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [10 0 0 10 0 0] cm [1 0 0 1 0 0] Tm 0 0 Td [0 -0.967854 1 0 564.72 738.864] Tm 0 0 Td /F9_0 8.70222 Tf (Aug 30 10:08 2007 xv6/sh.c Page 10) 157.267 Tj 0 -28.4801 Td (7200 struct cmd*) 69.8962 Tj 0 -37.9735 Td (7201 parseblock\(char **ps, char *es\)) 157.267 Tj 0 -47.4668 Td (7202 {) 26.2111 Tj 0 -56.9602 Td (7203 struct cmd *cmd;) 100.476 Tj 0 -66.4535 Td (7204 ) 21.8426 Tj 0 -75.9469 Td (7205 if\(!peek\(ps, es, "\("\)\)) 126.687 Tj 0 -85.4403 Td (7206 panic\("parseblock"\);) 126.687 Tj 0 -94.9336 Td (7207 gettoken\(ps, es, 0, 0\);) 131.055 Tj 0 -104.427 Td (7208 cmd = parseline\(ps, es\);) 135.424 Tj 0 -113.92 Td (7209 if\(!peek\(ps, es, "\)"\)\)) 126.687 Tj 0 -123.414 Td (7210 panic\("syntax - missing \)"\);) 161.635 Tj 0 -132.907 Td (7211 gettoken\(ps, es, 0, 0\);) 131.055 Tj 0 -142.4 Td (7212 cmd = parseredirs\(cmd, ps, es\);) 166.004 Tj 0 -151.894 Td (7213 return cmd;) 78.6333 Tj 0 -161.387 Td (7214 }) 26.2111 Tj 0 -170.88 Td (7215 ) 21.8426 Tj 0 -180.374 Td (7216 struct cmd*) 69.8962 Tj 0 -189.867 Td (7217 parseexec\(char **ps, char *es\)) 152.898 Tj 0 -199.361 Td (7218 {) 26.2111 Tj 0 -208.854 Td (7219 char *q, *eq;) 87.3703 Tj 0 -218.347 Td (7220 int tok, argc;) 91.7388 Tj 0 -227.841 Td (7221 struct execcmd *cmd;) 117.95 Tj 0 -237.334 Td (7222 struct cmd *ret;) 100.476 Tj 0 -246.827 Td (7223 ) 21.8426 Tj 0 -256.321 Td (7224 if\(peek\(ps, es, "\("\)\)) 122.318 Tj 0 -265.814 Td (7225 return parseblock\(ps, es\);) 152.898 Tj 0 -275.307 Td (7226 ) 21.8426 Tj 0 -284.801 Td (7227 ret = execcmd\(\);) 100.476 Tj 0 -294.294 Td (7228 cmd = \(struct execcmd*\)ret;) 148.529 Tj 0 -303.788 Td (7229 ) 21.8426 Tj 0 -313.281 Td (7230 argc = 0;) 69.8962 Tj 0 -322.774 Td (7231 ret = parseredirs\(ret, ps, es\);) 166.004 Tj 0 -332.268 Td (7232 while\(!peek\(ps, es, "|\)&;"\)\){) 157.267 Tj 0 -341.761 Td (7233 if\(\(tok=gettoken\(ps, es, &q, &eq\)\) == 0\)) 214.057 Tj 0 -351.254 Td (7234 break;) 74.2647 Tj 0 -360.748 Td (7235 if\(tok != 'a'\)) 100.476 Tj 0 -370.241 Td (7236 panic\("syntax"\);) 117.95 Tj 0 -379.734 Td (7237 cmd->argv[argc] = q;) 126.687 Tj 0 -389.228 Td (7238 cmd->eargv[argc] = eq;) 135.424 Tj 0 -398.721 Td (7239 argc++;) 69.8962 Tj 0 -408.214 Td (7240 if\(argc >= MAXARGS\)) 122.318 Tj 0 -417.708 Td (7241 panic\("too many args"\);) 148.529 Tj 0 -427.201 Td (7242 ret = parseredirs\(ret, ps, es\);) 174.741 Tj 0 -436.695 Td (7243 }) 34.9481 Tj 0 -446.188 Td (7244 cmd->argv[argc] = 0;) 117.95 Tj 0 -455.681 Td (7245 cmd->eargv[argc] = 0;) 122.318 Tj 0 -465.175 Td (7246 return ret;) 78.6333 Tj 0 -474.668 Td (7247 }) 26.2111 Tj 0 -484.161 Td (7248 ) 21.8426 Tj 0 -493.655 Td (7249 ) 21.8426 Tj 0 -522.135 Td (Sheet 72) 34.9481 Tj Q Q q 180 500 5760 3460 re W /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [10 0 0 10 0 0] cm [1 0 0 1 0 0] Tm 0 0 Td [0 -0.967854 1 0 564.72 392.864] Tm 0 0 Td /F9_0 8.70222 Tf (Aug 30 10:08 2007 xv6/sh.c Page 11) 157.267 Tj 0 -28.4801 Td (7250 // NUL-terminate all the counted strings.) 200.952 Tj 0 -37.9735 Td (7251 struct cmd*) 69.8962 Tj 0 -47.4668 Td (7252 nulterminate\(struct cmd *cmd\)) 148.529 Tj 0 -56.9602 Td (7253 {) 26.2111 Tj 0 -66.4535 Td (7254 int i;) 56.7907 Tj 0 -75.9469 Td (7255 struct backcmd *bcmd;) 122.318 Tj 0 -85.4403 Td (7256 struct execcmd *ecmd;) 122.318 Tj 0 -94.9336 Td (7257 struct listcmd *lcmd;) 122.318 Tj 0 -104.427 Td (7258 struct pipecmd *pcmd;) 122.318 Tj 0 -113.92 Td (7259 struct redircmd *rcmd;) 126.687 Tj 0 -123.414 Td (7260 ) 21.8426 Tj 0 -132.907 Td (7261 if\(cmd == 0\)) 83.0018 Tj 0 -142.4 Td (7262 return 0;) 78.6333 Tj 0 -151.894 Td (7263 ) 21.8426 Tj 0 -161.387 Td (7264 switch\(cmd->type\){) 109.213 Tj 0 -170.88 Td (7265 case EXEC:) 74.2647 Tj 0 -180.374 Td (7266 ecmd = \(struct execcmd*\)cmd;) 161.635 Tj 0 -189.867 Td (7267 for\(i=0; ecmd->argv[i]; i++\)) 161.635 Tj 0 -199.361 Td (7268 *ecmd->eargv[i] = 0;) 135.424 Tj 0 -208.854 Td (7269 break;) 65.5277 Tj 0 -218.347 Td (7270 ) 21.8426 Tj 0 -227.841 Td (7271 case REDIR:) 78.6333 Tj 0 -237.334 Td (7272 rcmd = \(struct redircmd*\)cmd;) 166.004 Tj 0 -246.827 Td (7273 nulterminate\(rcmd->cmd\);) 144.161 Tj 0 -256.321 Td (7274 *rcmd->efile = 0;) 113.581 Tj 0 -265.814 Td (7275 break;) 65.5277 Tj 0 -275.307 Td (7276 ) 21.8426 Tj 0 -284.801 Td (7277 case PIPE:) 74.2647 Tj 0 -294.294 Td (7278 pcmd = \(struct pipecmd*\)cmd;) 161.635 Tj 0 -303.788 Td (7279 nulterminate\(pcmd->left\);) 148.529 Tj 0 -313.281 Td (7280 nulterminate\(pcmd->right\);) 152.898 Tj 0 -322.774 Td (7281 break;) 65.5277 Tj 0 -332.268 Td (7282 ) 21.8426 Tj 0 -341.761 Td (7283 case LIST:) 74.2647 Tj 0 -351.254 Td (7284 lcmd = \(struct listcmd*\)cmd;) 161.635 Tj 0 -360.748 Td (7285 nulterminate\(lcmd->left\);) 148.529 Tj 0 -370.241 Td (7286 nulterminate\(lcmd->right\);) 152.898 Tj 0 -379.734 Td (7287 break;) 65.5277 Tj 0 -389.228 Td (7288 ) 21.8426 Tj 0 -398.721 Td (7289 case BACK:) 74.2647 Tj 0 -408.214 Td (7290 bcmd = \(struct backcmd*\)cmd;) 161.635 Tj 0 -417.708 Td (7291 nulterminate\(bcmd->cmd\);) 144.161 Tj 0 -427.201 Td (7292 break;) 65.5277 Tj 0 -436.695 Td (7293 }) 34.9481 Tj 0 -446.188 Td (7294 return cmd;) 78.6333 Tj 0 -455.681 Td (7295 }) 26.2111 Tj 0 -465.175 Td (7296 ) 21.8426 Tj 0 -474.668 Td (7297 ) 21.8426 Tj 0 -484.161 Td (7298 ) 21.8426 Tj 0 -493.655 Td (7299 ) 21.8426 Tj 0 -522.135 Td (Sheet 72) 34.9481 Tj Q Q Q Q showpage %%PageTrailer pdfEndPage %%Trailer end %%DocumentSuppliedResources: %%+ font LucidaSans-Typewriter83 %%EOF